summaryrefslogtreecommitdiffhomepage
path: root/world.lua
diff options
context:
space:
mode:
authorAki <nthirtyone@gmail.com>2017-04-09 22:07:04 +0200
committerAki <nthirtyone@gmail.com>2017-04-09 22:07:04 +0200
commit0dd01913fe0eefc7ba4bc0797877f40fdedf9315 (patch)
tree8d270eb07f589d2487b3ce66d4865e5a4718042a /world.lua
parent55b0cf1a22e4a7e41fe00aa693445d6c4bd0652d (diff)
parenta03c1125f10fbbad253a0efc4727072fcbd55345 (diff)
downloadroflnauts-0dd01913fe0eefc7ba4bc0797877f40fdedf9315.zip
roflnauts-0dd01913fe0eefc7ba4bc0797877f40fdedf9315.tar.gz
roflnauts-0dd01913fe0eefc7ba4bc0797877f40fdedf9315.tar.bz2
Merge branch 'com'
Diffstat (limited to 'world.lua')
-rw-r--r--world.lua424
1 files changed, 0 insertions, 424 deletions
diff --git a/world.lua b/world.lua
deleted file mode 100644
index 9c308b8..0000000
--- a/world.lua
+++ /dev/null
@@ -1,424 +0,0 @@
--- `World`
--- Used to manage physical world and everything inside it: clouds, platforms, nauts, background etc.
-
--- WHOLE CODE HAS FLAG OF "need a cleanup"
-
-require "platform"
-require "player"
-require "cloud"
-require "effect"
-require "decoration"
-require "ray"
-
--- Metatable of `World`
--- nils initialized in constructor
-World = {
- -- inside
- world = nil,
- Nauts = nil,
- Platforms = nil,
- Clouds = nil,
- Decorations = nil,
- Effects = nil,
- Rays = nil,
- camera = nil,
- -- cloud generator
- clouds_delay = 5,
- -- Map
- map = nil,
- background = nil,
- -- Gameplay status
- lastNaut = false,
- -- "WINNER"
- win_move = 0,
- -- Music
- music = nil
-}
-
--- Constructor of `World` ZA WARUDO!
-function World:new(map, nauts)
- -- Meta
- local o = {}
- setmetatable(o, self)
- self.__index = self
- -- Physical world initialization
- love.physics.setMeter(64)
- o.world = love.physics.newWorld(0, 9.81*64, true)
- o.world:setCallbacks(o.beginContact, o.endContact)
- -- Empty tables for objects
- local n = {}
- o.Nauts = n
- local p = {}
- o.Platforms = {}
- local c = {}
- o.Clouds = c
- local e = {}
- o.Effects = e
- local d = {}
- o.Decorations = d
- local r = {}
- o.Rays = r
- -- Random init
- math.randomseed(os.time())
- -- Map
- local map = map or "default"
- o:loadMap(map)
- -- Nauts
- o:spawnNauts(nauts)
- -- Create camera
- o.camera = Camera:new(o)
- -- Play music
- o.music = Music:new(o.map.theme)
- return o
-end
-
--- The end of the world
-function World:delete()
- self.world:destroy()
- for _,platform in pairs(self.Platforms) do
- platform:delete()
- end
- for _,naut in pairs(self.Nauts) do
- naut:delete()
- end
- self.music:delete()
- self = nil
-end
-
--- Load map from file
-function World:loadMap(name)
- local name = name or "default"
- name = "maps/" .. name .. ".lua"
- local map = love.filesystem.load(name)
- self.map = map()
- -- Platforms
- for _,platform in pairs(self.map.platforms) do
- self:createPlatform(platform.x, platform.y, platform.shape, platform.sprite, platform.animations)
- end
- -- Decorations
- for _,decoration in pairs(self.map.decorations) do
- self:createDecoration(decoration.x, decoration.y, decoration.sprite)
- end
- -- Background
- self.background = love.graphics.newImage(self.map.background)
- -- Clouds
- if self.map.clouds then
- for i=1,6 do
- self:randomizeCloud(false)
- end
- end
-end
-
--- Spawn all the nauts for the round
-function World:spawnNauts(nauts)
- for _,naut in pairs(nauts) do
- local x,y = self:getSpawnPosition()
- local spawn = self:createNaut(x, y, naut[1])
- spawn:assignControlSet(naut[2])
- end
-end
-
--- Get respawn location
-function World:getSpawnPosition()
- local n = math.random(1, #self.map.respawns)
- return self.map.respawns[n].x, self.map.respawns[n].y
-end
-
--- Add new platform to the world
-function World:createPlatform(x, y, polygon, sprite, animations)
- table.insert(self.Platforms, Platform:new(self, self.world, x, y, polygon, sprite, animations))
-end
-
--- Add new naut to the world
-function World:createNaut(x, y, name)
- local naut = Player:new(self, self.world, x, y, name)
- table.insert(self.Nauts, naut)
- return naut
-end
-
--- Add new decoration to the world
-function World:createDecoration(x, y, sprite)
- table.insert(self.Decorations, Decoration:new(x, y, sprite))
-end
-
--- Add new cloud to the world
-function World:createCloud(x, y, t, v)
- table.insert(self.Clouds, Cloud:new(x, y, t, v))
-end
-
--- Randomize Cloud creation
-function World:randomizeCloud(outside)
- if outside == nil then
- outside = true
- else
- outside = outside
- end
- local x,y,t,v
- local m = self.map
- if outside then
- x = m.center_x-m.width*1.2+math.random(-50,20)
- else
- x = math.random(m.center_x-m.width/2,m.center_x+m.width/2)
- end
- y = math.random(m.center_y-m.height/2, m.center_y+m.height/2)
- t = math.random(1,3)
- v = math.random(8,18)
- self:createCloud(x, y, t, v)
-end
-
--- Add an effect behind nauts
-function World:createEffect(name, x, y)
- table.insert(self.Effects, Effect:new(name, x, y))
-end
-
--- Add a ray
-function World:createRay(naut)
- table.insert(self.Rays, Ray:new(naut, self))
-end
-
--- get Nauts functions
--- more than -1 lives
-function World:getNautsPlayable()
- local nauts = {}
- for _,naut in pairs(self.Nauts) do
- if naut.lives > -1 then
- table.insert(nauts, naut)
- end
- end
- return nauts
-end
--- are alive
-function World:getNautsAlive()
- local nauts = {}
- for _,naut in self.Nauts do
- if naut.alive then
- table.insert(nauts, naut)
- end
- end
- return nauts
-end
--- all of them
-function World:getNautsAll()
- return self.Nauts
-end
-
--- get Map name
-function World:getMapName()
- return self.map.name
-end
-
--- Event: when player is killed
-function World:onNautKilled(naut)
- self.camera:startShake()
- self:createRay(naut)
- local nauts = self:getNautsPlayable()
- if self.lastNaut then
- changeScene(Menu:new())
- elseif #nauts < 2 then
- self.lastNaut = true
- naut:playSound(5, true)
- end
-end
-
-function World:getBounce(f)
- local f = f or 1
- return math.sin(self.win_move*f*math.pi)
-end
-
--- LÖVE2D callbacks
--- Update ZU WARUDO
-function World:update(dt)
- -- Physical world
- self.world:update(dt)
- -- Camera
- self.camera:update(dt)
- -- Engine world: Nauts, Grounds (kek) and Decorations - all Animateds (top kek)
- for _,naut in pairs(self.Nauts) do
- naut:update(dt)
- end
- for _,platform in pairs(self.Platforms) do
- platform:update(dt)
- end
- for _,decoration in pairs(self.Decorations) do
- decoration:update(dt)
- end
- -- Clouds
- if self.map.clouds then
- -- generator
- local n = table.getn(self.Clouds)
- self.clouds_delay = self.clouds_delay - dt
- if self.clouds_delay < 0 and
- n < 18
- then
- self:randomizeCloud()
- self.clouds_delay = self.clouds_delay + World.clouds_delay -- World.clouds_delay is initial
- end
- -- movement
- for _,cloud in pairs(self.Clouds) do
- if cloud:update(dt) > 340 then
- table.remove(self.Clouds, _)
- end
- end
- end
- -- Effects
- for _,effect in pairs(self.Effects) do
- if effect:update(dt) then
- table.remove(self.Effects, _)
- end
- end
- -- Rays
- for _,ray in pairs(self.Rays) do
- if ray:update(dt) then
- table.remove(self.Rays, _)
- end
- end
- -- Bounce `winner`
- self.win_move = self.win_move + dt
- if self.win_move > 2 then
- self.win_move = self.win_move - 2
- end
-end
--- Draw
-function World:draw()
- -- Camera stuff
- local offset_x, offset_y = self.camera:getOffsets()
- local scale = self.camera.scale
- local scaler = self.camera.scaler
-
- -- Background
- love.graphics.draw(self.background, 0, 0, 0, scaler, scaler)
-
- -- This needs to be reworked!
- -- Draw clouds
- for _,cloud in pairs(self.Clouds) do
- cloud:draw(offset_x, offset_y, scale)
- end
-
- -- Draw decorations
- for _,decoration in pairs(self.Decorations) do
- decoration:draw(offset_x, offset_y, scale)
- end
-
- -- Draw effects
- for _,effect in pairs(self.Effects) do
- effect:draw(offset_x,offset_y, scale)
- end
-
- -- Draw player
- for _,naut in pairs(self.Nauts) do
- naut:draw(offset_x, offset_y, scale, debug)
- end
-
- -- Draw ground
- for _,platform in pairs(self.Platforms) do
- platform:draw(offset_x, offset_y, scale, debug)
- end
-
- -- Draw rays
- for _,ray in pairs(self.Rays) do
- ray:draw(offset_x, offset_y, scale)
- end
-
- -- draw center
- if debug then
- local c = self.camera
- local w, h = love.graphics.getWidth(), love.graphics.getHeight()
- -- draw map center
- love.graphics.setColor(130,130,130)
- love.graphics.setLineWidth(1)
- love.graphics.setLineStyle("rough")
- local cx, cy = c:getPositionScaled()
- local x1, y1 = c:translatePosition(self.map.center_x, cy)
- local x2, y2 = c:translatePosition(self.map.center_x, cy+h)
- love.graphics.line(x1,y1,x2,y2)
- local x1, y1 = c:translatePosition(cx, self.map.center_y)
- local x2, y2 = c:translatePosition(cx+w, self.map.center_y)
- love.graphics.line(x1,y1,x2,y2)
- -- draw ox, oy
- love.graphics.setColor(200,200,200)
- love.graphics.setLineStyle("rough")
- local cx, cy = c:getPositionScaled()
- local x1, y1 = c:translatePosition(0, cy)
- local x2, y2 = c:translatePosition(0, cy+h)
- love.graphics.line(x1,y1,x2,y2)
- local x1, y1 = c:translatePosition(cx, 0)
- local x2, y2 = c:translatePosition(cx+w, 0)
- love.graphics.line(x1,y1,x2,y2)
- end
-
- -- Draw HUDs
- for _,naut in pairs(self.Nauts) do
- -- I have no idea where to place them T_T
- -- let's do: bottom-left, bottom-right, top-left, top-right
- local w, h = love.graphics.getWidth()/scale, love.graphics.getHeight()/scale
- local y, e = 1, 1
- if _ < 3 then y, e = h-33, 0 end
- naut:drawHUD(1+(_%2)*(w-34), y, scale, e)
- end
-
- -- Draw winner
- if self.lastNaut then
- local w, h = love.graphics.getWidth()/scale, love.graphics.getHeight()/scale
- local angle = self:getBounce(2)
- local dy = self:getBounce()*3
- love.graphics.setFont(Bold)
- love.graphics.printf("WINNER",(w/2)*scale,(42+dy)*scale,336,"center",(angle*5)*math.pi/180,scale,scale,168,12)
- love.graphics.setFont(Font)
- love.graphics.printf("rofl, now kill yourself", w/2*scale, 18*scale, 160, "center", 0, scale, scale, 80, 3)
- end
-end
-
--- Box2D callbacks
--- beginContact
-function World.beginContact(a, b, coll)
- if a:getCategory() == 1 then
- local x,y = coll:getNormal()
- if y < -0.6 then
- print(b:getUserData().name .. " is not in air")
- -- Move them to Player
- b:getUserData().inAir = false
- b:getUserData().jumpnumber = 2
- b:getUserData().salto = false
- b:getUserData():createEffect("land")
- end
- local vx, vy = b:getUserData().body:getLinearVelocity()
- if math.abs(x) == 1 or (y < -0.6 and x == 0) then
- b:getUserData():playSound(3)
- end
- end
- if a:getCategory() == 3 then
- b:getUserData():damage(a:getUserData()[2])
- end
- if b:getCategory() == 3 then
- a:getUserData():damage(b:getUserData()[2])
- end
-end
--- endContact
-function World.endContact(a, b, coll)
- if a:getCategory() == 1 then
- print(b:getUserData().name .. " is in air")
- -- Move them to Player
- b:getUserData().inAir = true
- end
-end
-
--- Controller callbacks
-function World:controlpressed(set, action, key)
- if key == "f6" and debug then
- local map = self:getMapName()
- local nauts = {}
- for _,naut in pairs(self:getNautsAll()) do
- table.insert(nauts, {naut.name, naut:getControlSet()})
- end
- local new = World:new(map, nauts)
- changeScene(new)
- end
- for k,naut in pairs(self:getNautsAll()) do
- naut:controlpressed(set, action, key)
- end
-end
-function World:controlreleased(set, action, key)
- for k,naut in pairs(self:getNautsAll()) do
- naut:controlreleased(set, action, key)
- end
-end \ No newline at end of file