~starkingdoms/starkingdoms

9ed156ba674106ec3e0676fab20b236fd10d2eda — core 2 years ago 5256afe
initial work on pixijs
M starkingdoms-client/package.json => starkingdoms-client/package.json +2 -1
@@ 16,6 16,7 @@
    "vite": "^5.0.0"
  },
  "dependencies": {
    "debug": "^4.3.4"
    "debug": "^4.3.4",
    "pixi.js": "^7.3.2"
  }
}

M starkingdoms-client/src/main.ts => starkingdoms-client/src/main.ts +11 -5
@@ 4,6 4,7 @@ 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();



@@ 11,13 12,15 @@ 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;


@@ 37,14 40,17 @@ export interface GlobalData {
  rendering: GlobalRendering | null;
}

export interface GlobalRendering {
  app: PIXI.Application;
  player_text_map: Map<number, PIXI.Text>;
  planet_sprite_map: Map<number, PIXI.Sprite>;
  part_sprite_map: Map<number, PIXI.Sprite>;
}

export interface GlobalMe {
  username: string;
  part_id: number;
}
export interface GlobalRendering {
  canvas: HTMLCanvasElement;
  ctx: CanvasRenderingContext2D;
}

export const global: GlobalData = {
  client: null,

M starkingdoms-client/src/rendering.ts => starkingdoms-client/src/rendering.ts +56 -119
@@ 1,9 1,9 @@
import * as PIXI from "pixi.js";
import { global, player } from "./main.ts";
import { part_texture, planet_texture } from "./textures.ts";
import { planet_color } from "./planet_colors.ts";
import { part_texture_url, planet_texture_url } from "./textures.ts";

//let t = performance.now();
//let delta = 0.0;
const PART_WIDTH = 25;
const PART_HEIGHT = 25;

export function startRender() {
  // hide the launch popup


@@ 12,125 12,62 @@ export function startRender() {
  document.getElementById("hud")!.classList.remove("hidden");
  // and chat
  document.getElementById("chat")!.classList.remove("hidden");
  // create the canvas
  let canvas = document.createElement("canvas");
  canvas.classList.add("game");
  // append it
  document.getElementById("gamewindow")!.appendChild(canvas);
  let ctx = canvas.getContext("2d")!;
  ctx.canvas.width = window.innerWidth;
  ctx.canvas.height = window.innerHeight;

  window.onresize = () => {
    ctx.canvas.width = window.innerWidth;
    ctx.canvas.height = window.innerHeight;
  };
  let app = new PIXI.Application({
    width: window.innerWidth,
    height: window.innerHeight,
  });
  document
    .getElementById("gamewindow")!
    .appendChild(<HTMLCanvasElement>app.view);
  (<HTMLCanvasElement>app.view).classList.add("game");

  global.rendering = {
    canvas: canvas,
    ctx: ctx,
    app: app,
    player_text_map: new Map(),
    planet_sprite_map: new Map(),
    part_sprite_map: new Map(),
  };
  //t = performance.now();
  //delta = 0.0;
  // start the render loop
  requestAnimationFrame(renderLoop);
}

async function renderLoop(_newT: DOMHighResTimeStamp) {
  //delta = newT - t;
  //t = newT;

  let viewer_size_x = global.rendering?.canvas.width!;
  let viewer_size_y = global.rendering?.canvas.height!;

  global.rendering!.canvas.style.setProperty(
    "background-position",
    `${player()?.transform.x! / 5}px ${-player()?.transform.y! / 5}px`,
  );

  global.rendering!.ctx.setTransform(1, 0, 0, 1, 0, 0);
  global.rendering!.ctx.clearRect(0, 0, viewer_size_x, viewer_size_y);

  // *dont* translate the camera. we're moving everything else around us. cameracentrism.
  // only translation will be to center our core module.

  global.rendering!.ctx.translate(viewer_size_x / 2, viewer_size_y / 2);

  /*
    todo: track indicator
     */

  for (let [_id, planet] of global.planets_map) {
    global.rendering!.ctx.drawImage(
      await planet_texture(planet.planet_type),
      planet.transform.x - planet.radius - player()?.transform.x!, // dx
      planet.transform.y - planet.radius - player()?.transform.y!, // dy
      planet.radius * 2, // dw
      planet.radius * 2, // dh
    );

    global.rendering!.ctx.beginPath();
    global.rendering!.ctx.strokeStyle = planet_color(planet.planet_type);
    global.rendering!.ctx.lineWidth = 5;
    global.rendering!.ctx.moveTo(
      player()!.transform.x - player()!.transform.x,
      player()!.transform.y - player()!.transform.y,
    );
    global.rendering!.ctx.lineTo(
      planet.transform.x - player()!.transform.x,
      planet.transform.y - player()!.transform.y,
    );
    global.rendering!.ctx.stroke();
  }

  for (let [_id, part] of global.parts_map) {
    global.rendering!.ctx.save();

    // x_{screen} = x_{world} - player_{x_{world}}
    // x_{world} = x_{screen} + player_{x_{world}}

    global.rendering!.ctx.translate(
      part.transform.x - player()!.transform.x,
      part.transform.y - player()!.transform.y,
    );

    global.rendering!.ctx.rotate(part.transform.rot);

    global.rendering!.ctx.drawImage(
      await part_texture(part.part_type),
      -25,
      -25,
      50,
      50,
    );

    global.rendering!.ctx.restore();

    // todo: clicked stuff
  }

  for (let [id, username] of global.players_map) {
    let part = global.parts_map.get(id);

    if (part !== undefined) {
      global.rendering!.ctx.save();

      global.rendering!.ctx.translate(
        part!.transform.x - player()!.transform.x,
        part!.transform.y - player()!.transform.y,
      );

      global.rendering!.ctx.textAlign = "center";
      global.rendering!.ctx.font =
        '30px ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"';
      global.rendering!.ctx.fillStyle = "white";
      global.rendering!.ctx.fillText(username, 0, -35);

      global.rendering!.ctx.restore();
  app.ticker.add(() => {
    // RENDER STAGE 1: UPDATE POSITION
    app.stage.setTransform(player()?.transform.x!, player()?.transform.y!);
    // RENDER STAGE 2: UPDATE SPRITES
    for (let [id, planet] of global.planets_map) {
      let planet_sprite;

      if (global.rendering!.planet_sprite_map.has(id)) {
        planet_sprite = global.rendering!.planet_sprite_map.get(id)!;
      } else {
        planet_sprite = PIXI.Sprite.from(
          planet_texture_url(planet.planet_type),
        );
        global.rendering!.app.stage.addChild(planet_sprite);
      }

      planet_sprite.height = planet.radius * 2;
      planet_sprite.width = planet.radius * 2;
      planet_sprite.x = planet.transform.x;
      planet_sprite.y = planet.transform.y;
      planet_sprite.rotation = planet.transform.rot;
    }
  }

  // particles stuff

  requestAnimationFrame(renderLoop);
    // RENDER STAGE 3: UPDATE PARTS
    for (let [id, part] of global.parts_map) {
      let part_sprite;

      if (global.rendering!.part_sprite_map.has(id)) {
        part_sprite = global.rendering!.part_sprite_map.get(id)!;
      } else {
        part_sprite = PIXI.Sprite.from(part_texture_url(part.part_type));
        global.rendering!.app.stage.addChild(part_sprite);

        console.log(part.transform);
        part_sprite.height = PART_HEIGHT;
        part_sprite.width = PART_WIDTH;
        part_sprite.x = part.transform.x;
        part_sprite.y = part.transform.y;
        part_sprite.rotation = part.transform.rot;
      }
    }
  });
}

M starkingdoms-client/src/textures.ts => starkingdoms-client/src/textures.ts +2 -40
@@ 3,54 3,16 @@ import tex_earth from "./assets/earth.svg";
import tex_hearty from "./assets/hearty.svg";
import tex_missing from "./assets/missing.svg";

let planet_textures: Map<PlanetType, HTMLImageElement> = new Map();

function planet_texture_url(type: PlanetType): string {
export function planet_texture_url(type: PlanetType): string {
  if (type == PlanetType.Earth) {
    return tex_earth;
  }
  return tex_missing;
}

export async function planet_texture(
  type: PlanetType,
): Promise<HTMLImageElement> {
  return new Promise((resolve, reject) => {
    if (planet_textures.has(type)) {
      resolve(planet_textures.get(type)!);
    } else {
      let img = new Image();
      img.onload = () => {
        planet_textures.set(type, img);
        resolve(img);
      };
      img.onerror = reject;
      img.src = planet_texture_url(type);
    }
  });
}

let part_textures: Map<PartType, HTMLImageElement> = new Map();

function part_texture_url(type: PartType): string {
export function part_texture_url(type: PartType): string {
  if (type == PartType.Hearty) {
    return tex_hearty;
  }
  return tex_missing;
}

export async function part_texture(type: PartType): Promise<HTMLImageElement> {
  return new Promise((resolve, reject) => {
    if (part_textures.has(type)) {
      resolve(part_textures.get(type)!);
    } else {
      let img = new Image();
      img.onload = () => {
        part_textures.set(type, img);
        resolve(img);
      };
      img.onerror = reject;
      img.src = part_texture_url(type);
    }
  });
}

M starkingdoms-client/yarn.lock => starkingdoms-client/yarn.lock +394 -0
@@ 112,6 112,226 @@
  resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.7.tgz#02c4446f802706098d8e6ee70cf2b7aba96ded0b"
  integrity sha512-gRaP2sk6hc98N734luX4VpF318l3w+ofrtTu9j5L8EQXF+FzQKV6alCOHMVoJJHvVK/mGbwBXfOL1HETQu9IGQ==

"@pixi/accessibility@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/accessibility/-/accessibility-7.3.2.tgz#e823d96a2d032a5bbaccdf547fcf46746bfb865a"
  integrity sha512-MdkU22HTauRvq9cMeWZIQGaDDa86sr+m12rKNdLV+FaDQgP/AhP+qCVpK7IKeJa9BrWGXaYMw/vueij7HkyDSA==

"@pixi/app@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/app/-/app-7.3.2.tgz#7121aaa11ffbf586738e2422db7e12464f6c46e7"
  integrity sha512-3YRFSMvAxDebAz3/JJv+2jzbPkT8cHC0IHmmLRN8krDL1pZV+YjMLgMwN/Oeyv5TSbwNqnrF5su5whNkRaxeZQ==

"@pixi/assets@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/assets/-/assets-7.3.2.tgz#9f460f9939b60d12a6af184bf21978f714876421"
  integrity sha512-yteq6ptAxA09EcwU9D9hl7qr5yWIqy+c2PsXkTDkc76vTAwIamLY3KxLq2aR5y1U4L4O6aHFJd26uNhHcuTPmw==
  dependencies:
    "@types/css-font-loading-module" "^0.0.7"

"@pixi/color@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/color/-/color-7.3.2.tgz#3a9f03ece87ed03748e1ee71658e1fc627c19981"
  integrity sha512-jur5PvdOtUBEUTjmPudW5qdQq6yYGlVGsi3HyhasJw14bN+GKJwiCKgIsyrsiNL5HBUXmje4ICwQohf6BqKqxA==
  dependencies:
    "@pixi/colord" "^2.9.6"

"@pixi/colord@^2.9.6":
  version "2.9.6"
  resolved "https://registry.yarnpkg.com/@pixi/colord/-/colord-2.9.6.tgz#7e4e7851480da6fd3cef4e331f008d60be7e1204"
  integrity sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==

"@pixi/compressed-textures@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/compressed-textures/-/compressed-textures-7.3.2.tgz#2a0f6c809e5bbdfdf4933c47cd261d89f38a9612"
  integrity sha512-J3ENMHDPQO6CJRei55gqI0WmiZJIK6SgsW5AEkShT0aAe5miEBSomv70pXw/58ru+4/Hx8cXjamsGt4aQB2D0Q==

"@pixi/constants@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/constants/-/constants-7.3.2.tgz#185b1fe4e65c936cdd59748111432f0878ee47d9"
  integrity sha512-Q8W3ncsFxmfgC5EtokpG92qJZabd+Dl+pbQAdHwiPY3v+8UNq77u4VN2qtl1Z04864hCcg7AStIYEDrzqTLF6Q==

"@pixi/core@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/core/-/core-7.3.2.tgz#9c72234da688b665325fd5f8362537e0877a2443"
  integrity sha512-Pta3ee8MtJ3yKxGXzglBWgwbEOKMB6Eth+FpLTjL0rgxiqTB550YX6jsNEQQAzcGjCBlO3rC/IF57UZ2go/X6w==
  dependencies:
    "@pixi/color" "7.3.2"
    "@pixi/constants" "7.3.2"
    "@pixi/extensions" "7.3.2"
    "@pixi/math" "7.3.2"
    "@pixi/runner" "7.3.2"
    "@pixi/settings" "7.3.2"
    "@pixi/ticker" "7.3.2"
    "@pixi/utils" "7.3.2"
    "@types/offscreencanvas" "^2019.6.4"

"@pixi/display@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/display/-/display-7.3.2.tgz#5d4005045ebd47db9974327df2f861e95ad84028"
  integrity sha512-cY5AnZ3TWt5GYGx4e5AQ2/2U9kP+RorBg/O30amJ+8e9bFk9rS8cjh/DDq/hc4lql96BkXAInTl40eHnAML5lQ==

"@pixi/events@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/events/-/events-7.3.2.tgz#ff985f7dae291a440298b2d5d91dd63341aa36d7"
  integrity sha512-Moca9epu8jk1wIQCdVYjhz2pD9Ol21m50wvWUKvpgt9yM/AjkCLSDt8HO/PmTpavDrkhx5pVVWeDDA6FyUNaGA==

"@pixi/extensions@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/extensions/-/extensions-7.3.2.tgz#8e5589c534d3866ddae023666891a793b308a256"
  integrity sha512-Qw84ADfvmVu4Mwj+zTik/IEEK9lWS5n4trbrpQCcEZ+Mb8oRAXWvKz199mi1s7+LaZXDqeCY1yr2PHQaFf1KBA==

"@pixi/extract@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/extract/-/extract-7.3.2.tgz#b9a29e147bc1817d0400a7dfcd4fb7dbf972ce41"
  integrity sha512-KsoflvQZV/XD8A8xbtRnmI4reYekbI4MOi7ilwQe5tMz6O1mO7IzrSukxkSMD02f6SpbAqbi7a1EayTjvY0ECQ==

"@pixi/filter-alpha@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/filter-alpha/-/filter-alpha-7.3.2.tgz#7404c5e1a73f148579d32547680a35dcf5a45a67"
  integrity sha512-nZMdn310wH5ZK1slwv3X4qT8eLoAGO7SgYGCy5IsMtpCtNObzE9XA4tAfhXrjihyzPS9KvszgAbnv1Qpfh0/uw==

"@pixi/filter-blur@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/filter-blur/-/filter-blur-7.3.2.tgz#290eb8b464ab3885829918cde38f1b5e10532dc8"
  integrity sha512-unu3zhwHMhN+iAe7Td2rK40i2UJ2GOhzWK+6jcU3ZkMOsFCT5kgBoMRTejeQVcvCs6GoYK8imbkE7mXt05Vj6A==

"@pixi/filter-color-matrix@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/filter-color-matrix/-/filter-color-matrix-7.3.2.tgz#80e6dfb75caa7118e51a39686d46371f3c5f2010"
  integrity sha512-rbyjes/9SMoV9jjPiK0sLMkmLfN8D17GoTJIfq/KLv1x9646W5fL2QSKkN04UkZ+020ndWvIOxK1S97tvRyCfg==

"@pixi/filter-displacement@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/filter-displacement/-/filter-displacement-7.3.2.tgz#648a46b6c3afadc188d4b700834ca722f870338e"
  integrity sha512-ZHl7Sfb8JYd9Z6j96OHCC0NhMKhhXJRE5AbkSDohjEMVCK1BV5rDGAHV8WVt/2MJ/j83CXUpydzyMhdM4lMchg==

"@pixi/filter-fxaa@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/filter-fxaa/-/filter-fxaa-7.3.2.tgz#47c6ac6703284a32570adfe2cbf77bba5295c3cf"
  integrity sha512-9brtlxDnQTZk2XiFBKdBK9e+8CX9LdxxcL7LRpjEyiHuAPvTlQgu9B85LrJ4GzWKqJJKaIIZBzhIoiCLUnfeXg==

"@pixi/filter-noise@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/filter-noise/-/filter-noise-7.3.2.tgz#e5f1ea435611fa1a6f3c5a30f4ce3c86d90cc267"
  integrity sha512-F8GQQ20n7tCjThX6GCXckiXz2YffOCxicTJ0oat9aVDZh+sVsAxYX0aKSdHh0hhv18F0yuc6tPsSL5DYb63xFg==

"@pixi/graphics@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/graphics/-/graphics-7.3.2.tgz#42928e8840c24b4f53882b26c95cbc5ef227bfdb"
  integrity sha512-PhU6j1yub4tH/s+/gqByzgZ3mLv1mfb6iGXbquycg3+WypcxHZn0opFtI/axsazaQ9SEaWxw1m3i40WG5ANH5g==

"@pixi/math@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/math/-/math-7.3.2.tgz#bcf2357d8bfa2a7836d645063b1f854c4a24d745"
  integrity sha512-dutoZ0IVJ5ME7UtYNo2szu4D7qsgtJB7e3ylujBVu7BOP2e710BVtFwFSFV768N14h9H5roGnuzVoDiJac2u+w==

"@pixi/mesh-extras@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/mesh-extras/-/mesh-extras-7.3.2.tgz#fc00a6acb811a0780ce7b54ade844b32d20c9621"
  integrity sha512-s/tg9TsTZZxLEdCDKWnBChDGkc041HCTP7ykJv4fEROzb9B0lskULYyvv+/YNNKa2Ugb9WnkMknpOdOXCpjyyg==

"@pixi/mesh@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/mesh/-/mesh-7.3.2.tgz#e0159b03c1ae60dfba7c8e87f84c4400e4bcc9c7"
  integrity sha512-LFkt7ELYXQLgbgHpjl68j6JD5ejUwma8zoPn2gqSBbY+6pK/phjvV1Wkh76muF46VvNulgXF0+qLIDdCsfrDaA==

"@pixi/mixin-cache-as-bitmap@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-7.3.2.tgz#dc6b53f370444b12e58593aebc87231fff88f20e"
  integrity sha512-bZRlyUN5+9kCUjn67V0IFtYIrbmx9Vs4sMOmXyrX3Q4B4gPLE46IzZz3v0IVaTjp32udlQztfJalIaWbuqgb3A==

"@pixi/mixin-get-child-by-name@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-7.3.2.tgz#59ac446c3c75e096aee8d36bdb72bd4aa1430a4d"
  integrity sha512-mbUi3WxXrkViH7qOgjk4fu2BN36NwNb7u+Fy1J5dS8Bntj57ZVKmEV9PbUy0zYjXE8rVmeAvSu/2kbn5n9UutQ==

"@pixi/mixin-get-global-position@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/mixin-get-global-position/-/mixin-get-global-position-7.3.2.tgz#84efe8bf315e7e1f539435281302c938d98725ab"
  integrity sha512-1nhWbBgmw6rK7yQJxzeI9yjKYYEkM5i3pee8qVu4YWo3b1xWVQA7osQG7aGM/4qywDkXaA1ZvciA5hfg6f4Q5Q==

"@pixi/particle-container@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/particle-container/-/particle-container-7.3.2.tgz#7e2826ea986a1cf2954830eab99b7f8bee4042d7"
  integrity sha512-JYc4j4z97KmxyLp+1Lg0SNi8hy6RxcBBNQGk+CSLNXeDWxx3hykT5gj/ORX1eXyzHh1ZCG1XzeVS9Yr8QhlFHA==

"@pixi/prepare@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/prepare/-/prepare-7.3.2.tgz#d643bbab6df768c52819806a186063ea13bb2c73"
  integrity sha512-aLPAXSYLUhMwxzJtn9m0TSZe+dQlZCt09QNBqYbSi8LZId54QMDyvfBb4zBOJZrD2xAZgYL5RIJuKHwZtFX6lQ==

"@pixi/runner@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/runner/-/runner-7.3.2.tgz#5cd89cba0a604272e7320d292fedca36a681c486"
  integrity sha512-maKotoKJCQiQGBJwfM+iYdQKjrPN/Tn9+72F4WIf706zp/5vKoxW688Rsktg5BX4Mcn7ZkZvcJYTxj2Mv87lFA==

"@pixi/settings@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/settings/-/settings-7.3.2.tgz#6c14babf416d6c9ddb72f07b0c517ae0353a38b6"
  integrity sha512-vtxzuARDTbFe0fRYSqB53B+mPpX7v+QjjnCUmVMVvZiWr3QcngMWVml6c6dQDln7IakWoKZRrNG4FpggvDgLVg==
  dependencies:
    "@pixi/constants" "7.3.2"
    "@types/css-font-loading-module" "^0.0.7"
    ismobilejs "^1.1.0"

"@pixi/sprite-animated@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/sprite-animated/-/sprite-animated-7.3.2.tgz#a35891380b4c0e4029170fe5cbcbbb9edbba07c5"
  integrity sha512-j9pyUe4cefxE9wecNfbWQyL5fBQKvCGYaOA0DE1X46ukBHrIuhA8u3jg2X3N3r4IcbVvxpWFYDrDsWXWeiBmSw==

"@pixi/sprite-tiling@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/sprite-tiling/-/sprite-tiling-7.3.2.tgz#d1c75c7a4ffd7e92a68f95cd4bbb5be0b9eb6c66"
  integrity sha512-tWVVb/rMIx5AczfUrVxa0dZaIufP5C0IOL7IGfFUDQqDu5JSAUC0mwLe4F12jAXBVsqYhCGYx5bIHbPiI5vcSQ==

"@pixi/sprite@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/sprite/-/sprite-7.3.2.tgz#421bea2ccfc51230886e3533d99eeb00e5bf6bf8"
  integrity sha512-IpWTKXExJNXVcY7ITopJ+JW48DahdbCo/81D2IYzBImq3jyiJM2Km5EoJgvAM5ZQ3Ev3KPPIBzYLD+HoPWcxdw==

"@pixi/spritesheet@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/spritesheet/-/spritesheet-7.3.2.tgz#9fd551cef05c2302d1999c895510eeba038350e7"
  integrity sha512-UkwqrPYDqrEdK5ub9qn/9VBvt5caA8ffV5iYR6ssCvrpaQovBKmS+b5pr/BYf8xNTExDpR3OmPIo8iDEYWWLuw==

"@pixi/text-bitmap@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/text-bitmap/-/text-bitmap-7.3.2.tgz#68a7c21ce4174d34e46d4a957d4083f687fed3be"
  integrity sha512-p8KLgtZSPowWU/Zj+GVtfsUT8uGYo4TtKKYbLoWuxkRA5Pc1+4C9/rV/EOSFfoZIdW5C+iFg5VxRgBllUQf+aA==

"@pixi/text-html@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/text-html/-/text-html-7.3.2.tgz#443f669a3444386a62e28dd8f3da66e45593df05"
  integrity sha512-IYhBWEPOvqUtlHkS5/c1Hseuricj5jrrGd21ivcvHmcnK/x2m+CRGvvzeBp1mqoYBnDbQVrD2wSXSe4Dv9tEJA==

"@pixi/text@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/text/-/text-7.3.2.tgz#c38dcecd3b6aceec53b1d4207327812d88b1cf26"
  integrity sha512-LdtNj+K5tPB/0UcDcO52M/C7xhwFTGFhtdF42fPhRuJawM23M3zm1Y8PapXv+mury+IxCHT1w30YlAi0qTVpKQ==

"@pixi/ticker@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/ticker/-/ticker-7.3.2.tgz#898278eb07da4dc4c38cc710c1fff0c7ad5c6099"
  integrity sha512-5kIPhBeXwDJohCzKzJJ6T7f1oAGbHAgeiwOjlTO+9lNXUX8ZPj0407V3syuF+64kFqJzIBCznBRpI+fmT4c9SA==
  dependencies:
    "@pixi/extensions" "7.3.2"
    "@pixi/settings" "7.3.2"
    "@pixi/utils" "7.3.2"

"@pixi/utils@7.3.2":
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/@pixi/utils/-/utils-7.3.2.tgz#556499eae6439259551ab9b86efb039522b61611"
  integrity sha512-KhNvj9YcY7Zi2dTKZgDpx8C6OxKKR541vwtG6JgdBZZYDeMBOIghN2Vi5zn4diW5BhDfHBmdSJ1wZXEtE2MDwg==
  dependencies:
    "@pixi/color" "7.3.2"
    "@pixi/constants" "7.3.2"
    "@pixi/settings" "7.3.2"
    "@types/earcut" "^2.1.0"
    earcut "^2.2.4"
    eventemitter3 "^4.0.0"
    url "^0.11.0"

"@rollup/rollup-android-arm-eabi@4.5.2":
  version "4.5.2"
  resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.5.2.tgz#fa3e9ba323449f098b8d144ecaa4f044d2ff2ee3"


@@ 172,6 392,11 @@
  resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.5.2.tgz#7e59216d929a6b444304000be40c32d2d127fe4f"
  integrity sha512-pL0RXRHuuGLhvs7ayX/SAHph1hrDPXOM5anyYUQXWJEENxw3nfHkzv8FfVlEVcLyKPAEgDRkd6RKZq2SMqS/yg==

"@types/css-font-loading-module@^0.0.7":
  version "0.0.7"
  resolved "https://registry.yarnpkg.com/@types/css-font-loading-module/-/css-font-loading-module-0.0.7.tgz#2f98ede46acc0975de85c0b7b0ebe06041d24601"
  integrity sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q==

"@types/debug@^4.1.12":
  version "4.1.12"
  resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917"


@@ 179,6 404,11 @@
  dependencies:
    "@types/ms" "*"

"@types/earcut@^2.1.0":
  version "2.1.4"
  resolved "https://registry.yarnpkg.com/@types/earcut/-/earcut-2.1.4.tgz#5811d7d333048f5a7573b22ddc84923e69596da6"
  integrity sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==

"@types/ms@*":
  version "0.7.34"
  resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433"


@@ 191,6 421,20 @@
  dependencies:
    undici-types "~5.26.4"

"@types/offscreencanvas@^2019.6.4":
  version "2019.7.3"
  resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz#90267db13f64d6e9ccb5ae3eac92786a7c77a516"
  integrity sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==

call-bind@^1.0.0:
  version "1.0.5"
  resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513"
  integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==
  dependencies:
    function-bind "^1.1.2"
    get-intrinsic "^1.2.1"
    set-function-length "^1.1.1"

debug@^4.3.4:
  version "4.3.4"
  resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"


@@ 198,6 442,20 @@ debug@^4.3.4:
  dependencies:
    ms "2.1.2"

define-data-property@^1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3"
  integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==
  dependencies:
    get-intrinsic "^1.2.1"
    gopd "^1.0.1"
    has-property-descriptors "^1.0.0"

earcut@^2.2.4:
  version "2.2.4"
  resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a"
  integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==

esbuild@^0.19.3:
  version "0.19.7"
  resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.7.tgz#b9a7235097b81278dcf090e2532ed13c95a2ee84"


@@ 226,11 484,67 @@ esbuild@^0.19.3:
    "@esbuild/win32-ia32" "0.19.7"
    "@esbuild/win32-x64" "0.19.7"

eventemitter3@^4.0.0:
  version "4.0.7"
  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
  integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==

fsevents@~2.3.2, fsevents@~2.3.3:
  version "2.3.3"
  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
  integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==

function-bind@^1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
  integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==

get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2:
  version "1.2.2"
  resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b"
  integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==
  dependencies:
    function-bind "^1.1.2"
    has-proto "^1.0.1"
    has-symbols "^1.0.3"
    hasown "^2.0.0"

gopd@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
  integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
  dependencies:
    get-intrinsic "^1.1.3"

has-property-descriptors@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340"
  integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==
  dependencies:
    get-intrinsic "^1.2.2"

has-proto@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
  integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==

has-symbols@^1.0.3:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
  integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==

hasown@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c"
  integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==
  dependencies:
    function-bind "^1.1.2"

ismobilejs@^1.1.0:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/ismobilejs/-/ismobilejs-1.1.1.tgz#c56ca0ae8e52b24ca0f22ba5ef3215a2ddbbaa0e"
  integrity sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==

ms@2.1.2:
  version "2.1.2"
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"


@@ 241,11 555,52 @@ nanoid@^3.3.6:
  resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
  integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==

object-inspect@^1.9.0:
  version "1.13.1"
  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
  integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==

picocolors@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
  integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==

pixi.js@^7.3.2:
  version "7.3.2"
  resolved "https://registry.yarnpkg.com/pixi.js/-/pixi.js-7.3.2.tgz#86f0287a3763e9141691f496e384a2763fb6552c"
  integrity sha512-GJickUrT3UcBInGT1CU6cv2oktCdocE5QM74CD3t+weiJPPWIzleNlp7zrBR5QIDdU6bEO8CUgUXH2Y9QvlCMw==
  dependencies:
    "@pixi/accessibility" "7.3.2"
    "@pixi/app" "7.3.2"
    "@pixi/assets" "7.3.2"
    "@pixi/compressed-textures" "7.3.2"
    "@pixi/core" "7.3.2"
    "@pixi/display" "7.3.2"
    "@pixi/events" "7.3.2"
    "@pixi/extensions" "7.3.2"
    "@pixi/extract" "7.3.2"
    "@pixi/filter-alpha" "7.3.2"
    "@pixi/filter-blur" "7.3.2"
    "@pixi/filter-color-matrix" "7.3.2"
    "@pixi/filter-displacement" "7.3.2"
    "@pixi/filter-fxaa" "7.3.2"
    "@pixi/filter-noise" "7.3.2"
    "@pixi/graphics" "7.3.2"
    "@pixi/mesh" "7.3.2"
    "@pixi/mesh-extras" "7.3.2"
    "@pixi/mixin-cache-as-bitmap" "7.3.2"
    "@pixi/mixin-get-child-by-name" "7.3.2"
    "@pixi/mixin-get-global-position" "7.3.2"
    "@pixi/particle-container" "7.3.2"
    "@pixi/prepare" "7.3.2"
    "@pixi/sprite" "7.3.2"
    "@pixi/sprite-animated" "7.3.2"
    "@pixi/sprite-tiling" "7.3.2"
    "@pixi/spritesheet" "7.3.2"
    "@pixi/text" "7.3.2"
    "@pixi/text-bitmap" "7.3.2"
    "@pixi/text-html" "7.3.2"

postcss@^8.4.31:
  version "8.4.31"
  resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d"


@@ 260,6 615,18 @@ prettier@^3.1.0:
  resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e"
  integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==

punycode@^1.4.1:
  version "1.4.1"
  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
  integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==

qs@^6.11.2:
  version "6.11.2"
  resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9"
  integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==
  dependencies:
    side-channel "^1.0.4"

rollup@^4.2.0:
  version "4.5.2"
  resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.5.2.tgz#2cf0ef0a57cb4038c50a66356684fd30071d0595"


@@ 279,6 646,25 @@ rollup@^4.2.0:
    "@rollup/rollup-win32-x64-msvc" "4.5.2"
    fsevents "~2.3.2"

set-function-length@^1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed"
  integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==
  dependencies:
    define-data-property "^1.1.1"
    get-intrinsic "^1.2.1"
    gopd "^1.0.1"
    has-property-descriptors "^1.0.0"

side-channel@^1.0.4:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
  integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
  dependencies:
    call-bind "^1.0.0"
    get-intrinsic "^1.0.2"
    object-inspect "^1.9.0"

source-map-js@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"


@@ 294,6 680,14 @@ undici-types@~5.26.4:
  resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
  integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==

url@^0.11.0:
  version "0.11.3"
  resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad"
  integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==
  dependencies:
    punycode "^1.4.1"
    qs "^6.11.2"

vite@^5.0.0:
  version "5.0.2"
  resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.2.tgz#3c94627dace83b9bf04b64eaf618038e30fb95c0"