summaryrefslogtreecommitdiff
path: root/game.lua
diff options
context:
space:
mode:
Diffstat (limited to 'game.lua')
-rw-r--r--game.lua154
1 files changed, 154 insertions, 0 deletions
diff --git a/game.lua b/game.lua
new file mode 100644
index 0000000..1146f1f
--- /dev/null
+++ b/game.lua
@@ -0,0 +1,154 @@
+-- Namespace.
+local Game = {}
+
+-- Import.
+Game.newRoom = require "room"
+Game.newPlayer = require "player"
+Game.newProp = require "prop"
+Game.newMessage = require "message"
+Game.quads = require "quads"
+
+-- Various children.
+Game.sprites = {}
+Game.rooms = {}
+Game.props = {}
+Game.player = nil
+Game.message = nil
+Game.delay = 0.08
+Game.initial = Game.delay
+
+-- Aliases for window size getters.
+Game.getWidth = love.graphics.getWidth
+Game.getHeight = love.graphics.getHeight
+
+-- Loads sprites atlases.
+function Game.load()
+ -- Font
+ Game.font = love.graphics.newImageFont("assets/font.png", " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.,:;-_/\\!@#$%^&*?=+~`|'\"()[]{}<>", 1)
+ Game.font:setLineHeight(0.875)
+ love.graphics.setFont(Game.font)
+ -- Spritesheets
+ Game.sprites.player = love.graphics.newImage("assets/player.png")
+ Game.sprites.room = love.graphics.newImage("assets/rooms.png")
+ Game.sprites.door = love.graphics.newImage("assets/door.png")
+ Game.sprites.console = love.graphics.newImage("assets/console.png")
+ Game.sprites.fridge = love.graphics.newImage("assets/fridge.png")
+ Game.sprites.outside = love.graphics.newImage("assets/outside.png")
+ Game.sprites.wand = love.graphics.newImage("assets/wand.png")
+ -- Create new player
+ Game.player = Game.newPlayer()
+end
+
+-- Based on current window sizes returns proper scale for elements.
+function Game.getScale()
+ local w,h = Game.getWidth(), Game.getHeight()
+ local scale_w = math.ceil(w / 100)
+ local scale_h = math.ceil(h / 75)
+ return math.max(scale_w, scale_h)
+end
+
+-- Get current offsets.
+function Game.getOffsets()
+ local scale, width, height, mouse_x, mouse_y, player_x, offset_x, offset_y
+ scale = Game.getScale()
+ width, height = Game.getWidth(), Game.getHeight()
+ mouse_x, mouse_y = love.mouse.getPosition()
+ player_x = Game.player.x * scale
+ mouse_x = (mouse_x - width / 2)*.02
+ mouse_y = (mouse_y - height / 2)*.01
+ offset_x = width/2 - player_x - mouse_x
+ offset_y = (height - (32 * scale))/2 - mouse_y
+ return offset_x, offset_y
+end
+
+-- Returns mouse position in game world.
+function Game.getMousePosition(x, y)
+ local scale = Game.getScale()
+ if not x and not y then
+ local x, y = love.mouse.getPosition()
+ end
+ local ox, oy = Game.getOffsets()
+ x = math.floor((x - ox)/scale)
+ y = math.floor((y - oy)/scale)
+ return x, y
+end
+
+-- Returns double true if given position is inside any Room.
+function Game.inRange(x, y)
+ local horizontal, vertical = false, false
+ if y > 0 and y < 32 then
+ vertical = true
+ end
+ local width = 0
+ for _,room in pairs(Game.rooms) do
+ if room.discovered then
+ width = width + room:getDimensions()
+ end
+ end
+ if x > 2 and x < width-1 then
+ horizontal = true
+ end
+ return horizontal, vertical
+end
+
+-- Tests if given position is inside any Prop.
+function Game.testPosition(x, y)
+ for _,prop in pairs(Game.props) do
+ local test = prop:testPosition(x, y)
+ if test then
+ return test
+ end
+ end
+end
+
+-- Returns player. The only one.
+function Game.getPlayer()
+ return Game.player
+end
+
+-- Returns current message, beep.
+function Game.getMessage()
+ return Game.message
+end
+
+-- Inserts new Room.
+function Game.insertRoom(width, height)
+ local x, y
+ local last = Game.rooms[#Game.rooms]
+ if last then
+ local lw, lh = last:getDimensions()
+ local lx, ly = last:getPosition()
+ x, y = lx + lw, ly
+ end
+ local room = Game.newRoom():setDimensions(width, height):setPosition(x, y)
+ table.insert(Game.rooms, room)
+ return room
+end
+function Game.insertDoor(room)
+ local x, y = room:getPosition()
+ local w, h = room:getDimensions()
+ local door = Game.insertProp():setPosition(x+w-5,10):setDimensions(10,18)
+ return door
+end
+
+-- Inserts new Prop.
+function Game.insertProp(prop)
+ local prop = prop
+ if not prop then
+ prop = Game.newProp()
+ end
+ table.insert(Game.props, prop)
+ return prop
+end
+
+-- Sets given or empty message as current message.
+function Game.setMessage(message)
+ local message = message
+ if not message then
+ message = Game.newMessage()
+ end
+ Game.message = message
+ return message
+end
+
+return Game \ No newline at end of file