添加毒圈新逻辑

This commit is contained in:
aozhiwei 2021-10-21 14:33:43 +08:00
parent 2d78f7599b
commit 4e8430117f
6 changed files with 58 additions and 4 deletions

View File

@ -38,6 +38,13 @@ namespace MetaData
airdrops.push_back(a8::XValue(str).GetInt());
}
}
{
std::vector<std::string> strings;
a8::Split(i->safearea(), strings, '|');
for (auto& str : strings) {
safearea_list.push_back(a8::XValue(str).GetInt());
}
}
{
std::vector<std::string> strings;
a8::Split(i->airraids(), strings, '|');
@ -114,6 +121,7 @@ namespace MetaData
void Map::Init2()
{
#if 0
std::vector<MetaData::SafeAreaPos*>* pos_list = MetaMgr::Instance()->GetSafeAreaPosList(i->safearea());
MetaData::SafeArea* area_meta = MetaMgr::Instance()->GetSafeArea(i->safearea());
if (area_meta && pos_list) {
@ -148,6 +156,17 @@ namespace MetaData
}//end for i
}
}
#endif
{
if (safearea_list.empty()) {
abort();
}
for (int area_type : safearea_list) {
if (!MetaMgr::Instance()->GetSafeAreaByType(area_type)) {
abort();
}
}
}
}
std::string Map::RandTemplate()
@ -176,6 +195,14 @@ namespace MetaData
return center;
}
int Map::RandSafeArea() const
{
if (safearea_list.empty()) {
abort();
}
return safearea_list[rand() % safearea_list.size()];
}
void MapThing::Init()
{
{

View File

@ -31,12 +31,14 @@ namespace MetaData
std::vector<int> buff_list;
a8::Vec2 first_safearea_center;
std::map<int, int> car_num_limit;
std::vector<int> safearea_list;
void Init();
void Init2();
std::string RandTemplate();
int GetCarLimit(int car_id);
a8::Vec2 GetCenter() const;
int RandSafeArea() const;
};
struct Attr

View File

@ -197,6 +197,7 @@ public:
std::map<int, MetaData::AirDrop*> airdrop_hash;
std::map<int, MetaData::AirRaid*> airraid_hash;
std::map<int, MetaData::SafeArea*> safearea_hash;
std::map<int, MetaData::SafeArea*> safearea_type_hash;
std::map<int, std::vector<MetaData::SafeAreaPos*>> safearea_pos_hash;
std::map<int, MetaData::Item*> item_hash;
std::map<int, MetaData::Equip*> equip_hash;
@ -692,6 +693,9 @@ private:
meta.set_shrink_speed(500);
}
safearea_hash[item.i->id()] = &item;
if (safearea_type_hash.find(item.i->type()) == safearea_type_hash.end()) {
safearea_type_hash[item.i->type()] = &item;
}
}
for (auto& meta : safearea_pos_meta_list) {
@ -1010,6 +1014,12 @@ MetaData::SafeArea* MetaMgr::GetSafeArea(int area_id)
return itr != loader_->safearea_hash.end() ? itr->second : nullptr;
}
MetaData::SafeArea* MetaMgr::GetSafeAreaByType(int area_type)
{
auto itr = loader_->safearea_type_hash.find(area_type);
return itr != loader_->safearea_type_hash.end() ? itr->second : nullptr;
}
MetaData::SafeAreaPos* MetaMgr::RandSafeAreaPos(int area_id)
{
std::vector<MetaData::SafeAreaPos*>* pos_list = GetSafeAreaPosList(area_id);

View File

@ -33,6 +33,7 @@ class MetaMgr : public a8::Singleton<MetaMgr>
MetaData::Building* GetBuilding(int building_id);
MetaData::Drop* GetDrop(int drop_id);
MetaData::SafeArea* GetSafeArea(int area_id);
MetaData::SafeArea* GetSafeAreaByType(int area_type);
MetaData::SafeAreaPos* RandSafeAreaPos(int area_id);
std::vector<MetaData::SafeAreaPos*>* GetSafeAreaPosList(int area_id);
std::vector<MetaData::MapTplThing>* GetMapTplThing(const std::string& map_name);

View File

@ -1348,13 +1348,19 @@ void Room::UpdateGasJump()
}
return true;
});
MetaData::SafeArea* first_safearea = MetaMgr::Instance()->GetSafeAreaByType
(map_meta_->RandSafeArea());
gas_data_.gas_mode = GasWaiting;
gas_data_.old_area_meta = MetaMgr::Instance()->GetSafeArea(map_meta_->i->safearea());
gas_data_.new_area_meta = MetaMgr::Instance()->GetSafeArea(map_meta_->i->safearea() + 1);
gas_data_.pos_list = MetaMgr::Instance()->RandSafeAreaPos(map_meta_->i->safearea());
gas_data_.old_area_meta = first_safearea;
gas_data_.new_area_meta = MetaMgr::Instance()->GetSafeArea(first_safearea->i->id() + 1);
gas_data_.pos_list = MetaMgr::Instance()->RandSafeAreaPos(first_safearea->i->id());
gas_data_.gas_progress = gas_data_.old_area_meta->i->rad();
gas_data_.gas_start_frameno = GetFrameNo();
#if 1
gas_data_.pos_old = a8::Vec2(first_safearea->i->x1(), first_safearea->i->y1());
#else
gas_data_.pos_old = map_meta_->first_safearea_center;
#endif
gas_data_.pos_old_bk = gas_data_.pos_old;
{
if (gas_data_.pos_list && !gas_data_.pos_list->poses.empty()) {
@ -1390,6 +1396,10 @@ bool Room::GenSmallCircle()
if (gas_data_.pos_list && gas_data_.gas_count + 1 < gas_data_.pos_list->poses.size()) {
gas_data_.pos_new = gas_data_.pos_list->poses[gas_data_.gas_count + 1];
} else {
#if 1
gas_data_.pos_new = a8::Vec2(gas_data_.new_area_meta->i->x1(),
gas_data_.new_area_meta->i->y1());
#else
a8::Vec2 dir = a8::Vec2::UP;
dir.Rotate(a8::RandAngle());
float rad = rand() % (int)(gas_data_.old_area_meta->i->rad() -
@ -1398,6 +1408,7 @@ bool Room::GenSmallCircle()
rad = 0.001f;
}
gas_data_.pos_new = gas_data_.pos_old + dir * rad;
#endif
}
return true;
}

View File

@ -31,7 +31,7 @@ message Map
optional int32 player = 8;
optional string refresh_robot = 9;
optional int32 map_mode = 10;
optional int32 safearea = 11;
optional string safearea = 11;
optional string game_start_buff_list = 12;
optional string map_pic = 13;
optional string first_safearea_center = 14;
@ -85,6 +85,9 @@ message SafeArea
optional int32 wait_time = 4; //
optional int32 shrink_speed = 5; //
optional int32 hurt = 6; ///
optional int32 type = 7;
optional int32 x1 = 8;
optional int32 y1 = 9;
}
message SafeAreaPos