Commit 939f6d1f authored by mercury233's avatar mercury233
parents 4dbcb9e6 b33e18fc
...@@ -3356,6 +3356,25 @@ int32 field::check_hand_trigger(chain& ch) { ...@@ -3356,6 +3356,25 @@ int32 field::check_hand_trigger(chain& ch) {
} }
return TRUE; return TRUE;
} }
int32 field::check_trigger_effect(const chain& ch) const {
effect* peffect = ch.triggering_effect;
card* phandler = peffect->get_handler();
if(core.duel_rule >= 5)
return phandler->is_has_relation(ch);
else {
if(peffect->type & EFFECT_TYPE_FIELD)
return phandler->is_has_relation(ch);
else {
if((ch.triggering_location & (LOCATION_DECK | LOCATION_HAND | LOCATION_EXTRA))
&& (ch.triggering_position & POS_FACEDOWN))
return TRUE;
if(!(phandler->current.location & (LOCATION_DECK | LOCATION_HAND | LOCATION_EXTRA))
|| phandler->is_position(POS_FACEUP))
return TRUE;
return FALSE;
}
}
}
int32 field::check_spself_from_hand_trigger(const chain& ch) const { int32 field::check_spself_from_hand_trigger(const chain& ch) const {
effect* peffect = ch.triggering_effect; effect* peffect = ch.triggering_effect;
uint8 tp = ch.triggering_player; uint8 tp = ch.triggering_player;
......
...@@ -482,6 +482,7 @@ public: ...@@ -482,6 +482,7 @@ public:
int32 get_cteffect_evt(effect* feffect, int32 playerid, const tevent& e, int32 store); int32 get_cteffect_evt(effect* feffect, int32 playerid, const tevent& e, int32 store);
int32 check_cteffect_hint(effect* peffect, uint8 playerid); int32 check_cteffect_hint(effect* peffect, uint8 playerid);
int32 check_hand_trigger(chain& ch); int32 check_hand_trigger(chain& ch);
int32 check_trigger_effect(const chain& ch) const;
int32 check_spself_from_hand_trigger(const chain& ch) const; int32 check_spself_from_hand_trigger(const chain& ch) const;
int32 is_able_to_enter_bp(); int32 is_able_to_enter_bp();
......
...@@ -3627,9 +3627,6 @@ int32 scriptlib::duel_announce_card(lua_State * L) { ...@@ -3627,9 +3627,6 @@ int32 scriptlib::duel_announce_card(lua_State * L) {
pduel->game_field->core.select_options.clear(); pduel->game_field->core.select_options.clear();
if(lua_gettop(L) == 1) { if(lua_gettop(L) == 1) {
pduel->game_field->core.select_options.push_back(TRUE); pduel->game_field->core.select_options.push_back(TRUE);
} else if(lua_gettop(L) == 2) {
pduel->game_field->core.select_options.push_back((uint32)lua_tointeger(L, 2));
pduel->game_field->core.select_options.push_back(OPCODE_ISTYPE);
} else { } else {
for(int32 i = 2; i <= lua_gettop(L); ++i) for(int32 i = 2; i <= lua_gettop(L); ++i)
pduel->game_field->core.select_options.push_back((uint32)lua_tointeger(L, i)); pduel->game_field->core.select_options.push_back((uint32)lua_tointeger(L, i));
...@@ -4135,15 +4132,7 @@ int32 scriptlib::duel_is_player_can_additional_summon(lua_State * L) { ...@@ -4135,15 +4132,7 @@ int32 scriptlib::duel_is_player_can_additional_summon(lua_State * L) {
} }
int32 scriptlib::duel_is_chain_negatable(lua_State * L) { int32 scriptlib::duel_is_chain_negatable(lua_State * L) {
check_param_count(L, 1); check_param_count(L, 1);
int32 chaincount = (int32)lua_tointeger(L, 1); lua_pushboolean(L, 1);
duel* pduel = interpreter::get_duel_info(L);
chain* ch = pduel->game_field->get_chain(chaincount);
if(!ch)
return 0;
if(ch->triggering_location == LOCATION_DECK)
lua_pushboolean(L, 0);
else
lua_pushboolean(L, 1);
return 1; return 1;
} }
int32 scriptlib::duel_is_chain_disablable(lua_State * L) { int32 scriptlib::duel_is_chain_disablable(lua_State * L) {
...@@ -4154,13 +4143,7 @@ int32 scriptlib::duel_is_chain_disablable(lua_State * L) { ...@@ -4154,13 +4143,7 @@ int32 scriptlib::duel_is_chain_disablable(lua_State * L) {
lua_pushboolean(L, pduel->game_field->is_chain_disablable(chaincount)); lua_pushboolean(L, pduel->game_field->is_chain_disablable(chaincount));
return 1; return 1;
} }
chain* ch = pduel->game_field->get_chain(chaincount); lua_pushboolean(L, 1);
if(!ch)
return 0;
if(ch->triggering_location == LOCATION_DECK)
lua_pushboolean(L, 0);
else
lua_pushboolean(L, 1);
return 1; return 1;
} }
int32 scriptlib::duel_check_chain_target(lua_State *L) { int32 scriptlib::duel_check_chain_target(lua_State *L) {
......
...@@ -29,8 +29,8 @@ int32 field::negate_chain(uint8 chaincount) { ...@@ -29,8 +29,8 @@ int32 field::negate_chain(uint8 chaincount) {
} }
pduel->write_buffer8(MSG_CHAIN_NEGATED); pduel->write_buffer8(MSG_CHAIN_NEGATED);
pduel->write_buffer8(chaincount); pduel->write_buffer8(chaincount);
if(pchain.triggering_location == LOCATION_DECK) if(pchain.triggering_location & (LOCATION_DECK | LOCATION_EXTRA))
return FALSE; pchain.triggering_effect->handler->release_relation(pchain);
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
...@@ -48,8 +48,8 @@ int32 field::disable_chain(uint8 chaincount) { ...@@ -48,8 +48,8 @@ int32 field::disable_chain(uint8 chaincount) {
core.current_chain[chaincount - 1].disable_player = core.reason_player; core.current_chain[chaincount - 1].disable_player = core.reason_player;
pduel->write_buffer8(MSG_CHAIN_DISABLED); pduel->write_buffer8(MSG_CHAIN_DISABLED);
pduel->write_buffer8(chaincount); pduel->write_buffer8(chaincount);
if(pchain.triggering_location == LOCATION_DECK) if(pchain.triggering_location & (LOCATION_DECK | LOCATION_EXTRA))
return FALSE; pchain.triggering_effect->handler->release_relation(pchain);
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
......
...@@ -1310,7 +1310,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free ...@@ -1310,7 +1310,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
if(phandler->is_has_relation(*clit)) //work around: position and control should be refreshed before raising event if(phandler->is_has_relation(*clit)) //work around: position and control should be refreshed before raising event
clit->set_triggering_state(phandler); clit->set_triggering_state(phandler);
uint8 tp = clit->triggering_player; uint8 tp = clit->triggering_player;
if(phandler->is_has_relation(*clit) && peffect->is_chainable(tp) && peffect->is_activateable(tp, clit->evt, TRUE)) { if(check_trigger_effect(*clit) && peffect->is_chainable(tp) && peffect->is_activateable(tp, clit->evt, TRUE)) {
if(tp == core.current_player) if(tp == core.current_player)
core.select_chains.push_back(*clit); core.select_chains.push_back(*clit);
} else { } else {
...@@ -1367,7 +1367,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free ...@@ -1367,7 +1367,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
clit->set_triggering_state(phandler); clit->set_triggering_state(phandler);
} }
uint8 tp = clit->triggering_player; uint8 tp = clit->triggering_player;
if(check_hand_trigger(*clit) && phandler->is_has_relation(*clit) if(check_hand_trigger(*clit) && check_trigger_effect(*clit)
&& peffect->is_chainable(tp) && peffect->is_activateable(tp, clit->evt, TRUE) && peffect->is_chainable(tp) && peffect->is_activateable(tp, clit->evt, TRUE)
&& check_spself_from_hand_trigger(*clit)) { && check_spself_from_hand_trigger(*clit)) {
if(tp == core.current_player) if(tp == core.current_player)
......
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