aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-06-29 01:57:32 -0400
committerhistoria <[not public]>2026-06-29 01:57:32 -0400
commit72dbe734015916f98020d6a617981956f0509e26 (patch)
tree52dbe055604fe37fa995d8dea60a27441102320d
parent12ed73f9ff9de1a145683de8a73c170613371979 (diff)
downloadthehouseoficarus-72dbe734015916f98020d6a617981956f0509e26.tar.gz
fix: room addlocalobj command handles multi-word names and aliases
-rw-r--r--data/help/room.yaml4
-rw-r--r--data/rooms/intro/1004.yaml3
-rw-r--r--internal/game/cmd_room.go45
-rw-r--r--internal/game/cmd_room_object.go30
4 files changed, 56 insertions, 26 deletions
diff --git a/data/help/room.yaml b/data/help/room.yaml
index c5c18b0..7965374 100644
--- a/data/help/room.yaml
+++ b/data/help/room.yaml
@@ -7,8 +7,8 @@ description: |-
desc <text> — set room description
addobj <object_id> — add a referenced object
remobj <object_id> — remove a referenced object
- addlocalobj <name> <description> — add a local object
- remlocalobj <name> — remove a local object
+ addlocalobj [name, alias...] <description> — add a local object
+ remlocalobj [name]|<name> — remove a local object
hide <name_or_id> — hide all matching objects
unhide <name_or_id> — unhide all matching objects
addmob <mob_id> — add a mob spawn
diff --git a/data/rooms/intro/1004.yaml b/data/rooms/intro/1004.yaml
index 72cc0e2..45bb882 100644
--- a/data/rooms/intro/1004.yaml
+++ b/data/rooms/intro/1004.yaml
@@ -1,4 +1,4 @@
-id: 0
+id: 1004
name: New Room
color: ""
description:
@@ -6,7 +6,6 @@ description:
exits:
south:
room: 1003
-objects: []
item_spawns: []
mobs: []
on_enter: []
diff --git a/internal/game/cmd_room.go b/internal/game/cmd_room.go
index 11f919a..24763fa 100644
--- a/internal/game/cmd_room.go
+++ b/internal/game/cmd_room.go
@@ -34,8 +34,14 @@ func (g *Game) executeRoom(sess *net.Session, args []string, rawInput string) {
g.roomSetName(sess, rest)
case "desc":
g.roomSetDesc(sess, rest)
- case "addobj", "remobj", "addlocalobj", "remlocalobj", "hide", "unhide":
+ case "addobj", "remobj", "hide", "unhide":
g.roomObject(sess, action, rest)
+ case "addlocalobj":
+ name, aliases, desc := parseLocalObjArgs(rawInput, "addlocalobj")
+ g.roomAddLocalObj(sess, name, aliases, desc)
+ case "remlocalobj":
+ name, _, _ := parseLocalObjArgs(rawInput, "remlocalobj")
+ g.roomRemLocalObj(sess, name)
case "addmob", "remmob":
g.roomMob(sess, action, rest)
case "addspawn", "remspawn":
@@ -52,8 +58,8 @@ func (g *Game) showRoomHelp(sess *net.Session) {
sess.WriteLine(" room desc <text> — set room description")
sess.WriteLine(" room addobj <object_id> — add a referenced object")
sess.WriteLine(" room remobj <object_id> — remove a referenced object")
- sess.WriteLine(" room addlocalobj <name> <description> — add a local object")
- sess.WriteLine(" room remlocalobj <name> — remove a local object")
+ sess.WriteLine(" room addlocalobj [name, alias...] <description> — add a local object")
+ sess.WriteLine(" room remlocalobj [name]|<name> — remove a local object")
sess.WriteLine(" room hide <name_or_id> — hide all matching objects")
sess.WriteLine(" room unhide <name_or_id> — unhide all matching objects")
sess.WriteLine(" room addmob <mob_id> — add a mob spawn")
@@ -98,6 +104,39 @@ func (g *Game) loadRoomWrite(p *player.Player) (*world.Room, string, error) {
return room, path, nil
}
+func parseLocalObjArgs(rawInput, action string) (name string, aliases []string, desc string) {
+ prefix := "room " + action
+ rest := rawInput
+ if idx := strings.Index(strings.ToLower(rest), prefix); idx >= 0 {
+ rest = strings.TrimSpace(rest[idx+len(prefix):])
+ }
+ if rest == "" {
+ return "", nil, ""
+ }
+ if rest[0] == '[' {
+ closeB := strings.Index(rest, "]")
+ if closeB < 0 {
+ return rest, nil, ""
+ }
+ desc = strings.TrimSpace(rest[closeB+1:])
+ for _, p := range strings.Split(rest[1:closeB], ",") {
+ p = strings.TrimSpace(p)
+ if name == "" {
+ name = p
+ } else if p != "" {
+ aliases = append(aliases, p)
+ }
+ }
+ return name, aliases, desc
+ }
+ fields := strings.Fields(rest)
+ name = fields[0]
+ if len(fields) > 1 {
+ desc = strings.Join(fields[1:], " ")
+ }
+ return name, nil, desc
+}
+
func (g *Game) writeRoom(sess *net.Session, fn func(*world.Room)) {
p := sess.Player
room, path, err := g.loadRoomWrite(p)
diff --git a/internal/game/cmd_room_object.go b/internal/game/cmd_room_object.go
index f682d62..713a8f3 100644
--- a/internal/game/cmd_room_object.go
+++ b/internal/game/cmd_room_object.go
@@ -18,10 +18,6 @@ func (g *Game) roomObject(sess *net.Session, action string, args []string) {
g.roomAddObj(sess, args)
case "remobj":
g.roomRemObj(sess, args)
- case "addlocalobj":
- g.roomAddLocalObj(sess, args)
- case "remlocalobj":
- g.roomRemLocalObj(sess, args)
case "hide":
g.roomHide(sess, args)
case "unhide":
@@ -86,17 +82,14 @@ func (g *Game) roomRemObj(sess *net.Session, args []string) {
sess.WriteLine(fmt.Sprintf("Removed object '%s' from room.", objID))
}
-func (g *Game) roomAddLocalObj(sess *net.Session, args []string) {
- if len(args) < 2 {
- sess.WriteLine("Usage: room addlocalobj <name> <description>")
- return
- }
- name := args[0]
- desc := strings.Join(args[1:], " ")
-
+func (g *Game) roomAddLocalObj(sess *net.Session, name string, aliases []string, desc string) {
normName := world.NormalizeObjectName(name)
if normName == "" {
- sess.WriteLine("Invalid object name.")
+ sess.WriteLine("Usage: room addlocalobj [name] <description>")
+ return
+ }
+ if desc == "" {
+ sess.WriteLine("Usage: room addlocalobj [name] <description>")
return
}
@@ -119,7 +112,7 @@ func (g *Game) roomAddLocalObj(sess *net.Session, args []string) {
Local: &object.ObjectDef{
Name: name,
Description: behavior.DescList{{Text: desc}},
- Aliases: []string{name},
+ Aliases: aliases,
},
})
@@ -129,13 +122,12 @@ func (g *Game) roomAddLocalObj(sess *net.Session, args []string) {
sess.WriteLine(fmt.Sprintf("Added local object '%s' to room.", name))
}
-func (g *Game) roomRemLocalObj(sess *net.Session, args []string) {
- if len(args) == 0 {
- sess.WriteLine("Usage: room remlocalobj <name>")
+func (g *Game) roomRemLocalObj(sess *net.Session, name string) {
+ normName := world.NormalizeObjectName(name)
+ if normName == "" {
+ sess.WriteLine("Usage: room remlocalobj [name]")
return
}
- name := args[0]
- normName := world.NormalizeObjectName(name)
p := sess.Player
room, _, err := g.loadRoomWrite(p)