implement import/export settings

This commit is contained in:
prateau 2024-09-21 19:37:08 +02:00
parent 35cd615363
commit 9f04d7d423
12 changed files with 53 additions and 13 deletions

View File

@ -16,6 +16,8 @@
"exportSlotSelect": "Wähle einen Slot zum Exportieren.",
"importRunHistory": "Laufhistorie importieren",
"exportRunHistory": "Laufhistorie exportieren",
"importSettings": "Einstellungen importieren",
"exportSettings": "Einstellungen exportieren",
"importData": "Daten importieren",
"exportData": "Daten exportieren",
"consentPreferences": "Einwilligungspräferenzen",

View File

@ -16,6 +16,8 @@
"exportSlotSelect": "Select a slot to export from.",
"importRunHistory": "Import Run History",
"exportRunHistory": "Export Run History",
"importSettings": "Import Settings",
"exportSettings": "Export Settings",
"importData": "Import Data",
"exportData": "Export Data",
"consentPreferences": "Consent Preferences",

View File

@ -16,6 +16,8 @@
"exportSlotSelect": "Selecciona una ranura para exportar.",
"importRunHistory":"Importar Historial de partida",
"exportRunHistory":"Exportar Historial de partida",
"importSettings": "Importar Configuraciones",
"exportSettings": "Exportar Configuraciones",
"importData": "Importar Datos",
"exportData": "Exportar Datos",
"consentPreferences": "Consentimiento de datos",

View File

@ -18,6 +18,8 @@
"exportData": "Exporter données",
"importRunHistory":"Importer historique",
"exportRunHistory":"Exporter historique",
"importSettings": "Importer paramètres",
"exportSettings": "Exporter paramètres",
"consentPreferences": "Gérer les cookies",
"linkDiscord": "Lier à Discord",
"unlinkDiscord": "Délier Discord",

View File

@ -16,6 +16,8 @@
"exportSlotSelect": "Seleziona uno slot da cui esportare.",
"importRunHistory":"Importa run precedenti",
"exportRunHistory":"Esporta run precedenti",
"importSettings": "Importa impostazioni",
"exportSettings": "Esporta impostazioni",
"importData": "Importa dati",
"exportData": "Esporta dati",
"consentPreferences": "Consenti preferenze",

View File

@ -16,6 +16,8 @@
"exportSlotSelect": "エクスポート元の スロットを 選んでください",
"importRunHistory": "ラン歴をインポート",
"exportRunHistory": "ラン歴をエクスポート",
"importSettings": "Import Settings",
"exportSettings": "Export Settings",
"importData": "データをインポート",
"exportData": "データをエクスポート",
"consentPreferences": "同意設定",

View File

@ -16,6 +16,8 @@
"exportSlotSelect": "내보낼 슬롯을 골라주세요.",
"importRunHistory":"플레이 이력 불러오기",
"exportRunHistory":"플레이 이력 내보내기",
"importSettings": "설정 불러오기",
"exportSettings": "설정 내보내기",
"importData": "데이터 불러오기",
"exportData": "데이터 내보내기",
"consentPreferences": "쿠키 설정 동의",

View File

@ -16,6 +16,8 @@
"exportSlotSelect": "Selecione um slot para exportar.",
"importRunHistory": "Importar Histórico de Jogos",
"exportRunHistory": "Exportar Histórico de Jogos",
"importSettings": "Importar configurações",
"exportSettings": "Exportar configurações",
"importData": "Importar dados",
"exportData": "Exportar dados",
"consentPreferences": "Opções de Privacidade",

View File

@ -16,6 +16,8 @@
"exportSlotSelect": "选择要导出的存档位。",
"importRunHistory":"导入历史记录",
"exportRunHistory":"导出历史记录",
"importSettings": "导入设置",
"exportSettings": "导出设置",
"importData": "导入数据",
"exportData": "导出数据",
"consentPreferences": "同意偏好",

View File

@ -16,6 +16,8 @@
"exportSlotSelect": "選擇要導出的存檔位。",
"importRunHistory":"導入歷史記錄",
"exportRunHistory":"導出歷史記錄",
"importSettings": "導入設置",
"exportSettings": "導出設置",
"importData": "導入數據",
"exportData": "導出數據",
"consentPreferences": "同意偏好",

View File

@ -13,7 +13,7 @@ import { GameModes, getGameMode } from "../game-mode";
import { BattleType } from "../battle";
import TrainerData from "./trainer-data";
import { trainerConfigs } from "../data/trainer-config";
import { SettingKeys, resetSettings, setSetting } from "./settings/settings";
import { Setting, SettingKeys, resetSettings, setSetting, settingIndex } from "./settings/settings";
import { achvs } from "./achv";
import EggData from "./egg-data";
import { Egg } from "../data/egg";
@ -63,16 +63,12 @@ export const defaultStarterSpecies: Species[] = [
const saveKey = "x0i2O7WRiANTqPmZ"; // Temporary; secure encryption is not yet necessary
export function getDataTypeKey(dataType: GameDataType, slotId: integer = 0): string {
export function getDataTypeKey(dataType: GameDataType, slotId: integer = 0, username?: string): string {
switch (dataType) {
case GameDataType.SYSTEM:
return "data";
return `data_${username}`;
case GameDataType.SESSION:
let ret = "sessionData";
if (slotId) {
ret += slotId;
}
return ret;
return `sessionData${slotId || ""}_${username}`;
case GameDataType.SETTINGS:
return "settings";
case GameDataType.TUTORIALS:
@ -80,7 +76,7 @@ export function getDataTypeKey(dataType: GameDataType, slotId: integer = 0): str
case GameDataType.SEEN_DIALOGUES:
return "seenDialogues";
case GameDataType.RUN_HISTORY:
return "runHistoryData";
return `runHistoryData_${username}`;
}
}
@ -1339,7 +1335,7 @@ export class GameData {
public tryExportData(dataType: GameDataType, slotId: integer = 0): Promise<boolean> {
return new Promise<boolean>(resolve => {
const dataKey: string = `${getDataTypeKey(dataType, slotId)}_${loggedInUser?.username}`;
const dataKey: string = getDataTypeKey(dataType, slotId, loggedInUser?.username);
const handleData = (dataStr: string) => {
switch (dataType) {
case GameDataType.SYSTEM:
@ -1370,7 +1366,8 @@ export class GameData {
} else {
const data = localStorage.getItem(dataKey);
if (data) {
handleData(decrypt(data, bypassLogin));
const decryptedData = (dataType === GameDataType.SETTINGS) ? data : decrypt(data, bypassLogin);
handleData(decryptedData);
}
resolve(!!data);
}
@ -1378,7 +1375,7 @@ export class GameData {
}
public importData(dataType: GameDataType, slotId: integer = 0): void {
const dataKey = `${getDataTypeKey(dataType, slotId)}_${loggedInUser?.username}`;
const dataKey = getDataTypeKey(dataType, slotId, loggedInUser?.username);
let saveFile: any = document.getElementById("saveFile");
if (saveFile) {
@ -1421,6 +1418,12 @@ export class GameData {
});
break;
case GameDataType.SETTINGS:
valid = Object.entries(JSON.parse(dataStr))
.every(([k, v]: [string, number]) => {
const index: number = settingIndex(k);
return index === -1 || Setting[index].options.length > v;
});
break;
case GameDataType.TUTORIALS:
valid = true;
break;
@ -1438,7 +1441,8 @@ export class GameData {
this.scene.ui.showText(`Your ${dataName} data will be overridden and the page will reload. Proceed?`, null, () => {
this.scene.ui.setOverlayMode(Mode.CONFIRM, () => {
localStorage.setItem(dataKey, encrypt(dataStr, bypassLogin));
const encryptedData = (dataType === GameDataType.SETTINGS) ? dataStr : encrypt(dataStr, bypassLogin);
localStorage.setItem(dataKey, encryptedData);
if (!bypassLogin && dataType < GameDataType.SETTINGS) {
updateUserInfo().then(success => {

View File

@ -244,6 +244,22 @@ export default class MenuUiHandler extends MessageUiHandler {
},
keepOpen: true
});
manageDataOptions.push({
label: i18next.t("menuUiHandler:importSettings"),
handler: () => {
this.scene.gameData.importData(GameDataType.SETTINGS);
return true;
},
keepOpen: true
});
manageDataOptions.push({
label: i18next.t("menuUiHandler:exportSettings"),
handler: () => {
this.scene.gameData.tryExportData(GameDataType.SETTINGS);
return true;
},
keepOpen: true
});
if (Utils.isLocal || Utils.isBeta) {
manageDataOptions.push({
label: i18next.t("menuUiHandler:importData"),