diff --git a/_server/editor_file.js b/_server/editor_file.js index 47269812..f12f1590 100644 --- a/_server/editor_file.js +++ b/_server/editor_file.js @@ -125,6 +125,7 @@ editor_file = function (editor, callback) { name: "0", canFlyTo: true, canUseQuickShop: true, + cannotViewMap: false, images: [], item_ratio: 1, firstArrive: [], diff --git a/docs/element.md b/docs/element.md index 246dd695..83ee5d5c 100644 --- a/docs/element.md +++ b/docs/element.md @@ -165,6 +165,8 @@ floorId指定的是目标楼层的唯一标识符(ID)。 可以指定time,指定后切换动画时长为指定的数值。 +**从2.1.1开始,楼层属性中提供了`upFloor`和`downFloor`两项。如果设置此项(比如`"upFloor": [2,3]`),则写stair:upFloor或者楼传器的落点将用此点来替换楼梯位置(即类似于RM中的上箭头)。** + ## 动画和天气系统 现在我们的H5魔塔支持播放动画,也支持天气系统了。 diff --git a/libs/actions.js b/libs/actions.js index af7224ef..fd89396e 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -694,8 +694,8 @@ actions.prototype.onmousewheel = function (direct) { // 浏览地图 if (core.status.lockControl && core.status.event.id == 'viewMaps') { - if (direct==1) core.ui.drawMaps(core.status.event.data+1); - if (direct==-1) core.ui.drawMaps(core.status.event.data-1); + if (direct==1) this.clickViewMaps(6,2); + if (direct==-1) this.clickViewMaps(6,10); return; } } @@ -927,11 +927,21 @@ actions.prototype.keyUpFly = function (keycode) { ////// 查看地图界面时的点击操作 ////// actions.prototype.clickViewMaps = function (x,y) { + var now = core.floorIds.indexOf(core.status.floorId); + var nextId = core.status.event.data; if(y<=4) { - core.ui.drawMaps(core.status.event.data+1); + nextId++; + while (nextId=8) { - core.ui.drawMaps(core.status.event.data-1); + nextId--; + while (nextId>=0 && nextId!=now && core.floors[core.floorIds[nextId]].cannotViewMap) + nextId--; + if (nextId>=0) + core.ui.drawMaps(nextId); } else { core.clearMap('data', 0, 0, 416, 416); @@ -942,8 +952,12 @@ actions.prototype.clickViewMaps = function (x,y) { ////// 查看地图界面时,按下某个键的操作 ////// actions.prototype.keyDownViewMaps = function (keycode) { - if (keycode==37 || keycode==38 || keycode==33) core.ui.drawMaps(core.status.event.data+1); - else if (keycode==39 || keycode==40 || keycode==34) core.ui.drawMaps(core.status.event.data-1); + if (keycode==37 || keycode==38 || keycode==33) { + this.clickViewMaps(6,2); + } + else if (keycode==39 || keycode==40 || keycode==34) { + this.clickViewMaps(6,10); + } return; } diff --git a/libs/control.js b/libs/control.js index dfbc18d5..f3a057b9 100644 --- a/libs/control.js +++ b/libs/control.js @@ -874,6 +874,11 @@ control.prototype.updateCheckBlock = function() { core.status.checkBlock.map[13*block.x+block.y]=id; } } + // 血网 + if (core.isset(block.event) && !(core.isset(block.enable) && !block.enable) && + block.event.id=='lavaNet' && block.event.trigger=='passNet' && !core.hasItem("shoes")) { + core.status.checkBlock.map[13*block.x+block.y]="lavaNet"; + } } // Step2: 更新领域、阻击伤害 @@ -884,7 +889,13 @@ control.prototype.updateCheckBlock = function() { for (var y=0;y<13;y++) { var id = core.status.checkBlock.map[13*x+y]; if (core.isset(id)) { - var enemy = core.enemys.getEnemys(id); + + if (id=="lavaNet") { + core.status.checkBlock.damage[13*x+y]+=core.values.lavaDamage; + continue; + } + + var enemy = core.material.enemys[id]; // 存在领域 if (core.enemys.hasSpecial(enemy.special, 15)) { var range = enemy.range || 1; @@ -925,8 +936,8 @@ control.prototype.updateCheckBlock = function() { var id1=core.status.checkBlock.map[13*(x-1)+y], id2=core.status.checkBlock.map[13*(x+1)+y]; if (core.isset(id1) && core.isset(id2) && id1==id2) { - var enemy = core.enemys.getEnemys(id1); - if (core.enemys.hasSpecial(enemy.special, 16)) { + var enemy = core.material.enemys[id1]; + if (core.isset(enemy) && core.enemys.hasSpecial(enemy.special, 16)) { has = true; } } @@ -935,8 +946,8 @@ control.prototype.updateCheckBlock = function() { var id1=core.status.checkBlock.map[13*x+y-1], id2=core.status.checkBlock.map[13*x+y+1]; if (core.isset(id1) && core.isset(id2) && id1==id2) { - var enemy = core.enemys.getEnemys(id1); - if (core.enemys.hasSpecial(enemy.special, 16)) { + var enemy = core.material.enemys[id1]; + if (core.isset(enemy) && core.enemys.hasSpecial(enemy.special, 16)) { has = true; } } @@ -982,6 +993,9 @@ control.prototype.checkBlock = function () { if (core.status.checkBlock.betweenAttack[13*x+y] && damage>0) { core.drawTip('受到夹击,生命变成一半'); } + else if (core.status.checkBlock.map[13*x+y]=='lavaNet') { + core.drawTip('受到血网伤害'+damage+'点'); + } // 阻击 else if (snipe.length>0 && damage>0) { core.drawTip('受到阻击伤害'+damage+'点'); diff --git a/libs/events.js b/libs/events.js index f1e26f9c..77f37f19 100644 --- a/libs/events.js +++ b/libs/events.js @@ -884,12 +884,19 @@ events.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback heroLoc = core.status.hero.loc; if (core.isset(stair)) { if (!core.isset(heroLoc)) heroLoc={}; - var blocks = core.status.maps[floorId].blocks; - for (var i in blocks) { - if (core.isset(blocks[i].event) && !(core.isset(blocks[i].enable) && !blocks[i].enable) && blocks[i].event.id === stair) { - heroLoc.x = blocks[i].x; - heroLoc.y = blocks[i].y; - break; + + if (core.isset(core.floors[floorId][stair])) { + heroLoc.x = core.floors[floorId][stair][0]; + heroLoc.y = core.floors[floorId][stair][1]; + } + else { + var blocks = core.status.maps[floorId].blocks; + for (var i in blocks) { + if (core.isset(blocks[i].event) && !(core.isset(blocks[i].enable) && !blocks[i].enable) && blocks[i].event.id === stair) { + heroLoc.x = blocks[i].x; + heroLoc.y = blocks[i].y; + break; + } } } if (!core.isset(heroLoc.x)) { @@ -1162,6 +1169,8 @@ events.prototype.passNet = function (data) { // 有鞋子 if (core.hasItem('shoes')) return; if (data.event.id=='lavaNet') { // 血网 + // 在checkBlock中进行处理 + /* core.status.hero.hp -= core.values.lavaDamage; if (core.status.hero.hp<=0) { core.status.hero.hp=0; @@ -1169,7 +1178,8 @@ events.prototype.passNet = function (data) { core.events.lose(); return; } - core.drawTip('经过血网,生命-'+core.values.lavaDamage); + */ + // core.drawTip('经过血网,生命-'+core.values.lavaDamage); } if (data.event.id=='poisonNet') { // 毒网 if (core.hasFlag('poison')) return; diff --git a/libs/loader.js b/libs/loader.js index d5271bb2..969f4f54 100644 --- a/libs/loader.js +++ b/libs/loader.js @@ -30,7 +30,12 @@ loader.prototype.load = function (callback) { core.loader.loadImages(core.materials, core.material.images, function () { // 加载png图片 core.material.images.images = {}; - core.loader.loadImages(core.images, core.material.images.images, function () { + + var images = core.clone(core.images); + if (images.indexOf("hero.png")<0) + images.push("hero.png"); + + core.loader.loadImages(images, core.material.images.images, function () { // 加载autotile core.material.images.autotile = {}; core.loader.loadImages(Object.keys(core.material.icons.autotile), core.material.images.autotile, function () { diff --git a/project/comment.js b/project/comment.js index 835335bc..0a138152 100644 --- a/project/comment.js +++ b/project/comment.js @@ -256,6 +256,24 @@ comment_c456ea59_6018_45ef_8bcc_211a24c627dc = "_bool": "bool", "_data": "该层是否允许使用快捷商店" }, + "cannotViewMap": { + "_leaf": true, + "_type": "checkbox", + "_bool": "bool", + "_data": "该层是否不允许被浏览地图看到;如果勾上则浏览地图会跳过该层" + }, + "upFloor": { + "_leaf": true, + "_type": "textarea", + "_range": "thiseval==null||((thiseval instanceof Array) && thiseval.length==2)", + "_data": "该层上楼点,如[2,3]。\n如果此项不为null,则楼层转换时的stair:upFloor,以及楼传器的落点会被替换成该点而不是该层的上楼梯。" + }, + "downFloor": { + "_leaf": true, + "_type": "textarea", + "_range": "thiseval==null||((thiseval instanceof Array) && thiseval.length==2)", + "_data": "该层上楼点,如[2,3]。\n如果此项不为null,则楼层转换时的stair:downFloor,以及楼传器的落点会被替换成该点而不是该层的下楼梯。" + }, "defaultGround": { "_leaf": true, "_type": "select", diff --git a/project/data.comment.js b/project/data.comment.js index c33ab63e..ee5745da 100644 --- a/project/data.comment.js +++ b/project/data.comment.js @@ -135,7 +135,7 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = "constants": { "_leaf": true, "_type": "textarea", - "_data": "初始永久道具个数,例如初始送手册可以写 {'book': true}" + "_data": "初始永久道具个数,例如初始送手册可以写 {'book': 1}" }, "tools": { "_leaf": true, diff --git a/project/floors/MT0.js b/project/floors/MT0.js index 1d9f492e..1a3d76b8 100644 --- a/project/floors/MT0.js +++ b/project/floors/MT0.js @@ -1,56 +1,35 @@ -main.floors.MT0 = +main.floors.MT0= { - "floorId": "MT0", // 这里需要改楼层名,请和文件名及下面的floorId保持完全一致 - // 楼层唯一标识符仅能由字母、数字、下划线组成,且不能由数字开头 - // 推荐用法:第20层就用MT20,第38层就用MT38,地下6层就用MT_6(用下划线代替负号),隐藏3层用MT3h(h表示隐藏),等等 - // 楼层唯一标识符,需要和名字完全一致 - "title": "主塔 0 层", // 楼层中文名 - "name": "0", // 显示在状态栏中的层数 - "canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器) - "canUseQuickShop": true, // 该层是否允许使用快捷商店 - "defaultGround": "ground", // 默认地面的图块ID(terrains中) - "images": [], // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。 - // "color": [0,0,0,0.3], // 该层的默认画面色调。本项可不写(代表无色调),如果写需要是一个RGBA数组。 - // "weather": ["snow",5], // 该层的默认天气。本项可忽略表示晴天,如果写则第一项为"rain"或"snow"代表雨雪,第二项为1-10之间的数代表强度。 - // "bgm": "bgm.mp3", // 到达该层后默认播放的BGM。本项可忽略。 - "item_ratio": 1, // 该层的宝石/血瓶倍率 - "map": [ // 地图数据,需要是13x13,建议使用地图生成器来生成 - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - ], - "firstArrive": [ // 第一次到该楼层触发的事件 - - ], - "events": { // 该楼的所有可能事件列表 - - }, - "changeFloor": { // 楼层转换事件;该事件不能和上面的events有冲突(同位置点),否则会被覆盖 - - }, - "afterBattle": { // 战斗后可能触发的事件列表 - - }, - "afterGetItem": { // 获得道具后可能触发的事件列表 - - }, - "afterOpenDoor": { // 开完门后可能触发的事件列表 - - }, - "cannotMove": { // 每个图块不可通行的方向 - // 可以在这里定义每个点不能前往哪个方向,例如悬崖边不能跳下去 - // "x,y": ["up", "left"], // (x,y)点不能往上和左走 - - }, -} - +"floorId": "MT0", +"title": "主塔 0 层", +"name": "0", +"canFlyTo": true, +"canUseQuickShop": true, +"cannotViewMap": false, +"defaultGround": "ground", +"images": [], +"item_ratio": 1, +"map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0,246, 11,246, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 11,219, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0,246, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], +"firstArrive": [], +"events": {}, +"changeFloor": {}, +"afterBattle": {}, +"afterGetItem": {}, +"afterOpenDoor": {}, +"cannotMove": {}, +"upFloor": null, +} \ No newline at end of file diff --git a/更新说明.txt b/更新说明.txt index 0fcf8d06..8f043eab 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -1,16 +1,29 @@ -HTML5魔塔样板V2.1 +HTML5魔塔样板V2.1.1 -编辑器添加新建和删除按钮;地图自动保存 √ -录像支持倒退(录像播放中每20步自动存档,最多存30个) √ -Gif支持:可以作为楼层背景图或者使用显示动图事件 √ -图片显示增加淡入淡出效果 √ -APP端也能下载或读取文件 √ -地图临界显伤 √ -单个存档清理 √ -大数据魔塔的支持(临界计算等) √ -进一步对JS文件和图标进行压缩,大幅提高加载速度 √ -修复有时候无法输入ID的问题 √ -其他细节优化 √ +改变勇士行走图 +楼传器落点设置 √ +录像回放从任意存档点开始 +录像过程中允许存档 +血网显伤 √ +重置当前楼层地图core.resetMap() √ +部分楼层不允许浏览地图 √ +其他细节优化 + +----------------------------------------------------------------------- + +HTML5魔塔样板V2.1 + +编辑器添加新建和删除按钮;地图自动保存 +录像支持倒退(录像播放中每20步自动存档,最多存30个) +Gif支持:可以作为楼层背景图或者使用显示动图事件 +图片显示增加淡入淡出效果 +APP端也能下载或读取文件 +地图临界显伤 +单个存档清理 +大数据魔塔的支持(临界计算等) +进一步对JS文件和图标进行压缩,大幅提高加载速度 +修复有时候无法输入ID的问题 +其他细节优化 -----------------------------------------------------------------------