From 0c56a8f747d67f5b7672d398d934ee5205ea5d58 Mon Sep 17 00:00:00 2001
From: strawberry42271 <2806566736@qq.com>
Date: Thu, 13 Mar 2025 17:24:12 +0800
Subject: [PATCH 1/7] =?UTF-8?q?=E5=BC=80=E5=9C=BA=E6=95=99=E7=A8=8B?=
 =?UTF-8?q?=E6=8A=89=E6=8B=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 project/data.js               | 57 ++++++++++++++++++-----------------
 project/floors/jiaocheng01.js | 11 ++++++-
 project/floors/jiaocheng02.js | 26 ++++++++++++++++
 3 files changed, 66 insertions(+), 28 deletions(-)

diff --git a/project/data.js b/project/data.js
index 5326837..9047933 100644
--- a/project/data.js
+++ b/project/data.js
@@ -1916,28 +1916,22 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
 		],
 		"startText": [
 			{
-				"type": "if",
-				"condition": "false",
-				"true": [
-					{
-						"type": "setText"
-					},
-					{
-						"type": "setHeroOpacity",
-						"opacity": 0
-					},
-					{
-						"type": "setCurtain",
-						"color": [
-							0,
-							0,
-							0,
-							1
-						],
-						"time": 500,
-						"keep": true
-					}
-				]
+				"type": "setText"
+			},
+			{
+				"type": "setHeroOpacity",
+				"opacity": 0
+			},
+			{
+				"type": "setCurtain",
+				"color": [
+					0,
+					0,
+					0,
+					1
+				],
+				"time": 500,
+				"keep": true
 			},
 			{
 				"type": "function",
@@ -1952,12 +1946,21 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
 				"name": "强制横屏"
 			},
 			{
-				"type": "if",
-				"condition": "false",
-				"true": [
+				"type": "insert",
+				"name": "chapter0"
+			},
+			{
+				"type": "confirm",
+				"text": "要进行教程内容吗",
+				"yes": [],
+				"no": [
 					{
-						"type": "insert",
-						"name": "chapter0"
+						"type": "changeFloor",
+						"floorId": "guangchang",
+						"loc": [
+							6,
+							10
+						]
 					}
 				]
 			}
diff --git a/project/floors/jiaocheng01.js b/project/floors/jiaocheng01.js
index 7e78739..ee12147 100644
--- a/project/floors/jiaocheng01.js
+++ b/project/floors/jiaocheng01.js
@@ -11,7 +11,16 @@ main.floors.jiaocheng01=
     "images": [],
     "ratio": 1,
     "defaultGround": "X90078",
-    "firstArrive": [],
+    "firstArrive": [
+        {
+            "type": "setHeroOpacity",
+            "opacity": 1
+        },
+        {
+            "type": "setCurtain",
+            "time": 1000
+        }
+    ],
     "eachArrive": [],
     "parallelDo": "",
     "events": {
diff --git a/project/floors/jiaocheng02.js b/project/floors/jiaocheng02.js
index 9d5616e..78b800f 100644
--- a/project/floors/jiaocheng02.js
+++ b/project/floors/jiaocheng02.js
@@ -23,6 +23,32 @@ main.floors.jiaocheng02=
         ],
         "12,0": [
             "法杖:魔攻比例10%,魔防比例0%"
+        ],
+        "6,0": [
+            {
+                "type": "setCurtain",
+                "color": [
+                    0,
+                    0,
+                    0,
+                    1
+                ],
+                "time": 1000,
+                "keep": true
+            },
+            {
+                "type": "setValue",
+                "name": "flag:__visited__",
+                "value": "{}"
+            },
+            {
+                "type": "changeFloor",
+                "floorId": "guangchang",
+                "loc": [
+                    6,
+                    10
+                ]
+            }
         ]
     },
     "changeFloor": {

From 00876fa43fc2cb7e504377e0415ed3cee49a5428 Mon Sep 17 00:00:00 2001
From: strawberry42271 <2806566736@qq.com>
Date: Sun, 16 Mar 2025 19:07:11 +0800
Subject: [PATCH 2/7] =?UTF-8?q?=E6=95=99=E5=AD=A6demo?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 _server/table/plugins.comment.js |    6 +
 project/data.js                  |    4 +-
 project/floors/jiaocheng01.js    |    4 +-
 project/floors/jiaocheng02.js    |    4 +-
 project/functions.js             |    4 +-
 project/icons.js                 |    3 +-
 project/items.js                 |   36 +-
 project/maps.js                  |    1 +
 project/materials/items.png      |  Bin 18696 -> 22527 bytes
 project/plugins.js               | 3575 ++++++++++++++++--------------
 10 files changed, 1951 insertions(+), 1686 deletions(-)

diff --git a/_server/table/plugins.comment.js b/_server/table/plugins.comment.js
index 0ea6e33..a9cb7a1 100644
--- a/_server/table/plugins.comment.js
+++ b/_server/table/plugins.comment.js
@@ -128,6 +128,12 @@ var plugins_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = {
 				"_type": "textarea",
 				"_range": "typeof(thiseval)=='string' || thiseval==null",
 				"_data": "背景音乐拼接"
+			},
+			"scrollingText": {
+				"_leaf": true,
+				"_type": "textarea",
+				"_range": "typeof(thiseval)=='string' || thiseval==null",
+				"_data": "接收&发送在线留言"
 			}
 		}
 		if (obj[key]) return obj[key];
diff --git a/project/data.js b/project/data.js
index 9047933..c8c6aef 100644
--- a/project/data.js
+++ b/project/data.js
@@ -1520,7 +1520,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
 	},
 	"firstData": {
 		"title": "秽翼的尤斯蒂娅",
-		"name": "Eustia",
+		"name": "Eustia_text",
 		"version": "鸽子窝造塔小队",
 		"floorId": "jiaocheng01",
 		"hero": {
@@ -1935,7 +1935,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
 			},
 			{
 				"type": "function",
-				"function": "function(){\ncore.getItem('book', 1);\ncore.getItem('fly', 1);\n}"
+				"function": "function(){\ncore.getItem('book', 1);\ncore.getItem('fly', 1);\ncore.getItem('postman', 1);\ncore.getItem('I369', 1);\n}"
 			},
 			{
 				"type": "insert",
diff --git a/project/floors/jiaocheng01.js b/project/floors/jiaocheng01.js
index ee12147..1c5cd0f 100644
--- a/project/floors/jiaocheng01.js
+++ b/project/floors/jiaocheng01.js
@@ -1,7 +1,7 @@
 main.floors.jiaocheng01=
 {
     "floorId": "jiaocheng01",
-    "title": "广场",
+    "title": "教程1",
     "name": "1",
     "width": 13,
     "height": 13,
@@ -70,7 +70,7 @@ main.floors.jiaocheng01=
     [129,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,129],
     [  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1]
 ],
-    "areas": "牢狱",
+    "areas": "教程",
     "bgmap": [
 
 ],
diff --git a/project/floors/jiaocheng02.js b/project/floors/jiaocheng02.js
index 78b800f..e36624e 100644
--- a/project/floors/jiaocheng02.js
+++ b/project/floors/jiaocheng02.js
@@ -1,7 +1,7 @@
 main.floors.jiaocheng02=
 {
     "floorId": "jiaocheng02",
-    "title": "广场",
+    "title": "教程2",
     "name": "1",
     "width": 13,
     "height": 13,
@@ -82,7 +82,7 @@ main.floors.jiaocheng02=
     [ 28,  1, 30,  1, 27,129,  0,204,  0, 33,  0, 23,  0],
     [  1,  1,  1,  1,  1,  1, 93,  1,  1,  1,  1,  1,  1]
 ],
-    "areas": "牢狱",
+    "areas": "教程",
     "bgmap": [
 
 ],
diff --git a/project/functions.js b/project/functions.js
index 459927d..9727b82 100644
--- a/project/functions.js
+++ b/project/functions.js
@@ -192,6 +192,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
 			core.plugin.bfs();
 		}
 	}
+	if (!core.isReplaying()) core.plugin.drawCommentSign()
 },
         "flyTo": function (toId, callback) {
 	// 楼层传送器的使用,从当前楼层飞往toId
@@ -2022,6 +2023,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
 		nowy = core.getHeroLoc("y");
 	var block = core.getBlock(nowx, nowy);
 	var hasTrigger = false;
+	core.showComment(nowx, nowy)
 	if (
 		block != null &&
 		block.event.trigger == "getItem" &&
@@ -2061,7 +2063,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
 			core.status.hero.statistics.poisonDamage += damage;
 			core.status.hero.hp -= damage;
 		}
-
+		core.showComment(nowx, nowy)
 		core.clearMap("hero");
 		if (
 			core.bigmap.width * 32 === core.bigmap.height * 32 &&
diff --git a/project/icons.js b/project/icons.js
index 73914d5..36641a7 100644
--- a/project/icons.js
+++ b/project/icons.js
@@ -326,7 +326,8 @@ var icons_4665ee12_3a1f_44a4_bea3_0fccba634dc1 =
 		"I373": 36,
 		"I374": 37,
 		"I375": 38,
-		"I396": 39
+		"I396": 39,
+		"postman": 62
 	},
 	"autotile": {
 		"autotile": 0,
diff --git a/project/items.js b/project/items.js
index aa455cd..b437a50 100644
--- a/project/items.js
+++ b/project/items.js
@@ -529,9 +529,31 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a =
 		"canUseItemEffect": "true"
 	},
 	"I369": {
-		"cls": "items",
-		"name": "新物品",
-		"canUseItemEffect": "true"
+		"cls": "constants",
+		"name": "动画开关",
+		"canUseItemEffect": "true",
+		"hideInToolbox": true,
+		"hideInReplay": true,
+		"useItemEvent": [
+			{
+				"type": "confirm",
+				"text": "是否开启战斗动画",
+				"yes": [
+					{
+						"type": "setValue",
+						"name": "flag:noAnimate",
+						"value": "false"
+					}
+				],
+				"no": [
+					{
+						"type": "setValue",
+						"name": "flag:noAnimate",
+						"value": "true"
+					}
+				]
+			}
+		]
 	},
 	"I370": {
 		"cls": "items",
@@ -576,5 +598,13 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a =
 		"cls": "items",
 		"name": "新物品",
 		"canUseItemEffect": "true"
+	},
+	"postman": {
+		"cls": "constants",
+		"name": "言灵",
+		"canUseItemEffect": "true",
+		"text": "可以发送和接收在线留言。",
+		"hideInToolbox": true,
+		"hideInReplay": true
 	}
 }
\ No newline at end of file
diff --git a/project/maps.js b/project/maps.js
index d1b42f0..dddf478 100644
--- a/project/maps.js
+++ b/project/maps.js
@@ -295,6 +295,7 @@ var maps_90f36752_8815_4be8_b32b_d7fad1d0542e =
 	"394": {"cls":"terrains","id":"T394"},
 	"395": {"cls":"terrains","id":"T395"},
 	"396": {"cls":"items","id":"I396"},
+	"397": {"cls":"items","id":"postman"},
 	"20034": {"cls":"tileset","id":"X20034","canPass":true},
 	"20154": {"cls":"tileset","id":"X20154","canPass":true},
 	"20216": {"cls":"tileset","id":"X20216","canPass":true},
diff --git a/project/materials/items.png b/project/materials/items.png
index 04dc29b26ed379fd8d7537a1d290174c30fe2732..24458727bfae7062f21e09ffcae9325326841555 100644
GIT binary patch
literal 22527
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

literal 18696
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
Qng9R*07*qoM6N<$g7nPH6951J

diff --git a/project/plugins.js b/project/plugins.js
index df24c93..5f97d09 100644
--- a/project/plugins.js
+++ b/project/plugins.js
@@ -2912,7 +2912,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 			//道具栏列表
 			this.itemMx = [
 				//空位用‘none’填充,当前ui至多4列6行
-				["book", "wand", "none", "fly"],
+				["book", "postman", "I369", "fly"],
 				["cross", "superPotion", "pickaxe"],
 				["bomb", "centerFly", "upFly"],
 				["none", "none", "none"],
@@ -2929,7 +2929,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 					core.openToolbox,
 					core.doSL,
 				],
-				[main.core.openSettings, main.core.save, main.core.load, core.doSL],
+				[main.core.save, main.core.load, main.core.openSettings, core.doSL],
 			];
 			this.replayAction = [
 				[core.triggerReplay, core.stopReplay, core.rewindReplay],
@@ -3561,7 +3561,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 				["speedDown", "speedUp", "save"],
 			] : [
 				["keyboard", "shop", "pack", "T332"],
-				["settings", "save", "load", "T331"],
+				["save", "load", "settings", "T331"],
 			];
 			if (core.domStyle.isVertical) {
 				core.clearMap(
@@ -3630,15 +3630,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 					case "book":
 						core.openBook(true);
 						break;
-					case "wand":
-						core.insertAction({
-							type: "useItem",
-							id: itemId,
-						});
-						break;
-					case "fly":
-						core.useItem(itemId);
-						break;
 					default:
 						core.useItem(itemId);
 					}
@@ -5605,1683 +5596,1680 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 	};
 },
     "新道具栏/装备栏": function () {
-    // 这个插件有点离谱 个人觉得参数过多只会降低可读性,还不如硬编码
+	// 这个插件有点离谱 个人觉得参数过多只会降低可读性,还不如硬编码
 
-    // 注:///// *** 裹起来的区域: 该区域内参数可以随意更改调整ui绘制 不会影响总体布局
-    // 请尽量修改该区域而不是其他区域 修改的时候最好可以对照现有ui修改
+	// 注:///// *** 裹起来的区域: 该区域内参数可以随意更改调整ui绘制 不会影响总体布局
+	// 请尽量修改该区域而不是其他区域 修改的时候最好可以对照现有ui修改
 
-    ///// *** 道具类型
-    // cls对应name
-    var itemClsName = {
-      constants: "永久道具",
-      tools: "消耗道具",
-    };
-    // 一页最大放的道具数量 将把整个道具左栏分成num份 每份是一个道具项
-    var itemNum = 12;
-    ///// ***
+	///// *** 道具类型
+	// cls对应name
+	var itemClsName = {
+		constants: "永久道具",
+		tools: "消耗道具",
+	};
+	// 一页最大放的道具数量 将把整个道具左栏分成num份 每份是一个道具项
+	var itemNum = 12;
+	///// ***
 
-    // 背景设置
-    function drawBoxBackground(ctx) {
-      core.setTextAlign(ctx, "left");
-      core.clearMap(ctx);
-      core.deleteCanvas("_selector");
-      var info = core.status.thisUIEventInfo || {};
+	// 背景设置
+	function drawBoxBackground(ctx) {
+		core.setTextAlign(ctx, "left");
+		core.clearMap(ctx);
+		core.deleteCanvas("_selector");
+		var info = core.status.thisUIEventInfo || {};
 
-      ///// *** 背景设置
-      var max = core.__PIXELS__;
-      var x = 2,
-        y = x,
-        w = max - x * 2,
-        h = w;
-      var borderWidth = 2,
-        borderRadius = 5, // radius:圆角矩形的圆角半径
-        borderStyle = "#fff";
-      var backgroundColor = "gray";
-      // 设置背景不透明度(0.85)
-      var backgroundAlpha = 0.85;
-      ///// ***
+		///// *** 背景设置
+		var max = core.__PIXELS__;
+		var x = 2,
+			y = x,
+			w = max - x * 2,
+			h = w;
+		var borderWidth = 2,
+			borderRadius = 5, // radius:圆角矩形的圆角半径
+			borderStyle = "#fff";
+		var backgroundColor = "gray";
+		// 设置背景不透明度(0.85)
+		var backgroundAlpha = 0.85;
+		///// ***
 
-      var start_x = x + borderWidth / 2,
-        start_y = y + borderWidth / 2,
-        width = max - start_x * 2,
-        height = max - start_y * 2;
+		var start_x = x + borderWidth / 2,
+			start_y = y + borderWidth / 2,
+			width = max - start_x * 2,
+			height = max - start_y * 2;
 
-      // 渐变色背景的一个例子(黑色渐变白色):
-      // 有关渐变色的具体知识请网上搜索canvas createGradient了解
-      /*
+		// 渐变色背景的一个例子(黑色渐变白色):
+		// 有关渐变色的具体知识请网上搜索canvas createGradient了解
+		/*
 		   var grd = ctx.createLinearGradient(x, y, x + w, y);
 		   grd.addColorStop(0, "black");
 		   grd.addColorStop(1, "white");
 		   backgroundColor = grd;
 		*/
-      // 使用图片背景要注释掉下面的strokeRect和fillRoundRect
-      // 图片背景的一个例子:
-      /*
+		// 使用图片背景要注释掉下面的strokeRect和fillRoundRect
+		// 图片背景的一个例子:
+		/*
 		   core.drawImage(ctx, "xxx.png", x, y, w, h);
 		   core.strokeRect(ctx, x, y, w, h, borderStyle, borderWidth);
 		*/
-      core.setAlpha(ctx, backgroundAlpha);
-      core.strokeRoundRect(
-        ctx,
-        x,
-        y,
-        w,
-        h,
-        borderRadius,
-        borderStyle,
-        borderWidth
-      );
-      core.fillRoundRect(
-        ctx,
-        start_x,
-        start_y,
-        width,
-        height,
-        borderRadius,
-        backgroundColor
-      );
-      core.setAlpha(ctx, 1);
-
-      ///// *** 左栏配置
-      var leftbar_height = height;
-      // 左边栏宽度(width*0.6) 本身仅为坐标使用 需要与底下的rightbar_width(width*0.4)同时更改
-      var leftbar_width = width * 0.6;
-      ///// ***
-
-      // xxx_right参数 代表最右侧坐标
-      var leftbar_right = start_x + leftbar_width - borderWidth / 2;
-      var leftbar_bottom = start_y + leftbar_height;
-      var leftbar_x = start_x;
-      var leftbar_y = start_y;
-
-      ///// *** 道具栏配置
-      var boxName_color = "#fff";
-      var boxName_fontSize = 15;
-      var boxName_font = core.ui._buildFont(boxName_fontSize, true);
-      var arrow_x = 10 + start_x;
-      var arrow_y = 10 + start_y;
-      var arrow_width = 20;
-      var arrow_style = "white";
-      // 暂时只能是1 否则不太行 等待新样板(2.7.3)之后对drawArrow做优化
-      var arrow_lineWidth = 2;
-      // 右箭头
-      var rightArrow_right = leftbar_right - 10;
-      // 道具内栏顶部坐标 本质是通过该项 控制(道具栏顶部文字和箭头)与道具内栏顶部的间隔
-      var itembar_top = arrow_y + 15;
-      ///// ***
-
-      var itembar_right = rightArrow_right;
-      var boxName =
-        core.status.event.id == "toolbox"
-          ? "\r[yellow]道具栏\r | 装备栏"
-          : "道具栏 | \r[yellow]装备栏\r";
-      core.drawArrow(
-        ctx,
-        arrow_x + arrow_width,
-        arrow_y,
-        arrow_x,
-        arrow_y,
-        arrow_style,
-        arrow_lineWidth
-      );
-      core.drawArrow(
-        ctx,
-        rightArrow_right - arrow_width,
-        arrow_y,
-        rightArrow_right,
-        arrow_y,
-        arrow_style,
-        arrow_lineWidth
-      );
-      core.setTextAlign(ctx, "center");
-      core.setTextBaseline(ctx, "middle");
-      var changeBox = function () {
-        var id = core.status.event.id;
-        core.closePanel();
-        if (id == "toolbox") core.openEquipbox();
-        else core.openToolbox();
-      };
-      core.fillText(
-        ctx,
-        boxName,
-        (leftbar_right + leftbar_x) / 2,
-        arrow_y + 2,
-        boxName_color,
-        boxName_font
-      );
-
-      ///// *** 底栏按钮
-      var pageBtn_radius = 8;
-      // xxx_left 最左侧坐标
-      var pageBtn_left = leftbar_x + 3;
-      var pageBtn_right = leftbar_right - 3;
-      // xxx_bottom 最底部坐标
-      var pageBtn_bottom = leftbar_bottom - 2;
-      var pageBtn_borderStyle = "#fff";
-      var pageBtn_borderWidth = 2;
-      var pageText_color = "#fff";
-      // 底部按钮与上面的道具内栏的间隔大小
-      var bottomSpace = 8;
-      ///// ***
-
-      drawItemListbox_setPageBtn(
-        ctx,
-        pageBtn_left,
-        pageBtn_right,
-        pageBtn_bottom,
-        pageBtn_radius,
-        pageBtn_borderStyle,
-        pageBtn_borderWidth
-      );
-      var page = info.page || 1;
-      var pageFontSize = pageBtn_radius * 2 - 4;
-      var pageFont = core.ui._buildFont(pageFontSize);
-      setPageItems(page);
-      var num = itemNum;
-      if (core.status.event.id == "equipbox") num -= 5;
-      var maxPage = info.maxPage;
-      var pageText = page + " / " + maxPage;
-      core.setTextAlign(ctx, "center");
-      core.setTextBaseline(ctx, "bottom");
-      core.fillText(
-        ctx,
-        pageText,
-        (leftbar_x + leftbar_right) / 2,
-        pageBtn_bottom,
-        pageText_color,
-        pageFont
-      );
-      addUIEventListener(
-        start_x,
-        start_y,
-        leftbar_right - start_x,
-        arrow_y - start_y + 13,
-        changeBox
-      );
-      var itembar_height = Math.ceil(
-        pageBtn_bottom -
-          pageBtn_radius * 2 -
-          pageBtn_borderWidth / 2 -
-          bottomSpace -
-          itembar_top
-      );
-      var oneItemHeight = (itembar_height - 4) / itemNum;
-      return {
-        x: start_x,
-        y: start_y,
-        width: width,
-        height: height,
-        leftbar_right: leftbar_right,
-        obj: {
-          x: arrow_x,
-          y: itembar_top,
-          width: itembar_right - arrow_x,
-          height: itembar_height,
-          oneItemHeight: oneItemHeight,
-        },
-      };
-    }
-
-    function drawItemListbox(ctx, obj) {
-      ctx = ctx || core.canvas.ui;
-      var itembar_x = obj.x,
-        itembar_y = obj.y,
-        itembar_width = obj.width,
-        itembar_height = obj.height,
-        itemNum = obj.itemNum,
-        oneItemHeight = obj.oneItemHeight;
-      var itembar_right = itembar_x + itembar_width;
-      var info = core.status.thisUIEventInfo || {};
-      var obj = {};
-      var page = info.page || 1,
-        index = info.index,
-        select = info.select || {};
-
-      ///// *** 道具栏内栏配置
-      var itembar_style = "black";
-      var itembar_alpha = 0.7;
-      // 一个竖屏下减少道具显示的例子:
-      // if (core.domStyle.isVertical) itemNum = 10;
-      // 每个道具项的上下空隙占总高度的比例
-      var itembar_marginHeightRatio = 0.2;
-      // 左右间隔空隙
-      var item_marginLeft = 2;
-      var item_x = itembar_x + 2,
-        item_y = itembar_y + 2,
-        item_right = itembar_right - 2,
-        itemName_color = "#fff";
-      // 修改此项以更换闪烁光标
-      var item_selector = "winskin.webp";
-      ///// ***
-
-      core.setAlpha(ctx, itembar_alpha);
-      core.fillRect(
-        ctx,
-        itembar_x,
-        itembar_y,
-        itembar_width,
-        itembar_height,
-        itembar_style
-      );
-      core.setAlpha(ctx, 1);
-      var pageItems = setPageItems(page);
-      var marginHeight = itembar_marginHeightRatio * oneItemHeight;
-      core.setTextBaseline(ctx, "middle");
-      var originColor = itemName_color;
-      for (var i = 0; i < pageItems.length; i++) {
-        itemName_color = originColor;
-        var item = pageItems[i];
-        // 设置某个的字体颜色的一个例子
-        // if (item.id == "xxx") itemName_color = "green";
-        drawItemListbox_drawItem(
-          ctx,
-          item_x,
-          item_right,
-          item_y,
-          oneItemHeight,
-          item_marginLeft,
-          marginHeight,
-          itemName_color,
-          pageItems[i]
-        );
-        if (index == i + 1)
-          core.ui._drawWindowSelector(
-            item_selector,
-            item_x + 1,
-            item_y - 1,
-            item_right - item_x - 2,
-            oneItemHeight - 2
-          );
-        item_y += oneItemHeight;
-      }
-    }
-
-    function drawToolboxRightbar(ctx, obj) {
-      ctx = ctx || core.canvas.ui;
-      var info = core.status.thisUIEventInfo || {};
-      var page = info.page || 1,
-        index = info.index || 1,
-        select = info.select || {};
-      var start_x = obj.x,
-        start_y = obj.y,
-        width = obj.width,
-        height = obj.height;
-      var toolboxRight = start_x + width,
-        toolboxBottom = start_y + height;
-
-      ///// *** 侧边栏(rightbar)背景设置(物品介绍)
-      var rightbar_width = width * 0.4;
-      var rightbar_height = height;
-      var rightbar_lineWidth = 2;
-      var rightbar_lineStyle = "#fff";
-      ///// ***
-
-      var rightbar_x = toolboxRight - rightbar_width - rightbar_lineWidth / 2;
-      var rightbar_y = start_y;
-      core.drawLine(
-        ctx,
-        rightbar_x,
-        rightbar_y,
-        rightbar_x,
-        rightbar_y + rightbar_height,
-        rightbar_lineStyle,
-        rightbar_lineWidth
-      );
-
-      // 获取道具id(有可能为null)
-      var itemId = select.id;
-      var item = core.material.items[itemId];
-
-      ///// *** 侧边栏物品Icon信息
-      var iconRect_y = rightbar_y + 10;
-      // space:间距
-      // 这里布局设定iconRect与侧边栏左边框 itemName与工具栏右边框 itemRect与itemName的间距均为space
-      var space = 15;
-      var iconRect_x = rightbar_x + space;
-      var iconRect_radius = 2,
-        iconRect_width = 32,
-        iconRect_height = 32,
-        iconRect_style = "#fff",
-        iconRect_lineWidth = 2;
-      ///// ***
-
-      var iconRect_bottom = iconRect_y + iconRect_height,
-        iconRect_right = iconRect_x + iconRect_width;
-
-      ///// *** 侧边栏各项信息
-      var itemTextFontSize = 15,
-        itemText_x = iconRect_x - 4,
-        itemText_y = Math.floor(start_y + rightbar_height * 0.25), // 坐标取整防止模糊
-        itemClsFontSize = 15,
-        itemClsFont = core.ui._buildFont(itemClsFontSize),
-        itemClsColor = "#fff",
-        itemCls_x = itemText_x - itemClsFontSize / 2,
-        itemCls_middle = (iconRect_bottom + itemText_y) / 2, //_middle代表文字的中心y坐标
-        itemNameFontSize = 18,
-        itemNameColor = "#fff",
-        itemNameFont = core.ui._buildFont(itemNameFontSize, true);
-      var itemName_x = iconRect_right + space;
-      var itemName_middle =
-        iconRect_y + iconRect_height / 2 + iconRect_lineWidth;
-      // 修改这里可以编辑未选中道具时的默认值
-      var defaultItem = {
-        cls: "constants",
-        name: "未知道具",
-        text: "没有道具最永久",
-      };
-      var defaultEquip = {
-        cls: "equips",
-        name: "未知装备",
-        text: "一无所有,又何尝不是一种装备",
-        equip: {
-          type: "装备",
-        },
-      };
-      ///// ***
-
-      var originItem = item;
-      if (core.status.event.id == "equipbox") item = item || defaultEquip;
-      item = item || defaultItem;
-      var itemCls = item.cls,
-        itemName = item.name,
-        itemText = item.text;
-      itemText = core.replaceText(itemText);
-      if (!itemText) itemText = "该道具无描述。";
-      /* 一个根据道具id修改道具名字(右栏)的例子
-       * if (item.id == "xxx") itemNameColor = "red";
-       */
-      var itemClsName = core.getItemClsName(item);
-      var itemNameMaxWidth =
-        rightbar_width - iconRect_width - iconRect_lineWidth * 2 - space * 2;
-      core.strokeRoundRect(
-        ctx,
-        iconRect_x,
-        iconRect_y,
-        iconRect_width,
-        iconRect_height,
-        iconRect_radius,
-        iconRect_style,
-        iconRect_lineWidth
-      );
-      if (item.id)
-        core.drawIcon(
-          ctx,
-          item.id,
-          iconRect_x + iconRect_lineWidth / 2,
-          iconRect_y + iconRect_lineWidth / 2,
-          iconRect_width - iconRect_lineWidth,
-          iconRect_height - iconRect_lineWidth
-        );
-      core.setTextAlign(ctx, "left");
-      core.setTextBaseline(ctx, "middle");
-      if (itemCls === "equips" && item.id) {
-        itemName = "【" + item.equipCls + "】" + itemName;
-      }
-      core.fillText(
-        ctx,
-        itemName,
-        itemName_x,
-        itemName_middle,
-        itemNameColor,
-        itemNameFont,
-        itemNameMaxWidth
-      );
-      if (!item.equip)
-        core.fillText(
-          ctx,
-          "【" + itemClsName + "】",
-          itemCls_x,
-          itemCls_middle,
-          itemClsColor,
-          itemClsFont
-        );
-
-      var statusText = "";
-      if (core.status.event.id == "equipbox") {
-        var type = item.equip.type;
-        if (typeof type == "string") type = core.getEquipTypeByName(type);
-        var compare = core.compareEquipment(item.id, core.getEquip(type));
-        var compare2;
-        if (item.equipCls === "双手剑")
-          compare2 = core.compareEquipment(null, core.getEquip(1));
-        if (
-          item.equipCls === "盾牌" &&
-          core.material.items[core.getEquip(0)]?.equipCls === "双手剑"
-        )
-          compare2 = core.compareEquipment(null, core.getEquip(0));
-        if (info.select.action == "unload")
-          compare = core.compareEquipment(null, item.id);
-        // --- 变化值...
-        for (var name in core.status.hero) {
-          if (typeof core.status.hero[name] != "number") continue;
-          var nowValue = core.getRealStatus(name);
-          // 查询新值
-          var newValue = Math.floor(
-            ((core.getStatus(name) +
-              (compare.value[name] || 0) +
-              (compare2?.value[name] || 0)) *
-              (core.getBuff(name) * 100 +
-                (compare.percentage[name] || 0) +
-                (compare2?.percentage[name] || 0))) /
-              100
-          );
-          if (name === "mdef") {
-            var nowValue = core.getRealStatus(name);
-            var newValue = Math.round(
-              (core.getStatus(name) -
-                (compare.value[name] || 0) -
-                (compare2?.value[name] || 0)) *
-                (1 -
-                  (1 - core.getBuff(name)) *
-                    (compare.percentage[name] || 1) *
-                    (compare2?.percentage[name] || 1))
-            );
-          }
-          if (nowValue == newValue) continue;
-          var color = newValue > nowValue ? "#00FF00" : "#FF0000";
-          nowValue = core.formatBigNumber(nowValue);
-          newValue = core.formatBigNumber(newValue);
-
-          if (name === "mdef") {
-            nowValue += "%";
-            newValue += "%";
-          }
-          statusText +=
-            core.getStatusLabel(name) +
-            " " +
-            nowValue +
-            "->\r[" +
-            color +
-            "]" +
-            newValue +
-            "\r\n";
-        }
-      }
-      itemText = statusText + itemText;
-      if (item.equip) {
-        core.drawTextContent(ctx, itemText, {
-          left: itemText_x,
-          top: itemCls_middle,
-          bold: false,
-          color: "white",
-          align: "left",
-          fontSize: itemTextFontSize,
-          maxWidth:
-            rightbar_width -
-            (itemText_x - rightbar_x) * 2 +
-            itemTextFontSize / 2,
-        });
-      } else {
-        core.drawTextContent(ctx, itemText, {
-          left: itemText_x,
-          top: itemText_y,
-          bold: false,
-          color: "white",
-          align: "left",
-          fontSize: itemTextFontSize,
-          maxWidth:
-            rightbar_width -
-            (itemText_x - rightbar_x) * 2 +
-            itemTextFontSize / 2,
-        });
-      }
-
-      ///// *** 退出按钮设置
-      var btnRadius = 10;
-      var btnBorderWidth = 2;
-      var btnRight = toolboxRight - 2;
-      var btnBottom = toolboxBottom - 2;
-      var btnBorderStyle = "#fff";
-      ///// ***
-
-      // 获取圆心位置
-      var btn_x = btnRight - btnRadius - btnBorderWidth / 2;
-      btn_y = btnBottom - btnRadius - btnBorderWidth / 2;
-      drawToolbox_setExitBtn(
-        ctx,
-        btn_x,
-        btn_y,
-        btnRadius,
-        btnBorderStyle,
-        btnBorderWidth
-      );
-
-      ///// *** 使用按钮设置
-      var useBtnHeight = btnRadius * 2;
-      // 这里不设置useBtnWidth而是根据各项数据自动得出width
-      var useBtnRadius = useBtnHeight / 4;
-      var useBtn_x = rightbar_x + 4,
-        useBtn_y = btnBottom - useBtnHeight;
-      var useBtnBorderStyle = "#fff";
-      var useBtnBorderWidth = btnBorderWidth;
-      const batchUseBtn_x = useBtn_x + 50; // 个人觉得,搞这么多参数还不如硬编码
-      const hideBtn_y = useBtn_y - useBtnHeight - 8;
-      ///// ***
-
-      drawToolbox_setUseBtn(
-        ctx,
-        useBtn_x,
-        useBtn_y,
-        useBtnRadius,
-        useBtnHeight,
-        useBtnBorderStyle,
-        useBtnBorderWidth
-      );
-      if (core.status.event.id === "toolbox") {
-        drawToolbox_setBatchUseBtn(
-          ctx,
-          batchUseBtn_x,
-          useBtn_y,
-          useBtnRadius,
-          useBtnHeight,
-          useBtnBorderStyle,
-          useBtnBorderWidth
-        );
-      }
-      drawToolbox_setHideBtn(
-        ctx,
-        useBtn_x,
-        hideBtn_y,
-        useBtnRadius,
-        useBtnHeight,
-        useBtnBorderStyle,
-        useBtnBorderWidth
-      );
-      drawToolbox_setShowHideBtn(
-        ctx,
-        rightbar_x,
-        useBtn_y,
-        useBtnHeight,
-        useBtnBorderStyle
-      );
-    }
-
-    function drawEquipbox_drawOthers(ctx, obj) {
-      var info = core.status.thisUIEventInfo;
-
-      ///// *** 装备格设置
-      var equipList_lineWidth = 2;
-      var equipList_boxSize = 32;
-      var equipList_borderWidth = 2;
-      var equipList_borderStyle = "#fff";
-      var equipList_nameColor = "#fff";
-      ///// ***
-
-      var equipList_x = obj.x + 4,
-        equipList_bottom = obj.obj.y - equipList_lineWidth,
-        equipList_y = equipList_bottom - obj.obj.oneItemHeight * reduceItem - 2,
-        equipList_height = equipList_bottom - equipList_y;
-      var equipList_right = obj.leftbar_right,
-        equipList_width = equipList_right - equipList_x;
-      core.drawLine(
-        ctx,
-        obj.x,
-        equipList_bottom + equipList_lineWidth / 2,
-        equipList_right,
-        equipList_bottom + equipList_lineWidth / 2,
-        equipList_borderStyle,
-        equipList_lineWidth
-      );
-      var toDrawList = core.status.globalAttribute.equipName,
-        len = toDrawList.length;
-
-      ///// *** 装备格设置
-      var maxItem = 2;
-      var box_width = 32,
-        box_height = 32,
-        box_borderStyle = "#fff",
-        box_selectBorderStyle = "gold", // 选中的装备格的颜色
-        box_borderWidth = 2;
-      var boxName_fontSize = 14,
-        boxName_space = 2,
-        boxName_color = "#fff"; // 装备格名称与上面的装备格框的距离
-      var maxLine = Math.ceil(len / maxItem);
-      ///// ***
-      var l = Math.sqrt(len);
-      if (Math.pow(l) == len && len != 4) {
-        if (l <= maxItem) maxItem = l;
-      }
-      maxItem = Math.min(toDrawList.length, maxItem);
-      info.equips = maxItem;
-
-      var boxName_font = core.ui._buildFont(boxName_fontSize);
-      // 总宽高减去所有装备格宽高得到空隙大小
-      var oneBoxWidth = box_width + box_borderWidth * 2;
-      var oneBoxHeight =
-        box_height + boxName_fontSize + boxName_space + 2 * box_borderWidth;
-      var space_y = (equipList_height - maxLine * oneBoxHeight) / (1 + maxLine),
-        space_x = (equipList_width - maxItem * oneBoxWidth) / (1 + maxItem);
-      var box_x = equipList_x + space_x,
-        box_y = equipList_y + space_y + 12;
-      for (var i = 0; i < 2; i++) {
-        var id = core.getEquip(i),
-          name = toDrawList[i];
-        if (i === 0) name = "主手";
-        if (i === 1) name = "副手";
-        var selectBorder = false;
-        if (core.status.thisUIEventInfo.select.type == i) selectBorder = true;
-        var borderStyle = selectBorder
-          ? box_selectBorderStyle
-          : box_borderStyle;
-        drawEquipbox_drawOne(
-          ctx,
-          name,
-          id,
-          box_x,
-          box_y,
-          box_width,
-          box_height,
-          boxName_space,
-          boxName_font,
-          boxName_color,
-          borderStyle,
-          box_borderWidth
-        );
-        var todo = new Function(
-          "core.clickOneEquipbox('" + id + "'," + i + ")"
-        );
-        addUIEventListener(
-          box_x - box_borderWidth / 2,
-          box_y - box_borderWidth / 2,
-          oneBoxWidth,
-          oneBoxHeight,
-          todo
-        );
-        box_x += space_x + oneBoxWidth;
-        if ((i + 1) % maxItem == 0) {
-          box_x = equipList_x + space_x;
-          box_y += space_y + oneBoxHeight;
-        }
-      }
-      if (core.material.items[core.getEquip(0)]?.equipCls === "双手剑") {
-        core.drawLine(
-          ctx,
-          equipList_x + space_x + space_x + oneBoxWidth,
-          equipList_y + space_y + 12,
-          equipList_x +
-            space_x +
-            space_x +
-            oneBoxWidth +
-            box_width +
-            box_borderWidth,
-          equipList_y + space_y + box_height + 12
-        );
-        core.drawLine(
-          ctx,
-          equipList_x + space_x + space_x + oneBoxWidth,
-          equipList_y + space_y + box_height + 12,
-          equipList_x +
-            space_x +
-            space_x +
-            oneBoxWidth +
-            box_width +
-            box_borderWidth,
-          equipList_y + space_y + 12
-        );
-      }
-      ///// *** 装备格设置
-      var maxItem = 3;
-      var box_width = 32,
-        box_height = 32,
-        box_borderStyle = "#fff",
-        box_selectBorderStyle = "gold", // 选中的装备格的颜色
-        box_borderWidth = 2;
-      var boxName_fontSize = 14,
-        boxName_space = 2,
-        boxName_color = "#fff"; // 装备格名称与上面的装备格框的距离
-      var maxLine = Math.ceil(len / maxItem);
-      ///// ***
-      var l = Math.sqrt(len);
-      if (Math.pow(l) == len && len != 4) {
-        if (l <= maxItem) maxItem = l;
-      }
-      maxItem = Math.min(toDrawList.length, maxItem);
-      info.equips = maxItem;
-
-      var boxName_font = core.ui._buildFont(boxName_fontSize);
-      // 总宽高减去所有装备格宽高得到空隙大小
-      var oneBoxWidth = box_width + box_borderWidth * 2;
-      var oneBoxHeight =
-        box_height + boxName_fontSize + boxName_space + 2 * box_borderWidth;
-      var space_y = (equipList_height - maxLine * oneBoxHeight) / (1 + maxLine),
-        space_x = (equipList_width - maxItem * oneBoxWidth) / (1 + maxItem);
-      var box_x = equipList_x + space_x,
-        box_y = equipList_y + space_y + space_y + oneBoxHeight;
-      for (var i = 2; i < len; i++) {
-        var id = core.getEquip(i),
-          name = toDrawList[i];
-        var selectBorder = false;
-        if (core.status.thisUIEventInfo.select.type == i) selectBorder = true;
-        var borderStyle = selectBorder
-          ? box_selectBorderStyle
-          : box_borderStyle;
-        drawEquipbox_drawOne(
-          ctx,
-          name,
-          id,
-          box_x,
-          box_y,
-          box_width,
-          box_height,
-          boxName_space,
-          boxName_font,
-          boxName_color,
-          borderStyle,
-          box_borderWidth
-        );
-        var todo = new Function(
-          "core.clickOneEquipbox('" + id + "'," + i + ")"
-        );
-        addUIEventListener(
-          box_x - box_borderWidth / 2,
-          box_y - box_borderWidth / 2,
-          oneBoxWidth,
-          oneBoxHeight,
-          todo
-        );
-        box_x += space_x + oneBoxWidth;
-      }
-    }
-
-    this.drawToolbox = function (ctx) {
-      ctx = ctx || core.canvas.ui;
-      core.status.thisEventClickArea = [];
-
-      var info = drawBoxBackground(ctx);
-      info.itemNum = itemNum;
-      drawItemListbox(ctx, info.obj);
-      drawToolboxRightbar(ctx, info);
-      core.setTextBaseline(ctx, "alphabetic");
-      core.setTextAlign("left");
-    };
-
-    var reduceItem = 4;
-    this.drawEquipbox = function (ctx) {
-      ctx = ctx || core.canvas.ui;
-      core.status.thisEventClickArea = [];
-      var info = drawBoxBackground(ctx);
-      info.itemNum = itemNum - reduceItem;
-      info.obj.y += info.obj.oneItemHeight * reduceItem;
-      info.obj.height -= info.obj.oneItemHeight * reduceItem;
-      drawItemListbox(ctx, info.obj);
-      drawEquipbox_drawOthers(ctx, info);
-      drawToolboxRightbar(ctx, info);
-      core.setTextBaseline(ctx, "alphabetic");
-      core.setTextAlign("left");
-    };
-
-    function drawEquipbox_drawOne(
-      ctx,
-      name,
-      id,
-      x,
-      y,
-      width,
-      height,
-      space,
-      font,
-      color,
-      style,
-      lineWidth
-    ) {
-      if (id)
-        core.drawIcon(
-          ctx,
-          id,
-          x + lineWidth / 2,
-          y + lineWidth / 2,
-          width,
-          height
-        );
-      core.strokeRect(
-        ctx,
-        x,
-        y,
-        width + lineWidth,
-        height + lineWidth,
-        style,
-        lineWidth
-      );
-      core.setTextAlign(ctx, "center");
-      core.setTextBaseline(ctx, "top");
-      var tx = (x + x + lineWidth / 2 + width) / 2,
-        ty = y + height + (lineWidth / 2) * 3 + space;
-      core.fillText(ctx, name, tx, ty, color, font);
-
-      core.setAlpha(ctx, 1);
-
-      core.setTextBaseline(ctx, "alphabetic");
-      core.setTextAlign("left");
-    }
-
-    function drawItemListbox_drawItem(
-      ctx,
-      left,
-      right,
-      top,
-      height,
-      marginLeft,
-      marginHeight,
-      style,
-      id
-    ) {
-      var info = core.status.thisUIEventInfo;
-      var nowClick = info.index;
-      var item = core.material.items[id] || {};
-      var name = item.name || "???";
-      var num = core.itemCount(id) || 0;
-      var fontSize = Math.floor(height - marginHeight * 2);
-      core.setTextAlign(ctx, "right");
-      var numText = "x" + num;
-      core.fillText(
-        ctx,
-        numText,
-        right - marginLeft,
-        top + height / 2,
-        style,
-        core.ui._buildFont(fontSize)
-      );
-
-      const hideInfo = core.getFlag("hideInfo", {});
-      if (
-        item &&
-        (hideInfo.hasOwnProperty(id) ? hideInfo[id] : item.hideInToolbox)
-      )
-        core.setAlpha(ctx, 0.5);
-
-      if (name != "???")
-        core.drawIcon(
-          ctx,
-          id,
-          left + marginLeft,
-          top + marginHeight,
-          fontSize,
-          fontSize
-        );
-      var text_x = left + marginLeft + fontSize + 2;
-      var maxWidth = right - core.calWidth(ctx, numText) - text_x;
-      core.setTextAlign(ctx, "left");
-      core.fillText(
-        ctx,
-        name,
-        text_x,
-        top + height / 2,
-        style,
-        core.ui._buildFont(fontSize),
-        maxWidth
-      );
-      core.setAlpha(ctx, 1);
-
-      var todo = new Function("core.clickItemFunc('" + id + "');");
-      addUIEventListener(left, top, right - left, height, todo);
-    }
-
-    function setPageItems(page) {
-      var num = itemNum;
-      if (core.status.event.id == "equipbox") num -= reduceItem;
-      var info = core.status.thisUIEventInfo;
-      if (!info) return;
-      page = page || info.page;
-      var items = core.getToolboxItems(
-        core.status.event.id == "toolbox" ? "all" : "equips",
-        core.getFlag("showHideItem", false)
-      );
-      info.allItems = items;
-      var maxPage = Math.ceil(items.length / num);
-      info.maxPage = maxPage;
-      var pageItems = items.slice((page - 1) * num, page * num);
-      info.pageItems = pageItems;
-      info.maxItem = pageItems.length;
-      if (items.length == 0 && pageItems.length == 0) info.index = null;
-      if (pageItems.length == 0 && info.page > 1) {
-        info.page = Math.max(1, info.page - 1);
-        return setPageItems(info.page);
-      }
-      return pageItems;
-    }
-
-    function drawToolbox_setExitBtn(ctx, x, y, r, style, lineWidth) {
-      core.strokeCircle(ctx, x, y, r, style, lineWidth);
-      ctx.textAlign = "center";
-      ctx.textBaseline = "middle";
-      var textSize = Math.sqrt(2) * r;
-      core.fillText(
-        ctx,
-        "x",
-        x,
-        y,
-        style,
-        core.ui._buildFont(textSize),
-        textSize
-      );
-      core.setTextAlign(ctx, "start");
-      core.setTextBaseline(ctx, "top");
-
-      var todo = function () {
-        core.closePanel();
-      };
-      addUIEventListener(x - r, y - r, r * 2, r * 2, todo);
-    }
-
-    function drawToolbox_setUseBtn(ctx, x, y, r, h, style, lineWidth) {
-      core.setTextAlign(ctx, "left");
-      core.setTextBaseline(ctx, "top");
-      var fontSize = h - 4;
-      var font = core.ui._buildFont(fontSize);
-      var text = core.status.event.id == "toolbox" ? "使用" : "装备";
-      if (core.status.thisUIEventInfo.select.action == "unload") text = "卸下";
-      var w = core.calWidth(ctx, text, font) + 2 * r + lineWidth / 2;
-
-      core.strokeRoundRect(ctx, x, y, w, h, r, style, lineWidth);
-      core.fillText(ctx, text, x + r, y + lineWidth / 2 + 2, style, font);
-
-      var todo = function () {
-        core.useSelectItemInBox();
-      };
-      addUIEventListener(x, y, w, h, todo);
-    }
-
-    function getSelectedItem() {
-      var info = core.status.thisUIEventInfo;
-      if (
-        !(
-          info &&
-          info.select.id &&
-          ["toolbox", "equipbox"].includes(core.status.event.id)
-        )
-      ) {
-        core.drawFailTip("发生了未知错误!");
-        return;
-      }
-      return info.select.id;
-    }
-
-    function batchUse(item, count) {
-      try {
-        const itemCount = core.itemCount(item);
-        if (count > itemCount) count = itemCount;
-        core.closePanel();
-        for (let i = 0; i < count; i++) {
-          if (core.canUseItem(item)) core.useItem(item);
-          else return;
-        }
-      } catch (e) {
-        console.error(e);
-        core.drawFailTip("批量使用时出现未知错误!");
-      }
-    }
-
-    function drawToolbox_setBatchUseBtn(ctx, x, y, r, h, style, lineWidth) {
-      try {
-        const selectedItem = getSelectedItem();
-        let canBatchUse = eval(core.material.items[selectedItem]?.canBatchUse);
-        if (!canBatchUse) return;
-      } catch (error) {
-        console.error(error);
-        return;
-      }
-      core.setTextAlign(ctx, "left");
-      core.setTextBaseline(ctx, "top");
-      var fontSize = h - 4;
-      var font = core.ui._buildFont(fontSize);
-      var text = "批量使用";
-      var w = core.calWidth(ctx, text, font) + 2 * r + lineWidth / 2;
-
-      core.strokeRoundRect(ctx, x, y, w, h, r, style, lineWidth);
-      core.fillText(ctx, text, x + r, y + lineWidth / 2 + 2, style, font);
-
-      var todo = function () {
-        core.utils.myprompt("输入要使用该物品的次数(0~99)。", null, (value) => {
-          value = parseInt(value);
-          const id = getSelectedItem();
-
-          if (Number.isNaN(value) || value < 0 || value > 99) {
-            core.drawFailTip("输入不合法!");
-            return;
-          }
-          if (!core.canUseItem(id)) {
-            core.drawFailTip("当前无法使用该道具!");
-            return;
-          }
-          core.closePanel();
-          batchUse(id, value);
-        });
-      };
-      addUIEventListener(x, y, w, h, todo);
-    }
-
-    function drawToolbox_setHideBtn(ctx, x, y, r, h, style, lineWidth) {
-      core.setTextAlign(ctx, "left");
-      core.setTextBaseline(ctx, "top");
-      var fontSize = h - 4;
-      var font = core.ui._buildFont(fontSize);
-      var text = "显示/隐藏";
-      var w = core.calWidth(ctx, text, font) + 2 * r + lineWidth / 2;
-
-      core.strokeRoundRect(ctx, x, y, w, h, r, style, lineWidth);
-      core.fillText(ctx, text, x + r, y + lineWidth / 2 + 2, style, font);
-
-      var todo = function () {
-        //debugger;
-        var id = getSelectedItem();
-        let hideInfo = core.getFlag("hideInfo", {});
-        console.log(id);
-        if (hideInfo.hasOwnProperty(id)) {
-          hideInfo[id] = !hideInfo[id];
-          core.setFlag("hideInfo", hideInfo);
-        } else {
-          hideInfo[id] = !core.material.items[id].hideInToolbox;
-          core.setFlag("hideInfo", hideInfo);
-        }
-        if (core.status.event.id === "toolbox") core.plugin.drawToolbox();
-        else if (core.status.event.id === "equipbox")
-          core.plugin.drawEquipbox();
-      };
-      addUIEventListener(x, y, w, h, todo);
-    }
-
-    ui.prototype.getToolboxItems = function (cls, showHide) {
-      let list = Object.keys(core.status.hero.items[cls] || {});
-      if (cls === "all") {
-        for (let name in core.status.hero.items) {
-          if (name == "equips") continue;
-          list = list.concat(Object.keys(core.status.hero.items[name]));
-        }
-        if (!showHide)
-          list = list.filter(function (id2) {
-            const hideInfo = core.getFlag("hideInfo", {});
-            if (hideInfo.hasOwnProperty(id2)) return !hideInfo[id2];
-            else return !core.material.items[id2].hideInToolbox;
-          });
-        list = list.sort();
-        return list;
-      }
-      if (cls === "equips") {
-        if (!showHide)
-          list = list.filter(function (id2) {
-            const hideInfo = core.getFlag("hideInfo", {});
-            if (hideInfo.hasOwnProperty(id2)) return !hideInfo[id2];
-            else return !core.material.items[id2].hideInToolbox;
-          });
-
-        list = list.sort();
-        return list;
-      }
-      if (this.uidata.getToolboxItems) {
-        return this.uidata.getToolboxItems(cls, showHide);
-      }
-      if (!showHide)
-        list = list.filter(function (id2) {
-          return !core.material.items[id2].hideInToolbox;
-        });
-      list = list.sort();
-      return list;
-    };
-
-    function drawToolbox_setShowHideBtn(ctx, x, y, h, style) {
-      core.setTextAlign(ctx, "left");
-      core.setTextBaseline(ctx, "top");
-      var fontSize = h - 6;
-      var font = core.ui._buildFont(fontSize);
-      var text = "显示隐藏";
-      var w = core.calWidth(ctx, text, font);
-      h += 4;
-      const squareSize = h - 6;
-
-      x -= w + squareSize + 26;
-
-      const border = 2;
-      core.fillRect(ctx, x, y, squareSize, squareSize, " #F5F5F5");
-      if (core.hasFlag("showHideItem")) {
-        core.fillRect(
-          ctx,
-          x + border,
-          y + border,
-          squareSize - 2 * border,
-          squareSize - 2 * border,
-          "lime"
-        );
-      }
-      core.fillText(ctx, text, x + squareSize + 2, y + 4, style, font);
-
-      var todo = function () {
-        core.setFlag("showHideItem", !core.getFlag("showHideItem", false));
-        if (core.status.event.id === "toolbox") core.plugin.drawToolbox();
-        else if (core.status.event.id === "equipbox")
-          core.plugin.drawEquipbox();
-      };
-      addUIEventListener(x, y, w, h, todo);
-    }
-
-    function drawItemListbox_setPageBtn(
-      ctx,
-      left,
-      right,
-      bottom,
-      r,
-      style,
-      lineWidth
-    ) {
-      var offset = lineWidth / 2 + r;
-
-      var x = left + offset;
-      var y = bottom - offset;
-      var pos = (Math.sqrt(2) / 2) * (r - lineWidth / 2);
-      core.fillPolygon(
-        ctx,
-        [
-          [x - pos, y],
-          [x + pos - 2, y - pos],
-          [x + pos - 2, y + pos],
-        ],
-        style
-      );
-      core.strokeCircle(ctx, x, y, r, style, lineWidth);
-      var todo = function () {
-        core.addItemListboxPage(-1);
-      };
-      addUIEventListener(x - r - 2, y - r - 2, r * 2 + 4, r * 2 + 4, todo);
-
-      x = right - offset;
-      core.fillPolygon(
-        ctx,
-        [
-          [x + pos, y],
-          [x - pos + 2, y - pos],
-          [x - pos + 2, y + pos],
-        ],
-        style
-      );
-      core.strokeCircle(ctx, x, y, r, style, lineWidth);
-      var todo = function () {
-        core.addItemListboxPage(1);
-      };
-      addUIEventListener(x - r - 2, y - r - 2, r * 2 + 4, r * 2 + 4, todo);
-    }
-
-    this.clickItemFunc = function (id) {
-      var info = core.status.thisUIEventInfo;
-      if (!info) return;
-      if (info.select.id == id) return core.useSelectItemInBox();
-      info.select = {};
-      info.select.id = id;
-      core.setIndexAndSelect("index");
-      refreshBox();
-    };
-
-    this.clickOneEquipbox = function (id, type) {
-      var info = core.status.thisUIEventInfo;
-      if (!info) return;
-      if (info.select.id == id && info.select.type == type)
-        core.useSelectItemInBox();
-      else
-        core.status.thisUIEventInfo.select = {
-          id: id,
-          type: type,
-          action: "unload",
-        };
-      return refreshBox();
-    };
-
-    this.useSelectItemInBox = function () {
-      var info = core.status.thisUIEventInfo;
-      if (!info) return;
-      if (!info.select.id) return;
-      var id = info.select.id;
-      if (core.status.event.id == "toolbox") {
-        core.events.tryUseItem(id);
-        // core.closePanel();
-      } else if (core.status.event.id == "equipbox") {
-        var action = info.select.action || "load";
-        info.index = 1;
-        if (action == "load") {
-          var type = core.getEquipTypeById(id);
-          let equipClsid = core.material.items[id]?.equipCls;
-          let equipCls0 = core.material.items[core.getEquip(0)]?.equipCls;
-          let equipCls1 = core.material.items[core.getEquip(1)]?.equipCls;
-          if (equipClsid === "双手剑") {
-            core.unloadEquip(0, function () {
-              core.status.route.push("unEquip:" + 0);
-            });
-            core.unloadEquip(1, function () {
-              core.status.route.push("unEquip:" + 1);
-            });
-          }
-          if (
-            equipCls0 === "双手剑" &&
-            !(equipClsid === "饰品" || equipClsid === "护具")
-          ) {
-            core.unloadEquip(0, function () {
-              core.status.route.push("unEquip:" + 0);
-            });
-          }
-          core.loadEquip(id, function () {
-            core.status.route.push("equip:" + id);
-            info.select.type = type;
-            core.setIndexAndSelect("select");
-            core.drawEquipbox();
-          });
-        } else {
-          var type = info.select.type;
-          core.unloadEquip(type, function () {
-            core.status.route.push("unEquip:" + type);
-            info.select.type = type;
-            info.select.action = "load";
-            core.setIndexAndSelect("select");
-            core.drawEquipbox();
-          });
-        }
-      }
-      core.updateStatusBar();
-    };
-
-    this.setIndexAndSelect = function (toChange) {
-      var info = core.status.thisUIEventInfo;
-      if (!info) return;
-      setPageItems(info.page);
-      var index = info.index || 1;
-      var items = info.pageItems;
-
-      info.select.action = null;
-      info.select.type = null;
-      if (toChange == "index") info.index = items.indexOf(info.select.id) + 1;
-      info.select.id = items[info.index - 1];
-    };
-
-    this.addItemListboxPage = function (num) {
-      var info = core.status.thisUIEventInfo;
-      if (!info) return;
-      var maxPage = info.maxPage || 1;
-      info.page = info.page || 1;
-      info.page += num;
-      if (info.page <= 0) info.page = maxPage;
-      if (info.page > maxPage) info.page = 1;
-      info.index = 1;
-      setPageItems(info.page);
-      core.setIndexAndSelect("select");
-      refreshBox();
-    };
-
-    this.addItemListboxIndex = function (num) {
-      var info = core.status.thisUIEventInfo;
-      if (!info) return;
-      var maxItem = info.maxItem || 0;
-      info.index = info.index || 0;
-      info.index += num;
-      if (info.index <= 0) info.index = 1;
-      if (info.index > maxItem) info.index = maxItem;
-      core.setIndexAndSelect("select");
-      refreshBox();
-    };
-
-    this.addEquipboxType = function (num) {
-      var info = core.status.thisUIEventInfo;
-      var type = info.select.type;
-      if (type == null && num > 0) info.select.type = 0;
-      else info.select.type = type + num;
-      var max = core.status.globalAttribute.equipName.length;
-      if (info.select.type >= max) {
-        info.select = {};
-        core.setIndexAndSelect("select");
-        return core.addItemListboxPage(0);
-      } else {
-        var m = Math.abs(info.select.type);
-        if (info.select.type < 0) info.select.type = max - m;
-        core.setIndexAndSelect("select");
-        refreshBox();
-        return;
-      }
-    };
-
-    core.actions._keyDownToolbox = function (keycode) {
-      if (!core.status.thisEventClickArea) return;
-      if (keycode == 37) {
-        // left
-        core.addItemListboxPage(-1);
-        return;
-      }
-      if (keycode == 38) {
-        // up
-        core.addItemListboxIndex(-1);
-        return;
-      }
-      if (keycode == 39) {
-        // right
-        core.addItemListboxPage(1);
-        return;
-      }
-      if (keycode == 40) {
-        // down
-        core.addItemListboxIndex(1);
-        return;
-      }
-    };
-
-    ////// 工具栏界面时,放开某个键的操作 //////
-    core.actions._keyUpToolbox = function (keycode) {
-      if (keycode == 81) {
-        core.ui.closePanel();
-        if (core.isReplaying()) core.control._replay_equipbox();
-        else core.openEquipbox();
-        return;
-      }
-      if (keycode == 84 || keycode == 27 || keycode == 88) {
-        core.closePanel();
-        return;
-      }
-      if (keycode == 13 || keycode == 32 || keycode == 67) {
-        var info = core.status.thisUIEventInfo;
-        if (info.select) {
-          core.useSelectItemInBox();
-        }
-        return;
-      }
-    };
-
-    core.actions._keyDownEquipbox = function (keycode) {
-      if (!core.status.thisEventClickArea) return;
-      if (keycode == 37) {
-        // left
-        var info = core.status.thisUIEventInfo;
-        if (info.index != null) return core.addItemListboxPage(-1);
-        return core.addEquipboxType(-1);
-      }
-      if (keycode == 38) {
-        // up
-        var info = core.status.thisUIEventInfo;
-        if (info.index == 1) {
-          info.select.type = core.status.globalAttribute.equipName.length - 1;
-          core.setIndexAndSelect();
-          return refreshBox();
-        }
-        if (info.index) return core.addItemListboxIndex(-1);
-        return core.addEquipboxType(-1 * info.equips);
-      }
-      if (keycode == 39) {
-        // right
-        var info = core.status.thisUIEventInfo;
-        if (info.index != null) return core.addItemListboxPage(1);
-        return core.addEquipboxType(1);
-      }
-      if (keycode == 40) {
-        // down
-        var info = core.status.thisUIEventInfo;
-        if (info.index) return core.addItemListboxIndex(1);
-        return core.addEquipboxType(info.equips);
-      }
-    };
-
-    core.actions._keyUpEquipbox = function (keycode, altKey) {
-      if (altKey && keycode >= 48 && keycode <= 57) {
-        core.items.quickSaveEquip(keycode - 48);
-        return;
-      }
-      if (keycode == 84) {
-        core.ui.closePanel();
-        if (core.isReplaying()) core.control._replay_toolbox();
-        else core.openToolbox();
-        return;
-      }
-      if (keycode == 81 || keycode == 27 || keycode == 88) {
-        core.closePanel();
-        return;
-      }
-      if (keycode == 13 || keycode == 32 || keycode == 67) {
-        var info = core.status.thisUIEventInfo;
-        if (info.select) core.useSelectItemInBox();
-        return;
-      }
-    };
-
-    core.registerAction(
-      "ondown",
-      "inEventClickAction",
-      function (x, y, px, py) {
-        if (!core.status.thisEventClickArea) return false;
-        var info = core.status.thisEventClickArea;
-        for (var i = 0; i < info.length; i++) {
-          var obj = info[i];
-          if (
-            px >= obj.x &&
-            px <= obj.x + obj.width &&
-            py > obj.y &&
-            py < obj.y + obj.height
-          ) {
-            if (obj.todo) obj.todo();
-            break;
-          }
-        }
-        return true;
-      },
-      51
-    );
-    core.registerAction(
-      "onclick",
-      "stopClick",
-      function () {
-        if (core.status.thisEventClickArea) return true;
-      },
-      51
-    );
-
-    function addUIEventListener(x, y, width, height, todo) {
-      if (!core.status.thisEventClickArea) return;
-      var obj = {
-        x: x,
-        y: y,
-        width: width,
-        height: height,
-        todo: todo,
-      };
-      core.status.thisEventClickArea.push(obj);
-    }
-
-    this.initThisEventInfo = function () {
-      core.status.thisUIEventInfo = {
-        page: 1,
-        select: {},
-      };
-      core.status.thisEventClickArea = [];
-    };
-
-    function refreshBox() {
-      if (!core.status.event.id) return;
-      if (core.status.event.id == "toolbox") core.drawToolbox();
-      else core.drawEquipbox();
-    }
-
-    core.ui.closePanel = function () {
-      if (core.status.hero && core.status.hero.flags) {
-        // 清除全部临时变量
-        Object.keys(core.status.hero.flags).forEach(function (name) {
-          if (name.startsWith("@temp@") || /^arg\d+$/.test(name)) {
-            delete core.status.hero.flags[name];
-          }
-        });
-      }
-      this.clearUI();
-      core.maps.generateGroundPattern();
-      core.updateStatusBar(true);
-      core.unlockControl();
-      core.status.event.data = null;
-      core.status.event.id = null;
-      core.status.event.selection = null;
-      core.status.event.ui = null;
-      core.status.event.interval = null;
-      core.status.thisUIEventInfo = null;
-      core.status.thisEventClickArea = null;
-    };
-
-    this.getItemClsName = function (item) {
-      if (item == null) return itemClsName;
-      if (item.cls == "equips") {
-        if (typeof item.equip.type == "string") return item.equip.type;
-        var type = core.getEquipTypeById(item.id);
-        return core.status.globalAttribute.equipName[type];
-      } else return itemClsName[item.cls] || item.cls;
-    };
-
-    core.events.openToolbox = function (fromUserAction) {
-      if (core.isReplaying()) return;
-      if (!this._checkStatus("toolbox", fromUserAction)) return;
-      core.initThisEventInfo();
-      let info = core.status.thisUIEventInfo;
-      info.index = 1;
-      core.setIndexAndSelect("select");
-      core.drawToolbox();
-    };
-
-    core.events.openEquipbox = function (fromUserAction) {
-      if (core.isReplaying()) return;
-      if (!this._checkStatus("equipbox", fromUserAction)) return;
-      core.initThisEventInfo();
-      let info = core.status.thisUIEventInfo;
-      info.select.type = 0;
-      core.setIndexAndSelect("select");
-      core.drawEquipbox();
-    };
-
-    core.control._replay_toolbox = function () {
-      if (!core.isPlaying() || !core.isReplaying()) return;
-      if (!core.status.replay.pausing) return core.drawTip("请先暂停录像");
-      if (core.isMoving() || core.status.replay.animate || core.status.event.id)
-        return core.drawTip("请等待当前事件的处理结束");
-
-      core.lockControl();
-      core.status.event.id = "toolbox";
-      core.drawToolbox();
-    };
-
-    core.control._replay_equipbox = function () {
-      if (!core.isPlaying() || !core.isReplaying()) return;
-      if (!core.status.replay.pausing) return core.drawTip("请先暂停录像");
-      if (core.isMoving() || core.status.replay.animate || core.status.event.id)
-        return core.drawTip("请等待当前事件的处理结束");
-
-      core.lockControl();
-      core.status.event.id = "equipbox";
-      core.drawEquipbox();
-    };
-
-    core.control._replayAction_item = function (action) {
-      if (action.indexOf("item:") != 0) return false;
-      var itemId = action.substring(5);
-      if (!core.canUseItem(itemId)) return false;
-      if (
-        core.material.items[itemId].hideInReplay ||
-        core.status.replay.speed == 24
-      ) {
-        core.useItem(itemId, false, core.replay);
-        return true;
-      }
-      core.status.event.id = "toolbox";
-      core.initThisEventInfo();
-      var info = core.status.thisUIEventInfo;
-      var items = core.getToolboxItems(
-        "all",
-        core.getFlag("showHideItem", false)
-      );
-      setPageItems(1);
-      var index = items.indexOf(itemId) + 1;
-      info.page = Math.ceil(index / info.maxItem);
-      info.index = index % info.maxItem || info.maxItem;
-      core.setIndexAndSelect("select");
-      setPageItems(info.page);
-      core.drawToolbox();
-      setTimeout(function () {
-        core.ui.closePanel();
-        core.useItem(itemId, false, core.replay);
-      }, core.control.__replay_getTimeout());
-      return true;
-    };
-
-    core.control._replayAction_equip = function (action) {
-      if (action.indexOf("equip:") != 0) return false;
-      var itemId = action.substring(6);
-      var items = core.getToolboxItems(
-        "equips",
-        core.getFlag("showHideItem", false)
-      );
-      var index = items.indexOf(itemId) + 1;
-      if (index < 1) {
-        core.removeFlag("__doNotCheckAutoEvents__");
-        return false;
-      }
-
-      var cb = function () {
-        var next = core.status.replay.toReplay[0] || "";
-        if (!next.startsWith("equip:") && !next.startsWith("unEquip:")) {
-          core.removeFlag("__doNotCheckAutoEvents__");
-          core.checkAutoEvents();
-        }
-        core.replay();
-      };
-      core.setFlag("__doNotCheckAutoEvents__", true);
-
-      core.status.route.push(action);
-      if (
-        core.material.items[itemId].hideInReplay ||
-        core.status.replay.speed == 24
-      ) {
-        core.loadEquip(itemId, cb);
-        return true;
-      }
-      core.status.event.id = "equipbox";
-      core.initThisEventInfo();
-      var info = core.status.thisUIEventInfo;
-      setPageItems(1);
-      info.page = Math.ceil(index / info.maxItem);
-      info.index = index % info.maxItem || info.maxItem;
-      core.setIndexAndSelect("select");
-      setPageItems(info.page);
-      core.drawEquipbox();
-      setTimeout(function () {
-        core.ui.closePanel();
-        core.loadEquip(itemId, cb);
-      }, core.control.__replay_getTimeout());
-      return true;
-    };
-
-    core.control._replayAction_unEquip = function (action) {
-      if (action.indexOf("unEquip:") != 0) return false;
-      var equipType = parseInt(action.substring(8));
-      if (!core.isset(equipType)) {
-        core.removeFlag("__doNotCheckAutoEvents__");
-        return false;
-      }
-
-      var cb = function () {
-        var next = core.status.replay.toReplay[0] || "";
-        if (!next.startsWith("equip:") && !next.startsWith("unEquip:")) {
-          core.removeFlag("__doNotCheckAutoEvents__");
-          core.checkAutoEvents();
-        }
-        core.replay();
-      };
-      core.setFlag("__doNotCheckAutoEvents__", true);
-
-      core.status.route.push(action);
-      if (core.status.replay.speed == 24) {
-        core.unloadEquip(equipType, cb);
-        return true;
-      }
-      core.status.event.id = "equipbox";
-      core.initThisEventInfo();
-      var info = core.status.thisUIEventInfo;
-      setPageItems(1);
-      info.select.type = equipType;
-      core.setIndexAndSelect();
-      core.drawEquipbox();
-      setTimeout(function () {
-        core.ui.closePanel();
-        core.unloadEquip(equipType, cb);
-      }, core.control.__replay_getTimeout());
-      return true;
-    };
-    core.registerReplayAction("item", core.control._replayAction_item);
-    core.registerReplayAction("equip", core.control._replayAction_equip);
-    core.registerReplayAction("unEquip", core.control._replayAction_unEquip);
-  },
+		core.setAlpha(ctx, backgroundAlpha);
+		core.strokeRoundRect(
+			ctx,
+			x,
+			y,
+			w,
+			h,
+			borderRadius,
+			borderStyle,
+			borderWidth
+		);
+		core.fillRoundRect(
+			ctx,
+			start_x,
+			start_y,
+			width,
+			height,
+			borderRadius,
+			backgroundColor
+		);
+		core.setAlpha(ctx, 1);
+
+		///// *** 左栏配置
+		var leftbar_height = height;
+		// 左边栏宽度(width*0.6) 本身仅为坐标使用 需要与底下的rightbar_width(width*0.4)同时更改
+		var leftbar_width = width * 0.6;
+		///// ***
+
+		// xxx_right参数 代表最右侧坐标
+		var leftbar_right = start_x + leftbar_width - borderWidth / 2;
+		var leftbar_bottom = start_y + leftbar_height;
+		var leftbar_x = start_x;
+		var leftbar_y = start_y;
+
+		///// *** 道具栏配置
+		var boxName_color = "#fff";
+		var boxName_fontSize = 15;
+		var boxName_font = core.ui._buildFont(boxName_fontSize, true);
+		var arrow_x = 10 + start_x;
+		var arrow_y = 10 + start_y;
+		var arrow_width = 20;
+		var arrow_style = "white";
+		// 暂时只能是1 否则不太行 等待新样板(2.7.3)之后对drawArrow做优化
+		var arrow_lineWidth = 2;
+		// 右箭头
+		var rightArrow_right = leftbar_right - 10;
+		// 道具内栏顶部坐标 本质是通过该项 控制(道具栏顶部文字和箭头)与道具内栏顶部的间隔
+		var itembar_top = arrow_y + 15;
+		///// ***
+
+		var itembar_right = rightArrow_right;
+		var boxName =
+			core.status.event.id == "toolbox" ?
+			"\r[yellow]道具栏\r | 装备栏" :
+			"道具栏 | \r[yellow]装备栏\r";
+		core.drawArrow(
+			ctx,
+			arrow_x + arrow_width,
+			arrow_y,
+			arrow_x,
+			arrow_y,
+			arrow_style,
+			arrow_lineWidth
+		);
+		core.drawArrow(
+			ctx,
+			rightArrow_right - arrow_width,
+			arrow_y,
+			rightArrow_right,
+			arrow_y,
+			arrow_style,
+			arrow_lineWidth
+		);
+		core.setTextAlign(ctx, "center");
+		core.setTextBaseline(ctx, "middle");
+		var changeBox = function () {
+			var id = core.status.event.id;
+			core.closePanel();
+			if (id == "toolbox") core.openEquipbox();
+			else core.openToolbox();
+		};
+		core.fillText(
+			ctx,
+			boxName,
+			(leftbar_right + leftbar_x) / 2,
+			arrow_y + 2,
+			boxName_color,
+			boxName_font
+		);
+
+		///// *** 底栏按钮
+		var pageBtn_radius = 8;
+		// xxx_left 最左侧坐标
+		var pageBtn_left = leftbar_x + 3;
+		var pageBtn_right = leftbar_right - 3;
+		// xxx_bottom 最底部坐标
+		var pageBtn_bottom = leftbar_bottom - 2;
+		var pageBtn_borderStyle = "#fff";
+		var pageBtn_borderWidth = 2;
+		var pageText_color = "#fff";
+		// 底部按钮与上面的道具内栏的间隔大小
+		var bottomSpace = 8;
+		///// ***
+
+		drawItemListbox_setPageBtn(
+			ctx,
+			pageBtn_left,
+			pageBtn_right,
+			pageBtn_bottom,
+			pageBtn_radius,
+			pageBtn_borderStyle,
+			pageBtn_borderWidth
+		);
+		var page = info.page || 1;
+		var pageFontSize = pageBtn_radius * 2 - 4;
+		var pageFont = core.ui._buildFont(pageFontSize);
+		setPageItems(page);
+		var num = itemNum;
+		if (core.status.event.id == "equipbox") num -= 5;
+		var maxPage = info.maxPage;
+		var pageText = page + " / " + maxPage;
+		core.setTextAlign(ctx, "center");
+		core.setTextBaseline(ctx, "bottom");
+		core.fillText(
+			ctx,
+			pageText,
+			(leftbar_x + leftbar_right) / 2,
+			pageBtn_bottom,
+			pageText_color,
+			pageFont
+		);
+		addUIEventListener(
+			start_x,
+			start_y,
+			leftbar_right - start_x,
+			arrow_y - start_y + 13,
+			changeBox
+		);
+		var itembar_height = Math.ceil(
+			pageBtn_bottom -
+			pageBtn_radius * 2 -
+			pageBtn_borderWidth / 2 -
+			bottomSpace -
+			itembar_top
+		);
+		var oneItemHeight = (itembar_height - 4) / itemNum;
+		return {
+			x: start_x,
+			y: start_y,
+			width: width,
+			height: height,
+			leftbar_right: leftbar_right,
+			obj: {
+				x: arrow_x,
+				y: itembar_top,
+				width: itembar_right - arrow_x,
+				height: itembar_height,
+				oneItemHeight: oneItemHeight,
+			},
+		};
+	}
+
+	function drawItemListbox(ctx, obj) {
+		ctx = ctx || core.canvas.ui;
+		var itembar_x = obj.x,
+			itembar_y = obj.y,
+			itembar_width = obj.width,
+			itembar_height = obj.height,
+			itemNum = obj.itemNum,
+			oneItemHeight = obj.oneItemHeight;
+		var itembar_right = itembar_x + itembar_width;
+		var info = core.status.thisUIEventInfo || {};
+		var obj = {};
+		var page = info.page || 1,
+			index = info.index,
+			select = info.select || {};
+
+		///// *** 道具栏内栏配置
+		var itembar_style = "black";
+		var itembar_alpha = 0.7;
+		// 一个竖屏下减少道具显示的例子:
+		// if (core.domStyle.isVertical) itemNum = 10;
+		// 每个道具项的上下空隙占总高度的比例
+		var itembar_marginHeightRatio = 0.2;
+		// 左右间隔空隙
+		var item_marginLeft = 2;
+		var item_x = itembar_x + 2,
+			item_y = itembar_y + 2,
+			item_right = itembar_right - 2,
+			itemName_color = "#fff";
+		// 修改此项以更换闪烁光标
+		var item_selector = "winskin.webp";
+		///// ***
+
+		core.setAlpha(ctx, itembar_alpha);
+		core.fillRect(
+			ctx,
+			itembar_x,
+			itembar_y,
+			itembar_width,
+			itembar_height,
+			itembar_style
+		);
+		core.setAlpha(ctx, 1);
+		var pageItems = setPageItems(page);
+		var marginHeight = itembar_marginHeightRatio * oneItemHeight;
+		core.setTextBaseline(ctx, "middle");
+		var originColor = itemName_color;
+		for (var i = 0; i < pageItems.length; i++) {
+			itemName_color = originColor;
+			var item = pageItems[i];
+			// 设置某个的字体颜色的一个例子
+			// if (item.id == "xxx") itemName_color = "green";
+			drawItemListbox_drawItem(
+				ctx,
+				item_x,
+				item_right,
+				item_y,
+				oneItemHeight,
+				item_marginLeft,
+				marginHeight,
+				itemName_color,
+				pageItems[i]
+			);
+			if (index == i + 1)
+				core.ui._drawWindowSelector(
+					item_selector,
+					item_x + 1,
+					item_y - 1,
+					item_right - item_x - 2,
+					oneItemHeight - 2
+				);
+			item_y += oneItemHeight;
+		}
+	}
+
+	function drawToolboxRightbar(ctx, obj) {
+		ctx = ctx || core.canvas.ui;
+		var info = core.status.thisUIEventInfo || {};
+		var page = info.page || 1,
+			index = info.index || 1,
+			select = info.select || {};
+		var start_x = obj.x,
+			start_y = obj.y,
+			width = obj.width,
+			height = obj.height;
+		var toolboxRight = start_x + width,
+			toolboxBottom = start_y + height;
+
+		///// *** 侧边栏(rightbar)背景设置(物品介绍)
+		var rightbar_width = width * 0.4;
+		var rightbar_height = height;
+		var rightbar_lineWidth = 2;
+		var rightbar_lineStyle = "#fff";
+		///// ***
+
+		var rightbar_x = toolboxRight - rightbar_width - rightbar_lineWidth / 2;
+		var rightbar_y = start_y;
+		core.drawLine(
+			ctx,
+			rightbar_x,
+			rightbar_y,
+			rightbar_x,
+			rightbar_y + rightbar_height,
+			rightbar_lineStyle,
+			rightbar_lineWidth
+		);
+
+		// 获取道具id(有可能为null)
+		var itemId = select.id;
+		var item = core.material.items[itemId];
+
+		///// *** 侧边栏物品Icon信息
+		var iconRect_y = rightbar_y + 10;
+		// space:间距
+		// 这里布局设定iconRect与侧边栏左边框 itemName与工具栏右边框 itemRect与itemName的间距均为space
+		var space = 15;
+		var iconRect_x = rightbar_x + space;
+		var iconRect_radius = 2,
+			iconRect_width = 32,
+			iconRect_height = 32,
+			iconRect_style = "#fff",
+			iconRect_lineWidth = 2;
+		///// ***
+
+		var iconRect_bottom = iconRect_y + iconRect_height,
+			iconRect_right = iconRect_x + iconRect_width;
+
+		///// *** 侧边栏各项信息
+		var itemTextFontSize = 15,
+			itemText_x = iconRect_x - 4,
+			itemText_y = Math.floor(start_y + rightbar_height * 0.25), // 坐标取整防止模糊
+			itemClsFontSize = 15,
+			itemClsFont = core.ui._buildFont(itemClsFontSize),
+			itemClsColor = "#fff",
+			itemCls_x = itemText_x - itemClsFontSize / 2,
+			itemCls_middle = (iconRect_bottom + itemText_y) / 2, //_middle代表文字的中心y坐标
+			itemNameFontSize = 18,
+			itemNameColor = "#fff",
+			itemNameFont = core.ui._buildFont(itemNameFontSize, true);
+		var itemName_x = iconRect_right + space;
+		var itemName_middle =
+			iconRect_y + iconRect_height / 2 + iconRect_lineWidth;
+		// 修改这里可以编辑未选中道具时的默认值
+		var defaultItem = {
+			cls: "constants",
+			name: "未知道具",
+			text: "没有道具最永久",
+		};
+		var defaultEquip = {
+			cls: "equips",
+			name: "未知装备",
+			text: "一无所有,又何尝不是一种装备",
+			equip: {
+				type: "装备",
+			},
+		};
+		///// ***
+
+		var originItem = item;
+		if (core.status.event.id == "equipbox") item = item || defaultEquip;
+		item = item || defaultItem;
+		var itemCls = item.cls,
+			itemName = item.name,
+			itemText = item.text;
+		itemText = core.replaceText(itemText);
+		if (!itemText) itemText = "该道具无描述。";
+		/* 一个根据道具id修改道具名字(右栏)的例子
+		 * if (item.id == "xxx") itemNameColor = "red";
+		 */
+		var itemClsName = core.getItemClsName(item);
+		var itemNameMaxWidth =
+			rightbar_width - iconRect_width - iconRect_lineWidth * 2 - space * 2;
+		core.strokeRoundRect(
+			ctx,
+			iconRect_x,
+			iconRect_y,
+			iconRect_width,
+			iconRect_height,
+			iconRect_radius,
+			iconRect_style,
+			iconRect_lineWidth
+		);
+		if (item.id)
+			core.drawIcon(
+				ctx,
+				item.id,
+				iconRect_x + iconRect_lineWidth / 2,
+				iconRect_y + iconRect_lineWidth / 2,
+				iconRect_width - iconRect_lineWidth,
+				iconRect_height - iconRect_lineWidth
+			);
+		core.setTextAlign(ctx, "left");
+		core.setTextBaseline(ctx, "middle");
+		if (itemCls === "equips" && item.id) {
+			itemName = "【" + item.equipCls + "】" + itemName;
+		}
+		core.fillText(
+			ctx,
+			itemName,
+			itemName_x,
+			itemName_middle,
+			itemNameColor,
+			itemNameFont,
+			itemNameMaxWidth
+		);
+		if (!item.equip)
+			core.fillText(
+				ctx,
+				"【" + itemClsName + "】",
+				itemCls_x,
+				itemCls_middle,
+				itemClsColor,
+				itemClsFont
+			);
+
+		var statusText = "";
+		if (core.status.event.id == "equipbox") {
+			var type = item.equip.type;
+			if (typeof type == "string") type = core.getEquipTypeByName(type);
+			var compare = core.compareEquipment(item.id, core.getEquip(type));
+			var compare2;
+			if (item.equipCls === "双手剑")
+				compare2 = core.compareEquipment(null, core.getEquip(1));
+			if (
+				item.equipCls === "盾牌" &&
+				core.material.items[core.getEquip(0)]?.equipCls === "双手剑"
+			)
+				compare2 = core.compareEquipment(null, core.getEquip(0));
+			if (info.select.action == "unload")
+				compare = core.compareEquipment(null, item.id);
+			// --- 变化值...
+			for (var name in core.status.hero) {
+				if (typeof core.status.hero[name] != "number") continue;
+				var nowValue = core.getRealStatus(name);
+				// 查询新值
+				var newValue = Math.floor(
+					((core.getStatus(name) +
+							(compare.value[name] || 0) +
+							(compare2?.value[name] || 0)) *
+						(core.getBuff(name) * 100 +
+							(compare.percentage[name] || 0) +
+							(compare2?.percentage[name] || 0))) /
+					100
+				);
+				if (name === "mdef") {
+					var nowValue = core.getRealStatus(name);
+					var newValue = Math.round(
+						(core.getStatus(name) -
+							(compare.value[name] || 0) -
+							(compare2?.value[name] || 0)) *
+						(1 -
+							(1 - core.getBuff(name)) *
+							(compare.percentage[name] || 1) *
+							(compare2?.percentage[name] || 1))
+					);
+				}
+				if (nowValue == newValue) continue;
+				var color = newValue > nowValue ? "#00FF00" : "#FF0000";
+				nowValue = core.formatBigNumber(nowValue);
+				newValue = core.formatBigNumber(newValue);
+
+				if (name === "mdef") {
+					nowValue += "%";
+					newValue += "%";
+				}
+				statusText +=
+					core.getStatusLabel(name) +
+					" " +
+					nowValue +
+					"->\r[" +
+					color +
+					"]" +
+					newValue +
+					"\r\n";
+			}
+		}
+		itemText = statusText + itemText;
+		if (item.equip) {
+			core.drawTextContent(ctx, itemText, {
+				left: itemText_x,
+				top: itemCls_middle,
+				bold: false,
+				color: "white",
+				align: "left",
+				fontSize: itemTextFontSize,
+				maxWidth: rightbar_width -
+					(itemText_x - rightbar_x) * 2 +
+					itemTextFontSize / 2,
+			});
+		} else {
+			core.drawTextContent(ctx, itemText, {
+				left: itemText_x,
+				top: itemText_y,
+				bold: false,
+				color: "white",
+				align: "left",
+				fontSize: itemTextFontSize,
+				maxWidth: rightbar_width -
+					(itemText_x - rightbar_x) * 2 +
+					itemTextFontSize / 2,
+			});
+		}
+
+		///// *** 退出按钮设置
+		var btnRadius = 10;
+		var btnBorderWidth = 2;
+		var btnRight = toolboxRight - 2;
+		var btnBottom = toolboxBottom - 2;
+		var btnBorderStyle = "#fff";
+		///// ***
+
+		// 获取圆心位置
+		var btn_x = btnRight - btnRadius - btnBorderWidth / 2;
+		btn_y = btnBottom - btnRadius - btnBorderWidth / 2;
+		drawToolbox_setExitBtn(
+			ctx,
+			btn_x,
+			btn_y,
+			btnRadius,
+			btnBorderStyle,
+			btnBorderWidth
+		);
+
+		///// *** 使用按钮设置
+		var useBtnHeight = btnRadius * 2;
+		// 这里不设置useBtnWidth而是根据各项数据自动得出width
+		var useBtnRadius = useBtnHeight / 4;
+		var useBtn_x = rightbar_x + 4,
+			useBtn_y = btnBottom - useBtnHeight;
+		var useBtnBorderStyle = "#fff";
+		var useBtnBorderWidth = btnBorderWidth;
+		const batchUseBtn_x = useBtn_x + 50; // 个人觉得,搞这么多参数还不如硬编码
+		const hideBtn_y = useBtn_y - useBtnHeight - 8;
+		///// ***
+
+		drawToolbox_setUseBtn(
+			ctx,
+			useBtn_x,
+			useBtn_y,
+			useBtnRadius,
+			useBtnHeight,
+			useBtnBorderStyle,
+			useBtnBorderWidth
+		);
+		if (core.status.event.id === "toolbox") {
+			drawToolbox_setBatchUseBtn(
+				ctx,
+				batchUseBtn_x,
+				useBtn_y,
+				useBtnRadius,
+				useBtnHeight,
+				useBtnBorderStyle,
+				useBtnBorderWidth
+			);
+		}
+		drawToolbox_setHideBtn(
+			ctx,
+			useBtn_x,
+			hideBtn_y,
+			useBtnRadius,
+			useBtnHeight,
+			useBtnBorderStyle,
+			useBtnBorderWidth
+		);
+		drawToolbox_setShowHideBtn(
+			ctx,
+			rightbar_x,
+			useBtn_y,
+			useBtnHeight,
+			useBtnBorderStyle
+		);
+	}
+
+	function drawEquipbox_drawOthers(ctx, obj) {
+		var info = core.status.thisUIEventInfo;
+
+		///// *** 装备格设置
+		var equipList_lineWidth = 2;
+		var equipList_boxSize = 32;
+		var equipList_borderWidth = 2;
+		var equipList_borderStyle = "#fff";
+		var equipList_nameColor = "#fff";
+		///// ***
+
+		var equipList_x = obj.x + 4,
+			equipList_bottom = obj.obj.y - equipList_lineWidth,
+			equipList_y = equipList_bottom - obj.obj.oneItemHeight * reduceItem - 2,
+			equipList_height = equipList_bottom - equipList_y;
+		var equipList_right = obj.leftbar_right,
+			equipList_width = equipList_right - equipList_x;
+		core.drawLine(
+			ctx,
+			obj.x,
+			equipList_bottom + equipList_lineWidth / 2,
+			equipList_right,
+			equipList_bottom + equipList_lineWidth / 2,
+			equipList_borderStyle,
+			equipList_lineWidth
+		);
+		var toDrawList = core.status.globalAttribute.equipName,
+			len = toDrawList.length;
+
+		///// *** 装备格设置
+		var maxItem = 2;
+		var box_width = 32,
+			box_height = 32,
+			box_borderStyle = "#fff",
+			box_selectBorderStyle = "gold", // 选中的装备格的颜色
+			box_borderWidth = 2;
+		var boxName_fontSize = 14,
+			boxName_space = 2,
+			boxName_color = "#fff"; // 装备格名称与上面的装备格框的距离
+		var maxLine = Math.ceil(len / maxItem);
+		///// ***
+		var l = Math.sqrt(len);
+		if (Math.pow(l) == len && len != 4) {
+			if (l <= maxItem) maxItem = l;
+		}
+		maxItem = Math.min(toDrawList.length, maxItem);
+		info.equips = maxItem;
+
+		var boxName_font = core.ui._buildFont(boxName_fontSize);
+		// 总宽高减去所有装备格宽高得到空隙大小
+		var oneBoxWidth = box_width + box_borderWidth * 2;
+		var oneBoxHeight =
+			box_height + boxName_fontSize + boxName_space + 2 * box_borderWidth;
+		var space_y = (equipList_height - maxLine * oneBoxHeight) / (1 + maxLine),
+			space_x = (equipList_width - maxItem * oneBoxWidth) / (1 + maxItem);
+		var box_x = equipList_x + space_x,
+			box_y = equipList_y + space_y + 12;
+		for (var i = 0; i < 2; i++) {
+			var id = core.getEquip(i),
+				name = toDrawList[i];
+			if (i === 0) name = "主手";
+			if (i === 1) name = "副手";
+			var selectBorder = false;
+			if (core.status.thisUIEventInfo.select.type == i) selectBorder = true;
+			var borderStyle = selectBorder ?
+				box_selectBorderStyle :
+				box_borderStyle;
+			drawEquipbox_drawOne(
+				ctx,
+				name,
+				id,
+				box_x,
+				box_y,
+				box_width,
+				box_height,
+				boxName_space,
+				boxName_font,
+				boxName_color,
+				borderStyle,
+				box_borderWidth
+			);
+			var todo = new Function(
+				"core.clickOneEquipbox('" + id + "'," + i + ")"
+			);
+			addUIEventListener(
+				box_x - box_borderWidth / 2,
+				box_y - box_borderWidth / 2,
+				oneBoxWidth,
+				oneBoxHeight,
+				todo
+			);
+			box_x += space_x + oneBoxWidth;
+			if ((i + 1) % maxItem == 0) {
+				box_x = equipList_x + space_x;
+				box_y += space_y + oneBoxHeight;
+			}
+		}
+		if (core.material.items[core.getEquip(0)]?.equipCls === "双手剑") {
+			core.drawLine(
+				ctx,
+				equipList_x + space_x + space_x + oneBoxWidth,
+				equipList_y + space_y + 12,
+				equipList_x +
+				space_x +
+				space_x +
+				oneBoxWidth +
+				box_width +
+				box_borderWidth,
+				equipList_y + space_y + box_height + 12
+			);
+			core.drawLine(
+				ctx,
+				equipList_x + space_x + space_x + oneBoxWidth,
+				equipList_y + space_y + box_height + 12,
+				equipList_x +
+				space_x +
+				space_x +
+				oneBoxWidth +
+				box_width +
+				box_borderWidth,
+				equipList_y + space_y + 12
+			);
+		}
+		///// *** 装备格设置
+		var maxItem = 3;
+		var box_width = 32,
+			box_height = 32,
+			box_borderStyle = "#fff",
+			box_selectBorderStyle = "gold", // 选中的装备格的颜色
+			box_borderWidth = 2;
+		var boxName_fontSize = 14,
+			boxName_space = 2,
+			boxName_color = "#fff"; // 装备格名称与上面的装备格框的距离
+		var maxLine = Math.ceil(len / maxItem);
+		///// ***
+		var l = Math.sqrt(len);
+		if (Math.pow(l) == len && len != 4) {
+			if (l <= maxItem) maxItem = l;
+		}
+		maxItem = Math.min(toDrawList.length, maxItem);
+		info.equips = maxItem;
+
+		var boxName_font = core.ui._buildFont(boxName_fontSize);
+		// 总宽高减去所有装备格宽高得到空隙大小
+		var oneBoxWidth = box_width + box_borderWidth * 2;
+		var oneBoxHeight =
+			box_height + boxName_fontSize + boxName_space + 2 * box_borderWidth;
+		var space_y = (equipList_height - maxLine * oneBoxHeight) / (1 + maxLine),
+			space_x = (equipList_width - maxItem * oneBoxWidth) / (1 + maxItem);
+		var box_x = equipList_x + space_x,
+			box_y = equipList_y + space_y + space_y + oneBoxHeight;
+		for (var i = 2; i < len; i++) {
+			var id = core.getEquip(i),
+				name = toDrawList[i];
+			var selectBorder = false;
+			if (core.status.thisUIEventInfo.select.type == i) selectBorder = true;
+			var borderStyle = selectBorder ?
+				box_selectBorderStyle :
+				box_borderStyle;
+			drawEquipbox_drawOne(
+				ctx,
+				name,
+				id,
+				box_x,
+				box_y,
+				box_width,
+				box_height,
+				boxName_space,
+				boxName_font,
+				boxName_color,
+				borderStyle,
+				box_borderWidth
+			);
+			var todo = new Function(
+				"core.clickOneEquipbox('" + id + "'," + i + ")"
+			);
+			addUIEventListener(
+				box_x - box_borderWidth / 2,
+				box_y - box_borderWidth / 2,
+				oneBoxWidth,
+				oneBoxHeight,
+				todo
+			);
+			box_x += space_x + oneBoxWidth;
+		}
+	}
+
+	this.drawToolbox = function (ctx) {
+		ctx = ctx || core.canvas.ui;
+		core.status.thisEventClickArea = [];
+
+		var info = drawBoxBackground(ctx);
+		info.itemNum = itemNum;
+		drawItemListbox(ctx, info.obj);
+		drawToolboxRightbar(ctx, info);
+		core.setTextBaseline(ctx, "alphabetic");
+		core.setTextAlign("left");
+	};
+
+	var reduceItem = 4;
+	this.drawEquipbox = function (ctx) {
+		ctx = ctx || core.canvas.ui;
+		core.status.thisEventClickArea = [];
+		var info = drawBoxBackground(ctx);
+		info.itemNum = itemNum - reduceItem;
+		info.obj.y += info.obj.oneItemHeight * reduceItem;
+		info.obj.height -= info.obj.oneItemHeight * reduceItem;
+		drawItemListbox(ctx, info.obj);
+		drawEquipbox_drawOthers(ctx, info);
+		drawToolboxRightbar(ctx, info);
+		core.setTextBaseline(ctx, "alphabetic");
+		core.setTextAlign("left");
+	};
+
+	function drawEquipbox_drawOne(
+		ctx,
+		name,
+		id,
+		x,
+		y,
+		width,
+		height,
+		space,
+		font,
+		color,
+		style,
+		lineWidth
+	) {
+		if (id)
+			core.drawIcon(
+				ctx,
+				id,
+				x + lineWidth / 2,
+				y + lineWidth / 2,
+				width,
+				height
+			);
+		core.strokeRect(
+			ctx,
+			x,
+			y,
+			width + lineWidth,
+			height + lineWidth,
+			style,
+			lineWidth
+		);
+		core.setTextAlign(ctx, "center");
+		core.setTextBaseline(ctx, "top");
+		var tx = (x + x + lineWidth / 2 + width) / 2,
+			ty = y + height + (lineWidth / 2) * 3 + space;
+		core.fillText(ctx, name, tx, ty, color, font);
+
+		core.setAlpha(ctx, 1);
+
+		core.setTextBaseline(ctx, "alphabetic");
+		core.setTextAlign("left");
+	}
+
+	function drawItemListbox_drawItem(
+		ctx,
+		left,
+		right,
+		top,
+		height,
+		marginLeft,
+		marginHeight,
+		style,
+		id
+	) {
+		var info = core.status.thisUIEventInfo;
+		var nowClick = info.index;
+		var item = core.material.items[id] || {};
+		var name = item.name || "???";
+		var num = core.itemCount(id) || 0;
+		var fontSize = Math.floor(height - marginHeight * 2);
+		core.setTextAlign(ctx, "right");
+		var numText = "x" + num;
+		core.fillText(
+			ctx,
+			numText,
+			right - marginLeft,
+			top + height / 2,
+			style,
+			core.ui._buildFont(fontSize)
+		);
+
+		const hideInfo = core.getFlag("hideInfo", {});
+		if (
+			item &&
+			(hideInfo.hasOwnProperty(id) ? hideInfo[id] : item.hideInToolbox)
+		)
+			core.setAlpha(ctx, 0.5);
+
+		if (name != "???")
+			core.drawIcon(
+				ctx,
+				id,
+				left + marginLeft,
+				top + marginHeight,
+				fontSize,
+				fontSize
+			);
+		var text_x = left + marginLeft + fontSize + 2;
+		var maxWidth = right - core.calWidth(ctx, numText) - text_x;
+		core.setTextAlign(ctx, "left");
+		core.fillText(
+			ctx,
+			name,
+			text_x,
+			top + height / 2,
+			style,
+			core.ui._buildFont(fontSize),
+			maxWidth
+		);
+		core.setAlpha(ctx, 1);
+
+		var todo = new Function("core.clickItemFunc('" + id + "');");
+		addUIEventListener(left, top, right - left, height, todo);
+	}
+
+	function setPageItems(page) {
+		var num = itemNum;
+		if (core.status.event.id == "equipbox") num -= reduceItem;
+		var info = core.status.thisUIEventInfo;
+		if (!info) return;
+		page = page || info.page;
+		var items = core.getToolboxItems(
+			core.status.event.id == "toolbox" ? "all" : "equips",
+			core.getFlag("showHideItem", false)
+		);
+		info.allItems = items;
+		var maxPage = Math.ceil(items.length / num);
+		info.maxPage = maxPage;
+		var pageItems = items.slice((page - 1) * num, page * num);
+		info.pageItems = pageItems;
+		info.maxItem = pageItems.length;
+		if (items.length == 0 && pageItems.length == 0) info.index = null;
+		if (pageItems.length == 0 && info.page > 1) {
+			info.page = Math.max(1, info.page - 1);
+			return setPageItems(info.page);
+		}
+		return pageItems;
+	}
+
+	function drawToolbox_setExitBtn(ctx, x, y, r, style, lineWidth) {
+		core.strokeCircle(ctx, x, y, r, style, lineWidth);
+		ctx.textAlign = "center";
+		ctx.textBaseline = "middle";
+		var textSize = Math.sqrt(2) * r;
+		core.fillText(
+			ctx,
+			"x",
+			x,
+			y,
+			style,
+			core.ui._buildFont(textSize),
+			textSize
+		);
+		core.setTextAlign(ctx, "start");
+		core.setTextBaseline(ctx, "top");
+
+		var todo = function () {
+			core.closePanel();
+		};
+		addUIEventListener(x - r, y - r, r * 2, r * 2, todo);
+	}
+
+	function drawToolbox_setUseBtn(ctx, x, y, r, h, style, lineWidth) {
+		core.setTextAlign(ctx, "left");
+		core.setTextBaseline(ctx, "top");
+		var fontSize = h - 4;
+		var font = core.ui._buildFont(fontSize);
+		var text = core.status.event.id == "toolbox" ? "使用" : "装备";
+		if (core.status.thisUIEventInfo.select.action == "unload") text = "卸下";
+		var w = core.calWidth(ctx, text, font) + 2 * r + lineWidth / 2;
+
+		core.strokeRoundRect(ctx, x, y, w, h, r, style, lineWidth);
+		core.fillText(ctx, text, x + r, y + lineWidth / 2 + 2, style, font);
+
+		var todo = function () {
+			core.useSelectItemInBox();
+		};
+		addUIEventListener(x, y, w, h, todo);
+	}
+
+	function getSelectedItem() {
+		var info = core.status.thisUIEventInfo;
+		if (
+			!(
+				info &&
+				info.select.id && ["toolbox", "equipbox"].includes(core.status.event.id)
+			)
+		) {
+			core.drawFailTip("发生了未知错误!");
+			return;
+		}
+		return info.select.id;
+	}
+
+	function batchUse(item, count) {
+		try {
+			const itemCount = core.itemCount(item);
+			if (count > itemCount) count = itemCount;
+			core.closePanel();
+			for (let i = 0; i < count; i++) {
+				if (core.canUseItem(item)) core.useItem(item);
+				else return;
+			}
+		} catch (e) {
+			console.error(e);
+			core.drawFailTip("批量使用时出现未知错误!");
+		}
+	}
+
+	function drawToolbox_setBatchUseBtn(ctx, x, y, r, h, style, lineWidth) {
+		try {
+			const selectedItem = getSelectedItem();
+			let canBatchUse = eval(core.material.items[selectedItem]?.canBatchUse);
+			if (!canBatchUse) return;
+		} catch (error) {
+			console.error(error);
+			return;
+		}
+		core.setTextAlign(ctx, "left");
+		core.setTextBaseline(ctx, "top");
+		var fontSize = h - 4;
+		var font = core.ui._buildFont(fontSize);
+		var text = "批量使用";
+		var w = core.calWidth(ctx, text, font) + 2 * r + lineWidth / 2;
+
+		core.strokeRoundRect(ctx, x, y, w, h, r, style, lineWidth);
+		core.fillText(ctx, text, x + r, y + lineWidth / 2 + 2, style, font);
+
+		var todo = function () {
+			core.utils.myprompt("输入要使用该物品的次数(0~99)。", null, (value) => {
+				value = parseInt(value);
+				const id = getSelectedItem();
+
+				if (Number.isNaN(value) || value < 0 || value > 99) {
+					core.drawFailTip("输入不合法!");
+					return;
+				}
+				if (!core.canUseItem(id)) {
+					core.drawFailTip("当前无法使用该道具!");
+					return;
+				}
+				core.closePanel();
+				batchUse(id, value);
+			});
+		};
+		addUIEventListener(x, y, w, h, todo);
+	}
+
+	function drawToolbox_setHideBtn(ctx, x, y, r, h, style, lineWidth) {
+		core.setTextAlign(ctx, "left");
+		core.setTextBaseline(ctx, "top");
+		var fontSize = h - 4;
+		var font = core.ui._buildFont(fontSize);
+		var text = "显示/隐藏";
+		var w = core.calWidth(ctx, text, font) + 2 * r + lineWidth / 2;
+
+		core.strokeRoundRect(ctx, x, y, w, h, r, style, lineWidth);
+		core.fillText(ctx, text, x + r, y + lineWidth / 2 + 2, style, font);
+
+		var todo = function () {
+			//debugger;
+			var id = getSelectedItem();
+			let hideInfo = core.getFlag("hideInfo", {});
+			console.log(id);
+			if (hideInfo.hasOwnProperty(id)) {
+				hideInfo[id] = !hideInfo[id];
+				core.setFlag("hideInfo", hideInfo);
+			} else {
+				hideInfo[id] = !core.material.items[id].hideInToolbox;
+				core.setFlag("hideInfo", hideInfo);
+			}
+			if (core.status.event.id === "toolbox") core.plugin.drawToolbox();
+			else if (core.status.event.id === "equipbox")
+				core.plugin.drawEquipbox();
+		};
+		addUIEventListener(x, y, w, h, todo);
+	}
+
+	ui.prototype.getToolboxItems = function (cls, showHide) {
+		let list = Object.keys(core.status.hero.items[cls] || {});
+		if (cls === "all") {
+			for (let name in core.status.hero.items) {
+				if (name == "equips") continue;
+				list = list.concat(Object.keys(core.status.hero.items[name]));
+			}
+			if (!showHide)
+				list = list.filter(function (id2) {
+					const hideInfo = core.getFlag("hideInfo", {});
+					if (hideInfo.hasOwnProperty(id2)) return !hideInfo[id2];
+					else return !core.material.items[id2].hideInToolbox;
+				});
+			list = list.sort();
+			return list;
+		}
+		if (cls === "equips") {
+			if (!showHide)
+				list = list.filter(function (id2) {
+					const hideInfo = core.getFlag("hideInfo", {});
+					if (hideInfo.hasOwnProperty(id2)) return !hideInfo[id2];
+					else return !core.material.items[id2].hideInToolbox;
+				});
+
+			list = list.sort();
+			return list;
+		}
+		if (this.uidata.getToolboxItems) {
+			return this.uidata.getToolboxItems(cls, showHide);
+		}
+		if (!showHide)
+			list = list.filter(function (id2) {
+				return !core.material.items[id2].hideInToolbox;
+			});
+		list = list.sort();
+		return list;
+	};
+
+	function drawToolbox_setShowHideBtn(ctx, x, y, h, style) {
+		core.setTextAlign(ctx, "left");
+		core.setTextBaseline(ctx, "top");
+		var fontSize = h - 6;
+		var font = core.ui._buildFont(fontSize);
+		var text = "显示隐藏";
+		var w = core.calWidth(ctx, text, font);
+		h += 4;
+		const squareSize = h - 6;
+
+		x -= w + squareSize + 26;
+
+		const border = 2;
+		core.fillRect(ctx, x, y, squareSize, squareSize, " #F5F5F5");
+		if (core.hasFlag("showHideItem")) {
+			core.fillRect(
+				ctx,
+				x + border,
+				y + border,
+				squareSize - 2 * border,
+				squareSize - 2 * border,
+				"lime"
+			);
+		}
+		core.fillText(ctx, text, x + squareSize + 2, y + 4, style, font);
+
+		var todo = function () {
+			core.setFlag("showHideItem", !core.getFlag("showHideItem", false));
+			if (core.status.event.id === "toolbox") core.plugin.drawToolbox();
+			else if (core.status.event.id === "equipbox")
+				core.plugin.drawEquipbox();
+		};
+		addUIEventListener(x, y, w, h, todo);
+	}
+
+	function drawItemListbox_setPageBtn(
+		ctx,
+		left,
+		right,
+		bottom,
+		r,
+		style,
+		lineWidth
+	) {
+		var offset = lineWidth / 2 + r;
+
+		var x = left + offset;
+		var y = bottom - offset;
+		var pos = (Math.sqrt(2) / 2) * (r - lineWidth / 2);
+		core.fillPolygon(
+			ctx,
+			[
+				[x - pos, y],
+				[x + pos - 2, y - pos],
+				[x + pos - 2, y + pos],
+			],
+			style
+		);
+		core.strokeCircle(ctx, x, y, r, style, lineWidth);
+		var todo = function () {
+			core.addItemListboxPage(-1);
+		};
+		addUIEventListener(x - r - 2, y - r - 2, r * 2 + 4, r * 2 + 4, todo);
+
+		x = right - offset;
+		core.fillPolygon(
+			ctx,
+			[
+				[x + pos, y],
+				[x - pos + 2, y - pos],
+				[x - pos + 2, y + pos],
+			],
+			style
+		);
+		core.strokeCircle(ctx, x, y, r, style, lineWidth);
+		var todo = function () {
+			core.addItemListboxPage(1);
+		};
+		addUIEventListener(x - r - 2, y - r - 2, r * 2 + 4, r * 2 + 4, todo);
+	}
+
+	this.clickItemFunc = function (id) {
+		var info = core.status.thisUIEventInfo;
+		if (!info) return;
+		if (info.select.id == id) return core.useSelectItemInBox();
+		info.select = {};
+		info.select.id = id;
+		core.setIndexAndSelect("index");
+		refreshBox();
+	};
+
+	this.clickOneEquipbox = function (id, type) {
+		var info = core.status.thisUIEventInfo;
+		if (!info) return;
+		if (info.select.id == id && info.select.type == type)
+			core.useSelectItemInBox();
+		else
+			core.status.thisUIEventInfo.select = {
+				id: id,
+				type: type,
+				action: "unload",
+			};
+		return refreshBox();
+	};
+
+	this.useSelectItemInBox = function () {
+		var info = core.status.thisUIEventInfo;
+		if (!info) return;
+		if (!info.select.id) return;
+		var id = info.select.id;
+		if (core.status.event.id == "toolbox") {
+			core.events.tryUseItem(id);
+			// core.closePanel();
+		} else if (core.status.event.id == "equipbox") {
+			var action = info.select.action || "load";
+			info.index = 1;
+			if (action == "load") {
+				var type = core.getEquipTypeById(id);
+				let equipClsid = core.material.items[id]?.equipCls;
+				let equipCls0 = core.material.items[core.getEquip(0)]?.equipCls;
+				let equipCls1 = core.material.items[core.getEquip(1)]?.equipCls;
+				if (equipClsid === "双手剑") {
+					core.unloadEquip(0, function () {
+						core.status.route.push("unEquip:" + 0);
+					});
+					core.unloadEquip(1, function () {
+						core.status.route.push("unEquip:" + 1);
+					});
+				}
+				if (
+					equipCls0 === "双手剑" &&
+					!(equipClsid === "饰品" || equipClsid === "护具")
+				) {
+					core.unloadEquip(0, function () {
+						core.status.route.push("unEquip:" + 0);
+					});
+				}
+				core.loadEquip(id, function () {
+					core.status.route.push("equip:" + id);
+					info.select.type = type;
+					core.setIndexAndSelect("select");
+					core.drawEquipbox();
+				});
+			} else {
+				var type = info.select.type;
+				core.unloadEquip(type, function () {
+					core.status.route.push("unEquip:" + type);
+					info.select.type = type;
+					info.select.action = "load";
+					core.setIndexAndSelect("select");
+					core.drawEquipbox();
+				});
+			}
+		}
+		core.updateStatusBar();
+	};
+
+	this.setIndexAndSelect = function (toChange) {
+		var info = core.status.thisUIEventInfo;
+		if (!info) return;
+		setPageItems(info.page);
+		var index = info.index || 1;
+		var items = info.pageItems;
+
+		info.select.action = null;
+		info.select.type = null;
+		if (toChange == "index") info.index = items.indexOf(info.select.id) + 1;
+		info.select.id = items[info.index - 1];
+	};
+
+	this.addItemListboxPage = function (num) {
+		var info = core.status.thisUIEventInfo;
+		if (!info) return;
+		var maxPage = info.maxPage || 1;
+		info.page = info.page || 1;
+		info.page += num;
+		if (info.page <= 0) info.page = maxPage;
+		if (info.page > maxPage) info.page = 1;
+		info.index = 1;
+		setPageItems(info.page);
+		core.setIndexAndSelect("select");
+		refreshBox();
+	};
+
+	this.addItemListboxIndex = function (num) {
+		var info = core.status.thisUIEventInfo;
+		if (!info) return;
+		var maxItem = info.maxItem || 0;
+		info.index = info.index || 0;
+		info.index += num;
+		if (info.index <= 0) info.index = 1;
+		if (info.index > maxItem) info.index = maxItem;
+		core.setIndexAndSelect("select");
+		refreshBox();
+	};
+
+	this.addEquipboxType = function (num) {
+		var info = core.status.thisUIEventInfo;
+		var type = info.select.type;
+		if (type == null && num > 0) info.select.type = 0;
+		else info.select.type = type + num;
+		var max = core.status.globalAttribute.equipName.length;
+		if (info.select.type >= max) {
+			info.select = {};
+			core.setIndexAndSelect("select");
+			return core.addItemListboxPage(0);
+		} else {
+			var m = Math.abs(info.select.type);
+			if (info.select.type < 0) info.select.type = max - m;
+			core.setIndexAndSelect("select");
+			refreshBox();
+			return;
+		}
+	};
+
+	core.actions._keyDownToolbox = function (keycode) {
+		if (!core.status.thisEventClickArea) return;
+		if (keycode == 37) {
+			// left
+			core.addItemListboxPage(-1);
+			return;
+		}
+		if (keycode == 38) {
+			// up
+			core.addItemListboxIndex(-1);
+			return;
+		}
+		if (keycode == 39) {
+			// right
+			core.addItemListboxPage(1);
+			return;
+		}
+		if (keycode == 40) {
+			// down
+			core.addItemListboxIndex(1);
+			return;
+		}
+	};
+
+	////// 工具栏界面时,放开某个键的操作 //////
+	core.actions._keyUpToolbox = function (keycode) {
+		if (keycode == 81) {
+			core.ui.closePanel();
+			if (core.isReplaying()) core.control._replay_equipbox();
+			else core.openEquipbox();
+			return;
+		}
+		if (keycode == 84 || keycode == 27 || keycode == 88) {
+			core.closePanel();
+			return;
+		}
+		if (keycode == 13 || keycode == 32 || keycode == 67) {
+			var info = core.status.thisUIEventInfo;
+			if (info.select) {
+				core.useSelectItemInBox();
+			}
+			return;
+		}
+	};
+
+	core.actions._keyDownEquipbox = function (keycode) {
+		if (!core.status.thisEventClickArea) return;
+		if (keycode == 37) {
+			// left
+			var info = core.status.thisUIEventInfo;
+			if (info.index != null) return core.addItemListboxPage(-1);
+			return core.addEquipboxType(-1);
+		}
+		if (keycode == 38) {
+			// up
+			var info = core.status.thisUIEventInfo;
+			if (info.index == 1) {
+				info.select.type = core.status.globalAttribute.equipName.length - 1;
+				core.setIndexAndSelect();
+				return refreshBox();
+			}
+			if (info.index) return core.addItemListboxIndex(-1);
+			return core.addEquipboxType(-1 * info.equips);
+		}
+		if (keycode == 39) {
+			// right
+			var info = core.status.thisUIEventInfo;
+			if (info.index != null) return core.addItemListboxPage(1);
+			return core.addEquipboxType(1);
+		}
+		if (keycode == 40) {
+			// down
+			var info = core.status.thisUIEventInfo;
+			if (info.index) return core.addItemListboxIndex(1);
+			return core.addEquipboxType(info.equips);
+		}
+	};
+
+	core.actions._keyUpEquipbox = function (keycode, altKey) {
+		if (altKey && keycode >= 48 && keycode <= 57) {
+			core.items.quickSaveEquip(keycode - 48);
+			return;
+		}
+		if (keycode == 84) {
+			core.ui.closePanel();
+			if (core.isReplaying()) core.control._replay_toolbox();
+			else core.openToolbox();
+			return;
+		}
+		if (keycode == 81 || keycode == 27 || keycode == 88) {
+			core.closePanel();
+			return;
+		}
+		if (keycode == 13 || keycode == 32 || keycode == 67) {
+			var info = core.status.thisUIEventInfo;
+			if (info.select) core.useSelectItemInBox();
+			return;
+		}
+	};
+
+	core.registerAction(
+		"ondown",
+		"inEventClickAction",
+		function (x, y, px, py) {
+			if (!core.status.thisEventClickArea) return false;
+			var info = core.status.thisEventClickArea;
+			for (var i = 0; i < info.length; i++) {
+				var obj = info[i];
+				if (
+					px >= obj.x &&
+					px <= obj.x + obj.width &&
+					py > obj.y &&
+					py < obj.y + obj.height
+				) {
+					if (obj.todo) obj.todo();
+					break;
+				}
+			}
+			return true;
+		},
+		51
+	);
+	core.registerAction(
+		"onclick",
+		"stopClick",
+		function () {
+			if (core.status.thisEventClickArea) return true;
+		},
+		51
+	);
+
+	function addUIEventListener(x, y, width, height, todo) {
+		if (!core.status.thisEventClickArea) return;
+		var obj = {
+			x: x,
+			y: y,
+			width: width,
+			height: height,
+			todo: todo,
+		};
+		core.status.thisEventClickArea.push(obj);
+	}
+
+	this.initThisEventInfo = function () {
+		core.status.thisUIEventInfo = {
+			page: 1,
+			select: {},
+		};
+		core.status.thisEventClickArea = [];
+	};
+
+	function refreshBox() {
+		if (!core.status.event.id) return;
+		if (core.status.event.id == "toolbox") core.drawToolbox();
+		else core.drawEquipbox();
+	}
+
+	core.ui.closePanel = function () {
+		if (core.status.hero && core.status.hero.flags) {
+			// 清除全部临时变量
+			Object.keys(core.status.hero.flags).forEach(function (name) {
+				if (name.startsWith("@temp@") || /^arg\d+$/.test(name)) {
+					delete core.status.hero.flags[name];
+				}
+			});
+		}
+		this.clearUI();
+		core.maps.generateGroundPattern();
+		core.updateStatusBar(true);
+		core.unlockControl();
+		core.status.event.data = null;
+		core.status.event.id = null;
+		core.status.event.selection = null;
+		core.status.event.ui = null;
+		core.status.event.interval = null;
+		core.status.thisUIEventInfo = null;
+		core.status.thisEventClickArea = null;
+	};
+
+	this.getItemClsName = function (item) {
+		if (item == null) return itemClsName;
+		if (item.cls == "equips") {
+			if (typeof item.equip.type == "string") return item.equip.type;
+			var type = core.getEquipTypeById(item.id);
+			return core.status.globalAttribute.equipName[type];
+		} else return itemClsName[item.cls] || item.cls;
+	};
+
+	core.events.openToolbox = function (fromUserAction) {
+		if (core.isReplaying()) return;
+		if (!this._checkStatus("toolbox", fromUserAction)) return;
+		core.initThisEventInfo();
+		let info = core.status.thisUIEventInfo;
+		info.index = 1;
+		core.setIndexAndSelect("select");
+		core.drawToolbox();
+	};
+
+	core.events.openEquipbox = function (fromUserAction) {
+		if (core.isReplaying()) return;
+		if (!this._checkStatus("equipbox", fromUserAction)) return;
+		core.initThisEventInfo();
+		let info = core.status.thisUIEventInfo;
+		info.select.type = 0;
+		core.setIndexAndSelect("select");
+		core.drawEquipbox();
+	};
+
+	core.control._replay_toolbox = function () {
+		if (!core.isPlaying() || !core.isReplaying()) return;
+		if (!core.status.replay.pausing) return core.drawTip("请先暂停录像");
+		if (core.isMoving() || core.status.replay.animate || core.status.event.id)
+			return core.drawTip("请等待当前事件的处理结束");
+
+		core.lockControl();
+		core.status.event.id = "toolbox";
+		core.drawToolbox();
+	};
+
+	core.control._replay_equipbox = function () {
+		if (!core.isPlaying() || !core.isReplaying()) return;
+		if (!core.status.replay.pausing) return core.drawTip("请先暂停录像");
+		if (core.isMoving() || core.status.replay.animate || core.status.event.id)
+			return core.drawTip("请等待当前事件的处理结束");
+
+		core.lockControl();
+		core.status.event.id = "equipbox";
+		core.drawEquipbox();
+	};
+
+	core.control._replayAction_item = function (action) {
+		if (action.indexOf("item:") != 0) return false;
+		var itemId = action.substring(5);
+		if (!core.canUseItem(itemId)) return false;
+		if (
+			core.material.items[itemId].hideInReplay ||
+			core.status.replay.speed == 24
+		) {
+			core.useItem(itemId, false, core.replay);
+			return true;
+		}
+		core.status.event.id = "toolbox";
+		core.initThisEventInfo();
+		var info = core.status.thisUIEventInfo;
+		var items = core.getToolboxItems(
+			"all",
+			core.getFlag("showHideItem", false)
+		);
+		setPageItems(1);
+		var index = items.indexOf(itemId) + 1;
+		info.page = Math.ceil(index / info.maxItem);
+		info.index = index % info.maxItem || info.maxItem;
+		core.setIndexAndSelect("select");
+		setPageItems(info.page);
+		core.drawToolbox();
+		setTimeout(function () {
+			core.ui.closePanel();
+			core.useItem(itemId, false, core.replay);
+		}, core.control.__replay_getTimeout());
+		return true;
+	};
+
+	core.control._replayAction_equip = function (action) {
+		if (action.indexOf("equip:") != 0) return false;
+		var itemId = action.substring(6);
+		var items = core.getToolboxItems(
+			"equips",
+			core.getFlag("showHideItem", false)
+		);
+		var index = items.indexOf(itemId) + 1;
+		if (index < 1) {
+			core.removeFlag("__doNotCheckAutoEvents__");
+			return false;
+		}
+
+		var cb = function () {
+			var next = core.status.replay.toReplay[0] || "";
+			if (!next.startsWith("equip:") && !next.startsWith("unEquip:")) {
+				core.removeFlag("__doNotCheckAutoEvents__");
+				core.checkAutoEvents();
+			}
+			core.replay();
+		};
+		core.setFlag("__doNotCheckAutoEvents__", true);
+
+		core.status.route.push(action);
+		if (
+			core.material.items[itemId].hideInReplay ||
+			core.status.replay.speed == 24
+		) {
+			core.loadEquip(itemId, cb);
+			return true;
+		}
+		core.status.event.id = "equipbox";
+		core.initThisEventInfo();
+		var info = core.status.thisUIEventInfo;
+		setPageItems(1);
+		info.page = Math.ceil(index / info.maxItem);
+		info.index = index % info.maxItem || info.maxItem;
+		core.setIndexAndSelect("select");
+		setPageItems(info.page);
+		core.drawEquipbox();
+		setTimeout(function () {
+			core.ui.closePanel();
+			core.loadEquip(itemId, cb);
+		}, core.control.__replay_getTimeout());
+		return true;
+	};
+
+	core.control._replayAction_unEquip = function (action) {
+		if (action.indexOf("unEquip:") != 0) return false;
+		var equipType = parseInt(action.substring(8));
+		if (!core.isset(equipType)) {
+			core.removeFlag("__doNotCheckAutoEvents__");
+			return false;
+		}
+
+		var cb = function () {
+			var next = core.status.replay.toReplay[0] || "";
+			if (!next.startsWith("equip:") && !next.startsWith("unEquip:")) {
+				core.removeFlag("__doNotCheckAutoEvents__");
+				core.checkAutoEvents();
+			}
+			core.replay();
+		};
+		core.setFlag("__doNotCheckAutoEvents__", true);
+
+		core.status.route.push(action);
+		if (core.status.replay.speed == 24) {
+			core.unloadEquip(equipType, cb);
+			return true;
+		}
+		core.status.event.id = "equipbox";
+		core.initThisEventInfo();
+		var info = core.status.thisUIEventInfo;
+		setPageItems(1);
+		info.select.type = equipType;
+		core.setIndexAndSelect();
+		core.drawEquipbox();
+		setTimeout(function () {
+			core.ui.closePanel();
+			core.unloadEquip(equipType, cb);
+		}, core.control.__replay_getTimeout());
+		return true;
+	};
+	core.registerReplayAction("item", core.control._replayAction_item);
+	core.registerReplayAction("equip", core.control._replayAction_equip);
+	core.registerReplayAction("unEquip", core.control._replayAction_unEquip);
+},
     "技能树": function () {
     // 在此增加新插件
     //
@@ -23679,5 +23667,242 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 
 		ctx.restore(); //恢复变换前的坐标,否则将连续转置
 	}
+},
+    "scrollingText": function () {
+	// 本插件用于绘制在线留言
+	// 说明:https://h5mota.com/bbs/thread/?tid=1017
+	// 目前使用core.http代替帖子中提到的axios
+	////// 绘制提示同时播放成功音效 //////
+	ui.prototype.drawSuccessTip = function (text, id, frame) {
+		this.drawTip(text, id, frame);
+		core.playSound('gem.mp3');
+	}
+	core.plugin.aniMap = new Map()
+	////// 绘制提示同时播放错误音效 //////
+	ui.prototype.drawFailTip = function (text, id, frame) {
+		this.drawTip(text, id, frame);
+		core.playSound('error.mp3');
+	}
+	/** 塔的英文名 */
+	const towerName = core.firstData.name;
+
+	let [W, H] = [core.__SIZE__, core.__SIZE__];
+	let [WIDTH, HEIGHT] = [core.__PIXELS__, core.__PIXELS__];
+
+	//#region 弹幕的收发
+	this.getComment = function () {
+		if (core.isReplaying()) return;
+		let form = new FormData();
+		form.append('type', 1);
+		form.append('towername', towerName);
+		utils.prototype.http(
+			'POST',
+			'https://h5mota.com/backend/tower/barrage.php',
+			form,
+			function (res) {
+				try {
+					res = JSON.parse(res);
+					console.log(res);
+					core.drawTip('接收成功!')
+					core.playSound('item.mp3');
+					let commentCollection = {};
+					const commentList = res?.list;
+					const isEmpty = /^\s*$/;
+					for (let i = 0, l = commentList.length; i <= l - 1; i++) {
+						if (isEmpty.test(commentList[i]?.comment)) continue;
+						const commentTagsList = commentList[i].tags.split(',');
+						const [cFloorId, cX, cY] = commentTagsList;
+						if (0 <= cX && cX <= W - 1 && 0 <= cY && cY <= H - 1 && core.floorIds.includes(cFloorId)) {
+							if (!commentCollection.hasOwnProperty(cFloorId)) { commentCollection[cFloorId] = {}; }
+							const str = cX + ',' + cY;
+							if (!commentCollection[cFloorId].hasOwnProperty(str)) { commentCollection[cFloorId][str] = []; }
+							commentCollection[cFloorId][str].push(commentList[i]?.comment);
+						}
+					}
+					core.setFlag('commentCollection', commentCollection);
+				} catch (err) {
+					core.drawFailTip('接收失败!' + err.message);
+				}
+			},
+			function (err) {
+				err = JSON.parse(err);
+				console.error(err);
+				core.drawFailTip('接收失败' + err?.message);
+			},
+			null, null, null, 1000
+		);
+	}
+
+	this.postComment = function (comment, tags) {
+		if (core.isReplaying()) return;
+		const isEmpty = /^\s*$/;
+		if (isEmpty.test(comment)) {
+			core.drawFailTip('您输入的消息为空,请重发!');
+			return;
+		}
+		let form = new FormData();
+		form.append('type', 2);
+		form.append('towername', towerName);
+		form.append('comment', comment);
+		form.append('tags', tags);
+		form.append('userid', 2324);
+		form.append('password', '77c8fd5ff49c370342e4472ebdda5903');
+		utils.prototype.http(
+			'POST',
+			'https://h5mota.com/backend/tower/barrage.php',
+			form,
+			function (res) {
+				try {
+					res = JSON.parse(res);
+					console.log(res);
+					if (res?.code === 0) {
+						core.drawTip('提交成功!')
+					} else {
+						core.drawTip('提交失败!' + res?.message);
+					}
+				} catch (err) {
+					core.drawFailTip('提交失败!' + err.message);
+				}
+			},
+			function (err) {
+				err = JSON.parse(err);
+				console.error(err);
+				core.drawFailTip('提交失败!' + err?.message);
+			},
+			null, null, null, 1000
+		);
+	}
+	//#endregion
+
+	/** 若变量comment为真,在每层切换时在地上有弹幕的地方显示相应图标。 */
+	this.drawCommentSign = function () {
+		if (!core.hasFlag('comment') || core.isReplaying()) return;
+		let commentCollection = core.getFlag('commentCollection', {}),
+			floorId = core.status.floorId;
+		core.createCanvas('sign', 0, 0, WIDTH, HEIGHT, 61);
+		core.setOpacity('sign', 0.6);
+		if (commentCollection.hasOwnProperty(floorId)) {
+			for (let pos in commentCollection[floorId]) {
+				const l = commentCollection[floorId][pos].length;
+				for (let i = 0; i <= l - 1; i++) {
+					const [x, y] = pos.split(',');
+					core.drawIcon('sign', 'postman', 32 * x, 32 * y);
+					break;
+				}
+			}
+		}
+	}
+
+	/** 立即清除楼层的弹幕图标。关闭弹幕相关设置时调用。 */
+	this.clearCommentSign = function () {
+		core.deleteCanvas('sign');
+	}
+
+	/** 默认一次显示的弹幕数 */
+	const showNum = 5;
+
+	// 每走一步或瞬移,调用该函数,若目标点有弹幕,显示之
+	this.showComment = function (x, y) {
+		if (!core.getFlag('comment') || core.isReplaying()) return;
+		const commentCollection = core.getFlag('commentCollection', {});
+		const floorId = core.status.floorId,
+			str = x + ',' + y;
+		if (commentCollection.hasOwnProperty(floorId) &&
+			commentCollection[floorId].hasOwnProperty(str)) {
+			let commentArr = commentCollection[floorId][str].concat();
+			const commentArrPicked = pickComment(commentArr, showNum);
+			drawComment(commentArrPicked);
+		}
+	}
+
+	/** 返回从commentArr中挑选showNum个comment组成的数组*/
+	function pickComment(commentArr, showNum) {
+		let showList = [];
+		if (commentArr.length <= showNum) {
+			showList = commentArr;
+		} else {
+			for (let i = 0; i <= showNum - 1; i++) {
+				const l = commentArr.length,
+					n = core.plugin.dice(l - 1);
+				showList.push(commentArr[n]);
+				commentArr.splice(n, 1);
+			}
+		}
+		return showList;
+	}
+
+	function drawComment(commentArr) {
+		const l = commentArr.length;
+		let yList = generateCommentYList(20, HEIGHT - 20, showNum);
+		if (l < showNum) yList = getRandomElements(yList, l);
+		for (let i = 0; i <= l - 1; i++) {
+			drawCommentStr(commentArr[i], WIDTH + 20 * Math.random(),
+				yList[i], Math.random() * 0.1 + 0.1);
+		}
+	}
+
+	/** 生成count个随机数,范围从min到max,作为弹幕的y坐标*/
+	function generateCommentYList(min, max, count) {
+		let yList = Array(count).fill(0);
+		const distance = (max - min) / (count + 1);
+		for (let i = 0; i < count; i++) {
+			yList[i] = min + distance * (i + 1) + (Math.random() - 0.5) * (distance / 2);
+		}
+		return yList;
+	}
+
+	function getRandomElements(arr, count) {
+		let result = [...arr];
+		let len = result.length;
+		count = Math.min(len, count);
+
+		for (let i = len - 1; i > len - 1 - count; i--) {
+			let j = Math.floor(Math.random() * (i + 1));
+			[result[i], result[j]] = [result[j], result[i]];
+		}
+
+		return result.slice(len - count);
+	}
+
+	//#region 弹幕绘制部分
+	const { Animation, linear, Ticker } = core.plugin.animate ?? {};
+	const ctxName = 'scrollingText';
+
+	if (Ticker) {
+		const ticker = new Ticker();
+		ticker.add(() => {
+			if (core.isReplaying()) return;
+			core.createCanvas(ctxName, 0, 0, core.__PIXELS__, core.__PIXELS__, 136); //每帧重绘该画布
+		});
+	}
+
+	/**
+	 * 绘制弹幕 
+	 * @example  
+	 * drawCommentStr('OK', 450, 200, 0.1);
+	 * @param {string} content 弹幕的内容
+	 * @param {number} x 弹幕的初始x坐标
+	 * @param {number} y 弹幕的初始y坐标
+	 * @param {number} vx 弹幕的横向滚动速度
+	 */
+	function drawCommentStr(content, x, y, vx) {
+		if (core.isReplaying() || !Animation) return;
+		const ani = new Animation();
+		core.plugin.aniMap.set(ani, (ani) => ani.ticker.destroy());
+		ani.ticker.add(() => {
+			core.fillText(ctxName, content, x + ani.x, y, 'white', '16px Verdana');
+		})
+		// 弹幕的最大长度5600,再长属于异常数据
+		const aim = 600 + Math.min(core.calWidth(ctxName, content, '16px Verdana'), 5000);
+		ani.mode(linear())
+			.time(aim / vx)
+			.absolute()
+			.move(-aim, 0)
+		ani.all().then(() => {
+			ani.ticker.destroy();
+		});
+	}
+	//#endregion 
+
 }
 }
\ No newline at end of file

From 8d45c38f628b2e4f127350c37b58920479250f69 Mon Sep 17 00:00:00 2001
From: strawberry42271 <2806566736@qq.com>
Date: Sun, 16 Mar 2025 19:15:39 +0800
Subject: [PATCH 3/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=BB=91=E5=88=87?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 project/functions.js |    2 +-
 project/items.js     |   56 +-
 project/plugins.js   | 2500 +++++++++++++++++++++---------------------
 3 files changed, 1306 insertions(+), 1252 deletions(-)

diff --git a/project/functions.js b/project/functions.js
index 9727b82..86bb8ab 100644
--- a/project/functions.js
+++ b/project/functions.js
@@ -2063,7 +2063,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
 			core.status.hero.statistics.poisonDamage += damage;
 			core.status.hero.hp -= damage;
 		}
-		core.showComment(nowx, nowy)
+		core.showComment(x, y)
 		core.clearMap("hero");
 		if (
 			core.bigmap.width * 32 === core.bigmap.height * 32 &&
diff --git a/project/items.js b/project/items.js
index b437a50..be81f6f 100644
--- a/project/items.js
+++ b/project/items.js
@@ -605,6 +605,60 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a =
 		"canUseItemEffect": "true",
 		"text": "可以发送和接收在线留言。",
 		"hideInToolbox": true,
-		"hideInReplay": true
+		"hideInReplay": true,
+		"useItemEvent": [
+			{
+				"type": "while",
+				"condition": "true",
+				"data": [
+					{
+						"type": "choices",
+						"text": "本功能需要您在h5mota.com在线游玩并处于登录状态时使用,可以发送和接受留言。\n发言后需要选择\"获取最新留言\"才能看到自己新发的留言。",
+						"choices": [
+							{
+								"text": "地图上显示在线留言:${flag:comment?'开':'关'}",
+								"icon": "postman",
+								"action": [
+									{
+										"type": "function",
+										"function": "function(){\nif (core.hasFlag('comment')) {\n\tcore.setFlag('comment', false);\n\tcore.plugin.clearCommentSign();\n} else {\n\tcore.setFlag('comment', true);\n\tcore.plugin.drawCommentSign();\n}\n}"
+									}
+								]
+							},
+							{
+								"text": "写留言",
+								"action": [
+									{
+										"type": "input2",
+										"text": "请输入要发送的评论,文明友善发言,拒绝放假、剧透。"
+									},
+									{
+										"type": "function",
+										"function": "function(){\nconst input = core.getFlag('input', '');\nconst tags = [core.status.floorId,\n\tcore.getHeroLoc().x.toString(), core.getHeroLoc().y.toString()\n]\nif (!core.isReplaying()) {\n\tcore.plugin.postComment(input, tags);\n}\n}"
+									}
+								]
+							},
+							{
+								"text": "获取最新留言",
+								"action": [
+									{
+										"type": "function",
+										"function": "function(){\nif (!core.isReplaying()) {\n\tcore.plugin.getComment();\n\tsetTimeout(core.plugin.drawCommentSign, 1000);\n}\n}"
+									}
+								]
+							},
+							{
+								"text": "退出",
+								"action": [
+									{
+										"type": "exit"
+									}
+								]
+							}
+						]
+					}
+				]
+			}
+		]
 	}
 }
\ No newline at end of file
diff --git a/project/plugins.js b/project/plugins.js
index 5f97d09..4f1b9ae 100644
--- a/project/plugins.js
+++ b/project/plugins.js
@@ -13653,1130 +13653,1130 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
     };
   },
     "楼传": function () {
-    // 在此增加新插件
+	// 在此增加新插件
 
-    core.canMoveFloor = function () {
-      let canmove = false;
-      core.status.thisMap.blocks.forEach((block) => {
-        if (
-          !block.disable &&
-          (block.event.id == "upFloor" || block.event.id == "downFloor")
-        ) {
-          let automaticRoute = core.automaticRoute(block.x, block.y);
-          if (!core.flags.flyNearStair || automaticRoute.length > 0) {
-            let loc = automaticRoute.pop();
-            loc = automaticRoute.pop();
-            if (core.canMoveDirectly(loc?.x, loc?.y) >= 0 || !loc) {
-              canmove = true;
-            }
-          }
-        }
-      });
-      return canmove;
-    };
-    ui.prototype._drawViewMaps_drawHint = function () {
-      core.playSound("打开界面");
-    };
+	core.canMoveFloor = function () {
+		let canmove = false;
+		core.status.thisMap.blocks.forEach((block) => {
+			if (
+				!block.disable &&
+				(block.event.id == "upFloor" || block.event.id == "downFloor")
+			) {
+				let automaticRoute = core.automaticRoute(block.x, block.y);
+				if (!core.flags.flyNearStair || automaticRoute.length > 0) {
+					let loc = automaticRoute.pop();
+					loc = automaticRoute.pop();
+					if (core.canMoveDirectly(loc?.x, loc?.y) >= 0 || !loc) {
+						canmove = true;
+					}
+				}
+			}
+		});
+		return canmove;
+	};
+	ui.prototype._drawViewMaps_drawHint = function () {
+		core.playSound("打开界面");
+	};
 
-    ////// 绘制浏览地图界面 //////
-    ui.prototype._drawViewMaps = function (index, x, y) {
-      core.lockControl();
+	////// 绘制浏览地图界面 //////
+	ui.prototype._drawViewMaps = function (index, x, y) {
+		core.lockControl();
 
-      core.clearMap("data");
-      core.status.event.id = "viewMaps";
-      this.clearUI();
-      //console.log(index)
-      if (index == null) index = core.floorIds.indexOf(core.status.floorId);
-      core.animateFrame.tip = null;
-      core.status.checkBlock.cache = {};
-      let data = this._drawViewMaps_buildData(index, x, y);
-      core.drawWindowSkin("winskin1.webp", "ui", 0, 0, 416, 416);
-      let page = core.status.event.data.index;
-      let floorId = core.status.event.data.floorId;
-      core.ui.statusBar._update_map(floorId);
-      const bfs = core.plugin.bfsSearch(floorId, 1, true);
-      const mapdir = bfs.mapdir[floorId];
-      core.setTextAlign("ui", "center");
-      let size = (core.__PIXELS__ * 3) / 4; //312
-      const areas = core.getFlag("areas");
+		core.clearMap("data");
+		core.status.event.id = "viewMaps";
+		this.clearUI();
+		//console.log(index)
+		if (index == null) index = core.floorIds.indexOf(core.status.floorId);
+		core.animateFrame.tip = null;
+		core.status.checkBlock.cache = {};
+		let data = this._drawViewMaps_buildData(index, x, y);
+		core.drawWindowSkin("winskin1.webp", "ui", 0, 0, 416, 416);
+		let page = core.status.event.data.index;
+		let floorId = core.status.event.data.floorId;
+		core.ui.statusBar._update_map(floorId);
+		const bfs = core.plugin.bfsSearch(floorId, 1, true);
+		const mapdir = bfs.mapdir[floorId];
+		core.setTextAlign("ui", "center");
+		let size = (core.__PIXELS__ * 3) / 4; //312
+		const areas = core.getFlag("areas");
 
-      let i = areas.findIndex((v) => v.maps.includes(floorId));
-      core.fillRoundRect("ui", 15 - 2, 15 - 2, 35 + 4, 35 + 4, 4, "#444444");
-      core.strokeRoundRect(
-        "ui",
-        15 - 4,
-        15 - 4,
-        35 + 8,
-        35 + 8,
-        4,
-        "#444444",
-        1
-      );
-      core.fillBoldText1(
-        "ui",
-        "当前",
-        13 + 20,
-        17 + 20,
-        "#FFFFFF",
-        "#000000",
-        2,
-        this._buildFont(18, true)
-      );
+		let i = areas.findIndex((v) => v.maps.includes(floorId));
+		core.fillRoundRect("ui", 15 - 2, 15 - 2, 35 + 4, 35 + 4, 4, "#444444");
+		core.strokeRoundRect(
+			"ui",
+			15 - 4,
+			15 - 4,
+			35 + 8,
+			35 + 8,
+			4,
+			"#444444",
+			1
+		);
+		core.fillBoldText1(
+			"ui",
+			"当前",
+			13 + 20,
+			17 + 20,
+			"#FFFFFF",
+			"#000000",
+			2,
+			this._buildFont(18, true)
+		);
 
-      core.fillRoundRect(
-        "ui",
-        15 - 2,
-        15 - 2 + 35 + 8 + size + 8 - 54,
-        35 + 4,
-        35 + 4,
-        4,
-        "#444444"
-      );
-      core.strokeRoundRect(
-        "ui",
-        15 - 4,
-        15 - 4 + 35 + 8 + size + 8 - 54,
-        35 + 8,
-        35 + 8,
-        4,
-        "#444444",
-        1
-      );
-      if (
-        !core.status.maps[core.floorIds[page]].canFlyTo ||
-        !core.hasVisitedFloor(core.floorIds[page])
-      ) {
-        core.fillBoldText1(
-          "ui",
-          "预览",
-          13 + 20,
-          17 + 20 + 35 + 8 + size + 8 - 54,
-          "#909090",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      } else {
-        core.fillBoldText1(
-          "ui",
-          "传送",
-          13 + 20,
-          17 + 20 + 35 + 8 + size + 8 - 54,
-          "#909090",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      }
-      core.fillRoundRect(
-        "ui",
-        15 - 4 + size - 2 + 45,
-        15 - 2 + size - 4 + 45,
-        35 + 4,
-        35 + 4,
-        4,
-        "#444444"
-      );
-      core.strokeRoundRect(
-        "ui",
-        15 - 4 + size - 4 + 45,
-        15 - 4 + size - 4 + 45,
-        35 + 8,
-        35 + 8,
-        4,
-        "#444444",
-        1
-      );
-      core.fillBoldText1(
-        "ui",
-        "离开",
-        15 - 4 + size - 4 + 45 + 22,
-        15 - 4 + size - 4 + 45 + 26,
-        "#FFFFFF",
-        "#000000",
-        2,
-        this._buildFont(18, true)
-      );
+		core.fillRoundRect(
+			"ui",
+			15 - 2,
+			15 - 2 + 35 + 8 + size + 8 - 54,
+			35 + 4,
+			35 + 4,
+			4,
+			"#444444"
+		);
+		core.strokeRoundRect(
+			"ui",
+			15 - 4,
+			15 - 4 + 35 + 8 + size + 8 - 54,
+			35 + 8,
+			35 + 8,
+			4,
+			"#444444",
+			1
+		);
+		if (
+			!core.status.maps[core.floorIds[page]].canFlyTo ||
+			!core.hasVisitedFloor(core.floorIds[page])
+		) {
+			core.fillBoldText1(
+				"ui",
+				"预览",
+				13 + 20,
+				17 + 20 + 35 + 8 + size + 8 - 54,
+				"#909090",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		} else {
+			core.fillBoldText1(
+				"ui",
+				"传送",
+				13 + 20,
+				17 + 20 + 35 + 8 + size + 8 - 54,
+				"#909090",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		}
+		core.fillRoundRect(
+			"ui",
+			15 - 4 + size - 2 + 45,
+			15 - 2 + size - 4 + 45,
+			35 + 4,
+			35 + 4,
+			4,
+			"#444444"
+		);
+		core.strokeRoundRect(
+			"ui",
+			15 - 4 + size - 4 + 45,
+			15 - 4 + size - 4 + 45,
+			35 + 8,
+			35 + 8,
+			4,
+			"#444444",
+			1
+		);
+		core.fillBoldText1(
+			"ui",
+			"离开",
+			15 - 4 + size - 4 + 45 + 22,
+			15 - 4 + size - 4 + 45 + 26,
+			"#FFFFFF",
+			"#000000",
+			2,
+			this._buildFont(18, true)
+		);
 
-      core.fillRoundRect(
-        "ui",
-        15 + 44 - 2,
-        15 - 2,
-        size + 4 - 58,
-        35 + 4,
-        4,
-        "#444444"
-      );
-      core.strokeRoundRect(
-        "ui",
-        15 + 44 - 4,
-        15 - 4,
-        size + 8 - 58,
-        35 + 8,
-        4,
-        "#444444",
-        1
-      );
-      if (mapdir.includes("up")) {
-        core.fillBoldText1(
-          "ui",
-          "北▲",
-          30 + 145 + 10,
-          17 + 20,
-          "#FFFFFF",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      } else {
-        core.fillBoldText1(
-          "ui",
-          "北▲",
-          30 + 145 + 10,
-          17 + 20,
-          "#909090",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      }
+		core.fillRoundRect(
+			"ui",
+			15 + 44 - 2,
+			15 - 2,
+			size + 4 - 58,
+			35 + 4,
+			4,
+			"#444444"
+		);
+		core.strokeRoundRect(
+			"ui",
+			15 + 44 - 4,
+			15 - 4,
+			size + 8 - 58,
+			35 + 8,
+			4,
+			"#444444",
+			1
+		);
+		if (mapdir.includes("up")) {
+			core.fillBoldText1(
+				"ui",
+				"北▲",
+				30 + 145 + 10,
+				17 + 20,
+				"#FFFFFF",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		} else {
+			core.fillBoldText1(
+				"ui",
+				"北▲",
+				30 + 145 + 10,
+				17 + 20,
+				"#909090",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		}
 
-      core.fillRoundRect(
-        "ui",
-        15 - 2,
-        59 - 2,
-        35 + 4,
-        size + 4 - 58,
-        4,
-        "#444444"
-      );
-      core.strokeRoundRect(
-        "ui",
-        15 - 4,
-        59 - 4,
-        35 + 8,
-        size + 8 - 58,
-        4,
-        "#444444",
-        1
-      );
-      if (mapdir.includes("left")) {
-        core.fillBoldText1(
-          "ui",
-          "西",
-          15 + 17,
-          25 + 150,
-          "#FFFFFF",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-        core.fillBoldText1(
-          "ui",
-          "◀",
-          15 + 17,
-          45 + 150,
-          "#FFFFFF",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      } else {
-        core.fillBoldText1(
-          "ui",
-          "西",
-          15 + 17,
-          25 + 150,
-          "#909090",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-        core.fillBoldText1(
-          "ui",
-          "◀",
-          15 + 17,
-          45 + 150,
-          "#909090",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      }
-      core.fillRoundRect(
-        "ui",
-        15 + 44 - 2,
-        15 - 2 + size - 4,
-        size + 4 - 58,
-        35 + 4,
-        4,
-        "#444444"
-      );
-      core.strokeRoundRect(
-        "ui",
-        15 + 44 - 4,
-        15 - 4 + size - 4,
-        size + 8 - 58,
-        35 + 8,
-        4,
-        "#444444",
-        1
-      );
-      if (mapdir.includes("down")) {
-        core.fillBoldText1(
-          "ui",
-          "南▼",
-          30 + 145 + 10,
-          17 + 20 + size - 4,
-          "#FFFFFF",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      } else {
-        core.fillBoldText1(
-          "ui",
-          "南▼",
-          30 + 145 + 10,
-          17 + 20 + size - 4,
-          "#909090",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      }
+		core.fillRoundRect(
+			"ui",
+			15 - 2,
+			59 - 2,
+			35 + 4,
+			size + 4 - 58,
+			4,
+			"#444444"
+		);
+		core.strokeRoundRect(
+			"ui",
+			15 - 4,
+			59 - 4,
+			35 + 8,
+			size + 8 - 58,
+			4,
+			"#444444",
+			1
+		);
+		if (mapdir.includes("left")) {
+			core.fillBoldText1(
+				"ui",
+				"西",
+				15 + 17,
+				25 + 150,
+				"#FFFFFF",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+			core.fillBoldText1(
+				"ui",
+				"◀",
+				15 + 17,
+				45 + 150,
+				"#FFFFFF",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		} else {
+			core.fillBoldText1(
+				"ui",
+				"西",
+				15 + 17,
+				25 + 150,
+				"#909090",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+			core.fillBoldText1(
+				"ui",
+				"◀",
+				15 + 17,
+				45 + 150,
+				"#909090",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		}
+		core.fillRoundRect(
+			"ui",
+			15 + 44 - 2,
+			15 - 2 + size - 4,
+			size + 4 - 58,
+			35 + 4,
+			4,
+			"#444444"
+		);
+		core.strokeRoundRect(
+			"ui",
+			15 + 44 - 4,
+			15 - 4 + size - 4,
+			size + 8 - 58,
+			35 + 8,
+			4,
+			"#444444",
+			1
+		);
+		if (mapdir.includes("down")) {
+			core.fillBoldText1(
+				"ui",
+				"南▼",
+				30 + 145 + 10,
+				17 + 20 + size - 4,
+				"#FFFFFF",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		} else {
+			core.fillBoldText1(
+				"ui",
+				"南▼",
+				30 + 145 + 10,
+				17 + 20 + size - 4,
+				"#909090",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		}
 
-      core.fillRoundRect(
-        "ui",
-        15 - 2 + size - 4,
-        59 - 2,
-        35 + 4,
-        size + 4 - 58,
-        4,
-        "#444444"
-      );
-      core.strokeRoundRect(
-        "ui",
-        15 - 4 + size - 4,
-        59 - 4,
-        35 + 8,
-        size + 8 - 58,
-        4,
-        "#444444",
-        1
-      );
-      if (mapdir.includes("right")) {
-        core.fillBoldText1(
-          "ui",
-          "东",
-          15 + 17 + size - 4,
-          25 + 150,
-          "#FFFFFF",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-        core.fillBoldText1(
-          "ui",
-          "▶",
-          15 + 17 + size - 4,
-          45 + 150,
-          "#FFFFFF",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      } else {
-        core.fillBoldText1(
-          "ui",
-          "东",
-          15 + 17 + size - 4,
-          25 + 150,
-          "#909090",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-        core.fillBoldText1(
-          "ui",
-          "▶",
-          15 + 17 + size - 4,
-          45 + 150,
-          "#909090",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      }
-      core.fillRoundRect(
-        "ui",
-        60 - 2,
-        60 - 2,
-        size - 58 + 4,
-        size - 58 + 4,
-        4,
-        "#444444"
-      );
-      core.strokeRoundRect(
-        "ui",
-        60 - 4,
-        60 - 4,
-        size - 58 + 8,
-        size - 58 + 8,
-        4,
-        "#444444",
-        1
-      );
-      core.drawThumbnail(floorId, null, {
-        damage: data.damage,
-        ctx: "ui",
-        x: 58,
-        y: 58,
-        size: 0.62,
-        all: data.all,
-      });
-      if (
-        !core.status.maps[core.floorIds[page]].canFlyTo ||
-        !core.hasVisitedFloor(core.floorIds[page])
-      ) {
-        /*core.fillRect("ui", 58,
+		core.fillRoundRect(
+			"ui",
+			15 - 2 + size - 4,
+			59 - 2,
+			35 + 4,
+			size + 4 - 58,
+			4,
+			"#444444"
+		);
+		core.strokeRoundRect(
+			"ui",
+			15 - 4 + size - 4,
+			59 - 4,
+			35 + 8,
+			size + 8 - 58,
+			4,
+			"#444444",
+			1
+		);
+		if (mapdir.includes("right")) {
+			core.fillBoldText1(
+				"ui",
+				"东",
+				15 + 17 + size - 4,
+				25 + 150,
+				"#FFFFFF",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+			core.fillBoldText1(
+				"ui",
+				"▶",
+				15 + 17 + size - 4,
+				45 + 150,
+				"#FFFFFF",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		} else {
+			core.fillBoldText1(
+				"ui",
+				"东",
+				15 + 17 + size - 4,
+				25 + 150,
+				"#909090",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+			core.fillBoldText1(
+				"ui",
+				"▶",
+				15 + 17 + size - 4,
+				45 + 150,
+				"#909090",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		}
+		core.fillRoundRect(
+			"ui",
+			60 - 2,
+			60 - 2,
+			size - 58 + 4,
+			size - 58 + 4,
+			4,
+			"#444444"
+		);
+		core.strokeRoundRect(
+			"ui",
+			60 - 4,
+			60 - 4,
+			size - 58 + 8,
+			size - 58 + 8,
+			4,
+			"#444444",
+			1
+		);
+		core.drawThumbnail(floorId, null, {
+			damage: data.damage,
+			ctx: "ui",
+			x: 58,
+			y: 58,
+			size: 0.62,
+			all: data.all,
+		});
+		if (
+			!core.status.maps[core.floorIds[page]].canFlyTo ||
+			!core.hasVisitedFloor(core.floorIds[page])
+		) {
+			/*core.fillRect("ui", 58,
 				58,
 				size - 50,
 				size - 50, "rgba(0,0,0,0.5)")*/
-        core.getContextByName("ui").globalAlpha = 0.7;
+			core.getContextByName("ui").globalAlpha = 0.7;
 
-        core.drawImage(
-          "ui",
-          "miwu.webp",
-          0,
-          0,
-          size,
-          size,
-          58,
-          58,
-          size - 50,
-          size - 50
-        );
-        core.getContextByName("ui").globalAlpha = 1;
-        /*core.fillText("ui", '?', 188,
+			core.drawImage(
+				"ui",
+				"miwu.webp",
+				0,
+				0,
+				size,
+				size,
+				58,
+				58,
+				size - 50,
+				size - 50
+			);
+			core.getContextByName("ui").globalAlpha = 1;
+			/*core.fillText("ui", '?', 188,
 				278,
 				"rgba(255,255,255,0.2)", this._buildFont(250, true))*/
-      }
-      core.fillRoundRect(
-        "ui",
-        15 + 44 - 2,
-        60 - 2 + size - 4,
-        size + 4 - 58,
-        35 + 4,
-        4,
-        "#444444"
-      );
-      core.strokeRoundRect(
-        "ui",
-        15 + 44 - 4,
-        60 - 4 + size - 4,
-        size + 8 - 58,
-        35 + 8,
-        4,
-        "#444444",
-        1
-      );
-      core.fillBoldText1(
-        "ui",
-        core.status.maps[floorId].areas,
-        30 + 145 + 10,
-        17 + 65 + size - 4,
-        "#FFFFFF",
-        "#000000",
-        2,
-        this._buildFont(18, true)
-      );
-      core.fillRoundRect(
-        "ui",
-        15 - 2,
-        60 - 2 + size - 4,
-        35 + 4,
-        35 + 4,
-        4,
-        "#444444"
-      );
-      core.strokeRoundRect(
-        "ui",
-        15 - 4,
-        60 - 4 + size - 4,
-        35 + 8,
-        35 + 8,
-        4,
-        "#444444",
-        1
-      );
-      if (i === 0) {
-        core.fillBoldText1(
-          "ui",
-          "◀",
-          30,
-          17 + 65 + size - 4,
-          "#909090",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      } else {
-        core.fillBoldText1(
-          "ui",
-          "◀",
-          30,
-          17 + 65 + size - 4,
-          "#FFFFFF",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      }
-      core.fillRoundRect(
-        "ui",
-        15 - 2 + size - 4,
-        60 - 2 + size - 4,
-        35 + 4,
-        35 + 4,
-        4,
-        "#444444"
-      );
-      core.strokeRoundRect(
-        "ui",
-        15 - 4 + size - 4,
-        60 - 4 + size - 4,
-        35 + 8,
-        35 + 8,
-        4,
-        "#444444",
-        1
-      );
-      if (i === areas.length - 1) {
-        core.fillBoldText1(
-          "ui",
-          "▶",
-          30 + 300 + 10,
-          17 + 65 + size - 4,
-          "#909090",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      } else {
-        core.fillBoldText1(
-          "ui",
-          "▶",
-          30 + 300 + 10,
-          17 + 65 + size - 4,
-          "#FFFFFF",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      }
+		}
+		core.fillRoundRect(
+			"ui",
+			15 + 44 - 2,
+			60 - 2 + size - 4,
+			size + 4 - 58,
+			35 + 4,
+			4,
+			"#444444"
+		);
+		core.strokeRoundRect(
+			"ui",
+			15 + 44 - 4,
+			60 - 4 + size - 4,
+			size + 8 - 58,
+			35 + 8,
+			4,
+			"#444444",
+			1
+		);
+		core.fillBoldText1(
+			"ui",
+			core.status.maps[floorId].areas,
+			30 + 145 + 10,
+			17 + 65 + size - 4,
+			"#FFFFFF",
+			"#000000",
+			2,
+			this._buildFont(18, true)
+		);
+		core.fillRoundRect(
+			"ui",
+			15 - 2,
+			60 - 2 + size - 4,
+			35 + 4,
+			35 + 4,
+			4,
+			"#444444"
+		);
+		core.strokeRoundRect(
+			"ui",
+			15 - 4,
+			60 - 4 + size - 4,
+			35 + 8,
+			35 + 8,
+			4,
+			"#444444",
+			1
+		);
+		if (i === 0) {
+			core.fillBoldText1(
+				"ui",
+				"◀",
+				30,
+				17 + 65 + size - 4,
+				"#909090",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		} else {
+			core.fillBoldText1(
+				"ui",
+				"◀",
+				30,
+				17 + 65 + size - 4,
+				"#FFFFFF",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		}
+		core.fillRoundRect(
+			"ui",
+			15 - 2 + size - 4,
+			60 - 2 + size - 4,
+			35 + 4,
+			35 + 4,
+			4,
+			"#444444"
+		);
+		core.strokeRoundRect(
+			"ui",
+			15 - 4 + size - 4,
+			60 - 4 + size - 4,
+			35 + 8,
+			35 + 8,
+			4,
+			"#444444",
+			1
+		);
+		if (i === areas.length - 1) {
+			core.fillBoldText1(
+				"ui",
+				"▶",
+				30 + 300 + 10,
+				17 + 65 + size - 4,
+				"#909090",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		} else {
+			core.fillBoldText1(
+				"ui",
+				"▶",
+				30 + 300 + 10,
+				17 + 65 + size - 4,
+				"#FFFFFF",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		}
 
-      core.fillRoundRect(
-        "ui",
-        15 - 2 + size - 4,
-        15 - 2,
-        80 + 4,
-        35 + 4,
-        4,
-        "#444444"
-      );
-      core.strokeRoundRect(
-        "ui",
-        15 - 4 + size - 4,
-        15 - 4,
-        80 + 8,
-        35 + 8,
-        4,
-        "#444444",
-        1
-      );
-      if (mapdir.includes("upFloor")) {
-        core.fillBoldText1(
-          "ui",
-          "上楼",
-          30 + 320 + 10,
-          17 + 20,
-          "#FFFFFF",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      } else {
-        core.fillBoldText1(
-          "ui",
-          "上楼",
-          30 + 320 + 10,
-          17 + 20,
-          "#909090",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      }
-      core.fillRoundRect(
-        "ui",
-        15 - 2 + size - 4,
-        15 - 2 + size - 4,
-        80 + 4,
-        35 + 4,
-        4,
-        "#444444"
-      );
-      core.strokeRoundRect(
-        "ui",
-        15 - 4 + size - 4,
-        15 - 4 + size - 4,
-        80 + 8,
-        35 + 8,
-        4,
-        "#444444",
-        1
-      );
-      if (mapdir.includes("downFloor")) {
-        core.fillBoldText1(
-          "ui",
-          "下楼",
-          30 + 320 + 10,
-          17 + 20 + size - 4,
-          "#FFFFFF",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      } else {
-        core.fillBoldText1(
-          "ui",
-          "下楼",
-          30 + 320 + 10,
-          17 + 20 + size - 4,
-          "#909090",
-          "#000000",
-          2,
-          this._buildFont(18, true)
-        );
-      }
+		core.fillRoundRect(
+			"ui",
+			15 - 2 + size - 4,
+			15 - 2,
+			80 + 4,
+			35 + 4,
+			4,
+			"#444444"
+		);
+		core.strokeRoundRect(
+			"ui",
+			15 - 4 + size - 4,
+			15 - 4,
+			80 + 8,
+			35 + 8,
+			4,
+			"#444444",
+			1
+		);
+		if (mapdir.includes("upFloor")) {
+			core.fillBoldText1(
+				"ui",
+				"上楼",
+				30 + 320 + 10,
+				17 + 20,
+				"#FFFFFF",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		} else {
+			core.fillBoldText1(
+				"ui",
+				"上楼",
+				30 + 320 + 10,
+				17 + 20,
+				"#909090",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		}
+		core.fillRoundRect(
+			"ui",
+			15 - 2 + size - 4,
+			15 - 2 + size - 4,
+			80 + 4,
+			35 + 4,
+			4,
+			"#444444"
+		);
+		core.strokeRoundRect(
+			"ui",
+			15 - 4 + size - 4,
+			15 - 4 + size - 4,
+			80 + 8,
+			35 + 8,
+			4,
+			"#444444",
+			1
+		);
+		if (mapdir.includes("downFloor")) {
+			core.fillBoldText1(
+				"ui",
+				"下楼",
+				30 + 320 + 10,
+				17 + 20 + size - 4,
+				"#FFFFFF",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		} else {
+			core.fillBoldText1(
+				"ui",
+				"下楼",
+				30 + 320 + 10,
+				17 + 20 + size - 4,
+				"#909090",
+				"#000000",
+				2,
+				this._buildFont(18, true)
+			);
+		}
 
-      core.fillRoundRect(
-        "ui",
-        15 - 2 + size - 4 + 35 + 8,
-        59 - 2,
-        37 + 4,
-        (size - 58) / 2 + 4,
-        4,
-        "#444444"
-      );
-      core.strokeRoundRect(
-        "ui",
-        15 - 4 + size - 4 + 35 + 8,
-        59 - 4,
-        37 + 8,
-        (size - 58) / 2 + 8,
-        4,
-        "#444444",
-        1
-      );
-      const title = core.status.maps[floorId].title;
-      //const length = title.length
-      fillTextVertical(
-        "ui",
-        title,
-        15 - 4 + size - 4 + 45,
-        85,
-        core.hasVisitedFloor(floorId) ? "#FFFFFF" : "#444444",
-        "#000000",
-        18
-      );
-      //const uictx = main.dom.gameCanvas.ui.getContext('2d')
-      core.fillRoundRect(
-        "ui",
-        15 - 2 + size - 4 + 35 + 8,
-        59 - 2 + (size - 58) / 2 + 8,
-        37 + 4,
-        119 + 4,
-        4,
-        "#444444"
-      );
-      core.strokeRoundRect(
-        "ui",
-        15 - 4 + size - 4 + 35 + 8,
-        59 - 4 + (size - 58) / 2 + 8,
-        37 + 8,
-        119 + 8,
-        4,
-        "#444444",
-        1
-      );
-      if (core.getFlag("showEnemy")) {
-        fillTextVertical(
-          "ui",
-          "关闭漏怪检测",
-          15 - 4 + size - 4 + 45,
-          220,
-          "#FFFFFF",
-          "#000000",
-          18
-        );
-      } else {
-        fillTextVertical(
-          "ui",
-          "开启漏怪检测",
-          15 - 4 + size - 4 + 45,
-          220,
-          "#FFFFFF",
-          "#000000",
-          18
-        );
-      }
+		core.fillRoundRect(
+			"ui",
+			15 - 2 + size - 4 + 35 + 8,
+			59 - 2,
+			37 + 4,
+			(size - 58) / 2 + 4,
+			4,
+			"#444444"
+		);
+		core.strokeRoundRect(
+			"ui",
+			15 - 4 + size - 4 + 35 + 8,
+			59 - 4,
+			37 + 8,
+			(size - 58) / 2 + 8,
+			4,
+			"#444444",
+			1
+		);
+		const title = core.status.maps[floorId].title;
+		//const length = title.length
+		fillTextVertical(
+			"ui",
+			title,
+			15 - 4 + size - 4 + 45,
+			85,
+			core.hasVisitedFloor(floorId) ? "#FFFFFF" : "#444444",
+			"#000000",
+			18
+		);
+		//const uictx = main.dom.gameCanvas.ui.getContext('2d')
+		core.fillRoundRect(
+			"ui",
+			15 - 2 + size - 4 + 35 + 8,
+			59 - 2 + (size - 58) / 2 + 8,
+			37 + 4,
+			119 + 4,
+			4,
+			"#444444"
+		);
+		core.strokeRoundRect(
+			"ui",
+			15 - 4 + size - 4 + 35 + 8,
+			59 - 4 + (size - 58) / 2 + 8,
+			37 + 8,
+			119 + 8,
+			4,
+			"#444444",
+			1
+		);
+		if (core.getFlag("showEnemy")) {
+			fillTextVertical(
+				"ui",
+				"关闭漏怪检测",
+				15 - 4 + size - 4 + 45,
+				220,
+				"#FFFFFF",
+				"#000000",
+				18
+			);
+		} else {
+			fillTextVertical(
+				"ui",
+				"开启漏怪检测",
+				15 - 4 + size - 4 + 45,
+				220,
+				"#FFFFFF",
+				"#000000",
+				18
+			);
+		}
 
-      //uictx.fillTextVertical(title, 15 - 4 + size - 4 + 35 + 29, 25 + 150)
-      //fillTextVertical('ui', title, 15 - 4 + size - 4 + 35 + 29, 25 + 150, '#FFFFFF', this._buildFont(18, true))
-    };
+		//uictx.fillTextVertical(title, 15 - 4 + size - 4 + 35 + 29, 25 + 150)
+		//fillTextVertical('ui', title, 15 - 4 + size - 4 + 35 + 29, 25 + 150, '#FFFFFF', this._buildFont(18, true))
+	};
 
-    function fillTextVertical(name, text, x, y, style, boldstyle, fontsize) {
-      //竖向文字绘制
+	function fillTextVertical(name, text, x, y, style, boldstyle, fontsize) {
+		//竖向文字绘制
 
-      const ctx = core.ui.getContextByName(name);
-      if (!ctx) return;
-      const canvas = document.createElement("canvas");
-      const context = canvas.getContext("2d");
-      fontsize *= 3;
-      const length = text.length;
-      canvas.width = fontsize * 2;
-      canvas.height = fontsize * length * 2;
-      if (style) context.fillStyle = core.arrayToRGBA(style);
-      if (boldstyle) context.strokeStyle = core.arrayToRGBA(boldstyle);
-      context.lineWidth = 2;
-      if (fontsize) context.font = core.ui._buildFont(fontsize, true);
-      let arrText = text.split("");
+		const ctx = core.ui.getContextByName(name);
+		if (!ctx) return;
+		const canvas = document.createElement("canvas");
+		const context = canvas.getContext("2d");
+		fontsize *= 3;
+		const length = text.length;
+		canvas.width = fontsize * 2;
+		canvas.height = fontsize * length * 2;
+		if (style) context.fillStyle = core.arrayToRGBA(style);
+		if (boldstyle) context.strokeStyle = core.arrayToRGBA(boldstyle);
+		context.lineWidth = 2;
+		if (fontsize) context.font = core.ui._buildFont(fontsize, true);
+		let arrText = text.split("");
 
-      let arrWidth = arrText.map(function (letter) {
-        return context.measureText(letter).width;
-      });
+		let arrWidth = arrText.map(function (letter) {
+			return context.measureText(letter).width;
+		});
 
-      let align = context.textAlign;
+		let align = context.textAlign;
 
-      let baseline = context.textBaseline;
-      let sx = fontsize,
-        sy = fontsize * length;
-      if (align == "left") {
-        sx = sx + Math.max.apply(null, arrWidth) / 2;
-      } else if (align == "right") {
-        sx = sx - Math.max.apply(null, arrWidth) / 2;
-      }
+		let baseline = context.textBaseline;
+		let sx = fontsize,
+			sy = fontsize * length;
+		if (align == "left") {
+			sx = sx + Math.max.apply(null, arrWidth) / 2;
+		} else if (align == "right") {
+			sx = sx - Math.max.apply(null, arrWidth) / 2;
+		}
 
-      if (
-        baseline == "bottom" ||
-        baseline == "alphabetic" ||
-        baseline == "ideographic"
-      ) {
-        sy = sy - arrWidth[0] / 2;
-      } else if (baseline == "top" || baseline == "hanging") {
-        sy = sy + arrWidth[0] / 2;
-      }
+		if (
+			baseline == "bottom" ||
+			baseline == "alphabetic" ||
+			baseline == "ideographic"
+		) {
+			sy = sy - arrWidth[0] / 2;
+		} else if (baseline == "top" || baseline == "hanging") {
+			sy = sy + arrWidth[0] / 2;
+		}
 
-      context.textAlign = "center";
+		context.textAlign = "center";
 
-      context.textBaseline = "middle";
-      context.lineWidth = 6;
+		context.textBaseline = "middle";
+		context.lineWidth = 6;
 
-      // 开始逐字绘制
+		// 开始逐字绘制
 
-      arrText.forEach(function (letter, index) {
-        // 确定下一个字符的纵坐标位置
+		arrText.forEach(function (letter, index) {
+			// 确定下一个字符的纵坐标位置
 
-        context.strokeText(letter, sx, sy);
-        context.fillText(letter, sx, sy);
-        // 旋转坐标系还原成初始态
+			context.strokeText(letter, sx, sy);
+			context.fillText(letter, sx, sy);
+			// 旋转坐标系还原成初始态
 
-        context.setTransform(1, 0, 0, 1, 0, 0);
+			context.setTransform(1, 0, 0, 1, 0, 0);
 
-        // 确定下一个字符的纵坐标位置
+			// 确定下一个字符的纵坐标位置
 
-        var letterWidth = 54;
+			var letterWidth = 54;
 
-        sy = sy + letterWidth;
-      });
+			sy = sy + letterWidth;
+		});
 
-      // 水平垂直对齐方式还原
+		// 水平垂直对齐方式还原
 
-      context.textAlign = align;
+		context.textAlign = align;
 
-      context.textBaseline = baseline;
+		context.textBaseline = baseline;
 
-      //绘制到目标位置
-      ctx.drawImage(
-        canvas,
-        x,
-        y - (fontsize / 3) * length,
-        canvas.width / 3,
-        canvas.height / 3
-      );
-    }
+		//绘制到目标位置
+		ctx.drawImage(
+			canvas,
+			x,
+			y - (fontsize / 3) * length,
+			canvas.width / 3,
+			canvas.height / 3
+		);
+	}
 
-    ////// 点击楼层传送器时的打开操作 //////
-    events.prototype.useFly = function (fromUserAction) {
-      if (!core.isPlaying()) return;
-      if (!core.status.maps[core.status.floorId].canFlyFrom) {
-        core.drawTip(core.material.items["fly"].name + "好像失效了", "fly");
-        return;
-      }
-      // 从“浏览地图”页面:尝试直接传送到该层
-      if (core.status.event.id == "viewMaps") {
-        if (!core.hasItem("fly")) {
-          core.playSound("操作失败");
-          core.drawTip("你没有" + core.material.items["fly"].name, "fly");
-        } else if (
-          core.flags.flyNearStair &&
-          !core.nearStair() &&
-          !flags.canMoveFloor
-        ) {
-          core.playSound("操作失败");
-          core.drawTip(
-            "无法到达楼梯边使用" + core.material.items["fly"].name,
-            "fly"
-          );
-        } else {
-          core.flyTo(core.status.event.data.floorId);
-          core.updateStatusBar();
-        }
-        return;
-      }
+	////// 点击楼层传送器时的打开操作 //////
+	events.prototype.useFly = function (fromUserAction) {
+		if (!core.isPlaying()) return;
+		if (!core.status.maps[core.status.floorId].canFlyFrom) {
+			core.drawTip(core.material.items["fly"].name + "好像失效了", "fly");
+			return;
+		}
+		// 从“浏览地图”页面:尝试直接传送到该层
+		if (core.status.event.id == "viewMaps") {
+			if (!core.hasItem("fly")) {
+				core.playSound("操作失败");
+				core.drawTip("你没有" + core.material.items["fly"].name, "fly");
+			} else if (
+				core.flags.flyNearStair &&
+				!core.nearStair() &&
+				!flags.canMoveFloor
+			) {
+				core.playSound("操作失败");
+				core.drawTip(
+					"无法到达楼梯边使用" + core.material.items["fly"].name,
+					"fly"
+				);
+			} else {
+				core.flyTo(core.status.event.data.floorId);
+				core.updateStatusBar();
+			}
+			return;
+		}
 
-      if (!this._checkStatus("fly", fromUserAction, true)) return;
-      //if (core.flags.flyNearStair && !core.nearStair())
+		if (!this._checkStatus("fly", fromUserAction, true)) return;
+		//if (core.flags.flyNearStair && !core.nearStair())
 
-      if (
-        (core.flags.flyNearStair && !core.nearStair()) ||
-        !flags.canMoveFloor
-      ) {
-        core.playSound("操作失败");
-        core.drawTip(
-          "无法到达楼梯边使用" + core.material.items["fly"].name,
-          "fly"
-        );
-        core.unlockControl();
-        core.status.event.data = null;
-        core.status.event.id = null;
-        return;
-      }
-      if (!core.canUseItem("fly")) {
-        core.playSound("操作失败");
-        core.drawTip(core.material.items["fly"].name + "好像失效了", "fly");
-        core.unlockControl();
-        core.status.event.data = null;
-        core.status.event.id = null;
-        return;
-      }
-      core.playSound("打开界面");
-      core.useItem("fly", true);
-      core.updateStatusBar();
-      return;
-    };
-    ////// 系统菜单栏界面时的点击操作 //////
-    actions.prototype._clickSettings = function (x, y) {
-      if (this._out(x)) return;
-      var choices = core.status.event.ui.choices;
-      var topIndex = this._getChoicesTopIndex(choices.length);
-      if (y >= topIndex && y < topIndex + choices.length) {
-        var selection = y - topIndex;
-        core.status.event.selection = selection;
-        switch (selection) {
-          case 0:
-            core.status.event.selection = 0;
-            core.playSound("确定");
-            core.ui._drawSwitchs();
-            break;
-          case 1:
-            // core.playSound('确定');
-            core.ui._drawKeyBoard();
-            break;
-          case 2:
-            // core.playSound('确定');
-            core.clearUI();
-            core.useItem("fly");
-            break;
-          case 3:
-            core.status.event.selection = 0;
-            core.playSound("确定");
-            core.ui._drawNotes();
-            break;
-          case 4:
-            core.status.event.selection = 0;
-            core.playSound("确定");
-            core.ui._drawSyncSave();
-            break;
-          case 5:
-            core.status.event.selection = 0;
-            core.playSound("确定");
-            core.ui._drawGameInfo();
-            break;
-          case 6:
-            return core.confirmRestart();
-          case 7:
-            core.playSound("取消");
-            core.ui.closePanel();
-            break;
-        }
-      }
-      return;
-    };
-    ////// 查看地图界面时的点击操作 //////
-    actions.prototype._clickViewMaps = function (x, y, px, py) {
-      if (core.status.event.data == null) {
-        core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId));
-        return;
-      }
-      let now = core.floorIds.indexOf(core.status.floorId);
-      let index = core.status.event.data.index;
-      let cx = core.status.event.data.x,
-        cy = core.status.event.data.y;
-      let floorId = core.floorIds[index],
-        mw = core.floors[floorId].width,
-        mh = core.floors[floorId].height;
-      let perpx = core.__PIXELS__ / 5,
-        cornerpx = (perpx * 3) / 4;
-      const bfs = core.plugin.bfsSearch(floorId, 1, true);
-      const mapdir = bfs.mapdir[floorId];
-      const res = bfs.res;
-      const formto = {};
-      for (let from in res) {
-        const to = res[from];
-        const [fromfloorId, fromsx, fromsy, dir] = from.split("_");
-        const [tofloorId, tosx, tosy] = to.split("_");
-        if (!formto[fromfloorId]) formto[fromfloorId] = {};
-        if (!formto[fromfloorId][dir]) formto[fromfloorId][dir] = tofloorId;
-      }
-      const areas = core.getFlag("areas");
-      let i = areas.findIndex((v) => v.maps.includes(floorId));
+		if (
+			(core.flags.flyNearStair && !core.nearStair()) ||
+			!flags.canMoveFloor
+		) {
+			core.playSound("操作失败");
+			core.drawTip(
+				"无法到达楼梯边使用" + core.material.items["fly"].name,
+				"fly"
+			);
+			core.unlockControl();
+			core.status.event.data = null;
+			core.status.event.id = null;
+			return;
+		}
+		if (!core.canUseItem("fly")) {
+			core.playSound("操作失败");
+			core.drawTip(core.material.items["fly"].name + "好像失效了", "fly");
+			core.unlockControl();
+			core.status.event.data = null;
+			core.status.event.id = null;
+			return;
+		}
+		core.playSound("打开界面");
+		core.useItem("fly", true);
+		core.updateStatusBar();
+		return;
+	};
+	////// 系统菜单栏界面时的点击操作 //////
+	actions.prototype._clickSettings = function (x, y) {
+		if (this._out(x)) return;
+		var choices = core.status.event.ui.choices;
+		var topIndex = this._getChoicesTopIndex(choices.length);
+		if (y >= topIndex && y < topIndex + choices.length) {
+			var selection = y - topIndex;
+			core.status.event.selection = selection;
+			switch (selection) {
+			case 0:
+				core.status.event.selection = 0;
+				core.playSound("确定");
+				core.ui._drawSwitchs();
+				break;
+			case 1:
+				// core.playSound('确定');
+				core.ui._drawKeyBoard();
+				break;
+			case 2:
+				// core.playSound('确定');
+				core.clearUI();
+				core.useItem("fly");
+				break;
+			case 3:
+				core.status.event.selection = 0;
+				core.playSound("确定");
+				core.ui._drawNotes();
+				break;
+			case 4:
+				core.status.event.selection = 0;
+				core.playSound("确定");
+				core.ui._drawSyncSave();
+				break;
+			case 5:
+				core.status.event.selection = 0;
+				core.playSound("确定");
+				core.ui._drawGameInfo();
+				break;
+			case 6:
+				return core.confirmRestart();
+			case 7:
+				core.playSound("取消");
+				core.ui.closePanel();
+				break;
+			}
+		}
+		return;
+	};
+	////// 查看地图界面时的点击操作 //////
+	actions.prototype._clickViewMaps = function (x, y, px, py) {
+		if (core.status.event.data == null) {
+			core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId));
+			return;
+		}
+		let now = core.floorIds.indexOf(core.status.floorId);
+		let index = core.status.event.data.index;
+		let cx = core.status.event.data.x,
+			cy = core.status.event.data.y;
+		let floorId = core.floorIds[index],
+			mw = core.floors[floorId].width,
+			mh = core.floors[floorId].height;
+		let perpx = core.__PIXELS__ / 5,
+			cornerpx = (perpx * 3) / 4;
+		const bfs = core.plugin.bfsSearch(floorId, 1, true);
+		const mapdir = bfs.mapdir[floorId];
+		const res = bfs.res;
+		const formto = {};
+		for (let from in res) {
+			const to = res[from];
+			const [fromfloorId, fromsx, fromsy, dir] = from.split("_");
+			const [tofloorId, tosx, tosy] = to.split("_");
+			if (!formto[fromfloorId]) formto[fromfloorId] = {};
+			if (!formto[fromfloorId][dir]) formto[fromfloorId][dir] = tofloorId;
+		}
+		const areas = core.getFlag("areas");
+		let i = areas.findIndex((v) => v.maps.includes(floorId));
 
-      if (px >= 11 && px <= 54 && py >= 11 && py <= 54) {
-        core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId));
-      } else if (px >= 362 && px <= 407 && py >= 191 && py <= 318) {
-        flags.showEnemy = !flags.showEnemy;
-        core.ui._drawViewMaps(index);
-      } else if (px >= 364 && px <= 407 && py >= 364 && py <= 407) {
-        core.clearMap("data");
-        core.playSound("取消");
-        core.ui.closePanel();
-        core.getItemDetail();
-        core.redrawMap();
-        core.updateStatusBar();
-        core.ui.statusBar._update_map();
-        return;
-      } else if (px >= 55 && px <= 317 && py >= 11 && py <= 54) {
-        if (mapdir.includes("up"))
-          core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].up));
-      } else if (px >= 55 && px <= 317 && py >= 319 && py <= 362) {
-        if (mapdir.includes("down"))
-          core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].down));
-      } else if (px >= 11 && px <= 54 && py >= 55 && py <= 317) {
-        if (mapdir.includes("left"))
-          core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].left));
-      } else if (px >= 319 && px <= 362 && py >= 55 && py <= 317) {
-        if (mapdir.includes("right"))
-          core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].right));
-      } else if (px >= 319 && px <= 407 && py >= 11 && py <= 54) {
-        if (mapdir.includes("upFloor"))
-          core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].upFloor));
-      } else if (px >= 319 && px <= 407 && py >= 319 && py <= 362) {
-        if (mapdir.includes("downFloor"))
-          core.ui._drawViewMaps(
-            core.floorIds.indexOf(formto[floorId].downFloor)
-          );
-      } else if (
-        px >= 55 &&
-        px <= 317 &&
-        py >= 55 &&
-        py <= 317 &&
-        core.isPlaying()
-      ) {
-        core.useFly(false);
-        return;
-      } else if (px >= 11 && px <= 54 && py >= 364 && py <= 407) {
-        if (i > 0) {
-          i -= 1;
-          core.ui._drawViewMaps(core.floorIds.indexOf(areas[i].maps[0]));
-        }
-      } else if (px >= 319 && px <= 362 && py >= 364 && py <= 407) {
-        if (i < areas.length - 1) {
-          i += 1;
-          core.ui._drawViewMaps(core.floorIds.indexOf(areas[i].maps[0]));
-        }
-      }
-    };
-    const replayAction_fly = function (action) {
-      //楼层传送的录像操作
-      if (action.indexOf("fly:") != 0) return false;
-      var floorId = action.substring(4);
-      var toIndex = core.floorIds.indexOf(floorId);
-      if (
-        !core.canUseItem("fly") ||
-        (core.flags.flyNearStair && !core.nearStair() && !flags.canMoveFloor)
-      )
-        return false;
-      core.ui._drawViewMaps(toIndex);
-      if (core.status.replay.speed == 24) {
-        if (!core.flyTo(floorId, core.replay))
-          core.control._replay_error(action);
-        return true;
-      }
-      setTimeout(function () {
-        if (!core.flyTo(floorId, core.replay))
-          core.control._replay_error(action);
-      }, core.control.__replay_getTimeout());
-      return true;
-    };
-    core.registerReplayAction("fly", replayAction_fly);
-    ////// 查看地图界面时,放开某个键的操作 //////
+		if (px >= 11 && px <= 54 && py >= 11 && py <= 54) {
+			core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId));
+		} else if (px >= 362 && px <= 407 && py >= 191 && py <= 318) {
+			flags.showEnemy = !flags.showEnemy;
+			core.ui._drawViewMaps(index);
+		} else if (px >= 364 && px <= 407 && py >= 364 && py <= 407) {
+			core.clearMap("data");
+			core.playSound("取消");
+			core.ui.closePanel();
+			core.getItemDetail();
+			core.redrawMap();
+			core.updateStatusBar();
+			core.ui.statusBar._update_map();
+			return;
+		} else if (px >= 55 && px <= 317 && py >= 11 && py <= 54) {
+			if (mapdir.includes("up"))
+				core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].up));
+		} else if (px >= 55 && px <= 317 && py >= 319 && py <= 362) {
+			if (mapdir.includes("down"))
+				core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].down));
+		} else if (px >= 11 && px <= 54 && py >= 55 && py <= 317) {
+			if (mapdir.includes("left"))
+				core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].left));
+		} else if (px >= 319 && px <= 362 && py >= 55 && py <= 317) {
+			if (mapdir.includes("right"))
+				core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].right));
+		} else if (px >= 319 && px <= 407 && py >= 11 && py <= 54) {
+			if (mapdir.includes("upFloor"))
+				core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].upFloor));
+		} else if (px >= 319 && px <= 407 && py >= 319 && py <= 362) {
+			if (mapdir.includes("downFloor"))
+				core.ui._drawViewMaps(
+					core.floorIds.indexOf(formto[floorId].downFloor)
+				);
+		} else if (
+			px >= 55 &&
+			px <= 317 &&
+			py >= 55 &&
+			py <= 317 &&
+			core.isPlaying()
+		) {
+			core.useFly(false);
+			return;
+		} else if (px >= 11 && px <= 54 && py >= 364 && py <= 407) {
+			if (i > 0) {
+				i -= 1;
+				core.ui._drawViewMaps(core.floorIds.indexOf(areas[i].maps[0]));
+			}
+		} else if (px >= 319 && px <= 362 && py >= 364 && py <= 407) {
+			if (i < areas.length - 1) {
+				i += 1;
+				core.ui._drawViewMaps(core.floorIds.indexOf(areas[i].maps[0]));
+			}
+		}
+	};
+	const replayAction_fly = function (action) {
+		//楼层传送的录像操作
+		if (action.indexOf("fly:") != 0) return false;
+		var floorId = action.substring(4);
+		var toIndex = core.floorIds.indexOf(floorId);
+		if (
+			!core.canUseItem("fly") ||
+			(core.flags.flyNearStair && !core.nearStair() && !flags.canMoveFloor)
+		)
+			return false;
+		core.ui._drawViewMaps(toIndex);
+		if (core.status.replay.speed == 24) {
+			if (!core.flyTo(floorId, core.replay))
+				core.control._replay_error(action);
+			return true;
+		}
+		setTimeout(function () {
+			if (!core.flyTo(floorId, core.replay))
+				core.control._replay_error(action);
+		}, core.control.__replay_getTimeout());
+		return true;
+	};
+	core.registerReplayAction("fly", replayAction_fly);
+	////// 查看地图界面时,放开某个键的操作 //////
 
-    actions.prototype._keyUpViewMaps = function (keycode) {
-      if (core.status.event.data == null) {
-        core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId));
-        return;
-      }
-      var floorId = core.floorIds[core.status.event.data.index];
+	actions.prototype._keyUpViewMaps = function (keycode) {
+		if (core.status.event.data == null) {
+			core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId));
+			return;
+		}
+		var floorId = core.floorIds[core.status.event.data.index];
 
-      if (keycode == 27 || keycode == 71) {
-        core.clearMap("data");
-        core.playSound("取消");
-        core.ui.closePanel();
-        core.getItemDetail();
-        core.redrawMap();
-        core.ui.statusBar._update_map();
-        core.updateStatusBar();
-        return;
-      }
+		if (keycode == 27 || keycode == 71) {
+			core.clearMap("data");
+			core.playSound("取消");
+			core.ui.closePanel();
+			core.getItemDetail();
+			core.redrawMap();
+			core.ui.statusBar._update_map();
+			core.updateStatusBar();
+			return;
+		}
 
-      if (keycode == 86) {
-        core.status.event.data.damage = !core.status.event.data.damage;
-        core.playSound("光标移动");
-        core.ui._drawViewMaps(core.status.event.data);
-        return;
-      }
-      if (keycode == 66 || keycode == 88) {
-        if (core.isReplaying()) {
-          core.control._replay_book();
-        } else {
-          core.openBook(false);
-        }
-        return;
-      }
-      if (
-        (keycode == 13 || keycode == 32 || keycode == 67) &&
-        !core.isReplaying()
-      ) {
-        core.useFly(false);
-        return;
-      }
-      return;
-    };
-    actions.prototype._keyDownViewMaps = function (keycode) {
-      if (core.status.event.data == null) return;
+		if (keycode == 86) {
+			core.status.event.data.damage = !core.status.event.data.damage;
+			core.playSound("光标移动");
+			core.ui._drawViewMaps(core.status.event.data);
+			return;
+		}
+		if (keycode == 66 || keycode == 88) {
+			if (core.isReplaying()) {
+				core.control._replay_book();
+			} else {
+				core.openBook(false);
+			}
+			return;
+		}
+		if (
+			(keycode == 13 || keycode == 32 || keycode == 67) &&
+			!core.isReplaying()
+		) {
+			core.useFly(false);
+			return;
+		}
+		return;
+	};
+	actions.prototype._keyDownViewMaps = function (keycode) {
+		if (core.status.event.data == null) return;
 
-      var floorId = core.floorIds[core.status.event.data.index],
-        mh = core.floors[floorId].height;
+		var floorId = core.floorIds[core.status.event.data.index],
+			mh = core.floors[floorId].height;
 
-      if (keycode == 39) this._clickViewMaps(9, 1, 330, 250);
-      if (keycode == 37) this._clickViewMaps(9, 8, 25, 200);
-      if (keycode == 40) this._clickViewMaps(9, 6, 250, 330);
-      if (keycode == 38) this._clickViewMaps(9, 3, 200, 25);
-      if (keycode == 34) this._clickViewMaps(9, 3, 350, 330);
-      if (keycode == 33) this._clickViewMaps(9, 3, 350, 25);
-      return;
-    };
+		if (keycode == 39) this._clickViewMaps(9, 1, 330, 250);
+		if (keycode == 37) this._clickViewMaps(9, 8, 25, 200);
+		if (keycode == 40) this._clickViewMaps(9, 6, 250, 330);
+		if (keycode == 38) this._clickViewMaps(9, 3, 200, 25);
+		if (keycode == 34) this._clickViewMaps(9, 3, 350, 330);
+		if (keycode == 33) this._clickViewMaps(9, 3, 350, 25);
+		return;
+	};
 
-    actions.prototype._sys_onmousewheel = function (direct) {
-      // 向下滚动是 -1 ,向上是 1
+	actions.prototype._sys_onmousewheel = function (direct) {
+		// 向下滚动是 -1 ,向上是 1
 
-      if (this._checkReplaying()) {
-        // 滚轮控制速度
-        if (direct == 1) core.speedUpReplay();
-        if (direct == -1) core.speedDownReplay();
-        return;
-      }
+		if (this._checkReplaying()) {
+			// 滚轮控制速度
+			if (direct == 1) core.speedUpReplay();
+			if (direct == -1) core.speedDownReplay();
+			return;
+		}
 
-      // 楼层飞行器
-      if (core.status.lockControl && core.status.event.id == "fly") {
-        if (direct == 1) core.ui.drawFly(this._getNextFlyFloor(1));
-        if (direct == -1) core.ui.drawFly(this._getNextFlyFloor(-1));
-        return;
-      }
+		// 楼层飞行器
+		if (core.status.lockControl && core.status.event.id == "fly") {
+			if (direct == 1) core.ui.drawFly(this._getNextFlyFloor(1));
+			if (direct == -1) core.ui.drawFly(this._getNextFlyFloor(-1));
+			return;
+		}
 
-      // 怪物手册
-      if (core.status.lockControl && core.status.event.id == "book") {
-        var pageinfo = core.ui._drawBook_pageinfo();
-        if (direct == 1)
-          core.ui.drawBook(core.status.event.data - pageinfo.per_page);
-        if (direct == -1)
-          core.ui.drawBook(core.status.event.data + pageinfo.per_page);
-        return;
-      }
+		// 怪物手册
+		if (core.status.lockControl && core.status.event.id == "book") {
+			var pageinfo = core.ui._drawBook_pageinfo();
+			if (direct == 1)
+				core.ui.drawBook(core.status.event.data - pageinfo.per_page);
+			if (direct == -1)
+				core.ui.drawBook(core.status.event.data + pageinfo.per_page);
+			return;
+		}
 
-      // 存读档
-      if (
-        core.status.lockControl &&
-        (core.status.event.id == "save" || core.status.event.id == "load")
-      ) {
-        var index =
-          core.status.event.data.page * 10 + core.status.event.data.offset;
-        if (direct == 1) core.ui._drawSLPanel(index - 10);
-        if (direct == -1) core.ui._drawSLPanel(index + 10);
-        return;
-      }
+		// 存读档
+		if (
+			core.status.lockControl &&
+			(core.status.event.id == "save" || core.status.event.id == "load")
+		) {
+			var index =
+				core.status.event.data.page * 10 + core.status.event.data.offset;
+			if (direct == 1) core.ui._drawSLPanel(index - 10);
+			if (direct == -1) core.ui._drawSLPanel(index + 10);
+			return;
+		}
 
-      // 浏览地图
-      if (core.status.lockControl && core.status.event.id == "viewMaps") {
-        let floorId = core.floorIds[core.status.event.data.index];
-        if (!flags.__visited__[floorId]) floorId = core.status.floorId;
-        const visit = Object.keys(flags.__visited__);
-        let index = visit.indexOf(floorId);
-        if (direct == 1) {
-          if (index > 0)
-            core.ui._drawViewMaps(core.floorIds.indexOf(visit[index - 1]));
-        }
-        if (direct == -1) {
-          if (index < visit.length - 1)
-            core.ui._drawViewMaps(core.floorIds.indexOf(visit[index + 1]));
-        }
-        return;
-      }
+		// 浏览地图
+		if (core.status.lockControl && core.status.event.id == "viewMaps") {
+			let floorId = core.floorIds[core.status.event.data.index];
+			if (!flags.__visited__[floorId]) floorId = core.status.floorId;
+			const visit = Object.keys(flags.__visited__);
+			let index = visit.indexOf(floorId);
+			if (direct == 1) {
+				if (index > 0)
+					core.ui._drawViewMaps(core.floorIds.indexOf(visit[index - 1]));
+			}
+			if (direct == -1) {
+				if (index < visit.length - 1)
+					core.ui._drawViewMaps(core.floorIds.indexOf(visit[index + 1]));
+			}
+			return;
+		}
 
-      // wait事件
-      if (
-        core.status.lockControl &&
-        core.status.event.id == "action" &&
-        core.status.event.data.type == "wait"
-      ) {
-        var timeout =
-          Math.max(0, core.status.event.timeout - new Date().getTime()) || 0;
-        core.setFlag("type", 0);
-        var keycode = direct == 1 ? 33 : 34;
-        core.setFlag("keycode", keycode);
-        core.setFlag("timeout", timeout);
-        var executed = core.events.__action_wait_afterGet(
-          core.status.event.data.current
-        );
-        if (executed || !core.status.event.data.current.forceChild) {
-          core.status.route.push("input:" + (1e8 * timeout + keycode));
-          clearTimeout(core.status.event.interval);
-          delete core.status.event.timeout;
-          core.doAction();
-        }
-        return;
-      }
-    };
-    core.registerAction(
-      "onmousewheel",
-      "_sys_onmousewheel",
-      actions.prototype._sys_onmousewheel,
-      0
-    );
-  },
+		// wait事件
+		if (
+			core.status.lockControl &&
+			core.status.event.id == "action" &&
+			core.status.event.data.type == "wait"
+		) {
+			var timeout =
+				Math.max(0, core.status.event.timeout - new Date().getTime()) || 0;
+			core.setFlag("type", 0);
+			var keycode = direct == 1 ? 33 : 34;
+			core.setFlag("keycode", keycode);
+			core.setFlag("timeout", timeout);
+			var executed = core.events.__action_wait_afterGet(
+				core.status.event.data.current
+			);
+			if (executed || !core.status.event.data.current.forceChild) {
+				core.status.route.push("input:" + (1e8 * timeout + keycode));
+				clearTimeout(core.status.event.interval);
+				delete core.status.event.timeout;
+				core.doAction();
+			}
+			return;
+		}
+	};
+	core.registerAction(
+		"onmousewheel",
+		"_sys_onmousewheel",
+		actions.prototype._sys_onmousewheel,
+		0
+	);
+},
     "CG回廊": function () {
 	// 在此增加新插件
 	const CGUI = document.createElement("canvas"); //CGui画布设置
@@ -15544,197 +15544,197 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
     };
   },
     "滑动转场": function () {
-    // 在此增加新插件
-    const defaultChange = {
-      left: "leftPortal", // 左箭头
-      up: "upPortal", // 上箭头
-      right: "rightPortal", // 右箭头
-      down: "downPortal", // 下箭头
-      upFloor: "upFloor", // 上楼
-      downFloor: "downFloor", // 下楼
-    };
-    const dirData = {
-      //方向坐标
-      up: [-1, 0],
-      down: [1, 0],
-      left: [0, -1],
-      right: [0, 1],
-      upFloor: [0, 0],
-      downFloor: [0, 0],
-    };
-    let allChangeEntries = Object.entries(defaultChange);
-    const move = document.createElement("canvas");
-    const speed = 12;
-    let modedata = 0;
+	// 在此增加新插件
+	const defaultChange = {
+		left: "leftPortal", // 左箭头
+		up: "upPortal", // 上箭头
+		right: "rightPortal", // 右箭头
+		down: "downPortal", // 下箭头
+		upFloor: "upFloor", // 上楼
+		downFloor: "downFloor", // 下楼
+	};
+	const dirData = {
+		//方向坐标
+		up: [-1, 0],
+		down: [1, 0],
+		left: [0, -1],
+		right: [0, 1],
+		upFloor: [0, 0],
+		downFloor: [0, 0],
+	};
+	let allChangeEntries = Object.entries(defaultChange);
+	const move = document.createElement("canvas");
+	const speed = 12;
+	let modedata = 0;
 
-    move.width = 1248;
-    move.height = 1248;
+	move.width = 1248;
+	move.height = 1248;
 
-    const ctx = move.getContext("2d");
+	const ctx = move.getContext("2d");
 
-    events.prototype.changeFloor = function (
-      floorId,
-      stair,
-      heroLoc,
-      time,
-      callback
-    ) {
-      let block = core.getBlock(hero.loc.x, hero.loc.y);
-      var info = this._changeFloor_getInfo(floorId, stair, heroLoc, time);
+	events.prototype.changeFloor = function (
+		floorId,
+		stair,
+		heroLoc,
+		time,
+		callback
+	) {
+		let block = core.getBlock(hero.loc.x, hero.loc.y);
+		var info = this._changeFloor_getInfo(floorId, stair, heroLoc, time);
 
-      if (info == null) {
-        if (callback) callback();
-        return;
-      }
-      floorId = info.floorId;
-      info.locked = core.status.lockControl;
+		if (info == null) {
+			if (callback) callback();
+			return;
+		}
+		floorId = info.floorId;
+		info.locked = core.status.lockControl;
 
-      core.dom.floorNameLabel.innerText = core.status.maps[floorId].title;
-      core.lockControl();
-      core.stopAutomaticRoute();
-      core.clearContinueAutomaticRoute();
-      core.status.replay.animate = true;
-      clearInterval(core.interval.onDownInterval);
-      delete core.animateFrame.tip;
-      core.interval.onDownInterval = "tmp";
+		core.dom.floorNameLabel.innerText = core.status.maps[floorId].title;
+		core.lockControl();
+		core.stopAutomaticRoute();
+		core.clearContinueAutomaticRoute();
+		core.status.replay.animate = true;
+		clearInterval(core.interval.onDownInterval);
+		delete core.animateFrame.tip;
+		core.interval.onDownInterval = "tmp";
 
-      this._changeFloor_beforeChange(info, block, callback);
-    };
-    events.prototype._changeFloor_beforeChange = function (
-      info,
-      block,
-      callback
-    ) {
-      this._changeFloor_playSound();
-      if (
-        block &&
-        block?.event &&
-        !main.replayChecking &&
-        !core.isReplaying() &&
-        !core.getFlag("__isFlying__", false)
-      ) {
-        const dirEntries = allChangeEntries.find(
-          (v) => v[1] === block.event.id
-        );
-        if (block?.event?.trigger === "changeFloor" && dirEntries) {
-          const toFloorId = block.event.data.floorId;
-          const dir = dirEntries[0];
+		this._changeFloor_beforeChange(info, block, callback);
+	};
+	events.prototype._changeFloor_beforeChange = function (
+		info,
+		block,
+		callback
+	) {
+		this._changeFloor_playSound();
+		if (
+			block &&
+			block?.event &&
+			!main.replayChecking &&
+			!core.isReplaying() &&
+			!core.hasFlag("__isFlying__") && !core.hasFlag("__fromLoad__")
+		) {
+			const dirEntries = allChangeEntries.find(
+				(v) => v[1] === block.event.id
+			);
+			if (block?.event?.trigger === "changeFloor" && dirEntries) {
+				const toFloorId = block.event.data.floorId;
+				const dir = dirEntries[0];
 
-          const data = core.ui._drawViewMaps_buildData(
-            core.floorIds.indexOf(core.status.floorId)
-          );
-          const dataTo = core.ui._drawViewMaps_buildData(
-            core.floorIds.indexOf(toFloorId)
-          );
-          const v = dirData[dir][1], // 水平数值
-            h = dirData[dir][0]; //竖直数值
-          ctx.clearRect(0, 0, 1248, 1248);
-          core.drawThumbnail(core.status.floorId, null, {
-            damage: data.damage,
-            ctx: ctx,
-            x: 416,
-            y: 416,
-            size: 1,
-            all: data.all,
-          });
-          if (dir !== "upFloor" && dir !== "downFloor") {
-            core.drawThumbnail(toFloorId, null, {
-              damage: dataTo.damage,
-              ctx: ctx,
-              x: 416 + 416 * v,
-              y: 416 + 416 * h,
-              size: 1,
-              all: dataTo.all,
-            });
+				const data = core.ui._drawViewMaps_buildData(
+					core.floorIds.indexOf(core.status.floorId)
+				);
+				const dataTo = core.ui._drawViewMaps_buildData(
+					core.floorIds.indexOf(toFloorId)
+				);
+				const v = dirData[dir][1], // 水平数值
+					h = dirData[dir][0]; //竖直数值
+				ctx.clearRect(0, 0, 1248, 1248);
+				core.drawThumbnail(core.status.floorId, null, {
+					damage: data.damage,
+					ctx: ctx,
+					x: 416,
+					y: 416,
+					size: 1,
+					all: data.all,
+				});
+				if (dir !== "upFloor" && dir !== "downFloor") {
+					core.drawThumbnail(toFloorId, null, {
+						damage: dataTo.damage,
+						ctx: ctx,
+						x: 416 + 416 * v,
+						y: 416 + 416 * h,
+						size: 1,
+						all: dataTo.all,
+					});
 
-            var _run = function () {
-              var cb = function () {
-                modedata = 0;
-                core.clearUI();
-                core.clearMap("data");
-                core.events._changeFloor_changing(info, callback);
-              };
+					var _run = function () {
+						var cb = function () {
+							modedata = 0;
+							core.clearUI();
+							core.clearMap("data");
+							core.events._changeFloor_changing(info, callback);
+						};
 
-              var animate = window.setInterval(
-                function () {
-                  if (modedata >= 416) {
-                    delete core.animateFrame.asyncId[animate];
-                    clearInterval(animate);
-                    cb();
-                  } else {
-                    core.clearUI();
-                    core.clearMap("data");
+						var animate = window.setInterval(
+							function () {
+								if (modedata >= 416) {
+									delete core.animateFrame.asyncId[animate];
+									clearInterval(animate);
+									cb();
+								} else {
+									core.clearUI();
+									core.clearMap("data");
 
-                    core.canvas.data.drawImage(
-                      move,
-                      416 + modedata * v,
-                      416 + modedata * h,
-                      416,
-                      416,
-                      0,
-                      0,
-                      416,
-                      416
-                    );
-                    let status = "leftFoot";
+									core.canvas.data.drawImage(
+										move,
+										416 + modedata * v,
+										416 + modedata * h,
+										416,
+										416,
+										0,
+										0,
+										416,
+										416
+									);
+									let status = "leftFoot";
 
-                    if (modedata > 208) {
-                      status = "rightFoot";
-                    }
-                    const img = core.material.images.hero;
-                    const heroIconArr = core.material.icons.hero;
-                    const width = core.material.icons.hero.width || 32;
-                    const height = core.material.icons.hero.height;
-                    const heroIcon = heroIconArr[dir];
+									if (modedata > 208) {
+										status = "rightFoot";
+									}
+									const img = core.material.images.hero;
+									const heroIconArr = core.material.icons.hero;
+									const width = core.material.icons.hero.width || 32;
+									const height = core.material.icons.hero.height;
+									const heroIcon = heroIconArr[dir];
 
-                    core.canvas.data.drawImage(
-                      img,
-                      (heroIcon[status] % 4) * width,
-                      heroIcon.loc * height,
-                      width,
-                      height,
-                      core.status.hero.loc.x * 32 -
-                        core.bigmap.offsetX -
-                        (modedata - (modedata * 32) / 416) * v,
-                      core.status.hero.loc.y * 32 -
-                        16 -
-                        (modedata - (modedata * 32) / 416) * h,
-                      width,
-                      height
-                    );
-                    modedata += speed;
-                    clearInterval(animate);
-                    delete core.animateFrame.asyncId[animate];
-                    _run();
-                  }
-                },
-                core.status.replay.speed == 24
-                  ? 1
-                  : 10 / core.status.replay.speed
-              );
+									core.canvas.data.drawImage(
+										img,
+										(heroIcon[status] % 4) * width,
+										heroIcon.loc * height,
+										width,
+										height,
+										core.status.hero.loc.x * 32 -
+										core.bigmap.offsetX -
+										(modedata - (modedata * 32) / 416) * v,
+										core.status.hero.loc.y * 32 -
+										16 -
+										(modedata - (modedata * 32) / 416) * h,
+										width,
+										height
+									);
+									modedata += speed;
+									clearInterval(animate);
+									delete core.animateFrame.asyncId[animate];
+									_run();
+								}
+							},
+							core.status.replay.speed == 24 ?
+							1 :
+							10 / core.status.replay.speed
+						);
 
-              core.animateFrame.lastAsyncId = animate;
-              core.animateFrame.asyncId[animate] = cb;
-            };
-            _run();
-            return;
-          }
-        }
-      }
-      // 需要 setTimeout 执行,不然会出错
-      window.setTimeout(function () {
-        if (info.time == 0) core.events._changeFloor_changing(info, callback);
-        else
-          core.showWithAnimate(
-            core.dom.floorMsgGroup,
-            info.time / 2,
-            function () {
-              core.events._changeFloor_changing(info, callback);
-            }
-          );
-      }, 25);
-    };
-  },
+						core.animateFrame.lastAsyncId = animate;
+						core.animateFrame.asyncId[animate] = cb;
+					};
+					_run();
+					return;
+				}
+			}
+		}
+		// 需要 setTimeout 执行,不然会出错
+		window.setTimeout(function () {
+			if (info.time == 0) core.events._changeFloor_changing(info, callback);
+			else
+				core.showWithAnimate(
+					core.dom.floorMsgGroup,
+					info.time / 2,
+					function () {
+						core.events._changeFloor_changing(info, callback);
+					}
+				);
+		}, 25);
+	};
+},
     "剧情cg": function () {
 	// 在此增加新插件
 	// 在此增加新插件

From 7f2a1c186678c2d99fb47d114d3994f78f97ef26 Mon Sep 17 00:00:00 2001
From: strawberry42271 <2806566736@qq.com>
Date: Sun, 16 Mar 2025 19:48:04 +0800
Subject: [PATCH 4/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=83=8C=E5=8C=85?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 project/plugins.js | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/project/plugins.js b/project/plugins.js
index 4f1b9ae..fd6476c 100644
--- a/project/plugins.js
+++ b/project/plugins.js
@@ -4490,6 +4490,11 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 		core.actions._sys_ondown_lockControl,
 		30
 	);
+	////// 绘制提示同时播放错误音效 //////
+	ui.prototype.drawFailTip = function (text, id, frame) {
+		this.drawTip(text, id, frame);
+		core.playSound('error.mp3');
+	}
 },
     "额外信息": function () {
     /* 宝石血瓶左下角显示数值
@@ -6578,7 +6583,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 				info.select.id && ["toolbox", "equipbox"].includes(core.status.event.id)
 			)
 		) {
-			core.drawFailTip("发生了未知错误!");
+			core.drawTip("发生了未知错误!");
 			return;
 		}
 		return info.select.id;
@@ -6595,7 +6600,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 			}
 		} catch (e) {
 			console.error(e);
-			core.drawFailTip("批量使用时出现未知错误!");
+			core.drawTip("批量使用时出现未知错误!");
 		}
 	}
 
@@ -6624,11 +6629,11 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 				const id = getSelectedItem();
 
 				if (Number.isNaN(value) || value < 0 || value > 99) {
-					core.drawFailTip("输入不合法!");
+					core.drawTip("输入不合法!");
 					return;
 				}
 				if (!core.canUseItem(id)) {
-					core.drawFailTip("当前无法使用该道具!");
+					core.drawTip("当前无法使用该道具!");
 					return;
 				}
 				core.closePanel();

From d650463ad636a2f64261d5386bcad798774dbbf8 Mon Sep 17 00:00:00 2001
From: QuincyAlter <571979627@qq.com>
Date: Tue, 18 Mar 2025 00:12:41 +0800
Subject: [PATCH 5/7] =?UTF-8?q?=E4=B8=AD=E9=97=B4=E6=95=99=E7=A8=8B?=
 =?UTF-8?q?=E5=B1=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 project/data.js               |  11 ++--
 project/enemys.js             |  10 +--
 project/floors/jiaocheng01.js |  74 ++++++++++++++++++++-
 project/floors/jiaocheng02.js | 118 ++++++++++++++++++++++------------
 project/floors/jiaocheng03.js |  69 ++++++++++++++++++++
 5 files changed, 230 insertions(+), 52 deletions(-)
 create mode 100644 project/floors/jiaocheng03.js

diff --git a/project/data.js b/project/data.js
index 9047933..e5b1aea 100644
--- a/project/data.js
+++ b/project/data.js
@@ -37,7 +37,8 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
 			"guangchang6",
 			"guangchang5",
 			"jiaocheng01",
-			"jiaocheng02"
+			"jiaocheng02",
+			"jiaocheng03"
 		],
 		"floorPartitions": [],
 		"images": [
@@ -1532,10 +1533,10 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
 			"hp": 1000,
 			"manamax": -1,
 			"mana": 0,
-			"atk": 30,
-			"def": 20,
+			"atk": 26,
+			"def": 16,
 			"mdef": 100,
-			"speed": 20,
+			"speed": 16,
 			"money": 0,
 			"exp": 0,
 			"equipment": [],
@@ -1558,7 +1559,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
 			"followers": [],
 			"steps": 0,
 			"matk": 0,
-			"spell": 20,
+			"spell": 0,
 			"spelldef": 0,
 			"mhp": 100
 		},
diff --git a/project/enemys.js b/project/enemys.js
index 265b918..70b508b 100644
--- a/project/enemys.js
+++ b/project/enemys.js
@@ -2,18 +2,18 @@ var enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 =
 {
 	"greenSlime": {"name":"绿头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1},
 	"redSlime": {"name":"红头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"value":10,"mdef":0,"spell":0,"speed":1},
-	"blackSlime": {"name":"青头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1},
-	"slimelord": {"name":"怪王","hp":790,"atk":48,"def":8,"money":10,"exp":0,"point":0,"special":[],"mdef":0,"spell":0,"speed":20},
+	"blackSlime": {"name":"青头怪","hp":222,"atk":46,"def":10,"money":0,"exp":0,"point":0,"special":[],"mdef":0,"spell":0,"speed":15},
+	"slimelord": {"name":"怪王","hp":790,"atk":48,"def":8,"money":0,"exp":0,"point":0,"special":[],"mdef":0,"spell":0,"speed":20},
 	"bat": {"name":"小蝙蝠","hp":100,"atk":50,"def":30,"money":2,"exp":0,"point":0,"special":[1],"mdef":0,"speed":15,"spell":0},
 	"bigBat": {"name":"大蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1},
 	"redBat": {"name":"红蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"mdef":0,"spell":0,"speed":1},
 	"vampire": {"name":"冥灵魔王","hp":888,"atk":888,"def":888,"money":888,"exp":888,"point":0,"special":[6],"n":8,"mdef":0,"spell":0,"speed":1},
 	"skeleton": {"name":"骷髅人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1},
-	"skeletonCaptain": {"name":"骷髅队长","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1},
+	"skeletonCaptain": {"name":"骷髅队长","hp":226,"atk":66,"def":1,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":18},
 	"zombie": {"name":"兽人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[22],"mdef":0,"spell":0,"speed":1},
 	"zombieKnight": {"name":"兽人武士","hp":10000,"atk":100,"def":100,"money":0,"exp":0,"point":0,"special":[22],"speed":10,"mdef":0,"damage2":20,"spell":0},
 	"rock": {"name":"石头人","hp":50,"atk":50,"def":0,"money":3,"exp":0,"point":0,"special":3,"damage2":15,"mdef":0,"spell":0,"speed":1},
-	"bluePriest": {"name":"初级法师","hp":100,"atk":120,"def":0,"money":3,"exp":0,"point":1,"special":[9],"mdef":0,"spell":0,"speed":1},
+	"bluePriest": {"name":"初级法师","hp":108,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[9],"mdef":0,"spell":270,"speed":12},
 	"redPriest": {"name":"高级法师","hp":162,"atk":0,"def":1,"money":0,"exp":0,"point":0,"special":[1],"mdef":0,"spell":308,"speed":14},
 	"brownWizard": {"name":"初级巫师","hp":162,"atk":120,"def":1,"money":16,"exp":0,"point":0,"special":[],"value":null,"range":2,"mdef":0,"spell":66,"speed":14},
 	"redWizard": {"name":"高级巫师","hp":1000,"atk":1200,"def":0,"money":160,"exp":0,"point":0,"special":15,"value":200,"zoneSquare":true,"mdef":0,"spell":0,"speed":1},
@@ -45,7 +45,7 @@ var enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 =
 	"goldSlimelord": {"name":"金怪王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1},
 	"skeletonWarrior": {"name":"骷髅士兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1},
 	"whiteSlimeman": {"name":"水银战士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1},
-	"slimeman": {"name":"影子战士","hp":100,"atk":0,"def":0,"money":11,"exp":0,"point":0,"special":[9],"atkValue":2,"defValue":3,"mdef":0,"spell":0,"speed":1},
+	"slimeman": {"name":"影子战士","hp":243,"atk":28,"def":5,"money":0,"exp":0,"point":0,"special":[],"atkValue":2,"defValue":3,"mdef":0,"spell":0,"speed":69},
 	"yellowGateKeeper": {"name":"初级卫兵","hp":80,"atk":25,"def":5,"money":3,"exp":1,"point":0,"special":0,"mdef":0,"spell":0,"speed":1},
 	"blueGateKeeper": {"name":"中级卫兵","hp":80,"atk":25,"def":5,"money":3,"exp":1,"point":0,"special":0,"mdef":0,"spell":0,"speed":1},
 	"redGateKeeper": {"name":"高级卫兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1},
diff --git a/project/floors/jiaocheng01.js b/project/floors/jiaocheng01.js
index ee12147..231abcc 100644
--- a/project/floors/jiaocheng01.js
+++ b/project/floors/jiaocheng01.js
@@ -29,6 +29,78 @@ main.floors.jiaocheng01=
         ],
         "12,11": [
             "血瓶介绍:不同大小"
+        ],
+        "5,7": [
+            "\t[小妖精,fairy]一种颜色的钥匙开一种颜色的门。\n一把钥匙只能开一扇门。",
+            {
+                "type": "jump",
+                "from": [
+                    5,
+                    7
+                ],
+                "to": [
+                    2,
+                    2
+                ],
+                "time": 500,
+                "keep": true
+            }
+        ],
+        "2,2": [
+            "\t[小妖精,fairy]在这个游戏中,不同颜色的钥匙珍贵程度也不相同。",
+            "\t[小妖精,fairy]黄色的钥匙最为常见。",
+            "\t[小妖精,fairy]蓝色的钥匙有点罕见,其价值在正式游戏中略高于2把黄钥匙,但低于3把黄钥匙。",
+            "\t[小妖精,fairy]红色的钥匙比较稀有,在正式游戏中一般一把红钥匙可以换取3把蓝钥匙,但反之则有价无市。\n红色的钥匙在正式游戏中一般仅用于boss战相关,开启非常重要的道具,或绕过非常非常强力的怪物。",
+            "\t[小妖精,fairy]绿色的钥匙为剧情道具,在游戏进程中绿钥匙和不可绕过的绿门一一对应,但存在通往相同区域的二选一绿门。\n绿色的钥匙一般被重兵把守,且不参与其他钥匙的相互兑换。",
+            {
+                "type": "jump",
+                "to": [
+                    8,
+                    1
+                ],
+                "time": 500,
+                "keep": true
+            }
+        ],
+        "8,1": [
+            "\t[小妖精,fairy]在地图上,偶尔会出现这种看起来白送一把蓝钥匙的房间。",
+            "\t[小妖精,fairy]然而,拿到这把“免费的”蓝钥匙,需要一把红钥匙作为前置。\n在教程关卡中,你肯定拥有这把红钥匙——如果你没有立即拿取旁边绿钥匙的话。",
+            "\t[小妖精,fairy]在正式游戏中,你可能当时没有,甚至在一时半会儿都不会有这把红钥匙。\n那样的话,这把蓝钥匙只能寄存在房间里。\n在拿到红钥匙之后,你的第一优先级行动就是回来拿上这把蓝钥匙。",
+            "\t[小妖精,fairy]这把红钥匙,以及用1红钥匙换取1红1蓝钥匙的操作,称为钥匙的周转。",
+            "\t[小妖精,fairy]当然,如果门口有怪物把守的话就另当别论——等到损失比较合适的时候再回来吧。",
+            {
+                "type": "jump",
+                "to": [
+                    6,
+                    1
+                ],
+                "time": 500,
+                "keep": true
+            },
+            {
+                "type": "setValue",
+                "name": "flag:教程1",
+                "value": "1"
+            }
+        ],
+        "6,1": [
+            {
+                "type": "if",
+                "condition": "(flag:教程1===1)",
+                "true": [
+                    "\t[小妖精,fairy]接下来就要开始适应本游戏的战斗系统了——",
+                    "\t[小妖精,fairy]在此之前,让我先确认一下吧。\n你拥有黄钥匙和蓝钥匙各一把,对吗?",
+                    "\t[小妖精,fairy]相对于其他RPG游戏来说,本作的战斗系统并不需要玩家在战斗中爆手速进行操作。\n暂停或挂机也是没问题的——怪物并不会因为现实中的你不操作而主动攻击你。\n换句话说,战斗的结果在战斗开始的一瞬间就已经确定了。",
+                    "\t[小妖精,fairy]除此之外,通过存档读档刷取随机数的操作在本作中也是不可行的。\n本作品将不涉及任何随机数的判定。\n这意味着如果你愿意,你可以百分百精确地复制一条攻略路线。",
+                    "\t[小妖精,fairy]换句话说,本作的战斗过程只依赖于战斗双方的各项数据。\n这包括双方的面板数值,各种技能,和多样的装备。",
+                    "\t[小妖精,fairy]本作还有另外一个特点——地图上的资源是有限的,并不会随时间自动刷新。\n这意味着不能在低级图反复刷取资源来碾压高级的怪物,必须仔细规划资源的获取及使用。",
+                    "\t[小妖精,fairy]在手部乘区、脸部乘区、肝部乘区都被限制住的情况下——\n请开发自己的脑部乘区,迎接后面的挑战吧!",
+                    {
+                        "type": "hide",
+                        "remove": true
+                    }
+                ]
+            }
         ]
     },
     "changeFloor": {
@@ -63,7 +135,7 @@ main.floors.jiaocheng01=
     [  1,  0,  0, 82,  0,  1, 81,  1, 82,  1,  1,  1,  1],
     [  1, 21,  1,  1,  0,  1, 22,  1,  0,  0, 21, 23,  1],
     [  1,  1,  1,  1, 83,  1,  1,  1,  1,  1,  1,  1,  1],
-    [ 27,  0, 28,  1,  0,  0, 82,  0, 22,  1, 31,  0, 32],
+    [ 27,  0, 28,  1,  0,124, 82,  0, 22,  1, 31,  0, 32],
     [  0,  0,  0,  1, 21,  1,  1,  1,  0,  1,  0,  0,  0],
     [ 29,  0, 30,  1, 23,  1, 21,  1,  0,  1, 34,  0, 33],
     [  1,  1,  1,  1,  1,  1,  0,  1, 81,  1,  1,  1,  1],
diff --git a/project/floors/jiaocheng02.js b/project/floors/jiaocheng02.js
index 78b800f..0dcf1bc 100644
--- a/project/floors/jiaocheng02.js
+++ b/project/floors/jiaocheng02.js
@@ -15,40 +15,69 @@ main.floors.jiaocheng02=
     "eachArrive": [],
     "parallelDo": "",
     "events": {
-        "5,11": [
-            "教程初始属性:\n1000HP,30攻击,20防御,20速度,20法强(*100%=20护盾)\n绿血瓶此处900,红血瓶100"
-        ],
-        "0,0": [
-            "匕首:速度+20"
-        ],
-        "12,0": [
-            "法杖:魔攻比例10%,魔防比例0%"
-        ],
-        "6,0": [
+        "9,10": [
+            "\t[小妖精,fairy]恭喜你!开始了接触本作战斗系统的第一步!\n希望你刚才有好好看过战斗动画哦——当然没有也没关系!我们一点点教!",
+            "\t[小妖精,fairy]刚才我们的剑砍到敌人身上的时候,敌人身上冒出了一个“-16”的数字。\n这意味着我们砍出去的剑对敌人造成了16点伤害。\n这个“-16”是怎么来的呢?",
+            "\t[小妖精,fairy]打开怪物手册!",
             {
-                "type": "setCurtain",
-                "color": [
-                    0,
-                    0,
-                    0,
-                    1
+                "type": "callBook"
+            },
+            "\t[小妖精,fairy]我们拥有26点攻击力——在左边的状态栏可以看到。\n敌人拥有10点防御力——在怪物手册可以看到。\n我们的每次普通攻击将对怪物造成26-10=16点伤害。",
+            "\t[小妖精,fairy]同理,怪物的每次普通攻击将对我们造成46-16=30点伤害。\n在战斗动画中也有体现哦!",
+            "\t[小妖精,fairy]一方的生命值降低到0,意味着这一方被对方击杀。\n换句话说,如果我们的生命值被怪物的攻击压低到了0,这意味着勇士在战斗中牺牲了。\n(也就是game over啦)。",
+            "\t[小妖精,fairy]虽然在相同的状态下,持有更多的生命值总是更好,但生命值只是一个“够用就行”的属性。\n相较于把自己的生命值把握在自我设定的“500点”“1000点”等“安全线”上,\n用这些多余的生命值换取钥匙、能力,甚至是金币等资源,对后续的游戏过程来说会更轻松。",
+            "\t[小妖精,fairy]话说回来。\n怪物的生命值一共有222点。\n我们想要击杀怪物需要攻击怪物——222÷16(向上取整)=14次。\n为什么是向上取整?因为哪怕怪物还剩1点生命值,没死就是没死。",
+            "\t[小妖精,fairy]在我们攻击怪物14次的过程中,敌人也反击了我们13次。\n我们的生命因此损失了13*30=390点。\n如果没有关闭显伤开关的话,这个”390点“的数字将会显示在在怪物的左下角。\n剩余的生命仍然足够击败第二个相同的敌人呢——但好像还有什么事需要做?",
+            {
+                "type": "jump",
+                "to": [
+                    11,
+                    8
                 ],
-                "time": 1000,
+                "time": 500,
                 "keep": true
-            },
+            }
+        ],
+        "11,8": [
+            "\t[小妖精,fairy]在本作中,有一个便捷操作,叫做“自动存档”。\n具体点说,就是在我们与怪物发生战斗前,或开门前,都会进行一个存档。\n后面我们发现之前哪一步做错了,都有机会撤销,“反悔”——最多支持反悔50步之前的错误。\n读取自动存档的快捷键是“A”键。",
+            "\t[小妖精,fairy]红宝石可以提高角色的攻击力。\n不同形状、不同区域的红宝石,提高攻击力的程度也不一样。\n刚才黄门里的红宝石,在当前区域每一颗可以提升角色2点攻击力。",
             {
-                "type": "setValue",
-                "name": "flag:__visited__",
-                "value": "{}"
-            },
-            {
-                "type": "changeFloor",
-                "floorId": "guangchang",
-                "loc": [
-                    6,
-                    10
+                "type": "if",
+                "condition": "(status:hp!==280)",
+                "true": [
+                    "\t[小妖精,fairy]一般来说,在地图上有无需战斗就可以获得的资源时,优先获得这些资源再进行战斗。\n获得资源提升能力,会让我们在战斗中更具有优势。\n不用为了后面保存黄钥匙!钥匙是够的!",
+                    "\t[小妖精,fairy]所以你为什么没有拿红宝石就急匆匆地来战斗了!",
+                    "\t[小妖精,fairy]请读取自动存档,回去拿完宝石再与敌人作战!"
+                ],
+                "false": [
+                    "\t[小妖精,fairy]在提升攻击力后,角色的攻击将更有力度。\n在获得2颗红宝石之后,角色每次攻击对怪物造成的伤害将由16点提升到20点。\n原本需要222÷16=14次攻击击杀的怪物,现在只需要222÷20=12次即可击杀。",
+                    "\t[小妖精,fairy]由于怪物受到更少次数的攻击就被击杀了,角色受到的攻击次数也减少了。\n从13次减少到了11次。",
+                    "\t[小妖精,fairy]但要注意——不是所有时候提升攻击力都能降低角色受到的攻击次数。\n如果角色的攻击力仅提升了1点,攻击伤害从16提升到17——\n击败怪物需要的攻击次数是222÷17,还是14次。这意味着战斗伤害不会有任何变化。",
+                    "\t[小妖精,fairy]因此,能带来战斗伤害减少的攻击力提升节点特别重要——我们称之为“临界”。\n从最初的26点攻击力,16点攻击伤害,需要14次攻击击杀,开始计算——\n222÷13=17.077,这意味着我们至少要达到17.077的攻击伤害,才能减少击杀敌人的攻击次数——但由于本作的攻击力是整数,你必须达到18的攻击伤害,也就是28点攻击力,才能降低战斗伤害。",
+                    "\t[小妖精,fairy]同理,以现在的状态开始计算。现在我们需要12次攻击击杀怪物。\n222÷11=20.182,我们需要21的攻击伤害,也就是31点攻击力。",
+                    {
+                        "type": "callBook"
+                    },
+                    "\t[小妖精,fairy]我们的攻击力距离下一个临界点还差1点;达到临界点可以让我们受到的伤害减少30点。\n在怪物手册中记作[1,30]或\"1:30\"。\n同样地,右上角相同的怪物身上,在战斗伤害330的数字上面,显示的是距离下一个攻击临界点的距离,\n1点。",
+                    "\t[小妖精,fairy]但请注意,有的时候用更少的攻击次数击杀怪物,并不会让自己承受怪物的伤害变少哦!\n这就与我们接下来要讲解的属性,”速度“,有关啦。",
+                    "\t[小妖精,fairy]哎呀——生命值好像不太够了!\n捡起后面黄门里的血瓶,补充生命值继续后面的内容吧!",
+                    {
+                        "type": "jump",
+                        "to": [
+                            11,
+                            4
+                        ],
+                        "time": 500,
+                        "keep": true
+                    }
                 ]
             }
+        ],
+        "11,4": [
+            {
+                "type": "hide",
+                "remove": true
+            }
         ]
     },
     "changeFloor": {
@@ -58,6 +87,13 @@ main.floors.jiaocheng02=
                 6,
                 0
             ]
+        },
+        "6,0": {
+            "floorId": "jiaocheng03",
+            "loc": [
+                6,
+                12
+            ]
         }
     },
     "beforeBattle": {},
@@ -68,19 +104,19 @@ main.floors.jiaocheng02=
     "cannotMove": {},
     "cannotMoveIn": {},
     "map": [
-    [129,  1, 27,  1, 28,  1, 91,  1, 29,  1, 30,  1,129],
-    [ 70,  1, 82,  1, 82,  1,236,  1, 82,  1, 82,  1,375],
-    [  0, 83,  0, 29,  0, 33,  0, 31,  0, 23,  0, 83,  0],
-    [  1,  1,  1,  1,  1,  1,219,  1,  1,  1,  1,  1,  1],
-    [  0, 22,  0, 31,  0, 31,  0,  1, 27,  1, 30,  1, 30],
-    [ 81,  1, 81,  1, 81,  1, 22,  1, 27,  1, 30,  1, 27],
-    [ 29,  1, 31,  1, 31,  1,218,  1, 82,  1, 82,  1, 82],
-    [ 28,  1, 28,  1, 29,  1,  0, 81,  0, 33,  0, 21,  0],
-    [  1,  1,  1,  1,  1,  1,240,  1,  1,  1,  1,  1,  1],
-    [  0, 33,  0, 21,  0, 29,  0,  1, 27,  1, 28,  1, 31],
-    [ 83,  1, 83,  1, 83,  1,204,  1, 81,  1, 81,  1, 81],
-    [ 28,  1, 30,  1, 27,129,  0,204,  0, 33,  0, 23,  0],
-    [  1,  1,  1,  1,  1,  1, 93,  1,  1,  1,  1,  1,  1]
+    [  0, 33,  0,217, 31,  0, 91,  1, 28,  1, 30,  1,203],
+    [216,  1,  0,  1,  1,  1,  1,  1, 28,  1, 30,  1,  1],
+    [216,  1, 31,  1,  0,  0,  0, 81,  0,  1,  0,  1,211],
+    [211,  1, 21,  1,216,  1,216,  1,  1,  1, 81,  1,  1],
+    [  0,  1,  1,  1,  0,  1,  0,  0,  0,211,  0,  0,  0],
+    [  0,  1, 32,  1,  0,  1,  1,  0,  1,  1,  1,  1,211],
+    [  0, 81,  0,  1,  0,  1, 21, 33,  1, 33,  0, 81,  0],
+    [ 31,  1,  1,  1,217,  1,  1,  1,  1,  1,  1,  1, 22],
+    [203,  1, 33,  0,  0, 29, 29, 29, 29,  1,  0,  0,  0],
+    [  0,  1,  1,  1,  0,  1,  1,  1,  1,  1,203,  1, 82],
+    [ 33,  0,211,  1,  0,  1,  0,203,  0,124,  0,  1,  0],
+    [  0, 81,  0,  1,217,  1,  0,  1,  1, 81,  1,  1, 21],
+    [216,  0,  0, 21,  0,  1, 93,  1, 27,  0, 27,  1, 21]
 ],
     "areas": "牢狱",
     "bgmap": [
diff --git a/project/floors/jiaocheng03.js b/project/floors/jiaocheng03.js
new file mode 100644
index 0000000..069750d
--- /dev/null
+++ b/project/floors/jiaocheng03.js
@@ -0,0 +1,69 @@
+main.floors.jiaocheng03=
+{
+    "floorId": "jiaocheng03",
+    "title": "广场",
+    "name": "1",
+    "width": 13,
+    "height": 13,
+    "canFlyTo": true,
+    "canFlyFrom": true,
+    "canUseQuickShop": true,
+    "images": [],
+    "ratio": 1,
+    "defaultGround": "X90078",
+    "firstArrive": [],
+    "eachArrive": [],
+    "parallelDo": "",
+    "events": {
+        "0,0": [
+            "匕首:速度+20"
+        ],
+        "12,0": [
+            "法杖:魔攻比例10%,魔防比例0%"
+        ]
+    },
+    "changeFloor": {
+        "6,12": {
+            "floorId": "jiaocheng02",
+            "loc": [
+                6,
+                0
+            ]
+        }
+    },
+    "beforeBattle": {},
+    "afterBattle": {},
+    "afterGetItem": {},
+    "afterOpenDoor": {},
+    "autoEvent": {},
+    "cannotMove": {},
+    "cannotMoveIn": {},
+    "map": [
+    [129,  1, 27,  1, 28,  1, 91,  1, 29,  1, 30,  1,129],
+    [ 70,  1, 82,  1, 82,  1,236,  1, 82,  1, 82,  1,375],
+    [  0, 83,  0, 29,  0, 33,  0, 31,  0, 23,  0, 83,  0],
+    [  1,  1,  1,  1,  1,  1,219,  1,  1,  1,  1,  1,  1],
+    [  0, 22,  0, 31,  0, 31,  0,  1, 27,  1, 30,  1, 30],
+    [ 81,  1, 81,  1, 81,  1, 22,  1, 27,  1, 30,  1, 27],
+    [ 29,  1, 31,  1, 31,  1,218,  1, 82,  1, 82,  1, 82],
+    [ 28,  1, 28,  1, 29,  1,  0, 81,  0, 33,  0, 21,  0],
+    [  1,  1,  1,  1,  1,  1,240,  1,  1,  1,  1,  1,  1],
+    [  0, 33,  0, 21,  0, 29,  0,  1, 27,  1, 28,  1, 31],
+    [ 83,  1, 83,  1, 83,  1,204,  1, 81,  1, 81,  1, 81],
+    [ 28,  1, 30,  1, 27,129,  0,204,  0, 33,  0, 23,  0],
+    [  1,  1,  1,  1,  1,  1, 93,  1,  1,  1,  1,  1,  1]
+],
+    "areas": "牢狱",
+    "bgmap": [
+
+],
+    "fgmap": [
+
+],
+    "bg2map": [
+
+],
+    "fg2map": [
+
+]
+}
\ No newline at end of file

From d57ce74a799392d8cee1135ba0658243f99896e4 Mon Sep 17 00:00:00 2001
From: strawberry42271 <2806566736@qq.com>
Date: Tue, 18 Mar 2025 07:14:20 +0800
Subject: [PATCH 6/7] drawFailTip

---
 project/floors/jiaocheng03.js |  7 +++++++
 project/plugins.js            | 10 +++++-----
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/project/floors/jiaocheng03.js b/project/floors/jiaocheng03.js
index 069750d..80adfb2 100644
--- a/project/floors/jiaocheng03.js
+++ b/project/floors/jiaocheng03.js
@@ -29,6 +29,13 @@ main.floors.jiaocheng03=
                 6,
                 0
             ]
+        },
+        "6,0": {
+            "floorId": "guangchang",
+            "loc": [
+                6,
+                10
+            ]
         }
     },
     "beforeBattle": {},
diff --git a/project/plugins.js b/project/plugins.js
index fd6476c..e57b023 100644
--- a/project/plugins.js
+++ b/project/plugins.js
@@ -4493,7 +4493,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 	////// 绘制提示同时播放错误音效 //////
 	ui.prototype.drawFailTip = function (text, id, frame) {
 		this.drawTip(text, id, frame);
-		core.playSound('error.mp3');
+		core.playSound('error.opus');
 	}
 },
     "额外信息": function () {
@@ -6583,7 +6583,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 				info.select.id && ["toolbox", "equipbox"].includes(core.status.event.id)
 			)
 		) {
-			core.drawTip("发生了未知错误!");
+			core.drawFailTip("发生了未知错误!");
 			return;
 		}
 		return info.select.id;
@@ -6600,7 +6600,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 			}
 		} catch (e) {
 			console.error(e);
-			core.drawTip("批量使用时出现未知错误!");
+			core.drawFailTip("批量使用时出现未知错误!");
 		}
 	}
 
@@ -6629,11 +6629,11 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 				const id = getSelectedItem();
 
 				if (Number.isNaN(value) || value < 0 || value > 99) {
-					core.drawTip("输入不合法!");
+					core.drawFailTip("输入不合法!");
 					return;
 				}
 				if (!core.canUseItem(id)) {
-					core.drawTip("当前无法使用该道具!");
+					core.drawFailTip("当前无法使用该道具!");
 					return;
 				}
 				core.closePanel();

From 67a8f9ecdafdc85bddc5bd149a48197f4adcf1ed Mon Sep 17 00:00:00 2001
From: strawberry42271 <2806566736@qq.com>
Date: Tue, 18 Mar 2025 11:35:35 +0800
Subject: [PATCH 7/7] =?UTF-8?q?=E5=8A=A8=E7=94=BB=E6=9E=81=E9=80=9F?=
 =?UTF-8?q?=E6=A8=A1=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 project/plugins.js | 45 +++++++++++++++++++++++++++++++--------------
 1 file changed, 31 insertions(+), 14 deletions(-)

diff --git a/project/plugins.js b/project/plugins.js
index e57b023..d26f3cf 100644
--- a/project/plugins.js
+++ b/project/plugins.js
@@ -21651,7 +21651,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 		let max = heroInfo.speed
 		if (enemyInfo.speed > max) max = enemyInfo.speed
 		equipInfo.forEach(v => { if (v.speed > max) max = v.speed })
-		let i = 0
+		let i = 1
 		while (oneTurn * i / max < 15) {
 			i++
 		}
@@ -21659,7 +21659,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 		if (enemyInfo.onAttack) enemyInfo.now *= i
 		equipInfo.forEach(v => { if (v.onAttack) v.now *= i })
 		oneTurn *= i
-		console.log([oneTurn, heroInfo.now, enemyInfo.now])
 		let time = 0,
 			farme = 0;
 		return new Promise((res) => {
@@ -21689,11 +21688,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 					(inRect(pos, easyclosebox) && easy) ||
 					(inRect(pos, uneasyclosebox) && !easy)
 				) {
-					core.status.event.id = "";
-					core.unregisterAnimationFrame("attackAnimate");
-					core.clearMap(ctx);
-					core.closePanel();
-					res();
+					flags.qukly = !flags.qukly
+
 				}
 			};
 			async function drawAttackAnimate(
@@ -21723,7 +21719,28 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 					if (v.onAttack) onAttack = true;
 				});
 				core.clearMap(ctx);
-				let animate = Math.floor(farme / 30);
+				let animate = Math.floor(farme / 15);
+
+				if (flags.qukly) {
+					while (true) {
+						let goattack = false
+						equipInfo.forEach(v => {
+							if (v.now >= oneTurn) goattack = true
+
+						});
+						if (enemyInfo.now >= oneTurn) goattack = true
+						if (heroInfo.now >= oneTurn) goattack = true
+
+						if (goattack) break;
+						enemyInfo.now += enemyInfo.speed
+						heroInfo.now += heroInfo.speed
+						equipInfo.forEach(function (v) {
+							v.now += v.speed
+
+						});
+
+					}
+				}
 				if (easy) {
 					core.fillRect(ctx, 64, 52, 288, 212, "rgba(0,0,0,0.5)");
 					core.strokeRect(ctx, 64, 52, 288, 212, "rgba(255,255,255,0.5)", 4);
@@ -21854,7 +21871,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 					);
 					core.fillBoldText(
 						ctx,
-						"跳过",
+						flags.qukly ? "正常" : "极速",
 						330,
 						250,
 						"#FFFF60",
@@ -21881,7 +21898,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 						"bold 36px pala"
 					);
 
-					if (!attack && !onAttack) enemyInfo.now += enemyInfo.speed;
+					if (!attack && !onAttack && !flags.qukly) enemyInfo.now += enemyInfo.speed;
 					let enemynow = Math.min(100 + (enemyInfo.now / oneTurn) * 215, 315);
 					ctx.fillStyle = "#FFFFFF";
 					ctx.beginPath();
@@ -21932,7 +21949,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 
 						core.drawIcon(ctx, v.id, vnow - 16, 54, 32, 32);
 					});
-					if (!attack && !onAttack) heroInfo.now += hero.speed;
+					if (!attack && !onAttack && !flags.qukly) heroInfo.now += hero.speed;
 					let heronow = Math.min(100 + (heroInfo.now / oneTurn) * 215, 315);
 					ctx.beginPath();
 					ctx.moveTo(heronow, 120);
@@ -22202,7 +22219,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 					);
 					core.fillBoldText(
 						ctx,
-						"跳过",
+						flags.qukly ? "正常" : "极速",
 						330,
 						365,
 						"#FFFF60",
@@ -22229,7 +22246,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 						"bold 36px pala"
 					);
 
-					if (!attack && !onAttack) enemyInfo.now += enemyInfo.speed;
+					if (!attack && !onAttack & !flags.qukly) enemyInfo.now += enemyInfo.speed;
 					let enemynow = Math.min(100 + (enemyInfo.now / oneTurn) * 215, 315);
 					ctx.fillStyle = "#FFFFFF";
 					ctx.beginPath();
@@ -22280,7 +22297,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
 
 						core.drawIcon(ctx, v.id, vnow - 16, 54, 32, 32);
 					});
-					if (!attack && !onAttack) heroInfo.now += hero.speed;
+					if (!attack && !onAttack && !flags.qukly) heroInfo.now += hero.speed;
 					let heronow = Math.min(100 + (heroInfo.now / oneTurn) * 215, 315);
 					ctx.beginPath();
 					ctx.moveTo(heronow, 120);