aboutsummaryrefslogtreecommitdiff
path: root/internal/game/ui_prompt.go
diff options
context:
space:
mode:
authorworkhorse <workhorse@localhost.localdomain>2026-06-19 20:24:52 -0400
committerworkhorse <workhorse@localhost.localdomain>2026-06-19 20:24:52 -0400
commit8ee8982b8759bcae116647cc993867f4c8b0a6ce (patch)
treeee01f7b1d745cbc94d9981108a1209527487b3e5 /internal/game/ui_prompt.go
parent2bec24859af8f03c80a0a58e3240519942450167 (diff)
downloadthehouseoficarus-8ee8982b8759bcae116647cc993867f4c8b0a6ce.tar.gz
reorganized items, objects, and rooms in directories. oranized module names. added startup checks.
Diffstat (limited to 'internal/game/ui_prompt.go')
-rw-r--r--internal/game/ui_prompt.go100
1 files changed, 100 insertions, 0 deletions
diff --git a/internal/game/ui_prompt.go b/internal/game/ui_prompt.go
new file mode 100644
index 0000000..2ecf367
--- /dev/null
+++ b/internal/game/ui_prompt.go
@@ -0,0 +1,100 @@
+package game
+
+import (
+ "fmt"
+ "strings"
+
+ "thehouseoficarus/internal/color"
+ "thehouseoficarus/internal/combat"
+ "thehouseoficarus/internal/net"
+ "thehouseoficarus/internal/player"
+)
+
+func (g *Game) promptStr(sess *net.Session) string {
+ prompt := "> "
+ if p := sess.Player; p != nil {
+ if p.Prompt != "" {
+ prompt = p.Prompt
+ }
+ }
+
+ prompt = g.expandPromptColors(sess, prompt)
+ prompt = g.expandPromptVars(sess, prompt)
+ return prompt
+}
+
+func (g *Game) expandPromptColors(sess *net.Session, text string) string {
+ return color.ExpandTags(g.colorMode(sess), text)
+}
+
+func (g *Game) expandPromptVars(sess *net.Session, text string) string {
+ p := sess.Player
+ if p == nil {
+ return text
+ }
+
+ text = strings.ReplaceAll(text, "%%", "\x00")
+ text = strings.ReplaceAll(text, "%h", fmt.Sprint(p.HP))
+ text = strings.ReplaceAll(text, "%H", fmt.Sprint(p.MaxHP()))
+ text = strings.ReplaceAll(text, "%b", fmt.Sprintf("%.1f", p.Battery))
+ text = strings.ReplaceAll(text, "%B", fmt.Sprintf("%.0f", p.MaxBattery()))
+ text = strings.ReplaceAll(text, "%c", fmt.Sprint(p.Credits))
+ text = strings.ReplaceAll(text, "%i", fmt.Sprint(p.FreeSlots()))
+ text = strings.ReplaceAll(text, "%s", attackStyleShort(p.AttackStyle))
+ text = strings.ReplaceAll(text, "%S", attackStyleLong(p.AttackStyle))
+
+ mobHP, mobMaxHP := "", ""
+ if cs := combat.GetCombat(p.Name); cs != nil {
+ mob := g.MobStore.GetInstance(cs.MobID)
+ if mob != nil && mob.HP > 0 {
+ mobHP = fmt.Sprint(mob.HP)
+ mobMaxHP = fmt.Sprint(mob.MaxHP)
+ }
+ }
+ text = strings.ReplaceAll(text, "%m", mobHP)
+ text = strings.ReplaceAll(text, "%M", mobMaxHP)
+
+ for _, sk := range player.AllSkills {
+ tag := string(sk)
+ text = strings.ReplaceAll(text, "%X_"+tag, fmt.Sprint(p.Skills[sk]))
+ text = strings.ReplaceAll(text, "%x_"+tag, fmt.Sprint(xpToLevel(p, sk)))
+ }
+
+ text = strings.ReplaceAll(text, "\x00", "%")
+ return text
+}
+
+func attackStyleShort(s player.AttackStyle) string {
+ switch s {
+ case player.Accurate:
+ return "acc"
+ case player.Aggressive:
+ return "agg"
+ case player.Defensive:
+ return "def"
+ case player.Balanced:
+ return "bal"
+ }
+ return "acc"
+}
+
+func attackStyleLong(s player.AttackStyle) string {
+ switch s {
+ case player.Accurate:
+ return "accurate"
+ case player.Aggressive:
+ return "aggressive"
+ case player.Defensive:
+ return "defensive"
+ case player.Balanced:
+ return "balanced"
+ }
+ return "accurate"
+}
+
+func xpToLevel(p *player.Player, sk player.SkillName) int {
+ currentXP := p.Skills[sk]
+ currentLevel := p.Level(sk)
+ nextLevelXP := player.XPForLevel(currentLevel + 1)
+ return nextLevelXP - currentXP
+}