aboutsummaryrefslogtreecommitdiff
path: root/internal/game/cmd_inspect.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-06-28 02:40:30 -0400
committerhistoria <[not public]>2026-06-28 02:40:30 -0400
commita1b6613c6c6a2f8d6e1ecd47e766bd40f92ac295 (patch)
tree4ff8fefb029c93f2aa3db7361658b0b4e9805b66 /internal/game/cmd_inspect.go
parent87dacfbb3dd16e7f55a82361eace98f9a39d75c8 (diff)
downloadthehouseoficarus-a1b6613c6c6a2f8d6e1ecd47e766bd40f92ac295.tar.gz
feat: admin accounts, god mode, OLC commands like dig/room, 'inline' objects changed to 'local' objects
Diffstat (limited to 'internal/game/cmd_inspect.go')
-rw-r--r--internal/game/cmd_inspect.go147
1 files changed, 147 insertions, 0 deletions
diff --git a/internal/game/cmd_inspect.go b/internal/game/cmd_inspect.go
new file mode 100644
index 0000000..62392b7
--- /dev/null
+++ b/internal/game/cmd_inspect.go
@@ -0,0 +1,147 @@
+package game
+
+import (
+ "fmt"
+
+ "thehouseoficarus/internal/net"
+ "thehouseoficarus/internal/world"
+)
+
+func (g *Game) executeInspect(sess *net.Session, args []string, rawInput string) {
+ if !g.checkAdmin(sess) {
+ sess.WriteLine("Unknown command.")
+ return
+ }
+ p := sess.Player
+ if p == nil {
+ return
+ }
+
+ room, err := g.World.LoadRoom(p.RoomID)
+ if err != nil {
+ sess.WriteLine("Error loading room.")
+ return
+ }
+
+ sess.WriteLine(fmt.Sprintf("=== Room #%d: %s ===", room.ID, room.Name))
+ if room.Color != "" {
+ sess.WriteLine(fmt.Sprintf("Color: %s", room.Color))
+ }
+ if room.Hazard != "" {
+ hazardName := room.Hazard
+ if hz, herr := g.World.LoadHazard(room.Hazard); herr == nil && hz.Name != "" {
+ hazardName = hz.Name
+ }
+ sess.WriteLine(fmt.Sprintf("Hazard: %s (%s)", room.Hazard, hazardName))
+ }
+ if room.BlockTransport {
+ sess.WriteLine("BlockTransport: true")
+ }
+
+ sess.WriteLine(fmt.Sprintf("\nExits (%d):", len(room.Exits)))
+ for _, dir := range world.ExitOrder {
+ if exit, ok := room.Exits[dir]; ok {
+ cond := ""
+ if exit.Condition != nil {
+ cond = " [conditional]"
+ }
+ sess.WriteLine(fmt.Sprintf(" %s -> Room #%d%s", dir, exit.Room, cond))
+ }
+ }
+
+ sess.WriteLine(fmt.Sprintf("\nObjects (%d):", len(room.Objects)))
+ for _, obj := range room.Objects {
+ kind := "global"
+ if obj.Local != nil {
+ kind = "local"
+ }
+ hidden := ""
+ if obj.Local != nil && obj.Local.Hidden {
+ hidden = " [hidden]"
+ } else if obj.HiddenOverride {
+ hidden = " [hidden]"
+ }
+ wander := ""
+ if len(obj.WanderRooms) > 0 {
+ wander = fmt.Sprintf(" [wanders:%d,%.0fs]", len(obj.WanderRooms), obj.WanderInterval)
+ }
+ sess.WriteLine(fmt.Sprintf(" %s (%s)%s%s", obj.ID, kind, hidden, wander))
+ }
+
+ sess.WriteLine(fmt.Sprintf("\nMobs (%d):", len(room.Mobs)))
+ for _, mob := range room.Mobs {
+ wander := ""
+ if mob.WanderInterval > 0 {
+ wander = fmt.Sprintf(" [wander:%.0ft]", mob.WanderInterval)
+ }
+ sess.WriteLine(fmt.Sprintf(" %s%s", mob.ID, wander))
+ }
+
+ if len(room.ItemSpawns) > 0 {
+ sess.WriteLine(fmt.Sprintf("\nItem Spawns (%d):", len(room.ItemSpawns)))
+ for _, spawn := range room.ItemSpawns {
+ sess.WriteLine(fmt.Sprintf(" %s x%d (respawn: %.0ft)", spawn.ID, spawn.Quantity, spawn.RespawnTicks))
+ }
+ }
+
+ if len(room.OnEnter) > 0 {
+ sess.WriteLine(fmt.Sprintf("\nOn-Enter Steps: %d", len(room.OnEnter)))
+ }
+
+ if len(room.Triggers) > 0 {
+ sess.WriteLine(fmt.Sprintf("\nRoom Triggers: %d", len(room.Triggers)))
+ for _, trigger := range room.Triggers {
+ kind := ""
+ if trigger.OnFlag != "" {
+ kind = fmt.Sprintf("world flag %q", trigger.OnFlag)
+ } else if trigger.OnPlayerFlag != "" {
+ kind = fmt.Sprintf("player flag %q", trigger.OnPlayerFlag)
+ }
+ sess.WriteLine(fmt.Sprintf(" %s: %s (%d steps)", trigger.ID, kind, len(trigger.Steps)))
+ }
+ }
+
+ sess.WriteLine("\n--- World Flags ---")
+ allFlags := g.Flags.All()
+ if len(allFlags) == 0 {
+ sess.WriteLine(" (none)")
+ } else {
+ for k, v := range allFlags {
+ sess.WriteLine(fmt.Sprintf(" %s = %v", k, v))
+ }
+ }
+
+ sess.WriteLine("\n--- Your Flags ---")
+ p.EnsureFlags()
+ if len(p.Flags) == 0 {
+ sess.WriteLine(" (none)")
+ } else {
+ for k, v := range p.Flags {
+ sess.WriteLine(fmt.Sprintf(" %s = %v", k, v))
+ }
+ }
+
+ if g.Hub != nil {
+ players := g.Hub.PlayersInRoom(p.RoomID)
+ sess.WriteLine(fmt.Sprintf("\n--- Players Here (%d) ---", len(players)))
+ for _, ps := range players {
+ if ps.Player != nil {
+ marker := ""
+ if ps.Player.Name == p.Name {
+ marker = " (you)"
+ }
+ sess.WriteLine(fmt.Sprintf(" %s%s", ps.Player.Name, marker))
+ }
+ }
+ }
+
+ mobs := g.MobStore.MobsInRoom(p.RoomID)
+ if len(mobs) > 0 {
+ sess.WriteLine(fmt.Sprintf("\n--- Live Mobs Here (%d) ---", len(mobs)))
+ for _, m := range mobs {
+ sess.WriteLine(fmt.Sprintf(" %s (HP: %d/%d, def: %s)", m.Name, m.HP, m.MaxHP, m.DefID))
+ }
+ }
+
+ sess.WriteLine("")
+}