賦予物體重量¶
您可以觸控的所有遊戲內物體通常都有一定的重量。重量的作用因遊戲而異。通常它會限制您可以攜帶的數量。如果一塊重石頭落在您身上,對您的傷害也可能比氣球更大。如果你想玩點花俏的,壓力板只有踩在壓力板上的人夠重時才可能觸發。
1# inside your mygame/typeclasses/objects.py
2
3from evennia import DefaultObject
4from evennia import AttributeProperty
5
6class ObjectParent:
7
8 weight = AttributeProperty(default=1, autocreate=False)
9
10 @property
11 def total_weight(self):
12 return self.weight + sum(obj.total_weight for obj in self.contents)
13
14
15class Object(ObjectParent, DefaultObject):
16 # ...
第 6 行:我們使用
ObjectParentmixin。由於此 mixin 用於Characters、Exits和Rooms以及Object,這意味著所有這些都將自動_也_具有權重!第 8 行:我們使用 AttributeProperty 設定「預設」權重 1(無論是什麼)。設定
autocreate=False意味著在權重從預設值 1 實際變更之前不會建立實際的Attribute。請參閱AttributeProperty檔案以瞭解與此相關的注意事項。第 10 行和第 11 行:在
total_weight上使用@property裝飾器意味著我們稍後可以呼叫obj.total_weight而不是obj.total_weight()。第 12 行:我們透過迴圈
self.contents來總結該物件「中」的所有內容的所有權重。由於現在_所有_物體都有重量,所以這應該總是有效!
讓我們看看一些值得信賴的盒子的重量
> create/drop box1
> py self.search("box1").weight
1
> py self.search("box1").total_weight
1
讓我們將另一個盒子放入第一個盒子中。
> create/drop box2
> py self.search("box2").total_weight
1
> py self.search("box2").location = self.search("box1")
> py self.search(box1).total_weight
2
按攜帶重量限制庫存¶
要限制自己可以攜帶的東西,首先要了解自己的力量
# in mygame/typeclasses/characters.py
from evennia import AttributeProperty
# ...
class Character(ObjectParent, DefaultCharacter):
carrying_capacity = AttributeProperty(10, autocreate=False)
@property
def carried_weight(self):
return self.total_weight - self.weight
在這裡,我們確保新增另一個 AttributeProperty 告訴我們要攜帶多少。在真實遊戲中,這可能取決於角色的強度。當我們考慮我們已經攜帶了多少重量時,我們不應該包括我們自己的重量,所以我們減去它。
為了遵守此限制,我們需要覆蓋預設的 get 指令。
# in mygame/commands/command.py
# ...
from evennia import default_cmds
# ...
class WeightAwareCmdGet(default_cmds.CmdGet):
def func(self):
caller = self.caller
if not self.args:
caller.msg("Get what?")
return
obj = caller.search(self.args)
if (obj.weight + caller.carried_weight
> caller.carrying_capacity):
caller.msg("You can't carry that much!")
return
super().func()
在這裡,我們對要拾取的物體的重量新增了額外的檢查,然後我們將正常的 CmdGet 稱為 super().func()。