diff options
| author | historia <[not public]> | 2026-06-21 22:19:17 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-06-21 22:19:17 -0400 |
| commit | a3ae1e6aad696f584d138d9363c05dedff136a65 (patch) | |
| tree | 81e615f7227bc9d1ec79ceefc7311ecde917b074 /internal/game/cmd_look.go | |
| parent | 84072ffe6365ad57c4976e9272762aa6db41de7e (diff) | |
| download | thehouseoficarus-a3ae1e6aad696f584d138d9363c05dedff136a65.tar.gz | |
feat: safespot system implemented
Diffstat (limited to 'internal/game/cmd_look.go')
| -rw-r--r-- | internal/game/cmd_look.go | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/internal/game/cmd_look.go b/internal/game/cmd_look.go index 936a6b0..4cc556a 100644 --- a/internal/game/cmd_look.go +++ b/internal/game/cmd_look.go @@ -124,7 +124,11 @@ func (g *Game) showRoomObjects(sess *net.Session, p *player.Player, room *world. for _, objID := range order { count := grouped[objID] def, err := g.ObjectStore.Load(objID) - if err != nil || def.Hidden { + if err != nil { + continue + } + + if def.Hidden && (def.Safespot == nil || g.safespotTier(p) < def.Safespot.Tier) { continue } @@ -132,6 +136,24 @@ func (g *Game) showRoomObjects(sess *net.Session, p *player.Player, room *world. continue } + if def.Hidden && def.Safespot != nil { + st := g.World.GetObjState(p.RoomID, objID, 0) + levelInfo := "" + if st != nil { + if st.SafespotLevel <= 0 && def.Safespot.RespawnTicks > 0 { + continue + } + if st.SafespotLevel <= 0 { + levelInfo = " (destroyed)" + } else if st.SafespotLevel < len(def.Safespot.Levels) { + levelInfo = " (degraded)" + } + } + sess.WriteLine(fmt.Sprintf(" %s that could provide cover.%s", + g.objColorize(sess, def, def.Name), levelInfo)) + continue + } + type instInfo struct { idx int depleted bool @@ -522,6 +544,28 @@ func (g *Game) doLookTarget(sess *net.Session, input string) { sess.WriteLine(fmt.Sprintf(" %s", def.Description)) } + if def.Safespot != nil { + realSt := g.World.GetObjState(p.RoomID, st.DefID, st.Index) + if realSt != nil { + levelStr := "intact" + if realSt.SafespotLevel <= 0 { + levelStr = "destroyed" + } else if realSt.SafespotLevel < len(def.Safespot.Levels) { + levelStr = fmt.Sprintf("degraded (level %d/%d)", realSt.SafespotLevel, len(def.Safespot.Levels)) + } else { + levelStr = fmt.Sprintf("intact (level %d/%d)", realSt.SafespotLevel, len(def.Safespot.Levels)) + } + blockInfo := "anything" + if def.Safespot.MaxBlockSize != "" { + blockInfo = fmt.Sprintf("up to %s mobs", def.Safespot.MaxBlockSize) + } + sess.WriteLine(fmt.Sprintf(" Safespot: %s — blocks %s", levelStr, blockInfo)) + if len(realSt.SafespotOccupants) > 0 { + sess.WriteLine(fmt.Sprintf(" Occupied by: %s", strings.Join(realSt.SafespotOccupants, ", "))) + } + } + } + if p.OptionBool("depletion") { for _, ist := range instances { if ist.Depleted { |
