ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/object.C
Revision: 1.270
Committed: Sat Dec 27 02:31:19 2008 UTC (15 years, 4 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.269: +14 -12 lines
Log Message:
implement smell member for mapspaces, remove all traces of the old RANDOM macro

File Contents

# User Rev Content
1 elmex 1.1 /*
2 root 1.199 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 pippijn 1.116 *
4 root 1.208 * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 root 1.157 * Copyright (©) 2001,2007 Mark Wedel & Crossfire Development Team
6     * Copyright (©) 1992,2007 Frank Tore Johansen
7 pippijn 1.116 *
8 root 1.199 * Deliantra is free software: you can redistribute it and/or modify
9 root 1.163 * it under the terms of the GNU General Public License as published by
10     * the Free Software Foundation, either version 3 of the License, or
11     * (at your option) any later version.
12 pippijn 1.116 *
13 root 1.163 * This program is distributed in the hope that it will be useful,
14     * but WITHOUT ANY WARRANTY; without even the implied warranty of
15     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16     * GNU General Public License for more details.
17 pippijn 1.116 *
18 root 1.163 * You should have received a copy of the GNU General Public License
19     * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 root 1.157 *
21 root 1.199 * The authors can be reached via e-mail to <support@deliantra.net>
22 pippijn 1.116 */
23 elmex 1.1
24     #include <global.h>
25 root 1.28 #include <stdio.h>
26     #include <sys/types.h>
27     #include <sys/uio.h>
28 elmex 1.1 #include <object.h>
29 root 1.146 #include <sproto.h>
30 elmex 1.1 #include <loader.h>
31 root 1.28
32 root 1.68 #include <bitset>
33    
34 root 1.202 UUID UUID::cur;
35 root 1.204 static uint64_t seq_next_save;
36     static const uint64 UUID_GAP = 1<<19;
37 elmex 1.1
38 root 1.108 objectvec objects;
39     activevec actives;
40 elmex 1.1
41 root 1.203 short freearr_x[SIZEOFFREE] = {
42     0,
43     0, 1, 1, 1, 0, -1, -1, -1,
44     0, 1, 2, 2, 2, 2, 2, 1, 0, -1, -2, -2, -2, -2, -2, -1,
45     0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0, -1, -2, -3, -3, -3, -3, -3, -3, -3, -2, -1
46 root 1.24 };
47 root 1.203 short freearr_y[SIZEOFFREE] = {
48     0,
49     -1, -1, 0, 1, 1, 1, 0, -1,
50     -2, -2, -2, -1, 0, 1, 2, 2, 2, 2, 2, 1, 0, -1, -2, -2,
51     -3, -3, -3, -3, -2, -1, 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0, -1, -2, -3, -3, -3
52 root 1.24 };
53 root 1.203 int maxfree[SIZEOFFREE] = {
54     0,
55     9, 10, 13, 14, 17, 18, 21, 22,
56     25, 26, 27, 30, 31, 32, 33, 36, 37, 39, 39, 42, 43, 44, 45, 48,
57     49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49
58 root 1.24 };
59     int freedir[SIZEOFFREE] = {
60 root 1.203 0,
61     1, 2, 3, 4, 5, 6, 7, 8,
62     1, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8,
63     1, 2, 2, 2, 2, 2, 3, 4, 4, 4, 4, 4, 5, 6, 6, 6, 6, 6, 7, 8, 8, 8, 8, 8
64 root 1.24 };
65 elmex 1.1
66 root 1.39 static void
67 root 1.203 write_uuid (uval64 skip, bool sync)
68 root 1.39 {
69 root 1.203 CALL_BEGIN (2);
70     CALL_ARG_SV (newSVval64 (skip));
71     CALL_ARG_SV (boolSV (sync));
72     CALL_CALL ("cf::write_uuid", G_DISCARD);
73     CALL_END;
74 root 1.39 }
75    
76     static void
77     read_uuid (void)
78     {
79     char filename[MAX_BUF];
80    
81     sprintf (filename, "%s/uuid", settings.localdir);
82    
83 root 1.204 seq_next_save = 0;
84    
85 root 1.39 FILE *fp;
86    
87     if (!(fp = fopen (filename, "r")))
88     {
89     if (errno == ENOENT)
90     {
91     LOG (llevInfo, "RESET uid to 1\n");
92 root 1.202 UUID::cur.seq = 0;
93 root 1.204 write_uuid (UUID_GAP, true);
94 root 1.39 return;
95     }
96    
97     LOG (llevError, "FATAL: cannot open %s for reading!\n", filename);
98     _exit (1);
99     }
100    
101 root 1.203 UUID::BUF buf;
102     buf[0] = 0;
103     fgets (buf, sizeof (buf), fp);
104    
105     if (!UUID::cur.parse (buf))
106 root 1.39 {
107 root 1.203 LOG (llevError, "FATAL: error reading uid from %s (%s)!\n", filename, buf);
108 root 1.39 _exit (1);
109     }
110    
111 root 1.203 LOG (llevDebug, "read UUID: %s\n", UUID::cur.c_str ());
112    
113 root 1.204 write_uuid (UUID_GAP, true);
114 root 1.39 fclose (fp);
115     }
116    
117     UUID
118 root 1.202 UUID::gen ()
119 root 1.39 {
120     UUID uid;
121    
122 root 1.202 uid.seq = ++cur.seq;
123 root 1.39
124 root 1.204 if (expect_false (cur.seq >= seq_next_save))
125     {
126     seq_next_save = UUID::cur.seq + (UUID_GAP >> 1);
127     write_uuid (UUID_GAP, false);
128     }
129    
130 root 1.39
131     return uid;
132     }
133    
134     void
135 root 1.202 UUID::init ()
136 root 1.39 {
137     read_uuid ();
138     }
139    
140 elmex 1.1 /* Returns TRUE if every key_values in wants has a partner with the same value in has. */
141 root 1.205 static bool
142 root 1.24 compare_ob_value_lists_one (const object *wants, const object *has)
143     {
144 root 1.228 /* n-squared behaviour (see kv_get), but I'm hoping both
145 root 1.24 * objects with lists are rare, and lists stay short. If not, use a
146     * different structure or at least keep the lists sorted...
147     */
148    
149     /* For each field in wants, */
150 root 1.228 for (key_value *kv = wants->key_values; kv; kv = kv->next)
151     if (has->kv_get (kv->key) != kv->value)
152     return false;
153 root 1.24
154     /* If we get here, every field in wants has a matching field in has. */
155 root 1.228 return true;
156 elmex 1.1 }
157    
158     /* Returns TRUE if ob1 has the same key_values as ob2. */
159 root 1.205 static bool
160 root 1.24 compare_ob_value_lists (const object *ob1, const object *ob2)
161     {
162     /* However, there may be fields in has which aren't partnered in wants,
163     * so we need to run the comparison *twice*. :(
164     */
165 root 1.228 return compare_ob_value_lists_one (ob1, ob2)
166     && compare_ob_value_lists_one (ob2, ob1);
167 elmex 1.1 }
168    
169     /* Function examines the 2 objects given to it, and returns true if
170     * they can be merged together.
171     *
172     * Note that this function appears a lot longer than the macro it
173     * replaces - this is mostly for clarity - a decent compiler should hopefully
174     * reduce this to the same efficiency.
175     *
176 root 1.66 * Check nrof variable *before* calling can_merge()
177 elmex 1.1 *
178     * Improvements made with merge: Better checking on potion, and also
179     * check weight
180     */
181 root 1.66 bool object::can_merge_slow (object *ob1, object *ob2)
182 root 1.16 {
183     /* A couple quicksanity checks */
184 root 1.66 if (ob1 == ob2
185     || ob1->type != ob2->type
186     || ob1->speed != ob2->speed
187     || ob1->value != ob2->value
188     || ob1->name != ob2->name)
189 root 1.16 return 0;
190    
191 root 1.254 /* Do not merge objects if nrof would overflow, assume nrof
192     * is always 0 .. 2**31-1 */
193     if (ob1->nrof > 0x7fffffff - ob2->nrof)
194 root 1.16 return 0;
195    
196     /* If the objects have been identified, set the BEEN_APPLIED flag.
197 root 1.205 * This is to the comparison of the flags below will be OK. We
198 root 1.16 * just can't ignore the been applied or identified flags, as they
199     * are not equal - just if it has been identified, the been_applied
200     * flags lose any meaning.
201     */
202     if (QUERY_FLAG (ob1, FLAG_IDENTIFIED))
203     SET_FLAG (ob1, FLAG_BEEN_APPLIED);
204    
205     if (QUERY_FLAG (ob2, FLAG_IDENTIFIED))
206     SET_FLAG (ob2, FLAG_BEEN_APPLIED);
207 elmex 1.1
208 root 1.243 if (ob1->arch->archname != ob2->arch->archname
209 root 1.68 || ob1->name != ob2->name
210     || ob1->title != ob2->title
211     || ob1->msg != ob2->msg
212     || ob1->weight != ob2->weight
213     || ob1->attacktype != ob2->attacktype
214     || ob1->magic != ob2->magic
215     || ob1->slaying != ob2->slaying
216     || ob1->skill != ob2->skill
217     || ob1->value != ob2->value
218     || ob1->animation_id != ob2->animation_id
219 root 1.243 || (ob1->face != ob2->face && !ob1->animation_id) // face and animation are dependent on each other
220 root 1.68 || ob1->client_type != ob2->client_type
221     || ob1->materialname != ob2->materialname
222     || ob1->lore != ob2->lore
223     || ob1->subtype != ob2->subtype
224     || ob1->move_type != ob2->move_type
225     || ob1->move_block != ob2->move_block
226     || ob1->move_allow != ob2->move_allow
227     || ob1->move_on != ob2->move_on
228     || ob1->move_off != ob2->move_off
229     || ob1->move_slow != ob2->move_slow
230 root 1.208 || ob1->move_slow_penalty != ob2->move_slow_penalty
231     || memcmp (&ob1->resist, &ob2->resist, sizeof (ob1->resist))
232     || memcmp (&ob1->stats , &ob2->stats , sizeof (ob1->stats)))
233     return 0;
234    
235     if ((ob1->flag ^ ob2->flag)
236     .reset (FLAG_INV_LOCKED)
237     .reset (FLAG_REMOVED)
238     .any ())
239 root 1.16 return 0;
240    
241 root 1.205 /* This is really a spellbook check - we should in general
242     * not merge objects with real inventories, as splitting them
243     * is hard.
244 root 1.16 */
245     if (ob1->inv || ob2->inv)
246     {
247 root 1.193 if (!(ob1->inv && ob2->inv))
248     return 0; /* inventories differ in length */
249    
250     if (ob1->inv->below || ob2->inv->below)
251     return 0; /* more than one object in inv */
252 root 1.16
253 root 1.66 if (!object::can_merge (ob1->inv, ob2->inv))
254 root 1.205 return 0; /* inventory objects differ */
255 root 1.16
256     /* inventory ok - still need to check rest of this object to see
257     * if it is valid.
258     */
259     }
260 elmex 1.1
261 root 1.16 /* Don't merge objects that are applied. With the new 'body' code,
262     * it is possible for most any character to have more than one of
263     * some items equipped, and we don't want those to merge.
264     */
265     if (QUERY_FLAG (ob1, FLAG_APPLIED) || QUERY_FLAG (ob2, FLAG_APPLIED))
266     return 0;
267 elmex 1.1
268 root 1.16 /* Note sure why the following is the case - either the object has to
269     * be animated or have a very low speed. Is this an attempted monster
270     * check?
271     */
272 elmex 1.97 if (!QUERY_FLAG (ob1, FLAG_ANIMATE) && ob1->has_active_speed ())
273 root 1.16 return 0;
274 elmex 1.1
275 root 1.16 switch (ob1->type)
276     {
277 root 1.29 case SCROLL:
278     if (ob1->level != ob2->level)
279     return 0;
280     break;
281 root 1.16 }
282 elmex 1.1
283 root 1.205 if (ob1->key_values || ob2->key_values)
284 root 1.16 {
285     /* At least one of these has key_values. */
286 root 1.205 if ((!ob1->key_values) != (!ob2->key_values))
287 root 1.208 return 0; /* One has fields, but the other one doesn't. */
288    
289     if (!compare_ob_value_lists (ob1, ob2))
290 root 1.24 return 0;
291 elmex 1.1 }
292 root 1.16
293     if (ob1->self || ob2->self)
294     {
295     ob1->optimise ();
296     ob2->optimise ();
297    
298     if (ob1->self || ob2->self)
299 root 1.192 {
300 root 1.195 int k1 = ob1->self ? HvTOTALKEYS (ob1->self) : 0;
301     int k2 = ob2->self ? HvTOTALKEYS (ob2->self) : 0;
302 root 1.192
303     if (k1 != k2)
304     return 0;
305 root 1.208
306     if (k1 == 0)
307 root 1.192 return 1;
308 root 1.208
309     if (!cfperl_can_merge (ob1, ob2))
310 root 1.192 return 0;
311     }
312 elmex 1.1 }
313    
314 root 1.16 /* Everything passes, must be OK. */
315     return 1;
316 elmex 1.1 }
317 root 1.24
318 root 1.214 // find player who can see this object
319     object *
320     object::visible_to () const
321     {
322 root 1.220 if (client_visible () && !flag [FLAG_REMOVED])
323 root 1.214 {
324     // see if we are in a container of sorts
325     if (env)
326     {
327     // the player inventory itself is always visible
328 root 1.270 if (env->is_player ())
329 root 1.214 return env;
330    
331     // else a player could have our env open
332     object *envest = env->outer_env ();
333    
334     // the player itself is always on a map, so we will find him here
335     // even if our inv is in a player.
336     if (envest->is_on_map ())
337     if (object *pl = envest->ms ().player ())
338     if (pl->container == env)
339     return pl;
340     }
341     else
342     {
343     // maybe there is a player standing on the same mapspace
344     // this will catch the case where "this" is a player
345     if (object *pl = ms ().player ())
346 root 1.248 if ((!pl->container && pl->contr->ns && !pl->contr->ns->update_look)
347     || this == pl->container)
348 root 1.220 return pl;
349 root 1.214 }
350     }
351    
352     return 0;
353     }
354    
355 root 1.208 // adjust weight per container type ("of holding")
356 root 1.207 static sint32
357 root 1.233 weight_adjust_for (object *op, sint32 weight)
358 root 1.207 {
359     return op->type == CONTAINER
360     ? lerp (weight, 0, 100, 0, 100 - op->stats.Str)
361     : weight;
362     }
363    
364 elmex 1.1 /*
365 root 1.208 * adjust_weight(object, weight) adds the specified weight to an object,
366 root 1.207 * and also updates how much the environment(s) is/are carrying.
367 elmex 1.1 */
368 root 1.207 static void
369 root 1.208 adjust_weight (object *op, sint32 weight)
370 root 1.24 {
371 root 1.207 while (op)
372 root 1.24 {
373 root 1.233 // adjust by actual difference to account for rounding errors
374     // i.e. (w2 - w1) / f != w2 / f - w1 / f and the latter is correct
375     weight = weight_adjust_for (op, op->carrying)
376     - weight_adjust_for (op, op->carrying - weight);
377 root 1.142
378 root 1.212 if (!weight)
379     return;
380    
381 root 1.207 op->carrying += weight;
382 root 1.212
383     if (object *pl = op->visible_to ())
384 root 1.215 if (pl != op) // player is handled lazily
385     esrv_update_item (UPD_WEIGHT, pl, op);
386 root 1.212
387 root 1.207 op = op->env;
388 root 1.24 }
389 root 1.207 }
390 root 1.37
391 root 1.207 /*
392     * this is a recursive function which calculates the weight
393     * an object is carrying. It goes through op and figures out how much
394     * containers are carrying, and sums it up.
395     */
396     void
397     object::update_weight ()
398     {
399     sint32 sum = 0;
400 root 1.37
401 root 1.207 for (object *op = inv; op; op = op->below)
402     {
403     if (op->inv)
404     op->update_weight ();
405 elmex 1.1
406 root 1.207 sum += op->total_weight ();
407     }
408 elmex 1.1
409 root 1.234 sum = weight_adjust_for (this, sum);
410 root 1.212
411     if (sum != carrying)
412     {
413     carrying = sum;
414    
415     if (object *pl = visible_to ())
416 root 1.215 if (pl != this) // player is handled lazily
417     esrv_update_item (UPD_WEIGHT, pl, this);
418 root 1.212 }
419 elmex 1.1 }
420    
421     /*
422 root 1.208 * Used by: Server DM commands: dumpbelow, dump. Some error messages.
423 elmex 1.1 */
424 root 1.53 char *
425 root 1.24 dump_object (object *op)
426     {
427 root 1.53 if (!op)
428     return strdup ("[NULLOBJ]");
429 elmex 1.1
430 root 1.53 object_freezer freezer;
431 root 1.133 op->write (freezer);
432 root 1.53 return freezer.as_string ();
433 elmex 1.1 }
434    
435     /*
436     * get_nearest_part(multi-object, object 2) returns the part of the
437     * multi-object 1 which is closest to the second object.
438     * If it's not a multi-object, it is returned.
439     */
440 root 1.24 object *
441     get_nearest_part (object *op, const object *pl)
442     {
443     object *tmp, *closest;
444     int last_dist, i;
445    
446 root 1.208 if (!op->more)
447 elmex 1.1 return op;
448 root 1.208
449     for (last_dist = distance (op, pl), closest = op, tmp = op->more;
450     tmp;
451     tmp = tmp->more)
452 root 1.24 if ((i = distance (tmp, pl)) < last_dist)
453     closest = tmp, last_dist = i;
454 root 1.208
455 elmex 1.1 return closest;
456     }
457    
458     /*
459     * Returns the object which has the count-variable equal to the argument.
460 root 1.208 * VERRRY slow.
461 elmex 1.1 */
462 root 1.24 object *
463     find_object (tag_t i)
464     {
465 root 1.112 for_all_objects (op)
466     if (op->count == i)
467     return op;
468    
469     return 0;
470 elmex 1.1 }
471    
472     /*
473     * Returns the first object which has a name equal to the argument.
474     * Used only by the patch command, but not all that useful.
475     * Enables features like "patch <name-of-other-player> food 999"
476     */
477 root 1.24 object *
478     find_object_name (const char *str)
479     {
480 root 1.35 shstr_cmp str_ (str);
481 root 1.24
482 root 1.243 if (str_)
483     for_all_objects (op)
484     if (op->name == str_)
485     return op;
486 root 1.11
487 root 1.243 return 0;
488 elmex 1.1 }
489    
490     /*
491     * Sets the owner and sets the skill and exp pointers to owner's current
492     * skill and experience objects.
493 root 1.183 * ACTUALLY NO! investigate! TODO
494 elmex 1.1 */
495 root 1.24 void
496 root 1.30 object::set_owner (object *owner)
497 elmex 1.1 {
498 root 1.183 // allow objects which own objects
499     if (owner)
500     while (owner->owner)
501     owner = owner->owner;
502 elmex 1.1
503 root 1.198 if (flag [FLAG_FREED])
504     {
505     LOG (llevError | logBacktrace, "tried to set owner of %s to %s\n", debug_desc (), owner->debug_desc ());
506     return;
507     }
508    
509 root 1.30 this->owner = owner;
510 elmex 1.1 }
511    
512 root 1.148 int
513     object::slottype () const
514     {
515     if (type == SKILL)
516     {
517     if (IS_COMBAT_SKILL (subtype)) return slot_combat;
518     if (IS_RANGED_SKILL (subtype)) return slot_ranged;
519     }
520     else
521     {
522     if (slot [body_combat].info) return slot_combat;
523     if (slot [body_range ].info) return slot_ranged;
524     }
525    
526     return slot_none;
527     }
528    
529 root 1.147 bool
530     object::change_weapon (object *ob)
531 root 1.144 {
532     if (current_weapon == ob)
533 root 1.147 return true;
534 root 1.146
535 root 1.150 if (chosen_skill)
536     chosen_skill->flag [FLAG_APPLIED] = false;
537    
538 root 1.144 current_weapon = ob;
539 root 1.147 chosen_skill = !ob || ob->type == SKILL ? ob : find_skill_by_name (this, ob->skill);
540 root 1.146
541 root 1.150 if (chosen_skill)
542     chosen_skill->flag [FLAG_APPLIED] = true;
543    
544 root 1.144 update_stats ();
545 root 1.147
546     if (ob)
547     {
548     // now check wether any body locations became invalid, in which case
549     // we cannot apply the weapon at the moment.
550     for (int i = 0; i < NUM_BODY_LOCATIONS; ++i)
551     if (slot[i].used < 0)
552     {
553     current_weapon = chosen_skill = 0;
554     update_stats ();
555    
556     new_draw_info_format (NDI_UNIQUE, 0, this,
557 root 1.156 "You try to balance all your items at once, "
558     "but the %s is just too much for your body. "
559     "[You need to unapply some items first.]", &ob->name);
560 root 1.147 return false;
561     }
562    
563 root 1.148 //new_draw_info_format (NDI_UNIQUE, 0, this, "You switch to your %s.", &ob->name);
564 root 1.147 }
565     else
566 root 1.148 ;//new_draw_info_format (NDI_UNIQUE, 0, this, "You unwield your weapons.");
567 root 1.147
568 root 1.151 if (ob && !ob->flag [FLAG_APPLIED] && ob->type != SPELL)
569     {
570     LOG (llevError | logBacktrace, "%s changed to unapplied weapon %s",
571     &name, ob->debug_desc ());
572     return false;
573     }
574    
575 root 1.147 return true;
576 root 1.144 }
577    
578 elmex 1.1 /* Zero the key_values on op, decrementing the shared-string
579     * refcounts and freeing the links.
580     */
581 root 1.24 static void
582     free_key_values (object *op)
583 root 1.11 {
584 root 1.137 for (key_value *i = op->key_values; i; )
585 root 1.11 {
586     key_value *next = i->next;
587     delete i;
588 root 1.24
589 root 1.11 i = next;
590 elmex 1.1 }
591 root 1.24
592 root 1.11 op->key_values = 0;
593 elmex 1.1 }
594    
595 root 1.227 /*
596     * copy_to first frees everything allocated by the dst object,
597     * and then copies the contents of itself into the second
598     * object, allocating what needs to be allocated. Basically, any
599     * data that is malloc'd needs to be re-malloc/copied. Otherwise,
600     * if the first object is freed, the pointers in the new object
601     * will point at garbage.
602     */
603     void
604     object::copy_to (object *dst)
605 root 1.11 {
606 root 1.227 dst->remove ();
607     *(object_copy *)dst = *this;
608     dst->flag [FLAG_REMOVED] = true;
609 elmex 1.1
610 root 1.11 /* Copy over key_values, if any. */
611 root 1.227 if (key_values)
612 root 1.14 {
613 root 1.23 key_value *tail = 0;
614 root 1.227 dst->key_values = 0;
615 elmex 1.1
616 root 1.227 for (key_value *i = key_values; i; i = i->next)
617 root 1.11 {
618     key_value *new_link = new key_value;
619 root 1.8
620 root 1.227 new_link->next = 0;
621     new_link->key = i->key;
622 root 1.11 new_link->value = i->value;
623    
624     /* Try and be clever here, too. */
625 root 1.227 if (!dst->key_values)
626 root 1.11 {
627 root 1.227 dst->key_values = new_link;
628 root 1.11 tail = new_link;
629 root 1.8 }
630 root 1.11 else
631     {
632     tail->next = new_link;
633     tail = new_link;
634     }
635 root 1.14 }
636     }
637 root 1.137
638     if (speed < 0)
639 root 1.185 dst->speed_left -= rndm ();
640 root 1.2
641 root 1.256 dst->activate ();
642 elmex 1.1 }
643    
644 root 1.133 void
645     object::instantiate ()
646     {
647     if (!uuid.seq) // HACK
648 root 1.202 uuid = UUID::gen ();
649 root 1.133
650     speed_left = -0.1f;
651     /* copy the body_info to the body_used - this is only really
652     * need for monsters, but doesn't hurt to do it for everything.
653     * by doing so, when a monster is created, it has good starting
654     * values for the body_used info, so when items are created
655     * for it, they can be properly equipped.
656     */
657 root 1.145 for (int i = NUM_BODY_LOCATIONS; i--; )
658     slot[i].used = slot[i].info;
659 root 1.133
660     attachable::instantiate ();
661     }
662    
663 root 1.65 object *
664     object::clone ()
665     {
666     object *neu = create ();
667     copy_to (neu);
668 root 1.225 neu->map = map; // not copied by copy_to
669 root 1.65 return neu;
670     }
671    
672 elmex 1.1 /*
673     * If an object with the IS_TURNABLE() flag needs to be turned due
674     * to the closest player being on the other side, this function can
675     * be called to update the face variable, _and_ how it looks on the map.
676     */
677 root 1.24 void
678     update_turn_face (object *op)
679     {
680 root 1.96 if (!QUERY_FLAG (op, FLAG_IS_TURNABLE) || !op->arch)
681 root 1.24 return;
682 root 1.96
683 root 1.24 SET_ANIMATION (op, op->direction);
684     update_object (op, UP_OBJ_FACE);
685 elmex 1.1 }
686    
687     /*
688     * Updates the speed of an object. If the speed changes from 0 to another
689     * value, or vice versa, then add/remove the object from the active list.
690     * This function needs to be called whenever the speed of an object changes.
691     */
692 root 1.24 void
693 root 1.87 object::set_speed (float speed)
694 root 1.24 {
695 root 1.87 if (flag [FLAG_FREED] && speed)
696 root 1.24 {
697 root 1.87 LOG (llevError, "Object %s is freed but has speed.\n", &name);
698     speed = 0;
699 elmex 1.1 }
700 root 1.31
701 root 1.87 this->speed = speed;
702    
703 elmex 1.97 if (has_active_speed ())
704 root 1.98 activate ();
705 root 1.24 else
706 root 1.98 deactivate ();
707 elmex 1.1 }
708    
709     /*
710 root 1.75 * update_object() updates the the map.
711 elmex 1.1 * It takes into account invisible objects (and represent squares covered
712     * by invisible objects by whatever is below them (unless it's another
713     * invisible object, etc...)
714     * If the object being updated is beneath a player, the look-window
715     * of that player is updated (this might be a suboptimal way of
716     * updating that window, though, since update_object() is called _often_)
717     *
718     * action is a hint of what the caller believes need to be done.
719     * current action are:
720     * UP_OBJ_INSERT: op was inserted
721     * UP_OBJ_REMOVE: op was removed
722     * UP_OBJ_CHANGE: object has somehow changed. In this case, we always update
723     * as that is easier than trying to look at what may have changed.
724     * UP_OBJ_FACE: only the objects face has changed.
725     */
726 root 1.24 void
727     update_object (object *op, int action)
728     {
729 root 1.222 if (!op)
730 root 1.24 {
731     /* this should never happen */
732 root 1.222 LOG (llevError | logBacktrace, "update_object() called for NULL object.\n");
733 root 1.24 return;
734 elmex 1.1 }
735 root 1.24
736 root 1.222 if (!op->is_on_map ())
737 root 1.24 {
738     /* Animation is currently handled by client, so nothing
739     * to do in this case.
740     */
741     return;
742 elmex 1.1 }
743    
744 root 1.24 /* make sure the object is within map boundaries */
745 root 1.83 if (op->x < 0 || op->x >= op->map->width || op->y < 0 || op->y >= op->map->height)
746 root 1.24 {
747     LOG (llevError, "update_object() called for object out of map!\n");
748 elmex 1.1 #ifdef MANY_CORES
749 root 1.24 abort ();
750 elmex 1.1 #endif
751 root 1.24 return;
752 elmex 1.1 }
753    
754 root 1.76 mapspace &m = op->ms ();
755 elmex 1.1
756 root 1.99 if (!(m.flags_ & P_UPTODATE))
757 root 1.75 /* nop */;
758     else if (action == UP_OBJ_INSERT)
759     {
760     // this is likely overkill, TODO: revisit (schmorp)
761     if ((QUERY_FLAG (op, FLAG_BLOCKSVIEW) && !(m.flags_ & P_BLOCKSVIEW))
762     || (QUERY_FLAG (op, FLAG_NO_MAGIC) && !(m.flags_ & P_NO_MAGIC))
763 root 1.270 || (op->is_player () && !(m.flags_ & P_PLAYER))
764 root 1.75 || (op->type == SAFE_GROUND && !(m.flags_ & P_SAFE))
765     || (QUERY_FLAG (op, FLAG_ALIVE) && !(m.flags_ & P_IS_ALIVE))
766     || (QUERY_FLAG (op, FLAG_DAMNED) && !(m.flags_ & P_NO_CLERIC))
767     || (m.move_on | op->move_on ) != m.move_on
768     || (m.move_off | op->move_off ) != m.move_off
769     || (m.move_slow | op->move_slow) != m.move_slow
770     /* This isn't perfect, but I don't expect a lot of objects to
771 root 1.252 * have move_allow right now.
772 root 1.75 */
773     || ((m.move_block | op->move_block) & ~op->move_allow) != m.move_block
774     || 1) // the above is not strong enough a test to skip updating. los maybe? TODO (Schmorp)
775 root 1.265 m.invalidate ();
776 root 1.75 }
777     /* if the object is being removed, we can't make intelligent
778     * decisions, because remove_ob can't really pass the object
779     * that is being removed.
780     */
781 root 1.24 else if (action == UP_OBJ_CHANGE || action == UP_OBJ_REMOVE)
782 root 1.265 m.invalidate ();
783 root 1.24 else if (action == UP_OBJ_FACE)
784 root 1.29 /* Nothing to do for that case */ ;
785 root 1.24 else
786 root 1.27 LOG (llevError, "update_object called with invalid action: %d\n", action);
787 elmex 1.1
788 root 1.75 if (op->more)
789 root 1.24 update_object (op->more, action);
790 elmex 1.1 }
791    
792 root 1.21 object::object ()
793     {
794 root 1.22 SET_FLAG (this, FLAG_REMOVED);
795    
796     expmul = 1.0;
797     face = blank_face;
798     }
799    
800     object::~object ()
801     {
802 root 1.121 unlink ();
803 root 1.119
804 root 1.22 free_key_values (this);
805     }
806    
807 root 1.112 static int object_count;
808    
809 root 1.24 void object::link ()
810 root 1.22 {
811 root 1.112 assert (!index);//D
812 root 1.202 uuid = UUID::gen ();
813 root 1.112 count = ++object_count;
814 root 1.21
815 root 1.109 refcnt_inc ();
816 root 1.108 objects.insert (this);
817 root 1.21 }
818    
819 root 1.24 void object::unlink ()
820 root 1.21 {
821 root 1.121 if (!index)
822     return;
823    
824 root 1.108 objects.erase (this);
825 root 1.109 refcnt_dec ();
826 root 1.98 }
827    
828 root 1.96 void
829 root 1.98 object::activate ()
830 root 1.96 {
831 root 1.98 /* If already on active list, don't do anything */
832 root 1.108 if (active)
833 root 1.98 return;
834    
835 root 1.257 if (has_active_speed () && flag [FLAG_FREED]) LOG (llevError | logBacktrace, "BUG: tried to activate freed object %s\n", debug_desc ());//D
836     if (has_active_speed () && flag [FLAG_DEBUG]) LOG (llevError | logBacktrace, "BUG: tried to activate DEBUG object %s\n", debug_desc ());//D temp
837 root 1.256
838 elmex 1.97 if (has_active_speed ())
839 root 1.108 actives.insert (this);
840 root 1.98 }
841 root 1.96
842 root 1.98 void
843     object::activate_recursive ()
844     {
845     activate ();
846    
847 root 1.104 for (object *op = inv; op; op = op->below)
848 root 1.98 op->activate_recursive ();
849 root 1.96 }
850    
851     /* This function removes object 'op' from the list of active
852     * objects.
853     * This should only be used for style maps or other such
854     * reference maps where you don't want an object that isn't
855     * in play chewing up cpu time getting processed.
856     * The reverse of this is to call update_ob_speed, which
857     * will do the right thing based on the speed of the object.
858     */
859     void
860 root 1.98 object::deactivate ()
861 root 1.96 {
862     /* If not on the active list, nothing needs to be done */
863 root 1.108 if (!active)
864 root 1.96 return;
865    
866 root 1.108 actives.erase (this);
867 root 1.98 }
868 root 1.96
869 root 1.98 void
870     object::deactivate_recursive ()
871     {
872 root 1.104 for (object *op = inv; op; op = op->below)
873 root 1.98 op->deactivate_recursive ();
874    
875     deactivate ();
876 root 1.96 }
877    
878 root 1.106 void
879     object::set_flag_inv (int flag, int value)
880     {
881     for (object *op = inv; op; op = op->below)
882     {
883     op->flag [flag] = value;
884     op->set_flag_inv (flag, value);
885     }
886     }
887    
888 root 1.89 /*
889     * Remove and free all objects in the inventory of the given object.
890     * object.c ?
891     */
892     void
893     object::destroy_inv (bool drop_to_ground)
894     {
895 root 1.94 // need to check first, because the checks below might segfault
896     // as we might be on an invalid mapspace and crossfire code
897     // is too buggy to ensure that the inventory is empty.
898 root 1.217 // corollary: if you create arrows etc. with stuff in its inventory,
899 root 1.94 // cf will crash below with off-map x and y
900     if (!inv)
901     return;
902    
903 root 1.89 /* Only if the space blocks everything do we not process -
904     * if some form of movement is allowed, let objects
905     * drop on that space.
906     */
907 root 1.92 if (!drop_to_ground
908     || !map
909 root 1.206 || map->in_memory != MAP_ACTIVE
910 root 1.238 || map->no_drop
911 root 1.95 || ms ().move_block == MOVE_ALL)
912 root 1.89 {
913     while (inv)
914 root 1.259 inv->destroy ();
915 root 1.89 }
916     else
917     { /* Put objects in inventory onto this space */
918     while (inv)
919     {
920     object *op = inv;
921    
922     if (op->flag [FLAG_STARTEQUIP]
923     || op->flag [FLAG_NO_DROP]
924     || op->type == RUNE
925     || op->type == TRAP
926 root 1.110 || op->flag [FLAG_IS_A_TEMPLATE]
927     || op->flag [FLAG_DESTROY_ON_DEATH])
928 root 1.259 op->destroy ();
929 root 1.89 else
930 root 1.93 map->insert (op, x, y);
931 root 1.89 }
932     }
933     }
934    
935 root 1.21 object *object::create ()
936     {
937 root 1.42 object *op = new object;
938 root 1.22 op->link ();
939     return op;
940 root 1.21 }
941 elmex 1.1
942 root 1.223 static struct freed_map : maptile
943     {
944     freed_map ()
945     {
946 root 1.238 path = "<freed objects map>";
947     name = "/internal/freed_objects_map";
948     width = 3;
949     height = 3;
950     no_drop = 1;
951     no_reset = 1;
952 root 1.223
953     alloc ();
954     in_memory = MAP_ACTIVE;
955     }
956 root 1.229
957     ~freed_map ()
958     {
959     destroy ();
960     }
961 root 1.223 } freed_map; // freed objects are moved here to avoid crashes
962    
963 root 1.82 void
964     object::do_destroy ()
965 root 1.14 {
966 root 1.82 if (flag [FLAG_IS_LINKED])
967     remove_button_link (this);
968 root 1.29
969 root 1.82 if (flag [FLAG_FRIENDLY])
970 root 1.140 remove_friendly_object (this);
971 root 1.32
972 root 1.213 remove ();
973    
974     attachable::do_destroy ();
975 root 1.14
976 root 1.112 deactivate ();
977     unlink ();
978 root 1.92
979 root 1.82 flag [FLAG_FREED] = 1;
980 root 1.14
981 root 1.57 // hack to ensure that freed objects still have a valid map
982 root 1.223 map = &freed_map;
983     x = 1;
984     y = 1;
985 root 1.57
986 root 1.88 if (more)
987     {
988 root 1.259 more->destroy ();
989 root 1.88 more = 0;
990     }
991 root 1.82
992 root 1.162 head = 0;
993    
994     // clear those pointers that likely might cause circular references
995     owner = 0;
996     enemy = 0;
997     attacked_by = 0;
998     current_weapon = 0;
999 root 1.82 }
1000    
1001     void
1002 root 1.260 object::destroy ()
1003 root 1.82 {
1004     if (destroyed ())
1005     return;
1006    
1007 root 1.219 if (!is_head () && !head->destroyed ())
1008     {
1009     LOG (llevError | logBacktrace, "tried to destroy the tail of an object");
1010 root 1.260 head->destroy ();
1011 root 1.223 return;
1012 root 1.219 }
1013    
1014 root 1.260 destroy_inv (false);
1015 root 1.22
1016 root 1.173 if (is_head ())
1017     if (sound_destroy)
1018     play_sound (sound_destroy);
1019     else if (flag [FLAG_MONSTER])
1020     play_sound (sound_find ("monster_destroy")); // quick hack, too lazy to create a generic mechanism
1021 root 1.169
1022 root 1.82 attachable::destroy ();
1023 elmex 1.1 }
1024    
1025 root 1.63 /* op->remove ():
1026 elmex 1.1 * This function removes the object op from the linked list of objects
1027     * which it is currently tied to. When this function is done, the
1028     * object will have no environment. If the object previously had an
1029     * environment, the x and y coordinates will be updated to
1030     * the previous environment.
1031     */
1032 root 1.24 void
1033 root 1.128 object::do_remove ()
1034 root 1.24 {
1035 root 1.45 object *tmp, *last = 0;
1036     object *otmp;
1037 root 1.26
1038 root 1.213 if (flag [FLAG_REMOVED])
1039 root 1.29 return;
1040 root 1.24
1041 root 1.82 INVOKE_OBJECT (REMOVE, this);
1042 root 1.26
1043 root 1.213 flag [FLAG_REMOVED] = true;
1044    
1045 root 1.59 if (more)
1046     more->remove ();
1047 root 1.24
1048     /*
1049     * In this case, the object to be removed is in someones
1050     * inventory.
1051     */
1052 root 1.59 if (env)
1053 root 1.24 {
1054 root 1.221 flag [FLAG_REMOVED] = false; // hack around the issue of visible_to checking flag_removed
1055 root 1.220 if (object *pl = visible_to ())
1056     esrv_del_item (pl->contr, count);
1057 root 1.221 flag [FLAG_REMOVED] = true; // hack around the issue of visible_to checking flag_removed
1058 root 1.220
1059 root 1.208 adjust_weight (env, -total_weight ());
1060 root 1.24
1061 root 1.265 object *pl = in_player ();
1062    
1063 root 1.237 /* we set up values so that it could be inserted into
1064     * the map, but we don't actually do that - it is up
1065     * to the caller to decide what we want to do.
1066     */
1067     map = env->map;
1068     x = env->x;
1069     y = env->y;
1070    
1071 root 1.236 // make sure cmov optimisation is applicable
1072 root 1.208 *(above ? &above->below : &env->inv) = below;
1073 root 1.236 *(below ? &below->above : &above ) = above; // &above is just a dummy
1074 root 1.24
1075 root 1.236 above = 0;
1076     below = 0;
1077     env = 0;
1078 root 1.24
1079 root 1.208 /* NO_FIX_PLAYER is set when a great many changes are being
1080     * made to players inventory. If set, avoiding the call
1081     * to save cpu time.
1082     */
1083 root 1.265 if (pl)
1084 root 1.267 if (pl->is_player () && (glow_radius || !QUERY_FLAG (pl, FLAG_NO_FIX_PLAYER)))
1085 root 1.265 {
1086     pl->update_stats ();
1087    
1088 root 1.270 if (glow_radius && pl->is_on_map ())
1089 root 1.265 update_all_los (pl->map, pl->x, pl->y);
1090     }
1091 root 1.59 }
1092     else if (map)
1093     {
1094 root 1.220 map->dirty = true;
1095     mapspace &ms = this->ms ();
1096    
1097     if (object *pl = ms.player ())
1098 root 1.96 {
1099 root 1.270 if (is_player ())
1100 root 1.220 {
1101 root 1.270 ms.smell = pticks; // remember the smell of the player
1102    
1103 root 1.220 // leaving a spot always closes any open container on the ground
1104     if (container && !container->env)
1105     // this causes spurious floorbox updates, but it ensures
1106     // that the CLOSE event is being sent.
1107     close_container ();
1108    
1109     --map->players;
1110     map->touch ();
1111     }
1112     else if (pl->container == this)
1113     {
1114     // removing a container should close it
1115     close_container ();
1116     }
1117 root 1.130
1118 root 1.220 esrv_del_item (pl->contr, count);
1119 root 1.96 }
1120    
1121 root 1.29 /* link the object above us */
1122 root 1.236 // re-link, make sure compiler can easily use cmove
1123     *(above ? &above->below : &ms.top) = below;
1124     *(below ? &below->above : &ms.bot) = above;
1125 root 1.26
1126 root 1.59 above = 0;
1127     below = 0;
1128 root 1.26
1129 root 1.265 ms.invalidate ();
1130 root 1.253
1131 root 1.59 if (map->in_memory == MAP_SAVING)
1132 root 1.29 return;
1133 elmex 1.1
1134 root 1.82 int check_walk_off = !flag [FLAG_NO_APPLY];
1135 elmex 1.1
1136 root 1.175 if (object *pl = ms.player ())
1137     {
1138     if (pl->container == this)
1139     /* If a container that the player is currently using somehow gets
1140     * removed (most likely destroyed), update the player view
1141     * appropriately.
1142     */
1143     pl->close_container ();
1144    
1145 root 1.218 //TODO: the floorbox prev/next might need updating
1146 root 1.226 //esrv_del_item (pl->contr, count);
1147     //TODO: update floorbox to preserve ordering
1148     if (pl->contr->ns)
1149     pl->contr->ns->floorbox_update ();
1150 root 1.175 }
1151    
1152 root 1.117 for (tmp = ms.bot; tmp; tmp = tmp->above)
1153 root 1.24 {
1154 root 1.29 /* No point updating the players look faces if he is the object
1155     * being removed.
1156 root 1.24 */
1157 root 1.29
1158 root 1.96 /* See if object moving off should effect something */
1159 root 1.50 if (check_walk_off
1160 root 1.59 && ((move_type & tmp->move_off)
1161     && (move_type & ~tmp->move_off & ~tmp->move_block) == 0))
1162 root 1.29 {
1163 elmex 1.72 move_apply (tmp, this, 0);
1164 root 1.24
1165 root 1.59 if (destroyed ())
1166 root 1.50 LOG (llevError, "BUG: remove_ob(): name %s, destroyed leaving object\n", tmp->debug_desc ());
1167 root 1.8 }
1168    
1169 root 1.29 last = tmp;
1170     }
1171 root 1.26
1172 root 1.270 if (affects_los ())
1173 root 1.59 update_all_los (map, x, y);
1174 elmex 1.1 }
1175     }
1176    
1177     /*
1178     * merge_ob(op,top):
1179     *
1180     * This function goes through all objects below and including top, and
1181     * merges op to the first matching object.
1182     * If top is NULL, it is calculated.
1183     * Returns pointer to object if it succeded in the merge, otherwise NULL
1184     */
1185 root 1.24 object *
1186     merge_ob (object *op, object *top)
1187     {
1188     if (!op->nrof)
1189 elmex 1.1 return 0;
1190 root 1.29
1191 root 1.194 if (!top)
1192 root 1.82 for (top = op; top && top->above; top = top->above)
1193     ;
1194 root 1.29
1195 root 1.82 for (; top; top = top->below)
1196 root 1.214 if (object::can_merge (op, top))
1197     {
1198     top->nrof += op->nrof;
1199    
1200     if (object *pl = top->visible_to ())
1201     esrv_update_item (UPD_NROF, pl, top);
1202    
1203     op->weight = 0; // cancel the addition above
1204     op->carrying = 0; // must be 0 already
1205 root 1.66
1206 root 1.259 op->destroy ();
1207 root 1.24
1208 root 1.214 return top;
1209     }
1210 root 1.29
1211 root 1.45 return 0;
1212 elmex 1.1 }
1213    
1214 root 1.138 void
1215     object::expand_tail ()
1216     {
1217     if (more)
1218     return;
1219    
1220     object *prev = this;
1221    
1222 root 1.160 for (archetype *at = (archetype *)arch->more; at; at = (archetype *)at->more)
1223 root 1.138 {
1224     object *op = arch_to_object (at);
1225    
1226     op->name = name;
1227     op->name_pl = name_pl;
1228     op->title = title;
1229    
1230     op->head = this;
1231     prev->more = op;
1232    
1233     prev = op;
1234     }
1235     }
1236    
1237 elmex 1.1 /*
1238 root 1.117 * same as insert_ob_in_map except it handles separate coordinates and does a clean
1239     * job preparing multi-part monsters.
1240 elmex 1.1 */
1241 root 1.24 object *
1242 root 1.49 insert_ob_in_map_at (object *op, maptile *m, object *originator, int flag, int x, int y)
1243 root 1.24 {
1244 root 1.244 op->remove ();
1245    
1246 root 1.93 for (object *tmp = op->head_ (); tmp; tmp = tmp->more)
1247 root 1.24 {
1248 root 1.159 tmp->x = x + tmp->arch->x;
1249     tmp->y = y + tmp->arch->y;
1250 elmex 1.1 }
1251 root 1.29
1252 root 1.24 return insert_ob_in_map (op, m, originator, flag);
1253 elmex 1.1 }
1254    
1255     /*
1256     * insert_ob_in_map (op, map, originator, flag):
1257     * This function inserts the object in the two-way linked list
1258     * which represents what is on a map.
1259     * The second argument specifies the map, and the x and y variables
1260     * in the object about to be inserted specifies the position.
1261     *
1262     * originator: Player, monster or other object that caused 'op' to be inserted
1263     * into 'map'. May be NULL.
1264     *
1265     * flag is a bitmask about special things to do (or not do) when this
1266     * function is called. see the object.h file for the INS_ values.
1267     * Passing 0 for flag gives proper default values, so flag really only needs
1268     * to be set if special handling is needed.
1269     *
1270     * Return value:
1271     * new object if 'op' was merged with other object
1272     * NULL if 'op' was destroyed
1273     * just 'op' otherwise
1274     */
1275 root 1.24 object *
1276 root 1.49 insert_ob_in_map (object *op, maptile *m, object *originator, int flag)
1277 elmex 1.1 {
1278 root 1.261 op->remove ();
1279 root 1.117
1280 root 1.258 if (m == &freed_map)//D TODO: remove soon
1281 root 1.245 {//D
1282 root 1.258 LOG (llevError | logBacktrace, "tries to insret object on freed objects map: %s", op->debug_desc ());//D
1283 root 1.245 }//D
1284    
1285 root 1.187 /* Ideally, the caller figures this out. However, it complicates a lot
1286     * of areas of callers (eg, anything that uses find_free_spot would now
1287     * need extra work
1288     */
1289     if (!xy_normalise (m, op->x, op->y))
1290 root 1.24 {
1291 root 1.259 op->head_ ()->destroy ();// remove head_ once all tail object destroyers found
1292 root 1.187 return 0;
1293 elmex 1.1 }
1294 root 1.25
1295 root 1.117 if (object *more = op->more)
1296 root 1.155 if (!insert_ob_in_map (more, m, originator, flag))
1297     return 0;
1298 root 1.25
1299 root 1.24 CLEAR_FLAG (op, FLAG_REMOVED);
1300 root 1.8
1301 root 1.117 op->map = m;
1302     mapspace &ms = op->ms ();
1303 root 1.24
1304     /* this has to be done after we translate the coordinates.
1305     */
1306     if (op->nrof && !(flag & INS_NO_MERGE))
1307 root 1.155 for (object *tmp = ms.bot; tmp; tmp = tmp->above)
1308 root 1.66 if (object::can_merge (op, tmp))
1309 root 1.25 {
1310 root 1.237 // TODO: we actually want to update tmp, not op,
1311 root 1.218 // but some caller surely breaks when we return tmp
1312     // from here :/
1313 root 1.25 op->nrof += tmp->nrof;
1314 root 1.259 tmp->destroy ();
1315 root 1.25 }
1316 root 1.24
1317     CLEAR_FLAG (op, FLAG_APPLIED); /* hack for fixing F_APPLIED in items of dead people */
1318     CLEAR_FLAG (op, FLAG_INV_LOCKED);
1319 root 1.25
1320 root 1.24 if (!QUERY_FLAG (op, FLAG_ALIVE))
1321     CLEAR_FLAG (op, FLAG_NO_STEAL);
1322    
1323     if (flag & INS_BELOW_ORIGINATOR)
1324     {
1325 root 1.241 if (originator->map != op->map || originator->x != op->x || originator->y != op->y)
1326 root 1.24 {
1327     LOG (llevError, "insert_ob_in_map called with INS_BELOW_ORIGINATOR when originator not on same space!\n");
1328     abort ();
1329     }
1330 root 1.25
1331 root 1.241 if (!originator->is_on_map ())
1332     LOG (llevDebug | logBacktrace, "insert_ob_in_map(%s) called with INS_BELOW_ORIGINATOR when originator '%s' not on map",
1333     op->debug_desc (), originator->debug_desc ());
1334    
1335 root 1.24 op->above = originator;
1336     op->below = originator->below;
1337 root 1.237 originator->below = op;
1338 root 1.25
1339 root 1.237 *(op->below ? &op->below->above : &ms.bot) = op;
1340 elmex 1.1 }
1341 root 1.24 else
1342     {
1343 root 1.237 object *floor = 0;
1344     object *top = ms.top;
1345 root 1.117
1346 root 1.24 /* If there are other objects, then */
1347 root 1.191 if (top)
1348 root 1.24 {
1349     /*
1350     * If there are multiple objects on this space, we do some trickier handling.
1351     * We've already dealt with merging if appropriate.
1352     * Generally, we want to put the new object on top. But if
1353     * flag contains INS_ABOVE_FLOOR_ONLY, once we find the last
1354     * floor, we want to insert above that and no further.
1355     * Also, if there are spell objects on this space, we stop processing
1356     * once we get to them. This reduces the need to traverse over all of
1357     * them when adding another one - this saves quite a bit of cpu time
1358     * when lots of spells are cast in one area. Currently, it is presumed
1359     * that flying non pickable objects are spell objects.
1360     */
1361 root 1.237 for (object *tmp = ms.bot; tmp; tmp = tmp->above)
1362 root 1.24 {
1363 root 1.237 if (QUERY_FLAG (tmp, FLAG_IS_FLOOR) || QUERY_FLAG (tmp, FLAG_OVERLAY_FLOOR))
1364     floor = tmp;
1365 root 1.26
1366 root 1.237 if (QUERY_FLAG (tmp, FLAG_NO_PICK) && (tmp->move_type & (MOVE_FLY_LOW | MOVE_FLY_HIGH)) && !QUERY_FLAG (tmp, FLAG_IS_FLOOR))
1367 root 1.24 {
1368     /* We insert above top, so we want this object below this */
1369 root 1.237 top = tmp->below;
1370 root 1.24 break;
1371     }
1372 root 1.26
1373 root 1.237 top = tmp;
1374 root 1.24 }
1375 root 1.26
1376 root 1.24 /* We let update_position deal with figuring out what the space
1377     * looks like instead of lots of conditions here.
1378     * makes things faster, and effectively the same result.
1379     */
1380    
1381     /* Have object 'fall below' other objects that block view.
1382 root 1.135 * Unless those objects are exits.
1383 root 1.24 * If INS_ON_TOP is used, don't do this processing
1384     * Need to find the object that in fact blocks view, otherwise
1385     * stacking is a bit odd.
1386     */
1387 root 1.117 if (!(flag & INS_ON_TOP)
1388     && ms.flags () & P_BLOCKSVIEW
1389 root 1.135 && (op->face && !faces [op->face].visibility))
1390 root 1.24 {
1391 root 1.237 object *last;
1392    
1393 root 1.24 for (last = top; last != floor; last = last->below)
1394     if (QUERY_FLAG (last, FLAG_BLOCKSVIEW) && (last->type != EXIT))
1395     break;
1396 root 1.117
1397 root 1.24 /* Check to see if we found the object that blocks view,
1398     * and make sure we have a below pointer for it so that
1399     * we can get inserted below this one, which requires we
1400     * set top to the object below us.
1401     */
1402     if (last && last->below && last != floor)
1403     top = last->below;
1404 root 1.8 }
1405 root 1.24 } /* If objects on this space */
1406 root 1.25
1407 root 1.24 if (flag & INS_ABOVE_FLOOR_ONLY)
1408     top = floor;
1409    
1410 root 1.240 // insert object above top, or bottom-most if top = 0
1411 root 1.24 if (!top)
1412     {
1413 root 1.239 op->below = 0;
1414     op->above = ms.bot;
1415     ms.bot = op;
1416 root 1.25
1417 root 1.239 *(op->above ? &op->above->below : &ms.top) = op;
1418 root 1.24 }
1419     else
1420 root 1.240 {
1421 root 1.24 op->above = top->above;
1422 root 1.237 top->above = op;
1423 root 1.25
1424 root 1.24 op->below = top;
1425 root 1.237 *(op->above ? &op->above->below : &ms.top) = op;
1426 root 1.24 }
1427 root 1.240 }
1428 root 1.8
1429 root 1.270 if (op->is_player ())
1430 root 1.96 {
1431     op->contr->do_los = 1;
1432     ++op->map->players;
1433 root 1.100 op->map->touch ();
1434 root 1.96 }
1435 root 1.24
1436 root 1.98 op->map->dirty = true;
1437    
1438 root 1.191 if (object *pl = ms.player ())
1439 root 1.218 //TODO: the floorbox prev/next might need updating
1440 root 1.226 //esrv_send_item (pl, op);
1441     //TODO: update floorbox to preserve ordering
1442     if (pl->contr->ns)
1443     pl->contr->ns->floorbox_update ();
1444 root 1.24
1445     /* If this object glows, it may affect lighting conditions that are
1446     * visible to others on this map. But update_all_los is really
1447     * an inefficient way to do this, as it means los for all players
1448     * on the map will get recalculated. The players could very well
1449     * be far away from this change and not affected in any way -
1450     * this should get redone to only look for players within range,
1451 root 1.99 * or just updating the P_UPTODATE for spaces within this area
1452 root 1.24 * of effect may be sufficient.
1453     */
1454 root 1.270 if (op->affects_los ())
1455 root 1.265 {
1456     op->ms ().invalidate ();
1457     update_all_los (op->map, op->x, op->y);
1458     }
1459 root 1.24
1460     /* updates flags (blocked, alive, no magic, etc) for this map space */
1461     update_object (op, UP_OBJ_INSERT);
1462    
1463 root 1.82 INVOKE_OBJECT (INSERT, op);
1464    
1465 root 1.24 /* Don't know if moving this to the end will break anything. However,
1466 root 1.70 * we want to have floorbox_update called before calling this.
1467 root 1.24 *
1468     * check_move_on() must be after this because code called from
1469     * check_move_on() depends on correct map flags (so functions like
1470     * blocked() and wall() work properly), and these flags are updated by
1471     * update_object().
1472     */
1473    
1474     /* if this is not the head or flag has been passed, don't check walk on status */
1475 root 1.155 if (!(flag & INS_NO_WALK_ON) && op->head_ () == op)
1476 root 1.24 {
1477     if (check_move_on (op, originator))
1478 root 1.82 return 0;
1479 elmex 1.1
1480 root 1.24 /* If we are a multi part object, lets work our way through the check
1481     * walk on's.
1482     */
1483 root 1.155 for (object *tmp = op->more; tmp; tmp = tmp->more)
1484 root 1.24 if (check_move_on (tmp, originator))
1485 root 1.82 return 0;
1486 elmex 1.1 }
1487 root 1.25
1488 root 1.24 return op;
1489 elmex 1.1 }
1490    
1491     /* this function inserts an object in the map, but if it
1492 root 1.75 * finds an object of its own type, it'll remove that one first.
1493     * op is the object to insert it under: supplies x and the map.
1494 elmex 1.1 */
1495 root 1.24 void
1496     replace_insert_ob_in_map (const char *arch_string, object *op)
1497     {
1498     /* first search for itself and remove any old instances */
1499 elmex 1.1
1500 root 1.208 for (object *tmp = op->ms ().bot; tmp; tmp = tmp->above)
1501 root 1.158 if (!strcmp (tmp->arch->archname, arch_string)) /* same archetype */
1502 root 1.259 tmp->destroy ();
1503 root 1.208
1504     object *tmp = arch_to_object (archetype::find (arch_string));
1505 elmex 1.1
1506 root 1.208 tmp->x = op->x;
1507     tmp->y = op->y;
1508 elmex 1.1
1509 root 1.208 insert_ob_in_map (tmp, op->map, op, 0);
1510 root 1.24 }
1511 elmex 1.1
1512 root 1.93 object *
1513     object::insert_at (object *where, object *originator, int flags)
1514     {
1515 root 1.205 if (where->env)
1516     return where->env->insert (this);
1517     else
1518     return where->map->insert (this, where->x, where->y, originator, flags);
1519 root 1.93 }
1520    
1521 elmex 1.1 /*
1522 root 1.209 * decrease(object, number) decreases a specified number from
1523 root 1.208 * the amount of an object. If the amount reaches 0, the object
1524 elmex 1.1 * is subsequently removed and freed.
1525     *
1526     * Return value: 'op' if something is left, NULL if the amount reached 0
1527     */
1528 root 1.208 bool
1529 root 1.209 object::decrease (sint32 nr)
1530 elmex 1.1 {
1531 root 1.212 if (!nr)
1532     return true;
1533    
1534 root 1.208 nr = min (nr, nrof);
1535 elmex 1.1
1536 root 1.251 if (nrof > nr)
1537 elmex 1.1 {
1538 root 1.251 nrof -= nr;
1539 root 1.247 adjust_weight (env, -weight * max (1, nr)); // carrying == 0
1540 elmex 1.1
1541 root 1.212 if (object *pl = visible_to ())
1542     esrv_update_item (UPD_NROF, pl, this);
1543 root 1.29
1544 root 1.212 return true;
1545 elmex 1.1 }
1546 root 1.24 else
1547     {
1548 root 1.249 destroy ();
1549 root 1.212 return false;
1550 elmex 1.1 }
1551     }
1552    
1553 root 1.209 /*
1554 root 1.210 * split(ob,nr) splits up ob into two parts. The part which
1555 root 1.209 * is returned contains nr objects, and the remaining parts contains
1556 root 1.210 * the rest (or is removed and returned if that number is 0).
1557     * On failure, NULL is returned.
1558 root 1.209 */
1559 root 1.208 object *
1560 root 1.209 object::split (sint32 nr)
1561 root 1.208 {
1562 root 1.212 int have = number_of ();
1563    
1564     if (have < nr)
1565 root 1.209 return 0;
1566 root 1.212 else if (have == nr)
1567 root 1.209 {
1568     remove ();
1569     return this;
1570     }
1571     else
1572     {
1573     decrease (nr);
1574    
1575 root 1.230 object *op = deep_clone ();
1576 root 1.209 op->nrof = nr;
1577     return op;
1578     }
1579     }
1580    
1581 root 1.24 object *
1582     insert_ob_in_ob (object *op, object *where)
1583     {
1584 root 1.59 if (!where)
1585 root 1.24 {
1586 root 1.53 char *dump = dump_object (op);
1587     LOG (llevError, "Trying to put object in NULL.\n%s\n", dump);
1588     free (dump);
1589 root 1.24 return op;
1590     }
1591 root 1.29
1592 root 1.154 if (where->head_ () != where)
1593 root 1.24 {
1594 root 1.153 LOG (llevError | logBacktrace, "Warning: Tried to insert object into wrong part of multipart object.\n");
1595 root 1.24 where = where->head;
1596     }
1597 root 1.29
1598 root 1.59 return where->insert (op);
1599     }
1600    
1601     /*
1602     * env->insert (op)
1603     * This function inserts the object op in the linked list
1604     * inside the object environment.
1605     *
1606     * The function returns now pointer to inserted item, and return value can
1607     * be != op, if items are merged. -Tero
1608     */
1609     object *
1610     object::insert (object *op)
1611     {
1612 root 1.24 if (op->more)
1613     {
1614     LOG (llevError, "Tried to insert multipart object %s (%d)\n", &op->name, op->count);
1615     return op;
1616     }
1617 root 1.29
1618 root 1.208 op->remove ();
1619    
1620     op->flag [FLAG_OBJ_ORIGINAL] = 0;
1621 root 1.182
1622 root 1.24 if (op->nrof)
1623 root 1.208 for (object *tmp = inv; tmp; tmp = tmp->below)
1624     if (object::can_merge (tmp, op))
1625     {
1626     /* return the original object and remove inserted object
1627     (client needs the original object) */
1628     tmp->nrof += op->nrof;
1629 root 1.214
1630     if (object *pl = tmp->visible_to ())
1631     esrv_update_item (UPD_NROF, pl, tmp);
1632    
1633 root 1.210 adjust_weight (this, op->total_weight ());
1634    
1635 root 1.259 op->destroy ();
1636 root 1.208 op = tmp;
1637     goto inserted;
1638     }
1639    
1640     op->owner = 0; // it's his/hers now. period.
1641     op->map = 0;
1642     op->x = 0;
1643     op->y = 0;
1644    
1645     op->above = 0;
1646     op->below = inv;
1647     op->env = this;
1648    
1649     if (inv)
1650     inv->above = op;
1651 root 1.24
1652 root 1.208 inv = op;
1653 elmex 1.1
1654 root 1.208 op->flag [FLAG_REMOVED] = 0;
1655 elmex 1.1
1656 root 1.214 if (object *pl = op->visible_to ())
1657     esrv_send_item (pl, op);
1658    
1659 root 1.208 adjust_weight (this, op->total_weight ());
1660 elmex 1.1
1661 root 1.208 inserted:
1662 elmex 1.1 /* reset the light list and los of the players on the map */
1663 root 1.270 if (op->glow_radius && is_on_map ())
1664 root 1.265 {
1665     update_stats ();
1666     update_all_los (map, x, y);
1667     }
1668 root 1.270 else if (is_player () && !flag [FLAG_NO_FIX_PLAYER])
1669 root 1.265 // if this is a player's inventory, update stats
1670 root 1.214 update_stats ();
1671 root 1.59
1672 root 1.82 INVOKE_OBJECT (INSERT, this);
1673    
1674 elmex 1.1 return op;
1675     }
1676    
1677     /*
1678     * Checks if any objects has a move_type that matches objects
1679     * that effect this object on this space. Call apply() to process
1680     * these events.
1681     *
1682     * Any speed-modification due to SLOW_MOVE() of other present objects
1683     * will affect the speed_left of the object.
1684     *
1685     * originator: Player, monster or other object that caused 'op' to be inserted
1686     * into 'map'. May be NULL.
1687     *
1688     * Return value: 1 if 'op' was destroyed, 0 otherwise.
1689     *
1690     * 4-21-95 added code to check if appropriate skill was readied - this will
1691     * permit faster movement by the player through this terrain. -b.t.
1692     *
1693     * MSW 2001-07-08: Check all objects on space, not just those below
1694     * object being inserted. insert_ob_in_map may not put new objects
1695     * on top.
1696     */
1697 root 1.24 int
1698     check_move_on (object *op, object *originator)
1699 elmex 1.1 {
1700 root 1.48 object *tmp;
1701 root 1.49 maptile *m = op->map;
1702 root 1.48 int x = op->x, y = op->y;
1703 root 1.26
1704 root 1.48 MoveType move_on, move_slow, move_block;
1705 root 1.24
1706     if (QUERY_FLAG (op, FLAG_NO_APPLY))
1707     return 0;
1708    
1709     move_on = GET_MAP_MOVE_ON (op->map, op->x, op->y);
1710     move_slow = GET_MAP_MOVE_SLOW (op->map, op->x, op->y);
1711     move_block = GET_MAP_MOVE_BLOCK (op->map, op->x, op->y);
1712    
1713     /* if nothing on this space will slow op down or be applied,
1714     * no need to do checking below. have to make sure move_type
1715     * is set, as lots of objects don't have it set - we treat that
1716     * as walking.
1717     */
1718     if (op->move_type && !(op->move_type & move_on) && !(op->move_type & move_slow))
1719     return 0;
1720 elmex 1.1
1721 root 1.24 /* This is basically inverse logic of that below - basically,
1722     * if the object can avoid the move on or slow move, they do so,
1723     * but can't do it if the alternate movement they are using is
1724     * blocked. Logic on this seems confusing, but does seem correct.
1725     */
1726     if ((op->move_type & ~move_on & ~move_block) != 0 && (op->move_type & ~move_slow & ~move_block) != 0)
1727     return 0;
1728    
1729     /* The objects have to be checked from top to bottom.
1730     * Hence, we first go to the top:
1731     */
1732    
1733 root 1.104 for (tmp = op->ms ().bot; tmp && tmp->above; tmp = tmp->above)
1734 root 1.24 {
1735     /* Trim the search when we find the first other spell effect
1736     * this helps performance so that if a space has 50 spell objects,
1737     * we don't need to check all of them.
1738     */
1739     if ((tmp->move_type & MOVE_FLY_LOW) && QUERY_FLAG (tmp, FLAG_NO_PICK))
1740     break;
1741     }
1742 root 1.26
1743     for (; tmp; tmp = tmp->below)
1744 root 1.24 {
1745     if (tmp == op)
1746     continue; /* Can't apply yourself */
1747 elmex 1.1
1748 root 1.24 /* Check to see if one of the movement types should be slowed down.
1749     * Second check makes sure that the movement types not being slowed
1750     * (~slow_move) is not blocked on this space - just because the
1751     * space doesn't slow down swimming (for example), if you can't actually
1752     * swim on that space, can't use it to avoid the penalty.
1753     */
1754     if (!QUERY_FLAG (op, FLAG_WIZPASS))
1755     {
1756     if ((!op->move_type && tmp->move_slow & MOVE_WALK) ||
1757     ((op->move_type & tmp->move_slow) && (op->move_type & ~tmp->move_slow & ~tmp->move_block) == 0))
1758     {
1759 elmex 1.1
1760 root 1.29 float
1761 root 1.120 diff = tmp->move_slow_penalty * fabs (op->speed);
1762 elmex 1.1
1763 root 1.270 if (op->is_player ())
1764 root 1.26 if ((QUERY_FLAG (tmp, FLAG_IS_HILLY) && find_skill_by_number (op, SK_CLIMBING)) ||
1765     (QUERY_FLAG (tmp, FLAG_IS_WOODED) && find_skill_by_number (op, SK_WOODSMAN)))
1766     diff /= 4.0;
1767    
1768 root 1.24 op->speed_left -= diff;
1769 root 1.8 }
1770     }
1771 elmex 1.1
1772 root 1.24 /* Basically same logic as above, except now for actual apply. */
1773     if ((!op->move_type && tmp->move_on & MOVE_WALK) ||
1774     ((op->move_type & tmp->move_on) && (op->move_type & ~tmp->move_on & ~tmp->move_block) == 0))
1775     {
1776 elmex 1.72 move_apply (tmp, op, originator);
1777 root 1.24
1778 root 1.48 if (op->destroyed ())
1779 root 1.24 return 1;
1780    
1781     /* what the person/creature stepped onto has moved the object
1782     * someplace new. Don't process any further - if we did,
1783     * have a feeling strange problems would result.
1784     */
1785     if (op->map != m || op->x != x || op->y != y)
1786     return 0;
1787 root 1.8 }
1788 elmex 1.1 }
1789 root 1.26
1790 root 1.24 return 0;
1791 elmex 1.1 }
1792    
1793     /*
1794     * present_arch(arch, map, x, y) searches for any objects with
1795     * a matching archetype at the given map and coordinates.
1796     * The first matching object is returned, or NULL if none.
1797     */
1798 root 1.24 object *
1799 root 1.49 present_arch (const archetype *at, maptile *m, int x, int y)
1800 root 1.24 {
1801 root 1.104 if (!m || out_of_map (m, x, y))
1802 root 1.24 {
1803     LOG (llevError, "Present_arch called outside map.\n");
1804     return NULL;
1805     }
1806 root 1.84
1807 root 1.104 for (object *tmp = m->at (x, y).bot; tmp; tmp = tmp->above)
1808 root 1.231 if (tmp->arch->archname == at->archname)
1809 elmex 1.1 return tmp;
1810 root 1.84
1811 elmex 1.1 return NULL;
1812     }
1813    
1814     /*
1815     * present(type, map, x, y) searches for any objects with
1816     * a matching type variable at the given map and coordinates.
1817     * The first matching object is returned, or NULL if none.
1818     */
1819 root 1.24 object *
1820 root 1.49 present (unsigned char type, maptile *m, int x, int y)
1821 root 1.24 {
1822     if (out_of_map (m, x, y))
1823     {
1824     LOG (llevError, "Present called outside map.\n");
1825     return NULL;
1826     }
1827 root 1.84
1828 root 1.104 for (object *tmp = m->at (x, y).bot; tmp; tmp = tmp->above)
1829 root 1.24 if (tmp->type == type)
1830 elmex 1.1 return tmp;
1831 root 1.84
1832 elmex 1.1 return NULL;
1833     }
1834    
1835     /*
1836     * present_in_ob(type, object) searches for any objects with
1837     * a matching type variable in the inventory of the given object.
1838     * The first matching object is returned, or NULL if none.
1839     */
1840 root 1.24 object *
1841     present_in_ob (unsigned char type, const object *op)
1842     {
1843 root 1.84 for (object *tmp = op->inv; tmp != NULL; tmp = tmp->below)
1844 root 1.24 if (tmp->type == type)
1845 elmex 1.1 return tmp;
1846 root 1.84
1847 elmex 1.1 return NULL;
1848     }
1849    
1850     /*
1851     * present_in_ob (type, str, object) searches for any objects with
1852     * a matching type & name variable in the inventory of the given object.
1853     * The first matching object is returned, or NULL if none.
1854     * This is mostly used by spell effect code, so that we only
1855     * have one spell effect at a time.
1856     * type can be used to narrow the search - if type is set,
1857     * the type must also match. -1 can be passed for the type,
1858     * in which case the type does not need to pass.
1859     * str is the string to match against. Note that we match against
1860     * the object name, not the archetype name. this is so that the
1861     * spell code can use one object type (force), but change it's name
1862     * to be unique.
1863     */
1864 root 1.24 object *
1865     present_in_ob_by_name (int type, const char *str, const object *op)
1866     {
1867 root 1.84 for (object *tmp = op->inv; tmp; tmp = tmp->below)
1868 root 1.82 if ((type == -1 || tmp->type == type) && (!strcmp (str, tmp->name)))
1869     return tmp;
1870 elmex 1.1
1871 root 1.82 return 0;
1872 elmex 1.1 }
1873    
1874     /*
1875     * present_arch_in_ob(archetype, object) searches for any objects with
1876     * a matching archetype in the inventory of the given object.
1877     * The first matching object is returned, or NULL if none.
1878     */
1879 root 1.24 object *
1880     present_arch_in_ob (const archetype *at, const object *op)
1881     {
1882 root 1.231 for (object *tmp = op->inv; tmp; tmp = tmp->below)
1883     if (tmp->arch->archname == at->archname)
1884 elmex 1.1 return tmp;
1885 root 1.82
1886 elmex 1.1 return NULL;
1887     }
1888    
1889     /*
1890     * activate recursively a flag on an object inventory
1891     */
1892 root 1.24 void
1893     flag_inv (object *op, int flag)
1894     {
1895 root 1.197 for (object *tmp = op->inv; tmp; tmp = tmp->below)
1896     {
1897     SET_FLAG (tmp, flag);
1898     flag_inv (tmp, flag);
1899     }
1900 root 1.82 }
1901    
1902     /*
1903     * deactivate recursively a flag on an object inventory
1904     */
1905 root 1.24 void
1906     unflag_inv (object *op, int flag)
1907     {
1908 root 1.197 for (object *tmp = op->inv; tmp; tmp = tmp->below)
1909     {
1910     CLEAR_FLAG (tmp, flag);
1911     unflag_inv (tmp, flag);
1912     }
1913 elmex 1.1 }
1914    
1915     /*
1916     * find_free_spot(object, map, x, y, start, stop) will search for
1917     * a spot at the given map and coordinates which will be able to contain
1918     * the given object. start and stop specifies how many squares
1919     * to search (see the freearr_x/y[] definition).
1920     * It returns a random choice among the alternatives found.
1921     * start and stop are where to start relative to the free_arr array (1,9
1922     * does all 4 immediate directions). This returns the index into the
1923     * array of the free spot, -1 if no spot available (dir 0 = x,y)
1924 root 1.196 * Note: This function does correctly handle tiled maps, but does not
1925 elmex 1.1 * inform the caller. However, insert_ob_in_map will update as
1926     * necessary, so the caller shouldn't need to do any special work.
1927     * Note - updated to take an object instead of archetype - this is necessary
1928     * because arch_blocked (now ob_blocked) needs to know the movement type
1929     * to know if the space in question will block the object. We can't use
1930     * the archetype because that isn't correct if the monster has been
1931     * customized, changed states, etc.
1932     */
1933 root 1.24 int
1934 root 1.49 find_free_spot (const object *ob, maptile *m, int x, int y, int start, int stop)
1935 root 1.24 {
1936 root 1.190 int altern[SIZEOFFREE];
1937 root 1.82 int index = 0, flag;
1938 root 1.24
1939 root 1.82 for (int i = start; i < stop; i++)
1940 root 1.24 {
1941 root 1.188 mapxy pos (m, x, y); pos.move (i);
1942    
1943     if (!pos.normalise ())
1944     continue;
1945    
1946     mapspace &ms = *pos;
1947 root 1.189
1948     if (ms.flags () & P_IS_ALIVE)
1949     continue;
1950 root 1.188
1951     /* However, often
1952     * ob doesn't have any move type (when used to place exits)
1953     * so the AND operation in OB_TYPE_MOVE_BLOCK doesn't work.
1954     */
1955 root 1.200 if (ob && ob->move_type == 0 && ms.move_block != MOVE_ALL)
1956 root 1.190 {
1957     altern [index++] = i;
1958     continue;
1959     }
1960 root 1.24
1961     /* Basically, if we find a wall on a space, we cut down the search size.
1962     * In this way, we won't return spaces that are on another side of a wall.
1963     * This mostly work, but it cuts down the search size in all directions -
1964     * if the space being examined only has a wall to the north and empty
1965     * spaces in all the other directions, this will reduce the search space
1966     * to only the spaces immediately surrounding the target area, and
1967     * won't look 2 spaces south of the target space.
1968     */
1969 root 1.188 if (ms.move_block == MOVE_ALL && maxfree[i] < stop)
1970     {
1971     stop = maxfree[i];
1972     continue;
1973     }
1974    
1975     /* Note it is intentional that we check ob - the movement type of the
1976     * head of the object should correspond for the entire object.
1977     */
1978     if (OB_TYPE_MOVE_BLOCK (ob, ms.move_block))
1979     continue;
1980    
1981 elmex 1.262 if (ob->blocked (pos.m, pos.x, pos.y))
1982 root 1.196 continue;
1983    
1984 root 1.188 altern [index++] = i;
1985 elmex 1.1 }
1986 root 1.74
1987 root 1.24 if (!index)
1988     return -1;
1989 root 1.74
1990 root 1.124 return altern [rndm (index)];
1991 elmex 1.1 }
1992    
1993     /*
1994 root 1.49 * find_first_free_spot(archetype, maptile, x, y) works like
1995 elmex 1.1 * find_free_spot(), but it will search max number of squares.
1996     * But it will return the first available spot, not a random choice.
1997     * Changed 0.93.2: Have it return -1 if there is no free spot available.
1998     */
1999 root 1.24 int
2000 root 1.49 find_first_free_spot (const object *ob, maptile *m, int x, int y)
2001 root 1.24 {
2002 root 1.82 for (int i = 0; i < SIZEOFFREE; i++)
2003 root 1.188 if (!ob->blocked (m, x + freearr_x[i], y + freearr_y[i]))
2004 root 1.82 return i;
2005 root 1.24
2006     return -1;
2007 elmex 1.1 }
2008    
2009     /*
2010     * The function permute(arr, begin, end) randomly reorders the array
2011     * arr[begin..end-1].
2012 root 1.82 * now uses a fisher-yates shuffle, old permute was broken
2013 elmex 1.1 */
2014 root 1.24 static void
2015     permute (int *arr, int begin, int end)
2016 elmex 1.1 {
2017 root 1.82 arr += begin;
2018     end -= begin;
2019    
2020     while (--end)
2021 root 1.124 swap (arr [end], arr [rndm (end + 1)]);
2022 elmex 1.1 }
2023    
2024     /* new function to make monster searching more efficient, and effective!
2025     * This basically returns a randomized array (in the passed pointer) of
2026     * the spaces to find monsters. In this way, it won't always look for
2027     * monsters to the north first. However, the size of the array passed
2028     * covers all the spaces, so within that size, all the spaces within
2029     * the 3x3 area will be searched, just not in a predictable order.
2030     */
2031 root 1.24 void
2032     get_search_arr (int *search_arr)
2033 elmex 1.1 {
2034 root 1.82 int i;
2035 elmex 1.1
2036 root 1.24 for (i = 0; i < SIZEOFFREE; i++)
2037 root 1.82 search_arr[i] = i;
2038 elmex 1.1
2039 root 1.24 permute (search_arr, 1, SIZEOFFREE1 + 1);
2040     permute (search_arr, SIZEOFFREE1 + 1, SIZEOFFREE2 + 1);
2041     permute (search_arr, SIZEOFFREE2 + 1, SIZEOFFREE);
2042 elmex 1.1 }
2043    
2044     /*
2045     * find_dir(map, x, y, exclude) will search some close squares in the
2046     * given map at the given coordinates for live objects.
2047     * It will not considered the object given as exclude among possible
2048     * live objects.
2049     * It returns the direction toward the first/closest live object if finds
2050     * any, otherwise 0.
2051     * Perhaps incorrectly, but I'm making the assumption that exclude
2052     * is actually want is going to try and move there. We need this info
2053     * because we have to know what movement the thing looking to move
2054     * there is capable of.
2055     */
2056 root 1.24 int
2057 root 1.49 find_dir (maptile *m, int x, int y, object *exclude)
2058 root 1.24 {
2059 root 1.82 int i, max = SIZEOFFREE, mflags;
2060 root 1.29
2061     sint16 nx, ny;
2062 root 1.82 object *tmp;
2063     maptile *mp;
2064 root 1.29
2065     MoveType blocked, move_type;
2066 root 1.24
2067 root 1.155 if (exclude && exclude->head_ () != exclude)
2068 root 1.24 {
2069     exclude = exclude->head;
2070     move_type = exclude->move_type;
2071     }
2072     else
2073     {
2074     /* If we don't have anything, presume it can use all movement types. */
2075     move_type = MOVE_ALL;
2076     }
2077    
2078     for (i = 1; i < max; i++)
2079     {
2080     mp = m;
2081     nx = x + freearr_x[i];
2082     ny = y + freearr_y[i];
2083    
2084     mflags = get_map_flags (m, &mp, nx, ny, &nx, &ny);
2085 root 1.75
2086 root 1.24 if (mflags & P_OUT_OF_MAP)
2087 root 1.75 max = maxfree[i];
2088 root 1.24 else
2089     {
2090 root 1.82 mapspace &ms = mp->at (nx, ny);
2091    
2092     blocked = ms.move_block;
2093 root 1.24
2094     if ((move_type & blocked) == move_type)
2095 root 1.75 max = maxfree[i];
2096 root 1.24 else if (mflags & P_IS_ALIVE)
2097     {
2098 root 1.84 for (tmp = ms.bot; tmp; tmp = tmp->above)
2099 root 1.270 if ((tmp->flag [FLAG_MONSTER] || tmp->is_player ())
2100 root 1.155 && (tmp != exclude || (tmp->head_ () != tmp && tmp->head_ () != exclude)))
2101 root 1.75 break;
2102    
2103 root 1.24 if (tmp)
2104 root 1.75 return freedir[i];
2105 root 1.8 }
2106     }
2107 elmex 1.1 }
2108 root 1.75
2109 root 1.24 return 0;
2110 elmex 1.1 }
2111    
2112     /*
2113     * distance(object 1, object 2) will return the square of the
2114     * distance between the two given objects.
2115     */
2116 root 1.24 int
2117     distance (const object *ob1, const object *ob2)
2118     {
2119 root 1.82 return (ob1->x - ob2->x) * (ob1->x - ob2->x) + (ob1->y - ob2->y) * (ob1->y - ob2->y);
2120 elmex 1.1 }
2121    
2122     /*
2123     * find_dir_2(delta-x,delta-y) will return a direction in which
2124     * an object which has subtracted the x and y coordinates of another
2125     * object, needs to travel toward it.
2126     */
2127 root 1.24 int
2128     find_dir_2 (int x, int y)
2129     {
2130 root 1.75 int q;
2131 elmex 1.1
2132 root 1.24 if (y)
2133     q = x * 100 / y;
2134 elmex 1.1 else if (x)
2135 root 1.24 q = -300 * x;
2136 elmex 1.1 else
2137     return 0;
2138    
2139 root 1.24 if (y > 0)
2140     {
2141     if (q < -242)
2142     return 3;
2143     if (q < -41)
2144     return 2;
2145     if (q < 41)
2146     return 1;
2147     if (q < 242)
2148     return 8;
2149     return 7;
2150     }
2151 elmex 1.1
2152     if (q < -242)
2153 root 1.24 return 7;
2154 elmex 1.1 if (q < -41)
2155 root 1.24 return 6;
2156 elmex 1.1 if (q < 41)
2157 root 1.24 return 5;
2158 elmex 1.1 if (q < 242)
2159 root 1.24 return 4;
2160 elmex 1.1
2161 root 1.24 return 3;
2162 elmex 1.1 }
2163    
2164     /*
2165     * dirdiff(dir1, dir2) returns how many 45-degrees differences there is
2166     * between two directions (which are expected to be absolute (see absdir())
2167     */
2168 root 1.24 int
2169     dirdiff (int dir1, int dir2)
2170     {
2171 root 1.82 int d;
2172 root 1.24
2173     d = abs (dir1 - dir2);
2174     if (d > 4)
2175 elmex 1.1 d = 8 - d;
2176 root 1.82
2177 elmex 1.1 return d;
2178     }
2179    
2180     /* peterm:
2181     * do LOS stuff for ball lightning. Go after the closest VISIBLE monster.
2182     * Basically, this is a table of directions, and what directions
2183     * one could go to go back to us. Eg, entry 15 below is 4, 14, 16.
2184     * This basically means that if direction is 15, then it could either go
2185     * direction 4, 14, or 16 to get back to where we are.
2186     * Moved from spell_util.c to object.c with the other related direction
2187     * functions.
2188     */
2189 root 1.82 int reduction_dir[SIZEOFFREE][3] = {
2190 root 1.24 {0, 0, 0}, /* 0 */
2191     {0, 0, 0}, /* 1 */
2192     {0, 0, 0}, /* 2 */
2193     {0, 0, 0}, /* 3 */
2194     {0, 0, 0}, /* 4 */
2195     {0, 0, 0}, /* 5 */
2196     {0, 0, 0}, /* 6 */
2197     {0, 0, 0}, /* 7 */
2198     {0, 0, 0}, /* 8 */
2199     {8, 1, 2}, /* 9 */
2200     {1, 2, -1}, /* 10 */
2201     {2, 10, 12}, /* 11 */
2202     {2, 3, -1}, /* 12 */
2203     {2, 3, 4}, /* 13 */
2204     {3, 4, -1}, /* 14 */
2205     {4, 14, 16}, /* 15 */
2206     {5, 4, -1}, /* 16 */
2207     {4, 5, 6}, /* 17 */
2208     {6, 5, -1}, /* 18 */
2209     {6, 20, 18}, /* 19 */
2210     {7, 6, -1}, /* 20 */
2211     {6, 7, 8}, /* 21 */
2212     {7, 8, -1}, /* 22 */
2213     {8, 22, 24}, /* 23 */
2214     {8, 1, -1}, /* 24 */
2215     {24, 9, 10}, /* 25 */
2216     {9, 10, -1}, /* 26 */
2217     {10, 11, -1}, /* 27 */
2218     {27, 11, 29}, /* 28 */
2219     {11, 12, -1}, /* 29 */
2220     {12, 13, -1}, /* 30 */
2221     {12, 13, 14}, /* 31 */
2222     {13, 14, -1}, /* 32 */
2223     {14, 15, -1}, /* 33 */
2224     {33, 15, 35}, /* 34 */
2225     {16, 15, -1}, /* 35 */
2226     {17, 16, -1}, /* 36 */
2227     {18, 17, 16}, /* 37 */
2228     {18, 17, -1}, /* 38 */
2229     {18, 19, -1}, /* 39 */
2230     {41, 19, 39}, /* 40 */
2231     {19, 20, -1}, /* 41 */
2232     {20, 21, -1}, /* 42 */
2233     {20, 21, 22}, /* 43 */
2234     {21, 22, -1}, /* 44 */
2235     {23, 22, -1}, /* 45 */
2236     {45, 47, 23}, /* 46 */
2237     {23, 24, -1}, /* 47 */
2238     {24, 9, -1}
2239     }; /* 48 */
2240 elmex 1.1
2241     /* Recursive routine to step back and see if we can
2242     * find a path to that monster that we found. If not,
2243     * we don't bother going toward it. Returns 1 if we
2244     * can see a direct way to get it
2245     * Modified to be map tile aware -.MSW
2246     */
2247 root 1.24 int
2248 root 1.49 can_see_monsterP (maptile *m, int x, int y, int dir)
2249 root 1.24 {
2250 root 1.29 sint16 dx, dy;
2251 root 1.75 int mflags;
2252 root 1.24
2253     if (dir < 0)
2254     return 0; /* exit condition: invalid direction */
2255    
2256     dx = x + freearr_x[dir];
2257     dy = y + freearr_y[dir];
2258    
2259     mflags = get_map_flags (m, &m, dx, dy, &dx, &dy);
2260    
2261     /* This functional arguably was incorrect before - it was
2262     * checking for P_WALL - that was basically seeing if
2263     * we could move to the monster - this is being more
2264     * literal on if we can see it. To know if we can actually
2265     * move to the monster, we'd need the monster passed in or
2266     * at least its move type.
2267     */
2268     if (mflags & (P_OUT_OF_MAP | P_BLOCKSVIEW))
2269     return 0;
2270    
2271     /* yes, can see. */
2272     if (dir < 9)
2273     return 1;
2274 root 1.75
2275     return can_see_monsterP (m, x, y, reduction_dir[dir][0])
2276     | can_see_monsterP (m, x, y, reduction_dir[dir][1])
2277     | can_see_monsterP (m, x, y, reduction_dir[dir][2]);
2278 root 1.24 }
2279    
2280 elmex 1.1 /*
2281     * can_pick(picker, item): finds out if an object is possible to be
2282     * picked up by the picker. Returnes 1 if it can be
2283     * picked up, otherwise 0.
2284     *
2285     * Cf 0.91.3 - don't let WIZ's pick up anything - will likely cause
2286     * core dumps if they do.
2287     *
2288     * Add a check so we can't pick up invisible objects (0.93.8)
2289     */
2290 root 1.24 int
2291     can_pick (const object *who, const object *item)
2292     {
2293     return /*QUERY_FLAG(who,FLAG_WIZ)|| */
2294     (item->weight > 0 && !QUERY_FLAG (item, FLAG_NO_PICK) &&
2295 root 1.270 !QUERY_FLAG (item, FLAG_ALIVE) && !item->invisible && (who->is_player () || item->weight < who->weight / 3));
2296 elmex 1.1 }
2297    
2298     /*
2299     * create clone from object to another
2300     */
2301 root 1.24 object *
2302 root 1.230 object::deep_clone ()
2303 root 1.24 {
2304 root 1.230 assert (("deep_clone called on non-head object", is_head ()));
2305 elmex 1.1
2306 root 1.230 object *dst = clone ();
2307 root 1.24
2308 root 1.230 object *prev = dst;
2309     for (object *part = this->more; part; part = part->more)
2310 root 1.24 {
2311 root 1.224 object *tmp = part->clone ();
2312 root 1.230 tmp->head = dst;
2313     prev->more = tmp;
2314 root 1.24 prev = tmp;
2315 elmex 1.1 }
2316 root 1.24
2317 root 1.230 for (object *item = inv; item; item = item->below)
2318     insert_ob_in_ob (item->deep_clone (), dst);
2319 elmex 1.1
2320 root 1.24 return dst;
2321 elmex 1.1 }
2322    
2323     /* This returns the first object in who's inventory that
2324     * has the same type and subtype match.
2325     * returns NULL if no match.
2326     */
2327 root 1.24 object *
2328     find_obj_by_type_subtype (const object *who, int type, int subtype)
2329 elmex 1.1 {
2330 root 1.82 for (object *tmp = who->inv; tmp; tmp = tmp->below)
2331 root 1.24 if (tmp->type == type && tmp->subtype == subtype)
2332     return tmp;
2333 elmex 1.1
2334 root 1.82 return 0;
2335 elmex 1.1 }
2336    
2337 root 1.228 const shstr &
2338     object::kv_get (const shstr &key) const
2339 root 1.24 {
2340 root 1.228 for (key_value *kv = key_values; kv; kv = kv->next)
2341     if (kv->key == key)
2342     return kv->value;
2343 root 1.24
2344 root 1.228 return shstr_null;
2345 root 1.24 }
2346 elmex 1.1
2347 root 1.228 void
2348     object::kv_set (const shstr &key, const shstr &value)
2349 root 1.24 {
2350 root 1.228 for (key_value *kv = key_values; kv; kv = kv->next)
2351     if (kv->key == key)
2352     {
2353     kv->value = value;
2354     return;
2355     }
2356 root 1.24
2357 root 1.228 key_value *kv = new key_value;
2358 elmex 1.1
2359 root 1.228 kv->next = key_values;
2360     kv->key = key;
2361     kv->value = value;
2362 root 1.35
2363 root 1.228 key_values = kv;
2364 elmex 1.1 }
2365    
2366 root 1.228 void
2367     object::kv_del (const shstr &key)
2368 root 1.24 {
2369 root 1.228 for (key_value **kvp = &key_values; *kvp; kvp = &(*kvp)->next)
2370     if ((*kvp)->key == key)
2371     {
2372     key_value *kv = *kvp;
2373     *kvp = (*kvp)->next;
2374     delete kv;
2375     return;
2376     }
2377 elmex 1.1 }
2378 root 1.31
2379 root 1.34 object::depth_iterator::depth_iterator (object *container)
2380     : iterator_base (container)
2381     {
2382     while (item->inv)
2383     item = item->inv;
2384     }
2385    
2386 root 1.31 void
2387 root 1.34 object::depth_iterator::next ()
2388 root 1.31 {
2389 root 1.34 if (item->below)
2390     {
2391     item = item->below;
2392    
2393     while (item->inv)
2394     item = item->inv;
2395     }
2396 root 1.31 else
2397 root 1.34 item = item->env;
2398 root 1.31 }
2399 root 1.34
2400 elmex 1.97 const char *
2401     object::flag_desc (char *desc, int len) const
2402     {
2403     char *p = desc;
2404     bool first = true;
2405    
2406 root 1.101 *p = 0;
2407    
2408 elmex 1.97 for (int i = 0; i < NUM_FLAGS; i++)
2409     {
2410     if (len <= 10) // magic constant!
2411     {
2412     snprintf (p, len, ",...");
2413     break;
2414     }
2415    
2416 root 1.101 if (flag [i])
2417 elmex 1.97 {
2418     int cnt = snprintf (p, len, "%s%d", first ? "" : ",", i);
2419     len -= cnt;
2420     p += cnt;
2421     first = false;
2422     }
2423     }
2424    
2425     return desc;
2426     }
2427    
2428 root 1.101 // return a suitable string describing an object in enough detail to find it
2429 root 1.36 const char *
2430     object::debug_desc (char *info) const
2431     {
2432 elmex 1.97 char flagdesc[512];
2433     char info2[256 * 4];
2434 root 1.36 char *p = info;
2435    
2436 elmex 1.242 p += snprintf (p, 512, "{cnt:%d,uuid:%s,name:\"%s\"%s%s%s,flags:[%s],type:%d}",
2437 root 1.203 count,
2438     uuid.c_str (),
2439 root 1.36 &name,
2440 elmex 1.242 title ? ",title:\"" : "",
2441 elmex 1.97 title ? (const char *)title : "",
2442 elmex 1.242 title ? "\"" : "",
2443 elmex 1.97 flag_desc (flagdesc, 512), type);
2444 root 1.36
2445 root 1.217 if (!flag[FLAG_REMOVED] && env)
2446 root 1.36 p += snprintf (p, 256, "(in %s)", env->debug_desc (info2));
2447    
2448     if (map)
2449 root 1.96 p += snprintf (p, 256, "(on %s@%d+%d)", &map->path, x, y);
2450 root 1.36
2451     return info;
2452     }
2453    
2454     const char *
2455     object::debug_desc () const
2456     {
2457 root 1.143 static char info[3][256 * 4];
2458     static int info_idx;
2459 root 1.36
2460 root 1.143 return debug_desc (info [++info_idx % 3]);
2461 root 1.114 }
2462    
2463 root 1.125 struct region *
2464     object::region () const
2465     {
2466     return map ? map->region (x, y)
2467     : region::default_region ();
2468     }
2469    
2470 root 1.129 const materialtype_t *
2471     object::dominant_material () const
2472     {
2473 root 1.165 if (materialtype_t *mt = name_to_material (materialname))
2474     return mt;
2475 root 1.129
2476 root 1.165 return name_to_material (shstr_unknown);
2477 root 1.129 }
2478    
2479 root 1.130 void
2480     object::open_container (object *new_container)
2481     {
2482     if (container == new_container)
2483     return;
2484    
2485 root 1.220 object *old_container = container;
2486    
2487     if (old_container)
2488 root 1.130 {
2489     if (INVOKE_OBJECT (CLOSE, old_container, ARG_OBJECT (this)))
2490     return;
2491    
2492     #if 0
2493     // remove the "Close old_container" object.
2494     if (object *closer = old_container->inv)
2495     if (closer->type == CLOSE_CON)
2496 root 1.259 closer->destroy ();
2497 root 1.130 #endif
2498    
2499 root 1.220 // make sure the container is available
2500     esrv_send_item (this, old_container);
2501    
2502 root 1.216 old_container->flag [FLAG_APPLIED] = false;
2503 root 1.130 container = 0;
2504    
2505 root 1.220 // client needs item update to make it work, client bug requires this to be separate
2506 root 1.130 esrv_update_item (UPD_FLAGS, this, old_container);
2507 root 1.220
2508 root 1.130 new_draw_info_format (NDI_UNIQUE, 0, this, "You close %s.", query_name (old_container));
2509 root 1.177 play_sound (sound_find ("chest_close"));
2510 root 1.130 }
2511    
2512     if (new_container)
2513     {
2514     if (INVOKE_OBJECT (OPEN, new_container, ARG_OBJECT (this)))
2515     return;
2516    
2517     // TODO: this does not seem to serve any purpose anymore?
2518     #if 0
2519     // insert the "Close Container" object.
2520     if (archetype *closer = new_container->other_arch)
2521     {
2522     object *closer = arch_to_object (new_container->other_arch);
2523     closer->flag [FLAG_NO_MAP_SAVE] = 1;
2524     new_container->insert (closer);
2525     }
2526     #endif
2527    
2528 root 1.132 new_draw_info_format (NDI_UNIQUE, 0, this, "You open %s.", query_name (new_container));
2529    
2530 root 1.220 // make sure the container is available, client bug requires this to be separate
2531     esrv_send_item (this, new_container);
2532    
2533 root 1.216 new_container->flag [FLAG_APPLIED] = true;
2534 root 1.130 container = new_container;
2535    
2536 root 1.220 // client needs flag change
2537 root 1.130 esrv_update_item (UPD_FLAGS, this, new_container);
2538 root 1.131 esrv_send_inventory (this, new_container);
2539 root 1.177 play_sound (sound_find ("chest_open"));
2540 root 1.130 }
2541 root 1.220 // else if (!old_container->env && contr && contr->ns)
2542     // contr->ns->floorbox_reset ();
2543 root 1.130 }
2544    
2545 root 1.164 object *
2546     object::force_find (const shstr name)
2547     {
2548     /* cycle through his inventory to look for the MARK we want to
2549     * place
2550     */
2551     for (object *tmp = inv; tmp; tmp = tmp->below)
2552     if (tmp->type == FORCE && tmp->slaying == name)
2553     return splay (tmp);
2554    
2555     return 0;
2556     }
2557    
2558 root 1.265 object *
2559 root 1.164 object::force_add (const shstr name, int duration)
2560     {
2561     if (object *force = force_find (name))
2562 root 1.259 force->destroy ();
2563 root 1.164
2564     object *force = get_archetype (FORCE_NAME);
2565    
2566     force->slaying = name;
2567     force->stats.food = 1;
2568     force->speed_left = -1.f;
2569    
2570     force->set_speed (duration ? 1.f / duration : 0.f);
2571     force->flag [FLAG_IS_USED_UP] = true;
2572     force->flag [FLAG_APPLIED] = true;
2573    
2574 root 1.265 return insert (force);
2575 root 1.164 }
2576    
2577 root 1.178 void
2578 root 1.208 object::play_sound (faceidx sound)
2579 root 1.178 {
2580     if (!sound)
2581     return;
2582    
2583     if (flag [FLAG_REMOVED])
2584     return;
2585    
2586     if (env)
2587     {
2588     if (object *pl = in_player ())
2589     pl->contr->play_sound (sound);
2590     }
2591     else
2592     map->play_sound (sound, x, y);
2593     }
2594    
2595 root 1.265 void
2596     object::make_noise ()
2597     {
2598     // we do not model noise in the map, so instead put
2599     // a temporary light into the noise source
2600     // could use the map instead, but that's less reliable for our
2601     // goal, which is to make invisibility a bit harder to exploit
2602    
2603 root 1.266 // currently only works sensibly for players
2604     if (!is_player ())
2605     return;
2606    
2607 root 1.265 // find old force, or create new one
2608     object *force = force_find (shstr_noise_force);
2609    
2610     if (force)
2611 root 1.269 force->speed_left = -1.f; // patch old speed up
2612 root 1.265 else
2613 root 1.269 {
2614     force = archetype::get (shstr_noise_force);
2615    
2616     force->slaying = shstr_noise_force;
2617     force->stats.food = 1;
2618     force->speed_left = -1.f;
2619    
2620     force->set_speed (1.f / 4.f);
2621     force->flag [FLAG_IS_USED_UP] = true;
2622     force->flag [FLAG_APPLIED] = true;
2623    
2624     insert (force);
2625     }
2626 root 1.265 }
2627