/** * Move a monster from index i1 to index i2 in the monster list. */ static void compact_monsters_aux(int i1, int i2) { int y, x; struct monster *mon; struct object *obj; /* Do nothing */ if (i1 == i2) return; /* Old monster */ mon = cave_monster(cave, i1); y = mon->fy; x = mon->fx; /* Update the cave */ cave->squares[y][x].mon = i2; /* Update midx */ mon->midx = i2; /* Repair objects being carried by monster */ for (obj = mon->held_obj; obj; obj = obj->next) obj->held_m_idx = i2; /* Move mimicked objects (heh) */ if (mon->mimicked_obj) mon->mimicked_obj->mimicking_m_idx = i2; /* Hack -- Update the target */ if (target_get_monster() == mon) target_set_monster(cave_monster(cave, i2)); /* Hack -- Update the health bar */ if (player->upkeep->health_who == mon) player->upkeep->health_who = cave_monster(cave, i2); /* Hack -- move monster */ memcpy(cave_monster(cave, i2), cave_monster(cave, i1), sizeof(struct monster)); /* Hack -- wipe hole */ memset(cave_monster(cave, i1), 0, sizeof(struct monster)); }
/** * Move a monster from index i1 to index i2 in the monster list. */ static void compact_monsters_aux(int i1, int i2) { int y, x; monster_type *m_ptr; s16b this_o_idx, next_o_idx = 0; /* Do nothing */ if (i1 == i2) return; /* Old monster */ m_ptr = cave_monster(cave, i1); y = m_ptr->fy; x = m_ptr->fx; /* Update the cave */ cave->m_idx[y][x] = i2; /* Update midx */ m_ptr->midx = i2; /* Repair objects being carried by monster */ for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Reset monster pointer */ o_ptr->held_m_idx = i2; } /* Move mimicked objects */ if (m_ptr->mimicked_o_idx > 0) { object_type *o_ptr; /* Get the object */ o_ptr = object_byid(m_ptr->mimicked_o_idx); /* Reset monster pointer */ o_ptr->mimicking_m_idx = i2; } /* Hack -- Update the target */ if (target_get_monster() == m_ptr) target_set_monster(cave_monster(cave, i2)); /* Hack -- Update the health bar */ if (p_ptr->health_who == m_ptr) p_ptr->health_who = cave_monster(cave, i2); /* Hack -- move monster */ COPY(cave_monster(cave, i2), cave_monster(cave, i1), struct monster); /* Hack -- wipe hole */ (void)WIPE(cave_monster(cave, i1), monster_type); }
/** * Deletes a monster by index. * * When a monster is deleted, all of its objects are deleted. */ void delete_monster_idx(int m_idx) { assert(m_idx > 0); struct monster *mon = cave_monster(cave, m_idx); int y = mon->fy; int x = mon->fx; assert(square_in_bounds(cave, y, x)); /* Hack -- Reduce the racial counter */ mon->race->cur_num--; /* Hack -- count the number of "reproducers" */ if (rf_has(mon->race->flags, RF_MULTIPLY)) num_repro--; /* Hack -- remove target monster */ if (target_get_monster() == mon) target_set_monster(NULL); /* Hack -- remove tracked monster */ if (player->upkeep->health_who == mon) health_track(player->upkeep, NULL); /* Monster is gone */ cave->squares[y][x].mon = 0; /* Delete objects */ struct object *obj = mon->held_obj; while (obj) { struct object *next = obj->next; /* Preserve unseen artifacts (we assume they were created as this * monster's drop) - this will cause unintended behaviour in preserve * off mode if monsters can pick up artifacts */ if (obj->artifact && !(obj->known && obj->known->artifact)) obj->artifact->created = false; /* Delete the object */ delist_object(cave, obj); object_delete(&obj); obj = next; } /* Delete mimicked objects */ if (mon->mimicked_obj) { square_excise_object(cave, y, x, mon->mimicked_obj); delist_object(cave, mon->mimicked_obj); object_delete(&mon->mimicked_obj); } /* Wipe the Monster */ memset(mon, 0, sizeof(struct monster)); /* Count monsters */ cave->mon_cnt--; /* Visual update */ square_light_spot(cave, y, x); }
/** * Deletes a monster by index. * * When a monster is deleted, all of its objects are deleted. */ void delete_monster_idx(int m_idx) { int x, y; s16b this_o_idx, next_o_idx = 0; monster_type *m_ptr; assert(m_idx > 0); m_ptr = cave_monster(cave, m_idx); /* Monster location */ y = m_ptr->fy; x = m_ptr->fx; /* Hack -- Reduce the racial counter */ m_ptr->race->cur_num--; /* Hack -- count the number of "reproducers" */ if (rf_has(m_ptr->race->flags, RF_MULTIPLY)) num_repro--; /* Hack -- remove target monster */ if (target_get_monster() == m_ptr) target_set_monster(NULL); /* Hack -- remove tracked monster */ if (p_ptr->health_who == m_ptr) health_track(p_ptr, NULL); /* Monster is gone */ cave->m_idx[y][x] = 0; /* Delete objects */ for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; /* Get the object */ o_ptr = object_byid(this_o_idx); /* Get the next object */ next_o_idx = o_ptr->next_o_idx; /* Preserve unseen artifacts (we assume they were created as this * monster's drop) - this will cause unintended behaviour in preserve * off mode if monsters can pick up artifacts */ if (o_ptr->artifact && !object_was_sensed(o_ptr)) o_ptr->artifact->created = FALSE; /* Clear held_m_idx now to avoid wasting time in delete_object_idx */ o_ptr->held_m_idx = 0; /* Delete the object */ delete_object_idx(this_o_idx); } /* Delete mimicked objects */ if (m_ptr->mimicked_o_idx > 0) delete_object_idx(m_ptr->mimicked_o_idx); /* Wipe the Monster */ (void)WIPE(m_ptr, monster_type); /* Count monsters */ cave->mon_cnt--; /* Visual update */ cave_light_spot(cave, y, x); }