Story文件格式:修订间差异

来自Arcaea中文维基
→‎vns文件:​ w+: say正则
无编辑摘要
 
第6行: 第6行:
{{特殊页面导航}}
{{特殊页面导航}}
*'''这只是对Story文件的格式分析,并不表示任何人可以曲解剧情。'''
*'''这只是对Story文件的格式分析,并不表示任何人可以曲解剧情。'''
*'''本页面将保持孤立状态, 严禁链入/引用!'''
*'''本页面将保持孤立状态 严禁链入/引用!'''
==总论==
 在apk包中,所有关于剧情的部分都在/assets/app-data中, 目录树如下(仅示意,有省略)
 在apk包中,所有关于剧情的部分都在\assets\app-data\story 中, 包含多个文件。不同的文件(夹)包含不同的作用
<pre>
  其中paths决定story界面图像排布,entries记录剧情关卡信息,vn记录剧情文字/情景剧信息
app-data
==文件夹/文件分析==
├─story
  在main和side文件夹下可以看见entries文件,vn文件和一个csb格式文件.
│  │ paths
===csb 格式文件===
│  ├─cg
*csb 格式为cocos2dx的UI布局文件,定义了对应分支的界面布局,比较难以编辑(参考:[FlatBuffer https://google.github.io/flatbuffers/])
  │  │    1-1.jpg
<!--
│  ├─main
  不过在某些情况下,可以通过 [csb2csd https://github.com/lyzz0612/csb2csd] 将csb文件转换为csd文件后使用旧版Cocos Studio打开csd文件便可编辑(发布时可发布为csb格式)
│  │    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
</pre>


==main和side文件夹==
在main和side文件夹下可以看见entries文件,vn文件和csb格式文件。
===entries文件===
===entries文件===
entries文件为每个剧情的信息, 包含 解锁 条件、 求曲包、 置分支 系等
名字类似<code>entries_\d+</code>的文件记录了每个剧情的信息,例如
<syntaxhighlight lang="json">
{
"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"
}]
}
</syntaxhighlight>
可以看到, 文件 遵循json协议,格式 <code>{"entries": [{故事条目1},{故事条目2},&mldr;,{故事条目n}]}</code>。 每个 条目为一个简单对象,其schema为
<syntaxhighlight lang="json">
{
"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" }
}
}
</syntaxhighlight>
*minor:故事条目id
*storyType:故事的展现模式为普通文本 剧情 (nvl)/视觉小说(vn)
**bgmOverride:故事展现为nvl时,播放的bgm
**storyCgPath:故事展现为nvl时,cg 文件名
**storyData:故事展现为vn时,所使用的视觉小说名称(无后缀)
*requiredPurchase:须获取的曲包或单曲id,详见[[曲包 信息(packlist)格式]]。
*requiredMinor:须前置阅读的故事条目id
**additionalRequires:有多个前置故事的写法,格式为<code>"additionalRequires": ["故事编号", "故事编号", &mldr;]</code> 故事编号详见[[#vn文件]]。
*clearSongId:需要通过的曲目id
*requirementAnomalyId:需要通过[[解歌系统#特殊解歌系统|异象]]的曲目id
*unlockedSongId:需要 解锁 的曲目id
*clearCharaId:需要采用的[[搭档]]数字id
*mapId: 要完成的[[世界模式]]地图id
*hiddenFromCount:故事解锁 不计入对应幕的总数
*hasAlternative:故事具有[[洞烛(至高:第八探索者)#搭档相 |变化]]后的形式
*alternatePrefix、alternateSuffix:故事实际显示编号所采用的前后缀
*charIcon1、charIcon2:显示在剧情中的搭档头像对应的搭档数字id,-1为空
*icon:故事条目图标文件名(无后缀)


格式
===vn文件===
{"entries": [{故事 信息1},{故事 信息2},……,{ 故事信息n}]}
vn文件遵循json协议, 格式 为<code>{" 故事编号1": { 对应故事1}," 故事 编号2": {对应故事2},&mldr;}</code>,其中故事编号格式为<code>entriesId-minorId</code>,即对应[[#entries文件]]id与条目id为前后缀的拼合。对应故事的格式归纳为
<syntaxhighlight lang="json">
{
"故事编号": {
"en": "English story",
"ja": "日本語の物語",
"ko": "한국어 이야기",
"zh-Hans": "简体中文的故事",
"zh-Hant": "正體中文的 故事"
}
}
</syntaxhighlight>
例如
<syntaxhighlight lang="json">
{
"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那是..."
}
}
</syntaxhighlight>
需要注明的是:
*<code>\n</code>为换行符
*<code>\"</code>转义文本中的英文双引号
*<code>|</code>为分页符
*<code>%%CG:%%</code>用于展示图片文件
*<code>%% %%{}</code>、<code>^^ ^^{}</code>用于展示字符注释(ruby)
*<code>$e: $</code>用于展示特殊样式


例子
==vn文件夹==
{
vn文 件夹记录 视觉小说剧情 信息,包含vns文件、vns格式文件和res 文件夹。
     "entries": [{
===vns格式 文件===
             "minor": 1,
vns 格式 文件为视觉小说 本文 件, 格式为<code>视觉小说名_语言.vns</code>。vns文件 所有vns格式 清单。
             "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 文件 夹==
一个vns格式 文件包含有 指令
vn文件夹下 包含 不同语言 对应视觉小说模式的 剧情 的脚本文件 以及res文件夹 对应所需资源。
<pre>say <content></pre>
===res文件夹===
<pre>say_legacy <content></pre>
res文件夹下包含当前V-1视觉小说所 所需文件 以及 个zettai文件夹,对应3-3视觉小说所需文件。
*显示 剧情 内容 每次say会清空屏幕已有剧情 注意双引号同样 转义 “$e: $”特殊样式同样会展现; 个推荐的匹配正则是<code>(?<=^say(_legacy)? ")([^\\"]|\\.|\n)*</code>
===vns文件===
<pre>play <audio> <volume> [loop]</pre>
vns为Arcaea中视觉小说模式的剧情的脚本文件,包含有以下指令
play <audio> <volume> [loop]
*播放音频(可以使用stop停止)
*播放音频(可以使用stop停止)
*loop为循环至剧情结束,可选
*loop为循环至剧情结束,可选
stop <audio> <duration>
<pre>stop <audio> <duration></pre>
*停止音频
*停止音频
*duration为淡出时长
*duration为淡出时长
say <content>
<pre>volume <audio> <duration></pre>
*显示剧情内容,每次say会清空屏幕已有剧情,注意双引号同样有转义;一个推荐的匹配正则是<code>(?<=^say(_legacy)? ")([^\\"]|\\.|\n)*</code>
*调节音频音量
show <pic> <posX>:<posY> <anchorX>:<anchorY> <scaleX>:<scaleY> <transition> <superposition> [scale]
<pre>show <pic> <posX>:<posY> <anchorX>:<anchorY> <scaleX>:<scaleY> <transition> <superposition> [scale]</pre>
*显示图片
*显示图片
*pos为图片锚点在图片上的位置,图片左下角为(0,0),右上角为(1,1)
*pos为图片锚点在图片上的位置,图片左下角为<code>(0,0)</code> ,右上角为<code>(1,1)</code>
*anchor为图片锚点在屏幕上的位置,屏幕左下角为(0,0),右上角为(1,1)
*anchor为图片锚点在屏幕上的位置,屏幕左下角为<code>(0,0)</code> ,右上角为<code>(1,1)</code>
*scale为图片缩放比例,1为原始大小
*scale为图片缩放比例,1为原始大小
**锚点为图片缩放过程中的原点
**锚点为图片缩放过程中的原点
**不论设备分辨率如何,播放区域的比例在16:9和19.5:9之间,若屏幕比例在这之外会有黑边。原始大小指播放区域纵向分辨率为720时图片的大小
**不论设备分辨率如何,播放区域的比例在16:9和19.5:9之间,若屏幕比例在这之外会有黑边。原始大小指播放区域纵向分辨率为720时图片的大小
*transition为渐变效果
*transition为 淡入淡出 渐变效果 ,格式为<code>fade(<duration>,<curve>)</code>
*superposition为叠加方式,出现过的有normal,overlay和overlayplus
*superposition为叠加方式,出现过的有normal,overlay和overlayplus
*在结尾添加"scale",则原始大小变为播放区域横向分辨率为1280时图片的大小
*在结尾添加"scale",则原始大小变为播放区域横向分辨率为1280时图片的大小
hide <pic> [transition]
<pre>hide <pic> [transition]</pre>
*隐藏图片
*隐藏图片
*transition为渐变效果,可选
*transition为渐变效果,可选
move <pic> <dx>:<dy> <duration> <curve>
<pre>move <pic> <dx>:<dy> <duration> <curve></pre>
*移动图片
*移动图片
*dx:dy为移动的距离,单位为像素
*dx:dy为移动的距离,单位为像素
*duration为移动时长
*duration为移动时长
*curve为移动过程使用的曲线
*curve为移动过程使用的曲线,支持linear、sineout、sineinout、cubicout,详见[https://easings.net easings 一览]
*transition:仅支持fade淡入淡出渐变 格式为fade(<duration>,<curve>)
<pre>scale <pic> <scaleX>:<scaleY> <duration> <curve></pre>
*curve: 支持linear、sineout、sineinout、cubicout,详见[https://easings.net easings 一览]
*放缩图片
wait <duration>
<pre>wait <duration></pre>
*进行下面的操作的等待时间
*进行下面的操作的等待时间
<pre>autoplay_legacy <duration></pre>
<pre>auto <duration></pre>


 指令会依次执行,有下列特性
 指令会依次执行,有下列特性
第171行: 第212行:
*移动可以叠加
*移动可以叠加
*后显示的图片会在先显示的图片之上
*后显示的图片会在先显示的图片之上
===res文件夹===
res文件夹下包含视觉小说所需的图像、音效资源,以及对这些资源的鸣谢。各子文件夹下为故事专用资源,子文件夹名取视觉小说名开头连续的字母。
==其他==
===csb格式文件===
csb格式为cocos2dx的UI布局文件,定义了对应分支的界面布局,比较难以编辑,详见[https://google.github.io/flatbuffers/ FlatBuffer]
不过在某些情况下,可以通过[https://github.com/lyzz0612/csb2csd csb2csd]将csb文件转换为csd文件后使用旧版Cocos Studio打开csd文件便可编辑(发布时可发布为csb格式)
===paths文件===
决定story界面图像排布(已废弃?)
===ordering文件===
决定story界面图像排布、剧透警告等
{{Usercheck-end}}
{{Usercheck-end}}

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界面图像排布、剧透警告等