Commit 85d2b687 authored by VanillaSalt's avatar VanillaSalt

fix

parent e26e1f16
...@@ -72,6 +72,7 @@ card::card(duel* pd) { ...@@ -72,6 +72,7 @@ card::card(duel* pd) {
assume_type = 0; assume_type = 0;
assume_value = 0; assume_value = 0;
spsummon_code = 0; spsummon_code = 0;
relate_effect_outside = 0;
current.controler = PLAYER_NONE; current.controler = PLAYER_NONE;
} }
card::~card() { card::~card() {
...@@ -1305,7 +1306,7 @@ void card::reset(uint32 id, uint32 reset_type) { ...@@ -1305,7 +1306,7 @@ void card::reset(uint32 id, uint32 reset_type) {
relations.erase(rrm); relations.erase(rrm);
} }
if(id & 0x47c0000) if(id & 0x47c0000)
relate_effect.clear(); clear_relate_effect();
if(id & 0x5fc0000) { if(id & 0x5fc0000) {
announced_cards.clear(); announced_cards.clear();
attacked_cards.clear(); attacked_cards.clear();
...@@ -1427,32 +1428,58 @@ void card::create_relation(card* target, uint32 reset) { ...@@ -1427,32 +1428,58 @@ void card::create_relation(card* target, uint32 reset) {
return; return;
relations[target] = reset; relations[target] = reset;
} }
void card::create_relation(effect* peffect) {
auto it = relate_effect.find(peffect);
if (it != relate_effect.end())
++it->second;
else
relate_effect[peffect] = 1;
}
int32 card::is_has_relation(card* target) { int32 card::is_has_relation(card* target) {
if (relations.find(target) != relations.end()) if (relations.find(target) != relations.end())
return TRUE; return TRUE;
return FALSE; return FALSE;
} }
int32 card::is_has_relation(effect* peffect) {
if (relate_effect.find(peffect) != relate_effect.end())
return TRUE;
return FALSE;
}
void card::release_relation(card* target) { void card::release_relation(card* target) {
if (relations.find(target) == relations.end()) if (relations.find(target) == relations.end())
return; return;
relations.erase(target); relations.erase(target);
} }
void card::create_relation(uint16 chain_id) {
relate_effect.insert(chain_id);
}
int32 card::is_has_relation(uint16 chain_id) {
if (relate_effect.find(chain_id) != relate_effect.end())
return TRUE;
return FALSE;
}
void card::release_relation(uint16 chain_id) {
relate_effect.erase(chain_id);
}
void card::clear_relate_effect() {
relate_effect.clear();
relate_effect_outside = 0;
}
void card::create_relation(effect* peffect) {
for(auto it = pduel->game_field->core.current_chain.rbegin(); it != pduel->game_field->core.current_chain.rend(); ++it) {
if(it->triggering_effect == peffect) {
create_relation(it->chain_id);
return;
}
}
relate_effect_outside = peffect;
}
int32 card::is_has_relation(effect* peffect) {
for(auto it = pduel->game_field->core.current_chain.rbegin(); it != pduel->game_field->core.current_chain.rend(); ++it) {
if(it->triggering_effect == peffect)
return is_has_relation(it->chain_id);
}
if(relate_effect_outside == peffect)
return TRUE;
return FALSE;
}
void card::release_relation(effect* peffect) { void card::release_relation(effect* peffect) {
auto it = relate_effect.find(peffect); for(auto it = pduel->game_field->core.current_chain.rbegin(); it != pduel->game_field->core.current_chain.rend(); ++it) {
if (it != relate_effect.end() && --it->second == 0) if(it->triggering_effect == peffect) {
relate_effect.erase(it); release_relation(it->chain_id);
return;
}
}
if(relate_effect_outside == peffect)
relate_effect_outside = 0;
} }
int32 card::leave_field_redirect(uint32 reason) { int32 card::leave_field_redirect(uint32 reason) {
effect_set es; effect_set es;
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "effectset.h" #include "effectset.h"
#include <set> #include <set>
#include <map> #include <map>
#include <unordered_set>
#include <unordered_map> #include <unordered_map>
class card; class card;
...@@ -82,7 +83,7 @@ public: ...@@ -82,7 +83,7 @@ public:
typedef std::multimap<uint32, effect*> effect_container; typedef std::multimap<uint32, effect*> effect_container;
typedef std::set<card*, card_sort> card_set; typedef std::set<card*, card_sort> card_set;
typedef std::unordered_map<effect*, effect_container::iterator> effect_indexer; typedef std::unordered_map<effect*, effect_container::iterator> effect_indexer;
typedef std::unordered_map<effect*, uint32> effect_relation; typedef std::unordered_set<uint16> effect_relation;
typedef std::unordered_map<card*, uint32> relation_map; typedef std::unordered_map<card*, uint32> relation_map;
typedef std::map<uint16, std::array<uint16, 2> > counter_map; typedef std::map<uint16, std::array<uint16, 2> > counter_map;
class attacker_map : public std::unordered_map<uint16, std::pair<card*, uint32> > { class attacker_map : public std::unordered_map<uint16, std::pair<card*, uint32> > {
...@@ -137,6 +138,7 @@ public: ...@@ -137,6 +138,7 @@ public:
effect_container equip_effect; effect_container equip_effect;
effect_indexer indexer; effect_indexer indexer;
effect_relation relate_effect; effect_relation relate_effect;
effect* relate_effect_outside;
effect_set_v immune_effect; effect_set_v immune_effect;
explicit card(duel* pd); explicit card(duel* pd);
...@@ -191,10 +193,14 @@ public: ...@@ -191,10 +193,14 @@ public:
void count_turn(uint16 ct); void count_turn(uint16 ct);
void create_relation(card* target, uint32 reset); void create_relation(card* target, uint32 reset);
void create_relation(effect* peffect);
int32 is_has_relation(card* target); int32 is_has_relation(card* target);
int32 is_has_relation(effect* peffect);
void release_relation(card* target); void release_relation(card* target);
void create_relation(uint16 chain_id);
int32 is_has_relation(uint16 chain_id);
void release_relation(uint16 chain_id);
void clear_relate_effect();
void create_relation(effect* peffect);
int32 is_has_relation(effect* peffect);
void release_relation(effect* peffect); void release_relation(effect* peffect);
int32 leave_field_redirect(uint32 reason); int32 leave_field_redirect(uint32 reason);
int32 destination_redirect(uint8 destination, uint32 reason); int32 destination_redirect(uint8 destination, uint32 reason);
......
...@@ -135,6 +135,7 @@ static const struct luaL_Reg cardlib[] = { ...@@ -135,6 +135,7 @@ static const struct luaL_Reg cardlib[] = {
{ "ReleaseEffectRelation", scriptlib::card_release_effect_relation }, { "ReleaseEffectRelation", scriptlib::card_release_effect_relation },
{ "ClearEffectRelation", scriptlib::card_clear_effect_relation }, { "ClearEffectRelation", scriptlib::card_clear_effect_relation },
{ "IsRelateToEffect", scriptlib::card_is_relate_to_effect }, { "IsRelateToEffect", scriptlib::card_is_relate_to_effect },
{ "IsRelateToChain", scriptlib::card_is_relate_to_chain },
{ "IsRelateToCard", scriptlib::card_is_relate_to_card }, { "IsRelateToCard", scriptlib::card_is_relate_to_card },
{ "IsRelateToBattle", scriptlib::card_is_relate_to_battle }, { "IsRelateToBattle", scriptlib::card_is_relate_to_battle },
{ "CopyEffect", scriptlib::card_copy_effect }, { "CopyEffect", scriptlib::card_copy_effect },
......
...@@ -1130,7 +1130,7 @@ int32 scriptlib::card_clear_effect_relation(lua_State *L) { ...@@ -1130,7 +1130,7 @@ int32 scriptlib::card_clear_effect_relation(lua_State *L) {
check_param_count(L, 1); check_param_count(L, 1);
check_param(L, PARAM_TYPE_CARD, 1); check_param(L, PARAM_TYPE_CARD, 1);
card* pcard = *(card**) lua_touserdata(L, 1); card* pcard = *(card**) lua_touserdata(L, 1);
pcard->relate_effect.clear(); pcard->clear_relate_effect();
return 0; return 0;
} }
int32 scriptlib::card_is_relate_to_effect(lua_State *L) { int32 scriptlib::card_is_relate_to_effect(lua_State *L) {
...@@ -1145,6 +1145,21 @@ int32 scriptlib::card_is_relate_to_effect(lua_State *L) { ...@@ -1145,6 +1145,21 @@ int32 scriptlib::card_is_relate_to_effect(lua_State *L) {
lua_pushboolean(L, 0); lua_pushboolean(L, 0);
return 1; return 1;
} }
int32 scriptlib::card_is_relate_to_chain(lua_State *L) {
check_param_count(L, 2);
check_param(L, PARAM_TYPE_CARD, 1);
card* pcard = *(card**) lua_touserdata(L, 1);
uint32 chain_count = lua_tointeger(L, 2);
duel* pduel = pcard->pduel;
if(chain_count > pduel->game_field->core.current_chain.size() || chain_count < 1)
chain_count = pduel->game_field->core.current_chain.size();
uint16 chain_id = pduel->game_field->core.current_chain[chain_count - 1].chain_id;
if(pcard && pcard->is_has_relation(chain_id))
lua_pushboolean(L, 1);
else
lua_pushboolean(L, 0);
return 1;
}
int32 scriptlib::card_is_relate_to_card(lua_State *L) { int32 scriptlib::card_is_relate_to_card(lua_State *L) {
check_param_count(L, 2); check_param_count(L, 2);
check_param(L, PARAM_TYPE_CARD, 1); check_param(L, PARAM_TYPE_CARD, 1);
......
...@@ -67,13 +67,14 @@ void field::change_target(uint8 chaincount, group* targets) { ...@@ -67,13 +67,14 @@ void field::change_target(uint8 chaincount, group* targets) {
if(chaincount > core.current_chain.size() || chaincount < 1) if(chaincount > core.current_chain.size() || chaincount < 1)
chaincount = core.current_chain.size(); chaincount = core.current_chain.size();
group* ot = core.current_chain[chaincount - 1].target_cards; group* ot = core.current_chain[chaincount - 1].target_cards;
effect* te = core.current_chain[chaincount - 1].triggering_effect;
if(ot) { if(ot) {
effect* te = core.current_chain[chaincount - 1].triggering_effect;
uint16 chain_id = core.current_chain[chaincount - 1].chain_id;
for(auto cit = ot->container.begin(); cit != ot->container.end(); ++cit) for(auto cit = ot->container.begin(); cit != ot->container.end(); ++cit)
(*cit)->release_relation(te); (*cit)->release_relation(chain_id);
ot->container = targets->container; ot->container = targets->container;
for(auto cit = ot->container.begin(); cit != ot->container.end(); ++cit) for(auto cit = ot->container.begin(); cit != ot->container.end(); ++cit)
(*cit)->create_relation(te); (*cit)->create_relation(chain_id);
if(te->is_flag(EFFECT_FLAG_CARD_TARGET)) { if(te->is_flag(EFFECT_FLAG_CARD_TARGET)) {
for(auto cit = ot->container.begin(); cit != ot->container.end(); ++cit) { for(auto cit = ot->container.begin(); cit != ot->container.end(); ++cit) {
if((*cit)->current.location & 0x30) if((*cit)->current.location & 0x30)
...@@ -3210,7 +3211,7 @@ int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint3 ...@@ -3210,7 +3211,7 @@ int32 field::send_to(uint16 step, group * targets, effect * reason_effect, uint3
pcard->current.reason &= ~REASON_TEMPORARY; pcard->current.reason &= ~REASON_TEMPORARY;
pcard->fieldid = infos.field_id++; pcard->fieldid = infos.field_id++;
pcard->reset(RESET_LEAVE, RESET_EVENT); pcard->reset(RESET_LEAVE, RESET_EVENT);
pcard->relate_effect.clear(); pcard->clear_relate_effect();
remove_card(pcard); remove_card(pcard);
param->leave.insert(pcard); param->leave.insert(pcard);
++param->cvit; ++param->cvit;
......
...@@ -737,8 +737,9 @@ int32 field::process() { ...@@ -737,8 +737,9 @@ int32 field::process() {
pduel->write_buffer32(pcard->get_info_location()); pduel->write_buffer32(pcard->get_info_location());
} }
} }
uint16 chain_id = core.current_chain.rbegin()->chain_id;
for(auto cit = pret->container.begin(); cit != pret->container.end(); ++cit) for(auto cit = pret->container.begin(); cit != pret->container.end(); ++cit)
(*cit)->create_relation(peffect); (*cit)->create_relation(chain_id);
pduel->lua->add_param(pret, PARAM_TYPE_GROUP); pduel->lua->add_param(pret, PARAM_TYPE_GROUP);
} }
core.units.pop_front(); core.units.pop_front();
...@@ -1610,7 +1611,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free ...@@ -1610,7 +1611,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
//forced trigger //forced trigger
for (auto clit = core.new_fchain_s.begin(); clit != core.new_fchain_s.end(); ++clit) { for (auto clit = core.new_fchain_s.begin(); clit != core.new_fchain_s.end(); ++clit) {
effect* peffect = clit->triggering_effect; effect* peffect = clit->triggering_effect;
if(!peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER | EFFECT_FLAG_BOTH_SIDE) && peffect->handler->is_has_relation(peffect)) { if(!peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER | EFFECT_FLAG_BOTH_SIDE) && peffect->handler->is_has_relation(clit->chain_id)) {
clit->triggering_player = peffect->handler->current.controler; clit->triggering_player = peffect->handler->current.controler;
clit->triggering_controler = peffect->handler->current.controler; clit->triggering_controler = peffect->handler->current.controler;
clit->triggering_location = peffect->handler->current.location; clit->triggering_location = peffect->handler->current.location;
...@@ -1683,11 +1684,11 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free ...@@ -1683,11 +1684,11 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
} }
for (auto clit = core.new_ochain_s.begin(); clit != core.new_ochain_s.end(); ++clit) { for (auto clit = core.new_ochain_s.begin(); clit != core.new_ochain_s.end(); ++clit) {
effect* peffect = clit->triggering_effect; effect* peffect = clit->triggering_effect;
if((!peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER | EFFECT_FLAG_BOTH_SIDE) && peffect->handler->is_has_relation(peffect)) if((!peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER | EFFECT_FLAG_BOTH_SIDE) && peffect->handler->is_has_relation(clit->chain_id))
|| (!(peffect->is_flag(EFFECT_FLAG_FIELD_ONLY)) && (peffect->type & EFFECT_TYPE_FIELD) || (!(peffect->is_flag(EFFECT_FLAG_FIELD_ONLY)) && (peffect->type & EFFECT_TYPE_FIELD)
&& (peffect->range & LOCATION_HAND) && peffect->handler->current.location == LOCATION_HAND)) { && (peffect->range & LOCATION_HAND) && peffect->handler->current.location == LOCATION_HAND)) {
if(!peffect->handler->is_has_relation(peffect)) if(!peffect->handler->is_has_relation(clit->chain_id))
peffect->handler->create_relation(peffect); peffect->handler->create_relation(clit->chain_id);
clit->triggering_player = peffect->handler->current.controler; clit->triggering_player = peffect->handler->current.controler;
clit->triggering_controler = peffect->handler->current.controler; clit->triggering_controler = peffect->handler->current.controler;
clit->triggering_location = peffect->handler->current.location; clit->triggering_location = peffect->handler->current.location;
...@@ -1727,7 +1728,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free ...@@ -1727,7 +1728,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
&& (peffect->code == EVENT_FLIP && infos.phase == PHASE_DAMAGE || (clit->triggering_location & 0x43) && (peffect->code == EVENT_FLIP && infos.phase == PHASE_DAMAGE || (clit->triggering_location & 0x43)
|| !(peffect->handler->current.location & 0x43) || peffect->handler->is_position(POS_FACEUP))) { || !(peffect->handler->current.location & 0x43) || peffect->handler->is_position(POS_FACEUP))) {
if(!(peffect->is_flag(EFFECT_FLAG_FIELD_ONLY)) && clit->triggering_location == LOCATION_HAND if(!(peffect->is_flag(EFFECT_FLAG_FIELD_ONLY)) && clit->triggering_location == LOCATION_HAND
&& (((peffect->type & EFFECT_TYPE_SINGLE) && !(peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)) && peffect->handler->is_has_relation(peffect)) && (((peffect->type & EFFECT_TYPE_SINGLE) && !(peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)) && peffect->handler->is_has_relation(clit->chain_id))
|| (peffect->range & LOCATION_HAND))) { || (peffect->range & LOCATION_HAND))) {
core.new_ochain_h.push_back(*clit); core.new_ochain_h.push_back(*clit);
act = false; act = false;
...@@ -1788,7 +1789,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free ...@@ -1788,7 +1789,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
&& (peffect->code == EVENT_FLIP && infos.phase == PHASE_DAMAGE || (clit->triggering_location & 0x43) && (peffect->code == EVENT_FLIP && infos.phase == PHASE_DAMAGE || (clit->triggering_location & 0x43)
|| !(peffect->handler->current.location & 0x43) || peffect->handler->is_position(POS_FACEUP))) { || !(peffect->handler->current.location & 0x43) || peffect->handler->is_position(POS_FACEUP))) {
if(!(peffect->is_flag(EFFECT_FLAG_FIELD_ONLY)) && clit->triggering_location == LOCATION_HAND if(!(peffect->is_flag(EFFECT_FLAG_FIELD_ONLY)) && clit->triggering_location == LOCATION_HAND
&& (((peffect->type & EFFECT_TYPE_SINGLE) && !(peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)) && peffect->handler->is_has_relation(peffect)) && (((peffect->type & EFFECT_TYPE_SINGLE) && !(peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)) && peffect->handler->is_has_relation(clit->chain_id))
|| (peffect->range & 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)
...@@ -1952,7 +1953,7 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori ...@@ -1952,7 +1953,7 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
for(auto ifit = core.quick_f_chain.begin(); ifit != core.quick_f_chain.end(); ++ifit) { for(auto ifit = core.quick_f_chain.begin(); ifit != core.quick_f_chain.end(); ++ifit) {
peffect = ifit->first; peffect = ifit->first;
if(peffect->is_chainable(ifit->second.triggering_player) && peffect->check_count_limit(ifit->second.triggering_player) if(peffect->is_chainable(ifit->second.triggering_player) && peffect->check_count_limit(ifit->second.triggering_player)
&& peffect->handler->is_has_relation(peffect)) { && peffect->handler->is_has_relation(ifit->second.chain_id)) {
if(ifit->second.triggering_player == infos.turn_player) { if(ifit->second.triggering_player == infos.turn_player) {
act = true; act = true;
if(peffect->is_flag(EFFECT_FLAG_CHAIN_UNIQUE)) { if(peffect->is_flag(EFFECT_FLAG_CHAIN_UNIQUE)) {
...@@ -2064,7 +2065,7 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori ...@@ -2064,7 +2065,7 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
for(auto clit = core.new_ochain_h.begin(); clit != core.new_ochain_h.end(); ++clit) { for(auto clit = core.new_ochain_h.begin(); clit != core.new_ochain_h.end(); ++clit) {
peffect = clit->triggering_effect; peffect = clit->triggering_effect;
bool act = true; bool act = true;
if(clit->triggering_player == priority && !peffect->handler->is_status(STATUS_CHAINING) && peffect->handler->is_has_relation(peffect) if(clit->triggering_player == priority && !peffect->handler->is_status(STATUS_CHAINING) && peffect->handler->is_has_relation(clit->chain_id)
&& peffect->is_chainable(priority) && peffect->is_activateable(priority, clit->evt, TRUE)) { && peffect->is_chainable(priority) && peffect->is_activateable(priority, clit->evt, TRUE)) {
for(auto cait = core.current_chain.begin(); cait != core.current_chain.end(); ++cait) { for(auto cait = core.current_chain.begin(); cait != core.current_chain.end(); ++cait) {
if(cait->triggering_player == priority) { if(cait->triggering_player == priority) {
...@@ -2236,7 +2237,6 @@ int32 field::process_instant_event() { ...@@ -2236,7 +2237,6 @@ int32 field::process_instant_event() {
peffect = pr.first->second; peffect = pr.first->second;
if(!peffect->is_condition_check(peffect->handler->current.controler, *elit)) if(!peffect->is_condition_check(peffect->handler->current.controler, *elit))
continue; continue;
peffect->handler->create_relation(peffect);
peffect->s_range = peffect->handler->current.location; peffect->s_range = peffect->handler->current.location;
peffect->o_range = peffect->handler->current.sequence; peffect->o_range = peffect->handler->current.sequence;
newchain.flag = 0; newchain.flag = 0;
...@@ -2250,16 +2250,13 @@ int32 field::process_instant_event() { ...@@ -2250,16 +2250,13 @@ int32 field::process_instant_event() {
newchain.triggering_player = elit->event_player; newchain.triggering_player = elit->event_player;
else newchain.triggering_player = peffect->handler->current.controler; else newchain.triggering_player = peffect->handler->current.controler;
core.new_fchain.push_back(newchain); core.new_fchain.push_back(newchain);
peffect->handler->create_relation(newchain.chain_id);
} }
pr = effects.trigger_o_effect.equal_range(elit->event_code); pr = effects.trigger_o_effect.equal_range(elit->event_code);
for(; pr.first != pr.second; ++pr.first) { for(; pr.first != pr.second; ++pr.first) {
peffect = pr.first->second; peffect = pr.first->second;
if(!peffect->is_condition_check(peffect->handler->current.controler, *elit)) if(!peffect->is_condition_check(peffect->handler->current.controler, *elit))
continue; continue;
if((peffect->is_flag(EFFECT_FLAG_FIELD_ONLY))
|| ((peffect->type & EFFECT_TYPE_SINGLE) && !(peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)))
|| !(peffect->range & LOCATION_HAND) || (peffect->range & peffect->handler->current.location))
peffect->handler->create_relation(peffect);
peffect->s_range = peffect->handler->current.location; peffect->s_range = peffect->handler->current.location;
peffect->o_range = peffect->handler->current.sequence; peffect->o_range = peffect->handler->current.sequence;
newchain.flag = 0; newchain.flag = 0;
...@@ -2273,6 +2270,10 @@ int32 field::process_instant_event() { ...@@ -2273,6 +2270,10 @@ int32 field::process_instant_event() {
newchain.triggering_player = elit->event_player; newchain.triggering_player = elit->event_player;
else newchain.triggering_player = peffect->handler->current.controler; else newchain.triggering_player = peffect->handler->current.controler;
core.new_ochain.push_back(newchain); core.new_ochain.push_back(newchain);
if((peffect->is_flag(EFFECT_FLAG_FIELD_ONLY))
|| ((peffect->type & EFFECT_TYPE_SINGLE) && !(peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE)))
|| !(peffect->range & LOCATION_HAND) || (peffect->range & peffect->handler->current.location))
peffect->handler->create_relation(newchain.chain_id);
} }
//instant_f //instant_f
pr = effects.quick_f_effect.equal_range(elit->event_code); pr = effects.quick_f_effect.equal_range(elit->event_code);
...@@ -2281,7 +2282,6 @@ int32 field::process_instant_event() { ...@@ -2281,7 +2282,6 @@ int32 field::process_instant_event() {
peffect->s_range = peffect->handler->current.location; peffect->s_range = peffect->handler->current.location;
peffect->o_range = peffect->handler->current.sequence; peffect->o_range = peffect->handler->current.sequence;
if(peffect->is_activateable(peffect->handler->current.controler, *elit)) { if(peffect->is_activateable(peffect->handler->current.controler, *elit)) {
peffect->handler->create_relation(peffect);
newchain.flag = 0; newchain.flag = 0;
newchain.chain_id = infos.field_id++; newchain.chain_id = infos.field_id++;
newchain.evt = *elit; newchain.evt = *elit;
...@@ -2293,6 +2293,7 @@ int32 field::process_instant_event() { ...@@ -2293,6 +2293,7 @@ int32 field::process_instant_event() {
newchain.triggering_player = elit->event_player; newchain.triggering_player = elit->event_player;
else newchain.triggering_player = peffect->handler->current.controler; else newchain.triggering_player = peffect->handler->current.controler;
core.quick_f_chain[peffect] = newchain; core.quick_f_chain[peffect] = newchain;
peffect->handler->create_relation(newchain.chain_id);
} }
} }
if(!(core.global_flag & GLOBALFLAG_DELAYED_QUICKEFFECT)) if(!(core.global_flag & GLOBALFLAG_DELAYED_QUICKEFFECT))
...@@ -2365,7 +2366,6 @@ int32 field::process_single_event() { ...@@ -2365,7 +2366,6 @@ int32 field::process_single_event() {
} else { } else {
if(!peffect->is_condition_check(peffect->handler->current.controler, e)) if(!peffect->is_condition_check(peffect->handler->current.controler, e))
continue; continue;
peffect->handler->create_relation(peffect);
peffect->s_range = peffect->handler->current.location; peffect->s_range = peffect->handler->current.location;
peffect->o_range = peffect->handler->current.sequence; peffect->o_range = peffect->handler->current.sequence;
chain newchain; chain newchain;
...@@ -2395,6 +2395,7 @@ int32 field::process_single_event() { ...@@ -2395,6 +2395,7 @@ int32 field::process_single_event() {
else else
core.new_fchain.push_back(newchain); core.new_fchain.push_back(newchain);
} }
peffect->handler->create_relation(newchain.chain_id);
} }
} }
} }
...@@ -4287,12 +4288,12 @@ int32 field::add_chain(uint16 step) { ...@@ -4287,12 +4288,12 @@ int32 field::add_chain(uint16 step) {
check_chain_counter(peffect, clit.triggering_player, clit.chain_count); check_chain_counter(peffect, clit.triggering_player, clit.chain_count);
// triggered events which are not caused by RaiseEvent create relation with the handler // triggered events which are not caused by RaiseEvent create relation with the handler
if(!(peffect->is_flag(EFFECT_FLAG_FIELD_ONLY)) && (!(peffect->type & 0x2a0) || (peffect->code & EVENT_PHASE) == EVENT_PHASE)) { if(!(peffect->is_flag(EFFECT_FLAG_FIELD_ONLY)) && (!(peffect->type & 0x2a0) || (peffect->code & EVENT_PHASE) == EVENT_PHASE)) {
peffect->handler->create_relation(peffect); peffect->handler->create_relation(clit.chain_id);
} }
peffect->effect_owner = clit.triggering_player; peffect->effect_owner = clit.triggering_player;
// DISABLE_CHAIN should be check before cost // DISABLE_CHAIN should be check before cost
effect* deffect; effect* deffect;
if(!(peffect->is_flag(EFFECT_FLAG_FIELD_ONLY)) && phandler->is_has_relation(peffect) && (deffect = phandler->is_affected_by_effect(EFFECT_DISABLE_EFFECT))) { if(!(peffect->is_flag(EFFECT_FLAG_FIELD_ONLY)) && phandler->is_has_relation(clit.chain_id) && (deffect = phandler->is_affected_by_effect(EFFECT_DISABLE_EFFECT))) {
effect* negeff = pduel->new_effect(); effect* negeff = pduel->new_effect();
negeff->owner = deffect->owner; negeff->owner = deffect->owner;
negeff->type = EFFECT_TYPE_SINGLE; negeff->type = EFFECT_TYPE_SINGLE;
...@@ -4551,7 +4552,7 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2 ...@@ -4551,7 +4552,7 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
break_effect(); break_effect();
core.chain_solving = TRUE; core.chain_solving = TRUE;
card* pcard = peffect->handler; card* pcard = peffect->handler;
if((peffect->type & EFFECT_TYPE_ACTIVATE) && pcard->is_has_relation(peffect)) { if((peffect->type & EFFECT_TYPE_ACTIVATE) && pcard->is_has_relation(cait->chain_id)) {
pcard->set_status(STATUS_ACTIVATED, TRUE); pcard->set_status(STATUS_ACTIVATED, TRUE);
pcard->enable_field_effect(TRUE); pcard->enable_field_effect(TRUE);
if(core.duel_options & DUEL_OBSOLETE_RULING) { if(core.duel_options & DUEL_OBSOLETE_RULING) {
...@@ -4574,7 +4575,7 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2 ...@@ -4574,7 +4575,7 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
if(is_chain_disablable(cait->chain_count)) { if(is_chain_disablable(cait->chain_count)) {
if((cait->flag & CHAIN_DISABLE_EFFECT) || pcard->is_affected_by_effect(EFFECT_DISABLE_CHAIN) if((cait->flag & CHAIN_DISABLE_EFFECT) || pcard->is_affected_by_effect(EFFECT_DISABLE_CHAIN)
|| ((cait->triggering_location & LOCATION_ONFIELD) && pcard->is_affected_by_effect(EFFECT_DISABLE_CHAIN_FIELD)) || ((cait->triggering_location & LOCATION_ONFIELD) && pcard->is_affected_by_effect(EFFECT_DISABLE_CHAIN_FIELD))
|| (pcard->is_status(STATUS_DISABLED) && pcard->is_has_relation(cait->triggering_effect))) { || (pcard->is_status(STATUS_DISABLED) && pcard->is_has_relation(cait->chain_id))) {
if(!(cait->flag & CHAIN_DISABLE_EFFECT)) { if(!(cait->flag & CHAIN_DISABLE_EFFECT)) {
pduel->write_buffer8(MSG_CHAIN_DISABLED); pduel->write_buffer8(MSG_CHAIN_DISABLED);
pduel->write_buffer8(cait->chain_count); pduel->write_buffer8(cait->chain_count);
...@@ -4680,21 +4681,21 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2 ...@@ -4680,21 +4681,21 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
shuffle(pcard->current.controler, LOCATION_HAND); shuffle(pcard->current.controler, LOCATION_HAND);
if(cait->target_cards && cait->target_cards->container.size()) { if(cait->target_cards && cait->target_cards->container.size()) {
for(auto cit = cait->target_cards->container.begin(); cit != cait->target_cards->container.end(); ++cit) for(auto cit = cait->target_cards->container.begin(); cit != cait->target_cards->container.end(); ++cit)
(*cit)->release_relation(peffect); (*cit)->release_relation(cait->chain_id);
} }
if((pcard->data.type & TYPE_EQUIP) && (peffect->type & EFFECT_TYPE_ACTIVATE) if((pcard->data.type & TYPE_EQUIP) && (peffect->type & EFFECT_TYPE_ACTIVATE)
&& !pcard->equiping_target && (pcard->current.location == LOCATION_SZONE)) && !pcard->equiping_target && (pcard->current.location == LOCATION_SZONE))
pcard->set_status(STATUS_LEAVE_CONFIRMED, TRUE); pcard->set_status(STATUS_LEAVE_CONFIRMED, TRUE);
if(core.duel_options & DUEL_OBSOLETE_RULING) { if(core.duel_options & DUEL_OBSOLETE_RULING) {
if((pcard->data.type & TYPE_FIELD) && (peffect->type & EFFECT_TYPE_ACTIVATE) if((pcard->data.type & TYPE_FIELD) && (peffect->type & EFFECT_TYPE_ACTIVATE)
&& !pcard->is_status(STATUS_LEAVE_CONFIRMED) && pcard->is_has_relation(peffect)) { && !pcard->is_status(STATUS_LEAVE_CONFIRMED) && pcard->is_has_relation(cait->chain_id)) {
card* fscard = player[1 - pcard->current.controler].list_szone[5]; card* fscard = player[1 - pcard->current.controler].list_szone[5];
if(fscard && fscard->is_position(POS_FACEUP)) if(fscard && fscard->is_position(POS_FACEUP))
destroy(fscard, 0, REASON_RULE, 1 - pcard->current.controler); destroy(fscard, 0, REASON_RULE, 1 - pcard->current.controler);
} }
} }
peffect->active_type = 0; peffect->active_type = 0;
pcard->release_relation(peffect); pcard->release_relation(cait->chain_id);
if(cait->target_cards) if(cait->target_cards)
pduel->delete_group(cait->target_cards); pduel->delete_group(cait->target_cards);
for(auto oit = cait->opinfos.begin(); oit != cait->opinfos.end(); ++oit) { for(auto oit = cait->opinfos.begin(); oit != cait->opinfos.end(); ++oit) {
......
...@@ -137,6 +137,7 @@ public: ...@@ -137,6 +137,7 @@ public:
static int32 card_release_effect_relation(lua_State *L); static int32 card_release_effect_relation(lua_State *L);
static int32 card_clear_effect_relation(lua_State *L); static int32 card_clear_effect_relation(lua_State *L);
static int32 card_is_relate_to_effect(lua_State *L); static int32 card_is_relate_to_effect(lua_State *L);
static int32 card_is_relate_to_chain(lua_State *L);
static int32 card_is_relate_to_card(lua_State *L); static int32 card_is_relate_to_card(lua_State *L);
static int32 card_is_relate_to_battle(lua_State *L); static int32 card_is_relate_to_battle(lua_State *L);
static int32 card_copy_effect(lua_State *L); static int32 card_copy_effect(lua_State *L);
......
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