diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 00000000..79a710fd --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 00000000..a55e7a17 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/docs/element.md b/docs/element.md index 299c00a6..0b1f5827 100644 --- a/docs/element.md +++ b/docs/element.md @@ -14,14 +14,26 @@ 大多数宝物都有默认的效果,屠龙匕首暂未定义,如有自己的需求可参见[自定义道具效果](personalization#自定义道具效果)。 -如需让剑盾变成装备,可以直接在`data.js`中设置`'equipment': true`即可。 - 拿到道具后将触发`afterGetItem`事件,有关事件的详细介绍请参见[事件](event)。 如需修改某个道具的效果,在不同区域宝石数据发生变化等问题,请参见[自定义道具效果](personalization#自定义道具效果)的说明。 **有关轻按,在data.js的系统变量中有定义。如果`enableGentleClick`为true,则鼠标(触摸屏)通过双击勇士,键盘通过空格可达到轻按效果,即不向前移动而获得前方物品。** +## 装备 + +如果需要让剑盾等变成装备,可以直接在`data.js`中设置`'equipment': true`即可。 + +值得注意的是,有时候会有一个装备加多种属性的需求,此时需要把剑盾的效果从数值改成一个对象: + +``` js +"sword1": {"atk": 10, "def": 0, "mdef": 5}, // 铁剑加10攻和5魔防 +"shield1": {"atk": 0, "def": 10, "mdef": 10}, // 铁盾加10防和10魔防 +``` + +将需要的项目按照如上方式修改即可。 + + ## 门 本塔支持6种门,黄蓝红绿铁花。前五种门需要有对应的钥匙打开,花门只能通过调用`openDoor`事件进行打开。 diff --git a/docs/personalization.md b/docs/personalization.md index 6d8b0880..2de9269c 100644 --- a/docs/personalization.md +++ b/docs/personalization.md @@ -286,7 +286,7 @@ control.prototype.checkBlock = function () { 你需自己指定一个special数字,修改getSpecialText函数(属性名)和getSpecialHint函数(属性提示文字)。 -如果要修改伤害计算公式,请修改下面的calDamage函数。请注意,如果无法战斗,该函数必须返回`999999999`。 +如果要修改伤害计算公式,请修改下面的calDamage函数。请注意,如果无法战斗,该函数必须返回`null`。 对于毒衰弱怪物的战斗后结算在`functions.js`中的afterBattle函数中。 diff --git a/libs/control.js b/libs/control.js index 47c960a0..0dcd7817 100644 --- a/libs/control.js +++ b/libs/control.js @@ -1039,21 +1039,31 @@ control.prototype.snipe = function (snipes) { snipe.blockIcon = core.material.icons[cls][block.event.id]; snipe.blockImage = core.material.images[cls]; snipe.height = height; + var damage = core.enemys.getDamage(block.event.id); + var color = '#000000'; - var color = "#000000"; - if (damage <= 0) color = '#00FF00'; - else if (damage < core.status.hero.hp / 3) color = '#FFFFFF'; - else if (damage < core.status.hero.hp * 2 / 3) color = '#FFFF00'; - else if (damage < core.status.hero.hp) color = '#FF7F00'; - else color = '#FF0000'; + if (damage == null) { + damage = "???"; + color = '#FF0000'; + } + else { + if (damage <= 0) color = '#00FF00'; + else if (damage < hero_hp / 3) color = '#FFFFFF'; + else if (damage < hero_hp * 2 / 3) color = '#FFFF00'; + else if (damage < hero_hp) color = '#FF7F00'; + else color = '#FF0000'; - if (damage >= 999999999) damage = "???"; - else if (damage > 100000) damage = (damage / 10000).toFixed(1) + "w"; + if (damage>=1e17) damage = (damage / 1e16).toFixed(1) + "j"; + else if (damage>=1e13) damage = (damage / 1e12).toFixed(1) + "z"; + else if (damage>=1e9) damage = (damage / 1e8).toFixed(1) + "e"; + else if (damage>=1e5) damage = (damage / 1e4).toFixed(1) + "w"; + } snipe.damage = damage; snipe.color = color; snipe.block = core.clone(block); + }) var finishSnipe = function () { @@ -1265,15 +1275,24 @@ control.prototype.updateFg = function () { var id = mapBlocks[b].event.id; var damage = core.enemys.getDamage(id); - var color = "#000000"; - if (damage <= 0) color = '#00FF00'; - else if (damage < hero_hp / 3) color = '#FFFFFF'; - else if (damage < hero_hp * 2 / 3) color = '#FFFF00'; - else if (damage < hero_hp) color = '#FF7F00'; - else color = '#FF0000'; + var color = '#000000'; - if (damage >= 999999999) damage = "???"; - else if (damage > 100000) damage = (damage / 10000).toFixed(1) + "w"; + if (damage == null) { + damage = "???"; + color = '#FF0000'; + } + else { + if (damage <= 0) color = '#00FF00'; + else if (damage < hero_hp / 3) color = '#FFFFFF'; + else if (damage < hero_hp * 2 / 3) color = '#FFFF00'; + else if (damage < hero_hp) color = '#FF7F00'; + else color = '#FF0000'; + + if (damage>=1e17) damage = (damage / 1e16).toFixed(1) + "j"; + else if (damage>=1e13) damage = (damage / 1e12).toFixed(1) + "z"; + else if (damage>=1e9) damage = (damage / 1e8).toFixed(1) + "e"; + else if (damage>=1e5) damage = (damage / 1e4).toFixed(1) + "w"; + } core.setFillStyle('fg', '#000000'); core.canvas.fg.fillText(damage, 32 * x + 2, 32 * (y + 1) - 2); diff --git a/libs/enemys.js b/libs/enemys.js index d6bc65b0..af16347b 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -84,17 +84,17 @@ 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)+"%作为伤害"; - case 8: return "反击:战斗时,怪物每回合附加角色攻击的"+parseInt(100*core.values.counterAttack)+"%作为伤害,无视角色防御"; + case 7: return "破甲:战斗前,怪物附加角色防御的"+parseInt(100*core.values.breakArmor||0)+"%作为伤害"; + case 8: return "反击:战斗时,怪物每回合附加角色攻击的"+parseInt(100*core.values.counterAttack||0)+"%作为伤害,无视角色防御"; case 9: return "净化:战斗前,怪物附加勇士魔防的"+core.values.purify+"倍作为伤害"; case 10: return "模仿:怪物的攻防和勇士攻防相等"; - case 11: return "吸血:战斗前,怪物首先吸取角色的"+parseInt(100*enemy.value)+"%生命作为伤害"+(enemy.add?",并把伤害数值加到自身生命上":""); + case 11: return "吸血:战斗前,怪物首先吸取角色的"+parseInt(100*enemy.value||0)+"%生命作为伤害"+(enemy.add?",并把伤害数值加到自身生命上":""); case 12: return "中毒:战斗后,勇士陷入中毒状态,每一步损失生命"+core.values.poisonDamage+"点"; case 13: return "衰弱:战斗后,勇士陷入衰弱状态,攻防暂时下降"+core.values.weakValue+"点"; case 14: return "诅咒:战斗后,勇士陷入诅咒状态,战斗无法获得金币和经验"; case 15: return "领域:经过怪物周围"+(enemy.range||1)+"格时自动减生命"+(enemy.value||0)+"点"; case 16: return "夹击:经过两只相同的怪物中间,勇士生命值变成一半"; - case 17: return "仇恨:战斗前,怪物附加之前积累的仇恨值作为伤害"+(core.flags.hatredDecrease?";战斗后,释放一半的仇恨值":"")+"。(每杀死一个怪物获得"+core.values.hatred+"点仇恨值)"; + case 17: return "仇恨:战斗前,怪物附加之前积累的仇恨值作为伤害"+(core.flags.hatredDecrease?";战斗后,释放一半的仇恨值":"")+"。(每杀死一个怪物获得"+(core.values.hatred||0)+"点仇恨值)"; case 18: return "阻击:经过怪物的十字领域时自动减生命"+(enemy.value||0)+"点,同时怪物后退一格"; case 19: return "自爆:战斗后勇士的生命值变成1"; case 20: return "无敌:勇士无法打败怪物,除非拥有十字架"; @@ -106,11 +106,17 @@ enemys.prototype.getSpecialHint = function (enemy, special) { return ""; } +////// 能否获胜 ////// +enemys.prototype.canBattle = function (monsterId) { + var damage = this.getDamage(monsterId); + return damage != null && damage < core.status.hero.hp; +} + ////// 获得某个怪物的伤害 ////// enemys.prototype.getDamage = function (monsterId) { var monster = core.material.enemys[monsterId]; var damage = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef); - if (damage >= 999999999) return damage; + if (damage == null) return null; return damage + this.getExtraDamage(monster); } @@ -134,10 +140,13 @@ enemys.prototype.getCritical = function (monsterId) { var last = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef); + if (last == null) return '???'; + if (last <= 0) return 0; for (var i = core.status.hero.atk + 1; i <= monster.hp + monster.def; i++) { var damage = this.calDamage(monster, core.status.hero.hp, i, core.status.hero.def, core.status.hero.mdef); + if (damage == null) return '???'; if (damage < last) return i - core.status.hero.atk; last = damage; @@ -152,7 +161,7 @@ enemys.prototype.getCriticalDamage = function (monsterId) { if (c <= 0) return 0; var monster = core.material.enemys[monsterId]; var last = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef); - if (last >= 999999999) return '???'; + if (last == null) return '???'; return last - this.calDamage(monster, core.status.hero.hp, core.status.hero.atk + c, core.status.hero.def, core.status.hero.mdef); } @@ -162,7 +171,7 @@ enemys.prototype.getDefDamage = function (monsterId) { var monster = core.material.enemys[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 >= 999999999 || nextDamage >= 999999999) return "???"; + if (nowDamage == null || nextDamage ==null) return "???"; return nowDamage - nextDamage; } @@ -176,7 +185,7 @@ enemys.prototype.calDamage = function (monster, hero_hp, hero_atk, hero_def, her hero_mdef=Math.max(0, hero_mdef); if (this.hasSpecial(mon_special, 20) && !core.hasItem("cross")) // 如果是无敌属性,且勇士未持有十字架 - return 999999999; // 返回无限大 + return null; // 返回不可战斗 var initDamage = 0; // 战前伤害 @@ -186,7 +195,7 @@ enemys.prototype.calDamage = function (monster, hero_hp, hero_atk, hero_def, her // 如果有神圣盾免疫吸血等可以在这里写 - vampireDamage = parseInt(vampireDamage); + vampireDamage = parseInt(vampireDamage) || 0; // 加到自身 if (monster.add) // 如果加到自身 mon_hp += vampireDamage; @@ -203,7 +212,7 @@ enemys.prototype.calDamage = function (monster, hero_hp, hero_atk, hero_def, her if (this.hasSpecial(mon_special,2)) hero_def = 0; // 坚固 if (this.hasSpecial(mon_special,3) && mon_def < hero_atk - 1) mon_def = hero_atk - 1; - if (hero_atk <= mon_def) return 999999999; // 不可战斗时请直接返回999999999 + if (hero_atk <= mon_def) return null; // 不可战斗时请直接返回null var per_damage = mon_atk - hero_def; if (per_damage < 0) per_damage = 0; diff --git a/libs/events.js b/libs/events.js index bac028d1..b7b32ec6 100644 --- a/libs/events.js +++ b/libs/events.js @@ -732,9 +732,8 @@ events.prototype.battle = function (id, x, y, force, callback) { core.stopHero(); core.stopAutomaticRoute(); - var damage = core.enemys.getDamage(id); // 非强制战斗 - if (damage >= core.status.hero.hp && !force) { + if (!core.enemys.canBattle(id) && !force) { core.drawTip("你打不过此怪物!"); core.clearContinueAutomaticRoute(); return; diff --git a/libs/ui.js b/libs/ui.js index e01d802f..575684ad 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -1292,10 +1292,22 @@ ui.prototype.drawBook = function (index) { core.canvas.ui.textAlign = "center"; var damage = enemy.damage; + var color = '#FFFF00'; - if (damage >= core.status.hero.hp) color = '#FF0000'; - if (damage <= 0) color = '#00FF00'; - if (damage >= 999999999) damage = '无法战斗'; + if (damage == null) { + damage = '无法战斗'; + color = '#FF0000'; + } + else { + if (damage >= core.status.hero.hp) color = '#FF0000'; + if (damage<=0) color = '#00FF00'; + + if (damage>=1e17) damage = (damage / 1e16).toFixed(2) + "j"; + else if (damage>=1e13) damage = (damage / 1e12).toFixed(2) + "z"; + else if (damage>=1e9) damage = (damage / 1e8).toFixed(2) + "e"; + else if (damage>=1e5) damage = (damage / 1e4).toFixed(2) + "w"; + + } core.fillText('ui', damage, damageOffset, 62 * i + 50, color, 'bold 13px Verdana'); core.canvas.ui.textAlign = "left"; @@ -1327,10 +1339,9 @@ ui.prototype.drawBookDetail = function (index) { var enemyId=enemy.id; var hints=core.enemys.getSpecialHint(core.material.enemys[enemyId]); - if (hints.length==0) { - core.drawTip("该怪物无特殊属性!"); - return; - } + + if (hints.length==0) + hints.push("该怪物无特殊属性。"); var content=hints.join("\n"); core.status.event.id = 'book-detail'; diff --git a/project/data.comment.js b/project/data.comment.js index 92601f77..464163fa 100644 --- a/project/data.comment.js +++ b/project/data.comment.js @@ -488,6 +488,12 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = "_bool": "bool", "_data": "是否地图怪物显伤;用户可以手动在菜单栏中开关" }, + "displayCritical": { + "_leaf": true, + "_type": "checkbox", + "_bool": "bool", + "_data": "是否地图显示临界;用户可以手动在菜单栏中开关" + }, "displayExtraDamage": { "_leaf": true, "_type": "checkbox", diff --git a/project/data.js b/project/data.js index 1059227c..247bd3a7 100644 --- a/project/data.js +++ b/project/data.js @@ -142,13 +142,13 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "enableLevelUp": false, "enableDebuff": false, "flyNearStair": true, - "pickaxeFourDirections": true, - "bombFourDirections": true, + "pickaxeFourDirections": false, + "bombFourDirections": false, "bigKeyIsBox": false, - "equipment": true, + "equipment": false, "enableDeleteItem": true, "enableAddPoint": false, - "enableNegativeDamage": true, + "enableNegativeDamage": false, "hatredDecrease": true, "betweenAttackCeil": false, "startDirectly": false, @@ -156,6 +156,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "showBattleAnimateConfirm": true, "battleAnimate": true, "displayEnemyDamage": true, + "displayCritical": true, "displayExtraDamage": true, "enableGentleClick": true, "potionWhileRouting": false, diff --git a/project/functions.js b/project/functions.js index e7add5db..03d7c3f0 100644 --- a/project/functions.js +++ b/project/functions.js @@ -116,8 +116,11 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = var enemy = core.material.enemys[enemyId]; + var damage = core.enemys.getDamage(enemyId); + if (damage == null) damage = core.status.hero.hp+1; + // 扣减体力值 - core.status.hero.hp -= core.enemys.getDamage(enemyId); + core.status.hero.hp -= damage; if (core.status.hero.hp<=0) { core.status.hero.hp=0; core.updateStatusBar(); diff --git a/更新说明.txt b/更新说明.txt index b5533ed8..4a0336d1 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -2,6 +2,8 @@ 编辑器添加“新建空白地图”按钮 √ 编辑器的地图自动保存 √ +大数据魔塔的支持(临界计算等) +支持用gif动图作为某层楼的背景图 APP端也能下载录像 图片显示增加淡入淡出效果 录像的倒退 @@ -9,7 +11,7 @@ APP端也能下载录像 单个存档清理 魔龙和章鱼添加到样板 大数据魔塔的显示 √ -修改999999999的上界问题 +修改999999999的上界问题 √ 修复有时候无法输入ID的问题 修复坐标等不能为负数的问题 其他细节优化