Add simulated CCS computer

This commit is contained in:
hz
2026-08-07 18:31:00 -05:00
parent 41b3092552
commit e50a97ba91
9 changed files with 235 additions and 1 deletions
+50
View File
@@ -29,6 +29,9 @@ const DIALOGUE_BUBBLE_VERTICAL_CHROME := 95.0
@onready var previous_page_button: Button = $DialogueChoiceArea/ChoicePager/Previous
@onready var page_label: Label = $DialogueChoiceArea/ChoicePager/Page
@onready var next_page_button: Button = $DialogueChoiceArea/ChoicePager/Next
@onready var computer_launcher: Button = $ComputerLauncher
@onready var computer_overlay: Control = $ComputerOverlay
@onready var computer_close_button: Button = $ComputerOverlay/Close
var blink_tween: Tween
var dialogue_tween: Tween
@@ -44,11 +47,14 @@ var dialogue_characters_per_second := 35.0
var dialogue_reveal_complete := false
var dialogue_layout_generation := 0
var dialogue_input_enabled := true
var computer_available := true
func _ready() -> void:
previous_page_button.pressed.connect(_change_choice_page.bind(-1))
next_page_button.pressed.connect(_change_choice_page.bind(1))
computer_launcher.pressed.connect(open_computer)
computer_close_button.pressed.connect(close_computer)
_update_clock()
_schedule_patient_blink()
hide_patient_dialogue()
@@ -158,6 +164,8 @@ func is_patient_dialogue_visible() -> bool:
func configure_interview(node: Dictionary) -> void:
computer_available = true
computer_launcher.visible = not computer_overlay.visible
if debrief_panel != null and is_instance_valid(debrief_panel):
debrief_panel.queue_free()
debrief_panel = null
@@ -220,6 +228,10 @@ func complete_response_transition() -> void:
func _input(event: InputEvent) -> void:
if computer_overlay.visible:
return
if _event_targets_computer_launcher(event):
return
if not dialogue_input_enabled or not dialogue_bubble.visible:
return
var should_advance := false
@@ -241,6 +253,41 @@ func set_dialogue_input_enabled(enabled: bool) -> void:
dialogue_input_enabled = enabled
func open_computer() -> void:
if not computer_available or computer_overlay.visible:
return
computer_overlay.visible = true
computer_launcher.visible = false
if dialogue_tween and dialogue_tween.is_valid():
dialogue_tween.pause()
computer_close_button.grab_focus()
func close_computer() -> bool:
if not computer_overlay.visible:
return false
computer_overlay.visible = false
computer_launcher.visible = computer_available
if dialogue_tween and dialogue_tween.is_valid():
dialogue_tween.play()
return true
func is_computer_open() -> bool:
return computer_overlay.visible
func _event_targets_computer_launcher(event: InputEvent) -> bool:
if not computer_launcher.visible:
return false
if event is InputEventMouseButton:
return event.button_index == MOUSE_BUTTON_LEFT \
and computer_launcher.get_global_rect().has_point(event.position)
if event is InputEventScreenTouch:
return computer_launcher.get_global_rect().has_point(event.position)
return false
func _split_dialogue_pages(text: String) -> Array[String]:
var normalized := text.strip_edges()
if normalized.is_empty():
@@ -397,6 +444,9 @@ func _on_dialogue_choice_pressed(choice_id: String) -> void:
func show_debrief(debrief: Dictionary, score: Dictionary) -> void:
computer_available = false
close_computer()
computer_launcher.visible = false
hide_patient_dialogue()
hide_dialogue_choices()
if debrief_panel != null and is_instance_valid(debrief_panel):