tool extends StaticBody2D class_name GameObjectComputer enum Direction { LEFT, RIGHT, UP, DOWN } enum ComputerType { ShipCommand, Comms, Medical, Research, Energy, ShipEngine, Atmos } export(Direction) var direction = Direction.DOWN setget set_direction export(ComputerType) var computer_type = ComputerType.ShipCommand setget set_type var screen_region_offset = Vector2.ZERO var open = false onready var activationRange = $ActivationRange as ActivationRange onready var manager = $PowerManager as PowerManager func _ready(): if not Engine.editor_hint: activationRange.visible = true func set_type(val): computer_type = val match computer_type: ComputerType.ShipCommand: screen_region_offset = Vector2(0, 0) ComputerType.Comms: screen_region_offset = Vector2(0, 32) ComputerType.Medical: screen_region_offset = Vector2(0, 64) ComputerType.Research: screen_region_offset = Vector2(128, 0) ComputerType.Energy: screen_region_offset = Vector2(128, 224) ComputerType.Atmos: screen_region_offset = Vector2(128, 192) ComputerType.ShipEngine: screen_region_offset = Vector2(0, 256) refresh_sprite() func set_direction(dir): direction = dir refresh_sprite() func refresh_sprite(): match direction: Direction.DOWN: $computer.region_rect.position = Vector2(0, 0) $computer/screen.region_rect.position = screen_region_offset + Vector2(0, 0) $computer/screen/Light2D.rotation = 0 Direction.UP: $computer.region_rect.position = Vector2(0, 32) $computer/screen.region_rect.position = screen_region_offset + Vector2(32, 0) $computer/screen/Light2D.rotation = PI Direction.LEFT: $computer.region_rect.position = Vector2(32, 32) $computer/screen.region_rect.position = screen_region_offset + Vector2(96, 0) $computer/screen/Light2D.rotation = PI/2 Direction.RIGHT: $computer.region_rect.position = Vector2(32, 0) $computer/screen.region_rect.position = screen_region_offset + Vector2(64, 0) $computer/screen/Light2D.rotation = -PI/2 func manage_controls(show: bool): match computer_type: ComputerType.ShipCommand: $Control/ControlComp.visible = show func _input(event): if event is InputEventMouseButton and event.pressed and not is_inside and open: open = false $UIAnimation.play("fadeout") func _input_event(_viewport, event, _shape_idx): if Engine.editor_hint: return if event is InputEventMouseButton and event.pressed and not open: # Must be in range if activationRange.in_range() and manager.powered: open = true manage_controls(true) $UIAnimation.play("fadein") var is_inside = false func _ui_focus_changed(entered): is_inside = entered func _ui_fade_completed(anim_name): if anim_name == "fadeout": manage_controls(false) func _force_close_ui(): if open: open = false $UIAnimation.play("fadeout") match computer_type: ComputerType.ShipCommand: $Control/ControlComp.force_close() func _power_status_changed(powered: bool) -> void: activationRange.visible = powered if powered: $ScreenAnimation.play("on") else: $ScreenAnimation.play("off") func serialize(): return { "direction": direction, "computer_type": computer_type } func deserialize(data): set_direction(data["direction"]) set_type(data["computer_type"])