import { KeyCode } from '@motajs/client-base'; import { gameKey, HotkeyJSON } from '@motajs/system-action'; import { openDanmakuPoster, tip, hasMarkedEnemy, markEnemy, unmarkEnemy } from '@motajs/legacy-ui'; import { hovered } from './fixed'; import { mainUi } from './ui'; import { GameStorage } from '@motajs/legacy-system'; export const mainScope = Symbol.for('@key_main'); // todo: 读取上一个手动存档,存档至下一个存档栏 // ----- Register gameKey // -------------------- .group('game', '游戏按键') .register({ id: 'moveUp', name: '上移', defaults: KeyCode.UpArrow }) .register({ id: 'moveDown', name: '下移', defaults: KeyCode.DownArrow }) .register({ id: 'moveLeft', name: '左移', defaults: KeyCode.LeftArrow }) .register({ id: 'moveRight', name: '右移', defaults: KeyCode.RightArrow }) // -------------------- .group('ui', 'ui界面') .register({ id: 'book', name: '怪物手册', defaults: KeyCode.KeyX }) .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({ id: 'undo_1', name: '回退_1', defaults: KeyCode.KeyA }) .register({ id: 'undo_2', name: '回退_2', defaults: KeyCode.Digit5 }) .register({ id: 'redo_1', name: '恢复_1', defaults: KeyCode.KeyW }) .register({ id: 'redo_2', name: '恢复_2', defaults: KeyCode.Digit6 }) .register({ id: 'turn', name: '勇士转向', defaults: KeyCode.KeyZ }) .register({ id: 'getNext_1', name: '轻按_1', defaults: KeyCode.Space }) .register({ id: 'getNext_2', name: '轻按_2', defaults: KeyCode.Digit7 }) .register({ id: 'mark', name: '标记怪物', defaults: KeyCode.KeyM }) .register({ id: 'special', name: '鼠标位置怪物属性', defaults: KeyCode.KeyE }) .register({ id: 'critical', name: '鼠标位置怪物临界', defaults: KeyCode.KeyC }) .register({ id: 'danmaku', name: '发送弹幕', defaults: KeyCode.KeyA, ctrl: true }) .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 }) // -------------------- .group('skill', '技能按键') .register({ id: 'skill1', name: '断灭之刃', defaults: KeyCode.Digit1 }) .register({ id: 'skill2', name: '跳跃', defaults: KeyCode.Digit2 }) .register({ id: 'skill3', name: '铸剑为盾', defaults: KeyCode.Digit3 }) // -------------------- .group('system', '系统按键') .register({ id: 'restart', name: '回到开始界面', defaults: KeyCode.KeyN }) .register({ id: 'comment', name: '评论区', defaults: KeyCode.KeyP }) .register({ id: 'debug', name: '调试模式', defaults: KeyCode.F8 }) // -------------------- .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: '上移光标', defaults: KeyCode.UpArrow }) .register({ id: '@start_down', name: '下移光标', defaults: KeyCode.DownArrow }) // -------------------- .group('@ui_book', '怪物手册') .register({ id: '@book_up', name: '上移光标', defaults: KeyCode.UpArrow }) .register({ id: '@book_down', name: '下移光标', defaults: KeyCode.DownArrow }) .register({ id: '@book_pageDown_1', name: '下移5个怪物_1', defaults: KeyCode.RightArrow }) .register({ id: '@book_pageDown_2', name: '下移5个怪物_2', defaults: KeyCode.PageDown }) .register({ id: '@book_pageUp_1', name: '上移5个怪物_1', defaults: KeyCode.LeftArrow }) .register({ id: '@book_pageUp_2', name: '上移5个怪物_2', defaults: KeyCode.PageUp }) // -------------------- .group('@ui_toolbox', '道具栏') .register({ id: '@toolbox_right', name: '光标右移', defaults: KeyCode.RightArrow }) .register({ id: '@toolbox_left', name: '光标左移', defaults: KeyCode.LeftArrow }) .register({ id: '@toolbox_up', name: '光标上移', defaults: KeyCode.UpArrow }) .register({ id: '@toolbox_down', name: '光标下移', defaults: KeyCode.DownArrow }) // -------------------- .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 }) .register({ id: '@shop_min', name: '减少购买量', defaults: KeyCode.LeftArrow }) // -------------------- .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 gameKey .when( () => !core.status.lockControl && !core.isMoving() && !core.isReplaying() ) .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(); }) .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', () => { if (hovered) { const { x, y } = hovered; const enemy = core.status.thisMap.enemy.get(x, y); if (enemy) mainUi.open('fixedDetail', { panel: 'special' }); } }) .realize('critical', () => { if (hovered) { const { x, y } = hovered; const enemy = core.status.thisMap.enemy.get(x, y); if (enemy) mainUi.open('fixedDetail', { panel: 'critical' }); } }) .realize('danmaku', () => { openDanmakuPoster(); }) .realize('restart', () => { core.confirmRestart(); }) .realize('comment', () => { core.actions._clickGameInfo_openComments(); }) .realize('skill1', () => { const HeroSkill = Mota.require('@user/data-state').HeroSkill; if (!HeroSkill.learnedSkill(HeroSkill.Blade)) return; if (HeroSkill.getAutoSkill()) { tip('error', '已开启自动切换技能!'); return; } core.playSound('光标移动'); HeroSkill.toggleSkill(HeroSkill.Blade); core.status.route.push('useSkill:Blade'); core.updateStatusBar(); }) .realize('skill2', () => { const HeroSkill = Mota.require('@user/data-state').HeroSkill; if ( !flags.onChase && !core.status.floorId.startsWith('tower') && HeroSkill.learnedSkill(HeroSkill.Jump) ) { Mota.require('@user/legacy-plugin-data').jumpSkill(); core.status.route.push('useSkill:Jump'); } else { if (core.hasItem('pickaxe')) { core.useItem('pickaxe'); } } }) .realize('skill3', () => { const HeroSkill = Mota.require('@user/data-state').HeroSkill; if (!HeroSkill.learnedSkill(HeroSkill.Shield)) return; if (HeroSkill.getAutoSkill()) { tip('error', '已开启自动切换技能!'); return; } core.playSound('光标移动'); HeroSkill.toggleSkill(HeroSkill.Shield); core.status.route.push('useSkill:Shield'); core.updateStatusBar(); }) .realize('debug', () => { core.debug(); }); // ----- Storage const keyStorage = new GameStorage>( GameStorage.fromAuthor('AncTe', 'gameKey') ); keyStorage.data = {}; keyStorage.read(); gameKey.on('set', (id, key, assist) => { keyStorage.setValue(id, { key, assist }); }); gameKey.fromJSON(keyStorage.toJSON());