diff --git a/images/terrains.png b/images/terrains.png index 594ea615..a28642a0 100644 Binary files a/images/terrains.png and b/images/terrains.png differ diff --git a/index.html b/index.html index f474ad47..fb79075f 100644 --- a/index.html +++ b/index.html @@ -35,7 +35,6 @@ 关于本塔
- 简单 普通 困难 diff --git a/libs/core.js b/libs/core.js index 831c1e41..9c69577f 100644 --- a/libs/core.js +++ b/libs/core.js @@ -1558,21 +1558,146 @@ core.prototype.drawMap = function (mapName, callback) { core.canvas.bg.drawImage(blockImage, 0, blockIcon * 32, 32, 32, x * 32, y * 32, 32, 32); } } + var autotileMaps = []; for (var b = 0; b < mapBlocks.length; b++) { // 事件启用 - if (core.isset(mapBlocks[b].event) && !(core.isset(mapBlocks[b].enable) && !mapBlocks[b].enable)) { - blockIcon = core.material.icons[mapBlocks[b].event.cls][mapBlocks[b].event.id]; - blockImage = core.material.images[mapBlocks[b].event.cls]; - core.canvas.event.drawImage(core.material.images[mapBlocks[b].event.cls], 0, blockIcon * 32, 32, 32, mapBlocks[b].x * 32, mapBlocks[b].y * 32, 32, 32); - core.addGlobalAnimate(mapBlocks[b].event.animate, mapBlocks[b].x * 32, mapBlocks[b].y * 32, blockIcon, blockImage); + var block = mapBlocks[b]; + if (core.isset(block.event) && !(core.isset(block.enable) && !block.enable)) { + if (block.event.cls == 'autotile') { + // core.drawAutotile(); + autotileMaps[13*block.x + block.y] = true; + continue; + } + else { + blockIcon = core.material.icons[block.event.cls][block.event.id]; + blockImage = core.material.images[block.event.cls]; + core.canvas.event.drawImage(core.material.images[block.event.cls], 0, blockIcon * 32, 32, 32, block.x * 32, block.y * 32, 32, 32); + core.addGlobalAnimate(block.event.animate, block.x * 32, block.y * 32, blockIcon, blockImage); + } } } + core.drawAutotile('event', autotileMaps, 0, 0, 32); core.setGlobalAnimate(core.values.animateSpeed); if (core.isset(callback)) callback(); } +core.prototype.drawAutotile = function (canvas, autotileMaps, left, top, size) { + var isAutotile = function(x, y) { + if (x<0 || x>12 || y<0 || y>12) return 0; + return autotileMaps[13*x+y]?1:0; + } + for (var xx=0;xx<13;xx++) { + for (var yy=0;yy<13;yy++) { + if (isAutotile(xx, yy)) { + // 绘制autotile + var id=isAutotile(xx, yy - 1) + 2 * isAutotile(xx - 1, yy) + 4 * isAutotile(xx, yy + 1) + 8 * isAutotile(xx + 1, yy); + core.drawAutotileBlock(canvas, left + xx * size, top + yy * size, size, core.material.images.autotile, id); + } + } + } + for (var xx=0;xx<13;xx++) { + for (var yy=0;yy<13;yy++) { + if (isAutotile(xx, yy) + isAutotile(xx + 1, yy) + isAutotile(xx + 1, yy + 1) + isAutotile(xx, yy + 1) != 3) continue; + if (!isAutotile(xx, yy)) { + core.drawAutotileBlock(canvas, left + xx * size + size, top + yy * size + size, size, core.material.images.autotile, 16); + } + if (!isAutotile(xx + 1, yy)) { + core.drawAutotileBlock(canvas, left + xx * size + size / 2, top + yy * size + size, size, core.material.images.autotile, 17); + } + if (!isAutotile(xx + 1, yy + 1)) { + core.drawAutotileBlock(canvas, left + xx * size + size / 2, top + yy * size + size / 2, size, core.material.images.autotile, 18); + } + if (!isAutotile(xx, yy + 1)) { + core.drawAutotileBlock(canvas, left + xx * size + size, top + yy * size + size / 2, size, core.material.images.autotile, 19); + } + } + } +} + +core.prototype.drawAutotileBlock = function (map, x, y, size, autotile, index) { + var canvas = core.canvas[map]; + var blockIcon = core.material.icons.terrains.ground; + var blockImage = core.material.images.terrains; + switch (index) { + case 0: + canvas.drawImage(autotile, 0, 0, 32, 32, x, y, size, size); + break; + case 1: + canvas.drawImage(autotile, 0, 3 * 32, 16, 32, x, y, size / 2, size); + canvas.drawImage(autotile, 2 * 32 + 16, 3 * 32, 16, 32, x + size / 2, y, size / 2, size); + break; + case 2: + canvas.drawImage(autotile, 2 * 32, 32, 32, 16, x, y, size, size / 2); + canvas.drawImage(autotile, 2 * 32, 3 * 32 + 16, 32, 16, x, y + size / 2, size, size / 2); + break; + case 3: + canvas.drawImage(autotile, 2 * 32, 3 * 32, 32, 32, x, y, size, size); + break; + case 4: + canvas.drawImage(autotile, 0, 1 * 32, 16, 32, x, y, size / 2, size); + canvas.drawImage(autotile, 2 * 32 + 16, 1 * 32, 16, 32, x + size / 2, y, size / 2, size); + break; + case 5: + canvas.drawImage(autotile, 0, 2 * 32, 16, 32, x, y, size / 2, size); + canvas.drawImage(autotile, 2 * 32 + 16, 2 * 32, 16, 32, x + size / 2, y, size / 2, size); + break; + case 6: + canvas.drawImage(autotile, 2 * 32, 1 * 32, 32, 32, x, y, size, size); + break; + case 7: + canvas.drawImage(autotile, 2 * 32, 2 * 32, 32, 32, x, y, size, size); + break; + case 8: + canvas.drawImage(autotile, 0, 32, 32, 16, x, y, size, size / 2); + canvas.drawImage(autotile, 0, 3 * 32 + 16, 32, 16, x, y + size / 2, size, size / 2); + break; + case 9: + canvas.drawImage(autotile, 0, 3 * 32, 32, 32, x, y, size, size); + break; + case 10: + canvas.drawImage(autotile, 32, 32, 32, 16, x, y, size, size / 2); + canvas.drawImage(autotile, 32, 3 * 32 + 16, 32, 16, x, y + size / 2, size, size / 2); + break; + case 11: + canvas.drawImage(autotile, 32, 3 * 32, 32, 32, x, y, size, size); + break; + case 12: + canvas.drawImage(autotile, 0, 32, 32, 32, x, y, size, size); + break; + case 13: + canvas.drawImage(autotile, 0, 2 * 32, 32, 32, x, y, size, size); + break; + case 14: + canvas.drawImage(autotile, 32, 32, 32, 32, x, y, size, size); + break; + case 15: + canvas.drawImage(autotile, 32, 2 * 32, 32, 32, x, y, size, size); + break; + case 16: + canvas.clearRect(x, y, size / 2, size / 2); + canvas.drawImage(blockImage, 0, blockIcon * 32, 16, 16, x, y, size / 2, size / 2); + canvas.drawImage(autotile, 2 * 32, 0, 16, 16, x, y, size / 2, size / 2); + break; + case 17: + canvas.clearRect(x, y, size / 2, size / 2); + canvas.drawImage(blockImage, 0, blockIcon * 32, 16, 16, x, y, size / 2, size / 2); + canvas.drawImage(autotile, 2 * 32 + 16, 0, 16, 16, x, y, size / 2, size / 2); + break; + case 18: + canvas.clearRect(x, y, size / 2, size / 2); + canvas.drawImage(blockImage, 0, blockIcon * 32, 16, 16, x, y, size / 2, size / 2); + canvas.drawImage(autotile, 2 * 32 + 16, 16, 16, 16, x, y, size / 2, size / 2); + break; + case 19: + canvas.clearRect(x, y, size / 2, size / 2); + canvas.drawImage(blockImage, 0, blockIcon * 32, 16, 16, x, y, size / 2, size / 2); + canvas.drawImage(autotile, 2 * 32, 16, 16, 16, x, y, size / 2, size / 2); + break; + } +} + core.prototype.noPassExists = function (x, y, floorId) { var block = core.getBlock(x,y,floorId); if (block==null) return false; diff --git a/libs/enemys.js b/libs/enemys.js index 625ddd3a..2676753c 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -182,8 +182,10 @@ enemys.prototype.calDamage = function (hero_atk, hero_def, hero_mdef, mon_hp, mo if (this.hasSpecial(mon_special, 4)) per_damage *= 2; if (this.hasSpecial(mon_special, 5)) per_damage *= 3; if (this.hasSpecial(mon_special, 6)) per_damage *= 4; + + var counterDamage = 0; // 反击 - if (this.hasSpecial(mon_special, 8)) per_damage += parseInt(core.values.counterAttack * hero_atk); + if (this.hasSpecial(mon_special, 8)) counterDamage += parseInt(core.values.counterAttack * hero_atk); // 先攻 var damage = mon_special == 1 ? per_damage : 0; @@ -193,7 +195,7 @@ enemys.prototype.calDamage = function (hero_atk, hero_def, hero_mdef, mon_hp, mo if (this.hasSpecial(mon_special, 9)) damage = core.values.purify * hero_mdef; var turn = parseInt((mon_hp - 1) / (hero_atk - mon_def)); - var ans = damage + turn * per_damage; + var ans = damage + turn * per_damage + (turn + 1) * counterDamage; ans -= hero_mdef; // 魔防回血 diff --git a/libs/events.js b/libs/events.js index 8e69ab73..b00e6e0e 100644 --- a/libs/events.js +++ b/libs/events.js @@ -39,6 +39,11 @@ events.prototype.init = function () { if (core.isset(callback)) callback(); }, + "changeLight": function (data, core, callback) { + core.events.changeLight(data.x, data.y); + if (core.isset(callback)) + callback(); + }, 'action': function (data, core, callback) { core.events.doEvents(data.event.data, data.x, data.y); if (core.isset(callback)) callback(); @@ -577,6 +582,27 @@ events.prototype.passNet = function (data) { core.updateStatusBar(); } +events.prototype.changeLight = function(x, y) { + var block = core.getBlock(x, y); + if (block==null) return; + var index = block.index; + block = block.block; + if (block.event.id != 'light') return; + // 改变为dark + block.id = 166; + block.event = {'cls': 'terrains', 'id': 'darkLight', 'noPass': true}; + // 更新地图 + core.canvas.event.clearRect(x * 32, y * 32, 32, 32); + var blockIcon = core.material.icons[block.event.cls][block.event.id]; + core.canvas.event.drawImage(core.material.images[block.event.cls], 0, blockIcon * 32, 32, 32, block.x * 32, block.y * 32, 32, 32); + this.afterChangeLight(); +} + +// 改变灯后的事件 +events.prototype.afterChangeLight = function() { + +} + // 存档事件前一刻的处理 events.prototype.beforeSaveData = function(data) { diff --git a/libs/floors/sample0.js b/libs/floors/sample0.js index a53520b8..e31aea3f 100644 --- a/libs/floors/sample0.js +++ b/libs/floors/sample0.js @@ -8,12 +8,12 @@ main.floors.sample0 = { "canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器) "canUseQuickShop": true, // 该层是否允许使用快捷商店 "map": [ // 地图数据,需要是13x13,建议使用地图生成器来生成 - [0, 0, 220, 0, 0, 6, 87, 3, 65, 64, 44, 43, 42], - [0, 246, 0, 246, 0, 6, 0, 3, 58, 59, 60, 61, 41], - [219, 0, 0, 0, 219, 6, 0, 3, 57, 26, 62, 63, 40], - [6, 6, 125, 6, 6, 6, 0, 3, 53, 54, 55, 56, 39], + [0, 0, 220, 0, 0, 20, 87, 3, 65, 64, 44, 43, 42], + [0, 246, 0, 246, 0, 20, 0, 3, 58, 59, 60, 61, 41], + [219, 0, 0, 0, 219, 20, 0, 3, 57, 26, 62, 63, 40], + [20, 20, 20, 20, 20, 20, 0, 3, 53, 54, 55, 56, 39], [216, 247, 256, 235, 248, 6, 0, 3, 49, 50, 51, 52, 38], - [5, 5, 125, 5, 5, 5, 0, 1, 45, 46, 47, 48, 37], + [6, 6, 125, 6, 6, 6, 0, 1, 45, 46, 47, 48, 37], [224, 254, 212, 232, 204, 5, 0, 1, 31, 32, 34, 33, 36], [201, 205, 217, 215, 207, 5, 0, 1, 27, 28, 29, 30, 35], [5, 5, 125, 5, 5, 5, 0, 1, 21, 22, 23, 24, 25], diff --git a/libs/floors/sample1.js b/libs/floors/sample1.js index ca1ae611..4104b7b1 100644 --- a/libs/floors/sample1.js +++ b/libs/floors/sample1.js @@ -8,11 +8,11 @@ main.floors.sample1 = { "canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器) "canUseQuickShop": true, // 该层是否允许使用快捷商店 "map": [ // 地图数据,需要是13x13,建议使用地图生成器来生成 - [7, 131, 8, 2, 9, 130, 10, 2, 0, 0, 132, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0], + [7, 131, 8, 2, 9, 130, 10, 2, 166, 165, 132, 165, 166], + [0, 0, 0, 0, 0, 0, 0, 2, 165, 164, 0, 162, 165], [2, 2, 2, 2, 121, 2, 2, 2, 0, 0, 229, 0, 0], - [43, 33, 44, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0], - [21, 22, 21, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0], + [43, 33, 44, 1, 0, 0, 0, 2, 165, 161, 0, 163, 165], + [21, 22, 21, 1, 0, 0, 0, 2, 166, 165, 0, 165, 166], [1, 245, 1, 1, 0, 87, 0, 2, 2, 2, 85, 2, 2], [0, 246, 0, 1, 0, 0, 0, 2, 2, 221, 0, 221, 2], [246, 0, 246, 1, 0, 0, 0, 121, 85, 0, 0, 0, 2], diff --git a/libs/icons.js b/libs/icons.js index 1fc2eac8..f35d9b86 100644 --- a/libs/icons.js +++ b/libs/icons.js @@ -29,7 +29,13 @@ icons.prototype.init = function () { 'blueShop-left': 15, 'blueShop-right': 16, 'pinkShop-left': 17, - 'pinkShop-right': 18 + 'pinkShop-right': 18, + 'up': 19, + 'down': 20, + 'left': 21, + 'right': 22, + 'light': 23, + 'darkLight': 24 }, 'animates': { 'star': 0, diff --git a/libs/maps.js b/libs/maps.js index 5a929f2f..38106fe4 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -63,7 +63,7 @@ maps.prototype.getBlock = function (x, y, id) { var tmp = {'x': x, 'y': y, 'id': id}; if (enable!=null) tmp.enable = enable; - // 0-9 地形 + // 0-20 地形 if (id == 1) tmp.event = {'cls': 'terrains', 'id': 'yellowWall'}; // 黄墙 if (id == 2) tmp.event = {'cls': 'terrains', 'id': 'whiteWall'}; // 白墙 if (id == 3) tmp.event = {'cls': 'terrains', 'id': 'blueWall'}; // 白墙 @@ -79,6 +79,8 @@ maps.prototype.getBlock = function (x, y, id) { if (id == 13) tmp.event = {'cls': 'animates', 'id': 'weakNet', 'noPass': false, 'trigger': 'passNet'}; // 衰网 if (id == 14) tmp.event = {'cls': 'animates', 'id': 'curseNet', 'noPass': false, 'trigger': 'passNet'}; // 咒网 + if (id == 20) tmp.event = {'cls': 'autotile', 'id': 'autotile', 'noPass': true}; + // 21-80 物品 if (id == 21) tmp.event = {'cls': 'items', 'id': 'yellowKey'}; // 黄钥匙 if (id == 22) tmp.event = {'cls': 'items', 'id': 'blueKey'}; // 蓝钥匙 @@ -157,6 +159,13 @@ maps.prototype.getBlock = function (x, y, id) { if (id == 131) tmp.event = {'cls': 'npcs', 'id': 'blueShop'}; if (id == 132) tmp.event = {'cls': 'npcs', 'id': 'princess'}; + // 161-200 其他(单向箭头、灯、箱子等等) + if (id == 161) tmp.event = {'cls': 'terrains', 'id': 'up'}; // 单向上箭头 + if (id == 162) tmp.event = {'cls': 'terrains', 'id': 'down'}; // 单向下箭头 + if (id == 163) tmp.event = {'cls': 'terrains', 'id': 'left'}; // 单向左箭头 + if (id == 164) tmp.event = {'cls': 'terrains', 'id': 'right'}; // 单向右箭头 + if (id == 165) tmp.event = {'cls': 'terrains', 'id': 'light', 'trigger': 'changeLight', 'noPass': false}; // 灯 + if (id == 166) tmp.event = {'cls': 'terrains', 'id': 'darkLight', 'noPass': true}; // 暗灯 // 201-300 怪物 if (id == 201) tmp.event = {'cls': 'enemys', 'id': 'greenSlime'}; diff --git a/libs/ui.js b/libs/ui.js index 9ee04878..d70c7551 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -570,6 +570,27 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { core.canvas.data.textAlign='left'; core.fillText('data', mon_hp, right_start, top+margin+10+26, '#DDDDDD', 'bold 16px Verdana'); + // 反击 + if (core.enemys.hasSpecial(mon_special, 8)) { + var counterDamage = parseInt(core.values.counterAttack * hero_atk); + hero_mdef -= counterDamage; + + if (hero_mdef<0) { + hero_hp+=hero_mdef; + hero_mdef=0; + } + // 更新勇士数据 + core.clearMap('data', left_start, top+margin+10, lineWidth, 40); + core.canvas.data.textAlign='right'; + core.fillText('data', hero_hp, left_end, top+margin+10+26, '#DDDDDD', 'bold 16px Verdana'); + + if (core.flags.enableMDef) { + core.clearMap('data', left_start, top+margin+10+3*lineHeight, lineWidth, 40); + core.fillText('data', hero_mdef, left_end, top+margin+10+26+3*lineHeight); + } + + } + } else { // 怪物攻击 @@ -580,7 +601,7 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { }, 250); var per_damage = mon_atk-hero_def; - if (core.enemys.hasSpecial(mon_special, 8)) per_damage += parseInt(core.values.counterAttack * hero_atk); // 反击 + if (per_damage < 0) per_damage = 0; hero_mdef-=per_damage; if (hero_mdef<0) { @@ -992,16 +1013,24 @@ ui.prototype.drawThumbnail = function(canvas, blocks, x, y, size, heroLoc) { core.canvas[canvas].drawImage(blockImage, 0, blockIcon * 32, 32, 32, x + i * persize, y + j * persize, persize, persize); } } + var autotileMaps = []; for (var b in blocks) { var block = blocks[b]; if (core.isset(block.event) && !(core.isset(block.enable) && !block.enable)) { - var i = block.x, j = block.y; - var blockIcon = core.material.icons[block.event.cls][block.event.id]; - var blockImage = core.material.images[block.event.cls]; - //core.canvas[canvas].clearRect(x + i * persize, y + j * persize, persize, persize); - core.canvas[canvas].drawImage(blockImage, 0, blockIcon * 32, 32, 32, x + i * persize, y + j * persize, persize, persize); + if (block.event.cls == 'autotile') { + // core.drawAutotile(); + autotileMaps[13*block.x + block.y] = true; + continue; + } + else { + var blockIcon = core.material.icons[block.event.cls][block.event.id]; + var blockImage = core.material.images[block.event.cls]; + core.canvas[canvas].drawImage(blockImage, 0, blockIcon * 32, 32, 32, x + block.x * persize, y + block.y * persize, persize, persize); + } } } + core.drawAutotile('ui', autotileMaps, x, y, persize); + if (core.isset(heroLoc)) { var heroIcon = core.material.icons.hero[heroLoc.direction]; var height = core.material.icons.hero.height; diff --git a/main.js b/main.js index 736ef6b9..4e7bcec1 100644 --- a/main.js +++ b/main.js @@ -40,7 +40,7 @@ function main() { ]; // console.log('加载js文件列表加载完成' + this.loadList); this.images = [ - 'animates', 'enemys', 'hero', 'items', 'npcs', 'terrains' + 'animates', 'enemys', 'hero', 'items', 'npcs', 'terrains', "autotile" ]; this.sounds = { 'mp3': ['bgm-loop', 'floor'], diff --git a/test/autotile.png b/test/autotile.png deleted file mode 100644 index 18e92ecf..00000000 Binary files a/test/autotile.png and /dev/null differ diff --git a/test/grassAutotile.html b/test/grassAutotile.html deleted file mode 100644 index 4d452305..00000000 --- a/test/grassAutotile.html +++ /dev/null @@ -1,377 +0,0 @@ - - - - - - - - - - - - - - - -

通过鼠标拖拽或点击添加草地

- - - - - - \ No newline at end of file diff --git a/更新内容.txt b/更新内容.txt index d67dbba6..39e845ca 100644 --- a/更新内容.txt +++ b/更新内容.txt @@ -3,4 +3,4 @@ 新增:单向箭头、感叹号 快捷道具使用:1破2炸3飞;读档改为D键 √ 更多的默认素材;无需P图,直接替换即可 -破甲、反击、净化等效果放全局变量 +破甲、反击、净化等效果放全局变量 √