Skip to content

Conversation

@Inglan
Copy link
Member

@Inglan Inglan commented Sep 18, 2025

Summary by CodeRabbit

  • New Features

    • Added “Toy Defence” game.
    • Introduced a “Focus Game” control with tooltip to assist keyboard input; fullscreen now also auto-focuses the game.
  • Improvements

    • Removed tags display from Games and History tables for a cleaner UI.
    • Updated tracker dialog copy and added technical details.
    • Switched analytics endpoint to improve reliability.
    • Pruned mirrors list (removed deprecated Firebase mirrors).
  • Chores

    • Removed Firebase config and hosting deployment from workflows; no more global CLI install.
    • Updated dependencies (@lucide/svelte, @sveltejs/kit, dayjs).

dependabot bot and others added 28 commits September 8, 2025 12:34
Bumps [dayjs](https://github.com/iamkun/dayjs) from 1.11.13 to 1.11.18.
- [Release notes](https://github.com/iamkun/dayjs/releases)
- [Changelog](https://github.com/iamkun/dayjs/blob/v1.11.18/CHANGELOG.md)
- [Commits](iamkun/dayjs@v1.11.13...v1.11.18)

---
updated-dependencies:
- dependency-name: dayjs
  dependency-version: 1.11.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
…/dayjs-1.11.18

Bump dayjs from 1.11.13 to 1.11.18
Bumps [@sveltejs/kit](https://github.com/sveltejs/kit/tree/HEAD/packages/kit) from 2.36.3 to 2.39.1.
- [Release notes](https://github.com/sveltejs/kit/releases)
- [Changelog](https://github.com/sveltejs/kit/blob/main/packages/kit/CHANGELOG.md)
- [Commits](https://github.com/sveltejs/kit/commits/@sveltejs/kit@2.39.1/packages/kit)

---
updated-dependencies:
- dependency-name: "@sveltejs/kit"
  dependency-version: 2.39.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [@lucide/svelte](https://github.com/lucide-icons/lucide/tree/HEAD/packages/svelte) from 0.515.0 to 0.544.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/0.544.0/packages/svelte)

---
updated-dependencies:
- dependency-name: "@lucide/svelte"
  dependency-version: 0.544.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Inglan <96573515+Inglan@users.noreply.github.com>
Remove tags and links from games to simplify adding new games
…/lucide/svelte-0.544.0

Bump @lucide/svelte from 0.515.0 to 0.544.0
…/sveltejs/kit-2.39.1

Bump @sveltejs/kit from 2.36.3 to 2.39.1
@Inglan Inglan requested a review from nathblade16 September 18, 2025 06:13
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Sep 18, 2025

Walkthrough

This PR removes Firebase hosting/configuration and deployment steps, updates analytics endpoints and tracker dialog copy, restructures game data to drop tags/links, adds a “Focus Gmae” UI behavior in the Play component, updates dependencies, prunes Firebase mirrors, and introduces the “Toy Defence” game with associated static assets and configs.

Changes

Cohort / File(s) Summary
Firebase removal
/.firebaserc, /firebase.json, /.github/workflows/deploy.yml, /.github/workflows/beta_deploy.yml
Deleted Firebase project/config files; removed Firebase Hosting deploy step; stopped installing global firebase-tools in workflows.
Dependencies
/package.json
Bumped @lucide/svelte, @sveltejs/kit, and dayjs versions.
Analytics host and dialog copy
/src/lib/analytics.ts, /src/lib/components/tracker-dialog.svelte
Switched PostHog API/static URLs to hog.edutools.ingo.au; adjusted tracker dialog text and added “Technical info” details block.
Play component focus UX
/src/lib/components/play.svelte
Added Tooltip and a “Focus Gmae” trigger; on click, shows toast and focuses the iframe; fullscreen now also focuses iframe; restructured header/tags area.
Game data model (remove tags/links)
/src/lib/gmaes.ts, /src/routes/g/columns.ts, /src/routes/history/columns.ts, /src/routes/g/tags.svelte (deleted), /src/routes/history/tags.svelte (deleted)
Removed tags/links fields and related UI columns/components; updated exported types to ParsedGmae[]; added “Toy Defence” entry.
Mirrors list
/src/routes/mirrors/mirrors.config.ts
Removed two Firebase-based mirrors.
New game: Toy Defence assets
/static/_app/tools/toy-defence/*
Added source marker, verification file, and multiple JSON assets (bonuses, bullets, notifications, perks, soundmanager, tooltip, towers, towers_bar, towers_hierarchy, worlds, units_world_01).

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor U as User
  participant P as Play.svelte
  participant I as Game Iframe
  participant B as Browser Fullscreen API
  participant T as Toast

  U->>P: Click "Focus Gmae"
  P->>T: Show "Focused on gmae"
  P->>I: iframe.focus()

  rect rgba(200,230,255,0.25)
  note right of P: Fullscreen action (on user request)
  U->>P: Click Fullscreen
  P->>B: requestFullscreen()
  B-->>P: Promise resolved
  P->>I: iframe.focus()
  end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • remove firebase #491 — Removes Firebase configuration and hosting deployment; overlaps with this PR’s deletion of Firebase files and workflow steps.
  • add toy defence #493 — Adds the Toy Defence game and static assets; matches the new gmae entry and added files under static/_app/tools/toy-defence.
  • fix gmae focus #506 — Implements Play component focus fixes; aligns with this PR’s new “Focus Gmae” control and iframe focus behavior.

Suggested reviewers

  • nathblade16

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The title succinctly captures two primary changes—removal of Firebase deployments and dependency updates—which are reflected in the diff (deleted .firebaserc and firebase.json, removed Firebase hosting deploy step, and package.json bumps); it also includes "fixes", a generic term that is not misleading but lacks detail. The title is concise and related to real parts of the changeset, though it does not call out other notable additions (new Toy Defence assets and analytics host change) that a more specific title could surface.
✨ Finishing touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch main

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cloudflare-workers-and-pages
Copy link

cloudflare-workers-and-pages bot commented Sep 18, 2025

Deploying edutools-testing with  Cloudflare Pages  Cloudflare Pages

Latest commit: d73daa1
Status: ✅  Deploy successful!
Preview URL: https://0d138b5d.edutools-testing.pages.dev
Branch Preview URL: https://main.edutools-testing.pages.dev

View logs

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/deploy.yml (1)

50-51: Avoid deploying to production if earlier steps failed.

Running the FTP deploy unconditionally can push broken builds.

-      - name: Deploy to Infinityfree
-        if: always()
+      - name: Deploy to Infinityfree
+        if: ${{ success() }}

Optional: reduce job permissions from write-all to least‑privilege (e.g., contents: write).

🧹 Nitpick comments (21)
.github/workflows/beta_deploy.yml (1)

28-29: Make installs reproducible; consider action updates/caching.

Pin installs to the lockfile; optional: upgrade checkout to v4 and enable pnpm cache for speed.

Apply this diff for reproducible installs:

-          pnpm install
+          pnpm install --frozen-lockfile

Optional (outside this hunk):

  • Use actions/checkout@v4.
  • Add actions/setup-node@v4 with cache: 'pnpm'.
src/lib/analytics.ts (1)

11-14: Don’t hardcode the analytics host; read from PUBLIC env and reuse.

Centralize the host so UI text and detection stay in sync across environments; avoids future hardcoded drift and eases staging.

Apply:

+import { PUBLIC_POSTHOG_HOST } from '$env/static/public';
+const POSTHOG_API_HOST = PUBLIC_POSTHOG_HOST || 'https://hog.edutools.ingo.au';
@@
-    api_host: 'https://hog.edutools.ingo.au',
+    api_host: POSTHOG_API_HOST,
@@
-    await fetch('https://hog.edutools.ingo.au/static/exception-autocapture.js');
+    await fetch(`${POSTHOG_API_HOST}/static/exception-autocapture.js`);

Follow‑up:

  • Confirm CORS headers are set on ${POSTHOG_API_HOST} for static assets and that TLS is valid.

Also applies to: 21-21

.github/workflows/deploy.yml (1)

22-23: Lock dependency installs to the lockfile.

Prevents surprise upgrades during deploys.

-          pnpm install
+          pnpm install --frozen-lockfile
src/lib/components/tracker-dialog.svelte (1)

22-25: Use the centralized analytics host instead of a hardcoded string.

Keeps user‑facing copy consistent with analytics.ts across environments.

-				<summary>Techinal info</summary>
-				<p>We detected that hog.edutools.ingo.au is blocked by your ad/tracker blocker</p>
+				<summary>Techinal info</summary>
+				<p>We detected that {ANALYTICS_HOST} is blocked by your ad/tracker blocker</p>

And at the top:

-import { trackerDialogClosed } from '$lib/analytics';
+import { trackerDialogClosed, ANALYTICS_HOST } from '$lib/analytics';

(Export ANALYTICS_HOST from analytics.ts as shown in its review.)

package.json (1)

18-18: Add packageManager & engines; regenerate and commit pnpm-lock.yaml

  • Add to package.json (top-level):
   "private": true,
   "version": "0.0.1",
   "type": "module",
+  "packageManager": "pnpm@9",
+  "engines": { "node": ">=20.10" },
  • pnpm-lock.yaml is present; run pnpm install to regenerate the lockfile after these bumps and commit the updated pnpm-lock.yaml.
static/_app/tools/toy-defence/data/game/perks.json (2)

1-1: Format JSON with Prettier (repo guideline).

This file is a single long line; please run Prettier so diffs remain readable and consistent with the repo rules.


1-1: Spot-check: icon_16 maps to “14” assets.

icon_16 uses tower_button_14.png and icons_hero_14.png. If that’s intentional, ignore; otherwise align names to avoid mismatches in UI.

static/_app/tools/toy-defence/data/game/tooltip.json (1)

8-10: Confirm newline escape is intended.

The string uses “/n/n”. If the loader expects actual newlines, this should likely be “\n\n”. Please confirm.

- "text": "…улучшать./n/nНажмите, чтобы продолжить.",
+ "text": "…улучшать.\n\nНажмите, чтобы продолжить.",
src/lib/components/play.svelte (2)

2-2: Type props to satisfy svelte-check.

-	let { id } = $props();
+	let { id }: { id: string } = $props();

71-72: Bind the iframe instead of querying the DOM repeatedly.

This improves robustness and avoids selecting an unintended iframe if more are added.

-	<iframe src={gmaedata?.url} frameborder="0" class="grow rounded-lg" title={gmaedata?.name}
-	></iframe>
+	<iframe
+		bind:this={iframeEl}
+		src={gmaedata?.url}
+		frameborder="0"
+		class="grow rounded-lg"
+		title={gmaedata?.name}
+	></iframe>

Add near the top of the script:

+	let iframeEl: HTMLIFrameElement | null = null;

Then replace usages:

-								document.querySelector('iframe')?.focus();
+								iframeEl?.focus();
-					document.querySelector('iframe')?.requestFullscreen();
-					document.querySelector('iframe')?.focus();
+					iframeEl?.requestFullscreen();
+					iframeEl?.focus();
-					const iframe = document.querySelector('iframe');
-					if (iframe && gmaedata?.url) {
-						iframe.src = gmaedata.url;
-					}
+					if (iframeEl && gmaedata?.url) {
+						iframeEl.src = gmaedata.url;
+					}

Also applies to: 118-121

static/_app/tools/toy-defence/data/game/notifications.json (1)

313-335: Empty title override — confirm loader behavior.

This item overrides title with an empty object after copy: "|common_item". Ensure your JSON merge/override logic treats this as “no title” and doesn’t break rendering.

src/lib/gmaes.ts (1)

1-1: Minor import cleanup (optional).

You import generate and generate as generateId from './idgen' but only use generateId. Consider removing the duplicate import.

-import { generate, generate as generateId } from './idgen';
+import { generate as generateId } from './idgen';
static/_app/tools/toy-defence/data/game/towers_hierarchy.json (1)

1-399: Format JSON with Prettier.

Large data blob — please pretty‑print to keep diffs manageable.

static/_app/tools/toy-defence/data/game/worlds/units_world_01.json (2)

311-349: Zero-dimension cannon rects — confirm engine semantics.

Several cannons use rect: "0 0 0 0". If that indicates invisible emitters, fine; otherwise rendering may fail.


1-597: General asset verification and formatting.

  • Verify all enemies_* textures, tracks, and wrecks exist.
  • Run Prettier for consistency.
static/_app/tools/toy-defence/data/game/bullets.json (1)

103-136: Possible stat inconsistency (heavy-left/right vs heavy)

enemy_tank_heavy has power "400" and range "20", while enemy_tank_heavy_left/right have power "36" and range "10". If these are side-guns this may be intentional; otherwise looks like a zero-missing typo. Please confirm intended balance.

static/_app/tools/toy-defence/data/game/towers.json (2)

1-39: Reference to game/game.xml: verify extension/provenance

"floating.copy" points to game/game.xml|hit_floating. If XML assets were removed/renamed to JSON mirrors, this will break. Please confirm the target exists or migrate the reference.


40-739: Cross-file integrity — all tower bullet_name keys present; unused bullets found in bullets.json

All bullet_name values referenced in static/_app/tools/toy-defence/data/game/towers.json exist in static/_app/tools/toy-defence/data/game/bullets.json.

Unused keys in static/_app/tools/toy-defence/data/game/bullets.json: enemy_airship, enemy_bomber, enemy_car, enemy_soldier, enemy_tank_heavy, enemy_tank_heavy_left, enemy_tank_heavy_right, enemy_tank_light, feast2_enemy_soldier. Remove or confirm these entries.

static/_app/tools/toy-defence/data/game/towers_bar.json (1)

3-8: Newline escape marker "/n": confirm renderer expects it

Tips use "/n" within strings (e.g., "Стрелок./nСтреляет..."). If your renderer expects "\n", these won’t break lines. Please confirm the UI engine’s newline convention.

static/_app/tools/toy-defence/data/game/worlds.json (2)

2-7: Numeric literal with leading dot: change ".2" → "0.2"

cooperation_bonus is ".2". Many parsers reject leading-dot numbers. Recommend "0.2".

Apply:

-    "cooperation_bonus": ".2"
+    "cooperation_bonus": "0.2"

369-400: Button caption empty: confirm it’s filled at runtime

my_btn.caption.string is "", presumably set dynamically. If not, button may render blank.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 931a726 and d73daa1.

⛔ Files ignored due to path filters (266)
  • package-lock.json is excluded by !**/package-lock.json
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • static/_app/tools/toy-defence/favicon.ico is excluded by !**/*.ico
  • static/_app/tools/toy-defence/images/1.5/comics/anim.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/comics/back.jpg is excluded by !**/*.jpg
  • static/_app/tools/toy-defence/images/1.5/common/buttons/button_close.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/buttons/button_confirm_no.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/buttons/button_medium_long.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/buttons/button_medium_square.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/buttons/button_shop_small.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/checkbox.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/hint_arrow.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/hint_hand.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons/achievements.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons/action.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons/back.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons/button_leaders_ico.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons/ch_mission.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons/credits_big.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons/fullscreen.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons/ico_no.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons/ico_yes_red.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons/main_menu.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons/more_games.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons/next.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons/options.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons/restart.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons/shop.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_0.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_10.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_11.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_12.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_13.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_14.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_15.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_16.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_17.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_18.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_19.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_20.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_21.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_4.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_5.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_6.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_7.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_8.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/icons_perks_9.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/notifications_10.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/notifications_11.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/notifications_12.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/notifications_13.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/notifications_14.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/notifications_15.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/notifications_16.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/notifications_17.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/notifications_18.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/notifications_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/notifications_4.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/notifications_5.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/notifications_6.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/notifications_7.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/notifications_8.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/notifications_9.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/scroll_bg.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/scroll_point.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/tile.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/tile_shadow.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/common/tower_hint.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/dialogs/achives.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/dialogs/ingame.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/dialogs/loose.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/dialogs/message.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/dialogs/new_game.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/dialogs/notification.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/dialogs/options.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/dialogs/tooltip.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/dialogs/win.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/flags/cz.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/flags/de.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/flags/en.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/flags/es.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/flags/fr.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/flags/it.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/flags/nl.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/flags/pt.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/flags/ru.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/flags/sv.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/flags/tr.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/fonts/font_shilda.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/fonts/font_shilda1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/fonts/font_shilda1_disabled.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/fonts/number_font.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/fonts/number_font_small.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/fonts/soldier_font1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/fonts/soldier_font3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/fonts/soldier_font4.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/fonts/soldier_font4_small.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/fonts/soldier_font5.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/fonts/soldier_font5_rect.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/fonts/soldier_font6.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/bullets/bullets_0.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/bullets/bullets_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/bullets/bullets_2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/bullets/bullets_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/bullets/bullets_4.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/bullets/bullets_5.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/animation/burning.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_10.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_11.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_12.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_13.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_14.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_15.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_16.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_17.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_18.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_19.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_20.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_21.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_22.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_23.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_24.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_25.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_26.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_27.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_28.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_5.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_8.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/enemies/enemies_9.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_0.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_10.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_11.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_12.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_13.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_14.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_15.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_16.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_4.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_5.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_6.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_7.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_8.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_9.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/infobar_12.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/infobar_13.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/infobar_14.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/infobar_15.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/infobar_16.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/infobar_17.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/infobar_18.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/infobar_19.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/infobar_20.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/infobar_21.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/infobar_23.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_0.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_10.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_11.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_12.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_13.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_14.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_15.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_16.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_17.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_18.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_19.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_20.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_4.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_5.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_6.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_7.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_8.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_9.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/dead_tower_small2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_0.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_10.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_11.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_12.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_13.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_14.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_15.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_16.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_17.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_18.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_19.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_20.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_21.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_22.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_23.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_24.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_25.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_26.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_27.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_28.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_29.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_30.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_31.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_32.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_33.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_34.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/towers/towers_9.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/cell_0.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/flag_anim_0.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_01_bg_0.jpg is excluded by !**/*.jpg
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_01_bg_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_01_bg_2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_01_bg_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_02_bg_0.jpg is excluded by !**/*.jpg
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_02_bg_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_02_bg_2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_02_bg_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_02_bg_4.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_03_bg_0.jpg is excluded by !**/*.jpg
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_03_bg_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_03_bg_2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_03_bg_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_03_bg_4.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_04_bg_0.jpg is excluded by !**/*.jpg
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_04_bg_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_04_bg_2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_04_bg_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_05_bg_0.jpg is excluded by !**/*.jpg
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_05_bg_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_05_bg_2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_05_bg_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_06_bg_0.jpg is excluded by !**/*.jpg
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_06_bg_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_06_bg_2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_06_bg_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_06_bg_4.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_07_bg_0.jpg is excluded by !**/*.jpg
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_07_bg_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_07_bg_2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_07_bg_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_07_bg_4.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_08_bg_0.jpg is excluded by !**/*.jpg
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_08_bg_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_08_bg_2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_08_bg_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_09_bg_0.jpg is excluded by !**/*.jpg
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_09_bg_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_09_bg_2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_09_bg_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_01_09_bg_4.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_02_01_bg_0.jpg is excluded by !**/*.jpg
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_02_01_bg_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_02_01_bg_2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_02_01_bg_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_02_02_bg_0.jpg is excluded by !**/*.jpg
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_02_02_bg_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_02_02_bg_2.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_02_02_bg_3.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_02_03_bg_0.jpg is excluded by !**/*.jpg
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_02_03_bg_1.png is excluded by !**/*.png
  • static/_app/tools/toy-defence/images/1.5/game/worlds/world_02_03_bg_2.png is excluded by !**/*.png
📒 Files selected for processing (27)
  • .firebaserc (0 hunks)
  • .github/workflows/beta_deploy.yml (1 hunks)
  • .github/workflows/deploy.yml (1 hunks)
  • firebase.json (0 hunks)
  • package.json (2 hunks)
  • src/lib/analytics.ts (2 hunks)
  • src/lib/components/play.svelte (3 hunks)
  • src/lib/components/tracker-dialog.svelte (1 hunks)
  • src/lib/gmaes.ts (2 hunks)
  • src/routes/g/columns.ts (0 hunks)
  • src/routes/g/tags.svelte (0 hunks)
  • src/routes/history/columns.ts (0 hunks)
  • src/routes/history/tags.svelte (0 hunks)
  • src/routes/mirrors/mirrors.config.ts (0 hunks)
  • static/_app/tools/toy-defence/@source.txt (1 hunks)
  • static/_app/tools/toy-defence/ahrefs_585f4691b0e399a160cb6e0c016b4fcd7b0c55de8ae4d7dc4c83d5d0761520b3 (1 hunks)
  • static/_app/tools/toy-defence/data/game/bonuses.json (1 hunks)
  • static/_app/tools/toy-defence/data/game/bullets.json (1 hunks)
  • static/_app/tools/toy-defence/data/game/notifications.json (1 hunks)
  • static/_app/tools/toy-defence/data/game/perks.json (1 hunks)
  • static/_app/tools/toy-defence/data/game/soundmanager.json (1 hunks)
  • static/_app/tools/toy-defence/data/game/tooltip.json (1 hunks)
  • static/_app/tools/toy-defence/data/game/towers.json (1 hunks)
  • static/_app/tools/toy-defence/data/game/towers_bar.json (1 hunks)
  • static/_app/tools/toy-defence/data/game/towers_hierarchy.json (1 hunks)
  • static/_app/tools/toy-defence/data/game/worlds.json (1 hunks)
  • static/_app/tools/toy-defence/data/game/worlds/units_world_01.json (1 hunks)
💤 Files with no reviewable changes (7)
  • firebase.json
  • src/routes/g/columns.ts
  • .firebaserc
  • src/routes/g/tags.svelte
  • src/routes/mirrors/mirrors.config.ts
  • src/routes/history/tags.svelte
  • src/routes/history/columns.ts
🧰 Additional context used
📓 Path-based instructions (6)
static/**

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Place publicly served static assets under the static/ directory (served as-is)

Files:

  • static/_app/tools/toy-defence/@source.txt
  • static/_app/tools/toy-defence/data/game/notifications.json
  • static/_app/tools/toy-defence/data/game/towers_bar.json
  • static/_app/tools/toy-defence/data/game/tooltip.json
  • static/_app/tools/toy-defence/data/game/soundmanager.json
  • static/_app/tools/toy-defence/data/game/worlds/units_world_01.json
  • static/_app/tools/toy-defence/data/game/bonuses.json
  • static/_app/tools/toy-defence/data/game/perks.json
  • static/_app/tools/toy-defence/data/game/bullets.json
  • static/_app/tools/toy-defence/ahrefs_585f4691b0e399a160cb6e0c016b4fcd7b0c55de8ae4d7dc4c83d5d0761520b3
  • static/_app/tools/toy-defence/data/game/worlds.json
  • static/_app/tools/toy-defence/data/game/towers_hierarchy.json
  • static/_app/tools/toy-defence/data/game/towers.json
static/_app/tools/**

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Legacy games/tools reside under static/_app/tools/; review these static assets for security if they handle user-generated content

Files:

  • static/_app/tools/toy-defence/@source.txt
  • static/_app/tools/toy-defence/data/game/notifications.json
  • static/_app/tools/toy-defence/data/game/towers_bar.json
  • static/_app/tools/toy-defence/data/game/tooltip.json
  • static/_app/tools/toy-defence/data/game/soundmanager.json
  • static/_app/tools/toy-defence/data/game/worlds/units_world_01.json
  • static/_app/tools/toy-defence/data/game/bonuses.json
  • static/_app/tools/toy-defence/data/game/perks.json
  • static/_app/tools/toy-defence/data/game/bullets.json
  • static/_app/tools/toy-defence/ahrefs_585f4691b0e399a160cb6e0c016b4fcd7b0c55de8ae4d7dc4c83d5d0761520b3
  • static/_app/tools/toy-defence/data/game/worlds.json
  • static/_app/tools/toy-defence/data/game/towers_hierarchy.json
  • static/_app/tools/toy-defence/data/game/towers.json
**/*.*

⚙️ CodeRabbit configuration file

**/*.*: Do not correct spelling errors or grammar mistakes.

Files:

  • static/_app/tools/toy-defence/@source.txt
  • src/lib/analytics.ts
  • package.json
  • src/lib/components/tracker-dialog.svelte
  • static/_app/tools/toy-defence/data/game/notifications.json
  • static/_app/tools/toy-defence/data/game/towers_bar.json
  • src/lib/components/play.svelte
  • static/_app/tools/toy-defence/data/game/tooltip.json
  • static/_app/tools/toy-defence/data/game/soundmanager.json
  • static/_app/tools/toy-defence/data/game/worlds/units_world_01.json
  • static/_app/tools/toy-defence/data/game/bonuses.json
  • static/_app/tools/toy-defence/data/game/perks.json
  • static/_app/tools/toy-defence/data/game/bullets.json
  • static/_app/tools/toy-defence/data/game/worlds.json
  • static/_app/tools/toy-defence/data/game/towers_hierarchy.json
  • static/_app/tools/toy-defence/data/game/towers.json
  • src/lib/gmaes.ts
**/*.{svelte,ts,js,jsx,tsx,css,scss,json,md}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Code must be formatted with Prettier before committing

Files:

  • src/lib/analytics.ts
  • package.json
  • src/lib/components/tracker-dialog.svelte
  • static/_app/tools/toy-defence/data/game/notifications.json
  • static/_app/tools/toy-defence/data/game/towers_bar.json
  • src/lib/components/play.svelte
  • static/_app/tools/toy-defence/data/game/tooltip.json
  • static/_app/tools/toy-defence/data/game/soundmanager.json
  • static/_app/tools/toy-defence/data/game/worlds/units_world_01.json
  • static/_app/tools/toy-defence/data/game/bonuses.json
  • static/_app/tools/toy-defence/data/game/perks.json
  • static/_app/tools/toy-defence/data/game/bullets.json
  • static/_app/tools/toy-defence/data/game/worlds.json
  • static/_app/tools/toy-defence/data/game/towers_hierarchy.json
  • static/_app/tools/toy-defence/data/game/towers.json
  • src/lib/gmaes.ts
**/*.{ts,svelte}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Resolve all TypeScript and Svelte component type errors (svelte-check/ts checks must pass)

Files:

  • src/lib/analytics.ts
  • src/lib/components/tracker-dialog.svelte
  • src/lib/components/play.svelte
  • src/lib/gmaes.ts
**/*.{ts,js,svelte}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Ensure all import paths are correct and case-sensitive

Files:

  • src/lib/analytics.ts
  • src/lib/components/tracker-dialog.svelte
  • src/lib/components/play.svelte
  • src/lib/gmaes.ts
🧠 Learnings (1)
📚 Learning: 2025-08-25T03:31:18.401Z
Learnt from: CR
PR: EducationalTools/src#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-08-25T03:31:18.401Z
Learning: Applies to static/_app/tools/** : Legacy games/tools reside under static/_app/tools/; review these static assets for security if they handle user-generated content

Applied to files:

  • static/_app/tools/toy-defence/ahrefs_585f4691b0e399a160cb6e0c016b4fcd7b0c55de8ae4d7dc4c83d5d0761520b3
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (15)
static/_app/tools/toy-defence/@source.txt (1)

1-1: Confirm redistribution rights for third‑party assets.

The link implies assets originate from a third party. Please confirm you have permission to host/distribute any derived files and, if required, add attribution/licensing notes (e.g., in README or a NOTICE file).

static/_app/tools/toy-defence/data/game/tooltip.json (1)

1-252: Asset presence check (fonts and tooltip sprites).

Ensure fonts/soldier_font5.fnt/.png and common/tooltip_*.png are present; otherwise tooltips will render blank.

(Use the asset-check script shared in perks.json comment.)

src/lib/components/play.svelte (1)

71-72: Consider allowing fullscreen explicitly.

Some browsers require allowfullscreen to be present on iframes for fullscreen UX.

-	<iframe
+	<iframe
+		allowfullscreen
static/_app/tools/toy-defence/data/game/bonuses.json (1)

1-41: LGTM, but please sanity-check balance constants.

Values like power: 1000000 and timeout: 0 can drastically affect gameplay. Confirm they match intended design.

static/_app/tools/toy-defence/data/game/notifications.json (1)

1-546: Verify assets/localization fonts exist and load.

There are many textures (common/notifications_*.png) and the soldier font; please run the asset-check script to catch missing files early.

static/_app/tools/toy-defence/data/game/towers_hierarchy.json (1)

1-399: Cross‑file consistency: icon_name values must exist in perks.json.

icon_name references (e.g., icon_trooper, icon_18, icon_PVO) should have matching entries in perks.json to render in UI.

You can spot-check by grepping both files, or extend the asset-check script to compare names.

src/lib/gmaes.ts (2)

315-321: Guard against id collisions (names very similar).

Multiple titles are close variants; if generateId normalizes aggressively, ids could collide. Add a quick uniqueness check in dev.


295-300: New “Toy Defence” entry — target exists; verify CSP on deploy

  • static/_app/tools/toy-defence/index.html is present and references local scripts (game.f.js, js/analytics_ubg_v1_4.js, js/ubg235_client_v1_1.js).
  • No Content-Security-Policy meta tag found in the HTML; server-set CSP headers cannot be validated here. Verify the deployed page in a browser or check HTTP response headers to ensure CSP (if any) allows those scripts or add an appropriate CSP header/meta.

Locations: src/lib/gmaes.ts (lines 296–300); static/_app/tools/toy-defence/index.html

static/_app/tools/toy-defence/data/game/perks.json (1)

1-1: Verify referenced textures exist under static/_app/tools/toy-defence

Sandbox run produced no output; automated check couldn't confirm assets. Run the provided script locally or in CI and attach its output, or confirm that all texture paths referenced from static/_app/tools/toy-defence/data/game JSON (common/, game/, shop/, fonts/) exist to avoid runtime 404s.

static/_app/tools/toy-defence/data/game/bullets.json (1)

171-286: Level-stat encoding: confirm parser expectations

Tower A entries encode multi-level stats as space-separated strings (e.g., "power": "4 5 6"). Ensure the runtime parser expects this exact format (string with spaces) rather than arrays. Same applies to other towers.

static/_app/tools/toy-defence/data/game/towers_bar.json (2)

221-238: Format-string placeholders and glyphs: confirm runtime formatting

Confirmation text uses %d and the © glyph as currency marker. Verify your localization/formatting layer substitutes %d and that © is the intended coin symbol.


1-534: Prettier check — no changes required.

static/_app/tools/toy-defence/data/game/towers_bar.json is already Prettier-formatted ("All matched files use Prettier code style!").

static/_app/tools/toy-defence/data/game/worlds.json (2)

1-401: Prettier formatting — OK.
static/_app/tools/toy-defence/data/game/worlds.json is formatted according to Prettier.


20-26: Action: Fix world asset references in static/_app/tools/toy-defence/data/game/worlds.json

worlds.json still points at game/worlds/*.xml. I ran a check; .json equivalents were found for:

  • static/_app/tools/toy-defence/data/game/worlds/units_world_01.json
  • static/_app/tools/toy-defence/data/game/worlds/world_01.json
  • static/_app/tools/toy-defence/data/game/worlds/world_02.json
  • static/_app/tools/toy-defence/data/game/worlds/world_03.json
  • static/_app/tools/toy-defence/data/game/worlds/world_08.json

The following references were not verified (script errored during the run) — confirm existence or update to .json:

  • game/worlds/units_world_04.xml
  • game/worlds/units_world_05.xml
  • game/worlds/world_04.xml
  • game/worlds/world_05.xml
  • game/worlds/world_06.xml
  • game/worlds/world_07.xml
  • game/worlds/world_09.xml
  • game/worlds/world_10.xml

Replace .xml paths with the .json equivalents above or restore the XML assets; re-run verification to confirm all references resolve.

static/_app/tools/toy-defence/data/game/towers.json (1)

1-741: Prettier formatting: OK

npx --yes prettier -c confirmed "All matched files use Prettier code style" for static/_app/tools/toy-defence/data/game/towers.json.

@@ -0,0 +1 @@
ahrefs-site-verification_585f4691b0e399a160cb6e0c016b4fcd7b0c55de8ae4d7dc4c83d5d0761520b3 No newline at end of file
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

🧩 Analysis chain

Ahrefs verification likely won’t work from a nested path.

Ahrefs typically requires the token file at the site root with a specific filename pattern (served at /<tokenfile>). Placing it under /_app/tools/toy-defence/ may not satisfy verification.

  • If your intent is domain‑level verification, move it to static/ (root) with Ahrefs’ exact required filename.
  • If you intentionally verify only this subpath, please confirm Ahrefs supports that.

Run to check for a root‑level token file:


🏁 Script executed:

#!/bin/bash
fd -a -HI '^ahrefs.*' static | sed 's#^#found: #'

Length of output: 380


Place Ahrefs verification token at site root

No root-level token found; copies exist only under nested paths:

  • static/_app/tools/snowrider/ahrefs_585f4691b0e399a160cb6e0c016b4fcd7b0c55de8ae4d7dc4c83d5d0761520b3
  • static/_app/tools/toy-defence/ahrefs_585f4691b0e399a160cb6e0c016b4fcd7b0c55de8ae4d7dc4c83d5d0761520b3
  • static/_app/tools/xtpamplona/ahrefs_585f4691b0e399a160cb6e0c016b4fcd7b0c55de8ae4d7dc4c83d5d0761520b3

Move one token to static/ (site root) using Ahrefs’ exact required filename so it is served at /; remove duplicates or confirm you intentionally only verify a subpath (Ahrefs normally requires a root-level file).

🤖 Prompt for AI Agents
In
static/_app/tools/toy-defence/ahrefs_585f4691b0e399a160cb6e0c016b4fcd7b0c55de8ae4d7dc4c83d5d0761520b3
(line 1), the Ahrefs verification token is placed under a nested path instead of
site root; move one copy of the token file into the static/ directory using
Ahrefs’ exact required filename so it is served at /<tokenfile>, and then remove
the duplicate copies from static/_app/tools/snowrider/ and
static/_app/tools/xtpamplona/ unless you intentionally only want to verify a
subpath (in which case confirm that with a comment).

Comment on lines +1 to +568
{
"enemy_soldier": {
"@attributes": {
"power": "210",
"range": "1",
"speed": "30"
},
"comment": {},
"bullet": {
"@attributes": {
"hotspot": "16 16",
"rect": "0 0 32 32",
"rotate_speed": "2",
"scale_max": "0.8",
"scale_min": "0.3",
"texture": "game/bullets/bullets_0.png",
"use_filter": "1"
}
},
"sound": {
"@attributes": {
"name": "fire_unit_grenade",
"sound_at_end": "1"
}
}
},
"feast2_enemy_soldier": {
"@attributes": {
"power": "210",
"range": "1",
"speed": "30"
},
"comment": {},
"bullet": {
"@attributes": {
"hotspot": "16 16",
"rect": "0 0 32 32",
"rotate_speed": "2",
"scale_max": "0.8",
"scale_min": "0.3",
"texture": "game/bullets/bullets_5.png",
"use_filter": "1"
}
},
"sound": {
"@attributes": {
"name": "fire_unit_grenade",
"sound_at_end": "1"
}
}
},
"enemy_car": {
"@attributes": {
"power": "40",
"range": "2",
"speed": "70"
},
"comment": {},
"bullet": {
"@attributes": {
"hotspot": "4 1",
"rect": "0 0 8 2",
"texture": "game/bullets/bullets_1.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_unit_tank_shoot"}}
},
"enemy_tank_light": {
"@attributes": {
"power": "375",
"range": "10",
"speed": "60"
},
"comment": {},
"bullet": {
"@attributes": {
"hotspot": "27 4",
"rect": "0 0 32 8",
"texture": "game/bullets/bullets_2.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_unit_tank_shoot"}}
},
"enemy_tank_heavy": {
"@attributes": {
"power": "400",
"range": "20",
"speed": "60"
},
"comment": {},
"bullet": {
"@attributes": {
"hotspot": "27 4",
"rect": "0 0 32 8",
"texture": "game/bullets/bullets_2.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_unit_tank_shoot"}}
},
"enemy_tank_heavy_left": {
"@attributes": {
"power": "36",
"range": "10",
"speed": "60"
},
"comment": {},
"bullet": {
"@attributes": {
"hotspot": "27 4",
"rect": "0 0 32 8",
"texture": "game/bullets/bullets_2.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_unit_tank_shoot"}}
},
"enemy_tank_heavy_right": {
"@attributes": {
"power": "36",
"range": "10",
"speed": "60"
},
"comment": {},
"bullet": {
"@attributes": {
"hotspot": "27 4",
"rect": "0 0 32 8",
"texture": "game/bullets/bullets_2.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_unit_tank_shoot"}}
},
"enemy_airship": {
"@attributes": {
"power": "600",
"range": "15",
"speed": "45"
},
"comment": {},
"bullet": {
"@attributes": {
"hotspot": "4 1",
"rect": "0 0 8 2",
"texture": "game/bullets/bullets_1.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_unit_missile"}}
},
"enemy_bomber": {
"@attributes": {
"power": "800",
"range": "9",
"speed": "60"
},
"comment": {},
"bullet": {
"@attributes": {
"hotspot": "4 1",
"rect": "0 0 8 2",
"texture": "game/bullets/bullets_1.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_unit_missile"}}
},
"tower_a_0": {
"@attributes": {
"power": "4 5 6",
"range": "1 1 1",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "12 3",
"rect": "0 0 18 7",
"texture": "game/bullets/bullets_3.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_tower_a"}}
},
"tower_a_1": {
"@attributes": {
"power": "6 6 6",
"range": "1 1 1",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "12 3",
"rect": "0 0 18 7",
"texture": "game/bullets/bullets_3.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_tower_a"}}
},
"tower_a_2": {
"@attributes": {
"power": "7 7 7",
"range": "1 1 1",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "12 3",
"rect": "0 0 18 7",
"texture": "game/bullets/bullets_3.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_tower_a"}}
},
"tower_a_3": {
"@attributes": {
"power": "7 8 9",
"range": "1 1 1",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "12 3",
"rect": "0 0 18 7",
"texture": "game/bullets/bullets_3.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_tower_a"}}
},
"tower_a_4": {
"@attributes": {
"power": "8 9 10",
"range": "1 1 1",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "12 3",
"rect": "0 0 18 7",
"texture": "game/bullets/bullets_3.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_tower_a"}}
},
"tower_a_5": {
"@attributes": {
"power": "45 60 70",
"range": "1 1 1",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "12 3",
"rect": "0 0 18 7",
"texture": "game/bullets/bullets_3.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_tower_a"}}
},
"tower_a_6": {
"@attributes": {
"power": "10 11 12",
"range": "1 1 1",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "12 3",
"rect": "0 0 18 7",
"texture": "game/bullets/bullets_3.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_tower_a"}}
},
"tower_b_0": {
"@attributes": {
"power": "80 85 90",
"range": "60 65 70",
"speed": "100 100 100"
},
"flame": {},
"sound": {
"@attributes": {
"name": "fire_tower_b",
"name_fast": "fire_tower_b_fast"
}
}
},
"tower_b_1": {
"@attributes": {
"power": "90 90 90",
"range": "73 76 79",
"speed": "100 100 100"
},
"flame": {},
"sound": {
"@attributes": {
"name": "fire_tower_b",
"name_fast": "fire_tower_b_fast"
}
}
},
"tower_b_2": {
"@attributes": {
"power": "100 100 100",
"range": "80 85 90",
"speed": "100 100 100"
},
"flame": {},
"sound": {
"@attributes": {
"name": "fire_tower_b",
"name_fast": "fire_tower_b_fast"
}
}
},
"tower_b_3": {
"@attributes": {
"power": "92 94 96",
"range": "80 80 80",
"speed": "100 100 100"
},
"flame": {},
"sound": {
"@attributes": {
"name": "fire_tower_b",
"name_fast": "fire_tower_b_fast"
}
}
},
"tower_b_4": {
"@attributes": {
"power": "110 120 130",
"range": "95 100 105",
"speed": "100 100 100"
},
"flame": {},
"sound": {
"@attributes": {
"name": "fire_tower_b",
"name_fast": "fire_tower_b_fast"
}
}
},
"tower_b_5": {
"@attributes": {
"power": "97 98 100",
"range": "80 80 80",
"speed": "100 100 100"
},
"flame": {},
"sound": {
"@attributes": {
"name": "fire_tower_b",
"name_fast": "fire_tower_b_fast"
}
}
},
"tower_c_0": {
"@attributes": {
"power": "300 325 350",
"range": "5 5 5",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "27 4",
"rect": "0 0 32 8",
"texture": "game/bullets/bullets_2.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_tower_c"}}
},
"tower_c_1": {
"@attributes": {
"power": "350 350 350",
"range": "5 5 5",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "27 4",
"rect": "0 0 32 8",
"texture": "game/bullets/bullets_2.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_tower_c"}}
},
"tower_c_2": {
"@attributes": {
"power": "350 350 350",
"range": "5 5 5",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "27 4",
"rect": "0 0 32 8",
"texture": "game/bullets/bullets_2.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_tower_c"}}
},
"tower_c_3": {
"@attributes": {
"power": "350 350 350",
"range": "60 70 80",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "27 4",
"rect": "0 0 32 8",
"texture": "game/bullets/bullets_2.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_tower_c"}}
},
"tower_c_4": {
"@attributes": {
"power": "350 375 390",
"range": "5 5 5",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "27 4",
"rect": "0 0 32 8",
"texture": "game/bullets/bullets_2.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_tower_c"}}
},
"tower_c_5": {
"@attributes": {
"power": "350 350 350",
"range": "80 80 80",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "27 4",
"rect": "0 0 32 8",
"texture": "game/bullets/bullets_2.png",
"use_filter": "1"
}
},
"sound": {"@attributes": {"name": "fire_tower_c"}}
},
"tower_d_0": {
"@attributes": {
"power": "80 90 100",
"range": "3 3 3",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "28 3",
"rect": "0 0 32 6",
"texture": "game/bullets/bullets_4.png",
"use_filter": "1"
}
},
"sound": {
"@attributes": {
"name": "fire_tower_d",
"name_fast": "fire_tower_d_fast"
}
}
},
"tower_d_1": {
"@attributes": {
"power": "100 100 100",
"range": "3 3 3",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "28 3",
"rect": "0 0 32 6",
"texture": "game/bullets/bullets_4.png",
"use_filter": "1"
}
},
"sound": {
"@attributes": {
"name": "fire_tower_d",
"name_fast": "fire_tower_d_fast"
}
}
},
"tower_d_2": {
"@attributes": {
"power": "160 180 200",
"range": "3 3 3",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "28 3",
"rect": "0 0 32 6",
"texture": "game/bullets/bullets_4.png",
"use_filter": "1"
}
},
"sound": {
"@attributes": {
"name": "fire_tower_d",
"name_fast": "fire_tower_d_fast"
}
}
},
"tower_d_3": {
"@attributes": {
"power": "115 130 145",
"range": "3 3 3",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "28 3",
"rect": "0 0 32 6",
"texture": "game/bullets/bullets_4.png",
"use_filter": "1"
}
},
"sound": {
"@attributes": {
"name": "fire_tower_d",
"name_fast": "fire_tower_d_fast"
}
}
},
"tower_d_4": {
"@attributes": {
"power": "200 200 200",
"range": "3 3 3",
"speed": "400 400 400"
},
"bullet": {
"@attributes": {
"hotspot": "28 3",
"rect": "0 0 32 6",
"texture": "game/bullets/bullets_4.png",
"use_filter": "1"
}
},
"sound": {
"@attributes": {
"name": "fire_tower_d",
"name_fast": "fire_tower_d_fast"
}
}
}
} No newline at end of file
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

🧩 Analysis chain

Asset-path sanity check recommended

Many texture/sound paths are referenced (e.g., game/bullets/bullets_.png, sounds like fire_unit_). Please verify all referenced files exist under static/_app/tools/toy-defence/. I can auto-check with a script.

Run:


🏁 Script executed:

#!/bin/bash
set -euo pipefail
# Validate JSON
jq empty static/_app/tools/toy-defence/data/game/bullets.json

# List all textures/sounds referenced and verify existence
jq -r '..|objects|.["@attributes"]?.texture? // empty' static/_app/tools/toy-defence/data/game/bullets.json | sort -u \
 | while read -r p; do test -f "static/_app/tools/toy-defence/data/$p" || echo "MISSING texture: $p"; done

jq -r '..|objects|.["@attributes"]?.name? // empty' static/_app/tools/toy-defence/data/game/bullets.json \
 | grep -E '^fire_|^sounds/|^ui_' -n || true
# If sounds are full paths elsewhere, adapt the grep; otherwise ensure sound names map in soundmanager.json

Length of output: 842


Missing textures referenced in bullets.json — add files or fix paths

  • jq shows these textures referenced by static/_app/tools/toy-defence/data/game/bullets.json are missing under static/_app/tools/toy-defence/data/: game/bullets/bullets_0.png, game/bullets/bullets_1.png, game/bullets/bullets_2.png, game/bullets/bullets_3.png, game/bullets/bullets_4.png, game/bullets/bullets_5.png.
  • Sound identifiers found in the file: fire_unit_grenade, fire_unit_tank_shoot, fire_unit_missile, fire_tower_a, fire_tower_b, fire_tower_c, fire_tower_d — verify these map to your sound registry (e.g., soundmanager.json) or fix names/paths.
  • Action: add the missing texture files at the expected path or update the "texture" attributes in bullets.json to correct locations; confirm sound mappings.
🤖 Prompt for AI Agents
In static/_app/tools/toy-defence/data/game/bullets.json (lines 1-568) several
texture paths (game/bullets/bullets_0.png through bullets_5.png) referenced in
"texture" attributes are missing and some sound IDs should be validated; either
add the missing PNGs at
static/_app/tools/toy-defence/data/game/bullets_0.png..bullets_5.png and commit
them, or update each "texture" attribute to the correct existing asset path
(keeping paths relative to the data folder) so the engine can load them;
additionally verify each sound identifier (fire_unit_grenade,
fire_unit_tank_shoot, fire_unit_missile, fire_tower_a/b/c/d) exists in your
sound registry (e.g., soundmanager.json) and either correct the IDs or update
the registry to include them; finally run a quick local asset build/run to
confirm no missing-asset errors and include the asset changes in the same PR.

Comment on lines +1 to +680
{
"sounds": {
"sound": [
{
"@attributes": {
"filename": "sounds/music_menu.wav",
"max_count": "0",
"name": "music_menu"
}
},
{
"@attributes": {
"filename": "sounds/game_game_over.wav",
"max_count": "0",
"name": "game_over"
}
},
{
"@attributes": {
"filename": "sounds/game_mission_completed.wav",
"max_count": "0",
"name": "mission_completed"
}
},
{
"@attributes": {
"filename": "sounds/game_mission_completed_world4.wav",
"max_count": "0",
"name": "world_4_mission_completed"
}
},
{
"@attributes": {
"filename": "sounds/ui_mission_completed.wav",
"max_count": "0",
"name": "next_mission_count_effect"
}
},
{
"@attributes": {
"filename": "sounds/ui_mission_final_effect.wav",
"max_count": "0",
"name": "next_mission_final_effect"
}
},
{
"@attributes": {
"filename": "sounds/game_lost_life.wav",
"max_count": "5",
"name": "lost_life",
"timeout": "0.5"
}
},
{
"@attributes": {
"filename": "sounds/game_ready_to_upgrade.wav",
"max_count": "2",
"name": "ready_to_upgrade",
"timeout": "1"
}
},
{
"@attributes": {
"filename": "sounds/game_build_tower.wav",
"max_count": "0",
"name": "build_tower"
}
},
{
"@attributes": {
"filename": "sounds/game_upgrade_tower.wav",
"max_count": "0",
"name": "upgrade_tower"
}
},
{
"@attributes": {
"filename": "sounds/game_sell_tower.wav",
"max_count": "0",
"name": "sell_tower"
}
},
{
"@attributes": {
"filename": "sounds/game_repair_tower.wav",
"max_count": "0",
"name": "repair_tower"
}
},
{
"@attributes": {
"filename": "sounds/game_wave_start_aircraft.wav",
"max_count": "0",
"name": "wave_start_aircraft"
}
},
{
"@attributes": {
"filename": "sounds/game_wave_boss_notification.wav",
"max_count": "0",
"name": "wave_boss_notification"
}
},
{
"@attributes": {
"filename": "sounds/happy_04.wav",
"max_count": "1",
"name": "explode_unit_soldier",
"timeout": "0.3"
},
"sound": [
{
"@attributes": {
"filename": "sounds/happy_01.wav",
"max_count": "1",
"timeout": "5"
}
},
{
"@attributes": {
"filename": "sounds/pumpkin.wav",
"max_count": "1",
"timeout": "5"
}
}
]
},
{
"@attributes": {
"filename": "sounds/game_explode_unit_ground.wav",
"max_count": "3",
"name": "explode_unit_ground"
}
},
{
"@attributes": {
"filename": "sounds/game_explode_unit_air.wav",
"max_count": "3",
"name": "explode_unit_air"
}
},
{
"@attributes": {
"filename": "sounds/game_explode_unit_soldier_bonus_0.wav",
"max_count": "1",
"name": "explode_unit_soldier_bonus0",
"timeout": "0.7"
},
"sound": [
{"@attributes": {"filename": "sounds/game_explode_unit_soldier_bonus_1.wav"}},
{"@attributes": {"filename": "sounds/game_explode_unit_soldier_bonus_2.wav"}},
{"@attributes": {"filename": "sounds/game_explode_unit_soldier_bonus_3.wav"}},
{"@attributes": {"filename": "sounds/game_explode_unit_soldier_bonus_4.wav"}},
{"@attributes": {"filename": "sounds/game_explode_unit_soldier_bonus_5.wav"}},
{"@attributes": {"filename": "sounds/game_explode_unit_soldier_bonus_6.wav"}},
{"@attributes": {"filename": "sounds/game_explode_unit_soldier_bonus_7.wav"}},
{"@attributes": {"filename": "sounds/game_explode_unit_soldier_bonus_8.wav"}},
{"@attributes": {"filename": "sounds/game_explode_unit_soldier_bonus_9.wav"}}
]
},
{
"@attributes": {
"filename": "sounds/game_explode_unit_truck_bonus_0.wav",
"max_count": "1",
"name": "explode_unit_truck_bonus",
"timeout": "0.1"
},
"sound": [
{"@attributes": {"filename": "sounds/game_explode_unit_truck_bonus_1.wav"}},
{"@attributes": {"filename": "sounds/game_explode_unit_truck_bonus_2.wav"}},
{"@attributes": {"filename": "sounds/game_explode_unit_truck_bonus_3.wav"}},
{"@attributes": {"filename": "sounds/game_explode_unit_truck_bonus_4.wav"}}
]
},
{
"@attributes": {
"filename": "sounds/game_explode_unit_truck_bonus_0.wav",
"max_count": "1",
"name": "destroy_unit_god_mode",
"timeout": "0.1"
},
"sound": [
{"@attributes": {"filename": "sounds/game_explode_unit_truck_bonus_1.wav"}},
{"@attributes": {"filename": "sounds/game_explode_unit_truck_bonus_2.wav"}},
{"@attributes": {"filename": "sounds/game_explode_unit_truck_bonus_3.wav"}},
{"@attributes": {"filename": "sounds/game_explode_unit_truck_bonus_4.wav"}}
]
},
{
"@attributes": {
"filename": "sounds/game_explode_tower_0.wav",
"max_count": "3",
"name": "explode_tower",
"timeout": "0.1"
},
"comment": [
{},
{},
{}
]
},
{
"@attributes": {
"filename": "sounds/game_fire_tower_gun_0.wav",
"max_count": "3",
"name": "fire_tower_a",
"timeout": "0.1"
},
"sound": [
{"@attributes": {"filename": "sounds/game_fire_tower_gun_1.wav"}},
{"@attributes": {"filename": "sounds/game_fire_tower_gun_2.wav"}}
],
"comment": {}
},
{
"@attributes": {
"filename": "sounds/game_fire_tower_gun_double_0.wav",
"max_count": "3",
"name": "fire_tower_a_double",
"timeout": "0.1"
},
"sound": [
{"@attributes": {"filename": "sounds/game_fire_tower_gun_double_1.wav"}},
{"@attributes": {"filename": "sounds/game_fire_tower_gun_double_2.wav"}}
]
},
{
"@attributes": {
"filename": "sounds/game_fire_tower_flame_0.wav",
"max_count": "3",
"name": "fire_tower_b",
"timeout": "0.1"
},
"sound": [
{"@attributes": {"filename": "sounds/game_fire_tower_flame_1.wav"}},
{"@attributes": {"filename": "sounds/game_fire_tower_flame_2.wav"}}
]
},
{
"@attributes": {
"filename": "sounds/game_fire_tower_flame_fast_0.wav",
"max_count": "3",
"name": "fire_tower_b_fast",
"timeout": "0.1"
},
"sound": [
{"@attributes": {"filename": "sounds/game_fire_tower_flame_fast_1.wav"}},
{"@attributes": {"filename": "sounds/game_fire_tower_flame_fast_2.wav"}}
]
},
{
"@attributes": {
"filename": "sounds/game_fire_tower_cannon_0.wav",
"max_count": "3",
"name": "fire_tower_c",
"timeout": "0.1"
},
"sound": [
{"@attributes": {"filename": "sounds/game_fire_tower_cannon_1.wav"}},
{"@attributes": {"filename": "sounds/game_fire_tower_cannon_2.wav"}}
]
},
{
"@attributes": {
"filename": "sounds/game_fire_tower_antiaircraft_0.wav",
"max_count": "3",
"name": "fire_tower_d",
"timeout": "0.1"
},
"sound": [
{"@attributes": {"filename": "sounds/game_fire_tower_antiaircraft_1.wav"}},
{"@attributes": {"filename": "sounds/game_fire_tower_antiaircraft_2.wav"}}
]
},
{
"@attributes": {
"filename": "sounds/game_fire_tower_antiaircraft_fast_0.wav",
"max_count": "3",
"name": "fire_tower_d_fast",
"timeout": "0.1"
},
"sound": [
{"@attributes": {"filename": "sounds/game_fire_tower_antiaircraft_fast_1.wav"}},
{"@attributes": {"filename": "sounds/game_fire_tower_antiaircraft_fast_2.wav"}}
]
},
{
"@attributes": {
"filename": "sounds/game_fire_unit_grenade_0.wav",
"max_count": "3",
"name": "fire_unit_grenade",
"timeout": "0.1"
},
"sound": {"@attributes": {"filename": "sounds/game_fire_unit_grenade_1.wav"}}
},
{
"@attributes": {
"filename": "sounds/game_fire_unit_missile.wav",
"max_count": "3",
"name": "fire_unit_missile",
"timeout": "0.1"
}
},
{
"@attributes": {
"filename": "sounds/game_unit_tank_shoot.wav",
"max_count": "3",
"name": "fire_unit_tank_shoot",
"timeout": "0.1"
}
},
{
"@attributes": {
"filename": "sounds/game_unit_tank_hit.wav",
"max_count": "3",
"name": "fire_unit_tank_hit",
"timeout": "0.1"
}
},
{
"@attributes": {
"filename": "sounds/game_unit_soldier_step.wav",
"max_count": "1",
"name": "unit_soldier_step"
}
},
{
"@attributes": {
"filename": "sounds/game_unit_tank_heavy_engine.wav",
"max_count": "1",
"name": "unit_tank_heavy_engine"
}
},
{
"@attributes": {
"filename": "sounds/game_unit_tank_light_engine.wav",
"max_count": "1",
"name": "unit_tank_light_engine"
}
},
{
"@attributes": {
"filename": "sounds/game_unit_machine_engine_2.wav",
"max_count": "1",
"name": "unit_machine_engine_2"
}
},
{
"@attributes": {
"filename": "sounds/game_unit_machine_engine_1.wav",
"max_count": "1",
"name": "unit_machine_engine_1"
}
},
{
"@attributes": {
"filename": "sounds/game_unit_aircraft_engine.wav",
"max_count": "1",
"name": "unit_aircraft_engine"
}
},
{
"@attributes": {
"filename": "sounds/shop_star.wav",
"max_count": "1",
"name": "base_wave"
}
},
{
"@attributes": {
"filename": "sounds/game_repair_tower.wav",
"max_count": "1",
"name": "autorepair_tower"
}
},
{
"@attributes": {
"filename": "sounds/game_upgrade_tower.wav",
"max_count": "1",
"name": "ressurect_tower"
}
},
{
"@attributes": {
"filename": "sounds/ui_mission_completed.wav",
"max_count": "1",
"name": "show_bonus_dialog"
}
},
{
"@attributes": {
"filename": "sounds/ras_autorepear.wav",
"max_count": "2",
"name": "ras_autorepear"
}
},
{
"@attributes": {
"filename": "sounds/ras_god_killsolders_zp_01.wav",
"max_count": "5",
"name": "ras_god_killsolders",
"timeout": "0.1"
},
"sound": [
{"@attributes": {"filename": "sounds/ras_god_killsolders_zp_02.wav"}},
{"@attributes": {"filename": "sounds/ras_god_killsolders_zp_03.wav"}},
{"@attributes": {"filename": "sounds/ras_god_killsolders_zp_04.wav"}},
{"@attributes": {"filename": "sounds/ras_god_killsolders_zp_05.wav"}},
{"@attributes": {"filename": "sounds/ras_god_killsolders_zp_06.wav"}}
]
},
{
"@attributes": {
"filename": "sounds/ras_god_loose.wav",
"max_count": "4",
"name": "ras_god_loose"
}
},
{
"@attributes": {
"filename": "sounds/ras_voskrecshenie.wav",
"max_count": "1",
"name": "ras_voskrecshenie"
}
},
{
"@attributes": {
"filename": "sounds/ras_zaschitny_udar.wav",
"max_count": "1",
"name": "ras_zaschitny_udar"
}
},
{
"@attributes": {
"filename": "sounds/ras_god_technika_zp_01.wav",
"max_count": "5",
"name": "ras_god_technika",
"timeout": "0.1"
},
"sound": {"@attributes": {"filename": "sounds/ras_god_technika_zp_02.wav"}}
},
{
"@attributes": {
"filename": "sounds/zvezda_01.wav",
"max_count": "2",
"name": "zvezda_fall"
}
},
{
"@attributes": {
"filename": "sounds/zvezda_dvigenie_01.wav",
"max_count": "1",
"name": "zvezda_fly"
}
},
{
"@attributes": {
"filename": "sounds/pumpkin.wav",
"max_count": "1",
"name": "explode_unit_soldier_bonus1",
"timeout": "0.7"
}
},
{
"@attributes": {
"filename": "sounds/happy_04.wav",
"max_count": "1",
"name": "explode_unit_soldier_add_bonus1",
"timeout": "5"
},
"sound": [
{
"@attributes": {
"filename": "sounds/happy_01.wav",
"max_count": "1",
"timeout": "5"
}
},
{
"@attributes": {
"filename": "sounds/pumpkin.wav",
"max_count": "1",
"timeout": "5"
}
}
]
},
{
"@attributes": {
"filename": "sounds/chistmas_ded_pitch.wav",
"max_count": "1",
"name": "chistmas_ded_pitch"
}
},
{
"@attributes": {
"filename": "sounds/christmas_track_start.wav",
"max_count": "1",
"name": "christmas_track_start"
}
},
{
"@attributes": {
"filename": "sounds/christmas_drop_deer.wav",
"max_count": "1",
"name": "christmas_drop_deer"
}
},
{
"@attributes": {
"filename": "sounds/christmas_drop_bag.wav",
"max_count": "1",
"name": "christmas_drop_bag"
}
},
{
"@attributes": {
"filename": "sounds/christmas_freezing.wav",
"max_count": "1",
"name": "feast2_fire_tower_b"
}
},
{
"@attributes": {
"filename": "sounds/christmas_freezing_fast.wav",
"max_count": "1",
"name": "feast2_fire_tower_b_fast"
}
},
{
"@attributes": {
"filename": "sounds/christmas_lost_gift_1.wav",
"max_count": "3",
"name": "feast2_lost_life",
"timeout": "0.1"
},
"sound": [
{"@attributes": {"filename": "sounds/christmas_lost_gift_2.wav"}},
{"@attributes": {"filename": "sounds/christmas_lost_gift_3.wav"}},
{"@attributes": {"filename": "sounds/christmas_lost_gift_4.wav"}}
]
},
{
"@attributes": {
"filename": "sounds/sound_vezut_morozova.wav",
"max_count": "1",
"name": "christmas_mega_boss_start"
}
},
{
"@attributes": {
"filename": "sounds/halloween_pumpkin_appear.wav",
"max_count": "1",
"name": "halloween_pumpkin_appear"
}
},
{
"@attributes": {
"filename": "sounds/halloween_bad_pumpkin_appear.wav",
"max_count": "1",
"name": "halloween_bad_pumpkin_appear"
}
},
{
"@attributes": {
"filename": "sounds/halloween_pumpkin_expl.wav",
"max_count": "1",
"name": "halloween_pumpkin_expl"
}
},
{
"@attributes": {
"filename": "sounds/halloween_pumpkin_disappear.wav",
"max_count": "1",
"name": "halloween_pumpkin_disappear"
}
},
{
"@attributes": {
"filename": "sounds/halloween_bad_pumpkin_top_off.wav",
"max_count": "1",
"name": "halloween_bad_pumpkin_top_off"
}
},
{
"@attributes": {
"filename": "sounds/halloween_add_money.wav",
"max_count": "1",
"name": "halloween_add_money"
}
},
{
"@attributes": {
"filename": "sounds/halloween_dec_money.wav",
"max_count": "1",
"name": "halloween_dec_money"
}
},
{
"@attributes": {
"filename": "sounds/halloween_good_health.wav",
"max_count": "1",
"name": "halloween_good_health"
}
},
{
"@attributes": {
"filename": "sounds/halloween_scul.wav",
"max_count": "1",
"name": "halloween_scul"
}
},
{
"@attributes": {
"filename": "sounds/halloween_strong_enemies.wav",
"max_count": "1",
"name": "halloween_strong_enemies"
}
},
{
"@attributes": {
"filename": "sounds/halloween_week_enemies.wav",
"max_count": "1",
"name": "halloween_week_enemies"
}
},
{
"@attributes": {
"filename": "sounds/halloween_fear.wav",
"max_count": "1",
"name": "halloween_fear"
}
},
{
"@attributes": {
"filename": "sounds/halloween_noise.wav",
"max_count": "1",
"name": "halloween_noise"
}
},
{
"@attributes": {
"filename": "sounds/halloween_scarecrow_appearing.wav",
"max_count": "1",
"name": "halloween_scarecrow_appearing"
}
},
{
"@attributes": {
"filename": "sounds/halloween_happy.wav",
"max_count": "1",
"name": "halloween_happy"
}
},
{
"@attributes": {
"filename": "sounds/halloween_not_happy.wav",
"max_count": "1",
"name": "halloween_not_happy"
}
}
],
"comment": [
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{}
]
}
} No newline at end of file
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

🧩 Analysis chain

Verify all referenced sound assets exist and match case.

JSON shape looks consistent; ensure every "filename": "sounds/..." actually exists under the deployed path to avoid 404s at runtime (case matters on Linux).


🏁 Script executed:

#!/bin/bash
# Validate that all referenced files in soundmanager.json exist relative to static/_app/tools/toy-defence/data/game/
set -euo pipefail
BASE="static/_app/tools/toy-defence/data/game"
python - << 'PY'
import json, os, sys, re
base = "static/_app/tools/toy-defence/data/game"
with open(f"{base}/soundmanager.json","r",encoding="utf-8") as f:
    data = json.load(f)
missing=set()
seen=set()
def walk(v):
    if isinstance(v, dict):
        for k,val in v.items():
            if k=="@attributes" and isinstance(val, dict) and "filename" in val:
                fn = val["filename"]
                seen.add(fn)
                p = os.path.normpath(os.path.join(base, fn))
                if not os.path.exists(p):
                    missing.add(p)
            else:
                walk(val)
    elif isinstance(v, list):
        for i in v: walk(i)
walk(data)
print(f"Total referenced: {len(seen)}")
if missing:
    print("Missing files:")
    for m in sorted(missing): print(m)
    sys.exit(1)
print("All referenced files present.")
PY

Length of output: 8229


Missing referenced sound assets — action required

soundmanager.json references 109 files; verification reports these files are missing (paths relative to repo root):

static/_app/tools/toy-defence/data/game/sounds/chistmas_ded_pitch.wav
static/_app/tools/toy-defence/data/game/sounds/christmas_drop_bag.wav
static/_app/tools/toy-defence/data/game/sounds/christmas_drop_deer.wav
static/_app/tools/toy-defence/data/game/sounds/christmas_freezing.wav
static/_app/tools/toy-defence/data/game/sounds/christmas_freezing_fast.wav
static/_app/tools/toy-defence/data/game/sounds/christmas_lost_gift_1.wav
static/_app/tools/toy-defence/data/game/sounds/christmas_lost_gift_2.wav
static/_app/tools/toy-defence/data/game/sounds/christmas_lost_gift_3.wav
static/_app/tools/toy-defence/data/game/sounds/christmas_lost_gift_4.wav
static/_app/tools/toy-defence/data/game/sounds/christmas_track_start.wav
static/_app/tools/toy-defence/data/game/sounds/game_build_tower.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_tower_0.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_air.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_ground.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_soldier_bonus_0.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_soldier_bonus_1.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_soldier_bonus_2.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_soldier_bonus_3.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_soldier_bonus_4.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_soldier_bonus_5.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_soldier_bonus_6.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_soldier_bonus_7.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_soldier_bonus_8.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_soldier_bonus_9.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_truck_bonus_0.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_truck_bonus_1.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_truck_bonus_2.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_truck_bonus_3.wav
static/_app/tools/toy-defence/data/game/sounds/game_explode_unit_truck_bonus_4.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_antiaircraft_0.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_antiaircraft_1.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_antiaircraft_2.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_antiaircraft_fast_0.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_antiaircraft_fast_1.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_antiaircraft_fast_2.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_cannon_0.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_cannon_1.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_cannon_2.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_flame_0.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_flame_1.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_flame_2.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_flame_fast_0.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_flame_fast_1.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_flame_fast_2.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_gun_0.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_gun_1.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_gun_2.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_gun_double_0.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_gun_double_1.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_tower_gun_double_2.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_unit_grenade_0.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_unit_grenade_1.wav
static/_app/tools/toy-defence/data/game/sounds/game_fire_unit_missile.wav
static/_app/tools/toy-defence/data/game/sounds/game_game_over.wav
static/_app/tools/toy-defence/data/game/sounds/game_lost_life.wav
static/_app/tools/toy-defence/data/game/sounds/game_mission_completed.wav
static/_app/tools/toy-defence/data/game/sounds/game_mission_completed_world4.wav
static/_app/tools/toy-defence/data/game/sounds/game_ready_to_upgrade.wav
static/_app/tools/toy-defence/data/game/sounds/game_repair_tower.wav
static/_app/tools/toy-defence/data/game/sounds/game_sell_tower.wav
static/_app/tools/toy-defence/data/game/sounds/game_unit_aircraft_engine.wav
static/_app/tools/toy-defence/data/game/sounds/game_unit_machine_engine_1.wav
static/_app/tools/toy-defence/data/game/sounds/game_unit_machine_engine_2.wav
static/_app/tools/toy-defence/data/game/sounds/game_unit_soldier_step.wav
static/_app/tools/toy-defence/data/game/sounds/game_unit_tank_heavy_engine.wav
static/_app/tools/toy-defence/data/game/sounds/game_unit_tank_hit.wav
static/_app/tools/toy-defence/data/game/sounds/game_unit_tank_light_engine.wav
static/_app/tools/toy-defence/data/game/sounds/game_unit_tank_shoot.wav
static/_app/tools/toy-defence/data/game/sounds/game_upgrade_tower.wav
static/_app/tools/toy-defence/data/game/sounds/game_wave_boss_notification.wav
static/_app/tools/toy-defence/data/game/sounds/game_wave_start_aircraft.wav
static/_app/tools/toy-defence/data/game/sounds/halloween_add_money.wav
static/_app/tools/toy-defence/data/game/sounds/halloween_bad_pumpkin_appear.wav
static/_app/tools/toy-defence/data/game/sounds/halloween_bad_pumpkin_top_off.wav
static/_app/tools/toy-defence/data/game/sounds/halloween_dec_money.wav
static/_app/tools/toy-defence/data/game/sounds/halloween_fear.wav
static/_app/tools/toy-defence/data/game/sounds/halloween_good_health.wav
static/_app/tools/toy-defence/data/game/sounds/halloween_happy.wav
static/_app/tools/toy-defence/data/game/sounds/halloween_noise.wav
static/_app/tools/toy-defence/data/game/sounds/halloween_not_happy.wav
static/_app/tools/toy-defence/data/game/sounds/halloween_pumpkin_appear.wav
static/_app/tools/toy-defence/data/game/sounds/halloween_pumpkin_disappear.wav
static/_app/tools/toy-defence/data/game/sounds/halloween_pumpkin_expl.wav
static/_app/tools/toy-defence/data/game/sounds/halloween_scarecrow_appearing.wav
static/_app/tools/toy-defence/data/game/sounds/halloween_scul.wav
static/_app/tools/toy-defence/data/game/sounds/halloween_strong_enemies.wav
static/_app/tools/toy-defence/data/game/sounds/halloween_week_enemies.wav
static/_app/tools/toy-defence/data/game/sounds/happy_01.wav
static/_app/tools/toy-defence/data/game/sounds/happy_04.wav
static/_app/tools/toy-defence/data/game/sounds/music_menu.wav
static/_app/tools/toy-defence/data/game/sounds/pumpkin.wav
static/_app/tools/toy-defence/data/game/sounds/ras_autorepear.wav
static/_app/tools/toy-defence/data/game/sounds/ras_god_killsolders_zp_01.wav
static/_app/tools/toy-defence/data/game/sounds/ras_god_killsolders_zp_02.wav
static/_app/tools/toy-defence/data/game/sounds/ras_god_killsolders_zp_03.wav
static/_app/tools/toy-defence/data/game/sounds/ras_god_killsolders_zp_04.wav
static/_app/tools/toy-defence/data/game/sounds/ras_god_killsolders_zp_05.wav
static/_app/tools/toy-defence/data/game/sounds/ras_god_killsolders_zp_06.wav
static/_app/tools/toy-defence/data/game/sounds/ras_god_loose.wav
static/_app/tools/toy-defence/data/game/sounds/ras_god_technika_zp_01.wav
static/_app/tools/toy-defence/data/game/sounds/ras_god_technika_zp_02.wav
static/_app/tools/toy-defence/data/game/sounds/ras_voskrecshenie.wav
static/_app/tools/toy-defence/data/game/sounds/ras_zaschitny_udar.wav
static/_app/tools/toy-defence/data/game/sounds/shop_star.wav
static/_app/tools/toy-defence/data/game/sounds/sound_vezut_morozova.wav
static/_app/tools/toy-defence/data/game/sounds/ui_mission_completed.wav
static/_app/tools/toy-defence/data/game/sounds/ui_mission_final_effect.wav
static/_app/tools/toy-defence/data/game/sounds/zvezda_01.wav
static/_app/tools/toy-defence/data/game/sounds/zvezda_dvigenie_01.wav

Add/move/rename the listed files into static/_app/tools/toy-defence/data/game/sounds/ or update soundmanager.json to match the actual filenames (case-sensitive).

🤖 Prompt for AI Agents
static/_app/tools/toy-defence/data/game/soundmanager.json lines 1-680: the JSON
references ~109 sound files under
static/_app/tools/toy-defence/data/game/sounds/ that are missing or misnamed;
update the repo so referenced files exist or change the JSON to match actual
filenames. Action: verify the actual sound filenames (including correct casing
and paths), then either add/move/rename the missing .wav files into
static/_app/tools/toy-defence/data/game/sounds/ with the exact names used in
soundmanager.json, or edit soundmanager.json entries to point to the correct
existing filenames/paths (ensure JSON stays valid and paths are case-sensitive),
and run the verification script to confirm no missing assets remain.

Comment on lines +110 to +149
"btndone": {
"@attributes": {"copy": "common/buttons.xml|buttons/button_medium_square"},
"button": {
"out": {
"@attributes": {
"anchor": "2",
"position": "50 50"
},
"sprite": {
"@attributes": {
"position": "0 -3",
"hotspot": "40 40",
"rect": "0 0 80 80",
"texture": "common/icons/next.png"
}
}
},
"pressed": {
"@attributes": {
"anchor": "2",
"position": "50 50"
},
"sprite": {
"@attributes": {
"position": "0 -3",
"hotspot": "40 40",
"rect": "0 0 80 80",
"texture": "common/icons/next.png"
}
}
}
},
"sounds": {"@attributes": {"click": "sounds/ui_button_click.wav"}},
"particle": {
"@attributes": {
"delta": "-16 -16",
"name": "button_big_flare"
}
}
},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

🧩 Analysis chain

Asset existence and dependency hygiene

Multiple textures/sounds and copies from common/buttons.xml are referenced. Let’s verify all assets exist to avoid runtime 404s.

Run:

Also applies to: 256-362, 364-533


🏁 Script executed:

#!/bin/bash
set -euo pipefail
f=static/_app/tools/toy-defence/data/game/towers_bar.json
jq empty "$f"

# textures
jq -r '..|objects|.["@attributes"]?.texture? // empty' "$f" | sort -u \
 | while read -r p; do test -f "static/_app/tools/toy-defence/data/$p" || echo "MISSING texture: $p"; done

# sounds
jq -r '..|objects|.["@attributes"]?.click? // empty' "$f" | sort -u \
 | while read -r s; do test -f "static/_app/tools/toy-defence/data/$s" || echo "MISSING sound: $s"; done

# copy references (XML): just list for manual verification
jq -r '..|objects|.["@attributes"]?.copy? // empty' "$f" | sort -u

Length of output: 1227


Restore or correct missing assets referenced by towers_bar.json

  • File: static/_app/tools/toy-defence/data/game/towers_bar.json (affected regions noted in original review).
  • Missing textures (paths are relative to static/_app/tools/toy-defence/data/):
    • common/icons/ico_no.png
    • common/icons/ico_yes_red.png
    • common/icons/next.png
    • common/tile.png
    • common/tile_shadow.png
    • common/tooltip_0.png
    • common/tooltip_1.png
    • common/tooltip_2.png
    • common/tooltip_3.png
    • common/tooltip_4.png
    • fonts/font_shilda1.png
    • fonts/soldier_font1.png
    • fonts/soldier_font4_small.png
    • fonts/soldier_font5.png
    • game/infobar/infobar_12.png
    • game/infobar/infobar_13.png
    • game/infobar/infobar_14.png
    • game/infobar/infobar_15.png
    • game/infobar/infobar_16.png
    • game/infobar/infobar_17.png
    • game/infobar/infobar_18.png
    • game/infobar/infobar_19.png
    • game/infobar/infobar_20.png
    • game/infobar/infobar_21.png
  • Missing sound:
    • sounds/ui_button_click.wav
  • Copy references to verify in common/buttons.xml:
    • common/buttons.xml|buttons/button_close
    • common/buttons.xml|buttons/button_confirm_no
    • common/buttons.xml|buttons/button_medium_square
    • common/buttons.xml|buttons/button_shop_small

Action: add the missing asset files at the listed paths or update towers_bar.json to point to existing assets; verify the XML copy entries exist and reference valid assets.

🤖 Prompt for AI Agents
In static/_app/tools/toy-defence/data/game/towers_bar.json around lines 110–149
the file references several missing asset paths and button copy entries
(textures, fonts, infobar images and sounds) which break UI rendering; restore
the listed files under their exact paths (common/icons/ico_no.png,
common/icons/ico_yes_red.png, common/icons/next.png, common/tile.png,
common/tile_shadow.png, common/tooltip_0.png..tooltip_4.png,
fonts/font_shilda1.png, fonts/soldier_font1.png, fonts/soldier_font4_small.png,
fonts/soldier_font5.png, game/infobar/infobar_12.png..infobar_21.png,
sounds/ui_button_click.wav) or update towers_bar.json to reference existing
assets, and ensure the referenced copy entries exist in common/buttons.xml
(buttons/button_close, buttons/button_confirm_no, buttons/button_medium_square,
buttons/button_shop_small) so all texture, font and sound paths and XML copies
resolve correctly.

@Inglan Inglan merged commit 909d1bf into prod Sep 18, 2025
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants