Commit c6fadaea authored by mercury233's avatar mercury233
parents 9258e1a3 44a056a3
...@@ -245,8 +245,7 @@ int32 effect::is_activateable(uint8 playerid, const tevent& e, int32 neglect_con ...@@ -245,8 +245,7 @@ int32 effect::is_activateable(uint8 playerid, const tevent& e, int32 neglect_con
return FALSE; return FALSE;
} else if(!(type & EFFECT_TYPE_CONTINUOUS)) { } else if(!(type & EFFECT_TYPE_CONTINUOUS)) {
card* phandler = get_handler(); card* phandler = get_handler();
if((phandler->data.type & TYPE_MONSTER) && (phandler->current.location & LOCATION_SZONE) if(!(phandler->get_type() & TYPE_MONSTER) && (get_active_type() & TYPE_MONSTER))
&& !in_range(phandler))
return FALSE; return FALSE;
if(!neglect_faceup && (phandler->current.location & (LOCATION_ONFIELD | LOCATION_REMOVED))) { if(!neglect_faceup && (phandler->current.location & (LOCATION_ONFIELD | LOCATION_REMOVED))) {
// effects which can be activated while face-down: // effects which can be activated while face-down:
...@@ -752,3 +751,20 @@ void effect::set_activate_location() { ...@@ -752,3 +751,20 @@ void effect::set_activate_location() {
active_location = phandler->current.location; active_location = phandler->current.location;
active_sequence = phandler->current.sequence; active_sequence = phandler->current.sequence;
} }
void effect::set_active_type() {
card* phandler = get_handler();
active_type = phandler->get_type();
if(active_type & TYPE_TRAPMONSTER)
active_type &= ~TYPE_TRAP;
}
uint32 effect::get_active_type() {
if(type & 0x7f0) {
if(active_type)
return active_type;
else if((type & EFFECT_TYPE_ACTIVATE) && (get_handler()->data.type & TYPE_PENDULUM))
return TYPE_PENDULUM + TYPE_SPELL;
else
return get_handler()->get_type();
} else
return owner->get_type();
}
...@@ -100,6 +100,8 @@ public: ...@@ -100,6 +100,8 @@ public:
int32 in_range(card* pcard); int32 in_range(card* pcard);
int32 in_range(const chain& ch); int32 in_range(const chain& ch);
void set_activate_location(); void set_activate_location();
void set_active_type();
uint32 get_active_type();
bool is_flag(effect_flag flag) const { bool is_flag(effect_flag flag) const {
return !!(this->flag[0] & flag); return !!(this->flag[0] & flag);
} }
......
...@@ -435,40 +435,22 @@ int32 scriptlib::effect_get_operation(lua_State *L) { ...@@ -435,40 +435,22 @@ int32 scriptlib::effect_get_operation(lua_State *L) {
interpreter::function2value(L, peffect->operation); interpreter::function2value(L, peffect->operation);
return 1; return 1;
} }
// active_type is set in add_chain()
int32 scriptlib::effect_get_active_type(lua_State *L) { int32 scriptlib::effect_get_active_type(lua_State *L) {
check_param_count(L, 1); check_param_count(L, 1);
check_param(L, PARAM_TYPE_EFFECT, 1); check_param(L, PARAM_TYPE_EFFECT, 1);
effect* peffect = *(effect**) lua_touserdata(L, 1); effect* peffect = *(effect**) lua_touserdata(L, 1);
uint32 atype; lua_pushinteger(L, peffect->get_active_type());
if(peffect->type & 0x7f0) {
if(peffect->active_type)
atype = peffect->active_type;
else if((peffect->type & EFFECT_TYPE_ACTIVATE) && (peffect->get_handler()->data.type & TYPE_PENDULUM))
atype = TYPE_PENDULUM + TYPE_SPELL;
else
atype = peffect->get_handler()->get_type();
} else
atype = peffect->owner->get_type();
lua_pushinteger(L, atype);
return 1; return 1;
} }
int32 scriptlib::effect_is_active_type(lua_State *L) { int32 scriptlib::effect_is_active_type(lua_State *L) {
check_param_count(L, 2); check_param_count(L, 2);
check_param(L, PARAM_TYPE_EFFECT, 1); check_param(L, PARAM_TYPE_EFFECT, 1);
effect* peffect = *(effect**) lua_touserdata(L, 1); effect* peffect = *(effect**) lua_touserdata(L, 1);
uint32 tpe = lua_tointeger(L, 2); uint32 type = lua_tointeger(L, 2);
uint32 atype; if(peffect->get_active_type() & type)
if(peffect->type & 0x7f0) { lua_pushboolean(L, 1);
if(peffect->active_type) else
atype = peffect->active_type; lua_pushboolean(L, 0);
else if((peffect->type & EFFECT_TYPE_ACTIVATE) && (peffect->get_handler()->data.type & TYPE_PENDULUM))
atype = TYPE_PENDULUM + TYPE_SPELL;
else
atype = peffect->get_handler()->get_type();
} else
atype = peffect->owner->get_type();
lua_pushboolean(L, atype & tpe);
return 1; return 1;
} }
int32 scriptlib::effect_is_has_property(lua_State *L) { int32 scriptlib::effect_is_has_property(lua_State *L) {
......
...@@ -4280,7 +4280,8 @@ int32 field::move_to_field(uint16 step, card* target, uint32 enable, uint32 ret, ...@@ -4280,7 +4280,8 @@ int32 field::move_to_field(uint16 step, card* target, uint32 enable, uint32 ret,
if(!(target->current.location & LOCATION_ONFIELD)) if(!(target->current.location & LOCATION_ONFIELD))
target->clear_relate_effect(); target->clear_relate_effect();
} }
if(ret != 1 || target->turnid != infos.turn_id) { if(ret != 1 && location != target->current.location
|| ret == 1 && target->turnid != infos.turn_id) {
target->set_status(STATUS_SUMMON_TURN, FALSE); target->set_status(STATUS_SUMMON_TURN, FALSE);
target->set_status(STATUS_FLIP_SUMMON_TURN, FALSE); target->set_status(STATUS_FLIP_SUMMON_TURN, FALSE);
target->set_status(STATUS_SPSUMMON_TURN, FALSE); target->set_status(STATUS_SPSUMMON_TURN, FALSE);
......
...@@ -1702,6 +1702,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free ...@@ -1702,6 +1702,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
if(tp == core.current_player) if(tp == core.current_player)
core.select_chains.push_back(*clit); core.select_chains.push_back(*clit);
} else { } else {
peffect->active_type = 0;
core.new_fchain_s.erase(clit++); core.new_fchain_s.erase(clit++);
continue; continue;
} }
...@@ -1794,6 +1795,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free ...@@ -1794,6 +1795,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
if(tp == core.current_player) if(tp == core.current_player)
core.select_chains.push_back(*clit); core.select_chains.push_back(*clit);
} else { } else {
peffect->active_type = 0;
core.new_ochain_s.erase(clit++); core.new_ochain_s.erase(clit++);
continue; continue;
} }
...@@ -1819,8 +1821,10 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free ...@@ -1819,8 +1821,10 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
} }
case 6: { case 6: {
if(returns.ivalue[0] == -1) { if(returns.ivalue[0] == -1) {
for(const auto& ch : core.select_chains) for(const auto& ch : core.select_chains) {
ch.triggering_effect->active_type = 0;
core.new_ochain_s.remove_if([chain_id = ch.chain_id](chain ch) { return ch.chain_id == chain_id; }); core.new_ochain_s.remove_if([chain_id = ch.chain_id](chain ch) { return ch.chain_id == chain_id; });
}
if(core.new_ochain_s.size()) { if(core.new_ochain_s.size()) {
core.current_player = 1 - infos.turn_player; core.current_player = 1 - infos.turn_player;
core.units.begin()->step = 3; core.units.begin()->step = 3;
...@@ -2034,7 +2038,7 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori ...@@ -2034,7 +2038,7 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
} }
case 2: { case 2: {
chain newchain; chain newchain;
for(auto evit = core.point_event.begin(); evit != core.instant_event.begin(); ++evit) { for(auto evit = core.point_event.begin(); evit != core.instant_event.end(); ++evit) {
if(evit == core.point_event.end()) if(evit == core.point_event.end())
evit = core.instant_event.begin(); evit = core.instant_event.begin();
auto pr = effects.activate_effect.equal_range(evit->event_code); auto pr = effects.activate_effect.equal_range(evit->event_code);
...@@ -2432,6 +2436,7 @@ int32 field::process_single_event(effect* peffect, const tevent& e, chain_list& ...@@ -2432,6 +2436,7 @@ int32 field::process_single_event(effect* peffect, const tevent& e, chain_list&
else else
core.new_fchain.push_back(newchain); core.new_fchain.push_back(newchain);
} }
peffect->set_active_type();
phandler->create_relation(newchain); phandler->create_relation(newchain);
effect* deffect; effect* deffect;
if(deffect = phandler->is_affected_by_effect(EFFECT_DISABLE_EFFECT)) { if(deffect = phandler->is_affected_by_effect(EFFECT_DISABLE_EFFECT)) {
...@@ -4258,7 +4263,7 @@ int32 field::add_chain(uint16 step) { ...@@ -4258,7 +4263,7 @@ int32 field::add_chain(uint16 step) {
peffect->card_type = phandler->get_type(); peffect->card_type = phandler->get_type();
if((peffect->card_type & 0x5) == 0x5) if((peffect->card_type & 0x5) == 0x5)
peffect->card_type -= TYPE_TRAP; peffect->card_type -= TYPE_TRAP;
peffect->active_type = peffect->card_type; peffect->set_active_type();
peffect->active_handler = peffect->handler->overlay_target; peffect->active_handler = peffect->handler->overlay_target;
clit.chain_count = core.current_chain.size() + 1; clit.chain_count = core.current_chain.size() + 1;
clit.target_cards = 0; clit.target_cards = 0;
...@@ -4388,7 +4393,7 @@ int32 field::add_chain(uint16 step) { ...@@ -4388,7 +4393,7 @@ int32 field::add_chain(uint16 step) {
&& !phandler->is_affected_by_effect(EFFECT_REMAIN_FIELD)) && !phandler->is_affected_by_effect(EFFECT_REMAIN_FIELD))
phandler->set_status(STATUS_LEAVE_CONFIRMED, TRUE); phandler->set_status(STATUS_LEAVE_CONFIRMED, TRUE);
} }
if((phandler->data.type & (TYPE_SPELL + TYPE_TRAP)) if(phandler->get_type() & (TYPE_SPELL + TYPE_TRAP)
&& (phandler->data.type & (TYPE_CONTINUOUS + TYPE_FIELD + TYPE_EQUIP + TYPE_PENDULUM)) && (phandler->data.type & (TYPE_CONTINUOUS + TYPE_FIELD + TYPE_EQUIP + TYPE_PENDULUM))
&& phandler->is_has_relation(clit) && phandler->current.location == LOCATION_SZONE && phandler->is_has_relation(clit) && phandler->current.location == LOCATION_SZONE
&& !peffect->is_flag(EFFECT_FLAG_FIELD_ONLY)) && !peffect->is_flag(EFFECT_FLAG_FIELD_ONLY))
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
#include "scriptlib.h" #include "scriptlib.h"
#include "duel.h" #include "duel.h"
int32 scriptlib::check_data_type(lua_State* L, int32 index, const char* tname) { static int32 check_data_type(lua_State* L, int32 index, const char* tname) {
int32 result = FALSE; int32 result = FALSE;
if(lua_getmetatable(L, index)) { if(lua_getmetatable(L, index)) {
lua_getglobal(L, tname); lua_getglobal(L, tname);
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
class scriptlib { class scriptlib {
public: public:
static int32 check_data_type(lua_State* L, int32 index, const char* tname);
static int32 check_param(lua_State* L, int32 param_type, int32 index, BOOL retfalse = FALSE); static int32 check_param(lua_State* L, int32 param_type, int32 index, BOOL retfalse = FALSE);
static int32 check_param_count(lua_State* L, int32 count); static int32 check_param_count(lua_State* L, int32 count);
static int32 check_action_permission(lua_State* L); static int32 check_action_permission(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