2016年10月31日 星期一

製作日誌--007

原本以為今天這篇會是008
結果還在007@@
明天(今天?)有個考試,就不花太多時間更新了

###AI對話###

將使用者觸碰反應的對話依照好感度做了分類
不過依現在的設計
一旦被討厭了,似乎會很難拉好感度
考慮從其他互動來彌補
總之,如果被討厭的情況下做出失禮的事
好感度會降非常快

========================================================

眨眼分解動作,這次覺得眼睛半開的小鳥眼神很鄙視QAQ


說話分解動作,原本驚訝的預設表情是張嘴的
不過因為貼圖好像有點問題
就改成預設閉口了


via GIPHY
驚訝表情動畫,真的好可愛啊

觸碰反應裡面增加了一些有點害羞的對話
寫得自己都很害羞
另外,萬聖節快樂
不給糖就導彈((無誤

2016/10/31

2016年10月24日 星期一

製作日誌--006

終於到第六周了(應該是第七周)
這周幾乎都在畫圖,不過進度十分緩慢
不如說只要遇到畫新動作與表情
進度就會非常慢@@

###AI對話###

新增了一個forced_talk
和一個蠻長的連鎖對話
測試一下自己對sakura script語句排列的熟練度


=============================================================
 目瞪鳥呆,一樣好可愛



via GIPHY
目前對話數量不多,內容也不夠廣泛
表情做完似乎都不知道要放在哪裡@@


另外,今天原本有幫旁邊那隻做了眨眼和動嘴的動畫
但因為主要底色是白色
偽春菜在貼圖時似乎直接把白色當作透明色
於是大失敗
之後應該就不考慮幫他做動畫了
不過可能會有別的表情或動作

2016/10/24

2016年10月17日 星期一

製作日誌--005

從決定開始製作已經一個多月了
目前看來進度不快不慢的
沒有期限,所以希望可以完成的完整一些

###AI對話###

增加了一種forced_talk的項目
如果是使用者強制啟動對話的話
有一半的機率會進到forced_talk
另一半的機率會進到一般的aitalk

###主選單###

將芽芽美原有的主選單完全改掉
管理此項目的文件為aya_menu.dic
以下會對於"選項處理"、"輸入框"做些說明

**選項及選項處理**
與人格的互動非常大一部份是建立在選項上的
如果建立選項與處理使用者選擇後的反應便是件很重要的事
我們先看看以下範例:

"請問有什麼事嗎?\n\n/
\q[聊天,talk]\n/
\q[改變會話頻率,interval]\n/
\q[沒事,cancel]\e"

我們先說明"/"這個符號的意思
在文(AYA)中,"/"是保留語
其意義為「將此行結尾與下一行開頭結合,不包含/本身」
在這裡,我們為了排版方便閱讀,使用了"/"符號
讓程式碼的排序更接近於執行後的結果
當然可以選擇不使用該符號
不過使用後的效益遠大於記憶該符號的力氣(個人見解)

再來便是sakura script的選擇肢命令"\q[title, ID]"
每一個這樣的命令都代表了一個選項
title為該選項的標題,會顯示在balloon上供使用者閱讀及點選
因此,title的內容便是用來告知使用者該選項的功能
而ID則是在程式內對於該選項的識別
這點我們在下面的選項處理會繼續說明
接著看到下面的範例:

OnChoiceSelect
{
    case    reference0
    {
        when "talk"
        {
            OnAiTalk
        }
        when "interval"
        {
            "想要改變成怎麼樣呢?\n\n/
            \q[多話,interval_30]\n/
            \q[沉默,interval_0]\e"
        }
        when "cancel"
        {
            "\0\s[0]呣。\e"
        }
    }
}

首先,"OnChoiceSelect"為用來處理選擇後的「所有」事務
個人目前不是很了解其運作,但若有一個以上的"OnChoiceSelect"
程式似乎會出錯,因此必須非常注意「所有」這兩個字
在文(AYA)中,有類似於C的switch條件判斷式
其用法見上例,"case var",var代表之後要用來做判定的變數
範例中使用的"reference0"為選擇選項後傳給OnChoiceSelect的參數
在不同的事件處理中,reference的數量及其代表的意義皆不相同
在OnChoiceSelect中,reference0代表使用者選擇的選擇肢之ID
因此我們用"when "ID""來判定reference0為哪個選項
並對各個選項做處理
這裡可以看到,在talk選項中,會自動導向OnAiTalk事件
而在interval選項中,還包含了兩個選項
這麼做是可以的
假設使用者此時選了"多話"
那麼,"OnChoiceSelect"的"reference0"便會變成"interval_30"
猜測這就是為何不能有多個OnChoiceSelect的原因
最後的"cancel"選項則是讓整個對話結束

另外,我們提到選項處理中可以再新增選項
而新增的選項也必須在同一個OnChoiceSelect中處理
個人推測新增選項的處理必須放在生成該選項的block之外
舉例來說,interval_30是在interval中被生成的
因此,處理interval_30的block必須在interval之後
(以上敘述單純為推測,根據電腦讀取程式碼的順序性,這樣的推測有一定的道理在)

前面提到了只能有一個OnChoiceSelect
為了解決這樣的問題,我從橘花的文件中參考了一些有趣的作法
在說明之前,想先提一下對於「事件發生」與「事件處理」的差別

**事件發生**
以選擇處理為例,不管有沒有OnChoiceSelect的block存在
只要選擇了選項,事件就是會發生
發生這件事並不包含了處理

**事件處理**
事件發生後,我們才能對其做處理
而Ukagaka提供我們許多處理事件用的函式
每個函式都會因為不同事件的發生而得到不同的參數
我們便可以運用這些參數,對事件做出各式各樣的反應

這部分說明僅提供做為參考,若有錯誤,煩請糾正

接著,參考橘花的文件後,可以發現一個"aya_sysex.dic"的文件
我們只需要移植其第一個block
也就是對"OnChoiceSelect"做出一些更動
見以下程式碼:

OnChoiceSelect
{
    EVAL("Select.%(reference0)")
}

其中的"EVAL"在上一篇日誌已經有說明了,這裡便不再多做敘述
這裡便會將"Select.%(reference0)"作為指令碼處理
"reference0"跟前面一樣,是指選項的ID
因此,不管在哪個地方遇到"Select.%(reference0)"
都會包含在這裡的"OnChoiceSelect"之中
非常巧妙的迴避了之前提到的問題
真想問問當初的開發者怎麼想到的,太天才了

我們只需要在自己的人格存放dic檔案的地方
新增一個隨意檔名的dic檔
加入上面的程式碼,以UTF-8儲存檔案
並且在人格的資料夾中的"yaya.txt"加上一行:

dic, dic/aya_sysex.dic

這裡以我開發的文件為例,最前面的dic指程式要去開啟的檔案為dic檔
逗號後面則為yaya.txt與dic檔的相對位置
這樣程式啟動時就會自動去開啟這份檔案,讀取並執行其內容了

接著,對於前面的"OnChoiceSelect"的事件處理
可以改成以下形式:

Select.talk
{
    OnAiTalk
}
Select.interval
{
    "想要改變成怎麼樣呢?\n\n/
    \q[多話,interval_30]\n/
    \q[沉默,interval_0]\e"
}
Select.cancel
{
    "\0\s[0]呣。\e"
}

看起來簡潔許多,也可以在不同文件中做事件處理
真的是一個非常聰明的方式

最後,在本篇日誌最剛開始提到的forced_talk
其實只是在aitalk.dic文件中
另外加上一個forced_talk的block
並在Select.talk的block中
直接加上一行"forced_talk"
這樣處理"talk"選項時
程式便會等機率挑選"OnAiTalk"或"forced_talk"

###BUG###

目前遇到的BUG在主程式更新後便自動消失了
...QAQ

=============================================================
 



害羞鳥的眨眼與說話動畫的分解動作
為什麼每次半開眼的表情看起來都特別病嬌' ')



via GIPHY

害羞表情動畫的GIF,好可愛

大部分功能的雛型都已經建立好了
接下來就是把表情補完,並且把所有功能再擴充到更加充實

2016/10/17

2016年10月10日 星期一

製作日誌--004

上次更新是上上周的事了((囧
昨天處理完事情已經兩點了,於是現在才來寫日誌
不過這兩周幾乎都在畫圖,進度非常少

###AI對話###

這段時間又新增了幾句AI對話
之後可能會考慮增加與使用者對話的功能

###單語字典###

一樣新增了一些內容
之後應該還是會持續更新

###好感度###

新增了好感度參數,目前只有摸臉動作可以增加好感度
未來不排除有增加與減少好感度的行動
並且所有互動內容都會依照好感度的高低有所分別

**新增自定義參數**
增加參數非常簡單,在bootend.dic裡面就可以新增/減少參數

OnFirstBoot
{
    //---- 變數初始化
    username = "User"
    userbirthday = "未知"
    stroke = 0      // 撫摸判定用
    teachusername = 0      // 記住user名用
    teachuserbirthday = 0      // 記住user生日用
    mikireflag = 0      // 見切處理用
    communicateratio = 0     // 溝通開始率[%]
    intimacy = 0     //好感度
    startuptime = 0     //總啟用時間
    lastboottime = "%(systemuptime)"     //每次啟用時間,用來計算每次開啟人格多少時間

    //---- 對話
    "\0\s[0]\1\s[10]\0你好,初次見面,我叫南小鳥。\w8\1\s[10]我叫啾啾。\w8\0\s[0]\n請多多指 教。\e"
}

這個部分在芽芽美人格範本bootend.dic的最開始的地方
其中OnFirstBoot意思是人格首次啟動時要執行的事情
首次啟動人格後,這些參數便會記錄到variable.cfg中
未來都可以直接以bootend.dic中定義的名稱來呼叫變數
可以注意範例程式碼裡面已經有"intimacy"(好感度)這個變數了
並且初始設定為0
須注意這裡所有變數都要給予初始值
至於要怎麼控制這個intimacy變數呢
先看看以下程式碼:

OnAiTalk
{
 /*
其他資料
*/

"\0\s[0]我也很喜歡%(username)喔\e:eval=(intimacy+=1)"
}
在這個範例程式碼裡面,只要觸發了"我也很喜歡%(username)"這個對話
就會執行"intimacy+=2"
可以注意這裡使用的eval
他會將輸入的字串當作AYA的單一指令執行
也就是說,他不能執行複數個指令
但對於這樣單一變數的操作
使用eval是很方便且簡潔的方式
另外,上面的寫法與下面兩種有一樣的效果:

\e" + EVAL("intimacy+=1")
\e%(intimacy+=1)"

個人比較習慣第一種寫法(範例程式碼的)
另外可以注意,第三種寫法是沒有用到EVAL的
而是直接使用"%"呼叫參數,並對參數做+=2的運算
最後,EVAL一定要使用在\e後面
因為前面有提到,EVAL是將"字串"作為指令執行
如果放在\e前面,因為對話方塊還沒消失
便會把目前intimacy的值印出來


###BUG###

近期發現切換人格的頻率太高的話
容易觸發製作日誌--002中提到的BUG
詳細原因依舊不明
不過只要不一直切換人格
是不會有問題的

========================================================
 

苦笑和害羞的小鳥
真可愛


via GIPHY
只有錄了轉換成害羞的表情的gif
因為苦笑是直接從一般的檔案修改來的

下次應該會先把害羞表情的動畫做完

2016/10/10