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):
+6
View File
@@ -70,6 +70,12 @@ func set_pause_menu_open(open: bool) -> void:
active_scene.set_dialogue_input_enabled(not open)
func close_transient_overlay() -> bool:
if active_scene != null and active_scene.has_method("close_computer"):
return bool(active_scene.close_computer())
return false
func compatible_cases(cases: Array) -> Array:
return cases.filter(func(item: Variant) -> bool:
return typeof(item) == TYPE_DICTIONARY \
+10
View File
@@ -699,6 +699,9 @@ func _input(event: InputEvent) -> void:
if not AuthState.is_logged_in or current_screen_name == "login":
return
if event.is_action_pressed("ui_cancel"):
if _close_current_transient_overlay():
get_viewport().set_input_as_handled()
return
if drawer_open:
_close_drawer()
get_viewport().set_input_as_handled()
@@ -708,6 +711,13 @@ func _input(event: InputEvent) -> void:
get_viewport().set_input_as_handled()
func _close_current_transient_overlay() -> bool:
var screen: Control = screens.get(current_screen_name)
if screen != null and screen.has_method("close_transient_overlay"):
return bool(screen.close_transient_overlay())
return false
func _screen_uses_pause_menu(screen_name: String) -> bool:
return screen_name in ["player", "ccs_player", "ccs_cases_2", "flashcards_study"]