Files
Project-M/Docs/Vault/02_Game_Design/Systems_Index.md
T
2026-05-31 21:35:12 -07:00

4.8 KiB

tags, updated, permalink
tags updated permalink
design
index
2026-05-29 gamevault/02-game-design/systems-index

Systems Design — Index

One design doc per gameplay system, linked here. Each should state: purpose, components (IComponentData), systems (ISystem), netcode shape (ghost? predicted vs interpolated? inputs / RPCs), and open questions.

Systems

M1 — Player (twin-stick predicted movement) · 2026-05-30_M1_Player_Slice

  • Components (ProjectM.Simulation): PlayerTag; PlayerInput (IInputComponentData — float2 Move/Aim, [GhostField], flows via AutoCommandTarget); PlayerMoveStats (baked tunables); PlayerFacing ([GhostField] Direction); PlayerSpawner (baked prefab singleton); GoInGameRequest (IRpcCommand).
  • Systems: PlayerMoveSystem, PlayerAimSystem (PredictedSimulationSystemGroup, .WithAll<Simulate>(), deterministic — SystemAPI.Time.DeltaTime only); PlayerInputGatherSystem (client, GhostInputSystemGroup); GoInGameClientSystem (client) / GoInGameServerSystem (server — spawns the owner-predicted ghost, stamps GhostOwner, LinkedEntityGroup auto-despawn).
  • Netcode shape: player = owner-predicted ghost; client sends input only; server is authoritative. Status: code-complete + EditMode-verified; live runtime blocked by DR-002_Unity66_Alpha_Netcode_Transport.

M2 — Combat (predicted projectile, server damage) · 2026-05-31_M2_Combat

  • Components (ProjectM.Simulation): Health ([GhostField] Current; baked Max); HitRadius; DamageEvent (IBufferElementData); AbilityStats (auto-target range/cone, cooldown ticks — baked); AbilityCooldown ([GhostField] NextFireTick); Projectile ([GhostField] Direction + SpawnId; baked Speed/Damage/Range); ProjectileSpawner / TrainingDummySpawner (baked singletons); TrainingDummyTag. PlayerInput gains Fire (InputEvent).
  • Systems: AbilityFireSystem (predicted; IsFirstTimeFullyPredictingTick-gated predict-spawn; server branch applies AutoTarget); ProjectileMoveSystem (predicted); ProjectileClassificationSystem (client; predicted-spawn match by SpawnId; non-Burst); ProjectileDamageSystem (server; swept segment-vs-sphere hit); HealthApplyDamageSystem (server; DamageEvent → Health, dummy death-despawn); TrainingDummySpawnSystem (server; one-shot). Input: PlayerInputGatherSystem rewritten as managed SystemBase over the generated ProjectMInput action-map wrapper.
  • Netcode shape: projectile = owner-predicted ghost, client predict-spawns + classifies against server truth by SpawnId=(ownerNetId<<16)|absoluteFireCount; auto-target & damage server-authoritative; Health.Current/Projectile.Direction replicate. Status: foundation built + runtime-validated (server loop + replication); live keypress-fire pending an interactive test. Decisions: DR-003_M2_Combat_Netcode_Architecture.

M3 — Data-driven abilities & modifiers · 2026-05-31_M3_Data_Driven_Abilities

  • Components (ProjectM.Simulation): AbilityDatabase (singleton BlobAssetReference<AbilityDatabaseBlob>; AbilityDefBlob/CharacterStatsBlob keyed by AbilityId/CharacterId byte) + AbilityPrefabElement (companion entity-ref buffer for projectile prefabs); AbilityRef ([GhostField] id) / CharacterStatsRef; StatModifier (replicated [GhostField] buffer, OwnerSendType.All, raw-byte StatTarget/ModOp); EffectiveAbilityStats / EffectiveCharacterStats (derived, not replicated); UpgradePickup / UpgradePickupSpawner. StatMath (pure fold). Removed M2's AbilityStats / PlayerMoveStats.
  • Systems: StatRecomputeSystem (predicted, [UpdateBefore] Aim/Move; folds blob base + modifier buffer → Effective* every tick — rollback-correct); AbilityFireSystem rerouted (effective stats + prefab-by-id + snapshot-at-fire); PlayerMoveSystem → effective move; UpgradePickupSpawnSystem / UpgradePickupSystem (server; overlap-grant via AppendToBuffer); DebugModifierInjectionSystem (editor-only, server world); HealthApplyDamageSystem clamps to effective MaxHealth. Authoring: AbilityDefinition/CharacterStatsDefinition SOs + AbilityDatabaseAuthoring blob baker.
  • Netcode shape: definitions = baked config (not replicated, identical both worlds); modifiers = replicated ghost buffer on the player → both worlds recompute identical effective stats (prediction-correct, validated under tick-batching); pickup = interpolated server-authoritative ghost. Status: built + runtime-validated (EditMode 38/38). Decisions: DR-004_M3_DataDriven_Abilities_Modifiers.

Conventions

DOTS/ECS conventions live in repo CLAUDE.md and the dots-dev skill's dots-conventions.md. Don't duplicate volatile API details here — link to context7-derived notes instead.