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) {
return false;
}
case MSG_HINT: {
pbuf += 6;
//DuelClient::ClientAnalyze(offset, pbuf - offset);
int type = BufferIO::ReadInt8(pbuf);
int player = BufferIO::ReadInt8(pbuf);
int data = BufferIO::ReadInt32(pbuf);
if(player == 0)
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_WIN: {
......
......@@ -397,7 +397,6 @@ public:
//operations
int32 negate_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_target(uint8 chaincount, group* targets);
void change_target_player(uint8 chaincount, uint8 playerid);
......@@ -482,7 +481,6 @@ public:
//Chain Info
#define CHAIN_DISABLE_ACTIVATE 0x01
#define CHAIN_DISABLE_EFFECT 0x02
#define CHAIN_NEGATED 0x04
#define CHAININFO_CHAIN_COUNT 0x01
#define CHAININFO_TRIGGERING_EFFECT 0x02
#define CHAININFO_TRIGGERING_PLAYER 0x04
......
......@@ -1173,12 +1173,20 @@ int32 scriptlib::duel_negate_effect(lua_State *L) {
return 1;
}
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);
card* pcard = *(card**)lua_touserdata(L, 1);
duel* pduel = pcard->pduel;
lua_pushboolean(L, pduel->game_field->negate_related_chain(pcard));
return 1;
uint32 reset_flag = lua_tointeger(L, 2);
duel * pduel = pcard->pduel;
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) {
check_param_count(L, 1);
......
......@@ -20,7 +20,7 @@ int32 field::negate_chain(uint8 chaincount) {
chain& pchain = core.current_chain[chaincount - 1];
if(!(pchain.flag & CHAIN_DISABLE_ACTIVATE) && is_chain_negatable(pchain.chain_count)
&& 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_player = core.reason_player;
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) {
chain& pchain = core.current_chain[chaincount - 1];
if(!(pchain.flag & CHAIN_DISABLE_EFFECT) && is_chain_disablable(pchain.chain_count)
&& 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_player = core.reason_player;
pduel->write_buffer8(MSG_CHAIN_DISABLED);
......@@ -54,21 +54,6 @@ int32 field::disable_chain(uint8 chaincount) {
}
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) {
if(core.current_chain.size() == 0)
return;
......
......@@ -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_sequence = peffect->handler->current.sequence;
}
if(peffect->is_chainable(clit->triggering_player) && peffect->is_activateable(clit->triggering_player, clit->evt, TRUE)) {
if(clit->triggering_player == infos.turn_player)
uint8 tp = clit->triggering_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);
else
core.ntpchain.push_back(*clit);
......@@ -3865,8 +3887,15 @@ int32 field::add_chain(uint16 step) {
luaL_unref(pduel->lua->lua_state, LUA_REGISTRYINDEX, core.chain_limit);
core.chain_limit = 0;
}
if(!(peffect->flag & EFFECT_FLAG_FIELD_ONLY) && peffect->handler->is_affected_by_effect(EFFECT_DISABLE_EFFECT))
clit->flag |= CHAIN_DISABLE_EFFECT;
effect* deffect;
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();
if((clit->triggering_effect->card_type & 0x5) == 0x5)
clit->triggering_effect->card_type -= TYPE_TRAP;
......@@ -4068,8 +4097,9 @@ int32 field::solve_chain(uint16 step, uint32 skip_new) {
case 2: {
card* pcard = cait->triggering_effect->handler;
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_NEGATED)) {
if((cait->flag & CHAIN_DISABLE_EFFECT) || pcard->is_affected_by_effect(EFFECT_DISABLE_CHAIN)
|| (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(cait->chain_count);
}
......
......@@ -37,6 +37,6 @@ function c1005587.activate(e,tp,eg,ep,ev,re,r,rp)
e1:SetReset(RESET_EVENT+0x1fe0000)
tc:RegisterEffect(e1)
Duel.AdjustInstantly()
Duel.NegateRelatedChain(tc)
Duel.NegateRelatedChain(tc,RESET_TURN_SET)
Duel.Destroy(tc,REASON_EFFECT)
end
......@@ -12,12 +12,12 @@ function c11047543.initial_effect(c)
c:RegisterEffect(e1)
end
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())
end
function c11047543.filter2(c,e,tp,lv)
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)
end
function c11047543.spfilter(c,e,tp,lv)
......
......@@ -9,9 +9,9 @@ function c1992816.initial_effect(c)
e1:SetType(EFFECT_TYPE_QUICK_O)
e1:SetCode(EVENT_FREE_CHAIN)
e1:SetRange(LOCATION_MZONE)
e1:SetCountLimit(1)
e1:SetHintTiming(0,TIMING_BATTLE_PHASE)
e1:SetCondition(c1992816.atkcon)
e1:SetCost(c1992816.atkcost)
e1:SetOperation(c1992816.atkop)
c:RegisterEffect(e1)
--material
......@@ -38,6 +38,10 @@ end
function c1992816.atkcon(e,tp,eg,ep,ev,re,r,rp)
return e:GetHandler()==Duel.GetAttackTarget() and e:GetHandler():GetOverlayCount()~=0
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)
Duel.NegateAttack()
end
......
......@@ -26,7 +26,7 @@ function c25789292.activate(e,tp,eg,ep,ev,re,r,rp)
local c=e:GetHandler()
local tc=Duel.GetFirstTarget()
if tc:IsRelateToEffect(e) and tc:IsFaceup() then
Duel.NegateRelatedChain(tc)
Duel.NegateRelatedChain(tc,RESET_TURN_SET)
local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_SINGLE)
e1:SetCode(EFFECT_UPDATE_ATTACK)
......@@ -41,6 +41,7 @@ function c25789292.activate(e,tp,eg,ep,ev,re,r,rp)
local e3=Effect.CreateEffect(c)
e3:SetType(EFFECT_TYPE_SINGLE)
e3:SetCode(EFFECT_DISABLE_EFFECT)
e3:SetValue(RESET_TURN_SET)
e3:SetReset(RESET_EVENT+0x1fe0000+RESET_PHASE+RESET_END)
tc:RegisterEffect(e3)
end
......
......@@ -14,7 +14,7 @@ function c70054514.initial_effect(c)
end
function c70054514.drcon(e,tp,eg,ep,ev,re,r,rp)
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
function c70054514.drtg(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return true end
......
......@@ -55,9 +55,10 @@ function c74371660.operation(e,tp,eg,ep,ev,re,r,rp)
local e2=Effect.CreateEffect(c)
e2:SetType(EFFECT_TYPE_SINGLE)
e2:SetCode(EFFECT_DISABLE_EFFECT)
e2:SetValue(RESET_TURN_SET)
e2:SetReset(RESET_EVENT+0x1fe0000+RESET_PHASE+PHASE_END)
tc:RegisterEffect(e2)
Duel.NegateRelatedChain(tc)
Duel.NegateRelatedChain(tc,RESET_TURN_SET)
tc=g:GetNext()
end
end
......@@ -37,7 +37,7 @@ function c97268402.operation(e,tp,eg,ep,ev,re,r,rp)
local c=e:GetHandler()
local tc=Duel.GetFirstTarget()
if tc:IsFaceup() and tc:IsRelateToEffect(e) then
Duel.NegateRelatedChain(tc)
Duel.NegateRelatedChain(tc,RESET_TURN_SET)
local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_SINGLE)
e1:SetCode(EFFECT_DISABLE)
......@@ -46,6 +46,7 @@ function c97268402.operation(e,tp,eg,ep,ev,re,r,rp)
local e2=Effect.CreateEffect(c)
e2:SetType(EFFECT_TYPE_SINGLE)
e2:SetCode(EFFECT_DISABLE_EFFECT)
e2:SetValue(RESET_TURN_SET)
e2:SetReset(RESET_EVENT+0x1fe0000+RESET_PHASE+RESET_END)
tc:RegisterEffect(e2)
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