Add server-authoritative RZ Coin rewards
This commit is contained in:
@@ -39,6 +39,8 @@ var footer_icon: TextureRect
|
||||
var footer_heading: Label
|
||||
var footer_description: Label
|
||||
var pending_sku := ""
|
||||
var ledger_list: VBoxContainer
|
||||
var ledger_more_button: Button
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
@@ -76,20 +78,70 @@ func _ready() -> void:
|
||||
confirm_dialog.confirmed.connect(_confirm_purchase)
|
||||
add_child(confirm_dialog)
|
||||
|
||||
_build_ledger()
|
||||
_build_footer()
|
||||
|
||||
CreditsService.credits_changed.connect(_refresh)
|
||||
CreditsService.credits_failed.connect(_show_error)
|
||||
CreditsService.store_operation_completed.connect(_show_message)
|
||||
CreditsService.ledger_changed.connect(_render_ledger)
|
||||
UIThemeService.theme_changed.connect(func(_dark: bool): _refresh_theme_controls(); _refresh())
|
||||
_refresh()
|
||||
|
||||
|
||||
func on_show(_payload: Variant = null) -> void:
|
||||
CreditsService.refresh()
|
||||
CreditsService.load_ledger()
|
||||
_refresh()
|
||||
|
||||
|
||||
func _build_ledger() -> void:
|
||||
var heading := Label.new()
|
||||
heading.text = "Coin history"
|
||||
heading.add_theme_font_override("font", Brand.font)
|
||||
heading.add_theme_font_size_override("font_size", 18)
|
||||
add_child(heading)
|
||||
ledger_list = VBoxContainer.new()
|
||||
ledger_list.add_theme_constant_override("separation", 6)
|
||||
add_child(ledger_list)
|
||||
ledger_more_button = Button.new()
|
||||
ledger_more_button.text = "Load more"
|
||||
ledger_more_button.custom_minimum_size = Vector2(130, 40)
|
||||
ledger_more_button.size_flags_horizontal = Control.SIZE_SHRINK_BEGIN
|
||||
ledger_more_button.pressed.connect(func(): CreditsService.load_ledger(CreditsService.ledger_next_before))
|
||||
add_child(ledger_more_button)
|
||||
|
||||
|
||||
func _render_ledger() -> void:
|
||||
if ledger_list == null:
|
||||
return
|
||||
for child in ledger_list.get_children():
|
||||
child.queue_free()
|
||||
var dark := UIThemeService.is_dark_mode()
|
||||
if CreditsService.ledger.is_empty():
|
||||
var empty := Label.new()
|
||||
empty.text = "Learning rewards and purchases will appear here."
|
||||
empty.add_theme_color_override("font_color", Brand.muted_color(dark))
|
||||
ledger_list.add_child(empty)
|
||||
for item_variant in CreditsService.ledger:
|
||||
if typeof(item_variant) != TYPE_DICTIONARY:
|
||||
continue
|
||||
var item: Dictionary = item_variant
|
||||
var row := HBoxContainer.new()
|
||||
var description := Label.new()
|
||||
description.text = str(item.get("description", "RZ Coin activity"))
|
||||
description.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||
description.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
|
||||
row.add_child(description)
|
||||
var amount := int(item.get("amount", 0))
|
||||
var amount_label := Label.new()
|
||||
amount_label.text = "%+d" % amount
|
||||
amount_label.add_theme_color_override("font_color", Brand.SUCCESS if amount > 0 else Brand.MAGENTA)
|
||||
row.add_child(amount_label)
|
||||
ledger_list.add_child(row)
|
||||
ledger_more_button.visible = not CreditsService.ledger_next_before.is_empty()
|
||||
|
||||
|
||||
func _build_header() -> void:
|
||||
var title := Label.new()
|
||||
title.text = "RZ Coin Shop"
|
||||
@@ -258,7 +310,7 @@ func _build_footer() -> void:
|
||||
footer_heading.add_theme_color_override("font_color", Brand.text_color(dark))
|
||||
copy.add_child(footer_heading)
|
||||
footer_description = Label.new()
|
||||
footer_description.text = "Answer questions correctly on the first try, within the time limit."
|
||||
footer_description.text = "Earn coins for first-correct answers, difficult questions, delayed reviews, mastery milestones, and completed exam simulations."
|
||||
footer_description.add_theme_font_override("font", Brand.font)
|
||||
footer_description.add_theme_font_size_override("font_size", 12)
|
||||
footer_description.add_theme_color_override("font_color", Brand.muted_color(dark))
|
||||
|
||||
Reference in New Issue
Block a user