stepstead-client/scripts/hud.gd
jts 6a1706051d İlk commit: Stepstead Godot istemci (4.6 Mobile)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-11 11:31:35 +03:00

159 lines
5.4 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends CanvasLayer
## HUD — üst bilgi çubuğu (karakter/altın/adım + ikincil ikonlar) ve
## alt navigasyon çubuğu (Harita/Çanta/Üretim/Market/Karakter/Ayarlar).
## Ana paneller kod ile kurulur; alt bar soldan kayarak girer.
@onready var char_label: Label = $TopBar/HBox/CharName
@onready var level_label: Label = $TopBar/HBox/Level
@onready var steps_label: Label = $TopBar/HBox/Steps
@onready var logout_btn: Button = $TopBar/HBox/Logout
@onready var add_steps_btn: Button = $TopBar/HBox/AddSteps
@onready var inventory_btn: Button = $TopBar/HBox/InventoryBtn
@onready var inventory_panel: PanelContainer = $InventoryPanel
@onready var craft_btn: Button = $TopBar/HBox/CraftBtn
@onready var craft_panel: PanelContainer = $CraftPanel
const NAV_HEIGHT := 96
var chat_panel: PanelContainer
var market_panel: PanelContainer
var daily_panel: PanelContainer
var skills_panel: PanelContainer
var leaderboard_panel: PanelContainer
var settings_panel: PanelContainer
var gold_label: Label
var _nav_layer: CanvasLayer
func _ready() -> void:
add_steps_btn.pressed.connect(_add_steps_debug)
# Eski üst-bar nav butonları alt çubuğa taşındı — gizle (tscn'e dokunmadan)
inventory_btn.visible = false
craft_btn.visible = false
logout_btn.visible = false
# Kod-ile-kurulan paneller
chat_panel = preload("res://scripts/chat_panel.gd").new()
add_child(chat_panel)
market_panel = preload("res://scripts/market_panel.gd").new()
add_child(market_panel)
daily_panel = preload("res://scripts/daily_panel.gd").new()
add_child(daily_panel)
skills_panel = preload("res://scripts/skills_panel.gd").new()
add_child(skills_panel)
leaderboard_panel = preload("res://scripts/leaderboard_panel.gd").new()
add_child(leaderboard_panel)
settings_panel = preload("res://scripts/settings_panel.gd").new()
add_child(settings_panel)
settings_panel.logout_requested.connect(_logout)
# Üst bar: altın etiketi + ikincil ikonlar (sohbet/lider/günlük)
var hbox: HBoxContainer = $TopBar/HBox
gold_label = Label.new()
gold_label.add_theme_color_override("font_color", Color(0.95, 0.8, 0.35))
hbox.add_child(gold_label)
hbox.move_child(gold_label, steps_label.get_index() + 1)
_top_icon(hbox, "💬", _open_chat)
_top_icon(hbox, "🏆", _open_leaderboard)
_top_icon(hbox, "🎁", _open_daily)
_build_bottom_nav()
_render()
GameState.character_loaded.connect(func(_c): _render())
func _top_icon(hbox: HBoxContainer, txt: String, cb: Callable) -> void:
var b := Button.new()
b.text = txt
hbox.add_child(b)
b.pressed.connect(cb)
# --- Alt navigasyon çubuğu ---
func _build_bottom_nav() -> void:
_nav_layer = CanvasLayer.new()
_nav_layer.layer = 3
add_child(_nav_layer)
var bar := PanelContainer.new()
bar.set_anchors_preset(Control.PRESET_BOTTOM_WIDE)
bar.offset_top = -NAV_HEIGHT
bar.offset_bottom = 0
var sb := StyleBoxFlat.new()
sb.bg_color = Color(0.09, 0.10, 0.13, 0.98)
sb.border_color = Color(0.2, 0.22, 0.28)
sb.border_width_top = 2
bar.add_theme_stylebox_override("panel", sb)
_nav_layer.add_child(bar)
var hbox := HBoxContainer.new()
hbox.add_theme_constant_override("separation", 0)
bar.add_child(hbox)
_nav_btn(hbox, "🗺", "Harita", close_all_panels)
_nav_btn(hbox, "🎒", "Çanta", func() -> void: _toggle(inventory_panel))
_nav_btn(hbox, "🛠", "Üretim", func() -> void: _toggle(craft_panel))
_nav_btn(hbox, "🏪", "Market", func() -> void: _toggle(market_panel))
_nav_btn(hbox, "👤", "Karakter", func() -> void: _toggle(skills_panel))
_nav_btn(hbox, "", "Ayarlar", func() -> void: _toggle(settings_panel))
# Soldan kaydırarak gir
_nav_layer.offset = Vector2(-720, 0)
var tw := create_tween()
tw.tween_property(_nav_layer, "offset", Vector2.ZERO, 0.35).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT)
func _nav_btn(hbox: HBoxContainer, icon: String, label: String, cb: Callable) -> void:
var b := Button.new()
b.size_flags_horizontal = Control.SIZE_EXPAND_FILL
b.custom_minimum_size = Vector2(0, NAV_HEIGHT)
b.focus_mode = Control.FOCUS_NONE
b.flat = true
b.text = "%s\n%s" % [icon, label]
b.add_theme_font_size_override("font_size", 13)
b.autowrap_mode = TextServer.AUTOWRAP_OFF
hbox.add_child(b)
b.pressed.connect(cb)
func _all_panels() -> Array:
return [inventory_panel, craft_panel, market_panel, skills_panel,
daily_panel, leaderboard_panel, chat_panel, settings_panel]
func close_all_panels() -> void:
for p in _all_panels():
if p != null:
p.visible = false
# Bir paneli aç/kapat; açarken diğerlerini kapat (tek panel görünür)
func _toggle(panel: PanelContainer) -> void:
if panel == null:
return
if panel.visible:
panel.visible = false
return
close_all_panels()
panel.open()
func _open_chat() -> void: _toggle(chat_panel)
func _open_leaderboard() -> void: _toggle(leaderboard_panel)
func _open_daily() -> void: _toggle(daily_panel)
func _add_steps_debug() -> void:
# Gerçek pedometer yolunu test eder: simülasyon sayacına ekle + sunucuya sync
Pedometer.sim_add(100)
await Pedometer.sync_now()
_render()
func _render() -> void:
var c: Dictionary = GameState.character
if c.is_empty():
return
char_label.text = str(c.get("name", ""))
level_label.text = "Lv %d" % int(c.get("level", 1))
steps_label.text = "👣 %d" % int(c.get("step_balance", 0))
if gold_label != null:
gold_label.text = "🪙 %d" % int(c.get("gold", 0))
func _logout() -> void:
WsClient.stop()
Auth.clear()
GameState.character = {}
GameState.skills = []
get_tree().change_scene_to_file("res://scenes/login.tscn")