Story文件格式

来自Arcaea中文维基
Luke Chen讨论 | 贡献2022年4月14日 (四) 01:04的版本


在您查看以下内容之前,我们需要您回答我们提供的问题。
ABA型的三字符songid是?
已确认。

  • 这只是对Story文件的格式分析,并不表示任何人可以曲解剧情。
  • 本页面将保持孤立状态,严禁链入/引用!

总论

在apk包中,所有关于剧情的部分都在\assets\app-data\story中,包含多个文件。不同的文件(夹)包含不同的作用。 其中paths决定story界面图像排布,entries记录剧情关卡信息,vn记录剧情文字/情景剧信息

文件夹/文件分析

在main和side文件夹下可以看见entries文件,vn文件和一个csb格式文件.

csb格式文件

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": 0, "charIcon2": -1

		},
	]
}
  • 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会清空屏幕已有剧情
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只会在特定时间后结束执行
  • 其它指令都是“开始”某种画面变化,执行不占用时间,所以一串指令会同时执行
  • 移动可以叠加
  • 后显示的图片会在先显示的图片之上