Commit 504ff1fa authored by VanillaSalt's avatar VanillaSalt

fix

parent 838f354c
......@@ -1154,25 +1154,9 @@ void card::get_linked_cards(card_set* cset) {
if(!(data.type & TYPE_LINK) || current.location != LOCATION_MZONE)
return;
int32 p = current.controler;
uint32 zones = get_linked_zone();
uint32 icheck = 0x1;
for(auto it = pduel->game_field->player[p].list_mzone.begin(); it != pduel->game_field->player[p].list_mzone.end(); ++it) {
if(zones & icheck) {
card* pcard = *it;
if(pcard)
cset->insert(pcard);
}
icheck <<= 1;
}
icheck = 0x10000;
for(auto it = pduel->game_field->player[1 - p].list_mzone.begin(); it != pduel->game_field->player[1 - p].list_mzone.end(); ++it) {
if(zones & icheck) {
card* pcard = *it;
if(pcard)
cset->insert(pcard);
}
icheck <<= 1;
}
uint32 linked_zone = get_linked_zone();
pduel->game_field->get_cards_in_zone(cset, linked_zone, p);
pduel->game_field->get_cards_in_zone(cset, linked_zone >> 16, 1 - p);
}
uint32 card::get_mutual_linked_zone() {
if(!(data.type & TYPE_LINK) || current.location != LOCATION_MZONE)
......
......@@ -679,19 +679,13 @@ uint8 effect::get_handler_player() {
return effect_owner;
return get_handler()->current.controler;
}
int32 effect::in_range(int32 loc, int32 seq) {
int32 effect::in_range(card* pcard) {
if(type & EFFECT_TYPE_XMATERIAL)
return handler->overlay_target ? TRUE : FALSE;
if(loc != LOCATION_SZONE)
return range & loc;
if(seq < 5)
return range & LOCATION_SZONE;
if(seq == 5)
return range & (LOCATION_SZONE | LOCATION_FZONE);
return range & LOCATION_PZONE;
return pcard->current.is_location(range);
}
int32 effect::in_range(card* pcard) {
int32 effect::in_range(const chain& ch) {
if(type & EFFECT_TYPE_XMATERIAL)
return handler->overlay_target ? TRUE : FALSE;
return pcard->current.is_location(range);
return range & ch.triggering_location;
}
......@@ -89,8 +89,8 @@ public:
uint8 get_owner_player();
card* get_handler() const;
uint8 get_handler_player();
int32 in_range(int32 loc, int32 seq);
int32 in_range(card* pcard);
int32 in_range(const chain& ch);
bool is_flag(effect_flag flag) const {
return !!(this->flag[0] & flag);
}
......
......@@ -20,6 +20,16 @@ int32 field::field_used_count[32] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3
bool chain::chain_operation_sort(const chain& c1, const chain& c2) {
return c1.triggering_effect->id < c2.triggering_effect->id;
}
void chain::set_triggering_place(card* pcard) {
triggering_controler = pcard->current.controler;
if(pcard->current.is_location(LOCATION_FZONE))
triggering_location = LOCATION_SZONE | LOCATION_FZONE;
else if(pcard->current.is_location(LOCATION_PZONE))
triggering_location = LOCATION_SZONE | LOCATION_PZONE;
else
triggering_location = pcard->current.location;
triggering_sequence = pcard->current.sequence;
}
bool tevent::operator< (const tevent& v) const {
return memcmp(this, &v, sizeof(tevent)) < 0;
}
......@@ -139,7 +149,7 @@ void field::reload_field_info() {
pduel->write_buffer32(peffect->get_handler()->data.code);
pduel->write_buffer32(peffect->get_handler()->get_info_location());
pduel->write_buffer8(chit->triggering_controler);
pduel->write_buffer8(chit->triggering_location);
pduel->write_buffer8((uint8)chit->triggering_location);
pduel->write_buffer8(chit->triggering_sequence);
pduel->write_buffer32(peffect->description);
}
......@@ -719,6 +729,17 @@ int32 field::check_extra_link(int32 playerid, card* pcard, int32 sequence) {
pcard->current.sequence = cur_sequence;
return ret;
}
void field::get_cards_in_zone(card_set* cset, uint32 zone, int32 playerid) {
uint32 icheck = 0x1;
for(auto it = player[playerid].list_mzone.begin(); it != player[playerid].list_mzone.end(); ++it) {
if(zone & icheck) {
card* pcard = *it;
if(pcard)
cset->insert(pcard);
}
icheck <<= 1;
}
}
void field::shuffle(uint8 playerid, uint8 location) {
if(!(location & (LOCATION_HAND | LOCATION_DECK)))
return;
......@@ -2372,17 +2393,8 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
int32 ct = get_useable_count(pcard, playerid, LOCATION_MZONE, playerid, LOCATION_REASON_TOFIELD);
card_set linked_cards;
if(ct <= 0) {
uint32 linked_zone = get_linked_zone(playerid);
linked_zone |= (1u << 5) | (1u << 6);
uint32 icheck = 0x1;
for(auto it = player[playerid].list_mzone.begin(); it != player[playerid].list_mzone.end(); ++it) {
if(linked_zone & icheck) {
card* pcard = *it;
if(pcard)
linked_cards.insert(pcard);
}
icheck <<= 1;
}
uint32 linked_zone = core.duel_rule >= 4 ? get_linked_zone(playerid) | (1u << 5) | (1u << 6) : 0x1f;
get_cards_in_zone(&linked_cards, linked_zone, playerid);
if(linked_cards.find(tuner) != linked_cards.end())
ct++;
}
......
......@@ -49,7 +49,7 @@ struct chain {
uint8 chain_count;
uint8 triggering_player;
uint8 triggering_controler;
uint8 triggering_location;
uint16 triggering_location;
uint8 triggering_sequence;
effect* triggering_effect;
group* target_cards;
......@@ -62,6 +62,7 @@ struct chain {
opmap opinfos;
uint32 flag;
static bool chain_operation_sort(const chain& c1, const chain& c2);
void set_triggering_place(card* pcard);
};
struct player_info {
......@@ -347,6 +348,7 @@ public:
uint32 get_linked_zone(int32 playerid);
int32 check_extra_link(int32 playerid);
int32 check_extra_link(int32 playerid, card* pcard, int32 sequence);
void get_cards_in_zone(card_set* cset, uint32 zone, int32 playerid);
void shuffle(uint8 playerid, uint8 location);
void reset_sequence(uint8 playerid, uint8 location);
void swap_deck_and_grave(uint8 playerid);
......
......@@ -335,7 +335,7 @@ extern "C" DECL_DLLEXPORT int32 query_field_info(ptr pduel, byte* buf) {
*((int*)(buf)) = peffect->get_handler()->get_info_location();
buf += 4;
*buf++ = chit->triggering_controler;
*buf++ = chit->triggering_location;
*buf++ = (uint8)chit->triggering_location;
*buf++ = chit->triggering_sequence;
*((int*)(buf)) = peffect->description;
buf += 4;
......
......@@ -4681,17 +4681,8 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in
int32 ct = get_useable_count(pcard, playerid, LOCATION_MZONE, playerid, LOCATION_REASON_TOFIELD);
if(ct <= 0) {
card_set linked_cards;
uint32 linked_zone = get_linked_zone(playerid);
linked_zone |= (1u << 5) | (1u << 6);
uint32 icheck = 0x1;
for(auto it = player[playerid].list_mzone.begin(); it != player[playerid].list_mzone.end(); ++it) {
if(linked_zone & icheck) {
card* pcard = *it;
if(pcard)
linked_cards.insert(pcard);
}
icheck <<= 1;
}
uint32 linked_zone = core.duel_rule >= 4 ? get_linked_zone(playerid) | (1u << 5) | (1u << 6) : 0x1f;
get_cards_in_zone(&linked_cards, linked_zone, playerid);
if(linked_cards.find(tuner) != linked_cards.end())
ct++;
if(smat) {
......@@ -4707,17 +4698,8 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card* pcard, in
int32 lv = pcard->get_level();
int32 playerid = pcard->current.controler;
card_set linked_cards;
uint32 linked_zone = get_linked_zone(playerid);
linked_zone |= (1u << 5) | (1u << 6);
uint32 icheck = 0x1;
for(auto it = player[playerid].list_mzone.begin(); it != player[playerid].list_mzone.end(); ++it) {
if(linked_zone & icheck) {
card* pcard = *it;
if(pcard)
linked_cards.insert(pcard);
}
icheck <<= 1;
}
uint32 linked_zone = core.duel_rule >= 4 ? get_linked_zone(playerid) | (1u << 5) | (1u << 6) : 0x1f;
get_cards_in_zone(&linked_cards, linked_zone, playerid);
card_vector* select_cards = new card_vector;
select_cards->swap(core.select_cards);
card_vector* must_select_cards = new card_vector;
......
......@@ -1516,9 +1516,7 @@ int32 field::process_phase_event(int16 step, int32 phase) {
newchain.flag = 0;
newchain.chain_id = infos.field_id++;
newchain.evt = nil_event;
newchain.triggering_controler = phandler->current.controler;
newchain.triggering_location = phandler->current.location;
newchain.triggering_sequence = phandler->current.sequence;
newchain.set_triggering_place(phandler);
newchain.triggering_player = check_player;
core.new_chains.push_back(newchain);
phandler->set_status(STATUS_CHAINING, TRUE);
......@@ -1639,9 +1637,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
card* phandler = peffect->get_handler();
if(!peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER | EFFECT_FLAG_BOTH_SIDE) && phandler->is_has_relation(*clit)) {
clit->triggering_player = phandler->current.controler;
clit->triggering_controler = phandler->current.controler;
clit->triggering_location = phandler->current.location;
clit->triggering_sequence = phandler->current.sequence;
clit->set_triggering_place(phandler);
}
uint8 tp = clit->triggering_player;
bool act = true;
......@@ -1718,9 +1714,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
if(!phandler->is_has_relation(*clit))
phandler->create_relation(*clit);
clit->triggering_player = phandler->current.controler;
clit->triggering_controler = phandler->current.controler;
clit->triggering_location = phandler->current.location;
clit->triggering_sequence = phandler->current.sequence;
clit->set_triggering_place(phandler);
}
if(clit->triggering_player == infos.turn_player)
core.tpchain.push_back(*clit);
......@@ -1761,7 +1755,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
core.new_ochain_h.push_back(*clit);
act = false;
} else if(peffect->is_flag(EFFECT_FLAG_FIELD_ONLY) || !(peffect->type & EFFECT_TYPE_FIELD)
|| peffect->in_range(clit->triggering_location, clit->triggering_sequence)) {
|| peffect->in_range(*clit)) {
if(peffect->is_flag(EFFECT_FLAG_CHAIN_UNIQUE)) {
if(tp == infos.turn_player) {
for(auto tpit = core.tpchain.begin(); tpit != core.tpchain.end(); ++tpit) {
......@@ -1821,7 +1815,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
if(!peffect->is_flag(EFFECT_FLAG_FIELD_ONLY) && clit->triggering_location == LOCATION_HAND && (peffect->range & LOCATION_HAND)) {
continue;
} else if(peffect->is_flag(EFFECT_FLAG_FIELD_ONLY) || !(peffect->type & EFFECT_TYPE_FIELD)
|| peffect->in_range(clit->triggering_location, clit->triggering_sequence)) {
|| peffect->in_range(*clit)) {
if(peffect->is_flag(EFFECT_FLAG_CHAIN_UNIQUE)) {
if(tp == infos.turn_player) {
for(auto tpit = core.tpchain.begin(); tpit != core.tpchain.end(); ++tpit) {
......@@ -1905,10 +1899,8 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
newchain.flag = 0;
newchain.chain_id = infos.field_id++;
newchain.evt = e;
newchain.triggering_controler = phandler->current.controler;
newchain.triggering_effect = peffect;
newchain.triggering_location = phandler->current.location;
newchain.triggering_sequence = phandler->current.sequence;
newchain.set_triggering_place(phandler);
newchain.triggering_player = infos.turn_player;
core.select_chains.push_back(newchain);
}
......@@ -2056,10 +2048,8 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
newchain.flag = 0;
newchain.chain_id = infos.field_id++;
newchain.evt = *evit;
newchain.triggering_controler = phandler->current.controler;
newchain.triggering_effect = peffect;
newchain.triggering_location = phandler->current.location;
newchain.triggering_sequence = phandler->current.sequence;
newchain.set_triggering_place(phandler);
newchain.triggering_player = priority;
core.select_chains.push_back(newchain);
}
......@@ -2074,10 +2064,8 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
newchain.flag = 0;
newchain.chain_id = infos.field_id++;
newchain.evt = *evit;
newchain.triggering_controler = phandler->current.controler;
newchain.triggering_effect = peffect;
newchain.triggering_location = phandler->current.location;
newchain.triggering_sequence = phandler->current.sequence;
newchain.set_triggering_place(phandler);
newchain.triggering_player = priority;
core.select_chains.push_back(newchain);
core.delayed_quick_tmp.erase(std::make_pair(peffect, *evit));
......@@ -2127,10 +2115,8 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
newchain.flag = 0;
newchain.chain_id = infos.field_id++;
newchain.evt = *eit;
newchain.triggering_controler = phandler->current.controler;
newchain.triggering_effect = peffect;
newchain.triggering_location = phandler->current.location;
newchain.triggering_sequence = phandler->current.sequence;
newchain.set_triggering_place(phandler);
newchain.triggering_player = priority;
core.select_chains.push_back(newchain);
}
......@@ -2147,10 +2133,8 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
newchain.flag = 0;
newchain.chain_id = infos.field_id++;
newchain.evt = evt;
newchain.triggering_controler = phandler->current.controler;
newchain.triggering_effect = peffect;
newchain.triggering_location = phandler->current.location;
newchain.triggering_sequence = phandler->current.sequence;
newchain.set_triggering_place(phandler);
newchain.triggering_player = priority;
core.select_chains.push_back(newchain);
}
......@@ -2168,10 +2152,8 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
newchain.flag = 0;
newchain.chain_id = infos.field_id++;
newchain.evt = nil_event;
newchain.triggering_controler = phandler->current.controler;
newchain.triggering_effect = peffect;
newchain.triggering_location = phandler->current.location;
newchain.triggering_sequence = phandler->current.sequence;
newchain.set_triggering_place(phandler);
newchain.triggering_player = priority;
core.select_chains.push_back(newchain);
if(check_hint_timing(peffect))
......@@ -2188,10 +2170,8 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
newchain.flag = 0;
newchain.chain_id = infos.field_id++;
newchain.evt = nil_event;
newchain.triggering_controler = phandler->current.controler;
newchain.triggering_effect = peffect;
newchain.triggering_location = phandler->current.location;
newchain.triggering_sequence = phandler->current.sequence;
newchain.set_triggering_place(phandler);
newchain.triggering_player = priority;
core.select_chains.push_back(newchain);
if(check_hint_timing(peffect))
......@@ -2294,9 +2274,7 @@ int32 field::process_instant_event() {
newchain.chain_id = infos.field_id++;
newchain.evt = *elit;
newchain.triggering_effect = peffect;
newchain.triggering_controler = phandler->current.controler;
newchain.triggering_location = phandler->current.location;
newchain.triggering_sequence = phandler->current.sequence;
newchain.set_triggering_place(phandler);
if(peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER) && (elit->event_player == 0 || elit->event_player == 1))
newchain.triggering_player = elit->event_player;
else newchain.triggering_player = phandler->current.controler;
......@@ -2315,9 +2293,7 @@ int32 field::process_instant_event() {
newchain.chain_id = infos.field_id++;
newchain.evt = *elit;
newchain.triggering_effect = peffect;
newchain.triggering_controler = phandler->current.controler;
newchain.triggering_location = phandler->current.location;
newchain.triggering_sequence = phandler->current.sequence;
newchain.set_triggering_place(phandler);
if(peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER) && (elit->event_player == 0 || elit->event_player == 1))
newchain.triggering_player = elit->event_player;
else newchain.triggering_player = phandler->current.controler;
......@@ -2339,9 +2315,7 @@ int32 field::process_instant_event() {
newchain.chain_id = infos.field_id++;
newchain.evt = *elit;
newchain.triggering_effect = peffect;
newchain.triggering_controler = phandler->current.controler;
newchain.triggering_location = phandler->current.location;
newchain.triggering_sequence = phandler->current.sequence;
newchain.set_triggering_place(phandler);
if(peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER) && (elit->event_player == 0 || elit->event_player == 1))
newchain.triggering_player = elit->event_player;
else newchain.triggering_player = phandler->current.controler;
......@@ -2446,9 +2420,7 @@ int32 field::process_single_event(effect* peffect, const tevent& e, effect_vecto
newchain.chain_id = infos.field_id++;
newchain.evt = e;
newchain.triggering_effect = peffect;
newchain.triggering_controler = phandler->current.controler;
newchain.triggering_location = phandler->current.location;
newchain.triggering_sequence = phandler->current.sequence;
newchain.set_triggering_place(phandler);
if(peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER) && (e.event_player == 0 || e.event_player == 1))
newchain.triggering_player = e.event_player;
else {
......@@ -2631,9 +2603,7 @@ int32 field::process_idle_command(uint16 step) {
newchain.evt.reason = 0;
newchain.evt.reason_effect = 0;
newchain.evt.reason_player = PLAYER_NONE;
newchain.triggering_controler = phandler->current.controler;
newchain.triggering_location = phandler->current.location;
newchain.triggering_sequence = phandler->current.sequence;
newchain.set_triggering_place(phandler);
newchain.triggering_player = infos.turn_player;
core.new_chains.push_back(newchain);
phandler->set_status(STATUS_CHAINING, TRUE);
......@@ -2896,9 +2866,7 @@ int32 field::process_battle_command(uint16 step) {
newchain.evt.reason = 0;
newchain.evt.reason_effect = 0;
newchain.evt.reason_player = PLAYER_NONE;
newchain.triggering_controler = phandler->current.controler;
newchain.triggering_location = phandler->current.location;
newchain.triggering_sequence = phandler->current.sequence;
newchain.set_triggering_place(phandler);
newchain.triggering_player = infos.turn_player;
core.new_chains.push_back(newchain);
phandler->set_status(STATUS_CHAINING, TRUE);
......@@ -4283,15 +4251,13 @@ int32 field::add_chain(uint16 step) {
effect* peffect = clit.triggering_effect;
card* phandler = peffect->get_handler();
if(peffect->type & EFFECT_TYPE_ACTIVATE) {
clit.triggering_controler = phandler->current.controler;
clit.triggering_location = phandler->current.location;
clit.triggering_sequence = phandler->current.sequence;
clit.set_triggering_place(phandler);
}
pduel->write_buffer8(MSG_CHAINING);
pduel->write_buffer32(phandler->data.code);
pduel->write_buffer32(phandler->get_info_location());
pduel->write_buffer8(clit.triggering_controler);
pduel->write_buffer8(clit.triggering_location);
pduel->write_buffer8((uint8)clit.triggering_location);
pduel->write_buffer8(clit.triggering_sequence);
pduel->write_buffer32(peffect->description);
pduel->write_buffer8(core.current_chain.size() + 1);
......@@ -4799,7 +4765,7 @@ int32 field::break_effect() {
effect* peffect = rm->triggering_effect;
if (!peffect->is_flag(EFFECT_FLAG_DELAY)) {
if (peffect->is_flag(EFFECT_FLAG_FIELD_ONLY)
|| !(peffect->type & EFFECT_TYPE_FIELD) || peffect->in_range(rm->triggering_location, rm->triggering_sequence)) {
|| !(peffect->type & EFFECT_TYPE_FIELD) || peffect->in_range(*rm)) {
pduel->write_buffer8(MSG_MISSED_EFFECT);
pduel->write_buffer32(peffect->get_handler()->get_info_location());
pduel->write_buffer32(peffect->get_handler()->data.code);
......
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