Commit c9da4c2d authored by nanahira's avatar nanahira

Merge branch 'develop' of github.com:moecube/ygopro-core into develop

parents 63d9a249 d750174f
...@@ -2376,12 +2376,13 @@ int32_t card::leave_field_redirect(uint32_t reason) { ...@@ -2376,12 +2376,13 @@ int32_t card::leave_field_redirect(uint32_t reason) {
return 0; return 0;
filter_effect(EFFECT_LEAVE_FIELD_REDIRECT, &es); filter_effect(EFFECT_LEAVE_FIELD_REDIRECT, &es);
for(effect_set::size_type i = 0; i < es.size(); ++i) { for(effect_set::size_type i = 0; i < es.size(); ++i) {
redirect = es[i]->get_value(this, 0); effect* peffect = es[i];
redirect = peffect->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))
redirects |= 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))
redirects |= 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 | REASON_REDIRECT, peffect))
redirects |= redirect; redirects |= redirect;
} }
if(redirects & LOCATION_REMOVED) if(redirects & LOCATION_REMOVED)
...@@ -2414,12 +2415,13 @@ int32_t card::destination_redirect(uint8_t destination, uint32_t reason) { ...@@ -2414,12 +2415,13 @@ int32_t card::destination_redirect(uint8_t destination, uint32_t reason) {
else else
return 0; return 0;
for(effect_set::size_type i = 0; i < es.size(); ++i) { for(effect_set::size_type i = 0; i < es.size(); ++i) {
redirect = es[i]->get_value(this, 0); effect* peffect = es[i];
redirect = peffect->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; return redirect;
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)) 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; return redirect;
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)) 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 | REASON_REDIRECT, peffect))
return redirect; return redirect;
if((redirect & LOCATION_GRAVE) && !is_affected_by_effect(EFFECT_CANNOT_TO_GRAVE) && pduel->game_field->is_player_can_send_to_grave(es[i]->get_handler_player(), this)) if((redirect & LOCATION_GRAVE) && !is_affected_by_effect(EFFECT_CANNOT_TO_GRAVE) && pduel->game_field->is_player_can_send_to_grave(es[i]->get_handler_player(), this))
return redirect; return redirect;
......
...@@ -808,10 +808,14 @@ effect* effect::clone() { ...@@ -808,10 +808,14 @@ effect* effect::clone() {
return ceffect; return ceffect;
} }
card* effect::get_owner() const { card* effect::get_owner() const {
if(active_handler) if (type & EFFECT_TYPE_XMATERIAL) {
return active_handler; if (active_handler)
if(type & EFFECT_TYPE_XMATERIAL) return active_handler;
return handler->overlay_target; if (handler->overlay_target)
return handler->overlay_target;
if (last_handler)
return last_handler;
}
return owner; return owner;
} }
uint8_t effect::get_owner_player() const { uint8_t effect::get_owner_player() const {
...@@ -820,10 +824,14 @@ uint8_t effect::get_owner_player() const { ...@@ -820,10 +824,14 @@ uint8_t effect::get_owner_player() const {
return get_owner()->current.controler; return get_owner()->current.controler;
} }
card* effect::get_handler() const { card* effect::get_handler() const {
if(active_handler) if (type & EFFECT_TYPE_XMATERIAL) {
return active_handler; if (active_handler)
if(type & EFFECT_TYPE_XMATERIAL) return active_handler;
return handler->overlay_target; if (handler->overlay_target)
return handler->overlay_target;
if (last_handler)
return last_handler;
}
return handler; return handler;
} }
uint8_t effect::get_handler_player() const { uint8_t effect::get_handler_player() const {
......
...@@ -54,6 +54,7 @@ public: ...@@ -54,6 +54,7 @@ public:
uint16_t active_location{ 0 }; uint16_t active_location{ 0 };
uint16_t active_sequence{ 0 }; uint16_t active_sequence{ 0 };
card* active_handler{ nullptr }; card* active_handler{ nullptr };
card* last_handler{ nullptr };
std::vector<lua_Integer> label; std::vector<lua_Integer> label;
int32_t label_object{ 0 }; int32_t label_object{ 0 };
int32_t condition{ 0 }; int32_t condition{ 0 };
......
...@@ -3416,7 +3416,9 @@ int32_t field::is_player_can_send_to_deck(uint8_t playerid, card * pcard) { ...@@ -3416,7 +3416,9 @@ int32_t field::is_player_can_send_to_deck(uint8_t playerid, card * pcard) {
} }
return TRUE; return TRUE;
} }
int32_t field::is_player_can_remove(uint8_t playerid, card * pcard, uint32_t reason) { int32_t field::is_player_can_remove(uint8_t playerid, card* pcard, uint32_t reason, effect* reason_effect) {
if(!reason_effect)
reason_effect = core.reason_effect;
effect_set eset; effect_set eset;
filter_player_effect(playerid, EFFECT_CANNOT_REMOVE, &eset); filter_player_effect(playerid, EFFECT_CANNOT_REMOVE, &eset);
for(effect_set::size_type i = 0; i < eset.size(); ++i) { for(effect_set::size_type i = 0; i < eset.size(); ++i) {
...@@ -3426,7 +3428,7 @@ int32_t field::is_player_can_remove(uint8_t playerid, card * pcard, uint32_t rea ...@@ -3426,7 +3428,7 @@ int32_t field::is_player_can_remove(uint8_t playerid, card * pcard, uint32_t rea
pduel->lua->add_param(pcard, PARAM_TYPE_CARD); pduel->lua->add_param(pcard, PARAM_TYPE_CARD);
pduel->lua->add_param(playerid, PARAM_TYPE_INT); pduel->lua->add_param(playerid, PARAM_TYPE_INT);
pduel->lua->add_param(reason, PARAM_TYPE_INT); pduel->lua->add_param(reason, PARAM_TYPE_INT);
pduel->lua->add_param(core.reason_effect, PARAM_TYPE_EFFECT); pduel->lua->add_param(reason_effect, PARAM_TYPE_EFFECT);
if(pduel->lua->check_condition(eset[i]->target, 5)) if(pduel->lua->check_condition(eset[i]->target, 5))
return FALSE; return FALSE;
} }
......
...@@ -503,7 +503,7 @@ public: ...@@ -503,7 +503,7 @@ public:
int32_t is_player_can_send_to_grave(uint8_t playerid, card* pcard); int32_t is_player_can_send_to_grave(uint8_t playerid, card* pcard);
int32_t is_player_can_send_to_hand(uint8_t playerid, card* pcard); int32_t is_player_can_send_to_hand(uint8_t playerid, card* pcard);
int32_t is_player_can_send_to_deck(uint8_t playerid, card* pcard); int32_t is_player_can_send_to_deck(uint8_t playerid, card* pcard);
int32_t is_player_can_remove(uint8_t playerid, card* pcard, uint32_t reason); int32_t is_player_can_remove(uint8_t playerid, card* pcard, uint32_t reason, effect* reason_effect = nullptr);
int32_t is_chain_negatable(uint8_t chaincount); int32_t is_chain_negatable(uint8_t chaincount);
int32_t is_chain_disablable(uint8_t chaincount); int32_t is_chain_disablable(uint8_t chaincount);
int32_t is_chain_disabled(uint8_t chaincount); int32_t is_chain_disabled(uint8_t chaincount);
......
...@@ -4070,7 +4070,10 @@ int32_t field::add_chain(uint16_t step) { ...@@ -4070,7 +4070,10 @@ int32_t field::add_chain(uint16_t step) {
if((peffect->card_type & (TYPE_TRAP | TYPE_MONSTER)) == (TYPE_TRAP | TYPE_MONSTER)) if((peffect->card_type & (TYPE_TRAP | TYPE_MONSTER)) == (TYPE_TRAP | TYPE_MONSTER))
peffect->card_type -= TYPE_TRAP; peffect->card_type -= TYPE_TRAP;
peffect->set_active_type(); peffect->set_active_type();
peffect->active_handler = peffect->handler->overlay_target; if (peffect->type & EFFECT_TYPE_XMATERIAL) {
peffect->active_handler = peffect->handler->overlay_target;
peffect->last_handler = peffect->handler->overlay_target;
}
clit.chain_count = (uint8_t)core.current_chain.size() + 1; clit.chain_count = (uint8_t)core.current_chain.size() + 1;
clit.target_cards = 0; clit.target_cards = 0;
clit.target_player = PLAYER_NONE; clit.target_player = PLAYER_NONE;
......
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