Spaces:
Sleeping
Sleeping
| import Phaser from "phaser"; | |
| import { PixelCityScene } from "./PixelCityScene"; | |
| import { demoNew } from "../evgrid/api"; | |
| type StartArgs = { | |
| mountId: string; | |
| statusEl: HTMLPreElement; | |
| eventEl: HTMLPreElement; | |
| btnNew: HTMLButtonElement; | |
| btnStep: HTMLButtonElement; | |
| btnRun: HTMLButtonElement; | |
| modeEl: HTMLSelectElement; | |
| followEl: HTMLInputElement; | |
| loraEl: HTMLInputElement; | |
| }; | |
| export function startGame(args: StartArgs) { | |
| const mount = document.getElementById(args.mountId); | |
| if (!mount) throw new Error(`Mount element not found: ${args.mountId}`); | |
| const ui = { | |
| statusEl: args.statusEl, | |
| eventEl: args.eventEl, | |
| modeEl: args.modeEl, | |
| followEl: args.followEl, | |
| loraEl: args.loraEl, | |
| }; | |
| const config: Phaser.Types.Core.GameConfig = { | |
| type: Phaser.AUTO, | |
| parent: mount, | |
| width: 1280, | |
| height: 720, | |
| backgroundColor: "#070911", | |
| pixelArt: true, | |
| antialias: false, | |
| physics: { default: "arcade" }, | |
| scale: { | |
| mode: Phaser.Scale.FIT, | |
| autoCenter: Phaser.Scale.CENTER_BOTH, | |
| }, | |
| scene: [PixelCityScene], | |
| }; | |
| const game = new Phaser.Game(config); | |
| game.scene.start("PixelCityScene", { ui }); | |
| const scene = () => game.scene.getScene("PixelCityScene") as PixelCityScene; | |
| const seedRand = () => Math.floor(Math.random() * 10_000); | |
| args.btnNew.onclick = async () => { | |
| try { | |
| const res = await demoNew(seedRand()); | |
| await scene().bindSession(res.session_id, res.station_nodes); | |
| } catch (e: any) { | |
| ui.statusEl.textContent = String(e?.message || e); | |
| } | |
| }; | |
| args.btnStep.onclick = async () => { | |
| try { | |
| await scene().stepOnce(); | |
| } catch (e: any) { | |
| ui.statusEl.textContent = String(e?.message || e); | |
| } | |
| }; | |
| args.btnRun.onclick = async () => { | |
| try { | |
| for (let i = 0; i < 60; i++) { | |
| // eslint-disable-next-line no-await-in-loop | |
| await scene().stepOnce(); | |
| // brief pacing so camera movement is visible | |
| // eslint-disable-next-line no-await-in-loop | |
| await new Promise((r) => setTimeout(r, 90)); | |
| } | |
| } catch (e: any) { | |
| ui.statusEl.textContent = String(e?.message || e); | |
| } | |
| }; | |
| } | |