This commit is contained in:
aozhiwei 2021-08-23 09:30:48 +00:00
parent d2bdd8fddb
commit 3b9b07605e
7 changed files with 154 additions and 9 deletions

View File

@ -112,6 +112,44 @@ namespace MetaData
}
}
void Map::Init2()
{
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) {
std::vector<MetaData::SafeArea*> area_list;
MetaData::SafeArea* cur_area_meta = area_meta;
while (cur_area_meta) {
area_list.push_back(cur_area_meta);
cur_area_meta = MetaMgr::Instance()->GetSafeArea(cur_area_meta->i->id() + 1);
}
for (MetaData::SafeAreaPos* pos_meta : *pos_list) {
if (area_list.size() != pos_meta->poses.size()) {
abort();
}
for (size_t j = 0; j < area_list.size(); ++j) {
a8::Vec2 pos = pos_meta->poses[j];
if (pos.x < 0 || pos.y < 0) {
abort();
}
if (pos.x > i->map_width() || pos.y > i->map_height()) {
abort();
}
if (j > 0) {
a8::Vec2 pre_pos = pos_meta->poses[j - 1];
MetaData::SafeArea* pre_area_meta = area_list[j - 1];
float distance = pos.Distance(pre_pos);
if (distance + area_meta->i->rad() < pre_area_meta->i->rad()) {
} else {
abort();
}
}
}//end for i
}
}
}
std::string Map::RandTemplate()
{
if (rand_space <= 0) {
@ -1253,4 +1291,32 @@ namespace MetaData
);
}
void SafeAreaPos::Init()
{
std::vector<a8::Vec2> tmp_list;
{
tmp_list.push_back(a8::Vec2(i->x1(), i->y1()));
tmp_list.push_back(a8::Vec2(i->x2(), i->y2()));
tmp_list.push_back(a8::Vec2(i->x3(), i->y3()));
tmp_list.push_back(a8::Vec2(i->x4(), i->y4()));
tmp_list.push_back(a8::Vec2(i->x5(), i->y5()));
tmp_list.push_back(a8::Vec2(i->x6(), i->y6()));
tmp_list.push_back(a8::Vec2(i->x7(), i->y7()));
tmp_list.push_back(a8::Vec2(i->x8(), i->y8()));
tmp_list.push_back(a8::Vec2(i->x9(), i->y9()));
tmp_list.push_back(a8::Vec2(i->x10(), i->y10()));
}
for (auto& pos : tmp_list) {
if (pos.x < 1.0f || pos.y < 1.0f) {
break;
}
poses.push_back(pos);
}
}
void SafeAreaPos::Init2()
{
}
}

View File

@ -33,6 +33,7 @@ namespace MetaData
std::map<int, int> car_num_limit;
void Init();
void Init2();
std::string RandTemplate();
int GetCarLimit(int car_id);
};
@ -64,6 +65,15 @@ namespace MetaData
const metatable::SafeArea* i = nullptr;
};
struct SafeAreaPos
{
const metatable::SafeAreaPos* i = nullptr;
std::vector<a8::Vec2> poses;
void Init();
void Init2();
};
struct Item
{
const metatable::Item* i = nullptr;

View File

@ -27,6 +27,8 @@ public:
std::list<MetaData::Map> map_list;
std::list<metatable::SafeArea> safearea_meta_list;
std::list<MetaData::SafeArea> safearea_list;
std::list<metatable::SafeAreaPos> safearea_pos_meta_list;
std::list<MetaData::SafeAreaPos> safearea_pos_list;
std::list<metatable::Item> item_meta_list;
std::list<MetaData::Item> item_list;
std::list<metatable::Equip> equip_meta_list;
@ -75,6 +77,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, std::vector<MetaData::SafeAreaPos*>> safearea_pos_hash;
std::map<int, MetaData::Item*> item_hash;
std::map<int, MetaData::Equip*> equip_hash;
std::map<int, MetaData::Equip*> equip_slot_hash;
@ -129,6 +132,7 @@ public:
f8::ReadCsvMetaFile(res_path + "parameter@parameter.csv", parameter_meta_list);
f8::ReadCsvMetaFile(res_path + "map@map.csv", map_meta_list);
f8::ReadCsvMetaFile(res_path + "safearea@safearea.csv", safearea_meta_list);
f8::ReadCsvMetaFile(res_path + "safearea_pos@safearea_pos.csv", safearea_pos_meta_list);
f8::ReadCsvMetaFile(res_path + "item@item.csv", item_meta_list);
f8::ReadCsvMetaFile(res_path + "buff@buff.csv", buff_meta_list);
f8::ReadCsvMetaFile(res_path + "equip@equip.csv", equip_meta_list);
@ -463,6 +467,9 @@ private:
for (auto& equip : equip_list) {
equip.Init2();
}
for (auto& map : map_list) {
map.Init2();
}
}
}
@ -546,6 +553,20 @@ private:
safearea_hash[item.i->id()] = &item;
}
for (auto& meta : safearea_pos_meta_list) {
MetaData::SafeAreaPos& item = a8::FastAppend(safearea_pos_list);
item.i = &meta;
item.Init();
{
auto itr = safearea_pos_hash.find(meta.id());
if (itr != safearea_pos_hash.end()) {
itr->second.push_back(&item);
} else {
safearea_pos_hash[meta.id()] = std::vector<MetaData::SafeAreaPos*>({&item});
}
}
}
for (auto& meta : buff_meta_list) {
if (!IsValidBuffEffect(meta.buff_effect())) {
abort();
@ -824,6 +845,18 @@ MetaData::SafeArea* MetaMgr::GetSafeArea(int area_id)
return itr != loader_->safearea_hash.end() ? itr->second : nullptr;
}
MetaData::SafeAreaPos* MetaMgr::RandSafeAreaPos(int area_id)
{
std::vector<MetaData::SafeAreaPos*>* pos_list = GetSafeAreaPosList(area_id);
return pos_list && !pos_list->empty() ? pos_list->at(rand() % pos_list->size()) : nullptr;
}
std::vector<MetaData::SafeAreaPos*>* MetaMgr::GetSafeAreaPosList(int area_id)
{
auto itr = loader_->safearea_pos_hash.find(area_id);
return itr != loader_->safearea_pos_hash.end() ? &itr->second : nullptr;
}
std::vector<MetaData::MapTplThing>* MetaMgr::GetMapTplThing(const std::string& map_name)
{
auto itr = loader_->maptpl_hash.find(map_name);

View File

@ -31,6 +31,8 @@ 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::SafeAreaPos* RandSafeAreaPos(int area_id);
std::vector<MetaData::SafeAreaPos*>* GetSafeAreaPosList(int area_id);
std::vector<MetaData::MapTplThing>* GetMapTplThing(const std::string& map_name);
metatable::TerrainJson* GetTerrainJson(int map_id);
std::list<metatable::MapLayerJson>* GetMapLayer(const std::string& map_name);

View File

@ -1381,11 +1381,16 @@ void Room::UpdateGasJump()
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_.gas_progress = gas_data_.old_area_meta->i->rad();
gas_data_.gas_start_frameno = GetFrameNo();
gas_data_.pos_old = map_meta_->first_safearea_center;
gas_data_.pos_old_bk = gas_data_.pos_old;
{
if (gas_data_.pos_list && !gas_data_.pos_list->poses.empty()) {
gas_data_.pos_old = gas_data_.pos_list->poses[0];
gas_data_.pos_old_bk = gas_data_.pos_old;
}
bool gen_ok = GenSmallCircle();
if (!gen_ok) {
abort();
@ -1412,16 +1417,18 @@ bool Room::GenSmallCircle()
if (gas_data_.new_area_meta->i->rad() >= gas_data_.old_area_meta->i->rad()) {
abort();
}
#if 1
a8::Vec2 dir = a8::Vec2::UP;
dir.Rotate(a8::RandAngle());
float rad = rand() % (int)(gas_data_.old_area_meta->i->rad() -
gas_data_.new_area_meta->i->rad());
if (rad <= 0.001f){
rad = 0.001f;
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 {
a8::Vec2 dir = a8::Vec2::UP;
dir.Rotate(a8::RandAngle());
float rad = rand() % (int)(gas_data_.old_area_meta->i->rad() -
gas_data_.new_area_meta->i->rad());
if (rad <= 0.001f){
rad = 0.001f;
}
gas_data_.pos_new = gas_data_.pos_old + dir * rad;
}
gas_data_.pos_new = gas_data_.pos_old + dir * rad;
#endif
return true;
}

View File

@ -4,6 +4,7 @@ namespace MetaData
{
struct Map;
struct SafeArea;
struct SafeAreaPos;
struct Equip;
struct EquipUpgrade;
struct MapTplThing;
@ -28,6 +29,7 @@ struct GasData
long long gas_start_frameno = 0;
MetaData::SafeArea* old_area_meta = nullptr;
MetaData::SafeArea* new_area_meta = nullptr;
MetaData::SafeAreaPos* pos_list = nullptr;
bool is_last_gas = false;
int gas_count = 0;
};

View File

@ -85,6 +85,31 @@ message SafeArea
optional int32 hurt = 6; ///
}
message SafeAreaPos
{
optional int32 id = 1;
optional int32 x1 = 2;
optional int32 y1 = 3;
optional int32 x2 = 4;
optional int32 y2 = 5;
optional int32 x3 = 6;
optional int32 y3 = 7;
optional int32 x4 = 8;
optional int32 y4 = 9;
optional int32 x5 = 10;
optional int32 y5 = 11;
optional int32 x6 = 12;
optional int32 y6 = 13;
optional int32 x7 = 14;
optional int32 y7 = 15;
optional int32 x8 = 16;
optional int32 y8 = 17;
optional int32 x9 = 18;
optional int32 y9 = 19;
optional int32 x10 = 20;
optional int32 y10 = 21;
}
message Item
{
optional int32 id = 1; //id