This commit is contained in:
oc 2018-08-27 23:35:27 +08:00
parent 830d7031d3
commit ce8e227b27
11 changed files with 91 additions and 64 deletions

View File

@ -1,6 +1,6 @@
# V2.0版本介绍
?> 目前版本**v2.3.3**,上次更新时间:* {docsify-updated} *
?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} *
目前样板已经更新到V2.0版本以上本章将对V2.0的一些内容进行介绍。

View File

@ -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主要用来进行怪物相关的内容比如怪物的特殊属性伤害和临界计算等。

View File

@ -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。

View File

@ -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);
})
});
}

View File

@ -1,6 +1,6 @@
# HTML5 魔塔样板说明文档
?> 目前版本**v2.3.3**,上次更新时间:* {docsify-updated} *
?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} *
众所周知魔塔的趋势是向移动端发展贴吧中也常常能见到“求手机魔塔”的帖子。然而现有的工具中NekoRPG有着比较大的局限性游戏感较差更是完全没法在iOS上运行。而一些APP的魔塔虽然可用但是必须要下载安装对于Android和iOS还必须开发不同的版本非常麻烦。

View File

@ -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路线层主要用来绘制勇士的行走路线图,也用来绘制图块的淡入/淡出效果,图块的移动等。
- uiUI层用来绘制一切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防减伤。也可以适当进行修改。
## 自定义快捷键
如果需要绑定某个快捷键为处理一段事件,也是可行的。

View File

@ -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。**
!> **地图生成器靠左上角来确定偏移量,如果左上角是全黑或者星空之类的素材可能导致识别不准,此时请在左上角放置一个岩浆后再进行截图识别。**

View File

@ -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);

View File

@ -2,7 +2,7 @@ function main() {
//------------------------ 用户修改内容 ------------------------//
this.version = "2.3.3"; // 游戏版本号如果更改了游戏内容建议修改此version以免造成缓存问题。
this.version = "2.4"; // 游戏版本号如果更改了游戏内容建议修改此version以免造成缓存问题。
this.useCompress = false; // 是否使用压缩文件
// 当你即将发布你的塔时请使用“JS代码压缩工具”将所有js代码进行压缩然后将这里的useCompress改为true。

View File

@ -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": "阳光",

View File

@ -1,12 +1,13 @@
HTML5魔塔样板V2.3.4
HTML5魔塔样板V2.4
大地图的支持
修复超大数值领域导致自动寻路卡死的问题
同点多事件的颜色块绘制
录像播放时可以按PgUp/PgDn浏览地图
录像播放时对于瞬间移动绘制箭头
增加激光属性
可以在读档时E键直接指定编号
破炸飞可以在状态栏显示个数
部分细节优化
部分细节优化所有已知Bug修复
-----------------------------------------------------------------------