From 753b89c78d645396cb399deb8daf5df5c4acad7d Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sat, 9 Sep 2023 19:21:33 -0700 Subject: [PATCH] give names to assist_flags --- src/Episode3/Card.cc | 2 +- src/Episode3/PlayerState.cc | 53 ++++++++++++++++++------------- src/Episode3/PlayerState.hh | 21 +++++++++++++ src/Episode3/RulerServer.cc | 16 +++++----- src/Episode3/Server.cc | 62 +++++++++++++++++++++---------------- 5 files changed, 96 insertions(+), 58 deletions(-) diff --git a/src/Episode3/Card.cc b/src/Episode3/Card.cc index eb287088..84d7c207 100644 --- a/src/Episode3/Card.cc +++ b/src/Episode3/Card.cc @@ -396,7 +396,7 @@ void Card::destroy_set_card(shared_ptr attacker_card) { } int32_t Card::error_code_for_move_to_location(const Location& loc) const { - if (this->player_state()->assist_flags & 0x80) { + if (this->player_state()->assist_flags & AssistFlag::IS_SKIPPING_TURN) { return -0x76; } if (this->card_flags & 2) { diff --git a/src/Episode3/PlayerState.cc b/src/Episode3/PlayerState.cc index c99180f4..fff37191 100644 --- a/src/Episode3/PlayerState.cc +++ b/src/Episode3/PlayerState.cc @@ -135,19 +135,19 @@ shared_ptr PlayerState::server() const { } bool PlayerState::draw_cards_allowed() const { - if (!(this->assist_flags & 0x80)) { - auto s = this->server(); - size_t num_assists = s->assist_server->compute_num_assist_effects_for_client(this->client_id); - for (size_t z = 0; z < num_assists; z++) { - auto eff = s->assist_server->get_active_assist_by_index(z); - if (eff == AssistEffect::SKIP_DRAW) { - return false; - } - } - return true; - } else { + if (this->assist_flags & AssistFlag::IS_SKIPPING_TURN) { return false; } + + auto s = this->server(); + size_t num_assists = s->assist_server->compute_num_assist_effects_for_client(this->client_id); + for (size_t z = 0; z < num_assists; z++) { + auto eff = s->assist_server->get_active_assist_by_index(z); + if (eff == AssistEffect::SKIP_DRAW) { + return false; + } + } + return true; } void PlayerState::apply_assist_card_effect_on_set( @@ -1188,27 +1188,33 @@ void PlayerState::send_set_card_updates(bool always_send) { void PlayerState::set_assist_flags_from_assist_effects() { auto s = this->server(); - this->assist_flags &= 0xFFFFF88F; + this->assist_flags &= ~( + AssistFlag::FIXED_RANGE | + AssistFlag::SUMMONING_IS_FREE | + AssistFlag::LIMIT_MOVE_TO_1 | + AssistFlag::IMMORTAL | + AssistFlag::SAME_CARD_BANNED | + AssistFlag::CANNOT_SET_FIELD_CHARACTERS); size_t num_assists = s->assist_server->compute_num_assist_effects_for_client(this->client_id); for (size_t z = 0; z < num_assists; z++) { switch (s->assist_server->get_active_assist_by_index(z)) { case AssistEffect::SIMPLE: - this->assist_flags |= 0x10; + this->assist_flags |= AssistFlag::FIXED_RANGE; break; case AssistEffect::TERRITORY: - this->assist_flags |= 0x200; + this->assist_flags |= AssistFlag::SAME_CARD_BANNED; break; case AssistEffect::OLD_TYPE: - this->assist_flags |= 0x400; + this->assist_flags |= AssistFlag::CANNOT_SET_FIELD_CHARACTERS; break; case AssistEffect::FLATLAND: - this->assist_flags |= 0x20; + this->assist_flags |= AssistFlag::SUMMONING_IS_FREE; break; case AssistEffect::IMMORTALITY: - this->assist_flags |= 0x100; + this->assist_flags |= AssistFlag::IMMORTAL; break; case AssistEffect::SNAIL_PACE: - this->assist_flags |= 0x40; + this->assist_flags |= AssistFlag::LIMIT_MOVE_TO_1; break; default: break; @@ -1622,7 +1628,7 @@ void PlayerState::handle_before_turn_assist_effects() { this->update_hand_and_equip_state_and_send_6xB4x02_if_needed(); break; case AssistEffect::SKIP_TURN: - this->assist_flags |= 0x80; + this->assist_flags |= AssistFlag::IS_SKIPPING_TURN; this->update_hand_and_equip_state_and_send_6xB4x02_if_needed(); break; default: @@ -1744,7 +1750,10 @@ void PlayerState::unknown_8023C174() { this->def_bonuses = 0; this->roll_dice(2); } - this->assist_flags &= 0x9804; + this->assist_flags &= (AssistFlag::HAS_WON_BATTLE | + AssistFlag::WINNER_DECIDED_BY_DEFEAT | + AssistFlag::WINNER_DECIDED_BY_RANDOM | + AssistFlag::ELIGIBLE_FOR_DICE_BOOST); this->set_assist_flags_from_assist_effects(); this->update_hand_and_equip_state_and_send_6xB4x02_if_needed(0); this->send_set_card_updates(0); @@ -1849,11 +1858,11 @@ void PlayerState::roll_main_dice() { if (!should_exchange) { this->atk_points = (short)(char)this->dice_results[0]; this->def_points = (short)(char)this->dice_results[1]; - this->assist_flags &= 0xFFFFFFFD; + this->assist_flags &= (~AssistFlag::DICE_WERE_EXCHANGED); } else { this->atk_points = (short)(char)this->dice_results[1]; this->def_points = (short)(char)this->dice_results[0]; - this->assist_flags |= 2; + this->assist_flags |= AssistFlag::DICE_WERE_EXCHANGED; } this->atk_points = this->atk_points + s->card_special->client_has_atk_dice_boost_condition(this->client_id); diff --git a/src/Episode3/PlayerState.hh b/src/Episode3/PlayerState.hh index 0ff0efbb..68efff80 100644 --- a/src/Episode3/PlayerState.hh +++ b/src/Episode3/PlayerState.hh @@ -14,6 +14,27 @@ namespace Episode3 { class Server; +enum AssistFlag { + // clang-format off + READY_TO_END_PHASE = 0x0001, + DICE_WERE_EXCHANGED = 0x0002, + HAS_WON_BATTLE = 0x0004, + READY_TO_END_STARTER_ROLL_PHASE = 0x0008, + FIXED_RANGE = 0x0010, + SUMMONING_IS_FREE = 0x0020, + LIMIT_MOVE_TO_1 = 0x0040, + IS_SKIPPING_TURN = 0x0080, + IMMORTAL = 0x0100, + SAME_CARD_BANNED = 0x0200, + CANNOT_SET_FIELD_CHARACTERS = 0x0400, + WINNER_DECIDED_BY_DEFEAT = 0x0800, + WINNER_DECIDED_BY_RANDOM = 0x1000, + READY_TO_END_ACTION_PHASE = 0x2000, + BATTLE_DID_NOT_END_DUE_TO_TIME_LIMIT = 0x4000, + ELIGIBLE_FOR_DICE_BOOST = 0x8000, + // clang-format on +}; + class PlayerState : public std::enable_shared_from_this { public: PlayerState(uint8_t client_id, std::shared_ptr server); diff --git a/src/Episode3/RulerServer.cc b/src/Episode3/RulerServer.cc index 5de233da..cba7ecc3 100644 --- a/src/Episode3/RulerServer.cc +++ b/src/Episode3/RulerServer.cc @@ -587,7 +587,7 @@ bool RulerServer::card_ref_can_move( return false; } - if ((this->hand_and_equip_states[client_id]->assist_flags & 0x80)) { + if ((this->hand_and_equip_states[client_id]->assist_flags & AssistFlag::IS_SKIPPING_TURN)) { return false; } @@ -670,7 +670,7 @@ bool RulerServer::card_ref_or_any_set_card_has_condition_46( } uint8_t client_id = client_id_for_card_ref(card_ref); - if (this->hand_and_equip_states[client_id]->assist_flags & 0x100) { + if (this->hand_and_equip_states[client_id]->assist_flags & AssistFlag::IMMORTAL) { auto ce = this->definition_for_card_id(card_id); if (!ce) { return false; @@ -1632,7 +1632,7 @@ int32_t RulerServer::error_code_for_client_setting_card( return -0x7D; } - if (hes->assist_flags & 0x80) { + if (hes->assist_flags & AssistFlag::IS_SKIPPING_TURN) { return -0x76; } @@ -1641,7 +1641,7 @@ int32_t RulerServer::error_code_for_client_setting_card( } uint16_t card_id = this->card_id_for_card_ref(card_ref); - if ((hes->assist_flags & 0x200) && (card_id != 0xFFFF)) { + if ((hes->assist_flags & AssistFlag::SAME_CARD_BANNED) && (card_id != 0xFFFF)) { for (size_t other_client_id = 0; other_client_id < 4; other_client_id++) { auto other_hes = this->hand_and_equip_states[other_client_id]; if (!other_hes) { @@ -1683,7 +1683,7 @@ int32_t RulerServer::error_code_for_client_setting_card( return -0x75; } - } else if (hes->assist_flags & 0x400) { // Item or creature + } else if (hes->assist_flags & AssistFlag::CANNOT_SET_FIELD_CHARACTERS) { // Item or creature return -0x76; } @@ -2156,7 +2156,7 @@ bool RulerServer::is_attack_valid(const ActionState& pa) { } if (this->hand_and_equip_states[client_id] && - (this->hand_and_equip_states[client_id]->assist_flags & 0x80)) { + (this->hand_and_equip_states[client_id]->assist_flags & AssistFlag::IS_SKIPPING_TURN)) { this->error_code3 = -0x70; return false; } @@ -2284,7 +2284,7 @@ bool RulerServer::is_attack_or_defense_valid(const ActionState& pa) { return false; } - if (hes->assist_flags & 0x80) { + if (hes->assist_flags & AssistFlag::IS_SKIPPING_TURN) { this->error_code3 = -0x70; return false; } @@ -2351,7 +2351,7 @@ bool RulerServer::is_defense_valid(const ActionState& pa) { } if (this->hand_and_equip_states[pa.client_id] && - (this->hand_and_equip_states[pa.client_id]->assist_flags & 0x80)) { + (this->hand_and_equip_states[pa.client_id]->assist_flags & AssistFlag::IS_SKIPPING_TURN)) { this->error_code3 = -0x64; return false; } diff --git a/src/Episode3/Server.cc b/src/Episode3/Server.cc index c563298b..dc5cc545 100644 --- a/src/Episode3/Server.cc +++ b/src/Episode3/Server.cc @@ -119,7 +119,7 @@ int8_t Server::get_winner_team_id() const { } uint8_t team_id = ps->get_team_id(); team_player_counts[team_id]++; - if (ps->assist_flags & 4) { + if (ps->assist_flags & AssistFlag::HAS_WON_BATTLE) { team_win_flag_counts[team_id]++; } } @@ -428,16 +428,18 @@ bool Server::check_for_battle_end() { for (size_t client_id = 0; client_id < 4; client_id++) { auto ps = this->player_states[client_id]; if (ps) { - ps->assist_flags &= 0xFFFFB7FB; + ps->assist_flags &= ~(AssistFlag::HAS_WON_BATTLE | + AssistFlag::WINNER_DECIDED_BY_DEFEAT | + AssistFlag::BATTLE_DID_NOT_END_DUE_TO_TIME_LIMIT); if (teams_defeated[ps->get_team_id()] == 0) { - ps->assist_flags |= 4; + ps->assist_flags |= AssistFlag::HAS_WON_BATTLE; } } } } } else { // Both teams defeated?? I guess this is technically possible ret = true; - this->compute_losing_team_id_and_add_winner_flags(0x4000); + this->compute_losing_team_id_and_add_winner_flags(AssistFlag::BATTLE_DID_NOT_END_DUE_TO_TIME_LIMIT); } } else { // Not DEFEAT_TEAM @@ -459,16 +461,18 @@ bool Server::check_for_battle_end() { for (size_t client_id = 0; client_id < 4; client_id++) { auto ps = this->player_states[client_id]; if (ps) { - ps->assist_flags &= 0xFFFFB7FB; + ps->assist_flags &= ~(AssistFlag::HAS_WON_BATTLE | + AssistFlag::WINNER_DECIDED_BY_DEFEAT | + AssistFlag::BATTLE_DID_NOT_END_DUE_TO_TIME_LIMIT); if (!teams_alive[ps->get_team_id()]) { - ps->assist_flags |= 4; + ps->assist_flags |= AssistFlag::HAS_WON_BATTLE; } } } } } else { ret = true; - this->compute_losing_team_id_and_add_winner_flags(0x4000); + this->compute_losing_team_id_and_add_winner_flags(AssistFlag::BATTLE_DID_NOT_END_DUE_TO_TIME_LIMIT); } } @@ -483,9 +487,11 @@ void Server::force_battle_result(uint8_t specified_client_id, bool set_winner) { for (size_t z = 0; z < 4; z++) { auto ps = this->player_states[z]; if (ps) { - ps->assist_flags &= 0xFFFFB7FB; + ps->assist_flags &= ~(AssistFlag::HAS_WON_BATTLE | + AssistFlag::WINNER_DECIDED_BY_DEFEAT | + AssistFlag::BATTLE_DID_NOT_END_DUE_TO_TIME_LIMIT); if ((ps->get_team_id() == specified_ps->get_team_id()) == set_winner) { - ps->assist_flags |= 4; + ps->assist_flags |= AssistFlag::HAS_WON_BATTLE; } ps->update_hand_and_equip_state_and_send_6xB4x02_if_needed(true); } @@ -514,7 +520,7 @@ void Server::clear_player_flags_after_dice_phase() { for (size_t z = 0; z < 4; z++) { auto ps = this->player_states[z]; if (ps) { - ps->assist_flags &= 0xFFFFDFFE; + ps->assist_flags &= ~(AssistFlag::READY_TO_END_PHASE | AssistFlag::READY_TO_END_ACTION_PHASE); ps->update_hand_and_equip_state_and_send_6xB4x02_if_needed(); } } @@ -678,7 +684,7 @@ void Server::draw_phase_after() { bool no_winner_specified = true; for (size_t z = 0; z < 4; z++) { auto ps = this->player_states[z]; - if (ps && (ps->assist_flags & 4)) { + if (ps && (ps->assist_flags & AssistFlag::HAS_WON_BATTLE)) { no_winner_specified = false; break; } @@ -745,7 +751,7 @@ void Server::end_attack_list_for_client(uint8_t client_id) { for (size_t z = 0; z < 4; z++) { auto other_ps = this->player_states[z]; if (other_ps) { - other_ps->assist_flags &= 0xFFFFDFFF; + other_ps->assist_flags &= (~AssistFlag::READY_TO_END_ACTION_PHASE); other_ps->update_hand_and_equip_state_and_send_6xB4x02_if_needed(); } } @@ -753,7 +759,7 @@ void Server::end_attack_list_for_client(uint8_t client_id) { this->client_done_enqueuing_attacks.clear(false); } else { - ps->assist_flags |= 0x2000; + ps->assist_flags |= AssistFlag::READY_TO_END_ACTION_PHASE; ps->update_hand_and_equip_state_and_send_6xB4x02_if_needed(); } } @@ -1134,14 +1140,14 @@ void Server::set_client_id_ready_to_advance_phase(uint8_t client_id) { auto ps = this->player_states[client_id]; if (ps && (this->current_team_turn1 == ps->get_team_id()) && (this->setup_phase == SetupPhase::MAIN_BATTLE)) { - ps->assist_flags |= 1; + ps->assist_flags |= AssistFlag::READY_TO_END_PHASE; ps->update_hand_and_equip_state_and_send_6xB4x02_if_needed(); if (this->battle_phase == BattlePhase::DICE) { - if (!(ps->assist_flags & 0x8000) || this->map_and_rules->rules.disable_dice_boost) { - ps->assist_flags &= 0xFFFF7FFF; + if (!(ps->assist_flags & AssistFlag::ELIGIBLE_FOR_DICE_BOOST) || this->map_and_rules->rules.disable_dice_boost) { + ps->assist_flags &= (~AssistFlag::ELIGIBLE_FOR_DICE_BOOST); ps->roll_main_dice(); if ((ps->get_atk_points() < 3) && (ps->get_def_points() < 3)) { - ps->assist_flags |= 0x8000; + ps->assist_flags |= AssistFlag::ELIGIBLE_FOR_DICE_BOOST; } } else { // TODO: It'd be nice to do this in a constant-randomness way, but I'm @@ -1155,7 +1161,7 @@ void Server::set_client_id_ready_to_advance_phase(uint8_t client_id) { break; } } - ps->assist_flags &= 0xFFFF7FFF; + ps->assist_flags &= (~AssistFlag::ELIGIBLE_FOR_DICE_BOOST); } ps->update_hand_and_equip_state_and_send_6xB4x02_if_needed(); } @@ -1586,7 +1592,7 @@ void Server::handle_CAx0C_end_mulligan_phase(const string& data) { } else { this->clients_done_in_mulligan_phase[in_cmd.client_id] = true; auto ps = this->player_states[in_cmd.client_id]; - ps->assist_flags |= 1; + ps->assist_flags |= AssistFlag::READY_TO_END_PHASE; ps->update_hand_and_equip_state_and_send_6xB4x02_if_needed(); bool all_clients_ready = true; @@ -1656,7 +1662,7 @@ void Server::handle_CAx0E_discard_card_from_hand(const string& data) { auto ps = this->player_states[in_cmd.client_id]; if (!ps) { error_code = -0x72; - } else if (!(ps->assist_flags & 0x80)) { + } else if (!(ps->assist_flags & AssistFlag::IS_SKIPPING_TURN)) { error_code = ps->discard_ref_from_hand(in_cmd.card_ref) ? 0 : 1; ps->update_hand_and_equip_state_and_send_6xB4x02_if_needed(); } else { @@ -2021,7 +2027,7 @@ void Server::handle_CAx28_end_defense_list(const string& data) { for (size_t z = 0; z < 4; z++) { auto ps = this->player_states[z]; if (ps) { - ps->assist_flags &= 0xFFFFDFFF; + ps->assist_flags &= (~AssistFlag::READY_TO_END_ACTION_PHASE); ps->update_hand_and_equip_state_and_send_6xB4x02_if_needed(); } } @@ -2029,7 +2035,7 @@ void Server::handle_CAx28_end_defense_list(const string& data) { this->unknown_a10 = 1; } else { auto ps = this->player_states[in_cmd.client_id]; - ps->assist_flags |= 0x2000; + ps->assist_flags |= AssistFlag::READY_TO_END_ACTION_PHASE; ps->update_hand_and_equip_state_and_send_6xB4x02_if_needed(); } if (this->unknown_a10 != 0) { @@ -2132,14 +2138,14 @@ void Server::handle_CAx37_client_ready_to_advance_from_starter_roll_phase(const auto ps = this->player_states[in_cmd.client_id]; if (ps) { - ps->assist_flags |= 8; + ps->assist_flags |= AssistFlag::READY_TO_END_STARTER_ROLL_PHASE; ps->update_hand_and_equip_state_and_send_6xB4x02_if_needed(); } if (this->setup_phase == SetupPhase::STARTER_ROLLS) { bool all_clients_ready = true; for (size_t z = 0; z < 4; z++) { auto other_ps = this->player_states[z]; - if (other_ps && !(other_ps->assist_flags & 8)) { + if (other_ps && !(other_ps->assist_flags & AssistFlag::READY_TO_END_STARTER_ROLL_PHASE)) { all_clients_ready = false; break; } @@ -2239,11 +2245,13 @@ void Server::compute_losing_team_id_and_add_winner_flags(uint32_t flags) { for (size_t z = 0; z < 4; z++) { auto ps = this->player_states[z]; if (ps) { - ps->assist_flags &= 0xFFFFB7FB; + ps->assist_flags &= ~(AssistFlag::HAS_WON_BATTLE | + AssistFlag::WINNER_DECIDED_BY_DEFEAT | + AssistFlag::BATTLE_DID_NOT_END_DUE_TO_TIME_LIMIT); } } - uint32_t flags_to_add = flags | 0x804; + uint32_t flags_to_add = flags | AssistFlag::HAS_WON_BATTLE | AssistFlag::WINNER_DECIDED_BY_DEFEAT; // First, check which team has more dead SCs int8_t losing_team_id = -1; @@ -2341,7 +2349,7 @@ void Server::compute_losing_team_id_and_add_winner_flags(uint32_t flags) { losing_team_id = 1; } } - flags_to_add = flags | 0x1004; + flags_to_add = flags | AssistFlag::HAS_WON_BATTLE | AssistFlag::WINNER_DECIDED_BY_RANDOM; } for (size_t z = 0; z < 4; z++) {