2009-12-03 25 views
3

我正在使用django進行RPG工作,並且正在考慮實現部分技能系統的不同選項。基於Django的技能實現

說我有一個基礎技能類即是這樣的:

class Skill (models.Model): 
     name = models.CharField() 
     cost = models.PositiveIntegerField() 
     blah blah blah 

將一些方法來實現特定的技能是什麼?浮現在腦海的第一個選項是:

1)每個技能擴展技能類和 覆蓋特定的功能:

不知道如何做到這一點在Django工作。似乎有一個數據庫表每個技能將是矯枉過正。在技​​能班有條目時,孩子班是抽象的嗎?聽起來不對。如何使用代理類?

還有一些其他的選擇。我想避免一個純粹的Django方法的腳本方法。

+2

從一個到另一個每種技能有多獨特?有些人會擁有獨特的技能嗎? – Carson 2009-12-03 02:24:01

回答

5

也許你可能會考慮分離技能和它的相關效果。更有可能的是,技能最終會產生一種或多種與他們相關的效應,而這種效應可能會被多種技能所使用。

例如,效果可能是「N霜對當前目標造成傷害」。這個效果可以被技能「暴雪螺栓」,「冰霜衝擊波」和「冰冷新星」使用。

models.py

class Skill(models.Model): 
    name = models.CharField() 
    cost = models.PositiveIntegerField() 
    effects = models.ManyToManyField(Effect) 

class Effect(models.Model): 
    description = models.CharField() 
    action = models.CharField() 

    # Each Django model has a ContentType. So you could store the contenttypes of 
    # the Player, Enemy, and Breakable model for example 
    objects_usable_on = models.ManyToManyField(ContentType) 

    def do_effect(self, **kwargs): 
     // self.action contains the python module to execute 
     // for example self.action = 'effects.spells.frost_damage' 
     // So when called it would look like this: 
     // Effect.do_effect(damage=50, target=target) 
     // 'damage=50' gets passed to actions.spells.frost_damage as 
     // a keyword argument  

     action = __import__(self.action) 
     action(**kwargs) 

效果\ spells.py

def frost_damage(**kwargs): 
    if 'damage' in kwargs: 
     target.life -= kwargs['damage'] 

     if target.left <= 0: 
      # etc. etc. 
+0

在我參與過的遊戲中,您不會爲每項技能都有單獨的子課程。你可以通過一個通用的'技能'類來掌握普通信息,並根據需要將不同的效果和動作與技能聯繫起來。 – Kylotan 2009-12-03 11:11:03

+0

(這本來是一個'我同意這個答案'的評論。) – Kylotan 2009-12-03 11:19:45

+0

感謝您的良好迴應。我知道我最終會爲其他技能類型進行一系列繼承,例如被動技能和主動技能等。 將單獨的字段作爲基本技能的一部分,指向定義技能/效果的模塊/類/函數具體的行動是我想弄明白的。 – awithrow 2009-12-03 11:42:48

1

我有點累(後來在瑞典),所以我很抱歉,如果我誤解了,但第一件事是我的腦海裏彈出的是extra fields on many-to-many relationships

+0

這是一個很好的建議,但我很難想出如何避免使用這種方法爲每種技能提供額外的模型。 – jathanism 2009-12-03 02:08:27

1

我會設置一些繼承。

class BaseSkill(models.Model): 
    name = models.CharField() 
    cost = models.PositiveIntegerField() 
    type = models.CharField() 
    .... 

class FireSkill(BaseSkill): 
    burn_time = models.PositiveIntegerField() 

    def save(): 
     self.type = 'fire_skill' 
     return super(FireSkill, self).save() 

class IceSkill(BaseSkill): 
    freeze_time = models.PositiveIntegerField() 

    def save(): 
     self.type = 'ice_skill' 
     return super(IceSkill, self).save() 

這樣做的好處是當你只想列出你需要與BaseSkill類一起工作的玩家技能。如果供應商銷售技能,則只需要列出BaseSkill類的價格。當你需要一個技能的更詳細的屬性時,很容易讓這個類型訪問它。例如。如果您有:技能= BaseSkill.objects()得到(PK = 1)你可以通過做skill.ice_skill.freeze_time或者更一般get_attribute訪問冰技能(技能,skill.type).field_name

1

當我看到這個時,有兩個類:一個是作爲抽象實例的技能(例如講瑞典語的技巧,一個是Excel開發的技能),然後是一個外國人擁有的實際技能技能的關鍵。

0

你也可以使用一個表,並保存基於關內模型對象在醃製場。