From 53309d72b59c007391bbebd3743f080a9d5fcca2 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Sun, 28 Oct 2018 20:47:44 +0800 Subject: [PATCH 1/8] key 4 & drawStatistics & equip value --- libs/actions.js | 12 +++++++ libs/ui.js | 88 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 70 insertions(+), 30 deletions(-) diff --git a/libs/actions.js b/libs/actions.js index ea8e84cc..2b17376d 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -409,6 +409,18 @@ actions.prototype.keyUp = function(keyCode) { core.events.useItem('centerFly'); } break; + case 52: // 快捷键4:破冰/冰冻/地震/上下楼器/... + if (core.status.heroStop) { + var list = ["icePickaxe", "snow", "earthquake", "upFly", "downFly", "jumpShoes", "lifeWand", "poisonWine", "weakWine", "curseWine", "superWine"]; + for (var i=0;i0) t+=atk+"攻"; + if (def>0) t+=def+"防"; + if (mdef>0) t+=mdef+"魔防"; + if (t!="") ext[id]=t; + } + core.status.hero = core.clone(temp); total.count[id]++; total.add.hp+=hp; @@ -2328,22 +2345,33 @@ ui.prototype.drawStatistics = function () { if (core.flags.enableMoney) text+=",总金币数"+data.monster.money; if (core.flags.enableExperience) text+=",总经验数"+data.monster.experience; if (core.flags.enableAddPoint) text+=",总加点数"+data.monster.point; - text+="。\n\n"; - Object.keys(data.count).forEach(function (key) { - var value=data.count[key]; - if (value>0) { - var name=null; - if (key=='yellowDoor') name="黄门"; - else if (key=='blueDoor') name="蓝门"; - else if (key=='redDoor') name="红门"; - else if (key=='greenDoor') name="绿门"; - else if (key=='steelDoor') name="铁门"; - else name=(core.material.items[key]||{}).name; - if (core.isset(name)) { - text+=name+value+"个;"; - } + text+="。\n"; + + var prev = ""; + ids.forEach(function (key) { + var value = data.count[key]; + if (value==0) return; + var c = cls[key]; + if (c!=prev) { + if (prev != "") text += "。"; + text += "\n"; } + else + text += ","; + prev = c; + var name = null; + if (key=='yellowDoor') name="黄门"; + else if (key=='blueDoor') name="蓝门"; + else if (key=='redDoor') name="红门"; + else if (key=='greenDoor') name="绿门"; + else if (key=='steelDoor') name="铁门"; + else name=core.material.items[key].name; + text+=name+value+"个"; + if (core.isset(ext[key])) + text+="("+ext[key]+")"; }) + + if (prev!="") text+="。"; text+="\n\n"; text+="共加生命值"+core.formatBigNumber(data.add.hp)+"点,攻击" +core.formatBigNumber(data.add.atk)+"点,防御" From 87e39fee52936af98424764cf54052607a3deca8 Mon Sep 17 00:00:00 2001 From: oc Date: Sun, 28 Oct 2018 22:18:35 +0800 Subject: [PATCH 2/8] Move Directly --- _server/data.comment.js | 12 ------------ libs/actions.js | 30 +++++------------------------- libs/control.js | 2 +- libs/core.js | 1 - libs/maps.js | 10 ++++++++-- libs/ui.js | 1 - project/data.js | 2 -- 7 files changed, 14 insertions(+), 44 deletions(-) diff --git a/_server/data.comment.js b/_server/data.comment.js index a149b17b..7b102057 100644 --- a/_server/data.comment.js +++ b/_server/data.comment.js @@ -551,12 +551,6 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = "_bool": "bool", "_data": "寻路算法是否经过血瓶;如果该项为false,则寻路算法会自动尽量绕过血瓶" }, - "enableViewMaps": { - "_leaf": true, - "_type": "checkbox", - "_bool": "bool", - "_data": "是否支持在菜单栏中查看所有楼层的地图" - }, "portalWithoutTrigger": { "_leaf": true, "_type": "checkbox", @@ -575,12 +569,6 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = "_bool": "bool", "_data": "是否允许瞬间移动" }, - "clickMoveDirectly": { - "_leaf": true, - "_type": "checkbox", - "_bool": "bool", - "_data": "是否默认开启单击瞬移,用户可在菜单栏手动开关" - } } } } diff --git a/libs/actions.js b/libs/actions.js index 2b17376d..937fb7ec 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -357,12 +357,7 @@ actions.prototype.keyUp = function(keyCode) { break; case 33: case 34: // PAGEUP/PAGEDOWN if (core.status.heroStop) { - if (core.flags.enableViewMaps) { - core.ui.drawMaps(); - } - else { - core.drawTip("本塔不允许浏览地图!"); - } + core.ui.drawMaps(); } break; case 37: // UP @@ -1848,22 +1843,17 @@ actions.prototype.clickSwitchs = function (x,y) { core.ui.drawSwitchs(); break; case 6: - core.flags.clickMoveDirectly=!core.flags.clickMoveDirectly; - core.setLocalStorage('clickMoveDirectly', core.flags.clickMoveDirectly); - core.ui.drawSwitchs(); - break; - case 7: core.platform.useLocalForage=!core.platform.useLocalForage; core.setLocalStorage('useLocalForage', core.platform.useLocalForage); core.ui.drawSwitchs(); break; - case 8: + case 7: window.open(core.platform.isPC?"editor.html":"editor-mobile.html", "_blank"); break; - case 9: + case 8: window.open(core.firstData.name+".zip", "_blank"); break; - case 10: + case 9: core.status.event.selection=0; core.ui.drawSettings(); break; @@ -1916,17 +1906,7 @@ actions.prototype.clickSettings = function (x,y) { core.ui.drawQuickShop(); break; case 2: - if (!core.flags.enableViewMaps) { - core.drawTip("本塔不允许浏览地图!"); - } - else { - /* - core.drawText("\t[系统提示]即将进入浏览地图模式。\n\n点击地图上半部分,或按[↑]键可查看前一张地图\n点击地图下半部分,或按[↓]键可查看后一张地图\n点击地图中间,或按[ESC]键可离开浏览地图模式\n此模式下可以打开怪物手册以查看某层楼的怪物属性", function () { - core.ui.drawMaps(core.floorIds.indexOf(core.status.floorId)); - }) - */ - core.ui.drawMaps(); - } + core.ui.drawMaps(); break; case 3: core.status.event.selection=0; diff --git a/libs/control.js b/libs/control.js index 9054d2dd..92fa9d9a 100644 --- a/libs/control.js +++ b/libs/control.js @@ -471,7 +471,7 @@ control.prototype.setAutomaticRoute = function (destX, destY, stepPostfix) { if (core.timeout.turnHeroTimeout!=null) return; // 单击瞬间移动 - if (core.flags.clickMoveDirectly && core.status.heroStop) { + if (core.status.heroStop) { if (core.control.tryMoveDirectly(destX, destY)) return; } diff --git a/libs/core.js b/libs/core.js index e7b2084c..2cbbb589 100644 --- a/libs/core.js +++ b/libs/core.js @@ -293,7 +293,6 @@ core.prototype.init = function (coreData, callback) { core.flags.displayEnemyDamage = core.getLocalStorage('enemyDamage', core.flags.displayEnemyDamage); core.flags.displayCritical = core.getLocalStorage('critical', core.flags.displayCritical); core.flags.displayExtraDamage = core.getLocalStorage('extraDamage', core.flags.displayExtraDamage); - core.flags.clickMoveDirectly = core.getLocalStorage('clickMoveDirectly', core.flags.clickMoveDirectly); core.material.ground = new Image(); core.material.ground.src = "project/images/ground.png"; diff --git a/libs/maps.js b/libs/maps.js index 7e4c36f9..f3119d2d 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -306,7 +306,7 @@ maps.prototype.canMoveHero = function(x,y,direction,floorId) { ////// 能否瞬间移动 ////// maps.prototype.canMoveDirectly = function (destX,destY) { - // 不可瞬间移动请返回0 + // 不可瞬间移动请返回-1 if (!core.flags.enableMoveDirectly) return -1; // 中毒状态:不能 @@ -315,7 +315,13 @@ maps.prototype.canMoveDirectly = function (destX,destY) { var fromX = core.getHeroLoc('x'), fromY = core.getHeroLoc('y'); if (fromX==destX&&fromY==destY) return 0; - // 可以无视起点事件 + // 大地图且会改变左上角坐标,不能 + var sx = core.clamp(fromX-6,0,core.bigmap.width-13), sy = core.clamp(fromY-6,0,core.bigmap.width-13), + ex = core.clamp(destX-6,0,core.bigmap.height-13), ey = core.clamp(destY-6,0,core.bigmap.height-13); + + if (sx!=ex || sy!=ey) return -1; + + // 无视起点事件 var nowBlockId = core.getBlockId(fromX, fromY); if ((nowBlockId!=null&&nowBlockId!='upFloor'&&nowBlockId!='downFloor'&&nowBlockId!='portal' &&nowBlockId!='upPortal'&&nowBlockId!='leftPortal'&&nowBlockId!='downPortal'&&nowBlockId!='rightPortal') diff --git a/libs/ui.js b/libs/ui.js index ea7a305b..eb4836c9 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -821,7 +821,6 @@ ui.prototype.drawSwitchs = function() { "怪物显伤: "+(core.flags.displayEnemyDamage ? "[ON]" : "[OFF]"), "临界显伤: "+(core.flags.displayCritical ? "[ON]" : "[OFF]"), "领域显伤: "+(core.flags.displayExtraDamage ? "[ON]" : "[OFF]"), - "单击瞬移: "+(core.flags.clickMoveDirectly ? "[ON]" : "[OFF]"), "新版存档: "+(core.platform.useLocalForage ? "[ON]":"[OFF]"), "查看工程", "下载离线版本", diff --git a/project/data.js b/project/data.js index 2a73e455..3a651825 100644 --- a/project/data.js +++ b/project/data.js @@ -219,10 +219,8 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "displayExtraDamage": true, "enableGentleClick": true, "potionWhileRouting": false, - "enableViewMaps": true, "portalWithoutTrigger": true, "canGoDeadZone": false, "enableMoveDirectly": true, - "clickMoveDirectly": true } } \ No newline at end of file From e957966935caab030dff8f2ca91434dbc259eb65 Mon Sep 17 00:00:00 2001 From: oc Date: Mon, 29 Oct 2018 00:20:26 +0800 Subject: [PATCH 3/8] items --- libs/actions.js | 13 +++++++-- libs/control.js | 50 ++++++++++++++++++++------------- libs/core.js | 5 ++++ libs/maps.js | 6 ++-- libs/ui.js | 8 +++++- main.js | 27 +----------------- project/data.js | 5 +++- project/items.js | 52 +++++++++++++++++++++++++---------- project/sounds/bomb.mp3 | Bin 0 -> 4329 bytes project/sounds/centerFly.mp3 | Bin 0 -> 4329 bytes project/sounds/pickaxe.mp3 | Bin 0 -> 3180 bytes 11 files changed, 99 insertions(+), 67 deletions(-) create mode 100644 project/sounds/bomb.mp3 create mode 100644 project/sounds/centerFly.mp3 create mode 100644 project/sounds/pickaxe.mp3 diff --git a/libs/actions.js b/libs/actions.js index 937fb7ec..1eab51f4 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -1848,12 +1848,16 @@ actions.prototype.clickSwitchs = function (x,y) { core.ui.drawSwitchs(); break; case 7: - window.open(core.platform.isPC?"editor.html":"editor-mobile.html", "_blank"); + core.setFlag('bigmapMoveDirectly', !core.getFlag('bigmapMoveDirectly', false)); + core.ui.drawSwitchs(); break; case 8: - window.open(core.firstData.name+".zip", "_blank"); + window.open(core.platform.isPC?"editor.html":"editor-mobile.html", "_blank"); break; case 9: + window.open(core.firstData.name+".zip", "_blank"); + break; + case 10: core.status.event.selection=0; core.ui.drawSettings(); break; @@ -2367,6 +2371,9 @@ actions.prototype.clickReplay = function (x, y) { break; } case 2: + core.chooseReplayFile(); + break; + case 3: if (core.hasFlag('debug')) { core.drawText("\t[系统提示]调试模式下无法下载录像"); break; @@ -2379,7 +2386,7 @@ actions.prototype.clickReplay = function (x, y) { })); break; break; - case 3: + case 4: core.ui.closePanel(); break; } diff --git a/libs/control.js b/libs/control.js index 92fa9d9a..52ba8e3a 100644 --- a/libs/control.js +++ b/libs/control.js @@ -1658,25 +1658,37 @@ control.prototype.doEffect = function (effect) { ////// 开启debug模式 ////// control.prototype.debug = function() { core.setFlag('debug', true); - core.insertAction(["\t[调试模式开启]此模式下按住Ctrl键(或Ctrl+Shift键)可以穿墙并忽略一切事件。\n同时,录像将失效,也无法上传成绩。"]); - /* - core.setStatus('hp', 999999); - core.setStatus('atk', 10000); - core.setStatus('def', 10000); - core.setStatus('mdef', 10000); - core.setStatus('money', 10000); - core.setStatus('experience', 10000); - core.setItem('yellowKey', 50); - core.setItem('blueKey', 50); - core.setItem('redKey', 50); - core.setItem('book', 1); - core.setItem('fly', 1); - for (var i in core.status.maps) - if (core.status.maps[i].canFlyTo && core.status.hero.flyRange.indexOf(i)<0) - core.status.hero.flyRange.push(i); - core.updateStatusBar(); - core.drawTip("作弊成功"); - */ + core.drawText("\t[调试模式开启]此模式下按住Ctrl键(或Ctrl+Shift键)可以穿墙并忽略一切事件。\n同时,录像将失效,也无法上传成绩。"); +} + +////// 选择录像文件 ////// +control.prototype.chooseReplayFile = function () { + core.readFile(function (obj) { + if (obj.name!=core.firstData.name) { + alert("存档和游戏不一致!"); + return; + } + if (core.isset(obj.version) && obj.version!=core.firstData.version) { + // alert("游戏版本不一致!"); + if (!confirm("游戏版本不一致!\n你仍然想播放录像吗?")) + return; + } + if (!core.isset(obj.route) || !core.isset(obj.hard)) { + alert("无效的录像!"); + return; + } + + core.dom.startPanel.style.display = 'none'; + core.resetStatus(core.firstData.hero, obj.hard, core.firstData.floorId, null, core.initStatus.maps); + core.setFlag('seed', obj.seed); + core.setFlag('rand', obj.seed); + core.events.setInitData(obj.hard); + core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function() { + core.startReplay(core.decodeRoute(obj.route)); + }, true); + }, function () { + + }) } ////// 开始播放 ////// diff --git a/libs/core.js b/libs/core.js index 2cbbb589..81d6f7af 100644 --- a/libs/core.js +++ b/libs/core.js @@ -1030,6 +1030,11 @@ core.prototype.resetMap = function(floorId) { core.maps.resetMap(floorId); } +////// 选择录像文件 ////// +core.prototype.chooseReplayFile = function () { + core.control.chooseReplayFile(); +} + ////// 开始播放 ////// core.prototype.startReplay = function (list) { core.control.startReplay(list); diff --git a/libs/maps.js b/libs/maps.js index f3119d2d..fe7bd20f 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -316,10 +316,10 @@ maps.prototype.canMoveDirectly = function (destX,destY) { if (fromX==destX&&fromY==destY) return 0; // 大地图且会改变左上角坐标,不能 - var sx = core.clamp(fromX-6,0,core.bigmap.width-13), sy = core.clamp(fromY-6,0,core.bigmap.width-13), - ex = core.clamp(destX-6,0,core.bigmap.height-13), ey = core.clamp(destY-6,0,core.bigmap.height-13); + var sx = core.clamp(fromX-6,0,core.bigmap.width-13), sy = core.clamp(fromY-6,0,core.bigmap.height-13), + ex = core.clamp(destX-6,0,core.bigmap.width-13), ey = core.clamp(destY-6,0,core.bigmap.height-13); - if (sx!=ex || sy!=ey) return -1; + if (!core.hasFlag('bigmapMoveDirectly') && (sx!=ex || sy!=ey)) return -1; // 无视起点事件 var nowBlockId = core.getBlockId(fromX, fromY); diff --git a/libs/ui.js b/libs/ui.js index eb4836c9..b6774045 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -822,6 +822,7 @@ ui.prototype.drawSwitchs = function() { "临界显伤: "+(core.flags.displayCritical ? "[ON]" : "[OFF]"), "领域显伤: "+(core.flags.displayExtraDamage ? "[ON]" : "[OFF]"), "新版存档: "+(core.platform.useLocalForage ? "[ON]":"[OFF]"), + "大地图瞬移:"+(core.hasFlag('bigmapMoveDirectly') ? "[ON]":"[OFF]"), "查看工程", "下载离线版本", "返回主菜单" @@ -1230,7 +1231,7 @@ ui.prototype.drawReplay = function () { core.lockControl(); core.status.event.id = 'replay'; this.drawChoices(null, [ - "从头回放录像", "从存档开始回放", "下载当前录像", "返回游戏" + "从头回放录像", "从存档开始回放", "选择录像文件", "下载当前录像", "返回游戏" ]); } @@ -1768,6 +1769,11 @@ ui.prototype.drawToolbox = function(index) { core.fillText('ui', item.name, 10, 32, '#FFD700', "bold 20px Verdana") var text = item.text||"该道具暂无描述。"; + try { + // 检查能否eval + text = eval(text); + } catch (e) {} + var lines = core.splitLines('ui', text, 406, '17px Verdana'); core.fillText('ui', lines[0], 10, 62, '#FFFFFF', '17px Verdana'); diff --git a/main.js b/main.js index 02a0a8f2..ad0c7ff2 100644 --- a/main.js +++ b/main.js @@ -531,32 +531,7 @@ main.dom.replayGame.onclick = function () { } } - core.readFile(function (obj) { - if (obj.name!=core.firstData.name) { - alert("存档和游戏不一致!"); - return; - } - if (core.isset(obj.version) && obj.version!=core.firstData.version) { - // alert("游戏版本不一致!"); - if (!confirm("游戏版本不一致!\n你仍然想播放录像吗?")) - return; - } - if (!core.isset(obj.route) || !core.isset(obj.hard)) { - alert("无效的录像!"); - return; - } - - core.dom.startPanel.style.display = 'none'; - core.resetStatus(core.firstData.hero, obj.hard, core.firstData.floorId, null, core.initStatus.maps); - core.setFlag('seed', obj.seed); - core.setFlag('rand', obj.seed); - core.events.setInitData(obj.hard); - core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function() { - core.startReplay(core.decodeRoute(obj.route)); - }, true); - }, function () { - - }) + core.chooseReplayFile(); } diff --git a/project/data.js b/project/data.js index 3a651825..f89628d3 100644 --- a/project/data.js +++ b/project/data.js @@ -27,7 +27,10 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "item.mp3", "equip.mp3", "zone.mp3", - "jump.mp3" + "jump.mp3", + "pickaxe.mp3", + "bomb.mp3", + "centerFly.mp3" ], "startBackground": "bg.jpg", "startLogoStyle": "color: black", diff --git a/project/items.js b/project/items.js index d4bedf6e..ac20097b 100644 --- a/project/items.js +++ b/project/items.js @@ -15,35 +15,43 @@ items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = }, "redJewel": { "cls": "items", - "name": "红宝石" + "name": "红宝石", + "text": "',攻击+'+core.values.redJewel" }, "blueJewel": { "cls": "items", - "name": "蓝宝石" + "name": "蓝宝石", + "text": "',防御+'+core.values.blueJewel" }, "greenJewel": { "cls": "items", - "name": "绿宝石" + "name": "绿宝石", + "text": "',魔防+'+core.values.greenJewel" }, "yellowJewel": { "cls": "items", - "name": "黄宝石" + "name": "黄宝石", + "text": "可以进行加点" }, "redPotion": { "cls": "items", - "name": "红血瓶" + "name": "红血瓶", + "text": "',生命+'+core.values.redPotion" }, "bluePotion": { "cls": "items", - "name": "蓝血瓶" + "name": "蓝血瓶", + "text": "',生命+'+core.values.bluePotion" }, "yellowPotion": { "cls": "items", - "name": "黄血瓶" + "name": "黄血瓶", + "text": "'生命+'+core.values.yellowPotion" }, "greenPotion": { "cls": "items", - "name": "绿血瓶" + "name": "绿血瓶", + "text": "',生命+'+core.values.greenPotion" }, "sword0": { "cls": "items", @@ -343,13 +351,13 @@ items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "book": "core.ui.drawBook(0);", "fly": "core.ui.drawFly(core.status.hero.flyRange.indexOf(core.status.floorId));", "earthquake": "core.removeBlockByIds(core.status.floorId, core.status.event.data);\ncore.drawMap(core.status.floorId, function () {\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n});", - "pickaxe": "core.removeBlockByIds(core.status.floorId, core.status.event.data);\ncore.drawMap(core.status.floorId, function () {\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n});", + "pickaxe": "core.playSound('pickaxe.mp3');\ncore.removeBlockByIds(core.status.floorId, core.status.event.data);\ncore.drawMap(core.status.floorId, function () {\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n});", "icePickaxe": "core.removeBlockByIds(core.status.floorId, core.status.event.data);\ncore.drawMap(core.status.floorId, function () {\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n});", "snow": "core.removeBlockByIds(core.status.floorId, core.status.event.data);\ncore.drawMap(core.status.floorId, function () {\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n});", "bigKey": "core.removeBlockByIds(core.status.floorId, core.status.event.data);\ncore.drawMap(core.status.floorId, function () {\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n});", - "bomb": "core.removeBlockByIds(core.status.floorId, core.status.event.data);\ncore.drawMap(core.status.floorId, function () {\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\tcore.events.afterUseBomb();\n});", - "hammer": "core.removeBlockByIds(core.status.floorId, core.status.event.data);\ncore.drawMap(core.status.floorId, function () {\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\tcore.events.afterUseBomb();\n});", - "centerFly": "core.clearMap('hero');\ncore.setHeroLoc('x', (core.bigmap.width||13)-1-core.getHeroLoc('x'));\ncore.setHeroLoc('y', (core.bigmap.height||13)-1-core.getHeroLoc('y'));\ncore.drawHero();\ncore.drawTip(core.material.items[itemId].name + '使用成功');", + "bomb": "core.playSound('bomb.mp3');\ncore.removeBlockByIds(core.status.floorId, core.status.event.data);\ncore.drawMap(core.status.floorId, function () {\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\tcore.events.afterUseBomb();\n});", + "hammer": "core.playSound('bomb.mp3');\ncore.removeBlockByIds(core.status.floorId, core.status.event.data);\ncore.drawMap(core.status.floorId, function () {\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\tcore.events.afterUseBomb();\n});", + "centerFly": "core.playSound('centerFly.mp3');\ncore.clearMap('hero');\ncore.setHeroLoc('x', (core.bigmap.width||13)-1-core.getHeroLoc('x'));\ncore.setHeroLoc('y', (core.bigmap.height||13)-1-core.getHeroLoc('y'));\ncore.drawHero();\ncore.drawTip(core.material.items[itemId].name + '使用成功');", "upFly": "var loc = {'direction': core.status.hero.loc.direction, 'x': core.status.event.data.x, 'y': core.status.event.data.y};\ncore.changeFloor(core.status.event.data.id, null, loc, null, function (){\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\tcore.replay();\n});", "downFly": "var loc = {'direction': core.status.hero.loc.direction, 'x': core.status.event.data.x, 'y': core.status.event.data.y};\ncore.changeFloor(core.status.event.data.id, null, loc, null, function (){\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\tcore.replay();\n});", "poisonWine": "core.setFlag('poison', false);", @@ -357,7 +365,15 @@ items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "curseWine": "core.setFlag('curse', false);", "superWine": "core.setFlag('poison', false);\nif (core.hasFlag('weak')) {\n\tcore.setFlag('weak', false);\n\tcore.status.hero.atk += core.getFlag('weakAtk', core.values.weakValue);\n\tcore.status.hero.def += core.getFlag('weakDef', core.values.weakValue);\n}\ncore.setFlag('curse', false);", "lifeWand": "core.insertAction([\n\t{\"type\": \"input\", \"text\": \"请输入生命魔杖使用次数:(0-${item:lifeWand})\"},\n\t{\"type\": \"if\", \"condition\": \"flag:input<=item:lifeWand\",\n\t\t\"true\": [\n\t\t\t{\"type\": \"setValue\", \"name\": \"item:lifeWand\", \"value\": \"item:lifeWand-flag:input\"},\n\t\t\t{\"type\": \"setValue\", \"name\": \"status:hp\", \"value\": \"status:hp+flag:input*100\"},\n\t\t\t\"成功使用${flag:input}次生命魔杖,恢复${flag:input*100}点生命。\"\n\t\t],\n\t\t\"false\": [\"输入不合法!\"]\n\t},\n]);\ncore.addItem('lifeWand', 1);", - "jumpShoes": "core.insertAction({\"type\":\"jumpHero\",\"loc\":[core.nextX(2),core.nextY(2)]});" + "jumpShoes": "core.insertAction({\"type\":\"jumpHero\",\"loc\":[core.nextX(2),core.nextY(2)]});", + "redPotion": "core.status.hero.hp += core.values.redPotion", + "bluePotion": "core.status.hero.hp += core.values.bluePotion", + "greenPotion": "core.status.hero.hp += core.values.greenPotion", + "yellowPotion": "core.status.hero.hp += core.values.yellowPotion", + "redJewel": "core.status.hero.atk += core.values.redJewel", + "blueJewel": "core.status.hero.def += core.values.blueJewel", + "greenJewel": "core.status.hero.mdef += core.values.greenJewel", + "yellowJewel": "core.insertAction([\n\t{\"type\": \"choices\", \"choices\": [\n\t\t{\"text\": \"攻击+1\", \"action\": [\n\t\t\t{\"type\": \"setValue\", \"name\": \"status:atk\", \"value\": \"status:atk+1\"}\n\t\t]},\n\t\t{\"text\": \"防御+2\", \"action\": [\n\t\t\t{\"type\": \"setValue\", \"name\": \"status:def\", \"value\": \"status:def+2\"}\n\t\t]},\n\t\t{\"text\": \"生命+200\", \"action\": [\n\t\t\t{\"type\": \"setValue\", \"name\": \"status:hp\", \"value\": \"status:hp+200\"}\n\t\t]},\n\t]}\n]);" }, "canUseItemEffect": { "book": "true", @@ -377,6 +393,14 @@ items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "curseWine": "core.hasFlag('curse')", "superWine": "core.hasFlag('poison') || core.hasFlag('weak') || core.hasFlag('curse')", "lifeWand": "true", - "jumpShoes": "var nx=core.nextX(2),ny=core.nextY(2);nx>=0&&nx=0&&ny=0&&nx=0&&ny-g&)Vy^_N;v|C^ZQ(fEe7y_wK3x-Dv@URL9oeNlI2k zOh!aZRP4W}|F;khkUhZlT1Ydw788JGCnu+3Var8c3p?n8!NhZ*0l~9`)5M)KfFl2I zJ_*!I6a-Q6T=D36QRu`EG0G(Lb1C<^a!$#OTC|wk2yTH=7OV*kMY>=ifMY(cxttZqsEW8A?cvKDTFRfc9 zm5#I5>PWxz#mzr%@x!# za|mKPChk8cf?)8)u8WglCK9(HOtnH&f;**YXe7go1{g6t1!16-eS~%1^MJ6>=Q^hj zERLrpa?yOvNe!#G6g6?o^^0Y}9+o|{(%xhRO;9`gGgP( z*%Cnz1{C|5H7crN@�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 G&HfMT4JhjX literal 0 HcmV?d00001 diff --git a/project/sounds/pickaxe.mp3 b/project/sounds/pickaxe.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..be59c534158fb91ad320d0afdc0b9c4ac4e29c0b GIT binary patch literal 3180 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 hsS06*a!EYk-|T;X5P Date: Mon, 29 Oct 2018 00:43:16 +0800 Subject: [PATCH 4/8] floorChangingBackground --- _server/data.comment.js | 20 ++++++++++++++++++++ libs/control.js | 20 ++++++++++++++------ project/data.js | 8 ++++++-- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/_server/data.comment.js b/_server/data.comment.js index 7b102057..7afe0f36 100644 --- a/_server/data.comment.js +++ b/_server/data.comment.js @@ -79,6 +79,26 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = "_leaf": true, "_type": "textarea", "_data": "边框颜色,包括游戏边界的边框和对话框边框等。" + }, + "statusBarColor": { + "_leaf": true, + "_type": "textarea", + "_data": "状态栏的文字颜色,默认是白色" + }, + "hardLabelColor": { + "_leaf": true, + "_type": "textarea", + "_data": "难度显示的颜色,默认是红色" + }, + "floorChangingBackground": { + "_leaf": true, + "_type": "textarea", + "_data": "楼层转换界面的背景样式;可以使用纯色(默认值black),也可以使用图片(参见状态栏的图片写法)" + }, + "floorChangingTextColor": { + "_leaf": true, + "_type": "textarea", + "_data": "楼层转换界面的文字颜色,默认是白色" } } }, diff --git a/libs/control.js b/libs/control.js index 52ba8e3a..678b820a 100644 --- a/libs/control.js +++ b/libs/control.js @@ -1687,7 +1687,7 @@ control.prototype.chooseReplayFile = function () { core.startReplay(core.decodeRoute(obj.route)); }, true); }, function () { - + }) } @@ -2989,6 +2989,8 @@ control.prototype.resize = function(clientWidth, clientHeight) { height: (gameGroupHeight - SPACE*2) + unit, top: SPACE + unit, right: SPACE + unit, + background: main.floorChangingBackground||"black", + color: main.floorChangingTextColor||"white" } }, { @@ -3004,7 +3006,7 @@ control.prototype.resize = function(clientWidth, clientHeight) { borderLeft: statusBarBorder, borderRight: borderRight, fontSize: fontSize + unit, - background: statusBackground, + background: statusBackground } }, { @@ -3018,9 +3020,11 @@ control.prototype.resize = function(clientWidth, clientHeight) { }, { className: 'statusLabels', + noid: 'hard', rules:{ marginLeft: margin + unit, lineHeight: statusLabelsLH + unit, + color: main.statusBarColor||"white" } }, { @@ -3122,9 +3126,10 @@ control.prototype.resize = function(clientWidth, clientHeight) { { id: 'hard', rules: { - lineHeight: toolsHeight + unit + lineHeight: toolsHeight + unit, + color: main.hardLabelColor||"red" } - } + }, ] core.domRenderer(); } @@ -3145,8 +3150,11 @@ control.prototype.domRenderer = function(){ if(styles[i].hasOwnProperty('className')){ var className = styles[i].className for(var j=0; j Date: Mon, 29 Oct 2018 01:15:30 +0800 Subject: [PATCH 5/8] openDoor animates --- docs/api.md | 2 ++ docs/element.md | 2 +- libs/events.js | 49 ++++++++++++++++-------------------- project/icons.js | 10 ++++---- project/images/animates.png | Bin 25462 -> 33308 bytes project/maps.js | 5 ++++ 6 files changed, 35 insertions(+), 33 deletions(-) diff --git a/docs/api.md b/docs/api.md index fa703397..72335c95 100644 --- a/docs/api.md +++ b/docs/api.md @@ -162,11 +162,13 @@ core.nextY(n) core.openDoor(id, x, y, needKey, callback) [异步] 尝试开门操作。id为目标点的ID,x和y为坐标,needKey表示是否需要使用钥匙,callback为开门完毕后的回调函数。 +id可为null代表使用地图上的值。 例如:core.openDoor('yellowDoor', 10, 3, false, function() {console.log("1")}) core.battle(id, x, y, force, callback) [异步] 执行战斗事件。id为怪物的id,x和y为坐标,force为bool值表示是否是强制战斗,callback为战斗完毕后的回调函数。 +id可为null代表使用地图上的值。 例如:core.battle('greenSlime', null, null, true) diff --git a/docs/element.md b/docs/element.md index 63e7ed59..bd743bef 100644 --- a/docs/element.md +++ b/docs/element.md @@ -126,7 +126,7 @@ animate为该装备的攻击动画,仅对type为0时有效。具体可参见[ ``` text yellowDoor, blueDoor, redDoor, greenDoor, specialDoor, steelDoor, -yellowWall, blueWall, whiteWall, lava, star +yellowWall, blueWall, whiteWall ``` ## 怪物 diff --git a/libs/events.js b/libs/events.js index 2ef77f0b..08837a96 100644 --- a/libs/events.js +++ b/libs/events.js @@ -684,18 +684,15 @@ events.prototype.doAction = function() { y = core.calValue(data.loc[1]); } var floorId=data.floorId || core.status.floorId; - var block=core.getBlock(x, y, floorId); - if (block!=null) { - if (floorId==core.status.floorId) - core.openDoor(block.block.event.id, block.block.x, block.block.y, false, function() { - core.events.doAction(); - }) - else { - core.removeBlock(block.block.x,block.block.y,floorId); - this.doAction(); - } - break; + if (floorId==core.status.floorId) + core.openDoor(null, x, y, false, function() { + core.events.doAction(); + }) + else { + core.removeBlock(x, y, floorId); + this.doAction(); } + break; this.doAction(); break; } @@ -1067,8 +1064,11 @@ events.prototype.openDoor = function (id, x, y, needKey, callback) { if (core.interval.openDoorAnimate!=null) return; + if (!core.isset(id)) id = core.getBlockId(x, y); + // 是否存在门 - if (!core.terrainExists(x, y, id) && id!='lava' && id!='star') { + if (!core.terrainExists(x, y, id) || !(id.endsWith("Door") || id.endsWith("Wall")) + || !core.isset(core.material.icons.animates[id])) { if (core.isset(callback)) callback(); return; } @@ -1078,24 +1078,13 @@ events.prototype.openDoor = function (id, x, y, needKey, callback) { } core.stopAutomaticRoute(); - var speed=30; - var doorId = id; - if (doorId.length<4 || doorId.substring(doorId.length-4)!="Door") { - doorId=doorId+"Door"; - speed=70; - } - // 不存在门 - if (!core.isset(core.material.icons.animates[doorId])) { - if (core.isset(callback)) callback(); - return; - } + var speed = id.endsWith("Wall")?70:30; - var key = id.replace("Door", "Key"); - if (needKey && (key=="specialKey" || core.isset(core.material.items[key]))) { + if (needKey && id.endsWith("Door")) { var key = id.replace("Door", "Key"); if (!core.hasItem(key)) { if (key != "specialKey") - core.drawTip("你没有" + core.material.items[key].name); + core.drawTip("你没有" + ((core.material.items[key]||{}).name||"钥匙")); else core.drawTip("无法开启此门"); core.clearContinueAutomaticRoute(); return; @@ -1107,7 +1096,7 @@ events.prototype.openDoor = function (id, x, y, needKey, callback) { // open core.playSound("door.mp3"); var state = 0; - var door = core.material.icons.animates[doorId]; + var door = core.material.icons.animates[id]; core.status.replay.animate=true; core.removeGlobalAnimate(x,y); core.interval.openDoorAnimate = window.setInterval(function () { @@ -1134,6 +1123,12 @@ events.prototype.battle = function (id, x, y, force, callback) { core.stopHero(); core.stopAutomaticRoute(); + if (!core.isset(id)) id = core.getBlockId(x, y); + if (!core.isset(id)) { + if (core.isset(callback)) callback(); + return; + } + // 非强制战斗 if (!core.enemys.canBattle(id, x, y) && !force && !core.isset(core.status.event.id)) { core.drawTip("你打不过此怪物!"); diff --git a/project/icons.js b/project/icons.js index 314c671a..bcb69d6a 100644 --- a/project/icons.js +++ b/project/icons.js @@ -64,11 +64,11 @@ icons_4665ee12_3a1f_44a4_bea3_0fccba634dc1 = 'greenDoor': 7, 'specialDoor': 8, 'steelDoor': 9, - 'yellowWallDoor': 10, - 'whiteWallDoor': 11, - 'blueWallDoor': 12, - 'lavaDoor': 13, - 'starDoor': 14, + 'yellowWall': 10, + 'whiteWall': 11, + 'blueWall': 12, + 'crystalUp': 13, + 'crystalBottom': 14, 'starPortal': 15, 'fire': 16, 'portal': 17, diff --git a/project/images/animates.png b/project/images/animates.png index f62452858ecfc7111b8c21f8a655357a2dd1d5f9..3a901cb8372c2ba6bef791d50b38033d47440a09 100644 GIT binary patch literal 33308 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 literal 25462 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 Jco2E>e*l`PruP5< diff --git a/project/maps.js b/project/maps.js index 5823d190..e015b2f5 100644 --- a/project/maps.js +++ b/project/maps.js @@ -99,6 +99,11 @@ maps_90f36752_8815_4be8_b32b_d7fad1d0542e = '93':{'cls': 'animates', 'id': 'downPortal', 'noPass': false}, // 下箭头 '94':{'cls': 'animates', 'id': 'rightPortal', 'noPass': false}, // 右箭头 + // 101~120 其他的animates + '101':{'cls': 'animates', 'id': 'crystalUp'}, + '102':{'cls': 'animates', 'id': 'crystalBottom'}, + '103':{'cls': 'animates', 'id': 'fire'}, + '104':{'cls': 'animates', 'id': 'switch'}, ////////////////////////// NPC部分 ////////////////////////// From 2dad906e7ebf9437572109cb638a17b7ab0d8f51 Mon Sep 17 00:00:00 2001 From: oc Date: Mon, 29 Oct 2018 01:31:37 +0800 Subject: [PATCH 6/8] drawTextBox position --- _server/blockly/MotaAction.g4 | 34 +++++++++++++++++++--------------- libs/core.js | 1 + libs/events.js | 5 +---- libs/ui.js | 5 +++-- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index b398d157..18cd0c30 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -306,41 +306,45 @@ return code; */; setText_s - : '设置剧情文本的属性' '位置' SetTextPosition_List BGNL? '标题颜色' EvalString? '正文颜色' EvalString? '背景色' EvalString? '粗体' B_1_List BGNL? '标题字体大小' EvalString? '正文字体大小' EvalString? '打字间隔' EvalString? Newline + : '设置剧情文本的属性' '位置' SetTextPosition_List '偏移像素' EvalString? BGNL? '标题颜色' EvalString? '正文颜色' EvalString? '背景色' EvalString? '粗体' B_1_List BGNL? '标题字体大小' EvalString? '正文字体大小' EvalString? '打字间隔' EvalString? Newline /* setText_s tooltip : setText:设置剧情文本的属性,颜色为RGB三元组或RGBA四元组,打字间隔为剧情文字添加的时间间隔,为整数或不填 helpUrl : https://ckcz123.github.io/mota-js/#/event?id=settext%EF%BC%9A%E8%AE%BE%E7%BD%AE%E5%89%A7%E6%83%85%E6%96%87%E6%9C%AC%E7%9A%84%E5%B1%9E%E6%80%A7 -default : [null,"","","",null,"","",''] +default : [null,"","","","",null,"","",""] SetTextPosition_List_0 =SetTextPosition_List_0==='null'?'': ', "position": "'+SetTextPosition_List_0+'"'; var colorRe = /^(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d),(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d),(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(,0(\.\d+)?|,1)?$/; if (EvalString_0) { - if (!colorRe.test(EvalString_0))throw new Error('颜色格式错误,形如:0~255,0~255,0~255,0~1'); - EvalString_0 = ', "title": ['+EvalString_0+']'; + if (!/^\d+$/.test(EvalString_0))throw new Error('像素偏移量必须是整数或不填'); + EvalString_0 = ', "offset": '+EvalString_0; } if (EvalString_1) { if (!colorRe.test(EvalString_1))throw new Error('颜色格式错误,形如:0~255,0~255,0~255,0~1'); - EvalString_1 = ', "text": ['+EvalString_1+']'; + EvalString_1 = ', "title": ['+EvalString_1+']'; } if (EvalString_2) { if (!colorRe.test(EvalString_2))throw new Error('颜色格式错误,形如:0~255,0~255,0~255,0~1'); - EvalString_2 = ', "background": ['+EvalString_2+']'; + EvalString_2 = ', "text": ['+EvalString_2+']'; } if (EvalString_3) { - if (!/^\d+$/.test(EvalString_3))throw new Error('字体大小必须是整数或不填'); - EvalString_3 = ', "titlefont": '+EvalString_3; + if (!colorRe.test(EvalString_3))throw new Error('颜色格式错误,形如:0~255,0~255,0~255,0~1'); + EvalString_3 = ', "background": ['+EvalString_3+']'; } if (EvalString_4) { if (!/^\d+$/.test(EvalString_4))throw new Error('字体大小必须是整数或不填'); - EvalString_4 = ', "textfont": '+EvalString_4; + EvalString_4 = ', "titlefont": '+EvalString_4; } if (EvalString_5) { - if (!/^\d+$/.test(EvalString_5))throw new Error('打字时间间隔必须是整数或不填'); - EvalString_5 = ', "time": '+EvalString_5; + if (!/^\d+$/.test(EvalString_5))throw new Error('字体大小必须是整数或不填'); + EvalString_5 = ', "textfont": '+EvalString_5; } -B_1_List_0 = ', "bold": '+B_1_List_0; -var code = '{"type": "setText"'+SetTextPosition_List_0+EvalString_0+EvalString_1+EvalString_2+B_1_List_0+EvalString_3+EvalString_4+EvalString_5+'},\n'; +if (EvalString_6) { + if (!/^\d+$/.test(EvalString_6))throw new Error('打字时间间隔必须是整数或不填'); + EvalString_6 = ', "time": '+EvalString_6; +} +B_1_List_0 = B_1_List_0==='null'?'':', "bold": '+B_1_List_0; +var code = '{"type": "setText"'+SetTextPosition_List_0+EvalString_0+EvalString_1+EvalString_2+B_1_List_0+EvalString_3+EvalString_4+EvalString_5+EvalString_6+'},\n'; return code; */; @@ -1450,7 +1454,7 @@ Stair_List /*Stair_List ['loc','upFloor','downFloor']*/; SetTextPosition_List - : '不改变'|'上'|'中'|'下' + : '不改变'|'距离顶部'|'居中'|'距离底部' /*SetTextPosition_List ['null','up','center','down']*/; ShopUse_List @@ -1705,7 +1709,7 @@ ActionParser.prototype.parseAction = function() { data.text=setTextfunc(data.text); data.background=setTextfunc(data.background); this.next = MotaActionBlocks['setText_s'].xmlText([ - data.position,data.title,data.text,data.background,data.bold,data.titlefont,data.textfont,data.time,this.next]); + data.position,data.offset,data.title,data.text,data.background,data.bold,data.titlefont,data.textfont,data.time,this.next]); break; case "tip": this.next = MotaActionBlocks['tip_s'].xmlText([ diff --git a/libs/core.js b/libs/core.js index 81d6f7af..392a1ba7 100644 --- a/libs/core.js +++ b/libs/core.js @@ -145,6 +145,7 @@ function core() { }, 'textAttribute': { 'position': "center", + "offset": 20, "title": [255,215,0,1], "background": [0,0,0,0.85], "text": [255,255,255,1], diff --git a/libs/events.js b/libs/events.js index 08837a96..e81337b6 100644 --- a/libs/events.js +++ b/libs/events.js @@ -348,10 +348,7 @@ events.prototype.doAction = function() { } break; case "setText": // 设置文本状态 - if (data.position=='up'||data.position=='down'||data.position=='center') { - core.status.textAttribute.position=data.position; - } - ["bold", "titlefont", "textfont", "time"].forEach(function (t) { + ["position", "offset", "bold", "titlefont", "textfont", "time"].forEach(function (t) { if (core.isset(data[t])) core.status.textAttribute[t]=data[t]; }); ["background", "title", "text"].forEach(function (t) { diff --git a/libs/ui.js b/libs/ui.js index b6774045..381536ab 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -373,6 +373,7 @@ ui.prototype.drawTextBox = function(content, showAll) { var titlefont = textAttribute.titlefont || 22; var textfont = textAttribute.textfont || 16; + var offset = textAttribute.offset || 0; var position = textAttribute.position, px=null, py=null, ydelta=iconHeight-32; if (content.indexOf("\b[")==0 || content.indexOf("\\b[")==0) { @@ -434,7 +435,7 @@ ui.prototype.drawTextBox = function(content, showAll) { } else if (position=='up') { if (px==null || py==null) { - top = 5; + top = 5 + offset; } else { top = 32 * py - height - ydelta - yoffset; @@ -442,7 +443,7 @@ ui.prototype.drawTextBox = function(content, showAll) { } else if (position=='down') { if (px==null || py==null) { - top = 416 - height - 5; + top = 416 - height - 5 - offset; } else { top = 32 * py + 32 + yoffset; From 77ceb015e451178f0dd1a9e396160fee1d4fa345 Mon Sep 17 00:00:00 2001 From: oc Date: Mon, 29 Oct 2018 02:12:58 +0800 Subject: [PATCH 7/8] quickEquip --- libs/actions.js | 20 +++++++++++++++----- libs/core.js | 4 ++-- libs/items.js | 45 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 61 insertions(+), 8 deletions(-) diff --git a/libs/actions.js b/libs/actions.js index 1eab51f4..e0803368 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -71,10 +71,10 @@ actions.prototype.onkeyUp = function(e) { break; } } - this.keyUp(e.keyCode); + this.keyUp(e.keyCode, e.altKey); } else { if (e.keyCode==17) core.status.ctrlDown = false; - this.keyUp(e.keyCode); + this.keyUp(e.keyCode, e.altKey); } } @@ -187,7 +187,7 @@ actions.prototype.keyDown = function(keyCode) { } ////// 根据放开键的code来执行一系列操作 ////// -actions.prototype.keyUp = function(keyCode) { +actions.prototype.keyUp = function(keyCode, altKey) { if (core.isset(core.status.replay)&&core.status.replay.replaying &&core.status.event.id!='save'&&(core.status.event.id||"").indexOf('book')!=0&&core.status.event.id!='viewMaps') return; @@ -239,7 +239,7 @@ actions.prototype.keyUp = function(keyCode) { return; } if (core.status.event.id=='equipbox') { - this.keyUpEquipbox(keyCode); + this.keyUpEquipbox(keyCode, altKey); return; } if (core.status.event.id=='save' || core.status.event.id=='load' || core.status.event.id=='replayLoad') { @@ -288,6 +288,12 @@ actions.prototype.keyUp = function(keyCode) { if(!core.status.played) return; + // 0~9的AltKey + if (altKey && keyCode>=48 && keyCode<=57 && core.status.heroStop) { + core.items.quickLoadEquip(keyCode-48); + return; + } + switch (keyCode) { case 27: // ESC if (core.status.heroStop) @@ -1604,7 +1610,11 @@ actions.prototype.keyDownEquipbox = function (keycode) { } ////// 装备栏界面时,放开某个键的操作 ////// -actions.prototype.keyUpEquipbox = function (keycode) { +actions.prototype.keyUpEquipbox = function (keycode, altKey) { + if (altKey && keycode>=48 && keycode<=57) { + core.items.quickSaveEquip(keycode-48); + return; + } if (keycode==84){ core.ui.closePanel(); core.openToolbox(); diff --git a/libs/core.js b/libs/core.js index 392a1ba7..deea76b5 100644 --- a/libs/core.js +++ b/libs/core.js @@ -388,8 +388,8 @@ core.prototype.keyDown = function(keyCode) { } ////// 根据放开键的code来执行一系列操作 ////// -core.prototype.keyUp = function(keyCode) { - return core.actions.keyUp(keyCode); +core.prototype.keyUp = function(keyCode, altKey) { + return core.actions.keyUp(keyCode, altKey); } ////// 点击(触摸)事件按下时 ////// diff --git a/libs/items.js b/libs/items.js index 41f96b89..a576179e 100644 --- a/libs/items.js +++ b/libs/items.js @@ -262,4 +262,47 @@ items.prototype.compareEquipment = function (compareEquipId, beComparedEquipId) compareMdef -= (beComparedEquip.equip||{}).mdef || 0; } return {"atk":compareAtk,"def":compareDef,"mdef":compareMdef}; -} \ No newline at end of file +} + +////// 保存装备 ////// +items.prototype.quickSaveEquip = function (index) { + if (!core.isset(core.status.hero.equipment)) core.status.hero.equipment = []; + var saveEquips = core.getFlag("saveEquips", []); + saveEquips[index] = core.clone(core.status.hero.equipment); + core.setFlag("saveEquips", saveEquips); + core.drawTip("已保存"+index+"号套装"); +} + +////// 读取装备 ////// +items.prototype.quickLoadEquip = function (index) { + var current = core.getFlag("saveEquips", [])[index]; + if (!core.isset(current)) { + core.drawTip(index+"号套装不存在"); + return; + } + // 检查所有的装备 + var equipSize = (main.equipName||[]).length; + for (var i=0;i Date: Mon, 29 Oct 2018 02:23:33 +0800 Subject: [PATCH 8/8] statusBar Color --- editor-mobile.html | 22 +++++++++++----------- editor.html | 22 +++++++++++----------- index.html | 22 +++++++++++----------- libs/control.js | 8 ++++++-- main.js | 1 + 5 files changed, 40 insertions(+), 35 deletions(-) diff --git a/editor-mobile.html b/editor-mobile.html index 38c0fb7f..161e7897 100644 --- a/editor-mobile.html +++ b/editor-mobile.html @@ -337,47 +337,47 @@
-

+

-

+

-

+

-

+

-

+

-

+

-

+

-

+

-

+

-

+

-

+

diff --git a/editor.html b/editor.html index 5b8600b0..cce7d36c 100644 --- a/editor.html +++ b/editor.html @@ -323,47 +323,47 @@
-

+

-

+

-

+

-

+

-

+

-

+

-

+

-

+

-

+

-

+

-

+

diff --git a/index.html b/index.html index fdaa77ff..62182c53 100644 --- a/index.html +++ b/index.html @@ -44,47 +44,47 @@
-

+

-

+

-

+

-

+

-

+

-

+

-

+

-

+

-

+

-

+

-

+

diff --git a/libs/control.js b/libs/control.js index 678b820a..dacb11d5 100644 --- a/libs/control.js +++ b/libs/control.js @@ -3020,10 +3020,14 @@ control.prototype.resize = function(clientWidth, clientHeight) { }, { className: 'statusLabels', - noid: 'hard', rules:{ marginLeft: margin + unit, - lineHeight: statusLabelsLH + unit, + lineHeight: statusLabelsLH + unit + } + }, + { + className: 'statusTexts', + rules: { color: main.statusBarColor||"white" } }, diff --git a/main.js b/main.js index ad0c7ff2..d411900b 100644 --- a/main.js +++ b/main.js @@ -50,6 +50,7 @@ function main() { 'levelChooseButtons': document.getElementById('levelChooseButtons'), 'data': document.getElementById('data'), 'statusLabels': document.getElementsByClassName('statusLabel'), + 'statusTexts': document.getElementsByClassName('statusText'), 'floorCol': document.getElementById('floorCol'), 'nameCol': document.getElementById('nameCol'), 'lvCol': document.getElementById('lvCol'),