split GameMode into enum class

This commit is contained in:
Martin Michelsen
2023-03-04 15:55:59 -08:00
parent 2932488d00
commit b935760d64
8 changed files with 104 additions and 51 deletions
+2 -1
View File
@@ -521,7 +521,8 @@ static void server_command_playrec(shared_ptr<ServerState> s, shared_ptr<Lobby>
shared_ptr<Episode3::BattleRecord> record(new Episode3::BattleRecord(data));
shared_ptr<Episode3::BattleRecordPlayer> battle_player(
new Episode3::BattleRecordPlayer(record, s->game_server->get_base()));
create_game_generic(s, c, args.c_str(), u"", Episode::EP3, 0, flags, nullptr, battle_player);
create_game_generic(s, c, args.c_str(), u"", Episode::EP3, GameMode::NORMAL,
0, flags, nullptr, battle_player);
}
}
+1
View File
@@ -21,6 +21,7 @@ Lobby::Lobby(uint32_t id)
version(GameVersion::GC),
section_id(0),
episode(Episode::NONE),
mode(GameMode::NORMAL),
difficulty(0),
random_seed(random_object<uint32_t>()),
random(new mt19937(this->random_seed)),
+2 -4
View File
@@ -37,10 +37,7 @@ struct Lobby : public std::enable_shared_from_this<Lobby> {
ITEM_TRACKING_ENABLED = 0x00001000,
IS_SPECTATOR_TEAM = 0x00002000, // episode must be EP3 also
SPECTATORS_FORBIDDEN = 0x00004000,
BATTLE_MODE = 0x00008000,
CHALLENGE_MODE = 0x00010000,
SOLO_MODE = 0x00020000,
START_BATTLE_PLAYER_IMMEDIATELY = 0x00040000,
START_BATTLE_PLAYER_IMMEDIATELY = 0x00008000,
// Flags used only for lobbies
PUBLIC = 0x01000000,
@@ -71,6 +68,7 @@ struct Lobby : public std::enable_shared_from_this<Lobby> {
GameVersion version;
uint8_t section_id;
Episode episode;
GameMode mode;
uint8_t difficulty; // 0-3
std::u16string password;
std::u16string name;
+39 -35
View File
@@ -1082,7 +1082,8 @@ static bool start_ep3_battle_table_game_if_ready(
uint32_t flags = Lobby::Flag::NON_V1_ONLY;
u16string name = tourn ? decode_sjis(tourn->get_name()) : u"<BattleTable>";
auto game = create_game_generic(
s, game_clients.begin()->second, name, u"", Episode::EP3, 0, flags);
s, game_clients.begin()->second, name, u"", Episode::EP3,
GameMode::NORMAL, 0, flags);
if (!game) {
return false;
}
@@ -1537,18 +1538,10 @@ static void on_09(shared_ptr<ServerState> s, shared_ptr<Client> c,
}
string secid_str = name_for_section_id(game->section_id);
const char* mode_abbrev = "Nml";
if (game->flags & Lobby::Flag::BATTLE_MODE) {
mode_abbrev = "Btl";
} else if (game->flags & Lobby::Flag::CHALLENGE_MODE) {
mode_abbrev = "Chl";
} else if (game->flags & Lobby::Flag::SOLO_MODE) {
mode_abbrev = "Solo";
}
info += string_printf("%s %c %s %s\n",
abbreviation_for_episode(game->episode),
abbreviation_for_difficulty(game->difficulty),
mode_abbrev,
abbreviation_for_mode(game->mode),
secid_str.c_str());
bool cheats_enabled = game->flags & Lobby::Flag::CHEATS_ENABLED;
@@ -1914,7 +1907,7 @@ static void on_10(shared_ptr<ServerState> s, shared_ptr<Client> c,
send_lobby_message_box(c, u"$C6You cannot join this\ngame because\nanother player is\ncurrently loading.\nTry again soon.");
break;
}
if (game->flags & Lobby::Flag::SOLO_MODE) {
if (game->mode == GameMode::SOLO) {
send_lobby_message_box(c, u"$C6You cannot join this\n game because it is\na Solo Mode game.");
break;
}
@@ -2321,14 +2314,21 @@ static void on_A2(shared_ptr<ServerState> s, shared_ptr<Client> c,
if ((c->version() == GameVersion::BB) && flag) {
menu = &quest_government_menu;
} else {
if (l->flags & Lobby::Flag::BATTLE_MODE) {
menu = &quest_battle_menu;
} else if (l->flags & Lobby::Flag::CHALLENGE_MODE) {
menu = &quest_challenge_menu;
} else if (l->flags & Lobby::Flag::SOLO_MODE) {
menu = &quest_solo_menu;
} else {
menu = &quest_categories_menu;
switch (l->mode) {
case GameMode::NORMAL:
menu = &quest_categories_menu;
break;
case GameMode::BATTLE:
menu = &quest_battle_menu;
break;
case GameMode::CHALLENGE:
menu = &quest_challenge_menu;
break;
case GameMode::SOLO:
menu = &quest_solo_menu;
break;
default:
throw logic_error("invalid game mode");
}
}
@@ -3105,6 +3105,7 @@ shared_ptr<Lobby> create_game_generic(
const std::u16string& name,
const std::u16string& password,
Episode episode,
GameMode mode,
uint8_t difficulty,
uint32_t flags,
shared_ptr<Lobby> watched_lobby,
@@ -3165,9 +3166,8 @@ shared_ptr<Lobby> create_game_generic(
// is not notified when this happens. We'll have to implement this anyway for
// BB, but for now we ignore it.
bool item_tracking_enabled =
(c->version() == GameVersion::BB) |
(s->item_tracking_enabled &&
!(flags & (Lobby::Flag::BATTLE_MODE | Lobby::Flag::CHALLENGE_MODE)));
(c->version() == GameVersion::BB) ||
(s->item_tracking_enabled && (mode == GameMode::NORMAL || mode == GameMode::SOLO));
shared_ptr<Lobby> game = s->create_lobby();
game->name = name;
@@ -3179,6 +3179,7 @@ shared_ptr<Lobby> create_game_generic(
game->section_id = c->options.override_section_id >= 0
? c->options.override_section_id : c->game_data.player()->disp.section_id;
game->episode = episode;
game->mode = mode;
game->difficulty = difficulty;
if (c->options.override_random_seed >= 0) {
game->random_seed = c->options.override_random_seed;
@@ -3200,7 +3201,7 @@ shared_ptr<Lobby> create_game_generic(
watched_lobby->watcher_lobbies.emplace(game);
}
bool is_solo = (game->flags & Lobby::Flag::SOLO_MODE);
bool is_solo = (game->mode == GameMode::SOLO);
// Generate the map variations
if (game->is_ep3()) {
@@ -3271,14 +3272,14 @@ static void on_C1_PC(shared_ptr<ServerState> s, shared_ptr<Client> c,
const auto& cmd = check_size_t<C_CreateGame_PC_C1>(data);
uint32_t flags = Lobby::Flag::NON_V1_ONLY;
GameMode mode = GameMode::NORMAL;
if (cmd.battle_mode) {
flags |= Lobby::Flag::BATTLE_MODE;
}
if (cmd.challenge_mode) {
flags |= Lobby::Flag::CHALLENGE_MODE;
mode = GameMode::BATTLE;
} else if (cmd.challenge_mode) {
mode = GameMode::CHALLENGE;
}
auto game = create_game_generic(
s, c, cmd.name, cmd.password, Episode::EP1, cmd.difficulty, flags);
s, c, cmd.name, cmd.password, Episode::EP1, mode, cmd.difficulty, flags);
if (game) {
s->change_client_lobby(c, game);
c->flags |= Client::Flag::LOADING;
@@ -3313,14 +3314,15 @@ static void on_0C_C1_E7_EC(shared_ptr<ServerState> s, shared_ptr<Client> c,
u16string name = decode_sjis(cmd.name);
u16string password = decode_sjis(cmd.password);
GameMode mode = GameMode::NORMAL;
if (cmd.battle_mode) {
flags |= Lobby::Flag::BATTLE_MODE;
mode = GameMode::BATTLE;
}
if (cmd.challenge_mode) {
if (client_is_ep3) {
flags |= Lobby::Flag::SPECTATORS_FORBIDDEN;
} else {
flags |= Lobby::Flag::CHALLENGE_MODE;
mode = GameMode::CHALLENGE;
}
}
@@ -3338,7 +3340,8 @@ static void on_0C_C1_E7_EC(shared_ptr<ServerState> s, shared_ptr<Client> c,
}
auto game = create_game_generic(
s, c, name.c_str(), password.c_str(), episode, cmd.difficulty, flags, watched_lobby);
s, c, name.c_str(), password.c_str(), episode, mode, cmd.difficulty,
flags, watched_lobby);
if (game) {
s->change_client_lobby(c, game);
c->flags |= Client::Flag::LOADING;
@@ -3350,14 +3353,15 @@ static void on_C1_BB(shared_ptr<ServerState> s, shared_ptr<Client> c,
const auto& cmd = check_size_t<C_CreateGame_BB_C1>(data);
uint32_t flags = Lobby::Flag::NON_V1_ONLY;
GameMode mode = GameMode::NORMAL;
if (cmd.battle_mode) {
flags |= Lobby::Flag::BATTLE_MODE;
mode = GameMode::BATTLE;
}
if (cmd.challenge_mode) {
flags |= Lobby::Flag::CHALLENGE_MODE;
mode = GameMode::CHALLENGE;
}
if (cmd.solo_mode) {
flags |= Lobby::Flag::SOLO_MODE;
mode = GameMode::SOLO;
}
Episode episode;
@@ -3376,7 +3380,7 @@ static void on_C1_BB(shared_ptr<ServerState> s, shared_ptr<Client> c,
}
auto game = create_game_generic(
s, c, cmd.name, cmd.password, episode, cmd.difficulty, flags);
s, c, cmd.name, cmd.password, episode, mode, cmd.difficulty, flags);
if (game) {
s->change_client_lobby(c, game);
c->flags |= Client::Flag::LOADING;
+1
View File
@@ -12,6 +12,7 @@ std::shared_ptr<Lobby> create_game_generic(
const std::u16string& name,
const std::u16string& password,
Episode episode,
GameMode mode,
uint8_t difficulty,
uint32_t flags,
std::shared_ptr<Lobby> watched_lobby = nullptr,
+17 -11
View File
@@ -1175,14 +1175,20 @@ void send_game_menu_t(
e.flags = (l->password.empty() ? 0 : 2) | ((l->flags & Lobby::Flag::BATTLE_IN_PROGRESS) ? 4 : 0);
} else {
e.flags = ((episode_num << 6) | (l->password.empty() ? 0 : 2));
if (l->flags & Lobby::Flag::BATTLE_MODE) {
e.flags |= 0x10;
}
if (l->flags & Lobby::Flag::CHALLENGE_MODE) {
e.flags |= 0x20;
}
if (l->flags & Lobby::Flag::SOLO_MODE) {
e.flags |= 0x34;
switch (l->mode) {
case GameMode::NORMAL:
break;
case GameMode::BATTLE:
e.flags |= 0x10;
break;
case GameMode::CHALLENGE:
e.flags |= 0x20;
break;
case GameMode::SOLO:
e.flags |= 0x34;
break;
default:
throw logic_error("invalid game mode");
}
}
e.name = l->name;
@@ -1461,10 +1467,10 @@ void send_join_game_t(shared_ptr<Client> c, shared_ptr<Lobby> l) {
cmd->leader_id = l->leader_id;
cmd->disable_udp = 0x01; // Unused on PC/XB/BB
cmd->difficulty = l->difficulty;
cmd->battle_mode = (l->flags & Lobby::Flag::BATTLE_MODE) ? 1 : 0;
cmd->battle_mode = (l->mode == GameMode::BATTLE) ? 1 : 0;
cmd->event = l->event;
cmd->section_id = l->section_id;
cmd->challenge_mode = (l->flags & Lobby::Flag::CHALLENGE_MODE) ? 1 : 0;
cmd->challenge_mode = (l->mode == GameMode::CHALLENGE) ? 1 : 0;
cmd->rare_seed = l->random_seed;
switch (l->episode) {
case Episode::EP1:
@@ -1483,7 +1489,7 @@ void send_join_game_t(shared_ptr<Client> c, shared_ptr<Lobby> l) {
throw logic_error("invalid episode number in game");
}
cmd->unused2 = 0x01;
cmd->solo_mode = (l->flags & Lobby::Flag::SOLO_MODE) ? 1 : 0;
cmd->solo_mode = (l->mode == GameMode::SOLO) ? 1 : 0;
cmd->unused3 = 0x00;
send_command(c, 0x64, player_count, data);
+32
View File
@@ -60,6 +60,38 @@ const char* abbreviation_for_episode(Episode ep) {
const char* name_for_mode(GameMode mode) {
switch (mode) {
case GameMode::NORMAL:
return "Normal";
case GameMode::BATTLE:
return "Battle";
case GameMode::CHALLENGE:
return "Challenge";
case GameMode::SOLO:
return "Solo";
default:
return "Unknown mode";
}
}
const char* abbreviation_for_mode(GameMode mode) {
switch (mode) {
case GameMode::NORMAL:
return "Nml";
case GameMode::BATTLE:
return "Btl";
case GameMode::CHALLENGE:
return "Chl";
case GameMode::SOLO:
return "Solo";
default:
return "UnkMd";
}
}
const vector<string> section_id_to_name({
"Viridia", "Greennill", "Skyly", "Bluefull", "Purplenum", "Pinkal", "Redria",
"Oran", "Yellowboze", "Whitill"});
+10
View File
@@ -22,6 +22,16 @@ bool episode_has_arpg_semantics(Episode ep);
const char* name_for_episode(Episode ep);
const char* abbreviation_for_episode(Episode ep);
enum class GameMode {
NORMAL = 0,
BATTLE = 1,
CHALLENGE = 2,
SOLO = 3,
};
const char* name_for_mode(GameMode mode);
const char* abbreviation_for_mode(GameMode mode);
size_t stack_size_for_item(uint8_t data0, uint8_t data1);