Commit 57599149 authored by mercury233's avatar mercury233
parents 859dcc52 26d97c90
......@@ -1151,7 +1151,8 @@ int32 card::is_link_marker(uint32 dir) {
return (int32)(get_link_marker() & dir);
}
uint32 card::get_linked_zone() {
if(!(data.type & TYPE_LINK) || current.location != LOCATION_MZONE)
if(!(data.type & TYPE_LINK) || current.location != LOCATION_MZONE
|| get_status(STATUS_SUMMONING | STATUS_SUMMON_DISABLED | STATUS_SPSUMMON_STEP))
return 0;
int32 zones = 0;
int32 s = current.sequence;
......@@ -1207,131 +1208,27 @@ void card::get_linked_cards(card_set* cset) {
pduel->game_field->get_cards_in_zone(cset, linked_zone >> 16, 1 - p, LOCATION_MZONE);
}
uint32 card::get_mutual_linked_zone() {
if(!(data.type & TYPE_LINK) || current.location != LOCATION_MZONE)
if(!(data.type & TYPE_LINK) || current.location != LOCATION_MZONE
|| get_status(STATUS_SUMMONING | STATUS_SUMMON_DISABLED | STATUS_SPSUMMON_STEP))
return 0;
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;
}
......
......@@ -2532,7 +2532,6 @@ int32 field::sset_g(uint16 step, uint8 setplayer, uint8 toplayer, group* ptarget
return FALSE;
}
case 7: {
returns.ivalue[0] = core.operated_set.size();
adjust_instant();
raise_event(&core.operated_set, EVENT_SSET, reason_effect, 0, setplayer, setplayer, 0);
process_instant_event();
......@@ -2541,6 +2540,10 @@ int32 field::sset_g(uint16 step, uint8 setplayer, uint8 toplayer, group* ptarget
core.hint_timing[setplayer] |= TIMING_SSET;
add_process(PROCESSOR_POINT_EVENT, 0, 0, 0, FALSE, FALSE);
}
return FALSE;
}
case 8: {
returns.ivalue[0] = core.operated_set.size();
return TRUE;
}
}
......
......@@ -2466,6 +2466,10 @@ int32 field::process_battle_command(uint16 step) {
core.attacker->set_status(STATUS_ATTACK_CANCELED, FALSE);
core.attacker->attack_controler = core.attacker->current.controler;
core.pre_field[0] = core.attacker->fieldid_r;
if(core.chain_attack && core.chain_attacker_id != core.attacker->fieldid) {
core.chain_attack = FALSE;
core.chain_attacker_id = 0;
}
effect_set eset;
filter_player_effect(infos.turn_player, EFFECT_ATTACK_COST, &eset, FALSE);
core.attacker->filter_effect(EFFECT_ATTACK_COST, &eset);
......@@ -2598,10 +2602,6 @@ int32 field::process_battle_command(uint16 step) {
case 7: {
if(!core.units.begin()->arg1) {
core.phase_action = TRUE;
if(core.chain_attack && core.chain_attacker_id != core.attacker->fieldid) {
core.chain_attack = FALSE;
core.chain_attacker_id = 0;
}
core.attack_state_count[infos.turn_player]++;
check_card_counter(core.attacker, 5, infos.turn_player);
core.attacker->attack_announce_count++;
......
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