From 9ed71eeccdaf8d39fed7567c24e6e387226ffba4 Mon Sep 17 00:00:00 2001 From: tolelom <98kimsungmin@naver.com> Date: Tue, 24 Mar 2026 13:45:19 +0900 Subject: [PATCH] feat: room counter, taunt turns, item labels, shop gold display Co-Authored-By: Claude Opus 4.6 (1M context) --- ui/game_view.go | 14 ++++++++++++-- ui/shop_view.go | 30 ++++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/ui/game_view.go b/ui/game_view.go index 9d54b03..3c20b65 100644 --- a/ui/game_view.go +++ b/ui/game_view.go @@ -34,7 +34,17 @@ func renderMap(floor *dungeon.Floor) string { return "" } headerStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("205")).Bold(true) - header := headerStyle.Render(fmt.Sprintf("── Catacombs B%d ──", floor.Number)) + + // Count explored rooms + explored := 0 + for _, r := range floor.Rooms { + if r.Visited || r.Cleared { + explored++ + } + } + total := len(floor.Rooms) + + header := headerStyle.Render(fmt.Sprintf("── Catacombs B%d ── %d/%d Rooms ──", floor.Number, explored, total)) return header + "\n" + dungeon.RenderFloor(floor, floor.CurrentRoom, true) } @@ -266,7 +276,7 @@ func renderEnemyPanel(monsters []*entity.Monster, targetCursor int) string { hpBar := renderHPBar(m.HP, m.MaxHP, 12) taunt := "" if m.TauntTarget { - taunt = styleStatus.Render(" [TAUNTED]") + taunt = styleStatus.Render(fmt.Sprintf(" [TAUNTED %dt]", m.TauntTurns)) } sb.WriteString(fmt.Sprintf(" %s[%d] %s %s %d/%d%s\n\n", marker, i, styleEnemy.Render(m.Name), hpBar, m.HP, m.MaxHP, taunt)) diff --git a/ui/shop_view.go b/ui/shop_view.go index 7afb87c..74b4168 100644 --- a/ui/shop_view.go +++ b/ui/shop_view.go @@ -4,26 +4,52 @@ import ( "fmt" "github.com/charmbracelet/lipgloss" + "github.com/tolelom/catacombs/entity" "github.com/tolelom/catacombs/game" ) +func itemTypeLabel(item entity.Item) string { + switch item.Type { + case entity.ItemWeapon: + return fmt.Sprintf("[ATK+%d]", item.Bonus) + case entity.ItemArmor: + return fmt.Sprintf("[DEF+%d]", item.Bonus) + case entity.ItemConsumable: + return fmt.Sprintf("[HP+%d]", item.Bonus) + default: + return fmt.Sprintf("[+%d]", item.Bonus) + } +} + func renderShop(state game.GameState, width, height int, shopMsg string) string { headerStyle := lipgloss.NewStyle(). Foreground(lipgloss.Color("226")). Bold(true) + goldStyle := lipgloss.NewStyle(). + Foreground(lipgloss.Color("220")) msgStyle := lipgloss.NewStyle(). Foreground(lipgloss.Color("196")). Bold(true) header := headerStyle.Render("── Shop ──") + + // Show current player's gold + goldLine := "" + for _, p := range state.Players { + inventoryCount := len(p.Inventory) + goldLine += goldStyle.Render(fmt.Sprintf(" %s — Gold: %d Items: %d/10", p.Name, p.Gold, inventoryCount)) + goldLine += "\n" + } + items := "" for i, item := range state.ShopItems { - items += fmt.Sprintf(" [%d] %s (+%d) — %d gold\n", i+1, item.Name, item.Bonus, item.Price) + label := itemTypeLabel(item) + items += fmt.Sprintf(" [%d] %s %s — %d gold\n", i+1, item.Name, label, item.Price) } menu := "[1-3] Buy [Q] Leave Shop" - parts := []string{header, "", items, "", menu} + parts := []string{header, "", goldLine, items, "", menu} if shopMsg != "" { parts = append(parts, "", msgStyle.Render(shopMsg)) }