Story文件格式:修订间差异

添加2,474字节 、​ 2024年3月4日 (星期一)
→‎vns文件:​ say的匹配正则
→‎vns文件:​ say的匹配正则
 
(未显示12个用户的20个中间版本)
第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文件夹===
===vns文件(vn文件夹下)===
res文件夹下包含当前V-1视觉小说所有所需文件,以及一个zettai文件夹,对应3-3视觉小说所需文件。
===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}}
1,132

个编辑