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