diff --git a/_server/editor_multi.js b/_server/editor_multi.js index 01dd8e05..48f804ae 100644 --- a/_server/editor_multi.js +++ b/_server/editor_multi.js @@ -201,8 +201,13 @@ editor_multi = function () { } }); + var ctrlRelease = new Date(); codeEditor.on("keyup", function (cm, event) { - if (codeEditor.getOption("autocomplete") && !event.ctrlKey && ( + var date = new Date(); + if (event.keyCode == 17 || event.keyCode == 91) { // ctrl, cmd + ctrlRelease = date; + } + else if (codeEditor.getOption("autocomplete") && !event.ctrlKey && date - ctrlRelease >= 1000 && ( (event.keyCode >= 65 && event.keyCode <= 90) || (!event.shiftKey && event.keyCode == 190) || (event.shiftKey && event.keyCode == 189))) { try { diff --git a/libs/icons.js b/libs/icons.js index 375cf9e8..f9eef5ff 100644 --- a/libs/icons.js +++ b/libs/icons.js @@ -64,7 +64,7 @@ icons.prototype.getTilesetOffset = function (id) { for (var i in core.tilesets) { var imgName = core.tilesets[i]; var img = core.material.images.tilesets[imgName]; - var width = Math.floor(img.width / 32), height = Math.floor(img.height / 32); + var width = Math.floor(parseInt(img.getAttribute('_width')) / 32), height = Math.floor(parseInt(img.getAttribute('_height')) / 32); if (id >= startOffset && id < startOffset + width * height) { var x = (id - startOffset) % width, y = parseInt((id - startOffset) / width); return {"image": imgName, "x": x, "y": y}; diff --git a/libs/loader.js b/libs/loader.js index 5e603f2f..1f219012 100644 --- a/libs/loader.js +++ b/libs/loader.js @@ -251,6 +251,8 @@ loader.prototype.loadImage = function (dir, imgName, callback) { name = name + ".png"; var image = new Image(); image.onload = function () { + image.setAttribute('_width', image.width); + image.setAttribute('_height', image.height); callback(imgName, image); } image.onerror = function () { diff --git a/project/functions.js b/project/functions.js index 3fd16f03..50a78e42 100644 --- a/project/functions.js +++ b/project/functions.js @@ -253,53 +253,64 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 战斗结束后触发的事件 var enemy = core.material.enemys[enemyId]; + var special = enemy.special; // 播放战斗音效和动画 - var equipAnimate = 'hand', - equipId = (core.status.hero.equipment || [])[0]; + // 默认播放的动画;你也可以使用 + var animate = 'hand'; // 默认动画 + // 检查当前装备是否存在攻击动画 + var equipId = core.getEquip(0); if (equipId && (core.material.items[equipId].equip || {}).animate) - equipAnimate = core.material.items[equipId].equip.animate; - // 检查equipAnimate是否存在SE,如果不存在则使用默认音效 - if (!(core.material.animates[equipAnimate] || {}).se) + animate = core.material.items[equipId].equip.animate; + // 你也可以在这里根据自己的需要,比如enemyId或special或flag来修改播放的动画效果 + // if (enemyId == '...') animate = '...'; + + // 检查该动画是否存在SE,如果不存在则使用默认音效 + if (!(core.material.animates[animate] || {}).se) core.playSound('attack.mp3'); - // 强制战斗的战斗动画 + + // 播放动画;如果不存在坐标(强制战斗)则播放到勇士自身 if (x != null && y != null) - core.drawAnimate(equipAnimate, x, y); + core.drawAnimate(animate, x, y); else - core.drawHeroAnimate(equipAnimate); + core.drawHeroAnimate(animate); - var damage = core.enemys.getDamage(enemyId, x, y); - if (damage == null) damage = core.status.hero.hp + 1; - - // 扣减体力值 - core.status.hero.hp -= damage; - - // 记录 - core.status.hero.statistics.battleDamage += damage; - core.status.hero.statistics.battle++; - - if (core.status.hero.hp <= 0) { + // 获得战斗伤害信息 + var damageInfo = core.getDamageInfo(enemyId, null, x, y) || {}; + // 战斗伤害 + var damage = damageInfo.damage; + // 当前战斗回合数,可用于战后所需的判定 + var turn = damageInfo.turn; + // 判定是否致死 + if (damage == null || damage >= core.status.hero.hp) { core.status.hero.hp = 0; core.updateStatusBar(); core.events.lose('战斗失败'); return; } - var guards = []; // 支援 + // 扣减体力值并记录统计数据 + core.status.hero.hp -= damage; + core.status.hero.statistics.battleDamage += damage; + core.status.hero.statistics.battle++; + + // 计算当前怪物的支援怪物 + var guards = []; if (x != null && y != null) { guards = core.getFlag("__guards__" + x + "_" + y, []); core.removeFlag("__guards__" + x + "_" + y); } - // 获得金币和经验 + // 获得金币 var money = guards.reduce(function (curr, g) { return curr + core.material.enemys[g[2]].money; }, enemy.money); - if (core.hasItem('coin')) money *= 2; - if (core.hasFlag('curse')) money = 0; + if (core.hasItem('coin')) money *= 2; // 幸运金币:双倍 + if (core.hasFlag('curse')) money = 0; // 诅咒效果 core.status.hero.money += money; core.status.hero.statistics.money += money; + // 获得经验 var exp = guards.reduce(function (curr, g) { return curr + core.material.enemys[g[2]].exp; }, enemy.exp); @@ -312,10 +323,6 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (core.flags.statusBarItems.indexOf('enableExp') >= 0) hint += ",经验+" + exp; core.drawTip(hint, enemy.id); - // 事件的处理 - var todo = []; - - var special = enemy.special; // 中毒 if (core.enemys.hasSpecial(special, 12)) { core.triggerDebuff('get', 'poison'); @@ -328,7 +335,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (core.enemys.hasSpecial(special, 14)) { core.triggerDebuff('get', 'curse'); } - // 仇恨属性 + // 仇恨怪物将仇恨值减半 if (core.enemys.hasSpecial(special, 17)) { core.setFlag('hatred', Math.floor(core.getFlag('hatred', 0) / 2)); } @@ -359,7 +366,11 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.setFlag('skillName', '无'); } - // 如果有加点 + + // 事件的处理 + var todo = []; + + // 加点事件 var point = guards.reduce(function (curr, g) { return curr + core.material.enemys[g[2]].point; }, enemy.point) || 0; @@ -367,7 +378,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.push(todo, [{ "type": "insert", "name": "加点事件", "args": [point] }]); } - // 如果该点存在事件 -- V2.5.4 以后阻击怪也可以有战后事件了 + // 战后事件 if (core.status.floorId != null) { core.push(todo, core.floors[core.status.floorId].afterBattle[x + "," + y]); } @@ -383,8 +394,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 如果事件不为空,将其插入 if (todo.length > 0) core.insertAction(todo, x, y); - - // 因为removeBlock和hideBlock都会刷新状态栏,因此移动到这里并保证刷新只执行一次,以提升效率 + + // 因为removeBlock和hideBlock都会刷新状态栏,因此将删除部分移动到这里并保证刷新只执行一次,以提升效率 if (core.getBlock(x, y) != null) { // 检查是否是重生怪物;如果是则仅隐藏不删除 if (core.hasSpecial(enemy.special, 23)) { @@ -528,8 +539,9 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 从V2.5.4开始,对光环效果增加缓存,以解决多次重复计算的问题,从而大幅提升运行效率。 var hp_buff = 0, atk_buff = 0, - def_buff = 0, - cnt = 0; + def_buff = 0; + // 已经计算过的光环怪ID列表,用于判定叠加 + var usedEnemyIds = {}; // 检查光环和支援的缓存 var index = x != null && y != null ? (x + "," + y) : "floor"; if (!core.status.checkBlock.cache) core.status.checkBlock.cache = {}; @@ -554,13 +566,12 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (enemy.zoneSquare && dx <= enemy.range && dy <= enemy.range) inRange = true; } // 检查是否可叠加 - if (inRange && (enemy.add || cnt == 0)) { + if (inRange && (enemy.add || !usedEnemyIds[enemy.id])) { hp_buff += enemy.value || 0; atk_buff += enemy.atkValue || 0; def_buff += enemy.defValue || 0; - cnt++; + usedEnemyIds[enemy.id] = true; } - } // 检查【支援】技能,数字26 if (enemy && core.hasSpecial(enemy.special, 26) && @@ -596,7 +607,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // if (core.hasSpecial(mon_special, 27) && mon_atk < hero_atk) { // mon_atk = hero_atk; // } - // 也可以按需增加各种自定义内容(比如幻塔的魔杖效果等) + // 也可以按需增加各种自定义内容 return { "hp": Math.floor(mon_hp),