diff --git a/package.json b/package.json index d13f4b8..54cf5e6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "elementipelago", "private": true, - "version": "0.0.0", + "version": "1.0.0", "type": "module", "scripts": { "dev": "vite", diff --git a/src/consts.js b/src/consts.js index 6d91d3a..8ea4b8b 100644 --- a/src/consts.js +++ b/src/consts.js @@ -1,3 +1,9 @@ export const LOCATION_AMOUNT = 2000; export const INTERMEDIATE_AMOUNT = 1000; export const NON_ELEMENT_ITEMS = 100; + +export const APWORLD_VERSIONS = ["0.3.x", "1.x.x"]; + +export const APWORLD_VERSION_REGEX = new RegExp( + APWORLD_VERSIONS.map((s) => `^(${s.replace("x", "\\d+")}-?.*)`).join("|"), +); diff --git a/src/lib/Login.svelte b/src/lib/Login.svelte index 7e8ff8b..0d012fe 100644 --- a/src/lib/Login.svelte +++ b/src/lib/Login.svelte @@ -2,7 +2,9 @@ import { get } from "svelte/store"; import { apclient, slotdata } from "./stores/apclient.svelte"; import { LoginError } from "archipelago.js"; + import { APWORLD_VERSION_REGEX, APWORLD_VERSIONS } from "../consts"; + /** @import { SlotData } from "./stores/apclient.svelte"; */ export let onSubmit; let host = localStorage.getItem("ap.host") ?? "archipelago.gg:38281"; @@ -19,12 +21,20 @@ localStorage.setItem("ap.host", host); localStorage.setItem("ap.slot", slot); localStorage.setItem("ap.password", password); + + /** @type SlotData */ const response = await get(apclient).login( host, slot, "Elementipelago", password != "" ? { password: password } : {}, ); + if (!APWORLD_VERSION_REGEX.test(response.version)) { + throw new Error( + `AP world version '${response.version}' is not supported.\n Supported versions include: ${APWORLD_VERSIONS}`, + ); + } + slotdata.set(response); onSubmit(); } catch (e) { diff --git a/src/lib/stores/apclient.svelte.js b/src/lib/stores/apclient.svelte.js index 8c254a3..a629731 100644 --- a/src/lib/stores/apclient.svelte.js +++ b/src/lib/stores/apclient.svelte.js @@ -23,9 +23,21 @@ import { sendElementToasts, sendUpgradeToasts } from "./toast"; player: string, game: string, }} ElementData + + * @typedef {{ + element_amount: number, + intermediate_amount: number, + filler_amount: number, + compound_amount: number, + compounds_are_ingredients: number, + graph_seed: number, + version: string, + * }} SlotData */ export const apclient = writable(new Client()); + +/** @type {Writable} */ export const slotdata = writable(null); /** * @type {Writable}