Liber語言文檔
Liber語言,全稱「Liber是世界上最好的語言」,是Librian使用的劇本語言。
基本規則
大部分情況下Liber語言是按行解析的,換行即爲語句的終結。
預處理時,劇本被按行分割。
之後,編譯器將所有行使用各個正則表達式匹配,分別得到它們的類型和參數,包裝成dict。
最後,這些dict被按順序組成list,交給Librian虛擬機解釋。
語法
人物對話和表情
潘大爺 (笑)「你好啊!」
人物對話的設計取材於慣用的劇本格式。
格式是 人名
空格
(表情)
[特效]
「話語」
。
表情
和 特效
是可選項。
如果沒有對話,格式是 人名
空格
(表情)
[特效]
。
特效
是可選項,但 表情
不是。
之所以需要空格是爲了避免 QED「495年的波纹」
之類的。
但實際上沒有什麼意義,還不如等出問題了再轉義。
插入代碼
```python
print('你好啊!')
```
插入代碼的格式取材於Markdown,這語法幾乎一模一樣了(笑)。
格式是 三個點
代碼類型
換行
代碼內容
換行
三個點
代碼類型
和 代碼內容
是可選項。如果沒有 代碼內容
就不需要第二個 換行
。
儘管Librian只支持三種代碼類型,實際上 代碼類型
的取值種類應當取決於實現。此外,插入代碼的語義並非總是立即執行,這也取決於實現。
函數調用
> BG 魔王城內
函數調用的寫法取材於Shell。
格式是 >
("字符串"
或 字符串
)×n。
即 >
後接着許多用 空格
隔開的字符串,帶有雙引號的字符串內部不會分割。
(其實我也已經看不懂那代碼寫的是什麼了……)
格式也可以是 一個其他語言的函數調用
,是否允許以及哪種語言都取決於實現。
插入圖
=== 第一章
插入圖的格式取材於Markdown的標題語法。
雖然Markdown是寫在下面的,但是爲了解析方便於是就這樣做了。
格式是 ===
圖片名
,等號可以任意超過三個。
鏡頭
+ {潘大爺: [100, 120, 1.5]}
鏡頭的格式非常讓人迷惑。
它的格式其實是 加號
YAML對象
。
這個YAML對象必須能被解析爲list或dict。
list元素依次爲鏡頭中各個人物的名稱。
dict鍵爲人物名稱,值爲人物在鏡頭中的位置。
(之所以不是JSON是因爲JSON太難用。)
選項
? 接受治療 -> 壞結局.liber
選項的格式取材於ink。
格式是 ?
空格
選項名
->
文件名
,
位置
文件名
和 位置
都是可選項,沒有位置的話也不用寫逗號。
人物操作
@潘大爺 + 西裝
格式是 @
人物名
操作符
目標
。
這個 @
的意思其實不太對得上。
註釋
# 我覺得這段劇本還要修改。
註釋看起來像是Python或者Shell的註釋,其實不太一樣。
格式是 #
註釋內容
註釋同樣是行解析的一部分,這意味着 #
必須在行首。
此外,註釋被丟棄不應該在編譯時而在運行時。
躍點
* 起點
格式是 *
躍點名
。
(好像沒什麼可說的……)
旁白
潘大爺來了!
旁白的格式其實是最簡單的,只要一行不能匹配以上任何一種,就會被當成旁白。
續行
在預處理時將需要續行的情況連成一行。
人物對話
和 嵌入代碼
在劇本中可能超過一行,因此它們會續行而不應該被分割。
因此還有三個續行規則。如果當前行能匹配到任意一個續行規則,就把下一行加入當前行,然後重新進行續行規則匹配。
-
- 強制續行
- 只要以
\
結尾就行了。
-
- 多行對話續行
- 對話匹配到了前面的部分,唯獨缺了最後的
」
的時候。
-
- 代碼段續行
- 代碼段沒有遇到結尾的
三個點
的時候。
停滯點
停滯點是一個重要的概念。
當Librian虛擬機解析到劇本中的停滯點的時候,就會向前端發送一組狀態數據以更新畫面,之後需要點擊一下鼠標來繼續。
在語法上,只有 旁白
、 人物對話
、 插入圖
、 選項
是停滯點。
此外,並非所有選項都是停滯點。當多個選項同時出現時,只有最後一個是停滯點。
樣例
> BG 黑
> BG 白
> BG 黑
潘大爺 「我好暈啊。」
這是一個錯誤樣例,原本想要實現的是背景圖片發生「黑-白-黑」的過渡,然後 潘大爺
說他很暈。
但是實際上這並不能實現,背景總是黑色的。
這是因爲這段劇本中只有 人物對話
一個停滯點,而之前三次調用 BG
沒有傳送到前端就互相覆蓋了。
正確的做法應該是使用CSS動畫來實現……
與嵌入代碼的相互作用
嵌入代碼並不是一個停滯點,但是也會有停滯的現象。這是因爲有一些函數會控制Librian虛擬機引起停滯。
goto
和 call
不會引發停滯,只有跳轉到目標劇本並到達下一個停滯點纔會停滯。因此如果你在副線程調用它,前端並不會變化。
choice
會引發停滯。在運行完一段嵌入的代碼時,如果有未處理的選項,爲了阻止讀取選項之後的內容,會發生停滯。
微妙的實現
即使在函數調用中播放了視頻,也不會停滯。
雖然它看起來停滯了,實際上是因爲視頻實際上是和下一句同時發送到前端的,只是前端把他們錯開了。