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": "返回当前文档的或节点.", }, - "cookie": { + cookie: { "!type": "string", "!doc": "获取并设置与当前文档关联的cookie.", }, - "URL": "string", - "title": { + URL: "string", + title: { "!type": "string", - "!doc": "获取或设置文档的标题." + "!doc": "获取或设置文档的标题.", }, - "getElementById": { + getElementById: { "!type": "fn(id: string) -> +Element", - "!doc": "通过元素ID返回对该元素的引用." + "!doc": "通过元素ID返回对该元素的引用.", }, - "getElementsByTagName": { + getElementsByTagName: { "!type": "fn(tagName: string) -> +NodeList", - "!doc": "返回具有给定标签名称的元素的NodeList.将搜索整个文档,包括根节点.返回的NodeList处于活动状态,这意味着它会自动更新自身以与DOM树保持同步,而无需再次调用document.getElementsByTagName." + "!doc": + "返回具有给定标签名称的元素的NodeList.将搜索整个文档,包括根节点.返回的NodeList处于活动状态,这意味着它会自动更新自身以与DOM树保持同步,而无需再次调用document.getElementsByTagName.", }, - "getElementsByName": { + getElementsByName: { "!type": "fn(name: string) -> +HTMLCollection", "!doc": "返回HTML文档中具有给定名称的元素列表.", }, - "getElementsByClassName": "Element.prototype.getElementsByClassName" + getElementsByClassName: "Element.prototype.getElementsByClassName", }, - "!doc": "浏览器中加载的每个网页都有其自己的文档对象.此对象用作网页内容(DOM树,包括诸如和之类的元素)的入口点,并提供文档的全局功能(例如获取页面的URL和在文档中创建新元素)." + "!doc": + "浏览器中加载的每个网页都有其自己的文档对象.此对象用作网页内容(DOM树,包括诸如和
之类的元素)的入口点,并提供文档的全局功能(例如获取页面的URL和在文档中创建新元素).", }, - "document": { + document: { "!type": "+Document", - "!doc": "浏览器中加载的每个网页都有其自己的文档对象.此对象用作网页内容(DOM树,包括诸如和
之类的元素)的入口点,并提供文档的全局功能(例如获取页面的URL和在文档中创建新元素)." + "!doc": + "浏览器中加载的每个网页都有其自己的文档对象.此对象用作网页内容(DOM树,包括诸如和
之类的元素)的入口点,并提供文档的全局功能(例如获取页面的URL和在文档中创建新元素).", }, - "Event": { + Event: { "!type": "fn()", - "prototype": { - "stopPropagation": { + prototype: { + stopPropagation: { "!type": "fn()", - "!doc": "防止当前事件进一步传播." + "!doc": "防止当前事件进一步传播.", }, - "preventDefault": { + preventDefault: { "!type": "fn()", - "!doc": "如果可以取消事件,则取消该事件,而不停止事件的进一步传播." + "!doc": "如果可以取消事件,则取消该事件,而不停止事件的进一步传播.", }, - "stopImmediatePropagation": { + stopImmediatePropagation: { "!type": "fn()", - "!doc": "防止同一事件的其他侦听器被调用." + "!doc": "防止同一事件的其他侦听器被调用.", }, - "type": { + type: { "!type": "string", - "!doc": "返回包含事件类型的字符串." + "!doc": "返回包含事件类型的字符串.", }, - "target": { + target: { "!type": "+Element", - "!doc": " EventTarget是由对象实现的DOM接口,这些对象可以接收DOM事件并具有侦听器.最常见的EventTarget是DOM元素,尽管其他对象也可以是EventTarget,例如文档,窗口,XMLHttpRequest,和别的." + "!doc": + " EventTarget是由对象实现的DOM接口,这些对象可以接收DOM事件并具有侦听器.最常见的EventTarget是DOM元素,尽管其他对象也可以是EventTarget,例如文档,窗口,XMLHttpRequest,和别的.", }, - "clientX": { + clientX: { "!type": "number", - "!doc": "返回事件发生的应用程序客户区域内的水平坐标(与页面内的坐标相反).例如,单击客户区域左上角将始终显示clientX值为0的鼠标事件,无论页面是否水平滚动." + "!doc": + "返回事件发生的应用程序客户区域内的水平坐标(与页面内的坐标相反).例如,单击客户区域左上角将始终显示clientX值为0的鼠标事件,无论页面是否水平滚动.", }, - "clientY": { + clientY: { "!type": "number", - "!doc": "返回事件发生在应用程序客户区中的垂直坐标(与页面中的坐标相反).例如,单击客户区左上角将始终显示不管页面是否垂直滚动,clientY值为0的鼠标事件." + "!doc": + "返回事件发生在应用程序客户区中的垂直坐标(与页面中的坐标相反).例如,单击客户区左上角将始终显示不管页面是否垂直滚动,clientY值为0的鼠标事件.", }, - "keyCode": { + keyCode: { "!type": "number", - "!doc": "返回按键事件中的非字符键或任何其他类型的键盘事件中的任何键的Unicode值.", + "!doc": + "返回按键事件中的非字符键或任何其他类型的键盘事件中的任何键的Unicode值.", }, - "charCode": { + charCode: { "!type": "number", - "!doc": "返回在按键事件期间按下的字符键的Unicode值." + "!doc": "返回在按键事件期间按下的字符键的Unicode值.", }, - "which": { + which: { "!type": "number", - "!doc": "返回所按下键的数字keyCode或所按下字母数字键的字符代码(charCode)." + "!doc": + "返回所按下键的数字keyCode或所按下字母数字键的字符代码(charCode).", }, - "button": { + button: { "!type": "number", - "!doc": "指示导致事件的鼠标按钮." + "!doc": "指示导致事件的鼠标按钮.", }, - "shiftKey": { + shiftKey: { "!type": "bool", "!doc": "指示事件触发时是否按下SHIFT键.", }, - "ctrlKey": { + ctrlKey: { "!type": "bool", "!doc": "指示事件触发时是否按下了CTRL键.", }, - "altKey": { + altKey: { "!type": "bool", "!doc": "指示事件触发时是否按下ALT键.", - } - } + }, + }, }, - "Storage": { - "length": { + Storage: { + length: { "!type": "number", - "!doc": "存储接口的length只读属性返回一个整数,该整数表示存储在存储对象中的数据项的数量.", + "!doc": + "存储接口的length只读属性返回一个整数,该整数表示存储在存储对象中的数据项的数量.", }, - "setItem": { + setItem: { "!type": "fn(name: string, value: string)", - "!doc": "存储接口的setItem()方法在传递键名称和值时,会将该键添加到存储中,或者更新该键的值(如果已存在).", + "!doc": + "存储接口的setItem()方法在传递键名称和值时,会将该键添加到存储中,或者更新该键的值(如果已存在).", }, - "getItem": { + getItem: { "!type": "fn(name: string) -> string", "!doc": "存储接口的getItem()方法在传递键名时将返回该键的值.", }, - "key": { + key: { "!type": "fn(index: number) -> string", - "!doc": "存储接口的key()方法传递数字n时,返回存储中第n个键的名称.键的顺序是用户代理定义的,因此您不应依赖它." + "!doc": + "存储接口的key()方法传递数字n时,返回存储中第n个键的名称.键的顺序是用户代理定义的,因此您不应依赖它.", }, - "removeItem": { + removeItem: { "!type": "fn(key: string)", "!doc": "存储接口的removeItem()方法在传递了键名后,将从存储中删除该键.", }, - "clear": { + clear: { "!type": "fn()", - "!doc": "存储接口的clear()方法在被调用时将从存储中清空所有键." - } + "!doc": "存储接口的clear()方法在被调用时将从存储中清空所有键.", + }, }, - "localStorage": { + localStorage: { "!type": "Storage", - "!doc": " localStorage属性允许您访问本地存储对象.localStorage与sessionStorage类似.唯一的区别是,虽然存储在localStorage中的数据没有到期时间,但是浏览会话时存储在sessionStorage中的数据将被清除.结束-也就是说,当浏览器关闭时.\ n \ n请注意,存储在localStorage或sessionStorage中的数据特定于页面协议." + "!doc": + " localStorage属性允许您访问本地存储对象.localStorage与sessionStorage类似.唯一的区别是,虽然存储在localStorage中的数据没有到期时间,但是浏览会话时存储在sessionStorage中的数据将被清除.结束-也就是说,当浏览器关闭时. n n请注意,存储在localStorage或sessionStorage中的数据特定于页面协议.", }, - "console": { - "assert": { + console: { + assert: { "!type": "fn(assertion: bool, text: string)", "!doc": "如果断言为false,则将错误消息写入控制台.", }, - "error": { + error: { "!type": "fn(...msg: ?)", "!doc": "将错误消息输出到Web控制台.", }, - "info": { + info: { "!type": "fn(...msg: ?)", "!doc": "将参考消息输出到Web控制台.", }, - "log": { + log: { "!type": "fn(...msg: ?)", "!doc": "将消息输出到Web控制台.", }, - "time": { + time: { "!type": "fn(label: string)", "!doc": "启动计时器,您可以使用该计时器来跟踪操作需要多长时间.", }, - "timeEnd": { + timeEnd: { "!type": "fn(label: string)", "!doc": "停止以前通过调用console.time()启动的计时器.", }, - "trace": { + trace: { "!type": "fn()", "!doc": "将堆栈跟踪输出到Web控制台.", }, - "warn": { + warn: { "!type": "fn(...msg: ?)", "!doc": "将警告消息输出到Web控制台.", }, - "!doc": "控制台对象提供对浏览器调试控制台的访问.其工作方式的细节因浏览器而异,但实际上提供了一组事实上的功能.", + "!doc": + "控制台对象提供对浏览器调试控制台的访问.其工作方式的细节因浏览器而异,但实际上提供了一组事实上的功能.", }, - "window": { + window: { "!type": "", "!doc": "窗口对象代表一个包含DOM文档的窗口.", }, - "self": { + self: { "!type": "", "!doc": "将对象引用返回到窗口对象.", }, - "devicePixelRatio": "number", - "requestAnimationFrame": { + devicePixelRatio: "number", + requestAnimationFrame: { "!type": "fn(callback: fn(timestamp: number)) -> number", - "!doc": " Window.requestAnimationFrame()方法告诉浏览器您希望执行动画,并请求浏览器在下一次重绘之前调用指定的函数来更新动画.该方法将回调作为参数在重新粉刷之前被调用." + "!doc": + " Window.requestAnimationFrame()方法告诉浏览器您希望执行动画,并请求浏览器在下一次重绘之前调用指定的函数来更新动画.该方法将回调作为参数在重新粉刷之前被调用.", }, - "cancelAnimationFrame": { + cancelAnimationFrame: { "!type": "fn(number)n", "!doc": "取消先前安排的动画帧请求.", }, - "alert": { + alert: { "!type": "fn(message: string)", - "!doc": "显示具有指定内容和确定按钮的警报对话框." + "!doc": "显示具有指定内容和确定按钮的警报对话框.", }, - "confirm": { + confirm: { "!type": "fn(message: string) -> bool", "!doc": "显示带有消息和两个按钮(确定和取消)的模式对话框.", }, - "prompt": { + prompt: { "!type": "fn(message: string, value: string) -> string", "!doc": "显示一个对话框,提示用户输入一些文本.", }, - "setTimeout": { + setTimeout: { "!type": "fn(f: fn(), ms: number) -> number", - "!doc": "在指定的延迟后调用函数或执行代码段." + "!doc": "在指定的延迟后调用函数或执行代码段.", }, - "clearTimeout": { + clearTimeout: { "!type": "fn(timeout: number)", "!doc": "清除window.setTimeout()设置的延迟.", }, - "setInterval": { + setInterval: { "!type": "fn(f: fn(), ms: number) -> number", - "!doc": "反复调用一个函数或执行代码段,每次调用该函数之间有固定的时间延迟.", + "!doc": + "反复调用一个函数或执行代码段,每次调用该函数之间有固定的时间延迟.", }, - "clearInterval": { + clearInterval: { "!type": "fn(interval: number)", "!doc": "取消使用setInterval设置的重复操作.", }, - "atob": { + atob: { "!type": "fn(encoded: string) -> string", - "!doc": "解码使用base-64编码编码的数据字符串." + "!doc": "解码使用base-64编码编码的数据字符串.", }, - "btoa": { + btoa: { "!type": "fn(data: string) -> string", "!doc": "从一串二进制数据创建一个base-64编码的ASCII字符串.", }, - "getComputedStyle": { + getComputedStyle: { "!type": "fn(node: +Element, pseudo?: string) -> Element.prototype.style", "!doc": "给出元素的所有CSS属性的最终使用值.", }, - "CanvasRenderingContext2D": { - "canvas": "+Element", - "width": "number", - "height": "number", - "commit": "fn()", - "save": "fn()", - "restore": "fn()", - "currentTransform": "?", - "scale": "fn(x: number, y: number)", - "rotate": "fn(angle: number)", - "translate": "fn(x: number, y: number)", - "transform": "fn(a: number, b: number, c: number, d: number, e: number, f: number)", - "setTransform": "fn(a: number, b: number, c: number, d: number, e: number, f: number)", - "resetTransform": "fn()", - "globalAlpha": "number", - "globalCompositeOperation": "string", - "imageSmoothingEnabled": "bool", - "strokeStyle": "string", - "fillStyle": "string", - "createLinearGradient": "fn(x0: number, y0: number, x1: number, y1: number) -> ?", - "createPattern": "fn(image: ?, repetition: string) -> ?", - "shadowOffsetX": "number", - "shadowOffsetY": "number", - "shadowBlur": "number", - "shadowColor": "string", - "clearRect": "fn(x: number, y: number, w: number, h: number)", - "fillRect": "fn(x: number, y: number, w: number, h: number)", - "strokeRect": "fn(x: number, y: number, w: number, h: number)", - "fillRule": "string", - "fill": "fn()", - "beginPath": "fn()", - "stroke": "fn()", - "clip": "fn()", - "resetClip": "fn()", - "fillText": "fn(text: string, x: number, y: number, maxWidth: number)", - "strokeText": "fn(text: string, x: number, y: number, maxWidth: number)", - "measureText": "fn(text: string) -> ?", - "drawImage": "fn(image: ?, dx: number, dy: number)", - "createImageData": "fn(sw: number, sh: number) -> ?", - "getImageData": "fn(sx: number, sy: number, sw: number, sh: number) -> ?", - "putImageData": "fn(imagedata: ?, dx: number, dy: number)", - "lineWidth": "number", - "lineCap": "string", - "lineJoin": "string", - "miterLimit": "number", - "setLineDash": "fn(segments: [number])", - "getLineDash": "fn() -> [number]", - "lineDashOffset": "number", - "font": "string", - "textAlign": "string", - "textBaseline": "string", - "direction": "string", - "closePath": "fn()", - "moveTo": "fn(x: number, y: number)", - "lineTo": "fn(x: number, y: number)", - "quadraticCurveTo": "fn(cpx: number, cpy: number, x: number, y: number)", - "bezierCurveTo": "fn(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number)", - "arcTo": "fn(x1: number, y1: number, x2: number, y2: number, radius: number)", - "rect": "fn(x: number, y: number, w: number, h: number)", - "arc": "fn(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: bool)", - "ellipse": "fn(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise: bool)" - } + CanvasRenderingContext2D: { + canvas: "+Element", + width: "number", + height: "number", + commit: "fn()", + save: "fn()", + restore: "fn()", + currentTransform: "?", + scale: "fn(x: number, y: number)", + rotate: "fn(angle: number)", + translate: "fn(x: number, y: number)", + transform: + "fn(a: number, b: number, c: number, d: number, e: number, f: number)", + setTransform: + "fn(a: number, b: number, c: number, d: number, e: number, f: number)", + resetTransform: "fn()", + globalAlpha: "number", + globalCompositeOperation: "string", + imageSmoothingEnabled: "bool", + strokeStyle: "string", + fillStyle: "string", + createLinearGradient: + "fn(x0: number, y0: number, x1: number, y1: number) -> ?", + createPattern: "fn(image: ?, repetition: string) -> ?", + shadowOffsetX: "number", + shadowOffsetY: "number", + shadowBlur: "number", + shadowColor: "string", + clearRect: "fn(x: number, y: number, w: number, h: number)", + fillRect: "fn(x: number, y: number, w: number, h: number)", + strokeRect: "fn(x: number, y: number, w: number, h: number)", + fillRule: "string", + fill: "fn()", + beginPath: "fn()", + stroke: "fn()", + clip: "fn()", + resetClip: "fn()", + fillText: "fn(text: string, x: number, y: number, maxWidth: number)", + strokeText: "fn(text: string, x: number, y: number, maxWidth: number)", + measureText: "fn(text: string) -> ?", + drawImage: "fn(image: ?, dx: number, dy: number)", + createImageData: "fn(sw: number, sh: number) -> ?", + getImageData: "fn(sx: number, sy: number, sw: number, sh: number) -> ?", + putImageData: "fn(imagedata: ?, dx: number, dy: number)", + lineWidth: "number", + lineCap: "string", + lineJoin: "string", + miterLimit: "number", + setLineDash: "fn(segments: [number])", + getLineDash: "fn() -> [number]", + lineDashOffset: "number", + font: "string", + textAlign: "string", + textBaseline: "string", + direction: "string", + closePath: "fn()", + moveTo: "fn(x: number, y: number)", + lineTo: "fn(x: number, y: number)", + quadraticCurveTo: "fn(cpx: number, cpy: number, x: number, y: number)", + bezierCurveTo: + "fn(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number)", + arcTo: + "fn(x1: number, y1: number, x2: number, y2: number, radius: number)", + rect: "fn(x: number, y: number, w: number, h: number)", + arc: "fn(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: bool)", + ellipse: + "fn(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise: bool)", + }, }, { "!name": "ecmascript", - "Infinity": { + Infinity: { "!type": "number", - "!doc": "代表无穷大的数值." + "!doc": "代表无穷大的数值.", }, - "undefined": { + undefined: { "!type": "?", "!doc": "该值未定义.", }, - "NaN": { + NaN: { "!type": "number", - "!doc": "代表非数字的值." + "!doc": "代表非数字的值.", }, - "Object": { + Object: { "!type": "fn()", - "create": { + create: { "!type": "fn(proto: ?) -> !custom:Object_create", "!doc": "使用指定的原型对象和属性创建一个新对象.", }, - "defineProperty": { - "!type": "fn(obj: ?, prop: string, desc: propertyDescriptor) -> !custom:Object_defineProperty", - "!doc": "直接在对象上定义新属性,或修改对象上的现有属性,然后返回对象.如果想了解如何将Object.defineProperty方法与类似二进制标志的语法一起使用,请参阅本文." + defineProperty: { + "!type": + "fn(obj: ?, prop: string, desc: propertyDescriptor) -> !custom:Object_defineProperty", + "!doc": + "直接在对象上定义新属性,或修改对象上的现有属性,然后返回对象.如果想了解如何将Object.defineProperty方法与类似二进制标志的语法一起使用,请参阅本文.", }, - "keys": { + keys: { "!type": "fn(obj: ?) -> [string]", - "!doc": "返回一个给定对象自己的可枚举属性的数组,其顺序与for-in循环所提供的顺序相同(不同之处在于for-in循环也枚举了原型链中的属性). " + "!doc": + "返回一个给定对象自己的可枚举属性的数组,其顺序与for-in循环所提供的顺序相同(不同之处在于for-in循环也枚举了原型链中的属性). ", }, - "assign": { + assign: { "!type": "fn(target: ?, source: ?, source?: ?) -> !0", "!effects": ["copy !1 !0", "copy !2 !0", "copy !3 !0"], - "!doc": " Object.assign()方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象.它将返回目标对象.,", + "!doc": + " Object.assign()方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象.它将返回目标对象.,", }, - "prototype": { + prototype: { "!stdProto": "Object", - "toString": { + toString: { "!type": "fn() -> string", - "!doc": "返回表示对象的字符串." + "!doc": "返回表示对象的字符串.", }, - "hasOwnProperty": { + hasOwnProperty: { "!type": "fn(prop: string) -> bool", "!doc": "返回一个布尔值,指示对象是否具有指定的属性.", - } + }, }, }, - "Function": { + Function: { "!type": "fn(body: string) -> fn()", - "prototype": { + prototype: { "!stdProto": "Function", - "apply": { + apply: { "!type": "fn(this: ?, args: [?])", - "!effects": [ - "call and return !this this=!0 !1. !1. !1." - ], - "!doc": "调用具有给定值的函数,并以数组(或类似对象的数组)形式提供参数.", + "!effects": ["call and return !this this=!0 !1. !1. !1."], + "!doc": + "调用具有给定值的函数,并以数组(或类似对象的数组)形式提供参数.", }, - "call": { + call: { "!type": "fn(this: ?, args?: ?) -> !this.!ret", - "!effects": [ - "call and return !this this=!0 !1 !2 !3 !4" - ], + "!effects": ["call and return !this this=!0 !1 !2 !3 !4"], "!doc": "调用具有给定值和单独提供的参数的函数.", }, - "bind": { + bind: { "!type": "fn(this: ?, args?: ?) -> !custom:Function_bind", - "!doc": "创建一个新函数,该函数在被调用时将其this关键字设置为提供的值,并在调用新函数时提供给定的参数序列.", + "!doc": + "创建一个新函数,该函数在被调用时将其this关键字设置为提供的值,并在调用新函数时提供给定的参数序列.", }, - "prototype": "?" + prototype: "?", }, }, - "Array": { + Array: { "!type": "fn(size: number) -> !custom:Array_ctor", - "isArray": { + isArray: { "!type": "fn(value: ?) -> bool", "!doc": "如果对象是数组,则返回true,否则返回false.", }, - "from": { - "!type": "fn(arrayLike: ?, mapFn?: fn(elt: ?, i: number) -> ?, thisArg?: ?) -> [!0.]", - "!effects": [ - "call !1 this=!2 !0. number" - ], - "!doc": " Array.from()方法从类似数组或可迭代的对象创建一个新的Array实例.,", + from: { + "!type": + "fn(arrayLike: ?, mapFn?: fn(elt: ?, i: number) -> ?, thisArg?: ?) -> [!0.]", + "!effects": ["call !1 this=!2 !0. number"], + "!doc": + " Array.from()方法从类似数组或可迭代的对象创建一个新的Array实例.,", }, - "of": { + of: { "!type": "fn(elementN: ?) -> [!0]", - "!doc": " Array.of()方法创建一个新的Array实例,该实例具有可变数量的参数,而不考虑参数的数量或类型.,", + "!doc": + " Array.of()方法创建一个新的Array实例,该实例具有可变数量的参数,而不考虑参数的数量或类型.,", }, - "prototype": { + prototype: { "!stdProto": "Array", - "length": { + length: { "!type": "number", "!doc": "一个无符号的32位整数,指定数组中的元素数.", }, - "concat": { + concat: { "!type": "fn(other: [?]) -> !this", "!doc": "返回一个新数组,该数组由该数组与其他数组和/或值组成.", }, - "join": { + join: { "!type": "fn(separator?: string) -> string", - "!doc": "将数组的所有元素连接到字符串中." + "!doc": "将数组的所有元素连接到字符串中.", }, - "splice": { + splice: { "!type": "fn(pos: number, amount: number, newelt?: ?) -> [?]", "!doc": "更改数组的内容,在删除旧元素的同时添加新元素.", }, - "pop": { + pop: { "!type": "fn() -> !this.", "!doc": "从数组中删除最后一个元素并返回该元素.", }, - "push": { + push: { "!type": "fn(newelt: ?) -> number", - "!effects": [ - "propagate !0 !this." - ], + "!effects": ["propagate !0 !this."], "!doc": "通过添加给定元素并返回数组的新长度来更改数组.", }, - "shift": { + shift: { "!type": "fn() -> !this.", "!doc": "从数组中删除第一个元素并返回该元素.此方法更改数组的长度.", }, - "unshift": { + unshift: { "!type": "fn(newelt: ?) -> number", - "!effects": [ - "propagate !0 !this." - ], + "!effects": ["propagate !0 !this."], "!doc": "将一个或多个元素添加到数组的开头,并返回数组的新长度.", }, - "slice": { + slice: { "!type": "fn(from?: number, to?: number) -> !this", - "!doc": "返回数组一部分的浅表副本." + "!doc": "返回数组一部分的浅表副本.", }, - "reverse": { + reverse: { "!type": "fn()", - "!doc": "就地反转数组.第一个数组元素变为最后一个,而最后一个数组变为第一个.", + "!doc": + "就地反转数组.第一个数组元素变为最后一个,而最后一个数组变为第一个.", }, - "sort": { + sort: { "!type": "fn(compare?: fn(a: ?, b: ?) -> number)", - "!effects": [ - "call !0 !this. !this." - ], - "!doc": "将数组中的元素排序并返回数组." + "!effects": ["call !0 !this. !this."], + "!doc": "将数组中的元素排序并返回数组.", }, - "indexOf": { + indexOf: { "!type": "fn(elt: ?, from?: number) -> number", - "!doc": "返回在数组中可以找到给定元素的第一个索引;如果不存在,则返回-1.", + "!doc": + "返回在数组中可以找到给定元素的第一个索引;如果不存在,则返回-1.", }, - "lastIndexOf": { + lastIndexOf: { "!type": "fn(elt: ?, from?: number) -> number", - "!doc": "返回在数组中找到给定元素的最后一个索引,如果不存在则返回-1.从fromIndex开始向后搜索数组.", + "!doc": + "返回在数组中找到给定元素的最后一个索引,如果不存在则返回-1.从fromIndex开始向后搜索数组.", }, - "filter": { - "!type": "fn(test: fn(elt: ?, i: number, array: +Array) -> bool, context?: ?) -> !this", - "!effects": [ - "call !0 this=!1 !this. number !this" - ], + filter: { + "!type": + "fn(test: fn(elt: ?, i: number, array: +Array) -> bool, context?: ?) -> !this", + "!effects": ["call !0 this=!1 !this. number !this"], "!doc": "创建一个新数组,其中包含所有通过提供的功能实现的测试的元素.", }, - "forEach": { + forEach: { "!type": "fn(f: fn(elt: ?, i: number, array: +Array), context?: ?)", - "!effects": [ - "call !0 this=!1 !this. number !this" - ], - "!doc": "每个数组元素执行一次提供的功能." + "!effects": ["call !0 this=!1 !this. number !this"], + "!doc": "每个数组元素执行一次提供的功能.", }, - "map": { - "!type": "fn(f: fn(elt: ?, i: number, array: +Array) -> ?, context?: ?) -> [!0.!ret]", - "!effects": [ - "call !0 this=!1 !this. number !this" - ], + map: { + "!type": + "fn(f: fn(elt: ?, i: number, array: +Array) -> ?, context?: ?) -> [!0.!ret]", + "!effects": ["call !0 this=!1 !this. number !this"], "!doc": "创建一个新数组,其结果是对该数组中的每个元素调用提供的函数.", }, - "reduce": { - "!type": "fn(combine: fn(sum: ?, elt: ?, i: number, array: +Array) -> ?, init?: ?) -> !0.!ret", - "!effects": [ - "call !0 !1 !this. number !this" - ], - "!doc": "对一个累加器和数组的每个值(从左到右)应用一个函数,以将其减小为单个值.", + reduce: { + "!type": + "fn(combine: fn(sum: ?, elt: ?, i: number, array: +Array) -> ?, init?: ?) -> !0.!ret", + "!effects": ["call !0 !1 !this. number !this"], + "!doc": + "对一个累加器和数组的每个值(从左到右)应用一个函数,以将其减小为单个值.", }, - "fill": { + fill: { "!type": "fn(value: ?, start?: number, end?: number) -> !this", - "!doc": " fill()方法使用静态值填充数组的所有元素,从开始索引到结束索引.,", + "!doc": + " fill()方法使用静态值填充数组的所有元素,从开始索引到结束索引.,", }, - "find": { - "!type": "fn(callback: fn(element: ?, index: number, array: [?]) -> bool, thisArg?: ?) -> !this.", + find: { + "!type": + "fn(callback: fn(element: ?, index: number, array: [?]) -> bool, thisArg?: ?) -> !this.", "!effects": ["call !0 this=!2 !this. number"], - "!doc": "如果数组中的元素满足提供的测试功能,则find()方法将在数组中返回一个值.否则,返回undefined.,", + "!doc": + "如果数组中的元素满足提供的测试功能,则find()方法将在数组中返回一个值.否则,返回undefined.,", }, - "findIndex": { - "!type": "fn(callback: fn(element: ?, index: number, array: [?]), thisArg?: ?) -> number", + findIndex: { + "!type": + "fn(callback: fn(element: ?, index: number, array: [?]), thisArg?: ?) -> number", "!effects": ["call !0 this=!2 !this. number"], - "!doc": "如果数组中的元素满足提供的测试功能,则findIndex()方法将返回数组中的索引.否则返回-1.,", + "!doc": + "如果数组中的元素满足提供的测试功能,则findIndex()方法将返回数组中的索引.否则返回-1.,", }, - "keys": { + keys: { "!type": "fn() -> +iter[:t=number]", - "!doc": " keys()方法返回一个新的数组迭代器,其中包含数组中每个索引的键.,", + "!doc": + " keys()方法返回一个新的数组迭代器,其中包含数组中每个索引的键.,", }, - "values": { + values: { "!type": "fn() -> +iter[:t=!this.]", - "!doc": " values()方法返回一个新的Array Iterator对象,该对象包含数组中每个索引的值.,", + "!doc": + " values()方法返回一个新的Array Iterator对象,该对象包含数组中每个索引的值.,", }, - "includes": { + includes: { "!type": "fn(value: ?, fromIndex?: number) -> bool", "!doc": "确定数组是否包含某个元素,并根据需要返回true或false.,", - } + }, }, }, - "String": { + String: { "!type": "fn(value: ?) -> string", - "prototype": { + prototype: { "!stdProto": "String", - "length": { + length: { "!type": "number", - "!doc": "表示字符串的长度." + "!doc": "表示字符串的长度.", }, "": "string", - "charAt": { + charAt: { "!type": "fn(i: number) -> string", "!doc": "从字符串中返回指定的字符.", }, - "charCodeAt": { + charCodeAt: { "!type": "fn(i: number) -> number", - "!doc": "返回给定索引处字符的数字Unicode值(Unicode代码点> 0x10000除外).", + "!doc": + "返回给定索引处字符的数字Unicode值(Unicode代码点> 0x10000除外).", }, - "indexOf": { + indexOf: { "!type": "fn(char: string, from?: number) -> number", - "!doc": "返回指定值首次出现的调用String对象中的索引,从fromIndex开始搜索,\ n如果未找到该值,则返回-1.", + "!doc": + "返回指定值首次出现的调用String对象中的索引,从fromIndex开始搜索, n如果未找到该值,则返回-1.", }, - "lastIndexOf": { + lastIndexOf: { "!type": "fn(char: string, from?: number) -> number", - "!doc": "返回指定值最后一次出现的调用String对象内的索引,如果未找到则返回-1.从fromIndex开始向后搜索调用字符串.", + "!doc": + "返回指定值最后一次出现的调用String对象内的索引,如果未找到则返回-1.从fromIndex开始向后搜索调用字符串.", }, - "substring": { + substring: { "!type": "fn(from: number, to?: number) -> string", - "!doc": "返回一个索引与另一个索引之间或字符串末尾的字符串子集.
from为起始位置,to为终止位置.", + "!doc": + "返回一个索引与另一个索引之间或字符串末尾的字符串子集.
from为起始位置,to为终止位置.", }, - "substr": { + substr: { "!type": "fn(from: number, length?: number) -> string", - "!doc": "以指定的字符数返回从指定位置开始的字符串中的字符.
from为起始位置,length为长度", + "!doc": + "以指定的字符数返回从指定位置开始的字符串中的字符.
from为起始位置,length为长度", }, - "slice": { + slice: { "!type": "fn(from: number, to?: number) -> string", "!doc": "提取字符串的一部分并返回新的字符串.", }, - "padStart": { + padStart: { "!type": "fn(targetLength: number, padString?: string) -> string", - "!doc": "用另一个字符串(如果需要,重复)填充当前字符串,以使结果字符串达到给定的长度.", + "!doc": + "用另一个字符串(如果需要,重复)填充当前字符串,以使结果字符串达到给定的长度.", }, - "padEnd": { + padEnd: { "!type": "fn(targetLength: number, padString?: string) -> string", - "!doc": "用给定的字符串(如果需要,重复)填充当前字符串,以使结果字符串达到给定的长度.", + "!doc": + "用给定的字符串(如果需要,重复)填充当前字符串,以使结果字符串达到给定的长度.", }, - "trim": { + trim: { "!type": "fn() -> string", "!doc": "从字符串的两端删除空格.", }, - "trimStart": { + trimStart: { "!type": "fn() -> string", "!doc": "从字符串的开头删除空格.", }, - "trimEnd": { + trimEnd: { "!type": "fn() -> string", "!doc": "从字符串末尾删除空格.", }, - "toUpperCase": { + toUpperCase: { "!type": "fn() -> string", - "!doc": "返回转换为大写的调用字符串值." + "!doc": "返回转换为大写的调用字符串值.", }, - "toLowerCase": { + toLowerCase: { "!type": "fn() -> string", - "!doc": "返回转换为小写的调用字符串值." + "!doc": "返回转换为小写的调用字符串值.", }, - "split": { + split: { "!type": "fn(pattern?: string|+RegExp, limit?: number) -> [string]", "!doc": "通过将字符串分成子字符串,将String对象拆分为字符串数组.", }, - "concat": { + concat: { "!type": "fn(other: string) -> string", - "!doc": "将两个或多个字符串的文本合并,并返回一个新字符串." + "!doc": "将两个或多个字符串的文本合并,并返回一个新字符串.", }, - "match": { + match: { "!type": "fn(pattern: +RegExp) -> [string]", "!doc": "用于将字符串与正则表达式匹配时用于检索匹配.", }, - "replace": { + replace: { "!type": "fn(pattern: string|+RegExp, replacement: string) -> string", - "!doc": "返回一个新字符串,该字符串的某个或所有匹配项都由替换项替换.该模式可以是字符串或RegExp,并且替换项可以是字符串或每个匹配项将调用的函数. " + "!doc": + "返回一个新字符串,该字符串的某个或所有匹配项都由替换项替换.该模式可以是字符串或RegExp,并且替换项可以是字符串或每个匹配项将调用的函数. ", }, - "endsWith": { + endsWith: { "!type": "fn(searchString: string, position?: number) -> bool", - "!doc": " endsWith()方法确定一个字符串是否以另一个字符串的字符结尾,并根据需要返回true或false.,", + "!doc": + " endsWith()方法确定一个字符串是否以另一个字符串的字符结尾,并根据需要返回true或false.,", }, - "startsWith": { + startsWith: { "!type": "fn(searchString: string, position?: number) -> bool", - "!doc": " startsWith()方法确定一个字符串是否以另一个字符串的字符开头,并根据需要返回true或false.,", - } + "!doc": + " startsWith()方法确定一个字符串是否以另一个字符串的字符开头,并根据需要返回true或false.,", + }, }, }, - "Number": { + Number: { "!type": "fn(value: ?) -> number", - "MAX_VALUE": { + MAX_VALUE: { "!type": "number", - "!doc": " JavaScript中可表示的最大数值." + "!doc": " JavaScript中可表示的最大数值.", }, - "MIN_VALUE": { + MIN_VALUE: { "!type": "number", - "!doc": " JavaScript中可表示的最小正数值." + "!doc": " JavaScript中可表示的最小正数值.", }, - "POSITIVE_INFINITY": { + POSITIVE_INFINITY: { "!type": "number", - "!doc": "代表正无穷大值的值." + "!doc": "代表正无穷大值的值.", }, - "NEGATIVE_INFINITY": { + NEGATIVE_INFINITY: { "!type": "number", - "!doc": "代表负无穷大值的值." + "!doc": "代表负无穷大值的值.", }, - "prototype": { + prototype: { "!stdProto": "Number", - "toString": { + toString: { "!type": "fn(radix?: number) -> string", - "!doc": "返回代表指定Number对象的字符串" + "!doc": "返回代表指定Number对象的字符串", }, - "toFixed": { + toFixed: { "!type": "fn(digits: number) -> string", - "!doc": "使用定点符号格式化数字" + "!doc": "使用定点符号格式化数字", }, - "toExponential": { + toExponential: { "!type": "fn(digits: number) -> string", - "!doc": "返回以指数表示形式表示Number对象的字符串" + "!doc": "返回以指数表示形式表示Number对象的字符串", }, - "toPrecision": { + toPrecision: { "!type": "fn(digits: number) -> string", "!doc": " toPrecision()方法返回一个字符串,该数字表示指定精度的数字.", - } + }, }, - "EPSILON": { + EPSILON: { "!type": "number", - "!doc": " Number.EPSILON属性表示一个数值与可以表示为Number的最小值之间的差异.,", + "!doc": + " Number.EPSILON属性表示一个数值与可以表示为Number的最小值之间的差异.,", }, - "MAX_SAFE_INTEGER": { + MAX_SAFE_INTEGER: { "!type": "number", - "!doc": " Number.MAX_SAFE_INTEGER常量表示JavaScript中的最大安全整数(2 ^ 53-1).,", + "!doc": + " Number.MAX_SAFE_INTEGER常量表示JavaScript中的最大安全整数(2 ^ 53-1).,", }, - "MIN_SAFE_INTEGER": { + MIN_SAFE_INTEGER: { "!type": "number", - "!doc": " Number.MIN_SAFE_INTEGER常量表示JavaScript(-(2 ^ 53-1))中的最小安全整数.,", + "!doc": + " Number.MIN_SAFE_INTEGER常量表示JavaScript(-(2 ^ 53-1))中的最小安全整数.,", }, - "isFinite": { + isFinite: { "!type": "fn(testValue: ?) -> bool", "!doc": " Number.isFinite()方法确定传递的值是否为有限值.,", }, - "isInteger": { + isInteger: { "!type": "fn(testValue: ?) -> bool", "!doc": " Number.isInteger()方法确定传递的值是否为整数.,", }, - "isNaN": { + isNaN: { "!type": "fn(testValue: ?) -> bool", - "!doc": " Number.isNaN()方法确定传递的值是否为NaN.原始全局isNaN()的更可靠的版本.,", + "!doc": + " Number.isNaN()方法确定传递的值是否为NaN.原始全局isNaN()的更可靠的版本.,", }, - "isSafeInteger": { + isSafeInteger: { "!type": "fn(testValue: ?) -> bool", - "!doc": " Number.isSafeInteger()方法确定所提供的值是否是一个安全整数的数字.安全整数是该数字的整数.", + "!doc": + " Number.isSafeInteger()方法确定所提供的值是否是一个安全整数的数字.安全整数是该数字的整数.", }, - "parseFloat": { + parseFloat: { "!type": "fn(string: string) -> number", "!doc": " Number.parseFloat()方法解析字符串参数并返回浮点数.,", }, - "parseInt": { + parseInt: { "!type": "fn(string: string, radix?: number) -> number", - "!doc": " Number.parseInt()方法解析字符串参数并返回指定基数或基数的整数.,", + "!doc": + " Number.parseInt()方法解析字符串参数并返回指定基数或基数的整数.,", }, }, - "Boolean": { + Boolean: { "!type": "fn(value: ?) -> bool", - "prototype": { - "!stdProto": "Boolean" + prototype: { + "!stdProto": "Boolean", }, }, - "abstract": "?", - "arguments": "?", - "boolean": "?", - "break": "?", - "byte": "?", - "case": "?", - "catch": "?", - "char": "?", - "const": "?", - "continue": "?", - "debugger": "?", - "default": "?", - "delete": "?", - "do": "?", - "double": "?", - "else": "?", - "eval": "?", - "false": "bool", - "final": "?", - "finally": "?", - "float": "?", - "for": "?", - "function": "?", - "goto": "?", - "if": "?", - "implements": "?", - "in": "?", - "instanceof": "?", - "int": "?", - "interface": "?", - "long": "?", - "native": "?", - "new": "?", - "null": "?", - "package": "?", - "private": "?", - "protected": "?", - "public": "?", - "return": "?", - "short": "?", - "static": "?", - "switch": "?", - "synchronized": "?", - "this": "?", - "throw": "?", - "throws": "?", - "transient": "?", - "true": "bool", - "try": "?", - "typeof": "?", - "var": "?", - "void": "?", - "volatile": "?", - "while": "?", - "with": "?", - "yield": "?", - "RegExp": { + abstract: "?", + arguments: "?", + boolean: "?", + break: "?", + byte: "?", + case: "?", + catch: "?", + char: "?", + const: "?", + continue: "?", + debugger: "?", + default: "?", + delete: "?", + do: "?", + double: "?", + else: "?", + eval: "?", + false: "bool", + final: "?", + finally: "?", + float: "?", + for: "?", + function: "?", + goto: "?", + if: "?", + implements: "?", + in: "?", + instanceof: "?", + int: "?", + interface: "?", + long: "?", + native: "?", + new: "?", + null: "?", + package: "?", + private: "?", + protected: "?", + public: "?", + return: "?", + short: "?", + static: "?", + switch: "?", + synchronized: "?", + this: "?", + throw: "?", + throws: "?", + transient: "?", + true: "bool", + try: "?", + typeof: "?", + var: "?", + void: "?", + volatile: "?", + while: "?", + with: "?", + yield: "?", + RegExp: { "!type": "fn(source: string, flags?: string)", - "prototype": { + prototype: { "!stdProto": "RegExp", - "exec": { + exec: { "!type": "fn(input: string) -> [string]", "!doc": "搜索指定字符串中的匹配项.返回结果数组,或者为null.", }, - "test": { + test: { "!type": "fn(input: string) -> bool", "!doc": "执行正则表达式和指定字符串之间的匹配搜索.返回true或false.", - } + }, }, "!doc": "创建正则表达式对象以将文本与模式匹配.", }, - "parseInt": { + parseInt: { "!type": "fn(string: string, radix?: number) -> number", - "!doc": "解析字符串参数并返回指定基数或基数的整数." + "!doc": "解析字符串参数并返回指定基数或基数的整数.", }, - "parseFloat": { + parseFloat: { "!type": "fn(string: string) -> number", - "!doc": "解析字符串参数并返回浮点数." + "!doc": "解析字符串参数并返回浮点数.", }, - "isNaN": { + isNaN: { "!type": "fn(value: number) -> bool", - "!doc": "确定值是否为NaN.请注意,此函数已损坏.您可能对ECMAScript 6 Number.isNaN感兴趣.", + "!doc": + "确定值是否为NaN.请注意,此函数已损坏.您可能对ECMAScript 6 Number.isNaN感兴趣.", }, - "isFinite": { + isFinite: { "!type": "fn(value: number) -> bool", - "!doc": "确定传递的值是否为有限数字." + "!doc": "确定传递的值是否为有限数字.", }, - "eval": { + eval: { "!type": "fn(code: string) -> ?", - "!doc": "评估以字符串形式表示的JavaScript代码." + "!doc": "评估以字符串形式表示的JavaScript代码.", }, - "encodeURI": { + encodeURI: { "!type": "fn(uri: string) -> string", - "!doc": "通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例来编码统一资源标识符(URI)(对于字符而言将仅是四个转义序列由两个\"代理\"字符组成).", + "!doc": + '通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例来编码统一资源标识符(URI)(对于字符而言将仅是四个转义序列由两个"代理"字符组成).', }, - "encodeURIComponent": { + encodeURIComponent: { "!type": "fn(uri: string) -> string", - "!doc": "通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例来编码统一资源标识符(URI)组件(对于由两个\"代理\"字符组成的字符).", + "!doc": + '通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例来编码统一资源标识符(URI)组件(对于由两个"代理"字符组成的字符).', }, - "decodeURI": { + decodeURI: { "!type": "fn(uri: string) -> string", "!doc": "解码以前由encodeURI或类似例程创建的统一资源标识符(URI).", }, - "decodeURIComponent": { + decodeURIComponent: { "!type": "fn(uri: string) -> string", - "!doc": "解码以前由encodeURIComponent或类似例程创建的统一资源标识符(URI)组件.", + "!doc": + "解码以前由encodeURIComponent或类似例程创建的统一资源标识符(URI)组件.", }, - "Math": { - "E": { + Math: { + E: { "!type": "number", - "!doc": "自然对数的底数,e约为2.718." + "!doc": "自然对数的底数,e约为2.718.", }, - "LN2": { + LN2: { "!type": "number", - "!doc": " 2的自然对数,大约为0.693." + "!doc": " 2的自然对数,大约为0.693.", }, - "LN10": { + LN10: { "!type": "number", - "!doc": " 10的自然对数,大约为2.302." + "!doc": " 10的自然对数,大约为2.302.", }, - "LOG2E": { + LOG2E: { "!type": "number", "!doc": " E的以2为底的对数(大约1.442).", }, - "LOG10E": { + LOG10E: { "!type": "number", - "!doc": " E的以10为底的对数(约0.434)." + "!doc": " E的以10为底的对数(约0.434).", }, - "SQRT1_2": { + SQRT1_2: { "!type": "number", - "!doc": " 1/2的平方根;等效于2的平方根上的1,大约为0.707." + "!doc": " 1/2的平方根;等效于2的平方根上的1,大约为0.707.", }, - "SQRT2": { + SQRT2: { "!type": "number", - "!doc": " 2的平方根,大约为1.414." + "!doc": " 2的平方根,大约为1.414.", }, - "PI": { + PI: { "!type": "number", - "!doc": "圆的周长与其直径之比,大约为3.14159." + "!doc": "圆的周长与其直径之比,大约为3.14159.", }, - "abs": { + abs: { "!type": "fn(number) -> number", - "!doc": "返回数字的绝对值." + "!doc": "返回数字的绝对值.", }, - "cos": { + cos: { "!type": "fn(number) -> number", - "!doc": "返回数字的余弦." + "!doc": "返回数字的余弦.", }, - "sin": { + sin: { "!type": "fn(number) -> number", - "!doc": "返回数字的正弦." + "!doc": "返回数字的正弦.", }, - "tan": { + tan: { "!type": "fn(number) -> number", - "!doc": "返回数字的正切值." + "!doc": "返回数字的正切值.", }, - "acos": { + acos: { "!type": "fn(number) -> number", - "!doc": "返回数字的反余弦(以弧度为单位)." + "!doc": "返回数字的反余弦(以弧度为单位).", }, - "asin": { + asin: { "!type": "fn(number) -> number", - "!doc": "返回数字的反正弦(以弧度为单位)." + "!doc": "返回数字的反正弦(以弧度为单位).", }, - "atan": { + atan: { "!type": "fn(number) -> number", - "!doc": "返回数字的反正切(以弧度为单位)." + "!doc": "返回数字的反正切(以弧度为单位).", }, - "atan2": { + atan2: { "!type": "fn(y: number, x: number) -> number", - "!doc": "返回其参数商的反正切值." + "!doc": "返回其参数商的反正切值.", }, - "ceil": { + ceil: { "!type": "fn(number) -> number", - "!doc": "返回大于或等于数字的最小整数." + "!doc": "返回大于或等于数字的最小整数.", }, - "floor": { + floor: { "!type": "fn(number) -> number", - "!doc": "返回小于或等于数字的最大整数." + "!doc": "返回小于或等于数字的最大整数.", }, - "round": { + round: { "!type": "fn(number) -> number", - "!doc": "返回四舍五入到最接近整数的数字的值." + "!doc": "返回四舍五入到最接近整数的数字的值.", }, - "exp": { + exp: { "!type": "fn(number) -> number", - "!doc": "返回E ^ x,其中x是自变量,E是欧拉常数,自然对数的底." + "!doc": "返回E ^ x,其中x是自变量,E是欧拉常数,自然对数的底.", }, - "log": { + log: { "!type": "fn(number) -> number", "!doc": "返回数字的自然对数(以E为底).", }, - "sqrt": { + sqrt: { "!type": "fn(number) -> number", - "!doc": "返回数字的平方根." + "!doc": "返回数字的平方根.", }, - "pow": { + pow: { "!type": "fn(number, number) -> number", - "!doc": "将基数返回指数幂,即baseexponent." + "!doc": "将基数返回指数幂,即baseexponent.", }, - "max": { + max: { "!type": "fn(number, number) -> number", - "!doc": "返回零个或多个数字中的最大值." + "!doc": "返回零个或多个数字中的最大值.", }, - "min": { + min: { "!type": "fn(number, number) -> number", - "!doc": "返回零个或多个数字中的最小值." + "!doc": "返回零个或多个数字中的最小值.", }, - "random": { + random: { "!type": "fn() -> number", - "!doc": "返回一个浮点伪随机数,范围为[0,1),即从0(包括)到不包括1(排除),然后您可以缩放到所需的值范围." + "!doc": + "返回一个浮点伪随机数,范围为[0,1),即从0(包括)到不包括1(排除),然后您可以缩放到所需的值范围.", }, - "log10": { + log10: { "!type": "fn(x: number) -> number", "!doc": " Math.log10()函数返回数字的以10为底的对数.", }, - "log2": { + log2: { "!type": "fn(x: number) -> number", "!doc": " Math.log2()函数返回数字的以2为底的对数.", }, - "sign": { + sign: { "!type": "fn(x: number) -> number", "!doc": " Math.sign()函数返回数字的符号,指示数字是正数,负数还是零.,", }, - "trunc": { + trunc: { "!type": "fn(x: number) -> number", - "!doc": " Math.trunc()函数通过删除任何小数位来返回数字的整数部分.它不舍入任何数字.该函数可以用floor()和ceil()函数表示: ,", + "!doc": + " Math.trunc()函数通过删除任何小数位来返回数字的整数部分.它不舍入任何数字.该函数可以用floor()和ceil()函数表示: ,", }, "!doc": "一个内置对象,具有用于数学常数和函数的属性和方法.", }, - "JSON": { - "parse": { - "!type": "fn(json: string, reviver?: fn(key: string, value: ?) -> ?) -> ?", + JSON: { + parse: { + "!type": + "fn(json: string, reviver?: fn(key: string, value: ?) -> ?) -> ?", "!doc": "将字符串解析为JSON,可以选择转换解析产生的值.", }, - "stringify": { - "!type": "fn(value: ?, replacer?: fn(key: string, value: ?) -> ?, space?: string|number) -> string", - "!doc": "将值转换为JSON,如果指定了replacer函数,则可以选择替换值,如果指定了replacer数组,则可以选择仅包括指定的属性.", + stringify: { + "!type": + "fn(value: ?, replacer?: fn(key: string, value: ?) -> ?, space?: string|number) -> string", + "!doc": + "将值转换为JSON,如果指定了replacer函数,则可以选择替换值,如果指定了replacer数组,则可以选择仅包括指定的属性.", }, - "!doc": " JSON(JavaScript对象表示法)是一种数据交换格式.尽管它不是严格的子集,但它非常类似于JavaScript语法的子集.(有关详细信息,请参见JavaScript参考中的JSON.)在编写任何类型的基于JavaScript的应用程序(包括网站和浏览器扩展程序)时非常有用.例如,您可以将JSON格式的用户信息存储在cookie中,或者可以将扩展名首选项以JSON形式存储在字符串值的浏览器首选项中." - } + "!doc": + " JSON(JavaScript对象表示法)是一种数据交换格式.尽管它不是严格的子集,但它非常类似于JavaScript语法的子集.(有关详细信息,请参见JavaScript参考中的JSON.)在编写任何类型的基于JavaScript的应用程序(包括网站和浏览器扩展程序)时非常有用.例如,您可以将JSON格式的用户信息存储在cookie中,或者可以将扩展名首选项以JSON形式存储在字符串值的浏览器首选项中.", + }, }, { "!name": "core", "!define": { - "image": { + image: { "!doc": "图片信息", - "width": "number", - "height": "number", - "src": "string" + width: "number", + height: "number", + src: "string", }, - "audio": { + audio: { "!doc": "音乐音效信息", - "currentTime": "number", - "play": "fn()", - "pause": "fn()", - "paused": "bool", - "duration": "number", - "volume": "number", + currentTime: "number", + play: "fn()", + pause: "fn()", + paused: "bool", + duration: "number", + volume: "number", }, - "flag": { + flag: { "!doc": "当前变量", - "hard": { + hard: { "!type": "number", - "!doc": "当前难度编号" + "!doc": "当前难度编号", }, - "hatred": { + hatred: { "!type": "number", - "!doc": "当前仇恨值" + "!doc": "当前仇恨值", }, - "poison": { + poison: { "!type": "bool", - "!doc": "是否处于中毒状态" + "!doc": "是否处于中毒状态", }, - "weak": { + weak: { "!type": "number", - "!doc": "是否处于衰弱状态" + "!doc": "是否处于衰弱状态", }, - "curse": { + curse: { "!type": "number", - "!doc": "是否处于诅咒状态" + "!doc": "是否处于诅咒状态", }, - "no_zone": { + no_zone: { "!type": "bool", - "!doc": "无视领域伤害" + "!doc": "无视领域伤害", }, - "no_repulse": { + no_repulse: { "!type": "bool", - "!doc": "无视阻击伤害" + "!doc": "无视阻击伤害", }, - "no_lasel": { + no_lasel: { "!type": "bool", - "!doc": "无视激光伤害" + "!doc": "无视激光伤害", }, - "no_ambush": { + no_ambush: { "!type": "bool", - "!doc": "无视捕捉" + "!doc": "无视捕捉", }, - "__bgm__": { + __bgm__: { "!type": "string", - "!doc": "背景音乐" + "!doc": "背景音乐", }, - "__weather__": { - "!doc": "天气" + __weather__: { + "!doc": "天气", }, - "__color__": { - "!doc": "色调" + __color__: { + "!doc": "色调", }, - "__volume__": { + __volume__: { "!type": "number", - "!doc": "音量" + "!doc": "音量", }, - "skill": { + skill: { "!type": "number", - "!doc": "当前开启的技能编号" + "!doc": "当前开启的技能编号", }, - "skillName": { + skillName: { "!type": "string", - "!doc": "当前开启的技能名" + "!doc": "当前开启的技能名", }, - "input": { + input: { "!type": "string|number", - "!doc": "等待用户输入后的存放值" + "!doc": "等待用户输入后的存放值", }, - "type": { + type: { "!type": "number", - "!doc": "等待用户操作后获得的操作类型" + "!doc": "等待用户操作后获得的操作类型", }, - "keycode": { + keycode: { "!type": "number", - "!doc": "等待用户操作后用户按键的键值" + "!doc": "等待用户操作后用户按键的键值", }, - "x": { + x: { "!type": "number", - "!doc": "等待用户操作后用户点击的网格横坐标" + "!doc": "等待用户操作后用户点击的网格横坐标", }, - "y": { + y: { "!type": "number", - "!doc": "等待用户操作后用户点击的网格纵坐标" + "!doc": "等待用户操作后用户点击的网格纵坐标", }, - "px": { + px: { "!type": "number", - "!doc": "等待用户操作后用户点击的像素横坐标" + "!doc": "等待用户操作后用户点击的像素横坐标", }, - "py": { + py: { "!type": "number", - "!doc": "等待用户操作后用户点击的像素纵坐标" + "!doc": "等待用户操作后用户点击的像素纵坐标", }, - "__visited__": { - "!doc": "当前访问过的楼层" + __visited__: { + "!doc": "当前访问过的楼层", }, - "__leaveLoc__": { - "!doc": "每个楼层的离开位置,用于楼传平面塔模式" + __leaveLoc__: { + "!doc": "每个楼层的离开位置,用于楼传平面塔模式", }, - "cannotMoveDirectly": { + cannotMoveDirectly: { "!type": "bool", - "!doc": "当前是否全局不可瞬移" + "!doc": "当前是否全局不可瞬移", }, }, - "hero": { + hero: { "!doc": "勇士当前属性", - "image": { + image: { "!type": "string", - "!doc": "行走图" + "!doc": "行走图", }, - "animate": { + animate: { "!type": "bool", - "!doc": "是否开启帧动画" + "!doc": "是否开启帧动画", }, - "name": { + name: { "!type": "string", - "!doc": "勇士名" + "!doc": "勇士名", }, - "lv": { + lv: { "!type": "number", - "!doc": "勇士等级" + "!doc": "勇士等级", }, - "hpmax": { + hpmax: { "!type": "number", - "!doc": "勇士生命上限" + "!doc": "勇士生命上限", }, - "hp": { + hp: { "!type": "number", - "!doc": "勇士当前生命值" + "!doc": "勇士当前生命值", }, - "atk": { + atk: { "!type": "number", - "!doc": "勇士当前攻击力" + "!doc": "勇士当前攻击力", }, - "def": { + def: { "!type": "number", - "!doc": "勇士当前防御力" + "!doc": "勇士当前防御力", }, - "manamax": { + manamax: { "!type": "number", - "!doc": "勇士当前魔力上限,负数无效" + "!doc": "勇士当前魔力上限,负数无效", }, - "mana": { + mana: { "!type": "number", - "!doc": "勇士当前魔力值" + "!doc": "勇士当前魔力值", }, - "mdef": { + mdef: { "!type": "number", - "!doc": "勇士当前护盾值" + "!doc": "勇士当前护盾值", }, - "money": { + money: { "!type": "number", - "!doc": "勇士当前金币" + "!doc": "勇士当前金币", }, - "exp": { + exp: { "!type": "number", - "!doc": "勇士当前经验" + "!doc": "勇士当前经验", }, - "equipment": { + equipment: { "!type": "[string]", - "!doc": "勇士当前装备" + "!doc": "勇士当前装备", }, - "items": { + items: { "!doc": "勇士当前道具", - "constants": { - "!doc": "永久道具" + constants: { + "!doc": "永久道具", }, - "tools": { + tools: { "!doc": "消耗道具", - "yellowKey": { + yellowKey: { "!type": "number", - "!doc": "黄钥匙个数" + "!doc": "黄钥匙个数", }, - "blueKey": { + blueKey: { "!type": "number", - "!doc": "蓝钥匙个数" + "!doc": "蓝钥匙个数", }, - "redKey": { + redKey: { "!type": "number", - "!doc": "红钥匙个数" + "!doc": "红钥匙个数", }, - "greenKey": { + greenKey: { "!type": "number", - "!doc": "绿钥匙个数" + "!doc": "绿钥匙个数", }, - "steelKey": { + steelKey: { "!type": "number", - "!doc": "铁门钥匙个数" + "!doc": "铁门钥匙个数", }, }, - "equips": { - "!doc": "在背包中未装备上的装备" + equips: { + "!doc": "在背包中未装备上的装备", }, }, - "loc": { + loc: { "!doc": "勇士当前坐标和朝向", - "x": "number", - "y": "number", - "direction": { + x: "number", + y: "number", + direction: { "!doc": "朝向,只能为 up,down,left,right 之一", - "!type": "string" + "!type": "string", }, }, - "flags": { + flags: { "!type": "flag", - "!doc": "当前游戏中用到的变量" + "!doc": "当前游戏中用到的变量", }, - "followers": { + followers: { "!type": "[?]", - "!doc": "跟随者信息" + "!doc": "跟随者信息", }, - "steps": { + steps: { "!type": "number", - "!doc": "当前步数" - } + "!doc": "当前步数", + }, }, - "block": { + block: { "!doc": "地图图块信息", - "x": { + x: { "!type": "number", - "!doc": "图块的x坐标" + "!doc": "图块的x坐标", }, - "y": { + y: { "!type": "number", - "!doc": "图块的y坐标" + "!doc": "图块的y坐标", }, - "id": { + id: { "!type": "number", - "!doc": "图块的数字" + "!doc": "图块的数字", }, - "event": { + event: { "!doc": "图块上的事件信息", - "id": { + id: { "!type": "string", - "!doc": "图块的ID" + "!doc": "图块的ID", }, - "cls": { + cls: { "!type": "string", - "!doc": "图块的类别,一般为所在图片名去掉后缀" + "!doc": "图块的类别,一般为所在图片名去掉后缀", }, - "disabled": { + disabled: { "!type": "bool", - "!doc": "启用状态" - } - } + "!doc": "启用状态", + }, + }, }, - "blockInfo": { + blockInfo: { "!doc": "图块的更多信息", - "animate": { + animate: { "!type": "number", - "!doc": "动画帧数" + "!doc": "动画帧数", }, - "cls": { + cls: { "!type": "string", - "!doc": "图块类别" + "!doc": "图块类别", }, - "faceIds": { + faceIds: { "!doc": "行走图朝向", - "up": "string", - "down": "string", - "left": "string", - "right": "string" + up: "string", + down: "string", + left: "string", + right: "string", }, - "height": { + height: { "!type": "number", - "!doc": "图块高度" + "!doc": "图块高度", }, - "id": { + id: { "!type": "string", - "!doc": "图块ID" + "!doc": "图块ID", }, - "image": { + image: { "!type": "image", - "!doc": "图块所在的图片" + "!doc": "图块所在的图片", }, - "name": { + name: { "!type": "string", - "!doc": "图块名称" + "!doc": "图块名称", }, - "number": { + number: { "!type": "number", - "!doc": "图块使用的数字" + "!doc": "图块使用的数字", }, - "posX": { + posX: { "!type": "number", - "!doc": "图块在图片上的横坐标" + "!doc": "图块在图片上的横坐标", }, - "posY": { + posY: { "!type": "number", - "!doc": "图块在图片上的纵坐标" + "!doc": "图块在图片上的纵坐标", }, }, - "enemy": { + enemy: { "!doc": "怪物信息", - "id": { + id: { "!type": "string", - "!doc": "怪物ID" + "!doc": "怪物ID", }, - "name": { + name: { "!type": "string", - "!doc": "怪物名称" + "!doc": "怪物名称", }, - "displayIdInBook": { + displayIdInBook: { "!type": "string", - "!doc": "在怪物手册映射ID" + "!doc": "在怪物手册映射ID", }, - "hp": { + hp: { "!type": "number", - "!doc": "怪物生命值" + "!doc": "怪物生命值", }, - "atk": { + atk: { "!type": "number", - "!doc": "怪物攻击" + "!doc": "怪物攻击", }, - "def": { + def: { "!type": "number", - "!doc": "怪物防御" + "!doc": "怪物防御", }, - "money": { + money: { "!type": "number", - "!doc": "怪物金币" + "!doc": "怪物金币", }, - "exp": { + exp: { "!type": "number", - "!doc": "怪物经验" + "!doc": "怪物经验", }, - "special": { + special: { "!type": "[number]", - "!doc": "怪物特殊属性" + "!doc": "怪物特殊属性", }, - "point": { + point: { "!type": "number", - "!doc": "怪物加点" + "!doc": "怪物加点", }, - "value": { + value: { "!type": "number", - "!doc": "怪物特殊属性值:阻激夹域伤害值;吸血比例;光环增加生命比例" + "!doc": "怪物特殊属性值:阻激夹域伤害值;吸血比例;光环增加生命比例", }, - "zoneSquare": { + zoneSquare: { "!type": "bool", - "!doc": "领域怪是否九宫格伤害;区域光环是否九宫格范围" + "!doc": "领域怪是否九宫格伤害;区域光环是否九宫格范围", }, - "range": { + range: { "!type": "number", - "!doc": "领域伤害的范围;区域光环范围" + "!doc": "领域伤害的范围;区域光环范围", }, - "notBomb": { + notBomb: { "!type": "bool", - "!doc": "怪物不可炸" + "!doc": "怪物不可炸", }, - "n": { + n: { "!type": "number", - "!doc": "多连击的连击数;净化比例" + "!doc": "多连击的连击数;净化比例", }, - "add": { + add: { "!type": "bool", - "!doc": "吸血是否加到自身;光环是否叠加" + "!doc": "吸血是否加到自身;光环是否叠加", }, - "atkValue": { + atkValue: { "!type": "number", - "!doc": "反击比例;退化扣除攻击;光环增加攻击;" + "!doc": "反击比例;退化扣除攻击;光环增加攻击;", }, - "defValue": { + defValue: { "!type": "number", - "!doc": "破甲比例;退化扣除防御;光环增加防御" + "!doc": "破甲比例;退化扣除防御;光环增加防御", }, - "damage": { + damage: { "!type": "number", - "!doc": "固伤值" + "!doc": "固伤值", }, }, - "item": { + item: { "!doc": "道具信息", - "id": { + id: { "!type": "string", - "!doc": "道具ID" + "!doc": "道具ID", }, - "cls": { + cls: { "!type": "string", - "!doc": "道具类型" + "!doc": "道具类型", }, - "name": { + name: { "!type": "string", - "!doc": "道具名称" + "!doc": "道具名称", }, - "text": { + text: { "!type": "string", - "!doc": "道具描述" + "!doc": "道具描述", }, - "hideInToolbox": { + hideInToolbox: { "!type": "bool", - "!doc": "不显示在道具栏" + "!doc": "不显示在道具栏", }, - "equip": { + equip: { "!doc": "装备属性", - "type": { + type: { "!type": "number|string", - "!doc": "装备类型" + "!doc": "装备类型", }, - "animate": { + animate: { "!type": "string", - "!doc": "装备动画" + "!doc": "装备动画", }, - "value": { - "!doc": "数值加成" + value: { + "!doc": "数值加成", + }, + percentage: { + "!doc": "比例加成", }, - "percentage": { - "!doc": "比例加成" - } }, - "hideInReplay": { + hideInReplay: { "!type": "bool", - "!doc": "回放不绘制道具栏" + "!doc": "回放不绘制道具栏", }, }, - "floor": { + floor: { "!doc": "楼层信息", - "floorId": { + floorId: { "!type": "string", - "!doc": "楼层ID" + "!doc": "楼层ID", }, - "title": { + title: { "!type": "string", - "!doc": "楼层中文名" + "!doc": "楼层中文名", }, - "name": { + name: { "!type": "string", - "!doc": "状态栏显示值" + "!doc": "状态栏显示值", }, - "width": { + width: { "!type": "number", - "!doc": "地图宽" + "!doc": "地图宽", }, - "height": { + height: { "!type": "number", - "!doc": "地图高" + "!doc": "地图高", }, - "canFlyTo": { + canFlyTo: { "!type": "bool", - "!doc": "该楼是否可以楼传飞到" + "!doc": "该楼是否可以楼传飞到", }, - "canFlyFrom": { + canFlyFrom: { "!type": "bool", - "!doc": "该楼是否可以楼传飞出" + "!doc": "该楼是否可以楼传飞出", }, - "canUseQuickShop": { + canUseQuickShop: { "!type": "bool", - "!doc": "该楼是否可快捷商店" + "!doc": "该楼是否可快捷商店", }, - "cannotViewMap": { + cannotViewMap: { "!type": "bool", - "!doc": "该层是否不允许被浏览地图看到,也不统计" + "!doc": "该层是否不允许被浏览地图看到,也不统计", }, - "cannotMoveDirectly": { + cannotMoveDirectly: { "!type": "bool", - "!doc": "该层是否不允许瞬间移动" + "!doc": "该层是否不允许瞬间移动", }, - "upFloor": { + upFloor: { "!type": "[number]", - "!doc": "上楼点" + "!doc": "上楼点", }, - "downFloor": { + downFloor: { "!type": "[number]", - "!doc": "下楼点" + "!doc": "下楼点", }, - "flyPoint": { + flyPoint: { "!type": "[number]", - "!doc": "楼传落点" + "!doc": "楼传落点", }, - "color": { - "!doc": "楼层色调" + color: { + "!doc": "楼层色调", }, - "weather": { - "!doc": "楼层天气" + weather: { + "!doc": "楼层天气", }, - "bgm": { + bgm: { "!type": "string", - "!doc": "楼层背景音乐" + "!doc": "楼层背景音乐", }, - "ratio": { + ratio: { "!type": "number", - "!doc": "宝石/血瓶效果" + "!doc": "宝石/血瓶效果", }, - "map": { + map: { "!type": "[[number]]", - "!doc": "地图数据" + "!doc": "地图数据", }, - "blocks": { + blocks: { "!type": "[block]", - "!doc": "本层图块信息" - } + "!doc": "本层图块信息", + }, }, - "animate": { + animate: { "!doc": "动画信息", - "se": { + se: { "!type": "string", - "!doc": "动画音效" - } - } + "!doc": "动画音效", + }, + }, }, - "core": { + core: { "!doc": "核心游戏控制", - "__SIZE__": { + __SIZE__: { "!type": "number", - "!doc": "窗口宽度,为13或15" + "!doc": "窗口宽度,为13或15", }, - "__PIXELS__": { + __PIXELS__: { "!type": "number", - "!doc": "窗口像素宽度,为416或480" + "!doc": "窗口像素宽度,为416或480", }, - "__HALF_SIZE__": { + __HALF_SIZE__: { "!type": "number", - "!doc": "窗口宽度的一半,为6或7" + "!doc": "窗口宽度的一半,为6或7", }, - "floorIds": { + floorIds: { "!type": "[string]", - "!doc": "全部楼层ID列表" + "!doc": "全部楼层ID列表", }, - "floors": { - "!doc": "全部楼层信息" + floors: { + "!doc": "全部楼层信息", }, - "floorPartitions": { + floorPartitions: { "!type": "[[string]]", - "!doc": "楼层分区信息" + "!doc": "楼层分区信息", }, - "material": { + material: { "!doc": "游戏所用到的资源", - "animates": { - "!doc": "注册的动画" + animates: { + "!doc": "注册的动画", }, - "images": { - "!doc": "注册的图片" + images: { + "!doc": "注册的图片", }, - "bgms": { - "!doc": "注册的背景音乐" + bgms: { + "!doc": "注册的背景音乐", }, - "sounds": { - "!doc": "注册的音效" + sounds: { + "!doc": "注册的音效", }, - "enemys": { + enemys: { "!doc": "怪物定义", }, - "items": { - "!doc": "道具定义" - } + items: { + "!doc": "道具定义", + }, }, - "timeout": { - "!doc": "当前异步事件句柄" + timeout: { + "!doc": "当前异步事件句柄", }, - "interval": { - "!doc": "当前异步事件延时" + interval: { + "!doc": "当前异步事件延时", }, - "animateFrame": { - "!doc": "当前各个帧动画" + animateFrame: { + "!doc": "当前各个帧动画", }, - "musicStatus": { + musicStatus: { "!doc": "音乐音效状态", - "bgmStatus": { + bgmStatus: { "!type": "bool", - "!doc": "是否播放BGM" + "!doc": "是否播放BGM", }, - "soundStatus": { + soundStatus: { "!type": "bool", - "!doc": "是否播放SE" + "!doc": "是否播放SE", }, - "playingBgm": { + playingBgm: { "!type": "string", - "!doc": "正在播放的bgm" + "!doc": "正在播放的bgm", }, - "lastBgm": { + lastBgm: { "!type": "string", - "!doc": "上次播放的bgm" + "!doc": "上次播放的bgm", }, - "playingSounds": { - "!doc": "正在播放的SE" + playingSounds: { + "!doc": "正在播放的SE", }, - "volume": { + volume: { "!type": "number", - "!doc": "当前bgm音量" - } + "!doc": "当前bgm音量", + }, }, - "platform": { + platform: { "!doc": "平台信息", - "isPC": "bool", - "isAndroid": "bool", - "isIOS": "bool", + isPC: "bool", + isAndroid: "bool", + isIOS: "bool", }, - "domStyle": { + domStyle: { "!doc": "界面样式", - "scale": { + scale: { "!type": "number", "!doc": "当前界面放缩比例", }, - "ratio": { + ratio: { "!type": "number", - "!doc": "高清UI放缩比例" + "!doc": "高清UI放缩比例", }, - "hdCanvas": { + hdCanvas: { "!type": "[string]", - "!doc": "高清UI的系统画布" + "!doc": "高清UI的系统画布", }, - "availableScale": { + availableScale: { "!type": "[number]", - "!doc": "当前界面支持的放缩比例" + "!doc": "当前界面支持的放缩比例", }, - "isVertical": { + isVertical: { "!type": "bool", - "!doc": "当前是否是竖屏" + "!doc": "当前是否是竖屏", }, - "showStatusBar": { + showStatusBar: { "!type": "bool", - "!doc": "当前是否显示状态栏" + "!doc": "当前是否显示状态栏", }, - "toolbarBtn": { + toolbarBtn: { "!type": "bool", - "!doc": "当前工具栏是否是1-8的按钮" + "!doc": "当前工具栏是否是1-8的按钮", }, }, - "bigmap": { + bigmap: { "!doc": "大地图信息", - "canvas": { + canvas: { "!type": "[string]", - "!doc": "大地图的画布" + "!doc": "大地图的画布", }, - "width": { + width: { "!type": "number", - "!doc": "大地图高度" + "!doc": "大地图高度", }, - "height": { + height: { "!type": "number", - "!doc": "大地图宽度" + "!doc": "大地图宽度", }, - "offsetX": { + offsetX: { "!type": "number", - "!doc": "大地图视角横向偏移量" + "!doc": "大地图视角横向偏移量", }, - "offsetY": { + offsetY: { "!type": "number", - "!doc": "大地图视角纵向偏移量" + "!doc": "大地图视角纵向偏移量", }, - "posX": { + posX: { "!type": "number", - "!doc": "大地图视角横向基准格" + "!doc": "大地图视角横向基准格", }, - "posY": { + posY: { "!type": "number", - "!doc": "大地图视角纵向基准格" + "!doc": "大地图视角纵向基准格", }, - "v2": { + v2: { "!type": "bool", - "!doc": "是否是新版大地图绘制方式" + "!doc": "是否是新版大地图绘制方式", }, - "threshold": { + threshold: { "!type": "number", - "!doc": "新版大地图绘制方式的分界线" + "!doc": "新版大地图绘制方式的分界线", }, - "extend": { + extend: { "!type": "number", - "!doc": "新版大地图模式下向每一侧额外计算的数量" + "!doc": "新版大地图模式下向每一侧额外计算的数量", }, - "scale": { + scale: { "!type": "number", - "!doc": "缩略图的比例放缩" + "!doc": "缩略图的比例放缩", }, - "tempCanvas": { + tempCanvas: { "!type": "CanvasRenderingContext2D", - "!doc": "临时画布" - } + "!doc": "临时画布", + }, }, - "saves": { - "!doc": "当前存档信息" + saves: { + "!doc": "当前存档信息", }, - "dymCanvas": { - "!doc": "各个自定义画布" + dymCanvas: { + "!doc": "各个自定义画布", }, - "statusBar": { - "!doc": "状态栏信息" + statusBar: { + "!doc": "状态栏信息", }, - "canvas": { - "!doc": "系统画布" + canvas: { + "!doc": "系统画布", }, - "flags": { - "!doc": "系统开关" + flags: { + "!doc": "系统开关", }, - "values": { - "!doc": "全局数值,如毒衰效果" + values: { + "!doc": "全局数值,如毒衰效果", }, - "firstData": { - "!doc": "初始属性,如出生点" + firstData: { + "!doc": "初始属性,如出生点", }, - "status": { + status: { "!doc": "状态信息", - "hero": { + hero: { "!type": "hero", - "!doc": "勇士信息" + "!doc": "勇士信息", }, - "automaticRoute": { - "!doc": "自动寻路信息" + automaticRoute: { + "!doc": "自动寻路信息", }, - "bgmaps": { - "!doc": "各地图背景层" + bgmaps: { + "!doc": "各地图背景层", }, - "fgmaps": { - "!doc": "各地图前景层" + fgmaps: { + "!doc": "各地图前景层", }, - "mapBlockObjs": { - "!doc": "以<位置,block>存放的各地图图块信息" + mapBlockObjs: { + "!doc": "以<位置,block>存放的各地图图块信息", }, - "boxAnimateObjs": { - "!doc": "(手册和剧情文本的)帧动画对象" + boxAnimateObjs: { + "!doc": "(手册和剧情文本的)帧动画对象", }, - "checkBlock": { + checkBlock: { "!doc": "阻激夹域捕捉信息", - "damage": { - "!doc": "每个点的伤害信息" + damage: { + "!doc": "每个点的伤害信息", }, - "type": { - "!doc": "每个点的伤害类型" + type: { + "!doc": "每个点的伤害类型", }, - "repluse": { - "!doc": "每个点的阻击信息" + repluse: { + "!doc": "每个点的阻击信息", }, - "ambush": { - "!doc": "每个点的捕捉信息" + ambush: { + "!doc": "每个点的捕捉信息", }, - "needCache": { + needCache: { "!type": "bool", - "!doc": "该楼层是否需要计算缓存" + "!doc": "该楼层是否需要计算缓存", }, - "cache": { - "!doc": "每个点的光环缓存" + cache: { + "!doc": "每个点的光环缓存", }, }, - "damage": { + damage: { "!doc": "每个点的显伤信息", }, - "ctrlDown": { + ctrlDown: { "!type": "bool", - "!doc": "Ctrl键是否被按下" + "!doc": "Ctrl键是否被按下", }, - "curtainColor": { - "!doc": "当前画面色调" + curtainColor: { + "!doc": "当前画面色调", }, - "event": { + event: { "!doc": "当前事件", - "data": { - "!doc": "事件信息,如坐标等" + data: { + "!doc": "事件信息,如坐标等", }, - "id": { + id: { "!type": "string", - "!doc": "事件类型,如选择项/确认框" + "!doc": "事件类型,如选择项/确认框", }, - "interval": { + interval: { "!type": "number", - "!doc": "打字机效果的定时器" + "!doc": "打字机效果的定时器", }, - "selection": { + selection: { "!type": "number", - "!doc": "选择项和确认框的当前选中项" + "!doc": "选择项和确认框的当前选中项", + }, + ui: { + "!doc": "当前事件的界面信息,如楼传/手册/SL", }, - "ui": { - "!doc": "当前事件的界面信息,如楼传/手册/SL" - } }, - "floorAnimateObjs": { - "!doc": "楼层贴图的帧动画" + floorAnimateObjs: { + "!doc": "楼层贴图的帧动画", }, - "floorId": { + floorId: { "!type": "string", - "!doc": "当前楼层ID" + "!doc": "当前楼层ID", }, - "gameOver": { + gameOver: { "!type": "bool", - "!doc": "游戏是否已结束" + "!doc": "游戏是否已结束", }, - "globalAnimateObjs": { - "!doc": "各全局动画" + globalAnimateObjs: { + "!doc": "各全局动画", }, - "globalAnimateStatus": { + globalAnimateStatus: { "!type": "number", - "!doc": "全局动画的帧状态" + "!doc": "全局动画的帧状态", }, - "globalAttribute": { - "!doc": "全局css属性" + globalAttribute: { + "!doc": "全局css属性", }, - "hard": { + hard: { "!type": "string", - "!doc": "状态栏一角的难度名" + "!doc": "状态栏一角的难度名", }, - "downTime": { + downTime: { "!type": "number", - "!doc": "方向键已按下的时间" + "!doc": "方向键已按下的时间", }, - "heroCenter": { + heroCenter: { "!doc": "勇士中心像素坐标", - "px": { + px: { "!type": "number", - "!doc": "勇士中心的横坐标" + "!doc": "勇士中心的横坐标", }, - "py": { + py: { "!type": "number", - "!doc": "勇士中心的纵坐标" + "!doc": "勇士中心的纵坐标", }, }, - "heroMoving": { + heroMoving: { "!type": "number", - "!doc": "勇士行走的状态值" + "!doc": "勇士行走的状态值", }, - "heroStop": { + heroStop: { "!type": "bool", - "!doc": "勇士是否已停下" + "!doc": "勇士是否已停下", }, - "holdingKeys": { + holdingKeys: { "!type": "[number]", - "!doc": "当前按下的键" + "!doc": "当前按下的键", }, - "id2number": { - "!doc": "图块ID到数字的对应关系" + id2number: { + "!doc": "图块ID到数字的对应关系", }, - "lockControl": { + lockControl: { "!type": "bool", - "!doc": "当前是否是锁定操作状态" + "!doc": "当前是否是锁定操作状态", }, - "maps": { - "!doc": "当前各地图信息" + maps: { + "!doc": "当前各地图信息", }, - "number2Block": { - "!doc": "数字到图块对象的对应关系" + number2Block: { + "!doc": "数字到图块对象的对应关系", }, - "played": { + played: { "!type": "bool", - "!doc": "当前是否游戏中(不包括标题画面和录像回放)" + "!doc": "当前是否游戏中(不包括标题画面和录像回放)", }, - "replay": { + replay: { "!doc": "当前录像回放信息", - "animate": { + animate: { "!type": "bool", - "!doc": "回放是否正处于动画中" + "!doc": "回放是否正处于动画中", }, - "pausing": { + pausing: { "!type": "bool", - "!doc": "回放是否暂停中" + "!doc": "回放是否暂停中", }, - "replaying": { + replaying: { "!type": "bool", - "!doc": "当前是否回放中" + "!doc": "当前是否回放中", }, - "save": { + save: { "!type": "[]", - "!doc": "录像中的存档" + "!doc": "录像中的存档", }, - "speed": { + speed: { "!type": "number", - "!doc": "回放速度" + "!doc": "回放速度", }, - "steps": { + steps: { "!type": "number", - "!doc": "回放步数" + "!doc": "回放步数", }, - "toReplay": { + toReplay: { "!type": "[string]", - "!doc": "待回放的列表" + "!doc": "待回放的列表", }, - "totalList": { + totalList: { "!type": "[string]", - "!doc": "回放总列表" - } + "!doc": "回放总列表", + }, }, - "route": { + route: { "!type": "[string]", - "!doc": "当前录像内容" + "!doc": "当前录像内容", }, - "shops": { - "!doc": "全局商店列表" + shops: { + "!doc": "全局商店列表", }, - "textAttribute": { - "!doc": "当前剧情文本属性" + textAttribute: { + "!doc": "当前剧情文本属性", }, - "thisMap": { + thisMap: { "!type": "floor", - "!doc": "当前地图信息" - } + "!doc": "当前地图信息", + }, }, - "init": { + init: { "!doc": "初始化core", - "!type": "fn(coreData: ?, callback: fn())" + "!type": "fn(coreData: ?, callback: fn())", }, - "doFunc": { + doFunc: { "!doc": "执行一个函数;如果函数名是字符串则转发到插件中", - "!type": "fn(func: name|fn(), _this?: ?)" + "!type": "fn(func: name|fn(), _this?: ?)", }, - "control": { - "!doc": "负责整个游戏的核心控制系统,分为如下几个部分:
- requestAnimationFrame相关
- 标题界面,开始和重新开始游戏
- 自动寻路和人物行走相关
- 画布、位置、阻激夹域、显伤等相关
- 录像的回放相关
- 存读档,自动存档,同步存档等相关
- 人物属性和状态、位置、变量等相关
- 天气、色调、音乐和音效的播放
- 状态栏和工具栏相关
- 界面resize相关", - "showStatusBar": { + control: { + "!doc": + "负责整个游戏的核心控制系统,分为如下几个部分:
- requestAnimationFrame相关
- 标题界面,开始和重新开始游戏
- 自动寻路和人物行走相关
- 画布、位置、阻激夹域、显伤等相关
- 录像的回放相关
- 存读档,自动存档,同步存档等相关
- 人物属性和状态、位置、变量等相关
- 天气、色调、音乐和音效的播放
- 状态栏和工具栏相关
- 界面resize相关", + showStatusBar: { "!doc": "显示状态栏", - "!type": "fn()" + "!type": "fn()", }, - "startReplay": { + startReplay: { "!doc": "开始播放录像", - "!type": "fn(list: [string])" + "!type": "fn(list: [string])", }, - "triggerReplay": { + triggerReplay: { "!doc": "播放或暂停录像回放", - "!type": "fn()" + "!type": "fn()", }, - "screenFlash": { - "!doc": "画面闪烁
例如:core.screenFlash([255, 0, 0, 1], 3); // 红屏一闪而过
color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若填负数则会被视为0)的颜色数组,必填
time: 单次闪烁时长,实际闪烁效果为先花其三分之一的时间渐变到目标色调,再花剩余三分之二的时间渐变回去
times: 闪烁的总次数,不填或填0都视为1
moveMode: 渐变方式
callback: 闪烁全部完毕后的回调函数,可选", - "!type": "fn(color: [number], time: number, times?: number, moveMode?: string, callback?: fn())" + screenFlash: { + "!doc": + "画面闪烁
例如:core.screenFlash([255, 0, 0, 1], 3); // 红屏一闪而过
color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若填负数则会被视为0)的颜色数组,必填
time: 单次闪烁时长,实际闪烁效果为先花其三分之一的时间渐变到目标色调,再花剩余三分之二的时间渐变回去
times: 闪烁的总次数,不填或填0都视为1
moveMode: 渐变方式
callback: 闪烁全部完毕后的回调函数,可选", + "!type": + "fn(color: [number], time: number, times?: number, moveMode?: string, callback?: fn())", }, - "setCurtain": { - "!doc": "更改画面色调,不计入存档。如需长期生效请使用core.events._action_setCurtain()函数
例如:core.setCurtain(); // 恢复画面色调,用时四分之三秒
color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若为负数则会被视为0)的颜色数组,不填视为[0, 0, 0, 0]
time: 渐变时间,单位为毫秒。不填视为750ms,负数视为0(无渐变,立即更改)
moveMode: 渐变方式
callback: 更改完毕后的回调函数,可选。事件流中常取core.doAction", - "!type": "fn(color?: [number], time?: number, moveMode?: string, callback?: fn())" + setCurtain: { + "!doc": + "更改画面色调,不计入存档。如需长期生效请使用core.events._action_setCurtain()函数
例如:core.setCurtain(); // 恢复画面色调,用时四分之三秒
color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若为负数则会被视为0)的颜色数组,不填视为[0, 0, 0, 0]
time: 渐变时间,单位为毫秒。不填视为750ms,负数视为0(无渐变,立即更改)
moveMode: 渐变方式
callback: 更改完毕后的回调函数,可选。事件流中常取core.doAction", + "!type": + "fn(color?: [number], time?: number, moveMode?: string, callback?: fn())", }, - "updateDamage": { - "!doc": "注意!请勿使用该函数!请使用core.updateStatusBar()代替!!重算并绘制地图显伤
例如:core.updateDamage(); // 更新当前地图的显伤,绘制在显伤层(废话)
floorId: 地图id,不填视为当前地图。预览地图时填写
ctx: 绘制到的画布,如果填写了就会画在该画布而不是显伤层", - "!type": "fn(floorId?: string, ctx?: string|CanvasRenderingContext2D)" + updateDamage: { + "!doc": + "注意!请勿使用该函数!请使用core.updateStatusBar()代替!!重算并绘制地图显伤
例如:core.updateDamage(); // 更新当前地图的显伤,绘制在显伤层(废话)
floorId: 地图id,不填视为当前地图。预览地图时填写
ctx: 绘制到的画布,如果填写了就会画在该画布而不是显伤层", + "!type": + "fn(floorId?: string, ctx?: string|CanvasRenderingContext2D)", }, - "drawDamage": { + drawDamage: { "!doc": "仅绘制地图显伤", - "!type": "fn(string|CanvasRenderingContext2D)" + "!type": "fn(string|CanvasRenderingContext2D)", }, - "nextX": { - "!doc": "获取主角面前第n格的横坐标
例如:core.closeDoor(core.nextX(), core.nextY(), 'yellowDoor', core.turnHero); // 在主角面前关上一扇黄门,然后主角顺时针旋转90°
n: 目标格与主角的距离,面前为正数,背后为负数,脚下为0,不填视为1", - "!type": "fn(n?: number) -> number" + nextX: { + "!doc": + "获取主角面前第n格的横坐标
例如:core.closeDoor(core.nextX(), core.nextY(), 'yellowDoor', core.turnHero); // 在主角面前关上一扇黄门,然后主角顺时针旋转90°
n: 目标格与主角的距离,面前为正数,背后为负数,脚下为0,不填视为1", + "!type": "fn(n?: number) -> number", }, - "nextY": { - "!doc": "获取主角面前第n格的纵坐标
例如:core.jumpHero(core.nextX(2), core.nextY(2)); // 主角向前跃过一格,即跳跃靴道具的使用效果
n: 目标格与主角的距离,面前为正数,背后为负数,脚下为0,不填视为1", - "!type": "fn(n?: number) -> number" + nextY: { + "!doc": + "获取主角面前第n格的纵坐标
例如:core.jumpHero(core.nextX(2), core.nextY(2)); // 主角向前跃过一格,即跳跃靴道具的使用效果
n: 目标格与主角的距离,面前为正数,背后为负数,脚下为0,不填视为1", + "!type": "fn(n?: number) -> number", }, - "clearContinueAutomaticRoute": { + clearContinueAutomaticRoute: { "!doc": "清空剩下的自动寻路列表", - "!type": "fn(callback?: fn())" + "!type": "fn(callback?: fn())", }, - "updateViewport": { + updateViewport: { "!doc": "更新大地图的可见区域", - "!type": "fn()" + "!type": "fn()", }, - "getMappedName": { + getMappedName: { "!doc": "获得映射文件名", - "!type": "fn(name: string) -> string" + "!type": "fn(name: string) -> string", }, - "addFlag": { - "!doc": "增减一个flag变量,等价于 core.setFlag(name, core.getFlag(name, 0) + value)
例如:core.addFlag('hatred', 1); // 增加1点仇恨值
name: 变量名,支持中文
value: 变量的增量", - "!type": "fn(name: string, value: number)" + addFlag: { + "!doc": + "增减一个flag变量,等价于 core.setFlag(name, core.getFlag(name, 0) + value)
例如:core.addFlag('hatred', 1); // 增加1点仇恨值
name: 变量名,支持中文
value: 变量的增量", + "!type": "fn(name: string, value: number)", }, - "setFlag": { - "!doc": "设置一个flag变量
例如:core.setFlag('poison', true); // 令主角中毒
name: 变量名,支持中文
value: 变量的新值,不填或填null视为删除", - "!type": "fn(name: string, value: ?)" + setFlag: { + "!doc": + "设置一个flag变量
例如:core.setFlag('poison', true); // 令主角中毒
name: 变量名,支持中文
value: 变量的新值,不填或填null视为删除", + "!type": "fn(name: string, value: ?)", }, - "playSound": { - "!doc": "播放一个音效
sound: 音效名;可以使用文件别名。
pitch: 播放的音调;可选,如果设置则为30-300之间的数值。
callback: 可选,播放完毕后执行的回调函数。
返回:一个数字,可用于core.stopSound的参数来只停止该音效。", - "!type": "fn(sound: string, pitch?: number, callback?: fn()) -> number" + playSound: { + "!doc": + "播放一个音效
sound: 音效名;可以使用文件别名。
pitch: 播放的音调;可选,如果设置则为30-300之间的数值。
callback: 可选,播放完毕后执行的回调函数。
返回:一个数字,可用于core.stopSound的参数来只停止该音效。", + "!type": + "fn(sound: string, pitch?: number, callback?: fn()) -> number", }, - "stopSound": { - "!doc": "停止播放音效。如果未指定id则停止所有音效,否则只停止指定的音效。", - "!type": "fn(id?: number)" + stopSound: { + "!doc": + "停止播放音效。如果未指定id则停止所有音效,否则只停止指定的音效。", + "!type": "fn(id?: number)", }, - "getPlayingSounds": { - "!doc": "获得当前正在播放的所有(指定)音效的id列表
name: 音效名,可用别名;不填代表返回正在播放的全部音效
返回值: 一个列表,每一项为一个正在播放的音效id;可用core.stopSound立刻停止播放", - "!type": "fn(name?: string) -> [number]" + getPlayingSounds: { + "!doc": + "获得当前正在播放的所有(指定)音效的id列表
name: 音效名,可用别名;不填代表返回正在播放的全部音效
返回值: 一个列表,每一项为一个正在播放的音效id;可用core.stopSound立刻停止播放", + "!type": "fn(name?: string) -> [number]", }, - "addGameCanvasTranslate": { + addGameCanvasTranslate: { "!doc": "加减画布偏移", - "!type": "fn(x?: number, y?: number)" + "!type": "fn(x?: number, y?: number)", }, - "addBuff": { - "!doc": "增减主角某个属性的百分比修正倍率,加减法叠加和抵消。等价于 core.setBuff(name, core.getBuff(name) + value)
例如:core.addBuff('atk', -0.1); // 主角获得一层“攻击力减一成”的负面效果
name: 属性的英文名,请注意只能用于数值类属性哦,否则随后的乘法会得到NaN
value: 倍率的增量", - "!type": "fn(name: string, value: number)" + addBuff: { + "!doc": + "增减主角某个属性的百分比修正倍率,加减法叠加和抵消。等价于 core.setBuff(name, core.getBuff(name) + value)
例如:core.addBuff('atk', -0.1); // 主角获得一层“攻击力减一成”的负面效果
name: 属性的英文名,请注意只能用于数值类属性哦,否则随后的乘法会得到NaN
value: 倍率的增量", + "!type": "fn(name: string, value: number)", }, - "drawHero": { - "!doc": "绘制主角和跟随者并重置视野到以主角为中心
例如:core.drawHero(); // 原地绘制主角的静止帧并重置视野野
status: 只能为 stop, leftFoot 和 rightFoot,不填用stop。
offset: 相对主角逻辑位置的偏移量,不填视为无偏移。
frame: 绘制的第几帧", - "!type": "fn(status?: string, offset?: number, frame?: number)" + drawHero: { + "!doc": + "绘制主角和跟随者并重置视野到以主角为中心
例如:core.drawHero(); // 原地绘制主角的静止帧并重置视野野
status: 只能为 stop, leftFoot 和 rightFoot,不填用stop。
offset: 相对主角逻辑位置的偏移量,不填视为无偏移。
frame: 绘制的第几帧", + "!type": "fn(status?: string, offset?: number, frame?: number)", }, - "pauseBgm": { + pauseBgm: { "!doc": "暂停背景音乐的播放", - "!type": "fn()" + "!type": "fn()", }, - "setBgmSpeed": { - "!doc": "设置背景音乐的播放速度和音调
speed: 播放速度,必须为30-300中间的值。100为正常速度。
usePitch: 是否同时改变音调(部分设备可能不支持)", - "!type": "fn(speed: number, usePitch?: bool)" + setBgmSpeed: { + "!doc": + "设置背景音乐的播放速度和音调
speed: 播放速度,必须为30-300中间的值。100为正常速度。
usePitch: 是否同时改变音调(部分设备可能不支持)", + "!type": "fn(speed: number, usePitch?: bool)", }, - "setReplaySpeed": { + setReplaySpeed: { "!doc": "设置播放速度", - "!type": "fn(speed: number)" + "!type": "fn(speed: number)", }, - "pauseReplay": { + pauseReplay: { "!doc": "暂停播放", - "!type": "fn()" + "!type": "fn()", }, - "doSL": { + doSL: { "!doc": "实际进行存读档事件", - "!type": "fn(id?: string, type?: string)" + "!type": "fn(id?: string, type?: string)", }, - "setStatus": { - "!doc": "设置主角的某个属性
例如:core.setStatus('atk', 100); // 设置攻击力为100
name: 属性的英文名,其中'x'、'y'和'direction'会被特殊处理为 core.setHeroLoc(name, value),其他的会直接对 core.status.hero[name] 赋值
value: 属性的新值", - "!type": "fn(name: string, value: number)" + setStatus: { + "!doc": + "设置主角的某个属性
例如:core.setStatus('atk', 100); // 设置攻击力为100
name: 属性的英文名,其中'x'、'y'和'direction'会被特殊处理为 core.setHeroLoc(name, value),其他的会直接对 core.status.hero[name] 赋值
value: 属性的新值", + "!type": "fn(name: string, value: number)", }, - "setAutomaticRoute": { - "!doc": "半自动寻路,用于鼠标或手指拖动
例如:core.setAutomaticRoute(0, 0, [{direction: \"right\", x: 4, y: 9}, {direction: \"right\", x: 5, y: 9}]);
destX: 鼠标或手指的起拖点横坐标
destY: 鼠标或手指的起拖点纵坐标
stepPostfix: 拖动轨迹的数组表示,每项为一步的方向和目标点。", - "!type": "fn(destX: number, destY: number, stepPostfix: [{x: number, y: number, direction: string}])" + setAutomaticRoute: { + "!doc": + '半自动寻路,用于鼠标或手指拖动
例如:core.setAutomaticRoute(0, 0, [{direction: "right", x: 4, y: 9}, {direction: "right", x: 5, y: 9}]);
destX: 鼠标或手指的起拖点横坐标
destY: 鼠标或手指的起拖点纵坐标
stepPostfix: 拖动轨迹的数组表示,每项为一步的方向和目标点。', + "!type": + "fn(destX: number, destY: number, stepPostfix: [{x: number, y: number, direction: string}])", }, - "setHeroOpacity": { + setHeroOpacity: { "!doc": "改变勇士的不透明度", - "!type": "fn(opacity?: number, moveMode?: string, time?: number, callback?: fn())" + "!type": + "fn(opacity?: number, moveMode?: string, time?: number, callback?: fn())", }, - "gatherFollowers": { + gatherFollowers: { "!doc": "立刻聚集所有的跟随者", - "!type": "fn()" + "!type": "fn()", }, - "getStatus": { - "!doc": "读取主角的某个属性,不包括百分比修正
例如:core.getStatus('atk'); // 读取主角的攻击力
name: 属性的英文名,其中'x'、'y'和'direction'会被特殊处理为 core.getHeroLoc(name),其他的会直接读取 core.status.hero[name]", - "!type": "fn(name: string) -> number" + getStatus: { + "!doc": + "读取主角的某个属性,不包括百分比修正
例如:core.getStatus('atk'); // 读取主角的攻击力
name: 属性的英文名,其中'x'、'y'和'direction'会被特殊处理为 core.getHeroLoc(name),其他的会直接读取 core.status.hero[name]", + "!type": "fn(name: string) -> number", }, - "setHeroLoc": { - "!doc": "设置勇士位置
值得注意的是,这句话虽然会使勇士改变位置,但并不会使界面重新绘制;
如需立刻重新绘制地图还需调用:core.clearMap('hero'); core.drawHero(); 来对界面进行更新。
例如:core.setHeroLoc('x', 5) // 将勇士当前位置的横坐标设置为5。
name: 要设置的坐标属性
value: 新值
noGather: 是否聚集跟随者", - "!type": "fn(name: string, value: string|number, noGather?: bool)" + setHeroLoc: { + "!doc": + "设置勇士位置
值得注意的是,这句话虽然会使勇士改变位置,但并不会使界面重新绘制;
如需立刻重新绘制地图还需调用:core.clearMap('hero'); core.drawHero(); 来对界面进行更新。
例如:core.setHeroLoc('x', 5) // 将勇士当前位置的横坐标设置为5。
name: 要设置的坐标属性
value: 新值
noGather: 是否聚集跟随者", + "!type": "fn(name: string, value: string|number, noGather?: bool)", }, - "getLvName": { - "!doc": "根据级别的数字获取对应的名称,后者定义在全塔属性
例如:core.getLvName(); // 获取主角当前级别的名称,如“下级佣兵”
lv: 级别的数字,不填则视为主角当前的级别
返回值:级别的名称,如果不存在就还是返回数字", - "!type": "fn(lv?: number) -> string|number" + getLvName: { + "!doc": + "根据级别的数字获取对应的名称,后者定义在全塔属性
例如:core.getLvName(); // 获取主角当前级别的名称,如“下级佣兵”
lv: 级别的数字,不填则视为主角当前的级别
返回值:级别的名称,如果不存在就还是返回数字", + "!type": "fn(lv?: number) -> string|number", }, - "getNextLvUpNeed": { - "!doc": "获得下次升级需要的经验值。
升级扣除模式下会返回经验差值;非扣除模式下会返回总共需要的经验值。
如果无法进行下次升级,返回null。", - "!type": "fn() -> number" + getNextLvUpNeed: { + "!doc": + "获得下次升级需要的经验值。
升级扣除模式下会返回经验差值;非扣除模式下会返回总共需要的经验值。
如果无法进行下次升级,返回null。", + "!type": "fn() -> number", }, - "addStatus": { - "!doc": "增减主角的某个属性,等价于core.setStatus(name, core.getStatus(name) + value)
例如:core.addStatus('atk', 100'); // 给主角攻击力加100
name: 属性的英文名
value: 属性的增量", - "!type": "fn(name: string, value: number)" + addStatus: { + "!doc": + "增减主角的某个属性,等价于core.setStatus(name, core.getStatus(name) + value)
例如:core.addStatus('atk', 100'); // 给主角攻击力加100
name: 属性的英文名
value: 属性的增量", + "!type": "fn(name: string, value: number)", }, - "speedUpReplay": { + speedUpReplay: { "!doc": "加速播放", - "!type": "fn()" + "!type": "fn()", }, - "loadData": { + loadData: { "!doc": "从本地读档", - "!type": "fn(data?: ?, callback?: fn())" + "!type": "fn(data?: ?, callback?: fn())", }, - "debug": { - "!doc": "开启调试模式, 此模式下可以按Ctrl键进行穿墙, 并忽略一切事件。
此模式下不可回放录像和上传成绩。", - "!type": "fn()" + debug: { + "!doc": + "开启调试模式, 此模式下可以按Ctrl键进行穿墙, 并忽略一切事件。
此模式下不可回放录像和上传成绩。", + "!type": "fn()", }, - "moveOneStep": { - "!doc": "每移动一格后执行的事件
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(callback?: fn())" + moveOneStep: { + "!doc": + "每移动一格后执行的事件
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": "fn(callback?: fn())", }, - "clearStatus": { + clearStatus: { "!doc": "清除游戏状态和数据", - "!type": "fn()" + "!type": "fn()", }, - "updateFollowers": { + updateFollowers: { "!doc": "更新跟随者坐标", - "!type": "fn()" + "!type": "fn()", }, - "waitHeroToStop": { - "!doc": "等待主角停下
例如:core.waitHeroToStop(core.vibrate); // 等待主角停下,然后视野左右抖动1秒
callback: 主角停止后的回调函数", - "!type": "fn(callback?: fn())" + waitHeroToStop: { + "!doc": + "等待主角停下
例如:core.waitHeroToStop(core.vibrate); // 等待主角停下,然后视野左右抖动1秒
callback: 主角停止后的回调函数", + "!type": "fn(callback?: fn())", }, - "hideStatusBar": { + hideStatusBar: { "!doc": "隐藏状态栏
showToolbox: 是否不隐藏竖屏工具栏", - "!type": "fn(showToolbox?: bool)" + "!type": "fn(showToolbox?: bool)", }, - "getBuff": { - "!doc": "读取主角某个属性的百分比修正倍率,初始值为1
例如:core.getBuff('atk'); // 主角当前能发挥出多大比例的攻击力
name: 属性的英文名", - "!type": "fn(name: string) -> number" + getBuff: { + "!doc": + "读取主角某个属性的百分比修正倍率,初始值为1
例如:core.getBuff('atk'); // 主角当前能发挥出多大比例的攻击力
name: 属性的英文名", + "!type": "fn(name: string) -> number", }, - "triggerDebuff": { - "!doc": "获得或移除毒衰咒效果
action: 要获得还是移除,'get'为获得,'remove'为移除
type: 获得或移除的内容(poison/weak/curse),可以为字符串或数组", - "!type": "fn(action: string, type: string|[string])" + triggerDebuff: { + "!doc": + "获得或移除毒衰咒效果
action: 要获得还是移除,'get'为获得,'remove'为移除
type: 获得或移除的内容(poison/weak/curse),可以为字符串或数组", + "!type": "fn(action: string, type: string|[string])", }, - "setToolbarButton": { + setToolbarButton: { "!doc": "改变工具栏为按钮1-8", - "!type": "fn(useButton?: bool)" + "!type": "fn(useButton?: bool)", }, - "getSaves": { + getSaves: { "!doc": "获得某些存档内容", - "!type": "fn(ids?: ?, callback?: fn())" + "!type": "fn(ids?: ?, callback?: fn())", }, - "replay": { + replay: { "!doc": "回放下一个操作", - "!type": "fn()" + "!type": "fn()", }, - "getStatusOrDefault": { + getStatusOrDefault: { "!doc": "从status中获得属性,如果不存在则从勇士属性中获取", - "!type": "fn(status?: ?, name?: string)" + "!type": "fn(status?: ?, name?: string)", }, - "unregisterReplayAction": { + unregisterReplayAction: { "!doc": "注销一个录像行为", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "unregisterWeather": { + unregisterWeather: { "!doc": "注销一个天气", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "setBuff": { - "!doc": "设置主角某个属性的百分比修正倍率,初始值为1,
倍率存放在flag: '__'+name+'_buff__' 中
例如:core.setBuff('atk', 0.5); // 主角能发挥出的攻击力减半
name: 属性的英文名,请注意只能用于数值类属性哦,否则随后的乘法会得到NaN
value: 新的百分比修正倍率,不填(效果上)视为1", - "!type": "fn(name: string, value: number)" + setBuff: { + "!doc": + "设置主角某个属性的百分比修正倍率,初始值为1,
倍率存放在flag: '__'+name+'_buff__' 中
例如:core.setBuff('atk', 0.5); // 主角能发挥出的攻击力减半
name: 属性的英文名,请注意只能用于数值类属性哦,否则随后的乘法会得到NaN
value: 新的百分比修正倍率,不填(效果上)视为1", + "!type": "fn(name: string, value: number)", }, - "continueAutomaticRoute": { + continueAutomaticRoute: { "!doc": "继续剩下的自动寻路操作", - "!type": "fn()" + "!type": "fn()", }, - "setAutoHeroMove": { - "!doc": "连续行走
例如:core.setAutoHeroMove([{direction: \"up\", step: 1}, {direction: \"left\", step: 3}]); // 上左左左
steps: 压缩的步伐数组,每项表示朝某方向走多少步", - "!type": "fn(steps: [?])" + setAutoHeroMove: { + "!doc": + '连续行走
例如:core.setAutoHeroMove([{direction: "up", step: 1}, {direction: "left", step: 3}]); // 上左左左
steps: 压缩的步伐数组,每项表示朝某方向走多少步', + "!type": "fn(steps: [?])", }, - "unregisterResize": { + unregisterResize: { "!doc": "注销一个resize函数", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "saveAndStopAutomaticRoute": { + saveAndStopAutomaticRoute: { "!doc": "保存剩下的寻路,并停止", - "!type": "fn()" + "!type": "fn()", }, - "hideStartAnimate": { - "!doc": "淡出标题画面
例如:core.hideStartAnimate(core.startGame); // 淡出标题画面并开始新游戏,跳过难度选择
callback: 标题画面完全淡出后的回调函数", - "!type": "fn(callback?: fn())" + hideStartAnimate: { + "!doc": + "淡出标题画面
例如:core.hideStartAnimate(core.startGame); // 淡出标题画面并开始新游戏,跳过难度选择
callback: 标题画面完全淡出后的回调函数", + "!type": "fn(callback?: fn())", }, - "getAllSaves": { + getAllSaves: { "!doc": "获得所有存档内容", - "!type": "fn(callback?: fn())" + "!type": "fn(callback?: fn())", }, - "updateHeroIcon": { + updateHeroIcon: { "!doc": "更新状态栏的勇士图标", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "setMusicBtn": { + setMusicBtn: { "!doc": "设置音乐图标的显隐状态", - "!type": "fn()" + "!type": "fn()", }, - "isPlaying": { + isPlaying: { "!doc": "游戏是否已经开始", - "!type": "fn() -> bool" + "!type": "fn() -> bool", }, - "triggerBgm": { + triggerBgm: { "!doc": "开启或关闭背景音乐的播放", - "!type": "fn()" + "!type": "fn()", }, - "moveHero": { - "!doc": "连续前进,不撞南墙不回头
例如:core.moveHero(); // 连续前进
direction: 可选,如果设置了就会先转身到该方向
callback: 可选,如果设置了就只走一步
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(direction?: string, callback?: fn())" + moveHero: { + "!doc": + "连续前进,不撞南墙不回头
例如:core.moveHero(); // 连续前进
direction: 可选,如果设置了就会先转身到该方向
callback: 可选,如果设置了就只走一步
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": "fn(direction?: string, callback?: fn())", }, - "getRealStatusOrDefault": { - "!doc": "从status中获得实际属性(增幅后的),如果不存在则从勇士属性中获取", - "!type": "fn(status?: ?, name?: string)" + getRealStatusOrDefault: { + "!doc": + "从status中获得实际属性(增幅后的),如果不存在则从勇士属性中获取", + "!type": "fn(status?: ?, name?: string)", }, - "getStatusLabel": { + getStatusLabel: { "!doc": "获得某个状态的名字,如atk->攻击,def->防御等", - "!type": "fn(name: string) -> string" + "!type": "fn(name: string) -> string", }, - "removeSave": { + removeSave: { "!doc": "删除某个存档", - "!type": "fn(index?: number, callback?: fn())" + "!type": "fn(index?: number, callback?: fn())", }, - "registerAnimationFrame": { - "!doc": "注册一个 animationFrame
name: 名称,可用来作为注销使用
needPlaying: 是否只在游戏运行时才执行(在标题界面不执行)
func: 要执行的函数,或插件中的函数名;可接受timestamp(从页面加载完毕到当前所经过的时间)作为参数", - "!type": "fn(name: string, needPlaying: bool, func?: fn(timestamp: number))" + registerAnimationFrame: { + "!doc": + "注册一个 animationFrame
name: 名称,可用来作为注销使用
needPlaying: 是否只在游戏运行时才执行(在标题界面不执行)
func: 要执行的函数,或插件中的函数名;可接受timestamp(从页面加载完毕到当前所经过的时间)作为参数", + "!type": + "fn(name: string, needPlaying: bool, func?: fn(timestamp: number))", }, - "getHeroLoc": { - "!doc": "读取主角的位置和/或朝向
例如:core.getHeroLoc(); // 读取主角的位置和朝向
name: 要读取横坐标还是纵坐标还是朝向还是都读取
返回值:name ? core.status.hero.loc[name] : core.status.hero.loc", - "!type": "fn(name: string) -> string|number" + getHeroLoc: { + "!doc": + "读取主角的位置和/或朝向
例如:core.getHeroLoc(); // 读取主角的位置和朝向
name: 要读取横坐标还是纵坐标还是朝向还是都读取
返回值:name ? core.status.hero.loc[name] : core.status.hero.loc", + "!type": "fn(name: string) -> string|number", }, - "stopAutomaticRoute": { + stopAutomaticRoute: { "!doc": "停止自动寻路操作", - "!type": "fn()" + "!type": "fn()", }, - "setWeather": { - "!doc": "设置天气,不计入存档。如需长期生效请使用core.events._action_setWeather()函数
例如:core.setWeather('fog', 10); // 设置十级大雾天
type: 新天气的类型,不填视为晴天
level: 新天气(晴天除外)的级别,必须为不大于10的正整数,不填视为5", - "!type": "fn(type?: string, level?: number)" + setWeather: { + "!doc": + "设置天气,不计入存档。如需长期生效请使用core.events._action_setWeather()函数
例如:core.setWeather('fog', 10); // 设置十级大雾天
type: 新天气的类型,不填视为晴天
level: 新天气(晴天除外)的级别,必须为不大于10的正整数,不填视为5", + "!type": "fn(type?: string, level?: number)", }, - "updateStatusBar": { - "!doc": "刷新状态栏和地图显伤
doNotCheckAutoEvents: 是否不检查自动事件", - "!type": "fn(doNotCheckAutoEvents?: bool, immediate?: bool)" + updateStatusBar: { + "!doc": + "刷新状态栏和地图显伤
doNotCheckAutoEvents: 是否不检查自动事件", + "!type": "fn(doNotCheckAutoEvents?: bool, immediate?: bool)", }, - "autosave": { + autosave: { "!doc": "自动存档", - "!type": "fn(removeLast?: bool)" + "!type": "fn(removeLast?: bool)", }, - "clearStatusBar": { + clearStatusBar: { "!doc": "清空状态栏", - "!type": "fn()" + "!type": "fn()", }, - "moveAction": { - "!doc": "尝试前进一步,如果面前不可被踏入就会直接触发该点事件
请勿直接使用此函数,如有需要请使用「勇士前进一步或撞击」事件
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(callback?: fn())" + moveAction: { + "!doc": + "尝试前进一步,如果面前不可被踏入就会直接触发该点事件
请勿直接使用此函数,如有需要请使用「勇士前进一步或撞击」事件
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": "fn(callback?: fn())", }, - "hasFlag": { - "!doc": "判定一个flag变量是否存在且不为false、0、''、null、undefined和NaN
例如:core.hasFlag('poison'); // 判断主角当前是否中毒
name: 变量名,支持中文
此函数等价于 !!core.getFlag(name)", - "!type": "fn(name: string) -> bool" + hasFlag: { + "!doc": + "判定一个flag变量是否存在且不为false、0、''、null、undefined和NaN
例如:core.hasFlag('poison'); // 判断主角当前是否中毒
name: 变量名,支持中文
此函数等价于 !!core.getFlag(name)", + "!type": "fn(name: string) -> bool", }, - "rewindReplay": { + rewindReplay: { "!doc": "回退到上一个录像节点", - "!type": "fn()" + "!type": "fn()", }, - "playBgm": { - "!doc": "播放背景音乐,中途开播但不计入存档且只会持续到下次场景切换。如需长期生效请将背景音乐的文件名赋值给flags.__bgm__
例如:core.playBgm('bgm.mp3', 30); // 播放bgm.mp3,并跳过前半分钟
bgm: 背景音乐的文件名,支持全塔属性中映射前的中文名
startTime: 跳过前多少秒,不填则不跳过", - "!type": "fn(bgm: string, startTime?: number)" + playBgm: { + "!doc": + "播放背景音乐,中途开播但不计入存档且只会持续到下次场景切换。如需长期生效请将背景音乐的文件名赋值给flags.__bgm__
例如:core.playBgm('bgm.mp3', 30); // 播放bgm.mp3,并跳过前半分钟
bgm: 背景音乐的文件名,支持全塔属性中映射前的中文名
startTime: 跳过前多少秒,不填则不跳过", + "!type": "fn(bgm: string, startTime?: number)", }, - "isReplaying": { + isReplaying: { "!doc": "是否正在播放录像", - "!type": "fn() -> bool" + "!type": "fn() -> bool", }, - "isMoving": { + isMoving: { "!doc": "当前是否正在移动", - "!type": "fn() -> bool" + "!type": "fn() -> bool", }, - "getSaveIndexes": { + getSaveIndexes: { "!doc": "获得所有存在存档的存档位", - "!type": "fn(callback?: fn())" + "!type": "fn(callback?: fn())", }, - "unlockControl": { + unlockControl: { "!doc": "解锁用户控制行为", - "!type": "fn()" + "!type": "fn()", }, - "syncSave": { + syncSave: { "!doc": "同步存档到服务器", - "!type": "fn(type?: string)" + "!type": "fn(type?: string)", }, - "removeFlag": { + removeFlag: { "!doc": "删除某个flag/变量", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "registerResize": { - "!doc": "注册一个resize函数
name: 名称,可供注销使用
func: 可以是一个函数,或者是插件中的函数名;可以接受obj参数,详见resize函数。", - "!type": "fn(name: string, func: fn(obj: ?))" + registerResize: { + "!doc": + "注册一个resize函数
name: 名称,可供注销使用
func: 可以是一个函数,或者是插件中的函数名;可以接受obj参数,详见resize函数。", + "!type": "fn(name: string, func: fn(obj: ?))", }, - "registerWeather": { - "!doc": "注册一个天气
name: 要注册的天气名
initFunc: 当切换到此天气时的初始化;接受level(天气等级)为参数;可用于创建多个节点(如初始化雪花)
frameFunc: 每帧的天气效果变化;可接受timestamp(从页面加载完毕到当前所经过的时间)和level(天气等级)作为参数
天气应当仅在weather层进行绘制,推荐使用core.animateFrame.weather.nodes用于节点信息。", - "!type": "fn(name: string, initFunc: fn(level: number), frameFunc?: fn(timestamp: number, level: number))" + registerWeather: { + "!doc": + "注册一个天气
name: 要注册的天气名
initFunc: 当切换到此天气时的初始化;接受level(天气等级)为参数;可用于创建多个节点(如初始化雪花)
frameFunc: 每帧的天气效果变化;可接受timestamp(从页面加载完毕到当前所经过的时间)和level(天气等级)作为参数
天气应当仅在weather层进行绘制,推荐使用core.animateFrame.weather.nodes用于节点信息。", + "!type": + "fn(name: string, initFunc: fn(level: number), frameFunc?: fn(timestamp: number, level: number))", }, - "stopReplay": { + stopReplay: { "!doc": "停止播放", - "!type": "fn(force?: bool)" + "!type": "fn(force?: bool)", }, - "turnHero": { - "!doc": "主角转向并计入录像,不会导致跟随者聚集,会导致视野重置到以主角为中心
例如:core.turnHero(); // 主角顺时针旋转90°,即单击主角或按下Z键的效果
direction: 主角的新朝向,可为 up, down, left, right, :left, :right, :back 七种之一", - "!type": "fn(direction?: string)" + turnHero: { + "!doc": + "主角转向并计入录像,不会导致跟随者聚集,会导致视野重置到以主角为中心
例如:core.turnHero(); // 主角顺时针旋转90°,即单击主角或按下Z键的效果
direction: 主角的新朝向,可为 up, down, left, right, :left, :right, :back 七种之一", + "!type": "fn(direction?: string)", }, - "resumeReplay": { + resumeReplay: { "!doc": "恢复播放", - "!type": "fn()" + "!type": "fn()", }, - "resize": { + resize: { "!doc": "屏幕分辨率改变后重新自适应", - "!type": "fn()" + "!type": "fn()", }, - "getSave": { + getSave: { "!doc": "获得某个存档内容", - "!type": "fn(index?: number, callback?: fn(data: ?))" + "!type": "fn(index?: number, callback?: fn(data: ?))", }, - "setViewport": { - "!doc": "设置视野范围
px,py: 左上角相对大地图的像素坐标,不需要为32倍数", - "!type": "fn(px?: number, py?: number)" + setViewport: { + "!doc": + "设置视野范围
px,py: 左上角相对大地图的像素坐标,不需要为32倍数", + "!type": "fn(px?: number, py?: number)", }, - "chooseReplayFile": { + chooseReplayFile: { "!doc": "选择录像文件", - "!type": "fn()" + "!type": "fn()", }, - "lockControl": { + lockControl: { "!doc": "锁定用户控制,常常用于事件处理", - "!type": "fn()" + "!type": "fn()", }, - "updateCheckBlock": { + updateCheckBlock: { "!doc": "更新领域、夹击、阻击的伤害地图", - "!type": "fn(floorId?: string)" + "!type": "fn(floorId?: string)", }, - "checkBlock": { + checkBlock: { "!doc": "检查并执行领域、夹击、阻击事件", - "!type": "fn()" + "!type": "fn()", }, - "clearAutomaticRouteNode": { + clearAutomaticRouteNode: { "!doc": "清除自动寻路路线", - "!type": "fn(x?: number, y?: number)" + "!type": "fn(x?: number, y?: number)", }, - "getFlag": { - "!doc": "读取一个flag变量
name: 变量名,支持中文
defaultValue: 当变量不存在时的返回值,可选(事件流中默认填0)。", - "!type": "fn(name: string, defaultValue?: ?)" + getFlag: { + "!doc": + "读取一个flag变量
name: 变量名,支持中文
defaultValue: 当变量不存在时的返回值,可选(事件流中默认填0)。", + "!type": "fn(name: string, defaultValue?: ?)", }, - "getNakedStatus": { + getNakedStatus: { "!doc": "获得勇士原始属性(无装备和衰弱影响)", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "nearHero": { - "!doc": "判定主角是否身处某个点的锯齿领域(取曼哈顿距离)
例如:core.nearHero(6, 6, 6); // 判定主角是否身处点(6,6)的半径为6的锯齿领域
x: 领域的中心横坐标
y: 领域的中心纵坐标
n: 领域的半径,不填视为1", - "!type": "fn(x: number, y: number, n?: number) -> bool" + nearHero: { + "!doc": + "判定主角是否身处某个点的锯齿领域(取曼哈顿距离)
例如:core.nearHero(6, 6, 6); // 判定主角是否身处点(6,6)的半径为6的锯齿领域
x: 领域的中心横坐标
y: 领域的中心纵坐标
n: 领域的半径,不填视为1", + "!type": "fn(x: number, y: number, n?: number) -> bool", }, - "stepReplay": { + stepReplay: { "!doc": "单步播放", - "!type": "fn()" + "!type": "fn()", }, - "hasSave": { + hasSave: { "!doc": "判断某个存档位是否存在存档", - "!type": "fn(index?: number) -> bool" + "!type": "fn(index?: number) -> bool", }, - "showStartAnimate": { - "!doc": "进入标题画面
例如:core.showStartAnimate(); // 重启游戏但不重置bgm
noAnimate: 可选,true表示不由黑屏淡入而是立即亮屏
callback: 可选,完全亮屏后的回调函数", - "!type": "fn(noAnimate?: bool, callback?: fn())" + showStartAnimate: { + "!doc": + "进入标题画面
例如:core.showStartAnimate(); // 重启游戏但不重置bgm
noAnimate: 可选,true表示不由黑屏淡入而是立即亮屏
callback: 可选,完全亮屏后的回调函数", + "!type": "fn(noAnimate?: bool, callback?: fn())", }, - "moveViewport": { + moveViewport: { "!doc": "移动视野范围", - "!type": "fn(x: number, y: number, moveMode?: string, time?: number, callback?: fn())" + "!type": + "fn(x: number, y: number, moveMode?: string, time?: number, callback?: fn())", }, - "syncLoad": { + syncLoad: { "!doc": "从服务器加载存档", - "!type": "fn()" + "!type": "fn()", }, - "setHeroMoveInterval": { + setHeroMoveInterval: { "!doc": "设置行走的效果动画", - "!type": "fn(callback?: fn())" + "!type": "fn(callback?: fn())", }, - "registerReplayAction": { - "!doc": "注册一个录像行为
name: 自定义名称,可用于注销使用
func: 具体执行录像的函数,可为一个函数或插件中的函数名;
需要接受一个action参数,代表录像回放时的下一个操作
func返回true代表成功处理了此录像行为,false代表没有处理此录像行为。", - "!type": "fn(name: string, func: fn(action?: string) -> bool)" + registerReplayAction: { + "!doc": + "注册一个录像行为
name: 自定义名称,可用于注销使用
func: 具体执行录像的函数,可为一个函数或插件中的函数名;
需要接受一个action参数,代表录像回放时的下一个操作
func返回true代表成功处理了此录像行为,false代表没有处理此录像行为。", + "!type": "fn(name: string, func: fn(action?: string) -> bool)", }, - "checkAutosave": { + checkAutosave: { "!doc": "实际将自动存档写入存储", - "!type": "fn()" + "!type": "fn()", }, - "resumeBgm": { + resumeBgm: { "!doc": "恢复背景音乐的播放
resumeTime: 从哪一秒开始恢复播放", - "!type": "fn(resumeTime?: number)" + "!type": "fn(resumeTime?: number)", }, - "setGameCanvasTranslate": { + setGameCanvasTranslate: { "!doc": "设置大地图的偏移量", - "!type": "fn(ctx: string|CanvasRenderingContext2D, x: number, y: number)" + "!type": + "fn(ctx: string|CanvasRenderingContext2D, x: number, y: number)", }, - "checkBgm": { + checkBgm: { "!doc": "检查bgm状态", - "!type": "fn()" + "!type": "fn()", }, - "setDisplayScale": { + setDisplayScale: { "!doc": "设置屏幕放缩", - "!type": "fn(delta: number)" + "!type": "fn(delta: number)", }, - "speedDownReplay": { + speedDownReplay: { "!doc": "减速播放", - "!type": "fn()" + "!type": "fn()", }, - "getRealStatus": { - "!doc": "计算主角的某个属性,包括百分比修正
例如:core.getRealStatus('atk'); // 计算主角的攻击力,包括百分比修正。战斗使用的就是这个值
name: 属性的英文名,请注意只能用于数值类属性哦,否则乘法会得到NaN", - "!type": "fn(name: string)" + getRealStatus: { + "!doc": + "计算主角的某个属性,包括百分比修正
例如:core.getRealStatus('atk'); // 计算主角的攻击力,包括百分比修正。战斗使用的就是这个值
name: 属性的英文名,请注意只能用于数值类属性哦,否则乘法会得到NaN", + "!type": "fn(name: string)", }, - "saveData": { + saveData: { "!doc": "存档到本地", - "!type": "fn()" + "!type": "fn()", }, - "unregisterAnimationFrame": { + unregisterAnimationFrame: { "!doc": "注销一个animationFrame", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "tryMoveDirectly": { - "!doc": "尝试瞬移,如果该点有图块/事件/阻激夹域捕则会瞬移到它旁边再走一步(不可踏入的话当然还是触发该点事件),这一步的方向优先和瞬移前主角的朝向一致
例如:core.tryMoveDirectly(6, 0); // 尝试瞬移到地图顶部的正中央,以样板0层为例,实际效果是瞬移到了上楼梯下面一格然后向上走一步并触发上楼事件
destX: 目标点的横坐标
destY: 目标点的纵坐标", - "!type": "fn(destX: number, destY: number)" + tryMoveDirectly: { + "!doc": + "尝试瞬移,如果该点有图块/事件/阻激夹域捕则会瞬移到它旁边再走一步(不可踏入的话当然还是触发该点事件),这一步的方向优先和瞬移前主角的朝向一致
例如:core.tryMoveDirectly(6, 0); // 尝试瞬移到地图顶部的正中央,以样板0层为例,实际效果是瞬移到了上楼梯下面一格然后向上走一步并触发上楼事件
destX: 目标点的横坐标
destY: 目标点的纵坐标", + "!type": "fn(destX: number, destY: number)", }, - "moveDirectly": { + moveDirectly: { "!doc": "瞬间移动", - "!type": "fn(destX?: number, destY?: number, ignoreSteps?: number)" + "!type": "fn(destX?: number, destY?: number, ignoreSteps?: number)", }, - "clearRouteFolding": { + clearRouteFolding: { "!doc": "清空录像折叠信息", - "!type": "fn()" + "!type": "fn()", }, - "checkRouteFolding": { + checkRouteFolding: { "!doc": "检查录像折叠信息", - "!type": "fn()" + "!type": "fn()", }, - "setSwitch": { + setSwitch: { "!doc": "设置某个独立开关", - "!type": "fn(x: number, y: number, floorId: string, name: string, value: ?)" + "!type": + "fn(x: number, y: number, floorId: string, name: string, value: ?)", }, - "getSwitch": { + getSwitch: { "!doc": "获得某个独立开关", - "!type": "fn(x: number, y: number, floorId: string, name: string, defaultValue?: ?)" + "!type": + "fn(x: number, y: number, floorId: string, name: string, defaultValue?: ?)", }, - "addSwitch": { + addSwitch: { "!doc": "增加某个独立开关", - "!type": "fn(x: number, y: number, floorId: string, name: string, value: number)" + "!type": + "fn(x: number, y: number, floorId: string, name: string, value: number)", }, - "removeSwitch": { + removeSwitch: { "!doc": "删除某个独立开关", - "!type": "fn(x: number, y: number, floorId: string, name: string)" + "!type": "fn(x: number, y: number, floorId: string, name: string)", }, - "removeSwitch": { + removeSwitch: { "!doc": "判定某个独立开关", - "!type": "fn(x: number, y: number, floorId: string, name: string) -> bool" - } + "!type": + "fn(x: number, y: number, floorId: string, name: string) -> bool", + }, }, - "icons": { + icons: { "!doc": "图标信息", - "getTilesetOffset": { + getTilesetOffset: { "!doc": "根据图块数字或ID获得所在的tileset和坐标信息", - "!type": "fn(id?: string) -> {image: ?, x: number, y: number}" + "!type": "fn(id?: string) -> {image: ?, x: number, y: number}", }, - "getClsFromId": { + getClsFromId: { "!doc": "根据ID获得其图标类型", - "!type": "fn(id?: string) -> string" + "!type": "fn(id?: string) -> string", }, - "getAllIconIds": { + getAllIconIds: { "!doc": "获得所有图标的ID", - "!type": "fn() -> [string]" + "!type": "fn() -> [string]", }, - "getIcons": { + getIcons: { "!doc": "获得所有图标类型", - "!type": "fn()" - } + "!type": "fn()", + }, }, - "items": { + items: { "!doc": "道具相关的函数", - "getEquip": { - "!doc": "检查主角某种类型的装备目前是什么
例如:core.getEquip(1) // 主角目前装备了什么盾牌
equipType: 装备类型,自然数
返回值:装备id,null表示未穿戴", - "!type": "fn(equipType: number) -> string" + getEquip: { + "!doc": + "检查主角某种类型的装备目前是什么
例如:core.getEquip(1) // 主角目前装备了什么盾牌
equipType: 装备类型,自然数
返回值:装备id,null表示未穿戴", + "!type": "fn(equipType: number) -> string", }, - "loadEquip": { - "!doc": "尝试穿上某件背包里面的装备并提示
例如:core.loadEquip('sword5') // 尝试装备上背包里面的神圣剑,无回调
equipId: 装备id
callback: 穿戴成功或失败后的回调函数", - "!type": "fn(equipId: string, callback?: fn())" + loadEquip: { + "!doc": + "尝试穿上某件背包里面的装备并提示
例如:core.loadEquip('sword5') // 尝试装备上背包里面的神圣剑,无回调
equipId: 装备id
callback: 穿戴成功或失败后的回调函数", + "!type": "fn(equipId: string, callback?: fn())", }, - "itemCount": { - "!doc": "统计某种道具的持有量
例如:core.itemCount('yellowKey') // 持有多少把黄钥匙
itemId: 道具id
返回值:该种道具的持有量,不包括已穿戴的装备", - "!type": "fn(itemId: string) -> number" + itemCount: { + "!doc": + "统计某种道具的持有量
例如:core.itemCount('yellowKey') // 持有多少把黄钥匙
itemId: 道具id
返回值:该种道具的持有量,不包括已穿戴的装备", + "!type": "fn(itemId: string) -> number", }, - "getItems": { + getItems: { "!doc": "获得所有道具", - "!type": "fn()" + "!type": "fn()", }, - "canUseItem": { - "!doc": "检查能否使用某种道具
例如:core.canUseItem('pickaxe') // 能否使用破墙镐
itemId: 道具id
返回值:true表示可以使用", - "!type": "fn(itemId: string) -> bool" + canUseItem: { + "!doc": + "检查能否使用某种道具
例如:core.canUseItem('pickaxe') // 能否使用破墙镐
itemId: 道具id
返回值:true表示可以使用", + "!type": "fn(itemId: string) -> bool", }, - "hasItem": { - "!doc": "检查主角是否持有某种道具(不包括已穿戴的装备)
例如:core.hasItem('yellowKey') // 主角是否持有黄钥匙
itemId: 道具id
返回值:true表示持有", - "!type": "fn(itemId: string) -> bool" + hasItem: { + "!doc": + "检查主角是否持有某种道具(不包括已穿戴的装备)
例如:core.hasItem('yellowKey') // 主角是否持有黄钥匙
itemId: 道具id
返回值:true表示持有", + "!type": "fn(itemId: string) -> bool", }, - "addItem": { - "!doc": "静默增减某种道具的持有量 不会更新游戏画面或是显示提示
例如:core.addItem('yellowKey', -2) // 没收两把黄钥匙
itemId: 道具id
itemNum: 增加量,负数表示没收", - "!type": "fn(itemId: string, itemNum?: number)" + addItem: { + "!doc": + "静默增减某种道具的持有量 不会更新游戏画面或是显示提示
例如:core.addItem('yellowKey', -2) // 没收两把黄钥匙
itemId: 道具id
itemNum: 增加量,负数表示没收", + "!type": "fn(itemId: string, itemNum?: number)", }, - "unloadEquip": { - "!doc": "脱下某个类型的装备
例如:core.unloadEquip(1) // 卸下盾牌,无回调
equipType: 装备类型编号,自然数
callback: 卸下装备后的回调函数", - "!type": "fn(equipType: number, callback?: fn())" + unloadEquip: { + "!doc": + "脱下某个类型的装备
例如:core.unloadEquip(1) // 卸下盾牌,无回调
equipType: 装备类型编号,自然数
callback: 卸下装备后的回调函数", + "!type": "fn(equipType: number, callback?: fn())", }, - "quickLoadEquip": { - "!doc": "快速换装
例如:core.quickLoadEquip(1) // 快速换上1号套装
index: 套装编号,自然数", - "!type": "fn(index: number)" + quickLoadEquip: { + "!doc": + "快速换装
例如:core.quickLoadEquip(1) // 快速换上1号套装
index: 套装编号,自然数", + "!type": "fn(index: number)", }, - "getItemEffect": { - "!doc": "即捡即用类的道具获得时的效果
例如:core.getItemEffect('redPotion', 10) // 执行获得10瓶红血的效果
itemId: 道具id
itemNum: 道具数量,可选,默认为1", - "!type": "fn(itemId: string, itemNum?: number)" + getItemEffect: { + "!doc": + "即捡即用类的道具获得时的效果
例如:core.getItemEffect('redPotion', 10) // 执行获得10瓶红血的效果
itemId: 道具id
itemNum: 道具数量,可选,默认为1", + "!type": "fn(itemId: string, itemNum?: number)", }, - "quickSaveEquip": { - "!doc": "保存当前套装
例如:core.quickSaveEquip(1) // 将当前套装保存为1号套装
index: 套装编号,自然数", - "!type": "fn(index: number)" + quickSaveEquip: { + "!doc": + "保存当前套装
例如:core.quickSaveEquip(1) // 将当前套装保存为1号套装
index: 套装编号,自然数", + "!type": "fn(index: number)", }, - "setItem": { - "!doc": "设置某种道具的持有量
例如:core.setItem('yellowKey', 3) // 设置黄钥匙为3把
itemId: 道具id
itemNum: 新的持有量,可选,自然数,默认为0", - "!type": "fn(itemId: string, itemNum?: number)" + setItem: { + "!doc": + "设置某种道具的持有量
例如:core.setItem('yellowKey', 3) // 设置黄钥匙为3把
itemId: 道具id
itemNum: 新的持有量,可选,自然数,默认为0", + "!type": "fn(itemId: string, itemNum?: number)", }, - "compareEquipment": { - "!doc": "比较两件(类型可不同)装备的优劣
例如:core.compareEquipment('sword5', 'shield5') // 比较神圣剑和神圣盾的优劣
compareEquipId: 装备甲的id
beComparedEquipId: 装备乙的id
返回值:两装备的各属性差,甲减乙,0省略", - "!type": "fn(compareEquipId: string, beComparedEquipId: string) -> {value: ?, percentage: ?}" + compareEquipment: { + "!doc": + "比较两件(类型可不同)装备的优劣
例如:core.compareEquipment('sword5', 'shield5') // 比较神圣剑和神圣盾的优劣
compareEquipId: 装备甲的id
beComparedEquipId: 装备乙的id
返回值:两装备的各属性差,甲减乙,0省略", + "!type": + "fn(compareEquipId: string, beComparedEquipId: string) -> {value: ?, percentage: ?}", }, - "removeItem": { + removeItem: { "!doc": "删除某个物品", - "!type": "fn(itemId?: string, itemNum?: number)" + "!type": "fn(itemId?: string, itemNum?: number)", }, - "getEquipTypeById": { - "!doc": "判定某件装备的类型
例如:core.getEquipTypeById('shield5') // 1(盾牌)
equipId: 装备id
返回值:类型编号,自然数", - "!type": "fn(equipId: string) -> number" + getEquipTypeById: { + "!doc": + "判定某件装备的类型
例如:core.getEquipTypeById('shield5') // 1(盾牌)
equipId: 装备id
返回值:类型编号,自然数", + "!type": "fn(equipId: string) -> number", }, - "getEquipTypeByName": { + getEquipTypeByName: { "!doc": "根据类型获得一个可用的装备孔", - "!type": "fn(name?: string)" + "!type": "fn(name?: string)", }, - "useItem": { - "!doc": "使用一个道具
例如:core.useItem('pickaxe', true) // 使用破墙镐,不计入录像,无回调
itemId: 道具id
noRoute: 是否不计入录像,快捷键使用的请填true,否则可省略
callback: 道具使用完毕或使用失败后的回调函数", - "!type": "fn(itemId: string, noRoute?: bool, callback?: fn())" + useItem: { + "!doc": + "使用一个道具
例如:core.useItem('pickaxe', true) // 使用破墙镐,不计入录像,无回调
itemId: 道具id
noRoute: 是否不计入录像,快捷键使用的请填true,否则可省略
callback: 道具使用完毕或使用失败后的回调函数", + "!type": "fn(itemId: string, noRoute?: bool, callback?: fn())", }, - "hasEquip": { - "!doc": "检查主角是否穿戴着某件装备
例如:core.hasEquip('sword5') // 主角是否装备了神圣剑
itemId: 装备id
返回值:true表示已装备", - "!type": "fn(itemId: string) -> bool" + hasEquip: { + "!doc": + "检查主角是否穿戴着某件装备
例如:core.hasEquip('sword5') // 主角是否装备了神圣剑
itemId: 装备id
返回值:true表示已装备", + "!type": "fn(itemId: string) -> bool", }, - "getItemEffectTip": { - "!doc": "即捡即用类的道具获得时的额外提示
例如:core.getItemEffectTip(redPotion) // (获得 红血瓶)',生命+100'
itemId: 道具id
返回值:图块属性itemEffectTip的内容", - "!type": "fn(itemId: string) -> string" + getItemEffectTip: { + "!doc": + "即捡即用类的道具获得时的额外提示
例如:core.getItemEffectTip(redPotion) // (获得 红血瓶)',生命+100'
itemId: 道具id
返回值:图块属性itemEffectTip的内容", + "!type": "fn(itemId: string) -> string", }, - "canEquip": { - "!doc": "检查能否穿上某件装备
例如:core.canEquip('sword5', true) // 主角可以装备神圣剑吗,如果不能会有提示
equipId: 装备id
hint: 无法穿上时是否提示(比如是因为未持有还是别的什么原因)
返回值:true表示可以穿上,false表示无法穿上", - "!type": "fn(equipId: string, hint?: bool) -> bool" + canEquip: { + "!doc": + "检查能否穿上某件装备
例如:core.canEquip('sword5', true) // 主角可以装备神圣剑吗,如果不能会有提示
equipId: 装备id
hint: 无法穿上时是否提示(比如是因为未持有还是别的什么原因)
返回值:true表示可以穿上,false表示无法穿上", + "!type": "fn(equipId: string, hint?: bool) -> bool", + }, + setEquip: { + "!doc": + "设置某个装备的属性并计入存档
例如:core.setEquip('sword1', 'value', 'atk', 300, '+='); // 设置铁剑的攻击力数值再加300
equipId: 装备id
valueType: 增幅类型,只能是value(数值)或percentage(百分比)
name: 要修改的属性名称,如atk
value: 要修改到的属性数值
operator: 操作符,可选,如+=表示在原始值上增加
prefix: 独立开关前缀,一般不需要", + "!type": + "fn(equipId: string, valueType: string, name: string, value: ?, operator?: string, prefix?: string)", }, - "setEquip": { - "!doc": "设置某个装备的属性并计入存档
例如:core.setEquip('sword1', 'value', 'atk', 300, '+='); // 设置铁剑的攻击力数值再加300
equipId: 装备id
valueType: 增幅类型,只能是value(数值)或percentage(百分比)
name: 要修改的属性名称,如atk
value: 要修改到的属性数值
operator: 操作符,可选,如+=表示在原始值上增加
prefix: 独立开关前缀,一般不需要", - "!type": "fn(equipId: string, valueType: string, name: string, value: ?, operator?: string, prefix?: string)" - } }, - "utils": { + utils: { "!doc": "工具函数库,里面有各个样板中使用到的工具函数。", - "scan": { + scan: { "!doc": "朝向到x,y映射", - "up": { - "x": "number", - "y": "number" + up: { + x: "number", + y: "number", }, - "down": { - "x": "number", - "y": "number" + down: { + x: "number", + y: "number", }, - "left": { - "x": "number", - "y": "number" + left: { + x: "number", + y: "number", + }, + right: { + x: "number", + y: "number", }, - "right": { - "x": "number", - "y": "number" - } }, - "applyEasing": { + applyEasing: { "!doc": "获得变速移动曲线", - "!type": "fn(mode?: string) -> fn(t: number) -> number" + "!type": "fn(mode?: string) -> fn(t: number) -> number", }, - "clamp": { - "!doc": "将x限定在[a,b]区间内,注意a和b可交换
例如:core.clamp(1200, 1, 1000); // 1000
x: 原始值,!x为true时x一律视为0
a: 下限值,大于b将导致与b交换
b: 上限值,小于a将导致与a交换", - "!type": "fn(x: number, a: number, b: number) -> number" + clamp: { + "!doc": + "将x限定在[a,b]区间内,注意a和b可交换
例如:core.clamp(1200, 1, 1000); // 1000
x: 原始值,!x为true时x一律视为0
a: 下限值,大于b将导致与b交换
b: 上限值,小于a将导致与a交换", + "!type": "fn(x: number, a: number, b: number) -> number", }, - "rand": { - "!doc": "不支持SL的随机数
例如:1 + core.rand(6); // 随机生成一个小于7的正整数,模拟骰子的效果
num: 填正数表示生成小于num的随机自然数,否则生成小于1的随机正数
返回值:随机数,即使读档也不会改变结果", - "!type": "fn(num?: number) -> number" + rand: { + "!doc": + "不支持SL的随机数
例如:1 + core.rand(6); // 随机生成一个小于7的正整数,模拟骰子的效果
num: 填正数表示生成小于num的随机自然数,否则生成小于1的随机正数
返回值:随机数,即使读档也不会改变结果", + "!type": "fn(num?: number) -> number", }, - "clone": { - "!doc": "深拷贝一个对象(函数将原样返回)
例如:core.clone(core.status.hero, (name, value) => (name == 'items' || typeof value == 'number'), false); // 深拷贝主角的属性和道具
data: 待拷贝对象
filter: 过滤器,可选,表示data为数组或对象时拷贝哪些项或属性,true表示拷贝
recursion: 过滤器是否递归,可选。true表示过滤器也被递归
返回值:拷贝的结果,注意函数将原样返回", - "!type": "fn(data?: ?, filter?: fn(name: string, value: ?) -> bool, recursion?: bool)" + clone: { + "!doc": + "深拷贝一个对象(函数将原样返回)
例如:core.clone(core.status.hero, (name, value) => (name == 'items' || typeof value == 'number'), false); // 深拷贝主角的属性和道具
data: 待拷贝对象
filter: 过滤器,可选,表示data为数组或对象时拷贝哪些项或属性,true表示拷贝
recursion: 过滤器是否递归,可选。true表示过滤器也被递归
返回值:拷贝的结果,注意函数将原样返回", + "!type": + "fn(data?: ?, filter?: fn(name: string, value: ?) -> bool, recursion?: bool)", }, - "cloneArray": { - "!doc": "深拷贝一个1D或2D数组对象
例如:core.cloneArray(core.status.thisMap.map)", - "!type": "fn(data?: [number]|[[number]]) -> [number]|[[number]]" + cloneArray: { + "!doc": + "深拷贝一个1D或2D数组对象
例如:core.cloneArray(core.status.thisMap.map)", + "!type": "fn(data?: [number]|[[number]]) -> [number]|[[number]]", }, - "setLocalForage": { + setLocalForage: { "!doc": "往数据库写入一段数据", - "!type": "fn(key: string, value?: ?, successCallback?: fn(), errorCallback?: fn())" + "!type": + "fn(key: string, value?: ?, successCallback?: fn(), errorCallback?: fn())", }, - "getGlobal": { - "!doc": "读取一个全局存储,适用于global:xxx,支持录像。
例如:if (core.getGlobal('一周目已通关', false) === true) core.getItem('dagger'); // 二周目游戏进行到此处时会获得一把屠龙匕首
key: 全局变量名称,支持中文
defaultValue: 可选,当此全局变量不存在或值为null、undefined时,用此值代替
返回值:全局变量的值", - "!type": "fn(key: string, defaultValue?: ?)" + getGlobal: { + "!doc": + "读取一个全局存储,适用于global:xxx,支持录像。
例如:if (core.getGlobal('一周目已通关', false) === true) core.getItem('dagger'); // 二周目游戏进行到此处时会获得一把屠龙匕首
key: 全局变量名称,支持中文
defaultValue: 可选,当此全局变量不存在或值为null、undefined时,用此值代替
返回值:全局变量的值", + "!type": "fn(key: string, defaultValue?: ?)", }, - "replaceText": { - "!doc": "将一段文字中的${}(表达式)进行替换。
例如:core.replaceText('衬衫的价格是${status:hp}镑${item:yellowKey}便士。'); // 把主角的生命值和持有的黄钥匙数量代入这句话
text: 模板字符串,可以使用${}计算js表达式,支持“状态、物品、变量、独立开关、全局存储、图块id、图块类型、敌人数据、装备id”等量参与运算
返回值:替换完毕后的字符串", - "!type": "fn(text: string, prefix?: string) -> string" + replaceText: { + "!doc": + "将一段文字中的${}(表达式)进行替换。
例如:core.replaceText('衬衫的价格是${status:hp}镑${item:yellowKey}便士。'); // 把主角的生命值和持有的黄钥匙数量代入这句话
text: 模板字符串,可以使用${}计算js表达式,支持“状态、物品、变量、独立开关、全局存储、图块id、图块类型、敌人数据、装备id”等量参与运算
返回值:替换完毕后的字符串", + "!type": "fn(text: string, prefix?: string) -> string", }, - "removeLocalStorage": { + removeLocalStorage: { "!doc": "移除本地存储", - "!type": "fn(key: string)" + "!type": "fn(key: string)", }, - "unzip": { + unzip: { "!doc": "解压一段内容", - "!type": "fn(blobOrUrl?: ?, success?: fn(data: ?), error?: fn(error: string), convertToText?: bool, onprogress?: fn(loaded: number, total: number))" + "!type": + "fn(blobOrUrl?: ?, success?: fn(data: ?), error?: fn(error: string), convertToText?: bool, onprogress?: fn(loaded: number, total: number))", }, - "formatTime": { + formatTime: { "!doc": "格式化时间", - "!type": "fn(time: number) -> string" + "!type": "fn(time: number) -> string", }, - "readFile": { - "!doc": "尝试请求读取一个本地文件内容 [异步]
success: 成功后的回调
error: 失败后的回调
readType: 不设置则以文本读取,否则以DataUrl形式读取", - "!type": "fn(success?: fn(data: string), error?: fn(message: string), readType?: bool)" + readFile: { + "!doc": + "尝试请求读取一个本地文件内容 [异步]
success: 成功后的回调
error: 失败后的回调
readType: 不设置则以文本读取,否则以DataUrl形式读取", + "!type": + "fn(success?: fn(data: string), error?: fn(message: string), readType?: bool)", }, - "readFileContent": { + readFileContent: { "!doc": "文件读取完毕后的内容处理 [异步]", - "!type": "fn(content: string)" + "!type": "fn(content: string)", }, - "formatDate": { + formatDate: { "!doc": "格式化日期为字符串", - "!type": "fn(date: ?) -> string" + "!type": "fn(date: ?) -> string", }, - "download": { - "!doc": "弹窗请求下载一个文本文件
例如:core.download('route.txt', JSON.stringify(core.status.route)); // 弹窗请求下载录像
filename: 文件名
content: 文件内容", - "!type": "fn(filename: string, content: string)" + download: { + "!doc": + "弹窗请求下载一个文本文件
例如:core.download('route.txt', JSON.stringify(core.status.route)); // 弹窗请求下载录像
filename: 文件名
content: 文件内容", + "!type": "fn(filename: string, content: string)", }, - "encodeBase64": { - "!doc": "base64加密
例如:core.encodeBase64('abcd'); // 'YWJjZA=='
str: 明文
返回值:密文", - "!type": "fn(str: string) -> string" + encodeBase64: { + "!doc": + "base64加密
例如:core.encodeBase64('abcd'); // 'YWJjZA=='
str: 明文
返回值:密文", + "!type": "fn(str: string) -> string", }, - "strlen": { - "!doc": "求字符串的国标码字节数,也可用于等宽字体下文本的宽度测算。请注意样板的默认字体Verdana不是等宽字体
例如:core.strlen('无敌ad'); // 6
str: 待测字符串
返回值:字符串的国标码字节数,每个汉字为2,每个ASCII字符为1", - "!type": "fn(str: string) -> number" + strlen: { + "!doc": + "求字符串的国标码字节数,也可用于等宽字体下文本的宽度测算。请注意样板的默认字体Verdana不是等宽字体
例如:core.strlen('无敌ad'); // 6
str: 待测字符串
返回值:字符串的国标码字节数,每个汉字为2,每个ASCII字符为1", + "!type": "fn(str: string) -> number", }, - "myprompt": { + myprompt: { "!doc": "让用户输入一段文字", - "!type": "fn(hint: string, value: string, callback?: fn(data?: string))" + "!type": + "fn(hint: string, value: string, callback?: fn(data?: string))", }, - "getCookie": { + getCookie: { "!doc": "访问浏览器cookie", - "!type": "fn(name: string) -> string" + "!type": "fn(name: string) -> string", }, - "decodeRoute": { - "!doc": "录像解压的最后一步,即一压的逆过程
例如:core.decodeRoute(core.encodeRoute(core.status.route)); // 一压当前录像再解压-_-|
route: 录像解压倒数第二步的结果,即一压的结果
返回值:原始录像", - "!type": "fn(route: string) -> [string]" + decodeRoute: { + "!doc": + "录像解压的最后一步,即一压的逆过程
例如:core.decodeRoute(core.encodeRoute(core.status.route)); // 一压当前录像再解压-_-|
route: 录像解压倒数第二步的结果,即一压的结果
返回值:原始录像", + "!type": "fn(route: string) -> [string]", }, - "formatDate2": { + formatDate2: { "!doc": "格式化日期为最简字符串", - "!type": "fn(date: ?) -> string" + "!type": "fn(date: ?) -> string", }, - "unshift": { - "!doc": "将b(可以是另一个数组)插入数组a的开头,此函数用于弥补a.unshift(b)中b只能是单项的不足。
例如:core.unshift(todo, {type: 'unfollow'}); // 在事件指令数组todo的开头插入“取消所有跟随者”指令
a: 原数组
b: 待插入的新首项或前缀数组
返回值:插入完毕后的新数组,它是改变原数组a本身得到的", - "!type": "fn(a: [?], b: ?) -> [?]" + unshift: { + "!doc": + "将b(可以是另一个数组)插入数组a的开头,此函数用于弥补a.unshift(b)中b只能是单项的不足。
例如:core.unshift(todo, {type: 'unfollow'}); // 在事件指令数组todo的开头插入“取消所有跟随者”指令
a: 原数组
b: 待插入的新首项或前缀数组
返回值:插入完毕后的新数组,它是改变原数组a本身得到的", + "!type": "fn(a: [?], b: ?) -> [?]", }, - "same": { - "!doc": "判定深层相等, 会逐层比较每个元素
例如:core.same(['1', 2], ['1', 2]); // true", - "!type": "fn(a?: ?, b?: ?) -> bool" + same: { + "!doc": + "判定深层相等, 会逐层比较每个元素
例如:core.same(['1', 2], ['1', 2]); // true", + "!type": "fn(a?: ?, b?: ?) -> bool", }, - "setTwoDigits": { + setTwoDigits: { "!doc": "两位数显示", - "!type": "fn(x: number) -> string" + "!type": "fn(x: number) -> string", }, - "splitImage": { - "!doc": "等比例切分一张图片
例如:core.splitImage(core.material.images.images['npc48.png'], 32, 48); // 把npc48.png切分成若干32×48px的小人
image: 图片名(支持映射前的中文名)或图片对象(参见上面的例子),获取不到时返回[]
width: 子图的宽度,单位为像素。原图总宽度必须是其倍数,不填视为32
height: 子图的高度,单位为像素。原图总高度必须是其倍数,不填视为正方形
返回值:子图组成的数组,在原图中呈先行后列,从左到右、从上到下排列。", - "!type": "fn(image?: string|image, width?: number, height?: number) -> [image]" + splitImage: { + "!doc": + "等比例切分一张图片
例如:core.splitImage(core.material.images.images['npc48.png'], 32, 48); // 把npc48.png切分成若干32×48px的小人
image: 图片名(支持映射前的中文名)或图片对象(参见上面的例子),获取不到时返回[]
width: 子图的宽度,单位为像素。原图总宽度必须是其倍数,不填视为32
height: 子图的高度,单位为像素。原图总高度必须是其倍数,不填视为正方形
返回值:子图组成的数组,在原图中呈先行后列,从左到右、从上到下排列。", + "!type": + "fn(image?: string|image, width?: number, height?: number) -> [image]", }, - "decompress": { + decompress: { "!doc": "解压缩一个数据", - "!type": "fn(value: ?)" + "!type": "fn(value: ?)", }, - "showWithAnimate": { + showWithAnimate: { "!doc": "动画显示某对象", - "!type": "fn(obj?: ?, speed?: number, callback?: fn())" + "!type": "fn(obj?: ?, speed?: number, callback?: fn())", }, - "subarray": { - "!doc": "判定一个数组是否为另一个数组的前缀,用于录像接续播放。请注意函数名没有大写字母
例如:core.subarray(['ad', '米库', '小精灵', '小破草', '小艾'], ['ad', '米库', '小精灵']); // ['小破草', '小艾']
a: 可能的母数组,不填或比b短将返回null
b: 可能的前缀,不填或比a长将返回null
返回值:如果b不是a的前缀将返回null,否则将返回a去掉此前缀后的剩余数组", - "!type": "fn(a?: [?], b?: [?]) -> [?]|null" + subarray: { + "!doc": + "判定一个数组是否为另一个数组的前缀,用于录像接续播放。请注意函数名没有大写字母
例如:core.subarray(['ad', '米库', '小精灵', '小破草', '小艾'], ['ad', '米库', '小精灵']); // ['小破草', '小艾']
a: 可能的母数组,不填或比b短将返回null
b: 可能的前缀,不填或比a长将返回null
返回值:如果b不是a的前缀将返回null,否则将返回a去掉此前缀后的剩余数组", + "!type": "fn(a?: [?], b?: [?]) -> [?]|null", }, - "turnDirection": { - "!doc": "计算应当转向某个方向
turn: 转向的方向,可为 up,down,left,right,:left,:right,:back 七种
direction: 当前方向", - "!type": "fn(turn: string, direction?: string) -> string" + turnDirection: { + "!doc": + "计算应当转向某个方向
turn: 转向的方向,可为 up,down,left,right,:left,:right,:back 七种
direction: 当前方向", + "!type": "fn(turn: string, direction?: string) -> string", }, - "myconfirm": { - "!doc": "显示确认框,类似core.drawConfirmBox(),但不打断事件流
例如:core.myconfirm('重启游戏?', core.restart); // 弹窗询问玩家是否重启游戏
hint: 弹窗的内容,支持 ${} 语法
yesCallback: 确定后的回调函数
noCallback: 取消后的回调函数,可选", - "!type": "fn(hint: string, yesCallback?: fn(), noCallback?: fn())" + myconfirm: { + "!doc": + "显示确认框,类似core.drawConfirmBox(),但不打断事件流
例如:core.myconfirm('重启游戏?', core.restart); // 弹窗询问玩家是否重启游戏
hint: 弹窗的内容,支持 ${} 语法
yesCallback: 确定后的回调函数
noCallback: 取消后的回调函数,可选", + "!type": "fn(hint: string, yesCallback?: fn(), noCallback?: fn())", }, - "calValue": { - "!doc": "计算一个表达式的值,支持status:xxx等的计算。
例如:core.calValue('status:hp + status:def'); // 计算主角的生命值加防御力
value: 待求值的表达式
prefix: 独立开关前缀,一般可省略
返回值:求出的值", - "!type": "fn(value: string, prefix?: string)" + calValue: { + "!doc": + "计算一个表达式的值,支持status:xxx等的计算。
例如:core.calValue('status:hp + status:def'); // 计算主角的生命值加防御力
value: 待求值的表达式
prefix: 独立开关前缀,一般可省略
返回值:求出的值", + "!type": "fn(value: string, prefix?: string)", }, - "encodeRoute": { - "!doc": "录像压缩缩
例如:core.encodeRoute(core.status.route); // 压缩当前录像
route: 原始录像,自定义内容(不予压缩,原样写入)必须由0-9A-Za-z和下划线、冒号组成,所以中文和数组需要用JSON.stringify预处理再base64压缩才能交由一压
返回值:一压的结果", - "!type": "fn(route: [string]) -> string" + encodeRoute: { + "!doc": + "录像压缩缩
例如:core.encodeRoute(core.status.route); // 压缩当前录像
route: 原始录像,自定义内容(不予压缩,原样写入)必须由0-9A-Za-z和下划线、冒号组成,所以中文和数组需要用JSON.stringify预处理再base64压缩才能交由一压
返回值:一压的结果", + "!type": "fn(route: [string]) -> string", }, - "decodeBase64": { - "!doc": "base64解密
例如:core.decodeBase64('YWJjZA=='); // \"abcd\"
str: 密文
返回值:明文", - "!type": "fn(str: string) -> string" + decodeBase64: { + "!doc": + "base64解密
例如:core.decodeBase64('YWJjZA=='); // \"abcd\"
str: 密文
返回值:明文", + "!type": "fn(str: string) -> string", }, - "http": { - "!doc": "发送一个HTTP请求 [异步]
type: 请求类型,只能为GET或POST
url: 目标地址
formData: 如果是POST请求则为表单数据
success: 成功后的回调
error: 失败后的回调", - "!type": "fn(type: string, url: string, formData: ?, success?: fn(data: string), error?: fn(message: string), mimeType?: string, responseType?: string, onprogress?: fn(loaded: number, total: number))" + http: { + "!doc": + "发送一个HTTP请求 [异步]
type: 请求类型,只能为GET或POST
url: 目标地址
formData: 如果是POST请求则为表单数据
success: 成功后的回调
error: 失败后的回调", + "!type": + "fn(type: string, url: string, formData: ?, success?: fn(data: string), error?: fn(message: string), mimeType?: string, responseType?: string, onprogress?: fn(loaded: number, total: number))", }, - "getGuid": { + getGuid: { "!doc": "获得或生成浏览器唯一的guid", - "!type": "fn() -> string" + "!type": "fn() -> string", }, - "getLocalStorage": { + getLocalStorage: { "!doc": "获得本地存储", - "!type": "fn(key: string, defaultValue?: ?)" + "!type": "fn(key: string, defaultValue?: ?)", }, - "arrayToRGB": { - "!doc": "颜色数组转字符串
例如:core.arrayToRGB([102, 204, 255]); // \"#66ccff\"
color: 一行三列的数组,必须为不大于255的自然数
返回值:该颜色的#xxxxxx字符串表示", - "!type": "fn(color: [number]) -> string" + arrayToRGB: { + "!doc": + '颜色数组转字符串
例如:core.arrayToRGB([102, 204, 255]); // "#66ccff"
color: 一行三列的数组,必须为不大于255的自然数
返回值:该颜色的#xxxxxx字符串表示', + "!type": "fn(color: [number]) -> string", }, - "arrayToRGBA": { - "!doc": "颜色数组转字符串
例如:core.arrayToRGBA([102, 204, 255, 0.3]); // \"rgba(102,204,255,0.3)\"
color: 一行三列或一行四列的数组,前三个元素必须为不大于255的自然数。第四个元素(如果有)必须为0或不大于1的数字,第四个元素不填视为1
返回值:该颜色的rgba(...)字符串表示", - "!type": "fn(color: [number]) -> string" + arrayToRGBA: { + "!doc": + '颜色数组转字符串
例如:core.arrayToRGBA([102, 204, 255, 0.3]); // "rgba(102,204,255,0.3)"
color: 一行三列或一行四列的数组,前三个元素必须为不大于255的自然数。第四个元素(如果有)必须为0或不大于1的数字,第四个元素不填视为1
返回值:该颜色的rgba(...)字符串表示', + "!type": "fn(color: [number]) -> string", }, - "formatBigNumber": { - "!doc": "大数字格式化,单位为10000的倍数(w,e,z,j,g),末尾四舍五入
例如:core.formatBigNumber(123456789, false); // \"12346w\"
x: 原数字
onMap: 可选,true表示用于地图显伤,结果总字符数最多为5,否则最多为6
返回值:格式化结果", - "!type": "fn(x: number, onMap?: bool) -> string" + formatBigNumber: { + "!doc": + '大数字格式化,单位为10000的倍数(w,e,z,j,g),末尾四舍五入
例如:core.formatBigNumber(123456789, false); // "12346w"
x: 原数字
onMap: 可选,true表示用于地图显伤,结果总字符数最多为5,否则最多为6
返回值:格式化结果', + "!type": "fn(x: number, onMap?: bool) -> string", }, - "removeLocalForage": { + removeLocalForage: { "!doc": "移除本地数据库的数据", - "!type": "fn(key: string, successCallback?: fn(), errorCallback?: fn())" + "!type": + "fn(key: string, successCallback?: fn(), errorCallback?: fn())", }, - "matchWildcard": { - "!doc": "通配符匹配,用于搜索图块等批量处理。
例如:core.playSound(core.matchWildcard('*Key', itemId) ? 'item.mp3' : 'door.mp3'); // 判断捡到的是钥匙还是别的道具,从而播放不同的音效
pattern: 模式串,每个星号表示任意多个(0个起)字符
string: 待测串
返回值:true表示匹配成功,false表示匹配失败", - "!type": "fn(pattern: string, string: string) -> bool" + matchWildcard: { + "!doc": + "通配符匹配,用于搜索图块等批量处理。
例如:core.playSound(core.matchWildcard('*Key', itemId) ? 'item.opus' : 'door.opus'); // 判断捡到的是钥匙还是别的道具,从而播放不同的音效
pattern: 模式串,每个星号表示任意多个(0个起)字符
string: 待测串
返回值:true表示匹配成功,false表示匹配失败", + "!type": "fn(pattern: string, string: string) -> bool", }, - "setLocalStorage": { + setLocalStorage: { "!doc": "设置本地存储", - "!type": "fn(key: string, value?: ?)" + "!type": "fn(key: string, value?: ?)", }, - "hideWithAnimate": { + hideWithAnimate: { "!doc": "动画使某对象消失", - "!type": "fn(obj?: ?, speed?: number, callback?: fn())" + "!type": "fn(obj?: ?, speed?: number, callback?: fn())", }, - "copy": { + copy: { "!doc": "尝试复制一段文本到剪切板。", - "!type": "fn(data: string) -> bool" + "!type": "fn(data: string) -> bool", }, - "isset": { - "!doc": "判断一个值是否不为null,undefined和NaN
例如:core.isset(0/0); // false,因为0/0等于NaN
v: 待测值,可选
返回值:false表示待测值为null、undefined、NaN或未填写,true表示为其他值。", - "!type": "fn(v?: ?) -> bool" + isset: { + "!doc": + "判断一个值是否不为null,undefined和NaN
例如:core.isset(0/0); // false,因为0/0等于NaN
v: 待测值,可选
返回值:false表示待测值为null、undefined、NaN或未填写,true表示为其他值。", + "!type": "fn(v?: ?) -> bool", }, - "replaceValue": { - "!doc": "对一个表达式中的特殊规则进行替换,如status:xxx等。
例如:core.replaceValue('status:atk+item:yellowKey'); // 把这两个冒号表达式替换为core.getStatus('hp')和core.itemCount('yellowKey')这样的函数调用
value: 模板字符串,注意独立开关不会被替换
返回值:替换完毕后的字符串", - "!type": "fn(value: string) -> string" + replaceValue: { + "!doc": + "对一个表达式中的特殊规则进行替换,如status:xxx等。
例如:core.replaceValue('status:atk+item:yellowKey'); // 把这两个冒号表达式替换为core.getStatus('hp')和core.itemCount('yellowKey')这样的函数调用
value: 模板字符串,注意独立开关不会被替换
返回值:替换完毕后的字符串", + "!type": "fn(value: string) -> string", }, - "getLocalForage": { + getLocalForage: { "!doc": "从本地数据库读出一段数据", - "!type": "fn(key: string, defaultValue?: ?, successCallback?: fn(data: ?), errorCallback?: fn())" + "!type": + "fn(key: string, defaultValue?: ?, successCallback?: fn(data: ?), errorCallback?: fn())", }, - "inArray": { - "!doc": "判定array是不是一个数组,以及element是否在该数组中。
array: 可能的数组,不为数组或不填将导致返回值为false
element: 待查找的元素
返回值:如果array为数组且具有element这项,就返回true,否则返回false", - "!type": "fn(array?: ?, element?: ?) -> bool" + inArray: { + "!doc": + "判定array是不是一个数组,以及element是否在该数组中。
array: 可能的数组,不为数组或不填将导致返回值为false
element: 待查找的元素
返回值:如果array为数组且具有element这项,就返回true,否则返回false", + "!type": "fn(array?: ?, element?: ?) -> bool", }, - "setGlobal": { - "!doc": "设置一个全局存储,适用于global:xxx,录像播放时将忽略此函数。
例如:core.setBlobal('一周目已通关', true); // 设置全局存储“一周目已通关”为true,方便二周目游戏中的新要素。
key: 全局变量名称,支持中文
value: 全局变量的新值,不填或null表示清除此全局存储", - "!type": "fn(key: string, value?: ?)" + setGlobal: { + "!doc": + "设置一个全局存储,适用于global:xxx,录像播放时将忽略此函数。
例如:core.setBlobal('一周目已通关', true); // 设置全局存储“一周目已通关”为true,方便二周目游戏中的新要素。
key: 全局变量名称,支持中文
value: 全局变量的新值,不填或null表示清除此全局存储", + "!type": "fn(key: string, value?: ?)", }, - "rand2": { - "!doc": "支持SL的随机数,并计入录像
例如:1 + core.rand2(6); // 随机生成一个小于7的正整数,模拟骰子的效果
num: 正整数,0或不填会被视为2147483648
返回值:属于 [0, num) 的随机数", - "!type": "fn(num?: number) -> number" + rand2: { + "!doc": + "支持SL的随机数,并计入录像
例如:1 + core.rand2(6); // 随机生成一个小于7的正整数,模拟骰子的效果
num: 正整数,0或不填会被视为2147483648
返回值:属于 [0, num) 的随机数", + "!type": "fn(num?: number) -> number", }, - "setStatusBarInnerHTML": { - "!doc": "填写非自绘状态栏
例如:core.setStatusBarInnerHTML('hp', core.status.hero.hp, 'color: #66CCFF'); // 更新状态栏中的主角生命,使用加载画面的宣传色
name: 状态栏项的名称,如'hp', 'atk', 'def'等。必须是core.statusBar中的一个合法项
value: 要填写的内容,大数字会被格式化为至多6个字符,无中文的内容会被自动设为斜体
css: 额外的css样式,可选。如更改颜色等", - "!type": "fn(name: string, value: ?, css?: string)" + setStatusBarInnerHTML: { + "!doc": + "填写非自绘状态栏
例如:core.setStatusBarInnerHTML('hp', core.status.hero.hp, 'color: #66CCFF'); // 更新状态栏中的主角生命,使用加载画面的宣传色
name: 状态栏项的名称,如'hp', 'atk', 'def'等。必须是core.statusBar中的一个合法项
value: 要填写的内容,大数字会被格式化为至多6个字符,无中文的内容会被自动设为斜体
css: 额外的css样式,可选。如更改颜色等", + "!type": "fn(name: string, value: ?, css?: string)", }, - "matchRegex": { + matchRegex: { "!doc": "是否满足正则表达式", - "!type": "fn(pattern: string, string: string) -> string" + "!type": "fn(pattern: string, string: string) -> string", }, - "push": { - "!doc": "将b(可以是另一个数组)插入数组a的末尾,此函数用于弥补a.push(b)中b只能是单项的不足。
例如:core.push(todo, {type: 'unfollow'}); // 在事件指令数组todo的末尾插入“取消所有跟随者”指令
a: 原数组
b: 待插入的新末项或后缀数组
返回值:插入完毕后的新数组,它是改变原数组a本身得到的", - "!type": "fn(a: [?], b: ?) -> [?]" + push: { + "!doc": + "将b(可以是另一个数组)插入数组a的末尾,此函数用于弥补a.push(b)中b只能是单项的不足。
例如:core.push(todo, {type: 'unfollow'}); // 在事件指令数组todo的末尾插入“取消所有跟随者”指令
a: 原数组
b: 待插入的新末项或后缀数组
返回值:插入完毕后的新数组,它是改变原数组a本身得到的", + "!type": "fn(a: [?], b: ?) -> [?]", }, - "formatSize": { + formatSize: { "!doc": "格式化文件大小", - "!type": "fn(size: number) -> string" - } + "!type": "fn(size: number) -> string", + }, }, - "actions": { + actions: { "!doc": "主要是处理一些和用户交互相关的内容。", - "onup": { + onup: { "!doc": "当点击(触摸)事件放开时", - "!type": "fn(loc: {x: number, y: number, size: number})" + "!type": "fn(loc: {x: number, y: number, size: number})", }, - "pressKey": { + pressKey: { "!doc": "按住某个键时", - "!type": "fn(keyCode: number)" + "!type": "fn(keyCode: number)", }, - "keyUp": { + keyUp: { "!doc": "根据放开键的code来执行一系列操作", - "!type": "fn(keyCode: number, altKey?: bool, fromReplay?: bool)" + "!type": "fn(keyCode: number, altKey?: bool, fromReplay?: bool)", }, - "ondown": { + ondown: { "!doc": "点击(触摸)事件按下时", - "!type": "fn(loc: {x: number, y: number, size: number})" + "!type": "fn(loc: {x: number, y: number, size: number})", }, - "registerAction": { - "!doc": "此函数将注册一个用户交互行为。
action: 要注册的交互类型,如 ondown, onclick, keyDown 等等。
name: 你的自定义名称,可被注销使用;同名重复注册将后者覆盖前者。
func: 执行函数。
如果func返回true,则不会再继续执行其他的交互函数;否则会继续执行其他的交互函数。
priority: 优先级;优先级高的将会被执行。此项可不填,默认为0", - "!type": "fn(action: string, name: string, func: string|fn(params: ?), priority?: number)" + registerAction: { + "!doc": + "此函数将注册一个用户交互行为。
action: 要注册的交互类型,如 ondown, onclick, keyDown 等等。
name: 你的自定义名称,可被注销使用;同名重复注册将后者覆盖前者。
func: 执行函数。
如果func返回true,则不会再继续执行其他的交互函数;否则会继续执行其他的交互函数。
priority: 优先级;优先级高的将会被执行。此项可不填,默认为0", + "!type": + "fn(action: string, name: string, func: string|fn(params: ?), priority?: number)", }, - "onkeyDown": { + onkeyDown: { "!doc": "按下某个键时", - "!type": "fn(e: Event)" + "!type": "fn(e: Event)", }, - "keyDown": { + keyDown: { "!doc": "根据按下键的code来执行一系列操作", - "!type": "fn(keyCode: number)" + "!type": "fn(keyCode: number)", }, - "onStatusBarClick": { + onStatusBarClick: { "!doc": "点击自绘状态栏时", - "!type": "fn(e?: Event)" + "!type": "fn(e?: Event)", }, - "longClick": { + longClick: { "!doc": "长按", - "!type": "fn(x: number, y: number, px: number, py: number, fromEvent?: bool)" + "!type": + "fn(x: number, y: number, px: number, py: number, fromEvent?: bool)", }, - "unregisterAction": { + unregisterAction: { "!doc": "注销一个用户交互行为", - "!type": "fn(action: string, name: string)" + "!type": "fn(action: string, name: string)", }, - "keyDownCtrl": { + keyDownCtrl: { "!doc": "长按Ctrl键时", - "!type": "fn() -> bool" + "!type": "fn() -> bool", }, - "onclick": { + onclick: { "!doc": "具体点击屏幕上(x,y)点时,执行的操作", - "!type": "fn(x: number, y: number, px: number, py: number, stepPostfix?: [?])" + "!type": + "fn(x: number, y: number, px: number, py: number, stepPostfix?: [?])", }, - "doRegisteredAction": { + doRegisteredAction: { "!doc": "执行一个用户交互行为", - "!type": "fn(action: string, params: ?)" + "!type": "fn(action: string, params: ?)", }, - "onkeyUp": { + onkeyUp: { "!doc": "放开某个键时", - "!type": "fn(e: Event)" + "!type": "fn(e: Event)", }, - "onmousewheel": { + onmousewheel: { "!doc": "滑动鼠标滚轮时的操作", - "!type": "fn(direct: number)" + "!type": "fn(direct: number)", }, - "onmove": { + onmove: { "!doc": "当在触摸屏上滑动时", - "!type": "fn(loc: {x: number, y: number, size: number})" - } + "!type": "fn(loc: {x: number, y: number, size: number})", + }, }, - "loader": { + loader: { "!doc": "资源加载相关的函数", - "loadImages": { + loadImages: { "!doc": "加载一系列图片", - "!type": "fn(dir: string, names: [string], toSave: ?, callback?: fn()) " + "!type": + "fn(dir: string, names: [string], toSave: ?, callback?: fn()) ", }, - "loadImagesFromZip": { + loadImagesFromZip: { "!doc": "从zip中加载一系列图片", - "!type": "fn(url: string, names: [string], toSave?: ?, onprogress?: ?, onfinished?: ?)" + "!type": + "fn(url: string, names: [string], toSave?: ?, onprogress?: ?, onfinished?: ?)", }, - "loadBgm": { + loadBgm: { "!doc": "加载一个bgm", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "loadOneMusic": { + loadOneMusic: { "!doc": "加载一个音乐或音效", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "freeBgm": { + freeBgm: { "!doc": "释放一个bgm的缓存", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "loadOneSound": { + loadOneSound: { "!doc": "加载一个音效", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "loadImage": { + loadImage: { "!doc": "加载某一张图片", - "!type": "fn(dir: name, imgName: name, callback?: fn())" - } + "!type": "fn(dir: name, imgName: name, callback?: fn())", + }, }, - "maps": { - "!doc": "负责一切和地图相关的处理内容,包括如下几个方面:
- 地图的初始化,保存和读取,地图数组的生成
- 是否可移动或瞬间移动的判定
- 地图的绘制
- 获得某个点的图块信息
- 启用和禁用图块,改变图块
- 移动/跳跃图块,淡入淡出图块
- 全局动画控制,动画的绘制", - "noPass": { - "!doc": "判定某个点是否不可被踏入(不基于主角生命值和图块cannotIn属性)
例如:core.noPass(0, 0); // 判断地图左上角能否被踏入
x: 目标点的横坐标
y: 目标点的纵坐标
floorId: 目标点所在的地图id,不填视为当前地图
返回值:true表示可踏入", - "!type": "fn(x: number, y: number, floorId?: string) -> bool" + maps: { + "!doc": + "负责一切和地图相关的处理内容,包括如下几个方面:
- 地图的初始化,保存和读取,地图数组的生成
- 是否可移动或瞬间移动的判定
- 地图的绘制
- 获得某个点的图块信息
- 启用和禁用图块,改变图块
- 移动/跳跃图块,淡入淡出图块
- 全局动画控制,动画的绘制", + noPass: { + "!doc": + "判定某个点是否不可被踏入(不基于主角生命值和图块cannotIn属性)
例如:core.noPass(0, 0); // 判断地图左上角能否被踏入
x: 目标点的横坐标
y: 目标点的纵坐标
floorId: 目标点所在的地图id,不填视为当前地图
返回值:true表示可踏入", + "!type": "fn(x: number, y: number, floorId?: string) -> bool", }, - "drawAnimate": { - "!doc": "播放动画,注意即使指定了主角的坐标也不会跟随主角移动,如有需要请使用core.drawHeroAnimate(name, callback)函数
例如:core.drawAnimate('attack', core.nextX(), core.nextY(), false, core.vibrate); // 在主角面前一格播放普攻动画,动画停止后视野左右抖动1秒
name: 动画文件名,不含后缀
x: 横坐标
y: 纵坐标
alignWindow: 是否是相对窗口的坐标
callback: 动画停止后的回调函数,可选
返回值:一个数字,可作为core.stopAnimate()的参数来立即停止播放(届时还可选择是否执行此次播放的回调函数)", - "!type": "fn(name: string, x: number, y: number, alignWindow: bool, callback?: fn()) -> number" + drawAnimate: { + "!doc": + "播放动画,注意即使指定了主角的坐标也不会跟随主角移动,如有需要请使用core.drawHeroAnimate(name, callback)函数
例如:core.drawAnimate('attack', core.nextX(), core.nextY(), false, core.vibrate); // 在主角面前一格播放普攻动画,动画停止后视野左右抖动1秒
name: 动画文件名,不含后缀
x: 横坐标
y: 纵坐标
alignWindow: 是否是相对窗口的坐标
callback: 动画停止后的回调函数,可选
返回值:一个数字,可作为core.stopAnimate()的参数来立即停止播放(届时还可选择是否执行此次播放的回调函数)", + "!type": + "fn(name: string, x: number, y: number, alignWindow: bool, callback?: fn()) -> number", }, - "drawHeroAnimate": { - "!doc": "播放跟随勇士的动画
name: 动画名
callback: 动画停止后的回调函数,可选
返回值:一个数字,可作为core.stopAnimate()的参数来立即停止播放(届时还可选择是否执行此次播放的回调函数)", - "!type": "fn(name: string, callback?: fn()) -> number" + drawHeroAnimate: { + "!doc": + "播放跟随勇士的动画
name: 动画名
callback: 动画停止后的回调函数,可选
返回值:一个数字,可作为core.stopAnimate()的参数来立即停止播放(届时还可选择是否执行此次播放的回调函数)", + "!type": "fn(name: string, callback?: fn()) -> number", }, - "stopAnimate": { - "!doc": "立刻停止一个动画播放
id: 播放动画的编号,即drawAnimate或drawHeroAnimate的返回值;不填视为所有动画br/>doCallback: 是否执行该动画的回调函数", - "!type": "fn(id?: number, doCallback?: bool)" + stopAnimate: { + "!doc": + "立刻停止一个动画播放
id: 播放动画的编号,即drawAnimate或drawHeroAnimate的返回值;不填视为所有动画br/>doCallback: 是否执行该动画的回调函数", + "!type": "fn(id?: number, doCallback?: bool)", }, - "getPlayingAnimates": { - "!doc": "获得当前正在播放的所有(指定)动画的id列表
name: 动画名;不填代表返回全部正在播放的动画
返回值: 一个数组,每一项为一个正在播放的动画;可用core.stopAnimate停止播放。", - "!type": "fn(name?: string) -> [number]" + getPlayingAnimates: { + "!doc": + "获得当前正在播放的所有(指定)动画的id列表
name: 动画名;不填代表返回全部正在播放的动画
返回值: 一个数组,每一项为一个正在播放的动画;可用core.stopAnimate停止播放。", + "!type": "fn(name?: string) -> [number]", }, - "getBlockCls": { - "!doc": "判定某个点的图块类型
例如:if(core.getBlockCls(x1, y1) != 'enemys' && core.getBlockCls(x2, y2) != 'enemy48') core.openDoor(x3, y3); // 另一个简单的机关门事件,打败或炸掉这一对不同身高的敌人就开门
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图
showDisable: 隐藏点是否不返回null,true表示不返回null
返回值:图块类型,即“地形、四帧动画、矮敌人、高敌人、道具、矮npc、高npc、自动元件、额外地形”之一", - "!type": "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> string" + getBlockCls: { + "!doc": + "判定某个点的图块类型
例如:if(core.getBlockCls(x1, y1) != 'enemys' && core.getBlockCls(x2, y2) != 'enemy48') core.openDoor(x3, y3); // 另一个简单的机关门事件,打败或炸掉这一对不同身高的敌人就开门
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图
showDisable: 隐藏点是否不返回null,true表示不返回null
返回值:图块类型,即“地形、四帧动画、矮敌人、高敌人、道具、矮npc、高npc、自动元件、额外地形”之一", + "!type": + "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> string", }, - "drawMap": { - "!doc": "地图重绘
例如:core.drawMap(); // 重绘当前地图,常用于更改贴图或改变自动元件后的刷新
floorId: 地图id,可省略表示当前楼层
callback: 重绘完毕后的回调函数,可选", - "!type": "fn(floorId?: string)" + drawMap: { + "!doc": + "地图重绘
例如:core.drawMap(); // 重绘当前地图,常用于更改贴图或改变自动元件后的刷新
floorId: 地图id,可省略表示当前楼层
callback: 重绘完毕后的回调函数,可选", + "!type": "fn(floorId?: string)", }, - "nearStair": { + nearStair: { "!doc": "当前位置是否在楼梯边;在楼传平面塔模式下对箭头也有效", - "!type": "fn() -> bool" + "!type": "fn() -> bool", }, - "turnBlock": { + turnBlock: { "!doc": "事件转向", - "!type": "fn(direction?: string, x?: number, y?: number, floorId?: string)" + "!type": + "fn(direction?: string, x?: number, y?: number, floorId?: string)", }, - "getMapArray": { - "!doc": "生成事件层矩阵
例如:core.getMapArray('MT0'); // 生成主塔0层的事件层矩阵,隐藏的图块视为0
floorId: 地图id,不填视为当前地图
showDisable: 可选,true表示隐藏的图块也会被表示出来
返回值:事件层矩阵,注意对其阵元的访问是[y][x]", - "!type": "fn(floorId?: string, noCache?: bool) -> [[number]]" + getMapArray: { + "!doc": + "生成事件层矩阵
例如:core.getMapArray('MT0'); // 生成主塔0层的事件层矩阵,隐藏的图块视为0
floorId: 地图id,不填视为当前地图
showDisable: 可选,true表示隐藏的图块也会被表示出来
返回值:事件层矩阵,注意对其阵元的访问是[y][x]", + "!type": "fn(floorId?: string, noCache?: bool) -> [[number]]", }, - "getMapNumber": { + getMapNumber: { "!doc": "获得事件层某个点的数字", - "!type": "fn(x: number, y: number, floorId?: string, noCache?: bool) -> number" + "!type": + "fn(x: number, y: number, floorId?: string, noCache?: bool) -> number", }, - "jumpBlock": { - "!doc": "跳跃图块;从V2.7开始不再有音效
例如:core.jumpBlock(0, 0, 0, 0); // 令地图左上角的图块原地跳跃半秒,再花半秒淡出
sx: 起点的横坐标
sy: 起点的纵坐标
ex: 终点的横坐标
ey: 终点的纵坐标
time: 单步和淡出用时,单位为毫秒。不填视为半秒
keep: 是否不淡出,true表示不淡出
callback: 落地或淡出后的回调函数,可选", - "!type": "fn(sx: number, sy: number, ex: number, ey: number, time?: number, keep?: bool, callback?: fn())" + jumpBlock: { + "!doc": + "跳跃图块;从V2.7开始不再有音效
例如:core.jumpBlock(0, 0, 0, 0); // 令地图左上角的图块原地跳跃半秒,再花半秒淡出
sx: 起点的横坐标
sy: 起点的纵坐标
ex: 终点的横坐标
ey: 终点的纵坐标
time: 单步和淡出用时,单位为毫秒。不填视为半秒
keep: 是否不淡出,true表示不淡出
callback: 落地或淡出后的回调函数,可选", + "!type": + "fn(sx: number, sy: number, ex: number, ey: number, time?: number, keep?: bool, callback?: fn())", }, - "replaceBlock": { - "!doc": "批量替换图块
例如:core.replaceBlock(21, 22, core.floorIds); // 把游戏中地上当前所有的黄钥匙都变成蓝钥匙
fromNumber: 旧图块的数字
toNumber: 新图块的数字
floorId: 地图id或其数组,不填视为当前地图", - "!type": "fn(fromNumber: number, toNumber: number, floorId?: string|[string])" + replaceBlock: { + "!doc": + "批量替换图块
例如:core.replaceBlock(21, 22, core.floorIds); // 把游戏中地上当前所有的黄钥匙都变成蓝钥匙
fromNumber: 旧图块的数字
toNumber: 新图块的数字
floorId: 地图id或其数组,不填视为当前地图", + "!type": + "fn(fromNumber: number, toNumber: number, floorId?: string|[string])", }, - "drawBlock": { + drawBlock: { "!doc": "绘制一个图块", - "!type": "fn(block?: block, animate?: number)" + "!type": "fn(block?: block, animate?: number)", }, - "resetMap": { + resetMap: { "!doc": "重置地图", - "!type": "fn(floorId?: string|[string])" + "!type": "fn(floorId?: string|[string])", }, - "animateSetBlock": { + animateSetBlock: { "!doc": "动画形式转变某点图块", - "!type": "fn(number: number|string, x: number, y: number, floorId?: string, time?: number, callback?: fn())" + "!type": + "fn(number: number|string, x: number, y: number, floorId?: string, time?: number, callback?: fn())", }, - "animateSetBlocks": { + animateSetBlocks: { "!doc": "动画形式同时转变若干点图块", - "!type": "fn(number: number|string, locs: [?], floorId?: string, time?: number, callback?: fn())" + "!type": + "fn(number: number|string, locs: [?], floorId?: string, time?: number, callback?: fn())", }, - "compressMap": { + compressMap: { "!doc": "压缩地图", - "!type": "fn(mapArr: [[number]], floorId?: string) -> [[number]]" + "!type": "fn(mapArr: [[number]], floorId?: string) -> [[number]]", }, - "enemyExists": { + enemyExists: { "!doc": "某个点是否存在(指定的)怪物", - "!type": "fn(x: number, y: number, id?: string, floorId?: string) -> bool" + "!type": + "fn(x: number, y: number, id?: string, floorId?: string) -> bool", }, - "npcExists": { + npcExists: { "!doc": "某个点是否存在NPC", - "!type": "fn(x: number, y: number, floorId?: string) -> bool" + "!type": "fn(x: number, y: number, floorId?: string) -> bool", }, - "getBlockByNumber": { + getBlockByNumber: { "!doc": "根据数字获得图块", - "!type": "fn(number: number) -> block" + "!type": "fn(number: number) -> block", }, - "removeBlock": { - "!doc": "删除一个图块,对应于「隐藏事件」并同时删除
例如:core.removeBlock(0, 0); // 尝试删除地图左上角的图块
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图", - "!type": "fn(x: number, y: number, floorId?: string)" + removeBlock: { + "!doc": + "删除一个图块,对应于「隐藏事件」并同时删除
例如:core.removeBlock(0, 0); // 尝试删除地图左上角的图块
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图", + "!type": "fn(x: number, y: number, floorId?: string)", }, - "hideBlock": { - "!doc": "隐藏一个图块,对应于「隐藏事件」且不删除
例如:core.hideBlock(0, 0); // 隐藏地图左上角的图块
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图", - "!type": "fn(x: number, y: number, floorId?: string)" + hideBlock: { + "!doc": + "隐藏一个图块,对应于「隐藏事件」且不删除
例如:core.hideBlock(0, 0); // 隐藏地图左上角的图块
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图", + "!type": "fn(x: number, y: number, floorId?: string)", }, - "removeBlockByIndex": { + removeBlockByIndex: { "!doc": "根据block的索引删除该块", - "!type": "fn(index: number, floorId?: string)" + "!type": "fn(index: number, floorId?: string)", }, - "stairExists": { + stairExists: { "!doc": "某个点是否存在楼梯", - "!type": "fn(x: number, y: number, floorId?: string) -> bool" + "!type": "fn(x: number, y: number, floorId?: string) -> bool", }, - "isMapBlockDisabled": { + isMapBlockDisabled: { "!doc": "某个点图块是否被强制启用或禁用", - "!type": "fn(floorId?: string, x?: number, y?: number, flags?: ?) -> bool" + "!type": + "fn(floorId?: string, x?: number, y?: number, flags?: ?) -> bool", }, - "setMapBlockDisabled": { + setMapBlockDisabled: { "!doc": "设置某个点图块的强制启用或禁用状态", - "!type": "fn(floorId?: string, x?: number, y?: number, disabled?: bool)" + "!type": + "fn(floorId?: string, x?: number, y?: number, disabled?: bool)", }, - "setBlockOpacity": { + setBlockOpacity: { "!doc": "设置某个点图块的不透明度", - "!type": "fn(opacity?: number, x?: number, y?: number, floorId?: string)" + "!type": + "fn(opacity?: number, x?: number, y?: number, floorId?: string)", }, - "setBlockFilter": { + setBlockFilter: { "!doc": "设置某个点图块的特效", - "!type": "fn(filter?: ?, x?: number, y?: number, floorId?: string)" + "!type": "fn(filter?: ?, x?: number, y?: number, floorId?: string)", }, - "decompressMap": { + decompressMap: { "!doc": "解压缩地图", - "!type": "fn(mapArr: [[number]], floorId?: string) -> [[number]]" + "!type": "fn(mapArr: [[number]], floorId?: string) -> [[number]]", }, - "automaticRoute": { - "!doc": "自动寻路
例如:core.automaticRoute(0, 0); // 自动寻路到地图左上角
destX: 目标点的横坐标
destY: 目标点的纵坐标
返回值:每步走完后主角的loc属性组成的一维数组", - "!type": "fn(destX: number, destY: number) -> [{x: number, y: number, direction: string}]" + automaticRoute: { + "!doc": + "自动寻路
例如:core.automaticRoute(0, 0); // 自动寻路到地图左上角
destX: 目标点的横坐标
destY: 目标点的纵坐标
返回值:每步走完后主角的loc属性组成的一维数组", + "!type": + "fn(destX: number, destY: number) -> [{x: number, y: number, direction: string}]", }, - "resizeMap": { + resizeMap: { "!doc": "更改地图画布的尺寸", - "!type": "fn(floorId?: string)" + "!type": "fn(floorId?: string)", }, - "getFgNumber": { - "!doc": "判定某点的前景层的数字
例如:core.getFgNumber(); // 判断主角脚下的前景层图块的数字
x: 横坐标,不填为勇士坐标
y: 纵坐标,不填为勇士坐标floorId: 地图id,不填视为当前地图
noCache: 可选,true表示不使用缓存而强制重算", - "!type": "fn(x: number, y: number, floorId?: string, noCache?: bool) -> number" + getFgNumber: { + "!doc": + "判定某点的前景层的数字
例如:core.getFgNumber(); // 判断主角脚下的前景层图块的数字
x: 横坐标,不填为勇士坐标
y: 纵坐标,不填为勇士坐标floorId: 地图id,不填视为当前地图
noCache: 可选,true表示不使用缓存而强制重算", + "!type": + "fn(x: number, y: number, floorId?: string, noCache?: bool) -> number", }, - "moveBlock": { - "!doc": "移动图块
例如:core.moveBlock(0, 0, ['down']); // 令地图左上角的图块下移一格
x: 起点的横坐标
y: 起点的纵坐标
steps: 步伐数组
time: 单步和淡出用时,单位为毫秒。不填视为半秒
keep: 是否不淡出,true表示不淡出
callback: 移动或淡出后的回调函数,可选", - "!type": "fn(x: number, y: number, steps: [string], time?: number, keep?: bool, callback?: fn())" + moveBlock: { + "!doc": + "移动图块
例如:core.moveBlock(0, 0, ['down']); // 令地图左上角的图块下移一格
x: 起点的横坐标
y: 起点的纵坐标
steps: 步伐数组
time: 单步和淡出用时,单位为毫秒。不填视为半秒
keep: 是否不淡出,true表示不淡出
callback: 移动或淡出后的回调函数,可选", + "!type": + "fn(x: number, y: number, steps: [string], time?: number, keep?: bool, callback?: fn())", }, - "getBgNumber": { - "!doc": "判定某点的背景层的数字
例如:core.getBgNumber(); // 判断主角脚下的背景层图块的数字
x: 横坐标,不填为勇士坐标
y: 纵坐标,不填为勇士坐标
floorId: 地图id,不填视为当前地图
noCache: 可选,true表示不使用缓存而强制重算", - "!type": "fn(x?: number, y?: number, floorId?: string, noCache?: bool) -> number" + getBgNumber: { + "!doc": + "判定某点的背景层的数字
例如:core.getBgNumber(); // 判断主角脚下的背景层图块的数字
x: 横坐标,不填为勇士坐标
y: 纵坐标,不填为勇士坐标
floorId: 地图id,不填视为当前地图
noCache: 可选,true表示不使用缓存而强制重算", + "!type": + "fn(x?: number, y?: number, floorId?: string, noCache?: bool) -> number", }, - "getIdOfThis": { + getIdOfThis: { "!doc": "获得当前事件点的ID", - "!type": "fn(id?: string) -> string" + "!type": "fn(id?: string) -> string", }, - "searchBlock": { - "!doc": "搜索图块, 支持通配符和正则表达式
例如:core.searchBlock('*Door'); // 搜索当前地图的所有门
id: 图块id,支持星号表示任意多个(0个起)字符
floorId: 地图id或数组,不填视为当前地图
showDisable: 隐藏点是否计入,true表示计入
返回值:一个详尽的数组,一般只用到其长度", - "!type": "fn(id: string, floorId?: string|[string], showDisable?: bool) -> [{floorId: string, index: number, x: number, y: number, block: block}]" + searchBlock: { + "!doc": + "搜索图块, 支持通配符和正则表达式
例如:core.searchBlock('*Door'); // 搜索当前地图的所有门
id: 图块id,支持星号表示任意多个(0个起)字符
floorId: 地图id或数组,不填视为当前地图
showDisable: 隐藏点是否计入,true表示计入
返回值:一个详尽的数组,一般只用到其长度", + "!type": + "fn(id: string, floorId?: string|[string], showDisable?: bool) -> [{floorId: string, index: number, x: number, y: number, block: block}]", }, - "searchBlockWithFilter": { - "!doc": "根据给定的筛选函数搜索全部满足条件的图块
例如:core.searchBlockWithFilter(function (block) { return block.event.id.endsWith('Door'); }); // 搜索当前地图的所有门
blockFilter: 筛选函数,可接受block输入,应当返回一个boolean值
floorId: 地图id或数组,不填视为当前地图
showDisable: 隐藏点是否计入,true表示计入
返回值:一个详尽的数组", - "!type": "fn(blockFilter: fn(block: block) -> bool, floorId?: string|[string], showDisable?: bool): [{floorId: string, index: number, x: number, y: number, block: block}]" + searchBlockWithFilter: { + "!doc": + "根据给定的筛选函数搜索全部满足条件的图块
例如:core.searchBlockWithFilter(function (block) { return block.event.id.endsWith('Door'); }); // 搜索当前地图的所有门
blockFilter: 筛选函数,可接受block输入,应当返回一个boolean值
floorId: 地图id或数组,不填视为当前地图
showDisable: 隐藏点是否计入,true表示计入
返回值:一个详尽的数组", + "!type": + "fn(blockFilter: fn(block: block) -> bool, floorId?: string|[string], showDisable?: bool): [{floorId: string, index: number, x: number, y: number, block: block}]", }, - "hideBgFgMap": { + hideBgFgMap: { "!doc": "隐藏前景/背景地图", - "!type": "fn(name?: string, loc?: [number]|[[number]], floorId?: string, callback?: fn())" + "!type": + "fn(name?: string, loc?: [number]|[[number]], floorId?: string, callback?: fn())", }, - "getBlockInfo": { - "!doc": "获得某个图块或素材的信息,包括ID,cls,图片,坐标,faceIds等等", - "!type": "fn(block?: number|string|block) -> blockInfo" + getBlockInfo: { + "!doc": + "获得某个图块或素材的信息,包括ID,cls,图片,坐标,faceIds等等", + "!type": "fn(block?: number|string|block) -> blockInfo", }, - "getFaceDownId": { - "!doc": "获得某个图块对应行走图朝向向下的那一项的id;如果不存在行走图绑定则返回自身id。", - "!type": "fn(block?: string|number|block) -> string" + getFaceDownId: { + "!doc": + "获得某个图块对应行走图朝向向下的那一项的id;如果不存在行走图绑定则返回自身id。", + "!type": "fn(block?: string|number|block) -> string", }, - "canMoveDirectlyArray": { + canMoveDirectlyArray: { "!doc": "获得某些点可否通行的信息", - "!type": "fn(locs?: [[number]])" + "!type": "fn(locs?: [[number]])", }, - "hideFloorImage": { + hideFloorImage: { "!doc": "隐藏一个楼层贴图", - "!type": "fn(loc?: [number]|[[number]], floorId?: string, callback?: fn())" + "!type": + "fn(loc?: [number]|[[number]], floorId?: string, callback?: fn())", }, - "extractBlocks": { + extractBlocks: { "!doc": "根据需求解析出blocks", - "!type": "fn(map?: ?)" + "!type": "fn(map?: ?)", }, - "extractBlocksForUI": { + extractBlocksForUI: { "!doc": "根据需求为UI解析出blocks", - "!type": "fn(map?: ?, flags?: ?)" + "!type": "fn(map?: ?, flags?: ?)", }, - "getBlockId": { - "!doc": "判定某个点的图块id
例如:if(core.getBlockId(x1, y1) != 'greenSlime' && core.getBlockId(x2, y2) != 'redSlime') core.openDoor(x3, y3); // 一个简单的机关门事件,打败或炸掉这一对绿头怪和红头怪就开门
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图
showDisable: 隐藏点是否不返回null,true表示不返回null
返回值:图块id,该点无图块则返回null", - "!type": "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> string" + getBlockId: { + "!doc": + "判定某个点的图块id
例如:if(core.getBlockId(x1, y1) != 'greenSlime' && core.getBlockId(x2, y2) != 'redSlime') core.openDoor(x3, y3); // 一个简单的机关门事件,打败或炸掉这一对绿头怪和红头怪就开门
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图
showDisable: 隐藏点是否不返回null,true表示不返回null
返回值:图块id,该点无图块则返回null", + "!type": + "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> string", }, - "getBlockNumber": { - "!doc": "判定某个点的图块数字
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图
showDisable: 隐藏点是否不返回null,true表示不返回null
返回值:图块数字,该点无图块则返回null", - "!type": "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> number" + getBlockNumber: { + "!doc": + "判定某个点的图块数字
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图
showDisable: 隐藏点是否不返回null,true表示不返回null
返回值:图块数字,该点无图块则返回null", + "!type": + "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> number", }, - "getBlockOpacity": { + getBlockOpacity: { "!doc": "获得某个点图块的不透明度", - "!type": "fn(x?: number, y?: number, floorId?: string, showDisable?: bool) -> number" + "!type": + "fn(x?: number, y?: number, floorId?: string, showDisable?: bool) -> number", }, - "getBlockFilter": { + getBlockFilter: { "!doc": "获得某个点图块的特效", - "!type": "fn(x?: number, y?: number, floorId?: string, showDisable?: bool) -> ?" + "!type": + "fn(x?: number, y?: number, floorId?: string, showDisable?: bool) -> ?", }, - "loadFloor": { + loadFloor: { "!doc": "从文件或存档中加载某个楼层", - "!type": "fn(floorId?: string, map?: ?)" + "!type": "fn(floorId?: string, map?: ?)", }, - "generateMovableArray": { - "!doc": "可通行性判定
例如:core.generateMovableArray(); // 判断当前地图主角从各点能向何方向移动
floorId: 地图id,不填视为当前地图
返回值:从各点可移动方向的三维数组", - "!type": "fn(floorId?: string) -> [[[string]]]" + generateMovableArray: { + "!doc": + "可通行性判定
例如:core.generateMovableArray(); // 判断当前地图主角从各点能向何方向移动
floorId: 地图id,不填视为当前地图
返回值:从各点可移动方向的三维数组", + "!type": "fn(floorId?: string) -> [[[string]]]", }, - "terrainExists": { + terrainExists: { "!doc": "某个点是否存在(指定的)地形", - "!type": "fn(x: number, y: number, id?: string, floorId?: string) -> bool" + "!type": + "fn(x: number, y: number, id?: string, floorId?: string) -> bool", }, - "getBlockById": { + getBlockById: { "!doc": "根据ID获得图块", - "!type": "fn(id: string) -> block" + "!type": "fn(id: string) -> block", }, - "drawBg": { - "!doc": "绘制背景层(含贴图,其与背景层矩阵的绘制顺序可通过复写此函数来改变)
例如:core.drawBg(); // 绘制当前地图的背景层
floorId: 地图id,不填视为当前地图
ctx: 某画布的ctx,用于绘制缩略图,一般不需要", - "!type": "fn(floorId?: string, ctx?: CanvasRenderingContext2D)" + drawBg: { + "!doc": + "绘制背景层(含贴图,其与背景层矩阵的绘制顺序可通过复写此函数来改变)
例如:core.drawBg(); // 绘制当前地图的背景层
floorId: 地图id,不填视为当前地图
ctx: 某画布的ctx,用于绘制缩略图,一般不需要", + "!type": "fn(floorId?: string, ctx?: CanvasRenderingContext2D)", }, - "showBlock": { - "!doc": "显示(隐藏或显示的)图块,此函数将被“显示事件”指令和勾选了“不消失”的“移动/跳跃事件”指令(如阻击怪)的终点调用
例如:core.showBlock(0, 0); // 显示地图左上角的图块
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图", - "!type": "fn(x: number, y: number, floorId?: string)" + showBlock: { + "!doc": + "显示(隐藏或显示的)图块,此函数将被“显示事件”指令和勾选了“不消失”的“移动/跳跃事件”指令(如阻击怪)的终点调用
例如:core.showBlock(0, 0); // 显示地图左上角的图块
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图", + "!type": "fn(x: number, y: number, floorId?: string)", }, - "getMapBlocksObj": { + getMapBlocksObj: { "!doc": "以x,y的形式返回每个点的事件", - "!type": "fn(floorId?: string, noCache?: bool)" + "!type": "fn(floorId?: string, noCache?: bool)", }, - "removeGlobalAnimate": { + removeGlobalAnimate: { "!doc": "删除一个或所有全局动画", - "!type": "fn(x?: number, y?: number, name?: string)" + "!type": "fn(x?: number, y?: number, name?: string)", }, - "drawEvents": { - "!doc": "绘制事件层
例如:core.drawEvents(); // 绘制当前地图的事件层
floorId: 地图id,不填视为当前地图
blocks: 一般不需要
ctx: 某画布的ctx,用于绘制缩略图,一般不需要", - "!type": "fn(floorId?: string, blocks?: [block], ctx?: CanvasRenderingContext2D)" + drawEvents: { + "!doc": + "绘制事件层
例如:core.drawEvents(); // 绘制当前地图的事件层
floorId: 地图id,不填视为当前地图
blocks: 一般不需要
ctx: 某画布的ctx,用于绘制缩略图,一般不需要", + "!type": + "fn(floorId?: string, blocks?: [block], ctx?: CanvasRenderingContext2D)", }, - "canMoveDirectly": { - "!doc": "能否瞬移到某点,并求出节约的步数。
例如:core.canMoveDirectly(0, 0); // 能否瞬移到地图左上角
destX: 目标点的横坐标
destY: 目标点的纵坐标
返回值:正数表示节约的步数,-1表示不可瞬移", - "!type": "fn(destX: number, destY: number) -> number" + canMoveDirectly: { + "!doc": + "能否瞬移到某点,并求出节约的步数。
例如:core.canMoveDirectly(0, 0); // 能否瞬移到地图左上角
destX: 目标点的横坐标
destY: 目标点的纵坐标
返回值:正数表示节约的步数,-1表示不可瞬移", + "!type": "fn(destX: number, destY: number) -> number", }, - "saveMap": { + saveMap: { "!doc": "将当前地图重新变成数字,以便于存档", - "!type": "fn(floorId?: string)" + "!type": "fn(floorId?: string)", }, - "drawBoxAnimate": { + drawBoxAnimate: { "!doc": "绘制UI层的box动画", - "!type": "fn()" + "!type": "fn()", }, - "setBgFgBlock": { - "!doc": "转变图层块
例如:core.setBgFgBlock('bg', 167, 6, 6); // 把当前地图背景层的中心块改为滑冰
name: 背景还是前景
number: 新图层块的数字(也支持纯数字字符串如'1')或id
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图", - "!type": "fn(name: string, number: number|string, x: number, y: number, floorId?: string)" + setBgFgBlock: { + "!doc": + "转变图层块
例如:core.setBgFgBlock('bg', 167, 6, 6); // 把当前地图背景层的中心块改为滑冰
name: 背景还是前景
number: 新图层块的数字(也支持纯数字字符串如'1')或id
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图", + "!type": + "fn(name: string, number: number|string, x: number, y: number, floorId?: string)", }, - "drawFg": { - "!doc": "绘制前景层(含贴图,其与前景层矩阵的绘制顺序可通过复写此函数来改变)
例如:core.drawFg(); // 绘制当前地图的前景层
floorId: 地图id,不填视为当前地图
ctx: 某画布的ctx,用于绘制缩略图,一般不需要", - "!type": "fn(floorId?: string, ctx?: CanvasRenderingContext2D)" + drawFg: { + "!doc": + "绘制前景层(含贴图,其与前景层矩阵的绘制顺序可通过复写此函数来改变)
例如:core.drawFg(); // 绘制当前地图的前景层
floorId: 地图id,不填视为当前地图
ctx: 某画布的ctx,用于绘制缩略图,一般不需要", + "!type": "fn(floorId?: string, ctx?: CanvasRenderingContext2D)", }, - "getBlock": { + getBlock: { "!doc": "获得某个点的block", - "!type": "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> block" + "!type": + "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> block", }, - "initBlock": { + initBlock: { "!doc": "初始化一个图块", - "!type": "fn(x: number, y: number, id: string|number, addInfo?: bool, eventFloor?: ?) -> block" + "!type": + "fn(x: number, y: number, id: string|number, addInfo?: bool, eventFloor?: ?) -> block", }, - "addGlobalAnimate": { + addGlobalAnimate: { "!doc": "添加一个全局动画", - "!type": "fn(block?: block)" + "!type": "fn(block?: block)", }, - "animateBlock": { + animateBlock: { "!doc": "显示/隐藏某个块时的动画效果", - "!type": "fn(loc?: [number]|[[number]], type?: string|number, time?: number, callback?: fn())" + "!type": + "fn(loc?: [number]|[[number]], type?: string|number, time?: number, callback?: fn())", }, - "loadMap": { + loadMap: { "!doc": "将存档中的地图信息重新读取出来", - "!type": "fn(data?: ?, floorId?: string, flags?: ?)" + "!type": "fn(data?: ?, floorId?: string, flags?: ?)", }, - "setBlock": { - "!doc": "转变图块
例如:core.setBlock(1, 0, 0); // 把地图左上角变成黄墙
number: 新图块的数字(也支持纯数字字符串如'1')或id
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图", - "!type": "fn(number: number|string, x: number, y: number, floorId?: string)" + setBlock: { + "!doc": + "转变图块
例如:core.setBlock(1, 0, 0); // 把地图左上角变成黄墙
number: 新图块的数字(也支持纯数字字符串如'1')或id
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图", + "!type": + "fn(number: number|string, x: number, y: number, floorId?: string)", }, - "getFgMapArray": { - "!doc": "生成前景层矩阵
例如:core.getFgMapArray('MT0'); // 生成主塔0层的前景层矩阵,使用缓存
floorId: 地图id,不填视为当前地图
noCache: 可选,true表示不使用缓存
返回值:前景层矩阵,注意对其阵元的访问是[y][x]", - "!type": "fn(floorId?: string, noCache?: bool) -> [[number]]" + getFgMapArray: { + "!doc": + "生成前景层矩阵
例如:core.getFgMapArray('MT0'); // 生成主塔0层的前景层矩阵,使用缓存
floorId: 地图id,不填视为当前地图
noCache: 可选,true表示不使用缓存
返回值:前景层矩阵,注意对其阵元的访问是[y][x]", + "!type": "fn(floorId?: string, noCache?: bool) -> [[number]]", }, - "getBgMapArray": { - "!doc": "生成背景层矩阵
例如:core.getBgMapArray('MT0'); // 生成主塔0层的背景层矩阵,使用缓存
floorId: 地图id,不填视为当前地图
noCache: 可选,true表示不使用缓存
返回值:背景层矩阵,注意对其阵元的访问是[y][x]", - "!type": "fn(floorId?: string, noCache?: bool) -> [[number]]" + getBgMapArray: { + "!doc": + "生成背景层矩阵
例如:core.getBgMapArray('MT0'); // 生成主塔0层的背景层矩阵,使用缓存
floorId: 地图id,不填视为当前地图
noCache: 可选,true表示不使用缓存
返回值:背景层矩阵,注意对其阵元的访问是[y][x]", + "!type": "fn(floorId?: string, noCache?: bool) -> [[number]]", }, - "canMoveHero": { - "!doc": "单点单朝向的可通行性判定;受各图层cannotInOut、起点cannotMove和canGoDeadZone影响,不受canPass和noPass影响
x: 起点横坐标,不填视为主角当前的
y: 起点纵坐标,不填视为主角当前的
direction: 移动的方向,不填视为主角面对的方向
floorId: 地图id,不填视为当前地图", - "!type": "fn(x?: number, y?: number, direction?: string, floorId?: string) -> bool" + canMoveHero: { + "!doc": + "单点单朝向的可通行性判定;受各图层cannotInOut、起点cannotMove和canGoDeadZone影响,不受canPass和noPass影响
x: 起点横坐标,不填视为主角当前的
y: 起点纵坐标,不填视为主角当前的
direction: 移动的方向,不填视为主角面对的方向
floorId: 地图id,不填视为当前地图", + "!type": + "fn(x?: number, y?: number, direction?: string, floorId?: string) -> bool", }, - "drawThumbnail": { - "!doc": "绘制缩略图
例如:core.drawThumbnail(); // 绘制当前地图的缩略图
floorId: 地图id,不填视为当前地图
blocks: 一般不需要
options: 绘制信息,可选。可以增绘主角位置和朝向、采用不同于游戏中的主角行走图、增绘显伤、提供flags用于存读档,同时包含要绘制到的画布名或画布的ctx或还有其他信息,如起绘坐标、绘制大小、是否绘制全图、截取中心", - "!type": "fn(floorId?: string, blocks?: [block], options?: ?)" + drawThumbnail: { + "!doc": + "绘制缩略图
例如:core.drawThumbnail(); // 绘制当前地图的缩略图
floorId: 地图id,不填视为当前地图
blocks: 一般不需要
options: 绘制信息,可选。可以增绘主角位置和朝向、采用不同于游戏中的主角行走图、增绘显伤、提供flags用于存读档,同时包含要绘制到的画布名或画布的ctx或还有其他信息,如起绘坐标、绘制大小、是否绘制全图、截取中心", + "!type": "fn(floorId?: string, blocks?: [block], options?: ?)", }, - "hideBlockByIndex": { + hideBlockByIndex: { "!doc": "根据图块的索引来隐藏图块", - "!type": "fn(index?: number, floorId?: string)" + "!type": "fn(index?: number, floorId?: string)", }, - "getNumberById": { - "!doc": "根据图块id得到数字(地图矩阵中的值)
例如:core.getNumberById('yellowWall'); // 1
id: 图块id
返回值:图块的数字,定义在project\\maps.js(请注意和project\\icons.js中的“图块索引”相区分!)", - "!type": "fn(id: string) -> number" + getNumberById: { + "!doc": + "根据图块id得到数字(地图矩阵中的值)
例如:core.getNumberById('yellowWall'); // 1
id: 图块id
返回值:图块的数字,定义在project\\maps.js(请注意和project\\icons.js中的“图块索引”相区分!)", + "!type": "fn(id: string) -> number", }, - "removeBlockByIndexes": { + removeBlockByIndexes: { "!doc": "一次性删除多个block", - "!type": "fn(indexes?: [number], floorId?: string)" + "!type": "fn(indexes?: [number], floorId?: string)", }, - "hideBlockByIndexes": { + hideBlockByIndexes: { "!doc": "一次性隐藏多个block", - "!type": "fn(indexes?: [number], floorId?: string)" + "!type": "fn(indexes?: [number], floorId?: string)", }, - "generateGroundPattern": { + generateGroundPattern: { "!doc": "生成groundPattern", - "!type": "fn(floorId?: string)" + "!type": "fn(floorId?: string)", }, - "showBgFgMap": { + showBgFgMap: { "!doc": "显示前景/背景地图", - "!type": "fn(name?: string, loc?: [number]|[[number]], floorId?: string, callback?: fn())" + "!type": + "fn(name?: string, loc?: [number]|[[number]], floorId?: string, callback?: fn())", }, - "showFloorImage": { + showFloorImage: { "!doc": "显示一个楼层贴图", - "!type": "fn(loc?: [number]|[[number]], floorId?: string, callback?: fn())" - } + "!type": + "fn(loc?: [number]|[[number]], floorId?: string, callback?: fn())", + }, }, - "ui": { - "!doc": "负责一切UI界面的绘制。主要包括三个部分:
- 设置某个画布的属性与在某个画布上绘制的相关API
- 具体的某个UI界面的绘制
- 动态创建画布相关的API", - "resizeCanvas": { + ui: { + "!doc": + "负责一切UI界面的绘制。主要包括三个部分:
- 设置某个画布的属性与在某个画布上绘制的相关API
- 具体的某个UI界面的绘制
- 动态创建画布相关的API", + resizeCanvas: { "!doc": "重新设置一个自定义画布的大小", - "!type": "fn(name: string, x?: number, y?: number, styleOnly?: bool, isTempCanvas?: bool)" + "!type": + "fn(name: string, x?: number, y?: number, styleOnly?: bool, isTempCanvas?: bool)", }, - "deleteCanvas": { - "!doc": "删除一个自定义画布
name: 画布名,也可以传入一个函数对所有画布进行筛选", - "!type": "fn(name: string|fn(name: string) -> bool)" + deleteCanvas: { + "!doc": + "删除一个自定义画布
name: 画布名,也可以传入一个函数对所有画布进行筛选", + "!type": "fn(name: string|fn(name: string) -> bool)", }, - "deleteAllCanvas": { + deleteAllCanvas: { "!doc": "清空所有的自定义画布", - "!type": "fn()" + "!type": "fn()", }, - "drawIcon": { + drawIcon: { "!doc": "在某个canvas上绘制一个图标", - "!type": "fn(name: string|CanvasRenderingContext2D, id: string, x: number, y: number, w?: number, h?: number, frame?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, id: string, x: number, y: number, w?: number, h?: number, frame?: number)", }, - "drawFly": { + drawFly: { "!doc": "绘制楼层传送器", - "!type": "fn(page?: ?)" + "!type": "fn(page?: ?)", }, - "setOpacity": { - "!doc": "设置某个canvas整体的透明度;此函数直接改变画布本身,对已经绘制的内容也生效
如果仅想对接下来的绘制生效请使用setAlpha", - "!type": "fn(name: string|CanvasRenderingContext2D, opacity: number)" + setOpacity: { + "!doc": + "设置某个canvas整体的透明度;此函数直接改变画布本身,对已经绘制的内容也生效
如果仅想对接下来的绘制生效请使用setAlpha", + "!type": "fn(name: string|CanvasRenderingContext2D, opacity: number)", }, - "getTextContentHeight": { + getTextContentHeight: { "!doc": "获得某段文字的预计绘制高度;参数说明详见 drawTextContent", - "!type": "fn(content: string, config?: ?)" + "!type": "fn(content: string, config?: ?)", }, - "drawArrow": { + drawArrow: { "!doc": "在某个canvas上绘制一个箭头", - "!type": "fn(name: string|CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number, style?: string, lineWidth?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number, style?: string, lineWidth?: number)", }, - "strokeEllipse": { + strokeEllipse: { "!doc": "在某个canvas上绘制一个椭圆的边框", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, a: number, b: number, angle?: number, style?: string, lineWidth?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, a: number, b: number, angle?: number, style?: string, lineWidth?: number)", }, - "fillCircle": { + fillCircle: { "!doc": "在某个canvas上绘制一个圆", "!url": "https://www.w3school.com.cn/tags/canvas_arc.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, style?: string)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, style?: string)", }, - "strokeRoundRect": { + strokeRoundRect: { "!doc": "在某个canvas上绘制一个圆角矩形的边框", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number, style?: string, lineWidth?: number, angle?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number, style?: string, lineWidth?: number, angle?: number)", }, - "getContextByName": { - "!doc": "根据画布名找到一个画布的context;支持系统画布和自定义画布。如果不存在画布返回null。
也可以传画布的context自身,则返回自己。", - "!type": "fn(canvas: string|CanvasRenderingContext2D) -> CanvasRenderingContext2D" + getContextByName: { + "!doc": + "根据画布名找到一个画布的context;支持系统画布和自定义画布。如果不存在画布返回null。
也可以传画布的context自身,则返回自己。", + "!type": + "fn(canvas: string|CanvasRenderingContext2D) -> CanvasRenderingContext2D", }, - "drawImage": { - "!doc": "在一个画布上绘制图片
后面的8个坐标参数与canvas的drawImage的八个参数完全相同。
name: 可以是系统画布之一,也可以是任意自定义动态创建的画布名 画布名称或者画布的context
image: 要绘制的图片,可以是一个全塔属性中定义的图片名(会从images中去获取;支持加':x',':y',':o'翻转),图片本身,或者一个画布。
angle:旋转角度", + drawImage: { + "!doc": + "在一个画布上绘制图片
后面的8个坐标参数与canvas的drawImage的八个参数完全相同。
name: 可以是系统画布之一,也可以是任意自定义动态创建的画布名 画布名称或者画布的context
image: 要绘制的图片,可以是一个全塔属性中定义的图片名(会从images中去获取;支持加':x',':y',':o'翻转),图片本身,或者一个画布。
angle:旋转角度", "!url": "http://www.w3school.com.cn/html5/canvas_drawimage.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, image: string|image, x: number, y: number, w?: number, h?: number, x1?: number, y1?: number, w1?: number, h1?: number, angle?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, image: string|image, x: number, y: number, w?: number, h?: number, x1?: number, y1?: number, w1?: number, h1?: number, angle?: number)", }, - "drawTip": { - "!doc": "左上角绘制一段提示
text: 要提示的字符串,支持${}语法
id: 要绘制的图标ID
frame: 要绘制该图标的第几帧", - "!type": "fn(text: string, id?: string, frame?: number)" + drawTip: { + "!doc": + "左上角绘制一段提示
text: 要提示的字符串,支持${}语法
id: 要绘制的图标ID
frame: 要绘制该图标的第几帧", + "!type": "fn(text: string, id?: string, frame?: number)", }, - "drawBackground": { + drawBackground: { "!doc": "绘制一个背景图,可绘制winskin或纯色背景;支持小箭头绘制", - "!type": "fn(left: string, top: string, right: string, bottom: string, posInfo?: {px: number, py: number, direction: string})" + "!type": + "fn(left: string, top: string, right: string, bottom: string, posInfo?: {px: number, py: number, direction: string})", }, - "fillEllipse": { + fillEllipse: { "!doc": "在某个canvas上绘制一个椭圆", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, a: number, b: number, angle?: number, style?: string)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, a: number, b: number, angle?: number, style?: string)", }, - "setFillStyle": { + setFillStyle: { "!doc": "设置某个canvas的绘制属性(如颜色等)", "!url": "https://www.w3school.com.cn/tags/canvas_fillstyle.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, style: string)" + "!type": "fn(name: string|CanvasRenderingContext2D, style: string)", }, - "drawText": { + drawText: { "!doc": "地图中间绘制一段文字", - "!type": "fn(contents: string, callback?: fn())" + "!type": "fn(contents: string, callback?: fn())", }, - "drawConfirmBox": { - "!doc": "绘制一个确认框
此项会打断事件流,如需不打断版本的请使用core.myconfirm()
text: 要绘制的内容,支持 ${} 语法
yesCallback: 点击确认后的回调
noCallback: 点击取消后的回调", - "!type": "fn(text: string, yesCallback?: fn(), noCallback?: fn())" + drawConfirmBox: { + "!doc": + "绘制一个确认框
此项会打断事件流,如需不打断版本的请使用core.myconfirm()
text: 要绘制的内容,支持 ${} 语法
yesCallback: 点击确认后的回调
noCallback: 点击取消后的回调", + "!type": "fn(text: string, yesCallback?: fn(), noCallback?: fn())", }, - "drawUIEventSelector": { - "!doc": "自绘一个闪烁的选择光标
code: 选择光标的编号,必填
background: 要绘制的光标背景,必须是一个合法的WindowSkin
x, y, w, h: 绘制的坐标和长宽
z: 可选,光标的的z值", - "!type": "fn(code: number, background: string, x: number, y: number, w: number, h: number, z?: number)" + drawUIEventSelector: { + "!doc": + "自绘一个闪烁的选择光标
code: 选择光标的编号,必填
background: 要绘制的光标背景,必须是一个合法的WindowSkin
x, y, w, h: 绘制的坐标和长宽
z: 可选,光标的的z值", + "!type": + "fn(code: number, background: string, x: number, y: number, w: number, h: number, z?: number)", }, - "clearUIEventSelector": { - "!doc": "清除若干个自绘的选择光标
codes: 清除的光标编号;可以是单个编号或编号数组;不填则清除所有光标", - "!type": "fn(codes?: number|[number])" + clearUIEventSelector: { + "!doc": + "清除若干个自绘的选择光标
codes: 清除的光标编号;可以是单个编号或编号数组;不填则清除所有光标", + "!type": "fn(codes?: number|[number])", }, - "fillPolygon": { + fillPolygon: { "!doc": "在某个canvas上绘制一个多边形", - "!type": "fn(name: string|CanvasRenderingContext2D, nodes?: [[number]], style?: string)" + "!type": + "fn(name: string|CanvasRenderingContext2D, nodes?: [[number]], style?: string)", }, - "fillText": { - "!doc": "在某个画布上绘制一段文字
text: 要绘制的文本
style: 绘制的样式
font: 绘制的字体
最大宽度,超过此宽度会自动放缩", + fillText: { + "!doc": + "在某个画布上绘制一段文字
text: 要绘制的文本
style: 绘制的样式
font: 绘制的字体
最大宽度,超过此宽度会自动放缩", "!url": "https://www.w3school.com.cn/tags/canvas_filltext.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, text: string, x: number, y: number, style?: string, font?: string, maxWidth?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, text: string, x: number, y: number, style?: string, font?: string, maxWidth?: number)", }, - "setTextBaseline": { - "!doc": "设置某个canvas的基准线
baseline: 可为alphabetic, top, hanging, middle, ideographic, bottom", + setTextBaseline: { + "!doc": + "设置某个canvas的基准线
baseline: 可为alphabetic, top, hanging, middle, ideographic, bottom", "!url": "https://www.w3school.com.cn/tags/canvas_textbaseline.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, baseline: string)" + "!type": + "fn(name: string|CanvasRenderingContext2D, baseline: string)", }, - "loadCanvas": { + loadCanvas: { "!doc": "加载某个canvas状态", - "!type": "fn(name: string|CanvasRenderingContext2D)" + "!type": "fn(name: string|CanvasRenderingContext2D)", }, - "splitLines": { + splitLines: { "!doc": "字符串自动换行的分割", - "!type": "fn(name: string|CanvasRenderingContext2D, text: string, maxWidth?: number, font?: string)" + "!type": + "fn(name: string|CanvasRenderingContext2D, text: string, maxWidth?: number, font?: string)", }, - "setAlpha": { - "!doc": "设置某个canvas接下来绘制的不透明度;不会影响已经绘制的内容
返回设置之前画布的不透明度
如果需要修改画布本身的不透明度请使用setOpacity", + setAlpha: { + "!doc": + "设置某个canvas接下来绘制的不透明度;不会影响已经绘制的内容
返回设置之前画布的不透明度
如果需要修改画布本身的不透明度请使用setOpacity", "!url": "https://www.w3school.com.cn/tags/canvas_globalalpha.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, alpha: number) -> number" + "!type": + "fn(name: string|CanvasRenderingContext2D, alpha: number) -> number", }, - "setFilter": { + setFilter: { "!doc": "设置某个canvas接下来绘制的filter", - "!type": "fn(name: string|CanvasRenderingContext2D, style: string)" + "!type": "fn(name: string|CanvasRenderingContext2D, style: string)", }, - "setLineWidth": { + setLineWidth: { "!doc": "设置某个canvas的线宽度", "!url": "https://www.w3school.com.cn/tags/canvas_linewidth.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, lineWidth: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, lineWidth: number)", }, - "drawTextBox": { + drawTextBox: { "!doc": "绘制一个对话框", - "!type": "fn(content: string, showAll?: bool)" + "!type": "fn(content: string, showAll?: bool)", }, - "relocateCanvas": { + relocateCanvas: { "!doc": "重新定位一个自定义画布", - "!type": "fn(name: string, x: number, y: number, useDelta: bool)" + "!type": "fn(name: string, x: number, y: number, useDelta: bool)", }, - "rotateCanvas": { - "!doc": "设置一个自定义画布的旋转角度
centerX, centerY: 旋转中心(以屏幕像素为基准);不填视为图片正中心。", - "!type": "fn(name: string, angle: number, centerX?: number, centerY?: number)" + rotateCanvas: { + "!doc": + "设置一个自定义画布的旋转角度
centerX, centerY: 旋转中心(以屏幕像素为基准);不填视为图片正中心。", + "!type": + "fn(name: string, angle: number, centerX?: number, centerY?: number)", }, - "closePanel": { + closePanel: { "!doc": "结束一切事件和绘制,关闭UI窗口,返回游戏进程", - "!type": "fn()" + "!type": "fn()", }, - "textImage": { + textImage: { "!doc": "文本图片化", - "!type": "fn(content: string, lineHeight?: number) -> image" + "!type": "fn(content: string, lineHeight?: number) -> image", }, - "drawStatusBar": { + drawStatusBar: { "!doc": "绘制状态栏", - "!type": "fn()" + "!type": "fn()", }, - "setStrokeStyle": { + setStrokeStyle: { "!doc": "设置某个canvas边框属性", "!url": "https://www.w3school.com.cn/tags/canvas_strokestyle.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, style: string)" + "!type": "fn(name: string|CanvasRenderingContext2D, style: string)", }, - "clearUI": { + clearUI: { "!doc": "清空UI层内容", - "!type": "fn()" + "!type": "fn()", }, - "drawWindowSkin": { + drawWindowSkin: { "!doc": "绘制WindowSkin", - "!type": "fn(background: string, ctx: string|CanvasRenderingContext2D, x: number, y: number, w: string, h: string, direction?: string, px?: number, py?: number)" + "!type": + "fn(background: string, ctx: string|CanvasRenderingContext2D, x: number, y: number, w: string, h: string, direction?: string, px?: number, py?: number)", }, - "fillRect": { - "!doc": "绘制一个矩形。
x,y: 绘制的坐标
width,height: 绘制的长宽
style: 绘制的样式
angle: 旋转的角度,弧度制,如Math.PI/2代表90度", + fillRect: { + "!doc": + "绘制一个矩形。
x,y: 绘制的坐标
width,height: 绘制的长宽
style: 绘制的样式
angle: 旋转的角度,弧度制,如Math.PI/2代表90度", "!url": "https://www.w3school.com.cn/tags/canvas_fillrect.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, style?: string, angle?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, style?: string, angle?: number)", }, - "drawScrollText": { + drawScrollText: { "!doc": "绘制滚动字幕", - "!type": "fn(content: string, time: number, lineHeight?: number, callback?: fn())" + "!type": + "fn(content: string, time: number, lineHeight?: number, callback?: fn())", }, - "strokePolygon": { + strokePolygon: { "!doc": "在某个canvas上绘制一个多边形的边框", - "!type": "fn(name: string|CanvasRenderingContext2D, nodes?: [[number]], style?: string, lineWidth?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, nodes?: [[number]], style?: string, lineWidth?: number)", }, - "strokeCircle": { + strokeCircle: { "!doc": "在某个canvas上绘制一个圆的边框", "!url": "https://www.w3school.com.cn/tags/canvas_arc.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: ?, style?: string, lineWidth?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: ?, style?: string, lineWidth?: number)", }, - "drawWaiting": { + drawWaiting: { "!doc": "绘制等待界面", - "!type": "fn(text: string)" + "!type": "fn(text: string)", }, - "setFont": { + setFont: { "!doc": "设置某个canvas的文字字体", "!url": "https://www.w3school.com.cn/tags/canvas_font.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, font: string)" + "!type": "fn(name: string|CanvasRenderingContext2D, font: string)", }, - "drawChoices": { + drawChoices: { "!doc": "绘制一个选项界面", - "!type": "fn(content?: string, choices?: [?], width?: number, ctx?: string|CanvasRenderingContext2D)" + "!type": + "fn(content?: string, choices?: [?], width?: number, ctx?: string|CanvasRenderingContext2D)", }, - "setFontForMaxWidth": { + setFontForMaxWidth: { "!doc": "根据最大宽度自动缩小字体", - "!type": "fn(name: string|CanvasRenderingContext2D, text: string, maxWidth: number, font?: ?) -> string" + "!type": + "fn(name: string|CanvasRenderingContext2D, text: string, maxWidth: number, font?: ?) -> string", }, - "clearMap": { - "!doc": "清空某个画布图层
name为画布名,可以是系统画布之一,也可以是任意自定义动态创建的画布名;还可以直接传画布的context本身。
如果name也可以是'all',若为all则为清空所有系统画布。", + clearMap: { + "!doc": + "清空某个画布图层
name为画布名,可以是系统画布之一,也可以是任意自定义动态创建的画布名;还可以直接传画布的context本身。
如果name也可以是'all',若为all则为清空所有系统画布。", "!url": "https://www.w3school.com.cn/tags/canvas_clearrect.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, x?: number, y?: number, width?: number, height?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x?: number, y?: number, width?: number, height?: number)", }, - "drawTextContent": { - "!doc": "绘制一段文字到某个画布上面
ctx: 要绘制到的画布
content: 要绘制的内容;转义字符不允许保留 \\t, \\b 和 \\f
config: 绘制配置项,目前暂时包含如下内容(均为可选)
left, top:起始点位置;maxWidth:单行最大宽度;color:默认颜色;align:左中右
fontSize:字体大小;lineHeight:行高;time:打字机间隔;font:字体名
返回值:绘制信息", - "!type": "fn(ctx: string|CanvasRenderingContext2D, content: string, config: ?)" + drawTextContent: { + "!doc": + "绘制一段文字到某个画布上面
ctx: 要绘制到的画布
content: 要绘制的内容;转义字符不允许保留 \\t, \\b 和 \\f
config: 绘制配置项,目前暂时包含如下内容(均为可选)
left, top:起始点位置;maxWidth:单行最大宽度;color:默认颜色;align:左中右
fontSize:字体大小;lineHeight:行高;time:打字机间隔;font:字体名
返回值:绘制信息", + "!type": + "fn(ctx: string|CanvasRenderingContext2D, content: string, config: ?)", }, - "calWidth": { + calWidth: { "!doc": "计算某段文字的宽度", "!url": "https://www.w3school.com.cn/tags/canvas_measuretext.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, text: string, font?: string) -> number" + "!type": + "fn(name: string|CanvasRenderingContext2D, text: string, font?: string) -> number", }, - "fillArc": { + fillArc: { "!doc": "在某个canvas上绘制一个扇形", "!url": "https://www.w3school.com.cn/tags/canvas_arc.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, start: number, end: number, style?: string)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, start: number, end: number, style?: string)", }, - "strokeArc": { + strokeArc: { "!doc": "在某个canvas上绘制一段弧", "!url": "https://www.w3school.com.cn/tags/canvas_arc.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, start: number, end: number, style?: string, lineWidth?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, start: number, end: number, style?: string, lineWidth?: number)", }, - "drawLine": { + drawLine: { "!doc": "在某个canvas上绘制一条线", "!url": "https://www.w3school.com.cn/tags/canvas_lineto.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number, style?: string, lineWidth?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number, style?: string, lineWidth?: number)", }, - "drawPagination": { + drawPagination: { "!doc": "绘制分页", - "!type": "fn(page?: ?, totalPage?: ?, y?: number)" + "!type": "fn(page?: ?, totalPage?: ?, y?: number)", }, - "getToolboxItems": { + getToolboxItems: { "!doc": "获得所有应该在道具栏显示的某个类型道具", - "!type": "fn(cls: string) -> [string]" + "!type": "fn(cls: string) -> [string]", }, - "strokeRect": { - "!doc": "绘制一个矩形的边框
style: 绘制的样式
lineWidth: 线宽
angle: 旋转角度,弧度制,如Math.PI/2为90度", + strokeRect: { + "!doc": + "绘制一个矩形的边框
style: 绘制的样式
lineWidth: 线宽
angle: 旋转角度,弧度制,如Math.PI/2为90度", "!url": "https://www.w3school.com.cn/tags/canvas_strokerect.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, style?: string, lineWidth?: number, angle?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, style?: string, lineWidth?: number, angle?: number)", }, - "drawBook": { + drawBook: { "!doc": "绘制怪物手册", - "!type": "fn(index?: ?)" + "!type": "fn(index?: ?)", }, - "fillRoundRect": { + fillRoundRect: { "!doc": "在某个canvas上绘制一个圆角矩形", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number, style?: string, angle?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number, style?: string, angle?: number)", }, - "fillBoldText": { - "!doc": "在某个画布上绘制一个描边文字
text: 要绘制的文本
style: 绘制的样式
strokeStyle: 要绘制的描边颜色
font: 绘制的字体
maxWidth: 最大宽度,超过此宽度会自动放缩", - "!type": "fn(name: string|CanvasRenderingContext2D, text: string, x: number, y: number, style?: string, strokeStyle?: string, font?: string, maxWidth?: number)" + fillBoldText: { + "!doc": + "在某个画布上绘制一个描边文字
text: 要绘制的文本
style: 绘制的样式
strokeStyle: 要绘制的描边颜色
font: 绘制的字体
maxWidth: 最大宽度,超过此宽度会自动放缩", + "!type": + "fn(name: string|CanvasRenderingContext2D, text: string, x: number, y: number, style?: string, strokeStyle?: string, font?: string, maxWidth?: number)", }, - "saveCanvas": { + saveCanvas: { "!doc": "保存某个canvas状态", - "!type": "fn(name: string|CanvasRenderingContext2D)" + "!type": "fn(name: string|CanvasRenderingContext2D)", }, - "createCanvas": { - "!doc": "动态创建一个画布。
name: 要创建的画布名,如果已存在则会直接取用当前存在的。
x,y: 创建的画布相对窗口左上角的像素坐标
width,height: 创建的长宽。
zIndex: 创建的纵向高度(关系到画布之间的覆盖),z值高的将覆盖z值低的;系统画布的z值可在个性化中查看。
返回创建的画布的context,也可以通过core.dymCanvas[name]调用。", - "!type": "fn(name: string, x: number, y: number, width: number, height: number, zIndex: number) -> CanvasRenderingContext2D" + createCanvas: { + "!doc": + "动态创建一个画布。
name: 要创建的画布名,如果已存在则会直接取用当前存在的。
x,y: 创建的画布相对窗口左上角的像素坐标
width,height: 创建的长宽。
zIndex: 创建的纵向高度(关系到画布之间的覆盖),z值高的将覆盖z值低的;系统画布的z值可在个性化中查看。
返回创建的画布的context,也可以通过core.dymCanvas[name]调用。", + "!type": + "fn(name: string, x: number, y: number, width: number, height: number, zIndex: number) -> CanvasRenderingContext2D", }, - "setTextAlign": { + setTextAlign: { "!doc": "设置某个canvas的对齐", "!url": "https://www.w3school.com.cn/tags/canvas_textalign.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, align: string)" + "!type": "fn(name: string|CanvasRenderingContext2D, align: string)", }, }, - "enemys": { + enemys: { "!doc": "定义了一系列和怪物相关的API函数。", - "getEnemys": { - "!doc": "获得所有怪物原始数据的一个副本。
请使用core.material.enemys获得当前各项怪物属性。", - "!type": "fn()" + getEnemys: { + "!doc": + "获得所有怪物原始数据的一个副本。
请使用core.material.enemys获得当前各项怪物属性。", + "!type": "fn()", }, - "getEnemyValue": { + getEnemyValue: { "!doc": "获得某个点上怪物的某个属性值", - "!type": "fn(enemy?: string|enemy, name: string, x?: number, y?: number, floorId?: string)" + "!type": + "fn(enemy?: string|enemy, name: string, x?: number, y?: number, floorId?: string)", }, - "getSpecials": { + getSpecials: { "!doc": "获得所有特殊属性的定义", - "!type": "fn() -> [[?]]" + "!type": "fn() -> [[?]]", }, - "getSpecialColor": { + getSpecialColor: { "!doc": "获得某个怪物所有特殊属性的颜色", - "!type": "fn(enemy: string|enemy) -> [string]" + "!type": "fn(enemy: string|enemy) -> [string]", }, - "getSpecialFlag": { - "!doc": "获得某个怪物所有特殊属性的额外标记。

例如,1为全图性技能,需要进行遍历全图(光环/支援等)", - "!type": "fn(enemy: string|enemy) -> number" + getSpecialFlag: { + "!doc": + "获得某个怪物所有特殊属性的额外标记。

例如,1为全图性技能,需要进行遍历全图(光环/支援等)", + "!type": "fn(enemy: string|enemy) -> number", }, - "getSpecialHint": { - "!doc": "获得某种敌人的某种特殊属性的介绍
例如:core.getSpecialHint('bat', 1) // '先攻:怪物首先攻击'
enemy: 敌人id或敌人对象,用于确定属性的具体数值,否则可选
special: 属性编号,可以是该敌人没有的属性
返回值:属性的介绍,以属性名加中文冒号开头", - "!type": "fn(enemy: string|enemy, special: number) -> string" + getSpecialHint: { + "!doc": + "获得某种敌人的某种特殊属性的介绍
例如:core.getSpecialHint('bat', 1) // '先攻:怪物首先攻击'
enemy: 敌人id或敌人对象,用于确定属性的具体数值,否则可选
special: 属性编号,可以是该敌人没有的属性
返回值:属性的介绍,以属性名加中文冒号开头", + "!type": "fn(enemy: string|enemy, special: number) -> string", }, - "getSpecialText": { - "!doc": "获得某种敌人的全部特殊属性名称
例如:core.getSpecialText('greenSlime') // ['先攻', '3连击', '破甲', '反击']
enemy: 敌人id或敌人对象,如core.material.enemys.greenSlime
返回值:字符串数组", - "!type": "fn(enemy: string|enemy) -> [string]" + getSpecialText: { + "!doc": + "获得某种敌人的全部特殊属性名称
例如:core.getSpecialText('greenSlime') // ['先攻', '3连击', '破甲', '反击']
enemy: 敌人id或敌人对象,如core.material.enemys.greenSlime
返回值:字符串数组", + "!type": "fn(enemy: string|enemy) -> [string]", }, - "hasSpecial": { - "!doc": "判定某种特殊属性的有无
例如:core.hasSpecial('greenSlime', 1) // 判定绿头怪有无先攻属性
special: 敌人id或敌人对象或正整数数组或自然数
test: 待检查的属性编号
", - "!type": "fn(special: number|[number]|string|number, test: number) -> bool" + hasSpecial: { + "!doc": + "判定某种特殊属性的有无
例如:core.hasSpecial('greenSlime', 1) // 判定绿头怪有无先攻属性
special: 敌人id或敌人对象或正整数数组或自然数
test: 待检查的属性编号
", + "!type": + "fn(special: number|[number]|string|number, test: number) -> bool", }, - "nextCriticals": { - "!doc": "获得某只敌人接下来的若干个临界及其减伤,算法基于useLoop开关选择回合法或二分法
例如:core.nextCriticals('greenSlime', 9, 0, 0, 'MT0') // 绿头怪接下来的9个临界
enemy: 敌人id或敌人对象
number: 要计算的临界数量,可选,默认为1
x: 敌人的横坐标,可选
y: 敌人的纵坐标,可选
floorId: 敌人所在的地图,可选
返回:两列的二维数组,每行表示一个临界及其减伤", - "!type": "fn(enemy: string|enemy, number?: number, x?: number, y?: number, floorId?: string) -> [[number]]" + nextCriticals: { + "!doc": + "获得某只敌人接下来的若干个临界及其减伤,算法基于useLoop开关选择回合法或二分法
例如:core.nextCriticals('greenSlime', 9, 0, 0, 'MT0') // 绿头怪接下来的9个临界
enemy: 敌人id或敌人对象
number: 要计算的临界数量,可选,默认为1
x: 敌人的横坐标,可选
y: 敌人的纵坐标,可选
floorId: 敌人所在的地图,可选
返回:两列的二维数组,每行表示一个临界及其减伤", + "!type": + "fn(enemy: string|enemy, number?: number, x?: number, y?: number, floorId?: string) -> [[number]]", }, - "getDefDamage": { - "!doc": "计算再加若干点防御能使某只敌人对主角的总伤害降低多少
例如:core.getDefDamage('greenSlime', 10, 0, 0, 'MT0') // 再加10点防御能使绿头怪的伤害降低多少
enemy: 敌人id或敌人对象
k: 假设主角增加的防御力,可选,默认为1
x: 敌人的横坐标,可选
y: 敌人的纵坐标,可选
floorId: 敌人所在的地图,可选", - "!type": "fn(enemy: string|enemy, k?: number, x?: number, y?: number, floorId?: string) -> number" + getDefDamage: { + "!doc": + "计算再加若干点防御能使某只敌人对主角的总伤害降低多少
例如:core.getDefDamage('greenSlime', 10, 0, 0, 'MT0') // 再加10点防御能使绿头怪的伤害降低多少
enemy: 敌人id或敌人对象
k: 假设主角增加的防御力,可选,默认为1
x: 敌人的横坐标,可选
y: 敌人的纵坐标,可选
floorId: 敌人所在的地图,可选", + "!type": + "fn(enemy: string|enemy, k?: number, x?: number, y?: number, floorId?: string) -> number", }, - "canBattle": { - "!doc": "判定主角当前能否打败某只敌人
例如:core.canBattle('greenSlime',0,0,'MT0') // 能否打败主塔0层左上角的绿头怪(假设有)
enemy: 敌人id或敌人对象
x: 敌人的横坐标,可选
y: 敌人的纵坐标,可选
floorId: 敌人所在的地图,可选
返回值:true表示可以打败,false表示无法打败", - "!type": "fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> bool" + canBattle: { + "!doc": + "判定主角当前能否打败某只敌人
例如:core.canBattle('greenSlime',0,0,'MT0') // 能否打败主塔0层左上角的绿头怪(假设有)
enemy: 敌人id或敌人对象
x: 敌人的横坐标,可选
y: 敌人的纵坐标,可选
floorId: 敌人所在的地图,可选
返回值:true表示可以打败,false表示无法打败", + "!type": + "fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> bool", }, - "getEnemyInfo": { - "!doc": "获得怪物真实属性
hero: 可选,此时的勇士属性
此函数将会计算包括坚固、模仿、光环等若干效果,将同时被怪物手册和伤害计算调用", - "!type": "fn(enemy: string|enemy, hero?: ?, x?: number, y?: number, floorId?: string) -> {hp: number, atk: number, def: number, money: number, exp: number, special: [number], point: number, guards: [?]}" + getEnemyInfo: { + "!doc": + "获得怪物真实属性
hero: 可选,此时的勇士属性
此函数将会计算包括坚固、模仿、光环等若干效果,将同时被怪物手册和伤害计算调用", + "!type": + "fn(enemy: string|enemy, hero?: ?, x?: number, y?: number, floorId?: string) -> {hp: number, atk: number, def: number, money: number, exp: number, special: [number], point: number, guards: [?]}", }, - "getDamageInfo": { - "!doc": "获得战斗伤害信息
例如:core.getDamage('greenSlime',0,0,'MT0') // 绿头怪的总伤害
enemy: 敌人id或敌人对象
hero: 可选,此时的勇士属性
x: 敌人的横坐标,可选
y: 敌人的纵坐标,可选
floorId: 敌人所在的地图,可选
返回值:伤害计算信息,如果因为没有破防或无敌怪等其他原因无法战斗,则返回null", - "!type": "fn(enemy: string|enemy, hero?: ?, x?: number, y?: number, floorId?: string) -> {damage: number, per_damage: number, hero_per_damage: number, init_damage: number, mon_hp: number, mon_atk: number, mon_def: number, turn: number}" + getDamageInfo: { + "!doc": + "获得战斗伤害信息
例如:core.getDamage('greenSlime',0,0,'MT0') // 绿头怪的总伤害
enemy: 敌人id或敌人对象
hero: 可选,此时的勇士属性
x: 敌人的横坐标,可选
y: 敌人的纵坐标,可选
floorId: 敌人所在的地图,可选
返回值:伤害计算信息,如果因为没有破防或无敌怪等其他原因无法战斗,则返回null", + "!type": + "fn(enemy: string|enemy, hero?: ?, x?: number, y?: number, floorId?: string) -> {damage: number, per_damage: number, hero_per_damage: number, init_damage: number, mon_hp: number, mon_atk: number, mon_def: number, turn: number}", }, - "getDamage": { - "!doc": "获得某只敌人对主角的总伤害
例如:core.getDamage('greenSlime',0,0,'MT0') // 绿头怪的总伤害
enemy: 敌人id或敌人对象
x: 敌人的横坐标,可选
y: 敌人的纵坐标,可选
floorId: 敌人所在的地图,可选
返回值:总伤害,如果因为没有破防或无敌怪等其他原因无法战斗,则返回null", - "!type": "fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> number" + getDamage: { + "!doc": + "获得某只敌人对主角的总伤害
例如:core.getDamage('greenSlime',0,0,'MT0') // 绿头怪的总伤害
enemy: 敌人id或敌人对象
x: 敌人的横坐标,可选
y: 敌人的纵坐标,可选
floorId: 敌人所在的地图,可选
返回值:总伤害,如果因为没有破防或无敌怪等其他原因无法战斗,则返回null", + "!type": + "fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> number", }, - "getDamageString": { - "!doc": "获得某只敌人的地图显伤,包括颜色
例如:core.getDamageString('greenSlime', 0, 0, 'MT0') // 绿头怪的地图显伤
enemy: 敌人id或敌人对象
x: 敌人的横坐标,可选
y: 敌人的纵坐标,可选
floorId: 敌人所在的地图,可选
返回值:damage: 表示伤害值或为'???',color: 形如'#RrGgBb'", - "!type": "fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> {color: string, damage: string}" + getDamageString: { + "!doc": + "获得某只敌人的地图显伤,包括颜色
例如:core.getDamageString('greenSlime', 0, 0, 'MT0') // 绿头怪的地图显伤
enemy: 敌人id或敌人对象
x: 敌人的横坐标,可选
y: 敌人的纵坐标,可选
floorId: 敌人所在的地图,可选
返回值:damage: 表示伤害值或为'???',color: 形如'#RrGgBb'", + "!type": + "fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> {color: string, damage: string}", }, - "getCurrentEnemys": { - "!doc": "获得某张地图的敌人集合,用于手册绘制
例如:core.getCurrentEnemys('MT0') // 主塔0层的敌人集合
floorId: 地图id,可选
返回值:敌人集合,按伤害升序排列,支持多朝向怪合并", - "!type": "fn(floorId?: string) -> [enemy]" + getCurrentEnemys: { + "!doc": + "获得某张地图的敌人集合,用于手册绘制
例如:core.getCurrentEnemys('MT0') // 主塔0层的敌人集合
floorId: 地图id,可选
返回值:敌人集合,按伤害升序排列,支持多朝向怪合并", + "!type": "fn(floorId?: string) -> [enemy]", + }, + hasEnemyLeft: { + "!doc": + "检查某些楼层是否还有漏打的(某种)敌人
例如:core.hasEnemyLeft('greenSlime', ['sample0', 'sample1']) // 样板0层和1层是否有漏打的绿头怪
enemyId: 敌人id,可选,null表示任意敌人
floorId: 地图id或其数组,可选,不填为当前地图
返回值:地图中是否还存在该种敌人", + "!type": "fn(enemyId?: string, floorId?: string|[string]) -> bool", }, - "hasEnemyLeft": { - "!doc": "检查某些楼层是否还有漏打的(某种)敌人
例如:core.hasEnemyLeft('greenSlime', ['sample0', 'sample1']) // 样板0层和1层是否有漏打的绿头怪
enemyId: 敌人id,可选,null表示任意敌人
floorId: 地图id或其数组,可选,不填为当前地图
返回值:地图中是否还存在该种敌人", - "!type": "fn(enemyId?: string, floorId?: string|[string]) -> bool" - } }, - "events": { - "!doc": "events.js将处理所有和事件相关的操作,主要分为五个部分:
- 游戏的开始和结束
- 系统事件的处理
- 自定义事件的处理
- 点击状态栏图标所进行的操作
- 一些具体事件的执行内容", - "afterChangeFloor": { + events: { + "!doc": + "events.js将处理所有和事件相关的操作,主要分为五个部分:
- 游戏的开始和结束
- 系统事件的处理
- 自定义事件的处理
- 点击状态栏图标所进行的操作
- 一些具体事件的执行内容", + afterChangeFloor: { "!doc": "转换楼层结束的事件", - "!type": "fn(floorId?: string)" + "!type": "fn(floorId?: string)", }, - "popEventLoc": { + popEventLoc: { "!doc": "将当前点坐标入栈", - "!type": "fn()" + "!type": "fn()", }, - "afterOpenDoor": { + afterOpenDoor: { "!doc": "开一个门后触发的事件", - "!type": "fn(doorId?: string, x?: number, y?: number)" + "!type": "fn(doorId?: string, x?: number, y?: number)", }, - "checkLvUp": { + checkLvUp: { "!doc": "检查升级事件", - "!type": "fn()" + "!type": "fn()", }, - "insertAction": { - "!doc": "插入一段事件;此项不可插入公共事件,请用 core.insertCommonEvent
例如:core.insertAction('一段文字'); // 插入一个显示文章
action: 单个事件指令,或事件指令数组
x: 新的当前点横坐标,可选
y: 新的当前点纵坐标,可选
callback: 新的回调函数,可选
addToLast: 插入的位置,true表示插入到末尾,否则插入到开头", - "!type": "fn(action: string|?|[?], x?: number, y?: number, callback?: fn(), addToLast?: bool)" + insertAction: { + "!doc": + "插入一段事件;此项不可插入公共事件,请用 core.insertCommonEvent
例如:core.insertAction('一段文字'); // 插入一个显示文章
action: 单个事件指令,或事件指令数组
x: 新的当前点横坐标,可选
y: 新的当前点纵坐标,可选
callback: 新的回调函数,可选
addToLast: 插入的位置,true表示插入到末尾,否则插入到开头", + "!type": + "fn(action: string|?|[?], x?: number, y?: number, callback?: fn(), addToLast?: bool)", }, - "unfollow": { + unfollow: { "!doc": "取消跟随
name: 取消跟随的行走图,不填则取消全部跟随者", - "!type": "fn(name?: string)" + "!type": "fn(name?: string)", }, - "hasVisitedFloor": { + hasVisitedFloor: { "!doc": "是否到达过某个楼层", - "!type": "fn(floorId?: string) -> bool" + "!type": "fn(floorId?: string) -> bool", }, - "startEvents": { + startEvents: { "!doc": "开始执行一系列自定义事件", - "!type": "fn(list?: [?], x?: number, y?: number, callback?: fn())" + "!type": "fn(list?: [?], x?: number, y?: number, callback?: fn())", }, - "setHeroIcon": { - "!doc": "更改主角行走图
例如:core.setHeroIcon('npc48.png', true); // 把主角从阳光变成样板0层左下角的小姐姐,但不立即刷新
name: 新的行走图文件名,可以是全塔属性中映射前的中文名。映射后会被存入core.status.hero.image
noDraw: true表示不立即刷新(刷新会导致大地图下视野重置到以主角为中心)", - "!type": "fn(name: string, noDraw?: bool)" + setHeroIcon: { + "!doc": + "更改主角行走图
例如:core.setHeroIcon('npc48.png', true); // 把主角从阳光变成样板0层左下角的小姐姐,但不立即刷新
name: 新的行走图文件名,可以是全塔属性中映射前的中文名。映射后会被存入core.status.hero.image
noDraw: true表示不立即刷新(刷新会导致大地图下视野重置到以主角为中心)", + "!type": "fn(name: string, noDraw?: bool)", }, - "changingFloor": { + changingFloor: { "!doc": "楼层转换中", - "!type": "fn(floorId?: string, heroLoc?: {x: number, y: number, direction: string})" + "!type": + "fn(floorId?: string, heroLoc?: {x: number, y: number, direction: string})", }, - "setEvents": { + setEvents: { "!doc": "直接设置事件列表", - "!type": "fn(list?: [?], x?: number, y?: number, callback?: fn())" + "!type": "fn(list?: [?], x?: number, y?: number, callback?: fn())", }, - "setValue": { + setValue: { "!doc": "数值操作", - "!type": "fn(name: string, operator: string, value: ?, prefix?: string)" + "!type": + "fn(name: string, operator: string, value: ?, prefix?: string)", }, - "precompile": { + precompile: { "!doc": "预编辑事件", - "!type": "fn(data?: ?)" + "!type": "fn(data?: ?)", }, - "vibrate": { - "!doc": "视野抖动
例如:core.vibrate(); // 视野抖动1秒
direction: 抖动方向;可填 horizontal(左右),vertical(上下),diagonal1(左上右下),diagonal2(左下右上)
time: 抖动时长
speed: 抖动速度
power: 抖动幅度
callback: 抖动平息后的回调函数,可选", - "!type": "fn(direction?: string, time?: number, speed?: number, power?: number, callback?: fn())" + vibrate: { + "!doc": + "视野抖动
例如:core.vibrate(); // 视野抖动1秒
direction: 抖动方向;可填 horizontal(左右),vertical(上下),diagonal1(左上右下),diagonal2(左下右上)
time: 抖动时长
speed: 抖动速度
power: 抖动幅度
callback: 抖动平息后的回调函数,可选", + "!type": + "fn(direction?: string, time?: number, speed?: number, power?: number, callback?: fn())", }, - "confirmRestart": { + confirmRestart: { "!doc": "询问是否需要重新开始", - "!type": "fn()" + "!type": "fn()", }, - "battle": { - "!doc": "战斗,如果填写了坐标就会删除该点的敌人并触发战后事件
例如:core.battle('greenSlime'); // 和从天而降的绿头怪战斗(如果打得过)
id: 敌人id,必填
x: 敌人的横坐标,可选
y: 敌人的纵坐标,可选
force: true表示强制战斗,可选
callback: 回调函数,可选", - "!type": "fn(id: string, x?: number, y?: number, force?: bool, callback?: fn())" + battle: { + "!doc": + "战斗,如果填写了坐标就会删除该点的敌人并触发战后事件
例如:core.battle('greenSlime'); // 和从天而降的绿头怪战斗(如果打得过)
id: 敌人id,必填
x: 敌人的横坐标,可选
y: 敌人的纵坐标,可选
force: true表示强制战斗,可选
callback: 回调函数,可选", + "!type": + "fn(id: string, x?: number, y?: number, force?: bool, callback?: fn())", }, - "follow": { - "!doc": "跟随
name: 要跟随的一个合法的4x4的行走图名称,需要在全塔属性注册", - "!type": "fn(name: string)" + follow: { + "!doc": + "跟随
name: 要跟随的一个合法的4x4的行走图名称,需要在全塔属性注册", + "!type": "fn(name: string)", }, - "beforeBattle": { + beforeBattle: { "!doc": "战斗前触发的事件;返回false代表不进行战斗", - "!type": "fn(enemyId?: string, x?: number, y?: number) -> bool" + "!type": "fn(enemyId?: string, x?: number, y?: number) -> bool", }, - "registerEvent": { - "!doc": "注册一个自定义事件
type: 事件类型
func: 事件的处理函数,可接受(data, x, y, prefix)参数
data为事件内容,x和y为当前点坐标(可为null),prefix为当前点前缀", - "!type": "fn(type: string, func: fn(data: ?, x?: number, y?: number, prefix?: string))" + registerEvent: { + "!doc": + "注册一个自定义事件
type: 事件类型
func: 事件的处理函数,可接受(data, x, y, prefix)参数
data为事件内容,x和y为当前点坐标(可为null),prefix为当前点前缀", + "!type": + "fn(type: string, func: fn(data: ?, x?: number, y?: number, prefix?: string))", }, - "flyTo": { + flyTo: { "!doc": "飞往某一层", - "!type": "fn(toId?: string, callback?: fn()) -> bool" + "!type": "fn(toId?: string, callback?: fn()) -> bool", }, - "afterGetItem": { + afterGetItem: { "!doc": "获得一个道具后的事件", - "!type": "fn(id?: string, x?: number, y?: number, isGentleClick?: bool)" + "!type": + "fn(id?: string, x?: number, y?: number, isGentleClick?: bool)", }, - "doAction": { - "!doc": "执行下一个事件指令,常作为回调
例如:core.setCurtain([0,0,0,1], null, null, core.doAction); // 事件中的原生脚本,配合勾选“不自动执行下一个事件”来达到此改变色调只持续到下次场景切换的效果", - "!type": "fn()" + doAction: { + "!doc": + "执行下一个事件指令,常作为回调
例如:core.setCurtain([0,0,0,1], null, null, core.doAction); // 事件中的原生脚本,配合勾选“不自动执行下一个事件”来达到此改变色调只持续到下次场景切换的效果", + "!type": "fn()", }, - "openBook": { + openBook: { "!doc": "点击怪物手册时的打开操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", }, - "save": { + save: { "!doc": "点击存档按钮时的打开操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", }, - "load": { + load: { "!doc": "点击读档按钮时的打开操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", }, - "getNextItem": { - "!doc": "轻按获得面前的物品或周围唯一物品
noRoute: 若为true则不计入录像", - "!type": "fn(noRoute?: bool)" + getNextItem: { + "!doc": + "轻按获得面前的物品或周围唯一物品
noRoute: 若为true则不计入录像", + "!type": "fn(noRoute?: bool)", }, - "hasAsync": { + hasAsync: { "!doc": "当前是否有未处理完毕的异步事件(不包含动画和音效)", - "!type": "fn() -> bool" + "!type": "fn() -> bool", }, - "stopAsync": { + stopAsync: { "!doc": "立刻停止所有正在进行的异步事件", - "!type": "fn()" + "!type": "fn()", }, - "openEquipbox": { + openEquipbox: { "!doc": "点击装备栏时的打开操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", }, - "recoverEvents": { + recoverEvents: { "!doc": "恢复一个事件", - "!type": "fn(data?: ?)" + "!type": "fn(data?: ?)", }, - "setGlobalFlag": { - "!doc": "设置一个系统开关
例如:core.setGlobalFlag('steelDoorWithoutKey', true); // 使全塔的所有铁门都不再需要钥匙就能打开
name: 系统开关的英文名
value: 开关的新值,您可以用!core.flags[name]简单地表示将此开关反转", - "!type": "fn(name: string, value: bool)" + setGlobalFlag: { + "!doc": + "设置一个系统开关
例如:core.setGlobalFlag('steelDoorWithoutKey', true); // 使全塔的所有铁门都不再需要钥匙就能打开
name: 系统开关的英文名
value: 开关的新值,您可以用!core.flags[name]简单地表示将此开关反转", + "!type": "fn(name: string, value: bool)", }, - "moveImage": { - "!doc": "移动一张图片并/或改变其透明度
例如:core.moveImage(1, null, 0.5); // 1秒内把1号图片变为50%透明
code: 图片编号
to: 新的左上角坐标,省略表示原地改变透明度
opacityVal: 新的透明度,省略表示不变
time: 移动用时,单位为毫秒。不填视为1秒
callback: 图片移动完毕后的回调函数,可选", - "!type": "fn(code: number, to?: [number], opacityVal?: number, moveMode?: string, time?: number, callback?: fn())" + moveImage: { + "!doc": + "移动一张图片并/或改变其透明度
例如:core.moveImage(1, null, 0.5); // 1秒内把1号图片变为50%透明
code: 图片编号
to: 新的左上角坐标,省略表示原地改变透明度
opacityVal: 新的透明度,省略表示不变
time: 移动用时,单位为毫秒。不填视为1秒
callback: 图片移动完毕后的回调函数,可选", + "!type": + "fn(code: number, to?: [number], opacityVal?: number, moveMode?: string, time?: number, callback?: fn())", }, - "rotateImage": { - "!doc": "旋转一张图片
code: 图片编号
center: 旋转中心像素坐标(以屏幕为基准);不填视为图片本身中心
angle: 旋转角度;正数为顺时针,负数为逆时针
moveMode: 旋转模式
time: 旋转用时,单位为毫秒。不填视为1秒
callback: 图片旋转完毕后的回调函数,可选", - "!type": "fn(code: number, center?: [number], angle?: number, moveMode?: string, time?: number, callback?: fn())" + rotateImage: { + "!doc": + "旋转一张图片
code: 图片编号
center: 旋转中心像素坐标(以屏幕为基准);不填视为图片本身中心
angle: 旋转角度;正数为顺时针,负数为逆时针
moveMode: 旋转模式
time: 旋转用时,单位为毫秒。不填视为1秒
callback: 图片旋转完毕后的回调函数,可选", + "!type": + "fn(code: number, center?: [number], angle?: number, moveMode?: string, time?: number, callback?: fn())", }, - "scaleImage": { + scaleImage: { "!doc": "放缩一张图片", - "!type": "fn(code: number, center?: [number], scale?: number, moveMode?: string, time?: number, callback?: fn())" + "!type": + "fn(code: number, center?: [number], scale?: number, moveMode?: string, time?: number, callback?: fn())", }, - "moveTextBox": { + moveTextBox: { "!doc": "移动对话框", - "!type": "fn(code: number, loc: [number], relative?: bool, moveMode?: string, time?: number, callback?: fn())" + "!type": + "fn(code: number, loc: [number], relative?: bool, moveMode?: string, time?: number, callback?: fn())", }, - "clearTextBox": { + clearTextBox: { "!doc": "清除对话框", - "!type": "fn(code: number)" + "!type": "fn(code: number)", }, - "openSettings": { + openSettings: { "!doc": "点击设置按钮时的操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", }, - "afterPushBox": { + afterPushBox: { "!doc": "推箱子后的事件", - "!type": "fn()" + "!type": "fn()", }, - "unregisterSystemEvent": { + unregisterSystemEvent: { "!doc": "注销一个系统事件", - "!type": "fn(type: string)" + "!type": "fn(type: string)", }, - "trigger": { - "!doc": "触发(x,y)点的系统事件;会执行该点图块的script属性,同时支持战斗(会触发战后)、道具(会触发道具后)、楼层切换等等
callback: 执行完毕的回调函数
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(x?: number, y?: number, callback?: fn())" + trigger: { + "!doc": + "触发(x,y)点的系统事件;会执行该点图块的script属性,同时支持战斗(会触发战后)、道具(会触发道具后)、楼层切换等等
callback: 执行完毕的回调函数
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": "fn(x?: number, y?: number, callback?: fn())", }, - "restart": { + restart: { "!doc": "重新开始游戏;此函数将回到标题页面", - "!type": "fn()" + "!type": "fn()", }, - "doEvent": { + doEvent: { "!doc": "执行一个自定义事件", - "!type": "fn(data?: ?, x?: number, y?: number, prefix?: string)" + "!type": "fn(data?: ?, x?: number, y?: number, prefix?: string)", }, - "win": { + win: { "!doc": "游戏获胜事件", - "!type": "fn(reason?: string, norank?: bool, noexit?: bool)" + "!type": "fn(reason?: string, norank?: bool, noexit?: bool)", }, - "setGlobalAttribute": { + setGlobalAttribute: { "!doc": "设置全塔属性", - "!type": "fn(name: string, value: string)" + "!type": "fn(name: string, value: string)", }, - "setNameMap": { + setNameMap: { "!doc": "设置文件别名", - "!type": "fn(name: string, value?: string)" + "!type": "fn(name: string, value?: string)", }, - "setTextAttribute": { + setTextAttribute: { "!doc": "设置剧情文本的属性", - "!type": "fn(data: ?)" + "!type": "fn(data: ?)", }, - "openToolbox": { + openToolbox: { "!doc": "点击工具栏时的打开操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", }, - "setVolume": { - "!doc": "调节bgm的音量
例如:core.setVolume(0, 100, core.jumpHero); // 0.1秒内淡出bgm,然后主角原地跳跃半秒
value: 新的音量,为0或不大于1的正数。注意系统设置中是这个值的平方根的十倍
time: 渐变用时,单位为毫秒。不填或小于100毫秒都视为0
callback: 渐变完成后的回调函数,可选", - "!type": "fn(value: number, time?: number, callback?: fn())" + setVolume: { + "!doc": + "调节bgm的音量
例如:core.setVolume(0, 100, core.jumpHero); // 0.1秒内淡出bgm,然后主角原地跳跃半秒
value: 新的音量,为0或不大于1的正数。注意系统设置中是这个值的平方根的十倍
time: 渐变用时,单位为毫秒。不填或小于100毫秒都视为0
callback: 渐变完成后的回调函数,可选", + "!type": "fn(value: number, time?: number, callback?: fn())", }, - "pushEventLoc": { + pushEventLoc: { "!doc": "将当前点坐标入栈", - "!type": "fn(x?: number, y?: number, floorId?: string) -> bool" + "!type": "fn(x?: number, y?: number, floorId?: string) -> bool", }, - "openKeyBoard": { + openKeyBoard: { "!doc": "点击虚拟键盘时的打开操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", }, - "insertCommonEvent": { - "!doc": "插入一个公共事件
例如:core.insertCommonEvent('加点事件', [3]);
name: 公共事件名;如果公共事件不存在则直接忽略
args: 参数列表,为一个数组,将依次赋值给 flag:arg1, flag:arg2, ...
x: 新的当前点横坐标,可选
y: 新的当前点纵坐标,可选
callback: 新的回调函数,可选
addToLast: 插入的位置,true表示插入到末尾,否则插入到开头", - "!type": "fn(name?: string, args?: [?], x?: number, y?: number, callback?: fn(), addToLast?: bool)" + insertCommonEvent: { + "!doc": + "插入一个公共事件
例如:core.insertCommonEvent('加点事件', [3]);
name: 公共事件名;如果公共事件不存在则直接忽略
args: 参数列表,为一个数组,将依次赋值给 flag:arg1, flag:arg2, ...
x: 新的当前点横坐标,可选
y: 新的当前点纵坐标,可选
callback: 新的回调函数,可选
addToLast: 插入的位置,true表示插入到末尾,否则插入到开头", + "!type": + "fn(name?: string, args?: [?], x?: number, y?: number, callback?: fn(), addToLast?: bool)", }, - "hideImage": { - "!doc": "隐藏一张图片
例如:core.hideImage(1, 1000, core.jumpHero); // 1秒内淡出1号图片,然后主角原地跳跃半秒
code: 图片编号
time: 淡出时间,单位为毫秒
callback: 图片完全消失后的回调函数,可选", - "!type": "fn(code: number, time?: number, callback?: fn())" + hideImage: { + "!doc": + "隐藏一张图片
例如:core.hideImage(1, 1000, core.jumpHero); // 1秒内淡出1号图片,然后主角原地跳跃半秒
code: 图片编号
time: 淡出时间,单位为毫秒
callback: 图片完全消失后的回调函数,可选", + "!type": "fn(code: number, time?: number, callback?: fn())", }, - "visitFloor": { + visitFloor: { "!doc": "到达某楼层", - "!type": "fn(floorId?: string)" + "!type": "fn(floorId?: string)", }, - "openQuickShop": { + openQuickShop: { "!doc": "点击快捷商店按钮时的打开操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", }, - "afterBattle": { + afterBattle: { "!doc": "战斗结束后触发的事件", - "!type": "fn(enemyId?: string, x?: number, y?: number)" + "!type": "fn(enemyId?: string, x?: number, y?: number)", }, - "pushBox": { + pushBox: { "!doc": "推箱子", - "!type": "fn(data?: ?)" + "!type": "fn(data?: ?)", }, - "autoEventExecuted": { + autoEventExecuted: { "!doc": "当前是否执行过某个自动事件", - "!type": "fn(symbol?: string, value?: ?) -> bool" + "!type": "fn(symbol?: string, value?: ?) -> bool", }, - "onSki": { + onSki: { "!doc": "当前是否在冰上", - "!type": "fn(number?: number) -> bool" + "!type": "fn(number?: number) -> bool", }, - "showImage": { - "!doc": "显示一张图片
例如:core.showImage(1, core.material.images.images['winskin.png'], [0,0,128,128], [0,0,416,416], 0.5, 1000); // 裁剪winskin.png的最左边128×128px,放大到铺满整个视野,1秒内淡入到50%透明,编号为1
code: 图片编号,为不大于50的正整数,加上100后就是对应画布层的z值,较大的会遮罩较小的,注意色调层的z值为125,UI层为140
image: 图片文件名(可以是全塔属性中映射前的中文名)或图片对象(见上面的例子)
sloc: 一行且至多四列的数组,表示从原图裁剪的左上角坐标和宽高,可选
loc: 一行且至多四列的数组,表示图片在视野中的左上角坐标和宽高,可选
opacityVal: 不透明度,为小于1的正数。不填视为1
time: 淡入时间,单位为毫秒。不填视为0
callback: 图片完全显示出来后的回调函数,可选", - "!type": "fn(code: number, image: string|image, sloc?: [number], loc?: [number], opacityVal?: number, time?: number, callback?: fn())" + showImage: { + "!doc": + "显示一张图片
例如:core.showImage(1, core.material.images.images['winskin.png'], [0,0,128,128], [0,0,416,416], 0.5, 1000); // 裁剪winskin.png的最左边128×128px,放大到铺满整个视野,1秒内淡入到50%透明,编号为1
code: 图片编号,为不大于50的正整数,加上100后就是对应画布层的z值,较大的会遮罩较小的,注意色调层的z值为125,UI层为140
image: 图片文件名(可以是全塔属性中映射前的中文名)或图片对象(见上面的例子)
sloc: 一行且至多四列的数组,表示从原图裁剪的左上角坐标和宽高,可选
loc: 一行且至多四列的数组,表示图片在视野中的左上角坐标和宽高,可选
opacityVal: 不透明度,为小于1的正数。不填视为1
time: 淡入时间,单位为毫秒。不填视为0
callback: 图片完全显示出来后的回调函数,可选", + "!type": + "fn(code: number, image: string|image, sloc?: [number], loc?: [number], opacityVal?: number, time?: number, callback?: fn())", }, - "getItem": { - "!doc": "获得道具并提示,如果填写了坐标就会删除该点的该道具
例如:core.getItem('book'); // 获得敌人手册并提示
id: 道具id,必填
num: 获得的数量,不填视为1,填了就别填坐标了
x: 道具的横坐标,可选
y: 道具的纵坐标,可选
callback: 回调函数,可选", - "!type": "fn(id: string, num?: number, x?: number, y?: number, callback?: fn())" + getItem: { + "!doc": + "获得道具并提示,如果填写了坐标就会删除该点的该道具
例如:core.getItem('book'); // 获得敌人手册并提示
id: 道具id,必填
num: 获得的数量,不填视为1,填了就别填坐标了
x: 道具的横坐标,可选
y: 道具的纵坐标,可选
callback: 回调函数,可选", + "!type": + "fn(id: string, num?: number, x?: number, y?: number, callback?: fn())", }, - "registerSystemEvent": { - "!doc": "注册一个系统事件
type: 事件名
func: 为事件的处理函数,可接受(data,callback)参数", - "!type": "fn(type: string, func: fn(data?: ?, callback?: fn()))" + registerSystemEvent: { + "!doc": + "注册一个系统事件
type: 事件名
func: 为事件的处理函数,可接受(data,callback)参数", + "!type": "fn(type: string, func: fn(data?: ?, callback?: fn()))", }, - "startGame": { - "!doc": "开始新游戏
例如:core.startGame('咸鱼乱撞', 0, ''); // 开始一局咸鱼乱撞难度的新游戏,随机种子为0
hard: 难度名,会显示在左下角(横屏)或右下角(竖屏)
seed: 随机种子,相同的种子保证了录像的可重复性
route: 经由base64压缩后的录像,用于从头开始的录像回放
callback: 回调函数,可选", - "!type": "fn(hard: string, seed: number, route: string, callback?: fn())" + startGame: { + "!doc": + "开始新游戏
例如:core.startGame('咸鱼乱撞', 0, ''); // 开始一局咸鱼乱撞难度的新游戏,随机种子为0
hard: 难度名,会显示在左下角(横屏)或右下角(竖屏)
seed: 随机种子,相同的种子保证了录像的可重复性
route: 经由base64压缩后的录像,用于从头开始的录像回放
callback: 回调函数,可选", + "!type": + "fn(hard: string, seed: number, route: string, callback?: fn())", }, - "doSystemEvent": { + doSystemEvent: { "!doc": "执行一个系统事件", - "!type": "fn(type: string, data?: ?, callback?: fn())" + "!type": "fn(type: string, data?: ?, callback?: fn())", }, - "resetGame": { + resetGame: { "!doc": "初始化游戏", - "!type": "fn(hero?: ?, hard?: ?, floorId?: string, maps?: ?, values?: ?)" + "!type": + "fn(hero?: ?, hard?: ?, floorId?: string, maps?: ?, values?: ?)", }, - "setFloorInfo": { - "!doc": "设置一项楼层属性并刷新状态栏
例如:core.setFloorInfo('ratio', 2, 'MT0'); // 把主塔0层的血瓶和宝石变为双倍效果
name: 要修改的属性名
values: 属性的新值。
floorId: 楼层id,不填视为当前层
prefix: 独立开关前缀,一般不需要", - "!type": "fn(name: string, values: ?, floorId?: string, prefix?: string)" + setFloorInfo: { + "!doc": + "设置一项楼层属性并刷新状态栏
例如:core.setFloorInfo('ratio', 2, 'MT0'); // 把主塔0层的血瓶和宝石变为双倍效果
name: 要修改的属性名
values: 属性的新值。
floorId: 楼层id,不填视为当前层
prefix: 独立开关前缀,一般不需要", + "!type": + "fn(name: string, values: ?, floorId?: string, prefix?: string)", }, - "openDoor": { - "!doc": "开门(包括三种基础墙)
例如:core.openDoor(0, 0, true, core.jumpHero); // 打开左上角的门,需要钥匙,然后主角原地跳跃半秒
x: 门的横坐标
y: 门的纵坐标
needKey: true表示需要钥匙,会导致机关门打不开
callback: 门完全打开后或打不开时的回调函数,可选
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(x: number, y: number, needKey?: bool, callback?: fn())" + openDoor: { + "!doc": + "开门(包括三种基础墙)
例如:core.openDoor(0, 0, true, core.jumpHero); // 打开左上角的门,需要钥匙,然后主角原地跳跃半秒
x: 门的横坐标
y: 门的纵坐标
needKey: true表示需要钥匙,会导致机关门打不开
callback: 门完全打开后或打不开时的回调函数,可选
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": "fn(x: number, y: number, needKey?: bool, callback?: fn())", }, - "setEnemy": { - "!doc": "设置一项敌人属性并计入存档
例如:core.setEnemy('greenSlime', 'def', 0); // 把绿头怪的防御设为0
id: 敌人id
name: 属性的英文缩写
value: 属性的新值,可选
operator: 运算操作符如+=,可选
prefix: 独立开关前缀,一般不需要,下同", - "!type": "fn(id: string, name: string, value: ?, operator?: string, prefix?: string)" + setEnemy: { + "!doc": + "设置一项敌人属性并计入存档
例如:core.setEnemy('greenSlime', 'def', 0); // 把绿头怪的防御设为0
id: 敌人id
name: 属性的英文缩写
value: 属性的新值,可选
operator: 运算操作符如+=,可选
prefix: 独立开关前缀,一般不需要,下同", + "!type": + "fn(id: string, name: string, value: ?, operator?: string, prefix?: string)", }, - "setEnemyOnPoint": { - "!doc": "设置某个点的敌人属性。如果该点不是怪物,则忽略此函数。
例如:core.setEnemyOnPoint(3, 5, null, 'atk', 100, '+='); // 仅将(3,5)点怪物的攻击力加100。", - "!type": "fn(x: number, y: number, floorId?: string, name: string, value: ?, operator?: string, prefix?: string)" + setEnemyOnPoint: { + "!doc": + "设置某个点的敌人属性。如果该点不是怪物,则忽略此函数。
例如:core.setEnemyOnPoint(3, 5, null, 'atk', 100, '+='); // 仅将(3,5)点怪物的攻击力加100。", + "!type": + "fn(x: number, y: number, floorId?: string, name: string, value: ?, operator?: string, prefix?: string)", }, - "resetEnemyOnPoint": { + resetEnemyOnPoint: { "!doc": "重置某个点的怪物属性", - "!type": "fn(x: number, y: number, floorId?: string)" + "!type": "fn(x: number, y: number, floorId?: string)", }, - "moveEnemyOnPoint": { + moveEnemyOnPoint: { "!doc": "将某个点已经设置的敌人属性移动到其他点", - "!type": "fn(fromX: number, fromY: number, toX: number, toY: number, floorId?: string)" + "!type": + "fn(fromX: number, fromY: number, toX: number, toY: number, floorId?: string)", }, - "autoEventExecuting": { + autoEventExecuting: { "!doc": "当前是否在执行某个自动事件", - "!type": "fn(symbol?: string, value?: ?) -> bool" + "!type": "fn(symbol?: string, value?: ?) -> bool", }, - "checkAutoEvents": { + checkAutoEvents: { "!doc": "检测自动事件", - "!type": "fn()" + "!type": "fn()", }, - "showGif": { - "!doc": "绘制一张动图或擦除所有动图
例如:core.showGif(); // 擦除所有动图
name: 动图文件名,可以是全塔属性中映射前的中文名
x: 动图在视野中的左上角横坐标
y: 动图在视野中的左上角纵坐标", - "!type": "fn(name?: string, x?: number, y?: number)" + showGif: { + "!doc": + "绘制一张动图或擦除所有动图
例如:core.showGif(); // 擦除所有动图
name: 动图文件名,可以是全塔属性中映射前的中文名
x: 动图在视野中的左上角横坐标
y: 动图在视野中的左上角纵坐标", + "!type": "fn(name?: string, x?: number, y?: number)", }, - "unregisterEvent": { + unregisterEvent: { "!doc": "注销一个自定义事件", - "!type": "fn(type: string)" + "!type": "fn(type: string)", }, - "jumpHero": { - "!doc": "主角跳跃,跳跃勇士。ex和ey为目标点的坐标,可以为null表示原地跳跃。time为总跳跃时间。
例如:core.jumpHero(); // 主角原地跳跃半秒
ex: 跳跃后的横坐标
ey: 跳跃后的纵坐标
time: 跳跃时长,单位为毫秒。不填视为半秒
callback: 跳跃完毕后的回调函数,可选
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(ex?: number, ey?: number, time?: number, callback?: fn())" + jumpHero: { + "!doc": + "主角跳跃,跳跃勇士。ex和ey为目标点的坐标,可以为null表示原地跳跃。time为总跳跃时间。
例如:core.jumpHero(); // 主角原地跳跃半秒
ex: 跳跃后的横坐标
ey: 跳跃后的纵坐标
time: 跳跃时长,单位为毫秒。不填视为半秒
callback: 跳跃完毕后的回调函数,可选
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": + "fn(ex?: number, ey?: number, time?: number, callback?: fn())", }, - "closeDoor": { - "!doc": "关门,目标点必须为空地
例如:core.closeDoor(0, 0, 'yellowWall', core.jumpHero); // 在左上角关掉一堵黄墙,然后主角原地跳跃半秒
x: 横坐标
y: 纵坐标
id: 门的id,也可以用三种基础墙
callback: 门完全关上后的回调函数,可选
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(x: number, y: number, id: string, callback?: fn())" + closeDoor: { + "!doc": + "关门,目标点必须为空地
例如:core.closeDoor(0, 0, 'yellowWall', core.jumpHero); // 在左上角关掉一堵黄墙,然后主角原地跳跃半秒
x: 横坐标
y: 纵坐标
id: 门的id,也可以用三种基础墙
callback: 门完全关上后的回调函数,可选
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": "fn(x: number, y: number, id: string, callback?: fn())", }, - "eventMoveHero": { - "!doc": "强制移动主角(包括后退),这个函数的作者已经看不懂这个函数了
例如:core.eventMoveHero(['forward'], 125, core.jumpHero); // 主角强制前进一步,用时1/8秒,然后主角原地跳跃半秒
steps: 步伐数组,注意后退时跟随者的行为会很难看
time: 每步的用时,单位为毫秒。0或不填则取主角的移速,如果后者也不存在就取0.1秒
callback: 移动完毕后的回调函数,可选
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(steps: [step], time?: number, callback?: fn())" + eventMoveHero: { + "!doc": + "强制移动主角(包括后退),这个函数的作者已经看不懂这个函数了
例如:core.eventMoveHero(['forward'], 125, core.jumpHero); // 主角强制前进一步,用时1/8秒,然后主角原地跳跃半秒
steps: 步伐数组,注意后退时跟随者的行为会很难看
time: 每步的用时,单位为毫秒。0或不填则取主角的移速,如果后者也不存在就取0.1秒
callback: 移动完毕后的回调函数,可选
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": "fn(steps: [step], time?: number, callback?: fn())", }, - "changeFloor": { - "!doc": "场景切换
例如:core.changeFloor('MT0'); // 传送到主塔0层,主角坐标和朝向不变,黑屏时间取用户定义的值
floorId: 传送的目标地图id,可以填':before'和':next'分别表示楼下或楼上
stair: 传送的位置
heroLoc: 传送的坐标;会覆盖stair
time: 传送的黑屏时间,单位为毫秒;不填为用户设置值
callback: 传送的回调函数
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(floorId: string, stair?: string, heroLoc?: {x?: number, y?: number, direction?: string}, time?: number, callback?: fn())" + changeFloor: { + "!doc": + "场景切换
例如:core.changeFloor('MT0'); // 传送到主塔0层,主角坐标和朝向不变,黑屏时间取用户定义的值
floorId: 传送的目标地图id,可以填':before'和':next'分别表示楼下或楼上
stair: 传送的位置
heroLoc: 传送的坐标;会覆盖stair
time: 传送的黑屏时间,单位为毫秒;不填为用户设置值
callback: 传送的回调函数
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": + "fn(floorId: string, stair?: string, heroLoc?: {x?: number, y?: number, direction?: string}, time?: number, callback?: fn())", }, - "getCommonEvent": { + getCommonEvent: { "!doc": "获得一个公共事件", - "!type": "fn(name: string) -> [?]" + "!type": "fn(name: string) -> [?]", }, - "lose": { + lose: { "!doc": "游戏失败事件", - "!type": "fn(reason?: string)" + "!type": "fn(reason?: string)", }, - "gameOver": { - "!doc": "游戏结束
例如:core.gameOver(); // 游戏失败
ending: 结局名,省略表示失败
fromReplay: true表示在播放录像,可选
norank: true表示不计入榜单,可选", - "!type": "fn(ending?: string, fromReplay?: bool, norank?: bool)" + gameOver: { + "!doc": + "游戏结束
例如:core.gameOver(); // 游戏失败
ending: 结局名,省略表示失败
fromReplay: true表示在播放录像,可选
norank: true表示不计入榜单,可选", + "!type": "fn(ending?: string, fromReplay?: bool, norank?: bool)", }, - "useFly": { + useFly: { "!doc": "点击楼层传送器时的打开操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", + }, + tryUseItem: { + "!doc": + "尝试使用一个道具
例如:core.tryUseItem('pickaxe'); // 尝试使用破墙镐
itemId: 道具id,其中敌人手册、传送器和飞行器会被特殊处理", + "!type": "fn(itemId: string)", }, - "tryUseItem": { - "!doc": "尝试使用一个道具
例如:core.tryUseItem('pickaxe'); // 尝试使用破墙镐
itemId: 道具id,其中敌人手册、传送器和飞行器会被特殊处理", - "!type": "fn(itemId: string)" - } }, - "plugin": { + plugin: { "!doc": "插件编写中内置了一些常用的插件。", - "drawLight": { - "!doc": "绘制一段灯光效果
name:必填,要绘制到的画布名;可以是一个系统画布,或者是个自定义画布;如果不存在则创建
color:可选,只能是一个0~1之间的数,为不透明度的值。不填则默认为0.9。
lights:可选,一个数组,定义了每个独立的灯光。其中每一项是三元组 [x,y,r] x和y分别为该灯光的横纵坐标,r为该灯光的半径。
lightDec:可选,0到1之间,光从多少百分比才开始衰减(在此范围内保持全亮),不设置默认为0。比如lightDec为0.5代表,每个灯光部分内圈50%的范围全亮,50%以后才开始快速衰减。
例如:core.plugin.drawLight('test', 0.2, [[25,11,46,0.1]]); // 创建一个test图层,不透明度0.2,其中在(25,11)点存在一个半径为46的灯光效果,灯光中心不透明度0.1。
core.plugin.drawLight('test2', 0.9, [[25,11,46],[105,121,88],[301,221,106]]); // 创建test2图层,且存在三个灯光效果,分别是中心(25,11)半径46,中心(105,121)半径88,中心(301,221)半径106。", - "!type": "fn(name: string|CanvasRenderingContext2D, color?: number, lights?: [[number]], lightDec?: number)" + drawLight: { + "!doc": + "绘制一段灯光效果
name:必填,要绘制到的画布名;可以是一个系统画布,或者是个自定义画布;如果不存在则创建
color:可选,只能是一个0~1之间的数,为不透明度的值。不填则默认为0.9。
lights:可选,一个数组,定义了每个独立的灯光。其中每一项是三元组 [x,y,r] x和y分别为该灯光的横纵坐标,r为该灯光的半径。
lightDec:可选,0到1之间,光从多少百分比才开始衰减(在此范围内保持全亮),不设置默认为0。比如lightDec为0.5代表,每个灯光部分内圈50%的范围全亮,50%以后才开始快速衰减。
例如:core.plugin.drawLight('test', 0.2, [[25,11,46,0.1]]); // 创建一个test图层,不透明度0.2,其中在(25,11)点存在一个半径为46的灯光效果,灯光中心不透明度0.1。
core.plugin.drawLight('test2', 0.9, [[25,11,46],[105,121,88],[301,221,106]]); // 创建test2图层,且存在三个灯光效果,分别是中心(25,11)半径46,中心(105,121)半径88,中心(301,221)半径106。", + "!type": + "fn(name: string|CanvasRenderingContext2D, color?: number, lights?: [[number]], lightDec?: number)", }, - "openShop": { - "!doc": "打开一个全局商店
shopId: 要开启的商店ID
noRoute: 打开行为是否不计入录像", - "!type": "fn(shopId: string, noRoute?: bool)" + openShop: { + "!doc": + "打开一个全局商店
shopId: 要开启的商店ID
noRoute: 打开行为是否不计入录像", + "!type": "fn(shopId: string, noRoute?: bool)", }, - "isShopVisited": { + isShopVisited: { "!doc": "某个全局商店是否被访问过", - "!type": "fn(id: string) -> bool" + "!type": "fn(id: string) -> bool", }, - "listShopIds": { + listShopIds: { "!doc": "列出所有应当显示的快捷商店列表", - "!type": "fn() -> [string]" + "!type": "fn() -> [string]", }, - "canOpenShop": { + canOpenShop: { "!doc": "当前能否打开某个商店", - "!type": "fn(id: string) -> bool" + "!type": "fn(id: string) -> bool", }, - "setShopVisited": { + setShopVisited: { "!doc": "设置某个商店的访问状态", - "!type": "fn(id: string, visited?: bool)" + "!type": "fn(id: string, visited?: bool)", }, - "canUseQuickShop": { - "!doc": "当前能否使用某个快捷商店
如果返回一个字符串,则代表不能,返回的字符串作为不能的提示;返回null表示可以使用", - "!type": "fn(id: string) -> string" + canUseQuickShop: { + "!doc": + "当前能否使用某个快捷商店
如果返回一个字符串,则代表不能,返回的字符串作为不能的提示;返回null表示可以使用", + "!type": "fn(id: string) -> string", }, - "removeMaps": { - "!doc": "删除某一些楼层;删除后不会存入存档,不可浏览地图也不可飞到。
fromId: 开始删除的楼层ID
toId: 删除到的楼层编号;可选,不填则视为fromId
例如:core.removeMaps(\"MT1\", \"MT300\") 删除MT1~MT300之间的全部层
core.removeMaps(\"MT10\") 只删除MT10层", - "!type": "fn(fromId: string, toId?: string)" + removeMaps: { + "!doc": + '删除某一些楼层;删除后不会存入存档,不可浏览地图也不可飞到。
fromId: 开始删除的楼层ID
toId: 删除到的楼层编号;可选,不填则视为fromId
例如:core.removeMaps("MT1", "MT300") 删除MT1~MT300之间的全部层
core.removeMaps("MT10") 只删除MT10层', + "!type": "fn(fromId: string, toId?: string)", }, - "resumeMaps": { - "!doc": "恢复某一些被删除楼层。
fromId: 开始恢复的楼层ID
toId: 恢复到的楼层编号;可选,不填则视为fromId
例如:core.resumeMaps(\"MT1\", \"MT300\") 恢复MT1~MT300之间的全部层
core.resumeMaps(\"MT10\") 只删恢复MT10层", - "!type": "fn(fromId: string, toId?: string)" + resumeMaps: { + "!doc": + '恢复某一些被删除楼层。
fromId: 开始恢复的楼层ID
toId: 恢复到的楼层编号;可选,不填则视为fromId
例如:core.resumeMaps("MT1", "MT300") 恢复MT1~MT300之间的全部层
core.resumeMaps("MT10") 只删恢复MT10层', + "!type": "fn(fromId: string, toId?: string)", }, - "autoRemoveMaps": { + autoRemoveMaps: { "!doc": "根据楼层分区信息自动砍层与恢复", - "!type": "fn(floorId: string)" + "!type": "fn(floorId: string)", }, - "openItemShop": { + openItemShop: { "!doc": "打开一个道具商店", - "!type": "fn(itemShopId: string)" - } - } + "!type": "fn(itemShopId: string)", + }, + }, }, - "lzw_encode": { + lzw_encode: { "!doc": "LZW压缩算法", "!url": "https://gist.github.com/revolunet/843889", - "!type": "fn(s: string) -> string" + "!type": "fn(s: string) -> string", }, - "lzw_decode": { + lzw_decode: { "!doc": "LZW解压缩算法", "!url": "https://gist.github.com/revolunet/843889", - "!type": "fn(s: string) -> string" + "!type": "fn(s: string) -> string", }, - "hero": { + hero: { "!type": "heroStatus", "!doc": "勇士信息,为 core.status.hero 的简写", }, - "flags": { + flags: { "!type": "flag", "!doc": "游戏中用到的变量,为 core.status.hero.flags 的简写", - } - } -]; \ No newline at end of file + }, + }, +]; diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index fdb313d..c488ffd 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -567,7 +567,7 @@ doorInfo_m /* doorInfo_m tooltip : 开门信息 -default : [160, 'door.mp3', 'door.mp3'] +default : [160, 'door.opus', 'door.opus'] helpUrl : /_docs/#/instruction EvalString_0 = EvalString_0 && (', "openSound": "' + EvalString_0 + '"'); EvalString_1 = EvalString_1 && (', "closeSound": "' + EvalString_1 + '"'); @@ -4626,7 +4626,7 @@ IdString FixedId_List : '生命'|'生命上限'|'攻击'|'防御'|'法强'|'魔攻比例'|'护盾比例'|'黄钥匙'|'蓝钥匙'|'红钥匙'|'金币'|'经验'|'魔力'|'魔力上限'|'当前横坐标'|'当前纵坐标'|'当前朝向'|'攻击增益'|'防御增益'|'护盾增益' - /*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']*/; + /*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 : '变量' | '状态' | '物品' | '增益' | '独立开关' | '临时变量' |'全局存储' diff --git a/_server/editor_blocklyconfig.js b/_server/editor_blocklyconfig.js index 6c99618..b0f038c 100644 --- a/_server/editor_blocklyconfig.js +++ b/_server/editor_blocklyconfig.js @@ -132,8 +132,8 @@ editor_blocklyconfig = function () { MotaActionFunctions.actionParser.parse( { time: 160, - openSound: "door.mp3", - closeSound: "door.mp3", + openSound: "door.opus", + closeSound: "door.opus", keys: { yellowKey: 1, orangeKey: 1 }, }, "doorInfo" @@ -142,9 +142,9 @@ editor_blocklyconfig = function () { MotaActionBlocks["mainStyle_m"].xmlText(), MotaActionFunctions.actionParser.parse( { - 背景音乐: "bgm.mp3", - 确定: "confirm.mp3", - 攻击: "attack.mp3", + 背景音乐: "bgm.opus", + 确定: "confirm.opus", + 攻击: "attack.opus", 背景图: "bg.jpg", 领域: "zone", 文件名: "file.jpg", diff --git a/project/animates/hand.animate b/project/animates/hand.animate index 09c9514..2c4a168 100644 --- a/project/animates/hand.animate +++ b/project/animates/hand.animate @@ -1 +1 @@ -{"ratio":2,"se":"attack.mp3","bitmaps":["data:image/png;base64,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","data:image/png;base64,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","data:image/png;base64,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","","","","","","",""],"frame_max":8,"frames":[[[0,0,0,30,120]],[[0,0,0,50,255]],[[0,0,0,70,255]],[[1,0,0,80,255]],[[1,0,0,90,255]],[[2,0,0,90,120]],[],[]]} \ No newline at end of file +{"ratio":2,"se":"attack.opus","bitmaps":["data:image/png;base64,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","data:image/png;base64,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","data:image/png;base64,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","","","","","","",""],"frame_max":8,"frames":[[[0,0,0,30,120]],[[0,0,0,50,255]],[[0,0,0,70,255]],[[1,0,0,80,255]],[[1,0,0,90,255]],[[2,0,0,90,120]],[],[]]} \ No newline at end of file diff --git a/project/data.js b/project/data.js index c458804..1a1c452 100644 --- a/project/data.js +++ b/project/data.js @@ -1136,7 +1136,8 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = }, "followers": [], "steps": 0, - "matk": 0 + "matk": 0, + "spell": null }, "startCanvas": [ { diff --git a/project/functions.js b/project/functions.js index 770d92d..36fc93e 100644 --- a/project/functions.js +++ b/project/functions.js @@ -2,259 +2,286 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { "events": { "resetGame": function (hero, hard, floorId, maps, values) { - // 重置整个游戏;此函数将在游戏开始时,或者每次读档时最先被调用 - // hero:勇士信息;hard:难度;floorId:当前楼层ID;maps:地图信息;values:全局数值信息 + // 重置整个游戏;此函数将在游戏开始时,或者每次读档时最先被调用 + // hero:勇士信息;hard:难度;floorId:当前楼层ID;maps:地图信息;values:全局数值信息 - // 清除游戏数据 - // 这一步会清空状态栏和全部画布内容,并删除所有动态创建的画布 - core.clearStatus(); - // 初始化status - core.status = core.clone(core.initStatus, function (name) { - return name != 'hero' && name != 'maps'; - }); - core.control._bindRoutePush(); - core.status.played = true; - // 初始化人物,图标,统计信息 - core.status.hero = core.clone(hero); - window.hero = core.status.hero; - window.flags = core.status.hero.flags; - core.events.setHeroIcon(core.status.hero.image, true); - core.control._initStatistics(core.animateFrame.totalTime); - core.status.hero.statistics.totalTime = core.animateFrame.totalTime = - Math.max(core.status.hero.statistics.totalTime, core.animateFrame.totalTime); - core.status.hero.statistics.start = null; - // 初始难度 - core.status.hard = hard || ""; - // 初始化地图 - core.status.floorId = floorId; - core.status.maps = maps; - core.maps._resetFloorImages(); - // 初始化怪物和道具 - core.material.enemys = core.enemys.getEnemys(); - core.material.items = core.items.getItems(); - // 初始化全局数值和全局开关 - core.values = core.clone(core.data.values); - for (var key in values || {}) - core.values[key] = values[key]; - core.flags = core.clone(core.data.flags); - var globalFlags = core.getFlag("globalFlags", {}); - for (var key in globalFlags) - core.flags[key] = globalFlags[key]; - core._init_sys_flags(); - // 初始化界面,状态栏等 - core.resize(); - // 状态栏是否显示 - if (core.hasFlag('hideStatusBar')) - core.hideStatusBar(core.hasFlag('showToolbox')); - else - core.showStatusBar(); - // 隐藏右下角的音乐按钮 - core.dom.musicBtn.style.display = 'none'; - }, + // 清除游戏数据 + // 这一步会清空状态栏和全部画布内容,并删除所有动态创建的画布 + core.clearStatus(); + // 初始化status + core.status = core.clone(core.initStatus, function (name) { + return name != "hero" && name != "maps"; + }); + core.control._bindRoutePush(); + core.status.played = true; + // 初始化人物,图标,统计信息 + core.status.hero = core.clone(hero); + window.hero = core.status.hero; + window.flags = core.status.hero.flags; + core.events.setHeroIcon(core.status.hero.image, true); + core.control._initStatistics(core.animateFrame.totalTime); + core.status.hero.statistics.totalTime = core.animateFrame.totalTime = + Math.max( + core.status.hero.statistics.totalTime, + core.animateFrame.totalTime + ); + core.status.hero.statistics.start = null; + // 初始难度 + core.status.hard = hard || ""; + // 初始化地图 + core.status.floorId = floorId; + core.status.maps = maps; + core.maps._resetFloorImages(); + // 初始化怪物和道具 + core.material.enemys = core.enemys.getEnemys(); + core.material.items = core.items.getItems(); + // 初始化全局数值和全局开关 + core.values = core.clone(core.data.values); + for (var key in values || {}) core.values[key] = values[key]; + core.flags = core.clone(core.data.flags); + var globalFlags = core.getFlag("globalFlags", {}); + for (var key in globalFlags) core.flags[key] = globalFlags[key]; + core._init_sys_flags(); + // 初始化界面,状态栏等 + core.resize(); + // 状态栏是否显示 + if (core.hasFlag("hideStatusBar")) + core.hideStatusBar(core.hasFlag("showToolbox")); + else core.showStatusBar(); + // 隐藏右下角的音乐按钮 + core.dom.musicBtn.style.display = "none"; + }, "win": function (reason, norank, noexit) { - // 游戏获胜事件 - // 请注意,成绩统计时是按照hp进行上传并排名 - // 可以先在这里对最终分数进行计算,比如将2倍攻击和5倍黄钥匙数量加到分数上 - // core.status.hero.hp += 2 * core.getRealStatus('atk') + 5 * core.itemCount('yellowKey'); + // 游戏获胜事件 + // 请注意,成绩统计时是按照hp进行上传并排名 + // 可以先在这里对最终分数进行计算,比如将2倍攻击和5倍黄钥匙数量加到分数上 + // core.status.hero.hp += 2 * core.getRealStatus('atk') + 5 * core.itemCount('yellowKey'); - // 如果不退出,则临时存储数据 - if (noexit) { - core.status.extraEvent = core.clone(core.status.event); - } + // 如果不退出,则临时存储数据 + if (noexit) { + core.status.extraEvent = core.clone(core.status.event); + } - // 游戏获胜事件 - core.ui.closePanel(); - var replaying = core.isReplaying(); - if (replaying) core.stopReplay(); - core.waitHeroToStop(function () { - if (!noexit) { - core.clearMap('all'); // 清空全地图 - core.deleteAllCanvas(); // 删除所有创建的画布 - core.dom.gif2.innerHTML = ""; - } - reason = core.replaceText(reason); - core.drawText([ - "\t[" + (reason || "恭喜通关") + "]你的分数是${status:hp}。" - ], function () { - core.events.gameOver(reason || '', replaying, norank); - }) - }); -}, + // 游戏获胜事件 + core.ui.closePanel(); + var replaying = core.isReplaying(); + if (replaying) core.stopReplay(); + core.waitHeroToStop(function () { + if (!noexit) { + core.clearMap("all"); // 清空全地图 + core.deleteAllCanvas(); // 删除所有创建的画布 + core.dom.gif2.innerHTML = ""; + } + reason = core.replaceText(reason); + core.drawText( + ["\t[" + (reason || "恭喜通关") + "]你的分数是${status:hp}。"], + function () { + core.events.gameOver(reason || "", replaying, norank); + } + ); + }); + }, "lose": function (reason) { - // 游戏失败事件 - core.ui.closePanel(); - var replaying = core.isReplaying(); - core.stopReplay(); - core.waitHeroToStop(function () { - core.drawText([ - "\t[" + (reason || "结局1") + "]你死了。\n如题。" - ], function () { - core.events.gameOver(null, replaying); - }); - }) - }, + // 游戏失败事件 + core.ui.closePanel(); + var replaying = core.isReplaying(); + core.stopReplay(); + core.waitHeroToStop(function () { + core.drawText( + ["\t[" + (reason || "结局1") + "]你死了。\n如题。"], + function () { + core.events.gameOver(null, replaying); + } + ); + }); + }, "changingFloor": function (floorId, heroLoc) { - // 正在切换楼层过程中执行的操作;此函数的执行时间是“屏幕完全变黑“的那一刻 - // floorId为要切换到的楼层ID;heroLoc表示勇士切换到的位置 + // 正在切换楼层过程中执行的操作;此函数的执行时间是“屏幕完全变黑“的那一刻 + // floorId为要切换到的楼层ID;heroLoc表示勇士切换到的位置 - // ---------- 此时还没有进行切换,当前floorId还是原来的 ---------- // - var currentId = core.status.floorId || null; // 获得当前的floorId,可能为null - var fromLoad = core.hasFlag('__fromLoad__'); // 是否是读档造成的切换 - var isFlying = core.hasFlag('__isFlying__'); // 是否是楼传造成的切换 - if (!fromLoad && !(isFlying && currentId == floorId)) { - if (!core.hasFlag("__leaveLoc__")) core.setFlag("__leaveLoc__", {}); - if (currentId != null) core.getFlag("__leaveLoc__")[currentId] = core.clone(core.status.hero.loc); - } + // ---------- 此时还没有进行切换,当前floorId还是原来的 ---------- // + var currentId = core.status.floorId || null; // 获得当前的floorId,可能为null + var fromLoad = core.hasFlag("__fromLoad__"); // 是否是读档造成的切换 + var isFlying = core.hasFlag("__isFlying__"); // 是否是楼传造成的切换 + if (!fromLoad && !(isFlying && currentId == floorId)) { + if (!core.hasFlag("__leaveLoc__")) core.setFlag("__leaveLoc__", {}); + if (currentId != null) + core.getFlag("__leaveLoc__")[currentId] = core.clone( + core.status.hero.loc + ); + } - // 可以对currentId进行判定,比如删除某些自定义图层等 - // if (currentId == 'MT0') { - // core.deleteAllCanvas(); - // } + // 可以对currentId进行判定,比如删除某些自定义图层等 + // if (currentId == 'MT0') { + // core.deleteAllCanvas(); + // } - // 根据分区信息自动砍层与恢复 - if (core.autoRemoveMaps) core.autoRemoveMaps(floorId); + // 根据分区信息自动砍层与恢复 + if (core.autoRemoveMaps) core.autoRemoveMaps(floorId); - // 重置画布尺寸 - core.maps.resizeMap(floorId); - // 设置勇士的位置 - heroLoc.direction = core.turnDirection(heroLoc.direction); - core.status.hero.loc = heroLoc; - // 检查重生怪并重置 - if (!fromLoad) { - core.extractBlocks(floorId); - core.status.maps[floorId].blocks.forEach(function (block) { - if (block.disable && core.enemys.hasSpecial(block.event.id, 23)) { - block.disable = false; - core.setMapBlockDisabled(floorId, block.x, block.y, false); - core.maps._updateMapArray(floorId, block.x, block.y); - } - }); - core.control.gatherFollowers(); - } + // 重置画布尺寸 + core.maps.resizeMap(floorId); + // 设置勇士的位置 + heroLoc.direction = core.turnDirection(heroLoc.direction); + core.status.hero.loc = heroLoc; + // 检查重生怪并重置 + if (!fromLoad) { + core.extractBlocks(floorId); + core.status.maps[floorId].blocks.forEach(function (block) { + if (block.disable && core.enemys.hasSpecial(block.event.id, 23)) { + block.disable = false; + core.setMapBlockDisabled(floorId, block.x, block.y, false); + core.maps._updateMapArray(floorId, block.x, block.y); + } + }); + core.control.gatherFollowers(); + } - // ---------- 重绘新地图;这一步将会设置core.status.floorId ---------- // - core.drawMap(floorId); + // ---------- 重绘新地图;这一步将会设置core.status.floorId ---------- // + core.drawMap(floorId); - // 切换楼层BGM - if (core.status.maps[floorId].bgm) { - var bgm = core.status.maps[floorId].bgm; - if (bgm instanceof Array) bgm = bgm[Math.floor(Math.random() * bgm.length)]; // 多个bgm则随机播放一个 - if (!core.hasFlag("__bgm__")) core.playBgm(bgm); - } else if (fromLoad && !core.hasFlag("__bgm__")) { - core.pauseBgm(); - } - // 更改画面色调 - var color = core.getFlag('__color__', null); - if (!color && core.status.maps[floorId].color) - color = core.status.maps[floorId].color; - core.clearMap('curtain'); - core.status.curtainColor = color; - if (color) core.fillRect('curtain', 0, 0, core._PX_ || core.__PIXELS__, core._PY_ || core.__PIXELS__, core.arrayToRGBA(color)); - // 更改天气 - var weather = core.getFlag('__weather__', null); - if (!weather && core.status.maps[floorId].weather) - weather = core.status.maps[floorId].weather; - if (weather) - core.setWeather(weather[0], weather[1]); - else core.setWeather(); + // 切换楼层BGM + if (core.status.maps[floorId].bgm) { + var bgm = core.status.maps[floorId].bgm; + if (bgm instanceof Array) + bgm = bgm[Math.floor(Math.random() * bgm.length)]; // 多个bgm则随机播放一个 + if (!core.hasFlag("__bgm__")) core.playBgm(bgm); + } else if (fromLoad && !core.hasFlag("__bgm__")) { + core.pauseBgm(); + } + // 更改画面色调 + var color = core.getFlag("__color__", null); + if (!color && core.status.maps[floorId].color) + color = core.status.maps[floorId].color; + core.clearMap("curtain"); + core.status.curtainColor = color; + if (color) + core.fillRect( + "curtain", + 0, + 0, + core._PX_ || core.__PIXELS__, + core._PY_ || core.__PIXELS__, + core.arrayToRGBA(color) + ); + // 更改天气 + var weather = core.getFlag("__weather__", null); + if (!weather && core.status.maps[floorId].weather) + weather = core.status.maps[floorId].weather; + if (weather) core.setWeather(weather[0], weather[1]); + else core.setWeather(); - // ...可以新增一些其他内容,比如创建个画布在右上角显示什么内容等等 - -}, + // ...可以新增一些其他内容,比如创建个画布在右上角显示什么内容等等 + }, "afterChangeFloor": function (floorId) { - // 转换楼层结束的事件;此函数会在整个楼层切换完全结束后再执行 - // floorId是切换到的楼层 + // 转换楼层结束的事件;此函数会在整个楼层切换完全结束后再执行 + // floorId是切换到的楼层 - // 如果是读档,则进行检查(是否需要恢复事件) - if (core.hasFlag('__fromLoad__')) { - core.events.recoverEvents(core.getFlag("__events__")); - core.removeFlag("__events__"); - } else { - // 每次抵达楼层执行的事件 - core.insertAction(core.floors[floorId].eachArrive); - core.ui.statusBar._update_map() - // 首次抵达楼层时执行的事件(后插入,先执行) - if (!core.hasVisitedFloor(floorId)) { - core.insertAction(core.floors[floorId].firstArrive); - core.visitFloor(floorId); - core.plugin.bfs(); - } - } -}, + // 如果是读档,则进行检查(是否需要恢复事件) + if (core.hasFlag("__fromLoad__")) { + core.events.recoverEvents(core.getFlag("__events__")); + core.removeFlag("__events__"); + } else { + // 每次抵达楼层执行的事件 + core.insertAction(core.floors[floorId].eachArrive); + core.ui.statusBar._update_map(); + // 首次抵达楼层时执行的事件(后插入,先执行) + if (!core.hasVisitedFloor(floorId)) { + core.insertAction(core.floors[floorId].firstArrive); + core.visitFloor(floorId); + core.plugin.bfs(); + } + } + }, "flyTo": function (toId, callback) { - // 楼层传送器的使用,从当前楼层飞往toId - // 如果不能飞行请返回false + // 楼层传送器的使用,从当前楼层飞往toId + // 如果不能飞行请返回false - var fromId = core.status.floorId; + var fromId = core.status.floorId; - // 检查能否飞行 - if (!core.status.maps[fromId].canFlyFrom || !core.status.maps[toId].canFlyTo || !core.hasVisitedFloor(toId)) { - core.playSound('操作失败'); - core.drawTip("无法飞往" + core.status.maps[toId].title + "!", 'fly'); - return false; - } + // 检查能否飞行 + if ( + !core.status.maps[fromId].canFlyFrom || + !core.status.maps[toId].canFlyTo || + !core.hasVisitedFloor(toId) + ) { + core.playSound("操作失败"); + core.drawTip("无法飞往" + core.status.maps[toId].title + "!", "fly"); + return false; + } - // 平面塔模式 - var stair = null, - loc = null; - if (core.flags.flyRecordPosition) { - loc = core.getFlag("__leaveLoc__", {})[toId] || null; - } - if (core.status.maps[toId].flyPoint != null && core.status.maps[toId].flyPoint.length == 2) { - stair = 'flyPoint'; - } - if (stair == null && loc == null) { - // 获得两个楼层的索引,以决定是上楼梯还是下楼梯 - var fromIndex = core.floorIds.indexOf(fromId), - toIndex = core.floorIds.indexOf(toId); - var stair = fromIndex <= toIndex ? "downFloor" : "upFloor"; - // 地下层:同层传送至上楼梯 - if (fromIndex == toIndex && core.status.maps[fromId].underGround) stair = "upFloor"; - } + // 平面塔模式 + var stair = null, + loc = null; + if (core.flags.flyRecordPosition) { + loc = core.getFlag("__leaveLoc__", {})[toId] || null; + } + if ( + core.status.maps[toId].flyPoint != null && + core.status.maps[toId].flyPoint.length == 2 + ) { + stair = "flyPoint"; + } + if (stair == null && loc == null) { + // 获得两个楼层的索引,以决定是上楼梯还是下楼梯 + var fromIndex = core.floorIds.indexOf(fromId), + toIndex = core.floorIds.indexOf(toId); + var stair = fromIndex <= toIndex ? "downFloor" : "upFloor"; + // 地下层:同层传送至上楼梯 + if (fromIndex == toIndex && core.status.maps[fromId].underGround) + stair = "upFloor"; + } - // 记录录像 - core.status.route.push("fly:" + toId); - // 传送 - core.ui.closePanel(); - core.setFlag('__isFlying__', true); - core.changeFloor(toId, stair, loc, null, function () { - core.removeFlag("__isFlying__"); - if (callback) callback(); - }); + // 记录录像 + core.status.route.push("fly:" + toId); + // 传送 + core.ui.closePanel(); + core.setFlag("__isFlying__", true); + core.changeFloor(toId, stair, loc, null, function () { + core.removeFlag("__isFlying__"); + if (callback) callback(); + }); - return true; -}, + return true; + }, "beforeBattle": function (enemyId, x, y) { - // 战斗前触发的事件,可以加上一些战前特效(详见下面支援的例子) - // 此函数在“检测能否战斗和自动存档”【之后】执行。如果需要更早的战前事件,请在插件中覆重写 core.events.doSystemEvent 函数。 - // 返回true则将继续战斗,返回false将不再战斗。 + // 战斗前触发的事件,可以加上一些战前特效(详见下面支援的例子) + // 此函数在“检测能否战斗和自动存档”【之后】执行。如果需要更早的战前事件,请在插件中覆重写 core.events.doSystemEvent 函数。 + // 返回true则将继续战斗,返回false将不再战斗。 - // ------ 支援技能 ------ // - if (x != null && y != null) { - var index = x + "," + y, - cache = core.status.checkBlock.cache[index] || {}, - guards = cache.guards || []; - // 如果存在支援怪 - if (guards.length > 0) { - // 记录flag,当前要参与支援的怪物 - core.setFlag("__guards__" + x + "_" + y, guards); - var actions = [{ "type": "playSound", "name": "跳跃" }]; - // 增加支援的特效动画(图块跳跃) - guards.forEach(function (g) { - core.push(actions, { "type": "jump", "from": [g[0], g[1]], "to": [x, y], "time": 300, "keep": false, "async": true }); - }); - core.push(actions, [ - { "type": "waitAsync" }, // 等待所有异步事件执行完毕 - { "type": "setBlock", "number": enemyId, "loc": [[x, y]] }, // 重新设置怪物自身 - { "type": "battle", "loc": [x, y] } // 重要!重新触发本次战斗 - ]); - core.insertAction(actions); - return false; - } - } + // ------ 支援技能 ------ // + if (x != null && y != null) { + var index = x + "," + y, + cache = core.status.checkBlock.cache[index] || {}, + guards = cache.guards || []; + // 如果存在支援怪 + if (guards.length > 0) { + // 记录flag,当前要参与支援的怪物 + core.setFlag("__guards__" + x + "_" + y, guards); + var actions = [{ type: "playSound", name: "跳跃" }]; + // 增加支援的特效动画(图块跳跃) + guards.forEach(function (g) { + core.push(actions, { + type: "jump", + from: [g[0], g[1]], + to: [x, y], + time: 300, + keep: false, + async: true, + }); + }); + core.push(actions, [ + { type: "waitAsync" }, // 等待所有异步事件执行完毕 + { type: "setBlock", number: enemyId, loc: [[x, y]] }, // 重新设置怪物自身 + { type: "battle", loc: [x, y] }, // 重要!重新触发本次战斗 + ]); + core.insertAction(actions); + return false; + } + } - return true; - }, + return true; + }, "afterBattle": function (enemyId, x, y) { // 战斗结束后触发的事件 @@ -263,7 +290,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 播放战斗音效和动画 // 默认播放的动画;你也可以使用 - var animate = 'hand'; // 默认动画 + var animate = "hand"; // 默认动画 // 检查当前装备是否存在攻击动画 var equipId = core.getEquip(0); if (equipId && (core.material.items[equipId].equip || {}).animate) @@ -273,13 +300,11 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 检查该动画是否存在SE,如果不存在则使用默认音效 if (!(core.material.animates[animate] || {}).se) - core.playSound('attack.mp3'); + core.playSound("attack.opus"); // 播放动画;如果不存在坐标(强制战斗)则播放到勇士自身 - if (x != null && y != null) - core.drawAnimate(animate, x, y); - else - core.drawHeroAnimate(animate); + if (x != null && y != null) core.drawAnimate(animate, x, y); + else core.drawHeroAnimate(animate); // 获得战斗伤害信息 var damageInfo = core.getDamageInfo(enemyId, null, x, y) || {}; @@ -291,7 +316,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (damage == null || damage >= core.status.hero.hp) { core.status.hero.hp = 0; core.updateStatusBar(false, true); - core.events.lose('战斗失败'); + core.events.lose("战斗失败"); return; } @@ -311,8 +336,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = var money = guards.reduce(function (curr, g) { return curr + core.material.enemys[g[2]].money; }, core.getEnemyValue(enemy, "money", x, y)); - if (core.hasItem('coin')) money *= 2; // 幸运金币:双倍 - if (core.hasFlag('curse')) money = 0; // 诅咒效果 + if (core.hasItem("coin")) money *= 2; // 幸运金币:双倍 + if (core.hasFlag("curse")) money = 0; // 诅咒效果 core.status.hero.money += money; core.status.hero.statistics.money += money; @@ -320,32 +345,32 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = var exp = guards.reduce(function (curr, g) { return curr + core.material.enemys[g[2]].exp; }, core.getEnemyValue(enemy, "exp", x, y)); - if (core.hasFlag('curse')) exp = 0; + if (core.hasFlag("curse")) exp = 0; core.status.hero.exp += exp; core.status.hero.statistics.exp += exp; var hint = "打败 " + core.getEnemyValue(enemy, "name", x, y); - if (core.flags.statusBarItems.indexOf('enableMoney') >= 0) - hint += ',' + core.getStatusLabel('money') + '+' + money; // hint += ",金币+" + money; - if (core.flags.statusBarItems.indexOf('enableExp') >= 0) - hint += ',' + core.getStatusLabel('exp') + '+' + exp; // hint += ",经验+" + exp; + if (core.flags.statusBarItems.indexOf("enableMoney") >= 0) + hint += "," + core.getStatusLabel("money") + "+" + money; // hint += ",金币+" + money; + if (core.flags.statusBarItems.indexOf("enableExp") >= 0) + hint += "," + core.getStatusLabel("exp") + "+" + exp; // hint += ",经验+" + exp; core.drawTip(hint, enemy.id); // 中毒 if (core.enemys.hasSpecial(special, 12)) { - core.triggerDebuff('get', 'poison'); + core.triggerDebuff("get", "poison"); } // 衰弱 if (core.enemys.hasSpecial(special, 13)) { - core.triggerDebuff('get', 'weak'); + core.triggerDebuff("get", "weak"); } // 诅咒 if (core.enemys.hasSpecial(special, 14)) { - core.triggerDebuff('get', 'curse'); + core.triggerDebuff("get", "curse"); } // 仇恨怪物将仇恨值减半 if (core.enemys.hasSpecial(special, 17)) { - core.setFlag('hatred', Math.floor(core.getFlag('hatred', 0) / 2)); + core.setFlag("hatred", Math.floor(core.getFlag("hatred", 0) / 2)); } // 自爆 if (core.enemys.hasSpecial(special, 19)) { @@ -354,41 +379,45 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } // 退化 if (core.enemys.hasSpecial(special, 21)) { - core.status.hero.atk -= (enemy.atkValue || 0); - core.status.hero.def -= (enemy.defValue || 0); + core.status.hero.atk -= enemy.atkValue || 0; + core.status.hero.def -= enemy.defValue || 0; if (core.status.hero.atk < 0) core.status.hero.atk = 0; if (core.status.hero.def < 0) core.status.hero.def = 0; } // 增加仇恨值 - core.setFlag('hatred', core.getFlag('hatred', 0) + core.values.hatred); + core.setFlag("hatred", core.getFlag("hatred", 0) + core.values.hatred); // 战后的技能处理,比如扣除魔力值 - if (core.flags.statusBarItems.indexOf('enableSkill') >= 0) { + if (core.flags.statusBarItems.indexOf("enableSkill") >= 0) { // 检测当前开启的技能类型 - var skill = core.getFlag('skill', 0); - if (skill == 1) { // 技能1:二倍斩 + var skill = core.getFlag("skill", 0); + if (skill == 1) { + // 技能1:二倍斩 core.status.hero.mana -= 5; // 扣除5点魔力值 } // 关闭技能 - core.setFlag('skill', 0); - core.setFlag('skillName', '无'); + core.setFlag("skill", 0); + core.setFlag("skillName", "无"); } - // 事件的处理 var todo = []; // 加点事件 - var point = guards.reduce(function (curr, g) { - return curr + core.material.enemys[g[2]].point; - }, core.getEnemyValue(enemy, "point", x, y)) || 0; + var point = + guards.reduce(function (curr, g) { + return curr + core.material.enemys[g[2]].point; + }, core.getEnemyValue(enemy, "point", x, y)) || 0; if (core.flags.enableAddPoint && point > 0) { - core.push(todo, [{ "type": "insert", "name": "加点事件", "args": [point] }]); + core.push(todo, [{ type: "insert", name: "加点事件", args: [point] }]); } // 战后事件 if (core.status.floorId != null) { - core.push(todo, core.floors[core.status.floorId].afterBattle[x + "," + y]); + core.push( + todo, + core.floors[core.status.floorId].afterBattle[x + "," + y] + ); } core.push(todo, enemy.afterBattle); @@ -405,7 +434,9 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (todo.length > 0) core.insertAction(todo, x, y); // 删除该点设置的怪物信息 - delete((flags.enemyOnPoint || {})[core.status.floorId] || {})[x + "," + y]; + delete((flags.enemyOnPoint || {})[core.status.floorId] || {})[ + x + "," + y + ]; // 因为removeBlock和hideBlock都会刷新状态栏,因此将删除部分移动到这里并保证刷新只执行一次,以提升效率 if (core.getBlock(x, y) != null) { @@ -420,382 +451,612 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } // 如果已有事件正在处理中 - if (core.status.event.id == null) - core.continueAutomaticRoute(); - else - core.clearContinueAutomaticRoute(); - + if (core.status.event.id == null) core.continueAutomaticRoute(); + else core.clearContinueAutomaticRoute(); }, "afterOpenDoor": function (doorId, x, y) { - // 开一个门后触发的事件 + // 开一个门后触发的事件 - var todo = []; - // 检查该点的开门后事件 - if (core.status.floorId) { - core.push(todo, core.floors[core.status.floorId].afterOpenDoor[x + "," + y]); - } - // 检查批量开门事件 - var door = core.getBlockById(doorId); - if (door && door.event.doorInfo) { - core.push(todo, door.event.doorInfo.afterOpenDoor); - } + var todo = []; + // 检查该点的开门后事件 + if (core.status.floorId) { + core.push( + todo, + core.floors[core.status.floorId].afterOpenDoor[x + "," + y] + ); + } + // 检查批量开门事件 + var door = core.getBlockById(doorId); + if (door && door.event.doorInfo) { + core.push(todo, door.event.doorInfo.afterOpenDoor); + } - if (todo.length > 0) core.insertAction(todo, x, y); + if (todo.length > 0) core.insertAction(todo, x, y); - if (core.status.event.id == null) - core.continueAutomaticRoute(); - else - core.clearContinueAutomaticRoute(); - }, + if (core.status.event.id == null) core.continueAutomaticRoute(); + else core.clearContinueAutomaticRoute(); + }, "afterGetItem": function (itemId, x, y, isGentleClick) { - // 获得一个道具后触发的事件 - // itemId:获得的道具ID;x和y是该道具所在的坐标 - // isGentleClick:是否是轻按触发的 - if (itemId.endsWith('Potion') && core.material.items[itemId].cls == 'items') - core.playSound('回血'); - else if (itemId.endsWith('Gem') && core.material.items[itemId].cls == 'items') - core.playSound('宝石') - else - core.playSound('获得道具'); + // 获得一个道具后触发的事件 + // itemId:获得的道具ID;x和y是该道具所在的坐标 + // isGentleClick:是否是轻按触发的 + if ( + itemId.endsWith("Potion") && + core.material.items[itemId].cls == "items" + ) + core.playSound("回血"); + else if ( + itemId.endsWith("Gem") && + core.material.items[itemId].cls == "items" + ) + core.playSound("宝石"); + else core.playSound("获得道具"); - var todo = []; - // 检查该点的获得道具后事件。 - if (core.status.floorId == null) return; - var event = core.floors[core.status.floorId].afterGetItem[x + "," + y]; - if (event && (event instanceof Array || !isGentleClick || !event.disableOnGentleClick)) { - if (event.data) event = event.data; - core.unshift(todo, event); - } + var todo = []; + // 检查该点的获得道具后事件。 + if (core.status.floorId == null) return; + var event = core.floors[core.status.floorId].afterGetItem[x + "," + y]; + if ( + event && + (event instanceof Array || + !isGentleClick || + !event.disableOnGentleClick) + ) { + if (event.data) event = event.data; + core.unshift(todo, event); + } - if (todo.length > 0) core.insertAction(todo, x, y); - }, + if (todo.length > 0) core.insertAction(todo, x, y); + }, "afterPushBox": function () { - // 推箱子后的事件 - if (core.searchBlock('box').length == 0) { - // 可以通过if语句来进行开门操作 - /* + // 推箱子后的事件 + if (core.searchBlock("box").length == 0) { + // 可以通过if语句来进行开门操作 + /* if (core.status.floorId=='xxx') { // 在某个楼层 core.insertAction([ // 插入一条事件 {"type": "openDoor", "loc": [x,y]} // 开门 ]) } */ - } - } + } + } }, "enemys": { "getSpecials": function () { - // 获得怪物的特殊属性,每一行定义一个特殊属性。 - // 分为五项,第一项为该特殊属性的数字,第二项为特殊属性的名字,第三项为特殊属性的描述 - // 第四项为该特殊属性的颜色,可以写十六进制 #RRGGBB 或者 [r,g,b,a] 四元数组 - // 第五项为该特殊属性的标记;目前 1 代表是地图类技能(需要进行遍历全图) - // 名字和描述可以直接写字符串,也可以写个function将怪物传进去 - return [ - [1, "先攻", "怪物首先攻击", "#ffcc33"], - [3, "坚固", "怪物防御不小于角色攻击-1", "#c0b088"], - [6, function (enemy) { return (enemy.n || '') + "连击"; }, function (enemy) { return "怪物每回合攻击" + (enemy.n || 4) + "次"; }, "#ffee77"], - [7, "破甲", function (enemy) { return "战斗前,怪物附加角色防御的" + Math.floor(100 * (enemy.breakArmor || core.values.breakArmor || 0)) + "%作为伤害"; }, "#88c0ff"], - [8, "反击", function (enemy) { return "战斗时,怪物每回合附加角色攻击的" + Math.floor(100 * (enemy.counterAttack || core.values.counterAttack || 0)) + "%作为伤害,无视角色防御"; }, "#ffaa44"], - [9, "净化", function (enemy) { return "战斗前,怪物附加角色护盾的" + (enemy.purify || core.values.purify) + "倍作为伤害"; }, "#80eed6"], - [10, "模仿", "怪物的攻防和角色攻防相等", "#b0c0dd"], - [11, "吸血", function (enemy) { return "战斗前,怪物首先吸取角色的" + Math.floor(100 * enemy.vampire || 0) + "%生命(约" + Math.floor((enemy.vampire || 0) * core.getStatus('hp')) + "点)作为伤害" + (enemy.add ? ",并把伤害数值加到自身生命上" : ""); }, "#dd4448"], - [12, "中毒", "战斗后,角色陷入中毒状态,每一步损失生命" + core.values.poisonDamage + "点", "#99ee88"], - [13, "衰弱", "战斗后,角色陷入衰弱状态,攻防暂时下降" + (core.values.weakValue >= 1 ? core.values.weakValue + "点" : parseInt(core.values.weakValue * 100) + "%"), "#f0bbcc"], - [14, "诅咒", "战斗后,角色陷入诅咒状态,战斗无法获得金币和经验", "#bbeef0"], - [15, "领域", function (enemy) { return "经过怪物周围" + (enemy.zoneSquare ? "九宫格" : "十字") + "范围内" + (enemy.range || 1) + "格时自动减生命" + (enemy.zone || 0) + "点"; }, "#c677dd"], - [16, "夹击", "经过两只相同的怪物中间,角色生命值变成一半", "#bb99ee"], - [17, "仇恨", "战斗前,怪物附加之前积累的仇恨值作为伤害;战斗后,释放一半的仇恨值。(每杀死一个怪物获得" + (core.values.hatred || 0) + "点仇恨值)", "#b0b666"], - [18, "阻击", function (enemy) { return "经过怪物周围" + (enemy.zoneSquare ? "九宫格" : "十字") + "时自动减生命" + (enemy.repulse || 0) + "点,同时怪物后退一格"; }, "#8888e6"], - [19, "自爆", "战斗后角色的生命值变成1", "#ff6666"], - [20, "无敌", "角色无法打败怪物,除非拥有十字架", "#aaaaaa"], - [21, "退化", function (enemy) { return "战斗后角色永久下降" + (enemy.atkValue || 0) + "点攻击和" + (enemy.defValue || 0) + "点防御"; }], - [22, "固伤", function (enemy) { return "战斗前,怪物对角色造成" + (enemy.damage || 0) + "点固定伤害,未开启负伤时无视角色护盾。"; }, "#ff9977"], - [23, "重生", "怪物被击败后,角色转换楼层则怪物将再次出现", "#a0e0ff"], - [24, "激光", function (enemy) { return "经过怪物同行或同列时自动减生命" + (enemy.laser || 0) + "点"; }, "#dda0dd"], - [25, "光环", function (enemy) { return (enemy.range != null ? ((enemy.haloSquare ? "该怪物九宫格" : "该怪物十字") + enemy.haloRange + "格范围内") : "同楼层所有") + "怪物生命提升" + (enemy.hpBuff || 0) + "%,攻击提升" + (enemy.atkBuff || 0) + "%,防御提升" + (enemy.defBuff || 0) + "%," + (enemy.haloAdd ? "可叠加" : "不可叠加"); }, "#e6e099", 1], - [26, "支援", "当周围一圈的怪物受到攻击时将上前支援,并组成小队战斗。", "#77c0b6", 1], - [27, "捕捉", function (enemy) { return "当走到怪物周围" + (enemy.zoneSquare ? "九宫格" : "十字") + "时会强制进行战斗。"; }, "#c0ddbb"] - ]; -}, + // 获得怪物的特殊属性,每一行定义一个特殊属性。 + // 分为五项,第一项为该特殊属性的数字,第二项为特殊属性的名字,第三项为特殊属性的描述 + // 第四项为该特殊属性的颜色,可以写十六进制 #RRGGBB 或者 [r,g,b,a] 四元数组 + // 第五项为该特殊属性的标记;目前 1 代表是地图类技能(需要进行遍历全图) + // 名字和描述可以直接写字符串,也可以写个function将怪物传进去 + return [ + [1, "先攻", "怪物首先攻击", "#ffcc33"], + [3, "坚固", "怪物防御不小于角色攻击-1", "#c0b088"], + [ + 6, + function (enemy) { + return (enemy.n || "") + "连击"; + }, + function (enemy) { + return "怪物每回合攻击" + (enemy.n || 4) + "次"; + }, + "#ffee77", + ], + [ + 7, + "破甲", + function (enemy) { + return ( + "战斗前,怪物附加角色防御的" + + Math.floor( + 100 * (enemy.breakArmor || core.values.breakArmor || 0) + ) + + "%作为伤害" + ); + }, + "#88c0ff", + ], + [ + 8, + "反击", + function (enemy) { + return ( + "战斗时,怪物每回合附加角色攻击的" + + Math.floor( + 100 * (enemy.counterAttack || core.values.counterAttack || 0) + ) + + "%作为伤害,无视角色防御" + ); + }, + "#ffaa44", + ], + [ + 9, + "净化", + function (enemy) { + return ( + "战斗前,怪物附加角色护盾的" + + (enemy.purify || core.values.purify) + + "倍作为伤害" + ); + }, + "#80eed6", + ], + [10, "模仿", "怪物的攻防和角色攻防相等", "#b0c0dd"], + [ + 11, + "吸血", + function (enemy) { + return ( + "战斗前,怪物首先吸取角色的" + + Math.floor(100 * enemy.vampire || 0) + + "%生命(约" + + Math.floor((enemy.vampire || 0) * core.getStatus("hp")) + + "点)作为伤害" + + (enemy.add ? ",并把伤害数值加到自身生命上" : "") + ); + }, + "#dd4448", + ], + [ + 12, + "中毒", + "战斗后,角色陷入中毒状态,每一步损失生命" + + core.values.poisonDamage + + "点", + "#99ee88", + ], + [ + 13, + "衰弱", + "战斗后,角色陷入衰弱状态,攻防暂时下降" + + (core.values.weakValue >= 1 + ? core.values.weakValue + "点" + : parseInt(core.values.weakValue * 100) + "%"), + "#f0bbcc", + ], + [ + 14, + "诅咒", + "战斗后,角色陷入诅咒状态,战斗无法获得金币和经验", + "#bbeef0", + ], + [ + 15, + "领域", + function (enemy) { + return ( + "经过怪物周围" + + (enemy.zoneSquare ? "九宫格" : "十字") + + "范围内" + + (enemy.range || 1) + + "格时自动减生命" + + (enemy.zone || 0) + + "点" + ); + }, + "#c677dd", + ], + [16, "夹击", "经过两只相同的怪物中间,角色生命值变成一半", "#bb99ee"], + [ + 17, + "仇恨", + "战斗前,怪物附加之前积累的仇恨值作为伤害;战斗后,释放一半的仇恨值。(每杀死一个怪物获得" + + (core.values.hatred || 0) + + "点仇恨值)", + "#b0b666", + ], + [ + 18, + "阻击", + function (enemy) { + return ( + "经过怪物周围" + + (enemy.zoneSquare ? "九宫格" : "十字") + + "时自动减生命" + + (enemy.repulse || 0) + + "点,同时怪物后退一格" + ); + }, + "#8888e6", + ], + [19, "自爆", "战斗后角色的生命值变成1", "#ff6666"], + [20, "无敌", "角色无法打败怪物,除非拥有十字架", "#aaaaaa"], + [ + 21, + "退化", + function (enemy) { + return ( + "战斗后角色永久下降" + + (enemy.atkValue || 0) + + "点攻击和" + + (enemy.defValue || 0) + + "点防御" + ); + }, + ], + [ + 22, + "固伤", + function (enemy) { + return ( + "战斗前,怪物对角色造成" + + (enemy.damage || 0) + + "点固定伤害,未开启负伤时无视角色护盾。" + ); + }, + "#ff9977", + ], + [23, "重生", "怪物被击败后,角色转换楼层则怪物将再次出现", "#a0e0ff"], + [ + 24, + "激光", + function (enemy) { + return "经过怪物同行或同列时自动减生命" + (enemy.laser || 0) + "点"; + }, + "#dda0dd", + ], + [ + 25, + "光环", + function (enemy) { + return ( + (enemy.range != null + ? (enemy.haloSquare ? "该怪物九宫格" : "该怪物十字") + + enemy.haloRange + + "格范围内" + : "同楼层所有") + + "怪物生命提升" + + (enemy.hpBuff || 0) + + "%,攻击提升" + + (enemy.atkBuff || 0) + + "%,防御提升" + + (enemy.defBuff || 0) + + "%," + + (enemy.haloAdd ? "可叠加" : "不可叠加") + ); + }, + "#e6e099", + 1, + ], + [ + 26, + "支援", + "当周围一圈的怪物受到攻击时将上前支援,并组成小队战斗。", + "#77c0b6", + 1, + ], + [ + 27, + "捕捉", + function (enemy) { + return ( + "当走到怪物周围" + + (enemy.zoneSquare ? "九宫格" : "十字") + + "时会强制进行战斗。" + ); + }, + "#c0ddbb", + ], + ]; + }, "getEnemyInfo": function (enemy, hero, x, y, floorId) { - // 获得某个怪物变化后的数据;该函数将被伤害计算和怪物手册使用 - // 例如:坚固、模仿、仿攻等等 - // - // 参数说明: - // enemy:该怪物信息 - // hero_hp,hero_atk,hero_def,hero_mdef:勇士的生命攻防护盾数据 - // x,y:该怪物的坐标(查看手册和强制战斗时为undefined) - // floorId:该怪物所在的楼层 - // 后面三个参数主要是可以在光环等效果上可以适用(也可以按需制作部分范围光环效果) - floorId = floorId || core.status.floorId; - var 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'); + // 获得某个怪物变化后的数据;该函数将被伤害计算和怪物手册使用 + // 例如:坚固、模仿、仿攻等等 + // + // 参数说明: + // enemy:该怪物信息 + // hero_hp,hero_atk,hero_def,hero_mdef:勇士的生命攻防护盾数据 + // x,y:该怪物的坐标(查看手册和强制战斗时为undefined) + // floorId:该怪物所在的楼层 + // 后面三个参数主要是可以在光环等效果上可以适用(也可以按需制作部分范围光环效果) + floorId = floorId || core.status.floorId; + var 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"); - var mon_hp = core.getEnemyValue(enemy, 'hp', x, y, floorId), - mon_atk = core.getEnemyValue(enemy, 'atk', x, y, floorId), - mon_def = core.getEnemyValue(enemy, 'def', x, y, floorId), - mon_mdef = core.getEnemyValue(enemy, 'mdef', x, y, floorId), - mon_speed = core.getEnemyValue(enemy, 'speed', x, y, floorId), - mon_special = core.getEnemyValue(enemy, 'special', x, y, floorId); - var mon_money = core.getEnemyValue(enemy, 'money', x, y, floorId), - mon_exp = core.getEnemyValue(enemy, 'exp', x, y, floorId), - mon_point = core.getEnemyValue(enemy, 'point', x, y, floorId); - var mon_barrier = 0, - mon_absorb_damage = 0, - mon_magic = core.getEnemyValue(enemy, 'magic', x, y, floorId); - // 模仿 - if (core.hasSpecial(mon_special, 10)) { - mon_atk = hero_atk; - mon_def = hero_def; - } - // 坚固 - if (core.hasSpecial(mon_special, 3) && mon_def < hero_atk - 1) { - mon_def = hero_atk - 1; - } + var mon_hp = core.getEnemyValue(enemy, "hp", x, y, floorId), + mon_atk = core.getEnemyValue(enemy, "atk", x, y, floorId), + mon_def = core.getEnemyValue(enemy, "def", x, y, floorId), + mon_mdef = core.getEnemyValue(enemy, "mdef", x, y, floorId), + mon_speed = core.getEnemyValue(enemy, "speed", x, y, floorId), + mon_special = core.getEnemyValue(enemy, "special", x, y, floorId); + var mon_money = core.getEnemyValue(enemy, "money", x, y, floorId), + mon_exp = core.getEnemyValue(enemy, "exp", x, y, floorId), + mon_point = core.getEnemyValue(enemy, "point", x, y, floorId); + var mon_barrier = 0, + mon_absorb_damage = 0, + mon_magic = core.getEnemyValue(enemy, "magic", x, y, floorId); + // 模仿 + if (core.hasSpecial(mon_special, 10)) { + mon_atk = hero_atk; + mon_def = hero_def; + } + // 坚固 + if (core.hasSpecial(mon_special, 3) && mon_def < hero_atk - 1) { + mon_def = hero_atk - 1; + } - var guards = []; + var guards = []; - // 光环和支援检查 - if (!core.status.checkBlock) core.status.checkBlock = {}; + // 光环和支援检查 + if (!core.status.checkBlock) core.status.checkBlock = {}; - if (core.status.checkBlock.needCache) { - // 从V2.5.4开始,对光环效果增加缓存,以解决多次重复计算的问题,从而大幅提升运行效率。 - var hp_buff = 0, - atk_buff = 0, - def_buff = 0; - // 已经计算过的光环怪ID列表,用于判定叠加 - var usedEnemyIds = {}; - // 检查光环和支援的缓存 - var index = x != null && y != null ? (x + "," + y) : floorId; - if (!core.status.checkBlock.cache) core.status.checkBlock.cache = {}; - var cache = core.status.checkBlock.cache[index]; - if (!cache) { - // 没有该点的缓存,则遍历每个图块 - core.extractBlocks(floorId); - core.status.maps[floorId].blocks.forEach(function (block) { - if (!block.disable) { - // 获得该图块的ID - var id = block.event.id, - enemy = core.material.enemys[id]; - // 检查【光环】技能,数字25 - if (enemy && core.hasSpecial(enemy.special, 25)) { - // 检查是否是范围光环 - var inRange = enemy.haloRange == null; - if (enemy.haloRange != null && x != null && y != null) { - var dx = Math.abs(block.x - x), - dy = Math.abs(block.y - y); - // 检查十字和九宫格光环 - if (dx + dy <= enemy.haloRange) inRange = true; - if (enemy.haloSquare && dx <= enemy.haloRange && dy <= enemy.haloRange) inRange = true; - } - // 检查是否可叠加 - if (inRange && (enemy.haloAdd || !usedEnemyIds[enemy.id])) { - hp_buff += enemy.hpBuff || 0; - atk_buff += enemy.atkBuff || 0; - def_buff += enemy.defBuff || 0; - usedEnemyIds[enemy.id] = true; - } - } - // 检查【支援】技能,数字26 - if (enemy && core.hasSpecial(enemy.special, 26) && - // 检查支援条件,坐标存在,距离为1,且不能是自己 - // 其他类型的支援怪,比如十字之类的话.... 看着做是一样的 - x != null && y != null && Math.abs(block.x - x) <= 1 && Math.abs(block.y - y) <= 1 && !(x == block.x && y == block.y)) { - // 记录怪物的x,y,ID - guards.push([block.x, block.y, id]); - } + if (core.status.checkBlock.needCache) { + // 从V2.5.4开始,对光环效果增加缓存,以解决多次重复计算的问题,从而大幅提升运行效率。 + var hp_buff = 0, + atk_buff = 0, + def_buff = 0; + // 已经计算过的光环怪ID列表,用于判定叠加 + var usedEnemyIds = {}; + // 检查光环和支援的缓存 + var index = x != null && y != null ? x + "," + y : floorId; + if (!core.status.checkBlock.cache) core.status.checkBlock.cache = {}; + var cache = core.status.checkBlock.cache[index]; + if (!cache) { + // 没有该点的缓存,则遍历每个图块 + core.extractBlocks(floorId); + core.status.maps[floorId].blocks.forEach(function (block) { + if (!block.disable) { + // 获得该图块的ID + var id = block.event.id, + enemy = core.material.enemys[id]; + // 检查【光环】技能,数字25 + if (enemy && core.hasSpecial(enemy.special, 25)) { + // 检查是否是范围光环 + var inRange = enemy.haloRange == null; + if (enemy.haloRange != null && x != null && y != null) { + var dx = Math.abs(block.x - x), + dy = Math.abs(block.y - y); + // 检查十字和九宫格光环 + if (dx + dy <= enemy.haloRange) inRange = true; + if ( + enemy.haloSquare && + dx <= enemy.haloRange && + dy <= enemy.haloRange + ) + inRange = true; + } + // 检查是否可叠加 + if (inRange && (enemy.haloAdd || !usedEnemyIds[enemy.id])) { + hp_buff += enemy.hpBuff || 0; + atk_buff += enemy.atkBuff || 0; + def_buff += enemy.defBuff || 0; + usedEnemyIds[enemy.id] = true; + } + } + // 检查【支援】技能,数字26 + if ( + enemy && + core.hasSpecial(enemy.special, 26) && + // 检查支援条件,坐标存在,距离为1,且不能是自己 + // 其他类型的支援怪,比如十字之类的话.... 看着做是一样的 + x != null && + y != null && + Math.abs(block.x - x) <= 1 && + Math.abs(block.y - y) <= 1 && + !(x == block.x && y == block.y) + ) { + // 记录怪物的x,y,ID + guards.push([block.x, block.y, id]); + } - // TODO:如果有其他类型光环怪物在这里仿照添加检查 - // 注:新增新的类光环属性(需要遍历全图的)需要在特殊属性定义那里的第五项写1,参见光环和支援的特殊属性定义。 - } - }); + // TODO:如果有其他类型光环怪物在这里仿照添加检查 + // 注:新增新的类光环属性(需要遍历全图的)需要在特殊属性定义那里的第五项写1,参见光环和支援的特殊属性定义。 + } + }); - core.status.checkBlock.cache[index] = { "hp_buff": hp_buff, "atk_buff": atk_buff, "def_buff": def_buff, "guards": guards }; - } else { - // 直接使用缓存数据 - hp_buff = cache.hp_buff; - atk_buff = cache.atk_buff; - def_buff = cache.def_buff; - guards = cache.guards; - } + core.status.checkBlock.cache[index] = { + hp_buff: hp_buff, + atk_buff: atk_buff, + def_buff: def_buff, + guards: guards, + }; + } else { + // 直接使用缓存数据 + hp_buff = cache.hp_buff; + atk_buff = cache.atk_buff; + def_buff = cache.def_buff; + guards = cache.guards; + } - // 增加比例;如果要增加数值可以直接在这里修改 - mon_hp *= (1 + hp_buff / 100); - mon_atk *= (1 + atk_buff / 100); - mon_def *= (1 + def_buff / 100); - } + // 增加比例;如果要增加数值可以直接在这里修改 + mon_hp *= 1 + hp_buff / 100; + mon_atk *= 1 + atk_buff / 100; + mon_def *= 1 + def_buff / 100; + } - // TODO:可以在这里新增其他的怪物数据变化 - // 比如仿攻(怪物攻击不低于勇士攻击): - // if (core.hasSpecial(mon_special, 27) && mon_atk < hero_atk) { - // mon_atk = hero_atk; - // } - // 也可以按需增加各种自定义内容 + // TODO:可以在这里新增其他的怪物数据变化 + // 比如仿攻(怪物攻击不低于勇士攻击): + // if (core.hasSpecial(mon_special, 27) && mon_atk < hero_atk) { + // mon_atk = hero_atk; + // } + // 也可以按需增加各种自定义内容 - return { - "hp": Math.floor(mon_hp), - "atk": Math.floor(mon_atk), - "def": Math.floor(mon_def), - "mdef": Math.floor(mon_mdef), - "speed": Math.floor(mon_speed), - "barrier": Math.floor(mon_barrier), - "absorb": Math.floor(mon_absorb_damage), - "money": Math.floor(mon_money), - "exp": Math.floor(mon_exp), - "point": Math.floor(mon_point), - "special": mon_special, - "magic": mon_magic, - "guards": guards, // 返回支援情况 - }; -}, + return { + hp: Math.floor(mon_hp), + atk: Math.floor(mon_atk), + def: Math.floor(mon_def), + mdef: Math.floor(mon_mdef), + speed: Math.floor(mon_speed), + barrier: Math.floor(mon_barrier), + absorb: Math.floor(mon_absorb_damage), + money: Math.floor(mon_money), + exp: Math.floor(mon_exp), + point: Math.floor(mon_point), + special: mon_special, + magic: mon_magic, + guards: guards, // 返回支援情况 + }; + }, "getDamageInfo": function (enemy, hero, x, y, floorId) { - // 获得战斗伤害信息(实际伤害计算函数) - // - // 参数说明: - // enemy:该怪物信息 - // hero:勇士的当前数据;如果对应项不存在则会从core.status.hero中取。 - // x,y:该怪物的坐标(查看手册和强制战斗时为undefined) - // floorId:该怪物所在的楼层 - // 后面三个参数主要是可以在光环等效果上可以适用 - floorId = floorId || core.status.floorId; + // 获得战斗伤害信息(实际伤害计算函数) + // + // 参数说明: + // enemy:该怪物信息 + // hero:勇士的当前数据;如果对应项不存在则会从core.status.hero中取。 + // x,y:该怪物的坐标(查看手册和强制战斗时为undefined) + // floorId:该怪物所在的楼层 + // 后面三个参数主要是可以在光环等效果上可以适用 + floorId = floorId || core.status.floorId; - var 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'), - hero_magic = core.getRealStatusOrDefault(hero, 'magic'), - origin_hero_hp = core.getStatusOrDefault(hero, 'hp'), - origin_hero_atk = core.getStatusOrDefault(hero, 'atk'), - origin_hero_def = core.getStatusOrDefault(hero, 'def'); + var 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"), + hero_magic = core.getRealStatusOrDefault(hero, "magic"), + origin_hero_hp = core.getStatusOrDefault(hero, "hp"), + origin_hero_atk = core.getStatusOrDefault(hero, "atk"), + origin_hero_def = core.getStatusOrDefault(hero, "def"); + // 怪物的各项数据 + // 对坚固模仿等处理扔到了脚本编辑-getEnemyInfo之中 + var enemyInfo = core.enemys.getEnemyInfo(enemy, hero, x, y, floorId); + var mon_hp = enemyInfo.hp, + mon_atk = enemyInfo.atk, + mon_def = enemyInfo.def, + mon_mdef = enemyInfo.mdef, + mon_speed = enemyInfo.speed, + mon_special = enemyInfo.special, + mon_absorb_damage = enemyInfo.absorb, + mon_barrier = enemyInfo.barrier; + //---第一部分:静态属性修正--- + //此处写入静态影响勇士属性的勇士或怪物技能(静态影响怪物属性的技能于getEnemyInfo中写入) + // 技能的处理 + if (core.getFlag("skill", 0) == 1) { + // 开启了技能1:二倍斩 + hero_atk *= 2; // 计算时攻击力翻倍 + } + //勇士属性取整 + hero_atk = Math.max(0, Math.floor(hero_atk)); + hero_def = Math.max(0, Math.floor(hero_def)); + hero_mdef = Math.max(0, Math.floor(hero_mdef)); + hero_speed = Math.max(0, Math.floor(hero_speed)); - // 怪物的各项数据 - // 对坚固模仿等处理扔到了脚本编辑-getEnemyInfo之中 - var enemyInfo = core.enemys.getEnemyInfo(enemy, hero, x, y, floorId); - var mon_hp = enemyInfo.hp, - mon_atk = enemyInfo.atk, - mon_def = enemyInfo.def, - mon_mdef = enemyInfo.mdef, - mon_speed = enemyInfo.speed, - mon_special = enemyInfo.special, - mon_absorb_damage = enemyInfo.absorb, - mon_barrier = enemyInfo.barrier; + // 如果是无敌属性,且勇士未持有十字架 + if (core.hasSpecial(mon_special, 20) && !core.hasItem("cross")) + return null; // 不可战斗 - //---第一部分:静态属性修正--- - //此处写入静态影响勇士属性的勇士或怪物技能(静态影响怪物属性的技能于getEnemyInfo中写入) - // 技能的处理 - if (core.getFlag('skill', 0) == 1) { // 开启了技能1:二倍斩 - hero_atk *= 2; // 计算时攻击力翻倍 - } - //勇士属性取整 - hero_atk = Math.max(0, Math.floor(hero_atk)); - hero_def = Math.max(0, Math.floor(hero_def)); - hero_mdef = Math.max(0, Math.floor(hero_mdef)); - hero_speed = Math.max(0, Math.floor(hero_speed)); + // 战前造成的额外伤害(可被护盾抵消) + let init_damage = 0; - // 如果是无敌属性,且勇士未持有十字架 - if (core.hasSpecial(mon_special, 20) && !core.hasItem("cross")) - return null; // 不可战斗 + // 吸血 + if (core.hasSpecial(mon_special, 11)) { + let vampire_damage = hero_hp * enemy.vampire; - // 战前造成的额外伤害(可被护盾抵消) - let init_damage = 0; + // 如果有神圣盾免疫吸血等可以在这里写 + // 也可以用hasItem和hasEquip来判定装备 + // if (core.hasFlag('shield5')) vampire_damage = 0; - // 吸血 - if (core.hasSpecial(mon_special, 11)) { - let vampire_damage = hero_hp * enemy.vampire; + vampire_damage = Math.floor(vampire_damage) || 0; + // 加到自身 + if (enemy.add) + // 如果加到自身 + mon_hp += vampire_damage; - // 如果有神圣盾免疫吸血等可以在这里写 - // 也可以用hasItem和hasEquip来判定装备 - // if (core.hasFlag('shield5')) vampire_damage = 0; + init_damage += vampire_damage; + } - vampire_damage = Math.floor(vampire_damage) || 0; - // 加到自身 - if (enemy.add) // 如果加到自身 - mon_hp += vampire_damage; + //——第二部分:变量定义和初始赋值—— + // 每回合怪物对勇士造成的战斗伤害 + let per_damage = Math.max(mon_atk - hero_def, 0); + if (enemyInfo.magic) per_damage = Math.max(mon_atk - hero_mdef, 0); - init_damage += vampire_damage; - } + // + let hero_per_damage = Math.max(hero_atk - mon_def, 0); + if (hero_magic) hero_per_damage = Math.max(hero_atk - mon_mdef, 0); - //——第二部分:变量定义和初始赋值—— - // 每回合怪物对勇士造成的战斗伤害 - let per_damage = Math.max(mon_atk - hero_def, 0); - if (enemyInfo.magic) per_damage = Math.max(mon_atk - hero_mdef, 0); + let damage = 0, + hero_turn = 0, + mon_turn = 0; + //---第三部分:递归开始--- + let length = hero_speed * mon_speed; - // - let hero_per_damage = Math.max(hero_atk - mon_def, 0); - if (hero_magic) hero_per_damage = Math.max(hero_atk - mon_mdef, 0); + for ( + let now_mon_hp = mon_hp, + last_mon_hp = mon_hp, + mon_length = length, + hero_length = length, + mon_time = 0, + hero_time = 0; + now_mon_hp > 0; - let damage = 0, - hero_turn = 0, - mon_turn = 0; - //---第三部分:递归开始--- - let length = hero_speed * mon_speed; + ) { + //勇士和怪物的长度 + mon_time = mon_length / mon_speed; + hero_time = hero_length / hero_speed; + if ( + mon_time < hero_time || + ((mon_time = hero_time) && mon_speed > hero_speed) + ) { + //怪物攻击的回合 + //这里计算怪物攻击时发生的各种变化 - for (let now_mon_hp = mon_hp, last_mon_hp = mon_hp, mon_length = length, hero_length = length, mon_time = 0, hero_time = 0; now_mon_hp > 0;) { //勇士和怪物的长度 - mon_time = mon_length / mon_speed; - hero_time = hero_length / hero_speed; - if ((mon_time < hero_time) || ((mon_time = hero_time) && (mon_speed > hero_speed))) { //怪物攻击的回合 - //这里计算怪物攻击时发生的各种变化 + //伤害与回合增加 + damage += per_damage; + if (core.hasSpecial(mon_special, 6)) { + mon_turn += enemy.n; + } else { + mon_turn += 1; + } + //重新为长度赋值 + mon_length = length; + hero_length = hero_length - mon_time * hero_speed; + } else { + //勇士攻击的回合 + // 这里计算勇士攻击时发生的各种变化 - //伤害与回合增加 - damage += per_damage; - if (core.hasSpecial(mon_special, 6)) { - mon_turn += enemy.n; - } else { - mon_turn += 1; - } - //重新为长度赋值 - mon_length = length; - hero_length = hero_length - mon_time * hero_speed; - } else { //勇士攻击的回合 - // 这里计算勇士攻击时发生的各种变化 + // 伤害与回合数增加 + now_mon_hp -= hero_per_damage; + hero_turn += 1; //勇士回合+1,如果有勇士每回合多次攻击的情况,在这里写判断 + // 无法战斗计算 + if (hero_turn % 50 == 0) { + if (now_mon_hp >= last_mon_hp) return null; + last_mon_hp = now_mon_hp; + } + //重新为长度赋值 + hero_length = length; + mon_length = mon_length - hero_time * mon_speed; + } + } - // 伤害与回合数增加 - now_mon_hp -= hero_per_damage; - hero_turn += 1; //勇士回合+1,如果有勇士每回合多次攻击的情况,在这里写判断 - // 无法战斗计算 - if (hero_turn % 50 == 0) { - if (now_mon_hp >= last_mon_hp) return null; - last_mon_hp = now_mon_hp; - } - //重新为长度赋值 - hero_length = length; - mon_length = mon_length - hero_time * mon_speed; - } - } + //下面这些还没修改 + // 连击 + if (core.hasSpecial(mon_special, 6)) per_damage *= enemy.n || 2; - //下面这些还没修改 - // 连击 - if (core.hasSpecial(mon_special, 6)) per_damage *= (enemy.n || 2); + // 每回合的反击伤害;反击是按照勇士的攻击次数来计算回合 + let counterDamage = 0; + if (core.hasSpecial(mon_special, 8)) + counterDamage += Math.floor( + (enemy.counterAttack || core.values.counterAttack) * hero_atk + ); - // 每回合的反击伤害;反击是按照勇士的攻击次数来计算回合 - let counterDamage = 0; - if (core.hasSpecial(mon_special, 8)) - counterDamage += Math.floor((enemy.counterAttack || core.values.counterAttack) * hero_atk); + // 先攻 + if (core.hasSpecial(mon_special, 1)) init_damage += per_damage; - // 先攻 - if (core.hasSpecial(mon_special, 1)) init_damage += per_damage; + // 破甲 + if (core.hasSpecial(mon_special, 7)) + init_damage += Math.floor( + (enemy.breakArmor || core.values.breakArmor) * hero_def + ); - // 破甲 - if (core.hasSpecial(mon_special, 7)) - init_damage += Math.floor((enemy.breakArmor || core.values.breakArmor) * hero_def); + // 净化 + if (core.hasSpecial(mon_special, 9)) + init_damage += Math.floor( + (enemy.purify || core.values.purify) * hero_mdef + ); + //上面这些还没修改 + //勇士护盾计算 + let barrier = hero_mdef; + if (enemyInfo.magic) barrier = hero_def; - // 净化 - if (core.hasSpecial(mon_special, 9)) - init_damage += Math.floor((enemy.purify || core.values.purify) * hero_mdef); - //上面这些还没修改 - //勇士护盾计算 - let barrier = hero_mdef; - if (enemyInfo.magic) barrier = hero_def; - - // ------ 支援 ----- // - // 这个递归最好想明白为什么,flag:__extraTurn__是怎么用的 - /*var guards = core.getFlag("__guards__" + x + "_" + y, enemyInfo.guards); + // ------ 支援 ----- // + // 这个递归最好想明白为什么,flag:__extraTurn__是怎么用的 + /*var guards = core.getFlag("__guards__" + x + "_" + y, enemyInfo.guards); var guard_before_current_enemy = false; // ------ 支援怪是先打(true)还是后打(false)? turn += core.getFlag("__extraTurn__", 0); if (guards.length > 0) { @@ -823,42 +1084,43 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } } core.removeFlag("__extraTurn__");*/ - // ------ 支援END ------ // + // ------ 支援END ------ // - // 最终伤害:初始伤害 + 怪物对勇士造成的伤害 + 反击伤害 - damage += init_damage + hero_turn * counterDamage; - // 再扣去护盾 - damage -= barrier; + // 最终伤害:初始伤害 + 怪物对勇士造成的伤害 + 反击伤害 + damage += init_damage + hero_turn * counterDamage; + // 再扣去护盾 + damage -= barrier; - // 检查是否允许负伤 - if (!core.flags.enableNegativeDamage) - damage = Math.max(0, damage); + // 检查是否允许负伤 + if (!core.flags.enableNegativeDamage) damage = Math.max(0, damage); - // 最后处理仇恨和固伤(因为这两个不能被护盾减伤) - if (core.hasSpecial(mon_special, 17)) { // 仇恨 - damage += core.getFlag('hatred', 0); - } - if (core.hasSpecial(mon_special, 22)) { // 固伤 - damage += enemy.damage || 0; - } + // 最后处理仇恨和固伤(因为这两个不能被护盾减伤) + if (core.hasSpecial(mon_special, 17)) { + // 仇恨 + damage += core.getFlag("hatred", 0); + } + if (core.hasSpecial(mon_special, 22)) { + // 固伤 + damage += enemy.damage || 0; + } - return { - "mon_hp": Math.floor(mon_hp), - "mon_atk": Math.floor(mon_atk), - "mon_def": Math.floor(mon_def), - "mon_mdef": Math.floor(mon_mdef), - "init_damage": Math.floor(init_damage), - "per_damage": Math.floor(per_damage), - "hero_per_damage": Math.floor(hero_per_damage), - "turn": Math.floor(hero_turn), - "mon_turn": Math.floor(mon_turn), - "damage": Math.floor(damage) - }; - /*TODO:怪物手册的修改(需要修改这里return的内容以及一些战后判断) + return { + mon_hp: Math.floor(mon_hp), + mon_atk: Math.floor(mon_atk), + mon_def: Math.floor(mon_def), + mon_mdef: Math.floor(mon_mdef), + init_damage: Math.floor(init_damage), + per_damage: Math.floor(per_damage), + hero_per_damage: Math.floor(hero_per_damage), + turn: Math.floor(hero_turn), + mon_turn: Math.floor(mon_turn), + damage: Math.floor(damage), + }; + /*TODO:怪物手册的修改(需要修改这里return的内容以及一些战后判断) 1. 显示怪物是魔攻还是物攻(在怪物名字上做颜色变化,物攻是黄色,魔攻是蓝色) 2. 一防减伤是物防还是魔防(由怪物是物攻还是魔攻来转换) 3. 特殊战斗的怪物,在怪物手册里“伤害”写为“特殊战”*/ -} + } }, "actions": { "onKeyUp": function (keyCode, altKey) { @@ -871,7 +1133,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (core.isMoving()) return; // 商店长按时忽略 - if (core.status.onShopLongDown) return core.status.onShopLongDown = false; + if (core.status.onShopLongDown) + return (core.status.onShopLongDown = false); // Alt+0~9,快捷换上套装 if (altKey && keyCode >= 48 && keyCode <= 57) { @@ -888,8 +1151,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.openBook(true); break; case 71: // G:使用楼传器 - flags.canMoveFloor = core.canMoveFloor() - if (core.isPlaying()) core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); + flags.canMoveFloor = core.canMoveFloor(); + core.useItem('fly', true) core.status.route.push("key:71"); break; case 65: // A:读取自动存档(回退) @@ -948,25 +1211,37 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.actions._clickGameInfo_openComments(); break; case 49: // 快捷键1: 破 - if (core.hasItem('pickaxe')) { + if (core.hasItem("pickaxe")) { core.status.route.push("key:49"); // 将按键记在录像中 - core.useItem('pickaxe', true); // 第二个参数true代表该次使用道具是被按键触发的,使用过程不计入录像 + core.useItem("pickaxe", true); // 第二个参数true代表该次使用道具是被按键触发的,使用过程不计入录像 } break; case 50: // 快捷键2: 炸 - if (core.hasItem('bomb')) { + if (core.hasItem("bomb")) { core.status.route.push("key:50"); // 将按键记在录像中 - core.useItem('bomb', true); // 第二个参数true代表该次使用道具是被按键触发的,使用过程不计入录像 + core.useItem("bomb", true); // 第二个参数true代表该次使用道具是被按键触发的,使用过程不计入录像 } break; case 51: // 快捷键3: 飞 - if (core.hasItem('centerFly')) { + if (core.hasItem("centerFly")) { core.ui._drawCenterFly(); } break; case 52: // 快捷键4:破冰/冰冻/地震/上下楼器/... 其他道具依次判断 { - var list = ["icePickaxe", "freezeBadge", "earthquake", "upFly", "downFly", "jumpShoes", "lifeWand", "poisonWine", "weakWine", "curseWine", "superWine"]; + var list = [ + "icePickaxe", + "freezeBadge", + "earthquake", + "upFly", + "downFly", + "jumpShoes", + "lifeWand", + "poisonWine", + "weakWine", + "curseWine", + "superWine", + ]; for (var i = 0; i < list.length; i++) { var itemId = list[i]; if (core.canUseItem(itemId)) { @@ -992,9 +1267,9 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = break; case 70: // F:开启技能“二倍斩” // 检测是否拥有“二倍斩”这个技能道具 - if (core.hasItem('skill1')) { + if (core.hasItem("skill1")) { core.status.route.push("key:70"); - core.useItem('skill1', true); + core.useItem("skill1", true); } break; // 在这里可以任意新增或编辑已有的快捷键内容 @@ -1012,33 +1287,32 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = break; */ } - }, "onStatusBarClick": function (px, py, vertical) { - // 点击状态栏时触发的事件,仅在自绘状态栏开启时生效 - // px和py为点击的像素坐标 - // vertical为录像播放过程中的横竖屏信息 - // - // 横屏模式下状态栏的画布大小是 129*416 (开启拓展装备栏后是 129*457) - // 竖屏模式下状态栏的画布大小是 416*(32*rows+9) 其中rows为状态栏行数,即全塔属性中statusCanvasRowsOnMobile值 - // 可以使用 _isVertical() 来判定当前是否是竖屏模式 + // 点击状态栏时触发的事件,仅在自绘状态栏开启时生效 + // px和py为点击的像素坐标 + // vertical为录像播放过程中的横竖屏信息 + // + // 横屏模式下状态栏的画布大小是 129*416 (开启拓展装备栏后是 129*457) + // 竖屏模式下状态栏的画布大小是 416*(32*rows+9) 其中rows为状态栏行数,即全塔属性中statusCanvasRowsOnMobile值 + // 可以使用 _isVertical() 来判定当前是否是竖屏模式 - // 判定当前是否是竖屏模式。录像播放过程中可能会记录当时的横竖屏信息以覆盖。 - var _isVertical = function () { - if (core.isReplaying() && vertical != null) return vertical; - return core.domStyle.isVertical; - } + // 判定当前是否是竖屏模式。录像播放过程中可能会记录当时的横竖屏信息以覆盖。 + var _isVertical = function () { + if (core.isReplaying() && vertical != null) return vertical; + return core.domStyle.isVertical; + }; - // 如果正在执行事件,则忽略 - if (core.status.lockControl) return; - // 如果当前正在行走,则忽略;也可以使用 core.waitHeroToStop(callback) 来停止行走再回调执行脚本 - if (core.isMoving()) return; + // 如果正在执行事件,则忽略 + if (core.status.lockControl) return; + // 如果当前正在行走,则忽略;也可以使用 core.waitHeroToStop(callback) 来停止行走再回调执行脚本 + if (core.isMoving()) return; - // 判定px和py来执行自己的脚本内容.... 注意横竖屏 - // console.log("onStatusBarClick: ", px, py, _isVertical()); + // 判定px和py来执行自己的脚本内容.... 注意横竖屏 + // console.log("onStatusBarClick: ", px, py, _isVertical()); - // 样例一:点击某个区域后使用一个道具 - /* + // 样例一:点击某个区域后使用一个道具 + /* if (core.hasItem("pickaxe")) { if (_isVertical()) { // 竖屏模式下 @@ -1054,8 +1328,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } */ - // 样例二:点击某个区域后执行一段公共事件或脚本 - /* + // 样例二:点击某个区域后执行一段公共事件或脚本 + /* if (core.hasFlag("xxx")) { if (_isVertical()) { // 竖屏模式下 @@ -1080,625 +1354,809 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } } */ - - } + } }, "control": { "saveData": function () { - // 存档操作,此函数应该返回“具体要存档的内容” + // 存档操作,此函数应该返回“具体要存档的内容” - // 差异化存储values - var values = {}; - for (var key in core.values) { - if (!core.same(core.values[key], core.data.values[key])) - values[key] = core.clone(core.values[key]); - } + // 差异化存储values + var values = {}; + for (var key in core.values) { + if (!core.same(core.values[key], core.data.values[key])) + values[key] = core.clone(core.values[key]); + } - // 要存档的内容 - var data = { - 'floorId': core.status.floorId, - 'hero': core.clone(core.status.hero), - 'hard': core.status.hard, - 'maps': core.clone(core.maps.saveMap()), - 'route': core.encodeRoute(core.status.route), - 'values': values, - 'version': core.firstData.version, - 'guid': core.getGuid(), - "time": new Date().getTime() - }; - return data; -}, + // 要存档的内容 + var data = { + floorId: core.status.floorId, + hero: core.clone(core.status.hero), + hard: core.status.hard, + maps: core.clone(core.maps.saveMap()), + route: core.encodeRoute(core.status.route), + values: values, + version: core.firstData.version, + guid: core.getGuid(), + time: new Date().getTime(), + }; + return data; + }, "loadData": function (data, callback) { - // 读档操作;从存储中读取了内容后的行为 - const play = core.status.played - // 重置游戏和路线 - core.resetGame(data.hero, data.hard, data.floorId, core.maps.loadMap(data.maps, null, data.hero.flags), data.values); - core.status.route = core.decodeRoute(data.route); - core.control._bindRoutePush(); - // 文字属性,全局属性 - core.status.textAttribute = core.getFlag('textAttribute', core.status.textAttribute); - var toAttribute = core.getFlag('globalAttribute', core.status.globalAttribute); - if (!core.same(toAttribute, core.status.globalAttribute)) { - core.status.globalAttribute = toAttribute; - core.resize(); - } - // 重置音量 - core.events.setVolume(core.getFlag("__volume__", 1), 0); - // 加载勇士图标 - var icon = core.status.hero.image; - icon = core.getMappedName(icon); - if (core.material.images.images[icon]) { - core.material.images.hero = core.material.images.images[icon]; - core.material.icons.hero.width = core.material.images.images[icon].width / 4; - core.material.icons.hero.height = core.material.images.images[icon].height / 4; - } - core.setFlag('__fromLoad__', true); + // 读档操作;从存储中读取了内容后的行为 + const play = core.status.played; + // 重置游戏和路线 + core.resetGame( + data.hero, + data.hard, + data.floorId, + core.maps.loadMap(data.maps, null, data.hero.flags), + data.values + ); + core.status.route = core.decodeRoute(data.route); + core.control._bindRoutePush(); + // 文字属性,全局属性 + core.status.textAttribute = core.getFlag( + "textAttribute", + core.status.textAttribute + ); + var toAttribute = core.getFlag( + "globalAttribute", + core.status.globalAttribute + ); + if (!core.same(toAttribute, core.status.globalAttribute)) { + core.status.globalAttribute = toAttribute; + core.resize(); + } + // 重置音量 + core.events.setVolume(core.getFlag("__volume__", 1), 0); + // 加载勇士图标 + var icon = core.status.hero.image; + icon = core.getMappedName(icon); + if (core.material.images.images[icon]) { + core.material.images.hero = core.material.images.images[icon]; + core.material.icons.hero.width = + core.material.images.images[icon].width / 4; + core.material.icons.hero.height = + core.material.images.images[icon].height / 4; + } + core.setFlag("__fromLoad__", true); - // TODO:增加自己的一些读档处理 - core.ui.statusBar.clearItemInfo() - core.ui.statusBar.update(); - core.plugin.playing.clear() - // 切换到对应的楼层 - core.changeFloor(data.floorId, null, data.hero.loc, 0, function () { - // TODO:可以在这里设置读档后播放BGM - if (core.hasFlag("__bgm__")) { // 持续播放 - core.playBgm(core.getFlag("__bgm__")); - } + // TODO:增加自己的一些读档处理 + core.ui.statusBar.clearItemInfo(); + core.ui.statusBar.update(); + core.plugin.playing.clear(); + // 切换到对应的楼层 + core.changeFloor(data.floorId, null, data.hero.loc, 0, function () { + // TODO:可以在这里设置读档后播放BGM + if (core.hasFlag("__bgm__")) { + // 持续播放 + core.playBgm(core.getFlag("__bgm__")); + } - core.removeFlag('__fromLoad__'); - if (!play) core.insertCommonEvent('强制横屏') - if (callback) callback(); - }); - if (play) core.doAction() - - -}, + core.removeFlag("__fromLoad__"); + if (!play) core.insertCommonEvent("强制横屏"); + if (callback) callback(); + }); + if (play) core.doAction(); + }, "getStatusLabel": function (name) { - // 返回某个状态英文名的对应中文标签,如atk -> 攻击,def -> 防御等。 - // 请注意此项仅影响 libs/ 下的内容(如绘制怪物手册、数据统计等) - // 自行定义的(比如获得道具效果)中用到的“攻击+3”等需要自己去对应地方修改 + // 返回某个状态英文名的对应中文标签,如atk -> 攻击,def -> 防御等。 + // 请注意此项仅影响 libs/ 下的内容(如绘制怪物手册、数据统计等) + // 自行定义的(比如获得道具效果)中用到的“攻击+3”等需要自己去对应地方修改 - return { - name: "名称", - lv: "等级", - hpmax: "生命上限", - hp: "生命", - manamax: "魔力上限", - mana: "魔力", - atk: "攻击", - def: "防御", - spell: "法强", - matk: "魔攻比例", - mdef: "护盾比例", - speed: "速度", - money: "金币", - exp: "经验", - point: "加点", - steps: "步数", - } [name] || name; -}, + return ( + { + name: "名称", + lv: "等级", + hpmax: "生命上限", + hp: "生命", + manamax: "魔力上限", + mana: "魔力", + atk: "攻击", + def: "防御", + spell: "法强", + matk: "魔攻比例", + mdef: "护盾比例", + speed: "速度", + money: "金币", + exp: "经验", + point: "加点", + steps: "步数", + }[name] || name + ); + }, "triggerDebuff": function (action, type) { - // 毒衰咒效果的获得与解除 - // action:获得还是解除;'get'表示获得,'remove'表示解除 - // type:一个数组表示获得了哪些毒衰咒效果;poison, weak,curse - if (!(type instanceof Array)) type = [type]; + // 毒衰咒效果的获得与解除 + // action:获得还是解除;'get'表示获得,'remove'表示解除 + // type:一个数组表示获得了哪些毒衰咒效果;poison, weak,curse + if (!(type instanceof Array)) type = [type]; - if (action == 'get') { - if (core.inArray(type, 'poison') && !core.hasFlag("poison")) { - // 获得毒效果 - core.setFlag('poison', true); - } - if (core.inArray(type, 'weak') && !core.hasFlag('weak')) { - // 获得衰效果 - core.setFlag('weak', true); - if (core.values.weakValue >= 1) { - // >=1,直接扣数值 - core.addStatus('atk', -core.values.weakValue); - core.addStatus('def', -core.values.weakValue); - } else { - // <1,扣比例 - core.addBuff('atk', -core.values.weakValue); - core.addBuff('def', -core.values.weakValue); - } - } - if (core.inArray(type, 'curse') && !core.hasFlag('curse')) { - // 获得咒效果 - core.setFlag('curse', true); - } - } else if (action == 'remove') { - var success = false; - if (core.inArray(type, "poison") && core.hasFlag("poison")) { - success = true; - // 移除毒效果 - core.setFlag("poison", false); - } - if (core.inArray(type, "weak") && core.hasFlag("weak")) { - success = true; - // 移除衰效果 - core.setFlag("weak", false); - if (core.values.weakValue >= 1) { - // >=1,直接扣数值 - core.addStatus('atk', core.values.weakValue); - core.addStatus('def', core.values.weakValue); - } else { - // <1,扣比例 - core.addBuff('atk', core.values.weakValue); - core.addBuff('def', core.values.weakValue); - } - } - if (core.inArray(type, "curse") && core.hasFlag("curse")) { - success = true; - // 移除咒效果 - core.setFlag("curse", false); - } - if (success) core.playSound('回血'); - } - }, + if (action == "get") { + if (core.inArray(type, "poison") && !core.hasFlag("poison")) { + // 获得毒效果 + core.setFlag("poison", true); + } + if (core.inArray(type, "weak") && !core.hasFlag("weak")) { + // 获得衰效果 + core.setFlag("weak", true); + if (core.values.weakValue >= 1) { + // >=1,直接扣数值 + core.addStatus("atk", -core.values.weakValue); + core.addStatus("def", -core.values.weakValue); + } else { + // <1,扣比例 + core.addBuff("atk", -core.values.weakValue); + core.addBuff("def", -core.values.weakValue); + } + } + if (core.inArray(type, "curse") && !core.hasFlag("curse")) { + // 获得咒效果 + core.setFlag("curse", true); + } + } else if (action == "remove") { + var success = false; + if (core.inArray(type, "poison") && core.hasFlag("poison")) { + success = true; + // 移除毒效果 + core.setFlag("poison", false); + } + if (core.inArray(type, "weak") && core.hasFlag("weak")) { + success = true; + // 移除衰效果 + core.setFlag("weak", false); + if (core.values.weakValue >= 1) { + // >=1,直接扣数值 + core.addStatus("atk", core.values.weakValue); + core.addStatus("def", core.values.weakValue); + } else { + // <1,扣比例 + core.addBuff("atk", core.values.weakValue); + core.addBuff("def", core.values.weakValue); + } + } + if (core.inArray(type, "curse") && core.hasFlag("curse")) { + success = true; + // 移除咒效果 + core.setFlag("curse", false); + } + if (success) core.playSound("回血"); + } + }, "updateStatusBar": function () { - // 更新状态栏 - core.ui.statusBar.update(); - // 更新阻激夹域的伤害值 - core.updateCheckBlock(); - // 更新全地图显伤 - core.updateDamage(); -}, + // 更新状态栏 + core.ui.statusBar.update(); + // 更新阻激夹域的伤害值 + core.updateCheckBlock(); + // 更新全地图显伤 + core.updateDamage(); + }, "updateCheckBlock": function (floorId) { - // 领域、夹击、阻击等的伤害值计算 - floorId = floorId || core.status.floorId; - if (!floorId || !core.status.maps) return; + // 领域、夹击、阻击等的伤害值计算 + floorId = floorId || core.status.floorId; + if (!floorId || !core.status.maps) return; - var width = core.floors[floorId].width, - height = core.floors[floorId].height; - var blocks = core.getMapBlocksObj(floorId); + var width = core.floors[floorId].width, + height = core.floors[floorId].height; + var blocks = core.getMapBlocksObj(floorId); - var damage = {}, // 每个点的伤害值 - type = {}, // 每个点的伤害类型 - repulse = {}, // 每个点的阻击怪信息 - ambush = {}; // 每个点的捕捉信息 - var betweenAttackLocs = {}; // 所有可能的夹击点 - var needCache = false; - var canGoDeadZone = core.flags.canGoDeadZone; - core.flags.canGoDeadZone = true; + var damage = {}, // 每个点的伤害值 + type = {}, // 每个点的伤害类型 + repulse = {}, // 每个点的阻击怪信息 + ambush = {}; // 每个点的捕捉信息 + var betweenAttackLocs = {}; // 所有可能的夹击点 + var needCache = false; + var canGoDeadZone = core.flags.canGoDeadZone; + core.flags.canGoDeadZone = true; - // 计算血网和领域、阻击、激光的伤害,计算捕捉信息 - for (var loc in blocks) { - var block = blocks[loc], - x = block.x, - y = block.y, - id = block.event.id, - enemy = core.material.enemys[id]; - if (block.disable) continue; + // 计算血网和领域、阻击、激光的伤害,计算捕捉信息 + for (var loc in blocks) { + var block = blocks[loc], + x = block.x, + y = block.y, + id = block.event.id, + enemy = core.material.enemys[id]; + if (block.disable) continue; - type[loc] = type[loc] || {}; + type[loc] = type[loc] || {}; - // 血网 - // 如需调用当前楼层的ratio可使用 core.status.maps[floorId].ratio - if (id == 'lavaNet' && !core.hasItem('amulet')) { - damage[loc] = (damage[loc] || 0) + core.values.lavaDamage; - type[loc][(block.event.name || "血网") + "伤害"] = true; - } + // 血网 + // 如需调用当前楼层的ratio可使用 core.status.maps[floorId].ratio + if (id == "lavaNet" && !core.hasItem("amulet")) { + damage[loc] = (damage[loc] || 0) + core.values.lavaDamage; + type[loc][(block.event.name || "血网") + "伤害"] = true; + } - // 领域 - // 如果要防止领域伤害,可以直接简单的将 flag:no_zone 设为true - if (enemy && core.hasSpecial(enemy.special, 15) && !core.hasFlag('no_zone')) { - // 领域范围,默认为1 - var range = enemy.range || 1; - // 是否是九宫格领域 - var zoneSquare = false; - if (enemy.zoneSquare != null) zoneSquare = enemy.zoneSquare; - // 在范围内进行搜索,增加领域伤害值 - for (var dx = -range; dx <= range; dx++) { - for (var dy = -range; dy <= range; dy++) { - if (dx == 0 && dy == 0) continue; - var nx = x + dx, - ny = y + dy, - currloc = nx + "," + ny; - if (nx < 0 || nx >= width || ny < 0 || ny >= height) continue; - // 如果是十字领域,则还需要满足 |dx|+|dy|<=range - if (!zoneSquare && Math.abs(dx) + Math.abs(dy) > range) continue; - damage[currloc] = (damage[currloc] || 0) + (enemy.zone || 0); - type[currloc] = type[currloc] || {}; - type[currloc]["领域伤害"] = true; - } - } - } + // 领域 + // 如果要防止领域伤害,可以直接简单的将 flag:no_zone 设为true + if ( + enemy && + core.hasSpecial(enemy.special, 15) && + !core.hasFlag("no_zone") + ) { + // 领域范围,默认为1 + var range = enemy.range || 1; + // 是否是九宫格领域 + var zoneSquare = false; + if (enemy.zoneSquare != null) zoneSquare = enemy.zoneSquare; + // 在范围内进行搜索,增加领域伤害值 + for (var dx = -range; dx <= range; dx++) { + for (var dy = -range; dy <= range; dy++) { + if (dx == 0 && dy == 0) continue; + var nx = x + dx, + ny = y + dy, + currloc = nx + "," + ny; + if (nx < 0 || nx >= width || ny < 0 || ny >= height) continue; + // 如果是十字领域,则还需要满足 |dx|+|dy|<=range + if (!zoneSquare && Math.abs(dx) + Math.abs(dy) > range) continue; + damage[currloc] = (damage[currloc] || 0) + (enemy.zone || 0); + type[currloc] = type[currloc] || {}; + type[currloc]["领域伤害"] = true; + } + } + } - // 阻击 - // 如果要防止阻击伤害,可以直接简单的将 flag:no_repulse 设为true - if (enemy && core.hasSpecial(enemy.special, 18) && !core.hasFlag('no_repulse')) { - var scan = enemy.zoneSquare ? core.utils.scan2 : core.utils.scan; - for (var dir in scan) { - var nx = x + scan[dir].x, - ny = y + scan[dir].y, - currloc = nx + "," + ny; - if (nx < 0 || nx >= width || ny < 0 || ny >= height) continue; - damage[currloc] = (damage[currloc] || 0) + (enemy.repulse || 0); - type[currloc] = type[currloc] || {}; - type[currloc]["阻击伤害"] = true; + // 阻击 + // 如果要防止阻击伤害,可以直接简单的将 flag:no_repulse 设为true + if ( + enemy && + core.hasSpecial(enemy.special, 18) && + !core.hasFlag("no_repulse") + ) { + var scan = enemy.zoneSquare ? core.utils.scan2 : core.utils.scan; + for (var dir in scan) { + var nx = x + scan[dir].x, + ny = y + scan[dir].y, + currloc = nx + "," + ny; + if (nx < 0 || nx >= width || ny < 0 || ny >= height) continue; + damage[currloc] = (damage[currloc] || 0) + (enemy.repulse || 0); + type[currloc] = type[currloc] || {}; + type[currloc]["阻击伤害"] = true; - var rdir = core.turnDirection(":back", dir); - // 检查下一个点是否存在事件(从而判定是否移动) - var rnx = x + scan[rdir].x, - rny = y + scan[rdir].y; - if (rnx < 0 || rnx >= width || rny < 0 || rny >= height) continue; - // 如需禁止阻击被推到已隐藏的事件处(如重生怪处),可将这一句的false改为true - if (core.getBlock(rnx, rny, floorId, false) != null) continue; - if (core.utils.scan[rdir] && !core.canMoveHero(x, y, rdir, floorId)) continue; - repulse[currloc] = (repulse[currloc] || []).concat([ - [x, y, id, rdir] - ]); - } - } + var rdir = core.turnDirection(":back", dir); + // 检查下一个点是否存在事件(从而判定是否移动) + var rnx = x + scan[rdir].x, + rny = y + scan[rdir].y; + if (rnx < 0 || rnx >= width || rny < 0 || rny >= height) continue; + // 如需禁止阻击被推到已隐藏的事件处(如重生怪处),可将这一句的false改为true + if (core.getBlock(rnx, rny, floorId, false) != null) continue; + if (core.utils.scan[rdir] && !core.canMoveHero(x, y, rdir, floorId)) + continue; + repulse[currloc] = (repulse[currloc] || []).concat([ + [x, y, id, rdir], + ]); + } + } - // 激光 - // 如果要防止激光伤害,可以直接简单的将 flag:no_laser 设为true - if (enemy && core.hasSpecial(enemy.special, 24) && !core.hasFlag("no_laser")) { - for (var nx = 0; nx < width; nx++) { - var currloc = nx + "," + y; - if (nx != x) { - damage[currloc] = (damage[currloc] || 0) + (enemy.laser || 0); - type[currloc] = type[currloc] || {}; - type[currloc]["激光伤害"] = true; - } - } - for (var ny = 0; ny < height; ny++) { - var currloc = x + "," + ny; - if (ny != y) { - damage[currloc] = (damage[currloc] || 0) + (enemy.laser || 0); - type[currloc] = type[currloc] || {}; - type[currloc]["激光伤害"] = true; - } - } - } + // 激光 + // 如果要防止激光伤害,可以直接简单的将 flag:no_laser 设为true + if ( + enemy && + core.hasSpecial(enemy.special, 24) && + !core.hasFlag("no_laser") + ) { + for (var nx = 0; nx < width; nx++) { + var currloc = nx + "," + y; + if (nx != x) { + damage[currloc] = (damage[currloc] || 0) + (enemy.laser || 0); + type[currloc] = type[currloc] || {}; + type[currloc]["激光伤害"] = true; + } + } + for (var ny = 0; ny < height; ny++) { + var currloc = x + "," + ny; + if (ny != y) { + damage[currloc] = (damage[currloc] || 0) + (enemy.laser || 0); + type[currloc] = type[currloc] || {}; + type[currloc]["激光伤害"] = true; + } + } + } - // 捕捉 - // 如果要防止捕捉效果,可以直接简单的将 flag:no_ambush 设为true - if (enemy && core.enemys.hasSpecial(enemy.special, 27) && !core.hasFlag("no_ambush")) { - var scan = enemy.zoneSquare ? core.utils.scan2 : core.utils.scan; - // 给周围格子加上【捕捉】记号 - for (var dir in scan) { - var nx = x + scan[dir].x, - ny = y + scan[dir].y, - currloc = nx + "," + ny; - if (nx < 0 || nx >= width || ny < 0 || ny >= height || (core.utils.scan[dir] && !core.canMoveHero(x, y, dir, floorId))) continue; - ambush[currloc] = (ambush[currloc] || []).concat([ - [x, y, id, dir] - ]); - } - } + // 捕捉 + // 如果要防止捕捉效果,可以直接简单的将 flag:no_ambush 设为true + if ( + enemy && + core.enemys.hasSpecial(enemy.special, 27) && + !core.hasFlag("no_ambush") + ) { + var scan = enemy.zoneSquare ? core.utils.scan2 : core.utils.scan; + // 给周围格子加上【捕捉】记号 + for (var dir in scan) { + var nx = x + scan[dir].x, + ny = y + scan[dir].y, + currloc = nx + "," + ny; + if ( + nx < 0 || + nx >= width || + ny < 0 || + ny >= height || + (core.utils.scan[dir] && !core.canMoveHero(x, y, dir, floorId)) + ) + continue; + ambush[currloc] = (ambush[currloc] || []).concat([[x, y, id, dir]]); + } + } - // 夹击;在这里提前计算所有可能的夹击点,具体计算逻辑在下面 - // 如果要防止夹击伤害,可以简单的将 flag:no_betweenAttack 设为true - if (enemy && core.enemys.hasSpecial(enemy.special, 16) && !core.hasFlag('no_betweenAttack')) { - for (var dir in core.utils.scan) { - var nx = x + core.utils.scan[dir].x, - ny = y + core.utils.scan[dir].y, - currloc = nx + "," + ny; - if (nx < 0 || nx >= width || ny < 0 || ny >= height) continue; - betweenAttackLocs[currloc] = true; - } - } + // 夹击;在这里提前计算所有可能的夹击点,具体计算逻辑在下面 + // 如果要防止夹击伤害,可以简单的将 flag:no_betweenAttack 设为true + if ( + enemy && + core.enemys.hasSpecial(enemy.special, 16) && + !core.hasFlag("no_betweenAttack") + ) { + for (var dir in core.utils.scan) { + var nx = x + core.utils.scan[dir].x, + ny = y + core.utils.scan[dir].y, + currloc = nx + "," + ny; + if (nx < 0 || nx >= width || ny < 0 || ny >= height) continue; + betweenAttackLocs[currloc] = true; + } + } - // 检查地图范围类技能 - var specialFlag = core.getSpecialFlag(enemy); - if (specialFlag & 1) needCache = true; - if (core.status.event.id == 'viewMaps') needCache = true; - if ((core.status.event.id == 'book' || core.status.event.id == 'bool-detail') && core.status.event.ui) needCache = true; - } + // 检查地图范围类技能 + var specialFlag = core.getSpecialFlag(enemy); + if (specialFlag & 1) needCache = true; + if (core.status.event.id == "viewMaps") needCache = true; + if ( + (core.status.event.id == "book" || + core.status.event.id == "bool-detail") && + core.status.event.ui + ) + needCache = true; + } - // 对每个可能的夹击点计算夹击伤害 - for (var loc in betweenAttackLocs) { - var xy = loc.split(","), - x = parseInt(xy[0]), - y = parseInt(xy[1]); - // 夹击怪物的ID - var enemyId1 = null, - enemyId2 = null; - // 检查左右夹击 - var leftBlock = blocks[(x - 1) + "," + y], - rightBlock = blocks[(x + 1) + "," + y]; - var leftId = core.getFaceDownId(leftBlock), - rightId = core.getFaceDownId(rightBlock); - if (leftBlock && !leftBlock.disable && rightBlock && !rightBlock.disable && leftId == rightId) { - if (core.hasSpecial(leftId, 16)) - enemyId1 = leftId; - } - // 检查上下夹击 - var topBlock = blocks[x + "," + (y - 1)], - bottomBlock = blocks[x + "," + (y + 1)]; - var topId = core.getFaceDownId(topBlock), - bottomId = core.getFaceDownId(bottomBlock); - if (topBlock && !topBlock.disable && bottomBlock && !bottomBlock.disable && topId == bottomId) { - if (core.hasSpecial(topId, 16)) - enemyId2 = topId; - } + // 对每个可能的夹击点计算夹击伤害 + for (var loc in betweenAttackLocs) { + var xy = loc.split(","), + x = parseInt(xy[0]), + y = parseInt(xy[1]); + // 夹击怪物的ID + var enemyId1 = null, + enemyId2 = null; + // 检查左右夹击 + var leftBlock = blocks[x - 1 + "," + y], + rightBlock = blocks[x + 1 + "," + y]; + var leftId = core.getFaceDownId(leftBlock), + rightId = core.getFaceDownId(rightBlock); + if ( + leftBlock && + !leftBlock.disable && + rightBlock && + !rightBlock.disable && + leftId == rightId + ) { + if (core.hasSpecial(leftId, 16)) enemyId1 = leftId; + } + // 检查上下夹击 + var topBlock = blocks[x + "," + (y - 1)], + bottomBlock = blocks[x + "," + (y + 1)]; + var topId = core.getFaceDownId(topBlock), + bottomId = core.getFaceDownId(bottomBlock); + if ( + topBlock && + !topBlock.disable && + bottomBlock && + !bottomBlock.disable && + topId == bottomId + ) { + if (core.hasSpecial(topId, 16)) enemyId2 = topId; + } - if (enemyId1 != null || enemyId2 != null) { - var leftHp = core.status.hero.hp - (damage[loc] || 0); - if (leftHp > 1) { - // 夹击伤害值 - var value = Math.floor(leftHp / 2); - // 是否不超过怪物伤害值 - if (core.flags.betweenAttackMax) { - var enemyDamage1 = core.getDamage(enemyId1, x, y, floorId); - if (enemyDamage1 != null && enemyDamage1 < value) - value = enemyDamage1; - var enemyDamage2 = core.getDamage(enemyId2, x, y, floorId); - if (enemyDamage2 != null && enemyDamage2 < value) - value = enemyDamage2; - } - if (value > 0) { - damage[loc] = (damage[loc] || 0) + value; - type[loc] = type[loc] || {}; - type[loc]["夹击伤害"] = true; - } - } - } - } + if (enemyId1 != null || enemyId2 != null) { + var leftHp = core.status.hero.hp - (damage[loc] || 0); + if (leftHp > 1) { + // 夹击伤害值 + var value = Math.floor(leftHp / 2); + // 是否不超过怪物伤害值 + if (core.flags.betweenAttackMax) { + var enemyDamage1 = core.getDamage(enemyId1, x, y, floorId); + if (enemyDamage1 != null && enemyDamage1 < value) + value = enemyDamage1; + var enemyDamage2 = core.getDamage(enemyId2, x, y, floorId); + if (enemyDamage2 != null && enemyDamage2 < value) + value = enemyDamage2; + } + if (value > 0) { + damage[loc] = (damage[loc] || 0) + value; + type[loc] = type[loc] || {}; + type[loc]["夹击伤害"] = true; + } + } + } + } - // 取消注释下面这一段可以让护盾抵御阻激夹域伤害 - /* + // 取消注释下面这一段可以让护盾抵御阻激夹域伤害 + /* for (var loc in damage) { damage[loc] = Math.max(0, damage[loc] - core.getRealStatus('mdef')); } */ - core.flags.canGoDeadZone = canGoDeadZone; - core.status.checkBlock = { - damage: damage, - type: type, - repulse: repulse, - ambush: ambush, - needCache: needCache, - cache: {} // clear cache - }; - }, + core.flags.canGoDeadZone = canGoDeadZone; + core.status.checkBlock = { + damage: damage, + type: type, + repulse: repulse, + ambush: ambush, + needCache: needCache, + cache: {}, // clear cache + }; + }, "moveOneStep": function (callback) { - // 勇士每走一步后执行的操作。callback为行走完毕后的回调 - // 这个函数执行在“刚走完”的时候,即还没有检查该点的事件和领域伤害等。 - // 请注意:瞬间移动不会执行该函数。如果要控制能否瞬间移动有三种方法: - // 1. 将全塔属性中的cannotMoveDirectly这个开关勾上,即可在全塔中全程禁止使用瞬移。 - // 2, 将楼层属性中的cannotMoveDirectly这个开关勾上,即禁止在该层楼使用瞬移。 - // 3. 将flag:cannotMoveDirectly置为true,即可使用flag控制在某段剧情范围内禁止瞬移。 + // 勇士每走一步后执行的操作。callback为行走完毕后的回调 + // 这个函数执行在“刚走完”的时候,即还没有检查该点的事件和领域伤害等。 + // 请注意:瞬间移动不会执行该函数。如果要控制能否瞬间移动有三种方法: + // 1. 将全塔属性中的cannotMoveDirectly这个开关勾上,即可在全塔中全程禁止使用瞬移。 + // 2, 将楼层属性中的cannotMoveDirectly这个开关勾上,即禁止在该层楼使用瞬移。 + // 3. 将flag:cannotMoveDirectly置为true,即可使用flag控制在某段剧情范围内禁止瞬移。 - // 增加步数 - core.status.hero.steps++; - // 更新跟随者状态,并绘制 - core.updateFollowers(); - core.drawHero(); - // 检查中毒状态的扣血和死亡 - if (core.hasFlag('poison')) { - core.status.hero.statistics.poisonDamage += core.values.poisonDamage; - core.status.hero.hp -= core.values.poisonDamage; - if (core.status.hero.hp <= 0) { - core.status.hero.hp = 0; - core.updateStatusBar(false, true); - core.events.lose(); - return; - } else { - core.updateStatusBar(false, true); - } - } + // 增加步数 + core.status.hero.steps++; + // 更新跟随者状态,并绘制 + core.updateFollowers(); + core.drawHero(); + // 检查中毒状态的扣血和死亡 + if (core.hasFlag("poison")) { + core.status.hero.statistics.poisonDamage += core.values.poisonDamage; + core.status.hero.hp -= core.values.poisonDamage; + if (core.status.hero.hp <= 0) { + core.status.hero.hp = 0; + core.updateStatusBar(false, true); + core.events.lose(); + return; + } else { + core.updateStatusBar(false, true); + } + } - // 从v2.7开始,每一步行走不会再刷新状态栏。 - // 如果有特殊要求(如每走一步都加buff之类),可手动取消注释下面这一句: - // core.updateStatusBar(true, true); + // 从v2.7开始,每一步行走不会再刷新状态栏。 + // 如果有特殊要求(如每走一步都加buff之类),可手动取消注释下面这一句: + // core.updateStatusBar(true, true); - // 检查自动事件 - core.checkAutoEvents(); + // 检查自动事件 + core.checkAutoEvents(); - // ------ 检查目标点事件 ------ // - // 无事件的道具(如血瓶)需要优先于阻激夹域判定 - var nowx = core.getHeroLoc('x'), - nowy = core.getHeroLoc('y'); - var block = core.getBlock(nowx, nowy); - var hasTrigger = false; - if (block != null && block.event.trigger == 'getItem' && - !core.floors[core.status.floorId].afterGetItem[nowx + "," + nowy]) { - hasTrigger = true; - core.trigger(nowx, nowy, callback); - } - // 执行目标点的阻激夹域事件 - core.checkBlock(); + // ------ 检查目标点事件 ------ // + // 无事件的道具(如血瓶)需要优先于阻激夹域判定 + var nowx = core.getHeroLoc("x"), + nowy = core.getHeroLoc("y"); + var block = core.getBlock(nowx, nowy); + var hasTrigger = false; + if ( + block != null && + block.event.trigger == "getItem" && + !core.floors[core.status.floorId].afterGetItem[nowx + "," + nowy] + ) { + hasTrigger = true; + core.trigger(nowx, nowy, callback); + } + // 执行目标点的阻激夹域事件 + core.checkBlock(); - // 执行目标点的script和事件 - if (!hasTrigger) - core.trigger(nowx, nowy, callback); + // 执行目标点的script和事件 + if (!hasTrigger) core.trigger(nowx, nowy, callback); - // 检查该点是否是滑冰 - if (core.onSki()) { - // 延迟到事件最后执行,因为这之前可能有阻激夹域动画 - core.insertAction({ "type": "moveAction" }, null, null, null, true); - } + // 检查该点是否是滑冰 + if (core.onSki()) { + // 延迟到事件最后执行,因为这之前可能有阻激夹域动画 + core.insertAction({ type: "moveAction" }, null, null, null, true); + } - // ------ 检查目标点事件 END ------ // + // ------ 检查目标点事件 END ------ // - // 如需强行终止行走可以在这里条件判定: - // core.stopAutomaticRoute(); -}, + // 如需强行终止行走可以在这里条件判定: + // core.stopAutomaticRoute(); + }, "moveDirectly": function (x, y, ignoreSteps) { - // 瞬间移动;x,y为要瞬间移动的点;ignoreSteps为减少的步数,可能之前已经被计算过 - // 返回true代表成功瞬移,false代表没有成功瞬移 + // 瞬间移动;x,y为要瞬间移动的点;ignoreSteps为减少的步数,可能之前已经被计算过 + // 返回true代表成功瞬移,false代表没有成功瞬移 - // 判定能否瞬移到该点 - if (ignoreSteps == null) ignoreSteps = core.canMoveDirectly(x, y); - if (ignoreSteps >= 0) { - // 中毒也允许瞬移 - if (core.hasFlag('poison')) { - var damage = ignoreSteps * core.values.poisonDamage; - if (damage >= core.status.hero.hp) return false; - core.status.hero.statistics.poisonDamage += damage; - core.status.hero.hp -= damage; - } + // 判定能否瞬移到该点 + if (ignoreSteps == null) ignoreSteps = core.canMoveDirectly(x, y); + if (ignoreSteps >= 0) { + // 中毒也允许瞬移 + if (core.hasFlag("poison")) { + var damage = ignoreSteps * core.values.poisonDamage; + if (damage >= core.status.hero.hp) return false; + core.status.hero.statistics.poisonDamage += damage; + core.status.hero.hp -= damage; + } - core.clearMap('hero'); - if ((core.bigmap.width * 32) === (core.bigmap.height * 32) && (core.bigmap.width * 32) === core.__PIXELS__) core.addPopMove(32 * core.status.hero.loc.x + 16, 32 * core.status.hero.loc.y + 16, 32 * x + 16, 32 * y + 16) - // 获得勇士最后的朝向 - var lastDirection = core.status.route[core.status.route.length - 1]; - if (['left', 'right', 'up', 'down'].indexOf(lastDirection) >= 0) - core.setHeroLoc('direction', lastDirection); - // 设置坐标,并绘制 - core.control._moveDirectyFollowers(x, y); - core.status.hero.loc.x = x; - core.status.hero.loc.y = y; - core.drawHero(); - // 记录录像 - core.status.route.push("move:" + x + ":" + y); - // 统计信息 - core.status.hero.statistics.moveDirectly++; - core.status.hero.statistics.ignoreSteps += ignoreSteps; - if (core.hasFlag('poison')) { - core.updateStatusBar(false, true); - } + core.clearMap("hero"); + if ( + core.bigmap.width * 32 === core.bigmap.height * 32 && + core.bigmap.width * 32 === core.__PIXELS__ + ) + core.addPopMove( + 32 * core.status.hero.loc.x + 16, + 32 * core.status.hero.loc.y + 16, + 32 * x + 16, + 32 * y + 16 + ); + // 获得勇士最后的朝向 + var lastDirection = core.status.route[core.status.route.length - 1]; + if (["left", "right", "up", "down"].indexOf(lastDirection) >= 0) + core.setHeroLoc("direction", lastDirection); + // 设置坐标,并绘制 + core.control._moveDirectyFollowers(x, y); + core.status.hero.loc.x = x; + core.status.hero.loc.y = y; + core.drawHero(); + // 记录录像 + core.status.route.push("move:" + x + ":" + y); + // 统计信息 + core.status.hero.statistics.moveDirectly++; + core.status.hero.statistics.ignoreSteps += ignoreSteps; + if (core.hasFlag("poison")) { + core.updateStatusBar(false, true); + } - core.checkRouteFolding(); - return true; - } - return false; -}, + core.checkRouteFolding(); + return true; + } + return false; + }, "parallelDo": function (timestamp) { - // 并行事件处理,可以在这里写任何需要并行处理的脚本或事件 - // 该函数将被系统反复执行,每次执行间隔视浏览器或设备性能而定,一般约为16.6ms一次 - // 参数timestamp为“从游戏资源加载完毕到当前函数执行时”的时间差,以毫秒为单位 + // 并行事件处理,可以在这里写任何需要并行处理的脚本或事件 + // 该函数将被系统反复执行,每次执行间隔视浏览器或设备性能而定,一般约为16.6ms一次 + // 参数timestamp为“从游戏资源加载完毕到当前函数执行时”的时间差,以毫秒为单位 - // 检查当前是否处于游戏开始状态 - if (!core.isPlaying()) return; + // 检查当前是否处于游戏开始状态 + if (!core.isPlaying()) return; - // 执行当前楼层的并行事件处理 - if (core.status.floorId) { - try { - eval(core.floors[core.status.floorId].parallelDo); - } catch (e) { - console.error(e); - } - } - } + // 执行当前楼层的并行事件处理 + if (core.status.floorId) { + try { + eval(core.floors[core.status.floorId].parallelDo); + } catch (e) { + console.error(e); + } + } + } }, "ui": { "getToolboxItems": function (cls) { - // 获得道具栏中当前某类型道具的显示项和显示顺序 - // cls为道具类型,只可能是 tools, constants 和 equips - // 返回一个数组,代表当前某类型道具的显示内容和顺序 - // 默认按id升序排列,您可以取消下面的注释改为按名称排列 + // 获得道具栏中当前某类型道具的显示项和显示顺序 + // cls为道具类型,只可能是 tools, constants 和 equips + // 返回一个数组,代表当前某类型道具的显示内容和顺序 + // 默认按id升序排列,您可以取消下面的注释改为按名称排列 - return Object.keys(core.status.hero.items[cls] || {}) - .filter(function (id) { return !core.material.items[id].hideInToolbox; }) - .sort( /*function (id1, id2) { return core.material.items[id1].name <= core.material.items[id2].name ? -1 : 1 }*/ ); -}, + return Object.keys(core.status.hero.items[cls] || {}) + .filter(function (id) { + return !core.material.items[id].hideInToolbox; + }) + .sort(/*function (id1, id2) { return core.material.items[id1].name <= core.material.items[id2].name ? -1 : 1 }*/); + }, "drawStatusBar": function () { - // 这真的是人能写出来的东西? - var ctx, fill = function (text, x, y, style) { - core.ui.setFont(ctx, (/\w+/.test(text) ? 'italic ' : '') + 'bold 18px Verdana'); - core.ui.fillBoldText(ctx, text, x, y, style); - }; - if (core.flags.statusCanvas) { // 系统开关「自绘状态栏」开启 - core.ui.clearMap(ctx = core.dom.statusCanvasCtx); // 清空状态栏 - core.ui.setFillStyle(ctx, core.status.globalAttribute.statusBarColor); - if (core.domStyle.isVertical) { // 竖屏 - core.drawImage(ctx, core.statusBar.icons.floor, 6, 6, 25, 25); - fill((core.status.thisMap || {}).name || "Loading", 42, 26); - core.drawImage(ctx, core.statusBar.icons.hp, 137, 6, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('hp')), 173, 26); - core.drawImage(ctx, core.statusBar.icons.atk, 268, 6, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('atk')), 304, 26); - core.drawImage(ctx, core.statusBar.icons.def, 6, 38, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('def')), 42, 58); - core.drawImage(ctx, core.statusBar.icons.mdef, 137, 38, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('mdef')), 173, 58); - core.drawImage(ctx, core.statusBar.icons.money, 268, 38, 25, 25); - fill(core.formatBigNumber(core.status.hero.money), 304, 58); - core.drawImage(ctx, core.statusBar.icons.exp, 6, 70, 25, 25); - fill(core.formatBigNumber(core.status.hero.exp), 42, 90); - } else if (!core.flags.hideLeftStatusBar) { // 横屏且未隐藏状态栏 - core.drawImage(ctx, core.statusBar.icons.floor, 6, 9, 25, 25); - fill((core.status.thisMap || {}).name || "Loading", 42, 29); - core.drawImage(ctx, core.statusBar.icons.hp, 6, 43, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('hp')), 42, 63); - core.drawImage(ctx, core.statusBar.icons.atk, 6, 77, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('atk')), 42, 97); - core.drawImage(ctx, core.statusBar.icons.def, 6, 111, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('def')), 42, 131); - core.drawImage(ctx, core.statusBar.icons.mdef, 6, 145, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('mdef')), 42, 165); - core.drawImage(ctx, core.statusBar.icons.money, 6, 179, 25, 25); - fill(core.formatBigNumber(core.status.hero.money), 42, 199); - core.drawImage(ctx, core.statusBar.icons.exp, 6, 213, 25, 25); - fill(core.formatBigNumber(core.status.hero.exp), 42, 233); - fill(core.setTwoDigits(core.itemCount('yellowKey')), 11, 267, '#FFCCAA'); - fill(core.setTwoDigits(core.itemCount('blueKey')), 46, 267, '#AAAADD'); - fill(core.setTwoDigits(core.itemCount('redKey')), 81, 267, '#FF8888'); - } - } else if (core.flags.hideLeftStatusBar && !core.domStyle.isVertical) { // 横屏且隐藏状态栏 - if (!core.dymCanvas['status']) - core.ui.createCanvas('status', 0, 0, core._PX_, core._PY_, 66); // 刚好盖过显伤层 - core.ui.clearMap(ctx = core.dymCanvas['status']); - core.ui.setFillStyle(ctx, core.status.globalAttribute.statusBarColor); - var offset = core.status.hero.loc.x - core.bigmap.offsetX / 32 >= core._HEIGHT_ ? 0 : core._PY_; - core.ui.setAlpha(ctx, 0.75); - core.ui.drawWindowSkin('winskin.webp', ctx, offset, 0, core._PX_ - core._PY_, core._PY_); - core.ui.setAlpha(ctx, 1); - core.drawImage(ctx, core.statusBar.icons.floor, 6 + offset, 9, 25, 25); - fill((core.status.thisMap || {}).name || "Loading", 42 + offset, 29); - core.drawImage(ctx, core.statusBar.icons.hp, 6 + offset, 43, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('hp')), 42 + offset, 63); - core.drawImage(ctx, core.statusBar.icons.atk, 6 + offset, 77, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('atk')), 42 + offset, 97); - core.drawImage(ctx, core.statusBar.icons.def, 6 + offset, 111, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('def')), 42 + offset, 131); - core.drawImage(ctx, core.statusBar.icons.mdef, 6 + offset, 145, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('mdef')), 42 + offset, 165); - core.drawImage(ctx, core.statusBar.icons.money, 6 + offset, 179, 25, 25); - fill(core.formatBigNumber(core.status.hero.money), 42 + offset, 199); - core.drawImage(ctx, core.statusBar.icons.exp, 6 + offset, 213, 25, 25); - fill(core.formatBigNumber(core.status.hero.exp), 42 + offset, 233); - fill(core.setTwoDigits(core.itemCount('yellowKey')), 11 + offset, 267, '#FFCCAA'); - fill(core.setTwoDigits(core.itemCount('blueKey')), 46 + offset, 267, '#AAAADD'); - fill(core.setTwoDigits(core.itemCount('redKey')), 81 + offset, 267, '#FF8888'); - } -}, + // 这真的是人能写出来的东西? + var ctx, + fill = function (text, x, y, style) { + core.ui.setFont( + ctx, + (/\w+/.test(text) ? "italic " : "") + "bold 18px Verdana" + ); + core.ui.fillBoldText(ctx, text, x, y, style); + }; + if (core.flags.statusCanvas) { + // 系统开关「自绘状态栏」开启 + core.ui.clearMap((ctx = core.dom.statusCanvasCtx)); // 清空状态栏 + core.ui.setFillStyle(ctx, core.status.globalAttribute.statusBarColor); + if (core.domStyle.isVertical) { + // 竖屏 + core.drawImage(ctx, core.statusBar.icons.floor, 6, 6, 25, 25); + fill((core.status.thisMap || {}).name || "Loading", 42, 26); + core.drawImage(ctx, core.statusBar.icons.hp, 137, 6, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("hp")), 173, 26); + core.drawImage(ctx, core.statusBar.icons.atk, 268, 6, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("atk")), 304, 26); + core.drawImage(ctx, core.statusBar.icons.def, 6, 38, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("def")), 42, 58); + core.drawImage(ctx, core.statusBar.icons.mdef, 137, 38, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("mdef")), 173, 58); + core.drawImage(ctx, core.statusBar.icons.money, 268, 38, 25, 25); + fill(core.formatBigNumber(core.status.hero.money), 304, 58); + core.drawImage(ctx, core.statusBar.icons.exp, 6, 70, 25, 25); + fill(core.formatBigNumber(core.status.hero.exp), 42, 90); + } else if (!core.flags.hideLeftStatusBar) { + // 横屏且未隐藏状态栏 + core.drawImage(ctx, core.statusBar.icons.floor, 6, 9, 25, 25); + fill((core.status.thisMap || {}).name || "Loading", 42, 29); + core.drawImage(ctx, core.statusBar.icons.hp, 6, 43, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("hp")), 42, 63); + core.drawImage(ctx, core.statusBar.icons.atk, 6, 77, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("atk")), 42, 97); + core.drawImage(ctx, core.statusBar.icons.def, 6, 111, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("def")), 42, 131); + core.drawImage(ctx, core.statusBar.icons.mdef, 6, 145, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("mdef")), 42, 165); + core.drawImage(ctx, core.statusBar.icons.money, 6, 179, 25, 25); + fill(core.formatBigNumber(core.status.hero.money), 42, 199); + core.drawImage(ctx, core.statusBar.icons.exp, 6, 213, 25, 25); + fill(core.formatBigNumber(core.status.hero.exp), 42, 233); + fill( + core.setTwoDigits(core.itemCount("yellowKey")), + 11, + 267, + "#FFCCAA" + ); + fill( + core.setTwoDigits(core.itemCount("blueKey")), + 46, + 267, + "#AAAADD" + ); + fill(core.setTwoDigits(core.itemCount("redKey")), 81, 267, "#FF8888"); + } + } else if (core.flags.hideLeftStatusBar && !core.domStyle.isVertical) { + // 横屏且隐藏状态栏 + if (!core.dymCanvas["status"]) + core.ui.createCanvas("status", 0, 0, core._PX_, core._PY_, 66); // 刚好盖过显伤层 + core.ui.clearMap((ctx = core.dymCanvas["status"])); + core.ui.setFillStyle(ctx, core.status.globalAttribute.statusBarColor); + var offset = + core.status.hero.loc.x - core.bigmap.offsetX / 32 >= core._HEIGHT_ + ? 0 + : core._PY_; + core.ui.setAlpha(ctx, 0.75); + core.ui.drawWindowSkin( + "winskin.webp", + ctx, + offset, + 0, + core._PX_ - core._PY_, + core._PY_ + ); + core.ui.setAlpha(ctx, 1); + core.drawImage(ctx, core.statusBar.icons.floor, 6 + offset, 9, 25, 25); + fill((core.status.thisMap || {}).name || "Loading", 42 + offset, 29); + core.drawImage(ctx, core.statusBar.icons.hp, 6 + offset, 43, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("hp")), 42 + offset, 63); + core.drawImage(ctx, core.statusBar.icons.atk, 6 + offset, 77, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("atk")), 42 + offset, 97); + core.drawImage(ctx, core.statusBar.icons.def, 6 + offset, 111, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("def")), 42 + offset, 131); + core.drawImage(ctx, core.statusBar.icons.mdef, 6 + offset, 145, 25, 25); + fill( + core.formatBigNumber(core.getRealStatus("mdef")), + 42 + offset, + 165 + ); + core.drawImage( + ctx, + core.statusBar.icons.money, + 6 + offset, + 179, + 25, + 25 + ); + fill(core.formatBigNumber(core.status.hero.money), 42 + offset, 199); + core.drawImage(ctx, core.statusBar.icons.exp, 6 + offset, 213, 25, 25); + fill(core.formatBigNumber(core.status.hero.exp), 42 + offset, 233); + fill( + core.setTwoDigits(core.itemCount("yellowKey")), + 11 + offset, + 267, + "#FFCCAA" + ); + fill( + core.setTwoDigits(core.itemCount("blueKey")), + 46 + offset, + 267, + "#AAAADD" + ); + fill( + core.setTwoDigits(core.itemCount("redKey")), + 81 + offset, + 267, + "#FF8888" + ); + } + }, "drawStatistics": function () { - // 浏览地图时参与的统计项目 + // 浏览地图时参与的统计项目 - return [ - 'yellowDoor', 'blueDoor', 'redDoor', 'greenDoor', 'steelDoor', - 'yellowKey', 'blueKey', 'redKey', 'greenKey', 'steelKey', - 'redGem', 'blueGem', 'greenGem', 'yellowGem', - 'redPotion', 'bluePotion', 'greenPotion', 'yellowPotion', 'superPotion', - 'pickaxe', 'bomb', 'centerFly', 'icePickaxe', 'freezeBadge', - 'earthquake', 'upFly', 'downFly', 'jumpShoes', 'lifeWand', - 'poisonWine', 'weakWine', 'curseWine', 'superWine', - 'sword1', 'sword2', 'sword3', 'sword4', 'sword5', - 'shield1', 'shield2', 'shield3', 'shield4', 'shield5', - // 在这里可以增加新的ID来进行统计个数,只能增加道具ID - ]; - }, + return [ + "yellowDoor", + "blueDoor", + "redDoor", + "greenDoor", + "steelDoor", + "yellowKey", + "blueKey", + "redKey", + "greenKey", + "steelKey", + "redGem", + "blueGem", + "greenGem", + "yellowGem", + "redPotion", + "bluePotion", + "greenPotion", + "yellowPotion", + "superPotion", + "pickaxe", + "bomb", + "centerFly", + "icePickaxe", + "freezeBadge", + "earthquake", + "upFly", + "downFly", + "jumpShoes", + "lifeWand", + "poisonWine", + "weakWine", + "curseWine", + "superWine", + "sword1", + "sword2", + "sword3", + "sword4", + "sword5", + "shield1", + "shield2", + "shield3", + "shield4", + "shield5", + // 在这里可以增加新的ID来进行统计个数,只能增加道具ID + ]; + }, "drawAbout": function () { - // 绘制“关于”界面 - core.ui.closePanel(); - core.lockControl(); - core.status.event.id = 'about'; + // 绘制“关于”界面 + core.ui.closePanel(); + core.lockControl(); + core.status.event.id = "about"; - var left = 48, - top = 36, - right = (core._PX_ || core.__PIXELS__) - 2 * left, - bottom = (core._PY_ || core.__PIXELS__) - 2 * top; + var left = 48, + top = 36, + right = (core._PX_ || core.__PIXELS__) - 2 * left, + bottom = (core._PY_ || core.__PIXELS__) - 2 * top; - core.setAlpha('ui', 0.85); - core.fillRect('ui', left, top, right, bottom, '#000000'); - core.setAlpha('ui', 1); - core.strokeRect('ui', left - 1, top - 1, right + 1, bottom + 1, '#FFFFFF', 2); + core.setAlpha("ui", 0.85); + core.fillRect("ui", left, top, right, bottom, "#000000"); + core.setAlpha("ui", 1); + core.strokeRect( + "ui", + left - 1, + top - 1, + right + 1, + bottom + 1, + "#FFFFFF", + 2 + ); - var text_start = left + 24; + var text_start = left + 24; - // 名称 - core.setTextAlign('ui', 'left'); - var globalAttribute = core.status.globalAttribute || core.initStatus.globalAttribute; - core.fillText('ui', "HTML5 魔塔样板", text_start, top + 35, globalAttribute.selectColor, "bold 22px " + globalAttribute.font); - core.fillText('ui', "版本: " + main.__VERSION__, text_start, top + 80, "#FFFFFF", "bold 17px " + globalAttribute.font); - core.fillText('ui', "作者: 艾之葵", text_start, top + 112); - core.fillText('ui', 'HTML5魔塔交流群:539113091', text_start, top + 112 + 32); - // TODO: 写自己的“关于”页面,每次增加32像素即可 - core.playSound('打开界面'); - } + // 名称 + core.setTextAlign("ui", "left"); + var globalAttribute = + core.status.globalAttribute || core.initStatus.globalAttribute; + core.fillText( + "ui", + "HTML5 魔塔样板", + text_start, + top + 35, + globalAttribute.selectColor, + "bold 22px " + globalAttribute.font + ); + core.fillText( + "ui", + "版本: " + main.__VERSION__, + text_start, + top + 80, + "#FFFFFF", + "bold 17px " + globalAttribute.font + ); + core.fillText("ui", "作者: 艾之葵", text_start, top + 112); + core.fillText( + "ui", + "HTML5魔塔交流群:539113091", + text_start, + top + 112 + 32 + ); + // TODO: 写自己的“关于”页面,每次增加32像素即可 + core.playSound("打开界面"); + } } } \ No newline at end of file diff --git a/project/items.js b/project/items.js index edc41cf..0507d29 100644 --- a/project/items.js +++ b/project/items.js @@ -332,7 +332,7 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "text": "可以自由往来去过的楼层", "hideInReplay": true, "hideInToolbox": true, - "useItemEffect": "//core.ui.drawFly(core.floorIds.indexOf(core.status.floorId));\nflags.canMoveFloor = core.canMoveFloor()\nif (core.isPlaying()) core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId));", + "useItemEffect": "//core.ui.drawFly(core.floorIds.indexOf(core.status.floorId));\nflags.canMoveFloor = core.canMoveFloor()\nif (!main.replayChecking && !core.isReplaying()) core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId));", "canUseItemEffect": "(function () {\n\tif (core.flags.flyNearStair && !core.nearStair() && !core.canMoveFloor())\n\t\treturn false;\n\treturn core.status.maps[core.status.floorId].canFlyFrom;\n})();" }, "coin": { diff --git a/project/maps.js b/project/maps.js index 407c757..67560d4 100644 --- a/project/maps.js +++ b/project/maps.js @@ -1,306 +1,670 @@ -var maps_90f36752_8815_4be8_b32b_d7fad1d0542e = -{ - "1": {"cls":"animates","id":"yellowWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{}}}, - "2": {"cls":"animates","id":"whiteWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{}}}, - "3": {"cls":"animates","id":"blueWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{}}}, - "4": {"cls":"animates","id":"star","name":"星空"}, - "5": {"cls":"animates","id":"lava","name":"岩浆"}, - "6": {"cls":"animates","id":"ice","doorInfo":{"time":160,"openSound":"破冰镐","closeSound":"door.opus","keys":{"icePickaxe":1}},"animate":1}, - "7": {"cls":"terrains","id":"blueShopLeft"}, - "8": {"cls":"terrains","id":"blueShopRight"}, - "9": {"cls":"terrains","id":"pinkShopLeft"}, - "10": {"cls":"terrains","id":"pinkShopRight"}, - "11": {"cls":"animates","id":"lavaNet","canPass":true,"trigger":"null","script":"(function () {\n\t// 血网的伤害效果移动到 checkBlock 中处理\n\n\t// 如果要做一次性血网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})();","name":"血网"}, - "12": {"cls":"animates","id":"poisonNet","canPass":true,"trigger":"null","script":"(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'poison');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性毒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"毒网"}, - "13": {"cls":"animates","id":"weakNet","canPass":true,"trigger":"null","script":"(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'weak');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性衰网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"衰网"}, - "14": {"cls":"animates","id":"curseNet","canPass":true,"trigger":"null","script":"(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'curse');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性咒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"咒网"}, - "15": {"cls":"animates","id":"blueLava"}, - "16": {"cls":"animates","id":"water"}, - "20": {"cls":"autotile","id":"autotile"}, - "21": {"cls":"items","id":"yellowKey"}, - "22": {"cls":"items","id":"blueKey"}, - "23": {"cls":"items","id":"redKey"}, - "24": {"cls":"items","id":"greenKey"}, - "25": {"cls":"items","id":"steelKey"}, - "26": {"cls":"items","id":"bigKey"}, - "27": {"cls":"items","id":"redGem"}, - "28": {"cls":"items","id":"blueGem"}, - "29": {"cls":"items","id":"greenGem"}, - "30": {"cls":"items","id":"yellowGem"}, - "31": {"cls":"items","id":"redPotion"}, - "32": {"cls":"items","id":"bluePotion"}, - "33": {"cls":"items","id":"greenPotion"}, - "34": {"cls":"items","id":"yellowPotion"}, - "35": {"cls":"items","id":"sword1"}, - "36": {"cls":"items","id":"shield1"}, - "37": {"cls":"items","id":"sword2"}, - "38": {"cls":"items","id":"shield2"}, - "39": {"cls":"items","id":"sword3"}, - "40": {"cls":"items","id":"shield3"}, - "41": {"cls":"items","id":"sword4"}, - "42": {"cls":"items","id":"shield4"}, - "43": {"cls":"items","id":"sword5"}, - "44": {"cls":"items","id":"shield5"}, - "45": {"cls":"items","id":"book"}, - "46": {"cls":"items","id":"fly"}, - "47": {"cls":"items","id":"pickaxe"}, - "48": {"cls":"items","id":"icePickaxe"}, - "49": {"cls":"items","id":"bomb"}, - "50": {"cls":"items","id":"centerFly"}, - "51": {"cls":"items","id":"upFly"}, - "52": {"cls":"items","id":"downFly"}, - "53": {"cls":"items","id":"coin"}, - "54": {"cls":"items","id":"freezeBadge"}, - "55": {"cls":"items","id":"cross"}, - "56": {"cls":"items","id":"superPotion"}, - "57": {"cls":"items","id":"earthquake"}, - "58": {"cls":"items","id":"poisonWine"}, - "59": {"cls":"items","id":"weakWine"}, - "60": {"cls":"items","id":"curseWine"}, - "61": {"cls":"items","id":"superWine"}, - "62": {"cls":"items","id":"dagger"}, - "63": {"cls":"items","id":"pack"}, - "64": {"cls":"items","id":"amulet"}, - "65": {"cls":"items","id":"hammer"}, - "68": {"cls":"items","id":"lifeWand"}, - "69": {"cls":"items","id":"jumpShoes"}, - "70": {"cls":"items","id":"sword0"}, - "71": {"cls":"items","id":"shield0"}, - "72": {"cls":"items","id":"skill1"}, - "73": {"cls":"items","id":"wand"}, - "81": {"cls":"animates","id":"yellowDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"yellowKey":1}},"name":"黄门"}, - "82": {"cls":"animates","id":"blueDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"blueKey":1}},"name":"蓝门"}, - "83": {"cls":"animates","id":"redDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"redKey":1}},"name":"红门"}, - "84": {"cls":"animates","id":"greenDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"greenKey":1}},"name":"绿门"}, - "85": {"cls":"animates","id":"specialDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"specialKey":1}},"name":"机关门"}, - "86": {"cls":"animates","id":"steelDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"steelKey":1}},"name":"铁门"}, - "87": {"cls":"terrains","id":"upFloor","canPass":true}, - "88": {"cls":"terrains","id":"downFloor","canPass":true}, - "89": {"cls":"animates","id":"portal","canPass":true}, - "90": {"cls":"animates","id":"starPortal","canPass":true}, - "91": {"cls":"animates","id":"upPortal","canPass":true}, - "92": {"cls":"animates","id":"leftPortal","canPass":true}, - "93": {"cls":"animates","id":"downPortal","canPass":true}, - "94": {"cls":"animates","id":"rightPortal","canPass":true}, - "101": {"cls":"animates","id":"crystalUp"}, - "102": {"cls":"animates","id":"crystalBottom"}, - "103": {"cls":"animates","id":"fire"}, - "104": {"cls":"animates","id":"switch"}, - "109": {"cls":"animates","id":"magentaWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{}}}, - "121": {"cls":"npcs","id":"man"}, - "122": {"cls":"npcs","id":"trader"}, - "123": {"cls":"npcs","id":"thief"}, - "124": {"cls":"npcs","id":"fairy"}, - "125": {"cls":"npcs","id":"wizard"}, - "126": {"cls":"npcs","id":"recluse"}, - "127": {"cls":"npcs","id":"king"}, - "128": {"cls":"npcs","id":"youngMan"}, - "129": {"cls":"npcs","id":"sign"}, - "130": {"cls":"npcs","id":"expShop"}, - "131": {"cls":"npcs","id":"moneyShop"}, - "132": {"cls":"npcs","id":"princess"}, - "133": {"cls":"npc48","id":"npc0","faceIds":{"down":"npc0","left":"npc1","right":"npc2","up":"npc3"},"animate":1}, - "134": {"cls":"npc48","id":"npc1","faceIds":{"down":"npc0","left":"npc1","right":"npc2","up":"npc3"},"animate":1}, - "135": {"cls":"npc48","id":"npc2","faceIds":{"down":"npc0","left":"npc1","right":"npc2","up":"npc3"},"animate":1}, - "136": {"cls":"npc48","id":"npc3","faceIds":{"down":"npc0","left":"npc1","right":"npc2","up":"npc3"},"animate":1}, - "137": {"cls":"npcs","id":"greenMan"}, - "138": {"cls":"npcs","id":"blueTrader"}, - "140": {"cls":"autotile","id":"autotile4"}, - "141": {"cls":"autotile","id":"autotile8"}, - "142": {"cls":"autotile","id":"autotile9"}, - "143": {"cls":"autotile","id":"autotile10"}, - "144": {"cls":"autotile","id":"autotile12"}, - "151": {"cls":"autotile","id":"autotile1"}, - "152": {"cls":"autotile","id":"autotile2"}, - "153": {"cls":"autotile","id":"autotile3"}, - "161": {"cls":"terrains","id":"arrowUp","canPass":true,"cannotOut":["left","right","down"],"cannotIn":["up"]}, - "162": {"cls":"terrains","id":"arrowDown","canPass":true,"cannotOut":["left","right","up"],"cannotIn":["down"]}, - "163": {"cls":"terrains","id":"arrowLeft","canPass":true,"cannotOut":["up","down","right"],"cannotIn":["left"]}, - "164": {"cls":"terrains","id":"arrowRight","canPass":true,"cannotOut":["up","down","left"],"cannotIn":["right"]}, - "165": {"cls":"terrains","id":"light","trigger":"null","canPass":true,"script":"(function () {\n\tcore.setBlock(core.getNumberById('darkLight'), core.getHeroLoc('x'), core.getHeroLoc('y'));\n})();"}, - "166": {"cls":"terrains","id":"darkLight"}, - "167": {"cls":"terrains","id":"ski","trigger":"ski","canPass":true}, - "168": {"cls":"terrains","id":"flower","canPass":true}, - "169": {"cls":"terrains","id":"box","trigger":"pushBox"}, - "170": {"cls":"terrains","id":"boxed","trigger":"pushBox"}, - "201": {"cls":"enemys","id":"greenSlime"}, - "202": {"cls":"enemys","id":"redSlime"}, - "203": {"cls":"enemys","id":"blackSlime"}, - "204": {"cls":"enemys","id":"slimelord"}, - "205": {"cls":"enemys","id":"bat"}, - "206": {"cls":"enemys","id":"bigBat"}, - "207": {"cls":"enemys","id":"redBat"}, - "208": {"cls":"enemys","id":"vampire"}, - "209": {"cls":"enemys","id":"skeleton"}, - "210": {"cls":"enemys","id":"skeletonWarrior"}, - "211": {"cls":"enemys","id":"skeletonCaptain"}, - "212": {"cls":"enemys","id":"ghostSoldier"}, - "213": {"cls":"enemys","id":"zombie"}, - "214": {"cls":"enemys","id":"zombieKnight"}, - "215": {"cls":"enemys","id":"rock"}, - "216": {"cls":"enemys","id":"slimeman"}, - "217": {"cls":"enemys","id":"bluePriest"}, - "218": {"cls":"enemys","id":"redPriest"}, - "219": {"cls":"enemys","id":"brownWizard"}, - "220": {"cls":"enemys","id":"redWizard"}, - "221": {"cls":"enemys","id":"yellowGateKeeper"}, - "222": {"cls":"enemys","id":"blueGateKeeper"}, - "223": {"cls":"enemys","id":"redGateKeeper"}, - "224": {"cls":"enemys","id":"swordsman"}, - "225": {"cls":"enemys","id":"soldier"}, - "226": {"cls":"enemys","id":"yellowKnight"}, - "227": {"cls":"enemys","id":"redKnight"}, - "228": {"cls":"enemys","id":"darkKnight"}, - "229": {"cls":"enemys","id":"blackKing"}, - "230": {"cls":"enemys","id":"yellowKing"}, - "231": {"cls":"enemys","id":"greenKing"}, - "232": {"cls":"enemys","id":"blueKnight"}, - "233": {"cls":"enemys","id":"goldSlime"}, - "234": {"cls":"enemys","id":"poisonSkeleton"}, - "235": {"cls":"enemys","id":"poisonBat"}, - "236": {"cls":"enemys","id":"ironRock"}, - "237": {"cls":"enemys","id":"skeletonPriest"}, - "238": {"cls":"enemys","id":"skeletonKing"}, - "239": {"cls":"enemys","id":"skeletonPresbyter"}, - "240": {"cls":"enemys","id":"skeletonKnight"}, - "241": {"cls":"enemys","id":"evilHero"}, - "242": {"cls":"enemys","id":"devilWarrior"}, - "243": {"cls":"enemys","id":"demonPriest"}, - "244": {"cls":"enemys","id":"goldHornSlime"}, - "245": {"cls":"enemys","id":"redKing"}, - "246": {"cls":"enemys","id":"blueKing"}, - "247": {"cls":"enemys","id":"magicMaster"}, - "248": {"cls":"enemys","id":"silverSlime"}, - "249": {"cls":"enemys","id":"blademaster"}, - "250": {"cls":"enemys","id":"whiteHornSlime"}, - "251": {"cls":"enemys","id":"evilPrincess"}, - "252": {"cls":"enemys","id":"evilFairy"}, - "253": {"cls":"enemys","id":"yellowPriest"}, - "254": {"cls":"enemys","id":"redSwordsman"}, - "255": {"cls":"enemys","id":"whiteSlimeman"}, - "256": {"cls":"enemys","id":"poisonZombie"}, - "257": {"cls":"enemys","id":"dragon"}, - "258": {"cls":"enemys","id":"octopus"}, - "259": {"cls":"enemys","id":"fairyEnemy"}, - "260": {"cls":"enemys","id":"princessEnemy"}, - "261": {"cls":"enemy48","id":"angel"}, - "262": {"cls":"enemy48","id":"elemental"}, - "263": {"cls":"enemy48","id":"steelGuard"}, - "264": {"cls":"enemy48","id":"evilBat"}, - "265": {"cls":"enemys","id":"silverSlimelord"}, - "266": {"cls":"enemys","id":"goldSlimelord"}, - "267": {"cls":"enemys","id":"grayRock"}, - "270": {"cls":"enemys","id":"greenKnight"}, - "271": {"cls":"enemys","id":"bowman"}, - "272": {"cls":"enemys","id":"purpleBowman"}, - "275": {"cls":"enemys","id":"watcherSlime"}, - "277": {"cls":"enemys","id":"frostBat"}, - "278": {"cls":"enemys","id":"devilKnight"}, - "279": {"cls":"enemys","id":"grayPriest"}, - "280": {"cls":"enemys","id":"greenGateKeeper"}, - "300": {"cls":"terrains","id":"ground"}, - "301": {"cls":"terrains","id":"sWallT","name":"薄墙-上","cannotOut":["up"],"cannotIn":["up"]}, - "302": {"cls":"terrains","id":"sWallL","name":"薄墙-左","cannotOut":["left"],"cannotIn":["left"]}, - "303": {"cls":"terrains","id":"sWallR","name":"薄墙-右","cannotOut":["right"],"cannotIn":["right"]}, - "304": {"cls":"terrains","id":"sWallB","name":"薄墙-下","cannotOut":["down"],"cannotIn":["down"]}, - "305": {"cls":"terrains","id":"grass"}, - "306": {"cls":"terrains","id":"sWallTL","name":"薄墙-上左","cannotOut":["up","left"],"cannotIn":["up","left"]}, - "307": {"cls":"terrains","id":"sWallBR","name":"薄墙-下右","cannotOut":["down","right"],"cannotIn":["down","right"]}, - "308": {"cls":"terrains","id":"grass2"}, - "309": {"cls":"terrains","id":"sWallTR","name":"薄墙-上右","cannotOut":["up","right"],"cannotIn":["up","right"]}, - "310": {"cls":"terrains","id":"sWallBL","name":"薄墙-下左","cannotOut":["down","left"],"cannotIn":["down","left"]}, - "311": {"cls":"terrains","id":"ground2"}, - "312": {"cls":"terrains","id":"sWallTB","name":"薄墙-上下","cannotOut":["up","down"],"cannotIn":["up","down"]}, - "313": {"cls":"terrains","id":"ground3"}, - "314": {"cls":"terrains","id":"sWallLR","name":"薄墙-左右","cannotOut":["left","right"],"cannotIn":["left","right"]}, - "315": {"cls":"terrains","id":"sWallBLR","name":"薄墙-下左右","cannotOut":["down","left","right"],"cannotIn":["down","left","right"]}, - "316": {"cls":"terrains","id":"sWallTLR","name":"薄墙-上左右","cannotOut":["up","left","right"],"cannotIn":["up","left","right"]}, - "317": {"cls":"terrains","id":"sWallTBR","name":"薄墙-上下右","cannotOut":["up","down","right"],"cannotIn":["up","down","right"]}, - "318": {"cls":"terrains","id":"sWallTBL","name":"薄墙-上下左","cannotOut":["up","down","left"],"cannotIn":["up","down","left"]}, - "319": {"cls":"npc48","id":"tallYellowDoor","trigger":"openDoor","name":"高黄门","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"yellowKey":1}}}, - "320": {"cls":"npc48","id":"tallBlueDoor","trigger":"openDoor","name":"高蓝门","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"blueKey":1}}}, - "321": {"cls":"npc48","id":"tallRedDoor","trigger":"openDoor","name":"高红门","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"redKey":1}}}, - "322": {"cls":"npc48","id":"tallGreenDoor","trigger":"openDoor","name":"高绿门","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"greenKey":1}}}, - "323": {"cls":"npc48","id":"tallSpecialDoor","trigger":"openDoor","name":"高机关门","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"specialKey":1}}}, - "324": {"cls":"npc48","id":"tallSteelDoor","trigger":"openDoor","name":"高铁门","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"steelKey":1}}}, - "325": {"cls":"enemys","id":"keiskeiFairy"}, - "326": {"cls":"enemys","id":"tulipFairy"}, - "327": {"cls":"enemy48","id":"bearDown"}, - "328": {"cls":"enemy48","id":"bearLeft"}, - "329": {"cls":"enemy48","id":"bearRight"}, - "330": {"cls":"enemy48","id":"bearUp"}, - "331": {"cls":"terrains","id":"T331"}, - "332": {"cls":"terrains","id":"T332"}, - "333": {"cls":"terrains","id":"T333"}, - "334": {"cls":"terrains","id":"T334"}, - "335": {"cls":"terrains","id":"T335"}, - "336": {"cls":"terrains","id":"T336"}, - "337": {"cls":"terrains","id":"T337"}, - "338": {"cls":"terrains","id":"T338"}, - "339": {"cls":"terrains","id":"T339"}, - "340": {"cls":"terrains","id":"T340"}, - "341": {"cls":"terrains","id":"T341"}, - "342": {"cls":"terrains","id":"T342"}, - "343": {"cls":"terrains","id":"T343"}, - "344": {"cls":"terrains","id":"T344"}, - "345": {"cls":"terrains","id":"T345","canPass":true}, - "346": {"cls":"terrains","id":"T346"}, - "347": {"cls":"terrains","id":"T347"}, - "348": {"cls":"terrains","id":"T348"}, - "349": {"cls":"terrains","id":"T349"}, - "350": {"cls":"terrains","id":"T350"}, - "351": {"cls":"terrains","id":"T351"}, - "352": {"cls":"terrains","id":"T352"}, - "353": {"cls":"terrains","id":"T353"}, - "354": {"cls":"terrains","id":"T354"}, - "355": {"cls":"terrains","id":"T355"}, - "356": {"cls":"terrains","id":"T356"}, - "357": {"cls":"terrains","id":"T357"}, - "358": {"cls":"terrains","id":"T358"}, - "359": {"cls":"terrains","id":"T359"}, - "360": {"cls":"terrains","id":"T360"}, - "361": {"cls":"terrains","id":"T361"}, - "362": {"cls":"terrains","id":"T362"}, - "363": {"cls":"terrains","id":"T363"}, - "364": {"cls":"terrains","id":"T364"}, - "365": {"cls":"terrains","id":"T365"}, - "376": {"cls":"terrains","id":"T376"}, - "377": {"cls":"terrains","id":"T377"}, - "378": {"cls":"terrains","id":"T378"}, - "379": {"cls":"terrains","id":"T379"}, - "380": {"cls":"terrains","id":"T380"}, - "381": {"cls":"terrains","id":"T381"}, - "382": {"cls":"terrains","id":"T382"}, - "383": {"cls":"terrains","id":"T383"}, - "384": {"cls":"terrains","id":"T384"}, - "385": {"cls":"terrains","id":"T385"}, - "386": {"cls":"terrains","id":"T386"}, - "387": {"cls":"terrains","id":"T387"}, - "388": {"cls":"terrains","id":"T388"}, - "389": {"cls":"terrains","id":"T389"}, - "390": {"cls":"terrains","id":"T390"}, - "391": {"cls":"terrains","id":"T391"}, - "392": {"cls":"terrains","id":"T392"}, - "393": {"cls":"terrains","id":"T393"}, - "394": {"cls":"terrains","id":"T394"}, - "395": {"cls":"terrains","id":"T395"}, - "20034": {"cls":"tileset","id":"X20034","canPass":true}, - "20154": {"cls":"tileset","id":"X20154","canPass":true}, - "20216": {"cls":"tileset","id":"X20216","canPass":true}, - "20217": {"cls":"tileset","id":"X20217","canPass":true}, - "40054": {"cls":"tileset","id":"X40054","canPass":false}, - "40090": {"cls":"tileset","id":"X40090","canPass":true}, - "50054": {"cls":"tileset","id":"X50054","canPass":false}, - "70505": {"cls":"tileset","id":"X70505","canPass":true}, - "71182": {"cls":"tileset","id":"X71182","canPass":false}, - "71183": {"cls":"tileset","id":"X71183","canPass":false}, - "71229": {"cls":"tileset","id":"X71229","canPass":true}, - "71818": {"cls":"tileset","id":"X71818","canPass":true}, - "71887": {"cls":"tileset","id":"X71887","canPass":true}, - "80003": {"cls":"tileset","id":"X80003","canPass":true}, - "80007": {"cls":"tileset","id":"X80007","canPass":true}, - "80010": {"cls":"tileset","id":"X80010","canPass":true}, - "80011": {"cls":"tileset","id":"X80011","canPass":true}, - "80020": {"cls":"tileset","id":"X80020","canPass":true}, - "90226": {"cls":"tileset","id":"X90226","canPass":false} -} \ No newline at end of file +var maps_90f36752_8815_4be8_b32b_d7fad1d0542e = { + 1: { + cls: "animates", + id: "yellowWall", + canBreak: true, + animate: 1, + doorInfo: { + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: {}, + }, + }, + 2: { + cls: "animates", + id: "whiteWall", + canBreak: true, + animate: 1, + doorInfo: { + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: {}, + }, + }, + 3: { + cls: "animates", + id: "blueWall", + canBreak: true, + animate: 1, + doorInfo: { + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: {}, + }, + }, + 4: { cls: "animates", id: "star", name: "星空" }, + 5: { cls: "animates", id: "lava", name: "岩浆" }, + 6: { + cls: "animates", + id: "ice", + doorInfo: { + time: 160, + openSound: "破冰镐", + closeSound: "door.opus", + keys: { icePickaxe: 1 }, + }, + animate: 1, + }, + 7: { cls: "terrains", id: "blueShopLeft" }, + 8: { cls: "terrains", id: "blueShopRight" }, + 9: { cls: "terrains", id: "pinkShopLeft" }, + 10: { cls: "terrains", id: "pinkShopRight" }, + 11: { + cls: "animates", + id: "lavaNet", + canPass: true, + trigger: "null", + script: + "(function () {\n\t// 血网的伤害效果移动到 checkBlock 中处理\n\n\t// 如果要做一次性血网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})();", + name: "血网", + }, + 12: { + cls: "animates", + id: "poisonNet", + canPass: true, + trigger: "null", + script: + "(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'poison');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性毒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()", + name: "毒网", + }, + 13: { + cls: "animates", + id: "weakNet", + canPass: true, + trigger: "null", + script: + "(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'weak');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性衰网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()", + name: "衰网", + }, + 14: { + cls: "animates", + id: "curseNet", + canPass: true, + trigger: "null", + script: + "(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'curse');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性咒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()", + name: "咒网", + }, + 15: { cls: "animates", id: "blueLava" }, + 16: { cls: "animates", id: "water" }, + 20: { cls: "autotile", id: "autotile" }, + 21: { cls: "items", id: "yellowKey" }, + 22: { cls: "items", id: "blueKey" }, + 23: { cls: "items", id: "redKey" }, + 24: { cls: "items", id: "greenKey" }, + 25: { cls: "items", id: "steelKey" }, + 26: { cls: "items", id: "bigKey" }, + 27: { cls: "items", id: "redGem" }, + 28: { cls: "items", id: "blueGem" }, + 29: { cls: "items", id: "greenGem" }, + 30: { cls: "items", id: "yellowGem" }, + 31: { cls: "items", id: "redPotion" }, + 32: { cls: "items", id: "bluePotion" }, + 33: { cls: "items", id: "greenPotion" }, + 34: { cls: "items", id: "yellowPotion" }, + 35: { cls: "items", id: "sword1" }, + 36: { cls: "items", id: "shield1" }, + 37: { cls: "items", id: "sword2" }, + 38: { cls: "items", id: "shield2" }, + 39: { cls: "items", id: "sword3" }, + 40: { cls: "items", id: "shield3" }, + 41: { cls: "items", id: "sword4" }, + 42: { cls: "items", id: "shield4" }, + 43: { cls: "items", id: "sword5" }, + 44: { cls: "items", id: "shield5" }, + 45: { cls: "items", id: "book" }, + 46: { cls: "items", id: "fly" }, + 47: { cls: "items", id: "pickaxe" }, + 48: { cls: "items", id: "icePickaxe" }, + 49: { cls: "items", id: "bomb" }, + 50: { cls: "items", id: "centerFly" }, + 51: { cls: "items", id: "upFly" }, + 52: { cls: "items", id: "downFly" }, + 53: { cls: "items", id: "coin" }, + 54: { cls: "items", id: "freezeBadge" }, + 55: { cls: "items", id: "cross" }, + 56: { cls: "items", id: "superPotion" }, + 57: { cls: "items", id: "earthquake" }, + 58: { cls: "items", id: "poisonWine" }, + 59: { cls: "items", id: "weakWine" }, + 60: { cls: "items", id: "curseWine" }, + 61: { cls: "items", id: "superWine" }, + 62: { cls: "items", id: "dagger" }, + 63: { cls: "items", id: "pack" }, + 64: { cls: "items", id: "amulet" }, + 65: { cls: "items", id: "hammer" }, + 68: { cls: "items", id: "lifeWand" }, + 69: { cls: "items", id: "jumpShoes" }, + 70: { cls: "items", id: "sword0" }, + 71: { cls: "items", id: "shield0" }, + 72: { cls: "items", id: "skill1" }, + 73: { cls: "items", id: "wand" }, + 81: { + cls: "animates", + id: "yellowDoor", + trigger: "openDoor", + animate: 1, + doorInfo: { + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: { yellowKey: 1 }, + }, + name: "黄门", + }, + 82: { + cls: "animates", + id: "blueDoor", + trigger: "openDoor", + animate: 1, + doorInfo: { + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: { blueKey: 1 }, + }, + name: "蓝门", + }, + 83: { + cls: "animates", + id: "redDoor", + trigger: "openDoor", + animate: 1, + doorInfo: { + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: { redKey: 1 }, + }, + name: "红门", + }, + 84: { + cls: "animates", + id: "greenDoor", + trigger: "openDoor", + animate: 1, + doorInfo: { + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: { greenKey: 1 }, + }, + name: "绿门", + }, + 85: { + cls: "animates", + id: "specialDoor", + trigger: "openDoor", + animate: 1, + doorInfo: { + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: { specialKey: 1 }, + }, + name: "机关门", + }, + 86: { + cls: "animates", + id: "steelDoor", + trigger: "openDoor", + animate: 1, + doorInfo: { + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: { steelKey: 1 }, + }, + name: "铁门", + }, + 87: { cls: "terrains", id: "upFloor", canPass: true }, + 88: { cls: "terrains", id: "downFloor", canPass: true }, + 89: { cls: "animates", id: "portal", canPass: true }, + 90: { cls: "animates", id: "starPortal", canPass: true }, + 91: { cls: "animates", id: "upPortal", canPass: true }, + 92: { cls: "animates", id: "leftPortal", canPass: true }, + 93: { cls: "animates", id: "downPortal", canPass: true }, + 94: { cls: "animates", id: "rightPortal", canPass: true }, + 101: { cls: "animates", id: "crystalUp" }, + 102: { cls: "animates", id: "crystalBottom" }, + 103: { cls: "animates", id: "fire" }, + 104: { cls: "animates", id: "switch" }, + 109: { + cls: "animates", + id: "magentaWall", + canBreak: true, + animate: 1, + doorInfo: { + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: {}, + }, + }, + 121: { cls: "npcs", id: "man" }, + 122: { cls: "npcs", id: "trader" }, + 123: { cls: "npcs", id: "thief" }, + 124: { cls: "npcs", id: "fairy" }, + 125: { cls: "npcs", id: "wizard" }, + 126: { cls: "npcs", id: "recluse" }, + 127: { cls: "npcs", id: "king" }, + 128: { cls: "npcs", id: "youngMan" }, + 129: { cls: "npcs", id: "sign" }, + 130: { cls: "npcs", id: "expShop" }, + 131: { cls: "npcs", id: "moneyShop" }, + 132: { cls: "npcs", id: "princess" }, + 133: { + cls: "npc48", + id: "npc0", + faceIds: { down: "npc0", left: "npc1", right: "npc2", up: "npc3" }, + animate: 1, + }, + 134: { + cls: "npc48", + id: "npc1", + faceIds: { down: "npc0", left: "npc1", right: "npc2", up: "npc3" }, + animate: 1, + }, + 135: { + cls: "npc48", + id: "npc2", + faceIds: { down: "npc0", left: "npc1", right: "npc2", up: "npc3" }, + animate: 1, + }, + 136: { + cls: "npc48", + id: "npc3", + faceIds: { down: "npc0", left: "npc1", right: "npc2", up: "npc3" }, + animate: 1, + }, + 137: { cls: "npcs", id: "greenMan" }, + 138: { cls: "npcs", id: "blueTrader" }, + 140: { cls: "autotile", id: "autotile4" }, + 141: { cls: "autotile", id: "autotile8" }, + 142: { cls: "autotile", id: "autotile9" }, + 143: { cls: "autotile", id: "autotile10" }, + 144: { cls: "autotile", id: "autotile12" }, + 151: { cls: "autotile", id: "autotile1" }, + 152: { cls: "autotile", id: "autotile2" }, + 153: { cls: "autotile", id: "autotile3" }, + 161: { + cls: "terrains", + id: "arrowUp", + canPass: true, + cannotOut: ["left", "right", "down"], + cannotIn: ["up"], + }, + 162: { + cls: "terrains", + id: "arrowDown", + canPass: true, + cannotOut: ["left", "right", "up"], + cannotIn: ["down"], + }, + 163: { + cls: "terrains", + id: "arrowLeft", + canPass: true, + cannotOut: ["up", "down", "right"], + cannotIn: ["left"], + }, + 164: { + cls: "terrains", + id: "arrowRight", + canPass: true, + cannotOut: ["up", "down", "left"], + cannotIn: ["right"], + }, + 165: { + cls: "terrains", + id: "light", + trigger: "null", + canPass: true, + script: + "(function () {\n\tcore.setBlock(core.getNumberById('darkLight'), core.getHeroLoc('x'), core.getHeroLoc('y'));\n})();", + }, + 166: { cls: "terrains", id: "darkLight" }, + 167: { cls: "terrains", id: "ski", trigger: "ski", canPass: true }, + 168: { cls: "terrains", id: "flower", canPass: true }, + 169: { cls: "terrains", id: "box", trigger: "pushBox" }, + 170: { cls: "terrains", id: "boxed", trigger: "pushBox" }, + 201: { cls: "enemys", id: "greenSlime" }, + 202: { cls: "enemys", id: "redSlime" }, + 203: { cls: "enemys", id: "blackSlime" }, + 204: { cls: "enemys", id: "slimelord" }, + 205: { cls: "enemys", id: "bat" }, + 206: { cls: "enemys", id: "bigBat" }, + 207: { cls: "enemys", id: "redBat" }, + 208: { cls: "enemys", id: "vampire" }, + 209: { cls: "enemys", id: "skeleton" }, + 210: { cls: "enemys", id: "skeletonWarrior" }, + 211: { cls: "enemys", id: "skeletonCaptain" }, + 212: { cls: "enemys", id: "ghostSoldier" }, + 213: { cls: "enemys", id: "zombie" }, + 214: { cls: "enemys", id: "zombieKnight" }, + 215: { cls: "enemys", id: "rock" }, + 216: { cls: "enemys", id: "slimeman" }, + 217: { cls: "enemys", id: "bluePriest" }, + 218: { cls: "enemys", id: "redPriest" }, + 219: { cls: "enemys", id: "brownWizard" }, + 220: { cls: "enemys", id: "redWizard" }, + 221: { cls: "enemys", id: "yellowGateKeeper" }, + 222: { cls: "enemys", id: "blueGateKeeper" }, + 223: { cls: "enemys", id: "redGateKeeper" }, + 224: { cls: "enemys", id: "swordsman" }, + 225: { cls: "enemys", id: "soldier" }, + 226: { cls: "enemys", id: "yellowKnight" }, + 227: { cls: "enemys", id: "redKnight" }, + 228: { cls: "enemys", id: "darkKnight" }, + 229: { cls: "enemys", id: "blackKing" }, + 230: { cls: "enemys", id: "yellowKing" }, + 231: { cls: "enemys", id: "greenKing" }, + 232: { cls: "enemys", id: "blueKnight" }, + 233: { cls: "enemys", id: "goldSlime" }, + 234: { cls: "enemys", id: "poisonSkeleton" }, + 235: { cls: "enemys", id: "poisonBat" }, + 236: { cls: "enemys", id: "ironRock" }, + 237: { cls: "enemys", id: "skeletonPriest" }, + 238: { cls: "enemys", id: "skeletonKing" }, + 239: { cls: "enemys", id: "skeletonPresbyter" }, + 240: { cls: "enemys", id: "skeletonKnight" }, + 241: { cls: "enemys", id: "evilHero" }, + 242: { cls: "enemys", id: "devilWarrior" }, + 243: { cls: "enemys", id: "demonPriest" }, + 244: { cls: "enemys", id: "goldHornSlime" }, + 245: { cls: "enemys", id: "redKing" }, + 246: { cls: "enemys", id: "blueKing" }, + 247: { cls: "enemys", id: "magicMaster" }, + 248: { cls: "enemys", id: "silverSlime" }, + 249: { cls: "enemys", id: "blademaster" }, + 250: { cls: "enemys", id: "whiteHornSlime" }, + 251: { cls: "enemys", id: "evilPrincess" }, + 252: { cls: "enemys", id: "evilFairy" }, + 253: { cls: "enemys", id: "yellowPriest" }, + 254: { cls: "enemys", id: "redSwordsman" }, + 255: { cls: "enemys", id: "whiteSlimeman" }, + 256: { cls: "enemys", id: "poisonZombie" }, + 257: { cls: "enemys", id: "dragon" }, + 258: { cls: "enemys", id: "octopus" }, + 259: { cls: "enemys", id: "fairyEnemy" }, + 260: { cls: "enemys", id: "princessEnemy" }, + 261: { cls: "enemy48", id: "angel" }, + 262: { cls: "enemy48", id: "elemental" }, + 263: { cls: "enemy48", id: "steelGuard" }, + 264: { cls: "enemy48", id: "evilBat" }, + 265: { cls: "enemys", id: "silverSlimelord" }, + 266: { cls: "enemys", id: "goldSlimelord" }, + 267: { cls: "enemys", id: "grayRock" }, + 270: { cls: "enemys", id: "greenKnight" }, + 271: { cls: "enemys", id: "bowman" }, + 272: { cls: "enemys", id: "purpleBowman" }, + 275: { cls: "enemys", id: "watcherSlime" }, + 277: { cls: "enemys", id: "frostBat" }, + 278: { cls: "enemys", id: "devilKnight" }, + 279: { cls: "enemys", id: "grayPriest" }, + 280: { cls: "enemys", id: "greenGateKeeper" }, + 300: { cls: "terrains", id: "ground" }, + 301: { + cls: "terrains", + id: "sWallT", + name: "薄墙-上", + cannotOut: ["up"], + cannotIn: ["up"], + }, + 302: { + cls: "terrains", + id: "sWallL", + name: "薄墙-左", + cannotOut: ["left"], + cannotIn: ["left"], + }, + 303: { + cls: "terrains", + id: "sWallR", + name: "薄墙-右", + cannotOut: ["right"], + cannotIn: ["right"], + }, + 304: { + cls: "terrains", + id: "sWallB", + name: "薄墙-下", + cannotOut: ["down"], + cannotIn: ["down"], + }, + 305: { cls: "terrains", id: "grass" }, + 306: { + cls: "terrains", + id: "sWallTL", + name: "薄墙-上左", + cannotOut: ["up", "left"], + cannotIn: ["up", "left"], + }, + 307: { + cls: "terrains", + id: "sWallBR", + name: "薄墙-下右", + cannotOut: ["down", "right"], + cannotIn: ["down", "right"], + }, + 308: { cls: "terrains", id: "grass2" }, + 309: { + cls: "terrains", + id: "sWallTR", + name: "薄墙-上右", + cannotOut: ["up", "right"], + cannotIn: ["up", "right"], + }, + 310: { + cls: "terrains", + id: "sWallBL", + name: "薄墙-下左", + cannotOut: ["down", "left"], + cannotIn: ["down", "left"], + }, + 311: { cls: "terrains", id: "ground2" }, + 312: { + cls: "terrains", + id: "sWallTB", + name: "薄墙-上下", + cannotOut: ["up", "down"], + cannotIn: ["up", "down"], + }, + 313: { cls: "terrains", id: "ground3" }, + 314: { + cls: "terrains", + id: "sWallLR", + name: "薄墙-左右", + cannotOut: ["left", "right"], + cannotIn: ["left", "right"], + }, + 315: { + cls: "terrains", + id: "sWallBLR", + name: "薄墙-下左右", + cannotOut: ["down", "left", "right"], + cannotIn: ["down", "left", "right"], + }, + 316: { + cls: "terrains", + id: "sWallTLR", + name: "薄墙-上左右", + cannotOut: ["up", "left", "right"], + cannotIn: ["up", "left", "right"], + }, + 317: { + cls: "terrains", + id: "sWallTBR", + name: "薄墙-上下右", + cannotOut: ["up", "down", "right"], + cannotIn: ["up", "down", "right"], + }, + 318: { + cls: "terrains", + id: "sWallTBL", + name: "薄墙-上下左", + cannotOut: ["up", "down", "left"], + cannotIn: ["up", "down", "left"], + }, + 319: { + cls: "npc48", + id: "tallYellowDoor", + trigger: "openDoor", + name: "高黄门", + animate: 1, + doorInfo: { + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: { yellowKey: 1 }, + }, + }, + 320: { + cls: "npc48", + id: "tallBlueDoor", + trigger: "openDoor", + name: "高蓝门", + animate: 1, + doorInfo: { + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: { blueKey: 1 }, + }, + }, + 321: { + cls: "npc48", + id: "tallRedDoor", + trigger: "openDoor", + name: "高红门", + animate: 1, + doorInfo: { + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: { redKey: 1 }, + }, + }, + 322: { + cls: "npc48", + id: "tallGreenDoor", + trigger: "openDoor", + name: "高绿门", + animate: 1, + doorInfo: { + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: { greenKey: 1 }, + }, + }, + 323: { + cls: "npc48", + id: "tallSpecialDoor", + trigger: "openDoor", + name: "高机关门", + animate: 1, + doorInfo: { + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: { specialKey: 1 }, + }, + }, + 324: { + cls: "npc48", + id: "tallSteelDoor", + trigger: "openDoor", + name: "高铁门", + animate: 1, + doorInfo: { + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: { steelKey: 1 }, + }, + }, + 325: { cls: "enemys", id: "keiskeiFairy" }, + 326: { cls: "enemys", id: "tulipFairy" }, + 327: { cls: "enemy48", id: "bearDown" }, + 328: { cls: "enemy48", id: "bearLeft" }, + 329: { cls: "enemy48", id: "bearRight" }, + 330: { cls: "enemy48", id: "bearUp" }, + 331: { cls: "terrains", id: "T331" }, + 332: { cls: "terrains", id: "T332" }, + 333: { cls: "terrains", id: "T333" }, + 334: { cls: "terrains", id: "T334" }, + 335: { cls: "terrains", id: "T335" }, + 336: { cls: "terrains", id: "T336" }, + 337: { cls: "terrains", id: "T337" }, + 338: { cls: "terrains", id: "T338" }, + 339: { cls: "terrains", id: "T339" }, + 340: { cls: "terrains", id: "T340" }, + 341: { cls: "terrains", id: "T341" }, + 342: { cls: "terrains", id: "T342" }, + 343: { cls: "terrains", id: "T343" }, + 344: { cls: "terrains", id: "T344" }, + 345: { cls: "terrains", id: "T345", canPass: true }, + 346: { cls: "terrains", id: "T346" }, + 347: { cls: "terrains", id: "T347" }, + 348: { cls: "terrains", id: "T348" }, + 349: { cls: "terrains", id: "T349" }, + 350: { cls: "terrains", id: "T350" }, + 351: { cls: "terrains", id: "T351" }, + 352: { cls: "terrains", id: "T352" }, + 353: { cls: "terrains", id: "T353" }, + 354: { cls: "terrains", id: "T354" }, + 355: { cls: "terrains", id: "T355" }, + 356: { cls: "terrains", id: "T356" }, + 357: { cls: "terrains", id: "T357" }, + 358: { cls: "terrains", id: "T358" }, + 359: { cls: "terrains", id: "T359" }, + 360: { cls: "terrains", id: "T360" }, + 361: { cls: "terrains", id: "T361" }, + 362: { cls: "terrains", id: "T362" }, + 363: { cls: "terrains", id: "T363" }, + 364: { cls: "terrains", id: "T364" }, + 365: { cls: "terrains", id: "T365" }, + 376: { cls: "terrains", id: "T376" }, + 377: { cls: "terrains", id: "T377" }, + 378: { cls: "terrains", id: "T378" }, + 379: { cls: "terrains", id: "T379" }, + 380: { cls: "terrains", id: "T380" }, + 381: { cls: "terrains", id: "T381" }, + 382: { cls: "terrains", id: "T382" }, + 383: { cls: "terrains", id: "T383" }, + 384: { cls: "terrains", id: "T384" }, + 385: { cls: "terrains", id: "T385" }, + 386: { cls: "terrains", id: "T386" }, + 387: { cls: "terrains", id: "T387" }, + 388: { cls: "terrains", id: "T388" }, + 389: { cls: "terrains", id: "T389" }, + 390: { cls: "terrains", id: "T390" }, + 391: { cls: "terrains", id: "T391" }, + 392: { cls: "terrains", id: "T392" }, + 393: { cls: "terrains", id: "T393" }, + 394: { cls: "terrains", id: "T394" }, + 395: { cls: "terrains", id: "T395" }, + 20034: { cls: "tileset", id: "X20034", canPass: true }, + 20154: { cls: "tileset", id: "X20154", canPass: true }, + 20216: { cls: "tileset", id: "X20216", canPass: true }, + 20217: { cls: "tileset", id: "X20217", canPass: true }, + 40054: { cls: "tileset", id: "X40054", canPass: false }, + 40090: { cls: "tileset", id: "X40090", canPass: true }, + 50054: { cls: "tileset", id: "X50054", canPass: false }, + 70505: { cls: "tileset", id: "X70505", canPass: true }, + 71182: { cls: "tileset", id: "X71182", canPass: false }, + 71183: { cls: "tileset", id: "X71183", canPass: false }, + 71229: { cls: "tileset", id: "X71229", canPass: true }, + 71818: { cls: "tileset", id: "X71818", canPass: true }, + 71887: { cls: "tileset", id: "X71887", canPass: true }, + 80003: { cls: "tileset", id: "X80003", canPass: true }, + 80007: { cls: "tileset", id: "X80007", canPass: true }, + 80010: { cls: "tileset", id: "X80010", canPass: true }, + 80011: { cls: "tileset", id: "X80011", canPass: true }, + 80020: { cls: "tileset", id: "X80020", canPass: true }, + 90226: { cls: "tileset", id: "X90226", canPass: false }, +}; diff --git a/project/plugins.js b/project/plugins.js index 641697a..9d0ecff 100644 --- a/project/plugins.js +++ b/project/plugins.js @@ -1,264 +1,262 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = { "init": function () { - this._afterLoadResources = function () { - // 本函数将在所有资源加载完毕后,游戏开启前被执行 - core.ui.statusBar.init(); - core.dom.playGame.style.fontFamily = "pala"; - core.dom.loadGame.style.fontFamily = "pala"; - core.dom.CGMode.style.fontFamily = "pala"; - core.dom.musicMode.style.fontFamily = "pala"; - core.dom.replayGame.style.fontFamily = "pala"; - core.registerEvent("changeMouse", function (data) { - if (!main.replayChecking && !core.isReplaying()) - core.changeMouse( - data.icon, - data.div, - data.translate[0], - data.translate[1], - data.scale[0], - data.scale[1], - data.angel, - data.px, - data.py - ); - core.doAction(); - }); - core.registerEvent("removeMouse", function (data) { - if (!main.replayChecking && !core.isReplaying()) - core.removeMouse(data.div); - core.doAction(); - }); - core.registerEvent("addPop", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - data.value = core.replaceText(data.value); - core.addPop( - data.value, - data.px, - data.py, - data.color, - data.boldColor, - data.left, - data.jump, - data.time, - data.show, - data.font, - data.speed - ); - } - core.doAction(); - }); - core.registerEvent("drawWarning", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - data.text = core.replaceText(data.text); - data.text2 = core.replaceText(data.text2); - core.drawWarning( - data.x, - data.y, - data?.text, - data?.text2, - data?.warning, - data.large, - data.size - ); + this._afterLoadResources = function () { + // 本函数将在所有资源加载完毕后,游戏开启前被执行 + core.ui.statusBar.init(); + core.dom.playGame.style.fontFamily = "pala"; + core.dom.loadGame.style.fontFamily = "pala"; + core.dom.CGMode.style.fontFamily = "pala"; + core.dom.musicMode.style.fontFamily = "pala"; + core.dom.replayGame.style.fontFamily = "pala"; + core.registerEvent("changeMouse", function (data) { + if (!main.replayChecking && !core.isReplaying()) + core.changeMouse( + data.icon, + data.div, + data.translate[0], + data.translate[1], + data.scale[0], + data.scale[1], + data.angel, + data.px, + data.py + ); + core.doAction(); + }); + core.registerEvent("removeMouse", function (data) { + if (!main.replayChecking && !core.isReplaying()) + core.removeMouse(data.div); + core.doAction(); + }); + core.registerEvent("addPop", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + data.value = core.replaceText(data.value); + core.addPop( + data.value, + data.px, + data.py, + data.color, + data.boldColor, + data.left, + data.jump, + data.time, + data.show, + data.font, + data.speed + ); + } + core.doAction(); + }); + core.registerEvent("drawWarning", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + data.text = core.replaceText(data.text); + data.text2 = core.replaceText(data.text2); + core.drawWarning( + data.x, + data.y, + data?.text, + data?.text2, + data?.warning, + data.large, + data.size + ); - setTimeout(() => core.doAction(), 3100); - } else { - core.doAction(); - } - }); + setTimeout(() => core.doAction(), 3100); + } else { + core.doAction(); + } + }); - core.registerEvent("over", function (data) { - let image = data.image ?? ""; - let time = data.time ?? 3000; - let sound = data.sound ?? ""; - let textColor = data.textColor ?? "#FFFFFF"; - let boldColor = data.boldColor ?? "#000000"; - let font = data.font ?? "bold 48px Verdana"; - let text = data.text ?? ""; - let hidetime = data.hidetime ?? 100; - if (!main.replayChecking && !core.isReplaying()) { - core.over( - image, - data.memory, - time, - hidetime, - sound, - textColor, - boldColor, - font, - text - ); - } else { - core.doAction(); - } - }); - core.registerEvent("changebg", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.changebg( - data.img1, - data.memory1, - data.img2, - data.memory2, - data.time, - data.style - ); - } else { - core.doAction(); - } - }); - core.registerEvent("overlist", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.overlist( - data.image, - data.memory, - data.hidetime || 30, - data.list || [ - { - text: "", - sound: "", - time: 50, - textColor: "#FFFFFF", - boldColor: "#000000", - font: "bold 48px Verdana", - frame: 0, - }, - ] - ); - } else { - core.doAction(); - } - }); - core.registerEvent("op", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.openvideo(); - } else { - core.doAction(); - } - }); - core.registerEvent("animationDrawable", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.animationDrawable( - data.allFarme, - data.color, - data.globalAlpha, - data.imageList, - data.soundList - ); - } else { - core.doAction(); - } - }); - core.registerEvent("setanimate", function (data) { - data.px = data.px ?? 0; - data.py = data.py ?? 0; - core.setanimate( - data.name, - data.px, - data.py, - data.width, - data.height, - data.allFarme, - data.imageList, - data.soundList - ); - core.doAction(); - }); - core.registerEvent("clearanimate", function (data) { - core.plugin.playing.clear(); + core.registerEvent("over", function (data) { + let image = data.image ?? ""; + let time = data.time ?? 3000; + let sound = data.sound ?? ""; + let textColor = data.textColor ?? "#FFFFFF"; + let boldColor = data.boldColor ?? "#000000"; + let font = data.font ?? "bold 48px Verdana"; + let text = data.text ?? ""; + let hidetime = data.hidetime ?? 100; + if (!main.replayChecking && !core.isReplaying()) { + core.over( + image, + data.memory, + time, + hidetime, + sound, + textColor, + boldColor, + font, + text + ); + } else { + core.doAction(); + } + }); + core.registerEvent("changebg", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.changebg( + data.img1, + data.memory1, + data.img2, + data.memory2, + data.time, + data.style + ); + } else { + core.doAction(); + } + }); + core.registerEvent("overlist", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.overlist( + data.image, + data.memory, + data.hidetime || 30, + data.list || [{ + text: "", + sound: "", + time: 50, + textColor: "#FFFFFF", + boldColor: "#000000", + font: "bold 48px Verdana", + frame: 0, + }, ] + ); + } else { + core.doAction(); + } + }); + core.registerEvent("op", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.openvideo(); + } else { + core.doAction(); + } + }); + core.registerEvent("animationDrawable", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.animationDrawable( + data.allFarme, + data.color, + data.globalAlpha, + data.imageList, + data.soundList + ); + } else { + core.doAction(); + } + }); + core.registerEvent("setanimate", function (data) { + data.px = data.px ?? 0; + data.py = data.py ?? 0; + core.setanimate( + data.name, + data.px, + data.py, + data.width, + data.height, + data.allFarme, + data.imageList, + data.soundList + ); + core.doAction(); + }); + core.registerEvent("clearanimate", function (data) { + core.plugin.playing.clear(); - core.doAction(); - }); - core.registerEvent("deleteanimate", function (data) { - core.deleteanimate(data.name); - core.doAction(); - }); - core.registerEvent("playanimate", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - data.x = data.x ?? 0; - data.y = data.y ?? 0; - data.scalex = data.scalex ?? 1; - data.scaley = data.scaley ?? 1; - core.playanimate( - data.name, - data.x, - data.y, - data.hero, - data.scalex, - data.scaley - ); - core.doAction(); - } else { - core.doAction(); - } - }); - core.registerEvent("cgtextList", function (data) { - core.ui.cgText.textList = core.plugin[data.textList]; - core.doAction(); - }); - core.registerEvent("cgtext", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.ui.cgText.image = data.bg; - core.ui.cgText.memory = data.memory; - core.ui.cgText.head = core.clone(data.head); - core.ui.cgText.index = data.index; - core.ui.cgText.name = core.ui.cgText.textList[data.index][0]; - core.ui.cgText.text = data.text - ? data.text - : core.ui.cgText.textList[data.index][1]; - core.ui.cgText.time = data.time; - core.ui.cgText.wait = data.wait; - core.ui.cgText.WindowSkin = data.WindowSkin; - core.ui.cgText.sound = data.sound || ""; - core.ui.cgText.bodyList = core.clone(data.bodyList); - main.dom.cgText.style.display = "block"; - core.ui.cgText.update(); - } else { - core.doAction(); - } - }); - core.registerEvent("introAndLoop", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.plugin.introAndLoop(data.intro, data.time, data.loop); - core.doAction(); - } else { - core.doAction(); - } - }); - core.registerEvent("setq", function (data) { - core.setFlag("任务地点", data.id); + core.doAction(); + }); + core.registerEvent("deleteanimate", function (data) { + core.deleteanimate(data.name); + core.doAction(); + }); + core.registerEvent("playanimate", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + data.x = data.x ?? 0; + data.y = data.y ?? 0; + data.scalex = data.scalex ?? 1; + data.scaley = data.scaley ?? 1; + core.playanimate( + data.name, + data.x, + data.y, + data.hero, + data.scalex, + data.scaley + ); + core.doAction(); + } else { + core.doAction(); + } + }); + core.registerEvent("cgtextList", function (data) { + core.ui.cgText.textList = core.plugin[data.textList]; + core.doAction(); + }); + core.registerEvent("cgtext", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.ui.cgText.image = data.bg; + core.ui.cgText.memory = data.memory; + core.ui.cgText.head = core.clone(data.head); + core.ui.cgText.index = data.index; + core.ui.cgText.name = core.ui.cgText.textList[data.index][0]; + core.ui.cgText.text = data.text ? + data.text : + core.ui.cgText.textList[data.index][1]; + core.ui.cgText.time = data.time; + core.ui.cgText.wait = data.wait; + core.ui.cgText.WindowSkin = data.WindowSkin; + core.ui.cgText.sound = data.sound || ""; + core.ui.cgText.bodyList = core.clone(data.bodyList); + main.dom.cgText.style.display = "block"; + core.ui.cgText.update(); + } else { + core.doAction(); + } + }); + core.registerEvent("introAndLoop", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.plugin.introAndLoop(data.intro, data.time, data.loop); + core.doAction(); + } else { + core.doAction(); + } + }); + core.registerEvent("setq", function (data) { + core.setFlag("任务地点", data.id); - core.doAction(); - }); + core.doAction(); + }); - core.registerEvent("setmusics", function (data) { - if ( - (core.getLocalStorage("musics") && - core.getLocalStorage("musics").length === 0) || - !core.getLocalStorage("musics") - ) - core.setLocalStorage("musics", ["theme.mp3"]); - let a = core.getLocalStorage("musics"); - if (!data.bgm) { - core.setLocalStorage("musics", ["theme.mp3"]); - } else { - if (!a.includes(data.bgm)) a.push(data.bgm); - core.setLocalStorage("musics", a); - } - core.doAction(); - }); - core.registerEvent("setcgs", function (data) { - if (!data.img) { - core.setLocalStorage("cgs", []); - } else { - let a = core.getLocalStorage("cgs") ?? []; - if (!a.includes(data.img)) a.push(data.img); - core.setLocalStorage("cgs", a); - } - core.doAction(); - }); - }; - }, + core.registerEvent("setmusics", function (data) { + if ( + (core.getLocalStorage("musics") && + core.getLocalStorage("musics").length === 0) || + !core.getLocalStorage("musics") + ) + core.setLocalStorage("musics", ["theme.mp3"]); + let a = core.getLocalStorage("musics"); + if (!data.bgm) { + core.setLocalStorage("musics", ["theme.mp3"]); + } else { + if (!a.includes(data.bgm)) a.push(data.bgm); + core.setLocalStorage("musics", a); + } + core.doAction(); + }); + core.registerEvent("setcgs", function (data) { + if (!data.img) { + core.setLocalStorage("cgs", []); + } else { + let a = core.getLocalStorage("cgs") ?? []; + if (!a.includes(data.img)) a.push(data.img); + core.setLocalStorage("cgs", a); + } + core.doAction(); + }); + }; +}, "drawLight": function () { // 绘制灯光/漆黑层效果。调用方式 core.plugin.drawLight(...) // 【参数说明】 @@ -2522,1218 +2520,1216 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = })(); }, "statusBar": function () { - main.dom.floorMsgGroup.style.display = "none"; - main.dom.statusBar.style.display = "none"; - main.dom.toolBar.style.display = "none"; - //所有数据*3是为了实现高清画布 - const GAMEVIEW_WIDTH = 676 * 3; //横屏画面宽度 - const GAMEVIEW_HEIGHT = 416 * 3; //横屏画面高度 + main.dom.floorMsgGroup.style.display = "none"; + main.dom.statusBar.style.display = "none"; + main.dom.toolBar.style.display = "none"; + //所有数据*3是为了实现高清画布 + const GAMEVIEW_WIDTH = 676 * 3; //横屏画面宽度 + const GAMEVIEW_HEIGHT = 416 * 3; //横屏画面高度 - const GAMEVIEW_WIDTH_VERTICAL = 416 * 3; //竖屏画面宽度 - const GAMEVIEW_HEIGHT_VERTICAL = 676 * 3; //竖屏画面高度 + const GAMEVIEW_WIDTH_VERTICAL = 416 * 3; //竖屏画面宽度 + const GAMEVIEW_HEIGHT_VERTICAL = 676 * 3; //竖屏画面高度 - const BAR_WIDTH = 130 * 3; //横屏左侧额外距离(即边栏宽度) - const BAR_HEIGHT_VERTICAL = 130 * 3; //竖屏上侧额外距离(即边栏高度) - const BORDER_WIDTH = 0; //游戏画面左侧偏移距离 - const BORDER_HEIGHT = 0; //游戏画面上侧偏移距离 + const BAR_WIDTH = 130 * 3; //横屏左侧额外距离(即边栏宽度) + const BAR_HEIGHT_VERTICAL = 130 * 3; //竖屏上侧额外距离(即边栏高度) + const BORDER_WIDTH = 0; //游戏画面左侧偏移距离 + const BORDER_HEIGHT = 0; //游戏画面上侧偏移距离 - const ITEM_BOX_LEFT = 549 * 3; //横屏道具栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const ITEM_BOX_TOP = 155 * 3; //横屏道具栏上侧距离 - const ITEM_BOX_LEFT_VERTICAL = 160 * 3; //竖屏道具栏左侧距离 - const ITEM_BOX_TOP_VERTICAL = 549 * 3; //竖屏道具栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const ITEM_BOX_LEFT = 549 * 3; //横屏道具栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const ITEM_BOX_TOP = 155 * 3; //横屏道具栏上侧距离 + const ITEM_BOX_LEFT_VERTICAL = 160 * 3; //竖屏道具栏左侧距离 + const ITEM_BOX_TOP_VERTICAL = 549 * 3; //竖屏道具栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const EQUIP_BLOCK_LEFT = 549 * 3; //横屏装备栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const EQUIP_BLOCK_TOP = 10 * 3; //横屏装备栏上侧距离 - const EQUIP_BLOCK_LEFT_VERTICAL = 10 * 3; //竖屏装备栏左侧距离 - const EQUIP_BLOCK_TOP_VERTICAL = 549 * 3; //竖屏装备栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const EQUIP_BLOCK_LEFT = 549 * 3; //横屏装备栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const EQUIP_BLOCK_TOP = 10 * 3; //横屏装备栏上侧距离 + const EQUIP_BLOCK_LEFT_VERTICAL = 10 * 3; //竖屏装备栏左侧距离 + const EQUIP_BLOCK_TOP_VERTICAL = 549 * 3; //竖屏装备栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const MAP_BLOCK_LEFT = 551 * 3; //横屏小地图左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const MAP_BLOCK_TOP = 0; //横屏小地图上侧距离 - const MAP_BLOCK_LEFT_VERTICAL = 0; //竖屏小地图左侧距离 - const MAP_BLOCK_TOP_VERTICAL = 551 * 3; //竖屏小地图上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const MAP_BLOCK_LEFT = 551 * 3; //横屏小地图左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const MAP_BLOCK_TOP = 0; //横屏小地图上侧距离 + const MAP_BLOCK_LEFT_VERTICAL = 0; //竖屏小地图左侧距离 + const MAP_BLOCK_TOP_VERTICAL = 551 * 3; //竖屏小地图上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const KEY_BLOCK_LEFT = EQUIP_BLOCK_LEFT; //横屏钥匙栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const KEY_BLOCK_TOP = 110 * 3; //横屏钥匙栏上侧距离 - const KEY_BLOCK_LEFT_VERTICAL = 110 * 3; //竖屏钥匙栏左侧距离 - const KEY_BLOCK_TOP_VERTICAL = EQUIP_BLOCK_TOP_VERTICAL; //竖屏钥匙栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const KEY_BLOCK_LEFT = EQUIP_BLOCK_LEFT; //横屏钥匙栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const KEY_BLOCK_TOP = 110 * 3; //横屏钥匙栏上侧距离 + const KEY_BLOCK_LEFT_VERTICAL = 110 * 3; //竖屏钥匙栏左侧距离 + const KEY_BLOCK_TOP_VERTICAL = EQUIP_BLOCK_TOP_VERTICAL; //竖屏钥匙栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const INFO_BLOCK_LEFT = 10 * 3; //横屏道具说明左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const INFO_BLOCK_TOP = 180 * 3; //横屏道具说明上侧距离 - const INFO_BLOCK_LEFT_VERTICAL = 113 * 3; //竖屏道具说明左侧距离 - const INFO_BLOCK_TOP_VERTICAL = 8 * 3; //竖屏道具说明上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const INFO_BLOCK_LEFT = 10 * 3; //横屏道具说明左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const INFO_BLOCK_TOP = 180 * 3; //横屏道具说明上侧距离 + const INFO_BLOCK_LEFT_VERTICAL = 113 * 3; //竖屏道具说明左侧距离 + const INFO_BLOCK_TOP_VERTICAL = 8 * 3; //竖屏道具说明上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const TOOL_BOX_LEFT = EQUIP_BLOCK_LEFT; //横屏工具栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const TOOL_BOX_TOP = 348 * 3; //横屏工具栏上侧距离 - const TOOL_BOX_LEFT_VERTICAL = 348 * 3; //竖屏工具栏左侧距离 - const TOOL_BOX_TOP_VERTICAL = 549 * 3; //竖屏工具栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const TOOL_BOX_LEFT = EQUIP_BLOCK_LEFT; //横屏工具栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const TOOL_BOX_TOP = 348 * 3; //横屏工具栏上侧距离 + const TOOL_BOX_LEFT_VERTICAL = 348 * 3; //竖屏工具栏左侧距离 + const TOOL_BOX_TOP_VERTICAL = 549 * 3; //竖屏工具栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const TOOL_ICON_OUTER_SIZE = 34 * 3; + const TOOL_ICON_OUTER_SIZE = 34 * 3; - const TEXT_COLOR = "#FFFFFF"; //默认文字颜色 - const globalAlpha = 0.7; //默认底框透明度 - const FORCE_COUNTABLE_ITEMS = ["centerFly"]; //常态显示数量的非永久道具,如果道具不在此数组中,则只有道具多余1时显示数量 + const TEXT_COLOR = "#FFFFFF"; //默认文字颜色 + const globalAlpha = 0.7; //默认底框透明度 + const FORCE_COUNTABLE_ITEMS = ["centerFly"]; //常态显示数量的非永久道具,如果道具不在此数组中,则只有道具多余1时显示数量 - const outerBackground = document.createElement("canvas"); //背景画布设置 - let globalAlphafloor = 0, - globalAlphafloorStatus = 4; - outerBackground.style.position = "absolute"; - outerBackground.style.zIndex = 5; - outerBackground.id = "outerBackground"; - main.dom.outerBackground = outerBackground; - main.dom.startPanel.insertAdjacentElement("afterend", outerBackground); + const outerBackground = document.createElement("canvas"); //背景画布设置 + let globalAlphafloor = 0, + globalAlphafloorStatus = 4; + outerBackground.style.position = "absolute"; + outerBackground.style.zIndex = 5; + outerBackground.id = "outerBackground"; + main.dom.outerBackground = outerBackground; + main.dom.startPanel.insertAdjacentElement("afterend", outerBackground); - const outerUI = document.createElement("canvas"); //额外ui画布设置(状态栏所有绘制、点击都在额外ui上) - outerUI.style.position = "absolute"; - outerUI.style.zIndex = 165; - outerUI.id = "outerUI"; + const outerUI = document.createElement("canvas"); //额外ui画布设置(状态栏所有绘制、点击都在额外ui上) + outerUI.style.position = "absolute"; + outerUI.style.zIndex = 165; + outerUI.id = "outerUI"; - main.dom.outerUI = outerUI; - outerBackground.insertAdjacentElement("afterend", outerUI); - setTimeout(function () { - // Should be executed immediately after init() - main.canvas.outerUI = outerUI.getContext("2d"); - }); - outerUI.onclick = function (e) { - try { - e.preventDefault(); - if (!core.isPlaying()) return false; - 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.statusBar.onclick(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; + main.dom.outerUI = outerUI; + outerBackground.insertAdjacentElement("afterend", outerUI); + setTimeout(function () { + // Should be executed immediately after init() + main.canvas.outerUI = outerUI.getContext("2d"); + }); + outerUI.onclick = function (e) { + try { + e.preventDefault(); + if (!core.isPlaying()) return false; + 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.statusBar.onclick(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; - const _resize_gameGroup = function (obj) { - //游戏画面自适应调节 - const gameGroup = core.dom.gameGroup; - gameGroup.style.width = obj.totalWidth + "px"; - gameGroup.style.height = obj.totalHeight + "px"; - gameGroup.style.left = (obj.clientWidth - obj.totalWidth) / 2 + "px"; - gameGroup.style.top = (obj.clientHeight - obj.totalHeight) / 2 + "px"; - //floorMsgGroup为切换楼层中生效,显示时间可通过‘全塔属性’——‘切换楼层时间’或游戏内设置调整 - //显示内容为游戏名/版本号/楼层名 - // floorMsgGroup - var floorMsgGroup = core.dom.floorMsgGroup; - var globalAttribute = - core.status.globalAttribute || core.initStatus.globalAttribute; - floorMsgGroup.style = globalAttribute.floorChangingStyle; - floorMsgGroup.style.height = floorMsgGroup.style.width = - (GAMEVIEW_HEIGHT / 3) * core.domStyle.scale + "px"; - floorMsgGroup.style.fontSize = 16 * core.domStyle.scale + "px"; + const _resize_gameGroup = function (obj) { + //游戏画面自适应调节 + const gameGroup = core.dom.gameGroup; + gameGroup.style.width = obj.totalWidth + "px"; + gameGroup.style.height = obj.totalHeight + "px"; + gameGroup.style.left = (obj.clientWidth - obj.totalWidth) / 2 + "px"; + gameGroup.style.top = (obj.clientHeight - obj.totalHeight) / 2 + "px"; + //floorMsgGroup为切换楼层中生效,显示时间可通过‘全塔属性’——‘切换楼层时间’或游戏内设置调整 + //显示内容为游戏名/版本号/楼层名 + // floorMsgGroup + var floorMsgGroup = core.dom.floorMsgGroup; + var globalAttribute = + core.status.globalAttribute || core.initStatus.globalAttribute; + floorMsgGroup.style = globalAttribute.floorChangingStyle; + floorMsgGroup.style.height = floorMsgGroup.style.width = + (GAMEVIEW_HEIGHT / 3) * core.domStyle.scale + "px"; + floorMsgGroup.style.fontSize = 16 * core.domStyle.scale + "px"; - if (core.domStyle.isVertical) { - floorMsgGroup.style.left = "0px"; - floorMsgGroup.style.top = - ((GAMEVIEW_HEIGHT_VERTICAL / 3 - GAMEVIEW_WIDTH_VERTICAL / 3) * - core.domStyle.scale) / - 2 + - "px"; - } else { - floorMsgGroup.style.left = - ((GAMEVIEW_WIDTH / 3 - GAMEVIEW_HEIGHT / 3) * core.domStyle.scale) / - 2 + - "px"; - floorMsgGroup.style.top = "0px"; - } - core.dom.musicBtn.style.right = - (obj.clientWidth - obj.totalWidth) / 2 + "px"; - core.dom.musicBtn.style.bottom = - (obj.clientHeight - obj.totalHeight) / 2 - 27 + "px"; - let startBackground = core.domStyle.isVertical - ? main.styles.startVerticalBackground || main.styles.startBackground - : main.styles.startBackground; - if (main.dom.startBackground.getAttribute("__src__") != startBackground) { - main.dom.startBackground.setAttribute("__src__", startBackground); - main.dom.startBackground.src = startBackground; - } - const span = document - .getElementById("startButtons") - .getElementsByTagName("span"); - let font = (GAMEVIEW_WIDTH / 100) * core.domStyle.scale; - if (core.domStyle.isVertical) - font = ((GAMEVIEW_WIDTH_VERTICAL * 2) / 100) * core.domStyle.scale; + if (core.domStyle.isVertical) { + floorMsgGroup.style.left = "0px"; + floorMsgGroup.style.top = + ((GAMEVIEW_HEIGHT_VERTICAL / 3 - GAMEVIEW_WIDTH_VERTICAL / 3) * + core.domStyle.scale) / + 2 + + "px"; + } else { + floorMsgGroup.style.left = + ((GAMEVIEW_WIDTH / 3 - GAMEVIEW_HEIGHT / 3) * core.domStyle.scale) / + 2 + + "px"; + floorMsgGroup.style.top = "0px"; + } + core.dom.musicBtn.style.right = + (obj.clientWidth - obj.totalWidth) / 2 + "px"; + core.dom.musicBtn.style.bottom = + (obj.clientHeight - obj.totalHeight) / 2 - 27 + "px"; + let startBackground = core.domStyle.isVertical ? + main.styles.startVerticalBackground || main.styles.startBackground : + main.styles.startBackground; + if (main.dom.startBackground.getAttribute("__src__") != startBackground) { + main.dom.startBackground.setAttribute("__src__", startBackground); + main.dom.startBackground.src = startBackground; + } + const span = document + .getElementById("startButtons") + .getElementsByTagName("span"); + let font = (GAMEVIEW_WIDTH / 100) * core.domStyle.scale; + if (core.domStyle.isVertical) + font = ((GAMEVIEW_WIDTH_VERTICAL * 2) / 100) * core.domStyle.scale; - core.dom.playGame.style.fontSize = font + "px"; - core.dom.loadGame.style.fontSize = font + "px"; - core.dom.CGMode.style.fontSize = font + "px"; - core.dom.musicMode.style.fontSize = font + "px"; - core.dom.replayGame.style.fontSize = font + "px"; - core.dom.startButtonGroup.style.padding = font * 0.3 + "px 25px"; - }; - const _resize_canvas = function (obj) { - //自适应画布 - main.dom.outerBackground.style.width = obj.totalWidth + "px"; - main.dom.outerBackground.style.height = obj.totalHeight + "px"; - main.dom.outerUI.style.width = obj.totalWidth + "px"; - main.dom.outerUI.style.height = obj.totalHeight + "px"; - if (main.dom.CGUI) { - main.dom.CGUI.style.width = obj.totalWidth + 3 + "px"; - main.dom.CGUI.style.height = obj.totalHeight + 3 + "px"; - } - if (main.dom.music) { - main.dom.music.style.width = obj.totalWidth + 3 + "px"; - main.dom.music.style.height = obj.totalHeight + 3 + "px"; - } - if (main.dom.cgText) { - main.dom.cgText.style.width = obj.totalWidth + 3 + "px"; - main.dom.cgText.style.height = obj.totalHeight + 3 + "px"; - } - if (main.dom.logcanvas) { - main.dom.logcanvas.style.width = obj.totalWidth + 3 + "px"; - main.dom.logcanvas.style.height = obj.totalHeight + 3 + "px"; - } - if (main.dom.over) { - main.dom.over.style.width = obj.totalWidth + 3 + "px"; - main.dom.over.style.height = obj.totalHeight + 3 + "px"; - } - if (main.dom.video) { - main.dom.video.style.width = obj.totalWidth + 3 + "px"; - main.dom.video.style.height = obj.totalHeight + 3 + "px"; - if (core.domStyle.isVertical) - main.dom.video.style.width = obj.totalHeight + 3 + "px"; - if (core.domStyle.isVertical) - main.dom.video.style.height = obj.totalWidth + 3 + "px"; - main.dom.video.style.top = "50%"; - main.dom.video.style.left = "50%"; + core.dom.playGame.style.fontSize = font + "px"; + core.dom.loadGame.style.fontSize = font + "px"; + core.dom.CGMode.style.fontSize = font + "px"; + core.dom.musicMode.style.fontSize = font + "px"; + core.dom.replayGame.style.fontSize = font + "px"; + core.dom.startButtonGroup.style.padding = font * 0.3 + "px 25px"; + }; + const _resize_canvas = function (obj) { + //自适应画布 + main.dom.outerBackground.style.width = obj.totalWidth + "px"; + main.dom.outerBackground.style.height = obj.totalHeight + "px"; + main.dom.outerUI.style.width = obj.totalWidth + "px"; + main.dom.outerUI.style.height = obj.totalHeight + "px"; + if (main.dom.CGUI) { + main.dom.CGUI.style.width = obj.totalWidth + 3 + "px"; + main.dom.CGUI.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.music) { + main.dom.music.style.width = obj.totalWidth + 3 + "px"; + main.dom.music.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.cgText) { + main.dom.cgText.style.width = obj.totalWidth + 3 + "px"; + main.dom.cgText.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.logcanvas) { + main.dom.logcanvas.style.width = obj.totalWidth + 3 + "px"; + main.dom.logcanvas.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.over) { + main.dom.over.style.width = obj.totalWidth + 3 + "px"; + main.dom.over.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.video) { + main.dom.video.style.width = obj.totalWidth + 3 + "px"; + main.dom.video.style.height = obj.totalHeight + 3 + "px"; + if (core.domStyle.isVertical) + main.dom.video.style.width = obj.totalHeight + 3 + "px"; + if (core.domStyle.isVertical) + main.dom.video.style.height = obj.totalWidth + 3 + "px"; + main.dom.video.style.top = "50%"; + main.dom.video.style.left = "50%"; - main.dom.video.style.transform = "translate(-50%,-50%)"; + main.dom.video.style.transform = "translate(-50%,-50%)"; - if (core.domStyle.isVertical) - main.dom.video.style.transform = "translate(-50%,-50%) rotate(90deg)"; - } - if (main.dom.video1) { - main.dom.video1.style.width = obj.totalWidth + 3 + "px"; - main.dom.video1.style.height = obj.totalHeight + 3 + "px"; - } + if (core.domStyle.isVertical) + main.dom.video.style.transform = "translate(-50%,-50%) rotate(90deg)"; + } + if (main.dom.video1) { + main.dom.video1.style.width = obj.totalWidth + 3 + "px"; + main.dom.video1.style.height = obj.totalHeight + 3 + "px"; + } - const innerSize = obj.canvasWidth * core.domStyle.scale + "px"; - for (let i = 0; i < core.dom.gameCanvas.length; ++i) - core.dom.gameCanvas[i].style.width = core.dom.gameCanvas[ - i - ].style.height = innerSize; - core.dom.gif.style.width = core.dom.gif.style.height = innerSize; - core.dom.gif2.style.width = core.dom.gif2.style.height = innerSize; + const innerSize = obj.canvasWidth * core.domStyle.scale + "px"; + for (let i = 0; i < core.dom.gameCanvas.length; ++i) + core.dom.gameCanvas[i].style.width = core.dom.gameCanvas[ + i + ].style.height = innerSize; + core.dom.gif.style.width = core.dom.gif.style.height = innerSize; + core.dom.gif2.style.width = core.dom.gif2.style.height = innerSize; - core.dom.gameDraw.style.width = core.dom.gameDraw.style.height = - innerSize; - core.dom.gameDraw.style.top = - obj.gameDrawBox.top * core.domStyle.scale + "px"; - core.dom.gameDraw.style.left = - obj.gameDrawBox.left * core.domStyle.scale + "px"; - // resize bigmap - core.bigmap.canvas.forEach(function (cn) { - const ratio = core.canvas[cn].canvas.hasAttribute("isHD") - ? core.domStyle.ratio - : 1; - core.canvas[cn].canvas.style.width = - (innerSize / ratio) * core.domStyle.scale + "px"; - core.canvas[cn].canvas.style.height = - (innerSize / ratio) * core.domStyle.scale + "px"; - }); - // resize dynamic canvas - for (const name in core.dymCanvas) { - const ctx = core.dymCanvas[name], - canvas = ctx.canvas; - const ratio = canvas.hasAttribute("isHD") ? core.domStyle.ratio : 1; - canvas.style.width = (innerSize / ratio) * core.domStyle.scale + "px"; - canvas.style.height = (innerSize / ratio) * core.domStyle.scale + "px"; - canvas.style.left = - parseFloat(canvas.getAttribute("_left")) * core.domStyle.scale + "px"; - canvas.style.top = - parseFloat(canvas.getAttribute("_top")) * core.domStyle.scale + "px"; - } - // resize next - main.dom.next.style.width = main.dom.next.style.height = - 5 * core.domStyle.scale + "px"; - main.dom.next.style.borderBottomWidth = - main.dom.next.style.borderRightWidth = 4 * core.domStyle.scale + "px"; - }; - const bgctx = main.dom.outerBackground.getContext("2d"); - const uictx = main.dom.outerUI.getContext("2d"); - let now = 0; - core.registerAnimationFrame("lightFloor", true, function (timestamp) { - if (timestamp - now > 1000 / 60) { - now = timestamp; - globalAlphafloor += globalAlphafloorStatus; - if (globalAlphafloor === 100) globalAlphafloorStatus = -2; - if (globalAlphafloor === 0) globalAlphafloorStatus = 2; + core.dom.gameDraw.style.width = core.dom.gameDraw.style.height = + innerSize; + core.dom.gameDraw.style.top = + obj.gameDrawBox.top * core.domStyle.scale + "px"; + core.dom.gameDraw.style.left = + obj.gameDrawBox.left * core.domStyle.scale + "px"; + // resize bigmap + core.bigmap.canvas.forEach(function (cn) { + const ratio = core.canvas[cn].canvas.hasAttribute("isHD") ? + core.domStyle.ratio : + 1; + core.canvas[cn].canvas.style.width = + (innerSize / ratio) * core.domStyle.scale + "px"; + core.canvas[cn].canvas.style.height = + (innerSize / ratio) * core.domStyle.scale + "px"; + }); + // resize dynamic canvas + for (const name in core.dymCanvas) { + const ctx = core.dymCanvas[name], + canvas = ctx.canvas; + const ratio = canvas.hasAttribute("isHD") ? core.domStyle.ratio : 1; + canvas.style.width = (innerSize / ratio) * core.domStyle.scale + "px"; + canvas.style.height = (innerSize / ratio) * core.domStyle.scale + "px"; + canvas.style.left = + parseFloat(canvas.getAttribute("_left")) * core.domStyle.scale + "px"; + canvas.style.top = + parseFloat(canvas.getAttribute("_top")) * core.domStyle.scale + "px"; + } + // resize next + main.dom.next.style.width = main.dom.next.style.height = + 5 * core.domStyle.scale + "px"; + main.dom.next.style.borderBottomWidth = + main.dom.next.style.borderRightWidth = 4 * core.domStyle.scale + "px"; + }; + const bgctx = main.dom.outerBackground.getContext("2d"); + const uictx = main.dom.outerUI.getContext("2d"); + let now = 0; + core.registerAnimationFrame("lightFloor", true, function (timestamp) { + if (timestamp - now > 1000 / 60) { + now = timestamp; + globalAlphafloor += globalAlphafloorStatus; + if (globalAlphafloor === 100) globalAlphafloorStatus = -2; + if (globalAlphafloor === 0) globalAlphafloorStatus = 2; - if (core.domStyle.isVertical) { - core.clearMap( - uictx, - MAP_BLOCK_LEFT_VERTICAL, - MAP_BLOCK_TOP_VERTICAL, - 340, - 360 - ); - if (core.status.event.id === "viewMaps") { - core.ui.statusBar._update_map(core.status.event.data.floorId); - } else { - core.ui.statusBar._update_map(); - } + if (core.domStyle.isVertical) { + core.clearMap( + uictx, + MAP_BLOCK_LEFT_VERTICAL, + MAP_BLOCK_TOP_VERTICAL, + 340, + 360 + ); + if (core.status.event.id === "viewMaps") { + core.ui.statusBar._update_map(core.status.event.data.floorId); + } else { + core.ui.statusBar._update_map(); + } - uictx.globalAlpha = globalAlphafloor / 100; - core.drawImage( - uictx, - "green.webp", - MAP_BLOCK_LEFT_VERTICAL + 135, - MAP_BLOCK_TOP_VERTICAL + 170 - ); - uictx.globalAlpha = 1; - } else { - core.clearMap(uictx, MAP_BLOCK_LEFT, MAP_BLOCK_TOP, 340, 360); - if (core.status.event.id === "viewMaps") { - core.ui.statusBar._update_map(core.status.event.data.floorId); - } else { - core.ui.statusBar._update_map(); - } - uictx.globalAlpha = globalAlphafloor / 100; - core.drawImage( - uictx, - "green.webp", - MAP_BLOCK_LEFT + 150, - MAP_BLOCK_TOP + 180 - ); - uictx.globalAlpha = 1; - } - } - }); + uictx.globalAlpha = globalAlphafloor / 100; + core.drawImage( + uictx, + "green.webp", + MAP_BLOCK_LEFT_VERTICAL + 135, + MAP_BLOCK_TOP_VERTICAL + 170 + ); + uictx.globalAlpha = 1; + } else { + core.clearMap(uictx, MAP_BLOCK_LEFT, MAP_BLOCK_TOP, 340, 360); + if (core.status.event.id === "viewMaps") { + core.ui.statusBar._update_map(core.status.event.data.floorId); + } else { + core.ui.statusBar._update_map(); + } + uictx.globalAlpha = globalAlphafloor / 100; + core.drawImage( + uictx, + "green.webp", + MAP_BLOCK_LEFT + 150, + MAP_BLOCK_TOP + 180 + ); + uictx.globalAlpha = 1; + } + } + }); - core.control.resize = function () { - //自适应,可实现横竖屏切换 - if (main.mode == "editor") return; + core.control.resize = function () { + //自适应,可实现横竖屏切换 + if (main.mode == "editor") return; - const clientWidth = main.dom.body.clientWidth, - clientHeight = main.dom.body.clientHeight; - const canvasWidth = core.__PIXELS__; + const clientWidth = main.dom.body.clientWidth, + clientHeight = main.dom.body.clientHeight; + const canvasWidth = core.__PIXELS__; - const isVertical = clientHeight > clientWidth; - core.domStyle.isVertical = isVertical; + const isVertical = clientHeight > clientWidth; + core.domStyle.isVertical = isVertical; - const totalWidth = isVertical - ? GAMEVIEW_WIDTH_VERTICAL / 3 - : GAMEVIEW_WIDTH / 3, - totalHeight = isVertical - ? GAMEVIEW_HEIGHT_VERTICAL / 3 - : GAMEVIEW_HEIGHT / 3; + const totalWidth = isVertical ? + GAMEVIEW_WIDTH_VERTICAL / 3 : + GAMEVIEW_WIDTH / 3, + totalHeight = isVertical ? + GAMEVIEW_HEIGHT_VERTICAL / 3 : + GAMEVIEW_HEIGHT / 3; - const maxRatio = Math.min( - clientWidth / totalWidth, - clientHeight / totalHeight - ); + const maxRatio = Math.min( + clientWidth / totalWidth, + clientHeight / totalHeight + ); - core.domStyle.availableScale = []; - [1, 1.25, 1.5, 1.75, 2].forEach(function (v) { - if (maxRatio >= v) { - core.domStyle.availableScale.push(v); - } - }); + core.domStyle.availableScale = []; + [1, 1.25, 1.5, 1.75, 2].forEach(function (v) { + if (maxRatio >= v) { + core.domStyle.availableScale.push(v); + } + }); - if (core.domStyle.availableScale.indexOf(core.domStyle.scale) < 0) { - core.domStyle.scale = Math.min(1, maxRatio); - } else if ( - core.getLocalStorage("scale") == null && - core.domStyle.availableScale.length >= 2 - ) { - core.domStyle.scale = - core.domStyle.availableScale[core.domStyle.availableScale.length - 2]; - core.setLocalStorage("scale", core.domStyle.scale); - } + if (core.domStyle.availableScale.indexOf(core.domStyle.scale) < 0) { + core.domStyle.scale = Math.min(1, maxRatio); + } else if ( + core.getLocalStorage("scale") == null && + core.domStyle.availableScale.length >= 2 + ) { + core.domStyle.scale = + core.domStyle.availableScale[core.domStyle.availableScale.length - 2]; + core.setLocalStorage("scale", core.domStyle.scale); + } - const totalWidthScaled = totalWidth * core.domStyle.scale, - totalHeightScaled = totalHeight * core.domStyle.scale; + const totalWidthScaled = totalWidth * core.domStyle.scale, + totalHeightScaled = totalHeight * core.domStyle.scale; - const gameDrawBox = isVertical - ? { - left: BORDER_WIDTH / 3, - top: BAR_HEIGHT_VERTICAL / 3 + BORDER_HEIGHT / 3, - } - : { left: BAR_WIDTH / 3 + BORDER_WIDTH / 3, top: BORDER_HEIGHT / 3 }; + const gameDrawBox = isVertical ? { + left: BORDER_WIDTH / 3, + top: BAR_HEIGHT_VERTICAL / 3 + BORDER_HEIGHT / 3, + } : { left: BAR_WIDTH / 3 + BORDER_WIDTH / 3, top: BORDER_HEIGHT / 3 }; - const obj = { - clientWidth: clientWidth, - clientHeight: clientHeight, - canvasWidth: canvasWidth, - totalWidth: totalWidthScaled, - totalHeight: totalHeightScaled, - gameDrawBox: gameDrawBox, - globalAttribute: - core.status.globalAttribute || core.initStatus.globalAttribute, - }; + const obj = { + clientWidth: clientWidth, + clientHeight: clientHeight, + canvasWidth: canvasWidth, + totalWidth: totalWidthScaled, + totalHeight: totalHeightScaled, + gameDrawBox: gameDrawBox, + globalAttribute: core.status.globalAttribute || core.initStatus.globalAttribute, + }; - _resize_gameGroup(obj); - _resize_canvas(obj); + _resize_gameGroup(obj); + _resize_canvas(obj); - if (core.status.automaticRoute == null) core.status.automaticRoute = {}; - core.updateStatusBar(); - if (main.dom.CGUI && main.dom.CGUI.style.display === "block") - core.ui.CG.update(); - if (main.dom.music && main.dom.music.style.display === "block") - core.ui.music.update(); - if (main.dom.cgText && main.dom.cgText.style.display === "block") - core.ui.cgText.update(); - if (main.dom.logcanvas && main.dom.logcanvas.style.display === "block") - core.ui.cgText.update(); - }; + if (core.status.automaticRoute == null) core.status.automaticRoute = {}; + core.updateStatusBar(); + if (main.dom.CGUI && main.dom.CGUI.style.display === "block") + core.ui.CG.update(); + if (main.dom.music && main.dom.music.style.display === "block") + core.ui.music.update(); + if (main.dom.cgText && main.dom.cgText.style.display === "block") + core.ui.cgText.update(); + if (main.dom.logcanvas && main.dom.logcanvas.style.display === "block") + core.ui.cgText.update(); + }; - class StatusBar { - constructor() { - //道具栏列表 - this.itemMx = [ - //空位用‘none’填充,当前ui至多4列6行 - ["book", "wand", "none", "fly"], - ["cross", "superPotion", "pickaxe"], - ["bomb", "centerFly", "upFly"], - ["none", "none", "none"], - ["downFly", "knife", "snow"], - ["bigKey", "earthquake", "coin"], - ]; - } - //初始化内容(工具栏/录像操作执行函数) - init() { - this.toolbarAction = [ - [ - main.core.openKeyBoard, - main.core.openQuickShop, - core.openToolbox, - core.doSL, - ], - [main.core.openSettings, main.core.save, main.core.load, core.doSL], - ]; - this.replayAction = [ - [core.triggerReplay, core.stopReplay, core.rewindReplay], - [core.speedDownReplay, core.speedUpReplay, core.saveReplay], - ]; - } - //更新 - update() { - this._update_background(); //更新背景 - this._update_props(); //更新属性 - //this._update_items(); //更新道具 - //this._update_equips(); //更新装备 - //this._update_keys(); //更新钥匙 - //this._update_infoWindow(); //更新道具说明 - this._update_toolBox(); //更新工具栏 - this._redrawMap(); - } - _redrawMap() { - if (core.domStyle.isVertical) { - core.clearMap( - uictx, - MAP_BLOCK_LEFT_VERTICAL, - MAP_BLOCK_TOP_VERTICAL, - 340, - 360 - ); - this._update_map(); - uictx.globalAlpha = globalAlphafloor / 100; - core.drawImage( - uictx, - "green.webp", - MAP_BLOCK_LEFT_VERTICAL + 125, - MAP_BLOCK_TOP_VERTICAL + 170 - ); - uictx.globalAlpha = 1; - } else { - core.clearMap(uictx, MAP_BLOCK_LEFT, MAP_BLOCK_TOP, 340, 360); - this._update_map(); - uictx.globalAlpha = globalAlphafloor / 100; - core.drawImage( - uictx, - "green.webp", - MAP_BLOCK_LEFT + 150, - MAP_BLOCK_TOP + 170 - ); - uictx.globalAlpha = 1; - } - } - //更新背景 - _update_background() { - if (core.domStyle.isVertical) { - bgctx.canvas.width = GAMEVIEW_WIDTH_VERTICAL; - bgctx.canvas.height = GAMEVIEW_HEIGHT_VERTICAL; - uictx.canvas.width = GAMEVIEW_WIDTH_VERTICAL; - uictx.canvas.height = GAMEVIEW_HEIGHT_VERTICAL; + class StatusBar { + constructor() { + //道具栏列表 + this.itemMx = [ + //空位用‘none’填充,当前ui至多4列6行 + ["book", "wand", "none", "fly"], + ["cross", "superPotion", "pickaxe"], + ["bomb", "centerFly", "upFly"], + ["none", "none", "none"], + ["downFly", "knife", "snow"], + ["bigKey", "earthquake", "coin"], + ]; + } + //初始化内容(工具栏/录像操作执行函数) + init() { + this.toolbarAction = [ + [ + main.core.openKeyBoard, + main.core.openQuickShop, + core.openToolbox, + core.doSL, + ], + [main.core.openSettings, main.core.save, main.core.load, core.doSL], + ]; + this.replayAction = [ + [core.triggerReplay, core.stopReplay, core.rewindReplay], + [core.speedDownReplay, core.speedUpReplay, core.saveReplay], + ]; + } + //更新 + update() { + this._update_background(); //更新背景 + this._update_props(); //更新属性 + //this._update_items(); //更新道具 + //this._update_equips(); //更新装备 + //this._update_keys(); //更新钥匙 + //this._update_infoWindow(); //更新道具说明 + this._update_toolBox(); //更新工具栏 + this._redrawMap(); + } + _redrawMap() { + if (core.domStyle.isVertical) { + core.clearMap( + uictx, + MAP_BLOCK_LEFT_VERTICAL, + MAP_BLOCK_TOP_VERTICAL, + 340, + 360 + ); + this._update_map(); + uictx.globalAlpha = globalAlphafloor / 100; + core.drawImage( + uictx, + "green.webp", + MAP_BLOCK_LEFT_VERTICAL + 125, + MAP_BLOCK_TOP_VERTICAL + 170 + ); + uictx.globalAlpha = 1; + } else { + core.clearMap(uictx, MAP_BLOCK_LEFT, MAP_BLOCK_TOP, 340, 360); + this._update_map(); + uictx.globalAlpha = globalAlphafloor / 100; + core.drawImage( + uictx, + "green.webp", + MAP_BLOCK_LEFT + 150, + MAP_BLOCK_TOP + 170 + ); + uictx.globalAlpha = 1; + } + } + //更新背景 + _update_background() { + if (core.domStyle.isVertical) { + bgctx.canvas.width = GAMEVIEW_WIDTH_VERTICAL; + bgctx.canvas.height = GAMEVIEW_HEIGHT_VERTICAL; + uictx.canvas.width = GAMEVIEW_WIDTH_VERTICAL; + uictx.canvas.height = GAMEVIEW_HEIGHT_VERTICAL; - const bg = core.material.images.images["status.webp"]; //竖屏背景(上) - bgctx.drawImage( - bg, - 0, - 0, - GAMEVIEW_WIDTH_VERTICAL, - BAR_HEIGHT_VERTICAL - ); - const bg2 = core.material.images.images["status.webp"]; //竖屏背景(下) - bgctx.drawImage( - bg2, - 0, - BAR_HEIGHT_VERTICAL + GAMEVIEW_WIDTH_VERTICAL, - GAMEVIEW_WIDTH_VERTICAL, - BAR_HEIGHT_VERTICAL - ); - bgctx.globalAlpha = globalAlpha; - bgctx.globalAlpha = 1; - core.setTextAlign("outerUI", "center"); - } else { - bgctx.canvas.width = GAMEVIEW_WIDTH; - bgctx.canvas.height = GAMEVIEW_HEIGHT; - uictx.canvas.width = GAMEVIEW_WIDTH; - uictx.canvas.height = GAMEVIEW_HEIGHT; + const bg = core.material.images.images["status.webp"]; //竖屏背景(上) + bgctx.drawImage( + bg, + 0, + 0, + GAMEVIEW_WIDTH_VERTICAL, + BAR_HEIGHT_VERTICAL + ); + const bg2 = core.material.images.images["status.webp"]; //竖屏背景(下) + bgctx.drawImage( + bg2, + 0, + BAR_HEIGHT_VERTICAL + GAMEVIEW_WIDTH_VERTICAL, + GAMEVIEW_WIDTH_VERTICAL, + BAR_HEIGHT_VERTICAL + ); + bgctx.globalAlpha = globalAlpha; + bgctx.globalAlpha = 1; + core.setTextAlign("outerUI", "center"); + } else { + bgctx.canvas.width = GAMEVIEW_WIDTH; + bgctx.canvas.height = GAMEVIEW_HEIGHT; + uictx.canvas.width = GAMEVIEW_WIDTH; + uictx.canvas.height = GAMEVIEW_HEIGHT; - const bg = core.material.images.images["status.webp"]; //横屏背景(左) - bgctx.drawImage(bg, 0, 0, BAR_WIDTH, GAMEVIEW_HEIGHT); - const bg2 = core.material.images.images["status.webp"]; //横屏背景(右) - bgctx.drawImage( - bg2, - BAR_WIDTH + GAMEVIEW_HEIGHT, - 0, - BAR_WIDTH, - GAMEVIEW_HEIGHT - ); - bgctx.globalAlpha = globalAlpha; + const bg = core.material.images.images["status.webp"]; //横屏背景(左) + bgctx.drawImage(bg, 0, 0, BAR_WIDTH, GAMEVIEW_HEIGHT); + const bg2 = core.material.images.images["status.webp"]; //横屏背景(右) + bgctx.drawImage( + bg2, + BAR_WIDTH + GAMEVIEW_HEIGHT, + 0, + BAR_WIDTH, + GAMEVIEW_HEIGHT + ); + bgctx.globalAlpha = globalAlpha; - bgctx.globalAlpha = 1; - core.setTextAlign("outerUI", "center"); - } - } - // 更新属性 - _update_props(updatedFloorTitle) { - if (!updatedFloorTitle && core.status.floorId) { - updatedFloorTitle = core.status.maps[core.status.floorId].title; - } - const statusList = ["hp", "atk", "def", "money"]; //属性列表,图标在函数复写core.statusBar.icons中声明,数字为project\materials\icons.png中的图标序号(可使用便捷ps追加,第一个序号为0) - const drawStatusList = (baseX, baseY) => { - let curh = baseY; - core.setTextAlign("outerUI", "right"); - statusList.forEach((item) => { - // 绘制图标 - core.drawIcon( - "outerUI", - item, - baseX - 95 * 3, - curh - 18 * 3, - 22 * 3, - 22 * 3 - ); + bgctx.globalAlpha = 1; + core.setTextAlign("outerUI", "center"); + } + } + // 更新属性 + _update_props(updatedFloorTitle) { + if (!updatedFloorTitle && core.status.floorId) { + updatedFloorTitle = core.status.maps[core.status.floorId].title; + } + const statusList = ["hp", "atk", "def", "money"]; //属性列表,图标在函数复写core.statusBar.icons中声明,数字为project\materials\icons.png中的图标序号(可使用便捷ps追加,第一个序号为0) + const drawStatusList = (baseX, baseY) => { + let curh = baseY; + core.setTextAlign("outerUI", "right"); + statusList.forEach((item) => { + // 绘制图标 + core.drawIcon( + "outerUI", + item, + baseX - 95 * 3, + curh - 18 * 3, + 22 * 3, + 22 * 3 + ); - // 四舍五入 - core.status.hero[item] = Math.round(core.status.hero[item]); - // 大数据格式化 - core.fillBoldText1( - "outerUI", - core.getRealStatus(item), - baseX, - curh, - TEXT_COLOR, - "#000000", - 6 - ); - curh += 24 * 3; - if (curh > 130 * 3 && core.domStyle.isVertical) { - curh = 24 * 3; - baseX += 105 * 3; - } - }); - core.setTextAlign("outerUI", "center"); - }; - if (core.domStyle.isVertical) { - core.clearMap("outerUI", 10 * 3, 0, 210 * 3, 120 * 3); - core.setFont("outerUI", "bold 42px Verdana"); - if (updatedFloorTitle) { - core.fillBoldText1( - "outerUI", - updatedFloorTitle, - 60 * 3, - 22 * 3, - TEXT_COLOR, - "#000000", - 6 - ); - } - //drawStatusList(96 * 3, 46 * 3); - //core.drawImage("outerUI", "lane1.png", 0, 0) - core.drawImage("outerUI", "cao.webp", 0, 0); - } else { - core.clearMap("outerUI", 10 * 3, 40 * 3, 105 * 3, 250 * 3); - core.setFont("outerUI", "bold 48px Verdana"); - if (updatedFloorTitle) { - core.fillBoldText1( - "outerUI", - updatedFloorTitle, - 62 * 3, - 41 * 3, - TEXT_COLOR, - "#000000", - 6 - ); - } - //drawStatusList(110 * 3, 93 * 3); - //core.drawImage("outerUI", "lane1.png", 0, 30) - core.drawImage( - "outerUI", - "cao.webp", - 0, - 0, - 400, - 350, - 0, - 30, - 360, - 315 - ); - } - } - _update_items() { - //更新道具栏 - const drawItemMx = (drawFn) => { - for (let i = 0; i < this.itemMx.length; i++) { - for (let j = 0; j < this.itemMx[i].length; j++) { - var item = this.itemMx[i][j]; - drawFn(i, j, item); - } - } - }; - const drawItem = (item, posx, posy) => { - const icon = core.material.icons.items[item], - image = core.material.images.items; - core.drawImage( - "outerUI", - image, - 0, - 32 * icon, - 32, - 32, - posx, - posy, - 30 * 3, - 30 * 3 - ); - const cnt = core.itemCount(item); - if ( - (core.items.items[item].cls === "tools" && cnt > 1) || - FORCE_COUNTABLE_ITEMS.includes(item) - ) { - core.fillText( - "outerUI", - cnt, - posx + 25 * 3, - posy + 28 * 3, - "#FFFFFF", - "bold 36px Verdana" - ); - } - }; - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - ITEM_BOX_LEFT_VERTICAL, - ITEM_BOX_TOP_VERTICAL, - 185 * 3, - 125 * 3 - ); + // 四舍五入 + core.status.hero[item] = Math.round(core.status.hero[item]); + // 大数据格式化 + core.fillBoldText1( + "outerUI", + core.getRealStatus(item), + baseX, + curh, + TEXT_COLOR, + "#000000", + 6 + ); + curh += 24 * 3; + if (curh > 130 * 3 && core.domStyle.isVertical) { + curh = 24 * 3; + baseX += 105 * 3; + } + }); + core.setTextAlign("outerUI", "center"); + }; + if (core.domStyle.isVertical) { + core.clearMap("outerUI", 10 * 3, 0, 210 * 3, 120 * 3); + core.setFont("outerUI", "bold 42px Verdana"); + if (updatedFloorTitle) { + core.fillBoldText1( + "outerUI", + updatedFloorTitle, + 60 * 3, + 22 * 3, + TEXT_COLOR, + "#000000", + 6 + ); + } + //drawStatusList(96 * 3, 46 * 3); + //core.drawImage("outerUI", "lane1.png", 0, 0) + core.drawImage("outerUI", "cao.webp", 0, 0); + } else { + core.clearMap("outerUI", 10 * 3, 40 * 3, 105 * 3, 250 * 3); + core.setFont("outerUI", "bold 48px Verdana"); + if (updatedFloorTitle) { + core.fillBoldText1( + "outerUI", + updatedFloorTitle, + 62 * 3, + 41 * 3, + TEXT_COLOR, + "#000000", + 6 + ); + } + //drawStatusList(110 * 3, 93 * 3); + //core.drawImage("outerUI", "lane1.png", 0, 30) + core.drawImage( + "outerUI", + "cao.webp", + 0, + 0, + 400, + 350, + 0, + 30, + 360, + 315 + ); + } + } + _update_items() { + //更新道具栏 + const drawItemMx = (drawFn) => { + for (let i = 0; i < this.itemMx.length; i++) { + for (let j = 0; j < this.itemMx[i].length; j++) { + var item = this.itemMx[i][j]; + drawFn(i, j, item); + } + } + }; + const drawItem = (item, posx, posy) => { + const icon = core.material.icons.items[item], + image = core.material.images.items; + core.drawImage( + "outerUI", + image, + 0, + 32 * icon, + 32, + 32, + posx, + posy, + 30 * 3, + 30 * 3 + ); + const cnt = core.itemCount(item); + if ( + (core.items.items[item].cls === "tools" && cnt > 1) || + FORCE_COUNTABLE_ITEMS.includes(item) + ) { + core.fillText( + "outerUI", + cnt, + posx + 25 * 3, + posy + 28 * 3, + "#FFFFFF", + "bold 36px Verdana" + ); + } + }; + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + ITEM_BOX_LEFT_VERTICAL, + ITEM_BOX_TOP_VERTICAL, + 185 * 3, + 125 * 3 + ); - drawItemMx((i, j, item) => { - if (core.hasItem(item)) { - const posx = ITEM_BOX_LEFT_VERTICAL + i * 30 * 3, - posy = ITEM_BOX_TOP_VERTICAL + j * 31 * 3; - drawItem(item, posx, posy); - } - }); - } else { - core.clearMap( - "outerUI", - ITEM_BOX_LEFT, - ITEM_BOX_TOP, - 125 * 3, - 185 * 3 - ); + drawItemMx((i, j, item) => { + if (core.hasItem(item)) { + const posx = ITEM_BOX_LEFT_VERTICAL + i * 30 * 3, + posy = ITEM_BOX_TOP_VERTICAL + j * 31 * 3; + drawItem(item, posx, posy); + } + }); + } else { + core.clearMap( + "outerUI", + ITEM_BOX_LEFT, + ITEM_BOX_TOP, + 125 * 3, + 185 * 3 + ); - drawItemMx((i, j, item) => { - if (core.hasItem(item)) { - const posx = ITEM_BOX_LEFT + j * 30 * 3, - posy = ITEM_BOX_TOP + i * 31 * 3; - drawItem(item, posx, posy); - } - }); - } - } + drawItemMx((i, j, item) => { + if (core.hasItem(item)) { + const posx = ITEM_BOX_LEFT + j * 30 * 3, + posy = ITEM_BOX_TOP + i * 31 * 3; + drawItem(item, posx, posy); + } + }); + } + } - _update_map(floorId = core.status.floorId) { - const x = core.domStyle.isVertical - ? MAP_BLOCK_LEFT_VERTICAL - : MAP_BLOCK_LEFT; - const y = core.domStyle.isVertical - ? MAP_BLOCK_TOP_VERTICAL - : MAP_BLOCK_TOP; + _update_map(floorId = core.status.floorId) { + const x = core.domStyle.isVertical ? + MAP_BLOCK_LEFT_VERTICAL : + MAP_BLOCK_LEFT; + const y = core.domStyle.isVertical ? + MAP_BLOCK_TOP_VERTICAL : + MAP_BLOCK_TOP; - if (!floorId) return; - const info = core.plugin.getMapDrawInfo(floorId, Infinity, true); - core.setTextAlign("outerUI", "center"); + if (!floorId) return; + const info = core.plugin.getMapDrawInfo(floorId, Infinity, true); + core.setTextAlign("outerUI", "center"); - core.plugin.drawSmallMap(uictx, info, floorId, x, y, 300, 300); - } + core.plugin.drawSmallMap(uictx, info, floorId, x, y, 300, 300); + } - _update_equips() { - return; - core.setFont("outerUI", "bold 48px Verdana"); - const drawEquip = (baseX, baseY, id, color, back) => { - if (!id) - core.fillText( - "outerUI", - back, - baseX + 20 * 3, - baseY + 22 * 3, - color - ); - else { - var icon = core.material.icons.items[id]; - core.drawImage( - "outerUI", - core.material.images.items, - 0, - 32 * icon, - 32, - 32, - baseX + 5 * 3, - baseY, - 32 * 3, - 32 * 3 - ); - } - }; - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - EQUIP_BLOCK_LEFT_VERTICAL, - EQUIP_BLOCK_TOP_VERTICAL, - 90 * 3, - 130 * 3 - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL, - EQUIP_BLOCK_TOP_VERTICAL, - core.getEquip(0), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, - EQUIP_BLOCK_TOP_VERTICAL, - core.getEquip(1), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL, - EQUIP_BLOCK_TOP_VERTICAL + 45 * 3, - core.getEquip(2), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, - EQUIP_BLOCK_TOP_VERTICAL + 45 * 3, - core.getEquip(3), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL, - EQUIP_BLOCK_TOP_VERTICAL + 90 * 3, - core.getEquip(4), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, - EQUIP_BLOCK_TOP_VERTICAL + 90 * 3, - core.getEquip(5), - "#D1CEFF", - "无" - ); - } else { - core.clearMap( - "outerUI", - EQUIP_BLOCK_LEFT, - EQUIP_BLOCK_TOP, - 130 * 3, - 95 * 3 - ); - drawEquip( - EQUIP_BLOCK_LEFT, - EQUIP_BLOCK_TOP, - core.getEquip(0), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT + 42 * 3, - EQUIP_BLOCK_TOP, - core.getEquip(1), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT + 85 * 3, - EQUIP_BLOCK_TOP, - core.getEquip(2), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT, - EQUIP_BLOCK_TOP + 45 * 3, - core.getEquip(3), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT + 42 * 3, - EQUIP_BLOCK_TOP + 45 * 3, - core.getEquip(4), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT + 85 * 3, - EQUIP_BLOCK_TOP + 45 * 3, - core.getEquip(5), - "#D1CEFF", - "无" - ); - } - } - _update_keys() { - const drawKeyList = (baseX, baseY) => { - const todraw = [], - keyList = ["yellowKey", "blueKey", "redKey", "greenKey"]; - let total = 0; - keyList.forEach(function (key, i) { - todraw[i] = core.itemCount(key); - total += todraw[i]; - }); + _update_equips() { + return; + core.setFont("outerUI", "bold 48px Verdana"); + const drawEquip = (baseX, baseY, id, color, back) => { + if (!id) + core.fillText( + "outerUI", + back, + baseX + 20 * 3, + baseY + 22 * 3, + color + ); + else { + var icon = core.material.icons.items[id]; + core.drawImage( + "outerUI", + core.material.images.items, + 0, + 32 * icon, + 32, + 32, + baseX + 5 * 3, + baseY, + 32 * 3, + 32 * 3 + ); + } + }; + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + EQUIP_BLOCK_LEFT_VERTICAL, + EQUIP_BLOCK_TOP_VERTICAL, + 90 * 3, + 130 * 3 + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL, + EQUIP_BLOCK_TOP_VERTICAL, + core.getEquip(0), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, + EQUIP_BLOCK_TOP_VERTICAL, + core.getEquip(1), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL, + EQUIP_BLOCK_TOP_VERTICAL + 45 * 3, + core.getEquip(2), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, + EQUIP_BLOCK_TOP_VERTICAL + 45 * 3, + core.getEquip(3), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL, + EQUIP_BLOCK_TOP_VERTICAL + 90 * 3, + core.getEquip(4), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, + EQUIP_BLOCK_TOP_VERTICAL + 90 * 3, + core.getEquip(5), + "#D1CEFF", + "无" + ); + } else { + core.clearMap( + "outerUI", + EQUIP_BLOCK_LEFT, + EQUIP_BLOCK_TOP, + 130 * 3, + 95 * 3 + ); + drawEquip( + EQUIP_BLOCK_LEFT, + EQUIP_BLOCK_TOP, + core.getEquip(0), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT + 42 * 3, + EQUIP_BLOCK_TOP, + core.getEquip(1), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT + 85 * 3, + EQUIP_BLOCK_TOP, + core.getEquip(2), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT, + EQUIP_BLOCK_TOP + 45 * 3, + core.getEquip(3), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT + 42 * 3, + EQUIP_BLOCK_TOP + 45 * 3, + core.getEquip(4), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT + 85 * 3, + EQUIP_BLOCK_TOP + 45 * 3, + core.getEquip(5), + "#D1CEFF", + "无" + ); + } + } + _update_keys() { + const drawKeyList = (baseX, baseY) => { + const todraw = [], + keyList = ["yellowKey", "blueKey", "redKey", "greenKey"]; + let total = 0; + keyList.forEach(function (key, i) { + todraw[i] = core.itemCount(key); + total += todraw[i]; + }); - let dn = 3; - for (let i = 0; i <= dn; i++) { - let delta = i * 32 * 3; + let dn = 3; + for (let i = 0; i <= dn; i++) { + let delta = i * 32 * 3; - if (core.domStyle.isVertical) { - this.drawKey(keyList[i], baseX, baseY + delta); - } else { - this.drawKey(keyList[i], baseX + delta, baseY); - } + if (core.domStyle.isVertical) { + this.drawKey(keyList[i], baseX, baseY + delta); + } else { + this.drawKey(keyList[i], baseX + delta, baseY); + } - core.setFont("outerUI", "bold 48px Verdana"); - core.setTextAlign("outerUI", "left"); - if (core.domStyle.isVertical) { - core.fillText( - "outerUI", - todraw[i], - baseX + 20 * 3, - baseY + 14 * 3 + delta, - TEXT_COLOR - ); - } else { - core.fillText( - "outerUI", - todraw[i], - baseX + delta, - baseY + 32 * 3, - TEXT_COLOR - ); - } - } - }; - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - KEY_BLOCK_LEFT_VERTICAL, - KEY_BLOCK_TOP_VERTICAL, - 45 * 3, - 130 * 3 - ); - drawKeyList( - KEY_BLOCK_LEFT_VERTICAL + 3 * 3, - KEY_BLOCK_TOP_VERTICAL + 5 * 3 - ); - } else { - core.clearMap( - "outerUI", - KEY_BLOCK_LEFT, - KEY_BLOCK_TOP, - 130 * 3, - 45 * 3 - ); - drawKeyList(KEY_BLOCK_LEFT + 10 * 3, KEY_BLOCK_TOP); - } - } - drawKey(key, x, y) { - let sx = 0, - sy = 0; + core.setFont("outerUI", "bold 48px Verdana"); + core.setTextAlign("outerUI", "left"); + if (core.domStyle.isVertical) { + core.fillText( + "outerUI", + todraw[i], + baseX + 20 * 3, + baseY + 14 * 3 + delta, + TEXT_COLOR + ); + } else { + core.fillText( + "outerUI", + todraw[i], + baseX + delta, + baseY + 32 * 3, + TEXT_COLOR + ); + } + } + }; + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + KEY_BLOCK_LEFT_VERTICAL, + KEY_BLOCK_TOP_VERTICAL, + 45 * 3, + 130 * 3 + ); + drawKeyList( + KEY_BLOCK_LEFT_VERTICAL + 3 * 3, + KEY_BLOCK_TOP_VERTICAL + 5 * 3 + ); + } else { + core.clearMap( + "outerUI", + KEY_BLOCK_LEFT, + KEY_BLOCK_TOP, + 130 * 3, + 45 * 3 + ); + drawKeyList(KEY_BLOCK_LEFT + 10 * 3, KEY_BLOCK_TOP); + } + } + drawKey(key, x, y) { + let sx = 0, + sy = 0; - if (key == "yellowKey") sx += 13; - else if (key == "blueKey") sx += 26; - else if (key == "greenKey") sx += 39; + if (key == "yellowKey") sx += 13; + else if (key == "blueKey") sx += 26; + else if (key == "greenKey") sx += 39; - core.drawImage( - "outerUI", - "maba.webp", - sx, - sy, - 13, - 26, - x, - y, - 13 * 3, - 26 * 3 - ); - } - _update_infoWindow() { - const itemId = this.selectedItem; - let text = ""; - if (this.selectedItem) { - text = core.replaceText(core.material.items[itemId]?.text); - if (text[0] == "," || text[0] == ",") text = text.substring(1); - } - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - INFO_BLOCK_LEFT_VERTICAL, - INFO_BLOCK_TOP_VERTICAL, - 300 * 3, - 120 * 3 - ); + core.drawImage( + "outerUI", + "maba.webp", + sx, + sy, + 13, + 26, + x, + y, + 13 * 3, + 26 * 3 + ); + } + _update_infoWindow() { + const itemId = this.selectedItem; + let text = ""; + if (this.selectedItem) { + text = core.replaceText(core.material.items[itemId]?.text); + if (text[0] == "," || text[0] == ",") text = text.substring(1); + } + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + INFO_BLOCK_LEFT_VERTICAL, + INFO_BLOCK_TOP_VERTICAL, + 300 * 3, + 120 * 3 + ); - if (this.selectedItem) { - const icon = core.material.icons.items[itemId]; - core.setTextAlign("outerUI", "left"); - core.fillText( - "outerUI", - core.material.items[itemId].name, - INFO_BLOCK_LEFT_VERTICAL + 50 * 3, - INFO_BLOCK_TOP_VERTICAL + 27 * 3, - "#D1CEFF" - ); - core.drawImage( - "outerUI", - core.material.images.items, - 0, - 32 * icon, - 32, - 32, - INFO_BLOCK_LEFT_VERTICAL + 10 * 3, - INFO_BLOCK_TOP_VERTICAL + 8 * 3, - 32 * 3, - 32 * 3 - ); - core.ui.drawTextContent("outerUI", text, { - left: INFO_BLOCK_LEFT_VERTICAL + 10 * 3, - top: INFO_BLOCK_TOP_VERTICAL + 40 * 3, - maxWidth: 275 * 3, - color: "#D1CEFF", - fontSize: 36, - }); - } - } else { - core.clearMap( - "outerUI", - INFO_BLOCK_LEFT, - INFO_BLOCK_TOP, - 115 * 3, - 230 * 3 - ); + if (this.selectedItem) { + const icon = core.material.icons.items[itemId]; + core.setTextAlign("outerUI", "left"); + core.fillText( + "outerUI", + core.material.items[itemId].name, + INFO_BLOCK_LEFT_VERTICAL + 50 * 3, + INFO_BLOCK_TOP_VERTICAL + 27 * 3, + "#D1CEFF" + ); + core.drawImage( + "outerUI", + core.material.images.items, + 0, + 32 * icon, + 32, + 32, + INFO_BLOCK_LEFT_VERTICAL + 10 * 3, + INFO_BLOCK_TOP_VERTICAL + 8 * 3, + 32 * 3, + 32 * 3 + ); + core.ui.drawTextContent("outerUI", text, { + left: INFO_BLOCK_LEFT_VERTICAL + 10 * 3, + top: INFO_BLOCK_TOP_VERTICAL + 40 * 3, + maxWidth: 275 * 3, + color: "#D1CEFF", + fontSize: 36, + }); + } + } else { + core.clearMap( + "outerUI", + INFO_BLOCK_LEFT, + INFO_BLOCK_TOP, + 115 * 3, + 230 * 3 + ); - if (this.selectedItem) { - const icon = core.material.icons.items[itemId]; - core.setTextAlign("outerUI", "center"); - core.fillText( - "outerUI", - core.material.items[itemId].name, - INFO_BLOCK_LEFT + 60 * 3, - INFO_BLOCK_TOP + 25 * 3, - "#D1CEFF" - ); - core.drawImage( - "outerUI", - core.material.images.items, - 0, - 32 * icon, - 32, - 32, - INFO_BLOCK_LEFT + 45 * 3, - INFO_BLOCK_TOP + 30 * 3, - 32 * 3, - 32 * 3 - ); - core.ui.drawTextContent("outerUI", text, { - left: INFO_BLOCK_LEFT + 10 * 3, - top: INFO_BLOCK_TOP + 60 * 3, - maxWidth: 105 * 3, - color: "#D1CEFF", - fontSize: 36, - }); - } - } - } - showItemInfo(itemId) { - //展示道具说明 - this.selectedItem = itemId; - this._update_infoWindow(); - } - clearItemInfo() { - //清除道具说明 - this.selectedItem = null; - this._update_infoWindow(); - } - _update_toolBox() { - const tools = core.isReplaying() - ? [ - [core.status.replay.pausing ? "play" : "pause", "stop", "rewind"], - ["speedDown", "speedUp", "save"], - ] - : [ - ["keyboard", "shop", "pack", "T332"], - ["settings", "save", "load", "T331"], - ]; - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - TOOL_BOX_LEFT_VERTICAL, - TOOL_BOX_TOP_VERTICAL, - 115, - 130 - ); + if (this.selectedItem) { + const icon = core.material.icons.items[itemId]; + core.setTextAlign("outerUI", "center"); + core.fillText( + "outerUI", + core.material.items[itemId].name, + INFO_BLOCK_LEFT + 60 * 3, + INFO_BLOCK_TOP + 25 * 3, + "#D1CEFF" + ); + core.drawImage( + "outerUI", + core.material.images.items, + 0, + 32 * icon, + 32, + 32, + INFO_BLOCK_LEFT + 45 * 3, + INFO_BLOCK_TOP + 30 * 3, + 32 * 3, + 32 * 3 + ); + core.ui.drawTextContent("outerUI", text, { + left: INFO_BLOCK_LEFT + 10 * 3, + top: INFO_BLOCK_TOP + 60 * 3, + maxWidth: 105 * 3, + color: "#D1CEFF", + fontSize: 36, + }); + } + } + } + showItemInfo(itemId) { + //展示道具说明 + this.selectedItem = itemId; + this._update_infoWindow(); + } + clearItemInfo() { + //清除道具说明 + this.selectedItem = null; + this._update_infoWindow(); + } + _update_toolBox() { + const tools = core.isReplaying() ? [ + [core.status.replay.pausing ? "play" : "pause", "stop", "rewind"], + ["speedDown", "speedUp", "save"], + ] : [ + ["keyboard", "shop", "pack", "T332"], + ["settings", "save", "load", "T331"], + ]; + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + TOOL_BOX_LEFT_VERTICAL, + TOOL_BOX_TOP_VERTICAL, + 115, + 130 + ); - for (let i = 0; i < tools.length; i++) { - for (let j = 0; j < tools[i].length; j++) { - core.drawIcon( - "outerUI", - tools[i][j], - TOOL_BOX_LEFT_VERTICAL + i * 31 * 3, - TOOL_BOX_TOP_VERTICAL + j * 31 * 3, - 30 * 3, - 30 * 3 - ); - } - } - } else { - core.clearMap( - "outerUI", - TOOL_BOX_LEFT, - TOOL_BOX_TOP, - 130 * 3, - 80 * 3 - ); + for (let i = 0; i < tools.length; i++) { + for (let j = 0; j < tools[i].length; j++) { + core.drawIcon( + "outerUI", + tools[i][j], + TOOL_BOX_LEFT_VERTICAL + i * 31 * 3, + TOOL_BOX_TOP_VERTICAL + j * 31 * 3, + 30 * 3, + 30 * 3 + ); + } + } + } else { + core.clearMap( + "outerUI", + TOOL_BOX_LEFT, + TOOL_BOX_TOP, + 130 * 3, + 80 * 3 + ); - for (let i = 0; i < tools.length; i++) { - for (let j = 0; j < tools[i].length; j++) { - core.drawIcon( - "outerUI", - tools[i][j], - TOOL_BOX_LEFT + j * 31 * 3, - TOOL_BOX_TOP + i * 31 * 3, - 30 * 3, - 30 * 3 - ); - } - } - } - } - onclick(x, y) { - const makeBox = ([x, y], [w, h]) => { - return [ - [x, y], - [x + w, y + h], - ]; - }; - const gridify = ([x, y], [gw, gh]) => { - return [Math.floor(x / gw), Math.floor(y / gh)]; - }; - const useItem = (itemId) => { - if (!core.hasItem(itemId)) return; + for (let i = 0; i < tools.length; i++) { + for (let j = 0; j < tools[i].length; j++) { + core.drawIcon( + "outerUI", + tools[i][j], + TOOL_BOX_LEFT + j * 31 * 3, + TOOL_BOX_TOP + i * 31 * 3, + 30 * 3, + 30 * 3 + ); + } + } + } + } + onclick(x, y) { + const makeBox = ([x, y], [w, h]) => { + return [ + [x, y], + [x + w, y + h], + ]; + }; + const gridify = ([x, y], [gw, gh]) => { + return [Math.floor(x / gw), Math.floor(y / gh)]; + }; + const useItem = (itemId) => { + if (!core.hasItem(itemId)) return; - if (itemId != this.selectedItem) { - this.showItemInfo(itemId); - } else { - switch (itemId) { - case "centerFly": - core.ui._drawCenterFly(); - break; - case "book": - core.openBook(true); - break; - case "wand": - core.insertAction({ - type: "useItem", - id: itemId, - }); - break; - case "fly": - core.useItem(itemId); - break; - default: - core.useItem(itemId); - } - } - }; - const inRect = ([x, y], [[sx, sy], [dx, dy]]) => { - return sx <= x && x <= dx && sy <= y && y <= dy; - }; - const relativeTo = ([x, y], [ax, ay]) => { - return [x - ax, y - ay]; - }; - const pos = [x, y]; - if (core.domStyle.isVertical) { - const itemBox = makeBox( - [ITEM_BOX_LEFT_VERTICAL, ITEM_BOX_TOP_VERTICAL], - [30 * 6 * 3, 31 * 4 * 3] - ); - if (inRect(pos, itemBox)) { - const [gx, gy] = gridify(relativeTo(pos, itemBox[0]), [ - 30 * 3, - 31 * 3, - ]); - const itemId = this.itemMx[gx][gy]; - if ( - (core.status.event.id == "viewMaps" || - core.status.event.id == "fly") && - itemId === "book" - ) - core.openBook(true); - if ( - core.isReplaying() || - core.status.lockControl || - core.isMoving() - ) - return; - useItem(itemId); - return; - } - const toolBox = makeBox( - [TOOL_BOX_LEFT_VERTICAL, TOOL_BOX_TOP_VERTICAL], - [31 * 2 * 3, 31 * 4 * 3] - ); - if (inRect(pos, toolBox)) { - const [col, row] = gridify(relativeTo(pos, toolBox[0]), [ - 31 * 3, - 31 * 3, - ]); - if (core.status.lockControl || core.isMoving()) return; - if (core.isReplaying()) { - this.replayAction[col][row].call(core); - } else if (core.isPlaying()) { - if (col === 0 && row === 3) { - core.doSL("autoSave", "load"); - } else if (col === 1 && row === 3) { - core.doSL("autoSave", "reload"); - } else { - this.toolbarAction[col][row].call(core, true); - } - } - return; - } - const mapBox = makeBox( - [MAP_BLOCK_LEFT_VERTICAL, MAP_BLOCK_TOP_VERTICAL], - [350, 350] - ); - if (inRect(pos, mapBox)) { - if ( - core.isReplaying() || - core.status.lockControl || - core.isMoving() - ) - return; - core.useItem("fly"); - return; - } - /*const equipBox = makeBox([EQUIP_BLOCK_LEFT_VERTICAL, EQUIP_BLOCK_TOP_VERTICAL], [90 * 3, 130 * 3]) + if (itemId != this.selectedItem) { + this.showItemInfo(itemId); + } else { + switch (itemId) { + case "centerFly": + core.ui._drawCenterFly(); + break; + case "book": + core.openBook(true); + break; + case "wand": + core.insertAction({ + type: "useItem", + id: itemId, + }); + break; + case "fly": + core.useItem(itemId); + break; + default: + core.useItem(itemId); + } + } + }; + const inRect = ([x, y], [ + [sx, sy], + [dx, dy] + ]) => { + return sx <= x && x <= dx && sy <= y && y <= dy; + }; + const relativeTo = ([x, y], [ax, ay]) => { + return [x - ax, y - ay]; + }; + const pos = [x, y]; + if (core.domStyle.isVertical) { + const itemBox = makeBox( + [ITEM_BOX_LEFT_VERTICAL, ITEM_BOX_TOP_VERTICAL], + [30 * 6 * 3, 31 * 4 * 3] + ); + if (inRect(pos, itemBox)) { + const [gx, gy] = gridify(relativeTo(pos, itemBox[0]), [ + 30 * 3, + 31 * 3, + ]); + const itemId = this.itemMx[gx][gy]; + if ( + (core.status.event.id == "viewMaps" || + core.status.event.id == "fly") && + itemId === "book" + ) + core.openBook(true); + if ( + core.isReplaying() || + core.status.lockControl || + core.isMoving() + ) + return; + useItem(itemId); + return; + } + const toolBox = makeBox( + [TOOL_BOX_LEFT_VERTICAL, TOOL_BOX_TOP_VERTICAL], + [31 * 2 * 3, 31 * 4 * 3] + ); + if (inRect(pos, toolBox)) { + const [col, row] = gridify(relativeTo(pos, toolBox[0]), [ + 31 * 3, + 31 * 3, + ]); + if (core.status.lockControl || core.isMoving()) return; + if (core.isReplaying()) { + this.replayAction[col][row].call(core); + } else if (core.isPlaying()) { + if (col === 0 && row === 3) { + core.doSL("autoSave", "load"); + } else if (col === 1 && row === 3) { + core.doSL("autoSave", "reload"); + } else { + this.toolbarAction[col][row].call(core, true); + } + } + return; + } + const mapBox = makeBox( + [MAP_BLOCK_LEFT_VERTICAL, MAP_BLOCK_TOP_VERTICAL], + [350, 350] + ); + if (inRect(pos, mapBox)) { + if ( + core.isReplaying() || + core.status.lockControl || + core.isMoving() + ) + return; + core.useItem("fly"); + return; + } + /*const equipBox = makeBox([EQUIP_BLOCK_LEFT_VERTICAL, EQUIP_BLOCK_TOP_VERTICAL], [90 * 3, 130 * 3]) if (inRect(pos, equipBox)) { if (core.isReplaying() || core.status.lockControl || core.isMoving()) return; core.openEquipbox(true) return; }*/ - } else { - const mapBox = makeBox([MAP_BLOCK_LEFT, MAP_BLOCK_TOP], [350, 350]); - if (inRect(pos, mapBox)) { - if ( - core.isReplaying() || - core.status.lockControl || - core.isMoving() - ) - return; - core.useItem("fly"); - return; - } - /* + } else { + const mapBox = makeBox([MAP_BLOCK_LEFT, MAP_BLOCK_TOP], [350, 350]); + if (inRect(pos, mapBox)) { + if ( + core.isReplaying() || + core.status.lockControl || + core.isMoving() + ) + return; + core.useItem("fly"); + return; + } + /* const equipBox = makeBox([EQUIP_BLOCK_LEFT, EQUIP_BLOCK_TOP], [130, 95]) if (inRect(pos, equipBox)) { if (core.isReplaying() || core.status.lockControl || core.isMoving()) return; core.openEquipbox(true) return; }*/ - const itemBox = makeBox( - [ITEM_BOX_LEFT, ITEM_BOX_TOP], - [31 * 4 * 3, 30 * 6 * 3] - ); - if (inRect(pos, itemBox)) { - const [gx, gy] = gridify(relativeTo(pos, itemBox[0]), [ - 31 * 3, - 30 * 3, - ]); - const itemId = this.itemMx[gy][gx]; - if ( - (core.status.event.id == "viewMaps" || - core.status.event.id == "fly") && - itemId === "book" - ) - core.openBook(true); - if ( - core.isReplaying() || - core.status.lockControl || - core.isMoving() - ) - return; - useItem(itemId); - return; - } - const toolBox = makeBox( - [TOOL_BOX_LEFT, TOOL_BOX_TOP], - [31 * 4 * 3, 31 * 2 * 3] - ); - if (inRect(pos, toolBox)) { - const [row, col] = gridify(relativeTo(pos, toolBox[0]), [ - 31 * 3, - 31 * 3, - ]); - if (core.status.lockControl || core.isMoving()) return; - if (core.isReplaying()) { - this.replayAction[col][row].call(core); - } else if (core.isPlaying()) { - if (col === 0 && row === 3) { - core.doSL("autoSave", "load"); - } else if (col === 1 && row === 3) { - core.doSL("autoSave", "reload"); - } else { - this.toolbarAction[col][row].call(core, true); - } - } - return; - } - } - } - } + const itemBox = makeBox( + [ITEM_BOX_LEFT, ITEM_BOX_TOP], + [31 * 4 * 3, 30 * 6 * 3] + ); + if (inRect(pos, itemBox)) { + const [gx, gy] = gridify(relativeTo(pos, itemBox[0]), [ + 31 * 3, + 30 * 3, + ]); + const itemId = this.itemMx[gy][gx]; + if ( + (core.status.event.id == "viewMaps" || + core.status.event.id == "fly") && + itemId === "book" + ) + core.openBook(true); + if ( + core.isReplaying() || + core.status.lockControl || + core.isMoving() + ) + return; + useItem(itemId); + return; + } + const toolBox = makeBox( + [TOOL_BOX_LEFT, TOOL_BOX_TOP], + [31 * 4 * 3, 31 * 2 * 3] + ); + if (inRect(pos, toolBox)) { + const [row, col] = gridify(relativeTo(pos, toolBox[0]), [ + 31 * 3, + 31 * 3, + ]); + if (core.status.lockControl || core.isMoving()) return; + if (core.isReplaying()) { + this.replayAction[col][row].call(core); + } else if (core.isPlaying()) { + if (col === 0 && row === 3) { + core.doSL("autoSave", "load"); + } else if (col === 1 && row === 3) { + core.doSL("autoSave", "reload"); + } else { + this.toolbarAction[col][row].call(core, true); + } + } + return; + } + } + } + } - core.ui.statusBar = new StatusBar(); + core.ui.statusBar = new StatusBar(); - core.control.clearStatusBar = function () { - core.clearMap("outerUI"); - }; - // init() called in `afterLoadResources`. - }, + core.control.clearStatusBar = function () { + core.clearMap("outerUI"); + }; + // init() called in `afterLoadResources`. +}, "override": function () { core.statusBar.icons = { floor: 0, @@ -8728,8 +8724,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "音频系统": function () { - // 在此增加新插件 - /*首先,在造塔群下载所需的库文件,然后放置在塔目录下的 libs/thirdparty 或其他目录下,之后在 index.html 的最后加上下面这几行: + // 在此增加新插件 + /*首先,在造塔群下载所需的库文件,然后放置在塔目录下的 libs/thirdparty 或其他目录下,之后在 index.html 的最后加上下面这几行: @@ -8737,2086 +8733,2084 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = */ - // 将__enable置为false将关闭插件 - let __enable = true; - if (!__enable || main.mode === "editor") return; - const { OggOpusDecoderWebWorker } = window["ogg-opus-decoder"]; - const { OggVorbisDecoderWebWorker } = window["ogg-vorbis-decoder"]; - const { CodecParser } = window.CodecParser; - const { Transition, linear } = core.plugin.animate; - - const audio = new Audio(); - const AudioStatus = { - Playing: 0, - Pausing: 1, - Paused: 2, - Stoping: 3, - Stoped: 4, - }; - const supportMap = new Map(); - const AudioType = { - Mp3: "audio/mpeg", - Wav: 'audio/wav; codecs="1"', - Flac: "audio/flac", - Opus: 'audio/ogg; codecs="opus"', - Ogg: 'audio/ogg; codecs="vorbis"', - Aac: "audio/aac", - }; - /** - * 检查一种音频类型是否能被播放 - * @param type 音频类型 AudioType - */ - function isAudioSupport(type) { - if (supportMap.has(type)) return supportMap.get(type); - else { - const support = audio.canPlayType(type); - const canPlay = support === "maybe" || support === "probably"; - supportMap.set(type, canPlay); - return canPlay; - } - } - - const typeMap = new Map([ - ["ogg", AudioType.Ogg], - ["mp3", AudioType.Mp3], - ["wav", AudioType.Wav], - ["flac", AudioType.Flac], - ["opus", AudioType.Opus], - ["aac", AudioType.Aac], - ]); - - /** - * 根据文件名拓展猜测其类型 - * @param file 文件名 string - */ - function guessTypeByExt(file) { - const ext = /\.[a-zA-Z\d]+$/.exec(file); - if (!ext?.[0]) return ""; - const type = ext[0].slice(1); - return typeMap.get(type.toLocaleLowerCase()) ?? ""; - } - - isAudioSupport(AudioType.Ogg); - isAudioSupport(AudioType.Mp3); - isAudioSupport(AudioType.Wav); - isAudioSupport(AudioType.Flac); - isAudioSupport(AudioType.Opus); - isAudioSupport(AudioType.Aac); - - function isNil(value) { - return value === void 0 || value === null; - } - - function sleep(time) { - return new Promise((res) => setTimeout(res, time)); - } - class AudioEffect { - constructor(ac) {} - /** - * 连接至其他效果器 - * @param target 目标输入 IAudioInput - * @param output 当前效果器输出通道 Number - * @param input 目标效果器的输入通道 Number - */ - connect(target, output, input) { - this.output.connect(target.input, output, input); - } - - /** - * 与其他效果器取消连接 - * @param target 目标输入 IAudioInput - * @param output 当前效果器输出通道 Number - * @param input 目标效果器的输入通道 Number - */ - disconnect(target, output, input) { - if (!target) { - if (!isNil(output)) { - this.output.disconnect(output); - } else { - this.output.disconnect(); - } - } else { - if (!isNil(output)) { - if (!isNil(input)) { - this.output.disconnect(target.input, output, input); - } else { - this.output.disconnect(target.input, output); - } - } else { - this.output.disconnect(target.input); - } - } - } - } - - class StereoEffect extends AudioEffect { - constructor(ac) { - super(ac); - const panner = ac.createPanner(); - this.input = panner; - this.output = panner; - } - - /** - * 设置音频朝向,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 朝向x坐标 Number - * @param y 朝向y坐标 Number - * @param z 朝向z坐标 Number - */ - setOrientation(x, y, z) { - this.output.orientationX.value = x; - this.output.orientationY.value = y; - this.output.orientationZ.value = z; - } - /** - * 设置音频位置,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 位置x坐标 Number - * @param y 位置y坐标 Number - * @param z 位置z坐标 Number - */ - setPosition(x, y, z) { - this.output.positionX.value = x; - this.output.positionY.value = y; - this.output.positionZ.value = z; - } - end() {} - - start() {} - } - class VolumeEffect extends AudioEffect { - constructor(ac) { - super(ac); - const gain = ac.createGain(); - this.input = gain; - this.output = gain; - } - - /** - * 设置音量大小 - * @param volume 音量大小 Number - */ - setVolume(volume) { - this.output.gain.value = volume; - } - - /** - * 获取音量大小 Number - */ - getVolume() { - return this.output.gain.value; - } - - end() {} - - start() {} - } - class ChannelVolumeEffect extends AudioEffect { - /** 所有的音量控制节点 */ - - constructor(ac) { - super(ac); - /** 所有的音量控制节点 */ - this.gain = []; - const splitter = ac.createChannelSplitter(); - const merger = ac.createChannelMerger(); - this.output = merger; - this.input = splitter; - for (let i = 0; i < 6; i++) { - const gain = ac.createGain(); - splitter.connect(gain, i); - gain.connect(merger, 0, i); - this.gain.push(gain); - } - } - - /** - * 设置某个声道的音量大小 - * @param channel 要设置的声道,可填0-5 Number - * @param volume 这个声道的音量大小 Number - */ - setVolume(channel, volume) { - if (!this.gain[channel]) return; - this.gain[channel].gain.value = volume; - } - - /** - * 获取某个声道的音量大小,可填0-5 - * @param channel 要获取的声道 Number - */ - getVolume(channel) { - if (!this.gain[channel]) return 0; - return this.gain[channel].gain.value; - } - - end() {} - - start() {} - } - class DelayEffect extends AudioEffect { - constructor(ac) { - super(ac); - - const delay = ac.createDelay(); - this.input = delay; - this.output = delay; - } - - /** - * 设置延迟时长 - * @param delay 延迟时长,单位秒 Number - */ - setDelay(delay) { - this.output.delayTime.value = delay; - } - - /** - * 获取延迟时长 - */ - getDelay() { - return this.output.delayTime.value; - } - - end() {} - - start() {} - } - class EchoEffect extends AudioEffect { - constructor(ac) { - super(ac); - /** 当前增益 */ - this.gain = 0.5; - /** 是否正在播放 */ - this.playing = false; - const delay = ac.createDelay(); - const gain = ac.createGain(); - gain.gain.value = 0.5; - delay.delayTime.value = 0.05; - delay.connect(gain); - gain.connect(delay); - /** 延迟节点 */ - this.delay = delay; - /** 反馈增益节点 */ - this.gainNode = gain; - - this.input = gain; - this.output = gain; - } - - /** - * 设置回声反馈增益大小 - * @param gain 增益大小,范围 0-1,大于等于1的视为0.5,小于0的视为0 Number - */ - setFeedbackGain(gain) { - const resolved = gain >= 1 ? 0.5 : gain < 0 ? 0 : gain; - this.gain = resolved; - if (this.playing) this.gainNode.gain.value = resolved; - } - - /** - * 设置回声间隔时长 - * @param delay 回声时长,范围 0.01-Infinity,小于0.01的视为0.01 Number - */ - setEchoDelay(delay) { - const resolved = delay < 0.01 ? 0.01 : delay; - this.delay.delayTime.value = resolved; - } - - /** - * 获取反馈节点增益 - */ - getFeedbackGain() { - return this.gain; - } - - /** - * 获取回声间隔时长 - */ - getEchoDelay() { - return this.delay.delayTime.value; - } - - end() { - this.playing = false; - const echoTime = Math.ceil(Math.log(0.001) / Math.log(this.gain)) + 10; - sleep(this.delay.delayTime.value * echoTime).then(() => { - if (!this.playing) this.gainNode.gain.value = 0; - }); - } - - start() { - this.playing = true; - this.gainNode.gain.value = this.gain; - } - } - - class StreamLoader { - constructor(url) { - /** 传输目标 Set*/ - this.target = new Set(); - this.loading = false; - } - - /** - * 将加载流传递给字节流读取对象 - * @param reader 字节流读取对象 IStreamReader - */ - pipe(reader) { - if (this.loading) { - console.warn( - "Cannot pipe new StreamReader object when stream is loading." - ); - return; - } - this.target.add(reader); - reader.piped(this); - return this; - } - - async start() { - if (this.loading) return; - this.loading = true; - const response = await window.fetch(this.url); - const stream = response.body; - if (!stream) { - console.error("Cannot get reader when fetching '" + this.url + "'."); - return; - } - // 获取读取器 - this.stream = stream; - const reader = response.body?.getReader(); - const targets = [...this.target]; - - await Promise.all(targets.map((v) => v.start(stream, this, response))); - if (reader && reader.read) { - // 开始流传输 - while (true) { - const { value, done } = await reader.read(); - await Promise.all( - targets.map((v) => v.pump(value, done, response)) - ); - if (done) break; - } - } else { - // 如果不支持流传输 - const buffer = await response.arrayBuffer(); - const data = new Uint8Array(buffer); - await Promise.all(targets.map((v) => v.pump(data, true, response))); - } - - this.loading = false; - targets.forEach((v) => v.end(true)); - - // - } - - cancel(reason) { - if (!this.stream) return; - this.stream.cancel(reason); - this.loading = false; - this.target.forEach((v) => v.end(false, reason)); - } - } - const fileSignatures = [ - [AudioType.Mp3, [0x49, 0x44, 0x33]], - [AudioType.Ogg, [0x4f, 0x67, 0x67, 0x53]], - [AudioType.Wav, [0x52, 0x49, 0x46, 0x46]], - [AudioType.Flac, [0x66, 0x4c, 0x61, 0x43]], - [AudioType.Aac, [0xff, 0xf1]], - [AudioType.Aac, [0xff, 0xf9]], - ]; - const oggHeaders = [ - [AudioType.Opus, [0x4f, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64]], - ]; - - function checkAudioType(data) { - let audioType = ""; - // 检查头文件获取音频类型,仅检查前256个字节 - const toCheck = data.slice(0, 256); - for (const [type, value] of fileSignatures) { - if (value.every((v, i) => toCheck[i] === v)) { - audioType = type; - break; - } - } - if (audioType === AudioType.Ogg) { - // 如果是ogg的话,进一步判断是不是opus - for (const [key, value] of oggHeaders) { - const has = toCheck.some((_, i) => { - return value.every((v, ii) => toCheck[i + ii] === v); - }); - if (has) { - audioType = key; - break; - } - } - } - - return audioType; - } - class AudioDecoder { - /** - * 注册一个解码器 - * @param type 要注册的解码器允许解码的类型 - * @param decoder 解码器对象 - */ - static registerDecoder(type, decoder) { - if (!this.decoderMap) this.decoderMap = new Map(); - if (this.decoderMap.has(type)) { - console.warn( - "Audio stream decoder for audio type '" + - type + - "' has already existed." - ); - return; - } - - this.decoderMap.set(type, decoder); - } - - /** - * 解码音频数据 - * @param data 音频文件数据 - * @param player AudioPlayer实例 - */ - static async decodeAudioData(data, player) { - // 检查头文件获取音频类型,仅检查前256个字节 - const toCheck = data.slice(0, 256); - const type = checkAudioType(data); - if (type === "") { - console.error( - "Unknown audio type. Header: '" + - [...toCheck] - .map((v) => v.toString().padStart(2, "0")) - .join(" ") - .toUpperCase() + - "'" - ); - return null; - } - if (isAudioSupport(type)) { - if (data.buffer instanceof ArrayBuffer) { - return player.ac.decodeAudioData(data.buffer); - } else { - return null; - } - } else { - const Decoder = this.decoderMap.get(type); - if (!Decoder) { - return null; - } else { - const decoder = new Decoder(); - await decoder.create(); - const decodedData = await decoder.decode(data); - if (!decodedData) return null; - const buffer = player.ac.createBuffer( - decodedData.channelData.length, - decodedData.channelData[0].length, - decodedData.sampleRate - ); - decodedData.channelData.forEach((v, i) => { - buffer.copyToChannel(v, i); - }); - decoder.destroy(); - return buffer; - } - } - } - } - - class VorbisDecoder { - /** - * 创建音频解码器 - */ - async create() { - this.decoder = new OggVorbisDecoderWebWorker(); - await this.decoder.ready; - } - /** - * 摧毁这个解码器 - */ - destroy() { - this.decoder?.free(); - } - /** - * 解码流数据 - * @param data 流数据 - */ - - async decode(data) { - return this.decoder?.decode(data); - } - /** - * 解码整个文件 - * @param data 文件数据 - */ - async decodeAll(data) { - return this.decoder?.decodeFile(data); - } - /** - * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 - */ - async flush() { - return this.decoder?.flush(); - } - } - - class OpusDecoder { - /** - * 创建音频解码器 - */ - async create() { - this.decoder = new OggOpusDecoderWebWorker(); - await this.decoder.ready; - } - /** - * 摧毁这个解码器 - */ - destroy() { - this.decoder?.free(); - } - /** - * 解码流数据 - * @param data 流数据 - */ - async decode(data) { - return this.decoder?.decode(data); - } - /** - * 解码整个文件 - * @param data 文件数据 - */ - async decodeAll(data) { - return this.decoder?.decodeFile(data); - } - /** - * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 - */ - async flush() { - return await this.decoder?.flush(); - } - } - const mimeTypeMap = { - [AudioType.Aac]: "audio/aac", - [AudioType.Flac]: "audio/flac", - [AudioType.Mp3]: "audio/mpeg", - [AudioType.Ogg]: "application/ogg", - [AudioType.Opus]: "application/ogg", - [AudioType.Wav]: "application/ogg", - }; - - function isOggPage(data) { - return !isNil(data.isFirstPage); - } - class AudioStreamSource { - route; - constructor(context) { - this.output = context.createBufferSource(); - /** 是否已经完全加载完毕 */ - this.loaded = false; - /** 是否正在播放 */ - this.playing = false; - /** 已经缓冲了多长时间,如果缓冲完那么跟歌曲时长一致 */ - this.buffered = 0; - /** 已经缓冲的采样点数量 */ - this.bufferedSamples = 0; - /** 歌曲时长,加载完毕之前保持为 0 */ - this.duration = 0; - /** 在流传输阶段,至少缓冲多长时间的音频之后才开始播放,单位秒 */ - this.bufferPlayDuration = 1; - /** 音频的采样率,未成功解析出之前保持为 0 */ - this.sampleRate = 0; - //是否循环播放 - this.loop = false; - /** 上一次播放是从何时开始的 */ - this.lastStartWhen = 0; - /** 开始播放时刻 */ - this.lastStartTime = 0; - /** 上一次播放的缓存长度 */ - this.lastBufferSamples = 0; - - /** 是否已经获取到头文件 */ - this.headerRecieved = false; - /** 音频类型 */ - this.audioType = ""; - /** 每多长时间组成一个缓存 Float32Array */ - this.bufferChunkSize = 10; - /** 缓存音频数据,每 bufferChunkSize 秒钟组成一个 Float32Array,用于流式解码 */ - this.audioData = []; - - this.errored = false; - this.ac = context; - } - /** 当前已经播放了多长时间 */ - get currentTime() { - return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; - } - /** - * 设置每个缓存数据的大小,默认为10秒钟一个缓存数据 - * @param size 每个缓存数据的时长,单位秒 - */ - setChunkSize(size) { - if (this.controller?.loading || this.loaded) return; - this.bufferChunkSize = size; - } - - piped(controller) { - this.controller = controller; - } - - async pump(data, done) { - if (!data || this.errored) return; - if (!this.headerRecieved) { - // 检查头文件获取音频类型,仅检查前256个字节 - const toCheck = data.slice(0, 256); - this.audioType = checkAudioType(data); - if (!this.audioType) { - console.error( - "Unknown audio type. Header: '" + - [...toCheck] - .map((v) => v.toString(16).padStart(2, "0")) - .join(" ") - .toUpperCase() + - "'" - ); - return; - } - // 创建解码器 - const Decoder = AudioDecoder.decoderMap.get(this.audioType); - if (!Decoder) { - this.errored = true; - console.error( - "Cannot decode stream source type of '" + - this.audioType + - "', since there is no registered decoder for that type." - ); - return Promise.reject( - `Cannot decode stream source type of '${this.audioType}', since there is no registered decoder for that type.` - ); - } - this.decoder = new Decoder(); - // 创建数据解析器 - const mime = mimeTypeMap[this.audioType]; - const parser = new CodecParser(mime); - this.parser = parser; - await this.decoder.create(); - this.headerRecieved = true; - } - - const decoder = this.decoder; - const parser = this.parser; - if (!decoder || !parser) { - this.errored = true; - return Promise.reject( - "No parser or decoder attached in this AudioStreamSource" - ); - } - - await this.decodeData(data, decoder, parser); - if (done) await this.decodeFlushData(decoder, parser); - this.checkBufferedPlay(); - } - - /** - * 检查采样率,如果还未解析出采样率,那么将设置采样率,如果当前采样率与之前不同,那么发出警告 - */ - checkSampleRate(info) { - for (const one of info) { - const frame = isOggPage(one) ? one.codecFrames[0] : one; - if (frame) { - const rate = frame.header.sampleRate; - if (this.sampleRate === 0) { - this.sampleRate = rate; - break; - } else { - if (rate !== this.sampleRate) { - console.warn("Sample rate in stream audio must be constant."); - } - } - } - } - } - - /** - * 解析音频数据 - */ - async decodeData(data, decoder, parser) { - // 解析音频数据 - const audioData = await decoder.decode(data); - if (!audioData) return; - // @ts-expect-error 库类型声明错误 - const audioInfo = [...parser.parseChunk(data)]; - - // 检查采样率 - this.checkSampleRate(audioInfo); - // 追加音频数据 - this.appendDecodedData(audioData, audioInfo); - } - - /** - * 解码剩余数据 - */ - async decodeFlushData(decoder, parser) { - const audioData = await decoder.flush(); - if (!audioData) return; - // @ts-expect-error 库类型声明错误 - const audioInfo = [...parser.flush()]; - - this.checkSampleRate(audioInfo); - this.appendDecodedData(audioData, audioInfo); - } - - /** - * 追加音频数据 - */ - appendDecodedData(data, info) { - const channels = data.channelData.length; - if (channels === 0) return; - if (this.audioData.length !== channels) { - this.audioData = []; - for (let i = 0; i < channels; i++) { - this.audioData.push([]); - } - } - // 计算出应该放在哪 - const chunk = this.sampleRate * this.bufferChunkSize; - const sampled = this.bufferedSamples; - const pushIndex = Math.floor(sampled / chunk); - const bufferIndex = sampled % chunk; - const dataLength = data.channelData[0].length; - let buffered = 0; - let nowIndex = pushIndex; - let toBuffer = bufferIndex; - while (buffered < dataLength) { - const rest = toBuffer !== 0 ? chunk - bufferIndex : chunk; - - for (let i = 0; i < channels; i++) { - const audioData = this.audioData[i]; - if (!audioData[nowIndex]) { - audioData.push(new Float32Array(chunk)); - } - const toPush = data.channelData[i].slice(buffered, buffered + rest); - - audioData[nowIndex].set(toPush, toBuffer); - } - buffered += rest; - nowIndex++; - toBuffer = 0; - } - - this.buffered += - info.reduce((prev, curr) => prev + curr.duration, 0) / 1000; - this.bufferedSamples += info.reduce( - (prev, curr) => prev + curr.samples, - 0 - ); - } - - /** - * 检查已缓冲内容,并在未开始播放时播放 - */ - checkBufferedPlay() { - if (this.playing || this.sampleRate === 0) return; - const played = this.lastBufferSamples / this.sampleRate; - const dt = this.buffered - played; - if (this.loaded) { - this.playAudio(played); - return; - } - if (dt < this.bufferPlayDuration) return; - - this.lastBufferSamples = this.bufferedSamples; - // 需要播放 - this.mergeBuffers(); - if (!this.buffer) return; - if (this.playing) this.output.stop(); - this.createSourceNode(this.buffer); - this.output.loop = false; - this.output.start(0, played); - this.lastStartTime = this.ac.currentTime; - this.playing = true; - this.output.addEventListener("ended", () => { - this.playing = false; - this.checkBufferedPlay(); - }); - } - - mergeBuffers() { - const buffer = this.ac.createBuffer( - this.audioData.length, - this.bufferedSamples, - this.sampleRate - ); - const chunk = this.sampleRate * this.bufferChunkSize; - const bufferedChunks = Math.floor(this.bufferedSamples / chunk); - const restLength = this.bufferedSamples % chunk; - for (let i = 0; i < this.audioData.length; i++) { - const audio = this.audioData[i]; - const data = new Float32Array(this.bufferedSamples); - for (let j = 0; j < bufferedChunks; j++) { - data.set(audio[j], chunk * j); - } - if (restLength !== 0) { - data.set( - audio[bufferedChunks].slice(0, restLength), - chunk * bufferedChunks - ); - } - - buffer.copyToChannel(data, i, 0); - } - this.buffer = buffer; - } - - async start() { - delete this.buffer; - this.headerRecieved = false; - this.audioType = ""; - this.errored = false; - this.buffered = 0; - this.sampleRate = 0; - this.bufferedSamples = 0; - this.duration = 0; - this.loaded = false; - if (this.playing) this.output.stop(); - this.playing = false; - this.lastStartTime = this.ac.currentTime; - } - - end(done, reason) { - if (done && this.buffer) { - this.loaded = true; - delete this.controller; - this.mergeBuffers(); - - this.duration = this.buffered; - this.audioData = []; - this.decoder?.destroy(); - delete this.decoder; - delete this.parser; - } else { - console.warn( - "Unexpected end when loading stream audio, reason: '" + - (reason ?? "") + - "'" - ); - } - } - - playAudio(when) { - if (!this.buffer) return; - this.lastStartTime = this.ac.currentTime; - if (this.playing) this.output.stop(); - if (this.route.status !== AudioStatus.Playing) { - this.route.status = AudioStatus.Playing; - } - this.createSourceNode(this.buffer); - this.output.start(0, when); - this.playing = true; - - this.output.addEventListener("ended", () => { - this.playing = false; - if (this.route.status === AudioStatus.Playing) { - this.route.status = AudioStatus.Stoped; - } - if (this.loop && !this.output.loop) this.play(0); - }); - } - /** - * 开始播放这个音频源 - */ - play(when) { - if (this.playing || this.errored) return; - if (this.loaded && this.buffer) { - this.playing = true; - this.playAudio(when); - } else { - this.controller?.start(); - } - } - - createSourceNode(buffer) { - if (!this.target) return; - const node = this.ac.createBufferSource(); - node.buffer = buffer; - if (this.playing) this.output.stop(); - this.playing = false; - this.output = node; - node.connect(this.target.input); - node.loop = this.loop; - } - /** - * 停止播放这个音频源 - * @returns 音频暂停的时刻 number - */ - stop() { - if (this.playing) this.output.stop(); - this.playing = false; - return this.ac.currentTime - this.lastStartTime; - } - /** - * 连接到音频路由图上,每次调用播放的时候都会执行一次 - * @param target 连接至的目标 IAudioInput - */ - connect(target) { - this.target = target; - } - /** - * 设置是否循环播放 - * @param loop 是否循环 boolean) - */ - setLoop(loop) { - this.loop = loop; - } - } - class AudioElementSource { - route; - constructor(context) { - const audio = new Audio(); - audio.preload = "none"; - this.output = context.createMediaElementSource(audio); - this.audio = audio; - this.ac = context; - audio.addEventListener("play", () => { - this.playing = true; - if (this.route.status !== AudioStatus.Playing) { - this.route.status = AudioStatus.Playing; - } - }); - audio.addEventListener("ended", () => { - this.playing = false; - if (this.route.status === AudioStatus.Playing) { - this.route.status = AudioStatus.Stoped; - } - }); - } - get duration() { - return this.audio.duration; - } - get currentTime() { - return this.audio.currentTime; - } - /** - * 设置音频源的路径 - * @param url 音频路径 - */ - setSource(url) { - this.audio.src = url; - } - - play(when = 0) { - if (this.playing) return; - this.audio.currentTime = when; - this.audio.play(); - } - - stop() { - this.audio.pause(); - this.playing = false; - if (this.route.status === AudioStatus.Playing) { - this.route.status = AudioStatus.Stoped; - } - return this.audio.currentTime; - } - - connect(target) { - this.output.connect(target.input); - } - - setLoop(loop) { - this.audio.loop = loop; - } - } - class AudioBufferSource { - route; - constructor(context) { - this.output = context.createBufferSource(); - /** 是否循环 */ - this.loop = false; - /** 上一次播放是从何时开始的 */ - this.lastStartWhen = 0; - /** 播放开始时刻 */ - this.lastStartTime = 0; - this.duration = 0; - this.ac = context; - } - get currentTime() { - return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; - } - - /** - * 设置音频源数据 - * @param buffer 音频源,可以是未解析的 ArrayBuffer,也可以是已解析的 AudioBuffer - */ - async setBuffer(buffer) { - if (buffer instanceof ArrayBuffer) { - this.buffer = await this.ac.decodeAudioData(buffer); - } else { - this.buffer = buffer; - } - this.duration = this.buffer.duration; - } - - play(when) { - if (this.playing || !this.buffer) return; - this.playing = true; - this.lastStartTime = this.ac.currentTime; - if (this.route.status !== AudioStatus.Playing) { - this.route.status = AudioStatus.Playing; - } - this.createSourceNode(this.buffer); - this.output.start(0, when); - this.output.addEventListener("ended", () => { - this.playing = false; - if (this.route.status === AudioStatus.Playing) { - this.route.status = AudioStatus.Stoped; - } - if (this.loop && !this.output.loop) this.play(0); - }); - } - - createSourceNode(buffer) { - if (!this.target) return; - const node = this.ac.createBufferSource(); - node.buffer = buffer; - this.output = node; - node.connect(this.target.input); - node.loop = this.loop; - } - - stop() { - this.output.stop(); - return this.ac.currentTime - this.lastStartTime; - } - - connect(target) { - this.target = target; - } - - setLoop(loop) { - this.loop = loop; - } - } - class AudioPlayer { - constructor() { - /** 音频播放上下文 */ - this.ac = new AudioContext(); - /** 音量节点 */ - this.gain = this.ac.createGain(); - this.gain.connect(this.ac.destination); - this.audioRoutes = new Map(); - } - /** - * 解码音频数据 - * @param data 音频数据 - */ - decodeAudioData(data) { - return AudioDecoder.decodeAudioData(data, this); - } - /** - * 设置音量 - * @param volume 音量 - */ - setVolume(volume) { - this.gain.gain.value = volume; - } - - /** - * 获取音量 - */ - getVolume() { - return this.gain.gain.value; - } - - /** - * 创建一个音频源 - * @param Source 音频源类 - */ - createSource(Source) { - return new Source(this.ac); - } - - /** - * 创建一个兼容流式音频源,可以与流式加载相结合,主要用于处理 opus ogg 不兼容的情况 - */ - createStreamSource() { - return new AudioStreamSource(this.ac); - } - - /** - * 创建一个通过 audio 元素播放的音频源 - */ - createElementSource() { - return new AudioElementSource(this.ac); - } - - /** - * 创建一个通过 AudioBuffer 播放的音频源 - */ - createBufferSource() { - return new AudioBufferSource(this.ac); - } - - /** - * 获取音频目的地 - */ - getDestination() { - return this.gain; - } - - /** - * 创建一个音频效果器 - * @param Effect 效果器类 - */ - createEffect(Effect) { - return new Effect(this.ac); - } - - /** - * 创建一个修改音量的效果器 - * ```txt - * |----------| - * Input ----> | GainNode | ----> Output - * |----------| - * ``` - */ - createVolumeEffect() { - return new VolumeEffect(this.ac); - } - - /** - * 创建一个立体声效果器 - * ```txt - * |------------| - * Input ----> | PannerNode | ----> Output - * |------------| - * ``` - */ - createStereoEffect() { - return new StereoEffect(this.ac); - } - - /** - * 创建一个修改单个声道音量的效果器 - * ```txt - * |----------| - * -> | GainNode | \ - * |--------------| / |----------| -> |------------| - * Input ----> | SplitterNode | ...... | MergerNode | ----> Output - * |--------------| \ |----------| -> |------------| - * -> | GainNode | / - * |----------| - * ``` - */ - createChannelVolumeEffect() { - return new ChannelVolumeEffect(this.ac); - } - - /** - * 创建一个延迟效果器 - * |-----------| - * Input ----> | DelayNode | ----> Output - * |-----------| - */ - createDelay() { - return new DelayEffect(this.ac); - } - - /** - * 创建一个回声效果器 - * ```txt - * |----------| - * Input ----> | GainNode | ----> Output - * ^ |----------| | - * | | - * | |------------| ↓ - * |-- | Delay Node | <-- - * |------------| - * ``` - */ - createEchoEffect() { - return new EchoEffect(this.ac); - } - - /** - * 创建一个音频播放路由 - * @param source 音频源 - */ - createRoute(source) { - return new AudioRoute(source, this); - } - - /** - * 添加一个音频播放路由,可以直接被播放 - * @param id 这个音频播放路由的名称 - * @param route 音频播放路由对象 - */ - addRoute(id, route) { - if (!this.audioRoutes) this.audioRoutes = new Map(); - if (this.audioRoutes.has(id)) { - console.warn( - "Audio route with id of '" + - id + - "' has already existed. New route will override old route." - ); - } - this.audioRoutes.set(id, route); - } - - /** - * 根据名称获取音频播放路由对象 - * @param id 音频播放路由的名称 - */ - getRoute(id) { - return this.audioRoutes.get(id); - } - /** - * 移除一个音频播放路由 - * @param id 要移除的播放路由的名称 - */ - removeRoute(id) { - this.audioRoutes.delete(id); - } - /** - * 播放音频 - * @param id 音频名称 - * @param when 从音频的哪个位置开始播放,单位秒 - */ - play(id, when) { - const route = this.getRoute(id); - if (!route) { - console.warn( - "Cannot play audio route '" + - id + - "', since there is not added route named it." - ); - return; - } - - route.play(when); - } - - /** - * 暂停音频播放 - * @param id 音频名称 - * @returns 当音乐真正停止时兑现 - */ - pause(id) { - const route = this.getRoute(id); - if (!route) { - console.warn( - "Cannot pause audio route '" + - id + - "', since there is not added route named it." - ); - return; - } - return route.pause(); - } - - /** - * 停止音频播放 - * @param id 音频名称 - * @returns 当音乐真正停止时兑现 - */ - stop(id) { - const route = this.getRoute(id); - if (!route) { - console.warn( - "Cannot stop audio route '" + - id + - "', since there is not added route named it." - ); - return; - } - return route.stop(); - } - - /** - * 继续音频播放 - * @param id 音频名称 - */ - resume(id) { - const route = this.getRoute(id); - if (!route) { - console.warn( - "Cannot pause audio route '" + - id + - "', since there is not added route named it." - ); - return; - } - route.resume(); - } - - /** - * 设置听者位置,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 位置x坐标 - * @param y 位置y坐标 - * @param z 位置z坐标 - */ - setListenerPosition(x, y, z) { - const listener = this.ac.listener; - listener.positionX.value = x; - listener.positionY.value = y; - listener.positionZ.value = z; - } - - /** - * 设置听者朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 朝向x坐标 - * @param y 朝向y坐标 - * @param z 朝向z坐标 - */ - setListenerOrientation(x, y, z) { - const listener = this.ac.listener; - listener.forwardX.value = x; - listener.forwardY.value = y; - listener.forwardZ.value = z; - } - - /** - * 设置听者头顶朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 头顶朝向x坐标 - * @param y 头顶朝向y坐标 - * @param z 头顶朝向z坐标 - */ - setListenerUp(x, y, z) { - const listener = this.ac.listener; - listener.upX.value = x; - listener.upY.value = y; - listener.upZ.value = z; - } - } - class AudioRoute { - constructor(source, player) { - source.route = this; - this.output = source.output; - - /** 效果器路由图 */ - this.effectRoute = []; - - /** 结束时长,当音频暂停或停止时,会经过这么长时间之后才真正终止播放,期间可以做音频淡入淡出等效果 */ - this.endTime = 0; - /** 暂停时播放了多长时间 */ - this.pauseCurrentTime = 0; - /** 当前播放状态 */ - this.player = player; - this.status = AudioStatus.Stoped; - - this.shouldStop = false; - /** - * 每次暂停或停止时自增,用于判断当前正在处理的情况。 - * 假如暂停后很快播放,然后很快暂停,那么需要根据这个来判断实际是否应该执行暂停后操作 - */ - this.stopIdentifier = 0; - /** 暂停时刻 */ - this.pauseTime = 0; - this.source = source; - this.source.player = player; - } - /** 音频时长,单位秒 */ - get duration() { - return this.source.duration; - } - /** 当前播放了多长时间,单位秒 */ - get currentTime() { - if (this.status === AudioStatus.Paused) { - return this.pauseCurrentTime; - } else { - return this.source.currentTime; - } - } - set currentTime(time) { - this.source.stop(); - this.source.play(time); - } - /** - * 设置结束时间,暂停或停止时,会经过这么长时间才终止音频的播放,这期间可以做一下音频淡出的效果。 - * @param time 暂停或停止时,经过多长时间之后才会结束音频的播放 - */ - setEndTime(time) { - this.endTime = time; - } - - /** - * 当音频播放时执行的函数,可以用于音频淡入效果 - * @param fn 音频开始播放时执行的函数 - */ - onStart(fn) { - this.audioStartHook = fn; - } - - /** - * 当音频暂停或停止时执行的函数,可以用于音频淡出效果 - * @param fn 音频在暂停或停止时执行的函数,不填时表示取消这个钩子。 - * 包含两个参数,第一个参数是结束时长,第二个参数是当前音频播放路由对象 - */ - onEnd(fn) { - this.audioEndHook = fn; - } - - /** - * 开始播放这个音频 - * @param when 从音频的什么时候开始播放,单位秒 - */ - async play(when = 0) { - if (this.status === AudioStatus.Playing) return; - this.link(); - await this.player.ac.resume(); - if (this.effectRoute.length > 0) { - const first = this.effectRoute[0]; - this.source.connect(first); - const last = this.effectRoute.at(-1); - last.connect({ input: this.player.getDestination() }); - } else { - this.source.connect({ input: this.player.getDestination() }); - } - this.source.play(when); - this.status = AudioStatus.Playing; - this.pauseTime = 0; - this.audioStartHook?.(this); - this.startAllEffect(); - if (this.status !== AudioStatus.Playing) { - this.status = AudioStatus.Playing; - } - } - - /** - * 暂停音频播放 - */ - async pause() { - if (this.status !== AudioStatus.Playing) return; - this.status = AudioStatus.Pausing; - this.stopIdentifier++; - const identifier = this.stopIdentifier; - if (this.audioEndHook) { - this.audioEndHook(this.endTime, this); - await sleep(this.endTime); - } - if ( - this.status !== AudioStatus.Pausing || - this.stopIdentifier !== identifier - ) { - return; - } - this.pauseCurrentTime = this.source.currentTime; - const time = this.source.stop(); - this.pauseTime = time; - if (this.shouldStop) { - this.status = AudioStatus.Stoped; - this.endAllEffect(); - - this.shouldStop = false; - } else { - this.status = AudioStatus.Paused; - this.endAllEffect(); - } - this.endAllEffect(); - } - - /** - * 继续音频播放 - */ - resume() { - if (this.status === AudioStatus.Playing) return; - if ( - this.status === AudioStatus.Pausing || - this.status === AudioStatus.Stoping - ) { - this.audioStartHook?.(this); - - return; - } - if (this.status === AudioStatus.Paused) { - this.play(this.pauseTime); - } else { - this.play(0); - } - this.status = AudioStatus.Playing; - this.pauseTime = 0; - this.audioStartHook?.(this); - this.startAllEffect(); - } - - /** - * 停止音频播放 - */ - async stop() { - if (this.status !== AudioStatus.Playing) { - if (this.status === AudioStatus.Pausing) { - this.shouldStop = true; - } - return; - } - this.status = AudioStatus.Stoping; - this.stopIdentifier++; - const identifier = this.stopIdentifier; - if (this.audioEndHook) { - this.audioEndHook(this.endTime, this); - await sleep(this.endTime); - } - if ( - this.status !== AudioStatus.Stoping || - this.stopIdentifier !== identifier - ) { - return; - } - this.source.stop(); - this.status = AudioStatus.Stoped; - this.pauseTime = 0; - this.endAllEffect(); - } - - /** - * 添加效果器 - * @param effect 要添加的效果,可以是数组,表示一次添加多个 - * @param index 从哪个位置开始添加,如果大于数组长度,那么加到末尾,如果小于0,那么将会从后面往前数。默认添加到末尾 - */ - addEffect(effect, index) { - if (isNil(index)) { - if (effect instanceof Array) { - this.effectRoute.push(...effect); - } else { - this.effectRoute.push(effect); - } - } else { - if (effect instanceof Array) { - this.effectRoute.splice(index, 0, ...effect); - } else { - this.effectRoute.splice(index, 0, effect); - } - } - this.setOutput(); - if (this.source.playing) this.link(); - } - - /** - * 移除一个效果器 - * @param effect 要移除的效果 - */ - removeEffect(effect) { - const index = this.effectRoute.indexOf(effect); - if (index === -1) return; - this.effectRoute.splice(index, 1); - effect.disconnect(); - this.setOutput(); - if (this.source.playing) this.link(); - } - - setOutput() { - const effect = this.effectRoute.at(-1); - if (!effect) this.output = this.source.output; - else this.output = effect.output; - } - - /** - * 连接音频路由图 - */ - link() { - this.effectRoute.forEach((v) => v.disconnect()); - this.effectRoute.forEach((v, i) => { - const next = this.effectRoute[i + 1]; - if (next) { - v.connect(next); - } - }); - } - - startAllEffect() { - this.effectRoute.forEach((v) => v.start()); - } - - endAllEffect() { - this.effectRoute.forEach((v) => v.end()); - } - } - - const audioPlayer = new AudioPlayer(); - - class BgmController { - constructor(player) { - this.mainGain = player.createVolumeEffect(); - this.player = player; - /** bgm音频名称的前缀 */ - this.prefix = "bgms."; - /** 每个 bgm 的音量控制器 */ - this.gain = new Map(); - - /** 正在播放的 bgm */ - this.playingBgm = ""; - /** 是否正在播放 */ - this.playing = false; - - /** 是否已经启用 */ - this.enabled = true; - /** 是否屏蔽所有的音乐切换 */ - this.blocking = false; - /** 渐变时长 */ - this.transitionTime = 2000; - } - - /** - * 设置音频渐变时长 - * @param time 渐变时长 - */ - setTransitionTime(time) { - this.transitionTime = time; - for (const [, value] of this.gain) { - value.transition.time(time); - } - } - - /** - * 屏蔽音乐切换 - */ - blockChange() { - this.blocking = true; - } - - /** - * 取消屏蔽音乐切换 - */ - unblockChange() { - this.blocking = false; - } - - /** - * 设置总音量大小 - * @param volume 音量大小 - */ - setVolume(volume) { - this.mainGain.setVolume(volume); - this._volume = volume; - } - /** - * 获取总音量大小 - */ - getVolume() { - return this.mainGain.getVolume(); - } - /** - * 设置是否启用 - * @param enabled 是否启用 - */ - setEnabled(enabled) { - if (enabled) this.resume(); - else this.stop(); - this.enabled = enabled; - } - - /** - * 设置 bgm 音频名称的前缀 - */ - setPrefix(prefix) { - this.prefix = prefix; - } - - getId(name) { - return `${this.prefix}${name}`; - } - - /** - * 根据 bgm 名称获取其 AudioRoute 实例 - * @param id 音频名称 - */ - get(id) { - return this.player.getRoute(this.getId(id)); - } - - /** - * 添加一个 bgm - * @param id 要添加的 bgm 的名称 - * @param url 指定 bgm 的加载地址 - */ - addBgm(id, url = `project/bgms/${id}`) { - const type = guessTypeByExt(id); - if (!type) { - console.warn( - "Unknown audio extension name: '" + - id.split(".").slice(0, -1).join(".") + - "'" - ); - return; - } - const gain = this.player.createVolumeEffect(); - if (isAudioSupport(type)) { - const source = audioPlayer.createElementSource(); - source.setSource(url); - source.setLoop(true); - const route = new AudioRoute(source, audioPlayer); - route.addEffect([gain, this.mainGain]); - audioPlayer.addRoute(this.getId(id), route); - this.setTransition(id, route, gain); - } else { - const source = audioPlayer.createStreamSource(); - const stream = new StreamLoader(url); - stream.pipe(source); - source.setLoop(true); - const route = new AudioRoute(source, audioPlayer); - route.addEffect([gain, this.mainGain]); - audioPlayer.addRoute(this.getId(id), route); - this.setTransition(id, route, gain); - } - } - - /** - * 移除一个 bgm - * @param id 要移除的 bgm 的名称 - */ - removeBgm(id) { - this.player.removeRoute(this.getId(id)); - const gain = this.gain.get(id); - gain?.transition.ticker.destroy(); - this.gain.delete(id); - } - - setTransition(id, route, gain) { - const transition = new Transition(); - transition - .time(this.transitionTime) - .mode(linear()) - .transition("volume", 0); - - const tick = () => { - gain.setVolume(transition.value.volume); - }; - - /** - * @param expect 在结束时应该是正在播放还是停止 - */ - const setTick = async (expect) => { - transition.ticker.remove(tick); - transition.ticker.add(tick); - const identifier = route.stopIdentifier; - await sleep(this.transitionTime + 500); - if (route.status === expect && identifier === route.stopIdentifier) { - transition.ticker.remove(tick); - if (route.status === AudioStatus.Playing) { - gain.setVolume(1); - } else { - gain.setVolume(0); - } - } - }; - - route.onStart(async () => { - transition.transition("volume", 1); - setTick(AudioStatus.Playing); - }); - route.onEnd(() => { - transition.transition("volume", 0); - setTick(AudioStatus.Paused); - }); - route.setEndTime(this.transitionTime); - - this.gain.set(id, { effect: gain, transition }); - } - - /** - * 播放一个 bgm - * @param id 要播放的 bgm 名称 - */ - play(id, when) { - if (this.blocking) return; - if (id !== this.playingBgm && this.playingBgm) { - this.player.pause(this.getId(this.playingBgm)); - } - this.playingBgm = id; - if (!this.enabled) return; - this.player.play(this.getId(id), when); - this.playing = true; - } - - /** - * 继续当前的 bgm - */ - resume() { - if (this.blocking || !this.enabled || this.playing) return; - if (this.playingBgm) { - this.player.resume(this.getId(this.playingBgm)); - } - this.playing = true; - } - - /** - * 暂停当前的 bgm - */ - pause() { - if (this.blocking || !this.enabled) return; - if (this.playingBgm) { - this.player.pause(this.getId(this.playingBgm)); - } - this.playing = false; - } - - /** - * 停止当前的 bgm - */ - stop() { - if (this.blocking || !this.enabled) return; - if (this.playingBgm) { - this.player.stop(this.getId(this.playingBgm)); - } - this.playing = false; - } - } - const bgmController = new BgmController(audioPlayer); - - class SoundPlayer { - constructor(player) { - /** 每个音效的唯一标识符 */ - this.num = 0; - this.enabled = true; - this.gain = player.createVolumeEffect(); - /** 每个音效的数据 */ - this.buffer = new Map(); - /** 所有正在播放的音乐 */ - this.playing = new Set(); - this.player = player; - } - /** - * 设置是否启用音效 - * @param enabled 是否启用音效 - */ - setEnabled(enabled) { - if (!enabled) this.stopAllSounds(); - this.enabled = enabled; - } - - /** - * 设置音量大小 - * @param volume 音量大小 - */ - setVolume(volume) { - this.gain.setVolume(volume); - } - /** - * 获取音量大小 - */ - getVolume() { - return this.gain.getVolume(); - } - /** - * 添加一个音效 - * @param id 音效名称 - * @param data 音效的Uint8Array数据 - */ - async add(id, data) { - const buffer = await this.player.decodeAudioData(data); - if (!buffer) { - console.warn( - "Cannot decode sound '" + - id + - "', since audio file may not supported by 2.b." - ); - return; - } - this.buffer.set(id, buffer); - } - - /** - * 播放一个音效 - * @param id 音效名称 - * @param position 音频位置,[0, 0, 0]表示正中心,x轴指向水平向右,y轴指向水平向上,z轴指向竖直向上 - * @param orientation 音频朝向,[0, 1, 0]表示朝向前方 - */ - play(id, position = [0, 0, 0], orientation = [1, 0, 0]) { - if (!this.enabled) return -1; - const buffer = this.buffer.get(id); - if (!buffer) { - console.warn( - "Cannot play sound '" + - id + - "', since there is no added data named it." - ); - return -1; - } - const soundNum = this.num++; - - const source = this.player.createBufferSource(); - source.setBuffer(buffer); - const route = this.player.createRoute(source); - const stereo = this.player.createStereoEffect(); - stereo.setPosition(position[0], position[1], position[2]); - stereo.setOrientation(orientation[0], orientation[1], orientation[2]); - route.addEffect([stereo, this.gain]); - this.player.addRoute(`sounds.${soundNum}`, route); - route.play(); - source.output.addEventListener("ended", () => { - this.playing.delete(soundNum); - }); - this.playing.add(soundNum); - return soundNum; - } - - /** - * 停止一个音效 - * @param num 音效的唯一 id - */ - stop(num) { - const id = `sounds.${num}`; - const route = this.player.getRoute(id); - if (route) { - route.stop(); - this.player.removeRoute(id); - this.playing.delete(num); - } - } - - /** - * 停止播放所有音效 - */ - stopAllSounds() { - this.playing.forEach((v) => { - const id = `sounds.${v}`; - const route = this.player.getRoute(id); - if (route) { - route.stop(); - this.player.removeRoute(id); - } - }); - this.playing.clear(); - } - } - const soundPlayer = new SoundPlayer(audioPlayer); - - function loadAllBgm() { - const data = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d; - for (const bgm of data.main.bgms) { - bgmController.addBgm(bgm); - } - } - loadAllBgm(); - AudioDecoder.registerDecoder(AudioType.Ogg, VorbisDecoder); - AudioDecoder.registerDecoder(AudioType.Opus, OpusDecoder); - - core.plugin.audioSystem = { - AudioType, - AudioDecoder, - AudioStatus, - checkAudioType, - isAudioSupport, - audioPlayer, - soundPlayer, - bgmController, - guessTypeByExt, - BgmController, - SoundPlayer, - EchoEffect, - DelayEffect, - ChannelVolumeEffect, - VolumeEffect, - StereoEffect, - AudioEffect, - AudioPlayer, - AudioRoute, - AudioStreamSource, - AudioElementSource, - AudioBufferSource, - loadAllBgm, - StreamLoader, - }; - //bgm相关复写 - control.prototype.playBgm = (bgm, when) => { - bgm = core.getMappedName(bgm); - bgmController.play(bgm, when); - core.setMusicBtn(); - }; - control.prototype.pauseBgm = () => { - bgmController.pause(); - core.setMusicBtn(); - }; - - control.prototype.resumeBgm = function () { - bgmController.resume(); - core.setMusicBtn(); - }; - control.prototype.checkBgm = function () { - core.playBgm(bgmController.playingBgm || main.startBgm); - }; - control.prototype.triggerBgm = function () { - core.musicStatus.bgmStatus = !core.musicStatus.bgmStatus; - if (bgmController.playing) bgmController.pause(); - else bgmController.resume(); - core.setMusicBtn(); - core.setLocalStorage("bgmStatus", core.musicStatus.bgmStatus); - }; - //sound相关复写 - control.prototype.playSound = function ( - sound, - _pitch, - callback, - position, - orientation - ) { - if (main.mode != "play" || !core.musicStatus.soundStatus) return; - const name = core.getMappedName(sound); - const num = soundPlayer.play(name, position, orientation); - const route = audioPlayer.getRoute(`sounds.${num}`); - if (!route) { - callback?.(); - return -1; - } else { - sleep(route.duration * 1000).then(() => callback?.()); - return num; - } - }; - control.prototype.stopSound = function (id) { - if (isNil(id)) { - soundPlayer.stopAllSounds(); - } else { - soundPlayer.stop(id); - } - }; - control.prototype.getPlayingSounds = function () { - return [...soundPlayer.playing]; - }; - //sound加载复写 - loader.prototype._loadOneSound_decodeData = function (name, data) { - if (data instanceof Blob) { - var blobReader = new zip.BlobReader(data); - blobReader.init(function () { - blobReader.readUint8Array(0, blobReader.size, function (uint8) { - //core.loader._loadOneSound_decodeData(name, uint8.buffer); - soundPlayer.add(name, uint8); - }); - }); - return; - } - if (data instanceof ArrayBuffer) { - const uint8 = new Uint8Array(data); - soundPlayer.add(name, uint8); - } - }; - //音量控制复写 - soundPlayer.setVolume( - core.musicStatus.userVolume * core.musicStatus.designVolume - ); - bgmController.setVolume( - core.musicStatus.userVolume * core.musicStatus.designVolume - ); - actions.prototype._clickSwitchs_sounds_userVolume = function (delta) { - var value = Math.round(Math.sqrt(100 * core.musicStatus.userVolume)); - if (value == 0 && delta < 0) return; - core.musicStatus.userVolume = core.clamp( - Math.pow(value + delta, 2) / 100, - 0, - 1 - ); - //audioContext 音效 不受designVolume 影响 - if (core.musicStatus.gainNode != null) - core.musicStatus.gainNode.gain.value = core.musicStatus.userVolume; - soundPlayer.setVolume( - core.musicStatus.userVolume * core.musicStatus.designVolume - ); - bgmController.setVolume( - core.musicStatus.userVolume * core.musicStatus.designVolume - ); - core.setLocalStorage("userVolume", core.musicStatus.userVolume); - core.playSound("确定"); - core.ui._drawSwitchs_sounds(); - }; - }, + // 将__enable置为false将关闭插件 + let __enable = true; + if (!__enable || main.mode === "editor") return; + const { OggOpusDecoderWebWorker } = window["ogg-opus-decoder"]; + const { OggVorbisDecoderWebWorker } = window["ogg-vorbis-decoder"]; + const { CodecParser } = window.CodecParser; + const { Transition, linear } = core.plugin.animate; + + const audio = new Audio(); + const AudioStatus = { + Playing: 0, + Pausing: 1, + Paused: 2, + Stoping: 3, + Stoped: 4, + }; + const supportMap = new Map(); + const AudioType = { + Mp3: "audio/mpeg", + Wav: 'audio/wav; codecs="1"', + Flac: "audio/flac", + Opus: 'audio/ogg; codecs="opus"', + Ogg: 'audio/ogg; codecs="vorbis"', + Aac: "audio/aac", + }; + /** + * 检查一种音频类型是否能被播放 + * @param type 音频类型 AudioType + */ + function isAudioSupport(type) { + if (supportMap.has(type)) return supportMap.get(type); + else { + const support = audio.canPlayType(type); + const canPlay = support === "maybe" || support === "probably"; + supportMap.set(type, canPlay); + return canPlay; + } + } + + const typeMap = new Map([ + ["ogg", AudioType.Ogg], + ["mp3", AudioType.Mp3], + ["wav", AudioType.Wav], + ["flac", AudioType.Flac], + ["opus", AudioType.Opus], + ["aac", AudioType.Aac], + ]); + + /** + * 根据文件名拓展猜测其类型 + * @param file 文件名 string + */ + function guessTypeByExt(file) { + const ext = /\.[a-zA-Z\d]+$/.exec(file); + if (!ext?.[0]) return ""; + const type = ext[0].slice(1); + return typeMap.get(type.toLocaleLowerCase()) ?? ""; + } + + isAudioSupport(AudioType.Ogg); + isAudioSupport(AudioType.Mp3); + isAudioSupport(AudioType.Wav); + isAudioSupport(AudioType.Flac); + isAudioSupport(AudioType.Opus); + isAudioSupport(AudioType.Aac); + + function isNil(value) { + return value === void 0 || value === null; + } + + function sleep(time) { + return new Promise((res) => setTimeout(res, time)); + } + class AudioEffect { + constructor(ac) {} + /** + * 连接至其他效果器 + * @param target 目标输入 IAudioInput + * @param output 当前效果器输出通道 Number + * @param input 目标效果器的输入通道 Number + */ + connect(target, output, input) { + this.output.connect(target.input, output, input); + } + + /** + * 与其他效果器取消连接 + * @param target 目标输入 IAudioInput + * @param output 当前效果器输出通道 Number + * @param input 目标效果器的输入通道 Number + */ + disconnect(target, output, input) { + if (!target) { + if (!isNil(output)) { + this.output.disconnect(output); + } else { + this.output.disconnect(); + } + } else { + if (!isNil(output)) { + if (!isNil(input)) { + this.output.disconnect(target.input, output, input); + } else { + this.output.disconnect(target.input, output); + } + } else { + this.output.disconnect(target.input); + } + } + } + } + + class StereoEffect extends AudioEffect { + constructor(ac) { + super(ac); + const panner = ac.createPanner(); + this.input = panner; + this.output = panner; + } + + /** + * 设置音频朝向,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 朝向x坐标 Number + * @param y 朝向y坐标 Number + * @param z 朝向z坐标 Number + */ + setOrientation(x, y, z) { + this.output.orientationX.value = x; + this.output.orientationY.value = y; + this.output.orientationZ.value = z; + } + /** + * 设置音频位置,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 位置x坐标 Number + * @param y 位置y坐标 Number + * @param z 位置z坐标 Number + */ + setPosition(x, y, z) { + this.output.positionX.value = x; + this.output.positionY.value = y; + this.output.positionZ.value = z; + } + end() {} + + start() {} + } + class VolumeEffect extends AudioEffect { + constructor(ac) { + super(ac); + const gain = ac.createGain(); + this.input = gain; + this.output = gain; + } + + /** + * 设置音量大小 + * @param volume 音量大小 Number + */ + setVolume(volume) { + this.output.gain.value = volume; + } + + /** + * 获取音量大小 Number + */ + getVolume() { + return this.output.gain.value; + } + + end() {} + + start() {} + } + class ChannelVolumeEffect extends AudioEffect { + /** 所有的音量控制节点 */ + + constructor(ac) { + super(ac); + /** 所有的音量控制节点 */ + this.gain = []; + const splitter = ac.createChannelSplitter(); + const merger = ac.createChannelMerger(); + this.output = merger; + this.input = splitter; + for (let i = 0; i < 6; i++) { + const gain = ac.createGain(); + splitter.connect(gain, i); + gain.connect(merger, 0, i); + this.gain.push(gain); + } + } + + /** + * 设置某个声道的音量大小 + * @param channel 要设置的声道,可填0-5 Number + * @param volume 这个声道的音量大小 Number + */ + setVolume(channel, volume) { + if (!this.gain[channel]) return; + this.gain[channel].gain.value = volume; + } + + /** + * 获取某个声道的音量大小,可填0-5 + * @param channel 要获取的声道 Number + */ + getVolume(channel) { + if (!this.gain[channel]) return 0; + return this.gain[channel].gain.value; + } + + end() {} + + start() {} + } + class DelayEffect extends AudioEffect { + constructor(ac) { + super(ac); + + const delay = ac.createDelay(); + this.input = delay; + this.output = delay; + } + + /** + * 设置延迟时长 + * @param delay 延迟时长,单位秒 Number + */ + setDelay(delay) { + this.output.delayTime.value = delay; + } + + /** + * 获取延迟时长 + */ + getDelay() { + return this.output.delayTime.value; + } + + end() {} + + start() {} + } + class EchoEffect extends AudioEffect { + constructor(ac) { + super(ac); + /** 当前增益 */ + this.gain = 0.5; + /** 是否正在播放 */ + this.playing = false; + const delay = ac.createDelay(); + const gain = ac.createGain(); + gain.gain.value = 0.5; + delay.delayTime.value = 0.05; + delay.connect(gain); + gain.connect(delay); + /** 延迟节点 */ + this.delay = delay; + /** 反馈增益节点 */ + this.gainNode = gain; + + this.input = gain; + this.output = gain; + } + + /** + * 设置回声反馈增益大小 + * @param gain 增益大小,范围 0-1,大于等于1的视为0.5,小于0的视为0 Number + */ + setFeedbackGain(gain) { + const resolved = gain >= 1 ? 0.5 : gain < 0 ? 0 : gain; + this.gain = resolved; + if (this.playing) this.gainNode.gain.value = resolved; + } + + /** + * 设置回声间隔时长 + * @param delay 回声时长,范围 0.01-Infinity,小于0.01的视为0.01 Number + */ + setEchoDelay(delay) { + const resolved = delay < 0.01 ? 0.01 : delay; + this.delay.delayTime.value = resolved; + } + + /** + * 获取反馈节点增益 + */ + getFeedbackGain() { + return this.gain; + } + + /** + * 获取回声间隔时长 + */ + getEchoDelay() { + return this.delay.delayTime.value; + } + + end() { + this.playing = false; + const echoTime = Math.ceil(Math.log(0.001) / Math.log(this.gain)) + 10; + sleep(this.delay.delayTime.value * echoTime).then(() => { + if (!this.playing) this.gainNode.gain.value = 0; + }); + } + + start() { + this.playing = true; + this.gainNode.gain.value = this.gain; + } + } + + class StreamLoader { + constructor(url) { + /** 传输目标 Set*/ + this.target = new Set(); + this.loading = false; + } + + /** + * 将加载流传递给字节流读取对象 + * @param reader 字节流读取对象 IStreamReader + */ + pipe(reader) { + if (this.loading) { + console.warn( + "Cannot pipe new StreamReader object when stream is loading." + ); + return; + } + this.target.add(reader); + reader.piped(this); + return this; + } + + async start() { + if (this.loading) return; + this.loading = true; + const response = await window.fetch(this.url); + const stream = response.body; + if (!stream) { + console.error("Cannot get reader when fetching '" + this.url + "'."); + return; + } + // 获取读取器 + this.stream = stream; + const reader = response.body?.getReader(); + const targets = [...this.target]; + + await Promise.all(targets.map((v) => v.start(stream, this, response))); + if (reader && reader.read) { + // 开始流传输 + while (true) { + const { value, done } = await reader.read(); + await Promise.all( + targets.map((v) => v.pump(value, done, response)) + ); + if (done) break; + } + } else { + // 如果不支持流传输 + const buffer = await response.arrayBuffer(); + const data = new Uint8Array(buffer); + await Promise.all(targets.map((v) => v.pump(data, true, response))); + } + + this.loading = false; + targets.forEach((v) => v.end(true)); + + // + } + + cancel(reason) { + if (!this.stream) return; + this.stream.cancel(reason); + this.loading = false; + this.target.forEach((v) => v.end(false, reason)); + } + } + const fileSignatures = [ + [AudioType.Mp3, [0x49, 0x44, 0x33]], + [AudioType.Ogg, [0x4f, 0x67, 0x67, 0x53]], + [AudioType.Wav, [0x52, 0x49, 0x46, 0x46]], + [AudioType.Flac, [0x66, 0x4c, 0x61, 0x43]], + [AudioType.Aac, [0xff, 0xf1]], + [AudioType.Aac, [0xff, 0xf9]], + ]; + const oggHeaders = [ + [AudioType.Opus, [0x4f, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64]], + ]; + + function checkAudioType(data) { + let audioType = ""; + // 检查头文件获取音频类型,仅检查前256个字节 + const toCheck = data.slice(0, 256); + for (const [type, value] of fileSignatures) { + if (value.every((v, i) => toCheck[i] === v)) { + audioType = type; + break; + } + } + if (audioType === AudioType.Ogg) { + // 如果是ogg的话,进一步判断是不是opus + for (const [key, value] of oggHeaders) { + const has = toCheck.some((_, i) => { + return value.every((v, ii) => toCheck[i + ii] === v); + }); + if (has) { + audioType = key; + break; + } + } + } + + return audioType; + } + class AudioDecoder { + /** + * 注册一个解码器 + * @param type 要注册的解码器允许解码的类型 + * @param decoder 解码器对象 + */ + static registerDecoder(type, decoder) { + if (!this.decoderMap) this.decoderMap = new Map(); + if (this.decoderMap.has(type)) { + console.warn( + "Audio stream decoder for audio type '" + + type + + "' has already existed." + ); + return; + } + + this.decoderMap.set(type, decoder); + } + + /** + * 解码音频数据 + * @param data 音频文件数据 + * @param player AudioPlayer实例 + */ + static async decodeAudioData(data, player) { + // 检查头文件获取音频类型,仅检查前256个字节 + const toCheck = data.slice(0, 256); + const type = checkAudioType(data); + if (type === "") { + console.error( + "Unknown audio type. Header: '" + [...toCheck] + .map((v) => v.toString().padStart(2, "0")) + .join(" ") + .toUpperCase() + + "'" + ); + return null; + } + if (isAudioSupport(type)) { + if (data.buffer instanceof ArrayBuffer) { + return player.ac.decodeAudioData(data.buffer); + } else { + return null; + } + } else { + const Decoder = this.decoderMap.get(type); + if (!Decoder) { + return null; + } else { + const decoder = new Decoder(); + await decoder.create(); + const decodedData = await decoder.decode(data); + if (!decodedData) return null; + const buffer = player.ac.createBuffer( + decodedData.channelData.length, + decodedData.channelData[0].length, + decodedData.sampleRate + ); + decodedData.channelData.forEach((v, i) => { + buffer.copyToChannel(v, i); + }); + decoder.destroy(); + return buffer; + } + } + } + } + + class VorbisDecoder { + /** + * 创建音频解码器 + */ + async create() { + this.decoder = new OggVorbisDecoderWebWorker(); + await this.decoder.ready; + } + /** + * 摧毁这个解码器 + */ + destroy() { + this.decoder?.free(); + } + /** + * 解码流数据 + * @param data 流数据 + */ + + async decode(data) { + return this.decoder?.decode(data); + } + /** + * 解码整个文件 + * @param data 文件数据 + */ + async decodeAll(data) { + return this.decoder?.decodeFile(data); + } + /** + * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 + */ + async flush() { + return this.decoder?.flush(); + } + } + + class OpusDecoder { + /** + * 创建音频解码器 + */ + async create() { + this.decoder = new OggOpusDecoderWebWorker(); + await this.decoder.ready; + } + /** + * 摧毁这个解码器 + */ + destroy() { + this.decoder?.free(); + } + /** + * 解码流数据 + * @param data 流数据 + */ + async decode(data) { + return this.decoder?.decode(data); + } + /** + * 解码整个文件 + * @param data 文件数据 + */ + async decodeAll(data) { + return this.decoder?.decodeFile(data); + } + /** + * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 + */ + async flush() { + return await this.decoder?.flush(); + } + } + const mimeTypeMap = { + [AudioType.Aac]: "audio/aac", + [AudioType.Flac]: "audio/flac", + [AudioType.Mp3]: "audio/mpeg", + [AudioType.Ogg]: "application/ogg", + [AudioType.Opus]: "application/ogg", + [AudioType.Wav]: "application/ogg", + }; + + function isOggPage(data) { + return !isNil(data.isFirstPage); + } + class AudioStreamSource { + + constructor(context) { + this.output = context.createBufferSource(); + /** 是否已经完全加载完毕 */ + this.loaded = false; + /** 是否正在播放 */ + this.playing = false; + /** 已经缓冲了多长时间,如果缓冲完那么跟歌曲时长一致 */ + this.buffered = 0; + /** 已经缓冲的采样点数量 */ + this.bufferedSamples = 0; + /** 歌曲时长,加载完毕之前保持为 0 */ + this.duration = 0; + /** 在流传输阶段,至少缓冲多长时间的音频之后才开始播放,单位秒 */ + this.bufferPlayDuration = 1; + /** 音频的采样率,未成功解析出之前保持为 0 */ + this.sampleRate = 0; + //是否循环播放 + this.loop = false; + /** 上一次播放是从何时开始的 */ + this.lastStartWhen = 0; + /** 开始播放时刻 */ + this.lastStartTime = 0; + /** 上一次播放的缓存长度 */ + this.lastBufferSamples = 0; + + /** 是否已经获取到头文件 */ + this.headerRecieved = false; + /** 音频类型 */ + this.audioType = ""; + /** 每多长时间组成一个缓存 Float32Array */ + this.bufferChunkSize = 10; + /** 缓存音频数据,每 bufferChunkSize 秒钟组成一个 Float32Array,用于流式解码 */ + this.audioData = []; + + this.errored = false; + this.ac = context; + } + /** 当前已经播放了多长时间 */ + get currentTime() { + return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; + } + /** + * 设置每个缓存数据的大小,默认为10秒钟一个缓存数据 + * @param size 每个缓存数据的时长,单位秒 + */ + setChunkSize(size) { + if (this.controller?.loading || this.loaded) return; + this.bufferChunkSize = size; + } + + piped(controller) { + this.controller = controller; + } + + async pump(data, done) { + if (!data || this.errored) return; + if (!this.headerRecieved) { + // 检查头文件获取音频类型,仅检查前256个字节 + const toCheck = data.slice(0, 256); + this.audioType = checkAudioType(data); + if (!this.audioType) { + console.error( + "Unknown audio type. Header: '" + [...toCheck] + .map((v) => v.toString(16).padStart(2, "0")) + .join(" ") + .toUpperCase() + + "'" + ); + return; + } + // 创建解码器 + const Decoder = AudioDecoder.decoderMap.get(this.audioType); + if (!Decoder) { + this.errored = true; + console.error( + "Cannot decode stream source type of '" + + this.audioType + + "', since there is no registered decoder for that type." + ); + return Promise.reject( + `Cannot decode stream source type of '${this.audioType}', since there is no registered decoder for that type.` + ); + } + this.decoder = new Decoder(); + // 创建数据解析器 + const mime = mimeTypeMap[this.audioType]; + const parser = new CodecParser(mime); + this.parser = parser; + await this.decoder.create(); + this.headerRecieved = true; + } + + const decoder = this.decoder; + const parser = this.parser; + if (!decoder || !parser) { + this.errored = true; + return Promise.reject( + "No parser or decoder attached in this AudioStreamSource" + ); + } + + await this.decodeData(data, decoder, parser); + if (done) await this.decodeFlushData(decoder, parser); + this.checkBufferedPlay(); + } + + /** + * 检查采样率,如果还未解析出采样率,那么将设置采样率,如果当前采样率与之前不同,那么发出警告 + */ + checkSampleRate(info) { + for (const one of info) { + const frame = isOggPage(one) ? one.codecFrames[0] : one; + if (frame) { + const rate = frame.header.sampleRate; + if (this.sampleRate === 0) { + this.sampleRate = rate; + break; + } else { + if (rate !== this.sampleRate) { + console.warn("Sample rate in stream audio must be constant."); + } + } + } + } + } + + /** + * 解析音频数据 + */ + async decodeData(data, decoder, parser) { + // 解析音频数据 + const audioData = await decoder.decode(data); + if (!audioData) return; + // @ts-expect-error 库类型声明错误 + const audioInfo = [...parser.parseChunk(data)]; + + // 检查采样率 + this.checkSampleRate(audioInfo); + // 追加音频数据 + this.appendDecodedData(audioData, audioInfo); + } + + /** + * 解码剩余数据 + */ + async decodeFlushData(decoder, parser) { + const audioData = await decoder.flush(); + if (!audioData) return; + // @ts-expect-error 库类型声明错误 + const audioInfo = [...parser.flush()]; + + this.checkSampleRate(audioInfo); + this.appendDecodedData(audioData, audioInfo); + } + + /** + * 追加音频数据 + */ + appendDecodedData(data, info) { + const channels = data.channelData.length; + if (channels === 0) return; + if (this.audioData.length !== channels) { + this.audioData = []; + for (let i = 0; i < channels; i++) { + this.audioData.push([]); + } + } + // 计算出应该放在哪 + const chunk = this.sampleRate * this.bufferChunkSize; + const sampled = this.bufferedSamples; + const pushIndex = Math.floor(sampled / chunk); + const bufferIndex = sampled % chunk; + const dataLength = data.channelData[0].length; + let buffered = 0; + let nowIndex = pushIndex; + let toBuffer = bufferIndex; + while (buffered < dataLength) { + const rest = toBuffer !== 0 ? chunk - bufferIndex : chunk; + + for (let i = 0; i < channels; i++) { + const audioData = this.audioData[i]; + if (!audioData[nowIndex]) { + audioData.push(new Float32Array(chunk)); + } + const toPush = data.channelData[i].slice(buffered, buffered + rest); + + audioData[nowIndex].set(toPush, toBuffer); + } + buffered += rest; + nowIndex++; + toBuffer = 0; + } + + this.buffered += + info.reduce((prev, curr) => prev + curr.duration, 0) / 1000; + this.bufferedSamples += info.reduce( + (prev, curr) => prev + curr.samples, + 0 + ); + } + + /** + * 检查已缓冲内容,并在未开始播放时播放 + */ + checkBufferedPlay() { + if (this.playing || this.sampleRate === 0) return; + const played = this.lastBufferSamples / this.sampleRate; + const dt = this.buffered - played; + if (this.loaded) { + this.playAudio(played); + return; + } + if (dt < this.bufferPlayDuration) return; + + this.lastBufferSamples = this.bufferedSamples; + // 需要播放 + this.mergeBuffers(); + if (!this.buffer) return; + if (this.playing) this.output.stop(); + this.createSourceNode(this.buffer); + this.output.loop = false; + this.output.start(0, played); + this.lastStartTime = this.ac.currentTime; + this.playing = true; + this.output.addEventListener("ended", () => { + this.playing = false; + this.checkBufferedPlay(); + }); + } + + mergeBuffers() { + const buffer = this.ac.createBuffer( + this.audioData.length, + this.bufferedSamples, + this.sampleRate + ); + const chunk = this.sampleRate * this.bufferChunkSize; + const bufferedChunks = Math.floor(this.bufferedSamples / chunk); + const restLength = this.bufferedSamples % chunk; + for (let i = 0; i < this.audioData.length; i++) { + const audio = this.audioData[i]; + const data = new Float32Array(this.bufferedSamples); + for (let j = 0; j < bufferedChunks; j++) { + data.set(audio[j], chunk * j); + } + if (restLength !== 0) { + data.set( + audio[bufferedChunks].slice(0, restLength), + chunk * bufferedChunks + ); + } + + buffer.copyToChannel(data, i, 0); + } + this.buffer = buffer; + } + + async start() { + delete this.buffer; + this.headerRecieved = false; + this.audioType = ""; + this.errored = false; + this.buffered = 0; + this.sampleRate = 0; + this.bufferedSamples = 0; + this.duration = 0; + this.loaded = false; + if (this.playing) this.output.stop(); + this.playing = false; + this.lastStartTime = this.ac.currentTime; + } + + end(done, reason) { + if (done && this.buffer) { + this.loaded = true; + delete this.controller; + this.mergeBuffers(); + + this.duration = this.buffered; + this.audioData = []; + this.decoder?.destroy(); + delete this.decoder; + delete this.parser; + } else { + console.warn( + "Unexpected end when loading stream audio, reason: '" + + (reason ?? "") + + "'" + ); + } + } + + playAudio(when) { + if (!this.buffer) return; + this.lastStartTime = this.ac.currentTime; + if (this.playing) this.output.stop(); + if (this.route.status !== AudioStatus.Playing) { + this.route.status = AudioStatus.Playing; + } + this.createSourceNode(this.buffer); + this.output.start(0, when); + this.playing = true; + + this.output.addEventListener("ended", () => { + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + if (this.loop && !this.output.loop) this.play(0); + }); + } + /** + * 开始播放这个音频源 + */ + play(when) { + if (this.playing || this.errored) return; + if (this.loaded && this.buffer) { + this.playing = true; + this.playAudio(when); + } else { + this.controller?.start(); + } + } + + createSourceNode(buffer) { + if (!this.target) return; + const node = this.ac.createBufferSource(); + node.buffer = buffer; + if (this.playing) this.output.stop(); + this.playing = false; + this.output = node; + node.connect(this.target.input); + node.loop = this.loop; + } + /** + * 停止播放这个音频源 + * @returns 音频暂停的时刻 number + */ + stop() { + if (this.playing) this.output.stop(); + this.playing = false; + return this.ac.currentTime - this.lastStartTime; + } + /** + * 连接到音频路由图上,每次调用播放的时候都会执行一次 + * @param target 连接至的目标 IAudioInput + */ + connect(target) { + this.target = target; + } + /** + * 设置是否循环播放 + * @param loop 是否循环 boolean) + */ + setLoop(loop) { + this.loop = loop; + } + } + class AudioElementSource { + + constructor(context) { + const audio = new Audio(); + audio.preload = "none"; + this.output = context.createMediaElementSource(audio); + this.audio = audio; + this.ac = context; + audio.addEventListener("play", () => { + this.playing = true; + if (this.route.status !== AudioStatus.Playing) { + this.route.status = AudioStatus.Playing; + } + }); + audio.addEventListener("ended", () => { + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + }); + } + get duration() { + return this.audio.duration; + } + get currentTime() { + return this.audio.currentTime; + } + /** + * 设置音频源的路径 + * @param url 音频路径 + */ + setSource(url) { + this.audio.src = url; + } + + play(when = 0) { + if (this.playing) return; + this.audio.currentTime = when; + this.audio.play(); + } + + stop() { + this.audio.pause(); + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + return this.audio.currentTime; + } + + connect(target) { + this.output.connect(target.input); + } + + setLoop(loop) { + this.audio.loop = loop; + } + } + class AudioBufferSource { + + constructor(context) { + this.output = context.createBufferSource(); + /** 是否循环 */ + this.loop = false; + /** 上一次播放是从何时开始的 */ + this.lastStartWhen = 0; + /** 播放开始时刻 */ + this.lastStartTime = 0; + this.duration = 0; + this.ac = context; + } + get currentTime() { + return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; + } + + /** + * 设置音频源数据 + * @param buffer 音频源,可以是未解析的 ArrayBuffer,也可以是已解析的 AudioBuffer + */ + async setBuffer(buffer) { + if (buffer instanceof ArrayBuffer) { + this.buffer = await this.ac.decodeAudioData(buffer); + } else { + this.buffer = buffer; + } + this.duration = this.buffer.duration; + } + + play(when) { + if (this.playing || !this.buffer) return; + this.playing = true; + this.lastStartTime = this.ac.currentTime; + if (this.route.status !== AudioStatus.Playing) { + this.route.status = AudioStatus.Playing; + } + this.createSourceNode(this.buffer); + this.output.start(0, when); + this.output.addEventListener("ended", () => { + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + if (this.loop && !this.output.loop) this.play(0); + }); + } + + createSourceNode(buffer) { + if (!this.target) return; + const node = this.ac.createBufferSource(); + node.buffer = buffer; + this.output = node; + node.connect(this.target.input); + node.loop = this.loop; + } + + stop() { + this.output.stop(); + return this.ac.currentTime - this.lastStartTime; + } + + connect(target) { + this.target = target; + } + + setLoop(loop) { + this.loop = loop; + } + } + class AudioPlayer { + constructor() { + /** 音频播放上下文 */ + this.ac = new AudioContext(); + /** 音量节点 */ + this.gain = this.ac.createGain(); + this.gain.connect(this.ac.destination); + this.audioRoutes = new Map(); + } + /** + * 解码音频数据 + * @param data 音频数据 + */ + decodeAudioData(data) { + return AudioDecoder.decodeAudioData(data, this); + } + /** + * 设置音量 + * @param volume 音量 + */ + setVolume(volume) { + this.gain.gain.value = volume; + } + + /** + * 获取音量 + */ + getVolume() { + return this.gain.gain.value; + } + + /** + * 创建一个音频源 + * @param Source 音频源类 + */ + createSource(Source) { + return new Source(this.ac); + } + + /** + * 创建一个兼容流式音频源,可以与流式加载相结合,主要用于处理 opus ogg 不兼容的情况 + */ + createStreamSource() { + return new AudioStreamSource(this.ac); + } + + /** + * 创建一个通过 audio 元素播放的音频源 + */ + createElementSource() { + return new AudioElementSource(this.ac); + } + + /** + * 创建一个通过 AudioBuffer 播放的音频源 + */ + createBufferSource() { + return new AudioBufferSource(this.ac); + } + + /** + * 获取音频目的地 + */ + getDestination() { + return this.gain; + } + + /** + * 创建一个音频效果器 + * @param Effect 效果器类 + */ + createEffect(Effect) { + return new Effect(this.ac); + } + + /** + * 创建一个修改音量的效果器 + * ```txt + * |----------| + * Input ----> | GainNode | ----> Output + * |----------| + * ``` + */ + createVolumeEffect() { + return new VolumeEffect(this.ac); + } + + /** + * 创建一个立体声效果器 + * ```txt + * |------------| + * Input ----> | PannerNode | ----> Output + * |------------| + * ``` + */ + createStereoEffect() { + return new StereoEffect(this.ac); + } + + /** + * 创建一个修改单个声道音量的效果器 + * ```txt + * |----------| + * -> | GainNode | \ + * |--------------| / |----------| -> |------------| + * Input ----> | SplitterNode | ...... | MergerNode | ----> Output + * |--------------| \ |----------| -> |------------| + * -> | GainNode | / + * |----------| + * ``` + */ + createChannelVolumeEffect() { + return new ChannelVolumeEffect(this.ac); + } + + /** + * 创建一个延迟效果器 + * |-----------| + * Input ----> | DelayNode | ----> Output + * |-----------| + */ + createDelay() { + return new DelayEffect(this.ac); + } + + /** + * 创建一个回声效果器 + * ```txt + * |----------| + * Input ----> | GainNode | ----> Output + * ^ |----------| | + * | | + * | |------------| ↓ + * |-- | Delay Node | <-- + * |------------| + * ``` + */ + createEchoEffect() { + return new EchoEffect(this.ac); + } + + /** + * 创建一个音频播放路由 + * @param source 音频源 + */ + createRoute(source) { + return new AudioRoute(source, this); + } + + /** + * 添加一个音频播放路由,可以直接被播放 + * @param id 这个音频播放路由的名称 + * @param route 音频播放路由对象 + */ + addRoute(id, route) { + if (!this.audioRoutes) this.audioRoutes = new Map(); + if (this.audioRoutes.has(id)) { + console.warn( + "Audio route with id of '" + + id + + "' has already existed. New route will override old route." + ); + } + this.audioRoutes.set(id, route); + } + + /** + * 根据名称获取音频播放路由对象 + * @param id 音频播放路由的名称 + */ + getRoute(id) { + return this.audioRoutes.get(id); + } + /** + * 移除一个音频播放路由 + * @param id 要移除的播放路由的名称 + */ + removeRoute(id) { + this.audioRoutes.delete(id); + } + /** + * 播放音频 + * @param id 音频名称 + * @param when 从音频的哪个位置开始播放,单位秒 + */ + play(id, when) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot play audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + + route.play(when); + } + + /** + * 暂停音频播放 + * @param id 音频名称 + * @returns 当音乐真正停止时兑现 + */ + pause(id) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot pause audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + return route.pause(); + } + + /** + * 停止音频播放 + * @param id 音频名称 + * @returns 当音乐真正停止时兑现 + */ + stop(id) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot stop audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + return route.stop(); + } + + /** + * 继续音频播放 + * @param id 音频名称 + */ + resume(id) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot pause audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + route.resume(); + } + + /** + * 设置听者位置,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 位置x坐标 + * @param y 位置y坐标 + * @param z 位置z坐标 + */ + setListenerPosition(x, y, z) { + const listener = this.ac.listener; + listener.positionX.value = x; + listener.positionY.value = y; + listener.positionZ.value = z; + } + + /** + * 设置听者朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 朝向x坐标 + * @param y 朝向y坐标 + * @param z 朝向z坐标 + */ + setListenerOrientation(x, y, z) { + const listener = this.ac.listener; + listener.forwardX.value = x; + listener.forwardY.value = y; + listener.forwardZ.value = z; + } + + /** + * 设置听者头顶朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 头顶朝向x坐标 + * @param y 头顶朝向y坐标 + * @param z 头顶朝向z坐标 + */ + setListenerUp(x, y, z) { + const listener = this.ac.listener; + listener.upX.value = x; + listener.upY.value = y; + listener.upZ.value = z; + } + } + class AudioRoute { + constructor(source, player) { + source.route = this; + this.output = source.output; + + /** 效果器路由图 */ + this.effectRoute = []; + + /** 结束时长,当音频暂停或停止时,会经过这么长时间之后才真正终止播放,期间可以做音频淡入淡出等效果 */ + this.endTime = 0; + /** 暂停时播放了多长时间 */ + this.pauseCurrentTime = 0; + /** 当前播放状态 */ + this.player = player; + this.status = AudioStatus.Stoped; + + this.shouldStop = false; + /** + * 每次暂停或停止时自增,用于判断当前正在处理的情况。 + * 假如暂停后很快播放,然后很快暂停,那么需要根据这个来判断实际是否应该执行暂停后操作 + */ + this.stopIdentifier = 0; + /** 暂停时刻 */ + this.pauseTime = 0; + this.source = source; + this.source.player = player; + } + /** 音频时长,单位秒 */ + get duration() { + return this.source.duration; + } + /** 当前播放了多长时间,单位秒 */ + get currentTime() { + if (this.status === AudioStatus.Paused) { + return this.pauseCurrentTime; + } else { + return this.source.currentTime; + } + } + set currentTime(time) { + this.source.stop(); + this.source.play(time); + } + /** + * 设置结束时间,暂停或停止时,会经过这么长时间才终止音频的播放,这期间可以做一下音频淡出的效果。 + * @param time 暂停或停止时,经过多长时间之后才会结束音频的播放 + */ + setEndTime(time) { + this.endTime = time; + } + + /** + * 当音频播放时执行的函数,可以用于音频淡入效果 + * @param fn 音频开始播放时执行的函数 + */ + onStart(fn) { + this.audioStartHook = fn; + } + + /** + * 当音频暂停或停止时执行的函数,可以用于音频淡出效果 + * @param fn 音频在暂停或停止时执行的函数,不填时表示取消这个钩子。 + * 包含两个参数,第一个参数是结束时长,第二个参数是当前音频播放路由对象 + */ + onEnd(fn) { + this.audioEndHook = fn; + } + + /** + * 开始播放这个音频 + * @param when 从音频的什么时候开始播放,单位秒 + */ + async play(when = 0) { + if (this.status === AudioStatus.Playing) return; + this.link(); + await this.player.ac.resume(); + if (this.effectRoute.length > 0) { + const first = this.effectRoute[0]; + this.source.connect(first); + const last = this.effectRoute.at(-1); + last.connect({ input: this.player.getDestination() }); + } else { + this.source.connect({ input: this.player.getDestination() }); + } + this.source.play(when); + this.status = AudioStatus.Playing; + this.pauseTime = 0; + this.audioStartHook?.(this); + this.startAllEffect(); + if (this.status !== AudioStatus.Playing) { + this.status = AudioStatus.Playing; + } + } + + /** + * 暂停音频播放 + */ + async pause() { + if (this.status !== AudioStatus.Playing) return; + this.status = AudioStatus.Pausing; + this.stopIdentifier++; + const identifier = this.stopIdentifier; + if (this.audioEndHook) { + this.audioEndHook(this.endTime, this); + await sleep(this.endTime); + } + if ( + this.status !== AudioStatus.Pausing || + this.stopIdentifier !== identifier + ) { + return; + } + this.pauseCurrentTime = this.source.currentTime; + const time = this.source.stop(); + this.pauseTime = time; + if (this.shouldStop) { + this.status = AudioStatus.Stoped; + this.endAllEffect(); + + this.shouldStop = false; + } else { + this.status = AudioStatus.Paused; + this.endAllEffect(); + } + this.endAllEffect(); + } + + /** + * 继续音频播放 + */ + resume() { + if (this.status === AudioStatus.Playing) return; + if ( + this.status === AudioStatus.Pausing || + this.status === AudioStatus.Stoping + ) { + this.audioStartHook?.(this); + + return; + } + if (this.status === AudioStatus.Paused) { + this.play(this.pauseTime); + } else { + this.play(0); + } + this.status = AudioStatus.Playing; + this.pauseTime = 0; + this.audioStartHook?.(this); + this.startAllEffect(); + } + + /** + * 停止音频播放 + */ + async stop() { + if (this.status !== AudioStatus.Playing) { + if (this.status === AudioStatus.Pausing) { + this.shouldStop = true; + } + return; + } + this.status = AudioStatus.Stoping; + this.stopIdentifier++; + const identifier = this.stopIdentifier; + if (this.audioEndHook) { + this.audioEndHook(this.endTime, this); + await sleep(this.endTime); + } + if ( + this.status !== AudioStatus.Stoping || + this.stopIdentifier !== identifier + ) { + return; + } + this.source.stop(); + this.status = AudioStatus.Stoped; + this.pauseTime = 0; + this.endAllEffect(); + } + + /** + * 添加效果器 + * @param effect 要添加的效果,可以是数组,表示一次添加多个 + * @param index 从哪个位置开始添加,如果大于数组长度,那么加到末尾,如果小于0,那么将会从后面往前数。默认添加到末尾 + */ + addEffect(effect, index) { + if (isNil(index)) { + if (effect instanceof Array) { + this.effectRoute.push(...effect); + } else { + this.effectRoute.push(effect); + } + } else { + if (effect instanceof Array) { + this.effectRoute.splice(index, 0, ...effect); + } else { + this.effectRoute.splice(index, 0, effect); + } + } + this.setOutput(); + if (this.source.playing) this.link(); + } + + /** + * 移除一个效果器 + * @param effect 要移除的效果 + */ + removeEffect(effect) { + const index = this.effectRoute.indexOf(effect); + if (index === -1) return; + this.effectRoute.splice(index, 1); + effect.disconnect(); + this.setOutput(); + if (this.source.playing) this.link(); + } + + setOutput() { + const effect = this.effectRoute.at(-1); + if (!effect) this.output = this.source.output; + else this.output = effect.output; + } + + /** + * 连接音频路由图 + */ + link() { + this.effectRoute.forEach((v) => v.disconnect()); + this.effectRoute.forEach((v, i) => { + const next = this.effectRoute[i + 1]; + if (next) { + v.connect(next); + } + }); + } + + startAllEffect() { + this.effectRoute.forEach((v) => v.start()); + } + + endAllEffect() { + this.effectRoute.forEach((v) => v.end()); + } + } + + const audioPlayer = new AudioPlayer(); + + class BgmController { + constructor(player) { + this.mainGain = player.createVolumeEffect(); + this.player = player; + /** bgm音频名称的前缀 */ + this.prefix = "bgms."; + /** 每个 bgm 的音量控制器 */ + this.gain = new Map(); + + /** 正在播放的 bgm */ + this.playingBgm = ""; + /** 是否正在播放 */ + this.playing = false; + + /** 是否已经启用 */ + this.enabled = true; + /** 是否屏蔽所有的音乐切换 */ + this.blocking = false; + /** 渐变时长 */ + this.transitionTime = 2000; + } + + /** + * 设置音频渐变时长 + * @param time 渐变时长 + */ + setTransitionTime(time) { + this.transitionTime = time; + for (const [, value] of this.gain) { + value.transition.time(time); + } + } + + /** + * 屏蔽音乐切换 + */ + blockChange() { + this.blocking = true; + } + + /** + * 取消屏蔽音乐切换 + */ + unblockChange() { + this.blocking = false; + } + + /** + * 设置总音量大小 + * @param volume 音量大小 + */ + setVolume(volume) { + this.mainGain.setVolume(volume); + this._volume = volume; + } + /** + * 获取总音量大小 + */ + getVolume() { + return this.mainGain.getVolume(); + } + /** + * 设置是否启用 + * @param enabled 是否启用 + */ + setEnabled(enabled) { + if (enabled) this.resume(); + else this.stop(); + this.enabled = enabled; + } + + /** + * 设置 bgm 音频名称的前缀 + */ + setPrefix(prefix) { + this.prefix = prefix; + } + + getId(name) { + return `${this.prefix}${name}`; + } + + /** + * 根据 bgm 名称获取其 AudioRoute 实例 + * @param id 音频名称 + */ + get(id) { + return this.player.getRoute(this.getId(id)); + } + + /** + * 添加一个 bgm + * @param id 要添加的 bgm 的名称 + * @param url 指定 bgm 的加载地址 + */ + addBgm(id, url = `project/bgms/${id}`) { + const type = guessTypeByExt(id); + if (!type) { + console.warn( + "Unknown audio extension name: '" + + id.split(".").slice(0, -1).join(".") + + "'" + ); + return; + } + const gain = this.player.createVolumeEffect(); + if (isAudioSupport(type)) { + const source = audioPlayer.createElementSource(); + source.setSource(url); + source.setLoop(true); + const route = new AudioRoute(source, audioPlayer); + route.addEffect([gain, this.mainGain]); + audioPlayer.addRoute(this.getId(id), route); + this.setTransition(id, route, gain); + } else { + const source = audioPlayer.createStreamSource(); + const stream = new StreamLoader(url); + stream.pipe(source); + source.setLoop(true); + const route = new AudioRoute(source, audioPlayer); + route.addEffect([gain, this.mainGain]); + audioPlayer.addRoute(this.getId(id), route); + this.setTransition(id, route, gain); + } + } + + /** + * 移除一个 bgm + * @param id 要移除的 bgm 的名称 + */ + removeBgm(id) { + this.player.removeRoute(this.getId(id)); + const gain = this.gain.get(id); + gain?.transition.ticker.destroy(); + this.gain.delete(id); + } + + setTransition(id, route, gain) { + const transition = new Transition(); + transition + .time(this.transitionTime) + .mode(linear()) + .transition("volume", 0); + + const tick = () => { + gain.setVolume(transition.value.volume); + }; + + /** + * @param expect 在结束时应该是正在播放还是停止 + */ + const setTick = async (expect) => { + transition.ticker.remove(tick); + transition.ticker.add(tick); + const identifier = route.stopIdentifier; + await sleep(this.transitionTime + 500); + if (route.status === expect && identifier === route.stopIdentifier) { + transition.ticker.remove(tick); + if (route.status === AudioStatus.Playing) { + gain.setVolume(1); + } else { + gain.setVolume(0); + } + } + }; + + route.onStart(async () => { + transition.transition("volume", 1); + setTick(AudioStatus.Playing); + }); + route.onEnd(() => { + transition.transition("volume", 0); + setTick(AudioStatus.Paused); + }); + route.setEndTime(this.transitionTime); + + this.gain.set(id, { effect: gain, transition }); + } + + /** + * 播放一个 bgm + * @param id 要播放的 bgm 名称 + */ + play(id, when) { + if (this.blocking) return; + if (id !== this.playingBgm && this.playingBgm) { + this.player.pause(this.getId(this.playingBgm)); + } + this.playingBgm = id; + if (!this.enabled) return; + this.player.play(this.getId(id), when); + this.playing = true; + } + + /** + * 继续当前的 bgm + */ + resume() { + if (this.blocking || !this.enabled || this.playing) return; + if (this.playingBgm) { + this.player.resume(this.getId(this.playingBgm)); + } + this.playing = true; + } + + /** + * 暂停当前的 bgm + */ + pause() { + if (this.blocking || !this.enabled) return; + if (this.playingBgm) { + this.player.pause(this.getId(this.playingBgm)); + } + this.playing = false; + } + + /** + * 停止当前的 bgm + */ + stop() { + if (this.blocking || !this.enabled) return; + if (this.playingBgm) { + this.player.stop(this.getId(this.playingBgm)); + } + this.playing = false; + } + } + const bgmController = new BgmController(audioPlayer); + + class SoundPlayer { + constructor(player) { + /** 每个音效的唯一标识符 */ + this.num = 0; + this.enabled = true; + this.gain = player.createVolumeEffect(); + /** 每个音效的数据 */ + this.buffer = new Map(); + /** 所有正在播放的音乐 */ + this.playing = new Set(); + this.player = player; + } + /** + * 设置是否启用音效 + * @param enabled 是否启用音效 + */ + setEnabled(enabled) { + if (!enabled) this.stopAllSounds(); + this.enabled = enabled; + } + + /** + * 设置音量大小 + * @param volume 音量大小 + */ + setVolume(volume) { + this.gain.setVolume(volume); + } + /** + * 获取音量大小 + */ + getVolume() { + return this.gain.getVolume(); + } + /** + * 添加一个音效 + * @param id 音效名称 + * @param data 音效的Uint8Array数据 + */ + async add(id, data) { + const buffer = await this.player.decodeAudioData(data); + if (!buffer) { + console.warn( + "Cannot decode sound '" + + id + + "', since audio file may not supported by 2.b." + ); + return; + } + this.buffer.set(id, buffer); + } + + /** + * 播放一个音效 + * @param id 音效名称 + * @param position 音频位置,[0, 0, 0]表示正中心,x轴指向水平向右,y轴指向水平向上,z轴指向竖直向上 + * @param orientation 音频朝向,[0, 1, 0]表示朝向前方 + */ + play(id, position = [0, 0, 0], orientation = [1, 0, 0]) { + if (!this.enabled || !id) return -1; + const buffer = this.buffer.get(id); + if (!buffer) { + console.warn( + "Cannot play sound '" + + id + + "', since there is no added data named it." + ); + return -1; + } + const soundNum = this.num++; + + const source = this.player.createBufferSource(); + source.setBuffer(buffer); + const route = this.player.createRoute(source); + const stereo = this.player.createStereoEffect(); + stereo.setPosition(position[0], position[1], position[2]); + stereo.setOrientation(orientation[0], orientation[1], orientation[2]); + route.addEffect([stereo, this.gain]); + this.player.addRoute(`sounds.${soundNum}`, route); + route.play(); + source.output.addEventListener("ended", () => { + this.playing.delete(soundNum); + }); + this.playing.add(soundNum); + return soundNum; + } + + /** + * 停止一个音效 + * @param num 音效的唯一 id + */ + stop(num) { + const id = `sounds.${num}`; + const route = this.player.getRoute(id); + if (route) { + route.stop(); + this.player.removeRoute(id); + this.playing.delete(num); + } + } + + /** + * 停止播放所有音效 + */ + stopAllSounds() { + this.playing.forEach((v) => { + const id = `sounds.${v}`; + const route = this.player.getRoute(id); + if (route) { + route.stop(); + this.player.removeRoute(id); + } + }); + this.playing.clear(); + } + } + const soundPlayer = new SoundPlayer(audioPlayer); + + function loadAllBgm() { + const data = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d; + for (const bgm of data.main.bgms) { + bgmController.addBgm(bgm); + } + } + loadAllBgm(); + AudioDecoder.registerDecoder(AudioType.Ogg, VorbisDecoder); + AudioDecoder.registerDecoder(AudioType.Opus, OpusDecoder); + + core.plugin.audioSystem = { + AudioType, + AudioDecoder, + AudioStatus, + checkAudioType, + isAudioSupport, + audioPlayer, + soundPlayer, + bgmController, + guessTypeByExt, + BgmController, + SoundPlayer, + EchoEffect, + DelayEffect, + ChannelVolumeEffect, + VolumeEffect, + StereoEffect, + AudioEffect, + AudioPlayer, + AudioRoute, + AudioStreamSource, + AudioElementSource, + AudioBufferSource, + loadAllBgm, + StreamLoader, + }; + //bgm相关复写 + control.prototype.playBgm = (bgm, when) => { + bgm = core.getMappedName(bgm); + bgmController.play(bgm, when); + core.setMusicBtn(); + }; + control.prototype.pauseBgm = () => { + bgmController.pause(); + core.setMusicBtn(); + }; + + control.prototype.resumeBgm = function () { + bgmController.resume(); + core.setMusicBtn(); + }; + control.prototype.checkBgm = function () { + core.playBgm(bgmController.playingBgm || main.startBgm); + }; + control.prototype.triggerBgm = function () { + core.musicStatus.bgmStatus = !core.musicStatus.bgmStatus; + if (bgmController.playing) bgmController.pause(); + else bgmController.resume(); + core.setMusicBtn(); + core.setLocalStorage("bgmStatus", core.musicStatus.bgmStatus); + }; + //sound相关复写 + control.prototype.playSound = function ( + sound, + _pitch, + callback, + position, + orientation + ) { + if (main.mode != "play" || !core.musicStatus.soundStatus) return; + const name = core.getMappedName(sound); + const num = soundPlayer.play(name, position, orientation); + const route = audioPlayer.getRoute(`sounds.${num}`); + if (!route) { + callback?.(); + return -1; + } else { + sleep(route.duration * 1000).then(() => callback?.()); + return num; + } + }; + control.prototype.stopSound = function (id) { + if (isNil(id)) { + soundPlayer.stopAllSounds(); + } else { + soundPlayer.stop(id); + } + }; + control.prototype.getPlayingSounds = function () { + return [...soundPlayer.playing]; + }; + //sound加载复写 + loader.prototype._loadOneSound_decodeData = function (name, data) { + if (data instanceof Blob) { + var blobReader = new zip.BlobReader(data); + blobReader.init(function () { + blobReader.readUint8Array(0, blobReader.size, function (uint8) { + //core.loader._loadOneSound_decodeData(name, uint8.buffer); + soundPlayer.add(name, uint8); + }); + }); + return; + } + if (data instanceof ArrayBuffer) { + const uint8 = new Uint8Array(data); + soundPlayer.add(name, uint8); + } + }; + //音量控制复写 + soundPlayer.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + bgmController.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + actions.prototype._clickSwitchs_sounds_userVolume = function (delta) { + var value = Math.round(Math.sqrt(100 * core.musicStatus.userVolume)); + if (value == 0 && delta < 0) return; + core.musicStatus.userVolume = core.clamp( + Math.pow(value + delta, 2) / 100, + 0, + 1 + ); + //audioContext 音效 不受designVolume 影响 + if (core.musicStatus.gainNode != null) + core.musicStatus.gainNode.gain.value = core.musicStatus.userVolume; + soundPlayer.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + bgmController.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + core.setLocalStorage("userVolume", core.musicStatus.userVolume); + core.playSound("确定"); + core.ui._drawSwitchs_sounds(); + }; +}, "怪物碎裂特效": function () { // 在此增加新插件 // -------------------- 安装说明 -------------------- // @@ -13906,7 +13900,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ////// 点击楼层传送器时的打开操作 ////// events.prototype.useFly = function (fromUserAction) { - if (!core.isplaying()) return; + if (!core.isPlaying()) return; if (!core.status.maps[core.status.floorId].canFlyFrom) { core.drawTip(core.material.items["fly"].name + "好像失效了", "fly"); return; @@ -14079,7 +14073,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = px <= 317 && py >= 55 && py <= 317 && - core.isplaying() + core.isPlaying() ) { core.useFly(false); return; From 25fb914841a3d7421af6bb070f06f4904f2b8fbc Mon Sep 17 00:00:00 2001 From: strawberry42271 <2806566736@qq.com> Date: Thu, 30 Jan 2025 22:24:05 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E9=9D=99=E6=80=81=E6=88=98=E6=96=97?= =?UTF-8?q?=E7=94=BB=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _server/table/comment.js | 4 +- _server/table/data.comment.js | 6 +- project/data.js | 5 +- project/enemys.js | 4 +- project/functions.js | 530 ++++---- project/icons.js | 13 +- project/items.js | 55 + project/maps.js | 987 +++++--------- project/plugins.js | 2297 ++++++++++++++++++--------------- 9 files changed, 1883 insertions(+), 2018 deletions(-) diff --git a/_server/table/comment.js b/_server/table/comment.js index 46e82ec..3cf5699 100644 --- a/_server/table/comment.js +++ b/_server/table/comment.js @@ -192,7 +192,9 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "mdef": { "_leaf": true, "_type": "textarea", - "_data": "法抗(写为小数)" + "_docs": "法抗", + "_data": "百分数,如10为10%法抗,怪物受到勇士的法术伤害减免比例" + }, "speed": { "_leaf": true, diff --git a/_server/table/data.comment.js b/_server/table/data.comment.js index 8fda0a1..6698265 100644 --- a/_server/table/data.comment.js +++ b/_server/table/data.comment.js @@ -269,7 +269,11 @@ var data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_type": "textarea", "_data": "法强", }, - + "spelldef": { + "_leaf": true, + "_type": "textarea", + "_data": "法抗百分比", + }, "matk": { "_leaf": true, "_type": "textarea", diff --git a/project/data.js b/project/data.js index 1a1c452..0920725 100644 --- a/project/data.js +++ b/project/data.js @@ -1107,7 +1107,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "hero": { "image": "hero.webp", "animate": false, - "name": "Caim", + "name": "凯伊姆", "lv": 1, "hpmax": 9999, "hp": 1000, @@ -1137,7 +1137,8 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "followers": [], "steps": 0, "matk": 0, - "spell": null + "spell": 0, + "spelldef": 0 }, "startCanvas": [ { diff --git a/project/enemys.js b/project/enemys.js index 1989be8..f4da758 100644 --- a/project/enemys.js +++ b/project/enemys.js @@ -1,10 +1,10 @@ var enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 = { - "greenSlime": {"name":"绿头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"magic":false}, + "greenSlime": {"name":"绿头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"magic":false,"mdef":0}, "redSlime": {"name":"红头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"value":10,"magic":false}, "blackSlime": {"name":"青头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, "slimelord": {"name":"怪王","hp":100,"atk":120,"def":0,"money":10,"exp":0,"point":0,"special":[1,9]}, - "bat": {"name":"小蝙蝠","hp":100,"atk":120,"def":0,"money":2,"exp":0,"point":0,"special":[1]}, + "bat": {"name":"小蝙蝠","hp":100,"atk":120,"def":0,"money":2,"exp":0,"point":0,"special":[1],"mdef":0,"speed":10}, "bigBat": {"name":"大蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, "redBat": {"name":"红蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[]}, "vampire": {"name":"冥灵魔王","hp":888,"atk":888,"def":888,"money":888,"exp":888,"point":0,"special":[6],"n":8}, diff --git a/project/functions.js b/project/functions.js index 36fc93e..ea0a448 100644 --- a/project/functions.js +++ b/project/functions.js @@ -741,156 +741,156 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = ]; }, "getEnemyInfo": function (enemy, hero, x, y, floorId) { - // 获得某个怪物变化后的数据;该函数将被伤害计算和怪物手册使用 - // 例如:坚固、模仿、仿攻等等 - // - // 参数说明: - // enemy:该怪物信息 - // hero_hp,hero_atk,hero_def,hero_mdef:勇士的生命攻防护盾数据 - // x,y:该怪物的坐标(查看手册和强制战斗时为undefined) - // floorId:该怪物所在的楼层 - // 后面三个参数主要是可以在光环等效果上可以适用(也可以按需制作部分范围光环效果) - floorId = floorId || core.status.floorId; - var 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"); + // 获得某个怪物变化后的数据;该函数将被伤害计算和怪物手册使用 + // 例如:坚固、模仿、仿攻等等 + // + // 参数说明: + // enemy:该怪物信息 + // hero_hp,hero_atk,hero_def,hero_mdef:勇士的生命攻防护盾数据 + // x,y:该怪物的坐标(查看手册和强制战斗时为undefined) + // floorId:该怪物所在的楼层 + // 后面三个参数主要是可以在光环等效果上可以适用(也可以按需制作部分范围光环效果) + floorId = floorId || core.status.floorId; + var 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"); - var mon_hp = core.getEnemyValue(enemy, "hp", x, y, floorId), - mon_atk = core.getEnemyValue(enemy, "atk", x, y, floorId), - mon_def = core.getEnemyValue(enemy, "def", x, y, floorId), - mon_mdef = core.getEnemyValue(enemy, "mdef", x, y, floorId), - mon_speed = core.getEnemyValue(enemy, "speed", x, y, floorId), - mon_special = core.getEnemyValue(enemy, "special", x, y, floorId); - var mon_money = core.getEnemyValue(enemy, "money", x, y, floorId), - mon_exp = core.getEnemyValue(enemy, "exp", x, y, floorId), - mon_point = core.getEnemyValue(enemy, "point", x, y, floorId); - var mon_barrier = 0, - mon_absorb_damage = 0, - mon_magic = core.getEnemyValue(enemy, "magic", x, y, floorId); - // 模仿 - if (core.hasSpecial(mon_special, 10)) { - mon_atk = hero_atk; - mon_def = hero_def; - } - // 坚固 - if (core.hasSpecial(mon_special, 3) && mon_def < hero_atk - 1) { - mon_def = hero_atk - 1; - } + var mon_hp = core.getEnemyValue(enemy, "hp", x, y, floorId), + mon_atk = core.getEnemyValue(enemy, "atk", x, y, floorId), + mon_def = core.getEnemyValue(enemy, "def", x, y, floorId), + mon_mdef = core.getEnemyValue(enemy, "mdef", x, y, floorId), + mon_speed = core.getEnemyValue(enemy, "speed", x, y, floorId), + mon_special = core.getEnemyValue(enemy, "special", x, y, floorId); + var mon_money = core.getEnemyValue(enemy, "money", x, y, floorId), + mon_exp = core.getEnemyValue(enemy, "exp", x, y, floorId), + mon_point = core.getEnemyValue(enemy, "point", x, y, floorId); + var mon_barrier = 0, + mon_absorb_damage = 0, + mon_magic = core.getEnemyValue(enemy, "magic", x, y, floorId); + // 模仿 + if (core.hasSpecial(mon_special, 10)) { + mon_atk = hero_atk; + mon_def = hero_def; + } + // 坚固 + if (core.hasSpecial(mon_special, 3) && mon_def < hero_atk - 1) { + mon_def = hero_atk - 1; + } - var guards = []; + var guards = []; - // 光环和支援检查 - if (!core.status.checkBlock) core.status.checkBlock = {}; + // 光环和支援检查 + if (!core.status.checkBlock) core.status.checkBlock = {}; - if (core.status.checkBlock.needCache) { - // 从V2.5.4开始,对光环效果增加缓存,以解决多次重复计算的问题,从而大幅提升运行效率。 - var hp_buff = 0, - atk_buff = 0, - def_buff = 0; - // 已经计算过的光环怪ID列表,用于判定叠加 - var usedEnemyIds = {}; - // 检查光环和支援的缓存 - var index = x != null && y != null ? x + "," + y : floorId; - if (!core.status.checkBlock.cache) core.status.checkBlock.cache = {}; - var cache = core.status.checkBlock.cache[index]; - if (!cache) { - // 没有该点的缓存,则遍历每个图块 - core.extractBlocks(floorId); - core.status.maps[floorId].blocks.forEach(function (block) { - if (!block.disable) { - // 获得该图块的ID - var id = block.event.id, - enemy = core.material.enemys[id]; - // 检查【光环】技能,数字25 - if (enemy && core.hasSpecial(enemy.special, 25)) { - // 检查是否是范围光环 - var inRange = enemy.haloRange == null; - if (enemy.haloRange != null && x != null && y != null) { - var dx = Math.abs(block.x - x), - dy = Math.abs(block.y - y); - // 检查十字和九宫格光环 - if (dx + dy <= enemy.haloRange) inRange = true; - if ( - enemy.haloSquare && - dx <= enemy.haloRange && - dy <= enemy.haloRange - ) - inRange = true; - } - // 检查是否可叠加 - if (inRange && (enemy.haloAdd || !usedEnemyIds[enemy.id])) { - hp_buff += enemy.hpBuff || 0; - atk_buff += enemy.atkBuff || 0; - def_buff += enemy.defBuff || 0; - usedEnemyIds[enemy.id] = true; - } - } - // 检查【支援】技能,数字26 - if ( - enemy && - core.hasSpecial(enemy.special, 26) && - // 检查支援条件,坐标存在,距离为1,且不能是自己 - // 其他类型的支援怪,比如十字之类的话.... 看着做是一样的 - x != null && - y != null && - Math.abs(block.x - x) <= 1 && - Math.abs(block.y - y) <= 1 && - !(x == block.x && y == block.y) - ) { - // 记录怪物的x,y,ID - guards.push([block.x, block.y, id]); - } + if (core.status.checkBlock.needCache) { + // 从V2.5.4开始,对光环效果增加缓存,以解决多次重复计算的问题,从而大幅提升运行效率。 + var hp_buff = 0, + atk_buff = 0, + def_buff = 0; + // 已经计算过的光环怪ID列表,用于判定叠加 + var usedEnemyIds = {}; + // 检查光环和支援的缓存 + var index = x != null && y != null ? x + "," + y : floorId; + if (!core.status.checkBlock.cache) core.status.checkBlock.cache = {}; + var cache = core.status.checkBlock.cache[index]; + if (!cache) { + // 没有该点的缓存,则遍历每个图块 + core.extractBlocks(floorId); + core.status.maps[floorId].blocks.forEach(function (block) { + if (!block.disable) { + // 获得该图块的ID + var id = block.event.id, + enemy = core.material.enemys[id]; + // 检查【光环】技能,数字25 + if (enemy && core.hasSpecial(enemy.special, 25)) { + // 检查是否是范围光环 + var inRange = enemy.haloRange == null; + if (enemy.haloRange != null && x != null && y != null) { + var dx = Math.abs(block.x - x), + dy = Math.abs(block.y - y); + // 检查十字和九宫格光环 + if (dx + dy <= enemy.haloRange) inRange = true; + if ( + enemy.haloSquare && + dx <= enemy.haloRange && + dy <= enemy.haloRange + ) + inRange = true; + } + // 检查是否可叠加 + if (inRange && (enemy.haloAdd || !usedEnemyIds[enemy.id])) { + hp_buff += enemy.hpBuff || 0; + atk_buff += enemy.atkBuff || 0; + def_buff += enemy.defBuff || 0; + usedEnemyIds[enemy.id] = true; + } + } + // 检查【支援】技能,数字26 + if ( + enemy && + core.hasSpecial(enemy.special, 26) && + // 检查支援条件,坐标存在,距离为1,且不能是自己 + // 其他类型的支援怪,比如十字之类的话.... 看着做是一样的 + x != null && + y != null && + Math.abs(block.x - x) <= 1 && + Math.abs(block.y - y) <= 1 && + !(x == block.x && y == block.y) + ) { + // 记录怪物的x,y,ID + guards.push([block.x, block.y, id]); + } - // TODO:如果有其他类型光环怪物在这里仿照添加检查 - // 注:新增新的类光环属性(需要遍历全图的)需要在特殊属性定义那里的第五项写1,参见光环和支援的特殊属性定义。 - } - }); + // TODO:如果有其他类型光环怪物在这里仿照添加检查 + // 注:新增新的类光环属性(需要遍历全图的)需要在特殊属性定义那里的第五项写1,参见光环和支援的特殊属性定义。 + } + }); - core.status.checkBlock.cache[index] = { - hp_buff: hp_buff, - atk_buff: atk_buff, - def_buff: def_buff, - guards: guards, - }; - } else { - // 直接使用缓存数据 - hp_buff = cache.hp_buff; - atk_buff = cache.atk_buff; - def_buff = cache.def_buff; - guards = cache.guards; - } + core.status.checkBlock.cache[index] = { + hp_buff: hp_buff, + atk_buff: atk_buff, + def_buff: def_buff, + guards: guards, + }; + } else { + // 直接使用缓存数据 + hp_buff = cache.hp_buff; + atk_buff = cache.atk_buff; + def_buff = cache.def_buff; + guards = cache.guards; + } - // 增加比例;如果要增加数值可以直接在这里修改 - mon_hp *= 1 + hp_buff / 100; - mon_atk *= 1 + atk_buff / 100; - mon_def *= 1 + def_buff / 100; - } + // 增加比例;如果要增加数值可以直接在这里修改 + mon_hp *= 1 + hp_buff / 100; + mon_atk *= 1 + atk_buff / 100; + mon_def *= 1 + def_buff / 100; + } - // TODO:可以在这里新增其他的怪物数据变化 - // 比如仿攻(怪物攻击不低于勇士攻击): - // if (core.hasSpecial(mon_special, 27) && mon_atk < hero_atk) { - // mon_atk = hero_atk; - // } - // 也可以按需增加各种自定义内容 + // TODO:可以在这里新增其他的怪物数据变化 + // 比如仿攻(怪物攻击不低于勇士攻击): + // if (core.hasSpecial(mon_special, 27) && mon_atk < hero_atk) { + // mon_atk = hero_atk; + // } + // 也可以按需增加各种自定义内容 - return { - hp: Math.floor(mon_hp), - atk: Math.floor(mon_atk), - def: Math.floor(mon_def), - mdef: Math.floor(mon_mdef), - speed: Math.floor(mon_speed), - barrier: Math.floor(mon_barrier), - absorb: Math.floor(mon_absorb_damage), - money: Math.floor(mon_money), - exp: Math.floor(mon_exp), - point: Math.floor(mon_point), - special: mon_special, - magic: mon_magic, - guards: guards, // 返回支援情况 - }; - }, + return { + hp: Math.floor(mon_hp), + atk: Math.floor(mon_atk), + def: Math.floor(mon_def), + mdef: Math.floor(mon_mdef), + speed: Math.floor(mon_speed), + barrier: Math.floor(mon_barrier), + absorb: Math.floor(mon_absorb_damage), + money: Math.floor(mon_money), + exp: Math.floor(mon_exp), + point: Math.floor(mon_point), + special: mon_special, + magic: mon_magic, + guards: guards, // 返回支援情况 + }; +}, "getDamageInfo": function (enemy, hero, x, y, floorId) { // 获得战斗伤害信息(实际伤害计算函数) // @@ -1928,130 +1928,130 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = .sort(/*function (id1, id2) { return core.material.items[id1].name <= core.material.items[id2].name ? -1 : 1 }*/); }, "drawStatusBar": function () { - // 这真的是人能写出来的东西? - var ctx, - fill = function (text, x, y, style) { - core.ui.setFont( - ctx, - (/\w+/.test(text) ? "italic " : "") + "bold 18px Verdana" - ); - core.ui.fillBoldText(ctx, text, x, y, style); - }; - if (core.flags.statusCanvas) { - // 系统开关「自绘状态栏」开启 - core.ui.clearMap((ctx = core.dom.statusCanvasCtx)); // 清空状态栏 - core.ui.setFillStyle(ctx, core.status.globalAttribute.statusBarColor); - if (core.domStyle.isVertical) { - // 竖屏 - core.drawImage(ctx, core.statusBar.icons.floor, 6, 6, 25, 25); - fill((core.status.thisMap || {}).name || "Loading", 42, 26); - core.drawImage(ctx, core.statusBar.icons.hp, 137, 6, 25, 25); - fill(core.formatBigNumber(core.getRealStatus("hp")), 173, 26); - core.drawImage(ctx, core.statusBar.icons.atk, 268, 6, 25, 25); - fill(core.formatBigNumber(core.getRealStatus("atk")), 304, 26); - core.drawImage(ctx, core.statusBar.icons.def, 6, 38, 25, 25); - fill(core.formatBigNumber(core.getRealStatus("def")), 42, 58); - core.drawImage(ctx, core.statusBar.icons.mdef, 137, 38, 25, 25); - fill(core.formatBigNumber(core.getRealStatus("mdef")), 173, 58); - core.drawImage(ctx, core.statusBar.icons.money, 268, 38, 25, 25); - fill(core.formatBigNumber(core.status.hero.money), 304, 58); - core.drawImage(ctx, core.statusBar.icons.exp, 6, 70, 25, 25); - fill(core.formatBigNumber(core.status.hero.exp), 42, 90); - } else if (!core.flags.hideLeftStatusBar) { - // 横屏且未隐藏状态栏 - core.drawImage(ctx, core.statusBar.icons.floor, 6, 9, 25, 25); - fill((core.status.thisMap || {}).name || "Loading", 42, 29); - core.drawImage(ctx, core.statusBar.icons.hp, 6, 43, 25, 25); - fill(core.formatBigNumber(core.getRealStatus("hp")), 42, 63); - core.drawImage(ctx, core.statusBar.icons.atk, 6, 77, 25, 25); - fill(core.formatBigNumber(core.getRealStatus("atk")), 42, 97); - core.drawImage(ctx, core.statusBar.icons.def, 6, 111, 25, 25); - fill(core.formatBigNumber(core.getRealStatus("def")), 42, 131); - core.drawImage(ctx, core.statusBar.icons.mdef, 6, 145, 25, 25); - fill(core.formatBigNumber(core.getRealStatus("mdef")), 42, 165); - core.drawImage(ctx, core.statusBar.icons.money, 6, 179, 25, 25); - fill(core.formatBigNumber(core.status.hero.money), 42, 199); - core.drawImage(ctx, core.statusBar.icons.exp, 6, 213, 25, 25); - fill(core.formatBigNumber(core.status.hero.exp), 42, 233); - fill( - core.setTwoDigits(core.itemCount("yellowKey")), - 11, - 267, - "#FFCCAA" - ); - fill( - core.setTwoDigits(core.itemCount("blueKey")), - 46, - 267, - "#AAAADD" - ); - fill(core.setTwoDigits(core.itemCount("redKey")), 81, 267, "#FF8888"); - } - } else if (core.flags.hideLeftStatusBar && !core.domStyle.isVertical) { - // 横屏且隐藏状态栏 - if (!core.dymCanvas["status"]) - core.ui.createCanvas("status", 0, 0, core._PX_, core._PY_, 66); // 刚好盖过显伤层 - core.ui.clearMap((ctx = core.dymCanvas["status"])); - core.ui.setFillStyle(ctx, core.status.globalAttribute.statusBarColor); - var offset = - core.status.hero.loc.x - core.bigmap.offsetX / 32 >= core._HEIGHT_ - ? 0 - : core._PY_; - core.ui.setAlpha(ctx, 0.75); - core.ui.drawWindowSkin( - "winskin.webp", - ctx, - offset, - 0, - core._PX_ - core._PY_, - core._PY_ - ); - core.ui.setAlpha(ctx, 1); - core.drawImage(ctx, core.statusBar.icons.floor, 6 + offset, 9, 25, 25); - fill((core.status.thisMap || {}).name || "Loading", 42 + offset, 29); - core.drawImage(ctx, core.statusBar.icons.hp, 6 + offset, 43, 25, 25); - fill(core.formatBigNumber(core.getRealStatus("hp")), 42 + offset, 63); - core.drawImage(ctx, core.statusBar.icons.atk, 6 + offset, 77, 25, 25); - fill(core.formatBigNumber(core.getRealStatus("atk")), 42 + offset, 97); - core.drawImage(ctx, core.statusBar.icons.def, 6 + offset, 111, 25, 25); - fill(core.formatBigNumber(core.getRealStatus("def")), 42 + offset, 131); - core.drawImage(ctx, core.statusBar.icons.mdef, 6 + offset, 145, 25, 25); - fill( - core.formatBigNumber(core.getRealStatus("mdef")), - 42 + offset, - 165 - ); - core.drawImage( - ctx, - core.statusBar.icons.money, - 6 + offset, - 179, - 25, - 25 - ); - fill(core.formatBigNumber(core.status.hero.money), 42 + offset, 199); - core.drawImage(ctx, core.statusBar.icons.exp, 6 + offset, 213, 25, 25); - fill(core.formatBigNumber(core.status.hero.exp), 42 + offset, 233); - fill( - core.setTwoDigits(core.itemCount("yellowKey")), - 11 + offset, - 267, - "#FFCCAA" - ); - fill( - core.setTwoDigits(core.itemCount("blueKey")), - 46 + offset, - 267, - "#AAAADD" - ); - fill( - core.setTwoDigits(core.itemCount("redKey")), - 81 + offset, - 267, - "#FF8888" - ); - } - }, + // 这真的是人能写出来的东西? + var ctx, + fill = function (text, x, y, style) { + core.ui.setFont( + ctx, + (/\w+/.test(text) ? "italic " : "") + "bold 18px Verdana" + ); + core.ui.fillBoldText(ctx, text, x, y, style); + }; + if (core.flags.statusCanvas) { + // 系统开关「自绘状态栏」开启 + core.ui.clearMap((ctx = core.dom.statusCanvasCtx)); // 清空状态栏 + core.ui.setFillStyle(ctx, core.status.globalAttribute.statusBarColor); + if (core.domStyle.isVertical) { + // 竖屏 + core.drawImage(ctx, core.statusBar.icons.floor, 6, 6, 25, 25); + fill((core.status.thisMap || {}).name || "Loading", 42, 26); + core.drawImage(ctx, core.statusBar.icons.hp, 137, 6, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("hp")), 173, 26); + core.drawImage(ctx, core.statusBar.icons.atk, 268, 6, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("atk")), 304, 26); + core.drawImage(ctx, core.statusBar.icons.def, 6, 38, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("def")), 42, 58); + core.drawImage(ctx, core.statusBar.icons.mdef, 137, 38, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("mdef")), 173, 58); + core.drawImage(ctx, core.statusBar.icons.money, 268, 38, 25, 25); + fill(core.formatBigNumber(core.status.hero.money), 304, 58); + core.drawImage(ctx, core.statusBar.icons.exp, 6, 70, 25, 25); + fill(core.formatBigNumber(core.status.hero.exp), 42, 90); + } else if (!core.flags.hideLeftStatusBar) { + // 横屏且未隐藏状态栏 + core.drawImage(ctx, core.statusBar.icons.floor, 6, 9, 25, 25); + fill((core.status.thisMap || {}).name || "Loading", 42, 29); + core.drawImage(ctx, core.statusBar.icons.hp, 6, 43, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("hp")), 42, 63); + core.drawImage(ctx, core.statusBar.icons.atk, 6, 77, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("atk")), 42, 97); + core.drawImage(ctx, core.statusBar.icons.def, 6, 111, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("def")), 42, 131); + core.drawImage(ctx, core.statusBar.icons.mdef, 6, 145, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("mdef")), 42, 165); + core.drawImage(ctx, core.statusBar.icons.money, 6, 179, 25, 25); + fill(core.formatBigNumber(core.status.hero.money), 42, 199); + core.drawImage(ctx, core.statusBar.icons.exp, 6, 213, 25, 25); + fill(core.formatBigNumber(core.status.hero.exp), 42, 233); + fill( + core.setTwoDigits(core.itemCount("yellowKey")), + 11, + 267, + "#FFCCAA" + ); + fill( + core.setTwoDigits(core.itemCount("blueKey")), + 46, + 267, + "#AAAADD" + ); + fill(core.setTwoDigits(core.itemCount("redKey")), 81, 267, "#FF8888"); + } + } else if (core.flags.hideLeftStatusBar && !core.domStyle.isVertical) { + // 横屏且隐藏状态栏 + if (!core.dymCanvas["status"]) + core.ui.createCanvas("status", 0, 0, core._PX_, core._PY_, 66); // 刚好盖过显伤层 + core.ui.clearMap((ctx = core.dymCanvas["status"])); + core.ui.setFillStyle(ctx, core.status.globalAttribute.statusBarColor); + var offset = + core.status.hero.loc.x - core.bigmap.offsetX / 32 >= core._HEIGHT_ ? + 0 : + core._PY_; + core.ui.setAlpha(ctx, 0.75); + core.ui.drawWindowSkin( + "winskin.webp", + ctx, + offset, + 0, + core._PX_ - core._PY_, + core._PY_ + ); + core.ui.setAlpha(ctx, 1); + core.drawImage(ctx, core.statusBar.icons.floor, 6 + offset, 9, 25, 25); + fill((core.status.thisMap || {}).name || "Loading", 42 + offset, 29); + core.drawImage(ctx, core.statusBar.icons.hp, 6 + offset, 43, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("hp")), 42 + offset, 63); + core.drawImage(ctx, core.statusBar.icons.atk, 6 + offset, 77, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("atk")), 42 + offset, 97); + core.drawImage(ctx, core.statusBar.icons.def, 6 + offset, 111, 25, 25); + fill(core.formatBigNumber(core.getRealStatus("def")), 42 + offset, 131); + core.drawImage(ctx, core.statusBar.icons.mdef, 6 + offset, 145, 25, 25); + fill( + core.formatBigNumber(core.getRealStatus("mdef")), + 42 + offset, + 165 + ); + core.drawImage( + ctx, + core.statusBar.icons.money, + 6 + offset, + 179, + 25, + 25 + ); + fill(core.formatBigNumber(core.status.hero.money), 42 + offset, 199); + core.drawImage(ctx, core.statusBar.icons.exp, 6 + offset, 213, 25, 25); + fill(core.formatBigNumber(core.status.hero.exp), 42 + offset, 233); + fill( + core.setTwoDigits(core.itemCount("yellowKey")), + 11 + offset, + 267, + "#FFCCAA" + ); + fill( + core.setTwoDigits(core.itemCount("blueKey")), + 46 + offset, + 267, + "#AAAADD" + ); + fill( + core.setTwoDigits(core.itemCount("redKey")), + 81 + offset, + 267, + "#FF8888" + ); + } +}, "drawStatistics": function () { // 浏览地图时参与的统计项目 diff --git a/project/icons.js b/project/icons.js index 8a3e33c..73914d5 100644 --- a/project/icons.js +++ b/project/icons.js @@ -315,7 +315,18 @@ var icons_4665ee12_3a1f_44a4_bea3_0fccba634dc1 = "jumpShoes": 49, "skill1": 30, "wand": 10, - "pack": 46 + "pack": 46, + "I366": 5, + "I367": 7, + "I368": 26, + "I369": 31, + "I370": 32, + "I371": 34, + "I372": 35, + "I373": 36, + "I374": 37, + "I375": 38, + "I396": 39 }, "autotile": { "autotile": 0, diff --git a/project/items.js b/project/items.js index 0507d29..95ed773 100644 --- a/project/items.js +++ b/project/items.js @@ -546,5 +546,60 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "name": "钱袋", "itemEffect": "core.status.hero.money += 500", "itemEffectTip": ",金币+500" + }, + "I366": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I367": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I368": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I369": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I370": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I371": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I372": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I373": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I374": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I375": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I396": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" } } \ No newline at end of file diff --git a/project/maps.js b/project/maps.js index 67560d4..d1b42f0 100644 --- a/project/maps.js +++ b/project/maps.js @@ -1,670 +1,317 @@ -var maps_90f36752_8815_4be8_b32b_d7fad1d0542e = { - 1: { - cls: "animates", - id: "yellowWall", - canBreak: true, - animate: 1, - doorInfo: { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: {}, - }, - }, - 2: { - cls: "animates", - id: "whiteWall", - canBreak: true, - animate: 1, - doorInfo: { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: {}, - }, - }, - 3: { - cls: "animates", - id: "blueWall", - canBreak: true, - animate: 1, - doorInfo: { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: {}, - }, - }, - 4: { cls: "animates", id: "star", name: "星空" }, - 5: { cls: "animates", id: "lava", name: "岩浆" }, - 6: { - cls: "animates", - id: "ice", - doorInfo: { - time: 160, - openSound: "破冰镐", - closeSound: "door.opus", - keys: { icePickaxe: 1 }, - }, - animate: 1, - }, - 7: { cls: "terrains", id: "blueShopLeft" }, - 8: { cls: "terrains", id: "blueShopRight" }, - 9: { cls: "terrains", id: "pinkShopLeft" }, - 10: { cls: "terrains", id: "pinkShopRight" }, - 11: { - cls: "animates", - id: "lavaNet", - canPass: true, - trigger: "null", - script: - "(function () {\n\t// 血网的伤害效果移动到 checkBlock 中处理\n\n\t// 如果要做一次性血网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})();", - name: "血网", - }, - 12: { - cls: "animates", - id: "poisonNet", - canPass: true, - trigger: "null", - script: - "(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'poison');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性毒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()", - name: "毒网", - }, - 13: { - cls: "animates", - id: "weakNet", - canPass: true, - trigger: "null", - script: - "(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'weak');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性衰网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()", - name: "衰网", - }, - 14: { - cls: "animates", - id: "curseNet", - canPass: true, - trigger: "null", - script: - "(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'curse');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性咒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()", - name: "咒网", - }, - 15: { cls: "animates", id: "blueLava" }, - 16: { cls: "animates", id: "water" }, - 20: { cls: "autotile", id: "autotile" }, - 21: { cls: "items", id: "yellowKey" }, - 22: { cls: "items", id: "blueKey" }, - 23: { cls: "items", id: "redKey" }, - 24: { cls: "items", id: "greenKey" }, - 25: { cls: "items", id: "steelKey" }, - 26: { cls: "items", id: "bigKey" }, - 27: { cls: "items", id: "redGem" }, - 28: { cls: "items", id: "blueGem" }, - 29: { cls: "items", id: "greenGem" }, - 30: { cls: "items", id: "yellowGem" }, - 31: { cls: "items", id: "redPotion" }, - 32: { cls: "items", id: "bluePotion" }, - 33: { cls: "items", id: "greenPotion" }, - 34: { cls: "items", id: "yellowPotion" }, - 35: { cls: "items", id: "sword1" }, - 36: { cls: "items", id: "shield1" }, - 37: { cls: "items", id: "sword2" }, - 38: { cls: "items", id: "shield2" }, - 39: { cls: "items", id: "sword3" }, - 40: { cls: "items", id: "shield3" }, - 41: { cls: "items", id: "sword4" }, - 42: { cls: "items", id: "shield4" }, - 43: { cls: "items", id: "sword5" }, - 44: { cls: "items", id: "shield5" }, - 45: { cls: "items", id: "book" }, - 46: { cls: "items", id: "fly" }, - 47: { cls: "items", id: "pickaxe" }, - 48: { cls: "items", id: "icePickaxe" }, - 49: { cls: "items", id: "bomb" }, - 50: { cls: "items", id: "centerFly" }, - 51: { cls: "items", id: "upFly" }, - 52: { cls: "items", id: "downFly" }, - 53: { cls: "items", id: "coin" }, - 54: { cls: "items", id: "freezeBadge" }, - 55: { cls: "items", id: "cross" }, - 56: { cls: "items", id: "superPotion" }, - 57: { cls: "items", id: "earthquake" }, - 58: { cls: "items", id: "poisonWine" }, - 59: { cls: "items", id: "weakWine" }, - 60: { cls: "items", id: "curseWine" }, - 61: { cls: "items", id: "superWine" }, - 62: { cls: "items", id: "dagger" }, - 63: { cls: "items", id: "pack" }, - 64: { cls: "items", id: "amulet" }, - 65: { cls: "items", id: "hammer" }, - 68: { cls: "items", id: "lifeWand" }, - 69: { cls: "items", id: "jumpShoes" }, - 70: { cls: "items", id: "sword0" }, - 71: { cls: "items", id: "shield0" }, - 72: { cls: "items", id: "skill1" }, - 73: { cls: "items", id: "wand" }, - 81: { - cls: "animates", - id: "yellowDoor", - trigger: "openDoor", - animate: 1, - doorInfo: { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: { yellowKey: 1 }, - }, - name: "黄门", - }, - 82: { - cls: "animates", - id: "blueDoor", - trigger: "openDoor", - animate: 1, - doorInfo: { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: { blueKey: 1 }, - }, - name: "蓝门", - }, - 83: { - cls: "animates", - id: "redDoor", - trigger: "openDoor", - animate: 1, - doorInfo: { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: { redKey: 1 }, - }, - name: "红门", - }, - 84: { - cls: "animates", - id: "greenDoor", - trigger: "openDoor", - animate: 1, - doorInfo: { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: { greenKey: 1 }, - }, - name: "绿门", - }, - 85: { - cls: "animates", - id: "specialDoor", - trigger: "openDoor", - animate: 1, - doorInfo: { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: { specialKey: 1 }, - }, - name: "机关门", - }, - 86: { - cls: "animates", - id: "steelDoor", - trigger: "openDoor", - animate: 1, - doorInfo: { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: { steelKey: 1 }, - }, - name: "铁门", - }, - 87: { cls: "terrains", id: "upFloor", canPass: true }, - 88: { cls: "terrains", id: "downFloor", canPass: true }, - 89: { cls: "animates", id: "portal", canPass: true }, - 90: { cls: "animates", id: "starPortal", canPass: true }, - 91: { cls: "animates", id: "upPortal", canPass: true }, - 92: { cls: "animates", id: "leftPortal", canPass: true }, - 93: { cls: "animates", id: "downPortal", canPass: true }, - 94: { cls: "animates", id: "rightPortal", canPass: true }, - 101: { cls: "animates", id: "crystalUp" }, - 102: { cls: "animates", id: "crystalBottom" }, - 103: { cls: "animates", id: "fire" }, - 104: { cls: "animates", id: "switch" }, - 109: { - cls: "animates", - id: "magentaWall", - canBreak: true, - animate: 1, - doorInfo: { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: {}, - }, - }, - 121: { cls: "npcs", id: "man" }, - 122: { cls: "npcs", id: "trader" }, - 123: { cls: "npcs", id: "thief" }, - 124: { cls: "npcs", id: "fairy" }, - 125: { cls: "npcs", id: "wizard" }, - 126: { cls: "npcs", id: "recluse" }, - 127: { cls: "npcs", id: "king" }, - 128: { cls: "npcs", id: "youngMan" }, - 129: { cls: "npcs", id: "sign" }, - 130: { cls: "npcs", id: "expShop" }, - 131: { cls: "npcs", id: "moneyShop" }, - 132: { cls: "npcs", id: "princess" }, - 133: { - cls: "npc48", - id: "npc0", - faceIds: { down: "npc0", left: "npc1", right: "npc2", up: "npc3" }, - animate: 1, - }, - 134: { - cls: "npc48", - id: "npc1", - faceIds: { down: "npc0", left: "npc1", right: "npc2", up: "npc3" }, - animate: 1, - }, - 135: { - cls: "npc48", - id: "npc2", - faceIds: { down: "npc0", left: "npc1", right: "npc2", up: "npc3" }, - animate: 1, - }, - 136: { - cls: "npc48", - id: "npc3", - faceIds: { down: "npc0", left: "npc1", right: "npc2", up: "npc3" }, - animate: 1, - }, - 137: { cls: "npcs", id: "greenMan" }, - 138: { cls: "npcs", id: "blueTrader" }, - 140: { cls: "autotile", id: "autotile4" }, - 141: { cls: "autotile", id: "autotile8" }, - 142: { cls: "autotile", id: "autotile9" }, - 143: { cls: "autotile", id: "autotile10" }, - 144: { cls: "autotile", id: "autotile12" }, - 151: { cls: "autotile", id: "autotile1" }, - 152: { cls: "autotile", id: "autotile2" }, - 153: { cls: "autotile", id: "autotile3" }, - 161: { - cls: "terrains", - id: "arrowUp", - canPass: true, - cannotOut: ["left", "right", "down"], - cannotIn: ["up"], - }, - 162: { - cls: "terrains", - id: "arrowDown", - canPass: true, - cannotOut: ["left", "right", "up"], - cannotIn: ["down"], - }, - 163: { - cls: "terrains", - id: "arrowLeft", - canPass: true, - cannotOut: ["up", "down", "right"], - cannotIn: ["left"], - }, - 164: { - cls: "terrains", - id: "arrowRight", - canPass: true, - cannotOut: ["up", "down", "left"], - cannotIn: ["right"], - }, - 165: { - cls: "terrains", - id: "light", - trigger: "null", - canPass: true, - script: - "(function () {\n\tcore.setBlock(core.getNumberById('darkLight'), core.getHeroLoc('x'), core.getHeroLoc('y'));\n})();", - }, - 166: { cls: "terrains", id: "darkLight" }, - 167: { cls: "terrains", id: "ski", trigger: "ski", canPass: true }, - 168: { cls: "terrains", id: "flower", canPass: true }, - 169: { cls: "terrains", id: "box", trigger: "pushBox" }, - 170: { cls: "terrains", id: "boxed", trigger: "pushBox" }, - 201: { cls: "enemys", id: "greenSlime" }, - 202: { cls: "enemys", id: "redSlime" }, - 203: { cls: "enemys", id: "blackSlime" }, - 204: { cls: "enemys", id: "slimelord" }, - 205: { cls: "enemys", id: "bat" }, - 206: { cls: "enemys", id: "bigBat" }, - 207: { cls: "enemys", id: "redBat" }, - 208: { cls: "enemys", id: "vampire" }, - 209: { cls: "enemys", id: "skeleton" }, - 210: { cls: "enemys", id: "skeletonWarrior" }, - 211: { cls: "enemys", id: "skeletonCaptain" }, - 212: { cls: "enemys", id: "ghostSoldier" }, - 213: { cls: "enemys", id: "zombie" }, - 214: { cls: "enemys", id: "zombieKnight" }, - 215: { cls: "enemys", id: "rock" }, - 216: { cls: "enemys", id: "slimeman" }, - 217: { cls: "enemys", id: "bluePriest" }, - 218: { cls: "enemys", id: "redPriest" }, - 219: { cls: "enemys", id: "brownWizard" }, - 220: { cls: "enemys", id: "redWizard" }, - 221: { cls: "enemys", id: "yellowGateKeeper" }, - 222: { cls: "enemys", id: "blueGateKeeper" }, - 223: { cls: "enemys", id: "redGateKeeper" }, - 224: { cls: "enemys", id: "swordsman" }, - 225: { cls: "enemys", id: "soldier" }, - 226: { cls: "enemys", id: "yellowKnight" }, - 227: { cls: "enemys", id: "redKnight" }, - 228: { cls: "enemys", id: "darkKnight" }, - 229: { cls: "enemys", id: "blackKing" }, - 230: { cls: "enemys", id: "yellowKing" }, - 231: { cls: "enemys", id: "greenKing" }, - 232: { cls: "enemys", id: "blueKnight" }, - 233: { cls: "enemys", id: "goldSlime" }, - 234: { cls: "enemys", id: "poisonSkeleton" }, - 235: { cls: "enemys", id: "poisonBat" }, - 236: { cls: "enemys", id: "ironRock" }, - 237: { cls: "enemys", id: "skeletonPriest" }, - 238: { cls: "enemys", id: "skeletonKing" }, - 239: { cls: "enemys", id: "skeletonPresbyter" }, - 240: { cls: "enemys", id: "skeletonKnight" }, - 241: { cls: "enemys", id: "evilHero" }, - 242: { cls: "enemys", id: "devilWarrior" }, - 243: { cls: "enemys", id: "demonPriest" }, - 244: { cls: "enemys", id: "goldHornSlime" }, - 245: { cls: "enemys", id: "redKing" }, - 246: { cls: "enemys", id: "blueKing" }, - 247: { cls: "enemys", id: "magicMaster" }, - 248: { cls: "enemys", id: "silverSlime" }, - 249: { cls: "enemys", id: "blademaster" }, - 250: { cls: "enemys", id: "whiteHornSlime" }, - 251: { cls: "enemys", id: "evilPrincess" }, - 252: { cls: "enemys", id: "evilFairy" }, - 253: { cls: "enemys", id: "yellowPriest" }, - 254: { cls: "enemys", id: "redSwordsman" }, - 255: { cls: "enemys", id: "whiteSlimeman" }, - 256: { cls: "enemys", id: "poisonZombie" }, - 257: { cls: "enemys", id: "dragon" }, - 258: { cls: "enemys", id: "octopus" }, - 259: { cls: "enemys", id: "fairyEnemy" }, - 260: { cls: "enemys", id: "princessEnemy" }, - 261: { cls: "enemy48", id: "angel" }, - 262: { cls: "enemy48", id: "elemental" }, - 263: { cls: "enemy48", id: "steelGuard" }, - 264: { cls: "enemy48", id: "evilBat" }, - 265: { cls: "enemys", id: "silverSlimelord" }, - 266: { cls: "enemys", id: "goldSlimelord" }, - 267: { cls: "enemys", id: "grayRock" }, - 270: { cls: "enemys", id: "greenKnight" }, - 271: { cls: "enemys", id: "bowman" }, - 272: { cls: "enemys", id: "purpleBowman" }, - 275: { cls: "enemys", id: "watcherSlime" }, - 277: { cls: "enemys", id: "frostBat" }, - 278: { cls: "enemys", id: "devilKnight" }, - 279: { cls: "enemys", id: "grayPriest" }, - 280: { cls: "enemys", id: "greenGateKeeper" }, - 300: { cls: "terrains", id: "ground" }, - 301: { - cls: "terrains", - id: "sWallT", - name: "薄墙-上", - cannotOut: ["up"], - cannotIn: ["up"], - }, - 302: { - cls: "terrains", - id: "sWallL", - name: "薄墙-左", - cannotOut: ["left"], - cannotIn: ["left"], - }, - 303: { - cls: "terrains", - id: "sWallR", - name: "薄墙-右", - cannotOut: ["right"], - cannotIn: ["right"], - }, - 304: { - cls: "terrains", - id: "sWallB", - name: "薄墙-下", - cannotOut: ["down"], - cannotIn: ["down"], - }, - 305: { cls: "terrains", id: "grass" }, - 306: { - cls: "terrains", - id: "sWallTL", - name: "薄墙-上左", - cannotOut: ["up", "left"], - cannotIn: ["up", "left"], - }, - 307: { - cls: "terrains", - id: "sWallBR", - name: "薄墙-下右", - cannotOut: ["down", "right"], - cannotIn: ["down", "right"], - }, - 308: { cls: "terrains", id: "grass2" }, - 309: { - cls: "terrains", - id: "sWallTR", - name: "薄墙-上右", - cannotOut: ["up", "right"], - cannotIn: ["up", "right"], - }, - 310: { - cls: "terrains", - id: "sWallBL", - name: "薄墙-下左", - cannotOut: ["down", "left"], - cannotIn: ["down", "left"], - }, - 311: { cls: "terrains", id: "ground2" }, - 312: { - cls: "terrains", - id: "sWallTB", - name: "薄墙-上下", - cannotOut: ["up", "down"], - cannotIn: ["up", "down"], - }, - 313: { cls: "terrains", id: "ground3" }, - 314: { - cls: "terrains", - id: "sWallLR", - name: "薄墙-左右", - cannotOut: ["left", "right"], - cannotIn: ["left", "right"], - }, - 315: { - cls: "terrains", - id: "sWallBLR", - name: "薄墙-下左右", - cannotOut: ["down", "left", "right"], - cannotIn: ["down", "left", "right"], - }, - 316: { - cls: "terrains", - id: "sWallTLR", - name: "薄墙-上左右", - cannotOut: ["up", "left", "right"], - cannotIn: ["up", "left", "right"], - }, - 317: { - cls: "terrains", - id: "sWallTBR", - name: "薄墙-上下右", - cannotOut: ["up", "down", "right"], - cannotIn: ["up", "down", "right"], - }, - 318: { - cls: "terrains", - id: "sWallTBL", - name: "薄墙-上下左", - cannotOut: ["up", "down", "left"], - cannotIn: ["up", "down", "left"], - }, - 319: { - cls: "npc48", - id: "tallYellowDoor", - trigger: "openDoor", - name: "高黄门", - animate: 1, - doorInfo: { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: { yellowKey: 1 }, - }, - }, - 320: { - cls: "npc48", - id: "tallBlueDoor", - trigger: "openDoor", - name: "高蓝门", - animate: 1, - doorInfo: { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: { blueKey: 1 }, - }, - }, - 321: { - cls: "npc48", - id: "tallRedDoor", - trigger: "openDoor", - name: "高红门", - animate: 1, - doorInfo: { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: { redKey: 1 }, - }, - }, - 322: { - cls: "npc48", - id: "tallGreenDoor", - trigger: "openDoor", - name: "高绿门", - animate: 1, - doorInfo: { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: { greenKey: 1 }, - }, - }, - 323: { - cls: "npc48", - id: "tallSpecialDoor", - trigger: "openDoor", - name: "高机关门", - animate: 1, - doorInfo: { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: { specialKey: 1 }, - }, - }, - 324: { - cls: "npc48", - id: "tallSteelDoor", - trigger: "openDoor", - name: "高铁门", - animate: 1, - doorInfo: { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: { steelKey: 1 }, - }, - }, - 325: { cls: "enemys", id: "keiskeiFairy" }, - 326: { cls: "enemys", id: "tulipFairy" }, - 327: { cls: "enemy48", id: "bearDown" }, - 328: { cls: "enemy48", id: "bearLeft" }, - 329: { cls: "enemy48", id: "bearRight" }, - 330: { cls: "enemy48", id: "bearUp" }, - 331: { cls: "terrains", id: "T331" }, - 332: { cls: "terrains", id: "T332" }, - 333: { cls: "terrains", id: "T333" }, - 334: { cls: "terrains", id: "T334" }, - 335: { cls: "terrains", id: "T335" }, - 336: { cls: "terrains", id: "T336" }, - 337: { cls: "terrains", id: "T337" }, - 338: { cls: "terrains", id: "T338" }, - 339: { cls: "terrains", id: "T339" }, - 340: { cls: "terrains", id: "T340" }, - 341: { cls: "terrains", id: "T341" }, - 342: { cls: "terrains", id: "T342" }, - 343: { cls: "terrains", id: "T343" }, - 344: { cls: "terrains", id: "T344" }, - 345: { cls: "terrains", id: "T345", canPass: true }, - 346: { cls: "terrains", id: "T346" }, - 347: { cls: "terrains", id: "T347" }, - 348: { cls: "terrains", id: "T348" }, - 349: { cls: "terrains", id: "T349" }, - 350: { cls: "terrains", id: "T350" }, - 351: { cls: "terrains", id: "T351" }, - 352: { cls: "terrains", id: "T352" }, - 353: { cls: "terrains", id: "T353" }, - 354: { cls: "terrains", id: "T354" }, - 355: { cls: "terrains", id: "T355" }, - 356: { cls: "terrains", id: "T356" }, - 357: { cls: "terrains", id: "T357" }, - 358: { cls: "terrains", id: "T358" }, - 359: { cls: "terrains", id: "T359" }, - 360: { cls: "terrains", id: "T360" }, - 361: { cls: "terrains", id: "T361" }, - 362: { cls: "terrains", id: "T362" }, - 363: { cls: "terrains", id: "T363" }, - 364: { cls: "terrains", id: "T364" }, - 365: { cls: "terrains", id: "T365" }, - 376: { cls: "terrains", id: "T376" }, - 377: { cls: "terrains", id: "T377" }, - 378: { cls: "terrains", id: "T378" }, - 379: { cls: "terrains", id: "T379" }, - 380: { cls: "terrains", id: "T380" }, - 381: { cls: "terrains", id: "T381" }, - 382: { cls: "terrains", id: "T382" }, - 383: { cls: "terrains", id: "T383" }, - 384: { cls: "terrains", id: "T384" }, - 385: { cls: "terrains", id: "T385" }, - 386: { cls: "terrains", id: "T386" }, - 387: { cls: "terrains", id: "T387" }, - 388: { cls: "terrains", id: "T388" }, - 389: { cls: "terrains", id: "T389" }, - 390: { cls: "terrains", id: "T390" }, - 391: { cls: "terrains", id: "T391" }, - 392: { cls: "terrains", id: "T392" }, - 393: { cls: "terrains", id: "T393" }, - 394: { cls: "terrains", id: "T394" }, - 395: { cls: "terrains", id: "T395" }, - 20034: { cls: "tileset", id: "X20034", canPass: true }, - 20154: { cls: "tileset", id: "X20154", canPass: true }, - 20216: { cls: "tileset", id: "X20216", canPass: true }, - 20217: { cls: "tileset", id: "X20217", canPass: true }, - 40054: { cls: "tileset", id: "X40054", canPass: false }, - 40090: { cls: "tileset", id: "X40090", canPass: true }, - 50054: { cls: "tileset", id: "X50054", canPass: false }, - 70505: { cls: "tileset", id: "X70505", canPass: true }, - 71182: { cls: "tileset", id: "X71182", canPass: false }, - 71183: { cls: "tileset", id: "X71183", canPass: false }, - 71229: { cls: "tileset", id: "X71229", canPass: true }, - 71818: { cls: "tileset", id: "X71818", canPass: true }, - 71887: { cls: "tileset", id: "X71887", canPass: true }, - 80003: { cls: "tileset", id: "X80003", canPass: true }, - 80007: { cls: "tileset", id: "X80007", canPass: true }, - 80010: { cls: "tileset", id: "X80010", canPass: true }, - 80011: { cls: "tileset", id: "X80011", canPass: true }, - 80020: { cls: "tileset", id: "X80020", canPass: true }, - 90226: { cls: "tileset", id: "X90226", canPass: false }, -}; +var maps_90f36752_8815_4be8_b32b_d7fad1d0542e = +{ + "1": {"cls":"animates","id":"yellowWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{}}}, + "2": {"cls":"animates","id":"whiteWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{}}}, + "3": {"cls":"animates","id":"blueWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{}}}, + "4": {"cls":"animates","id":"star","name":"星空"}, + "5": {"cls":"animates","id":"lava","name":"岩浆"}, + "6": {"cls":"animates","id":"ice","doorInfo":{"time":160,"openSound":"破冰镐","closeSound":"door.opus","keys":{"icePickaxe":1}},"animate":1}, + "7": {"cls":"terrains","id":"blueShopLeft"}, + "8": {"cls":"terrains","id":"blueShopRight"}, + "9": {"cls":"terrains","id":"pinkShopLeft"}, + "10": {"cls":"terrains","id":"pinkShopRight"}, + "11": {"cls":"animates","id":"lavaNet","canPass":true,"trigger":"null","script":"(function () {\n\t// 血网的伤害效果移动到 checkBlock 中处理\n\n\t// 如果要做一次性血网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})();","name":"血网"}, + "12": {"cls":"animates","id":"poisonNet","canPass":true,"trigger":"null","script":"(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'poison');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性毒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"毒网"}, + "13": {"cls":"animates","id":"weakNet","canPass":true,"trigger":"null","script":"(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'weak');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性衰网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"衰网"}, + "14": {"cls":"animates","id":"curseNet","canPass":true,"trigger":"null","script":"(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'curse');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性咒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"咒网"}, + "15": {"cls":"animates","id":"blueLava"}, + "16": {"cls":"animates","id":"water"}, + "20": {"cls":"autotile","id":"autotile"}, + "21": {"cls":"items","id":"yellowKey"}, + "22": {"cls":"items","id":"blueKey"}, + "23": {"cls":"items","id":"redKey"}, + "24": {"cls":"items","id":"greenKey"}, + "25": {"cls":"items","id":"steelKey"}, + "26": {"cls":"items","id":"bigKey"}, + "27": {"cls":"items","id":"redGem"}, + "28": {"cls":"items","id":"blueGem"}, + "29": {"cls":"items","id":"greenGem"}, + "30": {"cls":"items","id":"yellowGem"}, + "31": {"cls":"items","id":"redPotion"}, + "32": {"cls":"items","id":"bluePotion"}, + "33": {"cls":"items","id":"greenPotion"}, + "34": {"cls":"items","id":"yellowPotion"}, + "35": {"cls":"items","id":"sword1"}, + "36": {"cls":"items","id":"shield1"}, + "37": {"cls":"items","id":"sword2"}, + "38": {"cls":"items","id":"shield2"}, + "39": {"cls":"items","id":"sword3"}, + "40": {"cls":"items","id":"shield3"}, + "41": {"cls":"items","id":"sword4"}, + "42": {"cls":"items","id":"shield4"}, + "43": {"cls":"items","id":"sword5"}, + "44": {"cls":"items","id":"shield5"}, + "45": {"cls":"items","id":"book"}, + "46": {"cls":"items","id":"fly"}, + "47": {"cls":"items","id":"pickaxe"}, + "48": {"cls":"items","id":"icePickaxe"}, + "49": {"cls":"items","id":"bomb"}, + "50": {"cls":"items","id":"centerFly"}, + "51": {"cls":"items","id":"upFly"}, + "52": {"cls":"items","id":"downFly"}, + "53": {"cls":"items","id":"coin"}, + "54": {"cls":"items","id":"freezeBadge"}, + "55": {"cls":"items","id":"cross"}, + "56": {"cls":"items","id":"superPotion"}, + "57": {"cls":"items","id":"earthquake"}, + "58": {"cls":"items","id":"poisonWine"}, + "59": {"cls":"items","id":"weakWine"}, + "60": {"cls":"items","id":"curseWine"}, + "61": {"cls":"items","id":"superWine"}, + "62": {"cls":"items","id":"dagger"}, + "63": {"cls":"items","id":"pack"}, + "64": {"cls":"items","id":"amulet"}, + "65": {"cls":"items","id":"hammer"}, + "68": {"cls":"items","id":"lifeWand"}, + "69": {"cls":"items","id":"jumpShoes"}, + "70": {"cls":"items","id":"sword0"}, + "71": {"cls":"items","id":"shield0"}, + "72": {"cls":"items","id":"skill1"}, + "73": {"cls":"items","id":"wand"}, + "81": {"cls":"animates","id":"yellowDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"yellowKey":1}},"name":"黄门"}, + "82": {"cls":"animates","id":"blueDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"blueKey":1}},"name":"蓝门"}, + "83": {"cls":"animates","id":"redDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"redKey":1}},"name":"红门"}, + "84": {"cls":"animates","id":"greenDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"greenKey":1}},"name":"绿门"}, + "85": {"cls":"animates","id":"specialDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"specialKey":1}},"name":"机关门"}, + "86": {"cls":"animates","id":"steelDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"steelKey":1}},"name":"铁门"}, + "87": {"cls":"terrains","id":"upFloor","canPass":true}, + "88": {"cls":"terrains","id":"downFloor","canPass":true}, + "89": {"cls":"animates","id":"portal","canPass":true}, + "90": {"cls":"animates","id":"starPortal","canPass":true}, + "91": {"cls":"animates","id":"upPortal","canPass":true}, + "92": {"cls":"animates","id":"leftPortal","canPass":true}, + "93": {"cls":"animates","id":"downPortal","canPass":true}, + "94": {"cls":"animates","id":"rightPortal","canPass":true}, + "101": {"cls":"animates","id":"crystalUp"}, + "102": {"cls":"animates","id":"crystalBottom"}, + "103": {"cls":"animates","id":"fire"}, + "104": {"cls":"animates","id":"switch"}, + "109": {"cls":"animates","id":"magentaWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{}}}, + "121": {"cls":"npcs","id":"man"}, + "122": {"cls":"npcs","id":"trader"}, + "123": {"cls":"npcs","id":"thief"}, + "124": {"cls":"npcs","id":"fairy"}, + "125": {"cls":"npcs","id":"wizard"}, + "126": {"cls":"npcs","id":"recluse"}, + "127": {"cls":"npcs","id":"king"}, + "128": {"cls":"npcs","id":"youngMan"}, + "129": {"cls":"npcs","id":"sign"}, + "130": {"cls":"npcs","id":"expShop"}, + "131": {"cls":"npcs","id":"moneyShop"}, + "132": {"cls":"npcs","id":"princess"}, + "133": {"cls":"npc48","id":"npc0","faceIds":{"down":"npc0","left":"npc1","right":"npc2","up":"npc3"},"animate":1}, + "134": {"cls":"npc48","id":"npc1","faceIds":{"down":"npc0","left":"npc1","right":"npc2","up":"npc3"},"animate":1}, + "135": {"cls":"npc48","id":"npc2","faceIds":{"down":"npc0","left":"npc1","right":"npc2","up":"npc3"},"animate":1}, + "136": {"cls":"npc48","id":"npc3","faceIds":{"down":"npc0","left":"npc1","right":"npc2","up":"npc3"},"animate":1}, + "137": {"cls":"npcs","id":"greenMan"}, + "138": {"cls":"npcs","id":"blueTrader"}, + "140": {"cls":"autotile","id":"autotile4"}, + "141": {"cls":"autotile","id":"autotile8"}, + "142": {"cls":"autotile","id":"autotile9"}, + "143": {"cls":"autotile","id":"autotile10"}, + "144": {"cls":"autotile","id":"autotile12"}, + "151": {"cls":"autotile","id":"autotile1"}, + "152": {"cls":"autotile","id":"autotile2"}, + "153": {"cls":"autotile","id":"autotile3"}, + "161": {"cls":"terrains","id":"arrowUp","canPass":true,"cannotOut":["left","right","down"],"cannotIn":["up"]}, + "162": {"cls":"terrains","id":"arrowDown","canPass":true,"cannotOut":["left","right","up"],"cannotIn":["down"]}, + "163": {"cls":"terrains","id":"arrowLeft","canPass":true,"cannotOut":["up","down","right"],"cannotIn":["left"]}, + "164": {"cls":"terrains","id":"arrowRight","canPass":true,"cannotOut":["up","down","left"],"cannotIn":["right"]}, + "165": {"cls":"terrains","id":"light","trigger":"null","canPass":true,"script":"(function () {\n\tcore.setBlock(core.getNumberById('darkLight'), core.getHeroLoc('x'), core.getHeroLoc('y'));\n})();"}, + "166": {"cls":"terrains","id":"darkLight"}, + "167": {"cls":"terrains","id":"ski","trigger":"ski","canPass":true}, + "168": {"cls":"terrains","id":"flower","canPass":true}, + "169": {"cls":"terrains","id":"box","trigger":"pushBox"}, + "170": {"cls":"terrains","id":"boxed","trigger":"pushBox"}, + "201": {"cls":"enemys","id":"greenSlime"}, + "202": {"cls":"enemys","id":"redSlime"}, + "203": {"cls":"enemys","id":"blackSlime"}, + "204": {"cls":"enemys","id":"slimelord"}, + "205": {"cls":"enemys","id":"bat"}, + "206": {"cls":"enemys","id":"bigBat"}, + "207": {"cls":"enemys","id":"redBat"}, + "208": {"cls":"enemys","id":"vampire"}, + "209": {"cls":"enemys","id":"skeleton"}, + "210": {"cls":"enemys","id":"skeletonWarrior"}, + "211": {"cls":"enemys","id":"skeletonCaptain"}, + "212": {"cls":"enemys","id":"ghostSoldier"}, + "213": {"cls":"enemys","id":"zombie"}, + "214": {"cls":"enemys","id":"zombieKnight"}, + "215": {"cls":"enemys","id":"rock"}, + "216": {"cls":"enemys","id":"slimeman"}, + "217": {"cls":"enemys","id":"bluePriest"}, + "218": {"cls":"enemys","id":"redPriest"}, + "219": {"cls":"enemys","id":"brownWizard"}, + "220": {"cls":"enemys","id":"redWizard"}, + "221": {"cls":"enemys","id":"yellowGateKeeper"}, + "222": {"cls":"enemys","id":"blueGateKeeper"}, + "223": {"cls":"enemys","id":"redGateKeeper"}, + "224": {"cls":"enemys","id":"swordsman"}, + "225": {"cls":"enemys","id":"soldier"}, + "226": {"cls":"enemys","id":"yellowKnight"}, + "227": {"cls":"enemys","id":"redKnight"}, + "228": {"cls":"enemys","id":"darkKnight"}, + "229": {"cls":"enemys","id":"blackKing"}, + "230": {"cls":"enemys","id":"yellowKing"}, + "231": {"cls":"enemys","id":"greenKing"}, + "232": {"cls":"enemys","id":"blueKnight"}, + "233": {"cls":"enemys","id":"goldSlime"}, + "234": {"cls":"enemys","id":"poisonSkeleton"}, + "235": {"cls":"enemys","id":"poisonBat"}, + "236": {"cls":"enemys","id":"ironRock"}, + "237": {"cls":"enemys","id":"skeletonPriest"}, + "238": {"cls":"enemys","id":"skeletonKing"}, + "239": {"cls":"enemys","id":"skeletonPresbyter"}, + "240": {"cls":"enemys","id":"skeletonKnight"}, + "241": {"cls":"enemys","id":"evilHero"}, + "242": {"cls":"enemys","id":"devilWarrior"}, + "243": {"cls":"enemys","id":"demonPriest"}, + "244": {"cls":"enemys","id":"goldHornSlime"}, + "245": {"cls":"enemys","id":"redKing"}, + "246": {"cls":"enemys","id":"blueKing"}, + "247": {"cls":"enemys","id":"magicMaster"}, + "248": {"cls":"enemys","id":"silverSlime"}, + "249": {"cls":"enemys","id":"blademaster"}, + "250": {"cls":"enemys","id":"whiteHornSlime"}, + "251": {"cls":"enemys","id":"evilPrincess"}, + "252": {"cls":"enemys","id":"evilFairy"}, + "253": {"cls":"enemys","id":"yellowPriest"}, + "254": {"cls":"enemys","id":"redSwordsman"}, + "255": {"cls":"enemys","id":"whiteSlimeman"}, + "256": {"cls":"enemys","id":"poisonZombie"}, + "257": {"cls":"enemys","id":"dragon"}, + "258": {"cls":"enemys","id":"octopus"}, + "259": {"cls":"enemys","id":"fairyEnemy"}, + "260": {"cls":"enemys","id":"princessEnemy"}, + "261": {"cls":"enemy48","id":"angel"}, + "262": {"cls":"enemy48","id":"elemental"}, + "263": {"cls":"enemy48","id":"steelGuard"}, + "264": {"cls":"enemy48","id":"evilBat"}, + "265": {"cls":"enemys","id":"silverSlimelord"}, + "266": {"cls":"enemys","id":"goldSlimelord"}, + "267": {"cls":"enemys","id":"grayRock"}, + "270": {"cls":"enemys","id":"greenKnight"}, + "271": {"cls":"enemys","id":"bowman"}, + "272": {"cls":"enemys","id":"purpleBowman"}, + "275": {"cls":"enemys","id":"watcherSlime"}, + "277": {"cls":"enemys","id":"frostBat"}, + "278": {"cls":"enemys","id":"devilKnight"}, + "279": {"cls":"enemys","id":"grayPriest"}, + "280": {"cls":"enemys","id":"greenGateKeeper"}, + "300": {"cls":"terrains","id":"ground"}, + "301": {"cls":"terrains","id":"sWallT","name":"薄墙-上","cannotOut":["up"],"cannotIn":["up"]}, + "302": {"cls":"terrains","id":"sWallL","name":"薄墙-左","cannotOut":["left"],"cannotIn":["left"]}, + "303": {"cls":"terrains","id":"sWallR","name":"薄墙-右","cannotOut":["right"],"cannotIn":["right"]}, + "304": {"cls":"terrains","id":"sWallB","name":"薄墙-下","cannotOut":["down"],"cannotIn":["down"]}, + "305": {"cls":"terrains","id":"grass"}, + "306": {"cls":"terrains","id":"sWallTL","name":"薄墙-上左","cannotOut":["up","left"],"cannotIn":["up","left"]}, + "307": {"cls":"terrains","id":"sWallBR","name":"薄墙-下右","cannotOut":["down","right"],"cannotIn":["down","right"]}, + "308": {"cls":"terrains","id":"grass2"}, + "309": {"cls":"terrains","id":"sWallTR","name":"薄墙-上右","cannotOut":["up","right"],"cannotIn":["up","right"]}, + "310": {"cls":"terrains","id":"sWallBL","name":"薄墙-下左","cannotOut":["down","left"],"cannotIn":["down","left"]}, + "311": {"cls":"terrains","id":"ground2"}, + "312": {"cls":"terrains","id":"sWallTB","name":"薄墙-上下","cannotOut":["up","down"],"cannotIn":["up","down"]}, + "313": {"cls":"terrains","id":"ground3"}, + "314": {"cls":"terrains","id":"sWallLR","name":"薄墙-左右","cannotOut":["left","right"],"cannotIn":["left","right"]}, + "315": {"cls":"terrains","id":"sWallBLR","name":"薄墙-下左右","cannotOut":["down","left","right"],"cannotIn":["down","left","right"]}, + "316": {"cls":"terrains","id":"sWallTLR","name":"薄墙-上左右","cannotOut":["up","left","right"],"cannotIn":["up","left","right"]}, + "317": {"cls":"terrains","id":"sWallTBR","name":"薄墙-上下右","cannotOut":["up","down","right"],"cannotIn":["up","down","right"]}, + "318": {"cls":"terrains","id":"sWallTBL","name":"薄墙-上下左","cannotOut":["up","down","left"],"cannotIn":["up","down","left"]}, + "319": {"cls":"npc48","id":"tallYellowDoor","trigger":"openDoor","name":"高黄门","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"yellowKey":1}}}, + "320": {"cls":"npc48","id":"tallBlueDoor","trigger":"openDoor","name":"高蓝门","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"blueKey":1}}}, + "321": {"cls":"npc48","id":"tallRedDoor","trigger":"openDoor","name":"高红门","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"redKey":1}}}, + "322": {"cls":"npc48","id":"tallGreenDoor","trigger":"openDoor","name":"高绿门","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"greenKey":1}}}, + "323": {"cls":"npc48","id":"tallSpecialDoor","trigger":"openDoor","name":"高机关门","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"specialKey":1}}}, + "324": {"cls":"npc48","id":"tallSteelDoor","trigger":"openDoor","name":"高铁门","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"steelKey":1}}}, + "325": {"cls":"enemys","id":"keiskeiFairy"}, + "326": {"cls":"enemys","id":"tulipFairy"}, + "327": {"cls":"enemy48","id":"bearDown"}, + "328": {"cls":"enemy48","id":"bearLeft"}, + "329": {"cls":"enemy48","id":"bearRight"}, + "330": {"cls":"enemy48","id":"bearUp"}, + "331": {"cls":"terrains","id":"T331"}, + "332": {"cls":"terrains","id":"T332"}, + "333": {"cls":"terrains","id":"T333"}, + "334": {"cls":"terrains","id":"T334"}, + "335": {"cls":"terrains","id":"T335"}, + "336": {"cls":"terrains","id":"T336"}, + "337": {"cls":"terrains","id":"T337"}, + "338": {"cls":"terrains","id":"T338"}, + "339": {"cls":"terrains","id":"T339"}, + "340": {"cls":"terrains","id":"T340"}, + "341": {"cls":"terrains","id":"T341"}, + "342": {"cls":"terrains","id":"T342"}, + "343": {"cls":"terrains","id":"T343"}, + "344": {"cls":"terrains","id":"T344"}, + "345": {"cls":"terrains","id":"T345","canPass":true}, + "346": {"cls":"terrains","id":"T346"}, + "347": {"cls":"terrains","id":"T347"}, + "348": {"cls":"terrains","id":"T348"}, + "349": {"cls":"terrains","id":"T349"}, + "350": {"cls":"terrains","id":"T350"}, + "351": {"cls":"terrains","id":"T351"}, + "352": {"cls":"terrains","id":"T352"}, + "353": {"cls":"terrains","id":"T353"}, + "354": {"cls":"terrains","id":"T354"}, + "355": {"cls":"terrains","id":"T355"}, + "356": {"cls":"terrains","id":"T356"}, + "357": {"cls":"terrains","id":"T357"}, + "358": {"cls":"terrains","id":"T358"}, + "359": {"cls":"terrains","id":"T359"}, + "360": {"cls":"terrains","id":"T360"}, + "361": {"cls":"terrains","id":"T361"}, + "362": {"cls":"terrains","id":"T362"}, + "363": {"cls":"terrains","id":"T363"}, + "364": {"cls":"terrains","id":"T364"}, + "365": {"cls":"terrains","id":"T365"}, + "366": {"cls":"items","id":"I366"}, + "367": {"cls":"items","id":"I367"}, + "368": {"cls":"items","id":"I368"}, + "369": {"cls":"items","id":"I369"}, + "370": {"cls":"items","id":"I370"}, + "371": {"cls":"items","id":"I371"}, + "372": {"cls":"items","id":"I372"}, + "373": {"cls":"items","id":"I373"}, + "374": {"cls":"items","id":"I374"}, + "375": {"cls":"items","id":"I375"}, + "376": {"cls":"terrains","id":"T376"}, + "377": {"cls":"terrains","id":"T377"}, + "378": {"cls":"terrains","id":"T378"}, + "379": {"cls":"terrains","id":"T379"}, + "380": {"cls":"terrains","id":"T380"}, + "381": {"cls":"terrains","id":"T381"}, + "382": {"cls":"terrains","id":"T382"}, + "383": {"cls":"terrains","id":"T383"}, + "384": {"cls":"terrains","id":"T384"}, + "385": {"cls":"terrains","id":"T385"}, + "386": {"cls":"terrains","id":"T386"}, + "387": {"cls":"terrains","id":"T387"}, + "388": {"cls":"terrains","id":"T388"}, + "389": {"cls":"terrains","id":"T389"}, + "390": {"cls":"terrains","id":"T390"}, + "391": {"cls":"terrains","id":"T391"}, + "392": {"cls":"terrains","id":"T392"}, + "393": {"cls":"terrains","id":"T393"}, + "394": {"cls":"terrains","id":"T394"}, + "395": {"cls":"terrains","id":"T395"}, + "396": {"cls":"items","id":"I396"}, + "20034": {"cls":"tileset","id":"X20034","canPass":true}, + "20154": {"cls":"tileset","id":"X20154","canPass":true}, + "20216": {"cls":"tileset","id":"X20216","canPass":true}, + "20217": {"cls":"tileset","id":"X20217","canPass":true}, + "40054": {"cls":"tileset","id":"X40054","canPass":false}, + "40090": {"cls":"tileset","id":"X40090","canPass":true}, + "50054": {"cls":"tileset","id":"X50054","canPass":false}, + "70505": {"cls":"tileset","id":"X70505","canPass":true}, + "71182": {"cls":"tileset","id":"X71182","canPass":false}, + "71183": {"cls":"tileset","id":"X71183","canPass":false}, + "71229": {"cls":"tileset","id":"X71229","canPass":true}, + "71818": {"cls":"tileset","id":"X71818","canPass":true}, + "71887": {"cls":"tileset","id":"X71887","canPass":true}, + "80003": {"cls":"tileset","id":"X80003","canPass":true}, + "80007": {"cls":"tileset","id":"X80007","canPass":true}, + "80010": {"cls":"tileset","id":"X80010","canPass":true}, + "80011": {"cls":"tileset","id":"X80011","canPass":true}, + "80020": {"cls":"tileset","id":"X80020","canPass":true}, + "90226": {"cls":"tileset","id":"X90226","canPass":false} +} \ No newline at end of file diff --git a/project/plugins.js b/project/plugins.js index 9d0ecff..170978f 100644 --- a/project/plugins.js +++ b/project/plugins.js @@ -14258,508 +14258,511 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ); }, "CG回廊": function () { - // 在此增加新插件 - const CGUI = document.createElement("canvas"); //CGui画布设置 - CGUI.style.position = "absolute"; - CGUI.style.zIndex = 300; - CGUI.style.display = "none"; - CGUI.id = "CGUI"; - main.dom.gameGroup.insertAdjacentElement("afterend", CGUI); - CGUI.style.top = "50%"; - CGUI.style.left = "50%"; - CGUI.style.transform = "translate(-50%,-50%)"; - const ctx = CGUI.getContext("2d"); - main.dom.CGUI = CGUI; - let page = 0; //初始页面 - let show = false; //展示状态 - CGUI.onclick = function (e) { - try { - e.preventDefault(); - if (core.isPlaying()) return false; - 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.CG.onclick(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; + // 在此增加新插件 + const CGUI = document.createElement("canvas"); //CGui画布设置 + CGUI.style.position = "absolute"; + CGUI.style.zIndex = 300; + CGUI.style.display = "none"; + CGUI.id = "CGUI"; + main.dom.gameGroup.insertAdjacentElement("afterend", CGUI); + CGUI.style.top = "50%"; + CGUI.style.left = "50%"; + CGUI.style.transform = "translate(-50%,-50%)"; + const ctx = CGUI.getContext("2d"); + main.dom.CGUI = CGUI; + let page = 0; //初始页面 + let show = false; //展示状态 + CGUI.onclick = function (e) { + try { + e.preventDefault(); + if (core.isPlaying()) return false; + 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.CG.onclick(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; - class CG { - constructor() { - this.cgs; - //cg列表 - this.UIMx = [ - //空位用‘none’填充,当前ui至多4列6行 - [ - ["eve_010102.webp", "eve_010203.webp", "eve_010304.webp"], - ["eve_010501.webp", "eve_010601.webp", "eve_010701.webp"], - ], - [ - ["eve_010801.webp", "eve_010902.webp", "eve_011001.webp"], - ["eve_011101.webp", "eve_011202.webp", "eve_011302.webp"], - ], - [ - ["eve_011402.webp", "eve_020102.webp", "eve_020201.webp"], - ["eve_020301.webp", "eve_020401.webp", "eve_020501.webp"], - ], - [ - ["eve_020605.webp", "eve_020701.webp", "eve_020801.webp"], - ["eve_030101.webp", "eve_030206.webp", "eve_030302.webp"], - ], - [ - ["eve_030508.webp", "eve_030601.webp", "eve_030801.webp"], - ["eve_030901.webp", "eve_031002.webp", "eve_031101.webp"], - ], - [ - ["eve_040201.webp", "eve_040401.webp", "eve_040501.webp"], - ["eve_040601.webp", "eve_040702.webp", "eve_040801.webp"], - ], - [ - ["eve_050101.webp", "eve_050201.webp", "eve_050401.webp"], - ["eve_050501.webp", "eve_050601.webp", "eve_050704.webp"], - ], - [ - ["eve_050801.webp", "eve_070101.webp", "bg_1511.webp"], - ["bg_1521.webp", "bg_2011.webp", "bg_2521.webp"], - ], - [ - ["bg_3042.webp", "bg_3551.webp", "bg_3571.webp"], - ["bg_3721.webp", "bg_5033.webp", "bg_5044.webp"], - ], - ]; - } + class CG { + constructor() { + this.cgs; + //cg列表 + this.UIMx = [ + //空位用‘none’填充,当前ui3*2 + [ + ["eve_010102.webp", "eve_010203.webp", "eve_010304.webp"], + ["eve_010501.webp", "eve_010601.webp", "eve_010701.webp"], + ], + [ + ["eve_010801.webp", "eve_010902.webp", "eve_011001.webp"], + ["eve_011101.webp", "eve_011202.webp", "eve_011302.webp"], + ], + [ + ["eve_011402.webp", "eve_020102.webp", "eve_020201.webp"], + ["eve_020301.webp", "eve_020401.webp", "eve_020501.webp"], + ], + [ + ["eve_020605.webp", "eve_020701.webp", "eve_020801.webp"], + ["eve_030101.webp", "eve_030206.webp", "eve_030302.webp"], + ], + [ + ["eve_030508.webp", "eve_030601.webp", "eve_030801.webp"], + ["eve_030901.webp", "eve_031002.webp", "eve_031101.webp"], + ], + [ + ["eve_040201.webp", "eve_040401.webp", "eve_040501.webp"], + ["eve_040601.webp", "eve_040702.webp", "eve_040801.webp"], + ], + [ + ["eve_050101.webp", "eve_050201.webp", "eve_050401.webp"], + ["eve_050501.webp", "eve_050601.webp", "eve_050704.webp"], + ], + [ + ["eve_050801.webp", "eve_070101.webp", "bg_1511.webp"], + ["bg_1521.webp", "bg_2011.webp", "bg_2521.webp"], + ], + [ + ["bg_3042.webp", "bg_3551.webp", "bg_3571.webp"], + ["bg_3721.webp", "bg_5033.webp", "bg_5044.webp"], + ], + ]; + } - //更新 - update() { - this.background(); - this.drawUI(); - } - background() { - //画布大小设置 - if (core.domStyle.isVertical) { - CGUI.width = 1248; - CGUI.height = 2028; - } else { - CGUI.width = 2028; - CGUI.height = 1248; - } - core.setTextAlign(ctx, "center"); - } - onclick(px, py) { - //点击 + //更新 + update() { + this.background(); + this.drawUI(); + } + background() { + //画布大小设置 + if (core.domStyle.isVertical) { + CGUI.width = 1248; + CGUI.height = 2028; + } else { + CGUI.width = 2028; + CGUI.height = 1248; + } + core.setTextAlign(ctx, "center"); + } + onclick(px, py) { + //点击 - if (show) { - show = !show; - core.clearMap(ctx); - this.update(); - return; - } - 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)) { - //离开按钮是一致的,其余的记区分横竖屏 - CGUI.style.display = "none"; - core.clearMap(ctx); - core.restart(); - return; - } - if (core.domStyle.isVertical) { - //竖屏 - const pageupbox = makeBox([200, 1830], [200, 100]); - const pagedownbox = makeBox([900, 1830], [200, 100]); + if (show) { + show = !show; + core.clearMap(ctx); + this.update(); + return; + } + 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)) { + //离开按钮是一致的,其余的记区分横竖屏 + CGUI.style.display = "none"; + core.clearMap(ctx); + core.restart(); + return; + } + if (core.domStyle.isVertical) { + //竖屏 + const pageupbox = makeBox([200, 1830], [200, 100]); + const pagedownbox = makeBox([900, 1830], [200, 100]); - const imagebox0 = makeBox([50, 200], [560, 420]); - const imagebox1 = makeBox([50, 750], [560, 420]); - const imagebox2 = makeBox([50, 1300], [560, 420]); + const imagebox0 = makeBox([50, 200], [560, 420]); + const imagebox1 = makeBox([50, 750], [560, 420]); + const imagebox2 = makeBox([50, 1300], [560, 420]); - const imagebox3 = makeBox([650, 200], [560, 420]); - const imagebox4 = makeBox([650, 750], [560, 420]); - const imagebox5 = makeBox([650, 1300], [560, 420]); - if (inRect(pos, pagedownbox)) { - //2代表当前最大页数-1 - if (page < this.UIMx.length - 1) { - page++; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, pageupbox)) { - if (page > 0) { - page--; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, imagebox0)) { - if (this.cgs.includes(this.UIMx[page][0][0])) { - const img = core.material.images.images[this.UIMx[page][0][0]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox1)) { - if (this.cgs.includes(this.UIMx[page][0][1])) { - const img = core.material.images.images[this.UIMx[page][0][1]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox2)) { - if (this.cgs.includes(this.UIMx[page][0][2])) { - const img = core.material.images.images[this.UIMx[page][0][2]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox3)) { - if (this.cgs.includes(this.UIMx[page][1][0])) { - const img = core.material.images.images[this.UIMx[page][1][0]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox4)) { - if (this.cgs.includes(this.UIMx[page][1][1])) { - const img = core.material.images.images[this.UIMx[page][1][1]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox5)) { - if (this.cgs.includes(this.UIMx[page][1][2])) { - const img = core.material.images.images[this.UIMx[page][1][2]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } - } else { - const pageupbox = makeBox([200, 1110], [200, 100]); - const pagedownbox = makeBox([1600, 1110], [200, 100]); - const imagebox0 = makeBox([75, 150], [600, 450]); - const imagebox1 = makeBox([725, 150], [600, 450]); - const imagebox2 = makeBox([1300, 150], [600, 450]); - const imagebox3 = makeBox([75, 650], [600, 450]); - const imagebox4 = makeBox([725, 650], [600, 450]); - const imagebox5 = makeBox([1375, 650], [600, 450]); - if (inRect(pos, pagedownbox)) { - if (page < this.UIMx.length - 1) { - page++; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, pageupbox)) { - if (page > 0) { - page--; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, imagebox0)) { - if (this.cgs.includes(this.UIMx[page][0][0])) { - const img = core.material.images.images[this.UIMx[page][0][0]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox1)) { - if (this.cgs.includes(this.UIMx[page][0][1])) { - const img = core.material.images.images[this.UIMx[page][0][1]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox2)) { - if (this.cgs.includes(this.UIMx[page][0][2])) { - const img = core.material.images.images[this.UIMx[page][0][2]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox3)) { - if (this.cgs.includes(this.UIMx[page][1][0])) { - const img = core.material.images.images[this.UIMx[page][1][0]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox4)) { - if (this.cgs.includes(this.UIMx[page][1][1])) { - const img = core.material.images.images[this.UIMx[page][1][1]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox5)) { - if (this.cgs.includes(this.UIMx[page][1][2])) { - const img = core.material.images.images[this.UIMx[page][1][2]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } - } - } - drawUI() { - //绘制页面 - core.clearMap(CGUI); - const bgVertical = core.material.images.images["bg_2010.webp"]; //竖屏背景 - const bg = core.material.images.images["bg_5043.webp"]; //横屏背景 + const imagebox3 = makeBox([650, 200], [560, 420]); + const imagebox4 = makeBox([650, 750], [560, 420]); + const imagebox5 = makeBox([650, 1300], [560, 420]); + if (inRect(pos, pagedownbox)) { + //2代表当前最大页数-1 + if (page < this.UIMx.length - 1) { + page++; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, pageupbox)) { + if (page > 0) { + page--; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, imagebox0)) { + if (this.cgs.includes(this.UIMx[page][0][0])) { + const img = core.material.images.images[this.UIMx[page][0][0]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox1)) { + if (this.cgs.includes(this.UIMx[page][0][1])) { + const img = core.material.images.images[this.UIMx[page][0][1]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox2)) { + if (this.cgs.includes(this.UIMx[page][0][2])) { + const img = core.material.images.images[this.UIMx[page][0][2]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox3)) { + if (this.cgs.includes(this.UIMx[page][1][0])) { + const img = core.material.images.images[this.UIMx[page][1][0]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox4)) { + if (this.cgs.includes(this.UIMx[page][1][1])) { + const img = core.material.images.images[this.UIMx[page][1][1]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox5)) { + if (this.cgs.includes(this.UIMx[page][1][2])) { + const img = core.material.images.images[this.UIMx[page][1][2]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } + } else { + const pageupbox = makeBox([200, 1110], [200, 100]); + const pagedownbox = makeBox([1600, 1110], [200, 100]); + const imagebox0 = makeBox([75, 150], [600, 450]); + const imagebox1 = makeBox([725, 150], [600, 450]); + const imagebox2 = makeBox([1300, 150], [600, 450]); + const imagebox3 = makeBox([75, 650], [600, 450]); + const imagebox4 = makeBox([725, 650], [600, 450]); + const imagebox5 = makeBox([1375, 650], [600, 450]); + if (inRect(pos, pagedownbox)) { + if (page < this.UIMx.length - 1) { + page++; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, pageupbox)) { + if (page > 0) { + page--; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, imagebox0)) { + if (this.cgs.includes(this.UIMx[page][0][0])) { + const img = core.material.images.images[this.UIMx[page][0][0]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox1)) { + if (this.cgs.includes(this.UIMx[page][0][1])) { + const img = core.material.images.images[this.UIMx[page][0][1]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox2)) { + if (this.cgs.includes(this.UIMx[page][0][2])) { + const img = core.material.images.images[this.UIMx[page][0][2]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox3)) { + if (this.cgs.includes(this.UIMx[page][1][0])) { + const img = core.material.images.images[this.UIMx[page][1][0]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox4)) { + if (this.cgs.includes(this.UIMx[page][1][1])) { + const img = core.material.images.images[this.UIMx[page][1][1]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox5)) { + if (this.cgs.includes(this.UIMx[page][1][2])) { + const img = core.material.images.images[this.UIMx[page][1][2]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } + } + } + drawUI() { + //绘制页面 + core.clearMap(CGUI); + const bgVertical = core.material.images.images["bg_2010.webp"]; //竖屏背景 + const bg = core.material.images.images["bg_5043.webp"]; //横屏背景 - if (core.domStyle.isVertical) { - //竖屏 + if (core.domStyle.isVertical) { + //竖屏 - core.fillRect(ctx, 0, 0, 1248, 2028, "#000000"); //黑色背景 - ctx.globalAlpha = 0.5; //透明度 - if (bgVertical) - ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片 - ctx.globalAlpha = 1; //恢复为不透明 + core.fillRect(ctx, 0, 0, 1248, 2028, "#000000"); //黑色背景 + ctx.globalAlpha = 0.5; //透明度 + if (bgVertical) + ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片 + ctx.globalAlpha = 1; //恢复为不透明 - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - "◀离开", - 100, - 110, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + "◀离开", + 100, + 110, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - core.fillBoldText1( - ctx, - "上一页", - 300, - 1900, - page === 0 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + core.fillBoldText1( + ctx, + "上一页", + 300, + 1900, + page === 0 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - core.fillBoldText1( - ctx, - page + 1 + "/" + this.UIMx.length, - 650, - 1900, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - ctx, - "下一页", - 1000, - 1900, - page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - // 添加向上翻页和向下翻页的按钮 + core.fillBoldText1( + ctx, + page + 1 + "/" + this.UIMx.length, + 650, + 1900, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + ctx, + "下一页", + 1000, + 1900, + page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + // 添加向上翻页和向下翻页的按钮 - // 添加3*2个4:3的画框,及图片 - for (let i = 0; i < 3; i++) { - for (let j = 0; j < 2; j++) { - const img = core.material.images.images[this.UIMx[page][j][i]]; - core.strokeRect( - ctx, - 50 + j * 600, - 200 + i * 550, - 560, - 420, - "#444444", - 5 - ); - if (this.cgs.includes(this.UIMx[page][j][i])) { - if (img) - ctx.drawImage( - img, - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - } else { - ctx.fillStyle = "#000000"; - ctx.fillRect( - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - const img = core.material.images.images["LOGO.webp"]; - if (img) - ctx.drawImage( - img, - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - } - } - } - } 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; //恢复为不透明 + // 添加3*2个4:3的画框,及图片 + for (let i = 0; i < 3; i++) { + for (let j = 0; j < 2; j++) { + const img = core.material.images.images[this.UIMx[page][j][i]]; + core.strokeRect( + ctx, + 50 + j * 600, + 200 + i * 550, + 560, + 420, + "#444444", + 5 + ); + if (this.cgs.includes(this.UIMx[page][j][i])) { + if (img) + ctx.drawImage( + img, + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + } else { + ctx.fillStyle = "#000000"; + ctx.fillRect( + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + const img = core.material.images.images["LOGO.webp"]; + if (img) + ctx.drawImage( + img, + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + } + } + } + } 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) - ); + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + "◀离开", + 110, + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - // 添加向上翻页和向下翻页的按钮 - core.fillBoldText1( - ctx, - "上一页", - 300, - 1180, - page === 0 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + // 添加向上翻页和向下翻页的按钮 + core.fillBoldText1( + ctx, + "上一页", + 300, + 1180, + page === 0 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - core.fillBoldText1( - ctx, - page + 1 + "/" + this.UIMx.length, - 1000, - 1180, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - ctx, - "下一页", - 1700, - 1180, - page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + core.fillBoldText1( + ctx, + page + 1 + "/" + this.UIMx.length, + 1000, + 1180, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + ctx, + "下一页", + 1700, + 1180, + page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - // 添加3*2个4:3的画框 - for (let i = 0; i < 2; i++) { - for (let j = 0; j < 3; j++) { - core.strokeRect( - ctx, - 75 + j * 650, - 150 + i * 500, - 600, - 450, - "#444444", - 2 - ); - if (this.cgs.includes(this.UIMx[page][i][j])) { - const img = core.material.images.images[this.UIMx[page][i][j]]; - if (img) - ctx.drawImage( - img, - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - } else { - ctx.fillStyle = "#000000"; - ctx.fillRect( - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - const img = core.material.images.images["LOGO.webp"]; - if (img) - ctx.drawImage( - img, - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - } - } - } - } - } - } - this.setcgs = function (img) { - const a = core.getLocalStorage("cgs", []); - if (img) { - if (!a.includes(img)) a.push(img); - core.setLocalStorage("cgs", a); - } else core.setLocalStorage("cgs"); - }; - core.ui.CG = new CG(); - main.dom.CGMode.onclick = function () { - //点击开始页面的CG MODE进入cg回廊 - main.core.control.checkBgm(); - page = 0; - main.core.ui.CG.cgs = core.getLocalStorage("cgs", []); - CGUI.style.display = "block"; - main.core.ui.CG.update(); - }; - }, + // 添加3*2个4:3的画框 + for (let i = 0; i < 2; i++) { + for (let j = 0; j < 3; j++) { + core.strokeRect( + ctx, + 75 + j * 650, + 150 + i * 500, + 600, + 450, + "#444444", + 2 + ); + if (this.cgs.includes(this.UIMx[page][i][j])) { + const img = core.material.images.images[this.UIMx[page][i][j]]; + if (img) + ctx.drawImage( + img, + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + } else { + ctx.fillStyle = "#000000"; + ctx.fillRect( + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + const img = core.material.images.images["LOGO.webp"]; + if (img) + ctx.drawImage( + img, + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + } + } + } + } + } + } + this.setcgs = function (img) { + const a = core.getLocalStorage("cgs", []); + if (img) { + if (!a.includes(img)) a.push(img); + core.setLocalStorage("cgs", a); + } else core.setLocalStorage("cgs"); + }; + core.ui.CG = new CG(); + main.dom.CGMode.onclick = function () { + //点击开始页面的CG MODE进入cg回廊 + main.core.control.checkBgm(); + page = 0; + main.core.ui.CG.cgs = core.getLocalStorage("cgs", []); + CGUI.style.display = "block"; + main.core.ui.CG.update(); + }; +}, "光标设置": function () { // 在此增加新插件 this.changeMouse = function ( @@ -18731,18 +18734,99 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 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.setTextAlign(ctx, "center"); core.fillBoldText( ctx, hero.name, - 112, - 128, + 127, + 123, "#FFFFFF", "#000000", - core.ui._buildFont(14, true) + 'bold 14px pala' + ); + core.setTextAlign(ctx, "left"); + core.drawIcon(ctx, 'hp', 70, 190, 16, 16) + core.drawIcon(ctx, 'atk', 70, 210, 16, 16) + core.drawIcon(ctx, 'def', 70, 230, 16, 16) + core.drawIcon(ctx, 'I374', 70, 250, 16, 16) + core.drawIcon(ctx, 'I375', 70, 270, 16, 16) + core.drawIcon(ctx, 'mdef', 70, 290, 16, 16) + core.drawIcon(ctx, 'amulet', 70, 310, 16, 16) + core.drawIcon(ctx, 'jumpShoes', 70, 330, 16, 16) + core.fillBoldText( + ctx, + '生命 ' + core.formatBigNumber(heroInfo.hp, true) + " / " + core.formatBigNumber(heroInfo.hpmax, true), + 90, + 205, + "#FFFFFF", + "#000000", + 'bold 14px pala' + ); + core.fillBoldText( + ctx, + '攻击 ' + core.formatBigNumber(heroInfo.atk), + 90, + 225, + "#FFFFFF", + "#000000", + 'bold 14px pala' + ); + core.fillBoldText( + ctx, + '防御 ' + core.formatBigNumber(heroInfo.def), + 90, + 245, + "#FFFFFF", + "#000000", + 'bold 14px pala' + ); + core.fillBoldText( + ctx, + "法强 " + core.formatBigNumber(heroInfo.spell), + 90, + 265, + "#FFFFFF", + "#000000", + 'bold 14px pala' + ); + core.fillBoldText( + ctx, + "法攻 " + core.formatBigNumber(heroInfo.matk / 100 * heroInfo.spell) + "(" + heroInfo.matk + "%)", + 90, + 285, + "#FFFFFF", + "#000000", + 'bold 14px pala' + ); + core.fillBoldText( + ctx, + '护盾 ' + core.formatBigNumber(heroInfo.mdef / 100 * heroInfo.spell) + "(" + heroInfo.mdef + "%)", + 90, + 305, + "#FFFFFF", + "#000000", + 'bold 14px pala' + ); + core.fillBoldText( + ctx, + '法抗 ' + heroInfo.spelldef + "%", + 90, + 325, + "#FFFFFF", + "#000000", + 'bold 14px pala' + ); + core.fillBoldText( + ctx, + '速度 ' + core.formatBigNumber(heroInfo.speed), + 90, + 345, + "#FFFFFF", + "#000000", + 'bold 14px pala' ); - core.strokeRect(ctx, 112, 144, 32, 48, "rgba(255,255,255,1)", 1); + core.strokeRect(ctx, 112, 139, 32, 48, "rgba(255,255,255,1)", 1); core.drawImage( ctx, "hero.webp", @@ -18751,23 +18835,25 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 32, 48, 112, - 144, + 139, 32, 48 ); - core.setTextAlign(ctx, "right"); + + core.setTextAlign(ctx, "center"); core.fillBoldText( ctx, enemyInfo.name, - 304, - 128, + 289, + 123, "#FFFFFF", "#000000", - core.ui._buildFont(14, true) + 'bold 14px pala' ); + core.setTextAlign(ctx, "right"); if (enemyInfo.cls === "enemys") { - core.strokeRect(ctx, 272, 160, 32, 32, "rgba(255,255,255,1)", 1); + core.strokeRect(ctx, 272, 155, 32, 32, "rgba(255,255,255,1)", 1); core.drawImage( ctx, @@ -18777,12 +18863,12 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 32, 32, 272, - 160, + 155, 32, 32 ); } else { - core.strokeRect(ctx, 272, 144, 32, 48, "rgba(255,255,255,1)", 1); + core.strokeRect(ctx, 272, 139, 32, 48, "rgba(255,255,255,1)", 1); core.drawImage( ctx, @@ -18792,25 +18878,76 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 32, 48, 272, - 144, + 139, 32, 48 ); } + core.drawIcon(ctx, 'hp', 330, 190, 16, 16) + core.drawIcon(ctx, 'atk', 330, 210, 16, 16) + core.drawIcon(ctx, 'def', 330, 230, 16, 16) + core.drawIcon(ctx, 'amulet', 330, 250, 16, 16) + core.drawIcon(ctx, 'jumpShoes', 330, 270, 16, 16) + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.hp, true) + ' 生命', + 330, + 205, + "#FFFFFF", + "#000000", + 'bold 14px pala' + ); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.atk) + ' 攻击', + 330, + 225, + "#FFFFFF", + "#000000", + 'bold 14px pala' + ); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.def) + ' 防御', + 330, + 245, + "#FFFFFF", + "#000000", + 'bold 14px pala' + ); + + core.fillBoldText( + ctx, + (enemyInfo.mdef ?? 0) * 100 + "% 法抗", + 330, + 265, + "#FFFFFF", + "#000000", + 'bold 14px pala' + ); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.speed) + " 速度", + 330, + 285, + "#FFFFFF", + "#000000", + 'bold 14px pala' + ); core.fillBoldText(ctx, "V", 219, - 168, + 163, "#FFFFFF", "#000000", - core.ui._buildFont(48, true)) + 'bold 48px pala') core.fillBoldText(ctx, "s", 231, - 168, + 163, "#FFFFFF", "#000000", - core.ui._buildFont(36, true)) + 'bold 36px pala') }; this.attackAnimate = function ( @@ -18826,12 +18963,20 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = let hero_hp = core.getRealStatusOrDefault(hero, "hp"), hero_atk = core.getRealStatusOrDefault(hero, "atk"), hero_def = core.getRealStatusOrDefault(hero, "def"), + hero_spell = core.getRealStatusOrDefault(hero, "spell"), + hero_matk = core.getRealStatusOrDefault(hero, "mdef"), hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), - hero_speed = core.getRealStatusOrDefault(hero, "speed"); + hero_speed = core.getRealStatusOrDefault(hero, "speed"), + hero_hpmax = core.getRealStatusOrDefault(hero, "hpmax"), + hero_spelldef = core.getRealStatusOrDefault(hero, "spelldef"); const heroInfo = { hp: hero_hp, + hpmax: hero_hpmax, atk: hero_atk, def: hero_def, + spell: hero_spell, + spelldef: hero_spelldef, + matk: hero_matk, mdef: hero_mdef, speed: hero_speed, now: 0, @@ -18865,574 +19010,574 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "剧情内容": function () { - // 在此增加新插件 - // 每项为一个数组,第一项是名字,第二项是对话内容 - // 回放只会在同一个this下回放,进入剧情前请以事件块声明进入哪个剧情数组 - // 可以自由添加,但不能与已有插件及函数名相同,可以使用中文。 - this.chapter0 = [ - ["", "这些天,街道不曾下雨。"], - ["", "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。"], - ["", "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。"], - ["", "扑哧。"], - ["", "耳旁再次响起象征着某个女孩子死去的声音。"], - ["", "再一次——"], - ["", "再一次。"], - ["", "女子们被肢解成单纯的肉块。"], - ["", "我任由流下的血浸满全身,屏住自己的呼吸。"], - ["", "祈求自己能拥有从猎人手中逃脱的幸运。"], - ["", "扑哧。"], - ["", "直到刚才,我们还坐在去往娼馆的马车的路上。"], - ["", "而在这之中的某些人,已经不在这个世上了。"], - ["", "不,应该把“某些”换成“几乎所有”才更为恰当吧。"], - ["", "恐怕,不久之后我也会变成小巷中血腥的装饰品。"], - ["", "我是为了得到这种死法,才辛苦苟活至今的吗?"], - ["", "来个人告诉我啊——"], - ["", "谁都好。"], - ["", "来人啊!!"], - ["少女", "「呃······!?」"], - ["", "漆黑的物体充斥了我的整个视野"], - ["", "我很快意识到,那是只很大的脚。"], - ["", "必须要出声求救。"], - ["", "可是,耳中却只能听到自己的牙关不停交战的声音。"], - ["", "我是如此的无助。"], - ["", "逃跑也好,道歉也罢。"], - ["", "就连抬头看一眼将要杀掉我的人的面孔都做不到。"], - ["少女", "「······被杀」"], - ["", "会被杀。"], - ["", "会被杀!!"], - ["", "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。"], - ["少女", "「不,不要······」"], - ["", "浮游都市,《诺瓦斯·艾蒂尔》。"], - ["", "《特别受灾地区》——"], - ["", "通称,《牢狱》"], - ["", "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。"], - ["年轻人", "「放开我!」"], - ["年轻人", "「我只是在帮那个女人而已!」"], - ["年轻人", "「你们没听到吗!?」"], - ["年轻人", "「她是被受骗才会被卖到娼馆来的」"], - ["年轻人", "「用肮脏的手段把钱借给她父母的,就是你们这些家伙吧!?」"], - ["年轻人", "「给我说些什么啊」"], - ["凯伊姆", "「这些话等到了娼馆再说吧」"], - ["凯伊姆", "「我来抓你,只是受雇于人而已」"], - ["", "我走进娼馆《莉莉乌姆》的接待室。"], - ["", "正在桌旁整理账簿的奥兹停下手头的工作,抬起头向我看来。"], - ["奥兹", "「这不是凯伊姆先生吗,辛苦了」"], - ["奥兹", "「委托已经完成了吗?」"], - ["凯伊姆", "「啊啊,是这家伙没错吧」"], - ["", "奥兹用只要接触到就能杀人般的眼神在男人脸上搜过。"], - ["奥兹", "「没错,就是这个人」"], - ["凯伊姆", "「是么」"], - ["年轻人", "「你,你们要对我做什么」"], - ["奥兹", "「······」"], - ["", "奥兹用一个眼神,就让男人闭上了嘴。"], - ["", "然后,向我这边转过身来。"], - ["奥兹", "「抱歉啊,总是麻烦你去做这些无聊的事」"], - ["奥兹", "「都怪我们这边的年轻人太没用」"], - ["凯伊姆", "「客套话就免了」"], - ["奥兹", "「这还真是失礼了」"], - ["奥兹", "「喂,来个人」"], - ["光头男人", "「是」"], - ["奥兹", "「凯伊姆先生做完工作回来了」"], - ["光头男人", "「是,是,那个······」"], - ["奥兹", "「我是要你拿些酒来,这个蠢材!」"], - ["", "喀!"], - ["", "奥兹扔出的烟灰缸砸中了手下的额头。"], - ["", "鲜血四溅。"], - ["凯伊姆", "「不用这么麻烦」"], - ["凯伊姆", "「我接下来要去《菲诺列塔》」"], - ["奥兹", "「喔唷」"], - ["奥兹", "「既然如此,我就不留您在这里喝难饮的劣质酒了」"], - ["", "奥兹斜眼看着正捂住额头呻吟的手下,轻描淡写地说道。"], - ["凯伊姆", "「用这些钱去买药」"], - ["", "我将几枚铜钱仍在那个手下的身前。"], - ["奥兹", "「凯伊姆先生,不用对他们这么好」"], - ["凯伊姆", "「无妨」"], - ["凯伊姆", "「话说回来,那个要落跑的女人呢?」"], - ["奥兹", "「我把她交给那些年轻人了,现在应该正在体会人生的严苛吧」"], - ["奥兹", "「正好,趁此机会凯伊姆先生也来享受一番如何?」"], - ["年轻人", "「你,你们这些家伙,要对她做什么!?」"], - ["", "咣!"], - ["", "奥兹给了他一拳。"], - ["", "一击即倒。"], - ["", "喀,咚,咯!"], - ["", "奥兹毫不留情地向男人的脸上踩去。"], - ["年轻人", "「咕······呃咳······」"], - ["", "折断的牙齿伴着血泡被吐出。"], - ["", "这份白色在鲜红色的液体中格外显眼。"], - ["年轻人", "「你们以为做出这种事······卫兵会坐视不理吗······」"], - ["奥兹", "「啊啊,不会坐视不理的」"], - ["奥兹", "「应该会拿出你的钱包,和我们商量如何瓜分吧」"], - ["年轻人", "「那,那种事······」"], - ["", "这在牢狱是理所当然的事。"], - ["奥兹", "「怎么,头一回来牢狱么?」"], - ["", "男人点了点头。"], - ["奥兹", "「为了被骗的女人而来到牢狱,真是个规矩人啊」"], - ["奥兹", "「······前提是,被骗的人不是你」"], - ["年轻人", "「你说······我被骗了?」"], - ["年轻人", "「那,那是怎么回事!?」"], - ["奥兹", "「不用急,今天晚上会好好告诉你的」"], - ["", "奥兹抓起男人的脸。"], - ["", "为引诱客人的怜悯之心而装纯,是娼妇的惯用手段。"], - ["", "双亲被骗而借钱,结果作为抵押而将自己卖到这里,这是典型的说法。"], - [ - "", - "如果只是头脑发热而成为常客也就罢了,这次的男人热血过头,居然想出了要带女人私奔的计划。", - ], - [ - "", - "虽然女人半开玩笑地予以拒绝,但不知天高地厚的这家伙还是拉着她逃跑了。", - ], - ["", "不过,想要逃脱追击本来就是不可能的任务。"], - ["", "但即便如此,这种事情还是会一再的出现。"], - ["", "说谎的女人和被骗的男人。"], - ["", "在娼馆街,这是令人看到生厌的日常的风景。"], - ["凯伊姆", "「我要走了」"], - ["奥兹", "「好的,下次再麻烦您」"], - ["奥兹", "「之后吉克先生会将谢礼交给您的」"], - ["凯伊姆", "「啊啊」"], - ["", "我背向奥兹走出娼馆。"], - ["凯伊姆", "「······?」"], - ["", "从远方传来微弱的歌声。"], - ["", "是关卡广场的方向。"], - ["", "对了。"], - ["", "今天有觐见圣女的仪式。"], - ["", "当代的圣女伊莲——"], - ["", "俗称《盲眼之圣女》,据说即使在历代的圣女中,人气也是数一数二的。"], - ["", "广场上的人估计相当多吧。"], - ["", "虽然我也想去看看她长什么样,不过要在人潮中挤来挤去就免了。"], - ["", "还是老老实实去菲诺列塔喝烧酒吧。"], - ["", "正当我这样想着的时候,一个身影自小巷的那头走来。"], - ["凯伊姆", "「艾莉斯」"], - ]; - this.chapter01 = [ - ["艾莉斯", "「啊,凯伊姆」"], - ["艾莉斯", "「正好,我还想要去找你呢」"], - ["艾莉斯", "「没想到凯伊姆会主动出现······这是命运吗?」"], - ["凯伊姆", "「显然不是吧」"], - ["艾莉斯", "「啊,是么」"], - ["", "艾莉斯挑了挑整齐的双眉,微微地哼了一声。"], - [ - "", - "虽然是个相当引人注目的美人,但她这个将亲切儿子丢入无底深渊的性格,为自己扣了不少的分", - ], - ["", "给人印象最深的,就是那潭水般的双瞳。"], - ["", "在漆黑的瞳孔中,完全看不出感情的波动。"], - ["艾莉斯", "「喜欢我的眼睛吗?」"], - ["艾莉斯", "「如果想要的话就给你吧?」"], - ["凯伊姆", "「用不着」"], - ["艾莉斯", "「阿拉,可惜」"], - ["凯伊姆", "「那么,找我有什么事」"], - ["艾莉斯", "「梅尔特的钱好像被偷了」"], - ["凯伊姆", "「钱被偷了?都几岁了还这么没用」"], - ["艾莉斯", "「不要对我说啊」"], - ["凯伊姆", "「那家伙,该不会说要让我去抓那个小偷吧?」"], - ["艾莉斯", "「就是这样」"], - ["凯伊姆", "「笨蛋吗」"], - ["凯伊姆", "「如果是小钱的话,就当做是买个教训吧」"], - ["艾莉斯", "「说起来,被盗的是这个月的上纳金」"], - ["凯伊姆", "「你说什么?」"], - ["艾莉斯", "「用这些钱买教训,也太过奢侈了呢」"], - ["凯伊姆", "「知道了,我去找」"], - ["凯伊姆", "「小偷的特征呢」"], - ["艾莉斯", "「男孩子」"], - ["艾莉斯", "「······而且,背后有翅膀」"], - ["艾莉斯", "「虽然姑且是藏在身后,但是仔细观察的话是很明显的」"], - ["凯伊姆", "「羽化病吗」"], - [ - "艾莉斯", - "「那些人可是毫不留情的,所以即使是为了那个孩子,也要赶快抓到他」", - ], - ["凯伊姆", "「注意到他逃窜的方向了吗?」"], - ["艾莉斯", "「广场那边」"], - ["艾莉斯", "「虽然刚才《不蚀金锁》的人去追了,不过多半是······」"], - ["凯伊姆", "「偏偏还是广场吗」"], - ["艾莉斯", "「今天是觐见圣女大人的日子」"], - ["凯伊姆", "「我知道」"], - ["凯伊姆", "「尽量找找看就好」"], - ]; - this.chapter02 = [ - ["不蚀金锁成员", "「凯伊姆先生,凯伊姆先生」"], - ["不蚀金锁成员", "「您已经和艾莉斯大夫见过面了吗?」"], - ["凯伊姆", "「啊啊,所以才会追过来的」"], - ["凯伊姆", "「看到小偷了吗?」"], - [ - "不蚀金锁成员", - "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", - ], - [ - "不蚀金锁成员", - "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", - ], - ["不蚀金锁成员", "「我已经准备撤退了」"], - ["不蚀金锁成员", "「凯伊姆先生还要继续追吗?」"], - ["凯伊姆", "「啊啊」"], - ["", "做完情报交换之后,我跟男人道别。"], - ["凯伊姆", "「和我想的一样啊······」"], - ["", "在牢狱中最大的广场上,聚集着看不到尽头的人群。"], - ["", "就算是来参见圣女祈祷,这人数也太多了点吧。"], - ["", "自然,我也找不到逃跑的孩子。"], - ["", "是混杂到人群中了吧。"], - ["", "如果已经从广场上脱身了的话,就更难发现了。"], - ["", "只好赌他还在这里了。"], - ["", "我先移动到了一个视野良好的地方。"], - ["", "从这里,一眼就可以看到人群的变化。"], - ["", "广场还是沸腾起来。"], - ["", "抬头望去,原来是在天台之上出现了一个人影"], - ["", "但是,与周围的期待不同,现身的是一名中年的神官。"], - ["", "骂声四溢。"], - ["", "神官则是笑着摆正衣领"], - ["神官", "「从现在开始,举行谒见的仪式」"], - [ - "神官", - "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", - ], - [ - "神官", - "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", - ], - [ - "神官", - "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", - ], - [ - "神官", - "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", - ], - ["神官", "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」"], - ["圣女", "「不忘感谢与祈祷,神才会拯救我们」"], - ["圣女", "「与我一起,向神虔诚地祈祷吧」"], - ["", "广场上欢声雷动。"], - ["", "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。"], - ["", "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。"], - ["", "她掌握着这条街道,还有在这条街上生活的人的命运。"], - ["", "比起揽得人气,她更想要为了街道的继续存在而献出全力。"], - ["", "也是为了不让《大崩落》的惨剧再度发生。"], - ["", "十几年前的那场悲剧。"], - [ - "", - "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", - ], - ["凯伊姆", "「······」"], - ["", "这时我才想起,现在不是我在这里看圣女的时候。"], - ["女声", "「——っ!?」"], - ["围观的女人", "「羽,羽化病人!?」"], - ["围观的中年人", "「喂,谁去叫下羽狩」"], - ["惊慌的观众", "「你这家伙不要靠近我,要是传染了可怎么办」"], - ["粗鲁的观众", "「你这小鬼赶快滚开」"], - ["凯伊姆", "「接下来」"], - ["圣女", "「发生什么事了?看上去似乎很嘈杂」"], - ["随从", "「似乎是某个人逃跑了······具体的我也不是很清楚」"], - ["神官", "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」"], - ["圣女", "「不用在意我,比起那个,我更关心究竟发生了什么事」"], - ["神官", "「对不起,我真的不知道」"], - ["圣女", "「······是吗」"], - ["男", "「恕我僭越,请准许我说明情况」"], - ["男", "「在来觐见的人群中出现了《羽化病》的患者」"], - ["男", "「围观的人群因而产生了骚动」"], - [ - "男", - "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", - ], - ["圣女", "「羽化病······」"], - ["男", "「怎么了?」"], - ["圣女", "「没什么」"], - ["圣女", "「辛苦了,你的名字是?」"], - ["男", "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」"], - ["神官", "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」"], - ["神官", "「阁下是在工作上相当出色的人呢」"], - ["鲁基乌斯", "「不敢当」"], - [ - "鲁基乌斯", - "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", - ], - [ - "圣女", - "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", - ], - ["鲁基乌斯", "「属下不胜惶恐」"], - ["鲁基乌斯", "「接下来属下还要回到工作岗位上,在这里就先告退了」"], - ["圣女", "「鲁基乌斯先生」"], - ["鲁基乌斯", "「属下在」"], - ["圣女", "「你是怎样看待羽狩的工作的呢?」"], - ["神官", "「圣,圣女大人」"], - [ - "鲁基乌斯", - "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", - ], - ["神官", "「不,不亏是鲁基乌斯卿,相当优秀的想法」"], - ["圣女", "「是吗。辛苦你了」"], - ["随从", "「圣女大人······」"], - ["鲁基乌斯", "「······」"], - ["鲁基乌斯", "「那么,属下就回岗位去了」"], - ]; - this.chapter03 = [ - ["", "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。"], - ["", "显然,他并没有想到我会捷足先登吧。"], - ["", "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。。"], - ["凯伊姆", "「辛苦你了」"], - ["羽化病患少年", "「稀!?」"], - ["凯伊姆", "「逃到贫民区是个不错的想法」"], - ["羽化病患少年", "「你,你是,羽狩吗?」"], - ["凯伊姆", "「不是」"], - ["羽化病患少年", "「什,什么啊······混蛋,不要吓我啊」"], - ["凯伊姆", "「我对令你受惊这件事致以歉意」"], - ["凯伊姆", "「作为回报,麻烦你把从店里偷的钱交出来吧」"], - ["羽化病患少年", "「钱?你在说什么」"], - ["凯伊姆", "「你要找的腰上的东西,掉在你身后了」"], - ["羽化病患少年", "「哎?」"], - ["羽化病患少年", "「呃呀」"], - ["羽化病患少年", "「你······你这混蛋」"], - ["凯伊姆", "「······」"], - ["凯伊姆", "「把偷的钱交出来」"], - ["羽化病患少年", "「我不知道你在······咕」"], - ["羽化病患少年", "「你,你说是我偷的······有什么证据吗」"], - ["凯伊姆", "「你还挺倔的啊」"], - ["凯伊姆", "「不过,给我听好了」"], - ["凯伊姆", "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」"], - ["凯伊姆", "「而且,钱的主人是从前和吉克颇有渊源的女人」"], - ["羽化病患少年", "「吉克?」"], - ["凯伊姆", "「他是《不蚀金锁》的主人,这么说你就明白了吧」"], - ["羽化病患少年", "「哎?哎?怎么会······」"], - ["凯伊姆", "「再问你一遍,钱在哪里?」"], - ["羽化病患少年", "「是,是,是,在我的怀里」"], - ["凯伊姆", "「你没有擅自拿掉一部分吧」"], - ["羽化病患少年", "「是,是的」"], - ["羽化病患少年", "「那,那个,您是《不蚀金锁》的人吗?」"], - ["凯伊姆", "「算是吧」"], - ["羽化病患少年", "「我什么都可以做,请您一定要帮帮我」"], - ["凯伊姆", "「抱歉,我并没有兴趣去帮助他人」"], - ["羽化病患少年", "「我什么······什么,都会做的······」"], - ["羽化病患少年", "「我一直都是生活在下层的」"], - [ - "羽化病患少年", - "「可是,不知何时染上了羽化病······背后长出了翅膀······」", - ], - ["羽化病患少年", "「被寄宿工作的店赶了出来,只得流落到牢狱这里」"], - ["羽化病患少年", "「因为独自实在是饿的不行了,所以才会偷这些钱的」"], - [ - "羽化病患少年", - "「我明明没有做任何坏事······为什么······会遇到这种事······」", - ], - ["凯伊姆", "「谁知道」"], - ["羽化病患少年", "「呜······呜呜······接下来,要对我做什么?」"], - ["凯伊姆", "「我要把你带到组织那里」"], - ["羽化病患少年", "「怎,怎么这样」"], - ["凯伊姆", "「不过,那样做的前提是你不是羽化病人」"], - ["凯伊姆", "「组织也没有笨到把羽化病人招待到家里的程度」"], - ["羽化病患少年", "「那么,是要放我逃走吗?」"], - ["凯伊姆", "「我要让你学到教训」"], - ["凯伊姆", "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」"], - ["凯伊姆", "「你的运气不错」"], - ["羽化病患少年", "「唔······啊,是的······」"], - ["凯伊姆", "「滚」"], - ["羽化病患少年", "「非常感谢」"], - ["羽化病患少年", "「唔啊!?」"], - ["男", "「到这里就结束了,羽化病人」"], - ["男", "「确认他的翅膀」"], - ["", "趁还没有被卷入麻烦的事情之前,赶快离开这里吧"], - ["羽狩的队长", "「那边的那个人」"], - ["凯伊姆", "「······有什么事?」"], - ["羽狩的队长", "「可以稍微让我问几句话吗」"], - ["凯伊姆", "「······」"], - ["凯伊姆", "「啊啊,无妨」"], - ["羽狩的队长", "「感谢您的合作」"], - ["", "队长殷勤地致以谢礼。"], - ["", "而在他的眼前,少年的衣服已经被他的补下们扯破。"], - ["", "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。"], - ["红发的羽狩", "「副队长,确认翅膀的持有了」"], - ["羽狩的副队长", "「保护他」"], - ["羽化病患少年", "「不要······请原谅,我······」"], - [ - "羽狩的副队长", - "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", - ], - ["羽化病患少年", "「可是,可是」"], - ["羽狩的副队长", "「没关系的」"], - ["羽化病患少年", "「······哥,哥哥」"], - ["羽狩的副队长", "「你是羽化病人的亲属吗?」"], - ["凯伊姆", "「只是路人而已」"], - ["凯伊姆", "「顺带一提,我也没有打算找你们的麻烦」"], - [ - "羽狩的副队长", - "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", - ], - ["羽狩的副队长", "「我的一个部下就此永久失去了半截胳膊」"], - ["凯伊姆", "「我表示同情」"], - ["凯伊姆", "「我马上就会消失的,这样就没问题了吧?」"], - ["羽狩的副队长", "「嘛,不要这么慌张」"], - ["", "副队长看着羽化的少年。"], - ["羽狩的副队长", "「你与这个人是什么关系?没有被他殴打吗?」"], - ["羽化病患少年", "「没,没有」"], - [ - "羽狩的副队长", - "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", - ], - ["羽化病患少年", "「······」"], - ["羽化病患少年", "「那个人,是《不蚀金锁》的组织成员······」"], - ["羽化病患少年", "「突然说让我拿出钱来,我刚一拒绝他就打我」"], - ["羽狩的副队长", "「原来如此······」"], - [ - "羽狩的副队长", - "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", - ], - ["凯伊姆", "「当然不是」"], - ["凯伊姆", "「我只是从那里接受工作而已,并不是他们的成员」"], - ["羽狩的副队长", "「你的意思是说,少年在说谎吗?」"], - ["凯伊姆", "「啊啊」"], - [ - "凯伊姆", - "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", - ], - ["羽狩的副队长", "「就算我去询问,也无法从他们那里得到事实」"], - [ - "羽狩的副队长", - "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", - ], - ["凯伊姆", "「真是辛苦啊」"], - ["羽狩的副队长", "「说的是啊」"], - ["羽狩的副队长", "「其实,砍下我部下胳膊的似乎也是组织的成员呢」"], - [ - "羽狩的副队长", - "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", - ], - [ - "羽狩的副队长", - "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", - ], - ["羽狩的副队长", "「那和整条街道的和平也是紧密相关的吧?」"], - ["凯伊姆", "「我知道,你们有逮捕干扰狩猎羽化病人的权力」"], - [ - "凯伊姆", - "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", - ], - ["羽狩的副队长", "「那些话,我们会在看守所对你详细说明的」"], - ["凯伊姆", "「······」"], - ["", "在这里起争执的话,就会被羽狩加害。"], - ["", "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。"], - ["", "就算逃跑,也没有好的结果。"], - ["", "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。"], - ["", "发生了什么事······"], - ["???", "「我认为,那位先生是正确的」"], - ["", "羽狩们一起回头。"], - ["", "而在他们视线的焦点处,"], - ["", "伫立着一位女性。"], - ["", "在端正的容颜下,代表着强烈意志的双眉十分显眼。"], - ["", "身体的柔软与紧紧包裹在其身上的羽狩制服,两者显得十分的不搭配。"], - ["", "我还是第一次看到女性的羽狩。"], - ["羽狩的副队长", "「队长,这是获得《不蚀金锁》情报的好机会」"], - [ - "羽狩的队长", - "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", - ], - ["兰格副队长", "「我并没有打算去恫吓他······」"], - ["羽狩的队长", "「告诉我那个被砍掉胳膊的队员的名字」"], - ["羽狩的队长", "「我会去探望他的」"], - ["兰格副队长", "「那个是······」"], - ["羽狩的队长", "「我知道,你一直在为有所收获而努力工作」"], - ["羽狩的队长", "「但是,正因为我们的工作是为民众提供帮助」"], - ["羽狩的队长", "「所以就更不能损害人与人之间的信赖」"], - ["兰格副队长", "「我会铭记在心」"], - ["羽狩的队长", "「这位先生,我的部下失礼了」"], - ["凯伊姆", "「只要不对我再来一次就好」"], - ["羽狩的队长", "「请稍等」"], - ["凯伊姆", "「有什么事?」"], - ["羽狩的队长", "「我想确认一件事」"], - ["羽狩的队长", "「你真的不是《不蚀金锁》的成员吗?」"], - ["凯伊姆", "「真的」"], - ["凯伊姆", "「如果我说是的话,你有什么打算?」"], - ["羽狩的队长", "「我听过传闻,说他们是用依靠暴力而得的钱在生活」"], - ["凯伊姆", "「······这样啊」"], - ["凯伊姆", "「如果能有收获就好了啊」"], - ]; - this.chapter04 = [ - ["梅尔特", "「欢迎光临」"], - ["梅尔特", "「辛苦了」"], - ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」"], - ["凯伊姆", "「没什么,比想象中完成的更容易」"], - ["梅尔特", "「那就好」"], - ["梅尔特", "「这是我的一点谢意」"], - ["凯伊姆", "「味道有些变化啊」"], - ["梅尔特", "「啊,被发现了?」"], - ["梅尔特", "「最近,没能到手什么好的原料呢」"], - ["凯伊姆", "「去拜托吉克如何?」"], - [ - "梅尔特", - "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", - ], - ["凯伊姆", "「那希望你也不要来麻烦我」"], - ["梅尔特", "「那 是 两 码 事」"], - ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」"], - [ - "梅尔特", - "「而且,自己的钱被偷了这么害羞的事,向凯伊姆意外的其他人都说不出口」", - ], - ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」"], - ["梅尔特", "「这是面子问题啊,面子问题」"], - ["凯伊姆", "「嘛,算了」"], - ["凯伊姆", "「这样就好了吧?」"], - ["梅尔特", "「这是钱包呢」"], - ["梅尔特", "「嗯,东西没少」"], - ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」"], - ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」"], - ["凯伊姆", "「在那边不是来钱更快吗?」"], - ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」"], - ["凯伊姆", "「这是客套话而已」"], - ["梅尔特", "「欺负人」"], - ["梅尔特", "「总而言之,今天帮大忙了」"], - ["梅尔特", "「谢礼嘛······」"], - ["凯伊姆", "「就记在账单上吧」"], - ["梅尔特", "「了解—盛谢惠顾了哦?」"], - ["", "喀啷喀啷"], - ["", "门铃响起"], - ["", "喧哗瞬间安静下来。"], - ["", "进来的人是吉克。"], - ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], - ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], - ["吉克", "「各位继续吧」"], - ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], - ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。"], - ["凯伊姆", "「不用介意」"], - ["", "吉克轻轻点了点头,在我右边坐了下来"], - ["凯伊姆", "「逃跑的男人怎么样了?」"], - ["吉克", "「嗯?已经不在这个世上了」。"], - ["吉克", "「有什么想要知道的事吗?」"], - ["凯伊姆", "「不,没什么」"], - ["吉克", "「那个无聊的家伙,完全没有趣味呢」"], - ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」"], - ["凯伊姆", "「真是灾难啊」"], - ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」"], - ["凯伊姆", "「消息真灵通」"], - ["吉克", "「梅尔特也注意点」"], - ["吉克", "「你丢钱已经不是一回两回了」"], - ["梅尔特", "「好的—我会注意的。」"], - ["梅尔特", "「吉克还是平常的点单吧」"], - ["梅尔特", "「凯伊姆要再来一杯吗?」"], - ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], - ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], - ["吉克", "「这是抓捕逃跑男人的报酬」"], - ["凯伊姆", "「下次有什么事再告诉我」"], - ["梅尔特", "「来,久等了」"], - ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」"], - ["吉克", "「让我猜猜看」"], - ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」"], - ["梅尔特", "「可惜—」"], - ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」"], - ["凯伊姆", "「完全把你当成新进的女佣了么」"], - ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」"], - ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」"], - ["凯伊姆&吉克", "「你傻啊」"], - ["梅尔特", "「异口同声呢,不亏是兄弟」"], - ["凯伊姆", "「别用这种称呼,怪恶心的」"], - ["吉克", "「说得没错」"], - ["吉克", "「······说起来······」"], - ["梅尔特", "「怎么了?」"], - ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」"], - ["凯伊姆", "「你也说这么无聊的话题」"], - ["吉克", "「不,这是很重要的事情」"], - ["吉克", "「梅尔特,事实是怎么样的?」"], - ["梅尔特", "「啊~是怎么样的呢~」"], - ["梅尔特", "「我忘记了」"], - ["吉克", "「骗人」"], - ]; - } + // 在此增加新插件 + // 每项为一个数组,第一项是名字,第二项是对话内容 + // 回放只会在同一个this下回放,进入剧情前请以事件块声明进入哪个剧情数组 + // 可以自由添加,但不能与已有插件及函数名相同,可以使用中文。 + this.chapter0 = [ + ["", "这些天,街道不曾下雨。"], + ["", "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。"], + ["", "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。"], + ["", "扑哧。"], + ["", "耳旁再次响起象征着某个女孩子死去的声音。"], + ["", "再一次——"], + ["", "再一次。"], + ["", "女子们被肢解成单纯的肉块。"], + ["", "我任由流下的血浸满全身,屏住自己的呼吸。"], + ["", "祈求自己能拥有从猎人手中逃脱的幸运。"], + ["", "扑哧。"], + ["", "直到刚才,我们还坐在去往娼馆的马车的路上。"], + ["", "而在这之中的某些人,已经不在这个世上了。"], + ["", "不,应该把“某些”换成“几乎所有”才更为恰当吧。"], + ["", "恐怕,不久之后我也会变成小巷中血腥的装饰品。"], + ["", "我是为了得到这种死法,才辛苦苟活至今的吗?"], + ["", "来个人告诉我啊——"], + ["", "谁都好。"], + ["", "来人啊!!"], + ["少女", "「呃······!?」"], + ["", "漆黑的物体充斥了我的整个视野"], + ["", "我很快意识到,那是只很大的脚。"], + ["", "必须要出声求救。"], + ["", "可是,耳中却只能听到自己的牙关不停交战的声音。"], + ["", "我是如此的无助。"], + ["", "逃跑也好,道歉也罢。"], + ["", "就连抬头看一眼将要杀掉我的人的面孔都做不到。"], + ["少女", "「······被杀」"], + ["", "会被杀。"], + ["", "会被杀!!"], + ["", "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。"], + ["少女", "「不,不要······」"], + ["", "浮游都市,《诺瓦斯·艾蒂尔》。"], + ["", "《特别受灾地区》——"], + ["", "通称,《牢狱》"], + ["", "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。"], + ["年轻人", "「放开我!」"], + ["年轻人", "「我只是在帮那个女人而已!」"], + ["年轻人", "「你们没听到吗!?」"], + ["年轻人", "「她是被受骗才会被卖到娼馆来的」"], + ["年轻人", "「用肮脏的手段把钱借给她父母的,就是你们这些家伙吧!?」"], + ["年轻人", "「给我说些什么啊」"], + ["凯伊姆", "「这些话等到了娼馆再说吧」"], + ["凯伊姆", "「我来抓你,只是受雇于人而已」"], + ["", "我走进娼馆《莉莉乌姆》的接待室。"], + ["", "正在桌旁整理账簿的奥兹停下手头的工作,抬起头向我看来。"], + ["奥兹", "「这不是凯伊姆先生吗,辛苦了」"], + ["奥兹", "「委托已经完成了吗?」"], + ["凯伊姆", "「啊啊,是这家伙没错吧」"], + ["", "奥兹用只要接触到就能杀人般的眼神在男人脸上搜过。"], + ["奥兹", "「没错,就是这个人」"], + ["凯伊姆", "「是么」"], + ["年轻人", "「你,你们要对我做什么」"], + ["奥兹", "「······」"], + ["", "奥兹用一个眼神,就让男人闭上了嘴。"], + ["", "然后,向我这边转过身来。"], + ["奥兹", "「抱歉啊,总是麻烦你去做这些无聊的事」"], + ["奥兹", "「都怪我们这边的年轻人太没用」"], + ["凯伊姆", "「客套话就免了」"], + ["奥兹", "「这还真是失礼了」"], + ["奥兹", "「喂,来个人」"], + ["光头男人", "「是」"], + ["奥兹", "「凯伊姆先生做完工作回来了」"], + ["光头男人", "「是,是,那个······」"], + ["奥兹", "「我是要你拿些酒来,这个蠢材!」"], + ["", "喀!"], + ["", "奥兹扔出的烟灰缸砸中了手下的额头。"], + ["", "鲜血四溅。"], + ["凯伊姆", "「不用这么麻烦」"], + ["凯伊姆", "「我接下来要去《菲诺列塔》」"], + ["奥兹", "「喔唷」"], + ["奥兹", "「既然如此,我就不留您在这里喝难饮的劣质酒了」"], + ["", "奥兹斜眼看着正捂住额头呻吟的手下,轻描淡写地说道。"], + ["凯伊姆", "「用这些钱去买药」"], + ["", "我将几枚铜钱仍在那个手下的身前。"], + ["奥兹", "「凯伊姆先生,不用对他们这么好」"], + ["凯伊姆", "「无妨」"], + ["凯伊姆", "「话说回来,那个要落跑的女人呢?」"], + ["奥兹", "「我把她交给那些年轻人了,现在应该正在体会人生的严苛吧」"], + ["奥兹", "「正好,趁此机会凯伊姆先生也来享受一番如何?」"], + ["年轻人", "「你,你们这些家伙,要对她做什么!?」"], + ["", "咣!"], + ["", "奥兹给了他一拳。"], + ["", "一击即倒。"], + ["", "喀,咚,咯!"], + ["", "奥兹毫不留情地向男人的脸上踩去。"], + ["年轻人", "「咕······呃咳······」"], + ["", "折断的牙齿伴着血泡被吐出。"], + ["", "这份白色在鲜红色的液体中格外显眼。"], + ["年轻人", "「你们以为做出这种事······卫兵会坐视不理吗······」"], + ["奥兹", "「啊啊,不会坐视不理的」"], + ["奥兹", "「应该会拿出你的钱包,和我们商量如何瓜分吧」"], + ["年轻人", "「那,那种事······」"], + ["", "这在牢狱是理所当然的事。"], + ["奥兹", "「怎么,头一回来牢狱么?」"], + ["", "男人点了点头。"], + ["奥兹", "「为了被骗的女人而来到牢狱,真是个规矩人啊」"], + ["奥兹", "「······前提是,被骗的人不是你」"], + ["年轻人", "「你说······我被骗了?」"], + ["年轻人", "「那,那是怎么回事!?」"], + ["奥兹", "「不用急,今天晚上会好好告诉你的」"], + ["", "奥兹抓起男人的脸。"], + ["", "为引诱客人的怜悯之心而装纯,是娼妇的惯用手段。"], + ["", "双亲被骗而借钱,结果作为抵押而将自己卖到这里,这是典型的说法。"], + [ + "", + "如果只是头脑发热而成为常客也就罢了,这次的男人热血过头,居然想出了要带女人私奔的计划。", + ], + [ + "", + "虽然女人半开玩笑地予以拒绝,但不知天高地厚的这家伙还是拉着她逃跑了。", + ], + ["", "不过,想要逃脱追击本来就是不可能的任务。"], + ["", "但即便如此,这种事情还是会一再的出现。"], + ["", "说谎的女人和被骗的男人。"], + ["", "在娼馆街,这是令人看到生厌的日常的风景。"], + ["凯伊姆", "「我要走了」"], + ["奥兹", "「好的,下次再麻烦您」"], + ["奥兹", "「之后吉克先生会将谢礼交给您的」"], + ["凯伊姆", "「啊啊」"], + ["", "我背向奥兹走出娼馆。"], + ["凯伊姆", "「······?」"], + ["", "从远方传来微弱的歌声。"], + ["", "是关卡广场的方向。"], + ["", "对了。"], + ["", "今天有觐见圣女的仪式。"], + ["", "当代的圣女伊莲——"], + ["", "俗称《盲眼之圣女》,据说即使在历代的圣女中,人气也是数一数二的。"], + ["", "广场上的人估计相当多吧。"], + ["", "虽然我也想去看看她长什么样,不过要在人潮中挤来挤去就免了。"], + ["", "还是老老实实去菲诺列塔喝烧酒吧。"], + ["", "正当我这样想着的时候,一个身影自小巷的那头走来。"], + ["凯伊姆", "「艾莉斯」"], + ]; + this.chapter01 = [ + ["艾莉斯", "「啊,凯伊姆」"], + ["艾莉斯", "「正好,我还想要去找你呢」"], + ["艾莉斯", "「没想到凯伊姆会主动出现······这是命运吗?」"], + ["凯伊姆", "「显然不是吧」"], + ["艾莉斯", "「啊,是么」"], + ["", "艾莉斯挑了挑整齐的双眉,微微地哼了一声。"], + [ + "", + "虽然是个相当引人注目的美人,但她这个将亲切儿子丢入无底深渊的性格,为自己扣了不少的分", + ], + ["", "给人印象最深的,就是那潭水般的双瞳。"], + ["", "在漆黑的瞳孔中,完全看不出感情的波动。"], + ["艾莉斯", "「喜欢我的眼睛吗?」"], + ["艾莉斯", "「如果想要的话就给你吧?」"], + ["凯伊姆", "「用不着」"], + ["艾莉斯", "「阿拉,可惜」"], + ["凯伊姆", "「那么,找我有什么事」"], + ["艾莉斯", "「梅尔特的钱好像被偷了」"], + ["凯伊姆", "「钱被偷了?都几岁了还这么没用」"], + ["艾莉斯", "「不要对我说啊」"], + ["凯伊姆", "「那家伙,该不会说要让我去抓那个小偷吧?」"], + ["艾莉斯", "「就是这样」"], + ["凯伊姆", "「笨蛋吗」"], + ["凯伊姆", "「如果是小钱的话,就当做是买个教训吧」"], + ["艾莉斯", "「说起来,被盗的是这个月的上纳金」"], + ["凯伊姆", "「你说什么?」"], + ["艾莉斯", "「用这些钱买教训,也太过奢侈了呢」"], + ["凯伊姆", "「知道了,我去找」"], + ["凯伊姆", "「小偷的特征呢」"], + ["艾莉斯", "「男孩子」"], + ["艾莉斯", "「······而且,背后有翅膀」"], + ["艾莉斯", "「虽然姑且是藏在身后,但是仔细观察的话是很明显的」"], + ["凯伊姆", "「羽化病吗」"], + [ + "艾莉斯", + "「那些人可是毫不留情的,所以即使是为了那个孩子,也要赶快抓到他」", + ], + ["凯伊姆", "「注意到他逃窜的方向了吗?」"], + ["艾莉斯", "「广场那边」"], + ["艾莉斯", "「虽然刚才《不蚀金锁》的人去追了,不过多半是······」"], + ["凯伊姆", "「偏偏还是广场吗」"], + ["艾莉斯", "「今天是觐见圣女大人的日子」"], + ["凯伊姆", "「我知道」"], + ["凯伊姆", "「尽量找找看就好」"], + ]; + this.chapter02 = [ + ["不蚀金锁成员", "「凯伊姆先生,凯伊姆先生」"], + ["不蚀金锁成员", "「您已经和艾莉斯大夫见过面了吗?」"], + ["凯伊姆", "「啊啊,所以才会追过来的」"], + ["凯伊姆", "「看到小偷了吗?」"], + [ + "不蚀金锁成员", + "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", + ], + [ + "不蚀金锁成员", + "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", + ], + ["不蚀金锁成员", "「我已经准备撤退了」"], + ["不蚀金锁成员", "「凯伊姆先生还要继续追吗?」"], + ["凯伊姆", "「啊啊」"], + ["", "做完情报交换之后,我跟男人道别。"], + ["凯伊姆", "「和我想的一样啊······」"], + ["", "在牢狱中最大的广场上,聚集着看不到尽头的人群。"], + ["", "就算是来参见圣女祈祷,这人数也太多了点吧。"], + ["", "自然,我也找不到逃跑的孩子。"], + ["", "是混杂到人群中了吧。"], + ["", "如果已经从广场上脱身了的话,就更难发现了。"], + ["", "只好赌他还在这里了。"], + ["", "我先移动到了一个视野良好的地方。"], + ["", "从这里,一眼就可以看到人群的变化。"], + ["", "广场还是沸腾起来。"], + ["", "抬头望去,原来是在天台之上出现了一个人影"], + ["", "但是,与周围的期待不同,现身的是一名中年的神官。"], + ["", "骂声四溢。"], + ["", "神官则是笑着摆正衣领"], + ["神官", "「从现在开始,举行谒见的仪式」"], + [ + "神官", + "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", + ], + [ + "神官", + "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", + ], + [ + "神官", + "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", + ], + [ + "神官", + "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", + ], + ["神官", "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」"], + ["圣女", "「不忘感谢与祈祷,神才会拯救我们」"], + ["圣女", "「与我一起,向神虔诚地祈祷吧」"], + ["", "广场上欢声雷动。"], + ["", "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。"], + ["", "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。"], + ["", "她掌握着这条街道,还有在这条街上生活的人的命运。"], + ["", "比起揽得人气,她更想要为了街道的继续存在而献出全力。"], + ["", "也是为了不让《大崩落》的惨剧再度发生。"], + ["", "十几年前的那场悲剧。"], + [ + "", + "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", + ], + ["凯伊姆", "「······」"], + ["", "这时我才想起,现在不是我在这里看圣女的时候。"], + ["女声", "「——っ!?」"], + ["围观的女人", "「羽,羽化病人!?」"], + ["围观的中年人", "「喂,谁去叫下羽狩」"], + ["惊慌的观众", "「你这家伙不要靠近我,要是传染了可怎么办」"], + ["粗鲁的观众", "「你这小鬼赶快滚开」"], + ["凯伊姆", "「接下来」"], + ["圣女", "「发生什么事了?看上去似乎很嘈杂」"], + ["随从", "「似乎是某个人逃跑了······具体的我也不是很清楚」"], + ["神官", "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」"], + ["圣女", "「不用在意我,比起那个,我更关心究竟发生了什么事」"], + ["神官", "「对不起,我真的不知道」"], + ["圣女", "「······是吗」"], + ["男", "「恕我僭越,请准许我说明情况」"], + ["男", "「在来觐见的人群中出现了《羽化病》的患者」"], + ["男", "「围观的人群因而产生了骚动」"], + [ + "男", + "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", + ], + ["圣女", "「羽化病······」"], + ["男", "「怎么了?」"], + ["圣女", "「没什么」"], + ["圣女", "「辛苦了,你的名字是?」"], + ["男", "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」"], + ["神官", "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」"], + ["神官", "「阁下是在工作上相当出色的人呢」"], + ["鲁基乌斯", "「不敢当」"], + [ + "鲁基乌斯", + "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", + ], + [ + "圣女", + "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", + ], + ["鲁基乌斯", "「属下不胜惶恐」"], + ["鲁基乌斯", "「接下来属下还要回到工作岗位上,在这里就先告退了」"], + ["圣女", "「鲁基乌斯先生」"], + ["鲁基乌斯", "「属下在」"], + ["圣女", "「你是怎样看待羽狩的工作的呢?」"], + ["神官", "「圣,圣女大人」"], + [ + "鲁基乌斯", + "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", + ], + ["神官", "「不,不亏是鲁基乌斯卿,相当优秀的想法」"], + ["圣女", "「是吗。辛苦你了」"], + ["随从", "「圣女大人······」"], + ["鲁基乌斯", "「······」"], + ["鲁基乌斯", "「那么,属下就回岗位去了」"], + ]; + this.chapter03 = [ + ["", "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。"], + ["", "显然,他并没有想到我会捷足先登吧。"], + ["", "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。。"], + ["凯伊姆", "「辛苦你了」"], + ["羽化病患少年", "「稀!?」"], + ["凯伊姆", "「逃到贫民区是个不错的想法」"], + ["羽化病患少年", "「你,你是,羽狩吗?」"], + ["凯伊姆", "「不是」"], + ["羽化病患少年", "「什,什么啊······混蛋,不要吓我啊」"], + ["凯伊姆", "「我对令你受惊这件事致以歉意」"], + ["凯伊姆", "「作为回报,麻烦你把从店里偷的钱交出来吧」"], + ["羽化病患少年", "「钱?你在说什么」"], + ["凯伊姆", "「你要找的腰上的东西,掉在你身后了」"], + ["羽化病患少年", "「哎?」"], + ["羽化病患少年", "「呃呀」"], + ["羽化病患少年", "「你······你这混蛋」"], + ["凯伊姆", "「······」"], + ["凯伊姆", "「把偷的钱交出来」"], + ["羽化病患少年", "「我不知道你在······咕」"], + ["羽化病患少年", "「你,你说是我偷的······有什么证据吗」"], + ["凯伊姆", "「你还挺倔的啊」"], + ["凯伊姆", "「不过,给我听好了」"], + ["凯伊姆", "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」"], + ["凯伊姆", "「而且,钱的主人是从前和吉克颇有渊源的女人」"], + ["羽化病患少年", "「吉克?」"], + ["凯伊姆", "「他是《不蚀金锁》的主人,这么说你就明白了吧」"], + ["羽化病患少年", "「哎?哎?怎么会······」"], + ["凯伊姆", "「再问你一遍,钱在哪里?」"], + ["羽化病患少年", "「是,是,是,在我的怀里」"], + ["凯伊姆", "「你没有擅自拿掉一部分吧」"], + ["羽化病患少年", "「是,是的」"], + ["羽化病患少年", "「那,那个,您是《不蚀金锁》的人吗?」"], + ["凯伊姆", "「算是吧」"], + ["羽化病患少年", "「我什么都可以做,请您一定要帮帮我」"], + ["凯伊姆", "「抱歉,我并没有兴趣去帮助他人」"], + ["羽化病患少年", "「我什么······什么,都会做的······」"], + ["羽化病患少年", "「我一直都是生活在下层的」"], + [ + "羽化病患少年", + "「可是,不知何时染上了羽化病······背后长出了翅膀······」", + ], + ["羽化病患少年", "「被寄宿工作的店赶了出来,只得流落到牢狱这里」"], + ["羽化病患少年", "「因为独自实在是饿的不行了,所以才会偷这些钱的」"], + [ + "羽化病患少年", + "「我明明没有做任何坏事······为什么······会遇到这种事······」", + ], + ["凯伊姆", "「谁知道」"], + ["羽化病患少年", "「呜······呜呜······接下来,要对我做什么?」"], + ["凯伊姆", "「我要把你带到组织那里」"], + ["羽化病患少年", "「怎,怎么这样」"], + ["凯伊姆", "「不过,那样做的前提是你不是羽化病人」"], + ["凯伊姆", "「组织也没有笨到把羽化病人招待到家里的程度」"], + ["羽化病患少年", "「那么,是要放我逃走吗?」"], + ["凯伊姆", "「我要让你学到教训」"], + ["凯伊姆", "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」"], + ["凯伊姆", "「你的运气不错」"], + ["羽化病患少年", "「唔······啊,是的······」"], + ["凯伊姆", "「滚」"], + ["羽化病患少年", "「非常感谢」"], + ["羽化病患少年", "「唔啊!?」"], + ["男", "「到这里就结束了,羽化病人」"], + ["男", "「确认他的翅膀」"], + ["", "趁还没有被卷入麻烦的事情之前,赶快离开这里吧"], + ["羽狩的队长", "「那边的那个人」"], + ["凯伊姆", "「······有什么事?」"], + ["羽狩的队长", "「可以稍微让我问几句话吗」"], + ["凯伊姆", "「······」"], + ["凯伊姆", "「啊啊,无妨」"], + ["羽狩的队长", "「感谢您的合作」"], + ["", "队长殷勤地致以谢礼。"], + ["", "而在他的眼前,少年的衣服已经被他的补下们扯破。"], + ["", "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。"], + ["红发的羽狩", "「副队长,确认翅膀的持有了」"], + ["羽狩的副队长", "「保护他」"], + ["羽化病患少年", "「不要······请原谅,我······」"], + [ + "羽狩的副队长", + "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", + ], + ["羽化病患少年", "「可是,可是」"], + ["羽狩的副队长", "「没关系的」"], + ["羽化病患少年", "「······哥,哥哥」"], + ["羽狩的副队长", "「你是羽化病人的亲属吗?」"], + ["凯伊姆", "「只是路人而已」"], + ["凯伊姆", "「顺带一提,我也没有打算找你们的麻烦」"], + [ + "羽狩的副队长", + "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", + ], + ["羽狩的副队长", "「我的一个部下就此永久失去了半截胳膊」"], + ["凯伊姆", "「我表示同情」"], + ["凯伊姆", "「我马上就会消失的,这样就没问题了吧?」"], + ["羽狩的副队长", "「嘛,不要这么慌张」"], + ["", "副队长看着羽化的少年。"], + ["羽狩的副队长", "「你与这个人是什么关系?没有被他殴打吗?」"], + ["羽化病患少年", "「没,没有」"], + [ + "羽狩的副队长", + "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", + ], + ["羽化病患少年", "「······」"], + ["羽化病患少年", "「那个人,是《不蚀金锁》的组织成员······」"], + ["羽化病患少年", "「突然说让我拿出钱来,我刚一拒绝他就打我」"], + ["羽狩的副队长", "「原来如此······」"], + [ + "羽狩的副队长", + "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", + ], + ["凯伊姆", "「当然不是」"], + ["凯伊姆", "「我只是从那里接受工作而已,并不是他们的成员」"], + ["羽狩的副队长", "「你的意思是说,少年在说谎吗?」"], + ["凯伊姆", "「啊啊」"], + [ + "凯伊姆", + "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", + ], + ["羽狩的副队长", "「就算我去询问,也无法从他们那里得到事实」"], + [ + "羽狩的副队长", + "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", + ], + ["凯伊姆", "「真是辛苦啊」"], + ["羽狩的副队长", "「说的是啊」"], + ["羽狩的副队长", "「其实,砍下我部下胳膊的似乎也是组织的成员呢」"], + [ + "羽狩的副队长", + "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", + ], + [ + "羽狩的副队长", + "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", + ], + ["羽狩的副队长", "「那和整条街道的和平也是紧密相关的吧?」"], + ["凯伊姆", "「我知道,你们有逮捕干扰狩猎羽化病人的权力」"], + [ + "凯伊姆", + "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", + ], + ["羽狩的副队长", "「那些话,我们会在看守所对你详细说明的」"], + ["凯伊姆", "「······」"], + ["", "在这里起争执的话,就会被羽狩加害。"], + ["", "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。"], + ["", "就算逃跑,也没有好的结果。"], + ["", "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。"], + ["", "发生了什么事······"], + ["???", "「我认为,那位先生是正确的」"], + ["", "羽狩们一起回头。"], + ["", "而在他们视线的焦点处,"], + ["", "伫立着一位女性。"], + ["", "在端正的容颜下,代表着强烈意志的双眉十分显眼。"], + ["", "身体的柔软与紧紧包裹在其身上的羽狩制服,两者显得十分的不搭配。"], + ["", "我还是第一次看到女性的羽狩。"], + ["羽狩的副队长", "「队长,这是获得《不蚀金锁》情报的好机会」"], + [ + "羽狩的队长", + "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", + ], + ["兰格副队长", "「我并没有打算去恫吓他······」"], + ["羽狩的队长", "「告诉我那个被砍掉胳膊的队员的名字」"], + ["羽狩的队长", "「我会去探望他的」"], + ["兰格副队长", "「那个是······」"], + ["羽狩的队长", "「我知道,你一直在为有所收获而努力工作」"], + ["羽狩的队长", "「但是,正因为我们的工作是为民众提供帮助」"], + ["羽狩的队长", "「所以就更不能损害人与人之间的信赖」"], + ["兰格副队长", "「我会铭记在心」"], + ["羽狩的队长", "「这位先生,我的部下失礼了」"], + ["凯伊姆", "「只要不对我再来一次就好」"], + ["羽狩的队长", "「请稍等」"], + ["凯伊姆", "「有什么事?」"], + ["羽狩的队长", "「我想确认一件事」"], + ["羽狩的队长", "「你真的不是《不蚀金锁》的成员吗?」"], + ["凯伊姆", "「真的」"], + ["凯伊姆", "「如果我说是的话,你有什么打算?」"], + ["羽狩的队长", "「我听过传闻,说他们是用依靠暴力而得的钱在生活」"], + ["凯伊姆", "「······这样啊」"], + ["凯伊姆", "「如果能有收获就好了啊」"], + ]; + this.chapter04 = [ + ["梅尔特", "「欢迎光临」"], + ["梅尔特", "「辛苦了」"], + ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」"], + ["凯伊姆", "「没什么,比想象中完成的更容易」"], + ["梅尔特", "「那就好」"], + ["梅尔特", "「这是我的一点谢意」"], + ["凯伊姆", "「味道有些变化啊」"], + ["梅尔特", "「啊,被发现了?」"], + ["梅尔特", "「最近,没能到手什么好的原料呢」"], + ["凯伊姆", "「去拜托吉克如何?」"], + [ + "梅尔特", + "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", + ], + ["凯伊姆", "「那希望你也不要来麻烦我」"], + ["梅尔特", "「那 是 两 码 事」"], + ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」"], + [ + "梅尔特", + "「而且,自己的钱被偷了这么害羞的事,向凯伊姆意外的其他人都说不出口」", + ], + ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」"], + ["梅尔特", "「这是面子问题啊,面子问题」"], + ["凯伊姆", "「嘛,算了」"], + ["凯伊姆", "「这样就好了吧?」"], + ["梅尔特", "「这是钱包呢」"], + ["梅尔特", "「嗯,东西没少」"], + ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」"], + ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」"], + ["凯伊姆", "「在那边不是来钱更快吗?」"], + ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」"], + ["凯伊姆", "「这是客套话而已」"], + ["梅尔特", "「欺负人」"], + ["梅尔特", "「总而言之,今天帮大忙了」"], + ["梅尔特", "「谢礼嘛······」"], + ["凯伊姆", "「就记在账单上吧」"], + ["梅尔特", "「了解—盛谢惠顾了哦?」"], + ["", "喀啷喀啷"], + ["", "门铃响起"], + ["", "喧哗瞬间安静下来。"], + ["", "进来的人是吉克。"], + ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], + ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], + ["吉克", "「各位继续吧」"], + ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], + ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。"], + ["凯伊姆", "「不用介意」"], + ["", "吉克轻轻点了点头,在我右边坐了下来"], + ["凯伊姆", "「逃跑的男人怎么样了?」"], + ["吉克", "「嗯?已经不在这个世上了」。"], + ["吉克", "「有什么想要知道的事吗?」"], + ["凯伊姆", "「不,没什么」"], + ["吉克", "「那个无聊的家伙,完全没有趣味呢」"], + ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」"], + ["凯伊姆", "「真是灾难啊」"], + ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」"], + ["凯伊姆", "「消息真灵通」"], + ["吉克", "「梅尔特也注意点」"], + ["吉克", "「你丢钱已经不是一回两回了」"], + ["梅尔特", "「好的—我会注意的。」"], + ["梅尔特", "「吉克还是平常的点单吧」"], + ["梅尔特", "「凯伊姆要再来一杯吗?」"], + ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], + ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], + ["吉克", "「这是抓捕逃跑男人的报酬」"], + ["凯伊姆", "「下次有什么事再告诉我」"], + ["梅尔特", "「来,久等了」"], + ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」"], + ["吉克", "「让我猜猜看」"], + ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」"], + ["梅尔特", "「可惜—」"], + ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」"], + ["凯伊姆", "「完全把你当成新进的女佣了么」"], + ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」"], + ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」"], + ["凯伊姆&吉克", "「你傻啊」"], + ["梅尔特", "「异口同声呢,不亏是兄弟」"], + ["凯伊姆", "「别用这种称呼,怪恶心的」"], + ["吉克", "「说得没错」"], + ["吉克", "「······说起来······」"], + ["梅尔特", "「怎么了?」"], + ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」"], + ["凯伊姆", "「你也说这么无聊的话题」"], + ["吉克", "「不,这是很重要的事情」"], + ["吉克", "「梅尔特,事实是怎么样的?」"], + ["梅尔特", "「啊~是怎么样的呢~」"], + ["梅尔特", "「我忘记了」"], + ["吉克", "「骗人」"], + ]; +} } \ No newline at end of file From 274fe93483d1d523d346001943b114561be21c69 Mon Sep 17 00:00:00 2001 From: egamerainy1022 Date: Fri, 31 Jan 2025 22:33:26 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=AF=B9=E8=BD=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/events.js | 4 - project/plugins.js | 1140 ++++++++++++++++++++++---------------------- 2 files changed, 570 insertions(+), 574 deletions(-) diff --git a/project/events.js b/project/events.js index 5c6c1a0..ce6dc94 100644 --- a/project/events.js +++ b/project/events.js @@ -5858,10 +5858,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "memory2": false, "time": 30, "style": "引出" - }, - { - "type": "comment", - "text": "下一场景是追捕羽化病少年...做个标记" } ], "chapter03": [ diff --git a/project/plugins.js b/project/plugins.js index bd0456e..a532873 100644 --- a/project/plugins.js +++ b/project/plugins.js @@ -18823,574 +18823,574 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "剧情内容": function () { - // 在此增加新插件 - // 每项为一个数组,第一项是名字,第二项是对话内容 - // 回放只会在同一个this下回放,进入剧情前请以事件块声明进入哪个剧情数组 - // 可以自由添加,但不能与已有插件及函数名相同,可以使用中文。 - this.chapter0 = [ - ["", "这些天,街道不曾下雨。"], - ["", "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。"], - ["", "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。"], - ["", "扑哧。"], - ["", "耳旁再次响起象征着某个女孩子死去的声音。"], - ["", "再一次——"], - ["", "再一次。"], - ["", "女子们被肢解成单纯的肉块。"], - ["", "我任由流下的血浸满全身,屏住自己的呼吸。"], - ["", "祈求自己能拥有从猎人手中逃脱的幸运。"], - ["", "扑哧。"], - ["", "直到刚才,我们还坐在去往娼馆的马车的路上。"], - ["", "而在这之中的某些人,已经不在这个世上了。"], - ["", "不,应该把“某些”换成“几乎所有”才更为恰当吧。"], - ["", "恐怕,不久之后我也会变成小巷中血腥的装饰品。"], - ["", "我是为了得到这种死法,才辛苦苟活至今的吗?"], - ["", "来个人告诉我啊——"], - ["", "谁都好。"], - ["", "来人啊!!"], - ["少女", "「呃······!?」"], - ["", "漆黑的物体充斥了我的整个视野"], - ["", "我很快意识到,那是只很大的脚。"], - ["", "必须要出声求救。"], - ["", "可是,耳中却只能听到自己的牙关不停交战的声音。"], - ["", "我是如此的无助。"], - ["", "逃跑也好,道歉也罢。"], - ["", "就连抬头看一眼将要杀掉我的人的面孔都做不到。"], - ["少女", "「······被杀」"], - ["", "会被杀。"], - ["", "会被杀!!"], - ["", "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。"], - ["少女", "「不,不要······」"], - ["", "浮游都市,《诺瓦斯·艾蒂尔》。"], - ["", "《特别受灾地区》——"], - ["", "通称,《牢狱》"], - ["", "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。"], - ["年轻人", "「放开我!」"], - ["年轻人", "「我只是在帮那个女人而已!」"], - ["年轻人", "「你们没听到吗!?」"], - ["年轻人", "「她是被受骗才会被卖到娼馆来的」"], - ["年轻人", "「用肮脏的手段把钱借给她父母的,就是你们这些家伙吧!?」"], - ["年轻人", "「给我说些什么啊」"], - ["凯伊姆", "「这些话等到了娼馆再说吧」"], - ["凯伊姆", "「我来抓你,只是受雇于人而已」"], - ["", "我走进娼馆《莉莉乌姆》的接待室。"], - ["", "正在桌旁整理账簿的奥兹停下手头的工作,抬起头向我看来。"], - ["奥兹", "「这不是凯伊姆先生吗,辛苦了」"], - ["奥兹", "「委托已经完成了吗?」"], - ["凯伊姆", "「啊啊,是这家伙没错吧」"], - ["", "奥兹用只要接触到就能杀人般的眼神在男人脸上搜过。"], - ["奥兹", "「没错,就是这个人」"], - ["凯伊姆", "「是么」"], - ["年轻人", "「你,你们要对我做什么」"], - ["奥兹", "「······」"], - ["", "奥兹用一个眼神,就让男人闭上了嘴。"], - ["", "然后,向我这边转过身来。"], - ["奥兹", "「抱歉啊,总是麻烦你去做这些无聊的事」"], - ["奥兹", "「都怪我们这边的年轻人太没用」"], - ["凯伊姆", "「客套话就免了」"], - ["奥兹", "「这还真是失礼了」"], - ["奥兹", "「喂,来个人」"], - ["光头男人", "「是」"], - ["奥兹", "「凯伊姆先生做完工作回来了」"], - ["光头男人", "「是,是,那个······」"], - ["奥兹", "「我是要你拿些酒来,这个蠢材!」"], - ["", "喀!"], - ["", "奥兹扔出的烟灰缸砸中了手下的额头。"], - ["", "鲜血四溅。"], - ["凯伊姆", "「不用这么麻烦」"], - ["凯伊姆", "「我接下来要去《菲诺列塔》」"], - ["奥兹", "「喔唷」"], - ["奥兹", "「既然如此,我就不留您在这里喝难饮的劣质酒了」"], - ["", "奥兹斜眼看着正捂住额头呻吟的手下,轻描淡写地说道。"], - ["凯伊姆", "「用这些钱去买药」"], - ["", "我将几枚铜钱仍在那个手下的身前。"], - ["奥兹", "「凯伊姆先生,不用对他们这么好」"], - ["凯伊姆", "「无妨」"], - ["凯伊姆", "「话说回来,那个要落跑的女人呢?」"], - ["奥兹", "「我把她交给那些年轻人了,现在应该正在体会人生的严苛吧」"], - ["奥兹", "「正好,趁此机会凯伊姆先生也来享受一番如何?」"], - ["年轻人", "「你,你们这些家伙,要对她做什么!?」"], - ["", "咣!"], - ["", "奥兹给了他一拳。"], - ["", "一击即倒。"], - ["", "喀,咚,咯!"], - ["", "奥兹毫不留情地向男人的脸上踩去。"], - ["年轻人", "「咕······呃咳······」"], - ["", "折断的牙齿伴着血泡被吐出。"], - ["", "这份白色在鲜红色的液体中格外显眼。"], - ["年轻人", "「你们以为做出这种事······卫兵会坐视不理吗······」"], - ["奥兹", "「啊啊,不会坐视不理的」"], - ["奥兹", "「应该会拿出你的钱包,和我们商量如何瓜分吧」"], - ["年轻人", "「那,那种事······」"], - ["", "这在牢狱是理所当然的事。"], - ["奥兹", "「怎么,头一回来牢狱么?」"], - ["", "男人点了点头。"], - ["奥兹", "「为了被骗的女人而来到牢狱,真是个规矩人啊」"], - ["奥兹", "「······前提是,被骗的人不是你」"], - ["年轻人", "「你说······我被骗了?」"], - ["年轻人", "「那,那是怎么回事!?」"], - ["奥兹", "「不用急,今天晚上会好好告诉你的」"], - ["", "奥兹抓起男人的脸。"], - ["", "为引诱客人的怜悯之心而装纯,是娼妇的惯用手段。"], - ["", "双亲被骗而借钱,结果作为抵押而将自己卖到这里,这是典型的说法。"], - [ - "", - "如果只是头脑发热而成为常客也就罢了,这次的男人热血过头,居然想出了要带女人私奔的计划。", - ], - [ - "", - "虽然女人半开玩笑地予以拒绝,但不知天高地厚的这家伙还是拉着她逃跑了。", - ], - ["", "不过,想要逃脱追击本来就是不可能的任务。"], - ["", "但即便如此,这种事情还是会一再的出现。"], - ["", "说谎的女人和被骗的男人。"], - ["", "在娼馆街,这是令人看到生厌的日常的风景。"], - ["凯伊姆", "「我要走了」"], - ["奥兹", "「好的,下次再麻烦您」"], - ["奥兹", "「之后吉克先生会将谢礼交给您的」"], - ["凯伊姆", "「啊啊」"], - ["", "我背向奥兹走出娼馆。"], - ["凯伊姆", "「······?」"], - ["", "从远方传来微弱的歌声。"], - ["", "是关卡广场的方向。"], - ["", "对了。"], - ["", "今天有觐见圣女的仪式。"], - ["", "当代的圣女伊莲——"], - ["", "俗称《盲眼之圣女》,据说即使在历代的圣女中,人气也是数一数二的。"], - ["", "广场上的人估计相当多吧。"], - ["", "虽然我也想去看看她长什么样,不过要在人潮中挤来挤去就免了。"], - ["", "还是老老实实去菲诺列塔喝烧酒吧。"], - ["", "正当我这样想着的时候,一个身影自小巷的那头走来。"], - ["凯伊姆", "「艾莉斯」"], - ]; - this.chapter01 = [ - ["艾莉斯", "「啊,凯伊姆」"], - ["艾莉斯", "「正好,我还想要去找你呢」"], - ["艾莉斯", "「没想到凯伊姆会主动出现······这是命运吗?」"], - ["凯伊姆", "「显然不是吧」"], - ["艾莉斯", "「啊,是么」"], - ["", "艾莉斯挑了挑整齐的双眉,微微地哼了一声。"], - [ - "", - "虽然是个相当引人注目的美人,但她这个将亲切儿子丢入无底深渊的性格,为自己扣了不少的分", - ], - ["", "给人印象最深的,就是那潭水般的双瞳。"], - ["", "在漆黑的瞳孔中,完全看不出感情的波动。"], - ["艾莉斯", "「喜欢我的眼睛吗?」"], - ["艾莉斯", "「如果想要的话就给你吧?」"], - ["凯伊姆", "「用不着」"], - ["艾莉斯", "「阿拉,可惜」"], - ["凯伊姆", "「那么,找我有什么事」"], - ["艾莉斯", "「梅尔特的钱好像被偷了」"], - ["凯伊姆", "「钱被偷了?都几岁了还这么没用」"], - ["艾莉斯", "「不要对我说啊」"], - ["凯伊姆", "「那家伙,该不会说要让我去抓那个小偷吧?」"], - ["艾莉斯", "「就是这样」"], - ["凯伊姆", "「笨蛋吗」"], - ["凯伊姆", "「如果是小钱的话,就当做是买个教训吧」"], - ["艾莉斯", "「说起来,被盗的是这个月的上纳金」"], - ["凯伊姆", "「你说什么?」"], - ["艾莉斯", "「用这些钱买教训,也太过奢侈了呢」"], - ["凯伊姆", "「知道了,我去找」"], - ["凯伊姆", "「小偷的特征呢」"], - ["艾莉斯", "「男孩子」"], - ["艾莉斯", "「······而且,背后有翅膀」"], - ["艾莉斯", "「虽然姑且是藏在身后,但是仔细观察的话是很明显的」"], - ["凯伊姆", "「羽化病吗」"], - [ - "艾莉斯", - "「那些人可是毫不留情的,所以即使是为了那个孩子,也要赶快抓到他」", - ], - ["凯伊姆", "「注意到他逃窜的方向了吗?」"], - ["艾莉斯", "「广场那边」"], - ["艾莉斯", "「虽然刚才《不蚀金锁》的人去追了,不过多半是······」"], - ["凯伊姆", "「偏偏还是广场吗」"], - ["艾莉斯", "「今天是觐见圣女大人的日子」"], - ["凯伊姆", "「我知道」"], - ["凯伊姆", "「尽量找找看就好」"], - ]; - this.chapter02 = [ - ["不蚀金锁成员", "「凯伊姆先生,凯伊姆先生」"], - ["不蚀金锁成员", "「您已经和艾莉斯大夫见过面了吗?」"], - ["凯伊姆", "「啊啊,所以才会追过来的」"], - ["凯伊姆", "「看到小偷了吗?」"], - [ - "不蚀金锁成员", - "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", - ], - [ - "不蚀金锁成员", - "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", - ], - ["不蚀金锁成员", "「我已经准备撤退了」"], - ["不蚀金锁成员", "「凯伊姆先生还要继续追吗?」"], - ["凯伊姆", "「啊啊」"], - ["", "做完情报交换之后,我跟男人道别。"], - ["凯伊姆", "「和我想的一样啊······」"], - ["", "在牢狱中最大的广场上,聚集着看不到尽头的人群。"], - ["", "就算是来参见圣女祈祷,这人数也太多了点吧。"], - ["", "自然,我也找不到逃跑的孩子。"], - ["", "是混杂到人群中了吧。"], - ["", "如果已经从广场上脱身了的话,就更难发现了。"], - ["", "只好赌他还在这里了。"], - ["", "我先移动到了一个视野良好的地方。"], - ["", "从这里,一眼就可以看到人群的变化。"], - ["", "广场还是沸腾起来。"], - ["", "抬头望去,原来是在天台之上出现了一个人影"], - ["", "但是,与周围的期待不同,现身的是一名中年的神官。"], - ["", "骂声四溢。"], - ["", "神官则是笑着摆正衣领"], - ["神官", "「从现在开始,举行谒见的仪式」"], - [ - "神官", - "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", - ], - [ - "神官", - "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", - ], - [ - "神官", - "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", - ], - [ - "神官", - "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", - ], - ["神官", "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」"], - ["圣女", "「不忘感谢与祈祷,神才会拯救我们」"], - ["圣女", "「与我一起,向神虔诚地祈祷吧」"], - ["", "广场上欢声雷动。"], - ["", "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。"], - ["", "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。"], - ["", "她掌握着这条街道,还有在这条街上生活的人的命运。"], - ["", "比起揽得人气,她更想要为了街道的继续存在而献出全力。"], - ["", "也是为了不让《大崩落》的惨剧再度发生。"], - ["", "十几年前的那场悲剧。"], - [ - "", - "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", - ], - ["凯伊姆", "「······」"], - ["", "这时我才想起,现在不是我在这里看圣女的时候。"], - ["女声", "「——っ!?」"], - ["围观的女人", "「羽,羽化病人!?」"], - ["围观的中年人", "「喂,谁去叫下羽狩」"], - ["惊慌的观众", "「你这家伙不要靠近我,要是传染了可怎么办」"], - ["粗鲁的观众", "「你这小鬼赶快滚开」"], - ["凯伊姆", "「接下来」"], - ["圣女", "「发生什么事了?看上去似乎很嘈杂」"], - ["随从", "「似乎是某个人逃跑了······具体的我也不是很清楚」"], - ["神官", "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」"], - ["圣女", "「不用在意我,比起那个,我更关心究竟发生了什么事」"], - ["神官", "「对不起,我真的不知道」"], - ["圣女", "「······是吗」"], - ["男", "「恕我僭越,请准许我说明情况」"], - ["男", "「在来觐见的人群中出现了《羽化病》的患者」"], - ["男", "「围观的人群因而产生了骚动」"], - [ - "男", - "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", - ], - ["圣女", "「羽化病······」"], - ["男", "「怎么了?」"], - ["圣女", "「没什么」"], - ["圣女", "「辛苦了,你的名字是?」"], - ["男", "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」"], - ["神官", "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」"], - ["神官", "「阁下是在工作上相当出色的人呢」"], - ["鲁基乌斯", "「不敢当」"], - [ - "鲁基乌斯", - "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", - ], - [ - "圣女", - "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", - ], - ["鲁基乌斯", "「属下不胜惶恐」"], - ["鲁基乌斯", "「接下来属下还要回到工作岗位上,在这里就先告退了」"], - ["圣女", "「鲁基乌斯先生」"], - ["鲁基乌斯", "「属下在」"], - ["圣女", "「你是怎样看待羽狩的工作的呢?」"], - ["神官", "「圣,圣女大人」"], - [ - "鲁基乌斯", - "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", - ], - ["神官", "「不,不亏是鲁基乌斯卿,相当优秀的想法」"], - ["圣女", "「是吗。辛苦你了」"], - ["随从", "「圣女大人······」"], - ["鲁基乌斯", "「······」"], - ["鲁基乌斯", "「那么,属下就回岗位去了」"], - ]; - this.chapter03 = [ - ["", "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。"], - ["", "显然,他并没有想到我会捷足先登吧。"], - ["", "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。。"], - ["凯伊姆", "「辛苦你了」"], - ["羽化病患少年", "「稀!?」"], - ["凯伊姆", "「逃到贫民区是个不错的想法」"], - ["羽化病患少年", "「你,你是,羽狩吗?」"], - ["凯伊姆", "「不是」"], - ["羽化病患少年", "「什,什么啊······混蛋,不要吓我啊」"], - ["凯伊姆", "「我对令你受惊这件事致以歉意」"], - ["凯伊姆", "「作为回报,麻烦你把从店里偷的钱交出来吧」"], - ["羽化病患少年", "「钱?你在说什么」"], - ["凯伊姆", "「你要找的腰上的东西,掉在你身后了」"], - ["羽化病患少年", "「哎?」"], - ["羽化病患少年", "「呃呀」"], - ["羽化病患少年", "「你······你这混蛋」"], - ["凯伊姆", "「······」"], - ["凯伊姆", "「把偷的钱交出来」"], - ["羽化病患少年", "「我不知道你在······咕」"], - ["羽化病患少年", "「你,你说是我偷的······有什么证据吗」"], - ["凯伊姆", "「你还挺倔的啊」"], - ["凯伊姆", "「不过,给我听好了」"], - ["凯伊姆", "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」"], - ["凯伊姆", "「而且,钱的主人是从前和吉克颇有渊源的女人」"], - ["羽化病患少年", "「吉克?」"], - ["凯伊姆", "「他是《不蚀金锁》的主人,这么说你就明白了吧」"], - ["羽化病患少年", "「哎?哎?怎么会······」"], - ["凯伊姆", "「再问你一遍,钱在哪里?」"], - ["羽化病患少年", "「是,是,是,在我的怀里」"], - ["凯伊姆", "「你没有擅自拿掉一部分吧」"], - ["羽化病患少年", "「是,是的」"], - ["羽化病患少年", "「那,那个,您是《不蚀金锁》的人吗?」"], - ["凯伊姆", "「算是吧」"], - ["羽化病患少年", "「我什么都可以做,请您一定要帮帮我」"], - ["凯伊姆", "「抱歉,我并没有兴趣去帮助他人」"], - ["羽化病患少年", "「我什么······什么,都会做的······」"], - ["羽化病患少年", "「我一直都是生活在下层的」"], - [ - "羽化病患少年", - "「可是,不知何时染上了羽化病······背后长出了翅膀······」", - ], - ["羽化病患少年", "「被寄宿工作的店赶了出来,只得流落到牢狱这里」"], - ["羽化病患少年", "「因为独自实在是饿的不行了,所以才会偷这些钱的」"], - [ - "羽化病患少年", - "「我明明没有做任何坏事······为什么······会遇到这种事······」", - ], - ["凯伊姆", "「谁知道」"], - ["羽化病患少年", "「呜······呜呜······接下来,要对我做什么?」"], - ["凯伊姆", "「我要把你带到组织那里」"], - ["羽化病患少年", "「怎,怎么这样」"], - ["凯伊姆", "「不过,那样做的前提是你不是羽化病人」"], - ["凯伊姆", "「组织也没有笨到把羽化病人招待到家里的程度」"], - ["羽化病患少年", "「那么,是要放我逃走吗?」"], - ["凯伊姆", "「我要让你学到教训」"], - ["凯伊姆", "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」"], - ["凯伊姆", "「你的运气不错」"], - ["羽化病患少年", "「唔······啊,是的······」"], - ["凯伊姆", "「滚」"], - ["羽化病患少年", "「非常感谢」"], - ["羽化病患少年", "「唔啊!?」"], - ["男", "「到这里就结束了,羽化病人」"], - ["男", "「确认他的翅膀」"], - ["", "趁还没有被卷入麻烦的事情之前,赶快离开这里吧"], - ["羽狩的队长", "「那边的那个人」"], - ["凯伊姆", "「······有什么事?」"], - ["羽狩的队长", "「可以稍微让我问几句话吗」"], - ["凯伊姆", "「······」"], - ["凯伊姆", "「啊啊,无妨」"], - ["羽狩的队长", "「感谢您的合作」"], - ["", "队长殷勤地致以谢礼。"], - ["", "而在他的眼前,少年的衣服已经被他的补下们扯破。"], - ["", "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。"], - ["红发的羽狩", "「副队长,确认翅膀的持有了」"], - ["羽狩的副队长", "「保护他」"], - ["羽化病患少年", "「不要······请原谅,我······」"], - [ - "羽狩的副队长", - "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", - ], - ["羽化病患少年", "「可是,可是」"], - ["羽狩的副队长", "「没关系的」"], - ["羽化病患少年", "「······哥,哥哥」"], - ["羽狩的副队长", "「你是羽化病人的亲属吗?」"], - ["凯伊姆", "「只是路人而已」"], - ["凯伊姆", "「顺带一提,我也没有打算找你们的麻烦」"], - [ - "羽狩的副队长", - "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", - ], - ["羽狩的副队长", "「我的一个部下就此永久失去了半截胳膊」"], - ["凯伊姆", "「我表示同情」"], - ["凯伊姆", "「我马上就会消失的,这样就没问题了吧?」"], - ["羽狩的副队长", "「嘛,不要这么慌张」"], - ["", "副队长看着羽化的少年。"], - ["羽狩的副队长", "「你与这个人是什么关系?没有被他殴打吗?」"], - ["羽化病患少年", "「没,没有」"], - [ - "羽狩的副队长", - "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", - ], - ["羽化病患少年", "「······」"], - ["羽化病患少年", "「那个人,是《不蚀金锁》的组织成员······」"], - ["羽化病患少年", "「突然说让我拿出钱来,我刚一拒绝他就打我」"], - ["羽狩的副队长", "「原来如此······」"], - [ - "羽狩的副队长", - "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", - ], - ["凯伊姆", "「当然不是」"], - ["凯伊姆", "「我只是从那里接受工作而已,并不是他们的成员」"], - ["羽狩的副队长", "「你的意思是说,少年在说谎吗?」"], - ["凯伊姆", "「啊啊」"], - [ - "凯伊姆", - "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", - ], - ["羽狩的副队长", "「就算我去询问,也无法从他们那里得到事实」"], - [ - "羽狩的副队长", - "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", - ], - ["凯伊姆", "「真是辛苦啊」"], - ["羽狩的副队长", "「说的是啊」"], - ["羽狩的副队长", "「其实,砍下我部下胳膊的似乎也是组织的成员呢」"], - [ - "羽狩的副队长", - "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", - ], - [ - "羽狩的副队长", - "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", - ], - ["羽狩的副队长", "「那和整条街道的和平也是紧密相关的吧?」"], - ["凯伊姆", "「我知道,你们有逮捕干扰狩猎羽化病人的权力」"], - [ - "凯伊姆", - "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", - ], - ["羽狩的副队长", "「那些话,我们会在看守所对你详细说明的」"], - ["凯伊姆", "「······」"], - ["", "在这里起争执的话,就会被羽狩加害。"], - ["", "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。"], - ["", "就算逃跑,也没有好的结果。"], - ["", "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。"], - ["", "发生了什么事······"], - ["???", "「我认为,那位先生是正确的」"], - ["", "羽狩们一起回头。"], - ["", "而在他们视线的焦点处,"], - ["", "伫立着一位女性。"], - ["", "在端正的容颜下,代表着强烈意志的双眉十分显眼。"], - ["", "身体的柔软与紧紧包裹在其身上的羽狩制服,两者显得十分的不搭配。"], - ["", "我还是第一次看到女性的羽狩。"], - ["羽狩的副队长", "「队长,这是获得《不蚀金锁》情报的好机会」"], - [ - "羽狩的队长", - "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", - ], - ["兰格副队长", "「我并没有打算去恫吓他······」"], - ["羽狩的队长", "「告诉我那个被砍掉胳膊的队员的名字」"], - ["羽狩的队长", "「我会去探望他的」"], - ["兰格副队长", "「那个是······」"], - ["羽狩的队长", "「我知道,你一直在为有所收获而努力工作」"], - ["羽狩的队长", "「但是,正因为我们的工作是为民众提供帮助」"], - ["羽狩的队长", "「所以就更不能损害人与人之间的信赖」"], - ["兰格副队长", "「我会铭记在心」"], - ["羽狩的队长", "「这位先生,我的部下失礼了」"], - ["凯伊姆", "「只要不对我再来一次就好」"], - ["羽狩的队长", "「请稍等」"], - ["凯伊姆", "「有什么事?」"], - ["羽狩的队长", "「我想确认一件事」"], - ["羽狩的队长", "「你真的不是《不蚀金锁》的成员吗?」"], - ["凯伊姆", "「真的」"], - ["凯伊姆", "「如果我说是的话,你有什么打算?」"], - ["羽狩的队长", "「我听过传闻,说他们是用依靠暴力而得的钱在生活」"], - ["凯伊姆", "「······这样啊」"], - ["凯伊姆", "「如果能有收获就好了啊」"], - ]; - this.chapter04 = [ - ["梅尔特", "「欢迎光临」"], - ["梅尔特", "「辛苦了」"], - ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」"], - ["凯伊姆", "「没什么,比想象中完成的更容易」"], - ["梅尔特", "「那就好」"], - ["梅尔特", "「这是我的一点谢意」"], - ["凯伊姆", "「味道有些变化啊」"], - ["梅尔特", "「啊,被发现了?」"], - ["梅尔特", "「最近,没能到手什么好的原料呢」"], - ["凯伊姆", "「去拜托吉克如何?」"], - [ - "梅尔特", - "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", - ], - ["凯伊姆", "「那希望你也不要来麻烦我」"], - ["梅尔特", "「那 是 两 码 事」"], - ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」"], - [ - "梅尔特", - "「而且,自己的钱被偷了这么害羞的事,向凯伊姆意外的其他人都说不出口」", - ], - ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」"], - ["梅尔特", "「这是面子问题啊,面子问题」"], - ["凯伊姆", "「嘛,算了」"], - ["凯伊姆", "「这样就好了吧?」"], - ["梅尔特", "「这是钱包呢」"], - ["梅尔特", "「嗯,东西没少」"], - ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」"], - ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」"], - ["凯伊姆", "「在那边不是来钱更快吗?」"], - ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」"], - ["凯伊姆", "「这是客套话而已」"], - ["梅尔特", "「欺负人」"], - ["梅尔特", "「总而言之,今天帮大忙了」"], - ["梅尔特", "「谢礼嘛······」"], - ["凯伊姆", "「就记在账单上吧」"], - ["梅尔特", "「了解—盛谢惠顾了哦?」"], - ["", "喀啷喀啷"], - ["", "门铃响起"], - ["", "喧哗瞬间安静下来。"], - ["", "进来的人是吉克。"], - ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], - ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], - ["吉克", "「各位继续吧」"], - ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], - ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。"], - ["凯伊姆", "「不用介意」"], - ["", "吉克轻轻点了点头,在我右边坐了下来"], - ["凯伊姆", "「逃跑的男人怎么样了?」"], - ["吉克", "「嗯?已经不在这个世上了」。"], - ["吉克", "「有什么想要知道的事吗?」"], - ["凯伊姆", "「不,没什么」"], - ["吉克", "「那个无聊的家伙,完全没有趣味呢」"], - ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」"], - ["凯伊姆", "「真是灾难啊」"], - ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」"], - ["凯伊姆", "「消息真灵通」"], - ["吉克", "「梅尔特也注意点」"], - ["吉克", "「你丢钱已经不是一回两回了」"], - ["梅尔特", "「好的—我会注意的。」"], - ["梅尔特", "「吉克还是平常的点单吧」"], - ["梅尔特", "「凯伊姆要再来一杯吗?」"], - ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], - ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], - ["吉克", "「这是抓捕逃跑男人的报酬」"], - ["凯伊姆", "「下次有什么事再告诉我」"], - ["梅尔特", "「来,久等了」"], - ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」"], - ["吉克", "「让我猜猜看」"], - ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」"], - ["梅尔特", "「可惜—」"], - ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」"], - ["凯伊姆", "「完全把你当成新进的女佣了么」"], - ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」"], - ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」"], - ["凯伊姆&吉克", "「你傻啊」"], - ["梅尔特", "「异口同声呢,不亏是兄弟」"], - ["凯伊姆", "「别用这种称呼,怪恶心的」"], - ["吉克", "「说得没错」"], - ["吉克", "「······说起来······」"], - ["梅尔特", "「怎么了?」"], - ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」"], - ["凯伊姆", "「你也说这么无聊的话题」"], - ["吉克", "「不,这是很重要的事情」"], - ["吉克", "「梅尔特,事实是怎么样的?」"], - ["梅尔特", "「啊~是怎么样的呢~」"], - ["梅尔特", "「我忘记了」"], - ["吉克", "「骗人」"], - ]; - } + // 在此增加新插件 + // 每项为一个数组,第一项是名字,第二项是对话内容 + // 回放只会在同一个this下回放,进入剧情前请以事件块声明进入哪个剧情数组 + // 可以自由添加,但不能与已有插件及函数名相同,可以使用中文。 + this.chapter0 = [ + ["", "这些天,街道不曾下雨。"], + ["", "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。"], + ["", "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。"], + ["", "扑哧。"], + ["", "耳旁再次响起象征着某个女孩子死去的声音。"], + ["", "再一次——"], + ["", "再一次。"], + ["", "女子们被肢解成单纯的肉块。"], + ["", "我任由流下的血浸满全身,屏住自己的呼吸。"], + ["", "祈求自己能拥有从猎人手中逃脱的幸运。"], + ["", "扑哧。"], + ["", "直到刚才,我们还坐在去往娼馆的马车的路上。"], + ["", "而在这之中的某些人,已经不在这个世上了。"], + ["", "不,应该把“某些”换成“几乎所有”才更为恰当吧。"], + ["", "恐怕,不久之后我也会变成小巷中血腥的装饰品。"], + ["", "我是为了得到这种死法,才辛苦苟活至今的吗?"], + ["", "来个人告诉我啊——"], + ["", "谁都好。"], + ["", "来人啊!!"], + ["少女", "「呃······!?」"], //小动物01 + ["", "漆黑的物体充斥了我的整个视野"], + ["", "我很快意识到,那是只很大的脚。"], + ["", "必须要出声求救。"], + ["", "可是,耳中却只能听到自己的牙关不停交战的声音。"], + ["", "我是如此的无助。"], + ["", "逃跑也好,道歉也罢。"], + ["", "就连抬头看一眼将要杀掉我的人的面孔都做不到。"], + ["少女", "「······被杀」"], //小动物02 + ["", "会被杀。"], + ["", "会被杀!!"], + ["", "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。"], + ["少女", "「不,不要······」"], //小动物03 + ["", "浮游都市,《诺瓦斯·艾蒂尔》。"], + ["", "《特别受灾地区》——"], + ["", "通称,《牢狱》"], + ["", "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。"], + ["年轻人", "「放开我!」"], //龙套1-01 + ["年轻人", "「我只是在帮那个女人而已!」"], //龙套1-02 + ["年轻人", "「你们没听到吗!?」"], //龙套1-03 + ["年轻人", "「她是被受骗才会被卖到娼馆来的」"], //龙套1-04 + ["年轻人", "「用肮脏的手段把钱借给她父母的,就是你们这些家伙吧!?」"], //龙套1-05 + ["年轻人", "「给我说些什么啊」"], //龙套1-06 + ["凯伊姆", "「这些话等到了娼馆再说吧」"], //男主01 + ["凯伊姆", "「我来抓你,只是受雇于人而已」"], //男主02 + ["", "我走进娼馆《莉莉乌姆》的接待室。"], + ["", "正在桌旁整理账簿的奥兹停下手头的工作,抬起头向我看来。"], + ["奥兹", "「这不是凯伊姆先生吗,辛苦了」"], //金锁高官01 + ["奥兹", "「委托已经完成了吗?」"], //金锁高官02 + ["凯伊姆", "「啊啊,是这家伙没错吧」"], //男主03 + ["", "奥兹用只要接触到就能杀人般的眼神在男人脸上搜过。"], + ["奥兹", "「没错,就是这个人」"], //金锁高官03 + ["凯伊姆", "「是么」"], //男主04 + ["年轻人", "「你,你们要对我做什么」"], //龙套1-07 + ["奥兹", "「······」"], //金锁高官04 + ["", "奥兹用一个眼神,就让男人闭上了嘴。"], + ["", "然后,向我这边转过身来。"], + ["奥兹", "「抱歉啊,总是麻烦你去做这些无聊的事」"], //金锁高官05 + ["奥兹", "「都怪我们这边的年轻人太没用」"], //金锁高官06 + ["凯伊姆", "「客套话就免了」"], //男主05 + ["奥兹", "「这还真是失礼了」"], //金锁高官07 + ["奥兹", "「喂,来个人」"], //金锁高官08 + ["光头男人", "「是」"], //龙套2-01 + ["奥兹", "「凯伊姆先生做完工作回来了」"], //金锁高官09 + ["光头男人", "「是,是,那个······」"], //龙套2-02 + ["奥兹", "「我是要你拿些酒来,这个蠢材!」"], //金锁高官10 + ["", "喀!"], + ["", "奥兹扔出的烟灰缸砸中了手下的额头。"], + ["", "鲜血四溅。"], + ["凯伊姆", "「不用这么麻烦」"], //男主06 + ["凯伊姆", "「我接下来要去《菲诺列塔》」"], //男主07 + ["奥兹", "「喔唷」"], //金锁高官11 + ["奥兹", "「既然如此,我就不留您在这里喝难饮的劣质酒了」"], //金锁高官12 + ["", "奥兹斜眼看着正捂住额头呻吟的手下,轻描淡写地说道。"], + ["凯伊姆", "「用这些钱去买药」"], //男主08 + ["", "我将几枚铜钱仍在那个手下的身前。"], + ["奥兹", "「凯伊姆先生,不用对他们这么好」"], //金锁高官13 + ["凯伊姆", "「无妨」"], //男主09 + ["凯伊姆", "「话说回来,那个要落跑的女人呢?」"], //男主10 + ["奥兹", "「我把她交给那些年轻人了,现在应该正在体会人生的严苛吧」"], //金锁高官14 + ["奥兹", "「正好,趁此机会凯伊姆先生也来享受一番如何?」"], //金锁高官15 + ["年轻人", "「你,你们这些家伙,要对她做什么!?」"], //龙套1-08 + ["", "咣!"], + ["", "奥兹给了他一拳。"], + ["", "一击即倒。"], + ["", "喀,咚,咯!"], + ["", "奥兹毫不留情地向男人的脸上踩去。"], + ["年轻人", "「咕······呃咳······」"], //龙套1-09 + ["", "折断的牙齿伴着血泡被吐出。"], + ["", "这份白色在鲜红色的液体中格外显眼。"], + ["年轻人", "「你们以为做出这种事······卫兵会坐视不理吗······」"], //龙套1-10 + ["奥兹", "「啊啊,不会坐视不理的」"], //金锁高官16 + ["奥兹", "「应该会拿出你的钱包,和我们商量如何瓜分吧」"], //金锁高官17 + ["年轻人", "「那,那种事······」"], //龙套1-11 + ["", "这在牢狱是理所当然的事。"], + ["奥兹", "「怎么,头一回来牢狱么?」"], //金锁高官18 + ["", "男人点了点头。"], + ["奥兹", "「为了被骗的女人而来到牢狱,真是个规矩人啊」"], //金锁高官19 + ["奥兹", "「······前提是,被骗的人不是你」"], //金锁高官20 + ["年轻人", "「你说······我被骗了?」"], //龙套1-12 + ["年轻人", "「那,那是怎么回事!?」"], //龙套1-13 + ["奥兹", "「不用急,今天晚上会好好告诉你的」"], //金锁高官21 + ["", "奥兹抓起男人的脸。"], + ["", "为引诱客人的怜悯之心而装纯,是娼妇的惯用手段。"], + ["", "双亲被骗而借钱,结果作为抵押而将自己卖到这里,这是典型的说法。"], + [ + "", + "如果只是头脑发热而成为常客也就罢了,这次的男人热血过头,居然想出了要带女人私奔的计划。", + ], + [ + "", + "虽然女人半开玩笑地予以拒绝,但不知天高地厚的这家伙还是拉着她逃跑了。", + ], + ["", "不过,想要逃脱追击本来就是不可能的任务。"], + ["", "但即便如此,这种事情还是会一再的出现。"], + ["", "说谎的女人和被骗的男人。"], + ["", "在娼馆街,这是令人看到生厌的日常的风景。"], + ["凯伊姆", "「我要走了」"], //男主11 + ["奥兹", "「好的,下次再麻烦您」"], //金锁高官22 + ["奥兹", "「之后吉克先生会将谢礼交给您的」"], //金锁高官23 + ["凯伊姆", "「啊啊」"], //男主12 + ["", "我背向奥兹走出娼馆。"], + ["凯伊姆", "「······?」"], //男主13 + ["", "从远方传来微弱的歌声。"], + ["", "是关卡广场的方向。"], + ["", "对了。"], + ["", "今天有觐见圣女的仪式。"], + ["", "当代的圣女伊莲——"], + ["", "俗称《盲眼之圣女》,据说即使在历代的圣女中,人气也是数一数二的。"], + ["", "广场上的人估计相当多吧。"], + ["", "虽然我也想去看看她长什么样,不过要在人潮中挤来挤去就免了。"], + ["", "还是老老实实去菲诺列塔喝烧酒吧。"], + ["", "正当我这样想着的时候,一个身影自小巷的那头走来。"], + ["凯伊姆", "「艾莉斯」"], //男主14 + ]; + this.chapter01 = [ + ["艾莉斯", "「啊,凯伊姆」"], //医生00.5 + ["艾莉斯", "「正好,我还想要去找你呢」"], //医生01 + ["艾莉斯", "「没想到凯伊姆会主动出现······这是命运吗?」"], //医生02 + ["凯伊姆", "「显然不是吧」"], //男主15 + ["艾莉斯", "「啊,是么」"], //医生03 + ["", "艾莉斯挑了挑整齐的双眉,微微地哼了一声。"], + [ + "", + "虽然是个相当引人注目的美人,但她这个将亲切儿子丢入无底深渊的性格,为自己扣了不少的分", + ], + ["", "给人印象最深的,就是那潭水般的双瞳。"], + ["", "在漆黑的瞳孔中,完全看不出感情的波动。"], + ["艾莉斯", "「喜欢我的眼睛吗?」"], //医生04 + ["艾莉斯", "「如果想要的话就给你吧?」"], //医生05 + ["凯伊姆", "「用不着」"], //男主16 + ["艾莉斯", "「阿拉,可惜」"], //医生06 + ["凯伊姆", "「那么,找我有什么事」"], //男主17 + ["艾莉斯", "「梅尔特的钱好像被偷了」"], //医生07 + ["凯伊姆", "「钱被偷了?都几岁了还这么没用」"], //男主18 + ["艾莉斯", "「不要对我说啊」"], //医生08 + ["凯伊姆", "「那家伙,该不会说要让我去抓那个小偷吧?」"], //男主19 + ["艾莉斯", "「就是这样」"], //医生09 + ["凯伊姆", "「笨蛋吗」"], //男主20 + ["凯伊姆", "「如果是小钱的话,就当做是买个教训吧」"], //男主21 + ["艾莉斯", "「说起来,被盗的是这个月的上纳金」"], //医生10 + ["凯伊姆", "「你说什么?」"], //男主22 + ["艾莉斯", "「用这些钱买教训,也太过奢侈了呢」"], //医生11 + ["凯伊姆", "「知道了,我去找」"], //男主23 + ["凯伊姆", "「小偷的特征呢」"], //男主24 + ["艾莉斯", "「男孩子」"], //医生12 + ["艾莉斯", "「······而且,背后有翅膀」"], //医生13 + ["艾莉斯", "「虽然姑且是藏在身后,但是仔细观察的话是很明显的」"], //医生14 + ["凯伊姆", "「羽化病吗」"], //男主25 + [ + "艾莉斯", + "「那些人可是毫不留情的,所以即使是为了那个孩子,也要赶快抓到他」", + ], //医生15 + ["凯伊姆", "「注意到他逃窜的方向了吗?」"], //男主26 + ["艾莉斯", "「广场那边」"], //医生16 + ["艾莉斯", "「虽然刚才《不蚀金锁》的人去追了,不过多半是······」"], //医生17 + ["凯伊姆", "「偏偏还是广场吗」"], //男主28 + ["艾莉斯", "「今天是觐见圣女大人的日子」"], //医生18 + ["凯伊姆", "「我知道」"], //男主29 + ["凯伊姆", "「尽量找找看就好」"], //男主30 + ]; + this.chapter02 = [ + ["不蚀金锁成员", "「凯伊姆先生,凯伊姆先生」"], + ["不蚀金锁成员", "「您已经和艾莉斯大夫见过面了吗?」"], + ["凯伊姆", "「啊啊,所以才会追过来的」"], //男主31 + ["凯伊姆", "「看到小偷了吗?」"], //男主32 + [ + "不蚀金锁成员", + "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", + ], + [ + "不蚀金锁成员", + "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", + ], + ["不蚀金锁成员", "「我已经准备撤退了」"], + ["不蚀金锁成员", "「凯伊姆先生还要继续追吗?」"], + ["凯伊姆", "「啊啊」"], //男主33 + ["", "做完情报交换之后,我跟男人道别。"], + ["凯伊姆", "「和我想的一样啊······」"], //男主34 + ["", "在牢狱中最大的广场上,聚集着看不到尽头的人群。"], + ["", "就算是来参见圣女祈祷,这人数也太多了点吧。"], + ["", "自然,我也找不到逃跑的孩子。"], + ["", "是混杂到人群中了吧。"], + ["", "如果已经从广场上脱身了的话,就更难发现了。"], + ["", "只好赌他还在这里了。"], + ["", "我先移动到了一个视野良好的地方。"], + ["", "从这里,一眼就可以看到人群的变化。"], + ["", "广场还是沸腾起来。"], + ["", "抬头望去,原来是在天台之上出现了一个人影"], + ["", "但是,与周围的期待不同,现身的是一名中年的神官。"], + ["", "骂声四溢。"], + ["", "神官则是笑着摆正衣领"], + ["神官", "「从现在开始,举行谒见的仪式」"], + [ + "神官", + "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", + ], + [ + "神官", + "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", + ], + [ + "神官", + "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", + ], + [ + "神官", + "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", + ], + ["神官", "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」"], + ["圣女", "「不忘感谢与祈祷,神才会拯救我们」"], + ["圣女", "「与我一起,向神虔诚地祈祷吧」"], + ["", "广场上欢声雷动。"], + ["", "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。"], + ["", "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。"], + ["", "她掌握着这条街道,还有在这条街上生活的人的命运。"], + ["", "比起揽得人气,她更想要为了街道的继续存在而献出全力。"], + ["", "也是为了不让《大崩落》的惨剧再度发生。"], + ["", "十几年前的那场悲剧。"], + [ + "", + "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", + ], + ["凯伊姆", "「······」"], //男主35 + ["", "这时我才想起,现在不是我在这里看圣女的时候。"], + ["女声", "「——っ!?」"], + ["围观的女人", "「羽,羽化病人!?」"], + ["围观的中年人", "「喂,谁去叫下羽狩」"], + ["惊慌的观众", "「你这家伙不要靠近我,要是传染了可怎么办」"], + ["粗鲁的观众", "「你这小鬼赶快滚开」"], + ["凯伊姆", "「接下来」"], + ["圣女", "「发生什么事了?看上去似乎很嘈杂」"], + ["随从", "「似乎是某个人逃跑了······具体的我也不是很清楚」"], + ["神官", "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」"], + ["圣女", "「不用在意我,比起那个,我更关心究竟发生了什么事」"], + ["神官", "「对不起,我真的不知道」"], + ["圣女", "「······是吗」"], + ["男", "「恕我僭越,请准许我说明情况」"], + ["男", "「在来觐见的人群中出现了《羽化病》的患者」"], + ["男", "「围观的人群因而产生了骚动」"], + [ + "男", + "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", + ], + ["圣女", "「羽化病······」"], + ["男", "「怎么了?」"], + ["圣女", "「没什么」"], + ["圣女", "「辛苦了,你的名字是?」"], + ["男", "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」"], + ["神官", "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」"], + ["神官", "「阁下是在工作上相当出色的人呢」"], + ["鲁基乌斯", "「不敢当」"], + [ + "鲁基乌斯", + "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", + ], + [ + "圣女", + "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", + ], + ["鲁基乌斯", "「属下不胜惶恐」"], + ["鲁基乌斯", "「接下来属下还要回到工作岗位上,在这里就先告退了」"], + ["圣女", "「鲁基乌斯先生」"], + ["鲁基乌斯", "「属下在」"], + ["圣女", "「你是怎样看待羽狩的工作的呢?」"], + ["神官", "「圣,圣女大人」"], + [ + "鲁基乌斯", + "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", + ], + ["神官", "「不,不亏是鲁基乌斯卿,相当优秀的想法」"], + ["圣女", "「是吗。辛苦你了」"], + ["随从", "「圣女大人······」"], + ["鲁基乌斯", "「······」"], + ["鲁基乌斯", "「那么,属下就回岗位去了」"], + ]; + this.chapter03 = [ + ["", "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。"], + ["", "显然,他并没有想到我会捷足先登吧。"], + ["", "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。。"], + ["凯伊姆", "「辛苦你了」"], //男主37 + ["羽化病患少年", "「稀!?」"], + ["凯伊姆", "「逃到贫民区是个不错的想法」"], //男主38 + ["羽化病患少年", "「你,你是,羽狩吗?」"], + ["凯伊姆", "「不是」"], //男主39 + ["羽化病患少年", "「什,什么啊······混蛋,不要吓我啊」"], + ["凯伊姆", "「我对令你受惊这件事致以歉意」"], //男主40 + ["凯伊姆", "「作为回报,麻烦你把从店里偷的钱交出来吧」"], //男主41 + ["羽化病患少年", "「钱?你在说什么」"], + ["凯伊姆", "「你要找的腰上的东西,掉在你身后了」"], //男主42 + ["羽化病患少年", "「哎?」"], + ["羽化病患少年", "「呃呀」"], + ["羽化病患少年", "「你······你这混蛋」"], + ["凯伊姆", "「······」"], //男主43 + ["凯伊姆", "「把偷的钱交出来」"], //男主44 + ["羽化病患少年", "「我不知道你在······咕」"], + ["羽化病患少年", "「你,你说是我偷的······有什么证据吗」"], + ["凯伊姆", "「你还挺倔的啊」"], //男主45 + ["凯伊姆", "「不过,给我听好了」"], //男主46 + ["凯伊姆", "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」"], //男主47 + ["凯伊姆", "「而且,钱的主人是从前和吉克颇有渊源的女人」"], //男主48 + ["羽化病患少年", "「吉克?」"], + ["凯伊姆", "「他是《不蚀金锁》的主人,这么说你就明白了吧」"], //男主49 + ["羽化病患少年", "「哎?哎?怎么会······」"], + ["凯伊姆", "「再问你一遍,钱在哪里?」"], //男主50 + ["羽化病患少年", "「是,是,是,在我的怀里」"], + ["凯伊姆", "「你没有擅自拿掉一部分吧」"], //男主51 + ["羽化病患少年", "「是,是的」"], + ["羽化病患少年", "「那,那个,您是《不蚀金锁》的人吗?」"], + ["凯伊姆", "「算是吧」"], //男主52 + ["羽化病患少年", "「我什么都可以做,请您一定要帮帮我」"], + ["凯伊姆", "「抱歉,我并没有兴趣去帮助他人」"], //男主53+54 + ["羽化病患少年", "「我什么······什么,都会做的······」"], + ["羽化病患少年", "「我一直都是生活在下层的」"], + [ + "羽化病患少年", + "「可是,不知何时染上了羽化病······背后长出了翅膀······」", + ], + ["羽化病患少年", "「被寄宿工作的店赶了出来,只得流落到牢狱这里」"], + ["羽化病患少年", "「因为独自实在是饿的不行了,所以才会偷这些钱的」"], + [ + "羽化病患少年", + "「我明明没有做任何坏事······为什么······会遇到这种事······」", + ], + ["凯伊姆", "「谁知道」"], //男主55 + ["羽化病患少年", "「呜······呜呜······接下来,要对我做什么?」"], + ["凯伊姆", "「我要把你带到组织那里」"], //男主56 + ["羽化病患少年", "「怎,怎么这样」"], + ["凯伊姆", "「不过,那样做的前提是你不是羽化病人」"], + ["凯伊姆", "「组织也没有笨到把羽化病人招待到家里的程度」"], + ["羽化病患少年", "「那么,是要放我逃走吗?」"], + ["凯伊姆", "「我要让你学到教训」"], + ["凯伊姆", "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」"], + ["凯伊姆", "「你的运气不错」"], + ["羽化病患少年", "「唔······啊,是的······」"], + ["凯伊姆", "「滚」"], + ["羽化病患少年", "「非常感谢」"], + ["羽化病患少年", "「唔啊!?」"], + ["男", "「到这里就结束了,羽化病人」"], + ["男", "「确认他的翅膀」"], + ["", "趁还没有被卷入麻烦的事情之前,赶快离开这里吧"], + ["羽狩的队长", "「那边的那个人」"], + ["凯伊姆", "「······有什么事?」"], + ["羽狩的队长", "「可以稍微让我问几句话吗」"], + ["凯伊姆", "「······」"], + ["凯伊姆", "「啊啊,无妨」"], + ["羽狩的队长", "「感谢您的合作」"], + ["", "队长殷勤地致以谢礼。"], + ["", "而在他的眼前,少年的衣服已经被他的补下们扯破。"], + ["", "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。"], + ["红发的羽狩", "「副队长,确认翅膀的持有了」"], + ["羽狩的副队长", "「保护他」"], + ["羽化病患少年", "「不要······请原谅,我······」"], + [ + "羽狩的副队长", + "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", + ], + ["羽化病患少年", "「可是,可是」"], + ["羽狩的副队长", "「没关系的」"], + ["羽化病患少年", "「······哥,哥哥」"], + ["羽狩的副队长", "「你是羽化病人的亲属吗?」"], + ["凯伊姆", "「只是路人而已」"], + ["凯伊姆", "「顺带一提,我也没有打算找你们的麻烦」"], + [ + "羽狩的副队长", + "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", + ], + ["羽狩的副队长", "「我的一个部下就此永久失去了半截胳膊」"], + ["凯伊姆", "「我表示同情」"], + ["凯伊姆", "「我马上就会消失的,这样就没问题了吧?」"], + ["羽狩的副队长", "「嘛,不要这么慌张」"], + ["", "副队长看着羽化的少年。"], + ["羽狩的副队长", "「你与这个人是什么关系?没有被他殴打吗?」"], + ["羽化病患少年", "「没,没有」"], + [ + "羽狩的副队长", + "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", + ], + ["羽化病患少年", "「······」"], + ["羽化病患少年", "「那个人,是《不蚀金锁》的组织成员······」"], + ["羽化病患少年", "「突然说让我拿出钱来,我刚一拒绝他就打我」"], + ["羽狩的副队长", "「原来如此······」"], + [ + "羽狩的副队长", + "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", + ], + ["凯伊姆", "「当然不是」"], + ["凯伊姆", "「我只是从那里接受工作而已,并不是他们的成员」"], + ["羽狩的副队长", "「你的意思是说,少年在说谎吗?」"], + ["凯伊姆", "「啊啊」"], + [ + "凯伊姆", + "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", + ], + ["羽狩的副队长", "「就算我去询问,也无法从他们那里得到事实」"], + [ + "羽狩的副队长", + "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", + ], + ["凯伊姆", "「真是辛苦啊」"], + ["羽狩的副队长", "「说的是啊」"], + ["羽狩的副队长", "「其实,砍下我部下胳膊的似乎也是组织的成员呢」"], + [ + "羽狩的副队长", + "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", + ], + [ + "羽狩的副队长", + "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", + ], + ["羽狩的副队长", "「那和整条街道的和平也是紧密相关的吧?」"], + ["凯伊姆", "「我知道,你们有逮捕干扰狩猎羽化病人的权力」"], + [ + "凯伊姆", + "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", + ], + ["羽狩的副队长", "「那些话,我们会在看守所对你详细说明的」"], + ["凯伊姆", "「······」"], + ["", "在这里起争执的话,就会被羽狩加害。"], + ["", "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。"], + ["", "就算逃跑,也没有好的结果。"], + ["", "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。"], + ["", "发生了什么事······"], + ["???", "「我认为,那位先生是正确的」"], + ["", "羽狩们一起回头。"], + ["", "而在他们视线的焦点处,"], + ["", "伫立着一位女性。"], + ["", "在端正的容颜下,代表着强烈意志的双眉十分显眼。"], + ["", "身体的柔软与紧紧包裹在其身上的羽狩制服,两者显得十分的不搭配。"], + ["", "我还是第一次看到女性的羽狩。"], + ["羽狩的副队长", "「队长,这是获得《不蚀金锁》情报的好机会」"], + [ + "羽狩的队长", + "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", + ], + ["兰格副队长", "「我并没有打算去恫吓他······」"], + ["羽狩的队长", "「告诉我那个被砍掉胳膊的队员的名字」"], + ["羽狩的队长", "「我会去探望他的」"], + ["兰格副队长", "「那个是······」"], + ["羽狩的队长", "「我知道,你一直在为有所收获而努力工作」"], + ["羽狩的队长", "「但是,正因为我们的工作是为民众提供帮助」"], + ["羽狩的队长", "「所以就更不能损害人与人之间的信赖」"], + ["兰格副队长", "「我会铭记在心」"], + ["羽狩的队长", "「这位先生,我的部下失礼了」"], + ["凯伊姆", "「只要不对我再来一次就好」"], + ["羽狩的队长", "「请稍等」"], + ["凯伊姆", "「有什么事?」"], + ["羽狩的队长", "「我想确认一件事」"], + ["羽狩的队长", "「你真的不是《不蚀金锁》的成员吗?」"], + ["凯伊姆", "「真的」"], + ["凯伊姆", "「如果我说是的话,你有什么打算?」"], + ["羽狩的队长", "「我听过传闻,说他们是用依靠暴力而得的钱在生活」"], + ["凯伊姆", "「······这样啊」"], + ["凯伊姆", "「如果能有收获就好了啊」"], + ]; + this.chapter04 = [ + ["梅尔特", "「欢迎光临」"], + ["梅尔特", "「辛苦了」"], + ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」"], + ["凯伊姆", "「没什么,比想象中完成的更容易」"], + ["梅尔特", "「那就好」"], + ["梅尔特", "「这是我的一点谢意」"], + ["凯伊姆", "「味道有些变化啊」"], + ["梅尔特", "「啊,被发现了?」"], + ["梅尔特", "「最近,没能到手什么好的原料呢」"], + ["凯伊姆", "「去拜托吉克如何?」"], + [ + "梅尔特", + "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", + ], + ["凯伊姆", "「那希望你也不要来麻烦我」"], + ["梅尔特", "「那 是 两 码 事」"], + ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」"], + [ + "梅尔特", + "「而且,自己的钱被偷了这么害羞的事,向凯伊姆意外的其他人都说不出口」", + ], + ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」"], + ["梅尔特", "「这是面子问题啊,面子问题」"], + ["凯伊姆", "「嘛,算了」"], + ["凯伊姆", "「这样就好了吧?」"], + ["梅尔特", "「这是钱包呢」"], + ["梅尔特", "「嗯,东西没少」"], + ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」"], + ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」"], + ["凯伊姆", "「在那边不是来钱更快吗?」"], + ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」"], + ["凯伊姆", "「这是客套话而已」"], + ["梅尔特", "「欺负人」"], + ["梅尔特", "「总而言之,今天帮大忙了」"], + ["梅尔特", "「谢礼嘛······」"], + ["凯伊姆", "「就记在账单上吧」"], + ["梅尔特", "「了解—盛谢惠顾了哦?」"], + ["", "喀啷喀啷"], + ["", "门铃响起"], + ["", "喧哗瞬间安静下来。"], + ["", "进来的人是吉克。"], + ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], + ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], + ["吉克", "「各位继续吧」"], + ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], + ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。"], + ["凯伊姆", "「不用介意」"], + ["", "吉克轻轻点了点头,在我右边坐了下来"], + ["凯伊姆", "「逃跑的男人怎么样了?」"], + ["吉克", "「嗯?已经不在这个世上了」。"], + ["吉克", "「有什么想要知道的事吗?」"], + ["凯伊姆", "「不,没什么」"], + ["吉克", "「那个无聊的家伙,完全没有趣味呢」"], + ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」"], + ["凯伊姆", "「真是灾难啊」"], + ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」"], + ["凯伊姆", "「消息真灵通」"], + ["吉克", "「梅尔特也注意点」"], + ["吉克", "「你丢钱已经不是一回两回了」"], + ["梅尔特", "「好的—我会注意的。」"], + ["梅尔特", "「吉克还是平常的点单吧」"], + ["梅尔特", "「凯伊姆要再来一杯吗?」"], + ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], + ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], + ["吉克", "「这是抓捕逃跑男人的报酬」"], + ["凯伊姆", "「下次有什么事再告诉我」"], + ["梅尔特", "「来,久等了」"], + ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」"], + ["吉克", "「让我猜猜看」"], + ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」"], + ["梅尔特", "「可惜—」"], + ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」"], + ["凯伊姆", "「完全把你当成新进的女佣了么」"], + ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」"], + ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」"], + ["凯伊姆&吉克", "「你傻啊」"], + ["梅尔特", "「异口同声呢,不亏是兄弟」"], + ["凯伊姆", "「别用这种称呼,怪恶心的」"], + ["吉克", "「说得没错」"], + ["吉克", "「······说起来······」"], + ["梅尔特", "「怎么了?」"], + ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」"], + ["凯伊姆", "「你也说这么无聊的话题」"], + ["吉克", "「不,这是很重要的事情」"], + ["吉克", "「梅尔特,事实是怎么样的?」"], + ["梅尔特", "「啊~是怎么样的呢~」"], + ["梅尔特", "「我忘记了」"], + ["吉克", "「骗人」"], + ]; +} } \ No newline at end of file From 396abfe2224cae9c7d4f2b7bc8017bbff5fcae8e Mon Sep 17 00:00:00 2001 From: strawberry42271 <2806566736@qq.com> Date: Sat, 1 Feb 2025 00:23:21 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E6=88=98=E6=96=97=E5=8A=A8=E7=94=BB?= =?UTF-8?q?=EF=BC=8C=E5=B1=9E=E6=80=A7=E6=9B=B4=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _server/table/data.comment.js | 4 +- project/data.js | 14 +- project/enemys.js | 2 +- project/events.js | 130 + project/functions.js | 345 +- project/images/jianji.webp | Bin 0 -> 378474 bytes project/images/miwu.webp | Bin 0 -> 21916 bytes project/plugins.js | 11373 ++++++++++++++++---------------- styles.css | 4 +- 9 files changed, 5965 insertions(+), 5907 deletions(-) create mode 100644 project/images/jianji.webp create mode 100644 project/images/miwu.webp diff --git a/_server/table/data.comment.js b/_server/table/data.comment.js index 6698265..358881b 100644 --- a/_server/table/data.comment.js +++ b/_server/table/data.comment.js @@ -269,7 +269,7 @@ var data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_type": "textarea", "_data": "法强", }, - "spelldef": { + "mdef": { "_leaf": true, "_type": "textarea", "_data": "法抗百分比", @@ -280,7 +280,7 @@ var data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_data": "100为法强转化为等值魔攻", "_docs": "魔攻比例" }, - "mdef": { + "mhp": { "_leaf": true, "_type": "textarea", "_data": "100为法强转化为等值护盾", diff --git a/project/data.js b/project/data.js index 0920725..0674e05 100644 --- a/project/data.js +++ b/project/data.js @@ -437,12 +437,14 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "face_440110.webp", "green.webp", "hero.webp", + "jianji.webp", "l.webp", "lane1.webp", "light.webp", "lock.webp", "lr.webp", "maba.webp", + "miwu.webp", "null.webp", "other_0001.webp", "other_0002.webp", @@ -1116,7 +1118,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "atk": 100, "def": 100, "mdef": 0, - "speed": 0, + "speed": 10, "money": 0, "exp": 0, "equipment": [], @@ -1494,14 +1496,12 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = ], "startText": [ { - "type": "setValue", - "name": "item:book", - "value": "1" + "type": "function", + "function": "function(){\ncore.getItem('book',1);core.getItem('fly',1)\n}" }, { - "type": "setValue", - "name": "item:fly", - "value": "1" + "type": "insert", + "name": "战斗动画特效注册" }, { "type": "insert", diff --git a/project/enemys.js b/project/enemys.js index f4da758..8c80082 100644 --- a/project/enemys.js +++ b/project/enemys.js @@ -4,7 +4,7 @@ var enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 = "redSlime": {"name":"红头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"value":10,"magic":false}, "blackSlime": {"name":"青头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, "slimelord": {"name":"怪王","hp":100,"atk":120,"def":0,"money":10,"exp":0,"point":0,"special":[1,9]}, - "bat": {"name":"小蝙蝠","hp":100,"atk":120,"def":0,"money":2,"exp":0,"point":0,"special":[1],"mdef":0,"speed":10}, + "bat": {"name":"小蝙蝠","hp":100,"atk":120,"def":0,"money":2,"exp":0,"point":0,"special":[1],"mdef":0,"speed":15}, "bigBat": {"name":"大蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, "redBat": {"name":"红蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[]}, "vampire": {"name":"冥灵魔王","hp":888,"atk":888,"def":888,"money":888,"exp":888,"point":0,"special":[6],"n":8}, diff --git a/project/events.js b/project/events.js index 5c6c1a0..20f75d5 100644 --- a/project/events.js +++ b/project/events.js @@ -10883,6 +10883,136 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = } ] } + ], + "战斗动画特效注册": [ + { + "type": "setanimate", + "name": "sword", + "px": 48, + "py": 48, + "width": 192, + "height": 192, + "allFarme": 15, + "imageList": [ + { + "image": "jianji.webp", + "beforefarme": 0, + "globalAlpha": 100, + "cx": 192, + "cy": 2112, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 3, + "acx": 192, + "acy": 2112, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "jianji.webp", + "beforefarme": 4, + "globalAlpha": 100, + "cx": 384, + "cy": 2112, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 6, + "acx": 384, + "acy": 2112, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "jianji.webp", + "beforefarme": 7, + "globalAlpha": 100, + "cx": 576, + "cy": 2112, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 9, + "acx": 576, + "acy": 2112, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "jianji.webp", + "beforefarme": 10, + "globalAlpha": 100, + "cx": 768, + "cy": 2112, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 12, + "acx": 768, + "acy": 2112, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "jianji.webp", + "beforefarme": 13, + "globalAlpha": 100, + "cx": 0, + "cy": 2304, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 15, + "acx": 0, + "acy": 2304, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + } + ], + "soundList": [ + { + "sound": "", + "startfarme": 0, + "stopbefore": false + } + ] + } ] }, "CommonEventTemplate": { diff --git a/project/functions.js b/project/functions.js index ea0a448..d202ca9 100644 --- a/project/functions.js +++ b/project/functions.js @@ -892,171 +892,170 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = }; }, "getDamageInfo": function (enemy, hero, x, y, floorId) { - // 获得战斗伤害信息(实际伤害计算函数) - // - // 参数说明: - // enemy:该怪物信息 - // hero:勇士的当前数据;如果对应项不存在则会从core.status.hero中取。 - // x,y:该怪物的坐标(查看手册和强制战斗时为undefined) - // floorId:该怪物所在的楼层 - // 后面三个参数主要是可以在光环等效果上可以适用 - floorId = floorId || core.status.floorId; + // 获得战斗伤害信息(实际伤害计算函数) + // + // 参数说明: + // enemy:该怪物信息 + // hero:勇士的当前数据;如果对应项不存在则会从core.status.hero中取。 + // x,y:该怪物的坐标(查看手册和强制战斗时为undefined) + // floorId:该怪物所在的楼层 + // 后面三个参数主要是可以在光环等效果上可以适用 + floorId = floorId || core.status.floorId; - var 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"), - hero_magic = core.getRealStatusOrDefault(hero, "magic"), - origin_hero_hp = core.getStatusOrDefault(hero, "hp"), - origin_hero_atk = core.getStatusOrDefault(hero, "atk"), - origin_hero_def = core.getStatusOrDefault(hero, "def"); + var 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"), + hero_magic = core.getRealStatusOrDefault(hero, "magic"), + origin_hero_hp = core.getStatusOrDefault(hero, "hp"), + origin_hero_atk = core.getStatusOrDefault(hero, "atk"), + origin_hero_def = core.getStatusOrDefault(hero, "def"); - // 怪物的各项数据 - // 对坚固模仿等处理扔到了脚本编辑-getEnemyInfo之中 - var enemyInfo = core.enemys.getEnemyInfo(enemy, hero, x, y, floorId); - var mon_hp = enemyInfo.hp, - mon_atk = enemyInfo.atk, - mon_def = enemyInfo.def, - mon_mdef = enemyInfo.mdef, - mon_speed = enemyInfo.speed, - mon_special = enemyInfo.special, - mon_absorb_damage = enemyInfo.absorb, - mon_barrier = enemyInfo.barrier; + // 怪物的各项数据 + // 对坚固模仿等处理扔到了脚本编辑-getEnemyInfo之中 + var enemyInfo = core.enemys.getEnemyInfo(enemy, hero, x, y, floorId); + var mon_hp = enemyInfo.hp, + mon_atk = enemyInfo.atk, + mon_def = enemyInfo.def, + mon_mdef = enemyInfo.mdef, + mon_speed = enemyInfo.speed, + mon_special = enemyInfo.special, + mon_absorb_damage = enemyInfo.absorb, + mon_barrier = enemyInfo.barrier; - //---第一部分:静态属性修正--- - //此处写入静态影响勇士属性的勇士或怪物技能(静态影响怪物属性的技能于getEnemyInfo中写入) - // 技能的处理 - if (core.getFlag("skill", 0) == 1) { - // 开启了技能1:二倍斩 - hero_atk *= 2; // 计算时攻击力翻倍 - } - //勇士属性取整 - hero_atk = Math.max(0, Math.floor(hero_atk)); - hero_def = Math.max(0, Math.floor(hero_def)); - hero_mdef = Math.max(0, Math.floor(hero_mdef)); - hero_speed = Math.max(0, Math.floor(hero_speed)); + //---第一部分:静态属性修正--- + //此处写入静态影响勇士属性的勇士或怪物技能(静态影响怪物属性的技能于getEnemyInfo中写入) + // 技能的处理 + if (core.getFlag("skill", 0) == 1) { + // 开启了技能1:二倍斩 + hero_atk *= 2; // 计算时攻击力翻倍 + } + //勇士属性取整 + hero_atk = Math.max(0, Math.floor(hero_atk)); + hero_def = Math.max(0, Math.floor(hero_def)); + hero_mdef = Math.max(0, Math.floor(hero_mdef)); + hero_speed = Math.max(0, Math.floor(hero_speed)); - // 如果是无敌属性,且勇士未持有十字架 - if (core.hasSpecial(mon_special, 20) && !core.hasItem("cross")) - return null; // 不可战斗 + // 如果是无敌属性,且勇士未持有十字架 + if (core.hasSpecial(mon_special, 20) && !core.hasItem("cross")) + return null; // 不可战斗 - // 战前造成的额外伤害(可被护盾抵消) - let init_damage = 0; + // 战前造成的额外伤害(可被护盾抵消) + let init_damage = 0; - // 吸血 - if (core.hasSpecial(mon_special, 11)) { - let vampire_damage = hero_hp * enemy.vampire; + // 吸血 + if (core.hasSpecial(mon_special, 11)) { + let vampire_damage = hero_hp * enemy.vampire; - // 如果有神圣盾免疫吸血等可以在这里写 - // 也可以用hasItem和hasEquip来判定装备 - // if (core.hasFlag('shield5')) vampire_damage = 0; + // 如果有神圣盾免疫吸血等可以在这里写 + // 也可以用hasItem和hasEquip来判定装备 + // if (core.hasFlag('shield5')) vampire_damage = 0; - vampire_damage = Math.floor(vampire_damage) || 0; - // 加到自身 - if (enemy.add) - // 如果加到自身 - mon_hp += vampire_damage; + vampire_damage = Math.floor(vampire_damage) || 0; + // 加到自身 + if (enemy.add) + // 如果加到自身 + mon_hp += vampire_damage; - init_damage += vampire_damage; - } + init_damage += vampire_damage; + } - //——第二部分:变量定义和初始赋值—— - // 每回合怪物对勇士造成的战斗伤害 - let per_damage = Math.max(mon_atk - hero_def, 0); - if (enemyInfo.magic) per_damage = Math.max(mon_atk - hero_mdef, 0); + //——第二部分:变量定义和初始赋值—— + // 每回合怪物对勇士造成的战斗伤害 + let per_damage = Math.max(mon_atk - hero_def, 0); + if (enemyInfo.magic) per_damage = Math.max(mon_atk - hero_mdef, 0); - // - let hero_per_damage = Math.max(hero_atk - mon_def, 0); - if (hero_magic) hero_per_damage = Math.max(hero_atk - mon_mdef, 0); + // + let hero_per_damage = Math.max(hero_atk - mon_def, 0); + if (hero_magic) hero_per_damage = Math.max(hero_atk - mon_mdef, 0); - let damage = 0, - hero_turn = 0, - mon_turn = 0; - //---第三部分:递归开始--- - let length = hero_speed * mon_speed; + let damage = 0, + hero_turn = 0, + mon_turn = 0; + //---第三部分:递归开始--- + let length = hero_speed * mon_speed; - for ( - let now_mon_hp = mon_hp, - last_mon_hp = mon_hp, - mon_length = length, - hero_length = length, - mon_time = 0, - hero_time = 0; - now_mon_hp > 0; + for ( + let now_mon_hp = mon_hp, + last_mon_hp = mon_hp, + mon_length = length, + hero_length = length, + mon_time = 0, + hero_time = 0; now_mon_hp > 0; - ) { - //勇士和怪物的长度 - mon_time = mon_length / mon_speed; - hero_time = hero_length / hero_speed; - if ( - mon_time < hero_time || - ((mon_time = hero_time) && mon_speed > hero_speed) - ) { - //怪物攻击的回合 - //这里计算怪物攻击时发生的各种变化 + ) { + //勇士和怪物的长度 + mon_time = mon_length / mon_speed; + hero_time = hero_length / hero_speed; + if ( + mon_time < hero_time || + ((mon_time = hero_time) && mon_speed > hero_speed) + ) { + //怪物攻击的回合 + //这里计算怪物攻击时发生的各种变化 - //伤害与回合增加 - damage += per_damage; - if (core.hasSpecial(mon_special, 6)) { - mon_turn += enemy.n; - } else { - mon_turn += 1; - } - //重新为长度赋值 - mon_length = length; - hero_length = hero_length - mon_time * hero_speed; - } else { - //勇士攻击的回合 - // 这里计算勇士攻击时发生的各种变化 + //伤害与回合增加 + damage += per_damage; + if (core.hasSpecial(mon_special, 6)) { + mon_turn += enemy.n; + } else { + mon_turn += 1; + } + //重新为长度赋值 + mon_length = length; + hero_length = hero_length - mon_time * hero_speed; + } else { + //勇士攻击的回合 + // 这里计算勇士攻击时发生的各种变化 - // 伤害与回合数增加 - now_mon_hp -= hero_per_damage; - hero_turn += 1; //勇士回合+1,如果有勇士每回合多次攻击的情况,在这里写判断 - // 无法战斗计算 - if (hero_turn % 50 == 0) { - if (now_mon_hp >= last_mon_hp) return null; - last_mon_hp = now_mon_hp; - } - //重新为长度赋值 - hero_length = length; - mon_length = mon_length - hero_time * mon_speed; - } - } + // 伤害与回合数增加 + now_mon_hp -= hero_per_damage; + hero_turn += 1; //勇士回合+1,如果有勇士每回合多次攻击的情况,在这里写判断 + // 无法战斗计算 + if (hero_turn % 50 == 0) { + if (now_mon_hp >= last_mon_hp) return null; + last_mon_hp = now_mon_hp; + } + //重新为长度赋值 + hero_length = length; + mon_length = mon_length - hero_time * mon_speed; + } + } - //下面这些还没修改 - // 连击 - if (core.hasSpecial(mon_special, 6)) per_damage *= enemy.n || 2; + //下面这些还没修改 + // 连击 + if (core.hasSpecial(mon_special, 6)) per_damage *= enemy.n || 2; - // 每回合的反击伤害;反击是按照勇士的攻击次数来计算回合 - let counterDamage = 0; - if (core.hasSpecial(mon_special, 8)) - counterDamage += Math.floor( - (enemy.counterAttack || core.values.counterAttack) * hero_atk - ); + // 每回合的反击伤害;反击是按照勇士的攻击次数来计算回合 + let counterDamage = 0; + if (core.hasSpecial(mon_special, 8)) + counterDamage += Math.floor( + (enemy.counterAttack || core.values.counterAttack) * hero_atk + ); - // 先攻 - if (core.hasSpecial(mon_special, 1)) init_damage += per_damage; + // 先攻 + if (core.hasSpecial(mon_special, 1)) init_damage += per_damage; - // 破甲 - if (core.hasSpecial(mon_special, 7)) - init_damage += Math.floor( - (enemy.breakArmor || core.values.breakArmor) * hero_def - ); + // 破甲 + if (core.hasSpecial(mon_special, 7)) + init_damage += Math.floor( + (enemy.breakArmor || core.values.breakArmor) * hero_def + ); - // 净化 - if (core.hasSpecial(mon_special, 9)) - init_damage += Math.floor( - (enemy.purify || core.values.purify) * hero_mdef - ); - //上面这些还没修改 - //勇士护盾计算 - let barrier = hero_mdef; - if (enemyInfo.magic) barrier = hero_def; + // 净化 + if (core.hasSpecial(mon_special, 9)) + init_damage += Math.floor( + (enemy.purify || core.values.purify) * hero_mdef + ); + //上面这些还没修改 + //勇士护盾计算 + let barrier = hero_mdef; + if (enemyInfo.magic) barrier = hero_def; - // ------ 支援 ----- // - // 这个递归最好想明白为什么,flag:__extraTurn__是怎么用的 - /*var guards = core.getFlag("__guards__" + x + "_" + y, enemyInfo.guards); + // ------ 支援 ----- // + // 这个递归最好想明白为什么,flag:__extraTurn__是怎么用的 + /*var guards = core.getFlag("__guards__" + x + "_" + y, enemyInfo.guards); var guard_before_current_enemy = false; // ------ 支援怪是先打(true)还是后打(false)? turn += core.getFlag("__extraTurn__", 0); if (guards.length > 0) { @@ -1084,43 +1083,43 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } } core.removeFlag("__extraTurn__");*/ - // ------ 支援END ------ // + // ------ 支援END ------ // - // 最终伤害:初始伤害 + 怪物对勇士造成的伤害 + 反击伤害 - damage += init_damage + hero_turn * counterDamage; - // 再扣去护盾 - damage -= barrier; + // 最终伤害:初始伤害 + 怪物对勇士造成的伤害 + 反击伤害 + damage += init_damage + hero_turn * counterDamage; + // 再扣去护盾 + damage -= barrier; - // 检查是否允许负伤 - if (!core.flags.enableNegativeDamage) damage = Math.max(0, damage); + // 检查是否允许负伤 + if (!core.flags.enableNegativeDamage) damage = Math.max(0, damage); - // 最后处理仇恨和固伤(因为这两个不能被护盾减伤) - if (core.hasSpecial(mon_special, 17)) { - // 仇恨 - damage += core.getFlag("hatred", 0); - } - if (core.hasSpecial(mon_special, 22)) { - // 固伤 - damage += enemy.damage || 0; - } + // 最后处理仇恨和固伤(因为这两个不能被护盾减伤) + if (core.hasSpecial(mon_special, 17)) { + // 仇恨 + damage += core.getFlag("hatred", 0); + } + if (core.hasSpecial(mon_special, 22)) { + // 固伤 + damage += enemy.damage || 0; + } - return { - mon_hp: Math.floor(mon_hp), - mon_atk: Math.floor(mon_atk), - mon_def: Math.floor(mon_def), - mon_mdef: Math.floor(mon_mdef), - init_damage: Math.floor(init_damage), - per_damage: Math.floor(per_damage), - hero_per_damage: Math.floor(hero_per_damage), - turn: Math.floor(hero_turn), - mon_turn: Math.floor(mon_turn), - damage: Math.floor(damage), - }; - /*TODO:怪物手册的修改(需要修改这里return的内容以及一些战后判断) + return { + mon_hp: Math.floor(mon_hp), + mon_atk: Math.floor(mon_atk), + mon_def: Math.floor(mon_def), + mon_mdef: Math.floor(mon_mdef), + init_damage: Math.floor(init_damage), + per_damage: Math.floor(per_damage), + hero_per_damage: Math.floor(hero_per_damage), + turn: Math.floor(hero_turn), + mon_turn: Math.floor(mon_turn), + damage: Math.floor(damage), + }; + /*TODO:怪物手册的修改(需要修改这里return的内容以及一些战后判断) 1. 显示怪物是魔攻还是物攻(在怪物名字上做颜色变化,物攻是黄色,魔攻是蓝色) 2. 一防减伤是物防还是魔防(由怪物是物攻还是魔攻来转换) 3. 特殊战斗的怪物,在怪物手册里“伤害”写为“特殊战”*/ - } +} }, "actions": { "onKeyUp": function (keyCode, altKey) { diff --git a/project/images/jianji.webp b/project/images/jianji.webp new file mode 100644 index 0000000000000000000000000000000000000000..40504a47d58df1f30f628be1f20251ddea8671ec GIT binary patch literal 378474 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�NQre1JPIq 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�+}N0hlWlkg(Q@3P2u4)BlE)J<~#r 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 core.doAction(), 3100); - } else { - core.doAction(); - } - }); + setTimeout(() => core.doAction(), 3100); + } else { + core.doAction(); + } + }); - core.registerEvent("over", function (data) { - let image = data.image ?? ""; - let time = data.time ?? 3000; - let sound = data.sound ?? ""; - let textColor = data.textColor ?? "#FFFFFF"; - let boldColor = data.boldColor ?? "#000000"; - let font = data.font ?? "bold 48px Verdana"; - let text = data.text ?? ""; - let hidetime = data.hidetime ?? 100; - if (!main.replayChecking && !core.isReplaying()) { - core.over( - image, - data.memory, - time, - hidetime, - sound, - textColor, - boldColor, - font, - text - ); - } else { - core.doAction(); - } - }); - core.registerEvent("changebg", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.changebg( - data.img1, - data.memory1, - data.img2, - data.memory2, - data.time, - data.style - ); - } else { - core.doAction(); - } - }); - core.registerEvent("overlist", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.overlist( - data.image, - data.memory, - data.hidetime || 30, - data.list || [{ - text: "", - sound: "", - time: 50, - textColor: "#FFFFFF", - boldColor: "#000000", - font: "bold 48px Verdana", - frame: 0, - }, ] - ); - } else { - core.doAction(); - } - }); - core.registerEvent("op", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.openvideo(); - } else { - core.doAction(); - } - }); - core.registerEvent("animationDrawable", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.animationDrawable( - data.allFarme, - data.color, - data.globalAlpha, - data.imageList, - data.soundList - ); - } else { - core.doAction(); - } - }); - core.registerEvent("setanimate", function (data) { - data.px = data.px ?? 0; - data.py = data.py ?? 0; - core.setanimate( - data.name, - data.px, - data.py, - data.width, - data.height, - data.allFarme, - data.imageList, - data.soundList - ); - core.doAction(); - }); - core.registerEvent("clearanimate", function (data) { - core.plugin.playing.clear(); + core.registerEvent("over", function (data) { + let image = data.image ?? ""; + let time = data.time ?? 3000; + let sound = data.sound ?? ""; + let textColor = data.textColor ?? "#FFFFFF"; + let boldColor = data.boldColor ?? "#000000"; + let font = data.font ?? "bold 48px Verdana"; + let text = data.text ?? ""; + let hidetime = data.hidetime ?? 100; + if (!main.replayChecking && !core.isReplaying()) { + core.over( + image, + data.memory, + time, + hidetime, + sound, + textColor, + boldColor, + font, + text + ); + } else { + core.doAction(); + } + }); + core.registerEvent("changebg", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.changebg( + data.img1, + data.memory1, + data.img2, + data.memory2, + data.time, + data.style + ); + } else { + core.doAction(); + } + }); + core.registerEvent("overlist", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.overlist( + data.image, + data.memory, + data.hidetime || 30, + data.list || [ + { + text: "", + sound: "", + time: 50, + textColor: "#FFFFFF", + boldColor: "#000000", + font: "bold 48px Verdana", + frame: 0, + }, + ] + ); + } else { + core.doAction(); + } + }); + core.registerEvent("op", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.openvideo(); + } else { + core.doAction(); + } + }); + core.registerEvent("animationDrawable", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.animationDrawable( + data.allFarme, + data.color, + data.globalAlpha, + data.imageList, + data.soundList + ); + } else { + core.doAction(); + } + }); + core.registerEvent("setanimate", function (data) { + data.px = data.px ?? 0; + data.py = data.py ?? 0; + core.setanimate( + data.name, + data.px, + data.py, + data.width, + data.height, + data.allFarme, + data.imageList, + data.soundList + ); + core.doAction(); + }); + core.registerEvent("clearanimate", function (data) { + core.plugin.playing.clear(); - core.doAction(); - }); - core.registerEvent("deleteanimate", function (data) { - core.deleteanimate(data.name); - core.doAction(); - }); - core.registerEvent("playanimate", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - data.x = data.x ?? 0; - data.y = data.y ?? 0; - data.scalex = data.scalex ?? 1; - data.scaley = data.scaley ?? 1; - core.playanimate( - data.name, - data.x, - data.y, - data.hero, - data.scalex, - data.scaley - ); - core.doAction(); - } else { - core.doAction(); - } - }); - core.registerEvent("cgtextList", function (data) { - core.ui.cgText.textList = core.plugin[data.textList]; - core.doAction(); - }); - core.registerEvent("cgtext", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.ui.cgText.image = data.bg; - core.ui.cgText.memory = data.memory; - core.ui.cgText.head = core.clone(data.head); - core.ui.cgText.index = data.index; - core.ui.cgText.name = core.ui.cgText.textList[data.index][0]; - core.ui.cgText.text = data.text ? - data.text : - core.ui.cgText.textList[data.index][1]; - core.ui.cgText.time = data.time; - core.ui.cgText.wait = data.wait; - core.ui.cgText.WindowSkin = data.WindowSkin; - core.ui.cgText.sound = data.sound || ""; - core.ui.cgText.bodyList = core.clone(data.bodyList); - main.dom.cgText.style.display = "block"; - core.ui.cgText.update(); - } else { - core.doAction(); - } - }); - core.registerEvent("introAndLoop", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.plugin.introAndLoop(data.intro, data.time, data.loop); - core.doAction(); - } else { - core.doAction(); - } - }); - core.registerEvent("setq", function (data) { - core.setFlag("任务地点", data.id); + core.doAction(); + }); + core.registerEvent("deleteanimate", function (data) { + core.deleteanimate(data.name); + core.doAction(); + }); + core.registerEvent("playanimate", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + data.x = data.x ?? 0; + data.y = data.y ?? 0; + data.scalex = data.scalex ?? 1; + data.scaley = data.scaley ?? 1; + core.playanimate( + data.name, + data.x, + data.y, + data.hero, + data.scalex, + data.scaley + ); + core.doAction(); + } else { + core.doAction(); + } + }); + core.registerEvent("cgtextList", function (data) { + core.ui.cgText.textList = core.plugin[data.textList]; + core.doAction(); + }); + core.registerEvent("cgtext", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.ui.cgText.image = data.bg; + core.ui.cgText.memory = data.memory; + core.ui.cgText.head = core.clone(data.head); + core.ui.cgText.index = data.index; + core.ui.cgText.name = core.ui.cgText.textList[data.index][0]; + core.ui.cgText.text = data.text + ? data.text + : core.ui.cgText.textList[data.index][1]; + core.ui.cgText.time = data.time; + core.ui.cgText.wait = data.wait; + core.ui.cgText.WindowSkin = data.WindowSkin; + core.ui.cgText.sound = data.sound || ""; + core.ui.cgText.bodyList = core.clone(data.bodyList); + main.dom.cgText.style.display = "block"; + core.ui.cgText.update(); + } else { + core.doAction(); + } + }); + core.registerEvent("introAndLoop", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.plugin.introAndLoop(data.intro, data.time, data.loop); + core.doAction(); + } else { + core.doAction(); + } + }); + core.registerEvent("setq", function (data) { + core.setFlag("任务地点", data.id); - core.doAction(); - }); + core.doAction(); + }); - core.registerEvent("setmusics", function (data) { - if ( - (core.getLocalStorage("musics") && - core.getLocalStorage("musics").length === 0) || - !core.getLocalStorage("musics") - ) - core.setLocalStorage("musics", ["theme.mp3"]); - let a = core.getLocalStorage("musics"); - if (!data.bgm) { - core.setLocalStorage("musics", ["theme.mp3"]); - } else { - if (!a.includes(data.bgm)) a.push(data.bgm); - core.setLocalStorage("musics", a); - } - core.doAction(); - }); - core.registerEvent("setcgs", function (data) { - if (!data.img) { - core.setLocalStorage("cgs", []); - } else { - let a = core.getLocalStorage("cgs") ?? []; - if (!a.includes(data.img)) a.push(data.img); - core.setLocalStorage("cgs", a); - } - core.doAction(); - }); - }; -}, + core.registerEvent("setmusics", function (data) { + if ( + (core.getLocalStorage("musics") && + core.getLocalStorage("musics").length === 0) || + !core.getLocalStorage("musics") + ) + core.setLocalStorage("musics", ["theme.mp3"]); + let a = core.getLocalStorage("musics"); + if (!data.bgm) { + core.setLocalStorage("musics", ["theme.mp3"]); + } else { + if (!a.includes(data.bgm)) a.push(data.bgm); + core.setLocalStorage("musics", a); + } + core.doAction(); + }); + core.registerEvent("setcgs", function (data) { + if (!data.img) { + core.setLocalStorage("cgs", []); + } else { + let a = core.getLocalStorage("cgs") ?? []; + if (!a.includes(data.img)) a.push(data.img); + core.setLocalStorage("cgs", a); + } + core.doAction(); + }); + }; + }, "drawLight": function () { // 绘制灯光/漆黑层效果。调用方式 core.plugin.drawLight(...) // 【参数说明】 @@ -2845,10 +2847,12 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = const totalWidthScaled = totalWidth * core.domStyle.scale, totalHeightScaled = totalHeight * core.domStyle.scale; - const gameDrawBox = isVertical ? { - left: BORDER_WIDTH / 3, - top: BAR_HEIGHT_VERTICAL / 3 + BORDER_HEIGHT / 3, - } : { left: BAR_WIDTH / 3 + BORDER_WIDTH / 3, top: BORDER_HEIGHT / 3 }; + const gameDrawBox = isVertical ? + { + left: BORDER_WIDTH / 3, + top: BAR_HEIGHT_VERTICAL / 3 + BORDER_HEIGHT / 3, + } : + { left: BAR_WIDTH / 3 + BORDER_WIDTH / 3, top: BORDER_HEIGHT / 3 }; const obj = { clientWidth: clientWidth, @@ -3485,13 +3489,15 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = this._update_infoWindow(); } _update_toolBox() { - const tools = core.isReplaying() ? [ - [core.status.replay.pausing ? "play" : "pause", "stop", "rewind"], - ["speedDown", "speedUp", "save"], - ] : [ - ["keyboard", "shop", "pack", "T332"], - ["settings", "save", "load", "T331"], - ]; + const tools = core.isReplaying() ? + [ + [core.status.replay.pausing ? "play" : "pause", "stop", "rewind"], + ["speedDown", "speedUp", "save"], + ] : + [ + ["keyboard", "shop", "pack", "T332"], + ["settings", "save", "load", "T331"], + ]; if (core.domStyle.isVertical) { core.clearMap( "outerUI", @@ -3731,588 +3737,591 @@ 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窗口皮肤 ↑ - }; - 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(); - }; - -}, + // 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系列函数代替! @@ -8724,8 +8733,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "音频系统": function () { - // 在此增加新插件 - /*首先,在造塔群下载所需的库文件,然后放置在塔目录下的 libs/thirdparty 或其他目录下,之后在 index.html 的最后加上下面这几行: + // 在此增加新插件 + /*首先,在造塔群下载所需的库文件,然后放置在塔目录下的 libs/thirdparty 或其他目录下,之后在 index.html 的最后加上下面这几行: @@ -8733,2327 +8742,2081 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = */ - // 将__enable置为false将关闭插件 - let __enable = true; - if (!__enable || main.mode === "editor") return; - const { OggOpusDecoderWebWorker } = window["ogg-opus-decoder"]; - const { OggVorbisDecoderWebWorker } = window["ogg-vorbis-decoder"]; - const { CodecParser } = window.CodecParser; - const { Transition, linear } = core.plugin.animate; - - const audio = new Audio(); - const AudioStatus = { - Playing: 0, - Pausing: 1, - Paused: 2, - Stoping: 3, - Stoped: 4, - }; - const supportMap = new Map(); - const AudioType = { - Mp3: "audio/mpeg", - Wav: 'audio/wav; codecs="1"', - Flac: "audio/flac", - Opus: 'audio/ogg; codecs="opus"', - Ogg: 'audio/ogg; codecs="vorbis"', - Aac: "audio/aac", - }; - /** - * 检查一种音频类型是否能被播放 - * @param type 音频类型 AudioType - */ - function isAudioSupport(type) { - if (supportMap.has(type)) return supportMap.get(type); - else { - const support = audio.canPlayType(type); - const canPlay = support === "maybe" || support === "probably"; - supportMap.set(type, canPlay); - return canPlay; - } - } - - const typeMap = new Map([ - ["ogg", AudioType.Ogg], - ["mp3", AudioType.Mp3], - ["wav", AudioType.Wav], - ["flac", AudioType.Flac], - ["opus", AudioType.Opus], - ["aac", AudioType.Aac], - ]); - - /** - * 根据文件名拓展猜测其类型 - * @param file 文件名 string - */ - function guessTypeByExt(file) { - const ext = /\.[a-zA-Z\d]+$/.exec(file); - if (!ext?.[0]) return ""; - const type = ext[0].slice(1); - return typeMap.get(type.toLocaleLowerCase()) ?? ""; - } - - isAudioSupport(AudioType.Ogg); - isAudioSupport(AudioType.Mp3); - isAudioSupport(AudioType.Wav); - isAudioSupport(AudioType.Flac); - isAudioSupport(AudioType.Opus); - isAudioSupport(AudioType.Aac); - - function isNil(value) { - return value === void 0 || value === null; - } - - function sleep(time) { - return new Promise((res) => setTimeout(res, time)); - } - class AudioEffect { - constructor(ac) {} - /** - * 连接至其他效果器 - * @param target 目标输入 IAudioInput - * @param output 当前效果器输出通道 Number - * @param input 目标效果器的输入通道 Number - */ - connect(target, output, input) { - this.output.connect(target.input, output, input); - } - - /** - * 与其他效果器取消连接 - * @param target 目标输入 IAudioInput - * @param output 当前效果器输出通道 Number - * @param input 目标效果器的输入通道 Number - */ - disconnect(target, output, input) { - if (!target) { - if (!isNil(output)) { - this.output.disconnect(output); - } else { - this.output.disconnect(); - } - } else { - if (!isNil(output)) { - if (!isNil(input)) { - this.output.disconnect(target.input, output, input); - } else { - this.output.disconnect(target.input, output); - } - } else { - this.output.disconnect(target.input); - } - } - } - } - - class StereoEffect extends AudioEffect { - constructor(ac) { - super(ac); - const panner = ac.createPanner(); - this.input = panner; - this.output = panner; - } - - /** - * 设置音频朝向,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 朝向x坐标 Number - * @param y 朝向y坐标 Number - * @param z 朝向z坐标 Number - */ - setOrientation(x, y, z) { - this.output.orientationX.value = x; - this.output.orientationY.value = y; - this.output.orientationZ.value = z; - } - /** - * 设置音频位置,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 位置x坐标 Number - * @param y 位置y坐标 Number - * @param z 位置z坐标 Number - */ - setPosition(x, y, z) { - this.output.positionX.value = x; - this.output.positionY.value = y; - this.output.positionZ.value = z; - } - end() {} - - start() {} - } - class VolumeEffect extends AudioEffect { - constructor(ac) { - super(ac); - const gain = ac.createGain(); - this.input = gain; - this.output = gain; - } - - /** - * 设置音量大小 - * @param volume 音量大小 Number - */ - setVolume(volume) { - this.output.gain.value = volume; - } - - /** - * 获取音量大小 Number - */ - getVolume() { - return this.output.gain.value; - } - - end() {} - - start() {} - } - class ChannelVolumeEffect extends AudioEffect { - /** 所有的音量控制节点 */ - - constructor(ac) { - super(ac); - /** 所有的音量控制节点 */ - this.gain = []; - const splitter = ac.createChannelSplitter(); - const merger = ac.createChannelMerger(); - this.output = merger; - this.input = splitter; - for (let i = 0; i < 6; i++) { - const gain = ac.createGain(); - splitter.connect(gain, i); - gain.connect(merger, 0, i); - this.gain.push(gain); - } - } - - /** - * 设置某个声道的音量大小 - * @param channel 要设置的声道,可填0-5 Number - * @param volume 这个声道的音量大小 Number - */ - setVolume(channel, volume) { - if (!this.gain[channel]) return; - this.gain[channel].gain.value = volume; - } - - /** - * 获取某个声道的音量大小,可填0-5 - * @param channel 要获取的声道 Number - */ - getVolume(channel) { - if (!this.gain[channel]) return 0; - return this.gain[channel].gain.value; - } - - end() {} - - start() {} - } - class DelayEffect extends AudioEffect { - constructor(ac) { - super(ac); - - const delay = ac.createDelay(); - this.input = delay; - this.output = delay; - } - - /** - * 设置延迟时长 - * @param delay 延迟时长,单位秒 Number - */ - setDelay(delay) { - this.output.delayTime.value = delay; - } - - /** - * 获取延迟时长 - */ - getDelay() { - return this.output.delayTime.value; - } - - end() {} - - start() {} - } - class EchoEffect extends AudioEffect { - constructor(ac) { - super(ac); - /** 当前增益 */ - this.gain = 0.5; - /** 是否正在播放 */ - this.playing = false; - const delay = ac.createDelay(); - const gain = ac.createGain(); - gain.gain.value = 0.5; - delay.delayTime.value = 0.05; - delay.connect(gain); - gain.connect(delay); - /** 延迟节点 */ - this.delay = delay; - /** 反馈增益节点 */ - this.gainNode = gain; - - this.input = gain; - this.output = gain; - } - - /** - * 设置回声反馈增益大小 - * @param gain 增益大小,范围 0-1,大于等于1的视为0.5,小于0的视为0 Number - */ - setFeedbackGain(gain) { - const resolved = gain >= 1 ? 0.5 : gain < 0 ? 0 : gain; - this.gain = resolved; - if (this.playing) this.gainNode.gain.value = resolved; - } - - /** - * 设置回声间隔时长 - * @param delay 回声时长,范围 0.01-Infinity,小于0.01的视为0.01 Number - */ - setEchoDelay(delay) { - const resolved = delay < 0.01 ? 0.01 : delay; - this.delay.delayTime.value = resolved; - } - - /** - * 获取反馈节点增益 - */ - getFeedbackGain() { - return this.gain; - } - - /** - * 获取回声间隔时长 - */ - getEchoDelay() { - return this.delay.delayTime.value; - } - - end() { - this.playing = false; - const echoTime = Math.ceil(Math.log(0.001) / Math.log(this.gain)) + 10; - sleep(this.delay.delayTime.value * echoTime).then(() => { - if (!this.playing) this.gainNode.gain.value = 0; - }); - } - - start() { - this.playing = true; - this.gainNode.gain.value = this.gain; - } - } - - class StreamLoader { - constructor(url) { - /** 传输目标 Set*/ - this.target = new Set(); - this.loading = false; - } - - /** - * 将加载流传递给字节流读取对象 - * @param reader 字节流读取对象 IStreamReader - */ - pipe(reader) { - if (this.loading) { - console.warn( - "Cannot pipe new StreamReader object when stream is loading." - ); - return; - } - this.target.add(reader); - reader.piped(this); - return this; - } - - async start() { - if (this.loading) return; - this.loading = true; - const response = await window.fetch(this.url); - const stream = response.body; - if (!stream) { - console.error("Cannot get reader when fetching '" + this.url + "'."); - return; - } - // 获取读取器 - this.stream = stream; - const reader = response.body?.getReader(); - const targets = [...this.target]; - - await Promise.all(targets.map((v) => v.start(stream, this, response))); - if (reader && reader.read) { - // 开始流传输 - while (true) { - const { value, done } = await reader.read(); - await Promise.all( - targets.map((v) => v.pump(value, done, response)) - ); - if (done) break; - } - } else { - // 如果不支持流传输 - const buffer = await response.arrayBuffer(); - const data = new Uint8Array(buffer); - await Promise.all(targets.map((v) => v.pump(data, true, response))); - } - - this.loading = false; - targets.forEach((v) => v.end(true)); - - // - } - - cancel(reason) { - if (!this.stream) return; - this.stream.cancel(reason); - this.loading = false; - this.target.forEach((v) => v.end(false, reason)); - } - } - const fileSignatures = [ - [AudioType.Mp3, [0x49, 0x44, 0x33]], - [AudioType.Ogg, [0x4f, 0x67, 0x67, 0x53]], - [AudioType.Wav, [0x52, 0x49, 0x46, 0x46]], - [AudioType.Flac, [0x66, 0x4c, 0x61, 0x43]], - [AudioType.Aac, [0xff, 0xf1]], - [AudioType.Aac, [0xff, 0xf9]], - ]; - const oggHeaders = [ - [AudioType.Opus, [0x4f, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64]], - ]; - - function checkAudioType(data) { - let audioType = ""; - // 检查头文件获取音频类型,仅检查前256个字节 - const toCheck = data.slice(0, 256); - for (const [type, value] of fileSignatures) { - if (value.every((v, i) => toCheck[i] === v)) { - audioType = type; - break; - } - } - if (audioType === AudioType.Ogg) { - // 如果是ogg的话,进一步判断是不是opus - for (const [key, value] of oggHeaders) { - const has = toCheck.some((_, i) => { - return value.every((v, ii) => toCheck[i + ii] === v); - }); - if (has) { - audioType = key; - break; - } - } - } - - return audioType; - } - class AudioDecoder { - /** - * 注册一个解码器 - * @param type 要注册的解码器允许解码的类型 - * @param decoder 解码器对象 - */ - static registerDecoder(type, decoder) { - if (!this.decoderMap) this.decoderMap = new Map(); - if (this.decoderMap.has(type)) { - console.warn( - "Audio stream decoder for audio type '" + - type + - "' has already existed." - ); - return; - } - - this.decoderMap.set(type, decoder); - } - - /** - * 解码音频数据 - * @param data 音频文件数据 - * @param player AudioPlayer实例 - */ - static async decodeAudioData(data, player) { - // 检查头文件获取音频类型,仅检查前256个字节 - const toCheck = data.slice(0, 256); - const type = checkAudioType(data); - if (type === "") { - console.error( - "Unknown audio type. Header: '" + [...toCheck] - .map((v) => v.toString().padStart(2, "0")) - .join(" ") - .toUpperCase() + - "'" - ); - return null; - } - if (isAudioSupport(type)) { - if (data.buffer instanceof ArrayBuffer) { - return player.ac.decodeAudioData(data.buffer); - } else { - return null; - } - } else { - const Decoder = this.decoderMap.get(type); - if (!Decoder) { - return null; - } else { - const decoder = new Decoder(); - await decoder.create(); - const decodedData = await decoder.decode(data); - if (!decodedData) return null; - const buffer = player.ac.createBuffer( - decodedData.channelData.length, - decodedData.channelData[0].length, - decodedData.sampleRate - ); - decodedData.channelData.forEach((v, i) => { - buffer.copyToChannel(v, i); - }); - decoder.destroy(); - return buffer; - } - } - } - } - - class VorbisDecoder { - /** - * 创建音频解码器 - */ - async create() { - this.decoder = new OggVorbisDecoderWebWorker(); - await this.decoder.ready; - } - /** - * 摧毁这个解码器 - */ - destroy() { - this.decoder?.free(); - } - /** - * 解码流数据 - * @param data 流数据 - */ - - async decode(data) { - return this.decoder?.decode(data); - } - /** - * 解码整个文件 - * @param data 文件数据 - */ - async decodeAll(data) { - return this.decoder?.decodeFile(data); - } - /** - * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 - */ - async flush() { - return this.decoder?.flush(); - } - } - - class OpusDecoder { - /** - * 创建音频解码器 - */ - async create() { - this.decoder = new OggOpusDecoderWebWorker(); - await this.decoder.ready; - } - /** - * 摧毁这个解码器 - */ - destroy() { - this.decoder?.free(); - } - /** - * 解码流数据 - * @param data 流数据 - */ - async decode(data) { - return this.decoder?.decode(data); - } - /** - * 解码整个文件 - * @param data 文件数据 - */ - async decodeAll(data) { - return this.decoder?.decodeFile(data); - } - /** - * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 - */ - async flush() { - return await this.decoder?.flush(); - } - } - const mimeTypeMap = { - [AudioType.Aac]: "audio/aac", - [AudioType.Flac]: "audio/flac", - [AudioType.Mp3]: "audio/mpeg", - [AudioType.Ogg]: "application/ogg", - [AudioType.Opus]: "application/ogg", - [AudioType.Wav]: "application/ogg", - }; - - function isOggPage(data) { - return !isNil(data.isFirstPage); - } - class AudioStreamSource { - - constructor(context) { - this.output = context.createBufferSource(); - /** 是否已经完全加载完毕 */ - this.loaded = false; - /** 是否正在播放 */ - this.playing = false; - /** 已经缓冲了多长时间,如果缓冲完那么跟歌曲时长一致 */ - this.buffered = 0; - /** 已经缓冲的采样点数量 */ - this.bufferedSamples = 0; - /** 歌曲时长,加载完毕之前保持为 0 */ - this.duration = 0; - /** 在流传输阶段,至少缓冲多长时间的音频之后才开始播放,单位秒 */ - this.bufferPlayDuration = 1; - /** 音频的采样率,未成功解析出之前保持为 0 */ - this.sampleRate = 0; - //是否循环播放 - this.loop = false; - /** 上一次播放是从何时开始的 */ - this.lastStartWhen = 0; - /** 开始播放时刻 */ - this.lastStartTime = 0; - /** 上一次播放的缓存长度 */ - this.lastBufferSamples = 0; - - /** 是否已经获取到头文件 */ - this.headerRecieved = false; - /** 音频类型 */ - this.audioType = ""; - /** 每多长时间组成一个缓存 Float32Array */ - this.bufferChunkSize = 10; - /** 缓存音频数据,每 bufferChunkSize 秒钟组成一个 Float32Array,用于流式解码 */ - this.audioData = []; - - this.errored = false; - this.ac = context; - } - /** 当前已经播放了多长时间 */ - get currentTime() { - return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; - } - /** - * 设置每个缓存数据的大小,默认为10秒钟一个缓存数据 - * @param size 每个缓存数据的时长,单位秒 - */ - setChunkSize(size) { - if (this.controller?.loading || this.loaded) return; - this.bufferChunkSize = size; - } - - piped(controller) { - this.controller = controller; - } - - async pump(data, done) { - if (!data || this.errored) return; - if (!this.headerRecieved) { - // 检查头文件获取音频类型,仅检查前256个字节 - const toCheck = data.slice(0, 256); - this.audioType = checkAudioType(data); - if (!this.audioType) { - console.error( - "Unknown audio type. Header: '" + [...toCheck] - .map((v) => v.toString(16).padStart(2, "0")) - .join(" ") - .toUpperCase() + - "'" - ); - return; - } - // 创建解码器 - const Decoder = AudioDecoder.decoderMap.get(this.audioType); - if (!Decoder) { - this.errored = true; - console.error( - "Cannot decode stream source type of '" + - this.audioType + - "', since there is no registered decoder for that type." - ); - return Promise.reject( - `Cannot decode stream source type of '${this.audioType}', since there is no registered decoder for that type.` - ); - } - this.decoder = new Decoder(); - // 创建数据解析器 - const mime = mimeTypeMap[this.audioType]; - const parser = new CodecParser(mime); - this.parser = parser; - await this.decoder.create(); - this.headerRecieved = true; - } - - const decoder = this.decoder; - const parser = this.parser; - if (!decoder || !parser) { - this.errored = true; - return Promise.reject( - "No parser or decoder attached in this AudioStreamSource" - ); - } - - await this.decodeData(data, decoder, parser); - if (done) await this.decodeFlushData(decoder, parser); - this.checkBufferedPlay(); - } - - /** - * 检查采样率,如果还未解析出采样率,那么将设置采样率,如果当前采样率与之前不同,那么发出警告 - */ - checkSampleRate(info) { - for (const one of info) { - const frame = isOggPage(one) ? one.codecFrames[0] : one; - if (frame) { - const rate = frame.header.sampleRate; - if (this.sampleRate === 0) { - this.sampleRate = rate; - break; - } else { - if (rate !== this.sampleRate) { - console.warn("Sample rate in stream audio must be constant."); - } - } - } - } - } - - /** - * 解析音频数据 - */ - async decodeData(data, decoder, parser) { - // 解析音频数据 - const audioData = await decoder.decode(data); - if (!audioData) return; - // @ts-expect-error 库类型声明错误 - const audioInfo = [...parser.parseChunk(data)]; - - // 检查采样率 - this.checkSampleRate(audioInfo); - // 追加音频数据 - this.appendDecodedData(audioData, audioInfo); - } - - /** - * 解码剩余数据 - */ - async decodeFlushData(decoder, parser) { - const audioData = await decoder.flush(); - if (!audioData) return; - // @ts-expect-error 库类型声明错误 - const audioInfo = [...parser.flush()]; - - this.checkSampleRate(audioInfo); - this.appendDecodedData(audioData, audioInfo); - } - - /** - * 追加音频数据 - */ - appendDecodedData(data, info) { - const channels = data.channelData.length; - if (channels === 0) return; - if (this.audioData.length !== channels) { - this.audioData = []; - for (let i = 0; i < channels; i++) { - this.audioData.push([]); - } - } - // 计算出应该放在哪 - const chunk = this.sampleRate * this.bufferChunkSize; - const sampled = this.bufferedSamples; - const pushIndex = Math.floor(sampled / chunk); - const bufferIndex = sampled % chunk; - const dataLength = data.channelData[0].length; - let buffered = 0; - let nowIndex = pushIndex; - let toBuffer = bufferIndex; - while (buffered < dataLength) { - const rest = toBuffer !== 0 ? chunk - bufferIndex : chunk; - - for (let i = 0; i < channels; i++) { - const audioData = this.audioData[i]; - if (!audioData[nowIndex]) { - audioData.push(new Float32Array(chunk)); - } - const toPush = data.channelData[i].slice(buffered, buffered + rest); - - audioData[nowIndex].set(toPush, toBuffer); - } - buffered += rest; - nowIndex++; - toBuffer = 0; - } - - this.buffered += - info.reduce((prev, curr) => prev + curr.duration, 0) / 1000; - this.bufferedSamples += info.reduce( - (prev, curr) => prev + curr.samples, - 0 - ); - } - - /** - * 检查已缓冲内容,并在未开始播放时播放 - */ - checkBufferedPlay() { - if (this.playing || this.sampleRate === 0) return; - const played = this.lastBufferSamples / this.sampleRate; - const dt = this.buffered - played; - if (this.loaded) { - this.playAudio(played); - return; - } - if (dt < this.bufferPlayDuration) return; - - this.lastBufferSamples = this.bufferedSamples; - // 需要播放 - this.mergeBuffers(); - if (!this.buffer) return; - if (this.playing) this.output.stop(); - this.createSourceNode(this.buffer); - this.output.loop = false; - this.output.start(0, played); - this.lastStartTime = this.ac.currentTime; - this.playing = true; - this.output.addEventListener("ended", () => { - this.playing = false; - this.checkBufferedPlay(); - }); - } - - mergeBuffers() { - const buffer = this.ac.createBuffer( - this.audioData.length, - this.bufferedSamples, - this.sampleRate - ); - const chunk = this.sampleRate * this.bufferChunkSize; - const bufferedChunks = Math.floor(this.bufferedSamples / chunk); - const restLength = this.bufferedSamples % chunk; - for (let i = 0; i < this.audioData.length; i++) { - const audio = this.audioData[i]; - const data = new Float32Array(this.bufferedSamples); - for (let j = 0; j < bufferedChunks; j++) { - data.set(audio[j], chunk * j); - } - if (restLength !== 0) { - data.set( - audio[bufferedChunks].slice(0, restLength), - chunk * bufferedChunks - ); - } - - buffer.copyToChannel(data, i, 0); - } - this.buffer = buffer; - } - - async start() { - delete this.buffer; - this.headerRecieved = false; - this.audioType = ""; - this.errored = false; - this.buffered = 0; - this.sampleRate = 0; - this.bufferedSamples = 0; - this.duration = 0; - this.loaded = false; - if (this.playing) this.output.stop(); - this.playing = false; - this.lastStartTime = this.ac.currentTime; - } - - end(done, reason) { - if (done && this.buffer) { - this.loaded = true; - delete this.controller; - this.mergeBuffers(); - - this.duration = this.buffered; - this.audioData = []; - this.decoder?.destroy(); - delete this.decoder; - delete this.parser; - } else { - console.warn( - "Unexpected end when loading stream audio, reason: '" + - (reason ?? "") + - "'" - ); - } - } - - playAudio(when) { - if (!this.buffer) return; - this.lastStartTime = this.ac.currentTime; - if (this.playing) this.output.stop(); - if (this.route.status !== AudioStatus.Playing) { - this.route.status = AudioStatus.Playing; - } - this.createSourceNode(this.buffer); - this.output.start(0, when); - this.playing = true; - - this.output.addEventListener("ended", () => { - this.playing = false; - if (this.route.status === AudioStatus.Playing) { - this.route.status = AudioStatus.Stoped; - } - if (this.loop && !this.output.loop) this.play(0); - }); - } - /** - * 开始播放这个音频源 - */ - play(when) { - if (this.playing || this.errored) return; - if (this.loaded && this.buffer) { - this.playing = true; - this.playAudio(when); - } else { - this.controller?.start(); - } - } - - createSourceNode(buffer) { - if (!this.target) return; - const node = this.ac.createBufferSource(); - node.buffer = buffer; - if (this.playing) this.output.stop(); - this.playing = false; - this.output = node; - node.connect(this.target.input); - node.loop = this.loop; - } - /** - * 停止播放这个音频源 - * @returns 音频暂停的时刻 number - */ - stop() { - if (this.playing) this.output.stop(); - this.playing = false; - return this.ac.currentTime - this.lastStartTime; - } - /** - * 连接到音频路由图上,每次调用播放的时候都会执行一次 - * @param target 连接至的目标 IAudioInput - */ - connect(target) { - this.target = target; - } - /** - * 设置是否循环播放 - * @param loop 是否循环 boolean) - */ - setLoop(loop) { - this.loop = loop; - } - } - class AudioElementSource { - - constructor(context) { - const audio = new Audio(); - audio.preload = "none"; - this.output = context.createMediaElementSource(audio); - this.audio = audio; - this.ac = context; - audio.addEventListener("play", () => { - this.playing = true; - if (this.route.status !== AudioStatus.Playing) { - this.route.status = AudioStatus.Playing; - } - }); - audio.addEventListener("ended", () => { - this.playing = false; - if (this.route.status === AudioStatus.Playing) { - this.route.status = AudioStatus.Stoped; - } - }); - } - get duration() { - return this.audio.duration; - } - get currentTime() { - return this.audio.currentTime; - } - /** - * 设置音频源的路径 - * @param url 音频路径 - */ - setSource(url) { - this.audio.src = url; - } - - play(when = 0) { - if (this.playing) return; - this.audio.currentTime = when; - this.audio.play(); - } - - stop() { - this.audio.pause(); - this.playing = false; - if (this.route.status === AudioStatus.Playing) { - this.route.status = AudioStatus.Stoped; - } - return this.audio.currentTime; - } - - connect(target) { - this.output.connect(target.input); - } - - setLoop(loop) { - this.audio.loop = loop; - } - } - class AudioBufferSource { - - constructor(context) { - this.output = context.createBufferSource(); - /** 是否循环 */ - this.loop = false; - /** 上一次播放是从何时开始的 */ - this.lastStartWhen = 0; - /** 播放开始时刻 */ - this.lastStartTime = 0; - this.duration = 0; - this.ac = context; - } - get currentTime() { - return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; - } - - /** - * 设置音频源数据 - * @param buffer 音频源,可以是未解析的 ArrayBuffer,也可以是已解析的 AudioBuffer - */ - async setBuffer(buffer) { - if (buffer instanceof ArrayBuffer) { - this.buffer = await this.ac.decodeAudioData(buffer); - } else { - this.buffer = buffer; - } - this.duration = this.buffer.duration; - } - - play(when) { - if (this.playing || !this.buffer) return; - this.playing = true; - this.lastStartTime = this.ac.currentTime; - if (this.route.status !== AudioStatus.Playing) { - this.route.status = AudioStatus.Playing; - } - this.createSourceNode(this.buffer); - this.output.start(0, when); - this.output.addEventListener("ended", () => { - this.playing = false; - if (this.route.status === AudioStatus.Playing) { - this.route.status = AudioStatus.Stoped; - } - if (this.loop && !this.output.loop) this.play(0); - }); - } - - createSourceNode(buffer) { - if (!this.target) return; - const node = this.ac.createBufferSource(); - node.buffer = buffer; - this.output = node; - node.connect(this.target.input); - node.loop = this.loop; - } - - stop() { - this.output.stop(); - return this.ac.currentTime - this.lastStartTime; - } - - connect(target) { - this.target = target; - } - - setLoop(loop) { - this.loop = loop; - } - } - class AudioPlayer { - constructor() { - /** 音频播放上下文 */ - this.ac = new AudioContext(); - /** 音量节点 */ - this.gain = this.ac.createGain(); - this.gain.connect(this.ac.destination); - this.audioRoutes = new Map(); - } - /** - * 解码音频数据 - * @param data 音频数据 - */ - decodeAudioData(data) { - return AudioDecoder.decodeAudioData(data, this); - } - /** - * 设置音量 - * @param volume 音量 - */ - setVolume(volume) { - this.gain.gain.value = volume; - } - - /** - * 获取音量 - */ - getVolume() { - return this.gain.gain.value; - } - - /** - * 创建一个音频源 - * @param Source 音频源类 - */ - createSource(Source) { - return new Source(this.ac); - } - - /** - * 创建一个兼容流式音频源,可以与流式加载相结合,主要用于处理 opus ogg 不兼容的情况 - */ - createStreamSource() { - return new AudioStreamSource(this.ac); - } - - /** - * 创建一个通过 audio 元素播放的音频源 - */ - createElementSource() { - return new AudioElementSource(this.ac); - } - - /** - * 创建一个通过 AudioBuffer 播放的音频源 - */ - createBufferSource() { - return new AudioBufferSource(this.ac); - } - - /** - * 获取音频目的地 - */ - getDestination() { - return this.gain; - } - - /** - * 创建一个音频效果器 - * @param Effect 效果器类 - */ - createEffect(Effect) { - return new Effect(this.ac); - } - - /** - * 创建一个修改音量的效果器 - * ```txt - * |----------| - * Input ----> | GainNode | ----> Output - * |----------| - * ``` - */ - createVolumeEffect() { - return new VolumeEffect(this.ac); - } - - /** - * 创建一个立体声效果器 - * ```txt - * |------------| - * Input ----> | PannerNode | ----> Output - * |------------| - * ``` - */ - createStereoEffect() { - return new StereoEffect(this.ac); - } - - /** - * 创建一个修改单个声道音量的效果器 - * ```txt - * |----------| - * -> | GainNode | \ - * |--------------| / |----------| -> |------------| - * Input ----> | SplitterNode | ...... | MergerNode | ----> Output - * |--------------| \ |----------| -> |------------| - * -> | GainNode | / - * |----------| - * ``` - */ - createChannelVolumeEffect() { - return new ChannelVolumeEffect(this.ac); - } - - /** - * 创建一个延迟效果器 - * |-----------| - * Input ----> | DelayNode | ----> Output - * |-----------| - */ - createDelay() { - return new DelayEffect(this.ac); - } - - /** - * 创建一个回声效果器 - * ```txt - * |----------| - * Input ----> | GainNode | ----> Output - * ^ |----------| | - * | | - * | |------------| ↓ - * |-- | Delay Node | <-- - * |------------| - * ``` - */ - createEchoEffect() { - return new EchoEffect(this.ac); - } - - /** - * 创建一个音频播放路由 - * @param source 音频源 - */ - createRoute(source) { - return new AudioRoute(source, this); - } - - /** - * 添加一个音频播放路由,可以直接被播放 - * @param id 这个音频播放路由的名称 - * @param route 音频播放路由对象 - */ - addRoute(id, route) { - if (!this.audioRoutes) this.audioRoutes = new Map(); - if (this.audioRoutes.has(id)) { - console.warn( - "Audio route with id of '" + - id + - "' has already existed. New route will override old route." - ); - } - this.audioRoutes.set(id, route); - } - - /** - * 根据名称获取音频播放路由对象 - * @param id 音频播放路由的名称 - */ - getRoute(id) { - return this.audioRoutes.get(id); - } - /** - * 移除一个音频播放路由 - * @param id 要移除的播放路由的名称 - */ - removeRoute(id) { - this.audioRoutes.delete(id); - } - /** - * 播放音频 - * @param id 音频名称 - * @param when 从音频的哪个位置开始播放,单位秒 - */ - play(id, when) { - const route = this.getRoute(id); - if (!route) { - console.warn( - "Cannot play audio route '" + - id + - "', since there is not added route named it." - ); - return; - } - - route.play(when); - } - - /** - * 暂停音频播放 - * @param id 音频名称 - * @returns 当音乐真正停止时兑现 - */ - pause(id) { - const route = this.getRoute(id); - if (!route) { - console.warn( - "Cannot pause audio route '" + - id + - "', since there is not added route named it." - ); - return; - } - return route.pause(); - } - - /** - * 停止音频播放 - * @param id 音频名称 - * @returns 当音乐真正停止时兑现 - */ - stop(id) { - const route = this.getRoute(id); - if (!route) { - console.warn( - "Cannot stop audio route '" + - id + - "', since there is not added route named it." - ); - return; - } - return route.stop(); - } - - /** - * 继续音频播放 - * @param id 音频名称 - */ - resume(id) { - const route = this.getRoute(id); - if (!route) { - console.warn( - "Cannot pause audio route '" + - id + - "', since there is not added route named it." - ); - return; - } - route.resume(); - } - - /** - * 设置听者位置,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 位置x坐标 - * @param y 位置y坐标 - * @param z 位置z坐标 - */ - setListenerPosition(x, y, z) { - const listener = this.ac.listener; - listener.positionX.value = x; - listener.positionY.value = y; - listener.positionZ.value = z; - } - - /** - * 设置听者朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 朝向x坐标 - * @param y 朝向y坐标 - * @param z 朝向z坐标 - */ - setListenerOrientation(x, y, z) { - const listener = this.ac.listener; - listener.forwardX.value = x; - listener.forwardY.value = y; - listener.forwardZ.value = z; - } - - /** - * 设置听者头顶朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 头顶朝向x坐标 - * @param y 头顶朝向y坐标 - * @param z 头顶朝向z坐标 - */ - setListenerUp(x, y, z) { - const listener = this.ac.listener; - listener.upX.value = x; - listener.upY.value = y; - listener.upZ.value = z; - } - } - class AudioRoute { - constructor(source, player) { - source.route = this; - this.output = source.output; - - /** 效果器路由图 */ - this.effectRoute = []; - - /** 结束时长,当音频暂停或停止时,会经过这么长时间之后才真正终止播放,期间可以做音频淡入淡出等效果 */ - this.endTime = 0; - /** 暂停时播放了多长时间 */ - this.pauseCurrentTime = 0; - /** 当前播放状态 */ - this.player = player; - this.status = AudioStatus.Stoped; - - this.shouldStop = false; - /** - * 每次暂停或停止时自增,用于判断当前正在处理的情况。 - * 假如暂停后很快播放,然后很快暂停,那么需要根据这个来判断实际是否应该执行暂停后操作 - */ - this.stopIdentifier = 0; - /** 暂停时刻 */ - this.pauseTime = 0; - this.source = source; - this.source.player = player; - } - /** 音频时长,单位秒 */ - get duration() { - return this.source.duration; - } - /** 当前播放了多长时间,单位秒 */ - get currentTime() { - if (this.status === AudioStatus.Paused) { - return this.pauseCurrentTime; - } else { - return this.source.currentTime; - } - } - set currentTime(time) { - this.source.stop(); - this.source.play(time); - } - /** - * 设置结束时间,暂停或停止时,会经过这么长时间才终止音频的播放,这期间可以做一下音频淡出的效果。 - * @param time 暂停或停止时,经过多长时间之后才会结束音频的播放 - */ - setEndTime(time) { - this.endTime = time; - } - - /** - * 当音频播放时执行的函数,可以用于音频淡入效果 - * @param fn 音频开始播放时执行的函数 - */ - onStart(fn) { - this.audioStartHook = fn; - } - - /** - * 当音频暂停或停止时执行的函数,可以用于音频淡出效果 - * @param fn 音频在暂停或停止时执行的函数,不填时表示取消这个钩子。 - * 包含两个参数,第一个参数是结束时长,第二个参数是当前音频播放路由对象 - */ - onEnd(fn) { - this.audioEndHook = fn; - } - - /** - * 开始播放这个音频 - * @param when 从音频的什么时候开始播放,单位秒 - */ - async play(when = 0) { - if (this.status === AudioStatus.Playing) return; - this.link(); - await this.player.ac.resume(); - if (this.effectRoute.length > 0) { - const first = this.effectRoute[0]; - this.source.connect(first); - const last = this.effectRoute.at(-1); - last.connect({ input: this.player.getDestination() }); - } else { - this.source.connect({ input: this.player.getDestination() }); - } - this.source.play(when); - this.status = AudioStatus.Playing; - this.pauseTime = 0; - this.audioStartHook?.(this); - this.startAllEffect(); - if (this.status !== AudioStatus.Playing) { - this.status = AudioStatus.Playing; - } - } - - /** - * 暂停音频播放 - */ - async pause() { - if (this.status !== AudioStatus.Playing) return; - this.status = AudioStatus.Pausing; - this.stopIdentifier++; - const identifier = this.stopIdentifier; - if (this.audioEndHook) { - this.audioEndHook(this.endTime, this); - await sleep(this.endTime); - } - if ( - this.status !== AudioStatus.Pausing || - this.stopIdentifier !== identifier - ) { - return; - } - this.pauseCurrentTime = this.source.currentTime; - const time = this.source.stop(); - this.pauseTime = time; - if (this.shouldStop) { - this.status = AudioStatus.Stoped; - this.endAllEffect(); - - this.shouldStop = false; - } else { - this.status = AudioStatus.Paused; - this.endAllEffect(); - } - this.endAllEffect(); - } - - /** - * 继续音频播放 - */ - resume() { - if (this.status === AudioStatus.Playing) return; - if ( - this.status === AudioStatus.Pausing || - this.status === AudioStatus.Stoping - ) { - this.audioStartHook?.(this); - - return; - } - if (this.status === AudioStatus.Paused) { - this.play(this.pauseTime); - } else { - this.play(0); - } - this.status = AudioStatus.Playing; - this.pauseTime = 0; - this.audioStartHook?.(this); - this.startAllEffect(); - } - - /** - * 停止音频播放 - */ - async stop() { - if (this.status !== AudioStatus.Playing) { - if (this.status === AudioStatus.Pausing) { - this.shouldStop = true; - } - return; - } - this.status = AudioStatus.Stoping; - this.stopIdentifier++; - const identifier = this.stopIdentifier; - if (this.audioEndHook) { - this.audioEndHook(this.endTime, this); - await sleep(this.endTime); - } - if ( - this.status !== AudioStatus.Stoping || - this.stopIdentifier !== identifier - ) { - return; - } - this.source.stop(); - this.status = AudioStatus.Stoped; - this.pauseTime = 0; - this.endAllEffect(); - } - - /** - * 添加效果器 - * @param effect 要添加的效果,可以是数组,表示一次添加多个 - * @param index 从哪个位置开始添加,如果大于数组长度,那么加到末尾,如果小于0,那么将会从后面往前数。默认添加到末尾 - */ - addEffect(effect, index) { - if (isNil(index)) { - if (effect instanceof Array) { - this.effectRoute.push(...effect); - } else { - this.effectRoute.push(effect); - } - } else { - if (effect instanceof Array) { - this.effectRoute.splice(index, 0, ...effect); - } else { - this.effectRoute.splice(index, 0, effect); - } - } - this.setOutput(); - if (this.source.playing) this.link(); - } - - /** - * 移除一个效果器 - * @param effect 要移除的效果 - */ - removeEffect(effect) { - const index = this.effectRoute.indexOf(effect); - if (index === -1) return; - this.effectRoute.splice(index, 1); - effect.disconnect(); - this.setOutput(); - if (this.source.playing) this.link(); - } - - setOutput() { - const effect = this.effectRoute.at(-1); - if (!effect) this.output = this.source.output; - else this.output = effect.output; - } - - /** - * 连接音频路由图 - */ - link() { - this.effectRoute.forEach((v) => v.disconnect()); - this.effectRoute.forEach((v, i) => { - const next = this.effectRoute[i + 1]; - if (next) { - v.connect(next); - } - }); - } - - startAllEffect() { - this.effectRoute.forEach((v) => v.start()); - } - - endAllEffect() { - this.effectRoute.forEach((v) => v.end()); - } - } - - const audioPlayer = new AudioPlayer(); - - class BgmController { - constructor(player) { - this.mainGain = player.createVolumeEffect(); - this.player = player; - /** bgm音频名称的前缀 */ - this.prefix = "bgms."; - /** 每个 bgm 的音量控制器 */ - this.gain = new Map(); - - /** 正在播放的 bgm */ - this.playingBgm = ""; - /** 是否正在播放 */ - this.playing = false; - - /** 是否已经启用 */ - this.enabled = true; - /** 是否屏蔽所有的音乐切换 */ - this.blocking = false; - /** 渐变时长 */ - this.transitionTime = 2000; - } - - /** - * 设置音频渐变时长 - * @param time 渐变时长 - */ - setTransitionTime(time) { - this.transitionTime = time; - for (const [, value] of this.gain) { - value.transition.time(time); - } - } - - /** - * 屏蔽音乐切换 - */ - blockChange() { - this.blocking = true; - } - - /** - * 取消屏蔽音乐切换 - */ - unblockChange() { - this.blocking = false; - } - - /** - * 设置总音量大小 - * @param volume 音量大小 - */ - setVolume(volume) { - this.mainGain.setVolume(volume); - this._volume = volume; - } - /** - * 获取总音量大小 - */ - getVolume() { - return this.mainGain.getVolume(); - } - /** - * 设置是否启用 - * @param enabled 是否启用 - */ - setEnabled(enabled) { - if (enabled) this.resume(); - else this.stop(); - this.enabled = enabled; - } - - /** - * 设置 bgm 音频名称的前缀 - */ - setPrefix(prefix) { - this.prefix = prefix; - } - - getId(name) { - return `${this.prefix}${name}`; - } - - /** - * 根据 bgm 名称获取其 AudioRoute 实例 - * @param id 音频名称 - */ - get(id) { - return this.player.getRoute(this.getId(id)); - } - - /** - * 添加一个 bgm - * @param id 要添加的 bgm 的名称 - * @param url 指定 bgm 的加载地址 - */ - addBgm(id, url = `project/bgms/${id}`) { - const type = guessTypeByExt(id); - if (!type) { - console.warn( - "Unknown audio extension name: '" + - id.split(".").slice(0, -1).join(".") + - "'" - ); - return; - } - const gain = this.player.createVolumeEffect(); - if (isAudioSupport(type)) { - const source = audioPlayer.createElementSource(); - source.setSource(url); - source.setLoop(true); - const route = new AudioRoute(source, audioPlayer); - route.addEffect([gain, this.mainGain]); - audioPlayer.addRoute(this.getId(id), route); - this.setTransition(id, route, gain); - } else { - const source = audioPlayer.createStreamSource(); - const stream = new StreamLoader(url); - stream.pipe(source); - source.setLoop(true); - const route = new AudioRoute(source, audioPlayer); - route.addEffect([gain, this.mainGain]); - audioPlayer.addRoute(this.getId(id), route); - this.setTransition(id, route, gain); - } - } - - /** - * 移除一个 bgm - * @param id 要移除的 bgm 的名称 - */ - removeBgm(id) { - this.player.removeRoute(this.getId(id)); - const gain = this.gain.get(id); - gain?.transition.ticker.destroy(); - this.gain.delete(id); - } - - setTransition(id, route, gain) { - const transition = new Transition(); - transition - .time(this.transitionTime) - .mode(linear()) - .transition("volume", 0); - - const tick = () => { - gain.setVolume(transition.value.volume); - }; - - /** - * @param expect 在结束时应该是正在播放还是停止 - */ - const setTick = async (expect) => { - transition.ticker.remove(tick); - transition.ticker.add(tick); - const identifier = route.stopIdentifier; - await sleep(this.transitionTime + 500); - if (route.status === expect && identifier === route.stopIdentifier) { - transition.ticker.remove(tick); - if (route.status === AudioStatus.Playing) { - gain.setVolume(1); - } else { - gain.setVolume(0); - } - } - }; - - route.onStart(async () => { - transition.transition("volume", 1); - setTick(AudioStatus.Playing); - }); - route.onEnd(() => { - transition.transition("volume", 0); - setTick(AudioStatus.Paused); - }); - route.setEndTime(this.transitionTime); - - this.gain.set(id, { effect: gain, transition }); - } - - /** - * 播放一个 bgm - * @param id 要播放的 bgm 名称 - */ - play(id, when) { - if (this.blocking) return; - if (id !== this.playingBgm && this.playingBgm) { - this.player.pause(this.getId(this.playingBgm)); - } - this.playingBgm = id; - if (!this.enabled) return; - this.player.play(this.getId(id), when); - this.playing = true; - } - - /** - * 继续当前的 bgm - */ - resume() { - if (this.blocking || !this.enabled || this.playing) return; - if (this.playingBgm) { - this.player.resume(this.getId(this.playingBgm)); - } - this.playing = true; - } - - /** - * 暂停当前的 bgm - */ - pause() { - if (this.blocking || !this.enabled) return; - if (this.playingBgm) { - this.player.pause(this.getId(this.playingBgm)); - } - this.playing = false; - } - - /** - * 停止当前的 bgm - */ - stop() { - if (this.blocking || !this.enabled) return; - if (this.playingBgm) { - this.player.stop(this.getId(this.playingBgm)); - } - this.playing = false; - } - } - const bgmController = new BgmController(audioPlayer); - - class SoundPlayer { - constructor(player) { - /** 每个音效的唯一标识符 */ - this.num = 0; - this.enabled = true; - this.gain = player.createVolumeEffect(); - /** 每个音效的数据 */ - this.buffer = new Map(); - /** 所有正在播放的音乐 */ - this.playing = new Set(); - this.player = player; - } - /** - * 设置是否启用音效 - * @param enabled 是否启用音效 - */ - setEnabled(enabled) { - if (!enabled) this.stopAllSounds(); - this.enabled = enabled; - } - - /** - * 设置音量大小 - * @param volume 音量大小 - */ - setVolume(volume) { - this.gain.setVolume(volume); - } - /** - * 获取音量大小 - */ - getVolume() { - return this.gain.getVolume(); - } - /** - * 添加一个音效 - * @param id 音效名称 - * @param data 音效的Uint8Array数据 - */ - async add(id, data) { - const buffer = await this.player.decodeAudioData(data); - if (!buffer) { - console.warn( - "Cannot decode sound '" + - id + - "', since audio file may not supported by 2.b." - ); - return; - } - this.buffer.set(id, buffer); - } - - /** - * 播放一个音效 - * @param id 音效名称 - * @param position 音频位置,[0, 0, 0]表示正中心,x轴指向水平向右,y轴指向水平向上,z轴指向竖直向上 - * @param orientation 音频朝向,[0, 1, 0]表示朝向前方 - */ - play(id, position = [0, 0, 0], orientation = [1, 0, 0]) { - if (!this.enabled || !id) return -1; - const buffer = this.buffer.get(id); - if (!buffer) { - console.warn( - "Cannot play sound '" + - id + - "', since there is no added data named it." - ); - return -1; - } - const soundNum = this.num++; - - const source = this.player.createBufferSource(); - source.setBuffer(buffer); - const route = this.player.createRoute(source); - const stereo = this.player.createStereoEffect(); - stereo.setPosition(position[0], position[1], position[2]); - stereo.setOrientation(orientation[0], orientation[1], orientation[2]); - route.addEffect([stereo, this.gain]); - this.player.addRoute(`sounds.${soundNum}`, route); - route.play(); - source.output.addEventListener("ended", () => { - this.playing.delete(soundNum); - }); - this.playing.add(soundNum); - return soundNum; - } - - /** - * 停止一个音效 - * @param num 音效的唯一 id - */ - stop(num) { - const id = `sounds.${num}`; - const route = this.player.getRoute(id); - if (route) { - route.stop(); - this.player.removeRoute(id); - this.playing.delete(num); - } - } - - /** - * 停止播放所有音效 - */ - stopAllSounds() { - this.playing.forEach((v) => { - const id = `sounds.${v}`; - const route = this.player.getRoute(id); - if (route) { - route.stop(); - this.player.removeRoute(id); - } - }); - this.playing.clear(); - } - } - const soundPlayer = new SoundPlayer(audioPlayer); - - function loadAllBgm() { - const data = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d; - for (const bgm of data.main.bgms) { - bgmController.addBgm(bgm); - } - } - loadAllBgm(); - AudioDecoder.registerDecoder(AudioType.Ogg, VorbisDecoder); - AudioDecoder.registerDecoder(AudioType.Opus, OpusDecoder); - - core.plugin.audioSystem = { - AudioType, - AudioDecoder, - AudioStatus, - checkAudioType, - isAudioSupport, - audioPlayer, - soundPlayer, - bgmController, - guessTypeByExt, - BgmController, - SoundPlayer, - EchoEffect, - DelayEffect, - ChannelVolumeEffect, - VolumeEffect, - StereoEffect, - AudioEffect, - AudioPlayer, - AudioRoute, - AudioStreamSource, - AudioElementSource, - AudioBufferSource, - loadAllBgm, - StreamLoader, - }; - //bgm相关复写 - control.prototype.playBgm = (bgm, when) => { - bgm = core.getMappedName(bgm); - bgmController.play(bgm, when); - core.setMusicBtn(); - }; - control.prototype.pauseBgm = () => { - bgmController.pause(); - core.setMusicBtn(); - }; - - control.prototype.resumeBgm = function () { - bgmController.resume(); - core.setMusicBtn(); - }; - control.prototype.checkBgm = function () { - core.playBgm(bgmController.playingBgm || main.startBgm); - }; - control.prototype.triggerBgm = function () { - core.musicStatus.bgmStatus = !core.musicStatus.bgmStatus; - if (bgmController.playing) bgmController.pause(); - else bgmController.resume(); - core.setMusicBtn(); - core.setLocalStorage("bgmStatus", core.musicStatus.bgmStatus); - }; - //sound相关复写 - control.prototype.playSound = function ( - sound, - _pitch, - callback, - position, - orientation - ) { - if (main.mode != "play" || !core.musicStatus.soundStatus) return; - const name = core.getMappedName(sound); - const num = soundPlayer.play(name, position, orientation); - const route = audioPlayer.getRoute(`sounds.${num}`); - if (!route) { - callback?.(); - return -1; - } else { - sleep(route.duration * 1000).then(() => callback?.()); - return num; - } - }; - control.prototype.stopSound = function (id) { - if (isNil(id)) { - soundPlayer.stopAllSounds(); - } else { - soundPlayer.stop(id); - } - }; - control.prototype.getPlayingSounds = function () { - return [...soundPlayer.playing]; - }; - //sound加载复写 - loader.prototype._loadOneSound_decodeData = function (name, data) { - if (data instanceof Blob) { - var blobReader = new zip.BlobReader(data); - blobReader.init(function () { - blobReader.readUint8Array(0, blobReader.size, function (uint8) { - //core.loader._loadOneSound_decodeData(name, uint8.buffer); - soundPlayer.add(name, uint8); - }); - }); - return; - } - if (data instanceof ArrayBuffer) { - const uint8 = new Uint8Array(data); - soundPlayer.add(name, uint8); - } - }; - //音量控制复写 - soundPlayer.setVolume( - core.musicStatus.userVolume * core.musicStatus.designVolume - ); - bgmController.setVolume( - core.musicStatus.userVolume * core.musicStatus.designVolume - ); - actions.prototype._clickSwitchs_sounds_userVolume = function (delta) { - var value = Math.round(Math.sqrt(100 * core.musicStatus.userVolume)); - if (value == 0 && delta < 0) return; - core.musicStatus.userVolume = core.clamp( - Math.pow(value + delta, 2) / 100, - 0, - 1 - ); - //audioContext 音效 不受designVolume 影响 - if (core.musicStatus.gainNode != null) - core.musicStatus.gainNode.gain.value = core.musicStatus.userVolume; - soundPlayer.setVolume( - core.musicStatus.userVolume * core.musicStatus.designVolume - ); - bgmController.setVolume( - core.musicStatus.userVolume * core.musicStatus.designVolume - ); - core.setLocalStorage("userVolume", core.musicStatus.userVolume); - core.playSound("确定"); - core.ui._drawSwitchs_sounds(); - }; -}, - "怪物碎裂特效": function () { - // 在此增加新插件 - // -------------------- 安装说明 -------------------- // - // 先安装两个在插件简介中说明的前置插件 - // 然后再将本插件复制到插件编写中即可 - // 插件自带一个打怪后显示碎裂特效的功能 - // -------------------- 使用说明 -------------------- // - /* - - 本插件的核心是一个名为 applyFragWith 的函数,打怪后的碎裂特效也是由它执行的。 - 我们来说明一下这个函数的使用方式。 - 1. 引入 - 你可以使用 const { applyFragWith } = core.plugin.frag; 在任何地方来引入这个函数。 - - 2. 函数的参数 - 该函数有三个参数,分别是canvas, length, time。 - 其中,第一个参数意思是,在执行碎裂时,其内容由该画布决定,这个特效并不会修改传入的画布,因此原画布的内容会依然存在 - 第二个参数指的是每个碎片的边长,虽然原则上每个碎片都是正方形,但边缘一周的碎片可能不是正方形,但中间的碎片一定是 - 第三个参数指的是这个特效要执行多长时间 - 第四个参数是一个对象,包含四种配置量,均为可选,分别是maxMoveLength,moveFlush,maxRotate,fragTiming - 当这些不存在时会默认取同名的常量作为默认值。这些值有什么用可以看下面的常量注释。 - - 3. 函数的返回值 - 这个函数会返回一个特效控制器对象,这个控制器共有三个属性。 - animation: 指的是当前特效的高级动画对象 - onEnd: 一个Promise,当这个特效执行完毕后会被 fulfilled - canvas: 特效所显示的画布。这个画布不会自动部署到样板中,需要你手动使用appendChild来部署,具体可参考打怪后碎裂的样例 - - 4. 修改一些常量 - 在下面有四个有注释的常量MAX_MOVE_LENGTH ~ FRAG_TIMING,你可以根据你自己的需要来更改。 - - */ - - if (main.replayChecking) return (core.plugin.frag = {}); - - const { Animation, linear, sleep } = core.plugin.animate; - const { has } = core.plugin.utils; - - /** 最大移动距离,最终位置距离中心的距离变成原来的几倍 */ - const MAX_MOVE_LENGTH = 1.15; - /** 移动距离波动,在最大移动距离的基础上加上多少倍距离的波动距离 */ - const MOVE_FLUSH = 0.7; - /** 最大旋转角,单位是弧度,每个碎片都会有自己的旋转程度,是随机的 */ - const MAX_ROTATE = 0.5; - /** 碎裂动画的速率曲线函数 */ - const FRAG_TIMING = linear(); - + // 将__enable置为false将关闭插件 + let __enable = true; + if (!__enable || main.mode === "editor") return; + const { OggOpusDecoderWebWorker } = window["ogg-opus-decoder"]; + const { OggVorbisDecoderWebWorker } = window["ogg-vorbis-decoder"]; + const { CodecParser } = window.CodecParser; + const { Transition, linear } = core.plugin.animate; + + const audio = new Audio(); + const AudioStatus = { + Playing: 0, + Pausing: 1, + Paused: 2, + Stoping: 3, + Stoped: 4, + }; + const supportMap = new Map(); + const AudioType = { + Mp3: "audio/mpeg", + Wav: 'audio/wav; codecs="1"', + Flac: "audio/flac", + Opus: 'audio/ogg; codecs="opus"', + Ogg: 'audio/ogg; codecs="vorbis"', + Aac: "audio/aac", + }; /** - * @param {HTMLCanvasElement} canvas 要执行特效的画布 - * @param {number} length 切分成的碎片的边长,碎片为正方形 - * @param {number} time 特效持续时长 - * @returns 返回一个碎裂特效控制器,是一个对象,详见开头的使用注释 + * 检查一种音频类型是否能被播放 + * @param type 音频类型 AudioType */ - function applyFragWith(canvas, length = 4, time = 2000, config = {}) { - // 先切分图片 - const imgs = splitCanvas(canvas, length); - const cx = canvas.width / 2; - const cy = canvas.height / 2; - - let maxX = 0; - let maxY = 0; - const toMove = imgs.map((v) => { - const centerX = v.x + v.canvas.width / 2; - const centerY = v.y + v.canvas.height / 2; - const onX = centerX === cx; - const onY = centerY === cy; - const mml = config.maxMoveLength ?? MAX_MOVE_LENGTH; - const mf = config.moveFlush ?? MOVE_FLUSH; - const rate = mml - 1 + Math.random() ** 3 * mf; - let endX = onY ? 0 : (centerX - cx) * rate; - let endY = onX ? 0 : (centerY - cy) * rate; - const mx = Math.abs(endX + centerX) + Math.abs(v.canvas.width); - const my = Math.abs(endY + centerY) + Math.abs(v.canvas.height); - if (mx > maxX) maxX = mx; - if (my > maxY) maxY = my; - const r = config.maxRotate ?? MAX_ROTATE; - const endRad = Math.random() * r * 2 - r; - - return { - deltaX: endX, - deltaY: endY, - endRad, - x: centerX, - y: centerY, - canvas: v.canvas, - }; - }); - - // 再执行动画 - const frag = document.createElement("canvas"); - const ctx = frag.getContext("2d"); - const ani = new Animation(); - ani.register("rate", 0); - const ft = config.fragTiming ?? FRAG_TIMING; - ani.absolute().time(time).mode(ft).apply("rate", 1); - frag.width = maxX * 2; - frag.height = maxY * 2; - ctx.save(); - const dw = maxX - canvas.width / 2; - const dh = maxY - canvas.height / 2; - - const fragFn = () => { - const rate = ani.value.rate; - const opacity = 1 - rate; - ctx.globalAlpha = opacity; - ctx.clearRect(0, 0, frag.width, frag.height); - toMove.forEach((v) => { - ctx.save(); - const nx = v.deltaX * rate; - const ny = v.deltaY * rate; - const rotate = v.endRad * rate; - - ctx.translate(nx + v.x + dw, ny + v.y + dh); - ctx.rotate(rotate); - ctx.drawImage( - v.canvas, - nx - v.canvas.width / 2, - ny - v.canvas.height / 2 - ); - ctx.restore(); - }); - }; - const onEnd = () => {}; - ani.ticker.add(fragFn); - - return makeFragManager(frag, ani, time, onEnd); - } - - function makeFragManager(canvas, ani, time, onEnd) { - const promise = sleep(time + 50); - - return { - animation: ani, - - onEnd: promise.then(() => { - ani.ticker.destroy(); - onEnd(); - }), - canvas, - }; - } - - function withImage(image, sx, sy, sw, sh) { - const canvas = document.createElement("canvas"); - const ctx = canvas.getContext("2d"); - canvas.width = sw; - canvas.height = sh; - ctx.drawImage(image, sx, sy, sw, sh, 0, 0, sw, sh); - return { canvas, x: sx, y: sy }; - } - - /** - * 切分画布 - * @param canvas 要被切分的画布 - * @param l 切分小块的边长 - */ - function splitCanvas(canvas, l) { - if (canvas.width / l < 2 || canvas.height / l < 2) { - console.warn("切分画布要求切分边长大于等于画布长宽的一半!"); - return []; + function isAudioSupport(type) { + if (supportMap.has(type)) return supportMap.get(type); + else { + const support = audio.canPlayType(type); + const canPlay = support === "maybe" || support === "probably"; + supportMap.set(type, canPlay); + return canPlay; } - const w = canvas.width; - const h = canvas.height; - const numX = Math.floor(w / l); - const numY = Math.floor(h / l); - const rw = (w - numX * l) / 2; - const rh = (h - numY * l) / 2; + } - const res = []; + const typeMap = new Map([ + ["ogg", AudioType.Ogg], + ["mp3", AudioType.Mp3], + ["wav", AudioType.Wav], + ["flac", AudioType.Flac], + ["opus", AudioType.Opus], + ["aac", AudioType.Aac], + ]); - if (rw > 0) { - if (rh > 0) { - res.push( - withImage(canvas, 0, 0, rw, rh), - withImage(canvas, 0, canvas.height - rh, rw, rh), - withImage(canvas, canvas.width - rw, 0, rw, rh), - withImage(canvas, canvas.width - rw, canvas.height - rh, rw, rh) - ); - } - for (const x of [0, canvas.width - rw]) { - for (let ny = 0; ny < numY; ny++) { - res.push(withImage(canvas, x, rh + l * ny, rw, l)); + /** + * 根据文件名拓展猜测其类型 + * @param file 文件名 string + */ + function guessTypeByExt(file) { + const ext = /\.[a-zA-Z\d]+$/.exec(file); + if (!ext?.[0]) return ""; + const type = ext[0].slice(1); + return typeMap.get(type.toLocaleLowerCase()) ?? ""; + } + + isAudioSupport(AudioType.Ogg); + isAudioSupport(AudioType.Mp3); + isAudioSupport(AudioType.Wav); + isAudioSupport(AudioType.Flac); + isAudioSupport(AudioType.Opus); + isAudioSupport(AudioType.Aac); + + function isNil(value) { + return value === void 0 || value === null; + } + + function sleep(time) { + return new Promise((res) => setTimeout(res, time)); + } + class AudioEffect { + constructor(ac) {} + /** + * 连接至其他效果器 + * @param target 目标输入 IAudioInput + * @param output 当前效果器输出通道 Number + * @param input 目标效果器的输入通道 Number + */ + connect(target, output, input) { + this.output.connect(target.input, output, input); + } + + /** + * 与其他效果器取消连接 + * @param target 目标输入 IAudioInput + * @param output 当前效果器输出通道 Number + * @param input 目标效果器的输入通道 Number + */ + disconnect(target, output, input) { + if (!target) { + if (!isNil(output)) { + this.output.disconnect(output); + } else { + this.output.disconnect(); + } + } else { + if (!isNil(output)) { + if (!isNil(input)) { + this.output.disconnect(target.input, output, input); + } else { + this.output.disconnect(target.input, output); + } + } else { + this.output.disconnect(target.input); } } } - if (rh > 0) { - for (const y of [0, canvas.height - rh]) { - for (let nx = 0; nx < numX; nx++) { - res.push(withImage(canvas, rw + l * nx, y, l, rh)); + } + + class StereoEffect extends AudioEffect { + constructor(ac) { + super(ac); + const panner = ac.createPanner(); + this.input = panner; + this.output = panner; + } + + /** + * 设置音频朝向,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 朝向x坐标 Number + * @param y 朝向y坐标 Number + * @param z 朝向z坐标 Number + */ + setOrientation(x, y, z) { + this.output.orientationX.value = x; + this.output.orientationY.value = y; + this.output.orientationZ.value = z; + } + /** + * 设置音频位置,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 位置x坐标 Number + * @param y 位置y坐标 Number + * @param z 位置z坐标 Number + */ + setPosition(x, y, z) { + this.output.positionX.value = x; + this.output.positionY.value = y; + this.output.positionZ.value = z; + } + end() {} + + start() {} + } + class VolumeEffect extends AudioEffect { + constructor(ac) { + super(ac); + const gain = ac.createGain(); + this.input = gain; + this.output = gain; + } + + /** + * 设置音量大小 + * @param volume 音量大小 Number + */ + setVolume(volume) { + this.output.gain.value = volume; + } + + /** + * 获取音量大小 Number + */ + getVolume() { + return this.output.gain.value; + } + + end() {} + + start() {} + } + class ChannelVolumeEffect extends AudioEffect { + /** 所有的音量控制节点 */ + + constructor(ac) { + super(ac); + /** 所有的音量控制节点 */ + this.gain = []; + const splitter = ac.createChannelSplitter(); + const merger = ac.createChannelMerger(); + this.output = merger; + this.input = splitter; + for (let i = 0; i < 6; i++) { + const gain = ac.createGain(); + splitter.connect(gain, i); + gain.connect(merger, 0, i); + this.gain.push(gain); + } + } + + /** + * 设置某个声道的音量大小 + * @param channel 要设置的声道,可填0-5 Number + * @param volume 这个声道的音量大小 Number + */ + setVolume(channel, volume) { + if (!this.gain[channel]) return; + this.gain[channel].gain.value = volume; + } + + /** + * 获取某个声道的音量大小,可填0-5 + * @param channel 要获取的声道 Number + */ + getVolume(channel) { + if (!this.gain[channel]) return 0; + return this.gain[channel].gain.value; + } + + end() {} + + start() {} + } + class DelayEffect extends AudioEffect { + constructor(ac) { + super(ac); + + const delay = ac.createDelay(); + this.input = delay; + this.output = delay; + } + + /** + * 设置延迟时长 + * @param delay 延迟时长,单位秒 Number + */ + setDelay(delay) { + this.output.delayTime.value = delay; + } + + /** + * 获取延迟时长 + */ + getDelay() { + return this.output.delayTime.value; + } + + end() {} + + start() {} + } + class EchoEffect extends AudioEffect { + constructor(ac) { + super(ac); + /** 当前增益 */ + this.gain = 0.5; + /** 是否正在播放 */ + this.playing = false; + const delay = ac.createDelay(); + const gain = ac.createGain(); + gain.gain.value = 0.5; + delay.delayTime.value = 0.05; + delay.connect(gain); + gain.connect(delay); + /** 延迟节点 */ + this.delay = delay; + /** 反馈增益节点 */ + this.gainNode = gain; + + this.input = gain; + this.output = gain; + } + + /** + * 设置回声反馈增益大小 + * @param gain 增益大小,范围 0-1,大于等于1的视为0.5,小于0的视为0 Number + */ + setFeedbackGain(gain) { + const resolved = gain >= 1 ? 0.5 : gain < 0 ? 0 : gain; + this.gain = resolved; + if (this.playing) this.gainNode.gain.value = resolved; + } + + /** + * 设置回声间隔时长 + * @param delay 回声时长,范围 0.01-Infinity,小于0.01的视为0.01 Number + */ + setEchoDelay(delay) { + const resolved = delay < 0.01 ? 0.01 : delay; + this.delay.delayTime.value = resolved; + } + + /** + * 获取反馈节点增益 + */ + getFeedbackGain() { + return this.gain; + } + + /** + * 获取回声间隔时长 + */ + getEchoDelay() { + return this.delay.delayTime.value; + } + + end() { + this.playing = false; + const echoTime = Math.ceil(Math.log(0.001) / Math.log(this.gain)) + 10; + sleep(this.delay.delayTime.value * echoTime).then(() => { + if (!this.playing) this.gainNode.gain.value = 0; + }); + } + + start() { + this.playing = true; + this.gainNode.gain.value = this.gain; + } + } + + class StreamLoader { + constructor(url) { + /** 传输目标 Set*/ + this.target = new Set(); + this.loading = false; + } + + /** + * 将加载流传递给字节流读取对象 + * @param reader 字节流读取对象 IStreamReader + */ + pipe(reader) { + if (this.loading) { + console.warn( + "Cannot pipe new StreamReader object when stream is loading." + ); + return; + } + this.target.add(reader); + reader.piped(this); + return this; + } + + async start() { + if (this.loading) return; + this.loading = true; + const response = await window.fetch(this.url); + const stream = response.body; + if (!stream) { + console.error("Cannot get reader when fetching '" + this.url + "'."); + return; + } + // 获取读取器 + this.stream = stream; + const reader = response.body?.getReader(); + const targets = [...this.target]; + + await Promise.all(targets.map((v) => v.start(stream, this, response))); + if (reader && reader.read) { + // 开始流传输 + while (true) { + const { value, done } = await reader.read(); + await Promise.all( + targets.map((v) => v.pump(value, done, response)) + ); + if (done) break; + } + } else { + // 如果不支持流传输 + const buffer = await response.arrayBuffer(); + const data = new Uint8Array(buffer); + await Promise.all(targets.map((v) => v.pump(data, true, response))); + } + + this.loading = false; + targets.forEach((v) => v.end(true)); + + // + } + + cancel(reason) { + if (!this.stream) return; + this.stream.cancel(reason); + this.loading = false; + this.target.forEach((v) => v.end(false, reason)); + } + } + const fileSignatures = [ + [AudioType.Mp3, [0x49, 0x44, 0x33]], + [AudioType.Ogg, [0x4f, 0x67, 0x67, 0x53]], + [AudioType.Wav, [0x52, 0x49, 0x46, 0x46]], + [AudioType.Flac, [0x66, 0x4c, 0x61, 0x43]], + [AudioType.Aac, [0xff, 0xf1]], + [AudioType.Aac, [0xff, 0xf9]], + ]; + const oggHeaders = [ + [AudioType.Opus, [0x4f, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64]], + ]; + + function checkAudioType(data) { + let audioType = ""; + // 检查头文件获取音频类型,仅检查前256个字节 + const toCheck = data.slice(0, 256); + for (const [type, value] of fileSignatures) { + if (value.every((v, i) => toCheck[i] === v)) { + audioType = type; + break; + } + } + if (audioType === AudioType.Ogg) { + // 如果是ogg的话,进一步判断是不是opus + for (const [key, value] of oggHeaders) { + const has = toCheck.some((_, i) => { + return value.every((v, ii) => toCheck[i + ii] === v); + }); + if (has) { + audioType = key; + break; } } } - for (let nx = 0; nx < numX; nx++) { - for (let ny = 0; ny < numY; ny++) { - res.push(withImage(canvas, rw + l * nx, rh + l * ny, l, l)); + + return audioType; + } + class AudioDecoder { + /** + * 注册一个解码器 + * @param type 要注册的解码器允许解码的类型 + * @param decoder 解码器对象 + */ + static registerDecoder(type, decoder) { + if (!this.decoderMap) this.decoderMap = new Map(); + if (this.decoderMap.has(type)) { + console.warn( + "Audio stream decoder for audio type '" + + type + + "' has already existed." + ); + return; + } + + this.decoderMap.set(type, decoder); + } + + /** + * 解码音频数据 + * @param data 音频文件数据 + * @param player AudioPlayer实例 + */ + static async decodeAudioData(data, player) { + // 检查头文件获取音频类型,仅检查前256个字节 + const toCheck = data.slice(0, 256); + const type = checkAudioType(data); + if (type === "") { + console.error( + "Unknown audio type. Header: '" + + [...toCheck] + .map((v) => v.toString().padStart(2, "0")) + .join(" ") + .toUpperCase() + + "'" + ); + return null; + } + if (isAudioSupport(type)) { + if (data.buffer instanceof ArrayBuffer) { + return player.ac.decodeAudioData(data.buffer); + } else { + return null; + } + } else { + const Decoder = this.decoderMap.get(type); + if (!Decoder) { + return null; + } else { + const decoder = new Decoder(); + await decoder.create(); + const decodedData = await decoder.decode(data); + if (!decodedData) return null; + const buffer = player.ac.createBuffer( + decodedData.channelData.length, + decodedData.channelData[0].length, + decodedData.sampleRate + ); + decodedData.channelData.forEach((v, i) => { + buffer.copyToChannel(v, i); + }); + decoder.destroy(); + return buffer; + } } } - - return res; } - const origin = core.events.afterBattle; - core.events.afterBattle = function (enemyId, x, y) { - // 打怪特效 - if (has(x) && has(y)) { - const frame = core.status.globalAnimateStatus % 2; - // 生成怪物图像 - const canvas = document.createElement("canvas"); - canvas.width = 32; - canvas.height = 32; - core.drawIcon(canvas, enemyId, 0, 0, 32, 32, frame); - // 执行动画 - const manager = applyFragWith(canvas); - const frag = manager.canvas; - // 设置特效画布的css属性 - frag.style.imageRendering = "pixelated"; - frag.style.width = `${frag.width * core.domStyle.scale}px`; - frag.style.height = `${frag.height * core.domStyle.scale}px`; - const left = - (x * 32 + 16 - frag.width / 2 - core.bigmap.offsetX) * - core.domStyle.scale; - const top = - (y * 32 + 16 - frag.height / 2 - core.bigmap.offsetY) * - core.domStyle.scale; - frag.style.left = `${left}px`; - frag.style.top = `${top}px`; - frag.style.zIndex = "45"; - frag.style.position = "absolute"; - // 将特效画布部署到样板上 - core.dom.gameDraw.appendChild(frag); - // 当特效执行完毕后移除这个特效画布 - manager.onEnd.then(() => { - frag.remove(); - }); + class VorbisDecoder { + /** + * 创建音频解码器 + */ + async create() { + this.decoder = new OggVorbisDecoderWebWorker(); + await this.decoder.ready; } - return origin.apply(this, arguments); + /** + * 摧毁这个解码器 + */ + destroy() { + this.decoder?.free(); + } + /** + * 解码流数据 + * @param data 流数据 + */ + + async decode(data) { + return this.decoder?.decode(data); + } + /** + * 解码整个文件 + * @param data 文件数据 + */ + async decodeAll(data) { + return this.decoder?.decodeFile(data); + } + /** + * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 + */ + async flush() { + return this.decoder?.flush(); + } + } + + class OpusDecoder { + /** + * 创建音频解码器 + */ + async create() { + this.decoder = new OggOpusDecoderWebWorker(); + await this.decoder.ready; + } + /** + * 摧毁这个解码器 + */ + destroy() { + this.decoder?.free(); + } + /** + * 解码流数据 + * @param data 流数据 + */ + async decode(data) { + return this.decoder?.decode(data); + } + /** + * 解码整个文件 + * @param data 文件数据 + */ + async decodeAll(data) { + return this.decoder?.decodeFile(data); + } + /** + * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 + */ + async flush() { + return await this.decoder?.flush(); + } + } + const mimeTypeMap = { + [AudioType.Aac]: "audio/aac", + [AudioType.Flac]: "audio/flac", + [AudioType.Mp3]: "audio/mpeg", + [AudioType.Ogg]: "application/ogg", + [AudioType.Opus]: "application/ogg", + [AudioType.Wav]: "application/ogg", }; - if ("frag" in core.plugin) { - throw new ReferenceError(`core.plugin上已存在名为frag的属性!`); + function isOggPage(data) { + return !isNil(data.isFirstPage); } - core.plugin.frag = { - applyFragWith, + class AudioStreamSource { + constructor(context) { + this.output = context.createBufferSource(); + /** 是否已经完全加载完毕 */ + this.loaded = false; + /** 是否正在播放 */ + this.playing = false; + /** 已经缓冲了多长时间,如果缓冲完那么跟歌曲时长一致 */ + this.buffered = 0; + /** 已经缓冲的采样点数量 */ + this.bufferedSamples = 0; + /** 歌曲时长,加载完毕之前保持为 0 */ + this.duration = 0; + /** 在流传输阶段,至少缓冲多长时间的音频之后才开始播放,单位秒 */ + this.bufferPlayDuration = 1; + /** 音频的采样率,未成功解析出之前保持为 0 */ + this.sampleRate = 0; + //是否循环播放 + this.loop = false; + /** 上一次播放是从何时开始的 */ + this.lastStartWhen = 0; + /** 开始播放时刻 */ + this.lastStartTime = 0; + /** 上一次播放的缓存长度 */ + this.lastBufferSamples = 0; + + /** 是否已经获取到头文件 */ + this.headerRecieved = false; + /** 音频类型 */ + this.audioType = ""; + /** 每多长时间组成一个缓存 Float32Array */ + this.bufferChunkSize = 10; + /** 缓存音频数据,每 bufferChunkSize 秒钟组成一个 Float32Array,用于流式解码 */ + this.audioData = []; + + this.errored = false; + this.ac = context; + } + /** 当前已经播放了多长时间 */ + get currentTime() { + return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; + } + /** + * 设置每个缓存数据的大小,默认为10秒钟一个缓存数据 + * @param size 每个缓存数据的时长,单位秒 + */ + setChunkSize(size) { + if (this.controller?.loading || this.loaded) return; + this.bufferChunkSize = size; + } + + piped(controller) { + this.controller = controller; + } + + async pump(data, done) { + if (!data || this.errored) return; + if (!this.headerRecieved) { + // 检查头文件获取音频类型,仅检查前256个字节 + const toCheck = data.slice(0, 256); + this.audioType = checkAudioType(data); + if (!this.audioType) { + console.error( + "Unknown audio type. Header: '" + + [...toCheck] + .map((v) => v.toString(16).padStart(2, "0")) + .join(" ") + .toUpperCase() + + "'" + ); + return; + } + // 创建解码器 + const Decoder = AudioDecoder.decoderMap.get(this.audioType); + if (!Decoder) { + this.errored = true; + console.error( + "Cannot decode stream source type of '" + + this.audioType + + "', since there is no registered decoder for that type." + ); + return Promise.reject( + `Cannot decode stream source type of '${this.audioType}', since there is no registered decoder for that type.` + ); + } + this.decoder = new Decoder(); + // 创建数据解析器 + const mime = mimeTypeMap[this.audioType]; + const parser = new CodecParser(mime); + this.parser = parser; + await this.decoder.create(); + this.headerRecieved = true; + } + + const decoder = this.decoder; + const parser = this.parser; + if (!decoder || !parser) { + this.errored = true; + return Promise.reject( + "No parser or decoder attached in this AudioStreamSource" + ); + } + + await this.decodeData(data, decoder, parser); + if (done) await this.decodeFlushData(decoder, parser); + this.checkBufferedPlay(); + } + + /** + * 检查采样率,如果还未解析出采样率,那么将设置采样率,如果当前采样率与之前不同,那么发出警告 + */ + checkSampleRate(info) { + for (const one of info) { + const frame = isOggPage(one) ? one.codecFrames[0] : one; + if (frame) { + const rate = frame.header.sampleRate; + if (this.sampleRate === 0) { + this.sampleRate = rate; + break; + } else { + if (rate !== this.sampleRate) { + console.warn("Sample rate in stream audio must be constant."); + } + } + } + } + } + + /** + * 解析音频数据 + */ + async decodeData(data, decoder, parser) { + // 解析音频数据 + const audioData = await decoder.decode(data); + if (!audioData) return; + // @ts-expect-error 库类型声明错误 + const audioInfo = [...parser.parseChunk(data)]; + + // 检查采样率 + this.checkSampleRate(audioInfo); + // 追加音频数据 + this.appendDecodedData(audioData, audioInfo); + } + + /** + * 解码剩余数据 + */ + async decodeFlushData(decoder, parser) { + const audioData = await decoder.flush(); + if (!audioData) return; + // @ts-expect-error 库类型声明错误 + const audioInfo = [...parser.flush()]; + + this.checkSampleRate(audioInfo); + this.appendDecodedData(audioData, audioInfo); + } + + /** + * 追加音频数据 + */ + appendDecodedData(data, info) { + const channels = data.channelData.length; + if (channels === 0) return; + if (this.audioData.length !== channels) { + this.audioData = []; + for (let i = 0; i < channels; i++) { + this.audioData.push([]); + } + } + // 计算出应该放在哪 + const chunk = this.sampleRate * this.bufferChunkSize; + const sampled = this.bufferedSamples; + const pushIndex = Math.floor(sampled / chunk); + const bufferIndex = sampled % chunk; + const dataLength = data.channelData[0].length; + let buffered = 0; + let nowIndex = pushIndex; + let toBuffer = bufferIndex; + while (buffered < dataLength) { + const rest = toBuffer !== 0 ? chunk - bufferIndex : chunk; + + for (let i = 0; i < channels; i++) { + const audioData = this.audioData[i]; + if (!audioData[nowIndex]) { + audioData.push(new Float32Array(chunk)); + } + const toPush = data.channelData[i].slice(buffered, buffered + rest); + + audioData[nowIndex].set(toPush, toBuffer); + } + buffered += rest; + nowIndex++; + toBuffer = 0; + } + + this.buffered += + info.reduce((prev, curr) => prev + curr.duration, 0) / 1000; + this.bufferedSamples += info.reduce( + (prev, curr) => prev + curr.samples, + 0 + ); + } + + /** + * 检查已缓冲内容,并在未开始播放时播放 + */ + checkBufferedPlay() { + if (this.playing || this.sampleRate === 0) return; + const played = this.lastBufferSamples / this.sampleRate; + const dt = this.buffered - played; + if (this.loaded) { + this.playAudio(played); + return; + } + if (dt < this.bufferPlayDuration) return; + + this.lastBufferSamples = this.bufferedSamples; + // 需要播放 + this.mergeBuffers(); + if (!this.buffer) return; + if (this.playing) this.output.stop(); + this.createSourceNode(this.buffer); + this.output.loop = false; + this.output.start(0, played); + this.lastStartTime = this.ac.currentTime; + this.playing = true; + this.output.addEventListener("ended", () => { + this.playing = false; + this.checkBufferedPlay(); + }); + } + + mergeBuffers() { + const buffer = this.ac.createBuffer( + this.audioData.length, + this.bufferedSamples, + this.sampleRate + ); + const chunk = this.sampleRate * this.bufferChunkSize; + const bufferedChunks = Math.floor(this.bufferedSamples / chunk); + const restLength = this.bufferedSamples % chunk; + for (let i = 0; i < this.audioData.length; i++) { + const audio = this.audioData[i]; + const data = new Float32Array(this.bufferedSamples); + for (let j = 0; j < bufferedChunks; j++) { + data.set(audio[j], chunk * j); + } + if (restLength !== 0) { + data.set( + audio[bufferedChunks].slice(0, restLength), + chunk * bufferedChunks + ); + } + + buffer.copyToChannel(data, i, 0); + } + this.buffer = buffer; + } + + async start() { + delete this.buffer; + this.headerRecieved = false; + this.audioType = ""; + this.errored = false; + this.buffered = 0; + this.sampleRate = 0; + this.bufferedSamples = 0; + this.duration = 0; + this.loaded = false; + if (this.playing) this.output.stop(); + this.playing = false; + this.lastStartTime = this.ac.currentTime; + } + + end(done, reason) { + if (done && this.buffer) { + this.loaded = true; + delete this.controller; + this.mergeBuffers(); + + this.duration = this.buffered; + this.audioData = []; + this.decoder?.destroy(); + delete this.decoder; + delete this.parser; + } else { + console.warn( + "Unexpected end when loading stream audio, reason: '" + + (reason ?? "") + + "'" + ); + } + } + + playAudio(when) { + if (!this.buffer) return; + this.lastStartTime = this.ac.currentTime; + if (this.playing) this.output.stop(); + if (this.route.status !== AudioStatus.Playing) { + this.route.status = AudioStatus.Playing; + } + this.createSourceNode(this.buffer); + this.output.start(0, when); + this.playing = true; + + this.output.addEventListener("ended", () => { + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + if (this.loop && !this.output.loop) this.play(0); + }); + } + /** + * 开始播放这个音频源 + */ + play(when) { + if (this.playing || this.errored) return; + if (this.loaded && this.buffer) { + this.playing = true; + this.playAudio(when); + } else { + this.controller?.start(); + } + } + + createSourceNode(buffer) { + if (!this.target) return; + const node = this.ac.createBufferSource(); + node.buffer = buffer; + if (this.playing) this.output.stop(); + this.playing = false; + this.output = node; + node.connect(this.target.input); + node.loop = this.loop; + } + /** + * 停止播放这个音频源 + * @returns 音频暂停的时刻 number + */ + stop() { + if (this.playing) this.output.stop(); + this.playing = false; + return this.ac.currentTime - this.lastStartTime; + } + /** + * 连接到音频路由图上,每次调用播放的时候都会执行一次 + * @param target 连接至的目标 IAudioInput + */ + connect(target) { + this.target = target; + } + /** + * 设置是否循环播放 + * @param loop 是否循环 boolean) + */ + setLoop(loop) { + this.loop = loop; + } + } + class AudioElementSource { + constructor(context) { + const audio = new Audio(); + audio.preload = "none"; + this.output = context.createMediaElementSource(audio); + this.audio = audio; + this.ac = context; + audio.addEventListener("play", () => { + this.playing = true; + if (this.route.status !== AudioStatus.Playing) { + this.route.status = AudioStatus.Playing; + } + }); + audio.addEventListener("ended", () => { + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + }); + } + get duration() { + return this.audio.duration; + } + get currentTime() { + return this.audio.currentTime; + } + /** + * 设置音频源的路径 + * @param url 音频路径 + */ + setSource(url) { + this.audio.src = url; + } + + play(when = 0) { + if (this.playing) return; + this.audio.currentTime = when; + this.audio.play(); + } + + stop() { + this.audio.pause(); + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + return this.audio.currentTime; + } + + connect(target) { + this.output.connect(target.input); + } + + setLoop(loop) { + this.audio.loop = loop; + } + } + class AudioBufferSource { + constructor(context) { + this.output = context.createBufferSource(); + /** 是否循环 */ + this.loop = false; + /** 上一次播放是从何时开始的 */ + this.lastStartWhen = 0; + /** 播放开始时刻 */ + this.lastStartTime = 0; + this.duration = 0; + this.ac = context; + } + get currentTime() { + return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; + } + + /** + * 设置音频源数据 + * @param buffer 音频源,可以是未解析的 ArrayBuffer,也可以是已解析的 AudioBuffer + */ + async setBuffer(buffer) { + if (buffer instanceof ArrayBuffer) { + this.buffer = await this.ac.decodeAudioData(buffer); + } else { + this.buffer = buffer; + } + this.duration = this.buffer.duration; + } + + play(when) { + if (this.playing || !this.buffer) return; + this.playing = true; + this.lastStartTime = this.ac.currentTime; + if (this.route.status !== AudioStatus.Playing) { + this.route.status = AudioStatus.Playing; + } + this.createSourceNode(this.buffer); + this.output.start(0, when); + this.output.addEventListener("ended", () => { + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + if (this.loop && !this.output.loop) this.play(0); + }); + } + + createSourceNode(buffer) { + if (!this.target) return; + const node = this.ac.createBufferSource(); + node.buffer = buffer; + this.output = node; + node.connect(this.target.input); + node.loop = this.loop; + } + + stop() { + this.output.stop(); + return this.ac.currentTime - this.lastStartTime; + } + + connect(target) { + this.target = target; + } + + setLoop(loop) { + this.loop = loop; + } + } + class AudioPlayer { + constructor() { + /** 音频播放上下文 */ + this.ac = new AudioContext(); + /** 音量节点 */ + this.gain = this.ac.createGain(); + this.gain.connect(this.ac.destination); + this.audioRoutes = new Map(); + } + /** + * 解码音频数据 + * @param data 音频数据 + */ + decodeAudioData(data) { + return AudioDecoder.decodeAudioData(data, this); + } + /** + * 设置音量 + * @param volume 音量 + */ + setVolume(volume) { + this.gain.gain.value = volume; + } + + /** + * 获取音量 + */ + getVolume() { + return this.gain.gain.value; + } + + /** + * 创建一个音频源 + * @param Source 音频源类 + */ + createSource(Source) { + return new Source(this.ac); + } + + /** + * 创建一个兼容流式音频源,可以与流式加载相结合,主要用于处理 opus ogg 不兼容的情况 + */ + createStreamSource() { + return new AudioStreamSource(this.ac); + } + + /** + * 创建一个通过 audio 元素播放的音频源 + */ + createElementSource() { + return new AudioElementSource(this.ac); + } + + /** + * 创建一个通过 AudioBuffer 播放的音频源 + */ + createBufferSource() { + return new AudioBufferSource(this.ac); + } + + /** + * 获取音频目的地 + */ + getDestination() { + return this.gain; + } + + /** + * 创建一个音频效果器 + * @param Effect 效果器类 + */ + createEffect(Effect) { + return new Effect(this.ac); + } + + /** + * 创建一个修改音量的效果器 + * ```txt + * |----------| + * Input ----> | GainNode | ----> Output + * |----------| + * ``` + */ + createVolumeEffect() { + return new VolumeEffect(this.ac); + } + + /** + * 创建一个立体声效果器 + * ```txt + * |------------| + * Input ----> | PannerNode | ----> Output + * |------------| + * ``` + */ + createStereoEffect() { + return new StereoEffect(this.ac); + } + + /** + * 创建一个修改单个声道音量的效果器 + * ```txt + * |----------| + * -> | GainNode | \ + * |--------------| / |----------| -> |------------| + * Input ----> | SplitterNode | ...... | MergerNode | ----> Output + * |--------------| \ |----------| -> |------------| + * -> | GainNode | / + * |----------| + * ``` + */ + createChannelVolumeEffect() { + return new ChannelVolumeEffect(this.ac); + } + + /** + * 创建一个延迟效果器 + * |-----------| + * Input ----> | DelayNode | ----> Output + * |-----------| + */ + createDelay() { + return new DelayEffect(this.ac); + } + + /** + * 创建一个回声效果器 + * ```txt + * |----------| + * Input ----> | GainNode | ----> Output + * ^ |----------| | + * | | + * | |------------| ↓ + * |-- | Delay Node | <-- + * |------------| + * ``` + */ + createEchoEffect() { + return new EchoEffect(this.ac); + } + + /** + * 创建一个音频播放路由 + * @param source 音频源 + */ + createRoute(source) { + return new AudioRoute(source, this); + } + + /** + * 添加一个音频播放路由,可以直接被播放 + * @param id 这个音频播放路由的名称 + * @param route 音频播放路由对象 + */ + addRoute(id, route) { + if (!this.audioRoutes) this.audioRoutes = new Map(); + if (this.audioRoutes.has(id)) { + console.warn( + "Audio route with id of '" + + id + + "' has already existed. New route will override old route." + ); + } + this.audioRoutes.set(id, route); + } + + /** + * 根据名称获取音频播放路由对象 + * @param id 音频播放路由的名称 + */ + getRoute(id) { + return this.audioRoutes.get(id); + } + /** + * 移除一个音频播放路由 + * @param id 要移除的播放路由的名称 + */ + removeRoute(id) { + this.audioRoutes.delete(id); + } + /** + * 播放音频 + * @param id 音频名称 + * @param when 从音频的哪个位置开始播放,单位秒 + */ + play(id, when) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot play audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + + route.play(when); + } + + /** + * 暂停音频播放 + * @param id 音频名称 + * @returns 当音乐真正停止时兑现 + */ + pause(id) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot pause audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + return route.pause(); + } + + /** + * 停止音频播放 + * @param id 音频名称 + * @returns 当音乐真正停止时兑现 + */ + stop(id) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot stop audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + return route.stop(); + } + + /** + * 继续音频播放 + * @param id 音频名称 + */ + resume(id) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot pause audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + route.resume(); + } + + /** + * 设置听者位置,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 位置x坐标 + * @param y 位置y坐标 + * @param z 位置z坐标 + */ + setListenerPosition(x, y, z) { + const listener = this.ac.listener; + listener.positionX.value = x; + listener.positionY.value = y; + listener.positionZ.value = z; + } + + /** + * 设置听者朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 朝向x坐标 + * @param y 朝向y坐标 + * @param z 朝向z坐标 + */ + setListenerOrientation(x, y, z) { + const listener = this.ac.listener; + listener.forwardX.value = x; + listener.forwardY.value = y; + listener.forwardZ.value = z; + } + + /** + * 设置听者头顶朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 头顶朝向x坐标 + * @param y 头顶朝向y坐标 + * @param z 头顶朝向z坐标 + */ + setListenerUp(x, y, z) { + const listener = this.ac.listener; + listener.upX.value = x; + listener.upY.value = y; + listener.upZ.value = z; + } + } + class AudioRoute { + constructor(source, player) { + source.route = this; + this.output = source.output; + + /** 效果器路由图 */ + this.effectRoute = []; + + /** 结束时长,当音频暂停或停止时,会经过这么长时间之后才真正终止播放,期间可以做音频淡入淡出等效果 */ + this.endTime = 0; + /** 暂停时播放了多长时间 */ + this.pauseCurrentTime = 0; + /** 当前播放状态 */ + this.player = player; + this.status = AudioStatus.Stoped; + + this.shouldStop = false; + /** + * 每次暂停或停止时自增,用于判断当前正在处理的情况。 + * 假如暂停后很快播放,然后很快暂停,那么需要根据这个来判断实际是否应该执行暂停后操作 + */ + this.stopIdentifier = 0; + /** 暂停时刻 */ + this.pauseTime = 0; + this.source = source; + this.source.player = player; + } + /** 音频时长,单位秒 */ + get duration() { + return this.source.duration; + } + /** 当前播放了多长时间,单位秒 */ + get currentTime() { + if (this.status === AudioStatus.Paused) { + return this.pauseCurrentTime; + } else { + return this.source.currentTime; + } + } + set currentTime(time) { + this.source.stop(); + this.source.play(time); + } + /** + * 设置结束时间,暂停或停止时,会经过这么长时间才终止音频的播放,这期间可以做一下音频淡出的效果。 + * @param time 暂停或停止时,经过多长时间之后才会结束音频的播放 + */ + setEndTime(time) { + this.endTime = time; + } + + /** + * 当音频播放时执行的函数,可以用于音频淡入效果 + * @param fn 音频开始播放时执行的函数 + */ + onStart(fn) { + this.audioStartHook = fn; + } + + /** + * 当音频暂停或停止时执行的函数,可以用于音频淡出效果 + * @param fn 音频在暂停或停止时执行的函数,不填时表示取消这个钩子。 + * 包含两个参数,第一个参数是结束时长,第二个参数是当前音频播放路由对象 + */ + onEnd(fn) { + this.audioEndHook = fn; + } + + /** + * 开始播放这个音频 + * @param when 从音频的什么时候开始播放,单位秒 + */ + async play(when = 0) { + if (this.status === AudioStatus.Playing) return; + this.link(); + await this.player.ac.resume(); + if (this.effectRoute.length > 0) { + const first = this.effectRoute[0]; + this.source.connect(first); + const last = this.effectRoute.at(-1); + last.connect({ input: this.player.getDestination() }); + } else { + this.source.connect({ input: this.player.getDestination() }); + } + this.source.play(when); + this.status = AudioStatus.Playing; + this.pauseTime = 0; + this.audioStartHook?.(this); + this.startAllEffect(); + if (this.status !== AudioStatus.Playing) { + this.status = AudioStatus.Playing; + } + } + + /** + * 暂停音频播放 + */ + async pause() { + if (this.status !== AudioStatus.Playing) return; + this.status = AudioStatus.Pausing; + this.stopIdentifier++; + const identifier = this.stopIdentifier; + if (this.audioEndHook) { + this.audioEndHook(this.endTime, this); + await sleep(this.endTime); + } + if ( + this.status !== AudioStatus.Pausing || + this.stopIdentifier !== identifier + ) { + return; + } + this.pauseCurrentTime = this.source.currentTime; + const time = this.source.stop(); + this.pauseTime = time; + if (this.shouldStop) { + this.status = AudioStatus.Stoped; + this.endAllEffect(); + + this.shouldStop = false; + } else { + this.status = AudioStatus.Paused; + this.endAllEffect(); + } + this.endAllEffect(); + } + + /** + * 继续音频播放 + */ + resume() { + if (this.status === AudioStatus.Playing) return; + if ( + this.status === AudioStatus.Pausing || + this.status === AudioStatus.Stoping + ) { + this.audioStartHook?.(this); + + return; + } + if (this.status === AudioStatus.Paused) { + this.play(this.pauseTime); + } else { + this.play(0); + } + this.status = AudioStatus.Playing; + this.pauseTime = 0; + this.audioStartHook?.(this); + this.startAllEffect(); + } + + /** + * 停止音频播放 + */ + async stop() { + if (this.status !== AudioStatus.Playing) { + if (this.status === AudioStatus.Pausing) { + this.shouldStop = true; + } + return; + } + this.status = AudioStatus.Stoping; + this.stopIdentifier++; + const identifier = this.stopIdentifier; + if (this.audioEndHook) { + this.audioEndHook(this.endTime, this); + await sleep(this.endTime); + } + if ( + this.status !== AudioStatus.Stoping || + this.stopIdentifier !== identifier + ) { + return; + } + this.source.stop(); + this.status = AudioStatus.Stoped; + this.pauseTime = 0; + this.endAllEffect(); + } + + /** + * 添加效果器 + * @param effect 要添加的效果,可以是数组,表示一次添加多个 + * @param index 从哪个位置开始添加,如果大于数组长度,那么加到末尾,如果小于0,那么将会从后面往前数。默认添加到末尾 + */ + addEffect(effect, index) { + if (isNil(index)) { + if (effect instanceof Array) { + this.effectRoute.push(...effect); + } else { + this.effectRoute.push(effect); + } + } else { + if (effect instanceof Array) { + this.effectRoute.splice(index, 0, ...effect); + } else { + this.effectRoute.splice(index, 0, effect); + } + } + this.setOutput(); + if (this.source.playing) this.link(); + } + + /** + * 移除一个效果器 + * @param effect 要移除的效果 + */ + removeEffect(effect) { + const index = this.effectRoute.indexOf(effect); + if (index === -1) return; + this.effectRoute.splice(index, 1); + effect.disconnect(); + this.setOutput(); + if (this.source.playing) this.link(); + } + + setOutput() { + const effect = this.effectRoute.at(-1); + if (!effect) this.output = this.source.output; + else this.output = effect.output; + } + + /** + * 连接音频路由图 + */ + link() { + this.effectRoute.forEach((v) => v.disconnect()); + this.effectRoute.forEach((v, i) => { + const next = this.effectRoute[i + 1]; + if (next) { + v.connect(next); + } + }); + } + + startAllEffect() { + this.effectRoute.forEach((v) => v.start()); + } + + endAllEffect() { + this.effectRoute.forEach((v) => v.end()); + } + } + + const audioPlayer = new AudioPlayer(); + + class BgmController { + constructor(player) { + this.mainGain = player.createVolumeEffect(); + this.player = player; + /** bgm音频名称的前缀 */ + this.prefix = "bgms."; + /** 每个 bgm 的音量控制器 */ + this.gain = new Map(); + + /** 正在播放的 bgm */ + this.playingBgm = ""; + /** 是否正在播放 */ + this.playing = false; + + /** 是否已经启用 */ + this.enabled = true; + /** 是否屏蔽所有的音乐切换 */ + this.blocking = false; + /** 渐变时长 */ + this.transitionTime = 2000; + } + + /** + * 设置音频渐变时长 + * @param time 渐变时长 + */ + setTransitionTime(time) { + this.transitionTime = time; + for (const [, value] of this.gain) { + value.transition.time(time); + } + } + + /** + * 屏蔽音乐切换 + */ + blockChange() { + this.blocking = true; + } + + /** + * 取消屏蔽音乐切换 + */ + unblockChange() { + this.blocking = false; + } + + /** + * 设置总音量大小 + * @param volume 音量大小 + */ + setVolume(volume) { + this.mainGain.setVolume(volume); + this._volume = volume; + } + /** + * 获取总音量大小 + */ + getVolume() { + return this.mainGain.getVolume(); + } + /** + * 设置是否启用 + * @param enabled 是否启用 + */ + setEnabled(enabled) { + if (enabled) this.resume(); + else this.stop(); + this.enabled = enabled; + } + + /** + * 设置 bgm 音频名称的前缀 + */ + setPrefix(prefix) { + this.prefix = prefix; + } + + getId(name) { + return `${this.prefix}${name}`; + } + + /** + * 根据 bgm 名称获取其 AudioRoute 实例 + * @param id 音频名称 + */ + get(id) { + return this.player.getRoute(this.getId(id)); + } + + /** + * 添加一个 bgm + * @param id 要添加的 bgm 的名称 + * @param url 指定 bgm 的加载地址 + */ + addBgm(id, url = `project/bgms/${id}`) { + const type = guessTypeByExt(id); + if (!type) { + console.warn( + "Unknown audio extension name: '" + + id.split(".").slice(0, -1).join(".") + + "'" + ); + return; + } + const gain = this.player.createVolumeEffect(); + if (isAudioSupport(type)) { + const source = audioPlayer.createElementSource(); + source.setSource(url); + source.setLoop(true); + const route = new AudioRoute(source, audioPlayer); + route.addEffect([gain, this.mainGain]); + audioPlayer.addRoute(this.getId(id), route); + this.setTransition(id, route, gain); + } else { + const source = audioPlayer.createStreamSource(); + const stream = new StreamLoader(url); + stream.pipe(source); + source.setLoop(true); + const route = new AudioRoute(source, audioPlayer); + route.addEffect([gain, this.mainGain]); + audioPlayer.addRoute(this.getId(id), route); + this.setTransition(id, route, gain); + } + } + + /** + * 移除一个 bgm + * @param id 要移除的 bgm 的名称 + */ + removeBgm(id) { + this.player.removeRoute(this.getId(id)); + const gain = this.gain.get(id); + gain?.transition.ticker.destroy(); + this.gain.delete(id); + } + + setTransition(id, route, gain) { + const transition = new Transition(); + transition + .time(this.transitionTime) + .mode(linear()) + .transition("volume", 0); + + const tick = () => { + gain.setVolume(transition.value.volume); + }; + + /** + * @param expect 在结束时应该是正在播放还是停止 + */ + const setTick = async (expect) => { + transition.ticker.remove(tick); + transition.ticker.add(tick); + const identifier = route.stopIdentifier; + await sleep(this.transitionTime + 500); + if (route.status === expect && identifier === route.stopIdentifier) { + transition.ticker.remove(tick); + if (route.status === AudioStatus.Playing) { + gain.setVolume(1); + } else { + gain.setVolume(0); + } + } + }; + + route.onStart(async () => { + transition.transition("volume", 1); + setTick(AudioStatus.Playing); + }); + route.onEnd(() => { + transition.transition("volume", 0); + setTick(AudioStatus.Paused); + }); + route.setEndTime(this.transitionTime); + + this.gain.set(id, { effect: gain, transition }); + } + + /** + * 播放一个 bgm + * @param id 要播放的 bgm 名称 + */ + play(id, when) { + if (this.blocking) return; + if (id !== this.playingBgm && this.playingBgm) { + this.player.pause(this.getId(this.playingBgm)); + } + this.playingBgm = id; + if (!this.enabled) return; + this.player.play(this.getId(id), when); + this.playing = true; + } + + /** + * 继续当前的 bgm + */ + resume() { + if (this.blocking || !this.enabled || this.playing) return; + if (this.playingBgm) { + this.player.resume(this.getId(this.playingBgm)); + } + this.playing = true; + } + + /** + * 暂停当前的 bgm + */ + pause() { + if (this.blocking || !this.enabled) return; + if (this.playingBgm) { + this.player.pause(this.getId(this.playingBgm)); + } + this.playing = false; + } + + /** + * 停止当前的 bgm + */ + stop() { + if (this.blocking || !this.enabled) return; + if (this.playingBgm) { + this.player.stop(this.getId(this.playingBgm)); + } + this.playing = false; + } + } + const bgmController = new BgmController(audioPlayer); + + class SoundPlayer { + constructor(player) { + /** 每个音效的唯一标识符 */ + this.num = 0; + this.enabled = true; + this.gain = player.createVolumeEffect(); + /** 每个音效的数据 */ + this.buffer = new Map(); + /** 所有正在播放的音乐 */ + this.playing = new Set(); + this.player = player; + } + /** + * 设置是否启用音效 + * @param enabled 是否启用音效 + */ + setEnabled(enabled) { + if (!enabled) this.stopAllSounds(); + this.enabled = enabled; + } + + /** + * 设置音量大小 + * @param volume 音量大小 + */ + setVolume(volume) { + this.gain.setVolume(volume); + } + /** + * 获取音量大小 + */ + getVolume() { + return this.gain.getVolume(); + } + /** + * 添加一个音效 + * @param id 音效名称 + * @param data 音效的Uint8Array数据 + */ + async add(id, data) { + const buffer = await this.player.decodeAudioData(data); + if (!buffer) { + console.warn( + "Cannot decode sound '" + + id + + "', since audio file may not supported by 2.b." + ); + return; + } + this.buffer.set(id, buffer); + } + + /** + * 播放一个音效 + * @param id 音效名称 + * @param position 音频位置,[0, 0, 0]表示正中心,x轴指向水平向右,y轴指向水平向上,z轴指向竖直向上 + * @param orientation 音频朝向,[0, 1, 0]表示朝向前方 + */ + play(id, position = [0, 0, 0], orientation = [1, 0, 0]) { + if (!this.enabled || !id) return -1; + const buffer = this.buffer.get(id); + if (!buffer) { + console.warn( + "Cannot play sound '" + + id + + "', since there is no added data named it." + ); + return -1; + } + const soundNum = this.num++; + + const source = this.player.createBufferSource(); + source.setBuffer(buffer); + const route = this.player.createRoute(source); + const stereo = this.player.createStereoEffect(); + stereo.setPosition(position[0], position[1], position[2]); + stereo.setOrientation(orientation[0], orientation[1], orientation[2]); + route.addEffect([stereo, this.gain]); + this.player.addRoute(`sounds.${soundNum}`, route); + route.play(); + source.output.addEventListener("ended", () => { + this.playing.delete(soundNum); + }); + this.playing.add(soundNum); + return soundNum; + } + + /** + * 停止一个音效 + * @param num 音效的唯一 id + */ + stop(num) { + const id = `sounds.${num}`; + const route = this.player.getRoute(id); + if (route) { + route.stop(); + this.player.removeRoute(id); + this.playing.delete(num); + } + } + + /** + * 停止播放所有音效 + */ + stopAllSounds() { + this.playing.forEach((v) => { + const id = `sounds.${v}`; + const route = this.player.getRoute(id); + if (route) { + route.stop(); + this.player.removeRoute(id); + } + }); + this.playing.clear(); + } + } + const soundPlayer = new SoundPlayer(audioPlayer); + + function loadAllBgm() { + const data = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d; + for (const bgm of data.main.bgms) { + bgmController.addBgm(bgm); + } + } + loadAllBgm(); + AudioDecoder.registerDecoder(AudioType.Ogg, VorbisDecoder); + AudioDecoder.registerDecoder(AudioType.Opus, OpusDecoder); + + core.plugin.audioSystem = { + AudioType, + AudioDecoder, + AudioStatus, + checkAudioType, + isAudioSupport, + audioPlayer, + soundPlayer, + bgmController, + guessTypeByExt, + BgmController, + SoundPlayer, + EchoEffect, + DelayEffect, + ChannelVolumeEffect, + VolumeEffect, + StereoEffect, + AudioEffect, + AudioPlayer, + AudioRoute, + AudioStreamSource, + AudioElementSource, + AudioBufferSource, + loadAllBgm, + StreamLoader, + }; + //bgm相关复写 + control.prototype.playBgm = (bgm, when) => { + bgm = core.getMappedName(bgm); + bgmController.play(bgm, when); + core.setMusicBtn(); + }; + control.prototype.pauseBgm = () => { + bgmController.pause(); + core.setMusicBtn(); + }; + + control.prototype.resumeBgm = function () { + bgmController.resume(); + core.setMusicBtn(); + }; + control.prototype.checkBgm = function () { + core.playBgm(bgmController.playingBgm || main.startBgm); + }; + control.prototype.triggerBgm = function () { + core.musicStatus.bgmStatus = !core.musicStatus.bgmStatus; + if (bgmController.playing) bgmController.pause(); + else bgmController.resume(); + core.setMusicBtn(); + core.setLocalStorage("bgmStatus", core.musicStatus.bgmStatus); + }; + //sound相关复写 + control.prototype.playSound = function ( + sound, + _pitch, + callback, + position, + orientation + ) { + if (main.mode != "play" || !core.musicStatus.soundStatus) return; + const name = core.getMappedName(sound); + const num = soundPlayer.play(name, position, orientation); + const route = audioPlayer.getRoute(`sounds.${num}`); + if (!route) { + callback?.(); + return -1; + } else { + sleep(route.duration * 1000).then(() => callback?.()); + return num; + } + }; + control.prototype.stopSound = function (id) { + if (isNil(id)) { + soundPlayer.stopAllSounds(); + } else { + soundPlayer.stop(id); + } + }; + control.prototype.getPlayingSounds = function () { + return [...soundPlayer.playing]; + }; + //sound加载复写 + loader.prototype._loadOneSound_decodeData = function (name, data) { + if (data instanceof Blob) { + var blobReader = new zip.BlobReader(data); + blobReader.init(function () { + blobReader.readUint8Array(0, blobReader.size, function (uint8) { + //core.loader._loadOneSound_decodeData(name, uint8.buffer); + soundPlayer.add(name, uint8); + }); + }); + return; + } + if (data instanceof ArrayBuffer) { + const uint8 = new Uint8Array(data); + soundPlayer.add(name, uint8); + } + }; + //音量控制复写 + soundPlayer.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + bgmController.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + actions.prototype._clickSwitchs_sounds_userVolume = function (delta) { + var value = Math.round(Math.sqrt(100 * core.musicStatus.userVolume)); + if (value == 0 && delta < 0) return; + core.musicStatus.userVolume = core.clamp( + Math.pow(value + delta, 2) / 100, + 0, + 1 + ); + //audioContext 音效 不受designVolume 影响 + if (core.musicStatus.gainNode != null) + core.musicStatus.gainNode.gain.value = core.musicStatus.userVolume; + soundPlayer.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + bgmController.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + core.setLocalStorage("userVolume", core.musicStatus.userVolume); + core.playSound("确定"); + core.ui._drawSwitchs_sounds(); }; }, "自定义常用事件": function () { @@ -12724,424 +12487,434 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "小地图": function () { - // 在此增加新插件 - // ----- 不可自定义 杂七杂八的变量 - /** @type {{[x: string]: BFSResult}} */ - let mapCache = {}; // 地图缓存 - let drawCache = {}; // 绘制信息缓存 - let status = "none"; // 当前的绘制状态 - /** @type {{[x: string]: Sprite}} */ - let sprites = {}; // 当前所有的sprite - /** @type {{[x: string]: Sprite}} */ - let canDrag = {}; // 可以拖拽的sprite - /** @type {{[x: string]: Button}} */ - let areaSprite = {}; // 区域列表对应的sprite - let clicking = false; // 是否正在点击,用于拖拽判定 - let drawingMap = ""; // 正在绘制的中心楼层 - let nowScale = 0; // 当前绘制的放缩比例 - let lastTouch = {}; // 上一次的单点点击信息 - let lastLength = 0; // 手机端缩放时上一次的两指间距离 - let nowDepth = 0; // 当前的遍历深度 - let drawedThumbnail = {}; // 已经绘制过的缩略图 - let moved = false; // 鼠标按下后是否移动了 - let noBorder = false; // 是否是无边框拼接模式 - let lastScale = 0; // 上一次缩放,用于优化缩略图绘制 - let areaPage = 0; // 区域显示的当前页数 - let nowArea = 0; // 当前区域index - let selecting = ""; // 选择时当前正在选择的地图 + // 在此增加新插件 + // ----- 不可自定义 杂七杂八的变量 + /** @type {{[x: string]: BFSResult}} */ + let mapCache = {}; // 地图缓存 + let drawCache = {}; // 绘制信息缓存 + let status = "none"; // 当前的绘制状态 + /** @type {{[x: string]: Sprite}} */ + let sprites = {}; // 当前所有的sprite + /** @type {{[x: string]: Sprite}} */ + let canDrag = {}; // 可以拖拽的sprite + /** @type {{[x: string]: Button}} */ + let areaSprite = {}; // 区域列表对应的sprite + let clicking = false; // 是否正在点击,用于拖拽判定 + let drawingMap = ""; // 正在绘制的中心楼层 + let nowScale = 0; // 当前绘制的放缩比例 + let lastTouch = {}; // 上一次的单点点击信息 + let lastLength = 0; // 手机端缩放时上一次的两指间距离 + let nowDepth = 0; // 当前的遍历深度 + let drawedThumbnail = {}; // 已经绘制过的缩略图 + let moved = false; // 鼠标按下后是否移动了 + let noBorder = false; // 是否是无边框拼接模式 + let lastScale = 0; // 上一次缩放,用于优化缩略图绘制 + let areaPage = 0; // 区域显示的当前页数 + let nowArea = 0; // 当前区域index + let selecting = ""; // 选择时当前正在选择的地图 - // ---- 不可自定义,常量 - /** @type {Area} */ - let areas = []; // 区域信息 - const perPage = Math.floor((core._PY_ - 60) / 30); // 区域的每页显示数量 + // ---- 不可自定义,常量 + /** @type {Area} */ + let areas = []; // 区域信息 + const perPage = Math.floor((core._PY_ - 60) / 30); // 区域的每页显示数量 - // ---- 可自定义,默认的切换地图的图块id - const defaultChange = { - left: "leftPortal", // 左箭头 - up: "upPortal", // 上箭头 - right: "rightPortal", // 右箭头 - down: "downPortal", // 下箭头 - upFloor: "upFloor", // 上楼 - downFloor: "downFloor", // 下楼 - }; - // ---- 可自定义,默认数值 - const defaultValue = { - font: "Verdana", // 默认字体 - scale: 60, // 默认地图缩放比例 - depth: Infinity, // 默认的遍历深度 - }; + // ---- 可自定义,默认的切换地图的图块id + const defaultChange = { + left: "leftPortal", // 左箭头 + up: "upPortal", // 上箭头 + right: "rightPortal", // 右箭头 + down: "downPortal", // 下箭头 + upFloor: "upFloor", // 上楼 + downFloor: "downFloor", // 下楼 + }; + // ---- 可自定义,默认数值 + const defaultValue = { + font: "Verdana", // 默认字体 + scale: 60, // 默认地图缩放比例 + depth: Infinity, // 默认的遍历深度 + }; - // ---- 不可自定义,计算数据 - const dirData = { - up: [1, 0], - down: [-1, 0], - left: [0, 1], - right: [0, -1], - upFloor: [0, 0], - downFloor: [0, 0], - }; - let ignoreEnemies = (this.ignoreEnemies = []); + // ---- 不可自定义,计算数据 + const dirData = { + up: [1, 0], + down: [-1, 0], + left: [0, 1], + right: [0, -1], + upFloor: [0, 0], + downFloor: [0, 0], + }; + let ignoreEnemies = (this.ignoreEnemies = []); - let allChangeEntries = Object.entries(defaultChange); + let allChangeEntries = Object.entries(defaultChange); - this.setq = function (floorId) { - core.setFlag("任务地点", floorId); - }; + this.setq = function (floorId) { + core.setFlag("任务地点", floorId); + }; - const reset = core.events.resetGame; - this.bfs = function () { - areas = []; - // 获取所有分区,使用异步函数,保证不会卡顿 - // 原理是用bfs扫,将所有连在一起的地图合并成一个区域 - (async function () { - let all = core.floorIds.slice(); - const scanned = { - [all[0]]: true, - }; - while (all.length > 0) { - let now = all.shift(); - if (core.status.maps[now].deleted) continue; - if (!now) return; - await new Promise((res) => { - const result = core.plugin.bfsSearch(now, Infinity, true); - mapCache[`${now}_Infinity_false`] = result; - areas.push({ name: core.floors[now].areas, maps: result.order }); - for (const map of result.order) { - scanned[map] = true; - all = all.filter((v) => !result.order.includes(v)); - } - res("success"); - }).then(() => { - core.setFlag("areas", areas); - }); - } - })(); - }; - core.events.resetGame = function () { - reset.apply(core.events, arguments); - core.plugin.bfs(); - }; - /** - * 广度优先搜索搜索地图路径 - * @param {string} center 中心地图的id - * @param {number} depth 搜索深度 - * @param {boolean} noCache 是否不使用缓存 - * @returns {BFSResult} 格式:floorId_x_y_dir: floorId_x_y - */ - this.bfsSearch = function bfsSearch(center, depth, noCache) { - // 检查缓存 - const id = `${center}_${depth}_${noBorder}`; - if (mapCache[id] && !noCache) return mapCache[id]; - const used = { - [center]: true, - }; // 搜索过的楼层 - let queue = []; - let stack = [center]; // 当前栈 - let nowDepth = -1; - const mapOrder = [center]; // 遍历顺序,顺便还能记录遍历了哪些楼层 + const reset = core.events.resetGame; + this.bfs = function () { + areas = []; + // 获取所有分区,使用异步函数,保证不会卡顿 + // 原理是用bfs扫,将所有连在一起的地图合并成一个区域 + (async function () { + let all = core.floorIds.slice(); + const scanned = { + [all[0]]: true, + }; + while (all.length > 0) { + let now = all.shift(); + if (core.status.maps[now].deleted) continue; + if (!now) return; + await new Promise((res) => { + const result = core.plugin.bfsSearch(now, Infinity, true); + mapCache[`${now}_Infinity_false`] = result; + areas.push({ name: core.floors[now].areas, maps: result.order }); + for (const map of result.order) { + scanned[map] = true; + all = all.filter((v) => !result.order.includes(v)); + } + res("success"); + }).then(() => { + core.setFlag("areas", areas); + }); + } + })(); + }; + core.events.resetGame = function () { + reset.apply(core.events, arguments); + core.plugin.bfs(); + }; + /** + * 广度优先搜索搜索地图路径 + * @param {string} center 中心地图的id + * @param {number} depth 搜索深度 + * @param {boolean} noCache 是否不使用缓存 + * @returns {BFSResult} 格式:floorId_x_y_dir: floorId_x_y + */ + this.bfsSearch = function bfsSearch(center, depth, noCache) { + // 检查缓存 + const id = `${center}_${depth}_${noBorder}`; + if (mapCache[id] && !noCache) return mapCache[id]; + const used = { + [center]: true, + }; // 搜索过的楼层 + let queue = []; + let stack = [center]; // 当前栈 + let nowDepth = -1; + const mapOrder = [center]; // 遍历顺序,顺便还能记录遍历了哪些楼层 - const res = {}; // 输出结果,格式:floorId_x_y_dir: floorId_x_y - const enemies = {}; - const upOrDown = {}; - const mapdir = {}; - // 开始循环搜索 - while (nowDepth < depth && stack.length > 0) { - const now = stack.shift(); // 当前id - if (core.status.maps[now].deleted) continue; - mapdir[now] = mapdir[now] ?? []; - const blocks = core.getMapBlocksObj(now); // 获取当前地图的每点的事件 - enemies[now] = {}; - // 遍历,获取可以传送的点,只检测绿点事件,因此可用红点事件进行传送来实现分区功能 - for (const i in blocks) { - const block = blocks[i]; - // 整合漏怪检测,所以要检测怪物 - if (block.event.trigger === "battle") { - const id = block.event.id; - if (ignoreEnemies.includes(id)) continue; - else enemies[now][i] = block.event.id; - continue; - } - // 检测触发器是否为切换楼层,不是则直接跳过 - if (block.event.trigger !== "changeFloor") continue; - const dirEntries = allChangeEntries.find( - (v) => v[1] === block.event.id - ); - // 如果不是那六种传送门,直接忽略 - if (!dirEntries) continue; - const data = block.event.data; - const dir = dirEntries[0]; - const route = now + "_" + i.replace(",", "_") + "_" + dir; - const target = data.floorId + "_" + data.loc.join("_"); + const res = {}; // 输出结果,格式:floorId_x_y_dir: floorId_x_y + const enemies = {}; + const upOrDown = {}; + const mapdir = {}; + // 开始循环搜索 + while (nowDepth < depth && stack.length > 0) { + const now = stack.shift(); // 当前id + if (core.status.maps[now].deleted) continue; + mapdir[now] = mapdir[now] ?? []; + const blocks = core.getMapBlocksObj(now); // 获取当前地图的每点的事件 + enemies[now] = {}; + // 遍历,获取可以传送的点,只检测绿点事件,因此可用红点事件进行传送来实现分区功能 + for (const i in blocks) { + const block = blocks[i]; + // 整合漏怪检测,所以要检测怪物 + if (block.event.trigger === "battle") { + const id = block.event.id; + if (ignoreEnemies.includes(id)) continue; + else enemies[now][i] = block.event.id; + continue; + } + // 检测触发器是否为切换楼层,不是则直接跳过 + if (block.event.trigger !== "changeFloor") continue; + const dirEntries = allChangeEntries.find( + (v) => v[1] === block.event.id + ); + // 如果不是那六种传送门,直接忽略 + if (!dirEntries) continue; + const data = block.event.data; + const dir = dirEntries[0]; + const route = now + "_" + i.replace(",", "_") + "_" + dir; + const target = data.floorId + "_" + data.loc.join("_"); - mapdir[now].push(dir); - if (!used[data.floorId]) { - if (dir === "upFloor" || dir === "downFloor") { - upOrDown[now] = upOrDown[id] ?? []; - upOrDown[now].push(dir); - } + mapdir[now].push(dir); + if (!used[data.floorId]) { + if (dir === "upFloor" || dir === "downFloor") { + upOrDown[now] = upOrDown[id] ?? []; + upOrDown[now].push(dir); + } - queue.push(data.floorId); // 没有搜索过,则加入栈中 - mapOrder.push(data.floorId); - used[data.floorId] = true; - } - res[route] = target; - } - if (stack.length === 0) { - stack = queue; - queue = []; - nowDepth++; - } - if (stack.length === 0 && queue.length === 0) break; - } - return { res, order: mapOrder, enemies, upOrDown, mapdir }; - }; - /** - * 获取绘制信息 - * @param {string?} center 中心地图id - * @param {number?} depth 搜索深度 - * @param {boolean?} noCache 是否不使用缓存 - * @returns {MapDrawInfo} - */ - this.getMapDrawInfo = function ( - center = core.status.floorId, - depth = defaultValue.depth, - noCache = false - ) { - nowDepth = depth; - drawingMap = center; - const id = `${center}_${depth}_${noBorder}`; - // 检查缓存 - if (drawCache[id] && !noCache) return drawCache[id]; - const map = core.plugin.bfsSearch(center, depth, noCache); - mapCache[id] = map; - const res = getDrawInfo(map.res, center, map.order); - res.upOrDown = map.upOrDown; - res.mapdir = map.mapdir; - drawCache[id] = res; - return res; - }; - /** - * 提供地图的绘制信息 - * @param {{[x: string]: string}} map 要绘制的地图,格式:floorId_x_y_dir: floorId_x_y - * @param {string} center 中心地图的id - * @param {string[]} order 遍历顺序 - * @returns {MapDrawInfo} 地图的绘制信息 - */ + queue.push(data.floorId); // 没有搜索过,则加入栈中 + mapOrder.push(data.floorId); + used[data.floorId] = true; + } + res[route] = target; + } + if (stack.length === 0) { + stack = queue; + queue = []; + nowDepth++; + } + if (stack.length === 0 && queue.length === 0) break; + } + return { res, order: mapOrder, enemies, upOrDown, mapdir }; + }; + /** + * 获取绘制信息 + * @param {string?} center 中心地图id + * @param {number?} depth 搜索深度 + * @param {boolean?} noCache 是否不使用缓存 + * @returns {MapDrawInfo} + */ + this.getMapDrawInfo = function ( + center = core.status.floorId, + depth = defaultValue.depth, + noCache = false + ) { + nowDepth = depth; + drawingMap = center; + const id = `${center}_${depth}_${noBorder}`; + // 检查缓存 + if (drawCache[id] && !noCache) return drawCache[id]; + const map = core.plugin.bfsSearch(center, depth, noCache); + mapCache[id] = map; + const res = getDrawInfo(map.res, center, map.order); + res.upOrDown = map.upOrDown; + res.mapdir = map.mapdir; + drawCache[id] = res; + return res; + }; + /** + * 提供地图的绘制信息 + * @param {{[x: string]: string}} map 要绘制的地图,格式:floorId_x_y_dir: floorId_x_y + * @param {string} center 中心地图的id + * @param {string[]} order 遍历顺序 + * @returns {MapDrawInfo} 地图的绘制信息 + */ - function getDrawInfo(map, center, order) { - // 先根据地图id分类,从而确定每个地图连接哪些地图,同时方便处理 - const links = {}; - for (const i in map) { - const splitted = i.split("_"); - const id = splitted[0]; - if (!links[id]) links[id] = {}; - links[id][i] = map[i]; - } + function getDrawInfo(map, center, order) { + // 先根据地图id分类,从而确定每个地图连接哪些地图,同时方便处理 + const links = {}; + for (const i in map) { + const splitted = i.split("_"); + const id = splitted[0]; + if (!links[id]) links[id] = {}; + links[id][i] = map[i]; + } - // 分类完毕,然后根据连接点先计算出各个地图的坐标,然后再进行判断 - const centerFloor = core.status.maps[center]; - const visitedCenter = core.hasVisitedFloor(center); - const locs = { - // 格式:[中心x, 中心y, 宽, 高, 是否到达过] - [center]: [2, 2, 1, 1, visitedCenter], - }; - // 可以上楼下楼的地图 - const upOrDown = {}; - for (const id of order) { - const now = links[id]; - // 遍历每一个地图的连接情况 - for (const from in now) { - const to = now[from]; - // 先根据from to计算物理位置 - const fromData = from.split("_"), - toData = to.split("_"); - const dir = fromData[3]; - if (dir === "upFloor" || dir === "downFloor") continue; - if (!defaultChange[dir]) continue; - const v = dirData[dir][1], // 竖直数值 - h = dirData[dir][0], // 水平数值 - ha = Math.abs(h), - va = Math.abs(v); - const ff = id, // fromFloorId - tf = toData[0]; // toFloorId - const fromFloor = core.status.maps[ff], - toFloor = core.status.maps[tf]; - const fhw = Math.floor(fromFloor.width / 2), // fromFloorHalfWidth - fhh = Math.floor(fromFloor.height / 2), - thw = Math.floor(toFloor.width / 2), - thh = Math.floor(toFloor.height / 2); - const fLoc = locs[id] ?? [0, 0]; - if (!locs[ff]) continue; - let x, y; - if (locs && locs[tf]) { - x = locs[tf][0]; - y = locs[tf][1]; - } else { - // 计算坐标,公式可以通过画图推断出 - x = fLoc[0] - v; - y = fLoc[1] - h; - } - locs[tf] = locs[tf] ?? [x, y, 1, 1, core.hasVisitedFloor(tf)]; - } - } - // 获取地图绘制需要的长宽 - let width = 0, - height = 0; - let left, right, up, down; - for (const id in locs) { - const [x, y, w, h] = locs[id]; - if (left === void 0) { - left = right = x; - up = down = y; - } - left = Math.min(x - 1, left); - right = Math.max(x + 1, right); - up = Math.min(y - 1, up); - down = Math.max(y + 1, down); - } - width = right - left; - height = down - up; + // 分类完毕,然后根据连接点先计算出各个地图的坐标,然后再进行判断 + const centerFloor = core.status.maps[center]; + const visitedCenter = core.hasVisitedFloor(center); + const locs = { + // 格式:[中心x, 中心y, 宽, 高, 是否到达过] + [center]: [2, 2, 1, 1, visitedCenter], + }; + // 可以上楼下楼的地图 + const upOrDown = {}; + for (const id of order) { + const now = links[id]; + // 遍历每一个地图的连接情况 + for (const from in now) { + const to = now[from]; + // 先根据from to计算物理位置 + const fromData = from.split("_"), + toData = to.split("_"); + const dir = fromData[3]; + if (dir === "upFloor" || dir === "downFloor") continue; + if (!defaultChange[dir]) continue; + const v = dirData[dir][1], // 竖直数值 + h = dirData[dir][0], // 水平数值 + ha = Math.abs(h), + va = Math.abs(v); + const ff = id, // fromFloorId + tf = toData[0]; // toFloorId + const fromFloor = core.status.maps[ff], + toFloor = core.status.maps[tf]; + const fhw = Math.floor(fromFloor.width / 2), // fromFloorHalfWidth + fhh = Math.floor(fromFloor.height / 2), + thw = Math.floor(toFloor.width / 2), + thh = Math.floor(toFloor.height / 2); + const fLoc = locs[id] ?? [0, 0]; + if (!locs[ff]) continue; + let x, y; + if (locs && locs[tf]) { + x = locs[tf][0]; + y = locs[tf][1]; + } else { + // 计算坐标,公式可以通过画图推断出 + x = fLoc[0] - v; + y = fLoc[1] - h; + } + locs[tf] = locs[tf] ?? [x, y, 1, 1, core.hasVisitedFloor(tf)]; + } + } + // 获取地图绘制需要的长宽 + let width = 0, + height = 0; + let left, right, up, down; + for (const id in locs) { + const [x, y, w, h] = locs[id]; + if (left === void 0) { + left = right = x; + up = down = y; + } + left = Math.min(x - 1, left); + right = Math.max(x + 1, right); + up = Math.min(y - 1, up); + down = Math.max(y + 1, down); + } + width = right - left; + height = down - up; - return { locs, width, height, layer: upOrDown }; - } + return { locs, width, height, layer: upOrDown }; + } - function mapblock(mapdir) { - let mb = ""; - if (mapdir.includes("up")) mb += "u"; - if (mapdir.includes("down")) mb += "d"; - if (mapdir.includes("left")) mb += "l"; - if (mapdir.includes("right")) mb += "r"; - return mb ? mb + ".webp" : "null.webp"; - } - core.animateFrame.globalAlphaFloor = 0; - core.animateFrame.globalAlphaFloorStatus = 1; + function mapblock(mapdir) { + let mb = ""; + if (mapdir.includes("up")) mb += "u"; + if (mapdir.includes("down")) mb += "d"; + if (mapdir.includes("left")) mb += "l"; + if (mapdir.includes("right")) mb += "r"; + return mb ? mb + ".webp" : "null.webp"; + } + core.animateFrame.globalAlphaFloor = 0; + core.animateFrame.globalAlphaFloorStatus = 1; - const tesk = document.createElement("canvas"); - tesk.width = 300; - tesk.height = 300; - const teskctx = tesk.getContext("2d"); + const tesk = document.createElement("canvas"); + tesk.width = 300; + tesk.height = 300; + const teskctx = tesk.getContext("2d"); - let line = 50; - teskctx.strokeStyle = "green"; - teskctx.fillStyle = "green"; - let now = 0; - core.registerAnimationFrame("tesk", true, function (timestamp) { - if (timestamp - now > 1000 / 60) { - now = timestamp; - core.clearMap(teskctx); - teskctx.lineWidth = 150 - line; + let line = 50; + teskctx.strokeStyle = "green"; + teskctx.fillStyle = "green"; + let now = 0; + core.registerAnimationFrame("tesk", true, function (timestamp) { + if (timestamp - now > 1000 / 60) { + now = timestamp; + core.clearMap(teskctx); + teskctx.lineWidth = 150 - line; - if (line <= 150) { - teskctx.beginPath(); - teskctx.arc(150, 150, line, 0, Math.PI * 2); - line += 2; - teskctx.stroke(); - } else { - teskctx.beginPath(); - teskctx.arc(150, 150, line - 150, 0, Math.PI * 2); - line += 2; - teskctx.fill(); - if (line >= 250) line = 50; - } - } - }); + if (line <= 150) { + teskctx.beginPath(); + teskctx.arc(150, 150, line, 0, Math.PI * 2); + line += 2; + teskctx.stroke(); + } else { + teskctx.beginPath(); + teskctx.arc(150, 150, line - 150, 0, Math.PI * 2); + line += 2; + teskctx.fill(); + if (line >= 250) line = 50; + } + } + }); - /** - * 绘制小地图 - * @param {MapDrawInfo} info 地图绘制信息 - * @param {number} scale 地图的绘制比例 - */ - this.drawSmallMap = function ( - ctx, - info, - center, - sx, - sy, - sw, - sh, - scale = defaultValue.scale - ) { - core.clearMap(ctx, sx, sy, sw + 40, sh + 60); - if (core.domStyle.isVertical) { - sy += 50; - sx += 15; - } else { - sy += 60; - sx += 30; - } - core.fillRect(ctx, sx, sy, sw, sh, "#000"); - core.strokeRect(ctx, sx, sy, sw, sh, "#fff", 5); - core.setTextAlign("outerUI", "center"); - core.fillBoldText1( - ctx, - core.status.maps[center].areas, - sx + sw / 2, - sy - 10, - "#FFFFFF", - "#000000", - 6, - "bold 42px Verdana" - ); - const locs = info.locs; - for (const id in locs) { - const loc = locs[id]; - let color = "#000"; - if (!loc[4]) color = "#f0f"; - const [x, y, w, h] = loc.map((v) => typeof v === "number" && v * scale); - const fx = x + sx, - fy = y + sy; - const mapdir = info.mapdir[id]; - const img = mapblock(mapdir); - if (x < 0 || x > 4 * scale || y < 0 || y > 4 * scale) continue; - core.drawImage(ctx, img, 0, 0, 60, 60, fx, fy, w, h); - const layer = info.upOrDown[id]; - const min = Math.min(w, h); - if (core.getFlag("任务地点") && core.getFlag("任务地点") === id) - ctx.drawImage(tesk, fx + min / 4, fy + min / 4, min / 2, min / 2); - if (layer?.includes("upFloor")) - core.drawIcon( - ctx, - defaultChange.upFloor, - fx + min / 4, - fy + min / 4, - min / 2, - min / 2 - ); - if (layer?.includes("downFloor")) - core.drawIcon( - ctx, - defaultChange.downFloor, - fx + min / 4, - fy + min / 4, - min / 2, - min / 2 - ); + /** + * 绘制小地图 + * @param {MapDrawInfo} info 地图绘制信息 + * @param {number} scale 地图的绘制比例 + */ + this.drawSmallMap = function ( + ctx, + info, + center, + sx, + sy, + sw, + sh, + scale = defaultValue.scale + ) { + core.clearMap(ctx, sx, sy, sw + 40, sh + 60); + if (core.domStyle.isVertical) { + sy += 50; + sx += 15; + } else { + sy += 60; + sx += 30; + } + core.fillRect(ctx, sx, sy, sw, sh, "#000"); + core.strokeRect(ctx, sx, sy, sw, sh, "#fff", 5); + core.setTextAlign("outerUI", "center"); + core.fillBoldText1( + ctx, + core.status.maps[center].areas, + sx + sw / 2, + sy - 10, + "#FFFFFF", + "#000000", + 6, + "bold 42px Verdana" + ); + const locs = info.locs; + for (const id in locs) { + const loc = locs[id]; + let color = "#000"; + if (!loc[4]) color = "#f0f"; + const [x, y, w, h] = loc.map((v) => typeof v === "number" && v * scale); + const fx = x + sx, + fy = y + sy; + const mapdir = info.mapdir[id]; + const img = mapblock(mapdir); + if (x < 0 || x > 4 * scale || y < 0 || y > 4 * scale) continue; + core.drawImage(ctx, img, 0, 0, 60, 60, fx, fy, w, h); + const layer = info.upOrDown[id]; + const min = Math.min(w, h); - // 显示漏怪数量 - if (core.getFlag("showEnemy")) { - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - const c = drawingMap + "_" + nowDepth + "_" + noBorder; - const n = Object.keys(mapCache[c].enemies[id]).length; - color = "#fff"; - if (n > 10) color = "#fc3"; - if (n > 20) color = "#f22"; - ctx.shadowBlur = 0.6 * nowScale; - ctx.shadowColor = "#000"; - if (n > 0) - core.fillText( - ctx, - n, - fx + (w * 3) / 10, - fy + (h * 7) / 10, - color, - 22 + "px normal" - ); - ctx.shadowBlur = 0; - } - } - }; - }, + + if (layer?.includes("upFloor")) + core.drawIcon( + ctx, + defaultChange.upFloor, + fx + min / 4, + fy + min / 4, + min / 2, + min / 2 + ); + if (layer?.includes("downFloor")) + core.drawIcon( + ctx, + defaultChange.downFloor, + fx + min / 4, + fy + min / 4, + min / 2, + min / 2 + ); + if (core.getFlag("任务地点") && core.getFlag("任务地点") === id) + ctx.drawImage(tesk, fx + min / 4, fy + min / 4, min / 2, min / 2); + if (id === core.status.floorId) core.drawImage(ctx, "hero.webp", + 0, + 0, + 32, + 19, fx + min / 4, fy + min * 5 / 16, 32, 19); + // 显示漏怪数量 + if (core.getFlag("showEnemy")) { + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + const c = drawingMap + "_" + nowDepth + "_" + noBorder; + const n = Object.keys(mapCache[c].enemies[id]).length; + color = "#fff"; + if (n > 10) color = "#fc3"; + if (n > 20) color = "#f22"; + ctx.shadowBlur = 0.6 * nowScale; + ctx.shadowColor = "#000"; + if (n > 0) + core.fillText( + ctx, + n, + fx + (w * 3) / 10, + fy + (h * 7) / 10, + color, + 22 + "px normal" + ); + ctx.shadowBlur = 0; + } + if (!core.hasVisitedFloor(id)) { + core.fillRect(ctx, fx, fy, w, h, "rgba(0,0,0,0.7)") + core.fillText(ctx, "?", fx + min / 2, fy + min * 3 / 4, "#FFFFFF", "bold 42px Verdana") + } + } + }; +}, "楼传": function () { // 在此增加新插件 @@ -13528,20 +13301,30 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = if ( !core.status.maps[core.floorIds[page]].canFlyTo || !core.hasVisitedFloor(core.floorIds[page]) - ) + ) { + /*core.fillRect("ui", 58, + 58, + size - 50, + size - 50, "rgba(0,0,0,0.5)")*/ + core.getContextByName("ui").globalAlpha = 0.7 + core.drawImage( "ui", - "lock.webp", + "miwu.webp", 0, 0, size, size, 58, 58, - size - 8, - size - 8 + size - 50, + size - 50 ); - + core.getContextByName("ui").globalAlpha = 1 + /*core.fillText("ui", '?', 188, + 278, + "rgba(255,255,255,0.2)", this._buildFont(250, true))*/ + } core.fillRoundRect( "ui", 15 + 44 - 2, @@ -13767,7 +13550,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = title, 15 - 4 + size - 4 + 45, 85, - "#FFFFFF", + core.hasVisitedFloor(floorId) ? "#FFFFFF" : "#444444", "#000000", 18 ); @@ -14258,511 +14041,508 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ); }, "CG回廊": function () { - // 在此增加新插件 - const CGUI = document.createElement("canvas"); //CGui画布设置 - CGUI.style.position = "absolute"; - CGUI.style.zIndex = 300; - CGUI.style.display = "none"; - CGUI.id = "CGUI"; - main.dom.gameGroup.insertAdjacentElement("afterend", CGUI); - CGUI.style.top = "50%"; - CGUI.style.left = "50%"; - CGUI.style.transform = "translate(-50%,-50%)"; - const ctx = CGUI.getContext("2d"); - main.dom.CGUI = CGUI; - let page = 0; //初始页面 - let show = false; //展示状态 - CGUI.onclick = function (e) { - try { - e.preventDefault(); - if (core.isPlaying()) return false; - 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.CG.onclick(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; + // 在此增加新插件 + const CGUI = document.createElement("canvas"); //CGui画布设置 + CGUI.style.position = "absolute"; + CGUI.style.zIndex = 300; + CGUI.style.display = "none"; + CGUI.id = "CGUI"; + main.dom.gameGroup.insertAdjacentElement("afterend", CGUI); + CGUI.style.top = "50%"; + CGUI.style.left = "50%"; + CGUI.style.transform = "translate(-50%,-50%)"; + const ctx = CGUI.getContext("2d"); + main.dom.CGUI = CGUI; + let page = 0; //初始页面 + let show = false; //展示状态 + CGUI.onclick = function (e) { + try { + e.preventDefault(); + if (core.isPlaying()) return false; + 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.CG.onclick(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; - class CG { - constructor() { - this.cgs; - //cg列表 - this.UIMx = [ - //空位用‘none’填充,当前ui3*2 - [ - ["eve_010102.webp", "eve_010203.webp", "eve_010304.webp"], - ["eve_010501.webp", "eve_010601.webp", "eve_010701.webp"], - ], - [ - ["eve_010801.webp", "eve_010902.webp", "eve_011001.webp"], - ["eve_011101.webp", "eve_011202.webp", "eve_011302.webp"], - ], - [ - ["eve_011402.webp", "eve_020102.webp", "eve_020201.webp"], - ["eve_020301.webp", "eve_020401.webp", "eve_020501.webp"], - ], - [ - ["eve_020605.webp", "eve_020701.webp", "eve_020801.webp"], - ["eve_030101.webp", "eve_030206.webp", "eve_030302.webp"], - ], - [ - ["eve_030508.webp", "eve_030601.webp", "eve_030801.webp"], - ["eve_030901.webp", "eve_031002.webp", "eve_031101.webp"], - ], - [ - ["eve_040201.webp", "eve_040401.webp", "eve_040501.webp"], - ["eve_040601.webp", "eve_040702.webp", "eve_040801.webp"], - ], - [ - ["eve_050101.webp", "eve_050201.webp", "eve_050401.webp"], - ["eve_050501.webp", "eve_050601.webp", "eve_050704.webp"], - ], - [ - ["eve_050801.webp", "eve_070101.webp", "bg_1511.webp"], - ["bg_1521.webp", "bg_2011.webp", "bg_2521.webp"], - ], - [ - ["bg_3042.webp", "bg_3551.webp", "bg_3571.webp"], - ["bg_3721.webp", "bg_5033.webp", "bg_5044.webp"], - ], - ]; - } + class CG { + constructor() { + this.cgs; + //cg列表 + this.UIMx = [ + //空位用‘none’填充,当前ui3*2 + [ + ["eve_010102.webp", "eve_010203.webp", "eve_010304.webp"], + ["eve_010501.webp", "eve_010601.webp", "eve_010701.webp"], + ], + [ + ["eve_010801.webp", "eve_010902.webp", "eve_011001.webp"], + ["eve_011101.webp", "eve_011202.webp", "eve_011302.webp"], + ], + [ + ["eve_011402.webp", "eve_020102.webp", "eve_020201.webp"], + ["eve_020301.webp", "eve_020401.webp", "eve_020501.webp"], + ], + [ + ["eve_020605.webp", "eve_020701.webp", "eve_020801.webp"], + ["eve_030101.webp", "eve_030206.webp", "eve_030302.webp"], + ], + [ + ["eve_030508.webp", "eve_030601.webp", "eve_030801.webp"], + ["eve_030901.webp", "eve_031002.webp", "eve_031101.webp"], + ], + [ + ["eve_040201.webp", "eve_040401.webp", "eve_040501.webp"], + ["eve_040601.webp", "eve_040702.webp", "eve_040801.webp"], + ], + [ + ["eve_050101.webp", "eve_050201.webp", "eve_050401.webp"], + ["eve_050501.webp", "eve_050601.webp", "eve_050704.webp"], + ], + [ + ["eve_050801.webp", "eve_070101.webp", "bg_1511.webp"], + ["bg_1521.webp", "bg_2011.webp", "bg_2521.webp"], + ], + [ + ["bg_3042.webp", "bg_3551.webp", "bg_3571.webp"], + ["bg_3721.webp", "bg_5033.webp", "bg_5044.webp"], + ], + ]; + } - //更新 - update() { - this.background(); - this.drawUI(); - } - background() { - //画布大小设置 - if (core.domStyle.isVertical) { - CGUI.width = 1248; - CGUI.height = 2028; - } else { - CGUI.width = 2028; - CGUI.height = 1248; - } - core.setTextAlign(ctx, "center"); - } - onclick(px, py) { - //点击 + //更新 + update() { + this.background(); + this.drawUI(); + } + background() { + //画布大小设置 + if (core.domStyle.isVertical) { + CGUI.width = 1248; + CGUI.height = 2028; + } else { + CGUI.width = 2028; + CGUI.height = 1248; + } + core.setTextAlign(ctx, "center"); + } + onclick(px, py) { + //点击 - if (show) { - show = !show; - core.clearMap(ctx); - this.update(); - return; - } - 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)) { - //离开按钮是一致的,其余的记区分横竖屏 - CGUI.style.display = "none"; - core.clearMap(ctx); - core.restart(); - return; - } - if (core.domStyle.isVertical) { - //竖屏 - const pageupbox = makeBox([200, 1830], [200, 100]); - const pagedownbox = makeBox([900, 1830], [200, 100]); + if (show) { + show = !show; + core.clearMap(ctx); + this.update(); + return; + } + 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)) { + //离开按钮是一致的,其余的记区分横竖屏 + CGUI.style.display = "none"; + core.clearMap(ctx); + core.restart(); + return; + } + if (core.domStyle.isVertical) { + //竖屏 + const pageupbox = makeBox([200, 1830], [200, 100]); + const pagedownbox = makeBox([900, 1830], [200, 100]); - const imagebox0 = makeBox([50, 200], [560, 420]); - const imagebox1 = makeBox([50, 750], [560, 420]); - const imagebox2 = makeBox([50, 1300], [560, 420]); + const imagebox0 = makeBox([50, 200], [560, 420]); + const imagebox1 = makeBox([50, 750], [560, 420]); + const imagebox2 = makeBox([50, 1300], [560, 420]); - const imagebox3 = makeBox([650, 200], [560, 420]); - const imagebox4 = makeBox([650, 750], [560, 420]); - const imagebox5 = makeBox([650, 1300], [560, 420]); - if (inRect(pos, pagedownbox)) { - //2代表当前最大页数-1 - if (page < this.UIMx.length - 1) { - page++; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, pageupbox)) { - if (page > 0) { - page--; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, imagebox0)) { - if (this.cgs.includes(this.UIMx[page][0][0])) { - const img = core.material.images.images[this.UIMx[page][0][0]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox1)) { - if (this.cgs.includes(this.UIMx[page][0][1])) { - const img = core.material.images.images[this.UIMx[page][0][1]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox2)) { - if (this.cgs.includes(this.UIMx[page][0][2])) { - const img = core.material.images.images[this.UIMx[page][0][2]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox3)) { - if (this.cgs.includes(this.UIMx[page][1][0])) { - const img = core.material.images.images[this.UIMx[page][1][0]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox4)) { - if (this.cgs.includes(this.UIMx[page][1][1])) { - const img = core.material.images.images[this.UIMx[page][1][1]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox5)) { - if (this.cgs.includes(this.UIMx[page][1][2])) { - const img = core.material.images.images[this.UIMx[page][1][2]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } - } else { - const pageupbox = makeBox([200, 1110], [200, 100]); - const pagedownbox = makeBox([1600, 1110], [200, 100]); - const imagebox0 = makeBox([75, 150], [600, 450]); - const imagebox1 = makeBox([725, 150], [600, 450]); - const imagebox2 = makeBox([1300, 150], [600, 450]); - const imagebox3 = makeBox([75, 650], [600, 450]); - const imagebox4 = makeBox([725, 650], [600, 450]); - const imagebox5 = makeBox([1375, 650], [600, 450]); - if (inRect(pos, pagedownbox)) { - if (page < this.UIMx.length - 1) { - page++; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, pageupbox)) { - if (page > 0) { - page--; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, imagebox0)) { - if (this.cgs.includes(this.UIMx[page][0][0])) { - const img = core.material.images.images[this.UIMx[page][0][0]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox1)) { - if (this.cgs.includes(this.UIMx[page][0][1])) { - const img = core.material.images.images[this.UIMx[page][0][1]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox2)) { - if (this.cgs.includes(this.UIMx[page][0][2])) { - const img = core.material.images.images[this.UIMx[page][0][2]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox3)) { - if (this.cgs.includes(this.UIMx[page][1][0])) { - const img = core.material.images.images[this.UIMx[page][1][0]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox4)) { - if (this.cgs.includes(this.UIMx[page][1][1])) { - const img = core.material.images.images[this.UIMx[page][1][1]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox5)) { - if (this.cgs.includes(this.UIMx[page][1][2])) { - const img = core.material.images.images[this.UIMx[page][1][2]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } - } - } - drawUI() { - //绘制页面 - core.clearMap(CGUI); - const bgVertical = core.material.images.images["bg_2010.webp"]; //竖屏背景 - const bg = core.material.images.images["bg_5043.webp"]; //横屏背景 + const imagebox3 = makeBox([650, 200], [560, 420]); + const imagebox4 = makeBox([650, 750], [560, 420]); + const imagebox5 = makeBox([650, 1300], [560, 420]); + if (inRect(pos, pagedownbox)) { + //2代表当前最大页数-1 + if (page < this.UIMx.length - 1) { + page++; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, pageupbox)) { + if (page > 0) { + page--; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, imagebox0)) { + if (this.cgs.includes(this.UIMx[page][0][0])) { + const img = core.material.images.images[this.UIMx[page][0][0]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox1)) { + if (this.cgs.includes(this.UIMx[page][0][1])) { + const img = core.material.images.images[this.UIMx[page][0][1]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox2)) { + if (this.cgs.includes(this.UIMx[page][0][2])) { + const img = core.material.images.images[this.UIMx[page][0][2]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox3)) { + if (this.cgs.includes(this.UIMx[page][1][0])) { + const img = core.material.images.images[this.UIMx[page][1][0]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox4)) { + if (this.cgs.includes(this.UIMx[page][1][1])) { + const img = core.material.images.images[this.UIMx[page][1][1]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox5)) { + if (this.cgs.includes(this.UIMx[page][1][2])) { + const img = core.material.images.images[this.UIMx[page][1][2]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } + } else { + const pageupbox = makeBox([200, 1110], [200, 100]); + const pagedownbox = makeBox([1600, 1110], [200, 100]); + const imagebox0 = makeBox([75, 150], [600, 450]); + const imagebox1 = makeBox([725, 150], [600, 450]); + const imagebox2 = makeBox([1300, 150], [600, 450]); + const imagebox3 = makeBox([75, 650], [600, 450]); + const imagebox4 = makeBox([725, 650], [600, 450]); + const imagebox5 = makeBox([1375, 650], [600, 450]); + if (inRect(pos, pagedownbox)) { + if (page < this.UIMx.length - 1) { + page++; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, pageupbox)) { + if (page > 0) { + page--; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, imagebox0)) { + if (this.cgs.includes(this.UIMx[page][0][0])) { + const img = core.material.images.images[this.UIMx[page][0][0]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox1)) { + if (this.cgs.includes(this.UIMx[page][0][1])) { + const img = core.material.images.images[this.UIMx[page][0][1]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox2)) { + if (this.cgs.includes(this.UIMx[page][0][2])) { + const img = core.material.images.images[this.UIMx[page][0][2]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox3)) { + if (this.cgs.includes(this.UIMx[page][1][0])) { + const img = core.material.images.images[this.UIMx[page][1][0]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox4)) { + if (this.cgs.includes(this.UIMx[page][1][1])) { + const img = core.material.images.images[this.UIMx[page][1][1]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox5)) { + if (this.cgs.includes(this.UIMx[page][1][2])) { + const img = core.material.images.images[this.UIMx[page][1][2]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } + } + } + drawUI() { + //绘制页面 + core.clearMap(CGUI); + const bgVertical = core.material.images.images["bg_2010.webp"]; //竖屏背景 + const bg = core.material.images.images["bg_5043.webp"]; //横屏背景 - if (core.domStyle.isVertical) { - //竖屏 + if (core.domStyle.isVertical) { + //竖屏 - core.fillRect(ctx, 0, 0, 1248, 2028, "#000000"); //黑色背景 - ctx.globalAlpha = 0.5; //透明度 - if (bgVertical) - ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片 - ctx.globalAlpha = 1; //恢复为不透明 + core.fillRect(ctx, 0, 0, 1248, 2028, "#000000"); //黑色背景 + ctx.globalAlpha = 0.5; //透明度 + if (bgVertical) + ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片 + ctx.globalAlpha = 1; //恢复为不透明 - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - "◀离开", - 100, - 110, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + "◀离开", + 100, + 110, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - core.fillBoldText1( - ctx, - "上一页", - 300, - 1900, - page === 0 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + core.fillBoldText1( + ctx, + "上一页", + 300, + 1900, + page === 0 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - core.fillBoldText1( - ctx, - page + 1 + "/" + this.UIMx.length, - 650, - 1900, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - ctx, - "下一页", - 1000, - 1900, - page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - // 添加向上翻页和向下翻页的按钮 + core.fillBoldText1( + ctx, + page + 1 + "/" + this.UIMx.length, + 650, + 1900, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + ctx, + "下一页", + 1000, + 1900, + page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + // 添加向上翻页和向下翻页的按钮 - // 添加3*2个4:3的画框,及图片 - for (let i = 0; i < 3; i++) { - for (let j = 0; j < 2; j++) { - const img = core.material.images.images[this.UIMx[page][j][i]]; - core.strokeRect( - ctx, - 50 + j * 600, - 200 + i * 550, - 560, - 420, - "#444444", - 5 - ); - if (this.cgs.includes(this.UIMx[page][j][i])) { - if (img) - ctx.drawImage( - img, - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - } else { - ctx.fillStyle = "#000000"; - ctx.fillRect( - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - const img = core.material.images.images["LOGO.webp"]; - if (img) - ctx.drawImage( - img, - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - } - } - } - } 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; //恢复为不透明 + // 添加3*2个4:3的画框,及图片 + for (let i = 0; i < 3; i++) { + for (let j = 0; j < 2; j++) { + const img = core.material.images.images[this.UIMx[page][j][i]]; + core.strokeRect( + ctx, + 50 + j * 600, + 200 + i * 550, + 560, + 420, + "#444444", + 5 + ); + if (this.cgs.includes(this.UIMx[page][j][i])) { + if (img) + ctx.drawImage( + img, + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + } else { + ctx.fillStyle = "#000000"; + ctx.fillRect( + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + const img = core.material.images.images["LOGO.webp"]; + if (img) + ctx.drawImage( + img, + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + } + } + } + } 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) - ); + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + "◀离开", + 110, + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - // 添加向上翻页和向下翻页的按钮 - core.fillBoldText1( - ctx, - "上一页", - 300, - 1180, - page === 0 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + // 添加向上翻页和向下翻页的按钮 + core.fillBoldText1( + ctx, + "上一页", + 300, + 1180, + page === 0 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - core.fillBoldText1( - ctx, - page + 1 + "/" + this.UIMx.length, - 1000, - 1180, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - ctx, - "下一页", - 1700, - 1180, - page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + core.fillBoldText1( + ctx, + page + 1 + "/" + this.UIMx.length, + 1000, + 1180, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + ctx, + "下一页", + 1700, + 1180, + page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - // 添加3*2个4:3的画框 - for (let i = 0; i < 2; i++) { - for (let j = 0; j < 3; j++) { - core.strokeRect( - ctx, - 75 + j * 650, - 150 + i * 500, - 600, - 450, - "#444444", - 2 - ); - if (this.cgs.includes(this.UIMx[page][i][j])) { - const img = core.material.images.images[this.UIMx[page][i][j]]; - if (img) - ctx.drawImage( - img, - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - } else { - ctx.fillStyle = "#000000"; - ctx.fillRect( - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - const img = core.material.images.images["LOGO.webp"]; - if (img) - ctx.drawImage( - img, - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - } - } - } - } - } - } - this.setcgs = function (img) { - const a = core.getLocalStorage("cgs", []); - if (img) { - if (!a.includes(img)) a.push(img); - core.setLocalStorage("cgs", a); - } else core.setLocalStorage("cgs"); - }; - core.ui.CG = new CG(); - main.dom.CGMode.onclick = function () { - //点击开始页面的CG MODE进入cg回廊 - main.core.control.checkBgm(); - page = 0; - main.core.ui.CG.cgs = core.getLocalStorage("cgs", []); - CGUI.style.display = "block"; - main.core.ui.CG.update(); - }; -}, + // 添加3*2个4:3的画框 + for (let i = 0; i < 2; i++) { + for (let j = 0; j < 3; j++) { + core.strokeRect( + ctx, + 75 + j * 650, + 150 + i * 500, + 600, + 450, + "#444444", + 2 + ); + if (this.cgs.includes(this.UIMx[page][i][j])) { + const img = core.material.images.images[this.UIMx[page][i][j]]; + if (img) + ctx.drawImage( + img, + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + } else { + ctx.fillStyle = "#000000"; + ctx.fillRect( + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + const img = core.material.images.images["LOGO.webp"]; + if (img) + ctx.drawImage( + img, + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + } + } + } + } + } + } + this.setcgs = function (img) { + const a = core.getLocalStorage("cgs", []); + if (img) { + if (!a.includes(img)) a.push(img); + core.setLocalStorage("cgs", a); + } else core.setLocalStorage("cgs"); + }; + core.ui.CG = new CG(); + main.dom.CGMode.onclick = function () { + //点击开始页面的CG MODE进入cg回廊 + main.core.control.checkBgm(); + page = 0; + main.core.ui.CG.cgs = core.getLocalStorage("cgs", []); + CGUI.style.display = "block"; + main.core.ui.CG.update(); + }; + }, "光标设置": function () { // 在此增加新插件 this.changeMouse = function ( @@ -15214,902 +14994,901 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "剧情cg": function () { - // 在此增加新插件 - // 在此增加新插件 - const cg = document.createElement("canvas"); //cg画布设置 - cg.style.position = "absolute"; - cg.style.zIndex = 300; - cg.style.display = "none"; - cg.id = "cgText"; - main.dom.gameGroup.insertAdjacentElement("afterend", cg); - cg.style.top = "50%"; - cg.style.left = "50%"; - cg.style.transform = "translate(-50%,-50%)"; - const ctx = cg.getContext("2d"); - main.dom.cgText = cg; - const logcanvas = document.createElement("canvas"); //cg画布设置 - logcanvas.style.position = "absolute"; - logcanvas.style.zIndex = 301; - logcanvas.style.display = "none"; - logcanvas.id = "cgText"; - main.dom.gameGroup.insertAdjacentElement("afterend", logcanvas); - logcanvas.style.top = "50%"; - logcanvas.style.left = "50%"; - logcanvas.style.transform = "translate(-50%,-50%)"; - const logctx = logcanvas.getContext("2d"); - main.dom.logcanvas = logcanvas; - logcanvas.onmouseup = function (e) { - //鼠标抬起 + // 在此增加新插件 + // 在此增加新插件 + const cg = document.createElement("canvas"); //cg画布设置 + cg.style.position = "absolute"; + cg.style.zIndex = 300; + cg.style.display = "none"; + cg.id = "cgText"; + main.dom.gameGroup.insertAdjacentElement("afterend", cg); + cg.style.top = "50%"; + cg.style.left = "50%"; + cg.style.transform = "translate(-50%,-50%)"; + const ctx = cg.getContext("2d"); + main.dom.cgText = cg; + const logcanvas = document.createElement("canvas"); //cg画布设置 + logcanvas.style.position = "absolute"; + logcanvas.style.zIndex = 301; + logcanvas.style.display = "none"; + logcanvas.id = "cgText"; + main.dom.gameGroup.insertAdjacentElement("afterend", logcanvas); + logcanvas.style.top = "50%"; + logcanvas.style.left = "50%"; + logcanvas.style.transform = "translate(-50%,-50%)"; + const logctx = logcanvas.getContext("2d"); + main.dom.logcanvas = logcanvas; + logcanvas.onmouseup = function (e) { + //鼠标抬起 - try { - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.insertAction(data); - core.doAction(); - } - } catch (ee) { - console.error(ee); - } - }; - logcanvas.onmousedown = function (e) { - //鼠标按下 - try { - if (!core.isPlaying()) return false; - 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.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - logcanvas.ontouchend = function (e) { - //触摸抬起 + core.insertAction(data); + core.doAction(); + } + } catch (ee) { + console.error(ee); + } + }; + logcanvas.onmousedown = function (e) { + //鼠标按下 + try { + if (!core.isPlaying()) return false; + 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.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + logcanvas.ontouchend = function (e) { + //触摸抬起 - try { - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - core.setFlag("skip", false); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + core.setFlag("skip", false); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.insertAction(data); - core.doAction(); - } - } catch (ee) {} - }; - logcanvas.ontouchstart = function (e) { - //触摸按下 - try { - if (!core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor( - (e.targetTouches[0].clientX - left) / core.domStyle.scale - ), - py = Math.floor( - (e.targetTouches[0].clientY - top) / core.domStyle.scale - ); - core.ui.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - cg.onmouseup = function (e) { - //鼠标抬起 + core.insertAction(data); + core.doAction(); + } + } catch (ee) {} + }; + logcanvas.ontouchstart = function (e) { + //触摸按下 + try { + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor( + (e.targetTouches[0].clientX - left) / core.domStyle.scale + ), + py = Math.floor( + (e.targetTouches[0].clientY - top) / core.domStyle.scale + ); + core.ui.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + cg.onmouseup = function (e) { + //鼠标抬起 - try { - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.insertAction(data); - core.doAction(); - } - } catch (ee) { - console.error(ee); - } - }; - cg.onmousedown = function (e) { - //鼠标按下 - try { - if (!core.isPlaying()) return false; - 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.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - cg.ontouchend = function (e) { - //触摸抬起 + core.insertAction(data); + core.doAction(); + } + } catch (ee) { + console.error(ee); + } + }; + cg.onmousedown = function (e) { + //鼠标按下 + try { + if (!core.isPlaying()) return false; + 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.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + cg.ontouchend = function (e) { + //触摸抬起 - try { - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - core.setFlag("skip", false); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + core.setFlag("skip", false); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.insertAction(data); - core.doAction(); - } - } catch (ee) { - console.error(ee); - } - }; - cg.ontouchstart = function (e) { - //触摸按下 - try { - if (!core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor( - (e.targetTouches[0].clientX - left) / core.domStyle.scale - ), - py = Math.floor( - (e.targetTouches[0].clientY - top) / core.domStyle.scale - ); - core.ui.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - let auto = false; + core.insertAction(data); + core.doAction(); + } + } catch (ee) { + console.error(ee); + } + }; + cg.ontouchstart = function (e) { + //触摸按下 + try { + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor( + (e.targetTouches[0].clientX - left) / core.domStyle.scale + ), + py = Math.floor( + (e.targetTouches[0].clientY - top) / core.domStyle.scale + ); + core.ui.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + let auto = false; - class cgText { - constructor() { - //绘制需要的变量 - this.image = ""; - this.head = { name: "face_050445.webp", px: -300 }; - this.bodyList = [ - { name: "tati_050145a.webp", px: 100, filter: false }, - { name: "tati_120124.webp", px: 1100, filter: true }, - ]; - this.name = ""; - this.text = ""; - this.time = 0; - this.WindowSkin = false; - this.sound = ""; - this.beforeSound = 0; - this.wait = 1000; - this.memory = false; - this.textList = []; - this.page = 1; - this.overpage = 1; - this.log = false; - this.index = 0; - } - click(px, py) { - //点击效果 + class cgText { + constructor() { + //绘制需要的变量 + this.image = ""; + this.head = { name: "face_050445.webp", px: -300 }; + this.bodyList = [ + { name: "tati_050145a.webp", px: 100, filter: false }, + { name: "tati_120124.webp", px: 1100, filter: true }, + ]; + this.name = ""; + this.text = ""; + this.time = 0; + this.WindowSkin = false; + this.sound = ""; + this.beforeSound = 0; + this.wait = 1000; + this.memory = false; + this.textList = []; + this.page = 1; + this.overpage = 1; + this.log = false; + this.index = 0; + } + click(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 savebox = makeBox([1700, 1100], [192, 96]); - const saveboxVertical = makeBox([52, 1700], [96, 192]); - const skipbox = makeBox([1700, 1000], [192, 96]); - const skipboxVertical = makeBox([152, 1700], [96, 192]); - const autobox = makeBox([1700, 900], [192, 96]); - const autoboxVertical = makeBox([252, 1700], [96, 192]); - const textbox = makeBox([1700, 800], [192, 96]); - const textboxVertical = makeBox([352, 1700], [96, 192]); - const backbox = makeBox([15, 35], [210, 90]); - const backboxVertical = makeBox([1123, 15], [90, 210]); - const pageupbox = makeBox([300, 1130], [200, 100]); - const pageupboxVertical = makeBox([18, 300], [100, 200]); - const pagedownbox = makeBox([1500, 1130], [200, 100]); - const pagedownboxVertical = makeBox([18, 1500], [100, 200]); - if (this.log) { - if ( - (core.domStyle.isVertical && inRect(pos, backboxVertical)) || - (!core.domStyle.isVertical && inRect(pos, backbox)) - ) { - core.clearMap(logctx); - main.dom.logcanvas.style.display = "none"; - this.log = false; - } else if ( - (core.domStyle.isVertical && inRect(pos, pageupboxVertical)) || - (!core.domStyle.isVertical && inRect(pos, pageupbox)) - ) { - core.clearMap(logctx); - if (this.page > 1) this.page--; - this.logdraw(this.page); - } else if ( - (core.domStyle.isVertical && inRect(pos, pagedownboxVertical)) || - (!core.domStyle.isVertical && inRect(pos, pagedownbox)) - ) { - core.clearMap(logctx); - if (this.page < this.overpage) this.page++; - this.logdraw(this.page); - } - } else { - if ( - (core.domStyle.isVertical && - inRect(pos, skipboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, skipbox)) - ) { - auto = false; - let time = 0; - core.stopSound(this.beforeSound); - core.registerAnimationFrame("skip", true, (timestamp) => { - if (timestamp > time + 50) { - time = timestamp; - if ( - core.status.event.id == "action" && - core.status.event.data.type == "cgtext" - ) { - core.setFlag("skip", true); - main.dom.cgText.style.display = "none"; - core.doAction(); - } - } - }); - } else if ( - (core.domStyle.isVertical && - inRect(pos, textboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, textbox)) - ) { - auto = false; - this.log = true; - this.overpage = Math.floor(this.index / 6) + 1; - this.page = this.overpage; - logcanvas.style.display = "block"; - const data = core.clone(core.status.event.data.current); - data.showAll = true; - data.time = 0; - data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 - data.sound = ""; - core.insertAction(data); - core.doAction(); - this.logdraw(this.page); - } else if ( - (core.domStyle.isVertical && - inRect(pos, autoboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, autobox)) - ) { - auto = !auto; + 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 savebox = makeBox([1700, 1100], [192, 96]); + const saveboxVertical = makeBox([52, 1700], [96, 192]); + const skipbox = makeBox([1700, 1000], [192, 96]); + const skipboxVertical = makeBox([152, 1700], [96, 192]); + const autobox = makeBox([1700, 900], [192, 96]); + const autoboxVertical = makeBox([252, 1700], [96, 192]); + const textbox = makeBox([1700, 800], [192, 96]); + const textboxVertical = makeBox([352, 1700], [96, 192]); + const backbox = makeBox([15, 35], [210, 90]); + const backboxVertical = makeBox([1123, 15], [90, 210]); + const pageupbox = makeBox([300, 1130], [200, 100]); + const pageupboxVertical = makeBox([18, 300], [100, 200]); + const pagedownbox = makeBox([1500, 1130], [200, 100]); + const pagedownboxVertical = makeBox([18, 1500], [100, 200]); + if (this.log) { + if ( + (core.domStyle.isVertical && inRect(pos, backboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, backbox)) + ) { + core.clearMap(logctx); + main.dom.logcanvas.style.display = "none"; + this.log = false; + } else if ( + (core.domStyle.isVertical && inRect(pos, pageupboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, pageupbox)) + ) { + core.clearMap(logctx); + if (this.page > 1) this.page--; + this.logdraw(this.page); + } else if ( + (core.domStyle.isVertical && inRect(pos, pagedownboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, pagedownbox)) + ) { + core.clearMap(logctx); + if (this.page < this.overpage) this.page++; + this.logdraw(this.page); + } + } else { + if ( + (core.domStyle.isVertical && + inRect(pos, skipboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, skipbox)) + ) { + auto = false; + let time = 0; + core.stopSound(this.beforeSound); + core.registerAnimationFrame("skip", true, (timestamp) => { + if (timestamp > time + 50) { + time = timestamp; + if ( + core.status.event.id == "action" && + core.status.event.data.type == "cgtext" + ) { + core.setFlag("skip", true); + main.dom.cgText.style.display = "none"; + core.doAction(); + } + } + }); + } else if ( + (core.domStyle.isVertical && + inRect(pos, textboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, textbox)) + ) { + auto = false; + this.log = true; + this.overpage = Math.floor(this.index / 6) + 1; + this.page = this.overpage; + logcanvas.style.display = "block"; + const data = core.clone(core.status.event.data.current); + data.showAll = true; + data.time = 0; + data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 + data.sound = ""; + core.insertAction(data); + core.doAction(); + this.logdraw(this.page); + } else if ( + (core.domStyle.isVertical && + inRect(pos, autoboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, autobox)) + ) { + auto = !auto; - const data = core.clone(core.status.event.data.current); - data.showAll = true; - data.time = 0; - data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 - data.sound = ""; - core.insertAction(data); - core.doAction(); - } else if ( - (core.domStyle.isVertical && - inRect(pos, saveboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, savebox)) - ) { - //存档 - auto = false; - if (core.status.event.animateUI) return; - if (core.status.event.interval != null) return; - const current = core.clone(core.status.event.data.current); - current.showAll = true; - current.time = 0; - current.sound = ""; - current.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除当前事件所有打字机效果 - cg.style.display = "none"; - const data = [{ type: "callSave" }, current]; //插入存档事件 - core.insertAction(data); + const data = core.clone(core.status.event.data.current); + data.showAll = true; + data.time = 0; + data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 + data.sound = ""; + core.insertAction(data); + core.doAction(); + } else if ( + (core.domStyle.isVertical && + inRect(pos, saveboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, savebox)) + ) { + //存档 + auto = false; + if (core.status.event.animateUI) return; + if (core.status.event.interval != null) return; + const current = core.clone(core.status.event.data.current); + current.showAll = true; + current.time = 0; + current.sound = ""; + current.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除当前事件所有打字机效果 + cg.style.display = "none"; + const data = [{ type: "callSave" }, current]; //插入存档事件 + core.insertAction(data); - core.doAction(); - } else if (!core.status.event.data) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } else { - // 正在淡入淡出的话不执行 - if (core.status.event.animateUI) return; - auto = false; + core.doAction(); + } else if (!core.status.event.data) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } else { + // 正在淡入淡出的话不执行 + if (core.status.event.animateUI) return; + auto = false; - // 打字机效果显示全部文字 - if (core.status.event.interval != null) { - const data = core.clone(core.status.event.data?.current); - data.showAll = true; - data.time = 0; - data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 - data.sound = ""; - core.insertAction(data); - core.doAction(); - return; - } else { - core.stopSound(this.beforeSound); - } + // 打字机效果显示全部文字 + if (core.status.event.interval != null) { + const data = core.clone(core.status.event.data?.current); + data.showAll = true; + data.time = 0; + data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 + data.sound = ""; + core.insertAction(data); + core.doAction(); + return; + } else { + core.stopSound(this.beforeSound); + } - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - } - } + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + } + } - drawTextContent(ctx, content, config) { - //绘制多行文字并执行打字机效果 + drawTextContent(ctx, content, config) { + //绘制多行文字并执行打字机效果 - ctx = core.getContextByName(ctx); - // 设置默认配置项 - var textAttribute = - core.status.textAttribute || core.initStatus.textAttribute; - var globalAttribute = - core.status.globalAttribute || core.initStatus.globalAttribute; - config = core.clone(config || {}); - config.left = config.left || 0; - config.right = - config.left + (config.maxWidth == null ? core._PX_ : config.maxWidth); - config.top = config.top || 0; - config.color = core.arrayToRGBA(config.color || textAttribute.text); - if (config.bold == null) config.bold = textAttribute.bold; - config.italic = config.italic || false; - config.align = config.align || textAttribute.align || "left"; - config.fontSize = config.fontSize || textAttribute.textfont; - config.lineHeight = config.lineHeight || config.fontSize * 1.3; - config.defaultFont = config.font = config.font || globalAttribute.font; - config.time = config.time || 0; - config.letterSpacing = - config.letterSpacing == null ? - textAttribute.letterSpacing || 0 : - config.letterSpacing; + ctx = core.getContextByName(ctx); + // 设置默认配置项 + var textAttribute = + core.status.textAttribute || core.initStatus.textAttribute; + var globalAttribute = + core.status.globalAttribute || core.initStatus.globalAttribute; + config = core.clone(config || {}); + config.left = config.left || 0; + config.right = + config.left + (config.maxWidth == null ? core._PX_ : config.maxWidth); + config.top = config.top || 0; + config.color = core.arrayToRGBA(config.color || textAttribute.text); + if (config.bold == null) config.bold = textAttribute.bold; + config.italic = config.italic || false; + config.align = config.align || textAttribute.align || "left"; + config.fontSize = config.fontSize || textAttribute.textfont; + config.lineHeight = config.lineHeight || config.fontSize * 1.3; + config.defaultFont = config.font = config.font || globalAttribute.font; + config.time = config.time || 0; + config.letterSpacing = + config.letterSpacing == null + ? textAttribute.letterSpacing || 0 + : config.letterSpacing; - config.index = 0; - config.currcolor = config.color; - config.currfont = config.fontSize; - config.lineMargin = Math.max( - Math.round(config.fontSize / 4), - config.lineHeight - config.fontSize - ); - config.topMargin = parseInt(config.lineMargin / 2); - config.lineMaxHeight = config.lineMargin + config.fontSize; - config.offsetX = 0; - config.offsetY = 0; - config.line = 0; - config.blocks = []; - config.isHD = ctx == null || ctx.canvas.hasAttribute("isHD"); + config.index = 0; + config.currcolor = config.color; + config.currfont = config.fontSize; + config.lineMargin = Math.max( + Math.round(config.fontSize / 4), + config.lineHeight - config.fontSize + ); + config.topMargin = parseInt(config.lineMargin / 2); + config.lineMaxHeight = config.lineMargin + config.fontSize; + config.offsetX = 0; + config.offsetY = 0; + config.line = 0; + config.blocks = []; + config.isHD = ctx == null || ctx.canvas.hasAttribute("isHD"); - // 创建一个新的临时画布 - var tempCtx = document.createElement("canvas").getContext("2d"); - if (config.isHD && ctx) { - core.maps._setHDCanvasSize( - tempCtx, - ctx.canvas.width, - ctx.canvas.height - ); - } else { - tempCtx.canvas.width = ctx == null ? 1 : ctx.canvas.width; - tempCtx.canvas.height = ctx == null ? 1 : ctx.canvas.height; - } + // 创建一个新的临时画布 + var tempCtx = document.createElement("canvas").getContext("2d"); + if (config.isHD && ctx) { + core.maps._setHDCanvasSize( + tempCtx, + ctx.canvas.width, + ctx.canvas.height + ); + } else { + tempCtx.canvas.width = ctx == null ? 1 : ctx.canvas.width; + tempCtx.canvas.height = ctx == null ? 1 : ctx.canvas.height; + } - tempCtx.textBaseline = "top"; - tempCtx.font = core.ui._buildFont( - config.fontSize, - config.bold, - config.italic, - config.font - ); - tempCtx.fillStyle = config.color; - config = this._drawTextContent_draw(ctx, tempCtx, content, config); - return config; - } - _drawTextContent_draw(ctx, tempCtx, content, config) { - // Step 1: 绘制到tempCtx上,并记录下图块信息 - while (core.ui._drawTextContent_next(tempCtx, content, config)); + tempCtx.textBaseline = "top"; + tempCtx.font = core.ui._buildFont( + config.fontSize, + config.bold, + config.italic, + config.font + ); + tempCtx.fillStyle = config.color; + config = this._drawTextContent_draw(ctx, tempCtx, content, config); + return config; + } + _drawTextContent_draw(ctx, tempCtx, content, config) { + // Step 1: 绘制到tempCtx上,并记录下图块信息 + while (core.ui._drawTextContent_next(tempCtx, content, config)); - if (ctx == null) return config; + if (ctx == null) return config; - // Step 2: 从tempCtx绘制到画布上 - config.index = 0; - var _drawNext = function () { - if (config.index >= config.blocks.length) return false; - var block = config.blocks[config.index++]; - if (block != null) { - // It works, why? - const scale = config.isHD ? - devicePixelRatio * core.domStyle.scale : - 1; - ctx.restore(); - ctx.save(); //保存设置 - if (core.domStyle.isVertical) { - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - } - ctx.drawImage( - tempCtx.canvas, - block.left * scale, - block.top * scale, - block.width * scale, - block.height * scale, - config.left + block.left + block.marginLeft, - config.top + block.top + block.marginTop, - block.width, - block.height - ); - ctx.restore(); - } - return true; - }; + // Step 2: 从tempCtx绘制到画布上 + config.index = 0; + var _drawNext = function () { + if (config.index >= config.blocks.length) return false; + var block = config.blocks[config.index++]; + if (block != null) { + // It works, why? + const scale = config.isHD + ? devicePixelRatio * core.domStyle.scale + : 1; + ctx.restore(); + ctx.save(); //保存设置 + if (core.domStyle.isVertical) { + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } + ctx.drawImage( + tempCtx.canvas, + block.left * scale, + block.top * scale, + block.width * scale, + block.height * scale, + config.left + block.left + block.marginLeft, + config.top + block.top + block.marginTop, + block.width, + block.height + ); + ctx.restore(); + } + return true; + }; - if (config.time == 0) { - while (_drawNext()); + if (config.time == 0) { + while (_drawNext()); - if ( - (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || - (core.ui.cgText.sound && !core.musicStatus.soundStatus) - ) { - setTimeout(() => { - if (auto) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - }, core.ui.cgText.wait); - } - } else { - clearInterval(core.status.event.interval); - core.status.event.interval = setInterval(function () { - if (!_drawNext()) { - clearInterval(core.status.event.interval); - core.status.event.interval = null; + if ( + (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || + (core.ui.cgText.sound && !core.musicStatus.soundStatus) + ) { + setTimeout(() => { + if (auto) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + }, core.ui.cgText.wait); + } + } else { + clearInterval(core.status.event.interval); + core.status.event.interval = setInterval(function () { + if (!_drawNext()) { + clearInterval(core.status.event.interval); + core.status.event.interval = null; - if ( - (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || - (core.ui.cgText.sound && !core.musicStatus.soundStatus) - ) - setTimeout(() => { - if (auto) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - }, core.ui.cgText.wait); - } - }, config.time); - } + if ( + (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || + (core.ui.cgText.sound && !core.musicStatus.soundStatus) + ) + setTimeout(() => { + if (auto) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + }, core.ui.cgText.wait); + } + }, config.time); + } - return config; - } + return config; + } - update() { - this.background(); - if (this.log) this.logdraw(this.page); - } - logdraw(page) { - if (core.domStyle.isVertical) { - logctx.canvas.width = 1248; - logctx.canvas.height = 2028; - logctx.save(); //保存设置 - logctx.translate(1248, 0); //重新定位右上角为基准 - logctx.rotate(Math.PI / 2); //旋转90度 - } else { - logctx.canvas.width = 2028; - logctx.canvas.height = 1248; - } - core.fillRect(logctx, 0, 0, 2028, 1248, "rgba(0,0,0,0.5)"); - core.setTextAlign(logctx, "center"); - core.fillBoldText1( - logctx, - "◀离开", - 110, - 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - logctx.strokeStyle = "#FFFFFF"; - logctx.lineWidth = 3; - logctx.beginPath(); - logctx.moveTo(100, 150); - logctx.lineTo(1928, 150); + update() { + this.background(); + if (this.log) this.logdraw(this.page); + } + logdraw(page) { + if (core.domStyle.isVertical) { + logctx.canvas.width = 1248; + logctx.canvas.height = 2028; + logctx.save(); //保存设置 + logctx.translate(1248, 0); //重新定位右上角为基准 + logctx.rotate(Math.PI / 2); //旋转90度 + } else { + logctx.canvas.width = 2028; + logctx.canvas.height = 1248; + } + core.fillRect(logctx, 0, 0, 2028, 1248, "rgba(0,0,0,0.5)"); + core.setTextAlign(logctx, "center"); + core.fillBoldText1( + logctx, + "◀离开", + 110, + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + logctx.strokeStyle = "#FFFFFF"; + logctx.lineWidth = 3; + logctx.beginPath(); + logctx.moveTo(100, 150); + logctx.lineTo(1928, 150); - logctx.stroke(); - let posy = 150; - const indexList = this.textList; - core.setTextAlign(logctx, "left"); - for ( - let i = (page - 1) * 6; i <= Math.min(this.index, page * 6 - 1); i++ - ) { - const text = this.textList[i][1].replaceAll( - /(\\(d|e|f|g|i|n|r|b|c|t|z))(\[.*?\])?/g, - "" - ); //取消打字机 - const name = this.textList[i][0] ? - "【" + this.textList[i][0] + "】" : - ""; - if (name) { - core.fillBoldText1( - logctx, - name, - 150, - posy + 50, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - } - if (text.length < 30) { - core.fillBoldText1( - logctx, - text, - 650, - posy + 50, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - } else { - let text1 = text.slice(0, 30); - core.fillBoldText1( - logctx, - text1, - 650, - posy + 50, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - if (text.length > 60) { - let text2 = text.slice(30, 60); - let text3 = text.slice(60); - core.fillBoldText1( - logctx, - text2, - 650, - posy + 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - core.fillBoldText1( - logctx, - text3, - 650, - posy + 150, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - } else { - let text2 = text.slice(30); - core.fillBoldText1( - logctx, - text2, - 650, - posy + 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - } - } + logctx.stroke(); + let posy = 150; + const indexList = this.textList; + core.setTextAlign(logctx, "left"); + for ( + let i = (page - 1) * 6; + i <= Math.min(this.index, page * 6 - 1); + i++ + ) { + const text = this.textList[i][1].replaceAll( + /(\\(d|e|f|g|i|n|r|b|c|t|z))(\[.*?\])?/g, + "" + ); //取消打字机 + const name = this.textList[i][0] + ? "【" + this.textList[i][0] + "】" + : ""; + if (name) { + core.fillBoldText1( + logctx, + name, + 150, + posy + 50, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } + if (text.length < 30) { + core.fillBoldText1( + logctx, + text, + 650, + posy + 50, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } else { + let text1 = text.slice(0, 30); + core.fillBoldText1( + logctx, + text1, + 650, + posy + 50, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + if (text.length > 60) { + let text2 = text.slice(30, 60); + let text3 = text.slice(60); + core.fillBoldText1( + logctx, + text2, + 650, + posy + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + core.fillBoldText1( + logctx, + text3, + 650, + posy + 150, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } else { + let text2 = text.slice(30); + core.fillBoldText1( + logctx, + text2, + 650, + posy + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } + } - logctx.strokeStyle = "#FFFFFF"; - logctx.lineWidth = 3; - logctx.beginPath(); - logctx.moveTo(100, posy); - logctx.lineTo(1928, posy); - logctx.stroke(); + logctx.strokeStyle = "#FFFFFF"; + logctx.lineWidth = 3; + logctx.beginPath(); + logctx.moveTo(100, posy); + logctx.lineTo(1928, posy); + logctx.stroke(); - posy += 160; - } - logctx.beginPath(); - logctx.moveTo(100, 1120); - logctx.lineTo(1928, 1120); - logctx.moveTo(100, 1110); - logctx.lineTo(1928, 1110); - logctx.stroke(); - core.fillBoldText1( - logctx, - "上一页", - 300, - 1200, - page === 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + posy += 160; + } + logctx.beginPath(); + logctx.moveTo(100, 1120); + logctx.lineTo(1928, 1120); + logctx.moveTo(100, 1110); + logctx.lineTo(1928, 1110); + logctx.stroke(); + core.fillBoldText1( + logctx, + "上一页", + 300, + 1200, + page === 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - core.fillBoldText1( - logctx, - page + "/" + this.overpage, - 1000, - 1200, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - logctx, - "下一页", - 1500, - 1200, - page === this.overpage ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - } - background() { - const img = core.material.images.images?.[this.image]; + core.fillBoldText1( + logctx, + page + "/" + this.overpage, + 1000, + 1200, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + logctx, + "下一页", + 1500, + 1200, + page === this.overpage ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + } + background() { + const img = core.material.images.images?.[this.image]; - if (core.domStyle.isVertical) { - ctx.canvas.width = 1248; - ctx.canvas.height = 2028; - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - } else { - ctx.canvas.width = 2028; - ctx.canvas.height = 1248; - } + if (core.domStyle.isVertical) { + ctx.canvas.width = 1248; + ctx.canvas.height = 2028; + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } else { + ctx.canvas.width = 2028; + ctx.canvas.height = 1248; + } - if (img) { - //绘制背景 - if (this.memory) ctx.filter = "sepia(50%)"; - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.filter = "none"; - } else { - core.fillRect(ctx, 0, 0, 2028, 1248); - } - this.bodyList.forEach((v) => { - //绘制立绘 - const body = core.material.images.images?.[v.name]; - if (v.filter) ctx.filter = "brightness(50%)"; - if (body) { - if (!v.w && !v.h && !v.scale) v.scale = 1.7; - if (!v.w && !v.h) { - ctx.drawImage( - body, - 0, - 0, - body.width, - body.height, - v.px, - 1248 - body.height * v.scale, - body.width * v.scale, - body.height * v.scale - ); - } else { - ctx.drawImage( - body, - 0, - 0, - body.width, - body.height, - v.px, - 1248 - (v.h ?? body.height), - v.w ?? body.width, - v.h ?? body.height - ); - } - } - ctx.filter = "none"; - }); - if (core.isPlaying() && !this.WindowSkin) - core.drawWindowSkin( - "winskin.webp", - ctx, - 30, - 780, - 1968, - 436, - null, - null, - null, - 3 - ); //绘制对话框 - const head = core.material.images.images?.[this.head.name]; - if (head) { - //绘制头像 - ctx.drawImage( - head, - 0, - 0, - head.width, - head.height, - this.head.px, - 1248 - head.height * 2.2, - head.width * 2.2, - head.height * 2.2 - ); - } - if (core.isPlaying() && !this.WindowSkin) { - core.drawWindowSkin( - "winskin.webp", - ctx, - 1700, - 800, - 192, - 96, - null, - null, - null, - 3 - ); - core.fillBoldText1( - ctx, - "记 录", - 1736, - 866, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - core.drawWindowSkin( - "winskin.webp", - ctx, - 1700, - 1100, - 192, - 96, - null, - null, - null, - 3 - ); - core.fillBoldText1( - ctx, - "存 档", - 1736, - 1166, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - core.drawWindowSkin( - "winskin.webp", - ctx, - 1700, - 1000, - 192, - 96, - null, - null, - null, - 3 - ); - core.fillBoldText1( - ctx, - "▶▶", - 1756, - 1066, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - core.drawWindowSkin( - "winskin.webp", - ctx, - 1700, - 900, - 192, - 96, - null, - null, - null, - 3 - ); - let autoText = "AUTO"; - if (auto) autoText = "STOP"; - core.fillBoldText1( - ctx, - autoText, - 1722, - 966, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - } - if (this.name) - core.fillBoldText1( - ctx, - `【${this.name}】`, - 550, - 880, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); //绘制名字 + if (img) { + //绘制背景 + if (this.memory) ctx.filter = "sepia(50%)"; + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.filter = "none"; + } else { + core.fillRect(ctx, 0, 0, 2028, 1248); + } + this.bodyList.forEach((v) => { + //绘制立绘 + const body = core.material.images.images?.[v.name]; + if (v.filter) ctx.filter = "brightness(50%)"; + if (body) { + if (!v.w && !v.h && !v.scale) v.scale = 1.7; + if (!v.w && !v.h) { + ctx.drawImage( + body, + 0, + 0, + body.width, + body.height, + v.px, + 1248 - body.height * v.scale, + body.width * v.scale, + body.height * v.scale + ); + } else { + ctx.drawImage( + body, + 0, + 0, + body.width, + body.height, + v.px, + 1248 - (v.h ?? body.height), + v.w ?? body.width, + v.h ?? body.height + ); + } + } + ctx.filter = "none"; + }); + if (core.isPlaying() && !this.WindowSkin) + core.drawWindowSkin( + "winskin.webp", + ctx, + 30, + 780, + 1968, + 436, + null, + null, + null, + 3 + ); //绘制对话框 + const head = core.material.images.images?.[this.head.name]; + if (head) { + //绘制头像 + ctx.drawImage( + head, + 0, + 0, + head.width, + head.height, + this.head.px, + 1248 - head.height * 2.2, + head.width * 2.2, + head.height * 2.2 + ); + } + if (core.isPlaying() && !this.WindowSkin) { + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 800, + 192, + 96, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx, + "记 录", + 1736, + 866, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 1100, + 192, + 96, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx, + "存 档", + 1736, + 1166, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 1000, + 192, + 96, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx, + "▶▶", + 1756, + 1066, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 900, + 192, + 96, + null, + null, + null, + 3 + ); + let autoText = "AUTO"; + if (auto) autoText = "STOP"; + core.fillBoldText1( + ctx, + autoText, + 1722, + 966, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + } + if (this.name) + core.fillBoldText1( + ctx, + `【${this.name}】`, + 550, + 880, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); //绘制名字 - if ( - this.sound && - core.sounds && - !core.getFlag("skip", false) && - core.musicStatus.soundStatus - ) { - this.beforeSound = core.playSound(this.sound, null, () => { - if ( - this.sound && - auto && - !this.WindowSkin && - core.musicStatus.soundStatus - ) { - setTimeout(() => { - if (auto) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - }, this.wait); - } - }); - } - if (this.text && !core.getFlag("skip", false)) { - //绘制对话 - this.drawTextContent(ctx, this.text, { - left: 550, - top: 950, - bold: true, - color: "#FFFFFF", - align: "left", - fontSize: 48, - time: this.time || 0, - font: "Verdana", - maxWidth: 1000, - }); - } + if ( + this.sound && + core.sounds && + !core.getFlag("skip", false) && + core.musicStatus.soundStatus + ) { + this.beforeSound = core.playSound(this.sound, null, () => { + if ( + this.sound && + auto && + !this.WindowSkin && + core.musicStatus.soundStatus + ) { + setTimeout(() => { + if (auto) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + }, this.wait); + } + }); + } + if (this.text && !core.getFlag("skip", false)) { + //绘制对话 + this.drawTextContent(ctx, this.text, { + left: 550, + top: 950, + bold: true, + color: "#FFFFFF", + align: "left", + fontSize: 48, + time: this.time || 0, + font: "Verdana", + maxWidth: 1000, + }); + } - ctx.restore(); - } - } - core.ui.cgText = new cgText(); -}, + ctx.restore(); + } + } + core.ui.cgText = new cgText(); + }, "旁白": function () { // 在此增加新插件 const over = document.createElement("canvas"); //over画布设置 @@ -18096,7 +17875,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = music.loop = "loop"; core.material.bgms[name] = music;*/ }; - }, "横屏切换": function () { // 在此增加新插件 @@ -18168,210 +17946,214 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "帧动画特效(游戏界面)": function () { - // 在此增加新插件 - const animate2 = document.createElement("canvas"); //画布设置 - animate2.style.zIndex = 91; - animate2.id = "animate2"; - animate2.classList.add("gameCanvas", "anti-aliasing"); - animate2.style.display = "block"; - animate2.width = 416; - animate2.height = 416; - animate2.style.width = core.__PIXELS__ * core.domStyle.scale + "px"; - animate2.style.height = core.__PIXELS__ * core.domStyle.scale + "px"; - main.dom.animate2 = animate2; - const anctx = animate2.getContext("2d"); - - main.dom.gameDraw.appendChild(animate2); - - core.plugin.playing = new Set(); - - this.setanimate = function ( - name, - px, - py, - width, - height, - allFarme, - imageList, - soundList - ) { - const data = { - px: px, - py: py, - width: width, - height: height, - allFarme: allFarme, - imageList: imageList, - soundList: soundList, - }; - core.setFlag("animate_" + name, data); - }; - this.deleteanimate = function (name) { - core.setFlag("animate_" + name); - }; - let thistime = 0; - this.playanimate = function (name, x, y, hero, scalex, scaley) { - const data = { - name: name, - x: x, - y: y, - hero: hero, - scalex: scalex, - scaley: scaley, - farme: 0, - }; - - core.plugin.playing.add(data); - }; - core.registerAnimationFrame("animateonmap", true, function (timestamp) { - if (timestamp - thistime > 1000 / 60) { - thistime = timestamp; - core.clearMap(anctx); - core.plugin.playing.forEach((one) => { - const data = flags["animate_" + one.name]; - if (!data) { - core.plugin.playing.delete(one); - } else { - data.imageList.forEach(function (image) { - if ( - one.farme >= (image.beforefarme ?? 0) && - one.farme <= (image.afterfarme ?? data.allFarme) - ) { - const img = core.material.images.images?.[image.image]; - if (img) { - const gla = image.globalAlpha ?? 100; - const agla = image.aglobalAlpha ?? gla, - beforefarme = image.beforefarme ?? 0; - const afterfarme = image.afterfarme ?? data.allFarme; - - anctx.globalAlpha = - (gla + - ((agla - gla) * (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1)) / - 100; - - const cx = - (image.cx ?? 0) + - (((image.acx ?? 0) - (image.cx ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - cy = - (image.cy ?? 0) + - (((image.acy ?? 0) - (image.cy ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - cw = - (image.cw ?? img.width) + - (((image.acw ?? img.width) - (image.cw ?? img.width)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - ch = - (image.ch ?? img.height) + - (((image.acw ?? img.height) - (image.cw ?? img.height)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - x = - (image.x ?? 0) + - (((image.ax ?? 0) - (image.x ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - y = - (image.y ?? 0) + - (((image.ay ?? 0) - (image.y ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - w = - (image.w ?? one.width) + - (((image.aw ?? one.width) - (image.w ?? one.width)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - h = - (image.h ?? one.height) + - (((image.aw ?? one.height) - (image.w ?? one.height)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - angle = - (Math.PI * - ((image.image.angle ?? 0) + - (((image.aangle ?? 0) - (image.image.angle ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1))) / - 180; - - if (one.hero) { - let sx, sy; - if (core.status.heroMoving < 0) { - sx = 0; - sy = 0; - } else { - sx = - core.utils.scan[core.status.hero.loc.direction].x * - 4 * - core.status.heroMoving; - sy = - core.utils.scan[core.status.hero.loc.direction].y * - 4 * - core.status.heroMoving; - } - const herox = core.status.hero.loc.x * 32 + 16 + sx; - const heroy = core.status.hero.loc.y * 32 + 16 + sy; - core.drawImage( - anctx, - img, - cx, - cy, - cw, - ch, - herox + (x - data.px) * one.scalex, - heroy + (y - data.py) * one.scaley, - w * one.scalex, - h * one.scaley, - angle - ); - } else { - core.drawImage( - anctx, - img, - cx, - cy, - cw, - ch, - one.x + (x - data.px) * one.scalex, - one.y + (y - data.py) * one.scaley, - w * one.scalex, - h * one.scaley, - angle - ); - } - } - } - }); - data.soundList.forEach(function (sound) { - const lisen = - sound.sound && - core.sounds[sound.sound] && - core.musicStatus.soundStatus; - if (one.farme == sound.startfarme && lisen) { - if (sound.stopbefore) core.stopSound(); - core.playSound(sound.sound); - } - }); - one.farme++; - if (one.farme > data.allFarme) core.plugin.playing.delete(one); - } - }); - } - }); - }, - "intro&loop": function () { // 在此增加新插件 - this.introAndLoop = function (intro, time, loop) { - core.playBgm(intro); - setTimeout(() => { - core.playBgm(loop); - }, time * 1000); + const animate2 = document.createElement("canvas"); //画布设置 + animate2.style.zIndex = 91; + animate2.id = "animate2"; + animate2.classList.add("gameCanvas", "anti-aliasing"); + animate2.style.display = "block"; + animate2.width = 416; + animate2.height = 416; + animate2.style.width = core.__PIXELS__ * core.domStyle.scale + "px"; + animate2.style.height = core.__PIXELS__ * core.domStyle.scale + "px"; + main.dom.animate2 = animate2; + const anctx = animate2.getContext("2d"); + + main.dom.gameDraw.appendChild(animate2); + + core.plugin.playing = new Set(); + + this.setanimate = function ( + name, + px, + py, + width, + height, + allFarme, + imageList, + soundList + ) { + const data = { + px: px, + py: py, + width: width, + height: height, + allFarme: allFarme, + imageList: imageList, + soundList: soundList, + }; + core.setFlag("animate_" + name, data); }; + this.deleteanimate = function (name) { + core.setFlag("animate_" + name); + }; + let thistime = 0; + this.playanimate = function (name, x, y, hero, scalex, scaley, callback) { + const data = { + name: name, + x: x, + y: y, + hero: hero, + scalex: scalex, + scaley: scaley, + farme: 0, + callback + }; + + core.plugin.playing.add(data); + }; + core.registerAnimationFrame("animateonmap", true, function (timestamp) { + if (timestamp - thistime > 1000 / 60) { + thistime = timestamp; + core.clearMap(anctx); + core.plugin.playing.forEach((one) => { + const data = flags["animate_" + one.name]; + if (!data) { + core.plugin.playing.delete(one); + } else { + data.imageList.forEach(function (image) { + if ( + one.farme >= (image.beforefarme ?? 0) && + one.farme <= (image.afterfarme ?? data.allFarme) + ) { + const img = core.material.images.images?.[image.image]; + if (img) { + const gla = image.globalAlpha ?? 100; + const agla = image.aglobalAlpha ?? gla, + beforefarme = image.beforefarme ?? 0; + const afterfarme = image.afterfarme ?? data.allFarme; + + anctx.globalAlpha = + (gla + + ((agla - gla) * (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1)) / + 100; + + const cx = + (image.cx ?? 0) + + (((image.acx ?? 0) - (image.cx ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + cy = + (image.cy ?? 0) + + (((image.acy ?? 0) - (image.cy ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + cw = + (image.cw ?? img.width) + + (((image.acw ?? img.width) - (image.cw ?? img.width)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + ch = + (image.ch ?? img.height) + + (((image.acw ?? img.height) - (image.cw ?? img.height)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + x = + (image.x ?? 0) + + (((image.ax ?? 0) - (image.x ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + y = + (image.y ?? 0) + + (((image.ay ?? 0) - (image.y ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + w = + (image.w ?? one.width) + + (((image.aw ?? one.width) - (image.w ?? one.width)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + h = + (image.h ?? one.height) + + (((image.aw ?? one.height) - (image.w ?? one.height)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + angle = + (Math.PI * + ((image.image.angle ?? 0) + + (((image.aangle ?? 0) - (image.image.angle ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1))) / + 180; + + if (one.hero) { + let sx, sy; + if (core.status.heroMoving < 0) { + sx = 0; + sy = 0; + } else { + sx = + core.utils.scan[core.status.hero.loc.direction].x * + 4 * + core.status.heroMoving; + sy = + core.utils.scan[core.status.hero.loc.direction].y * + 4 * + core.status.heroMoving; + } + const herox = core.status.hero.loc.x * 32 + 16 + sx; + const heroy = core.status.hero.loc.y * 32 + 16 + sy; + core.drawImage( + anctx, + img, + cx, + cy, + cw, + ch, + herox + (x - data.px) * one.scalex, + heroy + (y - data.py) * one.scaley, + w * one.scalex, + h * one.scaley, + angle + ); + } else { + core.drawImage( + anctx, + img, + cx, + cy, + cw, + ch, + one.x + (x - data.px) * one.scalex, + one.y + (y - data.py) * one.scaley, + w * one.scalex, + h * one.scaley, + angle + ); + } + } + } + }); + data.soundList.forEach(function (sound) { + const lisen = + sound.sound && + core.sounds[sound.sound] && + core.musicStatus.soundStatus; + if (one.farme == sound.startfarme && lisen) { + if (sound.stopbefore) core.stopSound(); + core.playSound(sound.sound); + } + }); + one.farme++; + if (one.farme > data.allFarme) { + core.plugin.playing.delete(one) + if (one.callback) { one.callback() } + }; + } + }); + } + }); }, + "intro&loop": function () { + // 在此增加新插件 + this.introAndLoop = function (intro, time, loop) { + core.playBgm(intro); + setTimeout(() => { + core.playBgm(loop); + }, time * 1000); + }; + }, "开局选项悬停": function () { // 在此增加新插件 @@ -18728,8 +18510,13 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = oneTurn, enemyInfo, equipInfo, - farme + farme, + damageInfo ) { + let attack = false + if (heroInfo.isAttack) attack = true + if (enemyInfo.isAttack) attack = true + equipInfo.forEach(function (v) { if (v.isAttack) attack = true }) core.clearMap(ctx); let animate = Math.floor(farme / 30); core.fillRect(ctx, 64, 64, 288, 288, "rgba(0,0,0,0.5)"); @@ -18739,46 +18526,49 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx, hero.name, 127, - 123, + 128, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.setTextAlign(ctx, "left"); - core.drawIcon(ctx, 'hp', 70, 190, 16, 16) - core.drawIcon(ctx, 'atk', 70, 210, 16, 16) - core.drawIcon(ctx, 'def', 70, 230, 16, 16) - core.drawIcon(ctx, 'I374', 70, 250, 16, 16) - core.drawIcon(ctx, 'I375', 70, 270, 16, 16) - core.drawIcon(ctx, 'mdef', 70, 290, 16, 16) - core.drawIcon(ctx, 'amulet', 70, 310, 16, 16) - core.drawIcon(ctx, 'jumpShoes', 70, 330, 16, 16) + core.drawIcon(ctx, "hp", 70, 190, 16, 16); + core.drawIcon(ctx, "atk", 70, 210, 16, 16); + core.drawIcon(ctx, "def", 70, 230, 16, 16); + core.drawIcon(ctx, "I374", 70, 250, 16, 16); + core.drawIcon(ctx, "I375", 70, 270, 16, 16); + core.drawIcon(ctx, "mdef", 70, 290, 16, 16); + core.drawIcon(ctx, "amulet", 70, 310, 16, 16); + core.drawIcon(ctx, "jumpShoes", 70, 330, 16, 16); core.fillBoldText( ctx, - '生命 ' + core.formatBigNumber(heroInfo.hp, true) + " / " + core.formatBigNumber(heroInfo.hpmax, true), + "生命 " + + core.formatBigNumber(heroInfo.hp, true) + + " / " + + core.formatBigNumber(heroInfo.hpmax, true), 90, 205, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, - '攻击 ' + core.formatBigNumber(heroInfo.atk), + "攻击 " + core.formatBigNumber(heroInfo.atk), 90, 225, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, - '防御 ' + core.formatBigNumber(heroInfo.def), + "防御 " + core.formatBigNumber(heroInfo.def), 90, 245, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, @@ -18787,43 +18577,51 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 265, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, - "法攻 " + core.formatBigNumber(heroInfo.matk / 100 * heroInfo.spell) + "(" + heroInfo.matk + "%)", + "法攻 " + + core.formatBigNumber((heroInfo.matk / 100) * heroInfo.spell) + + "(" + + heroInfo.matk + + "%)", 90, 285, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, - '护盾 ' + core.formatBigNumber(heroInfo.mdef / 100 * heroInfo.spell) + "(" + heroInfo.mdef + "%)", + "护盾 " + + core.formatBigNumber((heroInfo.mhp / 100) * heroInfo.spell) + + "(" + + heroInfo.mhp + + "%)", 90, 305, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, - '法抗 ' + heroInfo.spelldef + "%", + "法抗 " + heroInfo.mdef + "%", 90, 325, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, - '速度 ' + core.formatBigNumber(heroInfo.speed), + "速度 " + core.formatBigNumber(heroInfo.speed), 90, 345, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.strokeRect(ctx, 112, 139, 32, 48, "rgba(255,255,255,1)", 1); @@ -18840,17 +18638,17 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 48 ); - core.setTextAlign(ctx, "center"); core.fillBoldText( ctx, enemyInfo.name, 289, - 123, + 128, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); + core.setTextAlign(ctx, "right"); if (enemyInfo.cls === "enemys") { core.strokeRect(ctx, 272, 155, 32, 32, "rgba(255,255,255,1)", 1); @@ -18883,37 +18681,37 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 48 ); } - core.drawIcon(ctx, 'hp', 330, 190, 16, 16) - core.drawIcon(ctx, 'atk', 330, 210, 16, 16) - core.drawIcon(ctx, 'def', 330, 230, 16, 16) - core.drawIcon(ctx, 'amulet', 330, 250, 16, 16) - core.drawIcon(ctx, 'jumpShoes', 330, 270, 16, 16) + core.drawIcon(ctx, "hp", 330, 190, 16, 16); + core.drawIcon(ctx, "atk", 330, 210, 16, 16); + core.drawIcon(ctx, "def", 330, 230, 16, 16); + core.drawIcon(ctx, "amulet", 330, 250, 16, 16); + core.drawIcon(ctx, "jumpShoes", 330, 270, 16, 16); core.fillBoldText( ctx, - core.formatBigNumber(enemyInfo.hp, true) + ' 生命', + core.formatBigNumber(enemyInfo.hp, true) + " 生命", 330, 205, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, - core.formatBigNumber(enemyInfo.atk) + ' 攻击', + core.formatBigNumber(enemyInfo.atk) + " 攻击", 330, 225, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, - core.formatBigNumber(enemyInfo.def) + ' 防御', + core.formatBigNumber(enemyInfo.def) + " 防御", 330, 245, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( @@ -18923,7 +18721,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 265, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, @@ -18932,24 +18730,147 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 285, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); - core.fillBoldText(ctx, + core.fillBoldText( + ctx, "V", 219, 163, "#FFFFFF", "#000000", - 'bold 48px pala') - core.fillBoldText(ctx, + "bold 48px pala" + ); + core.fillBoldText( + ctx, "s", 231, 163, "#FFFFFF", "#000000", - 'bold 36px pala') + "bold 36px pala" + ); + + if (!attack) enemyInfo.now += enemyInfo.speed / oneTurn * 215 + let enemynow = Math.min(100 + enemyInfo.now, 315) + ctx.fillStyle = "#FFFFFF" + ctx.beginPath() + ctx.moveTo(enemynow, 100) + ctx.lineTo(enemynow + 3, 90) + ctx.lineTo(enemynow - 3, 90) + ctx.closePath() + ctx.fill() + + if (enemyInfo.cls === "enemys") { + + + core.drawImage( + ctx, + core.getBlockInfo(enemyInfo.id).image, + 32, + core.getBlockInfo(enemyInfo.id).posY * 32, + 32, + 32, + enemynow - 16, + 64, + 32, + 32 + ); + } else { + + + core.drawImage( + ctx, + core.getBlockInfo(enemyInfo.id).image, + 32, + core.getBlockInfo(enemyInfo.id).posY * 48, + 32, + 19, + enemynow - 16, + 70, + 32, + 19 + ); + } + core.drawLine(ctx, 100, 105, 315, 105, '#FFFFFF', 5) + equipInfo.forEach(function (v) { + if (!attack) v.now += v.speed / oneTurn * 215 + let vnow = Math.min(100 + v.now, 315) + ctx.beginPath() + ctx.moveTo(vnow, 100) + ctx.lineTo(vnow + 3, 90) + ctx.lineTo(vnow - 3, 90) + ctx.closePath() + + ctx.fill() + + core.drawIcon(ctx, + v.id, + vnow - 16, + 64, + 32, + 32) + + }) + if (!attack) heroInfo.now += heroInfo.speed / oneTurn * 215 + let heronow = Math.min(100 + heroInfo.now, 315) + ctx.beginPath() + ctx.moveTo(heronow, 100) + ctx.lineTo(heronow + 3, 90) + ctx.lineTo(heronow - 3, 90) + ctx.closePath() + + ctx.fill() + console.log(heronow) + core.drawImage(ctx, + "hero.webp", + 0, + 0, + 32, + 19, + heronow - 16, + 70, + 32, + 19) + + if (heroInfo.now >= 215) { + heroInfo.isAttack = true; + animateOnAttack("sword", true, () => { + heroInfo.now -= 215 + heroInfo.isAttack = false + + }) + + } + if (enemyInfo.now >= 215) { + enemyInfo.isAttack = true + animateOnAttack("sword", false, () => { + enemyInfo.now -= 215 + enemyInfo.isAttack = false + + }) + } + equipInfo.forEach(v => { + if (v.now >= 215) { + v.isAttack = true + + animateOnAttack("sword", true, () => { + v.now -= 215 + v.isAttack = false + + }) + } + }) }; + function animateOnAttack(name, onenemy, callback) { + if (onenemy) { + core.playanimate(name, 290, 160, null, 1, 1, callback) + } else { + core.playanimate(name, 130, 160, null, 1, 1, callback) + } + } + this.attackAnimate = function ( enemyId, enemyInfo, @@ -18964,36 +18885,43 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = hero_atk = core.getRealStatusOrDefault(hero, "atk"), hero_def = core.getRealStatusOrDefault(hero, "def"), hero_spell = core.getRealStatusOrDefault(hero, "spell"), - hero_matk = core.getRealStatusOrDefault(hero, "mdef"), + hero_matk = core.getRealStatusOrDefault(hero, "matk"), hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), hero_speed = core.getRealStatusOrDefault(hero, "speed"), hero_hpmax = core.getRealStatusOrDefault(hero, "hpmax"), - hero_spelldef = core.getRealStatusOrDefault(hero, "spelldef"); + hero_mhp = core.getRealStatusOrDefault(hero, "mhp"); const heroInfo = { hp: hero_hp, hpmax: hero_hpmax, atk: hero_atk, def: hero_def, spell: hero_spell, - spelldef: hero_spelldef, + mhp: hero_mhp, matk: hero_matk, mdef: hero_mdef, speed: hero_speed, now: 0, + isAttack: false }; enemyInfo.id = enemyId; enemyInfo.cls = core.getClsFromId(enemyId); enemyInfo.name = core.material.enemys[enemyId].name; - + enemyInfo.now = 0; + enemyInfo.isAttack = false let oneTurn = heroInfo.speed + enemyInfo.speed; if (equipInfo.length > 0) { for (let i; i < equipInfo.length - 1; i++) { + equipInfo[i].now = 0 + equipInfo[i].isAttack = false oneTurn += equipInfo[i].speed; } } - oneTurn *= 100; + oneTurn *= 25; let time = 0, farme = 0; + + + core.registerAnimationFrame("attackAnimate", true, (temptime) => { if (temptime - time > 1000 / 60) { time = temptime; @@ -19002,7 +18930,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = oneTurn, enemyInfo, equipInfo, - farme + farme, + damageInfo ); farme++; } @@ -19010,574 +18939,574 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "剧情内容": function () { - // 在此增加新插件 - // 每项为一个数组,第一项是名字,第二项是对话内容 - // 回放只会在同一个this下回放,进入剧情前请以事件块声明进入哪个剧情数组 - // 可以自由添加,但不能与已有插件及函数名相同,可以使用中文。 - this.chapter0 = [ - ["", "这些天,街道不曾下雨。"], - ["", "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。"], - ["", "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。"], - ["", "扑哧。"], - ["", "耳旁再次响起象征着某个女孩子死去的声音。"], - ["", "再一次——"], - ["", "再一次。"], - ["", "女子们被肢解成单纯的肉块。"], - ["", "我任由流下的血浸满全身,屏住自己的呼吸。"], - ["", "祈求自己能拥有从猎人手中逃脱的幸运。"], - ["", "扑哧。"], - ["", "直到刚才,我们还坐在去往娼馆的马车的路上。"], - ["", "而在这之中的某些人,已经不在这个世上了。"], - ["", "不,应该把“某些”换成“几乎所有”才更为恰当吧。"], - ["", "恐怕,不久之后我也会变成小巷中血腥的装饰品。"], - ["", "我是为了得到这种死法,才辛苦苟活至今的吗?"], - ["", "来个人告诉我啊——"], - ["", "谁都好。"], - ["", "来人啊!!"], - ["少女", "「呃······!?」"], - ["", "漆黑的物体充斥了我的整个视野"], - ["", "我很快意识到,那是只很大的脚。"], - ["", "必须要出声求救。"], - ["", "可是,耳中却只能听到自己的牙关不停交战的声音。"], - ["", "我是如此的无助。"], - ["", "逃跑也好,道歉也罢。"], - ["", "就连抬头看一眼将要杀掉我的人的面孔都做不到。"], - ["少女", "「······被杀」"], - ["", "会被杀。"], - ["", "会被杀!!"], - ["", "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。"], - ["少女", "「不,不要······」"], - ["", "浮游都市,《诺瓦斯·艾蒂尔》。"], - ["", "《特别受灾地区》——"], - ["", "通称,《牢狱》"], - ["", "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。"], - ["年轻人", "「放开我!」"], - ["年轻人", "「我只是在帮那个女人而已!」"], - ["年轻人", "「你们没听到吗!?」"], - ["年轻人", "「她是被受骗才会被卖到娼馆来的」"], - ["年轻人", "「用肮脏的手段把钱借给她父母的,就是你们这些家伙吧!?」"], - ["年轻人", "「给我说些什么啊」"], - ["凯伊姆", "「这些话等到了娼馆再说吧」"], - ["凯伊姆", "「我来抓你,只是受雇于人而已」"], - ["", "我走进娼馆《莉莉乌姆》的接待室。"], - ["", "正在桌旁整理账簿的奥兹停下手头的工作,抬起头向我看来。"], - ["奥兹", "「这不是凯伊姆先生吗,辛苦了」"], - ["奥兹", "「委托已经完成了吗?」"], - ["凯伊姆", "「啊啊,是这家伙没错吧」"], - ["", "奥兹用只要接触到就能杀人般的眼神在男人脸上搜过。"], - ["奥兹", "「没错,就是这个人」"], - ["凯伊姆", "「是么」"], - ["年轻人", "「你,你们要对我做什么」"], - ["奥兹", "「······」"], - ["", "奥兹用一个眼神,就让男人闭上了嘴。"], - ["", "然后,向我这边转过身来。"], - ["奥兹", "「抱歉啊,总是麻烦你去做这些无聊的事」"], - ["奥兹", "「都怪我们这边的年轻人太没用」"], - ["凯伊姆", "「客套话就免了」"], - ["奥兹", "「这还真是失礼了」"], - ["奥兹", "「喂,来个人」"], - ["光头男人", "「是」"], - ["奥兹", "「凯伊姆先生做完工作回来了」"], - ["光头男人", "「是,是,那个······」"], - ["奥兹", "「我是要你拿些酒来,这个蠢材!」"], - ["", "喀!"], - ["", "奥兹扔出的烟灰缸砸中了手下的额头。"], - ["", "鲜血四溅。"], - ["凯伊姆", "「不用这么麻烦」"], - ["凯伊姆", "「我接下来要去《菲诺列塔》」"], - ["奥兹", "「喔唷」"], - ["奥兹", "「既然如此,我就不留您在这里喝难饮的劣质酒了」"], - ["", "奥兹斜眼看着正捂住额头呻吟的手下,轻描淡写地说道。"], - ["凯伊姆", "「用这些钱去买药」"], - ["", "我将几枚铜钱仍在那个手下的身前。"], - ["奥兹", "「凯伊姆先生,不用对他们这么好」"], - ["凯伊姆", "「无妨」"], - ["凯伊姆", "「话说回来,那个要落跑的女人呢?」"], - ["奥兹", "「我把她交给那些年轻人了,现在应该正在体会人生的严苛吧」"], - ["奥兹", "「正好,趁此机会凯伊姆先生也来享受一番如何?」"], - ["年轻人", "「你,你们这些家伙,要对她做什么!?」"], - ["", "咣!"], - ["", "奥兹给了他一拳。"], - ["", "一击即倒。"], - ["", "喀,咚,咯!"], - ["", "奥兹毫不留情地向男人的脸上踩去。"], - ["年轻人", "「咕······呃咳······」"], - ["", "折断的牙齿伴着血泡被吐出。"], - ["", "这份白色在鲜红色的液体中格外显眼。"], - ["年轻人", "「你们以为做出这种事······卫兵会坐视不理吗······」"], - ["奥兹", "「啊啊,不会坐视不理的」"], - ["奥兹", "「应该会拿出你的钱包,和我们商量如何瓜分吧」"], - ["年轻人", "「那,那种事······」"], - ["", "这在牢狱是理所当然的事。"], - ["奥兹", "「怎么,头一回来牢狱么?」"], - ["", "男人点了点头。"], - ["奥兹", "「为了被骗的女人而来到牢狱,真是个规矩人啊」"], - ["奥兹", "「······前提是,被骗的人不是你」"], - ["年轻人", "「你说······我被骗了?」"], - ["年轻人", "「那,那是怎么回事!?」"], - ["奥兹", "「不用急,今天晚上会好好告诉你的」"], - ["", "奥兹抓起男人的脸。"], - ["", "为引诱客人的怜悯之心而装纯,是娼妇的惯用手段。"], - ["", "双亲被骗而借钱,结果作为抵押而将自己卖到这里,这是典型的说法。"], - [ - "", - "如果只是头脑发热而成为常客也就罢了,这次的男人热血过头,居然想出了要带女人私奔的计划。", - ], - [ - "", - "虽然女人半开玩笑地予以拒绝,但不知天高地厚的这家伙还是拉着她逃跑了。", - ], - ["", "不过,想要逃脱追击本来就是不可能的任务。"], - ["", "但即便如此,这种事情还是会一再的出现。"], - ["", "说谎的女人和被骗的男人。"], - ["", "在娼馆街,这是令人看到生厌的日常的风景。"], - ["凯伊姆", "「我要走了」"], - ["奥兹", "「好的,下次再麻烦您」"], - ["奥兹", "「之后吉克先生会将谢礼交给您的」"], - ["凯伊姆", "「啊啊」"], - ["", "我背向奥兹走出娼馆。"], - ["凯伊姆", "「······?」"], - ["", "从远方传来微弱的歌声。"], - ["", "是关卡广场的方向。"], - ["", "对了。"], - ["", "今天有觐见圣女的仪式。"], - ["", "当代的圣女伊莲——"], - ["", "俗称《盲眼之圣女》,据说即使在历代的圣女中,人气也是数一数二的。"], - ["", "广场上的人估计相当多吧。"], - ["", "虽然我也想去看看她长什么样,不过要在人潮中挤来挤去就免了。"], - ["", "还是老老实实去菲诺列塔喝烧酒吧。"], - ["", "正当我这样想着的时候,一个身影自小巷的那头走来。"], - ["凯伊姆", "「艾莉斯」"], - ]; - this.chapter01 = [ - ["艾莉斯", "「啊,凯伊姆」"], - ["艾莉斯", "「正好,我还想要去找你呢」"], - ["艾莉斯", "「没想到凯伊姆会主动出现······这是命运吗?」"], - ["凯伊姆", "「显然不是吧」"], - ["艾莉斯", "「啊,是么」"], - ["", "艾莉斯挑了挑整齐的双眉,微微地哼了一声。"], - [ - "", - "虽然是个相当引人注目的美人,但她这个将亲切儿子丢入无底深渊的性格,为自己扣了不少的分", - ], - ["", "给人印象最深的,就是那潭水般的双瞳。"], - ["", "在漆黑的瞳孔中,完全看不出感情的波动。"], - ["艾莉斯", "「喜欢我的眼睛吗?」"], - ["艾莉斯", "「如果想要的话就给你吧?」"], - ["凯伊姆", "「用不着」"], - ["艾莉斯", "「阿拉,可惜」"], - ["凯伊姆", "「那么,找我有什么事」"], - ["艾莉斯", "「梅尔特的钱好像被偷了」"], - ["凯伊姆", "「钱被偷了?都几岁了还这么没用」"], - ["艾莉斯", "「不要对我说啊」"], - ["凯伊姆", "「那家伙,该不会说要让我去抓那个小偷吧?」"], - ["艾莉斯", "「就是这样」"], - ["凯伊姆", "「笨蛋吗」"], - ["凯伊姆", "「如果是小钱的话,就当做是买个教训吧」"], - ["艾莉斯", "「说起来,被盗的是这个月的上纳金」"], - ["凯伊姆", "「你说什么?」"], - ["艾莉斯", "「用这些钱买教训,也太过奢侈了呢」"], - ["凯伊姆", "「知道了,我去找」"], - ["凯伊姆", "「小偷的特征呢」"], - ["艾莉斯", "「男孩子」"], - ["艾莉斯", "「······而且,背后有翅膀」"], - ["艾莉斯", "「虽然姑且是藏在身后,但是仔细观察的话是很明显的」"], - ["凯伊姆", "「羽化病吗」"], - [ - "艾莉斯", - "「那些人可是毫不留情的,所以即使是为了那个孩子,也要赶快抓到他」", - ], - ["凯伊姆", "「注意到他逃窜的方向了吗?」"], - ["艾莉斯", "「广场那边」"], - ["艾莉斯", "「虽然刚才《不蚀金锁》的人去追了,不过多半是······」"], - ["凯伊姆", "「偏偏还是广场吗」"], - ["艾莉斯", "「今天是觐见圣女大人的日子」"], - ["凯伊姆", "「我知道」"], - ["凯伊姆", "「尽量找找看就好」"], - ]; - this.chapter02 = [ - ["不蚀金锁成员", "「凯伊姆先生,凯伊姆先生」"], - ["不蚀金锁成员", "「您已经和艾莉斯大夫见过面了吗?」"], - ["凯伊姆", "「啊啊,所以才会追过来的」"], - ["凯伊姆", "「看到小偷了吗?」"], - [ - "不蚀金锁成员", - "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", - ], - [ - "不蚀金锁成员", - "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", - ], - ["不蚀金锁成员", "「我已经准备撤退了」"], - ["不蚀金锁成员", "「凯伊姆先生还要继续追吗?」"], - ["凯伊姆", "「啊啊」"], - ["", "做完情报交换之后,我跟男人道别。"], - ["凯伊姆", "「和我想的一样啊······」"], - ["", "在牢狱中最大的广场上,聚集着看不到尽头的人群。"], - ["", "就算是来参见圣女祈祷,这人数也太多了点吧。"], - ["", "自然,我也找不到逃跑的孩子。"], - ["", "是混杂到人群中了吧。"], - ["", "如果已经从广场上脱身了的话,就更难发现了。"], - ["", "只好赌他还在这里了。"], - ["", "我先移动到了一个视野良好的地方。"], - ["", "从这里,一眼就可以看到人群的变化。"], - ["", "广场还是沸腾起来。"], - ["", "抬头望去,原来是在天台之上出现了一个人影"], - ["", "但是,与周围的期待不同,现身的是一名中年的神官。"], - ["", "骂声四溢。"], - ["", "神官则是笑着摆正衣领"], - ["神官", "「从现在开始,举行谒见的仪式」"], - [ - "神官", - "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", - ], - [ - "神官", - "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", - ], - [ - "神官", - "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", - ], - [ - "神官", - "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", - ], - ["神官", "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」"], - ["圣女", "「不忘感谢与祈祷,神才会拯救我们」"], - ["圣女", "「与我一起,向神虔诚地祈祷吧」"], - ["", "广场上欢声雷动。"], - ["", "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。"], - ["", "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。"], - ["", "她掌握着这条街道,还有在这条街上生活的人的命运。"], - ["", "比起揽得人气,她更想要为了街道的继续存在而献出全力。"], - ["", "也是为了不让《大崩落》的惨剧再度发生。"], - ["", "十几年前的那场悲剧。"], - [ - "", - "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", - ], - ["凯伊姆", "「······」"], - ["", "这时我才想起,现在不是我在这里看圣女的时候。"], - ["女声", "「——っ!?」"], - ["围观的女人", "「羽,羽化病人!?」"], - ["围观的中年人", "「喂,谁去叫下羽狩」"], - ["惊慌的观众", "「你这家伙不要靠近我,要是传染了可怎么办」"], - ["粗鲁的观众", "「你这小鬼赶快滚开」"], - ["凯伊姆", "「接下来」"], - ["圣女", "「发生什么事了?看上去似乎很嘈杂」"], - ["随从", "「似乎是某个人逃跑了······具体的我也不是很清楚」"], - ["神官", "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」"], - ["圣女", "「不用在意我,比起那个,我更关心究竟发生了什么事」"], - ["神官", "「对不起,我真的不知道」"], - ["圣女", "「······是吗」"], - ["男", "「恕我僭越,请准许我说明情况」"], - ["男", "「在来觐见的人群中出现了《羽化病》的患者」"], - ["男", "「围观的人群因而产生了骚动」"], - [ - "男", - "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", - ], - ["圣女", "「羽化病······」"], - ["男", "「怎么了?」"], - ["圣女", "「没什么」"], - ["圣女", "「辛苦了,你的名字是?」"], - ["男", "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」"], - ["神官", "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」"], - ["神官", "「阁下是在工作上相当出色的人呢」"], - ["鲁基乌斯", "「不敢当」"], - [ - "鲁基乌斯", - "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", - ], - [ - "圣女", - "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", - ], - ["鲁基乌斯", "「属下不胜惶恐」"], - ["鲁基乌斯", "「接下来属下还要回到工作岗位上,在这里就先告退了」"], - ["圣女", "「鲁基乌斯先生」"], - ["鲁基乌斯", "「属下在」"], - ["圣女", "「你是怎样看待羽狩的工作的呢?」"], - ["神官", "「圣,圣女大人」"], - [ - "鲁基乌斯", - "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", - ], - ["神官", "「不,不亏是鲁基乌斯卿,相当优秀的想法」"], - ["圣女", "「是吗。辛苦你了」"], - ["随从", "「圣女大人······」"], - ["鲁基乌斯", "「······」"], - ["鲁基乌斯", "「那么,属下就回岗位去了」"], - ]; - this.chapter03 = [ - ["", "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。"], - ["", "显然,他并没有想到我会捷足先登吧。"], - ["", "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。。"], - ["凯伊姆", "「辛苦你了」"], - ["羽化病患少年", "「稀!?」"], - ["凯伊姆", "「逃到贫民区是个不错的想法」"], - ["羽化病患少年", "「你,你是,羽狩吗?」"], - ["凯伊姆", "「不是」"], - ["羽化病患少年", "「什,什么啊······混蛋,不要吓我啊」"], - ["凯伊姆", "「我对令你受惊这件事致以歉意」"], - ["凯伊姆", "「作为回报,麻烦你把从店里偷的钱交出来吧」"], - ["羽化病患少年", "「钱?你在说什么」"], - ["凯伊姆", "「你要找的腰上的东西,掉在你身后了」"], - ["羽化病患少年", "「哎?」"], - ["羽化病患少年", "「呃呀」"], - ["羽化病患少年", "「你······你这混蛋」"], - ["凯伊姆", "「······」"], - ["凯伊姆", "「把偷的钱交出来」"], - ["羽化病患少年", "「我不知道你在······咕」"], - ["羽化病患少年", "「你,你说是我偷的······有什么证据吗」"], - ["凯伊姆", "「你还挺倔的啊」"], - ["凯伊姆", "「不过,给我听好了」"], - ["凯伊姆", "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」"], - ["凯伊姆", "「而且,钱的主人是从前和吉克颇有渊源的女人」"], - ["羽化病患少年", "「吉克?」"], - ["凯伊姆", "「他是《不蚀金锁》的主人,这么说你就明白了吧」"], - ["羽化病患少年", "「哎?哎?怎么会······」"], - ["凯伊姆", "「再问你一遍,钱在哪里?」"], - ["羽化病患少年", "「是,是,是,在我的怀里」"], - ["凯伊姆", "「你没有擅自拿掉一部分吧」"], - ["羽化病患少年", "「是,是的」"], - ["羽化病患少年", "「那,那个,您是《不蚀金锁》的人吗?」"], - ["凯伊姆", "「算是吧」"], - ["羽化病患少年", "「我什么都可以做,请您一定要帮帮我」"], - ["凯伊姆", "「抱歉,我并没有兴趣去帮助他人」"], - ["羽化病患少年", "「我什么······什么,都会做的······」"], - ["羽化病患少年", "「我一直都是生活在下层的」"], - [ - "羽化病患少年", - "「可是,不知何时染上了羽化病······背后长出了翅膀······」", - ], - ["羽化病患少年", "「被寄宿工作的店赶了出来,只得流落到牢狱这里」"], - ["羽化病患少年", "「因为独自实在是饿的不行了,所以才会偷这些钱的」"], - [ - "羽化病患少年", - "「我明明没有做任何坏事······为什么······会遇到这种事······」", - ], - ["凯伊姆", "「谁知道」"], - ["羽化病患少年", "「呜······呜呜······接下来,要对我做什么?」"], - ["凯伊姆", "「我要把你带到组织那里」"], - ["羽化病患少年", "「怎,怎么这样」"], - ["凯伊姆", "「不过,那样做的前提是你不是羽化病人」"], - ["凯伊姆", "「组织也没有笨到把羽化病人招待到家里的程度」"], - ["羽化病患少年", "「那么,是要放我逃走吗?」"], - ["凯伊姆", "「我要让你学到教训」"], - ["凯伊姆", "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」"], - ["凯伊姆", "「你的运气不错」"], - ["羽化病患少年", "「唔······啊,是的······」"], - ["凯伊姆", "「滚」"], - ["羽化病患少年", "「非常感谢」"], - ["羽化病患少年", "「唔啊!?」"], - ["男", "「到这里就结束了,羽化病人」"], - ["男", "「确认他的翅膀」"], - ["", "趁还没有被卷入麻烦的事情之前,赶快离开这里吧"], - ["羽狩的队长", "「那边的那个人」"], - ["凯伊姆", "「······有什么事?」"], - ["羽狩的队长", "「可以稍微让我问几句话吗」"], - ["凯伊姆", "「······」"], - ["凯伊姆", "「啊啊,无妨」"], - ["羽狩的队长", "「感谢您的合作」"], - ["", "队长殷勤地致以谢礼。"], - ["", "而在他的眼前,少年的衣服已经被他的补下们扯破。"], - ["", "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。"], - ["红发的羽狩", "「副队长,确认翅膀的持有了」"], - ["羽狩的副队长", "「保护他」"], - ["羽化病患少年", "「不要······请原谅,我······」"], - [ - "羽狩的副队长", - "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", - ], - ["羽化病患少年", "「可是,可是」"], - ["羽狩的副队长", "「没关系的」"], - ["羽化病患少年", "「······哥,哥哥」"], - ["羽狩的副队长", "「你是羽化病人的亲属吗?」"], - ["凯伊姆", "「只是路人而已」"], - ["凯伊姆", "「顺带一提,我也没有打算找你们的麻烦」"], - [ - "羽狩的副队长", - "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", - ], - ["羽狩的副队长", "「我的一个部下就此永久失去了半截胳膊」"], - ["凯伊姆", "「我表示同情」"], - ["凯伊姆", "「我马上就会消失的,这样就没问题了吧?」"], - ["羽狩的副队长", "「嘛,不要这么慌张」"], - ["", "副队长看着羽化的少年。"], - ["羽狩的副队长", "「你与这个人是什么关系?没有被他殴打吗?」"], - ["羽化病患少年", "「没,没有」"], - [ - "羽狩的副队长", - "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", - ], - ["羽化病患少年", "「······」"], - ["羽化病患少年", "「那个人,是《不蚀金锁》的组织成员······」"], - ["羽化病患少年", "「突然说让我拿出钱来,我刚一拒绝他就打我」"], - ["羽狩的副队长", "「原来如此······」"], - [ - "羽狩的副队长", - "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", - ], - ["凯伊姆", "「当然不是」"], - ["凯伊姆", "「我只是从那里接受工作而已,并不是他们的成员」"], - ["羽狩的副队长", "「你的意思是说,少年在说谎吗?」"], - ["凯伊姆", "「啊啊」"], - [ - "凯伊姆", - "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", - ], - ["羽狩的副队长", "「就算我去询问,也无法从他们那里得到事实」"], - [ - "羽狩的副队长", - "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", - ], - ["凯伊姆", "「真是辛苦啊」"], - ["羽狩的副队长", "「说的是啊」"], - ["羽狩的副队长", "「其实,砍下我部下胳膊的似乎也是组织的成员呢」"], - [ - "羽狩的副队长", - "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", - ], - [ - "羽狩的副队长", - "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", - ], - ["羽狩的副队长", "「那和整条街道的和平也是紧密相关的吧?」"], - ["凯伊姆", "「我知道,你们有逮捕干扰狩猎羽化病人的权力」"], - [ - "凯伊姆", - "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", - ], - ["羽狩的副队长", "「那些话,我们会在看守所对你详细说明的」"], - ["凯伊姆", "「······」"], - ["", "在这里起争执的话,就会被羽狩加害。"], - ["", "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。"], - ["", "就算逃跑,也没有好的结果。"], - ["", "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。"], - ["", "发生了什么事······"], - ["???", "「我认为,那位先生是正确的」"], - ["", "羽狩们一起回头。"], - ["", "而在他们视线的焦点处,"], - ["", "伫立着一位女性。"], - ["", "在端正的容颜下,代表着强烈意志的双眉十分显眼。"], - ["", "身体的柔软与紧紧包裹在其身上的羽狩制服,两者显得十分的不搭配。"], - ["", "我还是第一次看到女性的羽狩。"], - ["羽狩的副队长", "「队长,这是获得《不蚀金锁》情报的好机会」"], - [ - "羽狩的队长", - "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", - ], - ["兰格副队长", "「我并没有打算去恫吓他······」"], - ["羽狩的队长", "「告诉我那个被砍掉胳膊的队员的名字」"], - ["羽狩的队长", "「我会去探望他的」"], - ["兰格副队长", "「那个是······」"], - ["羽狩的队长", "「我知道,你一直在为有所收获而努力工作」"], - ["羽狩的队长", "「但是,正因为我们的工作是为民众提供帮助」"], - ["羽狩的队长", "「所以就更不能损害人与人之间的信赖」"], - ["兰格副队长", "「我会铭记在心」"], - ["羽狩的队长", "「这位先生,我的部下失礼了」"], - ["凯伊姆", "「只要不对我再来一次就好」"], - ["羽狩的队长", "「请稍等」"], - ["凯伊姆", "「有什么事?」"], - ["羽狩的队长", "「我想确认一件事」"], - ["羽狩的队长", "「你真的不是《不蚀金锁》的成员吗?」"], - ["凯伊姆", "「真的」"], - ["凯伊姆", "「如果我说是的话,你有什么打算?」"], - ["羽狩的队长", "「我听过传闻,说他们是用依靠暴力而得的钱在生活」"], - ["凯伊姆", "「······这样啊」"], - ["凯伊姆", "「如果能有收获就好了啊」"], - ]; - this.chapter04 = [ - ["梅尔特", "「欢迎光临」"], - ["梅尔特", "「辛苦了」"], - ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」"], - ["凯伊姆", "「没什么,比想象中完成的更容易」"], - ["梅尔特", "「那就好」"], - ["梅尔特", "「这是我的一点谢意」"], - ["凯伊姆", "「味道有些变化啊」"], - ["梅尔特", "「啊,被发现了?」"], - ["梅尔特", "「最近,没能到手什么好的原料呢」"], - ["凯伊姆", "「去拜托吉克如何?」"], - [ - "梅尔特", - "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", - ], - ["凯伊姆", "「那希望你也不要来麻烦我」"], - ["梅尔特", "「那 是 两 码 事」"], - ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」"], - [ - "梅尔特", - "「而且,自己的钱被偷了这么害羞的事,向凯伊姆意外的其他人都说不出口」", - ], - ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」"], - ["梅尔特", "「这是面子问题啊,面子问题」"], - ["凯伊姆", "「嘛,算了」"], - ["凯伊姆", "「这样就好了吧?」"], - ["梅尔特", "「这是钱包呢」"], - ["梅尔特", "「嗯,东西没少」"], - ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」"], - ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」"], - ["凯伊姆", "「在那边不是来钱更快吗?」"], - ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」"], - ["凯伊姆", "「这是客套话而已」"], - ["梅尔特", "「欺负人」"], - ["梅尔特", "「总而言之,今天帮大忙了」"], - ["梅尔特", "「谢礼嘛······」"], - ["凯伊姆", "「就记在账单上吧」"], - ["梅尔特", "「了解—盛谢惠顾了哦?」"], - ["", "喀啷喀啷"], - ["", "门铃响起"], - ["", "喧哗瞬间安静下来。"], - ["", "进来的人是吉克。"], - ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], - ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], - ["吉克", "「各位继续吧」"], - ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], - ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。"], - ["凯伊姆", "「不用介意」"], - ["", "吉克轻轻点了点头,在我右边坐了下来"], - ["凯伊姆", "「逃跑的男人怎么样了?」"], - ["吉克", "「嗯?已经不在这个世上了」。"], - ["吉克", "「有什么想要知道的事吗?」"], - ["凯伊姆", "「不,没什么」"], - ["吉克", "「那个无聊的家伙,完全没有趣味呢」"], - ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」"], - ["凯伊姆", "「真是灾难啊」"], - ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」"], - ["凯伊姆", "「消息真灵通」"], - ["吉克", "「梅尔特也注意点」"], - ["吉克", "「你丢钱已经不是一回两回了」"], - ["梅尔特", "「好的—我会注意的。」"], - ["梅尔特", "「吉克还是平常的点单吧」"], - ["梅尔特", "「凯伊姆要再来一杯吗?」"], - ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], - ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], - ["吉克", "「这是抓捕逃跑男人的报酬」"], - ["凯伊姆", "「下次有什么事再告诉我」"], - ["梅尔特", "「来,久等了」"], - ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」"], - ["吉克", "「让我猜猜看」"], - ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」"], - ["梅尔特", "「可惜—」"], - ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」"], - ["凯伊姆", "「完全把你当成新进的女佣了么」"], - ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」"], - ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」"], - ["凯伊姆&吉克", "「你傻啊」"], - ["梅尔特", "「异口同声呢,不亏是兄弟」"], - ["凯伊姆", "「别用这种称呼,怪恶心的」"], - ["吉克", "「说得没错」"], - ["吉克", "「······说起来······」"], - ["梅尔特", "「怎么了?」"], - ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」"], - ["凯伊姆", "「你也说这么无聊的话题」"], - ["吉克", "「不,这是很重要的事情」"], - ["吉克", "「梅尔特,事实是怎么样的?」"], - ["梅尔特", "「啊~是怎么样的呢~」"], - ["梅尔特", "「我忘记了」"], - ["吉克", "「骗人」"], - ]; -} + // 在此增加新插件 + // 每项为一个数组,第一项是名字,第二项是对话内容 + // 回放只会在同一个this下回放,进入剧情前请以事件块声明进入哪个剧情数组 + // 可以自由添加,但不能与已有插件及函数名相同,可以使用中文。 + this.chapter0 = [ + ["", "这些天,街道不曾下雨。"], + ["", "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。"], + ["", "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。"], + ["", "扑哧。"], + ["", "耳旁再次响起象征着某个女孩子死去的声音。"], + ["", "再一次——"], + ["", "再一次。"], + ["", "女子们被肢解成单纯的肉块。"], + ["", "我任由流下的血浸满全身,屏住自己的呼吸。"], + ["", "祈求自己能拥有从猎人手中逃脱的幸运。"], + ["", "扑哧。"], + ["", "直到刚才,我们还坐在去往娼馆的马车的路上。"], + ["", "而在这之中的某些人,已经不在这个世上了。"], + ["", "不,应该把“某些”换成“几乎所有”才更为恰当吧。"], + ["", "恐怕,不久之后我也会变成小巷中血腥的装饰品。"], + ["", "我是为了得到这种死法,才辛苦苟活至今的吗?"], + ["", "来个人告诉我啊——"], + ["", "谁都好。"], + ["", "来人啊!!"], + ["少女", "「呃······!?」"], + ["", "漆黑的物体充斥了我的整个视野"], + ["", "我很快意识到,那是只很大的脚。"], + ["", "必须要出声求救。"], + ["", "可是,耳中却只能听到自己的牙关不停交战的声音。"], + ["", "我是如此的无助。"], + ["", "逃跑也好,道歉也罢。"], + ["", "就连抬头看一眼将要杀掉我的人的面孔都做不到。"], + ["少女", "「······被杀」"], + ["", "会被杀。"], + ["", "会被杀!!"], + ["", "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。"], + ["少女", "「不,不要······」"], + ["", "浮游都市,《诺瓦斯·艾蒂尔》。"], + ["", "《特别受灾地区》——"], + ["", "通称,《牢狱》"], + ["", "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。"], + ["年轻人", "「放开我!」"], + ["年轻人", "「我只是在帮那个女人而已!」"], + ["年轻人", "「你们没听到吗!?」"], + ["年轻人", "「她是被受骗才会被卖到娼馆来的」"], + ["年轻人", "「用肮脏的手段把钱借给她父母的,就是你们这些家伙吧!?」"], + ["年轻人", "「给我说些什么啊」"], + ["凯伊姆", "「这些话等到了娼馆再说吧」"], + ["凯伊姆", "「我来抓你,只是受雇于人而已」"], + ["", "我走进娼馆《莉莉乌姆》的接待室。"], + ["", "正在桌旁整理账簿的奥兹停下手头的工作,抬起头向我看来。"], + ["奥兹", "「这不是凯伊姆先生吗,辛苦了」"], + ["奥兹", "「委托已经完成了吗?」"], + ["凯伊姆", "「啊啊,是这家伙没错吧」"], + ["", "奥兹用只要接触到就能杀人般的眼神在男人脸上搜过。"], + ["奥兹", "「没错,就是这个人」"], + ["凯伊姆", "「是么」"], + ["年轻人", "「你,你们要对我做什么」"], + ["奥兹", "「······」"], + ["", "奥兹用一个眼神,就让男人闭上了嘴。"], + ["", "然后,向我这边转过身来。"], + ["奥兹", "「抱歉啊,总是麻烦你去做这些无聊的事」"], + ["奥兹", "「都怪我们这边的年轻人太没用」"], + ["凯伊姆", "「客套话就免了」"], + ["奥兹", "「这还真是失礼了」"], + ["奥兹", "「喂,来个人」"], + ["光头男人", "「是」"], + ["奥兹", "「凯伊姆先生做完工作回来了」"], + ["光头男人", "「是,是,那个······」"], + ["奥兹", "「我是要你拿些酒来,这个蠢材!」"], + ["", "喀!"], + ["", "奥兹扔出的烟灰缸砸中了手下的额头。"], + ["", "鲜血四溅。"], + ["凯伊姆", "「不用这么麻烦」"], + ["凯伊姆", "「我接下来要去《菲诺列塔》」"], + ["奥兹", "「喔唷」"], + ["奥兹", "「既然如此,我就不留您在这里喝难饮的劣质酒了」"], + ["", "奥兹斜眼看着正捂住额头呻吟的手下,轻描淡写地说道。"], + ["凯伊姆", "「用这些钱去买药」"], + ["", "我将几枚铜钱仍在那个手下的身前。"], + ["奥兹", "「凯伊姆先生,不用对他们这么好」"], + ["凯伊姆", "「无妨」"], + ["凯伊姆", "「话说回来,那个要落跑的女人呢?」"], + ["奥兹", "「我把她交给那些年轻人了,现在应该正在体会人生的严苛吧」"], + ["奥兹", "「正好,趁此机会凯伊姆先生也来享受一番如何?」"], + ["年轻人", "「你,你们这些家伙,要对她做什么!?」"], + ["", "咣!"], + ["", "奥兹给了他一拳。"], + ["", "一击即倒。"], + ["", "喀,咚,咯!"], + ["", "奥兹毫不留情地向男人的脸上踩去。"], + ["年轻人", "「咕······呃咳······」"], + ["", "折断的牙齿伴着血泡被吐出。"], + ["", "这份白色在鲜红色的液体中格外显眼。"], + ["年轻人", "「你们以为做出这种事······卫兵会坐视不理吗······」"], + ["奥兹", "「啊啊,不会坐视不理的」"], + ["奥兹", "「应该会拿出你的钱包,和我们商量如何瓜分吧」"], + ["年轻人", "「那,那种事······」"], + ["", "这在牢狱是理所当然的事。"], + ["奥兹", "「怎么,头一回来牢狱么?」"], + ["", "男人点了点头。"], + ["奥兹", "「为了被骗的女人而来到牢狱,真是个规矩人啊」"], + ["奥兹", "「······前提是,被骗的人不是你」"], + ["年轻人", "「你说······我被骗了?」"], + ["年轻人", "「那,那是怎么回事!?」"], + ["奥兹", "「不用急,今天晚上会好好告诉你的」"], + ["", "奥兹抓起男人的脸。"], + ["", "为引诱客人的怜悯之心而装纯,是娼妇的惯用手段。"], + ["", "双亲被骗而借钱,结果作为抵押而将自己卖到这里,这是典型的说法。"], + [ + "", + "如果只是头脑发热而成为常客也就罢了,这次的男人热血过头,居然想出了要带女人私奔的计划。", + ], + [ + "", + "虽然女人半开玩笑地予以拒绝,但不知天高地厚的这家伙还是拉着她逃跑了。", + ], + ["", "不过,想要逃脱追击本来就是不可能的任务。"], + ["", "但即便如此,这种事情还是会一再的出现。"], + ["", "说谎的女人和被骗的男人。"], + ["", "在娼馆街,这是令人看到生厌的日常的风景。"], + ["凯伊姆", "「我要走了」"], + ["奥兹", "「好的,下次再麻烦您」"], + ["奥兹", "「之后吉克先生会将谢礼交给您的」"], + ["凯伊姆", "「啊啊」"], + ["", "我背向奥兹走出娼馆。"], + ["凯伊姆", "「······?」"], + ["", "从远方传来微弱的歌声。"], + ["", "是关卡广场的方向。"], + ["", "对了。"], + ["", "今天有觐见圣女的仪式。"], + ["", "当代的圣女伊莲——"], + ["", "俗称《盲眼之圣女》,据说即使在历代的圣女中,人气也是数一数二的。"], + ["", "广场上的人估计相当多吧。"], + ["", "虽然我也想去看看她长什么样,不过要在人潮中挤来挤去就免了。"], + ["", "还是老老实实去菲诺列塔喝烧酒吧。"], + ["", "正当我这样想着的时候,一个身影自小巷的那头走来。"], + ["凯伊姆", "「艾莉斯」"], + ]; + this.chapter01 = [ + ["艾莉斯", "「啊,凯伊姆」"], + ["艾莉斯", "「正好,我还想要去找你呢」"], + ["艾莉斯", "「没想到凯伊姆会主动出现······这是命运吗?」"], + ["凯伊姆", "「显然不是吧」"], + ["艾莉斯", "「啊,是么」"], + ["", "艾莉斯挑了挑整齐的双眉,微微地哼了一声。"], + [ + "", + "虽然是个相当引人注目的美人,但她这个将亲切儿子丢入无底深渊的性格,为自己扣了不少的分", + ], + ["", "给人印象最深的,就是那潭水般的双瞳。"], + ["", "在漆黑的瞳孔中,完全看不出感情的波动。"], + ["艾莉斯", "「喜欢我的眼睛吗?」"], + ["艾莉斯", "「如果想要的话就给你吧?」"], + ["凯伊姆", "「用不着」"], + ["艾莉斯", "「阿拉,可惜」"], + ["凯伊姆", "「那么,找我有什么事」"], + ["艾莉斯", "「梅尔特的钱好像被偷了」"], + ["凯伊姆", "「钱被偷了?都几岁了还这么没用」"], + ["艾莉斯", "「不要对我说啊」"], + ["凯伊姆", "「那家伙,该不会说要让我去抓那个小偷吧?」"], + ["艾莉斯", "「就是这样」"], + ["凯伊姆", "「笨蛋吗」"], + ["凯伊姆", "「如果是小钱的话,就当做是买个教训吧」"], + ["艾莉斯", "「说起来,被盗的是这个月的上纳金」"], + ["凯伊姆", "「你说什么?」"], + ["艾莉斯", "「用这些钱买教训,也太过奢侈了呢」"], + ["凯伊姆", "「知道了,我去找」"], + ["凯伊姆", "「小偷的特征呢」"], + ["艾莉斯", "「男孩子」"], + ["艾莉斯", "「······而且,背后有翅膀」"], + ["艾莉斯", "「虽然姑且是藏在身后,但是仔细观察的话是很明显的」"], + ["凯伊姆", "「羽化病吗」"], + [ + "艾莉斯", + "「那些人可是毫不留情的,所以即使是为了那个孩子,也要赶快抓到他」", + ], + ["凯伊姆", "「注意到他逃窜的方向了吗?」"], + ["艾莉斯", "「广场那边」"], + ["艾莉斯", "「虽然刚才《不蚀金锁》的人去追了,不过多半是······」"], + ["凯伊姆", "「偏偏还是广场吗」"], + ["艾莉斯", "「今天是觐见圣女大人的日子」"], + ["凯伊姆", "「我知道」"], + ["凯伊姆", "「尽量找找看就好」"], + ]; + this.chapter02 = [ + ["不蚀金锁成员", "「凯伊姆先生,凯伊姆先生」"], + ["不蚀金锁成员", "「您已经和艾莉斯大夫见过面了吗?」"], + ["凯伊姆", "「啊啊,所以才会追过来的」"], + ["凯伊姆", "「看到小偷了吗?」"], + [ + "不蚀金锁成员", + "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", + ], + [ + "不蚀金锁成员", + "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", + ], + ["不蚀金锁成员", "「我已经准备撤退了」"], + ["不蚀金锁成员", "「凯伊姆先生还要继续追吗?」"], + ["凯伊姆", "「啊啊」"], + ["", "做完情报交换之后,我跟男人道别。"], + ["凯伊姆", "「和我想的一样啊······」"], + ["", "在牢狱中最大的广场上,聚集着看不到尽头的人群。"], + ["", "就算是来参见圣女祈祷,这人数也太多了点吧。"], + ["", "自然,我也找不到逃跑的孩子。"], + ["", "是混杂到人群中了吧。"], + ["", "如果已经从广场上脱身了的话,就更难发现了。"], + ["", "只好赌他还在这里了。"], + ["", "我先移动到了一个视野良好的地方。"], + ["", "从这里,一眼就可以看到人群的变化。"], + ["", "广场还是沸腾起来。"], + ["", "抬头望去,原来是在天台之上出现了一个人影"], + ["", "但是,与周围的期待不同,现身的是一名中年的神官。"], + ["", "骂声四溢。"], + ["", "神官则是笑着摆正衣领"], + ["神官", "「从现在开始,举行谒见的仪式」"], + [ + "神官", + "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", + ], + [ + "神官", + "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", + ], + [ + "神官", + "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", + ], + [ + "神官", + "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", + ], + ["神官", "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」"], + ["圣女", "「不忘感谢与祈祷,神才会拯救我们」"], + ["圣女", "「与我一起,向神虔诚地祈祷吧」"], + ["", "广场上欢声雷动。"], + ["", "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。"], + ["", "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。"], + ["", "她掌握着这条街道,还有在这条街上生活的人的命运。"], + ["", "比起揽得人气,她更想要为了街道的继续存在而献出全力。"], + ["", "也是为了不让《大崩落》的惨剧再度发生。"], + ["", "十几年前的那场悲剧。"], + [ + "", + "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", + ], + ["凯伊姆", "「······」"], + ["", "这时我才想起,现在不是我在这里看圣女的时候。"], + ["女声", "「——っ!?」"], + ["围观的女人", "「羽,羽化病人!?」"], + ["围观的中年人", "「喂,谁去叫下羽狩」"], + ["惊慌的观众", "「你这家伙不要靠近我,要是传染了可怎么办」"], + ["粗鲁的观众", "「你这小鬼赶快滚开」"], + ["凯伊姆", "「接下来」"], + ["圣女", "「发生什么事了?看上去似乎很嘈杂」"], + ["随从", "「似乎是某个人逃跑了······具体的我也不是很清楚」"], + ["神官", "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」"], + ["圣女", "「不用在意我,比起那个,我更关心究竟发生了什么事」"], + ["神官", "「对不起,我真的不知道」"], + ["圣女", "「······是吗」"], + ["男", "「恕我僭越,请准许我说明情况」"], + ["男", "「在来觐见的人群中出现了《羽化病》的患者」"], + ["男", "「围观的人群因而产生了骚动」"], + [ + "男", + "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", + ], + ["圣女", "「羽化病······」"], + ["男", "「怎么了?」"], + ["圣女", "「没什么」"], + ["圣女", "「辛苦了,你的名字是?」"], + ["男", "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」"], + ["神官", "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」"], + ["神官", "「阁下是在工作上相当出色的人呢」"], + ["鲁基乌斯", "「不敢当」"], + [ + "鲁基乌斯", + "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", + ], + [ + "圣女", + "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", + ], + ["鲁基乌斯", "「属下不胜惶恐」"], + ["鲁基乌斯", "「接下来属下还要回到工作岗位上,在这里就先告退了」"], + ["圣女", "「鲁基乌斯先生」"], + ["鲁基乌斯", "「属下在」"], + ["圣女", "「你是怎样看待羽狩的工作的呢?」"], + ["神官", "「圣,圣女大人」"], + [ + "鲁基乌斯", + "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", + ], + ["神官", "「不,不亏是鲁基乌斯卿,相当优秀的想法」"], + ["圣女", "「是吗。辛苦你了」"], + ["随从", "「圣女大人······」"], + ["鲁基乌斯", "「······」"], + ["鲁基乌斯", "「那么,属下就回岗位去了」"], + ]; + this.chapter03 = [ + ["", "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。"], + ["", "显然,他并没有想到我会捷足先登吧。"], + ["", "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。。"], + ["凯伊姆", "「辛苦你了」"], + ["羽化病患少年", "「稀!?」"], + ["凯伊姆", "「逃到贫民区是个不错的想法」"], + ["羽化病患少年", "「你,你是,羽狩吗?」"], + ["凯伊姆", "「不是」"], + ["羽化病患少年", "「什,什么啊······混蛋,不要吓我啊」"], + ["凯伊姆", "「我对令你受惊这件事致以歉意」"], + ["凯伊姆", "「作为回报,麻烦你把从店里偷的钱交出来吧」"], + ["羽化病患少年", "「钱?你在说什么」"], + ["凯伊姆", "「你要找的腰上的东西,掉在你身后了」"], + ["羽化病患少年", "「哎?」"], + ["羽化病患少年", "「呃呀」"], + ["羽化病患少年", "「你······你这混蛋」"], + ["凯伊姆", "「······」"], + ["凯伊姆", "「把偷的钱交出来」"], + ["羽化病患少年", "「我不知道你在······咕」"], + ["羽化病患少年", "「你,你说是我偷的······有什么证据吗」"], + ["凯伊姆", "「你还挺倔的啊」"], + ["凯伊姆", "「不过,给我听好了」"], + ["凯伊姆", "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」"], + ["凯伊姆", "「而且,钱的主人是从前和吉克颇有渊源的女人」"], + ["羽化病患少年", "「吉克?」"], + ["凯伊姆", "「他是《不蚀金锁》的主人,这么说你就明白了吧」"], + ["羽化病患少年", "「哎?哎?怎么会······」"], + ["凯伊姆", "「再问你一遍,钱在哪里?」"], + ["羽化病患少年", "「是,是,是,在我的怀里」"], + ["凯伊姆", "「你没有擅自拿掉一部分吧」"], + ["羽化病患少年", "「是,是的」"], + ["羽化病患少年", "「那,那个,您是《不蚀金锁》的人吗?」"], + ["凯伊姆", "「算是吧」"], + ["羽化病患少年", "「我什么都可以做,请您一定要帮帮我」"], + ["凯伊姆", "「抱歉,我并没有兴趣去帮助他人」"], + ["羽化病患少年", "「我什么······什么,都会做的······」"], + ["羽化病患少年", "「我一直都是生活在下层的」"], + [ + "羽化病患少年", + "「可是,不知何时染上了羽化病······背后长出了翅膀······」", + ], + ["羽化病患少年", "「被寄宿工作的店赶了出来,只得流落到牢狱这里」"], + ["羽化病患少年", "「因为独自实在是饿的不行了,所以才会偷这些钱的」"], + [ + "羽化病患少年", + "「我明明没有做任何坏事······为什么······会遇到这种事······」", + ], + ["凯伊姆", "「谁知道」"], + ["羽化病患少年", "「呜······呜呜······接下来,要对我做什么?」"], + ["凯伊姆", "「我要把你带到组织那里」"], + ["羽化病患少年", "「怎,怎么这样」"], + ["凯伊姆", "「不过,那样做的前提是你不是羽化病人」"], + ["凯伊姆", "「组织也没有笨到把羽化病人招待到家里的程度」"], + ["羽化病患少年", "「那么,是要放我逃走吗?」"], + ["凯伊姆", "「我要让你学到教训」"], + ["凯伊姆", "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」"], + ["凯伊姆", "「你的运气不错」"], + ["羽化病患少年", "「唔······啊,是的······」"], + ["凯伊姆", "「滚」"], + ["羽化病患少年", "「非常感谢」"], + ["羽化病患少年", "「唔啊!?」"], + ["男", "「到这里就结束了,羽化病人」"], + ["男", "「确认他的翅膀」"], + ["", "趁还没有被卷入麻烦的事情之前,赶快离开这里吧"], + ["羽狩的队长", "「那边的那个人」"], + ["凯伊姆", "「······有什么事?」"], + ["羽狩的队长", "「可以稍微让我问几句话吗」"], + ["凯伊姆", "「······」"], + ["凯伊姆", "「啊啊,无妨」"], + ["羽狩的队长", "「感谢您的合作」"], + ["", "队长殷勤地致以谢礼。"], + ["", "而在他的眼前,少年的衣服已经被他的补下们扯破。"], + ["", "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。"], + ["红发的羽狩", "「副队长,确认翅膀的持有了」"], + ["羽狩的副队长", "「保护他」"], + ["羽化病患少年", "「不要······请原谅,我······」"], + [ + "羽狩的副队长", + "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", + ], + ["羽化病患少年", "「可是,可是」"], + ["羽狩的副队长", "「没关系的」"], + ["羽化病患少年", "「······哥,哥哥」"], + ["羽狩的副队长", "「你是羽化病人的亲属吗?」"], + ["凯伊姆", "「只是路人而已」"], + ["凯伊姆", "「顺带一提,我也没有打算找你们的麻烦」"], + [ + "羽狩的副队长", + "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", + ], + ["羽狩的副队长", "「我的一个部下就此永久失去了半截胳膊」"], + ["凯伊姆", "「我表示同情」"], + ["凯伊姆", "「我马上就会消失的,这样就没问题了吧?」"], + ["羽狩的副队长", "「嘛,不要这么慌张」"], + ["", "副队长看着羽化的少年。"], + ["羽狩的副队长", "「你与这个人是什么关系?没有被他殴打吗?」"], + ["羽化病患少年", "「没,没有」"], + [ + "羽狩的副队长", + "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", + ], + ["羽化病患少年", "「······」"], + ["羽化病患少年", "「那个人,是《不蚀金锁》的组织成员······」"], + ["羽化病患少年", "「突然说让我拿出钱来,我刚一拒绝他就打我」"], + ["羽狩的副队长", "「原来如此······」"], + [ + "羽狩的副队长", + "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", + ], + ["凯伊姆", "「当然不是」"], + ["凯伊姆", "「我只是从那里接受工作而已,并不是他们的成员」"], + ["羽狩的副队长", "「你的意思是说,少年在说谎吗?」"], + ["凯伊姆", "「啊啊」"], + [ + "凯伊姆", + "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", + ], + ["羽狩的副队长", "「就算我去询问,也无法从他们那里得到事实」"], + [ + "羽狩的副队长", + "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", + ], + ["凯伊姆", "「真是辛苦啊」"], + ["羽狩的副队长", "「说的是啊」"], + ["羽狩的副队长", "「其实,砍下我部下胳膊的似乎也是组织的成员呢」"], + [ + "羽狩的副队长", + "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", + ], + [ + "羽狩的副队长", + "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", + ], + ["羽狩的副队长", "「那和整条街道的和平也是紧密相关的吧?」"], + ["凯伊姆", "「我知道,你们有逮捕干扰狩猎羽化病人的权力」"], + [ + "凯伊姆", + "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", + ], + ["羽狩的副队长", "「那些话,我们会在看守所对你详细说明的」"], + ["凯伊姆", "「······」"], + ["", "在这里起争执的话,就会被羽狩加害。"], + ["", "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。"], + ["", "就算逃跑,也没有好的结果。"], + ["", "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。"], + ["", "发生了什么事······"], + ["???", "「我认为,那位先生是正确的」"], + ["", "羽狩们一起回头。"], + ["", "而在他们视线的焦点处,"], + ["", "伫立着一位女性。"], + ["", "在端正的容颜下,代表着强烈意志的双眉十分显眼。"], + ["", "身体的柔软与紧紧包裹在其身上的羽狩制服,两者显得十分的不搭配。"], + ["", "我还是第一次看到女性的羽狩。"], + ["羽狩的副队长", "「队长,这是获得《不蚀金锁》情报的好机会」"], + [ + "羽狩的队长", + "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", + ], + ["兰格副队长", "「我并没有打算去恫吓他······」"], + ["羽狩的队长", "「告诉我那个被砍掉胳膊的队员的名字」"], + ["羽狩的队长", "「我会去探望他的」"], + ["兰格副队长", "「那个是······」"], + ["羽狩的队长", "「我知道,你一直在为有所收获而努力工作」"], + ["羽狩的队长", "「但是,正因为我们的工作是为民众提供帮助」"], + ["羽狩的队长", "「所以就更不能损害人与人之间的信赖」"], + ["兰格副队长", "「我会铭记在心」"], + ["羽狩的队长", "「这位先生,我的部下失礼了」"], + ["凯伊姆", "「只要不对我再来一次就好」"], + ["羽狩的队长", "「请稍等」"], + ["凯伊姆", "「有什么事?」"], + ["羽狩的队长", "「我想确认一件事」"], + ["羽狩的队长", "「你真的不是《不蚀金锁》的成员吗?」"], + ["凯伊姆", "「真的」"], + ["凯伊姆", "「如果我说是的话,你有什么打算?」"], + ["羽狩的队长", "「我听过传闻,说他们是用依靠暴力而得的钱在生活」"], + ["凯伊姆", "「······这样啊」"], + ["凯伊姆", "「如果能有收获就好了啊」"], + ]; + this.chapter04 = [ + ["梅尔特", "「欢迎光临」"], + ["梅尔特", "「辛苦了」"], + ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」"], + ["凯伊姆", "「没什么,比想象中完成的更容易」"], + ["梅尔特", "「那就好」"], + ["梅尔特", "「这是我的一点谢意」"], + ["凯伊姆", "「味道有些变化啊」"], + ["梅尔特", "「啊,被发现了?」"], + ["梅尔特", "「最近,没能到手什么好的原料呢」"], + ["凯伊姆", "「去拜托吉克如何?」"], + [ + "梅尔特", + "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", + ], + ["凯伊姆", "「那希望你也不要来麻烦我」"], + ["梅尔特", "「那 是 两 码 事」"], + ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」"], + [ + "梅尔特", + "「而且,自己的钱被偷了这么害羞的事,向凯伊姆意外的其他人都说不出口」", + ], + ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」"], + ["梅尔特", "「这是面子问题啊,面子问题」"], + ["凯伊姆", "「嘛,算了」"], + ["凯伊姆", "「这样就好了吧?」"], + ["梅尔特", "「这是钱包呢」"], + ["梅尔特", "「嗯,东西没少」"], + ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」"], + ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」"], + ["凯伊姆", "「在那边不是来钱更快吗?」"], + ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」"], + ["凯伊姆", "「这是客套话而已」"], + ["梅尔特", "「欺负人」"], + ["梅尔特", "「总而言之,今天帮大忙了」"], + ["梅尔特", "「谢礼嘛······」"], + ["凯伊姆", "「就记在账单上吧」"], + ["梅尔特", "「了解—盛谢惠顾了哦?」"], + ["", "喀啷喀啷"], + ["", "门铃响起"], + ["", "喧哗瞬间安静下来。"], + ["", "进来的人是吉克。"], + ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], + ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], + ["吉克", "「各位继续吧」"], + ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], + ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。"], + ["凯伊姆", "「不用介意」"], + ["", "吉克轻轻点了点头,在我右边坐了下来"], + ["凯伊姆", "「逃跑的男人怎么样了?」"], + ["吉克", "「嗯?已经不在这个世上了」。"], + ["吉克", "「有什么想要知道的事吗?」"], + ["凯伊姆", "「不,没什么」"], + ["吉克", "「那个无聊的家伙,完全没有趣味呢」"], + ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」"], + ["凯伊姆", "「真是灾难啊」"], + ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」"], + ["凯伊姆", "「消息真灵通」"], + ["吉克", "「梅尔特也注意点」"], + ["吉克", "「你丢钱已经不是一回两回了」"], + ["梅尔特", "「好的—我会注意的。」"], + ["梅尔特", "「吉克还是平常的点单吧」"], + ["梅尔特", "「凯伊姆要再来一杯吗?」"], + ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], + ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], + ["吉克", "「这是抓捕逃跑男人的报酬」"], + ["凯伊姆", "「下次有什么事再告诉我」"], + ["梅尔特", "「来,久等了」"], + ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」"], + ["吉克", "「让我猜猜看」"], + ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」"], + ["梅尔特", "「可惜—」"], + ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」"], + ["凯伊姆", "「完全把你当成新进的女佣了么」"], + ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」"], + ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」"], + ["凯伊姆&吉克", "「你傻啊」"], + ["梅尔特", "「异口同声呢,不亏是兄弟」"], + ["凯伊姆", "「别用这种称呼,怪恶心的」"], + ["吉克", "「说得没错」"], + ["吉克", "「······说起来······」"], + ["梅尔特", "「怎么了?」"], + ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」"], + ["凯伊姆", "「你也说这么无聊的话题」"], + ["吉克", "「不,这是很重要的事情」"], + ["吉克", "「梅尔特,事实是怎么样的?」"], + ["梅尔特", "「啊~是怎么样的呢~」"], + ["梅尔特", "「我忘记了」"], + ["吉克", "「骗人」"], + ]; + } } \ No newline at end of file diff --git a/styles.css b/styles.css index e7ba189..e300825 100644 --- a/styles.css +++ b/styles.css @@ -544,9 +544,9 @@ p#name { } /* 注释下面这三行以开启抗锯齿 */ -.anti-aliasing { +/* .anti-aliasing { image-rendering: pixelated; -} +} */ .warning { transition: left cubic-bezier(0, 0.9, 1, 0.1) 2.5s; From 3f53086c9fd6bba51dc7c200305cc06f5d09fa57 Mon Sep 17 00:00:00 2001 From: strawberry42271 <2806566736@qq.com> Date: Sat, 1 Feb 2025 00:31:19 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E6=88=98=E6=96=97?= =?UTF-8?q?=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/plugins.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/project/plugins.js b/project/plugins.js index 64da3ac..146dd94 100644 --- a/project/plugins.js +++ b/project/plugins.js @@ -18821,7 +18821,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx.closePath() ctx.fill() - console.log(heronow) core.drawImage(ctx, "hero.webp", 0, @@ -18833,7 +18832,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 32, 19) - if (heroInfo.now >= 215) { + if (heroInfo.now >= 215 && !heroInfo.isAttack) { heroInfo.isAttack = true; animateOnAttack("sword", true, () => { heroInfo.now -= 215 @@ -18842,7 +18841,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }) } - if (enemyInfo.now >= 215) { + if (enemyInfo.now >= 215 && !enemyInfo.isAttack) { enemyInfo.isAttack = true animateOnAttack("sword", false, () => { enemyInfo.now -= 215 @@ -18851,7 +18850,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }) } equipInfo.forEach(v => { - if (v.now >= 215) { + if (v.now >= 215 && !v.isAttack) { v.isAttack = true animateOnAttack("sword", true, () => { From eb19824d5053a0e523c1d6b572c8f0b8285501d9 Mon Sep 17 00:00:00 2001 From: strawberry42271 <2806566736@qq.com> Date: Sat, 1 Feb 2025 09:23:06 +0800 Subject: [PATCH 07/10] =?UTF-8?q?cg=E9=9F=B3=E9=A2=91=E9=87=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/plugins.js | 2227 ++++++++++++++++++++++---------------------- 1 file changed, 1113 insertions(+), 1114 deletions(-) diff --git a/project/plugins.js b/project/plugins.js index 146dd94..27f0ea5 100644 --- a/project/plugins.js +++ b/project/plugins.js @@ -1,264 +1,262 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = { "init": function () { - this._afterLoadResources = function () { - // 本函数将在所有资源加载完毕后,游戏开启前被执行 - core.ui.statusBar.init(); - core.dom.playGame.style.fontFamily = "pala"; - core.dom.loadGame.style.fontFamily = "pala"; - core.dom.CGMode.style.fontFamily = "pala"; - core.dom.musicMode.style.fontFamily = "pala"; - core.dom.replayGame.style.fontFamily = "pala"; - core.registerEvent("changeMouse", function (data) { - if (!main.replayChecking && !core.isReplaying()) - core.changeMouse( - data.icon, - data.div, - data.translate[0], - data.translate[1], - data.scale[0], - data.scale[1], - data.angel, - data.px, - data.py - ); - core.doAction(); - }); - core.registerEvent("removeMouse", function (data) { - if (!main.replayChecking && !core.isReplaying()) - core.removeMouse(data.div); - core.doAction(); - }); - core.registerEvent("addPop", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - data.value = core.replaceText(data.value); - core.addPop( - data.value, - data.px, - data.py, - data.color, - data.boldColor, - data.left, - data.jump, - data.time, - data.show, - data.font, - data.speed - ); - } - core.doAction(); - }); - core.registerEvent("drawWarning", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - data.text = core.replaceText(data.text); - data.text2 = core.replaceText(data.text2); - core.drawWarning( - data.x, - data.y, - data?.text, - data?.text2, - data?.warning, - data.large, - data.size - ); + this._afterLoadResources = function () { + // 本函数将在所有资源加载完毕后,游戏开启前被执行 + core.ui.statusBar.init(); + core.dom.playGame.style.fontFamily = "pala"; + core.dom.loadGame.style.fontFamily = "pala"; + core.dom.CGMode.style.fontFamily = "pala"; + core.dom.musicMode.style.fontFamily = "pala"; + core.dom.replayGame.style.fontFamily = "pala"; + core.registerEvent("changeMouse", function (data) { + if (!main.replayChecking && !core.isReplaying()) + core.changeMouse( + data.icon, + data.div, + data.translate[0], + data.translate[1], + data.scale[0], + data.scale[1], + data.angel, + data.px, + data.py + ); + core.doAction(); + }); + core.registerEvent("removeMouse", function (data) { + if (!main.replayChecking && !core.isReplaying()) + core.removeMouse(data.div); + core.doAction(); + }); + core.registerEvent("addPop", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + data.value = core.replaceText(data.value); + core.addPop( + data.value, + data.px, + data.py, + data.color, + data.boldColor, + data.left, + data.jump, + data.time, + data.show, + data.font, + data.speed + ); + } + core.doAction(); + }); + core.registerEvent("drawWarning", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + data.text = core.replaceText(data.text); + data.text2 = core.replaceText(data.text2); + core.drawWarning( + data.x, + data.y, + data?.text, + data?.text2, + data?.warning, + data.large, + data.size + ); - setTimeout(() => core.doAction(), 3100); - } else { - core.doAction(); - } - }); + setTimeout(() => core.doAction(), 3100); + } else { + core.doAction(); + } + }); - core.registerEvent("over", function (data) { - let image = data.image ?? ""; - let time = data.time ?? 3000; - let sound = data.sound ?? ""; - let textColor = data.textColor ?? "#FFFFFF"; - let boldColor = data.boldColor ?? "#000000"; - let font = data.font ?? "bold 48px Verdana"; - let text = data.text ?? ""; - let hidetime = data.hidetime ?? 100; - if (!main.replayChecking && !core.isReplaying()) { - core.over( - image, - data.memory, - time, - hidetime, - sound, - textColor, - boldColor, - font, - text - ); - } else { - core.doAction(); - } - }); - core.registerEvent("changebg", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.changebg( - data.img1, - data.memory1, - data.img2, - data.memory2, - data.time, - data.style - ); - } else { - core.doAction(); - } - }); - core.registerEvent("overlist", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.overlist( - data.image, - data.memory, - data.hidetime || 30, - data.list || [ - { - text: "", - sound: "", - time: 50, - textColor: "#FFFFFF", - boldColor: "#000000", - font: "bold 48px Verdana", - frame: 0, - }, - ] - ); - } else { - core.doAction(); - } - }); - core.registerEvent("op", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.openvideo(); - } else { - core.doAction(); - } - }); - core.registerEvent("animationDrawable", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.animationDrawable( - data.allFarme, - data.color, - data.globalAlpha, - data.imageList, - data.soundList - ); - } else { - core.doAction(); - } - }); - core.registerEvent("setanimate", function (data) { - data.px = data.px ?? 0; - data.py = data.py ?? 0; - core.setanimate( - data.name, - data.px, - data.py, - data.width, - data.height, - data.allFarme, - data.imageList, - data.soundList - ); - core.doAction(); - }); - core.registerEvent("clearanimate", function (data) { - core.plugin.playing.clear(); + core.registerEvent("over", function (data) { + let image = data.image ?? ""; + let time = data.time ?? 3000; + let sound = data.sound ?? ""; + let textColor = data.textColor ?? "#FFFFFF"; + let boldColor = data.boldColor ?? "#000000"; + let font = data.font ?? "bold 48px Verdana"; + let text = data.text ?? ""; + let hidetime = data.hidetime ?? 100; + if (!main.replayChecking && !core.isReplaying()) { + core.over( + image, + data.memory, + time, + hidetime, + sound, + textColor, + boldColor, + font, + text + ); + } else { + core.doAction(); + } + }); + core.registerEvent("changebg", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.changebg( + data.img1, + data.memory1, + data.img2, + data.memory2, + data.time, + data.style + ); + } else { + core.doAction(); + } + }); + core.registerEvent("overlist", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.overlist( + data.image, + data.memory, + data.hidetime || 30, + data.list || [{ + text: "", + sound: "", + time: 50, + textColor: "#FFFFFF", + boldColor: "#000000", + font: "bold 48px Verdana", + frame: 0, + }, ] + ); + } else { + core.doAction(); + } + }); + core.registerEvent("op", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.openvideo(); + } else { + core.doAction(); + } + }); + core.registerEvent("animationDrawable", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.animationDrawable( + data.allFarme, + data.color, + data.globalAlpha, + data.imageList, + data.soundList + ); + } else { + core.doAction(); + } + }); + core.registerEvent("setanimate", function (data) { + data.px = data.px ?? 0; + data.py = data.py ?? 0; + core.setanimate( + data.name, + data.px, + data.py, + data.width, + data.height, + data.allFarme, + data.imageList, + data.soundList + ); + core.doAction(); + }); + core.registerEvent("clearanimate", function (data) { + core.plugin.playing.clear(); - core.doAction(); - }); - core.registerEvent("deleteanimate", function (data) { - core.deleteanimate(data.name); - core.doAction(); - }); - core.registerEvent("playanimate", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - data.x = data.x ?? 0; - data.y = data.y ?? 0; - data.scalex = data.scalex ?? 1; - data.scaley = data.scaley ?? 1; - core.playanimate( - data.name, - data.x, - data.y, - data.hero, - data.scalex, - data.scaley - ); - core.doAction(); - } else { - core.doAction(); - } - }); - core.registerEvent("cgtextList", function (data) { - core.ui.cgText.textList = core.plugin[data.textList]; - core.doAction(); - }); - core.registerEvent("cgtext", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.ui.cgText.image = data.bg; - core.ui.cgText.memory = data.memory; - core.ui.cgText.head = core.clone(data.head); - core.ui.cgText.index = data.index; - core.ui.cgText.name = core.ui.cgText.textList[data.index][0]; - core.ui.cgText.text = data.text - ? data.text - : core.ui.cgText.textList[data.index][1]; - core.ui.cgText.time = data.time; - core.ui.cgText.wait = data.wait; - core.ui.cgText.WindowSkin = data.WindowSkin; - core.ui.cgText.sound = data.sound || ""; - core.ui.cgText.bodyList = core.clone(data.bodyList); - main.dom.cgText.style.display = "block"; - core.ui.cgText.update(); - } else { - core.doAction(); - } - }); - core.registerEvent("introAndLoop", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.plugin.introAndLoop(data.intro, data.time, data.loop); - core.doAction(); - } else { - core.doAction(); - } - }); - core.registerEvent("setq", function (data) { - core.setFlag("任务地点", data.id); + core.doAction(); + }); + core.registerEvent("deleteanimate", function (data) { + core.deleteanimate(data.name); + core.doAction(); + }); + core.registerEvent("playanimate", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + data.x = data.x ?? 0; + data.y = data.y ?? 0; + data.scalex = data.scalex ?? 1; + data.scaley = data.scaley ?? 1; + core.playanimate( + data.name, + data.x, + data.y, + data.hero, + data.scalex, + data.scaley + ); + core.doAction(); + } else { + core.doAction(); + } + }); + core.registerEvent("cgtextList", function (data) { + core.ui.cgText.textList = core.plugin[data.textList]; + core.doAction(); + }); + core.registerEvent("cgtext", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.ui.cgText.image = data.bg; + core.ui.cgText.memory = data.memory; + core.ui.cgText.head = core.clone(data.head); + core.ui.cgText.index = data.index; + core.ui.cgText.name = core.ui.cgText.textList[data.index][0]; + core.ui.cgText.text = data.text ? + data.text : + core.ui.cgText.textList[data.index][1]; + core.ui.cgText.time = data.time; + core.ui.cgText.wait = data.wait; + core.ui.cgText.WindowSkin = data.WindowSkin; + core.ui.cgText.sound = data.sound === "" ? data.sound : core.ui.cgText.textList[data.index][3] || ""; + core.ui.cgText.bodyList = core.clone(data.bodyList); + main.dom.cgText.style.display = "block"; + core.ui.cgText.update(); + } else { + core.doAction(); + } + }); + core.registerEvent("introAndLoop", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.plugin.introAndLoop(data.intro, data.time, data.loop); + core.doAction(); + } else { + core.doAction(); + } + }); + core.registerEvent("setq", function (data) { + core.setFlag("任务地点", data.id); - core.doAction(); - }); + core.doAction(); + }); - core.registerEvent("setmusics", function (data) { - if ( - (core.getLocalStorage("musics") && - core.getLocalStorage("musics").length === 0) || - !core.getLocalStorage("musics") - ) - core.setLocalStorage("musics", ["theme.mp3"]); - let a = core.getLocalStorage("musics"); - if (!data.bgm) { - core.setLocalStorage("musics", ["theme.mp3"]); - } else { - if (!a.includes(data.bgm)) a.push(data.bgm); - core.setLocalStorage("musics", a); - } - core.doAction(); - }); - core.registerEvent("setcgs", function (data) { - if (!data.img) { - core.setLocalStorage("cgs", []); - } else { - let a = core.getLocalStorage("cgs") ?? []; - if (!a.includes(data.img)) a.push(data.img); - core.setLocalStorage("cgs", a); - } - core.doAction(); - }); - }; - }, + core.registerEvent("setmusics", function (data) { + if ( + (core.getLocalStorage("musics") && + core.getLocalStorage("musics").length === 0) || + !core.getLocalStorage("musics") + ) + core.setLocalStorage("musics", ["theme.mp3"]); + let a = core.getLocalStorage("musics"); + if (!data.bgm) { + core.setLocalStorage("musics", ["theme.mp3"]); + } else { + if (!a.includes(data.bgm)) a.push(data.bgm); + core.setLocalStorage("musics", a); + } + core.doAction(); + }); + core.registerEvent("setcgs", function (data) { + if (!data.img) { + core.setLocalStorage("cgs", []); + } else { + let a = core.getLocalStorage("cgs") ?? []; + if (!a.includes(data.img)) a.push(data.img); + core.setLocalStorage("cgs", a); + } + core.doAction(); + }); + }; +}, "drawLight": function () { // 绘制灯光/漆黑层效果。调用方式 core.plugin.drawLight(...) // 【参数说明】 @@ -14994,901 +14992,902 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "剧情cg": function () { - // 在此增加新插件 - // 在此增加新插件 - const cg = document.createElement("canvas"); //cg画布设置 - cg.style.position = "absolute"; - cg.style.zIndex = 300; - cg.style.display = "none"; - cg.id = "cgText"; - main.dom.gameGroup.insertAdjacentElement("afterend", cg); - cg.style.top = "50%"; - cg.style.left = "50%"; - cg.style.transform = "translate(-50%,-50%)"; - const ctx = cg.getContext("2d"); - main.dom.cgText = cg; - const logcanvas = document.createElement("canvas"); //cg画布设置 - logcanvas.style.position = "absolute"; - logcanvas.style.zIndex = 301; - logcanvas.style.display = "none"; - logcanvas.id = "cgText"; - main.dom.gameGroup.insertAdjacentElement("afterend", logcanvas); - logcanvas.style.top = "50%"; - logcanvas.style.left = "50%"; - logcanvas.style.transform = "translate(-50%,-50%)"; - const logctx = logcanvas.getContext("2d"); - main.dom.logcanvas = logcanvas; - logcanvas.onmouseup = function (e) { - //鼠标抬起 + // 在此增加新插件 + // 在此增加新插件 + const cg = document.createElement("canvas"); //cg画布设置 + cg.style.position = "absolute"; + cg.style.zIndex = 300; + cg.style.display = "none"; + cg.id = "cgText"; + main.dom.gameGroup.insertAdjacentElement("afterend", cg); + cg.style.top = "50%"; + cg.style.left = "50%"; + cg.style.transform = "translate(-50%,-50%)"; + const ctx = cg.getContext("2d"); + main.dom.cgText = cg; + const logcanvas = document.createElement("canvas"); //cg画布设置 + logcanvas.style.position = "absolute"; + logcanvas.style.zIndex = 301; + logcanvas.style.display = "none"; + logcanvas.id = "cgText"; + main.dom.gameGroup.insertAdjacentElement("afterend", logcanvas); + logcanvas.style.top = "50%"; + logcanvas.style.left = "50%"; + logcanvas.style.transform = "translate(-50%,-50%)"; + const logctx = logcanvas.getContext("2d"); + main.dom.logcanvas = logcanvas; + logcanvas.onmouseup = function (e) { + //鼠标抬起 - try { - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.insertAction(data); - core.doAction(); - } - } catch (ee) { - console.error(ee); - } - }; - logcanvas.onmousedown = function (e) { - //鼠标按下 - try { - if (!core.isPlaying()) return false; - 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.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - logcanvas.ontouchend = function (e) { - //触摸抬起 + core.insertAction(data); + core.doAction(); + } + } catch (ee) { + console.error(ee); + } + }; + logcanvas.onmousedown = function (e) { + //鼠标按下 + try { + if (!core.isPlaying()) return false; + 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.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + logcanvas.ontouchend = function (e) { + //触摸抬起 - try { - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - core.setFlag("skip", false); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + core.setFlag("skip", false); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.insertAction(data); - core.doAction(); - } - } catch (ee) {} - }; - logcanvas.ontouchstart = function (e) { - //触摸按下 - try { - if (!core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor( - (e.targetTouches[0].clientX - left) / core.domStyle.scale - ), - py = Math.floor( - (e.targetTouches[0].clientY - top) / core.domStyle.scale - ); - core.ui.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - cg.onmouseup = function (e) { - //鼠标抬起 + core.insertAction(data); + core.doAction(); + } + } catch (ee) {} + }; + logcanvas.ontouchstart = function (e) { + //触摸按下 + try { + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor( + (e.targetTouches[0].clientX - left) / core.domStyle.scale + ), + py = Math.floor( + (e.targetTouches[0].clientY - top) / core.domStyle.scale + ); + core.ui.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + cg.onmouseup = function (e) { + //鼠标抬起 - try { - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.insertAction(data); - core.doAction(); - } - } catch (ee) { - console.error(ee); - } - }; - cg.onmousedown = function (e) { - //鼠标按下 - try { - if (!core.isPlaying()) return false; - 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.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - cg.ontouchend = function (e) { - //触摸抬起 + core.insertAction(data); + core.doAction(); + } + } catch (ee) { + console.error(ee); + } + }; + cg.onmousedown = function (e) { + //鼠标按下 + try { + if (!core.isPlaying()) return false; + 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.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + cg.ontouchend = function (e) { + //触摸抬起 - try { - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - core.setFlag("skip", false); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + core.setFlag("skip", false); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.insertAction(data); - core.doAction(); - } - } catch (ee) { - console.error(ee); - } - }; - cg.ontouchstart = function (e) { - //触摸按下 - try { - if (!core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor( - (e.targetTouches[0].clientX - left) / core.domStyle.scale - ), - py = Math.floor( - (e.targetTouches[0].clientY - top) / core.domStyle.scale - ); - core.ui.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - let auto = false; + core.insertAction(data); + core.doAction(); + } + } catch (ee) { + console.error(ee); + } + }; + cg.ontouchstart = function (e) { + //触摸按下 + try { + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor( + (e.targetTouches[0].clientX - left) / core.domStyle.scale + ), + py = Math.floor( + (e.targetTouches[0].clientY - top) / core.domStyle.scale + ); + core.ui.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + let auto = false; - class cgText { - constructor() { - //绘制需要的变量 - this.image = ""; - this.head = { name: "face_050445.webp", px: -300 }; - this.bodyList = [ - { name: "tati_050145a.webp", px: 100, filter: false }, - { name: "tati_120124.webp", px: 1100, filter: true }, - ]; - this.name = ""; - this.text = ""; - this.time = 0; - this.WindowSkin = false; - this.sound = ""; - this.beforeSound = 0; - this.wait = 1000; - this.memory = false; - this.textList = []; - this.page = 1; - this.overpage = 1; - this.log = false; - this.index = 0; - } - click(px, py) { - //点击效果 + class cgText { + constructor() { + //绘制需要的变量 + this.image = ""; + this.head = { name: "face_050445.webp", px: -300 }; + this.bodyList = [ + { name: "tati_050145a.webp", px: 100, filter: false }, + { name: "tati_120124.webp", px: 1100, filter: true }, + ]; + this.name = ""; + this.text = ""; + this.time = 0; + this.WindowSkin = false; + this.sound = ""; + this.beforeSound = 0; + this.wait = 1000; + this.memory = false; + this.textList = []; + this.page = 1; + this.overpage = 1; + this.log = false; + this.index = 0; + } + click(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 savebox = makeBox([1700, 1100], [192, 96]); - const saveboxVertical = makeBox([52, 1700], [96, 192]); - const skipbox = makeBox([1700, 1000], [192, 96]); - const skipboxVertical = makeBox([152, 1700], [96, 192]); - const autobox = makeBox([1700, 900], [192, 96]); - const autoboxVertical = makeBox([252, 1700], [96, 192]); - const textbox = makeBox([1700, 800], [192, 96]); - const textboxVertical = makeBox([352, 1700], [96, 192]); - const backbox = makeBox([15, 35], [210, 90]); - const backboxVertical = makeBox([1123, 15], [90, 210]); - const pageupbox = makeBox([300, 1130], [200, 100]); - const pageupboxVertical = makeBox([18, 300], [100, 200]); - const pagedownbox = makeBox([1500, 1130], [200, 100]); - const pagedownboxVertical = makeBox([18, 1500], [100, 200]); - if (this.log) { - if ( - (core.domStyle.isVertical && inRect(pos, backboxVertical)) || - (!core.domStyle.isVertical && inRect(pos, backbox)) - ) { - core.clearMap(logctx); - main.dom.logcanvas.style.display = "none"; - this.log = false; - } else if ( - (core.domStyle.isVertical && inRect(pos, pageupboxVertical)) || - (!core.domStyle.isVertical && inRect(pos, pageupbox)) - ) { - core.clearMap(logctx); - if (this.page > 1) this.page--; - this.logdraw(this.page); - } else if ( - (core.domStyle.isVertical && inRect(pos, pagedownboxVertical)) || - (!core.domStyle.isVertical && inRect(pos, pagedownbox)) - ) { - core.clearMap(logctx); - if (this.page < this.overpage) this.page++; - this.logdraw(this.page); - } - } else { - if ( - (core.domStyle.isVertical && - inRect(pos, skipboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, skipbox)) - ) { - auto = false; - let time = 0; - core.stopSound(this.beforeSound); - core.registerAnimationFrame("skip", true, (timestamp) => { - if (timestamp > time + 50) { - time = timestamp; - if ( - core.status.event.id == "action" && - core.status.event.data.type == "cgtext" - ) { - core.setFlag("skip", true); - main.dom.cgText.style.display = "none"; - core.doAction(); - } - } - }); - } else if ( - (core.domStyle.isVertical && - inRect(pos, textboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, textbox)) - ) { - auto = false; - this.log = true; - this.overpage = Math.floor(this.index / 6) + 1; - this.page = this.overpage; - logcanvas.style.display = "block"; - const data = core.clone(core.status.event.data.current); - data.showAll = true; - data.time = 0; - data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 - data.sound = ""; - core.insertAction(data); - core.doAction(); - this.logdraw(this.page); - } else if ( - (core.domStyle.isVertical && - inRect(pos, autoboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, autobox)) - ) { - auto = !auto; + 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 savebox = makeBox([1700, 1100], [192, 96]); + const saveboxVertical = makeBox([52, 1700], [96, 192]); + const skipbox = makeBox([1700, 1000], [192, 96]); + const skipboxVertical = makeBox([152, 1700], [96, 192]); + const autobox = makeBox([1700, 900], [192, 96]); + const autoboxVertical = makeBox([252, 1700], [96, 192]); + const textbox = makeBox([1700, 800], [192, 96]); + const textboxVertical = makeBox([352, 1700], [96, 192]); + const backbox = makeBox([15, 35], [210, 90]); + const backboxVertical = makeBox([1123, 15], [90, 210]); + const pageupbox = makeBox([300, 1130], [200, 100]); + const pageupboxVertical = makeBox([18, 300], [100, 200]); + const pagedownbox = makeBox([1500, 1130], [200, 100]); + const pagedownboxVertical = makeBox([18, 1500], [100, 200]); + if (this.log) { + if ( + (core.domStyle.isVertical && inRect(pos, backboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, backbox)) + ) { + core.clearMap(logctx); + main.dom.logcanvas.style.display = "none"; + this.log = false; + } else if ( + (core.domStyle.isVertical && inRect(pos, pageupboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, pageupbox)) + ) { + core.clearMap(logctx); + if (this.page > 1) this.page--; + this.logdraw(this.page); + } else if ( + (core.domStyle.isVertical && inRect(pos, pagedownboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, pagedownbox)) + ) { + core.clearMap(logctx); + if (this.page < this.overpage) this.page++; + this.logdraw(this.page); + } + } else { + if ( + (core.domStyle.isVertical && + inRect(pos, skipboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, skipbox)) + ) { + auto = false; + let time = 0; + core.stopSound(this.beforeSound); + core.registerAnimationFrame("skip", true, (timestamp) => { + if (timestamp > time + 50) { + time = timestamp; + if ( + core.status.event.id == "action" && + core.status.event.data.type == "cgtext" + ) { + core.setFlag("skip", true); + main.dom.cgText.style.display = "none"; + core.doAction(); + } + } + }); + } else if ( + (core.domStyle.isVertical && + inRect(pos, textboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, textbox)) + ) { + auto = false; + this.log = true; + this.overpage = Math.floor(this.index / 6) + 1; + this.page = this.overpage; + logcanvas.style.display = "block"; + const data = core.clone(core.status.event.data.current); + data.showAll = true; + data.time = 0; + data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 + data.sound = ""; + core.insertAction(data); + core.doAction(); + this.logdraw(this.page); + } else if ( + (core.domStyle.isVertical && + inRect(pos, autoboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, autobox)) + ) { + auto = !auto; - const data = core.clone(core.status.event.data.current); - data.showAll = true; - data.time = 0; - data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 - data.sound = ""; - core.insertAction(data); - core.doAction(); - } else if ( - (core.domStyle.isVertical && - inRect(pos, saveboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, savebox)) - ) { - //存档 - auto = false; - if (core.status.event.animateUI) return; - if (core.status.event.interval != null) return; - const current = core.clone(core.status.event.data.current); - current.showAll = true; - current.time = 0; - current.sound = ""; - current.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除当前事件所有打字机效果 - cg.style.display = "none"; - const data = [{ type: "callSave" }, current]; //插入存档事件 - core.insertAction(data); + const data = core.clone(core.status.event.data.current); + data.showAll = true; + data.time = 0; + data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 + data.sound = ""; + core.insertAction(data); + core.doAction(); + } else if ( + (core.domStyle.isVertical && + inRect(pos, saveboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, savebox)) + ) { + //存档 + auto = false; + if (core.status.event.animateUI) return; + if (core.status.event.interval != null) return; + const current = core.clone(core.status.event.data.current); + current.showAll = true; + current.time = 0; + current.sound = ""; + current.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除当前事件所有打字机效果 + cg.style.display = "none"; + const data = [{ type: "callSave" }, current]; //插入存档事件 + core.insertAction(data); - core.doAction(); - } else if (!core.status.event.data) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } else { - // 正在淡入淡出的话不执行 - if (core.status.event.animateUI) return; - auto = false; + core.doAction(); + } else if (!core.status.event.data) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } else { + // 正在淡入淡出的话不执行 + if (core.status.event.animateUI) return; + auto = false; - // 打字机效果显示全部文字 - if (core.status.event.interval != null) { - const data = core.clone(core.status.event.data?.current); - data.showAll = true; - data.time = 0; - data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 - data.sound = ""; - core.insertAction(data); - core.doAction(); - return; - } else { - core.stopSound(this.beforeSound); - } + // 打字机效果显示全部文字 + if (core.status.event.interval != null) { + const data = core.clone(core.status.event.data?.current); + data.showAll = true; + data.time = 0; + data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 + data.sound = ""; + core.insertAction(data); + core.doAction(); + return; + } else { + core.stopSound(this.beforeSound); + } - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - } - } + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + } + } - drawTextContent(ctx, content, config) { - //绘制多行文字并执行打字机效果 + drawTextContent(ctx, content, config) { + //绘制多行文字并执行打字机效果 - ctx = core.getContextByName(ctx); - // 设置默认配置项 - var textAttribute = - core.status.textAttribute || core.initStatus.textAttribute; - var globalAttribute = - core.status.globalAttribute || core.initStatus.globalAttribute; - config = core.clone(config || {}); - config.left = config.left || 0; - config.right = - config.left + (config.maxWidth == null ? core._PX_ : config.maxWidth); - config.top = config.top || 0; - config.color = core.arrayToRGBA(config.color || textAttribute.text); - if (config.bold == null) config.bold = textAttribute.bold; - config.italic = config.italic || false; - config.align = config.align || textAttribute.align || "left"; - config.fontSize = config.fontSize || textAttribute.textfont; - config.lineHeight = config.lineHeight || config.fontSize * 1.3; - config.defaultFont = config.font = config.font || globalAttribute.font; - config.time = config.time || 0; - config.letterSpacing = - config.letterSpacing == null - ? textAttribute.letterSpacing || 0 - : config.letterSpacing; + ctx = core.getContextByName(ctx); + // 设置默认配置项 + var textAttribute = + core.status.textAttribute || core.initStatus.textAttribute; + var globalAttribute = + core.status.globalAttribute || core.initStatus.globalAttribute; + config = core.clone(config || {}); + config.left = config.left || 0; + config.right = + config.left + (config.maxWidth == null ? core._PX_ : config.maxWidth); + config.top = config.top || 0; + config.color = core.arrayToRGBA(config.color || textAttribute.text); + if (config.bold == null) config.bold = textAttribute.bold; + config.italic = config.italic || false; + config.align = config.align || textAttribute.align || "left"; + config.fontSize = config.fontSize || textAttribute.textfont; + config.lineHeight = config.lineHeight || config.fontSize * 1.3; + config.defaultFont = config.font = config.font || globalAttribute.font; + config.time = config.time || 0; + config.letterSpacing = + config.letterSpacing == null ? + textAttribute.letterSpacing || 0 : + config.letterSpacing; - config.index = 0; - config.currcolor = config.color; - config.currfont = config.fontSize; - config.lineMargin = Math.max( - Math.round(config.fontSize / 4), - config.lineHeight - config.fontSize - ); - config.topMargin = parseInt(config.lineMargin / 2); - config.lineMaxHeight = config.lineMargin + config.fontSize; - config.offsetX = 0; - config.offsetY = 0; - config.line = 0; - config.blocks = []; - config.isHD = ctx == null || ctx.canvas.hasAttribute("isHD"); + config.index = 0; + config.currcolor = config.color; + config.currfont = config.fontSize; + config.lineMargin = Math.max( + Math.round(config.fontSize / 4), + config.lineHeight - config.fontSize + ); + config.topMargin = parseInt(config.lineMargin / 2); + config.lineMaxHeight = config.lineMargin + config.fontSize; + config.offsetX = 0; + config.offsetY = 0; + config.line = 0; + config.blocks = []; + config.isHD = ctx == null || ctx.canvas.hasAttribute("isHD"); - // 创建一个新的临时画布 - var tempCtx = document.createElement("canvas").getContext("2d"); - if (config.isHD && ctx) { - core.maps._setHDCanvasSize( - tempCtx, - ctx.canvas.width, - ctx.canvas.height - ); - } else { - tempCtx.canvas.width = ctx == null ? 1 : ctx.canvas.width; - tempCtx.canvas.height = ctx == null ? 1 : ctx.canvas.height; - } + // 创建一个新的临时画布 + var tempCtx = document.createElement("canvas").getContext("2d"); + if (config.isHD && ctx) { + core.maps._setHDCanvasSize( + tempCtx, + ctx.canvas.width, + ctx.canvas.height + ); + } else { + tempCtx.canvas.width = ctx == null ? 1 : ctx.canvas.width; + tempCtx.canvas.height = ctx == null ? 1 : ctx.canvas.height; + } - tempCtx.textBaseline = "top"; - tempCtx.font = core.ui._buildFont( - config.fontSize, - config.bold, - config.italic, - config.font - ); - tempCtx.fillStyle = config.color; - config = this._drawTextContent_draw(ctx, tempCtx, content, config); - return config; - } - _drawTextContent_draw(ctx, tempCtx, content, config) { - // Step 1: 绘制到tempCtx上,并记录下图块信息 - while (core.ui._drawTextContent_next(tempCtx, content, config)); + tempCtx.textBaseline = "top"; + tempCtx.font = core.ui._buildFont( + config.fontSize, + config.bold, + config.italic, + config.font + ); + tempCtx.fillStyle = config.color; + config = this._drawTextContent_draw(ctx, tempCtx, content, config); + return config; + } + _drawTextContent_draw(ctx, tempCtx, content, config) { + // Step 1: 绘制到tempCtx上,并记录下图块信息 + while (core.ui._drawTextContent_next(tempCtx, content, config)); - if (ctx == null) return config; + if (ctx == null) return config; - // Step 2: 从tempCtx绘制到画布上 - config.index = 0; - var _drawNext = function () { - if (config.index >= config.blocks.length) return false; - var block = config.blocks[config.index++]; - if (block != null) { - // It works, why? - const scale = config.isHD - ? devicePixelRatio * core.domStyle.scale - : 1; - ctx.restore(); - ctx.save(); //保存设置 - if (core.domStyle.isVertical) { - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - } - ctx.drawImage( - tempCtx.canvas, - block.left * scale, - block.top * scale, - block.width * scale, - block.height * scale, - config.left + block.left + block.marginLeft, - config.top + block.top + block.marginTop, - block.width, - block.height - ); - ctx.restore(); - } - return true; - }; + // Step 2: 从tempCtx绘制到画布上 + config.index = 0; + var _drawNext = function () { + if (config.index >= config.blocks.length) return false; + var block = config.blocks[config.index++]; + if (block != null) { + // It works, why? + const scale = config.isHD ? + devicePixelRatio * core.domStyle.scale : + 1; + ctx.restore(); + ctx.save(); //保存设置 + if (core.domStyle.isVertical) { + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } + ctx.drawImage( + tempCtx.canvas, + block.left * scale, + block.top * scale, + block.width * scale, + block.height * scale, + config.left + block.left + block.marginLeft, + config.top + block.top + block.marginTop, + block.width, + block.height + ); + ctx.restore(); + } + return true; + }; - if (config.time == 0) { - while (_drawNext()); + if (config.time == 0) { + while (_drawNext()); - if ( - (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || - (core.ui.cgText.sound && !core.musicStatus.soundStatus) - ) { - setTimeout(() => { - if (auto) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - }, core.ui.cgText.wait); - } - } else { - clearInterval(core.status.event.interval); - core.status.event.interval = setInterval(function () { - if (!_drawNext()) { - clearInterval(core.status.event.interval); - core.status.event.interval = null; + if ( + (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || + (core.ui.cgText.sound && !core.musicStatus.soundStatus) + ) { + setTimeout(() => { + if (auto) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + }, core.ui.cgText.wait); + } + } else { + clearInterval(core.status.event.interval); + core.status.event.interval = setInterval(function () { + if (!_drawNext()) { + clearInterval(core.status.event.interval); + core.status.event.interval = null; - if ( - (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || - (core.ui.cgText.sound && !core.musicStatus.soundStatus) - ) - setTimeout(() => { - if (auto) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - }, core.ui.cgText.wait); - } - }, config.time); - } + if ( + (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || + (core.ui.cgText.sound && !core.musicStatus.soundStatus) + ) + setTimeout(() => { + if (auto) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + }, core.ui.cgText.wait); + } + }, config.time); + } - return config; - } + return config; + } - update() { - this.background(); - if (this.log) this.logdraw(this.page); - } - logdraw(page) { - if (core.domStyle.isVertical) { - logctx.canvas.width = 1248; - logctx.canvas.height = 2028; - logctx.save(); //保存设置 - logctx.translate(1248, 0); //重新定位右上角为基准 - logctx.rotate(Math.PI / 2); //旋转90度 - } else { - logctx.canvas.width = 2028; - logctx.canvas.height = 1248; - } - core.fillRect(logctx, 0, 0, 2028, 1248, "rgba(0,0,0,0.5)"); - core.setTextAlign(logctx, "center"); - core.fillBoldText1( - logctx, - "◀离开", - 110, - 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - logctx.strokeStyle = "#FFFFFF"; - logctx.lineWidth = 3; - logctx.beginPath(); - logctx.moveTo(100, 150); - logctx.lineTo(1928, 150); + update() { + this.background(); + if (this.log) this.logdraw(this.page); + } + logdraw(page) { + if (core.domStyle.isVertical) { + logctx.canvas.width = 1248; + logctx.canvas.height = 2028; + logctx.save(); //保存设置 + logctx.translate(1248, 0); //重新定位右上角为基准 + logctx.rotate(Math.PI / 2); //旋转90度 + } else { + logctx.canvas.width = 2028; + logctx.canvas.height = 1248; + } + core.fillRect(logctx, 0, 0, 2028, 1248, "rgba(0,0,0,0.5)"); + core.setTextAlign(logctx, "center"); + core.fillBoldText1( + logctx, + "◀离开", + 110, + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + logctx.strokeStyle = "#FFFFFF"; + logctx.lineWidth = 3; + logctx.beginPath(); + logctx.moveTo(100, 150); + logctx.lineTo(1928, 150); - logctx.stroke(); - let posy = 150; - const indexList = this.textList; - core.setTextAlign(logctx, "left"); - for ( - let i = (page - 1) * 6; - i <= Math.min(this.index, page * 6 - 1); - i++ - ) { - const text = this.textList[i][1].replaceAll( - /(\\(d|e|f|g|i|n|r|b|c|t|z))(\[.*?\])?/g, - "" - ); //取消打字机 - const name = this.textList[i][0] - ? "【" + this.textList[i][0] + "】" - : ""; - if (name) { - core.fillBoldText1( - logctx, - name, - 150, - posy + 50, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - } - if (text.length < 30) { - core.fillBoldText1( - logctx, - text, - 650, - posy + 50, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - } else { - let text1 = text.slice(0, 30); - core.fillBoldText1( - logctx, - text1, - 650, - posy + 50, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - if (text.length > 60) { - let text2 = text.slice(30, 60); - let text3 = text.slice(60); - core.fillBoldText1( - logctx, - text2, - 650, - posy + 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - core.fillBoldText1( - logctx, - text3, - 650, - posy + 150, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - } else { - let text2 = text.slice(30); - core.fillBoldText1( - logctx, - text2, - 650, - posy + 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - } - } + logctx.stroke(); + let posy = 150; + const indexList = this.textList; + core.setTextAlign(logctx, "left"); + for ( + let i = (page - 1) * 6; i <= Math.min(this.index, page * 6 - 1); i++ + ) { + const text = this.textList[i][1].replaceAll( + /(\\(d|e|f|g|i|n|r|b|c|t|z))(\[.*?\])?/g, + "" + ); //取消打字机 + const name = this.textList[i][0] ? + "【" + this.textList[i][0] + "】" : + ""; + if (name) { + core.fillBoldText1( + logctx, + name, + 150, + posy + 50, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } + if (text.length < 30) { + core.fillBoldText1( + logctx, + text, + 650, + posy + 50, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } else { + let text1 = text.slice(0, 30); + core.fillBoldText1( + logctx, + text1, + 650, + posy + 50, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + if (text.length > 60) { + let text2 = text.slice(30, 60); + let text3 = text.slice(60); + core.fillBoldText1( + logctx, + text2, + 650, + posy + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + core.fillBoldText1( + logctx, + text3, + 650, + posy + 150, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } else { + let text2 = text.slice(30); + core.fillBoldText1( + logctx, + text2, + 650, + posy + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } + } - logctx.strokeStyle = "#FFFFFF"; - logctx.lineWidth = 3; - logctx.beginPath(); - logctx.moveTo(100, posy); - logctx.lineTo(1928, posy); - logctx.stroke(); + logctx.strokeStyle = "#FFFFFF"; + logctx.lineWidth = 3; + logctx.beginPath(); + logctx.moveTo(100, posy); + logctx.lineTo(1928, posy); + logctx.stroke(); - posy += 160; - } - logctx.beginPath(); - logctx.moveTo(100, 1120); - logctx.lineTo(1928, 1120); - logctx.moveTo(100, 1110); - logctx.lineTo(1928, 1110); - logctx.stroke(); - core.fillBoldText1( - logctx, - "上一页", - 300, - 1200, - page === 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + posy += 160; + } + logctx.beginPath(); + logctx.moveTo(100, 1120); + logctx.lineTo(1928, 1120); + logctx.moveTo(100, 1110); + logctx.lineTo(1928, 1110); + logctx.stroke(); + core.fillBoldText1( + logctx, + "上一页", + 300, + 1200, + page === 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - core.fillBoldText1( - logctx, - page + "/" + this.overpage, - 1000, - 1200, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - logctx, - "下一页", - 1500, - 1200, - page === this.overpage ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - } - background() { - const img = core.material.images.images?.[this.image]; + core.fillBoldText1( + logctx, + page + "/" + this.overpage, + 1000, + 1200, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + logctx, + "下一页", + 1500, + 1200, + page === this.overpage ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + } + background() { + const img = core.material.images.images?.[this.image]; - if (core.domStyle.isVertical) { - ctx.canvas.width = 1248; - ctx.canvas.height = 2028; - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - } else { - ctx.canvas.width = 2028; - ctx.canvas.height = 1248; - } + if (core.domStyle.isVertical) { + ctx.canvas.width = 1248; + ctx.canvas.height = 2028; + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } else { + ctx.canvas.width = 2028; + ctx.canvas.height = 1248; + } - if (img) { - //绘制背景 - if (this.memory) ctx.filter = "sepia(50%)"; - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.filter = "none"; - } else { - core.fillRect(ctx, 0, 0, 2028, 1248); - } - this.bodyList.forEach((v) => { - //绘制立绘 - const body = core.material.images.images?.[v.name]; - if (v.filter) ctx.filter = "brightness(50%)"; - if (body) { - if (!v.w && !v.h && !v.scale) v.scale = 1.7; - if (!v.w && !v.h) { - ctx.drawImage( - body, - 0, - 0, - body.width, - body.height, - v.px, - 1248 - body.height * v.scale, - body.width * v.scale, - body.height * v.scale - ); - } else { - ctx.drawImage( - body, - 0, - 0, - body.width, - body.height, - v.px, - 1248 - (v.h ?? body.height), - v.w ?? body.width, - v.h ?? body.height - ); - } - } - ctx.filter = "none"; - }); - if (core.isPlaying() && !this.WindowSkin) - core.drawWindowSkin( - "winskin.webp", - ctx, - 30, - 780, - 1968, - 436, - null, - null, - null, - 3 - ); //绘制对话框 - const head = core.material.images.images?.[this.head.name]; - if (head) { - //绘制头像 - ctx.drawImage( - head, - 0, - 0, - head.width, - head.height, - this.head.px, - 1248 - head.height * 2.2, - head.width * 2.2, - head.height * 2.2 - ); - } - if (core.isPlaying() && !this.WindowSkin) { - core.drawWindowSkin( - "winskin.webp", - ctx, - 1700, - 800, - 192, - 96, - null, - null, - null, - 3 - ); - core.fillBoldText1( - ctx, - "记 录", - 1736, - 866, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - core.drawWindowSkin( - "winskin.webp", - ctx, - 1700, - 1100, - 192, - 96, - null, - null, - null, - 3 - ); - core.fillBoldText1( - ctx, - "存 档", - 1736, - 1166, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - core.drawWindowSkin( - "winskin.webp", - ctx, - 1700, - 1000, - 192, - 96, - null, - null, - null, - 3 - ); - core.fillBoldText1( - ctx, - "▶▶", - 1756, - 1066, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - core.drawWindowSkin( - "winskin.webp", - ctx, - 1700, - 900, - 192, - 96, - null, - null, - null, - 3 - ); - let autoText = "AUTO"; - if (auto) autoText = "STOP"; - core.fillBoldText1( - ctx, - autoText, - 1722, - 966, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - } - if (this.name) - core.fillBoldText1( - ctx, - `【${this.name}】`, - 550, - 880, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); //绘制名字 + if (img) { + //绘制背景 + if (this.memory) ctx.filter = "sepia(50%)"; + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.filter = "none"; + } else { + core.fillRect(ctx, 0, 0, 2028, 1248); + } + this.bodyList.forEach((v) => { + //绘制立绘 + const body = core.material.images.images?.[v.name]; + if (v.filter) ctx.filter = "brightness(50%)"; + if (body) { + if (!v.w && !v.h && !v.scale) v.scale = 1.7; + if (!v.w && !v.h) { + ctx.drawImage( + body, + 0, + 0, + body.width, + body.height, + v.px, + 1248 - body.height * v.scale, + body.width * v.scale, + body.height * v.scale + ); + } else { + ctx.drawImage( + body, + 0, + 0, + body.width, + body.height, + v.px, + 1248 - (v.h ?? body.height), + v.w ?? body.width, + v.h ?? body.height + ); + } + } + ctx.filter = "none"; + }); + if (core.isPlaying() && !this.WindowSkin) + core.drawWindowSkin( + "winskin.webp", + ctx, + 30, + 780, + 1968, + 436, + null, + null, + null, + 3 + ); //绘制对话框 + const head = core.material.images.images?.[this.head.name]; + if (head) { + //绘制头像 + ctx.drawImage( + head, + 0, + 0, + head.width, + head.height, + this.head.px, + 1248 - head.height * 2.2, + head.width * 2.2, + head.height * 2.2 + ); + } + if (core.isPlaying() && !this.WindowSkin) { + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 800, + 192, + 96, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx, + "记 录", + 1736, + 866, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 1100, + 192, + 96, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx, + "存 档", + 1736, + 1166, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 1000, + 192, + 96, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx, + "▶▶", + 1756, + 1066, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 900, + 192, + 96, + null, + null, + null, + 3 + ); + let autoText = "AUTO"; + if (auto) autoText = "STOP"; + core.fillBoldText1( + ctx, + autoText, + 1722, + 966, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + } + if (this.name) + core.fillBoldText1( + ctx, + `【${this.name}】`, + 550, + 880, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); //绘制名字 - if ( - this.sound && - core.sounds && - !core.getFlag("skip", false) && - core.musicStatus.soundStatus - ) { - this.beforeSound = core.playSound(this.sound, null, () => { - if ( - this.sound && - auto && - !this.WindowSkin && - core.musicStatus.soundStatus - ) { - setTimeout(() => { - if (auto) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - }, this.wait); - } - }); - } - if (this.text && !core.getFlag("skip", false)) { - //绘制对话 - this.drawTextContent(ctx, this.text, { - left: 550, - top: 950, - bold: true, - color: "#FFFFFF", - align: "left", - fontSize: 48, - time: this.time || 0, - font: "Verdana", - maxWidth: 1000, - }); - } + if ( + this.sound && + core.sounds && + !core.getFlag("skip", false) && + core.musicStatus.soundStatus + ) { + this.beforeSound = core.playSound(this.sound, null, () => { + if ( + this.sound && + auto && + !this.WindowSkin && + core.musicStatus.soundStatus + ) { + setTimeout(() => { + if (auto) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + }, this.wait); + } + }); + } + if (this.text && !core.getFlag("skip", false)) { + //绘制对话 + this.drawTextContent(ctx, this.text, { + left: 550, + top: 950, + bold: true, + color: "#FFFFFF", + align: "left", + fontSize: 48, + time: this.time || 0, + font: "Verdana", + maxWidth: 1000, + }); + } - ctx.restore(); - } - } - core.ui.cgText = new cgText(); - }, + ctx.restore(); + } + } + core.ui.cgText = new cgText(); +}, "旁白": function () { // 在此增加新插件 const over = document.createElement("canvas"); //over画布设置 From 63de0f7785f4b6e03498a371101f5e1765bf8b2a Mon Sep 17 00:00:00 2001 From: strawberry42271 <2806566736@qq.com> Date: Sat, 1 Feb 2025 10:26:06 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E9=9F=B3=E9=A2=91=E5=89=A7=E6=83=85?= =?UTF-8?q?=E9=87=8D=E7=BD=AE=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _server/MotaAction.g4 | 5 +- _server/MotaActionParser.js | 1 - project/data.js | 4 +- project/events.js | 245 - project/images/sound.webp | Bin 0 -> 1360 bytes project/plugins.js | 8734 ++++++++++++++++++----------------- 6 files changed, 4401 insertions(+), 4588 deletions(-) create mode 100644 project/images/sound.webp diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index c488ffd..eaa641e 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -1138,7 +1138,7 @@ return code; cgtext_s : '背景' EvalString? '回忆滤镜' Bool? '移除对话框' Bool? '剧情库序列' Int '头像' EvalString?'坐标PX' Number'打字间隔' Int? BGNL? Newline - '自动等待时长' Int '音频文件(需在全塔属性——使用音效注册)'EvalString? BGNL? Newline + '自动等待时长' Int BGNL? Newline textcgDrawingList+? Newline @@ -1146,11 +1146,10 @@ cgtext_s tooltip : cgtext:显示一段包含cg的文字(剧情) helpUrl : /_docs/#/instruction allImages : ['EvalString_0','EvalString_1'] -allSounds : ['EvalString_2'] default : ["bg_5043.webp",false,false,0,"face_050445.webp",-300,0,2000,"","这句话显示在对话框内",[{ "name":"tati_050145a.webp" , "px": 100,"filter":false }]] var head ='{ "name": "'+EvalString_1+'", "px": '+Number_0+' }' var list=',"bodyList": [\n'+textcgDrawingList_0.slice(0,-1)+'\n]' -var code = '{"type": "cgtext", "bg":"'+EvalString_0+'","memory":'+Bool_0+',"WindowSkin":'+Bool_1+',"head":'+head+' ,"index":"'+Int_0+'","time":'+Int_1+',"wait":'+Int_2+',"sound":"'+EvalString_2+'"'+list+' },\n'; +var code = '{"type": "cgtext", "bg":"'+EvalString_0+'","memory":'+Bool_0+',"WindowSkin":'+Bool_1+',"head":'+head+' ,"index":"'+Int_0+'","time":'+Int_1+',"wait":'+Int_2+list+' },\n'; return code; */; textcgDrawingList diff --git a/_server/MotaActionParser.js b/_server/MotaActionParser.js index 85647da..db8cf0b 100644 --- a/_server/MotaActionParser.js +++ b/_server/MotaActionParser.js @@ -574,7 +574,6 @@ MotaActionParser = function () { data.head.px || -300, data.time, data.wait, - data.sound, buildcgDrawing(data.bodyList), this.next, ]); diff --git a/project/data.js b/project/data.js index 0674e05..cf5aaac 100644 --- a/project/data.js +++ b/project/data.js @@ -451,6 +451,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "other_0003.webp", "other_0004.webp", "r.webp", + "sound.webp", "status.webp", "suiji.webp", "tati_020101.webp", @@ -1140,7 +1141,8 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "steps": 0, "matk": 0, "spell": 0, - "spelldef": 0 + "spelldef": 0, + "mhp": 0 }, "startCanvas": [ { diff --git a/project/events.js b/project/events.js index cbad1c4..71a864c 100644 --- a/project/events.js +++ b/project/events.js @@ -456,7 +456,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "0", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -477,7 +476,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "1", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -498,7 +496,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "2", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -528,7 +525,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "3", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -549,7 +545,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "4", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -570,7 +565,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "5", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -591,7 +585,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "6", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -612,7 +605,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "7", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -633,7 +625,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "8", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -654,7 +645,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "9", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -675,7 +665,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "10", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -705,7 +694,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "11", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -726,7 +714,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "12", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -747,7 +734,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "13", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -768,7 +754,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "14", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -789,7 +774,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "15", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -810,7 +794,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "16", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -831,7 +814,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "17", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -852,7 +834,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "18", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -882,7 +863,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "19", "time": 30, "wait": 1000, - "sound": "aiy010000010.opus", "bodyList": [ { "name": "", @@ -912,7 +892,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "20", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -933,7 +912,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "21", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -963,7 +941,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "22", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -993,7 +970,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "23", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1014,7 +990,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "24", "time": 50, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1044,7 +1019,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "25", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1065,7 +1039,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "26", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1086,7 +1059,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "27", "time": 30, "wait": 2000, - "sound": "aiy010000020.opus", "bodyList": [ { "name": "", @@ -1107,7 +1079,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "28", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1128,7 +1099,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "29", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1149,7 +1119,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "30", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1170,7 +1139,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "31", "time": 30, "wait": 1000, - "sound": "aiy010000030.opus", "bodyList": [ { "name": "", @@ -1205,7 +1173,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "32", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1226,7 +1193,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "33", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1247,7 +1213,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "34", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1268,7 +1233,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "35", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1289,7 +1253,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "36", "time": 30, "wait": 1000, - "sound": "aiy710000010.opus", "bodyList": [ { "name": "", @@ -1310,7 +1273,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "37", "time": 30, "wait": 1000, - "sound": "aiy710000020.opus", "bodyList": [ { "name": "", @@ -1340,7 +1302,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "38", "time": 30, "wait": 1000, - "sound": "aiy710000030.opus", "bodyList": [ { "name": "", @@ -1361,7 +1322,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "39", "time": 30, "wait": 1000, - "sound": "aiy710000040.opus", "bodyList": [ { "name": "", @@ -1382,7 +1342,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "40", "time": 30, "wait": 1000, - "sound": "aiy710000050.opus", "bodyList": [ { "name": "", @@ -1412,7 +1371,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "41", "time": 30, "wait": 1000, - "sound": "aiy710000060.opus", "bodyList": [ { "name": "", @@ -1433,7 +1391,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "42", "time": 30, "wait": 1000, - "sound": "aiy310000010.opus", "bodyList": [ { "name": "", @@ -1454,7 +1411,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "43", "time": 30, "wait": 1000, - "sound": "aiy310000020.opus", "bodyList": [ { "name": "", @@ -1484,7 +1440,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "44", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1505,7 +1460,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "45", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1526,7 +1480,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "46", "time": 30, "wait": 1000, - "sound": "aiy350000010.opus", "bodyList": [ { "name": "", @@ -1547,7 +1500,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "47", "time": 30, "wait": 1000, - "sound": "aiy350000020.opus", "bodyList": [ { "name": "", @@ -1568,7 +1520,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "48", "time": 30, "wait": 1000, - "sound": "aiy310000030.opus", "bodyList": [ { "name": "", @@ -1589,7 +1540,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "49", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1610,7 +1560,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "50", "time": 30, "wait": 1000, - "sound": "aiy350000030.opus", "bodyList": [ { "name": "", @@ -1631,7 +1580,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "51", "time": 30, "wait": 1000, - "sound": "aiy310000040.opus", "bodyList": [ { "name": "", @@ -1652,7 +1600,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "52", "time": 30, "wait": 1000, - "sound": "aiy710000070.opus", "bodyList": [ { "name": "", @@ -1673,7 +1620,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "53", "time": 30, "wait": 1000, - "sound": "aiy350000040.opus", "bodyList": [ { "name": "", @@ -1694,7 +1640,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "54", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1715,7 +1660,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "55", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1736,7 +1680,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "56", "time": 30, "wait": 1000, - "sound": "aiy350000050.opus", "bodyList": [ { "name": "", @@ -1757,7 +1700,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "57", "time": 30, "wait": 1000, - "sound": "aiy350000060.opus", "bodyList": [ { "name": "", @@ -1778,7 +1720,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "58", "time": 30, "wait": 1000, - "sound": "aiy310000050.opus", "bodyList": [ { "name": "", @@ -1799,7 +1740,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "59", "time": 30, "wait": 1000, - "sound": "aiy350000070.opus", "bodyList": [ { "name": "", @@ -1820,7 +1760,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "60", "time": 30, "wait": 1000, - "sound": "aiy350000080.opus", "bodyList": [ { "name": "", @@ -1841,7 +1780,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "61", "time": 30, "wait": 1000, - "sound": "aiy820000010.opus", "bodyList": [ { "name": "", @@ -1862,7 +1800,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "62", "time": 30, "wait": 1000, - "sound": "aiy350000090.opus", "bodyList": [ { "name": "", @@ -1883,7 +1820,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "63", "time": 30, "wait": 1000, - "sound": "aiy820000020.opus", "bodyList": [ { "name": "", @@ -1904,7 +1840,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "64", "time": 30, "wait": 1000, - "sound": "aiy350000100.opus", "bodyList": [ { "name": "", @@ -1925,7 +1860,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "65", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1946,7 +1880,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "66", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1967,7 +1900,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "67", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1988,7 +1920,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "68", "time": 30, "wait": 1000, - "sound": "aiy310000060.opus", "bodyList": [ { "name": "", @@ -2009,7 +1940,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "69", "time": 30, "wait": 1000, - "sound": "aiy310000070.opus", "bodyList": [ { "name": "", @@ -2030,7 +1960,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "70", "time": 30, "wait": 1000, - "sound": "aiy350000110.opus", "bodyList": [ { "name": "", @@ -2051,7 +1980,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "71", "time": 30, "wait": 1000, - "sound": "aiy350000120.opus", "bodyList": [ { "name": "", @@ -2072,7 +2000,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "72", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2093,7 +2020,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "73", "time": 30, "wait": 1000, - "sound": "aiy310000080.opus", "bodyList": [ { "name": "", @@ -2114,7 +2040,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "74", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2135,7 +2060,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "75", "time": 30, "wait": 1000, - "sound": "aiy350000130.opus", "bodyList": [ { "name": "", @@ -2156,7 +2080,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "76", "time": 30, "wait": 1000, - "sound": "aiy310000090.opus", "bodyList": [ { "name": "", @@ -2177,7 +2100,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "77", "time": 30, "wait": 1000, - "sound": "aiy310000100.opus", "bodyList": [ { "name": "", @@ -2198,7 +2120,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "78", "time": 30, "wait": 1000, - "sound": "aiy350000140.opus", "bodyList": [ { "name": "", @@ -2219,7 +2140,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "79", "time": 30, "wait": 1000, - "sound": "aiy350000150.opus", "bodyList": [ { "name": "", @@ -2240,7 +2160,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "80", "time": 30, "wait": 1000, - "sound": "aiy710000080.opus", "bodyList": [ { "name": "", @@ -2261,7 +2180,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "81", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2282,7 +2200,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "82", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2303,7 +2220,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "83", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2324,7 +2240,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "84", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2345,7 +2260,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "85", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2366,7 +2280,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "86", "time": 30, "wait": 1000, - "sound": "aiy710000090.opus", "bodyList": [ { "name": "", @@ -2387,7 +2300,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "87", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2408,7 +2320,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "88", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2429,7 +2340,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "89", "time": 30, "wait": 1000, - "sound": "aiy710000100.opus", "bodyList": [ { "name": "", @@ -2450,7 +2360,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "90", "time": 30, "wait": 1000, - "sound": "aiy350000160.opus", "bodyList": [ { "name": "", @@ -2471,7 +2380,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "91", "time": 30, "wait": 1000, - "sound": "aiy350000170.opus", "bodyList": [ { "name": "", @@ -2492,7 +2400,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "92", "time": 30, "wait": 1000, - "sound": "aiy710000110.opus", "bodyList": [ { "name": "", @@ -2513,7 +2420,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "93", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2534,7 +2440,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "94", "time": 30, "wait": 2000, - "sound": "aiy350000180.opus", "bodyList": [ { "name": "", @@ -2555,7 +2460,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "95", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2576,7 +2480,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "96", "time": 30, "wait": 1000, - "sound": "aiy350000190.opus", "bodyList": [ { "name": "", @@ -2597,7 +2500,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "97", "time": 30, "wait": 1000, - "sound": "aiy350000200.opus", "bodyList": [ { "name": "", @@ -2618,7 +2520,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "98", "time": 30, "wait": 1000, - "sound": "aiy710000120.opus", "bodyList": [ { "name": "", @@ -2639,7 +2540,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "99", "time": 30, "wait": 1000, - "sound": "aiy710000130.opus", "bodyList": [ { "name": "", @@ -2660,7 +2560,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "100", "time": 30, "wait": 1000, - "sound": "aiy350000210.opus", "bodyList": [ { "name": "", @@ -2681,7 +2580,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "101", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2702,7 +2600,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "102", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2723,7 +2620,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "103", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2744,7 +2640,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "104", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2765,7 +2660,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "105", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2786,7 +2680,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "106", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2807,7 +2700,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "107", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2828,7 +2720,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "108", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2849,7 +2740,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "109", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2870,7 +2760,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "110", "time": 30, "wait": 1000, - "sound": "aiy310000110.opus", "bodyList": [ { "name": "", @@ -2891,7 +2780,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "111", "time": 30, "wait": 1000, - "sound": "aiy350000220.opus", "bodyList": [ { "name": "", @@ -2912,7 +2800,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "112", "time": 30, "wait": 1000, - "sound": "aiy350000230.opus", "bodyList": [ { "name": "", @@ -2933,7 +2820,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "113", "time": 30, "wait": 1000, - "sound": "aiy310000120.opus", "bodyList": [ { "name": "", @@ -2954,7 +2840,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "114", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2975,7 +2860,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "115", "time": 30, "wait": 1000, - "sound": "aiy310000130.opus", "bodyList": [ { "name": "", @@ -3005,7 +2889,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "116", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3026,7 +2909,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "117", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3047,7 +2929,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "118", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3068,7 +2949,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "119", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3089,7 +2969,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "120", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3110,7 +2989,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "121", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3131,7 +3009,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "122", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3152,7 +3029,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "123", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3173,7 +3049,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "124", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3194,7 +3069,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "125", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3224,7 +3098,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "126", "time": 30, "wait": 1000, - "sound": "aiy310000140.opus", "bodyList": [ { "name": "", @@ -3273,7 +3146,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "0", "time": 30, "wait": 1000, - "sound": "aiy020000005.opus", "bodyList": [ { "name": "", @@ -3298,7 +3170,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "1", "time": 30, "wait": 1000, - "sound": "aiy020000010.opus", "bodyList": [ { "name": "tati_020141.webp", @@ -3319,7 +3190,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "2", "time": 30, "wait": 1000, - "sound": "aiy020000020.opus", "bodyList": [ { "name": "tati_020157.webp", @@ -3340,7 +3210,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "3", "time": 30, "wait": 1000, - "sound": "aiy310000150.opus", "bodyList": [ { "name": "tati_020157.webp", @@ -3361,7 +3230,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "4", "time": 30, "wait": 1000, - "sound": "aiy020000030.opus", "bodyList": [ { "name": "tati_020107.webp", @@ -3382,7 +3250,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "5", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "tati_020107.webp", @@ -3403,7 +3270,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "6", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "tati_020107.webp", @@ -3424,7 +3290,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "7", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "tati_020107.webp", @@ -3445,7 +3310,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "8", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "tati_020107.webp", @@ -3466,7 +3330,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "9", "time": 30, "wait": 1000, - "sound": "aiy020000040.opus", "bodyList": [ { "name": "tati_020157.webp", @@ -3487,7 +3350,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "10", "time": 30, "wait": 1000, - "sound": "aiy020000050.opus", "bodyList": [ { "name": "tati_020157.webp", @@ -3508,7 +3370,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "11", "time": 30, "wait": 1000, - "sound": "aiy310000160.opus", "bodyList": [ { "name": "tati_020157.webp", @@ -3529,7 +3390,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "12", "time": 30, "wait": 1000, - "sound": "aiy020000060.opus", "bodyList": [ { "name": "tati_020111.webp", @@ -3550,7 +3410,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "13", "time": 30, "wait": 1000, - "sound": "aiy310000170.opus", "bodyList": [ { "name": "tati_020111.webp", @@ -3571,7 +3430,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "14", "time": 30, "wait": 1000, - "sound": "aiy020000070.opus", "bodyList": [ { "name": "tati_020101.webp", @@ -3592,7 +3450,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "15", "time": 30, "wait": 1000, - "sound": "aiy310000180.opus", "bodyList": [ { "name": "tati_020101.webp", @@ -3613,7 +3470,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "16", "time": 30, "wait": 1000, - "sound": "aiy020000080.opus", "bodyList": [ { "name": "tati_020107.webp", @@ -3634,7 +3490,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "17", "time": 30, "wait": 1000, - "sound": "aiy310000190.opus", "bodyList": [ { "name": "tati_020107.webp", @@ -3655,7 +3510,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "18", "time": 30, "wait": 1000, - "sound": "aiy020000090.opus", "bodyList": [ { "name": "tati_020157.webp", @@ -3676,7 +3530,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "19", "time": 30, "wait": 1000, - "sound": "aiy310000200.opus", "bodyList": [ { "name": "tati_020157.webp", @@ -3697,7 +3550,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "20", "time": 30, "wait": 1000, - "sound": "aiy310000210.opus", "bodyList": [ { "name": "tati_020157.webp", @@ -3718,7 +3570,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "21", "time": 30, "wait": 1000, - "sound": "aiy020000100.opus", "bodyList": [ { "name": "tati_020125.webp", @@ -3739,7 +3590,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "22", "time": 30, "wait": 1000, - "sound": "aiy310000220.opus", "bodyList": [ { "name": "tati_020125.webp", @@ -3760,7 +3610,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "23", "time": 30, "wait": 1000, - "sound": "aiy020000110.opus", "bodyList": [ { "name": "tati_020121.webp", @@ -3781,7 +3630,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "24", "time": 30, "wait": 1000, - "sound": "aiy310000230.opus", "bodyList": [ { "name": "tati_020121.webp", @@ -3802,7 +3650,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "25", "time": 30, "wait": 1000, - "sound": "aiy310000240.opus", "bodyList": [ { "name": "tati_020121.webp", @@ -3823,7 +3670,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "26", "time": 30, "wait": 1000, - "sound": "aiy020000120.opus", "bodyList": [ { "name": "tati_020105.webp", @@ -3844,7 +3690,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "27", "time": 30, "wait": 1000, - "sound": "aiy020000130.opus", "bodyList": [ { "name": "tati_020103.webp", @@ -3865,7 +3710,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "28", "time": 30, "wait": 1000, - "sound": "aiy020000140.opus", "bodyList": [ { "name": "tati_020141.webp", @@ -3886,7 +3730,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "29", "time": 30, "wait": 1000, - "sound": "aiy310000250.opus", "bodyList": [ { "name": "tati_020141.webp", @@ -3907,7 +3750,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "30", "time": 30, "wait": 1000, - "sound": "aiy020000150.opus", "bodyList": [ { "name": "tati_020105.webp", @@ -3928,7 +3770,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "31", "time": 30, "wait": 1000, - "sound": "aiy310000260.opus", "bodyList": [ { "name": "tati_020105.webp", @@ -3949,7 +3790,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "32", "time": 30, "wait": 1000, - "sound": "aiy020000160.opus", "bodyList": [ { "name": "tati_020105.webp", @@ -3970,7 +3810,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "33", "time": 30, "wait": 1000, - "sound": "aiy020000170.opus", "bodyList": [ { "name": "tati_020107.webp", @@ -3991,7 +3830,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "34", "time": 30, "wait": 1000, - "sound": "aiy310000280.opus", "bodyList": [ { "name": "tati_020107.webp", @@ -4012,7 +3850,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "35", "time": 30, "wait": 1000, - "sound": "aiy020000180.opus", "bodyList": [ { "name": "tati_020145.webp", @@ -4033,7 +3870,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "36", "time": 30, "wait": 1000, - "sound": "aiy310000290.opus", "bodyList": [ { "name": "tati_020145.webp", @@ -4054,7 +3890,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "37", "time": 30, "wait": 1000, - "sound": "aiy310000300.opus", "bodyList": [ { "name": "tati_020145.webp", @@ -4099,7 +3934,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "0", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4120,7 +3954,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "1", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4141,7 +3974,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "2", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4162,7 +3994,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "3", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4183,7 +4014,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "4", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4204,7 +4034,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "5", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4225,7 +4054,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "6", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4246,7 +4074,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "7", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4267,7 +4094,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "8", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4288,7 +4114,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "9", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4318,7 +4143,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "10", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4339,7 +4163,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "11", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4360,7 +4183,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "12", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4381,7 +4203,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "13", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4402,7 +4223,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "14", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4423,7 +4243,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "15", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4444,7 +4263,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "16", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4474,7 +4292,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "17", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4495,7 +4312,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "18", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4516,7 +4332,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "19", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4550,7 +4365,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "20", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "tati_440101.webp", @@ -4571,7 +4385,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "21", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "tati_440101.webp", @@ -4592,7 +4405,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "22", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "tati_440101.webp", @@ -4613,7 +4425,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "23", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4634,7 +4445,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "24", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4655,7 +4465,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "25", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4676,7 +4485,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "26", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4697,7 +4505,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "27", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4718,7 +4525,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "28", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4739,7 +4545,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "29", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4786,7 +4591,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "30", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4807,7 +4611,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "31", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4832,7 +4635,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "32", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4853,7 +4655,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "33", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4874,7 +4675,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "34", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4895,7 +4695,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "35", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4916,7 +4715,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "36", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4937,7 +4735,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "37", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4958,7 +4755,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "38", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4979,7 +4775,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "39", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5000,7 +4795,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "40", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5021,7 +4815,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "41", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5046,7 +4839,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "42", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5076,7 +4868,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "43", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5097,7 +4888,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "44", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5118,7 +4908,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "45", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5139,7 +4928,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "46", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5160,7 +4948,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "47", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5190,7 +4977,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "48", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5211,7 +4997,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "49", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5232,7 +5017,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "50", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5253,7 +5037,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "51", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5274,7 +5057,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "52", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5295,7 +5077,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "53", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5316,7 +5097,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "54", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5337,7 +5117,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "55", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5358,7 +5137,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "56", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5379,7 +5157,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "57", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5400,7 +5177,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "58", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5421,7 +5197,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "59", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5442,7 +5217,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "60", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5463,7 +5237,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "61", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5484,7 +5257,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "62", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5505,7 +5277,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "63", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5526,7 +5297,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "64", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5547,7 +5317,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "65", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5568,7 +5337,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "66", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5589,7 +5357,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "67", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5610,7 +5377,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "68", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5631,7 +5397,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "69", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5652,7 +5417,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "70", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5673,7 +5437,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "71", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5694,7 +5457,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "72", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5715,7 +5477,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "73", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5736,7 +5497,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "74", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5757,7 +5517,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "75", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5778,7 +5537,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "76", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5799,7 +5557,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "77", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5820,7 +5577,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "78", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5841,7 +5597,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "79", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", diff --git a/project/images/sound.webp b/project/images/sound.webp new file mode 100644 index 0000000000000000000000000000000000000000..1fed12015c442fa4cf921856b1559c74723c4e46 GIT binary patch literal 1360 zcmWIYbaV4yWnc(*bqWXzu!!JdU|=u+;z%&^baoCn!3g9sFrEOBEI_H;ypp0IcPE92 z$S4K&2Mmlr2nLDC#RU)+RuZV{+ck*V%eq)q;1}dfNi9wWD)|7!Dn&rcfo>83vPIG% zYz+`Q3BtAkvCB&eN`PttK=2?(*InG6iuTNxN6ZXv`}7BDdI zw=ghlJC6`Ugh@eSQ6ktl79h!#md3#FX*mM}FEAp6FEB80MT6yl1P-?;0HtJr?#c(k zbcP&;R0ahGPlh~(WClGT%Lo{$h74woJ^>zo7=flvaL%2r7`b&@?(J>4t{pk=-F9E^ znqs}{=UKB|AhD|}e!bei&(X!AK>1|gt0D%eZR>tA|K?A-l_hezulCI16HUg7JxAaD z^q5fDF8W@ie2T)v?%s3;{#4tY+Vc+C z9ML~5ci84g{`$MjRUK(3ebbk;Kj_<~^kU%|wfXh8qV70n*0Z=X$azKcG1yGmrrT7( zarsGV&+1MlX4ad39@xgznNMg`<4n4rnzDR)V@YRXNugqo=I`2BF5GkMnVCK^JwM;z zu;;)};|^wxf`2@ZmJ70;o9`&$(fB!Czzrn+=a2mM@)qvbb`K}n$~lXl-ks;<5w?AK z$2*&Q#hS;iPI;wgUH5*jn)RlgiUAj;-%hFoQlEqNJhHsFG9$7$$%94QM62rE1@3ye zj*ybP_;up!AzD>g7n#Flw`fOgo4>Dnwd|CK9KS3jgY%cSESR6X_g@SJBn^SUSBxN&Izhvn?-b;X;{|1`QULEp0D0cs2yDyQ^UDIh`pjkmbCW)S{QcXKeOX9=qZ!TVWiW zeCS&Yx2ed1-Y&VBB3rkK$4pxIZ{>uSeeJVCSQ}sN*PF3BblS7o552x_XJGjEcgy?! z|LG>zf1I1x{5SrD>h1q;9@J(z0X8ir&4|E|!H{Nl=f{en~G`u`8N*oMuh z?ABo2Rsa8|)BXRS>firA@+@@+$7El-!=GQhFy3t=!MC$|YW@3 1000 / 60) { - now = timestamp; - globalAlphafloor += globalAlphafloorStatus; - if (globalAlphafloor === 100) globalAlphafloorStatus = -2; - if (globalAlphafloor === 0) globalAlphafloorStatus = 2; + core.dom.gameDraw.style.width = core.dom.gameDraw.style.height = + innerSize; + core.dom.gameDraw.style.top = + obj.gameDrawBox.top * core.domStyle.scale + "px"; + core.dom.gameDraw.style.left = + obj.gameDrawBox.left * core.domStyle.scale + "px"; + // resize bigmap + core.bigmap.canvas.forEach(function (cn) { + const ratio = core.canvas[cn].canvas.hasAttribute("isHD") + ? core.domStyle.ratio + : 1; + core.canvas[cn].canvas.style.width = + (innerSize / ratio) * core.domStyle.scale + "px"; + core.canvas[cn].canvas.style.height = + (innerSize / ratio) * core.domStyle.scale + "px"; + }); + // resize dynamic canvas + for (const name in core.dymCanvas) { + const ctx = core.dymCanvas[name], + canvas = ctx.canvas; + const ratio = canvas.hasAttribute("isHD") ? core.domStyle.ratio : 1; + canvas.style.width = (innerSize / ratio) * core.domStyle.scale + "px"; + canvas.style.height = (innerSize / ratio) * core.domStyle.scale + "px"; + canvas.style.left = + parseFloat(canvas.getAttribute("_left")) * core.domStyle.scale + "px"; + canvas.style.top = + parseFloat(canvas.getAttribute("_top")) * core.domStyle.scale + "px"; + } + // resize next + main.dom.next.style.width = main.dom.next.style.height = + 5 * core.domStyle.scale + "px"; + main.dom.next.style.borderBottomWidth = + main.dom.next.style.borderRightWidth = 4 * core.domStyle.scale + "px"; + }; + const bgctx = main.dom.outerBackground.getContext("2d"); + const uictx = main.dom.outerUI.getContext("2d"); + let now = 0; + core.registerAnimationFrame("lightFloor", true, function (timestamp) { + if (timestamp - now > 1000 / 60) { + now = timestamp; + globalAlphafloor += globalAlphafloorStatus; + if (globalAlphafloor === 100) globalAlphafloorStatus = -2; + if (globalAlphafloor === 0) globalAlphafloorStatus = 2; - if (core.domStyle.isVertical) { - core.clearMap( - uictx, - MAP_BLOCK_LEFT_VERTICAL, - MAP_BLOCK_TOP_VERTICAL, - 340, - 360 - ); - if (core.status.event.id === "viewMaps") { - core.ui.statusBar._update_map(core.status.event.data.floorId); - } else { - core.ui.statusBar._update_map(); - } + if (core.domStyle.isVertical) { + core.clearMap( + uictx, + MAP_BLOCK_LEFT_VERTICAL, + MAP_BLOCK_TOP_VERTICAL, + 340, + 360 + ); + if (core.status.event.id === "viewMaps") { + core.ui.statusBar._update_map(core.status.event.data.floorId); + } else { + core.ui.statusBar._update_map(); + } - uictx.globalAlpha = globalAlphafloor / 100; - core.drawImage( - uictx, - "green.webp", - MAP_BLOCK_LEFT_VERTICAL + 135, - MAP_BLOCK_TOP_VERTICAL + 170 - ); - uictx.globalAlpha = 1; - } else { - core.clearMap(uictx, MAP_BLOCK_LEFT, MAP_BLOCK_TOP, 340, 360); - if (core.status.event.id === "viewMaps") { - core.ui.statusBar._update_map(core.status.event.data.floorId); - } else { - core.ui.statusBar._update_map(); - } - uictx.globalAlpha = globalAlphafloor / 100; - core.drawImage( - uictx, - "green.webp", - MAP_BLOCK_LEFT + 150, - MAP_BLOCK_TOP + 180 - ); - uictx.globalAlpha = 1; - } - } - }); + uictx.globalAlpha = globalAlphafloor / 100; + core.drawImage( + uictx, + "green.webp", + MAP_BLOCK_LEFT_VERTICAL + 135, + MAP_BLOCK_TOP_VERTICAL + 170 + ); + uictx.globalAlpha = 1; + } else { + core.clearMap(uictx, MAP_BLOCK_LEFT, MAP_BLOCK_TOP, 340, 360); + if (core.status.event.id === "viewMaps") { + core.ui.statusBar._update_map(core.status.event.data.floorId); + } else { + core.ui.statusBar._update_map(); + } + uictx.globalAlpha = globalAlphafloor / 100; + core.drawImage( + uictx, + "green.webp", + MAP_BLOCK_LEFT + 150, + MAP_BLOCK_TOP + 180 + ); + uictx.globalAlpha = 1; + } + } + }); - core.control.resize = function () { - //自适应,可实现横竖屏切换 - if (main.mode == "editor") return; + core.control.resize = function () { + //自适应,可实现横竖屏切换 + if (main.mode == "editor") return; - const clientWidth = main.dom.body.clientWidth, - clientHeight = main.dom.body.clientHeight; - const canvasWidth = core.__PIXELS__; + const clientWidth = main.dom.body.clientWidth, + clientHeight = main.dom.body.clientHeight; + const canvasWidth = core.__PIXELS__; - const isVertical = clientHeight > clientWidth; - core.domStyle.isVertical = isVertical; + const isVertical = clientHeight > clientWidth; + core.domStyle.isVertical = isVertical; - const totalWidth = isVertical ? - GAMEVIEW_WIDTH_VERTICAL / 3 : - GAMEVIEW_WIDTH / 3, - totalHeight = isVertical ? - GAMEVIEW_HEIGHT_VERTICAL / 3 : - GAMEVIEW_HEIGHT / 3; + const totalWidth = isVertical + ? GAMEVIEW_WIDTH_VERTICAL / 3 + : GAMEVIEW_WIDTH / 3, + totalHeight = isVertical + ? GAMEVIEW_HEIGHT_VERTICAL / 3 + : GAMEVIEW_HEIGHT / 3; - const maxRatio = Math.min( - clientWidth / totalWidth, - clientHeight / totalHeight - ); + const maxRatio = Math.min( + clientWidth / totalWidth, + clientHeight / totalHeight + ); - core.domStyle.availableScale = []; - [1, 1.25, 1.5, 1.75, 2].forEach(function (v) { - if (maxRatio >= v) { - core.domStyle.availableScale.push(v); - } - }); + core.domStyle.availableScale = []; + [1, 1.25, 1.5, 1.75, 2].forEach(function (v) { + if (maxRatio >= v) { + core.domStyle.availableScale.push(v); + } + }); - if (core.domStyle.availableScale.indexOf(core.domStyle.scale) < 0) { - core.domStyle.scale = Math.min(1, maxRatio); - } else if ( - core.getLocalStorage("scale") == null && - core.domStyle.availableScale.length >= 2 - ) { - core.domStyle.scale = - core.domStyle.availableScale[core.domStyle.availableScale.length - 2]; - core.setLocalStorage("scale", core.domStyle.scale); - } + if (core.domStyle.availableScale.indexOf(core.domStyle.scale) < 0) { + core.domStyle.scale = Math.min(1, maxRatio); + } else if ( + core.getLocalStorage("scale") == null && + core.domStyle.availableScale.length >= 2 + ) { + core.domStyle.scale = + core.domStyle.availableScale[core.domStyle.availableScale.length - 2]; + core.setLocalStorage("scale", core.domStyle.scale); + } - const totalWidthScaled = totalWidth * core.domStyle.scale, - totalHeightScaled = totalHeight * core.domStyle.scale; + const totalWidthScaled = totalWidth * core.domStyle.scale, + totalHeightScaled = totalHeight * core.domStyle.scale; - const gameDrawBox = isVertical ? - { - left: BORDER_WIDTH / 3, - top: BAR_HEIGHT_VERTICAL / 3 + BORDER_HEIGHT / 3, - } : - { left: BAR_WIDTH / 3 + BORDER_WIDTH / 3, top: BORDER_HEIGHT / 3 }; + const gameDrawBox = isVertical + ? { + left: BORDER_WIDTH / 3, + top: BAR_HEIGHT_VERTICAL / 3 + BORDER_HEIGHT / 3, + } + : { left: BAR_WIDTH / 3 + BORDER_WIDTH / 3, top: BORDER_HEIGHT / 3 }; - const obj = { - clientWidth: clientWidth, - clientHeight: clientHeight, - canvasWidth: canvasWidth, - totalWidth: totalWidthScaled, - totalHeight: totalHeightScaled, - gameDrawBox: gameDrawBox, - globalAttribute: core.status.globalAttribute || core.initStatus.globalAttribute, - }; + const obj = { + clientWidth: clientWidth, + clientHeight: clientHeight, + canvasWidth: canvasWidth, + totalWidth: totalWidthScaled, + totalHeight: totalHeightScaled, + gameDrawBox: gameDrawBox, + globalAttribute: + core.status.globalAttribute || core.initStatus.globalAttribute, + }; - _resize_gameGroup(obj); - _resize_canvas(obj); + _resize_gameGroup(obj); + _resize_canvas(obj); - if (core.status.automaticRoute == null) core.status.automaticRoute = {}; - core.updateStatusBar(); - if (main.dom.CGUI && main.dom.CGUI.style.display === "block") - core.ui.CG.update(); - if (main.dom.music && main.dom.music.style.display === "block") - core.ui.music.update(); - if (main.dom.cgText && main.dom.cgText.style.display === "block") - core.ui.cgText.update(); - if (main.dom.logcanvas && main.dom.logcanvas.style.display === "block") - core.ui.cgText.update(); - }; + if (core.status.automaticRoute == null) core.status.automaticRoute = {}; + core.updateStatusBar(); + if (main.dom.CGUI && main.dom.CGUI.style.display === "block") + core.ui.CG.update(); + if (main.dom.music && main.dom.music.style.display === "block") + core.ui.music.update(); + if (main.dom.cgText && main.dom.cgText.style.display === "block") + core.ui.cgText.update(); + if (main.dom.logcanvas && main.dom.logcanvas.style.display === "block") + core.ui.cgText.update(); + }; - class StatusBar { - constructor() { - //道具栏列表 - this.itemMx = [ - //空位用‘none’填充,当前ui至多4列6行 - ["book", "wand", "none", "fly"], - ["cross", "superPotion", "pickaxe"], - ["bomb", "centerFly", "upFly"], - ["none", "none", "none"], - ["downFly", "knife", "snow"], - ["bigKey", "earthquake", "coin"], - ]; - } - //初始化内容(工具栏/录像操作执行函数) - init() { - this.toolbarAction = [ - [ - main.core.openKeyBoard, - main.core.openQuickShop, - core.openToolbox, - core.doSL, - ], - [main.core.openSettings, main.core.save, main.core.load, core.doSL], - ]; - this.replayAction = [ - [core.triggerReplay, core.stopReplay, core.rewindReplay], - [core.speedDownReplay, core.speedUpReplay, core.saveReplay], - ]; - } - //更新 - update() { - this._update_background(); //更新背景 - this._update_props(); //更新属性 - //this._update_items(); //更新道具 - //this._update_equips(); //更新装备 - //this._update_keys(); //更新钥匙 - //this._update_infoWindow(); //更新道具说明 - this._update_toolBox(); //更新工具栏 - this._redrawMap(); - } - _redrawMap() { - if (core.domStyle.isVertical) { - core.clearMap( - uictx, - MAP_BLOCK_LEFT_VERTICAL, - MAP_BLOCK_TOP_VERTICAL, - 340, - 360 - ); - this._update_map(); - uictx.globalAlpha = globalAlphafloor / 100; - core.drawImage( - uictx, - "green.webp", - MAP_BLOCK_LEFT_VERTICAL + 125, - MAP_BLOCK_TOP_VERTICAL + 170 - ); - uictx.globalAlpha = 1; - } else { - core.clearMap(uictx, MAP_BLOCK_LEFT, MAP_BLOCK_TOP, 340, 360); - this._update_map(); - uictx.globalAlpha = globalAlphafloor / 100; - core.drawImage( - uictx, - "green.webp", - MAP_BLOCK_LEFT + 150, - MAP_BLOCK_TOP + 170 - ); - uictx.globalAlpha = 1; - } - } - //更新背景 - _update_background() { - if (core.domStyle.isVertical) { - bgctx.canvas.width = GAMEVIEW_WIDTH_VERTICAL; - bgctx.canvas.height = GAMEVIEW_HEIGHT_VERTICAL; - uictx.canvas.width = GAMEVIEW_WIDTH_VERTICAL; - uictx.canvas.height = GAMEVIEW_HEIGHT_VERTICAL; + class StatusBar { + constructor() { + //道具栏列表 + this.itemMx = [ + //空位用‘none’填充,当前ui至多4列6行 + ["book", "wand", "none", "fly"], + ["cross", "superPotion", "pickaxe"], + ["bomb", "centerFly", "upFly"], + ["none", "none", "none"], + ["downFly", "knife", "snow"], + ["bigKey", "earthquake", "coin"], + ]; + } + //初始化内容(工具栏/录像操作执行函数) + init() { + this.toolbarAction = [ + [ + main.core.openKeyBoard, + main.core.openQuickShop, + core.openToolbox, + core.doSL, + ], + [main.core.openSettings, main.core.save, main.core.load, core.doSL], + ]; + this.replayAction = [ + [core.triggerReplay, core.stopReplay, core.rewindReplay], + [core.speedDownReplay, core.speedUpReplay, core.saveReplay], + ]; + } + //更新 + update() { + this._update_background(); //更新背景 + this._update_props(); //更新属性 + //this._update_items(); //更新道具 + //this._update_equips(); //更新装备 + //this._update_keys(); //更新钥匙 + //this._update_infoWindow(); //更新道具说明 + this._update_toolBox(); //更新工具栏 + this._redrawMap(); + } + _redrawMap() { + if (core.domStyle.isVertical) { + core.clearMap( + uictx, + MAP_BLOCK_LEFT_VERTICAL, + MAP_BLOCK_TOP_VERTICAL, + 340, + 360 + ); + this._update_map(); + uictx.globalAlpha = globalAlphafloor / 100; + core.drawImage( + uictx, + "green.webp", + MAP_BLOCK_LEFT_VERTICAL + 125, + MAP_BLOCK_TOP_VERTICAL + 170 + ); + uictx.globalAlpha = 1; + } else { + core.clearMap(uictx, MAP_BLOCK_LEFT, MAP_BLOCK_TOP, 340, 360); + this._update_map(); + uictx.globalAlpha = globalAlphafloor / 100; + core.drawImage( + uictx, + "green.webp", + MAP_BLOCK_LEFT + 150, + MAP_BLOCK_TOP + 170 + ); + uictx.globalAlpha = 1; + } + } + //更新背景 + _update_background() { + if (core.domStyle.isVertical) { + bgctx.canvas.width = GAMEVIEW_WIDTH_VERTICAL; + bgctx.canvas.height = GAMEVIEW_HEIGHT_VERTICAL; + uictx.canvas.width = GAMEVIEW_WIDTH_VERTICAL; + uictx.canvas.height = GAMEVIEW_HEIGHT_VERTICAL; - const bg = core.material.images.images["status.webp"]; //竖屏背景(上) - bgctx.drawImage( - bg, - 0, - 0, - GAMEVIEW_WIDTH_VERTICAL, - BAR_HEIGHT_VERTICAL - ); - const bg2 = core.material.images.images["status.webp"]; //竖屏背景(下) - bgctx.drawImage( - bg2, - 0, - BAR_HEIGHT_VERTICAL + GAMEVIEW_WIDTH_VERTICAL, - GAMEVIEW_WIDTH_VERTICAL, - BAR_HEIGHT_VERTICAL - ); - bgctx.globalAlpha = globalAlpha; - bgctx.globalAlpha = 1; - core.setTextAlign("outerUI", "center"); - } else { - bgctx.canvas.width = GAMEVIEW_WIDTH; - bgctx.canvas.height = GAMEVIEW_HEIGHT; - uictx.canvas.width = GAMEVIEW_WIDTH; - uictx.canvas.height = GAMEVIEW_HEIGHT; + const bg = core.material.images.images["status.webp"]; //竖屏背景(上) + bgctx.drawImage( + bg, + 0, + 0, + GAMEVIEW_WIDTH_VERTICAL, + BAR_HEIGHT_VERTICAL + ); + const bg2 = core.material.images.images["status.webp"]; //竖屏背景(下) + bgctx.drawImage( + bg2, + 0, + BAR_HEIGHT_VERTICAL + GAMEVIEW_WIDTH_VERTICAL, + GAMEVIEW_WIDTH_VERTICAL, + BAR_HEIGHT_VERTICAL + ); + bgctx.globalAlpha = globalAlpha; + bgctx.globalAlpha = 1; + core.setTextAlign("outerUI", "center"); + } else { + bgctx.canvas.width = GAMEVIEW_WIDTH; + bgctx.canvas.height = GAMEVIEW_HEIGHT; + uictx.canvas.width = GAMEVIEW_WIDTH; + uictx.canvas.height = GAMEVIEW_HEIGHT; - const bg = core.material.images.images["status.webp"]; //横屏背景(左) - bgctx.drawImage(bg, 0, 0, BAR_WIDTH, GAMEVIEW_HEIGHT); - const bg2 = core.material.images.images["status.webp"]; //横屏背景(右) - bgctx.drawImage( - bg2, - BAR_WIDTH + GAMEVIEW_HEIGHT, - 0, - BAR_WIDTH, - GAMEVIEW_HEIGHT - ); - bgctx.globalAlpha = globalAlpha; + const bg = core.material.images.images["status.webp"]; //横屏背景(左) + bgctx.drawImage(bg, 0, 0, BAR_WIDTH, GAMEVIEW_HEIGHT); + const bg2 = core.material.images.images["status.webp"]; //横屏背景(右) + bgctx.drawImage( + bg2, + BAR_WIDTH + GAMEVIEW_HEIGHT, + 0, + BAR_WIDTH, + GAMEVIEW_HEIGHT + ); + bgctx.globalAlpha = globalAlpha; - bgctx.globalAlpha = 1; - core.setTextAlign("outerUI", "center"); - } - } - // 更新属性 - _update_props(updatedFloorTitle) { - if (!updatedFloorTitle && core.status.floorId) { - updatedFloorTitle = core.status.maps[core.status.floorId].title; - } - const statusList = ["hp", "atk", "def", "money"]; //属性列表,图标在函数复写core.statusBar.icons中声明,数字为project\materials\icons.png中的图标序号(可使用便捷ps追加,第一个序号为0) - const drawStatusList = (baseX, baseY) => { - let curh = baseY; - core.setTextAlign("outerUI", "right"); - statusList.forEach((item) => { - // 绘制图标 - core.drawIcon( - "outerUI", - item, - baseX - 95 * 3, - curh - 18 * 3, - 22 * 3, - 22 * 3 - ); + bgctx.globalAlpha = 1; + core.setTextAlign("outerUI", "center"); + } + } + // 更新属性 + _update_props(updatedFloorTitle) { + if (!updatedFloorTitle && core.status.floorId) { + updatedFloorTitle = core.status.maps[core.status.floorId].title; + } + const statusList = ["hp", "atk", "def", "money"]; //属性列表,图标在函数复写core.statusBar.icons中声明,数字为project\materials\icons.png中的图标序号(可使用便捷ps追加,第一个序号为0) + const drawStatusList = (baseX, baseY) => { + let curh = baseY; + core.setTextAlign("outerUI", "right"); + statusList.forEach((item) => { + // 绘制图标 + core.drawIcon( + "outerUI", + item, + baseX - 95 * 3, + curh - 18 * 3, + 22 * 3, + 22 * 3 + ); - // 四舍五入 - core.status.hero[item] = Math.round(core.status.hero[item]); - // 大数据格式化 - core.fillBoldText1( - "outerUI", - core.getRealStatus(item), - baseX, - curh, - TEXT_COLOR, - "#000000", - 6 - ); - curh += 24 * 3; - if (curh > 130 * 3 && core.domStyle.isVertical) { - curh = 24 * 3; - baseX += 105 * 3; - } - }); - core.setTextAlign("outerUI", "center"); - }; - if (core.domStyle.isVertical) { - core.clearMap("outerUI", 10 * 3, 0, 210 * 3, 120 * 3); - core.setFont("outerUI", "bold 42px Verdana"); - if (updatedFloorTitle) { - core.fillBoldText1( - "outerUI", - updatedFloorTitle, - 60 * 3, - 22 * 3, - TEXT_COLOR, - "#000000", - 6 - ); - } - //drawStatusList(96 * 3, 46 * 3); - //core.drawImage("outerUI", "lane1.png", 0, 0) - core.drawImage("outerUI", "cao.webp", 0, 0); - } else { - core.clearMap("outerUI", 10 * 3, 40 * 3, 105 * 3, 250 * 3); - core.setFont("outerUI", "bold 48px Verdana"); - if (updatedFloorTitle) { - core.fillBoldText1( - "outerUI", - updatedFloorTitle, - 62 * 3, - 41 * 3, - TEXT_COLOR, - "#000000", - 6 - ); - } - //drawStatusList(110 * 3, 93 * 3); - //core.drawImage("outerUI", "lane1.png", 0, 30) - core.drawImage( - "outerUI", - "cao.webp", - 0, - 0, - 400, - 350, - 0, - 30, - 360, - 315 - ); - } - } - _update_items() { - //更新道具栏 - const drawItemMx = (drawFn) => { - for (let i = 0; i < this.itemMx.length; i++) { - for (let j = 0; j < this.itemMx[i].length; j++) { - var item = this.itemMx[i][j]; - drawFn(i, j, item); - } - } - }; - const drawItem = (item, posx, posy) => { - const icon = core.material.icons.items[item], - image = core.material.images.items; - core.drawImage( - "outerUI", - image, - 0, - 32 * icon, - 32, - 32, - posx, - posy, - 30 * 3, - 30 * 3 - ); - const cnt = core.itemCount(item); - if ( - (core.items.items[item].cls === "tools" && cnt > 1) || - FORCE_COUNTABLE_ITEMS.includes(item) - ) { - core.fillText( - "outerUI", - cnt, - posx + 25 * 3, - posy + 28 * 3, - "#FFFFFF", - "bold 36px Verdana" - ); - } - }; - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - ITEM_BOX_LEFT_VERTICAL, - ITEM_BOX_TOP_VERTICAL, - 185 * 3, - 125 * 3 - ); + // 四舍五入 + core.status.hero[item] = Math.round(core.status.hero[item]); + // 大数据格式化 + core.fillBoldText1( + "outerUI", + core.getRealStatus(item), + baseX, + curh, + TEXT_COLOR, + "#000000", + 6 + ); + curh += 24 * 3; + if (curh > 130 * 3 && core.domStyle.isVertical) { + curh = 24 * 3; + baseX += 105 * 3; + } + }); + core.setTextAlign("outerUI", "center"); + }; + if (core.domStyle.isVertical) { + core.clearMap("outerUI", 10 * 3, 0, 210 * 3, 120 * 3); + core.setFont("outerUI", "bold 42px Verdana"); + if (updatedFloorTitle) { + core.fillBoldText1( + "outerUI", + updatedFloorTitle, + 60 * 3, + 22 * 3, + TEXT_COLOR, + "#000000", + 6 + ); + } + //drawStatusList(96 * 3, 46 * 3); + //core.drawImage("outerUI", "lane1.png", 0, 0) + core.drawImage("outerUI", "cao.webp", 0, 0); + } else { + core.clearMap("outerUI", 10 * 3, 40 * 3, 105 * 3, 250 * 3); + core.setFont("outerUI", "bold 48px Verdana"); + if (updatedFloorTitle) { + core.fillBoldText1( + "outerUI", + updatedFloorTitle, + 62 * 3, + 41 * 3, + TEXT_COLOR, + "#000000", + 6 + ); + } + //drawStatusList(110 * 3, 93 * 3); + //core.drawImage("outerUI", "lane1.png", 0, 30) + core.drawImage( + "outerUI", + "cao.webp", + 0, + 0, + 400, + 350, + 0, + 30, + 360, + 315 + ); + } + } + _update_items() { + //更新道具栏 + const drawItemMx = (drawFn) => { + for (let i = 0; i < this.itemMx.length; i++) { + for (let j = 0; j < this.itemMx[i].length; j++) { + var item = this.itemMx[i][j]; + drawFn(i, j, item); + } + } + }; + const drawItem = (item, posx, posy) => { + const icon = core.material.icons.items[item], + image = core.material.images.items; + core.drawImage( + "outerUI", + image, + 0, + 32 * icon, + 32, + 32, + posx, + posy, + 30 * 3, + 30 * 3 + ); + const cnt = core.itemCount(item); + if ( + (core.items.items[item].cls === "tools" && cnt > 1) || + FORCE_COUNTABLE_ITEMS.includes(item) + ) { + core.fillText( + "outerUI", + cnt, + posx + 25 * 3, + posy + 28 * 3, + "#FFFFFF", + "bold 36px Verdana" + ); + } + }; + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + ITEM_BOX_LEFT_VERTICAL, + ITEM_BOX_TOP_VERTICAL, + 185 * 3, + 125 * 3 + ); - drawItemMx((i, j, item) => { - if (core.hasItem(item)) { - const posx = ITEM_BOX_LEFT_VERTICAL + i * 30 * 3, - posy = ITEM_BOX_TOP_VERTICAL + j * 31 * 3; - drawItem(item, posx, posy); - } - }); - } else { - core.clearMap( - "outerUI", - ITEM_BOX_LEFT, - ITEM_BOX_TOP, - 125 * 3, - 185 * 3 - ); + drawItemMx((i, j, item) => { + if (core.hasItem(item)) { + const posx = ITEM_BOX_LEFT_VERTICAL + i * 30 * 3, + posy = ITEM_BOX_TOP_VERTICAL + j * 31 * 3; + drawItem(item, posx, posy); + } + }); + } else { + core.clearMap( + "outerUI", + ITEM_BOX_LEFT, + ITEM_BOX_TOP, + 125 * 3, + 185 * 3 + ); - drawItemMx((i, j, item) => { - if (core.hasItem(item)) { - const posx = ITEM_BOX_LEFT + j * 30 * 3, - posy = ITEM_BOX_TOP + i * 31 * 3; - drawItem(item, posx, posy); - } - }); - } - } + drawItemMx((i, j, item) => { + if (core.hasItem(item)) { + const posx = ITEM_BOX_LEFT + j * 30 * 3, + posy = ITEM_BOX_TOP + i * 31 * 3; + drawItem(item, posx, posy); + } + }); + } + } - _update_map(floorId = core.status.floorId) { - const x = core.domStyle.isVertical ? - MAP_BLOCK_LEFT_VERTICAL : - MAP_BLOCK_LEFT; - const y = core.domStyle.isVertical ? - MAP_BLOCK_TOP_VERTICAL : - MAP_BLOCK_TOP; + _update_map(floorId = core.status.floorId) { + const x = core.domStyle.isVertical + ? MAP_BLOCK_LEFT_VERTICAL + : MAP_BLOCK_LEFT; + const y = core.domStyle.isVertical + ? MAP_BLOCK_TOP_VERTICAL + : MAP_BLOCK_TOP; - if (!floorId) return; - const info = core.plugin.getMapDrawInfo(floorId, Infinity, true); - core.setTextAlign("outerUI", "center"); + if (!floorId) return; + const info = core.plugin.getMapDrawInfo(floorId, Infinity, true); + core.setTextAlign("outerUI", "center"); - core.plugin.drawSmallMap(uictx, info, floorId, x, y, 300, 300); - } + core.plugin.drawSmallMap(uictx, info, floorId, x, y, 300, 300); + } - _update_equips() { - return; - core.setFont("outerUI", "bold 48px Verdana"); - const drawEquip = (baseX, baseY, id, color, back) => { - if (!id) - core.fillText( - "outerUI", - back, - baseX + 20 * 3, - baseY + 22 * 3, - color - ); - else { - var icon = core.material.icons.items[id]; - core.drawImage( - "outerUI", - core.material.images.items, - 0, - 32 * icon, - 32, - 32, - baseX + 5 * 3, - baseY, - 32 * 3, - 32 * 3 - ); - } - }; - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - EQUIP_BLOCK_LEFT_VERTICAL, - EQUIP_BLOCK_TOP_VERTICAL, - 90 * 3, - 130 * 3 - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL, - EQUIP_BLOCK_TOP_VERTICAL, - core.getEquip(0), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, - EQUIP_BLOCK_TOP_VERTICAL, - core.getEquip(1), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL, - EQUIP_BLOCK_TOP_VERTICAL + 45 * 3, - core.getEquip(2), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, - EQUIP_BLOCK_TOP_VERTICAL + 45 * 3, - core.getEquip(3), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL, - EQUIP_BLOCK_TOP_VERTICAL + 90 * 3, - core.getEquip(4), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, - EQUIP_BLOCK_TOP_VERTICAL + 90 * 3, - core.getEquip(5), - "#D1CEFF", - "无" - ); - } else { - core.clearMap( - "outerUI", - EQUIP_BLOCK_LEFT, - EQUIP_BLOCK_TOP, - 130 * 3, - 95 * 3 - ); - drawEquip( - EQUIP_BLOCK_LEFT, - EQUIP_BLOCK_TOP, - core.getEquip(0), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT + 42 * 3, - EQUIP_BLOCK_TOP, - core.getEquip(1), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT + 85 * 3, - EQUIP_BLOCK_TOP, - core.getEquip(2), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT, - EQUIP_BLOCK_TOP + 45 * 3, - core.getEquip(3), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT + 42 * 3, - EQUIP_BLOCK_TOP + 45 * 3, - core.getEquip(4), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT + 85 * 3, - EQUIP_BLOCK_TOP + 45 * 3, - core.getEquip(5), - "#D1CEFF", - "无" - ); - } - } - _update_keys() { - const drawKeyList = (baseX, baseY) => { - const todraw = [], - keyList = ["yellowKey", "blueKey", "redKey", "greenKey"]; - let total = 0; - keyList.forEach(function (key, i) { - todraw[i] = core.itemCount(key); - total += todraw[i]; - }); + _update_equips() { + return; + core.setFont("outerUI", "bold 48px Verdana"); + const drawEquip = (baseX, baseY, id, color, back) => { + if (!id) + core.fillText( + "outerUI", + back, + baseX + 20 * 3, + baseY + 22 * 3, + color + ); + else { + var icon = core.material.icons.items[id]; + core.drawImage( + "outerUI", + core.material.images.items, + 0, + 32 * icon, + 32, + 32, + baseX + 5 * 3, + baseY, + 32 * 3, + 32 * 3 + ); + } + }; + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + EQUIP_BLOCK_LEFT_VERTICAL, + EQUIP_BLOCK_TOP_VERTICAL, + 90 * 3, + 130 * 3 + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL, + EQUIP_BLOCK_TOP_VERTICAL, + core.getEquip(0), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, + EQUIP_BLOCK_TOP_VERTICAL, + core.getEquip(1), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL, + EQUIP_BLOCK_TOP_VERTICAL + 45 * 3, + core.getEquip(2), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, + EQUIP_BLOCK_TOP_VERTICAL + 45 * 3, + core.getEquip(3), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL, + EQUIP_BLOCK_TOP_VERTICAL + 90 * 3, + core.getEquip(4), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, + EQUIP_BLOCK_TOP_VERTICAL + 90 * 3, + core.getEquip(5), + "#D1CEFF", + "无" + ); + } else { + core.clearMap( + "outerUI", + EQUIP_BLOCK_LEFT, + EQUIP_BLOCK_TOP, + 130 * 3, + 95 * 3 + ); + drawEquip( + EQUIP_BLOCK_LEFT, + EQUIP_BLOCK_TOP, + core.getEquip(0), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT + 42 * 3, + EQUIP_BLOCK_TOP, + core.getEquip(1), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT + 85 * 3, + EQUIP_BLOCK_TOP, + core.getEquip(2), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT, + EQUIP_BLOCK_TOP + 45 * 3, + core.getEquip(3), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT + 42 * 3, + EQUIP_BLOCK_TOP + 45 * 3, + core.getEquip(4), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT + 85 * 3, + EQUIP_BLOCK_TOP + 45 * 3, + core.getEquip(5), + "#D1CEFF", + "无" + ); + } + } + _update_keys() { + const drawKeyList = (baseX, baseY) => { + const todraw = [], + keyList = ["yellowKey", "blueKey", "redKey", "greenKey"]; + let total = 0; + keyList.forEach(function (key, i) { + todraw[i] = core.itemCount(key); + total += todraw[i]; + }); - let dn = 3; - for (let i = 0; i <= dn; i++) { - let delta = i * 32 * 3; + let dn = 3; + for (let i = 0; i <= dn; i++) { + let delta = i * 32 * 3; - if (core.domStyle.isVertical) { - this.drawKey(keyList[i], baseX, baseY + delta); - } else { - this.drawKey(keyList[i], baseX + delta, baseY); - } + if (core.domStyle.isVertical) { + this.drawKey(keyList[i], baseX, baseY + delta); + } else { + this.drawKey(keyList[i], baseX + delta, baseY); + } - core.setFont("outerUI", "bold 48px Verdana"); - core.setTextAlign("outerUI", "left"); - if (core.domStyle.isVertical) { - core.fillText( - "outerUI", - todraw[i], - baseX + 20 * 3, - baseY + 14 * 3 + delta, - TEXT_COLOR - ); - } else { - core.fillText( - "outerUI", - todraw[i], - baseX + delta, - baseY + 32 * 3, - TEXT_COLOR - ); - } - } - }; - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - KEY_BLOCK_LEFT_VERTICAL, - KEY_BLOCK_TOP_VERTICAL, - 45 * 3, - 130 * 3 - ); - drawKeyList( - KEY_BLOCK_LEFT_VERTICAL + 3 * 3, - KEY_BLOCK_TOP_VERTICAL + 5 * 3 - ); - } else { - core.clearMap( - "outerUI", - KEY_BLOCK_LEFT, - KEY_BLOCK_TOP, - 130 * 3, - 45 * 3 - ); - drawKeyList(KEY_BLOCK_LEFT + 10 * 3, KEY_BLOCK_TOP); - } - } - drawKey(key, x, y) { - let sx = 0, - sy = 0; + core.setFont("outerUI", "bold 48px Verdana"); + core.setTextAlign("outerUI", "left"); + if (core.domStyle.isVertical) { + core.fillText( + "outerUI", + todraw[i], + baseX + 20 * 3, + baseY + 14 * 3 + delta, + TEXT_COLOR + ); + } else { + core.fillText( + "outerUI", + todraw[i], + baseX + delta, + baseY + 32 * 3, + TEXT_COLOR + ); + } + } + }; + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + KEY_BLOCK_LEFT_VERTICAL, + KEY_BLOCK_TOP_VERTICAL, + 45 * 3, + 130 * 3 + ); + drawKeyList( + KEY_BLOCK_LEFT_VERTICAL + 3 * 3, + KEY_BLOCK_TOP_VERTICAL + 5 * 3 + ); + } else { + core.clearMap( + "outerUI", + KEY_BLOCK_LEFT, + KEY_BLOCK_TOP, + 130 * 3, + 45 * 3 + ); + drawKeyList(KEY_BLOCK_LEFT + 10 * 3, KEY_BLOCK_TOP); + } + } + drawKey(key, x, y) { + let sx = 0, + sy = 0; - if (key == "yellowKey") sx += 13; - else if (key == "blueKey") sx += 26; - else if (key == "greenKey") sx += 39; + if (key == "yellowKey") sx += 13; + else if (key == "blueKey") sx += 26; + else if (key == "greenKey") sx += 39; - core.drawImage( - "outerUI", - "maba.webp", - sx, - sy, - 13, - 26, - x, - y, - 13 * 3, - 26 * 3 - ); - } - _update_infoWindow() { - const itemId = this.selectedItem; - let text = ""; - if (this.selectedItem) { - text = core.replaceText(core.material.items[itemId]?.text); - if (text[0] == "," || text[0] == ",") text = text.substring(1); - } - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - INFO_BLOCK_LEFT_VERTICAL, - INFO_BLOCK_TOP_VERTICAL, - 300 * 3, - 120 * 3 - ); + core.drawImage( + "outerUI", + "maba.webp", + sx, + sy, + 13, + 26, + x, + y, + 13 * 3, + 26 * 3 + ); + } + _update_infoWindow() { + const itemId = this.selectedItem; + let text = ""; + if (this.selectedItem) { + text = core.replaceText(core.material.items[itemId]?.text); + if (text[0] == "," || text[0] == ",") text = text.substring(1); + } + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + INFO_BLOCK_LEFT_VERTICAL, + INFO_BLOCK_TOP_VERTICAL, + 300 * 3, + 120 * 3 + ); - if (this.selectedItem) { - const icon = core.material.icons.items[itemId]; - core.setTextAlign("outerUI", "left"); - core.fillText( - "outerUI", - core.material.items[itemId].name, - INFO_BLOCK_LEFT_VERTICAL + 50 * 3, - INFO_BLOCK_TOP_VERTICAL + 27 * 3, - "#D1CEFF" - ); - core.drawImage( - "outerUI", - core.material.images.items, - 0, - 32 * icon, - 32, - 32, - INFO_BLOCK_LEFT_VERTICAL + 10 * 3, - INFO_BLOCK_TOP_VERTICAL + 8 * 3, - 32 * 3, - 32 * 3 - ); - core.ui.drawTextContent("outerUI", text, { - left: INFO_BLOCK_LEFT_VERTICAL + 10 * 3, - top: INFO_BLOCK_TOP_VERTICAL + 40 * 3, - maxWidth: 275 * 3, - color: "#D1CEFF", - fontSize: 36, - }); - } - } else { - core.clearMap( - "outerUI", - INFO_BLOCK_LEFT, - INFO_BLOCK_TOP, - 115 * 3, - 230 * 3 - ); + if (this.selectedItem) { + const icon = core.material.icons.items[itemId]; + core.setTextAlign("outerUI", "left"); + core.fillText( + "outerUI", + core.material.items[itemId].name, + INFO_BLOCK_LEFT_VERTICAL + 50 * 3, + INFO_BLOCK_TOP_VERTICAL + 27 * 3, + "#D1CEFF" + ); + core.drawImage( + "outerUI", + core.material.images.items, + 0, + 32 * icon, + 32, + 32, + INFO_BLOCK_LEFT_VERTICAL + 10 * 3, + INFO_BLOCK_TOP_VERTICAL + 8 * 3, + 32 * 3, + 32 * 3 + ); + core.ui.drawTextContent("outerUI", text, { + left: INFO_BLOCK_LEFT_VERTICAL + 10 * 3, + top: INFO_BLOCK_TOP_VERTICAL + 40 * 3, + maxWidth: 275 * 3, + color: "#D1CEFF", + fontSize: 36, + }); + } + } else { + core.clearMap( + "outerUI", + INFO_BLOCK_LEFT, + INFO_BLOCK_TOP, + 115 * 3, + 230 * 3 + ); - if (this.selectedItem) { - const icon = core.material.icons.items[itemId]; - core.setTextAlign("outerUI", "center"); - core.fillText( - "outerUI", - core.material.items[itemId].name, - INFO_BLOCK_LEFT + 60 * 3, - INFO_BLOCK_TOP + 25 * 3, - "#D1CEFF" - ); - core.drawImage( - "outerUI", - core.material.images.items, - 0, - 32 * icon, - 32, - 32, - INFO_BLOCK_LEFT + 45 * 3, - INFO_BLOCK_TOP + 30 * 3, - 32 * 3, - 32 * 3 - ); - core.ui.drawTextContent("outerUI", text, { - left: INFO_BLOCK_LEFT + 10 * 3, - top: INFO_BLOCK_TOP + 60 * 3, - maxWidth: 105 * 3, - color: "#D1CEFF", - fontSize: 36, - }); - } - } - } - showItemInfo(itemId) { - //展示道具说明 - this.selectedItem = itemId; - this._update_infoWindow(); - } - clearItemInfo() { - //清除道具说明 - this.selectedItem = null; - this._update_infoWindow(); - } - _update_toolBox() { - const tools = core.isReplaying() ? - [ - [core.status.replay.pausing ? "play" : "pause", "stop", "rewind"], - ["speedDown", "speedUp", "save"], - ] : - [ - ["keyboard", "shop", "pack", "T332"], - ["settings", "save", "load", "T331"], - ]; - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - TOOL_BOX_LEFT_VERTICAL, - TOOL_BOX_TOP_VERTICAL, - 115, - 130 - ); + if (this.selectedItem) { + const icon = core.material.icons.items[itemId]; + core.setTextAlign("outerUI", "center"); + core.fillText( + "outerUI", + core.material.items[itemId].name, + INFO_BLOCK_LEFT + 60 * 3, + INFO_BLOCK_TOP + 25 * 3, + "#D1CEFF" + ); + core.drawImage( + "outerUI", + core.material.images.items, + 0, + 32 * icon, + 32, + 32, + INFO_BLOCK_LEFT + 45 * 3, + INFO_BLOCK_TOP + 30 * 3, + 32 * 3, + 32 * 3 + ); + core.ui.drawTextContent("outerUI", text, { + left: INFO_BLOCK_LEFT + 10 * 3, + top: INFO_BLOCK_TOP + 60 * 3, + maxWidth: 105 * 3, + color: "#D1CEFF", + fontSize: 36, + }); + } + } + } + showItemInfo(itemId) { + //展示道具说明 + this.selectedItem = itemId; + this._update_infoWindow(); + } + clearItemInfo() { + //清除道具说明 + this.selectedItem = null; + this._update_infoWindow(); + } + _update_toolBox() { + const tools = core.isReplaying() + ? [ + [core.status.replay.pausing ? "play" : "pause", "stop", "rewind"], + ["speedDown", "speedUp", "save"], + ] + : [ + ["keyboard", "shop", "pack", "T332"], + ["settings", "save", "load", "T331"], + ]; + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + TOOL_BOX_LEFT_VERTICAL, + TOOL_BOX_TOP_VERTICAL, + 115, + 130 + ); - for (let i = 0; i < tools.length; i++) { - for (let j = 0; j < tools[i].length; j++) { - core.drawIcon( - "outerUI", - tools[i][j], - TOOL_BOX_LEFT_VERTICAL + i * 31 * 3, - TOOL_BOX_TOP_VERTICAL + j * 31 * 3, - 30 * 3, - 30 * 3 - ); - } - } - } else { - core.clearMap( - "outerUI", - TOOL_BOX_LEFT, - TOOL_BOX_TOP, - 130 * 3, - 80 * 3 - ); + for (let i = 0; i < tools.length; i++) { + for (let j = 0; j < tools[i].length; j++) { + core.drawIcon( + "outerUI", + tools[i][j], + TOOL_BOX_LEFT_VERTICAL + i * 31 * 3, + TOOL_BOX_TOP_VERTICAL + j * 31 * 3, + 30 * 3, + 30 * 3 + ); + } + } + } else { + core.clearMap( + "outerUI", + TOOL_BOX_LEFT, + TOOL_BOX_TOP, + 130 * 3, + 80 * 3 + ); - for (let i = 0; i < tools.length; i++) { - for (let j = 0; j < tools[i].length; j++) { - core.drawIcon( - "outerUI", - tools[i][j], - TOOL_BOX_LEFT + j * 31 * 3, - TOOL_BOX_TOP + i * 31 * 3, - 30 * 3, - 30 * 3 - ); - } - } - } - } - onclick(x, y) { - const makeBox = ([x, y], [w, h]) => { - return [ - [x, y], - [x + w, y + h], - ]; - }; - const gridify = ([x, y], [gw, gh]) => { - return [Math.floor(x / gw), Math.floor(y / gh)]; - }; - const useItem = (itemId) => { - if (!core.hasItem(itemId)) return; + for (let i = 0; i < tools.length; i++) { + for (let j = 0; j < tools[i].length; j++) { + core.drawIcon( + "outerUI", + tools[i][j], + TOOL_BOX_LEFT + j * 31 * 3, + TOOL_BOX_TOP + i * 31 * 3, + 30 * 3, + 30 * 3 + ); + } + } + } + } + onclick(x, y) { + const makeBox = ([x, y], [w, h]) => { + return [ + [x, y], + [x + w, y + h], + ]; + }; + const gridify = ([x, y], [gw, gh]) => { + return [Math.floor(x / gw), Math.floor(y / gh)]; + }; + const useItem = (itemId) => { + if (!core.hasItem(itemId)) return; - if (itemId != this.selectedItem) { - this.showItemInfo(itemId); - } else { - switch (itemId) { - case "centerFly": - core.ui._drawCenterFly(); - break; - case "book": - core.openBook(true); - break; - case "wand": - core.insertAction({ - type: "useItem", - id: itemId, - }); - break; - case "fly": - core.useItem(itemId); - break; - default: - core.useItem(itemId); - } - } - }; - const inRect = ([x, y], [ - [sx, sy], - [dx, dy] - ]) => { - return sx <= x && x <= dx && sy <= y && y <= dy; - }; - const relativeTo = ([x, y], [ax, ay]) => { - return [x - ax, y - ay]; - }; - const pos = [x, y]; - if (core.domStyle.isVertical) { - const itemBox = makeBox( - [ITEM_BOX_LEFT_VERTICAL, ITEM_BOX_TOP_VERTICAL], - [30 * 6 * 3, 31 * 4 * 3] - ); - if (inRect(pos, itemBox)) { - const [gx, gy] = gridify(relativeTo(pos, itemBox[0]), [ - 30 * 3, - 31 * 3, - ]); - const itemId = this.itemMx[gx][gy]; - if ( - (core.status.event.id == "viewMaps" || - core.status.event.id == "fly") && - itemId === "book" - ) - core.openBook(true); - if ( - core.isReplaying() || - core.status.lockControl || - core.isMoving() - ) - return; - useItem(itemId); - return; - } - const toolBox = makeBox( - [TOOL_BOX_LEFT_VERTICAL, TOOL_BOX_TOP_VERTICAL], - [31 * 2 * 3, 31 * 4 * 3] - ); - if (inRect(pos, toolBox)) { - const [col, row] = gridify(relativeTo(pos, toolBox[0]), [ - 31 * 3, - 31 * 3, - ]); - if (core.status.lockControl || core.isMoving()) return; - if (core.isReplaying()) { - this.replayAction[col][row].call(core); - } else if (core.isPlaying()) { - if (col === 0 && row === 3) { - core.doSL("autoSave", "load"); - } else if (col === 1 && row === 3) { - core.doSL("autoSave", "reload"); - } else { - this.toolbarAction[col][row].call(core, true); - } - } - return; - } - const mapBox = makeBox( - [MAP_BLOCK_LEFT_VERTICAL, MAP_BLOCK_TOP_VERTICAL], - [350, 350] - ); - if (inRect(pos, mapBox)) { - if ( - core.isReplaying() || - core.status.lockControl || - core.isMoving() - ) - return; - core.useItem("fly"); - return; - } - /*const equipBox = makeBox([EQUIP_BLOCK_LEFT_VERTICAL, EQUIP_BLOCK_TOP_VERTICAL], [90 * 3, 130 * 3]) + if (itemId != this.selectedItem) { + this.showItemInfo(itemId); + } else { + switch (itemId) { + case "centerFly": + core.ui._drawCenterFly(); + break; + case "book": + core.openBook(true); + break; + case "wand": + core.insertAction({ + type: "useItem", + id: itemId, + }); + break; + case "fly": + core.useItem(itemId); + break; + default: + core.useItem(itemId); + } + } + }; + const inRect = ([x, y], [[sx, sy], [dx, dy]]) => { + return sx <= x && x <= dx && sy <= y && y <= dy; + }; + const relativeTo = ([x, y], [ax, ay]) => { + return [x - ax, y - ay]; + }; + const pos = [x, y]; + if (core.domStyle.isVertical) { + const itemBox = makeBox( + [ITEM_BOX_LEFT_VERTICAL, ITEM_BOX_TOP_VERTICAL], + [30 * 6 * 3, 31 * 4 * 3] + ); + if (inRect(pos, itemBox)) { + const [gx, gy] = gridify(relativeTo(pos, itemBox[0]), [ + 30 * 3, + 31 * 3, + ]); + const itemId = this.itemMx[gx][gy]; + if ( + (core.status.event.id == "viewMaps" || + core.status.event.id == "fly") && + itemId === "book" + ) + core.openBook(true); + if ( + core.isReplaying() || + core.status.lockControl || + core.isMoving() + ) + return; + useItem(itemId); + return; + } + const toolBox = makeBox( + [TOOL_BOX_LEFT_VERTICAL, TOOL_BOX_TOP_VERTICAL], + [31 * 2 * 3, 31 * 4 * 3] + ); + if (inRect(pos, toolBox)) { + const [col, row] = gridify(relativeTo(pos, toolBox[0]), [ + 31 * 3, + 31 * 3, + ]); + if (core.status.lockControl || core.isMoving()) return; + if (core.isReplaying()) { + this.replayAction[col][row].call(core); + } else if (core.isPlaying()) { + if (col === 0 && row === 3) { + core.doSL("autoSave", "load"); + } else if (col === 1 && row === 3) { + core.doSL("autoSave", "reload"); + } else { + this.toolbarAction[col][row].call(core, true); + } + } + return; + } + const mapBox = makeBox( + [MAP_BLOCK_LEFT_VERTICAL, MAP_BLOCK_TOP_VERTICAL], + [350, 350] + ); + if (inRect(pos, mapBox)) { + if ( + core.isReplaying() || + core.status.lockControl || + core.isMoving() + ) + return; + core.useItem("fly"); + return; + } + /*const equipBox = makeBox([EQUIP_BLOCK_LEFT_VERTICAL, EQUIP_BLOCK_TOP_VERTICAL], [90 * 3, 130 * 3]) if (inRect(pos, equipBox)) { if (core.isReplaying() || core.status.lockControl || core.isMoving()) return; core.openEquipbox(true) return; }*/ - } else { - const mapBox = makeBox([MAP_BLOCK_LEFT, MAP_BLOCK_TOP], [350, 350]); - if (inRect(pos, mapBox)) { - if ( - core.isReplaying() || - core.status.lockControl || - core.isMoving() - ) - return; - core.useItem("fly"); - return; - } - /* + } else { + const mapBox = makeBox([MAP_BLOCK_LEFT, MAP_BLOCK_TOP], [350, 350]); + if (inRect(pos, mapBox)) { + if ( + core.isReplaying() || + core.status.lockControl || + core.isMoving() + ) + return; + core.useItem("fly"); + return; + } + /* const equipBox = makeBox([EQUIP_BLOCK_LEFT, EQUIP_BLOCK_TOP], [130, 95]) if (inRect(pos, equipBox)) { if (core.isReplaying() || core.status.lockControl || core.isMoving()) return; core.openEquipbox(true) return; }*/ - const itemBox = makeBox( - [ITEM_BOX_LEFT, ITEM_BOX_TOP], - [31 * 4 * 3, 30 * 6 * 3] - ); - if (inRect(pos, itemBox)) { - const [gx, gy] = gridify(relativeTo(pos, itemBox[0]), [ - 31 * 3, - 30 * 3, - ]); - const itemId = this.itemMx[gy][gx]; - if ( - (core.status.event.id == "viewMaps" || - core.status.event.id == "fly") && - itemId === "book" - ) - core.openBook(true); - if ( - core.isReplaying() || - core.status.lockControl || - core.isMoving() - ) - return; - useItem(itemId); - return; - } - const toolBox = makeBox( - [TOOL_BOX_LEFT, TOOL_BOX_TOP], - [31 * 4 * 3, 31 * 2 * 3] - ); - if (inRect(pos, toolBox)) { - const [row, col] = gridify(relativeTo(pos, toolBox[0]), [ - 31 * 3, - 31 * 3, - ]); - if (core.status.lockControl || core.isMoving()) return; - if (core.isReplaying()) { - this.replayAction[col][row].call(core); - } else if (core.isPlaying()) { - if (col === 0 && row === 3) { - core.doSL("autoSave", "load"); - } else if (col === 1 && row === 3) { - core.doSL("autoSave", "reload"); - } else { - this.toolbarAction[col][row].call(core, true); - } - } - return; - } - } - } - } + const itemBox = makeBox( + [ITEM_BOX_LEFT, ITEM_BOX_TOP], + [31 * 4 * 3, 30 * 6 * 3] + ); + if (inRect(pos, itemBox)) { + const [gx, gy] = gridify(relativeTo(pos, itemBox[0]), [ + 31 * 3, + 30 * 3, + ]); + const itemId = this.itemMx[gy][gx]; + if ( + (core.status.event.id == "viewMaps" || + core.status.event.id == "fly") && + itemId === "book" + ) + core.openBook(true); + if ( + core.isReplaying() || + core.status.lockControl || + core.isMoving() + ) + return; + useItem(itemId); + return; + } + const toolBox = makeBox( + [TOOL_BOX_LEFT, TOOL_BOX_TOP], + [31 * 4 * 3, 31 * 2 * 3] + ); + if (inRect(pos, toolBox)) { + const [row, col] = gridify(relativeTo(pos, toolBox[0]), [ + 31 * 3, + 31 * 3, + ]); + if (core.status.lockControl || core.isMoving()) return; + if (core.isReplaying()) { + this.replayAction[col][row].call(core); + } else if (core.isPlaying()) { + if (col === 0 && row === 3) { + core.doSL("autoSave", "load"); + } else if (col === 1 && row === 3) { + core.doSL("autoSave", "reload"); + } else { + this.toolbarAction[col][row].call(core, true); + } + } + return; + } + } + } + } - core.ui.statusBar = new StatusBar(); + core.ui.statusBar = new StatusBar(); - core.control.clearStatusBar = function () { - core.clearMap("outerUI"); - }; - // init() called in `afterLoadResources`. -}, + core.control.clearStatusBar = function () { + core.clearMap("outerUI"); + }; + // init() called in `afterLoadResources`. + }, "override": function () { core.statusBar.icons = { floor: 0, @@ -12485,2062 +12486,2079 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "小地图": function () { - // 在此增加新插件 - // ----- 不可自定义 杂七杂八的变量 - /** @type {{[x: string]: BFSResult}} */ - let mapCache = {}; // 地图缓存 - let drawCache = {}; // 绘制信息缓存 - let status = "none"; // 当前的绘制状态 - /** @type {{[x: string]: Sprite}} */ - let sprites = {}; // 当前所有的sprite - /** @type {{[x: string]: Sprite}} */ - let canDrag = {}; // 可以拖拽的sprite - /** @type {{[x: string]: Button}} */ - let areaSprite = {}; // 区域列表对应的sprite - let clicking = false; // 是否正在点击,用于拖拽判定 - let drawingMap = ""; // 正在绘制的中心楼层 - let nowScale = 0; // 当前绘制的放缩比例 - let lastTouch = {}; // 上一次的单点点击信息 - let lastLength = 0; // 手机端缩放时上一次的两指间距离 - let nowDepth = 0; // 当前的遍历深度 - let drawedThumbnail = {}; // 已经绘制过的缩略图 - let moved = false; // 鼠标按下后是否移动了 - let noBorder = false; // 是否是无边框拼接模式 - let lastScale = 0; // 上一次缩放,用于优化缩略图绘制 - let areaPage = 0; // 区域显示的当前页数 - let nowArea = 0; // 当前区域index - let selecting = ""; // 选择时当前正在选择的地图 + // 在此增加新插件 + // ----- 不可自定义 杂七杂八的变量 + /** @type {{[x: string]: BFSResult}} */ + let mapCache = {}; // 地图缓存 + let drawCache = {}; // 绘制信息缓存 + let status = "none"; // 当前的绘制状态 + /** @type {{[x: string]: Sprite}} */ + let sprites = {}; // 当前所有的sprite + /** @type {{[x: string]: Sprite}} */ + let canDrag = {}; // 可以拖拽的sprite + /** @type {{[x: string]: Button}} */ + let areaSprite = {}; // 区域列表对应的sprite + let clicking = false; // 是否正在点击,用于拖拽判定 + let drawingMap = ""; // 正在绘制的中心楼层 + let nowScale = 0; // 当前绘制的放缩比例 + let lastTouch = {}; // 上一次的单点点击信息 + let lastLength = 0; // 手机端缩放时上一次的两指间距离 + let nowDepth = 0; // 当前的遍历深度 + let drawedThumbnail = {}; // 已经绘制过的缩略图 + let moved = false; // 鼠标按下后是否移动了 + let noBorder = false; // 是否是无边框拼接模式 + let lastScale = 0; // 上一次缩放,用于优化缩略图绘制 + let areaPage = 0; // 区域显示的当前页数 + let nowArea = 0; // 当前区域index + let selecting = ""; // 选择时当前正在选择的地图 - // ---- 不可自定义,常量 - /** @type {Area} */ - let areas = []; // 区域信息 - const perPage = Math.floor((core._PY_ - 60) / 30); // 区域的每页显示数量 + // ---- 不可自定义,常量 + /** @type {Area} */ + let areas = []; // 区域信息 + const perPage = Math.floor((core._PY_ - 60) / 30); // 区域的每页显示数量 - // ---- 可自定义,默认的切换地图的图块id - const defaultChange = { - left: "leftPortal", // 左箭头 - up: "upPortal", // 上箭头 - right: "rightPortal", // 右箭头 - down: "downPortal", // 下箭头 - upFloor: "upFloor", // 上楼 - downFloor: "downFloor", // 下楼 - }; - // ---- 可自定义,默认数值 - const defaultValue = { - font: "Verdana", // 默认字体 - scale: 60, // 默认地图缩放比例 - depth: Infinity, // 默认的遍历深度 - }; + // ---- 可自定义,默认的切换地图的图块id + const defaultChange = { + left: "leftPortal", // 左箭头 + up: "upPortal", // 上箭头 + right: "rightPortal", // 右箭头 + down: "downPortal", // 下箭头 + upFloor: "upFloor", // 上楼 + downFloor: "downFloor", // 下楼 + }; + // ---- 可自定义,默认数值 + const defaultValue = { + font: "Verdana", // 默认字体 + scale: 60, // 默认地图缩放比例 + depth: Infinity, // 默认的遍历深度 + }; - // ---- 不可自定义,计算数据 - const dirData = { - up: [1, 0], - down: [-1, 0], - left: [0, 1], - right: [0, -1], - upFloor: [0, 0], - downFloor: [0, 0], - }; - let ignoreEnemies = (this.ignoreEnemies = []); + // ---- 不可自定义,计算数据 + const dirData = { + up: [1, 0], + down: [-1, 0], + left: [0, 1], + right: [0, -1], + upFloor: [0, 0], + downFloor: [0, 0], + }; + let ignoreEnemies = (this.ignoreEnemies = []); - let allChangeEntries = Object.entries(defaultChange); + let allChangeEntries = Object.entries(defaultChange); - this.setq = function (floorId) { - core.setFlag("任务地点", floorId); - }; + this.setq = function (floorId) { + core.setFlag("任务地点", floorId); + }; - const reset = core.events.resetGame; - this.bfs = function () { - areas = []; - // 获取所有分区,使用异步函数,保证不会卡顿 - // 原理是用bfs扫,将所有连在一起的地图合并成一个区域 - (async function () { - let all = core.floorIds.slice(); - const scanned = { - [all[0]]: true, - }; - while (all.length > 0) { - let now = all.shift(); - if (core.status.maps[now].deleted) continue; - if (!now) return; - await new Promise((res) => { - const result = core.plugin.bfsSearch(now, Infinity, true); - mapCache[`${now}_Infinity_false`] = result; - areas.push({ name: core.floors[now].areas, maps: result.order }); - for (const map of result.order) { - scanned[map] = true; - all = all.filter((v) => !result.order.includes(v)); - } - res("success"); - }).then(() => { - core.setFlag("areas", areas); - }); - } - })(); - }; - core.events.resetGame = function () { - reset.apply(core.events, arguments); - core.plugin.bfs(); - }; - /** - * 广度优先搜索搜索地图路径 - * @param {string} center 中心地图的id - * @param {number} depth 搜索深度 - * @param {boolean} noCache 是否不使用缓存 - * @returns {BFSResult} 格式:floorId_x_y_dir: floorId_x_y - */ - this.bfsSearch = function bfsSearch(center, depth, noCache) { - // 检查缓存 - const id = `${center}_${depth}_${noBorder}`; - if (mapCache[id] && !noCache) return mapCache[id]; - const used = { - [center]: true, - }; // 搜索过的楼层 - let queue = []; - let stack = [center]; // 当前栈 - let nowDepth = -1; - const mapOrder = [center]; // 遍历顺序,顺便还能记录遍历了哪些楼层 + const reset = core.events.resetGame; + this.bfs = function () { + areas = []; + // 获取所有分区,使用异步函数,保证不会卡顿 + // 原理是用bfs扫,将所有连在一起的地图合并成一个区域 + (async function () { + let all = core.floorIds.slice(); + const scanned = { + [all[0]]: true, + }; + while (all.length > 0) { + let now = all.shift(); + if (core.status.maps[now].deleted) continue; + if (!now) return; + await new Promise((res) => { + const result = core.plugin.bfsSearch(now, Infinity, true); + mapCache[`${now}_Infinity_false`] = result; + areas.push({ name: core.floors[now].areas, maps: result.order }); + for (const map of result.order) { + scanned[map] = true; + all = all.filter((v) => !result.order.includes(v)); + } + res("success"); + }).then(() => { + core.setFlag("areas", areas); + }); + } + })(); + }; + core.events.resetGame = function () { + reset.apply(core.events, arguments); + core.plugin.bfs(); + }; + /** + * 广度优先搜索搜索地图路径 + * @param {string} center 中心地图的id + * @param {number} depth 搜索深度 + * @param {boolean} noCache 是否不使用缓存 + * @returns {BFSResult} 格式:floorId_x_y_dir: floorId_x_y + */ + this.bfsSearch = function bfsSearch(center, depth, noCache) { + // 检查缓存 + const id = `${center}_${depth}_${noBorder}`; + if (mapCache[id] && !noCache) return mapCache[id]; + const used = { + [center]: true, + }; // 搜索过的楼层 + let queue = []; + let stack = [center]; // 当前栈 + let nowDepth = -1; + const mapOrder = [center]; // 遍历顺序,顺便还能记录遍历了哪些楼层 - const res = {}; // 输出结果,格式:floorId_x_y_dir: floorId_x_y - const enemies = {}; - const upOrDown = {}; - const mapdir = {}; - // 开始循环搜索 - while (nowDepth < depth && stack.length > 0) { - const now = stack.shift(); // 当前id - if (core.status.maps[now].deleted) continue; - mapdir[now] = mapdir[now] ?? []; - const blocks = core.getMapBlocksObj(now); // 获取当前地图的每点的事件 - enemies[now] = {}; - // 遍历,获取可以传送的点,只检测绿点事件,因此可用红点事件进行传送来实现分区功能 - for (const i in blocks) { - const block = blocks[i]; - // 整合漏怪检测,所以要检测怪物 - if (block.event.trigger === "battle") { - const id = block.event.id; - if (ignoreEnemies.includes(id)) continue; - else enemies[now][i] = block.event.id; - continue; - } - // 检测触发器是否为切换楼层,不是则直接跳过 - if (block.event.trigger !== "changeFloor") continue; - const dirEntries = allChangeEntries.find( - (v) => v[1] === block.event.id - ); - // 如果不是那六种传送门,直接忽略 - if (!dirEntries) continue; - const data = block.event.data; - const dir = dirEntries[0]; - const route = now + "_" + i.replace(",", "_") + "_" + dir; - const target = data.floorId + "_" + data.loc.join("_"); + const res = {}; // 输出结果,格式:floorId_x_y_dir: floorId_x_y + const enemies = {}; + const upOrDown = {}; + const mapdir = {}; + // 开始循环搜索 + while (nowDepth < depth && stack.length > 0) { + const now = stack.shift(); // 当前id + if (core.status.maps[now].deleted) continue; + mapdir[now] = mapdir[now] ?? []; + const blocks = core.getMapBlocksObj(now); // 获取当前地图的每点的事件 + enemies[now] = {}; + // 遍历,获取可以传送的点,只检测绿点事件,因此可用红点事件进行传送来实现分区功能 + for (const i in blocks) { + const block = blocks[i]; + // 整合漏怪检测,所以要检测怪物 + if (block.event.trigger === "battle") { + const id = block.event.id; + if (ignoreEnemies.includes(id)) continue; + else enemies[now][i] = block.event.id; + continue; + } + // 检测触发器是否为切换楼层,不是则直接跳过 + if (block.event.trigger !== "changeFloor") continue; + const dirEntries = allChangeEntries.find( + (v) => v[1] === block.event.id + ); + // 如果不是那六种传送门,直接忽略 + if (!dirEntries) continue; + const data = block.event.data; + const dir = dirEntries[0]; + const route = now + "_" + i.replace(",", "_") + "_" + dir; + const target = data.floorId + "_" + data.loc.join("_"); - mapdir[now].push(dir); - if (!used[data.floorId]) { - if (dir === "upFloor" || dir === "downFloor") { - upOrDown[now] = upOrDown[id] ?? []; - upOrDown[now].push(dir); - } + mapdir[now].push(dir); + if (!used[data.floorId]) { + if (dir === "upFloor" || dir === "downFloor") { + upOrDown[now] = upOrDown[id] ?? []; + upOrDown[now].push(dir); + } - queue.push(data.floorId); // 没有搜索过,则加入栈中 - mapOrder.push(data.floorId); - used[data.floorId] = true; - } - res[route] = target; - } - if (stack.length === 0) { - stack = queue; - queue = []; - nowDepth++; - } - if (stack.length === 0 && queue.length === 0) break; - } - return { res, order: mapOrder, enemies, upOrDown, mapdir }; - }; - /** - * 获取绘制信息 - * @param {string?} center 中心地图id - * @param {number?} depth 搜索深度 - * @param {boolean?} noCache 是否不使用缓存 - * @returns {MapDrawInfo} - */ - this.getMapDrawInfo = function ( - center = core.status.floorId, - depth = defaultValue.depth, - noCache = false - ) { - nowDepth = depth; - drawingMap = center; - const id = `${center}_${depth}_${noBorder}`; - // 检查缓存 - if (drawCache[id] && !noCache) return drawCache[id]; - const map = core.plugin.bfsSearch(center, depth, noCache); - mapCache[id] = map; - const res = getDrawInfo(map.res, center, map.order); - res.upOrDown = map.upOrDown; - res.mapdir = map.mapdir; - drawCache[id] = res; - return res; - }; - /** - * 提供地图的绘制信息 - * @param {{[x: string]: string}} map 要绘制的地图,格式:floorId_x_y_dir: floorId_x_y - * @param {string} center 中心地图的id - * @param {string[]} order 遍历顺序 - * @returns {MapDrawInfo} 地图的绘制信息 - */ + queue.push(data.floorId); // 没有搜索过,则加入栈中 + mapOrder.push(data.floorId); + used[data.floorId] = true; + } + res[route] = target; + } + if (stack.length === 0) { + stack = queue; + queue = []; + nowDepth++; + } + if (stack.length === 0 && queue.length === 0) break; + } + return { res, order: mapOrder, enemies, upOrDown, mapdir }; + }; + /** + * 获取绘制信息 + * @param {string?} center 中心地图id + * @param {number?} depth 搜索深度 + * @param {boolean?} noCache 是否不使用缓存 + * @returns {MapDrawInfo} + */ + this.getMapDrawInfo = function ( + center = core.status.floorId, + depth = defaultValue.depth, + noCache = false + ) { + nowDepth = depth; + drawingMap = center; + const id = `${center}_${depth}_${noBorder}`; + // 检查缓存 + if (drawCache[id] && !noCache) return drawCache[id]; + const map = core.plugin.bfsSearch(center, depth, noCache); + mapCache[id] = map; + const res = getDrawInfo(map.res, center, map.order); + res.upOrDown = map.upOrDown; + res.mapdir = map.mapdir; + drawCache[id] = res; + return res; + }; + /** + * 提供地图的绘制信息 + * @param {{[x: string]: string}} map 要绘制的地图,格式:floorId_x_y_dir: floorId_x_y + * @param {string} center 中心地图的id + * @param {string[]} order 遍历顺序 + * @returns {MapDrawInfo} 地图的绘制信息 + */ - function getDrawInfo(map, center, order) { - // 先根据地图id分类,从而确定每个地图连接哪些地图,同时方便处理 - const links = {}; - for (const i in map) { - const splitted = i.split("_"); - const id = splitted[0]; - if (!links[id]) links[id] = {}; - links[id][i] = map[i]; - } + function getDrawInfo(map, center, order) { + // 先根据地图id分类,从而确定每个地图连接哪些地图,同时方便处理 + const links = {}; + for (const i in map) { + const splitted = i.split("_"); + const id = splitted[0]; + if (!links[id]) links[id] = {}; + links[id][i] = map[i]; + } - // 分类完毕,然后根据连接点先计算出各个地图的坐标,然后再进行判断 - const centerFloor = core.status.maps[center]; - const visitedCenter = core.hasVisitedFloor(center); - const locs = { - // 格式:[中心x, 中心y, 宽, 高, 是否到达过] - [center]: [2, 2, 1, 1, visitedCenter], - }; - // 可以上楼下楼的地图 - const upOrDown = {}; - for (const id of order) { - const now = links[id]; - // 遍历每一个地图的连接情况 - for (const from in now) { - const to = now[from]; - // 先根据from to计算物理位置 - const fromData = from.split("_"), - toData = to.split("_"); - const dir = fromData[3]; - if (dir === "upFloor" || dir === "downFloor") continue; - if (!defaultChange[dir]) continue; - const v = dirData[dir][1], // 竖直数值 - h = dirData[dir][0], // 水平数值 - ha = Math.abs(h), - va = Math.abs(v); - const ff = id, // fromFloorId - tf = toData[0]; // toFloorId - const fromFloor = core.status.maps[ff], - toFloor = core.status.maps[tf]; - const fhw = Math.floor(fromFloor.width / 2), // fromFloorHalfWidth - fhh = Math.floor(fromFloor.height / 2), - thw = Math.floor(toFloor.width / 2), - thh = Math.floor(toFloor.height / 2); - const fLoc = locs[id] ?? [0, 0]; - if (!locs[ff]) continue; - let x, y; - if (locs && locs[tf]) { - x = locs[tf][0]; - y = locs[tf][1]; - } else { - // 计算坐标,公式可以通过画图推断出 - x = fLoc[0] - v; - y = fLoc[1] - h; - } - locs[tf] = locs[tf] ?? [x, y, 1, 1, core.hasVisitedFloor(tf)]; - } - } - // 获取地图绘制需要的长宽 - let width = 0, - height = 0; - let left, right, up, down; - for (const id in locs) { - const [x, y, w, h] = locs[id]; - if (left === void 0) { - left = right = x; - up = down = y; - } - left = Math.min(x - 1, left); - right = Math.max(x + 1, right); - up = Math.min(y - 1, up); - down = Math.max(y + 1, down); - } - width = right - left; - height = down - up; + // 分类完毕,然后根据连接点先计算出各个地图的坐标,然后再进行判断 + const centerFloor = core.status.maps[center]; + const visitedCenter = core.hasVisitedFloor(center); + const locs = { + // 格式:[中心x, 中心y, 宽, 高, 是否到达过] + [center]: [2, 2, 1, 1, visitedCenter], + }; + // 可以上楼下楼的地图 + const upOrDown = {}; + for (const id of order) { + const now = links[id]; + // 遍历每一个地图的连接情况 + for (const from in now) { + const to = now[from]; + // 先根据from to计算物理位置 + const fromData = from.split("_"), + toData = to.split("_"); + const dir = fromData[3]; + if (dir === "upFloor" || dir === "downFloor") continue; + if (!defaultChange[dir]) continue; + const v = dirData[dir][1], // 竖直数值 + h = dirData[dir][0], // 水平数值 + ha = Math.abs(h), + va = Math.abs(v); + const ff = id, // fromFloorId + tf = toData[0]; // toFloorId + const fromFloor = core.status.maps[ff], + toFloor = core.status.maps[tf]; + const fhw = Math.floor(fromFloor.width / 2), // fromFloorHalfWidth + fhh = Math.floor(fromFloor.height / 2), + thw = Math.floor(toFloor.width / 2), + thh = Math.floor(toFloor.height / 2); + const fLoc = locs[id] ?? [0, 0]; + if (!locs[ff]) continue; + let x, y; + if (locs && locs[tf]) { + x = locs[tf][0]; + y = locs[tf][1]; + } else { + // 计算坐标,公式可以通过画图推断出 + x = fLoc[0] - v; + y = fLoc[1] - h; + } + locs[tf] = locs[tf] ?? [x, y, 1, 1, core.hasVisitedFloor(tf)]; + } + } + // 获取地图绘制需要的长宽 + let width = 0, + height = 0; + let left, right, up, down; + for (const id in locs) { + const [x, y, w, h] = locs[id]; + if (left === void 0) { + left = right = x; + up = down = y; + } + left = Math.min(x - 1, left); + right = Math.max(x + 1, right); + up = Math.min(y - 1, up); + down = Math.max(y + 1, down); + } + width = right - left; + height = down - up; - return { locs, width, height, layer: upOrDown }; - } + return { locs, width, height, layer: upOrDown }; + } - function mapblock(mapdir) { - let mb = ""; - if (mapdir.includes("up")) mb += "u"; - if (mapdir.includes("down")) mb += "d"; - if (mapdir.includes("left")) mb += "l"; - if (mapdir.includes("right")) mb += "r"; - return mb ? mb + ".webp" : "null.webp"; - } - core.animateFrame.globalAlphaFloor = 0; - core.animateFrame.globalAlphaFloorStatus = 1; + function mapblock(mapdir) { + let mb = ""; + if (mapdir.includes("up")) mb += "u"; + if (mapdir.includes("down")) mb += "d"; + if (mapdir.includes("left")) mb += "l"; + if (mapdir.includes("right")) mb += "r"; + return mb ? mb + ".webp" : "null.webp"; + } + core.animateFrame.globalAlphaFloor = 0; + core.animateFrame.globalAlphaFloorStatus = 1; - const tesk = document.createElement("canvas"); - tesk.width = 300; - tesk.height = 300; - const teskctx = tesk.getContext("2d"); + const tesk = document.createElement("canvas"); + tesk.width = 300; + tesk.height = 300; + const teskctx = tesk.getContext("2d"); - let line = 50; - teskctx.strokeStyle = "green"; - teskctx.fillStyle = "green"; - let now = 0; - core.registerAnimationFrame("tesk", true, function (timestamp) { - if (timestamp - now > 1000 / 60) { - now = timestamp; - core.clearMap(teskctx); - teskctx.lineWidth = 150 - line; + let line = 50; + teskctx.strokeStyle = "green"; + teskctx.fillStyle = "green"; + let now = 0; + core.registerAnimationFrame("tesk", true, function (timestamp) { + if (timestamp - now > 1000 / 60) { + now = timestamp; + core.clearMap(teskctx); + teskctx.lineWidth = 150 - line; - if (line <= 150) { - teskctx.beginPath(); - teskctx.arc(150, 150, line, 0, Math.PI * 2); - line += 2; - teskctx.stroke(); - } else { - teskctx.beginPath(); - teskctx.arc(150, 150, line - 150, 0, Math.PI * 2); - line += 2; - teskctx.fill(); - if (line >= 250) line = 50; - } - } - }); + if (line <= 150) { + teskctx.beginPath(); + teskctx.arc(150, 150, line, 0, Math.PI * 2); + line += 2; + teskctx.stroke(); + } else { + teskctx.beginPath(); + teskctx.arc(150, 150, line - 150, 0, Math.PI * 2); + line += 2; + teskctx.fill(); + if (line >= 250) line = 50; + } + } + }); - /** - * 绘制小地图 - * @param {MapDrawInfo} info 地图绘制信息 - * @param {number} scale 地图的绘制比例 - */ - this.drawSmallMap = function ( - ctx, - info, - center, - sx, - sy, - sw, - sh, - scale = defaultValue.scale - ) { - core.clearMap(ctx, sx, sy, sw + 40, sh + 60); - if (core.domStyle.isVertical) { - sy += 50; - sx += 15; - } else { - sy += 60; - sx += 30; - } - core.fillRect(ctx, sx, sy, sw, sh, "#000"); - core.strokeRect(ctx, sx, sy, sw, sh, "#fff", 5); - core.setTextAlign("outerUI", "center"); - core.fillBoldText1( - ctx, - core.status.maps[center].areas, - sx + sw / 2, - sy - 10, - "#FFFFFF", - "#000000", - 6, - "bold 42px Verdana" - ); - const locs = info.locs; - for (const id in locs) { - const loc = locs[id]; - let color = "#000"; - if (!loc[4]) color = "#f0f"; - const [x, y, w, h] = loc.map((v) => typeof v === "number" && v * scale); - const fx = x + sx, - fy = y + sy; - const mapdir = info.mapdir[id]; - const img = mapblock(mapdir); - if (x < 0 || x > 4 * scale || y < 0 || y > 4 * scale) continue; - core.drawImage(ctx, img, 0, 0, 60, 60, fx, fy, w, h); - const layer = info.upOrDown[id]; - const min = Math.min(w, h); + /** + * 绘制小地图 + * @param {MapDrawInfo} info 地图绘制信息 + * @param {number} scale 地图的绘制比例 + */ + this.drawSmallMap = function ( + ctx, + info, + center, + sx, + sy, + sw, + sh, + scale = defaultValue.scale + ) { + core.clearMap(ctx, sx, sy, sw + 40, sh + 60); + if (core.domStyle.isVertical) { + sy += 50; + sx += 15; + } else { + sy += 60; + sx += 30; + } + core.fillRect(ctx, sx, sy, sw, sh, "#000"); + core.strokeRect(ctx, sx, sy, sw, sh, "#fff", 5); + core.setTextAlign("outerUI", "center"); + core.fillBoldText1( + ctx, + core.status.maps[center].areas, + sx + sw / 2, + sy - 10, + "#FFFFFF", + "#000000", + 6, + "bold 42px Verdana" + ); + const locs = info.locs; + for (const id in locs) { + const loc = locs[id]; + let color = "#000"; + if (!loc[4]) color = "#f0f"; + const [x, y, w, h] = loc.map((v) => typeof v === "number" && v * scale); + const fx = x + sx, + fy = y + sy; + const mapdir = info.mapdir[id]; + const img = mapblock(mapdir); + if (x < 0 || x > 4 * scale || y < 0 || y > 4 * scale) continue; + core.drawImage(ctx, img, 0, 0, 60, 60, fx, fy, w, h); + const layer = info.upOrDown[id]; + const min = Math.min(w, h); - - if (layer?.includes("upFloor")) - core.drawIcon( - ctx, - defaultChange.upFloor, - fx + min / 4, - fy + min / 4, - min / 2, - min / 2 - ); - if (layer?.includes("downFloor")) - core.drawIcon( - ctx, - defaultChange.downFloor, - fx + min / 4, - fy + min / 4, - min / 2, - min / 2 - ); - if (core.getFlag("任务地点") && core.getFlag("任务地点") === id) - ctx.drawImage(tesk, fx + min / 4, fy + min / 4, min / 2, min / 2); - if (id === core.status.floorId) core.drawImage(ctx, "hero.webp", - 0, - 0, - 32, - 19, fx + min / 4, fy + min * 5 / 16, 32, 19); - // 显示漏怪数量 - if (core.getFlag("showEnemy")) { - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - const c = drawingMap + "_" + nowDepth + "_" + noBorder; - const n = Object.keys(mapCache[c].enemies[id]).length; - color = "#fff"; - if (n > 10) color = "#fc3"; - if (n > 20) color = "#f22"; - ctx.shadowBlur = 0.6 * nowScale; - ctx.shadowColor = "#000"; - if (n > 0) - core.fillText( - ctx, - n, - fx + (w * 3) / 10, - fy + (h * 7) / 10, - color, - 22 + "px normal" - ); - ctx.shadowBlur = 0; - } - if (!core.hasVisitedFloor(id)) { - core.fillRect(ctx, fx, fy, w, h, "rgba(0,0,0,0.7)") - core.fillText(ctx, "?", fx + min / 2, fy + min * 3 / 4, "#FFFFFF", "bold 42px Verdana") - } - } - }; -}, + if (layer?.includes("upFloor")) + core.drawIcon( + ctx, + defaultChange.upFloor, + fx + min / 4, + fy + min / 4, + min / 2, + min / 2 + ); + if (layer?.includes("downFloor")) + core.drawIcon( + ctx, + defaultChange.downFloor, + fx + min / 4, + fy + min / 4, + min / 2, + min / 2 + ); + if (core.getFlag("任务地点") && core.getFlag("任务地点") === id) + ctx.drawImage(tesk, fx + min / 4, fy + min / 4, min / 2, min / 2); + if (id === core.status.floorId) + core.drawImage( + ctx, + "hero.webp", + 0, + 0, + 32, + 19, + fx + min / 4, + fy + (min * 5) / 16, + 32, + 19 + ); + // 显示漏怪数量 + if (core.getFlag("showEnemy")) { + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + const c = drawingMap + "_" + nowDepth + "_" + noBorder; + const n = Object.keys(mapCache[c].enemies[id]).length; + color = "#fff"; + if (n > 10) color = "#fc3"; + if (n > 20) color = "#f22"; + ctx.shadowBlur = 0.6 * nowScale; + ctx.shadowColor = "#000"; + if (n > 0) + core.fillText( + ctx, + n, + fx + (w * 3) / 10, + fy + (h * 7) / 10, + color, + 22 + "px normal" + ); + ctx.shadowBlur = 0; + } + if (!core.hasVisitedFloor(id)) { + core.fillRect(ctx, fx, fy, w, h, "rgba(0,0,0,0.7)"); + core.fillText( + ctx, + "?", + fx + min / 2, + fy + (min * 3) / 4, + "#FFFFFF", + "bold 42px Verdana" + ); + } + } + }; + }, "楼传": function () { - // 在此增加新插件 + // 在此增加新插件 - core.canMoveFloor = function () { - let canmove = false; - core.status.thisMap.blocks.forEach((block) => { - if ( - !block.disable && - (block.event.id == "upFloor" || block.event.id == "downFloor") - ) { - let automaticRoute = core.automaticRoute(block.x, block.y); - if (!core.flags.flyNearStair || automaticRoute.length > 0) { - let loc = automaticRoute.pop(); - loc = automaticRoute.pop(); - if (core.canMoveDirectly(loc?.x, loc?.y) >= 0 || !loc) { - canmove = true; - } - } - } - }); - return canmove; - }; - ui.prototype._drawViewMaps_drawHint = function () { - core.playSound("打开界面"); - }; + core.canMoveFloor = function () { + let canmove = false; + core.status.thisMap.blocks.forEach((block) => { + if ( + !block.disable && + (block.event.id == "upFloor" || block.event.id == "downFloor") + ) { + let automaticRoute = core.automaticRoute(block.x, block.y); + if (!core.flags.flyNearStair || automaticRoute.length > 0) { + let loc = automaticRoute.pop(); + loc = automaticRoute.pop(); + if (core.canMoveDirectly(loc?.x, loc?.y) >= 0 || !loc) { + canmove = true; + } + } + } + }); + return canmove; + }; + ui.prototype._drawViewMaps_drawHint = function () { + core.playSound("打开界面"); + }; - ////// 绘制浏览地图界面 ////// - ui.prototype._drawViewMaps = function (index, x, y) { - core.lockControl(); + ////// 绘制浏览地图界面 ////// + ui.prototype._drawViewMaps = function (index, x, y) { + core.lockControl(); - core.clearMap("data"); - core.status.event.id = "viewMaps"; - this.clearUI(); - //console.log(index) - if (index == null) index = core.floorIds.indexOf(core.status.floorId); - core.animateFrame.tip = null; - core.status.checkBlock.cache = {}; - let data = this._drawViewMaps_buildData(index, x, y); - core.drawWindowSkin("winskin1.webp", "ui", 0, 0, 416, 416); - let page = core.status.event.data.index; - let floorId = core.status.event.data.floorId; - core.ui.statusBar._update_map(floorId); - const bfs = core.plugin.bfsSearch(floorId, 1, true); - const mapdir = bfs.mapdir[floorId]; - core.setTextAlign("ui", "center"); - let size = (core.__PIXELS__ * 3) / 4; //312 - const areas = core.getFlag("areas"); + core.clearMap("data"); + core.status.event.id = "viewMaps"; + this.clearUI(); + //console.log(index) + if (index == null) index = core.floorIds.indexOf(core.status.floorId); + core.animateFrame.tip = null; + core.status.checkBlock.cache = {}; + let data = this._drawViewMaps_buildData(index, x, y); + core.drawWindowSkin("winskin1.webp", "ui", 0, 0, 416, 416); + let page = core.status.event.data.index; + let floorId = core.status.event.data.floorId; + core.ui.statusBar._update_map(floorId); + const bfs = core.plugin.bfsSearch(floorId, 1, true); + const mapdir = bfs.mapdir[floorId]; + core.setTextAlign("ui", "center"); + let size = (core.__PIXELS__ * 3) / 4; //312 + const areas = core.getFlag("areas"); - let i = areas.findIndex((v) => v.maps.includes(floorId)); - core.fillRoundRect("ui", 15 - 2, 15 - 2, 35 + 4, 35 + 4, 4, "#444444"); - core.strokeRoundRect( - "ui", - 15 - 4, - 15 - 4, - 35 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - core.fillBoldText1( - "ui", - "当前", - 13 + 20, - 17 + 20, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); + let i = areas.findIndex((v) => v.maps.includes(floorId)); + core.fillRoundRect("ui", 15 - 2, 15 - 2, 35 + 4, 35 + 4, 4, "#444444"); + core.strokeRoundRect( + "ui", + 15 - 4, + 15 - 4, + 35 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + core.fillBoldText1( + "ui", + "当前", + 13 + 20, + 17 + 20, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); - core.fillRoundRect( - "ui", - 15 - 2, - 15 - 2 + 35 + 8 + size + 8 - 54, - 35 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4, - 15 - 4 + 35 + 8 + size + 8 - 54, - 35 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - if ( - !core.status.maps[core.floorIds[page]].canFlyTo || - !core.hasVisitedFloor(core.floorIds[page]) - ) { - core.fillBoldText1( - "ui", - "预览", - 13 + 20, - 17 + 20 + 35 + 8 + size + 8 - 54, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "传送", - 13 + 20, - 17 + 20 + 35 + 8 + size + 8 - 54, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } - core.fillRoundRect( - "ui", - 15 - 4 + size - 2 + 45, - 15 - 2 + size - 4 + 45, - 35 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4 + 45, - 15 - 4 + size - 4 + 45, - 35 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - core.fillBoldText1( - "ui", - "离开", - 15 - 4 + size - 4 + 45 + 22, - 15 - 4 + size - 4 + 45 + 26, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); + core.fillRoundRect( + "ui", + 15 - 2, + 15 - 2 + 35 + 8 + size + 8 - 54, + 35 + 4, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4, + 15 - 4 + 35 + 8 + size + 8 - 54, + 35 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + if ( + !core.status.maps[core.floorIds[page]].canFlyTo || + !core.hasVisitedFloor(core.floorIds[page]) + ) { + core.fillBoldText1( + "ui", + "预览", + 13 + 20, + 17 + 20 + 35 + 8 + size + 8 - 54, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "传送", + 13 + 20, + 17 + 20 + 35 + 8 + size + 8 - 54, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } + core.fillRoundRect( + "ui", + 15 - 4 + size - 2 + 45, + 15 - 2 + size - 4 + 45, + 35 + 4, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4 + 45, + 15 - 4 + size - 4 + 45, + 35 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + core.fillBoldText1( + "ui", + "离开", + 15 - 4 + size - 4 + 45 + 22, + 15 - 4 + size - 4 + 45 + 26, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); - core.fillRoundRect( - "ui", - 15 + 44 - 2, - 15 - 2, - size + 4 - 58, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 + 44 - 4, - 15 - 4, - size + 8 - 58, - 35 + 8, - 4, - "#444444", - 1 - ); - if (mapdir.includes("up")) { - core.fillBoldText1( - "ui", - "北▲", - 30 + 145 + 10, - 17 + 20, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "北▲", - 30 + 145 + 10, - 17 + 20, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } + core.fillRoundRect( + "ui", + 15 + 44 - 2, + 15 - 2, + size + 4 - 58, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 + 44 - 4, + 15 - 4, + size + 8 - 58, + 35 + 8, + 4, + "#444444", + 1 + ); + if (mapdir.includes("up")) { + core.fillBoldText1( + "ui", + "北▲", + 30 + 145 + 10, + 17 + 20, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "北▲", + 30 + 145 + 10, + 17 + 20, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } - core.fillRoundRect( - "ui", - 15 - 2, - 59 - 2, - 35 + 4, - size + 4 - 58, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4, - 59 - 4, - 35 + 8, - size + 8 - 58, - 4, - "#444444", - 1 - ); - if (mapdir.includes("left")) { - core.fillBoldText1( - "ui", - "西", - 15 + 17, - 25 + 150, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - core.fillBoldText1( - "ui", - "◀", - 15 + 17, - 45 + 150, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "西", - 15 + 17, - 25 + 150, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - core.fillBoldText1( - "ui", - "◀", - 15 + 17, - 45 + 150, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } - core.fillRoundRect( - "ui", - 15 + 44 - 2, - 15 - 2 + size - 4, - size + 4 - 58, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 + 44 - 4, - 15 - 4 + size - 4, - size + 8 - 58, - 35 + 8, - 4, - "#444444", - 1 - ); - if (mapdir.includes("down")) { - core.fillBoldText1( - "ui", - "南▼", - 30 + 145 + 10, - 17 + 20 + size - 4, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "南▼", - 30 + 145 + 10, - 17 + 20 + size - 4, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } + core.fillRoundRect( + "ui", + 15 - 2, + 59 - 2, + 35 + 4, + size + 4 - 58, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4, + 59 - 4, + 35 + 8, + size + 8 - 58, + 4, + "#444444", + 1 + ); + if (mapdir.includes("left")) { + core.fillBoldText1( + "ui", + "西", + 15 + 17, + 25 + 150, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + core.fillBoldText1( + "ui", + "◀", + 15 + 17, + 45 + 150, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "西", + 15 + 17, + 25 + 150, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + core.fillBoldText1( + "ui", + "◀", + 15 + 17, + 45 + 150, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } + core.fillRoundRect( + "ui", + 15 + 44 - 2, + 15 - 2 + size - 4, + size + 4 - 58, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 + 44 - 4, + 15 - 4 + size - 4, + size + 8 - 58, + 35 + 8, + 4, + "#444444", + 1 + ); + if (mapdir.includes("down")) { + core.fillBoldText1( + "ui", + "南▼", + 30 + 145 + 10, + 17 + 20 + size - 4, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "南▼", + 30 + 145 + 10, + 17 + 20 + size - 4, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } - core.fillRoundRect( - "ui", - 15 - 2 + size - 4, - 59 - 2, - 35 + 4, - size + 4 - 58, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4, - 59 - 4, - 35 + 8, - size + 8 - 58, - 4, - "#444444", - 1 - ); - if (mapdir.includes("right")) { - core.fillBoldText1( - "ui", - "东", - 15 + 17 + size - 4, - 25 + 150, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - core.fillBoldText1( - "ui", - "▶", - 15 + 17 + size - 4, - 45 + 150, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "东", - 15 + 17 + size - 4, - 25 + 150, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - core.fillBoldText1( - "ui", - "▶", - 15 + 17 + size - 4, - 45 + 150, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } - core.fillRoundRect( - "ui", - 60 - 2, - 60 - 2, - size - 58 + 4, - size - 58 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 60 - 4, - 60 - 4, - size - 58 + 8, - size - 58 + 8, - 4, - "#444444", - 1 - ); - core.drawThumbnail(floorId, null, { - damage: data.damage, - ctx: "ui", - x: 58, - y: 58, - size: 0.62, - all: data.all, - }); - if ( - !core.status.maps[core.floorIds[page]].canFlyTo || - !core.hasVisitedFloor(core.floorIds[page]) - ) { - /*core.fillRect("ui", 58, + core.fillRoundRect( + "ui", + 15 - 2 + size - 4, + 59 - 2, + 35 + 4, + size + 4 - 58, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4, + 59 - 4, + 35 + 8, + size + 8 - 58, + 4, + "#444444", + 1 + ); + if (mapdir.includes("right")) { + core.fillBoldText1( + "ui", + "东", + 15 + 17 + size - 4, + 25 + 150, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + core.fillBoldText1( + "ui", + "▶", + 15 + 17 + size - 4, + 45 + 150, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "东", + 15 + 17 + size - 4, + 25 + 150, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + core.fillBoldText1( + "ui", + "▶", + 15 + 17 + size - 4, + 45 + 150, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } + core.fillRoundRect( + "ui", + 60 - 2, + 60 - 2, + size - 58 + 4, + size - 58 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 60 - 4, + 60 - 4, + size - 58 + 8, + size - 58 + 8, + 4, + "#444444", + 1 + ); + core.drawThumbnail(floorId, null, { + damage: data.damage, + ctx: "ui", + x: 58, + y: 58, + size: 0.62, + all: data.all, + }); + if ( + !core.status.maps[core.floorIds[page]].canFlyTo || + !core.hasVisitedFloor(core.floorIds[page]) + ) { + /*core.fillRect("ui", 58, 58, size - 50, size - 50, "rgba(0,0,0,0.5)")*/ - core.getContextByName("ui").globalAlpha = 0.7 + core.getContextByName("ui").globalAlpha = 0.7; - core.drawImage( - "ui", - "miwu.webp", - 0, - 0, - size, - size, - 58, - 58, - size - 50, - size - 50 - ); - core.getContextByName("ui").globalAlpha = 1 - /*core.fillText("ui", '?', 188, + core.drawImage( + "ui", + "miwu.webp", + 0, + 0, + size, + size, + 58, + 58, + size - 50, + size - 50 + ); + core.getContextByName("ui").globalAlpha = 1; + /*core.fillText("ui", '?', 188, 278, "rgba(255,255,255,0.2)", this._buildFont(250, true))*/ - } - core.fillRoundRect( - "ui", - 15 + 44 - 2, - 60 - 2 + size - 4, - size + 4 - 58, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 + 44 - 4, - 60 - 4 + size - 4, - size + 8 - 58, - 35 + 8, - 4, - "#444444", - 1 - ); - core.fillBoldText1( - "ui", - core.status.maps[floorId].areas, - 30 + 145 + 10, - 17 + 65 + size - 4, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - core.fillRoundRect( - "ui", - 15 - 2, - 60 - 2 + size - 4, - 35 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4, - 60 - 4 + size - 4, - 35 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - if (i === 0) { - core.fillBoldText1( - "ui", - "◀", - 30, - 17 + 65 + size - 4, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "◀", - 30, - 17 + 65 + size - 4, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } - core.fillRoundRect( - "ui", - 15 - 2 + size - 4, - 60 - 2 + size - 4, - 35 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4, - 60 - 4 + size - 4, - 35 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - if (i === areas.length - 1) { - core.fillBoldText1( - "ui", - "▶", - 30 + 300 + 10, - 17 + 65 + size - 4, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "▶", - 30 + 300 + 10, - 17 + 65 + size - 4, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } - - core.fillRoundRect( - "ui", - 15 - 2 + size - 4, - 15 - 2, - 80 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4, - 15 - 4, - 80 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - if (mapdir.includes("upFloor")) { - core.fillBoldText1( - "ui", - "上楼", - 30 + 320 + 10, - 17 + 20, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "上楼", - 30 + 320 + 10, - 17 + 20, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } - core.fillRoundRect( - "ui", - 15 - 2 + size - 4, - 15 - 2 + size - 4, - 80 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4, - 15 - 4 + size - 4, - 80 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - if (mapdir.includes("downFloor")) { - core.fillBoldText1( - "ui", - "下楼", - 30 + 320 + 10, - 17 + 20 + size - 4, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "下楼", - 30 + 320 + 10, - 17 + 20 + size - 4, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } - - core.fillRoundRect( - "ui", - 15 - 2 + size - 4 + 35 + 8, - 59 - 2, - 37 + 4, - (size - 58) / 2 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4 + 35 + 8, - 59 - 4, - 37 + 8, - (size - 58) / 2 + 8, - 4, - "#444444", - 1 - ); - const title = core.status.maps[floorId].title; - //const length = title.length - fillTextVertical( - "ui", - title, - 15 - 4 + size - 4 + 45, - 85, - core.hasVisitedFloor(floorId) ? "#FFFFFF" : "#444444", - "#000000", - 18 - ); - //const uictx = main.dom.gameCanvas.ui.getContext('2d') - core.fillRoundRect( - "ui", - 15 - 2 + size - 4 + 35 + 8, - 59 - 2 + (size - 58) / 2 + 8, - 37 + 4, - 119 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4 + 35 + 8, - 59 - 4 + (size - 58) / 2 + 8, - 37 + 8, - 119 + 8, - 4, - "#444444", - 1 - ); - if (core.getFlag("showEnemy")) { - fillTextVertical( - "ui", - "关闭漏怪检测", - 15 - 4 + size - 4 + 45, - 220, - "#FFFFFF", - "#000000", - 18 - ); - } else { - fillTextVertical( - "ui", - "开启漏怪检测", - 15 - 4 + size - 4 + 45, - 220, - "#FFFFFF", - "#000000", - 18 - ); - } - - //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) { - //竖向文字绘制 - - 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 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; - } - - 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.textBaseline = "middle"; - context.lineWidth = 6; - - // 开始逐字绘制 - - arrText.forEach(function (letter, index) { - // 确定下一个字符的纵坐标位置 - - context.strokeText(letter, sx, sy); - context.fillText(letter, sx, sy); - // 旋转坐标系还原成初始态 - - context.setTransform(1, 0, 0, 1, 0, 0); - - // 确定下一个字符的纵坐标位置 - - var letterWidth = 54; - - sy = sy + letterWidth; - }); - - // 水平垂直对齐方式还原 - - context.textAlign = align; - - context.textBaseline = baseline; - - //绘制到目标位置 - 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; - } - - 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 (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 (keycode == 27 || keycode == 71) { - core.clearMap("data"); - core.playSound("取消"); - core.ui.closePanel(); - core.getItemDetail(); - core.redrawMap(); - core.ui.statusBar._update_map(); - core.updateStatusBar(); - return; - } - - if (keycode == 86) { - core.status.event.data.damage = !core.status.event.data.damage; - core.playSound("光标移动"); - core.ui._drawViewMaps(core.status.event.data); - return; - } - if (keycode == 66 || keycode == 88) { - if (core.isReplaying()) { - core.control._replay_book(); - } else { - core.openBook(false); - } - return; - } - if ( - (keycode == 13 || keycode == 32 || keycode == 67) && - !core.isReplaying() - ) { - core.useFly(false); - return; - } - return; - }; - actions.prototype._keyDownViewMaps = function (keycode) { - if (core.status.event.data == null) return; - - var floorId = core.floorIds[core.status.event.data.index], - mh = core.floors[floorId].height; - - if (keycode == 39) this._clickViewMaps(9, 1, 330, 250); - if (keycode == 37) this._clickViewMaps(9, 8, 25, 200); - if (keycode == 40) this._clickViewMaps(9, 6, 250, 330); - if (keycode == 38) this._clickViewMaps(9, 3, 200, 25); - if (keycode == 34) this._clickViewMaps(9, 3, 350, 330); - if (keycode == 33) this._clickViewMaps(9, 3, 350, 25); - return; - }; - - actions.prototype._sys_onmousewheel = function (direct) { - // 向下滚动是 -1 ,向上是 1 - - if (this._checkReplaying()) { - // 滚轮控制速度 - if (direct == 1) core.speedUpReplay(); - if (direct == -1) core.speedDownReplay(); - return; - } - - // 楼层飞行器 - if (core.status.lockControl && core.status.event.id == "fly") { - if (direct == 1) core.ui.drawFly(this._getNextFlyFloor(1)); - if (direct == -1) core.ui.drawFly(this._getNextFlyFloor(-1)); - return; - } - - // 怪物手册 - if (core.status.lockControl && core.status.event.id == "book") { - var pageinfo = core.ui._drawBook_pageinfo(); - if (direct == 1) - core.ui.drawBook(core.status.event.data - pageinfo.per_page); - if (direct == -1) - core.ui.drawBook(core.status.event.data + pageinfo.per_page); - return; - } - - // 存读档 - if ( - core.status.lockControl && - (core.status.event.id == "save" || core.status.event.id == "load") - ) { - var index = - core.status.event.data.page * 10 + core.status.event.data.offset; - if (direct == 1) core.ui._drawSLPanel(index - 10); - if (direct == -1) core.ui._drawSLPanel(index + 10); - return; - } - - // 浏览地图 - if (core.status.lockControl && core.status.event.id == "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画布设置 - CGUI.style.position = "absolute"; - CGUI.style.zIndex = 300; - CGUI.style.display = "none"; - CGUI.id = "CGUI"; - main.dom.gameGroup.insertAdjacentElement("afterend", CGUI); - CGUI.style.top = "50%"; - CGUI.style.left = "50%"; - CGUI.style.transform = "translate(-50%,-50%)"; - const ctx = CGUI.getContext("2d"); - main.dom.CGUI = CGUI; - let page = 0; //初始页面 - let show = false; //展示状态 - CGUI.onclick = function (e) { - try { - e.preventDefault(); - if (core.isPlaying()) return false; - 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.CG.onclick(px * 3, py * 3); - } catch (ee) { - main.log(ee); } + 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 + 35 + 8, + 59 - 2, + 37 + 4, + (size - 58) / 2 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4 + 35 + 8, + 59 - 4, + 37 + 8, + (size - 58) / 2 + 8, + 4, + "#444444", + 1 + ); + const title = core.status.maps[floorId].title; + //const length = title.length + fillTextVertical( + "ui", + title, + 15 - 4 + size - 4 + 45, + 85, + core.hasVisitedFloor(floorId) ? "#FFFFFF" : "#444444", + "#000000", + 18 + ); + //const uictx = main.dom.gameCanvas.ui.getContext('2d') + core.fillRoundRect( + "ui", + 15 - 2 + size - 4 + 35 + 8, + 59 - 2 + (size - 58) / 2 + 8, + 37 + 4, + 119 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4 + 35 + 8, + 59 - 4 + (size - 58) / 2 + 8, + 37 + 8, + 119 + 8, + 4, + "#444444", + 1 + ); + if (core.getFlag("showEnemy")) { + fillTextVertical( + "ui", + "关闭漏怪检测", + 15 - 4 + size - 4 + 45, + 220, + "#FFFFFF", + "#000000", + 18 + ); + } else { + fillTextVertical( + "ui", + "开启漏怪检测", + 15 - 4 + size - 4 + 45, + 220, + "#FFFFFF", + "#000000", + 18 + ); + } + + //uictx.fillTextVertical(title, 15 - 4 + size - 4 + 35 + 29, 25 + 150) + //fillTextVertical('ui', title, 15 - 4 + size - 4 + 35 + 29, 25 + 150, '#FFFFFF', this._buildFont(18, true)) }; - class CG { - constructor() { - this.cgs; - //cg列表 - this.UIMx = [ - //空位用‘none’填充,当前ui3*2 - [ - ["eve_010102.webp", "eve_010203.webp", "eve_010304.webp"], - ["eve_010501.webp", "eve_010601.webp", "eve_010701.webp"], - ], - [ - ["eve_010801.webp", "eve_010902.webp", "eve_011001.webp"], - ["eve_011101.webp", "eve_011202.webp", "eve_011302.webp"], - ], - [ - ["eve_011402.webp", "eve_020102.webp", "eve_020201.webp"], - ["eve_020301.webp", "eve_020401.webp", "eve_020501.webp"], - ], - [ - ["eve_020605.webp", "eve_020701.webp", "eve_020801.webp"], - ["eve_030101.webp", "eve_030206.webp", "eve_030302.webp"], - ], - [ - ["eve_030508.webp", "eve_030601.webp", "eve_030801.webp"], - ["eve_030901.webp", "eve_031002.webp", "eve_031101.webp"], - ], - [ - ["eve_040201.webp", "eve_040401.webp", "eve_040501.webp"], - ["eve_040601.webp", "eve_040702.webp", "eve_040801.webp"], - ], - [ - ["eve_050101.webp", "eve_050201.webp", "eve_050401.webp"], - ["eve_050501.webp", "eve_050601.webp", "eve_050704.webp"], - ], - [ - ["eve_050801.webp", "eve_070101.webp", "bg_1511.webp"], - ["bg_1521.webp", "bg_2011.webp", "bg_2521.webp"], - ], - [ - ["bg_3042.webp", "bg_3551.webp", "bg_3571.webp"], - ["bg_3721.webp", "bg_5033.webp", "bg_5044.webp"], - ], - ]; + 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(""); + + let arrWidth = arrText.map(function (letter) { + return context.measureText(letter).width; + }); + + 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; } - //更新 - update() { - this.background(); - this.drawUI(); + if ( + baseline == "bottom" || + baseline == "alphabetic" || + baseline == "ideographic" + ) { + sy = sy - arrWidth[0] / 2; + } else if (baseline == "top" || baseline == "hanging") { + sy = sy + arrWidth[0] / 2; } - background() { - //画布大小设置 - if (core.domStyle.isVertical) { - CGUI.width = 1248; - CGUI.height = 2028; - } else { - CGUI.width = 2028; - CGUI.height = 1248; - } - core.setTextAlign(ctx, "center"); - } - onclick(px, py) { - //点击 - if (show) { - show = !show; - core.clearMap(ctx); - this.update(); - return; - } - 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)) { - //离开按钮是一致的,其余的记区分横竖屏 - CGUI.style.display = "none"; - core.clearMap(ctx); - core.restart(); - return; - } - if (core.domStyle.isVertical) { - //竖屏 - const pageupbox = makeBox([200, 1830], [200, 100]); - const pagedownbox = makeBox([900, 1830], [200, 100]); + context.textAlign = "center"; - const imagebox0 = makeBox([50, 200], [560, 420]); - const imagebox1 = makeBox([50, 750], [560, 420]); - const imagebox2 = makeBox([50, 1300], [560, 420]); + context.textBaseline = "middle"; + context.lineWidth = 6; - const imagebox3 = makeBox([650, 200], [560, 420]); - const imagebox4 = makeBox([650, 750], [560, 420]); - const imagebox5 = makeBox([650, 1300], [560, 420]); - if (inRect(pos, pagedownbox)) { - //2代表当前最大页数-1 - if (page < this.UIMx.length - 1) { - page++; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, pageupbox)) { - if (page > 0) { - page--; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, imagebox0)) { - if (this.cgs.includes(this.UIMx[page][0][0])) { - const img = core.material.images.images[this.UIMx[page][0][0]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox1)) { - if (this.cgs.includes(this.UIMx[page][0][1])) { - const img = core.material.images.images[this.UIMx[page][0][1]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox2)) { - if (this.cgs.includes(this.UIMx[page][0][2])) { - const img = core.material.images.images[this.UIMx[page][0][2]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox3)) { - if (this.cgs.includes(this.UIMx[page][1][0])) { - const img = core.material.images.images[this.UIMx[page][1][0]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox4)) { - if (this.cgs.includes(this.UIMx[page][1][1])) { - const img = core.material.images.images[this.UIMx[page][1][1]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox5)) { - if (this.cgs.includes(this.UIMx[page][1][2])) { - const img = core.material.images.images[this.UIMx[page][1][2]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } - } else { - const pageupbox = makeBox([200, 1110], [200, 100]); - const pagedownbox = makeBox([1600, 1110], [200, 100]); - const imagebox0 = makeBox([75, 150], [600, 450]); - const imagebox1 = makeBox([725, 150], [600, 450]); - const imagebox2 = makeBox([1300, 150], [600, 450]); - const imagebox3 = makeBox([75, 650], [600, 450]); - const imagebox4 = makeBox([725, 650], [600, 450]); - const imagebox5 = makeBox([1375, 650], [600, 450]); - if (inRect(pos, pagedownbox)) { - if (page < this.UIMx.length - 1) { - page++; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, pageupbox)) { - if (page > 0) { - page--; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, imagebox0)) { - if (this.cgs.includes(this.UIMx[page][0][0])) { - const img = core.material.images.images[this.UIMx[page][0][0]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox1)) { - if (this.cgs.includes(this.UIMx[page][0][1])) { - const img = core.material.images.images[this.UIMx[page][0][1]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox2)) { - if (this.cgs.includes(this.UIMx[page][0][2])) { - const img = core.material.images.images[this.UIMx[page][0][2]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox3)) { - if (this.cgs.includes(this.UIMx[page][1][0])) { - const img = core.material.images.images[this.UIMx[page][1][0]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox4)) { - if (this.cgs.includes(this.UIMx[page][1][1])) { - const img = core.material.images.images[this.UIMx[page][1][1]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox5)) { - if (this.cgs.includes(this.UIMx[page][1][2])) { - const img = core.material.images.images[this.UIMx[page][1][2]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } - } - } - drawUI() { - //绘制页面 - core.clearMap(CGUI); - const bgVertical = core.material.images.images["bg_2010.webp"]; //竖屏背景 - const bg = core.material.images.images["bg_5043.webp"]; //横屏背景 + // 开始逐字绘制 - if (core.domStyle.isVertical) { - //竖屏 + arrText.forEach(function (letter, index) { + // 确定下一个字符的纵坐标位置 - core.fillRect(ctx, 0, 0, 1248, 2028, "#000000"); //黑色背景 - ctx.globalAlpha = 0.5; //透明度 - if (bgVertical) - ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片 - ctx.globalAlpha = 1; //恢复为不透明 + context.strokeText(letter, sx, sy); + context.fillText(letter, sx, sy); + // 旋转坐标系还原成初始态 - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - "◀离开", - 100, - 110, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + context.setTransform(1, 0, 0, 1, 0, 0); - core.fillBoldText1( - ctx, - "上一页", - 300, - 1900, - page === 0 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + // 确定下一个字符的纵坐标位置 - core.fillBoldText1( - ctx, - page + 1 + "/" + this.UIMx.length, - 650, - 1900, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - ctx, - "下一页", - 1000, - 1900, - page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - // 添加向上翻页和向下翻页的按钮 + var letterWidth = 54; - // 添加3*2个4:3的画框,及图片 - for (let i = 0; i < 3; i++) { - for (let j = 0; j < 2; j++) { - const img = core.material.images.images[this.UIMx[page][j][i]]; - core.strokeRect( - ctx, - 50 + j * 600, - 200 + i * 550, - 560, - 420, - "#444444", - 5 - ); - if (this.cgs.includes(this.UIMx[page][j][i])) { - if (img) - ctx.drawImage( - img, - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - } else { - ctx.fillStyle = "#000000"; - ctx.fillRect( - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - const img = core.material.images.images["LOGO.webp"]; - if (img) - ctx.drawImage( - img, - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - } - } - } - } 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; //恢复为不透明 + sy = sy + letterWidth; + }); - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - "◀离开", - 110, - 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + // 水平垂直对齐方式还原 - // 添加向上翻页和向下翻页的按钮 - core.fillBoldText1( - ctx, - "上一页", - 300, - 1180, - page === 0 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + context.textAlign = align; - core.fillBoldText1( - ctx, - page + 1 + "/" + this.UIMx.length, - 1000, - 1180, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - ctx, - "下一页", - 1700, - 1180, - page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + context.textBaseline = baseline; - // 添加3*2个4:3的画框 - for (let i = 0; i < 2; i++) { - for (let j = 0; j < 3; j++) { - core.strokeRect( - ctx, - 75 + j * 650, - 150 + i * 500, - 600, - 450, - "#444444", - 2 - ); - if (this.cgs.includes(this.UIMx[page][i][j])) { - const img = core.material.images.images[this.UIMx[page][i][j]]; - if (img) - ctx.drawImage( - img, - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - } else { - ctx.fillStyle = "#000000"; - ctx.fillRect( - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - const img = core.material.images.images["LOGO.webp"]; - if (img) - ctx.drawImage( - img, - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - } - } - } - } - } + //绘制到目标位置 + ctx.drawImage( + canvas, + x, + y - (fontsize / 3) * length, + canvas.width / 3, + canvas.height / 3 + ); } - this.setcgs = function (img) { - const a = core.getLocalStorage("cgs", []); - if (img) { - if (!a.includes(img)) a.push(img); - core.setLocalStorage("cgs", a); - } else core.setLocalStorage("cgs"); + + ////// 点击楼层传送器时的打开操作 ////// + 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 ( + (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; }; - core.ui.CG = new CG(); - main.dom.CGMode.onclick = function () { - //点击开始页面的CG MODE进入cg回廊 - main.core.control.checkBgm(); - page = 0; - main.core.ui.CG.cgs = core.getLocalStorage("cgs", []); - CGUI.style.display = "block"; - main.core.ui.CG.update(); + ////// 系统菜单栏界面时的点击操作 ////// + 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 (keycode == 27 || keycode == 71) { + core.clearMap("data"); + core.playSound("取消"); + core.ui.closePanel(); + core.getItemDetail(); + core.redrawMap(); + core.ui.statusBar._update_map(); + core.updateStatusBar(); + return; + } + + if (keycode == 86) { + core.status.event.data.damage = !core.status.event.data.damage; + core.playSound("光标移动"); + core.ui._drawViewMaps(core.status.event.data); + return; + } + if (keycode == 66 || keycode == 88) { + if (core.isReplaying()) { + core.control._replay_book(); + } else { + core.openBook(false); + } + return; + } + if ( + (keycode == 13 || keycode == 32 || keycode == 67) && + !core.isReplaying() + ) { + core.useFly(false); + return; + } + return; + }; + actions.prototype._keyDownViewMaps = function (keycode) { + if (core.status.event.data == null) return; + + var floorId = core.floorIds[core.status.event.data.index], + mh = core.floors[floorId].height; + + if (keycode == 39) this._clickViewMaps(9, 1, 330, 250); + if (keycode == 37) this._clickViewMaps(9, 8, 25, 200); + if (keycode == 40) this._clickViewMaps(9, 6, 250, 330); + if (keycode == 38) this._clickViewMaps(9, 3, 200, 25); + if (keycode == 34) this._clickViewMaps(9, 3, 350, 330); + if (keycode == 33) this._clickViewMaps(9, 3, 350, 25); + return; + }; + + actions.prototype._sys_onmousewheel = function (direct) { + // 向下滚动是 -1 ,向上是 1 + + if (this._checkReplaying()) { + // 滚轮控制速度 + if (direct == 1) core.speedUpReplay(); + if (direct == -1) core.speedDownReplay(); + return; + } + + // 楼层飞行器 + if (core.status.lockControl && core.status.event.id == "fly") { + if (direct == 1) core.ui.drawFly(this._getNextFlyFloor(1)); + if (direct == -1) core.ui.drawFly(this._getNextFlyFloor(-1)); + return; + } + + // 怪物手册 + if (core.status.lockControl && core.status.event.id == "book") { + var pageinfo = core.ui._drawBook_pageinfo(); + if (direct == 1) + core.ui.drawBook(core.status.event.data - pageinfo.per_page); + if (direct == -1) + core.ui.drawBook(core.status.event.data + pageinfo.per_page); + return; + } + + // 存读档 + if ( + core.status.lockControl && + (core.status.event.id == "save" || core.status.event.id == "load") + ) { + var index = + core.status.event.data.page * 10 + core.status.event.data.offset; + if (direct == 1) core.ui._drawSLPanel(index - 10); + if (direct == -1) core.ui._drawSLPanel(index + 10); + return; + } + + // 浏览地图 + if (core.status.lockControl && core.status.event.id == "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画布设置 + CGUI.style.position = "absolute"; + CGUI.style.zIndex = 300; + CGUI.style.display = "none"; + CGUI.id = "CGUI"; + main.dom.gameGroup.insertAdjacentElement("afterend", CGUI); + CGUI.style.top = "50%"; + CGUI.style.left = "50%"; + CGUI.style.transform = "translate(-50%,-50%)"; + const ctx = CGUI.getContext("2d"); + main.dom.CGUI = CGUI; + let page = 0; //初始页面 + let show = false; //展示状态 + CGUI.onclick = function (e) { + try { + e.preventDefault(); + if (core.isPlaying()) return false; + 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.CG.onclick(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + + class CG { + constructor() { + this.cgs; + //cg列表 + this.UIMx = [ + //空位用‘none’填充,当前ui3*2 + [ + ["eve_010102.webp", "eve_010203.webp", "eve_010304.webp"], + ["eve_010501.webp", "eve_010601.webp", "eve_010701.webp"], + ], + [ + ["eve_010801.webp", "eve_010902.webp", "eve_011001.webp"], + ["eve_011101.webp", "eve_011202.webp", "eve_011302.webp"], + ], + [ + ["eve_011402.webp", "eve_020102.webp", "eve_020201.webp"], + ["eve_020301.webp", "eve_020401.webp", "eve_020501.webp"], + ], + [ + ["eve_020605.webp", "eve_020701.webp", "eve_020801.webp"], + ["eve_030101.webp", "eve_030206.webp", "eve_030302.webp"], + ], + [ + ["eve_030508.webp", "eve_030601.webp", "eve_030801.webp"], + ["eve_030901.webp", "eve_031002.webp", "eve_031101.webp"], + ], + [ + ["eve_040201.webp", "eve_040401.webp", "eve_040501.webp"], + ["eve_040601.webp", "eve_040702.webp", "eve_040801.webp"], + ], + [ + ["eve_050101.webp", "eve_050201.webp", "eve_050401.webp"], + ["eve_050501.webp", "eve_050601.webp", "eve_050704.webp"], + ], + [ + ["eve_050801.webp", "eve_070101.webp", "bg_1511.webp"], + ["bg_1521.webp", "bg_2011.webp", "bg_2521.webp"], + ], + [ + ["bg_3042.webp", "bg_3551.webp", "bg_3571.webp"], + ["bg_3721.webp", "bg_5033.webp", "bg_5044.webp"], + ], + ]; + } + + //更新 + update() { + this.background(); + this.drawUI(); + } + background() { + //画布大小设置 + if (core.domStyle.isVertical) { + CGUI.width = 1248; + CGUI.height = 2028; + } else { + CGUI.width = 2028; + CGUI.height = 1248; + } + core.setTextAlign(ctx, "center"); + } + onclick(px, py) { + //点击 + + if (show) { + show = !show; + core.clearMap(ctx); + this.update(); + return; + } + 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)) { + //离开按钮是一致的,其余的记区分横竖屏 + CGUI.style.display = "none"; + core.clearMap(ctx); + core.restart(); + return; + } + if (core.domStyle.isVertical) { + //竖屏 + const pageupbox = makeBox([200, 1830], [200, 100]); + const pagedownbox = makeBox([900, 1830], [200, 100]); + + const imagebox0 = makeBox([50, 200], [560, 420]); + const imagebox1 = makeBox([50, 750], [560, 420]); + const imagebox2 = makeBox([50, 1300], [560, 420]); + + const imagebox3 = makeBox([650, 200], [560, 420]); + const imagebox4 = makeBox([650, 750], [560, 420]); + const imagebox5 = makeBox([650, 1300], [560, 420]); + if (inRect(pos, pagedownbox)) { + //2代表当前最大页数-1 + if (page < this.UIMx.length - 1) { + page++; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, pageupbox)) { + if (page > 0) { + page--; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, imagebox0)) { + if (this.cgs.includes(this.UIMx[page][0][0])) { + const img = core.material.images.images[this.UIMx[page][0][0]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox1)) { + if (this.cgs.includes(this.UIMx[page][0][1])) { + const img = core.material.images.images[this.UIMx[page][0][1]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox2)) { + if (this.cgs.includes(this.UIMx[page][0][2])) { + const img = core.material.images.images[this.UIMx[page][0][2]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox3)) { + if (this.cgs.includes(this.UIMx[page][1][0])) { + const img = core.material.images.images[this.UIMx[page][1][0]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox4)) { + if (this.cgs.includes(this.UIMx[page][1][1])) { + const img = core.material.images.images[this.UIMx[page][1][1]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox5)) { + if (this.cgs.includes(this.UIMx[page][1][2])) { + const img = core.material.images.images[this.UIMx[page][1][2]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } + } else { + const pageupbox = makeBox([200, 1110], [200, 100]); + const pagedownbox = makeBox([1600, 1110], [200, 100]); + const imagebox0 = makeBox([75, 150], [600, 450]); + const imagebox1 = makeBox([725, 150], [600, 450]); + const imagebox2 = makeBox([1300, 150], [600, 450]); + const imagebox3 = makeBox([75, 650], [600, 450]); + const imagebox4 = makeBox([725, 650], [600, 450]); + const imagebox5 = makeBox([1375, 650], [600, 450]); + if (inRect(pos, pagedownbox)) { + if (page < this.UIMx.length - 1) { + page++; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, pageupbox)) { + if (page > 0) { + page--; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, imagebox0)) { + if (this.cgs.includes(this.UIMx[page][0][0])) { + const img = core.material.images.images[this.UIMx[page][0][0]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox1)) { + if (this.cgs.includes(this.UIMx[page][0][1])) { + const img = core.material.images.images[this.UIMx[page][0][1]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox2)) { + if (this.cgs.includes(this.UIMx[page][0][2])) { + const img = core.material.images.images[this.UIMx[page][0][2]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox3)) { + if (this.cgs.includes(this.UIMx[page][1][0])) { + const img = core.material.images.images[this.UIMx[page][1][0]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox4)) { + if (this.cgs.includes(this.UIMx[page][1][1])) { + const img = core.material.images.images[this.UIMx[page][1][1]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox5)) { + if (this.cgs.includes(this.UIMx[page][1][2])) { + const img = core.material.images.images[this.UIMx[page][1][2]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } + } + } + drawUI() { + //绘制页面 + core.clearMap(CGUI); + 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.5; //透明度 + if (bgVertical) + ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片 + ctx.globalAlpha = 1; //恢复为不透明 + + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + "◀离开", + 100, + 110, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + core.fillBoldText1( + ctx, + "上一页", + 300, + 1900, + page === 0 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + core.fillBoldText1( + ctx, + page + 1 + "/" + this.UIMx.length, + 650, + 1900, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + ctx, + "下一页", + 1000, + 1900, + page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + // 添加向上翻页和向下翻页的按钮 + + // 添加3*2个4:3的画框,及图片 + for (let i = 0; i < 3; i++) { + for (let j = 0; j < 2; j++) { + const img = core.material.images.images[this.UIMx[page][j][i]]; + core.strokeRect( + ctx, + 50 + j * 600, + 200 + i * 550, + 560, + 420, + "#444444", + 5 + ); + if (this.cgs.includes(this.UIMx[page][j][i])) { + if (img) + ctx.drawImage( + img, + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + } else { + ctx.fillStyle = "#000000"; + ctx.fillRect( + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + const img = core.material.images.images["LOGO.webp"]; + if (img) + ctx.drawImage( + img, + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + } + } + } + } 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) + ); + + // 添加向上翻页和向下翻页的按钮 + core.fillBoldText1( + ctx, + "上一页", + 300, + 1180, + page === 0 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + core.fillBoldText1( + ctx, + page + 1 + "/" + this.UIMx.length, + 1000, + 1180, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + ctx, + "下一页", + 1700, + 1180, + page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + // 添加3*2个4:3的画框 + for (let i = 0; i < 2; i++) { + for (let j = 0; j < 3; j++) { + core.strokeRect( + ctx, + 75 + j * 650, + 150 + i * 500, + 600, + 450, + "#444444", + 2 + ); + if (this.cgs.includes(this.UIMx[page][i][j])) { + const img = core.material.images.images[this.UIMx[page][i][j]]; + if (img) + ctx.drawImage( + img, + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + } else { + ctx.fillStyle = "#000000"; + ctx.fillRect( + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + const img = core.material.images.images["LOGO.webp"]; + if (img) + ctx.drawImage( + img, + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + } + } + } + } + } + } + this.setcgs = function (img) { + const a = core.getLocalStorage("cgs", []); + if (img) { + if (!a.includes(img)) a.push(img); + core.setLocalStorage("cgs", a); + } else core.setLocalStorage("cgs"); + }; + core.ui.CG = new CG(); + main.dom.CGMode.onclick = function () { + //点击开始页面的CG MODE进入cg回廊 + main.core.control.checkBgm(); + page = 0; + main.core.ui.CG.cgs = core.getLocalStorage("cgs", []); + CGUI.style.display = "block"; + main.core.ui.CG.update(); + }; +}, "光标设置": function () { // 在此增加新插件 this.changeMouse = function ( @@ -15203,12 +15221,15 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = const pageupboxVertical = makeBox([18, 300], [100, 200]); const pagedownbox = makeBox([1500, 1130], [200, 100]); const pagedownboxVertical = makeBox([18, 1500], [100, 200]); + const soundbox = makeBox([550, 150], [100, 900]); + const soundboxVertical = makeBox([198, 550], [900, 100]); if (this.log) { if ( (core.domStyle.isVertical && inRect(pos, backboxVertical)) || (!core.domStyle.isVertical && inRect(pos, backbox)) ) { core.clearMap(logctx); + core.stopSound() main.dom.logcanvas.style.display = "none"; this.log = false; } else if ( @@ -15225,6 +15246,17 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.clearMap(logctx); if (this.page < this.overpage) this.page++; this.logdraw(this.page); + } else if ((core.domStyle.isVertical && inRect(pos, soundboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, soundbox))) { + if (core.domStyle.isVertical) { + const sound = this.textList[(this.page - 1) * 6 + Math.min(Math.floor((px - 198) / 150), 5)][2] + core.stopSound() + core.playSound(sound) + } else { + const sound = this.textList[(this.page - 1) * 6 + Math.min(Math.floor((py - 150) / 150), 5)][2] + core.stopSound() + core.playSound(sound) + } } } else { if ( @@ -15536,6 +15568,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = const name = this.textList[i][0] ? "【" + this.textList[i][0] + "】" : ""; + const sound = this.textList[i][2] if (name) { core.fillBoldText1( logctx, @@ -15548,6 +15581,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.ui._buildFont(42, true) ); } + if (sound) core.drawImage(logctx, "sound.webp", 550, posy + 30) if (text.length < 30) { core.fillBoldText1( logctx, @@ -17945,205 +17979,207 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "帧动画特效(游戏界面)": function () { - // 在此增加新插件 - const animate2 = document.createElement("canvas"); //画布设置 - animate2.style.zIndex = 91; - animate2.id = "animate2"; - animate2.classList.add("gameCanvas", "anti-aliasing"); - animate2.style.display = "block"; - animate2.width = 416; - animate2.height = 416; - animate2.style.width = core.__PIXELS__ * core.domStyle.scale + "px"; - animate2.style.height = core.__PIXELS__ * core.domStyle.scale + "px"; - main.dom.animate2 = animate2; - const anctx = animate2.getContext("2d"); + // 在此增加新插件 + const animate2 = document.createElement("canvas"); //画布设置 + animate2.style.zIndex = 91; + animate2.id = "animate2"; + animate2.classList.add("gameCanvas", "anti-aliasing"); + animate2.style.display = "block"; + animate2.width = 416; + animate2.height = 416; + animate2.style.width = core.__PIXELS__ * core.domStyle.scale + "px"; + animate2.style.height = core.__PIXELS__ * core.domStyle.scale + "px"; + main.dom.animate2 = animate2; + const anctx = animate2.getContext("2d"); - main.dom.gameDraw.appendChild(animate2); + main.dom.gameDraw.appendChild(animate2); - core.plugin.playing = new Set(); + core.plugin.playing = new Set(); - this.setanimate = function ( - name, - px, - py, - width, - height, - allFarme, - imageList, - soundList - ) { - const data = { - px: px, - py: py, - width: width, - height: height, - allFarme: allFarme, - imageList: imageList, - soundList: soundList, - }; - core.setFlag("animate_" + name, data); - }; - this.deleteanimate = function (name) { - core.setFlag("animate_" + name); - }; - let thistime = 0; - this.playanimate = function (name, x, y, hero, scalex, scaley, callback) { - const data = { - name: name, - x: x, - y: y, - hero: hero, - scalex: scalex, - scaley: scaley, - farme: 0, - callback - }; + this.setanimate = function ( + name, + px, + py, + width, + height, + allFarme, + imageList, + soundList + ) { + const data = { + px: px, + py: py, + width: width, + height: height, + allFarme: allFarme, + imageList: imageList, + soundList: soundList, + }; + core.setFlag("animate_" + name, data); + }; + this.deleteanimate = function (name) { + core.setFlag("animate_" + name); + }; + let thistime = 0; + this.playanimate = function (name, x, y, hero, scalex, scaley, callback) { + const data = { + name: name, + x: x, + y: y, + hero: hero, + scalex: scalex, + scaley: scaley, + farme: 0, + callback, + }; - core.plugin.playing.add(data); - }; - core.registerAnimationFrame("animateonmap", true, function (timestamp) { - if (timestamp - thistime > 1000 / 60) { - thistime = timestamp; - core.clearMap(anctx); - core.plugin.playing.forEach((one) => { - const data = flags["animate_" + one.name]; - if (!data) { - core.plugin.playing.delete(one); - } else { - data.imageList.forEach(function (image) { - if ( - one.farme >= (image.beforefarme ?? 0) && - one.farme <= (image.afterfarme ?? data.allFarme) - ) { - const img = core.material.images.images?.[image.image]; - if (img) { - const gla = image.globalAlpha ?? 100; - const agla = image.aglobalAlpha ?? gla, - beforefarme = image.beforefarme ?? 0; - const afterfarme = image.afterfarme ?? data.allFarme; + core.plugin.playing.add(data); + }; + core.registerAnimationFrame("animateonmap", true, function (timestamp) { + if (timestamp - thistime > 1000 / 60) { + thistime = timestamp; + core.clearMap(anctx); + core.plugin.playing.forEach((one) => { + const data = flags["animate_" + one.name]; + if (!data) { + core.plugin.playing.delete(one); + } else { + data.imageList.forEach(function (image) { + if ( + one.farme >= (image.beforefarme ?? 0) && + one.farme <= (image.afterfarme ?? data.allFarme) + ) { + const img = core.material.images.images?.[image.image]; + if (img) { + const gla = image.globalAlpha ?? 100; + const agla = image.aglobalAlpha ?? gla, + beforefarme = image.beforefarme ?? 0; + const afterfarme = image.afterfarme ?? data.allFarme; - anctx.globalAlpha = - (gla + - ((agla - gla) * (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1)) / - 100; + anctx.globalAlpha = + (gla + + ((agla - gla) * (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1)) / + 100; - const cx = - (image.cx ?? 0) + - (((image.acx ?? 0) - (image.cx ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - cy = - (image.cy ?? 0) + - (((image.acy ?? 0) - (image.cy ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - cw = - (image.cw ?? img.width) + - (((image.acw ?? img.width) - (image.cw ?? img.width)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - ch = - (image.ch ?? img.height) + - (((image.acw ?? img.height) - (image.cw ?? img.height)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - x = - (image.x ?? 0) + - (((image.ax ?? 0) - (image.x ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - y = - (image.y ?? 0) + - (((image.ay ?? 0) - (image.y ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - w = - (image.w ?? one.width) + - (((image.aw ?? one.width) - (image.w ?? one.width)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - h = - (image.h ?? one.height) + - (((image.aw ?? one.height) - (image.w ?? one.height)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - angle = - (Math.PI * - ((image.image.angle ?? 0) + - (((image.aangle ?? 0) - (image.image.angle ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1))) / - 180; + const cx = + (image.cx ?? 0) + + (((image.acx ?? 0) - (image.cx ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + cy = + (image.cy ?? 0) + + (((image.acy ?? 0) - (image.cy ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + cw = + (image.cw ?? img.width) + + (((image.acw ?? img.width) - (image.cw ?? img.width)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + ch = + (image.ch ?? img.height) + + (((image.acw ?? img.height) - (image.cw ?? img.height)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + x = + (image.x ?? 0) + + (((image.ax ?? 0) - (image.x ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + y = + (image.y ?? 0) + + (((image.ay ?? 0) - (image.y ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + w = + (image.w ?? one.width) + + (((image.aw ?? one.width) - (image.w ?? one.width)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + h = + (image.h ?? one.height) + + (((image.aw ?? one.height) - (image.w ?? one.height)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + angle = + (Math.PI * + ((image.image.angle ?? 0) + + (((image.aangle ?? 0) - (image.image.angle ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1))) / + 180; - if (one.hero) { - let sx, sy; - if (core.status.heroMoving < 0) { - sx = 0; - sy = 0; - } else { - sx = - core.utils.scan[core.status.hero.loc.direction].x * - 4 * - core.status.heroMoving; - sy = - core.utils.scan[core.status.hero.loc.direction].y * - 4 * - core.status.heroMoving; - } - const herox = core.status.hero.loc.x * 32 + 16 + sx; - const heroy = core.status.hero.loc.y * 32 + 16 + sy; - core.drawImage( - anctx, - img, - cx, - cy, - cw, - ch, - herox + (x - data.px) * one.scalex, - heroy + (y - data.py) * one.scaley, - w * one.scalex, - h * one.scaley, - angle - ); - } else { - core.drawImage( - anctx, - img, - cx, - cy, - cw, - ch, - one.x + (x - data.px) * one.scalex, - one.y + (y - data.py) * one.scaley, - w * one.scalex, - h * one.scaley, - angle - ); - } - } - } - }); - data.soundList.forEach(function (sound) { - const lisen = - sound.sound && - core.sounds[sound.sound] && - core.musicStatus.soundStatus; - if (one.farme == sound.startfarme && lisen) { - if (sound.stopbefore) core.stopSound(); - core.playSound(sound.sound); - } - }); - one.farme++; - if (one.farme > data.allFarme) { - core.plugin.playing.delete(one) - if (one.callback) { one.callback() } - }; - } - }); - } - }); -}, + if (one.hero) { + let sx, sy; + if (core.status.heroMoving < 0) { + sx = 0; + sy = 0; + } else { + sx = + core.utils.scan[core.status.hero.loc.direction].x * + 4 * + core.status.heroMoving; + sy = + core.utils.scan[core.status.hero.loc.direction].y * + 4 * + core.status.heroMoving; + } + const herox = core.status.hero.loc.x * 32 + 16 + sx; + const heroy = core.status.hero.loc.y * 32 + 16 + sy; + core.drawImage( + anctx, + img, + cx, + cy, + cw, + ch, + herox + (x - data.px) * one.scalex, + heroy + (y - data.py) * one.scaley, + w * one.scalex, + h * one.scaley, + angle + ); + } else { + core.drawImage( + anctx, + img, + cx, + cy, + cw, + ch, + one.x + (x - data.px) * one.scalex, + one.y + (y - data.py) * one.scaley, + w * one.scalex, + h * one.scaley, + angle + ); + } + } + } + }); + data.soundList.forEach(function (sound) { + const lisen = + sound.sound && + core.sounds[sound.sound] && + core.musicStatus.soundStatus; + if (one.farme == sound.startfarme && lisen) { + if (sound.stopbefore) core.stopSound(); + core.playSound(sound.sound); + } + }); + one.farme++; + if (one.farme > data.allFarme) { + core.plugin.playing.delete(one); + if (one.callback) { + one.callback(); + } + } + } + }); + } + }); + }, "intro&loop": function () { // 在此增加新插件 this.introAndLoop = function (intro, time, loop) { @@ -18489,1022 +18525,1044 @@ 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, - damageInfo - ) { - let attack = false - if (heroInfo.isAttack) attack = true - if (enemyInfo.isAttack) attack = true - equipInfo.forEach(function (v) { if (v.isAttack) attack = true }) - 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, "center"); - core.fillBoldText( - ctx, - hero.name, - 127, - 128, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.setTextAlign(ctx, "left"); - core.drawIcon(ctx, "hp", 70, 190, 16, 16); - core.drawIcon(ctx, "atk", 70, 210, 16, 16); - core.drawIcon(ctx, "def", 70, 230, 16, 16); - core.drawIcon(ctx, "I374", 70, 250, 16, 16); - core.drawIcon(ctx, "I375", 70, 270, 16, 16); - core.drawIcon(ctx, "mdef", 70, 290, 16, 16); - core.drawIcon(ctx, "amulet", 70, 310, 16, 16); - core.drawIcon(ctx, "jumpShoes", 70, 330, 16, 16); - core.fillBoldText( - ctx, - "生命 " + - core.formatBigNumber(heroInfo.hp, true) + - " / " + - core.formatBigNumber(heroInfo.hpmax, true), - 90, - 205, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - "攻击 " + core.formatBigNumber(heroInfo.atk), - 90, - 225, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - "防御 " + core.formatBigNumber(heroInfo.def), - 90, - 245, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - "法强 " + core.formatBigNumber(heroInfo.spell), - 90, - 265, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - "法攻 " + - core.formatBigNumber((heroInfo.matk / 100) * heroInfo.spell) + - "(" + - heroInfo.matk + - "%)", - 90, - 285, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - "护盾 " + - core.formatBigNumber((heroInfo.mhp / 100) * heroInfo.spell) + - "(" + - heroInfo.mhp + - "%)", - 90, - 305, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - "法抗 " + heroInfo.mdef + "%", - 90, - 325, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - "速度 " + core.formatBigNumber(heroInfo.speed), - 90, - 345, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); + this.drawAttackAnimate = function ( + heroInfo, + oneTurn, + enemyInfo, + equipInfo, + farme, + damageInfo + ) { + let attack = false; + if (heroInfo.isAttack) attack = true; + if (enemyInfo.isAttack) attack = true; + equipInfo.forEach(function (v) { + if (v.isAttack) attack = true; + }); + 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, "center"); + core.fillBoldText( + ctx, + hero.name, + 127, + 128, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.setTextAlign(ctx, "left"); + core.drawIcon(ctx, "hp", 70, 190, 16, 16); + core.drawIcon(ctx, "atk", 70, 210, 16, 16); + core.drawIcon(ctx, "def", 70, 230, 16, 16); + core.drawIcon(ctx, "I374", 70, 250, 16, 16); + core.drawIcon(ctx, "I375", 70, 270, 16, 16); + core.drawIcon(ctx, "mdef", 70, 290, 16, 16); + core.drawIcon(ctx, "amulet", 70, 310, 16, 16); + core.drawIcon(ctx, "jumpShoes", 70, 330, 16, 16); + core.fillBoldText( + ctx, + "生命 " + + core.formatBigNumber(heroInfo.hp, true) + + " / " + + core.formatBigNumber(heroInfo.hpmax, true), + 90, + 205, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + "攻击 " + core.formatBigNumber(heroInfo.atk), + 90, + 225, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + "防御 " + core.formatBigNumber(heroInfo.def), + 90, + 245, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + "法强 " + core.formatBigNumber(heroInfo.spell), + 90, + 265, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + "法攻 " + + core.formatBigNumber((heroInfo.matk / 100) * heroInfo.spell) + + "(" + + heroInfo.matk + + "%)", + 90, + 285, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + "护盾 " + + core.formatBigNumber((heroInfo.mhp / 100) * heroInfo.spell) + + "(" + + heroInfo.mhp + + "%)", + 90, + 305, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + "法抗 " + heroInfo.mdef + "%", + 90, + 325, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + "速度 " + core.formatBigNumber(heroInfo.speed), + 90, + 345, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); - core.strokeRect(ctx, 112, 139, 32, 48, "rgba(255,255,255,1)", 1); - core.drawImage( - ctx, - "hero.webp", - 32 * (animate % 4), - 0, - 32, - 48, - 112, - 139, - 32, - 48 - ); + core.strokeRect(ctx, 112, 139, 32, 48, "rgba(255,255,255,1)", 1); + core.drawImage( + ctx, + "hero.webp", + 32 * (animate % 4), + 0, + 32, + 48, + 112, + 139, + 32, + 48 + ); - core.setTextAlign(ctx, "center"); - core.fillBoldText( - ctx, - enemyInfo.name, - 289, - 128, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); + core.setTextAlign(ctx, "center"); + core.fillBoldText( + ctx, + enemyInfo.name, + 289, + 128, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); - core.setTextAlign(ctx, "right"); - if (enemyInfo.cls === "enemys") { - core.strokeRect(ctx, 272, 155, 32, 32, "rgba(255,255,255,1)", 1); + core.setTextAlign(ctx, "right"); + if (enemyInfo.cls === "enemys") { + core.strokeRect(ctx, 272, 155, 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, - 155, - 32, - 32 - ); - } else { - core.strokeRect(ctx, 272, 139, 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, + 155, + 32, + 32 + ); + } else { + core.strokeRect(ctx, 272, 139, 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, - 48, - 272, - 139, - 32, - 48 - ); - } - core.drawIcon(ctx, "hp", 330, 190, 16, 16); - core.drawIcon(ctx, "atk", 330, 210, 16, 16); - core.drawIcon(ctx, "def", 330, 230, 16, 16); - core.drawIcon(ctx, "amulet", 330, 250, 16, 16); - core.drawIcon(ctx, "jumpShoes", 330, 270, 16, 16); - core.fillBoldText( - ctx, - core.formatBigNumber(enemyInfo.hp, true) + " 生命", - 330, - 205, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - core.formatBigNumber(enemyInfo.atk) + " 攻击", - 330, - 225, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - core.formatBigNumber(enemyInfo.def) + " 防御", - 330, - 245, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); + core.drawImage( + ctx, + core.getBlockInfo(enemyInfo.id).image, + 32 * (animate % 4), + core.getBlockInfo(enemyInfo.id).posY * 48, + 32, + 48, + 272, + 139, + 32, + 48 + ); + } + core.drawIcon(ctx, "hp", 330, 190, 16, 16); + core.drawIcon(ctx, "atk", 330, 210, 16, 16); + core.drawIcon(ctx, "def", 330, 230, 16, 16); + core.drawIcon(ctx, "amulet", 330, 250, 16, 16); + core.drawIcon(ctx, "jumpShoes", 330, 270, 16, 16); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.hp, true) + " 生命", + 330, + 205, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.atk) + " 攻击", + 330, + 225, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.def) + " 防御", + 330, + 245, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); - core.fillBoldText( - ctx, - (enemyInfo.mdef ?? 0) * 100 + "% 法抗", - 330, - 265, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - core.formatBigNumber(enemyInfo.speed) + " 速度", - 330, - 285, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - "V", - 219, - 163, - "#FFFFFF", - "#000000", - "bold 48px pala" - ); - core.fillBoldText( - ctx, - "s", - 231, - 163, - "#FFFFFF", - "#000000", - "bold 36px pala" - ); + core.fillBoldText( + ctx, + (enemyInfo.mdef ?? 0) * 100 + "% 法抗", + 330, + 265, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.speed) + " 速度", + 330, + 285, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + "V", + 219, + 163, + "#FFFFFF", + "#000000", + "bold 48px pala" + ); + core.fillBoldText( + ctx, + "s", + 231, + 163, + "#FFFFFF", + "#000000", + "bold 36px pala" + ); - if (!attack) enemyInfo.now += enemyInfo.speed / oneTurn * 215 - let enemynow = Math.min(100 + enemyInfo.now, 315) - ctx.fillStyle = "#FFFFFF" - ctx.beginPath() - ctx.moveTo(enemynow, 100) - ctx.lineTo(enemynow + 3, 90) - ctx.lineTo(enemynow - 3, 90) - ctx.closePath() - ctx.fill() + if (!attack) enemyInfo.now += (enemyInfo.speed / oneTurn) * 215; + let enemynow = Math.min(100 + enemyInfo.now, 315); + ctx.fillStyle = "#FFFFFF"; + ctx.beginPath(); + ctx.moveTo(enemynow, 100); + ctx.lineTo(enemynow + 3, 90); + ctx.lineTo(enemynow - 3, 90); + ctx.closePath(); + ctx.fill(); - if (enemyInfo.cls === "enemys") { + if (enemyInfo.cls === "enemys") { + core.drawImage( + ctx, + core.getBlockInfo(enemyInfo.id).image, + 32, + core.getBlockInfo(enemyInfo.id).posY * 32, + 32, + 32, + enemynow - 16, + 64, + 32, + 32 + ); + } else { + core.drawImage( + ctx, + core.getBlockInfo(enemyInfo.id).image, + 32, + core.getBlockInfo(enemyInfo.id).posY * 48, + 32, + 19, + enemynow - 16, + 70, + 32, + 19 + ); + } + core.drawLine(ctx, 100, 105, 315, 105, "#FFFFFF", 5); + equipInfo.forEach(function (v) { + if (!attack) v.now += (v.speed / oneTurn) * 215; + let vnow = Math.min(100 + v.now, 315); + ctx.beginPath(); + ctx.moveTo(vnow, 100); + ctx.lineTo(vnow + 3, 90); + ctx.lineTo(vnow - 3, 90); + ctx.closePath(); + ctx.fill(); - core.drawImage( - ctx, - core.getBlockInfo(enemyInfo.id).image, - 32, - core.getBlockInfo(enemyInfo.id).posY * 32, - 32, - 32, - enemynow - 16, - 64, - 32, - 32 - ); - } else { + core.drawIcon(ctx, v.id, vnow - 16, 64, 32, 32); + }); + if (!attack) heroInfo.now += (heroInfo.speed / oneTurn) * 215; + let heronow = Math.min(100 + heroInfo.now, 315); + ctx.beginPath(); + ctx.moveTo(heronow, 100); + ctx.lineTo(heronow + 3, 90); + ctx.lineTo(heronow - 3, 90); + ctx.closePath(); + ctx.fill(); + core.drawImage(ctx, "hero.webp", 0, 0, 32, 19, heronow - 16, 70, 32, 19); - core.drawImage( - ctx, - core.getBlockInfo(enemyInfo.id).image, - 32, - core.getBlockInfo(enemyInfo.id).posY * 48, - 32, - 19, - enemynow - 16, - 70, - 32, - 19 - ); - } - core.drawLine(ctx, 100, 105, 315, 105, '#FFFFFF', 5) - equipInfo.forEach(function (v) { - if (!attack) v.now += v.speed / oneTurn * 215 - let vnow = Math.min(100 + v.now, 315) - ctx.beginPath() - ctx.moveTo(vnow, 100) - ctx.lineTo(vnow + 3, 90) - ctx.lineTo(vnow - 3, 90) - ctx.closePath() + if (heroInfo.now >= 215 && !heroInfo.isAttack) { + heroInfo.isAttack = true; + animateOnAttack("sword", true, () => { + heroInfo.now -= 215; + heroInfo.isAttack = false; + }); + } + if (enemyInfo.now >= 215 && !enemyInfo.isAttack) { + enemyInfo.isAttack = true; + animateOnAttack("sword", false, () => { + enemyInfo.now -= 215; + enemyInfo.isAttack = false; + }); + } + equipInfo.forEach((v) => { + if (v.now >= 215 && !v.isAttack) { + v.isAttack = true; - ctx.fill() + animateOnAttack("sword", true, () => { + v.now -= 215; + v.isAttack = false; + }); + } + }); + }; - core.drawIcon(ctx, - v.id, - vnow - 16, - 64, - 32, - 32) + function animateOnAttack(name, onenemy, callback) { + if (onenemy) { + core.playanimate(name, 290, 160, null, 1, 1, callback); + } else { + core.playanimate(name, 130, 160, null, 1, 1, callback); + } + } - }) - if (!attack) heroInfo.now += heroInfo.speed / oneTurn * 215 - let heronow = Math.min(100 + heroInfo.now, 315) - ctx.beginPath() - ctx.moveTo(heronow, 100) - ctx.lineTo(heronow + 3, 90) - ctx.lineTo(heronow - 3, 90) - ctx.closePath() + 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_spell = core.getRealStatusOrDefault(hero, "spell"), + hero_matk = core.getRealStatusOrDefault(hero, "matk"), + hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), + hero_speed = core.getRealStatusOrDefault(hero, "speed"), + hero_hpmax = core.getRealStatusOrDefault(hero, "hpmax"), + hero_mhp = core.getRealStatusOrDefault(hero, "mhp"); + const heroInfo = { + hp: hero_hp, + hpmax: hero_hpmax, + atk: hero_atk, + def: hero_def, + spell: hero_spell, + mhp: hero_mhp, + matk: hero_matk, + mdef: hero_mdef, + speed: hero_speed, + now: 0, + isAttack: false, + }; + enemyInfo.id = enemyId; + enemyInfo.cls = core.getClsFromId(enemyId); + enemyInfo.name = core.material.enemys[enemyId].name; + enemyInfo.now = 0; + enemyInfo.isAttack = false; + let oneTurn = heroInfo.speed + enemyInfo.speed; + if (equipInfo.length > 0) { + for (let i; i < equipInfo.length - 1; i++) { + equipInfo[i].now = 0; + equipInfo[i].isAttack = false; + oneTurn += equipInfo[i].speed; + } + } + oneTurn *= 25; + let time = 0, + farme = 0; - ctx.fill() - core.drawImage(ctx, - "hero.webp", - 0, - 0, - 32, - 19, - heronow - 16, - 70, - 32, - 19) - - if (heroInfo.now >= 215 && !heroInfo.isAttack) { - heroInfo.isAttack = true; - animateOnAttack("sword", true, () => { - heroInfo.now -= 215 - heroInfo.isAttack = false - - }) - - } - if (enemyInfo.now >= 215 && !enemyInfo.isAttack) { - enemyInfo.isAttack = true - animateOnAttack("sword", false, () => { - enemyInfo.now -= 215 - enemyInfo.isAttack = false - - }) - } - equipInfo.forEach(v => { - if (v.now >= 215 && !v.isAttack) { - v.isAttack = true - - animateOnAttack("sword", true, () => { - v.now -= 215 - v.isAttack = false - - }) - } - }) - }; - - function animateOnAttack(name, onenemy, callback) { - if (onenemy) { - core.playanimate(name, 290, 160, null, 1, 1, callback) - } else { - core.playanimate(name, 130, 160, null, 1, 1, callback) - } - } - - 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_spell = core.getRealStatusOrDefault(hero, "spell"), - hero_matk = core.getRealStatusOrDefault(hero, "matk"), - hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), - hero_speed = core.getRealStatusOrDefault(hero, "speed"), - hero_hpmax = core.getRealStatusOrDefault(hero, "hpmax"), - hero_mhp = core.getRealStatusOrDefault(hero, "mhp"); - const heroInfo = { - hp: hero_hp, - hpmax: hero_hpmax, - atk: hero_atk, - def: hero_def, - spell: hero_spell, - mhp: hero_mhp, - matk: hero_matk, - mdef: hero_mdef, - speed: hero_speed, - now: 0, - isAttack: false - }; - enemyInfo.id = enemyId; - enemyInfo.cls = core.getClsFromId(enemyId); - enemyInfo.name = core.material.enemys[enemyId].name; - enemyInfo.now = 0; - enemyInfo.isAttack = false - let oneTurn = heroInfo.speed + enemyInfo.speed; - if (equipInfo.length > 0) { - for (let i; i < equipInfo.length - 1; i++) { - equipInfo[i].now = 0 - equipInfo[i].isAttack = false - oneTurn += equipInfo[i].speed; - } - } - oneTurn *= 25; - let time = 0, - farme = 0; - - - - core.registerAnimationFrame("attackAnimate", true, (temptime) => { - if (temptime - time > 1000 / 60) { - time = temptime; - this.drawAttackAnimate( - heroInfo, - oneTurn, - enemyInfo, - equipInfo, - farme, - damageInfo - ); - farme++; - } - }); - }; -}, + core.registerAnimationFrame("attackAnimate", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + this.drawAttackAnimate( + heroInfo, + oneTurn, + enemyInfo, + equipInfo, + farme, + damageInfo + ); + farme++; + } + }); + }; + }, "剧情内容": function () { - // 在此增加新插件 - // 每项为一个数组,第一项是名字,第二项是对话内容 - // 回放只会在同一个this下回放,进入剧情前请以事件块声明进入哪个剧情数组 - // 可以自由添加,但不能与已有插件及函数名相同,可以使用中文。 - this.chapter0 = [ - ["", "这些天,街道不曾下雨。"], - ["", "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。"], - ["", "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。"], - ["", "扑哧。"], - ["", "耳旁再次响起象征着某个女孩子死去的声音。"], - ["", "再一次——"], - ["", "再一次。"], - ["", "女子们被肢解成单纯的肉块。"], - ["", "我任由流下的血浸满全身,屏住自己的呼吸。"], - ["", "祈求自己能拥有从猎人手中逃脱的幸运。"], - ["", "扑哧。"], - ["", "直到刚才,我们还坐在去往娼馆的马车的路上。"], - ["", "而在这之中的某些人,已经不在这个世上了。"], - ["", "不,应该把“某些”换成“几乎所有”才更为恰当吧。"], - ["", "恐怕,不久之后我也会变成小巷中血腥的装饰品。"], - ["", "我是为了得到这种死法,才辛苦苟活至今的吗?"], - ["", "来个人告诉我啊——"], - ["", "谁都好。"], - ["", "来人啊!!"], - ["少女", "「呃······!?」"], //小动物01 - ["", "漆黑的物体充斥了我的整个视野"], - ["", "我很快意识到,那是只很大的脚。"], - ["", "必须要出声求救。"], - ["", "可是,耳中却只能听到自己的牙关不停交战的声音。"], - ["", "我是如此的无助。"], - ["", "逃跑也好,道歉也罢。"], - ["", "就连抬头看一眼将要杀掉我的人的面孔都做不到。"], - ["少女", "「······被杀」"], //小动物02 - ["", "会被杀。"], - ["", "会被杀!!"], - ["", "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。"], - ["少女", "「不,不要······」"], //小动物03 - ["", "浮游都市,《诺瓦斯·艾蒂尔》。"], - ["", "《特别受灾地区》——"], - ["", "通称,《牢狱》"], - ["", "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。"], - ["年轻人", "「放开我!」"], //龙套1-01 - ["年轻人", "「我只是在帮那个女人而已!」"], //龙套1-02 - ["年轻人", "「你们没听到吗!?」"], //龙套1-03 - ["年轻人", "「她是被受骗才会被卖到娼馆来的」"], //龙套1-04 - ["年轻人", "「用肮脏的手段把钱借给她父母的,就是你们这些家伙吧!?」"], //龙套1-05 - ["年轻人", "「给我说些什么啊」"], //龙套1-06 - ["凯伊姆", "「这些话等到了娼馆再说吧」"], //男主01 - ["凯伊姆", "「我来抓你,只是受雇于人而已」"], //男主02 - ["", "我走进娼馆《莉莉乌姆》的接待室。"], - ["", "正在桌旁整理账簿的奥兹停下手头的工作,抬起头向我看来。"], - ["奥兹", "「这不是凯伊姆先生吗,辛苦了」"], //金锁高官01 - ["奥兹", "「委托已经完成了吗?」"], //金锁高官02 - ["凯伊姆", "「啊啊,是这家伙没错吧」"], //男主03 - ["", "奥兹用只要接触到就能杀人般的眼神在男人脸上搜过。"], - ["奥兹", "「没错,就是这个人」"], //金锁高官03 - ["凯伊姆", "「是么」"], //男主04 - ["年轻人", "「你,你们要对我做什么」"], //龙套1-07 - ["奥兹", "「······」"], //金锁高官04 - ["", "奥兹用一个眼神,就让男人闭上了嘴。"], - ["", "然后,向我这边转过身来。"], - ["奥兹", "「抱歉啊,总是麻烦你去做这些无聊的事」"], //金锁高官05 - ["奥兹", "「都怪我们这边的年轻人太没用」"], //金锁高官06 - ["凯伊姆", "「客套话就免了」"], //男主05 - ["奥兹", "「这还真是失礼了」"], //金锁高官07 - ["奥兹", "「喂,来个人」"], //金锁高官08 - ["光头男人", "「是」"], //龙套2-01 - ["奥兹", "「凯伊姆先生做完工作回来了」"], //金锁高官09 - ["光头男人", "「是,是,那个······」"], //龙套2-02 - ["奥兹", "「我是要你拿些酒来,这个蠢材!」"], //金锁高官10 - ["", "喀!"], - ["", "奥兹扔出的烟灰缸砸中了手下的额头。"], - ["", "鲜血四溅。"], - ["凯伊姆", "「不用这么麻烦」"], //男主06 - ["凯伊姆", "「我接下来要去《菲诺列塔》」"], //男主07 - ["奥兹", "「喔唷」"], //金锁高官11 - ["奥兹", "「既然如此,我就不留您在这里喝难饮的劣质酒了」"], //金锁高官12 - ["", "奥兹斜眼看着正捂住额头呻吟的手下,轻描淡写地说道。"], - ["凯伊姆", "「用这些钱去买药」"], //男主08 - ["", "我将几枚铜钱仍在那个手下的身前。"], - ["奥兹", "「凯伊姆先生,不用对他们这么好」"], //金锁高官13 - ["凯伊姆", "「无妨」"], //男主09 - ["凯伊姆", "「话说回来,那个要落跑的女人呢?」"], //男主10 - ["奥兹", "「我把她交给那些年轻人了,现在应该正在体会人生的严苛吧」"], //金锁高官14 - ["奥兹", "「正好,趁此机会凯伊姆先生也来享受一番如何?」"], //金锁高官15 - ["年轻人", "「你,你们这些家伙,要对她做什么!?」"], //龙套1-08 - ["", "咣!"], - ["", "奥兹给了他一拳。"], - ["", "一击即倒。"], - ["", "喀,咚,咯!"], - ["", "奥兹毫不留情地向男人的脸上踩去。"], - ["年轻人", "「咕······呃咳······」"], //龙套1-09 - ["", "折断的牙齿伴着血泡被吐出。"], - ["", "这份白色在鲜红色的液体中格外显眼。"], - ["年轻人", "「你们以为做出这种事······卫兵会坐视不理吗······」"], //龙套1-10 - ["奥兹", "「啊啊,不会坐视不理的」"], //金锁高官16 - ["奥兹", "「应该会拿出你的钱包,和我们商量如何瓜分吧」"], //金锁高官17 - ["年轻人", "「那,那种事······」"], //龙套1-11 - ["", "这在牢狱是理所当然的事。"], - ["奥兹", "「怎么,头一回来牢狱么?」"], //金锁高官18 - ["", "男人点了点头。"], - ["奥兹", "「为了被骗的女人而来到牢狱,真是个规矩人啊」"], //金锁高官19 - ["奥兹", "「······前提是,被骗的人不是你」"], //金锁高官20 - ["年轻人", "「你说······我被骗了?」"], //龙套1-12 - ["年轻人", "「那,那是怎么回事!?」"], //龙套1-13 - ["奥兹", "「不用急,今天晚上会好好告诉你的」"], //金锁高官21 - ["", "奥兹抓起男人的脸。"], - ["", "为引诱客人的怜悯之心而装纯,是娼妇的惯用手段。"], - ["", "双亲被骗而借钱,结果作为抵押而将自己卖到这里,这是典型的说法。"], - [ - "", - "如果只是头脑发热而成为常客也就罢了,这次的男人热血过头,居然想出了要带女人私奔的计划。", - ], - [ - "", - "虽然女人半开玩笑地予以拒绝,但不知天高地厚的这家伙还是拉着她逃跑了。", - ], - ["", "不过,想要逃脱追击本来就是不可能的任务。"], - ["", "但即便如此,这种事情还是会一再的出现。"], - ["", "说谎的女人和被骗的男人。"], - ["", "在娼馆街,这是令人看到生厌的日常的风景。"], - ["凯伊姆", "「我要走了」"], //男主11 - ["奥兹", "「好的,下次再麻烦您」"], //金锁高官22 - ["奥兹", "「之后吉克先生会将谢礼交给您的」"], //金锁高官23 - ["凯伊姆", "「啊啊」"], //男主12 - ["", "我背向奥兹走出娼馆。"], - ["凯伊姆", "「······?」"], //男主13 - ["", "从远方传来微弱的歌声。"], - ["", "是关卡广场的方向。"], - ["", "对了。"], - ["", "今天有觐见圣女的仪式。"], - ["", "当代的圣女伊莲——"], - ["", "俗称《盲眼之圣女》,据说即使在历代的圣女中,人气也是数一数二的。"], - ["", "广场上的人估计相当多吧。"], - ["", "虽然我也想去看看她长什么样,不过要在人潮中挤来挤去就免了。"], - ["", "还是老老实实去菲诺列塔喝烧酒吧。"], - ["", "正当我这样想着的时候,一个身影自小巷的那头走来。"], - ["凯伊姆", "「艾莉斯」"], //男主14 - ]; - this.chapter01 = [ - ["艾莉斯", "「啊,凯伊姆」"], //医生00.5 - ["艾莉斯", "「正好,我还想要去找你呢」"], //医生01 - ["艾莉斯", "「没想到凯伊姆会主动出现······这是命运吗?」"], //医生02 - ["凯伊姆", "「显然不是吧」"], //男主15 - ["艾莉斯", "「啊,是么」"], //医生03 - ["", "艾莉斯挑了挑整齐的双眉,微微地哼了一声。"], - [ - "", - "虽然是个相当引人注目的美人,但她这个将亲切儿子丢入无底深渊的性格,为自己扣了不少的分", - ], - ["", "给人印象最深的,就是那潭水般的双瞳。"], - ["", "在漆黑的瞳孔中,完全看不出感情的波动。"], - ["艾莉斯", "「喜欢我的眼睛吗?」"], //医生04 - ["艾莉斯", "「如果想要的话就给你吧?」"], //医生05 - ["凯伊姆", "「用不着」"], //男主16 - ["艾莉斯", "「阿拉,可惜」"], //医生06 - ["凯伊姆", "「那么,找我有什么事」"], //男主17 - ["艾莉斯", "「梅尔特的钱好像被偷了」"], //医生07 - ["凯伊姆", "「钱被偷了?都几岁了还这么没用」"], //男主18 - ["艾莉斯", "「不要对我说啊」"], //医生08 - ["凯伊姆", "「那家伙,该不会说要让我去抓那个小偷吧?」"], //男主19 - ["艾莉斯", "「就是这样」"], //医生09 - ["凯伊姆", "「笨蛋吗」"], //男主20 - ["凯伊姆", "「如果是小钱的话,就当做是买个教训吧」"], //男主21 - ["艾莉斯", "「说起来,被盗的是这个月的上纳金」"], //医生10 - ["凯伊姆", "「你说什么?」"], //男主22 - ["艾莉斯", "「用这些钱买教训,也太过奢侈了呢」"], //医生11 - ["凯伊姆", "「知道了,我去找」"], //男主23 - ["凯伊姆", "「小偷的特征呢」"], //男主24 - ["艾莉斯", "「男孩子」"], //医生12 - ["艾莉斯", "「······而且,背后有翅膀」"], //医生13 - ["艾莉斯", "「虽然姑且是藏在身后,但是仔细观察的话是很明显的」"], //医生14 - ["凯伊姆", "「羽化病吗」"], //男主25 - [ - "艾莉斯", - "「那些人可是毫不留情的,所以即使是为了那个孩子,也要赶快抓到他」", - ], //医生15 - ["凯伊姆", "「注意到他逃窜的方向了吗?」"], //男主26 - ["艾莉斯", "「广场那边」"], //医生16 - ["艾莉斯", "「虽然刚才《不蚀金锁》的人去追了,不过多半是······」"], //医生17 - ["凯伊姆", "「偏偏还是广场吗」"], //男主28 - ["艾莉斯", "「今天是觐见圣女大人的日子」"], //医生18 - ["凯伊姆", "「我知道」"], //男主29 - ["凯伊姆", "「尽量找找看就好」"], //男主30 - ]; - this.chapter02 = [ - ["不蚀金锁成员", "「凯伊姆先生,凯伊姆先生」"], - ["不蚀金锁成员", "「您已经和艾莉斯大夫见过面了吗?」"], - ["凯伊姆", "「啊啊,所以才会追过来的」"], //男主31 - ["凯伊姆", "「看到小偷了吗?」"], //男主32 - [ - "不蚀金锁成员", - "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", - ], - [ - "不蚀金锁成员", - "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", - ], - ["不蚀金锁成员", "「我已经准备撤退了」"], - ["不蚀金锁成员", "「凯伊姆先生还要继续追吗?」"], - ["凯伊姆", "「啊啊」"], //男主33 - ["", "做完情报交换之后,我跟男人道别。"], - ["凯伊姆", "「和我想的一样啊······」"], //男主34 - ["", "在牢狱中最大的广场上,聚集着看不到尽头的人群。"], - ["", "就算是来参见圣女祈祷,这人数也太多了点吧。"], - ["", "自然,我也找不到逃跑的孩子。"], - ["", "是混杂到人群中了吧。"], - ["", "如果已经从广场上脱身了的话,就更难发现了。"], - ["", "只好赌他还在这里了。"], - ["", "我先移动到了一个视野良好的地方。"], - ["", "从这里,一眼就可以看到人群的变化。"], - ["", "广场还是沸腾起来。"], - ["", "抬头望去,原来是在天台之上出现了一个人影"], - ["", "但是,与周围的期待不同,现身的是一名中年的神官。"], - ["", "骂声四溢。"], - ["", "神官则是笑着摆正衣领"], - ["神官", "「从现在开始,举行谒见的仪式」"], - [ - "神官", - "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", - ], - [ - "神官", - "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", - ], - [ - "神官", - "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", - ], - [ - "神官", - "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", - ], - ["神官", "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」"], - ["圣女", "「不忘感谢与祈祷,神才会拯救我们」"], - ["圣女", "「与我一起,向神虔诚地祈祷吧」"], - ["", "广场上欢声雷动。"], - ["", "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。"], - ["", "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。"], - ["", "她掌握着这条街道,还有在这条街上生活的人的命运。"], - ["", "比起揽得人气,她更想要为了街道的继续存在而献出全力。"], - ["", "也是为了不让《大崩落》的惨剧再度发生。"], - ["", "十几年前的那场悲剧。"], - [ - "", - "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", - ], - ["凯伊姆", "「······」"], //男主35 - ["", "这时我才想起,现在不是我在这里看圣女的时候。"], - ["女声", "「——っ!?」"], - ["围观的女人", "「羽,羽化病人!?」"], - ["围观的中年人", "「喂,谁去叫下羽狩」"], - ["惊慌的观众", "「你这家伙不要靠近我,要是传染了可怎么办」"], - ["粗鲁的观众", "「你这小鬼赶快滚开」"], - ["凯伊姆", "「接下来」"], - ["圣女", "「发生什么事了?看上去似乎很嘈杂」"], - ["随从", "「似乎是某个人逃跑了······具体的我也不是很清楚」"], - ["神官", "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」"], - ["圣女", "「不用在意我,比起那个,我更关心究竟发生了什么事」"], - ["神官", "「对不起,我真的不知道」"], - ["圣女", "「······是吗」"], - ["男", "「恕我僭越,请准许我说明情况」"], - ["男", "「在来觐见的人群中出现了《羽化病》的患者」"], - ["男", "「围观的人群因而产生了骚动」"], - [ - "男", - "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", - ], - ["圣女", "「羽化病······」"], - ["男", "「怎么了?」"], - ["圣女", "「没什么」"], - ["圣女", "「辛苦了,你的名字是?」"], - ["男", "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」"], - ["神官", "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」"], - ["神官", "「阁下是在工作上相当出色的人呢」"], - ["鲁基乌斯", "「不敢当」"], - [ - "鲁基乌斯", - "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", - ], - [ - "圣女", - "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", - ], - ["鲁基乌斯", "「属下不胜惶恐」"], - ["鲁基乌斯", "「接下来属下还要回到工作岗位上,在这里就先告退了」"], - ["圣女", "「鲁基乌斯先生」"], - ["鲁基乌斯", "「属下在」"], - ["圣女", "「你是怎样看待羽狩的工作的呢?」"], - ["神官", "「圣,圣女大人」"], - [ - "鲁基乌斯", - "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", - ], - ["神官", "「不,不亏是鲁基乌斯卿,相当优秀的想法」"], - ["圣女", "「是吗。辛苦你了」"], - ["随从", "「圣女大人······」"], - ["鲁基乌斯", "「······」"], - ["鲁基乌斯", "「那么,属下就回岗位去了」"], - ]; - this.chapter03 = [ - ["", "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。"], - ["", "显然,他并没有想到我会捷足先登吧。"], - ["", "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。。"], - ["凯伊姆", "「辛苦你了」"], //男主37 - ["羽化病患少年", "「稀!?」"], - ["凯伊姆", "「逃到贫民区是个不错的想法」"], //男主38 - ["羽化病患少年", "「你,你是,羽狩吗?」"], - ["凯伊姆", "「不是」"], //男主39 - ["羽化病患少年", "「什,什么啊······混蛋,不要吓我啊」"], - ["凯伊姆", "「我对令你受惊这件事致以歉意」"], //男主40 - ["凯伊姆", "「作为回报,麻烦你把从店里偷的钱交出来吧」"], //男主41 - ["羽化病患少年", "「钱?你在说什么」"], - ["凯伊姆", "「你要找的腰上的东西,掉在你身后了」"], //男主42 - ["羽化病患少年", "「哎?」"], - ["羽化病患少年", "「呃呀」"], - ["羽化病患少年", "「你······你这混蛋」"], - ["凯伊姆", "「······」"], //男主43 - ["凯伊姆", "「把偷的钱交出来」"], //男主44 - ["羽化病患少年", "「我不知道你在······咕」"], - ["羽化病患少年", "「你,你说是我偷的······有什么证据吗」"], - ["凯伊姆", "「你还挺倔的啊」"], //男主45 - ["凯伊姆", "「不过,给我听好了」"], //男主46 - ["凯伊姆", "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」"], //男主47 - ["凯伊姆", "「而且,钱的主人是从前和吉克颇有渊源的女人」"], //男主48 - ["羽化病患少年", "「吉克?」"], - ["凯伊姆", "「他是《不蚀金锁》的主人,这么说你就明白了吧」"], //男主49 - ["羽化病患少年", "「哎?哎?怎么会······」"], - ["凯伊姆", "「再问你一遍,钱在哪里?」"], //男主50 - ["羽化病患少年", "「是,是,是,在我的怀里」"], - ["凯伊姆", "「你没有擅自拿掉一部分吧」"], //男主51 - ["羽化病患少年", "「是,是的」"], - ["羽化病患少年", "「那,那个,您是《不蚀金锁》的人吗?」"], - ["凯伊姆", "「算是吧」"], //男主52 - ["羽化病患少年", "「我什么都可以做,请您一定要帮帮我」"], - ["凯伊姆", "「抱歉,我并没有兴趣去帮助他人」"], //男主53+54 - ["羽化病患少年", "「我什么······什么,都会做的······」"], - ["羽化病患少年", "「我一直都是生活在下层的」"], - [ - "羽化病患少年", - "「可是,不知何时染上了羽化病······背后长出了翅膀······」", - ], - ["羽化病患少年", "「被寄宿工作的店赶了出来,只得流落到牢狱这里」"], - ["羽化病患少年", "「因为独自实在是饿的不行了,所以才会偷这些钱的」"], - [ - "羽化病患少年", - "「我明明没有做任何坏事······为什么······会遇到这种事······」", - ], - ["凯伊姆", "「谁知道」"], //男主55 - ["羽化病患少年", "「呜······呜呜······接下来,要对我做什么?」"], - ["凯伊姆", "「我要把你带到组织那里」"], //男主56 - ["羽化病患少年", "「怎,怎么这样」"], - ["凯伊姆", "「不过,那样做的前提是你不是羽化病人」"], - ["凯伊姆", "「组织也没有笨到把羽化病人招待到家里的程度」"], - ["羽化病患少年", "「那么,是要放我逃走吗?」"], - ["凯伊姆", "「我要让你学到教训」"], - ["凯伊姆", "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」"], - ["凯伊姆", "「你的运气不错」"], - ["羽化病患少年", "「唔······啊,是的······」"], - ["凯伊姆", "「滚」"], - ["羽化病患少年", "「非常感谢」"], - ["羽化病患少年", "「唔啊!?」"], - ["男", "「到这里就结束了,羽化病人」"], - ["男", "「确认他的翅膀」"], - ["", "趁还没有被卷入麻烦的事情之前,赶快离开这里吧"], - ["羽狩的队长", "「那边的那个人」"], - ["凯伊姆", "「······有什么事?」"], - ["羽狩的队长", "「可以稍微让我问几句话吗」"], - ["凯伊姆", "「······」"], - ["凯伊姆", "「啊啊,无妨」"], - ["羽狩的队长", "「感谢您的合作」"], - ["", "队长殷勤地致以谢礼。"], - ["", "而在他的眼前,少年的衣服已经被他的补下们扯破。"], - ["", "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。"], - ["红发的羽狩", "「副队长,确认翅膀的持有了」"], - ["羽狩的副队长", "「保护他」"], - ["羽化病患少年", "「不要······请原谅,我······」"], - [ - "羽狩的副队长", - "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", - ], - ["羽化病患少年", "「可是,可是」"], - ["羽狩的副队长", "「没关系的」"], - ["羽化病患少年", "「······哥,哥哥」"], - ["羽狩的副队长", "「你是羽化病人的亲属吗?」"], - ["凯伊姆", "「只是路人而已」"], - ["凯伊姆", "「顺带一提,我也没有打算找你们的麻烦」"], - [ - "羽狩的副队长", - "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", - ], - ["羽狩的副队长", "「我的一个部下就此永久失去了半截胳膊」"], - ["凯伊姆", "「我表示同情」"], - ["凯伊姆", "「我马上就会消失的,这样就没问题了吧?」"], - ["羽狩的副队长", "「嘛,不要这么慌张」"], - ["", "副队长看着羽化的少年。"], - ["羽狩的副队长", "「你与这个人是什么关系?没有被他殴打吗?」"], - ["羽化病患少年", "「没,没有」"], - [ - "羽狩的副队长", - "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", - ], - ["羽化病患少年", "「······」"], - ["羽化病患少年", "「那个人,是《不蚀金锁》的组织成员······」"], - ["羽化病患少年", "「突然说让我拿出钱来,我刚一拒绝他就打我」"], - ["羽狩的副队长", "「原来如此······」"], - [ - "羽狩的副队长", - "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", - ], - ["凯伊姆", "「当然不是」"], - ["凯伊姆", "「我只是从那里接受工作而已,并不是他们的成员」"], - ["羽狩的副队长", "「你的意思是说,少年在说谎吗?」"], - ["凯伊姆", "「啊啊」"], - [ - "凯伊姆", - "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", - ], - ["羽狩的副队长", "「就算我去询问,也无法从他们那里得到事实」"], - [ - "羽狩的副队长", - "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", - ], - ["凯伊姆", "「真是辛苦啊」"], - ["羽狩的副队长", "「说的是啊」"], - ["羽狩的副队长", "「其实,砍下我部下胳膊的似乎也是组织的成员呢」"], - [ - "羽狩的副队长", - "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", - ], - [ - "羽狩的副队长", - "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", - ], - ["羽狩的副队长", "「那和整条街道的和平也是紧密相关的吧?」"], - ["凯伊姆", "「我知道,你们有逮捕干扰狩猎羽化病人的权力」"], - [ - "凯伊姆", - "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", - ], - ["羽狩的副队长", "「那些话,我们会在看守所对你详细说明的」"], - ["凯伊姆", "「······」"], - ["", "在这里起争执的话,就会被羽狩加害。"], - ["", "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。"], - ["", "就算逃跑,也没有好的结果。"], - ["", "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。"], - ["", "发生了什么事······"], - ["???", "「我认为,那位先生是正确的」"], - ["", "羽狩们一起回头。"], - ["", "而在他们视线的焦点处,"], - ["", "伫立着一位女性。"], - ["", "在端正的容颜下,代表着强烈意志的双眉十分显眼。"], - ["", "身体的柔软与紧紧包裹在其身上的羽狩制服,两者显得十分的不搭配。"], - ["", "我还是第一次看到女性的羽狩。"], - ["羽狩的副队长", "「队长,这是获得《不蚀金锁》情报的好机会」"], - [ - "羽狩的队长", - "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", - ], - ["兰格副队长", "「我并没有打算去恫吓他······」"], - ["羽狩的队长", "「告诉我那个被砍掉胳膊的队员的名字」"], - ["羽狩的队长", "「我会去探望他的」"], - ["兰格副队长", "「那个是······」"], - ["羽狩的队长", "「我知道,你一直在为有所收获而努力工作」"], - ["羽狩的队长", "「但是,正因为我们的工作是为民众提供帮助」"], - ["羽狩的队长", "「所以就更不能损害人与人之间的信赖」"], - ["兰格副队长", "「我会铭记在心」"], - ["羽狩的队长", "「这位先生,我的部下失礼了」"], - ["凯伊姆", "「只要不对我再来一次就好」"], - ["羽狩的队长", "「请稍等」"], - ["凯伊姆", "「有什么事?」"], - ["羽狩的队长", "「我想确认一件事」"], - ["羽狩的队长", "「你真的不是《不蚀金锁》的成员吗?」"], - ["凯伊姆", "「真的」"], - ["凯伊姆", "「如果我说是的话,你有什么打算?」"], - ["羽狩的队长", "「我听过传闻,说他们是用依靠暴力而得的钱在生活」"], - ["凯伊姆", "「······这样啊」"], - ["凯伊姆", "「如果能有收获就好了啊」"], - ]; - this.chapter04 = [ - ["梅尔特", "「欢迎光临」"], - ["梅尔特", "「辛苦了」"], - ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」"], - ["凯伊姆", "「没什么,比想象中完成的更容易」"], - ["梅尔特", "「那就好」"], - ["梅尔特", "「这是我的一点谢意」"], - ["凯伊姆", "「味道有些变化啊」"], - ["梅尔特", "「啊,被发现了?」"], - ["梅尔特", "「最近,没能到手什么好的原料呢」"], - ["凯伊姆", "「去拜托吉克如何?」"], - [ - "梅尔特", - "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", - ], - ["凯伊姆", "「那希望你也不要来麻烦我」"], - ["梅尔特", "「那 是 两 码 事」"], - ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」"], - [ - "梅尔特", - "「而且,自己的钱被偷了这么害羞的事,向凯伊姆意外的其他人都说不出口」", - ], - ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」"], - ["梅尔特", "「这是面子问题啊,面子问题」"], - ["凯伊姆", "「嘛,算了」"], - ["凯伊姆", "「这样就好了吧?」"], - ["梅尔特", "「这是钱包呢」"], - ["梅尔特", "「嗯,东西没少」"], - ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」"], - ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」"], - ["凯伊姆", "「在那边不是来钱更快吗?」"], - ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」"], - ["凯伊姆", "「这是客套话而已」"], - ["梅尔特", "「欺负人」"], - ["梅尔特", "「总而言之,今天帮大忙了」"], - ["梅尔特", "「谢礼嘛······」"], - ["凯伊姆", "「就记在账单上吧」"], - ["梅尔特", "「了解—盛谢惠顾了哦?」"], - ["", "喀啷喀啷"], - ["", "门铃响起"], - ["", "喧哗瞬间安静下来。"], - ["", "进来的人是吉克。"], - ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], - ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], - ["吉克", "「各位继续吧」"], - ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], - ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。"], - ["凯伊姆", "「不用介意」"], - ["", "吉克轻轻点了点头,在我右边坐了下来"], - ["凯伊姆", "「逃跑的男人怎么样了?」"], - ["吉克", "「嗯?已经不在这个世上了」。"], - ["吉克", "「有什么想要知道的事吗?」"], - ["凯伊姆", "「不,没什么」"], - ["吉克", "「那个无聊的家伙,完全没有趣味呢」"], - ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」"], - ["凯伊姆", "「真是灾难啊」"], - ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」"], - ["凯伊姆", "「消息真灵通」"], - ["吉克", "「梅尔特也注意点」"], - ["吉克", "「你丢钱已经不是一回两回了」"], - ["梅尔特", "「好的—我会注意的。」"], - ["梅尔特", "「吉克还是平常的点单吧」"], - ["梅尔特", "「凯伊姆要再来一杯吗?」"], - ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], - ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], - ["吉克", "「这是抓捕逃跑男人的报酬」"], - ["凯伊姆", "「下次有什么事再告诉我」"], - ["梅尔特", "「来,久等了」"], - ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」"], - ["吉克", "「让我猜猜看」"], - ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」"], - ["梅尔特", "「可惜—」"], - ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」"], - ["凯伊姆", "「完全把你当成新进的女佣了么」"], - ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」"], - ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」"], - ["凯伊姆&吉克", "「你傻啊」"], - ["梅尔特", "「异口同声呢,不亏是兄弟」"], - ["凯伊姆", "「别用这种称呼,怪恶心的」"], - ["吉克", "「说得没错」"], - ["吉克", "「······说起来······」"], - ["梅尔特", "「怎么了?」"], - ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」"], - ["凯伊姆", "「你也说这么无聊的话题」"], - ["吉克", "「不,这是很重要的事情」"], - ["吉克", "「梅尔特,事实是怎么样的?」"], - ["梅尔特", "「啊~是怎么样的呢~」"], - ["梅尔特", "「我忘记了」"], - ["吉克", "「骗人」"], - ]; -} + // 在此增加新插件 + // 每项为一个数组,第一项是名字,第二项是对话内容 + // 回放只会在同一个this下回放,进入剧情前请以事件块声明进入哪个剧情数组 + // 可以自由添加,但不能与已有插件及函数名相同,可以使用中文。 + this.chapter0 = [ + ["", "这些天,街道不曾下雨。"], + ["", "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。"], + ["", "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。"], + ["", "扑哧。"], + ["", "耳旁再次响起象征着某个女孩子死去的声音。"], + ["", "再一次——"], + ["", "再一次。"], + ["", "女子们被肢解成单纯的肉块。"], + ["", "我任由流下的血浸满全身,屏住自己的呼吸。"], + ["", "祈求自己能拥有从猎人手中逃脱的幸运。"], + ["", "扑哧。"], + ["", "直到刚才,我们还坐在去往娼馆的马车的路上。"], + ["", "而在这之中的某些人,已经不在这个世上了。"], + ["", "不,应该把“某些”换成“几乎所有”才更为恰当吧。"], + ["", "恐怕,不久之后我也会变成小巷中血腥的装饰品。"], + ["", "我是为了得到这种死法,才辛苦苟活至今的吗?"], + ["", "来个人告诉我啊——"], + ["", "谁都好。"], + ["", "来人啊!!"], + ["少女", "「呃······!?」", "aiy010000010.opus"], //小动物01 + ["", "漆黑的物体充斥了我的整个视野"], + ["", "我很快意识到,那是只很大的脚。"], + ["", "必须要出声求救。"], + ["", "可是,耳中却只能听到自己的牙关不停交战的声音。"], + ["", "我是如此的无助。"], + ["", "逃跑也好,道歉也罢。"], + ["", "就连抬头看一眼将要杀掉我的人的面孔都做不到。"], + ["少女", "「······被杀」", "aiy010000020.opus"], //小动物02 + ["", "会被杀。"], + ["", "会被杀!!"], + ["", "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。"], + ["少女", "「不,不要······」", "aiy010000030.opus"], //小动物03 + ["", "浮游都市,《诺瓦斯·艾蒂尔》。"], + ["", "《特别受灾地区》——"], + ["", "通称,《牢狱》"], + ["", "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。"], + ["年轻人", "「放开我!」", "aiy710000010.opus"], //龙套1-01 + ["年轻人", "「我只是在帮那个女人而已!」", "aiy710000020.opus"], //龙套1-02 + ["年轻人", "「你们没听到吗!?」", "aiy710000030.opus"], //龙套1-03 + ["年轻人", "「她是被受骗才会被卖到娼馆来的」", "aiy710000040.opus"], //龙套1-04 + [ + "年轻人", + "「用肮脏的手段把钱借给她父母的,就是你们这些家伙吧!?」", + "aiy710000050.opus", + ], //龙套1-05 + ["年轻人", "「给我说些什么啊」", "aiy710000060.opus"], //龙套1-06 + ["凯伊姆", "「这些话等到了娼馆再说吧」", "aiy310000010.opus"], //男主01 + ["凯伊姆", "「我来抓你,只是受雇于人而已」", "aiy310000020.opus"], //男主02 + ["", "我走进娼馆《莉莉乌姆》的接待室。"], + ["", "正在桌旁整理账簿的奥兹停下手头的工作,抬起头向我看来。"], + ["奥兹", "「这不是凯伊姆先生吗,辛苦了」", "aiy350000010.opus"], //金锁高官01 + ["奥兹", "「委托已经完成了吗?」", "aiy350000020.opus"], //金锁高官02 + ["凯伊姆", "「啊啊,是这家伙没错吧」", "aiy310000030.opus"], //男主03 + ["", "奥兹用只要接触到就能杀人般的眼神在男人脸上搜过。"], + ["奥兹", "「没错,就是这个人」", "aiy350000030.opus"], //金锁高官03 + ["凯伊姆", "「是么」", "aiy310000040.opus"], //男主04 + ["年轻人", "「你,你们要对我做什么」", "aiy710000070.opus"], //龙套1-07 + ["奥兹", "「······」", "aiy350000040.opus"], //金锁高官04 + ["", "奥兹用一个眼神,就让男人闭上了嘴。"], + ["", "然后,向我这边转过身来。"], + ["奥兹", "「抱歉啊,总是麻烦你去做这些无聊的事」", "aiy350000050.opus"], //金锁高官05 + ["奥兹", "「都怪我们这边的年轻人太没用」", "aiy350000060.opus"], //金锁高官06 + ["凯伊姆", "「客套话就免了」", "aiy310000050.opus"], //男主05 + ["奥兹", "「这还真是失礼了」", "aiy350000070.opus"], //金锁高官07 + ["奥兹", "「喂,来个人」", "aiy350000080.opus"], //金锁高官08 + ["光头男人", "「是」", "aiy820000010.opus"], //龙套2-01 + ["奥兹", "「凯伊姆先生做完工作回来了」", "aiy350000090.opus"], //金锁高官09 + ["光头男人", "「是,是,那个······」", "aiy820000020.opus"], //龙套2-02 + ["奥兹", "「我是要你拿些酒来,这个蠢材!」", "aiy350000100.opus"], //金锁高官10 + ["", "喀!"], + ["", "奥兹扔出的烟灰缸砸中了手下的额头。"], + ["", "鲜血四溅。"], + ["凯伊姆", "「不用这么麻烦」", "aiy310000060.opus"], //男主06 + ["凯伊姆", "「我接下来要去《菲诺列塔》」", "aiy310000070.opus"], //男主07 + ["奥兹", "「喔唷」", "aiy350000110.opus"], //金锁高官11 + [ + "奥兹", + "「既然如此,我就不留您在这里喝难饮的劣质酒了」", + "aiy350000120.opus", + ], //金锁高官12 + ["", "奥兹斜眼看着正捂住额头呻吟的手下,轻描淡写地说道。"], + ["凯伊姆", "「用这些钱去买药」", "aiy310000080.opus"], //男主08 + ["", "我将几枚铜钱仍在那个手下的身前。"], + ["奥兹", "「凯伊姆先生,不用对他们这么好」", "aiy350000130.opus"], //金锁高官13 + ["凯伊姆", "「无妨」", "aiy310000090.opus"], //男主09 + ["凯伊姆", "「话说回来,那个要落跑的女人呢?」", "aiy310000100.opus"], //男主10 + [ + "奥兹", + "「我把她交给那些年轻人了,现在应该正在体会人生的严苛吧」", + "aiy350000140.opus", + ], //金锁高官14 + [ + "奥兹", + "「正好,趁此机会凯伊姆先生也来享受一番如何?」", + "aiy350000150.opus", + ], //金锁高官15 + ["年轻人", "「你,你们这些家伙,要对她做什么!?」", "aiy710000080.opus"], //龙套1-08 + ["", "咣!"], + ["", "奥兹给了他一拳。"], + ["", "一击即倒。"], + ["", "喀,咚,咯!"], + ["", "奥兹毫不留情地向男人的脸上踩去。"], + ["年轻人", "「咕······呃咳······」", "aiy710000090.opus"], //龙套1-09 + ["", "折断的牙齿伴着血泡被吐出。"], + ["", "这份白色在鲜红色的液体中格外显眼。"], + [ + "年轻人", + "「你们以为做出这种事······卫兵会坐视不理吗······」", + "aiy710000100.opus", + ], //龙套1-10 + ["奥兹", "「啊啊,不会坐视不理的」", "aiy350000160.opus"], //金锁高官16 + [ + "奥兹", + "「应该会拿出你的钱包,和我们商量如何瓜分吧」", + "aiy350000170.opus", + ], //金锁高官17 + ["年轻人", "「那,那种事······」", "aiy710000110.opus"], //龙套1-11 + ["", "这在牢狱是理所当然的事。"], + ["奥兹", "「怎么,头一回来牢狱么?」", "aiy350000180.opus"], //金锁高官18 + ["", "男人点了点头。"], + [ + "奥兹", + "「为了被骗的女人而来到牢狱,真是个规矩人啊」", + "aiy350000190.opus", + ], //金锁高官19 + ["奥兹", "「······前提是,被骗的人不是你」", "aiy350000200.opus"], //金锁高官20 + ["年轻人", "「你说······我被骗了?」", "aiy710000120.opus"], //龙套1-12 + ["年轻人", "「那,那是怎么回事!?」", "aiy710000130.opus"], //龙套1-13 + ["奥兹", "「不用急,今天晚上会好好告诉你的」", "aiy350000210.opus"], //金锁高官21 + ["", "奥兹抓起男人的脸。"], + ["", "为引诱客人的怜悯之心而装纯,是娼妇的惯用手段。"], + ["", "双亲被骗而借钱,结果作为抵押而将自己卖到这里,这是典型的说法。"], + [ + "", + "如果只是头脑发热而成为常客也就罢了,这次的男人热血过头,居然想出了要带女人私奔的计划。", + ], + [ + "", + "虽然女人半开玩笑地予以拒绝,但不知天高地厚的这家伙还是拉着她逃跑了。", + ], + ["", "不过,想要逃脱追击本来就是不可能的任务。"], + ["", "但即便如此,这种事情还是会一再的出现。"], + ["", "说谎的女人和被骗的男人。"], + ["", "在娼馆街,这是令人看到生厌的日常的风景。"], + ["凯伊姆", "「我要走了」", "aiy310000110.opus"], //男主11 + ["奥兹", "「好的,下次再麻烦您」", "aiy350000220.opus"], //金锁高官22 + ["奥兹", "「之后吉克先生会将谢礼交给您的」", "aiy350000230.opus"], //金锁高官23 + ["凯伊姆", "「啊啊」", "aiy310000120.opus"], //男主12 + ["", "我背向奥兹走出娼馆。"], + ["凯伊姆", "「······?」", "aiy310000130.opus"], //男主13 + ["", "从远方传来微弱的歌声。"], + ["", "是关卡广场的方向。"], + ["", "对了。"], + ["", "今天有觐见圣女的仪式。"], + ["", "当代的圣女伊莲——"], + ["", "俗称《盲眼之圣女》,据说即使在历代的圣女中,人气也是数一数二的。"], + ["", "广场上的人估计相当多吧。"], + ["", "虽然我也想去看看她长什么样,不过要在人潮中挤来挤去就免了。"], + ["", "还是老老实实去菲诺列塔喝烧酒吧。"], + ["", "正当我这样想着的时候,一个身影自小巷的那头走来。"], + ["凯伊姆", "「艾莉斯」", "aiy310000140.opus"], //男主14 + ]; + this.chapter01 = [ + ["艾莉斯", "「啊,凯伊姆」", "aiy020000005.opus"], //医生00.5 + ["艾莉斯", "「正好,我还想要去找你呢」", "aiy020000010.opus"], //医生01 + [ + "艾莉斯", + "「没想到凯伊姆会主动出现······这是命运吗?」", + "aiy020000020.opus", + ], //医生02 + ["凯伊姆", "「显然不是吧」", "aiy310000150.opus"], //男主15 + ["艾莉斯", "「啊,是么」", "aiy020000030.opus"], //医生03 + ["", "艾莉斯挑了挑整齐的双眉,微微地哼了一声。"], + [ + "", + "虽然是个相当引人注目的美人,但她这个将亲切儿子丢入无底深渊的性格,为自己扣了不少的分", + ], + ["", "给人印象最深的,就是那潭水般的双瞳。"], + ["", "在漆黑的瞳孔中,完全看不出感情的波动。"], + ["艾莉斯", "「喜欢我的眼睛吗?」", "aiy020000040.opus"], //医生04 + ["艾莉斯", "「如果想要的话就给你吧?」", "aiy020000050.opus"], //医生05 + ["凯伊姆", "「用不着」", "aiy310000160.opus"], //男主16 + ["艾莉斯", "「阿拉,可惜」", "aiy020000060.opus"], //医生06 + ["凯伊姆", "「那么,找我有什么事」", "aiy310000170.opus"], //男主17 + ["艾莉斯", "「梅尔特的钱好像被偷了」", "aiy020000070.opus"], //医生07 + ["凯伊姆", "「钱被偷了?都几岁了还这么没用」", "aiy310000180.opus"], //男主18 + ["艾莉斯", "「不要对我说啊」", "aiy020000080.opus"], //医生08 + [ + "凯伊姆", + "「那家伙,该不会说要让我去抓那个小偷吧?」", + "aiy310000190.opus", + ], //男主19 + ["艾莉斯", "「就是这样」", "aiy020000090.opus"], //医生09 + ["凯伊姆", "「笨蛋吗」", "aiy310000200.opus"], //男主20 + ["凯伊姆", "「如果是小钱的话,就当做是买个教训吧」", "aiy310000210.opus"], //男主21 + ["艾莉斯", "「说起来,被盗的是这个月的上纳金」", "aiy020000100.opus"], //医生10 + ["凯伊姆", "「你说什么?」", "aiy310000220.opus"], //男主22 + ["艾莉斯", "「用这些钱买教训,也太过奢侈了呢」", "aiy020000110.opus"], //医生11 + ["凯伊姆", "「知道了,我去找」", "aiy310000230.opus"], //男主23 + ["凯伊姆", "「小偷的特征呢」", "aiy310000240.opus"], //男主24 + ["艾莉斯", "「男孩子」", "aiy020000120.opus"], //医生12 + ["艾莉斯", "「······而且,背后有翅膀」", "aiy020000130.opus"], //医生13 + [ + "艾莉斯", + "「虽然姑且是藏在身后,但是仔细观察的话是很明显的」", + "aiy020000140.opus", + ], //医生14 + ["凯伊姆", "「羽化病吗」", "aiy310000250.opus"], //男主25 + [ + "艾莉斯", + "「那些人可是毫不留情的,所以即使是为了那个孩子,也要赶快抓到他」", + "aiy020000150.opus", + ], //医生15 + ["凯伊姆", "「注意到他逃窜的方向了吗?」", "aiy310000260.opus"], //男主26 + ["艾莉斯", "「广场那边」", "aiy020000160.opus"], //医生16 + [ + "艾莉斯", + "「虽然刚才《不蚀金锁》的人去追了,不过多半是······」", + "aiy020000170.opus", + ], //医生17 + ["凯伊姆", "「偏偏还是广场吗」", "aiy310000280.opus"], //男主28 + ["艾莉斯", "「今天是觐见圣女大人的日子」", "aiy020000180.opus"], //医生18 + ["凯伊姆", "「我知道」", "aiy310000290.opus"], //男主29 + ["凯伊姆", "「尽量找找看就好」", "aiy310000300.opus"], //男主30 + ]; + this.chapter02 = [ + ["不蚀金锁成员", "「凯伊姆先生,凯伊姆先生」"], + ["不蚀金锁成员", "「您已经和艾莉斯大夫见过面了吗?」"], + ["凯伊姆", "「啊啊,所以才会追过来的」"], //男主31 + ["凯伊姆", "「看到小偷了吗?」"], //男主32 + [ + "不蚀金锁成员", + "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", + ], + [ + "不蚀金锁成员", + "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", + ], + ["不蚀金锁成员", "「我已经准备撤退了」"], + ["不蚀金锁成员", "「凯伊姆先生还要继续追吗?」"], + ["凯伊姆", "「啊啊」"], //男主33 + ["", "做完情报交换之后,我跟男人道别。"], + ["凯伊姆", "「和我想的一样啊······」"], //男主34 + ["", "在牢狱中最大的广场上,聚集着看不到尽头的人群。"], + ["", "就算是来参见圣女祈祷,这人数也太多了点吧。"], + ["", "自然,我也找不到逃跑的孩子。"], + ["", "是混杂到人群中了吧。"], + ["", "如果已经从广场上脱身了的话,就更难发现了。"], + ["", "只好赌他还在这里了。"], + ["", "我先移动到了一个视野良好的地方。"], + ["", "从这里,一眼就可以看到人群的变化。"], + ["", "广场还是沸腾起来。"], + ["", "抬头望去,原来是在天台之上出现了一个人影"], + ["", "但是,与周围的期待不同,现身的是一名中年的神官。"], + ["", "骂声四溢。"], + ["", "神官则是笑着摆正衣领"], + ["神官", "「从现在开始,举行谒见的仪式」"], + [ + "神官", + "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", + ], + [ + "神官", + "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", + ], + [ + "神官", + "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", + ], + [ + "神官", + "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", + ], + ["神官", "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」"], + ["圣女", "「不忘感谢与祈祷,神才会拯救我们」"], + ["圣女", "「与我一起,向神虔诚地祈祷吧」"], + ["", "广场上欢声雷动。"], + ["", "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。"], + ["", "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。"], + ["", "她掌握着这条街道,还有在这条街上生活的人的命运。"], + ["", "比起揽得人气,她更想要为了街道的继续存在而献出全力。"], + ["", "也是为了不让《大崩落》的惨剧再度发生。"], + ["", "十几年前的那场悲剧。"], + [ + "", + "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", + ], + ["凯伊姆", "「······」"], //男主35 + ["", "这时我才想起,现在不是我在这里看圣女的时候。"], + ["女声", "「——っ!?」"], + ["围观的女人", "「羽,羽化病人!?」"], + ["围观的中年人", "「喂,谁去叫下羽狩」"], + ["惊慌的观众", "「你这家伙不要靠近我,要是传染了可怎么办」"], + ["粗鲁的观众", "「你这小鬼赶快滚开」"], + ["凯伊姆", "「接下来」"], + ["圣女", "「发生什么事了?看上去似乎很嘈杂」"], + ["随从", "「似乎是某个人逃跑了······具体的我也不是很清楚」"], + ["神官", "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」"], + ["圣女", "「不用在意我,比起那个,我更关心究竟发生了什么事」"], + ["神官", "「对不起,我真的不知道」"], + ["圣女", "「······是吗」"], + ["男", "「恕我僭越,请准许我说明情况」"], + ["男", "「在来觐见的人群中出现了《羽化病》的患者」"], + ["男", "「围观的人群因而产生了骚动」"], + [ + "男", + "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", + ], + ["圣女", "「羽化病······」"], + ["男", "「怎么了?」"], + ["圣女", "「没什么」"], + ["圣女", "「辛苦了,你的名字是?」"], + ["男", "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」"], + ["神官", "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」"], + ["神官", "「阁下是在工作上相当出色的人呢」"], + ["鲁基乌斯", "「不敢当」"], + [ + "鲁基乌斯", + "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", + ], + [ + "圣女", + "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", + ], + ["鲁基乌斯", "「属下不胜惶恐」"], + ["鲁基乌斯", "「接下来属下还要回到工作岗位上,在这里就先告退了」"], + ["圣女", "「鲁基乌斯先生」"], + ["鲁基乌斯", "「属下在」"], + ["圣女", "「你是怎样看待羽狩的工作的呢?」"], + ["神官", "「圣,圣女大人」"], + [ + "鲁基乌斯", + "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", + ], + ["神官", "「不,不亏是鲁基乌斯卿,相当优秀的想法」"], + ["圣女", "「是吗。辛苦你了」"], + ["随从", "「圣女大人······」"], + ["鲁基乌斯", "「······」"], + ["鲁基乌斯", "「那么,属下就回岗位去了」"], + ]; + this.chapter03 = [ + ["", "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。"], + ["", "显然,他并没有想到我会捷足先登吧。"], + ["", "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。。"], + ["凯伊姆", "「辛苦你了」"], //男主37 + ["羽化病患少年", "「稀!?」"], + ["凯伊姆", "「逃到贫民区是个不错的想法」"], //男主38 + ["羽化病患少年", "「你,你是,羽狩吗?」"], + ["凯伊姆", "「不是」"], //男主39 + ["羽化病患少年", "「什,什么啊······混蛋,不要吓我啊」"], + ["凯伊姆", "「我对令你受惊这件事致以歉意」"], //男主40 + ["凯伊姆", "「作为回报,麻烦你把从店里偷的钱交出来吧」"], //男主41 + ["羽化病患少年", "「钱?你在说什么」"], + ["凯伊姆", "「你要找的腰上的东西,掉在你身后了」"], //男主42 + ["羽化病患少年", "「哎?」"], + ["羽化病患少年", "「呃呀」"], + ["羽化病患少年", "「你······你这混蛋」"], + ["凯伊姆", "「······」"], //男主43 + ["凯伊姆", "「把偷的钱交出来」"], //男主44 + ["羽化病患少年", "「我不知道你在······咕」"], + ["羽化病患少年", "「你,你说是我偷的······有什么证据吗」"], + ["凯伊姆", "「你还挺倔的啊」"], //男主45 + ["凯伊姆", "「不过,给我听好了」"], //男主46 + ["凯伊姆", "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」"], //男主47 + ["凯伊姆", "「而且,钱的主人是从前和吉克颇有渊源的女人」"], //男主48 + ["羽化病患少年", "「吉克?」"], + ["凯伊姆", "「他是《不蚀金锁》的主人,这么说你就明白了吧」"], //男主49 + ["羽化病患少年", "「哎?哎?怎么会······」"], + ["凯伊姆", "「再问你一遍,钱在哪里?」"], //男主50 + ["羽化病患少年", "「是,是,是,在我的怀里」"], + ["凯伊姆", "「你没有擅自拿掉一部分吧」"], //男主51 + ["羽化病患少年", "「是,是的」"], + ["羽化病患少年", "「那,那个,您是《不蚀金锁》的人吗?」"], + ["凯伊姆", "「算是吧」"], //男主52 + ["羽化病患少年", "「我什么都可以做,请您一定要帮帮我」"], + ["凯伊姆", "「抱歉,我并没有兴趣去帮助他人」"], //男主53+54 + ["羽化病患少年", "「我什么······什么,都会做的······」"], + ["羽化病患少年", "「我一直都是生活在下层的」"], + [ + "羽化病患少年", + "「可是,不知何时染上了羽化病······背后长出了翅膀······」", + ], + ["羽化病患少年", "「被寄宿工作的店赶了出来,只得流落到牢狱这里」"], + ["羽化病患少年", "「因为独自实在是饿的不行了,所以才会偷这些钱的」"], + [ + "羽化病患少年", + "「我明明没有做任何坏事······为什么······会遇到这种事······」", + ], + ["凯伊姆", "「谁知道」"], //男主55 + ["羽化病患少年", "「呜······呜呜······接下来,要对我做什么?」"], + ["凯伊姆", "「我要把你带到组织那里」"], //男主56 + ["羽化病患少年", "「怎,怎么这样」"], + ["凯伊姆", "「不过,那样做的前提是你不是羽化病人」"], + ["凯伊姆", "「组织也没有笨到把羽化病人招待到家里的程度」"], + ["羽化病患少年", "「那么,是要放我逃走吗?」"], + ["凯伊姆", "「我要让你学到教训」"], + ["凯伊姆", "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」"], + ["凯伊姆", "「你的运气不错」"], + ["羽化病患少年", "「唔······啊,是的······」"], + ["凯伊姆", "「滚」"], + ["羽化病患少年", "「非常感谢」"], + ["羽化病患少年", "「唔啊!?」"], + ["男", "「到这里就结束了,羽化病人」"], + ["男", "「确认他的翅膀」"], + ["", "趁还没有被卷入麻烦的事情之前,赶快离开这里吧"], + ["羽狩的队长", "「那边的那个人」"], + ["凯伊姆", "「······有什么事?」"], + ["羽狩的队长", "「可以稍微让我问几句话吗」"], + ["凯伊姆", "「······」"], + ["凯伊姆", "「啊啊,无妨」"], + ["羽狩的队长", "「感谢您的合作」"], + ["", "队长殷勤地致以谢礼。"], + ["", "而在他的眼前,少年的衣服已经被他的补下们扯破。"], + ["", "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。"], + ["红发的羽狩", "「副队长,确认翅膀的持有了」"], + ["羽狩的副队长", "「保护他」"], + ["羽化病患少年", "「不要······请原谅,我······」"], + [ + "羽狩的副队长", + "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", + ], + ["羽化病患少年", "「可是,可是」"], + ["羽狩的副队长", "「没关系的」"], + ["羽化病患少年", "「······哥,哥哥」"], + ["羽狩的副队长", "「你是羽化病人的亲属吗?」"], + ["凯伊姆", "「只是路人而已」"], + ["凯伊姆", "「顺带一提,我也没有打算找你们的麻烦」"], + [ + "羽狩的副队长", + "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", + ], + ["羽狩的副队长", "「我的一个部下就此永久失去了半截胳膊」"], + ["凯伊姆", "「我表示同情」"], + ["凯伊姆", "「我马上就会消失的,这样就没问题了吧?」"], + ["羽狩的副队长", "「嘛,不要这么慌张」"], + ["", "副队长看着羽化的少年。"], + ["羽狩的副队长", "「你与这个人是什么关系?没有被他殴打吗?」"], + ["羽化病患少年", "「没,没有」"], + [ + "羽狩的副队长", + "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", + ], + ["羽化病患少年", "「······」"], + ["羽化病患少年", "「那个人,是《不蚀金锁》的组织成员······」"], + ["羽化病患少年", "「突然说让我拿出钱来,我刚一拒绝他就打我」"], + ["羽狩的副队长", "「原来如此······」"], + [ + "羽狩的副队长", + "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", + ], + ["凯伊姆", "「当然不是」"], + ["凯伊姆", "「我只是从那里接受工作而已,并不是他们的成员」"], + ["羽狩的副队长", "「你的意思是说,少年在说谎吗?」"], + ["凯伊姆", "「啊啊」"], + [ + "凯伊姆", + "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", + ], + ["羽狩的副队长", "「就算我去询问,也无法从他们那里得到事实」"], + [ + "羽狩的副队长", + "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", + ], + ["凯伊姆", "「真是辛苦啊」"], + ["羽狩的副队长", "「说的是啊」"], + ["羽狩的副队长", "「其实,砍下我部下胳膊的似乎也是组织的成员呢」"], + [ + "羽狩的副队长", + "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", + ], + [ + "羽狩的副队长", + "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", + ], + ["羽狩的副队长", "「那和整条街道的和平也是紧密相关的吧?」"], + ["凯伊姆", "「我知道,你们有逮捕干扰狩猎羽化病人的权力」"], + [ + "凯伊姆", + "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", + ], + ["羽狩的副队长", "「那些话,我们会在看守所对你详细说明的」"], + ["凯伊姆", "「······」"], + ["", "在这里起争执的话,就会被羽狩加害。"], + ["", "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。"], + ["", "就算逃跑,也没有好的结果。"], + ["", "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。"], + ["", "发生了什么事······"], + ["???", "「我认为,那位先生是正确的」"], + ["", "羽狩们一起回头。"], + ["", "而在他们视线的焦点处,"], + ["", "伫立着一位女性。"], + ["", "在端正的容颜下,代表着强烈意志的双眉十分显眼。"], + ["", "身体的柔软与紧紧包裹在其身上的羽狩制服,两者显得十分的不搭配。"], + ["", "我还是第一次看到女性的羽狩。"], + ["羽狩的副队长", "「队长,这是获得《不蚀金锁》情报的好机会」"], + [ + "羽狩的队长", + "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", + ], + ["兰格副队长", "「我并没有打算去恫吓他······」"], + ["羽狩的队长", "「告诉我那个被砍掉胳膊的队员的名字」"], + ["羽狩的队长", "「我会去探望他的」"], + ["兰格副队长", "「那个是······」"], + ["羽狩的队长", "「我知道,你一直在为有所收获而努力工作」"], + ["羽狩的队长", "「但是,正因为我们的工作是为民众提供帮助」"], + ["羽狩的队长", "「所以就更不能损害人与人之间的信赖」"], + ["兰格副队长", "「我会铭记在心」"], + ["羽狩的队长", "「这位先生,我的部下失礼了」"], + ["凯伊姆", "「只要不对我再来一次就好」"], + ["羽狩的队长", "「请稍等」"], + ["凯伊姆", "「有什么事?」"], + ["羽狩的队长", "「我想确认一件事」"], + ["羽狩的队长", "「你真的不是《不蚀金锁》的成员吗?」"], + ["凯伊姆", "「真的」"], + ["凯伊姆", "「如果我说是的话,你有什么打算?」"], + ["羽狩的队长", "「我听过传闻,说他们是用依靠暴力而得的钱在生活」"], + ["凯伊姆", "「······这样啊」"], + ["凯伊姆", "「如果能有收获就好了啊」"], + ]; + this.chapter04 = [ + ["梅尔特", "「欢迎光临」"], + ["梅尔特", "「辛苦了」"], + ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」"], + ["凯伊姆", "「没什么,比想象中完成的更容易」"], + ["梅尔特", "「那就好」"], + ["梅尔特", "「这是我的一点谢意」"], + ["凯伊姆", "「味道有些变化啊」"], + ["梅尔特", "「啊,被发现了?」"], + ["梅尔特", "「最近,没能到手什么好的原料呢」"], + ["凯伊姆", "「去拜托吉克如何?」"], + [ + "梅尔特", + "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", + ], + ["凯伊姆", "「那希望你也不要来麻烦我」"], + ["梅尔特", "「那 是 两 码 事」"], + ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」"], + [ + "梅尔特", + "「而且,自己的钱被偷了这么害羞的事,向凯伊姆意外的其他人都说不出口」", + ], + ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」"], + ["梅尔特", "「这是面子问题啊,面子问题」"], + ["凯伊姆", "「嘛,算了」"], + ["凯伊姆", "「这样就好了吧?」"], + ["梅尔特", "「这是钱包呢」"], + ["梅尔特", "「嗯,东西没少」"], + ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」"], + ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」"], + ["凯伊姆", "「在那边不是来钱更快吗?」"], + ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」"], + ["凯伊姆", "「这是客套话而已」"], + ["梅尔特", "「欺负人」"], + ["梅尔特", "「总而言之,今天帮大忙了」"], + ["梅尔特", "「谢礼嘛······」"], + ["凯伊姆", "「就记在账单上吧」"], + ["梅尔特", "「了解—盛谢惠顾了哦?」"], + ["", "喀啷喀啷"], + ["", "门铃响起"], + ["", "喧哗瞬间安静下来。"], + ["", "进来的人是吉克。"], + ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], + ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], + ["吉克", "「各位继续吧」"], + ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], + ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。"], + ["凯伊姆", "「不用介意」"], + ["", "吉克轻轻点了点头,在我右边坐了下来"], + ["凯伊姆", "「逃跑的男人怎么样了?」"], + ["吉克", "「嗯?已经不在这个世上了」。"], + ["吉克", "「有什么想要知道的事吗?」"], + ["凯伊姆", "「不,没什么」"], + ["吉克", "「那个无聊的家伙,完全没有趣味呢」"], + ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」"], + ["凯伊姆", "「真是灾难啊」"], + ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」"], + ["凯伊姆", "「消息真灵通」"], + ["吉克", "「梅尔特也注意点」"], + ["吉克", "「你丢钱已经不是一回两回了」"], + ["梅尔特", "「好的—我会注意的。」"], + ["梅尔特", "「吉克还是平常的点单吧」"], + ["梅尔特", "「凯伊姆要再来一杯吗?」"], + ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], + ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], + ["吉克", "「这是抓捕逃跑男人的报酬」"], + ["凯伊姆", "「下次有什么事再告诉我」"], + ["梅尔特", "「来,久等了」"], + ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」"], + ["吉克", "「让我猜猜看」"], + ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」"], + ["梅尔特", "「可惜—」"], + ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」"], + ["凯伊姆", "「完全把你当成新进的女佣了么」"], + ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」"], + ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」"], + ["凯伊姆&吉克", "「你傻啊」"], + ["梅尔特", "「异口同声呢,不亏是兄弟」"], + ["凯伊姆", "「别用这种称呼,怪恶心的」"], + ["吉克", "「说得没错」"], + ["吉克", "「······说起来······」"], + ["梅尔特", "「怎么了?」"], + ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」"], + ["凯伊姆", "「你也说这么无聊的话题」"], + ["吉克", "「不,这是很重要的事情」"], + ["吉克", "「梅尔特,事实是怎么样的?」"], + ["梅尔特", "「啊~是怎么样的呢~」"], + ["梅尔特", "「我忘记了」"], + ["吉克", "「骗人」"], + ]; + } } \ No newline at end of file From dbb1d76c54b5e9d81f0ecc0b5164a1426a04301b Mon Sep 17 00:00:00 2001 From: itcfangye Date: Sat, 1 Feb 2025 11:55:00 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=88=98=E6=96=97?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/functions.js | 356 ++++++++++++++++++++++--------------------- 1 file changed, 183 insertions(+), 173 deletions(-) diff --git a/project/functions.js b/project/functions.js index ea0a448..014cf56 100644 --- a/project/functions.js +++ b/project/functions.js @@ -892,171 +892,179 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = }; }, "getDamageInfo": function (enemy, hero, x, y, floorId) { - // 获得战斗伤害信息(实际伤害计算函数) - // - // 参数说明: - // enemy:该怪物信息 - // hero:勇士的当前数据;如果对应项不存在则会从core.status.hero中取。 - // x,y:该怪物的坐标(查看手册和强制战斗时为undefined) - // floorId:该怪物所在的楼层 - // 后面三个参数主要是可以在光环等效果上可以适用 - floorId = floorId || core.status.floorId; + // 获得战斗伤害信息(实际伤害计算函数) + // + // 参数说明: + // enemy:该怪物信息 + // hero:勇士的当前数据;如果对应项不存在则会从core.status.hero中取。 + // x,y:该怪物的坐标(查看手册和强制战斗时为undefined) + // floorId:该怪物所在的楼层 + // 后面三个参数主要是可以在光环等效果上可以适用 + floorId = floorId || core.status.floorId; - var 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"), - hero_magic = core.getRealStatusOrDefault(hero, "magic"), - origin_hero_hp = core.getStatusOrDefault(hero, "hp"), - origin_hero_atk = core.getStatusOrDefault(hero, "atk"), - origin_hero_def = core.getStatusOrDefault(hero, "def"); + var hero_hp = core.getRealStatusOrDefault(hero, "hp"), + hero_atk = core.getRealStatusOrDefault(hero, "atk"), + hero_def = core.getRealStatusOrDefault(hero, "def"), + hero_matk = core.getRealStatusOrDefault(hero, "matk"), + hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), + hero_speed = core.getRealStatusOrDefault(hero, "speed"), + hero_spell = core.getRealStatusOrDefault(hero, "spell"), + origin_hero_hp = core.getStatusOrDefault(hero, "hp"), + origin_hero_atk = core.getStatusOrDefault(hero, "atk"), + origin_hero_def = core.getStatusOrDefault(hero, "def"); - // 怪物的各项数据 - // 对坚固模仿等处理扔到了脚本编辑-getEnemyInfo之中 - var enemyInfo = core.enemys.getEnemyInfo(enemy, hero, x, y, floorId); - var mon_hp = enemyInfo.hp, - mon_atk = enemyInfo.atk, - mon_def = enemyInfo.def, - mon_mdef = enemyInfo.mdef, - mon_speed = enemyInfo.speed, - mon_special = enemyInfo.special, - mon_absorb_damage = enemyInfo.absorb, - mon_barrier = enemyInfo.barrier; + // 怪物的各项数据 + // 对坚固模仿等处理扔到了脚本编辑-getEnemyInfo之中 + var enemyInfo = core.enemys.getEnemyInfo(enemy, hero, x, y, floorId); + var mon_hp = enemyInfo.hp, + mon_atk = enemyInfo.atk, + mon_def = enemyInfo.def, + mon_mdef = enemyInfo.mdef, + mon_speed = enemyInfo.speed, + mon_special = enemyInfo.special, + mon_absorb_damage = enemyInfo.absorb, + mon_barrier = enemyInfo.barrier; - //---第一部分:静态属性修正--- - //此处写入静态影响勇士属性的勇士或怪物技能(静态影响怪物属性的技能于getEnemyInfo中写入) - // 技能的处理 - if (core.getFlag("skill", 0) == 1) { - // 开启了技能1:二倍斩 - hero_atk *= 2; // 计算时攻击力翻倍 - } - //勇士属性取整 - hero_atk = Math.max(0, Math.floor(hero_atk)); - hero_def = Math.max(0, Math.floor(hero_def)); - hero_mdef = Math.max(0, Math.floor(hero_mdef)); - hero_speed = Math.max(0, Math.floor(hero_speed)); + //---第一部分:静态属性修正--- + //此处写入静态影响勇士属性的勇士或怪物技能(静态影响怪物属性的技能于getEnemyInfo中写入) + // 技能的处理 + if (core.getFlag("skill", 0) == 1) { + // 开启了技能1:二倍斩 + hero_atk *= 2; // 计算时攻击力翻倍 + } + //勇士属性取整 + hero_atk = Math.max(0, Math.floor(hero_atk)); + hero_def = Math.max(0, Math.floor(hero_def)); + hero_mdef = Math.max(0, Math.floor(hero_mdef)); + hero_speed = Math.max(0, Math.floor(hero_speed)); - // 如果是无敌属性,且勇士未持有十字架 - if (core.hasSpecial(mon_special, 20) && !core.hasItem("cross")) - return null; // 不可战斗 + // 如果是无敌属性,且勇士未持有十字架 + if (core.hasSpecial(mon_special, 20) && !core.hasItem("cross")) + return null; // 不可战斗 - // 战前造成的额外伤害(可被护盾抵消) - let init_damage = 0; + // 战前造成的额外伤害(可被护盾抵消) + let init_damage = 0; - // 吸血 - if (core.hasSpecial(mon_special, 11)) { - let vampire_damage = hero_hp * enemy.vampire; + // 吸血 + if (core.hasSpecial(mon_special, 11)) { + let vampire_damage = hero_hp * enemy.vampire; - // 如果有神圣盾免疫吸血等可以在这里写 - // 也可以用hasItem和hasEquip来判定装备 - // if (core.hasFlag('shield5')) vampire_damage = 0; + // 如果有神圣盾免疫吸血等可以在这里写 + // 也可以用hasItem和hasEquip来判定装备 + // if (core.hasFlag('shield5')) vampire_damage = 0; - vampire_damage = Math.floor(vampire_damage) || 0; - // 加到自身 - if (enemy.add) - // 如果加到自身 - mon_hp += vampire_damage; + vampire_damage = Math.floor(vampire_damage) || 0; + // 加到自身 + if (enemy.add) + // 如果加到自身 + mon_hp += vampire_damage; - init_damage += vampire_damage; - } + init_damage += vampire_damage; + } - //——第二部分:变量定义和初始赋值—— - // 每回合怪物对勇士造成的战斗伤害 - let per_damage = Math.max(mon_atk - hero_def, 0); - if (enemyInfo.magic) per_damage = Math.max(mon_atk - hero_mdef, 0); + //——第二部分:变量定义和初始赋值—— + // 每回合怪物对勇士造成的战斗伤害 + let per_damage = Math.max(mon_atk - hero_def, 0); + if (enemyInfo.magic) per_damage = Math.max(mon_atk - hero_mdef, 0); - // - let hero_per_damage = Math.max(hero_atk - mon_def, 0); - if (hero_magic) hero_per_damage = Math.max(hero_atk - mon_mdef, 0); + // + let hero_per_damage = Math.max(hero_atk - mon_def, 0); + if (hero_magic) hero_per_damage = Math.max(hero_atk - mon_mdef, 0); - let damage = 0, - hero_turn = 0, - mon_turn = 0; - //---第三部分:递归开始--- - let length = hero_speed * mon_speed; + let damage = 0, + hero_turn = 0, + mon_turn = 0; + //---第三部分:递归开始--- + let length = hero_speed * mon_speed; - for ( - let now_mon_hp = mon_hp, - last_mon_hp = mon_hp, - mon_length = length, - hero_length = length, - mon_time = 0, - hero_time = 0; - now_mon_hp > 0; + let heroDiffPerTurn = [], + enemyDiffPerTurn = []; - ) { - //勇士和怪物的长度 - mon_time = mon_length / mon_speed; - hero_time = hero_length / hero_speed; - if ( - mon_time < hero_time || - ((mon_time = hero_time) && mon_speed > hero_speed) - ) { - //怪物攻击的回合 - //这里计算怪物攻击时发生的各种变化 + for ( + let now_mon_hp = mon_hp, + last_mon_hp = mon_hp, + mon_length = length, + hero_length = length, + mon_time = 0, + hero_time = 0; now_mon_hp > 0; - //伤害与回合增加 - damage += per_damage; - if (core.hasSpecial(mon_special, 6)) { - mon_turn += enemy.n; - } else { - mon_turn += 1; - } - //重新为长度赋值 - mon_length = length; - hero_length = hero_length - mon_time * hero_speed; - } else { - //勇士攻击的回合 - // 这里计算勇士攻击时发生的各种变化 + ) { + //勇士和怪物的长度 + mon_time = mon_length / mon_speed; + hero_time = hero_length / hero_speed; + if ( + mon_time < hero_time || + ((mon_time == hero_time) && mon_speed > hero_speed) + ) { + //怪物攻击的回合 + //这里计算怪物攻击时发生的各种变化 - // 伤害与回合数增加 - now_mon_hp -= hero_per_damage; - hero_turn += 1; //勇士回合+1,如果有勇士每回合多次攻击的情况,在这里写判断 - // 无法战斗计算 - if (hero_turn % 50 == 0) { - if (now_mon_hp >= last_mon_hp) return null; - last_mon_hp = now_mon_hp; - } - //重新为长度赋值 - hero_length = length; - mon_length = mon_length - hero_time * mon_speed; - } - } + //伤害与回合增加 + damage += per_damage; + if (core.hasSpecial(mon_special, 6)) { + mon_turn += enemy.n; + } else { + mon_turn += 1; + } + //重新为长度赋值 + mon_length = length; + hero_length = hero_length - mon_time * hero_speed; + } else { + //勇士攻击的回合 + // 这里计算勇士攻击时发生的各种变化 - //下面这些还没修改 - // 连击 - if (core.hasSpecial(mon_special, 6)) per_damage *= enemy.n || 2; + // 伤害与回合数增加 + now_mon_hp -= hero_per_damage; + hero_turn += 1; //勇士回合+1,如果有勇士每回合多次攻击的情况,在这里写判断 + // 无法战斗计算 + if (hero_turn % 50 == 0) { + if (now_mon_hp >= last_mon_hp) return null; + last_mon_hp = now_mon_hp; + } + //重新为长度赋值 + hero_length = length; + mon_length = mon_length - hero_time * mon_speed; + } + let hero_diff = {}, + mon_diff = {}; + //这里插入汇总勇士和怪物在此回合结束时的情况数值,用以跑条动画读取 + heroDiffPerTurn.push(hero_diff); + enemyDiffPerTurn.push(mon_diff); //将勇士和怪物此回合结束时的属性变动保存到heroPerInfo和enemyPerInfo中,用以跑条动画读取 + } - // 每回合的反击伤害;反击是按照勇士的攻击次数来计算回合 - let counterDamage = 0; - if (core.hasSpecial(mon_special, 8)) - counterDamage += Math.floor( - (enemy.counterAttack || core.values.counterAttack) * hero_atk - ); + //下面这些还没修改 + // 连击 + if (core.hasSpecial(mon_special, 6)) per_damage *= enemy.n || 2; - // 先攻 - if (core.hasSpecial(mon_special, 1)) init_damage += per_damage; + // 每回合的反击伤害;反击是按照勇士的攻击次数来计算回合 + let counterDamage = 0; + if (core.hasSpecial(mon_special, 8)) + counterDamage += Math.floor( + (enemy.counterAttack || core.values.counterAttack) * hero_atk + ); - // 破甲 - if (core.hasSpecial(mon_special, 7)) - init_damage += Math.floor( - (enemy.breakArmor || core.values.breakArmor) * hero_def - ); + // 先攻 + if (core.hasSpecial(mon_special, 1)) init_damage += per_damage; - // 净化 - if (core.hasSpecial(mon_special, 9)) - init_damage += Math.floor( - (enemy.purify || core.values.purify) * hero_mdef - ); - //上面这些还没修改 - //勇士护盾计算 - let barrier = hero_mdef; - if (enemyInfo.magic) barrier = hero_def; + // 破甲 + if (core.hasSpecial(mon_special, 7)) + init_damage += Math.floor( + (enemy.breakArmor || core.values.breakArmor) * hero_def + ); - // ------ 支援 ----- // - // 这个递归最好想明白为什么,flag:__extraTurn__是怎么用的 - /*var guards = core.getFlag("__guards__" + x + "_" + y, enemyInfo.guards); + // 净化 + if (core.hasSpecial(mon_special, 9)) + init_damage += Math.floor( + (enemy.purify || core.values.purify) * hero_mdef + ); + //上面这些还没修改 + //勇士护盾计算 + let barrier = hero_mdef; + + + // ------ 支援 ----- // + // 这个递归最好想明白为什么,flag:__extraTurn__是怎么用的 + /*var guards = core.getFlag("__guards__" + x + "_" + y, enemyInfo.guards); var guard_before_current_enemy = false; // ------ 支援怪是先打(true)还是后打(false)? turn += core.getFlag("__extraTurn__", 0); if (guards.length > 0) { @@ -1084,43 +1092,45 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } } core.removeFlag("__extraTurn__");*/ - // ------ 支援END ------ // + // ------ 支援END ------ // - // 最终伤害:初始伤害 + 怪物对勇士造成的伤害 + 反击伤害 - damage += init_damage + hero_turn * counterDamage; - // 再扣去护盾 - damage -= barrier; + // 最终伤害:初始伤害 + 怪物对勇士造成的伤害 + 反击伤害 + damage += init_damage + hero_turn * counterDamage; + // 再扣去护盾 + damage -= barrier; - // 检查是否允许负伤 - if (!core.flags.enableNegativeDamage) damage = Math.max(0, damage); + // 检查是否允许负伤 + if (!core.flags.enableNegativeDamage) damage = Math.max(0, damage); - // 最后处理仇恨和固伤(因为这两个不能被护盾减伤) - if (core.hasSpecial(mon_special, 17)) { - // 仇恨 - damage += core.getFlag("hatred", 0); - } - if (core.hasSpecial(mon_special, 22)) { - // 固伤 - damage += enemy.damage || 0; - } + // 最后处理仇恨和固伤(因为这两个不能被护盾减伤) + if (core.hasSpecial(mon_special, 17)) { + // 仇恨 + damage += core.getFlag("hatred", 0); + } + if (core.hasSpecial(mon_special, 22)) { + // 固伤 + damage += enemy.damage || 0; + } - return { - mon_hp: Math.floor(mon_hp), - mon_atk: Math.floor(mon_atk), - mon_def: Math.floor(mon_def), - mon_mdef: Math.floor(mon_mdef), - init_damage: Math.floor(init_damage), - per_damage: Math.floor(per_damage), - hero_per_damage: Math.floor(hero_per_damage), - turn: Math.floor(hero_turn), - mon_turn: Math.floor(mon_turn), - damage: Math.floor(damage), - }; - /*TODO:怪物手册的修改(需要修改这里return的内容以及一些战后判断) + return { + mon_hp: Math.floor(mon_hp), + mon_atk: Math.floor(mon_atk), + mon_def: Math.floor(mon_def), + mon_mdef: Math.floor(mon_mdef), + init_damage: Math.floor(init_damage), + per_damage: Math.floor(per_damage), + hero_per_damage: Math.floor(hero_per_damage), + turn: Math.floor(hero_turn), + mon_turn: Math.floor(mon_turn), + damage: Math.floor(damage), + }; + /*TODO:怪物手册的修改(需要修改这里return的内容以及一些战后判断) 1. 显示怪物是魔攻还是物攻(在怪物名字上做颜色变化,物攻是黄色,魔攻是蓝色) 2. 一防减伤是物防还是魔防(由怪物是物攻还是魔攻来转换) 3. 特殊战斗的怪物,在怪物手册里“伤害”写为“特殊战”*/ - } + /*TODO:怪物和勇士同时跑条到终点时,谁先出手的逻辑确定 + 怪物、勇士和装备同时跑条时的计算*/ +} }, "actions": { "onKeyUp": function (keyCode, altKey) { From 827bb8977be4f731227dca713c53f35cd2b6b486 Mon Sep 17 00:00:00 2001 From: strawberry42271 <2806566736@qq.com> Date: Sun, 2 Feb 2025 09:37:05 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E6=9B=B4=E6=94=B9C5=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/floors/yiqu1.js | 9 +-------- project/tilesets/C5.webp | Bin 350830 -> 354910 bytes 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/project/floors/yiqu1.js b/project/floors/yiqu1.js index b2bb0f4..ec80832 100644 --- a/project/floors/yiqu1.js +++ b/project/floors/yiqu1.js @@ -14,14 +14,7 @@ main.floors.yiqu1= "firstArrive": [], "eachArrive": [], "parallelDo": "", - "events": { - "5,9": [ - { - "type": "insert", - "name": "chapter01" - } - ] - }, + "events": {}, "changeFloor": { "0,7": { "floorId": "yiqu2", diff --git a/project/tilesets/C5.webp b/project/tilesets/C5.webp index 641de3c991a9d1bf1ff1bc4a2f071c37a2a0dc82..bbb361e96437de7f0eaaabd459f2ca5ff5c27723 100644 GIT binary patch literal 354910 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%0D))q- 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
jK|L;F@H~w=Oawxv@v8QzTXCu1 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

l<9Q!5)%zgU^ql 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 z zyxg|LsdR1}ZvT!f`bQVf}5V&$-#kAqE&=mz|rz~)iJDb z0T)*)?214|6PWfU30@HfzK;Rcy8Y+_w~|Wr|ARApWsJ^0?wNEy!^$cqJ%e&sd2pRs z?3BV5Th9`y3r%h9b!Ivpu=)%xS#{M4>?aP4>msY5%175i)uVtX^41yWV1!&q0CKg%#8Zk}PK~8S zMu`kFiWcTjivV7*Irac&uThN#0t!eYifG4stKGY|hRwG+PKgdADY&m4muug$Zz0l* zK*V3_0eoAg_RD=fQL%MPpZYfVuD?dBCKpdFrcQQXX7OLxek{%LC#s@_~ zlIH2j%;Ip$p#@BrBb8`m;g;Omd174)^8iI~2XW~nb{)Mm3fhe{i282)qF)vi8efTZ z8BKlGykZLCuQO=><&9~Vz6Lt8FdiK7kq~UkqAXstrl<%VksclbJCtF39(}zbW;hiPBU4WvWaLfqjLU)sBg>4gS2A+Ey?$ z^W_Tw3hK)vl%KV1bc`>*+|9=F3-eXGz&e{wdWN0))b1>#+>1gHkRG4#=)|~KOKycW zwPzWCU!Sy(&2$}cY|48-r70ZOFPz4(N3VDzL5L|y=(myrQKXfH}QD4scer#$SpAoS*Sa?qg z1qNIyhJXMdFLR>`HC)c4%(3%QTM^*HHprB}X%&**o6kr01f!T>BrcUFw|h!Tq@qKn zU~b~Bs^Xo!L|Mw~>Z5!a15 zel?CQ=q^cBe?i1{p%bpq%-|VTO5(td_;}r~?u@Ne>6=2qQA$1V2f`nV-N-HHbeKFH zsEI3a;{>3%)|^kVae|yDOnZhsypEB`Hh%3YpeVt>Mz$1lZ5}VLqK}uc130DD) z6iCy5{FYNM<9Ic-6XCR5-#G6o;^LP16mJ8V;pAs%p{x~9A}RCdb*l+VgE{~TsbaN9 zy%i1r&y)^q$oGc%jUqtvN=uaU5k1-1o=+=gzXp(6s3ZC~WXHz*`Lju$8KW86D5k8F zNfCHr@hnLkh5#VF!MD|@9M?}^E>gQv>vAhj@jkmM2Lzf51>>@zXI z0000mlfW*QM$}sBXi^jyn3NA%MA;d|1&*cAM8G3=dt2Tx@my6Hv>_VOV~dq6LsQtq z;V{S+Y(y3<1N{#~H&T;7I}^d;_u04+W|1)6?jL)Oa3un&BFWFByyBsdj3TCzpkyIh z>_HoojYN6o}G1%D0)@X6)Z$1mIrTXL(4q4DlP$&3O(aUGW2g$8?06aw+I z?_5uwN5y{XeKAe7u^pi!rxo8O)ylh#=z{0jelplFOQjvkVuBZD6I8FEm=!;{oYVSk zo$XrO2g1^?FZB^kxQFm5N1~k^-8~<$4TnRse<~;KFb`Z= z^dEwiD0&Sd3^R3_@7UU5<>c4Dz%1$TK@oro?qf*c6w4@v0?LHYS=|oV#wJScNW=-7 zOH{1CBZmUehwQCgi=Lhk7^ab@gN7?1nk5BntoA}j)~A$R#y=GdN@EzLxLMAz83YAP zM1?#Y_VXT$>{SnFiYx<#gJ3a`cTXrIH;t^FblElwEn)`0OVUN`OZS9kFdNEXC^R;$uwz?EF&jZ<-^2Lq>+N+IU z6sSV7pYR)a#L@@m2mmRSY~%-&%W=*d9DJDb18yI85oYH`O6u^=r<%;AQpck53oLSdbj5w8;6F+_9IrDlxcCUt{Bh+?y#YGOUfEqxW zvVX(}c6v!*cldli9%VE|p6|_=2$*lI%&Cns^Rm3A3=$&r1DqQwzE;$O-!f;7Bcbv3 z$n)Fm5sa%^E)d>vB@c9HMVEwP3^k^!n-owHjhnvUbOUNkEMp+$7cFxR-{Wm!Cm+dr z?KXj28kzTs`izpS8 z*hLqLd03m$S`p91kbA;)tr9TG;50z}(TmDSg&y6dUkLK-u8r88FsgWTfrbwV405B% zS4-zrEKw_D0&atrJ8wsJiaL;tAfy-H4zjk+ol*qa(z4e|zbK;rt?oNM|kF50b)%`#h@(3nH%&NWx%DQ)Q=Peg&3;)>G9 zVQzLvn9F~p%guYasK9C@W^Ol5Z%QM7t-ejNvH!%@Lw%|-pP zN(kEs9IqnXG4-{iA&H&?w1B3u;F`I5!w><2-yM%}M9?@a;`em{YyaUPI&A=G7C+A0 zxF+Fs8vsnT6ywZP<2Ple8TUKU1IKSC@tMEA@@V^2H||)O6;WJ_6^`w}M9(NsSbyM< zMvUUvC#>e-3j*h0EJt*Ho_?t){xW_!ksitA(+)dlCz6VbBiT9qW6EHD%F$r9lGy3C z7-TujK$|OSDk?ld5@S(kN=iY7^s-?bF0shA^TQVMAKH+QZp_$J(@|A61emj@am*Xl z{u7x)2gqiWX|72%=DJa8O(JcXdj4-*NtV!IA}K zRgL~QH$(nA(15;8izEMhLhZ41zt6J0{2n;jwYpy0t!AaWY@|&l19*AGkHh8A&|AAP zS8jU(0mSQaX%xd(g<@h4ll+{qEG#zC+eLfMN1Tl4ElD z;h30ZmW!2TlBr#fO+U4sR`_4vGJ8l7bU%t;D#%ETL2{n4N2gbP|$TIpBi6klgLT{hI0%z&zcZ6k+xyph(5gJfZucUK@im0KND z=C5u-?L-kx%_R`xv*==bJpx1e@aplRa2`p{mJ3Hvqa7E5!(pemp_R6AFGV#Rs%F4PWq# z&OjkIq2z)o^Yi~#2=wTuT{(9yGi%60$^#~nMfQY@guq2o7(?T$Ay2#lU~W3Mndb8I z*``Nhage#bL!K#7_(*_?i`?c)h>4mb>&W(P*1!i>-$EQ9i0LYPz(i!&9S^uIX8&o zpTfmGCMZI4=b23lI7-}R&8Tkw%n4KP@|>3F1x%Hw4Y5=PE@SatQ#H_O_*i`^+UA(_ zhH!Er4;c-2?tY@;mn7htq}mTj@jIOQvJf~k^Xn8li)Fbci-G;RUM7fk({a zBni)cS)+TT9!k}=J8H?xT#mz>kP(!Wp0@4mcKPJN2{@a8!4sp;gMmqIEcQDPx;{D% z%kAG8q$=V2-YH;s#}Ov2nL%SDQu5B@rNYk;vU=sjQ#!@vx30l4CaULUopZwNa7G+{3}& z2ieZxquE=69w~rS5_k*xQ<0}T)$-7HrEgg;pzRnxdXEE^UEQFM$jIvjaqt$6D9rwf zC#avX0#Xh-ltn!hrRnz$8$O$|mv-9hb{4SU=pGuN0k6e^vM>D% zQc)2mi$)0#*noJqx!%T#O%eW6@|GZBn~N-0$OJA6X-^X%P_volo*^r* zR$-*j`l+)7V)QWFo7VVLsr^}X34l0Ae#$J0ObrDq=otH?2l*6Db&F( z#_@ozk)I^dt1t{RliH0~_qQ}sd^v;js-$9iH#zmxhk>34pCEhnPTD@P%HTA3!Pas- zaouQ9OYIVWWsy&22?ax749VU&dBcidtg&7@*6t;8AOnYa%>o!8cCyKPX4UNveH{mW z{H?wrujB{vYa0swN6Fed$f$gfo1K>z5|h{)cH-BJ2-sZRbDMyfaaT`y`FwGGuy?^5 zAUaY_nrHqQfTQ>M&L2uFE5dU)CT@_I1Sk|}FTTLb z`#O^KYIBn~?<8EB66Jl~P-NSIBFbpw-@eil*c!{g3z#f_B03{Y54_To#S#wWqGX6y zawh`9OhjxQ@Hp;Bv&ALmMIg%jbB?{#vOk;4)CJG{;F&xC^s$gqh>Bx!Q;)4v2}xHr ztWV*d=rO1Ls(&QHCPbrDFvAF?&{J>HUzeGoGJ`7GOV|Pj7QXD^a4=OugN1I;&o3gJ zkwR8fhC*y%1ItHSMW9&RcWeVZp!S#^Lc(t$n~2xss_zOL7NCXQpV_CCV2x97UrGnE zyg(vl-Af`K0i)YhB;b#nK#yBzNR3XbGL+~6AT34Q5OWuC#z=gEQ^(loz6erI7}2?3 z*#C>`%5F4G3CLSe1Uxc!wu%IGix($2>_b%i_AG2kcpddd+l!Mno4;t85p_8rZ|UA`ir;y@~dfWuEaX^RHSzik6WP?r=G@6+Q zB9Coz8^JmVH@DUgcPGQ;#LM@3_&n62x=720G1w_G5%Z4yc)4B@yHL}69f!}`Kzvul z*9eE*W5uTw>eiXgd4!lj<4zhXF!wFL)R@*RU_Pp&zW$!U} z377|zrPSVcpX|6*{$~OhuK>%hhC`Ss{NE9yoLNE@a}pByrtxvcEbK<#xTu_Ut6Y(J zyQv$0x9P-;pJW$?Prxcf#Xhr`W-4O zXqi%C7Txx}m$YHDyjl;%-%GDC16S6TJkg)fh%sAdHTp*+DdCop3vs8hyvgmHQpT zkk{ra!e2CCW>7L7rwC-5Tn#K0L{&=fi+=>P2wj+Ioh>)lsjkmW7AquozK?ZrP-h;v z(%Kdjyw`sX&`1uG*J4a^3_%FZge#u*zQsUZrMIt`zzG-|MCcC4yZ8`jGgGalXfjP1 z7t>`ws=1Fk;Tz<92r$}LSpx9>EAG%Xu$Ps)Cr^F&-$lFbPW_B`_olt*G6{kTFXbj=R4Ay1)!z(nK5WsHr*P zb0>}5P=25Lqae6ee&?dafcM-FcK%`%pQSM0OR!gASf4|rb-y~Rp#S+hUHcxU!ZNVy zLq>ib{yS(YN$&qKiZ$6xYg?Py#4$zqt#(^PRjqUo-SW)g4ZmzVeE;q`H1ucz_o4yw z9a;X=?)UJ&R5|Opm0aX&+4;dy&XPdnR6cB_1 zmou2xPp!XrJ znxk~3{W|-L)_+D``Z<@}pCjkdW=dE_Rai$6d)*rDR2*4Zj-Ycfuab)r{3D}3K*1uo z#A8GKdCRrAu{>|+d5XGkM7mB*0`5Md$WZYjHAhJU(e2;tY5~Z{2oU>)2}v9jG#5k4 zb|GxyRi&}X%ICf_hJ)B*F`L>7I=|@!t-pu5DXPf((5*M!AcG&0#ST1fYGn_6E>F5R zxkK@&A?aimYm@!dMu|X(dkwJsBAEk9W*bjMQy&A@u&rwa1T-DjbJpjgloq6%+1vzl z#u}agP#?ha;jV2lO!54O=`e%9W_0}dc#qp^K4K1j^(NyEEa43ZN#9r%*haR*h_74RR=^)pO{+^mVfO*|o zqu#rfCORvQ1IrwqfDcxU5+UZU$sO{rVymrtdljqe;u4TyN0!GLwr)?`C#S< zNu9W6p;LFyYh2qHtSHRVwDp)-%2}&FNd|P>&BBNa_;!rJ{APL4b_;as8u%bVLrmyx zwMmHImE_4OGPE=cKh5E#mt4B>(`v08!RT@zP$d@ebD{UO+KZ z<@@S7W#Xy)tMhqy6w^(>B4?8mJH1}zgf|e^z7`Ql0Gq8_kV(V+I*t6EHMBSf_G1x( zpRg>-*m6-Eyl2~1ez6DAM`W+2Z`5HNiMSmxwoDcfMh|y>2Lf!HiZj245 ztwBLV%>C3HEZUWi_V0`KLygRC%Y6($`@|yLMUlagG%>-%wQ4u;&dPxSm0cs1z>g~t z3}1vd-C(;;MKW@>+*VQ;{$}(awHht96=iSO#i5UxN&C9hqOs)2HK~#J9Hpuz|BNw% zZ2==#(aI9p#s=nBcTS|Ru)K?qrz+4@e5A1f*d5Ph754b%yg!-Y>Ra5*+01_0D2}DN zn5^qF!+Meqcc7q%*GOdiBdFgx0x{~A<@*0OY8Lqd_>N&RwdKGlvAob;i)V0H-*!z%PlTx>orE;I#;aQA zR1ZZ91_lih4o$jc35y3(g!raGcy?s2370RCh7JGP11lJ~SNo}D{A3UG9~N=Sv;`Qj zX(lL9V9{5ULeTBugy>IBbT5*CeoU+pMpklv>ndaQIXc$dC6}b+zOx7q7DD z1fN=g07CZxE? z0P02QnLmE1%xLt`5XgK%>xDufrd`X@k;kWVBm`sgR!(uq?ZR16L1MHH4c@LG|TwKCgX%!>fSwQp_Fk*upEEA;!Cm{Qd`W^mRoOn*?hJ8L;)o?fm~ zIod&zD?ScEL+5V_+K8e0*m zqxgi1y63V43m|q-%i25>v996C;=ErgJP>>1*rRa5y{+Xjg`$IUaAck_8SsGX^p7y< z$}fgrhxGp1m5x}O`V(XDs#}l-dP3zG(xs{~Gzh17@0Q*St{yHRrTHAcs5RY}`MDLg zzy~`Sq&bgC7AeGh9cai(Aw1m9wu|V+y=Z8QRo|QOxG-6AD6e1QIEXw%xPot8V`UQ8 zFSa2ATP+5a#lUL?tU>jQ6Q#;~-cbFC+vJwJY4Czpc{!t6m*Rw@XQ3(bPGKBN>97=_ zbhQ|BME+(R`sNk;^?CL(tgweue1&!YZUu_&BT;tc8TJ9?(;4Dpx*JVJO`R z3^v*0GT_V(zhG*r)PLCS%r#A{8>)g+{#F5kU(5itZ~UvS|kFO_T2X(gZ zs@m6J^dUZVs5?f+(2uoJ8vZ{-yl(U6(WDhfXW{O|j{!xkz@8unKMOh{&L=`)a}tmejb{5C1plNQYyz}l3k_0H0RvGE$OdUK#9WH+8f>aCLo0W%2*`J8pvCV2C1#6sMMLzAD>(S z9CN@YP<8@rM7Nz3f&J6ey9Z~RySj4q1n@9>;3u6FOJyL~P_VREgaNx)0talhg_Jpq zA2w<|03F98sE$;{BK9_ayKtApez*}^HB#Thv3Uf@uMbxbZR`)k3LtfH$F;Ci)MB}z zvVQag9E;&I`?5u2mCp__8BY{?By0o2ho3$R$1Nyox4hnR%d+D{=#aE9;!xxnY3dA> z(sOYRg-fJdswco#;F!H;klXwQ?8^1M2^HBO)lga$kZSNcZSrR}7FrR!p8ubK9Pn;L z2v$#x6T#Wn2t2a;}~NpQ9W{CK{Xo$3UB8F!P+5Xz05ym(OKp5`!c;? z$$rnN%HZQVqeVi_9WRSfhbpFO&(|*}ml=-DDRJtGQUs+^!XCP*UWn5^Ziz4p>m#8s za08vJQY>$lxOk$fUzKd0VEi8o{|o$)tNzJ16PmnR*&M{h&7HD@6DW~4t}Y6wRmmM* zxbevl2XV;iDII2c%xXt-bZa>D?q0F}MwiR$;1Md6oxfH~ExJ>6YmCGM7ak(;-~tR0 z0`Z5Xo}vNe#`X_>`=Ht+MmtLDE1S`byj-}2mVe&V8oUhz(p6xLTfjAWPm?*KIm^lh zdZx9=N)OkFsK!=gKdym54QVLCvge^V{l_^^3@-Hy3yG??Bhy+Kk@22%+;C_U4NvOB z&q7%)lzZbk5O;kR;1v9pf*8t{<`+K_>wQ#nb$%`Q%&fQ-BI_Ocr~`n0+raz}Lr!m} z1Yvs-!vJ!*-tal20<7Lp4i$3v9_!+LL)Z$1s_gWti|^)8r=8{L9d zSm>bhW-5N4rf5L46N#ilFU@F*$w1n4%U7JaAOI2)#qlAENoH6{}tnTV3ndN@P*w&RH6uss{_+gw0331IO zdA#?v5Z!5BsUrIqxQHxaEO@=|&WDF0FZeQ^#nJIC8{AGSd8!Z)uqHdqS*>_ZRbS7l z$a0-ukA(56Uy<(c6{*_Ff_IsU4rJ-Lsu{HR8?-d_$Z zsDv0!B$C}4sMPAG`##j*yoO9uSl)Q4a`oFWTrlPKa^moGIe_jxeR(I9YpkYwi0sK^ zbA*zswjlT5lIr_`C%;~QSdS6U?BBxj*=45(lak3Lvg(WSUdy8F@$gWT%`)ra z;T4Z1nMW|y^;eUCTMN1p7{LK`9g5D&Y<<~48+FE zi?h;}+P(UP!tb}97a=^F#6T|3xhz=ZX?pAcrzrh3nVE=DX-ln9w=%OCHq*Vw~7u4lz`*_MqKdQ4-0~E^Z5_77oeon!`M+Y%Rh+(jcIYZ^G9b z8WE)4d`dloXPKu>mm$nxs%|&Gc&l;XL^!7AO&mGC+(Lrcgcyw3Zfeg1HEFc}-+Bnz zFmh;??h`)D4H&G*g?HQ_y7Pw|G;OihmGBt5WZ0PQbLhfrz5w~V?bT!1+AEyrd0zEQ zqqf)fW;6uD{&d01rbo-J&5*+-P^v$yoAC(ImZvCLR|;`sV({5Sj=^s>e9h_9=N&+U zdVulgKug71bs0tZH^5VA#-vvGz<*gbGret4J9L!ld+{IJAJ1TK7l@u_pSe-Gj94Dn zGw1ddovf(Y^#abTEf?B3VVyYZLPW6HC26rXp>2+#{k?ScZpg^O%F5`Vtq8qBR!~nB z<0h7e9f$sfgvbA^G~WI&zm?|u?Zu?VxgjUat+w!KPCqgQakIa=3c3JRIBhAalxJY0xMy9VKpO& z-TRx$D+0BzkzHtuFk!Gx0goQ8v_n&b=BhnSXamaWoT7POnFG*bAf=4&gzOFn(MlS; zdx{M(I61R!AN~nP#0At-i`mDMXZ77%VIiImf9wwTHpJiGo`r##lGDN;b=%V zpo#~DcjmT9khG=X00E&L)r0$%%yj&8J}psnTNl++(ch8AvG|?>OUS%ZJEh&gz~^a9 zRs}m{e{H-2j_rF%3Eo7VUjct78omLvX={e^^V-Sv&s?pQw3pTQHxRM{O7{9~8_xmi zfwwNiNDh!NX5X|u_CXT`;B4dOnuHNUC34NhS-^iO=kz{X7mNvD%r>YsFPHdf%oSlo zC`+Ejk$NklP1(d!Ejm_knM21*GX7y*s9UzwCFRO) znk6dG8e8*B(t&<S0QG3l zsV_~osLBx!D2YJ?e08|Z4hrMHKwFw%DAztBG>GE??k0bX?j!`Bck$sdhohGxar^gb zIN08+>}z2(R#23NT{w4NB~%x+xz$jQ@4+6jZ7~n_->7j37X>TcTX8bEiV+wiJKUs69`lK+2o&u`ddjEOiJU;1L=?E^Xv|cmy_ag%ADyx zeWApl=n;mzlE&|+m?~ymTeC$><2nudsb{Jr({eSfMzukO7eERf0spG^2`#dF)C3{qJYeZ@RgCi9zQnE9gFCWYN{slrkBE&NO z6h0LuE%Xi@ihOMALW_!HD`TkaD9Vb|*FqCfPQuk+p3Q6X;zZ%fM?rW@xU?-fpqljs z9MK9kM*a~qvt}Ub`5n6TqMk)Xu|m5-L6W90!idmjeefG7Mr!Y>By$VKUnKd?Xu>Dd zb1faGv&&c3Lu_%iTz{5xPgQ#!AlB)Kct@eWlkK5Widm`F@iXRX8;ubqaDME8P;wA0 z!P2~TP&8iwAY6~?NisJ(NSA}`D5>RKo;E&}hORh*ZhM5;4Fvf5PIWrp6{~R_DgMQ5 z2%O1Q08}(Q$>w-#%U+W0k;n`RLxOes`0x~|d$sJ@vGTm!JN^&j_ZvzA>E7D4D z7IqM}MdXcmFz<`ZPygy!mJ6g!n^DD(FNEVPu=gNF(3Z4H=S21lOM8n;&J?CXE}g}r z0FYsWh`350pDYL;Zy(S7>Uf*DJsX)YF=7%%Nj@Wy321W6H zux`$}I!}04KH|_ci4kOtKhU4_CdXkakQk|5^G&K>y9?u`2bX&mqex}We>CKj&0M>W zX?0G{aB7esjMDw^YvE&=_2z5;$ntiOQmJL~+FWVYSP;Wee)D?X_cM0iTfo)oJ;VJt zp}?{o?;P@uR%uR|ZGA)64_}cYPy8w?J7}OvD_?* z{E(u}X0ssa4@-nt;Yfp7Z^#l|om>p=NSeb^u+D8%3IVwEM`wq!)@p{tSMrSa68z9! zHtrj7m1jfZ(OvO{$@-{*U|kD^dLil>@(eNjLTT*p(1*V;(C`;=eh|ijsvRb?jsJ87 zVpKeaQ-SJVORhYEj3ysp0E~E(sMgG!KwA)E3n3_S7KPezU9inQLCp|bTv^k?i$aM- zK4-y=iD2_E6(H?*Ulb$=OY~P10n5&iwvcD zf}~|Xi4;7^s1KoZN`6?}SqOv0G@SLW8*V&6uffOMbZ?r3^jKg4f(y*dZUECJMt`tr z4oxn^M#09fGKdI;FT8co00Kt?L!A4)-tEE#v_3*)YV*W1bAQ_Ivw0L0A~`RmL=Vq? z&XTrhtSjn_;p1#YTR*_G+%Y zYw7oL9gyG$YDE-{r2<=*s~{6**HnWKsnOSxLo6ye&%6L(eHIHWb=wrxv7gs&?i!B2 zJSpJ(PU#a5pfUY$X8TMeXyptlJTl{YnjJ-uzavIQ1yG$pHD-{0X{csxXSEKg}`pl19Ux6IdsG7 z2cz3aV8TF#+Li7l4c~&(%w~bS?R>A5szwh1SIPM* zBkgSRvOr$@ypNgJ(Oaeb!l|@$Bh=j@r)!C?hHsYWH|vrL#w>q-SD(yJ-3|bn5VShY zG`@+Pm*spGbzL1KHrN4o`QnQQNao64K3B?76jG4s8_opi@P>FTfus z`|>;pp=l)P7BWmpwY8`kvd)mK>NdO@(WbiN*NCOlc)6hX; zq$$y*233j}z|vvzRp2wOih%U<6HLB1BdkK@lxHAXX68~9=+OXp*oLlN+D6kz>5ly_ zTyznPj%X=>M)1^>?eC+xi_1cc_ltKfA7Bc))y&aSACEt5RAuQGf9Hw^> zuPj6<$SMUX0IPB0u5EIE8qnG4kOV5SUkHKyh)Y8OVS^`%r0M>U-LD+)WOuC!gOxo6 zK8=1=ZuoPeWU|FGvvShz74WOCw5uVpk*j(hB%ruW>XNKqeK(qYA0biPx<@}MH)%%7^6^9;LTuB%4cyJ z@|fMN4W5|*LJ-EPLvcB|1wf@B6?jQ?5vQnAz9|rmzT4~tAA$RROK3`6-CnEB+&sN2tpXuNN!!FZSaY4!vw`ioSlZAp;0#^AQ*@463IO zUcka+!%I&P=>N>IP%OSHu+gU!+Ry{y-~lbK3N_YTw?EKl9UkAUILCN0{PCiTD{?K1 z)CV_gls5v9I|mh6o>D|`X^%w}a+U*{eg5ILqh=l?C``sT%Gp((X5w$houBTwtO4$8 zv|O8gn#n(Btsm@Vt(EFksQ}wv8sB@#9UH zV9@o`3qnfvrh@2urbdLiEb!WPGU;Qrrscd1?&3A&3&Z`xrXm4WVDgg&u2z^&%Qby$kY_LGguUIncPOa zrZ=E)e=aT;73Oin>)+{5x7#w{O4U|{gm6V0{9<=z>p_#6cY*7#4hEqlj35D$abxb^ zx52tmdJB)KVkp}}H!uR!svDI9${e{K&Jsz*=3+N0x%pn9Kg0cL#yi26=ZzFuTT6pl z5sYti9&QJKy9cJhHTh_9wwgMJj9*rtfHCAL^VJU~-*#zCbeU*lsxZD(?bbYkAfZIR z637PpKaC!>aWDx+>tCFoN|$!!=(xzfB{TjOt)dicR;7JNO#ifa}V=YgxD*2V~{47SHn9|IebiB^J^dX7;WvEMOG3?HYlYUd8;4`BydKY);x^b0)$dj=k|rUC?Rh^^a z)Akg6r@WR{aoiIp;r>>@Jd+Lu@P)W$f1S3$(r2Z;Ia`TCN&;$+l9sg@hvwEjq$|~V zK4vuF34_Zz7ReP^Ha;62w|=%zin2%>HL1%h719E~|%8*o>wA2~SCq7c3Br zMWUdCr?b0Jx0^!;;%NMZFPS4|dTnEvXBAFQiYHE;t6nD(qLQ|sa4*%&a z(FRO|#e$<2Yz;5(BN4V9KtE-?sr|a*d=G;k_sDu&aQtIo?XL&Ydl;T5f7Sizb31Lx z-E#S9L!EFRZ`0S%7e3vv0t_ne55_hg+VFiRuQrU)!20r5JU{JNe*qnVNn?<^3qxw1 z2R*%k1{-R;6K4E4n(_ulF_kb{GfJdPuSEtyYp;&15gH)}2wdMs7lfbdhYk5)MwfKZ zuMbk$M4{A?x%Nsc-&U=)d!^yYR4$Xt< zEYSu`gT;xRmDxStz4tp`d7(Qy7Uxa*HRy_!906pkjzdcPS(I-Y*zL-T1y;eVE=qbY zV4r3U%y_OSALwVf;VHRD7SaE0OC5WCumlqR*h`VIui-lJgL=EGO}BH|ou&$NZPJBQ z=Ssfl=MqGJ?*gIdy0PH5>u@-_0?8bG)#K8fXx*Q%`w2c2n~uudT15j%wm64<^F8#!Itqaq;B$C(j5vLTouq*LyEN##=L;S#t+Er#BND@O|Nyu-T z2Hcfn``^ZUS5j3ngGFC=cx#>Oxl%&!z6_O1?*H@nj46W``P%sI^8Szatt|<%Vj-5> z5b`a!*s(0LboxK2MSL5PViUNWnCyyt_Wa`qhUqKulE_#da+ZPBp^b;OydO#Hf0cta z9zaKDkr*u2S>3slvCg;$RAC+>cdyQ=V}|WN%-y;?E-5=QlBArW@8D+rS)y~hkr`nLq*o{?biU`Klf(%Uquovkod?+MP>#C#Lv z+VEcFw@P;7{Qb(NanxZp=#OGab?!Bp7*yzqbAvU#1_ri!{G`dlK10$X8YdPEAzwM< zh~EjH=@Wc`N^I}Id&F6`yqhyPx?Sq{LkP!gB&uD&;ULCl>2t624^Tg4NkDa%bFB>J z2euo9B0nI51Pthyh3eSC-huf`Ox-p90tB?ixQDrf6oq8n21ybvm>pnAwA3)J4ZnH%IwD z_aQPiiq75nbHV7^6`b}=Xmyg7nm03m`}^>9xXDWq2jHi=8ye{-X`2=jzty#wA+hOD zv^HQN7ymAeRhS@u!A@{Iy!CBo!i+g^B`JXK%FE-(V?q!CgaxfMQc(ke2x`g&;Dt%y zQMp}L6SzNzYBYRCHeM%$1nZ_MYYK!%%Z2iz-E46nurl(b&Y`ptSF{1C?FNkrv6O#2 z%Xv4R)`6DH%Uf|c@yB7#Ovp2->GrjoM#e-*K?5~04W(?|ZAJ2QE4Aj7+IRzuCKZ~R zT&x2{tC@0DA_=mCo?u*A3XjFhY?taZwF=1?*n4Zi^q$5iiXROT!Ykwu+%HXEdyz@{e%_0sH&bCoQOT~#p&^~Mf_kk{D`Y!Jtc+qUzLNMNJ%;*Nso*(1G6PiK0IH` zz~C69urE?IE9)Y(!=yeH(919dRNI7pS=`)20kO+~7?)Le;UtckX|3w#$8=`<1~A^p z0AUIY)9`9E0EX`0rXTJ$Ug+tcstwnLw54@zSI%+H8vzVc^Xup;vy%gzB2;X(gYNeL zAdyxyJ_S=CMA8i?CfTv-2toHZcI2$4Nw{!p_I!U-ran0cT2K?{@^Hn$QsnH}Y!z^n z!7_v%Ox;>-y2+E`AH3QMrQd6HOHVNrvI!%EITt6R*jlEIyfr|KpYB9MPOl10Xsbdv z6qcJix{bygf0UC%bP<*v#Ann)iwL&sU4JFY86WY`Std|#mo4NNxkv|@_kiDGNku0eMK+HO6a?bAr03qW5g*rWssMD9O6%W$kh#XXXmCa|mc$w&eZOI#+@lWZ7#q%=@c6a~) z18(7O8D5<%sIl#G-@K*`ZQ*@U`zyQ!qT`5@tT6C-hm{azxdjl68{Rr+4jlKc>G-Jq zDJ%_l*+0M0J7|*MrWPU(Cq7$txxk{guy1F$TLoB_jv;SG=y!LnN@!?*xEtg&-V}ui zBk)R<)vXM>9tf8sXftQYy<=VyDW` zSzG^CHPHAF&m;UsIG>8XztY)**t_~P^Lots)~zQZ6hG9ae4eX-F4T}v%rfB-~pZ0*l> z3;pJ0YMlE)w{3p}66qEql3Ox^u+D0l5~iqkI`vlH_in}ZsEVJrTaJQENqm?>2R57g z^pRRtVZmv}abY%BG`^945Vr9aa19a6(oq?ZN}4Z(SR+r^=ORn}+Qiu{`xhW`)l9qb z0xbo79$0lFd~cRnkT18Na}T^${ucWDM_BXsxs3AXY@9T~!bCIR%t;Y*`ki{Bon{12 zn73Ed4v?qh_%T~+h`; z-Bhf0bUT0%MsZRtuspNIB=hn$K$`P50K0N{fG-)}BN|3wF#!JRU!$Xh5T7Lwk+gXL b000000000000000000000000000000C$}3+ literal 350830 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%0DkR!#@HS#aM8R}T5Ns<(LJx0K41&Hg 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 z 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 z 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�<0{&%p!;Kg39t?)( z)W8pC6qu3=DqVNhVp{T0^!mJI-OgjtM~L6DE6Yc7hlcc-(oL1{jWRNCcy`|7mPOxY zJ~bIrR+CfL@VTS{!5>#>W64~SZsff9vjp+6tTH5Obb0_2HUyx#0BX)uKb;c^&|s9m zKs*ZG=*l7#{ZGliyjAqdV=P+V#w39TqW8k z*R(B}f=PN~F7x_>V*4K6hW|GyLEno>_DG3@y;8in2J~$HevqSDZRWS1lIK<%w;-dw z3eTu|J?{nn48>!$67hMbvEUz95HZO1vilY6*)C#N3E|<`VwQOxu2_*Q-{{pQK~E@! ziPwPOo(K_q01ll0qBrCpzw;*q04-FIYgO?0#@U=BD3D0De5#d;Leqr7t53D|L`!0xpmA)Z3J zSs`Ta4fc5ckoRGbNNFy&+7VmxazU}drpAXo3|at5C9gs1^sU?Ms_Q4^G>DdInnF2@ z390r-LlDwO6OHsl9&u=(nOA~hrbV{g2_)f9l`>;r!Zt&@&E0&xm}@H zp`}(^`1s^utQQM4;X%H8Pj##@fw(*QD@+W{`%L&>PJI9f!s>DH!9NWlwGp8_E|#S6 zoStQX==jBE>}E@I2<4$V@&WarMTx*@ONjLXr}GV3pA)*{TZAwUbf`7Yl==mN4DrP` zF)!nZ{4+B_=63AfKSpXyr+`VSNF!nrli<>;4w9{V_=abir?)S2X&i#;gawQ@q%8H8 z1rg;V2n$wu;|w7nQfSb3M6I~Rv83mc;dn!+P;NVWb~K*GZ<@1Q?tLut&xt$8NDb_} z_c&G5wszV3#te2KS%Jhzy)>6l1+ELK?g42sWAs?TbI@VoViuPJn^@8UY2wO_42z8mrx|{-t>z^cfj+pmd3*)Te-X z?LsS7kAqE_ur#Q!cG9vdyaFEezF?u?iok}rwZjXObmP6n zEnHz18Do-I+OW4d8U$>bFZ|WN%RwC-`agx7MA;YmFrG>hpk^){ZUC;^-3jNboG!CM z)fq`^@!@uv*I3P8-Je$#;OCm}IVA%af!tvC&v=h`tV($?vXXZY+KYc)rXA=3;qE-9 zihklk50_V+Z?tp~>!Yy0PH8}KoCs|r=S8I;=!VXLX+fr6!(t4nwy)ks#m}p2nC;t& z4&rafUSb}q|GkWA!r?z9bZtn}kg;6r-l|1BTXwg}3Pt5-b)&qG0|TFG6Kgelimn$c z|5xH%SVLbikNI6-+3TCKbM?i>cmqWRjWeD<8XNdX$j;j6)!pK_wS*1w`4LA)uuV%FYq+!Q}>Do ze?N6lYG4wjvC9J?uaoWC^!^sXNe@r^HnZVRZa(;sSUrHVL9)g7?FJ#NeMey}Md$8? zIljQe4s0u_M5WzK4j7 zhBDS(&#a(yPgke=P3b68U4gTx8U3rPTzWXSxjOmA4g`V3o`TLE_4whO~|CK3==PPR;8z+pWh@Z%>9KeDs-TjK!9 zhDy@kXmm_a-)p=XIi@g&udsEi%*map>X}}@*F0t3;K}V$tTTE7)>Qa~>B!Ncp<}*n zIOE5LE;K;FRE>s;-)o4fc*Y{A2@;Gn(lN#3VQYb#iIlBk2^a`nwe=j8q7yme!& z(J1D>aI5S;+Y8*Ql0Hvm%nx>`egBGT^1g!Q>TU{hRP#N+mhWeJ`3Og$rL@I=x@g7| z_fEiCxp2*hOO6X}BGJ%vvA_FiB(Gr7Et1v3Wp7^*7%YEROBYs;>!fwgPSR)WRj$1^98ly#Heeq zCCiaC^F7?*)5zSBFP+BafqNy|bHEZJ`e_wIcjjN zR!9E%doEcUy1LsoLJ4E8nbI=l{?dZaT{J-anAsiZCsJIPy$7{0f?CnLXPn1lz0yvp zfr6BGg*Tx3yQa3-fIE&Lcl9o%`vjmFHZ%$0((ZRKeHJg0eZ`cn%N09*Rd1C^G~_Bc ztuMs0Iy&K%7Ufb%ak~H!Q%NSOL!I#pAFO2i2HHwsyf-n%H%?;YYT_%YVq&v)jtZwA z{?SidDhng0HsOeFMp7sCwLwTsg~}SEC=r?pY6>gMBw`%A|WLHo~Jc40p#c;<(XMKI<1`WE+@og8@xA25og4f z5E)FWfy2&`tUOAT*_-X4ozeMGsygU)2Pd~QcH6+g$1(#{(qpxbFW{dT93bDuS$@mv zs@`PE?xBE$wI%R&`SvnSZk(pn%yt;}+Q|z_)tRy#Iz^ThhYx6r`EStI$?^sZ@5+${ z&19Zbg>K-|-dr-aNM(y#$*&UK8+aorzav6GQ zqYSVG3`v51p0QGqP0KYhc3*^tuS@uwiF?(fiF6|N3hdhasx} zcfN+jbZo zwatIZr~9uiC&C$W;?8q9S|;uTW}2&EzOPOeZmAq5K4Qs9O1rJomJ&i}Fa6|tYuFxr z_8b&tJTKZ3Mt}qS+wthWw-NsV2J1&P!)O@Q{lB0B@7JrEY{DuO^-{KJiVnC!6oW2{ zUf%R|$hgrqD{H7VD?{h6bHR>tyszZezc>pQsy}U%!9E@YgI4>I(hVoG<^fbV`^;Qf zk*seVBQe3m>pu1fzRz^Q+tPBnZQ=%PO!WzEQrK)vrFW~g7h!m!LgcgWKFHzS`%nbm z+)x+Sr`-68ym(N6`dgrt_FMq%=q8gD}D|gLd8XQ(|-92 zCwS5?eO=^yJg6g=2tf7AJeo6vQ{)Zo07E|3}Z>BnJ&1 zcl=Tmi;a7N2M1*n_!HHL#QS!_O?9>Cj7g)%ZdqC9*F^M)inS;w=Eq5N`vQ2xCsLH4 zW;26<79p+y6xTOsILePeJGftz0DvqOxB=tG(N2oS+3%0yJ4Hy1D7iC92{1Trbfs^5JU;y9SV8GW-ar&_|G(Hh!| ziq^yptdd4om`d|vA{a&K9MS~cUkOA2au%Q-8HW=pd6gS1T*%(^@_%&jx-~R+rcV2gh;m*`*NRpCukGqO4V*p|nhKiVougnk7cbxj&yZ%g%E}u>4=S5F zn)2v)DnbW#KZ_PWh&?aslNNBxF%6CfmE3*#1Hlm+hgp1f1M6DWu(vy#-1`*|c&y{_ zRM$0w*NfE&*r{!^S^Xx>6b~E^*(B=(UC&Od7RVs92dxGct1x2PnLF=L#l%yR1pR;X z4It;Lwm!Ex-DyOOnU{lVPD=}iL9r0iasqdhH~hQB>sf9zpy+T`dwJ%&&Phj-V5(%K z%hYIa9t&vXpX3mrHt7UhV!d7>UjLhon*(US`#)S#+XOPq=FA41ei(@L5HK(@sT#QJ zGI?fjEE~>*O{M&OTvvmhYrN!?3}OdygWyyR>L95C^O6Ts!lBaR8E|X~1fhuH!hvmg zHHSv}&t?{L?9)`@Cvevh3pnYe2ASE=UJRFbO#%7PHSNPGHJ2>B#!Z=A>{OfXusFTy zW-OP^sM1GRWEn9N(5Y>mkzf1H3G)oR*C%N5IUs**FSq?#!~1=$?Dtk{TUJXA790 z5Z+qI0zOG!U(5h0f05}lE(ozGW*Gn*$T3;b`>tO8+fqB5%m?JJYaGo$3@Tf0ee&Um z!(XKt__TN3){U??r!+k{h(;LYk$#ZCzhfrYAM2=hy0WKc>@n^ zIGa9@dU*jZjx`J5+pcmdu0$X9!!1eV)Jt-ZLU&ju;lRN%rY2eF(sr<5v<)I&tzf?4 z`C6G9AFiG&vnCYVX%Sbz14*c*a(Wv^NMj?W3C+W?3(wenyyF1<4!Nmg-~1!G8;Jr` zJb{2>yh(k}6D3&98t@}aOmf-*cBxDsLqC$Q;7e9KR3)C1;3&(&@hBSG(JkT$bFROC zCVr#&kGOck+^TSbMWfVkk?4m_c9Z9v9$w6R#-!eMB3)f12Fy|ZCx2Ynl{qYfprEoo zWsfZLZQ;Gx$OZf5wt}>|j@$H(QTJ_c1gpp-!lG0iWaPWJ;gpvYsZ`h72SrPO{L zDkzDXYe5{EK{5g=7?weO%bbxuoRQetQ7h?ic!1l$T=~(3E=zpm)dU$D>+eb4RbeF< z6NgaE`X~kOu9dJ4*F2gTAzF9~-eYfX+0WWc$jSgi-Y9V#9W=wSnm*y_yK3{?qA$5{ zhlugT&9e6H9y{0PsuQtQ4xU!$0^LRkLByp9h$2dTUAdvL0D zdDFowiVws1WmoJtVd&m=Gt9zQBUjF)os#Wf$Fdhge2xHS={KT<}Zt?2u~J%Kz)sW5Nkwb9RWSWqhu70{bvj za;~D7Q)vq{C#4I(Qt%43`)&&6e$ER3$0YEw-^s~Q`_NIO7IkL)s6JT#Taypdm3h$K z>ExeROYp~F`~Hgeua}4$+QD8RfVtuRA=RM34yBAm*|H@=m+BtM+EMOudM@b*J{stj zF^2}zEw+?cyuJ_KSHzc;k;V(j$jMbX|3s`+dvBdg9{-E@6>^{H=(DuXJ`51eq6s6` z9a)H%O_Rr974ji2fYM1Zn6X^>a(h!e;KFfFLNt0JTFKv8EEBd17_vC>F- zYu=ETM!Lj|6HBY{t46mSk0iPs{Rc+e5fXv6iy&2-dbMAq?j}FNMH`$v6ZKTec_>PO zp>w-Y{E0ML3`YfgfJuURj3?eIf^GTnzSG$gt&U9xkAF7K;_S)+N=-^ot>oYNXjXd> zFt+|$_U(v(KVGIC?RD_?CO`>uPIK)PC|uJ6k*iXIsRLUQ`{)o-zPWnX*|=-BlI$CA zAY^1$>xWVM?WB<69{AFXS^Jh?q51!G6ZKTec_>POo)j2i$oY-3^J={67H!9F4*DOu zqSEF8diZ|h7Q#YsO6+6p=AmyHtvV93?wqbSx2;Dz`cc~5Hg|zWewKzHEbjhbR-`gC zf%7m6vEKBAijp^}mV^bR_pWs>T<@^XxwZ~pZn*d`jx&}IPIa76E_lm=EA_*u{r1x; zLVYR0zBkuZma+eFxy3`qzNDL!Vs|qNoG>(sK)M7@NT?WB_W$t`802HEt6Pav$`?T1 zIpIh%x1F9?4|i@X+!#E}pEQz0Iceov+l|oSI2SOnGn4M^3M27VXX?oK`&Svj5rwSQ z%5kn}G~HYn-Fb4A$oniNCu8z!l_5rcmWCiK?*3p_e=?9hWt@Xiu6+stY=m%jm&uT8 zh3@F=OYc^}%k4lQ59b-n2ronB#pC>Y!lP(UKER7nbw;D3Z7Iy{le$=$ONCMp*3SYM zY1tWKl_(EGjQTw6_J%AoVaXG~1yn*=O7cVfiVqe0YMM1|!xyjNV-)Ihmre}K&G@O15JdG90O?5Log=oB+IrhFCXQqU} zWnDRj!}}_o6SOLR(3G?AoYMJJG~RJ`Y}-^nvz z@p%)aNJqB8uFV*p!1x>Cb3E~jl}@3t+*Z<*#v-`?bdyJ8WAJm31{)Pp&(LR7$rI?GpufX4ePmtJrRU&O9o^HZ`El@YNTkL=2PwjyZZD&uVf5JiA60raX5Mj2+y%nC%0b{fca59;l0vZ8 zxmwf$Gc^iBAl{yUmNZ>=2R-I!ofKeBXBUI+!i``DGR06s&Z7t>dDI%|G;I zX8WDJ-AR)?2meSmSzNG*Rp?m#4-q+lt32}yIC&-=c<+M0J{~_VLCoMBR#yz1OqQ=c zhyGq8Wrd=L@-%;7axzc`xTFR(aUw*n0Y^KNBAp(zHSd*dAt0MHm3NOsGX##zv>UV~*vK?J0{EU`r(55!>b1S=a9=7V_?;fI zi+HZn3(M`PT2mdZ&3guwu?F&DD}saLf1ewN;v8JJj<^4tw<1;xJ&DbAfH~F^RD2kz z8msyIRWSO`rGj_;me)14@YvqgZmB79AlOzi{F-X%~~h3A+~ISX~UW8JDn7h%!6-2q?)` zJSQIZF^Wv`X}?}IlD&5I-FJ=0q3a7z1Y_5wQKw-zm*{#R_G9)UFNrs(=BVM=GLiU88=;WLradw&=+xEr%y@=qh6ywx z`5+e4n7Vj>DM-c0d4`qvd%X|3^6I3UYZ37PUlP4Qn1{SU~ zxy``POYvJNR4uo8Pyp=CY!&>LAF@p z`q@frHO*EN1UAH-#ONAFtus?$FcH^(TP6rDhL^C_Gh_vHsW$rqI$1g? zxVNQsImbK8i@)IMV}n|b`A=K#`NgW27ddViEo#93C`e|lWrj-Z`gR1i&KyyxZco?Zf~ zwu6TC!h%|LwHJ3g5Jl~Sv;msKMoO{P|JDhIyU#CdlUi*D!ghKBLA4w2 z1HKSQ-LxGWXH^pbSJOKA7JB);P>H*JSY|Wz`_^&d(H6RixkMY9#cKYE{5^H7LkDL+ zA!Oabo)o1cK+faB2Mj*mmSwD8EsU{et;zz~Hx-EQn0rC;C9$=9vS*iqYKzYi2@~~XxJDH&bhYUdQhhA^2z-kBv!F}*1BIOj z&!Ku(c-^!~Wi)Rk2K_?*U`t}uu-VLaT=&gQc;=K^o0NyHfl}-e@%yt>*sXks8)@vv zs0X#1sq_n2`-zpNJZ2@V9IQ|qXY0**@zh<@4@Zrp6S;n9=(R(XhTt^?IPO8}(&?5i z4i3x1^sJ%WiHPPou&i>&3p1C$9@sguSZG@_QxJ*zQvFadhBqfNi4>XQ5=-wHGtxJ0 z2vM`y=p`A^@}d%fB}%4SM>ciry8ysc2lZ$Q;&*`ook3|Ix!d&gb_^E~4jqQ$%Xzfp z)E(dp;?%8~khz`-=MKHj1jB$WOm&6bRUVm{rI@2RVdzv{7-rq>Rg`0MTE^MII1wYI zkJ=brZ&a-{uz36d7!AY|ra5PKn>>P}O|PFWDvY7>@fm~JK8c0b1wxse7el?-8T8>- zXj1HsUlIfW!tQ!PZwRTs(d_ErJb#RKL(2w)v}iIm0@<)|6-KlQ#R+J%<-|XvO9B^j zo?(oHJcmdElStYJMeQK$m?NVPvZb&k!D0DhIR%Kr2n301Cz*c~eruvB=fO+%9Z@3#dXzB$o{)63n8kAUm`}nqa|E&kCiS2o{)+Zj09&JtQ+E{@?Hgyo3NC z03By@Xi#xgd-yIdy^WHtK zVU931K#Q$BQUMF zEIJ@cAPJBY<0(3Kh^4-a?eQ!*U{#>HAhdUE=&rFQj zTGBG&1;6&dl420?#2N?;3MUd5mhN-~D)kB>4(!uKHBeExun-37)zZRW4TUSiY-eI1 zr)KXPr&eE_cVqA*a<%J=(fZELimeIh8Tl@jCYfXi~ zX#$(;6dRpAxxVZMyl-ki?%XZ!1`b%clNwls$T)>vdMmae9X{sNC%!`$ziNqi0Ht)RSo+g@K6ur+!duWDG54QhWC z3N7_4ftn+l{dk1nkYC&n$^B9t%WvFHnd#tJDtMZUDuMPL5b#W!>e{HnhOHwgeRLTv z7?j}aIU6O3gxy~2&ze&r#Oj99q;73wqUXzVtpmz206S2u-%b!v_wQj>xB4IqS*7FN zZ%jn#kW5%>8O{_hfk(-t=N9@24%kD(vcNE5z1hj0<#BCTAloGs__o8)4zH8seG2$b zFI2LQRLK!{B^d9H`5uNbk4q&KZaHUyrihdMQqaAnu+1PUXd-YY7)NPg5;H4L{ufhG{)?i)p?G?8FQ9fZE_5) z-Sb#?Oe1cI_OyoZq;pwtRcLR29O(Yx4Ak>OkiGHaEwKQUYi#u@(|^XKRT?WYKr1s| zIUe3JQ7-QhQ8{8*ywj|+loD&gi{vi6V*M1?irOGG`JJ?m|tkO(M z;b|pr|9|3tJY?YjDyX+Syoze}K1_k7DjAM~gf9m1lk3Q4pR25%Oqq~zVo-gnvTu$CsK5POO`C=Cu4itaO0(%4-Yu->DD*G!uX zLDt=PzNC$9qs7A9$|2pT@F(S=HeqNj%Q+SF}d1zC@91CV2|;A^67-ZcZf$92+R;B zYFzYe5j41)@^he_=fPw|?o1Cg%v-Exn{gz_Yl<`u-H`)+Z7^j2m)^*s5~})O@E*>m z7_;=mY;kgP!}0O)*;7MK3h$7OrjxtrxcrTudEoq?=~oFP$0R@hZLxh7UfQXRwF5gN zKQN@%RB(z7qY zzBcL=HxnJ2kKdcAJp)XfP@2mH81;XFl16V3dZ2$JU9gt_rY1+jDn1C=@EG2+e45EX zVBxWrWN=Gk{wAUWcsVnfRI~HfMO=?BG1r8pEUquQm^k zsw`K>+MgKxznX6OWl55^bnw;FMP3c4;9zhP|HtO$=b9tFLUps44UEBbkZwm3i=oz=%E>29C*@eY8JsM29fGo3fDk}?vUKMo0swpi zX(;4mZe(YLjqUf&XGj)J=q}spsux6+tXzJd7RUd8pckAh{$mBIlo*`>)X}itHGr84sV^02$xGnTjh6;K%=;qrBo2l_&xgknleY zE<*_2vwnqC1^2g8%gF_oKCIP3VLyhH+@Sjae9$f6+w*1QQcbeUX;ixixPMonZ`>wimVx;w>edT47}Ksm zH7FoS8%G1S>Yz})(uu^J%0N1-(MM}tpz6LrTT(Q!P6f?;z)Po40V*9(Ozy7-ZJp*x z=3PqSlu~xiFQiQ?Wtmy|F1|K6cK-kjqX(?{*KN|)2ttnBMcD=X(dxuwz@?c-kCYEz zBAS_Zf|vz+Dgnkz7IW}m4K-~4)X|K)@~Z@*HV})~qinOlRCX}K4G+vBPt>sqHllM- zZZUG5968$bmXh7qW7CgE`{rq{nDS`QbLC&xTpC%hrAD%JaG$wY?@30hl=zXSeQF!; z|3W!mjS}#;PGb(nq>t3kw=Y~$UEM9US?+@k$pzv8!zW?5Pw;U^@LqtGJY17RMhf&= z(0ZcCtb`swR2&{>Y#_j={chj-5qNjjM&qUn`}9e4@R`MRVsm&iqUd7`cKeF%h z-p=U*KNNSq>vkw=X0m`RqLEwEMIcDDDS)Uw0W`vR6Si;J01=NbZan;IT^`I!g%%EJ z#+OjN=J9!D&(c`8m=krBa%CH^;c-pv$zm9wyO617^UBm!V|QvBYo~Mr-#+t#_G{ET zj$q93YyNR~G)d0rN`!@X{cBT-Xm=Bhw!su0UW+_XT0K0ZI|(hucURsT!rzdgEXw0| zXD7L?cL(ug4?4`)VnXbcvlx-4nS*Ny$VFfZYK{&*vT3ZN9Xhqx@D0o_K$$oB)X^?R zLH3y9wlqV+3^7mhHq!`6X_TX@Vuct0PM2LGT09?os+0}iT5A2qgi)&^(E-o6JqMfr zr?P59%yuxT-dzC)aOUp+EE(I2W+Vmexaiv|*W=+v>^3JjGk=QeO72Eps_(aR(EWb3 z((auco$P@;SUfB*@9qKqu#I`qqC zOVhk$f{>@z(8;?2L5+@ImU_%s)4a;3nm@9KE_?hb)>=a`XE|!5SR!OgDTuXfPZD?2 z*+Ow7Z$mcms#UXU_r^_|npbS7L5tDsO+}H1`a)e3C4^4ndkvkv{ok)YBG*GeuNtFranjqJ}>n(?9)0kn{Z2E_)+-_$#RkNxQ_K`naguQwO zV{_VJ!B8yPq*j!)d@Jf$48YLU1zp_vm-7dRzR*8mZtk zSphJdtBI9>|I(+!+afd%2@Cjs1gWU`=~B}=Tg)3KfzWLaUGW>I6F9O&xG-)UsBTKU zROOO$1leM(XGoy&YV(LgZfc#L=(a_Iu(P?>T`FN+Lldjtus;2@`ACzVvZ`t zS_Gp^R=6(B>_i!8zh}O&4EV`K+|YJcw4VnJv6`wJJogJm~9N_Qy-6Yj$}8N zP@s&HTpr?%mJS^d^>jaBL*!fPPUwhgd4t!t*BIXN;hz<*Ic=#|qJ%g&Cg|wA8y^?f z9z-WqkyHbm!Y^oGHk4SlhgG~cQ}f1soLbuvlv$p2k=|4a7CAyRjP^zx)q||jSsXMg z2U>aAG;z{c#%Vt??%Gk%MJ%?t9Pf`(QrpS6KJPS#zDrn!6+6ujXp2<;&6{Bb5hp%Z zU-fL@9J}bN3N1X~1=E`Pz9oXbH+pAE866#5nF1&vf9zB+>)}S^dFRn8ps71i7k$uHSTaZ37DcY7 zc6WqsYr(#TQ08_o2Afy>j>SNwrguf5aFAB(KMwZJ7cT8z~t-6(+$A>d$lNSp9QgxI!59jH6!e(e-hkZ3s6451e}VqR?Ht? z4%fMAIO(0vJUQYjG=SZA*O{~z(x~(q6@iVO6YSZc2R>+-fX+={M0dCrqZE=DG{JLc z{H|w`Yl?M{Qr5UDcyk~!=BU$(j*9{E^GW}~*v%Wz?=2RRiKUV#ET7b>S_tWdY^8U3 zBlfKP@2a1dupKI&{Kj+7BJ~=y(2;D9n-NtDaSqa8?6f?Roa4{6i_z598%KiZ5hQon zi4*E}In`nP)F+TyQi>m39baG7gWOWH&Zf@?6OGGVZzyi}MH9TKc{CK}<@{ z(~u`-orc;ESl)bRv$+sOsULlu6 zrm=VrhPXehkA%&0-537`z#o@!UuFC9fIV}A@>|yUeD=QPTw!a@2ojKXw2j45Ud!bF(lAph72 zP{OZ_1U+&zTmn`p-gN}rsLbpJRT1KtH26qmU4o?@a04xbz6BYQ9Cx$ek|?!PFBd0v zFmMHUU)vkzGj89cN~Bjyg`J!4fO&~iVxSO`%il7kr;V}3r-`8RI!| zwYZ$#6}1MMot4m@qpV(~^4X$sn}N3T9rVF8fGd8$7q20M+u0s$a>j?Kfx5ya&BdiqO+!e!*vJ`>f!Jjg;L?ps<$ipY4*BmRe*ZHt6b8RU# zBHlAwDx!S)#Ux+2`KH)VOOxwdEQ&a8O z-~0$;?)3u=yOQ(!UTB+xEnmorzq*0^{#Nj1Zjba|tif$uIh^^| zw-?M7@0mi?72Z-?{2S-cxOGFiH&<94wFrd?_vHeq@-DQ^FyBRg12jWM9hr0;RydYr zZrd#MYgC4$CzPZi2od*m(y4tIyafLAS?$I0@#NujhZGHe(8BS2&&X=meh#oV7T{e% zw5KZT1GcLVv41<-tl6KLL#AK)LO9i4*)MZn<psgd_i5b!i zfD64E0BX+QaX`ABlke~+Dg5uFKt<-4y;^ucUW?+NGj59MS)e{0{}1+A>#cb9RD>kw zIgwHW)CLr!AqWxobfJBUq*PxF>6FLTZ7ZzFN%_!7n^&tRTEZVSZQT*3uPdQHRWZ3UDjPTs(3c{4 zf#yplZ(q)V@D?CWyB3N`oFm-r z{pB3ad%l52-5=yYO{^xVHl8q1t)oKULZFm;R8BHCMJv z+}KoaO7g1rB}4s|c{QW8WLrht6`D%FEtlk%b}f4W;0+)09<`-%_v0Jb(3cpqxExR} zs*4tfXq~592&`@XB*}zdl_OK-EZ-&SvC`Y0zOPskUt<1uihkXC1LJ>2(P{u=`_E2l zzb%yA2iU?QZPEUU(B+a0D@$w&3jzUEZpjCGMDC4@t^-ahdc68S6XF@L&JP`_#15~D z#e$y?yUjJxXoEP|NSBys{m=1M-EH!#F(u=T%IH?0GEC4IuNRcuO{663zgBkxiUrkC zXs|Mx#M7UM$1lN2Vzm6sn!Am$5n+hrrL7H*|L(Tfsy$jN{0J-|8v?Cm|2>@z&fQ)( zFqMO}>!zA~!qDM9#r3ib4YCu^5TK&y09WAbPm0H5zAy8}aU5A?4VhO^4Spd7K?`rn zPu#ScQAZ|n!G;_wWBTk~=}#`z*uemqtanB$D+njw4Rfw>&GHqZlI?At@F1k79WM+p zu=!GFLl%a%bE`e1XZ;TdPzDwe1IqcKW_(k^wXQH`oenZQd$XXMC0>`^vH4WFRtM|8 z;i&|@sFOTh<$NxnOoesO!EC`_q;$ms`h!q{%Cux|j=olA+oJtmL-$;MCRiWae4{S$!`26qxOKyXQ{q1l+JvqUcr&Q3z7pXmGOsfW zgQ1~-z54q3?bu8Un$ewIA>ztg!l>uxa~~-ooYIn15D$O2+l2xn$AbnkmWV}MoGiCU ztcUI6XNRwptJ~!s>0pg2>9(I7oFbq`<<6gjsAj-C7%`N*ZV-pXIZA`qJO&TO=)*JO zrv>skyGcMXbJ)4efzV|v8T)6g5&XL?6~k35?u>H;JCyDKh#puXXLA=C5aSE6V$2qT z;e+;2isiM$TJHIlxTs=pOizFRa__ZrAJXhz^Nu5GoFY(VuDQkuP!aS6tZX*l)Pw9f za~|L-fSrlyQP;wO1Z|{S1w^_s^k_ZHZri#Hr%>>ZdBg{oIOSqD)NZGe8osM4?5xVo-D{qBXr=HKddc4;s;;fY>m5W48~vz{5F)Cy;vWt zU2=t5{Ul1E1SP?-+v$E?@X2&;I&-s~*0dD2h}9|S3vO_*MQ9J`cO}sBChhde?B7F& zDvSNHVP&+hAm%Eb7&nt!(#VW|MR3)Fn!ZXSYQcYigK&L}IrL_TmoGajo=~kigiP8p zA%qz?0_+%spkzeTl5eGMDYe=wp^)5!Sm%0Aw}O3tRi>g*UjMocRh49*rz?C!b6tPY z(chRjXK5C}Q7($(wgGip=1deH_xhUkE%1zn8E|hE`c+VmM6S}3kJf#`xu*kR&g*p& z?ExNOffY_U#3)KdWIs8V?j>f$^b2hOjE3C6x%`uqiBK3*57lpQ{7rLp9ULjfAqg1SEAoZU*3E|`5H-q_hfQrIkr@KbKF?MS0 zkLOqW@OGwTc%lk4$|K^qv$ep+9TSRVbR`-{J{s@!~*a)1j8`@PKmA zQ!!>(kKFOz)-Uobt}6?%VGY#O)S9pI{Zj&~k`6}PI|xlz8*xJjmQI2jFgCbU zsz$%U^Ml4~BazS+Bj~|;e){w?O2pY+E{h{%Eu<;#e%L)+u`YWuR6jhOj9Pd z;SP}i3;@QBwdxTK{wSY;2}^VP8NJY-sqwggUg>)n*W#RpEqJqk*gw0j-PYb+lCN7C zUhpuTsX48={8%(~Y2g}0cC;~D;W*teE7pSW-a|&H%<$#`#1E4CU$Hn5z&NJR0j^$O ztSjhr8x}oLGAUOyK4!|~K#(GJSZUdRpMx1x~2)ty-|89hO@B{K<#*HX8y`sP?@f{cM2BOBp@QLg$+H;E{{uO<<3gKQyd{ zTv1#7jD7ie>1K8>(dL;`k{$Bfg#XK*6P&NlIDuUrZ1{;pN!&wFcZI$E0PySi@Pp;+|5@PmA28Tqji7 z0su0EgvY;J%RjC7!KB(uM`Pdt^hw$dwC0z9M8*M34K8W>Ye4w$<@Gbd>jBJ#_8Fbv!aCtVqQYjU!OEU!3!8CwtqCht<8H!$&qB#I9^7Rm=gDS}+5ndK8u<{nzw zx}maMN7wJ7GbOcq3NoQQ zjQ__&xO3gp?;z$XmG6`WsqO?H_Uhgu61a_DIAe8We-}8JqfKf+3qsrlWvP2r?O>v;{+i2dLJ_2IX;~KYE53Pkv&i7DLRCK3$mK0Gt=~GK zv?M^nnAedVy+QR_9jajCK`#qQdm566_QaJj=kYqCq;?XOdxn8X@V@+|X0jEhrzhKV zod3Y75YQNr^d4;IwIe`zlWrU~1TN7f`&(S5Q0trxl_OnGb;`F5!8rJ-d_fO5kOba2 zTo_wJ%IYwCKG?av(B`ZgF06lst2po|SjLB4O+5Q710vJ5dy)=!d^%NtXZTErndo{o z?h&3k{jY!3y^jFCKiF^ho^qe!M%yO<{acb%?hGAV^!AJtCe2N7QLbZ z_;a|aH5U&AmGGE})CE?|bj1C-KowN#gCRB}p-$`=aF6f>rFnIfc8{Lt@!Uglx1z*l z&*4NgDcM^b2YsUwQr%QaEz7LAWHo4{KO0&lpfW5_}IEAu5PE0A^Wdr%uNk~aV`8`|Ek&TU|E6WQh375ZNNCx=e!$2?iE+!$VA zfTvOMP30TlijWXkB`iBXBsQ`v9v|aG)PQ@?c`J!M$%;q~G8E9y`4@DAt&tt;Td|@x z)m`9HPRN&ep}hHp@G--B@0WRvhn?+<<$Sc+%gCDDbcm#rn;S!F{|{uVUVA~1laeT4 zGa8DZ8XTXoBQV&KH zQ8l>z$=voNNb0#1PauhPeS{l3Rug!