From f81399f4530ae55ba46278b0793f98e9f6ee7412 Mon Sep 17 00:00:00 2001 From: strawberry42271 <2806566736@qq.com> Date: Thu, 6 Feb 2025 15:49:40 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=BB=91=E5=B1=8F/?= =?UTF-8?q?=E5=9B=BA=E4=BC=A4bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _server/table/comment.js | 2 +- project/enemys.js | 10 +- project/functions.js | 251 ++-------- project/plugins.js | 1019 +++++++++++++++++++------------------- 4 files changed, 552 insertions(+), 730 deletions(-) diff --git a/_server/table/comment.js b/_server/table/comment.js index 3cf5699..d35742e 100644 --- a/_server/table/comment.js +++ b/_server/table/comment.js @@ -368,7 +368,7 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_docs": "退化扣防", "_data": "退化时勇士下降的防御力点数" }, - "damage": { + "damage2": { "_leaf": true, "_type": "textarea", "_range": "thiseval==~~thiseval||thiseval==null", diff --git a/project/enemys.js b/project/enemys.js index 8c80082..d1ff382 100644 --- a/project/enemys.js +++ b/project/enemys.js @@ -1,7 +1,7 @@ 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,"mdef":0}, - "redSlime": {"name":"红头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"value":10,"magic":false}, + "greenSlime": {"name":"绿头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0}, + "redSlime": {"name":"红头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"value":10}, "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":15}, @@ -10,9 +10,9 @@ var enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 = "vampire": {"name":"冥灵魔王","hp":888,"atk":888,"def":888,"money":888,"exp":888,"point":0,"special":[6],"n":8}, "skeleton": {"name":"骷髅人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, "skeletonCaptain": {"name":"骷髅队长","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "zombie": {"name":"兽人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"magic":false}, - "zombieKnight": {"name":"兽人武士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "rock": {"name":"石头人","hp":50,"atk":50,"def":0,"money":3,"exp":0,"point":0,"special":3}, + "zombie": {"name":"兽人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[22]}, + "zombieKnight": {"name":"兽人武士","hp":10000,"atk":100,"def":100,"money":0,"exp":0,"point":0,"special":[22],"speed":10,"mdef":0,"damage2":20}, + "rock": {"name":"石头人","hp":50,"atk":50,"def":0,"money":3,"exp":0,"point":0,"special":3,"damage2":15}, "bluePriest": {"name":"初级法师","hp":100,"atk":120,"def":0,"money":3,"exp":0,"point":1,"special":[9]}, "redPriest": {"name":"高级法师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, "brownWizard": {"name":"初级巫师","hp":100,"atk":120,"def":0,"money":16,"exp":0,"point":0,"special":15,"value":100,"range":2}, diff --git a/project/functions.js b/project/functions.js index 5e413e0..d5e7ddc 100644 --- a/project/functions.js +++ b/project/functions.js @@ -524,222 +524,41 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = }, "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"], + [2, "魔攻", "怪物无视角色的防御", "#bbb0ff"], + [3, "坚固", "怪物防御不小于角色攻击-1", "#c0b088"], + [4, "2连击", "怪物每回合攻击2次", "#ffee77"], + [5, "3连击", "怪物每回合攻击3次", "#ffee77"], + [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.damage2 || 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) { // 获得某个怪物变化后的数据;该函数将被伤害计算和怪物手册使用 // 例如:坚固、模仿、仿攻等等 diff --git a/project/plugins.js b/project/plugins.js index 8aad116..6f351f4 100644 --- a/project/plugins.js +++ b/project/plugins.js @@ -4750,357 +4750,359 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "手册区分特殊属性": function () { - // 在此增加新插件 - this.arrsame = function (Arraya, Arrayb) { - let a = Arraya || []; - let b = Arrayb || []; - if (typeof a === "number") a = [a]; - if (typeof b === "number") b = [b]; - let c = [...a, ...b]; - for (const i of c) - if (!a.includes(i) || !b.includes(i)) { - return false; - } - return true; - }; - enemys.prototype.getCurrentEnemys = function (floorId) { - floorId = floorId || core.status.floorId; - var enemys = [], - used = {}; - core.extractBlocks(floorId); - core.status.maps[floorId].blocks.forEach(function (block) { - if (!block.disable && block.event.cls.indexOf("enemy") == 0) { - this._getCurrentEnemys_addEnemy( - block.event.id, - enemys, - used, - block.x, - block.y, - floorId - ); - } - }, this); - return this._getCurrentEnemys_sort(enemys); - }; + // 在此增加新插件 + this.arrsame = function (Arraya, Arrayb) { + let a = Arraya || []; + let b = Arrayb || []; + if (typeof a === "number") a = [a]; + if (typeof b === "number") b = [b]; + let c = [...a, ...b]; + for (const i of c) + if (!a.includes(i) || !b.includes(i)) { + return false; + } + return true; + }; + enemys.prototype.getCurrentEnemys = function (floorId) { + floorId = floorId || core.status.floorId; + var enemys = [], + used = {}; + core.extractBlocks(floorId); + core.status.maps[floorId].blocks.forEach(function (block) { + if (!block.disable && block.event.cls.indexOf("enemy") == 0) { + this._getCurrentEnemys_addEnemy( + block.event.id, + enemys, + used, + block.x, + block.y, + floorId + ); + } + }, this); + return this._getCurrentEnemys_sort(enemys); + }; - enemys.prototype._getCurrentEnemys_getEnemy = function (enemyId) { - var enemy = core.material.enemys[enemyId]; - if (!enemy) return null; + enemys.prototype._getCurrentEnemys_getEnemy = function (enemyId) { + var enemy = core.material.enemys[enemyId]; + if (!enemy) return null; - // 检查朝向;displayIdInBook - return ( - core.material.enemys[enemy.displayIdInBook] || - core.material.enemys[(enemy.faceIds || {}).down] || - enemy - ); - }; + // 检查朝向;displayIdInBook + return ( + core.material.enemys[enemy.displayIdInBook] || + core.material.enemys[(enemy.faceIds || {}).down] || + enemy + ); + }; - enemys.prototype._getCurrentEnemys_addEnemy = function ( - enemyId, - enemys, - used, - x, - y, - floorId - ) { - var enemy = this._getCurrentEnemys_getEnemy(enemyId); - if (enemy == null) return; + enemys.prototype._getCurrentEnemys_addEnemy = function ( + enemyId, + enemys, + used, + x, + y, + floorId + ) { + var enemy = this._getCurrentEnemys_getEnemy(enemyId); + if (enemy == null) return; - var id = enemy.id; + var id = enemy.id; - var enemyInfo = this.getEnemyInfo(enemy, null, null, null, floorId); - var locEnemyInfo = this.getEnemyInfo(enemy, null, x, y, floorId); - if ( - !core.flags.enableEnemyPoint || - (locEnemyInfo.atk == enemyInfo.atk && - locEnemyInfo.def == enemyInfo.def && - locEnemyInfo.hp == enemyInfo.hp && - core.plugin.arrsame(locEnemyInfo.special, enemyInfo.special)) - ) { - x = null; - y = null; - } else { - // 检查enemys里面是否使用了存在的内容 - for (var i = 0; i < enemys.length; ++i) { - var one = enemys[i]; - if ( - id == one.id && - one.locs != null && - locEnemyInfo.atk == one.atk && - locEnemyInfo.def == one.def && - locEnemyInfo.hp == one.hp && - core.plugin.arrsame(locEnemyInfo.special, one.special) - ) { - one.locs.push([x, y]); - return; - } - } - enemyInfo = locEnemyInfo; - } + var enemyInfo = this.getEnemyInfo(enemy, null, null, null, floorId); + var locEnemyInfo = this.getEnemyInfo(enemy, null, x, y, floorId); + if ( + !core.flags.enableEnemyPoint || + (locEnemyInfo.atk == enemyInfo.atk && + locEnemyInfo.def == enemyInfo.def && + locEnemyInfo.hp == enemyInfo.hp && + core.plugin.arrsame(locEnemyInfo.special, enemyInfo.special)) + ) { + x = null; + y = null; + } else { + // 检查enemys里面是否使用了存在的内容 + for (var i = 0; i < enemys.length; ++i) { + var one = enemys[i]; + if ( + id == one.id && + one.locs != null && + locEnemyInfo.atk == one.atk && + locEnemyInfo.def == one.def && + locEnemyInfo.hp == one.hp && + core.plugin.arrsame(locEnemyInfo.special, one.special) + ) { + one.locs.push([x, y]); + return; + } + } + enemyInfo = locEnemyInfo; + } - var id = enemy.id + ":" + x + ":" + y; - if (used[id]) return; - used[id] = true; + var id = enemy.id + ":" + x + ":" + y; + if (used[id]) return; + used[id] = true; - var specialText = core.enemys.getSpecialText(enemy, x, y, floorId); - var specialColor = core.enemys.getSpecialColor(enemy, x, y, floorId); + var specialText = core.enemys.getSpecialText(enemy, x, y, floorId); + var specialColor = core.enemys.getSpecialColor(enemy, x, y, floorId); - var critical = this.nextCriticals(enemy, 1, x, y, floorId); - if (critical.length > 0) critical = critical[0]; + var critical = this.nextCriticals(enemy, 1, x, y, floorId); + if (critical.length > 0) critical = critical[0]; - var e = core.clone(enemy); - for (var v in enemyInfo) { - e[v] = enemyInfo[v]; - } - if (x != null && y != null) { - e.locs = [[x, y]]; - } - e.name = core.getEnemyValue(enemy, "name", x, y, floorId); - e.specialText = specialText; - e.specialColor = specialColor; - e.damage = this.getDamage(enemy, x, y, floorId); - e.critical = critical[0]; - e.criticalDamage = critical[1]; - e.defDamage = this._getCurrentEnemys_addEnemy_defDamage( - enemy, - x, - y, - floorId - ); - enemys.push(e); - }; + var e = core.clone(enemy); + for (var v in enemyInfo) { + e[v] = enemyInfo[v]; + } + if (x != null && y != null) { + e.locs = [ + [x, y] + ]; + } + e.name = core.getEnemyValue(enemy, "name", x, y, floorId); + e.specialText = specialText; + e.specialColor = specialColor; + e.damage = this.getDamage(enemy, x, y, floorId); + e.critical = critical[0]; + e.criticalDamage = critical[1]; + e.defDamage = this._getCurrentEnemys_addEnemy_defDamage( + enemy, + x, + y, + floorId + ); + enemys.push(e); + }; - enemys.prototype._getCurrentEnemys_addEnemy_defDamage = function ( - enemy, - x, - y, - floorId - ) { - var ratio = core.status.maps[floorId || core.status.floorId].ratio || 1; - return this.getDefDamage(enemy, ratio, x, y, floorId); - }; + enemys.prototype._getCurrentEnemys_addEnemy_defDamage = function ( + enemy, + x, + y, + floorId + ) { + var ratio = core.status.maps[floorId || core.status.floorId].ratio || 1; + return this.getDefDamage(enemy, ratio, x, y, floorId); + }; - enemys.prototype._getCurrentEnemys_sort = function (enemys) { - return enemys.sort(function (a, b) { - if (a.damage == b.damage) { - return a.money - b.money; - } - if (a.damage == null) { - return 1; - } - if (b.damage == null) { - return -1; - } - return a.damage - b.damage; - }); - }; + enemys.prototype._getCurrentEnemys_sort = function (enemys) { + return enemys.sort(function (a, b) { + if (a.damage == b.damage) { + return a.money - b.money; + } + if (a.damage == null) { + return 1; + } + if (b.damage == null) { + return -1; + } + return a.damage - b.damage; + }); + }; - ////// 获得所有特殊属性的名称 ////// - enemys.prototype.getSpecialText = function (enemy, x, y, floorId) { - if (typeof enemy == "string") - enemy = this.getEnemyInfo(enemy, null, x, y, floorId); - if (!enemy) return []; - var special = enemy.special; - var text = []; + ////// 获得所有特殊属性的名称 ////// + enemys.prototype.getSpecialText = function (enemy, x, y, floorId) { + if (typeof enemy == "string") + enemy = this.getEnemyInfo(enemy, null, x, y, floorId); + if (!enemy) return []; + var special = enemy.special; + var text = []; - var specials = this.getSpecials(); - if (specials) { - for (var i = 0; i < specials.length; i++) { - if (this.hasSpecial(special, specials[i][0])) - text.push(this._calSpecialContent(enemy, specials[i][1])); - } - } - return text; - }; + var specials = this.getSpecials(); + if (specials) { + for (var i = 0; i < specials.length; i++) { + if (this.hasSpecial(special, specials[i][0])) + text.push(this._calSpecialContent(enemy, specials[i][1])); + } + } + return text; + }; - ////// 获得所有特殊属性的颜色 ////// - enemys.prototype.getSpecialColor = function (enemy, x, y, floorId) { - if (typeof enemy == "string") - enemy = this.getEnemyInfo(enemy, null, x, y, floorId); - if (!enemy) return []; - var special = enemy.special; - var colors = []; + ////// 获得所有特殊属性的颜色 ////// + enemys.prototype.getSpecialColor = function (enemy, x, y, floorId) { + if (typeof enemy == "string") + enemy = this.getEnemyInfo(enemy, null, x, y, floorId); + if (!enemy) return []; + var special = enemy.special; + var colors = []; - var specials = this.getSpecials(); - if (specials) { - for (var i = 0; i < specials.length; i++) { - if (this.hasSpecial(special, specials[i][0])) - colors.push(specials[i][3] || null); - } - } - return colors; - }; + var specials = this.getSpecials(); + if (specials) { + for (var i = 0; i < specials.length; i++) { + if (this.hasSpecial(special, specials[i][0])) + colors.push(specials[i][3] || null); + } + } + return colors; + }; - ////// 获得所有特殊属性的额外标记 ////// - enemys.prototype.getSpecialFlag = function (enemy, x, y, floorId) { - if (typeof enemy == "string") - enemy = getEnemyInfo(enemy, null, x, y, floorId); - if (!enemy) return []; - var special = enemy.special; - var flag = 0; + ////// 获得所有特殊属性的额外标记 ////// + enemys.prototype.getSpecialFlag = function (enemy, x, y, floorId) { + if (typeof enemy == "string") + enemy = getEnemyInfo(enemy, null, x, y, floorId); + if (!enemy) return []; + var special = enemy.special; + var flag = 0; - var specials = this.getSpecials(); - if (specials) { - for (var i = 0; i < specials.length; i++) { - if (this.hasSpecial(special, specials[i][0])) - flag |= specials[i][4] || 0; - } - } - return flag; - }; + var specials = this.getSpecials(); + if (specials) { + for (var i = 0; i < specials.length; i++) { + if (this.hasSpecial(special, specials[i][0])) + flag |= specials[i][4] || 0; + } + } + return flag; + }; - ////// 获得每个特殊属性的说明 ////// - enemys.prototype.getSpecialHint = function (enemy, special) { - var specials = this.getSpecials(); - if (special == null) { - if (specials == null) return []; - var hints = []; - for (var i = 0; i < specials.length; i++) { - if (this.hasSpecial(enemy, specials[i][0])) - hints.push( - "\r[" + - core.arrayToRGBA(specials[i][3] || "#FF6A6A") + - "]\\d" + - this._calSpecialContent(enemy, specials[i][1]) + - ":\\d\r[]" + - this._calSpecialContent(enemy, specials[i][2]) - ); - } - return hints; - } + ////// 获得每个特殊属性的说明 ////// + enemys.prototype.getSpecialHint = function (enemy, special) { + var specials = this.getSpecials(); + if (special == null) { + if (specials == null) return []; + var hints = []; + for (var i = 0; i < specials.length; i++) { + if (this.hasSpecial(enemy, specials[i][0])) + hints.push( + "\r[" + + core.arrayToRGBA(specials[i][3] || "#FF6A6A") + + "]\\d" + + this._calSpecialContent(enemy, specials[i][1]) + + ":\\d\r[]" + + this._calSpecialContent(enemy, specials[i][2]) + ); + } + return hints; + } - if (specials == null) return ""; - for (var i = 0; i < specials.length; i++) { - if (special == specials[i][0]) - return ( - "\r[#FF6A6A]\\d" + - this._calSpecialContent(enemy, specials[i][1]) + - ":\\d\r[]" + - this._calSpecialContent(enemy, specials[i][2]) - ); - } - return ""; - }; - ui.prototype._drawBook_drawName = function ( - index, - enemy, - top, - left, - width - ) { - // 绘制第零列(名称和特殊属性) - // 如果需要添加自己的比如怪物的称号等,也可以在这里绘制 - core.setTextAlign("ui", "center"); - if (core.enemys.getSpecialText(enemy).length == 0) { - core.fillText( - "ui", - enemy.name, - left + width / 2, - top + 35, - "#DDDDDD", - this._buildFont(17, true), - width - ); - } else { - core.fillText( - "ui", - enemy.name, - left + width / 2, - top + 28, - "#DDDDDD", - this._buildFont(17, true), - width - ); - switch (core.enemys.getSpecialText(enemy).length) { - case 1: - core.fillText( - "ui", - core.enemys.getSpecialText(enemy)[0], - left + width / 2, - top + 50, - core.arrayToRGBA( - (core.enemys.getSpecialColor(enemy) || [])[0] || "#FF6A6A" - ), - this._buildFont(15, true), - width - ); - break; - case 2: - // Step 1: 计算字体 - var text = - core.enemys.getSpecialText(enemy)[0] + - " " + - core.enemys.getSpecialText(enemy)[1]; - core.setFontForMaxWidth( - "ui", - text, - width, - this._buildFont(15, true) - ); - // Step 2: 计算总宽度 - var totalWidth = core.calWidth("ui", text); - var leftWidth = core.calWidth( - "ui", - core.enemys.getSpecialText(enemy)[0] - ); - var rightWidth = core.calWidth( - "ui", - core.enemys.getSpecialText(enemy)[1] - ); - // Step 3: 绘制 - core.fillText( - "ui", - core.enemys.getSpecialText(enemy)[0], - left + (width + leftWidth - totalWidth) / 2, - top + 50, - core.arrayToRGBA( - (core.enemys.getSpecialColor(enemy) || [])[0] || "#FF6A6A" - ) - ); - core.fillText( - "ui", - core.enemys.getSpecialText(enemy)[1], - left + (width + totalWidth - rightWidth) / 2, - top + 50, - core.arrayToRGBA( - (core.enemys.getSpecialColor(enemy) || [])[1] || "#FF6A6A" - ) - ); - break; - default: - core.fillText( - "ui", - "多属性...", - left + width / 2, - top + 50, - "#FF6A6A", - this._buildFont(15, true), - width - ); - } - } - }; - ui.prototype._drawBookDetail_getInfo = function (index) { - var floorId = - core.floorIds[(core.status.event.ui || {}).index] || - core.status.floorId; - // 清除浏览地图时的光环缓存 - if (floorId != core.status.floorId && core.status.checkBlock) { - core.status.checkBlock.cache = {}; - } - var enemys = core.enemys.getCurrentEnemys(floorId); - console.log(123); - if (enemys.length == 0) return []; - index = core.clamp(index, 0, enemys.length - 1); - var enemy = enemys[index]; - var texts = core.enemys.getSpecialHint(enemy); - if (texts.length == 0) texts.push("该怪物无特殊属性。"); - if (enemy.description) texts.push(enemy.description + "\r"); - this._drawBookDetail_getTexts(enemy, floorId, texts); - texts.push(""); - return [enemy, texts]; - }; - }, + if (specials == null) return ""; + for (var i = 0; i < specials.length; i++) { + if (special == specials[i][0]) + return ( + "\r[#FF6A6A]\\d" + + this._calSpecialContent(enemy, specials[i][1]) + + ":\\d\r[]" + + this._calSpecialContent(enemy, specials[i][2]) + ); + } + return ""; + }; + ui.prototype._drawBook_drawName = function ( + index, + enemy, + top, + left, + width + ) { + // 绘制第零列(名称和特殊属性) + // 如果需要添加自己的比如怪物的称号等,也可以在这里绘制 + core.setTextAlign("ui", "center"); + if (core.enemys.getSpecialText(enemy).length == 0) { + core.fillText( + "ui", + enemy.name, + left + width / 2, + top + 35, + "#DDDDDD", + this._buildFont(17, true), + width + ); + } else { + core.fillText( + "ui", + enemy.name, + left + width / 2, + top + 28, + "#DDDDDD", + this._buildFont(17, true), + width + ); + switch (core.enemys.getSpecialText(enemy).length) { + case 1: + core.fillText( + "ui", + core.enemys.getSpecialText(enemy)[0], + left + width / 2, + top + 50, + core.arrayToRGBA( + (core.enemys.getSpecialColor(enemy) || [])[0] || "#FF6A6A" + ), + this._buildFont(15, true), + width + ); + break; + case 2: + // Step 1: 计算字体 + var text = + core.enemys.getSpecialText(enemy)[0] + + " " + + core.enemys.getSpecialText(enemy)[1]; + core.setFontForMaxWidth( + "ui", + text, + width, + this._buildFont(15, true) + ); + // Step 2: 计算总宽度 + var totalWidth = core.calWidth("ui", text); + var leftWidth = core.calWidth( + "ui", + core.enemys.getSpecialText(enemy)[0] + ); + var rightWidth = core.calWidth( + "ui", + core.enemys.getSpecialText(enemy)[1] + ); + // Step 3: 绘制 + core.fillText( + "ui", + core.enemys.getSpecialText(enemy)[0], + left + (width + leftWidth - totalWidth) / 2, + top + 50, + core.arrayToRGBA( + (core.enemys.getSpecialColor(enemy) || [])[0] || "#FF6A6A" + ) + ); + core.fillText( + "ui", + core.enemys.getSpecialText(enemy)[1], + left + (width + totalWidth - rightWidth) / 2, + top + 50, + core.arrayToRGBA( + (core.enemys.getSpecialColor(enemy) || [])[1] || "#FF6A6A" + ) + ); + break; + default: + core.fillText( + "ui", + "多属性...", + left + width / 2, + top + 50, + "#FF6A6A", + this._buildFont(15, true), + width + ); + } + } + }; + ui.prototype._drawBookDetail_getInfo = function (index) { + var floorId = + core.floorIds[(core.status.event.ui || {}).index] || + core.status.floorId; + // 清除浏览地图时的光环缓存 + if (floorId != core.status.floorId && core.status.checkBlock) { + core.status.checkBlock.cache = {}; + } + var enemys = core.enemys.getCurrentEnemys(floorId); + console.log(123); + if (enemys.length == 0) return []; + index = core.clamp(index, 0, enemys.length - 1); + var enemy = enemys[index]; + var texts = core.enemys.getSpecialHint(enemy); + if (texts.length == 0) texts.push("该怪物无特殊属性。"); + if (enemy.description) texts.push(enemy.description + "\r"); + this._drawBookDetail_getTexts(enemy, floorId, texts); + texts.push(""); + return [enemy, texts]; + }; +}, "一防减伤": function () { // 在此增加新插件 ui.prototype._drawBook_drawRow3 = function ( @@ -14797,195 +14799,196 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "滑动转场": function () { - // 在此增加新插件 - const defaultChange = { - left: "leftPortal", // 左箭头 - up: "upPortal", // 上箭头 - right: "rightPortal", // 右箭头 - down: "downPortal", // 下箭头 - upFloor: "upFloor", // 上楼 - downFloor: "downFloor", // 下楼 - }; - const dirData = { - //方向坐标 - up: [-1, 0], - down: [1, 0], - left: [0, -1], - right: [0, 1], - upFloor: [0, 0], - downFloor: [0, 0], - }; - let allChangeEntries = Object.entries(defaultChange); - const move = document.createElement("canvas"); - const speed = 12; - let modedata = 0; + // 在此增加新插件 + const defaultChange = { + left: "leftPortal", // 左箭头 + up: "upPortal", // 上箭头 + right: "rightPortal", // 右箭头 + down: "downPortal", // 下箭头 + upFloor: "upFloor", // 上楼 + downFloor: "downFloor", // 下楼 + }; + const dirData = { + //方向坐标 + up: [-1, 0], + down: [1, 0], + left: [0, -1], + right: [0, 1], + upFloor: [0, 0], + downFloor: [0, 0], + }; + let allChangeEntries = Object.entries(defaultChange); + const move = document.createElement("canvas"); + const speed = 12; + let modedata = 0; - move.width = 1248; - move.height = 1248; + move.width = 1248; + move.height = 1248; - const ctx = move.getContext("2d"); + const ctx = move.getContext("2d"); - events.prototype.changeFloor = function ( - floorId, - stair, - heroLoc, - time, - callback - ) { - let block = core.getBlock(hero.loc.x, hero.loc.y); - var info = this._changeFloor_getInfo(floorId, stair, heroLoc, time); + events.prototype.changeFloor = function ( + floorId, + stair, + heroLoc, + time, + callback + ) { + let block = core.getBlock(hero.loc.x, hero.loc.y); + var info = this._changeFloor_getInfo(floorId, stair, heroLoc, time); - if (info == null) { - if (callback) callback(); - return; - } - floorId = info.floorId; - info.locked = core.status.lockControl; + if (info == null) { + if (callback) callback(); + return; + } + floorId = info.floorId; + info.locked = core.status.lockControl; - core.dom.floorNameLabel.innerText = core.status.maps[floorId].title; - core.lockControl(); - core.stopAutomaticRoute(); - core.clearContinueAutomaticRoute(); - core.status.replay.animate = true; - clearInterval(core.interval.onDownInterval); - core.interval.onDownInterval = "tmp"; + core.dom.floorNameLabel.innerText = core.status.maps[floorId].title; + core.lockControl(); + core.stopAutomaticRoute(); + core.clearContinueAutomaticRoute(); + core.status.replay.animate = true; + clearInterval(core.interval.onDownInterval); + delete core.animateFrame.tip + core.interval.onDownInterval = "tmp"; - this._changeFloor_beforeChange(info, block, callback); - }; - events.prototype._changeFloor_beforeChange = function ( - info, - block, - callback - ) { - this._changeFloor_playSound(); - if ( - block && - block?.event && - !main.replayChecking && - !core.isReplaying() - ) { - const dirEntries = allChangeEntries.find( - (v) => v[1] === block.event.id - ); - if (block?.event?.trigger === "changeFloor" && dirEntries) { - const toFloorId = block.event.data.floorId; - const dir = dirEntries[0]; + this._changeFloor_beforeChange(info, block, callback); + }; + events.prototype._changeFloor_beforeChange = function ( + info, + block, + callback + ) { + this._changeFloor_playSound(); + if ( + block && + block?.event && + !main.replayChecking && + !core.isReplaying() + ) { + const dirEntries = allChangeEntries.find( + (v) => v[1] === block.event.id + ); + if (block?.event?.trigger === "changeFloor" && dirEntries) { + const toFloorId = block.event.data.floorId; + const dir = dirEntries[0]; - const data = core.ui._drawViewMaps_buildData( - core.floorIds.indexOf(core.status.floorId) - ); - const dataTo = core.ui._drawViewMaps_buildData( - core.floorIds.indexOf(toFloorId) - ); - const v = dirData[dir][1], // 水平数值 - h = dirData[dir][0]; //竖直数值 - ctx.clearRect(0, 0, 1248, 1248); - core.drawThumbnail(core.status.floorId, null, { - damage: data.damage, - ctx: ctx, - x: 416, - y: 416, - size: 1, - all: data.all, - }); - if (dir !== "upFloor" && dir !== "downFloor") { - core.drawThumbnail(toFloorId, null, { - damage: dataTo.damage, - ctx: ctx, - x: 416 + 416 * v, - y: 416 + 416 * h, - size: 1, - all: dataTo.all, - }); + const data = core.ui._drawViewMaps_buildData( + core.floorIds.indexOf(core.status.floorId) + ); + const dataTo = core.ui._drawViewMaps_buildData( + core.floorIds.indexOf(toFloorId) + ); + const v = dirData[dir][1], // 水平数值 + h = dirData[dir][0]; //竖直数值 + ctx.clearRect(0, 0, 1248, 1248); + core.drawThumbnail(core.status.floorId, null, { + damage: data.damage, + ctx: ctx, + x: 416, + y: 416, + size: 1, + all: data.all, + }); + if (dir !== "upFloor" && dir !== "downFloor") { + core.drawThumbnail(toFloorId, null, { + damage: dataTo.damage, + ctx: ctx, + x: 416 + 416 * v, + y: 416 + 416 * h, + size: 1, + all: dataTo.all, + }); - var _run = function () { - var cb = function () { - modedata = 0; - core.clearUI(); - core.clearMap("data"); - core.events._changeFloor_changing(info, callback); - }; + var _run = function () { + var cb = function () { + modedata = 0; + core.clearUI(); + core.clearMap("data"); + core.events._changeFloor_changing(info, callback); + }; - var animate = window.setInterval( - function () { - if (modedata >= 416) { - delete core.animateFrame.asyncId[animate]; - clearInterval(animate); - cb(); - } else { - core.clearUI(); - core.clearMap("data"); + var animate = window.setInterval( + function () { + if (modedata >= 416) { + delete core.animateFrame.asyncId[animate]; + clearInterval(animate); + cb(); + } else { + core.clearUI(); + core.clearMap("data"); - core.canvas.data.drawImage( - move, - 416 + modedata * v, - 416 + modedata * h, - 416, - 416, - 0, - 0, - 416, - 416 - ); - let status = "leftFoot"; + core.canvas.data.drawImage( + move, + 416 + modedata * v, + 416 + modedata * h, + 416, + 416, + 0, + 0, + 416, + 416 + ); + let status = "leftFoot"; - if (modedata > 208) { - status = "rightFoot"; - } - const img = core.material.images.hero; - const heroIconArr = core.material.icons.hero; - const width = core.material.icons.hero.width || 32; - const height = core.material.icons.hero.height; - const heroIcon = heroIconArr[dir]; + if (modedata > 208) { + status = "rightFoot"; + } + const img = core.material.images.hero; + const heroIconArr = core.material.icons.hero; + const width = core.material.icons.hero.width || 32; + const height = core.material.icons.hero.height; + const heroIcon = heroIconArr[dir]; - core.canvas.data.drawImage( - img, - (heroIcon[status] % 4) * width, - heroIcon.loc * height, - width, - height, - core.status.hero.loc.x * 32 - - core.bigmap.offsetX - - (modedata - (modedata * 32) / 416) * v, - core.status.hero.loc.y * 32 - - 16 - - (modedata - (modedata * 32) / 416) * h, - width, - height - ); - modedata += speed; - clearInterval(animate); - delete core.animateFrame.asyncId[animate]; - _run(); - } - }, - core.status.replay.speed == 24 - ? 1 - : 10 / core.status.replay.speed - ); + core.canvas.data.drawImage( + img, + (heroIcon[status] % 4) * width, + heroIcon.loc * height, + width, + height, + core.status.hero.loc.x * 32 - + core.bigmap.offsetX - + (modedata - (modedata * 32) / 416) * v, + core.status.hero.loc.y * 32 - + 16 - + (modedata - (modedata * 32) / 416) * h, + width, + height + ); + modedata += speed; + clearInterval(animate); + delete core.animateFrame.asyncId[animate]; + _run(); + } + }, + core.status.replay.speed == 24 ? + 1 : + 10 / core.status.replay.speed + ); - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = cb; - }; - _run(); - return; - } - } - } - // 需要 setTimeout 执行,不然会出错 - window.setTimeout(function () { - if (info.time == 0) core.events._changeFloor_changing(info, callback); - else - core.showWithAnimate( - core.dom.floorMsgGroup, - info.time / 2, - function () { - core.events._changeFloor_changing(info, callback); - } - ); - }, 25); - }; - }, + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = cb; + }; + _run(); + return; + } + } + } + // 需要 setTimeout 执行,不然会出错 + window.setTimeout(function () { + if (info.time == 0) core.events._changeFloor_changing(info, callback); + else + core.showWithAnimate( + core.dom.floorMsgGroup, + info.time / 2, + function () { + core.events._changeFloor_changing(info, callback); + } + ); + }, 25); + }; +}, "剧情cg": function () { // 在此增加新插件 // 在此增加新插件 From 943e34af72f31c833f5bca55925bddb0d66e7fdc Mon Sep 17 00:00:00 2001 From: strawberry42271 <2806566736@qq.com> Date: Sun, 9 Feb 2025 17:20:40 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E7=89=B9=E6=AE=8A=E6=88=98=E5=85=A5?= =?UTF-8?q?=E5=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/data.js | 1 + project/images/tati_310101.webp | Bin 0 -> 33708 bytes project/plugins.js | 3569 ++++++++++++++++++++----------- 3 files changed, 2266 insertions(+), 1304 deletions(-) create mode 100644 project/images/tati_310101.webp diff --git a/project/data.js b/project/data.js index d049221..ac06e54 100644 --- a/project/data.js +++ b/project/data.js @@ -784,6 +784,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "tati_120128.webp", "tati_120131.webp", "tati_120132.webp", + "tati_310101.webp", "tati_340101.webp", "tati_340101a.webp", "tati_340101y.webp", diff --git a/project/images/tati_310101.webp b/project/images/tati_310101.webp new file mode 100644 index 0000000000000000000000000000000000000000..e5a5dcebb768aea73fce6f2cbb3827fcd5896fb1 GIT binary patch literal 33708 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 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(); - } + main.dom.boss2.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss2.style.height = obj.totalHeight + 3 + "px"; - 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; + main.dom.boss3.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss3.style.height = obj.totalHeight + 3 + "px"; - const clientWidth = main.dom.body.clientWidth, - clientHeight = main.dom.body.clientHeight; - const canvasWidth = core.__PIXELS__; - const isVertical = clientHeight > clientWidth; - core.domStyle.isVertical = isVertical; + main.dom.boss4.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss4.style.height = obj.totalHeight + 3 + "px"; - 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 - ); - core.domStyle.availableScale = []; - [1, 1.25, 1.5, 1.75, 2].forEach(function (v) { - if (maxRatio >= v) { - core.domStyle.availableScale.push(v); - } - }); + main.dom.boss.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss.style.height = obj.totalHeight + 3 + "px"; - 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 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 totalWidthScaled = totalWidth * core.domStyle.scale, - totalHeightScaled = totalHeight * core.domStyle.scale; + 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; - 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 }; + 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(); + } - const obj = { - clientWidth: clientWidth, - clientHeight: clientHeight, - canvasWidth: canvasWidth, - totalWidth: totalWidthScaled, - totalHeight: totalHeightScaled, - gameDrawBox: gameDrawBox, - globalAttribute: - core.status.globalAttribute || core.initStatus.globalAttribute, - }; + 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; + } + } + }); - _resize_gameGroup(obj); - _resize_canvas(obj); + core.control.resize = function () { + //自适应,可实现横竖屏切换 + if (main.mode == "editor") return; - 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(); - }; + const clientWidth = main.dom.body.clientWidth, + clientHeight = main.dom.body.clientHeight; + const canvasWidth = core.__PIXELS__; - 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 isVertical = clientHeight > clientWidth; + core.domStyle.isVertical = isVertical; - 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 totalWidth = isVertical ? + GAMEVIEW_WIDTH_VERTICAL / 3 : + GAMEVIEW_WIDTH / 3, + totalHeight = isVertical ? + GAMEVIEW_HEIGHT_VERTICAL / 3 : + GAMEVIEW_HEIGHT / 3; - 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 maxRatio = Math.min( + clientWidth / totalWidth, + clientHeight / totalHeight + ); - 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.domStyle.availableScale = []; + [1, 1.25, 1.5, 1.75, 2].forEach(function (v) { + if (maxRatio >= v) { + core.domStyle.availableScale.push(v); + } + }); - // 四舍五入 - 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 - ); + 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); + } - 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 - ); + const totalWidthScaled = totalWidth * core.domStyle.scale, + totalHeightScaled = totalHeight * core.domStyle.scale; - 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); - } - }); - } - } + 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 }; - _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; + const obj = { + clientWidth: clientWidth, + clientHeight: clientHeight, + canvasWidth: canvasWidth, + totalWidth: totalWidthScaled, + totalHeight: totalHeightScaled, + gameDrawBox: gameDrawBox, + globalAttribute: core.status.globalAttribute || core.initStatus.globalAttribute, + }; - if (!floorId) return; - const info = core.plugin.getMapDrawInfo(floorId, Infinity, true); - core.setTextAlign("outerUI", "center"); + _resize_gameGroup(obj); + _resize_canvas(obj); - core.plugin.drawSmallMap(uictx, info, floorId, x, y, 300, 300); - } + 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 (main.dom.boss1 && main.dom.boss1.style.display === "block") + core.ui.boss.update(); + }; - _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; + 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; - if (core.domStyle.isVertical) { - this.drawKey(keyList[i], baseX, baseY + delta); - } else { - this.drawKey(keyList[i], baseX + delta, baseY); - } + 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; - 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; + 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; - if (key == "yellowKey") sx += 13; - else if (key == "blueKey") sx += 26; - else if (key == "greenKey") sx += 39; + 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.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.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 + ); - 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 - ); + 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 + ); - 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 - ); + 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); + } + }); + } + } - 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 - ); + _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; - 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 (!floorId) return; + const info = core.plugin.getMapDrawInfo(floorId, Infinity, true); + core.setTextAlign("outerUI", "center"); - 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]) + 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]; + }); + + 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); + } + + 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; + + 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", "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 + 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 (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, @@ -16389,53 +16410,993 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "回合制boss战": function () { - // 在此增加新插件 - const boss = document.createElement("canvas"); //boss战画布设置 - boss.style.position = "absolute"; - boss.style.zIndex = 300; - boss.style.display = "none"; - boss.id = "boss"; - main.dom.gameGroup.insertAdjacentElement("afterend", boss); - boss.style.top = "50%"; - boss.style.left = "50%"; - boss.style.transform = "translate(-50%,-50%)"; - const ctx = boss.getContext("2d"); - main.dom.boss = boss; - boss.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.boss.onclick(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - class boss1 { - constructor() { - this.bg = ""; - } - cavans() { - if (core.domStyle.isVertical) { - ctx.canvas.width = 1248; - ctx.canvas.height = 2028; + // 在此增加新插件 + const boss = document.createElement("canvas"); //boss战画布设置 + boss.style.position = "absolute"; + boss.style.zIndex = 310; + boss.style.display = "none"; + boss.id = "boss"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss); + boss.style.top = "50%"; + boss.style.left = "50%"; + boss.style.transform = "translate(-50%,-50%)"; + const ctx = boss.getContext("2d"); + main.dom.boss = boss; + const boss1 = document.createElement("canvas"); //boss战画布设置 + boss1.style.position = "absolute"; + boss1.style.zIndex = 300; + boss1.style.display = "none"; + boss1.id = "boss1"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss1); + boss1.style.top = "50%"; + boss1.style.left = "50%"; + boss1.style.transform = "translate(-50%,-50%)"; + const ctx1 = boss1.getContext("2d"); + main.dom.boss1 = boss1; + const boss2 = document.createElement("canvas"); //boss战画布设置 + boss2.style.position = "absolute"; + boss2.style.zIndex = 301; + boss2.style.display = "none"; + boss2.id = "boss2"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss2); + boss2.style.top = "50%"; + boss2.style.left = "50%"; + boss2.style.transform = "translate(-50%,-50%)"; + main.dom.boss2 = boss2; + const ctx2 = boss2.getContext("2d"); + const boss3 = document.createElement("canvas"); //boss战画布设置 + boss3.style.position = "absolute"; + boss3.style.zIndex = 302; + boss3.style.display = "none"; + boss3.id = "boss3"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss3); + boss3.style.top = "50%"; + boss3.style.left = "50%"; + boss3.style.transform = "translate(-50%,-50%)"; + main.dom.boss3 = boss3; + const ctx3 = boss3.getContext("2d"); + const boss4 = document.createElement("canvas"); //boss战画布设置 + boss4.style.position = "absolute"; + boss4.style.zIndex = 303; + boss4.style.display = "none"; + boss4.id = "boss4"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss4); + boss4.style.top = "50%"; + boss4.style.left = "50%"; + boss4.style.transform = "translate(-50%,-50%)"; + const ctx4 = boss4.getContext("2d"); + main.dom.boss4 = boss4; + boss.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); + click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; - core.setTextAlign(ctx, "center"); - } else { - ctx.canvas.width = 2028; - ctx.canvas.height = 1248; + function 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]; + } + class Boss { + constructor() { + //绘制需要的变量 + this.bg = ""; + this.heroImage = "tati_310101.webp" + this.hero = { hp: 1000, atk: 100, def: 100, spell: 100, speed: 10, mdef: 10 } + this.boss = { name: "菲奥奈", id: "feiaonai", image: "tati_050143.webp", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 } + this.enemy = [ + { name: "小蝙蝠", id: "bat", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 }, + { name: "红蝙蝠", id: "redBat", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 }, + { name: "大蝙蝠", id: "bigBat", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 }, + { name: "绿色史莱姆", id: "greenSlime", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 }, + { name: "红色史莱姆", id: "redSlime", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 }, + { name: "黑色史莱姆", id: "blackSlime", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 }, + ] + this.bossImage = "tati_050143.webp" + this.selection = "boss" + this.herobuff = ["sword1:1", "fly:30"] + this.bossbuff = ["fly:2", "book:12"] + this.enemybuff = [ + [], + [], + [], + [], + [], + [] + ] + } - core.setTextAlign(ctx, "center"); - } - } - start() {} - onclick(px, py) {} - } - core.ui.boss = new boss1(); - }, + async bossStart() { + core.lockControl() + await this.blackBg() + this.moveboss() + await this.movehero() + await this.moveStatus() + + + } + async bossEnd() { + await this.close() + + } + drawhero() { + core.clearMap(ctx2) + if (core.domStyle.isVertical) { + ctx2.canvas.width = 1248; + ctx2.canvas.height = 2028; + ctx2.save(); //保存设置 + ctx2.translate(1248, 0); //重新定位右上角为基准 + ctx2.rotate(Math.PI / 2); //旋转90度 + } else { + ctx2.canvas.width = 2028; + ctx2.canvas.height = 1248; + } + core.drawImage(ctx2, this.heroImage, 0, 168, 750, 1080) + ctx2.restore(); + } + movehero() { + boss2.style.display = "block" + core.clearMap(ctx2) + let time = 0, + px = -200; + return new Promise((resolve) => { + core.registerAnimationFrame("moveheroImage", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime + core.clearMap(ctx2) + if (core.domStyle.isVertical) { + ctx2.canvas.width = 1248; + ctx2.canvas.height = 2028; + ctx2.save(); //保存设置 + ctx2.translate(1248, 0); //重新定位右上角为基准 + ctx2.rotate(Math.PI / 2); //旋转90度 + } else { + ctx2.canvas.width = 2028; + ctx2.canvas.height = 1248; + } + core.drawImage(ctx2, this.heroImage, px, 168, 750, 1080) + px += 10 + ctx2.restore(); + if (px >= 0) { + core.unregisterAnimationFrame("moveheroImage") + this.drawhero() + resolve() + + } + } + }) + }) + } + update() { + core.drawImage(ctx1, this.bg, 0, 0, 2028, 1248) + this.drawboss() + this.drawhero() + this.drawStatus() + } + drawboss() { + core.clearMap(ctx3) + if (core.domStyle.isVertical) { + ctx3.canvas.width = 1248; + ctx3.canvas.height = 2028; + ctx3.save(); //保存设置 + ctx3.translate(1248, 0); //重新定位右上角为基准 + ctx3.rotate(Math.PI / 2); //旋转90度 + } else { + ctx3.canvas.width = 2028; + ctx3.canvas.height = 1248; + } + core.drawImage(ctx3, this.bossImage, 1400, 168, 750, 1080) + + ctx3.restore(); + } + moveboss() { + boss3.style.display = "block" + core.clearMap(ctx3) + let time = 0, + px = 1600; + return new Promise((resolve) => { + core.registerAnimationFrame("movebossImage", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime + core.clearMap(ctx3) + if (core.domStyle.isVertical) { + ctx3.canvas.width = 1248; + ctx3.canvas.height = 2028; + ctx3.save(); //保存设置 + ctx3.translate(1248, 0); //重新定位右上角为基准 + ctx3.rotate(Math.PI / 2); //旋转90度 + } else { + ctx3.canvas.width = 2028; + ctx3.canvas.height = 1248; + } + core.drawImage(ctx3, this.bossImage, px, 168, 750, 1080) + px -= 10 + ctx3.restore(); + if (px <= 1400) { + core.unregisterAnimationFrame("movebossImage") + this.drawboss() + resolve() + + } + } + }) + }) + } + drawStatus() { + + core.clearMap(ctx4) + if (core.domStyle.isVertical) { + ctx4.canvas.width = 1248; + ctx4.canvas.height = 2028; + ctx4.save(); //保存设置 + ctx4.translate(1248, 0); //重新定位右上角为基准 + ctx4.rotate(Math.PI / 2); //旋转90度 + } else { + ctx4.canvas.width = 2028; + ctx4.canvas.height = 1248; + } + core.drawWindowSkin("winskin.webp", ctx4, 600, 900, 900, 300, null, null, null, 3) + core.fillBoldText1( + ctx4, + hero.name, + 630, + 980, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 880, + 980, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + '生命 ' + this.hero.hp, + 630, + 1050, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + '攻击 ' + this.hero.atk, + 630, + 1100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + '防御 ' + this.hero.def, + 630, + 1150, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + '法强 ' + this.hero.spell, + 1080, + 1050, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + '法抗 ' + this.hero.mdef + "%", + 1080, + 1100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + '速度 ' + this.hero.speed, + 1080, + 1150, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + let posx = 980 + this.herobuff.forEach(v => { + if (v) { + const a = v.split(":") + core.drawIcon(ctx4, a[0], posx, 930, 64, 64) + core.setTextAlign(ctx4, "right") + core.fillBoldText1( + ctx4, + a[1], + posx + 50, + 980, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left") + posx += 80 + } + }) + if (this.selection === "boss") { + core.drawWindowSkin("winskin.webp", ctx4, 50, 50, 1900, 200, null, null, null, 3) + core.fillBoldText1( + ctx4, + this.boss.name, + 100, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 500, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "生命 " + this.boss.hp, + 100, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "攻击 " + this.boss.atk, + 500, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "防御 " + this.boss.def, + 900, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法抗 " + this.boss.mdef + "%", + 1300, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "速度 " + this.boss.speed, + 1700, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + + ); + let posx = 600 + this.bossbuff.forEach(v => { + if (v) { + const a = v.split(":") + core.drawIcon(ctx4, a[0], posx, 80, 64, 64) + core.setTextAlign(ctx4, "right") + core.fillBoldText1( + ctx4, + a[1], + posx + 50, + 130, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left") + posx += 80 + } + }) + } else if (this.selection === "") {} else { + core.drawWindowSkin("winskin.webp", ctx4, 50, 50, 1900, 200, null, null, null, 3) + core.fillBoldText1( + ctx4, + this.enemy[this.selection].name, + 100, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 500, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "生命 " + this.enemy[this.selection].hp, + 100, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "攻击 " + this.enemy[this.selection].atk, + 500, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "防御 " + this.enemy[this.selection].def, + 900, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法抗 " + this.enemy[this.selection].mdef + "%", + 1300, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "速度 " + this.enemy[this.selection].speed, + 1700, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + + ); + let posx = 600 + this.enemybuff[this.selection].forEach(v => { + if (v) { + const a = v.split(":") + core.drawIcon(ctx4, a[0], posx, 80, 64, 64) + core.setTextAlign(ctx4, "right") + core.fillBoldText1( + ctx4, + a[1], + posx + 50, + 130, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left") + posx += 80 + } + }) + } + ctx4.restore(); + } + moveStatus() { + boss4.style.display = "block" + let time = 0, + posy = 400; + return new Promise((resolve) => { + core.registerAnimationFrame("moveStatus", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime + core.clearMap(ctx4) + if (core.domStyle.isVertical) { + ctx4.canvas.width = 1248; + ctx4.canvas.height = 2028; + ctx4.save(); //保存设置 + ctx4.translate(1248, 0); //重新定位右上角为基准 + ctx4.rotate(Math.PI / 2); //旋转90度 + } else { + ctx4.canvas.width = 2028; + ctx4.canvas.height = 1248; + } + core.drawWindowSkin("winskin.webp", ctx4, 600, 900 + posy, 900, 300, null, null, null, 3) + core.fillBoldText1( + ctx4, + hero.name, + 630, + 980 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 880, + 980 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + '生命 ' + this.hero.hp, + 630, + 1050 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + '攻击 ' + this.hero.atk, + 630, + 1100 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + '防御 ' + this.hero.def, + 630, + 1150 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + '法强 ' + this.hero.spell, + 1080, + 1050 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + '法抗 ' + this.hero.mdef + "%", + 1080, + 1100 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + '速度 ' + this.hero.speed, + 1080, + 1150 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + let posx = 980 + this.herobuff.forEach(v => { + if (v) { + const a = v.split(":") + core.drawIcon(ctx4, a[0], posx, 930 + posy, 64, 64) + core.setTextAlign(ctx4, "right") + core.fillBoldText1( + ctx4, + a[1], + posx + 50, + 980 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left") + posx += 80 + } + }) + if (this.selection === "boss") { + core.drawWindowSkin("winskin.webp", ctx4, 50, 50 - posy / 2, 1900, 200, null, null, null, 3) + core.fillBoldText1( + ctx4, + this.boss.name, + 100, + 120 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 500, + 120 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "生命 " + this.boss.hp, + 100, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "攻击 " + this.boss.atk, + 500, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "防御 " + this.boss.def, + 900, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法抗 " + this.boss.mdef + "%", + 1300, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "速度 " + this.boss.speed, + 1700, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + + ); + let posx = 600 + this.bossbuff.forEach(v => { + if (v) { + const a = v.split(":") + core.drawIcon(ctx4, a[0], posx, 80 - posy / 2, 64, 64) + core.setTextAlign(ctx4, "right") + core.fillBoldText1( + ctx4, + a[1], + posx + 50, + 130 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left") + posx += 80 + } + }) + } else if (this.selection === "") {} else { + core.drawWindowSkin("winskin.webp", ctx4, 50, 50 - posy / 2, 1900, 200, null, null, null, 3) + core.fillBoldText1( + ctx4, + this.enemy[this.selection].name, + 100, + 120 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 500, + 120 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "生命 " + this.enemy[this.selection].hp, + 100, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "攻击 " + this.enemy[this.selection].atk, + 500, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "防御 " + this.enemy[this.selection].def, + 900, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法抗 " + this.enemy[this.selection].mdef + "%", + 1300, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "速度 " + this.enemy[this.selection].speed, + 1700, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + + ); + let posx = 600 + this.enemybuff[this.selection].forEach(v => { + if (v) { + const a = v.split(":") + core.drawIcon(ctx4, a[0], posx, 80 - posy / 2, 64, 64) + core.setTextAlign(ctx4, "right") + core.fillBoldText1( + ctx4, + a[1], + posx + 50, + 130 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left") + posx += 80 + } + }) + } + ctx4.restore(); + posy -= 10 + if (posy <= 0) { + core.unregisterAnimationFrame("moveStatus") + this.drawStatus() + resolve() + } + } + }) + }) + } + close() { + let globalAlpha = 0, + time = 0 + boss.style.display = 'block' + return new Promise((resolve) => { + core.registerAnimationFrame("closeblack", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime + core.clearMap(ctx) + 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; + } + + + ctx.globalAlpha = globalAlpha; + + core.fillRect(ctx, 0, 0, 2028, 1248); + globalAlpha += 1 / 30 + ctx.restore(); + if (globalAlpha > 1) { + time = 0 + globalAlpha = 1 + core.unregisterAnimationFrame("closeblack") + boss1.style.display = 'none' + boss2.style.display = 'none' + boss3.style.display = 'none' + boss4.style.display = 'none' + core.registerAnimationFrame("closeblack2", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime + core.clearMap(ctx) + 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; + } + ctx.globalAlpha = globalAlpha + core.fillRect(ctx1, 0, 0, 2028, 1248, "#000000"); + ctx.restore(); + globalAlpha -= 1 / 30 + if (globalAlpha < 0) { + core.unregisterAnimationFrame("closeblack2") + boss.style.display = 'none' + core.unlockControl() + resolve() + } + } + }) + } + } + }) + }) + } + + blackBg() { + let globalAlpha = 0, + time = 0, + img = core.material.images.images[this.bg]; + boss1.style.display = 'block' + return new Promise((resolve) => { + core.registerAnimationFrame("bossblack", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime + core.clearMap(ctx1) + if (core.domStyle.isVertical) { + ctx1.canvas.width = 1248; + ctx1.canvas.height = 2028; + ctx1.save(); //保存设置 + ctx1.translate(1248, 0); //重新定位右上角为基准 + ctx1.rotate(Math.PI / 2); //旋转90度 + } else { + ctx1.canvas.width = 2028; + ctx1.canvas.height = 1248; + } + + + ctx1.globalAlpha = globalAlpha; + + core.fillRect(ctx1, 0, 0, 2028, 1248); + globalAlpha += 1 / 30 + ctx1.restore(); + if (globalAlpha > 1) { + time = 0 + globalAlpha = 0 + core.unregisterAnimationFrame("bossblack") + core.registerAnimationFrame("bossBg", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime + core.clearMap(ctx1) + if (core.domStyle.isVertical) { + ctx1.canvas.width = 1248; + ctx1.canvas.height = 2028; + ctx1.save(); //保存设置 + ctx1.translate(1248, 0); //重新定位右上角为基准 + ctx1.rotate(Math.PI / 2); //旋转90度 + } else { + ctx1.canvas.width = 2028; + ctx1.canvas.height = 1248; + } + + ctx1.globalAlpha = 1 + core.fillRect(ctx1, 0, 0, 2028, 1248); + ctx1.globalAlpha = globalAlpha + if (img) ctx1.drawImage(img, 0, 0, 2028, 1248); + ctx1.restore(); + globalAlpha += 1 / 30 + if (globalAlpha > 1) { + core.unregisterAnimationFrame("bossBg") + resolve() + } + } + }) + } + } + }) + }) + } + } + core.ui.boss = new Boss() + + + +}, "剧情视频引用": function () { // 在此增加新插件 let a; @@ -16620,127 +17581,127 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "帧动画/图片叠拼": function () { - // 在此增加新插件 - this.animationDrawable = function ( - allFarme, - color, - globalAlpha, - imageList, - soundList - ) { - if (!core.isPlaying()) { - return core.doAction(); - } - const over = main.dom.over; - const ctx = over.getContext("2d"); - over.style.display = "block"; + // 在此增加新插件 + this.animationDrawable = function ( + allFarme, + color, + globalAlpha, + imageList, + soundList + ) { + if (!core.isPlaying()) { + return core.doAction(); + } + const over = main.dom.over; + const ctx = over.getContext("2d"); + over.style.display = "block"; - let farme = 0; - let now = 0; - core.registerAnimationFrame( - "animationDrawable", - true, - function (timestamp) { - if (timestamp - now > 1000 / 60) { - now = timestamp; - if (core.domStyle.isVertical) { - over.width = 1248; - over.height = 2028; - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - } else { - over.width = 2028; - over.height = 1248; - } + let farme = 0; + let now = 0; + core.registerAnimationFrame( + "animationDrawable", + true, + function (timestamp) { + if (timestamp - now > 1000 / 60) { + now = timestamp; + if (core.domStyle.isVertical) { + over.width = 1248; + over.height = 2028; + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } else { + over.width = 2028; + over.height = 1248; + } - ctx.globalAlpha = (globalAlpha ?? 100) / 100; - core.fillRect(ctx, 0, 0, 2028, 1248, color); + ctx.globalAlpha = (globalAlpha ?? 100) / 100; + core.fillRect(ctx, 0, 0, 2028, 1248, color); - imageList.forEach(function (one) { - if ( - farme >= (one.beforefarme ?? 0) && - farme <= (one.afterfarme ?? allFarme) - ) { - const img = core.material.images.images?.[one.image]; - if (img) { - const gla = one.globalAlpha ?? 100; - const agla = one.aglobalAlpha ?? gla, - beforefarme = one.beforefarme ?? 0; - const afterfarme = one.afterfarme ?? allFarme; + imageList.forEach(function (one) { + if ( + farme >= (one.beforefarme ?? 0) && + farme <= (one.afterfarme ?? allFarme) + ) { + const img = core.material.images.images?.[one.image]; + if (img) { + const gla = one.globalAlpha ?? 100; + const agla = one.aglobalAlpha ?? gla, + beforefarme = one.beforefarme ?? 0; + const afterfarme = one.afterfarme ?? allFarme; - ctx.globalAlpha = - (gla + - ((agla - gla) * (farme - beforefarme)) / - (afterfarme - beforefarme || 1)) / - 100; + ctx.globalAlpha = + (gla + + ((agla - gla) * (farme - beforefarme)) / + (afterfarme - beforefarme || 1)) / + 100; - const cx = - (one.cx ?? 0) + - (((one.acx ?? 0) - (one.cx ?? 0)) * - (farme - beforefarme)) / - (afterfarme - beforefarme || 1), - cy = - (one.cy ?? 0) + - (((one.acy ?? 0) - (one.cy ?? 0)) * - (farme - beforefarme)) / - (afterfarme - beforefarme || 1), - cw = - (one.cw ?? img.width) + - (((one.acw ?? img.width) - (one.cw ?? img.width)) * - (farme - beforefarme)) / - (afterfarme - beforefarme || 1), - ch = - (one.ch ?? img.height) + - (((one.acw ?? img.height) - (one.cw ?? img.height)) * - (farme - beforefarme)) / - (afterfarme - beforefarme || 1), - x = - (one.x ?? 0) + - (((one.ax ?? 0) - (one.x ?? 0)) * (farme - beforefarme)) / - (afterfarme - beforefarme || 1), - y = - (one.y ?? 0) + - (((one.ay ?? 0) - (one.y ?? 0)) * (farme - beforefarme)) / - (afterfarme - beforefarme || 1), - w = - (one.w ?? 2028) + - (((one.aw ?? 2028) - (one.w ?? 2028)) * - (farme - beforefarme)) / - (afterfarme - beforefarme || 1), - h = - (one.h ?? 1248) + - (((one.aw ?? 1248) - (one.w ?? 1248)) * - (farme - beforefarme)) / - (afterfarme - beforefarme || 1); - ctx.drawImage(img, cx, cy, cw, ch, x, y, w, h); - } - } - }); - soundList.forEach(function (one) { - const lisen = - one.sound && - core.sounds[one.sound] && - core.musicStatus.soundStatus; - if (farme == one.startfarme && lisen) { - if (one.stopbefore) core.stopSound(); - core.playSound(one.sound); - } - }); - farme++; - ctx.globalAlpha = 1; - ctx.restore(); + const cx = + (one.cx ?? 0) + + (((one.acx ?? 0) - (one.cx ?? 0)) * + (farme - beforefarme)) / + (afterfarme - beforefarme || 1), + cy = + (one.cy ?? 0) + + (((one.acy ?? 0) - (one.cy ?? 0)) * + (farme - beforefarme)) / + (afterfarme - beforefarme || 1), + cw = + (one.cw ?? img.width) + + (((one.acw ?? img.width) - (one.cw ?? img.width)) * + (farme - beforefarme)) / + (afterfarme - beforefarme || 1), + ch = + (one.ch ?? img.height) + + (((one.acw ?? img.height) - (one.cw ?? img.height)) * + (farme - beforefarme)) / + (afterfarme - beforefarme || 1), + x = + (one.x ?? 0) + + (((one.ax ?? 0) - (one.x ?? 0)) * (farme - beforefarme)) / + (afterfarme - beforefarme || 1), + y = + (one.y ?? 0) + + (((one.ay ?? 0) - (one.y ?? 0)) * (farme - beforefarme)) / + (afterfarme - beforefarme || 1), + w = + (one.w ?? 2028) + + (((one.aw ?? 2028) - (one.w ?? 2028)) * + (farme - beforefarme)) / + (afterfarme - beforefarme || 1), + h = + (one.h ?? 1248) + + (((one.aw ?? 1248) - (one.w ?? 1248)) * + (farme - beforefarme)) / + (afterfarme - beforefarme || 1); + ctx.drawImage(img, cx, cy, cw, ch, x, y, w, h); + } + } + }); + soundList.forEach(function (one) { + const lisen = + one.sound && + core.sounds[one.sound] && + core.musicStatus.soundStatus; + if (farme == one.startfarme && lisen) { + if (one.stopbefore) core.stopSound(); + core.playSound(one.sound); + } + }); + farme++; + ctx.globalAlpha = 1; + ctx.restore(); - if (farme > allFarme) { - core.unregisterAnimationFrame("animationDrawable"); - over.style.display = "none"; - core.doAction(); - } - } - } - ); - }; - }, + if (farme > allFarme) { + core.unregisterAnimationFrame("animationDrawable"); + over.style.display = "none"; + core.doAction(); + } + } + } + ); + }; +}, "musicMode": function () { // 在此增加新插件 const music = document.createElement("canvas"); From 153adac136b856e5f4bf974669b0b22b5f876271 Mon Sep 17 00:00:00 2001 From: strawberry42271 <2806566736@qq.com> Date: Sun, 9 Feb 2025 23:02:01 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E7=89=B9=E6=AE=8A=E6=88=98=E7=94=BB?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/plugins.js | 219 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 174 insertions(+), 45 deletions(-) diff --git a/project/plugins.js b/project/plugins.js index 8687259..b93a7b2 100644 --- a/project/plugins.js +++ b/project/plugins.js @@ -2726,7 +2726,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = main.dom.boss4.style.width = obj.totalWidth + 3 + "px"; main.dom.boss4.style.height = obj.totalHeight + 3 + "px"; - + main.dom.boss5.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss5.style.height = obj.totalHeight + 3 + "px"; main.dom.boss.style.width = obj.totalWidth + 3 + "px"; main.dom.boss.style.height = obj.totalHeight + 3 + "px"; @@ -16466,6 +16467,17 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = boss4.style.transform = "translate(-50%,-50%)"; const ctx4 = boss4.getContext("2d"); main.dom.boss4 = boss4; + const boss5 = document.createElement("canvas"); //boss战画布设置 + boss5.style.position = "absolute"; + boss5.style.zIndex = 304; + boss5.style.display = "none"; + boss5.id = "boss5"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss5); + boss5.style.top = "50%"; + boss5.style.left = "50%"; + boss5.style.transform = "translate(-50%,-50%)"; + const ctx5 = boss5.getContext("2d"); + main.dom.boss5 = boss5; boss.onclick = function (e) { try { e.preventDefault(); @@ -16474,35 +16486,25 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 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); - click(px * 3, py * 3); + if (core.domStyle.isVertical) { + core.ui.boss.click(1248 - py * 3, px * 3) + } else { + core.ui.boss.click(px * 3, py * 3); + } + } catch (ee) { main.log(ee); } }; - function 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]; - } + class Boss { constructor() { //绘制需要的变量 - this.bg = ""; + this.bg = "bg_3512.webp"; this.heroImage = "tati_310101.webp" this.hero = { hp: 1000, atk: 100, def: 100, spell: 100, speed: 10, mdef: 10 } - this.boss = { name: "菲奥奈", id: "feiaonai", image: "tati_050143.webp", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 } + this.boss = { name: "菲奥奈", id: "angel", image: "tati_050143.webp", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 } this.enemy = [ { name: "小蝙蝠", id: "bat", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 }, { name: "红蝙蝠", id: "redBat", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 }, @@ -16524,20 +16526,144 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = [] ] } - + 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]; + } async bossStart() { core.lockControl() await this.blackBg() this.moveboss() await this.movehero() await this.moveStatus() - + this.drawenemy() } async bossEnd() { await this.close() + core.unlockControl() } + drawenemy() { + let block, + time = 0, + farme = 0; + boss5.style.display = 'block' + core.registerAnimationFrame('enemyanimate', true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime + farme += 1 + let animate = Math.floor(farme / 30), + posx = 700, + posy = 350; + core.clearMap(ctx5) + if (core.domStyle.isVertical) { + ctx5.canvas.width = 1248; + ctx5.canvas.height = 2028; + ctx5.save(); //保存设置 + ctx5.translate(1248, 0); //重新定位右上角为基准 + ctx5.rotate(Math.PI / 2); //旋转90度 + } else { + ctx5.canvas.width = 2028; + ctx5.canvas.height = 1248; + } + let enemy = false + this.enemy.forEach(v => { if (v.hp > 0) enemy = true }) + if (enemy) { + + core.drawWindowSkin("winskin.webp", ctx5, 650, 250, 400, 660, null, null, null, 3) + if (this.selection === "boss") core.strokeRect(ctx5, 800, 600, 100, 150, "yellow", 6) + const bossBlock = core.getBlockInfo(this.boss.id) + core.drawImage( + ctx5, + bossBlock.image, + 32 * (animate % 4), + bossBlock.posY * 48, + 32, + 48, + 800, + 600, + 96, + 144 + ); + core.drawImage( + ctx5, + "hero.webp", + 32 * (animate % 4), + 144, + 32, + 48, + 800, + 750, + 96, + 144 + ); + for (let i = 0; i < this.enemy.length; i++) { + if (this.enemy[i].id) { + block = core.getBlockInfo(this.enemy[i].id) + } else { + posx += 100 + if (i === 2) { + posx = 600 + posy += 150 + } + continue + } + + if (block.cls === "enemys") { + core.drawImage( + ctx5, + block.image, + 32 * (animate % 2), + block.posY * 32, + 32, + 32, + posx, + posy, + 96, + 96 + ); + if (this.selection == i) core.strokeRect(ctx5, posx, posy, 100, 100, "yellow", 6) + } else { + core.drawImage( + ctx5, + block.image, + 32 * (animate % 4), + block.posY * 48, + 32, + 48, + posx, + posy, + 96, + 144 + ); + if (this.selection == i) core.strokeRect(ctx5, posx, posy, 100, 150, "yellow", 6) + } + + posx += 100 + if (i === 2) { + posx = 700 + posy += 150 + } + } + } + + ctx5.restore(); + } + }) + } drawhero() { core.clearMap(ctx2) if (core.domStyle.isVertical) { @@ -16654,12 +16780,12 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx4.canvas.width = 2028; ctx4.canvas.height = 1248; } - core.drawWindowSkin("winskin.webp", ctx4, 600, 900, 900, 300, null, null, null, 3) + core.drawWindowSkin("winskin.webp", ctx4, 600, 920, 900, 300, null, null, null, 3) core.fillBoldText1( ctx4, hero.name, 630, - 980, + 1000, "#FFFFFF", "#000000", 6, @@ -16669,7 +16795,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx4, "状态", 880, - 980, + 1000, "#FFFFFF", "#000000", 6, @@ -16679,7 +16805,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx4, '生命 ' + this.hero.hp, 630, - 1050, + 1070, "#FFFFFF", "#000000", 6, @@ -16689,7 +16815,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx4, '攻击 ' + this.hero.atk, 630, - 1100, + 1120, "#FFFFFF", "#000000", 6, @@ -16699,7 +16825,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx4, '防御 ' + this.hero.def, 630, - 1150, + 1170, "#FFFFFF", "#000000", 6, @@ -16709,7 +16835,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx4, '法强 ' + this.hero.spell, 1080, - 1050, + 1070, "#FFFFFF", "#000000", 6, @@ -16719,7 +16845,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx4, '法抗 ' + this.hero.mdef + "%", 1080, - 1100, + 1120, "#FFFFFF", "#000000", 6, @@ -16729,7 +16855,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx4, '速度 ' + this.hero.speed, 1080, - 1150, + 1170, "#FFFFFF", "#000000", 6, @@ -16739,13 +16865,13 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = this.herobuff.forEach(v => { if (v) { const a = v.split(":") - core.drawIcon(ctx4, a[0], posx, 930, 64, 64) + core.drawIcon(ctx4, a[0], posx, 950, 64, 64) core.setTextAlign(ctx4, "right") core.fillBoldText1( ctx4, a[1], posx + 50, - 980, + 1000, "#FFFFFF", "#000000", 6, @@ -16963,12 +17089,12 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx4.canvas.width = 2028; ctx4.canvas.height = 1248; } - core.drawWindowSkin("winskin.webp", ctx4, 600, 900 + posy, 900, 300, null, null, null, 3) + core.drawWindowSkin("winskin.webp", ctx4, 600, 920 + posy, 900, 300, null, null, null, 3) core.fillBoldText1( ctx4, hero.name, 630, - 980 + posy, + 1000 + posy, "#FFFFFF", "#000000", 6, @@ -16978,7 +17104,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx4, "状态", 880, - 980 + posy, + 1000 + posy, "#FFFFFF", "#000000", 6, @@ -16988,7 +17114,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx4, '生命 ' + this.hero.hp, 630, - 1050 + posy, + 1070 + posy, "#FFFFFF", "#000000", 6, @@ -16998,7 +17124,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx4, '攻击 ' + this.hero.atk, 630, - 1100 + posy, + 1120 + posy, "#FFFFFF", "#000000", 6, @@ -17008,7 +17134,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx4, '防御 ' + this.hero.def, 630, - 1150 + posy, + 1170 + posy, "#FFFFFF", "#000000", 6, @@ -17018,7 +17144,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx4, '法强 ' + this.hero.spell, 1080, - 1050 + posy, + 1070 + posy, "#FFFFFF", "#000000", 6, @@ -17028,7 +17154,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx4, '法抗 ' + this.hero.mdef + "%", 1080, - 1100 + posy, + 1120 + posy, "#FFFFFF", "#000000", 6, @@ -17038,7 +17164,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx4, '速度 ' + this.hero.speed, 1080, - 1150 + posy, + 1170 + posy, "#FFFFFF", "#000000", 6, @@ -17048,13 +17174,13 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = this.herobuff.forEach(v => { if (v) { const a = v.split(":") - core.drawIcon(ctx4, a[0], posx, 930 + posy, 64, 64) + core.drawIcon(ctx4, a[0], posx, 950 + posy, 64, 64) core.setTextAlign(ctx4, "right") core.fillBoldText1( ctx4, a[1], posx + 50, - 980 + posy, + 1000 + posy, "#FFFFFF", "#000000", 6, @@ -17292,10 +17418,12 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = time = 0 globalAlpha = 1 core.unregisterAnimationFrame("closeblack") + core.unregisterAnimationFrame('enemyanimate') boss1.style.display = 'none' boss2.style.display = 'none' boss3.style.display = 'none' boss4.style.display = 'none' + boss5.style.display = 'none' core.registerAnimationFrame("closeblack2", true, (temptime) => { if (temptime - time > 1000 / 60) { time = temptime @@ -17316,8 +17444,9 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = globalAlpha -= 1 / 30 if (globalAlpha < 0) { core.unregisterAnimationFrame("closeblack2") + boss.style.display = 'none' - core.unlockControl() + resolve() } } From 8cdc9d7f439504be2b512e65658e1ac4cc94dfe4 Mon Sep 17 00:00:00 2001 From: sakuya <1394232566@qq.com> Date: Mon, 10 Feb 2025 14:48:36 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=88=98=E6=96=97=E7=89=B9=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/data.js | 3 + project/events.js | 512 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 515 insertions(+) diff --git a/project/data.js b/project/data.js index ac06e54..77d7812 100644 --- a/project/data.js +++ b/project/data.js @@ -37,6 +37,9 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = ], "floorPartitions": [], "images": [ + "005-Attack03.webp", + "012-Heal01.webp", + "015-Fire01.webp", "HPGaugeEnemy_A.webp", "HPGaugeEnemy_B.webp", "LOGO.webp", diff --git a/project/events.js b/project/events.js index 71a864c..5b639ae 100644 --- a/project/events.js +++ b/project/events.js @@ -10763,6 +10763,518 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "stopbefore": false } ] + }, + { + "type": "setanimate", + "name": "Fire01", + "px": 48, + "py": 48, + "width": 192, + "height": 192, + "allFarme": 15, + "imageList": [ + { + "image": "015-Fire01.webp", + "beforefarme": 0, + "globalAlpha": 100, + "cx": 192, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 3, + "acx": 192, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "015-Fire01.webp", + "beforefarme": 4, + "globalAlpha": 100, + "cx": 384, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 6, + "acx": 384, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "015-Fire01.webp", + "beforefarme": 7, + "globalAlpha": 100, + "cx": 576, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 9, + "acx": 576, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "015-Fire01.webp", + "beforefarme": 10, + "globalAlpha": 100, + "cx": 768, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 12, + "acx": 768, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "015-Fire01.webp", + "beforefarme": 13, + "globalAlpha": 100, + "cx": 960, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 15, + "acx": 960, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + } + ], + "soundList": [ + { + "sound": "", + "startfarme": 0, + "stopbefore": false + } + ] + }, + { + "type": "setanimate", + "name": "Fire02", + "px": 48, + "py": 48, + "width": 192, + "height": 192, + "allFarme": 15, + "imageList": [ + { + "image": "015-Fire01.webp", + "beforefarme": 0, + "globalAlpha": 100, + "cx": 192, + "cy": 192, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 3, + "acx": 192, + "acy": 192, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "015-Fire01.webp", + "beforefarme": 4, + "globalAlpha": 100, + "cx": 384, + "cy": 192, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 6, + "acx": 384, + "acy": 192, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "015-Fire01.webp", + "beforefarme": 7, + "globalAlpha": 100, + "cx": 576, + "cy": 192, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 9, + "acx": 576, + "acy": 192, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "015-Fire01.webp", + "beforefarme": 10, + "globalAlpha": 100, + "cx": 768, + "cy": 192, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 12, + "acx": 768, + "acy": 192, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "015-Fire01.webp", + "beforefarme": 13, + "globalAlpha": 100, + "cx": 960, + "cy": 192, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 15, + "acx": 960, + "acy": 192, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + } + ], + "soundList": [ + { + "sound": "", + "startfarme": 0, + "stopbefore": false + } + ] + }, + { + "type": "setanimate", + "name": "005-Attack03", + "px": 48, + "py": 48, + "width": 192, + "height": 192, + "allFarme": 15, + "imageList": [ + { + "image": "005-Attack03.webp", + "beforefarme": 0, + "globalAlpha": 100, + "cx": 0, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 3, + "acx": 0, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "005-Attack03.webp", + "beforefarme": 4, + "globalAlpha": 100, + "cx": 192, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 6, + "acx": 192, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "005-Attack03.webp", + "beforefarme": 7, + "globalAlpha": 100, + "cx": 384, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 9, + "acx": 384, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "005-Attack03.webp", + "beforefarme": 10, + "globalAlpha": 100, + "cx": 576, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 12, + "acx": 576, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "005-Attack03.webp", + "beforefarme": 13, + "globalAlpha": 100, + "cx": 768, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 15, + "acx": 768, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + } + ], + "soundList": [ + { + "sound": "", + "startfarme": 0, + "stopbefore": false + } + ] + }, + { + "type": "setanimate", + "name": "012-Heal01", + "px": 48, + "py": 48, + "width": 192, + "height": 192, + "allFarme": 15, + "imageList": [ + { + "image": "012-Heal01.webp", + "beforefarme": 0, + "globalAlpha": 100, + "cx": 0, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 3, + "acx": 0, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "012-Heal01.webp", + "beforefarme": 4, + "globalAlpha": 100, + "cx": 192, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 6, + "acx": 192, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "012-Heal01.webp", + "beforefarme": 7, + "globalAlpha": 100, + "cx": 384, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 9, + "acx": 384, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "012-Heal01.webp", + "beforefarme": 10, + "globalAlpha": 100, + "cx": 576, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 12, + "acx": 576, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "012-Heal01.webp", + "beforefarme": 13, + "globalAlpha": 100, + "cx": 768, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 15, + "acx": 768, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + } + ], + "soundList": [ + { + "sound": "", + "startfarme": 0, + "stopbefore": false + } + ] } ] },