二次元斷層 - manual - template ghost


文 version 5 人格範本


人格範本是為了配合 文 version 5 所做的桌面應用程式「伺か」用的角色資料(人格)原型。


機能概要
aya_shiori3.dic
version 4 範本的轉移
  -基本
  -細部的移植
UTF-8辭書的使用
使用方法
  -事件處理器
  -SAORI
  -系統變數
  -已安裝人格清單的作成
  -溝通
  -隨機對話的連鎖





機能概要

人格範本提供以下機能。

  • AI talk(隨機對話、連鎖對話)
  • 報時對話
  • 雙擊跳出選單、對話頻率調整
  • 摸頭、觸胸、碰臉的反應
  • 穿透.重疊反應
  • 起動/終了時的對話(對話内容依時間點不同而有所變化)
  • 記住使用者的名字
  • 溝通
  • きのこ/猫どりふ反応
  • 他他各種事件反應
  • 每30分鐘自動保存變數情報





    aya_shiori3.dic

    含有範本的辭書檔aya_shiori3.dic是作為文 SHIORI/3.0核心控制用的制御辭書。

    基本上請勿更動制御辭書。 擁有SHIORI/3.0以及文相關知識的話,是可以通過對内容的理解自行擴充機能。 但是對於一般的人格開發來說,沒有這麼做的必要。





    version 4 範本的轉移


    version 5的轉移是非強制性的。
    今後仍會提供version 4的技術支援,所以也可以就這樣繼續使用version 4的版本。請根據自身的需求來判斷是否要進行轉移。


    基本

    以下為基本的移植作業。
    1. 將aya.dll替換成aya5.dll。

      aya_shiori3.dic也要換成新版本。

      基礎設定檔名從aya.txt改為aya5.txt。

      descript.txt的shiori也改為aya5.dll。

      打開aya_string.txt,將以下函式換成新版本。
      • On_otherghostname
      • On_version

    2. 熟讀version 5的說明手冊中所寫的變更點,進行修正。
    上述方法無法引繼轉移前的變數値。
    如要引繼的話請參照此步驟。
    1. aya.dll替換成aya5.dll。

    2. 將aya5.dll的檔名改為aya.dll。

    3. aya_shiori3.dic換成新版本。

    4. 打開aya_string.txt,將以下函式換成新版本
      • On_otherghostname
      • On_version

    5. 熟讀version 5的說明手冊中所寫的變更點,進行修正

    細部的移植

    一言難盡的是,「熟讀version 5的說明手冊中所寫的變更點,進行修正」的作業是很複雜的。
    「人格啟動不能」這類比較大的錯誤要排除掉是比較容易的,但如果想讓細部的動作跟以前完全一樣則困難許多。

    FAQ

    在此明列轉移的時候會發生的問題及有可能發生的問題,並說明修正手法。
    • 注意字串操作函式
      請檢查有使用以下函式的程式碼部份。
      STRLEN STRSTR SUBSTR REPLACE ERASE INSERT
      在以前這些函式會以byte數作為單位。也就是說,會把半形文字算做1,把全形文字算做2。
      但是在version 5則不同。
      不管是半形還是全形,都會算做1。
      舉下列2個例子。
      len = STRLEN("ABCディーイー")
      
      len在version 4時是13,而在version 5時則是8。
      str = SUBSTR("彼女のPCはMacintoshです。", 6, 9)
      
      str在version 4時是"PCはMacin"、而在version 5時則是"Macintosh" 。

    • STRLEN、STRSTR、NAMETOVALUE、ARRAYSIZE的「將結果存到參數所指定的變數」方式廢止。
      2個參數的STRLEN、4個參數的STRSTR、2個參數的NAMETOVALUE、2個參數的ARRAYSIZE函式被廢止。 請用指派方式取得結果。以下為例。
      // 変更前
      STRLEN("ABC", _i)
      STRSTR("This is a pen.", "is", 0, _str0)
      NAMETOVALUE(result, "var")
      ARRAYSIZE("A,B,C", len)
      
      // 変更後
      _i = STRLEN("ABC")
      _str0 = STRSTR("This is a pen.", "is", 0)
      result = NAMETOVALUE("var")
      len = ARRAYSIZE("A,B,C")
      
    • 注意函式傳回的值
      函式傳回空字串 ""的這種情況,在version 4被解釋為「沒有傳回值」。version 5則解釋為「傳回空的字串」。

      RandomTalk
      {
          "今天天氣真好。"
          "我肚子餓了。"
          TeaTalk
      }
      
      TeaTalk
      {
          "我喜歡喝有放抹茶的綠茶。"
          "雖然鐵觀音是烏龍茶的一種,但喝起來的感覺差很多耶。"
          ""
      }
      
      RandomTalk有傳回5種字串的可能性,其中包含空字串 "" 。

      version 4中空文字列會因為「空等同無」的解釋法而被捨棄。因此RandomTalk會傳回空字串以外的4種字串其中一個。
      在version 5不會捨棄空字串。RandomTalk會傳回包含空字串在內的5種字串其中一個。

      對應方法根據場合的不同而有變化,請參照以下方法。

      • 削除空字串
        最簡單的解決方法。
      • 在非空字串的情況下才會輸出
        以下是RandomTalk修正後的例子。將TeaTalk的輸出存入變數,然後確認是否為空字串,若不是的話就輸出。
        RandomTalk
        {
            "いい天気ですね。"
            "おなかが空きました。"
            if (_t = TeaTalk) != ""; _t
        }
        
    • 使用REQUESTLIB時的注意事項
      使用さおり時沒有使用FUNCTIONEX(或是SAORI),直接執行REQUESTLIB必須注意一下。

      version 4的REQUESTLIB由於不傳回值,會使用LIB.HEADER或LIB.VALUE等函式取得其結構。
      與此不同的是,version 5的REQUESTLIB會直接傳回值。
      LIB.HEADER或LIB.VALUE等無法使用。 在version 5,LIB.*系的系統函式只有在有使用FUNCTIONEX/SAORI時才能使用。

    移行に関する情報

  • 基本機能的主要變更點
  • 文屋 - 文Ver4からVer5への移行メモ
  • 文屋 - 文version5のTips

    文屋には文開発者の方々が寄せられたTipsが集積されています。

    *        *        *

    一旦轉移成功後,用起來應該跟以前的感覺差不多。
    version 5削除掉的系統函式幾乎都以人格範本的方式重現了,可以跟以前一樣的使用。





    UTF-8辞書を使用する

    預設上,人格範本辭書的文字編碼Shift_JIS。

    如果想讓您的人格在任何環境系統下運作,或是在對話中混用多國語言的話,請將辭書編碼設定為UTF-8。如下述進行設定的變更。
    • 在基礎設定檔案aya5.txt中追加這段代碼。
      charset,UTF-8
      




    使用方法

    在此簡單說明一下。
    詳細內容請直接参照範本的構成檔案。先認真讀過這些解讀後再去看辭書的話應該能理解得快一點。


    事件處理器

    事件是「發生了~」「做了~」這類、在人格周遭所發生的各式各樣的現象或環境變化。事件發生之時所引發的函式稱之為事件處理器。明確的說,談到人格的開發就不得不提起事件處理器這東西。

    事件本身分為很多種類,在此就不逐一詳細解説。
    在此提供以下連結,請自行研究如何實行這些事件。

  • 本體通知事件

    通知本體的基礎事件。最重要。

  • 外部應用軟件泛用事件

    外部應用軟件所通知的事件。

  • きのこ事件

    MATERIA 的附屬應用軟件「きのこ」所通知的事件。

  • 猫どりふ事件

    MATERIA の附屬應用軟件「猫どりふ」所通知的事件。

  • 文内部事件
    文自己通知的事件。有OnAiTalk、On_ID 這 2 種類。

    OnAiTalk
    是所謂AI對話(隨機對話)的事件。定期的進行通知。

    On_ID
    SHIORI/3.0 資源参照系以及本體情報系 ID 的request收到訊息時所發生的事件。
    ID: hwnd 處理器的記述例子如下所示。變數 SakuraHwnd 被本體側 hwnd 保持。

    On_hwnd
    {
        SakuraHwnd = reference0[0]
    }
    

    新增事件的對應方法
    即使將來 MATERIA 本體或外部程式定義了新的事件,AYA單單只要追加相對應的事件處理器即可。
    例如要實裝あの夢的機能的話,可以寫成這樣。

    OnHitThunder
    {
        "\0\_s実体化開始。\e"
    }
    



    SAORI

    SAORI 插件可以用FUNCTIONEX或SAORI 函數來執行。

    第一參數指定 DLL 檔名。可以指定與文 DLL的相對路徑。第二參數以後為 Argument[n] 。

    使用方式如下。例子所使用的 SAORI 模組「textcopy.dll」可將Argument0 所指定的字串複製到
  • Windows的剪貼簿中。
    (→textcopy.dll 配布先 ClearBrainSystems
    (→textcopy.dll 的預設編碼是Shift-JIS,所以複製出來的中文會變成亂碼)

    FUNCTIONEX("textcopy.dll", "複製到剪貼簿。", 0)
    
    Result 可以取得函式傳回的值。

    _result = FUNCTIONEX("textcopy.dll", "複製到剪貼簿。", 1)
    
    Value[n] 可取得 SAORI 實行後的變數 valueex? (例子省略)。

    FUNCTIONEX 和 SAORI 在機能上是同等的。用哪一個都隨你喜歡。

  • 關於壽命
    從初回實行之前到 load 和 GET Version 送出時開始。unload 在文のunload之前。

  • 關於線上更新開始時的動作
    由於線上更新時可能有 SAORI 構成檔案那類的東西被更新,因此所有 load 完畢的 SAORI 在取得 OnUpdateReady 事件的訊息後便 unload 。 線上更新中時 SAORI 無法使用。




    系統變數

    範本本身提供了以下的系統變數。

  • year、month、day、weekday
    現在的西暦年、月、日、星期。
    星期為0~6、0是星期日。

  • hour、hour12、ampm、minute、second
    現在時間(24時間)、現在時間(12時間)、上下午、分、秒。

  • systemuptickcount、systemuptime
    OS起動至今的時間。systemuptickcount的單位是毫秒(ms)、systemuptime是秒(s)。

  • systemuphour、systemupminute、systemupsecond
    由systemuptickcount換算成的時、分、秒。

  • memoryload
    物理記憶體的使用率。單位%。

  • memorytotalphys、memoryavailphys、memorytotalvirtual、memoryavailvirtual
    物理記憶體量、剩餘物理記憶體量、虛擬+物理記憶體量、虛擬+物理剩餘記憶體量。單位是KB。

  • username
    使用者的名字。初回起動時為"ユーザーさん" 。

  • basewarename
    「伺か」本體的類別名稱。MATERIA 是 "embryo" 、SSP 是 "SSP" 、CROW 則是 "crow" 。
    OnLoad 無法使用(不能取得有意義的類別名稱)。

  • aitalkinterval
    AI對話(OnAiTalk事件)的発生間隔。單位為秒。預設為 180 (=3 分)。輸入0的話OnAiTalk事件就不會發生。

  • communicateratio
    開始溝通的機率。AI對話中轉換成communicate事件的機率。單位 % 。預設為 10 (也就是說每隨機對話 10 次中有 1 次會跟其他的人格聊天)。

  • ghostexlist / ghostexcount
    以半形逗號列舉現在同樣起動中的人格名稱 / 數量。
    溝通開始時,請從此清單中選擇想要對話的人格。

  • installedghostlist / installedsakuralist / installedkerolist
    已安裝人格名稱、本體側的名字、kero 側的名字清單。用半形逗號區分。
    人格名為 descript.txt 的 name 輸入文字、本体側名為 sakura.name 輸入文字、kero 側名為 kero.name 輸入文字。
    installedghostlist、installedsakuralist、installedkerolist 的元素數量通常是一樣的,並且具有一致性。 例如 installedghostlist[32] 為 "陽子&飯綱&千早" 的時候、installedsakuraname[32] 為 "陽子" 、 installedkeroname 為 "飯綱" 。

  • uniqueid
    獨有 ID 。用於Owned SSTP 的認證。

  • sakurahwnd / kerohwnd / sakurablnhwnd / keroblnhwnd
    各種 hwnd 。在利用需要使用 hwnd 的 SAORI 時而用的。

  • reference*
    Event reference(受信側)。*為0~。
    可能放入數值或字串。値由半角數字組成的話為數值,其他的則為字串。
    例如 OnCommunicate 的 reference0 為對話對象的人格名稱,通常來說是字串,但如果對象是人格「54」的時候則為數值。

    字串中的byte値 1 會自動的置換成半形逗號。

  • res_reference*
    Event reference(應答側)。*為0~。
    如果指派這個系統變數的話,request作為應答會返回 Reference*: header。
    request每次執行完畢後都會清除其內容。這點請注意一下。

    主要是用在communicate時,用來指定對象人格的名字(res_reference0)。

  • valueex?
    SAORI 實行結果的 Value[?] header値。

    此外 SAORI 的 Result 是作為 FUNCTIONEX / SAORI 系統函數的傳回值,所以沒有準備專用的變數。




    已安裝人格清單的作成

    installedghostlist / installedsakuralist / installedkerolist 是人格在 load 過程中自動構築的。 由於構築需要時間,如果已安人格的數量很多時,處理時間會變長。
    因此,如果安裝非常多的人格,等級較低的電腦在啟動人格時會變得比較慢。

    要解決這個問題的話,可以指定最大的清單長度。

    aya_shiori3.dic 第25行

        #define IGLIST_MAX -1
    
    請將此數值改為你所想要的值。或者指定下列的數值。
  • 指定 0 → 不構築清單。
  • 指定-1 → 構築全部的人格。

    假若將此值設定為 5 ,系統將會在所有已安裝人格中挑出5個人格,製成清單放入 installedghostlist、installedsakuralist、installedkerolist。
    放入清單的人格是循環的,下次啟動時會放入與上次不同的5個人格到清單之中。

    已安裝人格如果少於設定值則全數取出。

    當然,設定為0時是速度最快的。
    如果你製作的人格沒有需要用到這個清單的話,可以設為0。




    溝通

  • 與其他的人格進行對話
    在應答各種事件之時,將對話對象人格的名字代入系統函數 res_reference0 ,兩個人格之間就可以產生對話(溝通)事件。
    不僅是在隨機對話或是任何狀況下都能夠進行溝通(Communicate)。

    現在桌面上存在的人格名字,可以用 On_otherghostname 取得。

    具體的實裝例子請參照範本。
    範本是以OnAiTalk來進行溝通。(通常在隨機對話的場合下,溝通的發生率較低。)


  • 回覆主動對話
    如果是由其他的人格或使用者主動對人格進行對話時,會發生OnCommunicate事件。
    以系統變數 reference0 取得對話者的名字、reference1取得對話的內容,然後再判斷要回覆的內容。回覆對象的名字則填入 res_reference0 。

    下面的例子,當對話是來自於奈留的話,會根據內容返回不同的回覆。 至於來自於其他人格的對話,則一律回答「嗯。」。

    OnCommunicate
    {
        if reference0 == "奈留" {
            res_reference0 = "奈留"
            if "你好" _in_ reference1 {
                "\0嗯,你好。\e"
            }
            elseif "天氣" _in_ reference1 {
                "\0天氣?也許吧‥‥。\e"
            }
            else {
                res_reference0=""
                "\0??\e"
            }
        }
        else {
            "\0嗯。\e"
        }
    }
    

    當無法解釋奈留對話的內容時,回覆「??」避免進一步的對話(雞同鴨講 = = )。

    不把人格的名字代入res_reference0 ,並明示其為空的字串時,因為沒有將回覆傳給對方,此次的交談將會在這個回覆之後停住。

    如果是來自於使用者的主動對話時, reference0 會代入"user"。
    至於人格對使用者的回覆則是一樣的寫法。




    隨機對話的連鎖

    隨機對話的時候,由於對話的長度或是段落的考量,將一整串相同主題的對話內容,分為複數次的對話來進行。此類對話我們稱之為連鎖對話。


  • 開始
    在連鎖的初次對話中寫入「連鎖ID」。
    連鎖ID ,即為以下對話後面寫下的「:chain=連鎖ID」。

    RandomTalk
    RandomTalk
    {
        "\0沒有連鎖的對話、其之一。\e"
        "\0沒有連鎖的對話、其之二。\e"
        "\0伊藤是大笨蛋。\e:chain=爭吵"
    }
    

    上述例子中,第三項的對話為連鎖的啟動對話,連鎖ID變成「爭吵」。
    這樣一來、以「伊藤是大笨蛋。」為開端,開始進行「爭吵」話題的連鎖再生。

    連鎖除了隨機對話可以啟動之外,其他狀況的對話也都能進行連鎖。例如在OnBoot對話(啟動人格時的初始對話)加入連鎖ID的話,人格啟動之後就可以直接進入連鎖對話。


  • 本體
    連鎖對話「爭吵」的本體如以下記述。

    爭吵
    {{CHAIN
        "\1我哪裡笨了!你這個薄得要死的マセ餓鬼!\e"
        "\0你才是8位元微處理器的中古貨!\e"
        "\18位元哪裡不好啊!\e"
    }}CHAIN
    

    連鎖是寫入「連鎖函式」用的特殊格式・動作函式。
    連鎖函式的動作與sequential選擇對話字串的函式相類似。在取得隨機對話的同時,將接下來的對話順序也一併輸入進去。

    連鎖函式不能單純的使用{}來包圍,而是用{{CHAIN}}CHAIN


  • 連鎖對話的子階層與流程控制
    連鎖函式與普通函式一樣可以使用變數或 if 。連鎖之內也可以加入新的連鎖,因此可以寫出相當複雜的連鎖程式。

    連鎖ID被指定為「end」時,連鎖就會被終止,回到一般的隨機對話。

    以下簡單的例子所示。

    chain1
    {{CHAIN
        "1"
        "2"
        {
            "3"
            "4:chain=end"
            "5:chain=chain2"
        }
        "6"
    }}CHAIN
    
    chain2
    {{CHAIN
        "7"
        "8"
    }}CHAIN
    
    此連鎖函式 chain1 會隨機產生下列3種型式的連鎖對話。
    1. "1" → "2" → "3" → "6" → 終了
    2. "1" → "2" → "4" → 終了
    3. "1" → "2" → "5" → "7" → "8" → 終了