Files
Papay-Shooter/scenes/maps/generate_map.gd

99 lines
3.4 KiB
GDScript

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