diff options
Diffstat (limited to 'internal/game/cmd_inspect.go')
| -rw-r--r-- | internal/game/cmd_inspect.go | 147 |
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("") +} |
