Story文件格式

出自Arcaea中文维基
於 2024年12月6日 (五) 23:31 由 盐棋對話 | 貢獻 所做的修訂
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)


在您查看以下內容之前,我們需要您回答我們提供的問題。
ABA型的三字符songid是?
已確認。

  • 這只是對Story文件的格式分析,並不表示任何人可以曲解劇情。
  • 本頁面將保持孤立狀態,嚴禁鏈入/引用!

在apk包中,所有關於劇情的部分都在/assets/app-data中,目錄樹如下(僅示意,有省略)。

app-data
├─story
│  │  paths
│  ├─cg
│  │      1-1.jpg
│  ├─main
│  │      entries_1
│  │      u.csb
│  │      vn
│  ├─side
│  │      entries_3
│  │      s.csb
│  │      vn
│  └─vn
│      │  vns
│      │  zettai_zh-Hans.vns
│      └─res
│          │  wind.ogg
│          └─zettai
│                  bg.jpg
└─story2
        ActSelect.csb
        ordering

main和side文件夾

在main和side文件夾下可以看見entries文件,vn文件和csb格式文件。

entries文件

名字類似entries_\d+的文件記錄了每個劇情的信息,例如

{
	"entries": [{
			"minor": 1,
			"requiredPurchase": "zettai",
			"storyType": "nvl",
			"clearSongId": "antithese",
			"clearCharaId": -1,
			"charIcon1": 23,
			"charIcon2": -1,
			"storyCgPath": "app-data/story/cg/3-1.jpg",
			"icon": "entry_z"
		},
		{
			"minor": 2,
			"requiredPurchase": "zettai",
			"requiredMinor": 1,
			"storyType": "nvl",
			"clearSongId": "corruption",
			"clearCharaId": -1,
			"charIcon1": 23,
			"charIcon2": -1,
			"icon": "entry_z"
		},
		{
			"minor": 3,
			"requiredPurchase": "zettai",
			"requiredMinor": 2,
			"storyType": "vn",
			"storyData": "zettai",
			"clearSongId": "blackterritory",
			"clearCharaId": 23,
			"charIcon1": 23,
			"charIcon2": -1,
			"icon": "entry_cyaegha"
		}]
}

可以看到,文件遵循json協議,格式為{"entries": [{故事条目1},{故事条目2},…,{故事条目n}]}。每個條目為一個簡單對象,其schema為

{
	"type": "object",
	"required": [ "minor" ],
	"additionalProperties": false,
	"properties": {
		"minor": { "type": "integer" },
		"storyType": { "type": "string", "enum": [ "nvl", "vn" ] },
		"storyData": { "type": "string" },
		"requiredPurchase": { "type": "string" },
		"requiredMinor": { "type": "integer" },
		"additionalRequires": {
			"type": "array",
			"items": { "type": "string" }
		},
		"clearSongId": { "type": "string" },
		"requirementAnomalyId": { "type": "string" },
		"clearCharaId": { "type": "integer", "minimum": 0 },
		"storyCgPath": { "type": "string" },
		"hasAlternative": { "type": "boolean" },
		"hiddenFromCount": { "type": "boolean" },
		"bgmOverride": { "type": "string" },
		"unlockedSongId": { "type": "string" },
		"mapId": { "type": "string" },
		"icon": { "type": "string" }
	},
	"patternProperties": {
		"^charIcon[12]$": {
			"type": "integer",
			"enum": [ -1, { "type": "integer", "minimum": 0 } ]
		},
		"^alternate(Pre|Suf)fix$": { "type": "string" }
	}
}
  • minor:故事條目id
  • storyType:故事的展現模式為普通文本劇情(nvl)/視覺小說(vn)
    • bgmOverride:故事展現為nvl時,播放的bgm
    • storyCgPath:故事展現為nvl時,cg的文件名
    • storyData:故事展現為vn時,所使用的視覺小說名稱(無後綴)
  • requiredPurchase:須獲取的曲包或單曲id,詳見曲包信息(packlist)格式
  • requiredMinor:須前置閱讀的故事條目id
    • additionalRequires:有多個前置故事的寫法,格式為"additionalRequires": ["故事编号", "故事编号", …],故事編號詳見#vn文件
  • clearSongId:需要通過的曲目id
  • requirementAnomalyId:需要通過異象的曲目id
  • unlockedSongId:需要解鎖的曲目id
  • clearCharaId:需要採用的搭檔數字id
  • mapId:需要完成的世界模式地圖id
  • hiddenFromCount:故事解鎖前不計入對應幕的總數
  • hasAlternative:故事具有變化後的形式
  • alternatePrefix、alternateSuffix:故事實際顯示編號所採用的前後綴
  • charIcon1、charIcon2:顯示在劇情中的搭檔頭像對應的搭檔數字id,-1為空
  • icon:故事條目圖標文件名(無後綴)

vn文件

vn文件遵循json協議,格式為{"故事编号1": {对应故事1},"故事编号2": {对应故事2},…},其中故事編號格式為entriesId-minorId,即對應#entries文件id與條目id為前後綴的拼合。對應故事的格式歸納為

{
	"故事编号": {
		"en": "English story",
		"ja": "日本語の物語",
		"ko": "한국어 이야기",
		"zh-Hans": "简体中文的故事",
		"zh-Hant": "正體中文的故事"
	}
}

例如

{
	"102-7": {
		"en": "%%CG:app-data/story/cg/F-7-1.jpg%%|Paradise.\nAfter life, \"heaven\", the world of the dead.\nIt ...",
		"ja": "%%CG:app-data/story/cg/F-7-1.jpg%%|……それは例えば、楽園(パラダイス)。\n死後の世界...",
		"ko": "%%CG:app-data/story/cg/F-7-1.jpg%%|낙원.\n사후 세계, “천국”, 망자의 나라. \n삶을 ...",
		"zh-Hans": "%%CG:app-data/story/cg/F-7-1.jpg%%|乐园——\n在生命结束后,那个名为“天堂”的世界。\n那是...",
		"zh-Hant": "%%CG:app-data/story/cg/F-7-1.jpg%%|樂園——\n在生命結束後,那個名為「天堂」的世界。\n那是..."
	}
}

需要註明的是:

  • \n為換行符
  • \"轉義文本中的英文雙引號
  • |為分頁符
  • %%CG:%%用於展示圖片文件
  • %% %%{}^^ ^^{}用於展示字符注釋(ruby)
  • $e: $用於展示特殊樣式

vn文件夾

vn文件夾記錄視覺小說劇情信息,包含vns文件、vns格式文件和res文件夾。

vns格式文件

vns格式文件為視覺小說的腳本文件,文件名格式為视觉小说名_语言.vns。vns文件是所有vns格式文件的清單。

一個vns格式文件包含有以下指令

say <content>
say_legacy <content>
  • 顯示劇情內容,每次say會清空屏幕已有劇情,注意雙引號同樣有轉義,「$e: $」特殊樣式同樣會展現;一個推薦的匹配正則是(?<=^say(_legacy)? ")([^\\"]|\\.|\n)*
play <audio> <volume> [loop]
  • 播放音頻(可以使用stop停止)
  • loop為循環至劇情結束,可選
stop <audio> <duration>
  • 停止音頻
  • duration為淡出時長
volume <audio> <duration>
  • 調節音頻音量
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為淡入淡出漸變效果,格式為fade(<duration>,<curve>)
  • superposition為疊加方式,出現過的有normal,overlay和overlayplus
  • 在結尾添加"scale",則原始大小變為播放區域橫向解像度為1280時圖片的大小
hide <pic> [transition]
  • 隱藏圖片
  • transition為漸變效果,可選
move <pic> <dx>:<dy> <duration> <curve>
  • 移動圖片
  • dx:dy為移動的距離,單位為像素
  • duration為移動時長
  • curve為移動過程使用的曲線,支持linear、sineout、sineinout、cubicout,詳見easings 一覽
scale <pic> <scaleX>:<scaleY> <duration> <curve>
  • 放縮圖片
wait <duration>
  • 進行下面的操作的等待時間
autoplay_legacy <duration>
auto <duration>

指令會依次執行,有下列特性

  • show在內容完全顯示並點擊後結束執行
  • wait只會在特定時間後結束執行
  • 其它指令都是「開始」某種畫面變化,執行不佔用時間,所以一串指令會同時執行
  • 移動可以疊加
  • 後顯示的圖片會在先顯示的圖片之上

res文件夾

res文件夾下包含視覺小說所需的圖像、音效資源,以及對這些資源的鳴謝。各子文件夾下為故事專用資源,子文件夾名取視覺小說名開頭連續的字母。

其他

csb格式文件

csb格式為cocos2dx的UI佈局文件,定義了對應分支的界面佈局,比較難以編輯,詳見FlatBuffer

不過在某些情況下,可以通過csb2csd將csb文件轉換為csd文件後使用舊版Cocos Studio打開csd文件便可編輯(發佈時可發佈為csb格式)

paths文件

決定story界面圖像排布(已廢棄?)

ordering文件

決定story界面圖像排布、劇透警告等