HumanBreak/src/core/main/init/hotkey.ts

505 lines
12 KiB
TypeScript
Raw Normal View History

2023-11-18 21:46:11 +08:00
import { KeyCode } from '@/plugin/keyCodes';
2023-11-20 12:42:55 +08:00
import { Hotkey, HotkeyJSON } from '../custom/hotkey';
2023-11-18 21:46:11 +08:00
import { generateBinary, keycode } from '@/plugin/utils';
2023-11-19 19:36:45 +08:00
import { hovered } from './fixed';
import { hasMarkedEnemy, markEnemy, unmarkEnemy } from '@/plugin/mark';
import { mainUi } from './ui';
2023-11-20 12:42:55 +08:00
import { GameStorage } from '../storage';
2023-11-18 21:46:11 +08:00
export const mainScope = Symbol.for('@key_main');
export const gameKey = new Hotkey('gameKey', '游戏按键');
// ----- Register
gameKey
// --------------------
.group('ui', 'ui界面')
.register({
id: 'book',
name: '怪物手册',
2023-11-20 12:42:55 +08:00
defaults: KeyCode.KeyX
2023-11-18 21:46:11 +08:00
})
.register({
id: 'save',
name: '存档界面',
defaults: KeyCode.KeyS
})
.register({
id: 'load',
name: '读档界面',
defaults: KeyCode.KeyD
})
.register({
id: 'toolbox',
name: '道具栏',
defaults: KeyCode.KeyT
})
.register({
id: 'equipbox',
name: '装备栏',
defaults: KeyCode.KeyQ
})
.register({
id: 'fly',
name: '楼层传送',
defaults: KeyCode.KeyG
})
.register({
id: 'menu',
name: '菜单',
defaults: KeyCode.Escape
})
.register({
id: 'replay',
name: '录像回放',
defaults: KeyCode.KeyR
})
.register({
id: 'shop',
name: '快捷商店',
defaults: KeyCode.KeyV
})
.register({
id: 'statistics',
name: '数据统计',
defaults: KeyCode.KeyB
})
.register({
id: 'viewMap_1',
name: '浏览地图_1',
defaults: KeyCode.PageUp
})
.register({
id: 'viewMap_2',
name: '浏览地图_2',
defaults: KeyCode.PageDown
})
.register({
id: 'skillTree',
name: '技能树',
defaults: KeyCode.KeyJ
})
.register({
id: 'desc',
name: '百科全书',
defaults: KeyCode.KeyH
})
// --------------------
.group('function', '功能按键')
.register({
2023-11-19 19:36:45 +08:00
id: 'undo_1',
name: '回退_1',
2023-11-18 21:46:11 +08:00
defaults: KeyCode.KeyA
})
.register({
2023-11-19 19:36:45 +08:00
id: 'undo_2',
name: '回退_2',
defaults: KeyCode.Digit5
})
.register({
id: 'redo_1',
name: '恢复_1',
2023-11-18 21:46:11 +08:00
defaults: KeyCode.KeyW
})
2023-11-19 19:36:45 +08:00
.register({
id: 'redo_2',
name: '恢复_2',
defaults: KeyCode.Digit6
})
2023-11-18 21:46:11 +08:00
.register({
id: 'turn',
name: '勇士转向',
defaults: KeyCode.KeyZ
})
.register({
2023-11-19 19:36:45 +08:00
id: 'getNext_1',
name: '轻按_1',
2023-11-18 21:46:11 +08:00
defaults: KeyCode.Space
})
2023-11-19 19:36:45 +08:00
.register({
id: 'getNext_2',
name: '轻按_2',
defaults: KeyCode.Digit7
})
2023-11-18 21:46:11 +08:00
.register({
id: 'mark',
name: '标记怪物',
defaults: KeyCode.KeyM
})
.register({
id: 'special',
name: '鼠标位置怪物属性',
defaults: KeyCode.KeyE
})
.register({
id: 'critical',
name: '鼠标位置怪物临界',
defaults: KeyCode.KeyC
})
.register({
id: 'quickEquip_1',
name: '切换/保存套装_1',
defaults: KeyCode.Digit1,
alt: true
})
.register({
id: 'quickEquip_2',
name: '切换/保存套装_2',
defaults: KeyCode.Digit2,
alt: true
})
.register({
id: 'quickEquip_3',
name: '切换/保存套装_3',
defaults: KeyCode.Digit3,
alt: true
})
.register({
id: 'quickEquip_4',
name: '切换/保存套装_4',
defaults: KeyCode.Digit4,
alt: true
})
.register({
id: 'quickEquip_5',
name: '切换/保存套装_5',
defaults: KeyCode.Digit5,
alt: true
})
.register({
id: 'quickEquip_6',
name: '切换/保存套装_6',
defaults: KeyCode.Digit6,
alt: true
})
.register({
id: 'quickEquip_7',
name: '切换/保存套装_7',
defaults: KeyCode.Digit7,
alt: true
})
.register({
id: 'quickEquip_8',
name: '切换/保存套装_8',
defaults: KeyCode.Digit8,
alt: true
})
.register({
id: 'quickEquip_9',
name: '切换/保存套装_9',
defaults: KeyCode.Digit9,
alt: true
})
.register({
id: 'quickEquip_0',
name: '切换/保存套装_0',
defaults: KeyCode.Digit0,
alt: true
})
2023-11-18 21:46:11 +08:00
// --------------------
.group('system', '系统按键')
.register({
id: 'restart',
name: '回到开始界面',
defaults: KeyCode.KeyN
})
.register({
id: 'comment',
name: '评论区',
defaults: KeyCode.KeyP
})
// --------------------
.group('general', '通用按键')
.register({
id: 'exit_1',
name: '退出ui界面_1',
defaults: KeyCode.KeyX
})
.register({
id: 'exit_2',
name: '退出ui界面_2',
defaults: KeyCode.Escape
})
.register({
id: 'confirm_1',
name: '确认_1',
defaults: KeyCode.Enter
})
.register({
id: 'confirm_2',
name: '确认_2',
defaults: KeyCode.Space
})
.register({
id: 'confirm_3',
name: '确认_3',
defaults: KeyCode.KeyC
})
// --------------------
.group('@ui_start', '开始界面')
.register({
id: '@start_up',
name: '上移光标',
2023-11-18 22:24:07 +08:00
defaults: KeyCode.UpArrow,
type: 'down'
2023-11-18 21:46:11 +08:00
})
.register({
id: '@start_down',
name: '下移光标',
2023-11-18 22:24:07 +08:00
defaults: KeyCode.DownArrow,
type: 'down'
2023-11-18 21:46:11 +08:00
})
// --------------------
.group('@ui_book', '怪物手册')
.register({
id: '@book_up',
name: '上移光标',
defaults: KeyCode.UpArrow,
type: 'down'
})
.register({
id: '@book_down',
name: '下移光标',
defaults: KeyCode.DownArrow,
type: 'down'
})
.register({
id: '@book_pageDown_1',
name: '下移5个怪物_1',
defaults: KeyCode.RightArrow,
type: 'down'
})
.register({
id: '@book_pageDown_2',
name: '下移5个怪物_2',
defaults: KeyCode.PageDown,
type: 'down'
})
.register({
id: '@book_pageUp_1',
name: '上移5个怪物_1',
defaults: KeyCode.LeftArrow,
type: 'down'
})
.register({
id: '@book_pageUp_2',
name: '上移5个怪物_2',
defaults: KeyCode.PageUp,
type: 'down'
})
// --------------------
.group('@ui_toolbox', '道具栏')
.register({
id: '@toolbox_right',
name: '光标右移',
defaults: KeyCode.RightArrow,
type: 'down'
})
.register({
id: '@toolbox_left',
name: '光标左移',
defaults: KeyCode.LeftArrow,
type: 'down'
})
.register({
id: '@toolbox_up',
name: '光标上移',
defaults: KeyCode.UpArrow,
type: 'down'
})
.register({
2023-11-18 22:24:07 +08:00
id: '@toolbox_down',
2023-11-18 21:46:11 +08:00
name: '光标下移',
defaults: KeyCode.DownArrow,
type: 'down'
})
// --------------------
.group('@ui_shop', '商店')
.register({
id: '@shop_up',
name: '上移光标',
defaults: KeyCode.UpArrow
})
.register({
id: '@shop_down',
name: '下移光标',
defaults: KeyCode.DownArrow
})
.register({
id: '@shop_add',
name: '增加购买量',
defaults: KeyCode.RightArrow,
type: 'down'
})
.register({
id: '@shop_min',
name: '减少购买量',
defaults: KeyCode.LeftArrow,
type: 'down'
})
// --------------------
.group('@ui_fly', '楼层传送')
.register({
id: '@fly_left',
name: '左移地图',
defaults: KeyCode.LeftArrow
})
.register({
id: '@fly_right',
name: '右移地图',
defaults: KeyCode.RightArrow
})
.register({
id: '@fly_up',
name: '上移地图',
defaults: KeyCode.UpArrow
})
.register({
id: '@fly_down',
name: '下移地图',
defaults: KeyCode.DownArrow
})
.register({
id: '@fly_last',
name: '上一张地图',
defaults: KeyCode.PageDown
})
.register({
id: '@fly_next',
name: '下一张地图',
defaults: KeyCode.PageUp
})
// --------------------
.group('@ui_fly_tradition', '楼层传送-传统按键')
.register({
id: '@fly_down_t',
name: '上一张地图',
defaults: KeyCode.DownArrow
})
.register({
id: '@fly_up_t',
name: '下一张地图',
defaults: KeyCode.UpArrow
})
.register({
id: '@fly_left_t_1',
name: '前10张地图_1',
defaults: KeyCode.LeftArrow
})
.register({
id: '@fly_left_t_2',
name: '前10张地图_2',
defaults: KeyCode.PageDown
})
.register({
id: '@fly_right_t_1',
name: '后10张地图_1',
defaults: KeyCode.RightArrow
})
.register({
id: '@fly_right_t_2',
name: '后10张地图_2',
defaults: KeyCode.PageUp
});
gameKey.enable();
gameKey.use(mainScope);
// ----- Realization
2023-11-18 23:03:47 +08:00
gameKey
2023-11-19 19:36:45 +08:00
.when(() => !core.status.lockControl && !core.isMoving())
2023-11-18 23:03:47 +08:00
.realize('book', () => {
core.openBook(true);
})
.realize('save', () => {
core.save(true);
})
.realize('load', () => {
core.load(true);
})
.realize('toolbox', () => {
core.openToolbox(true);
})
.realize('equipbox', () => {
core.openEquipbox(true);
})
.realize('fly', () => {
core.useFly(true);
})
.realize('menu', () => {
core.openSettings(true);
})
.realize('replay', () => {
core.ui._drawReplay();
})
.realize('shop', () => {
core.openQuickShop(true);
})
.realize('statistics', () => {
core.ui._drawStatistics();
})
.realize('viewMap', () => {
core.ui._drawViewMaps();
})
.realize('skillTree', () => {
core.useItem('skill1', true);
})
.realize('desc', () => {
core.useItem('I560', true);
})
.realize('undo', () => {
core.doSL('autoSave', 'load');
})
.realize('redo', () => {
core.doSL('autoSave', 'reload');
})
.realize('turn', () => {
core.turnHero();
})
.realize('getNext', () => {
core.getNextItem();
})
2023-11-19 19:36:45 +08:00
.realize('mark', () => {
const cls = hovered?.event.cls;
if (cls === 'enemys' || cls === 'enemy48') {
const id = hovered!.event.id as EnemyIds;
if (hasMarkedEnemy(id)) unmarkEnemy(id);
else markEnemy(id);
}
})
.realize('special', () => {
mainUi.open('fixedDetail', { panel: 'special' });
})
.realize('critical', () => {
mainUi.open('fixedDetail', { panel: 'critical' });
})
2023-11-18 23:03:47 +08:00
.realize('restart', () => {
core.confirmRestart();
})
.realize('comment', () => {
core.actions._clickGameInfo_openComments();
});
2023-11-20 12:42:55 +08:00
// ----- Storage
const keyStorage = new GameStorage<Record<string, HotkeyJSON>>(
GameStorage.fromAuthor('AncTe', 'gameKey')
);
keyStorage.data = {};
keyStorage.read();
gameKey.on('set', (id, key, assist) => {
keyStorage.setValue(id, { key, assist });
});
gameKey.fromJSON(keyStorage.toJSON());
2023-11-18 21:46:11 +08:00
// ----- Listening
document.addEventListener('keyup', e => {
const assist = generateBinary([e.ctrlKey, e.shiftKey, e.altKey]);
const code = keycode(e.keyCode);
gameKey.emitKey(code, assist, 'up', e);
});
document.addEventListener('keydown', e => {
const assist = generateBinary([e.ctrlKey, e.shiftKey, e.altKey]);
const code = keycode(e.keyCode);
gameKey.emitKey(code, assist, 'down', e);
});