extends BasicRoom class_name Generator @export var wireSpawners: Array[ItemSpawner] @export var cellSpawners: Array[ItemSpawner] var unfixedWires: Array[MinigameInitiator] var rng: RandomNumberGenerator = RandomNumberGenerator.new() @onready var SocketL: Area3D = $SocketL @onready var SocketR: Area3D = $SocketR @onready var SocketLPivot: Node3D = $SocketL/CellPivot @onready var SocketRPivot: Node3D = $SocketR/CellPivot var SocketLPowerCell: GrabableObject var SocketRPowerCell: GrabableObject func Ready() -> void: SpaceshipLogicRef = get_node("/root/Main/Maps/SpaceshipTest") rng.set_seed(SpaceshipLogicRef.levelGenSeed) generateMinigames() generatePowerCells() func _process(_delta: float) -> void: checkTasks() if SocketLPowerCell: if SocketLPowerCell.isGrabbed: SocketLPowerCell = null if SocketRPowerCell: if SocketRPowerCell.isGrabbed: SocketRPowerCell = null grabCell(SocketL,SocketLPowerCell,SocketLPivot) grabCell(SocketR,SocketRPowerCell,SocketRPivot) if !SpaceshipLogicRef: return #if SocketLPowerCell and SocketRPowerCell and SpaceshipLogicRef.taskDict[0].completed: #SpaceshipLogicRef.power = false #SpaceshipLogicRef.updateLights() #else: #SpaceshipLogicRef.power = true #SpaceshipLogicRef.updateLights() func generateMinigames() -> void: var totalMinigames: int = wireSpawners.size() var choosenMinigames: int = randi_range(2,clamp(6,2,totalMinigames)) for n in (totalMinigames - choosenMinigames): wireSpawners.pop_at(randi_range(0,wireSpawners.size()-1)) for itemSpawner in wireSpawners: unfixedWires.push_back(itemSpawner.spawnItem()) func generatePowerCells() -> void: var totalCells: int = cellSpawners.size() var choosenCells: int = randi_range(2,clamp(2 + totalCells /7,2,totalCells)) for n in (totalCells - choosenCells): cellSpawners.pop_at(randi_range(0,cellSpawners.size()-1)) for itemSpawner in cellSpawners: itemSpawner.spawnItem() func grabCell(Socket: Area3D, SocketCell: GrabableObject, SocketPivot: Node3D): if Socket.has_overlapping_areas() and !SocketCell: var potentialCell = getPowerCells(Socket) if potentialCell: potentialCell = potentialCell.obj else: return if potentialCell.freeze == true: return if !potentialCell.isGrabbed: SocketCell = potentialCell if Socket == SocketL: SocketLPowerCell = potentialCell elif Socket == SocketR: SocketRPowerCell = potentialCell SocketCell.freeze = true SocketCell.global_position = SocketPivot.global_position SocketCell.global_rotation = SocketPivot.global_rotation func getPowerCells(Area: Area3D) -> GrabBox: var overlappingAreas: Array[Area3D] = Area.get_overlapping_areas() for a in overlappingAreas: if typeof(a == GrabBox): if a.type == "PowerCell": return a return null func checkTasks() -> void: var allWiresFixed: bool = true for wire in unfixedWires: if !wire.minigameCompleted: allWiresFixed = false break if SocketLPowerCell and SocketRPowerCell and allWiresFixed: SpaceshipLogicRef.solveTask(0)