#include "precompile.h" #include "gridcell.h" #include "bullet.h" #include "entity.h" #include "human.h" #include "room.h" GridCell::GridCell() { human_list_.reserve(MAX_ROOM_IDX); entity_list_.reserve(MAX_ROOM_IDX); bullet_list_.reserve(MAX_ROOM_IDX); for (int i = 0; i < MAX_ROOM_IDX; ++i) { human_list_.push_back(std::set()); entity_list_.push_back(std::set()); bullet_list_.push_back(std::set()); } } void GridCell::ClearRoomData(Room* room) { human_list_[room->GetRoomIdx()].clear(); entity_list_[room->GetRoomIdx()].clear(); bullet_list_[room->GetRoomIdx()].clear(); } void GridCell::AddHuman(Human* hum) { human_list_[hum->room->GetRoomIdx()].insert(hum); } void GridCell::RemoveHuman(Human* hum) { human_list_[hum->room->GetRoomIdx()].erase(hum); } bool GridCell::ExistsHuman(Human* hum) { return human_list_[hum->room->GetRoomIdx()].find(hum) != human_list_[hum->room->GetRoomIdx()].end(); } void GridCell::TouchHumanList(std::function& func, int room_idx, bool& stop) { for (Human* hum : human_list_[room_idx]) { func(hum, stop); if (stop) { return; } } } void GridCell::TouchHumanListEx(std::function func, int room_idx, bool& stop) { TouchHumanList(func, room_idx, stop); } void GridCell::AddBullet(Bullet* bullet) { bullet_list_[bullet->room->GetRoomIdx()].insert(bullet); } void GridCell::RemoveBullet(Bullet* bullet) { bullet_list_[bullet->room->GetRoomIdx()].erase(bullet); } void GridCell::AddPermanentEntity(Entity* entity) { entity_list_[0].insert(entity); } void GridCell::AddRoomEntity(Room* room, Entity* entity) { entity_list_[room->GetRoomIdx()].insert(entity); } void GridCell::RemoveRoomEntity(Room* room, Entity* entity) { entity_list_[room->GetRoomIdx()].erase(entity); } bool GridCell::ExistsEntity(Room* room, Entity* entity) { if (entity_list_[0].find(entity) != entity_list_[0].end()) { return true; } return entity_list_[room->GetRoomIdx()].find(entity) != entity_list_[room->GetRoomIdx()].end(); } void GridCell::TouchLayer0EntityList(std::function& func, bool& stop) { for (Entity* entity : entity_list_[0]) { func(entity, stop); if (stop) { return; } } } void GridCell::TouchLayer1EntityList(std::function& func, int room_idx, bool& stop) { for (Entity* entity : entity_list_[room_idx]) { func(entity, stop); if (stop) { return; } } } void GridCell::TouchAllLayerEntityList(std::function& func, int room_idx, bool& stop) { TouchLayer0EntityList(func, stop); if (!stop) { TouchLayer1EntityList(func, room_idx, stop); } }