Commit 55f1c2e0 authored by DailyShana's avatar DailyShana

simplify getting (mutual) linked zone

parent cbec781c
...@@ -1212,126 +1212,21 @@ uint32 card::get_mutual_linked_zone() { ...@@ -1212,126 +1212,21 @@ uint32 card::get_mutual_linked_zone() {
int32 zones = 0; int32 zones = 0;
int32 p = current.controler; int32 p = current.controler;
int32 s = current.sequence; int32 s = current.sequence;
if(s > 0 && s <= 4 && is_link_marker(LINK_MARKER_LEFT)) { uint32 linked_zone = get_linked_zone();
card* pcard = pduel->game_field->player[p].list_mzone[s - 1]; uint32 icheck = 0x1;
if(pcard && pcard->is_link_marker(LINK_MARKER_RIGHT)) for(uint32 i = 0; i < 7; ++i, icheck <<= 1) {
zones |= 1u << (s - 1); if(icheck & linked_zone) {
} card* pcard = pduel->game_field->player[p].list_mzone[i];
if(s <= 3 && is_link_marker(LINK_MARKER_RIGHT)) { if(pcard && (pcard->get_linked_zone() & (1u << s)))
card* pcard = pduel->game_field->player[p].list_mzone[s + 1]; zones |= icheck;
if(pcard && pcard->is_link_marker(LINK_MARKER_LEFT)) }
zones |= 1u << (s + 1); }
} icheck = 0x10000;
if(s == 0 && is_link_marker(LINK_MARKER_TOP_RIGHT)) { for(uint32 i = 0; i < 7; ++i, icheck <<= 1) {
card* pcard = pduel->game_field->player[p].list_mzone[5]; if(icheck & linked_zone) {
if(pcard && pcard->is_link_marker(LINK_MARKER_BOTTOM_LEFT)) card* pcard = pduel->game_field->player[1 - p].list_mzone[i];
zones |= 1u << 5; if(pcard && (pcard->get_linked_zone() & (1u << (s + 16))))
pcard = pduel->game_field->player[1 - p].list_mzone[6]; zones |= icheck;
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP_RIGHT))
zones |= 1u << (16 + 6);
}
if(s == 1 && is_link_marker(LINK_MARKER_TOP)) {
card* pcard = pduel->game_field->player[p].list_mzone[5];
if(pcard && pcard->is_link_marker(LINK_MARKER_BOTTOM))
zones |= 1u << 5;
pcard = pduel->game_field->player[1 - p].list_mzone[6];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP))
zones |= 1u << (16 + 6);
}
if(s == 2 && is_link_marker(LINK_MARKER_TOP_LEFT)) {
card* pcard = pduel->game_field->player[p].list_mzone[5];
if(pcard && pcard->is_link_marker(LINK_MARKER_BOTTOM_RIGHT))
zones |= 1u << 5;
pcard = pduel->game_field->player[1 - p].list_mzone[6];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP_LEFT))
zones |= 1u << (16 + 6);
}
if(s == 2 && is_link_marker(LINK_MARKER_TOP_RIGHT)) {
card* pcard = pduel->game_field->player[p].list_mzone[6];
if(pcard && pcard->is_link_marker(LINK_MARKER_BOTTOM_LEFT))
zones |= 1u << 6;
pcard = pduel->game_field->player[1 - p].list_mzone[5];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP_RIGHT))
zones |= 1u << (16 + 5);
}
if(s == 3 && is_link_marker(LINK_MARKER_TOP)) {
card* pcard = pduel->game_field->player[p].list_mzone[6];
if(pcard && pcard->is_link_marker(LINK_MARKER_BOTTOM))
zones |= 1u << 6;
pcard = pduel->game_field->player[1 - p].list_mzone[5];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP))
zones |= 1u << (16 + 5);
}
if(s == 4 && is_link_marker(LINK_MARKER_TOP_LEFT)) {
card* pcard = pduel->game_field->player[p].list_mzone[6];
if(pcard && pcard->is_link_marker(LINK_MARKER_BOTTOM_RIGHT))
zones |= 1u << 6;
pcard = pduel->game_field->player[1 - p].list_mzone[5];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP_LEFT))
zones |= 1u << (16 + 5);
}
if(s == 5) {
if(is_link_marker(LINK_MARKER_BOTTOM_LEFT)) {
card* pcard = pduel->game_field->player[p].list_mzone[0];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP_RIGHT))
zones |= 1u << 0;
}
if(is_link_marker(LINK_MARKER_BOTTOM)) {
card* pcard = pduel->game_field->player[p].list_mzone[1];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP))
zones |= 1u << 1;
}
if(is_link_marker(LINK_MARKER_BOTTOM_RIGHT)) {
card* pcard = pduel->game_field->player[p].list_mzone[2];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP_LEFT))
zones |= 1u << 2;
}
if(is_link_marker(LINK_MARKER_TOP_LEFT)) {
card* pcard = pduel->game_field->player[1 - p].list_mzone[4];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP_LEFT))
zones |= 1u << (16 + 4);
}
if(is_link_marker(LINK_MARKER_TOP)) {
card* pcard = pduel->game_field->player[1 - p].list_mzone[3];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP))
zones |= 1u << (16 + 3);
}
if(is_link_marker(LINK_MARKER_TOP_RIGHT)) {
card* pcard = pduel->game_field->player[1 - p].list_mzone[2];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP_RIGHT))
zones |= 1u << (16 + 2);
}
}
if(s == 6) {
if(is_link_marker(LINK_MARKER_BOTTOM_LEFT)) {
card* pcard = pduel->game_field->player[p].list_mzone[2];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP_RIGHT))
zones |= 1u << 2;
}
if(is_link_marker(LINK_MARKER_BOTTOM)) {
card* pcard = pduel->game_field->player[p].list_mzone[3];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP))
zones |= 1u << 3;
}
if(is_link_marker(LINK_MARKER_BOTTOM_RIGHT)) {
card* pcard = pduel->game_field->player[p].list_mzone[4];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP_LEFT))
zones |= 1u << 4;
}
if(is_link_marker(LINK_MARKER_TOP_LEFT)) {
card* pcard = pduel->game_field->player[1 - p].list_mzone[2];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP_LEFT))
zones |= 1u << (16 + 2);
}
if(is_link_marker(LINK_MARKER_TOP)) {
card* pcard = pduel->game_field->player[1 - p].list_mzone[1];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP))
zones |= 1u << (16 + 1);
}
if(is_link_marker(LINK_MARKER_TOP_RIGHT)) {
card* pcard = pduel->game_field->player[1 - p].list_mzone[0];
if(pcard && pcard->is_link_marker(LINK_MARKER_TOP_RIGHT))
zones |= 1u << (16 + 0);
} }
} }
return zones; return zones;
......
...@@ -763,53 +763,13 @@ int32 field::get_szone_limit(uint8 playerid, uint8 uplayer, uint32 reason) { ...@@ -763,53 +763,13 @@ int32 field::get_szone_limit(uint8 playerid, uint8 uplayer, uint32 reason) {
} }
uint32 field::get_linked_zone(int32 playerid) { uint32 field::get_linked_zone(int32 playerid) {
uint32 zones = 0; uint32 zones = 0;
for(uint32 i = 1; i < 5; ++i) { for(auto& pcard : player[playerid].list_mzone) {
card* pcard = player[playerid].list_mzone[i]; if(pcard)
if(pcard && pcard->is_link_marker(LINK_MARKER_LEFT)) zones |= pcard->get_linked_zone() & 0xff;
zones |= 1u << (i - 1); }
} for(auto& pcard : player[1 - playerid].list_mzone) {
for(uint32 i = 0; i < 4; ++i) { if(pcard)
card* pcard = player[playerid].list_mzone[i]; zones |= pcard->get_linked_zone() >> 16;
if(pcard && pcard->is_link_marker(LINK_MARKER_RIGHT))
zones |= 1u << (i + 1);
}
if((player[playerid].list_mzone[0] && player[playerid].list_mzone[0]->is_link_marker(LINK_MARKER_TOP_RIGHT))
|| (player[playerid].list_mzone[1] && player[playerid].list_mzone[1]->is_link_marker(LINK_MARKER_TOP))
|| (player[playerid].list_mzone[2] && player[playerid].list_mzone[2]->is_link_marker(LINK_MARKER_TOP_LEFT)))
zones |= 1u << 5;
if((player[playerid].list_mzone[2] && player[playerid].list_mzone[2]->is_link_marker(LINK_MARKER_TOP_RIGHT))
|| (player[playerid].list_mzone[3] && player[playerid].list_mzone[3]->is_link_marker(LINK_MARKER_TOP))
|| (player[playerid].list_mzone[4] && player[playerid].list_mzone[4]->is_link_marker(LINK_MARKER_TOP_LEFT)))
zones |= 1u << 6;
for(uint32 i = 0; i < 2; ++i) {
card* pcard = player[playerid].list_mzone[i + 5];
if(pcard) {
if(pcard->is_link_marker(LINK_MARKER_BOTTOM_LEFT))
zones |= 1u << (i * 2);
if(pcard->is_link_marker(LINK_MARKER_BOTTOM))
zones |= 1u << (i * 2 + 1);
if(pcard->is_link_marker(LINK_MARKER_BOTTOM_RIGHT))
zones |= 1u << (i * 2 + 2);
}
}
if((player[1 - playerid].list_mzone[2] && player[1 - playerid].list_mzone[2]->is_link_marker(LINK_MARKER_TOP_RIGHT))
|| (player[1 - playerid].list_mzone[3] && player[1 - playerid].list_mzone[3]->is_link_marker(LINK_MARKER_TOP))
|| (player[1 - playerid].list_mzone[4] && player[1 - playerid].list_mzone[4]->is_link_marker(LINK_MARKER_TOP_LEFT)))
zones |= 1u << 5;
if((player[1 - playerid].list_mzone[0] && player[1 - playerid].list_mzone[0]->is_link_marker(LINK_MARKER_TOP_RIGHT))
|| (player[1 - playerid].list_mzone[1] && player[1 - playerid].list_mzone[1]->is_link_marker(LINK_MARKER_TOP))
|| (player[1 - playerid].list_mzone[2] && player[1 - playerid].list_mzone[2]->is_link_marker(LINK_MARKER_TOP_LEFT)))
zones |= 1u << 6;
for(uint32 i = 0; i < 2; ++i) {
card* pcard = player[1 - playerid].list_mzone[i + 5];
if(pcard) {
if(pcard->is_link_marker(LINK_MARKER_TOP_LEFT))
zones |= 1u << (4 - i * 2);
if(pcard->is_link_marker(LINK_MARKER_TOP))
zones |= 1u << (3 - i * 2);
if(pcard->is_link_marker(LINK_MARKER_TOP_RIGHT))
zones |= 1u << (2 - i * 2);
}
} }
return zones; return zones;
} }
......
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