fysplane/level_state.lua

308 lines
7.4 KiB
Lua
Raw Normal View History

2014-10-18 11:23:10 +00:00
Gamestate = require 'hump.gamestate'
require 'level'
require 'player'
2014-10-19 11:02:32 +00:00
require 'computerplayer'
require 'nullplayer'
2014-10-18 20:27:40 +00:00
require 'scoreboard'
2014-10-19 03:19:01 +00:00
require 'entities/powerup'
2014-10-18 22:46:27 +00:00
require 'entities/chaingunpowerup'
2014-10-19 03:19:01 +00:00
require 'entities/bigballpowerup'
2014-10-18 22:46:27 +00:00
require 'entities/plane'
2014-10-19 01:59:12 +00:00
require 'entities/debug'
2014-10-18 22:46:27 +00:00
require 'chaingunmode'
2014-10-18 22:51:57 +00:00
require 'entities/plane'
2014-10-19 00:08:25 +00:00
require 'machinegun'
2014-10-24 06:43:42 +00:00
require 'utils'
2014-10-18 11:23:10 +00:00
level_state = {}
local players = {
[1] = Player(1, 'flux'),
[2] = Player(2, 'Nicd')
}
2014-10-24 06:23:44 +00:00
local lastJoystickButtons = { nil, nil }
2014-10-18 20:27:40 +00:00
local scoreboards = {}
local level_music = nil
local current_level = nil
2014-10-18 18:59:00 +00:00
local paused = false
local level_time = 0.0
local updated_time = 0.0
2014-10-18 11:23:10 +00:00
local PHYSICS_STEP = 0.001
local POWERUP_POSSIBILITY = 0.1
2014-10-18 22:46:27 +00:00
2014-10-19 03:19:01 +00:00
local POWERUPS = {
BigBallPowerUp,
ChaingunPowerUp
}
local joysticks = {}
2014-10-18 11:23:10 +00:00
function level_state:init()
end
function level_state:enter(previous, level_file)
entity_id = 1
if level_music == nil then
2014-10-19 00:51:26 +00:00
level_music = love.audio.newSource("resources/audio/Beavis II.mp3")
level_music:setVolume(0.5)
level_music:setLooping(true)
level_music:play()
2014-10-18 11:23:10 +00:00
end
if self.mode == "solo" then
players[2] = NullPlayer(2, "Null")
elseif self.mode == "computer" then
2014-10-19 11:02:32 +00:00
players[2] = ComputerPlayer(2, 'Vengeance')
else
players[2] = Player(2, 'Nicd')
end
level_time = 0.0
updated_time = 0.0
for i, joystick in ipairs(love.joystick.getJoysticks()) do
joysticks[i] = joystick
end
2014-10-18 11:23:10 +00:00
love.graphics.setBackgroundColor({0, 0, 0, 255})
current_level = Level()
current_level.world:setCallbacks(begin_contact, end_contact, pre_solve, post_solve)
players[1]:setPlane(current_level:getPlane(1))
if players[2] then
players[2]:setPlane(current_level:getPlane(2))
end
2014-10-18 20:27:40 +00:00
-- Set up scoreboards
for i = 1, #players, 1 do
local i0 = i - 1
local x = 20 + (i0 * SCOREBOARD_WIDTH) + (i0 * SCOREBOARD_MARGIN)
scoreboards[i] = Scoreboard(x, 20,
function()
return players[i]
end)
2014-10-18 20:27:40 +00:00
end
2014-10-18 11:23:10 +00:00
end
function level_state:draw()
2014-10-18 20:27:40 +00:00
current_level:drawBackground()
for i = 1, #scoreboards, 1 do
scoreboards[i]:draw()
end
2014-10-18 11:23:10 +00:00
current_level:drawEntities()
end
function level_state:update(dt)
if current_level.reset == true then
resetLevel()
return
end
level_time = level_time + dt
for player = 1, #players, 1 do
local j = joysticks[player]
if j then
2014-10-24 06:43:42 +00:00
local buttons = getJoystickButtons(j)
2014-10-24 06:23:44 +00:00
if lastJoystickButtons[player] ~= nil then
for i = 1, #buttons, 1 do
if buttons[i] ~= lastJoystickButtons[player][i] then
local key = string.format("button%d", i)
if buttons[i] then
players[player]:press(key)
else
players[player]:release(key)
end
end
end
end
lastJoystickButtons[player] = buttons
local getAxis = function(info)
local value = 0
if j:getAxisCount() >= info.axis then
value = j:getAxis(info.axis)
if info.flipped then
value = -value
end
end
return value
end
players[player]:joystick(getRotation(j, player), getThrottle(j, player))
end
end
dt = PHYSICS_STEP
while updated_time < level_time do
updated_time = updated_time + dt
2014-10-18 22:46:27 +00:00
-- Generate powerups
local r = love.math.random()
2014-10-19 03:19:01 +00:00
if r <= POWERUP_POSSIBILITY * dt then
local x = love.math.random(levelWidth())
local y = love.math.random(levelHeight())
2014-10-18 22:46:27 +00:00
POWERUPS[love.math.random(1, #POWERUPS)](x, y, current_level)
end
2014-10-19 00:56:32 +00:00
if not paused then
current_level:updateEntities(dt)
end
players[1]:update(dt)
players[2]:update(dt)
end
2014-10-19 01:00:00 +00:00
if players[1]:getPlane() == nil then
2014-10-19 00:56:32 +00:00
current_level:respawnPlayer(1)
players[1]:setPlane(current_level:getPlane(1))
end
2014-10-19 01:00:00 +00:00
if players[2]:getPlane() == nil then
2014-10-19 00:56:32 +00:00
current_level:respawnPlayer(2)
players[2]:setPlane(current_level:getPlane(2))
end
2014-10-18 11:23:10 +00:00
end
function level_state:focus(bool)
end
function level_state:leave(bool)
current_level:delete()
current_level = nil
end
function level_state:keypressed(key, unicode)
-- Ctrl + R restarts current level.
if key == "r"
2014-10-18 12:59:39 +00:00
and (love.keyboard.isDown("lctrl")
or love.keyboard.isDown("rctrl")) then
2014-10-18 11:23:10 +00:00
current_level.reset = true
2014-10-22 18:44:51 +00:00
elseif key == "escape" then
Gamestate.switch(menu_state)
2014-10-19 01:59:12 +00:00
elseif key == "d"
and (love.keyboard.isDown("lctrl")
or love.keyboard.isDown("rctrl")) then
debugEnabled = not debugEnabled
2014-10-18 11:23:10 +00:00
else
2014-10-23 18:42:30 +00:00
local found = false
for id, player in pairs(players) do
2014-10-23 18:42:30 +00:00
found = player:press(key) or found
end
2014-10-23 18:42:30 +00:00
if not found and (key == " " or key == "p") then
paused = not paused
end
2014-10-18 11:23:10 +00:00
end
end
function level_state:keyreleased(key, unicode)
for id, player in pairs(players) do
player:release(key)
end
2014-10-18 11:23:10 +00:00
end
function level_state:mousepressed(x, y, button)
end
function begin_contact(a, b, coll)
2014-10-18 22:46:27 +00:00
local aObj = a:getUserData()
local bObj = b:getUserData()
if aObj ~= nil and bObj ~= nil then
2014-10-19 03:19:01 +00:00
if aObj:isinstance(Plane) and bObj:isinstance(PowerUp) then
bObj:wasHitBy()
2014-10-18 22:46:27 +00:00
bObj.deleteLater = true
2014-10-19 03:19:01 +00:00
aObj:setPowerUpMode(bObj.mode)
2014-10-18 23:37:41 +00:00
coll:setEnabled(false)
2014-10-19 03:19:01 +00:00
elseif bObj:isinstance(Plane) and aObj:isinstance(PowerUp) then
aObj:wasHitBy()
2014-10-18 22:46:27 +00:00
aObj.deleteLater = true
2014-10-19 03:19:01 +00:00
bObj:setPowerUpMode(bObj.mode)
2014-10-18 23:37:41 +00:00
coll:setEnabled(false)
2014-10-18 22:51:57 +00:00
else
aObj:wasHitBy(bObj)
bObj:wasHitBy(aObj)
2014-10-19 00:08:25 +00:00
local plane = nil
local other = nil
if aObj:isinstance(Plane) then
plane = aObj
other = bObj
elseif bObj:isinstance(Plane) then
plane = bObj
other = aObj
end
2014-10-19 01:35:07 +00:00
if other and other:isinstance(Plane) then
-- nothing
2014-10-19 01:35:07 +00:00
elseif plane then
2014-10-19 00:08:25 +00:00
if other:getOwner() == nil then
-- Collision with ground or other plane
elseif other:getOwner().id ~= plane.id then
for key, gun in pairs(GUNS) do
2014-10-19 01:45:38 +00:00
if other:isinstance(gun['projectile']) and plane.health > 0 then
2014-10-19 00:08:25 +00:00
plane:receiveDamage(gun['damage'])
2014-10-19 01:45:38 +00:00
2014-10-19 03:51:53 +00:00
local shooter = other:getOwner():getOwner()
shooter:addScore(HIT_SCORE)
2014-10-19 01:45:38 +00:00
if plane.health == 0 then
2014-10-19 03:51:53 +00:00
shooter:addScore(KILL_SCORE)
2014-10-19 01:45:38 +00:00
end
2014-10-19 00:08:25 +00:00
end
end
end
end
2014-10-18 22:46:27 +00:00
end
end
2014-10-18 11:23:10 +00:00
end
function end_contact(a, b, coll)
2014-10-23 07:23:31 +00:00
local aObj = a:getUserData()
local bObj = b:getUserData()
2014-10-18 11:23:10 +00:00
2014-10-23 07:23:31 +00:00
if aObj ~= nil and bObj ~= nil then
aObj:noLongerHitBy(bObj)
bObj:noLongerHitBy(aObj)
end
2014-10-18 11:23:10 +00:00
end
function pre_solve(a, b, coll)
if aObj ~= nil and bObj ~= nil then
if aObj:isinstance(Plane) and bObj:isinstance(PowerUp) then
bObj.deleteLater = true
aObj:setPowerUpMode(bObj.mode)
coll:setEnabled(false)
elseif bObj:isinstance(Plane) and aObj:isinstance(PowerUp) then
aObj.deleteLater = true
bObj:setPowerUpMode(bObj.mode)
coll:setEnabled(false)
end
end
2014-10-18 11:23:10 +00:00
end
function end_solve(a, b, coll)
end
function resetLevel()
Gamestate.switch(level_state)
end