Initial commit
This commit is contained in:
125
Maps/Lobby/Lobby.tscn
Normal file
125
Maps/Lobby/Lobby.tscn
Normal 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
16
Maps/Lobby/lobby.gd
Normal 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
1
Maps/Lobby/lobby.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://fvwy57of2gvq
|
||||
22
Maps/MapGenerator/Biome.gd
Normal file
22
Maps/MapGenerator/Biome.gd
Normal 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
|
||||
1
Maps/MapGenerator/Biome.gd.uid
Normal file
1
Maps/MapGenerator/Biome.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://yjvmb1ivvxb0
|
||||
9
Maps/MapGenerator/BiomeExit.gd
Normal file
9
Maps/MapGenerator/BiomeExit.gd
Normal 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
|
||||
1
Maps/MapGenerator/BiomeExit.gd.uid
Normal file
1
Maps/MapGenerator/BiomeExit.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cptl6phh2t8tl
|
||||
BIN
Maps/MapGenerator/BiomeExitChecker.png
Normal file
BIN
Maps/MapGenerator/BiomeExitChecker.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 349 B |
40
Maps/MapGenerator/BiomeExitChecker.png.import
Normal file
40
Maps/MapGenerator/BiomeExitChecker.png.import
Normal 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
|
||||
19
Maps/MapGenerator/LevelGenDoor.gd
Normal file
19
Maps/MapGenerator/LevelGenDoor.gd
Normal 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
|
||||
1
Maps/MapGenerator/LevelGenDoor.gd.uid
Normal file
1
Maps/MapGenerator/LevelGenDoor.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://b5mjpi1nhmn4s
|
||||
5
Maps/MapGenerator/MissionTypes/Mission.gd
Normal file
5
Maps/MapGenerator/MissionTypes/Mission.gd
Normal 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
|
||||
1
Maps/MapGenerator/MissionTypes/Mission.gd.uid
Normal file
1
Maps/MapGenerator/MissionTypes/Mission.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dyirs8de8f0k3
|
||||
39
Maps/MapGenerator/MissionTypes/RescueMission.gd
Normal file
39
Maps/MapGenerator/MissionTypes/RescueMission.gd
Normal 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)
|
||||
1
Maps/MapGenerator/MissionTypes/RescueMission.gd.uid
Normal file
1
Maps/MapGenerator/MissionTypes/RescueMission.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dl7tb27ncsmxe
|
||||
34
Maps/MapGenerator/RoomData.gd
Normal file
34
Maps/MapGenerator/RoomData.gd
Normal 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
|
||||
1
Maps/MapGenerator/RoomData.gd.uid
Normal file
1
Maps/MapGenerator/RoomData.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://28gkh48f7sib
|
||||
14
Maps/MapGenerator/RoomList.gd
Normal file
14
Maps/MapGenerator/RoomList.gd
Normal 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
|
||||
1
Maps/MapGenerator/RoomList.gd.uid
Normal file
1
Maps/MapGenerator/RoomList.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bkvffyhw5vnxv
|
||||
6
Maps/MapGenerator/RoomLists/RoomListSpaceship.gd
Normal file
6
Maps/MapGenerator/RoomLists/RoomListSpaceship.gd
Normal 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")
|
||||
1
Maps/MapGenerator/RoomLists/RoomListSpaceship.gd.uid
Normal file
1
Maps/MapGenerator/RoomLists/RoomListSpaceship.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cpnvaegn20rby
|
||||
20
Maps/MapGenerator/gridCell.gd
Normal file
20
Maps/MapGenerator/gridCell.gd
Normal 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
|
||||
1
Maps/MapGenerator/gridCell.gd.uid
Normal file
1
Maps/MapGenerator/gridCell.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://105kn4rcg8bd
|
||||
589
Maps/MapGenerator/levelGenerator.gd
Normal file
589
Maps/MapGenerator/levelGenerator.gd
Normal 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)
|
||||
1
Maps/MapGenerator/levelGenerator.gd.uid
Normal file
1
Maps/MapGenerator/levelGenerator.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cq0sxwn7k47n6
|
||||
56
Maps/MapGenerator/roomImageLoader.gd
Normal file
56
Maps/MapGenerator/roomImageLoader.gd
Normal 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
|
||||
1
Maps/MapGenerator/roomImageLoader.gd.uid
Normal file
1
Maps/MapGenerator/roomImageLoader.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://saart6lt7yni
|
||||
47
Maps/Rooms/Generic Connectors/4Way/4WayRoom.tscn
Normal file
47
Maps/Rooms/Generic Connectors/4Way/4WayRoom.tscn
Normal 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)
|
||||
BIN
Maps/Rooms/Generic Connectors/4Way/4WayRoomData.png
Normal file
BIN
Maps/Rooms/Generic Connectors/4Way/4WayRoomData.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 395 B |
40
Maps/Rooms/Generic Connectors/4Way/4WayRoomData.png.import
Normal file
40
Maps/Rooms/Generic Connectors/4Way/4WayRoomData.png.import
Normal 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
|
||||
50
Maps/Rooms/Generic Connectors/Corner/CornerRoom.tscn
Normal file
50
Maps/Rooms/Generic Connectors/Corner/CornerRoom.tscn
Normal 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)
|
||||
BIN
Maps/Rooms/Generic Connectors/Corner/CornerRoomData.png
Normal file
BIN
Maps/Rooms/Generic Connectors/Corner/CornerRoomData.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 388 B |
@@ -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
|
||||
37
Maps/Rooms/Generic Connectors/Hallway/Hallway.tscn
Normal file
37
Maps/Rooms/Generic Connectors/Hallway/Hallway.tscn
Normal 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)
|
||||
BIN
Maps/Rooms/Generic Connectors/Hallway/HallwayRoomData.png
Normal file
BIN
Maps/Rooms/Generic Connectors/Hallway/HallwayRoomData.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 377 B |
@@ -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
|
||||
69
Maps/Rooms/Generic Connectors/THallway/THallway.tscn
Normal file
69
Maps/Rooms/Generic Connectors/THallway/THallway.tscn
Normal 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)
|
||||
BIN
Maps/Rooms/Generic Connectors/THallway/THallwayRoomData.png
Normal file
BIN
Maps/Rooms/Generic Connectors/THallway/THallwayRoomData.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 396 B |
@@ -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
|
||||
BIN
Maps/Rooms/Starter/Hanger/HangerRoomData.png
Normal file
BIN
Maps/Rooms/Starter/Hanger/HangerRoomData.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 399 B |
40
Maps/Rooms/Starter/Hanger/HangerRoomData.png.import
Normal file
40
Maps/Rooms/Starter/Hanger/HangerRoomData.png.import
Normal 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
|
||||
64
Maps/Spaceship/Corridors/CorridorDeadEnd.tscn
Normal file
64
Maps/Spaceship/Corridors/CorridorDeadEnd.tscn
Normal 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"
|
||||
64
Maps/Spaceship/Corridors/CorridorFourWay.tscn
Normal file
64
Maps/Spaceship/Corridors/CorridorFourWay.tscn
Normal file
File diff suppressed because one or more lines are too long
65
Maps/Spaceship/Corridors/CorridorLTurn.tscn
Normal file
65
Maps/Spaceship/Corridors/CorridorLTurn.tscn
Normal file
File diff suppressed because one or more lines are too long
63
Maps/Spaceship/Corridors/CorridorLong.tscn
Normal file
63
Maps/Spaceship/Corridors/CorridorLong.tscn
Normal file
File diff suppressed because one or more lines are too long
63
Maps/Spaceship/Corridors/CorridorShort.tscn
Normal file
63
Maps/Spaceship/Corridors/CorridorShort.tscn
Normal file
File diff suppressed because one or more lines are too long
65
Maps/Spaceship/Corridors/CorridorTTurn.tscn
Normal file
65
Maps/Spaceship/Corridors/CorridorTTurn.tscn
Normal file
File diff suppressed because one or more lines are too long
129
Maps/Spaceship/Corridors/corridor_dead_end_breakable.tscn
Normal file
129
Maps/Spaceship/Corridors/corridor_dead_end_breakable.tscn
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
||||
extends Node3D
|
||||
class_name BasicMinigame
|
||||
@@ -0,0 +1 @@
|
||||
uid://clqxlalxpuvb0
|
||||
789
Maps/Spaceship/Minigames/Basic Minigames/PanelMinigame.tscn
Normal file
789
Maps/Spaceship/Minigames/Basic Minigames/PanelMinigame.tscn
Normal file
File diff suppressed because one or more lines are too long
6
Maps/Spaceship/Minigames/RandomMinigameSpawner.tscn
Normal file
6
Maps/Spaceship/Minigames/RandomMinigameSpawner.tscn
Normal 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")
|
||||
150
Maps/Spaceship/Misc/BasicDoor.tscn
Normal file
150
Maps/Spaceship/Misc/BasicDoor.tscn
Normal file
File diff suppressed because one or more lines are too long
20
Maps/Spaceship/Misc/basic_door.gd
Normal file
20
Maps/Spaceship/Misc/basic_door.gd
Normal 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)
|
||||
1
Maps/Spaceship/Misc/basic_door.gd.uid
Normal file
1
Maps/Spaceship/Misc/basic_door.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dacge6grun0em
|
||||
77
Maps/Spaceship/Objects/ControllLever.tscn
Normal file
77
Maps/Spaceship/Objects/ControllLever.tscn
Normal 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("XLY7PkQngr5SXX29KBv/PcSpV776xcy9rmwVPrrAhr6/g9u9KBv/PcSpV776xcy9bAG6PdrVkb5kiOa9GP5NPbTonL4eSJm9RNclPt12Tr7I4V+9FnA5Pje7hr6wR027/JAjPsKeV754OIU7caGKPTA0Z7wAnGW9ZLIYPah8v7ySCKG9ZLIYPah8v7ySCKG9ckIyvQiBdb0EJVK9KtHaPNGQhr5mLxK8++REPad8ob7HDoS8YE05PeCHfD0gnNm9gKFyPMBhfD3g/0i+QMudvOD7FD4QPj2+ANX6PGCmAT5gP8i9oLwePfgNFT4AlFe8LtyzPWDPZrxIsWU7IC4XvUCnFD4QFRy+2A89vgC3kD3Q+QO+kOYdvgDKkD3AHx+9EN2HPaAWFT5AM4w9LCfSPbaQFL2w4b48EKTNPeDMfD3AXmk9V2aePVAYv7zacyM9V2aePVAYv7zacyM9ePsFPkDzfD2wiRY+wC/GPSAgFT6QSyI+MNrWPQB/LT0weAQ+fCErPX5nKr3sAos9IE4xPVjAFD7gxK09wC/GPSAgFT6QSyI+oGZwvZCvuD2wEj0+AMpmPOCf3T2Q7T4+MKcBvkDbkD3AKy89IH2MvaD/kD3Qj1s+ePsFPkDzfD2wiRY+wC/GPSAgFT6QSyI+4GsNvQA5VrzAzU8+QEeKvIDwULzgpC4+gIJiu9xOdb38r4k94GsNvQA5VrzAzU8+qUeDPVz3gb5THhU9oAiFvQDTVrygN+c95e4PPhHOkb4TrA09FnA5Pje7hr6wR0272wWvPTLjnL6SRe88++REPad8ob7HDoS8WPMzvV+mjb2EvXM8gF/MvQDlMj3g/Pc9IH2MvaD/kD3Qj1s+MKcBvkDbkD3AKy89AAb2vYDmV7zAJ069ckIyvQiBdb0EJVK98HccvqCiMj0AbRK9SCwavoB+WLzQuw++2A89vgC3kD3Q+QO+SCwavoB+WLzQuw++IFdlvYCRcDyQbBW+gKFyPMBhfD3g/0i+cPGkvSBVQT3gMjO+QMudvOD7FD4QPj2+SCwavoB+WLzQuw++2A89vgC3kD3Q+QO+rmwVPrrAhr6/g9u9XLY7PkQngr5SXX29/JAjPsKeV754OIU7LCfSPbaQFL2w4b48yj6fPdABZ7wWQde8ZyCKPcC8FL0WYaW94PppPaiuAT4Al568V2aePVAYv7zacyM9MNrWPQB/LT0weAQ+4MbKPTDftT3Aq1w9MA4JPvD0tT1gsSA+IJvyPdjBAT5wACY+oEWrPfi2AT4A6HE9gP02PHAFFT5AGMK9AAKKu3ibAT4Apk2+AAk3PDCotT0Q9VK+AG08PQC+tT2A3dK9AKegO+ABLT3ggiq+mB/0PXTEbb6eJys9+CiEvERUuL2A9oE95e4PPhHOkb4TrA09OUOOPQbUbb6fyte9ZyCKPcC8FL0WYaW9CF0CvLKlKr2CW6K9ZAPtPN78gb5Yioq9bAG6PdrVkb5kiOa9BCJSvUhquL0ERia9GP5NPbTonL4eSJm9ZAPtPN78gb5Yioq9BCJSvUhquL0ERia9IC5dvaysjb36MHS8ckIyvQiBdb0EJVK9kGHvvYDkUrwwVgC+ULcMvgApvDtAqSe9+GEwvgDNujugcBO+mCJAviB3Mj2QIQ6+kOYdvgDKkD3AHx+92FMBvuDDMj2Axi49wM/KvZDskD2Au/49AAqFvaAQMz3ghGU+gBFLvQCZvzvQNWA+qUeDPVz3gb5THhU92wWvPTLjnL6SRe88prgKvRGgjb3W6jY9+CiEvERUuL2A9oE9QN6svQA8vjvAXu09gIJiu9xOdb38r4k9QEeKvIDwULzgpC4+oLwePfgNFT4AlFe8QBaMvHitFD5AI8C9gP02PHAFFT5AGMK9QMudvOD7FD4QPj2+AIZWPOC2FD4A9JK7EN2HPaAWFT5AM4w9cKmuvaDn8D0gIsK9EE3IvdDf8D3A/ga+YMnQvWBX3T0AnCC+iIEivhBxuD3A0OO9yDgOvnB9uD3Ak1e9gMpDvQD/8D0A9oM8sDiBPYjGFD4A5hI+AMpmPOCf3T2Q7T4+QJvevVCQuD2AVBY9AFQQO1Ae8T1Q/Cc+IH2MvaD/kD3Qj1s+gAgpvIAW8T2QDgI+wM/KvZDskD2Au/498MSgvTCjuD0gDwE+gJMsPWDuQT2gc0A+gBFLvQCZvzvQNWA+wEBFPYBkxzywKzM+MA4JPvD0tT1gsSA+IJvyPdjBAT5wACY+ACLbPPCFrj2gwkU+AAqFvaAQMz3ghGU+wEBFPYBkxzywKzM+4GsNvQA5VrzAzU8+YEg0PYCFcjyQjhk+gIJiu9xOdb38r4k9ePsFPkDzfD2wiRY+fCErPX5nKr3sAos9gKFyPMBhfD3g/0i+AAk3PDCotT0Q9VK+MAKLvYBCxjzQXSy++GEwvgDNujugcBO+mCJAviB3Mj2QIQ6+sHLEvVA5rj3Q4y2+AAKKu3ibAT4Apk2+YMnQvWBX3T0AnCC+MAKLvYBCxjzQXSy+AKegO+ABLT3ggiq+ZLIYPah8v7ySCKG9CF0CvLKlKr2CW6K9kGHvvYDkUrwwVgC+SOQNzAqt2JC/42bHmawIkJ/v7PuFXpDpuvDO/W2oi3Gf7+z7hV6Q6YkMMDQMrSZvMuAcuGKsmZDg1buhCq3YkJezgYu2p2uP5e+FuA2Y+Ixv9AVAW7TJRNfxsv8vX1rqQQy3MVOyh23sOBtf0F0k6bwh4FX///+/4fTER02m6yxF9jtVnKBXRMfGHMsXuUFWJNZSvtcvJRXHxhzLk8jAmgbtM6CMpWGHH14c5OwNrXETSeTJTxH6dO5JrrfVAhxvx8Ycy7yzj64Ds4CK////PzvyuGhdrNQD1KlpSQqSeCcDs4CKu6cvj9/1Y1uxAeDxx8Ycy8sNAxSqp0dA99xvgHGg2X4+qJOOvmvu5ILYF8hRdEDcEaCvtyJce8NLCf8Ss42MnyxGnRLuSa63g8U+5LWNjJ/RTUoMuKIvZPaqO4KzjYyfoT8IGLiiL2S0ZL0hFaQlPgjeuIG6gKFvrq46kcNSQEBFC66LVH6Ib5RephbxWx9D3hDtbS+0iIw/reOQL7SIjGRebRbte59vdl50Fg1MSWQKrSZvXT7VVzO2umvZL1tpe3EL6kEhxH4/iuYVQSHEfqyF3nYbRrA2yiUS6Zq7AQUwIZznWjLBaWmeg2DUTvs9RJ/NQkEhxH4Smu7L4rlcErWWE1E8vVwOkJcMVOK5XBL9q3VLuxB1FqFT2ezQG0bdS2N/3Y0fsw3fPlbn0BtG3XR9i+tI5A3M////v+DVu6EKrdiQn9tupIeskpDC57uaS6i/df7nR7IaZk4RSu2lwFNnMg8P2rG82LR/kgftxnBhhWwkt97MUJEJYYr079Sr4YIaG63rhq+DnRZWsdS1wMKoQ1DP1mrABZ4mPcfGHMtWqvlIsdS1wG8uLRat64avHW/lEQ3wv6zCd8oRYuKmQP///79koG9/n16eFrqAoW+urjqR7Xufby6t7ZCkAPgf36z7btfxsv8vX1rqOwGdH8muCm5lDO0yPK6ubokMMDRsXprpQQy3MdCyam28IeBVC60mb4ElWlpFXpjoWC9VT/tTuuSEOLxOXVG14nM/fDPWMiLj4FgnJfQXpuT4QhRRz64gqbZAsVT8rI+nhy+saw+f/bVBIcR+y5HsXSM0gWXwodpvQSHEfuGSXCaHL6xr3Z+IwLZAsVQbCbGMEUjFYrCt4m4NTElkCq0mbxZLb1WrVzHh0E3bWf///z+oQ1ZRFjc2GWphNEV1z2KNW2aILxvkC4eFfhH+vP5pzr5r7uTVxEPFhX4R/ofbd8ANXCPovBFDc75r7uRZ7bHVhX4R/lPxosBMXvHSRADZD+tSkdgdl3zIiUW02TEd+37GTmHM3ZdAxn1TecTMoEjATF7x0h7gP91RbrbZZKCquaNtHMZ1IPUMfVN5xFTS8d9PZj7MNaJYuHlbxL6LDaoSTF7x0jAA7g/uSa63nbWW1H1TecSIt/DMraFscMyz3IyEoUFy////P7iiL2T2qjuChKFBck+zhI2vl6WO7qeclXWWu5AzUkgUsZekjgBddQ1JpnY6bx+RhkmmdjpJllsvvaXRQAEnkIKRoAdET9JQgUmmdjp2Ha+BPKW+RmwvGIKNH7MNj5y0ZaUOsBdrVYvsjR+zDd8+VuelDrAXMqn7ab4Net4lcbTtkg9R3jdoQee+DXrejWFH5NAbRt1LY3/d4rlcEv2rdUsrvikRSKyRTVbFKA////+/psBFCv///7+AupkNMpcvUw==")
|
||||
}]
|
||||
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")
|
||||
9
Maps/Spaceship/Objects/FlickerOmniLightNoise.tres
Normal file
9
Maps/Spaceship/Objects/FlickerOmniLightNoise.tres
Normal 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")
|
||||
127
Maps/Spaceship/Objects/Grabable/FuelCanister.tscn
Normal file
127
Maps/Spaceship/Objects/Grabable/FuelCanister.tscn
Normal file
File diff suppressed because one or more lines are too long
19
Maps/Spaceship/Objects/Grabable/GrabBox.gd
Normal file
19
Maps/Spaceship/Objects/Grabable/GrabBox.gd
Normal 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
|
||||
1
Maps/Spaceship/Objects/Grabable/GrabBox.gd.uid
Normal file
1
Maps/Spaceship/Objects/Grabable/GrabBox.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cmo8m6v4wlw2y
|
||||
33
Maps/Spaceship/Objects/Grabable/GrabableObject.gd
Normal file
33
Maps/Spaceship/Objects/Grabable/GrabableObject.gd
Normal 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
|
||||
1
Maps/Spaceship/Objects/Grabable/GrabableObject.gd.uid
Normal file
1
Maps/Spaceship/Objects/Grabable/GrabableObject.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dkss4o54xymwj
|
||||
127
Maps/Spaceship/Objects/Grabable/PowerCell.tscn
Normal file
127
Maps/Spaceship/Objects/Grabable/PowerCell.tscn
Normal file
File diff suppressed because one or more lines are too long
54
Maps/Spaceship/Objects/Grabable/RepairCube.tscn
Normal file
54
Maps/Spaceship/Objects/Grabable/RepairCube.tscn
Normal 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")
|
||||
1322
Maps/Spaceship/Objects/Grabable/boombox_1.tscn
Normal file
1322
Maps/Spaceship/Objects/Grabable/boombox_1.tscn
Normal file
File diff suppressed because one or more lines are too long
186
Maps/Spaceship/Objects/Grabable/toolbox.tscn
Normal file
186
Maps/Spaceship/Objects/Grabable/toolbox.tscn
Normal file
File diff suppressed because one or more lines are too long
21
Maps/Spaceship/Objects/flicker_omni_light_3d.gd
Normal file
21
Maps/Spaceship/Objects/flicker_omni_light_3d.gd
Normal 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)
|
||||
1
Maps/Spaceship/Objects/flicker_omni_light_3d.gd.uid
Normal file
1
Maps/Spaceship/Objects/flicker_omni_light_3d.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://b7ma88dd5c5tb
|
||||
6
Maps/Spaceship/Objects/noObject.tscn
Normal file
6
Maps/Spaceship/Objects/noObject.tscn
Normal 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")
|
||||
4
Maps/Spaceship/Objects/no_object.gd
Normal file
4
Maps/Spaceship/Objects/no_object.gd
Normal file
@@ -0,0 +1,4 @@
|
||||
extends Node3D
|
||||
|
||||
func _ready() -> void:
|
||||
self.queue_free()
|
||||
1
Maps/Spaceship/Objects/no_object.gd.uid
Normal file
1
Maps/Spaceship/Objects/no_object.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://datm6lpbjdmlp
|
||||
46
Maps/Spaceship/Objects/repair_cart.gd
Normal file
46
Maps/Spaceship/Objects/repair_cart.gd
Normal 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)
|
||||
1
Maps/Spaceship/Objects/repair_cart.gd.uid
Normal file
1
Maps/Spaceship/Objects/repair_cart.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://c8q2qxofsorec
|
||||
623
Maps/Spaceship/Objects/repair_cart.tscn
Normal file
623
Maps/Spaceship/Objects/repair_cart.tscn
Normal file
File diff suppressed because one or more lines are too long
17
Maps/Spaceship/RoomScripts/BasicRoom.gd
Normal file
17
Maps/Spaceship/RoomScripts/BasicRoom.gd
Normal 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
|
||||
1
Maps/Spaceship/RoomScripts/BasicRoom.gd.uid
Normal file
1
Maps/Spaceship/RoomScripts/BasicRoom.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://lmn08s8c5lfo
|
||||
54
Maps/Spaceship/RoomScripts/controll.gd
Normal file
54
Maps/Spaceship/RoomScripts/controll.gd
Normal 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()
|
||||
1
Maps/Spaceship/RoomScripts/controll.gd.uid
Normal file
1
Maps/Spaceship/RoomScripts/controll.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://b6rr4vk4esf3s
|
||||
6
Maps/Spaceship/RoomScripts/corridor_dead_end.gd
Normal file
6
Maps/Spaceship/RoomScripts/corridor_dead_end.gd
Normal 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"
|
||||
1
Maps/Spaceship/RoomScripts/corridor_dead_end.gd.uid
Normal file
1
Maps/Spaceship/RoomScripts/corridor_dead_end.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cww7fnikeau22
|
||||
38
Maps/Spaceship/RoomScripts/corridor_dead_end_breakable.gd
Normal file
38
Maps/Spaceship/RoomScripts/corridor_dead_end_breakable.gd
Normal 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
|
||||
@@ -0,0 +1 @@
|
||||
uid://or6760ji86d2
|
||||
6
Maps/Spaceship/RoomScripts/corridor_four_way.gd
Normal file
6
Maps/Spaceship/RoomScripts/corridor_four_way.gd
Normal 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"
|
||||
1
Maps/Spaceship/RoomScripts/corridor_four_way.gd.uid
Normal file
1
Maps/Spaceship/RoomScripts/corridor_four_way.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://pht6y700mip7
|
||||
6
Maps/Spaceship/RoomScripts/corridor_l_turn.gd
Normal file
6
Maps/Spaceship/RoomScripts/corridor_l_turn.gd
Normal 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"
|
||||
1
Maps/Spaceship/RoomScripts/corridor_l_turn.gd.uid
Normal file
1
Maps/Spaceship/RoomScripts/corridor_l_turn.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://77bdmv1wl21
|
||||
6
Maps/Spaceship/RoomScripts/corridor_long.gd
Normal file
6
Maps/Spaceship/RoomScripts/corridor_long.gd
Normal 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"
|
||||
1
Maps/Spaceship/RoomScripts/corridor_long.gd.uid
Normal file
1
Maps/Spaceship/RoomScripts/corridor_long.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dq1ol2epo2186
|
||||
6
Maps/Spaceship/RoomScripts/corridor_short.gd
Normal file
6
Maps/Spaceship/RoomScripts/corridor_short.gd
Normal 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"
|
||||
1
Maps/Spaceship/RoomScripts/corridor_short.gd.uid
Normal file
1
Maps/Spaceship/RoomScripts/corridor_short.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://b808bc8l22smt
|
||||
6
Maps/Spaceship/RoomScripts/corridor_t_turn.gd
Normal file
6
Maps/Spaceship/RoomScripts/corridor_t_turn.gd
Normal 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"
|
||||
1
Maps/Spaceship/RoomScripts/corridor_t_turn.gd.uid
Normal file
1
Maps/Spaceship/RoomScripts/corridor_t_turn.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dod3myner76oy
|
||||
50
Maps/Spaceship/RoomScripts/fuel_tank.gd
Normal file
50
Maps/Spaceship/RoomScripts/fuel_tank.gd
Normal 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
|
||||
1
Maps/Spaceship/RoomScripts/fuel_tank.gd.uid
Normal file
1
Maps/Spaceship/RoomScripts/fuel_tank.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bxnqx1moj7bb3
|
||||
53
Maps/Spaceship/RoomScripts/generator.gd
Normal file
53
Maps/Spaceship/RoomScripts/generator.gd
Normal 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
|
||||
1
Maps/Spaceship/RoomScripts/generator.gd.uid
Normal file
1
Maps/Spaceship/RoomScripts/generator.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://6loaamrfhwdc
|
||||
2
Maps/Spaceship/RoomScripts/starter.gd
Normal file
2
Maps/Spaceship/RoomScripts/starter.gd
Normal file
@@ -0,0 +1,2 @@
|
||||
extends BasicRoom
|
||||
class_name Starter
|
||||
1
Maps/Spaceship/RoomScripts/starter.gd.uid
Normal file
1
Maps/Spaceship/RoomScripts/starter.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://enftc34b0t86
|
||||
2
Maps/Spaceship/RoomScripts/storage.gd
Normal file
2
Maps/Spaceship/RoomScripts/storage.gd
Normal file
@@ -0,0 +1,2 @@
|
||||
extends BasicRoom
|
||||
class_name Storage
|
||||
1
Maps/Spaceship/RoomScripts/storage.gd.uid
Normal file
1
Maps/Spaceship/RoomScripts/storage.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cjo45t3oyu42p
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user