Commit f524c6bf authored by salix5's avatar salix5

Duel.IsChainNegatable()

http://www.db.yugioh-card.com/yugiohdb/faq_search.action?ope=5&fid=14083&keyword=&tag=-1
http://www.db.yugioh-card.com/yugiohdb/faq_search.action?ope=5&fid=12625&keyword=&tag=-1
Now negate/disable activation effects can be activated after effects
cannot be negated/disabled, and nothing will happen in resolution.

The condition inside ocgcore is moved to check_chain_negate(),
check_chain_disable().
parent 8bd31d4c
......@@ -2580,7 +2580,6 @@ int32 field::is_player_can_remove(uint8 playerid, card * pcard) {
return TRUE;
}
int32 field::is_chain_negatable(uint8 chaincount, uint8 naga_check) {
effect_set eset;
if(chaincount < 0 || chaincount > core.current_chain.size())
return FALSE;
effect* peffect;
......@@ -2590,18 +2589,9 @@ int32 field::is_chain_negatable(uint8 chaincount, uint8 naga_check) {
peffect = core.current_chain[chaincount - 1].triggering_effect;
if(naga_check && peffect->is_flag(EFFECT_FLAG2_NAGA))
return FALSE;
if(peffect->is_flag(EFFECT_FLAG_CANNOT_DISABLE))
return FALSE;
filter_field_effect(EFFECT_CANNOT_INACTIVATE, &eset);
for(int32 i = 0; i < eset.size(); ++i) {
pduel->lua->add_param(chaincount, PARAM_TYPE_INT);
if(eset[i]->check_value_condition(1))
return FALSE;
}
return TRUE;
}
int32 field::is_chain_disablable(uint8 chaincount, uint8 naga_check) {
effect_set eset;
if(chaincount < 0 || chaincount > core.current_chain.size())
return FALSE;
effect* peffect;
......@@ -2611,16 +2601,6 @@ int32 field::is_chain_disablable(uint8 chaincount, uint8 naga_check) {
peffect = core.current_chain[chaincount - 1].triggering_effect;
if(naga_check && peffect->is_flag(EFFECT_FLAG2_NAGA))
return FALSE;
if(!peffect->get_handler()->get_status(STATUS_FORBIDDEN)) {
if(peffect->is_flag(EFFECT_FLAG_CANNOT_DISABLE))
return FALSE;
filter_field_effect(EFFECT_CANNOT_DISEFFECT, &eset);
for(int32 i = 0; i < eset.size(); ++i) {
pduel->lua->add_param(chaincount, PARAM_TYPE_INT);
if(eset[i]->check_value_condition(1))
return FALSE;
}
}
return TRUE;
}
int32 field::is_chain_disabled(uint8 chaincount) {
......@@ -2644,6 +2624,46 @@ int32 field::is_chain_disabled(uint8 chaincount) {
}
return FALSE;
}
int32 field::check_chain_negate(uint8 chaincount) {
effect_set eset;
if(chaincount < 0 || chaincount > core.current_chain.size())
return FALSE;
effect* peffect;
if(chaincount == 0)
peffect = core.current_chain.back().triggering_effect;
else
peffect = core.current_chain[chaincount - 1].triggering_effect;
if(peffect->is_flag(EFFECT_FLAG_CANNOT_DISABLE))
return FALSE;
filter_field_effect(EFFECT_CANNOT_INACTIVATE, &eset);
for(int32 i = 0; i < eset.size(); ++i) {
pduel->lua->add_param(chaincount, PARAM_TYPE_INT);
if(eset[i]->check_value_condition(1))
return FALSE;
}
return TRUE;
}
int32 field::check_chain_disable(uint8 chaincount) {
effect_set eset;
if(chaincount < 0 || chaincount > core.current_chain.size())
return FALSE;
effect* peffect;
if(chaincount == 0)
peffect = core.current_chain.back().triggering_effect;
else
peffect = core.current_chain[chaincount - 1].triggering_effect;
if(!peffect->get_handler()->get_status(STATUS_FORBIDDEN)) {
if(peffect->is_flag(EFFECT_FLAG_CANNOT_DISABLE))
return FALSE;
filter_field_effect(EFFECT_CANNOT_DISEFFECT, &eset);
for(int32 i = 0; i < eset.size(); ++i) {
pduel->lua->add_param(chaincount, PARAM_TYPE_INT);
if(eset[i]->check_value_condition(1))
return FALSE;
}
}
return TRUE;
}
int32 field::check_chain_target(uint8 chaincount, card * pcard) {
if(chaincount < 0 || chaincount > core.current_chain.size())
return FALSE;
......
......@@ -425,10 +425,12 @@ public:
int32 is_player_can_send_to_hand(uint8 playerid, card* pcard);
int32 is_player_can_send_to_deck(uint8 playerid, card* pcard);
int32 is_player_can_remove(uint8 playerid, card* pcard);
int32 is_chain_negatable(uint8 chaincount, uint8 naga_check = FALSE);
int32 is_chain_disablable(uint8 chaincount, uint8 naga_check = FALSE);
int32 is_chain_negatable(uint8 chaincount, uint8 naga_check);
int32 is_chain_disablable(uint8 chaincount, uint8 naga_check);
int32 is_chain_disabled(uint8 chaincount);
int32 check_chain_target(uint8 chaincount, card* pcard);
int32 check_chain_negate(uint8 chaincount);
int32 check_chain_disable(uint8 chaincount);
int32 is_able_to_enter_bp();
void add_process(uint16 type, uint16 step, effect* peffect, group* target, ptr arg1, ptr arg2, ptr arg3 = 0, ptr arg4 = 0, void* ptr1 = NULL, void* ptr2 = NULL);
......
......@@ -18,7 +18,7 @@ int32 field::negate_chain(uint8 chaincount) {
if(chaincount > core.current_chain.size() || chaincount < 1)
chaincount = core.current_chain.size();
chain& pchain = core.current_chain[chaincount - 1];
if(!(pchain.flag & CHAIN_DISABLE_ACTIVATE) && is_chain_negatable(pchain.chain_count)
if(!(pchain.flag & CHAIN_DISABLE_ACTIVATE) && check_chain_negate(pchain.chain_count)
&& pchain.triggering_effect->handler->is_affect_by_effect(core.reason_effect) ) {
pchain.flag |= CHAIN_DISABLE_ACTIVATE;
pchain.disable_reason = core.reason_effect;
......@@ -41,7 +41,7 @@ int32 field::disable_chain(uint8 chaincount) {
if(chaincount > core.current_chain.size() || chaincount < 1)
chaincount = core.current_chain.size();
chain& pchain = core.current_chain[chaincount - 1];
if(!(pchain.flag & CHAIN_DISABLE_EFFECT) && is_chain_disablable(pchain.chain_count)
if(!(pchain.flag & CHAIN_DISABLE_EFFECT) && check_chain_disable(pchain.chain_count)
&& pchain.triggering_effect->handler->is_affect_by_effect(core.reason_effect)) {
core.current_chain[chaincount - 1].flag |= CHAIN_DISABLE_EFFECT;
core.current_chain[chaincount - 1].disable_reason = core.reason_effect;
......
......@@ -4564,7 +4564,7 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
}
case 1: {
effect* peffect = cait->triggering_effect;
if(cait->flag & CHAIN_DISABLE_ACTIVATE && is_chain_negatable(cait->chain_count)) {
if(cait->flag & CHAIN_DISABLE_ACTIVATE && check_chain_negate(cait->chain_count)) {
remove_oath_effect(peffect);
if(peffect->is_flag(EFFECT_FLAG_COUNT_LIMIT) && (peffect->count_code & EFFECT_COUNT_CODE_OATH)) {
dec_effect_code(peffect->count_code, cait->triggering_player);
......@@ -4601,7 +4601,7 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
core.spsummon_state_count_tmp[0] = core.spsummon_state_count[0];
core.spsummon_state_count_tmp[1] = core.spsummon_state_count[1];
card* pcard = cait->triggering_effect->get_handler();
if(is_chain_disablable(cait->chain_count)) {
if(check_chain_disable(cait->chain_count)) {
if(is_chain_disabled(cait->chain_count) || (pcard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN) && pcard->is_has_relation(*cait))) {
if(!(cait->flag & CHAIN_DISABLE_EFFECT)) {
pduel->write_buffer8(MSG_CHAIN_DISABLED);
......
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