2016年9月26日 星期一

製作日誌--003

未來應該是確定每周更新一次了
然後也有根據其他事情而拖延的可能Orz

今天的進度都是改一些文件的資料而已
只有一些些是跟編程有關,但也都很簡單
以後文章會附上一些編程相關的資訊
供同好參考、交流

###AI對話###

今天又加入了一些AI對話
同時也測試了一個連鎖對話
沒什麼問題
以後應該就會慢慢增加對話內容

**有關對話**

有些編輯的小技巧在文的範本內似乎沒有
我是去別的人格翻來看的
這裡整理了兩項覺得還蠻重要的小技巧

1. 輸出確定子在隨機對話內使用
不知道輸出確定子"--"的人可以去翻翻文的規格書
因為Random Talk本身會是一個大括號
如果在編輯對話內容時直接使用輸出確定子
會導致輸出內容組合錯誤
例如說:
{
    "\0\s[0]今天天氣很好。"
    --
    "\w8\1\s[10]就是說啊。\e"
    "\w8\1\s[10]外頭不是在下雨嗎?\w8\0\s[0]\n\n咦咦!?\e"
    "\0\s[0]晚餐要吃什麼好呢?\w8\1\s[10]咖哩飯!\e"
}
在上面的例子中,我們的原意是想要輸出:
"今天天氣很好。就是說啊。"
"今天天氣很好。外頭不是在下雨嗎?咦咦!?"
"晚餐要吃什麼好呢?咖哩飯!"

但第三句會被程式認定為是輸出確定子的候補之一,而變成:
"今天天氣很好。就是說啊。"
"今天天氣很好。外頭不是在下雨嗎?咦咦!?"
"今天天氣很好。晚餐要吃什麼好呢?咖哩飯!"

所以這裡我們需要再用一個縮排後的大括號把對話分組:
{
    {
        "\0\s[0]今天天氣很好。"
        --
        "\w8\1\s[10]就是說啊。\e"
        "\w8\1\s[10]外頭不是在下雨嗎?\w8\0\s[0]\n\n咦咦!?\e"
    }
    "\0\s[0]晚餐要吃什麼好呢?\w8\1\s[10]咖哩飯!\e"
}
這麼做就可以將最後一句話跟前面天氣的話題隔開
同時不需要將天氣的話題拆成兩句
增加程式的可閱讀性!

2. 連鎖對話
在設計連鎖對話的時候,最怕的就是不熟悉指令及其運作的效果
例如說已經使用了"\e",在下一句對話時仍然加上了"\n"
雖然是很好更正的錯誤
但在編寫時就注意到這些事情可以節省很多修改與測試的時間
這裡直接放上今天寫好的連鎖對話當例子:
"\0\s[0]啾啾有沒有想過以後要成為什麼?\w8\1\s[10]嗯?\w5怎麼突然問這個?\w8\0\s[0]\n\n突然想到而已~\e:chain=Chain1"
Chain1
{{CHAIN
 "\w8\1\s[10]也是呢~\w5成為第一隻上太空的鳥吧。\w5\n那小鳥呢?\w8\0\s[0]我想想喔…\w5\n嗯…\w5…\w5…\e"
    {
        "小鳥想要當"
        --
        "服裝設計師呢!\w8\1\s[10]很適合嘛~\w5而且你又有天分。\w8\0\s[0]\n\n嘿嘿,到時候小鳥會幫啾啾設計衣服喔!\w5\n啊!\w5也會幫%(username)設計喔!\w8\1\s[10]\n\n怎麼聽起來像是差點忘記%(username)一樣…\w8\0\s[0]\n\n沒,沒有這回事啦!\e:chain=end"
       "%(username)的新娘呢!\w8\1\s[10]像個小女孩會說的話呢,\w5\n不過也挺不錯的呀。\w8\0\s[0]\n\n那啾啾要來參加我們的婚禮喔!\w8\1\s[10]\n\n這是一定要的嘛!\e:chain=end"
    }
}}CHAIN

第一個要注意的點就是:chain=Chain1要放在雙引號內
個人對於冒號":"的解讀是:直接執行冒號後的函式
所以冒號放的位置是很重要的
如果把:chain=Chain1放到\e之前
會發現開頭的對話是正常的
但卻不會出現接下來的連鎖對話Chain1
因為程式已經執行完chain=Chain1的指令了,之後才執行\e
再來是:chain=end,這個指令會讓程式知道要跳出連鎖對話
回到一般的隨機對話
一般是用在規劃對話路徑用
比如說如果選到這句話,那就不需要接下來的對話
個人習慣是每個連鎖對話的結尾都加上該指令
這麼做並不犯法
因為在芽芽美的範本內是流程控制時在會用到:chain=end指令
只是在我實作時會有問題而已Orz

###單語字典###

更動了一部份的單語內容,讓裡面記載的單語更符合角色

**單語編輯靈活化**

有的人可能會想說單語內容就是把想到的東西全部列舉出來
但在範本中也有用到細層分類的方法
讓同類的單語聚集在一些自定義分類中
不只在單語文件中更容易維護
也可以在其他地方直接呼叫自定義分類
例如:
ms    //----人名----
{
    history
    "小明"
    "小華"
}

history    //----歷史人物----
{
    "劉備"
    "關羽"
}
在這裡history就是我們的自定義類別
它同時是ms中的子類別,同時也是一個獨立類別
可以直接用%(history)的方式被呼叫

另外,在單語文件也可以用以下方法,造出較長的子句:
food
{
    "加了%(ingredient)的%(method)%(me)"
}
其中ingredient、method、me都是類別的名稱

###滑鼠觸摸&雙擊反應###

把所有觸摸與雙擊反應都補齊了
未來會增加根據好感度不同而產生的反應變化

這裡就跟編輯AI對話差不多
唯一要注意的是要在對的事件裡做對的事情
並且注意流程控制(if、for、while)

###動畫###
將小鳥說話時的動畫補上了
接下來shell的部分就是把表情補齊

**動畫編輯**
目前所有網路上有找到的資料中
對於動畫編輯的敘述都還稍嫌不足(個人看法)
這裡放上一個再更詳細的版本

Surface0
{
/*
其他圖檔資料
*/
//----眨眼----
0interval,rarely
0pattern0,1001,7,overlay,78,112
0pattern1,1002,7,overlay,78,112
0pattern2,1001,7,overlay,78,112
0pattern3,-1,7,overlay,78,112
}
我們先看看這裡眨眼動畫的設定
首先是"0interval",比較重要的是前面的序數
這個序數就是該動畫的編號,因此同一個動畫前面的序數會相同
否則會被認為是不同的動畫
再來是interval後面的"rarely"
這個是代表自然執行頻率,角色在所有時候都會不斷以該頻率執行這個動畫
這裡提供所有可用的頻率關鍵詞:
sometimes:每秒1/2的機率
rarely:每秒1/4的機率
random,數字:每秒(1/數字)的機率
periodic,數字:每(數字)秒一次
always:不斷循環
runonce:切換到該surface的瞬間執行一次
never:不自動執行,但可以由其他動畫呼叫(後面會說明)
yen-e:在該surface下,遇到"\e"時執行
注意"每...的機率"與"每...一次"的不同
所以在上面的例子中,眨眼動作會每秒1/4的機率執行

接下來是"0pattern*",*代表接下來的貼圖順序,最前面的0則是先前提到的動畫序數
pattern後面的"1001"、"1002"等等是指圖片編號
1001代表surface1001.png
1002代表surface1002.png,以此類推
下一個數字是指該圖片的持續時間,單位為ms
因此上面例子每張圖片的持續時間都是7ms
接著"overlay"是指貼圖方式
而overlay的意思是直接覆蓋
貼圖方式有非常多種,這裡就不一一介紹了
有興趣的在網路上都可以找到資料
最後的"78,112"分別是"X座標,Y座標"
這個座標是以原本大圖的最左上角為準來測量
用小畫家就可以量到正確的數據了
因為用來做動畫的圖片尺寸不會太大,只有角色的局部而已
所以貼圖位置會顯得相當重要
一種很安全的方法是
把畫好的半開眼、閉眼圖檔存成全身圖
然後用小畫家選個合適的起始點(注意要是動畫用圖的左上角)
在螢幕下方會出現該點的座標,記錄下來,同時裁切出動畫用圖

接下來是說話動畫的製作,這裡程式碼會比較長:
Surface0
{
// ...
1interval,never
1pattern0,1003,5,overlay,118,177
1pattern1,1004,5,overlay,118,177
1pattern2,1003,5,overlay,118,177
1pattern3,-1,10,overlay,118,177

2interval1,never
2pattern0,1003,5,overlay,118,177
2pattern1,-1,10,overlay,118,177

3interval,talk,4
3pattern0,0,0,alternativestart,[1.2]
}
其中interval的部分應該不用多作敘述,在上面就提過了
另外1003是半開嘴的圖,1004則是全開
我們直接看到3interval後面的"talk,4"
其實這也算是一種頻率指令
"talk"代表在Ballon中有文字出現時執行該動畫
"4"則代表每出現4個字時執行一次
再來看到interval裡面
會發現對序數3中的pateern0來說,圖檔名稱為0,持續時間也為0
這是因為之後要貼的圖片在序數1、2中都已經定義了
也跟接下來的指令有關
"alternativestart"意思是隨機執行中括號內的動畫
而中括號內放的就是動畫的序數,注意序數之間是用點"."隔開,不是用逗號","
另外當使用了alternativestart,程式會自動忽略它所在的pattern的Surface ID(最上面的Surface0)、持續時間、XY座標
這也是為何我們沒有標上上述內容的原因

基本上有上面兩個說明已經足以做出一個完整的shell了
有些特殊的功能則要請有興趣的人自行上網搜尋

###BUG###
製作日誌--002

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

張嘴分解動作的小鳥
個人一個動畫是閉→半張→張→半張→閉
另一個是閉→半張→閉
供讀者參考



via GIPHY
說話動畫,實際使用效果還不錯
是說小鳥每次錄影時都會顯瘦@@

2016/09/26

2016年9月19日 星期一

製作日誌--002

開學之後把電腦搬到了宿舍
變成假日回家沒有電腦的狀態Orz
以後可能一個星期才會更新一次
看來進度會十分緩慢

今天的進度不算少
但也冒出了新的BUG
下面會一一說明

###報時功能###

現在Ghost只要整點就會報時
每個時間的內容都不一樣
未來考慮會再增加對話
讓報時功能更多樣化
如果有成功追加好感度的話
會考慮以好感度做判定
而有不同的報時對話

###初始參數###

在序篇有提過
這個偽春菜人格是個人使用的
因此初始參數也調整成個人的資料
目前也成功可以使用
但還沒加入更改參數(ex.用戶名、生日)的功能

###對話###

對話已經被我刪到剩兩句
一句是自己新增的
另一句是AYA範本的連鎖對話

###動畫###

Sakura的預設表情已經有眨眼動畫了
另外,Sakura和Kero的預設表情也已經完工了
接下來計畫先做出Sakura的說話動畫
再開始處理其他表情的圖片
而Kero端是否要有動畫則還在考慮中

###BUG###

從其他人格切換到小鳥的時候
Sakura端的Balloon不會正常顯示
但程式依然會正常運作
即使等到了下個AiTalk
也只有Kero端的Balloon會顯示
這個問題目前可以利用右鍵選單的"アイコン化"解決
另外,如果是重啟人格便不會有以上BUG

眨眼分解動作中的小鳥


via GIPHY
自己錄的眨眼動畫,畫質不好請見諒
 




















目前實在還想不到這隻的名字
暫且叫他啾啾
2016/09/19

2016年9月11日 星期日

製作日誌--001

這幾天花了不少時間在看編成的文件
中文的教程大約三年前就停止更新了
不過找到了還存活著的日文文件
只有這種時候才覺得會日文很好

目前有完成的只有Sakura與Kero的預設表情
而且只上了底色
畫出來的圖比想像中的還大
但還不考慮縮小

將紺野芽芽美的ghost整個複製一份
目前只有把shell中descript.txt和profile以外的資料清空
把surface.txt與圖檔換成小鳥的資料
 

個人覺得還不錯
短腿鳥

恩...
2016/09/11


2016年9月8日 星期四

製作日誌--序

第一次接觸偽春菜是在國中的時候
當時沒有接觸過任何程式語言
讀人格製作的教學文件變成一件很辛苦的事情
只能做到修改AiTalk的程度

前陣子突然想起偽春菜
在網路上搜尋了一下
以前的用過的人格、教學文件等等的資料依然還在
加上對程式語言有一些基礎的了解
重新有了要製作一個全新的人格的想法

目前決定要製作一個LL小鳥的人格
主要是私用,畢竟人物有版權問題
如果有意外的話(?),可能會再製作另一種公開用的人格

參考了一些教學文章,決定用AYA語法編寫Shiori
架構會直接採用AYA的人格範本──紺野芽芽美
不過整體的製作會從Surface開始

##一定會搭載的功能##
隨機對話
報時
鬧鐘
使用者碰觸反應
特殊節日、時間的起始對話
記住使用者的名字、生日
調整對話頻率

##可能會搭載的功能##
好感度
重疊反應
見切(人物圖像有一部份)被放置於螢幕外)
雙擊菜單功能調整

其餘的就是未知項目了' ')
2016/09/08