Files
pncdsl/ui.defaults.go
2026-05-25 21:28:17 +02:00

126 lines
4.3 KiB
Go
Raw Permalink 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.
package pncdsl
// RegisterDefaultUI installs the SCUMM-style HUD widgets into g.UIManager
// in the conventional Z-order (HotspotDebug at the back, Cursor on top).
// Domains that want a different layout call this and then either tweak
// the registered widgets in place or replace them entirely.
//
// Layout assumes the default 320×200 internal resolution.
func RegisterDefaultUI(g *Game) {
g.UIManager.Register(&HotspotDebug{Name: "hotspot_debug"})
g.UIManager.Register(&VerbBar{
Name: "verbs",
Origin: Point{X: 4, Y: 152},
Cols: 2,
Button: Size{W: 60, H: 14},
})
g.UIManager.Register(&InventoryBar{
Name: "inventory",
Origin: Point{X: 132, Y: 152},
Slots: 8,
Cols: 8,
SlotSize: 22,
Gap: 2,
})
g.UIManager.Register(&StatusLine{Name: "status", Y: 142, Align: AlignCenter})
g.UIManager.Register(&SpeechBubble{Name: "speech", MaxWidth: 200, Padding: 3, OffsetY: 4, FallbackY: 14})
g.UIManager.Register(&DialogBox{Name: "dialog", Bounds: Rect(0, 140, float64(g.Width), 60), LineHeight: 14, Padding: 6})
g.UIManager.Register(&EndCard{Name: "endcard"})
g.UIManager.Register(&Cursor{Name: "cursor"})
}
// RegisterRichUI installs a "story-rich" HUD that matches the layout of
// the screenshot used as the reference: top bar with title/score/time,
// floating character panels for the player and a single NPC, a chat-log
// strip at the bottom-left, a tiny inventory at the bottom-right and a
// permanent verb-wheel on the right edge.
//
// The HUD assumes the default 320×200 internal resolution and that
// PlayerName / NPCName correspond to registered characters. Pass "" for
// NPCName to skip the NPC panel.
func RegisterRichUI(g *Game, playerName, npcName string) {
g.UIManager.Register(&TopBar{
Name: "topbar",
Height: 12,
ScoreVar: "score", ScoreMax: 100,
TimeVar: "time",
})
g.UIManager.Register(&HotspotDebug{Name: "hotspot_debug"})
if playerName != "" {
g.UIManager.Register(&CharacterPanel{
Name: "panel_player",
Bounds: Rect(2, 14, 92, 36),
Character: playerName,
Title: "PLAYER",
Stats: []CharStat{
{Label: "State", VarKey: playerName + ".state"},
{Label: "Mood", VarKey: playerName + ".mood"},
},
})
}
if npcName != "" {
g.UIManager.Register(&CharacterPanel{
Name: "panel_npc",
Bounds: Rect(180, 14, 92, 36),
Character: npcName,
Title: "NPC",
Stats: []CharStat{
{Label: "State", VarKey: npcName + ".state"},
{Label: "Mood", VarKey: npcName + ".mood"},
},
})
}
g.UIManager.Register(&InventoryBar{
Name: "inventory",
Origin: Point{X: 4, Y: 188},
Slots: 8,
Cols: 8,
SlotSize: 10,
Gap: 1,
})
g.UIManager.Register(&ChatLog{
Name: "chat",
Bounds: Rect(2, 148, 280, 38),
LineHeight: 9,
Padding: 3,
ShowBorder: true,
})
g.UIManager.Register(&RadialVerbs{
Name: "verbs",
AlwaysVisible: true,
Center: Point{X: 282, Y: 90},
Radius: 36,
Labels: map[string]string{
"look": "Néz",
"use": "Tedd",
"talk": "Szól",
"take": "Vedd",
},
})
g.UIManager.Register(&SpeechBubble{Name: "speech", MaxWidth: 200, Padding: 3, OffsetY: 4, FallbackY: 18})
g.UIManager.Register(&DialogBox{Name: "dialog", Bounds: Rect(0, 90, float64(g.Width), 56), LineHeight: 12, Padding: 6})
g.UIManager.Register(&EndCard{Name: "endcard"})
g.UIManager.Register(&Cursor{Name: "cursor"})
}
// RegisterRadialVerbUI installs an alternative HUD that swaps the
// permanent verb-bar for a verb-coin (right-click radial menu). Inventory,
// dialog, speech and cursor stay the same.
func RegisterRadialVerbUI(g *Game) {
g.UIManager.Register(&HotspotDebug{Name: "hotspot_debug"})
g.UIManager.Register(&InventoryBar{
Name: "inventory",
Origin: Point{X: 4, Y: 178},
Slots: 14,
Cols: 14,
SlotSize: 22,
Gap: 0,
})
g.UIManager.Register(&StatusLine{Name: "status", Y: 168, Align: AlignCenter})
g.UIManager.Register(&SpeechBubble{Name: "speech", MaxWidth: 200, Padding: 3, OffsetY: 4, FallbackY: 14})
g.UIManager.Register(&DialogBox{Name: "dialog", Bounds: Rect(0, 140, float64(g.Width), 60), LineHeight: 14, Padding: 6})
g.UIManager.Register(&RadialVerbs{Name: "verbs", Trigger: MouseButtonRight, Radius: 40})
g.UIManager.Register(&EndCard{Name: "endcard"})
g.UIManager.Register(&Cursor{Name: "cursor"})
}