Commit 5519b682 authored by VanillaSalt's avatar VanillaSalt

fix

parent ab57e18c
......@@ -861,6 +861,8 @@ void card::xyz_overlay(card_set* materials) {
}
if(des.size())
pduel->game_field->destroy(&des, 0, REASON_LOST_TARGET + REASON_RULE, PLAYER_NONE);
else
pduel->game_field->adjust_instant();
}
void card::xyz_add(card* mat, card_set* des) {
if(mat->overlay_target == this)
......
......@@ -1347,9 +1347,8 @@ int32 field::get_overlay_count(uint8 self, uint8 s, uint8 o) {
}
void field::update_disable_check_list(effect* peffect) {
card_set cset;
card_set::iterator it;
filter_affected_cards(peffect, &cset);
for (it = cset.begin(); it != cset.end(); ++it)
for (auto it = cset.begin(); it != cset.end(); ++it)
add_to_disable_check_list(*it);
}
void field::add_to_disable_check_list(card* pcard) {
......@@ -1391,7 +1390,47 @@ void field::adjust_disable_check_list() {
}
} while(effects.disable_check_list.size());
}
void field::adjust_self_destroy_set() {
if(core.selfdes_disabled)
return;
card_set cset;
for(uint8 p = 0; p < 2; ++p) {
for(uint8 i = 0; i < 5; ++i) {
card* pcard = player[p].list_mzone[i];
if(pcard && pcard->is_position(POS_FACEUP))
cset.insert(pcard);
}
for(uint8 i = 0; i < 8; ++i) {
card* pcard = player[p].list_szone[i];
if(pcard && pcard->is_position(POS_FACEUP))
cset.insert(pcard);
}
}
core.self_destroy_set.clear();
core.self_tograve_set.clear();
effect* peffect;
for(auto cit = cset.begin(); cit != cset.end(); ++cit) {
card* pcard = *cit;
if((!pcard->is_status(STATUS_DISABLED) && (peffect = check_unique_onfield(pcard, pcard->current.controler)))
|| (peffect = pcard->is_affected_by_effect(EFFECT_SELF_DESTROY))) {
core.self_destroy_set.insert(pcard);
pcard->current.reason_effect = peffect;
pcard->current.reason_player = peffect->get_handler_player();
}
}
if(core.global_flag & GLOBALFLAG_SELF_TOGRAVE) {
for(auto cit = cset.begin(); cit != cset.end(); ++cit) {
card* pcard = *cit;
if(peffect = pcard->is_affected_by_effect(EFFECT_SELF_TOGRAVE)) {
core.self_tograve_set.insert(pcard);
pcard->current.reason_effect = peffect;
pcard->current.reason_player = peffect->get_handler_player();
}
}
}
if(!core.self_destroy_set.empty() || !core.self_tograve_set.empty())
add_process(PROCESSOR_SELF_DESTROY, 0, 0, 0, 0, 0);
}
void field::add_unique_card(card* pcard) {
uint8 con = pcard->current.controler;
if(pcard->unique_pos[0])
......
......@@ -192,6 +192,7 @@ struct processor {
card_set equiping_cards;
card_set control_adjust_set[2];
card_set self_destroy_set;
card_set self_tograve_set;
card_set release_cards;
card_set release_cards_ex;
card_set release_cards_ex_sum;
......@@ -361,6 +362,7 @@ public:
void update_disable_check_list(effect* peffect);
void add_to_disable_check_list(card* pcard);
void adjust_disable_check_list();
void adjust_self_destroy_set();
void add_unique_card(card* pcard);
void remove_unique_card(card* pcard);
effect* check_unique_onfield(card* pcard, uint8 controler);
......
......@@ -1031,47 +1031,24 @@ int32 field::control_adjust(uint16 step) {
int32 field::self_destroy(uint16 step) {
switch(step) {
case 0: {
effect* peffect;
core.destroy_set.clear();
for(auto cit = core.self_destroy_set.begin(); cit != core.self_destroy_set.end(); ++cit) {
card* pcard = *cit;
if(pcard->is_position(POS_FACEUP) && (pcard->current.location & LOCATION_ONFIELD)
&& ((!pcard->is_status(STATUS_DISABLED) && (peffect = check_unique_onfield(pcard, pcard->current.controler)))
|| (peffect = pcard->is_affected_by_effect(EFFECT_SELF_DESTROY)))) {
core.destroy_set.insert(pcard);
pcard->current.reason_effect = peffect;
pcard->current.reason_player = peffect->get_handler_player();
}
}
if(core.destroy_set.size())
destroy(&core.destroy_set, 0, REASON_EFFECT, 5);
if(!core.self_destroy_set.empty())
destroy(&core.self_destroy_set, 0, REASON_EFFECT, 5);
else
returns.ivalue[0] = 0;
return FALSE;
}
case 1: {
if(!(core.global_flag & GLOBALFLAG_SELF_TOGRAVE))
return TRUE;
return FALSE;
core.units.begin()->arg1 = returns.ivalue[0];
effect* peffect;
card_set tograve_set;
for(auto cit = core.self_destroy_set.begin(); cit != core.self_destroy_set.end(); ++cit) {
card* pcard = *cit;
if(pcard->is_position(POS_FACEUP) && (pcard->current.location & LOCATION_ONFIELD)
&& (peffect = pcard->is_affected_by_effect(EFFECT_SELF_TOGRAVE))) {
tograve_set.insert(pcard);
pcard->current.reason_effect = peffect;
pcard->current.reason_player = peffect->get_handler_player();
}
}
if(tograve_set.size())
send_to(&tograve_set, 0, REASON_EFFECT, PLAYER_NONE, PLAYER_NONE, LOCATION_GRAVE, 0, POS_FACEUP);
else
return TRUE;
if(!core.self_tograve_set.empty())
send_to(&core.self_tograve_set, 0, REASON_EFFECT, PLAYER_NONE, PLAYER_NONE, LOCATION_GRAVE, 0, POS_FACEUP);
return FALSE;
}
case 2: {
returns.ivalue[0] += core.units.begin()->arg1;
if(returns.ivalue[0])
adjust_instant();
return TRUE;
}
}
......
......@@ -4665,9 +4665,6 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
}
}
adjust_instant();
core.self_destroy_set.clear();
core.self_destroy_set.insert(pcard);
add_process(PROCESSOR_SELF_DESTROY, 0, 0, 0, 0, 0);
}
raise_event((card*)0, EVENT_CHAIN_SOLVING, peffect, 0, cait->triggering_player, cait->triggering_player, cait->chain_count);
process_instant_event();
......@@ -4898,6 +4895,7 @@ int32 field::break_effect() {
}
void field::adjust_instant() {
adjust_disable_check_list();
adjust_self_destroy_set();
}
void field::adjust_all() {
core.readjust_map.clear();
......@@ -5259,28 +5257,10 @@ int32 field::adjust_step(uint16 step) {
return FALSE;
}
//self destroy
core.self_destroy_set.clear();
for(uint8 p = 0; p < 2; ++p) {
for(uint8 i = 0; i < 5; ++i) {
card* pcard = player[p].list_mzone[i];
if(pcard)
core.self_destroy_set.insert(pcard);
}
for(uint8 i = 0; i < 8; ++i) {
card* pcard = player[p].list_szone[i];
if(pcard)
core.self_destroy_set.insert(pcard);
}
}
if(core.self_destroy_set.size())
add_process(PROCESSOR_SELF_DESTROY, 0, 0, 0, 0, 0);
else
core.units.begin()->step = 9;
adjust_self_destroy_set();
return FALSE;
}
case 9: {
if(returns.ivalue[0] > 0)
core.re_adjust = TRUE;
return FALSE;
}
case 10: {
......
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