Commit b794b34f authored by nanahira's avatar nanahira

Merge branch 'master' of github.com:Fluorohydride/ygopro-core

parents c3e93a53 242b903f
...@@ -2173,18 +2173,31 @@ void card::release_relation(effect* peffect) { ...@@ -2173,18 +2173,31 @@ void card::release_relation(effect* peffect) {
int32 card::leave_field_redirect(uint32 reason) { int32 card::leave_field_redirect(uint32 reason) {
effect_set es; effect_set es;
uint32 redirect; uint32 redirect;
uint32 redirects = 0;
if(data.type & TYPE_TOKEN) if(data.type & TYPE_TOKEN)
return 0; return 0;
filter_effect(EFFECT_LEAVE_FIELD_REDIRECT, &es); filter_effect(EFFECT_LEAVE_FIELD_REDIRECT, &es);
for(int32 i = 0; i < es.size(); ++i) { for(int32 i = 0; i < es.size(); ++i) {
redirect = es[i]->get_value(this, 0); redirect = es[i]->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; 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))
return 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))
return redirect; redirects |= redirect;
} }
if(redirects & LOCATION_REMOVED)
return LOCATION_REMOVED;
// the ruling for the priority of the following redirects can't be confirmed for now
if(redirects & LOCATION_DECK) {
if(redirects & LOCATION_DECKBOT)
return LOCATION_DECKBOT;
if(redirects & LOCATION_DECKSHF)
return LOCATION_DECKSHF;
return LOCATION_DECK;
}
if(redirects & LOCATION_HAND)
return LOCATION_HAND;
return 0; return 0;
} }
int32 card::destination_redirect(uint8 destination, uint32 reason) { int32 card::destination_redirect(uint8 destination, uint32 reason) {
......
...@@ -50,6 +50,9 @@ struct card_sort { ...@@ -50,6 +50,9 @@ struct card_sort {
#define LOCATION_ONFIELD 0x0c // #define LOCATION_ONFIELD 0x0c //
#define LOCATION_FZONE 0x100 // #define LOCATION_FZONE 0x100 //
#define LOCATION_PZONE 0x200 // #define LOCATION_PZONE 0x200 //
//For redirect
#define LOCATION_DECKBOT 0x10001 //Return to deck bottom
#define LOCATION_DECKSHF 0x20001 //Return to deck and shuffle
//Positions //Positions
#define POS_FACEUP_ATTACK 0x1 #define POS_FACEUP_ATTACK 0x1
......
...@@ -1064,13 +1064,16 @@ int32 field::swap_control(uint16 step, effect* reason_effect, uint8 reason_playe ...@@ -1064,13 +1064,16 @@ int32 field::swap_control(uint16 step, effect* reason_effect, uint8 reason_playe
uint8 s1 = pcard1->current.sequence; uint8 s1 = pcard1->current.sequence;
uint32 flag; uint32 flag;
get_useable_count(NULL, p1, LOCATION_MZONE, reason_player, LOCATION_REASON_CONTROL, 0xff, &flag); get_useable_count(NULL, p1, LOCATION_MZONE, reason_player, LOCATION_REASON_CONTROL, 0xff, &flag);
flag = (flag & ~(1 << s1) & 0xff) | ~0x1f; if(reason_player == p1)
flag = (flag & ~(1 << s1) & 0xff) | ~0x1f;
else
flag = ((flag & ~(1 << s1)) << 16 & 0xff0000) | ~0x1f0000;
card* pcard2 = *targets2->it; card* pcard2 = *targets2->it;
pduel->write_buffer8(MSG_HINT); pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_SELECTMSG); pduel->write_buffer8(HINT_SELECTMSG);
pduel->write_buffer8(p1); pduel->write_buffer8(reason_player);
pduel->write_buffer32(pcard2->data.code); pduel->write_buffer32(pcard2->data.code);
add_process(PROCESSOR_SELECT_PLACE, 0, 0, 0, p1, flag, 1); add_process(PROCESSOR_SELECT_PLACE, 0, 0, 0, reason_player, flag, 1);
return FALSE; return FALSE;
} }
case 2: { case 2: {
...@@ -1080,13 +1083,16 @@ int32 field::swap_control(uint16 step, effect* reason_effect, uint8 reason_playe ...@@ -1080,13 +1083,16 @@ int32 field::swap_control(uint16 step, effect* reason_effect, uint8 reason_playe
uint8 s2 = pcard2->current.sequence; uint8 s2 = pcard2->current.sequence;
uint32 flag; uint32 flag;
get_useable_count(NULL, p2, LOCATION_MZONE, reason_player, LOCATION_REASON_CONTROL, 0xff, &flag); get_useable_count(NULL, p2, LOCATION_MZONE, reason_player, LOCATION_REASON_CONTROL, 0xff, &flag);
flag = (flag & ~(1 << s2) & 0xff) | ~0x1f; if(reason_player == p2)
flag = (flag & ~(1 << s2) & 0xff) | ~0x1f;
else
flag = ((flag & ~(1 << s2)) << 16 & 0xff0000) | ~0x1f0000;
card* pcard1 = *targets1->it; card* pcard1 = *targets1->it;
pduel->write_buffer8(MSG_HINT); pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_SELECTMSG); pduel->write_buffer8(HINT_SELECTMSG);
pduel->write_buffer8(p2); pduel->write_buffer8(reason_player);
pduel->write_buffer32(pcard1->data.code); pduel->write_buffer32(pcard1->data.code);
add_process(PROCESSOR_SELECT_PLACE, 0, 0, 0, p2, flag, 1); add_process(PROCESSOR_SELECT_PLACE, 0, 0, 0, reason_player, flag, 1);
return FALSE; return FALSE;
} }
case 3: { case 3: {
......
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