V2.4
This commit is contained in:
parent
830d7031d3
commit
ce8e227b27
@ -1,6 +1,6 @@
|
||||
# V2.0版本介绍
|
||||
|
||||
?> 目前版本**v2.3.3**,上次更新时间:* {docsify-updated} *
|
||||
?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} *
|
||||
|
||||
目前样板已经更新到V2.0版本以上,本章将对V2.0的一些内容进行介绍。
|
||||
|
||||
|
||||
10
docs/api.md
10
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主要用来进行怪物相关的内容,比如怪物的特殊属性,伤害和临界计算等。
|
||||
|
||||
@ -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。
|
||||
|
||||
|
||||
@ -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);
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# HTML5 魔塔样板说明文档
|
||||
|
||||
?> 目前版本**v2.3.3**,上次更新时间:* {docsify-updated} *
|
||||
?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} *
|
||||
|
||||
众所周知,魔塔的趋势是向移动端发展,贴吧中也常常能见到“求手机魔塔”的帖子。然而现有的工具中,NekoRPG有着比较大的局限性,游戏感较差,更是完全没法在iOS上运行。而一些APP的魔塔虽然可用,但是必须要下载安装,对于Android和iOS还必须开发不同的版本,非常麻烦。
|
||||
|
||||
|
||||
@ -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防减伤。也可以适当进行修改。
|
||||
|
||||
## 自定义快捷键
|
||||
|
||||
如果需要绑定某个快捷键为处理一段事件,也是可行的。
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# 快速上手
|
||||
|
||||
?> 目前版本**v2.3.3**,上次更新时间:* {docsify-updated} *
|
||||
?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} *
|
||||
|
||||
在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔!
|
||||
|
||||
@ -57,11 +57,13 @@
|
||||
|
||||

|
||||
|
||||
我们打开Windows自带的“截图工具”,并将整个地图有效区域截图下来,并将其复制到剪切板。
|
||||
我们打开地图编辑器,创建一个地图,宽高需要和RM中的地图一致。
|
||||
|
||||
之后,我们打开Windows自带的“截图工具”,并将整个地图有效区域截图下来,并将其复制到剪切板。
|
||||
|
||||

|
||||
|
||||
截图时请注意:**只截取有效游戏空间内数据,并且有效空间内的范围必须是13x13。(如果地图小于13*13,请用星空或墙壁填充到13x13)。**
|
||||
截图时请注意:**只截取有效游戏空间内数据,并且有效空间内的范围必须是创建的地图的大小(至少为13x13)。**
|
||||
|
||||
确认地图的图片文件已经复制到剪切板后,我们打开“地图生成器”,并点“加载图片”。大约1-2秒后,可以得到地图的数据。
|
||||
|
||||
@ -71,7 +73,7 @@
|
||||
|
||||
!> **地图生成器默认只支持已被定义的素材。如果有自定义素材需求(例如原版的1层小塔那种素材),请先[导入并注册素材](#素材注册)后再进行操作。**
|
||||
|
||||
!> **请确保截图范围刚好为13x13,并且保证每个位置的像素都是32x32。**
|
||||
!> **请确保截图范围为你创建的地图大小,并且保证每个位置的像素都是32x32。**
|
||||
|
||||
!> **地图生成器靠左上角来确定偏移量,如果左上角是全黑或者星空之类的素材可能导致识别不准,此时请在左上角放置一个岩浆后再进行截图识别。**
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
2
main.js
2
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。
|
||||
|
||||
@ -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": "阳光",
|
||||
|
||||
Loading…
Reference in New Issue
Block a user