Commit 87f366bb authored by nanahira's avatar nanahira

update 神芸学都アルトメギア

parent ef34a732
...@@ -21,12 +21,39 @@ function s.initial_effect(c) ...@@ -21,12 +21,39 @@ function s.initial_effect(c)
e3:SetCategory(CATEGORY_SEARCH+CATEGORY_TOHAND+CATEGORY_ANNOUNCE) e3:SetCategory(CATEGORY_SEARCH+CATEGORY_TOHAND+CATEGORY_ANNOUNCE)
e3:SetType(EFFECT_TYPE_IGNITION) e3:SetType(EFFECT_TYPE_IGNITION)
e3:SetRange(LOCATION_FZONE) e3:SetRange(LOCATION_FZONE)
e3:SetCode(EVENT_FREE_CHAIN)
e3:SetCost(s.thcost) e3:SetCost(s.thcost)
e3:SetTarget(s.thtg) e3:SetTarget(s.thtg)
e3:SetOperation(s.thop) e3:SetOperation(s.thop)
c:RegisterEffect(e3) c:RegisterEffect(e3)
--global resetter
if not s.global_check then
s.global_check=true
s.announced={}
s.announced_set={}
s.clearop()
local ge1=Effect.CreateEffect(c)
ge1:SetType(EFFECT_TYPE_FIELD+EFFECT_TYPE_CONTINUOUS)
ge1:SetCode(EVENT_PHASE_START+PHASE_DRAW)
ge1:SetOperation(s.clearop)
Duel.RegisterEffect(ge1,0)
end
end
-- workaround for Engraver
local ARTMEGIA_COUNT=4
function s.AddToAnnounced(tp,code)
table.insert(s.announced[tp],code)
s.announced_set[tp][code]=true
end
function s.clearop()
s.announced[0]={}
s.announced[1]={}
s.announced_set[0]={}
s.announced_set[1]={}
end end
function s.costfilter(c) function s.costfilter(c)
return c:IsType(TYPE_SPELL+TYPE_TRAP) and c:IsDiscardable() return c:IsType(TYPE_SPELL+TYPE_TRAP) and c:IsDiscardable()
end end
...@@ -35,27 +62,58 @@ function s.thcost(e,tp,eg,ep,ev,re,r,rp,chk) ...@@ -35,27 +62,58 @@ function s.thcost(e,tp,eg,ep,ev,re,r,rp,chk)
Duel.DiscardHand(tp,s.costfilter,1,1,REASON_COST+REASON_DISCARD,nil) Duel.DiscardHand(tp,s.costfilter,1,1,REASON_COST+REASON_DISCARD,nil)
end end
function s.anfilter(c,tp) function s.anfilter(c,tp)
return c:IsSetCard(0x1cd) and c:IsType(TYPE_MONSTER) and c:IsAbleToHand() return c:IsSetCard(0x2cd) and c:IsType(TYPE_MONSTER) and c:IsAbleToHand()
and not Duel.IsExistingMatchingCard(Card.IsCode,tp,LOCATION_MZONE,0,1,nil,c:GetCode()) and not s.announced_set[tp][c:GetCode()]
and not c:IsHasEffect(id,tp)
end end
function s.thfilter(c,code) function s.thfilter(c,code)
return c:IsSetCard(0x1cd) and c:IsType(TYPE_MONSTER) and c:IsAbleToHand() return c:IsSetCard(0x2cd) and c:IsType(TYPE_MONSTER) and c:IsAbleToHand()
and c:IsCode(code) and c:IsCode(code)
end end
function s.thtg(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.IsExistingMatchingCard(s.anfilter,tp,LOCATION_DECK,0,1,nil,tp) end function s.CreateCodeList(g,list,exg,exlist)
local g=Duel.GetMatchingGroup(s.anfilter,tp,LOCATION_DECK,0,nil,tp)
local ag=Group.CreateGroup()
local codes={} local codes={}
for c in aux.Next(g) do local existing={}
local code=c:GetCode() -- exclude group
if not ag:IsExists(Card.IsCode,1,nil,code) then if exg then
ag:AddCard(c) for c in aux.Next(exg) do
table.insert(codes,code) local code=c:GetCode()
existing[code]=true
end
end
-- exclude list
if exlist then
for _,code in ipairs(exlist) do
existing[code]=true
end
end
-- add group
if g then
for c in aux.Next(g) do
local code=c:GetCode()
if not existing[code] then
existing[code]=true
table.insert(codes,code)
end
end
end
-- add list
if list then
for _,code in ipairs(list) do
if not existing[code] then
existing[code]=true
table.insert(codes,code)
end
end end
end end
table.sort(codes) table.sort(codes)
return codes
end
function s.thtg(e,tp,eg,ep,ev,re,r,rp,chk)
local g=Duel.GetMatchingGroup(s.anfilter,tp,LOCATION_DECK,0,nil,tp)
local exg=Duel.GetMatchingGroup(Card.IsFaceup,tp,LOCATION_MZONE,0,nil)
local codes=s.CreateCodeList(g,nil,exg,nil)
if chk==0 then return #codes>0 end
local afilter={codes[1],OPCODE_ISCODE} local afilter={codes[1],OPCODE_ISCODE}
if #codes>1 then if #codes>1 then
--or ... or c:IsCode(codes[i]) --or ... or c:IsCode(codes[i])
...@@ -65,41 +123,13 @@ function s.thtg(e,tp,eg,ep,ev,re,r,rp,chk) ...@@ -65,41 +123,13 @@ function s.thtg(e,tp,eg,ep,ev,re,r,rp,chk)
table.insert(afilter,OPCODE_OR) table.insert(afilter,OPCODE_OR)
end end
end end
ag:Clear()
local ncodes={}
local exg=Duel.GetMatchingGroup(aux.AND(Card.IsFaceup,Card.IsSetCard),tp,LOCATION_MZONE,0,nil,0x1cd)
for c in aux.Next(exg) do
local code=c:GetCode()
if not ag:IsExists(Card.IsCode,1,nil,code) then
ag:AddCard(c)
table.insert(ncodes,code)
end
end
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_CODE) Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_CODE)
local ac=Duel.AnnounceCard(tp,table.unpack(afilter)) local ac=Duel.AnnounceCard(tp,table.unpack(afilter))
local af={ s.AddToAnnounced(tp,ac)
TYPE_FUSION+TYPE_SYNCHRO+TYPE_XYZ+TYPE_LINK,OPCODE_ISTYPE,OPCODE_NOT,
0x1cd,OPCODE_ISSETCARD,OPCODE_AND,
TYPE_MONSTER,OPCODE_ISTYPE,OPCODE_AND
}
for i=1,#ncodes do
table.insert(af,ncodes[i])
table.insert(af,OPCODE_ISCODE)
table.insert(af,OPCODE_NOT)
table.insert(af,OPCODE_AND)
end
getmetatable(e:GetHandler()).announce_filter=af
Duel.SetTargetParam(ac) Duel.SetTargetParam(ac)
getmetatable(e:GetHandler()).announce_filter=s.announce_filter_func
Duel.SetOperationInfo(0,CATEGORY_ANNOUNCE,nil,0,tp,0) Duel.SetOperationInfo(0,CATEGORY_ANNOUNCE,nil,0,tp,0)
Duel.SetOperationInfo(0,CATEGORY_TOHAND,nil,1,tp,LOCATION_DECK) Duel.SetOperationInfo(0,CATEGORY_TOHAND,nil,1,tp,LOCATION_DECK)
local e0=Effect.CreateEffect(e:GetHandler())
e0:SetType(EFFECT_TYPE_FIELD)
e0:SetCode(id)
e0:SetTargetRange(1,0)
e0:SetTarget(s.thlimit)
e0:SetLabel(ac)
e0:SetReset(RESET_PHASE+PHASE_END)
Duel.RegisterEffect(e0,tp)
end end
function s.thlimit(e,c,tp,re) function s.thlimit(e,c,tp,re)
return c:IsCode(e:GetLabel()) return c:IsCode(e:GetLabel())
...@@ -122,5 +152,25 @@ function s.thop(e,tp,eg,ep,ev,re,r,rp) ...@@ -122,5 +152,25 @@ function s.thop(e,tp,eg,ep,ev,re,r,rp)
Duel.RegisterEffect(e1,tp) Duel.RegisterEffect(e1,tp)
end end
function s.splimit(e,c) function s.splimit(e,c)
return not (c:IsSetCard(0x1cd) or c:IsCode(97556336)) and not c:IsLocation(LOCATION_EXTRA) return not (c:IsSetCard(0x2cd) or c:IsCode(101301008)) and not c:IsLocation(LOCATION_EXTRA)
end
function s.announce_filter_func(e,tp,ev)
local exg=Duel.GetMatchingGroup(aux.AND(Card.IsFaceup,Card.IsSetCard),tp,LOCATION_MZONE,0,nil,0x2cd)
local ncodes=s.CreateCodeList(exg,s.announced[tp],nil,nil)
if #ncodes>=ARTMEGIA_COUNT then
return false
end
local af={
TYPE_FUSION+TYPE_SYNCHRO+TYPE_XYZ+TYPE_LINK,OPCODE_ISTYPE,OPCODE_NOT,
0x2cd,OPCODE_ISSETCARD,OPCODE_AND,
TYPE_MONSTER,OPCODE_ISTYPE,OPCODE_AND
}
for i=1,#ncodes do
table.insert(af,ncodes[i])
table.insert(af,OPCODE_ISCODE)
table.insert(af,OPCODE_NOT)
table.insert(af,OPCODE_AND)
end
return af
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