Commit facfa14d authored by mercury233's avatar mercury233

update ocgcore

parent 21f22a05
...@@ -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;
...@@ -2068,18 +2058,31 @@ void card::release_relation(effect* peffect) { ...@@ -2068,18 +2058,31 @@ void card::release_relation(effect* peffect) {
int32 card::leave_field_redirect(uint32 reason) { int32 card::leave_field_redirect(uint32 reason) {
effect_set es; effect_set es;
uint32 redirect; uint32 redirect;
uint32 redirects = 0;
if(data.type & TYPE_TOKEN) if(data.type & TYPE_TOKEN)
return 0; return 0;
filter_effect(EFFECT_LEAVE_FIELD_REDIRECT, &es); filter_effect(EFFECT_LEAVE_FIELD_REDIRECT, &es);
for(int32 i = 0; i < es.size(); ++i) { for(int32 i = 0; i < es.size(); ++i) {
redirect = es[i]->get_value(this, 0); redirect = es[i]->get_value(this, 0);
if((redirect & LOCATION_HAND) && !is_affected_by_effect(EFFECT_CANNOT_TO_HAND) && pduel->game_field->is_player_can_send_to_hand(es[i]->get_handler_player(), this)) if((redirect & LOCATION_HAND) && !is_affected_by_effect(EFFECT_CANNOT_TO_HAND) && pduel->game_field->is_player_can_send_to_hand(es[i]->get_handler_player(), this))
return redirect; redirects |= redirect;
else if((redirect & LOCATION_DECK) && !is_affected_by_effect(EFFECT_CANNOT_TO_DECK) && pduel->game_field->is_player_can_send_to_deck(es[i]->get_handler_player(), this)) else if((redirect & LOCATION_DECK) && !is_affected_by_effect(EFFECT_CANNOT_TO_DECK) && pduel->game_field->is_player_can_send_to_deck(es[i]->get_handler_player(), this))
return redirect; redirects |= redirect;
else if((redirect & LOCATION_REMOVED) && !is_affected_by_effect(EFFECT_CANNOT_REMOVE) && pduel->game_field->is_player_can_remove(es[i]->get_handler_player(), this, REASON_EFFECT)) else if((redirect & LOCATION_REMOVED) && !is_affected_by_effect(EFFECT_CANNOT_REMOVE) && pduel->game_field->is_player_can_remove(es[i]->get_handler_player(), this, REASON_EFFECT))
return redirect; redirects |= redirect;
} }
if(redirects & LOCATION_REMOVED)
return LOCATION_REMOVED;
// the ruling for the priority of the following redirects can't be confirmed for now
if(redirects & LOCATION_DECK) {
if(redirects & LOCATION_DECKBOT)
return LOCATION_DECKBOT;
if(redirects & LOCATION_DECKSHF)
return LOCATION_DECKSHF;
return LOCATION_DECK;
}
if(redirects & LOCATION_HAND)
return LOCATION_HAND;
return 0; return 0;
} }
int32 card::destination_redirect(uint8 destination, uint32 reason) { int32 card::destination_redirect(uint8 destination, uint32 reason) {
...@@ -2227,9 +2230,8 @@ int32 card::get_counter(uint16 countertype) { ...@@ -2227,9 +2230,8 @@ int32 card::get_counter(uint16 countertype) {
void card::set_material(card_set* materials) { void card::set_material(card_set* materials) {
if(!materials) { if(!materials) {
material_cards.clear(); material_cards.clear();
return; } else
} material_cards = *materials;
material_cards = *materials;
for(auto& pcard : material_cards) for(auto& pcard : material_cards)
pcard->current.reason_card = this; pcard->current.reason_card = this;
effect_set eset; effect_set eset;
...@@ -2373,44 +2375,40 @@ void card::filter_single_continuous_effect(int32 code, effect_set* eset, uint8 s ...@@ -2373,44 +2375,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();
...@@ -2625,7 +2623,7 @@ void card::filter_spsummon_procedure(uint8 playerid, effect_set* peset, uint32 s ...@@ -2625,7 +2623,7 @@ void card::filter_spsummon_procedure(uint8 playerid, effect_set* peset, uint32 s
toplayer = playerid; toplayer = playerid;
} }
if(peffect->is_available() && peffect->check_count_limit(playerid) && is_spsummonable(peffect) if(peffect->is_available() && peffect->check_count_limit(playerid) && is_spsummonable(peffect)
&& !pduel->game_field->check_unique_onfield(this, toplayer, LOCATION_MZONE)) { && ((topos & POS_FACEDOWN) || !pduel->game_field->check_unique_onfield(this, toplayer, LOCATION_MZONE))) {
effect* sumeffect = pduel->game_field->core.reason_effect; effect* sumeffect = pduel->game_field->core.reason_effect;
if(!sumeffect) if(!sumeffect)
sumeffect = peffect; sumeffect = peffect;
...@@ -2859,7 +2857,7 @@ void card::get_unique_target(card_set* cset, int32 controler, card* icard) { ...@@ -2859,7 +2857,7 @@ void card::get_unique_target(card_set* cset, int32 controler, card* icard) {
const auto& player = pduel->game_field->player[controler ^ p]; const auto& player = pduel->game_field->player[controler ^ p];
if(unique_location & LOCATION_MZONE) { if(unique_location & LOCATION_MZONE) {
for(auto& pcard : player.list_mzone) { for(auto& pcard : player.list_mzone) {
if(pcard && (pcard != icard) && pcard->is_position(POS_FACEUP) && !pcard->get_status(STATUS_BATTLE_DESTROYED | STATUS_SPSUMMON_STEP) if(pcard && (pcard != icard) && pcard->is_position(POS_FACEUP) && !pcard->get_status(STATUS_SPSUMMON_STEP)
&& check_unique_code(pcard)) && check_unique_code(pcard))
cset->insert(pcard); cset->insert(pcard);
} }
...@@ -2913,8 +2911,8 @@ int32 card::is_fusion_summonable_card(uint32 summon_type) { ...@@ -2913,8 +2911,8 @@ int32 card::is_fusion_summonable_card(uint32 summon_type) {
effect_set eset; effect_set eset;
filter_effect(EFFECT_SPSUMMON_CONDITION, &eset); filter_effect(EFFECT_SPSUMMON_CONDITION, &eset);
for(int32 i = 0; i < eset.size(); ++i) { for(int32 i = 0; i < eset.size(); ++i) {
pduel->lua->add_param((void*)0, PARAM_TYPE_EFFECT); pduel->lua->add_param(pduel->game_field->core.reason_effect, PARAM_TYPE_EFFECT);
pduel->lua->add_param((void*)0, PARAM_TYPE_INT); pduel->lua->add_param(pduel->game_field->core.reason_player, PARAM_TYPE_INT);
pduel->lua->add_param(summon_type, PARAM_TYPE_INT); pduel->lua->add_param(summon_type, PARAM_TYPE_INT);
pduel->lua->add_param((void*)0, PARAM_TYPE_INT); pduel->lua->add_param((void*)0, PARAM_TYPE_INT);
pduel->lua->add_param((void*)0, PARAM_TYPE_INT); pduel->lua->add_param((void*)0, PARAM_TYPE_INT);
...@@ -3026,7 +3024,7 @@ int32 card::is_can_be_summoned(uint8 playerid, uint8 ignore_count, effect* peffe ...@@ -3026,7 +3024,7 @@ int32 card::is_can_be_summoned(uint8 playerid, uint8 ignore_count, effect* peffe
effect_set proc; effect_set proc;
int32 res = filter_summon_procedure(playerid, &proc, ignore_count, min_tribute, zone); int32 res = filter_summon_procedure(playerid, &proc, ignore_count, min_tribute, zone);
if(peffect) { if(peffect) {
if(res < 0 || !pduel->game_field->is_player_can_summon(peffect->get_value(), playerid, this, playerid)) { if(res < 0 || !check_summon_procedure(peffect, playerid, ignore_count, min_tribute, zone)) {
pduel->game_field->restore_lp_cost(); pduel->game_field->restore_lp_cost();
return FALSE; return FALSE;
} }
...@@ -3133,17 +3131,6 @@ int32 card::is_special_summonable(uint8 playerid, uint32 summon_type) { ...@@ -3133,17 +3131,6 @@ int32 card::is_special_summonable(uint8 playerid, uint32 summon_type) {
} }
effect_set eset; effect_set eset;
filter_spsummon_procedure(playerid, &eset, summon_type); filter_spsummon_procedure(playerid, &eset, summon_type);
pduel->game_field->core.limit_tuner = 0;
pduel->game_field->core.limit_syn = 0;
pduel->game_field->core.limit_syn_minc = 0;
pduel->game_field->core.limit_syn_maxc = 0;
pduel->game_field->core.limit_xyz = 0;
pduel->game_field->core.limit_xyz_minc = 0;
pduel->game_field->core.limit_xyz_maxc = 0;
pduel->game_field->core.limit_link = 0;
pduel->game_field->core.limit_link_card = 0;
pduel->game_field->core.limit_link_minc = 0;
pduel->game_field->core.limit_link_maxc = 0;
pduel->game_field->restore_lp_cost(); pduel->game_field->restore_lp_cost();
return eset.size(); return eset.size();
} }
...@@ -3164,7 +3151,9 @@ int32 card::is_can_be_special_summoned(effect* reason_effect, uint32 sumtype, ui ...@@ -3164,7 +3151,9 @@ int32 card::is_can_be_special_summoned(effect* reason_effect, uint32 sumtype, ui
if((data.type & TYPE_PENDULUM) && current.location == LOCATION_EXTRA && (current.position & POS_FACEUP) if((data.type & TYPE_PENDULUM) && current.location == LOCATION_EXTRA && (current.position & POS_FACEUP)
&& (sumtype == SUMMON_TYPE_FUSION || sumtype == SUMMON_TYPE_SYNCHRO || sumtype == SUMMON_TYPE_XYZ)) && (sumtype == SUMMON_TYPE_FUSION || sumtype == SUMMON_TYPE_SYNCHRO || sumtype == SUMMON_TYPE_XYZ))
return FALSE; return FALSE;
if(((sumpos & POS_FACEDOWN) == 0) && pduel->game_field->check_unique_onfield(this, toplayer, LOCATION_MZONE)) if((sumpos & POS_FACEDOWN) && pduel->game_field->is_player_affected_by_effect(sumplayer, EFFECT_DEVINE_LIGHT))
sumpos = (sumpos & POS_FACEUP) | ((sumpos & POS_FACEDOWN) >> 1);
if(!(sumpos & POS_FACEDOWN) && pduel->game_field->check_unique_onfield(this, toplayer, LOCATION_MZONE))
return FALSE; return FALSE;
sumtype |= SUMMON_TYPE_SPECIAL; sumtype |= SUMMON_TYPE_SPECIAL;
if((sumplayer == 0 || sumplayer == 1) && !pduel->game_field->is_player_can_spsummon(reason_effect, sumtype, sumpos, sumplayer, toplayer, this)) if((sumplayer == 0 || sumplayer == 1) && !pduel->game_field->is_player_can_spsummon(reason_effect, sumtype, sumpos, sumplayer, toplayer, this))
...@@ -3224,7 +3213,7 @@ int32 card::is_setable_mzone(uint8 playerid, uint8 ignore_count, effect* peffect ...@@ -3224,7 +3213,7 @@ int32 card::is_setable_mzone(uint8 playerid, uint8 ignore_count, effect* peffect
effect_set eset; effect_set eset;
int32 res = filter_set_procedure(playerid, &eset, ignore_count, min_tribute, zone); int32 res = filter_set_procedure(playerid, &eset, ignore_count, min_tribute, zone);
if(peffect) { if(peffect) {
if(res < 0 || !pduel->game_field->is_player_can_mset(peffect->get_value(), playerid, this, playerid)) { if(res < 0 || !check_set_procedure(peffect, playerid, ignore_count, min_tribute, zone)) {
pduel->game_field->restore_lp_cost(); pduel->game_field->restore_lp_cost();
return FALSE; return FALSE;
} }
...@@ -3635,13 +3624,15 @@ int32 card::is_capable_be_battle_target(card* pcard) { ...@@ -3635,13 +3624,15 @@ int32 card::is_capable_be_battle_target(card* pcard) {
return FALSE; return FALSE;
if(pcard->is_affected_by_effect(EFFECT_CANNOT_SELECT_BATTLE_TARGET, this)) if(pcard->is_affected_by_effect(EFFECT_CANNOT_SELECT_BATTLE_TARGET, this))
return FALSE; return FALSE;
if(is_affected_by_effect(EFFECT_IGNORE_BATTLE_TARGET)) if(is_affected_by_effect(EFFECT_IGNORE_BATTLE_TARGET, pcard))
return FALSE; return FALSE;
return TRUE; return TRUE;
} }
int32 card::is_capable_be_effect_target(effect* reason_effect, uint8 playerid) { int32 card::is_capable_be_effect_target(effect* reason_effect, uint8 playerid) {
if(is_status(STATUS_SUMMONING) || is_status(STATUS_BATTLE_DESTROYED)) if(is_status(STATUS_SUMMONING) || is_status(STATUS_BATTLE_DESTROYED))
return FALSE; return FALSE;
if(current.location & (LOCATION_DECK | LOCATION_EXTRA | LOCATION_HAND))
return FALSE;
effect_set eset; effect_set eset;
filter_effect(EFFECT_CANNOT_BE_EFFECT_TARGET, &eset); filter_effect(EFFECT_CANNOT_BE_EFFECT_TARGET, &eset);
for(int32 i = 0; i < eset.size(); ++i) { for(int32 i = 0; i < eset.size(); ++i) {
......
...@@ -50,6 +50,9 @@ struct card_sort { ...@@ -50,6 +50,9 @@ struct card_sort {
#define LOCATION_ONFIELD 0x0c // #define LOCATION_ONFIELD 0x0c //
#define LOCATION_FZONE 0x100 // #define LOCATION_FZONE 0x100 //
#define LOCATION_PZONE 0x200 // #define LOCATION_PZONE 0x200 //
//For redirect
#define LOCATION_DECKBOT 0x10001 //Return to deck bottom
#define LOCATION_DECKSHF 0x20001 //Return to deck and shuffle
//Positions //Positions
#define POS_FACEUP_ATTACK 0x1 #define POS_FACEUP_ATTACK 0x1
......
...@@ -352,50 +352,53 @@ int32 effect::is_action_check(uint8 playerid) { ...@@ -352,50 +352,53 @@ int32 effect::is_action_check(uint8 playerid) {
return TRUE; return TRUE;
} }
// check functions: condition, cost(chk=0), target(chk=0) // check functions: condition, cost(chk=0), target(chk=0)
int32 effect::is_activate_ready(uint8 playerid, const tevent& e, int32 neglect_cond, int32 neglect_cost, int32 neglect_target) { int32 effect::is_activate_ready(effect* reason_effect, uint8 playerid, const tevent& e, int32 neglect_cond, int32 neglect_cost, int32 neglect_target) {
if (!neglect_cond && condition) { if(!neglect_cond && condition) {
pduel->lua->add_param(this, PARAM_TYPE_EFFECT); pduel->lua->add_param(reason_effect, PARAM_TYPE_EFFECT);
pduel->lua->add_param(playerid, PARAM_TYPE_INT); pduel->lua->add_param(playerid, PARAM_TYPE_INT);
pduel->lua->add_param(e.event_cards , PARAM_TYPE_GROUP); pduel->lua->add_param(e.event_cards, PARAM_TYPE_GROUP);
pduel->lua->add_param(e.event_player, PARAM_TYPE_INT); pduel->lua->add_param(e.event_player, PARAM_TYPE_INT);
pduel->lua->add_param(e.event_value, PARAM_TYPE_INT); pduel->lua->add_param(e.event_value, PARAM_TYPE_INT);
pduel->lua->add_param(e.reason_effect , PARAM_TYPE_EFFECT); pduel->lua->add_param(e.reason_effect, PARAM_TYPE_EFFECT);
pduel->lua->add_param(e.reason, PARAM_TYPE_INT); pduel->lua->add_param(e.reason, PARAM_TYPE_INT);
pduel->lua->add_param(e.reason_player, PARAM_TYPE_INT); pduel->lua->add_param(e.reason_player, PARAM_TYPE_INT);
if (!pduel->lua->check_condition(condition, 8)) { if(!pduel->lua->check_condition(condition, 8)) {
return FALSE; return FALSE;
} }
} }
if(!neglect_cost && cost && !(type & EFFECT_TYPE_CONTINUOUS)) { if(!neglect_cost && cost && !(type & EFFECT_TYPE_CONTINUOUS)) {
pduel->lua->add_param(this, PARAM_TYPE_EFFECT); pduel->lua->add_param(reason_effect, PARAM_TYPE_EFFECT);
pduel->lua->add_param(playerid, PARAM_TYPE_INT); pduel->lua->add_param(playerid, PARAM_TYPE_INT);
pduel->lua->add_param(e.event_cards , PARAM_TYPE_GROUP); pduel->lua->add_param(e.event_cards, PARAM_TYPE_GROUP);
pduel->lua->add_param(e.event_player, PARAM_TYPE_INT); pduel->lua->add_param(e.event_player, PARAM_TYPE_INT);
pduel->lua->add_param(e.event_value, PARAM_TYPE_INT); pduel->lua->add_param(e.event_value, PARAM_TYPE_INT);
pduel->lua->add_param(e.reason_effect , PARAM_TYPE_EFFECT); pduel->lua->add_param(e.reason_effect, PARAM_TYPE_EFFECT);
pduel->lua->add_param(e.reason, PARAM_TYPE_INT); pduel->lua->add_param(e.reason, PARAM_TYPE_INT);
pduel->lua->add_param(e.reason_player, PARAM_TYPE_INT); pduel->lua->add_param(e.reason_player, PARAM_TYPE_INT);
pduel->lua->add_param((ptr)0, PARAM_TYPE_INT); pduel->lua->add_param((ptr)0, PARAM_TYPE_INT);
if (!pduel->lua->check_condition(cost, 9)) { if(!pduel->lua->check_condition(cost, 9)) {
return FALSE; return FALSE;
} }
} }
if(!neglect_target && target) { if(!neglect_target && target) {
pduel->lua->add_param(this, PARAM_TYPE_EFFECT); pduel->lua->add_param(reason_effect, PARAM_TYPE_EFFECT);
pduel->lua->add_param(playerid, PARAM_TYPE_INT); pduel->lua->add_param(playerid, PARAM_TYPE_INT);
pduel->lua->add_param(e.event_cards , PARAM_TYPE_GROUP); pduel->lua->add_param(e.event_cards, PARAM_TYPE_GROUP);
pduel->lua->add_param(e.event_player, PARAM_TYPE_INT); pduel->lua->add_param(e.event_player, PARAM_TYPE_INT);
pduel->lua->add_param(e.event_value, PARAM_TYPE_INT); pduel->lua->add_param(e.event_value, PARAM_TYPE_INT);
pduel->lua->add_param(e.reason_effect , PARAM_TYPE_EFFECT); pduel->lua->add_param(e.reason_effect, PARAM_TYPE_EFFECT);
pduel->lua->add_param(e.reason, PARAM_TYPE_INT); pduel->lua->add_param(e.reason, PARAM_TYPE_INT);
pduel->lua->add_param(e.reason_player, PARAM_TYPE_INT); pduel->lua->add_param(e.reason_player, PARAM_TYPE_INT);
pduel->lua->add_param((ptr)0, PARAM_TYPE_INT); pduel->lua->add_param((ptr)0, PARAM_TYPE_INT);
if (!pduel->lua->check_condition(target, 9)) { if(!pduel->lua->check_condition(target, 9)) {
return FALSE; return FALSE;
} }
} }
return TRUE; return TRUE;
} }
int32 effect::is_activate_ready(uint8 playerid, const tevent& e, int32 neglect_cond, int32 neglect_cost, int32 neglect_target) {
return is_activate_ready(this, playerid, e, neglect_cond, neglect_cost, neglect_target);
}
// check functions: condition // check functions: condition
int32 effect::is_condition_check(uint8 playerid, const tevent& e) { int32 effect::is_condition_check(uint8 playerid, const tevent& e) {
card* phandler = get_handler(); card* phandler = get_handler();
...@@ -453,6 +456,8 @@ int32 effect::is_target(card* pcard) { ...@@ -453,6 +456,8 @@ int32 effect::is_target(card* pcard) {
if(!is_flag(EFFECT_FLAG_IGNORE_RANGE)) { if(!is_flag(EFFECT_FLAG_IGNORE_RANGE)) {
if(pcard->get_status(STATUS_SUMMONING | STATUS_SUMMON_DISABLED | STATUS_ACTIVATE_DISABLED | STATUS_SPSUMMON_STEP)) if(pcard->get_status(STATUS_SUMMONING | STATUS_SUMMON_DISABLED | STATUS_ACTIVATE_DISABLED | STATUS_SPSUMMON_STEP))
return FALSE; return FALSE;
if(is_flag(EFFECT_FLAG_SPSUM_PARAM))
return FALSE;
if(is_flag(EFFECT_FLAG_ABSOLUTE_TARGET)) { if(is_flag(EFFECT_FLAG_ABSOLUTE_TARGET)) {
if(pcard->current.controler == 0) { if(pcard->current.controler == 0) {
if(!pcard->current.is_location(s_range)) if(!pcard->current.is_location(s_range))
...@@ -511,10 +516,10 @@ int32 effect::is_player_effect_target(card* pcard) { ...@@ -511,10 +516,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))
......
...@@ -72,6 +72,7 @@ public: ...@@ -72,6 +72,7 @@ public:
int32 check_count_limit(uint8 playerid); int32 check_count_limit(uint8 playerid);
int32 is_activateable(uint8 playerid, const tevent& e, int32 neglect_cond = FALSE, int32 neglect_cost = FALSE, int32 neglect_target = FALSE, int32 neglect_loc = FALSE, int32 neglect_faceup = FALSE); int32 is_activateable(uint8 playerid, const tevent& e, int32 neglect_cond = FALSE, int32 neglect_cost = FALSE, int32 neglect_target = FALSE, int32 neglect_loc = FALSE, int32 neglect_faceup = FALSE);
int32 is_action_check(uint8 playerid); int32 is_action_check(uint8 playerid);
int32 is_activate_ready(effect* reason_effect, uint8 playerid, const tevent& e, int32 neglect_cond = FALSE, int32 neglect_cost = FALSE, int32 neglect_target = FALSE);
int32 is_activate_ready(uint8 playerid, const tevent& e, int32 neglect_cond = FALSE, int32 neglect_cost = FALSE, int32 neglect_target = FALSE); int32 is_activate_ready(uint8 playerid, const tevent& e, int32 neglect_cond = FALSE, int32 neglect_cost = FALSE, int32 neglect_target = FALSE);
int32 is_condition_check(uint8 playerid, const tevent& e); int32 is_condition_check(uint8 playerid, const tevent& e);
int32 is_activate_check(uint8 playerid, const tevent& e, int32 neglect_cond = FALSE, int32 neglect_cost = FALSE, int32 neglect_target = FALSE); int32 is_activate_check(uint8 playerid, const tevent& e, int32 neglect_cond = FALSE, int32 neglect_cost = FALSE, int32 neglect_target = FALSE);
...@@ -275,6 +276,7 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2) ...@@ -275,6 +276,7 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
#define EFFECT_DUAL_STATUS 75 // #define EFFECT_DUAL_STATUS 75 //
#define EFFECT_EQUIP_LIMIT 76 // #define EFFECT_EQUIP_LIMIT 76 //
#define EFFECT_DUAL_SUMMONABLE 77 // #define EFFECT_DUAL_SUMMONABLE 77 //
#define EFFECT_UNION_LIMIT 78 //
#define EFFECT_REVERSE_DAMAGE 80 // #define EFFECT_REVERSE_DAMAGE 80 //
#define EFFECT_REVERSE_RECOVER 81 // #define EFFECT_REVERSE_RECOVER 81 //
#define EFFECT_CHANGE_DAMAGE 82 // #define EFFECT_CHANGE_DAMAGE 82 //
...@@ -474,8 +476,9 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2) ...@@ -474,8 +476,9 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
#define EVENT_CHAINING 1027 #define EVENT_CHAINING 1027
#define EVENT_BECOME_TARGET 1028 #define EVENT_BECOME_TARGET 1028
#define EVENT_DESTROYED 1029 #define EVENT_DESTROYED 1029
#define EVENT_MOVE 1030 #define EVENT_MOVE 1030
#define EVENT_ADJUST 1040 #define EVENT_ADJUST 1040
#define EVENT_BREAK_EFFECT 1050
#define EVENT_SUMMON_SUCCESS 1100 #define EVENT_SUMMON_SUCCESS 1100
#define EVENT_FLIP_SUMMON_SUCCESS 1101 #define EVENT_FLIP_SUMMON_SUCCESS 1101
#define EVENT_SPSUMMON_SUCCESS 1102 #define EVENT_SPSUMMON_SUCCESS 1102
......
...@@ -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];
} }
......
This diff is collapsed.
...@@ -447,8 +447,8 @@ public: ...@@ -447,8 +447,8 @@ public:
int32 check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 findex2, int32 min, int32 max, card* smat, group* mg); int32 check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 findex2, int32 min, int32 max, card* smat, group* mg);
int32 check_other_synchro_material(const card_vector& nsyn, int32 lv, int32 min, int32 max, int32 mcount); int32 check_other_synchro_material(const card_vector& nsyn, int32 lv, int32 min, int32 max, int32 mcount);
int32 check_tribute(card* pcard, int32 min, int32 max, group* mg, uint8 toplayer, uint32 zone = 0x1f, uint32 releasable = 0xff00ff, uint32 pos = 0x1); int32 check_tribute(card* pcard, int32 min, int32 max, group* mg, uint8 toplayer, uint32 zone = 0x1f, uint32 releasable = 0xff00ff, uint32 pos = 0x1);
static int32 check_with_sum_limit(const card_vector& mats, int32 acc, int32 index, int32 count, int32 min, int32 max); static int32 check_with_sum_limit(const card_vector& mats, int32 acc, int32 index, int32 count, int32 min, int32 max, int32 opmin);
static int32 check_with_sum_limit_m(const card_vector& mats, int32 acc, int32 index, int32 min, int32 max, int32 must_count); static int32 check_with_sum_limit_m(const card_vector& mats, int32 acc, int32 index, int32 min, int32 max, int32 opmin, int32 must_count);
static int32 check_with_sum_greater_limit(const card_vector& mats, int32 acc, int32 index, int32 opmin); static int32 check_with_sum_greater_limit(const card_vector& mats, int32 acc, int32 index, int32 opmin);
static int32 check_with_sum_greater_limit_m(const card_vector& mats, int32 acc, int32 index, int32 opmin, int32 must_count); static int32 check_with_sum_greater_limit_m(const card_vector& mats, int32 acc, int32 index, int32 opmin, int32 must_count);
int32 check_xyz_material(card* pcard, int32 findex, int32 lv, int32 min, int32 max, group* mg); int32 check_xyz_material(card* pcard, int32 findex, int32 lv, int32 min, int32 max, group* mg);
......
This diff is collapsed.
...@@ -281,9 +281,11 @@ int32 scriptlib::duel_summon(lua_State *L) { ...@@ -281,9 +281,11 @@ int32 scriptlib::duel_summon(lua_State *L) {
zone = (uint32)lua_tointeger(L, 6); zone = (uint32)lua_tointeger(L, 6);
pduel->game_field->core.summon_cancelable = FALSE; pduel->game_field->core.summon_cancelable = FALSE;
pduel->game_field->summon(playerid, pcard, peffect, ignore_count, min_tribute, zone); pduel->game_field->summon(playerid, pcard, peffect, ignore_count, min_tribute, zone);
pduel->game_field->core.reserved = pduel->game_field->core.subunits.back(); if(pduel->game_field->core.current_chain.size()) {
pduel->game_field->core.subunits.pop_back(); pduel->game_field->core.reserved = pduel->game_field->core.subunits.back();
pduel->game_field->core.summoning_card = pcard; pduel->game_field->core.subunits.pop_back();
pduel->game_field->core.summoning_card = pcard;
}
return lua_yield(L, 0); return lua_yield(L, 0);
} }
int32 scriptlib::duel_special_summon_rule(lua_State *L) { int32 scriptlib::duel_special_summon_rule(lua_State *L) {
...@@ -302,9 +304,11 @@ int32 scriptlib::duel_special_summon_rule(lua_State *L) { ...@@ -302,9 +304,11 @@ int32 scriptlib::duel_special_summon_rule(lua_State *L) {
sumtype = (uint32)lua_tointeger(L, 3); sumtype = (uint32)lua_tointeger(L, 3);
pduel->game_field->core.summon_cancelable = FALSE; pduel->game_field->core.summon_cancelable = FALSE;
pduel->game_field->special_summon_rule(playerid, pcard, sumtype); pduel->game_field->special_summon_rule(playerid, pcard, sumtype);
pduel->game_field->core.reserved = pduel->game_field->core.subunits.back(); if(pduel->game_field->core.current_chain.size()) {
pduel->game_field->core.subunits.pop_back(); pduel->game_field->core.reserved = pduel->game_field->core.subunits.back();
pduel->game_field->core.summoning_card = pcard; pduel->game_field->core.subunits.pop_back();
pduel->game_field->core.summoning_card = pcard;
}
return lua_yield(L, 0); return lua_yield(L, 0);
} }
int32 scriptlib::duel_synchro_summon(lua_State *L) { int32 scriptlib::duel_synchro_summon(lua_State *L) {
...@@ -344,9 +348,11 @@ int32 scriptlib::duel_synchro_summon(lua_State *L) { ...@@ -344,9 +348,11 @@ int32 scriptlib::duel_synchro_summon(lua_State *L) {
pduel->game_field->core.limit_syn_maxc = maxc; pduel->game_field->core.limit_syn_maxc = maxc;
pduel->game_field->core.summon_cancelable = FALSE; pduel->game_field->core.summon_cancelable = FALSE;
pduel->game_field->special_summon_rule(playerid, pcard, SUMMON_TYPE_SYNCHRO); pduel->game_field->special_summon_rule(playerid, pcard, SUMMON_TYPE_SYNCHRO);
pduel->game_field->core.reserved = pduel->game_field->core.subunits.back(); if(pduel->game_field->core.current_chain.size()) {
pduel->game_field->core.subunits.pop_back(); pduel->game_field->core.reserved = pduel->game_field->core.subunits.back();
pduel->game_field->core.summoning_card = pcard; pduel->game_field->core.subunits.pop_back();
pduel->game_field->core.summoning_card = pcard;
}
return lua_yield(L, 0); return lua_yield(L, 0);
} }
int32 scriptlib::duel_xyz_summon(lua_State *L) { int32 scriptlib::duel_xyz_summon(lua_State *L) {
...@@ -378,9 +384,11 @@ int32 scriptlib::duel_xyz_summon(lua_State *L) { ...@@ -378,9 +384,11 @@ int32 scriptlib::duel_xyz_summon(lua_State *L) {
pduel->game_field->core.limit_xyz_maxc = maxc; pduel->game_field->core.limit_xyz_maxc = maxc;
pduel->game_field->core.summon_cancelable = FALSE; pduel->game_field->core.summon_cancelable = FALSE;
pduel->game_field->special_summon_rule(playerid, pcard, SUMMON_TYPE_XYZ); pduel->game_field->special_summon_rule(playerid, pcard, SUMMON_TYPE_XYZ);
pduel->game_field->core.reserved = pduel->game_field->core.subunits.back(); if(pduel->game_field->core.current_chain.size()) {
pduel->game_field->core.subunits.pop_back(); pduel->game_field->core.reserved = pduel->game_field->core.subunits.back();
pduel->game_field->core.summoning_card = pcard; pduel->game_field->core.subunits.pop_back();
pduel->game_field->core.summoning_card = pcard;
}
return lua_yield(L, 0); return lua_yield(L, 0);
} }
int32 scriptlib::duel_link_summon(lua_State *L) { int32 scriptlib::duel_link_summon(lua_State *L) {
...@@ -420,9 +428,11 @@ int32 scriptlib::duel_link_summon(lua_State *L) { ...@@ -420,9 +428,11 @@ int32 scriptlib::duel_link_summon(lua_State *L) {
pduel->game_field->core.limit_link_maxc = maxc; pduel->game_field->core.limit_link_maxc = maxc;
pduel->game_field->core.summon_cancelable = FALSE; pduel->game_field->core.summon_cancelable = FALSE;
pduel->game_field->special_summon_rule(playerid, pcard, SUMMON_TYPE_LINK); pduel->game_field->special_summon_rule(playerid, pcard, SUMMON_TYPE_LINK);
pduel->game_field->core.reserved = pduel->game_field->core.subunits.back(); if(pduel->game_field->core.current_chain.size()) {
pduel->game_field->core.subunits.pop_back(); pduel->game_field->core.reserved = pduel->game_field->core.subunits.back();
pduel->game_field->core.summoning_card = pcard; pduel->game_field->core.subunits.pop_back();
pduel->game_field->core.summoning_card = pcard;
}
return lua_yield(L, 0); return lua_yield(L, 0);
} }
int32 scriptlib::duel_setm(lua_State *L) { int32 scriptlib::duel_setm(lua_State *L) {
...@@ -450,9 +460,11 @@ int32 scriptlib::duel_setm(lua_State *L) { ...@@ -450,9 +460,11 @@ int32 scriptlib::duel_setm(lua_State *L) {
zone = (uint32)lua_tointeger(L, 6); zone = (uint32)lua_tointeger(L, 6);
pduel->game_field->core.summon_cancelable = FALSE; pduel->game_field->core.summon_cancelable = FALSE;
pduel->game_field->mset(playerid, pcard, peffect, ignore_count, min_tribute, zone); pduel->game_field->mset(playerid, pcard, peffect, ignore_count, min_tribute, zone);
pduel->game_field->core.reserved = pduel->game_field->core.subunits.back(); if(pduel->game_field->core.current_chain.size()) {
pduel->game_field->core.subunits.pop_back(); pduel->game_field->core.reserved = pduel->game_field->core.subunits.back();
pduel->game_field->core.summoning_card = pcard; pduel->game_field->core.subunits.pop_back();
pduel->game_field->core.summoning_card = pcard;
}
return lua_yield(L, 0); return lua_yield(L, 0);
} }
int32 scriptlib::duel_sets(lua_State *L) { int32 scriptlib::duel_sets(lua_State *L) {
...@@ -1699,6 +1711,8 @@ int32 scriptlib::duel_break_effect(lua_State *L) { ...@@ -1699,6 +1711,8 @@ int32 scriptlib::duel_break_effect(lua_State *L) {
check_action_permission(L); check_action_permission(L);
duel* pduel = interpreter::get_duel_info(L); duel* pduel = interpreter::get_duel_info(L);
pduel->game_field->break_effect(); pduel->game_field->break_effect();
pduel->game_field->raise_event((card*)0, EVENT_BREAK_EFFECT, 0, 0, PLAYER_NONE, PLAYER_NONE, 0);
pduel->game_field->process_instant_event();
return lua_yield(L, 0); return lua_yield(L, 0);
} }
int32 scriptlib::duel_change_effect(lua_State *L) { int32 scriptlib::duel_change_effect(lua_State *L) {
......
...@@ -416,7 +416,7 @@ int32 scriptlib::group_check_with_sum_equal(lua_State *L) { ...@@ -416,7 +416,7 @@ int32 scriptlib::group_check_with_sum_equal(lua_State *L) {
pduel->game_field->core.must_select_cards.clear(); pduel->game_field->core.must_select_cards.clear();
for(auto& pcard : cv) for(auto& pcard : cv)
pcard->sum_param = pduel->lua->get_operation_value(pcard, 2, extraargs); pcard->sum_param = pduel->lua->get_operation_value(pcard, 2, extraargs);
lua_pushboolean(L, field::check_with_sum_limit_m(cv, acc, 0, min, max, mcount)); lua_pushboolean(L, field::check_with_sum_limit_m(cv, acc, 0, min, max, 0xffff, mcount));
return 1; return 1;
} }
int32 scriptlib::group_select_with_sum_equal(lua_State *L) { int32 scriptlib::group_select_with_sum_equal(lua_State *L) {
...@@ -447,7 +447,7 @@ int32 scriptlib::group_select_with_sum_equal(lua_State *L) { ...@@ -447,7 +447,7 @@ int32 scriptlib::group_select_with_sum_equal(lua_State *L) {
cv.insert(cv.end(), pduel->game_field->core.select_cards.begin(), pduel->game_field->core.select_cards.end()); cv.insert(cv.end(), pduel->game_field->core.select_cards.begin(), pduel->game_field->core.select_cards.end());
for(auto& pcard : cv) for(auto& pcard : cv)
pcard->sum_param = pduel->lua->get_operation_value(pcard, 3, extraargs); pcard->sum_param = pduel->lua->get_operation_value(pcard, 3, extraargs);
if(!field::check_with_sum_limit_m(cv, acc, 0, min, max, mcount)) { if(!field::check_with_sum_limit_m(cv, acc, 0, min, max, 0xffff, mcount)) {
pduel->game_field->core.must_select_cards.clear(); pduel->game_field->core.must_select_cards.clear();
group* empty_group = pduel->new_group(); group* empty_group = pduel->new_group();
interpreter::group2value(L, empty_group); interpreter::group2value(L, empty_group);
......
...@@ -599,15 +599,15 @@ int32 field::select_counter(uint16 step, uint8 playerid, uint16 countertype, uin ...@@ -599,15 +599,15 @@ int32 field::select_counter(uint16 step, uint8 playerid, uint16 countertype, uin
} }
return TRUE; return TRUE;
} }
static int32 select_sum_check1(const int32* oparam, int32 size, int32 index, int32 acc) { static int32 select_sum_check1(const int32* oparam, int32 size, int32 index, int32 acc, int32 opmin) {
if(acc == 0 || index == size) if(acc == 0 || index == size)
return FALSE; return FALSE;
int32 o1 = oparam[index] & 0xffff; int32 o1 = oparam[index] & 0xffff;
int32 o2 = oparam[index] >> 16; int32 o2 = oparam[index] >> 16;
if(index == size - 1) if(index == size - 1)
return acc == o1 || acc == o2; return (acc == o1 && acc + opmin > o1) || (o2 && acc == o2 && acc + opmin > o2);
return (acc > o1 && select_sum_check1(oparam, size, index + 1, acc - o1)) return (acc > o1 && select_sum_check1(oparam, size, index + 1, acc - o1, std::min(o1, opmin)))
|| (o2 > 0 && acc > o2 && select_sum_check1(oparam, size, index + 1, acc - o2)); || (o2 > 0 && acc > o2 && select_sum_check1(oparam, size, index + 1, acc - o2, std::min(o2, opmin)));
} }
int32 field::select_with_sum_limit(int16 step, uint8 playerid, int32 acc, int32 min, int32 max) { int32 field::select_with_sum_limit(int16 step, uint8 playerid, int32 acc, int32 min, int32 max) {
if(step == 0) { if(step == 0) {
...@@ -664,7 +664,7 @@ int32 field::select_with_sum_limit(int16 step, uint8 playerid, int32 acc, int32 ...@@ -664,7 +664,7 @@ int32 field::select_with_sum_limit(int16 step, uint8 playerid, int32 acc, int32
c[v] = 1; c[v] = 1;
oparam[i] = core.select_cards[v]->sum_param; oparam[i] = core.select_cards[v]->sum_param;
} }
if(!select_sum_check1(oparam, returns.bvalue[0], 0, acc)) { if(!select_sum_check1(oparam, returns.bvalue[0], 0, acc, 0xffff)) {
pduel->write_buffer8(MSG_RETRY); pduel->write_buffer8(MSG_RETRY);
return FALSE; return FALSE;
} }
......
...@@ -957,11 +957,11 @@ int32 field::check_event(uint32 code, tevent * pe) { ...@@ -957,11 +957,11 @@ int32 field::check_event(uint32 code, tevent * pe) {
} }
int32 field::check_event_c(effect* peffect, uint8 playerid, int32 neglect_con, int32 neglect_cost, int32 copy_info, tevent* pe) { int32 field::check_event_c(effect* peffect, uint8 playerid, int32 neglect_con, int32 neglect_cost, int32 copy_info, tevent* pe) {
if(peffect->code == EVENT_FREE_CHAIN) { if(peffect->code == EVENT_FREE_CHAIN) {
return peffect->is_activate_ready(playerid, nil_event, neglect_con, neglect_cost, FALSE); return peffect->is_activate_ready(core.reason_effect, playerid, nil_event, neglect_con, neglect_cost, FALSE);
} }
for(const auto& ev : core.point_event) { for(const auto& ev : core.point_event) {
if(ev.event_code == peffect->code && if(ev.event_code == peffect->code &&
peffect->is_activate_ready(playerid, ev, neglect_con, neglect_cost, FALSE)) { peffect->is_activate_ready(core.reason_effect, playerid, ev, neglect_con, neglect_cost, FALSE)) {
if(pe) if(pe)
*pe = ev; *pe = ev;
if(copy_info && !pduel->lua->no_action && core.current_chain.size()) { if(copy_info && !pduel->lua->no_action && core.current_chain.size()) {
...@@ -972,7 +972,7 @@ int32 field::check_event_c(effect* peffect, uint8 playerid, int32 neglect_con, i ...@@ -972,7 +972,7 @@ int32 field::check_event_c(effect* peffect, uint8 playerid, int32 neglect_con, i
} }
for(const auto& ev : core.instant_event) { for(const auto& ev : core.instant_event) {
if(ev.event_code == peffect->code && if(ev.event_code == peffect->code &&
peffect->is_activate_ready(playerid, ev, neglect_con, neglect_cost, FALSE)) { peffect->is_activate_ready(core.reason_effect, playerid, ev, neglect_con, neglect_cost, FALSE)) {
if(pe) if(pe)
*pe = ev; *pe = ev;
if(copy_info && !pduel->lua->no_action && core.current_chain.size()) { if(copy_info && !pduel->lua->no_action && core.current_chain.size()) {
...@@ -1820,7 +1820,7 @@ int32 field::process_instant_event() { ...@@ -1820,7 +1820,7 @@ int32 field::process_instant_event() {
} }
} }
} }
if(ev.event_code == EVENT_ADJUST || ((ev.event_code & 0xf000) == EVENT_PHASE_START)) if(ev.event_code == EVENT_ADJUST || ev.event_code == EVENT_BREAK_EFFECT || ((ev.event_code & 0xf000) == EVENT_PHASE_START))
continue; continue;
//triggers //triggers
pr = effects.trigger_f_effect.equal_range(ev.event_code); pr = effects.trigger_f_effect.equal_range(ev.event_code);
...@@ -2549,7 +2549,12 @@ int32 field::process_battle_command(uint16 step) { ...@@ -2549,7 +2549,12 @@ int32 field::process_battle_command(uint16 step) {
core.units.begin()->step = 5; core.units.begin()->step = 5;
return FALSE; return FALSE;
} }
add_process(PROCESSOR_SELECT_YESNO, 0, 0, 0, infos.turn_player, 31); if(is_player_affected_by_effect(infos.turn_player, EFFECT_PATRICIAN_OF_DARKNESS)) {
add_process(PROCESSOR_SELECT_EFFECTYN, 0, 0, (group*)core.attacker, 1 - infos.turn_player, 31);
}
else {
add_process(PROCESSOR_SELECT_YESNO, 0, 0, 0, infos.turn_player, 31);
}
return FALSE; return FALSE;
} }
// no target and not direct attackable // no target and not direct attackable
...@@ -2588,11 +2593,12 @@ int32 field::process_battle_command(uint16 step) { ...@@ -2588,11 +2593,12 @@ int32 field::process_battle_command(uint16 step) {
returns.ivalue[0] = -2; returns.ivalue[0] = -2;
} else { } else {
if(core.select_cards.size()) { if(core.select_cards.size()) {
auto opposel = is_player_affected_by_effect(infos.turn_player, EFFECT_PATRICIAN_OF_DARKNESS);
pduel->write_buffer8(MSG_HINT); pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_SELECTMSG); pduel->write_buffer8(HINT_SELECTMSG);
pduel->write_buffer8(infos.turn_player); pduel->write_buffer8(opposel ? 1 - infos.turn_player : infos.turn_player);
pduel->write_buffer32(549); pduel->write_buffer32(549);
add_process(PROCESSOR_SELECT_CARD, 0, 0, 0, infos.turn_player + (core.attack_cancelable ? 0x20000 : 0), 0x10001); add_process(PROCESSOR_SELECT_CARD, 0, 0, 0, opposel ? 1 - infos.turn_player : infos.turn_player + (core.attack_cancelable ? 0x20000 : 0), 0x10001);
} else { } else {
core.units.begin()->arg3 = TRUE; core.units.begin()->arg3 = TRUE;
core.units.begin()->step = 6; core.units.begin()->step = 6;
......
...@@ -138,6 +138,7 @@ public: ...@@ -138,6 +138,7 @@ public:
static int32 card_get_equip_target(lua_State *L); static int32 card_get_equip_target(lua_State *L);
static int32 card_get_pre_equip_target(lua_State *L); static int32 card_get_pre_equip_target(lua_State *L);
static int32 card_check_equip_target(lua_State *L); static int32 card_check_equip_target(lua_State *L);
static int32 card_check_union_target(lua_State *L);
static int32 card_get_union_count(lua_State *L); static int32 card_get_union_count(lua_State *L);
static int32 card_get_overlay_group(lua_State *L); static int32 card_get_overlay_group(lua_State *L);
static int32 card_get_overlay_count(lua_State *L); static int32 card_get_overlay_count(lua_State *L);
......
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