-
Notifications
You must be signed in to change notification settings - Fork 1
removal of firebase deployments, dependency updates, fixes #509
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
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>
…loyment remove firebase
…fense add blockpost
…t-install-dependencies fix #494
…t-install-dependencies continue fixing #494
…/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>
…eyboard-in-minecraft fix gmae focus
Co-authored-by: Inglan <96573515+Inglan@users.noreply.github.com>
Remove tags and links from games to simplify adding new games
use a reverse proxy for posthog analytics
…/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
WalkthroughThis 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
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
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested reviewers
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests
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. Comment |
Deploying edutools-testing with
|
| Latest commit: |
d73daa1
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://0d138b5d.edutools-testing.pages.dev |
| Branch Preview URL: | https://main.edutools-testing.pages.dev |
There was a problem hiding this 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-allto 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-lockfileOptional (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-lockfilesrc/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.tsacross 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_HOSTfromanalytics.tsas 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.jsonAll 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 itTips 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 runtimemy_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
⛔ Files ignored due to path filters (266)
package-lock.jsonis excluded by!**/package-lock.jsonpnpm-lock.yamlis excluded by!**/pnpm-lock.yamlstatic/_app/tools/toy-defence/favicon.icois excluded by!**/*.icostatic/_app/tools/toy-defence/images/1.5/comics/anim.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/comics/back.jpgis excluded by!**/*.jpgstatic/_app/tools/toy-defence/images/1.5/common/buttons/button_close.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/buttons/button_confirm_no.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/buttons/button_medium_long.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/buttons/button_medium_square.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/buttons/button_shop_small.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/checkbox.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/hint_arrow.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/hint_hand.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons/achievements.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons/action.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons/back.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons/button_leaders_ico.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons/ch_mission.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons/credits_big.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons/fullscreen.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons/ico_no.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons/ico_yes_red.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons/main_menu.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons/more_games.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons/next.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons/options.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons/restart.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons/shop.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_0.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_10.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_11.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_12.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_13.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_14.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_15.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_16.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_17.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_18.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_19.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_20.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_21.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_4.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_5.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_6.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_7.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_8.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/icons_perks_9.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/notifications_10.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/notifications_11.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/notifications_12.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/notifications_13.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/notifications_14.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/notifications_15.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/notifications_16.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/notifications_17.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/notifications_18.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/notifications_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/notifications_4.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/notifications_5.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/notifications_6.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/notifications_7.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/notifications_8.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/notifications_9.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/scroll_bg.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/scroll_point.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/tile.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/tile_shadow.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/common/tower_hint.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/dialogs/achives.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/dialogs/ingame.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/dialogs/loose.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/dialogs/message.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/dialogs/new_game.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/dialogs/notification.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/dialogs/options.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/dialogs/tooltip.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/dialogs/win.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/flags/cz.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/flags/de.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/flags/en.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/flags/es.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/flags/fr.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/flags/it.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/flags/nl.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/flags/pt.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/flags/ru.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/flags/sv.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/flags/tr.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/fonts/font_shilda.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/fonts/font_shilda1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/fonts/font_shilda1_disabled.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/fonts/number_font.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/fonts/number_font_small.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/fonts/soldier_font1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/fonts/soldier_font3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/fonts/soldier_font4.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/fonts/soldier_font4_small.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/fonts/soldier_font5.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/fonts/soldier_font5_rect.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/fonts/soldier_font6.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/bullets/bullets_0.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/bullets/bullets_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/bullets/bullets_2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/bullets/bullets_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/bullets/bullets_4.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/bullets/bullets_5.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/animation/burning.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_10.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_11.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_12.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_13.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_14.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_15.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_16.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_17.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_18.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_19.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_20.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_21.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_22.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_23.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_24.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_25.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_26.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_27.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_28.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_5.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_8.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/enemies/enemies_9.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_0.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_10.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_11.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_12.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_13.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_14.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_15.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_16.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_4.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_5.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_6.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_7.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_8.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/icons_hero_9.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/infobar_12.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/infobar_13.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/infobar_14.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/infobar_15.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/infobar_16.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/infobar_17.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/infobar_18.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/infobar_19.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/infobar_20.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/infobar_21.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/infobar_23.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_0.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_10.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_11.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_12.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_13.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_14.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_15.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_16.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_17.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_18.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_19.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_20.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_4.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_5.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_6.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_7.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_8.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/infobar/tower_button_9.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/dead_tower_small2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_0.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_10.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_11.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_12.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_13.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_14.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_15.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_16.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_17.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_18.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_19.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_20.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_21.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_22.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_23.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_24.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_25.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_26.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_27.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_28.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_29.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_30.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_31.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_32.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_33.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_34.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/towers/towers_9.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/cell_0.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/flag_anim_0.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_01_bg_0.jpgis excluded by!**/*.jpgstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_01_bg_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_01_bg_2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_01_bg_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_02_bg_0.jpgis excluded by!**/*.jpgstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_02_bg_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_02_bg_2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_02_bg_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_02_bg_4.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_03_bg_0.jpgis excluded by!**/*.jpgstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_03_bg_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_03_bg_2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_03_bg_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_03_bg_4.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_04_bg_0.jpgis excluded by!**/*.jpgstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_04_bg_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_04_bg_2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_04_bg_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_05_bg_0.jpgis excluded by!**/*.jpgstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_05_bg_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_05_bg_2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_05_bg_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_06_bg_0.jpgis excluded by!**/*.jpgstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_06_bg_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_06_bg_2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_06_bg_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_06_bg_4.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_07_bg_0.jpgis excluded by!**/*.jpgstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_07_bg_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_07_bg_2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_07_bg_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_07_bg_4.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_08_bg_0.jpgis excluded by!**/*.jpgstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_08_bg_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_08_bg_2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_08_bg_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_09_bg_0.jpgis excluded by!**/*.jpgstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_09_bg_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_09_bg_2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_09_bg_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_01_09_bg_4.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_02_01_bg_0.jpgis excluded by!**/*.jpgstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_02_01_bg_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_02_01_bg_2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_02_01_bg_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_02_02_bg_0.jpgis excluded by!**/*.jpgstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_02_02_bg_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_02_02_bg_2.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_02_02_bg_3.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_02_03_bg_0.jpgis excluded by!**/*.jpgstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_02_03_bg_1.pngis excluded by!**/*.pngstatic/_app/tools/toy-defence/images/1.5/game/worlds/world_02_03_bg_2.pngis 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.txtstatic/_app/tools/toy-defence/data/game/notifications.jsonstatic/_app/tools/toy-defence/data/game/towers_bar.jsonstatic/_app/tools/toy-defence/data/game/tooltip.jsonstatic/_app/tools/toy-defence/data/game/soundmanager.jsonstatic/_app/tools/toy-defence/data/game/worlds/units_world_01.jsonstatic/_app/tools/toy-defence/data/game/bonuses.jsonstatic/_app/tools/toy-defence/data/game/perks.jsonstatic/_app/tools/toy-defence/data/game/bullets.jsonstatic/_app/tools/toy-defence/ahrefs_585f4691b0e399a160cb6e0c016b4fcd7b0c55de8ae4d7dc4c83d5d0761520b3static/_app/tools/toy-defence/data/game/worlds.jsonstatic/_app/tools/toy-defence/data/game/towers_hierarchy.jsonstatic/_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.txtstatic/_app/tools/toy-defence/data/game/notifications.jsonstatic/_app/tools/toy-defence/data/game/towers_bar.jsonstatic/_app/tools/toy-defence/data/game/tooltip.jsonstatic/_app/tools/toy-defence/data/game/soundmanager.jsonstatic/_app/tools/toy-defence/data/game/worlds/units_world_01.jsonstatic/_app/tools/toy-defence/data/game/bonuses.jsonstatic/_app/tools/toy-defence/data/game/perks.jsonstatic/_app/tools/toy-defence/data/game/bullets.jsonstatic/_app/tools/toy-defence/ahrefs_585f4691b0e399a160cb6e0c016b4fcd7b0c55de8ae4d7dc4c83d5d0761520b3static/_app/tools/toy-defence/data/game/worlds.jsonstatic/_app/tools/toy-defence/data/game/towers_hierarchy.jsonstatic/_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.txtsrc/lib/analytics.tspackage.jsonsrc/lib/components/tracker-dialog.sveltestatic/_app/tools/toy-defence/data/game/notifications.jsonstatic/_app/tools/toy-defence/data/game/towers_bar.jsonsrc/lib/components/play.sveltestatic/_app/tools/toy-defence/data/game/tooltip.jsonstatic/_app/tools/toy-defence/data/game/soundmanager.jsonstatic/_app/tools/toy-defence/data/game/worlds/units_world_01.jsonstatic/_app/tools/toy-defence/data/game/bonuses.jsonstatic/_app/tools/toy-defence/data/game/perks.jsonstatic/_app/tools/toy-defence/data/game/bullets.jsonstatic/_app/tools/toy-defence/data/game/worlds.jsonstatic/_app/tools/toy-defence/data/game/towers_hierarchy.jsonstatic/_app/tools/toy-defence/data/game/towers.jsonsrc/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.tspackage.jsonsrc/lib/components/tracker-dialog.sveltestatic/_app/tools/toy-defence/data/game/notifications.jsonstatic/_app/tools/toy-defence/data/game/towers_bar.jsonsrc/lib/components/play.sveltestatic/_app/tools/toy-defence/data/game/tooltip.jsonstatic/_app/tools/toy-defence/data/game/soundmanager.jsonstatic/_app/tools/toy-defence/data/game/worlds/units_world_01.jsonstatic/_app/tools/toy-defence/data/game/bonuses.jsonstatic/_app/tools/toy-defence/data/game/perks.jsonstatic/_app/tools/toy-defence/data/game/bullets.jsonstatic/_app/tools/toy-defence/data/game/worlds.jsonstatic/_app/tools/toy-defence/data/game/towers_hierarchy.jsonstatic/_app/tools/toy-defence/data/game/towers.jsonsrc/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.tssrc/lib/components/tracker-dialog.sveltesrc/lib/components/play.sveltesrc/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.tssrc/lib/components/tracker-dialog.sveltesrc/lib/components/play.sveltesrc/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 + allowfullscreenstatic/_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-defenceSandbox 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 expectationsTower 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 formattingConfirmation 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.jsonworlds.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: OKnpx --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 | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 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).
| { | ||
| "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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 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.jsonLength 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.
| { | ||
| "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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 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.")
PYLength 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.
| "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" | ||
| } | ||
| } | ||
| }, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 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 -uLength 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.
Summary by CodeRabbit
New Features
Improvements
Chores