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("") }