From 0f4e4fa48e80a00aca4ff87d172ef4020b1c5825 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Thu, 1 Feb 2024 22:48:12 -0800 Subject: [PATCH] don't mask Ep3 NTE game commands --- src/CommandFormats.hh | 2 ++ src/Episode3/Server.cc | 1 + src/ProxyCommands.cc | 2 +- src/ReceiveCommands.cc | 2 +- src/SendCommands.cc | 12 ++++++++---- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/CommandFormats.hh b/src/CommandFormats.hh index c42f3198..ca557e63 100644 --- a/src/CommandFormats.hh +++ b/src/CommandFormats.hh @@ -5506,6 +5506,8 @@ struct G_CardBattleCommandHeader { // set_mask_for_ep3_game_command in SendCommands.cc. The Episode 3 client // never sends commands that have a nonzero value in this field, but it does // properly handle received commands with nonzero values in this field. + // This only applies to Episode 3 final - the Trial Edition does not support + // masking and may send uninitialized data in this field. uint8_t mask_key = 0x00; uint8_t unused2 = 0x00; } __packed__; diff --git a/src/Episode3/Server.cc b/src/Episode3/Server.cc index 6b7fbfc3..8f726872 100644 --- a/src/Episode3/Server.cc +++ b/src/Episode3/Server.cc @@ -203,6 +203,7 @@ void Server::send(const void* data, size_t size, uint8_t command, bool enable_ma string masked_data; if (enable_masking && + (l->base_version != Version::GC_EP3_NTE) && !(this->options.behavior_flags & BehaviorFlag::DISABLE_MASKING) && (size >= 8)) { masked_data.assign(reinterpret_cast(data), size); diff --git a/src/ProxyCommands.cc b/src/ProxyCommands.cc index f3d62ad7..88275c09 100644 --- a/src/ProxyCommands.cc +++ b/src/ProxyCommands.cc @@ -987,7 +987,7 @@ static HandlerResult S_6x(shared_ptr ses, uint16_t, (static_cast(data[0]) == 0xB4) || (static_cast(data[0]) == 0xB5))) { const auto& header = check_size_t(data, 0xFFFF); - if (header.mask_key) { + if (header.mask_key && (ses->version() != Version::GC_EP3_NTE)) { set_mask_for_ep3_game_command(data.data(), data.size(), 0); modified = true; } diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index d180f58b..36821c52 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -1294,7 +1294,7 @@ static bool add_next_game_client(shared_ptr l) { state_cmd.state.first_team_turn = 0xFF; state_cmd.state.tournament_flag = 0x01; state_cmd.state.client_sc_card_types.clear(Episode3::CardType::INVALID_FF); - if (!(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) { + if ((c->version() != Version::GC_EP3_NTE) && !(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) { uint8_t mask_key = (random_object() % 0xFF) + 1; set_mask_for_ep3_game_command(&state_cmd, sizeof(state_cmd), mask_key); } diff --git a/src/SendCommands.cc b/src/SendCommands.cc index 57153f9b..525d0e6d 100644 --- a/src/SendCommands.cc +++ b/src/SendCommands.cc @@ -3109,7 +3109,8 @@ void send_ep3_set_tournament_player_decks(shared_ptr c) { add_entries_for_team(match->preceding_a->winner_team, 0); add_entries_for_team(match->preceding_b->winner_team, 2); - if (!(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) { + if ((c->version() != Version::GC_EP3_NTE) && + !(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) { uint8_t mask_key = (random_object() % 0xFF) + 1; set_mask_for_ep3_game_command(&cmd, sizeof(cmd), mask_key); } @@ -3170,7 +3171,8 @@ void send_ep3_tournament_match_result(shared_ptr l, uint32_t meseta_rewar cmd.winner_team_id = (match->preceding_b->winner_team == match->winner_team); cmd.meseta_amount = meseta_reward; cmd.meseta_reward_text.encode("You got %s meseta!", 1); - if (!(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) { + if ((lc->version() != Version::GC_EP3_NTE) && + !(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) { uint8_t mask_key = (random_object() % 0xFF) + 1; set_mask_for_ep3_game_command(&cmd, sizeof(cmd), mask_key); } @@ -3197,7 +3199,8 @@ void send_ep3_update_game_metadata(shared_ptr l) { { G_SetGameMetadata_GC_Ep3_6xB4x52 cmd; cmd.total_spectators = total_spectators; - if (!(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) { + if ((l->base_version != Version::GC_EP3_NTE) && + !(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) { uint8_t mask_key = (random_object() % 0xFF) + 1; set_mask_for_ep3_game_command(&cmd, sizeof(cmd), mask_key); } @@ -3235,7 +3238,8 @@ void send_ep3_update_game_metadata(shared_ptr l) { cmd.total_spectators = total_spectators; cmd.text_size = text.size(); cmd.text.encode(text, 1); - if (!(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) { + if ((watcher_l->base_version != Version::GC_EP3_NTE) && + !(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) { uint8_t mask_key = (random_object() % 0xFF) + 1; set_mask_for_ep3_game_command(&cmd, sizeof(cmd), mask_key); }