From 7ba95c5949d08ea429d8b65fcc3cf7af8acfad2c Mon Sep 17 00:00:00 2001 From: CT1138 Date: Fri, 27 Mar 2026 10:35:03 -0700 Subject: [PATCH] Camera system YAY!!! --- Data/cameras.json | 90 +++++++++++++++++--- Levels/test.tscn | 4 +- Scripts/Characters/NPC/npcConstruct.gd | 4 + Scripts/Gameplay/Camera/cCamera.gd | 49 +++++++++++ Scripts/Gameplay/Camera/cCamera.gd.uid | 1 + Scripts/Gameplay/Camera/cCameraViewer.gd | 53 ++++++++++++ Scripts/Gameplay/Camera/cCameraViewer.gd.uid | 1 + Scripts/Gameplay/CommandLine/Commands/cam.gd | 7 +- Scripts/Gameplay/Location/cLocation.gd | 65 ++++++++++++++ Scripts/Gameplay/Location/cLocation.gd.uid | 1 + Scripts/Helper/hCamera.gd | 11 ++- Scripts/Logic/cRoom.gd | 17 ---- Scripts/Logic/cRoom.gd.uid | 1 - Scripts/cGame.gd | 24 +++--- global.gd | 6 +- 15 files changed, 281 insertions(+), 53 deletions(-) create mode 100644 Scripts/Gameplay/Camera/cCamera.gd create mode 100644 Scripts/Gameplay/Camera/cCamera.gd.uid create mode 100644 Scripts/Gameplay/Camera/cCameraViewer.gd create mode 100644 Scripts/Gameplay/Camera/cCameraViewer.gd.uid create mode 100644 Scripts/Gameplay/Location/cLocation.gd create mode 100644 Scripts/Gameplay/Location/cLocation.gd.uid delete mode 100644 Scripts/Logic/cRoom.gd delete mode 100644 Scripts/Logic/cRoom.gd.uid diff --git a/Data/cameras.json b/Data/cameras.json index 0420169..6e23f9a 100644 --- a/Data/cameras.json +++ b/Data/cameras.json @@ -1,12 +1,82 @@ { - "HANGAR": 1, - "KITCHEN": 2, - "REC_ROOM": 3, - "RESTROOM": 4, - "SUPPLY_ROOM": 5, - "MAINTENANCE_ROOM": 6, - "STORAGE_A": 7, - "STORAGE_B": 8, - "EAST_HALLWAY": 9, - "WEST_HALLWAY": 10 + "1": { + "location": 2, + "name": "HANGAR", + "disabled": false, + "renders": { + + } + }, + "2": { + "location": 3, + "name": "KITCHEN", + "disabled": false, + "renders": { + + } + }, + "4": { + "location": 3, + "name": "REC_ROOM", + "disabled": false, + "renders": { + + } + }, + "5": { + "location": 4, + "name": "RESTROOM", + "disabled": false, + "renders": { + + } + }, + "6": { + "location": 5, + "name": "SUPPLY_ROOM", + "disabled": false, + "renders": { + + } + }, + "7": { + "location": 6, + "name": "MAINTENANCE_ROOM", + "disabled": false, + "renders": { + + } + }, + "8": { + "location": 7, + "name": "STORAGE_A", + "disabled": false, + "renders": { + + } + }, + "9": { + "location": 8, + "name": "STORAGE_B", + "disabled": false, + "renders": { + + } + }, + "11": { + "location": 9, + "name": "EAST_HALLWAY", + "disabled": false, + "renders": { + + } + }, + "12": { + "location": 10, + "name": "WEST_HALLWAY", + "disabled": false, + "renders": { + + } + }, } diff --git a/Levels/test.tscn b/Levels/test.tscn index 15cd905..7afb7fb 100644 --- a/Levels/test.tscn +++ b/Levels/test.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=5 format=3 uid="uid://cqd214exw72db"] +[gd_scene load_steps=6 format=3 uid="uid://cqd214exw72db"] [ext_resource type="Theme" uid="uid://bcxvg2kigp6u1" path="res://Themes/UI/Terminal/tTerminalPrompt.tres" id="2_afen0"] [ext_resource type="Texture2D" uid="uid://c6m1tx7klorqr" path="res://Renders/Camera/PowerStation/powerstation_1.png" id="2_f87w0"] [ext_resource type="Texture2D" uid="uid://cv2cadqcahubl" path="res://map.png" id="4_afen0"] +[ext_resource type="Script" uid="uid://be6xuapep782t" path="res://Scripts/Gameplay/Camera/cCameraViewer.gd" id="4_w4v7x"] [ext_resource type="Script" uid="uid://dmp22gu6t0fw2" path="res://Scripts/Gameplay/CommandLine/cCommandLine.gd" id="13_tqcie"] [node name="Node2D" type="Node2D"] @@ -60,6 +61,7 @@ offset_right = 4392.0 offset_bottom = 2904.0 scale = Vector2(0.185, 0.185) texture = ExtResource("2_f87w0") +script = ExtResource("4_w4v7x") [node name="B_Shock" type="Button" parent="."] offset_left = 16.0 diff --git a/Scripts/Characters/NPC/npcConstruct.gd b/Scripts/Characters/NPC/npcConstruct.gd index c0d3a84..4bdcbef 100644 --- a/Scripts/Characters/NPC/npcConstruct.gd +++ b/Scripts/Characters/NPC/npcConstruct.gd @@ -1,6 +1,8 @@ class_name npcConstruct extends cCharacter +var defaultRoom = 0 + signal location_changed(ai, old_location, new_location) signal state_changed(ai, old_state, new_state) @@ -15,6 +17,8 @@ func advance_state() -> void: func _ready(): super._ready() print("Construct Ready") + + Global.game.night.hour_changed.connect(_on_hour_changed) func _on_hour_changed(hour: int): diff --git a/Scripts/Gameplay/Camera/cCamera.gd b/Scripts/Gameplay/Camera/cCamera.gd new file mode 100644 index 0000000..33bc158 --- /dev/null +++ b/Scripts/Gameplay/Camera/cCamera.gd @@ -0,0 +1,49 @@ +class_name cCamera + +var cam: Dictionary +var camID: String + +var camGraph = Global.loadJSON("res://Data/cameras.json") + +var name: String +var disabled: bool +var rendersChart: Dictionary +var renders: Dictionary +var locationID: String +var location: cLocation + +# Called when the node enters the scene tree for the first time. +func _init(id: String) -> void: + camID = id + cam = camGraph[camID] + + print("Setting up camera " + camID) + name = cam.get("name") + disabled = cam.get("disabled") + rendersChart = cam.get("renders") + locationID = str( int( cam.get("location") ) ) + location = cLocation.new(locationID) + + print(name) + print(disabled) + print(rendersChart) + print(location) + + _loadRenders() + +func _loadRenders(): + renders = {} + for key in rendersChart: + var renderPath = rendersChart[key] + + if renderPath == null or not FileAccess.file_exists(renderPath): + push_error("Missing render: " + str(renderPath)) + continue + + renders[key] = load(renderPath) + +func getFeed() -> Texture2D: + var hash = location.makeHash() + if not renders.has(hash): return null + + return renders[hash] diff --git a/Scripts/Gameplay/Camera/cCamera.gd.uid b/Scripts/Gameplay/Camera/cCamera.gd.uid new file mode 100644 index 0000000..abea64d --- /dev/null +++ b/Scripts/Gameplay/Camera/cCamera.gd.uid @@ -0,0 +1 @@ +uid://bsxrimscxvjck diff --git a/Scripts/Gameplay/Camera/cCameraViewer.gd b/Scripts/Gameplay/Camera/cCameraViewer.gd new file mode 100644 index 0000000..ad425e4 --- /dev/null +++ b/Scripts/Gameplay/Camera/cCameraViewer.gd @@ -0,0 +1,53 @@ +class_name cCameraViewer +extends TextureRect + +var defaultTexture: Texture2D + +var activeCamera: cCamera = null +var activeCameraID: int = -1 +var activeTexture: Texture2D = null + + +func _ready() -> void: + clearCamera() + +func _process(delta: float) -> void: + if activeCamera == null: + return + + var newTexture = getCameraRender() + if newTexture != activeTexture: + activeTexture = newTexture + renderCamera() + +func setCamera(id: int) -> void: + clearCamera() + + activeCameraID = id + activeCamera = Global.game.camera + + renderCamera() + +func renderCamera() -> void: + if activeTexture == null: + self.texture = defaultTexture + else: + self.texture = activeTexture + +func clearCamera() -> void: + activeCamera = null + activeCameraID = -1 + activeTexture = defaultTexture + renderCamera() + + +func getCameraRender() -> Texture2D: + if activeCamera == null: + return defaultTexture + + var feed = activeCamera.getFeed() + + if feed == null: + return defaultTexture + + return feed diff --git a/Scripts/Gameplay/Camera/cCameraViewer.gd.uid b/Scripts/Gameplay/Camera/cCameraViewer.gd.uid new file mode 100644 index 0000000..b26d5c1 --- /dev/null +++ b/Scripts/Gameplay/Camera/cCameraViewer.gd.uid @@ -0,0 +1 @@ +uid://be6xuapep782t diff --git a/Scripts/Gameplay/CommandLine/Commands/cam.gd b/Scripts/Gameplay/CommandLine/Commands/cam.gd index ce438d4..4c2748e 100644 --- a/Scripts/Gameplay/CommandLine/Commands/cam.gd +++ b/Scripts/Gameplay/CommandLine/Commands/cam.gd @@ -21,7 +21,8 @@ func main(args: Array, context: Node) -> void: return var cam_name = Global.cameraHelper.getName(cam_id) + + var newCam = cCamera.new(str(cam_id)) + newCam._init(str(cam_id)) + context._print("Camera set to %s" % cam_name.capitalize()) - - print(Global.cameraHelper.id_to_name) - print(Global.cameraHelper.name_to_id) diff --git a/Scripts/Gameplay/Location/cLocation.gd b/Scripts/Gameplay/Location/cLocation.gd new file mode 100644 index 0000000..efca9c3 --- /dev/null +++ b/Scripts/Gameplay/Location/cLocation.gd @@ -0,0 +1,65 @@ +class_name cLocation + +var locationGraph = Global.locations + +var location: Dictionary +var locationID: String + +var name: String +var connections: Array + +var enemyTemplate = { + "present": false, + "state": 0 +} + +var construct = enemyTemplate.duplicate() +var yoshida = enemyTemplate.duplicate() +var akers = enemyTemplate.duplicate() +var flesher = enemyTemplate.duplicate() + +func _init(id: String): + # Set immediate values + locationID = id + print(locationGraph) + print(id) + location = locationGraph.get(id) + + # Set Fields + name = location.get("name") + connections = location.get("connections") + +func isPresent(character: String) -> bool: + match character: + "construct": + return construct.get("present") + "yoshida": + return yoshida.get("present") + "akers": + return akers.get("present") + "flesher": + return flesher.get("present") + return false + +func getState(character: String) -> int: + match character: + "construct": + return construct.get("state") + "yoshida": + return yoshida.get("state") + "akers": + return akers.get("state") + "flesher": + return flesher.get("state") + return -1 + +func makeHash() -> String: + var hash = "" + var characters = ["construct", "yoshida", "akers", "flesher"] + + for c in characters: + if isPresent(c): + hash += c[0] + hash += str( getState(c) ) + + return hash diff --git a/Scripts/Gameplay/Location/cLocation.gd.uid b/Scripts/Gameplay/Location/cLocation.gd.uid new file mode 100644 index 0000000..ac300b0 --- /dev/null +++ b/Scripts/Gameplay/Location/cLocation.gd.uid @@ -0,0 +1 @@ +uid://cor2nfptbpmby diff --git a/Scripts/Helper/hCamera.gd b/Scripts/Helper/hCamera.gd index f17719b..222ee9f 100644 --- a/Scripts/Helper/hCamera.gd +++ b/Scripts/Helper/hCamera.gd @@ -1,5 +1,6 @@ class_name hCamera +var cameras: Dictionary = {} var name_to_id: Dictionary = {} var id_to_name: Dictionary = {} @@ -9,13 +10,15 @@ func setup(cameras_dict: Dictionary) -> void: push_error("Cameras dictionary is null!") return - name_to_id = cameras_dict.duplicate() - id_to_name.clear() - for name in name_to_id.keys(): - id_to_name[int(name_to_id[name])] = name # ensure keys are ints + cameras = cameras_dict + + id_to_name = cameras_dict.duplicate() + name_to_id.clear() func getID(cameraName: String) -> int: + return 0 return name_to_id.get(cameraName.to_upper(), -1) func getName(cam_id: int) -> String: + return "DISABLED" return id_to_name.get(cam_id, "UNKNOWN") diff --git a/Scripts/Logic/cRoom.gd b/Scripts/Logic/cRoom.gd deleted file mode 100644 index 9edbf3a..0000000 --- a/Scripts/Logic/cRoom.gd +++ /dev/null @@ -1,17 +0,0 @@ -class_name cRoom -extends Resource - -var id: int -var name: String -var connections: Array = [] -var enemies: Array = [] - -func add_enemy(enemy): - if enemy not in enemies: - enemies.append(enemy) - -func remove_enemy(enemy): - enemies.erase(enemy) - -func _process(_delta): - pass diff --git a/Scripts/Logic/cRoom.gd.uid b/Scripts/Logic/cRoom.gd.uid deleted file mode 100644 index aac47fe..0000000 --- a/Scripts/Logic/cRoom.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bh0j1ffo2peo0 diff --git a/Scripts/cGame.gd b/Scripts/cGame.gd index 1e42c3d..0d2f5ba 100644 --- a/Scripts/cGame.gd +++ b/Scripts/cGame.gd @@ -1,23 +1,20 @@ class_name cGame var night: cNight -var rooms: Dictionary = {} var enemies: Dictionary = {} var locations: Dictionary = {} +var cameras: Array = [] var nightStarted = false var nightCompleted = false -func build_rooms(): - for id_str in locations.keys(): - var data = locations[id_str] +func make_cameras(): + var camera + for key in Global.cameras: + print(key) + camera = cCamera.new(key) + cameras.append(camera) - var room = cRoom.new() - room.id = int(id_str) - room.name = data.name - room.connections = data.connections - - rooms[room.id] = room func make_enemies(): var eConstruct = npcConstruct.new() @@ -31,11 +28,10 @@ func make_enemies(): "yoshida": eYoshida } -func _setup() -> Array: +func _setup(): print("Setting up Game") night = cNight.new() locations = Global.locations - build_rooms() + + make_cameras() make_enemies() - print([rooms, enemies]) - return [rooms, enemies] diff --git a/global.gd b/global.gd index 9ec1eee..bd66b96 100644 --- a/global.gd +++ b/global.gd @@ -6,7 +6,7 @@ var stars = 0 var cameras var locations var cameraHelper -var game +var game: cGame func _ready() -> void: cameras = loadJSON("res://Data/cameras.json") @@ -15,12 +15,12 @@ func _ready() -> void: cameraHelper = hCamera.new() cameraHelper.setup(cameras) - game = cGame.new() - begin_game() func begin_game(): + game = cGame.new() game._setup() + game.nightStarted = true func loadJSON(path: String) -> Dictionary: