aboutsummaryrefslogtreecommitdiff
path: root/internal/game/cmd_room.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/game/cmd_room.go')
-rw-r--r--internal/game/cmd_room.go45
1 files changed, 42 insertions, 3 deletions
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)