荒野系統¶
titeuf87 的貢獻,2017 年
這contrib提供了荒野地圖,而沒有實際建立大量 房間數 - 當您移動時,您最終會回到同一個房間,但其描述 變化。這意味著您可以使用很少的資料庫來建立巨大的區域,例如 只要房間相對相似(e.g。僅名稱/描述發生變化)。
安裝¶
此contrib不提供任何新指令。而是預設的 py 指令
用於直接呼叫這contrib中的函式/類別。
用法¶
首先需要建立荒野地圖。可以有不同的地圖,全部 與他們自己的名字。如果未提供名稱,則使用預設名稱。在內部, 荒野儲存為 Script 並具有您指定的名稱。如果你不這樣做 指定名稱,將建立並使用名為“default”的script。
py from evennia.contrib.grid import wilderness; wilderness.create_wilderness()
建立後,就可以進入該荒野地圖:
py from evennia.contrib.grid import wilderness; wilderness.enter_wilderness(me)
荒野地圖所使用的所有座標均採用(x, y)格式
元組。 x 從左到右,y 從下到上。所以(0, 0)
是地圖的左下角。
您也可以透過在 GLOBAL_SCRIPT 中定義 WildernessScript 來新增荒野 設定.如果這樣做,請確保定義地圖提供者。
客製化¶
預設值雖然可用,但可以自訂。當建立一個 新的荒野地圖可以提供“地圖提供者”:這是一個 python 物件足夠聰明來建立地圖。
預設提供者 WildernessMapProvider 只是建立一個網格區域
大小不受限制。
WildernessMapProvider 可以被子類化以建立更有趣的
地圖,還可以自訂使用的房間/出口 typeclass。
WildernessScript 還有一個可選的 preserve_items 屬性,該屬性
當設定為 True 時,將不會回收包含任何物件的房間。預設情況下,
當荒野房間中沒有玩家時,就會被回收。
也沒有允許玩家進入荒野的指令。這個 還需要補充:可以是指令,也可以是退出,取決於你的 需要。
例子¶
為了給出一個如何自訂的例子,我們將建立一個非常簡單的(並且 小)形狀像金字塔的荒野地圖。地圖將是 以字串形式提供:「.」符號是我們可以行走的位置。
讓我們建立一個檔案world/pyramid.py:
# mygame/world/pyramid.py
map_str = '''
.
...
.....
.......
'''
from evennia.contrib.grid import wilderness
class PyramidMapProvider(wilderness.WildernessMapProvider):
def is_valid_coordinates(self, wilderness, coordinates):
"Validates if these coordinates are inside the map"
x, y = coordinates
try:
lines = map_str.split("\n")
# The reverse is needed because otherwise the pyramid will be
# upside down
lines.reverse()
line = lines[y]
column = line[x]
return column == "."
except IndexError:
return False
def get_location_name(self, coordinates):
"Set the location name"
x, y = coordinates
if y == 3:
return "Atop the pyramid."
else:
return "Inside a pyramid."
def at_prepare_room(self, coordinates, caller, room):
"Any other changes done to the room before showing it"
x, y = coordinates
desc = "This is a room in the pyramid."
if y == 3 :
desc = "You can see far and wide from the top of the pyramid."
room.ndb.active_desc = desc
請注意,目前活動描述儲存為 .ndb.active_desc。當
看看房間,這就是將被拉出並顯示的內容。
房間的出口總是存在的,但鎖隱藏了那些不用於房間的出口。 地點。因此,如果您是超級使用者,請確保
quell(因為超級使用者忽略 鎖,否則這些出口將不會被隱藏)
現在我們可以使用新的金字塔形荒野地圖了。從內部Evennia我們 建立一個新的荒野(名稱為“default”),但使用我們的新地圖提供者:
py from world import pyramid as p; p.wilderness.create_wilderness(mapprovider=p.PyramidMapProvider())
py from evennia.contrib.grid import wilderness; wilderness.enter_wilderness(me, coordinates=(4, 1))
實施細節¶
當角色進入荒野時,他們會得到自己的房間。如果 他們移動,而不是移動角色,房間會改變以匹配 新座標。
如果一個角色在荒野中遇到另一個角色,那麼他們的房間 合併。當其中一個角色再次離開時,他們每個人都會得到自己的 單獨的房間。
房間是根據需要建立的。不需要的房間會被存放起來,以避免 未來再次建立新房間的間接費用。
此檔案頁面是從evennia\contrib\grid\wilderness\README.md產生的。對此的更改
檔案將被覆蓋,因此請編輯該檔案而不是此檔案。