… | |
… | |
73 | * accessing the list directly. |
73 | * accessing the list directly. |
74 | * Exception is if you want to walk this list for some reason. |
74 | * Exception is if you want to walk this list for some reason. |
75 | */ |
75 | */ |
76 | struct key_value : slice_allocated |
76 | struct key_value : slice_allocated |
77 | { |
77 | { |
78 | key_value *next; |
78 | key_value *next; // must be first element |
79 | shstr key, value; |
79 | shstr key, value; |
|
|
80 | }; |
|
|
81 | |
|
|
82 | // "crossfires version of a perl hash." |
|
|
83 | struct key_values |
|
|
84 | { |
|
|
85 | key_value *first; // must be first element |
|
|
86 | |
|
|
87 | bool empty() const |
|
|
88 | { |
|
|
89 | return !first; |
|
|
90 | } |
|
|
91 | |
|
|
92 | void clear (); |
|
|
93 | shstr_tmp get (shstr_tmp key) const; |
|
|
94 | void del (shstr_tmp key); |
|
|
95 | void set (shstr_tmp key, shstr_tmp value); |
|
|
96 | |
|
|
97 | void add (shstr_tmp key, shstr_tmp value); // liek set, but doesn't check for duplicates |
|
|
98 | void reverse (); // reverses the ordering, to be used after loading an object |
|
|
99 | key_values &operator =(const key_values &kv); |
|
|
100 | |
|
|
101 | // custom extra fields management |
|
|
102 | struct access_proxy |
|
|
103 | { |
|
|
104 | key_values &kv; |
|
|
105 | shstr_tmp key; |
|
|
106 | |
|
|
107 | access_proxy (key_values &kv, shstr_tmp key) |
|
|
108 | : kv (kv), key (key) |
|
|
109 | { |
|
|
110 | } |
|
|
111 | |
|
|
112 | const access_proxy &operator =(shstr_tmp value) const |
|
|
113 | { |
|
|
114 | kv.set (key, value); |
|
|
115 | return *this; |
|
|
116 | } |
|
|
117 | |
|
|
118 | operator const shstr_tmp () const { return kv.get (key); } |
|
|
119 | operator const char *() const { return kv.get (key); } |
|
|
120 | |
|
|
121 | private: |
|
|
122 | void operator =(int); |
|
|
123 | }; |
|
|
124 | |
|
|
125 | const access_proxy operator [](shstr_tmp key) |
|
|
126 | { |
|
|
127 | return access_proxy (*this, key); |
|
|
128 | } |
80 | }; |
129 | }; |
81 | |
130 | |
82 | //-GPL |
131 | //-GPL |
83 | |
132 | |
84 | struct UUID |
133 | struct UUID |
… | |
… | |
322 | object *ACC (RW, env); /* Pointer to the object which is the environment. |
371 | object *ACC (RW, env); /* Pointer to the object which is the environment. |
323 | * This is typically the container that the object is in. |
372 | * This is typically the container that the object is in. |
324 | */ |
373 | */ |
325 | object *ACC (RW, more); /* Pointer to the rest of a large body of objects */ |
374 | object *ACC (RW, more); /* Pointer to the rest of a large body of objects */ |
326 | object *head; /* Points to the main object of a large body */ // NO ACC, perl semantics are different |
375 | object *head; /* Points to the main object of a large body */ // NO ACC, perl semantics are different |
327 | key_value *key_values; /* Fields not explictly known by the loader. */ |
|
|
328 | |
376 | |
329 | MTH void set_flag (int flagnum) |
377 | MTH void set_flag (int flagnum) |
330 | { |
378 | { |
331 | flag [flagnum] = true; |
379 | flag [flagnum] = true; |
332 | } |
380 | } |
… | |
… | |
334 | MTH void clr_flag (int flagnum) |
382 | MTH void clr_flag (int flagnum) |
335 | { |
383 | { |
336 | flag [flagnum] = false; |
384 | flag [flagnum] = false; |
337 | } |
385 | } |
338 | |
386 | |
339 | // privates / perl |
387 | // extra key value pairs |
340 | shstr_tmp kv_get (shstr_tmp key) const; |
388 | key_values kv; |
341 | void kv_del (shstr_tmp key); |
|
|
342 | void kv_set (shstr_tmp key, shstr_tmp value); |
|
|
343 | |
389 | |
344 | //-GPL |
390 | //-GPL |
345 | |
|
|
346 | // custom extra fields management |
|
|
347 | struct key_value_access_proxy |
|
|
348 | { |
|
|
349 | object &ob; |
|
|
350 | shstr_tmp key; |
|
|
351 | |
|
|
352 | key_value_access_proxy (object &ob, shstr_tmp key) |
|
|
353 | : ob (ob), key (key) |
|
|
354 | { |
|
|
355 | } |
|
|
356 | |
|
|
357 | const key_value_access_proxy &operator =(shstr_tmp value) const |
|
|
358 | { |
|
|
359 | ob.kv_set (key, value); |
|
|
360 | return *this; |
|
|
361 | } |
|
|
362 | |
|
|
363 | operator const shstr_tmp () const { return ob.kv_get (key); } |
|
|
364 | operator const char *() const { return ob.kv_get (key); } |
|
|
365 | |
|
|
366 | private: |
|
|
367 | void operator =(int); |
|
|
368 | }; |
|
|
369 | |
|
|
370 | // operator [] is too annoying to use |
|
|
371 | const key_value_access_proxy kv (shstr_tmp key) |
|
|
372 | { |
|
|
373 | return key_value_access_proxy (*this, key); |
|
|
374 | } |
|
|
375 | |
391 | |
376 | bool parse_kv (object_thawer &f); // parse kv pairs, (ab-)used by archetypes, which should not exist at all |
392 | bool parse_kv (object_thawer &f); // parse kv pairs, (ab-)used by archetypes, which should not exist at all |
377 | MTH void post_load_check (); // do some adjustments after parsing |
393 | MTH void post_load_check (); // do some adjustments after parsing |
378 | static object *read (object_thawer &f, maptile *map = 0); // map argument due to toal design bogosity, must go. |
394 | static object *read (object_thawer &f, maptile *map = 0); // map argument due to toal design bogosity, must go. |
379 | bool write (object_freezer &f); |
395 | bool write (object_freezer &f); |