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的问题
修复坐标等不能为负数的问题
其他细节优化