İlk commit: Stepstead Godot istemci (4.6 Mobile)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
jts 2026-07-11 11:31:35 +03:00
commit 6a1706051d
346 changed files with 14415 additions and 0 deletions

View file

@ -0,0 +1,117 @@
extends PanelContainer
## Liderlik tablosu — 👣 adım / ⭐ level / 🪙 gold sekmeleri, top 20 + kendi sıran.
## Kod ile kurulur. Node adı "LeaderboardPanel".
const PANEL_HEIGHT := 560.0
var _list: VBoxContainer
var _tabs := {}
var _my_rank_lbl: Label
var _by := "steps"
func _ready() -> void:
name = "LeaderboardPanel"
visible = false
_build_ui()
func _build_ui() -> void:
set_anchors_preset(Control.PRESET_BOTTOM_WIDE)
offset_top = -PANEL_HEIGHT
offset_left = 8
offset_right = -8
offset_bottom = -8
var sb := StyleBoxFlat.new()
sb.bg_color = Color(0.12, 0.10, 0.13, 0.97)
sb.set_corner_radius_all(10)
add_theme_stylebox_override("panel", sb)
var margin := MarginContainer.new()
margin.add_theme_constant_override("margin_left", 14)
margin.add_theme_constant_override("margin_right", 14)
margin.add_theme_constant_override("margin_top", 10)
margin.add_theme_constant_override("margin_bottom", 10)
add_child(margin)
var vbox := VBoxContainer.new()
vbox.add_theme_constant_override("separation", 6)
margin.add_child(vbox)
var top := HBoxContainer.new()
var title := Label.new()
title.text = "🏆 Liderlik"
title.add_theme_font_size_override("font_size", 18)
title.size_flags_horizontal = Control.SIZE_EXPAND_FILL
top.add_child(title)
for entry in [["steps", "👣"], ["level", ""], ["gold", "🪙"]]:
var btn := Button.new()
btn.text = str(entry[1])
btn.toggle_mode = true
var key := str(entry[0])
btn.pressed.connect(func() -> void: _switch(key))
top.add_child(btn)
_tabs[key] = btn
(_tabs["steps"] as Button).button_pressed = true
var close_btn := Button.new()
close_btn.text = ""
close_btn.pressed.connect(func() -> void: visible = false)
top.add_child(close_btn)
vbox.add_child(top)
_my_rank_lbl = Label.new()
_my_rank_lbl.add_theme_font_size_override("font_size", 13)
_my_rank_lbl.add_theme_color_override("font_color", Color(0.75, 0.7, 0.55))
vbox.add_child(_my_rank_lbl)
var scroll := ScrollContainer.new()
scroll.size_flags_vertical = Control.SIZE_EXPAND_FILL
scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED
vbox.add_child(scroll)
_list = VBoxContainer.new()
_list.size_flags_horizontal = Control.SIZE_EXPAND_FILL
_list.add_theme_constant_override("separation", 4)
scroll.add_child(_list)
func open() -> void:
visible = true
await _render()
func _switch(by: String) -> void:
_by = by
for key in _tabs:
(_tabs[key] as Button).button_pressed = key == by
_render()
func _render() -> void:
for c in _list.get_children():
c.queue_free()
var res: Dictionary = await GameState.leaderboard(_by)
if not res.ok or not (res.body is Dictionary):
_my_rank_lbl.text = "Yüklenemedi"
return
var d: Dictionary = res.body
_my_rank_lbl.text = "Senin sıran: #%d" % int(d.get("my_rank", 0))
var unit := {"steps": "👣", "level": "", "gold": "🪙"}.get(_by, "")
for r in d.get("rows", []):
if r is Dictionary:
_list.add_child(_row(r, str(unit)))
func _row(r: Dictionary, unit: String) -> HBoxContainer:
var row := HBoxContainer.new()
row.add_theme_constant_override("separation", 10)
var me: bool = bool(r.get("me", false))
var rank := int(r.get("rank", 0))
var rank_lbl := Label.new()
rank_lbl.text = ["🥇", "🥈", "🥉"][rank - 1] if rank <= 3 else "#%d" % rank
rank_lbl.custom_minimum_size = Vector2(44, 0)
row.add_child(rank_lbl)
var name_lbl := Label.new()
name_lbl.text = "%s (Lv %d)" % [str(r.get("name", "")), int(r.get("level", 1))]
name_lbl.size_flags_horizontal = Control.SIZE_EXPAND_FILL
if me:
name_lbl.add_theme_color_override("font_color", Color(0.5, 0.9, 0.5))
row.add_child(name_lbl)
var val_lbl := Label.new()
val_lbl.text = "%s %d" % [unit, int(r.get("value", 0))]
row.add_child(val_lbl)
return row