diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index 2c269984..82b7b61d 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -249,11 +249,6 @@ static void on_unimplemented(shared_ptr c, uint8_t command, uint8_t flag } } -static void on_forward_check_size(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { - check_size_t(data, size, 0xFFFF); - forward_subcommand(c, command, flag, data, size); -} - static void on_forward_check_game(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { auto l = c->require_lobby(); if (!l->is_game()) { @@ -488,14 +483,14 @@ static void on_sync_joining_player_disp_and_inventory( } } -static void on_forward_check_size_client(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { +static void on_forward_check_client(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { const auto& cmd = check_size_t(data, size, 0xFFFF); if (cmd.client_id == c->lobby_client_id) { forward_subcommand(c, command, flag, data, size); } } -static void on_forward_check_size_game(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { +static void on_forward_check_game(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { check_size_t(data, size, 0xFFFF); auto l = c->require_lobby(); if (l->is_game()) { @@ -503,7 +498,23 @@ static void on_forward_check_size_game(shared_ptr c, uint8_t command, ui } } -static void on_forward_check_size_ep3_lobby(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { +static void on_forward_check_lobby_client(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { + const auto& cmd = check_size_t(data, size, 0xFFFF); + auto l = c->require_lobby(); + if (!l->is_game() && (cmd.client_id == c->lobby_client_id)) { + forward_subcommand(c, command, flag, data, size); + } +} + +static void on_forward_check_game_client(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { + const auto& cmd = check_size_t(data, size, 0xFFFF); + auto l = c->require_lobby(); + if (l->is_game() && (cmd.client_id == c->lobby_client_id)) { + forward_subcommand(c, command, flag, data, size); + } +} + +static void on_forward_check_ep3_lobby(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { check_size_t(data, size, 0xFFFF); auto l = c->require_lobby(); if (!l->is_game() && l->is_ep3()) { @@ -511,7 +522,7 @@ static void on_forward_check_size_ep3_lobby(shared_ptr c, uint8_t comman } } -static void on_forward_check_size_ep3_game(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { +static void on_forward_check_ep3_game(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { check_size_t(data, size, 0xFFFF); auto l = c->require_lobby(); if (l->is_game() && l->is_ep3()) { @@ -697,6 +708,11 @@ static void on_word_select(shared_ptr c, uint8_t command, uint8_t flag, } } +static void on_warp(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { + check_size_t(data, size); + // Unconditionally block these. Players should use $warp instead. +} + static void on_set_player_visible(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { const auto& cmd = check_size_t(data, size); @@ -808,7 +824,7 @@ static void on_attack_finished(shared_ptr c, uint8_t command, uint8_t fl if (cmd.count > allowed_count) { throw runtime_error("invalid attack finished command"); } - on_forward_check_size_client(c, command, flag, data, size); + on_forward_check_game_client(c, command, flag, data, size); } static void on_cast_technique(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { @@ -818,7 +834,7 @@ static void on_cast_technique(shared_ptr c, uint8_t command, uint8_t fla if (cmd.target_count > allowed_count) { throw runtime_error("invalid cast technique command"); } - on_forward_check_size_client(c, command, flag, data, size); + on_forward_check_game_client(c, command, flag, data, size); } static void on_subtract_pb_energy(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { @@ -828,7 +844,7 @@ static void on_subtract_pb_energy(shared_ptr c, uint8_t command, uint8_t if (cmd.entry_count > allowed_count) { throw runtime_error("invalid subtract PB energy command"); } - on_forward_check_size_client(c, command, flag, data, size); + on_forward_check_game_client(c, command, flag, data, size); } static void on_switch_state_changed(shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { @@ -2767,32 +2783,32 @@ const SubcommandDefinition subcommand_definitions[0x100] = { /* 6x08 */ {0x08, 0x08, 0x08, nullptr}, /* 6x09 */ {0x09, 0x09, 0x09, nullptr}, /* 6x0A */ {0x0A, 0x0A, 0x0A, on_enemy_hit}, - /* 6x0B */ {0x0B, 0x0B, 0x0B, on_forward_check_size_game}, - /* 6x0C */ {0x0C, 0x0C, 0x0C, on_forward_check_size_game}, - /* 6x0D */ {0x00, 0x00, 0x0D, on_forward_check_size_game}, + /* 6x0B */ {0x0B, 0x0B, 0x0B, on_forward_check_game}, + /* 6x0C */ {0x0C, 0x0C, 0x0C, on_forward_check_game}, + /* 6x0D */ {0x00, 0x00, 0x0D, on_forward_check_game}, /* 6x0E */ {0x00, 0x00, 0x0E, nullptr}, /* 6x0F */ {0x00, 0x00, 0x0F, on_invalid}, /* 6x10 */ {0x0E, 0x0E, 0x10, nullptr}, /* 6x11 */ {0x0F, 0x0F, 0x11, nullptr}, /* 6x12 */ {0x10, 0x10, 0x12, on_dragon_actions}, - /* 6x13 */ {0x11, 0x11, 0x13, on_forward_check_size_game}, - /* 6x14 */ {0x12, 0x12, 0x14, on_forward_check_size_game}, - /* 6x15 */ {0x13, 0x13, 0x15, on_forward_check_size_game}, - /* 6x16 */ {0x14, 0x14, 0x16, on_forward_check_size_game}, - /* 6x17 */ {0x15, 0x15, 0x17, on_forward_check_size_game}, - /* 6x18 */ {0x16, 0x16, 0x18, on_forward_check_size_game}, - /* 6x19 */ {0x17, 0x17, 0x19, on_forward_check_size_game}, + /* 6x13 */ {0x11, 0x11, 0x13, on_forward_check_game}, + /* 6x14 */ {0x12, 0x12, 0x14, on_forward_check_game}, + /* 6x15 */ {0x13, 0x13, 0x15, on_forward_check_game}, + /* 6x16 */ {0x14, 0x14, 0x16, on_forward_check_game}, + /* 6x17 */ {0x15, 0x15, 0x17, on_forward_check_game}, + /* 6x18 */ {0x16, 0x16, 0x18, on_forward_check_game}, + /* 6x19 */ {0x17, 0x17, 0x19, on_forward_check_game}, /* 6x1A */ {0x00, 0x00, 0x1A, on_invalid}, - /* 6x1B */ {0x00, 0x19, 0x1B, on_forward_check_size_game}, - /* 6x1C */ {0x00, 0x1A, 0x1C, on_forward_check_size_game}, + /* 6x1B */ {0x00, 0x19, 0x1B, on_forward_check_game}, + /* 6x1C */ {0x00, 0x1A, 0x1C, on_forward_check_game}, /* 6x1D */ {0x19, 0x1B, 0x1D, on_invalid}, /* 6x1E */ {0x1A, 0x1C, 0x1E, on_invalid}, /* 6x1F */ {0x1B, 0x1D, 0x1F, on_change_floor_6x1F}, /* 6x20 */ {0x1C, 0x1E, 0x20, on_movement_with_floor}, /* 6x21 */ {0x1D, 0x1F, 0x21, on_change_floor_6x21}, - /* 6x22 */ {0x1E, 0x20, 0x22, on_forward_check_size_client}, // Formerly on_set_player_invisible + /* 6x22 */ {0x1E, 0x20, 0x22, on_forward_check_client}, // Formerly on_set_player_invisible /* 6x23 */ {0x1F, 0x21, 0x23, on_set_player_visible}, - /* 6x24 */ {0x20, 0x22, 0x24, on_forward_check_size_game}, + /* 6x24 */ {0x20, 0x22, 0x24, on_forward_check_game}, /* 6x25 */ {0x21, 0x23, 0x25, on_equip_item}, /* 6x26 */ {0x22, 0x24, 0x26, on_unequip_item}, /* 6x27 */ {0x23, 0x25, 0x27, on_use_item}, @@ -2800,22 +2816,22 @@ const SubcommandDefinition subcommand_definitions[0x100] = { /* 6x29 */ {0x25, 0x27, 0x29, on_destroy_inventory_item}, /* 6x2A */ {0x26, 0x28, 0x2A, on_player_drop_item}, /* 6x2B */ {0x27, 0x29, 0x2B, on_create_inventory_item}, - /* 6x2C */ {0x28, 0x2A, 0x2C, on_forward_check_size}, - /* 6x2D */ {0x29, 0x2B, 0x2D, on_forward_check_size}, - /* 6x2E */ {0x2A, 0x2C, 0x2E, on_forward_check_size}, + /* 6x2C */ {0x28, 0x2A, 0x2C, on_forward_check_client}, + /* 6x2D */ {0x29, 0x2B, 0x2D, on_forward_check_client}, + /* 6x2E */ {0x2A, 0x2C, 0x2E, on_forward_check_client}, /* 6x2F */ {0x2B, 0x2D, 0x2F, on_hit_by_enemy}, /* 6x30 */ {0x2C, 0x2E, 0x30, on_level_up}, - /* 6x31 */ {0x2D, 0x2F, 0x31, on_forward_check_size_game}, - /* 6x32 */ {0x00, 0x00, 0x32, on_forward_check_size_game}, - /* 6x33 */ {0x2E, 0x30, 0x33, on_forward_check_size_game}, + /* 6x31 */ {0x2D, 0x2F, 0x31, on_forward_check_game}, + /* 6x32 */ {0x00, 0x00, 0x32, on_forward_check_game}, + /* 6x33 */ {0x2E, 0x30, 0x33, on_forward_check_game}, /* 6x34 */ {0x2F, 0x31, 0x34, nullptr}, /* 6x35 */ {0x30, 0x32, 0x35, nullptr}, /* 6x36 */ {0x00, 0x00, 0x36, on_forward_check_game}, - /* 6x37 */ {0x32, 0x33, 0x37, on_forward_check_size_game}, + /* 6x37 */ {0x32, 0x33, 0x37, on_forward_check_game}, /* 6x38 */ {0x33, 0x34, 0x38, nullptr}, - /* 6x39 */ {0x00, 0x36, 0x39, on_forward_check_size_game}, - /* 6x3A */ {0x00, 0x37, 0x3A, on_forward_check_size_game}, - /* 6x3B */ {0x00, 0x38, 0x3B, on_forward_check_size}, + /* 6x39 */ {0x00, 0x36, 0x39, on_forward_check_game}, + /* 6x3A */ {0x00, 0x37, 0x3A, on_forward_check_game}, + /* 6x3B */ {0x00, 0x38, 0x3B, forward_subcommand}, /* 6x3C */ {0x34, 0x39, 0x3C, nullptr}, /* 6x3D */ {0x00, 0x00, 0x3D, nullptr}, /* 6x3E */ {0x00, 0x00, 0x3E, on_movement_with_floor}, @@ -2823,28 +2839,28 @@ const SubcommandDefinition subcommand_definitions[0x100] = { /* 6x40 */ {0x37, 0x3C, 0x40, on_movement}, /* 6x41 */ {0x38, 0x3D, 0x41, nullptr}, /* 6x42 */ {0x39, 0x3E, 0x42, on_movement}, - /* 6x43 */ {0x3A, 0x3F, 0x43, on_forward_check_size_client}, - /* 6x44 */ {0x3B, 0x40, 0x44, on_forward_check_size_client}, - /* 6x45 */ {0x3C, 0x41, 0x45, on_forward_check_size_client}, + /* 6x43 */ {0x3A, 0x3F, 0x43, on_forward_check_game_client}, + /* 6x44 */ {0x3B, 0x40, 0x44, on_forward_check_game_client}, + /* 6x45 */ {0x3C, 0x41, 0x45, on_forward_check_game_client}, /* 6x46 */ {0x00, 0x42, 0x46, on_attack_finished}, /* 6x47 */ {0x3D, 0x43, 0x47, on_cast_technique}, /* 6x48 */ {0x00, 0x00, 0x48, on_cast_technique_finished}, /* 6x49 */ {0x3E, 0x44, 0x49, on_subtract_pb_energy}, - /* 6x4A */ {0x3F, 0x45, 0x4A, on_forward_check_size_client}, + /* 6x4A */ {0x3F, 0x45, 0x4A, on_forward_check_game_client}, /* 6x4B */ {0x40, 0x46, 0x4B, on_hit_by_enemy}, /* 6x4C */ {0x41, 0x47, 0x4C, on_hit_by_enemy}, /* 6x4D */ {0x42, 0x48, 0x4D, on_player_died}, - /* 6x4E */ {0x00, 0x00, 0x4E, on_forward_check_size_client}, - /* 6x4F */ {0x43, 0x49, 0x4F, on_forward_check_size_client}, - /* 6x50 */ {0x44, 0x4A, 0x50, on_forward_check_size_client}, + /* 6x4E */ {0x00, 0x00, 0x4E, on_forward_check_game_client}, + /* 6x4F */ {0x43, 0x49, 0x4F, on_forward_check_game_client}, + /* 6x50 */ {0x44, 0x4A, 0x50, on_forward_check_game_client}, /* 6x51 */ {0x00, 0x00, 0x51, nullptr}, - /* 6x52 */ {0x46, 0x4C, 0x52, on_forward_check_size}, - /* 6x53 */ {0x47, 0x4D, 0x53, on_forward_check_size_game}, + /* 6x52 */ {0x46, 0x4C, 0x52, forward_subcommand}, + /* 6x53 */ {0x47, 0x4D, 0x53, on_forward_check_game}, /* 6x54 */ {0x48, 0x4E, 0x54, nullptr}, - /* 6x55 */ {0x49, 0x4F, 0x55, on_forward_check_size_client}, - /* 6x56 */ {0x4A, 0x50, 0x56, on_forward_check_size_client}, - /* 6x57 */ {0x00, 0x51, 0x57, on_forward_check_size_client}, - /* 6x58 */ {0x00, 0x00, 0x58, on_forward_check_size_client}, + /* 6x55 */ {0x49, 0x4F, 0x55, on_forward_check_game_client}, + /* 6x56 */ {0x4A, 0x50, 0x56, on_forward_check_client}, + /* 6x57 */ {0x00, 0x51, 0x57, on_forward_check_client}, + /* 6x58 */ {0x00, 0x00, 0x58, on_forward_check_client}, /* 6x59 */ {0x4B, 0x52, 0x59, on_pick_up_item}, /* 6x5A */ {0x4C, 0x53, 0x5A, on_pick_up_item_request}, /* 6x5B */ {0x4D, 0x54, 0x5B, nullptr}, @@ -2853,16 +2869,16 @@ const SubcommandDefinition subcommand_definitions[0x100] = { /* 6x5E */ {0x50, 0x57, 0x5E, on_buy_shop_item}, /* 6x5F */ {0x51, 0x58, 0x5F, on_box_or_enemy_item_drop}, /* 6x60 */ {0x52, 0x59, 0x60, on_entity_drop_item_request}, - /* 6x61 */ {0x53, 0x5A, 0x61, on_forward_check_size_game}, + /* 6x61 */ {0x53, 0x5A, 0x61, on_forward_check_game}, /* 6x62 */ {0x54, 0x5B, 0x62, nullptr}, /* 6x63 */ {0x55, 0x5C, 0x63, on_destroy_floor_item}, /* 6x64 */ {0x56, 0x5D, 0x64, nullptr}, /* 6x65 */ {0x57, 0x5E, 0x65, nullptr}, - /* 6x66 */ {0x00, 0x00, 0x66, on_forward_check_size_game}, - /* 6x67 */ {0x58, 0x5F, 0x67, on_forward_check_size_game}, - /* 6x68 */ {0x59, 0x60, 0x68, on_forward_check_size_game}, - /* 6x69 */ {0x5A, 0x61, 0x69, on_forward_check_size_game}, - /* 6x6A */ {0x5B, 0x62, 0x6A, on_forward_check_size_game}, + /* 6x66 */ {0x00, 0x00, 0x66, on_forward_check_game}, + /* 6x67 */ {0x58, 0x5F, 0x67, on_forward_check_game}, + /* 6x68 */ {0x59, 0x60, 0x68, on_forward_check_game}, + /* 6x69 */ {0x5A, 0x61, 0x69, on_forward_check_game}, + /* 6x6A */ {0x5B, 0x62, 0x6A, on_forward_check_game}, /* 6x6B */ {0x5C, 0x63, 0x6B, on_forward_sync_joining_player_state}, /* 6x6C */ {0x5D, 0x64, 0x6C, on_forward_sync_joining_player_state}, /* 6x6D */ {0x5E, 0x65, 0x6D, on_sync_joining_player_item_state}, @@ -2874,65 +2890,65 @@ const SubcommandDefinition subcommand_definitions[0x100] = { /* 6x73 */ {0x00, 0x00, 0x73, on_invalid}, /* 6x74 */ {0x62, 0x69, 0x74, on_word_select, SDF::ALWAYS_FORWARD_TO_WATCHERS}, /* 6x75 */ {0x00, 0x00, 0x75, on_set_quest_flag}, - /* 6x76 */ {0x00, 0x00, 0x76, on_forward_check_size_game}, - /* 6x77 */ {0x00, 0x00, 0x77, on_forward_check_size_game}, + /* 6x76 */ {0x00, 0x00, 0x76, on_forward_check_game}, + /* 6x77 */ {0x00, 0x00, 0x77, on_forward_check_game}, /* 6x78 */ {0x00, 0x00, 0x78, nullptr}, - /* 6x79 */ {0x00, 0x00, 0x79, on_forward_check_size}, + /* 6x79 */ {0x00, 0x00, 0x79, on_forward_check_lobby_client}, /* 6x7A */ {0x00, 0x00, 0x7A, nullptr}, /* 6x7B */ {0x00, 0x00, 0x7B, nullptr}, - /* 6x7C */ {0x00, 0x00, 0x7C, on_forward_check_size_game}, - /* 6x7D */ {0x00, 0x00, 0x7D, on_forward_check_size_game}, + /* 6x7C */ {0x00, 0x00, 0x7C, on_forward_check_game}, + /* 6x7D */ {0x00, 0x00, 0x7D, on_forward_check_game}, /* 6x7E */ {0x00, 0x00, 0x7E, nullptr}, /* 6x7F */ {0x00, 0x00, 0x7F, nullptr}, - /* 6x80 */ {0x00, 0x00, 0x80, on_forward_check_size_game}, + /* 6x80 */ {0x00, 0x00, 0x80, on_forward_check_game}, /* 6x81 */ {0x00, 0x00, 0x81, nullptr}, /* 6x82 */ {0x00, 0x00, 0x82, nullptr}, - /* 6x83 */ {0x00, 0x00, 0x83, on_forward_check_size_game}, - /* 6x84 */ {0x00, 0x00, 0x84, on_forward_check_size_game}, - /* 6x85 */ {0x00, 0x00, 0x85, on_forward_check_size_game}, - /* 6x86 */ {0x00, 0x00, 0x86, on_forward_check_size_game}, - /* 6x87 */ {0x00, 0x00, 0x87, on_forward_check_size_game}, - /* 6x88 */ {0x00, 0x00, 0x88, on_forward_check_size_game}, - /* 6x89 */ {0x00, 0x00, 0x89, on_forward_check_size_game}, - /* 6x8A */ {0x00, 0x00, 0x8A, on_forward_check_size_game}, + /* 6x83 */ {0x00, 0x00, 0x83, on_forward_check_game}, + /* 6x84 */ {0x00, 0x00, 0x84, on_forward_check_game}, + /* 6x85 */ {0x00, 0x00, 0x85, on_forward_check_game}, + /* 6x86 */ {0x00, 0x00, 0x86, on_forward_check_game}, + /* 6x87 */ {0x00, 0x00, 0x87, on_forward_check_game}, + /* 6x88 */ {0x00, 0x00, 0x88, on_forward_check_game}, + /* 6x89 */ {0x00, 0x00, 0x89, on_forward_check_game}, + /* 6x8A */ {0x00, 0x00, 0x8A, on_forward_check_game}, /* 6x8B */ {0x00, 0x00, 0x8B, nullptr}, /* 6x8C */ {0x00, 0x00, 0x8C, nullptr}, - /* 6x8D */ {0x00, 0x00, 0x8D, on_forward_check_size_client}, + /* 6x8D */ {0x00, 0x00, 0x8D, on_forward_check_game_client}, /* 6x8E */ {0x00, 0x00, 0x8E, nullptr}, /* 6x8F */ {0x00, 0x00, 0x8F, nullptr}, /* 6x90 */ {0x00, 0x00, 0x90, nullptr}, - /* 6x91 */ {0x00, 0x00, 0x91, on_forward_check_size_game}, + /* 6x91 */ {0x00, 0x00, 0x91, on_forward_check_game}, /* 6x92 */ {0x00, 0x00, 0x92, nullptr}, - /* 6x93 */ {0x00, 0x00, 0x93, on_forward_check_size_game}, - /* 6x94 */ {0x00, 0x00, 0x94, on_forward_check_size_game}, + /* 6x93 */ {0x00, 0x00, 0x93, on_forward_check_game}, + /* 6x94 */ {0x00, 0x00, 0x94, on_warp}, /* 6x95 */ {0x00, 0x00, 0x95, nullptr}, /* 6x96 */ {0x00, 0x00, 0x96, nullptr}, - /* 6x97 */ {0x00, 0x00, 0x97, on_forward_check_size_game}, + /* 6x97 */ {0x00, 0x00, 0x97, on_forward_check_game}, /* 6x98 */ {0x00, 0x00, 0x98, nullptr}, /* 6x99 */ {0x00, 0x00, 0x99, nullptr}, - /* 6x9A */ {0x00, 0x00, 0x9A, on_forward_check_size_game}, - /* 6x9B */ {0x00, 0x00, 0x9B, on_forward_check_size_game}, - /* 6x9C */ {0x00, 0x00, 0x9C, on_forward_check_size_game}, - /* 6x9D */ {0x00, 0x00, 0x9D, on_forward_check_size_game}, + /* 6x9A */ {0x00, 0x00, 0x9A, on_forward_check_game_client}, + /* 6x9B */ {0x00, 0x00, 0x9B, on_forward_check_game}, + /* 6x9C */ {0x00, 0x00, 0x9C, on_forward_check_game}, + /* 6x9D */ {0x00, 0x00, 0x9D, on_forward_check_game}, /* 6x9E */ {0x00, 0x00, 0x9E, nullptr}, - /* 6x9F */ {0x00, 0x00, 0x9F, on_forward_check_size_game}, - /* 6xA0 */ {0x00, 0x00, 0xA0, on_forward_check_size_game}, - /* 6xA1 */ {0x00, 0x00, 0xA1, on_forward_check_size_game}, + /* 6x9F */ {0x00, 0x00, 0x9F, on_forward_check_game}, + /* 6xA0 */ {0x00, 0x00, 0xA0, on_forward_check_game}, + /* 6xA1 */ {0x00, 0x00, 0xA1, on_forward_check_game}, /* 6xA2 */ {0x00, 0x00, 0xA2, on_entity_drop_item_request}, - /* 6xA3 */ {0x00, 0x00, 0xA3, on_forward_check_size_game}, - /* 6xA4 */ {0x00, 0x00, 0xA4, on_forward_check_size_game}, - /* 6xA5 */ {0x00, 0x00, 0xA5, on_forward_check_size_game}, - /* 6xA6 */ {0x00, 0x00, 0xA6, on_forward_check_size}, + /* 6xA3 */ {0x00, 0x00, 0xA3, on_forward_check_game}, + /* 6xA4 */ {0x00, 0x00, 0xA4, on_forward_check_game}, + /* 6xA5 */ {0x00, 0x00, 0xA5, on_forward_check_game}, + /* 6xA6 */ {0x00, 0x00, 0xA6, on_forward_check_game}, /* 6xA7 */ {0x00, 0x00, 0xA7, nullptr}, /* 6xA8 */ {0x00, 0x00, 0xA8, on_gol_dragon_actions}, - /* 6xA9 */ {0x00, 0x00, 0xA9, on_forward_check_size_game}, - /* 6xAA */ {0x00, 0x00, 0xAA, on_forward_check_size_game}, - /* 6xAB */ {0x00, 0x00, 0xAB, on_forward_check_size_client}, + /* 6xA9 */ {0x00, 0x00, 0xA9, on_forward_check_game}, + /* 6xAA */ {0x00, 0x00, 0xAA, on_forward_check_game}, + /* 6xAB */ {0x00, 0x00, 0xAB, on_forward_check_lobby_client}, /* 6xAC */ {0x00, 0x00, 0xAC, nullptr}, - /* 6xAD */ {0x00, 0x00, 0xAD, on_forward_check_size_game}, - /* 6xAE */ {0x00, 0x00, 0xAE, on_forward_check_size_client}, - /* 6xAF */ {0x00, 0x00, 0xAF, on_forward_check_size_client}, - /* 6xB0 */ {0x00, 0x00, 0xB0, on_forward_check_size_client}, + /* 6xAD */ {0x00, 0x00, 0xAD, on_forward_check_game}, + /* 6xAE */ {0x00, 0x00, 0xAE, on_forward_check_client}, + /* 6xAF */ {0x00, 0x00, 0xAF, on_forward_check_lobby_client}, + /* 6xB0 */ {0x00, 0x00, 0xB0, on_forward_check_lobby_client}, /* 6xB1 */ {0x00, 0x00, 0xB1, nullptr}, /* 6xB2 */ {0x00, 0x00, 0xB2, nullptr}, /* 6xB3 */ {0x00, 0x00, 0xB3, nullptr}, // Should be sent via CA instead @@ -2944,13 +2960,13 @@ const SubcommandDefinition subcommand_definitions[0x100] = { /* 6xB9 */ {0x00, 0x00, 0xB9, nullptr}, /* 6xBA */ {0x00, 0x00, 0xBA, on_accept_identify_item_bb}, /* 6xBB */ {0x00, 0x00, 0xBB, on_open_bank_bb_or_card_trade_counter_ep3}, - /* 6xBC */ {0x00, 0x00, 0xBC, on_forward_check_size_ep3_game}, + /* 6xBC */ {0x00, 0x00, 0xBC, on_forward_check_ep3_game}, /* 6xBD */ {0x00, 0x00, 0xBD, on_ep3_private_word_select_bb_bank_action, SDF::ALWAYS_FORWARD_TO_WATCHERS}, - /* 6xBE */ {0x00, 0x00, 0xBE, on_forward_check_size, SDF::ALWAYS_FORWARD_TO_WATCHERS | SDF::ALLOW_FORWARD_TO_WATCHED_LOBBY}, - /* 6xBF */ {0x00, 0x00, 0xBF, on_forward_check_size_ep3_lobby}, + /* 6xBE */ {0x00, 0x00, 0xBE, forward_subcommand, SDF::ALWAYS_FORWARD_TO_WATCHERS | SDF::ALLOW_FORWARD_TO_WATCHED_LOBBY}, + /* 6xBF */ {0x00, 0x00, 0xBF, on_forward_check_ep3_lobby}, /* 6xC0 */ {0x00, 0x00, 0xC0, on_sell_item_at_shop_bb}, - /* 6xC1 */ {0x00, 0x00, 0xC1, on_forward_check_size}, - /* 6xC2 */ {0x00, 0x00, 0xC2, on_forward_check_size}, + /* 6xC1 */ {0x00, 0x00, 0xC1, forward_subcommand}, + /* 6xC2 */ {0x00, 0x00, 0xC2, forward_subcommand}, /* 6xC3 */ {0x00, 0x00, 0xC3, on_drop_partial_stack_bb}, /* 6xC4 */ {0x00, 0x00, 0xC4, on_sort_inventory_bb}, /* 6xC5 */ {0x00, 0x00, 0xC5, on_medical_center_bb}, @@ -2961,8 +2977,8 @@ const SubcommandDefinition subcommand_definitions[0x100] = { /* 6xCA */ {0x00, 0x00, 0xCA, on_item_reward_request_bb}, /* 6xCB */ {0x00, 0x00, 0xCB, on_transfer_item_via_mail_message_bb}, /* 6xCC */ {0x00, 0x00, 0xCC, on_exchange_item_for_team_points_bb}, - /* 6xCD */ {0x00, 0x00, 0xCD, on_forward_check_size}, - /* 6xCE */ {0x00, 0x00, 0xCE, on_forward_check_size}, + /* 6xCD */ {0x00, 0x00, 0xCD, forward_subcommand}, + /* 6xCE */ {0x00, 0x00, 0xCE, forward_subcommand}, /* 6xCF */ {0x00, 0x00, 0xCF, on_battle_restart_bb}, /* 6xD0 */ {0x00, 0x00, 0xD0, on_battle_level_up_bb}, /* 6xD1 */ {0x00, 0x00, 0xD1, on_request_challenge_grave_recovery_item_bb}, @@ -2976,7 +2992,7 @@ const SubcommandDefinition subcommand_definitions[0x100] = { /* 6xD9 */ {0x00, 0x00, 0xD9, on_momoka_item_exchange_bb}, /* 6xDA */ {0x00, 0x00, 0xDA, on_upgrade_weapon_attribute_bb}, /* 6xDB */ {0x00, 0x00, 0xDB, nullptr}, - /* 6xDC */ {0x00, 0x00, 0xDC, on_forward_check_size_game}, + /* 6xDC */ {0x00, 0x00, 0xDC, on_forward_check_game}, /* 6xDD */ {0x00, 0x00, 0xDD, nullptr}, /* 6xDE */ {0x00, 0x00, 0xDE, on_secret_lottery_ticket_exchange_bb}, /* 6xDF */ {0x00, 0x00, 0xDF, on_photon_crystal_exchange_bb},