117 lines
3.2 KiB
GDScript
117 lines
3.2 KiB
GDScript
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"])
|