diff options
Diffstat (limited to 'client/data/house.lua')
| -rw-r--r-- | client/data/house.lua | 123 |
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 |
