Commit 482fd825 authored by Argon's avatar Argon

capella

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