Commit 8cca9304 authored by DailyShana's avatar DailyShana

update control loop break

parent 8fe06c57
......@@ -1964,8 +1964,9 @@ void card::refresh_disable_status() {
if(pre_dis != cur_dis)
filter_immune_effect();
}
uint8 card::refresh_control_status() {
std::tuple<uint8, effect*> card::refresh_control_status() {
uint8 final = owner;
effect* ceffect = nullptr;
uint32 last_id = 0;
if(pduel->game_field->core.remove_brainwashing && is_affected_by_effect(EFFECT_REMOVE_BRAINWASHING))
last_id = pduel->game_field->core.last_control_changed_id;
......@@ -1974,18 +1975,11 @@ uint8 card::refresh_control_status() {
if(eset.size()) {
effect* peffect = eset.get_last();
if(peffect->id >= last_id) {
card* pcard = peffect->get_handler();
uint8 val = (uint8)peffect->get_value(this);
if(val != current.controler)
pduel->game_field->core.readjust_map[pcard]++;
if(pduel->game_field->core.readjust_map[pcard] > 5) {
pduel->game_field->send_to(pcard, 0, REASON_RULE, peffect->get_handler_player(), PLAYER_NONE, LOCATION_GRAVE, 0, POS_FACEUP);
return final;
}
final = val;
final = (uint8)peffect->get_value(this);
ceffect = peffect;
}
}
return final;
return { final, ceffect };
}
void card::count_turn(uint16 ct) {
turn_counter = ct;
......
......@@ -14,6 +14,7 @@
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <tuple>
class card;
class duel;
......@@ -257,7 +258,7 @@ public:
void reset(uint32 id, uint32 reset_type);
void reset_effect_count();
void refresh_disable_status();
uint8 refresh_control_status();
std::tuple<uint8, effect*> refresh_control_status();
void count_turn(uint16 ct);
void create_relation(card* target, uint32 reset);
......
......@@ -520,7 +520,7 @@ void field::swap_card(card* pcard1, card* pcard2) {
return swap_card(pcard1, pcard2, pcard1->current.sequence, pcard2->current.sequence);
}
void field::set_control(card* pcard, uint8 playerid, uint16 reset_phase, uint8 reset_count) {
if((core.remove_brainwashing && pcard->is_affected_by_effect(EFFECT_REMOVE_BRAINWASHING)) || pcard->refresh_control_status() == playerid)
if((core.remove_brainwashing && pcard->is_affected_by_effect(EFFECT_REMOVE_BRAINWASHING)) || std::get<uint8>(pcard->refresh_control_status()) == playerid)
return;
effect* peffect = pduel->new_effect();
if(core.reason_effect)
......
......@@ -4843,19 +4843,30 @@ int32 field::adjust_step(uint16 step) {
//control
core.control_adjust_set[0].clear();
core.control_adjust_set[1].clear();
card_set reason_cards;
for(uint8 p = 0; p < 2; ++p) {
for(auto& pcard : player[p].list_mzone) {
if(!pcard) continue;
uint8 cur = pcard->current.controler;
uint8 ref = pcard->refresh_control_status();
if(cur != ref && pcard->is_capable_change_control())
auto res = pcard->refresh_control_status();
uint8 ref = std::get<uint8>(res);
effect* peffect = std::get<effect*>(res);
if(cur != ref && pcard->is_capable_change_control()) {
core.control_adjust_set[p].insert(pcard);
if(peffect && (!(peffect->type & EFFECT_TYPE_SINGLE) || peffect->condition))
reason_cards.insert(peffect->get_handler());
}
}
}
if(core.control_adjust_set[0].size() || core.control_adjust_set[1].size()) {
core.re_adjust = TRUE;
get_control(&core.control_adjust_set[1 - infos.turn_player], 0, PLAYER_NONE, infos.turn_player, 0, 0, 0xff);
get_control(&core.control_adjust_set[infos.turn_player], 0, PLAYER_NONE, 1 - infos.turn_player, 0, 0, 0xff);
for(auto& rcard : reason_cards) {
core.readjust_map[rcard]++;
if(core.readjust_map[rcard] > 3)
destroy(rcard, 0, REASON_RULE, PLAYER_NONE);
}
}
core.last_control_changed_id = infos.field_id;
return FALSE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment