sonic-radiance/sonic-radiance.love/scenes/battlesystem/map.lua
2020-07-19 16:49:14 +02:00

183 lines
4.4 KiB
Lua

local Map = Object:extend()
local maputils = require "scenes.battlesystem.utils"
local TweenManager = require "game.modules.tweenmanager"
local DURATION = 0.66
local OPACITY_MIN = 0
local OPACITY_MAX = 0.75
local HEIGHT = 5
local BOTTOM_BORDER = 1
function Map:new(world, type, terrain)
self.world = world
self.assets = self.world.assets
self.scene = self.world.scene
self.datas = {}
self.datas.type = type or "forest"
self.datas.terrains = terrain or maputils.newEmptyMap()
self.tweens = TweenManager(self)
self.effectOpacity = OPACITY_MIN
self:increaseOpacity()
local zones = require "datas.gamedata.maps.shoot.zones"
local datas = zones[self.datas.type]
self.datas.background = datas.background
self.datas.tiles = datas.tiles
self.datas.borders = datas.borders
local backpath = "assets/backgrounds/parallax/" .. self.datas.background
self.assets:addImage("back1", backpath .. "-back.png")
self.assets:addImage("back2", backpath .. "-fore.png")
self.assets:addImage("cliff", backpath .. "-cliff.png")
self.texture = {}
self.texture.floor = self:generateFloor(tile)
end
-- GET FUNCTIONS
-- Get information from the map
function Map:getTotalHeight()
return HEIGHT + BOTTOM_BORDER;
end
function Map:getTerrain(x, y)
if (y <= HEIGHT) then
return 0
else
return nil
end
end
function Map:isInGrid(x, y)
return ( self:getTerrain(x, y) ~= nil )
end
function Map:getStartY()
return 240 - (self:getTotalHeight() * 20) - 10
end
function Map:gridToPixel(x, y, center)
local pixelx, pixely
local center = center or false
local x, y = x, y
if (center) then
x = x + .5
y = y + .5
end
pixelx = maputils.CONST.STARTX + ((x-1) * 31) + ((y-1) * 10)
pixely = self:getStartY() + ((y-1) * 20)
return math.floor(pixelx), math.floor(pixely)
end
function Map:update(dt)
self.tweens:update(dt)
end
-- OPACITY FUNCTIONS
-- Simple functions to work on opacity
function Map:decreaseOpacity()
self.tweens:newTween(0, DURATION/2, {effectOpacity = OPACITY_MIN}, "inExpo")
self.tweens:newTimer(DURATION/2, "increaseOpacity")
end
function Map:increaseOpacity()
self.tweens:newTween(0, DURATION/2, {effectOpacity = OPACITY_MAX}, "inExpo")
self.tweens:newTimer(DURATION/2, "decreaseOpacity")
end
function Map:timerResponse(timer)
if timer == "increaseOpacity" then
self:increaseOpacity()
elseif timer == "decreaseOpacity" then
self:decreaseOpacity()
end
end
-- DRAW FUNCTIONS
-- Draw the battle map
function Map:generateFloor(tile)
local canvas = love.graphics.newCanvas(31*16, self:getTotalHeight() * 20)
local tile = tile or 1
love.graphics.setCanvas( canvas )
for i=1, self:getTotalHeight() do
for j=0, 18 do
local tiley = (i-1)*20
local tilex = (j-2)*31 + (i-1)*10
local variant = 1 + ((i + j) % 2)
local tiles = self.datas.tiles*2 + variant
if (not self:isInGrid(j, i)) then
love.graphics.setColor(.66, .66, .66, 1)
end
self.assets.tileset["normaltiles"]:drawTile(tiles, tilex, tiley)
utils.graphics.resetColor()
end
end
love.graphics.setCanvas( )
local imagedata = canvas:newImageData()
local texture = love.graphics.newImage( imagedata )
imagedata:release()
canvas:release()
return texture
end
function Map:draw()
self:drawBackgrounds()
self:drawBorders()
love.graphics.draw(self.texture.floor, maputils.CONST.STARTX, self:getStartY())
end
function Map:drawBackgrounds()
local w, _ = core.screen:getDimensions()
local w2, h2 = self.assets.images["back1"]:getDimensions()
local imax = math.ceil(w / w2) + 1
for i=1, imax do
self.assets.images["back1"]:draw((i-1)*w2, 0, 0, 1, 1)
end
local w2, h2 = self.assets.images["back2"]:getDimensions()
local imax = math.ceil(w / w2) + 1
for i=1, imax do
self.assets.images["back2"]:draw((i-1)*w2, self:getStartY()-h2, 0, 1, 1)
end
end
function Map:drawBorders()
local border = self.datas.borders + 1
for i=1, 7 do
self.assets.tileset["borders"]:drawTile(border, (i-1)*80, self:getStartY()-10 , 0, 1, 1)
self.assets.tileset["borders"]:drawTile(border, (i-1)*80, 240-10, 0, 1, 1)
end
end
function Map:drawEffectGrid(effectGrid)
for i=1,7 do
for j=1,17 do
if (effectGrid[i][j] == 1) then
local x, y = maputils.gridToPixel(j, i)
love.graphics.setColor(1, 1, 1, self.effectOpacity)
self.assets.images["emptytile"]:draw(x, y)
love.graphics.setColor(1, 1, 1, 1)
end
end
end
end
return Map