feat: basic dust 2

This commit is contained in:
DottsGit
2026-06-06 12:23:39 -04:00
parent 6a0a4a8aeb
commit 775e57ba4a
4 changed files with 215 additions and 1 deletions
+207
View File
@@ -0,0 +1,207 @@
extends TestLevelBuilder
func _build_geometry() -> void:
# Build environment setup
_build_environment()
var env = get_node_or_null("WorldEnvironment")
if env:
var environment = env.environment
environment.tonemap_mode = Environment.TONE_MAPPER_ACES
if environment.sky and environment.sky.sky_material:
var sky_mat = environment.sky.sky_material
sky_mat.sky_top_color = Color(0.3, 0.5, 0.8)
sky_mat.sky_horizon_color = Color(0.8, 0.7, 0.5)
sky_mat.ground_bottom_color = Color(0.2, 0.15, 0.1)
sky_mat.ground_horizon_color = Color(0.8, 0.7, 0.5)
_build_lighting()
var sun = get_node_or_null("Sun")
if sun:
sun.light_color = Color(1.0, 0.95, 0.85)
sun.light_energy = 1.5
sun.rotation_degrees = Vector3(-45, 45, 0)
var fill = get_node_or_null("FillLight")
if fill:
fill.rotation_degrees = Vector3(-45, -135, 0)
fill.light_energy = 0.3
_build_dust2_layout()
_build_player()
# Override player spawn point for Dust 2
if _player:
_player.global_position = Vector3(0, 1, 50)
_player.look_at(Vector3(0, 1, 0), Vector3.UP)
func _build_dust2_layout() -> void:
# Materials
var wall_mat = StandardMaterial3D.new()
wall_mat.albedo_color = Color(0.85, 0.75, 0.6) # Sandstone
var floor_mat = StandardMaterial3D.new()
floor_mat.albedo_color = Color(0.7, 0.65, 0.55) # Dusty ground
var box_mat = StandardMaterial3D.new()
box_mat.albedo_color = Color(0.4, 0.3, 0.2) # Wood crates
# Root CSG
var root_csg = CSGCombiner3D.new()
root_csg.use_collision = true
add_child(root_csg)
# Huge solid block representing the world bounds
var world_block = CSGBox3D.new()
world_block.size = Vector3(140, 20, 140)
world_block.position = Vector3(0, 10, 0)
world_block.material = wall_mat
root_csg.add_child(world_block)
# Helper function to carve out open-air areas (cuts through the ceiling)
var carve_open = func(pos: Vector3, size: Vector3):
var hole = CSGBox3D.new()
hole.operation = CSGShape3D.OPERATION_SUBTRACTION
hole.size = Vector3(size.x, 25, size.z)
hole.position = Vector3(pos.x, 12.5, pos.z)
root_csg.add_child(hole)
return hole
# Helper function to carve out tunnels (leaves a ceiling)
var carve_tunnel = func(pos: Vector3, size: Vector3):
var hole = CSGBox3D.new()
hole.operation = CSGShape3D.OPERATION_SUBTRACTION
hole.size = size
hole.position = pos + Vector3(0, size.y / 2.0, 0)
root_csg.add_child(hole)
return hole
# ---------------------------------------------------------
# LAYOUT (with generous overlaps to prevent getting stuck)
# ---------------------------------------------------------
# T Spawn (South)
carve_open.call(Vector3(0, 0, 50), Vector3(25, 8, 15))
# Suicide & Mid Corridor
carve_open.call(Vector3(0, 0, 42), Vector3(8, 8, 10)) # Connects T spawn to Mid
carve_open.call(Vector3(0, 0, 15), Vector3(12, 8, 55)) # Main Mid
# Mid Doors (Pinch point)
carve_open.call(Vector3(0, 0, -14), Vector3(2, 8, 5))
# CT Spawn
carve_open.call(Vector3(0, 0, -30), Vector3(30, 8, 30))
# ---------------------------------------------------------
# B SIDE
# ---------------------------------------------------------
# Lower B Tunnels (Connects from Mid at X=0 to West)
carve_tunnel.call(Vector3(-18, 0, 30), Vector3(40, 6, 8))
# Spiral stairs up to Upper B Tunnels
carve_tunnel.call(Vector3(-34, 0, 30), Vector3(12, 10, 12))
# Upper B Tunnels
carve_tunnel.call(Vector3(-34, 4, 15), Vector3(8, 6, 30))
# B Site
carve_open.call(Vector3(-35, 4, -10), Vector3(25, 8, 25))
# B Window & Door (Connecting B Site to CT Spawn)
carve_tunnel.call(Vector3(-15, 4, -10), Vector3(25, 6, 5)) # Door
carve_tunnel.call(Vector3(-15, 4, -18), Vector3(20, 4, 4)) # Window
# CT Spawn Ramp to B Site
carve_open.call(Vector3(-15, 0, -15), Vector3(12, 8, 12))
var ramp_carve = CSGBox3D.new()
ramp_carve.operation = CSGShape3D.OPERATION_SUBTRACTION
ramp_carve.size = Vector3(8, 10, 15)
ramp_carve.rotation_degrees.x = -25
ramp_carve.position = Vector3(-15, 2, -15)
root_csg.add_child(ramp_carve)
# ---------------------------------------------------------
# A SIDE
# ---------------------------------------------------------
# A Long Doors (Connects T Spawn/Mid to A Long)
carve_tunnel.call(Vector3(15, 0, 40), Vector3(25, 6, 8))
carve_tunnel.call(Vector3(30, 0, 40), Vector3(8, 6, 15))
# A Long
carve_open.call(Vector3(30, 0, 15), Vector3(15, 8, 45))
# A Pit (A hole downwards at the end of A Long)
var pit = CSGBox3D.new()
pit.operation = CSGShape3D.OPERATION_SUBTRACTION
pit.size = Vector3(15, 5, 12)
pit.position = Vector3(30, -2.5, 35)
root_csg.add_child(pit)
# A Site
carve_open.call(Vector3(30, 4, -15), Vector3(30, 8, 30))
# Ramp up to A site from Long
var a_ramp = CSGBox3D.new()
a_ramp.operation = CSGShape3D.OPERATION_SUBTRACTION
a_ramp.size = Vector3(15, 10, 15)
a_ramp.rotation_degrees.x = 25
a_ramp.position = Vector3(30, 2, -5)
root_csg.add_child(a_ramp)
# Ramp down from A Site to CT Spawn
var ct_ramp = CSGBox3D.new()
ct_ramp.operation = CSGShape3D.OPERATION_SUBTRACTION
ct_ramp.size = Vector3(15, 10, 15)
ct_ramp.rotation_degrees.z = 25
ct_ramp.position = Vector3(15, 2, -25)
root_csg.add_child(ct_ramp)
# Catwalk / A Short
carve_open.call(Vector3(15, 4, 5), Vector3(20, 8, 8))
carve_open.call(Vector3(20, 4, -5), Vector3(8, 8, 15))
# Stairs from Mid to Catwalk
var mid_stairs = CSGBox3D.new()
mid_stairs.operation = CSGShape3D.OPERATION_SUBTRACTION
mid_stairs.size = Vector3(8, 8, 15)
mid_stairs.rotation_degrees.x = 35
mid_stairs.position = Vector3(8, 2, 5)
root_csg.add_child(mid_stairs)
# Floor
var floor = CSGBox3D.new()
floor.size = Vector3(140, 1, 140)
floor.position = Vector3(0, -0.5, 0)
floor.material = floor_mat
root_csg.add_child(floor)
# Cover Boxes
var add_box = func(pos: Vector3, size: Vector3):
var b = CSGBox3D.new()
b.size = size
b.position = pos + Vector3(0, size.y / 2.0, 0)
b.material = box_mat
root_csg.add_child(b)
add_box.call(Vector3(4, 0, -12), Vector3(2, 2, 2))
add_box.call(Vector3(30, 4, -15), Vector3(4, 2, 4))
add_box.call(Vector3(30, 6, -15), Vector3(2, 2, 2))
add_box.call(Vector3(-35, 4, -10), Vector3(2, 2, 2))
# Dummies
_build_dust2_dummies()
func _build_dust2_dummies() -> void:
var spawn_dummy = func(pos: Vector3, rot_y: float):
var dummy = load("res://entities/killable_dummy.gd").new()
dummy.position = pos
dummy.rotation_degrees.y = rot_y
add_child(dummy)
# Mid Doors CT side looking out
spawn_dummy.call(Vector3(0, 0, -20), 0)
# A Long Corner looking towards doors
spawn_dummy.call(Vector3(34, 0, 10), 180)
# B Site Car
spawn_dummy.call(Vector3(-30, 4, -5), 90)
# A Site Goose
spawn_dummy.call(Vector3(40, 4, -25), -135)
+1
View File
@@ -0,0 +1 @@
uid://dn5ndscghwovm
+1 -1
View File
@@ -11,7 +11,7 @@ config_version=5
[application] [application]
config/name="Papaya-Shooter" config/name="Papaya-Shooter"
run/main_scene="res://scenes/test_level/test_level.tscn" run/main_scene="res://scenes/dust2_level/dust2_level.tscn"
config/features=PackedStringArray("4.6", "Forward Plus") config/features=PackedStringArray("4.6", "Forward Plus")
config/icon="res://icon.svg" config/icon="res://icon.svg"
+6
View File
@@ -0,0 +1,6 @@
[gd_scene format=3]
[ext_resource type="Script" path="res://debug/dust2_level_builder.gd" id="1"]
[node name="Dust2Level" type="Node3D"]
script = ExtResource("1")