diff options
| author | historia <[not public]> | 2026-06-11 04:46:27 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-06-11 08:58:37 +0000 |
| commit | 1b9e2da3b3c438d8dc53d3489725dd5ba0022777 (patch) | |
| tree | 62264f24420bf4cfaa734942c65cc8dd45ba3d3b /internal/game/cmd_look.go | |
| parent | 06c02a697e5daf8832a462de5970dd4c0e13a02c (diff) | |
| download | thehouseoficarus-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.go | 119 |
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 != "" { |
