package game import ( "fmt" "os" "strings" "gopkg.in/yaml.v3" "thehouseoficarus/internal/behavior" "thehouseoficarus/internal/net" "thehouseoficarus/internal/player" "thehouseoficarus/internal/world" ) func (g *Game) executeRoom(sess *net.Session, args []string, rawInput string) { if !g.checkAdmin(sess) { sess.WriteLine("Unknown command.") return } p := sess.Player if p == nil { return } if len(args) == 0 { g.showRoomHelp(sess) return } action := strings.ToLower(args[0]) rest := args[1:] switch action { case "name": g.roomSetName(sess, rest) case "desc": g.roomSetDesc(sess, rest) case "addobj", "remobj", "addlocalobj", "remlocalobj", "hide", "unhide": g.roomObject(sess, action, rest) case "addmob", "remmob": g.roomMob(sess, action, rest) case "addspawn", "remspawn": g.roomSpawn(sess, action, rest) default: sess.WriteLine(fmt.Sprintf("Unknown room action: %s", action)) g.showRoomHelp(sess) } } func (g *Game) showRoomHelp(sess *net.Session) { sess.WriteLine("room actions:") sess.WriteLine(" room name — set room name") sess.WriteLine(" room desc — set room description") sess.WriteLine(" room addobj — add a referenced object") sess.WriteLine(" room remobj — remove a referenced object") sess.WriteLine(" room addlocalobj — add a local object") sess.WriteLine(" room remlocalobj — remove a local object") sess.WriteLine(" room hide — hide all matching objects") sess.WriteLine(" room unhide — unhide all matching objects") sess.WriteLine(" room addmob — add a mob spawn") sess.WriteLine(" room remmob — remove a mob spawn") sess.WriteLine(" room addspawn [qty] [respawn_ticks] — add an item spawn") sess.WriteLine(" room remspawn — remove an item spawn") } func (g *Game) roomSetName(sess *net.Session, args []string) { if len(args) == 0 { sess.WriteLine("Usage: room name ") return } text := strings.Join(args, " ") g.writeRoom(sess, func(room *world.Room) { room.Name = text }) sess.WriteLine(fmt.Sprintf("Room name set to: %s", text)) } func (g *Game) roomSetDesc(sess *net.Session, args []string) { if len(args) == 0 { sess.WriteLine("Usage: room desc ") return } text := strings.Join(args, " ") g.writeRoom(sess, func(room *world.Room) { room.Description = behavior.DescList{{Text: text}} }) sess.WriteLine("Room description updated.") } func (g *Game) loadRoomWrite(p *player.Player) (*world.Room, string, error) { path, ok := g.World.GetRoomPath(p.RoomID) if !ok { return nil, "", fmt.Errorf("room file not found") } room, err := g.World.LoadRoom(p.RoomID) if err != nil { return nil, "", err } return room, path, nil } func (g *Game) writeRoom(sess *net.Session, fn func(*world.Room)) { p := sess.Player room, path, err := g.loadRoomWrite(p) if err != nil { sess.WriteLine(fmt.Sprintf("Error loading room: %v", err)) return } fn(room) data, err := yaml.Marshal(room) if err != nil { sess.WriteLine("Error marshaling room YAML.") return } if err := os.WriteFile(path, data, 0644); err != nil { sess.WriteLine("Error writing room file.") return } }