From 363d451f50605e9085a03b118976df7d8a69b6a4 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 22 May 2020 19:45:43 +0800 Subject: [PATCH] =?UTF-8?q?=E9=81=93=E5=85=B7=E4=B8=8E=E6=80=AA=E7=89=A9?= =?UTF-8?q?=E5=90=8D=E7=9A=84=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _server/MotaAction.g4 | 2 +- _server/MotaActionParser.js | 146 ++++++++++++++++++++---------------- _server/editor_blockly.js | 20 ++++- _server/table/comment.js | 2 +- 4 files changed, 103 insertions(+), 67 deletions(-) diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index 5d4ef2a5..6bb5db27 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -3108,7 +3108,7 @@ Id_List EnemyId_List : '生命'|'攻击'|'防御'|'金币'|'经验'|'加点'|'属性'|'名称'|'映射名'|'value'|'atkValue'|'defValue'|'notBomb'|'zoneSquare'|'range'|'n'|'add'|'damage' - /*EnemyId_List ['hp','atk','def','money','exp','point','special','name','displayInBook','value','atkValue','defValue','notBomb','zoneSquare','range','n','add','damage']*/; + /*EnemyId_List ['hp','atk','def','money','exp','point','special','name','displayInBook','属性值','退化扣攻','退化扣防','不可炸','九宫格领域','领域范围','连击数','吸血到自身','固伤值']*/; Equip_List : '生命'|'生命上限'|'攻击'|'防御'|'护盾'|'魔力'|'魔力上限' diff --git a/_server/MotaActionParser.js b/_server/MotaActionParser.js index dbe5580d..86b03897 100644 --- a/_server/MotaActionParser.js +++ b/_server/MotaActionParser.js @@ -67,7 +67,7 @@ ActionParser.prototype.parse = function (obj,type) { Object.keys(obj).sort().forEach(function (key) { var one = knownEquipListKeys.indexOf(key) >= 0 ? 'equipKnown' : 'equipUnknown'; text_choices = MotaActionBlocks[one].xmlText([ - key, obj.key, text_choices + key, obj[key], text_choices ]); }) return text_choices; @@ -83,7 +83,7 @@ ActionParser.prototype.parse = function (obj,type) { Object.keys(obj).sort().forEach(function (key) { var one = knownListKeys.indexOf(key) >= 0 ? 'doorKeyKnown' : 'doorKeyUnknown'; text_choices = MotaActionBlocks[one].xmlText([ - key, obj.key, text_choices + one == 'doorKeyUnknown' ? MotaActionFunctions.replaceToName_token(key) : key, obj[key], text_choices ]); }) return text_choices; @@ -474,11 +474,11 @@ ActionParser.prototype.parseAction = function() { break; case "useItem": // 使用道具 this.next = MotaActionBlocks['useItem_s'].xmlText([ - data.id,this.next]); + MotaActionFunctions.replaceToName_token(data.id),this.next]); break; case "loadEquip": // 装上装备 this.next = MotaActionBlocks['loadEquip_s'].xmlText([ - data.id,this.next]); + MotaActionFunctions.replaceToName_token(data.id),this.next]); break; case "unloadEquip": // 卸下装备 this.next = MotaActionBlocks['unloadEquip_s'].xmlText([ @@ -495,7 +495,7 @@ ActionParser.prototype.parseAction = function() { case "battle": // 强制战斗 if (data.id) { this.next = MotaActionBlocks['battle_s'].xmlText([ - data.id,this.next]); + MotaActionFunctions.replaceToName_token(data.id),this.next]); } else { data.loc = data.loc || []; @@ -564,7 +564,7 @@ ActionParser.prototype.parseAction = function() { break; case "setEnemy": this.next = MotaActionBlocks['setEnemy_s'].xmlText([ - data.id, data.name, this.expandEvalBlock([data.value]), this.next]); + MotaActionFunctions.replaceToName_token(data.id), data.name, this.expandEvalBlock([data.value]), this.next]); break; case "setFloor": this.next = MotaActionBlocks['setFloor_s'].xmlText([ @@ -1027,7 +1027,7 @@ ActionParser.prototype.matchEvalAtom = function(args) { var EnemyId_List=MotaActionBlocks['EnemyId_List'].options; // [["生命", "hp"], ...] match=new RegExp("^enemy:([a-zA-Z0-9_]+):(" + EnemyId_List.map(function(v){return v[1]}).join('|') + ")$").exec(args[0]) if(match){ - args=[match[1],match[2]] + args=[MotaActionFunctions.replaceToName_token(match[1]),match[2]] return rt(MotaActionBlocks['enemyattr_e'].xmlText, args); } // 图块ID @@ -1156,6 +1156,7 @@ MotaActionFunctions.IntString_pre = function (IntString) { MotaActionFunctions.IdString_pre = function(IdString){ if (IdString.indexOf('__door__')!==-1) throw new Error('请修改开门变量__door__,如door1,door2,door3等依次向后。请勿存在两个门使用相同的开门变量。'); IdString = MotaActionFunctions.replaceFromName(IdString); + IdString = MotaActionFunctions.replaceFromName_token(IdString); if (IdString && !(MotaActionFunctions.pattern.id.test(IdString)) && !(MotaActionFunctions.pattern.idWithoutFlag.test(IdString))) throw new Error('id: '+IdString+'中包含了0-9 a-z A-Z _ - :之外的字符'); return IdString; @@ -1241,59 +1242,46 @@ MotaActionFunctions.pattern.replaceStatusList = [ ["steps", "步数"], ]; -MotaActionFunctions.pattern.replaceItemList = [ - // 保证顺序! - ["yellowKey", "黄钥匙"], - ["blueKey", "蓝钥匙"], - ["redKey", "红钥匙"], - ["redGem", "红宝石"], - ["blueGem", "蓝宝石"], - ["greenGem", "绿宝石"], - ["yellowGem", "黄宝石"], - ["redPotion", "红血瓶"], - ["bluePotion", "蓝血瓶"], - ["yellowPotion", "黄血瓶"], - ["greenPotion", "绿血瓶"], - ["sword1", "铁剑"], - ["sword2", "银剑"], - ["sword3", "骑士剑"], - ["sword4", "圣剑"], - ["sword5", "神圣剑"], - ["shield1", "铁盾"], - ["shield2", "银盾"], - ["shield3", "骑士盾"], - ["shield4", "圣盾"], - ["shield5", "神圣盾"], - ["superPotion", "圣水"], - ["silverCoin", "银币"], - ["book", "怪物手册"], - ["fly", "楼层传送器"], - ["coin", "幸运金币"], - ["freezeBadge", "冰冻徽章"], - ["cross", "十字架"], - ["dagger", "屠龙匕首"], - ["amulet", "护符"], - ["bigKey", "大黄门钥匙"], - ["greenKey", "绿钥匙"], - ["steelKey", "铁门钥匙"], - ["pickaxe", "破墙镐"], - ["icePickaxe", "破冰镐"], - ["bomb", "炸弹"], - ["centerFly", "中心对称飞行器"], - ["upFly", "上楼器"], - ["downFly", "下楼器"], - ["earthquake", "地震卷轴"], - ["poisonWine", "解毒药水"], - ["weakWine", "解衰药水"], - ["curseWine", "解咒药水"], - ["superWine", "万能药水"], - ["hammer", "圣锤"], - ["lifeWand", "生命魔杖"], - ["jumpShoes", "跳跃靴"], -]; -MotaActionFunctions.pattern.replaceEnemyList = [ +(function() { + // 读道具列表 + MotaActionFunctions.pattern.replaceItemList = []; + for (var id in core.material.items) { + var name = core.material.items[id].name; + if (id && name && name != '新物品') { + var hasPrefix = false; + MotaActionFunctions.pattern.replaceItemList.forEach(function (one) { + if (one[0].startsWith(id) || id.startsWith(one[0]) || one[1].startsWith(name) || name.startsWith(one[1])) { + hasPrefix = true; + } + }); + if (!hasPrefix) { + MotaActionFunctions.pattern.replaceItemList.push([id, name]); + } + } + } + + MotaActionFunctions.pattern.replaceEnemyList = []; + for (var id in core.material.enemys) { + var name = core.material.enemys[id].name; + if (id && name && name != '新敌人') { + var hasPrefix = false; + MotaActionFunctions.pattern.replaceEnemyList.forEach(function (one) { + if (one[0].startsWith(id) || id.startsWith(one[0]) || one[1].startsWith(name) || name.startsWith(one[1])) { + hasPrefix = true; + } + }); + if (!hasPrefix) { + MotaActionFunctions.pattern.replaceEnemyList.push([id, name]); + } + } + } + +})(); + +MotaActionFunctions.pattern.replaceEnemyValueList = [ // 保证顺序! + ["hp", "生命"], ["name", "名称"], ["atk", "攻击"], ["def", "防御"], @@ -1312,6 +1300,7 @@ MotaActionFunctions.replaceToName_token = function (str) { list=list.concat(MotaActionFunctions.pattern.replaceStatusList) list=list.concat(MotaActionFunctions.pattern.replaceItemList) list=list.concat(MotaActionFunctions.pattern.replaceEnemyList) + list=list.concat(MotaActionFunctions.pattern.replaceEnemyValueList) for(var index=0,pair;pair=list[index];index++){ if (pair[0]==str) { return pair[1] @@ -1320,6 +1309,21 @@ MotaActionFunctions.replaceToName_token = function (str) { return str; } +MotaActionFunctions.replaceFromName_token = function (str) { + if (!str || MotaActionFunctions.disableReplace) return str; + var list = []; + list=list.concat(MotaActionFunctions.pattern.replaceStatusList) + list=list.concat(MotaActionFunctions.pattern.replaceItemList) + list=list.concat(MotaActionFunctions.pattern.replaceEnemyList) + list=list.concat(MotaActionFunctions.pattern.replaceEnemyValueList) + for(var index=0,pair;pair=list[index];index++){ + if (pair[1]==str) { + return pair[0] + } + } + return str; +} + MotaActionFunctions.replaceToName = function (str) { if (!str || MotaActionFunctions.disableReplace) return str; var map = {}, list = []; @@ -1338,12 +1342,20 @@ MotaActionFunctions.replaceToName = function (str) { }).replace(/item:/g, "物品:"); str = str.replace(/flag:/g, "变量:").replace(/switch:/g, "独立开关:").replace(/global:/g, "全局存储:").replace(/temp:/g, "临时变量:"); + + MotaActionFunctions.pattern.replaceEnemyValueList.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] ? ("enemy:" + b + ":" + map[c]) : c; + }).replace(/(enemy:[a-zA-Z0-9_]+)[.::]/g, '$1:'); + 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; + str = str.replace(new RegExp("enemy:(" + list.join("|") + ")", "g"), function (a, b) { + return map[b] ? ("怪物:" + map[b]) : b; }).replace(/enemy:/g, "怪物:"); str = str.replace(/blockId:/g, "图块ID:").replace(/blockCls:/g, "图块类别:").replace(/equip:/g, "装备孔:"); @@ -1366,16 +1378,24 @@ MotaActionFunctions.replaceFromName = function (str) { str = str.replace(new RegExp("物品[::](" + list.join("|") + ")", "g"), function (a, b) { return map[b] ? ("item:" + map[b]) : b; }).replace(/物品[::]/g, "item:"); - str = str.replace(/临时变量[::]/g, "temp:").replace(/变量[::]/g, "flag:").replace(/独立开关[::]/g, "switch:").replace(/全局存储[::]/g, "global:"); + str = str.replace(/临时变量[::]/g, "temp d:").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; + str = str.replace(new RegExp("(enemy:|怪物[::])(" + list.join("|") + ")", "g"), function (a, b, c, d) { + return map[c] ? ("enemy:" + map[c]) : c; }).replace(/怪物[::]/g, "enemy:"); + map = {}; list = []; + MotaActionFunctions.pattern.replaceEnemyValueList.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[c] ? ("enemy:" + b + ":" + map[c]) : c; + }).replace(/(enemy:[a-zA-Z0-9_]+)[::]/g, '$1:'); + str = str.replace(/图块I[dD][::]/g, "blockId:").replace(/图块类别[::]/g, "blockCls:").replace(/装备孔[::]/g, "equip:"); return str; diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 47ca3675..6ed9762f 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -472,7 +472,13 @@ editor_blockly = function () { return one != token && one.startsWith(token); }).sort(); } else if (before.endsWith("怪物") || (ch == ':' && before.endsWith("enemy"))) { - return Object.keys(core.material.enemys).filter(function (one) { + var list = Object.keys(core.material.enemys); + 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); }) } else { @@ -483,7 +489,7 @@ editor_blockly = function () { if (before.endsWith("怪物") || (ch == ':' && ch2 == ':' && before.endsWith("enemy"))) { var list = ["name", "hp", "atk", "def", "money", "exp", "point", "special"]; if (before.endsWith("怪物") && MotaActionFunctions) { - list = MotaActionFunctions.pattern.replaceEnemyList.map(function (v) { + list = MotaActionFunctions.pattern.replaceEnemyValueList.map(function (v) { return v[1]; }).concat(list); } @@ -536,7 +542,17 @@ editor_blockly = function () { })); var allImages = Object.keys(core.material.images.images); var allEnemys = Object.keys(core.material.enemys); + if (MotaActionFunctions && !MotaActionFunctions.disableReplace) { + allEnemys = allEnemys.concat(MotaActionFunctions.pattern.replaceEnemyList.map(function (x) { + return x[1]; + })) + } var allItems = Object.keys(core.material.items); + if (MotaActionFunctions && !MotaActionFunctions.disableReplace) { + allItems = allItems.concat(MotaActionFunctions.pattern.replaceItemList.map(function (x) { + return x[1]; + })) + } var allAnimates = Object.keys(core.material.animates); var allBgms = Object.keys(core.material.bgms); var allSounds = Object.keys(core.material.sounds); diff --git a/_server/table/comment.js b/_server/table/comment.js index 58c89856..60af0a61 100644 --- a/_server/table/comment.js +++ b/_server/table/comment.js @@ -108,7 +108,7 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { } } }, - "items_template": { 'cls': 'items', 'name': '新物品', 'canPass': true }, + "items_template": { 'cls': 'items', 'name': '新物品' }, // --------------------------- 【怪物】相关的表格配置 --------------------------- //