From ce8e227b275fe7a54d91ff67902f69659b507274 Mon Sep 17 00:00:00 2001 From: oc Date: Mon, 27 Aug 2018 23:35:27 +0800 Subject: [PATCH] V2.4 --- docs/V2.0.md | 2 +- docs/api.md | 10 ++++- docs/element.md | 82 +++++++++++++++++++++++------------------ docs/event.md | 18 ++++++--- docs/index.md | 2 +- docs/personalization.md | 16 ++++---- docs/start.md | 10 +++-- libs/maps.js | 4 +- main.js | 2 +- project/data.js | 2 +- 更新说明.txt | 7 ++-- 11 files changed, 91 insertions(+), 64 deletions(-) diff --git a/docs/V2.0.md b/docs/V2.0.md index 558eb1d1..2c87474d 100644 --- a/docs/V2.0.md +++ b/docs/V2.0.md @@ -1,6 +1,6 @@ # V2.0版本介绍 -?> 目前版本**v2.3.3**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} * 目前样板已经更新到V2.0版本以上,本章将对V2.0的一些内容进行介绍。 diff --git a/docs/api.md b/docs/api.md index f28da96b..1da8bef5 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1,6 +1,6 @@ # 附录: API列表 -?> 目前版本**v2.3.3**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} * **这里只列出所有可能会被造塔者用到的常用API,更多的有关内容请在代码内进行查询。** @@ -299,6 +299,14 @@ actions.js主要用来进行用户交互行为的处理。 ========== core.control.XXX 和游戏控制相关的函数 ========== control.js主要用来进行游戏控制,比如行走控制、自动寻路、存读档等等游戏核心内容。 +core.control.setGameCanvasTranslate(canvasId, x, y) +设置大地图的偏移量 + +core.control.updateViewport() +更新大地图的可见区域 + +core.control.replay() +回放下一个操作 ========== core.enemys.XXX 和怪物相关的函数 ========== enemys.js主要用来进行怪物相关的内容,比如怪物的特殊属性,伤害和临界计算等。 diff --git a/docs/element.md b/docs/element.md index b5496f4a..882f54f5 100644 --- a/docs/element.md +++ b/docs/element.md @@ -1,6 +1,6 @@ # 元件说明 -?> 目前版本**v2.3.3**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} * 在本章中,将对样板里的各个元件进行说明。各个元件主要包括道具、门、怪物、楼梯等等。 @@ -43,7 +43,7 @@ // 在该点的事件events中: "x,y": [ - {"type": "openDoor", "loc": [x,y]} // 直接使用开门事件,坐标需写当前点坐标。 + {"type": "openDoor"} // 直接使用开门事件,坐标可忽略表示当前点 ] ``` @@ -64,38 +64,39 @@ yellowWall, blueWall, whiteWall, lava, star 怪物可以有特殊属性,每个怪物可以有多个自定义属性。 -怪物的特殊属性所对应的数字(special)在`libs/enemys.js`中的`getSpecialText`中定义,请勿对已有的属性进行修改。 +怪物的特殊属性所对应的数字(special)在脚本编辑中的`getSpecials`中定义,请勿对已有的属性进行修改。 ``` js -enemys.prototype.getSpecialText = function (enemyId) { - if (enemyId == undefined) return ""; - var enemy = this.enemys[enemyId]; - var special = enemy.special; - var text = []; - if (this.hasSpecial(special, 1)) text.push("先攻"); - if (this.hasSpecial(special, 2)) text.push("魔攻"); - if (this.hasSpecial(special, 3)) text.push("坚固"); - if (this.hasSpecial(special, 4)) text.push("2连击"); - if (this.hasSpecial(special, 5)) text.push("3连击"); - if (this.hasSpecial(special, 6)) text.push((enemy.n||4)+"连击"); - if (this.hasSpecial(special, 7)) text.push("破甲"); - if (this.hasSpecial(special, 8)) text.push("反击"); - if (this.hasSpecial(special, 9)) text.push("净化"); - if (this.hasSpecial(special, 10)) text.push("模仿"); - if (this.hasSpecial(special, 11)) text.push("吸血"); - if (this.hasSpecial(special, 12)) text.push("中毒"); - if (this.hasSpecial(special, 13)) text.push("衰弱"); - if (this.hasSpecial(special, 14)) text.push("诅咒"); - if (this.hasSpecial(special, 15)) text.push("领域"); - if (this.hasSpecial(special, 16)) text.push("夹击"); - if (this.hasSpecial(special, 17)) text.push("仇恨"); - if (this.hasSpecial(special, 18)) text.push("阻击"); - if (this.hasSpecial(special, 19)) text.push("自爆"); - if (this.hasSpecial(special, 20)) text.push("无敌"); - if (this.hasSpecial(special, 21)) text.push("退化"); - if (this.hasSpecial(special, 22)) text.push("固伤"); - if (this.hasSpecial(special, 23)) text.push("重生"); - return text.join(" "); +function() { + // 获得怪物的特殊属性,每一行定义一个特殊属性。 + // 分为三项,第一项为该特殊属性的数字,第二项为特殊属性的名字,第三项为特殊属性的描述 + // 可以直接写字符串,也可以写个function将怪物传进去 + return [ + [1, "先攻", "怪物首先攻击"], + [2, "魔攻", "怪物无视勇士的防御"], + [3, "坚固", "勇士每回合最多只能对怪物造成1点伤害"], + [4, "2连击", "怪物每回合攻击2次"], + [5, "3连击", "怪物每回合攻击3次"], + [6, function(enemy) {return (enemy.n||4)+"连击";}, function(enemy) {return "怪物每回合攻击"+(enemy.n||4)+"次";}], + [7, "破甲", "战斗前,怪物附加角色防御的"+Math.floor(100*core.values.breakArmor||0)+"%作为伤害"], + [8, "反击", "战斗时,怪物每回合附加角色攻击的"+Math.floor(100*core.values.counterAttack||0)+"%作为伤害,无视角色防御"], + [9, "净化", "战斗前,怪物附加勇士魔防的"+core.values.purify+"倍作为伤害"], + [10, "模仿", "怪物的攻防和勇士攻防相等"], + [11, "吸血", function (enemy) {return "战斗前,怪物首先吸取角色的"+Math.floor(100*enemy.value||0)+"%生命作为伤害"+(enemy.add?",并把伤害数值加到自身生命上":"");}], + [12, "中毒", "战斗后,勇士陷入中毒状态,每一步损失生命"+core.values.poisonDamage+"点"], + [13, "衰弱", "战斗后,勇士陷入衰弱状态,攻防暂时下降"+(core.values.weakValue>=1?core.values.weakValue+"点":parseInt(core.values.weakValue*100)+"%")], + [14, "诅咒", "战斗后,勇士陷入诅咒状态,战斗无法获得金币和经验"], + [15, "领域", function (enemy) {return "经过怪物周围"+(enemy.range||1)+"格时自动减生命"+(enemy.value||0)+"点";}], + [16, "夹击", "经过两只相同的怪物中间,勇士生命值变成一半"], + [17, "仇恨", "战斗前,怪物附加之前积累的仇恨值作为伤害"+(core.flags.hatredDecrease?";战斗后,释放一半的仇恨值":"")+"。(每杀死一个怪物获得"+(core.values.hatred||0)+"点仇恨值)"], + [18, "阻击", function (enemy) {return "经过怪物的十字领域时自动减生命"+(enemy.value||0)+"点,同时怪物后退一格";}], + [19, "自爆", "战斗后勇士的生命值变成1"], + [20, "无敌", "勇士无法打败怪物,除非拥有十字架"], + [21, "退化", function (enemy) {return "战斗后勇士永久下降"+(enemy.atkValue||0)+"点攻击和"+(enemy.defValue||0)+"点防御";}], + [22, "固伤", function (enemy) {return "战斗前,怪物对勇士造成"+(enemy.damage||0)+"点固定伤害,无视勇士魔防。";}], + [23, "重生", "怪物被击败后,角色转换楼层则怪物将再次出现"], + [24, "激光", function (enemy) {return "经过怪物同行或同列时自动减生命"+(enemy.value||0)+"点";}] + ]; } ``` @@ -138,11 +139,13 @@ N连击怪物的special是6,且我们可以为它定义n代表实际连击数 领域怪还可以设置`range`选项代表该领域怪的范围,不写则默认为1。 -阻击怪同样需要设置value,代表领域伤害的数值。如果勇士生命值扣减到0,则直接死亡触发lose事件。 +阻击怪同样需要设置value,代表阻击伤害的数值。如果勇士生命值扣减到0,则直接死亡触发lose事件。 !> 阻击怪后退的地点不能有任何事件存在,即使是已经被禁用的自定义事件! -请注意如果吸血、领域、阻击中任何两个同时存在,则value会冲突。**因此请勿将吸血、领域或阻击放置在同一个怪物身上。** +激光怪同样需要设置value,代表激光伤害的数值。 + +请注意如果吸血、领域、阻击中任何两个同时存在,则value会冲突。**因此请勿将吸血、领域、阻击或激光放置在同一个怪物身上。** 退化怪需要设置'atkValue'和'defValue'表示退化的数值;也可以不设置默认为0。 @@ -176,6 +179,14 @@ floorId指定的是目标楼层的唯一标识符(ID)。 **从2.1.1开始,楼层属性中提供了`upFloor`和`downFloor`两项。如果设置此项(比如`"upFloor": [2,3]`),则写stair:upFloor或者楼传器的落点将用此点来替换楼梯位置(即类似于RM中的上箭头)。** +## 大地图 + +从V2.4开始,H5魔塔开始支持大地图。 + +大地图在创建时可以指定宽高,要求**宽和高都不得小于13,且宽高之积不超过1000**。 + +大地图一旦创建成功则不得修改宽高数值。 + ## 动画和天气系统 现在我们的H5魔塔支持播放动画,也支持天气系统了。 @@ -271,8 +282,7 @@ HTML5魔塔一大亮点就是存在录像系统,可以很方便进行录像回 - **回退:** 按A可以回退到上一个录像节点(录像播放过程中每50步存一个录像节点)。 - **存档:** 按S可以在录像播放过程中进行存档。 - **查看手册:** 按C可以在录像播放过程中查看怪物手册。 - -上述操作在手机端均有工具栏的对应按钮可点击操作。 +- **浏览地图:** 按PgUp/PgDn可以在录像播放过程中浏览地图。 如果录像出现问题,请加群539113091找小艾反馈Bug。 diff --git a/docs/event.md b/docs/event.md index 04e68bc7..7b787615 100644 --- a/docs/event.md +++ b/docs/event.md @@ -1,6 +1,6 @@ # 事件 -?> 目前版本**v2.3.3**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} * 本章内将对样板所支持的事件进行介绍。 @@ -1687,11 +1687,15 @@ core.insertAction([ 游戏开始时将调用`events.js`中的`startGame`函数。 -它将显示`data.js`中的startText内容(可以修改成自己的),提供战斗动画开启选择,设置初始福利,并正式开始游戏。 +它将显示全塔属性中的startText内容(可以修改成自己的),提供战斗动画开启选择,设置初始福利,并正式开始游戏。 -我们可以修改`setInitData`函数来对于不同难度分别设置初始属性。 +全塔属性的startText只能使用纯文本类型,其他的事件均无效。 -其参数hard为以下三个字符串之一:`"Easy"`, `"Normal"`, `"Hard"`,分别对应三个难度。针对不同的难度,我们可以设置一些难度分歧。 +我们可以修改脚本编辑`setInitData`函数来对于不同难度分别设置初始属性。 + +其参数hard分为对应全塔属性中levelChooseButtons中的第二项,分别对应不同的难度,并会在游戏中传输,在状态栏显示。 + +针对不同的难度,我们可以设置一些难度分歧。 ``` js ////// 不同难度分别设置初始属性 ////// @@ -1718,9 +1722,11 @@ core.insertAction([ 当获胜`{"type": "win"}`事件发生时,将调用`events.js`中的win事件。其显示一段恭喜文字,并重新开始游戏。 +可以指定norank表示该结局不计入榜单。 + ``` js ////// 游戏获胜事件 ////// -"win": function(reason) { +"win": function(reason, norank) { core.ui.closePanel(); var replaying = core.status.replay.replaying; core.stopReplay(); @@ -1730,7 +1736,7 @@ core.insertAction([ core.drawText([ "\t[恭喜通关]你的分数是${status:hp}。" ], function () { - core.events.gameOver(reason||'', replaying); + core.events.gameOver(reason||'', replaying, norank); }) }); } diff --git a/docs/index.md b/docs/index.md index 0e744fb2..4bfabadd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ # HTML5 魔塔样板说明文档 -?> 目前版本**v2.3.3**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} * 众所周知,魔塔的趋势是向移动端发展,贴吧中也常常能见到“求手机魔塔”的帖子。然而现有的工具中,NekoRPG有着比较大的局限性,游戏感较差,更是完全没法在iOS上运行。而一些APP的魔塔虽然可用,但是必须要下载安装,对于Android和iOS还必须开发不同的版本,非常麻烦。 diff --git a/docs/personalization.md b/docs/personalization.md index 0c2a6075..450e90e4 100644 --- a/docs/personalization.md +++ b/docs/personalization.md @@ -1,6 +1,6 @@ # 个性化 -?> 目前版本**v2.3.3**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} * 有时候只靠样板本身可能是不够的。我们需要一些个性化、自定义的素材,道具效果,怪物属性,等等。 @@ -15,10 +15,10 @@ HTML5魔塔是使用画布(canvas)来绘制,存在若干个图层,它们 - hero:勇士层;主要用来绘制勇士 - event2:事件2层;本层主要用来绘制48x32的图片素材的上半部分(避免和勇士错位),也可以用来绘制该层的前景图片素材 - fg:显伤层;主要用来绘制怪物显伤和领域显伤 -- animate:动画层;主要用来绘制动画,图块的淡入/淡出效果,图块的移动。showImage事件绘制的图片也是在这一层。 +- animate:动画层;主要用来绘制动画。showImage事件绘制的图片也是在这一层。 - weather:天气层;主要用来绘制天气(雨/雪) - curtain:色调层;用来控制当前楼层的画面色调 -- route:路线层;主要用来绘制勇士的行走路线图 +- route:路线层;主要用来绘制勇士的行走路线图,也用来绘制图块的淡入/淡出效果,图块的移动等。 - ui:UI层;用来绘制一切UI窗口,如剧情文本、怪物手册、楼传器、系统菜单等等 - data:数据层;用来绘制一些顶层的或更新比较快的数据,如左上角的提示,战斗界面中数据的变化等等。 @@ -438,18 +438,18 @@ this.useEquipment = function (itemId) { // 使用装备 ## 自定义怪物属性 -如果你对现有的怪物不满意,想自行添加怪物属性(例如让怪物拥有双属性乃至更多属性),也是可以的。具体参见`enemys.js`文件。 +如果你对现有的怪物不满意,想自行添加怪物属性也是可以的。具体参见脚本编辑-getSpecials。 -你需自己指定一个special数字,修改getSpecialText函数(属性名)和getSpecialHint函数(属性提示文字)。 +你需自己指定一个special数字,修改属性名和属性提示文字。后两者可以直接写字符串,或写个函数传入怪物。 如果要修改伤害计算公式,请修改下面的getDamageInfo函数。请注意,如果无法战斗,该函数必须返回`null`。 -对于毒衰弱怪物的战斗后结算在`functions.js`中的afterBattle函数中。 +!> 如果改动了伤害计算公式,可能导致临界计算崩掉,因此建议将全塔属性中的`useLoop`置为true。 + +对于毒衰弱怪物的战斗后结算在脚本编辑中的afterBattle函数中。 对于领域、夹击、阻击怪物的检查在`control.js`中的checkBlock函数中。 -`getCritical`, `getCriticalDamage`和`getDefDamage`三个函数依次计算的是该怪物的临界值、临界减伤和1防减伤。也可以适当进行修改。 - ## 自定义快捷键 如果需要绑定某个快捷键为处理一段事件,也是可行的。 diff --git a/docs/start.md b/docs/start.md index 6ab94659..7de9ed31 100644 --- a/docs/start.md +++ b/docs/start.md @@ -1,6 +1,6 @@ # 快速上手 -?> 目前版本**v2.3.3**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} * 在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔! @@ -57,11 +57,13 @@ ![绘制地图](./img/rmxp2.png) -我们打开Windows自带的“截图工具”,并将整个地图有效区域截图下来,并将其复制到剪切板。 +我们打开地图编辑器,创建一个地图,宽高需要和RM中的地图一致。 + +之后,我们打开Windows自带的“截图工具”,并将整个地图有效区域截图下来,并将其复制到剪切板。 ![绘制地图](./img/rmxp3.png) -截图时请注意:**只截取有效游戏空间内数据,并且有效空间内的范围必须是13x13。(如果地图小于13*13,请用星空或墙壁填充到13x13)。** +截图时请注意:**只截取有效游戏空间内数据,并且有效空间内的范围必须是创建的地图的大小(至少为13x13)。** 确认地图的图片文件已经复制到剪切板后,我们打开“地图生成器”,并点“加载图片”。大约1-2秒后,可以得到地图的数据。 @@ -71,7 +73,7 @@ !> **地图生成器默认只支持已被定义的素材。如果有自定义素材需求(例如原版的1层小塔那种素材),请先[导入并注册素材](#素材注册)后再进行操作。** -!> **请确保截图范围刚好为13x13,并且保证每个位置的像素都是32x32。** +!> **请确保截图范围为你创建的地图大小,并且保证每个位置的像素都是32x32。** !> **地图生成器靠左上角来确定偏移量,如果左上角是全黑或者星空之类的素材可能导致识别不准,此时请在左上角放置一个岩浆后再进行截图识别。** diff --git a/libs/maps.js b/libs/maps.js index 32d01cf3..554989eb 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -48,11 +48,11 @@ maps.prototype.initBlock = function (x, y, id) { if (id.length>2) { if (id.indexOf(":f")==id.length-2) { id = id.substring(0, id.length - 2); - disable = false; + disable = true; } else if (id.indexOf(":t")==id.length-2) { id = id.substring(0, id.length - 2); - disable = true; + disable = false; } } id=parseInt(id); diff --git a/main.js b/main.js index dcb07fb5..26190b34 100644 --- a/main.js +++ b/main.js @@ -2,7 +2,7 @@ function main() { //------------------------ 用户修改内容 ------------------------// - this.version = "2.3.3"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。 + this.version = "2.4"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。 this.useCompress = false; // 是否使用压缩文件 // 当你即将发布你的塔时,请使用“JS代码压缩工具”将所有js代码进行压缩,然后将这里的useCompress改为true。 diff --git a/project/data.js b/project/data.js index e8af415f..230dcdae 100644 --- a/project/data.js +++ b/project/data.js @@ -27,7 +27,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "firstData" : { "title": "魔塔样板", "name": "template", - "version": "Ver 2.3.3", + "version": "Ver 2.4", "floorId": "sample0", "hero": { "name": "阳光", diff --git a/更新说明.txt b/更新说明.txt index 5fa96440..75e03b8a 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -1,12 +1,13 @@ -HTML5魔塔样板V2.3.4 +HTML5魔塔样板V2.4 大地图的支持 -修复超大数值领域导致自动寻路卡死的问题 同点多事件的颜色块绘制 录像播放时可以按PgUp/PgDn浏览地图 +录像播放时对于瞬间移动绘制箭头 +增加激光属性 可以在读档时E键直接指定编号 破炸飞可以在状态栏显示个数 -部分细节优化 +部分细节优化,所有已知Bug修复 -----------------------------------------------------------------------