From 6d0765e15e375aa0f378fb9a916ac35af6effdf8 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Tue, 26 May 2020 18:28:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=80=AA=E7=89=A9=E5=B1=9E=E6=80=A7=E5=86=85?= =?UTF-8?q?=E7=BD=AE=E9=A2=9C=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _server/table/data.comment.js | 6 ++--- libs/enemys.js | 25 ++++++++++++++--- libs/ui.js | 51 ++++++++++++++++++++++++----------- project/functions.js | 39 ++++++++++++++------------- v2.x-final更新.txt | 2 +- 5 files changed, 82 insertions(+), 41 deletions(-) diff --git a/_server/table/data.comment.js b/_server/table/data.comment.js index 7c3d4ea1..37929164 100644 --- a/_server/table/data.comment.js +++ b/_server/table/data.comment.js @@ -430,19 +430,19 @@ var data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_leaf": true, "_type": "textarea", "_docs": "破甲比例", - "_data": "破甲的比例(战斗前,怪物附加角色防御的x倍作为伤害)" + "_data": "破甲的比例(战斗前,怪物附加角色防御的x倍作为伤害);可以用怪物的 defValue 覆盖此值。" }, "counterAttack": { "_leaf": true, "_type": "textarea", "_docs": "反击比例", - "_data": "反击的比例(战斗时,怪物每回合附加角色攻击的x倍作为伤害,无视角色防御)" + "_data": "反击的比例(战斗时,怪物每回合附加角色攻击的x倍作为伤害,无视角色防御);可以用怪物的 atkValue 覆盖此值。" }, "purify": { "_leaf": true, "_type": "textarea", "_docs": "净化比例", - "_data": "净化的比例(战斗前,怪物附加勇士护盾的x倍作为伤害)" + "_data": "净化的比例(战斗前,怪物附加勇士护盾的x倍作为伤害);可以用怪物的 n 覆盖此值。" }, "hatred": { "_leaf": true, diff --git a/libs/enemys.js b/libs/enemys.js index 0eceee34..6e534aa9 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -77,6 +77,24 @@ enemys.prototype.getSpecialText = function (enemy) { return text; } +////// 获得所有所有特殊属性的颜色 ////// +enemys.prototype.getSpecialColor = function (enemy) { + if (typeof enemy == 'string') enemy = core.material.enemys[enemy]; + 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; + +} + ////// 获得每个特殊属性的说明 ////// enemys.prototype.getSpecialHint = function (enemy, special) { var specials = this.getSpecials(); @@ -86,7 +104,8 @@ enemys.prototype.getSpecialHint = function (enemy, special) { var hints = []; for (var i = 0; i < specials.length; i++) { if (this.hasSpecial(enemy, specials[i][0])) - hints.push("\r[#FF6A6A]\\d"+this._calSpecialContent(enemy, specials[i][1]) + ":\\d\r[]" + this._calSpecialContent(enemy, specials[i][2])); + 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; } @@ -323,8 +342,7 @@ enemys.prototype._getCurrentEnemys_addEnemy = function (enemyId, enemys, used, f var enemyInfo = this.getEnemyInfo(enemy, null, null, null, floorId); var specialText = core.enemys.getSpecialText(enemy); - if (specialText.length >= 3) specialText = "多属性..."; - else specialText = specialText.join(" "); + var specialColor = core.enemys.getSpecialColor(enemy); var critical = this.nextCriticals(enemy, 1, null, null, floorId); if (critical.length > 0) critical = critical[0]; @@ -334,6 +352,7 @@ enemys.prototype._getCurrentEnemys_addEnemy = function (enemyId, enemys, used, f e[x] = enemyInfo[x]; } e.specialText = specialText; + e.specialColor = specialColor; e.damage = this.getDamage(enemy, null, null, floorId); e.critical = critical[0]; e.criticalDamage = critical[1]; diff --git a/libs/ui.js b/libs/ui.js index bbea5943..7673d3fe 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -77,10 +77,10 @@ ui.prototype.fillText = function (name, text, x, y, style, font, maxWidth) { var ctx = this.getContextByName(name); if (ctx) { // 如果存在最大宽度 - if (maxWidth != null) - this._fillTextWithMaxWidth(ctx, text, x, y, maxWidth); - else - ctx.fillText(text, x, y); + if (maxWidth != null) { + this.setFontForMaxWidth(ctx, text, maxWidth); + } + ctx.fillText(text, x, y); } } @@ -90,16 +90,15 @@ ui.prototype._uievent_fillText = function (data) { } ////// 自适配字体大小 -ui.prototype._fillTextWithMaxWidth = function (ctx, text, x, y, maxWidth) { - // 获得当前字体 +ui.prototype.setFontForMaxWidth = function (name, text, maxWidth, font) { + var ctx = this.getContextByName(name); + if (font) core.setFont(name, font); var font = ctx.font, u = /(\d+)px/.exec(font); - if (u == null) return ctx.fillText(text, x, y); + if (u == null) return; for (var font_size = parseInt(u[1]); font_size >= 8; font_size--) { ctx.font = font.replace(/(\d+)px/, font_size+"px"); - if (ctx.measureText(text).width <= maxWidth) break; + if (ctx.measureText(text).width <= maxWidth) return; } - ctx.fillText(text, x, y); - ctx.font = font; } ////// 在某个canvas上绘制粗体 ////// @@ -1922,15 +1921,37 @@ ui.prototype._drawBook_drawName = function (index, enemy, top, left, width) { // 绘制第零列(名称和特殊属性) // 如果需要添加自己的比如怪物的称号等,也可以在这里绘制 core.setTextAlign('ui', 'center'); - if (enemy.specialText=='') { + if (enemy.specialText.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); - core.fillText('ui', enemy.specialText, left + width / 2, - top + 50, '#FF6A6A', this._buildFont(15, true), width); + switch (enemy.specialText.length) { + case 1: + core.fillText('ui', enemy.specialText[0], left + width / 2, + top + 50, core.arrayToRGBA((enemy.specialColor || [])[0] || '#FF6A6A'), + this._buildFont(15, true), width); + break; + case 2: + // Step 1: 计算字体 + var text = enemy.specialText[0] + " " + enemy.specialText[1]; + core.setFontForMaxWidth('ui', text, width, this._buildFont(15, true)); + // Step 2: 计算总宽度 + var totalWidth = core.calWidth('ui', text); + var leftWidth = core.calWidth('ui', enemy.specialText[0]); + var rightWidth = core.calWidth('ui', enemy.specialText[1]); + // Step 3: 绘制 + core.fillText('ui', enemy.specialText[0], left + (width + leftWidth - totalWidth) / 2, + top+50, core.arrayToRGBA((enemy.specialColor || [])[0] || '#FF6A6A')); + core.fillText('ui', enemy.specialText[1], left + (width + totalWidth - rightWidth) / 2, + top+50, core.arrayToRGBA((enemy.specialColor || [])[1] || '#FF6A6A')); + break; + default: + core.fillText('ui', '多属性...', left + width / 2, + top + 50, '#FF6A6A', this._buildFont(15, true), width); + } } } @@ -2705,8 +2726,8 @@ ui.prototype._drawSLPanel_drawRecord = function(title, data, x, y, size, cho, hi core.fillText('ui', core.formatDate(new Date(data.time)), x, y+43+size, data.hero.flags.debug?'#FF6A6A':'#FFFFFF'); } else { - core.fillRect('ui', x-size/2, y+15, size, size, '#333333', 2); - core.fillText('ui', '空', x, parseInt(y+22+size/2), '#FFFFFF', this._buildFont(30,true)); + core.fillRect('ui', x-size/2, y+15, size, size, '#333333'); + core.fillText('ui', '空', x, parseInt(y+22+size/2), '#FFFFFF', this._buildFont(30, true)); } } diff --git a/project/functions.js b/project/functions.js index 8cd0e3be..4dc49d43 100644 --- a/project/functions.js +++ b/project/functions.js @@ -427,7 +427,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } */ } -}, +} }, "enemys": { "getSpecials": function () { @@ -436,30 +436,30 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 可以直接写字符串,也可以写个function将怪物传进去 return [ [1, "先攻", "怪物首先攻击"], - [2, "魔攻", "怪物无视勇士的防御"], - [3, "坚固", "怪物防御不小于勇士攻击-1"], + [2, "魔攻", "怪物无视勇士的防御", "#b6b0ff"], + [3, "坚固", "怪物防御不小于勇士攻击-1", "#b9822d"], [4, "2连击", "怪物每回合攻击2次"], [5, "3连击", "怪物每回合攻击3次"], [6, function (enemy) { return (enemy.n || '') + "连击"; }, function (enemy) { return "怪物每回合攻击" + (enemy.n || 4) + "次"; }], - [7, "破甲", "战斗前,怪物附加角色防御的" + Math.floor(100 * core.values.breakArmor || 0) + "%作为伤害"], - [8, "反击", "战斗时,怪物每回合附加角色攻击的" + Math.floor(100 * core.values.counterAttack || 0) + "%作为伤害,无视角色防御"], - [9, "净化", "战斗前,怪物附加勇士护盾的" + core.values.purify + "倍作为伤害"], - [10, "模仿", "怪物的攻防和勇士攻防相等"], - [11, "吸血", function (enemy) { return "战斗前,怪物首先吸取角色的" + Math.floor(100 * enemy.value || 0) + "%生命(约" + Math.floor((enemy.value || 0) * core.getStatus('hp')) + "点)作为伤害" + (enemy.add ? ",并把伤害数值加到自身生命上" : ""); }], - [12, "中毒", "战斗后,勇士陷入中毒状态,每一步损失生命" + core.values.poisonDamage + "点"], - [13, "衰弱", "战斗后,勇士陷入衰弱状态,攻防暂时下降" + (core.values.weakValue >= 1 ? core.values.weakValue + "点" : parseInt(core.values.weakValue * 100) + "%")], - [14, "诅咒", "战斗后,勇士陷入诅咒状态,战斗无法获得金币和经验"], + [7, "破甲", function (enemy) { return "战斗前,怪物附加角色防御的" + Math.floor(100 * (enemy.defValue || core.values.breakArmor || 0)) + "%作为伤害"; }, "#b30000"], + [8, "反击", function (enemy) { return "战斗时,怪物每回合附加角色攻击的" + Math.floor(100 * (enemy.atkValue || core.values.counterAttack || 0)) + "%作为伤害,无视角色防御"; }, "#bd26ce"], + [9, "净化", function (enemy) { return "战斗前,怪物附加勇士护盾的" + (enemy.n || core.values.purify) + "倍作为伤害"; }, "#00d2d4"], + [10, "模仿", "怪物的攻防和勇士攻防相等", "#ff00d2"], + [11, "吸血", function (enemy) { return "战斗前,怪物首先吸取角色的" + Math.floor(100 * enemy.value || 0) + "%生命(约" + Math.floor((enemy.value || 0) * core.getStatus('hp')) + "点)作为伤害" + (enemy.add ? ",并把伤害数值加到自身生命上" : ""); }, "#ff00d2"], + [12, "中毒", "战斗后,勇士陷入中毒状态,每一步损失生命" + core.values.poisonDamage + "点", "#4aff60"], + [13, "衰弱", "战斗后,勇士陷入衰弱状态,攻防暂时下降" + (core.values.weakValue >= 1 ? core.values.weakValue + "点" : parseInt(core.values.weakValue * 100) + "%"), "#feccd0"], + [14, "诅咒", "战斗后,勇士陷入诅咒状态,战斗无法获得金币和经验", "#747dff"], [15, "领域", function (enemy) { return "经过怪物周围" + (enemy.zoneSquare ? "九宫格" : "十字") + "范围内" + (enemy.range || 1) + "格时自动减生命" + (enemy.value || 0) + "点"; }], - [16, "夹击", "经过两只相同的怪物中间,勇士生命值变成一半"], + [16, "夹击", "经过两只相同的怪物中间,勇士生命值变成一半", "#ff00d2"], [17, "仇恨", "战斗前,怪物附加之前积累的仇恨值作为伤害;战斗后,释放一半的仇恨值。(每杀死一个怪物获得" + (core.values.hatred || 0) + "点仇恨值)"], [18, "阻击", function (enemy) { return "经过怪物的十字领域时自动减生命" + (enemy.value || 0) + "点,同时怪物后退一格"; }], - [19, "自爆", "战斗后勇士的生命值变成1"], - [20, "无敌", "勇士无法打败怪物,除非拥有十字架"], - [21, "退化", function (enemy) { return "战斗后勇士永久下降" + (enemy.atkValue || 0) + "点攻击和" + (enemy.defValue || 0) + "点防御"; }], + [19, "自爆", "战斗后勇士的生命值变成1", "#ff0000"], + [20, "无敌", "勇士无法打败怪物,除非拥有十字架", "#fbff00"], + [21, "退化", function (enemy) { return "战斗后勇士永久下降" + (enemy.atkValue || 0) + "点攻击和" + (enemy.defValue || 0) + "点防御"; }, "#ff0000"], [22, "固伤", function (enemy) { return "战斗前,怪物对勇士造成" + (enemy.damage || 0) + "点固定伤害,无视勇士护盾。"; }], [23, "重生", "怪物被击败后,角色转换楼层则怪物将再次出现"], [24, "激光", function (enemy) { return "经过怪物同行或同列时自动减生命" + (enemy.value || 0) + "点"; }], - [25, "光环", function (enemy) { return "同楼层所有怪物生命提升" + (enemy.value || 0) + "%,攻击提升" + (enemy.atkValue || 0) + "%,防御提升" + (enemy.defValue || 0) + "%," + (enemy.add ? "可叠加" : "不可叠加"); }], + [25, "光环", function (enemy) { return "同楼层所有怪物生命提升" + (enemy.value || 0) + "%,攻击提升" + (enemy.atkValue || 0) + "%,防御提升" + (enemy.defValue || 0) + "%," + (enemy.add ? "可叠加" : "不可叠加"); }, "#fff900"], [26, "支援", "当周围一圈的怪物受到攻击时将上前支援,并组成小队战斗。"], [27, "捕捉", "当走到怪物周围十字时会强制进行战斗。"] ]; @@ -658,18 +658,19 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 每回合的反击伤害;反击是按照勇士的攻击次数来计算回合 var counterDamage = 0; - if (core.hasSpecial(mon_special, 8)) counterDamage += Math.floor(core.values.counterAttack * hero_atk); + if (core.hasSpecial(mon_special, 8)) + counterDamage += Math.floor((enemy.atkValue || core.values.counterAttack) * hero_atk); // 先攻 if (core.hasSpecial(mon_special, 1)) init_damage += per_damage; // 破甲 if (core.hasSpecial(mon_special, 7)) - init_damage += Math.floor(core.values.breakArmor * hero_def); + init_damage += Math.floor((enemy.defValue || core.values.breakArmor) * hero_def); // 净化 if (core.hasSpecial(mon_special, 9)) - init_damage += Math.floor(core.values.purify * hero_mdef); + init_damage += Math.floor((enemy.n || core.values.purify) * hero_mdef); // 勇士每回合对怪物造成的伤害 var hero_per_damage = Math.max(hero_atk - mon_def, 0); diff --git a/v2.x-final更新.txt b/v2.x-final更新.txt index 8becab5f..6bc9f32c 100644 --- a/v2.x-final更新.txt +++ b/v2.x-final更新.txt @@ -72,7 +72,7 @@ (OK) 右键反复弹出;(OK) 上下楼梯绑定楼传;(OK) 属性框出现0问题;(OK) 上下楼点选点 (OK) 地图编辑框无效;(OK) jumpHero和帧动画冲突;(OK) bookDetails重复计算buff;(OK) 怪物属性多选 (OK) 图片化文本翻转;(OK) 绘制矩形(边框)旋转; -特殊属性&光环检查;(OK) 钥匙不消耗;(OK) 录像接档问题 +(OK) 特殊属性颜色;光环检查;(OK) 钥匙不消耗;(OK) 录像接档问题 -------------