* AYA人格範本 [#pc76b394]

人格範本是為了配合文 version 5 所做的桌面應用程式「伺か」用的角色資料(人格)原型。~
由於偽春菜中文界似乎沒有使用ver 4以前版本的人格,因此對此範本進行了簡化。

另外,此篇人格範本是以中文化版的 紺野芽芽美 1.02版 為基準進行解說,採用dll版本為YAYA-tc524-5。

#contents

** 範本下載 [#r20dba50]

- 由此[[下載>http://akfield.myweb.hinet.net/konnoyayame_tw102.nar]]


* 機能概要 [#zb3a9626]

人格範本提供以下機能。

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

* 辭書解說 [#s67caf6e]

辭書的副檔名為.dic,可以直接使用筆記本開啟。~
推薦使用EmEditor進行編輯,並套用AYA Syntex規則((詳見[[輕鬆寫AYA - 文書編輯工具EmEditor>EmEditor]]))。~
推薦使用EmEditor進行編輯,並套用AYA Syntex規則((詳見[[EmEditor>開發文件/開發工具/EmEditor]]))。~
慣例上會在辭書前端追加『aya_』作為AYA辭書的識別。~
即使不這麼做也沒關係,只要辭書構築文書(在本範本中為yaya.txt)中的路徑正確即可。

要注意的是,根據辭書構築的先後順序,可能會造成不同的編譯結果。~
aya_shiori3.dll與aya_compatible.dic請務必放在第一順位。

** aya_shiori3.dic [#c083befb]

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

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

** aya_compatible.dic [#c3abeffb]

支援AYA Version 4 與 Version 5 間的互換性,是為了支援較舊版本的人格。

基本上刪除掉也無所謂。

** aya_word.dic [#pb9426cc]

單語辭書。與SSP的SakuraScriptEnv進行對應,會自動取出其中一個單詞。例如以下範例:

 \0\s[0]我剛剛好像看到%ms在%mh裡吃著%me。\1\s[10]應該是錯覺吧。

%ms會自動轉為你在ms中設定的任意一個人名,%mh為店名,%me為食物,因此整個文章的大意是:

 (從者):我剛剛好像看到(某個人)在(某家店)裡吃著(某食物)。 (使魔):應該是錯覺吧。

於是一個較為簡單的AI對話就這麼產生了。這樣的設定也利於提升在毒電波((詳見[[SSTP Bottle]]))上的泛用性,有興趣的人可以多多研究一下。
於是一個較為簡單的AI對話就這麼產生了。這樣的設定也利於提升在毒電波((詳見[[SSTP Bottle>一般使用/名詞解釋#mcae0c8f]]))上的泛用性,有興趣的人可以多多研究一下。

由於AYA在語法上能夠使用附帶範圍的展開式『%()』,因此在單詞的選用中可以有更多的變化性,也可自行設定單詞集合。單語取得事件(On_\??)的部份無需修改,那是為了對應SSP而保留的部份。另外,如果選擇使用前處理功能的話,請將此辭書放在系統辭書之後,對話辭書之前。

** aya_aitalk.dic [#k357d305]

AI對話的處理場所,會根據對話頻率的時間長度自動進行一般對話或連鎖對話。一些會影響到AI行為的對話也會在此處理。

** aya_bootend.dic [#racc4d83]

啟動/關閉/切換人格時會執行的函式都包含在此辭書內。~
有任何預設的初期變數,或關閉人格前想刪除的變數,也請在此一併處理。

** aya_communicate.dic [#kdb1feea]

處理User對人格或人格對人格的對話。

** aya_menu.dic [#n597eced]

處理並生成MENU選單的辭書,以及處理相應的選單選取反應。

** aya_react.dic [#tfa0c0da]

處理使用者用滑鼠或鍵盤對人格的做出的行為,像是這樣這樣那樣那樣的事……XD。

** aya_string.dic [#lfdd387b]

這部份的設定會影響到SSP的右鍵選單,自動取代原有的選單文字。

** aya_etc.dic [#kae2899c]

上述辭書未包含的SSP事件皆置於此,諸如檔案拖曳、對時、收信、安裝等等事件的相應對話。~
如果不打算做較高階的功能的話,基本上沒有必要對此辭書進行更動。

* AYA Versoin 4 的轉移 [#f62db7f1]

基本上沒人用得上,所以不多說了。想了解的話,這裡有完整版中文解說:

- %% http://hk.geocities.com/tionzy/template.html %%(連接已失效)

* UTF-8辭書的使用 [#z21d4099]

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

如果想讓您的人格在任何環境系統下運作,或是在對話中混用多國語言的話,請將辭書編碼設定為UTF-8。~
如下述進行設定的變更。

- 在基礎構築檔案yaya.txt中追加這段代碼。

          charset,UTF-8


* 使用方法 [#q4b30cc0]

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


** 事件處理器 [#a5a3e5b4]

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

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

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

-- [[核心程式應用]]

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

-- [[外部軟體應用]]

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

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

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

    On_hwnd
    {
        SakuraHwnd = reference0[0]
    }


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

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

* SAORI [#p3103824]

** SAORI的執行 [#qa7f3992]

SAORI插件可以用 FUNCTIONEX 或 SAORI 這兩個函式來執行。~
FUNCTIONEX 和 SAORI 在機能上是同等的。用哪一個都隨你喜歡。

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

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

    FUNCTIONEX("textcopy.dll", "複製到剪貼簿。", 0)

Result 可以取得函式傳回的值。

    _result = FUNCTIONEX("textcopy.dll", "複製到剪貼簿。", 1)

** 值的回傳 [#s981baa7]

SAORI實行後回傳的變數 Value[n] 會被文轉為 valueex? 。~
以 SAORI 模組「debeso.dll」為例,可以產生一個簡單的資料庫系統,並接受簡單的SQL語言。~
Argument0 為 "-f",指定資料回傳的方式。
Argument1 為 SQL語言 。

    _result = FUNCTIONEX("debeso.dll","-f","SELECT name FROM sqlite_master WHERE type='table'");

上述的SQL語法要求SAORI回傳資料庫中所有的資料表名稱。~
於是 _result 回傳資料表的總數,valueex0 ~ n 則為資料表的名稱。

** 壽命 [#o201485e]

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

** 線上更新時的動作 [#a1602ece]

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

↑


* 系統變數 [#r97c231b]

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

- 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 系統函數的傳回值,所以沒有準備專用的變數。



* 已安裝人格清單的作成 [#v9579e20]

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

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

aya_shiori3.dic 第25行

    #define IGLIST_MAX -1

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

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

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

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



* 溝通 [#v697eaef]

** 與其他的人格進行對話 [#i794773c]

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

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

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


** 回覆主動對話 [#a3176a9c]

如果是由其他的人格或使用者主動對人格進行對話時,會發生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"。~
至於人格對使用者的回覆則是一樣的寫法。



* 隨機對話的連鎖 [#ac4dec05]

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


- 開始~
在連鎖的初次對話中寫入「連鎖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" → 終了

* 製作成自己的人格 [#wb577dba]

基本上只有下述幾個動作:

+自訂一個人格名稱,取代 dercript.txt 及 install.txt 上面的人格名稱。
+尋找一個自己喜歡的 FreeShell 取代原有的 Shell ,或是自己做一個也可以。
+修正 aya_bootend.dic 中 OnFirstBoot 的內容 (第一次執行時的對話) 。
+將自己構想的對話放入 aya_aitalk.dic 中的 RandomTalk 裡面。
+把 aya_menu.dic 中 OpenMenu 的選單選項改一改。
+對 aya_react.dic 作點小修正,看是要這樣那樣……都行,只要SHELL支援的話(XD)。

這樣一來一個新的人格就誕生了,要公開的話把暫存檔(profile等)刪一刪,然後壓縮成.zip壓縮檔,再把副檔名更名為.nar,放到網路上供人下載,一切搞定!

* 結語 [#d58e3d27]

製作人格真的不是一件很難的事,只要有創意,花點時間,「創師」這個稱號就是你的了。~
就讓我們一起把中文的偽春菜界發揚光大吧!

首頁   編輯 差異 備份 上傳檔案 複製 變更名稱 重新載入   新建條目 一覽 搜索 最近的變更   幫助   最近更新的RSS