/** * @brief Returns the entity with the specified type and name, or NULL if it doesn't exist. * @param type type of entity * @param name name of the entity to get * @return the entity requested, or NULL if there is no entity with the specified type and name */ MapEntity* MapEntities::find_entity(EntityType type, const std::string &name) { list<MapEntity*>::iterator i; for (i = all_entities.begin(); i != all_entities.end(); i++) { MapEntity *entity = *i; if (entity->get_type() == type && entity->get_name() == name && !entity->is_being_removed()) { return entity; } } return NULL; }
/** * \brief Removes and destroys the entities placed in the entities_to_remove list. */ void MapEntities::remove_marked_entities() { list<MapEntity*>::iterator it; // remove the marked entities for (it = entities_to_remove.begin(); it != entities_to_remove.end(); it++) { MapEntity* entity = *it; Layer layer = entity->get_layer(); // remove it from the obstacle entities list if present if (entity->can_be_obstacle()) { if (entity->has_layer_independent_collisions()) { for (int i = 0; i < LAYER_NB; i++) { obstacle_entities[i].remove(entity); } } else { obstacle_entities[layer].remove(entity); } } // remove it from the detectors list if present if (entity->is_detector()) { detectors.remove(static_cast<Detector*>(entity)); } // remove it from the ground obsevers list if present if (entity->is_ground_observer()) { ground_observers[layer].remove(entity); } // remove it from the ground modifiers list if present if (entity->is_ground_modifier()) { ground_modifiers[layer].remove(entity); } // remove it from the sprite entities list if present if (entity->is_drawn_in_y_order()) { entities_drawn_y_order[layer].remove(entity); } else if (entity->can_be_drawn()) { entities_drawn_first[layer].remove(entity); } // remove it from the whole list all_entities.remove(entity); const std::string& name = entity->get_name(); if (!name.empty()) { named_entities.erase(name); } // update the specific entities lists switch (entity->get_type()) { case STAIRS: stairs[layer].remove(static_cast<Stairs*>(entity)); break; case CRYSTAL_BLOCK: crystal_blocks[layer].remove(static_cast<CrystalBlock*>(entity)); break; case SEPARATOR: separators.remove(static_cast<Separator*>(entity)); break; case BOOMERANG: this->boomerang = NULL; break; default: break; } // destroy it destroy_entity(entity); } entities_to_remove.clear(); }