From 2d06a1e6123d8d1df2a2d12e7b33ef60cf286fee Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Tue, 22 Oct 2019 19:10:22 +0800 Subject: [PATCH] bindSpecialDoor --- _server/editor.js | 21 +++++++ _server/editor_game.js | 12 ++++ _server/editor_mappanel.js | 104 +++++++++++++++++++++++++++++---- _server/editor_mode.js | 7 ++- extensions/dynamicMapEditor.js | 22 +++---- 5 files changed, 140 insertions(+), 26 deletions(-) diff --git a/_server/editor.js b/_server/editor.js index 09111eb7..d19e2281 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -75,6 +75,13 @@ function editor() { // ratio : 1, + // 绑定机关门事件相关 + bindSpecialDoor: { + loc: null, + n: -1, + enemys: [] + } + }; window.onerror = function (msg, url, lineNo, columnNo, error) { @@ -227,6 +234,7 @@ editor.prototype.changeFloor = function (floorId, callback) { editor.currentFloorData[name]=mapArray; } editor.uivalues.preMapData = null; + editor.uifunctions._extraEvent_bindSpecialDoor_doAction(true); core.changeFloor(floorId, null, {"x": 0, "y": 0, "direction": "up"}, null, function () { editor.game.fetchMapFromCore(); editor.updateMap(); @@ -247,10 +255,17 @@ editor.prototype.drawEventBlock = function () { var fg=document.getElementById('efg').getContext('2d'); fg.clearRect(0, 0, core.__PIXELS__, core.__PIXELS__); + var firstData = editor.game.getFirstData(); for (var i=0;i= 0) { + fg.textAlign = 'right'; + editor.game.doCoreFunc("fillBoldText", fg, index + 1, + 32 * i + 28, 32 * j + 15, '#FF7F00', '14px Verdana'); + } } } } diff --git a/_server/editor_game.js b/_server/editor_game.js index 791c959f..27c51001 100644 --- a/_server/editor_game.js +++ b/_server/editor_game.js @@ -178,6 +178,18 @@ editor_game_wrapper = function (editor, main, core) { callback([editor.core.floorIds, null]); } + editor_game.prototype.doCoreFunc = function (funcname) { + return core[funcname].apply(core, Array.prototype.slice.call(arguments, 1)); + } + + editor_game.prototype.getEnemy = function (id) { + return core.material.enemys[id]; + } + + editor_game.prototype.getFirstData = function () { + return core.firstData; + } + editor.constructor.prototype.game = new editor_game(); } //editor_game_wrapper(editor); \ No newline at end of file diff --git a/_server/editor_mappanel.js b/_server/editor_mappanel.js index 3dc60db0..8dea8fc0 100644 --- a/_server/editor_mappanel.js +++ b/_server/editor_mappanel.js @@ -45,6 +45,7 @@ editor_mappanel_wrapper = function (editor) { * 双击地图可以选中素材 */ editor.uifunctions.map_doubleClick = function (e) { + if (editor.uivalues.bindSpecialDoor.loc != null) return; var loc = editor.uifunctions.eToLoc(e); var pos = editor.uifunctions.locToPos(loc, true); editor.setSelectBoxFromInfo(editor[editor.layerMod][pos.y][pos.x]); @@ -68,6 +69,7 @@ editor_mappanel_wrapper = function (editor) { /** * editor.dom.eui.onmousedown + * + 绑定机关门事件的选择怪物 * + 右键进入菜单 * + 非绘图时选中 * + 绘图时画个矩形在那个位置 @@ -75,6 +77,18 @@ editor_mappanel_wrapper = function (editor) { editor.uifunctions.map_ondown = function (e) { var loc = editor.uifunctions.eToLoc(e); var pos = editor.uifunctions.locToPos(loc, true); + if (editor.uivalues.bindSpecialDoor.loc != null) { + var x = editor.pos.x, y = editor.pos.y, id = (editor.map[y][x] || {}).id; + // 检测是否是怪物 + if (id && editor.game.getEnemy(id)) { + var locstr = x + "," + y, index = editor.uivalues.bindSpecialDoor.enemys.indexOf(locstr); + if (index >= 0) editor.uivalues.bindSpecialDoor.enemys.splice(index, 1); + else editor.uivalues.bindSpecialDoor.enemys.push(locstr); + editor.drawEventBlock(); + editor.uifunctions._extraEvent_bindSpecialDoor_doAction(); + } + return false; + } if (e.button == 2) { editor.uifunctions.showMidMenu(e.clientX, e.clientY); return false; @@ -321,27 +335,34 @@ editor_mappanel_wrapper = function (editor) { e.stopPropagation(); var thisevent = editor.map[editor.pos.y][editor.pos.x]; - return this._extraEvent_bindStartPoint(thisevent) || this._extraEvent_bindStair(thisevent) - || this._extraEvent_bindSpecialDoor(thisevent); + return editor.uifunctions._extraEvent_bindStartPoint(thisevent) + || editor.uifunctions._extraEvent_bindStair(thisevent) + || editor.uifunctions._extraEvent_bindSpecialDoor(thisevent); } + /** + * 绑定该空地点为起始点 + */ editor.uifunctions._extraEvent_bindStartPoint = function (thisevent) { if (thisevent != 0) return false; - editor.file.editTower([ - ["change", "['firstData']['floorId']", editor.currentFloorId], - ["change", "['firstData']['hero']['loc']['x']", editor.pos.x], - ["change", "['firstData']['hero']['loc']['y']", editor.pos.y] - ], function (objs_) {//console.log(objs_); - if (objs_.slice(-1)[0] != null) { - printe(objs_.slice(-1)[0]); - throw(objs_.slice(-1)[0]) - } + editor.mode.onmode('tower'); + editor.mode.addAction(["change", "['firstData']['floorId']", editor.currentFloorId]); + editor.mode.addAction(["change", "['firstData']['hero']['loc']['x']", editor.pos.x]); + editor.mode.addAction(["change", "['firstData']['hero']['loc']['y']", editor.pos.y]); + editor.mode.onmode('save', function () { + core.firstData.floorId = editor.currentFloorId; + core.firstData.hero.loc.x = editor.pos.x; + core.firstData.hero.loc.y = editor.pos.y; editor.drawPosSelection(); - editor_mode.showMode('tower'); + editor.drawEventBlock(); + editor.mode.tower(); printf('绑定初始点成功'); }); } + /** + * 绑定该楼梯的楼传事件 + */ editor.uifunctions._extraEvent_bindStair = function (thisevent) { if (['upFloor', 'downFloor', 'leftPortal', 'rightPortal', 'upPortal', 'downPortal'].indexOf(thisevent.id) < 0) return false; @@ -364,14 +385,73 @@ editor_mappanel_wrapper = function (editor) { throw (err) } editor.drawPosSelection(); + editor.drawEventBlock(); editor_mode.showMode('loc'); printf('添加楼梯事件成功'); }); return true; } + /** + * 绑定该机关门的事件 + */ editor.uifunctions._extraEvent_bindSpecialDoor = function (thisevent) { + if (thisevent.id != 'specialDoor') return false; + var number = parseInt(prompt("请输入该机关门的怪物数量", "0"))|| 0; + if (number <= 0) return true; + editor.uivalues.bindSpecialDoor.n = number; + editor.uivalues.bindSpecialDoor.loc = editor.pos.x + ',' + editor.pos.y; + editor.uivalues.bindSpecialDoor.enemys = []; + printf("请点击选择" + number + "个怪物;切换楼层或刷新页面取消操作。"); + } + /** + * 确定绑定该机关门的事件 + * cancel:是否取消此模式 + */ + editor.uifunctions._extraEvent_bindSpecialDoor_doAction = function (cancel) { + var bindSpecialDoor = editor.uivalues.bindSpecialDoor; + if (cancel) { + bindSpecialDoor.loc = null; + bindSpecialDoor.enemys = []; + bindSpecialDoor.n = 0; + editor.drawEventBlock(); + printf(""); + return; + } + if (bindSpecialDoor.loc == null || bindSpecialDoor.enemys.length != bindSpecialDoor.n) return; + // 添加机关门自动事件 + var doorFlag = "flag:door_" + editor.currentFloorId + "_" + bindSpecialDoor.loc.replace(',', '_'); + editor.currentFloorData.autoEvent[bindSpecialDoor.loc] = { + '0': { + "condition": doorFlag + "==" + bindSpecialDoor.n, + "currentFloor": true, + "priority": 0, + "delayExecute": false, + "multiExecute": false, + "data": [ + {"type": "openDoor"} + ] + } + }; + bindSpecialDoor.enemys.forEach(function (loc) { + editor.currentFloorData.afterBattle[loc] = [ + {"type": "addValue", "name": doorFlag, "value": "1"} + ] + }); + editor.file.saveFloorFile(function (err) { + if (err) { + printe(err); + throw (err) + } + editor.drawEventBlock(); + editor.drawPosSelection(); + editor_mode.showMode('loc'); + printf('绑定机关门事件成功'); + }); + bindSpecialDoor.loc = null; + bindSpecialDoor.enemys = []; + bindSpecialDoor.n = 0; } /** diff --git a/_server/editor_mode.js b/_server/editor_mode.js index 0d310d9e..8e42b7e0 100644 --- a/_server/editor_mode.js +++ b/_server/editor_mode.js @@ -49,7 +49,7 @@ editor_mode = function (editor) { editor_mode.actionList.push(action); } - editor_mode.prototype.doActionList = function (mode, actionList) { + editor_mode.prototype.doActionList = function (mode, actionList, callback) { if (actionList.length == 0) return; printf('修改中...'); var cb = function (objs_) { @@ -58,6 +58,7 @@ editor_mode = function (editor) { throw (objs_.slice(-1)[0]) } ; printf('修改成功' + (data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.firstData.name == 'template' ? '\n\n请注意:全塔属性的name尚未修改,请及时予以设置' : '')); + if (callback) callback(); } switch (mode) { case 'loc': @@ -95,9 +96,9 @@ editor_mode = function (editor) { } } - editor_mode.prototype.onmode = function (mode) { + editor_mode.prototype.onmode = function (mode, callback) { if (editor_mode.mode != mode) { - if (mode === 'save') editor_mode.doActionList(editor_mode.mode, editor_mode.actionList); + if (mode === 'save') editor_mode.doActionList(editor_mode.mode, editor_mode.actionList, callback); if (editor_mode.mode === 'nextChange' && mode) editor_mode.showMode(mode); if (mode !== 'save') editor_mode.mode = mode; editor_mode.actionList = []; diff --git a/extensions/dynamicMapEditor.js b/extensions/dynamicMapEditor.js index 006f4db0..02378560 100644 --- a/extensions/dynamicMapEditor.js +++ b/extensions/dynamicMapEditor.js @@ -368,7 +368,7 @@ dynamicMapEditor.prototype.showHelp = function (fromButton) { text += "基本操作:\n - 点击图块再点地图可以放置;\n - 双击图块可以编辑数据;\n"; text += " - [ 键将开关此模式;\n - ] 键将会把改动保存到文件;\n - \\ 键将撤销上步操作。\n\n"; text += "最下面三行数据分别是:\n" - text += "血攻防魔防;金经黄蓝红;破炸飞和debuff"; + text += "血攻防魔防;金经黄蓝红;破炸飞和debuff。"; if (!fromButton) text += "\n\n点取消将不再提示本页面。"; core.myconfirm(text, null, function () { if (!fromButton) core.setLocalStorage("_dynamicMapEditor_help", true); @@ -393,11 +393,13 @@ dynamicMapEditor.prototype.saveEnemys = function () { var datastr = 'var enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 = \n'; var emap = {}; var estr = JSON.stringify(core.enemys.enemys, function (k, v) { - if (v.hp != null) { + var t = core.clone(v); + if (t.hp != null) { + delete t.id; var id_ = ":" + k + ":"; - emap[id_] = JSON.stringify(v); + emap[id_] = JSON.stringify(t); return id_; - } else return v + } else return t; }, '\t'); for (var id_ in emap) { estr = estr.replace('"' + id_ + '"', emap[id_]) @@ -409,7 +411,9 @@ dynamicMapEditor.prototype.saveEnemys = function () { dynamicMapEditor.prototype.saveValues = function () { if (!this.valueModified) return; core.data.values = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.values = core.clone(core.values); - fs.writeFile('project/data.js', core.encodeBase64(data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d), 'base64', function (e, d) {}); + var datastr = 'var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = \n' + + JSON.stringify(data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d, null, '\t'); + fs.writeFile('project/data.js', core.encodeBase64(datastr), 'base64', function (e, d) {}); } dynamicMapEditor.prototype.saveFloors = function () { @@ -451,15 +455,11 @@ dynamicMapEditor.prototype.formatMap = function (mapArr, trySimplify) { } //把二维数组格式化 var formatArrStr = ''; - var arr = JSON.stringify(mapArr).replace(/\s+/g, '').sdatastr - var si = mapArr.length - 1, sk = mapArr[0].length - 1;datastr + var si = mapArr.length - 1, sk = mapArr[0].length - 1; for (var i = 0; i <= si; i++) { - var a = []; formatArrStr += ' ['; - if (i == 0 || i == si) a = arr[i].split(/\D+/).join(' ').trim().split(' '); - else a = arr[i].split(/\D+/); for (var k = 0; k <= sk; k++) { - var num = parseInt(a[k]); + var num = parseInt(mapArr[i][k]); formatArrStr += Array(Math.max(4 - String(num).length, 0)).join(' ') + num + (k == sk ? '' : ','); } formatArrStr += ']' + (i == si ? '' : ',\n');