Complete CCS results and rating flow

This commit is contained in:
hz
2026-07-15 11:08:13 -05:00
parent 9f379cda5c
commit 52d435fa2e
14 changed files with 402 additions and 47 deletions
+35 -7
View File
@@ -9,6 +9,8 @@ var references: VBoxContainer
var report_dialog: Control
var report_button: Button
var current_attempt := {}
var status: Label
var starting_case := false
func _ready() -> void:
set_anchors_preset(Control.PRESET_FULL_RECT); add_theme_constant_override("separation", 10)
@@ -26,13 +28,17 @@ func _ready() -> void:
CCSService.attempt_changed.connect(_refresh_loaded_attempt); CCSService.report_submitted.connect(_report_submitted)
report_dialog = preload("res://scripts/ui/ccs_report_dialog.gd").new(); add_child(report_dialog)
var row := HBoxContainer.new(); add_child(row)
var cases := Button.new(); cases.text = "More cases"; Style.style_primary_button(cases); cases.pressed.connect(func(): main.show_screen("ccs_hub")); row.add_child(cases)
var history := Button.new(); history.text = "Case history"; history.pressed.connect(func(): main.show_screen("ccs_history")); row.add_child(history)
var cases := Button.new(); cases.text = "Another Case"; Style.style_primary_button(cases); cases.pressed.connect(_another_case); row.add_child(cases)
var back := Button.new(); back.text = "Back to Step 3 Modes"; back.pressed.connect(func(): main.show_screen("selection", "step3")); row.add_child(back)
status = Label.new(); Style.set_label(status, 14, Style.RED); row.add_child(status)
CCSService.request_failed.connect(_request_failed)
func _study_label(region: String) -> RichTextLabel:
var label := RichTextLabel.new(); label.bbcode_enabled = true; label.fit_content = true; label.selection_enabled = true; label.set_meta("ccs_region", region); label.gui_input.connect(_text_input.bind(label)); return label
func on_show(payload: Variant = null) -> void:
starting_case = false
if status != null: status.text = ""
if typeof(payload) == TYPE_STRING: CCSService.load_attempt(str(payload)); return
current_attempt = payload if typeof(payload) == TYPE_DICTIONARY else CCSService.attempt
if current_attempt.is_empty(): return
@@ -41,9 +47,17 @@ func on_show(payload: Variant = null) -> void:
_render_text(); _render_references(); _apply_text_scale()
func _score_plain() -> String:
var lines: Array[String] = ["Scoring review"]
var score: Dictionary = current_attempt.get("score", {})
var lines: Array[String] = ["Case result: %d/%d points (%.0f%%)" % [score.get("earnedPoints", 0), score.get("possiblePoints", 0), score.get("percent", 0)]]
var rating: Dictionary = current_attempt.get("rating", {})
if bool(rating.get("rated", false)):
lines.append("CCS ELO: %d (%+d)" % [rating.get("userElo", 1000), rating.get("userEloDelta", 0)])
else:
lines.append("CCS ELO unchanged: this case was not rating-eligible.")
for criterion in current_attempt.get("score", {}).get("criteria", []):
lines.append("%s %s%d\n%s" % [str(criterion.get("status", "missed")).capitalize(), "+" if int(criterion.get("points", 0)) >= 0 else "", criterion.get("points", 0), criterion.get("rationale", "")])
var observed := str(criterion.get("observedAction", "Not performed"))
if criterion.get("observedMinute", null) != null: observed += " at minute %d" % criterion.get("observedMinute", 0)
lines.append("%s: %s %s%d\nExpected: %s\nObserved: %s\n%s" % [criterion.get("title", criterion.get("criterionId", "Criterion")), str(criterion.get("status", "missed")).capitalize(), "+" if int(criterion.get("points", 0)) >= 0 else "", criterion.get("points", 0), criterion.get("expectedAction", ""), observed, criterion.get("rationale", "")])
return "\n\n".join(lines)
func _timeline_plain() -> String:
@@ -76,8 +90,8 @@ func _zoom(delta: float) -> void:
CCSService.adjust_text_scale(delta); _apply_text_scale(); _render_references()
func _apply_text_scale() -> void:
var size := int(round(18.0 * CCSService.text_scale))
for label in [score_body, timeline_body]: label.add_theme_font_size_override("normal_font_size", size); label.add_theme_font_size_override("bold_font_size", size)
var font_size := int(round(18.0 * CCSService.text_scale))
for label in [score_body, timeline_body]: label.add_theme_font_size_override("normal_font_size", font_size); label.add_theme_font_size_override("bold_font_size", font_size)
func _clear_highlights() -> void:
CCSService.clear_highlights(str(current_attempt.get("id", ""))); _render_text()
@@ -85,4 +99,18 @@ func _clear_highlights() -> void:
func _report() -> void: report_dialog.show_for(str(current_attempt.get("id", "")))
func _report_submitted(_id: String) -> void: Style.style_chip(report_button, Style.RED); report_button.tooltip_text = "Report submitted; report another issue"
func _refresh_loaded_attempt() -> void:
if visible and str(CCSService.attempt.get("state", "")) == "completed": on_show(CCSService.attempt)
if not visible: return
if starting_case and str(CCSService.attempt.get("state", "")) in ["active", "final_orders"]:
starting_case = false; main.show_screen("ccs_player"); return
if str(CCSService.attempt.get("state", "")) == "completed": on_show(CCSService.attempt)
func _another_case() -> void:
if starting_case: return
starting_case = true
status.text = "Loading a random timed case..."
CCSService.create_attempt("", "timed")
func _request_failed(message: String) -> void:
if not visible or not starting_case: return
starting_case = false
status.text = message