Story文件格式:修订间差异
小 (→entries文件) |
小 (→vns文件: say的匹配正则) |
||
(未显示12个用户的33个中间版本) | |||
第1行: | 第1行: | ||
{{技术型}} | <!--如果你通过查看源代码发现了这里,那么恭喜你发现了查看内容的第二种方法。 | ||
-->{{技术型}} | |||
__NOINDEX__ | |||
{{Usercheck}} | |||
{{特殊页面导航}} | |||
*'''这只是对Story文件的格式分析,并不表示任何人可以曲解剧情。''' | *'''这只是对Story文件的格式分析,并不表示任何人可以曲解剧情。''' | ||
*'''本页面将保持孤立状态,严禁链入/引用!''' | *'''本页面将保持孤立状态,严禁链入/引用!''' | ||
==总论== | ==总论== | ||
在apk包中,所有关于剧情的部分都在\assets\app-data\story中,包含多个文件。不同的文件(夹)包含不同的作用。 | 在apk包中,所有关于剧情的部分都在\assets\app-data\story中,包含多个文件。不同的文件(夹)包含不同的作用。 | ||
第10行: | 第13行: | ||
在main和side文件夹下可以看见entries文件,vn文件和一个csb格式文件. | 在main和side文件夹下可以看见entries文件,vn文件和一个csb格式文件. | ||
===csb格式文件=== | ===csb格式文件=== | ||
*csb格式文件 | *csb格式 为cocos2dx的UI布局 文件 ,定义 了对应 分支的 界面 布局,比较难以编辑(参考:[FlatBuffer https://google.github.io/flatbuffers/]) | ||
<!-- | |||
不 过 在 某些 情 况下,可以通过 [csb2csd https://github.com/lyzz0612/csb2csd] 将csb文件转换为csd文件后使用旧版Cocos Studio打开csd文件便可编辑(发布时可发布为csb格式) | |||
--> | |||
===entries文件=== | ===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": [{ | "entries": [{ | ||
"minor": | "minor": MinorID, | ||
"requiredPack": "requiredPackID", | "requiredPack": "requiredPackID", | ||
"requiredMinor": requiredMinorID, | |||
"storyType": "type", | "storyType": "type", | ||
"clearSongId": "clearSongID", | "clearSongId": "clearSongID", | ||
"alternateSuffix": "alternateChar", | |||
"requirementAnomalyId": "requirementAnomalyID", | "requirementAnomalyId": "requirementAnomalyID", | ||
"clearCharaId": clearCharaId | "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会清空屏幕已有剧情,注意双引号同样有转义;一个推荐的匹配正则是<code>(?<=say ")[\w\W]+?(?=(?<!\\)")</code> | |||
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,详见[https://easings.net easings 一览] | |||
wait <duration> | |||
*进行下面的操作的等待时间 | |||
指令会依次执行,有下列特性 | |||
*show在内容完全显示并点击后结束执行 | |||
*wait只会在特定时间后结束执行 | |||
*其它指令都是“开始”某种画面变化,执行不占用时间,所以一串指令会同时执行 | |||
*移动可以叠加 | |||
*后显示的图片会在先显示的图片之上 | |||
{{Usercheck-end}} |
2024年3月4日 (一) 00:38的最新版本
此页面为技术型隐藏页面 |
已确认。
- 这只是对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 ")[\w\W]+?(?=(?<!\\)")
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只会在特定时间后结束执行
- 其它指令都是“开始”某种画面变化,执行不占用时间,所以一串指令会同时执行
- 移动可以叠加
- 后显示的图片会在先显示的图片之上