This repository has been archived on 2020-09-30. You can view files and clone it, but cannot push or open issues or pull requests.
odyssey-old/Actors/Objects/Computer/Computer.gd

175 lines
5 KiB
GDScript3
Raw Normal View History

2020-07-06 19:58:42 +00:00
tool
extends StaticBody2D
2020-07-07 11:01:12 +00:00
class_name GameObjectComputer
2020-07-06 19:58:42 +00:00
enum Direction { LEFT, RIGHT, UP, DOWN }
2020-07-16 12:37:56 +00:00
enum ComputerType { ShipCommand, Comms, Medical, Research, Energy, ShipEngine, Atmos, Monitoring }
2020-07-06 19:58:42 +00:00
2020-09-15 23:23:45 +00:00
export var object_name := ""
export(Direction) var direction := Direction.DOWN setget set_direction
export(ComputerType) var computer_type := ComputerType.ShipCommand setget set_type
2020-07-06 19:58:42 +00:00
2020-09-15 23:23:45 +00:00
var screen_region_offset := Vector2.ZERO
var open := false
2020-07-07 07:40:20 +00:00
2020-09-15 23:23:45 +00:00
onready var activationRange := $ActivationRange as ActivationRange
onready var manager := $PowerManager as PowerManager
2020-07-06 19:58:42 +00:00
2020-07-07 08:38:32 +00:00
func _ready():
if not Engine.editor_hint:
activationRange.visible = true
2020-07-16 12:44:35 +00:00
$computer/screen/Light2D.visible = true
2020-07-07 08:38:32 +00:00
2020-07-06 19:58:42 +00:00
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:
2020-07-06 19:58:42 +00:00
screen_region_offset = Vector2(128, 224)
ComputerType.Atmos:
screen_region_offset = Vector2(128, 192)
ComputerType.ShipEngine:
2020-07-06 19:58:42 +00:00
screen_region_offset = Vector2(0, 256)
2020-07-16 12:37:56 +00:00
ComputerType.Monitoring:
screen_region_offset = Vector2(128, 32)
2020-07-07 00:47:29 +00:00
refresh_sprite()
2020-07-06 19:58:42 +00:00
func set_direction(dir):
direction = dir
2020-07-07 00:47:29 +00:00
refresh_sprite()
func refresh_sprite():
2020-07-06 19:58:42 +00:00
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
2020-07-06 19:58:42 +00:00
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
2020-07-06 19:58:42 +00:00
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
2020-07-06 19:58:42 +00:00
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
2020-07-06 22:00:39 +00:00
func manage_controls(show: bool):
2020-07-06 22:00:39 +00:00
match computer_type:
ComputerType.ShipCommand:
$Control/ControlComp.visible = show
2020-07-20 09:15:39 +00:00
ComputerType.Energy:
$Control/EnergyComp.visible = show
func _input(event):
2020-07-07 07:40:20 +00:00
if event is InputEventMouseButton and event.pressed and not is_inside and open:
open = false
2020-07-07 00:47:29 +00:00
$UIAnimation.play("fadeout")
2020-07-06 22:00:39 +00:00
func _input_event(_viewport, event, _shape_idx):
2020-07-06 22:00:39 +00:00
if Engine.editor_hint:
return
2020-07-07 07:40:20 +00:00
if event is InputEventMouseButton and event.pressed and not open:
# Must be in range
2020-07-09 14:50:34 +00:00
if activationRange.in_range() and manager.powered:
2020-07-07 07:40:20 +00:00
open = true
manage_controls(true)
$UIAnimation.play("fadein")
var is_inside = false
func _ui_focus_changed(entered):
is_inside = entered
2020-07-07 00:47:29 +00:00
func _ui_fade_completed(anim_name):
if anim_name == "fadeout":
manage_controls(false)
2020-07-07 07:40:20 +00:00
func _force_close_ui():
if open:
open = false
$UIAnimation.play("fadeout")
match computer_type:
ComputerType.ShipCommand:
$Control/ControlComp.force_close()
2020-07-09 14:50:34 +00:00
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"])
2020-07-23 12:21:27 +00:00
func inspect():
match computer_type:
ComputerType.ShipCommand:
return {
"type": "Control board computer",
"description": "A computer for moving the ship around the galaxy",
"interaction": "Click when near to interact"
}
ComputerType.Comms:
return {
"type": "Comms computer",
"description": "A computer for issuing and controlling communications",
"interaction": "Click when near to interact"
}
ComputerType.Medical:
return {
"type": "Medical computer",
"description": "A computer for checking health status and medical procedures",
"interaction": "Click when near to interact"
}
ComputerType.Research:
return {
"type": "R&D computer",
"description": "A computer for researching new tech and control printers",
"interaction": "Click when near to interact"
}
ComputerType.Energy:
return {
"type": "Energy supply computer",
"description": "A computer for monitoring and managing the energy grid",
"interaction": "Click when near to interact"
}
ComputerType.Atmos:
return {
"type": "Atmos computer",
"description": "A computer for monitoring and managing the air supply",
"interaction": "Click when near to interact"
}
ComputerType.ShipEngine:
return {
"type": "Engine control computer",
"description": "A computer for monitoring and managing the ship engines",
"interaction": "Click when near to interact"
}
ComputerType.Monitoring:
return {
"type": "Monitoring computer",
"description": "A computer for monitoring crew and ship status",
"interaction": "Click when near to interact"
}