// The page of a released game (#266): the game view and nothing else, no editor and no sign-in. // Static imports for the same reason as in `main.ts`: Pixi only knows the render pipes that exist // when the renderer is created. import type { Ticker } from 'pixi.js'; import { deserializeProject } from './core/store/serialize'; import { loadReleasedGame } from './core/store/HttpReleaseStore'; import { releaseToken } from './core/store/ReleaseStore'; import { saveArea } from './editor/saves'; import { createPage, showFailure } from './page'; import { GameScreen } from './player/GameScreen'; import { installPlayerHook } from './player/playerHook'; import { Player } from './player/Player'; import { ui } from './ui'; import { projectPictureFactory } from './viewport/generatedPictures'; import { preloadProjectFiles, setUpProjectFiles } from './viewport/projectFiles'; import { textureLibrary } from './viewport/TextureLibrary'; import { createEmptyProject } from './core/model/Project'; const API_ENDPOINT = '/game-maker/api/index.php'; async function main(): Promise { const params = new URLSearchParams(location.search); const { app, root } = await createPage(params); // Every key belongs to the game, Tab included: there is nothing else on the page to move to. ui().focus.tabBelongsElsewhere = () => true; setUpProjectFiles(app.renderer); const source = { project: createEmptyProject('', ''), on: () => {} }; const screen = new GameScreen(source); root.add(screen, 1); root.resize(app.screen.width, app.screen.height); let player: Player | null = null; installPlayerHook(screen, () => player); const token = releaseToken(location.search); if (!token) { screen.say('This link does not lead to a game.'); return; } screen.say('Loading…'); let game; try { game = await loadReleasedGame(API_ENDPOINT, token); } catch (error) { console.error('[release]', error); screen.say('This game is not available.'); return; } const project = deserializeProject(game.project, token); source.project = project; document.title = project.name || 'Game'; textureLibrary.setPictureFactory(projectPictureFactory(() => project)); preloadProjectFiles(project); const loaded = new Player(project, screen, saveArea(token, 'release')); player = loaded; app.ticker.add((ticker: Ticker) => loaded.tick(ticker.deltaMS / 1000)); // A key starts the game as well as a click does: both count as the gesture sound waits for. window.addEventListener('keydown', (e) => { if ((e.key === 'Enter' || e.key === ' ') && screen.canStart) loaded.start(); }); await loaded.prepare(); } main().catch(showFailure);