Evennia 的角色扮演基礎系統

Griatch 的貢獻,2015 年

完整的角色扮演表情系統。簡短的描述和識別(在給他們指定名字之前只能透過外表來認識他們)。房間姿勢。面具/偽裝(隱藏您的描述)。直接用表情說話,可選擇語言模糊(如果您不懂該語言,單字會出現亂碼,您也可以使用不同的語言,並具有不同的「發音」亂碼)。從遠處就可以聽到部分耳語。一個非常強大的表情內參考系統,用於參考和區分目標(包括物件)。

該系統包含兩個主要模組——角色扮演表情系統和語言模糊模組。

角色扮演表情

此模組包含ContribRPObject、ContribRPRoom 和ContribRPCharacter typeclasses。 如果您從這些繼承您的物件/房間/角色(或將它們設為預設值),您將獲得以下功能:

  • 物件/房間將能夠擁有姿勢並報告其內部物品的姿勢(後者對房間最有用)。

  • 角色將獲得姿勢和 sdesc(簡短描述),這些將用來代替他們的按鍵。他們將獲得管理識別的指令(自訂 sdesc 替換)、隱藏自己以及高階的自由形式表情指令。

更詳細地說,這個 RP 基本系統為遊戲引入了以下功能,這是許多 RP- 中心遊戲所共有的:

  • 使用導演姿態表情的表情系統(名稱/sdescs)。 這使用可自訂的替換名詞(/me、@等)來代表您的表情。您可以使用 /sdesc、/nick、/key 或 /alias 來引用房間中的物件。您可以使用任意數量的 sdesc 子部分來區分本地 sdesc,或使用 /1-sdesc 等來區分它們。該表情還識別巢狀的說並分隔大小寫。

  • sdesc 隱藏真實角色名稱,用於表情和任何引用,例如 object.search()。 這依賴於在角色上設定的 SdescHandler sdesc 並使用自訂角色。 get_display_name 掛鉤。如果未設定 sdesc,則使用字元的 key。這尤其用於情緒系統。

  • 識別系統為角色分配您自己的暱稱,然後可以用於參考。使用者可以識別使用者並向他們分配任何個人暱稱。這將在描述中顯示並用於引用它們。這是利用 Evennia 的暱稱功能。

  • 隱藏您身分的面具(使用簡單的lock)。

  • 姿勢系統設定房間持久姿勢,在房間描述中以及在檢視人/物體時可見。 這是一個簡單的Attribute,它以 sdesc + 姿勢修改角色在房間中的觀看方式。

  • in-emote 表示,包括與語言模糊例程的無縫整合(例如 contrib/rplanguage.py)

安裝:

將此模組中的 RPSystemCmdSet 新增到您的 CharacterCmdSet:

# mygame/commands/default_cmdsets.py

# ...

from evennia.contrib.rpg.rpsystem import RPSystemCmdSet  <---

class CharacterCmdSet(default_cmds.CharacterCmdset):
    # ...
    def at_cmdset_creation(self):
        # ...
        self.add(RPSystemCmdSet())  # <---

您還需要使您的角色/物件/房間繼承自 該模組中的typeclasses:

# in mygame/typeclasses/characters.py

from evennia.contrib.rpg.rpsystem import ContribRPCharacter

class Character(ContribRPCharacter):
    # ...

# in mygame/typeclasses/objects.py

from evennia.contrib.rpg.rpsystem import ContribRPObject

class Object(ContribRPObject):
    # ...

# in mygame/typeclasses/rooms.py

from evennia.contrib.rpg.rpsystem import ContribRPRoom

class Room(ContribRPRoom):
    # ...

您需要設定Evennia以使用RPsystem的形式來分離 sdescs (3-tall) 之間,使其與 Evennia 的其餘部分相容 分隔其他多重符合的搜尋/指令:

SEARCH_MULTIMATCH_REGEX = r"(?P<number>[0-9]+)-(?P<name>[^-]*)(?P<args>.*)"
SEARCH_MULTIMATCH_TEMPLATE = " {number}-{name}{aliases}{info}\n"

最後,您將需要重新載入伺服器並可能強制重新載入 你的物件,如果你最初建立它們時沒有使用它。

您的角色範例:

> type/reset/force me = typeclasses.characters.Character

用法

描述

> look

Tavern
The tavern is full of nice people

*A tall man* is standing by the bar.

上面是一個 sdesc“a high man”的玩家範例。這也是一個靜態姿勢的例子:「站在吧檯旁」是由高個子的玩家設定的,這樣人們一看他就知道發生了什麼。

> emote /me looks at /Tall and says "Hello!"

我懂了:

Griatch looks at Tall man and says "Hello".

高個子男人(假設他的名字是湯姆)看到:

The godlike figure looks at Tom and says "Hello".

請注意,預設情況下,tag 的大小寫很重要,因此 /tall 將導致“tall man”,而 /Tall 將變為“Tall man”,而 /TALL 將變為 /TALL MAN。如果您不希望出現此行為,可以將 case_sensitive=False 傳遞給 send_emote 函式。

語言整合

透過在語音前面加上語言鍵字首,可以將語音辨識為特定語言。

emote says with a growl, orcish"Hello".

這會將語音「Hello」識別為獸人語,然後將該訊息傳遞給您角色上的 process_language。預設情況下,它不會做太多事情,但是您可以掛鉤語言系統(例如下面的 rplanguage 模組)來做更多有趣的事情。

語言和耳語混淆系統

此模組旨在與表情系統(例如contrib/rpg/rpsystem.py)一起使用。它提供了以各種方式混淆遊戲中口頭單字的能力:

  • 語言:語言功能定義了到任意數量語言的偽語言對映。 該字串將根據縮放比例進行混淆,該縮放比例(最有可能)將作為說話者和聽眾語言技能的加權平均值輸入。

  • 耳語:耳語功能將按照 0-1 級逐漸「淡出」耳語,其中淡出是基於逐漸刪除(據說)更容易無意中聽到的耳語部分(例如,即使無法確定其他含義,「s」聲音也往往是可聽見的)。

安裝

該模組沒有新增新指令;將其嵌入到您的 say/emote/whisper 指令中。

用法:

from evennia.contrib.rpg.rpsystem import rplanguage

# need to be done once, here we create the "default" lang
rplanguage.add_language()

say = "This is me talking."
whisper = "This is me whispering.

print rplanguage.obfuscate_language(say, level=0.0)
<<< "This is me talking."
print rplanguage.obfuscate_language(say, level=0.5)
<<< "This is me byngyry."
print rplanguage.obfuscate_language(say, level=1.0)
<<< "Daly ly sy byngyry."

result = rplanguage.obfuscate_whisper(whisper, level=0.0)
<<< "This is me whispering"
result = rplanguage.obfuscate_whisper(whisper, level=0.2)
<<< "This is m- whisp-ring"
result = rplanguage.obfuscate_whisper(whisper, level=0.5)
<<< "---s -s -- ---s------"
result = rplanguage.obfuscate_whisper(whisper, level=0.7)
<<< "---- -- -- ----------"
result = rplanguage.obfuscate_whisper(whisper, level=1.0)
<<< "..."

若要設定新語言,請匯入並使用此模組中的 add_language() 輔助方法。這允許您自訂您正在建立的半隨機語言的“感覺”。特別是 word_length_variance 有助於改變翻譯單字與原始單字的長度,並有助於改變您正在建立的語言的「感覺」。您還可以新增自己的字典並“修復”輸入單字列表中的隨機單字。

下面是「elvish」的一個例子,使用了「rounder」母音和發音:

# vowel/consonant grammar possibilities
grammar = ("v vv vvc vcc vvcc cvvc vccv vvccv vcvccv vcvcvcc vvccvvcc "
           "vcvvccvvc cvcvvcvvcc vcvcvvccvcvv")

# all not in this group is considered a consonant
vowels = "eaoiuy"

# you need a representative of all of the minimal grammars here, so if a
# grammar v exists, there must be atleast one phoneme available with only
# one vowel in it
phonemes = ("oi oh ee ae aa eh ah ao aw ay er ey ow ia ih iy "
            "oy ua uh uw y p b t d f v t dh s z sh zh ch jh k "
            "ng g m n l r w")

# how much the translation varies in length compared to the original. 0 is
# smallest, higher values give ever bigger randomness (including removing
# short words entirely)
word_length_variance = 1

# if a proper noun (word starting with capitalized letter) should be
# translated or not. If not (default) it means e.g. names will remain
# unchanged across languages.
noun_translate = False

# all proper nouns (words starting with a capital letter not at the beginning
# of a sentence) can have either a postfix or -prefix added at all times
noun_postfix = "'la"

# words in dict will always be translated this way. The 'auto_translations'
# is instead a list or filename to file with words to use to help build a
# bigger dictionary by creating random translations of each word in the
# list *once* and saving the result for subsequent use.
manual_translations = {"the":"y'e", "we":"uyi", "she":"semi", "he":"emi",
                      "you": "do", 'me':'mi','i':'me', 'be':"hy'e", 'and':'y'}

rplanguage.add_language(key="elvish", phonemes=phonemes, grammar=grammar,
                         word_length_variance=word_length_variance,
                         noun_translate=noun_translate,
                         noun_postfix=noun_postfix, vowels=vowels,
                         manual_translations=manual_translations,
                         auto_translations="my_word_file.txt")

這將產生一種比預設語言更加“圓潤”和“柔和”的語言。這幾個manual_translations也確保至少表面上看起來「合理」。

auto_translations 關鍵字很有用,它接受清單或文字檔案的路徑(每行一個單字)。該單字清單用於根據語法規則「修復」這些單字的翻譯。只要語言存在,這些翻譯就會永久儲存。

這樣可以快速建立一個永不改變的大型翻譯單字語料庫。這產生了一種看起來相當一致的語言,因為像「the」這樣的字總是會被翻譯成相同的東西。 缺點(或優點,取決於您的遊戲)是玩家最終可以瞭解單字的含義,即使他們的角色不知道該語言。


此檔案頁面是從evennia\contrib\rpg\rpsystem\README.md產生的。對此的更改 檔案將被覆蓋,因此請編輯該檔案而不是此檔案。