建造巨型機甲¶
讓我們在Evennia中創造一個運作良好的巨型機甲。每個人都喜歡巨型機甲,對吧?以具有建置許可權的角色(或超級使用者)開始遊戲。
create/drop Giant Mech ; mech
繁榮。我們建立了一個巨型機甲物體並將其扔到房間裡。我們也給它取了一個別名mech。 我們來描述一下。
desc mech = This is a huge mech. It has missiles and stuff.
接下來我們定義誰可以「操縱」機甲物件。
lock mech = puppet:all()
這使得每個人都可以控制機甲。為人民提供更多機甲! (請注意,雖然 Evennia 的預設指令可能看起來有點像 MUX-,但您可以更改語法以使其看起來像您喜歡的任何介面風格。)
在繼續之前,讓我們先繞一下。 Evennia 對於它的物件非常靈活,對於使用和向這些物件新增指令甚至更加靈活。對於本文的其餘部分,以下是一些值得記住的基本規則:
帳號代表真人登入,不存在遊戲世界。
任何物件 都可以被帳號操縱(具有適當的許可權)。
任何物件都可以位於另一個物件內部(除非它建立了迴圈)。
任何物件都可以在其上儲存自訂指令集。這些指令可以:
可供木偶操縱者(帳號)使用,
可供與物件位於同一位置的任何人使用,且
可供物件「內部」的任何人使用
帳戶還可以儲存自己的指令。帳戶指令始終可用,除非傀儡物件上的指令明確覆蓋它們。
在 Evennia 中,使用 ic 指令將允許您操縱給定的物件(假設您具有操縱許可權來執行此操作)。如上所述,沼澤標準的角色類別實際上就像任何物件一樣:它在登入時會自動傀儡,並且只有一個指令集,其中包含正常的遊戲內指令,例如檢視、庫存、獲取等。
ic mech
你剛剛跳出了你的角色,現在是機甲了!如果人們在遊戲中看著你,他們 會看機甲。此時的問題是機械物件沒有自己的指令。 常見的事情,例如檢視、庫存和坐在角色物件上,還記得嗎?所以在 此刻,機甲並沒有想像中那麼酷。
ic <Your old Character>
你剛剛又跳回傀儡你正常的、平凡的角色。一切都很好。
如果機甲上沒有指令,那麼
ic指令從何而來?這 答案是它來自Account的指令集。這很重要。如果該帳戶不是使用ic指令的帳戶,我們將無法再次登出我們的機甲。
製作一個可以射擊的機甲¶
讓我們讓機甲變得更有趣一點。在我們最喜歡的文字編輯器中,我們將建立一些新的 適合機甲的指令。在Evennia中,指令被定義為Python類別。
# in a new file mygame/commands/mechcommands.py
from evennia import Command
class CmdShoot(Command):
"""
Firing the mech’s gun
Usage:
shoot [target]
This will fire your mech’s main gun. If no
target is given, you will shoot in the air.
"""
key = "shoot"
aliases = ["fire", "fire!"]
def func(self):
"This actually does the shooting"
caller = self.caller
location = caller.location
if not self.args:
# no argument given to command - shoot in the air
message = "BOOM! The mech fires its gun in the air!"
location.msg_contents(message)
return
# we have an argument, search for target
target = caller.search(self.args.strip())
if target:
location.msg_contents(
f"BOOM! The mech fires its gun at {target.key}"
)
class CmdLaunch(Command):
# make your own 'launch'-command here as an exercise!
# (it's very similar to the 'shoot' command above).
這被儲存為普通的 Python 模組(我們稱之為 mechcommands.py),在 Evennia 的地方查詢此類模組(mygame/commands/)。當玩家發出「射擊」、「開火」甚至「開火!」指令時,該指令就會觸發。帶有感嘆號。如果你有的話,機甲可以在空中或目標上射擊。在真實的遊戲中,槍可能有機會擊中並給予
對目標造成傷害,但這已經足夠了。
我們也發出了第二個發射飛彈的指令(CmdLaunch)。為了節省篇幅,這裡不再描述;它看起來相同,只是它返回有關正在發射的導彈的文字並且具有不同的 key 和 aliases。我們將其留給您來建立作為練習。例如,您可以讓它列印"WOOSH! The mech launches missiles against <target>!。
現在我們將指令放入指令集中。 指令集 (CmdSet) 是容納任意數量指令的容器。指令集是我們將儲存在機械上的內容。
# in the same file mygame/commands/mechcommands.py
from evennia import CmdSet
from evennia import default_cmds
class MechCmdSet(CmdSet):
"""
This allows mechs to do do mech stuff.
"""
key = "mechcmdset"
def at_cmdset_creation(self):
"Called once, when cmdset is first created"
self.add(CmdShoot())
self.add(CmdLaunch())
這只是將我們想要的所有指令分組。我們新增了新的射擊/發射指令。讓我們回到遊戲中。為了進行測試,我們將手動將新的CmdSet附加到機械上。
py self.search("mech").cmdset.add("commands.mechcommands.MechCmdSet")
這是一個小的 Python 片段,用於搜尋目前位置的機甲並將新的 MechCmdSet 附加到它。我們新增的實際上是 cmdset 類別的 Python 路徑。 Evennia 將在幕後匯入並初始化它。
ic mech
我們作為機甲回來了!讓我們進行一些拍攝吧!
fire!
BOOM! The mech fires its gun in the air!
就這樣,一臺正常運轉的機甲。嘗試您自己的 launch 指令,看看它是否也有效。我們不僅可以作為機甲四處走動——因為CharacterCmdSet包含在我們的MechCmdSet中,所以機甲還可以做角色可以做的所有事情,比如環顧四周,撿起東西,並擁有庫存。我們現在可以用槍射擊目標或嘗試導彈發射指令。一旦你擁有了自己的機甲,你還需要什麼?
你會發現,只要站在同一個地方,就可以使用機甲的指令 位置(不僅僅是透過操縱它)。我們將在下一節中使用 lock 來解決這個問題。
組一支機甲軍隊¶
到目前為止我們所做的只是建立一個普通的物件,描述它並在它上面放置一些指令。 這對於測試來說非常有用。按照我們新增的方式,如果我們重新載入,MechCmdSet 甚至會消失 伺服器。現在我們想讓機甲成為一個實際的物件“型別”,這樣我們就可以建立機甲而無需這些額外的步驟。為此,我們需要建立一個新的Typeclass。
Typeclass 是一個接近普通的 Python 類,它將其存在儲存到資料庫中 在幕後。在普通的 Python 原始檔中建立 Typeclass:
# in the new file mygame/typeclasses/mech.py
from typeclasses.objects import Object
from commands.mechcommands import MechCmdSet
from evennia import default_cmds
class Mech(Object):
"""
This typeclass describes an armed Mech.
"""
def at_object_creation(self):
"This is called only when object is first created"
self.cmdset.add_default(default_cmds.CharacterCmdSet)
self.cmdset.add(MechCmdSet, persistent=True)
self.locks.add("puppet:all();call:false()")
self.db.desc = "This is a huge mech. It has missiles and stuff."
為了方便起見,我們在其中包含預設 CharacterCmdSet 的完整內容。這將使角色的正常指令可供機甲使用。我們還新增了先前的機械指令,確保它們持久地儲存在資料庫中。這些鎖規定任何人都可以操縱機甲,並且沒有人可以從機甲的“外部”“呼叫”機甲的指令 - 你必須操縱它才能射擊。
就是這樣。當建立這種型別的物件時,它們總是以機甲的指令集和正確的lock開始。我們設定了預設描述,但您可能會使用 desc 更改此描述,以便在建立機甲時個性化您的機甲。
回到遊戲,只需退出舊機甲(@ic回到你的舊角色)然後執行
create/drop The Bigger Mech ; bigmech : mech.Mech
我們建立了一個新的、更大的機甲,別名為 bigmech。注意我們如何將 python-path 提供給我們的
Typeclass 最後 - 這告訴 Evennia 基於該類別建立新物件(我們不
必須提供我們遊戲目錄 typeclasses.mech.Mech 中的完整路徑,因為 Evennia 已經知道要查詢 typeclasses 資料夾)。一個閃亮的新機甲將出現在房間裡!只需使用
ic bigmech
試駕一下。
未來機甲¶
直接操縱機甲物件只是在 Evennia 中實現巨型機甲的一種方法。
例如,您可以將機甲想像成您正常“進入”的“車輛”
角色(因為任何物件都可以在另一個物件內部移動)。在這種情況下,機甲物體的「內部」可能是「駕駛艙」。駕駛艙本身會存放MechCommandSet,只有當你進入駕駛艙時,所有的射擊技巧才會提供給你。
要對此進行擴充套件,您可以向機甲新增更多指令並刪除其他指令。也許機甲畢竟不該像角色一樣運作。
也許它每次從一個房間經過另一個房間時都會發出很大的噪音。也許它無法在不壓碎東西的情況下撿起它們。也許它需要燃料、彈藥和修理。也許你會lock把它放下,這樣它就只能被情緒化的青少年操縱。
當然,你可以在上面放更多的槍。並讓它飛起來。