100 lines
3.0 KiB
GDScript3
100 lines
3.0 KiB
GDScript3
|
|
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)
|