basic serialization worx*

*
This commit is contained in:
0x81c 2015-03-17 01:59:14 -04:00
parent d76ace8f69
commit 973a8ab25b
41 changed files with 162 additions and 82 deletions

214
room.lua
View file

@ -12,70 +12,80 @@ require "switch"
require "door"
function Room:initialize(t)
self.colorsPlayerHas = {"red", "green", "blue"}
self.exits = t.exits
self.name = t.name
self.player = {}
self.switches = { red = {}, green = {}, blue = {} }
self.switchMatrices = {}
self.doors = {}
self.collideables = { red = {}, green = {}, blue = {} }
self.activeColors = {red = false, green = false, blue = false}
self.colorsPlayerHas = {}
if t.name then
print("loaded!!")
self:load(t.name)
for _, color in ipairs(t.player.activeColors) do
self:registerPlayer(Player:new(t.player.x, t.player.y, color), color)
self:setActiveColor(color, true)
end
self.exits = t.exits
self.name = t.name
else
self.colorsPlayerHas = {"red", "green", "blue"}
for _, color in ipairs(t.player.activeColors) do
self.player[color] = Player:new(t.player.x, t.player.y, color)
end
self.activeColors = {}
for _, color in ipairs(t.player.activeColors) do self.activeColors[color] = true end
-- for color, coords in pairs(t.player) do
-- self.player[color] = Player:new(coords.x, coords.y, color)
-- self.activeColors[color] = true
-- end
for i=1, 1 do
local x, y = randomPosition()
-- local door = Door:new(x, y, self.colorsPlayerHas)
-- table.insert(self.doors, door)
for color, active in pairs(self.activeColors) do
table.insert(self.collideables[color], Wall:new(x, y, color))
end
end
for i=0, 5 do
local x, y = randomPosition()
for color, active in pairs(self.activeColors) do
table.insert(self.collideables[color], Box:new(x, y, color))
end
end
-- for i = 0, 5 do
-- local x, y = randomPosition()
-- print(x, y)
-- local c = randomColor()
-- table.insert(self.switches[c], Switch:new(x, y, c))
-- end
for color, active in pairs(self.activeColors) do
local x, y = 6, 3
-- if active then self.collideables[color]["n: " .. x .. ", " .. y] = Ass:new(x, y, color, "animals/processed/", "me_rach") end
local x, y = 1, 1
if active then table.insert(self.collideables[color], Ass:new(x, y, color, "nature/", "palm_scaled_reduced")) end
-- local x, y = 7, 7
-- if active then self.collideables[color]["n: " .. x .. ", " .. y] = Ass:new(x, y, color, "food/processed/", "beer_mug") end
-- self.collideables[color]["fpp"] = Artifact:new(6, 6, color)
end
end
self.switchMatrices = {}
self.collidableMatrices = {} --{red = {{...}{...}{...}}, ...
for _, color in ipairs(t.player.activeColors) do
self.player[color] = Player:new(t.player.x, t.player.y, color)
end
self.activeColors = {}
for _, color in ipairs(t.player.activeColors) do self.activeColors[color] = true end
-- for color, coords in pairs(t.player) do
-- self.player[color] = Player:new(coords.x, coords.y, color)
-- self.activeColors[color] = true
-- end
for i=1, 1 do
local x, y = randomPosition()
-- local door = Door:new(x, y, self.colorsPlayerHas)
-- table.insert(self.doors, door)
for color, active in pairs(self.activeColors) do
self.collideables[color]["w: " .. x .. ", " .. y] = Wall:new(x, y, color)
end
end
for i=0, 5 do
local x, y = randomPosition()
for color, active in pairs(self.activeColors) do
self.collideables[color]["w: " .. x .. ", " .. y] = Box:new(x, y, color)
end
end
-- for i = 0, 5 do
-- local x, y = randomPosition()
-- print(x, y)
-- local c = randomColor()
-- table.insert(self.switches[c], Switch:new(x, y, c))
-- end
for color, active in pairs(self.activeColors) do
local x, y = 6, 3
-- if active then self.collideables[color]["n: " .. x .. ", " .. y] = Ass:new(x, y, color, "animals/processed/", "me_rach") end
local x, y = 1, 1
if active then self.collideables[color]["n: " .. x .. ", " .. y] = Ass:new(x, y, color, "nature/", "palm_scaled_reduced") end
self.collideables[color]["n: " .. x .. ", " .. y]:getOccupiedCells()
-- local x, y = 7, 7
-- if active then self.collideables[color]["n: " .. x .. ", " .. y] = Ass:new(x, y, color, "food/processed/", "beer_mug") end
-- self.collideables[color]["fpp"] = Artifact:new(6, 6, color)
end
for color, entities in pairs(self.collideables) do
self.collidableMatrices[color] = self:createEntityMatrix(entities)
end
self:createSwitchMatrix()
self:createCollideablesMatrix()
end
@ -126,6 +136,7 @@ function Room:createEntityMatrix(entities)
table.insert(matrix, row)
end
--assumes that entities table is set up li_e {index = ent1, anotherIndex = ent2, ...}
for _, entity in pairs(entities) do
for _, occupiedCells in pairs(entity:getOccupiedCells()) do
@ -134,6 +145,7 @@ function Room:createEntityMatrix(entities)
end
end
-- printMatrix(matrix)
return matrix
end
@ -173,7 +185,7 @@ function Room:movePlayer(key)
} -- this is for reference for each color as we change the targetCells table
local initialTargetEntity
if self:isInBounds(initialTargetCell) then
initialTargetEntity = self:getCellInMatrix(self.collidableMatrices[color], initialTargetCell)
end
@ -362,7 +374,6 @@ function Room:getPossibleColors()
for _, color in ipairs(self.colorsPlayerHas) do
table.insert(colors, color)
print(color)
end
return colors
@ -387,7 +398,6 @@ function Room:tick()
self:createSwitchMatrix()
local setDoorColors = self:switchCheck()
for _, door in pairs(self.doors) do
print(door)
door:setColors(setDoorColors)
end
self:nextRoomCheck()
@ -487,11 +497,66 @@ function Room:nextRoomCheck()
end
end
function Room:createEntity(class, color, x, y)
if class == "Door" then
self:registerDoor(Door:new(x, y))
elseif class == "Wall" then
self:registerCollidable(Wall:new(x, y, color), {color})
elseif class == "Switch" then
self.registerSwitch(Switch:new(x, y), color)
elseif class == "player" then
self:registerPlayer(Player:new(x, y, color), color)
elseif class == "Box" then
self:registerCollidable(Box:new(x, y, color), {color})
elseif class == "npc" then
-- do something soon
elseif class == "Ass" then
--do this later when we have a more definite schema
-- self:registerAssorted(Ass:new(x, y, color, name))
end
end
function Room:registerCollidable(entityPointer, colorArray)
if type(colorArray) ~= "table" then colorArray = {colorArray} end
for _, color in ipairs(colorArray) do
table.insert(self.collideables[color], entityPointer)
end
end
function Room:registerDoor(entityPointer)
table.insert(self.doors, entityPointer)
self:registerCollidable(entityPointer, {"red", "green", "blue"})
end
function Room:registerSwitch(entityPointer, color)
table.insert(self.switches[color], entityPointer)
end
function Room:registerPlayer(entityPointer, color)
table.insert(self.colorsPlayerHas, color)
self.player[color] = entityPointer
end
function Room:load(name)
local room = love.filesystem.read("rooms/" .. name .. ".sav")
self:deserialize(TSerial.unpack(room))
end
function Room:deserialize(saveTable)
for entityClass, entities in pairs(saveTable) do
for _, entity in pairs(entities) do
self:createEntity(entityClass, entity.color, entity.x, entity.y)
end
end
end
function Room:save()
local name = self.name
local level = TSerial.pack(self:serialize(), nil, true)
print(level)
--write level to file
local name = self.name or "test"
local room = TSerial.pack(self:serialize(), nil, true)
local success = love.filesystem.write("rooms/" .. name .. ".sav", room)
if not success then error "great job u fool" end
end
function Room:serialize()
@ -502,7 +567,7 @@ function Room:serialize()
level.player[color] = self:getPlayerObject(color):getSerializationTable()
end
level.doors = {}
level.door = {}
for _, door in pairs(self:getDoors()) do
table.insert(level.door, doors:getSerializationTable())
end
@ -511,20 +576,17 @@ function Room:serialize()
for color, collideableArray in pairs(self:getCollideables()) do
for _, collideable in pairs(collideableArray) do
if not collideable:isInstanceOf("Door") then --for now, we might change doors up some
local entityClass = string.lower(collideable:getClass())
print(entityClass)
local entityClass = collideable:getClass()
if not level[entityClass] then level[entityClass] = {} end
if not level[entityClass][color] then level[entityClass][color] = {} end
table.insert(level[entityClass][color], collideable:getSerializationTable())
table.insert(level[entityClass], collideable:getSerializationTable())
end
end
end
level.switches = {}
level.switch = {}
for color, switchArray in pairs(self:getSwitches()) do
level.switches[color] = {}
for _, switch in ipairs(switchArray) do
table.insert(level.switches[color], switch:getSerializationTable())
table.insert(level.switch, switch:getSerializationTable())
end
end
@ -550,10 +612,12 @@ function nextRoom(pos)
currentRoom:save()
currentRoom = Room:new{
currentRoom = Room:new{
name = "test",
player = {
x = newPos.x, y = newPos.y, activeColors = currentRoom:getActiveColors()
}
}
end