stepstead-client/scripts/craft_panel.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

137 lines
4.3 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 PanelContainer
## Üretim paneli — tarif listeler, üretim yapar.
@onready var list: VBoxContainer = $Margin/VBox/Scroll/List
@onready var title_label: Label = $Margin/VBox/Title
@onready var close_btn: Button = $Margin/VBox/CloseBtn
@onready var filter_box: HBoxContainer = $Margin/VBox/FilterBox
const SKILL_LABEL := {
"mining": "Madencilik", "fishing": "Balıılık", "foraging": "Bitki Toplama",
"woodcutting": "Ağaç Kesme", "hunting": "Avcılık", "combat": "Dövüş",
"smithing": "Demircilik", "alchemy": "Simyacılık", "cooking": "Yemek Pişirme",
"construction": "İnşa",
}
var _recipes: Array = []
var _filter: String = ""
func _ready() -> void:
visible = false
close_btn.pressed.connect(func(): visible = false)
func open() -> void:
visible = true
title_label.text = "Üretim — yükleniyor..."
_recipes = await GameState.list_recipes()
_build_filters()
_render()
func _build_filters() -> void:
for c in filter_box.get_children():
c.queue_free()
var skills_seen: Dictionary = {}
for r in _recipes:
skills_seen[r["skill"]] = true
var all_btn := Button.new()
all_btn.text = "Tümü"
all_btn.toggle_mode = true
all_btn.button_pressed = _filter == ""
all_btn.pressed.connect(func():
_filter = ""
_render()
_build_filters())
filter_box.add_child(all_btn)
for sk in skills_seen.keys():
var b := Button.new()
b.text = SKILL_LABEL.get(sk, sk)
b.toggle_mode = true
b.button_pressed = _filter == sk
b.pressed.connect(func():
_filter = sk
_render()
_build_filters())
filter_box.add_child(b)
func _render() -> void:
for c in list.get_children():
c.queue_free()
var shown := 0
title_label.text = "Üretim"
for r in _recipes:
if _filter != "" and r["skill"] != _filter:
continue
shown += 1
list.add_child(_make_row(r))
if shown == 0:
var l := Label.new()
l.text = "Bu kategoride tarif yok."
l.add_theme_color_override("font_color", Color(0.6, 0.6, 0.6))
list.add_child(l)
func _make_row(r: Dictionary) -> Control:
var card := PanelContainer.new()
var sb := StyleBoxFlat.new()
sb.bg_color = Color(0.16, 0.18, 0.20, 1) if r.get("craftable", false) else Color(0.12, 0.13, 0.14, 1)
sb.set_corner_radius_all(6)
sb.set_content_margin_all(10)
card.add_theme_stylebox_override("panel", sb)
var vb := VBoxContainer.new()
vb.add_theme_constant_override("separation", 4)
card.add_child(vb)
var top := HBoxContainer.new()
top.add_theme_constant_override("separation", 8)
vb.add_child(top)
var title := Label.new()
title.text = "%s%dx %s" % [str(r["name"]), int(r["output_qty"]), str(r["output_item_name"])]
title.size_flags_horizontal = Control.SIZE_EXPAND_FILL
title.add_theme_font_size_override("font_size", 15)
if not r.get("unlocked", false):
title.add_theme_color_override("font_color", Color(0.55, 0.55, 0.55))
top.add_child(title)
var btn := Button.new()
btn.text = "Üret"
btn.disabled = not r.get("craftable", false)
btn.pressed.connect(_on_craft.bind(str(r["code"])))
top.add_child(btn)
var meta := Label.new()
var skill_tr: String = SKILL_LABEL.get(r["skill"], r["skill"])
meta.text = "%s Lv %d%d adım • +%d XP" % [skill_tr, int(r["required_level"]), int(r["step_cost"]), int(r["xp_reward"])]
meta.add_theme_color_override("font_color", Color(0.7, 0.7, 0.75))
meta.add_theme_font_size_override("font_size", 12)
vb.add_child(meta)
for ing in r["ingredients"]:
var row := Label.new()
var have := int(ing["have"])
var need := int(ing["qty"])
var color: Color = Color(0.6, 0.85, 0.5) if have >= need else Color(0.85, 0.4, 0.4)
row.text = "%s %d/%d" % [str(ing["item_name"]), have, need]
row.add_theme_color_override("font_color", color)
row.add_theme_font_size_override("font_size", 12)
vb.add_child(row)
if not r.get("unlocked", false):
var lock := Label.new()
lock.text = " 🔒 %s Lv %d gerekli" % [skill_tr, int(r["required_level"])]
lock.add_theme_color_override("font_color", Color(0.9, 0.6, 0.3))
lock.add_theme_font_size_override("font_size", 12)
vb.add_child(lock)
return card
func _on_craft(code: String) -> void:
var res: Dictionary = await GameState.craft_recipe(code, 1)
if not res.ok:
var msg := "Üretim başarısız"
if res.body is Dictionary and res.body.has("detail"):
msg = str(res.body["detail"])
print("[craft fail] ", msg)
# Refresh
_recipes = await GameState.list_recipes()
_render()