Controller customization feature

This commit is contained in:
redphx
2024-12-22 17:17:03 +07:00
parent 8ef5a95c88
commit 7b60ba3a3e
89 changed files with 3286 additions and 1188 deletions

View File

@@ -0,0 +1,45 @@
import type { ControllerCustomizationPresetRecord, PresetRecords } from "@/types/presets";
import { LocalDb } from "./local-db";
import { BasePresetsTable } from "./base-presets-table";
import { GamepadKey } from "@/enums/gamepad";
export const enum ControllerCustomizationDefaultPresetId {
OFF = 0,
BAYX = -1,
DEFAULT = OFF,
};
export class ControllerCustomizationsTable extends BasePresetsTable<ControllerCustomizationPresetRecord> {
private static instance: ControllerCustomizationsTable;
public static getInstance = () => ControllerCustomizationsTable.instance ?? (ControllerCustomizationsTable.instance = new ControllerCustomizationsTable(LocalDb.TABLE_CONTROLLER_CUSTOMIZATIONS));
protected readonly TABLE_PRESETS = LocalDb.TABLE_CONTROLLER_CUSTOMIZATIONS;
protected DEFAULT_PRESETS: PresetRecords<ControllerCustomizationPresetRecord> = {
[ControllerCustomizationDefaultPresetId.BAYX]: {
id: ControllerCustomizationDefaultPresetId.BAYX,
name: 'ABXY ⇄ BAYX',
data: {
mapping: {
[GamepadKey.A]: GamepadKey.B,
[GamepadKey.B]: GamepadKey.A,
[GamepadKey.X]: GamepadKey.Y,
[GamepadKey.Y]: GamepadKey.X,
},
settings: {
leftStickDeadzone: [0, 100],
rightStickDeadzone: [0, 100],
leftTriggerRange: [0, 100],
rightTriggerRange: [0, 100],
vibrationIntensity: 100,
},
},
},
};
protected DEFAULT_PRESET_ID = ControllerCustomizationDefaultPresetId.DEFAULT;
}

View File

@@ -2,6 +2,7 @@ import { BaseLocalTable } from "./base-table";
import { LocalDb } from "./local-db";
import { ControllerShortcutDefaultId } from "./controller-shortcuts-table";
import { deepClone } from "../global";
import { ControllerCustomizationDefaultPresetId } from "./controller-customizations-table";
export class ControllerSettingsTable extends BaseLocalTable<ControllerSettingsRecord> {
private static instance: ControllerSettingsTable;
@@ -9,7 +10,7 @@ export class ControllerSettingsTable extends BaseLocalTable<ControllerSettingsRe
static readonly DEFAULT_DATA: ControllerSettingsRecord['data'] = {
shortcutPresetId: ControllerShortcutDefaultId.DEFAULT,
vibrationIntensity: 50,
customizationPresetId: ControllerCustomizationDefaultPresetId.DEFAULT,
};
async getControllerData(id: string): Promise<ControllerSettingsRecord['data']> {
@@ -30,10 +31,7 @@ export class ControllerSettingsTable extends BaseLocalTable<ControllerSettingsRe
continue;
}
const settings = all[key].data;
// Pre-calculate virabtionIntensity
settings.vibrationIntensity /= 100;
const settings = Object.assign(all[key].data, ControllerSettingsTable.DEFAULT_DATA);
results[key] = settings;
}

View File

@@ -4,10 +4,11 @@ export class LocalDb {
// private readonly LOG_TAG = 'LocalDb';
static readonly DB_NAME = 'BetterXcloud';
static readonly DB_VERSION = 3;
static readonly DB_VERSION = 4;
static readonly TABLE_VIRTUAL_CONTROLLERS = 'virtual_controllers';
static readonly TABLE_CONTROLLER_SHORTCUTS = 'controller_shortcuts';
static readonly TABLE_CONTROLLER_CUSTOMIZATIONS = 'controller_customizations';
static readonly TABLE_CONTROLLER_SETTINGS = 'controller_settings';
static readonly TABLE_KEYBOARD_SHORTCUTS = 'keyboard_shortcuts';
@@ -52,6 +53,14 @@ export class LocalDb {
});
}
// Controller mappings
if (!db.objectStoreNames.contains(LocalDb.TABLE_CONTROLLER_CUSTOMIZATIONS)) {
db.createObjectStore(LocalDb.TABLE_CONTROLLER_CUSTOMIZATIONS, {
keyPath: 'id',
autoIncrement: true,
});
}
// Keyboard shortcuts
if (!db.objectStoreNames.contains(LocalDb.TABLE_KEYBOARD_SHORTCUTS)) {
db.createObjectStore(LocalDb.TABLE_KEYBOARD_SHORTCUTS, {