aboutsummaryrefslogtreecommitdiff
path: root/internal/game
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-07-14 17:13:18 -0400
committerhistoria <[not public]>2026-07-14 17:13:18 -0400
commitbeb188ce050fb76cdddc0bbeedee7ec608e47995 (patch)
treed7c050b30567004ae143d554dcd533f4980e8fd8 /internal/game
parente679811057bedda7864b61a325a11e472e0034ad (diff)
downloadthehouseoficarus-beb188ce050fb76cdddc0bbeedee7ec608e47995.tar.gz
feat: unicode hitsplat symbol, area name in look
Diffstat (limited to 'internal/game')
-rw-r--r--internal/game/act_agility.go2
-rw-r--r--internal/game/cmd_trigger_combat.go2
-rw-r--r--internal/game/combat_attack.go6
-rw-r--r--internal/game/combat_mob.go10
-rw-r--r--internal/game/look_room.go20
-rw-r--r--internal/game/render_combat.go12
-rw-r--r--internal/game/sys_hazard.go2
7 files changed, 39 insertions, 15 deletions
diff --git a/internal/game/act_agility.go b/internal/game/act_agility.go
index 5fbff48..68ecaab 100644
--- a/internal/game/act_agility.go
+++ b/internal/game/act_agility.go
@@ -160,7 +160,7 @@ func (g *Game) obstacleFail(sess *net.Session, p *player.Player, d *behavior.Obs
p.HP = 1
}
sess.WriteLine(g.colorize(sess, "damage_taken",
- fmt.Sprintf("You take %d damage. HP: %d/%d", damage, p.HP, p.MaxHP())))
+ fmt.Sprintf("You take %s damage. HP: %d/%d", g.dmgDisplay(sess, damage), p.HP, p.MaxHP())))
g.AccountStore.SaveCharacter(p)
g.cancelAction(p)
diff --git a/internal/game/cmd_trigger_combat.go b/internal/game/cmd_trigger_combat.go
index ecb4fbb..2f51057 100644
--- a/internal/game/cmd_trigger_combat.go
+++ b/internal/game/cmd_trigger_combat.go
@@ -84,7 +84,7 @@ func (g *Game) scienceAttack(sess *net.Session, p *player.Player, mob *world.Mob
prefix := fmt.Sprintf("%s hits %s for %s damage.",
g.colorize(sess, "science_mod", mod.Name),
g.colorize(sess, "mob", mobName),
- g.colorize(sess, "damage_dealt", fmt.Sprint(dmg)))
+ g.colorize(sess, "damage_dealt", g.dmgDisplay(sess, dmg)))
hpSuffix := fmt.Sprintf("%s [%2d/%d]", g.hpBar(sess, mob.HP, mob.MaxHP), mob.HP, mob.MaxHP)
line := prefix + " " + hpSuffix + g.formatXpDrop(sess, p, gains)
sess.WriteLine(line)
diff --git a/internal/game/combat_attack.go b/internal/game/combat_attack.go
index 6c314ff..11be7f7 100644
--- a/internal/game/combat_attack.go
+++ b/internal/game/combat_attack.go
@@ -405,10 +405,10 @@ func (g *Game) applyPlayerHit(sess *net.Session, p *player.Player, mob *world.Mo
} else {
mobName := mobDisplayName(mob, true)
attacker := mobDisplayNameCap(mob, true)
- prefix := fmt.Sprintf("You hit %s for %s damage.", g.colorize(sess, "mob", mobName), g.colorize(sess, "damage_dealt", fmt.Sprint(dmg)))
+ prefix := fmt.Sprintf("You hit %s for %s damage.", g.colorize(sess, "mob", mobName), g.colorize(sess, "damage_dealt", g.dmgDisplay(sess, dmg)))
prefix = padCombatPrefix(prefix,
- fmt.Sprintf("You hit %s for %d damage.", mobName, 999),
- fmt.Sprintf("%s hits you for %d damage.", attacker, 999))
+ fmt.Sprintf("You hit %s for > %d < damage.", mobName, 999),
+ fmt.Sprintf("%s hits you for > %d < damage.", attacker, 999))
hpSuffix := fmt.Sprintf("%s [%2d/%d]", g.hpBar(sess, mob.HP, mob.MaxHP), mob.HP, mob.MaxHP)
line := prefix + hpSuffix + g.formatXpDrop(sess, p, gains)
sess.WriteLine(line)
diff --git a/internal/game/combat_mob.go b/internal/game/combat_mob.go
index 9affede..55a2ea3 100644
--- a/internal/game/combat_mob.go
+++ b/internal/game/combat_mob.go
@@ -156,10 +156,10 @@ func (g *Game) applyMobHit(sess *net.Session, p *player.Player, mob *world.MobIn
attacker := mobDisplayNameCap(mob, true)
mobName := mobDisplayName(mob, true)
- prefix := fmt.Sprintf("%s hits you for %s damage.", g.colorize(sess, "mob", attacker), g.colorize(sess, "damage_taken", fmt.Sprint(dmg)))
+ prefix := fmt.Sprintf("%s hits you for %s damage.", g.colorize(sess, "mob", attacker), g.colorize(sess, "damage_taken", g.dmgDisplay(sess, dmg)))
prefix = padCombatPrefix(prefix,
- fmt.Sprintf("%s hits you for %d damage.", attacker, 999),
- fmt.Sprintf("You hit %s for %d damage.", mobName, 999))
+ fmt.Sprintf("%s hits you for > %d < damage.", attacker, 999),
+ fmt.Sprintf("You hit %s for > %d < damage.", mobName, 999))
hpSuffix := fmt.Sprintf("%s [%2d/%d]", g.hpBar(sess, p.HP, p.MaxHP()), p.HP, p.MaxHP())
sess.WriteLine(prefix + hpSuffix)
@@ -336,8 +336,8 @@ func (g *Game) killPlayer(sess *net.Session, p *player.Player, mob *world.MobIns
if mob.HP < 0 {
mob.HP = 0
}
- sess.WriteLine(fmt.Sprintf("Dead Man's Switch activates! %s takes %d damage!",
- mobDisplayName(mob, true), retDmg))
+ sess.WriteLine(fmt.Sprintf("Dead Man's Switch activates! %s takes %s damage!",
+ mobDisplayName(mob, true), g.dmgDisplay(sess, retDmg)))
}
}
}
diff --git a/internal/game/look_room.go b/internal/game/look_room.go
index 7fe527f..dc488f0 100644
--- a/internal/game/look_room.go
+++ b/internal/game/look_room.go
@@ -2,6 +2,8 @@ package game
import (
"fmt"
+ "path/filepath"
+ "strings"
"thehouseoficarus/internal/color"
"thehouseoficarus/internal/net"
@@ -11,13 +13,29 @@ import (
)
func (g *Game) showRoomName(sess *net.Session, p *player.Player, room *world.Room) {
- title := fmt.Sprintf("%s (%s)", g.colorize(sess, "room_name", room.Name), g.colorize(sess, "room_number", fmt.Sprintf("#%d", room.ID)))
+ roomIDStr := fmt.Sprintf("#%d", room.ID)
+ if area := g.getRoomArea(room.ID); area != "" {
+ roomIDStr = fmt.Sprintf("%s, #%d", area, room.ID)
+ }
+ title := fmt.Sprintf("%s (%s)", g.colorize(sess, "room_name", room.Name), g.colorize(sess, "room_number", roomIDStr))
if bracket := g.roomSymbolBracket(sess, p, room); bracket != "" {
title += " " + bracket
}
sess.WriteLines("", title)
}
+func (g *Game) getRoomArea(roomID int) string {
+ path, ok := g.World.GetRoomPath(roomID)
+ if !ok {
+ return ""
+ }
+ rel, err := filepath.Rel(filepath.Join(g.DataDir, "rooms"), filepath.Dir(path))
+ if err != nil || rel == "." {
+ return ""
+ }
+ return strings.ReplaceAll(rel, "_", " ")
+}
+
// roomSymbolBracket renders a dim-bracketed colored symbol (e.g. "[D]") when the
// player has set a custom symbol for this room, else "".
func (g *Game) roomSymbolBracket(sess *net.Session, p *player.Player, room *world.Room) string {
diff --git a/internal/game/render_combat.go b/internal/game/render_combat.go
index c3c594c..e4a0d55 100644
--- a/internal/game/render_combat.go
+++ b/internal/game/render_combat.go
@@ -1,13 +1,19 @@
package game
import (
+ "fmt"
+
"thehouseoficarus/internal/net"
"thehouseoficarus/internal/ui"
)
-// renderBar is the shared bar renderer for both HP bars and task-progress bars.
-// lowColor is the color used when the value falls below 40% (167 dusty red for
-// HP, 67 steel blue for progress) -- both palette colors.
+func (g *Game) dmgDisplay(sess *net.Session, dmg int) string {
+ if sess.Player != nil && sess.Player.OptionBool("unicode") {
+ return fmt.Sprintf("\U0001FB38 %d \U0001FB34", dmg)
+ }
+ return fmt.Sprintf("> %d <", dmg)
+}
+
func (g *Game) renderBar(sess *net.Session, current, max, lowColor int) string {
if max <= 0 {
max = 1
diff --git a/internal/game/sys_hazard.go b/internal/game/sys_hazard.go
index 40455fc..3d51b6d 100644
--- a/internal/game/sys_hazard.go
+++ b/internal/game/sys_hazard.go
@@ -128,7 +128,7 @@ func (g *Game) applyHazardHit(sess *net.Session, p *player.Player, hz *world.Haz
msg := hz.HitMessage
switch {
case msg == "":
- msg = fmt.Sprintf("The %s hits you for %d damage.", hz.Name, dmg)
+ msg = fmt.Sprintf("The %s hits you for %s damage.", hz.Name, g.dmgDisplay(sess, dmg))
case strings.Contains(msg, "%d"):
msg = fmt.Sprintf(msg, dmg)
}