give names to assist_flags

This commit is contained in:
Martin Michelsen
2023-09-09 19:21:33 -07:00
parent fa48b58773
commit 753b89c78d
5 changed files with 96 additions and 58 deletions
+1 -1
View File
@@ -396,7 +396,7 @@ void Card::destroy_set_card(shared_ptr<Card> 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) {
+31 -22
View File
@@ -135,19 +135,19 @@ shared_ptr<const Server> 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);
+21
View File
@@ -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<PlayerState> {
public:
PlayerState(uint8_t client_id, std::shared_ptr<Server> server);
+8 -8
View File
@@ -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;
}
+35 -27
View File
@@ -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++) {