From ad3272f23e68ab9fb93115d7892105af43b0e0a2 Mon Sep 17 00:00:00 2001 From: oc Date: Sat, 20 Jan 2018 23:49:26 +0800 Subject: [PATCH] Update V1.3.2 --- README.md | 9 +++++++++ docs/api.md | 13 ++++++++++++- docs/element.md | 6 +++--- docs/event.md | 23 ++++++++++++++++++++++- docs/start.md | 6 ++++-- libs/enemys.js | 11 ++++++++++- libs/events.js | 10 ++++++++++ libs/maps.js | 4 ++-- main.js | 3 +-- 更新说明.txt | 13 ++++++++++++- 10 files changed, 85 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 66428b22..5b33f1e2 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,15 @@ HTML5 canvas制作的魔塔样板,支持全平台游戏! ## 更新说明 +### 2018.1.21 V1.3.2 + +[x] 增加录像和回放功能。 +[x] 增加统计功能,现在能看到每部塔的游戏人数、通关人数和当前MAX了。 +[x] 增加浏览地图功能,玩家可以快速查看每层楼的地图。 +[x] 现在保存文件到本地,以及从本地文件读档了。 +[x] 可以在全局开关中设置剑盾是否作为装备存在。 +[x] 修复了部分已知Bug。 + ### 2018.1.12 V1.3.1 * [x] 增加虚拟键盘 diff --git a/docs/api.md b/docs/api.md index 092ad862..a47385d8 100644 --- a/docs/api.md +++ b/docs/api.md @@ -35,7 +35,7 @@ main.statusBar.image.load.onclick // 点击状态栏中的读档按钮时 main.statusBar.image.settings.onclick // 点击状态栏中的系统菜单时 main.dom.playGame.onclick // 点击“开始游戏”时 main.dom.loadGame.onclick // 点击“载入游戏”时 -main.dom.aboutGame.onclick // 点击“关于本塔”时 +main.dom.replayGame.onclick // 点击“录像回放”时 main.dom.easyLevel.onclick // 点击“简单难度”时 main.dom.normalLevel.onclick // 点击“普通难度”时 main.dom.hardLevel.onclick // 点击“困难难度”时 @@ -56,6 +56,7 @@ core.hideStartAnimate // 隐藏游戏开始界面 core.setStartProgressVal // 设置加载进度条进度 core.setStartLoadTipText // 设置加载进度条提示文字 core.loader // 加载图片和音频 +core.loadAutotile // 加载Autotile core.loadImage // 加载图片 core.loadMusic // 加载音频 core.isPlaying // 游戏是否已经开始 @@ -177,6 +178,7 @@ core.getLocalStorage // 获得本地存储 core.removeLocalStorage // 移除本地存储 core.clone // 深拷贝一个对象 core.formatDate // 格式化时间为字符串 +core.formatDate2 // 格式化时间为最简字符串 core.setTwoDigits // 两位数显示 core.debug // 进入Debug模式,攻防血和钥匙都调成很高的数值 core.replay // 开始回放 @@ -188,6 +190,7 @@ core.openQuickShop // 点击快捷商店时的打开操作 core.save // 点击保存按钮时的打开操作 core.load // 点击读取按钮时的打开操作 core.openSettings // 点击设置按钮时的打开操作 +core.autosave // 自动存档 core.doSL // 实际进行存读档事件 core.syncSave // 存档同步操作 core.saveData // 存档到本地 @@ -204,6 +207,9 @@ core.insertAction // 往当前事件列表之前插入一系列事件 * core.lockControl // 锁定状态栏,常常用于事件处理 * core.unlockControl // 解锁状态栏 * core.isset // 判断某对象是否不为undefined也不会null +core.readFile // 读取一个本地文件内容 +core.download // 下载文件到本地 +core.copy // 复制一段文字到剪切板 * core.playBgm // 播放背景音乐 * core.pauseBgm // 暂停背景音乐的播放 * core.resumeBgm // 恢复背景音乐的播放 @@ -246,6 +252,7 @@ core.events.startGame // 游戏开始事件 * core.events.setInitData // 不同难度分别设置初始属性 * core.events.win // 游戏获胜事件 * core.events.lose // 游戏失败事件 +core.evens.gameOver // 游戏结束 core.events.afterChangeFloor // 转换楼层结束的事件 core.events.doEvents // 开始执行一系列自定义事件 core.events.doAction // 执行当前自定义事件列表中的下一个事件 @@ -280,6 +287,9 @@ core.events.clickBookDetail // 怪物手册属性显示界面时的点击操作 core.events.clickFly // 楼层传送器界面时的点击操作 core.events.keyDownFly // 楼层传送器界面时,按下某个键的操作 core.events.keyUpFly // 楼层传送器界面时,放开某个键的操作 +core.events.clickViewMaps // 浏览地图界面时的点击操作 +core.events.keyDownViewMaps // 浏览地图界面时,按下某个键的操作 +core.events.keyUpViewMaps // 浏览地图界面时,放开某个键的操作 core.events.clickShop // 商店界面时的点击操作 core.events.keyDownShop // 商店界面时,按下某个键的操作 core.events.keyUpShop // 商店界面时,放开某个键的操作 @@ -349,6 +359,7 @@ core.ui.drawPagination // 绘制分页 core.ui.drawEnemyBook // 绘制怪物手册 core.ui.drawBookDetail // 绘制怪物属性的详细信息 core.ui.drawFly // 绘制楼层传送器 +core.ui.drawMaps // 绘制浏览地图界面 core.ui.drawToolbox // 绘制道具栏 core.ui.drawSLPanel // 绘制存档/读档界面 core.ui.drawThumbnail // 绘制一个缩略图 diff --git a/docs/element.md b/docs/element.md index 21df84a9..19444280 100644 --- a/docs/element.md +++ b/docs/element.md @@ -12,9 +12,9 @@ 本塔目前支持的所有道具列表在样板0层中已全部给出。当你在样板0层中拿到某个宝物时会有提示,这里不再赘述,详见拿到该道具的说明。 -大多数宝物都有默认的效果,十字架和屠龙匕首暂未定义,如有自己的需求可参见[自定义道具效果](personalization#自定义道具效果)。 +大多数宝物都有默认的效果,屠龙匕首暂未定义,如有自己的需求可参见[自定义道具效果](personalization#自定义道具效果)。 -!> 请注意,本塔没有"装备"的说法,所有剑盾拿到后将立刻作为攻防数值直接加到勇士的属性上。 +如需让剑盾变成装备,可以直接在`data.js`中设置`'equipment': true`即可。 拿到道具后将触发`afterGetItem`事件,有关事件的详细介绍请参见[事件](event)。 @@ -106,7 +106,7 @@ N连击怪物的special是6,且我们可以为它定义n代表实际连击数 领域怪需要在怪物后添加value,代表领域伤害的数值。如果勇士生命值扣减到0,则直接死亡触发lose事件。 -领域是十字伤害还是九宫格伤害由data.js中的全局变量`zoneSquare`设定。你也可以对该怪物自行进行设定。 +领域是十字伤害还是九宫格伤害由`zoneSquare`设定,如设置为true则为九宫格伤害,不指定或为false则为十字伤害。 `range`选项可选,代表该领域怪的范围,不写则默认为1。 diff --git a/docs/event.md b/docs/event.md index a694f731..f1ef08d2 100644 --- a/docs/event.md +++ b/docs/event.md @@ -16,7 +16,8 @@ - 启用状态下,该事件才处于可见状态,可被触发、交互与处理。 - 禁用状态下该事件相当于不存在,不可见、不可被触发、不可交互。 -所有事件默认情况下都是启用的,除非指定了`enable: false`。 +所有事件默认情况下都是启用的,除非指定了`enable: false`。 + 在事件列表中使用`type: show`和`type: hide`可以将一个禁用事件启用,或将一个启用事件给禁用。 @@ -971,6 +972,26 @@ events.prototype.addPoint = function (enemy) { 当且仅当勇士第一次到达某层时,将会触发此事件。可以利用此事件来显示一些剧情,或再让它调用 `{"type": "trigger"}` 来继续调用其他的事件。 +## 使用炸弹后的事件 + +上面的afterBattle事件只对和怪物进行战斗后才有会被处理。 + +如果我们想在使用炸弹后也能触发一些事件(如开门),则可以在`events.js`里面的`afterUseBomb`函数进行处理: + +``` js +////// 使用炸弹/圣锤后的事件 ////// +events.prototype.afterUseBomb = function () { + // 这是一个使用炸弹也能开门的例子 + if (core.status.floorId=='xxx' && core.terrainExists(x0,y0,'specialDoor') // 某个楼层,该机关门存在 + && !core.enemyExists(x1,y1) && !core.enemyExists(x2,y2)) // 且守门的怪物都不存在 + { + core.insertAction([ // 插入事件 + {"type": "openDoor", "loc": [x0,y0]} // 开门 + ]) + } +} +``` + ## 战前剧情 有时候光战后事件`afterBattle`是不够的,我们可能还需要战前剧情,例如Boss战之前和Boss进行一段对话。 diff --git a/docs/start.md b/docs/start.md index 8ddde2af..49676e78 100644 --- a/docs/start.md +++ b/docs/start.md @@ -9,7 +9,7 @@ 你需要有满足如下条件才能进行制作: - Windows 8以上操作系统;Windows 7需要安装.Net Framework 4.0。(能打开同目录下的“启动服务.exe”即可) -- 任一款现代浏览器。强烈推荐Chrome。 +- Chrome浏览器。其他浏览器可能会导致本地服务器产生闪退等现象。 - 一个很好的文本编辑器。推荐带有高亮染色、错误提示等效果。例如:WebStorm,VSCode,或者至少也要Sublime Text。 - ([VSCode下载地址](https://code.visualstudio.com/),群里的群文件中也有,强烈推荐之。) @@ -28,6 +28,8 @@ * “JS代码压缩工具”能对JS代码进行压缩,从而减少IO请求数和文件大小。 * “伤害和临界值计算器”是一个很便捷的小工具,能对怪物的伤害和临界值进行计算。 +!> **警告:** 非Chrome浏览器(如Edge/IE等)下本地服务器可能表现不正常,会出现闪退等现象。请务必下载安装Chrome浏览器。 + ## 新建剧本 类似于RMXP,本塔每层楼都是一个“剧本”,剧本内主要定义了本层的地图和各种事件。主函数将读取每个剧本,并生成实际的地图供游戏使用。 @@ -147,7 +149,7 @@ 只需要修改自己用到的怪物属性即可,其他没有用到的怪物完全无所谓。 -做完后保存所有文件,然后右键,选择使用chrome浏览器打开`index.html`,就能立刻看到自己的塔并开始游戏啦!是不是很简单呢! +做完后保存所有文件,在本地服务器中“启动游戏”,就能立刻看到自己的塔并开始游戏啦!是不是很简单呢! ![保存](./img/save.png) diff --git a/libs/enemys.js b/libs/enemys.js index 847ae58d..bcdd98d4 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -79,7 +79,16 @@ enemys.prototype.getEnemys = function (enemyId) { ////// 判断是否含有某特殊属性 ////// enemys.prototype.hasSpecial = function (special, test) { - return (special instanceof Array)?special.indexOf(test)>=0:(special!=0&&(special%100==test||this.hasSpecial(parseInt(special/100), test))); + + if (special instanceof Array) { + return special.indexOf(test)>=0; + } + + if (typeof special == 'number') { + return special!=0 && (special%100==test||this.hasSpecial(parseInt(special/100), test)); + } + + return false; } ////// 获得所有特殊属性的名称 ////// diff --git a/libs/events.js b/libs/events.js index 702750df..b5ef9249 100644 --- a/libs/events.js +++ b/libs/events.js @@ -824,6 +824,16 @@ events.prototype.afterChangeLight = function(x,y) { ////// 使用炸弹/圣锤后的事件 ////// events.prototype.afterUseBomb = function () { + // 这是一个使用炸弹也能开门的例子 + /* + if (core.status.floorId=='xxx' && core.terrainExists(x0,y0,'specialDoor') // 某个楼层,该机关门存在 + && !core.enemyExists(x1,y1) && !core.enemyExists(x2,y2)) // 且守门的怪物都不存在 + { + core.insertAction([ // 插入事件 + {"type": "openDoor", "loc": [x0,y0]} // 开门 + ]) + } + */ } diff --git a/libs/maps.js b/libs/maps.js index 36fb5a27..dce6c382 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -68,10 +68,10 @@ maps.prototype.getBlock = function (x, y, id) { // 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'}; // 白墙 + if (id == 3) tmp.event = {'cls': 'terrains', 'id': 'blueWall'}; // 蓝墙 if (id == 4) tmp.event = {'cls': 'animates', 'id': 'star', 'noPass': true}; // 星空 if (id == 5) tmp.event = {'cls': 'animates', 'id': 'lava', 'noPass': true}; // 岩浆 - if (id == 6) tmp.event = {'cls': 'terrains', 'id': 'ice'}; // 岩浆 + if (id == 6) tmp.event = {'cls': 'terrains', 'id': 'ice'}; // 冰面 if (id == 7) tmp.event = {'cls': 'terrains', 'id': 'blueShop-left'}; // 蓝色商店左 if (id == 8) tmp.event = {'cls': 'terrains', 'id': 'blueShop-right'}; // 蓝色商店右 if (id == 9) tmp.event = {'cls': 'terrains', 'id': 'pinkShop-left'}; // 粉色商店左 diff --git a/main.js b/main.js index 702f31a1..d95aa588 100644 --- a/main.js +++ b/main.js @@ -376,9 +376,8 @@ main.dom.loadGame.onclick = function() { main.core.load(); } -////// 点击“关于本塔”时 ////// +////// 点击“录像回放”时 ////// main.dom.replayGame.onclick = function () { - // main.core.ui.drawAbout(); core.readFile(function (obj) { if (obj.name!=core.firstData.name) { diff --git a/更新说明.txt b/更新说明.txt index dcf49627..36d57caf 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -1,4 +1,15 @@ -HTML5魔塔样板V1.3.1: +HTML5魔塔样板V1.3.2 + +增加录像和回放功能。 +增加统计功能,现在能看到每部塔的游戏人数、通关人数和当前MAX了。 +增加浏览地图功能,玩家可以快速查看每层楼的地图。 +现在保存文件到本地,以及从本地文件读档了。 +可以在全局开关中设置剑盾是否作为装备存在。 +修复了部分已知Bug。 + +----------------------------------------------------------------------- + +HTML5魔塔样板V1.3.1: 增加虚拟键盘。 增加自动存档(回退),A键可快速读档。