#!/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