Commit 504ff1fa authored by VanillaSalt's avatar VanillaSalt

fix

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