diff --git a/TODO b/TODO index 07ef9ab..bda0b2f 100644 --- a/TODO +++ b/TODO @@ -10,4 +10,12 @@ YES -should puzzles be sort of secondary to exploration? li_e should most of all of the npcs should be stuc_ in a cycle of whatever they're doing, focused on it, hav always been focused on it, maybe it has to do w/ the fact that they are always doing 'night activities' -ma_e sprites static class vars instead of globals \ No newline at end of file +ma_e sprites static class vars instead of globals (?) + +so instead of having the exits be a part of the room save, they should be a separate save, e.g., exits.sav w/ a table li_e this: + { + room_name = {top = room_name2, bottom = room_name3} + } +why?? b/c this allows us to visually arrange levels and not have to open every adjacent file (as much as 4!!) and edit them + +go for the feeling of the beginning of eternal sunshine w/ joel's narration, maybe a sense of desperation (does this require urgency?? should the game be time-limited li_e majora's mas_? lol) \ No newline at end of file diff --git a/assorted.lua b/assorted.lua index 650a494..21e426b 100644 --- a/assorted.lua +++ b/assorted.lua @@ -8,6 +8,7 @@ function Ass:initialize(x, y, color, folder, name) x = x, y = y, color = color, + name = name, cellShape = spriteCells["tree"][color], collision = "unmoveable", --player can't push other player sprite = spr diff --git a/color.lua b/color.lua index 1e2d713..bf55340 100644 --- a/color.lua +++ b/color.lua @@ -11,6 +11,7 @@ Color.static.list = { } function Color:initialize(inColor) + self.name = inColor local c = Color.list[inColor] self.r, self.g, self.b, self.a = c.r, c.g, c.b, c.a end @@ -19,6 +20,10 @@ function Color:set() return self.r, self.g, self.b, self.a end +function Color:getname() + return self.name +end + function randomColor() local colors = {"red", "green", "blue"} return colors[math.random(1, 3)] diff --git a/door.lua b/door.lua index a2b0a5c..4a08c20 100644 --- a/door.lua +++ b/door.lua @@ -2,7 +2,7 @@ require "entity" Door = class("Door", Entity) -function Door:initialize(x, y, colors) +function Door:initialize(x, y) Entity.initialize(self, { x = x, y = y, @@ -13,7 +13,7 @@ function Door:initialize(x, y, colors) self.locked = true self.colors = {} - for _, color in pairs(colors) do + for _, color in pairs({"red", "green", "blue"}) do self.colors[color] = true --these are currently loc_ed end end @@ -41,6 +41,7 @@ end function Door:setColors(colors) local offColors = {} + for color, off in pairs(colors) do if off then if self.colors[color] then self.colors[color] = false end diff --git a/entity.lua b/entity.lua index a525f22..7db9ea5 100644 --- a/entity.lua +++ b/entity.lua @@ -5,6 +5,7 @@ function Entity:initialize(t) self.spriteSize = {w = t.sprite:getWidth(), h = t.sprite:getHeight()} self.size = {w = self.spriteSize.w / 16, h = self.spriteSize.h / 16} self.cellShape = t.cellShape or self:cellShapeFromBox(self.size) + self.name = t.name self.color = Color:new(t.color) self.collision = t.collision --"none", "moveable", "unmoveable" self.sprite = t.sprite @@ -123,9 +124,8 @@ end function Entity:getSerializationTable() local pos = self:getGridPos() local table = {} - table.x, table.y, table.color = pos.x, pos.y, color + table.x, table.y, table.color = pos.x, pos.y, self.color:getname() if self.name then table.name = self.name end - return table end diff --git a/main.lua b/main.lua index 57b67c6..6436ca9 100644 --- a/main.lua +++ b/main.lua @@ -92,6 +92,7 @@ end function _initDefaults() --set filter love.graphics.setDefaultFilter("linear", "nearest") + love.filesystem.createDirectory("rooms") --set global width / height variables width = love.graphics.getWidth() diff --git a/room.lua b/room.lua index 2710a8b..47c9654 100644 --- a/room.lua +++ b/room.lua @@ -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 diff --git a/levels/2.sav b/rooms/2.sav similarity index 100% rename from levels/2.sav rename to rooms/2.sav diff --git a/levels/3.sav b/rooms/3.sav similarity index 100% rename from levels/3.sav rename to rooms/3.sav diff --git a/levels/4.sav b/rooms/4.sav similarity index 100% rename from levels/4.sav rename to rooms/4.sav diff --git a/levels/5.sav b/rooms/5.sav similarity index 100% rename from levels/5.sav rename to rooms/5.sav diff --git a/levels/default.sav b/rooms/default.sav similarity index 100% rename from levels/default.sav rename to rooms/default.sav diff --git a/levels/old/ 2.sav b/rooms/old/ 2.sav similarity index 100% rename from levels/old/ 2.sav rename to rooms/old/ 2.sav diff --git a/levels/old/2.sav b/rooms/old/2.sav similarity index 100% rename from levels/old/2.sav rename to rooms/old/2.sav diff --git a/levels/old/3.sav b/rooms/old/3.sav similarity index 100% rename from levels/old/3.sav rename to rooms/old/3.sav diff --git a/levels/old/4.sav b/rooms/old/4.sav similarity index 100% rename from levels/old/4.sav rename to rooms/old/4.sav diff --git a/levels/old/5.sav b/rooms/old/5.sav similarity index 100% rename from levels/old/5.sav rename to rooms/old/5.sav diff --git a/levels/old_yellow_3.sav b/rooms/old_yellow_3.sav similarity index 100% rename from levels/old_yellow_3.sav rename to rooms/old_yellow_3.sav diff --git a/levels/start.sav b/rooms/start.sav similarity index 100% rename from levels/start.sav rename to rooms/start.sav diff --git a/levels/test_patt.sav b/rooms/test_patt.sav similarity index 100% rename from levels/test_patt.sav rename to rooms/test_patt.sav diff --git a/levels/test_patt_update.sav b/rooms/test_patt_update.sav similarity index 100% rename from levels/test_patt_update.sav rename to rooms/test_patt_update.sav diff --git a/levels/village_1.sav b/rooms/village_1.sav similarity index 100% rename from levels/village_1.sav rename to rooms/village_1.sav diff --git a/levels/village_2.sav b/rooms/village_2.sav similarity index 100% rename from levels/village_2.sav rename to rooms/village_2.sav diff --git a/levels/village_3.sav b/rooms/village_3.sav similarity index 100% rename from levels/village_3.sav rename to rooms/village_3.sav diff --git a/levels/village_4.sav b/rooms/village_4.sav similarity index 100% rename from levels/village_4.sav rename to rooms/village_4.sav diff --git a/levels/white_asymmetrical.sav b/rooms/white_asymmetrical.sav similarity index 100% rename from levels/white_asymmetrical.sav rename to rooms/white_asymmetrical.sav diff --git a/levels/white_ok.sav b/rooms/white_ok.sav similarity index 100% rename from levels/white_ok.sav rename to rooms/white_ok.sav diff --git a/levels/white_primary.sav b/rooms/white_primary.sav similarity index 100% rename from levels/white_primary.sav rename to rooms/white_primary.sav diff --git a/levels/yellow_1.sav b/rooms/yellow_1.sav similarity index 100% rename from levels/yellow_1.sav rename to rooms/yellow_1.sav diff --git a/levels/yellow_2.sav b/rooms/yellow_2.sav similarity index 100% rename from levels/yellow_2.sav rename to rooms/yellow_2.sav diff --git a/levels/yellow_3.sav b/rooms/yellow_3.sav similarity index 100% rename from levels/yellow_3.sav rename to rooms/yellow_3.sav diff --git a/levels/yellow_4.sav b/rooms/yellow_4.sav similarity index 100% rename from levels/yellow_4.sav rename to rooms/yellow_4.sav diff --git a/levels/yellow_5.sav b/rooms/yellow_5.sav similarity index 100% rename from levels/yellow_5.sav rename to rooms/yellow_5.sav diff --git a/levels/yellow_6.sav b/rooms/yellow_6.sav similarity index 100% rename from levels/yellow_6.sav rename to rooms/yellow_6.sav diff --git a/levels/yellow_arches.sav b/rooms/yellow_arches.sav similarity index 100% rename from levels/yellow_arches.sav rename to rooms/yellow_arches.sav diff --git a/levels/yellow_asymmetrical.sav b/rooms/yellow_asymmetrical.sav similarity index 100% rename from levels/yellow_asymmetrical.sav rename to rooms/yellow_asymmetrical.sav diff --git a/levels/yellow_cc_moustache.sav b/rooms/yellow_cc_moustache.sav similarity index 100% rename from levels/yellow_cc_moustache.sav rename to rooms/yellow_cc_moustache.sav diff --git a/levels/yellow_color_changing_levvel_1.sav b/rooms/yellow_color_changing_levvel_1.sav similarity index 100% rename from levels/yellow_color_changing_levvel_1.sav rename to rooms/yellow_color_changing_levvel_1.sav diff --git a/levels/yellow_skull.sav b/rooms/yellow_skull.sav similarity index 100% rename from levels/yellow_skull.sav rename to rooms/yellow_skull.sav diff --git a/levels/yellow_smile.sav b/rooms/yellow_smile.sav similarity index 100% rename from levels/yellow_smile.sav rename to rooms/yellow_smile.sav diff --git a/wall.lua b/wall.lua index a9451d9..ee809d3 100644 --- a/wall.lua +++ b/wall.lua @@ -9,9 +9,9 @@ function Wall:initialize(x, y, color) sizeX = 1, sizeY = 1, color = color, - cellShape = spriteCells.test_object, + cellShape = spriteCells.wall, collision = "unmoveable", - sprite = sprites.test_object + sprite = sprites.wall }) end