#pragma once namespace MetaData { struct Map; struct MapTplThing; } class Entity; class Obstacle; class Building; class MapService; class GridService; class Room; class MapInstance { public: int map_id = 0; void Init(); void UnInit(); void AttachRoom(Room* room, RoomInitInfo& init_info); MetaData::Map* GetMapMeta() { return map_meta_; } private: void CreateThings(); void CreateMapObject(MetaData::MapTplThing& thing_tpl); void CreateBuilding(int thing_id, float building_x, float building_y); Obstacle* InternalCreateObstacle(int id, float x, float y, std::function on_precreate); Entity* GetEntityByUniId(int uniid); int AllocUniid(); private: int current_uniid_ = 0; std::map uniid_hash_; std::string map_tpl_name_; MetaData::Map* map_meta_ = nullptr; MapService* map_service_ = nullptr; GridService* grid_service_ = nullptr; std::vector mini_room_spawn_points_; std::vector normal_room_spawn_points_; MetaData::MapTplThing* level0room_born_point_ = nullptr; MetaData::MapTplThing* level1room_born_point_ = nullptr; std::vector loots_; std::vector buildings_; std::vector level0room_spec_things_; int building_num_ = 0; int obstacle_num_ = 0; int obstacle0_num_ = 0; int obstacle1_num_ = 0; int obstacle2_num_ = 0; };