decla-red/frontend/src/scripts/options-handler.ts
schmelczerandras 34dae300da Change gameplay
2020-10-24 22:24:27 +02:00

74 lines
1.9 KiB
TypeScript

import { SoundHandler, Sounds } from './sound-handler';
interface Options {
vibrationEnabled: boolean;
soundsEnabled: boolean;
relativeMovementEnabled: boolean;
musicEnabled: boolean;
}
export abstract class OptionsHandler {
private static initialized = false;
private static _options: Options = {
vibrationEnabled: true,
soundsEnabled: true,
relativeMovementEnabled: false,
musicEnabled: true,
};
public static initialize(
inputElements: { [k in Extract<keyof Options, string>]: HTMLInputElement },
) {
if (localStorage.getItem('options')) {
const stored: Partial<Options> | null = JSON.parse(
localStorage.getItem('options')!,
);
this._options = {
...this._options,
...stored,
};
if (this._options.musicEnabled) {
SoundHandler.playAmbient();
}
}
for (const k in inputElements) {
const element = inputElements[k as keyof Options];
element.checked = OptionsHandler._options[k as keyof Options];
element.addEventListener('change', function () {
OptionsHandler._options[k as keyof Options] = this.checked;
if (!this.checked && k === 'soundsEnabled') {
OptionsHandler._options.musicEnabled = false;
inputElements.musicEnabled.checked = false;
SoundHandler.stopAmbient();
}
if (k === 'musicEnabled') {
this.checked ? SoundHandler.playAmbient() : SoundHandler.stopAmbient();
}
if (this.checked && k === 'vibrationEnabled') {
navigator.vibrate(100);
}
SoundHandler.play(Sounds.click);
OptionsHandler.save();
});
}
this.initialized = true;
}
private static save() {
localStorage.setItem('options', JSON.stringify(this._options));
}
public static get options(): Options {
if (!this.initialized) {
throw new Error('Uninitialized');
}
return this._options;
}
}