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