Commit a971f79b authored by argon's avatar argon

update

parent 0418303d
...@@ -350,7 +350,7 @@ public: ...@@ -350,7 +350,7 @@ public:
#define EFFECT_BP_TWICE 296 #define EFFECT_BP_TWICE 296
#define EFFECT_UNIQUE_CHECK 297 #define EFFECT_UNIQUE_CHECK 297
#define EFFECT_MATCH_KILL 300 #define EFFECT_MATCH_KILL 300
#define EFFECT_SYNCHRO_ASSUME 310 #define EFFECT_SYNCHRO_CHECK 310
#define EVENT_STARTUP 1000 #define EVENT_STARTUP 1000
#define EVENT_FLIP 1001 #define EVENT_FLIP 1001
......
...@@ -1494,30 +1494,39 @@ int32 field::check_synchro_material(card* pcard, int32 findex1, int32 findex2, i ...@@ -1494,30 +1494,39 @@ int32 field::check_synchro_material(card* pcard, int32 findex1, int32 findex2, i
} }
int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 findex2, int32 min, int32 max) { int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 findex2, int32 min, int32 max) {
effect* peffect; effect* peffect;
effect* passume = tuner->is_affected_by_effect(EFFECT_SYNCHRO_ASSUME);
if(tuner && tuner->is_position(POS_FACEUP) && (tuner->get_type()&TYPE_TUNER) && tuner->is_can_be_synchro_material(pcard)) { if(tuner && tuner->is_position(POS_FACEUP) && (tuner->get_type()&TYPE_TUNER) && tuner->is_can_be_synchro_material(pcard)) {
if(passume) effect* pcheck = tuner->is_affected_by_effect(EFFECT_SYNCHRO_CHECK);
passume-> if(pcheck)
if(!pduel->lua->check_matching(tuner, findex1, 0)) pcheck->get_value(tuner);
if(!pduel->lua->check_matching(tuner, findex1, 0)) {
pduel->restore_assumes();
return FALSE; return FALSE;
}
if((peffect = tuner->is_affected_by_effect(EFFECT_SYNCHRO_MATERIAL_CUSTOM, pcard))) { if((peffect = tuner->is_affected_by_effect(EFFECT_SYNCHRO_MATERIAL_CUSTOM, pcard))) {
if(!peffect->target) if(!peffect->target) {
pduel->restore_assumes();
return FALSE; return FALSE;
}
pduel->lua->add_param(peffect, PARAM_TYPE_EFFECT); pduel->lua->add_param(peffect, PARAM_TYPE_EFFECT);
pduel->lua->add_param(pcard, PARAM_TYPE_CARD); pduel->lua->add_param(pcard, PARAM_TYPE_CARD);
pduel->lua->add_param(findex2, PARAM_TYPE_INDEX); pduel->lua->add_param(findex2, PARAM_TYPE_INDEX);
pduel->lua->add_param(min, PARAM_TYPE_INT); pduel->lua->add_param(min, PARAM_TYPE_INT);
pduel->lua->add_param(max, PARAM_TYPE_INT); pduel->lua->add_param(max, PARAM_TYPE_INT);
if(pduel->lua->check_condition(peffect->target, 5)) if(pduel->lua->check_condition(peffect->target, 5)) {
pduel->restore_assumes();
return TRUE; return TRUE;
}
} else { } else {
card_vector nsyn; card_vector nsyn;
card* pm; card* pm;
for(uint8 p = 0; p < 2; ++p) { for(uint8 p = 0; p < 2; ++p) {
for(int32 i = 0; i < 5; ++i) { for(int32 i = 0; i < 5; ++i) {
pm = player[p].list_mzone[i]; pm = player[p].list_mzone[i];
if(pm && pm != tuner && pm->is_position(POS_FACEUP) && pduel->lua->check_matching(pm, findex2, 0) if(pm && pm != tuner && pm->is_position(POS_FACEUP) && pm->is_can_be_synchro_material(pcard, tuner)) {
&& pm->is_can_be_synchro_material(pcard, tuner)) { if(pcheck)
pcheck->get_value(pm);
if(!pduel->lua->check_matching(pm, findex2, 0))
continue;
nsyn.push_back(pm); nsyn.push_back(pm);
pm->operation_param = pm->get_synchro_level(pcard); pm->operation_param = pm->get_synchro_level(pcard);
} }
...@@ -1527,12 +1536,17 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32 ...@@ -1527,12 +1536,17 @@ int32 field::check_tuner_material(card* pcard, card* tuner, int32 findex1, int32
int32 l1 = l & 0xffff; int32 l1 = l & 0xffff;
//int32 l2 = l >> 16; //int32 l2 = l >> 16;
int32 lv = pcard->get_level(); int32 lv = pcard->get_level();
if(lv == l1) if(lv == l1) {
pduel->restore_assumes();
return FALSE; return FALSE;
if(check_with_sum_limit(&nsyn, lv - l1, 0, 1, min, max)) }
if(check_with_sum_limit(&nsyn, lv - l1, 0, 1, min, max)) {
pduel->restore_assumes();
return TRUE; return TRUE;
} }
} }
}
pduel->restore_assumes();
return FALSE; return FALSE;
} }
int32 field::check_with_sum_limit(card_vector* mats, int32 acc, int32 index, int32 count, int32 min, int32 max) { int32 field::check_with_sum_limit(card_vector* mats, int32 acc, int32 index, int32 count, int32 min, int32 max) {
......
...@@ -3613,9 +3613,14 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card * pcard, i ...@@ -3613,9 +3613,14 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card * pcard, i
effect* peffect; effect* peffect;
for(uint8 p = 0; p < 2; ++p) { for(uint8 p = 0; p < 2; ++p) {
for(int32 i = 0; i < 5; ++i) { for(int32 i = 0; i < 5; ++i) {
pduel->restore_assumes();
tuner = player[p].list_mzone[i]; tuner = player[p].list_mzone[i];
if(tuner && tuner->is_position(POS_FACEUP) && (tuner->get_type()&TYPE_TUNER) && pduel->lua->check_matching(tuner, -2, 0) if(tuner && tuner->is_position(POS_FACEUP) && (tuner->get_type()&TYPE_TUNER) && tuner->is_can_be_synchro_material(pcard)) {
&& tuner->is_can_be_synchro_material(pcard)) { effect* pcheck = tuner->is_affected_by_effect(EFFECT_SYNCHRO_CHECK);
if(pcheck)
pcheck->get_value(tuner);
if(!pduel->lua->check_matching(tuner, -2, 0))
continue;
if((peffect = tuner->is_affected_by_effect(EFFECT_SYNCHRO_MATERIAL_CUSTOM, pcard))) { if((peffect = tuner->is_affected_by_effect(EFFECT_SYNCHRO_MATERIAL_CUSTOM, pcard))) {
if(!peffect->target) if(!peffect->target)
continue; continue;
...@@ -3632,8 +3637,11 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card * pcard, i ...@@ -3632,8 +3637,11 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card * pcard, i
for(uint8 np = 0; np < 2; ++np) { for(uint8 np = 0; np < 2; ++np) {
for(int32 j = 0; j < 5; ++j) { for(int32 j = 0; j < 5; ++j) {
pm = player[np].list_mzone[j]; pm = player[np].list_mzone[j];
if(pm && pm != tuner && pm->is_position(POS_FACEUP) && pduel->lua->check_matching(pm, -1, 0) if(pm && pm != tuner && pm->is_position(POS_FACEUP) && pm->is_can_be_synchro_material(pcard, tuner)) {
&& pm->is_can_be_synchro_material(pcard, tuner)) { if(pcheck)
pcheck->get_value(pm);
if(!pduel->lua->check_matching(pm, -1, 0))
continue;
nsyn.push_back(pm); nsyn.push_back(pm);
pm->operation_param = pm->get_synchro_level(pcard); pm->operation_param = pm->get_synchro_level(pcard);
} }
...@@ -3651,6 +3659,7 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card * pcard, i ...@@ -3651,6 +3659,7 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card * pcard, i
} }
} }
} }
pduel->restore_assumes();
if(core.select_cards.size() == 0) if(core.select_cards.size() == 0)
return TRUE; return TRUE;
pduel->write_buffer8(MSG_HINT); pduel->write_buffer8(MSG_HINT);
...@@ -3662,6 +3671,7 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card * pcard, i ...@@ -3662,6 +3671,7 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card * pcard, i
} }
case 1: { case 1: {
card* tuner = core.select_cards[returns.bvalue[1]]; card* tuner = core.select_cards[returns.bvalue[1]];
effect* pcheck = tuner->is_affected_by_effect(EFFECT_SYNCHRO_CHECK);
core.units.begin()->ptarget = (group*)tuner; core.units.begin()->ptarget = (group*)tuner;
effect* peffect; effect* peffect;
if((peffect = tuner->is_affected_by_effect(EFFECT_SYNCHRO_MATERIAL_CUSTOM, pcard))) { if((peffect = tuner->is_affected_by_effect(EFFECT_SYNCHRO_MATERIAL_CUSTOM, pcard))) {
...@@ -3679,8 +3689,11 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card * pcard, i ...@@ -3679,8 +3689,11 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card * pcard, i
for(uint8 np = 0; np < 2; ++np) { for(uint8 np = 0; np < 2; ++np) {
for(int32 i = 0; i < 5; ++i) { for(int32 i = 0; i < 5; ++i) {
card* pm = player[np].list_mzone[i]; card* pm = player[np].list_mzone[i];
if(pm && pm != tuner && pm->is_position(POS_FACEUP) && pduel->lua->check_matching(pm, -1, 0) if(pm && pm != tuner && pm->is_position(POS_FACEUP) && pm->is_can_be_synchro_material(pcard, tuner)) {
&& pm->is_can_be_synchro_material(pcard, tuner)) { if(pcheck)
pcheck->get_value(pm);
if(!pduel->lua->check_matching(pm, -1, 0))
continue;
core.select_cards.push_back(pm); core.select_cards.push_back(pm);
pm->operation_param = pm->get_synchro_level(pcard); pm->operation_param = pm->get_synchro_level(pcard);
} }
...@@ -3697,6 +3710,7 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card * pcard, i ...@@ -3697,6 +3710,7 @@ int32 field::select_synchro_material(int16 step, uint8 playerid, card * pcard, i
add_process(PROCESSOR_SELECT_SUM, 0, 0, 0, lv - l1, playerid + (min << 16) + (max << 24)); add_process(PROCESSOR_SELECT_SUM, 0, 0, 0, lv - l1, playerid + (min << 16) + (max << 24));
core.units.begin()->step = 2; core.units.begin()->step = 2;
} }
pduel->restore_assumes();
return FALSE; return FALSE;
} }
case 2: { case 2: {
......
--ジェノミックス・ファイター --test
function c42155488.initial_effect(c)
--summon with no tribute
local e1=Effect.CreateEffect(c)
e1:SetDescription(aux.Stringid(42155488,0))
e1:SetProperty(EFFECT_FLAG_CANNOT_DISABLE+EFFECT_FLAG_UNCOPYABLE)
e1:SetType(EFFECT_TYPE_SINGLE)
e1:SetCode(EFFECT_SUMMON_PROC)
e1:SetCondition(c42155488.ntcon)
e1:SetOperation(c42155488.ntop)
c:RegisterEffect(e1)
--declear
local e2=Effect.CreateEffect(c)
e2:SetDescription(aux.Stringid(42155488,1))
e2:SetType(EFFECT_TYPE_IGNITION)
e2:SetRange(LOCATION_MZONE)
e2:SetCountLimit(1)
e2:SetTarget(c42155488.dectg)
e2:SetOperation(c42155488.decop)
c:RegisterEffect(e2)
end
function c42155488.ntcon(e,c)
if c==nil then return true end
return c:GetLevel()>4 and Duel.GetLocationCount(c:GetControler(),LOCATION_MZONE)>0
end
function c42155488.ntop(e,tp,eg,ep,ev,re,r,rp,c)
--change base attack
local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_SINGLE)
e1:SetProperty(EFFECT_FLAG_SINGLE_RANGE)
e1:SetRange(LOCATION_MZONE)
e1:SetReset(RESET_EVENT+0xff0000)
e1:SetCode(EFFECT_SET_BASE_ATTACK)
e1:SetValue(1100)
c:RegisterEffect(e1)
local e2=e1:Clone()
e2:SetCode(EFFECT_CHANGE_LEVEL)
e2:SetValue(3)
c:RegisterEffect(e2)
end
function c42155488.dectg(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return true end
Duel.Hint(HINT_SELECTMSG,tp,563)
local rc=Duel.AnnounceRace(tp,1,0xffffff)
e:SetLabel(rc)
local e1=Effect.CreateEffect(e:GetHandler())
e1:SetType(EFFECT_TYPE_FIELD)
e1:SetCode(EFFECT_CANNOT_SUMMON)
e1:SetProperty(EFFECT_FLAG_PLAYER_TARGET)
e1:SetTargetRange(1,0)
e1:SetTarget(c42155488.sumlimit)
e1:SetReset(RESET_PHASE+PHASE_END)
e1:SetLabel(rc)
Duel.RegisterEffect(e1,tp)
local e2=e1:Clone()
e2:SetCode(EFFECT_CANNOT_SPECIAL_SUMMON)
Duel.RegisterEffect(e2,tp)
end
function c42155488.sumlimit(e,c)
return not c:IsRace(e:GetLabel())
end
function c42155488.decop(e,tp,eg,ep,ev,re,r,rp,chk)
local c=e:GetHandler()
if c:IsRelateToEffect(e) and c:IsFaceup() then
local rc=e:GetLabel()
c:SetHint(CHINT_RACE,rc)
local e1=Effect.CreateEffect(c)
e1:SetProperty(EFFECT_FLAG_CANNOT_DISABLE)
e1:SetType(EFFECT_TYPE_SINGLE)
e1:SetCode(EFFECT_SYNCHRO_CHECK)
e1:SetValue(c42155488.syncheck)
e1:SetReset(RESET_EVENT+0x1fe0000+RESET_PHASE+PHASE_END)
e1:SetLabel(rc)
c:RegisterEffect(e1)
end
end
function c42155488.syncheck(e,c)
c:AssumeProperty(ASSUME_RACE,e:GetLabel())
end
...@@ -440,7 +440,7 @@ EFFECT_REMOVE_BRAINWASHING =295 ...@@ -440,7 +440,7 @@ EFFECT_REMOVE_BRAINWASHING =295
EFFECT_BP_TWICE =296 EFFECT_BP_TWICE =296
EFFECT_UNIQUE_CHECK =297 EFFECT_UNIQUE_CHECK =297
EFFECT_MATCH_KILL =300 EFFECT_MATCH_KILL =300
EFFECT_SYNCHRO_ASSUME =310 EFFECT_SYNCHRO_CHECK =310
EVENT_STARTUP =1000 EVENT_STARTUP =1000
EVENT_FLIP =1001 EVENT_FLIP =1001
......
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