diff --git a/B站视频教程.url b/B站视频教程.url new file mode 100644 index 00000000..036a8a64 --- /dev/null +++ b/B站视频教程.url @@ -0,0 +1,5 @@ +[{000214A0-0000-0000-C000-000000000046}] +Prop3=19,2 +[InternetShortcut] +IDList= +URL=https://www.bilibili.com/video/av32781473/ \ No newline at end of file diff --git a/HTML5魔塔样板使用指南.url b/HTML5魔塔样板使用说明文档.url similarity index 64% rename from HTML5魔塔样板使用指南.url rename to HTML5魔塔样板使用说明文档.url index 823d8f8d..021c516b 100644 --- a/HTML5魔塔样板使用指南.url +++ b/HTML5魔塔样板使用说明文档.url @@ -2,4 +2,4 @@ Prop3=19,2 [InternetShortcut] IDList= -URL=https://ckcz123.github.io/mota-js/ +URL=https://h5mota.com/games/template/docs/ \ No newline at end of file diff --git a/V2.0版本简易造塔流程(For新人).txt b/V2.0版本简易造塔流程(For新人).txt deleted file mode 100644 index 042e6517..00000000 --- a/V2.0版本简易造塔流程(For新人).txt +++ /dev/null @@ -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,如果有问题请加群提问。 diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index f7ee0fcd..2a3d6ddd 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -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([ diff --git a/_server/data.comment.js b/_server/data.comment.js index af1c0b4b..6d277522 100644 --- a/_server/data.comment.js +++ b/_server/data.comment.js @@ -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": "是否在经过领域/夹击/路障等伤害后禁用快捷商店。" + } } } } diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 582f98ff..0951f47d 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -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(), diff --git a/docs/personalization.md b/docs/personalization.md index 5d4211f3..612f3d46 100644 --- a/docs/personalization.md +++ b/docs/personalization.md @@ -548,50 +548,47 @@ this.myfunc = function(x) { 通过这种,将脚本和自定义事件混用的方式,可以达到和RM中公共事件类似的效果,即一个调用触发一系列事件。 - - ## 技能塔的支持 其实,在HTML5上制作技能塔是完全可行的。 diff --git a/libs/control.js b/libs/control.js index 541c503a..79e630ba 100644 --- a/libs/control.js +++ b/libs/control.js @@ -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' } }, { diff --git a/libs/core.js b/libs/core.js index 35186832..896989e1 100644 --- a/libs/core.js +++ b/libs/core.js @@ -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; diff --git a/libs/enemys.js b/libs/enemys.js index c6350103..7f87fc4e 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -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; } } diff --git a/libs/events.js b/libs/events.js index 1d35cce4..d01d6c8b 100644 --- a/libs/events.js +++ b/libs/events.js @@ -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); } // 道具 diff --git a/libs/ui.js b/libs/ui.js index 80292eef..0bec6669 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -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) diff --git a/project/data.js b/project/data.js index 22b396ea..89f513e0 100644 --- a/project/data.js +++ b/project/data.js @@ -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 } } \ No newline at end of file diff --git a/project/functions.js b/project/functions.js index 59ad43f7..ca618442 100644 --- a/project/functions.js +++ b/project/functions.js @@ -817,7 +817,11 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 进阶 if (core.flags.enableLevelUp && core.status.hero.lv