Initial commit

This commit is contained in:
2026-01-21 23:51:53 +01:00
commit 60b208fee0
1703 changed files with 100223 additions and 0 deletions

125
Maps/Lobby/Lobby.tscn Normal file
View File

@@ -0,0 +1,125 @@
[gd_scene load_steps=18 format=3 uid="uid://bco4seshb8fjf"]
[ext_resource type="Script" uid="uid://fvwy57of2gvq" path="res://Maps/Lobby/lobby.gd" id="1_3j6ah"]
[ext_resource type="Texture2D" uid="uid://cimsjl61nhh5s" path="res://assets/2D/HDR_blue_nebulae-1.hdr" id="1_o7c6e"]
[ext_resource type="Texture2D" uid="uid://icwcdyvrtcwe" path="res://test/TestTex1.png" id="3_b4v87"]
[ext_resource type="Script" uid="uid://cjgxd88k1bntf" path="res://script/pathfindingGridLoad.gd" id="3_bhyb3"]
[ext_resource type="Script" uid="uid://cjiiw7cybj24b" path="res://script/ButtonLogicImpulse.gd" id="4_2vvmy"]
[ext_resource type="Script" uid="uid://ymaax1x5fos3" path="res://script/interactBox.gd" id="5_f6mem"]
[ext_resource type="AudioStream" uid="uid://1bkjenax2g3s" path="res://assets/Audio/Ambience 1 SpaceBots Audio.mp3" id="6_f6mem"]
[sub_resource type="Gradient" id="Gradient_skcuv"]
interpolation_mode = 1
offsets = PackedFloat32Array(0, 0.25, 0.361502, 0.375, 0.488263, 0.5, 0.615023, 0.625, 0.732394, 0.75, 0.859155, 0.875, 1)
colors = PackedColorArray(0, 0, 0, 1, 0.25, 0.25, 0.25, 1, 0.28169, 0.28169, 0.28169, 1, 0.375, 0.375, 0.375, 1, 0.408451, 0.408451, 0.408451, 1, 0.5, 0.5, 0.5, 1, 0.530516, 0.530516, 0.530516, 1, 0.625, 0.625, 0.625, 1, 0.661972, 0.661972, 0.661972, 1, 0.75, 0.75, 0.75, 1, 0.802817, 0.802817, 0.802817, 1, 0.875, 0.875, 0.875, 1, 1, 1, 1, 1)
metadata/_snap_enabled = true
metadata/_snap_count = 8
[sub_resource type="GradientTexture1D" id="GradientTexture1D_h11mn"]
gradient = SubResource("Gradient_skcuv")
[sub_resource type="Gradient" id="Gradient_3j6ah"]
offsets = PackedFloat32Array(0.187793, 0.704225, 0.929577)
colors = PackedColorArray(0, 0, 0, 1, 0.58042, 0.58042, 0.58042, 1, 0.860369, 0.860369, 0.860369, 1)
[sub_resource type="FastNoiseLite" id="FastNoiseLite_bhyb3"]
frequency = 0.03
fractal_octaves = 8
fractal_lacunarity = 5.0
fractal_gain = 0.495
fractal_weighted_strength = 0.23
domain_warp_enabled = true
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_jyrsd"]
noise = SubResource("FastNoiseLite_bhyb3")
color_ramp = SubResource("Gradient_3j6ah")
[sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_2vvmy"]
panorama = ExtResource("1_o7c6e")
[sub_resource type="Sky" id="Sky_bs3qb"]
sky_material = SubResource("PanoramaSkyMaterial_2vvmy")
[sub_resource type="Environment" id="Environment_f6mem"]
background_mode = 2
sky = SubResource("Sky_bs3qb")
glow_enabled = true
glow_levels/1 = 1.38
glow_levels/2 = 1.55
glow_levels/3 = 5.63
glow_levels/5 = 1.75
glow_levels/6 = 0.9
glow_levels/7 = 0.75
glow_strength = 1.73
glow_mix = 0.03
glow_bloom = 0.05
glow_blend_mode = 4
glow_hdr_luminance_cap = 1.5
glow_map = SubResource("NoiseTexture2D_jyrsd")
volumetric_fog_emission = Color(1, 1, 1, 1)
volumetric_fog_emission_energy = 0.04
adjustment_brightness = 1.5
adjustment_color_correction = SubResource("GradientTexture1D_h11mn")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_1nbv0"]
albedo_color = Color(0.8819366, 0.8819366, 0.88193655, 1)
albedo_texture = ExtResource("3_b4v87")
metallic = 0.4
[sub_resource type="BoxShape3D" id="BoxShape3D_b4v87"]
size = Vector3(4.5, 1, 1)
[node name="Lobby" type="Node3D"]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 0, 0, 0)
script = ExtResource("1_3j6ah")
metadata/_custom_type_script = "uid://cbjn7f7r081q8"
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_f6mem")
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 10.1725, 0)
material_overlay = SubResource("StandardMaterial3D_1nbv0")
use_collision = true
[node name="CSGBox3D2" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.00969505, 0)
operation = 2
size = Vector3(49, 19, 49)
[node name="CSGBox3D" type="CSGBox3D" parent="CSGCombiner3D"]
flip_faces = true
size = Vector3(50, 20, 50)
[node name="OmniLight3D" type="OmniLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7.47177, 0)
omni_range = 19.6325
[node name="PathfindingGridLoader" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -25, 2.01037, -25)
script = ExtResource("3_bhyb3")
lengthX = 25
lengthZ = 25
metadata/_custom_type_script = "uid://cjgxd88k1bntf"
[node name="StartMission" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.69191, 1.21511)
pixel_size = 0.02
text = "Start Mission"
[node name="ButtonLogicImpulse" type="Timer" parent="StartMission" node_paths=PackedStringArray("interactBox")]
script = ExtResource("4_2vvmy")
interactBox = NodePath("../InteractBox")
metadata/_custom_type_script = "uid://cjiiw7cybj24b"
[node name="InteractBox" type="Area3D" parent="StartMission" node_paths=PackedStringArray("object")]
script = ExtResource("5_f6mem")
object = NodePath("../ButtonLogicImpulse")
metadata/_custom_type_script = "uid://ymaax1x5fos3"
[node name="CollisionShape3D" type="CollisionShape3D" parent="StartMission/InteractBox"]
shape = SubResource("BoxShape3D_b4v87")
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer" parent="."]
stream = ExtResource("6_f6mem")
parameters/looping = true

16
Maps/Lobby/lobby.gd Normal file
View File

@@ -0,0 +1,16 @@
extends MapLogic
var main: Main
@onready var startMissionButton: ButtonLogicImpulse = $StartMission/ButtonLogicImpulse
var spaceshipScene: String = "res://test/spaceship_test.tscn"
func _ready() -> void:
main = get_node("/root/Main")
startMissionButton.onPressed.connect(startMission)
func startMission() -> void:
if not is_multiplayer_authority(): return
main.changeMap.rpc(spaceshipScene)

1
Maps/Lobby/lobby.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://fvwy57of2gvq

View File

@@ -0,0 +1,22 @@
extends Object
class_name Biome
var name: String
var roomList: RoomList
var starterRoom: RoomData
var spread: float
var priority: int #Biomes with a prio of 0 will always be placed, after Biomes of lower priority will be placed
#Place all prio 0 Biomes
#Then place x number of prio 1 biomes
#Then place y number of prio 2 biomes
# [...]
#Spread biomes
func _init(bName: String, rList: RoomList, sRoom: RoomData, bSpread: float, bPrio: int) -> void:
name = bName
roomList = rList
starterRoom = sRoom
spread = bSpread
priority = bPrio

View File

@@ -0,0 +1 @@
uid://yjvmb1ivvxb0

View File

@@ -0,0 +1,9 @@
extends DoorPosition
class_name BiomeExit
var biome: String
func _init(position: Vector2i = Vector2i(0,0),DoorOrientation : int = 0,biomeName: String = "") -> void:
pos = position
orientation = DoorOrientation
biome = biomeName

View File

@@ -0,0 +1 @@
uid://cptl6phh2t8tl

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 B

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c07ms152i77j0"
path="res://.godot/imported/BiomeExitChecker.png-a0cdf239bba0df1644b5e7c7b49312b1.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Maps/MapGenerator/BiomeExitChecker.png"
dest_files=["res://.godot/imported/BiomeExitChecker.png-a0cdf239bba0df1644b5e7c7b49312b1.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@@ -0,0 +1,19 @@
extends Object
class_name DoorPosition
var pos : Vector2i
var orientation : int #0 north, 1 east, 2south, 3west
enum doorOrientations {north,east,south,west}
func rotatePosRight(roomGridSideLength: int,numberOfRotations: int) -> void: #Rotates the doorPosition along the room grid by 90 degrees
for n in numberOfRotations % 4:
var x: int = pos.x
var y: int = pos.y
pos = Vector2i (y,roomGridSideLength-x-1)
orientation = wrapi((orientation - 1),0,4)
func duplicate() -> DoorPosition:
var returnData: DoorPosition = DoorPosition.new()
returnData.pos = pos
returnData.orientation = orientation
return returnData

View File

@@ -0,0 +1 @@
uid://b5mjpi1nhmn4s

View File

@@ -0,0 +1,5 @@
extends Object
class_name Mission
var biomes: Array[Array] #Array containing arrays that contain biomes
#Index of Array = Biome priorety

View File

@@ -0,0 +1 @@
uid://dyirs8de8f0k3

View File

@@ -0,0 +1,39 @@
extends Mission
class_name RescueMission
func _init() -> void:
var prio0Biomes: Array[Biome]
prio0Biomes.push_back(biomeTestGreen())
prio0Biomes.push_back(biomeTestOrange())
prio0Biomes.push_back(biomeTest5())
biomes.push_back(prio0Biomes)
func biomeTest5() -> Biome:
var roomListTest5: RoomList = RoomList.new()
roomListTest5.addRoom(preload("res://test/test4Way.png").get_image(),"res://test/Test4Way.tscn")
roomListTest5.addRoom(preload("res://test/StartTest.png").get_image(),"res://test/StartTest.tscn")
return Biome.new("test5",roomListTest5,RoomData.new(preload("res://test/test4Way.png").get_image(),"res://test/Test4Way.tscn"),1.0,0)
func biomeTestGreen() -> Biome:
var roomList: RoomList = RoomList.new()
roomList.addRoom(preload("res://test/StartTest.png").get_image(),"res://test/StartTest.tscn")
roomList.addRoom(preload("res://Maps/Rooms/Generic Connectors/4Way/4WayRoomData.png").get_image(),"res://Maps/Rooms/Generic Connectors/4Way/4WayRoom.tscn")
roomList.addRoom(preload("res://Maps/Rooms/Generic Connectors/Corner/CornerRoomData.png").get_image(),"res://Maps/Rooms/Generic Connectors/Corner/CornerRoom.tscn")
roomList.addRoom(preload("res://Maps/Rooms/Generic Connectors/Hallway/HallwayRoomData.png").get_image(),"res://Maps/Rooms/Generic Connectors/Hallway/Hallway.tscn")
roomList.addRoom(preload("res://Maps/Rooms/Generic Connectors/THallway/THallwayRoomData.png").get_image(),"res://Maps/Rooms/Generic Connectors/THallway/THallway.tscn")
return Biome.new("green",roomList,RoomData.new(preload("res://test/StartTest.png").get_image(),"res://test/StartTest.tscn"),1,0)
func biomeTestOrange() -> Biome:
var roomList: RoomList = RoomList.new()
roomList.addRoom(preload("res://test/test4Way.png").get_image(),"res://test/Test4Way.tscn")
roomList.addRoom(preload("res://Maps/Rooms/Generic Connectors/4Way/4WayRoomData.png").get_image(),"res://Maps/Rooms/Generic Connectors/4Way/4WayRoom.tscn")
roomList.addRoom(preload("res://Maps/Rooms/Generic Connectors/Corner/CornerRoomData.png").get_image(),"res://Maps/Rooms/Generic Connectors/Corner/CornerRoom.tscn")
roomList.addRoom(preload("res://Maps/Rooms/Generic Connectors/Hallway/HallwayRoomData.png").get_image(),"res://Maps/Rooms/Generic Connectors/Hallway/Hallway.tscn")
roomList.addRoom(preload("res://Maps/Rooms/Generic Connectors/THallway/THallwayRoomData.png").get_image(),"res://Maps/Rooms/Generic Connectors/THallway/THallway.tscn")
return Biome.new("orange",roomList,RoomData.new(preload("res://test/test4Way.png").get_image(),"res://test/Test4Way.tscn"),1,0)

View File

@@ -0,0 +1 @@
uid://dl7tb27ncsmxe

View File

@@ -0,0 +1,34 @@
extends Object
class_name RoomData
var rotations: int = 0
var doorPositions: Array[DoorPosition]
var roomGrid: Array[Array]
var roomSceneRef: String
func _init(roomImage: Image = null, roomSceneReference: String = "") -> void:
if !roomImage: return
if roomSceneReference == "": return
roomSceneRef = roomSceneReference
var roomImmageLoader: RoomImageLoader = RoomImageLoader.new()
roomGrid = roomImmageLoader.loadRoomData(roomImage)
doorPositions = roomImmageLoader.getDoors(roomGrid)
roomImmageLoader.free()
func duplicateRoom() -> RoomData:
var returnData: RoomData = RoomData.new()
returnData.rotations = rotations
for position in doorPositions:
returnData.doorPositions.push_back(position.duplicate())
for x in roomGrid.size():
var array: Array
returnData.roomGrid.push_back(array)
for y in roomGrid[x].size():
returnData.roomGrid[x].push_back(null)
returnData.roomGrid[x][y] = roomGrid[x][y].duplicate()
returnData.roomGrid = roomGrid.duplicate(true)
returnData.roomSceneRef = roomSceneRef
return returnData

View File

@@ -0,0 +1 @@
uid://28gkh48f7sib

View File

@@ -0,0 +1,14 @@
extends Object
class_name RoomList
var rooms: Array[RoomData]
func addRoom(roomImage: Image, roomSceneRef: String) -> void:
var newRoom: RoomData = RoomData.new(roomImage,roomSceneRef)
rooms.push_back(newRoom)
func duplicate() -> RoomList:
var returnList: RoomList = RoomList.new()
for room in rooms:
returnList.rooms.push_back(room.duplicateRoom())
return returnList

View File

@@ -0,0 +1 @@
uid://bkvffyhw5vnxv

View File

@@ -0,0 +1,6 @@
extends RoomList
class_name RoomListSpaceship
func _init() -> void:
addRoom(preload("res://test/StartTest.png").get_image(),"res://test/StartTest.tscn")
addRoom(preload("res://test/test4Way.png").get_image(),"res://test/Test4Way.tscn")

View File

@@ -0,0 +1 @@
uid://cpnvaegn20rby

View File

@@ -0,0 +1,20 @@
extends Object
class_name GridCell
var position: Vector2i
var spaceTaken: bool = false
var biomeConnection: bool = false
var door: bool = false
var doorOrientation: int
enum doorOrientations {north,east,south,west}
var biome: String
func duplicate() -> GridCell:
var returnData := GridCell.new()
returnData.spaceTaken = spaceTaken
returnData.door = door
returnData.doorOrientation = doorOrientation
returnData.biome = biome
returnData.biomeConnection = biomeConnection
return returnData

View File

@@ -0,0 +1 @@
uid://105kn4rcg8bd

View File

@@ -0,0 +1,589 @@
extends Node3D
class_name LevelGenerator
var levelGrid: Array[Array]
@export var gridSize: int = 100
@export var mapLogic: MapLogic
@export var doorBlock: PackedScene # Temporary
@export var doorOBJ: PackedScene #Temporary
@export var tile: PackedScene # Temporary
@export var tileWall: PackedScene # Temporary
@export var tileCorner: PackedScene # Temporary
@export var levelGenSeed: String = "default"
var rng: RandomNumberGenerator = RandomNumberGenerator.new() #Get random values, usefull for random level generation huh
var currentMission: Mission
var doorSpawnPoints: Array[DoorPosition] #Where to put them doors
var doorBlockSpawnPoints: Array[DoorPosition] #Where to put them door blockers
var biomeExitPositions: Array[BiomeExit] #Points where you can leave a biome
var biomeExitChecker: RoomData = RoomData.new(preload("res://Maps/MapGenerator/BiomeExitChecker.png").get_image(),"null") #Nonexisten Room used to check if a door is a valid Biome Exit
var connectPathPositions: PackedVector2Array #Where to place floor tiles of connecting paths
var astar: AStar2D = AStar2D.new()
func _ready() -> void:
initRandom() # Set seed for level generation
initGrid() #Assign a new grid space object to each space of the 1x1m grid
#Center the world
position.x = -gridSize/2
position.z = -gridSize/2
currentMission = RescueMission.new() #Have something choose the mission type in this part later
#Biomes
var doorList: Array[DoorPosition] #Seccond Array contains door positions
for bPrio in currentMission.biomes.size():
doorList = placeBiomes(currentMission.biomes[bPrio])
spreadBiomes()
#Rooms into Biomes
placeRooms(doorList)
#Doors
chooseBiomeExits()
#print(biomeExitPositions[0].biome,biomeExitPositions[1].biome)r
doorsAtBiomeExits()
findValidDoors()
spawnDoors()
#Generate Astar setup for finding Paths between Biomes and Rooms
generateAstarPoints()
connectAstarPoints()
weightAstarPoints()
#Connect Biomes
connectPathPositions = generateConnectionPath()
generateFloorPositions()
placeFloorPositionTiles()
placeWallsAlongTiles()
print("done")
func initRandom() -> void:
rng.set_seed(hash(levelGenSeed))
#Misc Utility
func initGrid() -> void:
for x in gridSize:
var newRow: Array
levelGrid.push_back(newRow)
for y in gridSize:
var newCell := GridCell.new()
newCell.position = Vector2i(x,y)
levelGrid[x].push_back(newCell)
func addGridCells(cell1: GridCell,cell2: GridCell) -> GridCell:
var returnCell: GridCell = GridCell.new()
returnCell.spaceTaken = cell1.spaceTaken or cell2.spaceTaken
returnCell.door = cell1.door or cell2.door
if cell1.door and !cell2.door:
returnCell.doorOrientation = cell1.doorOrientation
else:
returnCell.doorOrientation = cell2.doorOrientation
returnCell.position = cell1.position
returnCell.biome = cell1.biome
returnCell.biomeConnection = cell1.biomeConnection
return returnCell
func shuffleArray(array: Array) -> Array:
for i in array.size()-1:
#Get Array indexes
var iA: int = array.size()-1-i
var iB: int = rng.randi_range(0,array.size()-2-i)
#Get two elements from the array
var a = array[iA]
var b = array[iB]
#Swap both elements
array[iB] = a
array[iA] = b
return array
func addArrays2D(array1: Array[Array], array2: Array[Array], arr2pos: Vector2i = Vector2i(0,0)) -> void:
if array1.size() <= (arr2pos.x) + array2.size(): return
if array1[arr2pos.y].size() <= (arr2pos.y) + array2[0].size(): return
for x in array2.size():
for y in array2[x].size():
array1[x+arr2pos.x][y+arr2pos.y] = addGridCells(array1[x+arr2pos.x][y+arr2pos.y],array2[x][y])
func checkOverlapArrays2D(array1: Array[Array], array2: Array[Array], arr2pos: Vector2i = Vector2i(0,0)) -> bool:
if array1.size() <= arr2pos.x + array2.size() or arr2pos.x < 0: return true
if array1[arr2pos.y].size() <= arr2pos.y + array2[0].size() or arr2pos.y < 0: return true
for x in array2.size():
for y in array2[x].size():
if array1[x+arr2pos.x][y+arr2pos.y].spaceTaken and array2[x][y].spaceTaken: return true
return false
func checkBiomeOverlap(biome: String, pos: Vector2i, length: int, height: int) -> bool:
if levelGrid.size() <= pos.x + length or pos.x < 0: return true
if levelGrid[pos.y].size() <= pos.y + height or pos.y < 0: return true
for x in length:
for y in height:
if levelGrid[x+pos.x][y+pos.y].biome: return true
return false
func rotateArray2D(array: Array[Array], numberOfRotationsBy90Degrees: int) -> void:
var size: int = array.size()
var layerCount: int = size/2
for x in numberOfRotationsBy90Degrees%4:
for layer in layerCount:
var first: int = layer
var last: int = size - first - 1
for element in range(first, last):
var offset = element - first
var top = array[first][element]
var right = array[element][last]
var bot = array[last][last-offset]
var left = array[last-offset][first]
array[element][last] = top
array[last][last-offset] = right
array[last-offset][first] = bot
array[first][element] = left
func getDoorPosition(cell: GridCell, GridCellPosition: Vector2i) -> DoorPosition:
if !cell.door:
print("Tried to get door at cell that isnt a door")
return null
var returnDoorPosition := DoorPosition.new()
returnDoorPosition.pos = GridCellPosition
returnDoorPosition.orientation = cell.doorOrientation
return returnDoorPosition
func addObject(AddedObject:PackedScene, Parent: Node3D, Position: Vector3, Rotation: Vector3= Vector3(0,0,0)):
if !AddedObject:
print("tried to add object but packed scene is null")
return
var obj = AddedObject.instantiate()
Parent.add_child(obj)
obj.position = Position
obj.rotation = Rotation
return obj
func changeBiomeArea2D(biome: String,pos:Vector2i,length: int,height: int):
for x in length:
for y in height:
levelGrid[pos.x+x][pos.y+y].biome = biome
#Spawning Rooms
func rotateRoomData(roomData: RoomData, numberOfRotationsBy90Degrees: int) -> void:
rotateArray2D(roomData.roomGrid,numberOfRotationsBy90Degrees)
roomData.rotations = wrapi(roomData.rotations + numberOfRotationsBy90Degrees,0,4)
for door in roomData.doorPositions:
door.rotatePosRight(roomData.roomGrid.size(),numberOfRotationsBy90Degrees)
roomData.roomGrid[door.pos.x][door.pos.y].doorOrientation = wrapi(door.orientation-2,0,4)
func spawnRoom(roomDataInput: RoomData,pos: Vector2i,numberOfRotationsBy90Degrees: int = 0, centered: bool = false) -> Array[DoorPosition]: #Pos corresponds to the upper left corner of the room immage
var roomData: RoomData = roomDataInput.duplicateRoom()
var roomScene: PackedScene = load(roomData.roomSceneRef)
rotateRoomData(roomData,numberOfRotationsBy90Degrees)
var roomGrid := roomData.roomGrid
var doorPositions: Array[DoorPosition] = roomData.doorPositions
if centered:
pos = Vector2i(pos.x-(roomGrid.size()/2),pos.y-(roomGrid[0].size()/2))
addArrays2D(levelGrid,roomGrid,pos)
addObject(roomScene,self,Vector3(pos.x+(roomGrid.size()/2),0,pos.y+(roomGrid[0].size()/2)),Vector3(0,(roomData.rotations%4)*PI/2,0))
for door in doorPositions:
door.pos = pos + door.pos
return doorPositions
func getDoorFromRoom(roomData: RoomData,index: int) -> DoorPosition:
return roomData.doorPositions[index % roomData.doorPositions.size()]
func putRoomAtDoor(roomData: RoomData, door: DoorPosition,spawnDoorIndex: int) -> Array: ##Return array contains roomData, spawn Pos in that order
#Init Values:
var spawnDoor: DoorPosition = getDoorFromRoom(roomData,spawnDoorIndex) #Which door from the spawned room connects to the exiting room
var doorOrientationDifference : int = wrapi(spawnDoor.orientation - door.orientation,0,4) #Difference in orinet. between spawned and existing room
var numberOfRoomRotations: int = 0 #How many rotations are needed to make spawned rooms spawn door face the existing door
var spawnPos: Vector2i
var doorOffset: Vector2i #Offset by 1 space so the doors are next to eachother and not inside eachoter
#Find number of rotations and then rotate the room
if !doorOrientationDifference == 2:
if doorOrientationDifference == 1:
numberOfRoomRotations = 3
if doorOrientationDifference == 0:
numberOfRoomRotations = 2
if doorOrientationDifference == 3:
numberOfRoomRotations = 1
rotateRoomData(roomData,numberOfRoomRotations)
#Get new values for spawnDoor and set door offset
spawnDoor = getDoorFromRoom(roomData,spawnDoorIndex)
match spawnDoor.orientation:
0: doorOffset = Vector2i(0,-1)
1: doorOffset = Vector2i(1,0)
2: doorOffset = Vector2i(0,1)
3: doorOffset = Vector2i(-1,0)
#Set spawn pos and return values
spawnPos = door.pos - spawnDoor.pos + doorOffset
var returnArray: Array = [roomData,spawnPos]
return returnArray
func spawnRoomAtDoor(roomDataInput: Array[RoomData], door: DoorPosition, biome: String) -> Array[DoorPosition]:
var returnArray: Array[DoorPosition]
var roomData: RoomData = null
var spawnDoorIndex: int = -1
#Choose the room to use
var rooms: Array[RoomData] = roomDataInput.duplicate()
shuffleArray(rooms)
for room in rooms:
#Randomise door checking order
var doorIndices: Array[int]
for x in room.doorPositions.size():
doorIndices.push_back(x)
shuffleArray(doorIndices)
#Check if doorIndex fits and assign roomData and spawnDoorIndex if it does
for doorIndex in doorIndices:
if checkIfRoomFits(room,door,doorIndex, biome):
roomData = room.duplicateRoom()
spawnDoorIndex = doorIndex
break
#Check if a room has been found
if !roomData or spawnDoorIndex == -1:
var checkPosition = door.pos
match door.orientation:
0: checkPosition += Vector2i(-1,-2)
1: checkPosition += Vector2i(0,-1)
2: checkPosition += Vector2i(-1,0)
3: checkPosition += Vector2i(-2,-1)
if !checkOverlapArrays2D(levelGrid,biomeExitChecker.roomGrid,checkPosition):
biomeExitPositions.push_back(BiomeExit.new(door.pos,door.orientation,biome))
return returnArray
#Get Spawn Info and spawn room
var spawnInfo: Array = putRoomAtDoor(roomData,door,spawnDoorIndex)
spawnRoom(spawnInfo[0],spawnInfo[1])
returnArray = spawnInfo[0].doorPositions
for x in returnArray.size():
returnArray[x].pos = spawnInfo[1] + returnArray[x].pos
return returnArray
func checkIfBiomeFits(length: int, height: int, pos: Vector2i, biome: String) -> bool:
if levelGrid.size() <= pos.x + length or pos.x < 0: return true
if levelGrid[pos.y].size() <= pos.y + height or pos.y < 0: return true
for x in length:
for y in height:
if levelGrid[x+pos.x][y+pos.y].biome != biome:
return false
return true
func checkIfRoomFits(roomDataInput: RoomData,door: DoorPosition,spawnDoorIndex: int, biome: String) -> bool:
var roomData: RoomData = roomDataInput.duplicateRoom()
var spawnInfo: Array = putRoomAtDoor(roomData,door,spawnDoorIndex)
if !checkOverlapArrays2D(levelGrid,spawnInfo[0].roomGrid,spawnInfo[1]) and checkIfBiomeFits(spawnInfo[0].roomGrid.size(),spawnInfo[0].roomGrid[0].size(),spawnInfo[1],biome):
return true
else:
return false
func isOutOfArray2DBounds(sizeX: int, sizeY: int, pos: Vector2i) -> bool:
if pos.x >= sizeX or pos.x < 0 or pos.y >= sizeY or pos.y < 0:
return true
else:
return false
func isValidDoor(pos:Vector2i) -> bool: # Checks if the door connects to another door using its orientation,
#if this function finds a valid door, it removes the door status from the other door to avoid duplicated doors
match levelGrid[pos.x][pos.y].doorOrientation:
0:
if isOutOfArray2DBounds(levelGrid.size(),levelGrid[0].size(),Vector2i(pos.x,pos.y-1)): return false
if !levelGrid[pos.x][pos.y-1].door: return false
else: levelGrid[pos.x][pos.y-1].door = false
1:
if isOutOfArray2DBounds(levelGrid.size(),levelGrid[0].size(),Vector2i(pos.x+1,pos.y)): return false
if !levelGrid[pos.x+1][pos.y].door: return false
else: levelGrid[pos.x+1][pos.y].door = false
2:
if isOutOfArray2DBounds(levelGrid.size(),levelGrid[0].size(),Vector2i(pos.x,pos.y+1)): return false
if !levelGrid[pos.x][pos.y+1].door: return false
else: levelGrid[pos.x][pos.y+1].door = false
3:
if isOutOfArray2DBounds(levelGrid.size(),levelGrid[0].size(),Vector2i(pos.x-1,pos.y)): return false
if !levelGrid[pos.x-1][pos.y].door: return false
else: levelGrid[pos.x-1][pos.y].door = false
return true
func findValidDoors() -> void:
for x in levelGrid.size():
for y in levelGrid[x].size():
if levelGrid[x][y].door:
var newDoorObject := DoorPosition.new()
newDoorObject.pos = Vector2i(x,y)
newDoorObject.orientation = levelGrid[x][y].doorOrientation
if isValidDoor(Vector2i(x,y)):
doorSpawnPoints.push_back(newDoorObject)
else:
doorBlockSpawnPoints.push_back(newDoorObject)
func spawnDoors() -> void:
for doorSpawn in doorSpawnPoints:
addObject(doorOBJ,self,Vector3(doorSpawn.pos.x+0.5,0,doorSpawn.pos.y+0.5),Vector3(0,doorSpawn.orientation*-PI/2,0))
#debugCubeAtPos(doorSpawn.pos)
for doorBlockSpawn in doorBlockSpawnPoints:
addObject(doorBlock,self,Vector3(doorBlockSpawn.pos.x+0.5,0,doorBlockSpawn.pos.y+0.5),Vector3(0,doorBlockSpawn.orientation*-PI/2,0))
func placeRooms(doorList: Array[DoorPosition]) -> void:
var nextDoors: Array[DoorPosition] = []
#YES I KNOW A DO WHILE LOOP IS BETTER HERE BUT GODOT DOESNT HAVE IT
for door in doorList:
var doorBiome: Biome = getBiome(levelGrid[door.pos.x][door.pos.y].biome)
nextDoors += spawnRoomAtDoor(doorBiome.roomList.rooms,door,doorBiome.name)
doorList = nextDoors
while !doorList.is_empty():
for door in doorList:
var doorBiome: Biome = getBiome(levelGrid[door.pos.x][door.pos.y].biome)
nextDoors += spawnRoomAtDoor(doorBiome.roomList.rooms,door,doorBiome.name)
doorList = nextDoors
nextDoors = []
#Generating Biomes
func getBiome(biomeName: String) -> Biome:
for prio in currentMission.biomes.size():
for biome in currentMission.biomes[prio]:
if biome.name == biomeName:
return biome
return
func generateBiomePos(biome: String,starterRoomSize: Vector2i) -> Vector2i:
var genPos: Vector2i
var possiblePos: Array[Vector2i]
#Find all possible Pos without a biome
for x in levelGrid.size():
for cell in levelGrid[x]:
if !cell.biome:
possiblePos.push_back(cell.position)
#Go through all pos untill one works
genPos = possiblePos[rng.randi_range(0,possiblePos.size()-1)]
while checkBiomeOverlap(biome,genPos,starterRoomSize.x,starterRoomSize.y):
possiblePos.erase(genPos)
genPos = possiblePos[rng.randi_range(0,possiblePos.size()-1)]
return genPos
func placeBiomes(biomes: Array[Biome]) -> Array[DoorPosition]:
var returnDoorLists: Array[DoorPosition] = []
for biome in biomes:
var starterRoomSize: Vector2i = Vector2i(biome.starterRoom.roomGrid.size(),biome.starterRoom.roomGrid[0].size())
var generatePos: Vector2i = generateBiomePos(biome.name,starterRoomSize)
#mapLogic.playerStartPos = Vector3(generatePos.x-gridSize/2-5,0.5,generatePos.y-gridSize/2-5)
changeBiomeArea2D(biome.name,generatePos,starterRoomSize.x,starterRoomSize.y)
#Spawn Starter room and add doors to list
var doorList: Array[DoorPosition]
doorList = spawnRoom(biome.starterRoom,generatePos)
returnDoorLists += doorList
return returnDoorLists
func fillCell(cellBiome: String,pos: Vector2i) -> GridCell:
if isOutOfArray2DBounds(levelGrid.size(),levelGrid[0].size(),pos): return
if !levelGrid[pos.x][pos.y].biome:
levelGrid[pos.x][pos.y].biome = cellBiome
return levelGrid[pos.x][pos.y]
return
func spreadCell(cell: GridCell,pos: Vector2i) -> Array[GridCell]:
var returnCells: Array[GridCell] = []
returnCells.push_back(fillCell(cell.biome,pos + Vector2i(0,-1)))
returnCells.push_back(fillCell(cell.biome,pos + Vector2i(1,0)))
returnCells.push_back(fillCell(cell.biome,pos + Vector2i(0,1)))
returnCells.push_back(fillCell(cell.biome,pos + Vector2i(-1,0)))
while returnCells.has(null):
returnCells.erase(null)
return returnCells
func allCellsHaveBiome() -> bool:
for x in levelGrid.size():
for cell in levelGrid[x]:
if !cell.biome: return false
return true
func spreadBiomes() -> void:
#Get all current biome grid cells -> Put them in starterCells
var startCells: Array[GridCell] = []
for x in levelGrid.size():
for y in levelGrid[x].size():
if levelGrid[x][y].biome:
startCells.push_back(levelGrid[x][y])
#Spread them by one -> put the new ones in a new array
while !allCellsHaveBiome():
shuffleArray(startCells)
var newCells: Array[GridCell] = []
for cell in startCells:
if rng.randf() * getBiome(cell.biome).spread > 0.49:
newCells += spreadCell(cell,cell.position)
else:
newCells.push_back(cell)
#New cells now contains all that were newly assigned a biome and the ones that didnt spread
startCells = newCells
#Astar
func generateAstarPoints(findAllSpaceTakenCells: bool = false) -> void:
var currentID: int = 0
for x in levelGrid.size():
for y in levelGrid[x].size():
if levelGrid[x][y].spaceTaken == findAllSpaceTakenCells:
astar.add_point(currentID,Vector2i(x,y))
currentID += 1
func connectAstarPoints() -> void:
for point in astar.get_point_ids():
var possibleNeighbors: Array[int] = [point+1,point-1,point-gridSize,point+gridSize]
for posNeigh in possibleNeighbors:
if astar.has_point(posNeigh):
astar.connect_points(point,posNeigh,true)
func weightAstarPoints() -> void:
for point in astar.get_point_ids():
if astar.get_point_connections(point).size() != 4:
astar.set_point_weight_scale(point,10)
func posToID(pos: Vector2i) -> int:
return gridSize*pos.x + pos.y
#Generating Biome Connections
func chooseBiomeExits() -> void:
var existingBiomes: Array[String] = []
var currentBiomeExits: Array[BiomeExit] = []
var choosenBiomeExits: Array[BiomeExit] = []
# Find What Biomes are Present
for x in levelGrid.size():
for y in levelGrid[x].size():
if !existingBiomes.has(levelGrid[x][y].biome):
existingBiomes.push_back(levelGrid[x][y].biome)
#For each biome choose a number of exit
for i in existingBiomes.size():
#Look through all exits for exits belonging to this biome
for exit in biomeExitPositions:
if exit.biome == existingBiomes[i]:
currentBiomeExits.push_back(exit)
biomeExitPositions.erase(exit)
#For each other biome, choose an exit
for n in existingBiomes.size()-1:
# Randomly determine an exit
var exit: BiomeExit = currentBiomeExits[rng.randi_range(0,currentBiomeExits.size()-1)]
#Test if exit was already choosen
if !choosenBiomeExits.has(exit):
choosenBiomeExits.push_back(exit)
currentBiomeExits.clear()
#Get rid of all other exits
biomeExitPositions = choosenBiomeExits
func doorsAtBiomeExits() -> void:
for exit in biomeExitPositions:
levelGrid[exit.pos.x][exit.pos.y].door = false
func generateConnectionPath() -> PackedVector2Array:
var returnArray: PackedVector2Array = []
#Look through all exits and find the closest other exit
for exit in biomeExitPositions:
var closestPoint: Vector2i
var closestPointDistance: float = gridSize*gridSize
for exit1 in biomeExitPositions:
if (exit1.pos - exit.pos).length() < closestPointDistance and exit.biome != exit1.biome:
closestPoint = exit1.pos
closestPointDistance = (exit1.pos - exit.pos).length()
#Connect the exits
returnArray += astar.get_point_path(posToID(exit.pos),posToID(closestPoint))
return returnArray #astar.get_point_path(posToID(biomeA.pos),posToID(biomeB.pos))
func addFloorPos(gridCell: GridCell) -> void:
if !gridCell.biomeConnection and !gridCell.spaceTaken:
connectPathPositions.push_back(gridCell.position)
gridCell.biomeConnection = true
gridCell.spaceTaken = true
func generateFloorPositions(spread: int = 2) -> void:
for x in spread:
for y in connectPathPositions.size():
var fPos: Vector2i = connectPathPositions[y]
levelGrid[fPos.x][fPos.y].spaceTaken = true
levelGrid[fPos.x][fPos.y].biomeConnection = true
addFloorPos(levelGrid[clampi(fPos.x+1,0,gridSize-1)][fPos.y])
addFloorPos(levelGrid[fPos.x][clampi(fPos.y+1,0,gridSize-1)])
addFloorPos(levelGrid[clampi(fPos.x-1,0,gridSize-1)][fPos.y])
addFloorPos(levelGrid[fPos.x][clampi(fPos.y-1,0,gridSize-1)])
func placeFloorPositionTiles() -> void:
for tilePos in connectPathPositions:
addObject(tile,self,Vector3(tilePos.x+0.5,0,tilePos.y+0.5))
func spawnWallSegment(pos: Vector2i,rot: int) -> void:
addObject(tileWall,self,Vector3(pos.x+0.5,0,pos.y+0.5),Vector3(0,rot*PI/2,0))
func spawnCornerSegment(pos: Vector2i,rot: int) -> void:
addObject(tileCorner,self,Vector3(pos.x+0.5,0,pos.y+0.5),Vector3(0,rot*PI/2,0))
func placeWallsAlongTiles() -> void:
for x in levelGrid.size():
for y in levelGrid[x].size():
if !levelGrid[x][y].biomeConnection: continue
if x+1 != levelGrid.size():
if !levelGrid[x+1][y].spaceTaken: spawnWallSegment(Vector2i(x,y),3)
if x != 0:
if !levelGrid[x-1][y].spaceTaken: spawnWallSegment(Vector2i(x,y),1)
if y+1 != levelGrid.size():
if !levelGrid[x][y+1].spaceTaken: spawnWallSegment(Vector2i(x,y),2)
if y != -1:
if !levelGrid[x][y-1].spaceTaken: spawnWallSegment(Vector2i(x,y),0)
if x+1 != levelGrid.size() and y+1 != levelGrid.size():
if !levelGrid[x+1][y+1].spaceTaken: spawnCornerSegment(Vector2i(x,y),3)
if x != 0 and y != 0:
if !levelGrid[x-1][y-1].spaceTaken: spawnCornerSegment(Vector2i(x,y),1)
if x+1 != levelGrid.size() and y != 0:
if !levelGrid[x+1][y-1].spaceTaken: spawnCornerSegment(Vector2i(x,y),0)
if y+1 != levelGrid.size() and x != 0:
if !levelGrid[x-1][y+1].spaceTaken: spawnCornerSegment(Vector2i(x,y),2)
#Debug Functions
func printLevelGrid() -> void:
for x in levelGrid.size():
for y in levelGrid[x].size():
if levelGrid[x][y].biomeConnection:
debugCubeAtPos(Vector2(x,y))
func printBiomeGrid() -> void:
for x in levelGrid.size():
for y in levelGrid[x].size():
if levelGrid[x][y].biome == "test":
debugCubeAtPos(Vector2(x,y))
func debugCubeAtPos(pos: Vector2):
var debugCube: PackedScene = preload("res://test/debugCube.tscn")
addObject(debugCube,self,Vector3(pos.x+0.5,0,pos.y+0.5))
func showAstarPoints() -> void:
for point in astar.get_point_ids():
var point_pos: Vector2i = astar.get_point_position(point)
debugCubeAtPos(point_pos)

View File

@@ -0,0 +1 @@
uid://cq0sxwn7k47n6

View File

@@ -0,0 +1,56 @@
extends Object
class_name RoomImageLoader
signal finishedLoading
signal finishedGettingDoors
func loadRoomData(image: Image) -> Array[Array]:
var imageSize: Vector2i = image.get_size()
var returnArray: Array[Array]
for x in imageSize.x:
var yArray: Array[GridCell]
returnArray.push_back(yArray)
for y in imageSize.y:
var gridCell: GridCell = GridCell.new()
var pixel: Color = image.get_pixel(x,y)
gridCell.spaceTaken = isColorTakingSpace(pixel)
if pixel == Color(1,0,0,1):
gridCell.door = true
gridCell.doorOrientation = getDoorOrientation(image,Vector2i(x,y))
yArray.push_back(gridCell)
finishedLoading.emit()
return returnArray
func isColorTakingSpace(pixel: Color) -> bool:
var returnBool: bool = true
if pixel == Color(1,1,1,1) or pixel == Color(1,0,0,1):
returnBool = false
return returnBool
func getDoors(grid: Array[Array]) -> Array[DoorPosition]:
var returnArray: Array[DoorPosition]
for x in grid.size():
for y in grid[x].size():
if grid[x][y].door:
var newDoorPos := DoorPosition.new()
newDoorPos.pos = Vector2i(x,y)
newDoorPos.orientation = grid[x][y].doorOrientation
returnArray.push_back(newDoorPos)
finishedGettingDoors.emit()
return returnArray
func getDoorOrientation(image: Image,pos: Vector2i) -> int:
var imageHeight: int = image.get_height()
var imageWidth: int = image.get_width()
if !(pos.y == imageHeight-1):
if image.get_pixelv(pos + Vector2i(0,1)) == Color(0,0,1,1): return GridCell.doorOrientations.north
if !(pos.x == 0):
if image.get_pixelv(pos + Vector2i(-1,0)) == Color(0,0,1,1): return GridCell.doorOrientations.east
if !(pos.y == 0):
if image.get_pixelv(pos + Vector2i(0,-1)) == Color(0,0,1,1): return GridCell.doorOrientations.south
if !(pos.x == imageWidth-1):
if image.get_pixelv(pos + Vector2i(1,0)) == Color(0,0,1,1): return GridCell.doorOrientations.west
return 0

View File

@@ -0,0 +1 @@
uid://saart6lt7yni

View File

@@ -0,0 +1,47 @@
[gd_scene load_steps=3 format=3 uid="uid://djvrkf3ma61fu"]
[ext_resource type="Texture2D" uid="uid://icwcdyvrtcwe" path="res://test/TestTex1.png" id="1_bpbam"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_fo7uf"]
albedo_color = Color(0.7176471, 0.7176471, 0.7176471, 1)
albedo_texture = ExtResource("1_bpbam")
metallic = 0.7
[node name="4WayRoom" type="Node3D"]
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 0.5, -0.5)
material_override = SubResource("StandardMaterial3D_fo7uf")
use_collision = true
[node name="CSGBox3D" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0)
size = Vector3(5, 6, 5)
[node name="CSGBox3D2" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1195679, 0)
operation = 2
size = Vector3(4.5, 3.2391357, 4.5)
[node name="Door" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 1, 0)
operation = 2
size = Vector3(1, 3, 3)
[node name="Door2" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.5, 1, 0)
operation = 2
size = Vector3(1, 3, 3)
[node name="Door3" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 0, 1, -2.5)
operation = 2
size = Vector3(1, 3, 3)
[node name="Door4" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 0, 1, 2.5)
operation = 2
size = Vector3(1, 3, 3)
[node name="OmniLight3D" type="OmniLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 2.791, -0.5)

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 B

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://sidx5xyv55wr"
path="res://.godot/imported/4WayRoomData.png-31c927c3a34104f6d5731e68d59ab82e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Maps/Rooms/Generic Connectors/4Way/4WayRoomData.png"
dest_files=["res://.godot/imported/4WayRoomData.png-31c927c3a34104f6d5731e68d59ab82e.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@@ -0,0 +1,50 @@
[gd_scene load_steps=3 format=3 uid="uid://cv48w5y11hgfx"]
[ext_resource type="Texture2D" uid="uid://icwcdyvrtcwe" path="res://test/TestTex1.png" id="1_qxrvj"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ll6w0"]
albedo_color = Color(0.7176471, 0.7176471, 0.7176471, 1)
albedo_texture = ExtResource("1_qxrvj")
metallic = 0.7
[node name="CornerRoom" type="Node3D"]
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
material_override = SubResource("StandardMaterial3D_ll6w0")
use_collision = true
[node name="CSGBox3D" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, -1.5)
size = Vector3(6, 6, 5)
[node name="CSGBox3D2" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.5, 2, 0)
size = Vector3(6, 6, 5)
[node name="CSGBox3D3" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, -1.5)
operation = 2
size = Vector3(5.5, 5, 4.5)
[node name="CSGBox3D4" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.5, 2, 0)
operation = 2
size = Vector3(5.5, 5, 4.5)
[node name="Door" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 1, -1.5)
operation = 2
size = Vector3(1, 3, 3)
[node name="Door2" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.5, 1, 3)
operation = 2
size = Vector3(1, 3, 3)
[node name="CSGBox3D5" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(0.70710677, 0, 0.70710677, 0, 1, 0, -0.70710677, 0, 0.70710677, -2.4995685, 2.136, -2.5004315)
size = Vector3(3.7810059, 5.273, 0.2)
[node name="OmniLight3D" type="OmniLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.118073, 0)

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 B

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c5w3heoxsjq4n"
path="res://.godot/imported/CornerRoomData.png-ea953f2c9550375ab2bc2b9296d1268d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Maps/Rooms/Generic Connectors/Corner/CornerRoomData.png"
dest_files=["res://.godot/imported/CornerRoomData.png-ea953f2c9550375ab2bc2b9296d1268d.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@@ -0,0 +1,37 @@
[gd_scene load_steps=3 format=3 uid="uid://bi320yo04o4hk"]
[ext_resource type="Texture2D" uid="uid://icwcdyvrtcwe" path="res://test/TestTex1.png" id="1_74hrc"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_u6y0v"]
albedo_color = Color(0.7176471, 0.7176471, 0.7176471, 1)
albedo_texture = ExtResource("1_74hrc")
metallic = 0.7
[node name="Hallway" type="Node3D"]
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
material_override = SubResource("StandardMaterial3D_u6y0v")
use_collision = true
[node name="CSGBox3D" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, -0.5)
size = Vector3(8, 6, 5)
[node name="CSGBox3D3" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, -0.5)
operation = 2
size = Vector3(7.5, 4, 4.5)
[node name="Door" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 1, -0.5)
operation = 2
size = Vector3(1, 3, 3)
[node name="Door2" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4, 1, -0.5)
operation = 2
size = Vector3(1, 3, 3)
[node name="OmniLight3D" type="OmniLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.6033916, 0)

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cd8ffur7roccs"
path="res://.godot/imported/HallwayRoomData.png-c7018fac44e76d2dfeb8107401f7bccc.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Maps/Rooms/Generic Connectors/Hallway/HallwayRoomData.png"
dest_files=["res://.godot/imported/HallwayRoomData.png-c7018fac44e76d2dfeb8107401f7bccc.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@@ -0,0 +1,69 @@
[gd_scene load_steps=3 format=3 uid="uid://dgawoqpbufmp6"]
[ext_resource type="Texture2D" uid="uid://icwcdyvrtcwe" path="res://test/TestTex1.png" id="1_nxio2"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_b7a2o"]
albedo_color = Color(0.7176471, 0.7176471, 0.7176471, 1)
albedo_texture = ExtResource("1_nxio2")
metallic = 0.7
[node name="THallway" type="Node3D"]
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
material_override = SubResource("StandardMaterial3D_b7a2o")
use_collision = true
[node name="Middle" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 2, -1.5)
size = Vector3(5, 6, 5)
[node name="Middle2" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 2, -1.5)
size = Vector3(2, 6, 5)
[node name="Middle3" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4, 2, -1.5)
size = Vector3(2, 6, 5)
[node name="Middle4" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -0.5, 2, 2)
size = Vector3(2, 6, 5)
[node name="Middle5" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 1.5, -1.5)
operation = 2
size = Vector3(4.5, 4, 4.5)
[node name="Middle6" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.031144, 1.5, -1.5)
operation = 2
size = Vector3(3.5, 4, 4.5)
[node name="Middle7" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.9354858, 1.5, -1.5)
operation = 2
size = Vector3(3.6290283, 4, 4.5)
[node name="Middle8" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -0.5, 1.5, 1.5012207)
operation = 2
size = Vector3(2.4975586, 4, 4.5)
[node name="Door" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 1, 3)
operation = 2
size = Vector3(3, 3, 0.5)
[node name="Door2" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4, 1, -1.5)
operation = 2
size = Vector3(3, 3, 0.5)
[node name="Door3" type="CSGBox3D" parent="CSGCombiner3D"]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -5, 1, -1.5)
operation = 2
size = Vector3(3, 3, 0.5)
[node name="OmniLight3D" type="OmniLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 2.21, -1.5)

Binary file not shown.

After

Width:  |  Height:  |  Size: 396 B

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b7bpona2op82b"
path="res://.godot/imported/THallwayRoomData.png-0e4645eaba254d51a19ae30b45b14ea1.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Maps/Rooms/Generic Connectors/THallway/THallwayRoomData.png"
dest_files=["res://.godot/imported/THallwayRoomData.png-0e4645eaba254d51a19ae30b45b14ea1.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://2ekco7xpg1bj"
path="res://.godot/imported/HangerRoomData.png-20cd3ad88c21fbd347e0d1e93ef65e4c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Maps/Rooms/Starter/Hanger/HangerRoomData.png"
dest_files=["res://.godot/imported/HangerRoomData.png-20cd3ad88c21fbd347e0d1e93ef65e4c.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@@ -0,0 +1,64 @@
[gd_scene load_steps=7 format=4 uid="uid://7p668ibmmx21"]
[ext_resource type="Script" uid="uid://cww7fnikeau22" path="res://Maps/Spaceship/RoomScripts/corridor_dead_end.gd" id="1_1beyu"]
[ext_resource type="Script" uid="uid://b7ma88dd5c5tb" path="res://Maps/Spaceship/Objects/flicker_omni_light_3d.gd" id="2_nbfqo"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_obqup"]
[sub_resource type="ArrayMesh" id="ArrayMesh_g7bps"]
_surfaces = [{
"aabb": AABB(-3.5, 0, -7, 7, 7, 14),
"format": 34359742465,
"index_count": 204,
"index_data": PackedByteArray("AAABAAIAAAADAAEABAACAAEABQAAAAIABQADAAAABgACAAQABQACAAcABgAHAAIABAABAAgACAAGAAQACAABAAkAAwAJAAEACAAKAAYACAAJAAoABgALAAcACgALAAYADAAHAAsADAAFAAcADQALAAoACwANAAwACQAOAAoADQAKAA4ADwAOAAkADgAPAA0AAwAQAAkADwAJABAAAwAPABAAEQADAAUAAwARAA8ABQAMABEADwASAA0ADQATAAwADQASABMADAAUABEADAATABQAEQAVAA8AEQAUABUADwAVABIAEwAWABQAFgAVABQAEgAXABMAFgATABcAFQAYABIAGAAVABkAFwASABoAGgASABgAFgAXABsAFQAcABkAFgAcABUAGAAZAB0AHQAaABgAHAAdABkAFwAaAB4AHgAbABcAHwAaAB0AHwAeABoAHwAgAB4AHwAdACEAIAAfACEAHAAhAB0AHgAgACIAHgAiABsAIAAhACIAFgAbACIAIwAhABwAHAAWACMAIwAiACEAFgAiACMA"),
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 36,
"vertex_data": PackedByteArray("AABgwAAAAAAAAODAAABgQJqZyUAAAODAAABgwJqZyUAAAODAAABgQAAAAAAAAODAMzMzwAAA4ECamcnAAABgwAAAAAAAAOBAMzMzwAAA4EAAAOBAAABgwJqZyUAAAOBAMzMzQAAA4ECamcnAAABgQJqZyUAAAOBAMzMzQAAA4EAAAOBAVlJAwCsp0EAAAOBAAQDAvwAAoEAAAOBAAQDAPwAAoEAAAOBAVlJAQCsp0EAAAOBAAQDAPwAAAAAAAOBAAABgQAAAAAAAAOBAAQDAvwAAAAAAAOBAAQDAPwAAoEBmZt5AAQDAvwAAoEBmZt5AAQDAv78tNz3SSN9AAQDAP78tNz3SSN9ACSdewJJ77DyEE99AVlJAwCsp0EBmZt5AVlJAQCsp0EBmZt5ACSdeQJJ77DyEE99Azz8yQDTa3kDY/d5AZ7RdwOgfyUDY/d5ACSdeQJB77DyEE9/AZ7RdQOgfyUDY/d5Azz8ywDTa3kDY/d5ASD0yQCWN3kCkHsnASD0ywCWN3kCkHsnA8epdQEz5yEB59d7A8epdwEz5yEB59d7ACSdewJB77DyEE9/A")
}]
blend_shape_mode = 0
[sub_resource type="ArrayMesh" id="ArrayMesh_1beyu"]
resource_name = "CorridorDeadEnd_Cube_001"
_surfaces = [{
"aabb": AABB(-3.5, 0, -7, 7, 7, 14),
"attribute_data": PackedByteArray("AADAPgAAQD+ZmRk/AAAAP5mZGT8AAEA/AADAPgAAAD8AAMA+AAAAP5mZGT8AAIA+mZkZPwAAAD8AAMA+AACAPgAAwD4AAAAA27YNPyBJkj1JkuQ+IEmSPZmZGT8AAAAAenkbP8DQkDzMzBw/wMxMPNu2DT9w2zY+AAAgP2hmZj4AACA/wMzMPHp5Gz/o5W0+SpLkPmzbNj6ZmRk/AACAPszMHD80M3M+AADAPgAAgD4AAMA+AAAAAAAAwD4AAAA/AADAPgAAQD9JkuQ+IEmSPUqS5D5s2zY+AADAPgAAgD4AAMA+AACAP5mZGT8AAEA/mZkZPwAAgD8AAMA+AABAPwAAID8AAIA/mZkZPwAAQD8AACA/MzNDP5mZGT8AAIA/AAAgP5qZOT+ZmRk/AAAAPwAAID9mZgY/mZkZPwAAQD9lZiY/nJn5PpmZGT8AAIA+ZmYmPwAAgD6ZmRk/AAAAP2VmJj+cmfk+mZlZPwIAgD6amVk/mJn5PmZmJj8AAIA+AADAPgAAQD+ZmRk/AAAAPwAAwD4AAAA/mZkZPwAAQD8AAMA+AAAAP5mZGT8AAIA+AADAPgAAgD6ZmRk/AAAAP9u2DT8gSZI9AADAPgAAAABJkuQ+IEmSPXp5Gz/A0JA8mZkZPwAAAAAAAMA+AAAAPwAAwD4AAAAAAADAPgAAQD9KkuQ+bNs2PgAAwD4AAIA+SZLkPiBJkj0AAMA+AACAP5mZGT8AAEA/AADAPgAAQD+ZmRk/AACAP9u2DT9w2zY+enkbP8DQkDzbtg0/IEmSPQAAID9oZmY+enkbP+jlbT4AACA/wMzMPEqS5D5s2zY+enkbP+jlbT7btg0/cNs2PgAAwD4AAIA+mZkZPwAAgD7MzBw/wMxMPJmZGT8AAAAAenkbP8DQkDyZmRk/AACAPszMHD80M3M+enkbP+jlbT4AACA/AACAP5mZGT8AAEA/mZkZPwAAgD8AACA/MzNDPwAAID+amTk/mZkZPwAAAD+ZmRk/AABAPwAAID9mZgY/ZWYmP5yZ+T6ZmRk/AACAPpmZGT8AAAA/ZmYmPwAAgD5lZiY/nJn5PpmZWT8CAIA+ZmYmPwAAgD6amVk/mJn5PkmS5D4gSZI9SpLkPmzbNj5KkuQ+bNs2PkmS5D4gSZI927YNPyBJkj1JkuQ+IEmSPUmS5D4gSZI927YNPyBJkj1KkuQ+bNs2Ptu2DT9w2zY+27YNP3DbNj5KkuQ+bNs2Ptu2DT9w2zY+27YNPyBJkj3btg0/IEmSPdu2DT9w2zY+"),
"format": 34359742487,
"index_count": 204,
"index_data": PackedByteArray("AAABAAIAAAADAAEABAAFAAYABAAHAAUACAAJAAoACQAIAAsACQALAAwADQAMAAsADAAOAAkADgAMAA8ADwAMABAADgAPABEAEQASAA4AEgARABMAEwARABQAEgATABUAFgAXABgAGQAXABYAFwAZABoAFwAaABsAHAAdAB4AHAAfAB0AIAAhACIAIAAjACEAJAAlACYAJAAnACUAKAApACoAKAArACkALAAtAC4ALAAvAC0AMAAxADIAMAAzADEANAA1ADYANAA3ADUAOAA5ADoAOQA4ADsAOQA7ADwAPQA+AD8APgA9AEAAQAA9AEEAPgBAAEIAQwBEAEUAQwBGAEQARwBIAEkASABHAEoASgBHAEsASABKAEwATQBOAE8ATgBNAFAATgBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWABbAFkAXABdAF4AXABfAF0AYABhAGIAYABjAGEAZABlAGYAZABnAGUAaABpAGoAaABrAGkAbABtAG4AbABvAG0AcABxAHIAcABzAHEAdAB1AHYAdAB3AHUA"),
"material": SubResource("StandardMaterial3D_obqup"),
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 120,
"vertex_data": PackedByteArray("AABgwAAAAAAAAODAAABgQJqZyUAAAODAAABgwJqZyUAAAODAAABgQAAAAAAAAODAAABgQAAAAAAAAODAAABgQJqZyUAAAOBAAABgQJqZyUAAAODAAABgQAAAAAAAAOBAAABgwAAAAAAAAOBAAQDAvwAAoEAAAOBAAQDAvwAAAAAAAOBAAABgwJqZyUAAAOBAVlJAwCsp0EAAAOBAMzMzwAAA4EAAAOBAAQDAPwAAoEAAAOBAMzMzQAAA4EAAAOBAMzMzwAAA4EAAAOBAVlJAQCsp0EAAAOBAAQDAPwAAAAAAAOBAAABgQJqZyUAAAOBAMzMzQAAA4EAAAOBAAABgQAAAAAAAAOBAAABgwAAAAAAAAOBAAABgQAAAAAAAAODAAABgwAAAAAAAAODAAQDAvwAAAAAAAOBAAQDAPwAAAAAAAOBAAABgQAAAAAAAAOBAAABgwAAAAAAAAOBAAABgwJqZyUAAAODAAABgwJqZyUAAAOBAAABgwAAAAAAAAODAMzMzwAAA4EAAAOBAAABgwJqZyUAAAODAMzMzwAAA4ECamcnAAABgwJqZyUAAAOBAMzMzwAAA4ECamcnAAABgQJqZyUAAAODAMzMzQAAA4ECamcnAAABgwJqZyUAAAODAMzMzQAAA4ECamcnAAABgQJqZyUAAAOBAMzMzQAAA4EAAAOBAAABgQJqZyUAAAODAMzMzQAAA4ECamcnAMzMzwAAA4EAAAOBAMzMzwAAA4ECamcnAMzMzQAAA4EAAAOBACSdewJB77DyEE9/A8epdQEz5yEB59d7ACSdeQJB77DyEE9/A8epdwEz5yEB59d7ACSdeQJB77DyEE9/AZ7RdQOgfyUDY/d5ACSdeQJJ77DyEE99A8epdQEz5yEB59d7AAQDAvwAAoEBmZt5ACSdewJJ77DyEE99AAQDAv78tNz3SSN9AVlJAwCsp0EBmZt5AZ7RdwOgfyUDY/d5ACSdeQJB77DyEE9/ACSdewJJ77DyEE99ACSdewJB77DyEE9/AAQDAP78tNz3SSN9ACSdeQJJ77DyEE99AAQDAv78tNz3SSN9ACSdewJJ77DyEE99A8epdwEz5yEB59d7ACSdewJB77DyEE9/AZ7RdwOgfyUDY/d5AAQDAPwAAoEBmZt5AVlJAwCsp0EBmZt5AAQDAvwAAoEBmZt5Azz8yQDTa3kDY/d5AVlJAQCsp0EBmZt5Azz8ywDTa3kDY/d5AAQDAP78tNz3SSN9AVlJAQCsp0EBmZt5AAQDAPwAAoEBmZt5ACSdeQJJ77DyEE99AZ7RdQOgfyUDY/d5Azz8ywDTa3kDY/d5AZ7RdwOgfyUDY/d5AVlJAwCsp0EBmZt5AZ7RdQOgfyUDY/d5Azz8yQDTa3kDY/d5AVlJAQCsp0EBmZt5Azz8ywDTa3kDY/d5A8epdwEz5yEB59d7AZ7RdwOgfyUDY/d5ASD0ywCWN3kCkHsnASD0ywCWN3kCkHsnA8epdQEz5yEB59d7A8epdwEz5yEB59d7ASD0yQCWN3kCkHsnASD0yQCWN3kCkHsnAZ7RdQOgfyUDY/d5A8epdQEz5yEB59d7Azz8yQDTa3kDY/d5ASD0yQCWN3kCkHsnAzz8ywDTa3kDY/d5Azz8yQDTa3kDY/d5ASD0ywCWN3kCkHsnAAQDAvwAAAAAAAOBAAQDAP78tNz3SSN9AAQDAPwAAAAAAAOBAAQDAv78tNz3SSN9AAQDAvwAAoEAAAOBAAQDAv78tNz3SSN9AAQDAvwAAAAAAAOBAAQDAvwAAoEBmZt5AAQDAPwAAAAAAAOBAAQDAPwAAoEBmZt5AAQDAPwAAoEAAAOBAAQDAP78tNz3SSN9AAQDAPwAAoEAAAOBAAQDAvwAAoEBmZt5AAQDAvwAAoEAAAOBAAQDAPwAAoEBmZt5A//////9//////////3//////////f/////////9///////9//3///////3//f///////f/9///////9//3////9//3//f////3//f/9//v//f/9//3////9//3+ziqX6/3//f2mWyfT/f/9/f7E+5/9//3//f/7//3//f/9//v//f/9//3/+//9//3+Vacn0/3//f/9/////f/9/S3Wl+v9//39/Tj7n/3//f/9/////fwAAqqr/v/9/AACqqv+//38AAP///7//fwAAqqr/v/9/AACqqv+//38AAAAAVRUAAP9//3///wAA/3//f///AAD/f/9///8AAP9//3////8//7//v//f/z//v/+//9//P/+//7//3/8//7//v//f/7////9//9//v////3//3/+/////f//f/7////9//9//v/+//z//3/+//7//P//f/7//v/8//9//v/+//z//3/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3/rfwCACgD/f+t//n8KAP9/63/sfxMA/3/rfxKAEwAdAN5/4n8TAB0A3n/dfw4AHQDef9R/DgAdAN5/4n8YAHsAnwATfzgAewCfAGt/DAB7AJ8Ae4AAAHsAnwBafxQAewCfAJ+AEQAZgP//oKr3PxmA//+Aqvc/GYD//////78ZgP//kqr3PxmA//8RADGVGYD//5kX/T/h/95/IYAOAOH/3n8cgBMA4f/efxyAGADh/95/KoAOAJD+//8lfyIBkP7//zKCzQGQ/v///3+3AJD+//9lfoEBkP7//zp9FQKQ/v//P4TQAoP/nwDYgC4Ag/+fAIB/AQCD/58Ag38AAIP/nwDhgDMAg/+fAF9/EQCQCG736LJkGpAIbvfosmQakAhu9+iyZBpu9273Fk1kGm73bvcWTWQabvdu9xZNZBrIv9A/OsAVIMi/0D/ZwMUfyL/QPzLAGSDIv9A/5cC/H/9/nD8gf2kg/3+cP+qAbCD/f5w/935zIP9/nD9IgYMgNkDQPyc/xh82QNA/xD8VIDZA0D8iP8MfNkDQP8w/GSD/fxYAAAD/P/9/FgAAAP8//38WAAAA/z//fxYAAAD/P/9/qqr///8//3+qqv///z//f6qq////P/9/qqr///8/////f////7////9/////v////3////+/////f////78AAP9/////vwAA/3////+/AAD/f////78AAP9/////v/9/AAD///+//38AAP///7//fwAA////v/9/AAD///+/")
}]
blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_g7bps")
[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_pjmyq"]
data = PackedVector3Array(-3.5, 0, -7, 3.5, 6.3, -7, -3.5, 6.3, -7, -3.5, 0, -7, 3.5, 0, -7, 3.5, 6.3, -7, 3.5, 0, -7, 3.5, 6.3, 7, 3.5, 6.3, -7, 3.5, 0, -7, 3.5, 0, 7, 3.5, 6.3, 7, -3.5, 0, 7, -1.5, 5, 7, -1.5, 0, 7, -1.5, 5, 7, -3.5, 0, 7, -3.5, 6.3, 7, -1.5, 5, 7, -3.5, 6.3, 7, -3.005, 6.505, 7, -2.8, 7, 7, -3.005, 6.505, 7, -3.5, 6.3, 7, -3.005, 6.505, 7, 1.5, 5, 7, -1.5, 5, 7, 1.5, 5, 7, -3.005, 6.505, 7, 2.8, 7, 7, 2.8, 7, 7, -3.005, 6.505, 7, -2.8, 7, 7, 1.5, 5, 7, 2.8, 7, 7, 3.005, 6.505, 7, 3.005, 6.505, 7, 1.5, 0, 7, 1.5, 5, 7, 1.5, 0, 7, 3.005, 6.505, 7, 3.5, 6.3, 7, 3.5, 6.3, 7, 3.005, 6.505, 7, 2.8, 7, 7, 1.5, 0, 7, 3.5, 6.3, 7, 3.5, 0, 7, -3.5, 0, 7, 3.5, 0, -7, -3.5, 0, -7, -1.5, 0, 7, 3.5, 0, -7, -3.5, 0, 7, 3.5, 0, -7, -1.5, 0, 7, 1.5, 0, 7, 3.5, 0, -7, 1.5, 0, 7, 3.5, 0, 7, -3.5, 0, 7, -3.5, 6.3, -7, -3.5, 6.3, 7, -3.5, 0, 7, -3.5, 0, -7, -3.5, 6.3, -7, -2.8, 7, 7, -3.5, 6.3, -7, -2.8, 7, -6.3, -2.8, 7, 7, -3.5, 6.3, 7, -3.5, 6.3, -7, -2.8, 7, -6.3, 3.5, 6.3, -7, 2.8, 7, -6.3, -2.8, 7, -6.3, -3.5, 6.3, -7, 3.5, 6.3, -7, 2.8, 7, -6.3, 3.5, 6.3, 7, 2.8, 7, 7, 2.8, 7, -6.3, 3.5, 6.3, -7, 3.5, 6.3, 7, 2.8, 7, -6.3, -2.8, 7, 7, -2.8, 7, -6.3, 2.8, 7, -6.3, 2.8, 7, 7, -2.8, 7, 7, -3.4711, 0.0289, -6.9711, 3.4675, 6.2804, -6.9675, 3.4711, 0.0289, -6.9711, -3.4711, 0.0289, -6.9711, -3.4675, 6.2804, -6.9675, 3.4675, 6.2804, -6.9675, 3.4711, 0.0289, -6.9711, 3.4641, 6.2851, 6.9685, 3.4711, 0.0289, 6.9711, 3.4711, 0.0289, -6.9711, 3.4675, 6.2804, -6.9675, 3.4641, 6.2851, 6.9685, -1.5, 5, 6.95, -3.4711, 0.0289, 6.9711, -1.5, 0.0447, 6.9776, -3.4711, 0.0289, 6.9711, -1.5, 5, 6.95, -3.005, 6.505, 6.95, -3.4711, 0.0289, 6.9711, -3.005, 6.505, 6.95, -3.4641, 6.2851, 6.9685, 3.4711, 0.0289, -6.9711, -3.4711, 0.0289, 6.9711, -3.4711, 0.0289, -6.9711, -3.4711, 0.0289, 6.9711, 3.4711, 0.0289, -6.9711, 1.5, 0.0447, 6.9776, 1.5, 0.0447, 6.9776, 3.4711, 0.0289, -6.9711, 3.4711, 0.0289, 6.9711, -3.4711, 0.0289, 6.9711, 1.5, 0.0447, 6.9776, -1.5, 0.0447, 6.9776, -3.4711, 0.0289, 6.9711, -3.4675, 6.2804, -6.9675, -3.4711, 0.0289, -6.9711, -3.4711, 0.0289, 6.9711, -3.4641, 6.2851, 6.9685, -3.4675, 6.2804, -6.9675, 1.5, 5, 6.95, -3.005, 6.505, 6.95, -1.5, 5, 6.95, -3.005, 6.505, 6.95, 1.5, 5, 6.95, 2.7851, 6.9641, 6.9685, 2.7851, 6.9641, 6.9685, 1.5, 5, 6.95, 3.005, 6.505, 6.95, -3.005, 6.505, 6.95, 2.7851, 6.9641, 6.9685, -2.7851, 6.9641, 6.9685, 1.5, 0.0447, 6.9776, 3.005, 6.505, 6.95, 1.5, 5, 6.95, 3.005, 6.505, 6.95, 1.5, 0.0447, 6.9776, 3.4711, 0.0289, 6.9711, 3.005, 6.505, 6.95, 3.4711, 0.0289, 6.9711, 3.4641, 6.2851, 6.9685, -2.7851, 6.9641, 6.9685, -3.4641, 6.2851, 6.9685, -3.005, 6.505, 6.95, 3.4641, 6.2851, 6.9685, 2.7851, 6.9641, 6.9685, 3.005, 6.505, 6.95, -2.7851, 6.9641, 6.9685, -3.4675, 6.2804, -6.9675, -3.4641, 6.2851, 6.9685, -2.7851, 6.9641, 6.9685, -2.785, 6.9547, -6.285, -3.4675, 6.2804, -6.9675, -2.785, 6.9547, -6.285, 3.4675, 6.2804, -6.9675, -3.4675, 6.2804, -6.9675, -2.785, 6.9547, -6.285, 2.785, 6.9547, -6.285, 3.4675, 6.2804, -6.9675, 2.785, 6.9547, -6.285, 3.4641, 6.2851, 6.9685, 3.4675, 6.2804, -6.9675, 2.785, 6.9547, -6.285, 2.7851, 6.9641, 6.9685, 3.4641, 6.2851, 6.9685, 2.785, 6.9547, -6.285, -2.7851, 6.9641, 6.9685, 2.7851, 6.9641, 6.9685, 2.785, 6.9547, -6.285, -2.785, 6.9547, -6.285, -2.7851, 6.9641, 6.9685, -1.5, 0, 7, 1.5, 0.0447, 6.9776, 1.5, 0, 7, -1.5, 0, 7, -1.5, 0.0447, 6.9776, 1.5, 0.0447, 6.9776, -1.5, 5, 7, -1.5, 0.0447, 6.9776, -1.5, 0, 7, -1.5, 5, 7, -1.5, 5, 6.95, -1.5, 0.0447, 6.9776, 1.5, 0, 7, 1.5, 5, 6.95, 1.5, 5, 7, 1.5, 0, 7, 1.5, 0.0447, 6.9776, 1.5, 5, 6.95, 1.5, 5, 7, -1.5, 5, 6.95, -1.5, 5, 7, 1.5, 5, 7, 1.5, 5, 6.95, -1.5, 5, 6.95)
[node name="CorridorDeadEnd" type="Node3D" node_paths=PackedStringArray("Lights")]
script = ExtResource("1_1beyu")
Lights = [NodePath("OmniLight3D")]
metadata/_custom_type_script = "uid://lmn08s8c5lfo"
[node name="Cube" type="MeshInstance3D" parent="."]
transform = Transform3D(1.19249e-08, 0, -1, 0, 1, 0, 1, 0, 1.19249e-08, 3.5, 0, 0)
mesh = SubResource("ArrayMesh_1beyu")
skeleton = NodePath("")
metadata/extras = {
"poliigon_props": {}
}
[node name="StaticBody3D" type="StaticBody3D" parent="Cube"]
[node name="CollisionShape3D" type="CollisionShape3D" parent="Cube/StaticBody3D"]
shape = SubResource("ConcavePolygonShape3D_pjmyq")
debug_fill = false
[node name="OmniLight3D" type="OmniLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.1751, 5.51291, 0)
omni_range = 10.0
script = ExtResource("2_nbfqo")
metadata/_custom_type_script = "uid://b7ma88dd5c5tb"

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
extends Node3D
class_name BasicMinigame

View File

@@ -0,0 +1 @@
uid://clqxlalxpuvb0

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://cm2rioo553yur"]
[ext_resource type="Script" uid="uid://dnjusl5hyybly" path="res://random_minigame_spawner.gd" id="1_fmdp7"]
[node name="RandomMinigameSpawner" type="Node"]
script = ExtResource("1_fmdp7")

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,20 @@
extends Node3D
#class_name BasicDoor
var open: bool = false
@onready var doorSlide1: MeshInstance3D = $DoorFrame/DoorSlide
@onready var doorSlide2: MeshInstance3D = $DoorFrame/DoorSlide_001
const doorClosedPos: Vector3 = Vector3(0.057,1.703,0)
const doorOpenPos: Vector3 = Vector3(1.4,1.703,0)
func _on_area_3d_body_entered(_body: Node3D) -> void:
open = true
doorSlide1.position = doorOpenPos
doorSlide2.position = doorOpenPos * Vector3(-1,1,1)
func _on_area_3d_body_exited(_body: Node3D) -> void:
open = false
doorSlide1.position = doorClosedPos
doorSlide2.position = doorClosedPos * Vector3(-1,1,1)

View File

@@ -0,0 +1 @@
uid://dacge6grun0em

View File

@@ -0,0 +1,77 @@
[gd_scene load_steps=8 format=4 uid="uid://c52lwhaynro5j"]
[ext_resource type="Script" uid="uid://ymaax1x5fos3" path="res://script/interactBox.gd" id="1_6mmea"]
[ext_resource type="Script" uid="uid://cjiiw7cybj24b" path="res://script/ButtonLogicImpulse.gd" id="2_k0gfg"]
[sub_resource type="BoxShape3D" id="BoxShape3D_opyex"]
size = Vector3(0.536865, 1.14282, 0.68985)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_xirvw"]
[sub_resource type="ArrayMesh" id="ArrayMesh_lel7i"]
_surfaces = [{
"aabb": AABB(-0.187632, -0.315404, -0.206013, 0.370945, 0.461035, 0.430153),
"format": 34359742465,
"index_count": 552,
"index_data": PackedByteArray("AAABAAIAAgABADEAAgAxAAMAAAAFAAEABgAFAAAAAwAxADIAAwAyAAQAMwAxAAEAMQAzABAAAQAJADMABgAHAAUACAAHAAYANAABAAUAAQA0AAkABQAdADQANQAJADQAHQA1ADQAFwAzAAkAMwAXABAAFwAJADYACQAZADYACQA1ABkANwAXADYAGQA3ADYAFgAQABcANwAWABcAFgA4ABAAGQA5ADcAOgA4ABYAEAA4ABUAOgAVADgAEAAVADsAMQAQADsAOwAyADEAGAAWADcAGAA6ABYANwA8ABgANwA5ADwAPQA6ABgAGAA8AD4AGAA+AD0APQATADoAEwAVADoAPwATAD0APwA9AD4AEwBAABUAOwAVAEAAPwASABMAEgBAABMAOwBAABEAEgARAEAAMgA7ABEAEgBBABEAMgARAEEAQgASAD8AEgBCAEEAQQANADIADQBBAEIABAAyAA0ABAANAAwADAANAAoADAAKAAsADQBCAA4ADgAKAA0AQgBDAA4ACwAKAEQACwBEAAgACgAOAEUAQwBFAA4ACABEAAcARgBEAAoACgBFAEYARABGACcAKQBGAEUARgApACcAKQBFAEcARQAqAEcARQBDACoASAApAEcAKgBIAEcAKAAnACkASAAoACkAKAAmACcARAAnAA8ADwAHAEQAJwAmAEkAJwBJAA8ASgAmACgASgBJACYASwAoAEgASwBKACgABwAPACMADwBJACQADwAkACMAJQBJAEoAJQAkAEkATABKAEsATAAlAEoABwAjACEAIQAFAAcAJAAiACMAIgAhACMAJAAlACIABQAhAB0AIgAdACEAJQBNACIAHQAiAE0AJQBMAE0ATgAdAE0ATQBMAE8ASwBPAEwATQBPAE4AHQBOADUASwBQAE8ASABQAEsASABRAFAAKgBRAEgALwBPAFAAIABOAE8AIABPAC8ATgAgABsATgAbADUALQBQAFEALwBQAC0AKgAsAFEALQBRACwAUgAvAC0AKgBTACwAMAAvAFIAMAAgAC8AUgAtAFQAVAAtACwAMABSAFQAQwBTACoAIAAwAFUAIABVABsAVAAsAC4AUwAuACwAMABUAFYAVgBUAC4AUwBXAC4AVgAuAFcAKwBXAFMAQwArAFMAVgBXAFgAKwBYAFcAMABWAFkAVgBYAFkAMABZAFUAFAArAEMAQgAUAEMAFABCAD8APwA+ABQAFAAeACsAHgAUAD4AHgBYACsAWQBYAFoAHgBaAFgAHgA+ABwAWgAeABwAHAA+ADwAWgAcAFsAHAA8AFwAWwAcAFwAXAA8ADkAWgBbAF0AWwBcAF0AWQBaAF4AWgBdAF4AVQBZAF4AXAA5ABoAXQBcABoAGQAaADkAXgBdAB8AXQAaAB8AVQBeAF8AXgAfAF8AGwBVAF8AGQBgABoAYAAfABoAYABfAB8AGwBfAGAANQBgABkANQAbAGAA"),
"lods": [0.047312, PackedByteArray("AAABAAIAAgABAAMAAwABAAQAAAAFAAEABgAFAAAABgAHAAUACAAHAAYACQABAAUACAAKAAcACwAKAAgADAAKAAsADAANAAoABAANAAwADgAKAA0ADQAEAA4ADwAHAAoAEAAEAAEAAQAJABAABAAQABEAEgAEABEAEgAOAAQAEgARABMAEAATABEADgASABQAFAASABMAEAAVABMAFgAVABAAEwAVABYAFgAQABcAFwAQAAkAEwAWABgACQAZABcAGgAWABcAGAAWABoAGQAaABcAGgATABgACQAbABkAGQAbABoAHAATABoAHQAbAAkAHgATABwAHgAUABMAHwAcABoAGwAfABoAHgAcAB8ABQAdAAkAHQAgABsAIAAfABsABQAhAB0AIQAFAAcAIgAdACEAHQAiACAABwAjACEAIgAhACMABwAPACMAJAAiACMADwAkACMAJQAgACIAJAAlACIADwAmACQAJQAkACYAJwAmAA8ACgAnAA8ACgAOACcAKAAmACcAJQAmACgAKQAnAA4AKAAnACkADgAqACkAKgAoACkADgArACoADgAUACsAKgAsACgAKAAsACUAKgArACwAFAAeACsALQAlACwAKwAuACwALgAtACwAKwAeAC4ALwAlAC0ALwAtAC4AIAAlAC8AMAAuAB4AMAAvAC4AMAAgAC8AMAAeAB8AIAAwAB8A")],
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 97,
"vertex_data": PackedByteArray("XLY7PkQngr5SXX29KBv/PcSpV776xcy9rmwVPrrAhr6/g9u9bAG6PdrVkb5kiOa9GP5NPbTonL4eSJm9RNclPt12Tr7I4V+9FnA5Pje7hr6wR027/JAjPsKeV754OIU75e4PPhHOkb4TrA09caGKPTA0Z7wAnGW9qUeDPVz3gb5THhU92wWvPTLjnL6SRe88++REPad8ob7HDoS8KtHaPNGQhr5mLxK8WPMzvV+mjb2EvXM8fCErPX5nKr3sAos9ZLIYPah8v7ySCKG9ckIyvQiBdb0EJVK9AAb2vYDmV7zAJ069SCwavoB+WLzQuw++8HccvqCiMj0AbRK9IFdlvYCRcDyQbBW+gKFyPMBhfD3g/0i+YE05PeCHfD0gnNm9cPGkvSBVQT3gMjO+ANX6PGCmAT5gP8i9QMudvOD7FD4QPj2+oLwePfgNFT4AlFe82A89vgC3kD3Q+QO+LtyzPWDPZrxIsWU7kOYdvgDKkD3AHx+9IC4XvUCnFD4QFRy+EN2HPaAWFT5AM4w9LCfSPbaQFL2w4b48EKTNPeDMfD3AXmk9V2aePVAYv7zacyM9MNrWPQB/LT0weAQ+ePsFPkDzfD2wiRY+QEeKvIDwULzgpC4+gIJiu9xOdb38r4k94GsNvQA5VrzAzU8+oAiFvQDTVrygN+c9gF/MvQDlMj3g/Pc9MKcBvkDbkD3AKy89IH2MvaD/kD3Qj1s+AMpmPOCf3T2Q7T4+oGZwvZCvuD2wEj0+wC/GPSAgFT6QSyI+IE4xPVjAFD7gxK09OUOOPQbUbb6fyte9ZAPtPN78gb5Yioq9ZyCKPcC8FL0WYaW9yj6fPdABZ7wWQde84PppPaiuAT4Al568AG08PQC+tT2A3dK9AAk3PDCotT0Q9VK+AKegO+ABLT3ggiq+AAKKu3ibAT4Apk2+MAKLvYBCxjzQXSy+CF0CvLKlKr2CW6K9sHLEvVA5rj3Q4y2++GEwvgDNujugcBO+mCJAviB3Mj2QIQ6+ULcMvgApvDtAqSe9kGHvvYDkUrwwVgC+BCJSvUhquL0ERia9IC5dvaysjb36MHS82FMBvuDDMj2Axi49mB/0PXTEbb6eJys9prgKvRGgjb3W6jY9+CiEvERUuL2A9oE9QN6svQA8vjvAXu09gBFLvQCZvzvQNWA+YEg0PYCFcjyQjhk+wEBFPYBkxzywKzM+gJMsPWDuQT2gc0A+MA4JPvD0tT1gsSA+4MbKPTDftT3Aq1w9oEWrPfi2AT4A6HE9IJvyPdjBAT5wACY+ACLbPPCFrj2gwkU+AAqFvaAQMz3ghGU+sDiBPYjGFD4A5hI+wM/KvZDskD2Au/49AFQQO1Ae8T1Q/Cc+AIZWPOC2FD4A9JK7gAgpvIAW8T2QDgI+8MSgvTCjuD0gDwE+QJvevVCQuD2AVBY9gMpDvQD/8D0A9oM8yDgOvnB9uD3Ak1e9iIEivhBxuD3A0OO9YMnQvWBX3T0AnCC+EE3IvdDf8D3A/ga+cKmuvaDn8D0gIsK9QBaMvHitFD5AI8C9gP02PHAFFT5AGMK9")
}]
blend_shape_mode = 0
[sub_resource type="ArrayMesh" id="ArrayMesh_xqp54"]
resource_name = "Controll_Cube_007"
_surfaces = [{
"aabb": AABB(-0.187632, -0.315404, -0.206013, 0.370945, 0.461035, 0.430153),
"attribute_data": PackedByteArray("LBMUP0CXwzwdERQ/ABy8PB0RFD8AHLw8HREUPwAcvDz5ZBE/IEe8PNW4Dj9Acrw8LBMUP2CXwzw6FRQ/YBLLPDoVFD+AEss8/hEUP+BOvzw7KxM/oCq8PDsrEz+gKrw8f5MPP2BkvDx4uQ4/gPzDPHi5Dj+A/MM8iv4TP0AdvDw+7xM/IB68PD3vEz9AHrw8HBEUP0AcvDwsExQ/YJfDPFkUFD+A38c8PCsTP4AqvDy02g4/YHC8PNS4Dj9gcrw8ORUUP4ASyzw6FRQ/gBLLPDkVFD9gEss8GjoTPwAlyzwaOhM/ACXLPEnzEz9AFcs8SPMTP2AVyzzdLhM/ACbLPKpnET+ATMs83i4TP+AlyzxI8xM/YBXLPHagDz8gc8s8qmcRP4BMyzx4uQ4/YPzDPAzcDj/Ag8s8SfMTP0AVyzxI8xM/YBXLPA3cDj+gg8s8eKAPP+Byyzx2oA8/AHPLPA3cDj+gg8s8GroOP8CGyzy3zA4/IIXLPKpnET+ATMs8OhUUP2ASyzwaug4/oIbLPHi5Dj+A/MM8eLkOP4D8wzwaug4/gIbLPAzcDj/Ag8s8eLkOP2D8wzzVuA4/QHK8PH+TDz9gZLw81bgOP0ByvDy12g4/AHC8PLTaDj9gcLw8tdoOPwBwvDz5ZBE/IEe8PD7vEz8gHrw8+mQRPwBHvDw97xM/QB68PLXaDj8AcLw8tNoOP2BwvDwdERQ/ABy8PCwTFD9Al8M8OhUUP4ASyzw6FRQ/gBLLPCwTFD9Al8M8HREUP+AbvDwsExQ/IJfDPBo6Ez8AJcs83S4TPwAmyzw5FRQ/oBLLPDoVFD9gEss8OhUUP0ASyzw5FRQ/YBLLPB4RFD/gG7w8HhEUP+AbvDweERQ/wBu8PBwRFD8gHLw8OysTP6AqvDyrZxE/YEzLPBq6Dj/Ahss8qmcRP4BMyzz6ZBE/QEe8PB0RFD/gG7w8+WQRPyBHvDzUuA4/QHK8PPlkET8gR7w81bgOPyByvDzVuA4/QHK8PNS4Dj9Acrw81bgOPyByvDwbuQ4/oKu/PH+TDz9gZLw8t54PP8BjvDzVuA4/QHK8PNS4Dj+Acrw81bgOPyByvDzUuA4/YHK8PHe5Dj+g/MM8GroOP8CGyzwaug4/oIbLPBq6Dj+ghss8GroOP8CGyzwaug4/oIbLPNS5Dj+ATcg8GroOP8CGyzwaug4/4IbLPHagDz8Ac8s8eKAPP+ByyzwsExQ/YJfDPDorEz/AKrw8HhEUP+AbvDw97xM/QB68PA0tEz+AqMM8ORUUP4ASyzz5ZBE/IEe8PPlkET9AR7w8+WQRP0BHvDy2ng8/wGO8PLeeDz8AZLw8UmYRP+DJwzzeLhM/ACbLPKpnET+ATMs8mJ8PP0DrwzyqZxE/YEzLPAzcDj/Ag8s8qmcRP4BMyzwaug4/wIbLPHigDz/gcss8q2cRP4BMyzwaug4/oIbLPKtnET9ATMs8OhUUP2ASyzw6FRQ/QBLLPKlnET+ATMs8GroOP6CGyzyrZxE/QEzLPA3cDj+gg8s8qmcRP2BMyzx2oA8/AHPLPEnzEz9AFcs8qmcRP4BMyzw+7xM/IB68PB4RFD/AG7w8+WQRPyBHvDzUuA4/gHK8PNW4Dj8gcrw8+WQRP0BHvDweERQ/4Bu8PPlkET9AR7w8+WQRPyBHvDw7KxM/oCq8PDsrEz+gKrw8+WQRPyBHvDy3ng8/wGO8PA=="),
"format": 34359742487,
"index_count": 552,
"index_data": PackedByteArray("AAABAEMAAAAGAAEABwAGAEQABwBFAAYARgAGAEUABgBGABQARwABAAYABgAUAEcAAQBHAAkAAQAJAEgAFABJAEcASQAJAEcAGgAUAEYAGgBGAEoASwAaAEoASwAdABoAHQBMABoAFAAaAEwAHQBNAEwATABNAE4ATwAUAEwATABOAE8AFABPAEkAGABPAE4AGABOAB4ATwAYABMATwATAEkASQATAFAASQBQABIAEgBQABEAEgARAFEACQBJABIAEgBRAFIACQASAFMAEgBSAFMADwAJAFMAUgAPAFMADwBIAAkAUgAQAA8ASAAPAAoAEAAKAA8AEABUAAoALwAIADAALwBVAAgACAAcABkACAAgABwAIAAIAFUAVQArACAAVQBWACsAVgBVAC0AMQAtAFUAMQBVAFcAAgBYAAQAAgADAFgAWQBYAAMAWABZAAsAWAALAFoAWgBbAFgAXABYAFsAXABbAAUAWwBaAAwAWwAMAF0AXgANAA4AXgBfAA0AYAANAF8ADQBgAGEANwBhAGAANwBgAGIANwBiAGMANwBjADoAZAA3ADoAYQA3AGQAZAA6AGUAZABlAGYAOQBhAGQAZABmADkAZwA5AGYAZwBmADsAOQBnADYAOQA2AGgAYQA5AGgAaAA2AGkAYQBoADMADQBhADMAaABpADQANABpADUANAA1AGoANABqAGsAMwBsAA0AMgANAGwAMgBsAG0AbAAzAG4AaABuADMAbgBoADQAbABuAG8ANABrAHAAbgA0AHAAawAuAHAALgBuAHAALgBvAG4AawAsAC4AbwAuAHEALABxAC4ALAByAHEAcwB0AHUAdQB0ABUAdQAVAHYAcwB3AHQAeAB3AHMAeQAVAHQAdwB5AHQAegB2ABUAeQB6ABUAegB7AHYAfAB7AHoAfAAWAHsAfQB8AHoAfQAWAHwAfQB6AHkAfQAXABYAdwB+AHkAfgB9AHkAeAAhAHcAIQB+AHcAIQB4ACIAIQAiAH8AfwAiAIAAFwB9AIEAfgCBAH0AFwCBACUAfwCAAIIAIQB/AIIAggCAAIMAIQCEAH4AIQCCAIQAhACBAH4AggCDACMAhACCACMAhQAjAIMAhACGAIEAhAAjAIYAhQCGACMAJQCBAIYAJQCGAIUAhwApAIgAhwCJACkAigCJAIcAigAnAIkAhwCLAIoAiACMAIcAhwCMAIsAKACLAIwAiACNAIwAKACMACQAJACMAI0AJACNACYAjgAqAI8AjgCQACoAkQAqAJAAkgCQAI4AkQCQAJMAkgAfAJAAkwCQAB8AkwAfABsAPwCUAJUAPwCWAJQAlwCWAD8AlwBBAJYAPwCYAJcAlQCZAD8APwCZAJgAQgCYAJkAlQCaAJkAQgCZAJsAmwCZAJoAmwCaAEAAnACdAD4AnAA9AJ0AngCdAD0APAA9AJwAngA9AJ8APACgAD0AnwA9AKAAnwCgADgA"),
"lods": [0.047312, PackedByteArray("AAABAAIAAgADAAQABAADAAUAAAAGAAEABwAGAAAABwAIAAYACQABAAYAAQAJAAoACwAFAAMABQALAAwABQANAA4ADwAKAAkAEAAKAA8AEQAQAA8ACQASAA8AEgARAA8ACQATABIAEgATABEAFAATAAkABgAUAAkAEwAVABEAFQAWABEAFwAWABUAGAAVABMAFAAYABMABgAZABQAGQAGAAgAGgAUABkAFAAaABgAGgAZABsACAAcABkAHQAYABoAGAAdAB4AHwAdABoAHwAaABsACAAgABwAIAAfABsAGAAhABUAIQAYACIAIQAXABUAIQAiACMAIQAjABcAIgAkACMAJQAXACMAJQAjACYAIwAkACYAJAAnACYAKAAnACQAKQAmACcAJwAqACkAJwAfACoAIAAqAB8AKwAqACAALAAqACsALQArACAAIAAIAC0ALAArAC4ALwAIADAALwAtAAgAMQAtAC8AMgAtADEAMgANAC0ALQAzACsAMwAtAA0ALgArADMADQAFADMANAAsAC4AMwA0AC4ANAA1ACwANAA2ADUAMwA2ADQANwAzAAUANwAFADgAMwA5ADYAMwA3ADkAOQAXADYANwA4ADoAOQA3ADoAFwA5ADoAFwA6ADsACwA8ADgACwA9ADwAPAA9AD4APgA9AAsAPwA+AEAAQQA+AD8AQABBAD8AQgBBAEAA")],
"material": SubResource("StandardMaterial3D_xirvw"),
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 161,
"vertex_data": PackedByteArray("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")
}]
blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_lel7i")
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_6mmea"]
properties/0/path = NodePath(".:rotation")
properties/0/spawn = true
properties/0/replication_mode = 1
[node name="LeverPivot" type="Node3D"]
[node name="ButtonLogicImpulseLever" type="Timer" parent="." node_paths=PackedStringArray("interactBox")]
script = ExtResource("2_k0gfg")
interactBox = NodePath("../InteractBoxLever")
metadata/_custom_type_script = "uid://cjiiw7cybj24b"
[node name="InteractBoxLever" type="Area3D" parent="." node_paths=PackedStringArray("object")]
transform = Transform3D(0.951594, 0, -0.307357, 0, 1, 0, 0.307357, 0, 0.951595, -0.0501665, 0.260706, -0.0239434)
monitoring = false
script = ExtResource("1_6mmea")
object = NodePath("../ButtonLogicImpulseLever")
type = "minigame"
metadata/_custom_type_script = "uid://ymaax1x5fos3"
[node name="CollisionShape3D" type="CollisionShape3D" parent="InteractBoxLever"]
transform = Transform3D(0.954915, 0, 0.296857, 0, 1, 0, -0.296857, 0, 0.954917, 0.0749265, 0.0714111, 0.00196848)
shape = SubResource("BoxShape3D_opyex")
debug_color = Color(0.685703, 0.292897, 1, 0.42)
[node name="Lever" type="MeshInstance3D" parent="."]
transform = Transform3D(0.951594, 0, -0.307357, 0, 1, 0, 0.307357, 0, 0.951595, -0.0501665, 0.260706, -0.0239434)
mesh = SubResource("ArrayMesh_xqp54")
skeleton = NodePath("")
metadata/extras = {
"poliigon_props": {}
}
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."]
replication_config = SubResource("SceneReplicationConfig_6mmea")

View File

@@ -0,0 +1,9 @@
[gd_resource type="NoiseTexture2D" load_steps=2 format=3 uid="uid://bw51s1b3tsawp"]
[sub_resource type="FastNoiseLite" id="FastNoiseLite_qcrta"]
noise_type = 5
seed = 69
frequency = 0.1
[resource]
noise = SubResource("FastNoiseLite_qcrta")

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,19 @@
extends Area3D
class_name GrabBox
signal grabbedByPlayer
@export var obj: GrabableObject
@export var type: String #Used to signify the type of Object for other code interacting with the grab box
@export var heavy: bool = false
func _ready() -> void:
set_collision_layer_value(5,true) #Enables Grabing colision layer
set_collision_layer_value(1,false) #Disables Default collision layer
set_collision_mask_value(1,false)
func grab() -> GrabableObject:
if !obj: return
if !obj.isGrabbed:
grabbedByPlayer.emit()
return obj
return null

View File

@@ -0,0 +1 @@
uid://cmo8m6v4wlw2y

View File

@@ -0,0 +1,33 @@
extends RigidBody3D
class_name GrabableObject
@export var grabBox: GrabBox
var isGrabbed: bool = false
@export var grabPositionPositionOffset: Vector3
@export var grabPositionRotationOffset: Vector3
@export var putDownPositionOffset: Vector3
@export var throwingForce = 8.0 #How strong objects are thrown
func _ready() -> void:
grabBox = $GrabBox
grabBox.grabbedByPlayer.connect(grab.rpc.bind(multiplayer.get_unique_id()))
set_collision_layer_value(1,false) #Disables default collision layer
@rpc("any_peer", "call_local")
func grab(id):
isGrabbed = true
freeze = true
if not get_multiplayer_authority() == id:
set_multiplayer_authority(id)
@rpc("authority", "call_local")
func release():
isGrabbed = false
freeze = false
set_multiplayer_authority(1)
@rpc("any_peer","call_local")
func throw(facingDirectionX,facingDirectionY,cameraRotationX):
linear_velocity = Vector3(facingDirectionX,cameraRotationX/PI*2+0.3,facingDirectionY) * throwingForce

View File

@@ -0,0 +1 @@
uid://dkss4o54xymwj

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,54 @@
[gd_scene load_steps=8 format=3 uid="uid://wo0ikejk0hag"]
[ext_resource type="Script" uid="uid://dkss4o54xymwj" path="res://Maps/Spaceship/Objects/Grabable/GrabableObject.gd" id="1_jgf10"]
[ext_resource type="Script" uid="uid://cmo8m6v4wlw2y" path="res://Maps/Spaceship/Objects/Grabable/GrabBox.gd" id="2_yocvc"]
[sub_resource type="BoxShape3D" id="BoxShape3D_61j30"]
size = Vector3(0.5, 0.5, 0.5)
[sub_resource type="BoxShape3D" id="BoxShape3D_qey0m"]
size = Vector3(0.5, 0.5, 0.5)
[sub_resource type="BoxMesh" id="BoxMesh_4unh8"]
size = Vector3(0.5, 0.5, 0.5)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_utenr"]
albedo_color = Color(0.111197, 0.111197, 0.111197, 1)
metallic = 1.0
roughness = 0.3
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_yocvc"]
properties/0/path = NodePath(".:position")
properties/0/spawn = true
properties/0/replication_mode = 1
properties/1/path = NodePath(".:rotation")
properties/1/spawn = true
properties/1/replication_mode = 1
[node name="RepairCube" type="RigidBody3D" node_paths=PackedStringArray("grabBox")]
script = ExtResource("1_jgf10")
grabBox = NodePath("GrabBox")
throwingForce = 2.0
metadata/_custom_type_script = "uid://dkss4o54xymwj"
[node name="GrabBox" type="Area3D" parent="." node_paths=PackedStringArray("obj")]
script = ExtResource("2_yocvc")
obj = NodePath("..")
type = "RepairCube"
heavy = true
metadata/_custom_type_script = "uid://cmo8m6v4wlw2y"
[node name="GrabShape" type="CollisionShape3D" parent="GrabBox"]
shape = SubResource("BoxShape3D_61j30")
debug_fill = false
[node name="CollisionShape" type="CollisionShape3D" parent="."]
shape = SubResource("BoxShape3D_qey0m")
debug_fill = false
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
mesh = SubResource("BoxMesh_4unh8")
surface_material_override/0 = SubResource("StandardMaterial3D_utenr")
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."]
replication_config = SubResource("SceneReplicationConfig_yocvc")

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,21 @@
extends OmniLight3D
class_name FlickerOmniLight3D
@export var noise: NoiseTexture2D = load("res://Maps/Spaceship/Objects/FlickerOmniLightNoise.tres")
@export var strength: float = 1.0
var timePassed: float = 0
func _ready() -> void:
#self.light_color = Color(0.891, 1.0, 1.0)
#shadow_enabled = true
#Color(1.0, 0.75, 0.468) Orange
pass
func _process(delta: float) -> void:
timePassed += delta
if !noise: return
var sampledNoise = noise.noise.get_noise_1d(timePassed)
sampledNoise = abs(sampledNoise)
light_energy = clampf(sampledNoise*strength, 0.25,10)

View File

@@ -0,0 +1 @@
uid://b7ma88dd5c5tb

View File

@@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://xqwlggh57223"]
[ext_resource type="Script" uid="uid://datm6lpbjdmlp" path="res://Maps/Spaceship/Objects/no_object.gd" id="1_gfdui"]
[node name="NoObject" type="Node3D"]
script = ExtResource("1_gfdui")

View File

@@ -0,0 +1,4 @@
extends Node3D
func _ready() -> void:
self.queue_free()

View File

@@ -0,0 +1 @@
uid://datm6lpbjdmlp

View File

@@ -0,0 +1,46 @@
extends CharacterBody3D
class_name RepairCart
var pullingPlayer: PlayerCharacter
var pullingPlayerDirection: Vector3
var pullDirection: Vector3
var momentum: Vector3
const speed: float = 1.2
const decelerationMoving: float = 1
const turnSpeed: float = PI/2
func _physics_process(delta: float) -> void:
updatePullDirection()
if pullDirection.length() > 3:
momentum = clampVectorLength(momentum + clampVectorLength(pullDirection,0,1.5) * speed * delta,0,3)
if !is_on_floor():
momentum += get_gravity()
velocity = momentum
rotation.y = rotate_toward(rotation.y,atan2(velocity.x,velocity.z) - PI/2, turnSpeed*delta)
move_and_slide()
momentum -= clampVectorLength(momentum.normalized() * decelerationMoving * delta, 0, momentum.length())
func clampVectorLength(Vector: Vector3, minLength: float, maxLength: float) -> Vector3:
#scales Vector up/ down to the max/ min length givin. If the Vector has a length of 0 it will be returned without being scaled.
if Vector.length() == 0: return Vector
if Vector.length() < minLength:
return Vector * minLength / Vector.length()
elif Vector.length() > maxLength:
return Vector * maxLength / Vector.length()
return Vector
func updatePullDirection() -> void:
if pullingPlayer:
pullDirection = (pullingPlayer.position - position) * Vector3(1,0,1)
func _on_interact_box_interacted_with(playerRef: PlayerCharacter) -> void:
addPlayer.bind(playerRef.name).rpc()
@rpc("any_peer","reliable","call_local")
func addPlayer(playerRefName: StringName) -> void:
if get_node("/root/Main/Players/" + playerRefName) == pullingPlayer:
pullingPlayer = null
else:
pullingPlayer = get_node("/root/Main/Players/" + playerRefName)

View File

@@ -0,0 +1 @@
uid://c8q2qxofsorec

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,17 @@
extends Node3D
class_name BasicRoom
@export var SpaceshipLogicRef: ShipLogic = null
@export var Lights: Array[Light3D]
func _ready() -> void:
if !SpaceshipLogicRef: SpaceshipLogicRef = owner
if SpaceshipLogicRef: SpaceshipLogicRef.addRoomToRoomList(self)
func _process(_delta: float) -> void:
pass
func showLights(LightStatus: bool):
for light in Lights:
if light: light.visible = LightStatus

View File

@@ -0,0 +1 @@
uid://lmn08s8c5lfo

View File

@@ -0,0 +1,54 @@
extends BasicRoom
class_name ControlRoom
@onready var steeringMinigame = $Monitor/SubViewport/SteeringMinigame
@onready var lightswitch = $LightSwitch/ButtonLogicToggleLightswitch
@onready var switchPivot = $LightSwitch/SwitchPivot
@onready var light = $OmniLight3D
@export var controllStick: Node3D
@export var shipConditionDisplayNumber: int = 100
@onready var shipConditionNumberLabel = $Monitor_001/SubViewport2/Control/ShipConditionNumber
@onready var shipConditionNumberLabelSettings = shipConditionNumberLabel.label_settings
func _ready() -> void:
if controllStick:
controllStick.get_child(0).onPressed.connect(controllLeverPressed)
steeringMinigame.collision.connect(onAstroidCollision)
steeringMinigame.controllStick = controllStick
func _process(_delta: float) -> void:
if shipConditionNumberLabel.label_settings:
if shipConditionDisplayNumber >70:
shipConditionNumberLabelSettings.font_color = Color.GREEN
elif shipConditionDisplayNumber <=30:
shipConditionNumberLabelSettings.font_color = Color.RED
else:
shipConditionNumberLabelSettings.font_color = Color.YELLOW
if lightswitch.state:
switchPivot.rotation.x = deg_to_rad(0)
else:
switchPivot.rotation.x = deg_to_rad(17)
if SpaceshipLogicRef:
if SpaceshipLogicRef.power:
light.visible = lightswitch.state
else:
light.visible = SpaceshipLogicRef.power
else:
return
if !SpaceshipLogicRef.shipFuel:
steeringMinigame.active = false
shipConditionNumberLabel.text = str(shipConditionDisplayNumber) + "%"
func controllLeverPressed():
steeringMinigame.activate()
func onAstroidCollision():
if SpaceshipLogicRef:
SpaceshipLogicRef.collisionWithAstroid()

View File

@@ -0,0 +1 @@
uid://b6rr4vk4esf3s

View File

@@ -0,0 +1,6 @@
extends BasicRoom
class_name CorridorDeadEnd
var gridSlots: Array[Vector2] = [Vector2(0,0),Vector2(1,0)]
var doorSlots: Array[Vector3] = [Vector3(0,0,3)]
var scenePath = "res://SpaceshipRooms/Corridors/CorridorDeadEnd.tscn"

View File

@@ -0,0 +1 @@
uid://cww7fnikeau22

View File

@@ -0,0 +1,38 @@
extends BasicRoom
class_name CorridorDeadEndBreakable
@onready var wallShard: MeshInstance3D = $WallShard
var broken: bool = false
@onready var interactBox: InteractBox = $InteractBox
@onready var holeProximety = $Area3D
var repairCube: Area3D
var toolBox: bool = false
var interacted: bool = false
func updateWallVisibility(status: bool):
broken = !status
wallShard.visible = status
func _process(_delta: float) -> void:
repairCube = null
toolBox = false
var objectsProxy: Array[Area3D] = holeProximety.get_overlapping_areas()
for obj in objectsProxy:
if obj.type == "RepairCube":
repairCube = obj
if obj.type == "ToolBox":
toolBox = true
if repairCube and toolBox and interacted:
updateWallVisibility(true)
interacted = false
repairCube.get_parent().queue_free()
SpaceshipLogicRef.hullBreached = false
func _on_interact_box_interacted_with(_playerRef: PlayerCharacter) -> void:
interacted = true
#Needs to be replaced with a repair minigame/ progress bar later

View File

@@ -0,0 +1 @@
uid://or6760ji86d2

View File

@@ -0,0 +1,6 @@
extends BasicRoom
class_name CorridorFourWay
var gridSlots: Array[Vector2] = [Vector2(0,0),Vector2(1,0),Vector2(1,1),Vector2(1,-1),Vector2(2,0)]
var doorSlots: Array[Vector3] = [Vector3(0,0,3),Vector3(2,0,1),Vector3(1,-1,4),Vector3(1,1,2)]
var scenePath = "res://SpaceshipRooms/Corridors/CorridorLong.tscn"

View File

@@ -0,0 +1 @@
uid://pht6y700mip7

View File

@@ -0,0 +1,6 @@
extends BasicRoom
class_name CorridorLTurn
var gridSlots: Array[Vector2] = [Vector2(0,0),Vector2(1,0),Vector2(1,-1)]
var doorSlots: Array[Vector3] = [Vector3(0,0,3),Vector3(1,-1,4)]
var scenePath = "res://SpaceshipRooms/Corridors/CorridorLTurn.tscn"

View File

@@ -0,0 +1 @@
uid://77bdmv1wl21

View File

@@ -0,0 +1,6 @@
extends BasicRoom
class_name CorridorLong
var gridSlots: Array[Vector2] = [Vector2(0,0),Vector2(1,0),Vector2(2,0)]
var doorSlots: Array[Vector3] = [Vector3(0,0,3),Vector3(2,0,1)]
var scenePath = "res://SpaceshipRooms/Corridors/CorridorLong.tscn"

View File

@@ -0,0 +1 @@
uid://dq1ol2epo2186

View File

@@ -0,0 +1,6 @@
extends BasicRoom
class_name CorridorShort
var gridSlots: Array[Vector2] = [Vector2(0,0),Vector2(1,0)]
var doorSlots: Array[Vector3] = [Vector3(0,0,3),Vector3(1,0,1)]
var scenePath = "res://SpaceshipRooms/Corridors/CorridorShort.tscn"

View File

@@ -0,0 +1 @@
uid://b808bc8l22smt

View File

@@ -0,0 +1,6 @@
extends BasicRoom
class_name CorridorTTurn
var gridSlots: Array[Vector2] = [Vector2(0,0),Vector2(1,0),Vector2(1,1),Vector2(1,-1)]
var doorSlots: Array[Vector3] = [Vector3(0,0,3),Vector3(1,1,2),Vector3(1,-1,4)]
var scenePath = "res://SpaceshipRooms/Corridors/CorridorTTurn.tscn"

View File

@@ -0,0 +1 @@
uid://dod3myner76oy

View File

@@ -0,0 +1,50 @@
extends BasicRoom
class_name FuelTank
@onready var elevatorButtonTop: ButtonLogicImpulse = $ButtonBase/ButtonLogicImpulse
@onready var elevatorButtonBottom: ButtonLogicImpulse = $ButtonBase_001/ButtonLogicImpulse01
@onready var elevator: MeshInstance3D = $ElevatorPlattform # y Pos 6.7 is top; -0.2 is Bottom
var fuel: float = 100.0
var fuelDrainRate: float = 0.3
var canisterFillRate: float = 8.3
@onready var fuelMesh: MeshInstance3D = $Fuel
@onready var fuelInputArea = $FuelInput/FuelInputArea
var fuelCannistersInArea: Array[GrabBox]
var elevatorDestination: bool = true #True is Up, False is Down
var elevatorSpeed: float = 2 #Units/seccond
func _ready() -> void:
elevatorButtonTop.onPressed.connect(elevatorButtonPressed)
elevatorButtonBottom.onPressed.connect(elevatorButtonPressed)
func _process(delta: float) -> void:
if elevatorDestination:
elevator.position.y = clamp(elevator.position.y + elevatorSpeed*delta,-0.2,6.7)
else:
elevator.position.y = clamp(elevator.position.y - elevatorSpeed*delta,-0.2,6.7)
fuelCannistersInArea = getFuelCanisters(fuelInputArea)
fuel = clamp(fuel - fuelDrainRate*delta,0,100)
fuel = clamp(fuel + canisterFillRate*fuelCannistersInArea.size()*delta,0,100)
fuelMesh.scale.y = fuel/100
if SpaceshipLogicRef:
SpaceshipLogicRef.shipFuel = fuel
func elevatorButtonPressed():
elevatorDestination = !elevatorDestination
func getFuelCanisters(Area: Area3D) -> Array[GrabBox]:
var overlappingAreas: Array[Area3D] = Area.get_overlapping_areas()
var returnArray: Array[GrabBox]
for a in overlappingAreas:
if typeof(a == GrabBox):
if a.type == "FuelCanister":
returnArray.push_back(a)
return returnArray

View File

@@ -0,0 +1 @@
uid://bxnqx1moj7bb3

View File

@@ -0,0 +1,53 @@
extends BasicRoom
class_name Generator
@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 _process(_delta: float) -> void:
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:
SpaceshipLogicRef.power = false
SpaceshipLogicRef.updateLights()
else:
SpaceshipLogicRef.power = true
SpaceshipLogicRef.updateLights()
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

View File

@@ -0,0 +1 @@
uid://6loaamrfhwdc

View File

@@ -0,0 +1,2 @@
extends BasicRoom
class_name Starter

View File

@@ -0,0 +1 @@
uid://enftc34b0t86

View File

@@ -0,0 +1,2 @@
extends BasicRoom
class_name Storage

View File

@@ -0,0 +1 @@
uid://cjo45t3oyu42p

Some files were not shown because too many files have changed in this diff Show More