Profectus/src/game/settings.ts

100 lines
3.1 KiB
TypeScript
Raw Normal View History

2022-03-04 03:39:48 +00:00
import projInfo from "data/projInfo.json";
import { Themes } from "data/themes";
import { CoercableComponent } from "features/feature";
import { globalBus } from "game/events";
import LZString from "lz-string";
2022-03-04 03:39:48 +00:00
import { hardReset } from "util/save";
import { reactive, watch } from "vue";
2022-01-14 04:25:47 +00:00
export interface Settings {
active: string;
saves: string[];
showTPS: boolean;
theme: Themes;
unthrottled: boolean;
}
const state = reactive<Partial<Settings>>({
active: "",
saves: [],
showTPS: true,
2021-09-06 00:13:56 +00:00
theme: Themes.Nordic,
unthrottled: false
});
2022-01-14 04:25:47 +00:00
watch(
state,
state => {
let stringifiedSettings = JSON.stringify(state);
switch (projInfo.saveEncoding) {
default:
console.warn(`Unknown save encoding: ${projInfo.saveEncoding}. Defaulting to lz`);
case "lz":
stringifiedSettings = LZString.compressToUTF16(stringifiedSettings);
break;
case "base64":
stringifiedSettings = btoa(unescape(encodeURIComponent(stringifiedSettings)));
break;
case "plain":
break;
}
localStorage.setItem(projInfo.id, stringifiedSettings);
},
2022-01-14 04:25:47 +00:00
{ deep: true }
);
export default window.settings = state as Settings;
export function loadSettings(): void {
try {
let item: string | null = localStorage.getItem(projInfo.id);
if (item != null && item !== "") {
if (item[0] === "{") {
// plaintext. No processing needed
} else if (item[0] === "e") {
// Assumed to be base64, which starts with e
item = decodeURIComponent(escape(atob(item)));
} else if (item[0] === "ᯡ") {
// Assumed to be lz, which starts with ᯡ
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
item = LZString.decompressFromUTF16(item)!;
} else {
console.warn("Unable to determine settings encoding", item);
return;
}
const settings = JSON.parse(item);
if (typeof settings === "object") {
Object.assign(state, settings);
}
}
2022-01-14 04:25:47 +00:00
globalBus.emit("loadSettings", state);
// eslint-disable-next-line no-empty
} catch {}
}
export const hardResetSettings = (window.hardResetSettings = () => {
2022-01-14 04:25:47 +00:00
const settings = {
active: "",
saves: [],
showTPS: true,
theme: Themes.Nordic
2022-01-14 04:25:47 +00:00
};
globalBus.emit("loadSettings", settings);
Object.assign(state, settings);
hardReset();
});
export const settingFields: CoercableComponent[] = reactive([]);
export function registerSettingField(component: CoercableComponent) {
settingFields.push(component);
}
2022-03-11 22:38:49 +00:00
export const infoComponents: CoercableComponent[] = reactive([]);
export function registerInfoComponent(component: CoercableComponent) {
infoComponents.push(component);
}
2022-03-20 04:59:52 +00:00
export const gameComponents: CoercableComponent[] = reactive([]);
export function registerGameComponent(component: CoercableComponent) {
gameComponents.push(component);
}