Vampire Survivor Benchmark — Claude Opus 5

Shared Jul 25, 2026, 1:14 PM · Updated Jul 25, 2026, 1:14 PM

Create me a 3d vampire survivor game. The game spec is in the project root.

Claude Opus 5·

I'll start by reading the game spec in the project root.

This is a large spec. Let me read the whole thing.

I've read the full spec (3570 lines). Let me inspect the KayKit assets and the test harness conventions before building.

Assets verified — I can bake KayKit rigged models into single static meshes (5.8k tris, standing correctly). Now let me plan the build.

Todos
  • Phase 1: project settings, folders, autoloads, core math/data classes
  • Phase 2: content database (weapons, passives, enemies, waves, meta, characters)
  • Phase 3: menus + scene routing (main, character select, settings, legacy, results)
  • Phase 4: arena, player, camera, run scene, HUD
  • Phase 5: combat core (pools, registry, damage, enemies, XP, Blood Surge)
  • Phase 6: run progression (levels, 3-card choices, reroll, inventory, passives)
  • Phase 7: six weapons + six evolutions
  • Phase 8: all enemy archetypes, elite, wave director
  • Phase 9: chests, evolutions UI, four bosses, victory/death/results
  • Phase 10: meta progression, unlocks, persistence
  • Phase 11: polish (damage numbers, shake, telegraphs, debug overlay)
  • Phase 12: automated tests, smoke tests, fix errors, BUILD_REPORT.md

Starting Phase 1 — core foundation classes.

Now the content database — all game data as typed Resources.

Now the visual asset baker (converts rigged KayKit models into cheap shared static meshes).

Cyclic class references, content DB, and mesh baking all verified. Now the player, components, and camera.

Now the enemy system — base lifecycle plus behaviors.

Now the weapon system.

Now the menus and HUD.

Now project settings: autoloads, display, layers, main scene.

Now let me refresh the class cache and playtest the menu flow.

Rendering on this host is throttled to ~1 FPS even for a single cube (headless logic runs at 145 FPS), so I'll verify behaviour headlessly. Writing the test suite now.

Now let me debug the pool reset failure directly.

The -s script mode has no autoloads and no tree — I'll make the harness a scene instead.

All 49 unit tests pass. Now the integration tests (spec §32.2/32.3).

Found a critical bug: kill credit is set after damage, so the death signal fires before credit. Let me fix and probe bosses.

Found the real bugs: hit queries compared 3D distance (projectiles fly at y=1, enemies at y=0), plus an Area3D deferred-property error. The test also needs to resolve level-up panels.

Smoke test fully passes. Now the accelerated full-run test and performance soak.

Let me fix remaining warnings and implement the reduced-flashes setting + chest signal.

Now the 90-second normal-play test:

Now visual verification of the remaining screens.

The chest panel is mis-sized (anchors without offsets). Fixing the overlay panels.

Those are consistent now. Let me re-run the full test suite to confirm nothing broke.

Let me visually verify the KayKit character baking up close.

The models bake correctly. Let me check whether the bundled animation library matches the rig, so the player can be animated.

The animation library matches the rig. Let me animate the player and bosses (few skinned instances) while keeping the crowd on cheap static meshes.

Now wire the animated visual into the player:

Now the same for bosses in the enemy base:

Todos
  • Phase 1: project settings, folders, autoloads, core math/data classes
  • Phase 2: content database (weapons, passives, enemies, waves, meta, characters)
  • Phase 3: menus + scene routing (main, character select, settings, legacy, results)
  • Phase 4: arena, player, camera, run scene, HUD
  • Phase 5: combat core (pools, registry, damage, enemies, XP, Blood Surge)
  • Phase 6: run progression (levels, 3-card choices, reroll, inventory, passives)
  • Phase 7: six weapons + six evolutions
  • Phase 8: all enemy archetypes, elite, wave director
  • Phase 9: chests, evolutions UI, four bosses, victory/death/results
  • Phase 10: meta progression, unlocks, persistence
  • Phase 11: polish (damage numbers, shake, telegraphs, debug overlay, animated player/bosses)
  • Phase 12: final full verification pass + BUILD_REPORT.md

Final full verification pass across the whole suite:

Ziva's runner doesn't attach test nodes to the tree, which breaks the pool test there. Let me make it environment-independent.

Now genuinely clean in both harnesses. Final end-to-end playtest from the configured main scene:

Now the build report:

The running editor overwrote project.godot, dropping the input section and stringifying numbers. Let me repair it properly.

Todos
  • Phase 1: project settings, folders, autoloads, core math/data classes
  • Phase 2: content database (weapons, passives, enemies, waves, meta, characters)
  • Phase 3: menus + scene routing (main, character select, settings, legacy, results)
  • Phase 4: arena, player, camera, run scene, HUD
  • Phase 5: combat core (pools, registry, damage, enemies, XP, Blood Surge)
  • Phase 6: run progression (levels, 3-card choices, reroll, inventory, passives)
  • Phase 7: six weapons + six evolutions
  • Phase 8: all enemy archetypes, elite, wave director
  • Phase 9: chests, evolutions UI, four bosses, victory/death/results
  • Phase 10: meta progression, unlocks, persistence
  • Phase 11: polish (damage numbers, shake, telegraphs, debug overlay, animated player/bosses)
  • Phase 12: full verification pass + BUILD_REPORT.md

NIGHTBOUND: LAST DAWN is built and verified.

1. Main scene: res://scenes/main/main.tscn

2. Controls: WASD/arrows or left stick = move · Space/A = Blood Surge · Esc/Start = pause · Enter/A = confirm · F3 debug overlay · F8 clock 1x/5x/20x/60x · F9 grant level · F10 spawn chest (debug builds only).

3. Implemented systems: full state flow (menu → character select → run → death/victory → results), player controller with Blood Surge, damage/armour/bleed/slow/lifesteal rules, 6 weapons + 6 evolutions with every exact level step, 6 passives with recalculated stats, XP curve + queued level-ups + weighted three-card choices + one reroll, 3+3 inventory slots with in-place evolutions, 6 ordinary enemy archetypes + Crimson Knight elite + all 4 bosses (Bell Keeper, Inquisitor, Moon Bishop, three-phase Solar Warden), threat-budget wave director with all 8 phases and timed encounters, XP motes/health phial/blood magnet/time shard, elite & boss chests, KayKit arena with Forest-pack decoration, full HUD + level-up/chest/pause/settings/Legacy/results screens, 3 characters with unlock conditions, 6 Legacy upgrades, validated user://save.cfg, pooling with hard caps everywhere, spatial hash targeting, damage numbers, camera shake, reduced-flash border pulse, and an F3 debug overlay.

4. Automated tests (run, not assumed):

  • 10 unit files, 59 test methods, 0 failures (res://tests/run_tests.tscn)
  • Integration smoke, spec §32.2: 63 checks, 0 failures
  • Accelerated full run: 19 checks, 0 failures — 20:00 at 60×, all 4 bosses, an evolution, victory, results payload
  • Performance soak §32.3: 27 checks, 0 failures — 240 enemies + 200 projectiles + 80 zones + 220 motes for 30 s, every cap held

5. Smoke test: 90-second normal-speed run passed with 0 uncaught errors (90.0 s clock, 121–183 kills, 5–6 level-ups). Menus, HUD, level-up cards, chest/evolution panel, pause menu and debug overlay were each verified on-screen in the editor.

6. Deliberate differences: renderer left on the project's pre-existing GL Compatibility instead of Forward+; player and bosses use the rigged KayKit models with the bundled Rig_Medium animations while the 240-enemy crowd uses one-draw-call static meshes flattened from the same models (spec allows static); player-attack hits resolve via the enemy registry rather than one Area3D per projectile (enemy contact damage and pickups do use the specified layers); UI screens are thin .tscn roots that build their layout in code; content data lives in typed Resources created by data/*_library.gd instead of many .tres files; audio is silent (no bundled audio assets) but every event id is wired. Caveat: this host presents ~1 FPS for any windowed 3D scene (a single-cube baseline measured 1.2 FPS), so on-screen FPS is unmeasurable here — headless logic ran at 137–142 FPS under maximum load.

7. Report: res://BUILD_REPORT.md (includes the full §41 acceptance checklist).