Add graphical duodenal ulcer interview
This commit is contained in:
@@ -57,7 +57,10 @@ func on_hide() -> void:
|
||||
|
||||
func compatible_cases(cases: Array) -> Array:
|
||||
return cases.filter(func(item: Variant) -> bool:
|
||||
return typeof(item) == TYPE_DICTIONARY and bool(item.get("interactiveInterviewAvailable", false)))
|
||||
return typeof(item) == TYPE_DICTIONARY \
|
||||
and bool(item.get("interactiveInterviewAvailable", false)) \
|
||||
and bool(item.get("graphicalPresentationAvailable", false)) \
|
||||
and str(item.get("graphicalPresentation", {}).get("sceneKey", "")) == "doctor_office")
|
||||
|
||||
|
||||
func _on_cases_changed() -> void:
|
||||
@@ -77,6 +80,10 @@ func _render_state() -> void:
|
||||
if not active_loaded:
|
||||
return
|
||||
var attempt: Dictionary = CCSService.attempt
|
||||
if not attempt.is_empty() and str(attempt.get("state", "")) == "completed" \
|
||||
and str(attempt.get("experienceMode", "")) == "graphical_interview":
|
||||
_render_debrief(attempt)
|
||||
return
|
||||
if not attempt.is_empty() and str(attempt.get("state", "")) in ["active", "final_orders"]:
|
||||
_render_attempt(attempt)
|
||||
elif cases_loaded and active_loaded:
|
||||
@@ -98,7 +105,7 @@ func _render_attempt(attempt: Dictionary) -> void:
|
||||
if bool(attempt.get("openingCompleted", false)) and not bool(node.get("isTerminal", false)):
|
||||
_handoff_to_classic_player()
|
||||
return
|
||||
_show_doctor_office(node)
|
||||
_show_doctor_office(node, attempt)
|
||||
|
||||
|
||||
func _build_selection_view() -> void:
|
||||
@@ -156,7 +163,7 @@ func _render_case_selection() -> void:
|
||||
_clear_children(case_list)
|
||||
var available := compatible_cases(CCSService.cases)
|
||||
if available.is_empty():
|
||||
status_label.text = "No published CCS cases currently include an interactive interview."
|
||||
status_label.text = "No published CCS cases currently have a supported graphical interview."
|
||||
return
|
||||
status_label.text = "%d interactive %s available." % [available.size(), "case is" if available.size() == 1 else "cases are"]
|
||||
retry_button.visible = false
|
||||
@@ -183,13 +190,20 @@ func _start_case(case_external_id: String) -> void:
|
||||
CCSService.create_attempt(case_external_id, "timed")
|
||||
|
||||
|
||||
func _show_doctor_office(node: Dictionary) -> void:
|
||||
func _show_doctor_office(node: Dictionary, attempt: Dictionary = {}) -> void:
|
||||
if active_scene == null:
|
||||
_set_active_scene(DOCTOR_SCENE.instantiate(), "doctor_office")
|
||||
active_scene.choice_selected.connect(_submit_dialogue_choice)
|
||||
active_scene.interview_continue_requested.connect(_handoff_to_classic_player)
|
||||
active_scene.debrief_return_requested.connect(_return_to_cases)
|
||||
active_scene.debrief_repeat_requested.connect(_repeat_interview)
|
||||
selection_view.visible = false
|
||||
stage_root.visible = true
|
||||
active_scene.configure_experience_mode(str(attempt.get("experienceMode", "management")))
|
||||
active_scene.configure_presentation(
|
||||
attempt.get("graphicalPresentation", {}),
|
||||
str(attempt.get("simulatedStartUtc", "")),
|
||||
int(attempt.get("simulatedMinute", 0)))
|
||||
active_scene.configure_interview(node)
|
||||
active_scene.set_choices_pending(not pending_action.is_empty())
|
||||
|
||||
@@ -203,11 +217,45 @@ func _submit_dialogue_choice(choice_id: String) -> void:
|
||||
|
||||
|
||||
func _handoff_to_classic_player() -> void:
|
||||
if str(CCSService.attempt.get("experienceMode", "")) == "graphical_interview":
|
||||
pending_action = "finishing_interview"
|
||||
active_scene.set_choices_pending(true)
|
||||
CCSService.send_command("exit_case")
|
||||
return
|
||||
current_view = "handoff"
|
||||
if main != null:
|
||||
main.show_screen("ccs_player")
|
||||
|
||||
|
||||
func _render_debrief(attempt: Dictionary) -> void:
|
||||
if active_scene == null:
|
||||
_set_active_scene(DOCTOR_SCENE.instantiate(), "doctor_office")
|
||||
active_scene.debrief_return_requested.connect(_return_to_cases)
|
||||
active_scene.debrief_repeat_requested.connect(_repeat_interview)
|
||||
selection_view.visible = false
|
||||
stage_root.visible = true
|
||||
active_scene.configure_presentation(
|
||||
attempt.get("graphicalPresentation", {}),
|
||||
str(attempt.get("simulatedStartUtc", "")),
|
||||
int(attempt.get("simulatedMinute", 0)))
|
||||
active_scene.show_debrief(attempt.get("interviewDebrief", {}), attempt.get("score", {}))
|
||||
current_view = "interview_debrief"
|
||||
|
||||
|
||||
func _return_to_cases() -> void:
|
||||
CCSService.attempt = {}
|
||||
pending_action = ""
|
||||
_render_case_selection()
|
||||
|
||||
|
||||
func _repeat_interview() -> void:
|
||||
var case_external_id := str(CCSService.attempt.get("caseExternalId", ""))
|
||||
if case_external_id.is_empty() or not pending_action.is_empty():
|
||||
return
|
||||
pending_action = "creating"
|
||||
CCSService.create_attempt(case_external_id, "timed")
|
||||
|
||||
|
||||
func _on_request_failed(message: String) -> void:
|
||||
if not visible:
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user