diff --git a/src/locales/de/menu-ui-handler.json b/src/locales/de/menu-ui-handler.json index 93c3f4c38e8..ee3c704b891 100644 --- a/src/locales/de/menu-ui-handler.json +++ b/src/locales/de/menu-ui-handler.json @@ -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", diff --git a/src/locales/en/menu-ui-handler.json b/src/locales/en/menu-ui-handler.json index 0536fa12c2e..0fc9115444b 100644 --- a/src/locales/en/menu-ui-handler.json +++ b/src/locales/en/menu-ui-handler.json @@ -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", diff --git a/src/locales/es/menu-ui-handler.json b/src/locales/es/menu-ui-handler.json index c906324cdbf..fc870d0d829 100644 --- a/src/locales/es/menu-ui-handler.json +++ b/src/locales/es/menu-ui-handler.json @@ -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", diff --git a/src/locales/fr/menu-ui-handler.json b/src/locales/fr/menu-ui-handler.json index b8627bf91b5..a46794c17a5 100644 --- a/src/locales/fr/menu-ui-handler.json +++ b/src/locales/fr/menu-ui-handler.json @@ -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", diff --git a/src/locales/it/menu-ui-handler.json b/src/locales/it/menu-ui-handler.json index 7776825f1fe..b190fa9df32 100644 --- a/src/locales/it/menu-ui-handler.json +++ b/src/locales/it/menu-ui-handler.json @@ -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", diff --git a/src/locales/ja/menu-ui-handler.json b/src/locales/ja/menu-ui-handler.json index 851c8478e9d..d6d216957da 100644 --- a/src/locales/ja/menu-ui-handler.json +++ b/src/locales/ja/menu-ui-handler.json @@ -16,6 +16,8 @@ "exportSlotSelect": "エクスポート元の スロットを 選んでください", "importRunHistory": "ラン歴をインポート", "exportRunHistory": "ラン歴をエクスポート", + "importSettings": "Import Settings", + "exportSettings": "Export Settings", "importData": "データをインポート", "exportData": "データをエクスポート", "consentPreferences": "同意設定", diff --git a/src/locales/ko/menu-ui-handler.json b/src/locales/ko/menu-ui-handler.json index 7fecbf7c25f..c64f8402636 100644 --- a/src/locales/ko/menu-ui-handler.json +++ b/src/locales/ko/menu-ui-handler.json @@ -16,6 +16,8 @@ "exportSlotSelect": "내보낼 슬롯을 골라주세요.", "importRunHistory":"플레이 이력 불러오기", "exportRunHistory":"플레이 이력 내보내기", + "importSettings": "설정 불러오기", + "exportSettings": "설정 내보내기", "importData": "데이터 불러오기", "exportData": "데이터 내보내기", "consentPreferences": "쿠키 설정 동의", diff --git a/src/locales/pt_BR/menu-ui-handler.json b/src/locales/pt_BR/menu-ui-handler.json index df654976d68..265f583a689 100644 --- a/src/locales/pt_BR/menu-ui-handler.json +++ b/src/locales/pt_BR/menu-ui-handler.json @@ -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", diff --git a/src/locales/zh_CN/menu-ui-handler.json b/src/locales/zh_CN/menu-ui-handler.json index c8ecaa6dd98..74a2145a976 100644 --- a/src/locales/zh_CN/menu-ui-handler.json +++ b/src/locales/zh_CN/menu-ui-handler.json @@ -16,6 +16,8 @@ "exportSlotSelect": "选择要导出的存档位。", "importRunHistory":"导入历史记录", "exportRunHistory":"导出历史记录", + "importSettings": "导入设置", + "exportSettings": "导出设置", "importData": "导入数据", "exportData": "导出数据", "consentPreferences": "同意偏好", diff --git a/src/locales/zh_TW/menu-ui-handler.json b/src/locales/zh_TW/menu-ui-handler.json index cbb5b604d33..9408cb78b15 100644 --- a/src/locales/zh_TW/menu-ui-handler.json +++ b/src/locales/zh_TW/menu-ui-handler.json @@ -16,6 +16,8 @@ "exportSlotSelect": "選擇要導出的存檔位。", "importRunHistory":"導入歷史記錄", "exportRunHistory":"導出歷史記錄", + "importSettings": "導入設置", + "exportSettings": "導出設置", "importData": "導入數據", "exportData": "導出數據", "consentPreferences": "同意偏好", diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 04fef4a81da..89733468dd9 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -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 { return new Promise(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 => { diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index 0af527e518f..0dde9fc9b65 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -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"),