From 11d1e18a37676ea3b38922f6fc573fc317a8657f Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Mon, 15 Jun 2020 11:22:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AF=92=E8=A1=B0=E5=92=92=E5=A4=84=E7=90=86?= =?UTF-8?q?=E4=B8=8D=E8=B5=B0=E5=85=AC=E5=85=B1=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _docs/api.md | 2 +- _docs/element.md | 6 +- _docs/event.md | 2 +- _server/CodeMirror/defs.js | 6 +- _server/table/events.comment.js | 5 +- _server/table/functions.comment.js | 6 ++ libs/control.js | 5 + libs/maps.js | 2 +- migration.html | 8 +- project/events.js | 111 ------------------- project/functions.js | 165 +++++++++++++++++++---------- project/items.js | 8 +- project/maps.js | 6 +- runtime.d.ts | 9 +- 14 files changed, 153 insertions(+), 188 deletions(-) diff --git a/_docs/api.md b/_docs/api.md index a82a7d81..b75d25d1 100644 --- a/_docs/api.md +++ b/_docs/api.md @@ -989,7 +989,7 @@ openKeyBoard: fn(fromUserAction?: bool) insertCommonEvent: fn(name?: string, args?: [?], x?: number, y?: number, callback?: fn(), addToLast?: bool) 插入一个公共事件 -例如:core.insertCommonEvent('毒衰咒处理', [0]); +例如:core.insertCommonEvent('加点事件', [3]); name: 公共事件名;如果公共事件不存在则直接忽略 args: 参数列表,为一个数组,将依次赋值给 flag:arg1, flag:arg2, ... x: 新的当前点横坐标,可选 diff --git a/_docs/element.md b/_docs/element.md index 59943e26..7801321e 100644 --- a/_docs/element.md +++ b/_docs/element.md @@ -97,7 +97,7 @@ * 数值提升项:若干个键值对,表示该装备增加属性的常数值(支持负数)。7个常用属性可以通过下拉框选取,自定义的新属性也可以手动输入。 * 百分比提升项:若干个键值对,表示该装备增加属性的百分比(支持负数,如填-10就表示减少10%),修改方法同上。 * 装备对属性的影响原理:在穿脱装备时,会根据数值提升项和百分比提升项,分别调用`core.status.hero.xxx += yyy`和`core.addBuff('xxx', yyy)`这两个API(衰弱的附加和解除同理),而状态栏的显示值和战斗中的使用值则是`core.getStatus('xxx')`和buff值相乘再向下取整所得。 - * PC端按下Ctrl+0~9可以保存当前套装,Alt+0~9快速更换套装。 + * PC端可以按Alt+0~9快速更换套装。 道具相关API请阅读[API列表](api)。 @@ -110,7 +110,7 @@ 5. **特殊属性:**一个由正整数组成的一维数组,您可以点击“勾选框编辑”按钮来修改它。所有特殊属性都定义在“脚本编辑——怪物特殊属性”,您可以在那里追加新的。它们大体分为四类: 1. 手册中属性值的修正:(按照结算顺序)模仿、坚固、光环,修正后的属性也将被用于战斗,详见“脚本编辑——怪物真实属性”。 2. 战损的修正:这类最多,先攻、魔攻、连击(次数为n)、破甲(比例为defValue)、反击(比例为atkValue,回合数为勇士的攻击回合数)、净化(倍数为n,1表示单纯无视护盾)、吸血(比例为value,是否加到自身为add)、仇恨(每场战斗的仇恨增值由全塔属性指定)、无敌、固伤(数值为damage)、支援。其中又以仇恨和固伤不能被护盾直接抵消而和无敌较为特殊,详见“脚本编辑——战斗伤害信息”。 - 3. 战后的影响:中毒、衰弱、诅咒、仇恨(的累加和减半)、自爆、退化(扣减值分别为atkValue和defValue)、重生,详见“脚本编辑——战后脚本”和“公共事件——毒衰咒处理”。 + 3. 战后的影响:中毒、衰弱、诅咒、仇恨(的累加和减半)、自爆、退化(扣减值分别为atkValue和defValue)、重生,详见“脚本编辑——战后脚本”和“脚本编辑——毒衰咒”。 4. 阻激夹域捕捉:即对主角行走的妨害,详见“脚本编辑——阻激夹域伤害”,该函数也负责了血网(图块ID为lavaNet,请勿修改)的伤害。 阻激域的伤害都为value且在夹击之前结算,领域的形状和半径与光环一致。 @@ -286,7 +286,7 @@ 这个类型的数值会保存在core.values中,可以直接在游戏中修改。 1. **血网伤害和中毒伤害:**如题,如果不想用常数,请修改“脚本编辑”的“阻激夹域伤害”和“每步后操作”。 -2. **衰弱效果:**填小于1的正数代表扣减的比例,否则为扣减的常数。扣减和恢复的原理和装备相同,详见“公共事件——毒衰咒处理”、解衰药水和万能药水的使用效果。 +2. **衰弱效果:**填小于1的正数代表扣减的比例,否则为扣减的常数。扣减和恢复的原理和装备相同,详见“脚本编辑——毒衰咒”、解衰药水和万能药水的使用效果。 3. **三种宝石和四种血瓶的值:**如题,此值为基础值。实际效果还需乘以楼层属性最下面的“宝石血瓶效果”(限即捡即用类,详见这七种道具的属性。此外,B键数据统计是按照此值乘以“宝石血瓶效果”统计的,与道具的实际效果无关,请自行注意。 4. **反击、破甲、净化比例:**如果反击、破甲、净化怪物没有指定atkValue、defValue和n,就会用这三个值。请注意反击的总回合数是勇士的攻击回合数,净化比例填1表示单纯无视护盾。 5. **仇恨增值:**每进行一场战斗,core.status.hero.flags.hatred的增加量。如果不想用常数,请修改“脚本编辑——战后脚本”。 diff --git a/_docs/event.md b/_docs/event.md index 4098e86a..f481cda4 100644 --- a/_docs/event.md +++ b/_docs/event.md @@ -101,7 +101,7 @@ ## 公共事件(逗号键) -有几个事件,如战后加点、毒衰咒处理、回收钥匙商店,会在战后脚本或全局商店等处频繁用到。于是它们被整理成了公共事件,您也可以追加自己的。 +有几个事件,如战后加点、回收钥匙商店,会在战后脚本或全局商店等处频繁用到。于是它们被整理成了公共事件,您也可以追加自己的。 公共事件在内容上和其他事件并无不同,只是在插入公共事件时(如`core.insertCommonEvent("回收钥匙商店")`)可以提供一个`参数列表`。 diff --git a/_server/CodeMirror/defs.js b/_server/CodeMirror/defs.js index 96ad8afc..de2c74fb 100644 --- a/_server/CodeMirror/defs.js +++ b/_server/CodeMirror/defs.js @@ -2242,6 +2242,10 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!doc": "读取主角某个属性的百分比修正倍率,初始值为1
例如:core.getBuff('atk'); // 主角当前能发挥出多大比例的攻击力
name: 属性的英文名", "!type": "fn(name: string) -> number" }, + "triggerDebuff": { + "!doc": "获得或移除毒衰咒效果
action: 要获得还是移除,'get'为获得,'remove'为移除
type: 获得或移除的内容(poison/weak/curse),可以为字符串或数组", + "!type": "fn(action: string, type: string|[string])" + }, "setToolbarButton": { "!doc": "改变工具栏为按钮1-8", "!type": "fn(useButton?: bool)" @@ -3831,7 +3835,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(fromUserAction?: bool)" }, "insertCommonEvent": { - "!doc": "插入一个公共事件
例如:core.insertCommonEvent('毒衰咒处理', [0]);
name: 公共事件名;如果公共事件不存在则直接忽略
args: 参数列表,为一个数组,将依次赋值给 flag:arg1, flag:arg2, ...
x: 新的当前点横坐标,可选
y: 新的当前点纵坐标,可选
callback: 新的回调函数,可选
addToLast: 插入的位置,true表示插入到末尾,否则插入到开头", + "!doc": "插入一个公共事件
例如:core.insertCommonEvent('加点事件', [3]);
name: 公共事件名;如果公共事件不存在则直接忽略
args: 参数列表,为一个数组,将依次赋值给 flag:arg1, flag:arg2, ...
x: 新的当前点横坐标,可选
y: 新的当前点纵坐标,可选
callback: 新的回调函数,可选
addToLast: 插入的位置,true表示插入到末尾,否则插入到开头", "!type": "fn(name?: string, args?: [?], x?: number, y?: number, callback?: fn(), addToLast?: bool)" }, "hideImage": { diff --git a/_server/table/events.comment.js b/_server/table/events.comment.js index b911b38a..63b58f07 100644 --- a/_server/table/events.comment.js +++ b/_server/table/events.comment.js @@ -19,12 +19,11 @@ var events_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_event": "commonEvent", "_data": "加点事件" }, - "毒衰咒处理": { + "回收钥匙商店": { "_leaf": true, "_type": "event", - "_range": "thiseval instanceof Array", "_event": "commonEvent", - "_data": "毒衰咒处理" + "_data": "回收钥匙商店" }, } if (obj[key]) return obj[key]; diff --git a/_server/table/functions.comment.js b/_server/table/functions.comment.js index 75f29375..366039b2 100644 --- a/_server/table/functions.comment.js +++ b/_server/table/functions.comment.js @@ -135,6 +135,12 @@ var functions_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_lint": true, "_data": "读档操作" }, + "triggerDebuff": { + "_leaf": true, + "_type": "textarea", + "_lint": true, + "_data": "毒衰咒处理" + }, "updateStatusBar": { "_leaf": true, "_type": "textarea", diff --git a/libs/control.js b/libs/control.js index 26517b0b..c6f4e70f 100644 --- a/libs/control.js +++ b/libs/control.js @@ -2100,6 +2100,11 @@ control.prototype.getBuff = function (name) { return core.getFlag('__'+name+'_buff__', 1); } +////// 获得或移除毒衰咒效果 ////// +control.prototype.triggerDebuff = function (action, type) { + return this.controldata.triggerDebuff(action, type); +} + ////// 设置勇士的位置 ////// control.prototype.setHeroLoc = function (name, value, noGather) { if (!core.status.hero) return; diff --git a/libs/maps.js b/libs/maps.js index a5a8e2d9..0038f666 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -735,7 +735,7 @@ maps.prototype._automaticRoute_deepAdd = function (x, y) { // 绕过亮灯 if (id == "light") deepAdd += 100; // 绕过路障 - if (id.endsWith("Net")) deepAdd += 100; + if (id.endsWith("Net") && !core.hasFlag(id.substring(0, id.length - 3))) deepAdd += 100; // 绕过血瓶和绿宝石 if (core.hasFlag('__potionNoRouting__') && (id.endsWith("Potion") || id == 'greenGem')) deepAdd += 100; // 绕过传送点 diff --git a/migration.html b/migration.html index a13d5bcb..5f0681d8 100644 --- a/migration.html +++ b/migration.html @@ -550,10 +550,10 @@ function action_maps(callback) { "9": {"cls":"terrains","id":"pinkShopLeft"}, "10": {"cls":"terrains","id":"pinkShopRight"}, "11": {"cls":"animates","id":"lavaNet","canPass":true,"trigger":"null","script":"(function () {\n\t// 血网的伤害效果移动到 checkBlock 中处理\n\n\t// 如果要做一次性血网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})();","name":"血网"}, - "12": {"cls":"animates","id":"poisonNet","canPass":true,"trigger":"null","script":"(function () {\n\t// 直接插入公共事件进行毒处理\n\tif (!core.hasItem('amulet')) {\n\t\tcore.insertAction({ \"type\": \"insert\", \"name\": \"毒衰咒处理\", \"args\": [0] });\n\t}\n\n\t// 如果要做一次性毒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"毒网"}, - "13": {"cls":"animates","id":"weakNet","canPass":true,"trigger":"null","script":"(function () {\n\t// 直接插入公共事件进行衰处理\n\tif (!core.hasItem('amulet')) {\n\t\tcore.insertAction({ \"type\": \"insert\", \"name\": \"毒衰咒处理\", \"args\": [1] });\n\t}\n\n\t// 如果要做一次性衰网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"衰网"}, - "14": {"cls":"animates","id":"curseNet","canPass":true,"trigger":"null","script":"(function () {\n\t// 直接插入公共事件进行咒处理\n\tif (!core.hasItem('amulet')) {\n\t\tcore.insertAction({ \"type\": \"insert\", \"name\": \"毒衰咒处理\", \"args\": [2] });\n\t}\n\n\t// 如果要做一次性咒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"咒网"}, - "54": {"cls":"items","id":"freezeBadge"}, + "12": {"cls":"animates","id":"poisonNet","canPass":true,"trigger":"null","script":"(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'poison');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性毒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"毒网"}, + "13": {"cls":"animates","id":"weakNet","canPass":true,"trigger":"null","script":"(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'weak');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性衰网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"衰网"}, + "14": {"cls":"animates","id":"curseNet","canPass":true,"trigger":"null","script":"(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'curse');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性咒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"咒网"}, + "54": {"cls":"items","id":"freezeBadge"}, "81": {"cls":"animates","id":"yellowDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{"yellowKey":1}},"name":"黄门"}, "82": {"cls":"animates","id":"blueDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{"blueKey":1}},"name":"蓝门"}, "83": {"cls":"animates","id":"redDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{"redKey":1}},"name":"红门"}, diff --git a/project/events.js b/project/events.js index 8847951f..a78e0e52 100644 --- a/project/events.js +++ b/project/events.js @@ -45,117 +45,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = ] } ], - "毒衰咒处理": [ - { - "type": "comment", - "text": "获得毒衰咒效果,flag:arg1 为要获得的类型" - }, - { - "type": "switch", - "condition": "flag:arg1", - "caseList": [ - { - "case": "0", - "action": [ - { - "type": "comment", - "text": "获得毒效果" - }, - { - "type": "if", - "condition": "!flag:poison", - "true": [ - { - "type": "setValue", - "name": "flag:poison", - "value": "true" - } - ], - "false": [] - } - ] - }, - { - "case": "1", - "action": [ - { - "type": "comment", - "text": "获得衰效果" - }, - { - "type": "if", - "condition": "!flag:weak", - "true": [ - { - "type": "setValue", - "name": "flag:weak", - "value": "true" - }, - { - "type": "if", - "condition": "core.values.weakValue>=1", - "true": [ - { - "type": "comment", - "text": ">=1:直接扣数值" - }, - { - "type": "setValue", - "name": "status:atk", - "operator": "-=", - "value": "core.values.weakValue" - }, - { - "type": "setValue", - "name": "status:def", - "operator": "-=", - "value": "core.values.weakValue" - } - ], - "false": [ - { - "type": "comment", - "text": "<1:扣比例" - }, - { - "type": "function", - "function": "function(){\ncore.addBuff('atk', -core.values.weakValue);\n}" - }, - { - "type": "function", - "function": "function(){\ncore.addBuff('def', -core.values.weakValue);\n}" - } - ] - } - ], - "false": [] - } - ] - }, - { - "case": "2", - "action": [ - { - "type": "comment", - "text": "获得咒效果" - }, - { - "type": "if", - "condition": "!flag:curse", - "true": [ - { - "type": "setValue", - "name": "flag:curse", - "value": "true" - } - ], - "false": [] - } - ] - } - ] - } - ], "回收钥匙商店": [ { "type": "comment", diff --git a/project/functions.js b/project/functions.js index 5db0a2c1..759eb1d5 100644 --- a/project/functions.js +++ b/project/functions.js @@ -80,14 +80,14 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = }) }); }, - "lose": function(reason) { + "lose": function (reason) { // 游戏失败事件 core.ui.closePanel(); var replaying = core.isReplaying(); core.stopReplay(); - core.waitHeroToStop(function() { + core.waitHeroToStop(function () { core.drawText([ - "\t["+(reason||"结局1")+"]你死了。\n如题。" + "\t[" + (reason || "结局1") + "]你死了。\n如题。" ], function () { core.events.gameOver(null, replaying); }); @@ -117,7 +117,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.status.hero.loc = heroLoc; // 检查重生怪并重置 if (!fromLoad) { - core.extractBlocks(floorId); + core.extractBlocks(floorId); core.status.maps[floorId].blocks.forEach(function (block) { if (block.disable && core.enemys.hasSpecial(block.event.id, 23)) { block.disable = false; @@ -196,7 +196,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = loc = core.getFlag("__leaveLoc__", {})[toId] || null; } if (core.status.maps[toId].flyPoint != null && core.status.maps[toId].flyPoint.length == 2) { - loc = {x: core.status.maps[toId].flyPoint[0], y: core.status.maps[toId].flyPoint[1]}; + loc = { x: core.status.maps[toId].flyPoint[0], y: core.status.maps[toId].flyPoint[1] }; } if (loc == null) { // 获得两个楼层的索引,以决定是上楼梯还是下楼梯 @@ -311,8 +311,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.status.hero.statistics.exp += exp; var hint = "打败 " + enemy.name; - if (core.flags.statusBarItems.indexOf('enableMoney')>=0) hint += ",金币+" + money; - if (core.flags.statusBarItems.indexOf('enableExp')>=0) hint += ",经验+" + exp; + if (core.flags.statusBarItems.indexOf('enableMoney') >= 0) hint += ",金币+" + money; + if (core.flags.statusBarItems.indexOf('enableExp') >= 0) hint += ",经验+" + exp; core.drawTip(hint, enemy.id); // 事件的处理 @@ -321,15 +321,15 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = var special = enemy.special; // 中毒 if (core.enemys.hasSpecial(special, 12)) { - core.push(todo, [{ "type": "insert", "name": "毒衰咒处理", "args": [0] }]); + core.triggerDebuff('get', 'poison'); } // 衰弱 if (core.enemys.hasSpecial(special, 13)) { - core.push(todo, [{ "type": "insert", "name": "毒衰咒处理", "args": [1] }]); + core.triggerDebuff('get', 'weak'); } // 诅咒 if (core.enemys.hasSpecial(special, 14)) { - core.push(todo, [{ "type": "insert", "name": "毒衰咒处理", "args": [2] }]); + core.triggerDebuff('get', 'curse'); } // 仇恨属性 if (core.enemys.hasSpecial(special, 17)) { @@ -351,7 +351,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.setFlag('hatred', core.getFlag('hatred', 0) + core.values.hatred); // 战后的技能处理,比如扣除魔力值 - if (core.flags.statusBarItems.indexOf('enableSkill') >=0 ) { + if (core.flags.statusBarItems.indexOf('enableSkill') >= 0) { // 检测当前开启的技能类型 var skill = core.getFlag('skill', 0); if (skill == 1) { // 技能1:二倍斩 @@ -363,7 +363,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } // 如果有加点 - var point = guards.reduce(function (curr, g) { + var point = guards.reduce(function (curr, g) { return curr + core.material.enemys[g[2]].point; }, enemy.point) || 0; if (core.flags.enableAddPoint && point > 0) { @@ -891,20 +891,20 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.useItem('skill1', true); } break; - // 在这里可以任意新增或编辑已有的快捷键内容 - /* - case 0: // 使用该按键的keyCode - // 还可以再判定altKey是否被按下,即 if (altKey) { ... + // 在这里可以任意新增或编辑已有的快捷键内容 + /* + case 0: // 使用该按键的keyCode + // 还可以再判定altKey是否被按下,即 if (altKey) { ... - // ... 在这里写你要执行脚本 - // **强烈建议所有新增的自定义快捷键均能给个对应的道具可点击,以方便手机端的行为** - if (core.hasItem('...')) { - core.status.route.push("key:0"); - core.useItem('...', true); // 增加true代表该使用道具不计入录像 - } + // ... 在这里写你要执行脚本 + // **强烈建议所有新增的自定义快捷键均能给个对应的道具可点击,以方便手机端的行为** + if (core.hasItem('...')) { + core.status.route.push("key:0"); + core.useItem('...', true); // 增加true代表该使用道具不计入录像 + } - break; - */ + break; + */ } }, @@ -986,9 +986,61 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.playBgm(core.getFlag("__bgm__")); } - core.removeFlag('__fromLoad__'); + core.removeFlag('__fromLoad__'); if (callback) callback(); }); +}, + "triggerDebuff": function (action, type) { + // 毒衰咒效果的获得与解除 + // action:获得还是解除;'get'表示获得,'remove'表示解除 + // type:一个数组表示获得了哪些毒衰咒效果;poison, weak,curse + if (!(type instanceof Array)) type = [type]; + + if (action == 'get') { + if (core.inArray(type, 'poison') && !core.hasFlag("poison")) { + // 获得毒效果 + core.setFlag('poison', true); + } + if (core.inArray(type, 'weak') && !core.hasFlag('weak')) { + // 获得衰效果 + core.setFlag('weak', true); + if (core.values.weakValue >= 1) { + // >=1,直接扣数值 + core.addStatus('atk', -core.values.weakValue); + core.addStatus('def', -core.values.weakValue); + } else { + // <1,扣比例 + core.addBuff('atk', -core.values.weakValue); + core.addBuff('def', -core.values.weakValue); + } + } + if (core.inArray(type, 'curse') && !core.hasFlag('curse')) { + // 获得咒效果 + core.setFlag('curse', true); + } + } else if (action == 'remove') { + if (core.inArray(type, "poison") && core.hasFlag("poison")) { + // 移除毒效果 + core.setFlag("poison", false); + } + if (core.inArray(type, "weak") && core.hasFlag("weak")) { + // 移除衰效果 + core.setFlag("weak", false); + if (core.values.weakValue >= 1) { + // >=1,直接扣数值 + core.addStatus('atk', core.values.weakValue); + core.addStatus('def', core.values.weakValue); + } else { + // <1,扣比例 + core.addBuff('atk', core.values.weakValue); + core.addBuff('def', core.values.weakValue); + } + } + if (core.inArray(type, "curse") && core.hasFlag("curse")) { + // 移除咒效果 + core.setFlag("curse", false); + } + } }, "updateStatusBar": function () { // 更新状态栏 @@ -1024,8 +1076,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (core.status.hero.manamax != null && core.getRealStatus('manamax') >= 0) { core.status.hero.mana = Math.min(core.status.hero.mana, core.getRealStatus('manamax')); core.setStatusBarInnerHTML('mana', core.status.hero.mana + "/" + core.getRealStatus('manamax')); - } - else { + } else { core.setStatusBarInnerHTML("mana", core.status.hero.mana); } // 设置技能栏 @@ -1038,9 +1089,9 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 如果是自定义添加的状态栏,也需要在这里进行设置显示的数值 // 进阶 - if (core.flags.statusBarItems.indexOf('enableLevelUp')>=0 && core.status.hero.lv < core.firstData.levelUp.length) { + if (core.flags.statusBarItems.indexOf('enableLevelUp') >= 0 && core.status.hero.lv < core.firstData.levelUp.length) { var need = core.calValue(core.firstData.levelUp[core.status.hero.lv].need); - if (core.flags.statusBarItems.indexOf('levelUpLeftMode')>=0) + if (core.flags.statusBarItems.indexOf('levelUpLeftMode') >= 0) core.setStatusBarInnerHTML('up', core.formatBigNumber(need - core.getStatus('exp')) || ""); else core.setStatusBarInnerHTML('up', core.formatBigNumber(need) || ""); @@ -1144,7 +1195,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = var rdir = core.turnDirection(":back", dir); // 检查下一个点是否存在事件(从而判定是否移动) - var rnx = x + core.utils.scan[rdir].x, + var rnx = x + core.utils.scan[rdir].x, rny = y + core.utils.scan[rdir].y; if (core.canMoveHero(x, y, rdir, floorId) && core.getBlock(rnx, rny, floorId) == null) { repulse[currloc] = (repulse[currloc] || []).concat([ @@ -1286,32 +1337,33 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 从v2.7开始,每一步行走不会再刷新状态栏。 // 如果有特殊要求(如每走一步都加buff之类),可手动取消注释下面这一句: // core.updateStatusBar(true); - + // 检查自动事件 core.checkAutoEvents(); // ------ 检查目标点事件 ------ // // 无事件的道具(如血瓶)需要优先于阻激夹域判定 - var nowx = core.getHeroLoc('x'), nowy = core.getHeroLoc('y'); - var block = core.getBlock(nowx, nowy); - var hasTrigger = false; - if (block!=null && block.block.event.trigger=='getItem' && - !core.floors[core.status.floorId].afterGetItem[nowx+","+nowy]) { - hasTrigger = true; - core.trigger(nowx, nowy, callback); - } - // 执行目标点的阻激夹域事件 - core.checkBlock(); + var nowx = core.getHeroLoc('x'), + nowy = core.getHeroLoc('y'); + var block = core.getBlock(nowx, nowy); + var hasTrigger = false; + if (block != null && block.block.event.trigger == 'getItem' && + !core.floors[core.status.floorId].afterGetItem[nowx + "," + nowy]) { + hasTrigger = true; + core.trigger(nowx, nowy, callback); + } + // 执行目标点的阻激夹域事件 + core.checkBlock(); - // 执行目标点的script和事件 - if (!hasTrigger) - core.trigger(nowx, nowy, callback); + // 执行目标点的script和事件 + if (!hasTrigger) + core.trigger(nowx, nowy, callback); - // 检查该点是否是滑冰 - if (core.onSki()) { + // 检查该点是否是滑冰 + if (core.onSki()) { // 延迟到事件最后执行,因为这之前可能有阻激夹域动画 - core.insertAction({"type": "moveAction"}, null, null, null, true); - } + core.insertAction({ "type": "moveAction" }, null, null, null, true); + } // ------ 检查目标点事件 END ------ // @@ -1443,7 +1495,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = }, "drawStatistics": function () { // 浏览地图时参与的统计项目 - + return [ 'yellowDoor', 'blueDoor', 'redDoor', 'greenDoor', 'steelDoor', 'yellowKey', 'blueKey', 'redKey', 'greenKey', 'steelKey', @@ -1457,13 +1509,16 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 在这里可以增加新的ID来进行统计个数,只能增加道具ID ]; }, - "drawAbout": function() { + "drawAbout": function () { // 绘制“关于”界面 core.ui.closePanel(); core.lockControl(); core.status.event.id = 'about'; - var left = 48, top = 36, right = core.__PIXELS__ - 2 * left, bottom = core.__PIXELS__ - 2 * top; + var left = 48, + top = 36, + right = core.__PIXELS__ - 2 * left, + bottom = core.__PIXELS__ - 2 * top; core.setAlpha('ui', 0.85); core.fillRect('ui', left, top, right, bottom, '#000000'); @@ -1474,11 +1529,11 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 名称 core.setTextAlign('ui', 'left'); - var globalFont = (core.status.globalAttribute||core.initStatus.globalAttribute).font; - core.fillText('ui', "HTML5 魔塔样板", text_start, top+35, "#FFD700", "bold 22px "+globalFont); - core.fillText('ui', "版本: "+main.__VERSION__, text_start, top + 80, "#FFFFFF", "bold 17px "+globalFont); + var globalFont = (core.status.globalAttribute || core.initStatus.globalAttribute).font; + core.fillText('ui', "HTML5 魔塔样板", text_start, top + 35, "#FFD700", "bold 22px " + globalFont); + core.fillText('ui', "版本: " + main.__VERSION__, text_start, top + 80, "#FFFFFF", "bold 17px " + globalFont); core.fillText('ui', "作者: 艾之葵", text_start, top + 112); - core.fillText('ui', 'HTML5魔塔交流群:539113091', text_start, top+112+32); + core.fillText('ui', 'HTML5魔塔交流群:539113091', text_start, top + 112 + 32); // TODO: 写自己的“关于”页面,每次增加32像素即可 } } diff --git a/project/items.js b/project/items.js index 60476be5..d019c23e 100644 --- a/project/items.js +++ b/project/items.js @@ -423,28 +423,28 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "tools", "name": "解毒药水", "text": "可以解除中毒状态", - "useItemEffect": "core.removeFlag('poison');", + "useItemEffect": "core.triggerDebuff('remove', 'poison');", "canUseItemEffect": "core.hasFlag('poison');" }, "weakWine": { "cls": "tools", "name": "解衰药水", "text": "可以解除衰弱状态", - "useItemEffect": "core.removeFlag('weak');\nif (core.values.weakValue>=1) { // >=1:直接扣数值\n\tcore.status.hero.atk += core.values.weakValue;\n\tcore.status.hero.def += core.values.weakValue;\n}\nelse { // <1:扣比例\n\tcore.addBuff(\"atk\", core.values.weakValue);\n\tcore.addBuff(\"def\", core.values.weakValue);\n}", + "useItemEffect": "core.triggerDebuff('remove', 'weak');", "canUseItemEffect": "core.hasFlag('weak');" }, "curseWine": { "cls": "tools", "name": "解咒药水", "text": "可以解除诅咒状态", - "useItemEffect": "core.removeFlag('curse');", + "useItemEffect": "core.triggerDebuff('remove', 'curse');", "canUseItemEffect": "core.hasFlag('curse');" }, "superWine": { "cls": "tools", "name": "万能药水", "text": "可以解除所有不良状态", - "useItemEffect": "core.removeFlag('poison');\nif (core.hasFlag('weak')) {\n\tcore.removeFlag('weak');\n\tif (core.values.weakValue>=1) { // >=1:直接扣数值\n\t\tcore.status.hero.atk += core.values.weakValue;\n\t\tcore.status.hero.def += core.values.weakValue;\n\t}\n\telse { // <1:扣比例\n\t\tcore.addBuff(\"atk\", core.values.weakValue);\n\t\tcore.addBuff(\"def\", core.values.weakValue);\n\t}\n}\ncore.removeFlag('curse');", + "useItemEffect": "core.triggerDebuff('remove', ['poison', 'weak', 'curse']);", "canUseItemEffect": "(function() {\n\treturn core.hasFlag('poison') || core.hasFlag('weak') || core.hasFlag('curse');\n})();" }, "hammer": { diff --git a/project/maps.js b/project/maps.js index 9e7b2037..25dc6cf2 100644 --- a/project/maps.js +++ b/project/maps.js @@ -11,9 +11,9 @@ var maps_90f36752_8815_4be8_b32b_d7fad1d0542e = "9": {"cls":"terrains","id":"pinkShopLeft"}, "10": {"cls":"terrains","id":"pinkShopRight"}, "11": {"cls":"animates","id":"lavaNet","canPass":true,"trigger":"null","script":"(function () {\n\t// 血网的伤害效果移动到 checkBlock 中处理\n\n\t// 如果要做一次性血网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})();","name":"血网"}, - "12": {"cls":"animates","id":"poisonNet","canPass":true,"trigger":"null","script":"(function () {\n\t// 直接插入公共事件进行毒处理\n\tif (!core.hasItem('amulet')) {\n\t\tcore.insertAction({ \"type\": \"insert\", \"name\": \"毒衰咒处理\", \"args\": [0] });\n\t}\n\n\t// 如果要做一次性毒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"毒网"}, - "13": {"cls":"animates","id":"weakNet","canPass":true,"trigger":"null","script":"(function () {\n\t// 直接插入公共事件进行衰处理\n\tif (!core.hasItem('amulet')) {\n\t\tcore.insertAction({ \"type\": \"insert\", \"name\": \"毒衰咒处理\", \"args\": [1] });\n\t}\n\n\t// 如果要做一次性衰网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"衰网"}, - "14": {"cls":"animates","id":"curseNet","canPass":true,"trigger":"null","script":"(function () {\n\t// 直接插入公共事件进行咒处理\n\tif (!core.hasItem('amulet')) {\n\t\tcore.insertAction({ \"type\": \"insert\", \"name\": \"毒衰咒处理\", \"args\": [2] });\n\t}\n\n\t// 如果要做一次性咒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"咒网"}, + "12": {"cls":"animates","id":"poisonNet","canPass":true,"trigger":"null","script":"(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'poison');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性毒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"毒网"}, + "13": {"cls":"animates","id":"weakNet","canPass":true,"trigger":"null","script":"(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'weak');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性衰网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"衰网"}, + "14": {"cls":"animates","id":"curseNet","canPass":true,"trigger":"null","script":"(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'curse');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性咒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"咒网"}, "15": {"cls":"animates","id":"blueWater"}, "16": {"cls":"animates","id":"water"}, "20": {"cls":"autotile","id":"autotile"}, diff --git a/runtime.d.ts b/runtime.d.ts index 7f359345..57781940 100644 --- a/runtime.d.ts +++ b/runtime.d.ts @@ -455,6 +455,13 @@ declare class control { * @param name 属性的英文名 */ getBuff(name: string): number + + /** + * 获得或移除毒衰咒效果 + * @param action 获得还是移除,'get'为获得,'remove'为移除 + * @param type 要获得或移除的毒衰咒效果 + */ + triggerDebuff(action: string, type: string|string[]): void /** * 设置勇士位置 @@ -1108,7 +1115,7 @@ declare class events { /** * 插入一个公共事件 - * @example core.insertCommonEvent('毒衰咒处理', [0]); + * @example core.insertCommonEvent('加点事件', [3]); * @param name 公共事件名;如果公共事件不存在则直接忽略 * @param args 参数列表,为一个数组,将依次赋值给 flag:arg1, flag:arg2, ... * @param x 新的当前点横坐标,可选