From 67f531c4c5177525dc92da426ca521fea7044931 Mon Sep 17 00:00:00 2001
From: strawberry42271 <2806566736@qq.com>
Date: Thu, 30 Jan 2025 00:10:55 +0800
Subject: [PATCH 01/10] =?UTF-8?q?=E5=B1=9E=E6=80=A7=EF=BC=8C=E6=88=98?=
=?UTF-8?q?=E6=96=97=E6=9B=B4=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
_server/MotaAction.g4 | 8 +-
_server/table/data.comment.js | 15 +-
project/data.js | 3 +-
project/functions.js | 4 +-
project/plugins.js | 5852 +++++++++++++++++----------------
5 files changed, 2973 insertions(+), 2909 deletions(-)
diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4
index 5b1b0f7..fdb313d 100644
--- a/_server/MotaAction.g4
+++ b/_server/MotaAction.g4
@@ -4625,8 +4625,8 @@ IdString
;
FixedId_List
- : '生命'|'生命上限'|'攻击'|'防御'|'护盾'|'黄钥匙'|'蓝钥匙'|'红钥匙'|'金币'|'经验'|'魔力'|'魔力上限'|'当前横坐标'|'当前纵坐标'|'当前朝向'|'攻击增益'|'防御增益'|'护盾增益'
- /*FixedId_List ['status:hp','status:hpmax','status:atk','status:def','status:mdef','item:yellowKey','item:blueKey','item:redKey','status:money','status:exp','status:mana','status:manamax','status:x','status:y','status:direction','buff:atk','buff:def','buff:mdef']*/;
+ : '生命'|'生命上限'|'攻击'|'防御'|'法强'|'魔攻比例'|'护盾比例'|'黄钥匙'|'蓝钥匙'|'红钥匙'|'金币'|'经验'|'魔力'|'魔力上限'|'当前横坐标'|'当前纵坐标'|'当前朝向'|'攻击增益'|'防御增益'|'护盾增益'
+ /*FixedId_List ['status:hp','status:hpmax','status:atk','status:def','status:spell','status:matk','status:mdef','item:yellowKey','item:blueKey','item:redKey','status:money','status:exp','status:mana','status:manamax','status:x','status:y','status:direction','buff:atk','buff:def','buff:mdef']*/;
Id_List
: '变量' | '状态' | '物品' | '增益' | '独立开关' | '临时变量' |'全局存储'
@@ -4641,8 +4641,8 @@ EnemyPoint_List
/*EnemyPoint_List ['hp','atk','def','money','exp','point','name']*/;
Equip_List
- : '生命'|'生命上限'|'攻击'|'防御'|'法强'|'魔力'|'魔力上限'|'速度'
- /*Equip_List ['hp','hpmax','atk','def','mdef','mana','manamax','speed']*/;
+ : '生命'|'生命上限'|'攻击'|'防御'|'法强'|'魔攻比例'|'护盾比例'|'魔力'|'魔力上限'|'速度'
+ /*Equip_List ['hp','hpmax','atk','def','spell','matk','mdef','mana','manamax','speed']*/;
Key_List
: '黄钥匙'|'蓝钥匙'|'红钥匙'|'绿钥匙'|'铁门钥匙'
diff --git a/_server/table/data.comment.js b/_server/table/data.comment.js
index 3a76bd7..8fda0a1 100644
--- a/_server/table/data.comment.js
+++ b/_server/table/data.comment.js
@@ -264,10 +264,23 @@ var data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = {
"_type": "textarea",
"_data": "防御"
},
+ "spell": {
+ "_leaf": true,
+ "_type": "textarea",
+ "_data": "法强",
+ },
+
+ "matk": {
+ "_leaf": true,
+ "_type": "textarea",
+ "_data": "100为法强转化为等值魔攻",
+ "_docs": "魔攻比例"
+ },
"mdef": {
"_leaf": true,
"_type": "textarea",
- "_data": "法强"
+ "_data": "100为法强转化为等值护盾",
+ "_docs": "护盾比例"
},
"speed": {
"_leaf": true,
diff --git a/project/data.js b/project/data.js
index 3684d33..c458804 100644
--- a/project/data.js
+++ b/project/data.js
@@ -1135,7 +1135,8 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
"useBetweenLight": true
},
"followers": [],
- "steps": 0
+ "steps": 0,
+ "matk": 0
},
"startCanvas": [
{
diff --git a/project/functions.js b/project/functions.js
index 92736e7..770d92d 100644
--- a/project/functions.js
+++ b/project/functions.js
@@ -1167,7 +1167,9 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
mana: "魔力",
atk: "攻击",
def: "防御",
- mdef: "法强",
+ spell: "法强",
+ matk: "魔攻比例",
+ mdef: "护盾比例",
speed: "速度",
money: "金币",
exp: "经验",
diff --git a/project/plugins.js b/project/plugins.js
index bd0456e..641697a 100644
--- a/project/plugins.js
+++ b/project/plugins.js
@@ -3735,569 +3735,588 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
// init() called in `afterLoadResources`.
},
"override": function () {
- core.statusBar.icons = {
- floor: 0,
- name: null,
- lv: 1,
- hpmax: 2,
- hp: 3,
- atk: 4,
- def: 5,
- mdef: 6,
- money: 7,
- exp: 8,
- up: 9,
- book: 10,
- fly: 11,
- toolbox: 12,
- keyboard: 13,
- shop: 14,
- save: 15,
- load: 16,
- settings: 17,
- play: 18,
- pause: 19,
- stop: 20,
- speedDown: 21,
- speedUp: 22,
- rewind: 23,
- equipbox: 24,
- mana: 25,
- skill: 26,
- exit: 27,
- btn1: 28,
- btn2: 29,
- btn3: 30,
- btn4: 31,
- btn5: 32,
- btn6: 33,
- btn7: 34,
- alt: 35,
- keys: 36,
- help: 37,
- battle: 38,
- };
- core.actions._getClickLoc = function (x, y) {
- var size = 32 * core.domStyle.scale;
- var left = main.dom.gameDraw.offsetLeft + main.dom.gameGroup.offsetLeft;
- var top = main.dom.gameDraw.offsetTop + main.dom.gameGroup.offsetTop;
- var loc = {
- x: Math.max(x - left, 0),
- y: Math.max(y - top, 0),
- size: size,
- };
- return loc;
- };
- core.ui._drawWindowSelector = function (background, x, y, w, h) {
- w = Math.round(w) + 48;
- h = Math.round(h);
- var ctx = core.ui.createCanvas("_selector", x - 24, y, w, h, 165);
- ctx.canvas.id = "";
- this._drawSelector(ctx, background, w, h);
- };
+ core.statusBar.icons = {
+ floor: 0,
+ name: null,
+ lv: 1,
+ hpmax: 2,
+ hp: 3,
+ atk: 4,
+ def: 5,
+ mdef: 6,
+ money: 7,
+ exp: 8,
+ up: 9,
+ book: 10,
+ fly: 11,
+ toolbox: 12,
+ keyboard: 13,
+ shop: 14,
+ save: 15,
+ load: 16,
+ settings: 17,
+ play: 18,
+ pause: 19,
+ stop: 20,
+ speedDown: 21,
+ speedUp: 22,
+ rewind: 23,
+ equipbox: 24,
+ mana: 25,
+ skill: 26,
+ exit: 27,
+ btn1: 28,
+ btn2: 29,
+ btn3: 30,
+ btn4: 31,
+ btn5: 32,
+ btn6: 33,
+ btn7: 34,
+ alt: 35,
+ keys: 36,
+ help: 37,
+ battle: 38,
+ };
+ core.actions._getClickLoc = function (x, y) {
+ var size = 32 * core.domStyle.scale;
+ var left = main.dom.gameDraw.offsetLeft + main.dom.gameGroup.offsetLeft;
+ var top = main.dom.gameDraw.offsetTop + main.dom.gameGroup.offsetTop;
+ var loc = {
+ x: Math.max(x - left, 0),
+ y: Math.max(y - top, 0),
+ size: size,
+ };
+ return loc;
+ };
+ core.ui._drawWindowSelector = function (background, x, y, w, h) {
+ w = Math.round(w) + 48;
+ h = Math.round(h);
+ var ctx = core.ui.createCanvas("_selector", x - 24, y, w, h, 165);
+ ctx.canvas.id = "";
+ this._drawSelector(ctx, background, w, h);
+ };
- core.ui._drawSelector = function (ctx, background, w, h, left, top) {
- left = left || 0;
- top = top || 0;
- ctx = this.getContextByName(ctx);
- if (!ctx) return;
- if (typeof background == "string")
- background = core.material.images.images[background];
- if (!(background instanceof Image)) return;
- // badge
- ctx.drawImage(background, 132, 68, 24, 24, left + 4, top + 4, 24, 24);
- ctx.drawImage(
- background,
- 132,
- 68,
- 24,
- 24,
- w - left - 28,
- top + 4,
- 24,
- 24
- );
- };
+ core.ui._drawSelector = function (ctx, background, w, h, left, top) {
+ left = left || 0;
+ top = top || 0;
+ ctx = this.getContextByName(ctx);
+ if (!ctx) return;
+ if (typeof background == "string")
+ background = core.material.images.images[background];
+ if (!(background instanceof Image)) return;
+ // badge
+ ctx.drawImage(background, 132, 68, 24, 24, left + 4, top + 4, 24, 24);
+ ctx.drawImage(
+ background,
+ 132,
+ 68,
+ 24,
+ 24,
+ w - left - 28,
+ top + 4,
+ 24,
+ 24
+ );
+ };
- enemys.prototype._nextCriticals_useBinarySearch = function (
- enemy,
- info,
- number,
- x,
- y,
- floorId
- ) {
- var mon_hp = info.mon_hp,
- hero_atk = core.status.hero.atk,
- mon_def = info.mon_def,
- pre = info.damage;
- var list = [];
- var start_atk = hero_atk;
- if (info.__over__) {
- start_atk += info.__overAtk__;
- list.push([info.__overAtk__, -info.damage]);
- }
- var calNext = function (currAtk, maxAtk) {
- var start = Math.floor(currAtk),
- end = Math.floor(maxAtk);
- if (start > end) return null;
+ enemys.prototype._nextCriticals_useBinarySearch = function (
+ enemy,
+ info,
+ number,
+ x,
+ y,
+ floorId
+ ) {
+ var mon_hp = info.mon_hp,
+ hero_atk = core.status.hero.atk,
+ mon_def = info.mon_def,
+ pre = info.damage;
+ var list = [];
+ var start_atk = hero_atk;
+ if (info.__over__) {
+ start_atk += info.__overAtk__;
+ list.push([info.__overAtk__, -info.damage]);
+ }
+ var calNext = function (currAtk, maxAtk) {
+ var start = Math.floor(currAtk),
+ end = Math.floor(maxAtk);
+ if (start > end) return null;
- while (start < end) {
- var mid = Math.floor((start + end) / 2);
- if (mid - start > end - mid) mid--;
- var nextInfo = core.enemys.getDamageInfo(
- enemy,
- { atk: mid },
- x,
- y,
- floorId
- );
- if (nextInfo == null || typeof nextInfo == "number") return null;
- if (pre > nextInfo.damage) end = mid;
- else start = mid + 1;
- }
- var nextInfo = core.enemys.getDamageInfo(
- enemy,
- { atk: start },
- x,
- y,
- floorId
- );
- return nextInfo == null ||
- typeof nextInfo == "number" ||
- nextInfo.damage >= pre
- ? null
- : [start, nextInfo.damage];
- };
- var currAtk = start_atk;
- while (true) {
- var next = calNext(currAtk + 1, Number.MAX_SAFE_INTEGER, pre);
- if (next == null) break;
- currAtk = next[0];
- pre = next[1];
- list.push([currAtk - hero_atk, info.damage - pre]);
- if (pre <= 0 && !core.flags.enableNegativeDamage) break;
- if (list.length >= number) break;
- }
- if (list.length == 0) list.push([0, 0]);
- return list;
- };
- core.ui.clearMap = function (name, x, y, width, height) {
- if (name == "all") {
- for (var m in core.canvas) {
- core.canvas[m].clearRect(
- -32,
- -32,
- core.canvas[m].canvas.width + 32,
- core.canvas[m].canvas.height + 32
- );
- }
- core.clearMap("outerUI");
- core.dom.gif.innerHTML = "";
- core.removeGlobalAnimate();
- core.deleteCanvas(function (one) {
- return one.startsWith("_bigImage_");
- });
- core.setWeather(null);
- } else {
- var ctx = this.getContextByName(name);
- if (ctx)
- ctx.clearRect(
- x || 0,
- y || 0,
- width || ctx.canvas.width,
- height || ctx.canvas.height
- );
- }
- };
- events.prototype.openBook = function (fromUserAction) {
- if (core.isReplaying()) return;
- // 如果能恢复事件(从callBook事件触发)
- if (
- core.status.event.id == "book" &&
- core.events.recoverEvents(core.status.event.interval)
- )
- return;
- // 当前是book,且从“浏览地图”打开
- if (core.status.event.id == "book" && core.status.event.ui) {
- core.status.boxAnimateObjs = [];
- core.ui._drawViewMaps(core.status.event.ui);
- return;
- }
- // 从“浏览地图”页面打开
- if (core.status.event.id == "viewMaps" || core.status.event.id == "fly") {
- fromUserAction = false;
- core.status.event.ui = core.status.event.data;
- }
- if (!this._checkStatus("book", fromUserAction, true)) return;
- core.playSound("打开界面");
- core.useItem("book", true);
- };
- ////// 怪物手册界面时,放开某个键的操作 //////
- core.actions._keyUpBook = function (keycode) {
- if (keycode == 27 || keycode == 88) {
- core.playSound("取消");
- if (core.events.recoverEvents(core.status.event.interval)) {
- return;
- } else if (core.status.event.ui != null) {
- core.status.boxAnimateObjs = [];
- if (typeof core.status.event.ui === "number") {
- core.status.event.id = "fly";
- core.ui.drawFly(core.status.event.ui);
- } else {
- core.ui._drawViewMaps(core.status.event.ui);
- }
- } else core.ui.closePanel();
- return;
- }
- if (keycode == 13 || keycode == 32 || keycode == 67) {
- var data = core.status.event.data;
- if (data != null) {
- core.ui._drawBookDetail(data);
- }
- return;
- }
- };
- ////// 怪物手册界面的点击操作 //////
- actions.prototype._clickBook = function (x, y) {
- var pageinfo = core.ui._drawBook_pageinfo();
- // 上一页
- if (
- (x == this._HX_ - 2 || x == this._HX_ - 3) &&
- y === core._HEIGHT_ - 1
- ) {
- core.playSound("光标移动");
- core.ui.drawBook(core.status.event.data - pageinfo.per_page);
- return;
- }
- // 下一页
- if (
- (x == this._HX_ + 2 || x == this._HX_ + 3) &&
- y === core._HEIGHT_ - 1
- ) {
- core.playSound("光标移动");
- core.ui.drawBook(core.status.event.data + pageinfo.per_page);
- return;
- }
- // 返回
- if (x >= this.LAST - 2 && y === core._HEIGHT_ - 1) {
- core.playSound("取消");
- if (core.events.recoverEvents(core.status.event.interval)) {
- return;
- } else if (core.status.event.ui != null) {
- core.status.boxAnimateObjs = [];
- if (typeof core.status.event.ui === "number") {
- core.status.event.id = "fly";
- core.ui.drawFly(core.status.event.ui);
- } else {
- core.ui._drawViewMaps(core.status.event.ui);
- }
- } else core.ui.closePanel();
- return;
- }
- // 怪物信息
- var data = core.status.event.data;
- if (data != null && y < core._HEIGHT_ - 1) {
- var per_page = pageinfo.per_page,
- page = parseInt(data / per_page);
- var u = (core._HEIGHT_ - 1) / per_page;
- for (var i = 0; i < per_page; ++i) {
- if (y >= u * i && y < u * (i + 1)) {
- var index = per_page * page + i;
- core.ui.drawBook(index);
- core.ui._drawBookDetail(index);
- break;
- }
- }
- return;
- }
- return;
- };
+ while (start < end) {
+ var mid = Math.floor((start + end) / 2);
+ if (mid - start > end - mid) mid--;
+ var nextInfo = core.enemys.getDamageInfo(
+ enemy, { atk: mid },
+ x,
+ y,
+ floorId
+ );
+ if (nextInfo == null || typeof nextInfo == "number") return null;
+ if (pre > nextInfo.damage) end = mid;
+ else start = mid + 1;
+ }
+ var nextInfo = core.enemys.getDamageInfo(
+ enemy, { atk: start },
+ x,
+ y,
+ floorId
+ );
+ return nextInfo == null ||
+ typeof nextInfo == "number" ||
+ nextInfo.damage >= pre ?
+ null : [start, nextInfo.damage];
+ };
+ var currAtk = start_atk;
+ while (true) {
+ var next = calNext(currAtk + 1, Number.MAX_SAFE_INTEGER, pre);
+ if (next == null) break;
+ currAtk = next[0];
+ pre = next[1];
+ list.push([currAtk - hero_atk, info.damage - pre]);
+ if (pre <= 0 && !core.flags.enableNegativeDamage) break;
+ if (list.length >= number) break;
+ }
+ if (list.length == 0) list.push([0, 0]);
+ return list;
+ };
+ core.ui.clearMap = function (name, x, y, width, height) {
+ if (name == "all") {
+ for (var m in core.canvas) {
+ core.canvas[m].clearRect(
+ -32,
+ -32,
+ core.canvas[m].canvas.width + 32,
+ core.canvas[m].canvas.height + 32
+ );
+ }
+ core.clearMap("outerUI");
+ core.dom.gif.innerHTML = "";
+ core.removeGlobalAnimate();
+ core.deleteCanvas(function (one) {
+ return one.startsWith("_bigImage_");
+ });
+ core.setWeather(null);
+ } else {
+ var ctx = this.getContextByName(name);
+ if (ctx)
+ ctx.clearRect(
+ x || 0,
+ y || 0,
+ width || ctx.canvas.width,
+ height || ctx.canvas.height
+ );
+ }
+ };
+ events.prototype.openBook = function (fromUserAction) {
+ if (core.isReplaying()) return;
+ // 如果能恢复事件(从callBook事件触发)
+ if (
+ core.status.event.id == "book" &&
+ core.events.recoverEvents(core.status.event.interval)
+ )
+ return;
+ // 当前是book,且从“浏览地图”打开
+ if (core.status.event.id == "book" && core.status.event.ui) {
+ core.status.boxAnimateObjs = [];
+ core.ui._drawViewMaps(core.status.event.ui);
+ return;
+ }
+ // 从“浏览地图”页面打开
+ if (core.status.event.id == "viewMaps" || core.status.event.id == "fly") {
+ fromUserAction = false;
+ core.status.event.ui = core.status.event.data;
+ }
+ if (!this._checkStatus("book", fromUserAction, true)) return;
+ core.playSound("打开界面");
+ core.useItem("book", true);
+ };
+ ////// 怪物手册界面时,放开某个键的操作 //////
+ core.actions._keyUpBook = function (keycode) {
+ if (keycode == 27 || keycode == 88) {
+ core.playSound("取消");
+ if (core.events.recoverEvents(core.status.event.interval)) {
+ return;
+ } else if (core.status.event.ui != null) {
+ core.status.boxAnimateObjs = [];
+ if (typeof core.status.event.ui === "number") {
+ core.status.event.id = "fly";
+ core.ui.drawFly(core.status.event.ui);
+ } else {
+ core.ui._drawViewMaps(core.status.event.ui);
+ }
+ } else core.ui.closePanel();
+ return;
+ }
+ if (keycode == 13 || keycode == 32 || keycode == 67) {
+ var data = core.status.event.data;
+ if (data != null) {
+ core.ui._drawBookDetail(data);
+ }
+ return;
+ }
+ };
+ ////// 怪物手册界面的点击操作 //////
+ actions.prototype._clickBook = function (x, y) {
+ var pageinfo = core.ui._drawBook_pageinfo();
+ // 上一页
+ if (
+ (x == this._HX_ - 2 || x == this._HX_ - 3) &&
+ y === core._HEIGHT_ - 1
+ ) {
+ core.playSound("光标移动");
+ core.ui.drawBook(core.status.event.data - pageinfo.per_page);
+ return;
+ }
+ // 下一页
+ if (
+ (x == this._HX_ + 2 || x == this._HX_ + 3) &&
+ y === core._HEIGHT_ - 1
+ ) {
+ core.playSound("光标移动");
+ core.ui.drawBook(core.status.event.data + pageinfo.per_page);
+ return;
+ }
+ // 返回
+ if (x >= this.LAST - 2 && y === core._HEIGHT_ - 1) {
+ core.playSound("取消");
+ if (core.events.recoverEvents(core.status.event.interval)) {
+ return;
+ } else if (core.status.event.ui != null) {
+ core.status.boxAnimateObjs = [];
+ if (typeof core.status.event.ui === "number") {
+ core.status.event.id = "fly";
+ core.ui.drawFly(core.status.event.ui);
+ } else {
+ core.ui._drawViewMaps(core.status.event.ui);
+ }
+ } else core.ui.closePanel();
+ return;
+ }
+ // 怪物信息
+ var data = core.status.event.data;
+ if (data != null && y < core._HEIGHT_ - 1) {
+ var per_page = pageinfo.per_page,
+ page = parseInt(data / per_page);
+ var u = (core._HEIGHT_ - 1) / per_page;
+ for (var i = 0; i < per_page; ++i) {
+ if (y >= u * i && y < u * (i + 1)) {
+ var index = per_page * page + i;
+ core.ui.drawBook(index);
+ core.ui._drawBookDetail(index);
+ break;
+ }
+ }
+ return;
+ }
+ return;
+ };
- ////// 执行当前自定义事件列表中的下一个事件 //////
- events.prototype.doAction = function () {
- // 清空boxAnimate和UI层
- clearInterval(core.status.event.interval);
- clearTimeout(core.status.event.interval);
- clearInterval(core.status.event.animateUI);
- core.status.event.interval = null;
- delete core.status.event.aniamteUI;
- if (core.status.gameOver || core.status.replay.failed) return;
- // 判定是否执行完毕
- if (this._doAction_finishEvents()) return;
- core.clearUI();
- var floorId = core.status.event.data.floorId || core.status.floorId;
- // 当前点坐标和前缀
- var x = core.status.event.data.x,
- y = core.status.event.data.y;
- var prefix = [
- floorId || ":f",
- x != null ? x : "x",
- y != null ? y : "y",
- ].join("@");
- var current = core.status.event.data.list[0];
- if (this._popEvents(current, prefix)) return;
- // 当前要执行的事件
- var data = current.todo.shift();
- core.status.event.data.current = data;
- if (typeof data == "string") data = { type: "text", text: data };
- // 该事件块已经被禁用
- if (data._disabled) return core.doAction();
- if (data.type !== "cgtext") {
- core.unregisterAnimationFrame("skip");
- core.setFlag("skip", false);
- }
- data.floorId = data.floorId || floorId;
- core.status.event.data.type = data.type;
- this.doEvent(data, x, y, prefix);
- return;
- };
+ ////// 执行当前自定义事件列表中的下一个事件 //////
+ events.prototype.doAction = function () {
+ // 清空boxAnimate和UI层
+ clearInterval(core.status.event.interval);
+ clearTimeout(core.status.event.interval);
+ clearInterval(core.status.event.animateUI);
+ core.status.event.interval = null;
+ delete core.status.event.aniamteUI;
+ if (core.status.gameOver || core.status.replay.failed) return;
+ // 判定是否执行完毕
+ if (this._doAction_finishEvents()) return;
+ core.clearUI();
+ var floorId = core.status.event.data.floorId || core.status.floorId;
+ // 当前点坐标和前缀
+ var x = core.status.event.data.x,
+ y = core.status.event.data.y;
+ var prefix = [
+ floorId || ":f",
+ x != null ? x : "x",
+ y != null ? y : "y",
+ ].join("@");
+ var current = core.status.event.data.list[0];
+ if (this._popEvents(current, prefix)) return;
+ // 当前要执行的事件
+ var data = current.todo.shift();
+ core.status.event.data.current = data;
+ if (typeof data == "string") data = { type: "text", text: data };
+ // 该事件块已经被禁用
+ if (data._disabled) return core.doAction();
+ if (data.type !== "cgtext") {
+ core.unregisterAnimationFrame("skip");
+ core.setFlag("skip", false);
+ }
+ data.floorId = data.floorId || floorId;
+ core.status.event.data.type = data.type;
+ this.doEvent(data, x, y, prefix);
+ return;
+ };
- ////// 在某个canvas上绘制粗体 //////
- core.fillBoldText1 = function (
- name,
- text,
- x,
- y,
- style,
- strokeStyle,
- lineWidth,
- font,
- maxWidth
- ) {
- var ctx = this.getContextByName(name);
- if (!ctx) return;
- if (font) ctx.font = font;
- if (!style) style = ctx.fillStyle;
- style = core.arrayToRGBA(style);
- if (!strokeStyle) strokeStyle = "#000000";
- strokeStyle = core.arrayToRGBA(strokeStyle);
- if (maxWidth != null) {
- this.setFontForMaxWidth(ctx, text, maxWidth);
- }
- ctx.strokeStyle = strokeStyle;
+ ////// 在某个canvas上绘制粗体 //////
+ core.fillBoldText1 = function (
+ name,
+ text,
+ x,
+ y,
+ style,
+ strokeStyle,
+ lineWidth,
+ font,
+ maxWidth
+ ) {
+ var ctx = this.getContextByName(name);
+ if (!ctx) return;
+ if (font) ctx.font = font;
+ if (!style) style = ctx.fillStyle;
+ style = core.arrayToRGBA(style);
+ if (!strokeStyle) strokeStyle = "#000000";
+ strokeStyle = core.arrayToRGBA(strokeStyle);
+ if (maxWidth != null) {
+ this.setFontForMaxWidth(ctx, text, maxWidth);
+ }
+ ctx.strokeStyle = strokeStyle;
- if (!lineWidth) lineWidth = 2;
- ctx.lineWidth = lineWidth;
- ctx.strokeText(text, x, y);
- ctx.fillStyle = style;
- ctx.fillText(text, x, y);
- };
- ////// 绘制 WindowSkin
- ui.prototype.drawWindowSkin = function (
- background,
- ctx,
- x,
- y,
- w,
- h,
- direction,
- px,
- py,
- size = 1
- ) {
- background = background || core.status.textAttribute.background;
+ if (!lineWidth) lineWidth = 2;
+ ctx.lineWidth = lineWidth;
+ ctx.strokeText(text, x, y);
+ ctx.fillStyle = style;
+ ctx.fillText(text, x, y);
+ };
+ ////// 绘制 WindowSkin
+ ui.prototype.drawWindowSkin = function (
+ background,
+ ctx,
+ x,
+ y,
+ w,
+ h,
+ direction,
+ px,
+ py,
+ size = 1
+ ) {
+ background = background || core.status.textAttribute.background;
- // 仿RM窗口皮肤 ↓
- // 绘制背景
- core.drawImage(
- ctx,
- background,
- 0,
- 0,
- 128,
- 128,
- x + 2 * size,
- y + 2 * size,
- w - 4 * size,
- h - 4 * size
- );
- // 绘制边框
- // 上方
- core.drawImage(
- ctx,
- background,
- 128,
- 0,
- 16,
- 16,
- x,
- y,
- 16 * size,
- 16 * size
- );
- for (var dx = 0; dx < w - 64 * size; dx += 32 * size) {
- core.drawImage(
- ctx,
- background,
- 144,
- 0,
- 32,
- 16,
- x + dx + 16 * size,
- y,
- 32 * size,
- 16 * size
- );
- core.drawImage(
- ctx,
- background,
- 144,
- 48,
- 32,
- 16,
- x + dx + 16 * size,
- y + h - 16 * size,
- 32 * size,
- 16 * size
- );
- }
- core.drawImage(
- ctx,
- background,
- 144,
- 0,
- (w - dx - 32 * size) / size,
- 16,
- x + dx + 16 * size,
- y,
- w - dx - 32 * size,
- 16 * size
- );
- core.drawImage(
- ctx,
- background,
- 144,
- 48,
- (w - dx - 32 * size) / size,
- 16,
- x + dx + 16 * size,
- y + h - 16 * size,
- w - dx - 32 * size,
- 16 * size
- );
- core.drawImage(
- ctx,
- background,
- 176,
- 0,
- 16,
- 16,
- x + w - 16 * size,
- y,
- 16 * size,
- 16 * size
- );
- // 左右
- for (var dy = 0; dy < h - 64 * size; dy += 32 * size) {
- core.drawImage(
- ctx,
- background,
- 128,
- 16,
- 16,
- 32,
- x,
- y + dy + 16 * size,
- 16 * size,
- 32 * size
- );
- core.drawImage(
- ctx,
- background,
- 176,
- 16,
- 16,
- 32,
- x + w - 16 * size,
- y + dy + 16 * size,
- 16 * size,
- 32 * size
- );
- }
- core.drawImage(
- ctx,
- background,
- 128,
- 16,
- 16,
- (h - dy - 32 * size) / size,
- x,
- y + dy + 16 * size,
- 16 * size,
- h - dy - 32 * size
- );
- core.drawImage(
- ctx,
- background,
- 176,
- 16,
- 16,
- (h - dy - 32 * size) / size,
- x + w - 16 * size,
- y + dy + 16 * size,
- 16 * size,
- h - dy - 32 * size
- );
- //下方
- core.drawImage(
- ctx,
- background,
- 128,
- 48,
- 16,
- 16,
- x,
- y + h - 16 * size,
- 16 * size,
- 16 * size
- );
- core.drawImage(
- ctx,
- background,
- 176,
- 48,
- 16,
- 16,
- x + w - 16 * size,
- y + h - 16 * size,
- 16 * size,
- 16 * size
- );
+ // 仿RM窗口皮肤 ↓
+ // 绘制背景
+ core.drawImage(
+ ctx,
+ background,
+ 0,
+ 0,
+ 128,
+ 128,
+ x + 2 * size,
+ y + 2 * size,
+ w - 4 * size,
+ h - 4 * size
+ );
+ // 绘制边框
+ // 上方
+ core.drawImage(
+ ctx,
+ background,
+ 128,
+ 0,
+ 16,
+ 16,
+ x,
+ y,
+ 16 * size,
+ 16 * size
+ );
+ for (var dx = 0; dx < w - 64 * size; dx += 32 * size) {
+ core.drawImage(
+ ctx,
+ background,
+ 144,
+ 0,
+ 32,
+ 16,
+ x + dx + 16 * size,
+ y,
+ 32 * size,
+ 16 * size
+ );
+ core.drawImage(
+ ctx,
+ background,
+ 144,
+ 48,
+ 32,
+ 16,
+ x + dx + 16 * size,
+ y + h - 16 * size,
+ 32 * size,
+ 16 * size
+ );
+ }
+ core.drawImage(
+ ctx,
+ background,
+ 144,
+ 0,
+ (w - dx - 32 * size) / size,
+ 16,
+ x + dx + 16 * size,
+ y,
+ w - dx - 32 * size,
+ 16 * size
+ );
+ core.drawImage(
+ ctx,
+ background,
+ 144,
+ 48,
+ (w - dx - 32 * size) / size,
+ 16,
+ x + dx + 16 * size,
+ y + h - 16 * size,
+ w - dx - 32 * size,
+ 16 * size
+ );
+ core.drawImage(
+ ctx,
+ background,
+ 176,
+ 0,
+ 16,
+ 16,
+ x + w - 16 * size,
+ y,
+ 16 * size,
+ 16 * size
+ );
+ // 左右
+ for (var dy = 0; dy < h - 64 * size; dy += 32 * size) {
+ core.drawImage(
+ ctx,
+ background,
+ 128,
+ 16,
+ 16,
+ 32,
+ x,
+ y + dy + 16 * size,
+ 16 * size,
+ 32 * size
+ );
+ core.drawImage(
+ ctx,
+ background,
+ 176,
+ 16,
+ 16,
+ 32,
+ x + w - 16 * size,
+ y + dy + 16 * size,
+ 16 * size,
+ 32 * size
+ );
+ }
+ core.drawImage(
+ ctx,
+ background,
+ 128,
+ 16,
+ 16,
+ (h - dy - 32 * size) / size,
+ x,
+ y + dy + 16 * size,
+ 16 * size,
+ h - dy - 32 * size
+ );
+ core.drawImage(
+ ctx,
+ background,
+ 176,
+ 16,
+ 16,
+ (h - dy - 32 * size) / size,
+ x + w - 16 * size,
+ y + dy + 16 * size,
+ 16 * size,
+ h - dy - 32 * size
+ );
+ //下方
+ core.drawImage(
+ ctx,
+ background,
+ 128,
+ 48,
+ 16,
+ 16,
+ x,
+ y + h - 16 * size,
+ 16 * size,
+ 16 * size
+ );
+ core.drawImage(
+ ctx,
+ background,
+ 176,
+ 48,
+ 16,
+ 16,
+ x + w - 16 * size,
+ y + h - 16 * size,
+ 16 * size,
+ 16 * size
+ );
- // arrow
- if (px != null && py != null) {
- if (direction == "up") {
- core.drawImage(
- ctx,
- background,
- 128,
- 96,
- 32,
- 32,
- px,
- y + h - 3 * size,
- 32 * size,
- 32 * size
- );
- } else if (direction == "down") {
- core.drawImage(
- ctx,
- background,
- 160,
- 96,
- 32,
- 32,
- px,
- y - 29 * size,
- 32 * size,
- 32 * size
- );
- }
- }
- // 仿RM窗口皮肤 ↑
- };
- },
+ // arrow
+ if (px != null && py != null) {
+ if (direction == "up") {
+ core.drawImage(
+ ctx,
+ background,
+ 128,
+ 96,
+ 32,
+ 32,
+ px,
+ y + h - 3 * size,
+ 32 * size,
+ 32 * size
+ );
+ } else if (direction == "down") {
+ core.drawImage(
+ ctx,
+ background,
+ 160,
+ 96,
+ 32,
+ 32,
+ px,
+ y - 29 * size,
+ 32 * size,
+ 32 * size
+ );
+ }
+ }
+ // 仿RM窗口皮肤 ↑
+ };
+ events.prototype.battle = function (id, x, y, force, callback) {
+ core.saveAndStopAutomaticRoute();
+ id = id || core.getBlockId(x, y);
+ const cls = core.getClsFromId(id)
+ if (!id || !cls || !(cls === 'enemys' || cls === 'enemy48')) return core.clearContinueAutomaticRoute(callback);
+ // 非强制战斗
+ if (!core.enemys.canBattle(id, x, y) && !force && !core.status.event.id) {
+ core.stopSound();
+ core.playSound("操作失败");
+ core.drawTip("你打不过此怪物!", id);
+ return core.clearContinueAutomaticRoute(callback);
+ }
+ // 自动存档
+ if (!core.status.event.id) core.autosave(true);
+ // 战前事件
+ if (!this.beforeBattle(id, x, y))
+ return core.clearContinueAutomaticRoute(callback);
+ // 战后事件
+ this.afterBattle(id, x, y);
+ if (callback) callback();
+ };
+
+},
"额外信息": function () {
/* 宝石血瓶左下角显示数值
* 注意!!!不要在道具属性中直接操作flags,使用core.status.hero.flags或core.setFlag系列函数代替!
@@ -13130,1118 +13149,1120 @@ 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.drawImage(
- "ui",
- "lock.webp",
- 0,
- 0,
- size,
- size,
- 58,
- 58,
- size - 8,
- size - 8
- );
+ 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.drawImage(
+ "ui",
+ "lock.webp",
+ 0,
+ 0,
+ size,
+ size,
+ 58,
+ 58,
+ size - 8,
+ size - 8
+ );
- 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,
- "#FFFFFF",
- "#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,
+ "#FFFFFF",
+ "#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);
- ////// 查看地图界面时,放开某个键的操作 //////
- 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 (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 (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 == 88) {
- core.openBook(true);
- 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) {
- 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;
+ 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];
- var floorId = core.floorIds[core.status.event.data.index],
- mh = core.floors[floorId].height;
+ 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 == 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 == 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;
- actions.prototype._sys_onmousewheel = function (direct) {
- // 向下滚动是 -1 ,向上是 1
+ var floorId = core.floorIds[core.status.event.data.index],
+ mh = core.floors[floorId].height;
- if (this._checkReplaying()) {
- // 滚轮控制速度
- if (direct == 1) core.speedUpReplay();
- if (direct == -1) core.speedDownReplay();
- 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;
+ };
- // 楼层飞行器
- 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;
- }
+ actions.prototype._sys_onmousewheel = function (direct) {
+ // 向下滚动是 -1 ,向上是 1
- // 怪物手册
- 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 (this._checkReplaying()) {
+ // 滚轮控制速度
+ if (direct == 1) core.speedUpReplay();
+ if (direct == -1) core.speedDownReplay();
+ 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 == "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 == "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 == "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;
+ }
- // 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
- );
- },
+ // 存读档
+ 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;
+ }
+
+ // 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画布设置
@@ -16932,1141 +16953,1154 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
};
},
"musicMode": function () {
- // 在此增加新插件
- const music = document.createElement("canvas");
- music.style.position = "absolute";
- music.style.zIndex = 300;
- music.style.display = "none";
- music.id = "music";
- main.dom.gameGroup.insertAdjacentElement("afterend", music);
- music.style.top = "50%";
- music.style.left = "50%";
- music.style.transform = "translate(-50%,-50%)";
- const ctx = music.getContext("2d");
- main.dom.music = music;
-
- const audio = core.plugin.audioSystem.bgmController;
-
- let page = 0; //初始页面
-
- let isvolume = false;
-
- function shuffle(arr) {
- let n = arr.length,
- random;
- while (n) {
- random = (Math.random() * n--) >>> 0;
- [arr[n], arr[random]] = [arr[random], arr[n]];
- }
- return arr;
- }
- music.addEventListener("mousedown", function (e) {
- e.stopPropagation();
- const left = core.dom.gameGroup.offsetLeft;
- const top = core.dom.gameGroup.offsetTop;
- const px = Math.floor((e.clientX - left) / core.domStyle.scale),
- py = Math.floor((e.clientY - top) / core.domStyle.scale);
- core.ui.music.mousedown(px * 3, py * 3);
- });
- music.addEventListener("mousemove", function (e) {
- e.stopPropagation();
- const left = core.dom.gameGroup.offsetLeft;
- const top = core.dom.gameGroup.offsetTop;
- const px = Math.floor((e.clientX - left) / core.domStyle.scale),
- py = Math.floor((e.clientY - top) / core.domStyle.scale);
- core.ui.music.mousemove(px * 3, py * 3);
- });
- music.addEventListener("mouseup", function (e) {
- e.stopPropagation();
-
- isvolume = false;
- });
- music.addEventListener("mouseleave", function (e) {
- e.stopPropagation();
-
- isvolume = false;
- });
- music.addEventListener("touchstart", function (e) {
- e.preventDefault();
- const left = core.dom.gameGroup.offsetLeft;
- const top = core.dom.gameGroup.offsetTop;
- const px = Math.floor(
- (e.touches[0].clientX - left) / core.domStyle.scale
- ),
- py = Math.floor((e.touches[0].clientY - top) / core.domStyle.scale);
- core.ui.music.mousedown(px * 3, py * 3);
- });
- music.addEventListener("touchmove", function (e) {
- e.stopPropagation();
- const left = core.dom.gameGroup.offsetLeft;
- const top = core.dom.gameGroup.offsetTop;
- const px = Math.floor(
- (e.touches[0].clientX - left) / core.domStyle.scale
- ),
- py = Math.floor((e.touches[0].clientY - top) / core.domStyle.scale);
- core.ui.music.mousemove(px * 3, py * 3);
- });
- music.addEventListener("touchend", function (e) {
- e.stopPropagation();
-
- isvolume = false;
- });
- music.addEventListener("touchcancel", function (e) {
- e.stopPropagation();
-
- isvolume = false;
- });
-
- class musicclass {
- constructor() {
- this.musics = ["theme.mp3"];
- //music列表
- //需全塔属性注册并保存在bgms文件夹,每个数组为显示的一页内容
- this.musicMx = [
- [
- "Crawler.opus",
- "Blood_Stain.opus",
- "Blind_Alley.opus",
- "Halbmond.opus",
- ],
- ["theme.mp3", "op.opus", "Asphodelus_Ceui.opus", "ed.opus"],
- ];
- //音乐别名(将在播放器内显示的音乐名,music列表内的都要有对应歌名)
- this.musicname = {
- "Asphodelus_Ceui.opus": "Asphodelus (Full.ver)",
- "Blind_Alley.opus": "Blind Alley",
- "Crawler.opus": "Crawler",
- "op.opus": "Asphodelus",
- "theme.mp3": "One of Episodes",
- "ed.opus": "親愛なる世界へ",
- "Blood_Stain.opus": "Blood Stain",
- "Halbmond.opus": "Halbmond",
- };
- this.selection = [0, 0];
- this.stop = false;
- this.type = "xunhuan";
- this.randomList = [];
- this.random = 0;
- }
-
- //更新
- update() {
- this.background();
- this.drawUI();
- }
- background() {
- //画布大小设置
- if (core.domStyle.isVertical) {
- music.width = 1248;
- music.height = 2028;
- } else {
- music.width = 2028;
- music.height = 1248;
- }
- }
-
- mousedown(px, py) {
- //鼠标按下时
-
- const makeBox = ([x, y], [w, h]) => {
- return [
- [x, y],
- [x + w, y + h],
- ];
- };
- const inRect = ([x, y], [[sx, sy], [dx, dy]]) => {
- return sx <= x && x <= dx && sy <= y && y <= dy;
- };
- const pos = [px, py];
- const backbox = makeBox([15, 35], [210, 90]);
- if (inRect(pos, backbox)) {
- //离开按钮是一致的,其余的记区分横竖屏
- music.style.display = "none";
- core.clearMap(ctx);
-
- core.unregisterAnimationFrame("music");
- core.restart();
-
- return;
- }
- if (core.domStyle.isVertical) {
- //竖屏
-
- const pageupbox = makeBox([100, 1230], [200, 100]);
- const pagedownbox = makeBox([950, 1230], [200, 100]);
- const musicbox = makeBox(
- [100, 200],
- [1048, this.musicMx[page].length * 100]
- );
- const beforebox = makeBox([120, 1620], [100, 100]);
- const afterbox = makeBox([780, 1620], [100, 100]);
- const playbox = makeBox([420, 1580], [200, 200]);
- const typebox = makeBox([1040, 1600], [120, 120]);
-
- const volumebox = makeBox([250, 1940], [1050, 20]);
- if (inRect(pos, pageupbox)) {
- if (page !== 0) page -= 1;
- return;
- }
- if (inRect(pos, pagedownbox)) {
- if (page !== this.musicMx.length - 1) page += 1;
- return;
- }
- if (inRect(pos, playbox)) {
- if (this.stop) {
- this.stop = !this.stop;
-
- core.resumeBgm();
- } else {
- this.stop = !this.stop;
- core.pauseBgm();
- }
- return;
- }
- if (inRect(pos, beforebox)) {
- this.stop = false;
- switch (this.type) {
- case "danqu":
- core.playBgm(
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ],
- 0
- );
-
- page = this.selection[0];
-
- break;
- case "xunhuan":
- for (;;) {
- if (this.selection[1] === 0) {
- if (this.selection[0] === 0) {
- this.selection[0] = this.musicMx.length - 1;
- this.selection[1] =
- this.musicMx[this.selection[0]].length - 1;
- } else {
- this.selection[0] -= 1;
- this.selection[1] =
- this.musicMx[this.selection[0]].length - 1;
- }
- } else {
- this.selection[1] -= 1;
- }
- this.random = this.randomList.indexOf(
- this.musicMx[this.selection[0]][this.selection[1]]
- );
- page = this.selection[0];
- if (
- this.musics.includes(
- this.musicMx[this.selection[0]][this.selection[1]]
- ) ||
- page !== this.musicMx.length - 1
- )
- break;
- }
- core.playBgm(
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ],
- 0
- );
-
- break;
- case "suiji":
- for (;;) {
- if (this.random > 0) {
- this.random -= 1;
- } else {
- this.random = this.randomList.length - 1;
- }
- this.selection[0] = this.musicMx.findIndex((v) =>
- v.includes(this.randomList[this.random])
- );
- this.selection[1] = this.musicMx[this.selection[0]].indexOf(
- this.randomList[this.random]
- );
-
- page = this.selection[0];
- if (
- this.musics.includes(
- this.musicMx[this.selection[0]][this.selection[1]]
- ) ||
- page !== this.musicMx.length - 1
- )
- break;
- }
- core.playBgm(
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ],
- 0
- );
-
- break;
- }
- return;
- }
- if (inRect(pos, afterbox)) {
- this.stop = false;
- switch (this.type) {
- case "danqu":
- core.playBgm(
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ],
- 0
- );
-
- page = this.selection[0];
- break;
- case "xunhuan":
- for (;;) {
- if (
- this.selection[1] ===
- this.musicMx[this.selection[0]].length - 1
- ) {
- if (this.selection[0] === this.musicMx.length - 1) {
- this.selection[0] = 0;
- this.selection[1] = 0;
- } else {
- this.selection[0] += 1;
- this.selection[1] = 0;
- }
- } else {
- this.selection[1] += 1;
- }
- this.random = this.randomList.indexOf(
- this.musicMx[this.selection[0]][this.selection[1]]
- );
- page = this.selection[0];
- if (
- this.musics.includes(
- this.musicMx[this.selection[0]][this.selection[1]]
- ) ||
- page !== this.musicMx.length - 1
- )
- break;
- }
- core.playBgm(
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ],
- 0
- );
-
- break;
- case "suiji":
- for (;;) {
- if (this.random < this.randomList.length - 1) {
- this.random += 1;
- } else {
- this.random = 0;
- }
- this.selection[0] = this.musicMx.findIndex((v) =>
- v.includes(this.randomList[this.random])
- );
- this.selection[1] = this.musicMx[this.selection[0]].indexOf(
- this.randomList[this.random]
- );
-
- page = this.selection[0];
- if (
- this.musics.includes(
- this.musicMx[this.selection[0]][this.selection[1]]
- ) ||
- page !== this.musicMx.length - 1
- )
- break;
- }
- core.playBgm(
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ],
- 0
- );
-
- break;
- }
- return;
- }
- if (inRect(pos, typebox)) {
- switch (this.type) {
- case "danqu":
- this.type = "xunhuan";
- break;
- case "xunhuan":
- this.type = "suiji";
- break;
- case "suiji":
- this.type = "danqu";
- break;
- }
- return;
- }
- if (inRect(pos, musicbox)) {
- const index = Math.floor((py - 200) / 100);
- if (page !== this.selection[0] || index !== this.selection[1]) {
- if (
- this.musics.includes(this.musicMx[page][index]) ||
- page !== this.musicMx.length - 1
- ) {
- this.selection[0] = page;
-
- this.selection[1] = index;
- this.randomList.indexOf(
- this.musicMx[this.selection[0]][this.selection[1]]
- );
-
- core.playBgm(
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ],
- 0
- );
-
- this.stop = false;
- }
- } else {
- if (this.stop) {
- this.stop = !this.stop;
- core.resumeBgm();
- } else {
- this.stop = !this.stop;
- core.pauseBgm();
- }
- }
- return;
- }
-
- if (inRect(pos, volumebox)) {
- const time = Math.min(Math.max((px - 250) / 800, 0), 1);
- audio.setVolume(time);
- core.plugin.audioSystem.soundPlayer.setVolume(time);
- isvolume = true;
- }
- } else {
- //横屏
- const pageupbox = makeBox([1050, 1100], [200, 100]);
- const pagedownbox = makeBox([1550, 1100], [200, 100]);
- const musicbox = makeBox(
- [900, 100],
- [1000, this.musicMx[page].length * 100]
- );
- const beforebox = makeBox([60, 620], [100, 100]);
- const afterbox = makeBox([450, 620], [100, 100]);
- const playbox = makeBox([200, 570], [200, 200]);
- const typebox = makeBox([620, 600], [120, 120]);
-
- const volumebox = makeBox([100, 990], [600, 20]);
- if (inRect(pos, pageupbox)) {
- if (page !== 0) page -= 1;
- return;
- }
- if (inRect(pos, pagedownbox)) {
- if (page !== this.musicMx.length - 1) page += 1;
- return;
- }
- if (inRect(pos, playbox)) {
- if (this.stop) {
- this.stop = !this.stop;
- core.resumeBgm();
- } else {
- this.stop = !this.stop;
- core.pauseBgm();
- }
- return;
- }
- if (inRect(pos, beforebox)) {
- this.stop = false;
- switch (this.type) {
- case "danqu":
- core.playBgm(
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ],
- 0
- );
-
- page = this.selection[0];
-
- break;
- case "xunhuan":
- for (;;) {
- if (this.selection[1] === 0) {
- if (this.selection[0] === 0) {
- this.selection[0] = this.musicMx.length - 1;
- this.selection[1] =
- this.musicMx[this.selection[0]].length - 1;
- } else {
- this.selection[0] -= 1;
- this.selection[1] =
- this.musicMx[this.selection[0]].length - 1;
- }
- } else {
- this.selection[1] -= 1;
- }
- this.random = this.randomList.indexOf(
- this.musicMx[this.selection[0]][this.selection[1]]
- );
- page = this.selection[0];
-
- if (
- this.musics.includes(
- this.musicMx[this.selection[0]][this.selection[1]]
- ) ||
- page !== this.musicMx.length - 1
- )
- break;
- }
- core.playBgm(
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ],
- 0
- );
-
- break;
- case "suiji":
- for (;;) {
- if (this.random > 0) {
- this.random -= 1;
- } else {
- this.random = this.randomList.length - 1;
- }
- this.selection[0] = this.musicMx.findIndex((v) =>
- v.includes(this.randomList[this.random])
- );
- this.selection[1] = this.musicMx[this.selection[0]].indexOf(
- this.randomList[this.random]
- );
-
- page = this.selection[0];
-
- if (
- this.musics.includes(
- this.musicMx[this.selection[0]][this.selection[1]]
- ) ||
- page !== this.musicMx.length - 1
- )
- break;
- }
- core.playBgm(
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ],
- 0
- );
-
- break;
- }
- return;
- }
- if (inRect(pos, afterbox)) {
- this.stop = false;
- switch (this.type) {
- case "danqu":
- core.playBgm(
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ],
- 0
- );
-
- page = this.selection[0];
- break;
- case "xunhuan":
- for (;;) {
- if (
- this.selection[1] ===
- this.musicMx[this.selection[0]].length - 1
- ) {
- if (this.selection[0] === this.musicMx.length - 1) {
- this.selection[0] = 0;
- this.selection[1] = 0;
- } else {
- this.selection[0] += 1;
- this.selection[1] = 0;
- }
- } else {
- this.selection[1] += 1;
- }
- this.randomList.findIndex(
- (v) =>
- v === this.musicMx[this.selection[0]][this.selection[1]]
- );
- page = this.selection[0];
-
- if (
- this.musics.includes(
- this.musicMx[this.selection[0]][this.selection[1]]
- ) ||
- page !== this.musicMx.length - 1
- )
- break;
- }
- core.playBgm(
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ],
- 0
- );
-
- break;
- case "suiji":
- for (;;) {
- if (this.random < this.randomList.length - 1) {
- this.random += 1;
- } else {
- this.random = 0;
- }
- this.selection[0] = this.musicMx.findIndex((v) =>
- v.includes(this.randomList[this.random])
- );
- this.selection[1] = this.musicMx[this.selection[0]].indexOf(
- main.core.ui.music.randomList[main.core.ui.music.random]
- );
-
- page = this.selection[0];
- if (
- this.musics.includes(
- this.musicMx[this.selection[0]][this.selection[1]]
- ) ||
- page !== this.musicMx.length - 1
- )
- break;
- }
- core.playBgm(
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ],
- 0
- );
-
- break;
- }
- return;
- }
- if (inRect(pos, typebox)) {
- switch (this.type) {
- case "danqu":
- this.type = "xunhuan";
- break;
- case "xunhuan":
- this.type = "suiji";
- break;
- case "suiji":
- this.type = "danqu";
- break;
- }
- return;
- }
- if (inRect(pos, musicbox)) {
- const index = Math.floor((py - 100) / 100);
- if (page !== this.selection[0] || index !== this.selection[1]) {
- if (
- this.musics.includes(this.musicMx[page][index]) ||
- page !== this.musicMx.length - 1
- ) {
- this.selection[0] = page;
- this.selection[1] = index;
- this.randomList.indexOf(
- (v) =>
- v === this.musicMx[this.selection[0]][this.selection[1]]
- );
-
- core.playBgm(
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ],
- 0
- );
- this.stop = false;
- }
- } else {
- if (this.stop) {
- this.stop = !this.stop;
- core.resumeBgm();
- } else {
- this.stop = !this.stop;
- core.pauseBgm();
- }
- }
- return;
- }
-
- if (inRect(pos, volumebox)) {
- const time = Math.min(Math.max((px - 100) / 600, 0), 1);
- audio.setVolume(time);
- core.plugin.audioSystem.soundPlayer.setVolume(time);
- isvolume = true;
- }
- }
- }
- mousemove(px, py) {
- if (isvolume) {
- if (core.domStyle.isVertical) {
- const time = Math.min(Math.max((px - 250) / 800, 0), 1);
- audio.setVolume(time);
- core.plugin.audioSystem.soundPlayer.setVolume(time);
- } else {
- const time = Math.min(Math.max((px - 100) / 600, 0), 1);
- audio.setVolume(time);
- core.plugin.audioSystem.soundPlayer.setVolume(time);
- }
- }
- }
-
- drawUI() {
- //绘制页面
- core.clearMap(music);
- const bgVertical = core.material.images.images["bg_2010.webp"]; //竖屏背景
- const bg = core.material.images.images["bg_5043.webp"]; //竖屏背景
- if (core.domStyle.isVertical) {
- //竖屏
-
- core.fillRect(ctx, 0, 0, 1248, 2028, "#000000"); //黑色背景
- ctx.globalAlpha = 0.3; //透明度
- if (bgVertical)
- ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片
- ctx.globalAlpha = 1; //恢复为不透明
-
- core.setTextAlign(ctx, "center");
- core.fillBoldText1(
- ctx,
- "◀离开",
- 110,
- 100,
- "#FFFFFF",
- "#000000",
- 6,
- core.ui._buildFont(66, true)
- );
-
- ctx.strokeStyle = "#FFFFFF";
- ctx.lineWidth = 3;
- ctx.beginPath();
- ctx.moveTo(100, 200);
- ctx.lineTo(1148, 200);
-
- ctx.stroke();
- let posy = 300;
- const indexList = this.musicMx[page];
- core.setTextAlign(ctx, "left");
- for (let i = 0; i < indexList.length; i++) {
- const text = this.musicname[indexList[i]];
- if (
- this.musics.includes(this.musicMx[page][i]) ||
- page !== this.musicMx.length - 1
- ) {
- core.fillBoldText1(
- ctx,
- text,
- 150,
- posy - 30,
- page === this.selection[0] && i === this.selection[1]
- ? "#FFFFFF"
- : "#444444",
- "#000000",
- 6,
- core.ui._buildFont(66, true)
- );
-
- ctx.strokeStyle = "#FFFFFF";
- ctx.lineWidth = 3;
- ctx.beginPath();
- ctx.moveTo(100, posy);
- ctx.lineTo(1148, posy);
- ctx.stroke();
- }
- posy += 100;
- }
- ctx.beginPath();
- ctx.moveTo(100, 1210);
- ctx.lineTo(1148, 1210);
- ctx.moveTo(100, 1200);
- ctx.lineTo(1148, 1200);
- ctx.stroke();
-
- core.fillBoldText1(
- ctx,
- "上一页",
- 100,
- 1300,
- page === 0 ? "#444444" : "#FFFFFF",
- "#000000",
- 6,
- core.ui._buildFont(66, true)
- );
-
- core.fillBoldText1(
- ctx,
- page + 1 + "/" + this.musicMx.length,
- 580,
- 1300,
- "#FFFFFF",
- "#000000",
- 6,
- core.ui._buildFont(66, true)
- );
- core.fillBoldText1(
- ctx,
- "下一页",
- 950,
- 1300,
- page === this.musicMx.length - 1 ? "#444444" : "#FFFFFF",
- "#000000",
- 6,
- core.ui._buildFont(66, true)
- );
-
- ctx.strokeStyle = "#ffffff";
- ctx.lineWidth = 3;
-
- core.fillBoldText(
- ctx,
- "|",
- 100,
- 1697,
- "#FFFFFF",
- 6,
- core.ui._buildFont(96, true)
- );
- core.fillBoldText(
- ctx,
- "◀",
- 115,
- 1700,
- "#FFFFFF",
- 6,
- core.ui._buildFont(96, true)
- );
-
- ctx.beginPath();
- ctx.arc(505, 1670, 80, 0, 3 * Math.PI);
- ctx.stroke();
- core.fillText(
- ctx,
- "|",
- 835,
- 1697,
- "#FFFFFF",
- core.ui._buildFont(96, true)
- );
- core.fillText(
- ctx,
- "▶",
- 785,
- 1700,
- "#FFFFFF",
- core.ui._buildFont(96, true)
- );
-
- if (this.stop) {
- core.fillText(
- ctx,
- "▶",
- 473,
- 1700,
- "#FFFFFF",
- core.ui._buildFont(96, true)
- );
- } else {
- core.fillText(
- ctx,
- "||",
- 453,
- 1700,
- "#FFFFFF",
- core.ui._buildFont(96, true)
- );
- }
-
- const img = core.material.images.images[this.type + ".webp"];
- if (img) ctx.drawImage(img, 1000, 1555, 200, 200);
- core.setTextAlign(ctx, "center");
- ctx.font = "bold 52px Verdana";
- ctx.fillText("当前歌曲", 625, 1397);
- ctx.fillText(
- this.musicname[this.musicMx[this.selection[0]][this.selection[1]]],
- 625,
- 1507
- );
-
- ctx.fillStyle = "#ffffff";
- ctx.font = "bold 48px Verdana";
- ctx.fillText("音量", 150, 1970);
- ctx.lineWidth = 3;
- ctx.beginPath();
- ctx.moveTo(250, 1950);
- ctx.lineTo(1050, 1950);
- ctx.stroke();
- ctx.strokeStyle = "#ffffff";
- ctx.lineWidth = 9;
- ctx.fillStyle = "rgba(255,255,255,0.5)";
-
- ctx.beginPath();
- ctx.moveTo(250, 1950);
- ctx.lineTo(800 * audio.getVolume() + 250, 1950);
- ctx.stroke();
- ctx.beginPath();
- ctx.arc(800 * audio.getVolume() + 250, 1950, 10, 0, 2 * Math.PI);
- ctx.fill();
- core.fillBoldText1(
- ctx,
- Math.floor(100 * audio.getVolume()),
- 1120,
- 1970,
- "#FFFFFF",
- "#000000",
- 6,
- core.ui._buildFont(56, true)
- );
- } else {
- //横屏
-
- core.fillRect(ctx, 0, 0, 2028, 1248, "#000000"); //黑色背景
- ctx.globalAlpha = 0.5; //透明度
- if (bg) ctx.drawImage(bg, 0, 0, 1280, 720, 0, 0, 2028, 1248); //绘制半透明背景图片
- ctx.globalAlpha = 1; //恢复为不透明
- core.setTextAlign(ctx, "center");
-
- core.fillBoldText1(
- ctx,
- "◀离开",
- 110,
- 100,
- "#FFFFFF",
- "#000000",
- 6,
- core.ui._buildFont(66, true)
- );
-
- ctx.strokeStyle = "#FFFFFF";
- ctx.lineWidth = 3;
- ctx.beginPath();
- ctx.moveTo(800, 100);
- ctx.lineTo(800, 1148);
- ctx.moveTo(900, 100);
- ctx.lineTo(1900, 100);
- ctx.stroke();
- let posy = 200;
- const indexList = this.musicMx[page];
- core.setTextAlign(ctx, "left");
- for (let i = 0; i < indexList.length; i++) {
- const text = this.musicname[indexList[i]];
- if (
- this.musics.includes(this.musicMx[page][i]) ||
- page !== this.musicMx.length - 1
- ) {
- core.fillBoldText1(
- ctx,
- text,
- 950,
- posy - 30,
- page === this.selection[0] && i === this.selection[1]
- ? "#FFFFFF"
- : "#444444",
- "#000000",
- 6,
- core.ui._buildFont(66, true)
- );
-
- ctx.strokeStyle = "#FFFFFF";
- ctx.lineWidth = 3;
- ctx.beginPath();
- ctx.moveTo(900, posy);
- ctx.lineTo(1900, posy);
- ctx.stroke();
- }
- posy += 100;
- }
- core.fillBoldText1(
- ctx,
- "上一页",
- 1050,
- 1200 - 30,
- page === 0 ? "#444444" : "#FFFFFF",
- "#000000",
- 6,
- core.ui._buildFont(66, true)
- );
-
- core.fillBoldText1(
- ctx,
- page + 1 + "/" + this.musicMx.length,
- 1350,
- 1200 - 30,
- "#FFFFFF",
- "#000000",
- 6,
- core.ui._buildFont(66, true)
- );
- core.fillBoldText1(
- ctx,
- "下一页",
- 1550,
- 1200 - 30,
- page === this.musicMx.length - 1 ? "#444444" : "#FFFFFF",
- "#000000",
- 6,
- core.ui._buildFont(66, true)
- );
- ctx.strokeStyle = "#ffffff";
- ctx.lineWidth = 3;
-
- core.fillText(
- ctx,
- "|",
- 55,
- 697,
- "#FFFFFF",
- core.ui._buildFont(96, true)
- );
- core.fillText(
- ctx,
- "◀",
- 70,
- 700,
- "#FFFFFF",
- core.ui._buildFont(96, true)
- );
-
- ctx.beginPath();
- ctx.arc(295, 670, 80, 0, 2 * Math.PI);
- ctx.stroke();
- if (this.stop) {
- core.fillText(
- ctx,
- "▶",
- 265,
- 700,
- "#FFFFFF",
- core.ui._buildFont(96, true)
- );
- } else {
- core.fillText(
- ctx,
- "||",
- 245,
- 700,
- "#FFFFFF",
- core.ui._buildFont(96, true)
- );
- }
- core.fillText(
- ctx,
- "|",
- 495,
- 697,
- "#FFFFFF",
- core.ui._buildFont(96, true)
- );
- core.fillText(
- ctx,
- "▶",
- 450,
- 700,
- "#FFFFFF",
- core.ui._buildFont(96, true)
- );
-
- ctx.font = "bold 48px Verdana";
- ctx.fillText("音量", 350, 900);
- ctx.beginPath();
- ctx.moveTo(100, 1000);
- ctx.lineTo(700, 1000);
- ctx.stroke();
- ctx.strokeStyle = "#ffffff";
- ctx.lineWidth = 9;
- ctx.fillStyle = "rgba(255,255,255,0.5)";
-
- ctx.beginPath();
- ctx.moveTo(100, 1000);
- ctx.lineTo(600 * audio.getVolume() + 100, 1000);
- ctx.stroke();
- ctx.beginPath();
- ctx.arc(600 * audio.getVolume() + 100, 1000, 10, 0, 2 * Math.PI);
- ctx.fill();
- core.fillBoldText1(
- ctx,
- Math.floor(100 * audio.getVolume()),
- 720,
- 1010,
- "#FFFFFF",
- "#000000",
- 6,
- core.ui._buildFont(56, true)
- );
- const img = core.material.images.images[this.type + ".webp"];
- if (img) ctx.drawImage(img, 580, 560, 200, 200);
- core.setTextAlign(ctx, "center");
- ctx.font = "bold 48px Verdana";
- ctx.fillText("当前歌曲", 400, 297);
- ctx.fillText(
- this.musicname[this.musicMx[this.selection[0]][this.selection[1]]],
- 400,
- 397
- );
- }
- }
- }
- core.ui.music = new musicclass();
- main.dom.musicMode.onclick = function () {
- //点击开始页面的CG MODE进入cg回廊
- if (
- (core.getLocalStorage("musics") &&
- core.getLocalStorage("musics").length === 0) ||
- !core.getLocalStorage("musics")
- )
- core.setLocalStorage("musics", ["theme.mp3"]);
- core.ui.music.musics = core.getLocalStorage("musics");
- core.playBgm(
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ],
- 0
- );
-
- const arr = main.core.ui.music.musicMx.flat(Infinity);
- main.core.ui.music.randomList = shuffle(arr);
- main.core.ui.music.random = main.core.ui.music.randomList.indexOf(
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ]
- );
- page = 0;
- music.style.display = "block";
- let time = 0;
- core.registerAnimationFrame("music", null, (temptime) => {
- if (temptime > time + 1000 / 60) {
- time = temptime;
- main.core.ui.music.update();
- const duration =
- core.plugin.audioSystem.bgmController.player.getRoute(
- "bgms." +
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ]
- ).duration;
-
- const currentTime =
- core.plugin.audioSystem.bgmController.player.getRoute(
- "bgms." +
- main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
- main.core.ui.music.selection[1]
- ]
- ).currentTime;
- if (currentTime && duration && duration - currentTime < 0.05) {
- if (core.domStyle.isVertical) {
- core.ui.music.mousedown(830, 1770);
- } else {
- core.ui.music.mousedown(475, 765);
- }
- }
- }
- });
- };
- },
+ // 在此增加新插件
+ const music = document.createElement("canvas");
+ music.style.position = "absolute";
+ music.style.zIndex = 300;
+ music.style.display = "none";
+ music.id = "music";
+ main.dom.gameGroup.insertAdjacentElement("afterend", music);
+ music.style.top = "50%";
+ music.style.left = "50%";
+ music.style.transform = "translate(-50%,-50%)";
+ const ctx = music.getContext("2d");
+ main.dom.music = music;
+
+ const audio = core.plugin.audioSystem.bgmController;
+
+ let page = 0; //初始页面
+
+ let isvolume = false;
+
+ function shuffle(arr) {
+ let n = arr.length,
+ random;
+ while (n) {
+ random = (Math.random() * n--) >>> 0;
+ [arr[n], arr[random]] = [arr[random], arr[n]];
+ }
+ return arr;
+ }
+ music.addEventListener("mousedown", function (e) {
+ e.stopPropagation();
+ const left = core.dom.gameGroup.offsetLeft;
+ const top = core.dom.gameGroup.offsetTop;
+ const px = Math.floor((e.clientX - left) / core.domStyle.scale),
+ py = Math.floor((e.clientY - top) / core.domStyle.scale);
+ core.ui.music.mousedown(px * 3, py * 3);
+ });
+ music.addEventListener("mousemove", function (e) {
+ e.stopPropagation();
+ const left = core.dom.gameGroup.offsetLeft;
+ const top = core.dom.gameGroup.offsetTop;
+ const px = Math.floor((e.clientX - left) / core.domStyle.scale),
+ py = Math.floor((e.clientY - top) / core.domStyle.scale);
+ core.ui.music.mousemove(px * 3, py * 3);
+ });
+ music.addEventListener("mouseup", function (e) {
+ e.stopPropagation();
+
+ isvolume = false;
+ });
+ music.addEventListener("mouseleave", function (e) {
+ e.stopPropagation();
+
+ isvolume = false;
+ });
+ music.addEventListener("touchstart", function (e) {
+ e.preventDefault();
+ const left = core.dom.gameGroup.offsetLeft;
+ const top = core.dom.gameGroup.offsetTop;
+ const px = Math.floor(
+ (e.touches[0].clientX - left) / core.domStyle.scale
+ ),
+ py = Math.floor((e.touches[0].clientY - top) / core.domStyle.scale);
+ core.ui.music.mousedown(px * 3, py * 3);
+ });
+ music.addEventListener("touchmove", function (e) {
+ e.stopPropagation();
+ const left = core.dom.gameGroup.offsetLeft;
+ const top = core.dom.gameGroup.offsetTop;
+ const px = Math.floor(
+ (e.touches[0].clientX - left) / core.domStyle.scale
+ ),
+ py = Math.floor((e.touches[0].clientY - top) / core.domStyle.scale);
+ core.ui.music.mousemove(px * 3, py * 3);
+ });
+ music.addEventListener("touchend", function (e) {
+ e.stopPropagation();
+
+ isvolume = false;
+ });
+ music.addEventListener("touchcancel", function (e) {
+ e.stopPropagation();
+
+ isvolume = false;
+ });
+
+ class musicclass {
+ constructor() {
+ this.musics = ["theme.mp3"];
+ //music列表
+ //需全塔属性注册并保存在bgms文件夹,每个数组为显示的一页内容
+ this.musicMx = [
+ [
+ "Crawler.opus",
+ "Blood_Stain.opus",
+ "Blind_Alley.opus",
+ "Halbmond.opus",
+ ],
+ ["theme.mp3", "op.opus", "Asphodelus_Ceui.opus", "ed.opus"],
+ ];
+ //音乐别名(将在播放器内显示的音乐名,music列表内的都要有对应歌名)
+ this.musicname = {
+ "Asphodelus_Ceui.opus": "Asphodelus (Full.ver)",
+ "Blind_Alley.opus": "Blind Alley",
+ "Crawler.opus": "Crawler",
+ "op.opus": "Asphodelus",
+ "theme.mp3": "One of Episodes",
+ "ed.opus": "親愛なる世界へ",
+ "Blood_Stain.opus": "Blood Stain",
+ "Halbmond.opus": "Halbmond",
+ };
+ this.selection = [0, 0];
+ this.stop = false;
+ this.type = "xunhuan";
+ this.randomList = [];
+ this.random = 0;
+ }
+
+ //更新
+ update() {
+ this.background();
+ this.drawUI();
+ }
+ background() {
+ //画布大小设置
+ if (core.domStyle.isVertical) {
+ music.width = 1248;
+ music.height = 2028;
+ } else {
+ music.width = 2028;
+ music.height = 1248;
+ }
+ }
+
+ mousedown(px, py) {
+ //鼠标按下时
+
+ const makeBox = ([x, y], [w, h]) => {
+ return [
+ [x, y],
+ [x + w, y + h],
+ ];
+ };
+ const inRect = ([x, y], [
+ [sx, sy],
+ [dx, dy]
+ ]) => {
+ return sx <= x && x <= dx && sy <= y && y <= dy;
+ };
+ const pos = [px, py];
+ const backbox = makeBox([15, 35], [210, 90]);
+ if (inRect(pos, backbox)) {
+ //离开按钮是一致的,其余的记区分横竖屏
+ music.style.display = "none";
+ core.clearMap(ctx);
+
+ core.unregisterAnimationFrame("music");
+ core.restart();
+
+ return;
+ }
+ if (core.domStyle.isVertical) {
+ //竖屏
+
+ const pageupbox = makeBox([100, 1230], [200, 100]);
+ const pagedownbox = makeBox([950, 1230], [200, 100]);
+ const musicbox = makeBox(
+ [100, 200],
+ [1048, this.musicMx[page].length * 100]
+ );
+ const beforebox = makeBox([120, 1620], [100, 100]);
+ const afterbox = makeBox([780, 1620], [100, 100]);
+ const playbox = makeBox([420, 1580], [200, 200]);
+ const typebox = makeBox([1040, 1600], [120, 120]);
+
+ const volumebox = makeBox([250, 1940], [1050, 20]);
+ if (inRect(pos, pageupbox)) {
+ if (page !== 0) page -= 1;
+ return;
+ }
+ if (inRect(pos, pagedownbox)) {
+ if (page !== this.musicMx.length - 1) page += 1;
+ return;
+ }
+ if (inRect(pos, playbox)) {
+ if (this.stop) {
+ this.stop = !this.stop;
+
+ core.resumeBgm();
+ } else {
+ this.stop = !this.stop;
+ core.pauseBgm();
+ }
+ return;
+ }
+ if (inRect(pos, beforebox)) {
+ this.stop = false;
+ switch (this.type) {
+ case "danqu":
+ core.playBgm(
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ],
+ 0
+ );
+
+ page = this.selection[0];
+
+ break;
+ case "xunhuan":
+ for (;;) {
+ if (this.selection[1] === 0) {
+ if (this.selection[0] === 0) {
+ this.selection[0] = this.musicMx.length - 1;
+ this.selection[1] =
+ this.musicMx[this.selection[0]].length - 1;
+ } else {
+ this.selection[0] -= 1;
+ this.selection[1] =
+ this.musicMx[this.selection[0]].length - 1;
+ }
+ } else {
+ this.selection[1] -= 1;
+ }
+ this.random = this.randomList.indexOf(
+ this.musicMx[this.selection[0]][this.selection[1]]
+ );
+ page = this.selection[0];
+ if (
+ this.musics.includes(
+ this.musicMx[this.selection[0]][this.selection[1]]
+ ) ||
+ page !== this.musicMx.length - 1
+ )
+ break;
+ }
+ core.playBgm(
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ],
+ 0
+ );
+
+ break;
+ case "suiji":
+ for (;;) {
+ if (this.random > 0) {
+ this.random -= 1;
+ } else {
+ this.random = this.randomList.length - 1;
+ }
+ this.selection[0] = this.musicMx.findIndex((v) =>
+ v.includes(this.randomList[this.random])
+ );
+ this.selection[1] = this.musicMx[this.selection[0]].indexOf(
+ this.randomList[this.random]
+ );
+
+ page = this.selection[0];
+ if (
+ this.musics.includes(
+ this.musicMx[this.selection[0]][this.selection[1]]
+ ) ||
+ page !== this.musicMx.length - 1
+ )
+ break;
+ }
+ core.playBgm(
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ],
+ 0
+ );
+
+ break;
+ }
+ return;
+ }
+ if (inRect(pos, afterbox)) {
+ this.stop = false;
+ switch (this.type) {
+ case "danqu":
+ core.playBgm(
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ],
+ 0
+ );
+
+ page = this.selection[0];
+ break;
+ case "xunhuan":
+ for (;;) {
+ if (
+ this.selection[1] ===
+ this.musicMx[this.selection[0]].length - 1
+ ) {
+ if (this.selection[0] === this.musicMx.length - 1) {
+ this.selection[0] = 0;
+ this.selection[1] = 0;
+ } else {
+ this.selection[0] += 1;
+ this.selection[1] = 0;
+ }
+ } else {
+ this.selection[1] += 1;
+ }
+ this.random = this.randomList.indexOf(
+ this.musicMx[this.selection[0]][this.selection[1]]
+ );
+ page = this.selection[0];
+ if (
+ this.musics.includes(
+ this.musicMx[this.selection[0]][this.selection[1]]
+ ) ||
+ page !== this.musicMx.length - 1
+ )
+ break;
+ }
+ core.playBgm(
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ],
+ 0
+ );
+
+ break;
+ case "suiji":
+ for (;;) {
+ if (this.random < this.randomList.length - 1) {
+ this.random += 1;
+ } else {
+ this.random = 0;
+ }
+ this.selection[0] = this.musicMx.findIndex((v) =>
+ v.includes(this.randomList[this.random])
+ );
+ this.selection[1] = this.musicMx[this.selection[0]].indexOf(
+ this.randomList[this.random]
+ );
+
+ page = this.selection[0];
+ if (
+ this.musics.includes(
+ this.musicMx[this.selection[0]][this.selection[1]]
+ ) ||
+ page !== this.musicMx.length - 1
+ )
+ break;
+ }
+ core.playBgm(
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ],
+ 0
+ );
+
+ break;
+ }
+ return;
+ }
+ if (inRect(pos, typebox)) {
+ switch (this.type) {
+ case "danqu":
+ this.type = "xunhuan";
+ break;
+ case "xunhuan":
+ this.type = "suiji";
+ break;
+ case "suiji":
+ this.type = "danqu";
+ break;
+ }
+ return;
+ }
+ if (inRect(pos, musicbox)) {
+ const index = Math.floor((py - 200) / 100);
+ if (page !== this.selection[0] || index !== this.selection[1]) {
+ if (
+ this.musics.includes(this.musicMx[page][index]) ||
+ page !== this.musicMx.length - 1
+ ) {
+ this.selection[0] = page;
+
+ this.selection[1] = index;
+ this.randomList.indexOf(
+ this.musicMx[this.selection[0]][this.selection[1]]
+ );
+
+ core.playBgm(
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ],
+ 0
+ );
+
+ this.stop = false;
+ }
+ } else {
+ if (this.stop) {
+ this.stop = !this.stop;
+ core.resumeBgm();
+ } else {
+ this.stop = !this.stop;
+ core.pauseBgm();
+ }
+ }
+ return;
+ }
+
+ if (inRect(pos, volumebox)) {
+ const time = Math.min(Math.max((px - 250) / 800, 0), 1);
+ audio.setVolume(time);
+ core.plugin.audioSystem.soundPlayer.setVolume(time);
+ isvolume = true;
+ }
+ } else {
+ //横屏
+ const pageupbox = makeBox([1050, 1100], [200, 100]);
+ const pagedownbox = makeBox([1550, 1100], [200, 100]);
+ const musicbox = makeBox(
+ [900, 100],
+ [1000, this.musicMx[page].length * 100]
+ );
+ const beforebox = makeBox([60, 620], [100, 100]);
+ const afterbox = makeBox([450, 620], [100, 100]);
+ const playbox = makeBox([200, 570], [200, 200]);
+ const typebox = makeBox([620, 600], [120, 120]);
+
+ const volumebox = makeBox([100, 990], [600, 20]);
+ if (inRect(pos, pageupbox)) {
+ if (page !== 0) page -= 1;
+ return;
+ }
+ if (inRect(pos, pagedownbox)) {
+ if (page !== this.musicMx.length - 1) page += 1;
+ return;
+ }
+ if (inRect(pos, playbox)) {
+ if (this.stop) {
+ this.stop = !this.stop;
+ core.resumeBgm();
+ } else {
+ this.stop = !this.stop;
+ core.pauseBgm();
+ }
+ return;
+ }
+ if (inRect(pos, beforebox)) {
+ this.stop = false;
+ switch (this.type) {
+ case "danqu":
+ core.playBgm(
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ],
+ 0
+ );
+
+ page = this.selection[0];
+
+ break;
+ case "xunhuan":
+ for (;;) {
+ if (this.selection[1] === 0) {
+ if (this.selection[0] === 0) {
+ this.selection[0] = this.musicMx.length - 1;
+ this.selection[1] =
+ this.musicMx[this.selection[0]].length - 1;
+ } else {
+ this.selection[0] -= 1;
+ this.selection[1] =
+ this.musicMx[this.selection[0]].length - 1;
+ }
+ } else {
+ this.selection[1] -= 1;
+ }
+ this.random = this.randomList.indexOf(
+ this.musicMx[this.selection[0]][this.selection[1]]
+ );
+ page = this.selection[0];
+
+ if (
+ this.musics.includes(
+ this.musicMx[this.selection[0]][this.selection[1]]
+ ) ||
+ page !== this.musicMx.length - 1
+ )
+ break;
+ }
+ core.playBgm(
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ],
+ 0
+ );
+
+ break;
+ case "suiji":
+ for (;;) {
+ if (this.random > 0) {
+ this.random -= 1;
+ } else {
+ this.random = this.randomList.length - 1;
+ }
+ this.selection[0] = this.musicMx.findIndex((v) =>
+ v.includes(this.randomList[this.random])
+ );
+ this.selection[1] = this.musicMx[this.selection[0]].indexOf(
+ this.randomList[this.random]
+ );
+
+ page = this.selection[0];
+
+ if (
+ this.musics.includes(
+ this.musicMx[this.selection[0]][this.selection[1]]
+ ) ||
+ page !== this.musicMx.length - 1
+ )
+ break;
+ }
+ core.playBgm(
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ],
+ 0
+ );
+
+ break;
+ }
+ return;
+ }
+ if (inRect(pos, afterbox)) {
+ this.stop = false;
+ switch (this.type) {
+ case "danqu":
+ core.playBgm(
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ],
+ 0
+ );
+
+ page = this.selection[0];
+ break;
+ case "xunhuan":
+ for (;;) {
+ if (
+ this.selection[1] ===
+ this.musicMx[this.selection[0]].length - 1
+ ) {
+ if (this.selection[0] === this.musicMx.length - 1) {
+ this.selection[0] = 0;
+ this.selection[1] = 0;
+ } else {
+ this.selection[0] += 1;
+ this.selection[1] = 0;
+ }
+ } else {
+ this.selection[1] += 1;
+ }
+ this.randomList.findIndex(
+ (v) =>
+ v === this.musicMx[this.selection[0]][this.selection[1]]
+ );
+ page = this.selection[0];
+
+ if (
+ this.musics.includes(
+ this.musicMx[this.selection[0]][this.selection[1]]
+ ) ||
+ page !== this.musicMx.length - 1
+ )
+ break;
+ }
+ core.playBgm(
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ],
+ 0
+ );
+
+ break;
+ case "suiji":
+ for (;;) {
+ if (this.random < this.randomList.length - 1) {
+ this.random += 1;
+ } else {
+ this.random = 0;
+ }
+ this.selection[0] = this.musicMx.findIndex((v) =>
+ v.includes(this.randomList[this.random])
+ );
+ this.selection[1] = this.musicMx[this.selection[0]].indexOf(
+ main.core.ui.music.randomList[main.core.ui.music.random]
+ );
+
+ page = this.selection[0];
+ if (
+ this.musics.includes(
+ this.musicMx[this.selection[0]][this.selection[1]]
+ ) ||
+ page !== this.musicMx.length - 1
+ )
+ break;
+ }
+ core.playBgm(
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ],
+ 0
+ );
+
+ break;
+ }
+ return;
+ }
+ if (inRect(pos, typebox)) {
+ switch (this.type) {
+ case "danqu":
+ this.type = "xunhuan";
+ break;
+ case "xunhuan":
+ this.type = "suiji";
+ break;
+ case "suiji":
+ this.type = "danqu";
+ break;
+ }
+ return;
+ }
+ if (inRect(pos, musicbox)) {
+ const index = Math.floor((py - 100) / 100);
+ if (page !== this.selection[0] || index !== this.selection[1]) {
+ if (
+ this.musics.includes(this.musicMx[page][index]) ||
+ page !== this.musicMx.length - 1
+ ) {
+ this.selection[0] = page;
+ this.selection[1] = index;
+ this.randomList.indexOf(
+ (v) =>
+ v === this.musicMx[this.selection[0]][this.selection[1]]
+ );
+
+ core.playBgm(
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ],
+ 0
+ );
+ this.stop = false;
+ }
+ } else {
+ if (this.stop) {
+ this.stop = !this.stop;
+ core.resumeBgm();
+ } else {
+ this.stop = !this.stop;
+ core.pauseBgm();
+ }
+ }
+ return;
+ }
+
+ if (inRect(pos, volumebox)) {
+ const time = Math.min(Math.max((px - 100) / 600, 0), 1);
+ audio.setVolume(time);
+ core.plugin.audioSystem.soundPlayer.setVolume(time);
+ isvolume = true;
+ }
+ }
+ }
+ mousemove(px, py) {
+ if (isvolume) {
+ if (core.domStyle.isVertical) {
+ const time = Math.min(Math.max((px - 250) / 800, 0), 1);
+ audio.setVolume(time);
+ core.plugin.audioSystem.soundPlayer.setVolume(time);
+ } else {
+ const time = Math.min(Math.max((px - 100) / 600, 0), 1);
+ audio.setVolume(time);
+ core.plugin.audioSystem.soundPlayer.setVolume(time);
+ }
+ }
+ }
+
+ drawUI() {
+ //绘制页面
+ core.clearMap(music);
+ const bgVertical = core.material.images.images["bg_2010.webp"]; //竖屏背景
+ const bg = core.material.images.images["bg_5043.webp"]; //竖屏背景
+ if (core.domStyle.isVertical) {
+ //竖屏
+
+ core.fillRect(ctx, 0, 0, 1248, 2028, "#000000"); //黑色背景
+ ctx.globalAlpha = 0.3; //透明度
+ if (bgVertical)
+ ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片
+ ctx.globalAlpha = 1; //恢复为不透明
+
+ core.setTextAlign(ctx, "center");
+ core.fillBoldText1(
+ ctx,
+ "◀离开",
+ 110,
+ 100,
+ "#FFFFFF",
+ "#000000",
+ 6,
+ core.ui._buildFont(66, true)
+ );
+
+ ctx.strokeStyle = "#FFFFFF";
+ ctx.lineWidth = 3;
+ ctx.beginPath();
+ ctx.moveTo(100, 200);
+ ctx.lineTo(1148, 200);
+
+ ctx.stroke();
+ let posy = 300;
+ const indexList = this.musicMx[page];
+ core.setTextAlign(ctx, "left");
+ for (let i = 0; i < indexList.length; i++) {
+ const text = this.musicname[indexList[i]];
+ if (
+ this.musics.includes(this.musicMx[page][i]) ||
+ page !== this.musicMx.length - 1
+ ) {
+ core.fillBoldText1(
+ ctx,
+ text,
+ 150,
+ posy - 30,
+ page === this.selection[0] && i === this.selection[1] ?
+ "#FFFFFF" :
+ "#444444",
+ "#000000",
+ 6,
+ core.ui._buildFont(66, true)
+ );
+
+ ctx.strokeStyle = "#FFFFFF";
+ ctx.lineWidth = 3;
+ ctx.beginPath();
+ ctx.moveTo(100, posy);
+ ctx.lineTo(1148, posy);
+ ctx.stroke();
+ }
+ posy += 100;
+ }
+ ctx.beginPath();
+ ctx.moveTo(100, 1210);
+ ctx.lineTo(1148, 1210);
+ ctx.moveTo(100, 1200);
+ ctx.lineTo(1148, 1200);
+ ctx.stroke();
+
+ core.fillBoldText1(
+ ctx,
+ "上一页",
+ 100,
+ 1300,
+ page === 0 ? "#444444" : "#FFFFFF",
+ "#000000",
+ 6,
+ core.ui._buildFont(66, true)
+ );
+
+ core.fillBoldText1(
+ ctx,
+ page + 1 + "/" + this.musicMx.length,
+ 580,
+ 1300,
+ "#FFFFFF",
+ "#000000",
+ 6,
+ core.ui._buildFont(66, true)
+ );
+ core.fillBoldText1(
+ ctx,
+ "下一页",
+ 950,
+ 1300,
+ page === this.musicMx.length - 1 ? "#444444" : "#FFFFFF",
+ "#000000",
+ 6,
+ core.ui._buildFont(66, true)
+ );
+
+ ctx.strokeStyle = "#ffffff";
+ ctx.lineWidth = 3;
+
+ core.fillBoldText(
+ ctx,
+ "|",
+ 100,
+ 1697,
+ "#FFFFFF",
+ 6,
+ core.ui._buildFont(96, true)
+ );
+ core.fillBoldText(
+ ctx,
+ "◀",
+ 115,
+ 1700,
+ "#FFFFFF",
+ 6,
+ core.ui._buildFont(96, true)
+ );
+
+ ctx.beginPath();
+ ctx.arc(505, 1670, 80, 0, 3 * Math.PI);
+ ctx.stroke();
+ core.fillText(
+ ctx,
+ "|",
+ 835,
+ 1697,
+ "#FFFFFF",
+ core.ui._buildFont(96, true)
+ );
+ core.fillText(
+ ctx,
+ "▶",
+ 785,
+ 1700,
+ "#FFFFFF",
+ core.ui._buildFont(96, true)
+ );
+
+ if (this.stop) {
+ core.fillText(
+ ctx,
+ "▶",
+ 473,
+ 1700,
+ "#FFFFFF",
+ core.ui._buildFont(96, true)
+ );
+ } else {
+ core.fillText(
+ ctx,
+ "||",
+ 453,
+ 1700,
+ "#FFFFFF",
+ core.ui._buildFont(96, true)
+ );
+ }
+
+ const img = core.material.images.images[this.type + ".webp"];
+ if (img) ctx.drawImage(img, 1000, 1555, 200, 200);
+ core.setTextAlign(ctx, "center");
+ ctx.font = "bold 52px Verdana";
+ ctx.fillText("当前歌曲", 625, 1397);
+ ctx.fillText(
+ this.musicname[this.musicMx[this.selection[0]][this.selection[1]]],
+ 625,
+ 1507
+ );
+
+ ctx.fillStyle = "#ffffff";
+ ctx.font = "bold 48px Verdana";
+ ctx.fillText("音量", 150, 1970);
+ ctx.lineWidth = 3;
+ ctx.beginPath();
+ ctx.moveTo(250, 1950);
+ ctx.lineTo(1050, 1950);
+ ctx.stroke();
+ ctx.strokeStyle = "#ffffff";
+ ctx.lineWidth = 9;
+ ctx.fillStyle = "rgba(255,255,255,0.5)";
+
+ ctx.beginPath();
+ ctx.moveTo(250, 1950);
+ ctx.lineTo(800 * audio.getVolume() + 250, 1950);
+ ctx.stroke();
+ ctx.beginPath();
+ ctx.arc(800 * audio.getVolume() + 250, 1950, 10, 0, 2 * Math.PI);
+ ctx.fill();
+ core.fillBoldText1(
+ ctx,
+ Math.floor(100 * audio.getVolume()),
+ 1120,
+ 1970,
+ "#FFFFFF",
+ "#000000",
+ 6,
+ core.ui._buildFont(56, true)
+ );
+ } else {
+ //横屏
+
+ core.fillRect(ctx, 0, 0, 2028, 1248, "#000000"); //黑色背景
+ ctx.globalAlpha = 0.5; //透明度
+ if (bg) ctx.drawImage(bg, 0, 0, 1280, 720, 0, 0, 2028, 1248); //绘制半透明背景图片
+ ctx.globalAlpha = 1; //恢复为不透明
+ core.setTextAlign(ctx, "center");
+
+ core.fillBoldText1(
+ ctx,
+ "◀离开",
+ 110,
+ 100,
+ "#FFFFFF",
+ "#000000",
+ 6,
+ core.ui._buildFont(66, true)
+ );
+
+ ctx.strokeStyle = "#FFFFFF";
+ ctx.lineWidth = 3;
+ ctx.beginPath();
+ ctx.moveTo(800, 100);
+ ctx.lineTo(800, 1148);
+ ctx.moveTo(900, 100);
+ ctx.lineTo(1900, 100);
+ ctx.stroke();
+ let posy = 200;
+ const indexList = this.musicMx[page];
+ core.setTextAlign(ctx, "left");
+ for (let i = 0; i < indexList.length; i++) {
+ const text = this.musicname[indexList[i]];
+ if (
+ this.musics.includes(this.musicMx[page][i]) ||
+ page !== this.musicMx.length - 1
+ ) {
+ core.fillBoldText1(
+ ctx,
+ text,
+ 950,
+ posy - 30,
+ page === this.selection[0] && i === this.selection[1] ?
+ "#FFFFFF" :
+ "#444444",
+ "#000000",
+ 6,
+ core.ui._buildFont(66, true)
+ );
+
+ ctx.strokeStyle = "#FFFFFF";
+ ctx.lineWidth = 3;
+ ctx.beginPath();
+ ctx.moveTo(900, posy);
+ ctx.lineTo(1900, posy);
+ ctx.stroke();
+ }
+ posy += 100;
+ }
+ core.fillBoldText1(
+ ctx,
+ "上一页",
+ 1050,
+ 1200 - 30,
+ page === 0 ? "#444444" : "#FFFFFF",
+ "#000000",
+ 6,
+ core.ui._buildFont(66, true)
+ );
+
+ core.fillBoldText1(
+ ctx,
+ page + 1 + "/" + this.musicMx.length,
+ 1350,
+ 1200 - 30,
+ "#FFFFFF",
+ "#000000",
+ 6,
+ core.ui._buildFont(66, true)
+ );
+ core.fillBoldText1(
+ ctx,
+ "下一页",
+ 1550,
+ 1200 - 30,
+ page === this.musicMx.length - 1 ? "#444444" : "#FFFFFF",
+ "#000000",
+ 6,
+ core.ui._buildFont(66, true)
+ );
+ ctx.strokeStyle = "#ffffff";
+ ctx.lineWidth = 3;
+
+ core.fillText(
+ ctx,
+ "|",
+ 55,
+ 697,
+ "#FFFFFF",
+ core.ui._buildFont(96, true)
+ );
+ core.fillText(
+ ctx,
+ "◀",
+ 70,
+ 700,
+ "#FFFFFF",
+ core.ui._buildFont(96, true)
+ );
+
+ ctx.beginPath();
+ ctx.arc(295, 670, 80, 0, 2 * Math.PI);
+ ctx.stroke();
+ if (this.stop) {
+ core.fillText(
+ ctx,
+ "▶",
+ 265,
+ 700,
+ "#FFFFFF",
+ core.ui._buildFont(96, true)
+ );
+ } else {
+ core.fillText(
+ ctx,
+ "||",
+ 245,
+ 700,
+ "#FFFFFF",
+ core.ui._buildFont(96, true)
+ );
+ }
+ core.fillText(
+ ctx,
+ "|",
+ 495,
+ 697,
+ "#FFFFFF",
+ core.ui._buildFont(96, true)
+ );
+ core.fillText(
+ ctx,
+ "▶",
+ 450,
+ 700,
+ "#FFFFFF",
+ core.ui._buildFont(96, true)
+ );
+
+ ctx.font = "bold 48px Verdana";
+ ctx.fillText("音量", 350, 900);
+ ctx.beginPath();
+ ctx.moveTo(100, 1000);
+ ctx.lineTo(700, 1000);
+ ctx.stroke();
+ ctx.strokeStyle = "#ffffff";
+ ctx.lineWidth = 9;
+ ctx.fillStyle = "rgba(255,255,255,0.5)";
+
+ ctx.beginPath();
+ ctx.moveTo(100, 1000);
+ ctx.lineTo(600 * audio.getVolume() + 100, 1000);
+ ctx.stroke();
+ ctx.beginPath();
+ ctx.arc(600 * audio.getVolume() + 100, 1000, 10, 0, 2 * Math.PI);
+ ctx.fill();
+ core.fillBoldText1(
+ ctx,
+ Math.floor(100 * audio.getVolume()),
+ 720,
+ 1010,
+ "#FFFFFF",
+ "#000000",
+ 6,
+ core.ui._buildFont(56, true)
+ );
+ const img = core.material.images.images[this.type + ".webp"];
+ if (img) ctx.drawImage(img, 580, 560, 200, 200);
+ core.setTextAlign(ctx, "center");
+ ctx.font = "bold 48px Verdana";
+ ctx.fillText("当前歌曲", 400, 297);
+ ctx.fillText(
+ this.musicname[this.musicMx[this.selection[0]][this.selection[1]]],
+ 400,
+ 397
+ );
+ }
+ }
+ }
+ core.ui.music = new musicclass();
+ main.dom.musicMode.onclick = function () {
+ //点击开始页面的CG MODE进入cg回廊
+ if (
+ (core.getLocalStorage("musics") &&
+ core.getLocalStorage("musics").length === 0) ||
+ !core.getLocalStorage("musics")
+ )
+ core.setLocalStorage("musics", ["theme.mp3"]);
+ core.ui.music.musics = core.getLocalStorage("musics");
+ core.playBgm(
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ],
+ 0
+ );
+
+ const arr = main.core.ui.music.musicMx.flat(Infinity);
+ main.core.ui.music.randomList = shuffle(arr);
+ main.core.ui.music.random = main.core.ui.music.randomList.indexOf(
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ]
+ );
+ page = 0;
+ music.style.display = "block";
+ let time = 0;
+ core.registerAnimationFrame("music", null, (temptime) => {
+ if (temptime > time + 1000 / 60) {
+ time = temptime;
+ main.core.ui.music.update();
+ const duration =
+ core.plugin.audioSystem.bgmController.player.getRoute(
+ "bgms." +
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ]
+ ).duration;
+
+ const currentTime =
+ core.plugin.audioSystem.bgmController.player.getRoute(
+ "bgms." +
+ main.core.ui.music.musicMx[main.core.ui.music.selection[0]][
+ main.core.ui.music.selection[1]
+ ]
+ ).currentTime;
+ if (currentTime && duration && duration - currentTime < 0.05) {
+ if (core.domStyle.isVertical) {
+ core.ui.music.mousedown(830, 1770);
+ } else {
+ core.ui.music.mousedown(475, 765);
+ }
+ }
+ }
+ });
+ };
+ loader.prototype.loadOneMusic = function (name) {
+ /* var music = new Audio();
+ music.preload = "none";
+ if (main.bgmRemote)
+ music.src = main.bgmRemoteRoot + core.firstData.name + "/" + name;
+ else music.src = "project/bgms/" + name;
+ music.loop = "loop";
+ core.material.bgms[name] = music;*/
+ };
+
+},
"横屏切换": function () {
// 在此增加新插件
this.triggerFullscreen = async function (full) {
@@ -18333,14 +18367,14 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
});
},
"intro&loop": function () {
- // 在此增加新插件
- this.introAndLoop = function (intro, time, loop) {
- core.playBgm(intro);
- setTimeout(() => {
- core.playBgm(loop);
- }, time * 1000);
- };
- },
+ // 在此增加新插件
+ this.introAndLoop = function (intro, time, loop) {
+ core.playBgm(intro);
+ setTimeout(() => {
+ core.playBgm(loop);
+ }, time * 1000);
+ };
+},
"开局选项悬停": function () {
// 在此增加新插件
@@ -18677,151 +18711,165 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
};
},
"回合战斗动画": function () {
- // 在此增加新插件
- const animateAttack = document.createElement("canvas"); //画布设置
- animateAttack.style.zIndex = 80;
- animateAttack.id = "animateAttack";
- animateAttack.classList.add("gameCanvas", "anti-aliasing");
- animateAttack.style.display = "block";
- animateAttack.width = 416;
- animateAttack.height = 416;
- animateAttack.style.width = core.__PIXELS__ * core.domStyle.scale + "px";
- animateAttack.style.height = core.__PIXELS__ * core.domStyle.scale + "px";
- main.dom.animateAttack = animateAttack;
- const ctx = animateAttack.getContext("2d");
+ // 在此增加新插件
+ const animateAttack = document.createElement("canvas"); //画布设置
+ animateAttack.style.zIndex = 80;
+ animateAttack.id = "animateAttack";
+ animateAttack.classList.add("gameCanvas", "anti-aliasing");
+ animateAttack.style.display = "block";
+ animateAttack.width = 416;
+ animateAttack.height = 416;
+ animateAttack.style.width = core.__PIXELS__ * core.domStyle.scale + "px";
+ animateAttack.style.height = core.__PIXELS__ * core.domStyle.scale + "px";
+ main.dom.animateAttack = animateAttack;
+ const ctx = animateAttack.getContext("2d");
- main.dom.gameDraw.appendChild(animateAttack);
+ main.dom.gameDraw.appendChild(animateAttack);
- this.drawAttackAnimate = function (
- heroInfo,
- oneTurn,
- enemyInfo,
- equipInfo,
- farme
- ) {
- core.clearMap(ctx);
- let animate = Math.floor(farme / 30);
- core.fillRect(ctx, 64, 64, 288, 288, "rgba(0,0,0,0.5)");
- core.strokeRect(ctx, 64, 64, 288, 288, "rgba(255,255,255,0.5)", 4);
- core.setTextAlign(ctx, "left");
- core.fillBoldText(
- ctx,
- hero.name,
- 112,
- 128,
- "#FFFFFF",
- "#000000",
- core.ui._buildFont(14, true)
- );
+ this.drawAttackAnimate = function (
+ heroInfo,
+ oneTurn,
+ enemyInfo,
+ equipInfo,
+ farme
+ ) {
+ core.clearMap(ctx);
+ let animate = Math.floor(farme / 30);
+ core.fillRect(ctx, 64, 64, 288, 288, "rgba(0,0,0,0.5)");
+ core.strokeRect(ctx, 64, 64, 288, 288, "rgba(255,255,255,0.5)", 4);
+ core.setTextAlign(ctx, "left");
+ core.fillBoldText(
+ ctx,
+ hero.name,
+ 112,
+ 128,
+ "#FFFFFF",
+ "#000000",
+ core.ui._buildFont(14, true)
+ );
- core.strokeRect(ctx, 112, 144, 32, 48, "rgba(255,255,255,1)", 1);
- core.drawImage(
- ctx,
- "hero.webp",
- 32 * (animate % 4),
- 0,
- 32,
- 48,
- 112,
- 144,
- 32,
- 48
- );
+ core.strokeRect(ctx, 112, 144, 32, 48, "rgba(255,255,255,1)", 1);
+ core.drawImage(
+ ctx,
+ "hero.webp",
+ 32 * (animate % 4),
+ 0,
+ 32,
+ 48,
+ 112,
+ 144,
+ 32,
+ 48
+ );
- core.setTextAlign(ctx, "right");
- core.fillBoldText(
- ctx,
- enemyInfo.name,
- 304,
- 128,
- "#FFFFFF",
- "#000000",
- core.ui._buildFont(14, true)
- );
- if (enemyInfo.cls === "enemys") {
- core.strokeRect(ctx, 272, 160, 32, 32, "rgba(255,255,255,1)", 1);
+ core.setTextAlign(ctx, "right");
+ core.fillBoldText(
+ ctx,
+ enemyInfo.name,
+ 304,
+ 128,
+ "#FFFFFF",
+ "#000000",
+ core.ui._buildFont(14, true)
+ );
+ if (enemyInfo.cls === "enemys") {
+ core.strokeRect(ctx, 272, 160, 32, 32, "rgba(255,255,255,1)", 1);
- core.drawImage(
- ctx,
- core.getBlockInfo(enemyInfo.id).image,
- 32 * (animate % 2),
- core.getBlockInfo(enemyInfo.id).posY * 32,
- 32,
- 32,
- 272,
- 160,
- 32,
- 32
- );
- } else {
- core.strokeRect(ctx, 272, 144, 32, 48, "rgba(255,255,255,1)", 1);
+ core.drawImage(
+ ctx,
+ core.getBlockInfo(enemyInfo.id).image,
+ 32 * (animate % 2),
+ core.getBlockInfo(enemyInfo.id).posY * 32,
+ 32,
+ 32,
+ 272,
+ 160,
+ 32,
+ 32
+ );
+ } else {
+ core.strokeRect(ctx, 272, 144, 32, 48, "rgba(255,255,255,1)", 1);
- core.drawImage(
- ctx,
- core.getBlockInfo(enemyInfo.id).image,
- 32 * (animate % 4),
- core.getBlockInfo(enemyInfo.id).posY * 48,
- 32,
- 32,
- 272,
- 144,
- 32,
- 48
- );
- }
- };
+ core.drawImage(
+ ctx,
+ core.getBlockInfo(enemyInfo.id).image,
+ 32 * (animate % 4),
+ core.getBlockInfo(enemyInfo.id).posY * 48,
+ 32,
+ 48,
+ 272,
+ 144,
+ 32,
+ 48
+ );
+ }
+ core.fillBoldText(ctx,
+ "V",
+ 219,
+ 168,
+ "#FFFFFF",
+ "#000000",
+ core.ui._buildFont(48, true))
+ core.fillBoldText(ctx,
+ "s",
+ 231,
+ 168,
+ "#FFFFFF",
+ "#000000",
+ core.ui._buildFont(36, true))
+ };
- this.attackAnimate = function (
- enemyId,
- enemyInfo,
- damageInfo,
- equipInfo = []
- ) {
- //参数分别为怪物真实属性,战斗信息,特殊装备(如火焰风衣)属性特殊装备属性为以元组{equipId,oneDamage,speed,now:0}构成的数组(列出每个需要计算的特殊装备,没有则为空数组或不填)
- core.lockControl();
- core.clearMap(ctx);
- core.status.event.id = "attackAnimate";
- let hero_hp = core.getRealStatusOrDefault(hero, "hp"),
- hero_atk = core.getRealStatusOrDefault(hero, "atk"),
- hero_def = core.getRealStatusOrDefault(hero, "def"),
- hero_mdef = core.getRealStatusOrDefault(hero, "mdef"),
- hero_speed = core.getRealStatusOrDefault(hero, "speed");
- const heroInfo = {
- hp: hero_hp,
- atk: hero_atk,
- def: hero_def,
- mdef: hero_mdef,
- speed: hero_speed,
- now: 0,
- };
- enemyInfo.id = enemyId;
- enemyInfo.cls = core.getClsFromId(enemyId);
- enemyInfo.name = core.material.enemys[enemyId].name;
+ this.attackAnimate = function (
+ enemyId,
+ enemyInfo,
+ damageInfo,
+ equipInfo = []
+ ) {
+ //参数分别为怪物真实属性,战斗信息,特殊装备(如火焰风衣)属性特殊装备属性为以元组{equipId,oneDamage,speed,now:0}构成的数组(列出每个需要计算的特殊装备,没有则为空数组或不填)
+ core.lockControl();
+ core.clearMap(ctx);
+ core.status.event.id = "attackAnimate";
+ let hero_hp = core.getRealStatusOrDefault(hero, "hp"),
+ hero_atk = core.getRealStatusOrDefault(hero, "atk"),
+ hero_def = core.getRealStatusOrDefault(hero, "def"),
+ hero_mdef = core.getRealStatusOrDefault(hero, "mdef"),
+ hero_speed = core.getRealStatusOrDefault(hero, "speed");
+ const heroInfo = {
+ hp: hero_hp,
+ atk: hero_atk,
+ def: hero_def,
+ mdef: hero_mdef,
+ speed: hero_speed,
+ now: 0,
+ };
+ enemyInfo.id = enemyId;
+ enemyInfo.cls = core.getClsFromId(enemyId);
+ enemyInfo.name = core.material.enemys[enemyId].name;
- let oneTurn = heroInfo.speed + enemyInfo.speed;
- if (equipInfo.length > 0) {
- for (let i; i < equipInfo.length - 1; i++) {
- oneTurn += equipInfo[i].speed;
- }
- }
- oneTurn *= 100;
- let time = 0,
- farme = 0;
- core.registerAnimationFrame("attackAnimate", true, (temptime) => {
- if (temptime - time > 1000 / 60) {
- time = temptime;
- this.drawAttackAnimate(
- heroInfo,
- oneTurn,
- enemyInfo,
- equipInfo,
- farme
- );
- farme++;
- }
- });
- };
- },
+ let oneTurn = heroInfo.speed + enemyInfo.speed;
+ if (equipInfo.length > 0) {
+ for (let i; i < equipInfo.length - 1; i++) {
+ oneTurn += equipInfo[i].speed;
+ }
+ }
+ oneTurn *= 100;
+ let time = 0,
+ farme = 0;
+ core.registerAnimationFrame("attackAnimate", true, (temptime) => {
+ if (temptime - time > 1000 / 60) {
+ time = temptime;
+ this.drawAttackAnimate(
+ heroInfo,
+ oneTurn,
+ enemyInfo,
+ equipInfo,
+ farme
+ );
+ farme++;
+ }
+ });
+ };
+},
"剧情内容": function () {
// 在此增加新插件
// 每项为一个数组,第一项是名字,第二项是对话内容
From 8f3c9b514f7782a882d14a9c693acd86027303dd Mon Sep 17 00:00:00 2001
From: strawberry42271 <2806566736@qq.com>
Date: Thu, 30 Jan 2025 08:05:03 +0800
Subject: [PATCH 02/10] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=9F=B3=E9=A2=91?=
=?UTF-8?q?=E6=92=AD=E6=94=BE=E5=92=8C=E6=A5=BC=E4=BC=A0=E7=9A=84=E5=B0=8F?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
_server/CodeMirror/defs.js | 5218 ++++++++++++-----------
_server/MotaAction.g4 | 4 +-
_server/editor_blocklyconfig.js | 10 +-
project/animates/hand.animate | 2 +-
project/data.js | 3 +-
project/functions.js | 2874 +++++++------
project/items.js | 2 +-
project/maps.js | 976 +++--
project/plugins.js | 6956 +++++++++++++++----------------
9 files changed, 8629 insertions(+), 7416 deletions(-)
diff --git a/_server/CodeMirror/defs.js b/_server/CodeMirror/defs.js
index 1c16b25..ee517af 100644
--- a/_server/CodeMirror/defs.js
+++ b/_server/CodeMirror/defs.js
@@ -1,4130 +1,4526 @@
var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [
{
"!name": "browser",
- "Node": {
+ Node: {
"!type": "fn()",
- "prototype": {
- "nextSibling": {
+ prototype: {
+ nextSibling: {
"!type": "+Element",
- "!doc": "返回紧接其父节点的childNodes列表中指定节点之后的节点;如果指定节点是该列表中的最后一个节点,则返回null.",
+ "!doc":
+ "返回紧接其父节点的childNodes列表中指定节点之后的节点;如果指定节点是该列表中的最后一个节点,则返回null.",
},
- "previousSibling": {
+ previousSibling: {
"!type": "+Element",
- "!doc": "返回紧接其父节点的childNodes列表中指定节点之前的节点,如果指定节点是该列表中的第一个节点,则返回null.",
+ "!doc":
+ "返回紧接其父节点的childNodes列表中指定节点之前的节点,如果指定节点是该列表中的第一个节点,则返回null.",
},
- "lastChild": {
+ lastChild: {
"!type": "+Element",
- "!doc": "返回节点的最后一个孩子."
+ "!doc": "返回节点的最后一个孩子.",
},
- "firstChild": {
+ firstChild: {
"!type": "+Element",
- "!doc": "返回树中该节点的第一个子节点;如果该节点为无子节点,则返回null.如果该节点是Document,则返回其直接子节点列表中的第一个节点.",
+ "!doc":
+ "返回树中该节点的第一个子节点;如果该节点为无子节点,则返回null.如果该节点是Document,则返回其直接子节点列表中的第一个节点.",
},
- "childNodes": {
+ childNodes: {
"!type": "+NodeList",
- "!doc": "返回给定元素的子节点的集合."
+ "!doc": "返回给定元素的子节点的集合.",
},
- "parentNode": {
+ parentNode: {
"!type": "+Element",
- "!doc": "返回DOM树中指定节点的父级."
+ "!doc": "返回DOM树中指定节点的父级.",
},
- "tagName": {
+ tagName: {
"!type": "string",
- "!doc": "将当前节点的名称作为字符串返回."
+ "!doc": "将当前节点的名称作为字符串返回.",
},
- "insertBefore": {
+ insertBefore: {
"!type": "fn(newElt: +Element, before: +Element) -> +Element",
"!doc": "将指定的节点插入到参考元素之前,作为当前节点的子级.",
},
- "removeChild": {
+ removeChild: {
"!type": "fn(oldNode: +Element) -> +Element",
"!doc": "从DOM中删除一个子节点.返回已删除的节点.",
},
- "appendChild": {
+ appendChild: {
"!type": "fn(newNode: +Element) -> +Element",
- "!doc": "将一个节点添加到指定父节点的子节点列表的末尾.如果该节点已经存在,则将其从当前父节点中删除,然后添加到新的父节点中.",
+ "!doc":
+ "将一个节点添加到指定父节点的子节点列表的末尾.如果该节点已经存在,则将其从当前父节点中删除,然后添加到新的父节点中.",
},
- "cloneNode": {
+ cloneNode: {
"!type": "fn(deep: bool) -> +Element",
- "!doc": "返回在其上调用此方法的节点的副本."
+ "!doc": "返回在其上调用此方法的节点的副本.",
},
- "addEventListener": {
+ addEventListener: {
"!type": "fn(type: string, listener: fn(e: +Event), capture: bool)",
- "!doc": "在单个目标上注册单个事件侦听器.事件目标可以是文档中的单个元素,文档本身,窗口或XMLHttpRequest.",
+ "!doc":
+ "在单个目标上注册单个事件侦听器.事件目标可以是文档中的单个元素,文档本身,窗口或XMLHttpRequest.",
},
- "removeEventListener": {
+ removeEventListener: {
"!type": "fn(type: string, listener: fn(), capture: bool)",
"!doc": "允许从事件目标中删除事件侦听器.",
},
- "innerText": {
+ innerText: {
"!type": "string",
- "!doc": "获取或设置节点及其后代的文本内容."
- }
- },
- "!doc": "节点是一个接口,许多DOM类型都从该接口继承,并允许类似地对待(或测试)这些各种类型.",
- },
- "Element": {
- "!type": "fn()",
- "prototype": {
- "!proto": "Node.prototype",
- "getAttribute": {
- "!type": "fn(name: string) -> string",
- "!doc": "返回指定元素上的命名属性的值.如果命名属性不存在,则返回的值将为null或\" \"(空字符串).",
+ "!doc": "获取或设置节点及其后代的文本内容.",
},
- "setAttribute": {
+ },
+ "!doc":
+ "节点是一个接口,许多DOM类型都从该接口继承,并允许类似地对待(或测试)这些各种类型.",
+ },
+ Element: {
+ "!type": "fn()",
+ prototype: {
+ "!proto": "Node.prototype",
+ getAttribute: {
+ "!type": "fn(name: string) -> string",
+ "!doc":
+ '返回指定元素上的命名属性的值.如果命名属性不存在,则返回的值将为null或" "(空字符串).',
+ },
+ setAttribute: {
"!type": "fn(name: string, value: string)",
"!doc": "在指定元素上添加新属性或更改现有属性的值.",
},
- "removeAttribute": {
+ removeAttribute: {
"!type": "fn(name: string)",
"!doc": "从指定元素中删除属性.",
},
- "getElementsByTagName": {
+ getElementsByTagName: {
"!type": "fn(tagName: string) -> +NodeList",
- "!doc": "返回具有给定标签名的元素列表.搜索指定元素下面的子树,不包括元素本身.返回的列表是活动的,这意味着它将自动使用DOM树进行更新.因此,无需使用相同的元素和参数多次调用element.getElementsByTagName."
+ "!doc":
+ "返回具有给定标签名的元素列表.搜索指定元素下面的子树,不包括元素本身.返回的列表是活动的,这意味着它将自动使用DOM树进行更新.因此,无需使用相同的元素和参数多次调用element.getElementsByTagName.",
},
- "getElementsByClassName": {
+ getElementsByClassName: {
"!type": "fn(name: string) -> +NodeList",
- "!doc": "返回具有所有给定类名称的一组元素.在文档对象上调用时,将搜索整个文档,包括根节点.您还可以在任何元素上调用getElementsByClassName;它将仅返回元素,它们是具有给定类名的指定根元素的后代."
+ "!doc":
+ "返回具有所有给定类名称的一组元素.在文档对象上调用时,将搜索整个文档,包括根节点.您还可以在任何元素上调用getElementsByClassName;它将仅返回元素,它们是具有给定类名的指定根元素的后代.",
},
- "children": {
+ children: {
"!type": "+HTMLCollection",
- "!doc": "返回给定元素的子元素的集合."
+ "!doc": "返回给定元素的子元素的集合.",
},
- "className": {
+ className: {
"!type": "string",
"!doc": "获取并设置指定元素的class属性的值.",
},
- "style": {
- "cssText": "string",
- "alignmentBaseline": "string",
- "background": "string",
- "backgroundAttachment": "string",
- "backgroundClip": "string",
- "backgroundColor": "string",
- "backgroundImage": "string",
- "backgroundOrigin": "string",
- "backgroundPosition": "string",
- "backgroundPositionX": "string",
- "backgroundPositionY": "string",
- "backgroundRepeat": "string",
- "backgroundRepeatX": "string",
- "backgroundRepeatY": "string",
- "backgroundSize": "string",
- "baselineShift": "string",
- "border": "string",
- "borderBottom": "string",
- "borderBottomColor": "string",
- "borderBottomLeftRadius": "string",
- "borderBottomRightRadius": "string",
- "borderBottomStyle": "string",
- "borderBottomWidth": "string",
- "borderCollapse": "string",
- "borderColor": "string",
- "borderImage": "string",
- "borderImageOutset": "string",
- "borderImageRepeat": "string",
- "borderImageSlice": "string",
- "borderImageSource": "string",
- "borderImageWidth": "string",
- "borderLeft": "string",
- "borderLeftColor": "string",
- "borderLeftStyle": "string",
- "borderLeftWidth": "string",
- "borderRadius": "string",
- "borderRight": "string",
- "borderRightColor": "string",
- "borderRightStyle": "string",
- "borderRightWidth": "string",
- "borderSpacing": "string",
- "borderStyle": "string",
- "borderTop": "string",
- "borderTopColor": "string",
- "borderTopLeftRadius": "string",
- "borderTopRightRadius": "string",
- "borderTopStyle": "string",
- "borderTopWidth": "string",
- "borderWidth": "string",
- "bottom": "string",
- "boxShadow": "string",
- "boxSizing": "string",
- "captionSide": "string",
- "clear": "string",
- "clip": "string",
- "clipPath": "string",
- "clipRule": "string",
- "color": "string",
- "colorInterpolation": "string",
- "colorInterpolationFilters": "string",
- "colorProfile": "string",
- "colorRendering": "string",
- "content": "string",
- "counterIncrement": "string",
- "counterReset": "string",
- "cursor": "string",
- "direction": "string",
- "display": "string",
- "dominantBaseline": "string",
- "emptyCells": "string",
- "enableBackground": "string",
- "fill": "string",
- "fillOpacity": "string",
- "fillRule": "string",
- "filter": "string",
- "float": "string",
- "floodColor": "string",
- "floodOpacity": "string",
- "font": "string",
- "fontFamily": "string",
- "fontSize": "string",
- "fontStretch": "string",
- "fontStyle": "string",
- "fontVariant": "string",
- "fontWeight": "string",
- "glyphOrientationHorizontal": "string",
- "glyphOrientationVertical": "string",
- "height": "string",
- "imageRendering": "string",
- "kerning": "string",
- "left": "string",
- "letterSpacing": "string",
- "lightingColor": "string",
- "lineHeight": "string",
- "listStyle": "string",
- "listStyleImage": "string",
- "listStylePosition": "string",
- "listStyleType": "string",
- "margin": "string",
- "marginBottom": "string",
- "marginLeft": "string",
- "marginRight": "string",
- "marginTop": "string",
- "marker": "string",
- "markerEnd": "string",
- "markerMid": "string",
- "markerStart": "string",
- "mask": "string",
- "maxHeight": "string",
- "maxWidth": "string",
- "minHeight": "string",
- "minWidth": "string",
- "opacity": "string",
- "orphans": "string",
- "outline": "string",
- "outlineColor": "string",
- "outlineOffset": "string",
- "outlineStyle": "string",
- "outlineWidth": "string",
- "overflow": "string",
- "overflowWrap": "string",
- "overflowX": "string",
- "overflowY": "string",
- "padding": "string",
- "paddingBottom": "string",
- "paddingLeft": "string",
- "paddingRight": "string",
- "paddingTop": "string",
- "page": "string",
- "pageBreakAfter": "string",
- "pageBreakBefore": "string",
- "pageBreakInside": "string",
- "pointerEvents": "string",
- "position": "string",
- "quotes": "string",
- "resize": "string",
- "right": "string",
- "shapeRendering": "string",
- "size": "string",
- "speak": "string",
- "src": "string",
- "stopColor": "string",
- "stopOpacity": "string",
- "stroke": "string",
- "strokeDasharray": "string",
- "strokeDashoffset": "string",
- "strokeLinecap": "string",
- "strokeLinejoin": "string",
- "strokeMiterlimit": "string",
- "strokeOpacity": "string",
- "strokeWidth": "string",
- "tabSize": "string",
- "tableLayout": "string",
- "textAlign": "string",
- "textAnchor": "string",
- "textDecoration": "string",
- "textIndent": "string",
- "textLineThrough": "string",
- "textLineThroughColor": "string",
- "textLineThroughMode": "string",
- "textLineThroughStyle": "string",
- "textLineThroughWidth": "string",
- "textOverflow": "string",
- "textOverline": "string",
- "textOverlineColor": "string",
- "textOverlineMode": "string",
- "textOverlineStyle": "string",
- "textOverlineWidth": "string",
- "textRendering": "string",
- "textShadow": "string",
- "textTransform": "string",
- "textUnderline": "string",
- "textUnderlineColor": "string",
- "textUnderlineMode": "string",
- "textUnderlineStyle": "string",
- "textUnderlineWidth": "string",
- "top": "string",
- "unicodeBidi": "string",
- "unicodeRange": "string",
- "vectorEffect": "string",
- "verticalAlign": "string",
- "visibility": "string",
- "whiteSpace": "string",
- "width": "string",
- "wordBreak": "string",
- "wordSpacing": "string",
- "wordWrap": "string",
- "writingMode": "string",
- "zIndex": "string",
- "zoom": "string",
- "!doc": "返回一个表示元素的style属性的对象."
+ style: {
+ cssText: "string",
+ alignmentBaseline: "string",
+ background: "string",
+ backgroundAttachment: "string",
+ backgroundClip: "string",
+ backgroundColor: "string",
+ backgroundImage: "string",
+ backgroundOrigin: "string",
+ backgroundPosition: "string",
+ backgroundPositionX: "string",
+ backgroundPositionY: "string",
+ backgroundRepeat: "string",
+ backgroundRepeatX: "string",
+ backgroundRepeatY: "string",
+ backgroundSize: "string",
+ baselineShift: "string",
+ border: "string",
+ borderBottom: "string",
+ borderBottomColor: "string",
+ borderBottomLeftRadius: "string",
+ borderBottomRightRadius: "string",
+ borderBottomStyle: "string",
+ borderBottomWidth: "string",
+ borderCollapse: "string",
+ borderColor: "string",
+ borderImage: "string",
+ borderImageOutset: "string",
+ borderImageRepeat: "string",
+ borderImageSlice: "string",
+ borderImageSource: "string",
+ borderImageWidth: "string",
+ borderLeft: "string",
+ borderLeftColor: "string",
+ borderLeftStyle: "string",
+ borderLeftWidth: "string",
+ borderRadius: "string",
+ borderRight: "string",
+ borderRightColor: "string",
+ borderRightStyle: "string",
+ borderRightWidth: "string",
+ borderSpacing: "string",
+ borderStyle: "string",
+ borderTop: "string",
+ borderTopColor: "string",
+ borderTopLeftRadius: "string",
+ borderTopRightRadius: "string",
+ borderTopStyle: "string",
+ borderTopWidth: "string",
+ borderWidth: "string",
+ bottom: "string",
+ boxShadow: "string",
+ boxSizing: "string",
+ captionSide: "string",
+ clear: "string",
+ clip: "string",
+ clipPath: "string",
+ clipRule: "string",
+ color: "string",
+ colorInterpolation: "string",
+ colorInterpolationFilters: "string",
+ colorProfile: "string",
+ colorRendering: "string",
+ content: "string",
+ counterIncrement: "string",
+ counterReset: "string",
+ cursor: "string",
+ direction: "string",
+ display: "string",
+ dominantBaseline: "string",
+ emptyCells: "string",
+ enableBackground: "string",
+ fill: "string",
+ fillOpacity: "string",
+ fillRule: "string",
+ filter: "string",
+ float: "string",
+ floodColor: "string",
+ floodOpacity: "string",
+ font: "string",
+ fontFamily: "string",
+ fontSize: "string",
+ fontStretch: "string",
+ fontStyle: "string",
+ fontVariant: "string",
+ fontWeight: "string",
+ glyphOrientationHorizontal: "string",
+ glyphOrientationVertical: "string",
+ height: "string",
+ imageRendering: "string",
+ kerning: "string",
+ left: "string",
+ letterSpacing: "string",
+ lightingColor: "string",
+ lineHeight: "string",
+ listStyle: "string",
+ listStyleImage: "string",
+ listStylePosition: "string",
+ listStyleType: "string",
+ margin: "string",
+ marginBottom: "string",
+ marginLeft: "string",
+ marginRight: "string",
+ marginTop: "string",
+ marker: "string",
+ markerEnd: "string",
+ markerMid: "string",
+ markerStart: "string",
+ mask: "string",
+ maxHeight: "string",
+ maxWidth: "string",
+ minHeight: "string",
+ minWidth: "string",
+ opacity: "string",
+ orphans: "string",
+ outline: "string",
+ outlineColor: "string",
+ outlineOffset: "string",
+ outlineStyle: "string",
+ outlineWidth: "string",
+ overflow: "string",
+ overflowWrap: "string",
+ overflowX: "string",
+ overflowY: "string",
+ padding: "string",
+ paddingBottom: "string",
+ paddingLeft: "string",
+ paddingRight: "string",
+ paddingTop: "string",
+ page: "string",
+ pageBreakAfter: "string",
+ pageBreakBefore: "string",
+ pageBreakInside: "string",
+ pointerEvents: "string",
+ position: "string",
+ quotes: "string",
+ resize: "string",
+ right: "string",
+ shapeRendering: "string",
+ size: "string",
+ speak: "string",
+ src: "string",
+ stopColor: "string",
+ stopOpacity: "string",
+ stroke: "string",
+ strokeDasharray: "string",
+ strokeDashoffset: "string",
+ strokeLinecap: "string",
+ strokeLinejoin: "string",
+ strokeMiterlimit: "string",
+ strokeOpacity: "string",
+ strokeWidth: "string",
+ tabSize: "string",
+ tableLayout: "string",
+ textAlign: "string",
+ textAnchor: "string",
+ textDecoration: "string",
+ textIndent: "string",
+ textLineThrough: "string",
+ textLineThroughColor: "string",
+ textLineThroughMode: "string",
+ textLineThroughStyle: "string",
+ textLineThroughWidth: "string",
+ textOverflow: "string",
+ textOverline: "string",
+ textOverlineColor: "string",
+ textOverlineMode: "string",
+ textOverlineStyle: "string",
+ textOverlineWidth: "string",
+ textRendering: "string",
+ textShadow: "string",
+ textTransform: "string",
+ textUnderline: "string",
+ textUnderlineColor: "string",
+ textUnderlineMode: "string",
+ textUnderlineStyle: "string",
+ textUnderlineWidth: "string",
+ top: "string",
+ unicodeBidi: "string",
+ unicodeRange: "string",
+ vectorEffect: "string",
+ verticalAlign: "string",
+ visibility: "string",
+ whiteSpace: "string",
+ width: "string",
+ wordBreak: "string",
+ wordSpacing: "string",
+ wordWrap: "string",
+ writingMode: "string",
+ zIndex: "string",
+ zoom: "string",
+ "!doc": "返回一个表示元素的style属性的对象.",
},
- "classList": {
+ classList: {
"!type": "+DOMTokenList",
- "!doc": "返回元素的class属性的标记列表."
+ "!doc": "返回元素的class属性的标记列表.",
},
- "title": {
+ title: {
"!type": "string",
- "!doc": " \"\u5efa\u7acb\u5f53\u9f20\u6807\u60ac\u505c\u5728\u663e\u793a\u7684\u8282\u70b9\u4e0a\u65f6\u5728\"\u5de5\u5177\u63d0\u793a\"\u5f39\u51fa\u7a97\u53e3\u4e2d\u663e\u793a\u7684\u6587\u672c.\","
+ "!doc":
+ ' "\u5efa\u7acb\u5f53\u9f20\u6807\u60ac\u505c\u5728\u663e\u793a\u7684\u8282\u70b9\u4e0a\u65f6\u5728"\u5de5\u5177\u63d0\u793a"\u5f39\u51fa\u7a97\u53e3\u4e2d\u663e\u793a\u7684\u6587\u672c.",',
},
- "width": {
+ width: {
"!type": "number",
- "!doc": "返回元素的布局宽度."
+ "!doc": "返回元素的布局宽度.",
},
- "height": {
+ height: {
"!type": "number",
- "!doc": "元素相对于元素的offsetParent的高度."
+ "!doc": "元素相对于元素的offsetParent的高度.",
},
- "getContext": {
+ getContext: {
"!type": "fn(id: string) -> CanvasRenderingContext2D",
- "!doc": " DOM画布元素公开了HTMLCanvasElement接口,该接口提供了用于操纵画布元素的布局和表示的属性和方法.HTMLCanvasElement接口继承了元素对象接口的属性和方法.",
+ "!doc":
+ " DOM画布元素公开了HTMLCanvasElement接口,该接口提供了用于操纵画布元素的布局和表示的属性和方法.HTMLCanvasElement接口继承了元素对象接口的属性和方法.",
},
- "innerHTML": {
+ innerHTML: {
"!type": "string",
"!doc": "设置或获取描述元素后代的HTML语法.",
- }
+ },
},
"!doc": "表示HTML或XML文档中的元素.",
},
- "Document": {
+ Document: {
"!type": "fn()",
- "prototype": {
+ prototype: {
"!proto": "Node.prototype",
- "height": {
+ height: {
"!type": "number",
"!doc": "返回当前文档的
元素的高度.",
},
- "width": {
+ width: {
"!type": "number",
"!doc": "以像素为单位返回当前文档的元素的宽度.",
},
- "body": {
+ body: {
"!type": "+Element",
"!doc": "返回当前文档的或