give names to assist_flags
This commit is contained in:
@@ -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
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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++) {
|
||||
|
||||
Reference in New Issue
Block a user