feat: implement procedural arena generation system and support infrastructure
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
#!/usr/bin/env -S godot --headless --script
|
||||
extends SceneTree
|
||||
|
||||
func _init():
|
||||
print("Generating Map programmatically...")
|
||||
var root = CSGCombiner3D.new()
|
||||
root.name = "MapRoot"
|
||||
root.use_collision = true
|
||||
|
||||
# 1. Base Geometry
|
||||
var floor = CSGBox3D.new()
|
||||
floor.name = "Floor"
|
||||
floor.size = Vector3(36, 0.5, 36)
|
||||
floor.position = Vector3(0, -0.25, 0)
|
||||
root.add_child(floor)
|
||||
floor.owner = root
|
||||
|
||||
# Outer Shell Walls
|
||||
var top_wall = CSGBox3D.new()
|
||||
top_wall.name = "TopWall"
|
||||
top_wall.size = Vector3(36, 3, 0.5)
|
||||
top_wall.position = Vector3(0, 1.5, -17.75)
|
||||
root.add_child(top_wall)
|
||||
top_wall.owner = root
|
||||
|
||||
var bot_wall = CSGBox3D.new()
|
||||
bot_wall.name = "BottomWall"
|
||||
bot_wall.size = Vector3(36, 3, 0.5)
|
||||
bot_wall.position = Vector3(0, 1.5, 17.75)
|
||||
root.add_child(bot_wall)
|
||||
bot_wall.owner = root
|
||||
|
||||
var left_wall = CSGBox3D.new()
|
||||
left_wall.name = "LeftWall"
|
||||
left_wall.size = Vector3(0.5, 3, 35)
|
||||
left_wall.position = Vector3(-17.75, 1.5, 0)
|
||||
root.add_child(left_wall)
|
||||
left_wall.owner = root
|
||||
|
||||
var right_wall = CSGBox3D.new()
|
||||
right_wall.name = "RightWall"
|
||||
right_wall.size = Vector3(0.5, 3, 35)
|
||||
right_wall.position = Vector3(17.75, 1.5, 0)
|
||||
root.add_child(right_wall)
|
||||
right_wall.owner = root
|
||||
|
||||
# Inner blocks and subtractions...
|
||||
_create_room_block(root, "TopLeft", Vector3(-9, 1.5, -9), Vector3(1, 0, 0), Vector3(0, 0, 1))
|
||||
_create_room_block(root, "TopRight", Vector3(9, 1.5, -9), Vector3(-1, 0, 0), Vector3(0, 0, 1))
|
||||
_create_room_block(root, "BottomLeft", Vector3(-9, 1.5, 9), Vector3(1, 0, 0), Vector3(0, 0, -1))
|
||||
_create_room_block(root, "BottomRight", Vector3(9, 1.5, 9), Vector3(-1, 0, 0), Vector3(0, 0, -1))
|
||||
|
||||
var packed = PackedScene.new()
|
||||
var result = packed.pack(root)
|
||||
if result == OK:
|
||||
var err = ResourceSaver.save(packed, "res://scenes/maps/fps_blockout.tscn")
|
||||
if err == OK:
|
||||
print("Map saved successfully to res://scenes/maps/fps_blockout.tscn")
|
||||
else:
|
||||
print("Error saving map: ", err)
|
||||
else:
|
||||
print("Error packing scene: ", result)
|
||||
|
||||
quit()
|
||||
|
||||
func _create_room_block(root: CSGCombiner3D, block_name: String, pos: Vector3, door_horizontal_dir: Vector3, door_vertical_dir: Vector3):
|
||||
var block = CSGBox3D.new()
|
||||
block.name = block_name + "Block"
|
||||
block.size = Vector3(10, 3, 10)
|
||||
block.position = pos
|
||||
root.add_child(block)
|
||||
block.owner = root
|
||||
|
||||
var room = CSGBox3D.new()
|
||||
room.name = block_name + "Room"
|
||||
room.operation = CSGShape3D.OPERATION_SUBTRACTION
|
||||
room.size = Vector3(6, 3, 6)
|
||||
room.position = pos
|
||||
root.add_child(room)
|
||||
room.owner = root
|
||||
|
||||
var door_h = CSGBox3D.new()
|
||||
door_h.name = block_name + "DoorH"
|
||||
door_h.operation = CSGShape3D.OPERATION_SUBTRACTION
|
||||
# For horizontal doors (East/West), x is the long dimension going through the wall
|
||||
door_h.size = Vector3(3.0, 3.0, 2.5)
|
||||
door_h.position = pos + door_horizontal_dir * 3.75
|
||||
root.add_child(door_h)
|
||||
door_h.owner = root
|
||||
|
||||
var door_v = CSGBox3D.new()
|
||||
door_v.name = block_name + "DoorV"
|
||||
door_v.operation = CSGShape3D.OPERATION_SUBTRACTION
|
||||
# For vertical doors (North/South), z is the long dimension going through the wall
|
||||
door_v.size = Vector3(2.5, 3.0, 3.0)
|
||||
door_v.position = pos + door_vertical_dir * 3.75
|
||||
root.add_child(door_v)
|
||||
door_v.owner = root
|
||||
Reference in New Issue
Block a user