怪物属性内置颜色
This commit is contained in:
parent
0dc434562a
commit
6d0765e15e
@ -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,
|
||||
|
||||
@ -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];
|
||||
|
||||
51
libs/ui.js
51
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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -72,7 +72,7 @@
|
||||
(OK) 右键反复弹出;(OK) 上下楼梯绑定楼传;(OK) 属性框出现0问题;(OK) 上下楼点选点
|
||||
(OK) 地图编辑框无效;(OK) jumpHero和帧动画冲突;(OK) bookDetails重复计算buff;(OK) 怪物属性多选
|
||||
(OK) 图片化文本翻转;(OK) 绘制矩形(边框)旋转;
|
||||
特殊属性&光环检查;(OK) 钥匙不消耗;(OK) 录像接档问题
|
||||
(OK) 特殊属性颜色;光环检查;(OK) 钥匙不消耗;(OK) 录像接档问题
|
||||
|
||||
-------------
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user