Commit 0478f3b6 authored by argon.sun's avatar argon.sun

fix

parent 69449312
...@@ -119,8 +119,11 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) { ...@@ -119,8 +119,11 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
return false; return false;
} }
case MSG_HINT: { case MSG_HINT: {
pbuf += 6; int type = BufferIO::ReadInt8(pbuf);
//DuelClient::ClientAnalyze(offset, pbuf - offset); int player = BufferIO::ReadInt8(pbuf);
int data = BufferIO::ReadInt32(pbuf);
if(player == 0)
DuelClient::ClientAnalyze(offset, pbuf - offset);
break; break;
} }
case MSG_WIN: { case MSG_WIN: {
......
...@@ -397,7 +397,6 @@ public: ...@@ -397,7 +397,6 @@ public:
//operations //operations
int32 negate_chain(uint8 chaincount); int32 negate_chain(uint8 chaincount);
int32 disable_chain(uint8 chaincount); int32 disable_chain(uint8 chaincount);
int32 negate_related_chain(card* pcard);
void change_chain_effect(uint8 chaincount, int32 replace_op); void change_chain_effect(uint8 chaincount, int32 replace_op);
void change_target(uint8 chaincount, group* targets); void change_target(uint8 chaincount, group* targets);
void change_target_player(uint8 chaincount, uint8 playerid); void change_target_player(uint8 chaincount, uint8 playerid);
...@@ -482,7 +481,6 @@ public: ...@@ -482,7 +481,6 @@ public:
//Chain Info //Chain Info
#define CHAIN_DISABLE_ACTIVATE 0x01 #define CHAIN_DISABLE_ACTIVATE 0x01
#define CHAIN_DISABLE_EFFECT 0x02 #define CHAIN_DISABLE_EFFECT 0x02
#define CHAIN_NEGATED 0x04
#define CHAININFO_CHAIN_COUNT 0x01 #define CHAININFO_CHAIN_COUNT 0x01
#define CHAININFO_TRIGGERING_EFFECT 0x02 #define CHAININFO_TRIGGERING_EFFECT 0x02
#define CHAININFO_TRIGGERING_PLAYER 0x04 #define CHAININFO_TRIGGERING_PLAYER 0x04
......
...@@ -1173,12 +1173,20 @@ int32 scriptlib::duel_negate_effect(lua_State *L) { ...@@ -1173,12 +1173,20 @@ int32 scriptlib::duel_negate_effect(lua_State *L) {
return 1; return 1;
} }
int32 scriptlib::duel_negate_related_chain(lua_State *L) { int32 scriptlib::duel_negate_related_chain(lua_State *L) {
check_param_count(L, 1); check_param_count(L, 2);
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);
duel* pduel = pcard->pduel; uint32 reset_flag = lua_tointeger(L, 2);
lua_pushboolean(L, pduel->game_field->negate_related_chain(pcard)); duel * pduel = pcard->pduel;
return 1; if(pduel->game_field->core.current_chain.size() < 2)
return FALSE;
effect* negeff = pduel->new_effect();
negeff->owner = pduel->game_field->core.reason_effect->handler;
negeff->type = EFFECT_TYPE_SINGLE;
negeff->code = EFFECT_DISABLE_CHAIN;
negeff->reset_flag = RESET_CHAIN | RESET_EVENT | reset_flag;
pcard->add_effect(negeff);
return 0;
} }
int32 scriptlib::duel_disable_summon(lua_State *L) { int32 scriptlib::duel_disable_summon(lua_State *L) {
check_param_count(L, 1); check_param_count(L, 1);
......
...@@ -20,7 +20,7 @@ int32 field::negate_chain(uint8 chaincount) { ...@@ -20,7 +20,7 @@ int32 field::negate_chain(uint8 chaincount) {
chain& pchain = core.current_chain[chaincount - 1]; chain& pchain = core.current_chain[chaincount - 1];
if(!(pchain.flag & CHAIN_DISABLE_ACTIVATE) && is_chain_negatable(pchain.chain_count) if(!(pchain.flag & CHAIN_DISABLE_ACTIVATE) && is_chain_negatable(pchain.chain_count)
&& pchain.triggering_effect->handler->is_affect_by_effect(core.reason_effect) ) { && pchain.triggering_effect->handler->is_affect_by_effect(core.reason_effect) ) {
pchain.flag |= CHAIN_DISABLE_ACTIVATE | CHAIN_NEGATED; pchain.flag |= CHAIN_DISABLE_ACTIVATE;
pchain.disable_reason = core.reason_effect; pchain.disable_reason = core.reason_effect;
pchain.disable_player = core.reason_player; pchain.disable_player = core.reason_player;
if((pchain.triggering_effect->type & EFFECT_TYPE_ACTIVATE) && (pchain.triggering_effect->handler->current.location == LOCATION_SZONE)) { if((pchain.triggering_effect->type & EFFECT_TYPE_ACTIVATE) && (pchain.triggering_effect->handler->current.location == LOCATION_SZONE)) {
...@@ -43,7 +43,7 @@ int32 field::disable_chain(uint8 chaincount) { ...@@ -43,7 +43,7 @@ int32 field::disable_chain(uint8 chaincount) {
chain& pchain = core.current_chain[chaincount - 1]; chain& pchain = core.current_chain[chaincount - 1];
if(!(pchain.flag & CHAIN_DISABLE_EFFECT) && is_chain_disablable(pchain.chain_count) if(!(pchain.flag & CHAIN_DISABLE_EFFECT) && is_chain_disablable(pchain.chain_count)
&& pchain.triggering_effect->handler->is_affect_by_effect(core.reason_effect)) { && pchain.triggering_effect->handler->is_affect_by_effect(core.reason_effect)) {
core.current_chain[chaincount - 1].flag |= CHAIN_DISABLE_EFFECT | CHAIN_NEGATED; core.current_chain[chaincount - 1].flag |= CHAIN_DISABLE_EFFECT;
core.current_chain[chaincount - 1].disable_reason = core.reason_effect; core.current_chain[chaincount - 1].disable_reason = core.reason_effect;
core.current_chain[chaincount - 1].disable_player = core.reason_player; core.current_chain[chaincount - 1].disable_player = core.reason_player;
pduel->write_buffer8(MSG_CHAIN_DISABLED); pduel->write_buffer8(MSG_CHAIN_DISABLED);
...@@ -54,21 +54,6 @@ int32 field::disable_chain(uint8 chaincount) { ...@@ -54,21 +54,6 @@ int32 field::disable_chain(uint8 chaincount) {
} }
return FALSE; return FALSE;
} }
int32 field::negate_related_chain(card* pcard) {
for(int32 i = 0; i < core.current_chain.size(); ++i) {
chain& pchain = core.current_chain[i];
if(pchain.triggering_effect->handler == pcard && !(pchain.flag & CHAIN_DISABLE_EFFECT) && is_chain_disablable(pchain.chain_count)
&& pchain.triggering_effect->handler->is_affect_by_effect(core.reason_effect)) {
pchain.flag |= CHAIN_DISABLE_EFFECT | CHAIN_NEGATED;
pchain.disable_reason = core.reason_effect;
pchain.disable_player = core.reason_player;
pduel->write_buffer8(MSG_CHAIN_DISABLED);
pduel->write_buffer8(i + 1);
return TRUE;
}
}
return FALSE;
}
void field::change_chain_effect(uint8 chaincount, int32 rep_op) { void field::change_chain_effect(uint8 chaincount, int32 rep_op) {
if(core.current_chain.size() == 0) if(core.current_chain.size() == 0)
return; return;
......
...@@ -1648,8 +1648,30 @@ int32 field::process_point_event(int16 step, int32 special, int32 skip_new) { ...@@ -1648,8 +1648,30 @@ int32 field::process_point_event(int16 step, int32 special, int32 skip_new) {
clit->triggering_location = peffect->handler->current.location; clit->triggering_location = peffect->handler->current.location;
clit->triggering_sequence = peffect->handler->current.sequence; clit->triggering_sequence = peffect->handler->current.sequence;
} }
if(peffect->is_chainable(clit->triggering_player) && peffect->is_activateable(clit->triggering_player, clit->evt, TRUE)) { uint8 tp = clit->triggering_player;
if(clit->triggering_player == infos.turn_player) bool act = true;
if(peffect->is_chainable(tp) && peffect->is_activateable(tp, clit->evt, TRUE)) {
if(peffect->flag & EFFECT_FLAG_CHAIN_UNIQUE) {
if(tp == infos.turn_player) {
for(auto tpit = core.tpchain.begin(); tpit != core.tpchain.end(); ++tpit) {
if(tpit->triggering_effect->handler->data.code == peffect->handler->data.code) {
act = false;
break;
}
}
} else {
for(auto ntpit = core.ntpchain.begin(); ntpit != core.ntpchain.end(); ++ntpit) {
if(ntpit->triggering_effect->handler->data.code == peffect->handler->data.code) {
act = false;
break;
}
}
}
}
} else
act = false;
if(act) {
if(tp == infos.turn_player)
core.tpchain.push_back(*clit); core.tpchain.push_back(*clit);
else else
core.ntpchain.push_back(*clit); core.ntpchain.push_back(*clit);
...@@ -3865,8 +3887,15 @@ int32 field::add_chain(uint16 step) { ...@@ -3865,8 +3887,15 @@ int32 field::add_chain(uint16 step) {
luaL_unref(pduel->lua->lua_state, LUA_REGISTRYINDEX, core.chain_limit); luaL_unref(pduel->lua->lua_state, LUA_REGISTRYINDEX, core.chain_limit);
core.chain_limit = 0; core.chain_limit = 0;
} }
if(!(peffect->flag & EFFECT_FLAG_FIELD_ONLY) && peffect->handler->is_affected_by_effect(EFFECT_DISABLE_EFFECT)) effect* deffect;
clit->flag |= CHAIN_DISABLE_EFFECT; if(!(peffect->flag & EFFECT_FLAG_FIELD_ONLY) && (deffect = peffect->handler->is_affected_by_effect(EFFECT_DISABLE_EFFECT))) {
effect* negeff = pduel->new_effect();
negeff->owner = deffect->owner;
negeff->type = EFFECT_TYPE_SINGLE;
negeff->code = EFFECT_DISABLE_CHAIN;
negeff->reset_flag = RESET_CHAIN | RESET_EVENT | deffect->get_value();
peffect->handler->add_effect(negeff);
}
clit->triggering_effect->card_type = peffect->handler->get_type(); clit->triggering_effect->card_type = peffect->handler->get_type();
if((clit->triggering_effect->card_type & 0x5) == 0x5) if((clit->triggering_effect->card_type & 0x5) == 0x5)
clit->triggering_effect->card_type -= TYPE_TRAP; clit->triggering_effect->card_type -= TYPE_TRAP;
...@@ -4068,8 +4097,9 @@ int32 field::solve_chain(uint16 step, uint32 skip_new) { ...@@ -4068,8 +4097,9 @@ int32 field::solve_chain(uint16 step, uint32 skip_new) {
case 2: { case 2: {
card* pcard = cait->triggering_effect->handler; card* pcard = cait->triggering_effect->handler;
if(is_chain_disablable(cait->chain_count)) { if(is_chain_disablable(cait->chain_count)) {
if((cait->flag & CHAIN_DISABLE_EFFECT) || (pcard->is_status(STATUS_DISABLED) && pcard->is_has_relation(cait->triggering_effect))) { if((cait->flag & CHAIN_DISABLE_EFFECT) || pcard->is_affected_by_effect(EFFECT_DISABLE_CHAIN)
if(!(cait->flag & CHAIN_NEGATED)) { || (pcard->is_status(STATUS_DISABLED) && pcard->is_has_relation(cait->triggering_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);
} }
......
...@@ -37,6 +37,6 @@ function c1005587.activate(e,tp,eg,ep,ev,re,r,rp) ...@@ -37,6 +37,6 @@ function c1005587.activate(e,tp,eg,ep,ev,re,r,rp)
e1:SetReset(RESET_EVENT+0x1fe0000) e1:SetReset(RESET_EVENT+0x1fe0000)
tc:RegisterEffect(e1) tc:RegisterEffect(e1)
Duel.AdjustInstantly() Duel.AdjustInstantly()
Duel.NegateRelatedChain(tc) Duel.NegateRelatedChain(tc,RESET_TURN_SET)
Duel.Destroy(tc,REASON_EFFECT) Duel.Destroy(tc,REASON_EFFECT)
end end
...@@ -12,12 +12,12 @@ function c11047543.initial_effect(c) ...@@ -12,12 +12,12 @@ function c11047543.initial_effect(c)
c:RegisterEffect(e1) c:RegisterEffect(e1)
end end
function c11047543.filter1(c,e,tp) function c11047543.filter1(c,e,tp)
return c:IsRace(RACE_PSYCHO) and c:IsType(TYPE_TUNER) return c:IsFaceup() and c:IsRace(RACE_PSYCHO) and c:IsType(TYPE_TUNER)
and Duel.IsExistingTarget(c11047543.filter2,tp,LOCATION_REMOVED,0,1,nil,e,tp,c:GetLevel()) and Duel.IsExistingTarget(c11047543.filter2,tp,LOCATION_REMOVED,0,1,nil,e,tp,c:GetLevel())
end end
function c11047543.filter2(c,e,tp,lv) function c11047543.filter2(c,e,tp,lv)
local clv=c:GetLevel() local clv=c:GetLevel()
return clv>0 and c:IsRace(RACE_PSYCHO) and not c:IsType(TYPE_TUNER) return clv>0 and c:IsFaceup() and c:IsRace(RACE_PSYCHO) and not c:IsType(TYPE_TUNER)
and Duel.IsExistingMatchingCard(c11047543.spfilter,tp,LOCATION_EXTRA,0,1,nil,e,tp,lv+clv) and Duel.IsExistingMatchingCard(c11047543.spfilter,tp,LOCATION_EXTRA,0,1,nil,e,tp,lv+clv)
end end
function c11047543.spfilter(c,e,tp,lv) function c11047543.spfilter(c,e,tp,lv)
......
...@@ -9,9 +9,9 @@ function c1992816.initial_effect(c) ...@@ -9,9 +9,9 @@ function c1992816.initial_effect(c)
e1:SetType(EFFECT_TYPE_QUICK_O) e1:SetType(EFFECT_TYPE_QUICK_O)
e1:SetCode(EVENT_FREE_CHAIN) e1:SetCode(EVENT_FREE_CHAIN)
e1:SetRange(LOCATION_MZONE) e1:SetRange(LOCATION_MZONE)
e1:SetCountLimit(1)
e1:SetHintTiming(0,TIMING_BATTLE_PHASE) e1:SetHintTiming(0,TIMING_BATTLE_PHASE)
e1:SetCondition(c1992816.atkcon) e1:SetCondition(c1992816.atkcon)
e1:SetCost(c1992816.atkcost)
e1:SetOperation(c1992816.atkop) e1:SetOperation(c1992816.atkop)
c:RegisterEffect(e1) c:RegisterEffect(e1)
--material --material
...@@ -38,6 +38,10 @@ end ...@@ -38,6 +38,10 @@ end
function c1992816.atkcon(e,tp,eg,ep,ev,re,r,rp) function c1992816.atkcon(e,tp,eg,ep,ev,re,r,rp)
return e:GetHandler()==Duel.GetAttackTarget() and e:GetHandler():GetOverlayCount()~=0 return e:GetHandler()==Duel.GetAttackTarget() and e:GetHandler():GetOverlayCount()~=0
end end
function c1992816.atkcost(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return e:GetHandler():GetFlagEffect(1992816)==0 end
e:GetHandler():RegisterFlagEffect(1992816,RESET_EVENT+0x1fe0000+RESET_PHASE+PHASE_DAMAGE,0,1)
end
function c1992816.atkop(e,tp,eg,ep,ev,re,r,rp) function c1992816.atkop(e,tp,eg,ep,ev,re,r,rp)
Duel.NegateAttack() Duel.NegateAttack()
end end
......
...@@ -26,7 +26,7 @@ function c25789292.activate(e,tp,eg,ep,ev,re,r,rp) ...@@ -26,7 +26,7 @@ function c25789292.activate(e,tp,eg,ep,ev,re,r,rp)
local c=e:GetHandler() local c=e:GetHandler()
local tc=Duel.GetFirstTarget() local tc=Duel.GetFirstTarget()
if tc:IsRelateToEffect(e) and tc:IsFaceup() then if tc:IsRelateToEffect(e) and tc:IsFaceup() then
Duel.NegateRelatedChain(tc) Duel.NegateRelatedChain(tc,RESET_TURN_SET)
local e1=Effect.CreateEffect(c) local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_SINGLE) e1:SetType(EFFECT_TYPE_SINGLE)
e1:SetCode(EFFECT_UPDATE_ATTACK) e1:SetCode(EFFECT_UPDATE_ATTACK)
...@@ -41,6 +41,7 @@ function c25789292.activate(e,tp,eg,ep,ev,re,r,rp) ...@@ -41,6 +41,7 @@ function c25789292.activate(e,tp,eg,ep,ev,re,r,rp)
local e3=Effect.CreateEffect(c) local e3=Effect.CreateEffect(c)
e3:SetType(EFFECT_TYPE_SINGLE) e3:SetType(EFFECT_TYPE_SINGLE)
e3:SetCode(EFFECT_DISABLE_EFFECT) e3:SetCode(EFFECT_DISABLE_EFFECT)
e3:SetValue(RESET_TURN_SET)
e3:SetReset(RESET_EVENT+0x1fe0000+RESET_PHASE+RESET_END) e3:SetReset(RESET_EVENT+0x1fe0000+RESET_PHASE+RESET_END)
tc:RegisterEffect(e3) tc:RegisterEffect(e3)
end end
......
...@@ -14,7 +14,7 @@ function c70054514.initial_effect(c) ...@@ -14,7 +14,7 @@ function c70054514.initial_effect(c)
end end
function c70054514.drcon(e,tp,eg,ep,ev,re,r,rp) function c70054514.drcon(e,tp,eg,ep,ev,re,r,rp)
local c=e:GetHandler() local c=e:GetHandler()
return c:IsReason(REASON_DESTROY) and c:IsPreviousLocation(LOCATION_ONFIELD) return c:IsReason(REASON_DESTROY) and c:IsReason(REASON_EFFECT) and c:IsPreviousLocation(LOCATION_ONFIELD)
end end
function c70054514.drtg(e,tp,eg,ep,ev,re,r,rp,chk) function c70054514.drtg(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return true end if chk==0 then return true end
......
...@@ -55,9 +55,10 @@ function c74371660.operation(e,tp,eg,ep,ev,re,r,rp) ...@@ -55,9 +55,10 @@ function c74371660.operation(e,tp,eg,ep,ev,re,r,rp)
local e2=Effect.CreateEffect(c) local e2=Effect.CreateEffect(c)
e2:SetType(EFFECT_TYPE_SINGLE) e2:SetType(EFFECT_TYPE_SINGLE)
e2:SetCode(EFFECT_DISABLE_EFFECT) e2:SetCode(EFFECT_DISABLE_EFFECT)
e2:SetValue(RESET_TURN_SET)
e2:SetReset(RESET_EVENT+0x1fe0000+RESET_PHASE+PHASE_END) e2:SetReset(RESET_EVENT+0x1fe0000+RESET_PHASE+PHASE_END)
tc:RegisterEffect(e2) tc:RegisterEffect(e2)
Duel.NegateRelatedChain(tc) Duel.NegateRelatedChain(tc,RESET_TURN_SET)
tc=g:GetNext() tc=g:GetNext()
end end
end end
...@@ -37,7 +37,7 @@ function c97268402.operation(e,tp,eg,ep,ev,re,r,rp) ...@@ -37,7 +37,7 @@ function c97268402.operation(e,tp,eg,ep,ev,re,r,rp)
local c=e:GetHandler() local c=e:GetHandler()
local tc=Duel.GetFirstTarget() local tc=Duel.GetFirstTarget()
if tc:IsFaceup() and tc:IsRelateToEffect(e) then if tc:IsFaceup() and tc:IsRelateToEffect(e) then
Duel.NegateRelatedChain(tc) Duel.NegateRelatedChain(tc,RESET_TURN_SET)
local e1=Effect.CreateEffect(c) local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_SINGLE) e1:SetType(EFFECT_TYPE_SINGLE)
e1:SetCode(EFFECT_DISABLE) e1:SetCode(EFFECT_DISABLE)
...@@ -46,6 +46,7 @@ function c97268402.operation(e,tp,eg,ep,ev,re,r,rp) ...@@ -46,6 +46,7 @@ function c97268402.operation(e,tp,eg,ep,ev,re,r,rp)
local e2=Effect.CreateEffect(c) local e2=Effect.CreateEffect(c)
e2:SetType(EFFECT_TYPE_SINGLE) e2:SetType(EFFECT_TYPE_SINGLE)
e2:SetCode(EFFECT_DISABLE_EFFECT) e2:SetCode(EFFECT_DISABLE_EFFECT)
e2:SetValue(RESET_TURN_SET)
e2:SetReset(RESET_EVENT+0x1fe0000+RESET_PHASE+RESET_END) e2:SetReset(RESET_EVENT+0x1fe0000+RESET_PHASE+RESET_END)
tc:RegisterEffect(e2) tc:RegisterEffect(e2)
end end
......
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