From b935760d649c2cb70b5f8daa92aa1485194d27f7 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sat, 4 Mar 2023 15:55:59 -0800 Subject: [PATCH] split GameMode into enum class --- src/ChatCommands.cc | 3 +- src/Lobby.cc | 1 + src/Lobby.hh | 6 ++-- src/ReceiveCommands.cc | 74 ++++++++++++++++++++++-------------------- src/ReceiveCommands.hh | 1 + src/SendCommands.cc | 28 +++++++++------- src/StaticGameData.cc | 32 ++++++++++++++++++ src/StaticGameData.hh | 10 ++++++ 8 files changed, 104 insertions(+), 51 deletions(-) diff --git a/src/ChatCommands.cc b/src/ChatCommands.cc index 14aa5670..456d2f4a 100644 --- a/src/ChatCommands.cc +++ b/src/ChatCommands.cc @@ -521,7 +521,8 @@ static void server_command_playrec(shared_ptr s, shared_ptr shared_ptr record(new Episode3::BattleRecord(data)); shared_ptr 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); } } diff --git a/src/Lobby.cc b/src/Lobby.cc index f68774af..9ad6dc91 100644 --- a/src/Lobby.cc +++ b/src/Lobby.cc @@ -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()), random(new mt19937(this->random_seed)), diff --git a/src/Lobby.hh b/src/Lobby.hh index de2cb3f1..d5e6c365 100644 --- a/src/Lobby.hh +++ b/src/Lobby.hh @@ -37,10 +37,7 @@ struct Lobby : public std::enable_shared_from_this { 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 { GameVersion version; uint8_t section_id; Episode episode; + GameMode mode; uint8_t difficulty; // 0-3 std::u16string password; std::u16string name; diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index e4b8bf15..f66ff141 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -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""; 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 s, shared_ptr 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 s, shared_ptr 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 s, shared_ptr 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 create_game_generic( const std::u16string& name, const std::u16string& password, Episode episode, + GameMode mode, uint8_t difficulty, uint32_t flags, shared_ptr watched_lobby, @@ -3165,9 +3166,8 @@ shared_ptr 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 game = s->create_lobby(); game->name = name; @@ -3179,6 +3179,7 @@ shared_ptr 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 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 s, shared_ptr c, const auto& cmd = check_size_t(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 s, shared_ptr 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 s, shared_ptr 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 s, shared_ptr c, const auto& cmd = check_size_t(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 s, shared_ptr 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; diff --git a/src/ReceiveCommands.hh b/src/ReceiveCommands.hh index b7ed0755..ee0dc5db 100644 --- a/src/ReceiveCommands.hh +++ b/src/ReceiveCommands.hh @@ -12,6 +12,7 @@ std::shared_ptr create_game_generic( const std::u16string& name, const std::u16string& password, Episode episode, + GameMode mode, uint8_t difficulty, uint32_t flags, std::shared_ptr watched_lobby = nullptr, diff --git a/src/SendCommands.cc b/src/SendCommands.cc index 7c15797a..2c6c1e73 100644 --- a/src/SendCommands.cc +++ b/src/SendCommands.cc @@ -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 c, shared_ptr 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 c, shared_ptr 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); diff --git a/src/StaticGameData.cc b/src/StaticGameData.cc index 984eeacc..c18879c0 100644 --- a/src/StaticGameData.cc +++ b/src/StaticGameData.cc @@ -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 section_id_to_name({ "Viridia", "Greennill", "Skyly", "Bluefull", "Purplenum", "Pinkal", "Redria", "Oran", "Yellowboze", "Whitill"}); diff --git a/src/StaticGameData.hh b/src/StaticGameData.hh index a9056930..661420a8 100644 --- a/src/StaticGameData.hh +++ b/src/StaticGameData.hh @@ -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);