Commit 36b7354f authored by salix5's avatar salix5

Duel.IsChainNegatable()

parent a090e2aa
...@@ -2579,7 +2579,8 @@ int32 field::is_player_can_remove(uint8 playerid, card * pcard) { ...@@ -2579,7 +2579,8 @@ int32 field::is_player_can_remove(uint8 playerid, card * pcard) {
} }
return TRUE; return TRUE;
} }
int32 field::is_chain_negatable(uint8 chaincount, uint8 naga_check) { int32 field::is_chain_negatable(uint8 chaincount) {
effect_set eset;
if(chaincount < 0 || chaincount > core.current_chain.size()) if(chaincount < 0 || chaincount > core.current_chain.size())
return FALSE; return FALSE;
effect* peffect; effect* peffect;
...@@ -2587,11 +2588,18 @@ int32 field::is_chain_negatable(uint8 chaincount, uint8 naga_check) { ...@@ -2587,11 +2588,18 @@ int32 field::is_chain_negatable(uint8 chaincount, uint8 naga_check) {
peffect = core.current_chain.back().triggering_effect; peffect = core.current_chain.back().triggering_effect;
else else
peffect = core.current_chain[chaincount - 1].triggering_effect; peffect = core.current_chain[chaincount - 1].triggering_effect;
if(naga_check && peffect->is_flag(EFFECT_FLAG2_NAGA)) if(peffect->is_flag(EFFECT_FLAG_CANNOT_DISABLE))
return FALSE; 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; return TRUE;
} }
int32 field::is_chain_disablable(uint8 chaincount, uint8 naga_check) { int32 field::is_chain_disablable(uint8 chaincount) {
effect_set eset;
if(chaincount < 0 || chaincount > core.current_chain.size()) if(chaincount < 0 || chaincount > core.current_chain.size())
return FALSE; return FALSE;
effect* peffect; effect* peffect;
...@@ -2599,8 +2607,16 @@ int32 field::is_chain_disablable(uint8 chaincount, uint8 naga_check) { ...@@ -2599,8 +2607,16 @@ int32 field::is_chain_disablable(uint8 chaincount, uint8 naga_check) {
peffect = core.current_chain.back().triggering_effect; peffect = core.current_chain.back().triggering_effect;
else else
peffect = core.current_chain[chaincount - 1].triggering_effect; peffect = core.current_chain[chaincount - 1].triggering_effect;
if(naga_check && peffect->is_flag(EFFECT_FLAG2_NAGA)) if(!peffect->get_handler()->get_status(STATUS_FORBIDDEN)) {
return FALSE; 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; return TRUE;
} }
int32 field::is_chain_disabled(uint8 chaincount) { int32 field::is_chain_disabled(uint8 chaincount) {
...@@ -2624,46 +2640,6 @@ int32 field::is_chain_disabled(uint8 chaincount) { ...@@ -2624,46 +2640,6 @@ int32 field::is_chain_disabled(uint8 chaincount) {
} }
return FALSE; 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) { int32 field::check_chain_target(uint8 chaincount, card * pcard) {
if(chaincount < 0 || chaincount > core.current_chain.size()) if(chaincount < 0 || chaincount > core.current_chain.size())
return FALSE; return FALSE;
......
...@@ -425,12 +425,10 @@ public: ...@@ -425,12 +425,10 @@ public:
int32 is_player_can_send_to_hand(uint8 playerid, card* pcard); 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_send_to_deck(uint8 playerid, card* pcard);
int32 is_player_can_remove(uint8 playerid, card* pcard); int32 is_player_can_remove(uint8 playerid, card* pcard);
int32 is_chain_negatable(uint8 chaincount, uint8 naga_check); int32 is_chain_negatable(uint8 chaincount);
int32 is_chain_disablable(uint8 chaincount, uint8 naga_check); int32 is_chain_disablable(uint8 chaincount);
int32 is_chain_disabled(uint8 chaincount); int32 is_chain_disabled(uint8 chaincount);
int32 check_chain_target(uint8 chaincount, card* pcard); 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(); 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); 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);
......
...@@ -3182,14 +3182,42 @@ int32 scriptlib::duel_is_chain_negatable(lua_State * L) { ...@@ -3182,14 +3182,42 @@ int32 scriptlib::duel_is_chain_negatable(lua_State * L) {
check_param_count(L, 1); check_param_count(L, 1);
int32 chaincount = lua_tointeger(L, 1); int32 chaincount = lua_tointeger(L, 1);
duel* pduel = interpreter::get_duel_info(L); duel* pduel = interpreter::get_duel_info(L);
lua_pushboolean(L, pduel->game_field->is_chain_negatable(chaincount, TRUE)); int32 ret = 0;
if(chaincount < 0 || chaincount > (int32)pduel->game_field->core.current_chain.size())
ret = FALSE;
else {
effect* peffect;
if(chaincount == 0)
peffect = pduel->game_field->core.current_chain.back().triggering_effect;
else
peffect = pduel->game_field->core.current_chain[chaincount - 1].triggering_effect;
if(peffect->is_flag(EFFECT_FLAG2_NAGA))
ret = FALSE;
else
ret = TRUE;
}
lua_pushboolean(L, ret);
return 1; return 1;
} }
int32 scriptlib::duel_is_chain_disablable(lua_State * L) { int32 scriptlib::duel_is_chain_disablable(lua_State * L) {
check_param_count(L, 1); check_param_count(L, 1);
int32 chaincount = lua_tointeger(L, 1); int32 chaincount = lua_tointeger(L, 1);
duel* pduel = interpreter::get_duel_info(L); duel* pduel = interpreter::get_duel_info(L);
lua_pushboolean(L, pduel->game_field->is_chain_disablable(chaincount, TRUE)); int32 ret = 0;
if(chaincount < 0 || chaincount > (int32)pduel->game_field->core.current_chain.size())
ret = FALSE;
else {
effect* peffect;
if(chaincount == 0)
peffect = pduel->game_field->core.current_chain.back().triggering_effect;
else
peffect = pduel->game_field->core.current_chain[chaincount - 1].triggering_effect;
if(peffect->is_flag(EFFECT_FLAG2_NAGA))
ret = FALSE;
else
ret = TRUE;
}
lua_pushboolean(L, ret);
return 1; return 1;
} }
int32 scriptlib::duel_check_chain_target(lua_State *L) { int32 scriptlib::duel_check_chain_target(lua_State *L) {
......
...@@ -18,7 +18,7 @@ int32 field::negate_chain(uint8 chaincount) { ...@@ -18,7 +18,7 @@ int32 field::negate_chain(uint8 chaincount) {
if(chaincount > core.current_chain.size() || chaincount < 1) if(chaincount > core.current_chain.size() || chaincount < 1)
chaincount = core.current_chain.size(); chaincount = core.current_chain.size();
chain& pchain = core.current_chain[chaincount - 1]; chain& pchain = core.current_chain[chaincount - 1];
if(!(pchain.flag & CHAIN_DISABLE_ACTIVATE) && check_chain_negate(pchain.chain_count) if(!(pchain.flag & CHAIN_DISABLE_ACTIVATE) && is_chain_negatable(pchain.chain_count)
&& pchain.triggering_effect->handler->is_affect_by_effect(core.reason_effect) ) { && pchain.triggering_effect->handler->is_affect_by_effect(core.reason_effect) ) {
pchain.flag |= CHAIN_DISABLE_ACTIVATE; pchain.flag |= CHAIN_DISABLE_ACTIVATE;
pchain.disable_reason = core.reason_effect; pchain.disable_reason = core.reason_effect;
...@@ -41,7 +41,7 @@ int32 field::disable_chain(uint8 chaincount) { ...@@ -41,7 +41,7 @@ int32 field::disable_chain(uint8 chaincount) {
if(chaincount > core.current_chain.size() || chaincount < 1) if(chaincount > core.current_chain.size() || chaincount < 1)
chaincount = core.current_chain.size(); chaincount = core.current_chain.size();
chain& pchain = core.current_chain[chaincount - 1]; chain& pchain = core.current_chain[chaincount - 1];
if(!(pchain.flag & CHAIN_DISABLE_EFFECT) && check_chain_disable(pchain.chain_count) if(!(pchain.flag & CHAIN_DISABLE_EFFECT) && is_chain_disablable(pchain.chain_count)
&& pchain.triggering_effect->handler->is_affect_by_effect(core.reason_effect)) { && 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].flag |= CHAIN_DISABLE_EFFECT;
core.current_chain[chaincount - 1].disable_reason = core.reason_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 ...@@ -4564,7 +4564,7 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
} }
case 1: { case 1: {
effect* peffect = cait->triggering_effect; effect* peffect = cait->triggering_effect;
if(cait->flag & CHAIN_DISABLE_ACTIVATE && check_chain_negate(cait->chain_count)) { if(cait->flag & CHAIN_DISABLE_ACTIVATE && is_chain_negatable(cait->chain_count)) {
remove_oath_effect(peffect); remove_oath_effect(peffect);
if(peffect->is_flag(EFFECT_FLAG_COUNT_LIMIT) && (peffect->count_code & EFFECT_COUNT_CODE_OATH)) { if(peffect->is_flag(EFFECT_FLAG_COUNT_LIMIT) && (peffect->count_code & EFFECT_COUNT_CODE_OATH)) {
dec_effect_code(peffect->count_code, cait->triggering_player); 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 ...@@ -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[0] = core.spsummon_state_count[0];
core.spsummon_state_count_tmp[1] = core.spsummon_state_count[1]; core.spsummon_state_count_tmp[1] = core.spsummon_state_count[1];
card* pcard = cait->triggering_effect->get_handler(); card* pcard = cait->triggering_effect->get_handler();
if(check_chain_disable(cait->chain_count)) { if(is_chain_disablable(cait->chain_count)) {
if(is_chain_disabled(cait->chain_count) || (pcard->get_status(STATUS_DISABLED | STATUS_FORBIDDEN) && pcard->is_has_relation(*cait))) { 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)) { if(!(cait->flag & CHAIN_DISABLE_EFFECT)) {
pduel->write_buffer8(MSG_CHAIN_DISABLED); 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