import createDebug from "debug"; import { ClientHub, hub_connect } from "./hub.ts"; import { ConfigServer, loadConfig } from "./config.ts"; import "./css/style.css"; import "./css/themes/catppuccin-mocha/colors.css"; import { Part, Planet } from "./protocol.ts"; import * as PIXI from "pixi.js"; let config = await loadConfig(); const logger = createDebug("main"); logger( `Hello, world! StarKingdoms ${APP_VERSION} (${COMMIT_HASH}) at your service!`, ); /* if (window.localStorage.getItem("stk-packet-mode") === "debug") { document.getElementById("packet_log")!.classList.remove("log-hidden"); } else { document.getElementById("packet_log")!.remove(); } */ export interface GlobalData { client: ClientHub | null; me: GlobalMe | null; players_map: Map; inverse_players_map: Map; planets_map: Map; parts_map: Map; up: boolean; down: boolean; left: boolean; right: boolean; rendering: GlobalRendering | null; } export interface GlobalRendering { app: PIXI.Application; player_text_map: Map; planet_sprite_map: Map; part_sprite_map: Map; } export interface GlobalMe { username: string; part_id: number; } export const global: GlobalData = { client: null, me: null, players_map: new Map(), inverse_players_map: new Map(), planets_map: new Map(), parts_map: new Map(), up: false, down: false, left: false, right: false, rendering: null, }; export function player(): Part | undefined { if (global.me !== null) { return global.parts_map.get(global.me!.part_id); } else { return undefined; } } const version_string = `StarKingdoms Client ${APP_VERSION} (${COMMIT_HASH})`; document.getElementById("footer-left")!.innerHTML = version_string; document.getElementById("footer-right")!.innerHTML = `Made with by the StarKingdoms team`; // Dropdown stuff const custom_select = document.querySelector(".fm-select")!; const custom_select_btn = ( document.querySelector(".fm-select-button")! ); custom_select_btn.onclick = (e) => { e.stopPropagation(); e.preventDefault(); custom_select.classList.toggle("active"); custom_select_btn.setAttribute( "aria-expanded", custom_select_btn.getAttribute("aria-expanded") === "true" ? "false" : "true", ); }; const selected_value = document.querySelector(".fm-selected-value")!; // Populate the main page server selector let inverse_server_lookup: { [name: string]: string } = {}; const dropdown = document.getElementById("fm-select-dropdown")!; dropdown.innerHTML = ""; for (let server_id in config.servers) { let server: ConfigServer = config.servers[server_id]; if ( server.isDevelopment && window.localStorage.getItem("stk-mode") !== "debug" ) { continue; } let html_text = `
  • `; inverse_server_lookup[server.name] = server_id; dropdown.innerHTML += html_text; if (server.isPrimary) { selected_value.textContent = server.name; } } const options_list = document.querySelectorAll(".fm-select-dropdown li"); options_list.forEach((option) => { function handler(e: Event) { if ( e.type === "click" && (e).clientX !== 0 && (e).clientY !== 0 ) { // @ts-ignore selected_value.textContent = this.children[1].textContent; custom_select.classList.remove("active"); } if (e.type === "keyup") { console.log((e).target!); // @ts-ignore selected_value.textContent = this.textContent; custom_select.classList.remove("active"); } if ( !config.servers[inverse_server_lookup[selected_value.textContent!]] .isProduction ) { document.getElementById("server-danger")!.classList.remove("hidden"); } else { document.getElementById("server-danger")!.classList.add("hidden"); } } // @ts-ignore option.onkeyup = handler; // @ts-ignore option.onclick = handler; }); function setStatus(stat: string) { document.getElementById("launch-btn")!.textContent = stat; } document.getElementById("join-fm")!.onsubmit = async (e) => { e.preventDefault(); setStatus("Connecting..."); (custom_select_btn).disabled = true; (document.getElementById("username")!).disabled = true; try { let server_name = selected_value.textContent!; let server_id = inverse_server_lookup[server_name]; let server: ConfigServer = config.servers[server_id]; let username = (document.getElementById("username")!) .value; logger( `connecting to ${server.clientHubUrl} as ${username} with auth = none`, ); global.client = await hub_connect(server.clientHubUrl, username); } catch (e) { setStatus("Connection failed!"); console.error(e); (custom_select_btn).disabled = false; (document.getElementById("username")!).disabled = false; } };