aboutsummaryrefslogtreecommitdiff
path: root/internal/game/cmd_look.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-06-11 04:46:27 -0400
committerhistoria <[not public]>2026-06-11 08:58:37 +0000
commit1b9e2da3b3c438d8dc53d3489725dd5ba0022777 (patch)
tree62264f24420bf4cfaa734942c65cc8dd45ba3d3b /internal/game/cmd_look.go
parent06c02a697e5daf8832a462de5970dd4c0e13a02c (diff)
downloadthehouseoficarus-1b9e2da3b3c438d8dc53d3489725dd5ba0022777.tar.gz
feat: web client, get/drop updates and fixes
Diffstat (limited to 'internal/game/cmd_look.go')
-rw-r--r--internal/game/cmd_look.go119
1 files changed, 92 insertions, 27 deletions
diff --git a/internal/game/cmd_look.go b/internal/game/cmd_look.go
index e7d30d6..48b7daf 100644
--- a/internal/game/cmd_look.go
+++ b/internal/game/cmd_look.go
@@ -79,41 +79,94 @@ func (g *Game) doLook(sess *net.Session) {
continue
}
- var activeIdxs, depletedIdxs []int
+ type instInfo struct {
+ idx int
+ depleted bool
+ sharedMax int
+ sharedCur int
+ respawnIn int
+ }
+ var instances []instInfo
for i := 0; i < count; i++ {
st := g.World.GetObjState(p.RoomID, objID, i)
- if st != nil && st.Depleted {
- depletedIdxs = append(depletedIdxs, i+1)
- } else {
- activeIdxs = append(activeIdxs, i+1)
+ if st == nil {
+ continue
}
+ instances = append(instances, instInfo{
+ idx: i + 1,
+ depleted: st.Depleted,
+ sharedMax: st.SharedMax,
+ sharedCur: st.SharedTimer,
+ respawnIn: st.DepleteTimer,
+ })
}
+ multi := len(instances) > 1
+ showTimers := p.Toggles["depletion"]
- if len(activeIdxs) > 0 {
- if len(activeIdxs) == 1 {
- sess.Write(fmt.Sprintf(" A %s is here.", def.Name))
+ var freshIdxs []int
+ var timed, depleted []instInfo
+ for _, ins := range instances {
+ if ins.depleted {
+ depleted = append(depleted, ins)
+ } else if ins.sharedMax > 0 && ins.sharedCur < ins.sharedMax {
+ timed = append(timed, ins)
} else {
- sess.Write(fmt.Sprintf(" %d %ss are here.", len(activeIdxs), def.Name))
+ freshIdxs = append(freshIdxs, ins.idx)
+ }
+ }
+
+ if len(freshIdxs) > 0 {
+ var suffix string
+ if multi && (len(timed) > 0 || len(depleted) > 0) {
+ suffix = fmt.Sprintf(" [%s]", intsJoin(freshIdxs))
}
- if count > 1 {
- sess.WriteLine(fmt.Sprintf(" [%s]", intsJoin(activeIdxs)))
+ if len(freshIdxs) == 1 {
+ sess.WriteLine(fmt.Sprintf(" A %s is here.%s", def.Name, suffix))
} else {
- sess.WriteLine("")
+ sess.WriteLine(fmt.Sprintf(" %d %ss are here.%s", len(freshIdxs), def.Name, suffix))
}
}
- if len(depletedIdxs) > 0 {
- if len(depletedIdxs) == 1 {
- sess.Write(fmt.Sprintf(" 1 depleted %s is here.", def.Name))
- } else {
- sess.Write(fmt.Sprintf(" %d depleted %ss are here.", len(depletedIdxs), def.Name))
+
+ for _, ins := range timed {
+ tag := ""
+ if multi {
+ tag = fmt.Sprintf(" [%d]", ins.idx)
+ }
+ timer := ""
+ if showTimers {
+ timer = fmt.Sprintf(" (despawn: %d/%d)", ins.sharedCur, ins.sharedMax)
}
- sess.WriteLine(fmt.Sprintf(" [%s]", intsJoin(depletedIdxs)))
+ sess.WriteLine(fmt.Sprintf(" A %s is here.%s%s", def.Name, tag, timer))
+ }
+
+ for _, ins := range depleted {
+ tag := ""
+ if multi {
+ tag = fmt.Sprintf(" [%d]", ins.idx)
+ }
+ timer := ""
+ if showTimers {
+ timer = fmt.Sprintf(" (respawns in %d ticks)", ins.respawnIn)
+ }
+ sess.WriteLine(fmt.Sprintf(" 1 depleted %s is here.%s%s", def.Name, tag, timer))
}
}
}
ground := g.World.GroundItemsDetailed(p.RoomID)
if len(ground) > 0 {
+ sort.Slice(ground, func(i, j int) bool {
+ ni := ground[i].ItemID
+ if def, err := g.ItemStore.Load(ground[i].ItemID); err == nil {
+ ni = def.Name
+ }
+ nj := ground[j].ItemID
+ if def, err := g.ItemStore.Load(ground[j].ItemID); err == nil {
+ nj = def.Name
+ }
+ return strings.ToLower(ni) < strings.ToLower(nj)
+ })
+
sess.WriteLine("")
sess.WriteLine("On the ground:")
@@ -281,12 +334,20 @@ func (g *Game) doLookTarget(sess *net.Session, input string) {
sess.WriteLine(fmt.Sprintf(" %s", desc))
}
- for _, ist := range instances {
- if ist.Depleted {
- if len(instances) > 1 {
- sess.WriteLine(fmt.Sprintf(" %s %d: depleted for %d more ticks.", def.Name, ist.Index+1, ist.DepleteTimer))
- } else {
- sess.WriteLine(fmt.Sprintf(" Depleted for %d more ticks.", ist.DepleteTimer))
+ if p.Toggles["depletion"] {
+ for _, ist := range instances {
+ if ist.Depleted {
+ if len(instances) > 1 {
+ sess.WriteLine(fmt.Sprintf(" %s %d: depleted, respawns in %d ticks.", def.Name, ist.Index+1, ist.DepleteTimer))
+ } else {
+ sess.WriteLine(fmt.Sprintf(" Depleted, respawns in %d ticks.", ist.DepleteTimer))
+ }
+ } else if ist.SharedMax > 0 && ist.SharedTimer < ist.SharedMax {
+ if len(instances) > 1 {
+ sess.WriteLine(fmt.Sprintf(" %s %d: despawn timer %d/%d.", def.Name, ist.Index+1, ist.SharedTimer, ist.SharedMax))
+ } else {
+ sess.WriteLine(fmt.Sprintf(" Despawn timer: %d/%d ticks.", ist.SharedTimer, ist.SharedMax))
+ }
}
}
}
@@ -335,14 +396,14 @@ func (g *Game) doLookTarget(sess *net.Session, input string) {
if strings.ToLower(op.Name) != lower {
continue
}
- showPlayerInfo(sess, op)
+ showPlayerInfo(g, sess, op)
return
}
sess.WriteLine(fmt.Sprintf("There's no '%s' here.", input))
}
-func showPlayerInfo(sess *net.Session, p *player.Player) {
+func showPlayerInfo(g *Game, sess *net.Session, p *player.Player) {
sess.WriteLines(
"",
p.Name,
@@ -363,7 +424,11 @@ func showPlayerInfo(sess *net.Session, p *player.Player) {
if !ok {
continue
}
- sess.WriteLine(fmt.Sprintf(" %-12s %s", slot, itemID))
+ name := itemID
+ if def, err := g.ItemStore.Load(itemID); err == nil {
+ name = def.Name
+ }
+ sess.WriteLine(fmt.Sprintf(" %-12s %s", slot, name))
}
if p.Description != "" {