feat:自定义快捷键界面
This commit is contained in:
parent
d11a7237bc
commit
ac1b8b860c
@ -75,7 +75,6 @@ HTML5 canvas制作的魔塔样板,支持全平台游戏!
|
||||
* [x] 添加了清怪检测,败移,追猎,重开杖的默认实现
|
||||
* [x] 添加了若干常用插件
|
||||
* [x] 美化了设置界面,在设置中添加了上述自动拾取,数据显示等功能的开关
|
||||
* [ ] todolist:安装样板编辑器升级,分块加载
|
||||
|
||||
### 2022.7.10 HTML5魔塔样板V2.9.1
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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<unknown>}
|
||||
*/
|
||||
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。请勿选定不适合批量使用的道具,请勿输入过大的数字。
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user