diff --git a/src/Client.cc b/src/Client.cc index e73278c4..f1950941 100644 --- a/src/Client.cc +++ b/src/Client.cc @@ -83,14 +83,14 @@ void Client::Config::set_flags_for_version(Version version, int64_t sub_version) } break; - case 0x20: // DCNTE, possibly also DCv1 JP + case 0x20: // DC NTE, 11/2000, possibly also DCv1 JP case 0x21: // DCv1 US case 0x22: // DCv1 EU, 12/2000, and 01/2001, at 50Hz (presumably) case 0x23: // DCv1 EU, 12/2000, and 01/2001, at 60Hz (presumably) this->set_flag(Flag::NO_D6); break; case 0x25: // DCv2 JP - case 0x26: // DCv2 US + case 0x26: // DCv2 US and 08/2001 case 0x27: // DCv2 EU 50Hz (presumably) case 0x28: // DCv2 EU 60Hz (presumably) this->set_flag(Flag::NO_D6); @@ -103,7 +103,7 @@ void Client::Config::set_flags_for_version(Version version, int64_t sub_version) this->set_flag(Flag::SEND_FUNCTION_CALL_CHECKSUM_ONLY); this->set_flag(Flag::SEND_FUNCTION_CALL_NO_CACHE_PATCH); break; - case 0x30: // GC Ep1&2 GameJam demo, GC Ep1&2 Trial Edition, GC Ep1&2 JP v1.2, at least one version of XB + case 0x30: // GC Ep1&2 GameJam demo, GC Ep1&2 Trial Edition, GC Ep1&2 JP v1.2, XB JP case 0x31: // GC Ep1&2 US v1.0, GC US v1.1, XB US this->set_flag(Flag::HAS_SEND_FUNCTION_CALL); break; @@ -119,7 +119,7 @@ void Client::Config::set_flags_for_version(Version version, int64_t sub_version) this->set_flag(Flag::ENCRYPTED_SEND_FUNCTION_CALL); this->set_flag(Flag::SEND_FUNCTION_CALL_NO_CACHE_PATCH); break; - case 0x3A: // GC Ep1&2 US v1.2 (Plus) GMK edition + case 0x3A: // GC Ep1&2 US v1.2 (Plus) Return to Ragol this->set_flag(Flag::IS_CLIENT_CUSTOMIZATION); [[fallthrough]]; case 0x36: // GC Ep1&2 US v1.2 (Plus) @@ -135,7 +135,7 @@ void Client::Config::set_flags_for_version(Version version, int64_t sub_version) // sub_version can't be used to tell JP final and Trial Edition apart; we // instead look at header.flag in the 61 command and set the version then. break; - case 0x41: // GC Ep3 US (and BB) + case 0x41: // GC Ep3 US (and BB, but BB is handled above) case 0x42: // GC Ep3 EU 50Hz case 0x43: // GC Ep3 EU 60Hz this->set_flag(Flag::NO_D6_AFTER_LOBBY); diff --git a/src/Episode3/Server.cc b/src/Episode3/Server.cc index eaf1658c..21746e98 100644 --- a/src/Episode3/Server.cc +++ b/src/Episode3/Server.cc @@ -376,8 +376,7 @@ void Server::send_debug_command_received_message(uint8_t subsubcommand, const ch this->send_debug_message_printf("$C5*/CAx%02hhX %s", subsubcommand, description); } -void Server::send_debug_message_if_error_code_nonzero( - uint8_t client_id, int32_t error_code) const { +void Server::send_debug_message_if_error_code_nonzero(uint8_t client_id, int32_t error_code) const { if (error_code < 0) { this->send_debug_message_printf("$C4%hhu/ERROR -0x%zX", client_id, static_cast(-error_code)); } else if (error_code > 0) { @@ -393,8 +392,7 @@ void Server::add_team_exp(uint8_t team_id, int32_t exp) { } } - this->team_exp[team_id] = clamp( - this->team_exp[team_id] + exp, 0, this->team_client_count[team_id] * 96); + this->team_exp[team_id] = clamp(this->team_exp[team_id] + exp, 0, this->team_client_count[team_id] * 96); uint8_t dice_boost = this->team_exp[team_id] / (this->team_client_count[team_id] * 12); this->card_special->adjust_dice_boost_if_team_has_condition_52(team_id, &dice_boost, 0); @@ -476,29 +474,7 @@ shared_ptr Server::card_for_set_card_ref(uint16_t card_ref) { } shared_ptr Server::card_for_set_card_ref(uint16_t card_ref) const { - // TODO: It'd be nice to deduplicate this function with the non-const version. - if (card_ref == 0xFFFF) { - return nullptr; - } - uint8_t client_id = client_id_for_card_ref(card_ref); - if (client_id == 0xFF) { - return nullptr; - } - auto ps = this->player_states.at(client_id); - if (!ps) { - return nullptr; - } - auto card = ps->get_sc_card(); - if (card && (card->get_card_ref() == card_ref)) { - return card; - } - for (size_t set_index = 0; set_index < 8; set_index++) { - card = ps->get_set_card(set_index); - if (card && (card->get_card_ref() == card_ref)) { - return card; - } - } - return nullptr; + return const_cast(this)->card_for_set_card_ref(card_ref); } uint16_t Server::card_id_for_card_ref(uint16_t card_ref) const { @@ -1861,8 +1837,7 @@ void Server::on_server_data_input(shared_ptr sender_c, const string& dat void Server::handle_CAx0B_mulligan_hand(shared_ptr, const string& data) { const auto& in_cmd = check_size_t(data); - this->send_debug_command_received_message( - in_cmd.client_id, in_cmd.header.subsubcommand, "REDRAW"); + this->send_debug_command_received_message(in_cmd.client_id, in_cmd.header.subsubcommand, "REDRAW"); if (in_cmd.client_id >= 4) { throw runtime_error("invalid client ID"); } @@ -1894,8 +1869,7 @@ void Server::handle_CAx0B_mulligan_hand(shared_ptr, const string& data) void Server::handle_CAx0C_end_mulligan_phase(shared_ptr, const string& data) { const auto& in_cmd = check_size_t(data); - this->send_debug_command_received_message( - in_cmd.client_id, in_cmd.header.subsubcommand, "SETUP ADV 2"); + this->send_debug_command_received_message(in_cmd.client_id, in_cmd.header.subsubcommand, "SETUP ADV 2"); if (in_cmd.client_id >= 4) { throw runtime_error("invalid client ID"); } @@ -1976,8 +1950,7 @@ void Server::handle_CAx0D_end_non_action_phase(shared_ptr, const string& void Server::handle_CAx0E_discard_card_from_hand(shared_ptr, const string& data) { const auto& in_cmd = check_size_t(data); - this->send_debug_command_received_message( - in_cmd.client_id, in_cmd.header.subsubcommand, "DISCARD"); + this->send_debug_command_received_message(in_cmd.client_id, in_cmd.header.subsubcommand, "DISCARD"); if (in_cmd.client_id >= 4) { throw runtime_error("invalid client ID"); } @@ -2062,8 +2035,7 @@ void Server::handle_CAx0F_set_card_from_hand(shared_ptr, const string& d void Server::handle_CAx10_move_fc_to_location(shared_ptr, const string& data) { const auto& in_cmd = check_size_t(data); - this->send_debug_command_received_message( - in_cmd.client_id, in_cmd.header.subsubcommand, "MOVE"); + this->send_debug_command_received_message(in_cmd.client_id, in_cmd.header.subsubcommand, "MOVE"); if (in_cmd.client_id >= 4) { throw runtime_error("invalid client ID"); } @@ -2103,8 +2075,7 @@ void Server::handle_CAx10_move_fc_to_location(shared_ptr, const string& void Server::handle_CAx11_enqueue_attack_or_defense(shared_ptr, const string& data) { const auto& in_cmd = check_size_t(data); - this->send_debug_command_received_message( - in_cmd.client_id, in_cmd.header.subsubcommand, "ENQUEUE ACT"); + this->send_debug_command_received_message(in_cmd.client_id, in_cmd.header.subsubcommand, "ENQUEUE ACT"); if (in_cmd.client_id >= 4) { throw runtime_error("invalid client ID"); } @@ -2142,8 +2113,7 @@ void Server::handle_CAx11_enqueue_attack_or_defense(shared_ptr, const st void Server::handle_CAx12_end_attack_list(shared_ptr, const string& data) { const auto& in_cmd = check_size_t(data); - this->send_debug_command_received_message( - in_cmd.client_id, in_cmd.header.subsubcommand, "END ATK LIST"); + this->send_debug_command_received_message(in_cmd.client_id, in_cmd.header.subsubcommand, "END ATK LIST"); if (in_cmd.client_id >= 4) { throw runtime_error("invalid client ID"); } @@ -2238,8 +2208,7 @@ void Server::handle_CAx13_update_map_during_setup(shared_ptr c, const st void Server::handle_CAx14_update_deck_during_setup(shared_ptr, const string& data) { const auto& in_cmd = check_size_t(data); - this->send_debug_command_received_message( - in_cmd.client_id, in_cmd.header.subsubcommand, "UPDATE DECK"); + this->send_debug_command_received_message(in_cmd.client_id, in_cmd.header.subsubcommand, "UPDATE DECK"); if (!this->battle_in_progress) { if ((this->setup_phase == SetupPhase::REGISTRATION) && @@ -2285,8 +2254,7 @@ void Server::handle_CAx14_update_deck_during_setup(shared_ptr, const str void Server::handle_CAx15_unused_hard_reset_server_state(shared_ptr, const string& data) { const auto& in_cmd = check_size_t(data); - this->send_debug_command_received_message( - in_cmd.header.subsubcommand, "HARD RESET"); + this->send_debug_command_received_message(in_cmd.header.subsubcommand, "HARD RESET"); // In the original implementation, this command recreates the server object. // This is possible because the dispatch function is not part of the server @@ -2303,8 +2271,7 @@ void Server::handle_CAx15_unused_hard_reset_server_state(shared_ptr, con void Server::handle_CAx1B_update_player_name(shared_ptr, const string& data) { const auto& in_cmd = check_size_t(data); - this->send_debug_command_received_message( - in_cmd.entry.client_id, in_cmd.header.subsubcommand, "UPDATE NAME"); + this->send_debug_command_received_message(in_cmd.entry.client_id, in_cmd.header.subsubcommand, "UPDATE NAME"); if (in_cmd.entry.client_id < 4) { if (!this->is_registration_complete()) { @@ -2335,8 +2302,7 @@ void Server::handle_CAx1B_update_player_name(shared_ptr, const string& d void Server::handle_CAx1D_start_battle(shared_ptr, const string& data) { const auto& in_cmd = check_size_t(data); - this->send_debug_command_received_message( - in_cmd.header.subsubcommand, "START BATTLE"); + this->send_debug_command_received_message(in_cmd.header.subsubcommand, "START BATTLE"); if (!this->battle_in_progress) { bool is_nte = this->options.is_nte(); @@ -2382,8 +2348,7 @@ void Server::handle_CAx1D_start_battle(shared_ptr, const string& data) { void Server::handle_CAx21_end_battle(shared_ptr, const string& data) { const auto& in_cmd = check_size_t(data); - this->send_debug_command_received_message( - in_cmd.header.subsubcommand, "END BATTLE"); + this->send_debug_command_received_message(in_cmd.header.subsubcommand, "END BATTLE"); if (this->setup_phase == SetupPhase::BATTLE_ENDED) { this->battle_finished = true; @@ -2397,8 +2362,7 @@ void Server::handle_CAx21_end_battle(shared_ptr, const string& data) { void Server::handle_CAx28_end_defense_list(shared_ptr, const string& data) { const auto& in_cmd = check_size_t(data); - this->send_debug_command_received_message( - in_cmd.client_id, in_cmd.header.subsubcommand, "END DEF LIST"); + this->send_debug_command_received_message(in_cmd.client_id, in_cmd.header.subsubcommand, "END DEF LIST"); if (in_cmd.client_id >= 4) { throw runtime_error("invalid client ID"); } @@ -2458,8 +2422,7 @@ void Server::handle_CAx34_subtract_ally_atk_points(shared_ptr, const str const auto& in_cmd = check_size_t(data); uint8_t card_ref_client_id = client_id_for_card_ref(in_cmd.card_ref); - this->send_debug_command_received_message( - card_ref_client_id, in_cmd.header.subsubcommand, "SUB ALLY ATK"); + this->send_debug_command_received_message(card_ref_client_id, in_cmd.header.subsubcommand, "SUB ALLY ATK"); if (card_ref_client_id >= 4) { return; @@ -2532,8 +2495,7 @@ void Server::handle_CAx34_subtract_ally_atk_points(shared_ptr, const str void Server::handle_CAx37_client_ready_to_advance_from_starter_roll_phase(shared_ptr, const string& data) { const auto& in_cmd = check_size_t(data); - this->send_debug_command_received_message( - in_cmd.client_id, in_cmd.header.subsubcommand, "SETUP ADV 1"); + this->send_debug_command_received_message(in_cmd.client_id, in_cmd.header.subsubcommand, "SETUP ADV 1"); if (in_cmd.client_id >= 4) { throw runtime_error("invalid client ID"); } @@ -2653,8 +2615,7 @@ void Server::handle_CAx41_map_request(shared_ptr, const string& data) { void Server::handle_CAx48_end_turn(shared_ptr, const string& data) { const auto& in_cmd = check_size_t(data); - this->send_debug_command_received_message( - in_cmd.client_id, in_cmd.header.subsubcommand, "END TURN"); + this->send_debug_command_received_message(in_cmd.client_id, in_cmd.header.subsubcommand, "END TURN"); if (in_cmd.client_id >= 4) { throw runtime_error("invalid client ID"); } @@ -2671,8 +2632,7 @@ void Server::handle_CAx48_end_turn(shared_ptr, const string& data) { void Server::handle_CAx49_card_counts(shared_ptr, const string& data) { const auto& in_cmd = check_size_t(data); - this->send_debug_command_received_message( - in_cmd.header.sender_client_id, in_cmd.header.subsubcommand, "CARD COUNTS"); + this->send_debug_command_received_message(in_cmd.header.sender_client_id, in_cmd.header.subsubcommand, "CARD COUNTS"); // Note: Sega's implmentation completely ignores this command. This // implementation is not based on the original code. diff --git a/src/ItemCreator.cc b/src/ItemCreator.cc index d2786671..1674e2e5 100644 --- a/src/ItemCreator.cc +++ b/src/ItemCreator.cc @@ -558,7 +558,7 @@ void ItemCreator::clear_item_if_restricted(ItemData& item) const { break; case BattleRules::WeaponAndArmorMode::FORBID_RARES: if (this->item_parameter_table->is_item_rare(item)) { - this->log.info("Restricted: rare items not allowed"); + this->log.info("Restricted: rare weapons and armors not allowed"); item.clear(); } break; diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index fc5483bf..c95d5c10 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -4634,6 +4634,10 @@ static void on_write_quest_counter_bb(shared_ptr c, uint8_t, uint8_t, vo //////////////////////////////////////////////////////////////////////////////// +// This makes it easier to see which handlers exist on which prototypes via +// syntax highlighting +constexpr uint8_t NONE = 0x00; + const SubcommandDefinition subcommand_definitions[0x100] = { /* 6x00 */ {0x00, 0x00, 0x00, on_invalid}, /* 6x01 */ {0x01, 0x01, 0x01, on_invalid}, @@ -4648,9 +4652,9 @@ const SubcommandDefinition subcommand_definitions[0x100] = { /* 6x0A */ {0x0A, 0x0A, 0x0A, on_update_enemy_state}, /* 6x0B */ {0x0B, 0x0B, 0x0B, on_update_object_state}, /* 6x0C */ {0x0C, 0x0C, 0x0C, on_received_condition}, - /* 6x0D */ {0x00, 0x00, 0x0D, on_forward_check_game}, - /* 6x0E */ {0x00, 0x00, 0x0E, on_forward_check_game}, - /* 6x0F */ {0x00, 0x00, 0x0F, on_invalid}, + /* 6x0D */ {NONE, NONE, 0x0D, on_forward_check_game}, + /* 6x0E */ {NONE, NONE, 0x0E, on_forward_check_game}, + /* 6x0F */ {NONE, NONE, 0x0F, on_invalid}, /* 6x10 */ {0x0E, 0x0E, 0x10, on_forward_check_game}, /* 6x11 */ {0x0F, 0x0F, 0x11, on_forward_check_game}, /* 6x12 */ {0x10, 0x10, 0x12, on_dragon_actions}, @@ -4661,9 +4665,9 @@ const SubcommandDefinition subcommand_definitions[0x100] = { /* 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_game}, - /* 6x1C */ {0x00, 0x1A, 0x1C, on_forward_check_game}, + /* 6x1A */ {NONE, NONE, 0x1A, on_invalid}, + /* 6x1B */ {NONE, 0x19, 0x1B, on_forward_check_game}, + /* 6x1C */ {NONE, 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}, @@ -4685,19 +4689,19 @@ const SubcommandDefinition subcommand_definitions[0x100] = { /* 6x2F */ {0x2B, 0x2D, 0x2F, on_change_hp}, /* 6x30 */ {0x2C, 0x2E, 0x30, on_level_up}, /* 6x31 */ {0x2D, 0x2F, 0x31, on_forward_check_game}, - /* 6x32 */ {0x00, 0x00, 0x32, on_forward_check_game}, + /* 6x32 */ {NONE, NONE, 0x32, on_forward_check_game}, /* 6x33 */ {0x2E, 0x30, 0x33, on_forward_check_game}, /* 6x34 */ {0x2F, 0x31, 0x34, on_forward_check_game}, /* 6x35 */ {0x30, 0x32, 0x35, on_invalid}, - /* 6x36 */ {0x00, 0x00, 0x36, on_forward_check_game}, + /* 6x36 */ {NONE, NONE, 0x36, on_forward_check_game}, /* 6x37 */ {0x32, 0x33, 0x37, on_forward_check_game}, /* 6x38 */ {0x33, 0x34, 0x38, on_forward_check_game}, - /* 6x39 */ {0x00, 0x36, 0x39, on_forward_check_game}, - /* 6x3A */ {0x00, 0x37, 0x3A, on_forward_check_game}, - /* 6x3B */ {0x00, 0x38, 0x3B, forward_subcommand_m}, + /* 6x39 */ {NONE, 0x36, 0x39, on_forward_check_game}, + /* 6x3A */ {NONE, 0x37, 0x3A, on_forward_check_game}, + /* 6x3B */ {NONE, 0x38, 0x3B, forward_subcommand_m}, /* 6x3C */ {0x34, 0x39, 0x3C, forward_subcommand_m}, - /* 6x3D */ {0x00, 0x00, 0x3D, on_invalid}, - /* 6x3E */ {0x00, 0x00, 0x3E, on_movement_with_floor}, + /* 6x3D */ {NONE, NONE, 0x3D, on_invalid}, + /* 6x3E */ {NONE, NONE, 0x3E, on_movement_with_floor}, /* 6x3F */ {0x36, 0x3B, 0x3F, on_movement_with_floor}, /* 6x40 */ {0x37, 0x3C, 0x40, on_movement}, /* 6x41 */ {0x38, 0x3D, 0x41, forward_subcommand_m}, @@ -4705,25 +4709,25 @@ const SubcommandDefinition subcommand_definitions[0x100] = { /* 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}, + /* 6x46 */ {NONE, 0x42, 0x46, on_attack_finished}, /* 6x47 */ {0x3D, 0x43, 0x47, on_cast_technique}, - /* 6x48 */ {0x00, 0x00, 0x48, on_cast_technique_finished}, + /* 6x48 */ {NONE, NONE, 0x48, on_cast_technique_finished}, /* 6x49 */ {0x3E, 0x44, 0x49, on_execute_photon_blast}, /* 6x4A */ {0x3F, 0x45, 0x4A, on_forward_check_game_client}, /* 6x4B */ {0x40, 0x46, 0x4B, on_change_hp}, /* 6x4C */ {0x41, 0x47, 0x4C, on_change_hp}, /* 6x4D */ {0x42, 0x48, 0x4D, on_player_died}, - /* 6x4E */ {0x00, 0x00, 0x4E, on_player_revivable}, + /* 6x4E */ {NONE, NONE, 0x4E, on_player_revivable}, /* 6x4F */ {0x43, 0x49, 0x4F, on_player_revived}, /* 6x50 */ {0x44, 0x4A, 0x50, on_forward_check_game_client}, - /* 6x51 */ {0x00, 0x00, 0x51, on_invalid}, + /* 6x51 */ {NONE, NONE, 0x51, on_invalid}, /* 6x52 */ {0x46, 0x4C, 0x52, on_set_animation_state}, /* 6x53 */ {0x47, 0x4D, 0x53, on_forward_check_game}, /* 6x54 */ {0x48, 0x4E, 0x54, forward_subcommand_m}, /* 6x55 */ {0x49, 0x4F, 0x55, on_forward_check_game_client}, /* 6x56 */ {0x4A, 0x50, 0x56, on_forward_check_game_client}, - /* 6x57 */ {0x00, 0x51, 0x57, on_forward_check_client}, - /* 6x58 */ {0x00, 0x00, 0x58, on_forward_check_client}, + /* 6x57 */ {NONE, 0x51, 0x57, on_forward_check_client}, + /* 6x58 */ {NONE, NONE, 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, forward_subcommand_m}, @@ -4737,7 +4741,7 @@ const SubcommandDefinition subcommand_definitions[0x100] = { /* 6x63 */ {0x55, 0x5C, 0x63, on_destroy_floor_item}, /* 6x64 */ {0x56, 0x5D, 0x64, on_forward_check_game}, /* 6x65 */ {0x57, 0x5E, 0x65, on_forward_check_game}, - /* 6x66 */ {0x00, 0x00, 0x66, on_forward_check_game}, + /* 6x66 */ {NONE, NONE, 0x66, on_forward_check_game}, /* 6x67 */ {0x58, 0x5F, 0x67, on_trigger_set_event}, /* 6x68 */ {0x59, 0x60, 0x68, on_update_telepipe_state}, /* 6x69 */ {0x5A, 0x61, 0x69, on_npc_control}, @@ -4746,151 +4750,151 @@ const SubcommandDefinition subcommand_definitions[0x100] = { /* 6x6C */ {0x5D, 0x64, 0x6C, on_sync_joining_player_compressed_state}, /* 6x6D */ {0x5E, 0x65, 0x6D, on_sync_joining_player_compressed_state}, /* 6x6E */ {0x5F, 0x66, 0x6E, on_sync_joining_player_compressed_state}, - /* 6x6F */ {0x00, 0x00, 0x6F, on_sync_joining_player_quest_flags}, + /* 6x6F */ {NONE, NONE, 0x6F, on_sync_joining_player_quest_flags}, /* 6x70 */ {0x60, 0x67, 0x70, on_sync_joining_player_disp_and_inventory}, - /* 6x71 */ {0x00, 0x00, 0x71, on_forward_check_game_loading}, + /* 6x71 */ {NONE, NONE, 0x71, on_forward_check_game_loading}, /* 6x72 */ {0x61, 0x68, 0x72, on_forward_check_game_loading}, - /* 6x73 */ {0x00, 0x00, 0x73, on_forward_check_game_quest}, + /* 6x73 */ {NONE, NONE, 0x73, on_forward_check_game_quest}, /* 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_set_entity_set_flag}, - /* 6x77 */ {0x00, 0x00, 0x77, on_sync_quest_register}, - /* 6x78 */ {0x00, 0x00, 0x78, forward_subcommand_m}, - /* 6x79 */ {0x00, 0x00, 0x79, on_forward_check_lobby}, - /* 6x7A */ {0x00, 0x00, 0x7A, on_forward_check_game_client}, - /* 6x7B */ {0x00, 0x00, 0x7B, forward_subcommand_m}, - /* 6x7C */ {0x00, 0x00, 0x7C, on_challenge_update_records}, - /* 6x7D */ {0x00, 0x00, 0x7D, on_forward_check_game}, - /* 6x7E */ {0x00, 0x00, 0x7E, forward_subcommand_m}, - /* 6x7F */ {0x00, 0x00, 0x7F, on_battle_scores}, - /* 6x80 */ {0x00, 0x00, 0x80, on_forward_check_game}, - /* 6x81 */ {0x00, 0x00, 0x81, on_forward_check_game}, - /* 6x82 */ {0x00, 0x00, 0x82, on_forward_check_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, on_forward_check_game}, - /* 6x8C */ {0x00, 0x00, 0x8C, on_forward_check_game}, - /* 6x8D */ {0x00, 0x00, 0x8D, on_forward_check_game_client}, - /* 6x8E */ {0x00, 0x00, 0x8E, on_forward_check_game}, - /* 6x8F */ {0x00, 0x00, 0x8F, on_forward_check_game}, - /* 6x90 */ {0x00, 0x00, 0x90, on_forward_check_game}, - /* 6x91 */ {0x00, 0x00, 0x91, on_unknown_6x91}, - /* 6x92 */ {0x00, 0x00, 0x92, on_forward_check_game}, - /* 6x93 */ {0x00, 0x00, 0x93, on_activate_timed_switch}, - /* 6x94 */ {0x00, 0x00, 0x94, on_warp}, - /* 6x95 */ {0x00, 0x00, 0x95, on_forward_check_game}, - /* 6x96 */ {0x00, 0x00, 0x96, on_forward_check_game}, - /* 6x97 */ {0x00, 0x00, 0x97, on_challenge_mode_retry_or_quit}, - /* 6x98 */ {0x00, 0x00, 0x98, on_forward_check_game}, - /* 6x99 */ {0x00, 0x00, 0x99, on_forward_check_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, forward_subcommand_m}, - /* 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_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, forward_subcommand_m}, - /* 6xA8 */ {0x00, 0x00, 0xA8, on_gol_dragon_actions}, - /* 6xA9 */ {0x00, 0x00, 0xA9, on_forward_check_game}, - /* 6xAA */ {0x00, 0x00, 0xAA, on_forward_check_game}, - /* 6xAB */ {0x00, 0x00, 0xAB, on_gc_nte_exclusive}, - /* 6xAC */ {0x00, 0x00, 0xAC, on_gc_nte_exclusive}, - /* 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, forward_subcommand_m}, - /* 6xB2 */ {0x00, 0x00, 0xB2, on_play_sound_from_player}, - /* 6xB3 */ {0x00, 0x00, 0xB3, on_xbox_voice_chat_control}, - /* 6xB4 */ {0x00, 0x00, 0xB4, on_xbox_voice_chat_control}, - /* 6xB5 */ {0x00, 0x00, 0xB5, on_open_shop_bb_or_ep3_battle_subs}, - /* 6xB6 */ {0x00, 0x00, 0xB6, on_invalid}, - /* 6xB7 */ {0x00, 0x00, 0xB7, on_buy_shop_item_bb}, - /* 6xB8 */ {0x00, 0x00, 0xB8, on_identify_item_bb}, - /* 6xB9 */ {0x00, 0x00, 0xB9, on_invalid}, - /* 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_ep3_game}, - /* 6xBD */ {0x00, 0x00, 0xBD, on_ep3_private_word_select_bb_bank_action, SDF::ALWAYS_FORWARD_TO_WATCHERS}, - /* 6xBE */ {0x00, 0x00, 0xBE, forward_subcommand_m, 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, forward_subcommand_m}, - /* 6xC2 */ {0x00, 0x00, 0xC2, forward_subcommand_m}, - /* 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}, - /* 6xC6 */ {0x00, 0x00, 0xC6, on_steal_exp_bb}, - /* 6xC7 */ {0x00, 0x00, 0xC7, on_charge_attack_bb}, - /* 6xC8 */ {0x00, 0x00, 0xC8, on_enemy_exp_request_bb}, - /* 6xC9 */ {0x00, 0x00, 0xC9, on_adjust_player_meseta_bb}, - /* 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, forward_subcommand_m}, - /* 6xCE */ {0x00, 0x00, 0xCE, forward_subcommand_m}, - /* 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}, - /* 6xD2 */ {0x00, 0x00, 0xD2, on_write_quest_counter_bb}, - /* 6xD3 */ {0x00, 0x00, 0xD3, on_invalid}, - /* 6xD4 */ {0x00, 0x00, 0xD4, on_forward_check_game}, - /* 6xD5 */ {0x00, 0x00, 0xD5, on_quest_exchange_item_bb}, - /* 6xD6 */ {0x00, 0x00, 0xD6, on_wrap_item_bb}, - /* 6xD7 */ {0x00, 0x00, 0xD7, on_photon_drop_exchange_for_item_bb}, - /* 6xD8 */ {0x00, 0x00, 0xD8, on_photon_drop_exchange_for_s_rank_special_bb}, - /* 6xD9 */ {0x00, 0x00, 0xD9, on_momoka_item_exchange_bb}, - /* 6xDA */ {0x00, 0x00, 0xDA, on_upgrade_weapon_attribute_bb}, - /* 6xDB */ {0x00, 0x00, 0xDB, on_invalid}, - /* 6xDC */ {0x00, 0x00, 0xDC, on_forward_check_game}, - /* 6xDD */ {0x00, 0x00, 0xDD, on_invalid}, - /* 6xDE */ {0x00, 0x00, 0xDE, on_secret_lottery_ticket_exchange_bb}, - /* 6xDF */ {0x00, 0x00, 0xDF, on_photon_crystal_exchange_bb}, - /* 6xE0 */ {0x00, 0x00, 0xE0, on_quest_F95E_result_bb}, - /* 6xE1 */ {0x00, 0x00, 0xE1, on_quest_F95F_result_bb}, - /* 6xE2 */ {0x00, 0x00, 0xE2, on_quest_F960_result_bb}, - /* 6xE3 */ {0x00, 0x00, 0xE3, on_invalid}, - /* 6xE4 */ {0x00, 0x00, 0xE4, on_invalid}, - /* 6xE5 */ {0x00, 0x00, 0xE5, on_invalid}, - /* 6xE6 */ {0x00, 0x00, 0xE6, on_invalid}, - /* 6xE7 */ {0x00, 0x00, 0xE7, on_invalid}, - /* 6xE8 */ {0x00, 0x00, 0xE8, on_invalid}, - /* 6xE9 */ {0x00, 0x00, 0xE9, on_invalid}, - /* 6xEA */ {0x00, 0x00, 0xEA, on_invalid}, - /* 6xEB */ {0x00, 0x00, 0xEB, on_invalid}, - /* 6xEC */ {0x00, 0x00, 0xEC, on_invalid}, - /* 6xED */ {0x00, 0x00, 0xED, on_invalid}, - /* 6xEE */ {0x00, 0x00, 0xEE, on_invalid}, - /* 6xEF */ {0x00, 0x00, 0xEF, on_invalid}, - /* 6xF0 */ {0x00, 0x00, 0xF0, on_invalid}, - /* 6xF1 */ {0x00, 0x00, 0xF1, on_invalid}, - /* 6xF2 */ {0x00, 0x00, 0xF2, on_invalid}, - /* 6xF3 */ {0x00, 0x00, 0xF3, on_invalid}, - /* 6xF4 */ {0x00, 0x00, 0xF4, on_invalid}, - /* 6xF5 */ {0x00, 0x00, 0xF5, on_invalid}, - /* 6xF6 */ {0x00, 0x00, 0xF6, on_invalid}, - /* 6xF7 */ {0x00, 0x00, 0xF7, on_invalid}, - /* 6xF8 */ {0x00, 0x00, 0xF8, on_invalid}, - /* 6xF9 */ {0x00, 0x00, 0xF9, on_invalid}, - /* 6xFA */ {0x00, 0x00, 0xFA, on_invalid}, - /* 6xFB */ {0x00, 0x00, 0xFB, on_invalid}, - /* 6xFC */ {0x00, 0x00, 0xFC, on_invalid}, - /* 6xFD */ {0x00, 0x00, 0xFD, on_invalid}, - /* 6xFE */ {0x00, 0x00, 0xFE, on_invalid}, - /* 6xFF */ {0x00, 0x00, 0xFF, on_invalid}, + /* 6x75 */ {NONE, NONE, 0x75, on_set_quest_flag}, + /* 6x76 */ {NONE, NONE, 0x76, on_set_entity_set_flag}, + /* 6x77 */ {NONE, NONE, 0x77, on_sync_quest_register}, + /* 6x78 */ {NONE, NONE, 0x78, forward_subcommand_m}, + /* 6x79 */ {NONE, NONE, 0x79, on_forward_check_lobby}, + /* 6x7A */ {NONE, NONE, 0x7A, on_forward_check_game_client}, + /* 6x7B */ {NONE, NONE, 0x7B, forward_subcommand_m}, + /* 6x7C */ {NONE, NONE, 0x7C, on_challenge_update_records}, + /* 6x7D */ {NONE, NONE, 0x7D, on_forward_check_game}, + /* 6x7E */ {NONE, NONE, 0x7E, forward_subcommand_m}, + /* 6x7F */ {NONE, NONE, 0x7F, on_battle_scores}, + /* 6x80 */ {NONE, NONE, 0x80, on_forward_check_game}, + /* 6x81 */ {NONE, NONE, 0x81, on_forward_check_game}, + /* 6x82 */ {NONE, NONE, 0x82, on_forward_check_game}, + /* 6x83 */ {NONE, NONE, 0x83, on_forward_check_game}, + /* 6x84 */ {NONE, NONE, 0x84, on_forward_check_game}, + /* 6x85 */ {NONE, NONE, 0x85, on_forward_check_game}, + /* 6x86 */ {NONE, NONE, 0x86, on_forward_check_game}, + /* 6x87 */ {NONE, NONE, 0x87, on_forward_check_game}, + /* 6x88 */ {NONE, NONE, 0x88, on_forward_check_game}, + /* 6x89 */ {NONE, NONE, 0x89, on_forward_check_game}, + /* 6x8A */ {NONE, NONE, 0x8A, on_forward_check_game}, + /* 6x8B */ {NONE, NONE, 0x8B, on_forward_check_game}, + /* 6x8C */ {NONE, NONE, 0x8C, on_forward_check_game}, + /* 6x8D */ {NONE, NONE, 0x8D, on_forward_check_game_client}, + /* 6x8E */ {NONE, NONE, 0x8E, on_forward_check_game}, + /* 6x8F */ {NONE, NONE, 0x8F, on_forward_check_game}, + /* 6x90 */ {NONE, NONE, 0x90, on_forward_check_game}, + /* 6x91 */ {NONE, NONE, 0x91, on_unknown_6x91}, + /* 6x92 */ {NONE, NONE, 0x92, on_forward_check_game}, + /* 6x93 */ {NONE, NONE, 0x93, on_activate_timed_switch}, + /* 6x94 */ {NONE, NONE, 0x94, on_warp}, + /* 6x95 */ {NONE, NONE, 0x95, on_forward_check_game}, + /* 6x96 */ {NONE, NONE, 0x96, on_forward_check_game}, + /* 6x97 */ {NONE, NONE, 0x97, on_challenge_mode_retry_or_quit}, + /* 6x98 */ {NONE, NONE, 0x98, on_forward_check_game}, + /* 6x99 */ {NONE, NONE, 0x99, on_forward_check_game}, + /* 6x9A */ {NONE, NONE, 0x9A, on_forward_check_game_client}, + /* 6x9B */ {NONE, NONE, 0x9B, on_forward_check_game}, + /* 6x9C */ {NONE, NONE, 0x9C, on_forward_check_game}, + /* 6x9D */ {NONE, NONE, 0x9D, on_forward_check_game}, + /* 6x9E */ {NONE, NONE, 0x9E, forward_subcommand_m}, + /* 6x9F */ {NONE, NONE, 0x9F, on_forward_check_game}, + /* 6xA0 */ {NONE, NONE, 0xA0, on_forward_check_game}, + /* 6xA1 */ {NONE, NONE, 0xA1, on_forward_check_game}, + /* 6xA2 */ {NONE, NONE, 0xA2, on_entity_drop_item_request}, + /* 6xA3 */ {NONE, NONE, 0xA3, on_forward_check_game}, + /* 6xA4 */ {NONE, NONE, 0xA4, on_forward_check_game}, + /* 6xA5 */ {NONE, NONE, 0xA5, on_forward_check_game}, + /* 6xA6 */ {NONE, NONE, 0xA6, on_forward_check_game}, + /* 6xA7 */ {NONE, NONE, 0xA7, forward_subcommand_m}, + /* 6xA8 */ {NONE, NONE, 0xA8, on_gol_dragon_actions}, + /* 6xA9 */ {NONE, NONE, 0xA9, on_forward_check_game}, + /* 6xAA */ {NONE, NONE, 0xAA, on_forward_check_game}, + /* 6xAB */ {NONE, NONE, 0xAB, on_gc_nte_exclusive}, + /* 6xAC */ {NONE, NONE, 0xAC, on_gc_nte_exclusive}, + /* 6xAD */ {NONE, NONE, 0xAD, on_forward_check_game}, + /* 6xAE */ {NONE, NONE, 0xAE, on_forward_check_client}, + /* 6xAF */ {NONE, NONE, 0xAF, on_forward_check_lobby_client}, + /* 6xB0 */ {NONE, NONE, 0xB0, on_forward_check_lobby_client}, + /* 6xB1 */ {NONE, NONE, 0xB1, forward_subcommand_m}, + /* 6xB2 */ {NONE, NONE, 0xB2, on_play_sound_from_player}, + /* 6xB3 */ {NONE, NONE, 0xB3, on_xbox_voice_chat_control}, // Ep3 6xBx commands are handled via on_CA_Ep3 instead + /* 6xB4 */ {NONE, NONE, 0xB4, on_xbox_voice_chat_control}, + /* 6xB5 */ {NONE, NONE, 0xB5, on_open_shop_bb_or_ep3_battle_subs}, + /* 6xB6 */ {NONE, NONE, 0xB6, on_invalid}, + /* 6xB7 */ {NONE, NONE, 0xB7, on_buy_shop_item_bb}, + /* 6xB8 */ {NONE, NONE, 0xB8, on_identify_item_bb}, + /* 6xB9 */ {NONE, NONE, 0xB9, on_invalid}, + /* 6xBA */ {NONE, NONE, 0xBA, on_accept_identify_item_bb}, + /* 6xBB */ {NONE, NONE, 0xBB, on_open_bank_bb_or_card_trade_counter_ep3}, + /* 6xBC */ {NONE, NONE, 0xBC, on_forward_check_ep3_game}, + /* 6xBD */ {NONE, NONE, 0xBD, on_ep3_private_word_select_bb_bank_action, SDF::ALWAYS_FORWARD_TO_WATCHERS}, + /* 6xBE */ {NONE, NONE, 0xBE, forward_subcommand_m, SDF::ALWAYS_FORWARD_TO_WATCHERS | SDF::ALLOW_FORWARD_TO_WATCHED_LOBBY}, + /* 6xBF */ {NONE, NONE, 0xBF, on_forward_check_ep3_lobby}, + /* 6xC0 */ {NONE, NONE, 0xC0, on_sell_item_at_shop_bb}, + /* 6xC1 */ {NONE, NONE, 0xC1, forward_subcommand_m}, + /* 6xC2 */ {NONE, NONE, 0xC2, forward_subcommand_m}, + /* 6xC3 */ {NONE, NONE, 0xC3, on_drop_partial_stack_bb}, + /* 6xC4 */ {NONE, NONE, 0xC4, on_sort_inventory_bb}, + /* 6xC5 */ {NONE, NONE, 0xC5, on_medical_center_bb}, + /* 6xC6 */ {NONE, NONE, 0xC6, on_steal_exp_bb}, + /* 6xC7 */ {NONE, NONE, 0xC7, on_charge_attack_bb}, + /* 6xC8 */ {NONE, NONE, 0xC8, on_enemy_exp_request_bb}, + /* 6xC9 */ {NONE, NONE, 0xC9, on_adjust_player_meseta_bb}, + /* 6xCA */ {NONE, NONE, 0xCA, on_item_reward_request_bb}, + /* 6xCB */ {NONE, NONE, 0xCB, on_transfer_item_via_mail_message_bb}, + /* 6xCC */ {NONE, NONE, 0xCC, on_exchange_item_for_team_points_bb}, + /* 6xCD */ {NONE, NONE, 0xCD, forward_subcommand_m}, + /* 6xCE */ {NONE, NONE, 0xCE, forward_subcommand_m}, + /* 6xCF */ {NONE, NONE, 0xCF, on_battle_restart_bb}, + /* 6xD0 */ {NONE, NONE, 0xD0, on_battle_level_up_bb}, + /* 6xD1 */ {NONE, NONE, 0xD1, on_request_challenge_grave_recovery_item_bb}, + /* 6xD2 */ {NONE, NONE, 0xD2, on_write_quest_counter_bb}, + /* 6xD3 */ {NONE, NONE, 0xD3, on_invalid}, + /* 6xD4 */ {NONE, NONE, 0xD4, on_forward_check_game}, + /* 6xD5 */ {NONE, NONE, 0xD5, on_quest_exchange_item_bb}, + /* 6xD6 */ {NONE, NONE, 0xD6, on_wrap_item_bb}, + /* 6xD7 */ {NONE, NONE, 0xD7, on_photon_drop_exchange_for_item_bb}, + /* 6xD8 */ {NONE, NONE, 0xD8, on_photon_drop_exchange_for_s_rank_special_bb}, + /* 6xD9 */ {NONE, NONE, 0xD9, on_momoka_item_exchange_bb}, + /* 6xDA */ {NONE, NONE, 0xDA, on_upgrade_weapon_attribute_bb}, + /* 6xDB */ {NONE, NONE, 0xDB, on_invalid}, + /* 6xDC */ {NONE, NONE, 0xDC, on_forward_check_game}, + /* 6xDD */ {NONE, NONE, 0xDD, on_invalid}, + /* 6xDE */ {NONE, NONE, 0xDE, on_secret_lottery_ticket_exchange_bb}, + /* 6xDF */ {NONE, NONE, 0xDF, on_photon_crystal_exchange_bb}, + /* 6xE0 */ {NONE, NONE, 0xE0, on_quest_F95E_result_bb}, + /* 6xE1 */ {NONE, NONE, 0xE1, on_quest_F95F_result_bb}, + /* 6xE2 */ {NONE, NONE, 0xE2, on_quest_F960_result_bb}, + /* 6xE3 */ {NONE, NONE, 0xE3, on_invalid}, + /* 6xE4 */ {NONE, NONE, 0xE4, on_invalid}, + /* 6xE5 */ {NONE, NONE, 0xE5, on_invalid}, + /* 6xE6 */ {NONE, NONE, 0xE6, on_invalid}, + /* 6xE7 */ {NONE, NONE, 0xE7, on_invalid}, + /* 6xE8 */ {NONE, NONE, 0xE8, on_invalid}, + /* 6xE9 */ {NONE, NONE, 0xE9, on_invalid}, + /* 6xEA */ {NONE, NONE, 0xEA, on_invalid}, + /* 6xEB */ {NONE, NONE, 0xEB, on_invalid}, + /* 6xEC */ {NONE, NONE, 0xEC, on_invalid}, + /* 6xED */ {NONE, NONE, 0xED, on_invalid}, + /* 6xEE */ {NONE, NONE, 0xEE, on_invalid}, + /* 6xEF */ {NONE, NONE, 0xEF, on_invalid}, + /* 6xF0 */ {NONE, NONE, 0xF0, on_invalid}, + /* 6xF1 */ {NONE, NONE, 0xF1, on_invalid}, + /* 6xF2 */ {NONE, NONE, 0xF2, on_invalid}, + /* 6xF3 */ {NONE, NONE, 0xF3, on_invalid}, + /* 6xF4 */ {NONE, NONE, 0xF4, on_invalid}, + /* 6xF5 */ {NONE, NONE, 0xF5, on_invalid}, + /* 6xF6 */ {NONE, NONE, 0xF6, on_invalid}, + /* 6xF7 */ {NONE, NONE, 0xF7, on_invalid}, + /* 6xF8 */ {NONE, NONE, 0xF8, on_invalid}, + /* 6xF9 */ {NONE, NONE, 0xF9, on_invalid}, + /* 6xFA */ {NONE, NONE, 0xFA, on_invalid}, + /* 6xFB */ {NONE, NONE, 0xFB, on_invalid}, + /* 6xFC */ {NONE, NONE, 0xFC, on_invalid}, + /* 6xFD */ {NONE, NONE, 0xFD, on_invalid}, + /* 6xFE */ {NONE, NONE, 0xFE, on_invalid}, + /* 6xFF */ {NONE, NONE, 0xFF, on_invalid}, }; void on_subcommand_multi(shared_ptr c, uint8_t command, uint8_t flag, string& data) {