Add simulated CCS computer
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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"]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user