194aad8f83
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()
247 lines
7.7 KiB
Plaintext
247 lines
7.7 KiB
Plaintext
[gd_scene load_steps=10 format=3]
|
||
|
||
; =============================================================================
|
||
; test_range.tscn — Greybox Test Map
|
||
; =============================================================================
|
||
; A simple open-area test map for validating movement, shooting, and networking.
|
||
;
|
||
; Layout:
|
||
; - 80×80 open area with flat grey floor
|
||
; - Low platform (center, 1 unit high, gold)
|
||
; - Medium platform (east, 2 units high, gold)
|
||
; - High platform (north-west, 3 units high, red)
|
||
; - Ramp from ground to low platform (yellow)
|
||
; - Enclosure/room (east) with doorway for indoor testing (blue-grey walls)
|
||
; - Spawn point (Marker3D) with group 'spawn_points'
|
||
; - DirectionalLight3D + WorldEnvironment
|
||
;
|
||
; Total geometry: ~132 tris (well under 500 budget)
|
||
; =============================================================================
|
||
|
||
[sub_resource type="Environment" id="1"]
|
||
background_mode = 0
|
||
tonemap_mode = 0
|
||
glow_enabled = false
|
||
ambient_light_color = Color(0.25, 0.25, 0.3, 1.0)
|
||
ambient_light_energy = 0.4
|
||
ambient_light_sky_contribution = 0.0
|
||
|
||
[sub_resource type="StandardMaterial3D" id="2"]
|
||
albedo_color = Color(0.35, 0.35, 0.35, 1.0)
|
||
resource_name = "grey_floor"
|
||
|
||
[sub_resource type="StandardMaterial3D" id="3"]
|
||
albedo_color = Color(0.8, 0.6, 0.2, 1.0)
|
||
resource_name = "gold_platform"
|
||
|
||
[sub_resource type="StandardMaterial3D" id="4"]
|
||
albedo_color = Color(0.5, 0.5, 0.6, 1.0)
|
||
resource_name = "bluegrey_wall"
|
||
|
||
[sub_resource type="StandardMaterial3D" id="5"]
|
||
albedo_color = Color(0.9, 0.2, 0.2, 1.0)
|
||
resource_name = "red_high"
|
||
|
||
[sub_resource type="StandardMaterial3D" id="6"]
|
||
albedo_color = Color(0.3, 0.4, 0.3, 1.0)
|
||
resource_name = "green_floor"
|
||
|
||
[sub_resource type="StandardMaterial3D" id="7"]
|
||
albedo_color = Color(0.7, 0.7, 0.3, 1.0)
|
||
resource_name = "yellow_ramp"
|
||
|
||
|
||
; === Root Node ===
|
||
|
||
[node name="TestRange" type="Node3D"]
|
||
|
||
|
||
; === Lighting ===
|
||
|
||
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
||
environment = SubResource("1")
|
||
|
||
[node name="SunLight" type="DirectionalLight3D" parent="."]
|
||
transform = Transform3D(0.866, 0, -0.5, -0.354, 0.707, -0.612, 0.354, 0.707, 0.612, 0, 8, 0)
|
||
light_energy = 1.5
|
||
light_indirect_energy = 0.8
|
||
light_color = Color(1.0, 0.95, 0.9, 1.0)
|
||
shadow_enabled = true
|
||
directional_shadow_max_distance = 60.0
|
||
directional_shadow_split_1 = 0.1
|
||
directional_shadow_split_2 = 0.3
|
||
directional_shadow_split_3 = 0.6
|
||
directional_shadow_blend_splits = true
|
||
|
||
|
||
; === Spawn Points ===
|
||
|
||
[node name="SpawnPoint" type="Marker3D" parent="."]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -30, 0.5, 0)
|
||
groups = ["spawn_points"]
|
||
|
||
|
||
; === CT Spawn Points (Counter-Terrorist) ===
|
||
|
||
[node name="CTSpawn_01" type="Marker3D" parent="."]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -30, 0.5, -10)
|
||
groups = ["spawn_points_ct"]
|
||
|
||
[node name="CTSpawn_02" type="Marker3D" parent="."]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -25, 0.5, -15)
|
||
groups = ["spawn_points_ct"]
|
||
|
||
|
||
; === T Spawn Points (Terrorist) ===
|
||
|
||
[node name="TSpawn_01" type="Marker3D" parent="."]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 25, 0.5, 25)
|
||
groups = ["spawn_points_t"]
|
||
|
||
[node name="TSpawn_02" type="Marker3D" parent="."]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30, 0.5, 20)
|
||
groups = ["spawn_points_t"]
|
||
|
||
|
||
; =============================================================================
|
||
; Bomb Sites
|
||
; =============================================================================
|
||
; BombsiteA — south-west area, 8×4m zone
|
||
; BombsiteB — north-east area, 8×4m zone
|
||
; Each has a CollisionShape3D (BoxShape3D) for overlap detection
|
||
; and a Marker3D child named "PlantPosition" marking the plant location.
|
||
|
||
; --- Bombsite A ---
|
||
|
||
[sub_resource type="BoxShape3D" id="8"]
|
||
size = Vector3(8, 4, 4)
|
||
|
||
[node name="BombsiteA" type="Area3D" parent="."]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 1.0, -5)
|
||
collision_layer = 0
|
||
collision_mask = 0
|
||
groups = ["bomb_sites"]
|
||
|
||
[node name="CollisionShape3D" type="CollisionShape3D" parent="BombsiteA"]
|
||
shape = SubResource("8")
|
||
|
||
[node name="PlantPosition" type="Marker3D" parent="BombsiteA"]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0, -1)
|
||
|
||
; --- Bombsite B ---
|
||
|
||
[sub_resource type="BoxShape3D" id="9"]
|
||
size = Vector3(8, 4, 4)
|
||
|
||
[node name="BombsiteB" type="Area3D" parent="."]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15, 1.0, 20)
|
||
collision_layer = 0
|
||
collision_mask = 0
|
||
groups = ["bomb_sites"]
|
||
|
||
[node name="PlantPosition" type="Marker3D" parent="BombsiteB"]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 2)
|
||
|
||
[node name="CollisionShape3D" type="CollisionShape3D" parent="BombsiteB"]
|
||
shape = SubResource("9")
|
||
|
||
|
||
; === Open Area Floor (80×80) ===
|
||
|
||
[node name="Floor" type="CSGBox3D" parent="."]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.25, 0)
|
||
size = Vector3(80, 0.5, 80)
|
||
material = SubResource("2")
|
||
use_collision = true
|
||
|
||
|
||
; === Low Platform (center, 1 unit high) ===
|
||
; 8×8 platform, top at y=2, bottom at y=0, centered at origin
|
||
|
||
[node name="LowPlatform" type="CSGBox3D" parent="."]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0, 0)
|
||
size = Vector3(8, 2, 8)
|
||
material = SubResource("3")
|
||
use_collision = true
|
||
|
||
|
||
; === Medium Platform (east, 2 units high) ===
|
||
; 6×6 platform, top at y=3, bottom at y=1 — jump-up from low platform height
|
||
|
||
[node name="MediumPlatform" type="CSGBox3D" parent="."]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15, 2.0, 10)
|
||
size = Vector3(6, 2, 6)
|
||
material = SubResource("3")
|
||
use_collision = true
|
||
|
||
|
||
; === High Platform (north-west, 3 units high) ===
|
||
; 3×3 small platform, top at y=4 — requires sprint-jump to reach
|
||
|
||
[node name="HighPlatform" type="CSGBox3D" parent="."]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 3.0, -15)
|
||
size = Vector3(3, 2, 3)
|
||
material = SubResource("5")
|
||
use_collision = true
|
||
|
||
|
||
; === Ramp (south of center, leads ground → low platform top) ===
|
||
; Tilted ~20° around X axis, 6 units long along Z.
|
||
; South end near ground, north end meets low platform top (y=2).
|
||
|
||
[node name="Ramp" type="CSGBox3D" parent="."]
|
||
transform = Transform3D(1, 0, 0, 0, 0.940, -0.342, 0, 0.342, 0.940, 0, 1.0, 5)
|
||
size = Vector3(6, 0.2, 6)
|
||
material = SubResource("7")
|
||
use_collision = true
|
||
|
||
|
||
; =============================================================================
|
||
; Enclosure — Indoor Testing Room
|
||
; =============================================================================
|
||
; 12×12 interior room, 4 units tall, with a 2-unit doorway on the south face.
|
||
; Centered at (30, 0, 30).
|
||
|
||
[node name="Enclosure" type="Node3D" parent="."]
|
||
|
||
[node name="RoomFloor" type="CSGBox3D" parent="Enclosure"]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30, 0.25, 30)
|
||
size = Vector3(12, 0.5, 12)
|
||
material = SubResource("6")
|
||
use_collision = true
|
||
|
||
; North wall (z = 24)
|
||
[node name="Wall_N" type="CSGBox3D" parent="Enclosure"]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30, 2.0, 24.25)
|
||
size = Vector3(12, 4, 0.5)
|
||
material = SubResource("4")
|
||
use_collision = true
|
||
|
||
; South wall left segment (doorway gap from x=29 to x=31)
|
||
[node name="Wall_S_Left" type="CSGBox3D" parent="Enclosure"]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 26.5, 2.0, 35.75)
|
||
size = Vector3(5, 4, 0.5)
|
||
material = SubResource("4")
|
||
use_collision = true
|
||
|
||
; South wall right segment
|
||
[node name="Wall_S_Right" type="CSGBox3D" parent="Enclosure"]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 33.5, 2.0, 35.75)
|
||
size = Vector3(5, 4, 0.5)
|
||
material = SubResource("4")
|
||
use_collision = true
|
||
|
||
; West wall (x = 24)
|
||
[node name="Wall_W" type="CSGBox3D" parent="Enclosure"]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 24.25, 2.0, 30)
|
||
size = Vector3(0.5, 4, 12)
|
||
material = SubResource("4")
|
||
use_collision = true
|
||
|
||
; East wall (x = 36)
|
||
[node name="Wall_E" type="CSGBox3D" parent="Enclosure"]
|
||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 35.75, 2.0, 30)
|
||
size = Vector3(0.5, 4, 12)
|
||
material = SubResource("4")
|
||
use_collision = true
|