Merge pull request #257 from ckcz123/v2.0

V2.0
This commit is contained in:
Zhang Chen 2018-11-15 17:52:11 +08:00 committed by GitHub
commit 70e6d1effa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 87 additions and 140 deletions

5
B站视频教程.url Normal file
View File

@ -0,0 +1,5 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
IDList=
URL=https://www.bilibili.com/video/av32781473/

View File

@ -2,4 +2,4 @@
Prop3=19,2
[InternetShortcut]
IDList=
URL=https://ckcz123.github.io/mota-js/
URL=https://h5mota.com/games/template/docs/

View File

@ -1,78 +0,0 @@
这只是一个最简单的造塔流程,更为详细的还是请参见视频或教程文档。
1. 打开启动服务,地图编辑器。
2. 切换到MT0层然后开始绘制地图。可以在上面放置墙、门、道具或怪物等。
如果提示“该素材未被定义”请参见第7点。
如果要从RMXP中复刻已有的塔的地图请参见第11点。
3. 切换到楼层属性一项一项仔细进行楼层属性的编辑如楼层名firstArrive等等。
将鼠标移动到表格的中间可以查看详细信息。
firstArrive为初次到达楼层的事件可以双击进行事件的编辑。有关事件请详见文档。
3. 输入怪物数据:点击右边怪物,然后左边写怪物的攻防血等数值。
将鼠标移动到表格的中间可以查看详细信息。
如果是特殊属性怪物直接写特殊编号,多个特殊属性可以用 [1,2] 来表示。
4. 在中间的下拉框切换全塔属性,一项一项仔细进行根据需求编辑。
请注意"name"一项必须修改为“字母、数字、下划线组成的字符串”,否则会出现串档问题。
startText初始剧情、shops全局商店、levelUp升级等都是可以双击方框进行编辑的。
有关全局商店和升级等信息详见 教程文档 - 事件
5. 给地图添加事件可以给地图上的NPC增加事件或者战斗/开门事件等。
点击地图上的某个点,在左边进行编辑。
event -- 该点的自定义事件例如NPC商店等等
changeFloor -- 该点的楼层传送事件(楼梯/传送门)
afterBattle -- 该点战斗后触发的战后事件
afterOpenDoor -- 该点开门后触发的事件
afterGetItem -- 该点获得道具后触发的事件
等等。
有关事件详细内容请参见 文档 - 事件。
6. 新建楼层切换到地图编辑然后在框内输入新楼层的floorId点击新建地图即可保存。
创建的floorId必须是字母、数字和下划线组成且不能以数字开头。
不能为空白不能和任何已有楼层的floorId重复。
保存成功后刷新页面。
删除楼层同理,不过请注意删除的会是当前的楼层而不是框中的内容。
7. 关于素材未被定义的问题如果点击某个怪物或NPC提示该素材未被定义请在左边进行素材的注册。
输入该素材的唯一ID不能和其他素材的ID重复和素材的唯一数字1000以内不能和其他的数字重复
保存并刷新,即注册成功。
8. 添加新素材请打开启动服务的便捷PS工具然后左边读取你要添加到的图片比如怪物是enemys.png道具是items.png
右边读取你要导入的怪物素材通过复制粘贴进行导入再保存刷新页面后按照第7点来进行素材的注册。
9. 道具的自定义效果:如果需要自定义道具效果,请仿照其他的几个道具来写,更多信息详见文档。
10. 报错处理:有时候刷新后可能页面变成空白,即无法正确加载。
出现这种问题的原因往往是手动错误编辑了文件、新建楼层使用了不合法的floorId比如中文或数字、楼层floorId定义重复等等。
出现这种问题在Chrome浏览器中请按Ctrl+Shift+I打开控制台找到Console查看报错。
一般都会具体到哪个楼层文件出错。
解决方式哪个楼层文件出错请使用VSCode等打开project目录下的data.js文件并将出错的那个楼层定义删除。
举例,比如我在新建地图中写了 “水潭边” 这样一个楼层名(中文),然后新建并保存,刷新会出错。
此时打开控制台Ctrl+Shift+I的Console并查看报错发现是该楼层错误。
那么打开data.js文件并将 "floorIds": [..., "水潭边"] 这里对它的楼层定义删除,再刷新即可。
11. 从RMXP中导入已有的塔的地图。
如果你想复刻老塔,则需使用启动服务的地图生成器。
请确保老地图中的所有使用素材(地面/墙壁/门/道具/怪物等等都已经被注册过参见第7点
打开windows自带的截图工具并对地图进行截图。
截图时请注意必须截刚好13x13范围大小的地图尽量对其边缘进行截取。
如果不是13x13的范围大小可能会导致地图生成器无响应。
截图完毕后请复制到剪切板然后在地图生成器中点加载图片。等1-2秒就可以看到截图被识别。
点“复制地图”,然后在地图编辑器中切换到“地图编辑”,并粘贴到左边的框内,即可。
如果存在个别识别问题,可以对这个别素材再进行重新绘制。
如果出现大量识别问题,比如基本全是错的,则代表你的截图方式有问题。
由于地图生成器的识别以左上角的图块为基准来找寻截图偏移量,请确保左上角一定要是一个能被很好识别的图块。
建议在RM的图层第三层左上角放一个岩浆再进行截图保证截图的13x13的左上角是岩浆从而可以确保定位
识别后再复制到地图编辑器中进行绘制。
--------------------------------
HTML5魔塔交流群539113091如果有问题请加群提问。

View File

@ -1238,7 +1238,7 @@ return code;
*/;
switch_s
: '多重分歧 条件判定' ':' expression BGNL? Newline switchCase_s+ BEND Newline
: '多重分歧 条件判定' ':' expression BGNL? Newline switchCase+ BEND Newline
/* switch_s
@ -1247,16 +1247,16 @@ helpUrl : https://ckcz123.github.io/mota-js/#/event?id=switch%EF%BC%9A%E5%A4%9A%
default : ["判别值"]
colour : this.eventColor
var code = ['{"type": "switch", "condition": "',expression_0,'", "caseList": [\n',
switchCase_s_0,
switchCase_0,
'], },\n'].join('');
return code;
*/;
switchCase_s
switchCase
: '如果是' expression '的场合' BGNL? Newline action+
/* switchCase_s
/* switchCase
tooltip : 选项的选择
helpUrl : https://ckcz123.github.io/mota-js/#/event?id=switch%EF%BC%9A%E5%A4%9A%E9%87%8D%E6%9D%A1%E4%BB%B6%E5%88%86%E6%AD%A7
colour : this.subColor
@ -2014,7 +2014,7 @@ ActionParser.prototype.parseAction = function() {
case "switch": // 多重条件分歧
var case_caseList = null;
for(var ii=data.caseList.length-1,caseNow;caseNow=data.caseList[ii];ii--) {
case_caseList=MotaActionBlocks['switchCase_s'].xmlText([
case_caseList=MotaActionBlocks['switchCase'].xmlText([
this.isset(caseNow.case)?MotaActionBlocks['evalString_e'].xmlText([caseNow.case]):"值",this.insertActionList(caseNow.action),case_caseList]);
}
this.next = MotaActionBlocks['switch_s'].xmlText([

View File

@ -424,6 +424,12 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
"_bool": "bool",
"_data": "是否允许等级提升进阶如果上面enableExperience为false则此项恒视为false"
},
"levelUpLeftMode": {
"_leaf": true,
"_type": "checkbox",
"_bool": "bool",
"_data": "进阶使用扣除模式即在状态栏显示距离下个等级所需要的经验值只有enableExperience和enableLevelUp均开启时才有效。"
},
"enableKeys": {
"_leaf": true,
"_type": "checkbox",
@ -612,6 +618,12 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
"_bool": "bool",
"_data": "是否允许查看未开启状态的快捷商店内容;如果此项为真,则对于未开启状态的商店允许查看其内容(但不能购买)"
},
"disableShopOnDamage": {
"_leaf": true,
"_type": "checkbox",
"_bool": "bool",
"_data": "是否在经过领域/夹击/路障等伤害后禁用快捷商店。"
}
}
}
}

View File

@ -111,7 +111,7 @@ editor_blockly = function () {
MotaActionFunctions.actionParser.parseList({"type": "switch", "condition": "判别量", "caseList": [
{"action": [{"type": "comment", "text": "当判别值是值的场合执行此事件"}]},
{"action": []},
{"case": "'default'", "action": [{"type": "comment", "text": "当没有符合的值的场合执行此事件"}]},
{"case": "default", "action": [{"type": "comment", "text": "当没有符合的值的场合执行此事件"}]},
]}),
MotaActionBlocks['while_s'].xmlText(),
MotaActionBlocks['break_s'].xmlText(),

View File

@ -548,50 +548,47 @@ this.myfunc = function(x) {
通过这种将脚本和自定义事件混用的方式可以达到和RM中公共事件类似的效果即一个调用触发一系列事件。
<!--
## 自定义状态栏(新增显示项)
在V2.2以后,我们可以自定义状态栏背景图(全塔属性 - statusLeftBackground等等。
但是,如果我们还想新增其他项目的显示,比如技能塔所需要的魔力值(气息),该怎么办?
但是,如果我们还想新增其他项目的显示,比如攻速或者暴击,该怎么办?
需要进行如下几个操作:
1. 定义图标ID比如魔力我就定义mana气息可以简单的定义qixi你也可以定义其他的ID但是不能和已有的重复。这里以mana为例。
1. 定义ID比如攻速我就定义speed暴击可以简单的定义baoji你也可以定义其他的ID但是不能和已有的重复。这里以speed为例。
2. 在index.html的statusBar中44行起进行该状态栏项的定义。仿照其他几项插在其应当显示的位置注意替换掉相应的ID。
``` html
<div class="status" id="manaCol">
<img id="img-mana">
<p class='statusLabel' id='mana'></p>
<div class="status" id="speedCol">
<img id="img-speed">
<p class='statusLabel' id='speed'></p>
</div>
```
3. 在editor.html中的statusBar317行起仿照第二点同样添加这一项如果不进行则会地图编辑器报错。editor-mobile.html同理。
4. 使用便捷PS工具打开icons.png新增一行并将魔力的图标P上去记下其索引比如24从0开始数
3. 在editor.html中的statusBar323行起仿照第二点同样添加这一项如果不进行则会地图编辑器报错。editor-mobile.html同理。
4. 使用便捷PS工具打开icons.png新增一行并将魔力的图标P上去记下其索引比如30从0开始数
5. 在main.js的this.statusBar中增加图片、图标和内容的定义。
``` js
this.statusBar = {
'images': {
// ...其他略
'mana': document.getElementById("img-mana"), // 图片的定义
'speed': document.getElementById("img-speed"), // 图片的定义
},
'icons': {
// ...其他略
'mana': 24, // 图标的定义这里对应的是icons.png中的索引
'speed': 24, // 图标的定义这里对应的是icons.png中的索引
},
// ...其他略
'mana': document.getElementById('mana'), // 显示内容(数据)的定义
'speed': document.getElementById('speed'), // 显示内容(数据)的定义
}
```
6. 显示内容的设置。在脚本编辑的updateStatusBar函数可以对该状态栏显示内容进行设置下面是几个例子。
``` js
core.statusBar.mana.innerHTML = core.getFlag('mana', 0); // 设置其显示内容为flag:mana值。
core.statusBar.mana.innerHTML = core.getFlag('mana', 0) + '/' + core.getFlag('manaMax', 0); // 显示内容将类似 "32/60" 这样。
core.statusBar.mana.style.fontStyle = 'normal'; // 这一行会取消斜体。如果是汉字(比如技能名)的话,斜体起来会非常难看,可以通过这一句取消。
// 设置其显示内容为status:speed值需要在project/data.js中firstData的hero那里新增初始值`"speed": 0`。
core.statusBar.speed.innerHTML = core.getStatus('speed');
// 设置其显示内容为flag:speed值无需额外进行定义。
core.statusBar.speed.innerHTML = core.getFlag('speed', 0);
```
-->
## 技能塔的支持
其实在HTML5上制作技能塔是完全可行的。

View File

@ -1245,6 +1245,14 @@ control.prototype.checkBlock = function () {
if (damage>0) {
core.playSound('zone.mp3');
core.drawAnimate("zone", x, y);
// 禁用快捷商店
if (core.flags.disableShopOnDamage) {
for (var shopId in core.status.shops) {
core.status.shops[shopId].visited = false;
}
}
}
core.status.hero.statistics.extraDamage += damage;
@ -1913,7 +1921,7 @@ control.prototype.replay = function () {
core.status.event.data = {"toolsPage":Math.floor(index/12)+1, "constantsPage":1, "selectId":null};
index = index%12;
}
else if (index=constants.indexOf(itemId)>=0) {
else if ((index=constants.indexOf(itemId))>=0) {
core.status.event.data = {"toolsPage":1, "constantsPage":Math.floor(index/12)+1, "selectId":null};
index = index%12+12;
}
@ -2778,6 +2786,7 @@ control.prototype.resize = function(clientWidth, clientHeight) {
if (!core.flags.enableMoney) count--;
if (!core.flags.enableExperience) count--;
if (!core.flags.enableLevelUp) count--;
if (core.flags.levelUpLeftMode) count--;
if (!core.flags.enableDebuff) count--;
if (!core.flags.enableKeys) count--;
if (!core.flags.enablePZF) count--;
@ -3084,7 +3093,7 @@ control.prototype.resize = function(clientWidth, clientHeight) {
{
id: 'expCol',
rules: {
display: core.flags.enableExperience ? 'block': 'none'
display: core.flags.enableExperience && !core.flags.levelUpLeftMode ? 'block': 'none'
}
},
{

View File

@ -183,6 +183,8 @@ core.prototype.init = function (coreData, callback) {
if (!core.flags.enableExperience)
core.flags.enableLevelUp = false;
if (!core.flags.enableLevelUp)
core.flags.levelUpLeftMode = false;
if (!core.flags.canOpenBattleAnimate) {
core.flags.showBattleAnimateConfirm = false;
core.flags.battleAnimate = false;

View File

@ -260,22 +260,17 @@ enemys.prototype.getCurrentEnemys = function (floorId) {
var critical = this.nextCriticals(enemyId);
if (critical.length>0) critical=critical[0];
enemys.push({
'id': enemyId,
'name': enemy.name,
'hp': enemyInfo.hp,
'atk': enemyInfo.atk,
'def': enemyInfo.def,
'money': enemyInfo.money||0,
'experience': enemyInfo.experience||0,
'point': enemyInfo.point||0, // 加点
'special': specialText,
'damage': this.getDamage(enemyId,null,null,floorId),
'critical': critical[0],
'criticalDamage': critical[1],
'defDamage': this.getDefDamage(enemyId,1,null,null,floorId)
});
var e = core.clone(enemy);
for (var x in enemyInfo) {
e[x] = enemyInfo[x];
}
e.id = enemyId;
e.specialText = specialText;
e.damage = this.getDamage(enemyId, null, null, floorId);
e.critical = critical[0];
e.criticalDamage = critical[1];
e.defDamage = this.getDefDamage(enemyId,1,null,null,floorId);
enemys.push(e);
used[enemyId] = true;
}
}

View File

@ -810,7 +810,7 @@ events.prototype.doAction = function() {
var value=core.calValue(data.value);
// 属性
if (data.name.indexOf("status:")==0) {
value=parseFloat(value);
// value=parseFloat(value);
core.setStatus(data.name.substring(7), value);
}
// 道具

View File

@ -1340,25 +1340,25 @@ ui.prototype.drawBook = function (index) {
// 数据
core.canvas.ui.textAlign = "center";
if (enemy.special=='') {
if (enemy.specialText=='') {
core.fillText('ui', enemy.name, 115, 62 * i + 47, '#DDDDDD', 'bold 17px Verdana');
}
else {
core.fillText('ui', enemy.name, 115, 62 * i + 40, '#DDDDDD', 'bold 17px Verdana');
core.fillText('ui', enemy.special, 115, 62 * i + 62, '#FF6A6A', 'bold 15px Verdana');
core.fillText('ui', enemy.specialText, 115, 62 * i + 62, '#FF6A6A', 'bold 15px Verdana');
}
core.canvas.ui.textAlign = "left";
core.fillText('ui', '生命', 165, 62 * i + 32, '#DDDDDD', '13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.hp), 195, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.hp||0), 195, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', '攻击', 255, 62 * i + 32, '#DDDDDD', '13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.atk), 285, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.atk||0), 285, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', '防御', 335, 62 * i + 32, '#DDDDDD', '13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.def), 365, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.def||0), 365, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana');
var expOffset = 165, line_cnt=0;
if (core.flags.enableMoney) {
core.fillText('ui', '金币', 165, 62 * i + 50, '#DDDDDD', '13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.money), 195, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.money||0), 195, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana');
expOffset = 255;
line_cnt++;
}
@ -1367,7 +1367,7 @@ ui.prototype.drawBook = function (index) {
if (core.flags.enableAddPoint) {
core.canvas.ui.textAlign = "left";
core.fillText('ui', '加点', expOffset, 62 * i + 50, '#DDDDDD', '13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.point), expOffset + 30, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.point||0), expOffset + 30, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana');
expOffset = 255;
line_cnt++;
}
@ -1375,7 +1375,7 @@ ui.prototype.drawBook = function (index) {
if (core.flags.enableExperience && line_cnt<2) {
core.canvas.ui.textAlign = "left";
core.fillText('ui', '经验', expOffset, 62 * i + 50, '#DDDDDD', '13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.experience), expOffset + 30, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.experience||0), expOffset + 30, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana');
line_cnt++;
}
@ -1396,14 +1396,14 @@ ui.prototype.drawBook = function (index) {
if (damage<=0) color = '#00FF00';
damage = core.formatBigNumber(damage);
if (core.enemys.hasSpecial(core.material.enemys[enemy.id], 19))
if (core.enemys.hasSpecial(enemy, 19))
damage += "+";
if (core.enemys.hasSpecial(core.material.enemys[enemy.id], 21))
if (core.enemys.hasSpecial(enemy, 21))
damage += "-";
if (core.enemys.hasSpecial(core.material.enemys[enemy.id], 11))
if (core.enemys.hasSpecial(enemy, 11))
damage += "^";
}
if (core.material.enemys[enemy.id].notBomb)
if (enemy.notBomb)
damage += "[b]";
core.fillText('ui', damage, damageOffset, 62 * i + 50, color, 'bold 13px Verdana');
@ -1411,11 +1411,11 @@ ui.prototype.drawBook = function (index) {
core.canvas.ui.textAlign = "left";
core.fillText('ui', '临界', 165, 62 * i + 68, '#DDDDDD', '13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.critical), 195, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.critical||0), 195, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', '减伤', 255, 62 * i + 68, '#DDDDDD', '13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.criticalDamage), 285, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.criticalDamage||0), 285, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', '1防', 335, 62 * i + 68, '#DDDDDD', '13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.defDamage), 365, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', core.formatBigNumber(enemy.defDamage||0), 365, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana');
if (index == start+i) {
core.strokeRect('ui', 10, 62 * i + 13, 416-10*2, 62, '#FFD700');
@ -1436,8 +1436,7 @@ ui.prototype.drawBookDetail = function (index) {
if (index<0) index=0;
if (index>=enemys.length) index=enemys.length-1;
var enemyId=enemys[index].id;
var enemy = core.material.enemys[enemyId];
var enemy = enemys[index], enemyId = enemy.id;
var hints=core.enemys.getSpecialHint(enemy);
if (hints.length==0)

View File

@ -203,6 +203,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
"enableMoney": true,
"enableExperience": false,
"enableLevelUp": false,
"levelUpLeftMode": false,
"enableKeys": true,
"enablePZF": false,
"enableDebuff": false,
@ -232,6 +233,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
"portalWithoutTrigger": true,
"canGoDeadZone": false,
"enableMoveDirectly": true,
"enableDisabledShop": true
"enableDisabledShop": true,
"disableShopOnDamage": false
}
}

View File

@ -817,7 +817,11 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
// 进阶
if (core.flags.enableLevelUp && core.status.hero.lv<core.firstData.levelUp.length) {
core.statusBar.up.innerHTML = core.firstData.levelUp[core.status.hero.lv].need || " ";
var need = core.firstData.levelUp[core.status.hero.lv].need;
if (core.flags.levelUpLeftMode)
core.statusBar.up.innerHTML = (need - core.getStatus('experience')) || " ";
else
core.statusBar.up.innerHTML = need || " ";
}
else core.statusBar.up.innerHTML = " ";