feat:自定义快捷键界面

This commit is contained in:
lizhuoyuan 2025-02-06 11:29:32 +08:00
parent d11a7237bc
commit ac1b8b860c
3 changed files with 265 additions and 152 deletions

View File

@ -75,7 +75,6 @@ HTML5 canvas制作的魔塔样板支持全平台游戏
* [x] 添加了清怪检测,败移,追猎,重开杖的默认实现 * [x] 添加了清怪检测,败移,追猎,重开杖的默认实现
* [x] 添加了若干常用插件 * [x] 添加了若干常用插件
* [x] 美化了设置界面,在设置中添加了上述自动拾取,数据显示等功能的开关 * [x] 美化了设置界面,在设置中添加了上述自动拾取,数据显示等功能的开关
* [ ] todolist:安装样板编辑器升级,分块加载
### 2022.7.10 HTML5魔塔样板V2.9.1 ### 2022.7.10 HTML5魔塔样板V2.9.1

View File

@ -851,138 +851,167 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
}, },
"actions": { "actions": {
"onKeyUp": function (keyCode, altKey) { "onKeyUp": function (keyCode, altKey) {
// 键盘按键处理,可以在这里自定义快捷键列表 // 键盘按键处理,可以在这里自定义快捷键列表
// keyCode当前按键的keyCode每个键的keyCode自行百度 // keyCode当前按键的keyCode每个键的keyCode自行百度
// altKeyAlt键是否被按下为true代表同时按下了Alt键 // altKeyAlt键是否被按下为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快捷换上套装 // Alt+0~9快捷换上套装
if (altKey && keyCode >= 48 && keyCode <= 57) { if (altKey && keyCode >= 48 && keyCode <= 57) {
core.items.quickLoadEquip(keyCode - 48); core.items.quickLoadEquip(keyCode - 48);
return; 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) { // 根据keyCode值来执行对应操作
if (core.hasItem(item)) core.useItem(item); switch (keyCode) {
else { case 27: // ESC打开菜单栏
core.playSound('error.mp3'); core.openSettings(true);
core.drawTip('当前未持有对应道具!'); 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) { break;
case 27: // ESC打开菜单栏 case 53: // 5读取自动存档回退方便手机版操作
core.openSettings(true); {
break; const item = core.getFlag('hotkey5');
case 88: // X使用怪物手册 if (item) tryUseItem(item);
core.openBook(true); else core.doSL("autoSave", "load");
break; }
case 71: // G使用楼传器 break;
core.useFly(true); case 54: // 6撤销回退方便手机版操作
break; {
case 65: // A读取自动存档回退 const item = core.getFlag('hotkey6');
core.doSL("autoSave", "load"); if (item) tryUseItem(item);
break; else core.doSL("autoSave", "reload");
case 87: // W撤销回退 }
core.doSL("autoSave", "reload"); break;
break; case 55: // 快捷键7绑定为轻按方便手机版操作
case 83: // S存档 {
core.save(true); const item = core.getFlag('hotkey71');
break; if (item) tryUseItem(item);
case 68: // D读档 else core.getNextItem();
core.load(true); }
break; break;
case 69: // E打开光标 case 118: // F7开启debug模式
core.ui._drawCursor(); case 119: // F8由于F7与部分浏览器有冲突故新增F8
break; core.debug();
case 84: // T打开道具栏 break;
core.openToolbox(true); case 70: // F
break; 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;
// 在这里可以任意新增或编辑已有的快捷键内容
/*
case 0: // 使用该按键的keyCode case 0: // 使用该按键的keyCode
// 还可以再判定altKey是否被按下即 if (altKey) { ... // 还可以再判定altKey是否被按下即 if (altKey) { ...
@ -995,9 +1024,9 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
break; break;
*/ */
} }
}, },
"onStatusBarClick": function (px, py, vertical) { "onStatusBarClick": function (px, py, vertical) {
// 点击状态栏时触发的事件,仅在自绘状态栏开启时生效 // 点击状态栏时触发的事件,仅在自绘状态栏开启时生效
// px和py为点击的像素坐标 // px和py为点击的像素坐标
@ -1292,7 +1321,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
// updateDamage只能在此处执行更新全地图显伤 // updateDamage只能在此处执行更新全地图显伤
core.updateDamage(); core.updateDamage();
}, },
"getCheckBlock": function (floorId) { "getCheckBlock": function (floorId) {
// 领域、夹击、阻击等的伤害值计算 // 领域、夹击、阻击等的伤害值计算
floorId = floorId || core.status.floorId; floorId = floorId || core.status.floorId;
if (!floorId || !core.status.maps) return; if (!floorId || !core.status.maps) return;

View File

@ -3527,12 +3527,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
'系统设置。单击即可触发瞬移。', '系统设置。单击即可触发瞬移。',
true, true,
)], )],
['leftHand', new Setting(
() => '左手模式:' + (core.flags.leftHandPrefer ? '开' : '关'),
() => core.flags.leftHandPrefer = !core.flags.leftHandPrefer,
'系统设置。左手模式下WASD将用于移动角色IJKL对应于原始的WASD进行存读档等操作。',
true,
)],
['itemDetail', new Setting( ['itemDetail', new Setting(
() => '物品显示数据:' + (core.getFlag('itemDetail', false) ? '开' : '关'), () => '物品显示数据:' + (core.getFlag('itemDetail', false) ? '开' : '关'),
() => invertFlag('itemDetail'), () => invertFlag('itemDetail'),
@ -3617,6 +3611,85 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
'增大音量', '增大音量',
false, 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( ['wallHacking', new Setting(
() => ' 穿墙:' + (core.hasFlag('debug_wallHacking') ? '开' : '关'), () => ' 穿墙:' + (core.hasFlag('debug_wallHacking') ? '开' : '关'),
() => { () => {
@ -3648,8 +3721,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
this.menu.drawContent(); this.menu.drawContent();
} }
else { else {
core.drawTip('错误:不合法的名称!'); core.drawFailTip('错误:不合法的名称!');
core.playSound('error.mp3');
} }
}); });
}, },
@ -3699,7 +3771,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
core.setFlag('debug', true); core.setFlag('debug', true);
core.setStatus(name, value); core.setStatus(name, value);
core.updateStatusBar(); core.updateStatusBar();
core.drawTip('设置成功!'); core.drawSuccessTip('设置成功!');
}, },
'将角色状态设为相应值。', '将角色状态设为相应值。',
false, false,
@ -3722,8 +3794,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
return; return;
} }
} }
core.drawTip('错误:不合法的名称!'); core.drawFailTip('错误:不合法的名称!');
core.playSound('error.mp3');
}); });
}, },
'', '',
@ -3743,8 +3814,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
this.menu.drawContent(); this.menu.drawContent();
} }
else { else {
core.drawTip('错误:不合法的值!'); core.drawFailTip('错误:不合法的值!');
core.playSound('error.mp3');
} }
}); });
}, },
@ -3800,8 +3870,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
this.menu.drawContent(); this.menu.drawContent();
} }
else { else {
core.drawTip('错误:不合法的名称!'); core.drawFailTip('错误:不合法的名称!');
core.playSound('error.mp3');
} }
}); });
}, },
@ -3859,9 +3928,16 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
]) ])
class SettingButton extends ButtonBase { 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); super(x, y, w, h);
this.name = name; this.name = name;
/**
* @type {Array<unknown>}
*/
this.eventArgs = eventArgs || [];
/** /**
* @type {Setting} * @type {Setting}
*/ */
@ -3876,7 +3952,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
} }
this.event = () => { this.event = () => {
if (this.disable) return; if (this.disable) return;
this.setting.effect.apply(this, []); this.setting.effect.apply(this, eventArgs);
this.menu.drawContent(); this.menu.drawContent();
if (this.setting.replay) core.status.route.push('cSet:' + name); if (this.setting.replay) core.status.route.push('cSet:' + name);
} }
@ -3943,12 +4019,20 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
else { else {
this.selectedBtn = btn; this.selectedBtn = btn;
this.text = btn.setting.text; 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() { drawContent() {
super.drawContent(); super.drawContent();
if (this.text && this.text.length > 0) { if (this.text && this.text.length > 0) {
@ -3957,10 +4041,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
align: "left", fontSize: 14, maxWidth: 350 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) { switch (this.name) {
case 'gamePlay': case 'gamePlay':
core.fillText(this.name, '-- 自动 --', 40, 175, ' #FFE4B5', '18px Verdana'); 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'); core.fillText(this.name, "设为", 170, 316, 'white', '16px Verdana');
break; break;
} }
this.drawEventSelector();
} }
clear() { clear() {
@ -4048,7 +4129,10 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
]); ]);
const keyMenu = new SettingOnePage('key'); 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'); const consoleMenu = new SettingOnePage('console');
consoleMenu.initBtnList([ consoleMenu.initBtnList([
@ -4104,5 +4188,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
settingMenu.init(); settingMenu.init();
} }
// todolist 批量使用您当前选定了xxx。请勿选定不适合批量使用的道具请勿输入过大的数字。
} }
} }