Commit 482fd825 authored by Argon's avatar Argon

capella

parent 4f327baa
...@@ -585,7 +585,7 @@ uint32 card::get_ritual_level(card* pcard) { ...@@ -585,7 +585,7 @@ uint32 card::get_ritual_level(card* pcard) {
lev = get_level(); lev = get_level();
return lev; return lev;
} }
uint32 card::is_xyz_level(card* pcard, uint32 lv) { uint32 card::check_xyz_level(card* pcard, uint32 lv) {
if((data.type & TYPE_XYZ) || (status & STATUS_NO_LEVEL)) if((data.type & TYPE_XYZ) || (status & STATUS_NO_LEVEL))
return FALSE; return FALSE;
uint32 lev; uint32 lev;
...@@ -597,7 +597,11 @@ uint32 card::is_xyz_level(card* pcard, uint32 lv) { ...@@ -597,7 +597,11 @@ uint32 card::is_xyz_level(card* pcard, uint32 lv) {
lev = eset[0]->get_value(2); lev = eset[0]->get_value(2);
} else } else
lev = get_level(); lev = get_level();
return ((lev & 0xfff) == lv) || (((lev >> 16) & 0xfff) == lv); if(((lev & 0xfff) == lv))
return lev & 0xffff;
if(((lev >> 16) & 0xfff) == lv)
return (lev >> 16) & 0xffff;
return 0;
} }
uint32 card::get_attribute() { uint32 card::get_attribute() {
if(assume_type == ASSUME_ATTRIBUTE) if(assume_type == ASSUME_ATTRIBUTE)
......
...@@ -149,7 +149,7 @@ public: ...@@ -149,7 +149,7 @@ public:
uint32 get_rank(); uint32 get_rank();
uint32 get_synchro_level(card* pcard); uint32 get_synchro_level(card* pcard);
uint32 get_ritual_level(card* pcard); uint32 get_ritual_level(card* pcard);
uint32 is_xyz_level(card* pcard, uint32 lv); uint32 check_xyz_level(card* pcard, uint32 lv);
uint32 get_attribute(); uint32 get_attribute();
uint32 get_race(); uint32 get_race();
uint32 get_lscale(); uint32 get_lscale();
......
...@@ -345,7 +345,6 @@ public: ...@@ -345,7 +345,6 @@ public:
#define EFFECT_NONTUNER 244 #define EFFECT_NONTUNER 244
#define EFFECT_OVERLAY_REMOVE_REPLACE 245 #define EFFECT_OVERLAY_REMOVE_REPLACE 245
#define EFFECT_SCRAP_CHIMERA 246 #define EFFECT_SCRAP_CHIMERA 246
#define EFFECT_XMAT_COUNT_LIMIT 247
#define EFFECT_SPSUM_EFFECT_ACTIVATED 250 #define EFFECT_SPSUM_EFFECT_ACTIVATED 250
#define EFFECT_MATERIAL_CHECK 251 #define EFFECT_MATERIAL_CHECK 251
#define EFFECT_DISABLE_FIELD 260 #define EFFECT_DISABLE_FIELD 260
......
...@@ -1283,34 +1283,23 @@ void field::get_xyz_material(card* scard, int32 findex, uint32 lv, int32 maxc) { ...@@ -1283,34 +1283,23 @@ void field::get_xyz_material(card* scard, int32 findex, uint32 lv, int32 maxc) {
card* pcard = 0; card* pcard = 0;
int32 playerid = scard->current.controler; int32 playerid = scard->current.controler;
core.xmaterial_lst.clear(); core.xmaterial_lst.clear();
card_vector cv; uint32 xyz_level;
for(int i = 0; i < 5; ++i) { for(int i = 0; i < 5; ++i) {
pcard = player[playerid].list_mzone[i]; pcard = player[playerid].list_mzone[i];
if(pcard && pcard->is_position(POS_FACEUP) && pcard->is_can_be_xyz_material(scard) && pcard->is_xyz_level(scard, lv) if(pcard && pcard->is_position(POS_FACEUP) && pcard->is_can_be_xyz_material(scard) && (xyz_level = pcard->check_xyz_level(scard, lv))
&& (findex == 0 || pduel->lua->check_matching(pcard, findex, 0))) && (findex == 0 || pduel->lua->check_matching(pcard, findex, 0)))
cv.push_back(pcard); core.xmaterial_lst.insert(std::make_pair((xyz_level >> 12) & 0xf, pcard));
} }
for(int i = 0; i < 5; ++i) { for(int i = 0; i < 5; ++i) {
pcard = player[1 - playerid].list_mzone[i]; pcard = player[1 - playerid].list_mzone[i];
if(pcard && pcard->is_position(POS_FACEUP) && pcard->is_can_be_xyz_material(scard) && pcard->is_xyz_level(scard, lv) if(pcard && pcard->is_position(POS_FACEUP) && pcard->is_can_be_xyz_material(scard) && (xyz_level = pcard->check_xyz_level(scard, lv))
&& pcard->is_affected_by_effect(EFFECT_XYZ_MATERIAL) && (findex == 0 || pduel->lua->check_matching(pcard, findex, 0))) && pcard->is_affected_by_effect(EFFECT_XYZ_MATERIAL) && (findex == 0 || pduel->lua->check_matching(pcard, findex, 0)))
cv.push_back(pcard); core.xmaterial_lst.insert(std::make_pair((xyz_level >> 12) & 0xf, pcard));
} }
if(core.global_flag & GLOBALFLAG_XMAT_COUNT_LIMIT) { if(core.global_flag & GLOBALFLAG_XMAT_COUNT_LIMIT) {
for(auto cit = cv.begin(); cit != cv.end(); ++cit) {
effect* peffect = (*cit)->is_affected_by_effect(EFFECT_XMAT_COUNT_LIMIT);
if(peffect) {
int32 v = peffect->get_value();
core.xmaterial_lst.insert(std::make_pair(v, *cit));
} else
core.xmaterial_lst.insert(std::make_pair(0, *cit));
}
auto iter = core.xmaterial_lst.begin(); auto iter = core.xmaterial_lst.begin();
while((iter != core.xmaterial_lst.end()) && ((iter->first > core.xmaterial_lst.size()) || (iter->first > maxc))) while((iter != core.xmaterial_lst.end()) && ((iter->first > core.xmaterial_lst.size()) || (iter->first > maxc)))
core.xmaterial_lst.erase(iter++); core.xmaterial_lst.erase(iter++);
} else {
for(auto cit = cv.begin(); cit != cv.end(); ++cit)
core.xmaterial_lst.insert(std::make_pair(0, *cit));
} }
} }
void field::get_overlay_group(uint8 self, uint8 s, uint8 o, card_set* pset) { void field::get_overlay_group(uint8 self, uint8 s, uint8 o, card_set* pset) {
...@@ -1714,31 +1703,19 @@ int32 field::check_with_sum_limit(card_vector* mats, int32 acc, int32 index, int ...@@ -1714,31 +1703,19 @@ int32 field::check_with_sum_limit(card_vector* mats, int32 acc, int32 index, int
} }
int32 field::check_xyz_material(card* scard, int32 findex, int32 lv, int32 min, int32 max, group* mg) { int32 field::check_xyz_material(card* scard, int32 findex, int32 lv, int32 min, int32 max, group* mg) {
if(mg) { if(mg) {
card_vector cv; uint32 xyz_level;
core.xmaterial_lst.clear(); core.xmaterial_lst.clear();
for (auto cit : mg->container) { for (auto cit : mg->container) {
if(cit->is_xyz_level(scard, lv) && (findex == 0 || pduel->lua->check_matching(cit, findex, 0))) if((xyz_level = cit->check_xyz_level(scard, lv)) && (findex == 0 || pduel->lua->check_matching(cit, findex, 0)))
cv.push_back(cit); core.xmaterial_lst.insert(std::make_pair((xyz_level >> 12) & 0xf, cit));
} }
if(core.global_flag & GLOBALFLAG_XMAT_COUNT_LIMIT) { if(core.global_flag & GLOBALFLAG_XMAT_COUNT_LIMIT) {
for(auto cit : cv) {
effect* peffect = cit->is_affected_by_effect(EFFECT_XMAT_COUNT_LIMIT);
if(peffect) {
int32 v = peffect->get_value();
core.xmaterial_lst.insert(std::make_pair(v, cit));
} else
core.xmaterial_lst.insert(std::make_pair(0, cit));
}
auto iter = core.xmaterial_lst.begin(); auto iter = core.xmaterial_lst.begin();
while((iter != core.xmaterial_lst.end()) && ((iter->first > core.xmaterial_lst.size()) || (iter->first > max))) while((iter != core.xmaterial_lst.end()) && ((iter->first > core.xmaterial_lst.size()) || (iter->first > max)))
core.xmaterial_lst.erase(iter++); core.xmaterial_lst.erase(iter++);
} else {
for(auto cit : cv)
core.xmaterial_lst.insert(std::make_pair(0, cit));
} }
} else { } else
get_xyz_material(scard, findex, lv, max); get_xyz_material(scard, findex, lv, max);
}
return core.xmaterial_lst.size() >= min; return core.xmaterial_lst.size() >= min;
} }
int32 field::is_player_can_draw(uint8 playerid) { int32 field::is_player_can_draw(uint8 playerid) {
......
...@@ -568,6 +568,7 @@ public: ...@@ -568,6 +568,7 @@ public:
#define GLOBALFLAG_MUST_BE_SMATERIAL 0x20 #define GLOBALFLAG_MUST_BE_SMATERIAL 0x20
#define GLOBALFLAG_SPSUMMON_COUNT 0x40 #define GLOBALFLAG_SPSUMMON_COUNT 0x40
#define GLOBALFLAG_XMAT_COUNT_LIMIT 0x80 #define GLOBALFLAG_XMAT_COUNT_LIMIT 0x80
#define GLOBALFLAG_SELF_TOGRAVE 0x100
// //
#define PROCESSOR_NONE 0 #define PROCESSOR_NONE 0
#define PROCESSOR_WAITING 0x10000 #define PROCESSOR_WAITING 0x10000
......
...@@ -118,7 +118,7 @@ int32 scriptlib::card_is_xyz_level(lua_State *L) { ...@@ -118,7 +118,7 @@ int32 scriptlib::card_is_xyz_level(lua_State *L) {
card* pcard = *(card**) lua_touserdata(L, 1); card* pcard = *(card**) lua_touserdata(L, 1);
card* xyzcard = *(card**) lua_touserdata(L, 2); card* xyzcard = *(card**) lua_touserdata(L, 2);
uint32 lv = lua_tointeger(L, 3); uint32 lv = lua_tointeger(L, 3);
lua_pushboolean(L, pcard->is_xyz_level(xyzcard, lv)); lua_pushboolean(L, pcard->check_xyz_level(xyzcard, lv));
return 1; return 1;
} }
int32 scriptlib::card_get_lscale(lua_State *L) { int32 scriptlib::card_get_lscale(lua_State *L) {
......
...@@ -5086,6 +5086,10 @@ int32 field::adjust_step(uint16 step) { ...@@ -5086,6 +5086,10 @@ int32 field::adjust_step(uint16 step) {
if(returns.ivalue[0] > 0) if(returns.ivalue[0] > 0)
core.re_adjust = TRUE; core.re_adjust = TRUE;
//self tograve //self tograve
if(!(core.global_flag & GLOBALFLAG_SELF_TOGRAVE)) {
returns.ivalue[0] = 0;
return FALSE;
}
uint8 tp = infos.turn_player; uint8 tp = infos.turn_player;
effect* peffect; effect* peffect;
card_set tograve_set; card_set tograve_set;
......
--機殻の再星 --機殻の再星
function c20426907.initial_effect(c) function c20426907.initial_effect(c)
Duel.EnableGlobalFlag(GLOBALFLAG_SELF_TOGRAVE)
--Activate --Activate
local e1=Effect.CreateEffect(c) local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_ACTIVATE) e1:SetType(EFFECT_TYPE_ACTIVATE)
......
...@@ -16,7 +16,7 @@ function c24610207.initial_effect(c) ...@@ -16,7 +16,7 @@ function c24610207.initial_effect(c)
e2:SetOperation(c24610207.efop) e2:SetOperation(c24610207.efop)
c:RegisterEffect(e2) c:RegisterEffect(e2)
end end
function c24610207.xyzlv(e,c) function c24610207.xyzlv(e,c,rc)
return 0x50000+e:GetHandler():GetLevel() return 0x50000+e:GetHandler():GetLevel()
end end
function c24610207.efcon(e,tp,eg,ep,ev,re,r,rp) function c24610207.efcon(e,tp,eg,ep,ev,re,r,rp)
......
...@@ -16,7 +16,7 @@ function c35629124.initial_effect(c) ...@@ -16,7 +16,7 @@ function c35629124.initial_effect(c)
Duel.AddCustomActivityCounter(35629124,ACTIVITY_SPSUMMON,c35629124.counterfilter) Duel.AddCustomActivityCounter(35629124,ACTIVITY_SPSUMMON,c35629124.counterfilter)
end end
function c35629124.counterfilter(c) function c35629124.counterfilter(c)
return c:IsRace(0xffffff-RACE_DRAGON) return c:IsRace(RACE_DRAGON)
end end
function c35629124.spcon(e,tp,eg,ep,ev,re,r,rp) function c35629124.spcon(e,tp,eg,ep,ev,re,r,rp)
return not e:GetHandler():IsReason(REASON_RETURN) return not e:GetHandler():IsReason(REASON_RETURN)
......
--星因士 カペラ --星因士 カペラ
function c86466163.initial_effect(c) function c86466163.initial_effect(c)
Duel.EnableGlobalFlag(GLOBALFLAG_XMAT_COUNT_LIMIT)
--xyzlv --xyzlv
local e1=Effect.CreateEffect(c) local e1=Effect.CreateEffect(c)
e1:SetDescription(aux.Stringid(86466163,0)) e1:SetDescription(aux.Stringid(86466163,0))
...@@ -22,13 +23,14 @@ function c86466163.operation(e,tp,eg,ep,ev,re,r,rp) ...@@ -22,13 +23,14 @@ function c86466163.operation(e,tp,eg,ep,ev,re,r,rp)
e1:SetCode(EFFECT_XYZ_LEVEL) e1:SetCode(EFFECT_XYZ_LEVEL)
e1:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE) e1:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE)
e1:SetTargetRange(LOCATION_MZONE,0) e1:SetTargetRange(LOCATION_MZONE,0)
e1:SetTargeet(c86466163.xyztg)
e1:SetValue(c86466163.xyzlv) e1:SetValue(c86466163.xyzlv)
e1:SetReset(RESET_PHASE+RESET_END) e1:SetReset(RESET_PHASE+RESET_END)
Duel.RegisterEffect(e1,tp) Duel.RegisterEffect(e1,tp)
end end
function c86466163.xyztg(e,c)
return c:IsLevelBelow(4) and c:IsSetCard(0x9c)
end
function c86466163.xyzlv(e,c,rc) function c86466163.xyzlv(e,c,rc)
if c:IsLevelBelow(4) and c:IsSetCard(0x9c) and rc.xyz_count>2 then return 0x30050000+c:GetLevel()
return 0x50000+c:GetLevel()
end
return c:GetLevel()
end end
...@@ -5,8 +5,8 @@ function c91110378.initial_effect(c) ...@@ -5,8 +5,8 @@ function c91110378.initial_effect(c)
local e1=Effect.CreateEffect(c) local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_SINGLE) e1:SetType(EFFECT_TYPE_SINGLE)
e1:SetProperty(EFFECT_FLAG_UNCOPYABLE+EFFECT_FLAG_CANNOT_DISABLE) e1:SetProperty(EFFECT_FLAG_UNCOPYABLE+EFFECT_FLAG_CANNOT_DISABLE)
e1:SetCode(EFFECT_XMAT_COUNT_LIMIT) e1:SetCode(EFFECT_XYZ_LEVEL)
e1:SetValue(3) e1:SetValue(c91110378.xyz_level)
c:RegisterEffect(e1) c:RegisterEffect(e1)
--spsummon --spsummon
local e2=Effect.CreateEffect(c) local e2=Effect.CreateEffect(c)
...@@ -24,6 +24,9 @@ function c91110378.initial_effect(c) ...@@ -24,6 +24,9 @@ function c91110378.initial_effect(c)
e3:SetCode(EVENT_SPSUMMON_SUCCESS) e3:SetCode(EVENT_SPSUMMON_SUCCESS)
c:RegisterEffect(e3) c:RegisterEffect(e3)
end end
function c91110378.xyz_level(e,c,rc)
return 0x3000+c:GetLevel()
end
function c91110378.cfilter(c,tp) function c91110378.cfilter(c,tp)
return c:IsFaceup() and c:IsSetCard(0x86) and c:GetSummonPlayer()==tp return c:IsFaceup() and c:IsSetCard(0x86) and c:GetSummonPlayer()==tp
end end
......
--殻醒する煉獄 --殻醒する煉獄
function c94432298.initial_effect(c) function c94432298.initial_effect(c)
Duel.EnableGlobalFlag(GLOBALFLAG_SELF_TOGRAVE)
--Activate --Activate
local e1=Effect.CreateEffect(c) local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_ACTIVATE) e1:SetType(EFFECT_TYPE_ACTIVATE)
......
...@@ -434,7 +434,6 @@ EFFECT_EXTRA_RITUAL_MATERIAL =243--在墓地当做仪式祭品 ...@@ -434,7 +434,6 @@ EFFECT_EXTRA_RITUAL_MATERIAL =243--在墓地当做仪式祭品
EFFECT_NONTUNER =244--同时当作调整以外的怪兽(幻影王 幽骑) EFFECT_NONTUNER =244--同时当作调整以外的怪兽(幻影王 幽骑)
EFFECT_OVERLAY_REMOVE_REPLACE =245--代替去除超量素材 EFFECT_OVERLAY_REMOVE_REPLACE =245--代替去除超量素材
EFFECT_SCRAP_CHIMERA =246--废铁奇美拉 EFFECT_SCRAP_CHIMERA =246--废铁奇美拉
EFFECT_XMAT_COUNT_LIMIT =247--超量素材限制(光天使 天座)
EFFECT_SPSUM_EFFECT_ACTIVATED =250 --发动特殊召唤的效果(冥府的使者 格斯) EFFECT_SPSUM_EFFECT_ACTIVATED =250 --发动特殊召唤的效果(冥府的使者 格斯)
EFFECT_MATERIAL_CHECK =251 --检查素材 EFFECT_MATERIAL_CHECK =251 --检查素材
EFFECT_DISABLE_FIELD =260 --无效区域(扰乱王等) EFFECT_DISABLE_FIELD =260 --无效区域(扰乱王等)
...@@ -653,6 +652,7 @@ GLOBALFLAG_DETACH_EVENT =0x10 --超量素材被取除标记 ...@@ -653,6 +652,7 @@ GLOBALFLAG_DETACH_EVENT =0x10 --超量素材被取除标记
GLOBALFLAG_MUST_BE_SMATERIAL =0x20 --必须作为同调素材(波动龙 声子龙) GLOBALFLAG_MUST_BE_SMATERIAL =0x20 --必须作为同调素材(波动龙 声子龙)
GLOBALFLAG_SPSUMMON_COUNT =0x40 --特殊召唤次数标记 GLOBALFLAG_SPSUMMON_COUNT =0x40 --特殊召唤次数标记
GLOBALFLAG_XMAT_COUNT_LIMIT =0x80 --超量素材数量限制标记(光天使 天座) GLOBALFLAG_XMAT_COUNT_LIMIT =0x80 --超量素材数量限制标记(光天使 天座)
GLOBALFLAG_SELF_TOGRAVE =0x100 --
-- --
EFFECT_COUNT_CODE_OATH =0x10000000 --誓约使用次数 EFFECT_COUNT_CODE_OATH =0x10000000 --誓约使用次数
EFFECT_COUNT_CODE_DUEL =0x20000000 --决斗中使用次数 EFFECT_COUNT_CODE_DUEL =0x20000000 --决斗中使用次数
......
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