Story文件格式:修订间差异

来自Arcaea中文维基
→‎vns文件:​ say的匹配正则
 
(未显示11个用户的19个中间版本)
第1行: 第1行:
{{技术型}}
<!--如果你通过查看源代码发现了这里,那么恭喜你发现了查看内容的第二种方法。
-->{{技术型}}
__NOINDEX__


{{Usercheck}}
{{特殊页面导航}}
*'''这只是对Story文件的格式分析,并不表示任何人可以曲解剧情。'''
*'''这只是对Story文件的格式分析,并不表示任何人可以曲解剧情。'''
*'''本页面将保持孤立状态,严禁链入/引用!'''
*'''本页面将保持孤立状态,严禁链入/引用!'''
==总论==
==总论==
 在apk包中,所有关于剧情的部分都在\assets\app-data\story中,包含多个文件。不同的文件(夹)包含不同的作用。
 在apk包中,所有关于剧情的部分都在\assets\app-data\story中,包含多个文件。不同的文件(夹)包含不同的作用。
第11行: 第14行:
===csb格式文件===
===csb格式文件===
*csb格式为cocos2dx的UI布局文件,定义了对应分支的界面布局,比较难以编辑(参考:[FlatBuffer https://google.github.io/flatbuffers/])
*csb格式为cocos2dx的UI布局文件,定义了对应分支的界面布局,比较难以编辑(参考:[FlatBuffer https://google.github.io/flatbuffers/])
<!--
不过在某些情况下,可以通过 [csb2csd https://github.com/lyzz0612/csb2csd] 将csb文件转换为csd文件后使用旧版Cocos Studio打开csd文件便可编辑(发布时可发布为csb格式)
-->


===entries文件===
===entries文件===
第16行: 第22行:


 格式
 格式
{| class="wikitable"
{"entries": [{故事信息1},{故事信息2},……,{故事信息n}]}
|-
| <nowiki>{"entries": [{故事信息1},{故事信息2},……,{故事信息n}]}</nowiki>
|}


 例子
 例子
  {
  {
"entries": [{
     "entries": [{
"minor": 1,
             "minor": 1,
"requiredPack": "core",
             "requiredPack": "core",
"storyType": "nvl",
             "storyType": "nvl",
"clearSongId": "lumia",
             "clearSongId": "lumia",
"clearCharaId": 0
             "clearCharaId": 0,
},
             "charIcon1": 0,
{
             "charIcon2": -1,
"minor": 2,
             "storyCgPath": "img/story/cg/1-1.jpg"
"requiredPack": "core",
         },
"requiredMinor": 1,
         {
"storyType": "nvl",
             "minor": 2,
"clearSongId": "memoryfactory",
             "requiredPack": "core",
"clearCharaId": 0
             "requiredMinor": 1,
},
             "storyType": "nvl",
{
             "clearSongId": "memoryfactory",
"minor": 3,
             "clearCharaId": 0,
"requiredPack": "core",
             "charIcon1": 0,
"requiredMinor": 2,
             "charIcon2": -1
"storyType": "nvl",
         },
"clearSongId": "pragmatism",
         {
"clearCharaId": 0
             "minor": 3,
},
             "requiredPack": "core",
...
             "requiredMinor": 2,
]
             "storyType": "nvl",
             "clearSongId": "pragmatism",
             "clearCharaId": 0,
             "charIcon1": 0,
             "charIcon2": -1
         },
         ...
     ]
  }
  }
 归纳
 归纳
第60行: 第70行:
  "requirementAnomalyId": "requirementAnomalyID",
  "requirementAnomalyId": "requirementAnomalyID",
  "clearCharaId": clearCharaId
  "clearCharaId": clearCharaId
"charIcon1": charIconId,
"charIcon2": charIconId
  },
  },
  ]
  ]
第79行: 第91行:
*requirementAnomalyID(ansistring):需要[[解歌系统#特殊解歌系统|迷之解锁]]的曲目ID
*requirementAnomalyID(ansistring):需要[[解歌系统#特殊解歌系统|迷之解锁]]的曲目ID
*clearCharaId(integer):解锁时需要采用的[[搭档]],ID编号参见[[曲包信息(packlist)格式]]
*clearCharaId(integer):解锁时需要采用的[[搭档]],ID编号参见[[曲包信息(packlist)格式]]
*charIcon1(integer):显示在剧情中的搭档头像对应的搭档ID,-1为空
*charIcon2(integer):显示在剧情中的搭档头像对应的搭档ID,-1为空


===vn文件(story文件夹下)===
===vn文件(story文件夹下)===
 格式
 格式
{| class="wikitable"
{"requiredentriesID-requiredMinorID": {对应故事1},"requiredentriesID-requiredMinorID": {对应故事2},……}
|-
| <nowiki>{"requiredentriesID-requiredMinorID": {对应故事1},"requiredentriesID-requiredMinorID": {对应故事2},……}</nowiki>
|}
 例子
 例子
  {
  {
第115行: 第126行:
*文本内容的英文双引号为\",避免json转义
*文本内容的英文双引号为\",避免json转义
*分页符为|
*分页符为|
*双百分号%%用于特殊元素的展示,例如图片文件或字符注释
==vn文件夹==
==vn文件夹==
''总论 一下 文件 排布''
vn文件夹下包含所有不同语言下对应视觉小 模式的剧情的脚本文件,以及res 文件 夹,对应所需资源。
===res文件夹===
===res文件夹===
res文件夹下包含当前V-1视觉小说所有所需文件,以及一个zettai文件夹,对应3-3视觉小说所需文件。
===vns文件===
===vns文件===
vns为Arcaea中视觉小说模式的剧情的脚本文件,包含有以下指令
vns为Arcaea中视觉小说模式的剧情的脚本文件,包含有以下指令
*play <audio> <volume> <loop>
play <audio> <volume> [loop]
**播放音频
*播放音频 (可以使用stop停止)
**loop为循环至剧情结束 (无法停止) ,可选
*loop为循环至剧情结束,可选
*say <content>
stop <audio> <duration>
**显示剧情内容,每次say会清空屏幕已有剧情
*停止音频
*show <pic> <posX>:<posY> <anchorX>:<anchorY> <scaleX>:<scaleY> <transition> normal
*duration为淡出时长
**显示图片
say <content>
**pos为图片锚点在图片上的位置,图片左下角为(0,0),右上角为(1,1)
*显示剧情内容,每次say会清空屏幕已有剧情 ,注意双引号同样有转义;一个推荐的匹配正则是<code>(?<=say ")[\w\W]+?(?=(?<!\\)")</code>
**anchor为图片锚点在屏幕上的位置,屏幕左下角为(0,0),右上角为(1,1)
show <pic> <posX>:<posY> <anchorX>:<anchorY> <scaleX>:<scaleY> <transition> <superposition> [scale]
**scale为图片缩放比例,1为原始大小
*显示图片
***锚点为图片缩放过程中的原点
*pos为图片锚点在图片上的位置,图片左下角为(0,0),右上角为(1,1)
**transition为渐变效果
*anchor为图片锚点在屏幕上的位置,屏幕左下角为(0,0),右上角为(1,1)
**结尾 参数不明 现有vn全部为normal
*scale为图片缩放比例,1为原始大小
*hide <pic> <transition>
**锚点为图片缩放过程中的原点
**隐藏图片
**不论设备分辨率如何,播放区域的比例在16:9和19.5:9之间,若屏幕比例在这之外会有黑边。原始大小指播放区域纵向分辨率为720时图片的大小
**transition为渐变效果,可选
*transition为渐变效果
*move <pic> <dx>:<dy> <duration> <curve>
*superposition为叠加方式,出现过的有normal,overlay和overlayplus
**移动图片
* 结尾 添加"scale" 则原始大小变为播放区域横向分辨率为1280时图片的大小
**dx:dy为移动的距离,单位为像素
hide <pic> [transition]
**duration为移动时长
*隐藏图片
**curve为移动过程使用的曲线
*transition为渐变效果,可选
 
move <pic> <dx>:<dy> <duration> <curve>
transition:仅支持fade淡入淡出渐变,格式为fade(<duration>,<curve>)
*移动图片
*dx:dy为移动的距离,单位为像素
*duration为移动时长
*curve为移动过程使用的曲线
*transition:仅支持fade淡入淡出渐变,格式为fade(<duration>,<curve>)
*curve:支持linear、sineout、sineinout、cubicout,详见[https://easings.net easings 一览]
wait <duration>
*进行下面的操作的等待时间


curve:支持linear、sinein、sineout、sineinout
指令会依次执行,有下列特性
*show在内容完全显示并点击后结束执行
*wait只会在特定时间后结束执行
*其它指令都是“开始”某种画面变化,执行不占用时间,所以一串指令会同时执行
*移动可以叠加
*后显示的图片会在先显示的图片之上
{{Usercheck-end}}

2024年3月4日 (一) 00:38的最新版本


在您查看以下内容之前,我们需要您回答我们提供的问题。
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": 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只会在特定时间后结束执行
  • 其它指令都是“开始”某种画面变化,执行不占用时间,所以一串指令会同时执行
  • 移动可以叠加
  • 后显示的图片会在先显示的图片之上