diff --git a/main.lua b/main.lua index d4032d4..8abb7f3 100644 --- a/main.lua +++ b/main.lua @@ -2,10 +2,10 @@ -- Imports ------------------------------------------------------------------------------ -local love = require 'love' +local love = require 'love' local game_states = require 'src.states' -local settings = require 'src.utils.settings' -local Fader = require 'src.utils.fader' +local settings = require 'src.utils.settings' +local Fader = require 'src.utils.fader' ------------------------------------------------------------------------------ @@ -13,9 +13,9 @@ local Fader = require 'src.utils.fader' ------------------------------------------------------------------------------ Current_state = 1 -Fade = Fader() -Change_state = false -Debug = false +Fade = Fader() +Change_state = false +Debug = false ------------------------------------------------------------------------------ @@ -37,7 +37,7 @@ end function love.load(args) parse_args(args) - -- Obtain the settigns for the game. + -- Obtain the settings for the game. settings:load_settings() -- Load the assets of the intro game state. diff --git a/src/gstates/gstate.lua b/src/gstates/gstate.lua index 7e8e7ee..be47ab2 100644 --- a/src/gstates/gstate.lua +++ b/src/gstates/gstate.lua @@ -17,7 +17,7 @@ local GameState = make_class() ------------------------------------------------------------------------------ function GameState:_init(name, index) - self.name = name + self.name = name self.index = index self.valid = false end diff --git a/src/gstates/intro.lua b/src/gstates/intro.lua index d180951..7d0c13c 100644 --- a/src/gstates/intro.lua +++ b/src/gstates/intro.lua @@ -2,10 +2,10 @@ -- Imports ------------------------------------------------------------------------------ -local love = require 'love' +local love = require 'love' local make_class = require 'src.utils.classes' -local GameState = require 'src.gstates.gstate' -local Fader = require 'src.utils.fader' +local GameState = require 'src.gstates.gstate' +local Fader = require 'src.utils.fader' ------------------------------------------------------------------------------ @@ -21,21 +21,21 @@ local Intro = make_class(GameState) function Intro:_init(name, index) GameState._init(self, name, index) - self.skip = false - self.fade = Fader() + self.skip = false + self.fade = Fader() self.stage = 0 self.timer = 0 end function Intro:load() - self.splash = love.graphics.newImage('imgs/splash.png') - self.author = love.graphics.newImage('imgs/wally.png') - self.title = love.graphics.newImage('imgs/title.png') + self.splash = love.graphics.newImage('imgs/splash.png') + self.author = love.graphics.newImage('imgs/wally.png') + self.title = love.graphics.newImage('imgs/title.png') self.splash_snd = love.audio.newSource('snd/jachiev.wav') self.author_snd = love.audio.newSource('snd/alang.wav') - self.title_snd = love.audio.newSource('snd/ablhole.wav') - self.valid = true + self.title_snd = love.audio.newSource('snd/ablhole.wav') + self.valid = true self.splash_snd:play() end @@ -44,6 +44,7 @@ end function Intro:update(dt) local total_time + -- Set time to wait for each intro stage. if self.stage == 0 then total_time = 6.5 elseif self.stage == 1 then @@ -52,13 +53,16 @@ function Intro:update(dt) total_time = 8.0 end + -- Start counting the stage time when the fade in is done. if self.fade.done then self.timer = self.timer + dt end + -- Check if it's time to change stage. if self.timer >= total_time then self.fade:fade_out( function () + -- Change the stage and play the corresponding sound. self.stage = self.stage + 1 if self.stage == 1 then @@ -67,41 +71,49 @@ function Intro:update(dt) self.title_snd:play() end + -- Request a fade in. self.fade:fade_in() end ) + + -- Reset the stage timer. self.timer = 0.0 end + -- Update the fader. self.fade:update(dt) + -- Move on to the next game state if the user skipped the intro or all stages are complete. if not self.skip and self.stage < 3 then return self.index else return 2 end end function Intro:draw() if self.valid then - if self.stage == 0 then love.graphics.draw(self.splash, 0, 0) + -- If there is data to draw, then draw the current stage's backdrop. + if self.stage == 0 then love.graphics.draw(self.splash, 0, 0) elseif self.stage == 1 then love.graphics.draw(self.author, 0, 0) elseif self.stage == 2 then love.graphics.draw(self.title, 0, 0) end end + -- Draw the fader if needed. self.fade:draw() end function Intro:unload() - self.splash = nil - self.author = nil - self.title = nil + self.splash = nil + self.author = nil + self.title = nil self.splash_snd = nil self.author_snd = nil - self.title_snd = nil - self.valid = false + self.title_snd = nil + self.valid = false end function Intro:keypressed(_) + -- Skip the intro on any key press. self.skip = true end diff --git a/src/utils/fader.lua b/src/utils/fader.lua index fe47756..0bf4cc8 100644 --- a/src/utils/fader.lua +++ b/src/utils/fader.lua @@ -2,7 +2,7 @@ -- Imports ------------------------------------------------------------------------------ -local love = require 'love' +local love = require 'love' local make_class = require 'src.utils.classes' @@ -18,16 +18,16 @@ local Fader = make_class() ------------------------------------------------------------------------------ function Fader:_init() - self.t = 0.0 - self.step = 0 - self.done = true - self.reverse = false + self.t = 0.0 + self.step = 0 + self.done = true + self.reverse = false self.callback = nil end function Fader:_reset() - self.t = 0 + self.t = 0 self.step = 0 self.done = false end @@ -35,14 +35,14 @@ end function Fader:fade_in(callback) self:_reset() - self.reverse = true + self.reverse = true self.callback = callback end function Fader:fade_out(callback) self:_reset() - self.reverse = false + self.reverse = false self.callback = callback end @@ -53,11 +53,12 @@ function Fader:update(dt) if self.t >= 0.009 then self.step = self.step + 1 - self.t = 0.0 + self.t = 0.0 end if self.step > 175 then self.done = true + if self.callback ~= nil then self.callback() self.callback = nil diff --git a/src/utils/mgclines.lua b/src/utils/mgclines.lua index 01ead10..70fddf8 100644 --- a/src/utils/mgclines.lua +++ b/src/utils/mgclines.lua @@ -3,6 +3,7 @@ ------------------------------------------------------------------------------ -- From https://stackoverflow.com/a/19327160 +-- Cargo cult programming ahoy!! local function magiclines( str ) local pos pos = 1 diff --git a/src/utils/settings.lua b/src/utils/settings.lua index df7451d..aa6ac6d 100644 --- a/src/utils/settings.lua +++ b/src/utils/settings.lua @@ -2,7 +2,7 @@ -- Imports ------------------------------------------------------------------------------ -local love = require 'love' +local love = require 'love' local magiclines = require 'src.utils.mgclines' @@ -18,15 +18,16 @@ local SETTINGS_PATH = 'settings.ini' ------------------------------------------------------------------------------ local settings = { - permadeath=true, - forward='w', - backward='s', - stepleft='a', - stepright='d', - turnleft='q', - turnright='e', - musicvol=75, - soundvol=100, + -- Default setting values. + permadeath = true, + forward = 'w', + backward = 's', + stepleft = 'a', + stepright = 'd', + turnleft = 'q', + turnright = 'e', + musicvol = 75, + soundvol = 100, } @@ -35,11 +36,16 @@ local settings = { ------------------------------------------------------------------------------ function settings:_parse_settings_str(s) + -- For each line in the data string. for line in magiclines(s) do + -- Check if the line matches a key=value pair local k, v = string.match(line, '(%w+)=(.+)') if k and v then + -- If the line matches then check if it has a known settings key. if self[k] ~= nil then + -- If the key is valid then cast the value to it's expected data type and store it. + -- Fail if the cast is not doable. if v == 'true' then if type(self[k]) ~= 'boolean' then error(string.format('Invalid value for %s in settings', k)) end self[k] = true @@ -53,6 +59,7 @@ function settings:_parse_settings_str(s) self[k] = v end else + -- Fail on an unknown key. error(string.format('Unknown settings key "%s"', k)) end end @@ -61,10 +68,14 @@ end function settings:_get_settings_str() + -- Start with the settings category. local s = '[settings]\n' + -- For each value in the settings table. for k, v in pairs(self) do + -- If the value isn't a function then it is a setting. if type(v) ~= 'function' then + -- Format the value as key=value. s = s .. string.format('%s=%s\n', k, v) end end @@ -75,13 +86,16 @@ end function settings:_open_or_create() if not love.filesystem.exists(SETTINGS_PATH) then + -- If the settings file doesn't exist then create it with the default values. local setts = self:_get_settings_str() love.filesystem.write(SETTINGS_PATH, setts) return setts else if not love.filesystem.isFile(SETTINGS_PATH) then + -- Fail if the settings path points to a directory. error ("Settings path exists and isn't a file") else + -- Else read the settings. return love.filesystem.read(SETTINGS_PATH) end end @@ -93,6 +107,7 @@ end ------------------------------------------------------------------------------ function settings:load_settings() + -- Obtain the settings data and parse it. local s = self:_open_or_create() self:_parse_settings_str(s) end @@ -100,8 +115,10 @@ end function settings:save_settings() if not love.filesystem.exists(SETTINGS_PATH) or love.filesystem.isFile(SETTINGS_PATH) then + -- If the settings file doesn't exist or it exists and is a file then save the current data. love.filesystem.write(SETTINGS_PATH, self:_get_settings_str()) else + -- Fail if the settings path points to a directory. error("Settings path exists and isn't a file") end end