İlk commit: Stepstead Godot istemci (4.6 Mobile)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
commit
6a1706051d
346 changed files with 14415 additions and 0 deletions
137
scripts/craft_panel.gd
Normal file
137
scripts/craft_panel.gd
Normal file
|
|
@ -0,0 +1,137 @@
|
|||
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ıkçı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()
|
||||
Loading…
Add table
Add a link
Reference in a new issue