From f5c430a56d103d1899238f3549966a1bd10b1e5b Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Sun, 3 Nov 2019 14:35:21 +0800 Subject: [PATCH 1/6] Update docs --- _docs/api.md | 103 +++++++++++++++++++++++++++++++------------------ libs/loader.js | 20 +++++++--- 2 files changed, 81 insertions(+), 42 deletions(-) diff --git a/_docs/api.md b/_docs/api.md index 38916a10..af6bc655 100644 --- a/_docs/api.md +++ b/_docs/api.md @@ -338,7 +338,7 @@ core.setHeroMoveInterval(callback) core.moveOneStep(x, y) -每走完一步后执行的操作,被转发到了脚本编辑中。 +每走完一步后执行的操作,被转发到了脚本编辑中,执行脚本编辑moveOneStep中的内容。 core.moveAction(callback) @@ -349,6 +349,7 @@ core.moveAction(callback) core.moveHero(direction, callback) 令勇士朝一个方向行走。如果设置了callback,则只会行走一步,并执行回调。 否则,将一直朝该方向行走,直到core.status.heroStop为true为止。 +direction可为"up","down","right","left",分别对应上,下,右,左。 core.isMoving() @@ -361,10 +362,11 @@ core.waitHeroToStop(callback) core.turnHero(direction) 转向。如果设置了direction则会转到该方向,否则会右转。该函数会自动计入录像。 +direction可为"up","down","right","left",分别对应上,下,右,左。 core.moveDirectly(destX, destY) -尝试瞬间移动到某点,被转发到了脚本编辑中。 +尝试瞬间移动到某点,被转发到了脚本编辑中,执行脚本编辑中的内容。 此函数返回非负值代表成功进行瞬移,返回值是省略的步数;如果返回-1则代表没有成功瞬移。 @@ -499,12 +501,12 @@ core.syncSave(type) / core.syncLoad() core.saveData() -获得要存档的内容,实际转发到了脚本编辑中。 +获得要存档的内容,实际转发到了脚本编辑中,执行脚本编辑中的内容。 core.loadData(data, callback) 实际执行一次读档行为,data为读取到的数据,callback为执行完毕的回调。 -实际转发到了脚本编辑中。 +实际转发到了脚本编辑中,执行脚本编辑中的内容。 core.getSave(index, callback) @@ -534,19 +536,23 @@ core.removeSave(index) // ------ 属性、状态、位置、变量等 ------ // core.setStatus(name, value) -设置勇士当前的某个属性。 +设置勇士当前的某个属性,name可为"atk","def","hp"等。 +如core.setStatus("atk", 100)则为设置勇士攻击为100。 core.addStatus(name, value) -加减勇士当前的某个属性。等价于 core.setStatus(name, core.getStatus(name) + value) +加减勇士当前的某个属性,name可为"atk","def","hp"等。 +如core.addStatus("atk", 100)则为增加勇士攻击100点。 +等价于 core.setStatus(name, core.getStatus(name) + value)。 core.getStatus(name) -获得勇士的某个原始属性值。 +获得勇士的某个原始属性值,该值不受百分比增幅影响。 +譬如你有一件道具加10%的攻击,你可以使用该函数获得你的攻击被增幅前的数值 core.getStatusOrDefault(status, name) -尝试从status中获得某个原始属性值;如果status为null或不存在对应属性值则从勇士属性中获取。 +尝试从status中获得某个原始属性值,该值不受百分比增幅影响;如果status为null或不存在对应属性值则从勇士属性中获取。 此项在伤害计算函数中使用较多,例如传递新的攻击和防御来计算临界和1防减伤。 @@ -572,12 +578,14 @@ core.getBuff(name) core.setHeroLoc(name, value, noGather) -设置勇士位置属性。name只能为'x', 'y'和'direction'之一。 +设置勇士位置属性。name只能为'x'(勇士x坐标), 'y'(勇士y坐标)和'direction'(勇士朝向)之一。 如果noGather为true,则不会聚集所有的跟随者。 +譬如core.setHeroLoc("x", 1, true)则为设置勇士x坐标为1,不聚集所有跟随者。 core.getHeroLoc(name) 获得勇士的某个位置属性。如果name为null则直接返回core.status.hero.loc。 +譬如core.getHeroLoc("x")则返回勇士当前x坐标 core.getLvName(lv) @@ -586,19 +594,26 @@ core.getLvName(lv) core.setFlag(name, value) 设置某个自定义变量或flag。如果value为null则会调用core.removeFlag进行删除。 +这里的变量与事件中使用的变量等价 +譬如core.setFlag("xxx",1)则为设置变量xxx为1。 core.addFlag(name, value) 加减某个自定义的变量或flag。等价于 core.setFlag(name, core.getFlag(name, 0) + value) +这里的变量与事件中使用的变量等价 +譬如core.addFlag("xxx",1)则为增加变量xxx1 core.getFlag(name, defaultValue) -获得某个自定义的变量或flag。如果该flag不存在(从未赋值过),则返回defaultValue值。 +获得某个自定义的变量或flag。如果该flag不存在(从未赋值过),则返回defaultValue的值。 +这里的变量与事件中使用的变量等价 +譬如core.getFlag("xxx",1)则为获得变量xxx的值,如变量xxx不存在则返回1 core.hasFlag(name) 判定是否拥有某个自定义变量或flag。等价于 !!core.getFlag(name, 0) - +这里的变量与事件中使用的变量等价 +譬如core.hasFlag("xxx",1)则为判断变量xxx是否存在 core.removeFlag(name) 删除一个自定义变量或flag。 @@ -619,6 +634,8 @@ core.setWeather(type, level) core.setCurtain(color, time, callback) 更改画面色调。color为更改到的色调,是个三元或四元组;time为渐变时间,0代表立刻切换。 +譬如core.setCurtain([255,255,255,1], 0)即为无回调无等待更改画面色调为白色 + core.screenFlash(color, time, times, callback) @@ -707,7 +724,7 @@ special为要测试的内容,允许接收如下类型参数: core.getSpecials() -获得所有特殊属性的列表。实际上被转发到了脚本编辑中。 +获得所有特殊属性的列表。实际上被转发到了脚本编辑中,执行脚本编辑中的内容。 core.getSpecialText(enemy) @@ -747,7 +764,7 @@ number为要计算的临界值数量,不填默认为1。 core.getDefDamage(enemy, k, x, y, floorId) -获得某个怪物的k防减伤值。k可不填默认为1。 +获得某个怪物的k防减伤值。k可不填默认为1,x,y,floorId为当前xy坐标和楼层。 core.getEnemyInfo(enemy, hero, x, y, floorId) @@ -776,7 +793,7 @@ core.getCurrentEnemys(floorId) core.hasEnemyLeft(enemyId, floorId) 检查某个楼层是否还有剩余的(指定)怪物。 -floorId为楼层ID,可忽略表示当前楼层。也可以传数组如["MT0","MT1"]同时检测多个楼层。 +floorId为楼层ID,可忽略表示当前楼层。也可以填数组如["MT0","MT1"]同时检测多个楼层。 enemyId如果不填或null则检查是否剩余任何怪物,否则只检查是否剩余指定的某类怪物。 ``` @@ -806,16 +823,16 @@ seed为开始时要设置的的种子,route为要开始播放的录像,callb core.setInitData() 根据难度分歧来初始化难度,包括设置flag:hard,设置初始属性等。 -该函数实际被转发到了脚本编辑中。 +该函数实际被转发到了脚本编辑中,执行脚本编辑中的内容。 core.win(reason, norank) 游戏胜利,reason为结局名,norank如果为真则该结局不计入榜单。 -该函数实际被转发到了脚本编辑中。 +该函数实际被转发到了脚本编辑中,执行脚本编辑中的内容。 core.lose(reason) -游戏失败,reason为结局名。该函数实际被转发到了脚本编辑中。 +游戏失败,reason为结局名。该函数实际被转发到了脚本编辑中,执行脚本编辑中的内容。 core.gameOver(ending, fromReplay, norank) @@ -855,7 +872,7 @@ id为怪物的ID,x和y为怪物坐标,force如果为真将强制战斗,cal core.beforeBattle(enemyId, x, y) -战前事件。实际被转发到了脚本编辑中,可以在这里加上一些战前特效。 +战前事件。实际被转发到了脚本编辑中,执行脚本编辑中的内容,可以用于加上一些战前特效。 此函数在“检测能否战斗和自动存档”【之后】执行。 如果需要更早的战前事件,请在插件中覆重写 core.events.doSystemEvent 函数。 此函数返回true则将继续本次战斗,返回false将不再战斗。 @@ -863,7 +880,7 @@ core.beforeBattle(enemyId, x, y) core.afterBattle(enemyId, x, y, callback) 战后事件,将执行扣血、加金币经验、特殊属性处理、战后事件处理等操作。 -实际被转发到了脚本编辑中。 +实际被转发到了脚本编辑中,执行脚本编辑中的内容。 core.openDoor(x, y, needKey, callback) @@ -872,16 +889,17 @@ core.openDoor(x, y, needKey, callback) core.afterOpenDoor(doorId, x, y, callback) -开完一个门后执行的事件,实际被转发到了脚本编辑中。 +开完一个门后执行的事件,实际被转发到了脚本编辑中,执行脚本编辑中的内容。 core.getItem(id, num, x, y, callback) 获得若干个道具。itemId为道具ID,itemNum为获得的道具个数,不填默认为1。 -x和y为道具点的坐标,如果设置则会擦除地图上的该点。 +x和y为道具点的坐标,如果设置则会擦除地图上的该点,也可不填。 +譬如core.getItem("yellowKey",2)会直接获得两把黄钥匙。 core.afterGetItem(id, x, y, callback) -获得一个道具后执行的事件,实际被转发到了脚本编辑中。 +获得一个道具后执行的事件,实际被转发到了脚本编辑中,执行脚本编辑中的内容。 core.getNextItem(noRoute) @@ -918,7 +936,7 @@ core.pushBox(data) core.afterPushBox() -推箱子之后触发的事件,实际被转发到了脚本编辑中。 +推箱子之后触发的事件,实际被转发到了脚本编辑中,执行脚本编辑中的内容。 core.changeLight(id, x, y) @@ -1024,7 +1042,7 @@ core.follow(name) / core.unfollow(name) core.setValue(name, value, prefix) / core.addValue(name, value, prefix) 设置/增减某个数值。name可以是status:xxx,item:xxx或flag:xxx。 -value可以是一个表达式,将调用core.calValue()计算。prefix为前缀,独立开关使用。 +value可以是一个表达式,将调用core.calValue()计算。prefix为前缀,独立开关使用,脚本中一般忽略。 core.doEffect(effect, need, times) @@ -1032,7 +1050,8 @@ core.doEffect(effect, need, times) core.setFloorInfo(name, values, floorId, prefix) -设置某层楼的楼层属性。 +设置某层楼的楼层属性,其中name为该楼层属性对应的条目,values为要设置的值,floorId为楼层id,prefix一般直接忽略。 +譬如core.setFloorInfo("name","4", "MT1")则为设置MT1显示在状态栏中的层数为4 core.setGlobalAttribute(name, value) @@ -1191,8 +1210,9 @@ core.addItem(itemId, itemNum) core.getEquipTypeByName(name) -根据装备位名称来找到一个空的装备孔,适用于多重装备。 +根据装备位名称来找到一个空的装备孔,适用于多重装备,装备位名称可在全塔属性中设置。 如果没有一个装备孔是该装备名称,则返回-1。 +譬如:core.getEquipTypeByName("武器")默认返回全塔属性中武器对应的装备孔号0。 core.getEquipTypeById(equipId) @@ -1205,11 +1225,12 @@ core.canEquip(equipId, hint) core.loadEquip(equipId, callback) -穿上某个装备。 +穿上某个装备,equipId为装备id。 core.unloadEquip(equipType, callback) 脱下某个装备孔的装备。 +譬如core.unloadEquip(0)则为脱下0号装备孔中的装备,默认0号装备孔对应“武器”,1号装备孔对应“盾牌” core.compareEquipment(compareEquipId, beComparedEquipId) @@ -1285,7 +1306,7 @@ map为存档信息,如果某项在map中不存在则会从core.floors中读取 core.getNumberById(id) -给定一个图块ID,找到对应的数字。 +给定一个图块ID,找到图块对应的图块编号。 core.initBlock(x, y, id, addInfo, eventFloor) @@ -1421,7 +1442,7 @@ toDraw为要绘制到的信息(可为null,或为一个画布名),包括 // ------ 获得某个点的图块信息 ------ // core.noPass(x, y, floorId) -判定某个点是否有noPass的图块。 +判定某个点是否有noPass(不可通行)的图块。 core.npcExists(x, y, floorId) @@ -1429,7 +1450,7 @@ core.npcExists(x, y, floorId) core.terrainExists(x, y, id, floorId) -判定某个点是否有(指定的)地形存在。 +判定某个点是否有(id对应的)地形存在。 如果id为null,则只要存在terrains即为真,否则还会判定对应点的ID。 @@ -1442,7 +1463,7 @@ core.nearStair() core.enemyExists(x, y, id, floorId) -判定某个点是否有(指定的)怪物存在。 +判定某个点是否有(id对应的)怪物存在。 如果id为null,则只要存在怪物即为真,否则还会判定对应点的怪物ID。 请注意,如果需要判定某个楼层是否存在怪物请使用core.hasEnemyLeft()函数。 @@ -1499,14 +1520,17 @@ core.removeBlock(x, y, floorId) core.removeBlockById(index, floorId) +每个楼层的图块存成一个数组,index即为该数组中的索引,每个索引对应该地图中的一个图块 根据索引从地图的block数组中尽可能删除一个图块。floorId可不填或null表示当前楼层。 core.removeBlockByIds(floorId, ids) +ids为由索引组成的数组,如[0,1]等 根据索引数组从地图的block数组中尽可能删除一系列图块。floorId可不填或null表示当前楼层。 core.canRemoveBlock(block, floorId) +block为图块信息,可由core.getBlock获取 判定当前能否完全删除某个图块。floorId可不填或null表示当前楼层。 如果该点存在自定义事件,或者是重生怪,则不可进行删除。 @@ -1550,7 +1574,7 @@ number为要设置到的图块数字,x,y和floorId为目标点坐标和楼层 core.resetMap(floorId) 重置某层或若干层的地图和楼层属性。 -floorId可为某个楼层ID,或者一个楼层数组(同时重置若干层);如果不填则只重置当前楼层。 +floorId可为某个楼层ID,或者一个楼层数组如["MT1","MT2"](同时重置若干层);如果不填则只重置当前楼层。 // ------ 移动/跳跃图块,淡入淡出图块 ------ // @@ -1626,9 +1650,13 @@ core.clearMap(name) core.fillText(name, text, x, y, style, font, maxWidth) 在某个画布上绘制一段文字。 text为要绘制的文本,x,y为要绘制的坐标,style可选为绘制的样式,font可选为绘制的字体。(下同) +style可直接使用"red","white"等或用"rgba(255,255,255,1)"或用"#FFFFFF"等方式来获得字体对应的颜色 +font的格式为"20px Verdana"前者为字体大小,后者为字体 如果maxWidth不为null,则视为文字最大宽度,如果超过此宽度则会自动放缩文字直到自适应为止。 请注意textAlign和textBaseline将决定绘制的左右对齐和上下对齐方式。 具体可详见core.setTextAlign()和core.setTextBaseline()函数。 +譬如:core.fillText("ui", "这是要描绘的文字", 10, 10, "red", "20px Verdana", 100) +即是在ui图层上,以10,10为起始点,描绘20像素大小,Verdana字体的红色字,长度不超过100像素 core.fillBoldText(name, text, x, y, style, font) @@ -1636,7 +1664,7 @@ core.fillBoldText(name, text, x, y, style, font) core.fillRect(name, x, y, width, height, style) -绘制一个矩形。style可选为绘制样式。如果设置将调用core.setFillStyle()。(下同) +绘制一个矩形。width, height为矩形宽高,style可选为绘制样式。如果设置将调用core.setFillStyle()。(下同) core.strokeRect(name, x, y, width, height, style, lineWidth) @@ -1645,11 +1673,11 @@ lineWidth如果设置将调用core.setLineWidth()。(下同) core.drawLine(name, x1, y1, x2, y2, style, lineWidth) -绘制一条线。 +绘制一条线,x1y1为起始点像素,x2y2为终止点像素。 core.drawArrow(name, x1, y1, x2, y2, style, lineWidth) -绘制一个箭头。 +绘制一个箭头,x1y1为起始点像素,x2y2为终止点像素。 core.setFont(name, font) / core.setLineWidth(name, lineWidth) @@ -1671,7 +1699,7 @@ core.setFillStyle(name, style) / core.setStrokeStyle(name, style) core.setTextAlign(name, align) -设置一个画布的文字横向对齐模式,这里的align只能为'left', 'right'和'center'。 +设置一个画布的文字横向对齐模式,这里的align只能为'left', 'right'和'center',分别对应左对齐,右对齐,居中。 默认为'left'。 @@ -1862,7 +1890,7 @@ z值为创建的纵向高度(关系到画布之间的覆盖),z值高的将 core.ui.relocateCanvas(name, x, y) -重新定位一个自定义画布。x和y为画布的左上角坐标。 +重新定位一个自定义画布。x和y为画布的左上角坐标,name为画布名。 core.ui.resizeCanvas(name, width, height, styleOnly) @@ -2051,6 +2079,7 @@ core.matchWildcard(pattern, string) core.encodeBase64(str) / core.decodeBase64(str) 将字符串进行base64加密或解密。 +可用于解压缩录像数据 core.convertBase(str, fromBase, toBase) diff --git a/libs/loader.js b/libs/loader.js index 489d9ea4..5d4da850 100644 --- a/libs/loader.js +++ b/libs/loader.js @@ -107,11 +107,16 @@ loader.prototype.loadImages = function (names, toSave, callback) { for (var i = 0; i < names.length; i++) { this.loadImage(names[i], function (id, image) { core.loader._setStartLoadTipText('正在加载图片 ' + id + "..."); - toSave[id] = image; - items++; - core.loader._setStartProgressVal(items * (100 / names.length)); - if (items == names.length) { - if (callback) callback(); + if (toSave[id] !== undefined) { + if (image != null) + toSave[id] = image; + return; + } + toSave[id] = image; + items++; + core.loader._setStartProgressVal(items * (100 / names.length)); + if (items == names.length) { + if (callback) callback(); } }) } @@ -126,7 +131,12 @@ loader.prototype.loadImage = function (imgName, callback) { image.onload = function () { callback(imgName, image); } + image.onerror = function () { + callback(imgName, null); + } image.src = 'project/images/' + name + "?v=" + main.version; + if (name.endsWith('.gif')) + callback(imgName, null); } catch (e) { main.log(e); From e8ad81da8d97bcbc29d17640ad342448b56fce65 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 22 Nov 2019 00:23:48 +0800 Subject: [PATCH 2/6] Update 264 --- API列表.txt | 2 +- _docs/api.md | 3 ++- _docs/start.md | 2 +- _server/editor_datapanel.js | 2 +- _server/editor_game.js | 6 ++++-- _server/editor_legacy.js | 3 ++- _server/editor_ui.js | 39 +++++++++++++++++-------------------- libs/actions.js | 2 +- libs/control.js | 2 +- libs/ui.js | 2 +- libs/utils.js | 3 ++- 11 files changed, 34 insertions(+), 32 deletions(-) diff --git a/API列表.txt b/API列表.txt index 4ed96670..167b2ad0 100644 --- a/API列表.txt +++ b/API列表.txt @@ -2084,7 +2084,7 @@ num如果设置大于0,则生成一个[0, num-1]之间的数;否则生成一 即先生成一个真随机数,根据该数来推进伪随机的种子,这样就可以放心调用core.rand()啦。 -core.readFile(success, error) +core.readFile(success, error, accept) 读取一个本地文件内容。success和error分别为读取成功或失败的回调函数。 iOS平台暂不支持读取文件操作。 diff --git a/_docs/api.md b/_docs/api.md index af6bc655..63eaa3d4 100644 --- a/_docs/api.md +++ b/_docs/api.md @@ -2102,8 +2102,9 @@ num如果设置大于0,则生成一个[0, num-1]之间的数;否则生成一 即先生成一个真随机数,根据该数来推进伪随机的种子,这样就可以放心调用core.rand()啦。 -core.readFile(success, error) +core.readFile(success, error, accept) 读取一个本地文件内容。success和error分别为读取成功或失败的回调函数。 +accept如果设置则控制能选择的文件类型。 iOS平台暂不支持读取文件操作。 diff --git a/_docs/start.md b/_docs/start.md index ced7faa1..8db27c1c 100644 --- a/_docs/start.md +++ b/_docs/start.md @@ -235,7 +235,7 @@ HTML5的塔都是可以进行控制台调试的。 ## 编辑器的基本操作 -- **Alt+0~9, Ctrl+0~9** 保存和读取当前选中图块 +- **Alt+0~9, 0~9** 保存和读取当前选中图块 - **W/A/S/D** 移动大地图 - **Ctrl+Z** 撤销上次绘图 - **Ctrl+Y** 重做上次绘图 diff --git a/_server/editor_datapanel.js b/_server/editor_datapanel.js index 5e1baa46..08678104 100644 --- a/_server/editor_datapanel.js +++ b/_server/editor_datapanel.js @@ -511,7 +511,7 @@ editor_datapanel_wrapper = function (editor) { editor.dom.selectAppend.onchange(); }); }); - }, null, 'img'); + }, null, 'image/*', 'img'); return; } diff --git a/_server/editor_game.js b/_server/editor_game.js index 27c51001..4690f17c 100644 --- a/_server/editor_game.js +++ b/_server/editor_game.js @@ -115,10 +115,12 @@ editor_game_wrapper = function (editor, main, core) { var img = core.material.images.tilesets[imgName]; var width = Math.floor(img.width / 32), height = Math.floor(img.height / 32); if (img.width % 32 || img.height % 32) { - alert(imgName + '的长或宽不是32的整数倍, 请修改后刷新页面'); + // alert(imgName + '的长或宽不是32的整数倍, 请修改后刷新页面'); + console.warn(imgName + '的长或宽不是32的整数倍, 请修改后刷新页面'); } if (img.width * img.height > 32 * 32 * 3000) { - alert(imgName + '上的图块数量超过了3000,请修改后刷新页面'); + // alert(imgName + '上的图块数量超过了3000,请修改后刷新页面'); + console.warn(imgName + '上的图块数量超过了3000,请修改后刷新页面'); } for (var id = startOffset; id < startOffset + width * height; id++) { var x = (id - startOffset) % width, y = parseInt((id - startOffset) / width); diff --git a/_server/editor_legacy.js b/_server/editor_legacy.js index 1313ebbc..7242553c 100644 --- a/_server/editor_legacy.js +++ b/_server/editor_legacy.js @@ -217,7 +217,8 @@ tip.showHelp = function(value) { 'ESC或点击空白处可以自动保存当前修改', 'H键可以打开操作帮助哦', 'tileset贴图模式下可以按选中tileset素材,并在地图上拖动来一次绘制一个区域', - '可以拖动地图上的图块和事件,或按Ctrl+C, Ctrl+X和Ctrl+V进行复制,剪切和粘贴,Delete删除' + '可以拖动地图上的图块和事件,或按Ctrl+C, Ctrl+X和Ctrl+V进行复制,剪切和粘贴,Delete删除', + 'Alt+数字键保存图块,数字键读取保存的图块', ]; if (value == null) value = Math.floor(Math.random() * tips.length); printf('tips: ' + tips[value]) diff --git a/_server/editor_ui.js b/_server/editor_ui.js index 589b19d0..a82601e3 100644 --- a/_server/editor_ui.js +++ b/_server/editor_ui.js @@ -111,11 +111,6 @@ editor_ui_wrapper = function (editor) { if (editor_multi.id != "" || editor_blockly.id != "") return; - // 禁止快捷键的默认行为 - if (e.ctrlKey && [89, 90, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57].indexOf(e.keyCode) !== -1) - e.preventDefault(); - if (e.altKey && [48, 49, 50, 51, 52, 53, 54, 55, 56, 57].indexOf(e.keyCode) !== -1) - e.preventDefault(); //Ctrl+z 撤销上一步undo if (e.keyCode == 90 && e.ctrlKey && editor.uivalues.preMapData && editor.uivalues.currDrawData.pos.length && selectBox.isSelected()) { editor.map = JSON.parse(JSON.stringify(editor.uivalues.preMapData.map)); @@ -153,22 +148,10 @@ editor_ui_wrapper = function (editor) { } return; } - //ctrl + 0~9 切换到快捷图块 - if (e.ctrlKey && [48, 49, 50, 51, 52, 53, 54, 55, 56, 57].indexOf(e.keyCode) !== -1) { - editor.setSelectBoxFromInfo(JSON.parse(JSON.stringify(editor.uivalues.shortcut[e.keyCode] || 0))); - return; - } - //alt + 0~9 改变快捷图块 - if (e.altKey && [48, 49, 50, 51, 52, 53, 54, 55, 56, 57].indexOf(e.keyCode) !== -1) { - var infoToSave = JSON.stringify(editor.info || 0); - if (infoToSave == JSON.stringify({})) return; - editor.uivalues.shortcut[e.keyCode] = JSON.parse(infoToSave); - printf('已保存该快捷图块, ctrl + ' + (e.keyCode - 48) + ' 使用.') - core.setLocalStorage('shortcut', editor.uivalues.shortcut); - return; - } + var focusElement = document.activeElement; - if (!focusElement || focusElement.tagName.toLowerCase() == 'body') { + if (!focusElement || focusElement.tagName.toLowerCase() == 'body' + || focusElement.id == 'selectFloor') { // Ctrl+C, Ctrl+X, Ctrl+V if (e.ctrlKey && e.keyCode == 67 && !selectBox.isSelected()) { e.preventDefault(); @@ -223,6 +206,20 @@ editor_ui_wrapper = function (editor) { editor.info = {}; return; } + //alt + 0~9 改变快捷图块 + if (e.altKey && [48, 49, 50, 51, 52, 53, 54, 55, 56, 57].indexOf(e.keyCode) !== -1) { + var infoToSave = JSON.stringify(editor.info || 0); + if (infoToSave == JSON.stringify({})) return; + editor.uivalues.shortcut[e.keyCode] = JSON.parse(infoToSave); + printf('已保存该快捷图块, 数字键 ' + (e.keyCode - 48) + ' 使用.') + core.setLocalStorage('shortcut', editor.uivalues.shortcut); + return; + } + //ctrl + 0~9 切换到快捷图块 + if ([48, 49, 50, 51, 52, 53, 54, 55, 56, 57].indexOf(e.keyCode) !== -1) { + editor.setSelectBoxFromInfo(JSON.parse(JSON.stringify(editor.uivalues.shortcut[e.keyCode] || 0))); + return; + } switch (e.keyCode) { // WASD case 87: editor.moveViewport(0, -1); break; @@ -256,7 +253,7 @@ editor_ui_wrapper = function (editor) { "双击地图:选中对应点的素材\n" + "右键地图:弹出菜单栏\n" + "Alt+0~9:保存当前使用的图块\n" + - "Ctrl+0~9:选中保存的图块\n" + + "0~9:选中保存的图块\n" + "Ctrl+Z / Ctrl+Y:撤销/重做上次绘制\n" + "Ctrl+S:事件与脚本编辑器的保存并退出\n" + "双击事件编辑器:长文本编辑/脚本编辑/地图选点/UI绘制预览" diff --git a/libs/actions.js b/libs/actions.js index 7caba11d..1a8597dd 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -2103,7 +2103,7 @@ actions.prototype._clickSyncSave_readFile = function () { if (obj.version != core.firstData.version) return alert("游戏版本不一致!"); if (!obj.data) return alert("无效的存档!"); core.control._syncLoad_write(obj.data); - }); + }, null, ".h5save"); } actions.prototype._clickSyncSave_replay = function () { diff --git a/libs/control.js b/libs/control.js index 6f0a3854..5f7b5e6b 100644 --- a/libs/control.js +++ b/libs/control.js @@ -1122,7 +1122,7 @@ control.prototype.chooseReplayFile = function () { return; } _replay(); - }); + }, null, ".h5route"); } ////// 开始播放 ////// diff --git a/libs/ui.js b/libs/ui.js index 5491449f..a1b88121 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -459,7 +459,7 @@ ui.prototype.clearUI = function () { ////// 左上角绘制一段提示 ////// ui.prototype.drawTip = function (text, id, clear) { - if (clear) this.clearTip(); + this.clearTip(); var one = { text: text, textX: 21, diff --git a/libs/utils.js b/libs/utils.js index dd46d468..67ada600 100644 --- a/libs/utils.js +++ b/libs/utils.js @@ -761,7 +761,7 @@ utils.prototype.__next_rand = function (_rand) { } ////// 读取一个本地文件内容 ////// -utils.prototype.readFile = function (success, error, readType) { +utils.prototype.readFile = function (success, error, accept, readType) { core.platform.successCallback = success; core.platform.errorCallback = error; @@ -800,6 +800,7 @@ utils.prototype.readFile = function (success, error, readType) { else core.platform.fileReader.readAsDataURL(core.platform.fileInput.files[0]); core.platform.fileInput.value = ''; } + if (accept) core.platform.fileInput.accept = accept; } core.platform.fileInput.click(); From b3e11e19380232e6b044b30e046af189ef897cba Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 22 Nov 2019 21:29:45 +0800 Subject: [PATCH 3/6] win noexit --- _server/MotaAction.g4 | 9 +++++---- libs/events.js | 30 +++++++++++++++++++++--------- libs/utils.js | 1 + project/functions.js | 30 +++++++++++++++++++----------- 4 files changed, 46 insertions(+), 24 deletions(-) diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index 48c07482..bcb49afa 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -1724,15 +1724,16 @@ return code; */; win_s - : '游戏胜利,结局' ':' EvalString? '不计入榜单' Bool Newline + : '游戏胜利,结局' ':' EvalString? '不计入榜单' Bool '不结束游戏' Bool Newline /* win_s tooltip : win: 获得胜利, 该事件会显示获胜页面, 并重新游戏 helpUrl : https://h5mota.com/games/template/_docs/#/event?id=win%EF%BC%9A%E8%8E%B7%E5%BE%97%E8%83%9C%E5%88%A9 -default : ["",false] +default : ["",false, false] Bool_0 = Bool_0?', "norank": 1':''; -var code = '{"type": "win", "reason": "'+EvalString_0+'"'+Bool_0+'},\n'; +Bool_1 = Bool_1?', "noexit": 1':''; +var code = '{"type": "win", "reason": "'+EvalString_0+'"'+Bool_0+Bool_1+'},\n'; return code; */; @@ -3397,7 +3398,7 @@ ActionParser.prototype.parseAction = function() { break; case "win": this.next = MotaActionBlocks['win_s'].xmlText([ - data.reason,data.norank?true:false,this.next]); + data.reason,data.norank?true:false,data.noexit?true:false,this.next]); break; case "lose": this.next = MotaActionBlocks['lose_s'].xmlText([ diff --git a/libs/events.js b/libs/events.js index f6b4a0ec..c95f2390 100644 --- a/libs/events.js +++ b/libs/events.js @@ -108,9 +108,9 @@ events.prototype.setInitData = function () { } ////// 游戏获胜事件 ////// -events.prototype.win = function (reason, norank) { - core.status.gameOver = true; - return this.eventdata.win(reason, norank); +events.prototype.win = function (reason, norank, noexit) { + if (!noexit) core.status.gameOver = true; + return this.eventdata.win(reason, norank, noexit); } ////// 游戏失败事件 ////// @@ -121,10 +121,12 @@ events.prototype.lose = function (reason) { ////// 游戏结束 ////// events.prototype.gameOver = function (ending, fromReplay, norank) { - core.clearMap('all'); - core.deleteAllCanvas(); - core.dom.gif2.innerHTML = ""; - core.setWeather(); + if (!core.status.extraEvent) { + core.clearMap('all'); + core.deleteAllCanvas(); + core.dom.gif2.innerHTML = ""; + core.setWeather(); + } core.ui.closePanel(); if (main.isCompetition && ending != null) { @@ -220,12 +222,22 @@ events.prototype._gameOver_confirmDownload = function (ending) { } events.prototype._gameOver_askRate = function (ending) { + core.ui.closePanel(); + + // 继续接下来的事件 + if (core.status.extraEvent) { + core.status.event = core.status.extraEvent; + delete core.status.extraEvent; + core.lockControl(); + core.doAction(); + return; + } + if (ending == null) { core.restart(); return; } - core.ui.closePanel(); core.ui.drawConfirmBox("恭喜通关本塔,你想进行评分吗?", function () { if (core.platform.isPC) { window.open("/score.php?name=" + core.firstData.name + "&num=10", "_blank"); @@ -1624,7 +1636,7 @@ events.prototype._action_continue = function (data, x, y, prefix) { } events.prototype._action_win = function (data, x, y, prefix) { - this.win(data.reason, data.norank); + this.win(data.reason, data.norank, data.noexit); } events.prototype._action_lose = function (data, x, y, prefix) { diff --git a/libs/utils.js b/libs/utils.js index 67ada600..f3de8a29 100644 --- a/libs/utils.js +++ b/libs/utils.js @@ -648,6 +648,7 @@ utils.prototype.setStatusBarInnerHTML = function (name, value, css) { // 判定是否斜体 var italic = /^[-a-zA-Z0-9`~!@#$%^&*()_=+\[{\]}\\|;:'",<.>\/?]*$/.test(value); var style = 'font-style: ' + (italic ? 'italic' : 'normal') + '; '; + style += 'text-shadow: #000 1px 0 0, #000 0 1px 0, #000 -1px 0 0, #000 0 -1px 0; '; // 判定是否需要缩放 var length = this.strlen(value) || 1; style += 'font-size: ' + Math.min(1, 7 / length) + 'em; '; diff --git a/project/functions.js b/project/functions.js index ee55d2f7..2d06da23 100644 --- a/project/functions.js +++ b/project/functions.js @@ -74,23 +74,31 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.updateEnemys(); }, - "win": function(reason, norank) { + "win": function (reason, norank, noexit) { + // 游戏获胜事件 + // 请注意,成绩统计时是按照hp进行上传并排名 + // 可以先在这里对最终分数进行计算,比如将2倍攻击和5倍黄钥匙数量加到分数上 + // core.status.hero.hp += 2 * core.getRealStatus('atk') + 5 * core.itemCount('yellowKey'); + + // 如果不退出,则临时存储数据 + if (noexit) { + core.status.extraEvent = core.clone(core.status.event); + } + // 游戏获胜事件 core.ui.closePanel(); var replaying = core.isReplaying(); if (replaying) core.stopReplay(); - core.waitHeroToStop(function() { - core.clearMap('all'); // 清空全地图 - core.deleteAllCanvas(); // 删除所有创建的画布 - core.dom.gif2.innerHTML = ""; - // 请注意: - // 成绩统计时是按照hp进行上传并排名,因此光在这里改${status:hp}是无效的 - // 如需按照其他的的分数统计方式,请先将hp设置为你的得分 - // core.setStatus('hp', ...); + core.waitHeroToStop(function () { + if (!noexit) { + core.clearMap('all'); // 清空全地图 + core.deleteAllCanvas(); // 删除所有创建的画布 + core.dom.gif2.innerHTML = ""; + } core.drawText([ - "\t[" + (reason||"恭喜通关") + "]你的分数是${status:hp}。" + "\t[" + (reason || "恭喜通关") + "]你的分数是${status:hp}。" ], function () { - core.events.gameOver(reason||'', replaying, norank); + core.events.gameOver(reason || '', replaying, norank); }) }); }, From 31048d7d05acc2efcb0eb04fd1c889c64bc6cf19 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 22 Nov 2019 22:47:55 +0800 Subject: [PATCH 4/6] enemy:xxx && blockId:x,y --- _server/MotaAction.g4 | 81 ++++++++++++++++++++++++++++++++++++++- _server/editor_blockly.js | 34 +++++++++++++++- libs/utils.js | 6 +++ 3 files changed, 119 insertions(+), 2 deletions(-) diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index bcb49afa..38e889d5 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -2593,6 +2593,46 @@ return [code, Blockly.JavaScript.ORDER_ATOMIC]; */; +//这一条不会被antlr识别,总是会被归到idString_e +idString_3_e + : '怪物' IdString '的' EnemyId_List + + +/* idString_3_e +colour : this.idstring_eColor +default : ['greenSlime',"攻击"] +//todo 将其output改成'idString_e' +var code = 'enemy:'+IdString_0+'.'+EnemyId_List_0; +return [code, Blockly.JavaScript.ORDER_ATOMIC]; +*/; + + +//这一条不会被antlr识别,总是会被归到idString_e +idString_4_e + : '图块ID:' Int ',' Int + + +/* idString_4_e +colour : this.idstring_eColor +default : [0,0] +var code = 'blockId:'+Int_0+','+Int_1; +return [code, Blockly.JavaScript.ORDER_ATOMIC]; +*/; + + +//这一条不会被antlr识别,总是会被归到idString_e +idString_5_e + : '图块类别:' Int ',' Int + + +/* idString_5_e +colour : this.idstring_eColor +default : [0,0] +var code = 'blockCls:'+Int_0+','+Int_1; +return [code, Blockly.JavaScript.ORDER_ATOMIC]; +*/; + + evFlag_e : '独立开关' Letter_List @@ -2744,6 +2784,10 @@ Id_List : '变量' | '状态' | '物品' | '独立开关' | '全局存储' /*Id_List ['flag','status','item', 'switch', 'global']*/; +EnemyId_List + : '生命'|'攻击'|'防御'|'金币'|'经验'|'加点'|'属性'|'名称' + /*EnemyId_List ['hp','atk','def','money','experience','point','special','name']*/; + //转blockly后不保留需要加" EvalString : Equote_double (ESC_double | ~["\\])* Equote_double @@ -2804,6 +2848,9 @@ this.evisitor.mapColor=175; delete(this.block('negate_e').inputsInline); this.block('idString_1_e').output='idString_e'; this.block('idString_2_e').output='idString_e'; +this.block('idString_3_e').output='idString_e'; +this.block('idString_4_e').output='idString_e'; +this.block('idString_5_e').output='idString_e'; this.block('evFlag_e').output='idString_e'; */ @@ -3779,7 +3826,7 @@ MotaActionFunctions.pattern.replaceStatusList = [ ["mana", "魔力"], ["money", "金币"], ["experience", "经验"], - ["steps", "步数"] + ["steps", "步数"], ]; MotaActionFunctions.pattern.replaceItemList = [ @@ -3833,6 +3880,17 @@ MotaActionFunctions.pattern.replaceItemList = [ ["jumpShoes", "跳跃靴"], ]; +MotaActionFunctions.pattern.replaceEnemyList = [ + // 保证顺序! + ["name", "名称"], + ["atk", "攻击"], + ["def", "防御"], + ["money", "金币"], + ["experience", "经验"], + ["point", "加点"], + ["special", "属性"], +]; + MotaActionFunctions.disableReplace = false; MotaActionFunctions.replaceToName = function (str) { @@ -3852,6 +3910,16 @@ MotaActionFunctions.replaceToName = function (str) { return map[b] ? ("物品:" + map[b]) : b; }).replace(/item:/g, "物品:"); str = str.replace(/flag:/g, "变量:").replace(/switch:/g, "独立开关:").replace(/global:/g, "全局存储:"); + + map = {}; list = []; + MotaActionFunctions.pattern.replaceEnemyList.forEach(function (v) { + map[v[0]] = v[1]; list.push(v[0]); + }); + str = str.replace(new RegExp("enemy:([a-zA-Z0-9_]+).(" + list.join("|") + ")", "g"), function (a, b, c) { + return map[c] ? ("怪物:" + b + ":" + map[c]) : c; + }).replace(/enemy:/g, "怪物:"); + + str = str.replace(/blockId:/g, "图块ID:").replace(/blockCls:/g, "图块类别:"); return str; } @@ -3872,6 +3940,17 @@ MotaActionFunctions.replaceFromName = function (str) { return map[b] ? ("item:" + map[b]) : b; }).replace(/物品[::]/g, "item:"); str = str.replace(/变量[::]/g, "flag:").replace(/独立开关[::]/g, "switch:").replace(/全局存储[::]/g, "global:"); + + map = {}; list = []; + MotaActionFunctions.pattern.replaceEnemyList.forEach(function (v) { + map[v[1]] = v[0]; list.push(v[1]); + }); + str = str.replace(new RegExp("(enemy:|怪物[::])([a-zA-Z0-9_]+)[::](" + list.join("|") + ")", "g"), function (a, b, c, d) { + return map[d] ? ("enemy:" + c + ":" + map[d]) : d; + }).replace(/怪物[::]/g, "enemy:"); + + str = str.replace(/图块I[dD][::]/g, "blockId:").replace(/图块类别[::]/g, "blockCls:"); + return str; } diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index ef318e6a..6770e1e4 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -229,6 +229,9 @@ editor_blockly = function () { MotaActionBlocks['idString_e'].xmlText(), MotaActionBlocks['idString_1_e'].xmlText(), MotaActionBlocks['idString_2_e'].xmlText(), + MotaActionBlocks['idString_3_e'].xmlText(), + MotaActionBlocks['idString_4_e'].xmlText(), + MotaActionBlocks['idString_5_e'].xmlText(), MotaActionBlocks['evalString_e'].xmlText(), ], '常见事件模板':[ @@ -910,6 +913,28 @@ function omitedcheckUpdateFunction(event) { return Object.keys(editor.used_flags || {}).filter(function (one) { return one != token && one.startsWith(token); }).sort(); + } else if (before.endsWith("怪物") || (ch == ':' && before.endsWith("enemy"))) { + return Object.keys(core.material.enemys).filter(function (one) { + return one != token && one.startsWith(token); + }) + } else { + var index2 = Math.max(content.lastIndexOf(":", index-1), content.lastIndexOf(":", index-1)); + var ch2 = content.charAt(index2); + if (index2 >= 0) { + before = content.substring(0, index2); + if (before.endsWith("怪物") || (ch == ':' && ch2 == ':' && before.endsWith("enemy"))) { + var list = ["name", "hp", "atk", "def", "money", "experience", "point", "special"]; + if (before.endsWith("怪物") && MotaActionFunctions) { + list = MotaActionFunctions.pattern.replaceEnemyList.map(function (v) { + return v[1]; + }).concat(list); + } + return list.filter(function (one) { + return one != token && one.startsWith(token); + }) + } + } + } } } @@ -1039,7 +1064,7 @@ Blockly.FieldTextInput.prototype.showInlineEditor_ = function(quietInput) { // --- awesomplete var awesomplete = new Awesomplete(htmlInput, { - minChars: 2, + minChars: pb.type == "idString_3_e" ? 1 : 2, maxItems: 12, autoFirst: true, replace: function (text) { @@ -1094,6 +1119,13 @@ Blockly.FieldTextInput.prototype.showInlineEditor_ = function(quietInput) { } var list = editor_blockly.getAutoCompletions(value); + if (pb.type == "idString_3_e") { + list = list.concat(Object.keys(core.material.enemys).filter(function (one) { + return one != value && one.startsWith(value); + })); + list.sort(); + } + awesomplete.list = list; awesomplete.ul.style.marginLeft = getCaretCoordinates(htmlInput, htmlInput.selectionStart).left - htmlInput.scrollLeft - 20 + "px"; diff --git a/libs/utils.js b/libs/utils.js index f3de8a29..d8f811c7 100644 --- a/libs/utils.js +++ b/libs/utils.js @@ -81,6 +81,12 @@ utils.prototype.calValue = function (value, prefix, need, times) { value = value.replace(/switch:([a-zA-Z0-9_]+)/g, "core.getFlag('" + (prefix || ":f@x@y") + "@$1', 0)"); if (value.indexOf('global:') >= 0) value = value.replace(/global:([a-zA-Z0-9_\u4E00-\u9FCC]+)/g, "core.getGlobal('$1', 0)"); + if (value.indexOf('enemy:')>=0) + value = value.replace(/enemy:([a-zA-Z0-9_]+)\.([a-zA-Z0-9_]+)/g, "core.material.enemys['$1'].$2"); + if (value.indexOf('blockId:')>=0) + value = value.replace(/blockId:(\d+),(\d+)/g, "core.getBlockId($1, $2)"); + if (value.indexOf('blockCls:')>=0) + value = value.replace(/blockCls:(\d+),(\d+)/g, "core.getBlockCls($1, $2)"); } return eval(value); } From 755c998ab84840252c36969e7f081892365b543a Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 29 Nov 2019 13:16:57 +0800 Subject: [PATCH 5/6] setEnemy --- _server/MotaAction.g4 | 20 ++++++++++++++++++++ _server/editor_blockly.js | 1 + libs/enemys.js | 11 ++++++++++- libs/events.js | 18 ++++++++++++++++++ project/functions.js | 20 +++----------------- 5 files changed, 52 insertions(+), 18 deletions(-) diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index 38e889d5..d9d00eb5 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -322,6 +322,7 @@ action | tip_s | setValue_s | addValue_s + | setEnemy_s | setFloor_s | setGlobalAttribute_s | setGlobalValue_s @@ -610,6 +611,21 @@ var code = '{"type": "addValue", "name": "'+idString_e_0+'", "value": "'+express return code; */; + +setEnemy_s + : '设置怪物属性' ':' '怪物ID' IdString '的' EnemyId_List '值' expression Newline + + +/* setEnemy_s +tooltip : setEnemy:设置某个怪物的属性 +default : ["greenSlime", "atk", "0"] +helpUrl : https://h5mota.com/games/template/_docs/#/event?id=addValue%ef%bc%9a%e5%a2%9e%e5%87%8f%e5%8b%87%e5%a3%ab%e7%9a%84%e6%9f%90%e4%b8%aa%e5%b1%9e%e6%80%a7%e3%80%81%e9%81%93%e5%85%b7%e4%b8%aa%e6%95%b0%ef%bc%8c%e6%88%96%e6%9f%90%e4%b8%aa%e5%8f%98%e9%87%8f%2fFlag%e7%9a%84%e5%80%bc +colour : this.dataColor +var code = '{"type": "setEnemy", "id": "'+IdString_0+'", "name": "'+EnemyId_List_0+'", "value": "'+expression_0+'"},\n'; +return code; +*/; + + setFloor_s : '设置楼层属性' ':' Floor_Meta_List '楼层名' IdString? '值' EvalString Newline @@ -3352,6 +3368,10 @@ ActionParser.prototype.parseAction = function() { MotaActionBlocks['evalString_e'].xmlText([data.value]), this.next]); break; + case "setEnemy": + this.next = MotaActionBlocks['setEnemy_s'].xmlText([ + data.id, data.name, MotaActionBlocks['evalString_e'].xmlText([data.value]), this.next]); + break; case "setFloor": this.next = MotaActionBlocks['setFloor_s'].xmlText([ data.name, data.floorId||null, data.value, this.next]); diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 6770e1e4..d49d0eed 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -105,6 +105,7 @@ editor_blockly = function () { MotaActionBlocks['setValue_s'].xmlText([ MotaActionBlocks['idString_1_e'].xmlText(['status','生命']) ]), + MotaActionBlocks['setEnemy_s'].xmlText(), MotaActionBlocks['setFloor_s'].xmlText(), MotaActionBlocks['setGlobalAttribute_s'].xmlText(), MotaActionBlocks['setGlobalValue_s'].xmlText(), diff --git a/libs/enemys.js b/libs/enemys.js index 70e8263b..6e98603c 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -19,7 +19,16 @@ enemys.prototype._init = function () { } enemys.prototype.getEnemys = function () { - return core.clone(this.enemys); + var enemys = core.clone(this.enemys); + var enemyInfo = core.getFlag('enemyInfo'); + if (enemyInfo) { + for (var id in enemyInfo) { + for (var name in enemyInfo[id]) { + enemys[id][name] = core.clone(enemyInfo[id][name]); + } + } + } + return enemys; } ////// 判断是否含有某特殊属性 ////// diff --git a/libs/events.js b/libs/events.js index c95f2390..649e604d 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1465,6 +1465,11 @@ events.prototype._action_addValue = function (data, x, y, prefix) { core.doAction(); } +events.prototype._action_setEnemy = function (data, x, y, prefix) { + this.setEnemy(data.id, data.name, data.value, prefix); + core.doAction(); +} + events.prototype._action_setFloor = function (data, x, y, prefix) { this.setFloorInfo(data.name, data.value, data.floorId, prefix); core.doAction(); @@ -2150,6 +2155,19 @@ events.prototype.doEffect = function (effect, need, times) { }); } +////// 设置一个怪物属性 ////// +events.prototype.setEnemy = function (id, name, value, prefix) { + if (!core.hasFlag('enemyInfo')) { + core.setFlag('enemyInfo', {}); + } + var enemyInfo = core.getFlag('enemyInfo'); + if (!enemyInfo[id]) enemyInfo[id] = {}; + value = core.calValue(value, prefix); + enemyInfo[id][name] = value; + (core.material.enemys[id]||{})[name] = core.clone(value); + core.updateStatusBar(); +} + ////// 设置楼层属性 ////// events.prototype.setFloorInfo = function (name, value, floorId, prefix) { floorId = floorId || core.status.floorId; diff --git a/project/functions.js b/project/functions.js index 2d06da23..78a7b3c4 100644 --- a/project/functions.js +++ b/project/functions.js @@ -642,9 +642,9 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = hero_atk = core.getRealStatusOrDefault(hero, 'atk'), hero_def = core.getRealStatusOrDefault(hero, 'def'), hero_mdef = core.getRealStatusOrDefault(hero, 'mdef'), - origin_hero_hp = hero_hp, - origin_hero_atk = hero_atk, - origin_hero_def = hero_def; + origin_hero_hp = core.getStatusOrDefault(hero, 'hp'), + origin_hero_atk = core.getStatusOrDefault(hero, 'atk'), + origin_hero_def = core.getStatusOrDefault(hero, 'def'); // 勇士的负属性都按0计算 hero_hp = Math.max(0, hero_hp); @@ -1350,20 +1350,6 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = main.log(e); } } - - // 下面是一个并行事件开门的样例 - /* - // 如果某个flag为真 - if (core.hasFlag("xxx")) { - // 千万别忘了将该flag清空!否则下次仍然会执行这段代码。 - core.removeFlag("xxx"); - // 使用insertAction来插入若干自定义事件执行 - core.insertAction([ - {"type":"openDoor", "loc":[0,0], "floorId": "MT0"} - ]) - // 也可以写任意其他的脚本代码 - } - */ } }, "ui": { From 257a14248eed71f75e456652d2b6ee25dbfa3853 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 29 Nov 2019 13:32:15 +0800 Subject: [PATCH 6/6] setEnemy --- API列表.txt | 4 -- _docs/api.md | 9 ++-- _docs/event.md | 64 ++++++++++------------------- _docs/img/events/15.png | Bin 0 -> 78971 bytes _server/MotaAction.g4 | 17 -------- _server/editor_blockly.js | 1 - _server/table/functions.comment.js | 6 --- libs/enemys.js | 6 +-- libs/events.js | 6 --- project/functions.js | 16 -------- 10 files changed, 28 insertions(+), 101 deletions(-) create mode 100644 _docs/img/events/15.png diff --git a/API列表.txt b/API列表.txt index 167b2ad0..6271e411 100644 --- a/API列表.txt +++ b/API列表.txt @@ -776,10 +776,6 @@ hero可为null或一个对象,具体将使用core.getRealStatusOrDefault(hero, 从V2.5.5开始,该函数也允许直接返回一个数字,代表战斗伤害值,此时回合数将视为0。 -core.updateEnemys() -更新怪物数据。该函数实际被转发到了脚本编辑中。详见文档-事件-更新怪物数据。 - - core.getCurrentEnemys(floorId) 获得某个楼层不重复的怪物信息,floorId不填默认为当前楼层。该函数会被怪物手册所调用。 该函数将返回一个列表,每一项都是一个不同的怪物,按照伤害值从小到大排序。 diff --git a/_docs/api.md b/_docs/api.md index 63eaa3d4..735ddd86 100644 --- a/_docs/api.md +++ b/_docs/api.md @@ -781,10 +781,6 @@ hero可为null或一个对象,具体将使用core.getRealStatusOrDefault(hero, 从V2.5.5开始,该函数也允许直接返回一个数字,代表战斗伤害值,此时回合数将视为0。 -core.updateEnemys() -更新怪物数据。该函数实际被转发到了脚本编辑中。详见文档-事件-更新怪物数据。 - - core.getCurrentEnemys(floorId) 获得某个楼层不重复的怪物信息,floorId不填默认为当前楼层。该函数会被怪物手册所调用。 该函数将返回一个列表,每一项都是一个不同的怪物,按照伤害值从小到大排序。 @@ -1049,6 +1045,11 @@ core.doEffect(effect, need, times) 执行一个effect操作。该函数目前仅被全局商店的status:xxx+=yyy所调用。 +core.setEnemy(id, name, value, prefix) +设置一个怪物属性。id为怪物的ID,name为要设置的项,比如hp,atk,def等等。 +value可以是一个表达式,将调用core.calValue()计算。prefix为前缀,独立开关使用,脚本中一般忽略。 + + core.setFloorInfo(name, values, floorId, prefix) 设置某层楼的楼层属性,其中name为该楼层属性对应的条目,values为要设置的值,floorId为楼层id,prefix一般直接忽略。 譬如core.setFloorInfo("name","4", "MT1")则为设置MT1显示在状态栏中的层数为4 diff --git a/_docs/event.md b/_docs/event.md index 461b2c9c..20a47522 100644 --- a/_docs/event.md +++ b/_docs/event.md @@ -499,6 +499,27 @@ value是一个表达式,将通过这个表达式计算出的结果赋值给nam ![](img/events/14.jpg) + +### setEnemy:设置怪物属性 + +使用`{"type":"setEnemy"}`可以设置某个怪物的某个属性 + +``` js +[ + {"type": "setEnemy", "id": "greenSlime", "name": "hp", "value": "1000"}, // 设置绿色史莱姆生命1000 + {"type": "setEnemy", "id": "redSlime", "name": "special", "value": "[1,2]"}, // 设置红色史莱姆先攻魔攻 + {"type": "setEnemy", "id": "redSlime", "name": "name", "value": "'小史莱姆'"}, // 设置怪物名称 +] +``` + +![](img/events/15.png) + +id为必填项,代表要修改的怪物ID。 + +name为必填项,代表要修改的项,例如`hp`, `atk`, `def`, `money`, `experience`, `point`, `special`, `name`。 + +value为必填项,代表要修改到的内容。对于修改名称的,必须加单引号。 + ### setFloor:设置楼层属性 使用`{"type":"setFloor"}`可以设置某层楼的楼层属性。 @@ -898,12 +919,6 @@ name是可选的,代表目标行走图的文件名。 使用`{"type": "showHero"}`会重新显示勇士。 -### updateEnemys:更新怪物数据 - -使用 `{"type": "updateEnemys"}` 可以动态修改怪物数据。 - -详见[怪物数据的动态修改](#怪物数据的动态修改)。 - ### sleep:等待多少毫秒 等价于RMXP中的"等待x帧",不过是以毫秒来计算。 @@ -2646,43 +2661,6 @@ if (core.flags.enableAddPoint && point > 0) { } ``` -## 怪物数据的动态修改 - -有时候我们可能还需要在游戏过程中动态修改怪物数据,例如50层魔塔的封印魔王,或者根据难度分歧来调整最终Boss的属性数据。 - -而在我们的存档中,是不会对怪物数据进行存储的,只会存各个变量和Flag,因此我们需要在读档后根据变量或Flag来调整怪物数据。 - -我们可以在脚本编辑中的`updateEnemys`进行处理。 - -``` js -"updateEnemys" : function () { - // 更新怪物数据,可以在这里对怪物属性和数据进行动态更新,详见文档——事件——怪物数据的动态修改 - // 比如下面这个例子,如果flag:xxx为真,则将绿头怪的攻击设为100,红头怪的金币设为20 - // 推荐写变化后的具体数值,以免多次变化导致冲突 - /* - // 如果flag:xxx为真;你也可以写其他判断语句比如core.hasItem(...)等等 - if (core.hasFlag('xxx')) { - core.material.enemys.greenSlime.atk = 100; - core.material.enemys.redSlime.money = 20; - } - */ - // 别忘了在事件中调用“更新怪物数据”事件! -} -``` - -当我们获得一个道具(或者触发某个事件等)后,需要在事件中调用“更新怪物数据”事件。 - -``` js -// 调用`updateEnemys`(更新怪物数据)事件就可以触发了 -[ - "将flag:xxx置为真,就可以让怪物数据发生改变!", - {"type": "setValue", "name": "flag:xxx", "value": "true"}, // 将flag:xxx置为真 - {"type": "updateEnemys"} // 更新怪物数据;此时绿头怪攻击就会变成100了 -] -``` - -事实上,除了动态修改怪物属性外,也可以在这里动态修改道具的类型、使用效果等等。都是一样的。 - ## 战前剧情 有时候光战后事件`afterBattle`是不够的,我们可能还需要战前剧情,例如Boss战之前和Boss进行一段对话。 diff --git a/_docs/img/events/15.png b/_docs/img/events/15.png new file mode 100644 index 0000000000000000000000000000000000000000..b1fe91cc355aa2b80fc3c121bd0b8eec5a0535b1 GIT binary patch literal 78971 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

A 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 literal 0 HcmV?d00001 diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index d9d00eb5..fcde32aa 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -346,7 +346,6 @@ action | hideStatusBar_s | showHero_s | hideHero_s - | updateEnemys_s | sleep_s | wait_s | waitAsync_s @@ -1102,18 +1101,6 @@ var code = '{"type": "hideHero"},\n'; return code; */; -updateEnemys_s - : '更新怪物数据' Newline - - -/* updateEnemys_s -tooltip : updateEnemys: 立刻更新怪物数据 -helpUrl : https://h5mota.com/games/template/_docs/#/event?id=updateEnemys%ef%bc%9a%e6%9b%b4%e6%96%b0%e6%80%aa%e7%89%a9%e6%95%b0%e6%8d%ae -colour : this.dataColor -var code = '{"type": "updateEnemys"},\n'; -return code; -*/; - sleep_s : '等待' Int '毫秒' '不可被Ctrl跳过' Bool Newline @@ -3501,10 +3488,6 @@ ActionParser.prototype.parseAction = function() { this.next = MotaActionBlocks['hideHero_s'].xmlText([ this.next]); break; - case "updateEnemys": - this.next = MotaActionBlocks['updateEnemys_s'].xmlText([ - this.next]); - break; case "sleep": // 等待多少毫秒 this.next = MotaActionBlocks['sleep_s'].xmlText([ data.time||0,data.noSkip||false,this.next]); diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index d49d0eed..53907f1c 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -113,7 +113,6 @@ editor_blockly = function () { MotaActionBlocks['input_s'].xmlText(), MotaActionBlocks['input2_s'].xmlText(), MotaActionBlocks['update_s'].xmlText(), - MotaActionBlocks['updateEnemys_s'].xmlText(), MotaActionBlocks['moveHero_s'].xmlText(), MotaActionBlocks['jumpHero_s'].xmlText(), MotaActionBlocks['changeFloor_s'].xmlText(), diff --git a/_server/table/functions.comment.js b/_server/table/functions.comment.js index 55dc8d1c..6f30fa75 100644 --- a/_server/table/functions.comment.js +++ b/_server/table/functions.comment.js @@ -128,12 +128,6 @@ var functions_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_type": "textarea", "_lint": true, "_data": "获得战斗伤害信息" - }, - "updateEnemys": { - "_leaf": true, - "_type": "textarea", - "_lint": true, - "_data": "更新怪物数据" } } }, diff --git a/libs/enemys.js b/libs/enemys.js index 6e98603c..e9aaab26 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -307,10 +307,8 @@ enemys.prototype._calDamage = function (enemy, hero, x, y, floorId) { return info.damage; } -////// 更新怪物数据 ////// -enemys.prototype.updateEnemys = function () { - return this.enemydata.updateEnemys(); -} +////// 更新怪物数据。已经不再使用,这里留空进行兼容。 ////// +enemys.prototype.updateEnemys = function () {} ////// 获得当前楼层的怪物列表 ////// enemys.prototype.getCurrentEnemys = function (floorId) { diff --git a/libs/events.js b/libs/events.js index 649e604d..85758759 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1692,12 +1692,6 @@ events.prototype._action_hideHero = function (data, x, y, prefix) { core.doAction(); } -events.prototype._action_updateEnemys = function (data, x, y, prefix) { - core.enemys.updateEnemys(); - core.updateStatusBar(); - core.doAction(); -} - events.prototype._action_vibrate = function (data, x, y, prefix) { this.__action_doAsyncFunc(data.async, core.vibrate, data.time); } diff --git a/project/functions.js b/project/functions.js index 78a7b3c4..71f6223a 100644 --- a/project/functions.js +++ b/project/functions.js @@ -71,8 +71,6 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 设置已经到过的楼层 core.setFlag("__visited__", {}); - - core.updateEnemys(); }, "win": function (reason, norank, noexit) { // 游戏获胜事件 @@ -774,18 +772,6 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = "turn": Math.floor(turn), "damage": Math.floor(damage) }; -}, - "updateEnemys": function () { - // 更新怪物数据,可以在这里对怪物属性和数据进行动态更新,详见文档——事件——怪物数据的动态修改 - // 此函数执行时间:重新开始游戏、读档后、通过事件调用“更新怪物数据”时 - - // 比如下面这个例子,如果flag:xxx为真,则将绿头怪的攻击设为100,金币设为20 - /* - if (core.hasFlag('xxx')) { - core.material.enemys.greenSlime.atk = 100; - core.material.enemys.greenSlime.money = 20; - } - */ } }, "actions": { @@ -1012,8 +998,6 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.material.icons.hero.width = core.material.images.images[icon].width / 4; core.material.icons.hero.height = core.material.images.images[icon].height / 4; } - // 刷新怪物数据 - core.updateEnemys(); // TODO:增加自己的一些读档处理