UnityTowerDefense/Project_Roadmap.md

11 KiB
Raw Permalink Blame History

Unity Tower Defense — Project Roadmap

Purpose

The forward-looking plan: what's done, what's next, and the sequencing. Current-state architecture and the full list of implemented systems live in Project_Context.md — read that first for "how things work today." This document focuses on direction and remaining work.

Last substantial update: 2026-06-24.


The game

A co-op tower-defense / roguelike hybrid (up to 9 players, Steam). Wintermaul-style maze defense — build towers to snake enemies through your zone (shared lives, per-player gold) — fused with a roguelike draft.

Roguelike core loop

All players start with the same three towersBasic Arrow (ground+air, single-target), Siege Cannon (ground-only, splash), Wall (no damage, near-free, maze-shaping). Players grow a personal deck/"build" through a 3-option draft at match start and after every wave. The draft is free; players can also spend gold to buy extra rolls, creating the central tension: spend gold on towers (your maze) vs. spend on rolls (your build).

Five draft choice archetypes:

  1. New tower — add a tower to your buildable arsenal.
  2. Tower upgradesystemic first ("all towers of damage-type/projectile-type X gain Y", "unlock Lv.2 across the deck"); per-tower trees only later if needed.
  3. Enemy debuff — temporary (weaker / slower / downgrade a tier); cost scales with duration.
  4. Builder ability — active, targeted, in-wave, cooldown-based (e.g. Call Lightning, Haste, Stasis Trap).
  5. Relic quest — opt-in secondary objective granting a powerful passive Relic.

Locked design decisions

  • Draft is free at match start + after each wave; a gold shop buys extra rolls, available any time (provisional — may change).
  • Per-player decks/progression (each player drafts independently).
  • Tower upgrades are systemic-first.
  • Draft pacing: the prep phase before each wave is the draft window; unpicked drafts auto-resolve at prep end so no slow/AFK player stalls the group.
  • Draft options are authored ScriptableObjects drawn by weighted random.

Status at a glance

Done & merged: functional match loop end-to-end, HUD, lobby + race selection, economy, enemies + A* pathfinding, flying enemies + air-targeting, per-player tower deck (keystone #1), draft Slice 1 (spine + "new tower"), TowerRegistry removal (towers replicate by TowerTypeId), per-tower construction-phase build visuals, ground-seating from mesh bounds, Tesla Coil tower (Electric + AllInRange + arc VFX with real flash/impact lights).

In progress (branch feature/post-processing): project-wide grimdark post-processing grade + HDR; Tesla arc lighting polish. (This branch was fast-forwarded onto the Tesla work; commit the post-processing assets + the TeslaArcVisual light additions.)

Paused: in-match Paint system (overlaps with systemic upgrades).

Next: draft Slice 2 (systemic upgrades); the grimdark lighting pass (see Part C); author 2 more new-tower designs.


Part A — Roguelike build-out (current focus)

A1. Per-player tower deck — DONE (merged)

Towers are unlocked per player, not globally available. See Project_Context.md.

A2. Draft spine + "new tower" (Slice 1) — DONE & merged

Server generates 3 weighted options per player each prep phase; players pick via a non-modal HUD overlay; unpicked auto-resolve at prep end; gold "Buy Roll" purchases extra rolls. Only choice type is New Tower (grants into PlayerTowerDeck).

A3. Draft Slice 2 — systemic tower upgrades — ⏭ NEXT

  • Add an upgrade DraftOption subclass applying systemic modifiers: "all towers of damage-type X gain Y", "all projectile-type X …", "unlock Lv.2 across deck".
  • Reconcile with PlayerBuffManager. The existing gold-bought buff stack (global Damage/AttackSpeed multipliers) is the natural underlying apply mechanism — generalize it to type-filtered modifiers and make the draft (not the standalone buff menu) the entry point. Decide the fate of the old buff menu here.

A4. Builder active abilities (draft choice #4)

New in-wave, targeted, cooldown ability system (Call Lightning, Haste, Stasis Trap). New DraftOption subclass grants an ability to the builder; needs input/targeting + cooldown UI. Some builders may start with an ability unlocked.

A5. Relic quests (draft choice #5)

Secondary-objective tracking ("place 50 towers in 5 min", "leak 0 for 3 waves") that, on completion, grants a powerful passive Relic (e.g. corpses leave slowing ice, electric hits stun). Needs objective tracking + relic passive/event hooks.

A6. Enemy debuffs (draft choice #3)

Temporary debuffs purchasable in the draft (weaker / slower / downgrade a tier). "Downgrade" implies an ordered enemy progression the data doesn't model yet — add that first.

A7. Tower content beyond the starting set — IN PROGRESS

The "new tower" draft needs towers beyond the starting set to be meaningful. Tesla Coil is the first (Electric, AllInRange, ProBuilder mesh, draftable). The user planned 3 new towers total so Siege + Wall can return to the starting deck — 2 more designs still pending from the designer. Each new tower = a TowerDefinition + prefab + NewTowerDraftOption, added to towerDefinitions (catalog) + DraftPool (+ network prefab list).

A8. Cross-match persistence / meta-progression

Player profile saving owned content; win/loss reward pools drawn server-side at match end; the customization menu. Requires a session-stable tower/option ID (catalog indices reset each match — see Context "technical debt").

Open decisions (resolve as the relevant slice is scheduled)

  • Paint reconciliation: keep paint as a separate axis, fold it into the systemic-upgrade visuals, or retire it. (Currently paused.)
  • Race vs Builder naming: the code says "Race"; the design says "Builder." Rename, nest, or keep — decide before it calcifies.
  • Gold-roll availability: currently any time; may tighten to prep-only.

Part B — Functional gameplay remainder (not roguelike-specific)

  • Tower Upgrade / Sell actions — HUD buttons exist but are disabled. Sell first (refund + despawn), then per-tower upgrade if the systemic model leaves room for it.
  • Enemy resistances / weaknessesEnemyHealth.TakeDamage has the stub slot; info panel has the placeholder.
  • Terrain architecture decision — Unity Terrain vs mesh vs ProBuilder. Builder code is terrain-agnostic; decide before heavy art.
  • Camera polish — cursor-anchored zoom near map edges, center-on-builder hotkey, race/phase-aware initial position.

Part C — Near-term art & visual TODOs

These are concrete, scheduled-soon visual fixes (placeholders are otherwise point-isolated and swap cleanly):

  • Grimdark lighting pass — NEXT. The post-processing grade is in (ACES/desaturate/contrast/bloom/vignette, project-wide via DefaultVolumeProfile), but a brightly-lit ice map undercuts it. Lower the scene ambient, add a hard moody directional key, raise contrast — post can't carry grimdark without the lighting. (Ultimately the level art needs to go darker/industrial too.)
  • Enemy idle animation support. Add idle states to all enemy prefabs (needed for held/spawned + between-waypoint states; foundation for the stepped-animation direction below).
  • Tower footprint visuals fill the full 2×2. Meshes read smaller than the tile they occupy; make a placed tower visually fill its footprint (matters for maze readability, esp. the Wall).
  • Done this session: per-tower construction-phase build visuals (ConstructionPhaseSet) and ground-seating so any-pivot meshes sit flush — both shipped.

Part D — Visual prototype: painted-miniature aesthetic (deferred phase)

Begins after the roguelike core is solid. Proves out the "photographed painted tabletop miniature" + Spider-Verse stepped-animation look on minimal content, as a concrete artifact for a future art lead. Placeholder hero content (Space Marine + Hormagaunt-style) is GW-adjacent and private-only — see Part E.

Shared infrastructure (one-time, reused by all future assets):

  • MiniatureStandard URP Shader Graph — PBR + a Fresnel rim term (fakes drybrush edge highlights) and a crushed-shadow curve (studio-lit miniature look); optional low-intensity painted-noise overlay.
  • Lighting/post via the volume profile — warm key (~45°), cool fill, low bounce, slightly raised AO, tilt-shift DOF (diorama scale), saturated warm-shadow grade, slight vignette.
  • SteppedAnimator — samples the Animator pose and quantizes to ~12fps for skeletal body + weapon-tracking only; effects/projectiles/UI stay smooth (the contrast is what sells it). Builds on the enemy idle-animation work in Part C.
  • TowerVisualController — local-only bridge from TowerCombat events (OnTargetAcquired/OnTargetLost/OnFire, CurrentTarget) to Animator params + procedural turret rotation.

Prototype content: one hero tower (idle/aim/fire) and one enemy (walk/death, stepped), then a demo scene showing towers shooting enemies in the painted-miniature look. Exit criteria: the demo runs in-editor with the aesthetic working end-to-end and the shared infra reusable.


Part E — Path to commercial production (notes only)

  • IP swap-out (required before any public release): replace GW-adjacent placeholder content with original factions (the "armored warrior order" and "horde swarm" archetypes aren't owned; the specific GW execution is) — or pursue a GW license if the demo warrants. The data model already supports clean swap-out (asset-referenced definitions; code unaffected). The asset manifest of IP-derived content must hit zero before any public build, repo flip, or marketing.
  • Steam lobby migration (deferred): replace Direct-IP with a Steam-backed provider behind an IConnectionProvider abstraction — NetworkBootstrap is the single seam; lobby UI and gameplay don't change. Adds friend-invite via overlay, lobby browser, Steam P2P transport; upgrades host-leave handling (Option A → lobby persists / new host). Use Spacewar app ID 480 in dev. Keep Direct-IP for LAN / DRM-free builds.
  • Production scope: more towers/enemies/maps, audio direction matching the visual direction, art-lead hire (the Part D demo is the recruitment artifact).

Cross-phase principles

  • Debug to root cause — no defensive workarounds or per-frame correction hacks.
  • Restate design intent before coding — prevents rework; especially valuable for the roguelike systems and any art pipeline work.
  • Server-authoritative gameplay; local-only UI/visual state.
  • Existing engine/rendering decisions stand: Unity 6.4, URP, IL2CPP, .NET Standard 2.1, Linear color, new Input System, Force Text serialization, NGO 2.x.