GodのGod 发表于 2015-5-3 20:48

有会做“剧变”这张牌的么?

最近等不上community wad的更新,自己尝试做了几张牌,但在“剧变”上感到头大了。http://magiccards.info/scans/en/v14/3.jpg
我试图参照面纱的娜娜,平衡这两张牌,他们的牺牲分别是:
http://magiccards.info/scans/en/isd/105.jpg                <AVAILABILITY>
                        return PLW_MyPlayerDC( EffectController() ):Get_Int(PLW_TEFERI_ARCHMAGE_EMBLEM) == 1 or EffectController():IsSorceryTime() == true
                </AVAILABILITY>
                <COST type="RemoveCountersSelf" amount="6" counter_type="Loyalty" />
                <TARGET tag="CARD_QUERY_CHOOSE_PLAYER_TO_VESTIGE_ROT" definition="0" compartment="0" count="1" />
                <TARGET_DEFINITION id="0">
                        local filter = ClearFilter()
                        filter:SetFilterType(FILTER_TYPE_PLAYERS)
                </TARGET_DEFINITION>
                <RESOLUTION_TIME_ACTION>
                        local target_player = EffectDC():Get_Targets(0):Get_PlayerPtr(0)
                        if target_player ~= nil then
                                local filter = ClearFilter()
                                filter:Add(FE_CONTROLLER, OP_IS, target_player)
                                PLW_FilterPermanents(filter)
                                local count = filter:Count()
                                if count &gt; 0 then
                                        local answerDC = EffectDC():Make_Targets(1)
                                        local controller = EffectController()
                                        if controller:IsAI() then
                                                -- The idea is: make a pile with roughly half of the total score of the permanents
                                                filter:EvaluateObjects()
                                                local permanents_array = {}
                                                local scores_array = {}
                                                local total_score = 0
                                                for i=0,count-1 do
                                                        permanents_array = filter:GetNthEvaluatedObject(i)
                                                        scores_array = permanents_array:CalcScore()
                                                        total_score = total_score + scores_array
                                                end
                                                local half_total_score = total_score / 2
                                                local temp_score = 0
                                                for i=0,count-1 do
                                                        answerDC:Set_CardPtr(i, permanents_array)
                                                        temp_score = temp_score + scores_array
                                                        if temp_score &gt;= half_total_score then
                                                                break
                                                        end
                                                end
                                        else
                                                controller:SetItemCount(count)
                                                for i=0,count-1 do
                                                        controller:SetItemPrompt(i, "PLW_CARD_QUERY_CHOOSE_CARD_TO_PILE")
                                                end
                                                controller:ChooseItems(answerDC, QUERY_FLAG_UP_TO)
                                        end
                                end
                        end
                </RESOLUTION_TIME_ACTION>
                <RESOLUTION_TIME_ACTION>
                        local target_player = EffectDC():Get_Targets(0):Get_PlayerPtr(0)
                        if target_player ~= nil then
                                local answerDC = EffectDC():Get_Targets(1)
                                local answer_count = answerDC:Count()
                                local pilesDC = EffectDC():Make_Chest(2)
                                local filter = ClearFilter()
                                filter:Add(FE_CONTROLLER, OP_IS, target_player)
                                PLW_FilterPermanents(filter)
                                local filter_count = filter:EvaluateObjects()
                                if filter_count &gt; 0 then
                                        for i=0,answer_count-1 do
                                                pilesDC:Set_CardPtr( i, answerDC:Get_CardPtr(i) )
                                        end
                                        local index = answer_count
                                        for i=0,filter_count-1 do
                                                local permanent = filter:GetNthEvaluatedObject(i)
                                                local already_there = false
                                                for j=0,answer_count-1 do
                                                        if permanent == answerDC:Get_CardPtr(j) then
                                                                already_there = true
                                                                break
                                                        end
                                                end
                                                if already_there == false then
                                                        pilesDC:Set_CardPtr(index, permanent)
                                                        pilesDC:QueryUnselect_CardPtr(index)
                                                        index = index + 1
                                                end
                                        end
                                        target_player:ChooseItemFromDC( "PLW_CARD_QUERY_SELECT_PILE_TO_SACRIFICE", pilesDC, EffectDC():Make_Targets(3), QUERY_FLAG_MAY )
                                end
                        end
                </RESOLUTION_TIME_ACTION>
                <RESOLUTION_TIME_ACTION>
                        local target_player = EffectDC():Get_Targets(0):Get_PlayerPtr(0)
                        if target_player ~= nil then
                                local answerDC = EffectDC():Get_Targets(1)
                                local answer_count = answerDC:Count()
                                local pilesDC = EffectDC():Get_Chest(2)
                                local lower_bound = answer_count
                                local upper_bound = pilesDC:Count()-1
                                local decision = EffectDC():Get_Targets(3) and EffectDC():Get_Targets(3):Get_CardPtr(0)
                                if decision ~= nil then
                                        -- I chose the selected pile, so I need to sacrifice those permanents
                                        lower_bound = 0
                                        upper_bound = answer_count-1
                                end
                                for i=lower_bound,upper_bound do
                                        local permanent = pilesDC:Get_CardPtr(i)
                                        if permanent ~= nil then
                                                target_player:Sacrifice(permanent)
                                        end
                                end
                        end
                </RESOLUTION_TIME_ACTION>http://magiccards.info/scans/en/vma/14.jpg                <RESOLUTION_TIME_ACTION>
                        local minHands = EffectController():Hand_Count()
                        local minLands = S_CountTypeInZoneOfPlayer(CARD_TYPE_LAND, ZONE_BATTLEFIELD, EffectController())
                        local minCreatures = S_CountTypeInZoneOfPlayer(CARD_TYPE_CREATURE, ZONE_BATTLEFIELD, EffectController())
                        for i=0,(MTG():GetNumberOfPlayers()-1) do
                                local player = MTG():GetNthPlayer(i)
                                if player ~= nil then
                                        local numHands = player:Hand_Count()
                                        local numLands = S_CountTypeInZoneOfPlayer(CARD_TYPE_LAND, ZONE_BATTLEFIELD, player)
                                        local numCreatures = S_CountTypeInZoneOfPlayer(CARD_TYPE_CREATURE, ZONE_BATTLEFIELD, player)
                                        if numHands &lt; minHands then
                                                minHands = numHands
                                        end
                                        if numLands &lt; minLands then
                                                minLands = numLands
                                        end
                                        if numCreatures &lt; minCreatures then
                                                minCreatures = numCreatures
                                        end
                                end
                        end
                        EffectDC():Set_Int(0, minLands)
                        EffectDC():Set_Int(5, minCreatures)
                        EffectDC():Set_Int(10, minHands)
                </RESOLUTION_TIME_ACTION>
                <RESOLUTION_TIME_ACTION repeating="1">
                        local n = MTG():GetActionRepCount()
                        local num_Players = MTG():GetNumberOfPlayers()
                        if (n &lt; num_Players) then
                                local player = MTG():GetNthPlayer(n)
                                local filter = ClearFilter()
                                filter:Add(FE_CONTROLLER, OP_IS, player)
                                filter:Add(FE_TYPE, OP_IS, CARD_TYPE_LAND)
                                local numItemsToSacrifice = filter:Count() - EffectDC():Get_Int(0)
                                player:SetItemCount( numItemsToSacrifice )
                                for i = 0, (numItemsToSacrifice-1) do
                                        player:SetItemPrompt( i, "CARD_QUERY_CHOOSE_LAND_TO_SACRIFICE" )
                                end
                                player:ChooseItems( EffectDC():Make_Targets(n+1) )
                                return true
                        else
                                for i = 0, (num_Players-1) do
                                        local player = MTG():GetNthPlayer(i)
                                        local targetDC = EffectDC():Get_Targets(i+1)
                                        if targetDC ~= nilthen
                                                local numSacrifices = targetDC:Count()
                                                for j = 0, (numSacrifices-1) do
                                                        local cardToSacrifice = targetDC:Get_CardPtr(j)
                                                        player:Sacrifice( cardToSacrifice )
                                                end
                                        end
                                end
                                return false
                        end
                </RESOLUTION_TIME_ACTION>
                <RESOLUTION_TIME_ACTION repeating="1">
                        local n = MTG():GetActionRepCount()
                        local num_Players = MTG():GetNumberOfPlayers()
                        if (n &lt; num_Players) then
                                local player = MTG():GetNthPlayer(n)
                                local filter = ClearFilter()
                                filter:Add(FE_CONTROLLER, OP_IS, player)
                                filter:Add(FE_TYPE, OP_IS, CARD_TYPE_CREATURE)
                                local numItemsToSacrifice = filter:Count() - EffectDC():Get_Int(5)
                                player:SetItemCount( numItemsToSacrifice )
                                for i = 0, (numItemsToSacrifice-1) do
                                        player:SetItemPrompt( i, "CARD_QUERY_CHOOSE_CREATURE_TO_SACRIFICE" )
                                end
                                player:ChooseItems( EffectDC():Make_Targets(n+6) )
                                return true
                        else
                                for i = 0, (num_Players-1) do
                                        local player = MTG():GetNthPlayer(i)
                                        local targetDC = EffectDC():Get_Targets(i+6)
                                        if targetDC ~= nilthen
                                                local numSacrifices = targetDC:Count()
                                                for j = 0, (numSacrifices-1) do
                                                        local cardToSacrifice = targetDC:Get_CardPtr(j)
                                                        player:Sacrifice( cardToSacrifice )
                                                end
                                        end
                                end
                                return false
                        end
                </RESOLUTION_TIME_ACTION>
                <RESOLUTION_TIME_ACTION repeating="1">
                        local n = MTG():GetActionRepCount()
                        local num_Players = MTG():GetNumberOfPlayers()
                        if (n &lt; num_Players) then
                                local player = MTG():GetNthPlayer(n)
                                local filter = ClearFilter()
                                filter:SetZone(ZONE_HAND, player)
                                local numItemsToDiscard = filter:Count() - EffectDC():Get_Int(10)
                                player:SetItemCount( numItemsToDiscard )
                                for i = 0, (numItemsToDiscard-1) do
                                        player:SetItemPrompt( i, "CARD_QUERY_CHOOSE_CARD_TO_DISCARD" )
                                end
                                player:ChooseItems( EffectDC():Make_Targets(n+11) )
                                return true
                        else
                                for i = 0, (num_Players-1) do
                                        local player = MTG():GetNthPlayer(i)
                                        local targetDC = EffectDC():Get_Targets(i+11)
                                        if targetDC ~= nilthen
                                                local numDiscard = targetDC:Count()
                                                for j = 0, (numDiscard-1) do
                                                        local cardToDiscard = targetDC:Get_CardPtr(j)
                                                        cardToDiscard:Discard()
                                                end
                                        end
                                end
                                return false
                        end
                </RESOLUTION_TIME_ACTION>但这两个和剧变都有点不同,娜娜的没选类别,平衡牌太复杂了看不懂。。。,个人想法是:每个玩家选神器,结界。。。,然后选择的有卡牌保护,然后一起牺牲掉无卡牌保护的的,但选择的提示,过滤,又不知道怎么做了。。。卡牌保护函数Get_CardPtr()也看不明白怎么运作的。有大神提供建议或给些参考卡牌么

tkz196 发表于 2015-6-8 09:21

顶一个!

nataraja 发表于 2015-6-8 21:53

頂!大大會了以後能發個教學嗎?

sumomole 发表于 2015-6-16 13:37

娜娜就算了,它和平衡一样,而且更简单
1~25行的RESOLUTION_TIME_ACTION是计算应该保留的数量,这里都是1可以删除
86~114行的RESOLUTION_TIME_ACTION是弃牌用不到也可以删除
中间两个RESOLUTION_TIME_ACTION是生物和地,一样的原理就随便拿一个来看:
26~32行照抄
33行指出了类别,根据四种不同的类别需要来填写
34行计算应该牺牲的数量,这样做的原因是AI不懂什么是保留,所以我们只能告诉他应该牺牲多少,他就会从最没用的开始一个一个选来丢掉,前半段都不用变,最后的EffectDC():Get_Int(0)改为1就可以
35~36行照抄
37行的“CARD_QUERY_CHOOSE_LAND_TO_SACRIFICE”是一句显示在屏幕上的提示,根据四种不同的类别需要来填写
38~55行照抄
重复四次

GodのGod 发表于 2015-6-16 23:01

sumomole 发表于 2015-6-16 13:37 static/image/common/back.gif
娜娜就算了,它和平衡一样,而且更简单
1~25行的RESOLUTION_TIME_ACTION是计算应该保留的数量,这里都是1 ...

谢谢大大,之前对函数什么的也不大了解,现在大致能看懂了,我试的做一下:)
页: [1]
查看完整版本: 有会做“剧变”这张牌的么?