diff --git a/docs/personalization.md b/docs/personalization.md index 2de9269c..64550140 100644 --- a/docs/personalization.md +++ b/docs/personalization.md @@ -249,7 +249,7 @@ enemys.prototype.calDamage = function (monster, hero_hp, hero_atk, hero_def, her // 如果有神圣盾免疫吸血等可以在这里写 if (core.hasFlag("shield5")) vampireDamage = 0; // 存在神圣盾,吸血伤害为0 - vampireDamage = parseInt(vampireDamage); + vampireDamage = Math.floor(vampireDamage) || 0; // 加到自身 if (monster.add) // 如果加到自身 mon_hp += vampireDamage; diff --git a/libs/control.js b/libs/control.js index 58515205..f51c1133 100644 --- a/libs/control.js +++ b/libs/control.js @@ -946,7 +946,7 @@ control.prototype.updateCheckBlock = function() { core.status.checkBlock.betweenAttack[13*x+y]=true; var leftHp = core.status.hero.hp - core.status.checkBlock.damage[13*x+y]; if (leftHp>1) - core.status.checkBlock.damage[13*x+y] += parseInt((leftHp+(core.flags.betweenAttackCeil?0:1))/2); + core.status.checkBlock.damage[13*x+y] += Math.floor((leftHp+(core.flags.betweenAttackCeil?0:1))/2); } } } @@ -2088,9 +2088,7 @@ control.prototype.updateStatusBar = function () { var statusList = ['hpmax', 'hp', 'atk', 'def', 'mdef', 'money', 'experience']; statusList.forEach(function (item) { - var val = core.getStatus(item); - if (val>=10000000) val = parseInt(val/10000) + "W"; - core.statusBar[item].innerHTML = val; + core.statusBar[item].innerHTML = core.formatBigNumber(core.getStatus(item)); }); // 进阶 diff --git a/libs/enemys.js b/libs/enemys.js index 6e57d6a2..4127ef40 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -84,11 +84,11 @@ enemys.prototype.getSpecialHint = function (enemy, special) { case 4: return "2连击:怪物每回合攻击2次"; case 5: return "3连击:怪物每回合攻击3次"; case 6: return (enemy.n||4)+"连击: 怪物每回合攻击"+(enemy.n||4)+"次"; - case 7: return "破甲:战斗前,怪物附加角色防御的"+parseInt(100*core.values.breakArmor||0)+"%作为伤害"; - case 8: return "反击:战斗时,怪物每回合附加角色攻击的"+parseInt(100*core.values.counterAttack||0)+"%作为伤害,无视角色防御"; + case 7: return "破甲:战斗前,怪物附加角色防御的"+Math.floor(100*core.values.breakArmor||0)+"%作为伤害"; + case 8: return "反击:战斗时,怪物每回合附加角色攻击的"+Math.floor(100*core.values.counterAttack||0)+"%作为伤害,无视角色防御"; case 9: return "净化:战斗前,怪物附加勇士魔防的"+core.values.purify+"倍作为伤害"; case 10: return "模仿:怪物的攻防和勇士攻防相等"; - case 11: return "吸血:战斗前,怪物首先吸取角色的"+parseInt(100*enemy.value||0)+"%生命作为伤害"+(enemy.add?",并把伤害数值加到自身生命上":""); + case 11: return "吸血:战斗前,怪物首先吸取角色的"+Math.floor(100*enemy.value||0)+"%生命作为伤害"+(enemy.add?",并把伤害数值加到自身生命上":""); case 12: return "中毒:战斗后,勇士陷入中毒状态,每一步损失生命"+core.values.poisonDamage+"点"; case 13: return "衰弱:战斗后,勇士陷入衰弱状态,攻防暂时下降"+core.values.weakValue+"点"; case 14: return "诅咒:战斗后,勇士陷入诅咒状态,战斗无法获得金币和经验"; @@ -138,7 +138,7 @@ enemys.prototype.getCritical = function (monsterId) { // 坚固、模仿怪物没有临界! if (this.hasSpecial(monster.special, 3) || this.hasSpecial(monster.special, 10)) return "???"; - if (monster.def + monster.hp/2 <= 10000) { + if (monster.def + monster.hp/2 <= 0) { var last = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef); @@ -157,23 +157,22 @@ enemys.prototype.getCritical = function (monsterId) { } else { - var info = this.getDamageInfo(monster, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef); + + var info = this.getDamageInfo(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef); if (info == null) return '???'; if (info.damage <= 0) return 0; var mon_hp = info.mon_hp, hero_atk = core.status.hero.atk, mon_def = monster.def, turn = info.turn; - // turn 是怪物攻击次数 - - if (turn<=0) return '???'; - var nextTurn = turn - 1; // 怪物攻击次数少1 + // turn 是勇士攻击次数 + if (turn<=1) return 0; // 攻杀 // 每回合最小伤害 = ⎡怪物生命/勇士攻击次数⎤ - var nextAtk = parseInt((mon_hp - 1)/(nextTurn+1)) + 1 + mon_def; + var nextAtk = Math.ceil(mon_hp/(turn-1)) + mon_def; - if (nextAtk <= hero_atk) return '???'; - return core.formatBigNumber(nextAtk - hero_atk); + if (nextAtk <= hero_atk) return 0; + return nextAtk - hero_atk; } } @@ -187,7 +186,7 @@ enemys.prototype.getCriticalDamage = function (monsterId) { var last = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef); var now = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk+c, core.status.hero.def, core.status.hero.mdef); if (last == null || now==null) return '???'; - return core.formatBigNumber(last - now); + return last - now; } ////// 1防减伤计算 ////// @@ -196,7 +195,7 @@ enemys.prototype.getDefDamage = function (monsterId) { var nowDamage = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef); var nextDamage = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def + 1, core.status.hero.mdef); if (nowDamage == null || nextDamage ==null) return "???"; - return core.formatBigNumber(nowDamage - nextDamage); + return nowDamage - nextDamage; } ////// 获得战斗伤害信息 ////// @@ -219,7 +218,7 @@ enemys.prototype.getDamageInfo = function(monster, hero_hp, hero_atk, hero_def, // 如果有神圣盾免疫吸血等可以在这里写 - vampireDamage = parseInt(vampireDamage) || 0; + vampireDamage = Math.floor(vampireDamage) || 0; // 加到自身 if (monster.add) // 如果加到自身 mon_hp += vampireDamage; @@ -248,7 +247,7 @@ enemys.prototype.getDamageInfo = function(monster, hero_hp, hero_atk, hero_def, var counterDamage = 0; // 反击 - if (this.hasSpecial(mon_special, 8)) counterDamage += parseInt(core.values.counterAttack * hero_atk); + if (this.hasSpecial(mon_special, 8)) counterDamage += Math.floor(core.values.counterAttack * hero_atk); // 先攻 if (this.hasSpecial(mon_special, 1)) @@ -256,14 +255,15 @@ enemys.prototype.getDamageInfo = function(monster, hero_hp, hero_atk, hero_def, // 破甲 if (this.hasSpecial(mon_special, 7)) - initDamage += parseInt(core.values.breakArmor * hero_def); + initDamage += Math.floor(core.values.breakArmor * hero_def); // 净化 if (this.hasSpecial(mon_special, 9)) - initDamage += parseInt(core.values.purify * hero_mdef); + initDamage += Math.floor(core.values.purify * hero_mdef); - var turn = parseInt((mon_hp - 1) / (hero_atk - mon_def)); - var ans = initDamage + turn * per_damage + (turn + 1) * counterDamage; + // turn: 勇士攻击回合数 + var turn = Math.ceil(mon_hp / (hero_atk - mon_def)); + var ans = initDamage + (turn - 1) * per_damage + turn * counterDamage; ans -= hero_mdef; if (!core.flags.enableNegativeDamage) @@ -275,8 +275,7 @@ enemys.prototype.getDamageInfo = function(monster, hero_hp, hero_atk, hero_def, "hero_mdef": hero_mdef, "mon_hp": mon_hp, "mon_atk": mon_atk, - "mod_def": mon_def, - "mon_mdef": mon_mdef, + "mon_def": mon_def, "per_damage": per_damage, "initDamage": initDamage, "turn": turn, diff --git a/libs/events.js b/libs/events.js index b7b32ec6..94dc708d 100644 --- a/libs/events.js +++ b/libs/events.js @@ -488,7 +488,7 @@ events.prototype.doAction = function() { var value=core.calValue(data.value); // 属性 if (data.name.indexOf("status:")==0) { - value=parseInt(value); + value=parseFloat(value); core.setStatus(data.name.substring(7), value); } // 道具 diff --git a/libs/ui.js b/libs/ui.js index 37915b2a..4c3eee5e 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -787,7 +787,7 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { // 如果有神圣盾免疫吸血等可以在这里写 - vampireDamage = parseInt(vampireDamage); + vampireDamage = Math.floor(vampireDamage); // 加到自身 if (monster.add) // 如果加到自身 mon_hp += vampireDamage; @@ -815,8 +815,8 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { if (core.enemys.hasSpecial(mon_special, 6)) turns=1+(monster.n||4); // 初始伤害 - if (core.enemys.hasSpecial(mon_special, 7)) initDamage+=parseInt(core.values.breakArmor * hero_def); - if (core.enemys.hasSpecial(mon_special, 9)) initDamage+=parseInt(core.values.purify * hero_mdef); + if (core.enemys.hasSpecial(mon_special, 7)) initDamage+=Math.floor(core.values.breakArmor * hero_def); + if (core.enemys.hasSpecial(mon_special, 9)) initDamage+=Math.floor(core.values.purify * hero_mdef); hero_mdef-=initDamage; if (hero_mdef<0) { hero_hp+=hero_mdef; @@ -1001,7 +1001,7 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { // 反击 if (core.enemys.hasSpecial(mon_special, 8)) { - hero_mdef -= parseInt(core.values.counterAttack * hero_atk); + hero_mdef -= Math.floor(core.values.counterAttack * hero_atk); if (hero_mdef<0) { hero_hp+=hero_mdef; @@ -1247,16 +1247,16 @@ ui.prototype.drawBook = function (index) { } core.canvas.ui.textAlign = "left"; core.fillText('ui', '生命', 165, 62 * i + 32, '#DDDDDD', '13px Verdana'); - core.fillText('ui', enemy.hp, 195, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana'); + core.fillText('ui', core.formatBigNumber(enemy.hp), 195, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana'); core.fillText('ui', '攻击', 255, 62 * i + 32, '#DDDDDD', '13px Verdana'); - core.fillText('ui', enemy.atk, 285, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana'); + core.fillText('ui', core.formatBigNumber(enemy.atk), 285, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana'); core.fillText('ui', '防御', 335, 62 * i + 32, '#DDDDDD', '13px Verdana'); - core.fillText('ui', enemy.def, 365, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana'); + core.fillText('ui', core.formatBigNumber(enemy.def), 365, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana'); var expOffset = 165, line_cnt=0; if (core.flags.enableMoney) { core.fillText('ui', '金币', 165, 62 * i + 50, '#DDDDDD', '13px Verdana'); - core.fillText('ui', enemy.money, 195, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana'); + core.fillText('ui', core.formatBigNumber(enemy.money), 195, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana'); expOffset = 255; line_cnt++; } @@ -1265,7 +1265,7 @@ ui.prototype.drawBook = function (index) { if (core.flags.enableAddPoint) { core.canvas.ui.textAlign = "left"; core.fillText('ui', '加点', expOffset, 62 * i + 50, '#DDDDDD', '13px Verdana'); - core.fillText('ui', enemy.point, expOffset + 30, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana'); + core.fillText('ui', core.formatBigNumber(enemy.point), expOffset + 30, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana'); expOffset = 255; line_cnt++; } @@ -1273,7 +1273,7 @@ ui.prototype.drawBook = function (index) { if (core.flags.enableExperience && line_cnt<2) { core.canvas.ui.textAlign = "left"; core.fillText('ui', '经验', expOffset, 62 * i + 50, '#DDDDDD', '13px Verdana'); - core.fillText('ui', enemy.experience, expOffset + 30, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana'); + core.fillText('ui', core.formatBigNumber(enemy.experience), expOffset + 30, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana'); line_cnt++; } @@ -1281,15 +1281,6 @@ ui.prototype.drawBook = function (index) { if (line_cnt==1) damageOffset=326; if (line_cnt==2) damageOffset=361; - /* - var damageOffet = 281; - if (core.flags.enableMoney && core.flags.enableExperience) - damageOffet = 361; - else if (core.flags.enableMoney || core.flags.enableExperience) - damageOffet = 326; - */ - - core.canvas.ui.textAlign = "center"; var damage = enemy.damage; @@ -1303,18 +1294,17 @@ ui.prototype.drawBook = function (index) { if (damage<=0) color = '#00FF00'; damage = core.formatBigNumber(damage); - } core.fillText('ui', damage, damageOffset, 62 * i + 50, color, 'bold 13px Verdana'); core.canvas.ui.textAlign = "left"; core.fillText('ui', '临界', 165, 62 * i + 68, '#DDDDDD', '13px Verdana'); - core.fillText('ui', enemy.critical, 195, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana'); + core.fillText('ui', core.formatBigNumber(enemy.critical), 195, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana'); core.fillText('ui', '减伤', 255, 62 * i + 68, '#DDDDDD', '13px Verdana'); - core.fillText('ui', enemy.criticalDamage, 285, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana'); + core.fillText('ui', core.formatBigNumber(enemy.criticalDamage), 285, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana'); core.fillText('ui', '1防', 335, 62 * i + 68, '#DDDDDD', '13px Verdana'); - core.fillText('ui', enemy.defDamage, 365, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana'); + core.fillText('ui', core.formatBigNumber(enemy.defDamage), 365, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana'); if (index == start+i) { core.strokeRect('ui', 10, 62 * i + 13, 416-10*2, 62, '#FFD700'); diff --git a/libs/utils.js b/libs/utils.js index 79f6c556..bca7edfa 100644 --- a/libs/utils.js +++ b/libs/utils.js @@ -146,13 +146,24 @@ utils.prototype.setTwoDigits = function (x) { } utils.prototype.formatBigNumber = function (x) { - x = parseInt(x); - if (!core.isset(x)) return x; + x = parseFloat(x); + if (!core.isset(x)) return '???'; - if (x>=1e17) return (x / 1e16).toFixed(1) + "j"; - else if (x>=1e13) return (x / 1e12).toFixed(1) + "z"; - else if (x>=1e9) return (x / 1e8).toFixed(1) + "e"; - else if (x>=1e5) return (x / 1e4).toFixed(1) + "w"; + var all = [ + {"val": 10e20, "char": "g"}, + {"val": 10e16, "char": "j"}, + {"val": 10e12, "char": "z"}, + {"val": 10e8, "char": "e"}, + {"val": 10e4, "char": "w"}, + ] + + for (var i=0;i=10*one.val) { + var v = x/one.val; + return v.toFixed(Math.max(0, Math.floor(4-Math.log10(v)))) + one.char; + } + } return x; }