From f670d4f6d47a0909938d4b4099b73349e8e4db5e Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 23 Jul 2021 14:15:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9B=B4=E5=A4=9A=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E9=9F=B3=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/actions.js | 248 +++++++++++++++++++++++++++--------- libs/control.js | 121 ++++++++++++++---- libs/events.js | 66 +++++++--- libs/items.js | 19 ++- libs/ui.js | 7 +- project/data.js | 30 ++++- project/functions.js | 33 +++-- project/items.js | 30 +++-- project/plugins.js | 8 +- project/sounds/cancel.mp3 | Bin 0 -> 6627 bytes project/sounds/confirm.mp3 | Bin 0 -> 2760 bytes project/sounds/cursor.mp3 | Bin 0 -> 1506 bytes project/sounds/equip.mp3 | Bin 8508 -> 3387 bytes project/sounds/error.mp3 | Bin 0 -> 3178 bytes project/sounds/load.mp3 | Bin 0 -> 2551 bytes project/sounds/open_ui.mp3 | Bin 0 -> 9448 bytes project/sounds/recovery.mp3 | Bin 0 -> 7567 bytes project/sounds/save.mp3 | Bin 0 -> 4641 bytes project/sounds/shop.mp3 | Bin 0 -> 21568 bytes 19 files changed, 424 insertions(+), 138 deletions(-) create mode 100644 project/sounds/cancel.mp3 create mode 100644 project/sounds/confirm.mp3 create mode 100644 project/sounds/cursor.mp3 create mode 100644 project/sounds/error.mp3 create mode 100644 project/sounds/load.mp3 create mode 100644 project/sounds/open_ui.mp3 create mode 100644 project/sounds/recovery.mp3 create mode 100644 project/sounds/save.mp3 create mode 100644 project/sounds/shop.mp3 diff --git a/libs/actions.js b/libs/actions.js index ce47a2d0..d97acaaa 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -910,10 +910,12 @@ actions.prototype._selectChoices = function (length, keycode, callback) { actions.prototype._keyDownChoices = function (keycode) { if (keycode == 38) { core.status.event.selection--; + core.playSound('光标移动'); core.ui.drawChoices(core.status.event.ui.text, core.status.event.ui.choices); } if (keycode == 40) { core.status.event.selection++; + core.playSound('光标移动'); core.ui.drawChoices(core.status.event.ui.text, core.status.event.ui.choices); } } @@ -929,6 +931,7 @@ actions.prototype._onMoveChoices = function (x, y) { var selection = y - topIndex; if (selection == core.status.event.selection) return; core.status.event.selection = selection; + core.playSound('光标移动'); core.ui.drawChoices(core.status.event.ui.text, core.status.event.ui.choices); } } @@ -942,6 +945,7 @@ actions.prototype._clickCenterFly = function (x, y) { core.useItem('centerFly'); } else { + core.playSound('操作失败'); core.drawTip('当前不能使用' + core.material.items['centerFly'].name); } } @@ -954,6 +958,7 @@ actions.prototype._keyUpCenterFly = function (keycode) { core.useItem('centerFly'); } else { + core.playSound('操作失败'); core.drawTip('当前不能使用' + core.material.items['centerFly'].name); } } @@ -969,18 +974,12 @@ actions.prototype._clickConfirmBox = function (x, y) { ////// 键盘操作确认框时 ////// actions.prototype._keyUpConfirmBox = function (keycode) { - if (keycode == 37) { - core.status.event.selection = 0; + if (keycode == 37 || keycode == 39) { + core.status.event.selection = 1 - core.status.event.selection; + core.playSound('光标移动'); core.ui.drawConfirmBox(core.status.event.ui, core.status.event.data.yes, core.status.event.data.no); return; } - - if (keycode == 39) { - core.status.event.selection = 1; - core.ui.drawConfirmBox(core.status.event.ui, core.status.event.data.yes, core.status.event.data.no); - return; - } - if (keycode == 13 || keycode == 32 || keycode == 67) { if (core.status.event.selection == 0 && core.status.event.data.yes) { core.status.event.selection = null; @@ -999,13 +998,19 @@ actions.prototype._keyUpConfirmBox = function (keycode) { actions.prototype._onMoveConfirmBox = function (x, y) { if (y == this.HSIZE + 1) { if (x == this.HSIZE - 2 || x == this.HSIZE - 1) { - core.status.event.selection = 0; - core.ui.drawConfirmBox(core.status.event.ui, core.status.event.data.yes, core.status.event.data.no); + if (core.status.event.selection != 0) { + core.status.event.selection = 0; + core.playSound('光标移动'); + core.ui.drawConfirmBox(core.status.event.ui, core.status.event.data.yes, core.status.event.data.no); + } return; } if (x == this.HSIZE + 2 || x == this.HSIZE + 1) { - core.status.event.selection = 1; - core.ui.drawConfirmBox(core.status.event.ui, core.status.event.data.yes, core.status.event.data.no); + if (core.status.event.selection != 1) { + core.status.event.selection = 1; + core.playSound('光标移动'); + core.ui.drawConfirmBox(core.status.event.ui, core.status.event.data.yes, core.status.event.data.no); + } return; } } @@ -1039,6 +1044,7 @@ actions.prototype._clickAction = function (x, y) { if (y >= topIndex && y < topIndex + choices.length) { var choice = choices[y - topIndex]; if (choice.need != null && choice.need != '' && !core.calValue(choice.need)) { + core.playSound('操作失败'); core.drawTip("无法选择此项"); return; } @@ -1085,6 +1091,7 @@ actions.prototype._keyDownAction = function (keycode) { } if (core.status.event.data.type == 'confirm' && (keycode == 37 || keycode == 39)) { core.status.event.selection = 1 - core.status.event.selection; + core.playSound('光标移动'); core.drawConfirmBox(core.status.event.ui.text); return; } @@ -1143,16 +1150,19 @@ actions.prototype._clickBook = function (x, y) { var pageinfo = core.ui._drawBook_pageinfo(); // 上一页 if ((x == this.HSIZE-2 || x == this.HSIZE-3) && y == this.LAST) { + core.playSound('光标移动'); core.ui.drawBook(core.status.event.data - pageinfo.per_page); return; } // 下一页 if ((x == this.HSIZE+2 || x == this.HSIZE+3) && y == this.LAST) { + core.playSound('光标移动'); core.ui.drawBook(core.status.event.data + pageinfo.per_page); return; } // 返回 if (x >= this.LAST-2 && y == this.LAST) { + core.playSound('取消'); if (core.events.recoverEvents(core.status.event.interval)) { return; } @@ -1184,18 +1194,19 @@ actions.prototype._clickBook = function (x, y) { ////// 怪物手册界面时,按下某个键的操作 ////// actions.prototype._keyDownBook = function (keycode) { var pageinfo = core.ui._drawBook_pageinfo(); - if (keycode == 37) core.ui.drawBook(core.status.event.data - pageinfo.per_page); - if (keycode == 38) core.ui.drawBook(core.status.event.data - 1); - if (keycode == 39) core.ui.drawBook(core.status.event.data + pageinfo.per_page); - if (keycode == 40) core.ui.drawBook(core.status.event.data + 1); - if (keycode == 33) core.ui.drawBook(core.status.event.data - pageinfo.per_page); - if (keycode == 34) core.ui.drawBook(core.status.event.data + pageinfo.per_page); + if (keycode == 37) { core.playSound('光标移动'); core.ui.drawBook(core.status.event.data - pageinfo.per_page); } + if (keycode == 38) { core.playSound('光标移动'); core.ui.drawBook(core.status.event.data - 1); } + if (keycode == 39) { core.playSound('光标移动'); core.ui.drawBook(core.status.event.data + pageinfo.per_page); } + if (keycode == 40) { core.playSound('光标移动'); core.ui.drawBook(core.status.event.data + 1); } + if (keycode == 33) { core.playSound('光标移动'); core.ui.drawBook(core.status.event.data - pageinfo.per_page); } + if (keycode == 34) { core.playSound('光标移动'); core.ui.drawBook(core.status.event.data + pageinfo.per_page); } return; } ////// 怪物手册界面时,放开某个键的操作 ////// actions.prototype._keyUpBook = function (keycode) { if (keycode == 27 || keycode == 88) { + core.playSound('取消'); if (core.events.recoverEvents(core.status.event.interval)) { return; } @@ -1218,16 +1229,17 @@ actions.prototype._keyUpBook = function (keycode) { ////// 怪物手册属性显示界面时的点击操作 ////// actions.prototype._clickBookDetail = function () { core.clearMap('data'); + core.playSound('取消'); core.status.event.id = 'book'; } ////// 楼层传送器界面时的点击操作 ////// actions.prototype._clickFly = function (x, y) { - if ((x == this.SIZE-2 || x == this.SIZE-3) && y == this.HSIZE+3) core.ui.drawFly(this._getNextFlyFloor(-1)); - if ((x == this.SIZE-2 || x == this.SIZE-3) && y == this.HSIZE-1) core.ui.drawFly(this._getNextFlyFloor(1)); - if ((x == this.SIZE-2 || x == this.SIZE-3) && y == this.HSIZE+4) core.ui.drawFly(this._getNextFlyFloor(-10)); - if ((x == this.SIZE-2 || x == this.SIZE-3) && y == this.HSIZE-2) core.ui.drawFly(this._getNextFlyFloor(10)); - if (x >= this.HSIZE-1 && x <= this.HSIZE+1 && y == this.LAST) core.ui.closePanel(); + if ((x == this.SIZE-2 || x == this.SIZE-3) && y == this.HSIZE+3) { core.playSound('光标移动'); core.ui.drawFly(this._getNextFlyFloor(-1)); } + if ((x == this.SIZE-2 || x == this.SIZE-3) && y == this.HSIZE-1) { core.playSound('光标移动'); core.ui.drawFly(this._getNextFlyFloor(1)); } + if ((x == this.SIZE-2 || x == this.SIZE-3) && y == this.HSIZE+4) { core.playSound('光标移动'); core.ui.drawFly(this._getNextFlyFloor(-10)); } + if ((x == this.SIZE-2 || x == this.SIZE-3) && y == this.HSIZE-2) { core.playSound('光标移动'); core.ui.drawFly(this._getNextFlyFloor(10)); } + if (x >= this.HSIZE-1 && x <= this.HSIZE+1 && y == this.LAST) { core.playSound('取消'); core.ui.closePanel(); } if (x >= 0 && x <= this.HSIZE+3 && y >= 3 && y <= this.LAST - 1) core.flyTo(core.floorIds[core.status.event.data]); return; @@ -1235,10 +1247,10 @@ actions.prototype._clickFly = function (x, y) { ////// 楼层传送器界面时,按下某个键的操作 ////// actions.prototype._keyDownFly = function (keycode) { - if (keycode == 37) core.ui.drawFly(this._getNextFlyFloor(-10)); - else if (keycode == 38) core.ui.drawFly(this._getNextFlyFloor(1)); - else if (keycode == 39) core.ui.drawFly(this._getNextFlyFloor(10)); - else if (keycode == 40) core.ui.drawFly(this._getNextFlyFloor(-1)); + if (keycode == 37) { core.playSound('光标移动'); core.ui.drawFly(this._getNextFlyFloor(-10)); } + else if (keycode == 38) { core.playSound('光标移动'); core.ui.drawFly(this._getNextFlyFloor(1)); } + else if (keycode == 39) { core.playSound('光标移动'); core.ui.drawFly(this._getNextFlyFloor(10)); } + else if (keycode == 40) { core.playSound('光标移动'); core.ui.drawFly(this._getNextFlyFloor(-1)); } return; } @@ -1263,8 +1275,10 @@ actions.prototype._getNextFlyFloor = function (delta, index) { ////// 楼层传送器界面时,放开某个键的操作 ////// actions.prototype._keyUpFly = function (keycode) { - if (keycode == 71 || keycode == 27 || keycode == 88) + if (keycode == 71 || keycode == 27 || keycode == 88) { + core.playSound('取消'); core.ui.closePanel(); + } if (keycode == 13 || keycode == 32 || keycode == 67) this._clickFly(this.HSIZE-1, this.HSIZE-1); return; @@ -1284,39 +1298,47 @@ actions.prototype._clickViewMaps = function (x, y) { if (x <= per - 2 && y <= per - 2) { core.status.event.data.damage = !core.status.event.data.damage; + core.playSound('光标移动'); core.ui._drawViewMaps(index, cx, cy); return; } if (x <= per - 2 && y >= this.SIZE + 1 - per) { if (core.markedFloorIds[floorId]) delete core.markedFloorIds[floorId]; else core.markedFloorIds[floorId] = true; + core.playSound('光标移动'); core.ui._drawViewMaps(index, cx, cy); return; } if (x >= this.SIZE + 1 - per && y <= per - 2) { core.status.event.data.all = !core.status.event.data.all; + core.playSound('光标移动'); core.ui._drawViewMaps(index, cx, cy); return; } if (x >= per && x <= this.LAST - per && y <= per - 1 && (!core.status.event.data.all && mh > this.SIZE)) { + core.playSound('光标移动'); core.ui._drawViewMaps(index, cx, cy - 1); return; } if (x >= per && x <= this.LAST - per && y >= this.SIZE - per && (!core.status.event.data.all && mh > this.SIZE)) { + core.playSound('光标移动'); core.ui._drawViewMaps(index, cx, cy + 1); return; } if (x <= per - 1 && y >= per && y <= this.LAST - per) { + core.playSound('光标移动'); core.ui._drawViewMaps(index, cx - 1, cy); return; } if (x >= this.SIZE - per && y >= per && y <= this.LAST - per) { + core.playSound('光标移动'); core.ui._drawViewMaps(index, cx + 1, cy); return; } if (y <= this.HSIZE - 2 && (mh == this.SIZE || (x >= per && x <= this.LAST - per))) { + core.playSound('光标移动'); index++; while (index < core.floorIds.length && index != now && core.status.maps[core.floorIds[index]].cannotViewMap) index++; @@ -1325,6 +1347,7 @@ actions.prototype._clickViewMaps = function (x, y) { return; } if (y >= this.HSIZE + 2 && (mh == this.SIZE || (x >= per && x <= this.LAST - per))) { + core.playSound('光标移动'); index--; while (index >= 0 && index != now && core.status.maps[core.floorIds[index]].cannotViewMap) index--; @@ -1334,6 +1357,7 @@ actions.prototype._clickViewMaps = function (x, y) { } if (x >= per && x <= this.LAST - per && y >= this.HSIZE - 1 && y <= this.HSIZE + 1) { core.clearMap('data'); + core.playSound('取消'); core.ui.closePanel(); return; } @@ -1364,22 +1388,26 @@ actions.prototype._keyUpViewMaps = function (keycode) { if (keycode == 27 || keycode == 13 || keycode == 32 || (!core.isReplaying() && keycode == 67)) { core.clearMap('data'); + core.playSound('取消'); core.ui.closePanel(); return; } if (keycode == 86) { core.status.event.data.damage = !core.status.event.data.damage; + core.playSound('光标移动'); core.ui._drawViewMaps(core.status.event.data); return; } if (keycode == 90) { core.status.event.data.all = !core.status.event.data.all; + core.playSound('光标移动'); core.ui._drawViewMaps(core.status.event.data); return; } if (keycode == 66) { if (core.markedFloorIds[floorId]) delete core.markedFloorIds[floorId]; else core.markedFloorIds[floorId] = true; + core.playSound('光标移动'); core.ui._drawViewMaps(core.status.event.data); return; } @@ -1403,6 +1431,7 @@ actions.prototype._clickQuickShop = function (x, y) { if (y >= topIndex && y < topIndex + shopIds.length) { var shopId = shopIds[y - topIndex]; if (!core.canOpenShop(shopId)) { + core.playSound('操作失败'); core.drawTip('当前项尚未开启'); return; } @@ -1411,12 +1440,15 @@ actions.prototype._clickQuickShop = function (x, y) { // core.ui.closePanel(); core.openShop(shopIds[y - topIndex], false); } else { + core.playSound('操作失败'); core.drawTip(message); } } // 离开 - else if (y == topIndex + shopIds.length) + else if (y == topIndex + shopIds.length) { + core.playSound('取消'); core.ui.closePanel(); + } return; } return; @@ -1425,6 +1457,7 @@ actions.prototype._clickQuickShop = function (x, y) { ////// 快捷商店界面时,放开某个键的操作 ////// actions.prototype._keyUpQuickShop = function (keycode) { if (keycode == 27 || keycode == 75 || keycode == 88 || keycode == 86) { + core.playSound('取消'); core.ui.closePanel(); return; } @@ -1447,6 +1480,7 @@ actions.prototype._clickToolbox = function (x, y) { return; } if (x >= this.LAST - 2 && y == this.LAST) { + core.playSound('取消'); core.ui.closePanel(); return; } @@ -1457,10 +1491,12 @@ actions.prototype._clickToolbox = function (x, y) { if (x == this.HSIZE-2 || x == this.HSIZE-3) { if (y == this.LAST - 5 && toolsPage > 1) { core.status.event.data.toolsPage--; + core.playSound('光标移动'); core.ui._drawToolbox(core.status.event.selection); } if (y == this.LAST && constantsPage > 1) { core.status.event.data.constantsPage--; + core.playSound('光标移动'); core.ui._drawToolbox(core.status.event.selection); } } @@ -1468,10 +1504,12 @@ actions.prototype._clickToolbox = function (x, y) { if (x == this.HSIZE+2 || x == this.HSIZE+3) { if (y == this.LAST - 5 && toolsPage < Math.ceil(tools.length / this.LAST)) { core.status.event.data.toolsPage++; + core.playSound('光标移动'); core.ui._drawToolbox(core.status.event.selection); } if (y == this.LAST && constantsPage < Math.ceil(constants.length / this.LAST)) { core.status.event.data.constantsPage++; + core.playSound('光标移动'); core.ui._drawToolbox(core.status.event.selection); } } @@ -1533,6 +1571,7 @@ actions.prototype._keyDownToolbox = function (keycode) { if (index == 0) { // 处理向前翻页 if (toolsPage > 1) { core.status.event.data.toolsPage--; + core.playSound('光标移动'); index = last_index; } else return; // 第一页不向前翻 @@ -1545,6 +1584,7 @@ actions.prototype._keyDownToolbox = function (keycode) { } else { core.status.event.data.constantsPage--; + core.playSound('光标移动'); index = 2 * this.LAST - 1; } } @@ -1566,10 +1606,12 @@ actions.prototype._keyDownToolbox = function (keycode) { if (keycode == 39) { // right if (toolsPage < toolsTotalPage && index == last_index) { core.status.event.data.toolsPage++; + core.playSound('光标移动'); index = 0; } else if (constantsPage < constantsTotalPage && index == 2 * this.LAST - 1) { core.status.event.data.constantsPage++; + core.playSound('光标移动'); index = this.LAST; } else if (index == toolsLastIndex) { @@ -1615,6 +1657,7 @@ actions.prototype._keyUpToolbox = function (keycode) { return; } if (keycode == 84 || keycode == 27 || keycode == 88) { + core.playSound('取消'); core.ui.closePanel(); return; } @@ -1639,6 +1682,7 @@ actions.prototype._clickEquipbox = function (x, y) { } // 返回 if (x >= this.LAST - 2 && y == this.LAST) { + core.playSound('取消'); core.ui.closePanel(); return; } @@ -1647,6 +1691,7 @@ actions.prototype._clickEquipbox = function (x, y) { if ((x == this.HSIZE-2 || x == this.HSIZE-3) && y == this.LAST) { if (core.status.event.data.page > 1) { core.status.event.data.page--; + core.playSound('光标移动'); core.ui._drawEquipbox(core.status.event.selection); } return; @@ -1656,6 +1701,7 @@ actions.prototype._clickEquipbox = function (x, y) { var lastPage = Math.ceil(core.getToolboxItems('equips').length / this.LAST); if (core.status.event.data.page < lastPage) { core.status.event.data.page++; + core.playSound('光标移动'); core.ui._drawEquipbox(core.status.event.selection); } return; @@ -1718,6 +1764,7 @@ actions.prototype._keyDownEquipbox = function (keycode) { if (index == this.LAST) { if (page > 1) { core.status.event.data.page--; + core.playSound('光标移动'); index = this.LAST + last_index; } else if (page == 1) @@ -1743,6 +1790,7 @@ actions.prototype._keyDownEquipbox = function (keycode) { if (keycode == 39) { // right if (page < totalPage && index == this.LAST + last_index) { core.status.event.data.page++; + core.playSound('光标移动'); index = this.LAST; } else if (index == equipCapacity - 1) { @@ -1790,6 +1838,7 @@ actions.prototype._keyUpEquipbox = function (keycode, altKey) { return; } if (keycode == 81 || keycode == 27 || keycode == 88) { + core.playSound('取消'); core.ui.closePanel(); return; } @@ -1808,16 +1857,19 @@ actions.prototype._clickSL = function (x, y) { // 上一页 if ((x == this.HSIZE-2 || x == this.HSIZE-3) && y == this.LAST) { + core.playSound('光标移动'); core.ui._drawSLPanel(10 * (page - 1) + offset); return; } // 下一页 if ((x == this.HSIZE+2 || x == this.HSIZE+3) && y == this.LAST) { + core.playSound('光标移动'); core.ui._drawSLPanel(10 * (page + 1) + offset); return; } // 返回 if (x >= this.LAST-2 && y == this.LAST) { + core.playSound('取消'); if (core.events.recoverEvents(core.status.event.interval)) return; core.ui.closePanel(); @@ -1870,9 +1922,10 @@ actions.prototype._clickSL = function (x, y) { } if (id != null) { if (core.status.event.selection) { - if (id == 'autoSave') + if (id == 'autoSave') { + core.playSound('操作失败'); core.drawTip("无法删除自动存档!"); - else { + } else { core.removeSave(id, function () { core.ui._drawSLPanel(index, true); }); @@ -1909,6 +1962,7 @@ actions.prototype._clickSL_favorite = function (page, offset) { else if (core.hasSave(index)) { // 存在存档则进行收藏 core.saves.favorite.push(index); core.saves.favorite = core.saves.favorite.sort(function (a,b) {return a-b;}); // 保证有序 + core.playSound('确定'); core.drawTip("收藏成功!"); } core.control._updateFavoriteSaves(); @@ -1924,6 +1978,7 @@ actions.prototype._keyDownSL = function (keycode) { var index = page*10 + offset; if (keycode == 37) { // left + core.playSound('光标移动'); if (offset == 0) { core.ui._drawSLPanel(10 * (page - 1) + 5); } @@ -1933,6 +1988,7 @@ actions.prototype._keyDownSL = function (keycode) { return; } if (keycode == 38) { // up + core.playSound('光标移动'); if (offset < 3) { core.ui._drawSLPanel(10 * (page - 1) + offset + 3); } @@ -1942,6 +1998,7 @@ actions.prototype._keyDownSL = function (keycode) { return; } if (keycode == 39) { // right + core.playSound('光标移动'); if (offset == 5) { core.ui._drawSLPanel(10 * (page + 1) + 1); } @@ -1951,6 +2008,7 @@ actions.prototype._keyDownSL = function (keycode) { return; } if (keycode == 40) { // down + core.playSound('光标移动'); if (offset >= 3) { core.ui._drawSLPanel(10 * (page + 1) + offset - 3); } @@ -1960,10 +2018,12 @@ actions.prototype._keyDownSL = function (keycode) { return; } if (keycode == 33) { // PAGEUP + core.playSound('光标移动'); core.ui._drawSLPanel(10 * (page - 1) + offset); return; } if (keycode == 34) { // PAGEDOWN + core.playSound('光标移动'); core.ui._drawSLPanel(10 * (page + 1) + offset); return; } @@ -2000,6 +2060,7 @@ actions.prototype._keyUpSL = function (keycode) { } if (keycode == 46) { if (offset == 0) { + core.playSound('操作失败'); core.drawTip("无法删除自动存档!"); } else { @@ -2027,15 +2088,19 @@ actions.prototype._clickSwitchs = function (x, y) { switch (selection) { case 0: core.status.event.selection = 0; + core.playSound('确定'); return core.ui._drawSwitchs_sounds(); case 1: core.status.event.selection = 0; + core.playSound('确定'); return core.ui._drawSwitchs_display(); case 2: core.status.event.selection = 0; + core.playSound('确定'); return core.ui._drawSwitchs_action(); case 3: core.status.event.selection = 0; + core.playSound('取消'); return core.ui._drawSettings(); } } @@ -2045,6 +2110,7 @@ actions.prototype._clickSwitchs = function (x, y) { actions.prototype._keyUpSwitchs = function (keycode) { if (keycode == 27 || keycode == 88) { core.status.event.selection = 0; + core.playSound('取消'); core.ui._drawSettings(); return; } @@ -2074,6 +2140,7 @@ actions.prototype._clickSwitchs_sounds = function (x, y) { return; case 3: core.status.event.selection = 0; + core.playSound('取消'); core.ui._drawSwitchs(); return; } @@ -2082,12 +2149,14 @@ actions.prototype._clickSwitchs_sounds = function (x, y) { actions.prototype._clickSwitchs_sounds_bgm = function () { core.triggerBgm(); + core.playSound('确定'); core.ui._drawSwitchs_sounds(); } actions.prototype._clickSwitchs_sounds_se = function () { core.musicStatus.soundStatus = !core.musicStatus.soundStatus; core.setLocalStorage('soundStatus', core.musicStatus.soundStatus); + core.playSound('确定'); core.ui._drawSwitchs_sounds(); } @@ -2099,22 +2168,24 @@ actions.prototype._clickSwitchs_sounds_userVolume = function (delta) { if (core.musicStatus.gainNode != null) core.musicStatus.gainNode.gain.value = core.musicStatus.userVolume; if (core.musicStatus.playingBgm) core.material.bgms[core.musicStatus.playingBgm].volume = core.musicStatus.userVolume * core.musicStatus.designVolume; core.setLocalStorage('userVolume', core.musicStatus.userVolume); + core.playSound('确定'); core.ui._drawSwitchs_sounds(); } actions.prototype._keyUpSwitchs_sounds = function (keycode) { if (keycode == 27 || keycode == 88) { core.status.event.selection = 0; + core.playSound('取消'); core.ui._drawSwitchs(); return; } if (keycode == 37) { switch (core.status.event.selection) { - case 2: return this._clickSwitchs_sounds_userVolume(-1); + case 2: core.playSound('确定'); return this._clickSwitchs_sounds_userVolume(-1); } } else if (keycode == 39) { switch (core.status.event.selection) { - case 2: return this._clickSwitchs_sounds_userVolume(1); + case 2: core.playSound('确定'); return this._clickSwitchs_sounds_userVolume(1); } } this._selectChoices(core.status.event.ui.choices.length, keycode, this._clickSwitchs_sounds); @@ -2138,17 +2209,23 @@ actions.prototype._clickSwitchs_display = function (x, y) { if (x == rightGrid || x == rightGrid + 1) return this._clickSwitchs_display_setSize(1); return; case 1: + core.playSound('确定'); return this._clickSwitchs_display_enableHDCanvas(); case 2: + core.playSound('确定'); return this._clickSwitchs_display_enemyDamage(); case 3: + core.playSound('确定'); return this._clickSwitchs_display_critical(); case 4: + core.playSound('确定'); return this._clickSwitchs_display_extraDamage(); case 5: + core.playSound('确定'); return this._clickSwitchs_display_extraDamageType(); case 6: core.status.event.selection = 1; + core.playSound('取消'); core.ui._drawSwitchs(); return; } @@ -2208,16 +2285,17 @@ actions.prototype._clickSwitchs_display_extraDamageType = function () { actions.prototype._keyUpSwitchs_display = function (keycode) { if (keycode == 27 || keycode == 88) { core.status.event.selection = 0; + core.playSound('取消'); core.ui._drawSwitchs(); return; } if (keycode == 37) { switch (core.status.event.selection) { - case 0: return this._clickSwitchs_display_setSize(-1); + case 0: core.playSound('确定'); return this._clickSwitchs_display_setSize(-1); } } else if (keycode == 39) { switch (core.status.event.selection) { - case 0: return this._clickSwitchs_display_setSize(1); + case 0: core.playSound('确定'); return this._clickSwitchs_display_setSize(1); } } this._selectChoices(core.status.event.ui.choices.length, keycode, this._clickSwitchs_display); @@ -2237,20 +2315,24 @@ actions.prototype._clickSwitchs_action = function (x, y) { core.status.event.selection = selection; switch (selection) { case 0: - if (x == leftGrid || x == leftGrid + 1) return this._clickSwitchs_action_moveSpeed(-10); - if (x == rightGrid || x == rightGrid + 1) return this._clickSwitchs_action_moveSpeed(10); + if (x == leftGrid || x == leftGrid + 1) { core.playSound('确定'); return this._clickSwitchs_action_moveSpeed(-10); } + if (x == rightGrid || x == rightGrid + 1) { core.playSound('确定'); return this._clickSwitchs_action_moveSpeed(10); } return; case 1: - if (x == leftGrid || x == leftGrid + 1) return this._clickSwitchs_action_floorChangeTime(-100); - if (x == rightGrid || x == rightGrid + 1) return this._clickSwitchs_action_floorChangeTime(100); + if (x == leftGrid || x == leftGrid + 1) { core.playSound('确定'); return this._clickSwitchs_action_floorChangeTime(-100); } + if (x == rightGrid || x == rightGrid + 1) { core.playSound('确定'); return this._clickSwitchs_action_floorChangeTime(100); } case 2: + core.playSound('确定'); return this._clickSwitchs_action_potionNoRouting(); case 3: + core.playSound('确定'); return this._clickSwitchs_action_clickMove(); case 4: + core.playSound('确定'); return this._clickSwitchs_action_leftHandPrefer(); case 5: core.status.event.selection = 2; + core.playSound('取消'); core.ui._drawSwitchs(); return; } @@ -2293,18 +2375,19 @@ actions.prototype._clickSwitchs_action_leftHandPrefer = function () { actions.prototype._keyUpSwitchs_action = function (keycode) { if (keycode == 27 || keycode == 88) { core.status.event.selection = 0; + core.playSound('取消'); core.ui._drawSwitchs(); return; } if (keycode == 37) { switch (core.status.event.selection) { - case 0: return this._clickSwitchs_action_moveSpeed(-10); - case 1: return this._clickSwitchs_action_floorChangeTime(-100); + case 0: core.playSound('确定'); return this._clickSwitchs_action_moveSpeed(-10); + case 1: core.playSound('确定'); return this._clickSwitchs_action_floorChangeTime(-100); } } else if (keycode == 39) { switch (core.status.event.selection) { - case 0: return this._clickSwitchs_action_moveSpeed(10); - case 1: return this._clickSwitchs_action_floorChangeTime(100); + case 0: core.playSound('确定'); return this._clickSwitchs_action_moveSpeed(10); + case 1: core.playSound('确定'); return this._clickSwitchs_action_floorChangeTime(100); } } this._selectChoices(core.status.event.ui.choices.length, keycode, this._clickSwitchs_action); @@ -2321,30 +2404,37 @@ actions.prototype._clickSettings = function (x, y) { switch (selection) { case 0: core.status.event.selection = 0; + core.playSound('确定'); core.ui._drawSwitchs(); break; case 1: + core.playSound('确定'); core.ui._drawKeyBoard(); break; case 2: + core.playSound('确定'); core.clearUI(); core.ui._drawViewMaps(); break; case 3: core.status.event.selection = 0; + core.playSound('确定'); core.ui._drawNotes(); break; case 4: core.status.event.selection = 0; + core.playSound('确定'); core.ui._drawSyncSave(); break; case 5: core.status.event.selection = 0; + core.playSound('确定'); core.ui._drawGameInfo(); break; case 6: return core.confirmRestart(); case 7: + core.playSound('取消'); core.ui.closePanel(); break; } @@ -2355,6 +2445,7 @@ actions.prototype._clickSettings = function (x, y) { ////// 系统菜单栏界面时,放开某个键的操作 ////// actions.prototype._keyUpSettings = function (keycode) { if (keycode == 27 || keycode == 88) { + core.playSound('取消'); core.ui.closePanel(); return; } @@ -2372,12 +2463,15 @@ actions.prototype._clickNotes = function (x, y) { core.status.event.selection = selection; switch (selection) { case 0: + core.playSound('确定'); this._clickNotes_new(); break; case 1: + core.playSound('确定'); this._clickNotes_show(); break; case 2: + core.playSound('确定'); this._clickNotes_edit(); break; case 3: @@ -2385,6 +2479,7 @@ actions.prototype._clickNotes = function (x, y) { break; case 4: core.status.event.selection = 3; + core.playSound('取消'); core.ui._drawSettings(); break; } @@ -2456,6 +2551,7 @@ actions.prototype._clickNotes_edit = function () { actions.prototype._clickNotes_delete = function () { core.status.hero.notes = core.status.hero.notes || []; if (core.status.hero.notes.length == 0) { + core.playSound('操作失败'); core.drawText("当前没有存档笔记,无法删除!"); } else { core.myprompt("请输入要删除的所有存档笔记编号,以逗号分隔。不填则代表删除全部笔记。", null, function (data) { @@ -2487,6 +2583,7 @@ actions.prototype._clickNotes_delete = function () { actions.prototype._keyUpNotes = function (keycode) { if (keycode == 27 || keycode == 88) { core.status.event.selection = 3; + core.playSound('取消'); core.ui._drawSettings(); return; } @@ -2504,25 +2601,32 @@ actions.prototype._clickSyncSave = function (x, y) { switch (selection) { case 0: core.status.event.selection = 0; + core.playSound('确定'); core.ui._drawSyncSelect(); break; case 1: + core.playSound('确定'); core.syncLoad(); break; case 2: + core.playSound('确定'); core.status.event.selection = 0; core.ui._drawLocalSaveSelect(); break; case 3: + core.playSound('确定'); return this._clickSyncSave_readFile(); case 4: + core.playSound('确定'); return this._clickSyncSave_replay(); case 5: core.status.event.selection = 0; + core.playSound('确定'); core.ui._drawStorageRemove(); break; case 6: core.status.event.selection = 4; + core.playSound('取消'); core.ui._drawSettings(); break; @@ -2547,7 +2651,8 @@ actions.prototype._clickSyncSave_replay = function () { ////// 同步存档界面时,放开某个键的操作 ////// actions.prototype._keyUpSyncSave = function (keycode) { if (keycode == 27 || keycode == 88) { - core.status.event.selection = 2; + core.status.event.selection = 4; + core.playSound('取消'); core.ui._drawSettings(); return; } @@ -2565,15 +2670,18 @@ actions.prototype._clickSyncSelect = function (x, y) { core.status.event.selection = selection; switch (selection) { case 0: + core.playSound('确定'); core.myconfirm('你确定要同步全部存档么?\n这可能在存档较多的时候比较慢。', function () { core.syncSave('all'); }); break; case 1: + core.playSound('确定'); core.syncSave(); break; case 2: core.status.event.selection = 0; + core.playSound('取消'); core.ui._drawSyncSave(); break; } @@ -2584,7 +2692,8 @@ actions.prototype._clickSyncSelect = function (x, y) { actions.prototype._keyUpSyncSelect = function (keycode) { if (keycode == 27 || keycode == 88) { core.status.event.selection = 0; - core.ui._drawSettings(); + core.playSound('取消'); + core.ui._drawSyncSave(); return; } this._selectChoices(core.status.event.ui.choices.length, keycode, this._clickSyncSelect); @@ -2616,6 +2725,7 @@ actions.prototype._clickLocalSaveSelect = function (x, y) { } core.status.event.selection = 2; + core.playSound('取消'); core.ui._drawSyncSave(); } } @@ -2623,8 +2733,9 @@ actions.prototype._clickLocalSaveSelect = function (x, y) { ////// 存档下载界面时,放开某个键的操作 ////// actions.prototype._keyUpLocalSaveSelect = function (keycode) { if (keycode == 27 || keycode == 88) { - core.status.event.selection = 0; - core.ui._drawSettings(); + core.status.event.selection = 2; + core.playSound('取消'); + core.ui._drawSyncSave(); return; } this._selectChoices(core.status.event.ui.choices.length, keycode, this._clickLocalSaveSelect); @@ -2647,6 +2758,7 @@ actions.prototype._clickStorageRemove = function (x, y) { return this._clickStorageRemove_current(); case 2: core.status.event.selection = 6; + core.playSound('取消'); core.ui._drawSyncSave(); break; } @@ -2654,7 +2766,7 @@ actions.prototype._clickStorageRemove = function (x, y) { } actions.prototype._clickStorageRemove_all = function () { - core.myconfirm("你确定要清除【全部塔】的所有本地存档?\n此行为不可逆!!!", function () { + core.myconfirm("你确定要清除【全部游戏】的所有本地存档?\n此行为不可逆!!!", function () { var done = function () { core.saves.ids = {}; core.saves.autosave.data = null; @@ -2680,7 +2792,7 @@ actions.prototype._clickStorageRemove_all = function () { } actions.prototype._clickStorageRemove_current = function () { - core.myconfirm("你确定要清除本塔的所有本地存档?\n此行为不可逆!!!", function () { + core.myconfirm("你确定要清除本游戏的所有本地存档?\n此行为不可逆!!!", function () { var done = function () { core.saves.ids = {}; core.saves.autosave.data = null; @@ -2715,6 +2827,7 @@ actions.prototype._clickStorageRemove_current = function () { actions.prototype._keyUpStorageRemove = function (keycode) { if (keycode == 27 || keycode == 88) { core.status.event.selection = 5; + core.playSound('取消'); core.ui._drawSyncSave(); return; } @@ -2732,12 +2845,12 @@ actions.prototype._clickReplay = function (x, y) { var selection = y - topIndex; core.status.event.selection = selection; switch (selection) { - case 0: return this._clickReplay_fromBeginning(); - case 1: return this._clickReplay_fromLoad(); - case 2: return this._clickReplay_replayRemain(); - case 3: return core.chooseReplayFile(); - case 4: return this._clickReplay_download(); - case 5: return core.ui.closePanel(); + case 0: core.playSound('确定'); return this._clickReplay_fromBeginning(); + case 1: core.playSound('确定'); return this._clickReplay_fromLoad(); + case 2: core.playSound('确定'); return this._clickReplay_replayRemain(); + case 3: core.playSound('确定'); return core.chooseReplayFile(); + case 4: core.playSound('确定'); return this._clickReplay_download(); + case 5: core.playSound('取消'); return core.ui.closePanel(); } } } @@ -2786,6 +2899,7 @@ actions.prototype._clickReplay_download = function () { ////// 回放选择界面时,放开某个键的操作 ////// actions.prototype._keyUpReplay = function (keycode) { if (keycode == 27 || keycode == 88) { + core.playSound('取消'); core.ui.closePanel(); return; } @@ -2811,6 +2925,7 @@ actions.prototype._clickGameInfo = function (x, y) { case 5: return this._clickGameInfo_download(); case 6: core.status.event.selection = 5; + core.playSound('取消'); core.ui._drawSettings(); break; } @@ -2821,7 +2936,7 @@ actions.prototype._clickGameInfo_openProject = function () { if (core.platform.isPC) window.open("editor.html", "_blank"); else { - core.myconfirm("即将离开本塔,跳转至本塔工程页面,确认?", function () { + core.myconfirm("即将离开本游戏,跳转至工程页面,确认?", function () { window.location.href = "editor-mobile.html"; }); } @@ -2829,11 +2944,11 @@ actions.prototype._clickGameInfo_openProject = function () { actions.prototype._clickGameInfo_openComments = function () { if (core.platform.isPC) { - window.open("/score.php?name=" + core.firstData.name + "&num=10", "_blank"); + window.open("/score.php?name=" + core.firstData.name, "_blank"); } else { - core.myconfirm("即将离开本塔,跳转至本塔评论页面,确认?", function () { - window.location.href = "/score.php?name=" + core.firstData.name + "&num=10"; + core.myconfirm("即将离开本游戏,跳转至评论页面,确认?", function () { + window.location.href = "/score.php?name=" + core.firstData.name; }); } } @@ -2848,8 +2963,9 @@ actions.prototype._clickGameInfo_download = function () { ////// 游戏信息界面时,放开某个键的操作 ////// actions.prototype._keyUpGameInfo = function (keycode) { if (keycode == 27 || keycode == 88) { - core.ui.closePanel(); - return; + core.status.event.selection = 5; + core.playSound('取消'); + return core.ui._drawSettings(); } this._selectChoices(core.status.event.ui.choices.length, keycode, this._clickGameInfo); } @@ -2861,6 +2977,7 @@ actions.prototype._clickKeyBoard = function (x, y) { core.ui.closePanel(); core.keyUp(112 + x + 5 - m); } + /* if (y == m - 3 && x == m + 6) { var val = prompt(); if (val != null) { @@ -2871,6 +2988,7 @@ actions.prototype._clickKeyBoard = function (x, y) { } } } + */ if (y == m - 2 && x >= m - 5 && x <= m + 4) { core.ui.closePanel(); core.keyUp(x == m + 4 ? 48 : 49 + x + 5 - m); // 1-9: 49-57; 0: 48 @@ -2940,21 +3058,25 @@ actions.prototype._clickCursor = function (x, y) { actions.prototype._keyDownCursor = function (keycode) { if (keycode == 37) { // left core.status.automaticRoute.cursorX--; + core.playSound('确定'); core.ui._drawCursor(); return; } if (keycode == 38) { // up core.status.automaticRoute.cursorY--; + core.playSound('确定'); core.ui._drawCursor(); return; } if (keycode == 39) { // right core.status.automaticRoute.cursorX++; + core.playSound('确定'); core.ui._drawCursor(); return; } if (keycode == 40) { // down core.status.automaticRoute.cursorY++; + core.playSound('确定'); core.ui._drawCursor(); return; } @@ -2963,10 +3085,12 @@ actions.prototype._keyDownCursor = function (keycode) { ////// 光标界面时,放开某个键的操作 ////// actions.prototype._keyUpCursor = function (keycode) { if (keycode == 27 || keycode == 88) { + core.playSound('取消'); core.ui.closePanel(); return; } if (keycode == 13 || keycode == 32 || keycode == 67 || keycode == 69) { + core.playSound('确定'); core.ui.closePanel(); core.onclick(core.status.automaticRoute.cursorX, core.status.automaticRoute.cursorY, []); return; diff --git a/libs/control.js b/libs/control.js index 7c2db1a5..8d25ef3b 100644 --- a/libs/control.js +++ b/libs/control.js @@ -1310,8 +1310,10 @@ control.prototype.pauseReplay = function () { ////// 恢复播放 ////// control.prototype.resumeReplay = function () { if (!core.isPlaying() || !core.isReplaying()) return; - if (core.isMoving() || core.status.replay.animate || core.status.event.id) + if (core.isMoving() || core.status.replay.animate || core.status.event.id) { + core.playSound('操作失败'); return core.drawTip("请等待当前事件的处理结束"); + } core.status.replay.pausing = false; core.updateStatusBar(); core.drawTip("恢复播放"); @@ -1321,9 +1323,14 @@ control.prototype.resumeReplay = function () { ////// 单步播放 ////// control.prototype.stepReplay = function () { if (!core.isPlaying() || !core.isReplaying()) return; - if (!core.status.replay.pausing) return core.drawTip("请先暂停录像"); - if (core.isMoving() || core.status.replay.animate || core.status.event.id) + if (!core.status.replay.pausing) { + core.playSound('操作失败'); + return core.drawTip("请先暂停录像"); + } + if (core.isMoving() || core.status.replay.animate || core.status.event.id) { + core.playSound('操作失败'); return core.drawTip("请等待当前事件的处理结束"); + } core.replay(true); } @@ -1379,11 +1386,18 @@ control.prototype.stopReplay = function (force) { ////// 回退 ////// control.prototype.rewindReplay = function () { if (!core.isPlaying() || !core.isReplaying()) return; - if (!core.status.replay.pausing) return core.drawTip("请先暂停录像"); - if (core.isMoving() || core.status.replay.animate || core.status.event.id) + if (!core.status.replay.pausing) { + core.playSound('操作失败'); + return core.drawTip("请先暂停录像"); + } + if (core.isMoving() || core.status.replay.animate || core.status.event.id) { + core.playSound('操作失败'); return core.drawTip("请等待当前事件的处理结束"); - if (core.status.replay.save.length==0) + } + if (core.status.replay.save.length==0) { + core.playSound('操作失败'); return core.drawTip("无法再回到上一个节点"); + } var save = core.status.replay.save, data = save.pop(); core.loadData(data.data, function () { core.removeFlag('__fromLoad__'); @@ -1408,10 +1422,18 @@ control.prototype.rewindReplay = function () { ////// 回放时存档 ////// control.prototype._replay_SL = function () { if (!core.isPlaying() || !core.isReplaying()) return; - if (!core.status.replay.pausing) return core.drawTip("请先暂停录像"); - if (core.isMoving() || core.status.replay.animate || core.status.event.id) + if (!core.status.replay.pausing) { + core.playSound('操作失败'); + return core.drawTip("请先暂停录像"); + } + if (core.isMoving() || core.status.replay.animate || core.status.event.id) { + core.playSound('操作失败'); return core.drawTip("请等待当前事件的处理结束"); - if (core.hasFlag('__forbidSave__')) return core.drawTip('当前禁止存档'); + } + if (core.hasFlag('__forbidSave__')) { + core.playSound('操作失败'); + return core.drawTip('当前禁止存档'); + } this._replay_hideProgress(); core.lockControl(); @@ -1425,11 +1447,18 @@ control.prototype._replay_SL = function () { ////// 回放时查看怪物手册 ////// control.prototype._replay_book = function () { if (!core.isPlaying() || !core.isReplaying()) return; - if (!core.status.replay.pausing) return core.drawTip("请先暂停录像"); - if (core.isMoving() || core.status.replay.animate - || (core.status.event.id && core.status.event.id != 'viewMaps')) + if (!core.status.replay.pausing) { + core.playSound('操作失败'); + return core.drawTip("请先暂停录像"); + } + if (core.isMoving() || core.status.replay.animate || (core.status.event.id && core.status.event.id != 'viewMaps')) { + core.playSound('操作失败'); return core.drawTip("请等待当前事件的处理结束"); - if (!core.hasItem('book')) return core.drawTip('你没有'+core.material.items['book'].name); + } + if (!core.hasItem('book')) { + core.playSound('操作失败'); + return core.drawTip('你没有'+core.material.items['book'].name, 'book'); + } this._replay_hideProgress(); // 从“浏览地图”页面打开 @@ -1444,9 +1473,14 @@ control.prototype._replay_book = function () { ////// 回放录像时浏览地图 ////// control.prototype._replay_viewMap = function () { if (!core.isPlaying() || !core.isReplaying()) return; - if (!core.status.replay.pausing) return core.drawTip("请先暂停录像"); - if (core.isMoving() || core.status.replay.animate || core.status.event.id) + if (!core.status.replay.pausing) { + core.playSound('操作失败'); + return core.drawTip("请先暂停录像"); + } + if (core.isMoving() || core.status.replay.animate || core.status.event.id) { + core.playSound('操作失败'); return core.drawTip("请等待当前事件的处理结束"); + } this._replay_hideProgress(); core.lockControl(); @@ -1456,9 +1490,14 @@ control.prototype._replay_viewMap = function () { control.prototype._replay_toolbox = function () { if (!core.isPlaying() || !core.isReplaying()) return; - if (!core.status.replay.pausing) return core.drawTip("请先暂停录像"); - if (core.isMoving() || core.status.replay.animate || core.status.event.id) + if (!core.status.replay.pausing) { + core.playSound('操作失败'); + return core.drawTip("请先暂停录像"); + } + if (core.isMoving() || core.status.replay.animate || core.status.event.id) { + core.playSound('操作失败'); return core.drawTip("请等待当前事件的处理结束"); + } this._replay_hideProgress(); core.lockControl(); @@ -1468,9 +1507,14 @@ control.prototype._replay_toolbox = function () { control.prototype._replay_equipbox = function () { if (!core.isPlaying() || !core.isReplaying()) return; - if (!core.status.replay.pausing) return core.drawTip("请先暂停录像"); - if (core.isMoving() || core.status.replay.animate || core.status.event.id) + if (!core.status.replay.pausing) { + core.playSound('操作失败'); + return core.drawTip("请先暂停录像"); + } + if (core.isMoving() || core.status.replay.animate || core.status.event.id) { + core.playSound('操作失败'); return core.drawTip("请等待当前事件的处理结束"); + } this._replay_hideProgress(); core.lockControl(); @@ -1574,6 +1618,7 @@ control.prototype._replay_error = function (action) { core.rewindReplay(); } else { + core.playSound('操作失败'); core.drawTip("无法回到上一个节点"); core.stopReplay(true); } @@ -1841,7 +1886,10 @@ control.prototype.doSL = function (id, type) { } control.prototype._doSL_save = function (id) { - if (id=='autoSave') return core.drawTip('不能覆盖自动存档!'); + if (id=='autoSave') { + core.playSound('操作失败'); + return core.drawTip('不能覆盖自动存档!'); + } // 在事件中的存档 if (core.status.event.interval != null) core.setFlag("__events__", core.status.event.interval); @@ -1851,6 +1899,7 @@ control.prototype._doSL_save = function (id) { // 恢复事件 if (!core.events.recoverEvents(core.status.event.interval)) core.ui.closePanel(); + core.playSound('存档'); core.drawTip('存档成功!'); }, function(err) { main.log(err); @@ -1932,14 +1981,27 @@ control.prototype._doSL_load_afterGet = function (id, data) { } control.prototype._doSL_replayLoad_afterGet = function (id, data) { - if (!data) return core.drawTip("无效的存档"); - if (data.version != core.firstData.version) return core.drawTip("存档版本不匹配"); - if (data.hard != core.status.hard) return core.drawTip("游戏难度不匹配!"); - if (data.hero.flags.__events__ && data.guid != core.getGuid()) + if (!data) { + core.playSound('操作失败'); + return core.drawTip("无效的存档"); + } + if (data.version != core.firstData.version) { + core.playSound('操作失败'); + return core.drawTip("存档版本不匹配"); + } + if (data.hard != core.status.hard) { + core.playSound('操作失败'); + return core.drawTip("游戏难度不匹配!"); + } + if (data.hero.flags.__events__ && data.guid != core.getGuid()) { + core.playSound('操作失败'); return core.drawTip("此存档可能存在风险,无法读档"); + } var route = core.subarray(core.status.route, core.decodeRoute(data.route)); - if (route == null || data.hero.flags.__seed__ != core.getFlag('__seed__')) - return core.drawTip("无法从此存档回放录像"); + if (route == null || data.hero.flags.__seed__ != core.getFlag('__seed__')) { + core.playSound('操作失败'); + return core.drawTip("种子不一致,无法从此存档回放录像"); + } core.loadData(data, function () { core.removeFlag('__fromLoad__'); core.startReplay(route); @@ -1949,8 +2011,10 @@ control.prototype._doSL_replayLoad_afterGet = function (id, data) { } control.prototype._doSL_replayRemain_afterGet = function (id, data) { - if (!data) return core.drawTip("无效的存档"); - + if (!data) { + core.playSound('操作失败'); + return core.drawTip("无效的存档"); + } var route = core.decodeRoute(data.route); if (core.status.tempRoute) { var remainRoute = core.subarray(route, core.status.tempRoute); @@ -2185,6 +2249,7 @@ control.prototype.removeSave = function (index, callback) { core.control._updateFavoriteSaves(); if (callback) callback(); }, function () { + core.playSound('操作失败'); core.drawTip("无法删除存档!"); if (callback) callback(); }); diff --git a/libs/events.js b/libs/events.js index 808e14bb..c0dc4a76 100644 --- a/libs/events.js +++ b/libs/events.js @@ -252,13 +252,13 @@ events.prototype._gameOver_askRate = function (ending) { return; } - core.ui.drawConfirmBox("恭喜通关本塔,你想进行评分吗?", function () { + core.ui.drawConfirmBox("恭喜通关!你想进行评分吗?", function () { if (core.platform.isPC) { - window.open("/score.php?name=" + core.firstData.name + "&num=10", "_blank"); + window.open("/score.php?name=" + core.firstData.name, "_blank"); core.restart(); } else { - window.location.href = "/score.php?name=" + core.firstData.name + "&num=10"; + window.location.href = "/score.php?name=" + core.firstData.name; } }, function () { core.restart(); @@ -273,11 +273,14 @@ events.prototype.restart = function() { ////// 询问是否需要重新开始 ////// events.prototype.confirmRestart = function () { + core.playSound('打开界面'); core.status.event.selection = 1; core.ui.drawConfirmBox("你确定要返回标题页面吗?", function () { + core.playSound('确定'); core.ui.closePanel(); core.restart(); }, function () { + core.playSound('取消'); core.ui.closePanel(); }); } @@ -410,7 +413,8 @@ events.prototype.battle = function (id, x, y, force, callback) { if (!id) return core.clearContinueAutomaticRoute(callback); // 非强制战斗 if (!core.enemys.canBattle(id, x, y) && !force && !core.status.event.id) { - core.drawTip("你打不过此怪物!"); + core.playSound('操作失败'); + core.drawTip("你打不过此怪物!", id); return core.clearContinueAutomaticRoute(callback); } // 自动存档 @@ -491,10 +495,14 @@ events.prototype._openDoor_check = function (id, x, y, needKey) { // --- 如果是一个不存在的道具,则直接认为无法开启 if (!core.material.items[keyName]) { + core.stopSound(); + core.playSound('操作失败'); core.drawTip("无法开启此门"); return clearAndReturn(); } if (core.itemCount(keyName) < keyValue) { + core.stopSound(); + core.playSound('操作失败'); core.drawTip("你的" + ((core.material.items[keyName] || {}).name || "钥匙") + "不足!", null, true); return false; } @@ -1616,6 +1624,7 @@ events.prototype._action_useItem = function (data, x, y, prefix) { core.useItem(data.id, true, core.doAction); } else { + core.playSound('操作失败'); core.drawTip("当前无法使用" + ((core.material.items[data.id] || {}).name || "未知道具")); core.doAction(); } @@ -1901,18 +1910,20 @@ events.prototype._action_choices = function (data, x, y, prefix) { } else { // 容错录像 if (main.replayChecking) { - core.control._replay_error(action); - return; - } - core.myprompt('录像回放出错!当前需要执行选择项但录像中未记录。\n如需修复请输入您要选的项(从0起),点击取消将不会修复。', 0, function (value) { - if (value == null) { - core.control._replay_error(action); - return; - } + // 录像验证系统中选择第一项 core.status.replay.toReplay.unshift(action); // 首先归还刚才读出的下一步操作 - value = core.clamp(parseInt(value), 0, data.choices.length - 1); - core.events.__action_choices_replaying(data, core.clamp(value, 0, data.choices.length - 1)) - }); + core.events.__action_choices_replaying(data, 0) + } else { + // 正常游戏中弹窗选择 + core.myprompt('录像回放出错!当前需要执行选择项但录像中未记录。\n如需修复请输入您要选的项(从0起),点击取消将不会修复。', 0, function (value) { + if (value == null) { + core.control._replay_error(action); + return; + } + core.status.replay.toReplay.unshift(action); // 首先归还刚才读出的下一步操作 + core.events.__action_choices_replaying(data, core.clamp(parseInt(value), 0, data.choices.length - 1)) + }); + } } } else { if (data.timeout) { @@ -2517,10 +2528,12 @@ events.prototype._checkStatus = function (name, fromUserAction, checkItem) { } if (fromUserAction && core.status.lockControl) return false; if (checkItem && !core.hasItem(name)) { - core.drawTip("你没有" + core.material.items[name].name); + core.playSound('操作失败'); + core.drawTip("你没有" + core.material.items[name].name, name); return false; } if (core.isMoving()) { + core.playSound('操作失败'); core.drawTip("请先停止勇士行动"); return false; } @@ -2547,6 +2560,7 @@ events.prototype.openBook = function (fromUserAction) { core.status.event.ui = core.status.event.data; } if (!this._checkStatus('book', fromUserAction, true)) return; + core.playSound('打开界面'); core.useItem('book', true); } @@ -2555,19 +2569,22 @@ events.prototype.useFly = function (fromUserAction) { if (core.isReplaying()) return; if (!this._checkStatus('fly', fromUserAction, true)) return; if (core.flags.flyNearStair && !core.nearStair()) { - core.drawTip("只有在楼梯边才能使用" + core.material.items['fly'].name); + core.playSound('操作失败'); + core.drawTip("只有在楼梯边才能使用" + core.material.items['fly'].name, 'fly'); core.unlockControl(); core.status.event.data = null; core.status.event.id = null; return; } if (!core.canUseItem('fly')) { - core.drawTip(core.material.items['fly'].name + "好像失效了"); + core.playSound('操作失败'); + core.drawTip(core.material.items['fly'].name + "好像失效了", 'fly'); core.unlockControl(); core.status.event.data = null; core.status.event.id = null; return; } + core.playSound('打开界面'); core.useItem('fly', true); return; } @@ -2580,6 +2597,7 @@ events.prototype.flyTo = function (toId, callback) { events.prototype.openEquipbox = function (fromUserAction) { if (core.isReplaying()) return; if (!this._checkStatus('equipbox', fromUserAction)) return; + core.playSound('打开界面'); core.ui._drawEquipbox(); } @@ -2587,6 +2605,7 @@ events.prototype.openEquipbox = function (fromUserAction) { events.prototype.openToolbox = function (fromUserAction) { if (core.isReplaying()) return; if (!this._checkStatus('toolbox', fromUserAction)) return; + core.playSound('打开界面'); core.ui._drawToolbox(); } @@ -2595,7 +2614,8 @@ events.prototype.openQuickShop = function (fromUserAction) { if (core.isReplaying()) return; if (Object.keys(core.status.shops).length == 0) { - core.drawTip("本塔没有快捷商店!"); + core.playSound('操作失败'); + core.drawTip("本游戏没有快捷商店!"); return; } @@ -2604,11 +2624,13 @@ events.prototype.openQuickShop = function (fromUserAction) { var shopId = Object.keys(core.status.shops)[0]; if (core.status.event.id != null) return; if (!core.canOpenShop(shopId)) { + core.playSound('操作失败'); core.drawTip("当前无法打开快捷商店!"); return; } var message = core.canUseQuickShop(shopId); if (message != null) { + core.playSound('操作失败'); core.drawTip(message); return; } @@ -2630,6 +2652,7 @@ events.prototype.openKeyBoard = function (fromUserAction) { events.prototype.save = function (fromUserAction) { if (core.isReplaying()) return; if (core.hasFlag('__forbidSave__')) { + core.playSound('操作失败'); core.drawTip('当前禁止存档'); return; } @@ -2638,6 +2661,7 @@ events.prototype.save = function (fromUserAction) { if (!this._checkStatus('save', fromUserAction)) return; var saveIndex = core.saves.saveIndex; var page=parseInt((saveIndex-1)/5), offset=saveIndex-5*page; + core.playSound('打开界面'); core.ui._drawSLPanel(10*page+offset); } @@ -2653,12 +2677,14 @@ events.prototype.load = function (fromUserAction) { core.clearMap('all'); core.status.event = {'id': 'load', 'data': null}; core.status.lockControl = true; + core.playSound('打开界面'); core.ui._drawSLPanel(10*page+offset); return; } if (core.status.event.id == 'load' && core.events.recoverEvents(core.status.event.interval)) return; if (!this._checkStatus('load', fromUserAction)) return; + core.playSound('打开界面'); core.ui._drawSLPanel(10*page+offset); } @@ -2667,6 +2693,7 @@ events.prototype.openSettings = function (fromUserAction) { if (core.isReplaying()) return; if (!this._checkStatus('settings', fromUserAction)) return; + core.playSound('打开界面'); core.ui._drawSettings(); } @@ -3264,6 +3291,7 @@ events.prototype.tryUseItem = function (itemId) { core.ui.closePanel(); core.useItem(itemId); } else { + core.playSound('操作失败'); core.drawTip("当前无法使用" + core.material.items[itemId].name); } } diff --git a/libs/items.js b/libs/items.js index 39c171ed..0eb64da1 100644 --- a/libs/items.js +++ b/libs/items.js @@ -233,13 +233,19 @@ items.prototype.canEquip = function (equipId, hint) { // 装备是否合法 var equip = core.material.items[equipId] || {}; if (!equip.equip) { - if (hint) core.drawTip("不合法的装备!"); + if (hint) { + core.playSound('操作失败'); + core.drawTip("不合法的装备!"); + } return false; } // 是否拥有该装备 if (!core.hasItem(equipId) && !core.hasEquip(equipId)) { - if (hint) core.drawTip("你当前没有" + equip.name + ",无法换装"); + if (hint) { + core.playSound('操作失败'); + core.drawTip("你当前没有" + equip.name + ",无法换装"); + } return false; } @@ -248,7 +254,10 @@ items.prototype.canEquip = function (equipId, hint) { if (canUseItemEffect) { try { if (!eval(canUseItemEffect)) { - if (hint) core.drawTip("当前不可换上" + equip.name); + if (hint) { + core.playSound('操作失败'); + core.drawTip("当前不可换上" + equip.name); + } return false; } } @@ -270,6 +279,7 @@ items.prototype.loadEquip = function (equipId, callback) { var loadEquip = core.material.items[equipId] || {}; var type = this.getEquipTypeById(equipId); if (type < 0) { + core.playSound('操作失败'); core.drawTip("当前没有" + loadEquip.equip.type + "的空位!"); if (callback) callback(); return; @@ -341,7 +351,7 @@ items.prototype._realLoadEquip = function (type, loadId, unloadId, callback) { items.prototype._realLoadEquip_playSound = function () { if (core.hasFlag("__quickLoadEquip__")) return; core.stopSound(); - core.playSound('equip.mp3'); + core.playSound('穿脱装备'); } ////// 保存装备 ////// @@ -357,6 +367,7 @@ items.prototype.quickSaveEquip = function (index) { items.prototype.quickLoadEquip = function (index) { var current = core.getFlag("saveEquips", [])[index]; if (!current) { + core.playSound('操作失败'); core.drawTip(index + "号套装不存在"); return; } diff --git a/libs/ui.js b/libs/ui.js index 8f3db199..17ab6718 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -1928,7 +1928,7 @@ ui.prototype._drawReplay = function () { ui.prototype._drawGameInfo = function () { core.status.event.id = 'gameInfo'; this.drawChoices(null, [ - "数据统计", "查看工程", "游戏主页", "操作帮助", "关于本塔","下载离线版本", "返回主菜单" + "数据统计", "查看工程", "游戏主页", "操作帮助", "关于游戏","下载离线版本", "返回主菜单" ]); } @@ -2226,7 +2226,7 @@ ui.prototype._drawBookDetail = function (index) { core.setAlpha('data', 1); core.strokeRect('data', left - 1, top - 1, width + 1, height + 1, core.arrayToRGBA(core.status.globalAttribute.borderColor), 2); - + core.playSound('确定'); this._drawBookDetail_drawContent(enemy, content, {top: top, content_left: content_left, bottom: bottom, validWidth: validWidth}); } @@ -2428,6 +2428,7 @@ ui.prototype._drawCenterFly = function () { offsetY = core.clamp(toY - core.__HALF_SIZE__, 0, core.bigmap.height - core.__SIZE__); core.fillRect('ui', (toX - offsetX) * 32, (toY - offsetY) * 32, 32, 32, fillstyle); core.status.event.data = {"x": toX, "y": toY, "posX": toX - offsetX, "posY": toY - offsetY}; + core.playSound('打开界面'); core.drawTip("请确认当前"+core.material.items['centerFly'].name+"的位置"); return; } @@ -3015,6 +3016,7 @@ ui.prototype.drawStatusBar = function () { ////// 绘制“数据统计”界面 ////// ui.prototype._drawStatistics = function (floorIds) { + core.playSound('打开界面'); var obj = this._drawStatistics_buildObj(); if (typeof floorIds == 'string') floorIds = [floorIds]; (floorIds || core.floorIds).forEach(function (floorId) { @@ -3189,6 +3191,7 @@ ui.prototype._drawAbout = function () { ////// 绘制帮助页面 ////// ui.prototype._drawHelp = function () { + core.playSound('打开界面'); core.clearUI(); if (core.material.images.keyboard) { core.status.event.id = 'help'; diff --git a/project/data.js b/project/data.js index c0774f03..64c0e047 100644 --- a/project/data.js +++ b/project/data.js @@ -35,12 +35,36 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "jump.mp3", "pickaxe.mp3", "bomb.mp3", - "centerFly.mp3" + "centerFly.mp3", + "error.mp3", + "cancel.mp3", + "cursor.mp3", + "confirm.mp3", + "open_ui.mp3", + "load.mp3", + "recovery.mp3", + "save.mp3" ], "fonts": [], "nameMap": { - "背景图.jpg": "bg.jpg", - "背景音乐.mp3": "bgm.mp3" + "普攻": "attack.mp3", + "炸弹": "bomb.mp3", + "飞行器": "centerFly.mp3", + "开关门": "door.mp3", + "上下楼": "floor.mp3", + "获得道具": "item.mp3", + "跳跃": "jump.mp3", + "破墙镐": "pickaxe.mp3", + "阻激夹域": "zone.mp3", + "操作失败": "error.mp3", + "取消": "cancel.mp3", + "光标移动": "cursor.mp3", + "确定": "confirm.mp3", + "穿脱装备": "equip.mp3", + "打开界面": "open_ui.mp3", + "读档": "load.mp3", + "回血": "recovery.mp3", + "存档": "save.mp3" }, "levelChoose": [ { diff --git a/project/functions.js b/project/functions.js index dd94a714..d16d2f37 100644 --- a/project/functions.js +++ b/project/functions.js @@ -100,7 +100,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // ---------- 此时还没有进行切换,当前floorId还是原来的 ---------- // var currentId = core.status.floorId || null; // 获得当前的floorId,可能为null var fromLoad = core.hasFlag('__fromLoad__'); // 是否是读档造成的切换 - if (!fromLoad) { + var isFlying = core.hasFlag('__isFlying__'); // 是否是楼传造成的切换 + if (!fromLoad && !(isFlying && currentId == floorId)) { if (!core.hasFlag("__leaveLoc__")) core.setFlag("__leaveLoc__", {}); if (currentId != null) core.getFlag("__leaveLoc__")[currentId] = core.clone(core.status.hero.loc); } @@ -111,7 +112,12 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // } // 播放换层音效 - core.playSound('floor.mp3'); + if (fromLoad) + core.playSound('读档'); + else if (isFlying) + core.playSound('飞行器'); + else if (currentId) + core.playSound('上下楼'); // 根据分区信息自动砍层与恢复 if (core.autoRemoveMaps) core.autoRemoveMaps(floorId); @@ -140,7 +146,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 切换楼层BGM if (core.status.maps[floorId].bgm) { var bgm = core.status.maps[floorId].bgm; - if (bgm instanceof Array) bgm = bgm[0]; + if (bgm instanceof Array) bgm = bgm[Math.floor(Math.random() * bgm.length)]; // 多个bgm则随机播放一个 if (!core.hasFlag("__bgm__")) core.playBgm(bgm); } // 更改画面色调 @@ -188,6 +194,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 检查能否飞行 if (!core.status.maps[fromId].canFlyFrom || !core.status.maps[toId].canFlyTo || !core.hasVisitedFloor(toId)) { + core.playSound('操作失败'); core.drawTip("无法飞往" + core.status.maps[toId].title + "!"); return false; } @@ -199,9 +206,9 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = loc = core.getFlag("__leaveLoc__", {})[toId] || null; } if (core.status.maps[toId].flyPoint != null && core.status.maps[toId].flyPoint.length == 2) { - loc = { x: core.status.maps[toId].flyPoint[0], y: core.status.maps[toId].flyPoint[1] }; + stair = 'flyPoint'; } - if (loc == null) { + if (stair == null && loc == null) { // 获得两个楼层的索引,以决定是上楼梯还是下楼梯 var fromIndex = core.floorIds.indexOf(fromId), toIndex = core.floorIds.indexOf(toId); @@ -236,7 +243,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (guards.length > 0) { // 记录flag,当前要参与支援的怪物 core.setFlag("__guards__" + x + "_" + y, guards); - var actions = [{ "type": "playSound", "name": "jump.mp3" }]; + var actions = [{ "type": "playSound", "name": "跳跃" }]; // 增加支援的特效动画(图块跳跃) guards.forEach(function (g) { core.push(actions, { "type": "jump", "from": [g[0], g[1]], "to": [x, y], "time": 300, "keep": false, "async": true }); @@ -322,8 +329,10 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.status.hero.statistics.exp += exp; var hint = "打败 " + enemy.name; - if (core.flags.statusBarItems.indexOf('enableMoney') >= 0) hint += ",金币+" + money; - if (core.flags.statusBarItems.indexOf('enableExp') >= 0) hint += ",经验+" + exp; + if (core.flags.statusBarItems.indexOf('enableMoney') >= 0) + hint += ',' + core.getStatusLabel('money') + '+' + money; // hint += ",金币+" + money; + if (core.flags.statusBarItems.indexOf('enableExp') >= 0) + hint += ',' + core.getStatusLabel('exp') + '+' + exp; // hint += ",经验+" + exp; core.drawTip(hint, enemy.id); // 中毒 @@ -441,7 +450,10 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 获得一个道具后触发的事件 // itemId:获得的道具ID;x和y是该道具所在的坐标 // isGentleClick:是否是轻按触发的 - core.playSound('item.mp3'); + if (itemId.endsWith('Potion') && core.material.items[itemId].cls == 'items') + core.playSound('回血'); + else + core.playSound('获得道具'); var todo = []; // 检查该点的获得道具后事件。 @@ -1259,7 +1271,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 如需调用当前楼层的ratio可使用 core.status.maps[floorId].ratio if (id == 'lavaNet' && !core.hasItem('amulet')) { damage[loc] = (damage[loc] || 0) + core.values.lavaDamage; - type[loc]["血网伤害"] = true; + type[loc][(block.event.name || "血网") + "伤害"] = true; } // 领域 @@ -1703,6 +1715,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.fillText('ui', "作者: 艾之葵", text_start, top + 112); core.fillText('ui', 'HTML5魔塔交流群:539113091', text_start, top + 112 + 32); // TODO: 写自己的“关于”页面,每次增加32像素即可 + core.playSound('打开界面'); } } } \ No newline at end of file diff --git a/project/items.js b/project/items.js index d125902f..b8f75f88 100644 --- a/project/items.js +++ b/project/items.js @@ -297,7 +297,7 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "name": "圣水", "itemEffect": "core.status.hero.hp *= 2", "itemEffectTip": ",生命值翻倍", - "useItemEffect": "core.status.hero.hp *= 2;", + "useItemEffect": "core.status.hero.hp *= 2; core.playSound('回血');", "canUseItemEffect": "true", "text": "生命值翻倍" }, @@ -333,7 +333,7 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "constants", "name": "冰冻徽章", "text": "可以将面前的熔岩变成平地", - "useItemEffect": "(function () {\n\tvar success = false;\n\n\tvar snowFourDirections = false; // 是否四方向雪花;如果是将其改成true\n\tif (snowFourDirections) {\n\t\t// 四方向雪花\n\t\tfor (var direction in core.utils.scan) {\n\t\t\tvar delta = core.utils.scan[direction];\n\t\t\tvar nx = core.getHeroLoc('x') + delta.x,\n\t\t\t\tny = core.getHeroLoc('y') + delta.y;\n\t\t\tif (core.getBlockId(nx, ny) == 'lava') {\n\t\t\t\tcore.removeBlock(nx, ny);\n\t\t\t\tsuccess = true;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (core.getBlockId(core.nextX(), core.nextY()) == 'lava') {\n\t\t\tcore.removeBlock(core.nextX(), core.nextY());\n\t\t\tsuccess = true;\n\t\t}\n\t}\n\n\tif (success) {\n\t\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\t} else {\n\t\tcore.drawTip(\"当前无法使用\" + core.material.items[itemId].name);\n\t\tcore.addItem(itemId, 1);\n\t\treturn;\n\t}\n})();", + "useItemEffect": "(function () {\n\tvar success = false;\n\n\tvar snowFourDirections = false; // 是否四方向雪花;如果是将其改成true\n\tif (snowFourDirections) {\n\t\t// 四方向雪花\n\t\tfor (var direction in core.utils.scan) {\n\t\t\tvar delta = core.utils.scan[direction];\n\t\t\tvar nx = core.getHeroLoc('x') + delta.x,\n\t\t\t\tny = core.getHeroLoc('y') + delta.y;\n\t\t\tif (core.getBlockId(nx, ny) == 'lava') {\n\t\t\t\tcore.removeBlock(nx, ny);\n\t\t\t\tsuccess = true;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (core.getBlockId(core.nextX(), core.nextY()) == 'lava') {\n\t\t\tcore.removeBlock(core.nextX(), core.nextY());\n\t\t\tsuccess = true;\n\t\t}\n\t}\n\n\tif (success) {\n\t\tcore.playSound('打开界面');\n\t\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\t} else {\n\t\tcore.playSound('操作失败');\n\t\tcore.drawTip(\"当前无法使用\" + core.material.items[itemId].name);\n\t\tcore.addItem(itemId, 1);\n\t\treturn;\n\t}\n})();", "canUseItemEffect": "true" }, "cross": { @@ -374,21 +374,21 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "tools", "name": "破墙镐", "text": "可以破坏勇士面前的墙", - "useItemEffect": "(function () {\n\tvar canBreak = function (x, y) {\n\t\tvar block = core.getBlock(x, y);\n\t\tif (block == null || block.disable) return false;\n\t\treturn block.event.canBreak;\n\t};\n\n\tvar success = false;\n\tvar pickaxeFourDirections = false; // 是否四方向破;如果是将其改成true\n\tif (pickaxeFourDirections) {\n\t\t// 四方向破\n\t\tfor (var direction in core.utils.scan) {\n\t\t\tvar delta = core.utils.scan[direction];\n\t\t\tvar nx = core.getHeroLoc('x') + delta.x,\n\t\t\t\tny = core.getHeroLoc('y') + delta.y;\n\t\t\tif (canBreak(nx, ny)) {\n\t\t\t\tcore.removeBlock(nx, ny);\n\t\t\t\tsuccess = true;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// 仅破当前\n\t\tif (canBreak(core.nextX(), core.nextY())) {\n\t\t\tcore.removeBlock(core.nextX(), core.nextY());\n\t\t\tsuccess = true;\n\t\t}\n\t}\n\n\tif (success) {\n\t\tcore.playSound('pickaxe.mp3');\n\t\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\t} else {\n\t\t// 无法使用\n\t\tcore.drawTip(\"当前无法使用\" + core.material.items[itemId].name);\n\t\tcore.addItem(itemId, 1);\n\t\treturn;\n\t}\n})();", + "useItemEffect": "(function () {\n\tvar canBreak = function (x, y) {\n\t\tvar block = core.getBlock(x, y);\n\t\tif (block == null || block.disable) return false;\n\t\treturn block.event.canBreak;\n\t};\n\n\tvar success = false;\n\tvar pickaxeFourDirections = false; // 是否四方向破;如果是将其改成true\n\tif (pickaxeFourDirections) {\n\t\t// 四方向破\n\t\tfor (var direction in core.utils.scan) {\n\t\t\tvar delta = core.utils.scan[direction];\n\t\t\tvar nx = core.getHeroLoc('x') + delta.x,\n\t\t\t\tny = core.getHeroLoc('y') + delta.y;\n\t\t\tif (canBreak(nx, ny)) {\n\t\t\t\tcore.removeBlock(nx, ny);\n\t\t\t\tsuccess = true;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// 仅破当前\n\t\tif (canBreak(core.nextX(), core.nextY())) {\n\t\t\tcore.removeBlock(core.nextX(), core.nextY());\n\t\t\tsuccess = true;\n\t\t}\n\t}\n\n\tif (success) {\n\t\tcore.playSound('破墙镐');\n\t\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\t} else {\n\t\t// 无法使用\n\t\tcore.playSound('操作失败');\n\t\tcore.drawTip(\"当前无法使用\" + core.material.items[itemId].name);\n\t\tcore.addItem(itemId, 1);\n\t\treturn;\n\t}\n})();", "canUseItemEffect": "true" }, "icePickaxe": { "cls": "tools", "name": "破冰镐", "text": "可以破坏勇士面前的一堵冰墙", - "useItemEffect": "(function () {\n\tcore.removeBlock(core.nextX(), core.nextY());\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n})();", - "canUseItemEffect": "(function () {\n\treturn core.getBlockId(core.nextX(), core.nextY()) == 'ice';\n})();" + "useItemEffect": "(function () {\n\tcore.removeBlock(core.nextX(), core.nextY());\n\tcore.playSound('打开界面');\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n})();", + "canUseItemEffect": "(function () {\n\treturn core.getBlockId(core.nextX(), core.nextY()) == 'ice' || core.getBlockId(core.nextX(), core.nextY()) == 'iceDoor';\n})();" }, "bomb": { "cls": "tools", "name": "炸弹", "text": "可以炸掉勇士面前的怪物", - "useItemEffect": "(function () {\n\tvar canBomb = function (x, y) {\n\t\tvar block = core.getBlock(x, y);\n\t\tif (block == null || block.disable || block.event.cls.indexOf('enemy') != 0) return false;\n\t\tvar enemy = core.material.enemys[block.event.id];\n\t\treturn enemy && !enemy.notBomb;\n\t};\n\n\tvar bombList = []; // 炸掉的怪物坐标列表\n\tvar bombFourDirections = false; // 是否四方向可炸;如果是将其改成true。\n\tif (bombFourDirections) {\n\t\t// 四方向炸\n\t\tfor (var direction in core.utils.scan) {\n\t\t\tvar delta = core.utils.scan[direction];\n\t\t\tvar nx = core.getHeroLoc('x') + delta.x,\n\t\t\t\tny = core.getHeroLoc('y') + delta.y;\n\t\t\tif (canBomb(nx, ny)) {\n\t\t\t\tbombList.push([nx, ny]);\n\t\t\t\tcore.removeBlock(nx, ny);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// 仅炸当前\n\t\tif (canBomb(core.nextX(), core.nextY())) {\n\t\t\tbombList.push([core.nextX(), core.nextY()]);\n\t\t\tcore.removeBlock(core.nextX(), core.nextY());\n\t\t}\n\t}\n\n\tif (bombList.length > 0) {\n\t\tcore.playSound('bomb.mp3');\n\t\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\t} else {\n\t\tcore.drawTip('当前无法使用' + core.material.items[itemId].name);\n\t\tcore.addItem(itemId, 1);\n\t\treturn;\n\t}\n\n\t// 炸弹后事件\n\t// 这是一个使用炸弹也能开门的例子\n\t/*\n\tif (core.status.floorId=='xxx' && core.terrainExists(x0,y0,'specialDoor') // 某个楼层,该机关门存在\n\t\t&& !core.enemyExists(x1,y1) && !core.enemyExists(x2,y2)) // 且守门的怪物都不存在\n\t{\n\t\tcore.insertAction([ // 插入事件\n\t\t\t{\"type\": \"openDoor\", \"loc\": [x0,y0]} // 开门\n\t\t])\n\t}\n\t*/\n})();", + "useItemEffect": "(function () {\n\tvar canBomb = function (x, y) {\n\t\tvar block = core.getBlock(x, y);\n\t\tif (block == null || block.disable || block.event.cls.indexOf('enemy') != 0) return false;\n\t\tvar enemy = core.material.enemys[block.event.id];\n\t\treturn enemy && !enemy.notBomb;\n\t};\n\n\tvar bombList = []; // 炸掉的怪物坐标列表\n\tvar bombFourDirections = false; // 是否四方向可炸;如果是将其改成true。\n\tif (bombFourDirections) {\n\t\t// 四方向炸\n\t\tfor (var direction in core.utils.scan) {\n\t\t\tvar delta = core.utils.scan[direction];\n\t\t\tvar nx = core.getHeroLoc('x') + delta.x,\n\t\t\t\tny = core.getHeroLoc('y') + delta.y;\n\t\t\tif (canBomb(nx, ny)) {\n\t\t\t\tbombList.push([nx, ny]);\n\t\t\t\tcore.removeBlock(nx, ny);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// 仅炸当前\n\t\tif (canBomb(core.nextX(), core.nextY())) {\n\t\t\tbombList.push([core.nextX(), core.nextY()]);\n\t\t\tcore.removeBlock(core.nextX(), core.nextY());\n\t\t}\n\t}\n\n\tif (bombList.length > 0) {\n\t\tcore.playSound('炸弹');\n\t\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\t} else {\n\t\tcore.playSound('操作失败');\n\t\tcore.drawTip('当前无法使用' + core.material.items[itemId].name);\n\t\tcore.addItem(itemId, 1);\n\t\treturn;\n\t}\n\n\t// 炸弹后事件\n\t// 这是一个使用炸弹也能开门的例子\n\t/*\n\tif (core.status.floorId=='xxx' && core.terrainExists(x0,y0,'specialDoor') // 某个楼层,该机关门存在\n\t\t&& !core.enemyExists(x1,y1) && !core.enemyExists(x2,y2)) // 且守门的怪物都不存在\n\t{\n\t\tcore.insertAction([ // 插入事件\n\t\t\t{\"type\": \"openDoor\", \"loc\": [x0,y0]} // 开门\n\t\t])\n\t}\n\t*/\n})();", "canUseItemEffect": "true" }, "centerFly": { @@ -416,7 +416,7 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "tools", "name": "地震卷轴", "text": "可以破坏当前层的所有墙", - "useItemEffect": "(function () {\n\tvar indexes = [];\n\tfor (var index in core.status.thisMap.blocks) {\n\t\tvar block = core.status.thisMap.blocks[index];\n\t\tif (!block.disable && block.event.canBreak) {\n\t\t\tindexes.push(index);\n\t\t}\n\t}\n\tcore.removeBlockByIndexes(indexes);\n\tcore.drawMap();\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n})();", + "useItemEffect": "(function () {\n\tvar indexes = [];\n\tfor (var index in core.status.thisMap.blocks) {\n\t\tvar block = core.status.thisMap.blocks[index];\n\t\tif (!block.disable && block.event.canBreak) {\n\t\t\tindexes.push(index);\n\t\t}\n\t}\n\tcore.removeBlockByIndexes(indexes);\n\tcore.drawMap();\n\tcore.playSound('打开界面');\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n})();", "canUseItemEffect": "(function () {\n\treturn core.status.thisMap.blocks.filter(function (block) {\n\t\treturn !block.disable && block.event.canBreak;\n\t}).length > 0;\n})();" }, "poisonWine": { @@ -465,6 +465,10 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "type": "function", "function": "function(){\ncore.addItem('lifeWand', 1);\n}" }, + { + "type": "playSound", + "name": "打开界面" + }, { "type": "input", "text": "请输入生命魔杖使用次数:(0-${item:lifeWand})" @@ -485,9 +489,17 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "operator": "+=", "value": "flag:input*100" }, + { + "type": "playSound", + "name": "回血" + }, "成功使用${flag:input}次生命魔杖,恢复${flag:input*100}点生命。" ], "false": [ + { + "type": "playSound", + "name": "操作失败" + }, "输入不合法!" ] } @@ -498,7 +510,7 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "tools", "name": "跳跃靴", "text": "能跳跃到前方两格处", - "useItemEffect": "core.playSound(\"jump.mp3\"); core.insertAction({ \"type\": \"jumpHero\", \"loc\": [core.nextX(2), core.nextY(2)] });", + "useItemEffect": "core.playSound(\"跳跃\");\ncore.insertAction({ \"type\": \"jumpHero\", \"loc\": [core.nextX(2), core.nextY(2)] });", "canUseItemEffect": "(function () {\n\tvar nx = core.nextX(2),\n\t\tny = core.nextY(2);\n\treturn nx >= 0 && nx < core.bigmap.width && ny >= 0 && ny < core.bigmap.height && core.getBlockId(nx, ny) == null;\n})();" }, "skill1": { @@ -506,7 +518,7 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "name": "技能:二倍斩", "text": "可以打开或关闭主动技能二倍斩", "hideInReplay": true, - "useItemEffect": "(function () {\n\tvar skillValue = 1; // 技能的flag:skill值,可用于当前开启技能的判定;对于新技能可以依次改成2,3等等\n\tvar skillNeed = 5; // 技能的需求\n\tvar skillName = '二倍斩'; // 技能的名称\n\n\tif (core.getFlag('skill', 0) != skillValue) { // 判断当前是否已经开了技能\n\t\tif (core.getStatus('mana') >= skillNeed) { // 这里要写当前能否开技能的条件判断,比如魔力值至少要多少\n\t\t\tcore.setFlag('skill', skillValue); // 开技能1\n\t\t\tcore.setFlag('skillName', skillName); // 设置技能名\n\t\t} else {\n\t\t\tcore.drawTip('魔力不足,无法开启技能');\n\t\t}\n\t} else { // 关闭技能\n\t\tcore.setFlag('skill', 0); // 关闭技能状态\n\t\tcore.setFlag('skillName', '无');\n\t}\n})();", + "useItemEffect": "(function () {\n\tvar skillValue = 1; // 技能的flag:skill值,可用于当前开启技能的判定;对于新技能可以依次改成2,3等等\n\tvar skillNeed = 5; // 技能的需求\n\tvar skillName = '二倍斩'; // 技能的名称\n\n\tif (core.getFlag('skill', 0) != skillValue) { // 判断当前是否已经开了技能\n\t\tif (core.getStatus('mana') >= skillNeed) { // 这里要写当前能否开技能的条件判断,比如魔力值至少要多少\n\t\t\tcore.playSound('打开界面');\n\t\t\tcore.setFlag('skill', skillValue); // 开技能1\n\t\t\tcore.setFlag('skillName', skillName); // 设置技能名\n\t\t} else {\n\t\t\tcore.playSound('操作失败');\n\t\t\tcore.drawTip('魔力不足,无法开启技能');\n\t\t}\n\t} else { // 关闭技能\n\t\tcore.setFlag('skill', 0); // 关闭技能状态\n\t\tcore.setFlag('skillName', '无');\n\t}\n})();", "canUseItemEffect": "true" }, "wand": { diff --git a/project/plugins.js b/project/plugins.js index 68c610bc..db0e75c2 100644 --- a/project/plugins.js +++ b/project/plugins.js @@ -108,6 +108,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = if (core.openItemShop) { core.openItemShop(shopId); } else { + core.playSound('操作失败'); core.insertAction("道具商店插件不存在!请检查是否存在该插件!"); } return; @@ -145,6 +146,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = "condition": shop.disablePreview, "true": [ // 不可预览,提示并退出 + { "type": "playSound", "name": "操作失败" }, "当前无法访问该商店!", { "type": "break" }, ], @@ -173,7 +175,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = "text": choice.text, "icon": choice.icon, "color": ableToBuy && !previewMode ? choice.color : [153, 153, 153, 1], - "action": ableToBuy && !previewMode ? choice.action : [ + "action": ableToBuy && !previewMode ? [{ "type": "playSound", "name": "确定" }].concat(choice.action) : [ + { "type": "playSound", "name": "操作失败" }, { "type": "tip", "text": previewMode ? "预览模式下不可购买" : "购买条件不足" } ] }; @@ -636,11 +639,14 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = if (type == 0) { core.status.hero[use] -= totalMoney; core.getItem(item.id, selectCount); + core.stopSound(); + core.playSound('确定'); if (item.number != null) item.number -= selectCount; item.money_count = (item.money_count || 0) + selectCount; } else { core.status.hero[use] += totalMoney; core.removeItem(item.id, selectCount); + core.playSound('确定'); core.drawTip("成功卖出" + selectCount + "个" + core.material.items[item.id].name, item.id); if (item.number != null) item.number += selectCount; item.sell_count = (item.sell_count || 0) + selectCount; diff --git a/project/sounds/cancel.mp3 b/project/sounds/cancel.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f08449ed434f0750dd10214bed889c4e02069bc3 GIT binary patch literal 6627 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 PNG>G&n_d6^e(b*hurxwd literal 0 HcmV?d00001 diff --git a/project/sounds/confirm.mp3 b/project/sounds/confirm.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..138beeb74cd83963999c0e3e9eafbcde022ead40 GIT binary patch literal 2760 zcmdUwX;f3k9>C`&5E9lv1;U~RTS$ZFgjFJCDhtUK;y%<<2 za8cl=AWTVuf-D8+m3*b3RlyHRCKW&hXfX1a_sL^+bUqQKXuaj>F&*bXhA2|T4oCb;DcB?+8*5Xo$ex5U-HKqIlV~4`UQbQs~Qi* zm)v*n+8;9hoEx1PRhU>m!0InUj8m^muISbqmSZ=ihqm7CTcW{nx0+oGbxHg!vTetm9SSb$m=?4g5 z>Z%tjK0uy12LS*or%ZG@dTUNvnm+^~&cQq#Hqyol72#I|wOzKXD*tUkJ9&FEtxV(c z-GNT`A*_qI{D{Yok&zq%Bfh=-r#(*hdlQq72@GCct8vKo&Zoy?Fv@l)5qUswsPpM?Kw63+)4$U8| z+6x0OJe6T%zvIf6YQ1*na>cSKG1C;_9_1jA$Qv^bOwZanLLPFB51VtUFphh#kQ4BF zgZ|++v^a#FPNY{aH=T*|- zz?8RqzB|%b?!V0ofMp_EH9AhTrp$zHfenl*)9$3yUM{vgifnJidffzXZ* zediyi5K_xI{(dfLPM)mawj3!uOsyees>e2)Bjr5|5LxZ!e_wHo|KM3!Na(lGM?aK+ z2~CH=pm!-ytfiHmoB@Zca5z2sN&#-ts^5!1c<+TV?q0{ldhV5kAgaUjSns7*l9|*K z-%EZ{)2k7X+sWdBYsGLmPBlA)!9V~euLUWztB9yJoO`^kt`f%?cQGTluq<~Z?y{KU z*S};9Xp~s1+XeRC3a45iD&z{LADHg zculyLR+#uz-wUD-FtRs z%JoDZdfA^Ju}e1tHbw8(PPqQag0ho>pS3Mv4_vwl>G^=aG{kMT#yGpxeY#RlB?P~X z^b}F~tc4l6B12?6Qq9~#WZ0+EB}p{hN=WON zia2_ttTCWED@lL>(#S0zw+VY!m3;dd?AjvM$*BL&919c3&ZZiJ>o_o*!H&_&x_3X@ z^VVSx4W{PtysyJ?{Zq+rW@+=s%9(5*%M_cvaEZW}##A4yWRdX5=yAygp{4~Pwe>>z zMXsZLc-G)Zs^`8Ml|d7tR(rzD_86OkwPV&FE~Y`q5R{o0Ak{$Na&jLV6$%2=i&VdH zO{|?SF}S!miV7uy=^Iqe{?c8h$}EcJP5+L8 zUr!+uEz~d=|CapI?kfzJ`(##L5YAgi2rU2)N8RW9wy2?1;)j%Yd!*a`?BkPE-~Gvw zzILzQY@u`=$I1P^uN%vQvXM&N=veiKp<_!0U}e{9QDFlp=)^FX9$!e=E1J76y<}=; zY!hD>Wu98YVzdP^tx+Ly`m~g~wdqLo3WX5Pba=H7SYj(O#PxO)4ys4)|nRR);z!;RSL=PR{0$b$bUzn FUje0906YKy literal 0 HcmV?d00001 diff --git a/project/sounds/cursor.mp3 b/project/sounds/cursor.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..dc3a7219fd0f3360c6c66e1d395528ea65de4375 GIT binary patch literal 1506 zcmeZtF=l1}0p*b3U{@f`55zu+Wof1sdPbIdh6V;8NhtXLI{?PSNqgp{7dIN)%Gq2hkRxd#gG zck|4xc~Q}K<)go0(p!%URu5L#{*zA3|6jD`PvZNYf>(CB&YPzC7Y3bLx5LTeY*n{x z@5{eGN)}(b`{es7Yet2KhZqgdIZffz&srh>>mx_e7jymChl@69NL>?ns&e~(#yjKo z|G$G$_!>UdDc<%^ZD0ZU=K;_^4pZYqr#FE7)6~Gg!fq%Vc|bJoe z-1{>7-e+TD^ZjS7GktUH6nL808GqCje?7>~JmJ^OTd_-Zn8Q;vg%+$?Dt_#0pYif4 zspYj%ZxXfIJ-83130%B1PxnNyl+3!`8CusRMbBp(IlF6bb^F%qTi5>o|EFs2-MH&w z+dlm=m?EkpGf(JmGQW0nFU+{_zr<(ta*YWVjxLL({!E>!&gf&l z@!-3_zgw2^t$nNa2IL`$hEEcbw_mnp1CuJR0xrYk8L3nY2TcUvYdTgMqBo>h=shIVDw&5b<@6Yx^Gys1lgx`|w*h9xAnt3US zHiV=F3O1<-g#>-E*dX{d;#(S*`q|Jr`GvhNShP8NY-Ft#A6)Q;g;h{)-?N{pjGP9u zxI?8f-H$$w<;u9!t#jncMB$c3E}hfNZOVUj&Hq3B8<4eBluApWUA@8^M?ALwHxpU{aG0o^{K0W}zlmc_u zVD+F)^1uoJChi+KSKGF65CG7Qrp?VEnP^vDK%)!j1^`YwNHaze?+5^_4gjkPzvWU++Zm&qhKYO{hlCd;VnoVU;r86g zh1n*|sKBxI9cY4+#XMbDgc zz!t|WDxb^Qq**%1T8qeso-oq>;ZJ!yZP`3rbL%cjzT24W0} zFD53~9Aid(_Rs1;T=}dYXgz6^Zs%V!%@II-kzTtCK z%@`v@&G}Xb76Qy2;wn5S9rukcq>rPJ&E^9>>XvlnOArwGSQ}tMok}P5fIjfW}%Xo(z2z6A!fI+^B_6OtQ>Fqx9g3>U54fsS@ zBH3l}b0pf0oxeY(ADq+5^W9zm7xR}QrjyV`% zKfyz+bGW@+ha+Jwn4aN2xA=Gx<`;N^2PB{^NTYQ1I zQ>`N^Aw6Dt`Ms;(rl8mA$Xoc8} z0Z2Rb!UAq}1e`_aHVd4WaNfjpHEzK@D!LkTZ8X3$MI#lkU#mV6oqGgI9bdYHnRPa* zs_ht@XL4xHj)<0yx3#YbN|dY_^BA=i7aPnyEMm1IB%luxwLc6A3=K;}N4+?mXFYuL zp=ZQ~lB^C8CE`qG7c@7F6z4>@BsVZal~rWz&tc{|OGEuWsw8?M+e)Q&bk98q_SmKi z72qgaM@|&p*NI{z)I1eAK(Js4HGyxks&l?YT>GOT>F@-xOA&N6!{;@mM)-hW z+lpmZ$8)xA(061048O1;*X=%r!n6MvIM3-QKHP^@hjVI%a41169Js87d6CHpoZ8DN zb&=KD@8#s5X#O^LQf=GPWztEnD!Xo&WV5VQnfQZuDsi~QM!iHM2bY0S_C; z^H>xh03b%$;=0_@%Q?5()wmXI;1hJAJ{+ab?85?C?B{_HNF5uoLh!{M2ywMw=Zi8k zN_v!tMC-W$^yO>Zo?jJOt&NkuMH-|yk0j|dYgtXEy8NMZw(hJ~?KuQkf7~oo4)0I< zud&xl^y~kvZd(l7^UD?xh)wNw@lYT;U@{au5{l3t6M_PrTZyi2+19DOW`4hy_Qp2A zK(~U|FUG%!MAv?|;eMI0#H+VpN|lb25K_O_NC}W}NmMRJNh!!+N>joGwEI%@J2C6f zM;lh@&;XrRi#l|n5gY|2JoAkV{lE|++z(y`J28&!tXtG?+9f`L-OIsL>iC525U)ap ztH7`=%FbL%)xbbir|LfhU1$zRaWk2|8ZAUT5aR6q>as#`uslfUKUD6&mqHg>#Zm4n bz1kuxQW)P5u2_JBaF%f>{QD~Zp*Q{k?zjhA literal 8508 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 KSyca@ME?bSvfQQs diff --git a/project/sounds/error.mp3 b/project/sounds/error.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..329cca458198a0686ad1af9016a124b7b36c5374 GIT binary patch literal 3178 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 literal 0 HcmV?d00001 diff --git a/project/sounds/load.mp3 b/project/sounds/load.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..e680f4d323fa3bb35b144446a38da40a06d471fe GIT binary patch literal 2551 zcmdUx`BM|w7JzRcKtjT15LpEz0a<1B0TUt70OH7^35yaGNQgp27M0DxbO^>g9FYM5 zWibdUpeW$Z=$Np%pr{C_13u&-C@A_Q>Ok0f5-a)f{Q>h;b)DONySmO-=bXA7NO4mI za;#`ns-Go&{S+*(v3#>V7ULp)MQFx<6!RJRAl0+!ckx<2YY<5r!w# z?D88}z!hIv09@jGNu08Q^{o6BN#Mb0gEbDVE8+RAOl@fTlgluNSgkGhk!6d*K05He zdW)yb2Lb@8p`%~BotzP{Vv9-7Pru`ce$O+CBdl)>NYXfP?KZWatUBxp!EXe7A!4Q| z{B_>iGS~WD_V)Y6jF9^r%^uEHRqWsU;&vpT-84a?Vf4CM%)8eG(;b-siyY}XYfYE9 zv*i>3RH*wARmCv;%64dh9*^p2gecj^tPVVYN6^(oJKB>iD8^fKSiNUulhP56e@ z8L@&hYOjo^3DSZWLRWbBu+=*p}2?Til`9gO3j1aaQ^H3W;kV!V$79p&7i z?us0MK zKO@NkjNz|n0sr49;$&8pzz+HAKFz^0O(C_Z;c9eVip~}MFPWnOhw{^C&jSPIgw@aT zGTUCl!4)^ZnslqSIY<&BK6YyvhqZVQ4T_VXshg?Mm!G85F(`Wu^&XqDBWQ^=c3Fk<(9HY=>Ibz$b`xFueHtO=;d?fqBSy;$b&S zt1#EKfz1}nQ9HES+zCgB?;DImKN6VGs!VkLVeFYR<*AfQ2DM9sgo+ zUBb1TKJ4SXqVqUO}_aS)y;`Hd4nIZ4geGYJV(|jwfrjxe@ z6$40{#4CNkhs<8NkOL%PxI|A3CMtzAD7%v1p}&X~6*@ylJYwELrf$Kim*WbavcC|g z&)*gKlbBnVUbkZUvSVgo;+<{7;$&F+(C6-?8q+k$YA@G=e6(f*Dz58sBsUH>xKiY^ z&|yg%I9&Ok^z9enMc#SgyT2M}wlTwWh_3wOMvY!4D~ zsB%ARWG-gRgrGuUs0gR(;w}W;UYk9?3c8Dd1gEP8)*Nr_K=C(hFJtJ!1)jR*s0g`` zFEl-6OlPlV(3C9~8kTVhAE>Jkns{d9G(T#Z3-ULd*mQ=4vn=6WJ)!AhYc`*IlD%vd z_Ksh_dUl@G_Ltw+MW!rQqto6tk_|Z0@%6%*!gKS4(?ErW#WdI-{=W0zO$kthP`TYpAJ+@TSeXO$NH^1`6 z=z_+iV}Zv90*@WQVk3#&_kvFsIYxhu*W64F@^f?Y@^bRHAQuV;(@(I`lT$9H3L$m6 pBjfBje6vDGdA|Q6qFg9lXS%{9pp9=_tq_tOMY4YbVDV2B`Wtm?dt?9r literal 0 HcmV?d00001 diff --git a/project/sounds/open_ui.mp3 b/project/sounds/open_ui.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c648d526706f4f8091f7a40b3b3e820f19411228 GIT binary patch literal 9448 zcmdVgcQjmG|0wV?3`XxFN(_bs(M4y5=)Fgj=n^e@5+2Oxok5D;MUNJdBGHMOC=n8( zcS43>l$p!(^8W50_x^wHS&MUKX02KKbG~Kov(Z!$Cj`z9ZWCi;)w478*^iFhBj;Pv zLSiyPq9P*aA6^{zV}r}f|La-vp|j`Nhv#2&698Zz0CI9#S|%noHa0G<>(>PZ#l^*? zr4~(Lb!YFfFOEb*zSNFSp&F zVVH97(!%hLa3af8BTGh;Z1o0yd!}^}jW*y1B-SOVA|LjKSdaTk&UB2#6mQ8t=RlF* zkBuCuQJ55An{C@!@VRFe0FkvGgqFrWL7#cfP+&skVS_0@(!@v*?dR_z9buX=%WvQ| zt9>D9gZlXQv8ZxqtA4WX&xgBCOc=fSh0yCwz0-E0%7!;y0CbyGais(OFCQ_!$@%CM zpKfViwez5}}ej?=ujRLFN36xq6B;B`ZJ_pgF zF#bZb#}xc~=b*E2k(G@is|58gLEjzcV3fGmwfH}wv&qhTzuwp&u|Mcd-j-EJbxR%K z+uJ_j=VKHJ*}Oh9f5dUy0}L^G5%w=rdTb_$JJk%Pz2gbuas-$LTy4Z`@xLbC`ghV$ zM!X2lQZYxnrI+pLtK?M%TfQs*k#o|GmvswRVVjF#jEkz`7mbWgrDc&c*&dx4vx-Tj zSK5*MN3NI=yKkR^m;lTi{Fj@sk>3S~ z6g?BLQe5785g`uv{nBxVDDZT1eLP)q?lGF?3U5h*#4{x+F$eue^6zStK?}RL%`!Ys z6_~TA8~PNjV&cUC0+AbpcmMc=04PPjcD4+!hL2|TaD_k7Xj96U~ zhJ3E_W=wM4{+5)Bh_9MVT+CbW{&Y2L@7{*rIfxm+Oln&FL+yGQA#x(h(9+^RXU*c@ zl>3`VcQZg^aJwZFI@va%T>iYK(&lcvoxh&ZQLla;t{kn+gMZnC&+){D+hEkpmEF^% zsokAcMZhO7ZqW4-?92}p*gC#{JImN9k&_eqNv00Bds5FO?gu?f@z0V#Zx!7&hLCJS z{D#e#(`)*pz?G-zo~twXw}&!vcovm9B-S#JKd&{;9d#ErOaIg3mcGX@V(dr6EhVwZ zCv7Y`NB-}YdVFVO#+NBNO#V3sF`zIH74NMr8%tb9sQCB{R7rCIO460UaYaX*Y9_Ik z%UPFgPiD8(SFmHkNuJ@C>#xo1MuctS3*F-RUMp#owCO(;HKf4bxI*5$5XBTGV^{Ch znxM}`q9EZY=fvU5g0Ai8CT;B5qpJ0+GO&Hge_i}jgk1hOa+%^Y{`Riuhn5}m2mJSz zkx3W;A@VZI65&>K862wA2xnT5_;Ag|^fAb=fv9)#K}}>U)rj-tSV;aqxW_ACMUJ z$BL`}58rE*g$Nj`xk~)gG6IqeL_mY&45*HH8`2j!@FFOc8|2?0TMugy8C&ZV*W;)$ z3W0bO72v6U3*(KnAKUz!R8(>Eocd*!yd2X(L!T#q(#j8`Az zv;E#SQ`O3S&v`E|>-1~&j4}Q+(A271J7h81h&^JURV56fA8N_GBz)uHv-^~>@#i36 z6vjwn4!a<)a@iD=c#tc#rC%>Vtnw$_sgp&O$b|>*@A`Ww-n&EQz^Czh6JbnI?ksq8 z6_@(l43E#^2j*tiNfNG0qVf&|bk<$8qWnD%MNL`W5D?M=G_^{YdC#;4Y#X%sc0!XI zU5h4P$UX74TuW`*ESqnPDw%Gn^^u?gFsU*s4^2s?{t;{)xUc%F#wnP=pEr4<0;FM$ zD3ZS3)hI*b%ZVT84_T~UBA|ujgMfS@;@(oJ{@=Oe8Y=}F=O8H*rdQG8&!Go!0V3}_ zcH3lpdl{j^pVm*?-n=6p`s?=O@rx>H^yc>dY;4m9#JXYd=QKBQDHNA9v0Q%8y9{-m zY@dCT)l%6!Z0rKcE;WXsM3ZMADsARypxZc*5otvB07VDc5w0im{-oXiP5??hs`*h) zRXwJ_pcJMdrc0NYP|~#&U%mp;%!%O~UTNzV@cS#wEh#H?@3sA-yi*ehB`~R)b?r z%4Eyd#*bx1KFfFT(?PoKn24ycNHDy*`sE!a&9N6x2U1A%czv)X?jC)bhbd$Aw(ms9 z5=YR1)j>z!7gTty{u7};3lcT~JZy`XHROnl?5QKGy+}E&VlgN6jnA8RRXk1)6{2Kr zWf{am0D!3VcKxhJZqGkri5mV-w-*Y1M|U^Eis+~$O0f4~djT=uX@2e*Ly1XgRts4{F?N^U)&M_UtYWD!JJx>sL{RfL1Y2B@bE1m z=a>h&ZnhabMDL8ls_?LCjfOa(F+X{UR|YD|&{6v*RD+B!w97@<$*())x*YGh9i@@9 z-@>+hqm4T@5T~yQx+lX*Nly7CDB=qL;j>s@xp@Ayaa!Zs1YpDta1JsDFv;?k#}u+& zmrdcp&+wiC-JOdFeGU9YPK&r7UN%b5O=HREb*OSu^YUwBZU)v?10CTIOm)+)uOod` z)z6hXa1vj9BRW_X3_RXxy~}CK!aMhQAf^+%=tYqUl|Xq8I?;w~=#y8)>CW|V2zXzu zrfT}ZoA@ko_?^hYi=*cUrsIb!9$g;ReNiKcQB}wa$S?Dl(|H6OhA&*td@doO3^hqK zkW6j!j<$ffzGk6giXL^?6$)MAfP`T)G^YMOhn|BhQ5Z1^>i}Ll+shi#7!F>^q5FCP zvL-K6MH_x<@fpUvNpv3ijxRM1BzXtdn$qt>7N~+jH&RzCxM`$oeH=~v%x}_ZYX%gn z`POVc8WmqrsO3^C`yBi!PLNCEPZ?2vV31dEO5=vh;GH6?Tu>NNiL#Li2R_-+meydh{I?PrPTCM6i9Wt-;noPKW{NQ0aW}uQ20HLH1aA?!&fi|GQI^A_C`-7yyv=& zY5N#8yOGvHdVPYrxFQFI@H2{Ak30|FGkxE29?H05Vy@Q0Z)3sUZ)Tj z^=E#zva)}stqZw9;_=Y;1`Ae`h|Oq7HQ9SyCfmPp`D zV#n6{v#Uf1RJ!>fJKuIGV#VhO%=MH#>0!P%Pw_zwNIxUl7)d6HH~an1Dl!I-XW?$D z3ZGv3tkH=E420wA(&Oft1S(;#hh&!>Os?(Ca}K4H6wUTQZ-hLXP51|_bGr=l=|QTc zX=zXqtLh?~z%#5M3ATr*C(`Zf+ z=|Qd~`Q0pj91dqyJ2 zSJXm%Hl}Cg0-fk}O-qAye~nEpwz#okQ|I5~}MD!<{|~c{V-Q={VI= z9}rZ5!z-P1p))7DpsyY}s=#>h9NQaV!LO8H0Zu zk6|iYuoC7$(ynt*9SSq3@O|yjgW&>1j=(xBD;Qlaedaoe5F&Jg;r(jqMzDU(Z}+ON z(@VmySLXgsS}vF`rHxm>rvN^xi7c<(*7tfyB2{R*ceSXpe%6V}ar|jH1ds#|XaMLH z5(ux@Z~`}Ns(4EA-(vc8lvvy@g_J~a97{WN#A;r_&F#Ub{CB#ZAxCZ;qAf+AVi4&> z?DxX!QR2QqnPgF57#B?{uMS)l;yNK2JDiyzO3*x|u5CX{dBvo!|2w|{^RH)xr6cE{ zR{*9>);wTM;jFFwr-s}=-tQ?exU3-p$Hdww-$Ry3qTykmb5K1BV*s(LfJI{QFm_UV?5F4cxgmKY6%-449#M^_iRx4^21 z*CG4)M`g8d%`akcwraQOsJ%c zlkn^5dy(~Iz;E8`Vl=7`cHk!u%E{-%dP&LJM6-?1G9o#OMZ3agX;v!*GH9s2f7brP zICdqZ(IP8cCn?gTbjbN%P#C6G@lL?}L+B-lVbuD6+x5BA`!`r?YnB9$Sw@C2b3ToT zi6A&z9pLlH$cPd;uacWT>f`xJsof3l+7nJ6af;e^`lag8iev7J@URLm?F(Hx`Vu04 zaHqw0GyZ*2#G-X3wo@V4shPdB_ayA7g1iaDLkmE?PQCbuG9*pdo$X~XD$OtUd7@YS z+$9^n9|kyMi~X%Lzo*5znNP{k#v>WSB9D?-aJnRYH@i2m##EI2OkA=yhnT6yw@*e zp0MH$Q0sHdT<4%M6edw|+QJxWjlLic2H^h{2{MdFH)5Bj{THN~+u9dX2q-{u_}A&ut@0Js4kVjZSqAWS!i z@5nwzX5TOmR`2VU_+ZBUv#B`6pSi6skQ|NWCw8S!r|)pwWU?ZaH1C>O7lmC-V|V1a z>40W9q5$(z6d?1lOZkM#Lqgm%o&&_&c;zwsXYX>!L5DSnox3!d&l^tM&p}fljIQGMvt6IdrT|eHwR5I4LSKMTm23x6N-E3M#f$moyk;U2 zc4S_-$)bIOj&wTF@%t@>%#-WLzjY|?STTNaUXC>?j=vaXPTd)Mpj@2W2ms$kz;Wnb zEUL5+b+I-W)p}mY`+rED6bFwV?+D#Ab8k4r^B8}BpTIxpG+%F(@X)2mT2nIbt{-ww z55?pi{{AzKhU0IjQYuU1os;pCss1Ob2pT8~Adbc*PjJK+dC4%|-z{$7{8TK%x@!6F z6YC}lgOo50Sd*Q-YzpXU)0Gm#v)e6!I$I#+<9>8z;|6B~yba$_EjJo4ON!lg(6taf zu_#8^jIF7SMZ;(Kd69oaujS9)domt|Lb&{Syt=mff_1 zMG9%Jhur=W{&kjza`+FR;g08ZLE4>9&}OQJ`e=-OTM}K5xy1M zn|Iyx$Mn~SU5Z!edf__;*FJ@x{6>mBLe9hSCvp{M&%5FvUJ%bJ9KmswNT#8VZdlSa z$&16ee%x>m?;K`4c3nsDS-sp0CHlFWKm$jAXwW3N>sn1Y`yC(>v!L}+Dn52?gc?-D)w^|H?`2)0nB>d=b#k;)2L_?uyXIRhRE`< znmxt)m!QLazt|w&=)2~xI6A9G>}2C|DdV#v>*+OpN!3m(=-=U3yl8cqcXfb z@c9otkv!TEaB=0S9_a@x8KIr_*$rJ87gh~o0Z6`*&G(Xu43Y`tJv)&-;mi0EAowCb zFv@vs!py0{M?c<-xB)BtoM%8dVl!Z4p?jNB;xJF$`{ax3*@TU~+}39bo7M2@^& zF@4myC==iMwCP3l5lLBpbhtT;dtpBLIemv;v9dG(nLWxxIE=cekxKBS#I5uW|RH`QA!u|7G+B_ z&GDglKRG0BQES6jGm7nSwjf(s(!>?VMHx2iR}s}k1ltoFh^gQQIPlqCBq$y+FhEB^ zxcbB>7tCFI4q8BAd^AP_bd0<%Q?9J%c8r2c>qW}#I}*SnEIJ-TCp)=*zRADl;I|c! zrSYOfKFdptwR%9_|stX&@VfSVQ)=n836zgsfgmZ%C&P$LnvHz zWyykfJFV)t;~PJFjs1~SE_lw-hN{iyDak~&`9cEPHg#AiIpfW<`x1;&hDXFUJ?&qz z)i)&U|H*TG?uDSMX~7pxUTdWyMS)&%iV-KE_Ei7saotp~_hC97`0!Y?sGpZe#`YYv zNPsy|{A#c7`d^Sa7T&8+c?s$vf4eSET2fbRW^1K+@9~dk$s0cldUC{~Lcgk~mim%| zb(J8|Dy^ICM=hP5)QU51g+pv?v|z7nZP>;_SM!5=qZ7$D0CzBuuXGx{^Q88QcLMIv z$~5%#fLH&E4~4p{jgu5Ut)qnRl}!G5n;!FmWC6QET$;1<&HG#wc_p5r*gy}%&?g+2fq0t*6>`=xR1@21Ob$$5~6Zh@oysJg{%{AHmhLAl5 zTm*8UXIUP7dlf&=L7QQi`%;5#`v0>p*NPSA`=1&zY-f%Rtp&v7f8w0o5iH=>dNZ!q z<3jwVc5)!2mgBlGiR={k_>}{nSBtI;45UzGJU+f49Aqc|>iUq5MoD!ipjT|HnB>@f z+P2K7Loilj1nSByj>@lcv_xnSBo=1<2quW&rq`1`_+St*DqDwm!0ovVu~9zNU?#Dp zUM2(+KS@hoNREoivu^fflBt&Q({hgE37kEWrd@f0H_eJG#4Rz>gWuK-4PTu(2mJ}% zl~UAdmzLeRoLFtKqP!pfTSH!+I0KS)p!8Ltr9=DDPiHQWok`1|6z+NH=W=2O>W3_X zxXu_#QCE&O?4u zD3o8OT%hdddzScj(Lq*yn^p=7SVQ<9vX>9ViVa(8s`5bD@;7S#j>l(EwTYiTXQ`#m zr{DQV0sW+#u_hSbYc%Sf`AYZ}-97imS&o7Qzx!a0+z`t3))EgWQya4#S-qxQ8hJ(L z%{2TfF^Wg)qw+E*O>?8QL!=Q+p?CK%2`A3Nc;|-vwfLM%kr*+D}U1$#kK__)lc?+LrXh3d394N z5%`fi8Bq}st@jD$=O9cprd{eY=xx01%oy(I;lJT@& z`W)zWQ>3-0GPEKp-L=9j!}PW;e}!32MTz8(kEQqsf)ncXE80(Q4qRnmq6R4!c2_b` zEApR%wyAgdrBw(53jbR}j)N4W^G27TDHB8HO8vns&CPl{iZ~@c+A`|38fE-x`Y9HRf+d_jX2IfCvW&CR)K~3HbjZ G=zjsYuOxK< literal 0 HcmV?d00001 diff --git a/project/sounds/recovery.mp3 b/project/sounds/recovery.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a4bb6176f3c8cc577caed842e67c9e0176f2fff7 GIT binary patch literal 7567 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 RSIXg-yQ|d~O#fdB{TCK3d5Zu5 literal 0 HcmV?d00001 diff --git a/project/sounds/shop.mp3 b/project/sounds/shop.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..905ae3df7e9882bfd909999ebbc6a39bdd684bc0 GIT binary patch literal 21568 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 vgll&3_X3#!!2h@Z|M~U~P`~K