Commit 30401feb authored by mercury233's avatar mercury233
parents d747f280 182e619a
......@@ -1580,7 +1580,6 @@ void card::enable_field_effect(bool enabled) {
reset(RESET_DISABLE, RESET_EVENT);
} else
set_status(STATUS_EFFECT_ENABLED, FALSE);
filter_immune_effect();
if (get_status(STATUS_DISABLED | STATUS_FORBIDDEN))
return;
filter_disable_related_cards();
......@@ -1966,26 +1965,17 @@ void card::reset_effect_count() {
// refresh STATUS_DISABLED based on EFFECT_DISABLE and EFFECT_CANNOT_DISABLE
// refresh STATUS_FORBIDDEN based on EFFECT_FORBIDDEN
void card::refresh_disable_status() {
// forbidden
int32 pre_fb = is_status(STATUS_FORBIDDEN);
filter_immune_effect();
// forbidden
if (is_affected_by_effect(EFFECT_FORBIDDEN))
set_status(STATUS_FORBIDDEN, TRUE);
else
set_status(STATUS_FORBIDDEN, FALSE);
int32 cur_fb = is_status(STATUS_FORBIDDEN);
if(pre_fb != cur_fb)
filter_immune_effect();
// disabled
int32 pre_dis = is_status(STATUS_DISABLED);
filter_immune_effect();
if (!is_affected_by_effect(EFFECT_CANNOT_DISABLE) && is_affected_by_effect(EFFECT_DISABLE))
set_status(STATUS_DISABLED, TRUE);
else
set_status(STATUS_DISABLED, FALSE);
int32 cur_dis = is_status(STATUS_DISABLED);
if(pre_dis != cur_dis)
filter_immune_effect();
}
std::tuple<uint8, effect*> card::refresh_control_status() {
uint8 final = owner;
......@@ -2373,44 +2363,40 @@ void card::filter_single_continuous_effect(int32 code, effect_set* eset, uint8 s
}
// refresh this->immune_effect
void card::filter_immune_effect() {
effect* peffect;
immune_effect.clear();
auto rg = single_effect.equal_range(EFFECT_IMMUNE_EFFECT);
for (; rg.first != rg.second; ++rg.first) {
peffect = rg.first->second;
if (peffect->is_available())
immune_effect.add_item(peffect);
effect* peffect = rg.first->second;
immune_effect.add_item(peffect);
}
for (auto& pcard : equiping_cards) {
rg = pcard->equip_effect.equal_range(EFFECT_IMMUNE_EFFECT);
for (; rg.first != rg.second; ++rg.first) {
peffect = rg.first->second;
if (peffect->is_available())
immune_effect.add_item(peffect);
effect* peffect = rg.first->second;
immune_effect.add_item(peffect);
}
}
for (auto& pcard : effect_target_owner) {
rg = pcard->target_effect.equal_range(EFFECT_IMMUNE_EFFECT);
for (; rg.first != rg.second; ++rg.first) {
peffect = rg.first->second;
if(peffect->is_target(this) && peffect->is_available())
effect* peffect = rg.first->second;
if(peffect->is_target(this))
immune_effect.add_item(peffect);
}
}
for (auto& pcard : xyz_materials) {
rg = pcard->xmaterial_effect.equal_range(EFFECT_IMMUNE_EFFECT);
for (; rg.first != rg.second; ++rg.first) {
peffect = rg.first->second;
effect* peffect = rg.first->second;
if (peffect->type & EFFECT_TYPE_FIELD)
continue;
if (peffect->is_available())
immune_effect.add_item(peffect);
immune_effect.add_item(peffect);
}
}
rg = pduel->game_field->effects.aura_effect.equal_range(EFFECT_IMMUNE_EFFECT);
for (; rg.first != rg.second; ++rg.first) {
peffect = rg.first->second;
if (peffect->is_target(this) && peffect->is_available())
effect* peffect = rg.first->second;
if (peffect->is_target(this))
immune_effect.add_item(peffect);
}
immune_effect.sort();
......
......@@ -511,10 +511,10 @@ int32 effect::is_player_effect_target(card* pcard) {
return TRUE;
}
int32 effect::is_immuned(card* pcard) {
effect_set_v effects = pcard->immune_effect;
const effect_set_v& effects = pcard->immune_effect;
for (int32 i = 0; i < effects.size(); ++i) {
effect* peffect = effects.at(i);
if(peffect->value) {
effect* peffect = effects[i];
if(peffect->is_available() && peffect->value) {
pduel->lua->add_param(this, PARAM_TYPE_EFFECT);
pduel->lua->add_param(pcard, PARAM_TYPE_CARD);
if(peffect->check_value_condition(2))
......
......@@ -92,12 +92,21 @@ struct effect_set_v {
return;
std::sort(container.begin(), container.begin() + count, effect_sort_id);
}
effect* const& get_last() const {
return container[count - 1];
}
effect*& get_last() {
return container[count - 1];
}
effect* const& operator[] (int index) const {
return container[index];
}
effect*& operator[] (int index) {
return container[index];
}
effect* const& at(int index) const {
return container[index];
}
effect*& at(int index) {
return container[index];
}
......
......@@ -1913,38 +1913,35 @@ void field::update_disable_check_list(effect* peffect) {
add_to_disable_check_list(pcard);
}
void field::add_to_disable_check_list(card* pcard) {
auto result=effects.disable_check_set.insert(pcard);
auto result = effects.disable_check_set.insert(pcard);
if(!result.second)
return;
effects.disable_check_list.push_back(pcard);
}
void field::adjust_disable_check_list() {
card* checking;
int32 pre_disable, new_disable;
if (!effects.disable_check_list.size())
if(!effects.disable_check_list.size())
return;
card_set checked;
do {
checked.clear();
while (effects.disable_check_list.size()) {
checking = effects.disable_check_list.front();
card_set checked;
while(effects.disable_check_list.size()) {
card* checking = effects.disable_check_list.front();
effects.disable_check_list.pop_front();
effects.disable_check_set.erase(checking);
checked.insert(checking);
if (checking->is_status(STATUS_TO_ENABLE | STATUS_TO_DISABLE))
if(checking->is_status(STATUS_TO_ENABLE | STATUS_TO_DISABLE))
continue;
pre_disable = checking->get_status(STATUS_DISABLED | STATUS_FORBIDDEN);
int32 pre_disable = checking->get_status(STATUS_DISABLED | STATUS_FORBIDDEN);
checking->refresh_disable_status();
new_disable = checking->get_status(STATUS_DISABLED | STATUS_FORBIDDEN);
if (pre_disable != new_disable && checking->is_status(STATUS_EFFECT_ENABLED)) {
int32 new_disable = checking->get_status(STATUS_DISABLED | STATUS_FORBIDDEN);
if(pre_disable != new_disable && checking->is_status(STATUS_EFFECT_ENABLED)) {
checking->filter_disable_related_cards();
if (pre_disable)
if(pre_disable)
checking->set_status(STATUS_TO_ENABLE, TRUE);
else
checking->set_status(STATUS_TO_DISABLE, TRUE);
}
}
for (auto& pcard : checked) {
for(auto& pcard : checked) {
if(pcard->is_status(STATUS_DISABLED) && pcard->is_status(STATUS_TO_DISABLE) && !pcard->is_status(STATUS_TO_ENABLE))
pcard->reset(RESET_DISABLE, RESET_EVENT);
pcard->set_status(STATUS_TO_ENABLE | STATUS_TO_DISABLE, FALSE);
......
......@@ -1365,6 +1365,10 @@ int32 field::self_destroy(uint16 step, card* ucard, int32 p) {
int32 field::trap_monster_adjust(uint16 step) {
switch(step) {
case 0: {
if(core.duel_rule <= 4) {
core.units.begin()->step = 3;
return FALSE;
}
card_set* to_grave_set = new card_set;
core.units.begin()->ptr1 = to_grave_set;
return FALSE;
......@@ -1419,14 +1423,17 @@ int32 field::trap_monster_adjust(uint16 step) {
for(uint8 p = 0; p < 2; ++p) {
for(auto& pcard : core.trap_monster_adjust_set[tp]) {
pcard->reset(RESET_TURN_SET, RESET_EVENT);
if(core.duel_rule <= 4)
refresh_location_info_instant();
move_to_field(pcard, tp, tp, LOCATION_SZONE, pcard->current.position, FALSE, 2);
}
tp = 1 - tp;
}
card_set* to_grave_set = (card_set*)core.units.begin()->ptr1;
if(to_grave_set->size())
send_to(to_grave_set, 0, REASON_RULE, PLAYER_NONE, PLAYER_NONE, LOCATION_GRAVE, 0, POS_FACEUP);
delete to_grave_set;
if(card_set* to_grave_set = (card_set*)core.units.begin()->ptr1) {
if(to_grave_set->size())
send_to(to_grave_set, 0, REASON_RULE, PLAYER_NONE, PLAYER_NONE, LOCATION_GRAVE, 0, POS_FACEUP);
delete to_grave_set;
}
return TRUE;
}
}
......
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