Story文件格式
此頁面為技術型隱藏頁面 |
已確認。
- 這只是對Story文件的格式分析,並不表示任何人可以曲解劇情。
- 本頁面將保持孤立狀態,嚴禁鏈入/引用!
總論
在apk包中,所有關於劇情的部分都在\assets\app-data\story中,包含多個文件。不同的文件(夾)包含不同的作用。 其中paths決定story界面圖像排布,entries記錄劇情關卡信息,vn記錄劇情文字/情景劇信息
文件夾/文件分析
在main和side文件夾下可以看見entries文件,vn文件和一個csb格式文件.
csb格式文件
- csb格式為cocos2dx的UI佈局文件,定義了對應分支的界面佈局,比較難以編輯(參考:[FlatBuffer https://google.github.io/flatbuffers/])
entries文件
entries文件為每個劇情的信息,包含解鎖條件、需求曲包、前置分支關係等
格式
{"entries": [{故事信息1},{故事信息2},……,{故事信息n}]}
例子
{ "entries": [{ "minor": 1, "requiredPack": "core", "storyType": "nvl", "clearSongId": "lumia", "clearCharaId": 0, "charIcon1": 0, "charIcon2": -1, "storyCgPath": "img/story/cg/1-1.jpg" }, { "minor": 2, "requiredPack": "core", "requiredMinor": 1, "storyType": "nvl", "clearSongId": "memoryfactory", "clearCharaId": 0, "charIcon1": 0, "charIcon2": -1 }, { "minor": 3, "requiredPack": "core", "requiredMinor": 2, "storyType": "nvl", "clearSongId": "pragmatism", "clearCharaId": 0, "charIcon1": 0, "charIcon2": -1 }, ... ] }
歸納
{ "entries": [{ "minor": MinorID, "requiredPack": "requiredPackID", "requiredMinor": requiredMinorID, "storyType": "type", "clearSongId": "clearSongID", "alternateSuffix": "alternateChar", "requirementAnomalyId": "requirementAnomalyID", "clearCharaId": clearCharaId "charIcon1": charIconId, "charIcon2": charIconId }, ] }
- MinorID(integer):子劇情的ID,引用的基礎。
- requiredPackID(ansistring):該劇情所要求的曲包,請移步曲包信息(packlist)格式。
- requiredMinorID(integer):解鎖此子劇情所需通過的前置子劇情ID
- 如果子劇情需要多個前置子劇情,則代碼如下
"additionalRequires": ["requiredentriesID-requiredMinorID", "requiredentriesID-requiredMinorID",……]
- requiredentriesID(integer):對應requiredMinorID所隸屬的entries.
- type(nvl,vn):本劇情的展現模式,如果為nvl則為普通文本劇情;如果為vn則為視覺小說模式。
…… "storyType": "vn", "storyData": "vnChar", ……
- vnChar(ansistring):當本劇情為vn時所調用的情景劇文件夾(\assets\app-data\story\vn)/資源(\assets\app-data\story\vn\res)的名稱。
- clearSongID(ansistring):需要通過的曲目ID
- alternateChar(ansistring):如果劇情後面的編號不是MinorID時所採用的字符串。
- requirementAnomalyID(ansistring):需要迷之解鎖的曲目ID
- clearCharaId(integer):解鎖時需要採用的搭檔,ID編號參見曲包信息(packlist)格式
- charIcon1(integer):顯示在劇情中的搭檔頭像對應的搭檔ID,-1為空
- charIcon2(integer):顯示在劇情中的搭檔頭像對應的搭檔ID,-1為空
vn文件(story文件夾下)
格式
{"requiredentriesID-requiredMinorID": {对应故事1},"requiredentriesID-requiredMinorID": {对应故事2},……}
例子
{ "3-1": { "en": "It’s early evening. Outside, ...”", "ja": "それは夕暮れ、黄昏のころ。\n野外にて、...", "ko": "이른 저녁이다. 바깥은 태양이 발하는 호박빛의 황혼이 쉼 없이 하늘을 물들이고 있지만,\n...\"", "zh-Hans": "夜色将至。屋外,太阳所溢出的琥珀色暮光马不停蹄地想要从天际溜走,...", "zh-Hant": "夜色將至。屋外,太陽所溢出的琥珀色暮光馬不停蹄地想要從天際溜走,..." }, "3-2": { ... }, ... }
歸納
{ "requiredentriesID-requiredMinorID": { "en": "English story", "ja": "日本語の物語", "ko": "한국어 이야기", "zh-Hans": "简体中文的故事", "zh-Hant": "正體中文的故事" }, …… }
由於變量名已經在先前闡明,故不再贅述。但需要註明的是:
- 換行符是\n
- 文本內容的英文雙引號為\",避免json轉義
- 分頁符為|
- 雙百分號%%用於特殊元素的展示,例如圖片文件或字符注釋
vn文件夾
vn文件夾下包含所有不同語言下對應視覺小說模式的劇情的腳本文件,以及res文件夾,對應所需資源。
res文件夾
res文件夾下包含當前V-1視覺小說所有所需文件,以及一個zettai文件夾,對應3-3視覺小說所需文件。
vns文件
vns為Arcaea中視覺小說模式的劇情的腳本文件,包含有以下指令
play <audio> <volume> [loop]
- 播放音頻(可以使用stop停止)
- loop為循環至劇情結束,可選
stop <audio> <duration>
- 停止音頻
- duration為淡出時長
say <content>
- 顯示劇情內容,每次say會清空屏幕已有劇情,注意雙引號同樣有轉義;一個推薦的匹配正則是
(?<=^say(_legacy)? ")([^\\"]|\\.|\n)*
show <pic> <posX>:<posY> <anchorX>:<anchorY> <scaleX>:<scaleY> <transition> <superposition> [scale]
- 顯示圖片
- pos為圖片錨點在圖片上的位置,圖片左下角為(0,0),右上角為(1,1)
- anchor為圖片錨點在屏幕上的位置,屏幕左下角為(0,0),右上角為(1,1)
- scale為圖片縮放比例,1為原始大小
- 錨點為圖片縮放過程中的原點
- 不論設備解像度如何,播放區域的比例在16:9和19.5:9之間,若屏幕比例在這之外會有黑邊。原始大小指播放區域縱向解像度為720時圖片的大小
- transition為漸變效果
- superposition為疊加方式,出現過的有normal,overlay和overlayplus
- 在結尾添加"scale",則原始大小變為播放區域橫向解像度為1280時圖片的大小
hide <pic> [transition]
- 隱藏圖片
- transition為漸變效果,可選
move <pic> <dx>:<dy> <duration> <curve>
- 移動圖片
- dx:dy為移動的距離,單位為像素
- duration為移動時長
- curve為移動過程使用的曲線
- transition:僅支持fade淡入淡出漸變,格式為fade(<duration>,<curve>)
- curve:支持linear、sineout、sineinout、cubicout,詳見easings 一覽
wait <duration>
- 進行下面的操作的等待時間
指令會依次執行,有下列特性
- show在內容完全顯示並點擊後結束執行
- wait只會在特定時間後結束執行
- 其它指令都是「開始」某種畫面變化,執行不佔用時間,所以一串指令會同時執行
- 移動可以疊加
- 後顯示的圖片會在先顯示的圖片之上