… | |
… | |
246 | |
246 | |
247 | next = obl->next; |
247 | next = obl->next; |
248 | if (get_owner (ob) == owner) |
248 | if (get_owner (ob) == owner) |
249 | { |
249 | { |
250 | if (!QUERY_FLAG (ob, FLAG_REMOVED)) |
250 | if (!QUERY_FLAG (ob, FLAG_REMOVED)) |
251 | remove_ob (ob); |
251 | ob->remove (); |
252 | remove_friendly_object (ob); |
252 | remove_friendly_object (ob); |
253 | free_object (ob); |
253 | ob->destroy (0); |
254 | } |
254 | } |
255 | } |
255 | } |
256 | } |
256 | } |
257 | |
257 | |
258 | /* |
258 | /* |
… | |
… | |
287 | { |
287 | { |
288 | object *tmp; |
288 | object *tmp; |
289 | int dir; |
289 | int dir; |
290 | |
290 | |
291 | if (!QUERY_FLAG (ob, FLAG_REMOVED)) |
291 | if (!QUERY_FLAG (ob, FLAG_REMOVED)) |
292 | remove_ob (ob); |
292 | ob->remove (); |
293 | |
293 | |
294 | if (owner->map == NULL) |
294 | if (owner->map == NULL) |
295 | { |
295 | { |
296 | LOG (llevError, "Can't follow owner (%d): no map.\n", &owner->name); |
296 | LOG (llevError, "Can't follow owner (%d): no map.\n", &owner->name); |
297 | goto fail; |
297 | goto fail; |
… | |
… | |
325 | |
325 | |
326 | return 0; |
326 | return 0; |
327 | |
327 | |
328 | fail: |
328 | fail: |
329 | remove_friendly_object (ob); |
329 | remove_friendly_object (ob); |
330 | free_object (ob); |
330 | ob->destroy (0); |
331 | |
331 | |
332 | return 1; |
332 | return 1; |
333 | } |
333 | } |
334 | |
334 | |
335 | void |
335 | void |
… | |
… | |
341 | maptile *m; |
341 | maptile *m; |
342 | |
342 | |
343 | /* Check to see if player pulled out */ |
343 | /* Check to see if player pulled out */ |
344 | if ((owner = get_owner (ob)) == NULL) |
344 | if ((owner = get_owner (ob)) == NULL) |
345 | { |
345 | { |
346 | remove_ob (ob); /* Will be freed when returning */ |
346 | ob->remove (); /* Will be freed when returning */ |
347 | remove_friendly_object (ob); |
347 | remove_friendly_object (ob); |
348 | free_object (ob); |
348 | ob->destroy (0); |
349 | LOG (llevMonster, "Pet: no owner, leaving.\n"); |
349 | LOG (llevMonster, "Pet: no owner, leaving.\n"); |
350 | return; |
350 | return; |
351 | } |
351 | } |
352 | |
352 | |
353 | /* move monster into the owners map if not in the same map */ |
353 | /* move monster into the owners map if not in the same map */ |
… | |
… | |
544 | return; /* Has already been moved */ |
544 | return; /* Has already been moved */ |
545 | |
545 | |
546 | if (get_owner (op) == NULL) |
546 | if (get_owner (op) == NULL) |
547 | { |
547 | { |
548 | LOG (llevDebug, "Golem without owner destructed.\n"); |
548 | LOG (llevDebug, "Golem without owner destructed.\n"); |
549 | remove_ob (op); |
549 | op->remove (); |
550 | free_object (op); |
550 | op->destroy (0); |
551 | return; |
551 | return; |
552 | } |
552 | } |
553 | |
553 | |
554 | /* It would be nice to have a cleaner way of what message to print |
554 | /* It would be nice to have a cleaner way of what message to print |
555 | * when the golem expires than these hard coded entries. |
555 | * when the golem expires than these hard coded entries. |
… | |
… | |
561 | if (op->msg) |
561 | if (op->msg) |
562 | new_draw_info (NDI_UNIQUE, 0, op->owner, op->msg); |
562 | new_draw_info (NDI_UNIQUE, 0, op->owner, op->msg); |
563 | |
563 | |
564 | op->owner->contr->ranges[range_golem] = 0; |
564 | op->owner->contr->ranges[range_golem] = 0; |
565 | remove_friendly_object (op); |
565 | remove_friendly_object (op); |
566 | remove_ob (op); |
566 | op->remove (); |
567 | free_object (op); |
567 | op->destroy (0); |
568 | return; |
568 | return; |
569 | } |
569 | } |
570 | |
570 | |
571 | /* Do golem attacks/movement for single & multisq golems. |
571 | /* Do golem attacks/movement for single & multisq golems. |
572 | * Assuming here that op is the 'head' object. Pass only op to |
572 | * Assuming here that op is the 'head' object. Pass only op to |
… | |
… | |
659 | * 'lose' their old golem. |
659 | * 'lose' their old golem. |
660 | */ |
660 | */ |
661 | if (op->type == PLAYER && op->contr->ranges[range_golem]) |
661 | if (op->type == PLAYER && op->contr->ranges[range_golem]) |
662 | { |
662 | { |
663 | new_draw_info (NDI_UNIQUE, 0, op, "You dismiss your existing golem."); |
663 | new_draw_info (NDI_UNIQUE, 0, op, "You dismiss your existing golem."); |
664 | remove_ob (op->contr->ranges[range_golem]); |
664 | op->contr->ranges[range_golem]->remove (); |
665 | free_object (op->contr->ranges[range_golem]); |
665 | op->contr->ranges[range_golem]->destroy (0); |
666 | op->contr->ranges[range_golem] = 0; |
666 | op->contr->ranges[range_golem] = 0; |
667 | } |
667 | } |
668 | |
668 | |
669 | if (spob->other_arch) |
669 | if (spob->other_arch) |
670 | at = spob->other_arch; |
670 | at = spob->other_arch; |