发布咸鱼喵喵截图辅助工具公开版

This commit is contained in:
2026-10-03 01:16:35 +08:00
commit 178e1d8714
26 changed files with 5694 additions and 0 deletions
+37
View File
@@ -0,0 +1,37 @@
# 本机配置、日志和存档不提交。
/tool/config.json
/tool/.server-runtime.json
/tool/index/
/backups/
/backup_save_*/
**/save/
*.rmmzsave
*.log
*.tmp
*.bak
.last_backup
# 运行环境另行下载。
/nwjs-sdk-*/
*.zip
# 仅提交运行必需的结构索引,排除完整提取数据。
/out/*
!/out/triggers.csv
/unpacked/*
!/unpacked/data/
/unpacked/data/*
!/unpacked/data/System.json
!/unpacked/data/MapInfos.json
# 开发资料和本地备份。
/probe/
/dumpapp/
/samples/
/_同步前备份_*/
/_撤回误改留档_*/
/claude-update-*/
/公开发布/
Thumbs.db
desktop.ini
.DS_Store
+26
View File
@@ -0,0 +1,26 @@
# 咸鱼喵喵截图辅助工具:简单使用方法
一个在浏览器里操作的本地辅助工具,支持剧情全文搜索、传送、播放对白、角色摆拍,以及角色数值和背包调整,方便回看剧情和截图。
需要 Windows、已安装的《咸鱼喵喵》、[Node.js 22 或更新版本](https://nodejs.org/),以及 [NW.js SDK 0.64.1(Windows x64)](https://dl.nwjs.io/v0.64.1/nwjs-sdk-v0.64.1-win-x64.zip)。发布包不含游戏本体、存档、完整剧本和上述运行环境;无需 npm install。
1. 将包内的 `aitemp截图工具` 文件夹放进游戏安装目录,与游戏的 `package.json` 同级。可从 Steam 的“管理 → 浏览本地文件”找到游戏目录。
2. 解压 NW.js SDK,把 `nwjs-sdk-v0.64.1-win-x64` 文件夹放进 `aitemp截图工具`。确认路径如下,别多套一层文件夹:
```text
游戏目录/
package.json
aitemp截图工具/
tool/启动.bat
nwjs-sdk-v0.64.1-win-x64/nw.exe
out/triggers.csv
unpacked/data/...
```
3. 先在原游戏中正常保存一次并退出。双击 `tool/启动.bat`,首次选择 **1:只启动面板**,在“存档与沙盒”页创建游戏副本。副本需要额外磁盘空间,默认放在游戏所在盘的 `Nyaruru_shots` 文件夹。
4. 副本创建完成后,再次双击 `启动.bat`,工具会备份存档并启动副本游戏。在游戏里正常读档进入地图,确认面板顶部连接的是沙盒。
5. 在面板搜索台词或故事编号,按需要选择“前往”“运行过场”或“只播台词”;摆拍后可点“撤销场景还原”。全文台词在连接游戏后自动读取,断开连接后清空。
面板默认地址为 `http://127.0.0.1:8787`。用完双击 `tool/停止面板.bat`,游戏窗口另行关闭。升级前先退出旧面板和游戏。
建议始终在沙盒里使用:剧情操作可能改变进度,自动存档和手动保存照常生效。“全部还原”会解除临时效果和锁定,但不会回退已经改过的数值、背包或剧情进度;摆拍状态也不保证能通过读档完整恢复。详细说明见包内 `tool/使用须知.md`。
+898
View File
@@ -0,0 +1,898 @@
故事序号,来源,地图,事件ID,事件名,坐标,页,触发方式,条件,位置,备注
0,JS:_storyId=,,,,,,,,js/nya/nya_achieves.js:656,
0,JS:_storyId=,,,,,,,,js/nya/nya_achieves.js:787,
0,JS:_beforeDestoryTime=,,,,,,,,js/nya/nya_ai.js:8896,
0,JS:_beforeDestoryTime=,,,,,,,,js/nya/nya_ai.js:8916,
0,JS:_floatMessageStoryID=,,,,,,,,js/nya/nya_effect.js:179,
0,JS:_floatMessageStoryID=,,,,,,,,js/nya/nya_effect.js:325,
0,JS:_storyTime=,,,,,,,,js/nya/nya_game.js:5154,
0,JS:storyWaitTime=,,,,,,,,js/nya/nya_statem_ext.js:5653,
0,JS:storyModeStep=,,,,,,,,js/nya/nya_statem_ext.js:14494,
0,JS:storyModeStep=,,,,,,,,js/nya/nya_statem_ext.js:14617,
1,地图事件,Map004.json MAP004,1,EV001,"(0,0)",1/4,自动执行,无条件,,
1,JS数组(浮动消息),,,,,,,,js/nya/nya_game_system.js:3027,
1,JS:storyModeStep=,,,,,,,,js/nya/nya_statem_ext.js:14621,
2,地图事件,Map012.json MAP012,4,EV004,"(4,11)",1/3,按确定键,无条件,,
2,JS数组(浮动消息),,,,,,,,js/nya/nya_game_system.js:3027,
2,JS:storyModeStep=,,,,,,,,js/nya/nya_statem_ext.js:14625,
3,JS数组(浮动消息),,,,,,,,js/nya/nya_game_system.js:3440,
3,JS:storyModeStep=,,,,,,,,js/nya/nya_statem_ext.js:14605,
4,JS:lockTextBalloon(),,,,,,,,js/nya/nya_game.js:3827,
4,JS数组(浮动消息),,,,,,,,js/nya/nya_game_system.js:3911,
5,JS数组(浮动消息),,,,,,,,js/nya/nya_game_system.js:3911,
7,地图事件,Map012.json MAP012,6,EV006,"(1,0)",1/8,自动执行,开关[第一天夜晚莉莉亚回家](需ON),,
10,地图事件,Map004.json MAP004,3,EV003,"(4,6)",1/1,按确定键,无条件,,
11,地图事件,Map004.json MAP004,4,EV004,"(3,4)",1/4,按确定键,无条件,,
11,地图事件,Map004.json MAP004,4,EV004,"(3,4)",2/4,按确定键,开关[前往天空区域](需ON),,
11,地图事件,Map004.json MAP004,4,EV004,"(3,4)",2/4,按确定键,开关[前往天空区域](需ON),,
12,地图事件,Map004.json MAP004,5,EV005,"(1,4)",1/6,按确定键,无条件,,
13,地图事件,Map004.json MAP004,5,EV005,"(1,4)",2/6,按确定键,独立开关A=ON,,
15,地图事件,Map006.json MAP006,9,EV009,"(0,0)",1/3,自动执行,无条件,,
16,地图事件,Map006.json MAP006,9,EV009,"(0,0)",1/3,自动执行,无条件,,
17,地图事件,Map006.json MAP006,9,EV009,"(0,0)",1/3,自动执行,无条件,,
18,地图事件,Map006.json MAP006,9,EV009,"(0,0)",1/3,自动执行,无条件,,
18,JS数组(浮动消息),,,,,,,,js/nya/nya_game_system.js:7284,
19,地图事件,Map006.json MAP006,7,EV007,"(13,9)",1/2,按确定键,无条件,,
20,地图事件,Map006.json MAP006,12,EV012,"(22,9)",1/2,按确定键,无条件,,
21,地图事件,Map006.json MAP006,12,EV012,"(22,9)",1/2,按确定键,无条件,,
22,地图事件,Map006.json MAP006,13,EV013,"(31,9)",1/2,按确定键,无条件,,
34,地图事件,Map007.json MAP007,5,EV005,"(24,9)",1/2,按确定键,无条件,,
34,地图事件,Map007.json MAP007,7,EV007,"(26,9)",1/2,按确定键,无条件,,
35,地图事件,Map007.json MAP007,5,EV005,"(24,9)",1/2,按确定键,无条件,,
35,地图事件,Map007.json MAP007,7,EV007,"(26,9)",1/2,按确定键,无条件,,
36,地图事件,Map010.json MAP010,2,EV002,"(6,6)",1/2,按确定键,无条件,,
39,地图事件,Map009.json MAP009,3,EV003,"(4,9)",1/16,按确定键,无条件,,
40,公共事件,,3,初遇幽暗森林,,,公共事件#3,开关[开场白完成],,
41,公共事件,,3,初遇幽暗森林,,,公共事件#3,开关[开场白完成],,
43,地图事件,Map007.json MAP007,3,EV003,"(7,9)",1/4,按确定键,无条件,,
44,地图事件,Map012.json MAP012,2,EV002,"(0,0)",1/2,自动执行,开关[带任务进莉莉亚家](需ON),,
45,地图事件,Map009.json MAP009,3,EV003,"(4,9)",1/16,按确定键,无条件,,
46,地图事件,Map012.json MAP012,3,EV003,"(13,5)",1/3,按确定键,无条件,,
46,地图事件,Map012.json MAP012,3,EV003,"(13,5)",2/3,按确定键,开关[前往天空区域](需ON),,
46,地图事件,Map012.json MAP012,3,EV003,"(13,5)",3/3,按确定键,开关[天空莉莉亚分头行动](需ON),,
47,地图事件,Map009.json MAP009,4,EV004,"(14,6)",1/2,按确定键,无条件,,
49,地图事件,Map009.json MAP009,4,EV004,"(14,6)",1/2,按确定键,无条件,,
57,地图事件,Map008.json MAP008,6,EV006,"(12,7)",1/3,按确定键,队伍含角色#1,,
57,地图事件,Map024.json MAP024,7,EV007,"(7,8)",1/3,按确定键,队伍含角色#1,,
57,地图事件,Map027.json MAP027,5,EV005,"(5,5)",1/2,按确定键,无条件,,
61,公共事件,,7,目前的难度是~~,,,公共事件#7,开关[开场白完成],,
62,公共事件,,7,目前的难度是~~,,,公共事件#7,开关[开场白完成],,
63,公共事件,,7,目前的难度是~~,,,公共事件#7,开关[开场白完成],,
65,公共事件,,8,选择简单难度,,,公共事件#8,开关[开场白完成],,
65,公共事件,,9,选择普通难度,,,公共事件#9,开关[开场白完成],,
65,公共事件,,10,选择困难难度,,,公共事件#10,开关[开场白完成],,
66,地图事件,Map008.json MAP008,6,EV006,"(12,7)",1/3,按确定键,队伍含角色#1,,
66,地图事件,Map024.json MAP024,7,EV007,"(7,8)",1/3,按确定键,队伍含角色#1,,
66,地图事件,Map027.json MAP027,5,EV005,"(5,5)",1/2,按确定键,无条件,,
67,JS:lockTextBalloon(),,,,,,,,js/nya/nya_game.js:3837,
68,地图事件,Map040.json MAP040,5,EV005,"(12,5)",1/3,按确定键,开关[第一天NPC位置变化1](需ON),,
69,地图事件,Map040.json MAP040,5,EV005,"(12,5)",1/3,按确定键,开关[第一天NPC位置变化1](需ON),,
70,地图事件,Map013.json MAP013,3,EV003,"(7,8)",1/3,按确定键,开关[第一天NPC位置变化1](需ON),,
72,地图事件,Map013.json MAP013,5,EV005,"(4,8)",1/2,按确定键,开关[依铃回到小镇](需ON),,
72,地图事件,Map013.json MAP013,6,EV006,"(6,8)",1/2,按确定键,开关[依铃回到小镇](需ON),,
73,地图事件,Map013.json MAP013,6,EV006,"(6,8)",1/2,按确定键,开关[依铃回到小镇](需ON),,
74,地图事件,Map013.json MAP013,5,EV005,"(4,8)",1/2,按确定键,开关[依铃回到小镇](需ON),,
75,地图事件,Map032.json MAP032,2,EV002,"(5,4)",1/3,按确定键,开关[第一天NPC位置变化1](需ON),,
76,地图事件,Map032.json MAP032,2,EV002,"(5,4)",1/3,按确定键,开关[第一天NPC位置变化1](需ON),,
78,地图事件,Map011.json MAP011,4,EV004,"(6,8)",1/2,按确定键,开关[夏洛克对话后回到小镇](需ON),,
79,地图事件,Map006.json MAP006,21,EV021,"(20,9)",1/2,按确定键,开关[第一天NPC位置变化1](需ON),,
80,地图事件,Map006.json MAP006,21,EV021,"(20,9)",1/2,按确定键,开关[第一天NPC位置变化1](需ON),,
83,地图事件,Map005.json MAP005,6,EV006,"(4,8)",1/2,按确定键,开关[第一天NPC位置变化1](需ON),,
84,地图事件,Map005.json MAP005,6,EV006,"(4,8)",1/2,按确定键,开关[第一天NPC位置变化1](需ON),,
87,地图事件,Map005.json MAP005,8,EV008,"(20,8)",1/2,按确定键,开关[第一天NPC位置变化1](需ON),,
88,地图事件,Map005.json MAP005,8,EV008,"(20,8)",1/2,按确定键,开关[第一天NPC位置变化1](需ON),,
91,地图事件,Map032.json MAP032,10,EV010,"(0,0)",1/1,按确定键,无条件,,
92,地图事件,Map039.json MAP039,3,EV003,"(0,0)",1/4,自动执行,无条件,,
93,地图事件,Map044.json MAP044,4,EV004,"(10,4)",1/3,按确定键,无条件,,
94,地图事件,Map044.json MAP044,8,EV008,"(1,0)",1/2,自动执行,开关[莉莉亚boss战-胜利](需ON),,
95,地图事件,Map044.json MAP044,10,EV010,"(3,4)",1/2,按确定键,开关[莉莉亚boss战-胜利](需ON),,
96,地图事件,Map009.json MAP009,4,EV004,"(14,6)",1/2,按确定键,无条件,,
101,地图事件,Map042.json MAP042,7,EV007,"(0,0)",1/2,自动执行,开关[莉莉亚boss战-胜利](需ON),,
104,地图事件,Map048.json MAP048,4,EV004,"(6,6)",1/2,按确定键,开关[老板娘在校长室](需ON),,
105,地图事件,Map048.json MAP048,4,EV004,"(6,6)",1/2,按确定键,开关[老板娘在校长室](需ON),,
106,地图事件,Map048.json MAP048,4,EV004,"(6,6)",1/2,按确定键,开关[老板娘在校长室](需ON),,
107,地图事件,Map057.json MAP057,24,EV024,"(54,5)",1/2,按确定键,开关[第一天NPC位置移动2](需ON),,
108,地图事件,Map057.json MAP057,24,EV024,"(54,5)",1/2,按确定键,开关[第一天NPC位置移动2](需ON),,
110,地图事件,Map057.json MAP057,35,EV035,"(55,0)",1/3,自动执行,开关[山洞防玩家走岔路提示](需ON) 且 开关[第一天NPC位置移动2](需ON),,
111,地图事件,Map063.json MAP063,9,EV009,"(3,6)",1/2,按确定键,开关[第一天NPC位置移动2](需ON),,
114,地图事件,Map067.json MAP067,20,EV020,"(32,9)",1/2,按确定键,开关[第一天NPC位置移动2](需ON),,
114,地图事件,Map067.json MAP067,21,EV021,"(34,9)",1/2,按确定键,开关[第一天NPC位置移动2](需ON),,
115,地图事件,Map067.json MAP067,21,EV021,"(34,9)",1/2,按确定键,开关[第一天NPC位置移动2](需ON),,
117,地图事件,Map067.json MAP067,20,EV020,"(32,9)",1/2,按确定键,开关[第一天NPC位置移动2](需ON),,
118,地图事件,Map073.json MAP073,10,EV010,"(5,0)",1/4,事件接触,开关[第一天NPC位置移动2](需ON),,
119,地图事件,Map073.json MAP073,13,EV013,"(5,6)",1/2,按确定键,开关[橘花猫boss战胜利](需ON),,
120,地图事件,Map073.json MAP073,14,EV014,"(3,0)",1/2,自动执行,开关[橘花猫boss战胜利](需ON),,
126,地图事件,Map006.json MAP006,17,EV017,"(34,9)",1/1,按确定键,无条件,,
126,地图事件,Map006.json MAP006,17,EV017,"(34,9)",1/1,按确定键,无条件,,
126,地图事件,Map006.json MAP006,18,EV018,"(15,9)",1/1,按确定键,无条件,,
126,地图事件,Map006.json MAP006,18,EV018,"(15,9)",1/1,按确定键,无条件,,
126,地图事件,Map006.json MAP006,18,EV018,"(15,9)",1/1,按确定键,无条件,,
126,地图事件,Map006.json MAP006,19,EV019,"(18,9)",1/3,按确定键,无条件,,
126,地图事件,Map006.json MAP006,19,EV019,"(18,9)",2/3,按确定键,开关[天空区域开启](需ON),,
126,地图事件,Map006.json MAP006,19,EV019,"(18,9)",3/3,按确定键,开关[第三天开启](需ON),,
126,地图事件,Map007.json MAP007,4,EV004,"(16,9)",1/2,按确定键,无条件,,
126,地图事件,Map007.json MAP007,4,EV004,"(16,9)",1/2,按确定键,无条件,,
126,地图事件,Map007.json MAP007,4,EV004,"(16,9)",2/2,按确定键,开关[第三天夜晚](需ON),,
126,地图事件,Map039.json MAP039,8,EV008,"(41,29)",1/1,按确定键,无条件,,
126,地图事件,Map170.json MAP170,5,EV005,"(21,4)",1/5,按确定键,无条件,,
126,地图事件,Map170.json MAP170,5,EV005,"(21,4)",4/5,按确定键,开关[第三天夜晚](需ON),,
126,地图事件,Map170.json MAP170,5,EV005,"(21,4)",5/5,按确定键,开关[新后日谈第二天夜晚](需ON),,
126,地图事件,Map189.json MAP189,4,EV004,"(9,7)",1/3,按确定键,无条件,,
126,地图事件,Map189.json MAP189,4,EV004,"(9,7)",1/3,按确定键,无条件,,
126,地图事件,Map189.json MAP189,4,EV004,"(9,7)",1/3,按确定键,无条件,,
126,地图事件,Map189.json MAP189,4,EV004,"(9,7)",1/3,按确定键,无条件,,
126,地图事件,Map189.json MAP189,5,EV005,"(29,7)",1/3,按确定键,无条件,,
126,地图事件,Map189.json MAP189,5,EV005,"(29,7)",1/3,按确定键,无条件,,
126,地图事件,Map189.json MAP189,5,EV005,"(29,7)",1/3,按确定键,无条件,,
126,地图事件,Map189.json MAP189,5,EV005,"(29,7)",1/3,按确定键,无条件,,
126,地图事件,Map296.json MAP296,1,EV001,"(28,14)",1/1,按确定键,无条件,,
126,地图事件,Map296.json MAP296,1,EV001,"(28,14)",1/1,按确定键,无条件,,
126,地图事件,Map301.json MAP301,5,EV005,"(11,13)",1/1,按确定键,无条件,,
126,地图事件,Map381.json MAP381,4,EV004,"(16,12)",4/5,按确定键,开关[莉伊进门缝眼睛](需ON),,
130,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:655,
130,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:659,
130,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:663,
130,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:667,
131,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:655,
131,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:659,
131,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:663,
131,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:667,
132,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:655,
132,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:659,
132,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:663,
132,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:667,
133,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:667,
134,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:667,
135,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:667,
138,JS:requestUniqueFloatMessage(),,,,,,,,js/nya/nya_ai.js:852,
139,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:659,
140,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:659,
141,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:659,
143,JS:requestUniqueFloatMessage(),,,,,,,,js/nya/nya_ai.js:791,
145,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:663,
146,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:663,
147,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:663,
150,地图事件,Map170.json MAP170,5,EV005,"(21,4)",1/5,按确定键,无条件,,
151,地图事件,Map039.json MAP039,15,EV015,"(33,25)",1/2,事件接触,开关[第一天夜晚门锁](需ON) 且 开关[从天台进入学校外景](需ON),,
152,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:655,
153,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:655,
154,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:655,
155,公共事件,,95,第一天晚上回家,,,公共事件#95,开关[开场白完成],,
156,地图事件,Map004.json MAP004,8,EV008,"(2,0)",1/8,自动执行,开关[第一天夜晚莉莉亚回家](需ON),,
157,地图事件,Map004.json MAP004,7,EV007,"(5,6)",1/4,按确定键,开关[第一天夜晚莉莉亚回家](需ON),,
158,公共事件,,16,选择简单难度2,,,公共事件#16,开关[开场白完成],,
158,公共事件,,17,选择普通难度2,,,公共事件#17,开关[开场白完成],,
158,公共事件,,18,选择困难难度2,,,公共事件#18,开关[开场白完成],,
162,地图事件,Map004.json MAP004,5,EV005,"(1,4)",3/6,按确定键,开关[第一天夜晚门锁](需ON),,
163,地图事件,Map004.json MAP004,8,EV008,"(2,0)",3/8,自动执行,开关[第二天开启](需ON),,
164,地图事件,Map012.json MAP012,6,EV006,"(1,0)",1/8,自动执行,开关[第一天夜晚莉莉亚回家](需ON),,
165,地图事件,Map012.json MAP012,6,EV006,"(1,0)",1/8,自动执行,开关[第一天夜晚莉莉亚回家](需ON),,
166,地图事件,Map012.json MAP012,6,EV006,"(1,0)",1/8,自动执行,开关[第一天夜晚莉莉亚回家](需ON),,
167,地图事件,Map012.json MAP012,5,EV005,"(13,6)",1/2,按确定键,开关[第一天夜晚莉莉亚回家](需ON),,
168,公共事件,,22,山洞校长主线,,,公共事件#22,开关[开场白完成],,
169,地图事件,Map007.json MAP007,3,EV003,"(7,9)",1/4,按确定键,无条件,,
170,地图事件,Map004.json MAP004,4,EV004,"(3,4)",1/4,按确定键,无条件,,
171,地图事件,Map047.json MAP047,3,EV003,"(5,4)",1/2,按确定键,开关[第一天夜晚](需ON),,
172,地图事件,Map047.json MAP047,3,EV003,"(5,4)",1/2,按确定键,开关[第一天夜晚](需ON),,
172,地图事件,Map047.json MAP047,3,EV003,"(5,4)",1/2,按确定键,开关[第一天夜晚](需ON),,
173,地图事件,Map047.json MAP047,3,EV003,"(5,4)",1/2,按确定键,开关[第一天夜晚](需ON),,
176,地图事件,Map107.json MAP107,4,EV004,"(4,0)",1/3,事件接触,开关[第二天开启](需ON),,
177,地图事件,Map107.json MAP107,5,EV005,"(1,0)",2/3,自动执行,开关[水底莉莉亚胜利](需ON),,
178,地图事件,Map107.json MAP107,6,EV006,"(6,7)",1/2,按确定键,开关[水底莉莉亚胜利](需ON),,
179,地图事件,Map107.json MAP107,6,EV006,"(6,7)",1/2,按确定键,开关[水底莉莉亚胜利](需ON),,
181,地图事件,Map108.json MAP108,6,EV006,"(1,0)",1/2,自动执行,开关[水底莉莉亚胜利](需ON),,
182,地图事件,Map049.json MAP049,3,EV003,"(8,7)",1/2,按确定键,开关[前往天空区域](需ON),,
183,地图事件,Map049.json MAP049,3,EV003,"(8,7)",1/2,按确定键,开关[前往天空区域](需ON),,
183,地图事件,Map049.json MAP049,3,EV003,"(8,7)",1/2,按确定键,开关[前往天空区域](需ON),,
184,地图事件,Map049.json MAP049,3,EV003,"(8,7)",1/2,按确定键,开关[前往天空区域](需ON),,
185,地图事件,Map076.json MAP076,3,EV003,"(5,10)",1/2,按确定键,开关[第二天开启](需ON),,
186,地图事件,Map097.json MAP097,16,EV016,"(11,9)",1/2,按确定键,开关[第二天开启](需ON),,
187,地图事件,Map097.json MAP097,16,EV016,"(11,9)",1/2,按确定键,开关[第二天开启](需ON),,
187,地图事件,Map126.json MAP126,6,EV006,"(16,6)",1/2,按确定键,开关[天空区域开启](需ON),,
188,地图事件,Map037.json MAP037,15,EV015,"(47,0)",1/2,事件接触,开关[前往天空区域](需ON),,
194,地图事件,Map034.json MAP034,14,EV014,"(32,6)",3/4,按确定键,开关[第一天夜晚](需ON),,
194,公共事件,,26,传送门公共事件,,,公共事件#26,开关[开场白完成],,
195,地图事件,Map110.json MAP110,2,EV002,"(0,0)",1/2,自动执行,开关[大蘑菇出现](需ON),,
197,公共事件,,32,水底依铃抓鱼任务,,,公共事件#32,开关[开场白完成],,
198,公共事件,,28,水底依铃支线分支判断,,,公共事件#28,开关[开场白完成],,
199,公共事件,,28,水底依铃支线分支判断,,,公共事件#28,开关[开场白完成],,
200,地图事件,Map102.json MAP102,9,EV009,"(13,6)",1/3,按确定键,开关[第二天开启](需ON),,
201,地图事件,Map102.json MAP102,10,EV010,"(15,6)",1/3,按确定键,开关[第二天开启](需ON),,
204,地图事件,Map093.json MAP093,61,EV061,"(11,28)",1/2,按确定键,开关[第二天开启](需ON),,
205,地图事件,Map093.json MAP093,61,EV061,"(11,28)",1/2,按确定键,开关[第二天开启](需ON),,
206,地图事件,Map093.json MAP093,61,EV061,"(11,28)",1/2,按确定键,开关[第二天开启](需ON),,
209,公共事件,,34,水底露茜亚梅卡闲聊,,,公共事件#34,开关[开场白完成],,
210,公共事件,,34,水底露茜亚梅卡闲聊,,,公共事件#34,开关[开场白完成],,
211,地图事件,Map094.json MAP094,53,EV053,"(13,30)",1/2,按确定键,开关[第二天开启](需ON),,
212,地图事件,Map094.json MAP094,54,EV054,"(15,30)",1/2,按确定键,开关[第二天开启](需ON),,
217,地图事件,Map093.json MAP093,63,EV063,"(9,28)",1/2,按确定键,无条件,,
217,地图事件,Map093.json MAP093,63,EV063,"(9,28)",2/2,按确定键,开关[水底关密码锁打开](需ON),,
218,地图事件,Map093.json MAP093,63,EV063,"(9,28)",1/2,按确定键,无条件,,
219,地图事件,Map093.json MAP093,63,EV063,"(9,28)",1/2,按确定键,无条件,,
220,地图事件,Map089.json MAP089,7,EV007,"(0,0)",1/2,自动执行,开关[水底关密码锁打开](需ON),,
221,地图事件,Map089.json MAP089,7,EV007,"(0,0)",1/2,自动执行,开关[水底关密码锁打开](需ON),,
222,地图事件,Map006.json MAP006,33,EV033,"(13,4)",1/2,按确定键,开关[第二天开启](需ON),,
226,地图事件,Map009.json MAP009,3,EV003,"(4,9)",3/16,按确定键,开关[前往天空区域](需ON),,
227,地图事件,Map004.json MAP004,4,EV004,"(3,4)",2/4,按确定键,开关[前往天空区域](需ON),,
228,地图事件,Map004.json MAP004,5,EV005,"(1,4)",4/6,按确定键,开关[前往天空区域](需ON),,
229,地图事件,Map012.json MAP012,3,EV003,"(13,5)",2/3,按确定键,开关[前往天空区域](需ON),,
230,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:680,
231,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:680,
232,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:680,
233,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:680,
234,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:680,
235,JS:triggerUniqueFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:2234,
237,JS数组(浮动消息),,,,,,,,js/nya/nya_game_system.js:9736,
238,地图事件,Map004.json MAP004,5,EV005,"(1,4)",4/6,按确定键,开关[前往天空区域](需ON),,
238,地图事件,Map004.json MAP004,5,EV005,"(1,4)",4/6,按确定键,开关[前往天空区域](需ON),,
238,地图事件,Map004.json MAP004,5,EV005,"(1,4)",6/6,按确定键,开关[第三天开启](需ON),,
239,地图事件,Map013.json MAP013,8,EV008,"(6,4)",1/2,按确定键,开关[依铃蕾铃从水底回家](需ON),,
240,地图事件,Map013.json MAP013,7,EV007,"(3,8)",1/2,按确定键,开关[依铃蕾铃从水底回家](需ON),,
241,地图事件,Map113.json MAP113,7,EV007,"(0,0)",1/2,自动执行,开关[天空区域开启](需ON),,
242,地图事件,Map152.json MAP152,5,EV005,"(0,0)",1/3,自动执行,开关[天空区域开启](需ON),,
243,地图事件,Map006.json MAP006,19,EV019,"(18,9)",2/3,按确定键,开关[天空区域开启](需ON),,
244,地图事件,Map066.json MAP066,9,EV009,"(11,6)",1/2,按确定键,开关[天空区域开启](需ON),,
245,公共事件,,39,梅卡喂猫牛对话判断,,,公共事件#39,开关[开场白完成],,
246,公共事件,,39,梅卡喂猫牛对话判断,,,公共事件#39,开关[开场白完成],,
251,地图事件,Map171.json MAP171,4,EV004,"(13,16)",1/2,按确定键,开关[老板娘战后对话完](需ON),,
252,地图事件,Map113.json MAP113,14,EV014,"(2,34)",1/3,按确定键,开关[天空区域开启](需ON),,
253,地图事件,Map113.json MAP113,14,EV014,"(2,34)",1/3,按确定键,开关[天空区域开启](需ON),,
254,地图事件,Map126.json MAP126,6,EV006,"(16,6)",1/2,按确定键,开关[天空区域开启](需ON),,
255,地图事件,Map010.json MAP010,5,EV005,"(8,6)",1/2,按确定键,开关[天空区域开启](需ON),,
256,地图事件,Map039.json MAP039,17,EV017,"(2,0)",1/2,自动执行,开关[老板娘BOSS战胜利](需ON),,
257,地图事件,Map039.json MAP039,18,EV018,"(70,49)",1/2,按确定键,开关[老板娘BOSS战胜利](需ON),,
258,地图事件,Map170.json MAP170,5,EV005,"(21,4)",1/5,按确定键,无条件,,
259,地图事件,Map171.json MAP171,3,EV003,"(1,0)",1/2,自动执行,开关[老板娘战后对话完](需ON),,
260,公共事件,,42,烤鱼派对小演出,,,公共事件#42,开关[开场白完成],,
261,公共事件,,42,烤鱼派对小演出,,,公共事件#42,开关[开场白完成],,
262,公共事件,,42,烤鱼派对小演出,,,公共事件#42,开关[开场白完成],,
263,地图事件,Map007.json MAP007,3,EV003,"(7,9)",1/4,按确定键,无条件,,
263,地图事件,Map007.json MAP007,4,EV004,"(16,9)",1/2,按确定键,无条件,,
264,地图事件,Map004.json MAP004,8,EV008,"(2,0)",5/8,自动执行,开关[老板娘战后对话完](需ON),,
265,地图事件,Map039.json MAP039,33,EV033,"(52,28)",1/2,事件接触,开关[烤鱼派对结束](需ON),,
266,地图事件,Map039.json MAP039,31,EV031,"(52,29)",2/4,按确定键,开关[烤鱼派对结束](需ON),,
267,地图事件,Map171.json MAP171,6,EV006,"(14,16)",1/1,按确定键,无条件,,
268,地图事件,Map171.json MAP171,8,EV008,"(5,12)",1/1,按确定键,无条件,,
269,地图事件,Map171.json MAP171,10,EV010,"(11,8)",1/1,按确定键,无条件,,
270,地图事件,Map171.json MAP171,11,EV011,"(13,13)",1/1,按确定键,无条件,,
271,地图事件,Map171.json MAP171,9,EV009,"(3,17)",1/1,按确定键,无条件,,
272,地图事件,Map171.json MAP171,7,EV007,"(16,7)",1/2,按确定键,开关[老板娘战后对话完](需ON),,
273,地图事件,Map171.json MAP171,7,EV007,"(16,7)",1/2,按确定键,开关[老板娘战后对话完](需ON),,
274,地图事件,Map007.json MAP007,4,EV004,"(16,9)",1/2,按确定键,无条件,,
275,地图事件,Map155.json MAP155,3,EV003,"(0,0)",1/2,自动执行,开关[结界入口开启](需ON),,
276,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:695,
277,JS:triggerUniqueFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:4537,
278,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:695,
279,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:695,
280,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:695,
281,地图事件,Map039.json MAP039,34,EV034,"(52,27)",1/2,按确定键,开关[结界入口开启](需ON),,
281,地图事件,Map217.json MAP217,7,EV007,"(11,8)",1/2,按确定键,开关[德古拉准备开启结界](需ON),,
282,JS:lockTextBalloon(),,,,,,,,js/nya/nya_game.js:3829,
283,JS:lockTextBalloon(),,,,,,,,js/nya/nya_game.js:3839,
284,地图事件,Map039.json MAP039,31,EV031,"(52,29)",2/4,按确定键,开关[烤鱼派对结束](需ON),,
285,地图事件,Map169.json MAP169,26,EV026,"(2,0)",2/4,自动执行,独立开关A=ON,,
286,地图事件,Map169.json MAP169,24,EV024,"(53,12)",3/4,自动执行,开关[恶魔墙胜利](需ON),,
287,地图事件,Map172.json MAP172,10,EV010,"(0,0)",1/2,自动执行,开关[恶魔墙胜利](需ON),,
288,地图事件,Map173.json MAP173,11,EV011,"(2,22)",1/2,按确定键,开关[老板娘战后对话完](需ON),,
289,地图事件,Map039.json MAP039,31,EV031,"(52,29)",2/4,按确定键,开关[烤鱼派对结束](需ON),,
290,地图事件,Map173.json MAP173,11,EV011,"(2,22)",1/2,按确定键,开关[老板娘战后对话完](需ON),,
290,地图事件,Map248.json MAP248,33,EV033,"(5,56)",1/2,按确定键,开关[德古拉准备开启结界](需ON),,
290,地图事件,Map282.json MAP282,21,EV021,"(65,7)",1/2,按确定键,开关[第四天开启](需ON),,
291,地图事件,Map181.json MAP181,19,EV019,"(5,0)",1/2,自动执行,开关[恶魔墙胜利](需ON),,
292,地图事件,Map181.json MAP181,2,EV002,"(20,20)",1/5,按确定键,开关[恶魔墙胜利](需ON),,
293,地图事件,Map173.json MAP173,12,EV012,"(1,0)",1/2,自动执行,开关[恶魔墙胜利](需ON),,
294,地图事件,Map171.json MAP171,13,EV013,"(2,0)",1/3,自动执行,开关[结界入口开启](需ON),,
295,地图事件,Map171.json MAP171,4,EV004,"(13,16)",1/2,按确定键,开关[老板娘战后对话完](需ON),,
296,地图事件,Map171.json MAP171,7,EV007,"(16,7)",1/2,按确定键,开关[老板娘战后对话完](需ON),,
297,地图事件,Map171.json MAP171,7,EV007,"(16,7)",1/2,按确定键,开关[老板娘战后对话完](需ON),,
298,地图事件,Map182.json MAP182,3,EV003,"(0,0)",1/6,自动执行,开关[喵朵露BOSS战胜利](需ON),,
299,地图事件,Map182.json MAP182,3,EV003,"(0,0)",1/6,自动执行,开关[喵朵露BOSS战胜利](需ON),,
300,地图事件,Map174.json MAP174,217,EV217,"(26,46)",1/2,按确定键,开关[莉莉亚走丢](需ON),,
301,地图事件,Map039.json MAP039,31,EV031,"(52,29)",3/4,事件接触,开关[封印结界调查完毕](需ON),,
302,地图事件,Map007.json MAP007,3,EV003,"(7,9)",1/4,按确定键,无条件,,
303,地图事件,Map004.json MAP004,8,EV008,"(2,0)",7/8,自动执行,开关[封印结界调查完毕](需ON),,
304,地图事件,Map004.json MAP004,5,EV005,"(1,4)",5/6,按确定键,开关[封印结界调查完毕](需ON),,
305,地图事件,Map182.json MAP182,3,EV003,"(0,0)",1/6,自动执行,开关[喵朵露BOSS战胜利](需ON),,
308,地图事件,Map182.json MAP182,4,EV004,"(12,11)",1/6,按确定键,开关[恶魔墙胜利](需ON),,
308,地图事件,Map182.json MAP182,4,EV004,"(12,11)",2/6,按确定键,开关[恶魔墙胜利](需ON) 且 独立开关A=ON,,
308,地图事件,Map182.json MAP182,4,EV004,"(12,11)",3/6,按确定键,开关[恶魔墙胜利](需ON) 且 独立开关B=ON,,
309,地图事件,Map182.json MAP182,4,EV004,"(12,11)",1/6,按确定键,开关[恶魔墙胜利](需ON),,
310,地图事件,Map182.json MAP182,4,EV004,"(12,11)",2/6,按确定键,开关[恶魔墙胜利](需ON) 且 独立开关A=ON,,
311,地图事件,Map182.json MAP182,4,EV004,"(12,11)",3/6,按确定键,开关[恶魔墙胜利](需ON) 且 独立开关B=ON,,
312,地图事件,Map182.json MAP182,4,EV004,"(12,11)",4/6,按确定键,开关[恶魔墙胜利](需ON) 且 独立开关C=ON,,
313,地图事件,Map006.json MAP006,24,EV024,"(4,9)",1/2,按确定键,开关[第三天开启](需ON),,
313,地图事件,Map006.json MAP006,25,EV025,"(6,9)",1/2,按确定键,开关[第三天开启](需ON),,
314,地图事件,Map006.json MAP006,25,EV025,"(6,9)",1/2,按确定键,开关[第三天开启](需ON),,
315,地图事件,Map006.json MAP006,24,EV024,"(4,9)",1/2,按确定键,开关[第三天开启](需ON),,
320,地图事件,Map004.json MAP004,7,EV007,"(5,6)",3/4,按确定键,开关[封印结界调查完毕](需ON),,
322,地图事件,Map007.json MAP007,3,EV003,"(7,9)",2/4,按确定键,开关[第三天开启](需ON),,
323,地图事件,Map007.json MAP007,3,EV003,"(7,9)",2/4,按确定键,开关[第三天开启](需ON),,
324,地图事件,Map135.json MAP135,5,EV005,"(25,6)",1/2,按确定键,开关[第三天开启](需ON),,
324,地图事件,Map135.json MAP135,6,EV006,"(26,6)",1/2,按确定键,开关[第三天开启](需ON),,
325,地图事件,Map135.json MAP135,6,EV006,"(26,6)",1/2,按确定键,开关[第三天开启](需ON),,
326,地图事件,Map135.json MAP135,5,EV005,"(25,6)",1/2,按确定键,开关[第三天开启](需ON),,
327,地图事件,Map009.json MAP009,3,EV003,"(4,9)",5/16,按确定键,开关[第三天开启](需ON),,
328,地图事件,Map039.json MAP039,35,EV035,"(32,15)",1/3,按确定键,开关[第三天开启](需ON),,
329,地图事件,Map039.json MAP039,35,EV035,"(32,15)",1/3,按确定键,开关[第三天开启](需ON),,
330,地图事件,Map192.json MAP192,10,EV010,"(1,0)",1/2,自动执行,开关[莲boss战准备](需ON),,
331,地图事件,Map192.json MAP192,20,EV020,"(18,7)",1/2,自动执行,开关[莲boss战胜利](需ON),,莲BOSS战胜利后的NPC事件
332,地图事件,Map191.json MAP191,3,EV003,"(4,5)",1/3,按确定键,开关[莲boss战胜利](需ON),,
334,地图事件,Map191.json MAP191,3,EV003,"(4,5)",1/3,按确定键,开关[莲boss战胜利](需ON),,
335,地图事件,Map191.json MAP191,3,EV003,"(4,5)",1/3,按确定键,开关[莲boss战胜利](需ON),,
336,地图事件,Map191.json MAP191,3,EV003,"(4,5)",1/3,按确定键,开关[莲boss战胜利](需ON),,
337,地图事件,Map191.json MAP191,3,EV003,"(4,5)",1/3,按确定键,开关[莲boss战胜利](需ON),,
338,地图事件,Map191.json MAP191,3,EV003,"(4,5)",1/3,按确定键,开关[莲boss战胜利](需ON),,
339,地图事件,Map191.json MAP191,3,EV003,"(4,5)",1/3,按确定键,开关[莲boss战胜利](需ON),,
340,地图事件,Map184.json MAP184,498,EV498,"(32,142)",1/2,按确定键,开关[第三天开启](需ON),,
341,地图事件,Map184.json MAP184,498,EV498,"(32,142)",1/2,按确定键,开关[第三天开启](需ON),,
342,地图事件,Map184.json MAP184,497,EV497,"(64,0)",1/3,自动执行,变量[莲对话进度]>=1,,
343,地图事件,Map006.json MAP006,38,EV038,"(32,9)",1/3,按确定键,开关[恶魔城莉莉亚入队](需ON),,
344,地图事件,Map006.json MAP006,38,EV038,"(32,9)",1/3,按确定键,开关[恶魔城莉莉亚入队](需ON),,
345,地图事件,Map007.json MAP007,3,EV003,"(7,9)",3/4,按确定键,变量[莲对话进度]>=1,,
346,地图事件,Map012.json MAP012,6,EV006,"(1,0)",4/8,自动执行,变量[莲对话进度]>=1,,
347,公共事件,,26,传送门公共事件,,,公共事件#26,开关[开场白完成],,
347,公共事件,,26,传送门公共事件,,,公共事件#26,开关[开场白完成],,
347,公共事件,,26,传送门公共事件,,,公共事件#26,开关[开场白完成],,
348,地图事件,Map098.json MAP098,159,EV159,"(4,6)",1/3,按确定键,变量[莲对话进度]>=1,,
349,地图事件,Map098.json MAP098,161,EV161,"(7,6)",1/3,按确定键,变量[莲对话进度]>=1,,
350,地图事件,Map039.json MAP039,50,EV050,"(74,49)",1/3,按确定键,变量[莲对话进度]>=1,,
350,地图事件,Map039.json MAP039,51,EV051,"(76,51)",1/3,按确定键,变量[莲对话进度]>=1,,
351,地图事件,Map039.json MAP039,50,EV050,"(74,49)",1/3,按确定键,变量[莲对话进度]>=1,,
352,地图事件,Map039.json MAP039,51,EV051,"(76,51)",1/3,按确定键,变量[莲对话进度]>=1,,
353,地图事件,Map045.json MAP045,5,EV005,"(6,5)",1/3,按确定键,变量[莲对话进度]>=1,,
354,地图事件,Map045.json MAP045,5,EV005,"(6,5)",1/3,按确定键,变量[莲对话进度]>=1,,
355,地图事件,Map045.json MAP045,5,EV005,"(6,5)",1/3,按确定键,变量[莲对话进度]>=1,,
356,地图事件,Map191.json MAP191,3,EV003,"(4,5)",1/3,按确定键,开关[莲boss战胜利](需ON),,
357,地图事件,Map191.json MAP191,3,EV003,"(4,5)",1/3,按确定键,开关[莲boss战胜利](需ON),,
358,地图事件,Map191.json MAP191,3,EV003,"(4,5)",1/3,按确定键,开关[莲boss战胜利](需ON),,
359,地图事件,Map214.json MAP214,1,EV001,"(41,25)",1/2,事件接触,开关[恶魔城莉莉亚入队](需ON),,
359,地图事件,Map223.json MAP223,3,EV003,"(0,0)",1/2,自动执行,开关[恶魔城莉莉亚入队](需ON),,
360,地图事件,Map224.json MAP224,5,EV005,"(9,0)",1/3,事件接触,开关[恶魔城莉莉亚离队](需ON),,
361,地图事件,Map223.json MAP223,5,EV005,"(4,6)",1/2,按确定键,开关[恶魔城莉莉亚入队](需ON),,
362,地图事件,Map223.json MAP223,5,EV005,"(4,6)",1/2,按确定键,开关[恶魔城莉莉亚入队](需ON),,
363,地图事件,Map196.json MAP196,3,EV003,"(0,0)",1/2,自动执行,开关[德古拉胜利](需ON),,
364,地图事件,Map196.json MAP196,3,EV003,"(0,0)",1/2,自动执行,开关[德古拉胜利](需ON),,
365,地图事件,Map196.json MAP196,2,EV002,"(4,7)",1/3,按确定键,开关[德古拉胜利](需ON),,
366,地图事件,Map224.json MAP224,10,EV010,"(7,8)",1/2,按确定键,开关[管家来到大厅](需ON),,
367,地图事件,Map004.json MAP004,11,EV011,"(5,0)",1/2,自动执行,开关[德古拉交谈完](需ON),,
367,地图事件,Map006.json MAP006,43,EV043,"(4,0)",1/2,自动执行,开关[德古拉交谈完](需ON),,
367,地图事件,Map223.json MAP223,6,EV006,"(1,0)",1/2,自动执行,开关[德古拉交谈完](需ON),,
368,地图事件,Map196.json MAP196,2,EV002,"(4,7)",2/3,按确定键,开关[喵露露折返](需ON),,
369,地图事件,Map196.json MAP196,2,EV002,"(4,7)",2/3,按确定键,开关[喵露露折返](需ON),,
370,地图事件,Map217.json MAP217,7,EV007,"(11,8)",1/2,按确定键,开关[德古拉准备开启结界](需ON),,
372,地图事件,Map170.json MAP170,5,EV005,"(21,4)",2/5,按确定键,开关[封印结界调查完毕](需ON),,
374,公共事件,,20,喵露露还钱,,,公共事件#20,开关[开场白完成],,
375,公共事件,,20,喵露露还钱,,,公共事件#20,开关[开场白完成],,
376,地图事件,Map188.json MAP188,7,EV007,"(21,8)",1/3,按确定键,开关[天空莉莉亚分头行动](需ON),,
377,地图事件,Map188.json MAP188,7,EV007,"(21,8)",1/3,按确定键,开关[天空莉莉亚分头行动](需ON),,
378,地图事件,Map192.json MAP192,23,EV023,"(5,7)",1/2,按确定键,开关[图书馆莉莉亚被推下去](需ON),,
379,地图事件,Map007.json MAP007,15,EV015,"(30,9)",1/3,按确定键,开关[老板娘战后对话完](需ON),,
380,地图事件,Map170.json MAP170,6,EV006,"(14,4)",1/1,按确定键,无条件,,
381,地图事件,Map007.json MAP007,3,EV003,"(7,9)",1/4,按确定键,无条件,,
382,地图事件,Map215.json MAP215,2,EV002,"(7,29)",1/2,按确定键,开关[恶魔城莉莉亚离队](需ON),,
383,地图事件,Map215.json MAP215,2,EV002,"(7,29)",1/2,按确定键,开关[恶魔城莉莉亚离队](需ON),,
384,地图事件,Map239.json MAP239,11,EV011,"(0,0)",1/2,自动执行,开关[德古拉准备开启结界](需ON),,
385,地图事件,Map264.json MAP264,14,EV014,"(4,0)",1/3,事件接触,开关[初遇结界2](需ON),,
386,地图事件,Map264.json MAP264,18,EV018,"(3,9)",2/3,按确定键,开关[心魔莉莉亚胜利](需ON),,
387,地图事件,Map182.json MAP182,3,EV003,"(0,0)",3/6,自动执行,开关[心魔莉莉亚胜利](需ON),,
388,地图事件,Map004.json MAP004,10,EV010,"(4,0)",3/4,自动执行,开关[第二次离开结界](需ON),,
389,地图事件,Map004.json MAP004,10,EV010,"(4,0)",3/4,自动执行,开关[第二次离开结界](需ON),,
390,地图事件,Map039.json MAP039,52,EV052,"(45,41)",1/2,按确定键,开关[第四天开启](需ON),,
391,地图事件,Map284.json MAP284,16,EV016,"(15,20)",1/2,事件接触,开关[雪原任务开启](需ON),,
392,地图事件,Map295.json MAP295,2,EV002,"(4,0)",1/3,事件接触,开关[雪原任务开启](需ON),,
393,地图事件,Map296.json MAP296,9,EV009,"(13,18)",1/2,按确定键,开关[心渊BOSS战胜利](需ON),,
394,地图事件,Map296.json MAP296,9,EV009,"(13,18)",1/2,按确定键,开关[心渊BOSS战胜利](需ON),,
395,地图事件,Map007.json MAP007,3,EV003,"(7,9)",4/4,按确定键,开关[恶魔城莉莉亚入队](需ON),,
396,地图事件,Map009.json MAP009,3,EV003,"(4,9)",7/16,按确定键,开关[第三天夜晚](需ON),,
397,地图事件,Map009.json MAP009,3,EV003,"(4,9)",8/16,按确定键,开关[第四天开启](需ON),,
398,地图事件,Map248.json MAP248,33,EV033,"(5,56)",1/2,按确定键,开关[德古拉准备开启结界](需ON),,
399,地图事件,Map282.json MAP282,21,EV021,"(65,7)",1/2,按确定键,开关[第四天开启](需ON),,
400,地图事件,Map039.json MAP039,4,EV004,"(54,29)",1/4,按确定键,开关[前往天空区域](需ON),,
401,地图事件,Map039.json MAP039,31,EV031,"(52,29)",1/4,按确定键,开关[烤鱼派对开始](需ON),,
402,地图事件,Map170.json MAP170,7,EV007,"(17,4)",1/2,按确定键,开关[第二天开启](需ON),,
403,地图事件,Map170.json MAP170,5,EV005,"(21,4)",1/5,按确定键,无条件,,
404,地图事件,Map009.json MAP009,7,EV007,"(8,10)",1/2,按确定键,开关[第四天开启](需ON),,
404,地图事件,Map009.json MAP009,7,EV007,"(8,10)",1/2,按确定键,开关[第四天开启](需ON),,
405,地图事件,Map009.json MAP009,7,EV007,"(8,10)",1/2,按确定键,开关[第四天开启](需ON),,
405,地图事件,Map009.json MAP009,7,EV007,"(8,10)",1/2,按确定键,开关[第四天开启](需ON),,
406,地图事件,Map171.json MAP171,15,EV015,"(6,11)",1/2,按确定键,开关[雪原任务开启](需ON),,
407,地图事件,Map186.json MAP186,2,EV002,"(8,7)",1/2,按确定键,开关[第四天开启](需ON),,
408,地图事件,Map186.json MAP186,2,EV002,"(8,7)",1/2,按确定键,开关[第四天开启](需ON),,
409,地图事件,Map186.json MAP186,2,EV002,"(8,7)",1/2,按确定键,开关[第四天开启](需ON),,
410,地图事件,Map252.json MAP252,2,EV002,"(15,7)",1/1,按确定键,无条件,,
411,地图事件,Map253.json MAP253,2,EV002,"(16,7)",1/2,按确定键,无条件,,
412,地图事件,Map187.json MAP187,3,EV003,"(9,6)",1/2,按确定键,开关[第三天夜晚](需ON),,
413,地图事件,Map213.json MAP213,7,EV007,"(10,7)",1/2,按确定键,开关[第二天开启](需ON),,
414,地图事件,Map282.json MAP282,22,EV022,"(130,9)",1/2,按确定键,开关[前往天空区域](需ON),,
414,地图事件,Map282.json MAP282,22,EV022,"(130,9)",1/2,按确定键,开关[前往天空区域](需ON),,
415,地图事件,Map282.json MAP282,22,EV022,"(130,9)",1/2,按确定键,开关[前往天空区域](需ON),,
415,地图事件,Map282.json MAP282,22,EV022,"(130,9)",1/2,按确定键,开关[前往天空区域](需ON),,
416,地图事件,Map171.json MAP171,14,EV014,"(16,12)",1/2,按确定键,开关[第三天开启](需ON),,
417,地图事件,Map223.json MAP223,1,EV001,"(6,6)",1/2,按确定键,开关[第四天开启](需ON),,
418,地图事件,Map223.json MAP223,1,EV001,"(6,6)",1/2,按确定键,开关[第四天开启](需ON),,
419,地图事件,Map223.json MAP223,2,EV002,"(14,10)",1/2,按确定键,开关[第四天开启](需ON),,
419,地图事件,Map223.json MAP223,2,EV002,"(14,10)",1/2,按确定键,开关[第四天开启](需ON),,
420,地图事件,Map045.json MAP045,6,EV006,"(10,5)",1/4,自动执行,开关[开场白完成](需ON),,
421,地图事件,Map005.json MAP005,14,EV014,"(18,8)",1/2,按确定键,开关[第四天开启](需ON),,
424,地图事件,Map005.json MAP005,15,EV015,"(22,8)",1/2,按确定键,开关[第四天开启](需ON),,
425,地图事件,Map005.json MAP005,16,EV016,"(24,8)",1/2,按确定键,开关[第四天开启](需ON),,
428,地图事件,Map005.json MAP005,5,EV005,"(17,8)",1/2,按确定键,开关[第四天开启](需ON),,
428,地图事件,Map007.json MAP007,30,EV030,"(41,9)",1/2,按确定键,开关[首次进入星之海](需ON),,
429,地图事件,Map005.json MAP005,5,EV005,"(17,8)",1/2,按确定键,开关[第四天开启](需ON),,
429,地图事件,Map007.json MAP007,30,EV030,"(41,9)",1/2,按确定键,开关[首次进入星之海](需ON),,
432,地图事件,Map050.json MAP050,11,EV011,"(10,5)",1/2,按确定键,开关[第四天开启](需ON),,
433,地图事件,Map050.json MAP050,10,EV010,"(8,5)",1/2,按确定键,开关[第四天开启](需ON),,
434,地图事件,Map050.json MAP050,10,EV010,"(8,5)",1/2,按确定键,开关[第四天开启](需ON),,
435,地图事件,Map050.json MAP050,10,EV010,"(8,5)",1/2,按确定键,开关[第四天开启](需ON),,
436,地图事件,Map009.json MAP009,3,EV003,"(4,9)",8/16,按确定键,开关[第四天开启](需ON),,
437,地图事件,Map009.json MAP009,7,EV007,"(8,10)",1/2,按确定键,开关[第四天开启](需ON),,
438,地图事件,Map186.json MAP186,2,EV002,"(8,7)",1/2,按确定键,开关[第四天开启](需ON),,
439,地图事件,Map282.json MAP282,22,EV022,"(130,9)",1/2,按确定键,开关[前往天空区域](需ON),,
440,地图事件,Map223.json MAP223,1,EV001,"(6,6)",1/2,按确定键,开关[第四天开启](需ON),,
441,地图事件,Map223.json MAP223,2,EV002,"(14,10)",1/2,按确定键,开关[第四天开启](需ON),,
442,地图事件,Map223.json MAP223,2,EV002,"(14,10)",1/2,按确定键,开关[第四天开启](需ON),,
442,地图事件,Map223.json MAP223,2,EV002,"(14,10)",1/2,按确定键,开关[第四天开启](需ON),,
443,地图事件,Map009.json MAP009,8,EV008,"(14,10)",1/1,按确定键,开关[恶魔城莉莉亚入队](需ON),,
446,地图事件,Map009.json MAP009,8,EV008,"(14,10)",1/1,按确定键,开关[恶魔城莉莉亚入队](需ON),,
446,地图事件,Map296.json MAP296,33,EV033,"(15,18)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
446,地图事件,Map349.json MAP349,3,EV003,"(14,12)",1/2,按确定键,开关[传送魔法失效](需ON),,
449,地图事件,Map009.json MAP009,10,EV010,"(0,0)",6/10,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1,,
449,地图事件,Map296.json MAP296,34,EV034,"(4,0)",6/11,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1,,
450,地图事件,Map009.json MAP009,10,EV010,"(0,0)",5/10,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1,,
450,地图事件,Map296.json MAP296,34,EV034,"(4,0)",5/11,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1,,
451,地图事件,Map009.json MAP009,10,EV010,"(0,0)",3/10,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON),,
451,地图事件,Map009.json MAP009,10,EV010,"(0,0)",5/10,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1,,
451,地图事件,Map296.json MAP296,34,EV034,"(4,0)",3/11,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON),,
451,地图事件,Map296.json MAP296,34,EV034,"(4,0)",5/11,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1,,
452,地图事件,Map009.json MAP009,10,EV010,"(0,0)",4/10,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON),,
452,地图事件,Map296.json MAP296,34,EV034,"(4,0)",4/11,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON),,
453,地图事件,Map009.json MAP009,10,EV010,"(0,0)",3/10,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON),,
453,地图事件,Map296.json MAP296,34,EV034,"(4,0)",3/11,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON),,
454,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:710,
455,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:710,
456,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:710,
457,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:710,
458,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:725,
459,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:725,
460,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:725,
461,JS数组(浮动消息),,,,,,,,js/nya/nya_ai.js:725,
462,地图事件,Map007.json MAP007,24,EV024,"(38,9)",4/4,按确定键,无条件,,
462,地图事件,Map296.json MAP296,12,EV012,"(18,16)",4/4,按确定键,无条件,,
462,地图事件,Map349.json MAP349,10,EV010,"(1,12)",4/4,按确定键,无条件,,
466,地图事件,Map005.json MAP005,4,EV004,"(0,8)",1/4,按确定键,无条件,,
466,地图事件,Map034.json MAP034,14,EV014,"(32,6)",1/4,按确定键,无条件,,
467,地图事件,Map254.json MAP254,2,EV002,"(0,0)",1/3,自动执行,无条件,,
468,地图事件,Map181.json MAP181,21,EV021,"(0,20)",2/3,按确定键,开关[喵朵露BOSS战胜利](需ON),,
472,地图事件,Map009.json MAP009,9,EV009,"(8,6)",1/4,按确定键,开关[心渊BOSS战胜利](需ON),,
473,公共事件,,73,手办屋前置处理,,,公共事件#73,开关[开场白完成],,
478,地图事件,Map168.json MAP168,3,EV003,"(0,0)",1/2,自动执行,开关[恶魔墙喵露露逃走](需ON),,
479,地图事件,Map169.json MAP169,1,EV001,"(54,11)",2/3,按确定键,开关[已触发喵露露逃走](需ON),,
480,地图事件,Map299.json MAP299,1,EV001,"(0,0)",1/2,自动执行,无条件,,
481,公共事件,,80,游戏机前置条件检查,,,公共事件#80,开关[开场白完成],,
482,地图事件,Map009.json MAP009,10,EV010,"(0,0)",3/10,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON),,
482,地图事件,Map009.json MAP009,10,EV010,"(0,0)",4/10,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON),,
482,地图事件,Map009.json MAP009,10,EV010,"(0,0)",5/10,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1,,
482,地图事件,Map009.json MAP009,10,EV010,"(0,0)",6/10,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1,,
482,地图事件,Map009.json MAP009,10,EV010,"(0,0)",7/10,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2,,
482,地图事件,Map009.json MAP009,10,EV010,"(0,0)",8/10,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2,,
482,地图事件,Map009.json MAP009,10,EV010,"(0,0)",9/10,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3,,
482,地图事件,Map009.json MAP009,10,EV010,"(0,0)",10/10,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3,,
482,地图事件,Map296.json MAP296,34,EV034,"(4,0)",3/11,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON),,
482,地图事件,Map296.json MAP296,34,EV034,"(4,0)",4/11,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON),,
482,地图事件,Map296.json MAP296,34,EV034,"(4,0)",5/11,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1,,
482,地图事件,Map296.json MAP296,34,EV034,"(4,0)",6/11,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1,,
482,地图事件,Map296.json MAP296,34,EV034,"(4,0)",7/11,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2,,
482,地图事件,Map296.json MAP296,34,EV034,"(4,0)",8/11,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2,,
482,地图事件,Map296.json MAP296,34,EV034,"(4,0)",9/11,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3,,
482,地图事件,Map296.json MAP296,34,EV034,"(4,0)",10/11,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3,,
483,地图事件,Map300.json MAP300,19,EV019,"(0,0)",1/2,自动执行,无条件,,
486,JS:lockTextBalloon(),,,,,,,,js/nya/nya_game.js:3841,
487,JS:lockTextBalloon(),,,,,,,,js/nya/nya_game.js:3831,
489,地图事件,Map301.json MAP301,2,EV002,"(0,0)",1/2,自动执行,开关[心渊BOSS战胜利](需ON),,
490,地图事件,Map296.json MAP296,15,EV015,"(37,13)",1/5,按确定键,开关[心渊家剧情转场](需ON),,
491,地图事件,Map296.json MAP296,15,EV015,"(37,13)",1/5,按确定键,开关[心渊家剧情转场](需ON),,
492,公共事件,,90,传送点1000猫币判断,,,公共事件#90,开关[开场白完成],,
493,公共事件,,90,传送点1000猫币判断,,,公共事件#90,开关[开场白完成],,
494,地图事件,Map301.json MAP301,3,EV003,"(10,9)",1/4,按确定键,开关[心渊家剧情转场](需ON),,
494,地图事件,Map301.json MAP301,3,EV003,"(10,9)",1/4,按确定键,开关[心渊家剧情转场](需ON),,
495,地图事件,Map301.json MAP301,3,EV003,"(10,9)",1/4,按确定键,开关[心渊家剧情转场](需ON),,
496,地图事件,Map301.json MAP301,3,EV003,"(10,9)",1/4,按确定键,开关[心渊家剧情转场](需ON),,
497,地图事件,Map301.json MAP301,3,EV003,"(10,9)",1/4,按确定键,开关[心渊家剧情转场](需ON),,
498,地图事件,Map301.json MAP301,3,EV003,"(10,9)",1/4,按确定键,开关[心渊家剧情转场](需ON),,
499,地图事件,Map301.json MAP301,2,EV002,"(0,0)",1/2,自动执行,开关[心渊BOSS战胜利](需ON),,
500,地图事件,Map296.json MAP296,16,EV016,"(1,0)",1/2,自动执行,开关[心渊家剧情转场](需ON),,
501,地图事件,Map296.json MAP296,15,EV015,"(37,13)",1/5,按确定键,开关[心渊家剧情转场](需ON),,
503,公共事件,,90,传送点1000猫币判断,,,公共事件#90,开关[开场白完成],,
504,地图事件,Map006.json MAP006,30,EV030,"(29,0)",1/2,事件接触,开关[第一天夜晚](需ON),,
504,地图事件,Map006.json MAP006,31,EV031,"(11,0)",1/2,事件接触,开关[第一天夜晚](需ON),,
504,地图事件,Map007.json MAP007,20,EV020,"(32,0)",1/2,事件接触,开关[第一天夜晚](需ON),,
505,地图事件,Map301.json MAP301,3,EV003,"(10,9)",1/4,按确定键,开关[心渊家剧情转场](需ON),,
505,地图事件,Map301.json MAP301,3,EV003,"(10,9)",1/4,按确定键,开关[心渊家剧情转场](需ON),,
506,地图事件,Map301.json MAP301,3,EV003,"(10,9)",1/4,按确定键,开关[心渊家剧情转场](需ON),,
507,地图事件,Map301.json MAP301,7,EV007,"(17,9)",1/1,按确定键,无条件,,
508,地图事件,Map301.json MAP301,8,EV008,"(9,4)",1/2,按确定键,无条件,,
509,地图事件,Map296.json MAP296,2,EV002,"(40,11)",1/5,按确定键,无条件,,
509,地图事件,Map296.json MAP296,2,EV002,"(40,11)",4/5,按确定键,开关[后日谈](需ON) 且 开关[新结局后日谈](需ON),,
510,地图事件,Map296.json MAP296,15,EV015,"(37,13)",2/5,按确定键,开关[首次进入星之海](需ON),,
511,地图事件,Map296.json MAP296,17,EV017,"(42,13)",1/2,按确定键,开关[校长出现在雪原](需ON),,
512,地图事件,Map296.json MAP296,17,EV017,"(42,13)",1/2,按确定键,开关[校长出现在雪原](需ON),,
513,地图事件,Map303.json MAP303,1,EV001,"(0,0)",1/3,自动执行,开关[首次进入星之海](需ON),,
514,地图事件,Map296.json MAP296,15,EV015,"(37,13)",2/5,按确定键,开关[首次进入星之海](需ON),,
514,地图事件,Map296.json MAP296,17,EV017,"(42,13)",1/2,按确定键,开关[校长出现在雪原](需ON),,
515,地图事件,Map007.json MAP007,21,EV021,"(25,4)",1/4,按确定键,开关[首次进入星之海](需ON),,
516,地图事件,Map007.json MAP007,21,EV021,"(25,4)",1/4,按确定键,开关[首次进入星之海](需ON),,
517,地图事件,Map007.json MAP007,21,EV021,"(25,4)",1/4,按确定键,开关[首次进入星之海](需ON),,
518,地图事件,Map039.json MAP039,53,EV053,"(71,49)",1/2,按确定键,开关[首次进入星之海](需ON),,
519,地图事件,Map039.json MAP039,53,EV053,"(71,49)",1/2,按确定键,开关[首次进入星之海](需ON),,
520,地图事件,Map196.json MAP196,1,EV001,"(15,5)",1/2,按确定键,开关[首次进入星之海](需ON),,
521,地图事件,Map196.json MAP196,1,EV001,"(15,5)",1/2,按确定键,开关[首次进入星之海](需ON),,
522,地图事件,Map191.json MAP191,4,EV004,"(11,6)",1/2,按确定键,开关[首次进入星之海](需ON),,
523,地图事件,Map191.json MAP191,4,EV004,"(11,6)",1/2,按确定键,开关[首次进入星之海](需ON),,
524,地图事件,Map189.json MAP189,4,EV004,"(9,7)",2/3,按确定键,开关[首次进入星之海](需ON),,
524,地图事件,Map189.json MAP189,5,EV005,"(29,7)",2/3,按确定键,开关[首次进入星之海](需ON),,
525,地图事件,Map006.json MAP006,44,EV044,"(35,3)",1/2,按确定键,开关[首次进入星之海](需ON),,
526,地图事件,Map007.json MAP007,27,EV027,"(31,6)",1/2,按确定键,开关[首次进入星之海](需ON),,
527,地图事件,Map007.json MAP007,26,EV026,"(33,6)",1/2,按确定键,开关[首次进入星之海](需ON),,
528,地图事件,Map046.json MAP046,8,EV008,"(4,6)",1/2,按确定键,开关[首次进入星之海](需ON),,
529,地图事件,Map046.json MAP046,8,EV008,"(4,6)",1/2,按确定键,开关[首次进入星之海](需ON),,
530,地图事件,Map046.json MAP046,9,EV009,"(7,6)",1/2,按确定键,开关[首次进入星之海](需ON),,
531,地图事件,Map168.json MAP168,4,EV004,"(6,0)",1/3,事件接触,开关[结界入口开启](需ON),,
532,地图事件,Map217.json MAP217,7,EV007,"(11,8)",1/2,按确定键,开关[德古拉准备开启结界](需ON),,
534,地图事件,Map304.json MAP304,2,EV002,"(4,0)",1/3,事件接触,开关[首次进入星之海](需ON),,
535,地图事件,Map304.json MAP304,3,EV003,"(0,0)",2/3,自动执行,开关[缇娅幻影胜利](需ON),,
538,地图事件,Map325.json MAP325,22,EV022,"(0,0)",1/1,自动执行,无条件,,
539,地图事件,Map326.json MAP326,3,EV003,"(2,0)",1/1,自动执行,无条件,,
540,地图事件,Map009.json MAP009,10,EV010,"(0,0)",7/10,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2,,
540,地图事件,Map296.json MAP296,34,EV034,"(4,0)",7/11,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2,,
541,地图事件,Map009.json MAP009,10,EV010,"(0,0)",8/10,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2,,
541,地图事件,Map296.json MAP296,34,EV034,"(4,0)",8/11,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2,,
542,地图事件,Map009.json MAP009,10,EV010,"(0,0)",8/10,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2,,
542,地图事件,Map296.json MAP296,34,EV034,"(4,0)",8/11,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2,,
543,地图事件,Map009.json MAP009,10,EV010,"(0,0)",9/10,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3,,
543,地图事件,Map296.json MAP296,34,EV034,"(4,0)",9/11,自动执行,开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3,,
544,地图事件,Map009.json MAP009,10,EV010,"(0,0)",10/10,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3,,
544,地图事件,Map296.json MAP296,34,EV034,"(4,0)",10/11,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3,,
545,地图事件,Map009.json MAP009,10,EV010,"(0,0)",10/10,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3,,
545,地图事件,Map296.json MAP296,34,EV034,"(4,0)",10/11,自动执行,开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3,,
546,地图事件,Map296.json MAP296,33,EV033,"(15,18)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
546,地图事件,Map349.json MAP349,3,EV003,"(14,12)",1/2,按确定键,开关[传送魔法失效](需ON),,
547,地图事件,Map296.json MAP296,33,EV033,"(15,18)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
547,地图事件,Map349.json MAP349,3,EV003,"(14,12)",1/2,按确定键,开关[传送魔法失效](需ON),,
548,地图事件,Map327.json MAP327,18,EV018,"(0,0)",1/4,自动执行,开关[缇娅幻影胜利](需ON),,
549,地图事件,Map327.json MAP327,18,EV018,"(0,0)",3/4,自动执行,开关[缇亚本体BOSS胜利](需ON),,
550,地图事件,Map327.json MAP327,21,EV021,"(9,8)",2/3,按确定键,开关[缇娅BOSS胜利对话完](需ON),,
556,地图事件,Map327.json MAP327,21,EV021,"(9,8)",2/3,按确定键,开关[缇娅BOSS胜利对话完](需ON),,
557,地图事件,Map327.json MAP327,21,EV021,"(9,8)",2/3,按确定键,开关[缇娅BOSS胜利对话完](需ON),,
558,地图事件,Map327.json MAP327,21,EV021,"(9,8)",2/3,按确定键,开关[缇娅BOSS胜利对话完](需ON),,
559,地图事件,Map327.json MAP327,21,EV021,"(9,8)",2/3,按确定键,开关[缇娅BOSS胜利对话完](需ON),,
562,地图事件,Map324.json MAP324,7,EV007,"(14,3)",1/2,按确定键,开关[缇娅幻影胜利](需ON),,
564,地图事件,Map005.json MAP005,23,EV023,"(3,0)",1/2,自动执行,开关[缇亚本体BOSS胜利](需ON),,
565,地图事件,Map004.json MAP004,13,EV013,"(3,3)",1/3,自动执行,开关[缇亚本体BOSS胜利](需ON),,
566,地图事件,Map004.json MAP004,13,EV013,"(3,3)",2/3,自动执行,独立开关A=ON,,
566,地图事件,Map004.json MAP004,13,EV013,"(3,3)",2/3,自动执行,独立开关A=ON,,
567,地图事件,Map296.json MAP296,21,EV021,"(12,18)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
568,地图事件,Map296.json MAP296,21,EV021,"(12,18)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
569,地图事件,Map296.json MAP296,23,EV023,"(21,13)",1/2,按确定键,开关[缇亚本体BOSS胜利](需ON),,
570,地图事件,Map296.json MAP296,23,EV023,"(21,13)",1/2,按确定键,开关[缇亚本体BOSS胜利](需ON),,
571,地图事件,Map296.json MAP296,22,EV022,"(22,12)",1/2,按确定键,开关[缇亚本体BOSS胜利](需ON),,
572,地图事件,Map296.json MAP296,22,EV022,"(22,12)",1/2,按确定键,开关[缇亚本体BOSS胜利](需ON),,
573,地图事件,Map296.json MAP296,24,EV024,"(24,13)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
574,地图事件,Map296.json MAP296,24,EV024,"(24,13)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
575,地图事件,Map296.json MAP296,25,EV025,"(34,13)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
576,地图事件,Map296.json MAP296,25,EV025,"(34,13)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
577,地图事件,Map296.json MAP296,26,EV026,"(38,13)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
578,地图事件,Map296.json MAP296,26,EV026,"(38,13)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
579,地图事件,Map301.json MAP301,11,EV011,"(4,14)",1/5,按确定键,开关[缇亚本体BOSS胜利](需ON),,
580,地图事件,Map301.json MAP301,11,EV011,"(4,14)",3/5,按确定键,开关[黑雾区心渊等猫粮](需ON),,
583,公共事件,,114,喵露露有猫粮判断,,,公共事件#114,开关[开场白完成],,
584,公共事件,,114,喵露露有猫粮判断,,,公共事件#114,开关[开场白完成],,
586,地图事件,Map301.json MAP301,11,EV011,"(4,14)",1/5,按确定键,开关[缇亚本体BOSS胜利](需ON),,
587,地图事件,Map301.json MAP301,11,EV011,"(4,14)",2/5,按确定键,开关[黑雾区心渊对话完](需ON),,
588,地图事件,Map301.json MAP301,13,EV013,"(15,9)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
589,地图事件,Map301.json MAP301,13,EV013,"(15,9)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
590,地图事件,Map301.json MAP301,12,EV012,"(14,9)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
591,地图事件,Map301.json MAP301,12,EV012,"(14,9)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
592,地图事件,Map296.json MAP296,32,EV032,"(32,13)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
593,地图事件,Map296.json MAP296,32,EV032,"(32,13)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
594,地图事件,Map296.json MAP296,31,EV031,"(31,13)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
595,地图事件,Map296.json MAP296,31,EV031,"(31,13)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
596,地图事件,Map296.json MAP296,29,EV029,"(44,13)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
597,地图事件,Map296.json MAP296,29,EV029,"(44,13)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
598,地图事件,Map296.json MAP296,30,EV030,"(43,13)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
599,地图事件,Map296.json MAP296,30,EV030,"(43,13)",1/3,按确定键,开关[缇亚本体BOSS胜利](需ON),,
600,公共事件,,26,传送门公共事件,,,公共事件#26,开关[开场白完成],,
601,地图事件,Map324.json MAP324,8,EV008,"(1,0)",1/3,自动执行,开关[缇娅BOSS胜利对话完](需ON),,
602,地图事件,Map329.json MAP329,8,EV008,"(0,0)",1/2,自动执行,开关[缇亚本体BOSS胜利](需ON),,
603,地图事件,Map337.json MAP337,16,EV016,"(1,0)",1/2,自动执行,开关[缇亚本体BOSS胜利](需ON),,
604,地图事件,Map339.json MAP339,8,EV008,"(32,0)",1/2,事件接触,开关[小眼被打败](需ON) 且 开关[大眼被打败](需ON),,
605,地图事件,Map339.json MAP339,12,EV012,"(33,14)",1/1,按确定键,开关[莉莉亚负伤传送回家](需ON),,
606,公共事件,,117,剧情回城禁用时触发,,,公共事件#117,开关[开场白完成],,
607,地图事件,Map342.json MAP342,3,EV003,"(8,0)",1/2,事件接触,开关[大眼被打败](需ON) 且 开关[小眼被打败](需ON),,
608,公共事件,,117,剧情回城禁用时触发,,,公共事件#117,开关[开场白完成],,
609,地图事件,Map349.json MAP349,8,EV008,"(3,12)",1/2,按确定键,开关[传送魔法失效](需ON),,
610,地图事件,Map181.json MAP181,2,EV002,"(20,20)",4/5,按确定键,开关[触发莉莉亚隐藏-弃用](需ON),,
613,地图事件,Map182.json MAP182,5,EV005,"(6,11)",1/3,自动执行,开关[触发莉莉亚隐藏-弃用](需ON),,
614,地图事件,Map005.json MAP005,25,EV025,"(4,0)",1/3,自动执行,开关[后日谈](需ON),,
615,地图事件,Map351.json MAP351,1,EV001,"(9,8)",1/1,按确定键,无条件,,
616,图片名引用,Map348.json,,,,,,,/events/pages/list/parameters 中的 #616#28#ffffff#4#000000,
617,图片名引用,Map348.json,,,,,,,/events/pages/list/parameters 中的 #617#28#ffffff#4#000000,
618,图片名引用,Map359.json,,,,,,,/events/pages/list/parameters 中的 #618#28#ffffff#4#000000,
619,图片名引用,Map360.json,,,,,,,/events/pages/list/parameters 中的 #619#28#ffffff#4#000000,
620,图片名引用,Map361.json,,,,,,,/events/pages/list/parameters 中的 #620#28#ffffff#4#000000,
621,地图事件,Map359.json MAP359,1,EV001,"(9,8)",1/1,按确定键,无条件,,
622,地图事件,Map360.json MAP360,1,EV001,"(9,5)",1/1,按确定键,无条件,,
623,地图事件,Map361.json MAP361,1,EV001,"(30,6)",1/1,按确定键,无条件,,
624,地图事件,Map358.json MAP358,4,EV004,"(1,0)",1/3,自动执行,开关[喵可莉最终对白演出](需ON),,
625,地图事件,Map191.json MAP191,5,EV005,"(30,6)",1/2,按确定键,无条件,,
626,地图事件,Map348.json MAP348,11,EV011,"(3,0)",2/2,自动执行,开关[莉伊被喵露露消灭](需ON),,
628,地图事件,Map348.json MAP348,12,EV012,"(15,10)",1/1,按确定键,开关[莉伊被喵露露消灭](需ON),,
629,地图事件,Map350.json MAP350,4,EV004,"(2,7)",1/3,事件接触,开关[传送魔法失效](需ON),,
630,地图事件,Map349.json MAP349,9,EV009,"(29,12)",1/2,按确定键,无条件,,
632,图片名引用,Map350.json,,,,,,,/events/pages/list/parameters 中的 #632#28#ffffff#4#000000,
632,图片名引用,Map350.json,,,,,,,/events/pages/list/parameters 中的 #632#28#ffffff#4#000000,
633,地图事件,Map350.json MAP350,12,EV012,"(7,7)",1/9,自动执行,开关[魔女被击败](需ON),,魔女被击败后,喵露露强杀魔女路线和莉伊喵可莉路线都在这里事件触发
634,地图事件,Map350.json MAP350,12,EV012,"(7,7)",5/9,自动执行,开关[演出莉伊阻止校长](需ON),,请到事件14查看,魔女被击败后,莉伊喵可莉路线首先在14事件触发 / 在喵可莉结局中,14事件执行完毕才会到本事件执行 / 但本事件的附加特效在14事件执行过程中就有了 / 250开关预先会打开 / CG
635,图片名引用,Map350.json,,,,,,,/events/pages/list/parameters 中的 #635#28#ffffff#4#000000,
636,图片名引用,Map350.json,,,,,,,/events/pages/list/parameters 中的 #636#28#ffffff#4#000000,
637,地图事件,Map348.json MAP348,5,EV005,"(2,0)",2/3,自动执行,独立开关A=ON,,
638,地图事件,Map350.json MAP350,12,EV012,"(7,7)",4/9,自动执行,开关[魔女被击败](需ON) 且 开关[莉伊被喵露露消灭](需ON),,魔女被击败后,强杀莉伊再强杀魔女路线首先在这里事件触发
641,地图事件,Map350.json MAP350,12,EV012,"(7,7)",7/9,自动执行,开关[容器重建完毕](需ON) 且 开关[莉伊被喵露露消灭](需ON),,
644,地图事件,Map350.json MAP350,11,EV011,"(9,10)",1/6,按确定键,开关[传送魔法失效](需ON),,
647,公共事件,,146,结局1莉莉亚登场对白,,,公共事件#146,开关[开场白完成],,
648,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:14959,
660,地图事件,Map004.json MAP004,14,EV014,"(5,4)",1/2,按确定键,开关[后日谈](需ON),,
661,地图事件,Map004.json MAP004,14,EV014,"(5,4)",1/2,按确定键,开关[后日谈](需ON),,
662,地图事件,Map004.json MAP004,14,EV014,"(5,4)",1/2,按确定键,开关[后日谈](需ON),,
663,地图事件,Map004.json MAP004,14,EV014,"(5,4)",1/2,按确定键,开关[后日谈](需ON),,
663,地图事件,Map004.json MAP004,14,EV014,"(5,4)",1/2,按确定键,开关[后日谈](需ON),,
664,地图事件,Map191.json MAP191,6,EV006,"(23,6)",1/2,按确定键,开关[后日谈](需ON),,
665,地图事件,Map191.json MAP191,6,EV006,"(23,6)",1/2,按确定键,开关[后日谈](需ON),,
666,地图事件,Map009.json MAP009,3,EV003,"(4,9)",10/16,按确定键,开关[后日谈](需ON),,
667,地图事件,Map009.json MAP009,3,EV003,"(4,9)",10/16,按确定键,开关[后日谈](需ON),,
668,地图事件,Map009.json MAP009,3,EV003,"(4,9)",10/16,按确定键,开关[后日谈](需ON),,
669,地图事件,Map196.json MAP196,5,EV005,"(9,7)",1/2,按确定键,开关[后日谈](需ON),,
670,地图事件,Map196.json MAP196,5,EV005,"(9,7)",1/2,按确定键,开关[后日谈](需ON),,
671,地图事件,Map196.json MAP196,6,EV006,"(7,6)",1/2,按确定键,开关[后日谈](需ON),,
672,地图事件,Map196.json MAP196,6,EV006,"(7,6)",1/2,按确定键,开关[后日谈](需ON),,
673,地图事件,Map327.json MAP327,22,EV022,"(14,8)",1/2,按确定键,开关[后日谈](需ON),,
674,地图事件,Map327.json MAP327,22,EV022,"(14,8)",1/2,按确定键,开关[后日谈](需ON),,
675,地图事件,Map301.json MAP301,14,EV014,"(10,4)",1/2,按确定键,开关[后日谈](需ON),,
676,地图事件,Map301.json MAP301,14,EV014,"(10,4)",1/2,按确定键,开关[后日谈](需ON),,
677,地图事件,Map075.json MAP075,1,EV001,"(11,8)",1/2,按确定键,开关[后日谈](需ON),,
678,地图事件,Map075.json MAP075,1,EV001,"(11,8)",1/2,按确定键,开关[后日谈](需ON),,
679,公共事件,,142,夏洛特米娅后日谈对话,,,公共事件#142,开关[开场白完成],,
680,公共事件,,142,夏洛特米娅后日谈对话,,,公共事件#142,开关[开场白完成],,
681,公共事件,,140,依玲和蕾铃后日谈对话,,,公共事件#140,开关[开场白完成],,
682,公共事件,,140,依玲和蕾铃后日谈对话,,,公共事件#140,开关[开场白完成],,
683,公共事件,,141,露茜亚梅卡后日谈对话,,,公共事件#141,开关[开场白完成],,
684,公共事件,,141,露茜亚梅卡后日谈对话,,,公共事件#141,开关[开场白完成],,
685,地图事件,Map046.json MAP046,10,EV010,"(22,6)",1/2,按确定键,开关[后日谈](需ON),,
686,地图事件,Map046.json MAP046,10,EV010,"(22,6)",1/2,按确定键,开关[后日谈](需ON),,
687,地图事件,Map012.json MAP012,6,EV006,"(1,0)",6/8,自动执行,开关[后日谈](需ON),,
688,地图事件,Map196.json MAP196,9,EV009,"(17,7)",1/1,自动执行,开关[莉莉亚后日谈](需ON),,
689,地图事件,Map007.json MAP007,24,EV024,"(38,9)",4/4,按确定键,无条件,,
689,地图事件,Map296.json MAP296,12,EV012,"(18,16)",4/4,按确定键,无条件,,
689,地图事件,Map349.json MAP349,10,EV010,"(1,12)",4/4,按确定键,无条件,,
691,地图事件,Map182.json MAP182,7,EV007,"(4,11)",1/1,按确定键,开关[缇亚本体BOSS胜利](需ON),,
693,地图事件,Map350.json MAP350,19,EV019,"(1,10)",1/2,按确定键,开关[后日谈](需ON),,
694,地图事件,Map171.json MAP171,16,EV016,"(5,6)",1/3,按确定键,无条件,,
695,地图事件,Map171.json MAP171,16,EV016,"(5,6)",2/3,按确定键,开关[获得樱的钥匙](需ON),,
696,地图事件,Map171.json MAP171,16,EV016,"(5,6)",3/3,按确定键,开关[获得樱的钥匙](需ON) 且 独立开关A=ON,,
697,地图事件,Map353.json MAP353,6,EV006,"(4,4)",1/1,事件接触,开关[喵可莉摸猫](需ON),,
698,地图事件,Map353.json MAP353,6,EV006,"(4,4)",1/1,事件接触,开关[喵可莉摸猫](需ON),,
699,地图事件,Map004.json MAP004,14,EV014,"(5,4)",1/2,按确定键,开关[后日谈](需ON),,
700,地图事件,Map039.json MAP039,61,EV061,"(51,45)",1/2,按确定键,开关[第二天开启](需ON),,
701,地图事件,Map171.json MAP171,17,EV017,"(6,16)",1/2,按确定键,开关[第三天开启](需ON),,
702,地图事件,Map369.json MAP369,2,EV002,"(15,13)",1/1,自动执行,无条件,,
703,地图事件,Map370.json MAP370,2,EV002,"(10,5)",1/1,事件接触,无条件,,
704,地图事件,Map371.json MAP371,2,EV002,"(14,5)",1/1,事件接触,无条件,,
705,公共事件,,80,游戏机前置条件检查,,,公共事件#80,开关[开场白完成],,
708,地图事件,Map009.json MAP009,12,EV012,"(2,6)",1/2,按确定键,开关[4399看广告拿东西](需ON),,
711,地图事件,Map009.json MAP009,13,EV013,"(4,6)",1/2,按确定键,开关[4399看广告拿东西](需ON),,
714,地图事件,Map009.json MAP009,14,EV014,"(6,6)",1/2,按确定键,开关[4399看广告拿东西](需ON),,
718,地图事件,Map296.json MAP296,15,EV015,"(37,13)",3/5,按确定键,开关[缇娅幻影胜利](需ON),,
719,地图事件,Map296.json MAP296,15,EV015,"(37,13)",3/5,按确定键,开关[缇娅幻影胜利](需ON),,
720,地图事件,Map378.json MAP378,9,EV009,"(21,9)",1/3,事件接触,开关[缇娅幻影胜利](需ON),,
721,地图事件,Map383.json MAP383,3,EV003,"(12,5)",1/2,自动执行,开关[触发校长在璃音门口](需ON),,
722,地图事件,Map381.json MAP381,7,EV007,"(0,0)",2/3,自动执行,开关[校长BOSS胜利](需ON),,
723,地图事件,Map379.json MAP379,2,EV002,"(0,0)",1/3,自动执行,无条件,,
724,地图事件,Map379.json MAP379,3,EV003,"(6,6)",1/3,按确定键,无条件,,
725,地图事件,Map379.json MAP379,4,EV004,"(5,6)",1/1,按确定键,无条件,,
726,地图事件,Map379.json MAP379,5,EV005,"(1,3)",1/1,按确定键,无条件,,
727,地图事件,Map379.json MAP379,6,EV006,"(9,2)",1/2,按确定键,无条件,,
728,地图事件,Map379.json MAP379,6,EV006,"(9,2)",2/2,按确定键,开关[夜晚开关](需ON),,
730,地图事件,Map383.json MAP383,2,EV002,"(11,5)",1/2,按确定键,无条件,,
730,地图事件,Map383.json MAP383,2,EV002,"(11,5)",1/2,按确定键,无条件,,
731,地图事件,Map383.json MAP383,2,EV002,"(11,5)",1/2,按确定键,无条件,,
732,地图事件,Map383.json MAP383,4,EV004,"(0,0)",1/3,自动执行,开关[前往天空区域](需ON),,
733,地图事件,Map383.json MAP383,5,EV005,"(9,5)",1/2,按确定键,开关[前往天空区域](需ON),,
734,地图事件,Map378.json MAP378,10,EV010,"(33,9)",1/3,按确定键,开关[老板娘战后对话完](需ON),,
735,地图事件,Map378.json MAP378,10,EV010,"(33,9)",1/3,按确定键,开关[老板娘战后对话完](需ON),,
736,地图事件,Map378.json MAP378,11,EV011,"(32,8)",1/3,并行处理,开关[老板娘战后对话完](需ON),,
736,地图事件,Map378.json MAP378,12,EV012,"(0,0)",1/3,自动执行,开关[触发喵露露推涅普](需ON),,
737,地图事件,Map378.json MAP378,13,EV013,"(48,10)",1/3,事件接触,开关[第一天夜晚](需ON),,
738,地图事件,Map378.json MAP378,13,EV013,"(48,10)",1/3,事件接触,开关[第一天夜晚](需ON),,
739,地图事件,Map295.json MAP295,2,EV002,"(4,0)",1/3,事件接触,开关[雪原任务开启](需ON),,
740,地图事件,Map295.json MAP295,2,EV002,"(4,0)",1/3,事件接触,开关[雪原任务开启](需ON),,
741,地图事件,Map383.json MAP383,6,EV006,"(5,5)",1/3,按确定键,开关[第三天开启](需ON),,
742,地图事件,Map383.json MAP383,6,EV006,"(5,5)",1/3,按确定键,开关[第三天开启](需ON),,
743,地图事件,Map381.json MAP381,10,EV010,"(13,8)",1/4,按确定键,开关[第四天开启](需ON),,
745,地图事件,Map381.json MAP381,10,EV010,"(13,8)",2/4,按确定键,开关[莉伊被叫醒](需ON),,
746,地图事件,Map382.json MAP382,2,EV002,"(17,12)",1/2,按确定键,开关[莉伊走进树林中](需ON),,
747,地图事件,Map382.json MAP382,2,EV002,"(17,12)",1/2,按确定键,开关[莉伊走进树林中](需ON),,
749,地图事件,Map327.json MAP327,18,EV018,"(0,0)",3/4,自动执行,开关[缇亚本体BOSS胜利](需ON),,
750,地图事件,Map324.json MAP324,8,EV008,"(1,0)",2/3,自动执行,开关[校长BOSS胜利后传送走](需ON) 且 开关[缇娅BOSS胜利对话完](需ON),,
751,地图事件,Map327.json MAP327,21,EV021,"(9,8)",2/3,按确定键,开关[缇娅BOSS胜利对话完](需ON),,
757,地图事件,Map381.json MAP381,11,EV011,"(6,12)",1/3,按确定键,开关[校长BOSS后猫头出现](需ON),,
758,地图事件,Map004.json MAP004,13,EV013,"(3,3)",1/3,自动执行,开关[缇亚本体BOSS胜利](需ON),,
759,地图事件,Map004.json MAP004,13,EV013,"(3,3)",2/3,自动执行,独立开关A=ON,,
760,地图事件,Map349.json MAP349,8,EV008,"(3,12)",1/2,按确定键,开关[传送魔法失效](需ON),,
761,地图事件,Map004.json MAP004,15,EV015,"(6,0)",1/2,自动执行,开关[新结局后日谈](需ON) 且 开关[后日谈](需ON),,
762,地图事件,Map004.json MAP004,16,EV016,"(2,6)",1/2,按确定键,开关[新后日谈橘花猫出现](需ON),,
763,地图事件,Map384.json MAP384,1,EV001,"(7,11)",1/3,事件接触,开关[新后日谈橘花猫出现](需ON),,
764,地图事件,Map384.json MAP384,1,EV001,"(7,11)",1/3,事件接触,开关[新后日谈橘花猫出现](需ON),,
765,地图事件,Map384.json MAP384,1,EV001,"(7,11)",1/3,事件接触,开关[新后日谈橘花猫出现](需ON),,
766,地图事件,Map191.json MAP191,7,EV007,"(13,6)",1/4,按确定键,开关[获得金丝草](需ON),,
767,地图事件,Map191.json MAP191,7,EV007,"(13,6)",3/4,按确定键,开关[获得金丝草](需ON) 且 独立开关B=ON,,
768,地图事件,Map191.json MAP191,7,EV007,"(13,6)",2/4,按确定键,开关[获得金丝草](需ON) 且 独立开关A=ON,,
769,地图事件,Map009.json MAP009,3,EV003,"(4,9)",12/16,按确定键,开关[新结局后日谈](需ON) 且 开关[新后日谈与莲对话完](需ON),,
770,地图事件,Map009.json MAP009,3,EV003,"(4,9)",12/16,按确定键,开关[新结局后日谈](需ON) 且 开关[新后日谈与莲对话完](需ON),,
771,地图事件,Map009.json MAP009,3,EV003,"(4,9)",12/16,按确定键,开关[新结局后日谈](需ON) 且 开关[新后日谈与莲对话完](需ON),,
772,地图事件,Map296.json MAP296,27,EV027,"(40,13)",3/4,按确定键,开关[新结局后日谈](需ON) 且 开关[新后日谈开传送点](需ON),,
773,地图事件,Map327.json MAP327,26,EV026,"(12,8)",1/6,按确定键,开关[重新开启星之海传送](需ON),,
774,地图事件,Map327.json MAP327,26,EV026,"(12,8)",2/6,按确定键,开关[新后日谈缇娅对话完成](需ON),,
775,地图事件,Map377.json MAP377,4,EV004,"(3,12)",1/2,按确定键,开关[新后日谈缇娅对话完成](需ON),,
776,地图事件,Map377.json MAP377,4,EV004,"(3,12)",1/2,按确定键,开关[新后日谈缇娅对话完成](需ON),,
777,地图事件,Map377.json MAP377,4,EV004,"(3,12)",1/2,按确定键,开关[新后日谈缇娅对话完成](需ON),,
778,地图事件,Map387.json MAP387,1,EV001,"(9,9)",1/5,事件接触,开关[和校长对话完修熊](需ON),,
780,公共事件,,200,新后日谈转到第二天,,,公共事件#200,开关[开场白完成],,
781,地图事件,Map327.json MAP327,26,EV026,"(12,8)",3/6,按确定键,开关[新后日谈第二天](需ON),,
782,地图事件,Map327.json MAP327,26,EV026,"(12,8)",3/6,按确定键,开关[新后日谈第二天](需ON),,
783,地图事件,Map012.json MAP012,10,EV010,"(9,6)",1/2,按确定键,开关[新后日谈第二天](需ON),,
783,地图事件,Map012.json MAP012,11,EV011,"(10,6)",1/2,按确定键,开关[新后日谈第二天](需ON),,
784,地图事件,Map012.json MAP012,11,EV011,"(10,6)",1/2,按确定键,开关[新后日谈第二天](需ON),,
785,地图事件,Map012.json MAP012,10,EV010,"(9,6)",1/2,按确定键,开关[新后日谈第二天](需ON),,
786,地图事件,Map012.json MAP012,10,EV010,"(9,6)",1/2,按确定键,开关[新后日谈第二天](需ON),,
787,地图事件,Map196.json MAP196,11,EV011,"(8,7)",1/2,按确定键,开关[新后日谈和小心心对话](需ON),,
788,地图事件,Map196.json MAP196,11,EV011,"(8,7)",1/2,按确定键,开关[新后日谈和小心心对话](需ON),,
789,地图事件,Map378.json MAP378,14,EV014,"(41,3)",1/2,事件接触,开关[新后日谈和德古拉对话](需ON),,
791,地图事件,Map387.json MAP387,1,EV001,"(9,9)",3/5,事件接触,开关[新后日谈第二天夜晚](需ON),,
794,地图事件,Map387.json MAP387,1,EV001,"(9,9)",3/5,事件接触,开关[新后日谈第二天夜晚](需ON),,
795,地图事件,Map327.json MAP327,26,EV026,"(12,8)",4/6,自动执行,开关[新后日谈第二天夜晚](需ON),,
796,地图事件,Map389.json MAP389,1,EV001,"(4,5)",1/3,按确定键,开关[新后日谈第二天夜晚](需ON),,
797,地图事件,Map390.json MAP390,1,EV001,"(7,6)",1/3,按确定键,开关[看完喵可莉质问缇娅](需ON),,
798,地图事件,Map390.json MAP390,1,EV001,"(7,6)",2/3,按确定键,开关[喵可莉准备变猫](需ON),,
800,地图事件,Map379.json MAP379,8,EV008,"(7,6)",1/2,按确定键,开关[新结局后日谈](需ON),,
801,地图事件,Map379.json MAP379,7,EV007,"(4,3)",2/3,按确定键,开关[新结局后日谈](需ON),,
802,地图事件,Map379.json MAP379,7,EV007,"(4,3)",2/3,按确定键,开关[新结局后日谈](需ON),,
803,地图事件,Map009.json MAP009,3,EV003,"(4,9)",11/16,按确定键,开关[新结局后日谈](需ON),,
804,地图事件,Map171.json MAP171,18,EV018,"(11,12)",1/2,按确定键,开关[新后日谈橘花猫出现](需ON),,
804,地图事件,Map171.json MAP171,19,EV019,"(12,12)",1/2,按确定键,开关[新后日谈橘花猫出现](需ON),,
805,地图事件,Map171.json MAP171,18,EV018,"(11,12)",1/2,按确定键,开关[新后日谈橘花猫出现](需ON),,
806,地图事件,Map171.json MAP171,19,EV019,"(12,12)",1/2,按确定键,开关[新后日谈橘花猫出现](需ON),,
807,地图事件,Map381.json MAP381,18,EV018,"(14,12)",1/2,按确定键,开关[获得金丝草](需ON),,
808,地图事件,Map381.json MAP381,18,EV018,"(14,12)",1/2,按确定键,开关[获得金丝草](需ON),,
809,地图事件,Map383.json MAP383,2,EV002,"(11,5)",2/2,按确定键,开关[莉伊进门缝眼睛](需ON),,
810,地图事件,Map379.json MAP379,9,EV009,"(3,6)",1/2,按确定键,开关[新后日谈第二天](需ON),,
811,地图事件,Map379.json MAP379,9,EV009,"(3,6)",1/2,按确定键,开关[新后日谈第二天](需ON),,
812,地图事件,Map388.json MAP388,11,EV011,"(4,9)",1/4,事件接触,开关[新后日谈第二天](需ON),,
813,地图事件,Map388.json MAP388,10,EV010,"(4,10)",1/3,按确定键,开关[新后日谈第二天](需ON),,
814,地图事件,Map378.json MAP378,22,EV022,"(31,9)",1/2,按确定键,开关[新结局后日谈](需ON),,
815,地图事件,Map378.json MAP378,22,EV022,"(31,9)",1/2,按确定键,开关[新结局后日谈](需ON),,
816,地图事件,Map009.json MAP009,3,EV003,"(4,9)",14/16,按确定键,开关[新结局后日谈](需ON) 且 开关[新后日谈第二天](需ON),,
817,地图事件,Map196.json MAP196,4,EV004,"(5,5)",3/5,按确定键,开关[新后日谈第二天](需ON),,
818,地图事件,Map196.json MAP196,4,EV004,"(5,5)",3/5,按确定键,开关[新后日谈第二天](需ON),,
819,地图事件,Map381.json MAP381,20,EV020,"(11,12)",1/2,按确定键,开关[新后日谈第二天](需ON),,
820,地图事件,Map381.json MAP381,20,EV020,"(11,12)",1/2,按确定键,开关[新后日谈第二天](需ON),,
822,地图事件,Map009.json MAP009,9,EV009,"(8,6)",3/4,按确定键,开关[新后日谈第二天](需ON),,
823,地图事件,Map389.json MAP389,1,EV001,"(4,5)",1/3,按确定键,开关[新后日谈第二天夜晚](需ON),,
824,地图事件,Map389.json MAP389,1,EV001,"(4,5)",1/3,按确定键,开关[新后日谈第二天夜晚](需ON),,
825,地图事件,Map196.json MAP196,12,EV012,"(12,7)",2/3,按确定键,开关[新后日谈第二天夜晚](需ON),,
826,地图事件,Map382.json MAP382,3,EV003,"(15,12)",1/2,按确定键,开关[新后日谈第二天夜晚](需ON),,
826,地图事件,Map382.json MAP382,4,EV004,"(14,12)",1/2,按确定键,开关[新后日谈第二天夜晚](需ON),,
827,地图事件,Map382.json MAP382,3,EV003,"(15,12)",1/2,按确定键,开关[新后日谈第二天夜晚](需ON),,
827,地图事件,Map382.json MAP382,4,EV004,"(14,12)",1/2,按确定键,开关[新后日谈第二天夜晚](需ON),,
828,地图事件,Map009.json MAP009,9,EV009,"(8,6)",3/4,按确定键,开关[新后日谈第二天](需ON),,
845,地图事件,Map350.json MAP350,12,EV012,"(7,7)",1/9,自动执行,开关[魔女被击败](需ON),,魔女被击败后,喵露露强杀魔女路线和莉伊喵可莉路线都在这里事件触发
846,地图事件,Map349.json MAP349,13,EV013,"(18,13)",1/2,事件接触,开关[喵露露带莉莉亚回去](需ON),,
847,地图事件,Map350.json MAP350,24,EV024,"(3,0)",1/3,自动执行,开关[喵露露带莉莉亚折返](需ON),,
848,地图事件,Map349.json MAP349,9,EV009,"(29,12)",1/2,按确定键,无条件,,
849,地图事件,Map350.json MAP350,26,EV026,"(4,0)",2/12,自动执行,开关[二战魔女一阶段结束演出](需ON),,
850,地图事件,Map350.json MAP350,26,EV026,"(4,0)",2/12,自动执行,开关[二战魔女一阶段结束演出](需ON),,
851,地图事件,Map350.json MAP350,26,EV026,"(4,0)",2/12,自动执行,开关[二战魔女一阶段结束演出](需ON),,
852,地图事件,Map350.json MAP350,26,EV026,"(4,0)",5/12,自动执行,开关[二战魔女二阶前半](需ON),,
853,地图事件,Map350.json MAP350,26,EV026,"(4,0)",6/12,自动执行,开关[二战魔女二阶后半](需ON),,
854,地图事件,Map350.json MAP350,26,EV026,"(4,0)",6/12,自动执行,开关[二战魔女二阶后半](需ON),,
855,地图事件,Map350.json MAP350,26,EV026,"(4,0)",8/12,自动执行,开关[二战魔女轰击演出](需ON),,
856,地图事件,Map350.json MAP350,26,EV026,"(4,0)",8/12,自动执行,开关[二战魔女轰击演出](需ON),,
857,公共事件,,219,德古拉瞬移到12,18,,,公共事件#219,开关[开场白完成],,
860,地图事件,Map350.json MAP350,26,EV026,"(4,0)",10/12,自动执行,开关[二战魔女三阶演出](需ON),,
875,地图事件,Map380.json MAP380,9,EV009,"(5,9)",1/2,按确定键,开关[魔女被推下湖底](需ON),,
876,地图事件,Map012.json MAP012,12,EV012,"(2,0)",1/2,自动执行,开关[新后日谈喵可莉变猫](需ON),,
877,地图事件,Map007.json MAP007,28,EV028,"(3,0)",1/2,自动执行,开关[新后日谈剧情完结](需ON),,
878,地图事件,Map350.json MAP350,26,EV026,"(4,0)",6/12,自动执行,开关[二战魔女二阶后半](需ON),,
879,地图事件,Map324.json MAP324,7,EV007,"(14,3)",1/2,按确定键,开关[缇娅幻影胜利](需ON),,
880,地图事件,Map381.json MAP381,21,EV021,"(1,0)",1/2,自动执行,开关[樱校长战斗中剧情对白](需ON),,
881,地图事件,Map381.json MAP381,21,EV021,"(1,0)",1/2,自动执行,开关[樱校长战斗中剧情对白](需ON),,
882,地图事件,Map381.json MAP381,22,EV022,"(2,0)",1/2,自动执行,开关[樱校长战斗中剧情对白2](需ON),,
883,公共事件,,233,魔女幻觉-喵可莉(废弃),,,公共事件#233,开关[开场白完成],,
884,公共事件,,233,魔女幻觉-喵可莉(废弃),,,公共事件#233,开关[开场白完成],,
885,公共事件,,233,魔女幻觉-喵可莉(废弃),,,公共事件#233,开关[开场白完成],,
886,公共事件,,233,魔女幻觉-喵可莉(废弃),,,公共事件#233,开关[开场白完成],,
887,公共事件,,233,魔女幻觉-喵可莉(废弃),,,公共事件#233,开关[开场白完成],,
888,公共事件,,233,魔女幻觉-喵可莉(废弃),,,公共事件#233,开关[开场白完成],,
889,公共事件,,233,魔女幻觉-喵可莉(废弃),,,公共事件#233,开关[开场白完成],,
890,公共事件,,233,魔女幻觉-喵可莉(废弃),,,公共事件#233,开关[开场白完成],,
891,公共事件,,233,魔女幻觉-喵可莉(废弃),,,公共事件#233,开关[开场白完成],,
891,图片名引用,Map350.json,,,,,,,/events/pages/list/parameters 中的 #891#28#ff2020#4#000000,
892,图片名引用,Map350.json,,,,,,,/events/pages/list/parameters 中的 #892#28#ff2020#4#000000,
893,图片名引用,Map350.json,,,,,,,/events/pages/list/parameters 中的 #893#28#ff2020#4#000000,
894,图片名引用,Map350.json,,,,,,,/events/pages/list/parameters 中的 #894#28#ff2020#4#000000,
895,图片名引用,Map350.json,,,,,,,/events/pages/list/parameters 中的 #895#28#ff2020#4#000000,
896,图片名引用,Map350.json,,,,,,,/events/pages/list/parameters 中的 #896#28#ff2020#4#000000,
897,图片名引用,Map350.json,,,,,,,/events/pages/list/parameters 中的 #897#28#ff2020#4#000000,
898,图片名引用,Map350.json,,,,,,,/events/pages/list/parameters 中的 #898#28#ff2020#4#000000,
899,图片名引用,Map350.json,,,,,,,/events/pages/list/parameters 中的 #899#28#ff2020#4#000000,
900,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:16831,
900,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:16853,
901,地图事件,Map342.json MAP342,3,EV003,"(8,0)",1/2,事件接触,开关[大眼被打败](需ON) 且 开关[小眼被打败](需ON),,
902,地图事件,Map350.json MAP350,26,EV026,"(4,0)",4/12,自动执行,开关[二战魔女特殊击杀分支](需ON),,
903,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:18582,
906,地图事件,Map350.json MAP350,26,EV026,"(4,0)",6/12,自动执行,开关[二战魔女二阶后半](需ON),,
907,地图事件,Map350.json MAP350,26,EV026,"(4,0)",10/12,自动执行,开关[二战魔女三阶演出](需ON),,
908,地图事件,Map350.json MAP350,26,EV026,"(4,0)",10/12,自动执行,开关[二战魔女三阶演出](需ON),,
909,地图事件,Map350.json MAP350,26,EV026,"(4,0)",10/12,自动执行,开关[二战魔女三阶演出](需ON),,
910,地图事件,Map350.json MAP350,26,EV026,"(4,0)",10/12,自动执行,开关[二战魔女三阶演出](需ON),,
911,地图事件,Map350.json MAP350,26,EV026,"(4,0)",10/12,自动执行,开关[二战魔女三阶演出](需ON),,
913,地图事件,Map350.json MAP350,30,EV030,"(6,0)",4/7,自动执行,独立开关A=ON,,
914,地图事件,Map350.json MAP350,30,EV030,"(6,0)",6/7,自动执行,开关[璃音最终登场](需ON),,
915,地图事件,Map350.json MAP350,30,EV030,"(6,0)",6/7,自动执行,开关[璃音最终登场](需ON),,
916,地图事件,Map350.json MAP350,26,EV026,"(4,0)",10/12,自动执行,开关[二战魔女三阶演出](需ON),,
917,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:18625,
918,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:18628,
919,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:18631,
920,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:18634,
921,地图事件,Map327.json MAP327,18,EV018,"(0,0)",1/4,自动执行,开关[缇娅幻影胜利](需ON),,
922,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:18751,
923,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:18235,
924,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:18788,
925,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:18852,
926,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:18289,
927,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:18953,
928,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:18305,
929,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:18317,
931,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:18329,
932,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:18341,
933,JS:requestFloatMessage(),,,,,,,,js/nya/nya_statem_ext.js:18353,
934,地图事件,Map350.json MAP350,26,EV026,"(4,0)",10/12,自动执行,开关[二战魔女三阶演出](需ON),,
935,地图事件,Map350.json MAP350,4,EV004,"(2,7)",1/3,事件接触,开关[传送魔法失效](需ON),,
936,地图事件,Map045.json MAP045,10,EV010,"(4,5)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
937,地图事件,Map045.json MAP045,10,EV010,"(4,5)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
938,地图事件,Map046.json MAP046,11,EV011,"(19,6)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
939,地图事件,Map046.json MAP046,11,EV011,"(19,6)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
940,地图事件,Map045.json MAP045,7,EV007,"(12,5)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
941,地图事件,Map045.json MAP045,7,EV007,"(12,5)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
942,地图事件,Map044.json MAP044,14,EV014,"(12,5)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
943,地图事件,Map044.json MAP044,14,EV014,"(12,5)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
944,地图事件,Map044.json MAP044,15,EV015,"(11,4)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
945,地图事件,Map044.json MAP044,15,EV015,"(11,4)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
946,地图事件,Map044.json MAP044,16,EV016,"(7,5)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
947,地图事件,Map044.json MAP044,16,EV016,"(7,5)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
948,地图事件,Map045.json MAP045,8,EV008,"(3,5)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
949,地图事件,Map045.json MAP045,8,EV008,"(3,5)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
950,地图事件,Map045.json MAP045,9,EV009,"(11,5)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
951,地图事件,Map045.json MAP045,9,EV009,"(11,5)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
952,地图事件,Map009.json MAP009,3,EV003,"(4,9)",16/16,按确定键,开关[新结局后日谈](需ON) 且 开关[新后日谈剧情完结](需ON),,
953,地图事件,Map009.json MAP009,3,EV003,"(4,9)",16/16,按确定键,开关[新结局后日谈](需ON) 且 开关[新后日谈剧情完结](需ON),,
954,地图事件,Map048.json MAP048,9,EV009,"(10,6)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
955,地图事件,Map048.json MAP048,9,EV009,"(10,6)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
956,地图事件,Map048.json MAP048,7,EV007,"(12,6)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
957,地图事件,Map048.json MAP048,7,EV007,"(12,6)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
958,地图事件,Map048.json MAP048,8,EV008,"(13,6)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
959,地图事件,Map048.json MAP048,8,EV008,"(13,6)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
960,地图事件,Map039.json MAP039,62,EV062,"(33,42)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
960,地图事件,Map039.json MAP039,63,EV063,"(36,44)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
961,地图事件,Map007.json MAP007,29,EV029,"(12,9)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
961,地图事件,Map007.json MAP007,33,EV033,"(13,9)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
962,地图事件,Map006.json MAP006,47,EV047,"(28,6)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
962,地图事件,Map006.json MAP006,48,EV048,"(30,6)",1/1,按确定键,开关[新后日谈剧情完结](需ON),,
1 故事序号 来源 地图 事件ID 事件名 坐标 页 触发方式 条件 位置 备注
2 0 JS:_storyId= js/nya/nya_achieves.js:656
3 0 JS:_storyId= js/nya/nya_achieves.js:787
4 0 JS:_beforeDestoryTime= js/nya/nya_ai.js:8896
5 0 JS:_beforeDestoryTime= js/nya/nya_ai.js:8916
6 0 JS:_floatMessageStoryID= js/nya/nya_effect.js:179
7 0 JS:_floatMessageStoryID= js/nya/nya_effect.js:325
8 0 JS:_storyTime= js/nya/nya_game.js:5154
9 0 JS:storyWaitTime= js/nya/nya_statem_ext.js:5653
10 0 JS:storyModeStep= js/nya/nya_statem_ext.js:14494
11 0 JS:storyModeStep= js/nya/nya_statem_ext.js:14617
12 1 地图事件 Map004.json MAP004 1 EV001 (0,0) 1/4 自动执行 无条件
13 1 JS数组(浮动消息) js/nya/nya_game_system.js:3027
14 1 JS:storyModeStep= js/nya/nya_statem_ext.js:14621
15 2 地图事件 Map012.json MAP012 4 EV004 (4,11) 1/3 按确定键 无条件
16 2 JS数组(浮动消息) js/nya/nya_game_system.js:3027
17 2 JS:storyModeStep= js/nya/nya_statem_ext.js:14625
18 3 JS数组(浮动消息) js/nya/nya_game_system.js:3440
19 3 JS:storyModeStep= js/nya/nya_statem_ext.js:14605
20 4 JS:lockTextBalloon() js/nya/nya_game.js:3827
21 4 JS数组(浮动消息) js/nya/nya_game_system.js:3911
22 5 JS数组(浮动消息) js/nya/nya_game_system.js:3911
23 7 地图事件 Map012.json MAP012 6 EV006 (1,0) 1/8 自动执行 开关[第一天夜晚莉莉亚回家](需ON)
24 10 地图事件 Map004.json MAP004 3 EV003 (4,6) 1/1 按确定键 无条件
25 11 地图事件 Map004.json MAP004 4 EV004 (3,4) 1/4 按确定键 无条件
26 11 地图事件 Map004.json MAP004 4 EV004 (3,4) 2/4 按确定键 开关[前往天空区域](需ON)
27 11 地图事件 Map004.json MAP004 4 EV004 (3,4) 2/4 按确定键 开关[前往天空区域](需ON)
28 12 地图事件 Map004.json MAP004 5 EV005 (1,4) 1/6 按确定键 无条件
29 13 地图事件 Map004.json MAP004 5 EV005 (1,4) 2/6 按确定键 独立开关A=ON
30 15 地图事件 Map006.json MAP006 9 EV009 (0,0) 1/3 自动执行 无条件
31 16 地图事件 Map006.json MAP006 9 EV009 (0,0) 1/3 自动执行 无条件
32 17 地图事件 Map006.json MAP006 9 EV009 (0,0) 1/3 自动执行 无条件
33 18 地图事件 Map006.json MAP006 9 EV009 (0,0) 1/3 自动执行 无条件
34 18 JS数组(浮动消息) js/nya/nya_game_system.js:7284
35 19 地图事件 Map006.json MAP006 7 EV007 (13,9) 1/2 按确定键 无条件
36 20 地图事件 Map006.json MAP006 12 EV012 (22,9) 1/2 按确定键 无条件
37 21 地图事件 Map006.json MAP006 12 EV012 (22,9) 1/2 按确定键 无条件
38 22 地图事件 Map006.json MAP006 13 EV013 (31,9) 1/2 按确定键 无条件
39 34 地图事件 Map007.json MAP007 5 EV005 (24,9) 1/2 按确定键 无条件
40 34 地图事件 Map007.json MAP007 7 EV007 (26,9) 1/2 按确定键 无条件
41 35 地图事件 Map007.json MAP007 5 EV005 (24,9) 1/2 按确定键 无条件
42 35 地图事件 Map007.json MAP007 7 EV007 (26,9) 1/2 按确定键 无条件
43 36 地图事件 Map010.json MAP010 2 EV002 (6,6) 1/2 按确定键 无条件
44 39 地图事件 Map009.json MAP009 3 EV003 (4,9) 1/16 按确定键 无条件
45 40 公共事件 3 初遇幽暗森林 公共事件#3 开关[开场白完成]
46 41 公共事件 3 初遇幽暗森林 公共事件#3 开关[开场白完成]
47 43 地图事件 Map007.json MAP007 3 EV003 (7,9) 1/4 按确定键 无条件
48 44 地图事件 Map012.json MAP012 2 EV002 (0,0) 1/2 自动执行 开关[带任务进莉莉亚家](需ON)
49 45 地图事件 Map009.json MAP009 3 EV003 (4,9) 1/16 按确定键 无条件
50 46 地图事件 Map012.json MAP012 3 EV003 (13,5) 1/3 按确定键 无条件
51 46 地图事件 Map012.json MAP012 3 EV003 (13,5) 2/3 按确定键 开关[前往天空区域](需ON)
52 46 地图事件 Map012.json MAP012 3 EV003 (13,5) 3/3 按确定键 开关[天空莉莉亚分头行动](需ON)
53 47 地图事件 Map009.json MAP009 4 EV004 (14,6) 1/2 按确定键 无条件
54 49 地图事件 Map009.json MAP009 4 EV004 (14,6) 1/2 按确定键 无条件
55 57 地图事件 Map008.json MAP008 6 EV006 (12,7) 1/3 按确定键 队伍含角色#1
56 57 地图事件 Map024.json MAP024 7 EV007 (7,8) 1/3 按确定键 队伍含角色#1
57 57 地图事件 Map027.json MAP027 5 EV005 (5,5) 1/2 按确定键 无条件
58 61 公共事件 7 目前的难度是~~ 公共事件#7 开关[开场白完成]
59 62 公共事件 7 目前的难度是~~ 公共事件#7 开关[开场白完成]
60 63 公共事件 7 目前的难度是~~ 公共事件#7 开关[开场白完成]
61 65 公共事件 8 选择简单难度 公共事件#8 开关[开场白完成]
62 65 公共事件 9 选择普通难度 公共事件#9 开关[开场白完成]
63 65 公共事件 10 选择困难难度 公共事件#10 开关[开场白完成]
64 66 地图事件 Map008.json MAP008 6 EV006 (12,7) 1/3 按确定键 队伍含角色#1
65 66 地图事件 Map024.json MAP024 7 EV007 (7,8) 1/3 按确定键 队伍含角色#1
66 66 地图事件 Map027.json MAP027 5 EV005 (5,5) 1/2 按确定键 无条件
67 67 JS:lockTextBalloon() js/nya/nya_game.js:3837
68 68 地图事件 Map040.json MAP040 5 EV005 (12,5) 1/3 按确定键 开关[第一天NPC位置变化1](需ON)
69 69 地图事件 Map040.json MAP040 5 EV005 (12,5) 1/3 按确定键 开关[第一天NPC位置变化1](需ON)
70 70 地图事件 Map013.json MAP013 3 EV003 (7,8) 1/3 按确定键 开关[第一天NPC位置变化1](需ON)
71 72 地图事件 Map013.json MAP013 5 EV005 (4,8) 1/2 按确定键 开关[依铃回到小镇](需ON)
72 72 地图事件 Map013.json MAP013 6 EV006 (6,8) 1/2 按确定键 开关[依铃回到小镇](需ON)
73 73 地图事件 Map013.json MAP013 6 EV006 (6,8) 1/2 按确定键 开关[依铃回到小镇](需ON)
74 74 地图事件 Map013.json MAP013 5 EV005 (4,8) 1/2 按确定键 开关[依铃回到小镇](需ON)
75 75 地图事件 Map032.json MAP032 2 EV002 (5,4) 1/3 按确定键 开关[第一天NPC位置变化1](需ON)
76 76 地图事件 Map032.json MAP032 2 EV002 (5,4) 1/3 按确定键 开关[第一天NPC位置变化1](需ON)
77 78 地图事件 Map011.json MAP011 4 EV004 (6,8) 1/2 按确定键 开关[夏洛克对话后回到小镇](需ON)
78 79 地图事件 Map006.json MAP006 21 EV021 (20,9) 1/2 按确定键 开关[第一天NPC位置变化1](需ON)
79 80 地图事件 Map006.json MAP006 21 EV021 (20,9) 1/2 按确定键 开关[第一天NPC位置变化1](需ON)
80 83 地图事件 Map005.json MAP005 6 EV006 (4,8) 1/2 按确定键 开关[第一天NPC位置变化1](需ON)
81 84 地图事件 Map005.json MAP005 6 EV006 (4,8) 1/2 按确定键 开关[第一天NPC位置变化1](需ON)
82 87 地图事件 Map005.json MAP005 8 EV008 (20,8) 1/2 按确定键 开关[第一天NPC位置变化1](需ON)
83 88 地图事件 Map005.json MAP005 8 EV008 (20,8) 1/2 按确定键 开关[第一天NPC位置变化1](需ON)
84 91 地图事件 Map032.json MAP032 10 EV010 (0,0) 1/1 按确定键 无条件
85 92 地图事件 Map039.json MAP039 3 EV003 (0,0) 1/4 自动执行 无条件
86 93 地图事件 Map044.json MAP044 4 EV004 (10,4) 1/3 按确定键 无条件
87 94 地图事件 Map044.json MAP044 8 EV008 (1,0) 1/2 自动执行 开关[莉莉亚boss战-胜利](需ON)
88 95 地图事件 Map044.json MAP044 10 EV010 (3,4) 1/2 按确定键 开关[莉莉亚boss战-胜利](需ON)
89 96 地图事件 Map009.json MAP009 4 EV004 (14,6) 1/2 按确定键 无条件
90 101 地图事件 Map042.json MAP042 7 EV007 (0,0) 1/2 自动执行 开关[莉莉亚boss战-胜利](需ON)
91 104 地图事件 Map048.json MAP048 4 EV004 (6,6) 1/2 按确定键 开关[老板娘在校长室](需ON)
92 105 地图事件 Map048.json MAP048 4 EV004 (6,6) 1/2 按确定键 开关[老板娘在校长室](需ON)
93 106 地图事件 Map048.json MAP048 4 EV004 (6,6) 1/2 按确定键 开关[老板娘在校长室](需ON)
94 107 地图事件 Map057.json MAP057 24 EV024 (54,5) 1/2 按确定键 开关[第一天NPC位置移动2](需ON)
95 108 地图事件 Map057.json MAP057 24 EV024 (54,5) 1/2 按确定键 开关[第一天NPC位置移动2](需ON)
96 110 地图事件 Map057.json MAP057 35 EV035 (55,0) 1/3 自动执行 开关[山洞防玩家走岔路提示](需ON) 且 开关[第一天NPC位置移动2](需ON)
97 111 地图事件 Map063.json MAP063 9 EV009 (3,6) 1/2 按确定键 开关[第一天NPC位置移动2](需ON)
98 114 地图事件 Map067.json MAP067 20 EV020 (32,9) 1/2 按确定键 开关[第一天NPC位置移动2](需ON)
99 114 地图事件 Map067.json MAP067 21 EV021 (34,9) 1/2 按确定键 开关[第一天NPC位置移动2](需ON)
100 115 地图事件 Map067.json MAP067 21 EV021 (34,9) 1/2 按确定键 开关[第一天NPC位置移动2](需ON)
101 117 地图事件 Map067.json MAP067 20 EV020 (32,9) 1/2 按确定键 开关[第一天NPC位置移动2](需ON)
102 118 地图事件 Map073.json MAP073 10 EV010 (5,0) 1/4 事件接触 开关[第一天NPC位置移动2](需ON)
103 119 地图事件 Map073.json MAP073 13 EV013 (5,6) 1/2 按确定键 开关[橘花猫boss战胜利](需ON)
104 120 地图事件 Map073.json MAP073 14 EV014 (3,0) 1/2 自动执行 开关[橘花猫boss战胜利](需ON)
105 126 地图事件 Map006.json MAP006 17 EV017 (34,9) 1/1 按确定键 无条件
106 126 地图事件 Map006.json MAP006 17 EV017 (34,9) 1/1 按确定键 无条件
107 126 地图事件 Map006.json MAP006 18 EV018 (15,9) 1/1 按确定键 无条件
108 126 地图事件 Map006.json MAP006 18 EV018 (15,9) 1/1 按确定键 无条件
109 126 地图事件 Map006.json MAP006 18 EV018 (15,9) 1/1 按确定键 无条件
110 126 地图事件 Map006.json MAP006 19 EV019 (18,9) 1/3 按确定键 无条件
111 126 地图事件 Map006.json MAP006 19 EV019 (18,9) 2/3 按确定键 开关[天空区域开启](需ON)
112 126 地图事件 Map006.json MAP006 19 EV019 (18,9) 3/3 按确定键 开关[第三天开启](需ON)
113 126 地图事件 Map007.json MAP007 4 EV004 (16,9) 1/2 按确定键 无条件
114 126 地图事件 Map007.json MAP007 4 EV004 (16,9) 1/2 按确定键 无条件
115 126 地图事件 Map007.json MAP007 4 EV004 (16,9) 2/2 按确定键 开关[第三天夜晚](需ON)
116 126 地图事件 Map039.json MAP039 8 EV008 (41,29) 1/1 按确定键 无条件
117 126 地图事件 Map170.json MAP170 5 EV005 (21,4) 1/5 按确定键 无条件
118 126 地图事件 Map170.json MAP170 5 EV005 (21,4) 4/5 按确定键 开关[第三天夜晚](需ON)
119 126 地图事件 Map170.json MAP170 5 EV005 (21,4) 5/5 按确定键 开关[新后日谈第二天夜晚](需ON)
120 126 地图事件 Map189.json MAP189 4 EV004 (9,7) 1/3 按确定键 无条件
121 126 地图事件 Map189.json MAP189 4 EV004 (9,7) 1/3 按确定键 无条件
122 126 地图事件 Map189.json MAP189 4 EV004 (9,7) 1/3 按确定键 无条件
123 126 地图事件 Map189.json MAP189 4 EV004 (9,7) 1/3 按确定键 无条件
124 126 地图事件 Map189.json MAP189 5 EV005 (29,7) 1/3 按确定键 无条件
125 126 地图事件 Map189.json MAP189 5 EV005 (29,7) 1/3 按确定键 无条件
126 126 地图事件 Map189.json MAP189 5 EV005 (29,7) 1/3 按确定键 无条件
127 126 地图事件 Map189.json MAP189 5 EV005 (29,7) 1/3 按确定键 无条件
128 126 地图事件 Map296.json MAP296 1 EV001 (28,14) 1/1 按确定键 无条件
129 126 地图事件 Map296.json MAP296 1 EV001 (28,14) 1/1 按确定键 无条件
130 126 地图事件 Map301.json MAP301 5 EV005 (11,13) 1/1 按确定键 无条件
131 126 地图事件 Map381.json MAP381 4 EV004 (16,12) 4/5 按确定键 开关[莉伊进门缝眼睛](需ON)
132 130 JS数组(浮动消息) js/nya/nya_ai.js:655
133 130 JS数组(浮动消息) js/nya/nya_ai.js:659
134 130 JS数组(浮动消息) js/nya/nya_ai.js:663
135 130 JS数组(浮动消息) js/nya/nya_ai.js:667
136 131 JS数组(浮动消息) js/nya/nya_ai.js:655
137 131 JS数组(浮动消息) js/nya/nya_ai.js:659
138 131 JS数组(浮动消息) js/nya/nya_ai.js:663
139 131 JS数组(浮动消息) js/nya/nya_ai.js:667
140 132 JS数组(浮动消息) js/nya/nya_ai.js:655
141 132 JS数组(浮动消息) js/nya/nya_ai.js:659
142 132 JS数组(浮动消息) js/nya/nya_ai.js:663
143 132 JS数组(浮动消息) js/nya/nya_ai.js:667
144 133 JS数组(浮动消息) js/nya/nya_ai.js:667
145 134 JS数组(浮动消息) js/nya/nya_ai.js:667
146 135 JS数组(浮动消息) js/nya/nya_ai.js:667
147 138 JS:requestUniqueFloatMessage() js/nya/nya_ai.js:852
148 139 JS数组(浮动消息) js/nya/nya_ai.js:659
149 140 JS数组(浮动消息) js/nya/nya_ai.js:659
150 141 JS数组(浮动消息) js/nya/nya_ai.js:659
151 143 JS:requestUniqueFloatMessage() js/nya/nya_ai.js:791
152 145 JS数组(浮动消息) js/nya/nya_ai.js:663
153 146 JS数组(浮动消息) js/nya/nya_ai.js:663
154 147 JS数组(浮动消息) js/nya/nya_ai.js:663
155 150 地图事件 Map170.json MAP170 5 EV005 (21,4) 1/5 按确定键 无条件
156 151 地图事件 Map039.json MAP039 15 EV015 (33,25) 1/2 事件接触 开关[第一天夜晚门锁](需ON) 且 开关[从天台进入学校外景](需ON)
157 152 JS数组(浮动消息) js/nya/nya_ai.js:655
158 153 JS数组(浮动消息) js/nya/nya_ai.js:655
159 154 JS数组(浮动消息) js/nya/nya_ai.js:655
160 155 公共事件 95 第一天晚上回家 公共事件#95 开关[开场白完成]
161 156 地图事件 Map004.json MAP004 8 EV008 (2,0) 1/8 自动执行 开关[第一天夜晚莉莉亚回家](需ON)
162 157 地图事件 Map004.json MAP004 7 EV007 (5,6) 1/4 按确定键 开关[第一天夜晚莉莉亚回家](需ON)
163 158 公共事件 16 选择简单难度2 公共事件#16 开关[开场白完成]
164 158 公共事件 17 选择普通难度2 公共事件#17 开关[开场白完成]
165 158 公共事件 18 选择困难难度2 公共事件#18 开关[开场白完成]
166 162 地图事件 Map004.json MAP004 5 EV005 (1,4) 3/6 按确定键 开关[第一天夜晚门锁](需ON)
167 163 地图事件 Map004.json MAP004 8 EV008 (2,0) 3/8 自动执行 开关[第二天开启](需ON)
168 164 地图事件 Map012.json MAP012 6 EV006 (1,0) 1/8 自动执行 开关[第一天夜晚莉莉亚回家](需ON)
169 165 地图事件 Map012.json MAP012 6 EV006 (1,0) 1/8 自动执行 开关[第一天夜晚莉莉亚回家](需ON)
170 166 地图事件 Map012.json MAP012 6 EV006 (1,0) 1/8 自动执行 开关[第一天夜晚莉莉亚回家](需ON)
171 167 地图事件 Map012.json MAP012 5 EV005 (13,6) 1/2 按确定键 开关[第一天夜晚莉莉亚回家](需ON)
172 168 公共事件 22 山洞校长主线 公共事件#22 开关[开场白完成]
173 169 地图事件 Map007.json MAP007 3 EV003 (7,9) 1/4 按确定键 无条件
174 170 地图事件 Map004.json MAP004 4 EV004 (3,4) 1/4 按确定键 无条件
175 171 地图事件 Map047.json MAP047 3 EV003 (5,4) 1/2 按确定键 开关[第一天夜晚](需ON)
176 172 地图事件 Map047.json MAP047 3 EV003 (5,4) 1/2 按确定键 开关[第一天夜晚](需ON)
177 172 地图事件 Map047.json MAP047 3 EV003 (5,4) 1/2 按确定键 开关[第一天夜晚](需ON)
178 173 地图事件 Map047.json MAP047 3 EV003 (5,4) 1/2 按确定键 开关[第一天夜晚](需ON)
179 176 地图事件 Map107.json MAP107 4 EV004 (4,0) 1/3 事件接触 开关[第二天开启](需ON)
180 177 地图事件 Map107.json MAP107 5 EV005 (1,0) 2/3 自动执行 开关[水底莉莉亚胜利](需ON)
181 178 地图事件 Map107.json MAP107 6 EV006 (6,7) 1/2 按确定键 开关[水底莉莉亚胜利](需ON)
182 179 地图事件 Map107.json MAP107 6 EV006 (6,7) 1/2 按确定键 开关[水底莉莉亚胜利](需ON)
183 181 地图事件 Map108.json MAP108 6 EV006 (1,0) 1/2 自动执行 开关[水底莉莉亚胜利](需ON)
184 182 地图事件 Map049.json MAP049 3 EV003 (8,7) 1/2 按确定键 开关[前往天空区域](需ON)
185 183 地图事件 Map049.json MAP049 3 EV003 (8,7) 1/2 按确定键 开关[前往天空区域](需ON)
186 183 地图事件 Map049.json MAP049 3 EV003 (8,7) 1/2 按确定键 开关[前往天空区域](需ON)
187 184 地图事件 Map049.json MAP049 3 EV003 (8,7) 1/2 按确定键 开关[前往天空区域](需ON)
188 185 地图事件 Map076.json MAP076 3 EV003 (5,10) 1/2 按确定键 开关[第二天开启](需ON)
189 186 地图事件 Map097.json MAP097 16 EV016 (11,9) 1/2 按确定键 开关[第二天开启](需ON)
190 187 地图事件 Map097.json MAP097 16 EV016 (11,9) 1/2 按确定键 开关[第二天开启](需ON)
191 187 地图事件 Map126.json MAP126 6 EV006 (16,6) 1/2 按确定键 开关[天空区域开启](需ON)
192 188 地图事件 Map037.json MAP037 15 EV015 (47,0) 1/2 事件接触 开关[前往天空区域](需ON)
193 194 地图事件 Map034.json MAP034 14 EV014 (32,6) 3/4 按确定键 开关[第一天夜晚](需ON)
194 194 公共事件 26 传送门公共事件 公共事件#26 开关[开场白完成]
195 195 地图事件 Map110.json MAP110 2 EV002 (0,0) 1/2 自动执行 开关[大蘑菇出现](需ON)
196 197 公共事件 32 水底依铃抓鱼任务 公共事件#32 开关[开场白完成]
197 198 公共事件 28 水底依铃支线分支判断 公共事件#28 开关[开场白完成]
198 199 公共事件 28 水底依铃支线分支判断 公共事件#28 开关[开场白完成]
199 200 地图事件 Map102.json MAP102 9 EV009 (13,6) 1/3 按确定键 开关[第二天开启](需ON)
200 201 地图事件 Map102.json MAP102 10 EV010 (15,6) 1/3 按确定键 开关[第二天开启](需ON)
201 204 地图事件 Map093.json MAP093 61 EV061 (11,28) 1/2 按确定键 开关[第二天开启](需ON)
202 205 地图事件 Map093.json MAP093 61 EV061 (11,28) 1/2 按确定键 开关[第二天开启](需ON)
203 206 地图事件 Map093.json MAP093 61 EV061 (11,28) 1/2 按确定键 开关[第二天开启](需ON)
204 209 公共事件 34 水底露茜亚梅卡闲聊 公共事件#34 开关[开场白完成]
205 210 公共事件 34 水底露茜亚梅卡闲聊 公共事件#34 开关[开场白完成]
206 211 地图事件 Map094.json MAP094 53 EV053 (13,30) 1/2 按确定键 开关[第二天开启](需ON)
207 212 地图事件 Map094.json MAP094 54 EV054 (15,30) 1/2 按确定键 开关[第二天开启](需ON)
208 217 地图事件 Map093.json MAP093 63 EV063 (9,28) 1/2 按确定键 无条件
209 217 地图事件 Map093.json MAP093 63 EV063 (9,28) 2/2 按确定键 开关[水底关密码锁打开](需ON)
210 218 地图事件 Map093.json MAP093 63 EV063 (9,28) 1/2 按确定键 无条件
211 219 地图事件 Map093.json MAP093 63 EV063 (9,28) 1/2 按确定键 无条件
212 220 地图事件 Map089.json MAP089 7 EV007 (0,0) 1/2 自动执行 开关[水底关密码锁打开](需ON)
213 221 地图事件 Map089.json MAP089 7 EV007 (0,0) 1/2 自动执行 开关[水底关密码锁打开](需ON)
214 222 地图事件 Map006.json MAP006 33 EV033 (13,4) 1/2 按确定键 开关[第二天开启](需ON)
215 226 地图事件 Map009.json MAP009 3 EV003 (4,9) 3/16 按确定键 开关[前往天空区域](需ON)
216 227 地图事件 Map004.json MAP004 4 EV004 (3,4) 2/4 按确定键 开关[前往天空区域](需ON)
217 228 地图事件 Map004.json MAP004 5 EV005 (1,4) 4/6 按确定键 开关[前往天空区域](需ON)
218 229 地图事件 Map012.json MAP012 3 EV003 (13,5) 2/3 按确定键 开关[前往天空区域](需ON)
219 230 JS数组(浮动消息) js/nya/nya_ai.js:680
220 231 JS数组(浮动消息) js/nya/nya_ai.js:680
221 232 JS数组(浮动消息) js/nya/nya_ai.js:680
222 233 JS数组(浮动消息) js/nya/nya_ai.js:680
223 234 JS数组(浮动消息) js/nya/nya_ai.js:680
224 235 JS:triggerUniqueFloatMessage() js/nya/nya_statem_ext.js:2234
225 237 JS数组(浮动消息) js/nya/nya_game_system.js:9736
226 238 地图事件 Map004.json MAP004 5 EV005 (1,4) 4/6 按确定键 开关[前往天空区域](需ON)
227 238 地图事件 Map004.json MAP004 5 EV005 (1,4) 4/6 按确定键 开关[前往天空区域](需ON)
228 238 地图事件 Map004.json MAP004 5 EV005 (1,4) 6/6 按确定键 开关[第三天开启](需ON)
229 239 地图事件 Map013.json MAP013 8 EV008 (6,4) 1/2 按确定键 开关[依铃蕾铃从水底回家](需ON)
230 240 地图事件 Map013.json MAP013 7 EV007 (3,8) 1/2 按确定键 开关[依铃蕾铃从水底回家](需ON)
231 241 地图事件 Map113.json MAP113 7 EV007 (0,0) 1/2 自动执行 开关[天空区域开启](需ON)
232 242 地图事件 Map152.json MAP152 5 EV005 (0,0) 1/3 自动执行 开关[天空区域开启](需ON)
233 243 地图事件 Map006.json MAP006 19 EV019 (18,9) 2/3 按确定键 开关[天空区域开启](需ON)
234 244 地图事件 Map066.json MAP066 9 EV009 (11,6) 1/2 按确定键 开关[天空区域开启](需ON)
235 245 公共事件 39 梅卡喂猫牛对话判断 公共事件#39 开关[开场白完成]
236 246 公共事件 39 梅卡喂猫牛对话判断 公共事件#39 开关[开场白完成]
237 251 地图事件 Map171.json MAP171 4 EV004 (13,16) 1/2 按确定键 开关[老板娘战后对话完](需ON)
238 252 地图事件 Map113.json MAP113 14 EV014 (2,34) 1/3 按确定键 开关[天空区域开启](需ON)
239 253 地图事件 Map113.json MAP113 14 EV014 (2,34) 1/3 按确定键 开关[天空区域开启](需ON)
240 254 地图事件 Map126.json MAP126 6 EV006 (16,6) 1/2 按确定键 开关[天空区域开启](需ON)
241 255 地图事件 Map010.json MAP010 5 EV005 (8,6) 1/2 按确定键 开关[天空区域开启](需ON)
242 256 地图事件 Map039.json MAP039 17 EV017 (2,0) 1/2 自动执行 开关[老板娘BOSS战胜利](需ON)
243 257 地图事件 Map039.json MAP039 18 EV018 (70,49) 1/2 按确定键 开关[老板娘BOSS战胜利](需ON)
244 258 地图事件 Map170.json MAP170 5 EV005 (21,4) 1/5 按确定键 无条件
245 259 地图事件 Map171.json MAP171 3 EV003 (1,0) 1/2 自动执行 开关[老板娘战后对话完](需ON)
246 260 公共事件 42 烤鱼派对小演出 公共事件#42 开关[开场白完成]
247 261 公共事件 42 烤鱼派对小演出 公共事件#42 开关[开场白完成]
248 262 公共事件 42 烤鱼派对小演出 公共事件#42 开关[开场白完成]
249 263 地图事件 Map007.json MAP007 3 EV003 (7,9) 1/4 按确定键 无条件
250 263 地图事件 Map007.json MAP007 4 EV004 (16,9) 1/2 按确定键 无条件
251 264 地图事件 Map004.json MAP004 8 EV008 (2,0) 5/8 自动执行 开关[老板娘战后对话完](需ON)
252 265 地图事件 Map039.json MAP039 33 EV033 (52,28) 1/2 事件接触 开关[烤鱼派对结束](需ON)
253 266 地图事件 Map039.json MAP039 31 EV031 (52,29) 2/4 按确定键 开关[烤鱼派对结束](需ON)
254 267 地图事件 Map171.json MAP171 6 EV006 (14,16) 1/1 按确定键 无条件
255 268 地图事件 Map171.json MAP171 8 EV008 (5,12) 1/1 按确定键 无条件
256 269 地图事件 Map171.json MAP171 10 EV010 (11,8) 1/1 按确定键 无条件
257 270 地图事件 Map171.json MAP171 11 EV011 (13,13) 1/1 按确定键 无条件
258 271 地图事件 Map171.json MAP171 9 EV009 (3,17) 1/1 按确定键 无条件
259 272 地图事件 Map171.json MAP171 7 EV007 (16,7) 1/2 按确定键 开关[老板娘战后对话完](需ON)
260 273 地图事件 Map171.json MAP171 7 EV007 (16,7) 1/2 按确定键 开关[老板娘战后对话完](需ON)
261 274 地图事件 Map007.json MAP007 4 EV004 (16,9) 1/2 按确定键 无条件
262 275 地图事件 Map155.json MAP155 3 EV003 (0,0) 1/2 自动执行 开关[结界入口开启](需ON)
263 276 JS数组(浮动消息) js/nya/nya_ai.js:695
264 277 JS:triggerUniqueFloatMessage() js/nya/nya_statem_ext.js:4537
265 278 JS数组(浮动消息) js/nya/nya_ai.js:695
266 279 JS数组(浮动消息) js/nya/nya_ai.js:695
267 280 JS数组(浮动消息) js/nya/nya_ai.js:695
268 281 地图事件 Map039.json MAP039 34 EV034 (52,27) 1/2 按确定键 开关[结界入口开启](需ON)
269 281 地图事件 Map217.json MAP217 7 EV007 (11,8) 1/2 按确定键 开关[德古拉准备开启结界](需ON)
270 282 JS:lockTextBalloon() js/nya/nya_game.js:3829
271 283 JS:lockTextBalloon() js/nya/nya_game.js:3839
272 284 地图事件 Map039.json MAP039 31 EV031 (52,29) 2/4 按确定键 开关[烤鱼派对结束](需ON)
273 285 地图事件 Map169.json MAP169 26 EV026 (2,0) 2/4 自动执行 独立开关A=ON
274 286 地图事件 Map169.json MAP169 24 EV024 (53,12) 3/4 自动执行 开关[恶魔墙胜利](需ON)
275 287 地图事件 Map172.json MAP172 10 EV010 (0,0) 1/2 自动执行 开关[恶魔墙胜利](需ON)
276 288 地图事件 Map173.json MAP173 11 EV011 (2,22) 1/2 按确定键 开关[老板娘战后对话完](需ON)
277 289 地图事件 Map039.json MAP039 31 EV031 (52,29) 2/4 按确定键 开关[烤鱼派对结束](需ON)
278 290 地图事件 Map173.json MAP173 11 EV011 (2,22) 1/2 按确定键 开关[老板娘战后对话完](需ON)
279 290 地图事件 Map248.json MAP248 33 EV033 (5,56) 1/2 按确定键 开关[德古拉准备开启结界](需ON)
280 290 地图事件 Map282.json MAP282 21 EV021 (65,7) 1/2 按确定键 开关[第四天开启](需ON)
281 291 地图事件 Map181.json MAP181 19 EV019 (5,0) 1/2 自动执行 开关[恶魔墙胜利](需ON)
282 292 地图事件 Map181.json MAP181 2 EV002 (20,20) 1/5 按确定键 开关[恶魔墙胜利](需ON)
283 293 地图事件 Map173.json MAP173 12 EV012 (1,0) 1/2 自动执行 开关[恶魔墙胜利](需ON)
284 294 地图事件 Map171.json MAP171 13 EV013 (2,0) 1/3 自动执行 开关[结界入口开启](需ON)
285 295 地图事件 Map171.json MAP171 4 EV004 (13,16) 1/2 按确定键 开关[老板娘战后对话完](需ON)
286 296 地图事件 Map171.json MAP171 7 EV007 (16,7) 1/2 按确定键 开关[老板娘战后对话完](需ON)
287 297 地图事件 Map171.json MAP171 7 EV007 (16,7) 1/2 按确定键 开关[老板娘战后对话完](需ON)
288 298 地图事件 Map182.json MAP182 3 EV003 (0,0) 1/6 自动执行 开关[喵朵露BOSS战胜利](需ON)
289 299 地图事件 Map182.json MAP182 3 EV003 (0,0) 1/6 自动执行 开关[喵朵露BOSS战胜利](需ON)
290 300 地图事件 Map174.json MAP174 217 EV217 (26,46) 1/2 按确定键 开关[莉莉亚走丢](需ON)
291 301 地图事件 Map039.json MAP039 31 EV031 (52,29) 3/4 事件接触 开关[封印结界调查完毕](需ON)
292 302 地图事件 Map007.json MAP007 3 EV003 (7,9) 1/4 按确定键 无条件
293 303 地图事件 Map004.json MAP004 8 EV008 (2,0) 7/8 自动执行 开关[封印结界调查完毕](需ON)
294 304 地图事件 Map004.json MAP004 5 EV005 (1,4) 5/6 按确定键 开关[封印结界调查完毕](需ON)
295 305 地图事件 Map182.json MAP182 3 EV003 (0,0) 1/6 自动执行 开关[喵朵露BOSS战胜利](需ON)
296 308 地图事件 Map182.json MAP182 4 EV004 (12,11) 1/6 按确定键 开关[恶魔墙胜利](需ON)
297 308 地图事件 Map182.json MAP182 4 EV004 (12,11) 2/6 按确定键 开关[恶魔墙胜利](需ON) 且 独立开关A=ON
298 308 地图事件 Map182.json MAP182 4 EV004 (12,11) 3/6 按确定键 开关[恶魔墙胜利](需ON) 且 独立开关B=ON
299 309 地图事件 Map182.json MAP182 4 EV004 (12,11) 1/6 按确定键 开关[恶魔墙胜利](需ON)
300 310 地图事件 Map182.json MAP182 4 EV004 (12,11) 2/6 按确定键 开关[恶魔墙胜利](需ON) 且 独立开关A=ON
301 311 地图事件 Map182.json MAP182 4 EV004 (12,11) 3/6 按确定键 开关[恶魔墙胜利](需ON) 且 独立开关B=ON
302 312 地图事件 Map182.json MAP182 4 EV004 (12,11) 4/6 按确定键 开关[恶魔墙胜利](需ON) 且 独立开关C=ON
303 313 地图事件 Map006.json MAP006 24 EV024 (4,9) 1/2 按确定键 开关[第三天开启](需ON)
304 313 地图事件 Map006.json MAP006 25 EV025 (6,9) 1/2 按确定键 开关[第三天开启](需ON)
305 314 地图事件 Map006.json MAP006 25 EV025 (6,9) 1/2 按确定键 开关[第三天开启](需ON)
306 315 地图事件 Map006.json MAP006 24 EV024 (4,9) 1/2 按确定键 开关[第三天开启](需ON)
307 320 地图事件 Map004.json MAP004 7 EV007 (5,6) 3/4 按确定键 开关[封印结界调查完毕](需ON)
308 322 地图事件 Map007.json MAP007 3 EV003 (7,9) 2/4 按确定键 开关[第三天开启](需ON)
309 323 地图事件 Map007.json MAP007 3 EV003 (7,9) 2/4 按确定键 开关[第三天开启](需ON)
310 324 地图事件 Map135.json MAP135 5 EV005 (25,6) 1/2 按确定键 开关[第三天开启](需ON)
311 324 地图事件 Map135.json MAP135 6 EV006 (26,6) 1/2 按确定键 开关[第三天开启](需ON)
312 325 地图事件 Map135.json MAP135 6 EV006 (26,6) 1/2 按确定键 开关[第三天开启](需ON)
313 326 地图事件 Map135.json MAP135 5 EV005 (25,6) 1/2 按确定键 开关[第三天开启](需ON)
314 327 地图事件 Map009.json MAP009 3 EV003 (4,9) 5/16 按确定键 开关[第三天开启](需ON)
315 328 地图事件 Map039.json MAP039 35 EV035 (32,15) 1/3 按确定键 开关[第三天开启](需ON)
316 329 地图事件 Map039.json MAP039 35 EV035 (32,15) 1/3 按确定键 开关[第三天开启](需ON)
317 330 地图事件 Map192.json MAP192 10 EV010 (1,0) 1/2 自动执行 开关[莲boss战准备](需ON)
318 331 地图事件 Map192.json MAP192 20 EV020 (18,7) 1/2 自动执行 开关[莲boss战胜利](需ON) 莲BOSS战胜利后的NPC事件
319 332 地图事件 Map191.json MAP191 3 EV003 (4,5) 1/3 按确定键 开关[莲boss战胜利](需ON)
320 334 地图事件 Map191.json MAP191 3 EV003 (4,5) 1/3 按确定键 开关[莲boss战胜利](需ON)
321 335 地图事件 Map191.json MAP191 3 EV003 (4,5) 1/3 按确定键 开关[莲boss战胜利](需ON)
322 336 地图事件 Map191.json MAP191 3 EV003 (4,5) 1/3 按确定键 开关[莲boss战胜利](需ON)
323 337 地图事件 Map191.json MAP191 3 EV003 (4,5) 1/3 按确定键 开关[莲boss战胜利](需ON)
324 338 地图事件 Map191.json MAP191 3 EV003 (4,5) 1/3 按确定键 开关[莲boss战胜利](需ON)
325 339 地图事件 Map191.json MAP191 3 EV003 (4,5) 1/3 按确定键 开关[莲boss战胜利](需ON)
326 340 地图事件 Map184.json MAP184 498 EV498 (32,142) 1/2 按确定键 开关[第三天开启](需ON)
327 341 地图事件 Map184.json MAP184 498 EV498 (32,142) 1/2 按确定键 开关[第三天开启](需ON)
328 342 地图事件 Map184.json MAP184 497 EV497 (64,0) 1/3 自动执行 变量[莲对话进度]>=1
329 343 地图事件 Map006.json MAP006 38 EV038 (32,9) 1/3 按确定键 开关[恶魔城莉莉亚入队](需ON)
330 344 地图事件 Map006.json MAP006 38 EV038 (32,9) 1/3 按确定键 开关[恶魔城莉莉亚入队](需ON)
331 345 地图事件 Map007.json MAP007 3 EV003 (7,9) 3/4 按确定键 变量[莲对话进度]>=1
332 346 地图事件 Map012.json MAP012 6 EV006 (1,0) 4/8 自动执行 变量[莲对话进度]>=1
333 347 公共事件 26 传送门公共事件 公共事件#26 开关[开场白完成]
334 347 公共事件 26 传送门公共事件 公共事件#26 开关[开场白完成]
335 347 公共事件 26 传送门公共事件 公共事件#26 开关[开场白完成]
336 348 地图事件 Map098.json MAP098 159 EV159 (4,6) 1/3 按确定键 变量[莲对话进度]>=1
337 349 地图事件 Map098.json MAP098 161 EV161 (7,6) 1/3 按确定键 变量[莲对话进度]>=1
338 350 地图事件 Map039.json MAP039 50 EV050 (74,49) 1/3 按确定键 变量[莲对话进度]>=1
339 350 地图事件 Map039.json MAP039 51 EV051 (76,51) 1/3 按确定键 变量[莲对话进度]>=1
340 351 地图事件 Map039.json MAP039 50 EV050 (74,49) 1/3 按确定键 变量[莲对话进度]>=1
341 352 地图事件 Map039.json MAP039 51 EV051 (76,51) 1/3 按确定键 变量[莲对话进度]>=1
342 353 地图事件 Map045.json MAP045 5 EV005 (6,5) 1/3 按确定键 变量[莲对话进度]>=1
343 354 地图事件 Map045.json MAP045 5 EV005 (6,5) 1/3 按确定键 变量[莲对话进度]>=1
344 355 地图事件 Map045.json MAP045 5 EV005 (6,5) 1/3 按确定键 变量[莲对话进度]>=1
345 356 地图事件 Map191.json MAP191 3 EV003 (4,5) 1/3 按确定键 开关[莲boss战胜利](需ON)
346 357 地图事件 Map191.json MAP191 3 EV003 (4,5) 1/3 按确定键 开关[莲boss战胜利](需ON)
347 358 地图事件 Map191.json MAP191 3 EV003 (4,5) 1/3 按确定键 开关[莲boss战胜利](需ON)
348 359 地图事件 Map214.json MAP214 1 EV001 (41,25) 1/2 事件接触 开关[恶魔城莉莉亚入队](需ON)
349 359 地图事件 Map223.json MAP223 3 EV003 (0,0) 1/2 自动执行 开关[恶魔城莉莉亚入队](需ON)
350 360 地图事件 Map224.json MAP224 5 EV005 (9,0) 1/3 事件接触 开关[恶魔城莉莉亚离队](需ON)
351 361 地图事件 Map223.json MAP223 5 EV005 (4,6) 1/2 按确定键 开关[恶魔城莉莉亚入队](需ON)
352 362 地图事件 Map223.json MAP223 5 EV005 (4,6) 1/2 按确定键 开关[恶魔城莉莉亚入队](需ON)
353 363 地图事件 Map196.json MAP196 3 EV003 (0,0) 1/2 自动执行 开关[德古拉胜利](需ON)
354 364 地图事件 Map196.json MAP196 3 EV003 (0,0) 1/2 自动执行 开关[德古拉胜利](需ON)
355 365 地图事件 Map196.json MAP196 2 EV002 (4,7) 1/3 按确定键 开关[德古拉胜利](需ON)
356 366 地图事件 Map224.json MAP224 10 EV010 (7,8) 1/2 按确定键 开关[管家来到大厅](需ON)
357 367 地图事件 Map004.json MAP004 11 EV011 (5,0) 1/2 自动执行 开关[德古拉交谈完](需ON)
358 367 地图事件 Map006.json MAP006 43 EV043 (4,0) 1/2 自动执行 开关[德古拉交谈完](需ON)
359 367 地图事件 Map223.json MAP223 6 EV006 (1,0) 1/2 自动执行 开关[德古拉交谈完](需ON)
360 368 地图事件 Map196.json MAP196 2 EV002 (4,7) 2/3 按确定键 开关[喵露露折返](需ON)
361 369 地图事件 Map196.json MAP196 2 EV002 (4,7) 2/3 按确定键 开关[喵露露折返](需ON)
362 370 地图事件 Map217.json MAP217 7 EV007 (11,8) 1/2 按确定键 开关[德古拉准备开启结界](需ON)
363 372 地图事件 Map170.json MAP170 5 EV005 (21,4) 2/5 按确定键 开关[封印结界调查完毕](需ON)
364 374 公共事件 20 喵露露还钱 公共事件#20 开关[开场白完成]
365 375 公共事件 20 喵露露还钱 公共事件#20 开关[开场白完成]
366 376 地图事件 Map188.json MAP188 7 EV007 (21,8) 1/3 按确定键 开关[天空莉莉亚分头行动](需ON)
367 377 地图事件 Map188.json MAP188 7 EV007 (21,8) 1/3 按确定键 开关[天空莉莉亚分头行动](需ON)
368 378 地图事件 Map192.json MAP192 23 EV023 (5,7) 1/2 按确定键 开关[图书馆莉莉亚被推下去](需ON)
369 379 地图事件 Map007.json MAP007 15 EV015 (30,9) 1/3 按确定键 开关[老板娘战后对话完](需ON)
370 380 地图事件 Map170.json MAP170 6 EV006 (14,4) 1/1 按确定键 无条件
371 381 地图事件 Map007.json MAP007 3 EV003 (7,9) 1/4 按确定键 无条件
372 382 地图事件 Map215.json MAP215 2 EV002 (7,29) 1/2 按确定键 开关[恶魔城莉莉亚离队](需ON)
373 383 地图事件 Map215.json MAP215 2 EV002 (7,29) 1/2 按确定键 开关[恶魔城莉莉亚离队](需ON)
374 384 地图事件 Map239.json MAP239 11 EV011 (0,0) 1/2 自动执行 开关[德古拉准备开启结界](需ON)
375 385 地图事件 Map264.json MAP264 14 EV014 (4,0) 1/3 事件接触 开关[初遇结界2](需ON)
376 386 地图事件 Map264.json MAP264 18 EV018 (3,9) 2/3 按确定键 开关[心魔莉莉亚胜利](需ON)
377 387 地图事件 Map182.json MAP182 3 EV003 (0,0) 3/6 自动执行 开关[心魔莉莉亚胜利](需ON)
378 388 地图事件 Map004.json MAP004 10 EV010 (4,0) 3/4 自动执行 开关[第二次离开结界](需ON)
379 389 地图事件 Map004.json MAP004 10 EV010 (4,0) 3/4 自动执行 开关[第二次离开结界](需ON)
380 390 地图事件 Map039.json MAP039 52 EV052 (45,41) 1/2 按确定键 开关[第四天开启](需ON)
381 391 地图事件 Map284.json MAP284 16 EV016 (15,20) 1/2 事件接触 开关[雪原任务开启](需ON)
382 392 地图事件 Map295.json MAP295 2 EV002 (4,0) 1/3 事件接触 开关[雪原任务开启](需ON)
383 393 地图事件 Map296.json MAP296 9 EV009 (13,18) 1/2 按确定键 开关[心渊BOSS战胜利](需ON)
384 394 地图事件 Map296.json MAP296 9 EV009 (13,18) 1/2 按确定键 开关[心渊BOSS战胜利](需ON)
385 395 地图事件 Map007.json MAP007 3 EV003 (7,9) 4/4 按确定键 开关[恶魔城莉莉亚入队](需ON)
386 396 地图事件 Map009.json MAP009 3 EV003 (4,9) 7/16 按确定键 开关[第三天夜晚](需ON)
387 397 地图事件 Map009.json MAP009 3 EV003 (4,9) 8/16 按确定键 开关[第四天开启](需ON)
388 398 地图事件 Map248.json MAP248 33 EV033 (5,56) 1/2 按确定键 开关[德古拉准备开启结界](需ON)
389 399 地图事件 Map282.json MAP282 21 EV021 (65,7) 1/2 按确定键 开关[第四天开启](需ON)
390 400 地图事件 Map039.json MAP039 4 EV004 (54,29) 1/4 按确定键 开关[前往天空区域](需ON)
391 401 地图事件 Map039.json MAP039 31 EV031 (52,29) 1/4 按确定键 开关[烤鱼派对开始](需ON)
392 402 地图事件 Map170.json MAP170 7 EV007 (17,4) 1/2 按确定键 开关[第二天开启](需ON)
393 403 地图事件 Map170.json MAP170 5 EV005 (21,4) 1/5 按确定键 无条件
394 404 地图事件 Map009.json MAP009 7 EV007 (8,10) 1/2 按确定键 开关[第四天开启](需ON)
395 404 地图事件 Map009.json MAP009 7 EV007 (8,10) 1/2 按确定键 开关[第四天开启](需ON)
396 405 地图事件 Map009.json MAP009 7 EV007 (8,10) 1/2 按确定键 开关[第四天开启](需ON)
397 405 地图事件 Map009.json MAP009 7 EV007 (8,10) 1/2 按确定键 开关[第四天开启](需ON)
398 406 地图事件 Map171.json MAP171 15 EV015 (6,11) 1/2 按确定键 开关[雪原任务开启](需ON)
399 407 地图事件 Map186.json MAP186 2 EV002 (8,7) 1/2 按确定键 开关[第四天开启](需ON)
400 408 地图事件 Map186.json MAP186 2 EV002 (8,7) 1/2 按确定键 开关[第四天开启](需ON)
401 409 地图事件 Map186.json MAP186 2 EV002 (8,7) 1/2 按确定键 开关[第四天开启](需ON)
402 410 地图事件 Map252.json MAP252 2 EV002 (15,7) 1/1 按确定键 无条件
403 411 地图事件 Map253.json MAP253 2 EV002 (16,7) 1/2 按确定键 无条件
404 412 地图事件 Map187.json MAP187 3 EV003 (9,6) 1/2 按确定键 开关[第三天夜晚](需ON)
405 413 地图事件 Map213.json MAP213 7 EV007 (10,7) 1/2 按确定键 开关[第二天开启](需ON)
406 414 地图事件 Map282.json MAP282 22 EV022 (130,9) 1/2 按确定键 开关[前往天空区域](需ON)
407 414 地图事件 Map282.json MAP282 22 EV022 (130,9) 1/2 按确定键 开关[前往天空区域](需ON)
408 415 地图事件 Map282.json MAP282 22 EV022 (130,9) 1/2 按确定键 开关[前往天空区域](需ON)
409 415 地图事件 Map282.json MAP282 22 EV022 (130,9) 1/2 按确定键 开关[前往天空区域](需ON)
410 416 地图事件 Map171.json MAP171 14 EV014 (16,12) 1/2 按确定键 开关[第三天开启](需ON)
411 417 地图事件 Map223.json MAP223 1 EV001 (6,6) 1/2 按确定键 开关[第四天开启](需ON)
412 418 地图事件 Map223.json MAP223 1 EV001 (6,6) 1/2 按确定键 开关[第四天开启](需ON)
413 419 地图事件 Map223.json MAP223 2 EV002 (14,10) 1/2 按确定键 开关[第四天开启](需ON)
414 419 地图事件 Map223.json MAP223 2 EV002 (14,10) 1/2 按确定键 开关[第四天开启](需ON)
415 420 地图事件 Map045.json MAP045 6 EV006 (10,5) 1/4 自动执行 开关[开场白完成](需ON)
416 421 地图事件 Map005.json MAP005 14 EV014 (18,8) 1/2 按确定键 开关[第四天开启](需ON)
417 424 地图事件 Map005.json MAP005 15 EV015 (22,8) 1/2 按确定键 开关[第四天开启](需ON)
418 425 地图事件 Map005.json MAP005 16 EV016 (24,8) 1/2 按确定键 开关[第四天开启](需ON)
419 428 地图事件 Map005.json MAP005 5 EV005 (17,8) 1/2 按确定键 开关[第四天开启](需ON)
420 428 地图事件 Map007.json MAP007 30 EV030 (41,9) 1/2 按确定键 开关[首次进入星之海](需ON)
421 429 地图事件 Map005.json MAP005 5 EV005 (17,8) 1/2 按确定键 开关[第四天开启](需ON)
422 429 地图事件 Map007.json MAP007 30 EV030 (41,9) 1/2 按确定键 开关[首次进入星之海](需ON)
423 432 地图事件 Map050.json MAP050 11 EV011 (10,5) 1/2 按确定键 开关[第四天开启](需ON)
424 433 地图事件 Map050.json MAP050 10 EV010 (8,5) 1/2 按确定键 开关[第四天开启](需ON)
425 434 地图事件 Map050.json MAP050 10 EV010 (8,5) 1/2 按确定键 开关[第四天开启](需ON)
426 435 地图事件 Map050.json MAP050 10 EV010 (8,5) 1/2 按确定键 开关[第四天开启](需ON)
427 436 地图事件 Map009.json MAP009 3 EV003 (4,9) 8/16 按确定键 开关[第四天开启](需ON)
428 437 地图事件 Map009.json MAP009 7 EV007 (8,10) 1/2 按确定键 开关[第四天开启](需ON)
429 438 地图事件 Map186.json MAP186 2 EV002 (8,7) 1/2 按确定键 开关[第四天开启](需ON)
430 439 地图事件 Map282.json MAP282 22 EV022 (130,9) 1/2 按确定键 开关[前往天空区域](需ON)
431 440 地图事件 Map223.json MAP223 1 EV001 (6,6) 1/2 按确定键 开关[第四天开启](需ON)
432 441 地图事件 Map223.json MAP223 2 EV002 (14,10) 1/2 按确定键 开关[第四天开启](需ON)
433 442 地图事件 Map223.json MAP223 2 EV002 (14,10) 1/2 按确定键 开关[第四天开启](需ON)
434 442 地图事件 Map223.json MAP223 2 EV002 (14,10) 1/2 按确定键 开关[第四天开启](需ON)
435 443 地图事件 Map009.json MAP009 8 EV008 (14,10) 1/1 按确定键 开关[恶魔城莉莉亚入队](需ON)
436 446 地图事件 Map009.json MAP009 8 EV008 (14,10) 1/1 按确定键 开关[恶魔城莉莉亚入队](需ON)
437 446 地图事件 Map296.json MAP296 33 EV033 (15,18) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
438 446 地图事件 Map349.json MAP349 3 EV003 (14,12) 1/2 按确定键 开关[传送魔法失效](需ON)
439 449 地图事件 Map009.json MAP009 10 EV010 (0,0) 6/10 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1
440 449 地图事件 Map296.json MAP296 34 EV034 (4,0) 6/11 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1
441 450 地图事件 Map009.json MAP009 10 EV010 (0,0) 5/10 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1
442 450 地图事件 Map296.json MAP296 34 EV034 (4,0) 5/11 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1
443 451 地图事件 Map009.json MAP009 10 EV010 (0,0) 3/10 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON)
444 451 地图事件 Map009.json MAP009 10 EV010 (0,0) 5/10 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1
445 451 地图事件 Map296.json MAP296 34 EV034 (4,0) 3/11 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON)
446 451 地图事件 Map296.json MAP296 34 EV034 (4,0) 5/11 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1
447 452 地图事件 Map009.json MAP009 10 EV010 (0,0) 4/10 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON)
448 452 地图事件 Map296.json MAP296 34 EV034 (4,0) 4/11 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON)
449 453 地图事件 Map009.json MAP009 10 EV010 (0,0) 3/10 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON)
450 453 地图事件 Map296.json MAP296 34 EV034 (4,0) 3/11 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON)
451 454 JS数组(浮动消息) js/nya/nya_ai.js:710
452 455 JS数组(浮动消息) js/nya/nya_ai.js:710
453 456 JS数组(浮动消息) js/nya/nya_ai.js:710
454 457 JS数组(浮动消息) js/nya/nya_ai.js:710
455 458 JS数组(浮动消息) js/nya/nya_ai.js:725
456 459 JS数组(浮动消息) js/nya/nya_ai.js:725
457 460 JS数组(浮动消息) js/nya/nya_ai.js:725
458 461 JS数组(浮动消息) js/nya/nya_ai.js:725
459 462 地图事件 Map007.json MAP007 24 EV024 (38,9) 4/4 按确定键 无条件
460 462 地图事件 Map296.json MAP296 12 EV012 (18,16) 4/4 按确定键 无条件
461 462 地图事件 Map349.json MAP349 10 EV010 (1,12) 4/4 按确定键 无条件
462 466 地图事件 Map005.json MAP005 4 EV004 (0,8) 1/4 按确定键 无条件
463 466 地图事件 Map034.json MAP034 14 EV014 (32,6) 1/4 按确定键 无条件
464 467 地图事件 Map254.json MAP254 2 EV002 (0,0) 1/3 自动执行 无条件
465 468 地图事件 Map181.json MAP181 21 EV021 (0,20) 2/3 按确定键 开关[喵朵露BOSS战胜利](需ON)
466 472 地图事件 Map009.json MAP009 9 EV009 (8,6) 1/4 按确定键 开关[心渊BOSS战胜利](需ON)
467 473 公共事件 73 手办屋前置处理 公共事件#73 开关[开场白完成]
468 478 地图事件 Map168.json MAP168 3 EV003 (0,0) 1/2 自动执行 开关[恶魔墙喵露露逃走](需ON)
469 479 地图事件 Map169.json MAP169 1 EV001 (54,11) 2/3 按确定键 开关[已触发喵露露逃走](需ON)
470 480 地图事件 Map299.json MAP299 1 EV001 (0,0) 1/2 自动执行 无条件
471 481 公共事件 80 游戏机前置条件检查 公共事件#80 开关[开场白完成]
472 482 地图事件 Map009.json MAP009 10 EV010 (0,0) 3/10 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON)
473 482 地图事件 Map009.json MAP009 10 EV010 (0,0) 4/10 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON)
474 482 地图事件 Map009.json MAP009 10 EV010 (0,0) 5/10 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1
475 482 地图事件 Map009.json MAP009 10 EV010 (0,0) 6/10 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1
476 482 地图事件 Map009.json MAP009 10 EV010 (0,0) 7/10 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2
477 482 地图事件 Map009.json MAP009 10 EV010 (0,0) 8/10 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2
478 482 地图事件 Map009.json MAP009 10 EV010 (0,0) 9/10 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3
479 482 地图事件 Map009.json MAP009 10 EV010 (0,0) 10/10 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3
480 482 地图事件 Map296.json MAP296 34 EV034 (4,0) 3/11 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON)
481 482 地图事件 Map296.json MAP296 34 EV034 (4,0) 4/11 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON)
482 482 地图事件 Map296.json MAP296 34 EV034 (4,0) 5/11 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1
483 482 地图事件 Map296.json MAP296 34 EV034 (4,0) 6/11 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=1
484 482 地图事件 Map296.json MAP296 34 EV034 (4,0) 7/11 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2
485 482 地图事件 Map296.json MAP296 34 EV034 (4,0) 8/11 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2
486 482 地图事件 Map296.json MAP296 34 EV034 (4,0) 9/11 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3
487 482 地图事件 Map296.json MAP296 34 EV034 (4,0) 10/11 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3
488 483 地图事件 Map300.json MAP300 19 EV019 (0,0) 1/2 自动执行 无条件
489 486 JS:lockTextBalloon() js/nya/nya_game.js:3841
490 487 JS:lockTextBalloon() js/nya/nya_game.js:3831
491 489 地图事件 Map301.json MAP301 2 EV002 (0,0) 1/2 自动执行 开关[心渊BOSS战胜利](需ON)
492 490 地图事件 Map296.json MAP296 15 EV015 (37,13) 1/5 按确定键 开关[心渊家剧情转场](需ON)
493 491 地图事件 Map296.json MAP296 15 EV015 (37,13) 1/5 按确定键 开关[心渊家剧情转场](需ON)
494 492 公共事件 90 传送点1000猫币判断 公共事件#90 开关[开场白完成]
495 493 公共事件 90 传送点1000猫币判断 公共事件#90 开关[开场白完成]
496 494 地图事件 Map301.json MAP301 3 EV003 (10,9) 1/4 按确定键 开关[心渊家剧情转场](需ON)
497 494 地图事件 Map301.json MAP301 3 EV003 (10,9) 1/4 按确定键 开关[心渊家剧情转场](需ON)
498 495 地图事件 Map301.json MAP301 3 EV003 (10,9) 1/4 按确定键 开关[心渊家剧情转场](需ON)
499 496 地图事件 Map301.json MAP301 3 EV003 (10,9) 1/4 按确定键 开关[心渊家剧情转场](需ON)
500 497 地图事件 Map301.json MAP301 3 EV003 (10,9) 1/4 按确定键 开关[心渊家剧情转场](需ON)
501 498 地图事件 Map301.json MAP301 3 EV003 (10,9) 1/4 按确定键 开关[心渊家剧情转场](需ON)
502 499 地图事件 Map301.json MAP301 2 EV002 (0,0) 1/2 自动执行 开关[心渊BOSS战胜利](需ON)
503 500 地图事件 Map296.json MAP296 16 EV016 (1,0) 1/2 自动执行 开关[心渊家剧情转场](需ON)
504 501 地图事件 Map296.json MAP296 15 EV015 (37,13) 1/5 按确定键 开关[心渊家剧情转场](需ON)
505 503 公共事件 90 传送点1000猫币判断 公共事件#90 开关[开场白完成]
506 504 地图事件 Map006.json MAP006 30 EV030 (29,0) 1/2 事件接触 开关[第一天夜晚](需ON)
507 504 地图事件 Map006.json MAP006 31 EV031 (11,0) 1/2 事件接触 开关[第一天夜晚](需ON)
508 504 地图事件 Map007.json MAP007 20 EV020 (32,0) 1/2 事件接触 开关[第一天夜晚](需ON)
509 505 地图事件 Map301.json MAP301 3 EV003 (10,9) 1/4 按确定键 开关[心渊家剧情转场](需ON)
510 505 地图事件 Map301.json MAP301 3 EV003 (10,9) 1/4 按确定键 开关[心渊家剧情转场](需ON)
511 506 地图事件 Map301.json MAP301 3 EV003 (10,9) 1/4 按确定键 开关[心渊家剧情转场](需ON)
512 507 地图事件 Map301.json MAP301 7 EV007 (17,9) 1/1 按确定键 无条件
513 508 地图事件 Map301.json MAP301 8 EV008 (9,4) 1/2 按确定键 无条件
514 509 地图事件 Map296.json MAP296 2 EV002 (40,11) 1/5 按确定键 无条件
515 509 地图事件 Map296.json MAP296 2 EV002 (40,11) 4/5 按确定键 开关[后日谈](需ON) 且 开关[新结局后日谈](需ON)
516 510 地图事件 Map296.json MAP296 15 EV015 (37,13) 2/5 按确定键 开关[首次进入星之海](需ON)
517 511 地图事件 Map296.json MAP296 17 EV017 (42,13) 1/2 按确定键 开关[校长出现在雪原](需ON)
518 512 地图事件 Map296.json MAP296 17 EV017 (42,13) 1/2 按确定键 开关[校长出现在雪原](需ON)
519 513 地图事件 Map303.json MAP303 1 EV001 (0,0) 1/3 自动执行 开关[首次进入星之海](需ON)
520 514 地图事件 Map296.json MAP296 15 EV015 (37,13) 2/5 按确定键 开关[首次进入星之海](需ON)
521 514 地图事件 Map296.json MAP296 17 EV017 (42,13) 1/2 按确定键 开关[校长出现在雪原](需ON)
522 515 地图事件 Map007.json MAP007 21 EV021 (25,4) 1/4 按确定键 开关[首次进入星之海](需ON)
523 516 地图事件 Map007.json MAP007 21 EV021 (25,4) 1/4 按确定键 开关[首次进入星之海](需ON)
524 517 地图事件 Map007.json MAP007 21 EV021 (25,4) 1/4 按确定键 开关[首次进入星之海](需ON)
525 518 地图事件 Map039.json MAP039 53 EV053 (71,49) 1/2 按确定键 开关[首次进入星之海](需ON)
526 519 地图事件 Map039.json MAP039 53 EV053 (71,49) 1/2 按确定键 开关[首次进入星之海](需ON)
527 520 地图事件 Map196.json MAP196 1 EV001 (15,5) 1/2 按确定键 开关[首次进入星之海](需ON)
528 521 地图事件 Map196.json MAP196 1 EV001 (15,5) 1/2 按确定键 开关[首次进入星之海](需ON)
529 522 地图事件 Map191.json MAP191 4 EV004 (11,6) 1/2 按确定键 开关[首次进入星之海](需ON)
530 523 地图事件 Map191.json MAP191 4 EV004 (11,6) 1/2 按确定键 开关[首次进入星之海](需ON)
531 524 地图事件 Map189.json MAP189 4 EV004 (9,7) 2/3 按确定键 开关[首次进入星之海](需ON)
532 524 地图事件 Map189.json MAP189 5 EV005 (29,7) 2/3 按确定键 开关[首次进入星之海](需ON)
533 525 地图事件 Map006.json MAP006 44 EV044 (35,3) 1/2 按确定键 开关[首次进入星之海](需ON)
534 526 地图事件 Map007.json MAP007 27 EV027 (31,6) 1/2 按确定键 开关[首次进入星之海](需ON)
535 527 地图事件 Map007.json MAP007 26 EV026 (33,6) 1/2 按确定键 开关[首次进入星之海](需ON)
536 528 地图事件 Map046.json MAP046 8 EV008 (4,6) 1/2 按确定键 开关[首次进入星之海](需ON)
537 529 地图事件 Map046.json MAP046 8 EV008 (4,6) 1/2 按确定键 开关[首次进入星之海](需ON)
538 530 地图事件 Map046.json MAP046 9 EV009 (7,6) 1/2 按确定键 开关[首次进入星之海](需ON)
539 531 地图事件 Map168.json MAP168 4 EV004 (6,0) 1/3 事件接触 开关[结界入口开启](需ON)
540 532 地图事件 Map217.json MAP217 7 EV007 (11,8) 1/2 按确定键 开关[德古拉准备开启结界](需ON)
541 534 地图事件 Map304.json MAP304 2 EV002 (4,0) 1/3 事件接触 开关[首次进入星之海](需ON)
542 535 地图事件 Map304.json MAP304 3 EV003 (0,0) 2/3 自动执行 开关[缇娅幻影胜利](需ON)
543 538 地图事件 Map325.json MAP325 22 EV022 (0,0) 1/1 自动执行 无条件
544 539 地图事件 Map326.json MAP326 3 EV003 (2,0) 1/1 自动执行 无条件
545 540 地图事件 Map009.json MAP009 10 EV010 (0,0) 7/10 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2
546 540 地图事件 Map296.json MAP296 34 EV034 (4,0) 7/11 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2
547 541 地图事件 Map009.json MAP009 10 EV010 (0,0) 8/10 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2
548 541 地图事件 Map296.json MAP296 34 EV034 (4,0) 8/11 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2
549 542 地图事件 Map009.json MAP009 10 EV010 (0,0) 8/10 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2
550 542 地图事件 Map296.json MAP296 34 EV034 (4,0) 8/11 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=2
551 543 地图事件 Map009.json MAP009 10 EV010 (0,0) 9/10 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3
552 543 地图事件 Map296.json MAP296 34 EV034 (4,0) 9/11 自动执行 开关[喵露露小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3
553 544 地图事件 Map009.json MAP009 10 EV010 (0,0) 10/10 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3
554 544 地图事件 Map296.json MAP296 34 EV034 (4,0) 10/11 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3
555 545 地图事件 Map009.json MAP009 10 EV010 (0,0) 10/10 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3
556 545 地图事件 Map296.json MAP296 34 EV034 (4,0) 10/11 自动执行 开关[莉莉亚小游戏胜利](需ON) 且 开关[br是否带莉莉亚进入](需ON) 且 变量[小游戏类型]>=3
557 546 地图事件 Map296.json MAP296 33 EV033 (15,18) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
558 546 地图事件 Map349.json MAP349 3 EV003 (14,12) 1/2 按确定键 开关[传送魔法失效](需ON)
559 547 地图事件 Map296.json MAP296 33 EV033 (15,18) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
560 547 地图事件 Map349.json MAP349 3 EV003 (14,12) 1/2 按确定键 开关[传送魔法失效](需ON)
561 548 地图事件 Map327.json MAP327 18 EV018 (0,0) 1/4 自动执行 开关[缇娅幻影胜利](需ON)
562 549 地图事件 Map327.json MAP327 18 EV018 (0,0) 3/4 自动执行 开关[缇亚本体BOSS胜利](需ON)
563 550 地图事件 Map327.json MAP327 21 EV021 (9,8) 2/3 按确定键 开关[缇娅BOSS胜利对话完](需ON)
564 556 地图事件 Map327.json MAP327 21 EV021 (9,8) 2/3 按确定键 开关[缇娅BOSS胜利对话完](需ON)
565 557 地图事件 Map327.json MAP327 21 EV021 (9,8) 2/3 按确定键 开关[缇娅BOSS胜利对话完](需ON)
566 558 地图事件 Map327.json MAP327 21 EV021 (9,8) 2/3 按确定键 开关[缇娅BOSS胜利对话完](需ON)
567 559 地图事件 Map327.json MAP327 21 EV021 (9,8) 2/3 按确定键 开关[缇娅BOSS胜利对话完](需ON)
568 562 地图事件 Map324.json MAP324 7 EV007 (14,3) 1/2 按确定键 开关[缇娅幻影胜利](需ON)
569 564 地图事件 Map005.json MAP005 23 EV023 (3,0) 1/2 自动执行 开关[缇亚本体BOSS胜利](需ON)
570 565 地图事件 Map004.json MAP004 13 EV013 (3,3) 1/3 自动执行 开关[缇亚本体BOSS胜利](需ON)
571 566 地图事件 Map004.json MAP004 13 EV013 (3,3) 2/3 自动执行 独立开关A=ON
572 566 地图事件 Map004.json MAP004 13 EV013 (3,3) 2/3 自动执行 独立开关A=ON
573 567 地图事件 Map296.json MAP296 21 EV021 (12,18) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
574 568 地图事件 Map296.json MAP296 21 EV021 (12,18) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
575 569 地图事件 Map296.json MAP296 23 EV023 (21,13) 1/2 按确定键 开关[缇亚本体BOSS胜利](需ON)
576 570 地图事件 Map296.json MAP296 23 EV023 (21,13) 1/2 按确定键 开关[缇亚本体BOSS胜利](需ON)
577 571 地图事件 Map296.json MAP296 22 EV022 (22,12) 1/2 按确定键 开关[缇亚本体BOSS胜利](需ON)
578 572 地图事件 Map296.json MAP296 22 EV022 (22,12) 1/2 按确定键 开关[缇亚本体BOSS胜利](需ON)
579 573 地图事件 Map296.json MAP296 24 EV024 (24,13) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
580 574 地图事件 Map296.json MAP296 24 EV024 (24,13) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
581 575 地图事件 Map296.json MAP296 25 EV025 (34,13) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
582 576 地图事件 Map296.json MAP296 25 EV025 (34,13) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
583 577 地图事件 Map296.json MAP296 26 EV026 (38,13) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
584 578 地图事件 Map296.json MAP296 26 EV026 (38,13) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
585 579 地图事件 Map301.json MAP301 11 EV011 (4,14) 1/5 按确定键 开关[缇亚本体BOSS胜利](需ON)
586 580 地图事件 Map301.json MAP301 11 EV011 (4,14) 3/5 按确定键 开关[黑雾区心渊等猫粮](需ON)
587 583 公共事件 114 喵露露有猫粮判断 公共事件#114 开关[开场白完成]
588 584 公共事件 114 喵露露有猫粮判断 公共事件#114 开关[开场白完成]
589 586 地图事件 Map301.json MAP301 11 EV011 (4,14) 1/5 按确定键 开关[缇亚本体BOSS胜利](需ON)
590 587 地图事件 Map301.json MAP301 11 EV011 (4,14) 2/5 按确定键 开关[黑雾区心渊对话完](需ON)
591 588 地图事件 Map301.json MAP301 13 EV013 (15,9) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
592 589 地图事件 Map301.json MAP301 13 EV013 (15,9) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
593 590 地图事件 Map301.json MAP301 12 EV012 (14,9) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
594 591 地图事件 Map301.json MAP301 12 EV012 (14,9) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
595 592 地图事件 Map296.json MAP296 32 EV032 (32,13) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
596 593 地图事件 Map296.json MAP296 32 EV032 (32,13) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
597 594 地图事件 Map296.json MAP296 31 EV031 (31,13) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
598 595 地图事件 Map296.json MAP296 31 EV031 (31,13) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
599 596 地图事件 Map296.json MAP296 29 EV029 (44,13) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
600 597 地图事件 Map296.json MAP296 29 EV029 (44,13) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
601 598 地图事件 Map296.json MAP296 30 EV030 (43,13) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
602 599 地图事件 Map296.json MAP296 30 EV030 (43,13) 1/3 按确定键 开关[缇亚本体BOSS胜利](需ON)
603 600 公共事件 26 传送门公共事件 公共事件#26 开关[开场白完成]
604 601 地图事件 Map324.json MAP324 8 EV008 (1,0) 1/3 自动执行 开关[缇娅BOSS胜利对话完](需ON)
605 602 地图事件 Map329.json MAP329 8 EV008 (0,0) 1/2 自动执行 开关[缇亚本体BOSS胜利](需ON)
606 603 地图事件 Map337.json MAP337 16 EV016 (1,0) 1/2 自动执行 开关[缇亚本体BOSS胜利](需ON)
607 604 地图事件 Map339.json MAP339 8 EV008 (32,0) 1/2 事件接触 开关[小眼被打败](需ON) 且 开关[大眼被打败](需ON)
608 605 地图事件 Map339.json MAP339 12 EV012 (33,14) 1/1 按确定键 开关[莉莉亚负伤传送回家](需ON)
609 606 公共事件 117 剧情回城禁用时触发 公共事件#117 开关[开场白完成]
610 607 地图事件 Map342.json MAP342 3 EV003 (8,0) 1/2 事件接触 开关[大眼被打败](需ON) 且 开关[小眼被打败](需ON)
611 608 公共事件 117 剧情回城禁用时触发 公共事件#117 开关[开场白完成]
612 609 地图事件 Map349.json MAP349 8 EV008 (3,12) 1/2 按确定键 开关[传送魔法失效](需ON)
613 610 地图事件 Map181.json MAP181 2 EV002 (20,20) 4/5 按确定键 开关[触发莉莉亚隐藏-弃用](需ON)
614 613 地图事件 Map182.json MAP182 5 EV005 (6,11) 1/3 自动执行 开关[触发莉莉亚隐藏-弃用](需ON)
615 614 地图事件 Map005.json MAP005 25 EV025 (4,0) 1/3 自动执行 开关[后日谈](需ON)
616 615 地图事件 Map351.json MAP351 1 EV001 (9,8) 1/1 按确定键 无条件
617 616 图片名引用 Map348.json /events/pages/list/parameters 中的 #616#28#ffffff#4#000000
618 617 图片名引用 Map348.json /events/pages/list/parameters 中的 #617#28#ffffff#4#000000
619 618 图片名引用 Map359.json /events/pages/list/parameters 中的 #618#28#ffffff#4#000000
620 619 图片名引用 Map360.json /events/pages/list/parameters 中的 #619#28#ffffff#4#000000
621 620 图片名引用 Map361.json /events/pages/list/parameters 中的 #620#28#ffffff#4#000000
622 621 地图事件 Map359.json MAP359 1 EV001 (9,8) 1/1 按确定键 无条件
623 622 地图事件 Map360.json MAP360 1 EV001 (9,5) 1/1 按确定键 无条件
624 623 地图事件 Map361.json MAP361 1 EV001 (30,6) 1/1 按确定键 无条件
625 624 地图事件 Map358.json MAP358 4 EV004 (1,0) 1/3 自动执行 开关[喵可莉最终对白演出](需ON)
626 625 地图事件 Map191.json MAP191 5 EV005 (30,6) 1/2 按确定键 无条件
627 626 地图事件 Map348.json MAP348 11 EV011 (3,0) 2/2 自动执行 开关[莉伊被喵露露消灭](需ON)
628 628 地图事件 Map348.json MAP348 12 EV012 (15,10) 1/1 按确定键 开关[莉伊被喵露露消灭](需ON)
629 629 地图事件 Map350.json MAP350 4 EV004 (2,7) 1/3 事件接触 开关[传送魔法失效](需ON)
630 630 地图事件 Map349.json MAP349 9 EV009 (29,12) 1/2 按确定键 无条件
631 632 图片名引用 Map350.json /events/pages/list/parameters 中的 #632#28#ffffff#4#000000
632 632 图片名引用 Map350.json /events/pages/list/parameters 中的 #632#28#ffffff#4#000000
633 633 地图事件 Map350.json MAP350 12 EV012 (7,7) 1/9 自动执行 开关[魔女被击败](需ON) 魔女被击败后,喵露露强杀魔女路线和莉伊喵可莉路线都在这里事件触发
634 634 地图事件 Map350.json MAP350 12 EV012 (7,7) 5/9 自动执行 开关[演出莉伊阻止校长](需ON) 请到事件14查看,魔女被击败后,莉伊喵可莉路线首先在14事件触发 / 在喵可莉结局中,14事件执行完毕才会到本事件执行 / 但本事件的附加特效在14事件执行过程中就有了 / 250开关预先会打开 / CG
635 635 图片名引用 Map350.json /events/pages/list/parameters 中的 #635#28#ffffff#4#000000
636 636 图片名引用 Map350.json /events/pages/list/parameters 中的 #636#28#ffffff#4#000000
637 637 地图事件 Map348.json MAP348 5 EV005 (2,0) 2/3 自动执行 独立开关A=ON
638 638 地图事件 Map350.json MAP350 12 EV012 (7,7) 4/9 自动执行 开关[魔女被击败](需ON) 且 开关[莉伊被喵露露消灭](需ON) 魔女被击败后,强杀莉伊再强杀魔女路线首先在这里事件触发
639 641 地图事件 Map350.json MAP350 12 EV012 (7,7) 7/9 自动执行 开关[容器重建完毕](需ON) 且 开关[莉伊被喵露露消灭](需ON)
640 644 地图事件 Map350.json MAP350 11 EV011 (9,10) 1/6 按确定键 开关[传送魔法失效](需ON)
641 647 公共事件 146 结局1莉莉亚登场对白 公共事件#146 开关[开场白完成]
642 648 JS:requestFloatMessage() js/nya/nya_statem_ext.js:14959
643 660 地图事件 Map004.json MAP004 14 EV014 (5,4) 1/2 按确定键 开关[后日谈](需ON)
644 661 地图事件 Map004.json MAP004 14 EV014 (5,4) 1/2 按确定键 开关[后日谈](需ON)
645 662 地图事件 Map004.json MAP004 14 EV014 (5,4) 1/2 按确定键 开关[后日谈](需ON)
646 663 地图事件 Map004.json MAP004 14 EV014 (5,4) 1/2 按确定键 开关[后日谈](需ON)
647 663 地图事件 Map004.json MAP004 14 EV014 (5,4) 1/2 按确定键 开关[后日谈](需ON)
648 664 地图事件 Map191.json MAP191 6 EV006 (23,6) 1/2 按确定键 开关[后日谈](需ON)
649 665 地图事件 Map191.json MAP191 6 EV006 (23,6) 1/2 按确定键 开关[后日谈](需ON)
650 666 地图事件 Map009.json MAP009 3 EV003 (4,9) 10/16 按确定键 开关[后日谈](需ON)
651 667 地图事件 Map009.json MAP009 3 EV003 (4,9) 10/16 按确定键 开关[后日谈](需ON)
652 668 地图事件 Map009.json MAP009 3 EV003 (4,9) 10/16 按确定键 开关[后日谈](需ON)
653 669 地图事件 Map196.json MAP196 5 EV005 (9,7) 1/2 按确定键 开关[后日谈](需ON)
654 670 地图事件 Map196.json MAP196 5 EV005 (9,7) 1/2 按确定键 开关[后日谈](需ON)
655 671 地图事件 Map196.json MAP196 6 EV006 (7,6) 1/2 按确定键 开关[后日谈](需ON)
656 672 地图事件 Map196.json MAP196 6 EV006 (7,6) 1/2 按确定键 开关[后日谈](需ON)
657 673 地图事件 Map327.json MAP327 22 EV022 (14,8) 1/2 按确定键 开关[后日谈](需ON)
658 674 地图事件 Map327.json MAP327 22 EV022 (14,8) 1/2 按确定键 开关[后日谈](需ON)
659 675 地图事件 Map301.json MAP301 14 EV014 (10,4) 1/2 按确定键 开关[后日谈](需ON)
660 676 地图事件 Map301.json MAP301 14 EV014 (10,4) 1/2 按确定键 开关[后日谈](需ON)
661 677 地图事件 Map075.json MAP075 1 EV001 (11,8) 1/2 按确定键 开关[后日谈](需ON)
662 678 地图事件 Map075.json MAP075 1 EV001 (11,8) 1/2 按确定键 开关[后日谈](需ON)
663 679 公共事件 142 夏洛特米娅后日谈对话 公共事件#142 开关[开场白完成]
664 680 公共事件 142 夏洛特米娅后日谈对话 公共事件#142 开关[开场白完成]
665 681 公共事件 140 依玲和蕾铃后日谈对话 公共事件#140 开关[开场白完成]
666 682 公共事件 140 依玲和蕾铃后日谈对话 公共事件#140 开关[开场白完成]
667 683 公共事件 141 露茜亚梅卡后日谈对话 公共事件#141 开关[开场白完成]
668 684 公共事件 141 露茜亚梅卡后日谈对话 公共事件#141 开关[开场白完成]
669 685 地图事件 Map046.json MAP046 10 EV010 (22,6) 1/2 按确定键 开关[后日谈](需ON)
670 686 地图事件 Map046.json MAP046 10 EV010 (22,6) 1/2 按确定键 开关[后日谈](需ON)
671 687 地图事件 Map012.json MAP012 6 EV006 (1,0) 6/8 自动执行 开关[后日谈](需ON)
672 688 地图事件 Map196.json MAP196 9 EV009 (17,7) 1/1 自动执行 开关[莉莉亚后日谈](需ON)
673 689 地图事件 Map007.json MAP007 24 EV024 (38,9) 4/4 按确定键 无条件
674 689 地图事件 Map296.json MAP296 12 EV012 (18,16) 4/4 按确定键 无条件
675 689 地图事件 Map349.json MAP349 10 EV010 (1,12) 4/4 按确定键 无条件
676 691 地图事件 Map182.json MAP182 7 EV007 (4,11) 1/1 按确定键 开关[缇亚本体BOSS胜利](需ON)
677 693 地图事件 Map350.json MAP350 19 EV019 (1,10) 1/2 按确定键 开关[后日谈](需ON)
678 694 地图事件 Map171.json MAP171 16 EV016 (5,6) 1/3 按确定键 无条件
679 695 地图事件 Map171.json MAP171 16 EV016 (5,6) 2/3 按确定键 开关[获得樱的钥匙](需ON)
680 696 地图事件 Map171.json MAP171 16 EV016 (5,6) 3/3 按确定键 开关[获得樱的钥匙](需ON) 且 独立开关A=ON
681 697 地图事件 Map353.json MAP353 6 EV006 (4,4) 1/1 事件接触 开关[喵可莉摸猫](需ON)
682 698 地图事件 Map353.json MAP353 6 EV006 (4,4) 1/1 事件接触 开关[喵可莉摸猫](需ON)
683 699 地图事件 Map004.json MAP004 14 EV014 (5,4) 1/2 按确定键 开关[后日谈](需ON)
684 700 地图事件 Map039.json MAP039 61 EV061 (51,45) 1/2 按确定键 开关[第二天开启](需ON)
685 701 地图事件 Map171.json MAP171 17 EV017 (6,16) 1/2 按确定键 开关[第三天开启](需ON)
686 702 地图事件 Map369.json MAP369 2 EV002 (15,13) 1/1 自动执行 无条件
687 703 地图事件 Map370.json MAP370 2 EV002 (10,5) 1/1 事件接触 无条件
688 704 地图事件 Map371.json MAP371 2 EV002 (14,5) 1/1 事件接触 无条件
689 705 公共事件 80 游戏机前置条件检查 公共事件#80 开关[开场白完成]
690 708 地图事件 Map009.json MAP009 12 EV012 (2,6) 1/2 按确定键 开关[4399看广告拿东西](需ON)
691 711 地图事件 Map009.json MAP009 13 EV013 (4,6) 1/2 按确定键 开关[4399看广告拿东西](需ON)
692 714 地图事件 Map009.json MAP009 14 EV014 (6,6) 1/2 按确定键 开关[4399看广告拿东西](需ON)
693 718 地图事件 Map296.json MAP296 15 EV015 (37,13) 3/5 按确定键 开关[缇娅幻影胜利](需ON)
694 719 地图事件 Map296.json MAP296 15 EV015 (37,13) 3/5 按确定键 开关[缇娅幻影胜利](需ON)
695 720 地图事件 Map378.json MAP378 9 EV009 (21,9) 1/3 事件接触 开关[缇娅幻影胜利](需ON)
696 721 地图事件 Map383.json MAP383 3 EV003 (12,5) 1/2 自动执行 开关[触发校长在璃音门口](需ON)
697 722 地图事件 Map381.json MAP381 7 EV007 (0,0) 2/3 自动执行 开关[校长BOSS胜利](需ON)
698 723 地图事件 Map379.json MAP379 2 EV002 (0,0) 1/3 自动执行 无条件
699 724 地图事件 Map379.json MAP379 3 EV003 (6,6) 1/3 按确定键 无条件
700 725 地图事件 Map379.json MAP379 4 EV004 (5,6) 1/1 按确定键 无条件
701 726 地图事件 Map379.json MAP379 5 EV005 (1,3) 1/1 按确定键 无条件
702 727 地图事件 Map379.json MAP379 6 EV006 (9,2) 1/2 按确定键 无条件
703 728 地图事件 Map379.json MAP379 6 EV006 (9,2) 2/2 按确定键 开关[夜晚开关](需ON)
704 730 地图事件 Map383.json MAP383 2 EV002 (11,5) 1/2 按确定键 无条件
705 730 地图事件 Map383.json MAP383 2 EV002 (11,5) 1/2 按确定键 无条件
706 731 地图事件 Map383.json MAP383 2 EV002 (11,5) 1/2 按确定键 无条件
707 732 地图事件 Map383.json MAP383 4 EV004 (0,0) 1/3 自动执行 开关[前往天空区域](需ON)
708 733 地图事件 Map383.json MAP383 5 EV005 (9,5) 1/2 按确定键 开关[前往天空区域](需ON)
709 734 地图事件 Map378.json MAP378 10 EV010 (33,9) 1/3 按确定键 开关[老板娘战后对话完](需ON)
710 735 地图事件 Map378.json MAP378 10 EV010 (33,9) 1/3 按确定键 开关[老板娘战后对话完](需ON)
711 736 地图事件 Map378.json MAP378 11 EV011 (32,8) 1/3 并行处理 开关[老板娘战后对话完](需ON)
712 736 地图事件 Map378.json MAP378 12 EV012 (0,0) 1/3 自动执行 开关[触发喵露露推涅普](需ON)
713 737 地图事件 Map378.json MAP378 13 EV013 (48,10) 1/3 事件接触 开关[第一天夜晚](需ON)
714 738 地图事件 Map378.json MAP378 13 EV013 (48,10) 1/3 事件接触 开关[第一天夜晚](需ON)
715 739 地图事件 Map295.json MAP295 2 EV002 (4,0) 1/3 事件接触 开关[雪原任务开启](需ON)
716 740 地图事件 Map295.json MAP295 2 EV002 (4,0) 1/3 事件接触 开关[雪原任务开启](需ON)
717 741 地图事件 Map383.json MAP383 6 EV006 (5,5) 1/3 按确定键 开关[第三天开启](需ON)
718 742 地图事件 Map383.json MAP383 6 EV006 (5,5) 1/3 按确定键 开关[第三天开启](需ON)
719 743 地图事件 Map381.json MAP381 10 EV010 (13,8) 1/4 按确定键 开关[第四天开启](需ON)
720 745 地图事件 Map381.json MAP381 10 EV010 (13,8) 2/4 按确定键 开关[莉伊被叫醒](需ON)
721 746 地图事件 Map382.json MAP382 2 EV002 (17,12) 1/2 按确定键 开关[莉伊走进树林中](需ON)
722 747 地图事件 Map382.json MAP382 2 EV002 (17,12) 1/2 按确定键 开关[莉伊走进树林中](需ON)
723 749 地图事件 Map327.json MAP327 18 EV018 (0,0) 3/4 自动执行 开关[缇亚本体BOSS胜利](需ON)
724 750 地图事件 Map324.json MAP324 8 EV008 (1,0) 2/3 自动执行 开关[校长BOSS胜利后传送走](需ON) 且 开关[缇娅BOSS胜利对话完](需ON)
725 751 地图事件 Map327.json MAP327 21 EV021 (9,8) 2/3 按确定键 开关[缇娅BOSS胜利对话完](需ON)
726 757 地图事件 Map381.json MAP381 11 EV011 (6,12) 1/3 按确定键 开关[校长BOSS后猫头出现](需ON)
727 758 地图事件 Map004.json MAP004 13 EV013 (3,3) 1/3 自动执行 开关[缇亚本体BOSS胜利](需ON)
728 759 地图事件 Map004.json MAP004 13 EV013 (3,3) 2/3 自动执行 独立开关A=ON
729 760 地图事件 Map349.json MAP349 8 EV008 (3,12) 1/2 按确定键 开关[传送魔法失效](需ON)
730 761 地图事件 Map004.json MAP004 15 EV015 (6,0) 1/2 自动执行 开关[新结局后日谈](需ON) 且 开关[后日谈](需ON)
731 762 地图事件 Map004.json MAP004 16 EV016 (2,6) 1/2 按确定键 开关[新后日谈橘花猫出现](需ON)
732 763 地图事件 Map384.json MAP384 1 EV001 (7,11) 1/3 事件接触 开关[新后日谈橘花猫出现](需ON)
733 764 地图事件 Map384.json MAP384 1 EV001 (7,11) 1/3 事件接触 开关[新后日谈橘花猫出现](需ON)
734 765 地图事件 Map384.json MAP384 1 EV001 (7,11) 1/3 事件接触 开关[新后日谈橘花猫出现](需ON)
735 766 地图事件 Map191.json MAP191 7 EV007 (13,6) 1/4 按确定键 开关[获得金丝草](需ON)
736 767 地图事件 Map191.json MAP191 7 EV007 (13,6) 3/4 按确定键 开关[获得金丝草](需ON) 且 独立开关B=ON
737 768 地图事件 Map191.json MAP191 7 EV007 (13,6) 2/4 按确定键 开关[获得金丝草](需ON) 且 独立开关A=ON
738 769 地图事件 Map009.json MAP009 3 EV003 (4,9) 12/16 按确定键 开关[新结局后日谈](需ON) 且 开关[新后日谈与莲对话完](需ON)
739 770 地图事件 Map009.json MAP009 3 EV003 (4,9) 12/16 按确定键 开关[新结局后日谈](需ON) 且 开关[新后日谈与莲对话完](需ON)
740 771 地图事件 Map009.json MAP009 3 EV003 (4,9) 12/16 按确定键 开关[新结局后日谈](需ON) 且 开关[新后日谈与莲对话完](需ON)
741 772 地图事件 Map296.json MAP296 27 EV027 (40,13) 3/4 按确定键 开关[新结局后日谈](需ON) 且 开关[新后日谈开传送点](需ON)
742 773 地图事件 Map327.json MAP327 26 EV026 (12,8) 1/6 按确定键 开关[重新开启星之海传送](需ON)
743 774 地图事件 Map327.json MAP327 26 EV026 (12,8) 2/6 按确定键 开关[新后日谈缇娅对话完成](需ON)
744 775 地图事件 Map377.json MAP377 4 EV004 (3,12) 1/2 按确定键 开关[新后日谈缇娅对话完成](需ON)
745 776 地图事件 Map377.json MAP377 4 EV004 (3,12) 1/2 按确定键 开关[新后日谈缇娅对话完成](需ON)
746 777 地图事件 Map377.json MAP377 4 EV004 (3,12) 1/2 按确定键 开关[新后日谈缇娅对话完成](需ON)
747 778 地图事件 Map387.json MAP387 1 EV001 (9,9) 1/5 事件接触 开关[和校长对话完修熊](需ON)
748 780 公共事件 200 新后日谈转到第二天 公共事件#200 开关[开场白完成]
749 781 地图事件 Map327.json MAP327 26 EV026 (12,8) 3/6 按确定键 开关[新后日谈第二天](需ON)
750 782 地图事件 Map327.json MAP327 26 EV026 (12,8) 3/6 按确定键 开关[新后日谈第二天](需ON)
751 783 地图事件 Map012.json MAP012 10 EV010 (9,6) 1/2 按确定键 开关[新后日谈第二天](需ON)
752 783 地图事件 Map012.json MAP012 11 EV011 (10,6) 1/2 按确定键 开关[新后日谈第二天](需ON)
753 784 地图事件 Map012.json MAP012 11 EV011 (10,6) 1/2 按确定键 开关[新后日谈第二天](需ON)
754 785 地图事件 Map012.json MAP012 10 EV010 (9,6) 1/2 按确定键 开关[新后日谈第二天](需ON)
755 786 地图事件 Map012.json MAP012 10 EV010 (9,6) 1/2 按确定键 开关[新后日谈第二天](需ON)
756 787 地图事件 Map196.json MAP196 11 EV011 (8,7) 1/2 按确定键 开关[新后日谈和小心心对话](需ON)
757 788 地图事件 Map196.json MAP196 11 EV011 (8,7) 1/2 按确定键 开关[新后日谈和小心心对话](需ON)
758 789 地图事件 Map378.json MAP378 14 EV014 (41,3) 1/2 事件接触 开关[新后日谈和德古拉对话](需ON)
759 791 地图事件 Map387.json MAP387 1 EV001 (9,9) 3/5 事件接触 开关[新后日谈第二天夜晚](需ON)
760 794 地图事件 Map387.json MAP387 1 EV001 (9,9) 3/5 事件接触 开关[新后日谈第二天夜晚](需ON)
761 795 地图事件 Map327.json MAP327 26 EV026 (12,8) 4/6 自动执行 开关[新后日谈第二天夜晚](需ON)
762 796 地图事件 Map389.json MAP389 1 EV001 (4,5) 1/3 按确定键 开关[新后日谈第二天夜晚](需ON)
763 797 地图事件 Map390.json MAP390 1 EV001 (7,6) 1/3 按确定键 开关[看完喵可莉质问缇娅](需ON)
764 798 地图事件 Map390.json MAP390 1 EV001 (7,6) 2/3 按确定键 开关[喵可莉准备变猫](需ON)
765 800 地图事件 Map379.json MAP379 8 EV008 (7,6) 1/2 按确定键 开关[新结局后日谈](需ON)
766 801 地图事件 Map379.json MAP379 7 EV007 (4,3) 2/3 按确定键 开关[新结局后日谈](需ON)
767 802 地图事件 Map379.json MAP379 7 EV007 (4,3) 2/3 按确定键 开关[新结局后日谈](需ON)
768 803 地图事件 Map009.json MAP009 3 EV003 (4,9) 11/16 按确定键 开关[新结局后日谈](需ON)
769 804 地图事件 Map171.json MAP171 18 EV018 (11,12) 1/2 按确定键 开关[新后日谈橘花猫出现](需ON)
770 804 地图事件 Map171.json MAP171 19 EV019 (12,12) 1/2 按确定键 开关[新后日谈橘花猫出现](需ON)
771 805 地图事件 Map171.json MAP171 18 EV018 (11,12) 1/2 按确定键 开关[新后日谈橘花猫出现](需ON)
772 806 地图事件 Map171.json MAP171 19 EV019 (12,12) 1/2 按确定键 开关[新后日谈橘花猫出现](需ON)
773 807 地图事件 Map381.json MAP381 18 EV018 (14,12) 1/2 按确定键 开关[获得金丝草](需ON)
774 808 地图事件 Map381.json MAP381 18 EV018 (14,12) 1/2 按确定键 开关[获得金丝草](需ON)
775 809 地图事件 Map383.json MAP383 2 EV002 (11,5) 2/2 按确定键 开关[莉伊进门缝眼睛](需ON)
776 810 地图事件 Map379.json MAP379 9 EV009 (3,6) 1/2 按确定键 开关[新后日谈第二天](需ON)
777 811 地图事件 Map379.json MAP379 9 EV009 (3,6) 1/2 按确定键 开关[新后日谈第二天](需ON)
778 812 地图事件 Map388.json MAP388 11 EV011 (4,9) 1/4 事件接触 开关[新后日谈第二天](需ON)
779 813 地图事件 Map388.json MAP388 10 EV010 (4,10) 1/3 按确定键 开关[新后日谈第二天](需ON)
780 814 地图事件 Map378.json MAP378 22 EV022 (31,9) 1/2 按确定键 开关[新结局后日谈](需ON)
781 815 地图事件 Map378.json MAP378 22 EV022 (31,9) 1/2 按确定键 开关[新结局后日谈](需ON)
782 816 地图事件 Map009.json MAP009 3 EV003 (4,9) 14/16 按确定键 开关[新结局后日谈](需ON) 且 开关[新后日谈第二天](需ON)
783 817 地图事件 Map196.json MAP196 4 EV004 (5,5) 3/5 按确定键 开关[新后日谈第二天](需ON)
784 818 地图事件 Map196.json MAP196 4 EV004 (5,5) 3/5 按确定键 开关[新后日谈第二天](需ON)
785 819 地图事件 Map381.json MAP381 20 EV020 (11,12) 1/2 按确定键 开关[新后日谈第二天](需ON)
786 820 地图事件 Map381.json MAP381 20 EV020 (11,12) 1/2 按确定键 开关[新后日谈第二天](需ON)
787 822 地图事件 Map009.json MAP009 9 EV009 (8,6) 3/4 按确定键 开关[新后日谈第二天](需ON)
788 823 地图事件 Map389.json MAP389 1 EV001 (4,5) 1/3 按确定键 开关[新后日谈第二天夜晚](需ON)
789 824 地图事件 Map389.json MAP389 1 EV001 (4,5) 1/3 按确定键 开关[新后日谈第二天夜晚](需ON)
790 825 地图事件 Map196.json MAP196 12 EV012 (12,7) 2/3 按确定键 开关[新后日谈第二天夜晚](需ON)
791 826 地图事件 Map382.json MAP382 3 EV003 (15,12) 1/2 按确定键 开关[新后日谈第二天夜晚](需ON)
792 826 地图事件 Map382.json MAP382 4 EV004 (14,12) 1/2 按确定键 开关[新后日谈第二天夜晚](需ON)
793 827 地图事件 Map382.json MAP382 3 EV003 (15,12) 1/2 按确定键 开关[新后日谈第二天夜晚](需ON)
794 827 地图事件 Map382.json MAP382 4 EV004 (14,12) 1/2 按确定键 开关[新后日谈第二天夜晚](需ON)
795 828 地图事件 Map009.json MAP009 9 EV009 (8,6) 3/4 按确定键 开关[新后日谈第二天](需ON)
796 845 地图事件 Map350.json MAP350 12 EV012 (7,7) 1/9 自动执行 开关[魔女被击败](需ON) 魔女被击败后,喵露露强杀魔女路线和莉伊喵可莉路线都在这里事件触发
797 846 地图事件 Map349.json MAP349 13 EV013 (18,13) 1/2 事件接触 开关[喵露露带莉莉亚回去](需ON)
798 847 地图事件 Map350.json MAP350 24 EV024 (3,0) 1/3 自动执行 开关[喵露露带莉莉亚折返](需ON)
799 848 地图事件 Map349.json MAP349 9 EV009 (29,12) 1/2 按确定键 无条件
800 849 地图事件 Map350.json MAP350 26 EV026 (4,0) 2/12 自动执行 开关[二战魔女一阶段结束演出](需ON)
801 850 地图事件 Map350.json MAP350 26 EV026 (4,0) 2/12 自动执行 开关[二战魔女一阶段结束演出](需ON)
802 851 地图事件 Map350.json MAP350 26 EV026 (4,0) 2/12 自动执行 开关[二战魔女一阶段结束演出](需ON)
803 852 地图事件 Map350.json MAP350 26 EV026 (4,0) 5/12 自动执行 开关[二战魔女二阶前半](需ON)
804 853 地图事件 Map350.json MAP350 26 EV026 (4,0) 6/12 自动执行 开关[二战魔女二阶后半](需ON)
805 854 地图事件 Map350.json MAP350 26 EV026 (4,0) 6/12 自动执行 开关[二战魔女二阶后半](需ON)
806 855 地图事件 Map350.json MAP350 26 EV026 (4,0) 8/12 自动执行 开关[二战魔女轰击演出](需ON)
807 856 地图事件 Map350.json MAP350 26 EV026 (4,0) 8/12 自动执行 开关[二战魔女轰击演出](需ON)
808 857 公共事件 219 德古拉瞬移到12,18 公共事件#219 开关[开场白完成]
809 860 地图事件 Map350.json MAP350 26 EV026 (4,0) 10/12 自动执行 开关[二战魔女三阶演出](需ON)
810 875 地图事件 Map380.json MAP380 9 EV009 (5,9) 1/2 按确定键 开关[魔女被推下湖底](需ON)
811 876 地图事件 Map012.json MAP012 12 EV012 (2,0) 1/2 自动执行 开关[新后日谈喵可莉变猫](需ON)
812 877 地图事件 Map007.json MAP007 28 EV028 (3,0) 1/2 自动执行 开关[新后日谈剧情完结](需ON)
813 878 地图事件 Map350.json MAP350 26 EV026 (4,0) 6/12 自动执行 开关[二战魔女二阶后半](需ON)
814 879 地图事件 Map324.json MAP324 7 EV007 (14,3) 1/2 按确定键 开关[缇娅幻影胜利](需ON)
815 880 地图事件 Map381.json MAP381 21 EV021 (1,0) 1/2 自动执行 开关[樱校长战斗中剧情对白](需ON)
816 881 地图事件 Map381.json MAP381 21 EV021 (1,0) 1/2 自动执行 开关[樱校长战斗中剧情对白](需ON)
817 882 地图事件 Map381.json MAP381 22 EV022 (2,0) 1/2 自动执行 开关[樱校长战斗中剧情对白2](需ON)
818 883 公共事件 233 魔女幻觉-喵可莉(废弃) 公共事件#233 开关[开场白完成]
819 884 公共事件 233 魔女幻觉-喵可莉(废弃) 公共事件#233 开关[开场白完成]
820 885 公共事件 233 魔女幻觉-喵可莉(废弃) 公共事件#233 开关[开场白完成]
821 886 公共事件 233 魔女幻觉-喵可莉(废弃) 公共事件#233 开关[开场白完成]
822 887 公共事件 233 魔女幻觉-喵可莉(废弃) 公共事件#233 开关[开场白完成]
823 888 公共事件 233 魔女幻觉-喵可莉(废弃) 公共事件#233 开关[开场白完成]
824 889 公共事件 233 魔女幻觉-喵可莉(废弃) 公共事件#233 开关[开场白完成]
825 890 公共事件 233 魔女幻觉-喵可莉(废弃) 公共事件#233 开关[开场白完成]
826 891 公共事件 233 魔女幻觉-喵可莉(废弃) 公共事件#233 开关[开场白完成]
827 891 图片名引用 Map350.json /events/pages/list/parameters 中的 #891#28#ff2020#4#000000
828 892 图片名引用 Map350.json /events/pages/list/parameters 中的 #892#28#ff2020#4#000000
829 893 图片名引用 Map350.json /events/pages/list/parameters 中的 #893#28#ff2020#4#000000
830 894 图片名引用 Map350.json /events/pages/list/parameters 中的 #894#28#ff2020#4#000000
831 895 图片名引用 Map350.json /events/pages/list/parameters 中的 #895#28#ff2020#4#000000
832 896 图片名引用 Map350.json /events/pages/list/parameters 中的 #896#28#ff2020#4#000000
833 897 图片名引用 Map350.json /events/pages/list/parameters 中的 #897#28#ff2020#4#000000
834 898 图片名引用 Map350.json /events/pages/list/parameters 中的 #898#28#ff2020#4#000000
835 899 图片名引用 Map350.json /events/pages/list/parameters 中的 #899#28#ff2020#4#000000
836 900 JS:requestFloatMessage() js/nya/nya_statem_ext.js:16831
837 900 JS:requestFloatMessage() js/nya/nya_statem_ext.js:16853
838 901 地图事件 Map342.json MAP342 3 EV003 (8,0) 1/2 事件接触 开关[大眼被打败](需ON) 且 开关[小眼被打败](需ON)
839 902 地图事件 Map350.json MAP350 26 EV026 (4,0) 4/12 自动执行 开关[二战魔女特殊击杀分支](需ON)
840 903 JS:requestFloatMessage() js/nya/nya_statem_ext.js:18582
841 906 地图事件 Map350.json MAP350 26 EV026 (4,0) 6/12 自动执行 开关[二战魔女二阶后半](需ON)
842 907 地图事件 Map350.json MAP350 26 EV026 (4,0) 10/12 自动执行 开关[二战魔女三阶演出](需ON)
843 908 地图事件 Map350.json MAP350 26 EV026 (4,0) 10/12 自动执行 开关[二战魔女三阶演出](需ON)
844 909 地图事件 Map350.json MAP350 26 EV026 (4,0) 10/12 自动执行 开关[二战魔女三阶演出](需ON)
845 910 地图事件 Map350.json MAP350 26 EV026 (4,0) 10/12 自动执行 开关[二战魔女三阶演出](需ON)
846 911 地图事件 Map350.json MAP350 26 EV026 (4,0) 10/12 自动执行 开关[二战魔女三阶演出](需ON)
847 913 地图事件 Map350.json MAP350 30 EV030 (6,0) 4/7 自动执行 独立开关A=ON
848 914 地图事件 Map350.json MAP350 30 EV030 (6,0) 6/7 自动执行 开关[璃音最终登场](需ON)
849 915 地图事件 Map350.json MAP350 30 EV030 (6,0) 6/7 自动执行 开关[璃音最终登场](需ON)
850 916 地图事件 Map350.json MAP350 26 EV026 (4,0) 10/12 自动执行 开关[二战魔女三阶演出](需ON)
851 917 JS:requestFloatMessage() js/nya/nya_statem_ext.js:18625
852 918 JS:requestFloatMessage() js/nya/nya_statem_ext.js:18628
853 919 JS:requestFloatMessage() js/nya/nya_statem_ext.js:18631
854 920 JS:requestFloatMessage() js/nya/nya_statem_ext.js:18634
855 921 地图事件 Map327.json MAP327 18 EV018 (0,0) 1/4 自动执行 开关[缇娅幻影胜利](需ON)
856 922 JS:requestFloatMessage() js/nya/nya_statem_ext.js:18751
857 923 JS:requestFloatMessage() js/nya/nya_statem_ext.js:18235
858 924 JS:requestFloatMessage() js/nya/nya_statem_ext.js:18788
859 925 JS:requestFloatMessage() js/nya/nya_statem_ext.js:18852
860 926 JS:requestFloatMessage() js/nya/nya_statem_ext.js:18289
861 927 JS:requestFloatMessage() js/nya/nya_statem_ext.js:18953
862 928 JS:requestFloatMessage() js/nya/nya_statem_ext.js:18305
863 929 JS:requestFloatMessage() js/nya/nya_statem_ext.js:18317
864 931 JS:requestFloatMessage() js/nya/nya_statem_ext.js:18329
865 932 JS:requestFloatMessage() js/nya/nya_statem_ext.js:18341
866 933 JS:requestFloatMessage() js/nya/nya_statem_ext.js:18353
867 934 地图事件 Map350.json MAP350 26 EV026 (4,0) 10/12 自动执行 开关[二战魔女三阶演出](需ON)
868 935 地图事件 Map350.json MAP350 4 EV004 (2,7) 1/3 事件接触 开关[传送魔法失效](需ON)
869 936 地图事件 Map045.json MAP045 10 EV010 (4,5) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
870 937 地图事件 Map045.json MAP045 10 EV010 (4,5) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
871 938 地图事件 Map046.json MAP046 11 EV011 (19,6) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
872 939 地图事件 Map046.json MAP046 11 EV011 (19,6) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
873 940 地图事件 Map045.json MAP045 7 EV007 (12,5) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
874 941 地图事件 Map045.json MAP045 7 EV007 (12,5) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
875 942 地图事件 Map044.json MAP044 14 EV014 (12,5) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
876 943 地图事件 Map044.json MAP044 14 EV014 (12,5) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
877 944 地图事件 Map044.json MAP044 15 EV015 (11,4) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
878 945 地图事件 Map044.json MAP044 15 EV015 (11,4) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
879 946 地图事件 Map044.json MAP044 16 EV016 (7,5) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
880 947 地图事件 Map044.json MAP044 16 EV016 (7,5) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
881 948 地图事件 Map045.json MAP045 8 EV008 (3,5) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
882 949 地图事件 Map045.json MAP045 8 EV008 (3,5) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
883 950 地图事件 Map045.json MAP045 9 EV009 (11,5) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
884 951 地图事件 Map045.json MAP045 9 EV009 (11,5) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
885 952 地图事件 Map009.json MAP009 3 EV003 (4,9) 16/16 按确定键 开关[新结局后日谈](需ON) 且 开关[新后日谈剧情完结](需ON)
886 953 地图事件 Map009.json MAP009 3 EV003 (4,9) 16/16 按确定键 开关[新结局后日谈](需ON) 且 开关[新后日谈剧情完结](需ON)
887 954 地图事件 Map048.json MAP048 9 EV009 (10,6) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
888 955 地图事件 Map048.json MAP048 9 EV009 (10,6) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
889 956 地图事件 Map048.json MAP048 7 EV007 (12,6) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
890 957 地图事件 Map048.json MAP048 7 EV007 (12,6) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
891 958 地图事件 Map048.json MAP048 8 EV008 (13,6) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
892 959 地图事件 Map048.json MAP048 8 EV008 (13,6) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
893 960 地图事件 Map039.json MAP039 62 EV062 (33,42) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
894 960 地图事件 Map039.json MAP039 63 EV063 (36,44) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
895 961 地图事件 Map007.json MAP007 29 EV029 (12,9) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
896 961 地图事件 Map007.json MAP007 33 EV033 (13,9) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
897 962 地图事件 Map006.json MAP006 47 EV047 (28,6) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
898 962 地图事件 Map006.json MAP006 48 EV048 (30,6) 1/1 按确定键 开关[新后日谈剧情完结](需ON)
+26
View File
@@ -0,0 +1,26 @@
# 咸鱼喵喵截图辅助工具:简单使用方法
一个在浏览器里操作的本地辅助工具,支持剧情全文搜索、传送、播放对白、角色摆拍,以及角色数值和背包调整,方便回看剧情和截图。
需要 Windows、已安装的《咸鱼喵喵》、[Node.js 22 或更新版本](https://nodejs.org/),以及 [NW.js SDK 0.64.1(Windows x64)](https://dl.nwjs.io/v0.64.1/nwjs-sdk-v0.64.1-win-x64.zip)。发布包不含游戏本体、存档、完整剧本和上述运行环境;无需 npm install。
1. 将包内的 `aitemp截图工具` 文件夹放进游戏安装目录,与游戏的 `package.json` 同级。可从 Steam 的“管理 → 浏览本地文件”找到游戏目录。
2. 解压 NW.js SDK,把 `nwjs-sdk-v0.64.1-win-x64` 文件夹放进 `aitemp截图工具`。确认路径如下,别多套一层文件夹:
```text
游戏目录/
package.json
aitemp截图工具/
tool/启动.bat
nwjs-sdk-v0.64.1-win-x64/nw.exe
out/triggers.csv
unpacked/data/...
```
3. 先在原游戏中正常保存一次并退出。双击 `tool/启动.bat`,首次选择 **1:只启动面板**,在“存档与沙盒”页创建游戏副本。副本需要额外磁盘空间,默认放在游戏所在盘的 `Nyaruru_shots` 文件夹。
4. 副本创建完成后,再次双击 `启动.bat`,工具会备份存档并启动副本游戏。在游戏里正常读档进入地图,确认面板顶部连接的是沙盒。
5. 在面板搜索台词或故事编号,按需要选择“前往”“运行过场”或“只播台词”;摆拍后可点“撤销场景还原”。全文台词在连接游戏后自动读取,断开连接后清空。
面板默认地址为 `http://127.0.0.1:8787`。用完双击 `tool/停止面板.bat`,游戏窗口另行关闭。升级前先退出旧面板和游戏。
建议始终在沙盒里使用:剧情操作可能改变进度,自动存档和手动保存照常生效。“全部还原”会解除临时效果和锁定,但不会回退已经改过的数值、背包或剧情进度;摆拍状态也不保证能通过读档完整恢复。详细说明见包内 `tool/使用须知.md`。
+106
View File
@@ -0,0 +1,106 @@
const fs = require('fs');
const path = require('path');
const net = require('net');
const { spawn } = require('child_process');
const readline = require('readline/promises');
const { readConfig, samePath } = require('./lib/safety');
const FILES = require('./lib/files');
const { CdpClient } = require('./lib/cdp');
const { OPS } = require('./lib/ops');
const TOOL = __dirname, AITEMP = path.dirname(TOOL), GAME = path.dirname(AITEMP);
const sleep = ms => new Promise(r => setTimeout(r, ms));
async function listening(port) {
return new Promise(resolve => {
const s = net.connect({ host: '127.0.0.1', port });
const finish = yes => { s.destroy(); resolve(yes); };
s.once('connect', () => finish(true)); s.once('error', () => finish(false)); s.setTimeout(1000, () => finish(false));
});
}
async function panel(config, matchConfig = true) {
const r = await fetch(`http://127.0.0.1:${config.webPort}/api/health`, { signal: AbortSignal.timeout(1500) });
const data = await r.json();
if (!r.ok || data.version !== 2 || !data.toolDir || !samePath(data.toolDir, TOOL) || (matchConfig && JSON.stringify(data.config) !== JSON.stringify(config))) {
throw new Error('面板端口运行的是旧服务、其他版本或旧配置。请先关闭那个面板服务,再重新启动');
}
return data;
}
async function main() {
if (Number(process.versions.node.split('.')[0]) < 22) throw new Error('需要 Node.js 22 或更新版本');
const config = readConfig(path.join(TOOL, 'config.json'), { cdpPort: 9223, sandboxDir: path.join(path.parse(GAME).root, 'Nyaruru_shots'), webPort: 8787 }, GAME);
if (process.argv.includes('--stop')) {
const runtimeFile = path.join(TOOL, '.server-runtime.json');
const port = fs.existsSync(runtimeFile) ? JSON.parse(fs.readFileSync(runtimeFile, 'utf8')).port : config.webPort;
await panel({ ...config, webPort: port }, false);
await fetch(`http://127.0.0.1:${port}/api/shutdown`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}' });
console.log('控制面板服务已停止,游戏窗口保留'); return;
}
const runtimeFile = path.join(TOOL, '.server-runtime.json');
if (fs.existsSync(runtimeFile)) {
const runtime = JSON.parse(fs.readFileSync(runtimeFile, 'utf8'));
if (runtime.port !== config.webPort && await listening(runtime.port)) {
await panel({ ...config, webPort: runtime.port }, false);
throw new Error('旧面板仍在原端口运行,请先双击“停止面板.bat”,再重新启动');
}
}
console.log('咸鱼喵喵 · 截图辅助工具\n调试端口 ' + config.cdpPort + ' / 面板端口 ' + config.webPort);
const panelRunning = await listening(config.webPort);
if (panelRunning) await panel(config);
const status = FILES.sandboxStatus(GAME, config.sandboxDir, AITEMP);
let target = status.ready ? config.sandboxDir : null;
if (!status.ready) {
console.log('沙盒尚不可用:' + status.reason + '\n[1] 只启动面板,创建沙盒\n[2] 启动原版游戏\n[3] 退出');
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
let choice; try { choice = (await rl.question('请选择(默认 1):')).trim(); } finally { rl.close(); }
if (choice === '3') { console.log('已退出'); return; }
if (choice === '2') target = GAME;
else if (choice && choice !== '1') throw new Error('无效选择,已退出');
}
if (target) {
const occupied = await listening(config.cdpPort);
if (occupied) {
const client = new CdpClient(config.cdpPort);
try {
const info = await client.evalJson(OPS.selfPath());
if (!info.ok || !info.gameDir || !samePath(info.gameDir, target) || !info.saveDir || !samePath(info.saveDir, path.join(target, 'save'))) {
throw new Error('调试端口上的游戏与目标不符。期望:' + target + ';实际:' + (info.gameDir || '未知'));
}
} catch (e) { throw new Error('未启动面板:不能确认已有游戏实例。' + e.message); }
finally { client.close(); }
}
const backup = FILES.backupSaves(path.join(AITEMP, 'backups'), target, samePath(target, GAME) ? 'original' : 'sandbox');
console.log('存档已备份并校验:' + backup.name);
if (!occupied) {
const nw = path.join(AITEMP, 'nwjs-sdk-v0.64.1-win-x64', 'nw.exe');
if (!fs.existsSync(nw)) throw new Error('缺少 SDK 版 NW.js 0.64.1:' + nw + '\n下载:https://dl.nwjs.io/v0.64.1/nwjs-sdk-v0.64.1-win-x64.zip');
const child = spawn(nw, [target, '--remote-debugging-port=' + config.cdpPort], { cwd: path.dirname(nw), detached: true, stdio: 'ignore', windowsHide: true });
await new Promise((resolve, reject) => { child.once('spawn', resolve); child.once('error', reject); }); child.unref();
const client = new CdpClient(config.cdpPort);
let ready = false;
try {
for (let i = 0; i < 20; i++) {
try {
const info = await client.evalJson(OPS.selfPath());
if (!info.ok || !info.gameDir || !samePath(info.gameDir, target) || !info.saveDir || !samePath(info.saveDir, path.join(target, 'save'))) throw new Error('实际游戏路径不符');
ready = true; break;
} catch { client.close(); await sleep(500); }
}
} finally { client.close(); }
if (!ready) throw new Error('游戏未能就绪或实例身份不符,未启动面板。请检查游戏窗口');
}
console.log('当前游戏:' + target);
}
if (!panelRunning) {
const log = fs.openSync(path.join(TOOL, 'server.log'), 'a');
const child = spawn(process.execPath, [path.join(TOOL, 'server.js')], { cwd: TOOL, detached: true, stdio: ['ignore', log, log], windowsHide: true });
await new Promise((resolve, reject) => { child.once('spawn', resolve); child.once('error', reject); }); child.unref(); fs.closeSync(log);
let ready = false;
for (let i = 0; i < 20; i++) { try { await panel(config); ready = true; break; } catch { await sleep(300); } }
if (!ready) throw new Error('面板启动失败,请查看 tool/server.log');
}
const url = `http://127.0.0.1:${config.webPort}`;
const browser = spawn('rundll32.exe', ['url.dll,FileProtocolHandler', url], { detached: true, stdio: 'ignore', windowsHide: true });
browser.on('error', () => console.log('请手动打开:' + url)); browser.unref();
console.log('面板已就绪:' + url + (target ? '' : '\n本次没有启动游戏。创建沙盒后再次运行启动.bat'));
}
if (require.main === module) main().catch(e => { console.error('\n启动停止:' + e.message); process.exitCode = 1; });
module.exports = { main, listening, panel };
+97
View File
@@ -0,0 +1,97 @@
// 单连接 CDP 客户端,要求 Node.js 22+(内置 fetch / WebSocket)。
const RECONNECT_DELAY_MS = 3000;
class CdpClient {
constructor(port = 9223) {
this.port = port; this.ws = null; this.sessionId = null;
this._id = 0; this._pending = new Map(); this._connecting = null; this.generation = 0;
}
get base() { return `http://127.0.0.1:${this.port}`; }
async isAlive() {
try {
const r = await fetch(`${this.base}/json/version`, { signal: AbortSignal.timeout(1500) });
return r.ok && !!(await r.json()).webSocketDebuggerUrl;
} catch { return false; }
}
connect() {
if (this.ws?.readyState === 1 && this.sessionId) return Promise.resolve();
if (this._connecting) return this._connecting;
const generation = ++this.generation;
const attempt = this._connect(generation);
this._connecting = attempt;
attempt.finally(() => { if (this._connecting === attempt) this._connecting = null; }).catch(() => {});
return attempt;
}
async _connect(generation) {
let ws;
try {
const r = await fetch(`${this.base}/json/version`, { signal: AbortSignal.timeout(3000) });
if (!r.ok) throw new Error('调试端口没有返回 CDP 信息');
const v = await r.json();
if (this.generation !== generation) throw new Error('连接已取消');
ws = new WebSocket(v.webSocketDebuggerUrl);
this.ws = ws;
await new Promise((resolve, reject) => {
const timer = setTimeout(() => { reject(new Error('连接游戏超时')); try { ws.close(); } catch {} }, 4000);
const fail = () => { clearTimeout(timer); reject(new Error('无法建立游戏调试连接')); };
ws.onopen = () => { clearTimeout(timer); resolve(); };
ws.onerror = fail; ws.onclose = fail;
});
if (this.generation !== generation) throw new Error('连接已取消');
ws.onmessage = ev => {
let msg; try { msg = JSON.parse(ev.data); } catch { return; }
const p = this._pending.get(msg.id);
if (p && p.ws === ws) {
this._pending.delete(msg.id); clearTimeout(p.timer);
if (msg.error) p.reject(new Error(JSON.stringify(msg.error))); else p.resolve(msg.result);
}
if (msg.method === 'Target.detachedFromTarget' && msg.params?.sessionId === this.sessionId && this.ws === ws) this.close();
};
ws.onclose = () => this._drop(ws, new Error('游戏连接已断开'));
ws.onerror = () => { this._drop(ws, new Error('游戏调试连接出错')); try { ws.close(); } catch {} };
const { targetInfos } = await this._send('Target.getTargets', {}, false);
const pages = targetInfos.filter(t => t.type === 'page' && /\/index\.html?(?:[?#]|$)/i.test(t.url || ''));
if (pages.length !== 1) throw new Error('无法唯一识别游戏主页面,请关闭多余游戏窗口');
const { sessionId } = await this._send('Target.attachToTarget', { targetId: pages[0].targetId, flatten: true }, false);
if (this.ws !== ws || this.generation !== generation) throw new Error('连接已更换');
this.sessionId = sessionId;
} catch (e) {
if (ws) { this._drop(ws, e); try { ws.close(); } catch {} }
throw e;
}
}
_drop(ws, error) {
for (const [id, p] of this._pending) if (p.ws === ws) {
clearTimeout(p.timer); p.reject(error); this._pending.delete(id);
}
if (this.ws === ws) { this.ws = null; this.sessionId = null; }
}
_send(method, params = {}, session = true) {
const ws = this.ws;
if (!ws || ws.readyState !== 1) return Promise.reject(new Error('游戏连接已断开'));
const id = ++this._id, payload = { id, method, params };
if (session && this.sessionId) payload.sessionId = this.sessionId;
return new Promise((resolve, reject) => {
const timer = setTimeout(() => { this._pending.delete(id); reject(new Error(`CDP 调用超时: ${method};不要立即重复操作,请先检查游戏状态`)); }, 20000);
this._pending.set(id, { resolve, reject, timer, ws });
try { ws.send(JSON.stringify(payload)); }
catch (e) { clearTimeout(timer); this._pending.delete(id); reject(e); }
});
}
async eval(expression) {
await this.connect();
const res = await this._send('Runtime.evaluate', { expression, returnByValue: true, awaitPromise: true });
if (res.exceptionDetails) throw new Error(res.exceptionDetails.exception?.description || res.exceptionDetails.text);
return res.result?.value;
}
async evalJson(expression) {
const value = await this.eval(expression);
return typeof value === 'string' ? JSON.parse(value) : value;
}
async screenshot() { await this.connect(); return (await this._send('Page.captureScreenshot', { format: 'png' })).data; }
close() {
++this.generation; this._connecting = null;
const ws = this.ws;
if (ws) { this._drop(ws, new Error('游戏连接已关闭或切换')); try { ws.close(); } catch {} }
}
}
module.exports = { CdpClient, RECONNECT_DELAY_MS };
+216
View File
@@ -0,0 +1,216 @@
// 静态数据加载
//
// 数据来源全部是**之前分析阶段已产出的本地文件**(aitemp/out 和 aietmp/unpacked),
// 工具运行时只读它们,不碰游戏目录里的任何文件。
//
// unpacked/data/System.json → 360 个开关的中文名
// unpacked/data/MapInfos.json → 393 张地图
// out/triggers.csv → 897 条剧情触发点(其中 731 条有坐标)
//
// ⚠️ **台词不在这里。** 这是"C 方案"(见开发文档 12.5)的核心约定:
// 随包分发的只有**结构索引**(哪里有个触发点),
// 一个字创作内容都不带。台词在连上游戏后从 `$dataStory` 实时读,
// 只存在于内存,**绝不落盘**(读取逻辑在 lib/ops.js 的 readStoryIndex)。
//
// 历史:早期版本这里有个 loadStoryIndex(),启动时读 ../out/story.json
// (1.9 MB,全部 870 条剧情的完整台词)。那是作者的原创剧本,
// 随包外传等于分发游戏内容,发布版必须去掉。
const fs = require('fs');
const path = require('path');
/** 极简 CSV 解析(RFC4180:支持引号包裹、字段内逗号、双引号转义) */
function parseCsv(text) {
const rows = [];
let row = [], field = '', inQuotes = false;
// 去掉 BOM
if (text.charCodeAt(0) === 0xFEFF) text = text.slice(1);
for (let i = 0; i < text.length; i++) {
const c = text[i];
if (inQuotes) {
if (c === '"') {
if (text[i + 1] === '"') { field += '"'; i++; }
else inQuotes = false;
} else field += c;
} else if (c === '"') {
inQuotes = true;
} else if (c === ',') {
row.push(field); field = '';
} else if (c === '\n') {
row.push(field); rows.push(row); row = []; field = '';
} else if (c !== '\r') {
field += c;
}
}
if (field !== '' || row.length) { row.push(field); rows.push(row); }
return rows;
}
function readJson(file) {
return JSON.parse(fs.readFileSync(file, 'utf8'));
}
/**
* 载入每张地图的 BGM 名,用来做**粗略的区域提示**。
*
* 游戏的地图在 MapInfos.json 里只有 "MAP170" 这种编号,没有地点名
* (Map*.json 里的 displayName 和 meta 都是空的)。
* 但 BGM 文件名有区分度:cave(24张) / black_forest(26张) / lake(23张)…
* 所以拿它当"这片区域大概是什么"的线索,聊胜于无。
*/
const AREA_NAMES = {
cave: '洞窟', black_forest: '黑森林', lake: '湖畔',
town: '城镇', boss: 'Boss 战', title: '标题',
};
function loadMapAreas(dataDir) {
const areas = new Map();
let files;
try { files = fs.readdirSync(dataDir); } catch { return areas; }
for (const f of files) {
const m = /^Map(\d+)\.json$/.exec(f);
if (!m) continue;
try {
const d = readJson(path.join(dataDir, f));
const bgm = (d.bgm && d.bgm.name) || '';
if (bgm) areas.set(Number(m[1]), AREA_NAMES[bgm] || bgm);
} catch { /* 个别地图文件损坏不影响整体 */ }
}
return areas;
}
/**
* 载入全部静态数据。
* @param {string} baseDir aitemp 目录
*/
function loadAll(baseDir) {
const outDir = path.join(baseDir, 'out');
const dataDir = path.join(baseDir, 'unpacked', 'data');
// ---- 开关 ----
const sys = readJson(path.join(dataDir, 'System.json'));
const switches = [];
const switchNameToId = new Map();
for (let i = 1; i < sys.switches.length; i++) {
const name = sys.switches[i];
if (name === undefined || name === null) continue;
switches.push({ id: i, name: String(name) });
// 同名开关极少见,出现时保留首个
if (!switchNameToId.has(String(name))) switchNameToId.set(String(name), i);
}
// ---- 变量 ----
const variables = [];
for (let i = 1; i < sys.variables.length; i++) {
const name = sys.variables[i];
if (name === undefined || name === null) continue;
variables.push({ id: i, name: String(name) });
}
// ---- 地图 ----
const mapInfos = readJson(path.join(dataDir, 'MapInfos.json'));
const maps = mapInfos
.filter(m => m && m.id)
.map(m => ({ id: m.id, name: String(m.name || ''), parentId: m.parentId || 0 }));
// ---- 区域名 ----
// 台词**不在这里**:它由 server.js 在连上游戏后从 $dataStory 实时补进内存
const mapAreas = loadMapAreas(dataDir);
// ---- 剧情触发点 ----
const csvPath = path.join(outDir, 'triggers.csv');
const raw = parseCsv(fs.readFileSync(csvPath, 'utf8'));
const header = raw[0];
const col = (row, key) => row[header.indexOf(key)] ?? '';
const triggers = [];
for (let i = 1; i < raw.length; i++) {
const r = raw[i];
if (!r || r.length < 2) continue;
// 地图字段形如 "Map004.json MAP004",从中取出数字 ID
const mapField = col(r, '地图');
const mapMatch = /Map0*(\d+)\.json/i.exec(mapField);
const mapId = mapMatch ? Number(mapMatch[1]) : null;
// 坐标字段形如 "(0,0)"
const coordField = col(r, '坐标');
const coordMatch = /\(\s*(\d+)\s*,\s*(\d+)\s*\)/.exec(coordField);
const x = coordMatch ? Number(coordMatch[1]) : null;
const y = coordMatch ? Number(coordMatch[2]) : null;
const condition = col(r, '条件').trim();
// 条件里引用的开关名(形如 开关[第一天夜晚莉莉亚回家](需ON))
const needSwitchNames = [];
for (const m of condition.matchAll(/开关\[([^\]]+)\]/g)) needSwitchNames.push(m[1]);
const needVarNames = [];
for (const m of condition.matchAll(/变量\[([^\]]+)\]/g)) needVarNames.push(m[1]);
const storyId = Number(col(r, '故事序号')) || 0;
triggers.push({
storyId,
source: col(r, '来源'),
mapId,
mapArea: mapId !== null ? (mapAreas.get(mapId) || '') : '',
eventId: col(r, '事件ID'),
eventName: col(r, '事件名'),
x, y,
page: col(r, '页'),
pageIndex: /^\d+\//.test(col(r, '页')) ? Number(col(r, '页').split('/')[0]) - 1 : null,
triggerType: col(r, '触发方式'),
condition,
needSwitchNames,
needVarNames,
// ⚠️ 这里**故意没有** line / speaker / lineCount —— 只有 storyId。
// UI 上那句台词预览由 server.js 在拼响应时从内存里的台词表补上
// (见 /api/triggers),没连游戏时就是空的,前端退回显示地图+坐标。
// 有地图和坐标的才能"一键前往"
actionable: mapId !== null && x !== null && y !== null,
});
}
// 仅合并完全相同的候选;不同事件、页和条件必须保留。
const seen = new Set();
const uniqueTriggers = [];
for (const t of triggers) {
const k = `${t.storyId}|${t.mapId}|${t.eventId}|${t.page}|${t.x}|${t.y}|${t.condition}`;
if (seen.has(k)) continue;
seen.add(k);
uniqueTriggers.push(t);
}
// ---- 常用开关:被触发点条件引用到的那些 ----
// 这是"截图工作真正会用到的开关"的精确集合,用来做开关面板的默认视图
const commonSwitchIds = [];
for (const name of new Set(uniqueTriggers.flatMap(t => t.needSwitchNames))) {
const id = switchNameToId.get(name);
if (id !== undefined) commonSwitchIds.push(id);
}
commonSwitchIds.sort((a, b) => a - b);
return {
switches,
variables,
maps,
triggers: uniqueTriggers,
commonSwitchIds,
switchNameToId,
stats: {
switches: switches.length,
variables: variables.length,
maps: maps.length,
triggersTotal: triggers.length,
triggersUnique: uniqueTriggers.length,
triggersActionable: uniqueTriggers.filter(t => t.actionable).length,
commonSwitches: commonSwitchIds.length,
mapAreas: mapAreas.size,
// 注意:storyLoaded / triggersWithLine **不在这里** ——
// 台词要连上游戏才知道,它们是运行时值,由 server.js 的 /api/status 现算。
},
};
}
module.exports = { loadAll, parseCsv };
+145
View File
@@ -0,0 +1,145 @@
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
const { execFile } = require('child_process');
const { canonical, samePath, contains } = require('./safety');
const MANIFEST = 'backup-manifest.json';
const COMPLETE = '.nyaruru-sandbox-complete.json';
const INCOMPLETE = '.nyaruru-sandbox-incomplete';
const hash = file => crypto.createHash('sha256').update(fs.readFileSync(file)).digest('hex');
const saveNames = dir => fs.existsSync(dir) ? fs.readdirSync(dir).filter(n => /\.rmmzsave$/i.test(n)).sort() : [];
function safeFile(dir, name) {
if (path.basename(name) !== name || !/\.rmmzsave$/i.test(name)) throw new Error('非法存档文件名');
const file = path.join(dir, name), st = fs.lstatSync(file);
if (!st.isFile() || st.isSymbolicLink()) throw new Error('存档必须是普通文件:' + name);
return file;
}
function backupSaves(root, sourceDir, label = 'auto') {
const saveDir = path.join(canonical(sourceDir), 'save');
if (!fs.existsSync(saveDir) || !samePath(saveDir, path.join(sourceDir, 'save')) || fs.lstatSync(saveDir).isSymbolicLink()) throw new Error('存档目录不存在或是目录链接');
const names = saveNames(saveDir);
if (!names.length) throw new Error('没有找到 .rmmzsave 存档,未创建空备份');
fs.mkdirSync(root, { recursive: true });
const dest = fs.mkdtempSync(path.join(root, `${label.replace(/[^a-z0-9_-]/gi, '')}_${new Date().toISOString().replace(/[:.]/g, '-')}_`));
// 未完成目录没有 manifest,不会被列为可恢复备份。
const files = names.map(name => ({ name, sha256: hash(safeFile(saveDir, name)) }));
for (const f of files) fs.copyFileSync(safeFile(saveDir, f.name), path.join(dest, f.name), fs.constants.COPYFILE_EXCL);
if (JSON.stringify(names) !== JSON.stringify(saveNames(saveDir)) || files.some(f => hash(safeFile(saveDir, f.name)) !== f.sha256 || hash(path.join(dest, f.name)) !== f.sha256)) {
throw new Error('备份期间存档发生变化或复制校验失败,请停止存档操作后重试。未完成目录:' + dest);
}
const manifest = { version: 1, sourceDir: canonical(sourceDir), createdAt: new Date().toISOString(), files };
fs.writeFileSync(path.join(dest, MANIFEST), JSON.stringify(manifest, null, 2), { flag: 'wx' });
return { dir: dest, name: path.basename(dest), files: files.length, from: saveDir };
}
function inspectBackup(root, name) {
if (typeof name !== 'string' || name === '.' || name === '..' || /[\\/:]/.test(name)) throw new Error('非法备份名');
const dir = path.join(root, name);
if (!fs.existsSync(dir) || fs.lstatSync(dir).isSymbolicLink() || !fs.statSync(dir).isDirectory()) throw new Error('备份不存在或是目录链接');
let manifest = null;
const meta = path.join(dir, MANIFEST);
if (fs.existsSync(meta)) {
manifest = JSON.parse(fs.readFileSync(meta, 'utf8'));
if (!Array.isArray(manifest.files) || !manifest.files.length) throw new Error('备份清单无效');
} else if (!/^\d{8}_\d{6}$|^[a-z][a-z0-9_-]*_\d{8}_\d{6}$/i.test(name)) {
throw new Error('备份没有完成标记');
}
const files = manifest ? manifest.files : saveNames(dir).map(name => ({ name }));
if (!files.length || new Set(files.map(f => f.name)).size !== files.length) throw new Error('备份为空或文件重复');
for (const f of files) {
const digest = hash(safeFile(dir, f.name));
if (f.sha256 && digest !== f.sha256) throw new Error('备份内容校验失败:' + f.name);
f.sha256 = digest;
}
return { dir, manifest, files };
}
function listBackups(root) {
if (!fs.existsSync(root)) return [];
return fs.readdirSync(root).flatMap(name => {
try {
const b = inspectBackup(root, name);
return [{ name, files: b.files.length, sourceDir: b.manifest?.sourceDir || null, legacy: !b.manifest, mtime: fs.statSync(b.dir).mtimeMs }];
} catch { return []; }
}).sort((a, b) => b.mtime - a.mtime);
}
function restoreBackup(root, name, targetDir) {
const b = inspectBackup(root, name);
const target = canonical(targetDir), saveDir = path.join(target, 'save');
if (fs.existsSync(saveDir) && fs.lstatSync(saveDir).isSymbolicLink()) throw new Error('不能还原到存档目录链接');
const safety = saveNames(saveDir).length ? backupSaves(root, target, 'prerestore') : null;
const stage = fs.mkdtempSync(path.join(target, '.save-restore-'));
// 保留云配置等非存档文件;存档集合严格来自选中的备份。
if (fs.existsSync(saveDir)) {
for (const entry of fs.readdirSync(saveDir, { withFileTypes: true })) {
if (entry.isSymbolicLink() || entry.isDirectory()) throw new Error('存档目录含链接或子目录,停止还原');
if (!/\.rmmzsave$/i.test(entry.name)) fs.copyFileSync(path.join(saveDir, entry.name), path.join(stage, entry.name));
}
}
for (const f of b.files) {
fs.copyFileSync(path.join(b.dir, f.name), path.join(stage, f.name));
if (hash(path.join(stage, f.name)) !== f.sha256) throw new Error('还原暂存校验失败');
}
const old = path.join(target, `.save-before-restore-${crypto.randomUUID()}`);
const hadSave = fs.existsSync(saveDir);
if (hadSave) fs.renameSync(saveDir, old);
try { fs.renameSync(stage, saveDir); }
catch (e) { if (hadSave) fs.renameSync(old, saveDir); throw e; }
return { restored: b.files.length, target: saveDir, safetyBackup: safety?.name || null, previousDirectory: hadSave ? old : null };
}
function excludedDirs(gameDir, toolDir) {
return fs.readdirSync(gameDir, { withFileTypes: true }).filter(e => e.isDirectory() && (
/^aitemp/i.test(e.name) || samePath(path.join(gameDir, e.name), toolDir) || fs.existsSync(path.join(gameDir, e.name, 'tool', 'server.js'))
)).map(e => path.join(gameDir, e.name));
}
function gameFiles(gameDir, excluded) {
const result = [];
function walk(dir, prefix = '') {
for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
const file = path.join(dir, e.name), rel = path.join(prefix, e.name);
if (!prefix && (['save', 'error', 'debug.log'].includes(e.name.toLowerCase()) || /^aitemp/i.test(e.name) || e.name.startsWith('.save-') || excluded.some(d => samePath(d, file)))) continue;
if (e.isSymbolicLink()) throw new Error('游戏目录含链接,无法验证完整副本:' + rel);
if (e.isDirectory()) walk(file, rel);
else if (e.isFile()) result.push({ name: rel, size: fs.statSync(file).size });
}
}
walk(gameDir); return result;
}
function sandboxStatus(gameDir, sandboxDir, toolDir, checkingCopy = false) {
try {
if (contains(gameDir, sandboxDir) || contains(sandboxDir, gameDir)) return { ready: false, reason: '沙盒路径与原版重叠' };
if (!fs.existsSync(sandboxDir)) return { ready: false, reason: '尚未创建' };
if (!checkingCopy && fs.existsSync(path.join(sandboxDir, INCOMPLETE))) return { ready: false, reason: '上次复制尚未完成,请另选空目录重新创建' };
const required = gameFiles(gameDir, excludedDirs(gameDir, toolDir));
if (!required.some(f => f.name === 'package.json') || !required.some(f => f.name === 'index.html')) throw new Error('原版游戏目录不完整');
const bad = required.find(f => {
const dest = path.join(sandboxDir, f.name);
return !fs.existsSync(dest) || !fs.statSync(dest).isFile() || fs.statSync(dest).size !== f.size || !contains(sandboxDir, canonical(dest));
});
if (bad) return { ready: false, reason: '副本缺失或大小不符:' + bad.name };
return { ready: true, legacy: !fs.existsSync(path.join(sandboxDir, COMPLETE)), files: required.length };
} catch (e) { return { ready: false, reason: e.message }; }
}
function copySandbox(gameDir, sandboxDir, toolDir) {
if (contains(gameDir, sandboxDir) || contains(sandboxDir, gameDir)) throw new Error('沙盒路径与原版重叠');
if (fs.existsSync(sandboxDir) && fs.readdirSync(sandboxDir).length) throw new Error('目标目录非空,不能覆盖;请选择新的空目录');
const excluded = excludedDirs(gameDir, toolDir);
const originalSave = path.join(gameDir, 'save');
const saves = saveNames(originalSave).map(name => ({ name, sha256: hash(safeFile(originalSave, name)) }));
if (!saves.length) throw new Error('原版没有存档,请先正常开始游戏并保存');
fs.mkdirSync(sandboxDir, { recursive: true });
fs.writeFileSync(path.join(sandboxDir, INCOMPLETE), new Date().toISOString(), { flag: 'wx' });
return new Promise((resolve, reject) => {
execFile('robocopy', [gameDir, sandboxDir, '/E', '/XJ', '/NFL', '/NDL', '/NJH', '/NJS', '/NP', '/R:1', '/W:1', '/XF', 'aitemp*', 'debug.log', '/XD', ...excluded, 'error', '.save-*'],
{ windowsHide: true, maxBuffer: 32 * 1024 * 1024 }, (err, out, stderr) => {
try {
if (err && !(Number.isInteger(err.code) && err.code <= 7 && err.code >= 0)) throw new Error(stderr || err.message);
const status = sandboxStatus(gameDir, sandboxDir, toolDir, true);
if (!status.ready) throw new Error(status.reason);
if (JSON.stringify(saveNames(originalSave)) !== JSON.stringify(saves.map(f => f.name)) || saves.some(f => hash(safeFile(originalSave, f.name)) !== f.sha256 || hash(safeFile(path.join(sandboxDir, 'save'), f.name)) !== f.sha256)) throw new Error('复制期间存档发生变化或副本校验失败,请退出游戏后重建');
fs.writeFileSync(path.join(sandboxDir, COMPLETE), JSON.stringify({ createdAt: new Date().toISOString(), files: status.files }));
fs.unlinkSync(path.join(sandboxDir, INCOMPLETE));
resolve(status);
} catch (e) { reject(e); }
});
});
}
module.exports = { backupSaves, listBackups, restoreBackup, inspectBackup, sandboxStatus, copySandbox, excludedDirs };
+1335
View File
File diff suppressed because it is too large Load Diff
+120
View File
@@ -0,0 +1,120 @@
// 此函数在游戏上下文中运行。记录留在 window 的非枚举属性中,不进入存档。
function installPhotoTools() {
if (window.__nyaruruPhoto) { window.__nyaruruPhoto.touch?.(); return window.__nyaruruPhoto; }
const records = new Map();
let lastTouch = Date.now();
const refreshSprite = ev => {
const walk = node => {
if (!node) return;
if (node._character === ev && node.setCharacterBitmap) {
node._characterName = ev.bitmapName ? ev.bitmapName() : ev.characterName();
node._characterIndex = ev.characterIndex();
node._tileId = ev.tileId();
if (node._tileId) node.setTileBitmap(); else node.setCharacterBitmap();
// 换位图会重置为整张图;角色帧号即使没变,也必须重新裁切。
// 图片异步加载完成时还会重置一次,因此在加载回调中刷新游戏自己的帧逻辑。
const bitmap = node._contentSprite ? node._contentSprite.bitmap : node.bitmap;
const refreshFrame = () => {
const current = node._contentSprite ? node._contentSprite.bitmap : node.bitmap;
if (node._character !== ev || current !== bitmap) return;
node._framePos = -1;
if (node.updateFrame) node.updateFrame();
};
node._framePos = -1;
if (bitmap && bitmap.addLoadListener) bitmap.addLoadListener(refreshFrame);
else refreshFrame();
}
for (const child of node.children || []) walk(child);
};
try { walk(SceneManager._scene); } catch { /* 精灵尚未建立时由下一帧刷新 */ }
};
const settle = (ev, page) => {
const ai = ev.event?.().pages?.[page]?.list?.find(c => c.code === 357 && c.parameters?.[1] === 'ai')?.parameters?.[3];
// 只有原页明确要求贴地的角色参与;飞行角色、固定摆件及无近处地面保持原位。
if (String(ai?.smoothfloor) !== 'true' || String(ai?.skipSmoothfloor) === 'true' || String(ai?.fix) === 'true' || !ev.hitPreview || !ev.locate) return;
const th = $gameMap.tileHeight(), tw = $gameMap.tileWidth();
for (let dy = 0; dy <= th; dy++) {
const hits = (ev.hitPreview(0, dy) || []).filter(o => o?.terrain === true);
if (!hits.length) continue;
if (hits.some(o => o.type === 2)) return;
const drop = Math.max(0, dy - 1); // 停在地形外侧,不能把碰撞体塞进地板。
if (!drop) return;
const x = ev.tileXToCenterX ? (ev.px - ev.tileXToCenterX(0)) / tw : (ev._realX ?? ev._x);
const y = ev.tileYToCenterY ? (ev.py + drop - ev.tileYToCenterY(0)) / th : (ev._realY ?? ev._y) + drop / th;
ev.locate(x, y);
ev.clearImpact?.(); ev.clearGrounding?.();
ev._groundingX = ev._terrainGroundingX = ev.px;
ev._groundingY = ev._terrainGroundingY = ev.py;
return;
}
};
const unpin = ev => {
const record = records.get(ev);
if (!record) return;
// 还原被我们覆盖的自有字段和方法,包括原始 _erased、解释器及物理状态。
for (const key of Reflect.ownKeys(ev)) if (!Object.hasOwn(record, key)) delete ev[key];
Object.defineProperties(ev, record);
records.delete(ev);
refreshSprite(ev);
};
const api = {
touch: () => { lastTouch = Date.now(); },
count: () => records.size,
facePlayer(ev) {
if (!records.has(ev) || typeof $gamePlayer === 'undefined' || !ev.setDirection) return;
const dx = $gamePlayer.px - ev.px;
if (!Number.isFinite(dx) || Math.abs(dx) < 1) return;
const fixed = ev._directionFix;
try { ev._directionFix = false; ev.setDirection(dx < 0 ? 4 : 6); }
finally { ev._directionFix = fixed; }
},
unpinAll() {
const n = records.size;
for (const ev of [...records.keys()]) unpin(ev);
if ($gameMap?.requestRefresh) $gameMap.requestRefresh();
return n;
},
pin(ev, page) {
if (records.has(ev)) unpin(ev);
const record = Object.getOwnPropertyDescriptors(ev);
records.set(ev, record);
try {
// setupPageSettings 会写 statemMembers,隔离这层避免污染撤销快照。
if (ev._statemMembers) ev._statemMembers = { ...ev._statemMembers };
ev._erased = false;
ev._pageIndex = page;
ev.setupPageSettings();
settle(ev, page);
for (const name of ['start', 'update', 'updateParallel', 'checkEventTriggerAuto', 'checkEventTriggerTouch', 'physicsTriggerTouch', 'refresh']) {
Object.defineProperty(ev, name, { value() {}, configurable: true, writable: true });
}
// 只更新图片帧,不调用 Game_Event.update(其中包含 AI、移动和事件触发)。
Object.defineProperty(ev, 'update', { configurable: true, writable: true, value() {
if (typeof ImageFrame !== 'undefined' && this.updateFrameAnimation) {
this.updateFrameAnimation(ImageFrame.info(this.characterName()));
}
} });
Object.defineProperty(ev, 'findProperPageIndex', { value: () => page, configurable: true, writable: true });
ev._starting = false; ev._trigger = null; ev._interpreter = null; ev._moveType = 0;
ev.physics = false; ev.fix = true;
ev.vx = ev.vy = ev._vx = ev._vy = 0;
api.facePlayer(ev);
refreshSprite(ev);
} catch (e) { unpin(ev); throw e; }
},
};
Object.defineProperty(window, '__nyaruruPhoto', { value: api, configurable: true });
// 面板关闭或断线后两分钟撤销摆拍,恢复事件原有行为。
if (typeof setInterval === 'function') setInterval(() => {
if (records.size && Date.now() - lastTouch > 120000) api.unpinAll();
}, 10000);
// 不拦截游戏的手动或自动存档;摆拍跨读档的限制由面板提示。
// 正常切图或读档会结束摆拍,清除旧地图的记录。
for (const [object, name] of [[Game_Map.prototype, 'setup'], [DataManager, 'extractSaveContents']]) {
const original = object[name];
if (typeof original !== 'function') continue;
object[name] = function(...args) { api.unpinAll(); return original.apply(this, args); };
}
return api;
}
module.exports = { installPhotoTools };
+11
View File
@@ -0,0 +1,11 @@
// 与启动器、服务端一致:读取实际游戏及存档目录,不解析页面 URL。
const { CdpClient } = require('./cdp');
const { OPS } = require('./ops');
async function probe(port) {
if (!Number.isInteger(port) || port < 1024 || port > 65535) throw new Error('端口无效');
const c = new CdpClient(port);
try { const r = await c.evalJson(OPS.selfPath()); if (!r.ok || !r.gameDir) throw new Error(r.error || '无法识别游戏'); return r; }
finally { c.close(); }
}
if (require.main === module) probe(Number(process.argv[2])).then(r => console.log(r.gameDir)).catch(e => { console.error(e.message); process.exitCode = 1; });
module.exports = { probe };
+9
View File
@@ -0,0 +1,9 @@
const { execFile } = require('child_process');
async function assertGamesStopped() {
if (process.platform !== 'win32') throw new Error('当前平台无法核实游戏进程,停止还原');
const script = '[Console]::OutputEncoding=[System.Text.Encoding]::UTF8; @(Get-CimInstance Win32_Process -ErrorAction Stop | Where-Object { $_.Name -match "^(nw|Nyaruru).*\\.exe$" } | Select-Object ProcessId,Name) | ConvertTo-Json -Compress';
const text = await new Promise((resolve, reject) => execFile('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', script], { windowsHide: true, timeout: 6000, encoding: 'utf8' }, (e, out) => e ? reject(new Error('无法检查游戏进程,停止还原:' + e.message)) : resolve(out)));
const rows = text.trim() ? JSON.parse(text) : [];
if ((Array.isArray(rows) ? rows : [rows]).length) throw new Error('请先退出游戏及 NW.js 游戏窗口,再还原存档,避免运行中的游戏把旧状态写回');
}
module.exports = { assertGamesStopped };
+43
View File
@@ -0,0 +1,43 @@
// 启动器与服务端共用的路径、配置校验。
const fs = require('fs');
const path = require('path');
function canonical(input) {
if (typeof input !== 'string' || !path.isAbsolute(input)) throw new Error('必须填写绝对路径');
let p = path.resolve(input);
const tail = [];
while (!fs.existsSync(p)) {
const parent = path.dirname(p);
if (parent === p) throw new Error('目录所在磁盘不存在');
tail.unshift(path.basename(p)); p = parent;
}
return path.join(fs.realpathSync.native(p), ...tail);
}
function samePath(a, b) { return canonical(a).toLowerCase() === canonical(b).toLowerCase(); }
function contains(a, b) {
const rel = path.relative(canonical(a).toLowerCase(), canonical(b).toLowerCase());
return rel === '' || (!rel.startsWith('..' + path.sep) && rel !== '..' && !path.isAbsolute(rel));
}
function validateConfig(config, gameDir) {
const next = { ...config };
for (const key of ['cdpPort', 'webPort']) {
const n = Number(next[key]);
if (!Number.isInteger(n) || n < 1024 || n > 65535) throw new Error(`${key} 必须是 1024~65535 的整数`);
next[key] = n;
}
if (next.cdpPort === next.webPort) throw new Error('游戏调试端口和控制面板端口不能相同');
next.sandboxDir = canonical(String(next.sandboxDir || '').trim());
if (contains(gameDir, next.sandboxDir) || contains(next.sandboxDir, gameDir)) {
throw new Error('沙盒与原版目录必须完全分开,不能相同,也不能互相包含');
}
return next;
}
function readConfig(file, defaults, gameDir) {
let patch = {};
if (fs.existsSync(file)) {
try { patch = JSON.parse(fs.readFileSync(file, 'utf8')); }
catch { throw new Error('config.json 损坏,请修正配置后重试;不会静默换用其他目录'); }
}
return validateConfig({ ...defaults, ...patch }, gameDir);
}
module.exports = { canonical, samePath, contains, validateConfig, readConfig };
+78
View File
@@ -0,0 +1,78 @@
// 发布版专用。全文索引只存在于内存,不读写台词文件。
class StoryCache {
constructor(cdp, ops, triggers, { retryMs = 3000, maxAttempts = 4, now = Date.now } = {}) {
Object.assign(this, { cdp, ops, triggers, retryMs, maxAttempts, now });
this.revision = 0;
this.reset();
}
key() {
return this.cdp.ws?.readyState === 1 && this.cdp.sessionId
? `${this.cdp.port}:${this.cdp.generation}:${this.cdp.sessionId}` : null;
}
reset(key = null) {
this.connection = key;
this.index = null;
this.pending = null;
this.attempts = 0;
this.nextTryAt = 0;
this.error = '';
this.at = 0;
++this.revision;
}
sync() {
const key = this.key();
if (key !== this.connection) this.reset(key);
return key;
}
status() {
const key = this.sync();
const loaded = !!this.index;
return {
state: !key ? 'disconnected' : loaded ? 'ready' : this.pending ? 'loading'
: this.error ? (this.attempts >= this.maxAttempts ? 'error' : 'retrying') : 'waiting',
loaded, revision: this.revision, connection: key, error: this.error,
attempts: this.attempts, at: this.at,
count: loaded ? Object.keys(this.index).length : 0,
triggersWithLine: loaded ? this.triggers.filter(t => this.index[String(t.storyId)]).length : 0,
};
}
get(id) { this.sync(); return this.index?.[String(id)] || null; }
async ensure({ force = false } = {}) {
let key = this.sync();
if (!key) {
if (!(await this.cdp.isAlive())) return null;
try { await this.cdp.connect(); } catch { this.sync(); return null; }
key = this.sync();
}
if (!key) return null;
if (this.pending) return this.pending;
if (force) { this.reset(key); }
else if (this.index || this.attempts >= this.maxAttempts || this.now() < this.nextTryAt) return this.index;
const revision = this.revision;
++this.attempts;
const task = (async () => {
try {
const result = await this.cdp.evalJson(this.ops.readStoryIndex());
if (this.key() !== key || this.revision !== revision) return null;
if (!result?.ok || !result.index || !Object.keys(result.index).length) {
throw new Error(result?.error || '故事表尚未就绪或没有可读台词');
}
this.index = result.index;
this.error = '';
this.at = this.now();
++this.revision;
return this.index;
} catch (e) {
if (this.key() !== key || this.revision !== revision) return null;
this.error = String(e.message || e);
this.nextTryAt = this.now() + this.retryMs;
++this.revision;
return null;
}
})();
this.pending = task;
try { return await task; }
finally { if (this.pending === task) this.pending = null; }
}
}
module.exports = { StoryCache };
+82
View File
@@ -0,0 +1,82 @@
// 已核对的剧情落脚点。控制事件的位置不一定是角色演出的位置。
// Map181 EV002 第 5 页将玩家送到 Map182 (11,11),随后由 EV003 自动执行
// 298/299 -> 305。EV003 本身放在 (0,0),仅用于控制剧情。
// 此表只有结构坐标,不含台词;发布版可直接共用,无需本地解包数据。
function storyPosition(trigger) {
const { x, y } = trigger;
const entries = [
{ map: 182, event: 3, page: 0, stories: [298, 299, 305], from: [0, 0], to: [11, 11] },
// 原游戏 Map006 EV017 第 1 页的入场位置。
{ map: 9, event: 10, page: 5, stories: [449], from: [0, 0], to: [11, 9] },
// 原游戏 Map301 EV005 第 1 页的村落入口。
{ map: 296, event: 34, page: 5, stories: [449], from: [4, 0], to: [28, 13] },
// 原游戏 Map004 EV005 第 5 页的梦境入场位置。
{ map: 254, event: 2, page: 0, stories: [467], from: [0, 0], to: [6, 5] },
];
const entry = entries.find(e => Number(trigger.mapId) === e.map && Number(trigger.eventId) === e.event &&
trigger.pageIndex !== null && trigger.pageIndex !== undefined && Number(trigger.pageIndex) === e.page &&
e.stories.includes(Number(trigger.storyId)) &&
x !== null && y !== null && x !== '' && y !== '' && Number(x) === e.from[0] && Number(y) === e.from[1]);
if (entry) {
return { x: entry.to[0], y: entry.to[1], positionNote: `使用原游戏入场位置;剧情控制事件位于 (${entry.from.join(',')})` };
}
return { x, y };
}
// 在游戏运行时调用;只读取当前地图与碰撞,不加载/导出台词或解包文件。
function chooseStoryPosition({ map, player, data, eventId, pageIndex, storyId, sameMap, previous, preferred, requested }) {
const event = data.events?.[eventId];
const containsStory = page => page.list?.some(c => c.code === 357 && c.parameters?.[1] === 'call_story' && Number(c.parameters[3]?.id) === Number(storyId));
const page = event?.pages?.[pageIndex] || event?.pages?.find(containsStory);
const hasBody = pg => !!(pg?.image?.characterName || pg?.image?.tileId || pg?.list?.some(c => c.code === 357 && c.parameters?.[1] === 'ai' && Number(c.parameters[3]?.battleObject) > 0));
if (!page || ![3, 4].includes(page.trigger) || hasBody(page)) return { ok: true, ...requested, controller: false };
if (!preferred && (requested.x !== event.x || requested.y !== event.y)) preferred = requested;
const tw = map.tileWidth(), th = map.tileHeight(), step = Math.max(8, Math.floor(th / 4));
let probes = 0;
const floor = (x, y, depth) => {
x = Math.round(x); y = Math.round(y);
if (!Number.isFinite(x) || !Number.isFinite(y) || x < 0 || y < 0 || x >= map.width() || y >= map.height()) return null;
for (let dy = 0; dy <= Math.min(depth * th, (map.height() - y) * th); dy += step) {
if (++probes > 800) return null;
const hits = (player.hitPreview((x - player._x) * tw, (y - player._y) * th + dy) || []).filter(o => o?.terrain === true);
if (!hits.length) continue;
if (hits.some(o => o.type === 2)) return null;
return { x, y: y + Math.max(0, Math.floor((dy - step) / th)) };
}
return null;
};
// 同图已站在正常场景里时,不因点击控制事件而把人重新送到角落。
let pick = sameMap && previous ? floor(previous.x, previous.y, 1) : null;
let reason = pick ? '保留当前可落地位置' : '';
if (!pick && preferred) { pick = floor(preferred.x, preferred.y, 2); if (pick) reason = '使用已核实的入场位置'; }
const events = (map.events() || []).filter(e => e && e.eventId() !== Number(eventId));
const refs = new Set((page.list || []).filter(c => [203, 205, 213].includes(c.code)).map(c => Number(c.parameters?.[0])).filter(id => id > 0));
const ordered = [
...events.filter(e => refs.has(e.eventId())),
...events.filter(e => e.characterName?.()),
...events.filter(e => e.event()?.pages?.some(hasBody)),
];
const seen = new Set();
for (const ev of ordered) {
if (pick || probes >= 600) break;
if (seen.has(ev)) continue;
seen.add(ev);
for (const dx of [-1, 1, -2, 2]) {
pick = floor(ev._x + dx, Math.max(0, ev._y - 1), 4);
if (pick) { reason = '按场景人物附近的安全地面定位'; break; }
}
}
// 场景人物不可用时,仅在地图内部做有上限的地形扫描,不猜测原作站位。
if (!pick) {
const xs = Array.from({ length: Math.min(map.width(), 31) }, (_, i) => Math.round((i + 0.5) * map.width() / Math.min(map.width(), 31)))
.sort((a, b) => Math.abs(a - map.width() / 2) - Math.abs(b - map.width() / 2));
for (const x of xs) {
if (probes >= 800) break;
pick = floor(x, 0, map.height());
if (pick) { reason = '按当前地图的安全地面定位'; break; }
}
}
if (!pick) return { ok: false, controller: true, error: '这是无形剧情控制事件,未找到可确认的安全落脚点;已保留悬浮,请手动定位后再运行过场' };
return { ok: true, ...pick, controller: true, positionNote: reason };
}
module.exports = { storyPosition, chooseStoryPosition };
+148
View File
@@ -0,0 +1,148 @@
// Injected into the game. Uses NYA's actor inventory/battle values, not RPG Maker HP/gold.
function installTrainer() {
if (window.__nyaruruTrainer) return window.__nyaruruTrainer;
const fields = { coin: '_coin', hp: '_hp', sp: 'sp', zp: 'zp' };
const locks = new Map();
const ids = new WeakMap();
let serial = 0, touched = Date.now(), actors = $gameActors, party = $gameParty;
const id = o => { if (!ids.has(o)) ids.set(o, ++serial); return ids.get(o); };
const active = () => {
const actor = $gamePlayer.actor(), battle = $gamePlayer.battleObject();
if (!actor || !battle) throw new Error('当前角色数据尚未就绪');
return { actor, battle, subject: `${id(actor)}:${id(battle)}:${!!$gamePlayer.isLilyMode()}` };
};
const maximum = (field, b) => field === 'coin' ? 99999 : Math.max(0, Math.floor(b['m' + field]));
const integer = (value, max) => {
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0 || value > max) {
throw new Error(`请输入 0~${max} 的整数`);
}
return value;
};
// Accessor intercepts the actual storage slot, so even lethal damage cannot reach zero
// before a later polling refill. Descriptor flags and the current value survive unlock.
function detach(lock) {
if (!lock.object) return;
const value = lock.value();
Object.defineProperty(lock.object, fields[lock.field], { ...lock.descriptor, value });
lock.object = null;
}
function clear() {
for (const lock of locks.values()) detach(lock);
locks.clear();
}
function sync() {
if (actors !== $gameActors || party !== $gameParty || Date.now() - touched > 120000) {
clear(); actors = $gameActors; party = $gameParty;
}
if (!locks.size) return;
const { actor, battle } = active();
for (const lock of locks.values()) {
const object = lock.field === 'coin' ? actor : battle;
if (lock.object === object) continue;
detach(lock);
const key = fields[lock.field], descriptor = Object.getOwnPropertyDescriptor(object, key);
if (!descriptor?.configurable || !descriptor.writable || !('value' in descriptor)) {
throw new Error('当前游戏的数值结构不支持锁定');
}
lock.object = object; lock.descriptor = descriptor;
lock.value = () => Math.min(lock.target, maximum(lock.field, battle));
Object.defineProperty(object, key, {
configurable: true, enumerable: descriptor.enumerable,
get: () => lock.value(), set: () => {},
});
}
}
function touch() { sync(); touched = Date.now(); }
// Only one timer per game page; neither hooks nor lock settings enter save data.
setInterval(() => { try { sync(); } catch { clear(); } }, 100);
const categories = ['consumables', 'weapons', 'stones', 'ornaments'];
const specials = {
joycoin: ['joyCoinData', 'joyCoinNum', '_joyCoin'],
hpst: ['hpStrengthData', 'hpStrengthNum', '_hpStrengthItem'],
skillst: ['skillStrengthData', 'skillStrengthNum', '_skillStrengthItem'],
};
const localized = key => String(TextManager[key] ?? key ?? '');
function read() {
touch();
const { actor, battle, subject } = active();
const stats = Object.fromEntries(Object.keys(fields).map(field => [field, {
value: field === 'coin' ? actor.coin() : battle[field],
max: maximum(field, battle), locked: locks.has(field), target: locks.get(field)?.target ?? null,
}]));
const items = [];
for (const type of categories) {
const container = actor['_' + type];
for (const [key, data] of Object.entries(container.data())) {
const itemId = Number(key);
if (!Number.isSafeInteger(itemId) || itemId < 0 || !data) continue;
items.push({ type, id: itemId, name: localized(data.name), desc: localized(data.desc),
count: type === 'consumables' ? container.itemNum(itemId) : Number(container.isUnlock(itemId)),
max: type === 'consumables' ? container.maxNum(itemId) : 1,
equipped: type === 'weapons' ? container.currentWeapon() === itemId : !!container.isEquip?.(itemId),
});
}
}
for (const [type, [dataMethod, countMethod]] of Object.entries(specials)) {
const data = actor[dataMethod]();
items.push({ type, id: 0, name: localized(data.name), desc: localized(data.desc), count: actor[countMethod](), max: 99999, equipped: false });
}
return { ok: true, subject, role: $gamePlayer.isLilyMode() ? '莉莉娅' : actor.name(), stats, items };
}
function change(body) {
touch();
const { actor, battle, subject } = active();
if (body.subject !== subject) throw new Error('操作角色已变化,请刷新角色与背包后重试');
if (body.action === 'stat') {
const field = body.field;
if (!Object.prototype.hasOwnProperty.call(fields, field)) throw new Error('未知数值');
if (body.locked !== undefined && typeof body.locked !== 'boolean') throw new Error('锁定参数无效');
if (body.locked === false) {
const old = locks.get(field);
if (old) { detach(old); locks.delete(field); }
return read();
}
const value = integer(body.value, maximum(field, battle));
if (field === 'hp' && battle.hp === 0 && value > 0) throw new Error('角色已倒下,请先在游戏里复活或读档,再修改血量');
const old = locks.get(field), keepLocked = body.locked === true || !!old;
if (old) { detach(old); locks.delete(field); }
if (field === 'coin') {
const delta = value - actor.coin();
if (delta >= 0) actor.addCoin(delta); else actor.deductCoin(-delta);
} else battle['add' + field[0].toUpperCase() + field.slice(1)](value - battle[field]);
if (keepLocked) {
locks.set(field, { field, target: value, object: null });
try { sync(); } catch (e) { clear(); throw e; }
}
} else if (body.action === 'item') {
const { type } = body;
const itemId = integer(body.id, 99999);
if (Object.prototype.hasOwnProperty.call(specials, type)) {
if (itemId !== 0) throw new Error('物品编号无效');
actor[specials[type][2]] = integer(body.count, 99999);
} else {
if (!categories.includes(type)) throw new Error('物品分类无效');
const container = actor['_' + type], data = container.data();
if (!Object.prototype.hasOwnProperty.call(data, itemId) || !data[itemId]) throw new Error('物品不存在');
const max = type === 'consumables' ? (body.overCap === true ? 99999 : container.maxNum(itemId)) : 1;
const count = integer(body.count, max);
if (type === 'consumables') container.add(itemId, count - container.itemNum(itemId), body.overCap === true);
else if (count) container.unlock(itemId);
else if (type === 'weapons') {
const remaining = container._unlock.filter(n => n !== itemId);
if (!remaining.length) throw new Error('至少需要保留一件武器,避免游戏攻击时找不到武器');
if (container.currentWeapon() === itemId) { actor.changeWeapon(remaining[0]); $gamePlayer.setWeaponChange(); }
container._unlock = remaining;
} else if (type === 'ornaments') container.remove(itemId);
else {
if (container.isEquip(itemId)) container.equip(itemId);
container._unlock = container._unlock.filter(n => n !== itemId);
}
}
} else throw new Error('未知修改操作');
return read();
}
return window.__nyaruruTrainer = { read, change, touch, clear };
}
module.exports = { installTrainer };
+497
View File
@@ -0,0 +1,497 @@
// 咸鱼喵喵 · 截图辅助工具 —— 本地服务
//
// 职责:
// 1. 给浏览器提供一个控制面板页面
// 2. 通过 CDP 把面板上的操作转成游戏里的 JavaScript
// 3. 管存档备份 / 恢复、沙盒副本
//
// 安全:
// - 只监听 127.0.0.1,同一个 WiFi 下的别人连不上
// - 不改程序和素材;明确选择后可保存/还原存档,复制沙盒。
const http = require('http');
const fs = require('fs');
const path = require('path');
const { CdpClient } = require('./lib/cdp.js');
const { OPS } = require('./lib/ops.js');
const { storyPosition } = require('./lib/story-position');
const { loadAll } = require('./lib/data.js');
const { StoryCache } = require('./lib/story-cache');
const SAFETY = require('./lib/safety');
const FILES = require('./lib/files');
const { assertGamesStopped } = require('./lib/processes');
// ---------- 路径与配置 ----------
const TOOL_DIR = __dirname;
const AITEMP_DIR = path.resolve(TOOL_DIR, '..'); // aitemp/
const GAME_DIR = path.resolve(AITEMP_DIR, '..'); // 游戏根目录
const WEB_DIR = path.join(TOOL_DIR, 'web');
const BACKUP_DIR = path.join(AITEMP_DIR, 'backups');
const CONFIG_FILE = path.join(TOOL_DIR, 'config.json');
// 沙盒默认位置:和游戏同一个盘的根目录下。
// ⚠️ 不要写死具体盘符 —— 别人的游戏不一定装在 L 盘。
// 放在盘根是为了**避开 Steam 库**(放库里 Steam 会扫到,云同步也可能够得着)。
const DEFAULT_SANDBOX = path.join(path.parse(GAME_DIR).root, 'Nyaruru_shots');
const DEFAULTS = {
cdpPort: 9223, // 沙盒实例的调试端口
sandboxDir: DEFAULT_SANDBOX,
webPort: 8787,
};
function loadConfig() { return SAFETY.readConfig(CONFIG_FILE, DEFAULTS, GAME_DIR); }
const CONFIG = loadConfig();
function classifyGameDir(dir) {
if (!dir) return 'unknown';
try {
if (SAFETY.samePath(dir, GAME_DIR)) return 'original';
if (SAFETY.samePath(dir, CONFIG.sandboxDir)) return 'sandbox';
} catch { return 'unknown'; }
return 'other';
}
/** 校验并写回 config.json。只接受已知字段,避免前端传进来的杂项污染配置 */
function saveConfig(patch) {
if (sandboxJob.running) throw new Error('沙盒复制期间不能修改配置');
const allowed = Object.fromEntries(Object.entries(patch).filter(([k]) => ['cdpPort', 'webPort', 'sandboxDir'].includes(k)));
const next = SAFETY.validateConfig({ ...CONFIG, ...allowed }, GAME_DIR);
// 面板端口修改要重启,因此也不能让 CDP 占用当前正在监听的旧端口。
if (server?.listening && next.cdpPort === server.address().port) throw new Error('调试端口与当前正在使用的面板端口冲突,请先重启面板');
const temp = CONFIG_FILE + '.tmp';
fs.writeFileSync(temp, JSON.stringify(next, null, 2), 'utf8');
fs.renameSync(temp, CONFIG_FILE);
const portChanged = next.cdpPort !== CONFIG.cdpPort;
const webPortChanged = next.webPort !== CONFIG.webPort;
Object.assign(CONFIG, next);
if (portChanged) { cdp.close(); cdp.port = CONFIG.cdpPort; erasedCache.clear(); storyCache.reset(); }
return { config: CONFIG, cdpReconnected: portChanged, webPortNeedsRestart: webPortChanged };
}
// ---------- 静态数据(启动时载入一次)----------
let DATA;
try {
DATA = loadAll(AITEMP_DIR);
console.log(`[数据] 开关 ${DATA.stats.switches} · 变量 ${DATA.stats.variables} · 地图 ${DATA.stats.maps}`);
console.log(`[数据] 触发点 ${DATA.stats.triggersUnique} 条(可跳转 ${DATA.stats.triggersActionable} 条)· 常用开关 ${DATA.stats.commonSwitches} 个`);
} catch (e) {
console.error('[数据] 载入失败:', e.message);
console.error(' 请确认 aitemp/out/triggers.csv 与 aitemp/unpacked/data/ 存在。');
process.exit(1);
}
const cdp = new CdpClient(CONFIG.cdpPort);
const storyCache = new StoryCache(cdp, OPS, DATA.triggers);
// "mapId:eventId" → 该事件是否被游戏自己抹除(_erased)。
// 每次只保留当前地图扫描结果,避免切换存档后沿用旧标记。
const erasedCache = new Map();
// ---------- 存档备份 ----------
const backupSaves = (dir, label) => FILES.backupSaves(BACKUP_DIR, dir, label);
const listBackups = () => FILES.listBackups(BACKUP_DIR);
let sandboxJob = { running: false, done: false, error: null, message: '', startedAt: 0 };
function sandboxExists() { return FILES.sandboxStatus(GAME_DIR, CONFIG.sandboxDir, AITEMP_DIR).ready; }
function createSandbox() {
if (sandboxJob.running) throw new Error('已有拷贝任务在进行中');
const dest = CONFIG.sandboxDir;
const promise = FILES.copySandbox(GAME_DIR, dest, AITEMP_DIR);
sandboxJob = { running: true, done: false, error: null, message: '正在拷贝并验证…', startedAt: Date.now(), dest };
promise.then(() => { sandboxJob = { ...sandboxJob, running: false, done: true, message: '拷贝及验证完成' }; }, e => {
sandboxJob = { ...sandboxJob, running: false, done: false, error: e.message, message: '拷贝失败,不能启动该副本' };
});
return { started: true, dest };
}
function targetDir(body) {
if (!['original', 'sandbox'].includes(body.target)) throw new Error('必须明确选择原版或沙盒目标');
return body.target === 'sandbox' ? CONFIG.sandboxDir : GAME_DIR;
}
let operationTail = Promise.resolve();
const offlineActions = new Set(['/api/config', '/api/backup', '/api/restore-backup', '/api/sandbox', '/api/shutdown', '/api/story-text']);
const getRoutes = new Set(['/api/trainer', '/api/status', '/api/snapshot', '/api/maps', '/api/switches', '/api/config', '/api/ground', '/api/events/lost', '/api/events', '/api/triggers', '/api/backups', '/api/sandbox/status', '/api/health', '/api/story-text']);
async function identity() {
const r = await cdp.evalJson(OPS.selfPath());
if (!r?.ok) throw new Error(r?.error || '无法识别游戏实例');
return { ...r, dir: r.gameDir, kind: classifyGameDir(r.gameDir), context: `${cdp.generation}:${r.mapToken}` };
}
function guarded(script, token) {
return `(async()=>{ const i=JSON.parse(await ${OPS.selfPath()}); if(i.mapToken!==${JSON.stringify(token)}) return JSON.stringify({ok:false,error:'地图或存档已经变化,请刷新后重试'}); return await ${script}; })()`;
}
// ---------- 工具函数 ----------
function readBody(req) {
return new Promise((resolve, reject) => {
let buf = '';
req.on('data', c => { buf += c; if (buf.length > 1e6) req.destroy(); });
req.on('end', () => { try { resolve(buf ? JSON.parse(buf) : {}); } catch { reject(new Error('请求 JSON 格式错误')); } });
req.on('error', reject);
req.on('aborted', () => reject(new Error('请求已取消')));
});
}
function sendJson(res, obj, code = 200) {
const body = JSON.stringify(obj);
res.writeHead(code, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-store' });
res.end(body);
}
const MIME = { '.html': 'text/html; charset=utf-8', '.js': 'text/javascript; charset=utf-8', '.css': 'text/css; charset=utf-8', '.png': 'image/png', '.ico': 'image/x-icon' };
function serveStatic(res, urlPath) {
const rel = urlPath === '/' ? 'index.html' : urlPath.replace(/^\/+/, '');
const file = path.join(WEB_DIR, rel);
// 防止 ../ 穿越到 web 目录之外
if (!SAFETY.contains(WEB_DIR, file)) { res.writeHead(403); res.end('forbidden'); return; }
if (!fs.existsSync(file) || !fs.statSync(file).isFile()) { res.writeHead(404); res.end('not found'); return; }
res.writeHead(200, { 'Content-Type': MIME[path.extname(file)] || 'application/octet-stream', 'Cache-Control': 'no-store' });
fs.createReadStream(file).pipe(res);
}
// ---------- 路由 ----------
async function handleApi(req, res, urlPath, query) {
if (req.method !== 'GET' && req.method !== 'POST') return sendJson(res, { ok: false, error: '不支持的请求方法' }, 405);
if (req.method === 'GET' && !getRoutes.has(urlPath)) return sendJson(res, { ok: false, error: '修改操作必须使用 POST' }, 405);
if (req.method === 'POST' && req.headers.origin && req.headers.origin !== `http://${req.headers.host}`) return sendJson(res, { ok: false, error: '拒绝跨站修改请求' }, 403);
const body = req.method === 'POST' ? await readBody(req) : {};
if (req.method === 'POST') {
const task = operationTail.then(() => executeApi(req, res, urlPath, body));
operationTail = task.catch(() => {});
return task;
}
return executeApi(req, res, urlPath, body);
}
async function executeApi(req, res, urlPath, body) {
let current = null;
if (req.method === 'POST' && !offlineActions.has(urlPath)) {
current = await identity();
if (!['sandbox', 'original'].includes(current.kind)) throw new Error('无法确认游戏身份,停止修改操作');
if (!body.context || body.context !== current.context) throw new Error('连接、地图或存档已变化,请刷新后重试');
}
const game = async script => {
if (current && current.context.split(':')[0] !== String(cdp.generation)) throw new Error('连接已变化,操作已取消');
return cdp.evalJson(current ? guarded(script, current.mapToken) : script);
};
switch (urlPath) {
case '/api/shutdown': {
if (sandboxJob.running) throw new Error('沙盒仍在复制,请等待任务结束再停止面板');
sendJson(res, { ok: true });
setTimeout(() => { cdp.close(); server.close(() => { if (require.main === module) process.exit(0); }); }, 100);
return;
}
case '/api/health': return sendJson(res, { ok: true, toolDir: TOOL_DIR, version: 2, config: CONFIG });
// --- 连接状态 ---
case '/api/status': {
const alive = await cdp.isAlive();
// 检测到调试端口就顺手建立会话(首次之后会复用,开销很小),
// 这样面板一打开就能显示"已连接",而不是等到第一次操作
let connected = false;
if (alive) {
try { await cdp.connect(); connected = !!cdp.sessionId; } catch { connected = false; }
}
// 顺手问一句:游戏窗口自己是从哪个目录加载的?
// 面板据此显示"当前连接:沙盒 / 原版",把"以为在沙盒、其实改了原版"这种
// 误用摆在明面上(见 复查与隐患.md 坑 5)。
let gameSelf = null;
if (connected) { try { gameSelf = await identity(); } catch { connected = false; } }
if (!connected) {
erasedCache.clear(); cdp.close(); storyCache.reset();
} else { void storyCache.ensure().catch(() => {}); }
const storyText = storyCache.status();
return sendJson(res, {
ok: true,
gameRunning: alive,
connected,
cdpPort: CONFIG.cdpPort,
gameDir: GAME_DIR,
sandboxDir: CONFIG.sandboxDir,
sandboxExists: sandboxExists(),
sandboxJob,
gameSelf,
stats: { ...DATA.stats, storyLoaded: storyText.count, triggersWithLine: storyText.triggersWithLine },
dataMode: 'runtime', storyText,
context: gameSelf?.context || null,
});
}
// --- 游戏状态快照 ---
case '/api/trainer': {
if (req.method === 'GET') current = await identity();
const r = await game(OPS.trainer(req.method === 'POST' ? body : null));
return sendJson(res, { ...r, context: current.context });
}
case '/api/snapshot': {
const snap = await game(OPS.snapshot());
return sendJson(res, snap);
}
// --- 地图列表 ---
case '/api/maps':
return sendJson(res, { ok: true, maps: DATA.maps });
// --- 开关 ---
case '/api/switches': {
let values = {};
try { values = (await game(OPS.readSwitches())).values || {}; } catch { /* 没连上就只给名字 */ }
const common = new Set(DATA.commonSwitchIds);
return sendJson(res, {
ok: true,
switches: DATA.switches.map(s => ({ ...s, common: common.has(s.id) })),
values,
connected: Object.keys(values).length > 0,
});
}
case '/api/switch': {
const r = await game(OPS.setSwitch(body.id, body.value));
return sendJson(res, r);
}
// 批量设置开关("一键前往"用:一次把该对话需要的条件全部打开)
case '/api/switches/set': {
const pairs = Array.isArray(body.pairs) ? body.pairs : [];
if (!pairs.length) return sendJson(res, { ok: true, applied: 0 });
return sendJson(res, await game(OPS.setSwitches(pairs)));
}
// --- 传送 ---
// body.float 默认 true:传送后进入"悬浮安全模式"(暂停重力 + 穿墙),
// 避免落进坑里触发游戏的坠落复位。详见 ops.js 里 teleport 的注释。
case '/api/teleport': {
const r = await game(OPS.teleport(body.x, body.y, {
float: body.float !== false,
// mapId 不传或与当前地图相同 → 地图内定位;
// 不同 → 走 reserveTransfer 跨地图(见 ops.js 的 teleport 注释)
mapId: body.mapId ?? null,
}));
return sendJson(res, r);
}
// --- 直接播放一段剧情序列 ---
// 绕开地图事件与开关条件,用于通关存档上复现"错过就没了"的对话
case '/api/story/start': {
const position = storyPosition(body);
const tp = await game(OPS.teleport(position.x, position.y, { mapId: body.mapId, story: body }));
if (!tp.ok) return sendJson(res, tp);
const next = await identity();
if (next.context.split(':')[0] !== current.context.split(':')[0] || !SAFETY.samePath(next.dir, current.dir)) throw new Error('传送期间连接已变化');
current = next;
const r = await game(body.mode === 'scene' ? OPS.runStoryScene(body.storyId, body.eventId, body.pageIndex) : OPS.playStory(body.storyId));
r.positionNote = tp.positionNote;
// 传送及补角色会临时开启悬浮;过场准备完成后恢复安全落地。
// 放在 runStoryScene 之后,避免其避让角色逻辑再次开启悬浮。
if (r.ok && body.mode === 'scene') {
r.landing = await game(OPS.land());
if (!r.landing.ok) r.landingWarning = '当前落点未能自动落地:' + r.landing.error;
else if (r.landing.warning) r.landingWarning = r.landing.warning;
}
return sendJson(res, r);
}
case '/api/story/goto': {
// 验证所有参数后才修改开关,并把开关及传送放在同一排队任务中。
const position = storyPosition(body);
const teleport = OPS.teleport(position.x, position.y, { mapId: body.mapId, story: body });
const pairs = Array.isArray(body.pairs) ? body.pairs : [];
if (pairs.some(p => !Array.isArray(p) || !DATA.switches.some(s => s.id === p[0]) || typeof p[1] !== 'boolean')) throw new Error('开关参数无效');
if (pairs.length) {
const r = await game(OPS.setSwitches(pairs));
if (!r.ok) return sendJson(res, r);
}
return sendJson(res, await game(teleport));
}
case '/api/story/play':
return sendJson(res, await game(OPS.playStory(body.storyId)));
// --- 运行整段过场(含 NPC 站位与演出),而不是只念台词 ---
case '/api/story/scene':
return sendJson(res, await game(OPS.runStoryScene(body.storyId)));
// --- 关掉当前的消息窗口(截完图收尾用)---
case '/api/story/close': return sendJson(res, await game(OPS.closeMessage()));
// --- 莉莉娅显示 / 隐藏 ---
case '/api/lily': return sendJson(res, await game(OPS.setLily(body.show !== false)));
// --- 拍照辅助:隐藏 / 显示 对话框、立绘、HUD ---
// 只藏不关,随时能显示回来(要"真的关掉对话"请用 /api/story/close)
case '/api/ui-hidden':
return sendJson(res, await game(OPS.setUiHidden({
message: typeof body.message === 'boolean' ? body.message : null,
artwork: typeof body.artwork === 'boolean' ? body.artwork : null,
hud: typeof body.hud === 'boolean' ? body.hud : null,
})));
// --- 落地:从悬浮状态站到实地上(会先探测脚下是否安全)---
case '/api/land': return sendJson(res, await game(OPS.land()));
// --- 探测脚下地形("落地"按钮的预检,也可单独用)---
case '/api/ground': return sendJson(res, await game(OPS.probeGround()));
// --- 配置 ---
case '/api/config': {
if (req.method === 'POST') {
try {
const r = saveConfig(body);
return sendJson(res, { ok: true, ...r, defaults: DEFAULTS });
} catch (e) {
return sendJson(res, { ok: false, error: String(e.message) }, 400);
}
}
return sendJson(res, { ok: true, config: CONFIG, defaults: DEFAULTS, configFile: CONFIG_FILE });
}
// --- 作弊开关 ---
case '/api/gravity': return sendJson(res, await game(OPS.setGravity(!!body.on)));
case '/api/invincible': return sendJson(res, await game(OPS.setInvincible(!!body.on)));
case '/api/noclip': return sendJson(res, await game(OPS.setNoclip(!!body.on)));
case '/api/restore': return sendJson(res, await game(OPS.restoreAll()));
// --- 场景还原(摆拍):扫描本图丢失的角色 → 强行切页让它们出现 ---
// 静态摆拍与撤销由 photo-state 管理;自动和手动存档照常,仅提示风险。
case '/api/events/lost': {
const before = await identity();
const r = await cdp.evalJson(guarded(OPS.scanLostEvents(), before.mapToken));
return sendJson(res, { ...r, context: before.context });
}
case '/api/events/force-page':
return sendJson(res, await game(OPS.forcePage(body.eventId, body.page)));
// 取消本图所有"钉住"的页号,恢复游戏自己的选页
case '/api/events/unpin':
return sendJson(res, await game(OPS.unpinPages()));
case '/api/events/restore-cast':
// includeHidden=false(默认)只恢复"被抹除"的,那些是明确的该在不在;
// true 才连"游戏有意隐藏"的一起拉出来 —— 会凭空多出人物,界面上要警告
return sendJson(res, await game(OPS.restoreLostCast({
includeHidden: body.includeHidden === true,
})));
// --- 存"拍照专用档" ---
// ⚠️ 会覆盖该槽位原有进度,所以这里先自动备份整个存档目录再存
case '/api/save-photo': {
// 先在服务端做个粗校验,避免参数写错时白备份一次存档目录
// (真正的合法性由游戏侧按 DataManager.maxSavefiles() 判断)
const slot = Number(body.slot);
if (!Number.isInteger(slot) || slot < 1 || slot > 23) {
return sendJson(res, { ok: false, error: `槽位必须是 1~23 之间的整数(0 是自动存档槽,不能存)` }, 400);
}
const target = targetDir(body);
if (current.kind !== body.target || !SAFETY.samePath(current.dir, target) || !current.saveDir || !SAFETY.samePath(current.saveDir, path.join(target, 'save'))) throw new Error('实际连接的游戏或存档目录与所选目标不一致,未保存');
const backup = backupSaves(target, 'presave');
const r = await game(OPS.savePhotoSlot(slot));
return sendJson(res, { ...r, target: current.saveDir, safetyBackup: backup.name });
}
// --- 事件列表(当前地图)---
// 把事件页里 call_story 的故事序号翻译成台词,这样列表上显示的是
// 「台词」— 说话人 而不是 EV058 这种内部编号(见开发文档第 6 节)
case '/api/events': {
await storyCache.ensure();
const before = await identity();
const r = await cdp.evalJson(guarded(OPS.listEvents(), before.mapToken));
r.context = before.context;
if (r && r.ok) {
for (const ev of r.events) {
const lines = (ev.storyIds || [])
.map(id => ({ id, ...(storyCache.get(id) || {}) }))
.filter(s => s.first);
ev.lines = lines;
// 有剧情的事件优先展示,UI 也据此排序
ev.hasStory = (ev.storyIds || []).length > 0;
}
}
return sendJson(res, r);
}
// --- 剧情触发点 ---
// 顺便抓一次**当前地图**的"抹除状态"并缓存(开发文档第 6 节):
// 被游戏自己抹除的事件页号钉死在 -1,走过去也触发不了,
// 只标记当前地图的本次扫描,不跨地图或存档保留旧标记。
case '/api/story-text': {
await storyCache.ensure({ force: body.refresh === true });
return sendJson(res, { ok: true, ...storyCache.status() });
}
case '/api/triggers': {
await storyCache.ensure();
erasedCache.clear();
let scannedMap = null;
if (await cdp.isAlive()) {
try {
const ev = await game(OPS.listEvents());
if (ev && ev.ok && ev.mapId) {
scannedMap = ev.mapId;
for (const e of ev.events) {
erasedCache.set(`${ev.mapId}:${e.id}`, !!e.erased);
}
}
} catch { /* 没连上就只给静态数据 */ }
}
const triggers = DATA.triggers.map(t => {
const key = (t.mapId !== null && t.eventId !== '') ? `${t.mapId}:${t.eventId}` : null;
const known = key !== null && erasedCache.has(key);
const line = storyCache.get(t.storyId);
return { ...t, triggerX: t.x, triggerY: t.y, ...storyPosition(t), line: line?.first || '', speaker: line?.speaker || '',
lineCount: line?.count || 0, lines: line?.lines || [], searchText: line?.searchText || '',
erased: known ? erasedCache.get(key) : null };
});
return sendJson(res, { ok: true, triggers, scannedMap, knownErased: erasedCache.size, storyText: storyCache.status() });
}
// --- 存档备份 ---
case '/api/backups':
return sendJson(res, { ok: true, backups: listBackups(), backupDir: BACKUP_DIR });
case '/api/backup': {
const target = targetDir(body);
const label = body.target;
return sendJson(res, { ok: true, ...backupSaves(target, label) });
}
case '/api/restore-backup': {
if (!body.confirm) return sendJson(res, { ok: false, error: '需要确认(会覆盖当前存档)' }, 400);
const target = targetDir(body);
await assertGamesStopped();
return sendJson(res, { ok: true, ...FILES.restoreBackup(BACKUP_DIR, body.name, target) });
}
// --- 沙盒 ---
case '/api/sandbox': return sendJson(res, { ok: true, ...createSandbox() });
case '/api/sandbox/status': return sendJson(res, { ok: true, ...sandboxJob, exists: sandboxExists() });
default:
return sendJson(res, { ok: false, error: '未知接口: ' + urlPath }, 404);
}
}
const server = http.createServer(async (req, res) => {
try {
const u = new URL(req.url, `http://127.0.0.1:${CONFIG.webPort}`);
if (u.pathname.startsWith('/api/')) await handleApi(req, res, u.pathname, u.searchParams);
else serveStatic(res, u.pathname);
} catch (e) {
sendJson(res, { ok: false, error: String(e && e.message || e) }, 500);
}
});
// 只监听回环地址 —— 局域网内的其他人访问不到
if (require.main === module) server.listen(CONFIG.webPort, '127.0.0.1', async () => {
fs.writeFileSync(path.join(TOOL_DIR, '.server-runtime.json'), JSON.stringify({ port: server.address().port, pid: process.pid }));
console.log('');
console.log(' 咸鱼喵喵 · 截图辅助工具');
console.log(' ────────────────────────────────────────');
console.log(` 控制面板: http://127.0.0.1:${CONFIG.webPort}`);
console.log(` 游戏目录: ${GAME_DIR}`);
console.log(` 沙盒目录: ${CONFIG.sandboxDir} ${sandboxExists() ? '(已存在)' : '(未创建)'}`);
console.log(` 调试端口: ${CONFIG.cdpPort}`);
const alive = await cdp.isAlive();
console.log(` 游戏连接: ${alive ? '已检测到调试端口' : '未检测到(请先启动游戏)'}`);
console.log(' ────────────────────────────────────────');
console.log(' 按 Ctrl+C 退出');
console.log('');
});
// 退出时主动断开 CDP,不给游戏留悬挂连接
if (require.main === module) process.on('SIGINT', () => {
console.log('\n正在退出…');
cdp.close();
server.close(() => process.exit(0));
setTimeout(() => process.exit(0), 1000);
});
module.exports = { server, cdp, CONFIG, saveConfig, handleApi, executeApi, identity, storyCache };
+1046
View File
File diff suppressed because it is too large Load Diff
+335
View File
@@ -0,0 +1,335 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>咸鱼喵喵 · 截图辅助工具</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="topsticky">
<header class="topbar">
<div class="brand">
<span class="brand-name">咸鱼喵喵 · 截图辅助工具</span>
<span class="brand-sub">粉丝向 · 仅供个人截图与内容创作</span>
</div>
<div class="status-wrap">
<span id="connDot" class="dot"></span>
<span id="connText">正在检测…</span>
</div>
</header>
<!-- 游戏状态条 -->
<section class="statusbar">
<div class="stat"><label>地图</label><b id="st-map">—</b></div>
<div class="stat"><label>坐标</label><b id="st-pos">—</b></div>
<div class="stat"><label>血量</label><b id="st-hp">—</b></div>
<div class="stat"><label>已开开关</label><b id="st-sw">—</b></div>
<div class="stat"><label>重力</label><b id="st-grav">—</b></div>
<div class="stat"><label>无敌</label><b id="st-inv">—</b></div>
<!-- 当前连的是沙盒还是原版。连到原版时会变红 —— 那时任何操作都在动正式存档 -->
<div class="stat game-src" id="st-src-wrap"><label>当前连接</label><b id="st-src">—</b></div>
</section>
<!-- 常驻快捷开关:不放在二级页面里,任何标签页下都能直接点 -->
<section class="quickbar">
<span class="qb-label">状态</span>
<button class="chip" id="q-gravity" title="高亮 = 重力正常;点一下关掉重力,角色会悬空">重力</button>
<button class="chip" id="q-invincible" title="高亮 = 无敌中(不会掉血)">无敌</button>
<button class="chip" id="q-noclip" title="高亮 = 穿墙中(无视碰撞体)">穿墙</button>
<button class="chip on" id="q-lily" title="高亮 = 莉莉娅在画面里;点一下把她藏起来">莉莉娅</button>
<span class="qb-sep"></span>
<span class="qb-label">拍照</span>
<button class="chip on" id="q-msg" title="高亮 = 对话框显示中;点一下藏起来拍干净的场景(只是藏,随时能显示回来)">对话框</button>
<button class="chip on" id="q-art" title="高亮 = 立绘显示中">立绘</button>
<button class="chip on" id="q-hud" title="高亮 = 游戏界面(血条、小地图等)显示中">游戏界面</button>
<span class="qb-sep"></span>
<button class="chip danger" id="q-restore" title="恢复重力、碰撞、无敌,撤销摆拍并解除数值锁定(已修改的数值和物品不回退)">全部还原</button>
</section>
</div>
<div class="note" id="photo-state" role="status"></div>
<nav class="tabs">
<button class="tab active" data-panel="teleport">传送</button>
<button class="tab" data-panel="story">对话剧情</button>
<button class="tab" data-panel="trainer">角色与背包</button>
<button class="tab" data-panel="switches">开关</button>
<button class="tab" data-panel="saves">存档与沙盒</button>
<button class="tab" data-panel="settings">设置</button>
</nav>
<main>
<section class="panel" id="panel-trainer">
<div class="card">
<h2>金币、生命与能量</h2>
<div class="row"><span id="trainer-role">请先连接游戏并进入地图</span><button id="trainer-refresh">刷新数值与背包</button></div>
<p class="hint">作用于当前操作的角色,喵露露/莉莉娅切换形态后仍有效。输入数值后点「设值」或「设值并锁定」;锁定后不随消耗或拾取变化。修改当前值,不改变最大值。</p>
<div id="trainer-stats" class="trainer-stats"></div>
<p class="hint">数值锁定只在本次游戏中有效;读档、新游戏或面板失联超过 2 分钟自动解除。「全部还原」也会解除锁定,已修改的数值与物品不回退。</p>
</div>
<div class="card">
<h2>背包物品</h2>
<p class="hint">直接修改当前背包,游戏正常存档时会保存。移除已装备的饰品/宝石会同时卸下;移除当前武器会换到另一件已有武器。新增宝石按游戏规则自动启用。</p>
<div class="row">
<input id="trainer-search" type="search" placeholder="搜索物品名称、描述或编号" aria-label="搜索背包物品">
<select id="trainer-category" aria-label="物品分类"><option value="">全部分类</option><option value="consumables">消耗品</option><option value="weapons">武器</option><option value="stones">宝石</option><option value="ornaments">饰品</option><option value="special">特殊材料</option></select>
<label><input id="trainer-owned" type="checkbox">只看已拥有</label>
<label><input id="trainer-overcap" type="checkbox">允许超过消耗品携带上限</label>
</div>
<div id="trainer-items" class="list tall"><div class="empty">连接后读取背包</div></div>
</div>
</section>
<!-- ========== 传送 ========== -->
<section class="panel active" id="panel-teleport">
<div class="card">
<h2>坐标传送</h2>
<p class="hint">
输入目标格子的横纵坐标。<b>坐标超出地图范围会被自动夹到边界。</b>
</p>
<div class="note">
<b>传送默认进入「悬浮」状态</b>(暂停重力 + 穿墙)。<br>
这是为了避开游戏的<b>坠落复位</b>机制 —— 直接落到坑洞地形上,游戏会判定你掉下去了,
播掉落音效并把你弹回"上次站立的位置",如果这个记录还是上一张地图的,人就会直接消失。<br>
想站到地上走动时,点下面的<b>「落地」</b>(会先探测脚下安不安全)。
</div>
<div class="note warn-note">
⚠️ <b>悬浮时别按跳跃键</b> —— 跳跃给了向上的速度,而重力是关掉的,
<b>没有任何力把它拉回来,人会一直往上飘</b>。<br>
想恢复正常走动:点 <b>「落地」</b>,或顶部 <b>「全部还原」</b>。
</div>
<div class="row mt">
<label>X <input type="number" id="tp-x" min="0" step="1" value="0"></label>
<label>Y <input type="number" id="tp-y" min="0" step="1" value="0"></label>
<button class="primary" id="tp-go">传送(悬浮)</button>
<button id="tp-here">填入当前坐标</button>
<button id="tp-land">落地</button>
</div>
<div class="row mt">
<label>微调</label>
<button data-nudge="-1,0">←</button>
<button data-nudge="1,0">→</button>
<button data-nudge="0,-1">↑</button>
<button data-nudge="0,1">↓</button>
<span class="pill" id="tp-state">—</span>
</div>
</div>
<div class="card">
<h2>本图事件</h2>
<p class="hint">
默认只列出<b>带剧情的事件</b>(显示台词),也就是截图真正要用的那些。
金币、平台、装饰这类走「显示全部事件」。
</p>
<div class="row">
<button id="ev-load">读取本图事件</button>
<input type="search" id="ev-filter" placeholder="按台词 / 说话人 / 立绘名筛选…">
<label class="chk"><input type="checkbox" id="ev-all"> 显示全部事件</label>
</div>
<div class="list" id="ev-list"><div class="empty">点「读取本图事件」加载</div></div>
</div>
<div class="card warn-card">
<h2>场景还原(摆拍)</h2>
<p class="hint">
找出本图<b>本该可见却没出现</b>的角色,强行让它们出现。
用于「对话框在说话、画面里却没人」的情况。
</p>
<div class="note">
<b>⚠️ 这是摆拍,不是把游戏改回当时的样子。</b><br>
· 被游戏标记为「已抹除」的事件强行拉出来,它<b>不会执行任何指令</b>,
只是一个站着的立绘;站位也不一定和原作一致。<br>
· 摆拍会固定角色,自动和手动存档照常。不推荐摆拍时保存:读档后状态可能无法完整恢复。完成后可点<b>「撤销场景还原」</b>恢复原来的事件状态。
切图、读档或面板失联两分钟也会撤销摆拍。<br>
· 如果这条对话有「运行过场」可用,<b>优先用那个</b>——那个是真的在重现演出。
</div>
<div class="row">
<button id="lost-scan">扫描本图角色</button>
<button class="primary" id="lost-restore-all">恢复被抹除的</button>
<button id="lost-restore-hidden">连同游戏隐藏的一起</button>
<button id="lost-unpin">撤销场景还原</button>
</div>
<div class="row mt">
<span class="pill" id="lost-hint">还没扫描</span>
</div>
<div class="list" id="lost-list"><div class="empty">点「扫描本图角色」看看本图现在有谁、缺谁</div></div>
</div>
</section>
<!-- ========== 对话跳转点 ========== -->
<section class="panel" id="panel-story">
<div class="card">
<h2>对话剧情</h2>
<p class="hint">
连接后自动读取台词,支持全文搜索。<br>从游戏数据里解析出的 <b id="story-count">—</b> 条剧情触发点。
</p>
<div class="note">
<b>三种复现方式,优先试「运行过场」</b><br>
· <b>运行过场</b> —— 执行含这段对话的<b>整个事件页</b>。
NPC 站位、演出、对白全按原样走,<b>画面最接近原作</b>。通关存档也能用。<br>
&nbsp;&nbsp;&nbsp;注意:一整段过场会从头播,可能包含好几段对话,一路截图即可。<br>
· <b>只播台词</b> —— 只调那一段对白,跳过节目前的演出。快,但
<b>场景里的 NPC 可能不在场</b>(那些角色是靠前面的指令摆出来的)。<br>
· <b>前往</b> —— 打开所需开关 + 传送,你自己走过去。存档没通关时场景最自然。
</div>
<p class="hint" id="story-text-hint"></p>
<div class="row">
<input type="search" id="story-filter" placeholder="全文搜索:台词 / 说话人 / 地图 / 开关名…">
<label class="chk"><input type="checkbox" id="story-only-actionable" checked> 只看可跳转的</label>
<label class="chk"><input type="checkbox" id="story-need-switch"> 只看需要开关的</label>
</div>
<div class="row mt">
<button id="story-load-text">重新读取台词</button>
<button id="story-close-msg">关闭对话窗口</button>
<span class="pill">截完图用它收尾</span>
</div>
<div class="list tall" id="story-list"><div class="empty">正在载入…</div></div>
</div>
</section>
<!-- ========== 开关 ========== -->
<section class="panel" id="panel-switches">
<div class="card">
<h2>开关</h2>
<p class="hint">
默认只显示<b>常用开关</b>——即"隐藏对话触发条件里真正会用到的那 114 个",
比翻全部 360 个高效得多。需要时可以展开全部。
</p>
<div class="row">
<input type="search" id="sw-filter" placeholder="按开关名或编号搜索…">
<button id="sw-toggle-all">展开全部 360 个</button>
<button id="sw-reload">刷新状态</button>
</div>
<div class="row mt">
<span class="pill" id="sw-mode">当前:常用开关</span>
</div>
<div class="list tall" id="sw-list"><div class="empty">正在载入…</div></div>
</div>
</section>
<!-- ========== 存档与沙盒 ========== -->
<section class="panel" id="panel-saves">
<div class="card warn-card">
<h2>⚠️ 用之前先读这段</h2>
<ul class="warn-list">
<li>本工具会改游戏<b>运行时状态</b>(坐标、开关、物理),<b>不改游戏程序和素材;保存、还原会写入明确选定的存档目录</b>。</li>
<li>作弊状态下游戏可能自动存盘,落到 <code>file0</code>(自动存档槽)。</li>
<li>本游戏启用了 <b>Steam 云存档</b>。直接在原版游戏上折腾,被污染的存档可能被同步上去且追不回来。</li>
<li><b>所以推荐用沙盒:把游戏整体拷一份,在副本里折腾。</b>副本不在 Steam 库里,云同步够不着。</li>
</ul>
</div>
<div class="card">
<h2>沙盒副本</h2>
<p class="hint">复制游戏及存档(排除工具和发布版目录),所有操作都在副本里进行。</p>
<div class="row">
<button class="primary" id="sb-create">创建沙盒副本</button>
<button id="sb-status">刷新状态</button>
</div>
<div class="note" id="sb-info">—</div>
</div>
<div class="card">
<h2>存档备份</h2>
<p class="hint">把 <code>save/</code> 整个目录复制一份存档。原版和沙盒可以分别备份。</p>
<div class="row">
<button id="bk-original">备份原版存档</button>
<button id="bk-sandbox">备份沙盒存档</button>
<button id="bk-reload">刷新列表</button>
</div>
<div class="row"><label>还原目标 <select id="bk-target"><option value="">请选择目标</option><option value="sandbox">沙盒存档</option><option value="original">原版存档</option></select></label></div>
<div class="list" id="bk-list"><div class="empty">—</div></div>
</div>
<div class="card">
<h2>存「拍照专用档」</h2>
<p class="hint">
把当前游戏状态存进一个存档槽。摆拍时也可保存,但不保证读档后完整恢复角色、UI 或对白。
工具会先自动备份整个存档目录,再让游戏自己存。
</p>
<div class="note">
<b>⚠️ 会覆盖该槽位原有的进度。</b>
你的 24 个槽位(0 是自动存档,1~23 是手动)目前<b>全部占用</b>,
没有空槽可用——所以请自己挑一个不在乎的槽。
</div>
<div class="row">
<label>存到槽位 <input type="number" id="photo-slot" min="1" max="23" step="1" value="23"></label>
<span>实际保存目录:<code id="photo-target">未连接</code></span>
<button class="danger" id="photo-save">存为拍照档</button>
</div>
</div>
<div class="card">
<h2>关于这个工具</h2>
<p class="hint">
粉丝向的截图辅助工具,用于个人复现「错过就没了」的剧情并截图。<br>
不包含、不打包任何游戏素材;不提供成就解锁功能;不修改游戏任何文件。<br>
按作者 readme 的要求,<b>请勿用本工具提取或传播游戏素材</b>。
</p>
</div>
</section>
<!-- ========== 设置 ========== -->
<section class="panel" id="panel-settings">
<div class="card">
<h2>端口与路径</h2>
<p class="hint">
改完点保存即可生效,配置文件写在 <code id="set-path">tool/config.json</code>。
</p>
<div class="form">
<label class="field">
<span>游戏调试端口</span>
<input type="number" id="set-cdpPort" min="1024" max="65535">
<em>工具靠这个端口连游戏。原版通常 9222,沙盒建议 9223,两个别撞车。</em>
</label>
<label class="field">
<span>控制面板端口</span>
<input type="number" id="set-webPort" min="1024" max="65535">
<em>浏览器打开面板用的端口。<b>改这个要重启工具才生效。</b></em>
</label>
<label class="field">
<span>沙盒副本目录</span>
<input type="text" id="set-sandboxDir">
<em>把游戏拷一份到这里。建议放在 Steam 库外面,云同步才够不着。</em>
</label>
</div>
<div class="row mt">
<button class="primary" id="set-save">保存设置</button>
<button id="set-reset">恢复默认值</button>
</div>
</div>
<div class="card">
<h2>怎么启动这个工具</h2>
<ol class="steps">
<li>双击 <code>tool\启动.bat</code></li>
<li>它会自动:检查 SDK 版 NW.js → 备份存档 → 启动游戏 → 启动本服务 → 打开浏览器</li>
<li>在游戏里<b>正常读档</b>进入地图(工具不能替你读档,见开发文档第 6 节)</li>
</ol>
<div class="note">
<b>只想启动某一部分?</b><br>
· 只起控制面板(游戏已经在跑):在这个目录执行 <code>node server.js</code><br>
· 只启动游戏:<code>nw.exe "沙盒目录" --remote-debugging-port=9223</code><br>
· 改了控制面板端口后,要关掉旧的服务窗口再重新 <code>node server.js</code>
</div>
</div>
<div class="card">
<h2>当前状态</h2>
<div class="list" id="set-info"><div class="empty">—</div></div>
</div>
</section>
</main>
<div id="toast" class="toast"></div>
<script src="app.js"></script>
</body>
</html>
+308
View File
@@ -0,0 +1,308 @@
/* 咸鱼喵喵 · 截图辅助工具 —— 控制面板样式 */
:root {
--bg: #14121a;
--bg-card: #1e1b26;
--bg-input: #2a2634;
--bg-hover: #332e40;
--border: #35303f;
--text: #e9e6f0;
--text-dim: #9d97ac;
--accent: #ff8ab8;
--accent-dk: #d96a96;
--ok: #5fd39a;
--warn: #f0b849;
--danger: #f07070;
--radius: 10px;
}
* { box-sizing: border-box; }
body {
margin: 0;
background: var(--bg);
color: var(--text);
font: 14px/1.6 "Microsoft YaHei", "PingFang SC", system-ui, sans-serif;
padding-bottom: 48px;
}
/* ---------- 顶栏 ---------- */
/* 顶部三件套(标题栏 + 状态条 + 快捷开关)整体吸顶 */
.topsticky {
position: sticky; top: 0; z-index: 50;
box-shadow: 0 4px 14px rgba(0,0,0,.35);
}
.topbar {
display: flex; align-items: center; justify-content: space-between;
flex-wrap: wrap; gap: 12px;
padding: 14px 22px;
background: linear-gradient(180deg, #241f2e, #1a1722);
border-bottom: 1px solid var(--border);
}
.brand-name { font-size: 17px; font-weight: 700; color: var(--accent); }
.brand-sub { display: block; font-size: 12px; color: var(--text-dim); font-weight: 400; }
.status-wrap { display: flex; align-items: center; gap: 8px; font-size: 13px; }
.dot {
width: 9px; height: 9px; border-radius: 50%;
background: var(--text-dim); display: inline-block;
box-shadow: 0 0 0 0 rgba(95,211,154,.6);
}
.dot.on { background: var(--ok); animation: pulse 2.4s infinite; }
.dot.off { background: var(--danger); }
@keyframes pulse {
0% { box-shadow: 0 0 0 0 rgba(95,211,154,.5); }
70% { box-shadow: 0 0 0 8px rgba(95,211,154,0); }
100% { box-shadow: 0 0 0 0 rgba(95,211,154,0); }
}
/* ---------- 状态条 ---------- */
.statusbar {
display: flex; flex-wrap: wrap; gap: 10px;
padding: 12px 22px;
background: #191623;
border-bottom: 1px solid var(--border);
}
.stat {
display: flex; align-items: baseline; gap: 7px;
background: var(--bg-card); border: 1px solid var(--border);
border-radius: 8px; padding: 5px 12px;
}
.stat label { font-size: 12px; color: var(--text-dim); }
.stat b { font-size: 14px; font-variant-numeric: tabular-nums; }
/* 「当前连接」——整行独占,连到原版时整块变红 */
.stat.game-src { flex: 1 1 100%; }
.stat.game-src b {
font-family: Consolas, monospace; font-size: 12px;
word-break: break-all;
}
.stat.game-src.sandbox b { color: var(--ok); }
.stat.game-src.original {
background: #3a2222; border-color: var(--danger);
}
.stat.game-src.original b { color: #ff9b9b; font-weight: 700; }
.stat.game-src.other b { color: var(--warn); }
/* ---------- 常驻快捷开关条 ---------- */
.quickbar {
display: flex; align-items: center; flex-wrap: wrap; gap: 6px;
padding: 9px 22px;
background: #1d1a27;
border-bottom: 1px solid var(--border);
}
.qb-label {
font-size: 12px; color: var(--text-dim);
margin-right: 2px; user-select: none;
}
.qb-sep {
width: 1px; height: 18px; background: var(--border);
margin: 0 8px;
}
/* 胶囊开关:高亮 = 这个开关是"开着/显示着"的 */
.chip {
padding: 5px 14px; font-size: 13px;
border-radius: 999px;
background: #262231; border: 1px solid var(--border);
color: var(--text-dim);
transition: background .12s, color .12s, border-color .12s;
}
.chip:hover:not(:disabled) { background: var(--bg-hover); border-color: var(--accent); color: var(--text); }
.chip.on {
background: #4a2a3c; border-color: var(--accent);
color: #ffd7e8; font-weight: 700;
}
.chip.on::before {
content: '●'; font-size: 9px; margin-right: 5px;
color: var(--accent); vertical-align: 1px;
}
.chip.danger { border-color: #7a3a3a; color: #ffc9c9; }
.chip.danger:hover { background: #6a3232; border-color: var(--danger); }
/* ---------- 标签页 ---------- */
.tabs {
display: flex; gap: 4px; flex-wrap: wrap;
padding: 14px 22px 0;
}
.tab {
background: transparent; color: var(--text-dim);
border: 1px solid transparent; border-bottom: none;
border-radius: 8px 8px 0 0;
padding: 9px 18px; cursor: pointer; font-size: 14px;
font-family: inherit;
}
.tab:hover { background: var(--bg-hover); color: var(--text); }
.tab.active {
background: var(--bg-card); color: var(--accent);
border-color: var(--border); font-weight: 700;
}
/* ---------- 面板 ---------- */
main { padding: 0 22px; }
.panel { display: none; }
.panel.active { display: block; }
.card {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 18px 20px;
margin: 16px 0;
}
.card h2 {
margin: 0 0 6px; font-size: 15px; color: var(--accent);
font-weight: 700;
}
.hint { margin: 0 0 14px; font-size: 13px; color: var(--text-dim); }
.hint b { color: var(--text); }
.note {
margin-top: 14px; padding: 10px 14px;
background: #232030; border-left: 3px solid var(--accent);
border-radius: 6px; font-size: 13px; color: var(--text-dim);
}
.note b { color: var(--text); }
/* 警告性质的提示条 */
.note.warn-note {
border-left-color: var(--warn);
background: #2b2620;
color: #e0d5c2;
}
.note.warn-note b { color: var(--warn); }
.warn-card { border-color: #5a4630; background: #241f1a; }
.warn-card h2 { color: var(--warn); }
.warn-list { margin: 0; padding-left: 20px; font-size: 13px; color: #d8cfc0; }
.warn-list li { margin: 6px 0; }
.warn-list b { color: var(--warn); }
code {
background: #2a2634; padding: 1px 6px; border-radius: 4px;
font-family: Consolas, monospace; font-size: 12px; color: var(--accent);
}
/* ---------- 控件 ---------- */
.row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.row.mt { margin-top: 12px; }
.row label { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--text-dim); }
input[type="number"], input[type="search"], input[type="text"] {
background: var(--bg-input); color: var(--text);
border: 1px solid var(--border); border-radius: 7px;
padding: 8px 11px; font: inherit; font-size: 13px;
}
input[type="number"] { width: 92px; }
input[type="search"] { flex: 1; min-width: 200px; }
input:focus { outline: none; border-color: var(--accent); }
button {
background: var(--bg-input); color: var(--text);
border: 1px solid var(--border); border-radius: 7px;
padding: 8px 15px; cursor: pointer; font: inherit; font-size: 13px;
transition: background .12s, border-color .12s;
}
button:hover:not(:disabled) { background: var(--bg-hover); border-color: var(--accent); }
button:disabled { opacity: .45; cursor: not-allowed; }
button.primary { background: var(--accent-dk); border-color: var(--accent); color: #fff; font-weight: 700; }
button.primary:hover:not(:disabled) { background: var(--accent); }
button.danger { background: #4a2626; border-color: #7a3a3a; color: #ffc9c9; }
button.danger:hover:not(:disabled) { background: #6a3232; }
.chk { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--text-dim); cursor: pointer; }
input[type="checkbox"] { accent-color: var(--accent); width: 15px; height: 15px; cursor: pointer; }
.toggles { display: flex; flex-direction: column; gap: 10px; }
.toggle {
display: flex; align-items: center; gap: 10px;
background: var(--bg-input); border: 1px solid var(--border);
border-radius: 8px; padding: 11px 15px; cursor: pointer;
font-size: 14px; transition: border-color .12s;
}
.toggle:hover { border-color: var(--accent); }
.toggle input { width: 17px; height: 17px; }
.pill {
display: inline-block; background: var(--bg-input);
border: 1px solid var(--border); border-radius: 999px;
padding: 3px 12px; font-size: 12px; color: var(--text-dim);
}
/* ---------- 设置表单 ---------- */
.form { display: flex; flex-direction: column; gap: 16px; }
.field { display: grid; grid-template-columns: 160px 1fr; gap: 6px 14px; align-items: center; }
.field > span { font-size: 13px; color: var(--text); }
.field > em {
grid-column: 2; font-style: normal;
font-size: 12px; color: var(--text-dim); line-height: 1.5;
}
.field > em b { color: var(--warn); }
.field input { width: 100%; max-width: 420px; }
.steps { margin: 0; padding-left: 22px; font-size: 13px; color: var(--text-dim); }
.steps li { margin: 7px 0; }
.steps b { color: var(--text); }
/* ---------- 列表 ---------- */
.list {
margin-top: 12px; max-height: 320px; overflow-y: auto;
border: 1px solid var(--border); border-radius: 8px;
background: #191623;
}
.list.tall { max-height: 560px; }
.empty { padding: 26px; text-align: center; color: var(--text-dim); font-size: 13px; }
.item {
display: flex; align-items: center; gap: 12px;
padding: 9px 14px; border-bottom: 1px solid #241f2e;
font-size: 13px;
}
.item:last-child { border-bottom: none; }
.item:hover { background: var(--bg-hover); }
.item .grow { flex: 1; min-width: 0; }
.item .name { color: var(--text); }
.item .meta { font-size: 12px; color: var(--text-dim); }
.item .num {
font-family: Consolas, monospace; font-size: 12px;
color: var(--text-dim); min-width: 44px;
}
.item .tag {
font-size: 11px; padding: 1px 7px; border-radius: 4px;
background: #2f2a3c; color: var(--text-dim); white-space: nowrap;
}
.item .tag.common { background: #3a2a38; color: var(--accent); }
.item .tag.ok { background: #1f3a2c; color: var(--ok); }
.item .tag.danger { background: #4a2626; color: #ff9b9b; }
/* 分类小标题行 */
.item.cat-head {
background: #221e2c; color: var(--text-dim);
font-size: 12px; font-weight: 700;
padding: 7px 14px;
position: sticky; top: 0; z-index: 2;
}
.item.cat-head.warn-head { background: #2b2420; color: var(--warn); }
.item button { padding: 4px 11px; font-size: 12px; }
/* 开关行 */
.switch-on { color: var(--ok); font-weight: 700; }
.switch-off { color: var(--text-dim); }
/* ---------- 提示条 ---------- */
.toast {
position: fixed; left: 50%; bottom: 28px; transform: translateX(-50%) translateY(20px);
background: #2a2634; border: 1px solid var(--accent);
color: var(--text); padding: 11px 22px; border-radius: 9px;
font-size: 13px; opacity: 0; pointer-events: none;
transition: opacity .2s, transform .2s; z-index: 999;
max-width: 80vw;
}
.toast.show { opacity: 1; transform: translateX(-50%) translateY(0); }
.toast.err { border-color: var(--danger); background: #3a2222; }
.toast.ok { border-color: var(--ok); background: #1f3329; }
.trainer-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 12px; margin-top: 16px; }
.trainer-stat { padding: 14px; border: 1px solid var(--border); border-radius: 8px; }
.trainer-stat .row { margin-top: 12px; flex-wrap: wrap; }
.trainer-stat input, #trainer-items input[type=number] { width: 95px; }
#trainer-items .item { flex-wrap: wrap; }
+76
View File
@@ -0,0 +1,76 @@
# 使用须知(发布版,2026-10-03 修订)
## 确认当前操作哪份游戏
看顶部“当前连接”和存档页“实际保存目录”。身份从游戏的 Node 入口及 StorageManager 存档路径读取,不依赖网页 URL。实机网页 URL 是 chrome-extension 地址。
调试端口可达不等于已连接,更不等于已进入地图。标题画面请正常读档;不要从外部直接调用 DataManager.loadGame 绕过游戏的 completeLoad 流程。
## 常见提示
| 提示或现象 | 处理 |
|---|---|
| 调试端口和面板端口相同 | 设置两个不同的端口,再启动 |
| 端口上的游戏与目标不符/无法识别 | 关闭占用该端口的游戏,或为各实例配置不同端口;不会自动放行 |
| 旧服务或旧配置占用面板端口 | 停止旧面板后再启动;本次升级前的旧服务需关闭原来的命令行窗口 |
| 副本缺失/复制未完成 | 不启动残缺副本;选择新的空目录重建。不会覆盖已有目录 |
| 地图、存档或连接已变化 | 刷新状态并重新读取本图事件/扫描角色,旧列表不能用于新地图 |
| 莉莉娅脚下不安全 | 她保持悬浮;移动到安全地面再点“落地” |
| 跨地图超时 | 工具会取消尚未完成的传送请求;确认游戏是否被菜单或演出占用,再重试 |
| 备份失败 | 不会继续启动需要备份的游戏或覆盖槽位。检查目录、磁盘空间及是否仍在写档 |
| 当前有摆拍角色,提示不推荐保存 | 读档后摆拍状态可能无法完整恢复;可自行决定继续保存,不要求先撤销 |
悬浮时按跳跃仍可能一直向上运动;关重力没有取消跳跃输入。落地会检查地形,“全部还原”会直接恢复正常物理状态,使用时应处于安全位置。
## 搜索和剧情
发布版从游戏运行时读取全文台词,全部在内存中使用,不写剧本或缓存文件。先开面板再开游戏也会自动读取;故事表未就绪时最多尝试四次、间隔至少三秒,仍失败会显示原因,可手动重新读取。断线、换实例或重连都会使旧台词失效,重连成功后自动补齐。
搜索覆盖整段台词和说话人,并显示命中句;未连接时仍可搜索地图、坐标、事件和条件。
“运行过场”包含剧情指令,可能改变游戏开关和进度。分支剧情可能跳过先前的演出;前往只自动设置普通开关,不承诺还原完整历史进度。没有任何一页提供角色形象的事件,也不能凭空生成合适 NPC。
## 场景还原与撤销
恢复的角色是固定的摆拍对象,不再自动执行原事件、移动或参与物理碰撞。清除“已抹除”状态只是临时操作;撤销会恢复修改前的字段、原有抹除状态及方法。
“被抹除”不证明这个人应该出现在当前剧情。选择哪些角色和站位仍需核对画面;不要把全部恢复后的画面当成原作的准确复现。
摆拍期间自动和手动存档照常,工具不拦截游戏自身的保存。顶部提示不推荐摆拍时保存;面板保存的原有确认框会说明风险,仍可确定继续。完成后可撤销;切图或正常读档自动撤销。面板关闭或失联超过两分钟也会撤销,恢复事件原有行为。
这次没有实现“保存并读回完整摆拍布局”。临时函数、UI 显示状态、剧情解释器不承诺跨存档复现。
## 备份与还原
- 新备份记录来源,使用唯一目录并校验每个 .rmmzsave 文件。未完成或损坏备份不列为可恢复项。
- 旧时间戳备份仍可读取,但显示来源未知。还原时必须明确选目标,不能凭备份名称猜。
- 还原前先退出游戏和 NW.js 游戏窗口,防止运行中的游戏把旧状态写回。
- 还原得到所选备份中的完整存档集合;备份没有的槽位不会继续留在当前 save 目录。
- 当前存档会先备份;原 save 目录保留为游戏目录下的 `.save-before-restore-…`,不会直接删除。
- steam_autocloud.vdf 等非存档文件保留目标目录自己的版本,不从另一份游戏的备份覆盖。
## 已知画面限制
先前记录的“切换剧情分支时角色短暂抽动”,没有足够实机证据保证所有地图均已解决;本轮不把它标成已修。相同立绘的多个事件、剧情自身的移动与刷新仍可能影响演出效果。
并非全部剧情均已验收。遇到问题请记录故事编号、地图、事件页、存档进度和使用的按钮。
## 本轮剧情显示与定位修复
#370 横排重复角色的原因是动画图整张显示,现已同步单帧裁切修复。升级后需重启面板和游戏,再刷新网页,才会加载新的游戏内 helper。
运行无形自动/并行控制事件时,会优先保留同图的安全站位,或在目标地图寻找可落地位置。找不到安全地面会停止启动剧情并提示手动定位。运行过场在准备完成后尝试落地;普通手动传送仍默认悬浮。自动选点不等于还原原作站位。
#305 的“运行过场”仍可能先播同页的 #298/#299;直接查看 #305 请用“只播台词”。
## 角色与背包、锁定
“角色与背包”页可设置并分别锁定金币、HP、SP、ZP,以及搜索、添加、移除背包物品。作用于当前操作角色,包含切换后的莉莉娅形态,不修改独立跟随的莉莉娅。金币范围 0~99999,其余不能超过当前最大值;不会改变上限。已倒下时请先在游戏里复活或读档。
消耗品默认遵循携带上限,可勾选超上限(最多 99999)。移除装备会同步卸下,移除当前武器会换到另一件已有武器,至少保留一件。铃铛容量、任务及收集进度不在修改范围内。
锁定立即阻止该数值的消耗和增加。读档、新游戏、面板失联超过两分钟或点“全部还原”会解除锁定;已修改的数值和背包不会回退,正常保存会把当前数值和物品写进存档。
本轮同时更新了摆拍人物贴地、原图待机动画和面向主角。仅对原页要求贴地的人物小范围探地,飞行角色和固定摆件不强制落地;撤销恢复原始位置和朝向。首次升级这批摆拍修复,需要重启面板和游戏后刷新网页。
+5
View File
@@ -0,0 +1,5 @@
@echo off
chcp 65001 >nul
setlocal DisableDelayedExpansion
node "%~dp0launcher.js" --stop
if errorlevel 1 pause
+33
View File
@@ -0,0 +1,33 @@
{
"version": 1,
"files": [
"tool/启动.bat",
"tool/停止面板.bat",
"tool/launcher.js",
"tool/server.js",
"tool/lib/safety.js",
"tool/lib/files.js",
"tool/lib/processes.js",
"tool/lib/cdp.js",
"tool/lib/probe-game.js",
"tool/lib/ops.js",
"tool/lib/photo-state.js",
"tool/lib/trainer.js",
"tool/lib/story-position.js",
"tool/lib/data.js",
"tool/lib/story-cache.js",
"tool/web/app.js",
"tool/web/index.html",
"tool/web/style.css",
"tool/README.md",
"tool/使用须知.md",
"tool/发布清单.json",
"out/triggers.csv",
"unpacked/data/System.json",
"unpacked/data/MapInfos.json",
"README.md",
".gitignore"
],
"optionalRuntime": "nwjs-sdk-v0.64.1-win-x64/",
"note": "本包仅含工具及必要结构索引;台词从游戏运行时读取。Node.js 和 NW.js SDK 需另行安装。"
}
+15
View File
@@ -0,0 +1,15 @@
@echo off
chcp 65001 >nul
setlocal DisableDelayedExpansion
where node >nul 2>&1
if errorlevel 1 (
echo 找不到 Node.js。请安装 Node.js 22 或更新版本后重试。
pause
exit /b 1
)
node "%~dp0launcher.js"
if errorlevel 1 (
pause
exit /b 1
)
exit /b 0
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long