Adds:
- bomb_objective.gd: server-authoritative bomb state machine (IDLE→PLANTED→EXPLODED/DEFUSED)
- plant_bomb(player_id, pos) - T-side only, LIVE phase, inside bombsite
- defuse_bomb(player_id) - CT-side only, near bomb, 5s timer
- cancel_defuse(player_id) - if defuser moves or is killed
- bomb_explode() - configurable radius damage (10m lethal, 15m half)
- 40s bomb timer (configurable)
- Full query API: is_bomb_planted(), get_bomb_position(), get_bomb_timer()
- Signals: bomb_planted, bomb_defused, bomb_exploded, defuse_started, defuse_cancelled
- Connected to RoundManager via GameServer for round-end outcomes
- bomb_carrier.gd: client-side bomb carrier UI
- Bomb status/defuse progress UI updates
- Direction indicator to planted bomb
- "Hold E to defuse" prompt for CT near bomb
- "Hold E to plant" prompt for T with bomb in bombsite
- test_range.tscn: BombsiteA (south-west, -20,0,-5) and BombsiteB (north-east, 15,0,20)
- 8x4m Area3D zones with BoxShape3D collision
- PlantPosition Marker3D children
- Group 'bomb_sites' for server discovery
- game_server.gd: BombObjective integration in _ready()
- Creates and wires BombObjective to RoundManager, TeamManager, DamageProcessor
- Registers bomb sites from scene tree
- Connects bomb_exploded/bomb_defused → RoundManager.end_round()
- Connects round_ended → bomb.reset()
- team_data.gd: Team enum (SPECTATOR/CT/Terrorist), constants for names,
colors, starting money, and spawn groups; TeamData resource class
- team_manager.gd: Player-to-team assignment, auto-balancing, score
tracking; round-independent (persists across rounds)
- spawn_manager.gd: Scans scene for Marker3D nodes in spawn_points_ct
and spawn_points_t groups; selects valid spawns (farthest from enemies
with proximity check, fallback to first available)
- buy_zone.gd: Area3D-based trigger zone with team filtering, player
enter/exit tracking and signals
- test_range.tscn: Added 2 CT spawn markers and 2 T spawn markers with
appropriate groups
Creates test_range.tscn under client/assets/maps/test_range/ as a simple
open-area test map for validating movement, shooting, and networking.
Layout:
- 80×80 open area with grey floor (CSGBox3D, 12 tris)
- Low platform (center, 1 unit high, gold)
- Medium platform (east, 2 units high, gold)
- High platform (north-west, 3 units high, red)
- Ramp (south, tilted ~20°, leads ground to low platform top)
- Enclosure/room (east, 12×12 interior, 4-unit walls, south doorway)
- SpawnPoint (Marker3D) with group 'spawn_points'
- DirectionalLight3D (sun) + WorldEnvironment
- All geometry uses Solid-color StandardMaterial3D placeholders
- Collision enabled on all CSGBox3D shapes
- ~132 tris total (well under 500 budget)
- Restructured kit_demo.tscn from linear demo to enclosed 5.12x5.12 room
with walls, floor tiles, pillar, beam, doorway, window
- Added WorldEnvironment with ProceduralSky for ambient lighting
- Added DirectionalLight3D (sun key light, 45° angle, shadows enabled)
- Added OmniLight3D (warm interior fill light)
- Added ReflectionProbe for interior specular reflections
(box projection, room-sized extents)
- Added LightmapGI with balanced quality settings
(bounces=3, texel_scale=1.0, max_texture_size=2048, denoiser=true)
- Added tool script (kit_demo.gd) that prints bake status in editor
- Added bake_lighting.gd CLI bake script (requires GPU-enabled instance)
- Updated project.godot with reflection atlas and shadow map quality settings
Headless baking note: Godot's standard editor build requires a GPU/display
for LightmapGI.bake(). Open the scene in the Godot editor and click 'Bake
Lightmap' on the LightmapGI node to generate the baked lightmap data.