bindSpecialDoor

This commit is contained in:
ckcz123 2019-10-22 19:10:22 +08:00
parent f0bdd3e026
commit 2d06a1e612
5 changed files with 140 additions and 26 deletions

View File

@ -75,6 +75,13 @@ function editor() {
// //
ratio : 1, ratio : 1,
// 绑定机关门事件相关
bindSpecialDoor: {
loc: null,
n: -1,
enemys: []
}
}; };
window.onerror = function (msg, url, lineNo, columnNo, error) { window.onerror = function (msg, url, lineNo, columnNo, error) {
@ -227,6 +234,7 @@ editor.prototype.changeFloor = function (floorId, callback) {
editor.currentFloorData[name]=mapArray; editor.currentFloorData[name]=mapArray;
} }
editor.uivalues.preMapData = null; editor.uivalues.preMapData = null;
editor.uifunctions._extraEvent_bindSpecialDoor_doAction(true);
core.changeFloor(floorId, null, {"x": 0, "y": 0, "direction": "up"}, null, function () { core.changeFloor(floorId, null, {"x": 0, "y": 0, "direction": "up"}, null, function () {
editor.game.fetchMapFromCore(); editor.game.fetchMapFromCore();
editor.updateMap(); editor.updateMap();
@ -247,10 +255,17 @@ editor.prototype.drawEventBlock = function () {
var fg=document.getElementById('efg').getContext('2d'); var fg=document.getElementById('efg').getContext('2d');
fg.clearRect(0, 0, core.__PIXELS__, core.__PIXELS__); fg.clearRect(0, 0, core.__PIXELS__, core.__PIXELS__);
var firstData = editor.game.getFirstData();
for (var i=0;i<core.__SIZE__;i++) { for (var i=0;i<core.__SIZE__;i++) {
for (var j=0;j<core.__SIZE__;j++) { for (var j=0;j<core.__SIZE__;j++) {
var color=[]; var color=[];
var loc=(i+core.bigmap.offsetX/32)+","+(j+core.bigmap.offsetY/32); var loc=(i+core.bigmap.offsetX/32)+","+(j+core.bigmap.offsetY/32);
if (editor.currentFloorId == firstData.floorId
&& loc == firstData.hero.loc.x + "," + firstData.hero.loc.y) {
fg.textAlign = 'center';
editor.game.doCoreFunc('fillBoldText', fg, 'S',
32 * i + 16, 32 * j + 28, '#FFFFFF', 'bold 30px Verdana');
}
if (editor.currentFloorData.events[loc]) if (editor.currentFloorData.events[loc])
color.push('#FF0000'); color.push('#FF0000');
if (editor.currentFloorData.autoEvent[loc]) { if (editor.currentFloorData.autoEvent[loc]) {
@ -276,6 +291,12 @@ editor.prototype.drawEventBlock = function () {
fg.fillStyle = cc; fg.fillStyle = cc;
fg.fillRect(32*i+8*kk, 32*j+32-8, 8, 8); fg.fillRect(32*i+8*kk, 32*j+32-8, 8, 8);
} }
var index = editor.uivalues.bindSpecialDoor.enemys.indexOf(loc);
if (index >= 0) {
fg.textAlign = 'right';
editor.game.doCoreFunc("fillBoldText", fg, index + 1,
32 * i + 28, 32 * j + 15, '#FF7F00', '14px Verdana');
}
} }
} }
} }

View File

@ -178,6 +178,18 @@ editor_game_wrapper = function (editor, main, core) {
callback([editor.core.floorIds, null]); 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.constructor.prototype.game = new editor_game();
} }
//editor_game_wrapper(editor); //editor_game_wrapper(editor);

View File

@ -45,6 +45,7 @@ editor_mappanel_wrapper = function (editor) {
* 双击地图可以选中素材 * 双击地图可以选中素材
*/ */
editor.uifunctions.map_doubleClick = function (e) { editor.uifunctions.map_doubleClick = function (e) {
if (editor.uivalues.bindSpecialDoor.loc != null) return;
var loc = editor.uifunctions.eToLoc(e); var loc = editor.uifunctions.eToLoc(e);
var pos = editor.uifunctions.locToPos(loc, true); var pos = editor.uifunctions.locToPos(loc, true);
editor.setSelectBoxFromInfo(editor[editor.layerMod][pos.y][pos.x]); editor.setSelectBoxFromInfo(editor[editor.layerMod][pos.y][pos.x]);
@ -68,6 +69,7 @@ editor_mappanel_wrapper = function (editor) {
/** /**
* editor.dom.eui.onmousedown * editor.dom.eui.onmousedown
* + 绑定机关门事件的选择怪物
* + 右键进入菜单 * + 右键进入菜单
* + 非绘图时选中 * + 非绘图时选中
* + 绘图时画个矩形在那个位置 * + 绘图时画个矩形在那个位置
@ -75,6 +77,18 @@ editor_mappanel_wrapper = function (editor) {
editor.uifunctions.map_ondown = function (e) { editor.uifunctions.map_ondown = function (e) {
var loc = editor.uifunctions.eToLoc(e); var loc = editor.uifunctions.eToLoc(e);
var pos = editor.uifunctions.locToPos(loc, true); 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) { if (e.button == 2) {
editor.uifunctions.showMidMenu(e.clientX, e.clientY); editor.uifunctions.showMidMenu(e.clientX, e.clientY);
return false; return false;
@ -321,27 +335,34 @@ editor_mappanel_wrapper = function (editor) {
e.stopPropagation(); e.stopPropagation();
var thisevent = editor.map[editor.pos.y][editor.pos.x]; var thisevent = editor.map[editor.pos.y][editor.pos.x];
return this._extraEvent_bindStartPoint(thisevent) || this._extraEvent_bindStair(thisevent) return editor.uifunctions._extraEvent_bindStartPoint(thisevent)
|| this._extraEvent_bindSpecialDoor(thisevent); || editor.uifunctions._extraEvent_bindStair(thisevent)
|| editor.uifunctions._extraEvent_bindSpecialDoor(thisevent);
} }
/**
* 绑定该空地点为起始点
*/
editor.uifunctions._extraEvent_bindStartPoint = function (thisevent) { editor.uifunctions._extraEvent_bindStartPoint = function (thisevent) {
if (thisevent != 0) return false; if (thisevent != 0) return false;
editor.file.editTower([ editor.mode.onmode('tower');
["change", "['firstData']['floorId']", editor.currentFloorId], editor.mode.addAction(["change", "['firstData']['floorId']", editor.currentFloorId]);
["change", "['firstData']['hero']['loc']['x']", editor.pos.x], editor.mode.addAction(["change", "['firstData']['hero']['loc']['x']", editor.pos.x]);
["change", "['firstData']['hero']['loc']['y']", editor.pos.y] editor.mode.addAction(["change", "['firstData']['hero']['loc']['y']", editor.pos.y]);
], function (objs_) {//console.log(objs_); editor.mode.onmode('save', function () {
if (objs_.slice(-1)[0] != null) { core.firstData.floorId = editor.currentFloorId;
printe(objs_.slice(-1)[0]); core.firstData.hero.loc.x = editor.pos.x;
throw(objs_.slice(-1)[0]) core.firstData.hero.loc.y = editor.pos.y;
}
editor.drawPosSelection(); editor.drawPosSelection();
editor_mode.showMode('tower'); editor.drawEventBlock();
editor.mode.tower();
printf('绑定初始点成功'); printf('绑定初始点成功');
}); });
} }
/**
* 绑定该楼梯的楼传事件
*/
editor.uifunctions._extraEvent_bindStair = function (thisevent) { editor.uifunctions._extraEvent_bindStair = function (thisevent) {
if (['upFloor', 'downFloor', 'leftPortal', 'rightPortal', 'upPortal', 'downPortal'].indexOf(thisevent.id) < 0) if (['upFloor', 'downFloor', 'leftPortal', 'rightPortal', 'upPortal', 'downPortal'].indexOf(thisevent.id) < 0)
return false; return false;
@ -364,14 +385,73 @@ editor_mappanel_wrapper = function (editor) {
throw (err) throw (err)
} }
editor.drawPosSelection(); editor.drawPosSelection();
editor.drawEventBlock();
editor_mode.showMode('loc'); editor_mode.showMode('loc');
printf('添加楼梯事件成功'); printf('添加楼梯事件成功');
}); });
return true; return true;
} }
/**
* 绑定该机关门的事件
*/
editor.uifunctions._extraEvent_bindSpecialDoor = function (thisevent) { 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;
} }
/** /**

View File

@ -49,7 +49,7 @@ editor_mode = function (editor) {
editor_mode.actionList.push(action); 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; if (actionList.length == 0) return;
printf('修改中...'); printf('修改中...');
var cb = function (objs_) { var cb = function (objs_) {
@ -58,6 +58,7 @@ editor_mode = function (editor) {
throw (objs_.slice(-1)[0]) throw (objs_.slice(-1)[0])
} }
; printf('修改成功' + (data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.firstData.name == 'template' ? '\n\n请注意全塔属性的name尚未修改请及时予以设置' : '')); ; printf('修改成功' + (data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.firstData.name == 'template' ? '\n\n请注意全塔属性的name尚未修改请及时予以设置' : ''));
if (callback) callback();
} }
switch (mode) { switch (mode) {
case 'loc': 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 (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 (editor_mode.mode === 'nextChange' && mode) editor_mode.showMode(mode);
if (mode !== 'save') editor_mode.mode = mode; if (mode !== 'save') editor_mode.mode = mode;
editor_mode.actionList = []; editor_mode.actionList = [];

View File

@ -368,7 +368,7 @@ dynamicMapEditor.prototype.showHelp = function (fromButton) {
text += "基本操作:\n - 点击图块再点地图可以放置;\n - 双击图块可以编辑数据;\n"; text += "基本操作:\n - 点击图块再点地图可以放置;\n - 双击图块可以编辑数据;\n";
text += " - [ 键将开关此模式;\n - ] 键将会把改动保存到文件;\n - \\ 键将撤销上步操作。\n\n"; text += " - [ 键将开关此模式;\n - ] 键将会把改动保存到文件;\n - \\ 键将撤销上步操作。\n\n";
text += "最下面三行数据分别是:\n" text += "最下面三行数据分别是:\n"
text += "血攻防魔防金经黄蓝红破炸飞和debuff"; text += "血攻防魔防金经黄蓝红破炸飞和debuff";
if (!fromButton) text += "\n\n点取消将不再提示本页面。"; if (!fromButton) text += "\n\n点取消将不再提示本页面。";
core.myconfirm(text, null, function () { core.myconfirm(text, null, function () {
if (!fromButton) core.setLocalStorage("_dynamicMapEditor_help", true); 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 datastr = 'var enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 = \n';
var emap = {}; var emap = {};
var estr = JSON.stringify(core.enemys.enemys, function (k, v) { 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 + ":"; var id_ = ":" + k + ":";
emap[id_] = JSON.stringify(v); emap[id_] = JSON.stringify(t);
return id_; return id_;
} else return v } else return t;
}, '\t'); }, '\t');
for (var id_ in emap) { for (var id_ in emap) {
estr = estr.replace('"' + id_ + '"', emap[id_]) estr = estr.replace('"' + id_ + '"', emap[id_])
@ -409,7 +411,9 @@ dynamicMapEditor.prototype.saveEnemys = function () {
dynamicMapEditor.prototype.saveValues = function () { dynamicMapEditor.prototype.saveValues = function () {
if (!this.valueModified) return; if (!this.valueModified) return;
core.data.values = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.values = core.clone(core.values); 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 () { dynamicMapEditor.prototype.saveFloors = function () {
@ -451,15 +455,11 @@ dynamicMapEditor.prototype.formatMap = function (mapArr, trySimplify) {
} }
//把二维数组格式化 //把二维数组格式化
var formatArrStr = ''; var formatArrStr = '';
var arr = JSON.stringify(mapArr).replace(/\s+/g, '').sdatastr var si = mapArr.length - 1, sk = mapArr[0].length - 1;
var si = mapArr.length - 1, sk = mapArr[0].length - 1;datastr
for (var i = 0; i <= si; i++) { for (var i = 0; i <= si; i++) {
var a = [];
formatArrStr += ' ['; 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++) { 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 += Array(Math.max(4 - String(num).length, 0)).join(' ') + num + (k == sk ? '' : ',');
} }
formatArrStr += ']' + (i == si ? '' : ',\n'); formatArrStr += ']' + (i == si ? '' : ',\n');