最近在清理電腦硬碟時,發現了七年前剛學C#時寫的Console文字冒險遊戲,我就馬上點開來玩,玩完後發現只做了一點點的劇情,然後我看了看原始碼,發現七年前的我是把劇情直接寫進原始碼裡的,完全連一點彈性都沒有,看完原始碼我就想,現在的我一定有辦法寫出一套能夠輕鬆更換故事的框架出來,因此我就花了三小時的時間寫出了
StoryConsole Console文字冒險遊戲框架。
寫好程式碼後我就採用
這種結構開始撰寫範例故事,寫了一點點故事之後我就發現,沒有流程控制功能(像是迴圈、if條件選擇)的話,這樣子只要遇到給玩家做選擇時,會因為每多一個選項時,就需要開一個劇情分支的json檔,因此我必須加入流程控制的功能才比較好寫故事。
但是要怎麼加入呢?現在是用json格式撰寫故事,如果想要加入流程控制的話484只能放棄使用json而去改用腳本語言?但是直接使用腳本語言的話,這樣子彈性太大,故事會與程式碼混雜在一起,可能會造成不易閱讀,因此決定繼續使用json,所以把結構改成
這個樣子,加入了全域變數與流程控制。
新的結構是決定好了,但是變數和運算式解析的部分該怎麼處理呢?這部份如果要自己寫解析器的話太麻煩了,因此我只想用現成的解析器,那麼要用哪個解析器呢?我手頭上是有
AShell語言解析器,
FloatWindow的計算機功能就是拿AShell一部分的程式碼去做的,但是那是用java寫的,如果要使用就必須用C#重寫...太麻煩了,找其他的,接著我馬上想到很多遊戲裡面會內嵌的腳本解析器
Lua ,然後就將他引入至我的專案中。
將Lua引擎引入完成後我馬上進行測試,一開始測試時用英文字母都好好的沒什麼問題,直到我用了中文字,直接出現亂碼... 為什麼?難道我json檔用了big-5編碼嗎?用文字編輯器打開一看,用的是安定的utf-8,那為什麼會出現亂碼?找不到問題原因的我馬上就上網爬文,爬了一段時間後發現,原來Lua是不支援unicode的,Lua解析器預設只支援ASCII,若要用utf-8就必須將字串以utf-8轉成bytes餵進Lua然後取出來給C#時再以utf-8轉回字串,這樣就不會是亂碼了,但是這樣做,在Lua中bytes是不能跟字串進行和相接,所以像是習以為常的 '字串' .. '拼接' 就不能用了,到這裡我直接將Lua移除,太難用了!上一次遇到不是以unicode作為編碼的是python2,且現在python3已經支援unicode了。
竟然Lua不符合我的需求,那接下來該怎麼辦呢?這時我馬上想到javascript,他有了Google V8引擎的加持,效率和速度可說是高得很呢,所以我就用javascript取代了Lua,然後一測試,中文字餵進去javascript在出來後還是中文字,沒有變成亂碼!太棒啦!
最後,我就花了一小時半寫了個
小故事當作StoryConsole的範例故事給大家玩玩,StoryConsole我是以MIT Licenseg授權開源的,歡迎大家拿去使用與修改。