Repository navigation
Skirmish: a full-stack real-time card battler sample - #6074
Conversation
A Clash Royale-style card battler sample. This first piece is the rules module the app, the server and the replay viewer will all run: fixed 20 Hz ticks, integer-only arithmetic, a seeded SplitMix64 RNG, a data driven card catalog, a practice bot, and replays as seed + decks + command log. Tests pin determinism with a golden replay corpus that the cross-platform check will replay on ParparVM and the JS port. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Accounts, decks, trophy matchmaking with a bot fallback, challenge links, a lockstep match loop over /ws/game that runs the shared rules, replays, a coin/gem shop with server-side store receipt validation and capped rewarded ads, player reports and automatic flags, and audited admin moderation. Flyway migrations for SQLite, PostgreSQL and MySQL. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Codename One client: a com.codename1.gaming arena with CSS-styled widgets around it (hand, elixir meter, name banner), practice against the bot, online lockstep, challenge links, replays, deck builder, shop with server-validated purchases, rewarded/interstitial/banner ads, analytics, push, and the admin god-mode console. Simulator E2E tests capture the developer-guide screenshots. Hash hex moves into the rules module because Long.toHexString does not exist on device. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…Emitter GltfLoader.loadScene reads every node, primitive, material, skin and clip; AnimatedModel CPU-skins and cross-fades clips through dirty vertex buffers so no backend changes; ParticleEmitter draws camera-facing additive or alpha billboards in one call. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Progression keeps experience, chest slots, lifetime counters and three daily quests per player in a new progress table (portable V4). A finished match feeds it from Results; quests, chests and the training battle pay out through /api/progress. Flags.auto opens its own transaction so the demo seeding's flag is actually stored. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pups - A training battle walks a new player through elixir, deploying, defending and spells: a mentor in a speech bubble, time held still while she talks, and an animated finger on the card to pick and the spot to drag it to. It starts on a new player's first visit and is replayable from "How to play". - Cards are framed renders of the battle's own 3D models (CardArt), with an elixir drop and a name ribbon, in the hand, the deck and the home strip; heroes in their victory pose on sign-in, home, results and reward popups. PortraitStudio also renders the Imp Den. - Home shows the hero, level and XP bar, chest slots, daily quests with a claim button, and a trophy room of achievements; rewards, level-ups and unlocks pop up with the hero. - Fields and buttons share one centred column width, so sign-in and register line up. - Demo accounts are seeded with some progress; the dead 2D sprite code in Art and Viewport is gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nd back arrow fixes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…S SoundPool crashes The iOS sound pool's load shadowed its pool argument with POOL_BEGIN's autorelease pool, and play dispatch_sync'ed to the main queue from the GPU view's frame callback, which already runs there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d CI Adds the user's and implementor's guides, the /skirmish/ website page and flagship card, the README, the Initializr template and the skirmish workflow. Challenge links open the installed app through its skirmish: URL scheme unless a hosted browser build is configured. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # NOTICE
|
Developer Guide build artifacts are available for download from this workflow run:
Developer Guide quality checks: |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Compared 214 screenshots: 214 matched. |
|
Compared 193 screenshots: 193 matched. Benchmark ResultsDetailed Performance Metrics
ParparVM vs HotSpot (JDK 25): Windows x64Runner CPU: AMD64 Family 25 Model 1 Stepping 1, AuthenticAMD (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in
Result: no regression |
✅ Continuous Quality ReportTest & Coverage
Static Analysis
Generated automatically by the PR CI workflow. |
|
Compared 193 screenshots: 193 matched. Benchmark ResultsDetailed Performance Metrics
ParparVM vs HotSpot (JDK 25): Windows arm64Runner CPU: ARMv8 (64-bit) Family 8 Model D49 Revision 0, MICROSOFT CORPORATION (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in
Result: no regression |
…lent sim audio - Core gaming classes: foreach loops and documented NOPMD on the intentional identity checks and the per-frame scratch matrix; AnimatedModel and ParticleEmitter javadoc examples are complete runnable programs. - Guide: Playground opt-out for sample code, the MCP link uses the chapter's generated id again (the explicit anchor broke the website's links), LanguageTool terms. - Skirmish: placeholder android.licenseKey for its in-app purchases; Sfx only uses a native mixer, so a simulator without an audio device stays silent instead of starting a browser engine per sound. - From #6059: perf-baseline overlay 5976 re-measured, starter-launchers macOS timeout. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cloudflare Preview
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Compared 178 screenshots: 178 matched. Native Android coverage
✅ Native Android screenshot tests passed. Native Android coverage
Benchmark ResultsDetailed Performance Metrics
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s, server packs, files and verified mission results Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…uide - Forge home (official, popular, new, yours), pack screen with campaigns, stars, share, remix, rate and report; deep links open a pack. - Editors for packs, cards (stats, bundled looks or an imported .glb with its clips mapped on a turntable), arenas (towers and obstacles on a grid, mirrored, any size and lane count), missions (goal, elixir, decks, waves, story lines, stars, rewards, test play) and campaigns. - Missions play through BattleForm with a MissionDriver: story lines stop the clock, results go to the server, which plays them again. - Battle view draws any arena, custom cards and uploaded models. - Admin console Forge tab: reported packs, hide/restore/official, and the uploaded files to look at, approve or reject. - Theme styles for the Forge, an e2e test that captures its screens, guide sections for players and implementors, template resync. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Flutter vs Codename OneSame application, built both ways: Flutter's AOT compile of the gallery, and the identical Dart source transpiled to Java on Codename One. Lower is better for every metric, so a ratio above 1.00x means Codename One is ahead by that factor. android9 interleaved rounds; host load 0.46, 1.64, 1.31
Compute -- the VM workloads (
Gate: within tolerance against
ios9 interleaved rounds; host load 29.95, 36.13, 29.61
Compute -- the VM workloads ( Not measured: iOS compute is not measured: a device build needs signed hardware, and on the simulator Flutter runs its JIT debug engine rather than AOT code. The macOS row runs the same ParparVM and Dart AOT compilers on the same Apple silicon. Gate: within tolerance against
javascript9 interleaved rounds; host load 2.33, 1.68, 0.77
Compute -- the VM workloads (
Gate: within tolerance against
linux9 interleaved rounds; host load 0.47, 2.82, 2.37
Compute -- the VM workloads (
Gate: OUTSIDE THE BASELINE against
windows9 interleaved rounds
Compute -- the VM workloads (
Gate: within tolerance against
Codename One wins 21 of 21 measured metrics across 5 platform(s). |
- ContentPack's hash uses Match.hex, not Long.toHexString, which the device runtime lacks (bytecode compliance, Android and template builds). - Forge splits the stored animation list with Lists.split; String.split is not in the compiled backend's runtime. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Compared 193 screenshots: 193 matched. Benchmark ResultsDetailed Performance Metrics
|
…and push, the admin Promote tab - Invites: com.codename1.analytics.invite links carrying the player's referral code; the friend's app reads the attribution on start and claims it after signing in. The server keeps only the economy: codes, who joined through whom, and the rewards (refused for old accounts, own codes and second claims; inviter paid after the friend's first battle, at most ten friends). first_battle/first_win conversions. - Engagement is read in the Codename One analytics console: user properties for level and trophy band, invite and push-open events, AppReview after a win. - Promote tab: opens the analytics console, broadcasts Codename One push to a segment with a campaign the app reports on open (counted and confirmed, five a day), the home spotlight banner, campaign links. - The console's tabs are a side bar on desktop and tablet; run-e2e.sh runs a second, desktop pass on Linux for PromoteTest. - E2e.click taps components that are not Buttons (ForgeHome's pack rows are MultiButtons, which failed ForgeTest); ShopForm ignores a load that finishes after sign-out. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tlight, LanguageTool and template fixes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…g admin tabs on phones, ForgeTest mission id, guide prose The e2e screenshots showed white boxes behind every Forge and Promote label, help text and the invite code: those UIIDs were missing from the theme's transparent list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… new-pack mission, remaining white icon and value boxes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hots from the restyled screens Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…fter the Forge tests Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…poser, confirmation and spotlight Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Compared 193 screenshots: 193 matched. ParparVM vs HotSpot (JDK 25): Linux x64Runner CPU: AMD EPYC 9V45 96-Core Processor (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in
Result: no regression |
|
Compared 193 screenshots: 193 matched. ParparVM vs HotSpot (JDK 25): Linux arm64Runner CPU: Neoverse-N2 (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in
Result: no regression |
✅ ByteCodeTranslator Quality ReportTest & Coverage
Benchmark Results
Static Analysis
Generated automatically by the PR CI workflow. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…elines; one implementor guide The admin console is a native-looking desktop tool (Desk widgets, aligned label column, light palette, side bar) with charts of daily players, battles, gems, the funnel, retention and the trophy ladder; a query tool over player records; and pipelines that act on matching players hourly with a per-player cool-down. Forge labels get room and margins. The users' guide is folded into the implementor guide. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Compared 179 screenshots: 179 matched. Benchmark Results
Detailed Performance Metrics
ParparVM vs HotSpot (JDK 25): macOS arm64Runner CPU: Apple M1 (Virtual) (baseline 1 performance regression:
Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in
A change that moves performance ON PURPOSE records the new baseline in Result: performance regression |
|
Compared 236 screenshots: 236 matched. |
|
Compared 176 screenshots: 176 matched. Benchmark Results
Build and Run Timing
Detailed Performance Metrics
|
…ide section on reports, queries and pipelines String.split is not in the compiled backend's runtime, so Audience splits by hand. The two-series legend gets its own row, funnel labels are shorter, and the condition rows share one joint-label width. The guide gains the console's Reports, Query and Pipelines screenshots from CI, and LanguageTool's two matches are reworded. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… two-series charts, refreshed console screenshots On MySQL the first battle's result, recorded on the match ticker's thread, and a progress read could both insert the player's progress row; the second insert waited on the uncommitted row and failed with a duplicate key. Reading now answers a fresh row without storing it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds Skirmish, a third full-stack sample next to Wayline and Savor, this time a game: a Clash Royale-style real-time card battler with a Codename One client and a Codename One Backend in
scripts/skirmish.What's in it
rules: a deterministic simulation with no floating point, no clock and its own seeded RNG. The app, the server, replays and the tests all compile it. Golden replays and determinism tests are included.backend:common:com.codename1.gaming, using glTF KayKit models (CC0, NOTICE entry) and particles, with a finishing camera sweep;ios: the native iOS build (ios-source)./skirmish/website page and flagship card;.github/workflows/skirmish.ymlcovers template parity, rules, the backend on the JVM and on real databases, client E2E, and Android and iOS builds.Framework changes
IOSNative.mSoundPool fixes:nativeLoadSound'sPOOL_BEGINshadowed the pool parameter and crashed on load.dispatch_syncfrom the GPU frame callback deadlocked. It now runs the block inline when already on the main thread.MCP-Headless-API.asciidocgets an explicit anchor so other chapters can link it.validate-guide-snippets.pyaccepts CSS snippets from the sample's own compiled theme.sync-initializr-template.pygains:rulesmodule;.txthandled as text.Savor and Wayline parity still pass.
🤖 Generated with Claude Code