跟踪纸牌交易游戏的游戏状态

时间:2013-11-23 01:40:03

标签: lua corona

我正在建立纸牌游戏。让我们说它类似于魔法聚会,炉石等等。

我想弄清楚的问题是如何设计“光环”以及每张卡需要多少损坏。

现在我有一个卡座,我存储卡数据如下。我为已经存在的卡片类型编制了名称。

M.card = {}
-- Minion cards have health and damage
M.card[1].name = "Minion"
M.card[1].hp = 1
M.deck[1].dmg = 1

-- Super Minions have more health and damage
M.card[2].name = "Super Minion"
M.card[2].hp = 4
M.card[2].dmg = 4

-- Spell cards have no health and damage. Instead they affect the health and damage of other cards.
M.card[3].name = "Heal"
M.card[3].details = "This card heals any character for +2 health"
M.card[3].healthboost = 2

M.card[4].name = "Damage Boost"
M.card[4].details = "This card gives + 1 damage to any other card for 1 turn"
M.card[4].dmgboost = 1

-- Super damage boost gives more damage boost to other cards
M.card[5].name = "Super Damage Boost"
M.card[5].details = "This card gives +3 damage to any other card permanently"
M.card[5].dmgboost = 3

因此,当一张卡攻击另一张卡时,我需要跟踪两张卡所造成的伤害。我不想更改每张卡的基本统计数据,因此我需要跟踪调整情况。

我可以做这样的事情

-- Super Minion takes 3 damage
M.card[2].newHp = 1   
-- or 
M.card[2].adjHp = -3 
-- Not sure which is better.

在战斗中,我需要跟踪播放的光环。例如,如果播放了损坏增强卡。我需要再给另一张牌+1点伤害。

假设我从1开始跟踪每个转弯数。

我应该做这样的事吗

M.aura[1] = 4   -- ( aura 1 is card # 4)
M.aura[1].target = 2   -- (this aura is applied to card 2)
M.aura[1].expires = 5  -- (this aura expires on turn 5)

M.aura[2] = 3   -- ( second active aura is heal, card #3 )
M.aura[2].target = 2
M.aura[2].expires = 0   -- this is a one time aura.  So I need to apply it to card #2 and then immediately expire it so it never activates again.

然后在每一个新的转弯处,我都会遍历所有的光环并确保它们在战斗开始之前仍处于活动状态?

只是在建筑上想知道追踪角色所受伤害的最佳方法是什么,以及那些赋予角色特殊能力的活动法术。

2 个答案:

答案 0 :(得分:1)

为什么不制作不可变参考卡的卡片实例,这些卡片在游戏过程中永远不会改变,并与实例的父元素进行比较?你可以用一些简单的object orienting来做到这一点。

或者,如果这不适合您,您可以为每张卡提供最大或基本HP字段。

table.insert(M.card, {
    name = "Wizard",
    hp = 10,
    basehp = 10,
    dmg = 5
})

至于卡片的时间限制效果,你可以在卡片上跟踪它。

M.card[1].effects = { { dmgboost = 2, expires = 3 } }

为基卡提供一个功能,使其根据效果计算卡的统计数据。

function Card:damage()
    local d = self.dmg
    for _, v in ipairs(self.effects) do
        if v.dmgboost then d = d + v.dmgboost end
    end
    return d
end

function Card:processEffects()
   for i = #self.effects, 1, -1 do
       if turn >= self.effects[i].expires then
           table.remove(self.effects, i)
       end
   end
end

这些只是您可以处理此问题的众多方法中的几个示例。但是,我相信这足以给你一些想法。

答案 1 :(得分:0)

为了使卡的存在暂时影响另一张卡的质量,请使用观察者或回调模式。当你“画出”(从牌组或手牌之外)特殊卡牌给所有其他友善牌牌增加+1伤害时,你可能会有findAllOtherFriendlyCards(yourSpecialCard, allCards)这样做的功能。然后在此功能中,对于您找到的每张友善卡,您可以通过拨打specialCard:registerDiscard(yourFriendlyCard)在特殊卡上“注册”友善卡。然后,当特殊卡被丢弃时(可能通过调用specialCard:discard()发生),此方法查看所有已注册的卡并重新调整特殊卡影响的属性。

事实上,你不需要一个单独的注册方法,你可以只有specialCard:startEffect(friendlyCard):这个方法调整了friendlyCard上的一些属性并将它保存在列表中;并且你有一个相反的specialCard:endEffect(friendlyCard),即调整相反方向的属性(如果它在开始时为-1,则为+1),并从受影响的卡列表中删除该卡。

如果在丢弃特殊卡之前可以丢弃友卡,你可以使用类似的技巧:友卡必须跟踪每张调整它的特殊卡,并在丢弃时通知特殊卡,这样专用卡就可以了将其从列表中删除。