添加游戏模式选择

This commit is contained in:
aozhiwei 2020-12-08 11:15:16 +08:00
parent 0dab2c3071
commit f7c5b46ed3
13 changed files with 118 additions and 46 deletions

View File

@ -22,6 +22,7 @@ class MapInstance
void UnInit(); void UnInit();
void AttachRoom(Room* room, RoomInitInfo& init_info); void AttachRoom(Room* room, RoomInitInfo& init_info);
MetaData::Map* GetMapMeta() { return map_meta_; }
private: private:
void CreateThings(); void CreateThings();

View File

@ -8,23 +8,30 @@
void MapMgr::Init() void MapMgr::Init()
{ {
{ std::list<MetaData::Map>* maps = MetaMgr::Instance()->GetMaps();
MapInstance* map_instance = new MapInstance(); if (maps) {
map_instance->map_id = 2001; for (auto& map_meta : *maps) {
map_instance->Init(); MapInstance* map_instance = new MapInstance();
instance_hash_[map_instance->map_id] = map_instance; map_instance->map_id = map_meta.i->map_id();
map_instance->Init();
instance_hash_[map_instance->map_id] = map_instance;
{
auto itr = mode_hash_.find(map_meta.i->map_mode());
if (itr != mode_hash_.end()) {
itr->second.push_back(map_instance);
} else {
mode_hash_[map_meta.i->map_mode()] = std::vector<MapInstance*>({map_instance});
}
}
}
} else {
abort();
} }
if (MetaMgr::Instance()->GetMap(3001)) { if (mode_hash_.find(kZombieMode) == mode_hash_.end()) {
MapInstance* map_instance = new MapInstance(); abort();
map_instance->map_id = 3001;
map_instance->Init();
instance_hash_[map_instance->map_id] = map_instance;
} }
if (MetaMgr::Instance()->GetMap(4001)) { if (mode_hash_.find(kChiJiMode) == mode_hash_.end()) {
MapInstance* map_instance = new MapInstance(); abort();
map_instance->map_id = 4001;
map_instance->Init();
instance_hash_[map_instance->map_id] = map_instance;
} }
} }
@ -39,19 +46,14 @@ void MapMgr::UnInit()
void MapMgr::AttachRoom(Room* room, RoomInitInfo& init_info) void MapMgr::AttachRoom(Room* room, RoomInitInfo& init_info)
{ {
MapInstance* map_instance = GetMapInstance(2001); MapInstance* map_instance = init_info.init_map_id == 0 ?
if (init_info.room_mode == kZombieMode) { RandMapInstance(init_info.room_mode) : GetMapInstance(init_info.init_map_id);
if (init_info.creator_channel == kWxChannelId && if (!map_instance) {
init_info.creator_proto_version == cs::ProtoVersion) { map_instance = RandMapInstance(init_info.room_mode);
map_instance = GetMapInstance(4001); } else if (map_instance->GetMapMeta()->i->map_mode() != init_info.room_mode) {
} else { map_instance = RandMapInstance(init_info.room_mode);
if (init_info.creator_proto_version == cs::ProtoVersion) {
map_instance = GetMapInstance(4001);
} else {
map_instance = GetMapInstance(3001);
}
}
} }
if (!map_instance) { if (!map_instance) {
abort(); abort();
} }
@ -63,3 +65,9 @@ MapInstance* MapMgr::GetMapInstance(int map_id)
auto itr = instance_hash_.find(map_id); auto itr = instance_hash_.find(map_id);
return itr != instance_hash_.end() ? itr->second : nullptr; return itr != instance_hash_.end() ? itr->second : nullptr;
} }
MapInstance* MapMgr::RandMapInstance(int map_mode)
{
auto itr = mode_hash_.find(map_mode);
return itr != mode_hash_.end() ? itr->second[rand() % itr->second.size()] : nullptr;
}

View File

@ -16,7 +16,9 @@ public:
private: private:
MapInstance* GetMapInstance(int map_id); MapInstance* GetMapInstance(int map_id);
MapInstance* RandMapInstance(int map_mode);
private: private:
std::map<int, MapInstance*> instance_hash_; std::map<int, MapInstance*> instance_hash_;
std::map<int, std::vector<MapInstance*>> mode_hash_;
}; };

View File

@ -38,6 +38,44 @@ namespace MetaData
airdrops.push_back(a8::XValue(str).GetInt()); airdrops.push_back(a8::XValue(str).GetInt());
} }
} }
{
std::vector<std::string> strings;
a8::Split(i->refresh_robot(), strings, '|');
if (strings.size() != 2) {
abort();
}
{
std::vector<std::string> strings2;
a8::Split(strings[0], strings2, '-');
if (strings2.size() != 2) {
abort();
}
refresh_robot_min_num = a8::XValue(strings2[0]);
refresh_robot_max_num = a8::XValue(strings2[1]);
}
{
std::vector<std::string> strings2;
a8::Split(strings[1], strings2, '-');
if (strings2.size() != 2) {
abort();
}
refresh_robot_min_time = a8::XValue(strings2[0]);
refresh_robot_max_time = a8::XValue(strings2[1]);
}
if (refresh_robot_min_num >= refresh_robot_max_num) {
abort();
}
if (refresh_robot_min_time >= refresh_robot_max_time) {
abort();
}
if (refresh_robot_min_num <= 0 || refresh_robot_max_num <= 0 ||
refresh_robot_min_time <= 0 || refresh_robot_max_time <= 0) {
abort();
}
}
if (i->player() < 20) {
abort();
}
} }
std::string Map::RandTemplate() std::string Map::RandTemplate()

View File

@ -23,6 +23,10 @@ namespace MetaData
std::vector<std::tuple<std::string, int>> template_list; std::vector<std::tuple<std::string, int>> template_list;
int rand_space = 0; int rand_space = 0;
std::vector<int> airdrops; std::vector<int> airdrops;
int refresh_robot_min_num = 0;
int refresh_robot_max_num = 0;
int refresh_robot_min_time = 0;
int refresh_robot_max_time = 0;
void Init(); void Init();
std::string RandTemplate(); std::string RandTemplate();

View File

@ -339,10 +339,12 @@ public:
METAMGR_READ(level1room_robot_autodie_distance, 500); METAMGR_READ(level1room_robot_autodie_distance, 500);
METAMGR_READ_STR(level1room_born_point, ""); METAMGR_READ_STR(level1room_born_point, "");
#if 0
METAMGR_READ(refresh_robot_min_num, 5); METAMGR_READ(refresh_robot_min_num, 5);
METAMGR_READ(refresh_robot_max_num, 10); METAMGR_READ(refresh_robot_max_num, 10);
METAMGR_READ(refresh_robot_min_time, 5); METAMGR_READ(refresh_robot_min_time, 5);
METAMGR_READ(refresh_robot_max_time, 10); METAMGR_READ(refresh_robot_max_time, 10);
#endif
} }
if (MetaMgr::Instance()->K < 0.01f) { if (MetaMgr::Instance()->K < 0.01f) {
abort(); abort();
@ -406,6 +408,7 @@ private:
} }
} }
#if 0
{ {
if (MetaMgr::Instance()->refresh_robot_min_num > if (MetaMgr::Instance()->refresh_robot_min_num >
MetaMgr::Instance()->refresh_robot_max_num) { MetaMgr::Instance()->refresh_robot_max_num) {
@ -416,6 +419,7 @@ private:
abort(); abort();
} }
} }
#endif
} }
void BindToMetaData() void BindToMetaData()
@ -667,6 +671,11 @@ MetaData::Map* MetaMgr::GetMap(int map_id)
return itr != loader_->gamemap_hash.end() ? itr->second : nullptr; return itr != loader_->gamemap_hash.end() ? itr->second : nullptr;
} }
std::list<MetaData::Map>* MetaMgr::GetMaps()
{
return &loader_->map_list;
}
MetaData::MapThing* MetaMgr::GetMapThing(int mapthing_id) MetaData::MapThing* MetaMgr::GetMapThing(int mapthing_id)
{ {
auto itr = loader_->mapthing_hash.find(mapthing_id); auto itr = loader_->mapthing_hash.find(mapthing_id);

View File

@ -20,6 +20,7 @@ class MetaMgr : public a8::Singleton<MetaMgr>
double GetSysParamAsFloat(const std::string& param_name, double def_val = 0.0f); double GetSysParamAsFloat(const std::string& param_name, double def_val = 0.0f);
std::string GetSysParamAsString(const std::string& param_name, const char* def_val = ""); std::string GetSysParamAsString(const std::string& param_name, const char* def_val = "");
MetaData::Map* GetMap(int map_id); MetaData::Map* GetMap(int map_id);
std::list<MetaData::Map>* GetMaps();
MetaData::MapThing* GetMapThing(int mapthing_id); MetaData::MapThing* GetMapThing(int mapthing_id);
MetaData::Player* GetPlayer(int id); MetaData::Player* GetPlayer(int id);
MetaData::Equip* GetEquip(int id); MetaData::Equip* GetEquip(int id);
@ -120,10 +121,12 @@ class MetaMgr : public a8::Singleton<MetaMgr>
int level1room_robot_autodie_distance = 0; int level1room_robot_autodie_distance = 0;
std::string level1room_born_point; std::string level1room_born_point;
#if 0
int refresh_robot_min_num = 0; int refresh_robot_min_num = 0;
int refresh_robot_max_num = 0; int refresh_robot_max_num = 0;
int refresh_robot_min_time = 0; int refresh_robot_min_time = 0;
int refresh_robot_max_time = 0; int refresh_robot_max_time = 0;
#endif
int other_fill_interval = 0; int other_fill_interval = 0;
float android_attack_range = 0; float android_attack_range = 0;

View File

@ -28,8 +28,10 @@
#include "framework/cpp/utils.h" #include "framework/cpp/utils.h"
#if 0
const size_t NORMAL_ROOM_MAX_PLAYER_NUM = 40; const size_t NORMAL_ROOM_MAX_PLAYER_NUM = 40;
const size_t MINI_ROOM_MAX_PLAYER_NUM = 20; const size_t MINI_ROOM_MAX_PLAYER_NUM = 20;
#endif
const int SHUA_RANGE = 580; const int SHUA_RANGE = 580;
@ -228,10 +230,10 @@ void Room::ShuaAndroid()
if (gas_data_.gas_mode != GasInactive) { if (gas_data_.gas_mode != GasInactive) {
return; return;
} }
int robot_num = a8::RandEx(MetaMgr::Instance()->refresh_robot_min_num, int robot_num = a8::RandEx(map_meta_->refresh_robot_min_num,
MetaMgr::Instance()->refresh_robot_max_num); map_meta_->refresh_robot_max_num);
int refresh_time = a8::RandEx(MetaMgr::Instance()->refresh_robot_min_time, int refresh_time = a8::RandEx(map_meta_->refresh_robot_min_time,
MetaMgr::Instance()->refresh_robot_max_time); map_meta_->refresh_robot_max_time);
if (robot_num > 0 && refresh_time > 0) { if (robot_num > 0 && refresh_time > 0) {
if (IsMiniRoom()) { if (IsMiniRoom()) {
#if 0 #if 0
@ -742,16 +744,6 @@ bool Room::CanJoin(const std::string& accountid,
int self_proto_version, int self_proto_version,
int self_channel) int self_channel)
{ {
#if 1
if (creator_channel_ == kWxChannelId) {
if (self_channel != creator_channel_) {
return false;
}
if (self_proto_version != creator_proto_version_) {
return false;
}
}
#endif
if (self_room_mode < kChiJiMode) { if (self_room_mode < kChiJiMode) {
self_room_mode = kChiJiMode; self_room_mode = kChiJiMode;
} }
@ -3323,6 +3315,9 @@ int Room::GetOnlinePlayerNum()
size_t Room::GetRoomMaxPlayerNum() size_t Room::GetRoomMaxPlayerNum()
{ {
#if 1
return map_meta_->i->player();
#else
if (room_mode_ == kZombieMode) { if (room_mode_ == kZombieMode) {
return MetaMgr::Instance()->zbmode_player_num; return MetaMgr::Instance()->zbmode_player_num;
} else { } else {
@ -3332,6 +3327,7 @@ size_t Room::GetRoomMaxPlayerNum()
return NORMAL_ROOM_MAX_PLAYER_NUM; return NORMAL_ROOM_MAX_PLAYER_NUM;
} }
} }
#endif
} }
void Room::InitAndroidAI() void Room::InitAndroidAI()

View File

@ -266,7 +266,8 @@ Room* RoomMgr::GetJoinableRoom(const cs::CMJoin& msg,
game_times, game_times,
creator_register_time, creator_register_time,
proto_version, proto_version,
channel); channel,
msg.map_id());
} }
if (self_room_type == RT_MidBrid) { if (self_room_type == RT_MidBrid) {
return CreateRoom(msg, return CreateRoom(msg,
@ -274,7 +275,8 @@ Room* RoomMgr::GetJoinableRoom(const cs::CMJoin& msg,
game_times, game_times,
creator_register_time, creator_register_time,
proto_version, proto_version,
channel); channel,
msg.map_id());
} }
for (int i = 0; i < RT_Max; ++i) { for (int i = 0; i < RT_Max; ++i) {
for (Room* room : group_rooms[i]) { for (Room* room : group_rooms[i]) {
@ -288,7 +290,8 @@ Room* RoomMgr::GetJoinableRoom(const cs::CMJoin& msg,
game_times, game_times,
creator_register_time, creator_register_time,
proto_version, proto_version,
channel); channel,
msg.map_id());
} }
Room* RoomMgr::GetRoomByUuid(long long room_uuid) Room* RoomMgr::GetRoomByUuid(long long room_uuid)
@ -468,7 +471,8 @@ Room* RoomMgr::CreateRoom(const cs::CMJoin& msg,
int game_times, int game_times,
int creator_register_time, int creator_register_time,
int creator_proto_version, int creator_proto_version,
int creator_channel) int creator_channel,
int map_id)
{ {
int room_idx = AllocRoomIdx(); int room_idx = AllocRoomIdx();
if (room_idx < 1) { if (room_idx < 1) {
@ -480,6 +484,7 @@ Room* RoomMgr::CreateRoom(const cs::CMJoin& msg,
init_info.room_uuid = App::Instance()->NewUuid(); init_info.room_uuid = App::Instance()->NewUuid();
init_info.room_type = room_type; init_info.room_type = room_type;
init_info.room_mode = (RoomMode_e)msg.room_mode(); init_info.room_mode = (RoomMode_e)msg.room_mode();
init_info.init_map_id = map_id;
init_info.creator_game_times = game_times; init_info.creator_game_times = game_times;
init_info.creator_register_time = creator_register_time; init_info.creator_register_time = creator_register_time;
init_info.creator_proto_version = creator_proto_version; init_info.creator_proto_version = creator_proto_version;

View File

@ -51,7 +51,8 @@ class RoomMgr : public a8::Singleton<RoomMgr>
int game_times, int game_times,
int creator_register_time, int creator_register_time,
int creator_proto_version, int creator_proto_version,
int creator_channel); int creator_channel,
int map_id);
void JoinErrorHandle(const cs::CMJoin& msg, int error_code, int socket_handle); void JoinErrorHandle(const cs::CMJoin& msg, int error_code, int socket_handle);
std::string GenTeamHashData(const std::string& team_uuid, std::map<std::string, long long>* team_hash); std::string GenTeamHashData(const std::string& team_uuid, std::map<std::string, long long>* team_hash);
void OnJoinRoomOk(const cs::CMJoin& msg, Player* hum); void OnJoinRoomOk(const cs::CMJoin& msg, Player* hum);

View File

@ -164,6 +164,7 @@ struct RoomInitInfo
int creator_proto_version = 0; int creator_proto_version = 0;
int creator_channel = 0; int creator_channel = 0;
bool force_entry_newbie_room = false; bool force_entry_newbie_room = false;
int init_map_id = 0;
const MetaData::Map* map_meta = nullptr; const MetaData::Map* map_meta = nullptr;
std::string map_tpl_name; std::string map_tpl_name;

View File

@ -754,6 +754,7 @@ message CMJoin
optional bool force_entry_newbie_room = 50; // optional bool force_entry_newbie_room = 50; //
repeated MFTeamMember team_members = 51; // repeated MFTeamMember team_members = 51; //
optional int32 room_mode = 52; //0: 1: optional int32 room_mode = 52; //0: 1:
optional int32 map_id = 53; //id 0:
} }
//线 //线

View File

@ -28,6 +28,9 @@ message Map
optional float map_height = 5; optional float map_height = 5;
optional string airdrops = 6; optional string airdrops = 6;
optional int32 terminator_airdrop = 7; optional int32 terminator_airdrop = 7;
optional int32 player = 8;
optional string refresh_robot = 9;
optional int32 map_mode = 10;
} }
message MapThing message MapThing