Commit 8a15b091 authored by VanillaSalt's avatar VanillaSalt

update SetUniqueOnField

parent 56a07d91
...@@ -1311,8 +1311,6 @@ int32 card::add_effect(effect* peffect) { ...@@ -1311,8 +1311,6 @@ int32 card::add_effect(effect* peffect) {
remove_effect(rm->second); remove_effect(rm->second);
} }
} }
if(peffect->code == EFFECT_CHANGE_CODE)
unique_uid = pduel->game_field->infos.field_id++;
eit = single_effect.insert(std::make_pair(peffect->code, peffect)); eit = single_effect.insert(std::make_pair(peffect->code, peffect));
} else if (peffect->type & EFFECT_TYPE_EQUIP) { } else if (peffect->type & EFFECT_TYPE_EQUIP) {
eit = equip_effect.insert(std::make_pair(peffect->code, peffect)); eit = equip_effect.insert(std::make_pair(peffect->code, peffect));
...@@ -1390,8 +1388,6 @@ void card::remove_effect(effect* peffect) { ...@@ -1390,8 +1388,6 @@ void card::remove_effect(effect* peffect) {
void card::remove_effect(effect* peffect, effect_container::iterator it) { void card::remove_effect(effect* peffect, effect_container::iterator it) {
card* check_target = this; card* check_target = this;
if (peffect->type & EFFECT_TYPE_SINGLE) { if (peffect->type & EFFECT_TYPE_SINGLE) {
if(peffect->code == EFFECT_CHANGE_CODE)
unique_uid = pduel->game_field->infos.field_id++;
single_effect.erase(it); single_effect.erase(it);
} else if (peffect->type & EFFECT_TYPE_EQUIP) { } else if (peffect->type & EFFECT_TYPE_EQUIP) {
equip_effect.erase(it); equip_effect.erase(it);
......
...@@ -126,7 +126,7 @@ public: ...@@ -126,7 +126,7 @@ public:
uint16 turnid; uint16 turnid;
uint16 turn_counter; uint16 turn_counter;
uint8 unique_pos[2]; uint8 unique_pos[2];
uint32 unique_uid; uint32 unique_fieldid;
uint32 unique_code; uint32 unique_code;
uint32 unique_location; uint32 unique_location;
int32 unique_function; int32 unique_function;
......
...@@ -218,7 +218,6 @@ void field::add_card(uint8 playerid, card* pcard, uint8 location, uint8 sequence ...@@ -218,7 +218,6 @@ void field::add_card(uint8 playerid, card* pcard, uint8 location, uint8 sequence
pcard->apply_field_effect(); pcard->apply_field_effect();
pcard->fieldid = infos.field_id++; pcard->fieldid = infos.field_id++;
pcard->fieldid_r = pcard->fieldid; pcard->fieldid_r = pcard->fieldid;
pcard->unique_uid = pcard->fieldid;
pcard->turnid = infos.turn_id; pcard->turnid = infos.turn_id;
if (location == LOCATION_MZONE) if (location == LOCATION_MZONE)
player[playerid].used_location |= 1 << sequence; player[playerid].used_location |= 1 << sequence;
...@@ -1478,15 +1477,74 @@ void field::adjust_disable_check_list() { ...@@ -1478,15 +1477,74 @@ void field::adjust_disable_check_list() {
} }
} while(effects.disable_check_list.size()); } while(effects.disable_check_list.size());
} }
// adjust check_unique_onfield(), EFFECT_SELF_DESTROY, EFFECT_SELF_TOGRAVE // adjust SetUniqueOnField(), EFFECT_SELF_DESTROY, EFFECT_SELF_TOGRAVE
void field::adjust_self_destroy_set() { void field::adjust_self_destroy_set() {
if(core.selfdes_disabled || !core.self_destroy_set.empty() || !core.self_tograve_set.empty()) if(core.selfdes_disabled || !core.unique_destroy_set.empty() || !core.self_destroy_set.empty() || !core.self_tograve_set.empty())
return; return;
core.unique_destroy_set.clear();
card_set cset; card_set cset;
int32 p = infos.turn_player;
for(int32 p1 = 0; p1 < 2; ++p1) {
for(auto iter = core.unique_cards[p].begin(); iter != core.unique_cards[p].end(); ++iter) {
card* ucard = *iter;
if(ucard->is_position(POS_FACEUP) && ucard->get_status(STATUS_EFFECT_ENABLED)
&& !ucard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN)) {
cset.clear();
for(int32 p2 = 0; p2 < 2; ++p2) {
if(ucard->unique_pos[p2]) {
if(ucard->unique_location & LOCATION_MZONE) {
for(int32 i = 0; i < 5; ++i) {
card* pcard = player[p ^ p2].list_mzone[i];
if(pcard && pcard->is_position(POS_FACEUP) && !pcard->is_status(STATUS_BATTLE_DESTROYED)
&& ucard->check_unique_code(pcard))
cset.insert(pcard);
}
}
if(ucard->unique_location & LOCATION_SZONE) {
for(int32 i = 0; i < 8; ++i) {
card* pcard = player[p ^ p2].list_szone[i];
if(pcard && pcard->is_position(POS_FACEUP) && ucard->check_unique_code(pcard))
cset.insert(pcard);
}
}
}
}
if(cset.size() == 0)
ucard->unique_fieldid = 0;
else if(cset.size() == 1) {
auto cit = cset.begin();
ucard->unique_fieldid = (*cit)->fieldid;
} else {
card* mcard = 0;
for(auto cit = cset.begin(); cit != cset.end(); ++cit) {
card* pcard = *cit;
if(ucard->unique_fieldid == pcard->fieldid) {
mcard = pcard;
break;
}
if(!mcard || pcard->fieldid < mcard->fieldid)
mcard = pcard;
}
ucard->unique_fieldid = mcard->fieldid;
cset.erase(mcard);
for(auto cit = cset.begin(); cit != cset.end(); ++cit) {
card* pcard = *cit;
core.unique_destroy_set.insert(pcard);
pcard->temp.reason_effect = pcard->current.reason_effect;
pcard->temp.reason_player = pcard->current.reason_player;
pcard->current.reason_effect = ucard->unique_effect;
pcard->current.reason_player = ucard->current.controler;
}
}
}
}
p = 1 - p;
}
cset.clear();
for(uint8 p = 0; p < 2; ++p) { for(uint8 p = 0; p < 2; ++p) {
for(uint8 i = 0; i < 5; ++i) { for(uint8 i = 0; i < 5; ++i) {
card* pcard = player[p].list_mzone[i]; card* pcard = player[p].list_mzone[i];
if(pcard && pcard->is_position(POS_FACEUP)) if(pcard && pcard->is_position(POS_FACEUP) && !pcard->is_status(STATUS_BATTLE_DESTROYED))
cset.insert(pcard); cset.insert(pcard);
} }
for(uint8 i = 0; i < 8; ++i) { for(uint8 i = 0; i < 8; ++i) {
...@@ -1497,11 +1555,10 @@ void field::adjust_self_destroy_set() { ...@@ -1497,11 +1555,10 @@ void field::adjust_self_destroy_set() {
} }
core.self_destroy_set.clear(); core.self_destroy_set.clear();
core.self_tograve_set.clear(); core.self_tograve_set.clear();
effect* peffect;
for(auto cit = cset.begin(); cit != cset.end(); ++cit) { for(auto cit = cset.begin(); cit != cset.end(); ++cit) {
card* pcard = *cit; card* pcard = *cit;
if((peffect = check_unique_onfield(pcard, pcard->current.controler, pcard->current.location)) effect* peffect = pcard->is_affected_by_effect(EFFECT_SELF_DESTROY);
|| (peffect = pcard->is_affected_by_effect(EFFECT_SELF_DESTROY)) && !pcard->is_status(STATUS_BATTLE_DESTROYED)) { if(peffect) {
core.self_destroy_set.insert(pcard); core.self_destroy_set.insert(pcard);
pcard->temp.reason_effect = pcard->current.reason_effect; pcard->temp.reason_effect = pcard->current.reason_effect;
pcard->temp.reason_player = pcard->current.reason_player; pcard->temp.reason_player = pcard->current.reason_player;
...@@ -1512,7 +1569,8 @@ void field::adjust_self_destroy_set() { ...@@ -1512,7 +1569,8 @@ void field::adjust_self_destroy_set() {
if(core.global_flag & GLOBALFLAG_SELF_TOGRAVE) { if(core.global_flag & GLOBALFLAG_SELF_TOGRAVE) {
for(auto cit = cset.begin(); cit != cset.end(); ++cit) { for(auto cit = cset.begin(); cit != cset.end(); ++cit) {
card* pcard = *cit; card* pcard = *cit;
if(peffect = pcard->is_affected_by_effect(EFFECT_SELF_TOGRAVE)) { effect* peffect = pcard->is_affected_by_effect(EFFECT_SELF_TOGRAVE);
if(peffect) {
core.self_tograve_set.insert(pcard); core.self_tograve_set.insert(pcard);
pcard->temp.reason_effect = pcard->current.reason_effect; pcard->temp.reason_effect = pcard->current.reason_effect;
pcard->temp.reason_player = pcard->current.reason_player; pcard->temp.reason_player = pcard->current.reason_player;
...@@ -1521,7 +1579,7 @@ void field::adjust_self_destroy_set() { ...@@ -1521,7 +1579,7 @@ void field::adjust_self_destroy_set() {
} }
} }
} }
if(!core.self_destroy_set.empty() || !core.self_tograve_set.empty()) if(!core.unique_destroy_set.empty() || !core.self_destroy_set.empty() || !core.self_tograve_set.empty())
add_process(PROCESSOR_SELF_DESTROY, 0, 0, 0, 0, 0); add_process(PROCESSOR_SELF_DESTROY, 0, 0, 0, 0, 0);
} }
void field::add_unique_card(card* pcard) { void field::add_unique_card(card* pcard) {
...@@ -1530,6 +1588,7 @@ void field::add_unique_card(card* pcard) { ...@@ -1530,6 +1588,7 @@ void field::add_unique_card(card* pcard) {
core.unique_cards[con].insert(pcard); core.unique_cards[con].insert(pcard);
if(pcard->unique_pos[1]) if(pcard->unique_pos[1])
core.unique_cards[1 - con].insert(pcard); core.unique_cards[1 - con].insert(pcard);
pcard->unique_fieldid = 0;
} }
void field::remove_unique_card(card* pcard) { void field::remove_unique_card(card* pcard) {
...@@ -1545,35 +1604,26 @@ void field::remove_unique_card(card* pcard) { ...@@ -1545,35 +1604,26 @@ void field::remove_unique_card(card* pcard) {
effect* field::check_unique_onfield(card* pcard, uint8 controler, uint8 location) { effect* field::check_unique_onfield(card* pcard, uint8 controler, uint8 location) {
for(auto iter = core.unique_cards[controler].begin(); iter != core.unique_cards[controler].end(); ++iter) { for(auto iter = core.unique_cards[controler].begin(); iter != core.unique_cards[controler].end(); ++iter) {
card* ucard = *iter; card* ucard = *iter;
if(ucard == pcard) if((ucard != pcard) && ucard->is_position(POS_FACEUP) && ucard->get_status(STATUS_EFFECT_ENABLED)
continue;
if(ucard->is_position(POS_FACEUP) && ucard->get_status(STATUS_EFFECT_ENABLED)
&& !ucard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN) && !ucard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN)
&& ucard->check_unique_code(ucard) && ucard->check_unique_code(pcard) && (ucard->unique_location & location) && ucard->unique_fieldid && ucard->check_unique_code(pcard) && (ucard->unique_location & location))
&& (!(pcard->current.location & ucard->unique_location) || pcard->is_position(POS_FACEDOWN)
|| (ucard->unique_uid < pcard->unique_uid)))
return ucard->unique_effect; return ucard->unique_effect;
} }
if(!pcard->unique_code || !pcard->check_unique_code(pcard)) if(!pcard->unique_code || !pcard->unique_fieldid || pcard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN))
return 0; return 0;
int32 is_tofield = !(pcard->current.location & location);
int32 is_flipping = pcard->is_position(POS_FACEDOWN);
int32 is_enabled = pcard->get_status(STATUS_EFFECT_ENABLED) && !pcard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN);
for(int32 p = 0; p < 2; ++p) { for(int32 p = 0; p < 2; ++p) {
if(pcard->unique_pos[p]) { if(pcard->unique_pos[p]) {
if(pcard->unique_location & LOCATION_MZONE) { if(pcard->unique_location & LOCATION_MZONE) {
for(int32 i = 0; i < 5; ++i) { for(int32 i = 0; i < 5; ++i) {
card* ucard = player[controler ^ p].list_mzone[i]; card* ucard = player[controler ^ p].list_mzone[i];
if(ucard && (ucard != pcard) && ucard->is_position(POS_FACEUP) && pcard->check_unique_code(ucard) if(ucard && (ucard != pcard) && ucard->is_position(POS_FACEUP) && pcard->check_unique_code(ucard))
&& (is_tofield || is_flipping || (is_enabled && (ucard->unique_uid < pcard->unique_uid))))
return pcard->unique_effect; return pcard->unique_effect;
} }
} }
if(pcard->unique_location & LOCATION_SZONE) { if(pcard->unique_location & LOCATION_SZONE) {
for(int32 i = 0; i < 8; ++i) { for(int32 i = 0; i < 8; ++i) {
card* ucard = player[controler ^ p].list_szone[i]; card* ucard = player[controler ^ p].list_szone[i];
if(ucard && (ucard != pcard) && ucard->is_position(POS_FACEUP) && pcard->check_unique_code(ucard) if(ucard && (ucard != pcard) && ucard->is_position(POS_FACEUP) && pcard->check_unique_code(ucard))
&& (is_tofield || is_flipping || (is_enabled && (ucard->unique_uid < pcard->unique_uid))))
return pcard->unique_effect; return pcard->unique_effect;
} }
} }
......
...@@ -199,6 +199,7 @@ struct processor { ...@@ -199,6 +199,7 @@ struct processor {
card_set special_summoning; card_set special_summoning;
card_set equiping_cards; card_set equiping_cards;
card_set control_adjust_set[2]; card_set control_adjust_set[2];
card_set unique_destroy_set;
card_set self_destroy_set; card_set self_destroy_set;
card_set self_tograve_set; card_set self_tograve_set;
card_set release_cards; card_set release_cards;
......
...@@ -1182,24 +1182,12 @@ int32 field::control_adjust(uint16 step) { ...@@ -1182,24 +1182,12 @@ int32 field::control_adjust(uint16 step) {
int32 field::self_destroy(uint16 step) { int32 field::self_destroy(uint16 step) {
switch(step) { switch(step) {
case 0: { case 0: {
if(core.self_destroy_set.empty()) { if(!core.unique_destroy_set.empty())
core.units.begin()->step = 1; destroy(&core.unique_destroy_set, 0, REASON_RULE, 5);
return FALSE;
}
card_set cset;
for (auto cit = core.self_destroy_set.begin(); cit != core.self_destroy_set.end();) {
auto rm = cit++;
card* pcard = *rm;
if(pcard->current.reason_effect->code == EFFECT_UNIQUE_CHECK) {
cset.insert(pcard);
core.self_destroy_set.erase(rm);
}
}
if(!cset.empty())
destroy(&cset, 0, REASON_RULE, 5);
return FALSE; return FALSE;
} }
case 1: { case 1: {
core.unique_destroy_set.clear();
core.operated_set.clear(); core.operated_set.clear();
if(!core.self_destroy_set.empty()) if(!core.self_destroy_set.empty())
destroy(&core.self_destroy_set, 0, REASON_EFFECT, 5); destroy(&core.self_destroy_set, 0, REASON_EFFECT, 5);
...@@ -1759,7 +1747,6 @@ int32 field::flip_summon(uint16 step, uint8 sumplayer, card * target) { ...@@ -1759,7 +1747,6 @@ int32 field::flip_summon(uint16 step, uint8 sumplayer, card * target) {
target->previous.position = target->current.position; target->previous.position = target->current.position;
target->current.position = POS_FACEUP_ATTACK; target->current.position = POS_FACEUP_ATTACK;
target->fieldid = infos.field_id++; target->fieldid = infos.field_id++;
target->unique_uid = target->fieldid;
core.phase_action = TRUE; core.phase_action = TRUE;
core.flipsummon_state_count[sumplayer]++; core.flipsummon_state_count[sumplayer]++;
check_card_counter(target, 4, sumplayer); check_card_counter(target, 4, sumplayer);
...@@ -4010,7 +3997,6 @@ int32 field::change_position(uint16 step, group * targets, effect * reason_effec ...@@ -4010,7 +3997,6 @@ int32 field::change_position(uint16 step, group * targets, effect * reason_effec
core.hint_timing[pcard->current.controler] |= TIMING_POS_CHANGE; core.hint_timing[pcard->current.controler] |= TIMING_POS_CHANGE;
if((opos & POS_FACEDOWN) && (npos & POS_FACEUP)) { if((opos & POS_FACEDOWN) && (npos & POS_FACEUP)) {
pcard->fieldid = infos.field_id++; pcard->fieldid = infos.field_id++;
pcard->unique_uid = pcard->fieldid;
if(pcard->current.location == LOCATION_MZONE) { if(pcard->current.location == LOCATION_MZONE) {
raise_single_event(pcard, 0, EVENT_FLIP, reason_effect, 0, reason_player, 0, flag); raise_single_event(pcard, 0, EVENT_FLIP, reason_effect, 0, reason_player, 0, flag);
flips.insert(pcard); flips.insert(pcard);
......
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