summaryrefslogtreecommitdiff
path: root/client/data/house.lua
diff options
context:
space:
mode:
Diffstat (limited to 'client/data/house.lua')
-rw-r--r--client/data/house.lua123
1 files changed, 123 insertions, 0 deletions
diff --git a/client/data/house.lua b/client/data/house.lua
new file mode 100644
index 0000000..98d54ac
--- /dev/null
+++ b/client/data/house.lua
@@ -0,0 +1,123 @@
+local room = require("room")
+local world = require("world")
+local house = {}
+
+local direction_map = {
+ north = {0,1,0},
+ south = {0,-1,0},
+ east = {1,0,0},
+ west = {-1,0,0},
+ up = {0,0,1},
+ down = {0,0,-1},
+}
+local opposite = {
+ north = "south",
+ south = "north",
+ east = "west",
+ west = "east",
+ up = "down",
+ down = "up"
+}
+local house_base = {
+ create_room = function(self,room_from,direction,roomname)
+ print("create_room called with roomname",roomname)
+ local from_loc = room_from.location
+ local xs,ys,zs = string.match(from_loc,"(%d+)x(%d+)x(%d+)")
+ local x,y,z = tonumber(xs),tonumber(ys),tonumber(zs)
+ local vec = {x,y,z}
+ local sdir = string.lower(direction)
+ assertf(direction_map[sdir],"Could not find direction %s",sdir)
+ local to = direction_map[sdir]
+ for i = 1,3 do
+ vec[i] = vec[i] + to[i]
+ end
+ local newroom_loc = table.concat(vec,"x")
+ print("Creating a room with name", roomname)
+ local newroom = room.create_new(roomname,newroom_loc)
+ print("Settings new room's location to", newroom.location,"newroom is",newroom.name)
+ room_from.go[sdir] = newroom
+ newroom.go[opposite[sdir]] = room_from
+ self.rooms[newroom_loc] = newroom
+ print("After creating room, house's rooms are ")
+ for k,v in pairs(self.rooms) do
+ print(k,v.name)
+ print("can go")
+ for i,j in pairs(v.go) do
+ print("\t",i,j.name)
+ end
+ end
+ end,
+ destroy_room = function(self,room_from,direction)
+ local from_loc = room_from.location
+ local xs,ys,zs = string.match(from_loc,"(%d+)x(%d+)x(%d+)")
+ local x,y,z = tonumber(xs),tonumber(ys),tonumber(zs)
+ local vec = {x,y,z}
+ local sdir = string.lower(direction)
+ assertf(direction_map[sdir],"Could not find direction %s",sdir)
+ local to = direction_map[sdir]
+ for i = 1,3 do
+ vec[i] = vec[i] + to[i]
+ end
+ local roomloc = table.concat(vec,"x")
+ if roomloc == "1x1x1" then --Don't let them destory the origin room
+ fail_hint("You cannot destroy the origin room")
+ return
+ end
+ for dirname,dirvec in pairs(direction_map) do
+ local newvec = {vec[1],vec[2],vec[3]}
+ for i = 1,3 do
+ newvec[i] = newvec[i] + dirvec[i]
+ end
+ local dc_loc = table.concat(newvec,"x")
+ if self.rooms[dc_loc] and self.rooms[dc_loc].go[opposite[dirname]] then
+ self.rooms[dc_loc].go[opposite[dirname]] = nil
+ end
+ end
+ self.rooms[roomloc] = nil
+ end,
+ create_doorway = function(self,room_from, direction)
+ local from_loc = room_from.location
+ local xs,ys,zs = string.match(from_loc,"(%d+)x(%d+)x(%d+)")
+ local x,y,z = tonumber(xs),tonumber(ys),tonumber(zs)
+ local vec = {x,y,z}
+ local sdir = string.lower(direction)
+ for i = 1,3 do
+ vec[i] = vec[i] + direction_map[direction][i]
+ end
+ local otherroom = self.rooms[table.concat(vec,"x")]
+ room_from.go[direction] = otherroom
+ otherroom.go[opposite[direction]] = room_from
+ end,
+ has_room_in_direction = function(self,room_from,direction)
+ direction = string.lower(direction)
+ assertf(direction_map[direction],"Did not understand direction: %q",direction)
+ local from_loc = room_from.location
+ print("From location is:",from_loc)
+ local xs,ys,zs = string.match(from_loc,"(%d+)x(%d+)x(%d+)")
+ local x,y,z = tonumber(xs),tonumber(ys),tonumber(zs)
+ local vec = {x,y,z}
+ for i = 1,3 do
+ vec[i] = vec[i] + direction_map[direction][i]
+ end
+ local sdir = string.lower(direction)
+ return self.rooms[table.concat(vec,"x")] ~= nil
+ end,
+}
+local house_m = {__index=house_base}
+
+function house.create_new(housename,from)
+ local ret = {name = housename, rooms={}, ownerid = playerid, ["in"]=from}
+ ret.rooms["1x1x1"] = room.create_new("Front yard","1x1x1")
+ ret.rooms["1x1x1"].go["south"] = "exit"
+ setmetatable(house,house_m)
+ return ret
+end
+function house.create_from_data(data)
+ local ret = assert(loadstring(data,"loaded_house"))
+ setmetatable(ret,house_m)
+ return ret
+end
+
+house.meta = house_m
+
+return house