diff --git a/_docs/editor.md b/_docs/editor.md index 34c9f770..22e369ac 100644 --- a/_docs/editor.md +++ b/_docs/editor.md @@ -78,6 +78,7 @@ - color 取色器 - point 地图选点 - disable 不允许编辑 + - popCheckBoxSet 以弹窗形式多选框 当某个event例如 门信息编辑 无法适应修改后的数据结构, 可以修改事件编辑器, 也可以把_type改成textarea 以上类型的格式要如何写请搜索例如`"_type": "checkboxSet"`来查找例子, 此处不展示 diff --git a/_server/editor_file.js b/_server/editor_file.js index 0c28dc6f..1087f975 100644 --- a/_server/editor_file.js +++ b/_server/editor_file.js @@ -919,10 +919,9 @@ editor_file = function (editor, callback) { eval("items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a" + value[1] + '=' + JSON.stringify(value[2])); }); var datastr = 'var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = \n'; - datastr += JSON.stringify(items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a, function (k, v) { - if (v.id != null) delete v.id; - return v; - }, '\t'); + var items = core.clone(items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a); + for (var id in items) delete items[id].id; + datastr += JSON.stringify(items, null, '\t'); fs.writeFile('project/items.js', encode(datastr), 'base64', function (err, data) { callback(err); }); @@ -934,9 +933,10 @@ editor_file = function (editor, callback) { }); var datastr = 'var enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 = \n'; var emap = {}; + var enemys = enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80; + for (var id in enemys) delete enemys[id].id; var estr = JSON.stringify(enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80, function (k, v) { - if (v.hp != null) { - delete v.id; + if (v && v.hp != null) { var id_ = editor.util.guid(); emap[id_] = JSON.stringify(v); return id_; diff --git a/_server/editor_table.js b/_server/editor_table.js index 672d26a5..bc0410e7 100644 --- a/_server/editor_table.js +++ b/_server/editor_table.js @@ -49,11 +49,12 @@ editor_table_wrapper = function (editor) { editor_table.prototype.checkboxSetMember = function (value,key,prefixString) { return /* html */`${prefixString}\n`; } - editor_table.prototype.editGrid = function (showComment, showEdit, showCopy) { + editor_table.prototype.editGrid = function (showComment, type) { var list = []; if (showComment) list.push(""); - if (showEdit) list.push(""); - if (showCopy) list.push(""); + if (type != 'select' && type != 'checkbox' && type != 'checkboxSet' && type != 'disable') + list.push(""); + if (type == 'disable') list.push(""); return list.join(' '); } @@ -80,7 +81,7 @@ editor_table_wrapper = function (editor) { ${shortField} ${shortComment || commentHTMLescape}
${tdstr}
- ${editor.table.editGrid(shortComment, type != 'select' && type != 'checkbox' && type != 'checkboxSet' && type != 'disable', type == 'disable')} + ${editor.table.editGrid(shortComment, type)} \n` } @@ -289,7 +290,7 @@ editor_table_wrapper = function (editor) { case 'checkboxSet': return editor.table.checkboxSet(thiseval, cobj._checkboxSet.key, cobj._checkboxSet.prefix); default: - return editor.table.textarea(thiseval, cobj.indent || 0, cobj._type == 'disable'); + return editor.table.textarea(thiseval, cobj.indent || 0, cobj._type == 'disable' || cobj._type == 'popCheckboxSet'); } } @@ -420,6 +421,7 @@ editor_table_wrapper = function (editor) { if (cobj._type === 'material') editor.table.selectMaterial(input, cobj); if (cobj._type === 'color') editor.table.selectColor(input); if (cobj._type === 'point') editor.table.selectPoint(input); + if (cobj._type === 'popCheckboxSet') editor.table.popCheckboxSet(input, cobj); } editor_table.prototype.onCopyBtnClick = function (button) { @@ -451,6 +453,7 @@ editor_table_wrapper = function (editor) { if (cobj._type === 'material') editor.table.selectMaterial(input, cobj); if (cobj._type === 'color') editor.table.selectColor(input); if (cobj._type === 'point') editor.table.selectPoint(input); + if (cobj._type === 'popCheckboxSet') editor.table.popCheckboxSet(input, cobj); } else if (editor_mode.doubleClickMode === 'add') { editor_mode.doubleClickMode = 'change'; editor.table.addfunc(guid, obj, commentObj, thisTr, input, field, cobj, modeNode) @@ -503,6 +506,13 @@ editor_table_wrapper = function (editor) { }) } + editor_table.prototype.popCheckboxSet = function (input, cobj) { + editor.uievent.popCheckboxSet(JSON.parse(input.value), cobj._checkboxSet, cobj._docs || cobj._data || '请选择多选项', function (value) { + input.value = JSON.stringify(value); + input.onchange(); + }) + } + /** * 删除表格项 */ diff --git a/_server/editor_ui.js b/_server/editor_ui.js index f545e4ad..99f01747 100644 --- a/_server/editor_ui.js +++ b/_server/editor_ui.js @@ -475,8 +475,7 @@ editor_ui_wrapper = function (editor) { uievent.elements.selectPointButtons = document.getElementById('selectPointButtons'); uievent.elements.canvas = document.getElementById('uievent'); uievent.elements.usedFlags = document.getElementById('uieventUsedFlags'); - uievent.elements.usedFlagList = document.getElementById('uieventUsedFlagList'); - uievent.elements.materialList = document.getElementById('uieventMaterialList'); + uievent.elements.extraBody = document.getElementById('uieventExtraBody'); uievent.close = function () { uievent.isOpen = false; @@ -524,7 +523,7 @@ editor_ui_wrapper = function (editor) { uievent.elements.selectPointBox.style.display = 'none'; uievent.elements.canvas.style.display = 'block'; uievent.elements.usedFlags.style.display = 'none'; - uievent.elements.usedFlagList.style.display = 'none'; + uievent.elements.extraBody.style.display = 'none'; uievent.elements.body.style.overflow = "hidden"; uievent.values.list = list; @@ -548,7 +547,7 @@ editor_ui_wrapper = function (editor) { uievent.elements.selectPointBox.style.display = 'block'; uievent.elements.canvas.style.display = 'block'; uievent.elements.usedFlags.style.display = 'none'; - uievent.elements.usedFlagList.style.display = 'none'; + uievent.elements.extraBody.style.display = 'none'; uievent.elements.body.style.overflow = "hidden"; uievent.elements.yes.onclick = function () { var floorId = uievent.values.floorId, x = uievent.values.x, y = uievent.values.y; @@ -679,7 +678,7 @@ editor_ui_wrapper = function (editor) { uievent.elements.selectPointBox.style.display = 'none'; uievent.elements.canvas.style.display = 'none'; uievent.elements.usedFlags.style.display = 'inline'; - uievent.elements.usedFlagList.style.display = 'block'; + uievent.elements.extraBody.style.display = 'block'; uievent.elements.body.style.overflow = "auto"; // build flags @@ -708,7 +707,7 @@ editor_ui_wrapper = function (editor) { html += x; }); html += ""; - uievent.elements.usedFlagList.innerHTML = html; + uievent.elements.extraBody.innerHTML = html; } var hasUsedFlags = function (obj, flag) { @@ -775,8 +774,7 @@ editor_ui_wrapper = function (editor) { uievent.elements.selectPointBox.style.display = 'none'; uievent.elements.canvas.style.display = 'none'; uievent.elements.usedFlags.style.display = 'none'; - uievent.elements.usedFlagList.style.display = 'none'; - uievent.elements.materialList.style.display = 'block'; + uievent.elements.extraBody.style.display = 'block'; uievent.elements.body.style.overflow = "auto"; uievent.elements.yes.onclick = function () { @@ -808,7 +806,7 @@ editor_ui_wrapper = function (editor) { html += '
'; }); html += "

"; - uievent.elements.materialList.innerHTML = html; + uievent.elements.extraBody.innerHTML = html; }); } @@ -869,6 +867,66 @@ editor_ui_wrapper = function (editor) { if (audio.paused) audio.play(); } + // ------ 多选框 ------ // + uievent.popCheckboxSet = function (value, comments, title, callback) { + if (value == null) value = []; + if (!(value instanceof Array)) { + if (value == 0) value = []; + else value = [value]; + } + + uievent.isOpen = true; + uievent.elements.div.style.display = 'block'; + uievent.mode = 'popCheckboxSet'; + uievent.elements.selectPoint.style.display = 'none'; + uievent.elements.yes.style.display = 'block'; + uievent.elements.title.innerText = title; + uievent.elements.selectBackground.style.display = 'none'; + uievent.elements.selectFloor.style.display = 'none'; + uievent.elements.selectPointBox.style.display = 'none'; + uievent.elements.canvas.style.display = 'none'; + uievent.elements.usedFlags.style.display = 'none'; + uievent.elements.extraBody.style.display = 'block'; + uievent.elements.body.style.overflow = "auto"; + + uievent.elements.yes.onclick = function () { + var list = Array.from(document.getElementsByClassName('uieventCheckboxSet')).filter(function (one) { + return one.checked; + }).map(function (one) { + var value = one.getAttribute('key'); + if (one.getAttribute('_type') == 'number') value = parseFloat(value); + return value; + }); + uievent.close(); + if (callback) callback(list); + } + + var keys=Array.from(comments.key) + var prefixStrings=Array.from(comments.prefix) + for (var index = 0; index < value.length; index++) { + if (keys.indexOf(value[index])==-1) { + prefixStrings.push(value[index]+': ') + keys.push(value[index]) + } + } + var table = ''; + + for (var index = 0; index < keys.length; index++) { + var one = keys[index]; + if (index % 3 == 0) { + table += ''; + } + table += ``; + if (index % 3 == 2) { + table += ''; + } + } + if (keys.length % 3 != 0) table += ''; + table += '
${prefixStrings[index]}= 0? 'checked' : ''}/>
'; + + uievent.elements.extraBody.innerHTML = "

"+table+"

"; + } + editor.constructor.prototype.uievent=uievent; } \ No newline at end of file diff --git a/_server/table/comment.js b/_server/table/comment.js index 14a709e0..eddc54cb 100644 --- a/_server/table/comment.js +++ b/_server/table/comment.js @@ -167,7 +167,7 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { }, "special": { "_leaf": true, - "_type": "checkboxSet", + "_type": "popCheckboxSet", "_checkboxSet":function(){ var array=functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a.enemys.getSpecials() var b=[],c=[]; @@ -175,7 +175,7 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { b.push(array[index][0]) var name = array[index][1]; if (name instanceof Function) name = name({}); - c.push((index%2==0&&index>0?'
':'')+name+'') + c.push(name+"("+array[index][0]+")") } return { "prefix":c, diff --git a/editor-mobile.html b/editor-mobile.html index de06dc87..60895ee4 100644 --- a/editor-mobile.html +++ b/editor-mobile.html @@ -558,8 +558,7 @@
- - +
diff --git a/editor.html b/editor.html index a03d70db..6e59f8c2 100644 --- a/editor.html +++ b/editor.html @@ -541,8 +541,7 @@
- - +
diff --git a/libs/control.js b/libs/control.js index f099f45b..2f599c52 100644 --- a/libs/control.js +++ b/libs/control.js @@ -695,11 +695,7 @@ control.prototype._moveHero_moving = function () { // 检测是否穿出去 var nx = core.nextX(), ny = core.nextY(); if (nx < 0 || nx >= core.bigmap.width || ny < 0 || ny >= core.bigmap.height) return; - core.status.heroMoving=-1; - core.eventMoveHero([core.getHeroLoc('direction')], core.values.moveSpeed, function () { - core.status.heroMoving=0; - move(); - }); + core.eventMoveHero([core.getHeroLoc('direction')], core.values.moveSpeed, move); } else { core.moveAction(); diff --git a/libs/events.js b/libs/events.js index 509e5092..7b2153d4 100644 --- a/libs/events.js +++ b/libs/events.js @@ -2856,10 +2856,12 @@ events.prototype.eventMoveHero = function(steps, time, callback) { var step = 0, moveSteps = (steps||[]).filter(function (t) { return ['up','down','left','right','forward','backward'].indexOf(t)>=0; }); + core.status.heroMoving = -1; var animate=window.setInterval(function() { if (moveSteps.length==0) { delete core.animateFrame.asyncId[animate]; clearInterval(animate); + core.status.heroMoving = 0; core.drawHero(); if (callback) callback(); } @@ -2912,6 +2914,7 @@ events.prototype.jumpHero = function (ex, ey, time, callback) { } events.prototype._jumpHero_doJump = function (jumpInfo, callback) { + core.status.heroMoving = -1; var animate = window.setInterval(function () { if (jumpInfo.jump_count > 0) core.events._jumpHero_jumping(jumpInfo) @@ -2940,6 +2943,7 @@ events.prototype._jumpHero_finished = function (animate, ex, ey, callback) { clearInterval(animate); core.setHeroLoc('x', ex); core.setHeroLoc('y', ey); + core.status.heroMoving = 0; core.drawHero(); if (callback) callback(); } diff --git a/libs/utils.js b/libs/utils.js index 6ada02f9..ae36a708 100644 --- a/libs/utils.js +++ b/libs/utils.js @@ -498,7 +498,7 @@ utils.prototype._encodeRoute_encodeOne = function (t) { else if (t.indexOf('choices:') == 0) return "C" + t.substring(8); else if (t.indexOf('shop:') == 0) - return "S" + t.substring(5); + return "S" + t.substring(5) + ":"; else if (t == 'turn') return 'T'; else if (t.indexOf('turn:') == 0) diff --git a/migration.html b/migration.html index e0e58b00..6765c92f 100644 --- a/migration.html +++ b/migration.html @@ -45,12 +45,6 @@ if (functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a.events.setInitData || !plugin
  • 部分方框进行了合并,请一个个仔细检查是否存在问题。
  • -
  • 下拉框切到「楼层属性」,并注意以下内容: -
      -
    • item_ratio被重命名为ratio,请自行修改。
    • -
    • 楼层贴图的结构在V2.7中被修改;请重新制作。
    • -
    -
  • 素材区的如下图块有所变动:
    • 三色墙和六色门从terrains中解除引用;请用animates中的进行绘制。
    • @@ -61,6 +55,13 @@ if (functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a.events.setInitData || !plugin
    • npc48的默认动画帧数null改回为4;如需静止状态请手动改成1。
  • +
  • 下拉框切到「楼层属性」,并注意以下内容: +
      +
    • item_ratio被重命名为ratio,请自行修改。
    • +
    • (你也可以直接改宝石和血瓶的效果,将core.status.thisMap.ratio改成core.status.thisMap.item_ratio。)
    • +
    • 楼层贴图的结构在V2.7中被修改;请重新制作。
    • +
    +
  • 下拉框切换到「脚本编辑」,并请重新编辑各个自己改过的函数(可以双开一个原版V266项目和当前接档的项目进行处理)。
    • 请注意:V2.7中的经验全部从experience替换成简写的exp;写伤害计算等时请尤其注意。
    • @@ -116,6 +117,10 @@ function encode(str) { })) } +function random_string() { + return (Math.random()+"_"+Math.random()+"_"+Math.random()).replace(".", ""); +} + // 接档全局属性 function action_data(callback) { var data = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d; @@ -181,6 +186,11 @@ function action_data(callback) { delete values.greenJewel; delete values.moveSpeed; delete values.floorChangeTime; + + if (flags.enableExperience != null) { + flags.enableExp = flags.enableExperience; + delete flags.enableExperience; + } var statusList = [ "enableFloor", "enableName", @@ -208,6 +218,7 @@ function action_data(callback) { }); } statusList.forEach(function (one) { delete flags[one]; }); + delete flags.enableExperience; delete flags.pickaxeFourDirections; delete flags.bombFourDirections; delete flags.snowFourDirections; @@ -218,6 +229,7 @@ function action_data(callback) { delete flags.betweenAttackCeil; delete flags.startDirectly; delete flags.enableDisabledShop; + delete flags.potionWhileRouting; delete flags.checkConsole; // 写入 @@ -246,7 +258,7 @@ function action_enemys(callback) { var estr = JSON.stringify(enemy, function (k, t) { if (t && t.hp != null) { delete t.id; - var id_ = ":" + k + ":"; + var id_ = random_string(); emap[id_] = JSON.stringify(t); return id_; } else return t; @@ -340,7 +352,7 @@ function action_items(callback) { "text": "可以打开一扇红门", "hideInToolbox": true }, - "redGem": { + "redJewel": { "cls": "items", "name": "红宝石", "text": "攻击+${core.values.redGem}", @@ -349,7 +361,7 @@ function action_items(callback) { "useItemEffect": "core.status.hero.atk += core.values.redGem", "canUseItemEffect": "true" }, - "blueGem": { + "blueJewel": { "cls": "items", "name": "蓝宝石", "text": ",防御+${core.values.blueGem}", @@ -358,7 +370,7 @@ function action_items(callback) { "useItemEffect": "core.status.hero.def += core.values.blueGem", "canUseItemEffect": "true" }, - "greenGem": { + "greenJewel": { "cls": "items", "name": "绿宝石", "text": ",护盾+${core.values.greenGem}", @@ -367,7 +379,7 @@ function action_items(callback) { "useItemEffect": "core.status.hero.mdef += core.values.greenGem", "canUseItemEffect": "true" }, - "yellowGem": { + "yellowJewel": { "cls": "items", "name": "黄宝石", "text": "可以进行加点", @@ -513,12 +525,11 @@ function action_items(callback) { for (var id in data) { items[id] = data[id]; } + delete items.snow; var datastr = 'var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = \n'; - datastr += JSON.stringify(items, function (k, v) { - if (v && v.id != null) delete v.id; - return v; - }, '\t'); + for (var id in items) delete items[id].id; + datastr += JSON.stringify(items, null, '\t'); fs.writeFile('project/items.js', encode(datastr), 'base64', function (err, data) { if (err) { alert('items接档失败!请查看控制台报错,并刷新重试。'); @@ -570,7 +581,7 @@ function action_maps(callback) { var emap = {}; var estr = JSON.stringify(maps, function (k, v) { if (v && v.id != null) { - var id_ = ':' + v.id + ':'; + var id_ = random_string(); emap[id_] = JSON.stringify(v); return id_; } else return v diff --git a/v2.x-final更新.txt b/v2.x-final更新.txt index 7b9ea9b0..18a0e758 100644 --- a/v2.x-final更新.txt +++ b/v2.x-final更新.txt @@ -68,9 +68,10 @@ (不处理;现在静止状态可以有帧动画了,所以不考虑行走过程动画) 行走动画 (已完成!) 合并main中一些设置内容 (已完成!) \t[this], 勇士朝下,flag:arg清理,瞬移扣血 -(OK) 同步存档合并;(OK) 失去焦点右键;(OK) 竖屏标题界面背景 +(OK) 同步存档合并;(OK) 失去焦点右键;(OK) 竖屏标题界面背景;(OK)商店录像bug (OK) 右键反复弹出;(OK) 上下楼梯绑定楼传;(OK) 属性框出现0问题;(OK) 上下楼点选点 -地图编辑框无效;jumpHero和帧动画冲突;图片化文本翻转;bookDetails重复计算buff +地图编辑框无效;(OK) jumpHero和帧动画冲突;bookDetails重复计算buff;(OK) 怪物属性多选 +图片化文本翻转;绘制矩形(边框)旋转; -------------