diff --git a/README.md b/README.md index 0c0e3496..e91b1e25 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,6 @@ HTML5 canvas制作的魔塔样板,支持全平台游戏! * [x] 添加了清怪检测,败移,追猎,重开杖的默认实现 * [x] 添加了若干常用插件 * [x] 美化了设置界面,在设置中添加了上述自动拾取,数据显示等功能的开关 -* [ ] todolist:安装样板编辑器升级,分块加载 ### 2022.7.10 HTML5魔塔样板V2.9.1 diff --git a/project/functions.js b/project/functions.js index 11decb3c..6ebf53ee 100644 --- a/project/functions.js +++ b/project/functions.js @@ -851,138 +851,167 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = }, "actions": { "onKeyUp": function (keyCode, altKey) { - // 键盘按键处理,可以在这里自定义快捷键列表 - // keyCode:当前按键的keyCode(每个键的keyCode自行百度) - // altKey:Alt键是否被按下,为true代表同时按下了Alt键 - // 可以在这里任意增加或编辑每个按键的行为 + // 键盘按键处理,可以在这里自定义快捷键列表 + // keyCode:当前按键的keyCode(每个键的keyCode自行百度) + // altKey:Alt键是否被按下,为true代表同时按下了Alt键 + // 可以在这里任意增加或编辑每个按键的行为 - // 如果处于正在行走状态,则不处理 - if (core.isMoving()) return; + // 如果处于正在行走状态,则不处理 + if (core.isMoving()) return; - // 商店长按时忽略 - if (core.status.onShopLongDown) return core.status.onShopLongDown = false; + // 商店长按时忽略 + if (core.status.onShopLongDown) return core.status.onShopLongDown = false; - // Alt+0~9,快捷换上套装 - if (altKey && keyCode >= 48 && keyCode <= 57) { - core.items.quickLoadEquip(keyCode - 48); - return; + // Alt+0~9,快捷换上套装 + if (altKey && keyCode >= 48 && keyCode <= 57) { + core.items.quickLoadEquip(keyCode - 48); + return; + } + + function tryUseItem(item) { + if (core.hasItem(item)) { + switch (item) { + case 'centerFly': + core.ui._drawCenterFly(); // 中心对称飞行器需要特殊判断 + break; + default: + core.useItem(item); + break; } + } else { + core.drawFailTip('当前未持有对应道具!'); + } + } - function tryUseItem(item) { - if (core.hasItem(item)) core.useItem(item); - else { - core.playSound('error.mp3'); - core.drawTip('当前未持有对应道具!'); - } + // 根据keyCode值来执行对应操作 + switch (keyCode) { + case 27: // ESC:打开菜单栏 + core.openSettings(true); + break; + case 88: // X:使用怪物手册 + core.openBook(true); + break; + case 71: // G:使用楼传器 + core.useFly(true); + break; + case 65: // A:读取自动存档(回退) + core.doSL("autoSave", "load"); + break; + case 87: // W:撤销回退 + core.doSL("autoSave", "reload"); + break; + case 83: // S:存档 + core.save(true); + break; + case 68: // D:读档 + core.load(true); + break; + case 69: // E:打开光标 + core.ui._drawCursor(); + break; + case 84: // T:打开道具栏 + core.openToolbox(true); + break; + case 81: // Q:打开装备栏 + core.openEquipbox(true); + break; + case 90: // Z:转向 + core.turnHero(); + break; + case 86: // V:打开快捷商店列表 + core.openQuickShop(true); + break; + case 32: // SPACE:轻按 + core.getNextItem(); + break; + case 82: // R:回放录像 + core.ui._drawReplay(); + break; + case 33: + case 34: // PgUp/PgDn:浏览地图 + core.ui._drawViewMaps(); + break; + case 66: // B:打开数据统计 + core.ui._drawStatistics(); + break; + case 72: // H:打开帮助页面 + core.ui._drawHelp(); + break; + case 77: // M:打开存档笔记 + core.actions._clickNotes_show(); + break; + case 78: // N:重新开始 + core.confirmRestart(); + break; + case 79: // O:查看工程 + core.actions._clickGameInfo_openProject(); + break; + case 80: // P:游戏主页 + core.actions._clickGameInfo_openComments(); + break; + case 49: // 快捷键1: 破 + { + const item = core.getFlag('hotkey1'); + if (item) tryUseItem(item); + else tryUseItem('pickaxe'); + } + break; + case 50: // 快捷键2: 炸 + { + const item = core.getFlag('hotkey2'); + if (item) tryUseItem(item); + else tryUseItem('bomb'); + } + break; + case 51: // 快捷键3: 飞 + { + const item = core.getFlag('hotkey3'); + if (item) tryUseItem(item); + else tryUseItem('centerFly'); + } + break; + case 52: // 快捷键4:破冰/冰冻/地震/上下楼器/... 其他道具依次判断 + { + const item = core.getFlag('hotkey4'); + if (item) tryUseItem(item); + else { + const list = ["icePickaxe", "freezeBadge", "earthquake", "upFly", "downFly", "jumpShoes", "lifeWand", "poisonWine", "weakWine", "curseWine", "superWine"]; + for (var i = 0; i < list.length; i++) { + var itemId = list[i]; + tryUseItem(itemId); } - - // 根据keyCode值来执行对应操作 - switch (keyCode) { - case 27: // ESC:打开菜单栏 - core.openSettings(true); - break; - case 88: // X:使用怪物手册 - core.openBook(true); - break; - case 71: // G:使用楼传器 - core.useFly(true); - break; - case 65: // A:读取自动存档(回退) - core.doSL("autoSave", "load"); - break; - case 87: // W:撤销回退 - core.doSL("autoSave", "reload"); - break; - case 83: // S:存档 - core.save(true); - break; - case 68: // D:读档 - core.load(true); - break; - case 69: // E:打开光标 - core.ui._drawCursor(); - break; - case 84: // T:打开道具栏 - core.openToolbox(true); - break; - case 81: // Q:打开装备栏 - core.openEquipbox(true); - break; - case 90: // Z:转向 - core.turnHero(); - break; - case 86: // V:打开快捷商店列表 - core.openQuickShop(true); - break; - case 32: // SPACE:轻按 - core.getNextItem(); - break; - case 82: // R:回放录像 - core.ui._drawReplay(); - break; - case 33: - case 34: // PgUp/PgDn:浏览地图 - core.ui._drawViewMaps(); - break; - case 66: // B:打开数据统计 - core.ui._drawStatistics(); - break; - case 72: // H:打开帮助页面 - core.ui._drawHelp(); - break; - case 77: // M:打开存档笔记 - core.actions._clickNotes_show(); - break; - case 78: // N:重新开始 - core.confirmRestart(); - break; - case 79: // O:查看工程 - core.actions._clickGameInfo_openProject(); - break; - case 80: // P:游戏主页 - core.actions._clickGameInfo_openComments(); - break; - case 49: // 快捷键1: 破 - tryUseItem('pickaxe'); - break; - case 50: // 快捷键2: 炸 - tryUseItem('bomb'); - break; - case 51: // 快捷键3: 飞 - if (core.hasItem('centerFly')) { - core.ui._drawCenterFly(); - } - else { - core.playSound('error.mp3'); - core.drawTip('当前未持有对应道具!'); - } - break; - case 52: // 快捷键4:破冰/冰冻/地震/上下楼器/... 其他道具依次判断 - { - var list = ["icePickaxe", "freezeBadge", "earthquake", "upFly", "downFly", "jumpShoes", "lifeWand", "poisonWine", "weakWine", "curseWine", "superWine"]; - for (var i = 0; i < list.length; i++) { - var itemId = list[i]; - tryUseItem(itemId); - } - } - break; - case 53: // 5:读取自动存档(回退),方便手机版操作 - core.doSL("autoSave", "load"); - break; - case 54: // 6:撤销回退,方便手机版操作 - core.doSL("autoSave", "reload"); - break; - case 55: // 快捷键7:绑定为轻按,方便手机版操作 - core.getNextItem(); - break; - case 118: // F7:开启debug模式 - case 119: // F8:由于F7与部分浏览器有冲突,故新增F8 - core.debug(); - break; - case 70: // F - break; - // 在这里可以任意新增或编辑已有的快捷键内容 - /* + } + } + break; + case 53: // 5:读取自动存档(回退),方便手机版操作 + { + const item = core.getFlag('hotkey5'); + if (item) tryUseItem(item); + else core.doSL("autoSave", "load"); + } + break; + case 54: // 6:撤销回退,方便手机版操作 + { + const item = core.getFlag('hotkey6'); + if (item) tryUseItem(item); + else core.doSL("autoSave", "reload"); + } + break; + case 55: // 快捷键7:绑定为轻按,方便手机版操作 + { + const item = core.getFlag('hotkey71'); + if (item) tryUseItem(item); + else core.getNextItem(); + } + break; + case 118: // F7:开启debug模式 + case 119: // F8:由于F7与部分浏览器有冲突,故新增F8 + core.debug(); + break; + case 70: // F + break; + // 在这里可以任意新增或编辑已有的快捷键内容 + /* case 0: // 使用该按键的keyCode // 还可以再判定altKey是否被按下,即 if (altKey) { ... @@ -995,9 +1024,9 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = break; */ - } + } - }, +}, "onStatusBarClick": function (px, py, vertical) { // 点击状态栏时触发的事件,仅在自绘状态栏开启时生效 // px和py为点击的像素坐标 @@ -1292,7 +1321,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // updateDamage只能在此处执行!!更新全地图显伤 core.updateDamage(); }, - "getCheckBlock": function (floorId) { + "getCheckBlock": function (floorId) { // 领域、夹击、阻击等的伤害值计算 floorId = floorId || core.status.floorId; if (!floorId || !core.status.maps) return; diff --git a/project/plugins.js b/project/plugins.js index ee0c0ed1..11934575 100644 --- a/project/plugins.js +++ b/project/plugins.js @@ -3527,12 +3527,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = '系统设置。单击即可触发瞬移。', true, )], - ['leftHand', new Setting( - () => '左手模式:' + (core.flags.leftHandPrefer ? '开' : '关'), - () => core.flags.leftHandPrefer = !core.flags.leftHandPrefer, - '系统设置。左手模式下WASD将用于移动角色,IJKL对应于原始的WASD进行存读档等操作。', - true, - )], ['itemDetail', new Setting( () => '物品显示数据:' + (core.getFlag('itemDetail', false) ? '开' : '关'), () => invertFlag('itemDetail'), @@ -3617,6 +3611,85 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = '增大音量', false, )], + ['leftHand', new Setting( + () => '左手模式:' + (core.flags.leftHandPrefer ? '开' : '关'), + () => core.flags.leftHandPrefer = !core.flags.leftHandPrefer, + '系统设置。左手模式下WASD将用于移动角色,IJKL对应于原始的WASD进行存读档等操作。', + true, + )], + ['setHotKey', new Setting( + () => '', + (num) => { + core.utils.myprompt('输入物品名。名称(例如:破墙镐)或英文ID(例如:pickaxe)均可。', null, (value) => { + const itemInfo = core.material.items; + if (itemInfo) { + const aimItem = Object.values(itemInfo).find((item) => item.name === value || item.id === value); + if (aimItem) { + if (aimItem.cls === 'constants' || aimItem.cls === 'tools') { + core.setFlag('hotkey' + num, aimItem.id); + this.menu.drawContent(); + } + else core.drawFailTip('错误:该类型的物品不支持快捷使用!'); + } + else core.drawFailTip('错误:找不到该名称的物品!'); + } + else core.drawFailTip('未知错误:core.material.items不存在!'); + }); + }, + '给选定的数字键绑定一个可快捷使用的物品。', + true, + function (ctx, x, y, w, h) { + const num = this.EventArgs[0]; + const item = core.getFlag('hotkey' + num, null); + let icon, itemName; + if (item && core.material.items.hasOwnProperty(item)) { + icon = item; + itemName = core.material.items.item.name; + } + else { + switch (num) { + case 1: + icon = 'pickaxe'; + itemName = '破墙镐'; + break; + case 2: + icon = 'bomb'; + itemName = '炸弹'; + break; + case 3: + icon = 'centerFly'; + itemName = '中心飞'; + break; + case 4: + itemName = '杂物'; + break; + case 5: + itemName = '回退一步'; + break; + case 6: + itemName = '撤销回退'; + break; + case 7: + itemName = '轻按'; + break; + } + } + + core.ui.drawTextContent(ctx, '快捷键' + num); + } + )], + ['clearHotKeys', new Setting( + () => '', + () => { + for (let i = 1; i <= 7; i++) { + core.setFlag('hotkey' + i, null); + } + this.menu.drawContent(); + core.drawSuccessTip('快捷键已重置到默认状态。') + }, + '重置本页面所有快捷键到默认状态。', + true, + )], ['wallHacking', new Setting( () => ' 穿墙:' + (core.hasFlag('debug_wallHacking') ? '开' : '关'), () => { @@ -3648,8 +3721,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = this.menu.drawContent(); } else { - core.drawTip('错误:不合法的名称!'); - core.playSound('error.mp3'); + core.drawFailTip('错误:不合法的名称!'); } }); }, @@ -3699,7 +3771,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.setFlag('debug', true); core.setStatus(name, value); core.updateStatusBar(); - core.drawTip('设置成功!'); + core.drawSuccessTip('设置成功!'); }, '将角色状态设为相应值。', false, @@ -3722,8 +3794,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = return; } } - core.drawTip('错误:不合法的名称!'); - core.playSound('error.mp3'); + core.drawFailTip('错误:不合法的名称!'); }); }, '', @@ -3743,8 +3814,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = this.menu.drawContent(); } else { - core.drawTip('错误:不合法的值!'); - core.playSound('error.mp3'); + core.drawFailTip('错误:不合法的值!'); } }); }, @@ -3800,8 +3870,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = this.menu.drawContent(); } else { - core.drawTip('错误:不合法的名称!'); - core.playSound('error.mp3'); + core.drawFailTip('错误:不合法的名称!'); } }); }, @@ -3859,9 +3928,16 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ]) class SettingButton extends ButtonBase { - constructor(x, y, w, h, name) { + /** + * @param {unknown[]} eventArgs + */ + constructor(x, y, w, h, name, eventArgs) { super(x, y, w, h); this.name = name; + /** + * @type {Array} + */ + this.eventArgs = eventArgs || []; /** * @type {Setting} */ @@ -3876,7 +3952,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = } this.event = () => { if (this.disable) return; - this.setting.effect.apply(this, []); + this.setting.effect.apply(this, eventArgs); this.menu.drawContent(); if (this.setting.replay) core.status.route.push('cSet:' + name); } @@ -3943,12 +4019,20 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = else { this.selectedBtn = btn; this.text = btn.setting.text; + this.drawEventSelector(); } } }); } } + drawEventSelector() { + if (core.isset(this.selectedBtn)) { + core.drawUIEventSelector(0, "winskin.png", this.selectedBtn.x, this.selectedBtn.y, + this.selectedBtn.w, this.selectedBtn.h, 137); + } + } + drawContent() { super.drawContent(); if (this.text && this.text.length > 0) { @@ -3957,10 +4041,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = align: "left", fontSize: 14, maxWidth: 350 }); } - if (core.isset(this.selectedBtn)) { - core.drawUIEventSelector(0, "winskin.png", this.selectedBtn.x, this.selectedBtn.y, - this.selectedBtn.w, this.selectedBtn.h, 137); - } switch (this.name) { case 'gamePlay': core.fillText(this.name, '-- 自动 --', 40, 175, ' #FFE4B5', '18px Verdana'); @@ -3985,6 +4065,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.fillText(this.name, "设为", 170, 316, 'white', '16px Verdana'); break; } + this.drawEventSelector(); } clear() { @@ -4048,7 +4129,10 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ]); const keyMenu = new SettingOnePage('key'); - + keyMenu.initBtnList([ + ['leftHand', new SettingButton(40, 160, 150, 25, 'leftHand')], + ['hotKey1', new SettingButton(40, 200, 100, 25, 'setHotKey', [1])], + ]) const consoleMenu = new SettingOnePage('console'); consoleMenu.initBtnList([ @@ -4104,5 +4188,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = settingMenu.init(); } + // todolist 批量使用:您当前选定了:xxx。请勿选定不适合批量使用的道具,请勿输入过大的数字。 } } \ No newline at end of file