From cb92a8fb3b41e06e855dba17c1ae5efbafcfdead Mon Sep 17 00:00:00 2001 From: Kazhnuz Date: Sun, 10 Mar 2019 13:11:26 +0100 Subject: [PATCH] scenes: add battlesystem from previous code version --- sonic-radiance.love/assets/gui/cursor.png | Bin 0 -> 582 bytes sonic-radiance.love/assets/gui/cursor2.png | Bin 0 -> 457 bytes .../sprites/characters/character-base.xcf | Bin 0 -> 173089 bytes .../assets/sprites/characters/charicons.lua | 6 + .../assets/sprites/characters/charicons.png | Bin 0 -> 2803 bytes .../assets/sprites/characters/sonic.lua | 23 ++ .../assets/sprites/characters/sonic.png | Bin 0 -> 11500 bytes .../assets/sprites/items/crystal.lua | 16 ++ .../assets/sprites/items/crystal.png | Bin 0 -> 407 bytes .../assets/sprites/items/ring.lua | 16 ++ .../assets/sprites/items/ring.png | Bin 0 -> 1451 bytes .../scenes/battlesystem/controller/actors.lua | 142 ++++++++++++ .../battlesystem/controller/background.lua | 81 +++++++ .../battlesystem/controller/battlearena.lua | 210 ++++++++++++++++++ .../scenes/battlesystem/controller/cursor.lua | 165 ++++++++++++++ .../scenes/battlesystem/controller/hud.lua | 55 +++++ .../scenes/battlesystem/controller/init.lua | 64 ++++++ .../scenes/battlesystem/controller/menu.lua | 160 +++++++++++++ .../scenes/battlesystem/entities/actor.lua | 36 +++ .../scenes/battlesystem/entities/base.lua | 61 +++++ .../battlesystem/entities/character.lua | 135 +++++++++++ .../scenes/battlesystem/entities/ennemy.lua | 31 +++ .../scenes/battlesystem/entities/init.lua | 8 + .../scenes/battlesystem/entities/menu.lua | 0 .../scenes/battlesystem/init.lua | 31 +++ sonic-radiance.love/scenes/init.lua | 1 + 26 files changed, 1241 insertions(+) create mode 100644 sonic-radiance.love/assets/gui/cursor.png create mode 100644 sonic-radiance.love/assets/gui/cursor2.png create mode 100644 sonic-radiance.love/assets/sprites/characters/character-base.xcf create mode 100644 sonic-radiance.love/assets/sprites/characters/charicons.lua create mode 100644 sonic-radiance.love/assets/sprites/characters/charicons.png create mode 100644 sonic-radiance.love/assets/sprites/characters/sonic.lua create mode 100644 sonic-radiance.love/assets/sprites/characters/sonic.png create mode 100644 sonic-radiance.love/assets/sprites/items/crystal.lua create mode 100644 sonic-radiance.love/assets/sprites/items/crystal.png create mode 100644 sonic-radiance.love/assets/sprites/items/ring.lua create mode 100644 sonic-radiance.love/assets/sprites/items/ring.png create mode 100644 sonic-radiance.love/scenes/battlesystem/controller/actors.lua create mode 100644 sonic-radiance.love/scenes/battlesystem/controller/background.lua create mode 100644 sonic-radiance.love/scenes/battlesystem/controller/battlearena.lua create mode 100644 sonic-radiance.love/scenes/battlesystem/controller/cursor.lua create mode 100644 sonic-radiance.love/scenes/battlesystem/controller/hud.lua create mode 100644 sonic-radiance.love/scenes/battlesystem/controller/init.lua create mode 100644 sonic-radiance.love/scenes/battlesystem/controller/menu.lua create mode 100644 sonic-radiance.love/scenes/battlesystem/entities/actor.lua create mode 100644 sonic-radiance.love/scenes/battlesystem/entities/base.lua create mode 100644 sonic-radiance.love/scenes/battlesystem/entities/character.lua create mode 100644 sonic-radiance.love/scenes/battlesystem/entities/ennemy.lua create mode 100644 sonic-radiance.love/scenes/battlesystem/entities/init.lua create mode 100644 sonic-radiance.love/scenes/battlesystem/entities/menu.lua create mode 100644 sonic-radiance.love/scenes/battlesystem/init.lua diff --git a/sonic-radiance.love/assets/gui/cursor.png b/sonic-radiance.love/assets/gui/cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..e4bb4e54deeac23f782c703e7c3b347a8665eadc GIT binary patch literal 582 zcmV-M0=fN(P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00FK^L_t(Y$IVweZo@DPeFAz2 zt~^XO!E2U|S_92JLFeqbKvu(B4&zlf(5NnvAv2OCIZavu8cfP0AHkm#5kZo}HvoX} z6;L4OoWcu;h(gc(Kk}n!Q+e-K3}z1J^BKc1RE;w810d;0D_|lD^E~eYpYx+NQ0ag7 zV(L{F1$47?#7#L2IpYzTD{(L=?7Co`~SRUrw%V5K-{nFDKQP z%Gyf&^M2~tSF@LqRk8HOXK#<$71Wexj0wNp`;0L~d(Q{6PAY3TdKo16UgdIf-` zOfQ#9?oLSWOw+Wqgr45lGfYzbvNfdmj4@KyZBOFcEQeQ3&v$0%yRfY6^#qlOs-@A; zgI@x=RqvL6E%>%#rW&T8O3TJt8){Qm>d2L~oW{}qo++Ph5v3`gTg_Uw3azygvIiZ} zJ`q8#761^$3Z&$o+Owzq$33)X&(7iB+GABI?KfT~)tAIGgXWztrM<5qxp$}Z13q%` Ue-1gYrT_o{07*qoM6N<$g00p6#{d8T literal 0 HcmV?d00001 diff --git a/sonic-radiance.love/assets/gui/cursor2.png b/sonic-radiance.love/assets/gui/cursor2.png new file mode 100644 index 0000000000000000000000000000000000000000..bcb2e58ccb8cb07bd77597ffbd667a315d59a4d4 GIT binary patch literal 457 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 ie+gn-{{+* z-LrOsyM|BS1jo&+QfX__bb}lBPFM5YzUQ6qiAjI|PD_#echzj`hLunAe$?tasoHm~ z$vd=OY_h7ocEmi-U6C$J@{-w>2_2LZn_}GPYszs)DAMDo`CE=XDGTYF zwfg4w58K$~4>@G_dV0$WFU8GbZ8()Nlj2>E@cM*00j?8L_t(&-o05ZbRs(x z{(@TEt{Y^Ydv%pmM)DlER|yUrbz4bg9XLjAU2#Q54)VFyHIk7y>heT>$b?KL1A8{- z%sCvG`{myIefQ=EATs19r2K@$1w$^GlyCGpdp&D2ewbxY$*7<@`K%UG5pB^x&|-- zwiM(a5y2q9mRbzs%ksVpP!Y7P^P}Vxi$eLayzhd{I7uO2#hL@F7i|6m3@4+U6SP-h zdIeAWeL1AJa!7CGer_tcx%vQLKWEalpZ5FGR<*6HurH?78GB=Ee5ztpeR02k9kYt9 zEA0K8ovPZa=1S$i(X;uDPiA?Fcipvp$Ir)p-rNbSFQ1V6IXlazJ37sjPFl5o^SPIO zQy)I4QXjyh_T`tgU+s1T07_1^AGxjKvmq!-fiqhGSnYOXv!THD$@)?qV*oie zlNXF~PF!0vMmZwt+WN8E>nsFKlZ1Q8k0UG!1l%&AtMifF*XWF z+v}W{Lhm&q;;9$F2R%J)M<~cPIJBW7ZCR9@#tLyx44aLbY

L&6Si=s?!AQrqS-~ z8^sjyZOh_ITpJofxvmjjC$6MwvYJL^_v@0RablMkqnwjcm_TJ^r*DWUHTgb{ombBp zx;5O-nat?vxM+6AqnwlSfdNyVxNjjSIYn`R-8A-|weNx=b4~}r3m)yGe^MYbPOxP* z*RB{rNj`!3hzrddS_({3n=r1K-^Yk9 zu`Mu6w+hWoQiyCro^Sg*>@UH%#y)gsel5nI^uG-U{{xFJg$(MFGgbfq002ovPDHLk FV1f@Kn&= #self.actionlist) then + self.turns.current = 1 + self.turns.isFinished = false + self.turns.number = self.turns.number + 1 + self:recalculateTurns() + else + self.turns.current = self.turns.current + 1 + end + + self.actionlist[self.turns.current].actor:setActive() + self.turns.changeActor = false +end + +local function sortActors(a, b) + local astats = a.actor:getStats() + local bstats = b.actor:getStats() + local aspeed = astats.speed / 1.5 * a.number + local bspeed = bstats.speed / 1.5 * b.number + + + if (aspeed == bspeed) then + if (a.actor.isHero == b.actor.isHero) then + return (a.actor.id > b.actor.id) + else + return a.actor.isHero + end + else + return (aspeed > bspeed) + end +end + +function ActorManager:recalculateTurns() + self:generateActionList() + table.sort(self.actionlist, sortActors) +end + +function ActorManager:update(dt) + + if (self.turns.changeActor) then + self:switchActiveActor( ) + end + + local cursorSpeed = 16 + + if (self.turns.current == 1) then + cursorSpeed = 16 * 4 + end + + if math.abs(self.cursor - self.turns.current) > (cursorSpeed * dt) then + self.cursor = self.cursor - utils.math.sign(self.cursor - self.turns.current) * cursorSpeed * dt + else + self.cursor = self.turns.current + end + +end + +function ActorManager:countEnnemy() + local count = 0 + + for i,v in ipairs(self.entities) do + if (v.isEnnemy) then + count = count + 1 + end + end + + return count +end + +function ActorManager:draw() + for i,v in ipairs(self.actionlist) do + v.actor:drawIcon(4 + (i-1)*(20), 1) + end + + love.graphics.draw(self.cursorTexture, self.cursor * 20 - 6, 18, math.rad(-90), 1, 1, 4, 8) +end + +return ActorManager diff --git a/sonic-radiance.love/scenes/battlesystem/controller/background.lua b/sonic-radiance.love/scenes/battlesystem/controller/background.lua new file mode 100644 index 0000000..2639f47 --- /dev/null +++ b/sonic-radiance.love/scenes/battlesystem/controller/background.lua @@ -0,0 +1,81 @@ +local Background = Object:extend() + +function Background:new(controller, levelname) + self.controller = controller + local backname = self.controller.datas.background or "city" + local tileline = self.controller.datas.tiles or 1 + local borderline = self.controller.datas.borders or 1 + + self.textures = {} + self.textures.tiles = love.graphics.newImage("assets/levels/normaltile.png") + self.textures.back1 = love.graphics.newImage("assets/levels/backgrounds/" .. backname .. "-back.png") + self.textures.back2 = love.graphics.newImage("assets/levels/backgrounds/" .. backname .. "-fore.png") + self.textures.borders = love.graphics.newImage("assets/levels/borders.png") + + self.quads = {} + self.quads.tiles = {} + + local w, h = self.textures.tiles:getDimensions() + self.quads.tiles[1] = love.graphics.newQuad( 0, tileline*24, 40, 24, w, h) + self.quads.tiles[2] = love.graphics.newQuad(40, tileline*24, 40, 24, w, h) + + local w, h = self.textures.borders:getDimensions() + self.quads.borders = love.graphics.newQuad(0, borderline*10, 80, 10, w, h) + + +end + +function Background:destroy() + self.back1:release( ) + self.back2:release( ) +end + +function Background:draw() + local x0, x1, x2 + + local turn = 0 + + x0 = 0 + x1 = x0 / 3 % 240 + x2 = x0 / 9 % 480 + + local sx = 1 + for i=1, 4 do + if (i == 2) or (i == 4) then + love.graphics.draw(self.textures.back1, (i)*240 - x2, 20, 0, -1, 1) + else + love.graphics.draw(self.textures.back1, (i-1)*240 - x2, 20, 0, 1, 1) + end + end + + + for i=1, 7 do + love.graphics.draw(self.textures.borders, self.quads.borders, (i-1)*80, 80, 0, 1, 1) + end + + for i=1, 3 do + love.graphics.draw(self.textures.back2, (i-1)*240 - x1, 20, 0, 1, 1) + end + + --self:drawBorders() + self:drawGround(-8, 86) +end + +function Background:drawGround(x, y) + for i=1, 9 do + for j= -2, 17 do + local k = 1 + ((i + j) % 2) + if (i >= 1) and (i <= 7) and (j >= 1) and (j <= 12) then + love.graphics.setColor(1, 1, 1, 1) + else + love.graphics.setColor(.6,.6,.6, 1) + end + + love.graphics.draw(self.textures.tiles, self.quads.tiles[k], x + (j-1)*31 + (i-1)*10 , y + (i-1)*20) + end + end + + love.graphics.setColor(1, 1, 1, 1) +end + +return Background diff --git a/sonic-radiance.love/scenes/battlesystem/controller/battlearena.lua b/sonic-radiance.love/scenes/battlesystem/controller/battlearena.lua new file mode 100644 index 0000000..543f6ac --- /dev/null +++ b/sonic-radiance.love/scenes/battlesystem/controller/battlearena.lua @@ -0,0 +1,210 @@ +local BattleArena = Object:extend() + +local EmptyArena = { + {00,00,00,00,00,00,03,03,03,00,00,00}, + {00,00,00,00,00,00,03,03,03,00,00,00}, + {00,00,00,00,00,03,03,03,00,00,00,00}, + {00,00,00,00,00,03,03,03,00,00,00,00}, + {00,00,00,00,00,03,03,03,00,00,00,00}, + {00,00,00,00,00,00,03,03,03,00,00,00}, + {00,00,00,00,00,00,03,03,03,00,00,00} +} + +local _GROUND_X, _GROUND_Y +_GROUND_X = -8 +_GROUND_Y = 90 + +function BattleArena:new(controller) + self.controller = controller + self:initArena() + + self.entities = {} + self.globalID = 0 +end + +function BattleArena:registerEntity(entity) + table.insert(self.entities, entity) + self.globalID = self.globalID + 1 +end + +function BattleArena:initArena(battlefile) + self.datas = {} + self.datas.background = "city" + self.datas.tiles = 1 + self.datas.borders = 1 + self.datas.terrains = EmptyArena + + self:loadRessources() +end + +function BattleArena:loadRessources() + local backname = self.datas.background or "city" + local tileline = self.datas.tiles or 1 + local borderline = self.datas.borders or 1 + + self.textures = {} + self.textures.tiles = love.graphics.newImage("assets/levels/normaltile.png") + self.textures.sptiles = love.graphics.newImage("assets/levels/specialtile.png") + self.textures.back1 = love.graphics.newImage("assets/levels/backgrounds/" .. backname .. "-back.png") + self.textures.back2 = love.graphics.newImage("assets/levels/backgrounds/" .. backname .. "-fore.png") + self.textures.borders = love.graphics.newImage("assets/levels/borders.png") + self.textures.shadow = love.graphics.newImage("assets/sprites/shadow.png") + + self.quads = {} + self.quads.tiles = {} + self.quads.sptiles = {} + + local w, h = self.textures.tiles:getDimensions() + self.quads.tiles[1] = love.graphics.newQuad( 0, tileline*24, 40, 24, w, h) + self.quads.tiles[2] = love.graphics.newQuad(40, tileline*24, 40, 24, w, h) + + local w, h = self.textures.sptiles:getDimensions() + local h2 = math.floor(h / 26) + for i=1, h2 do + self.quads.sptiles[i] = love.graphics.newQuad(0, (i-1)*26, 40, 26, w, h) + end + + local w, h = self.textures.borders:getDimensions() + self.quads.borders = love.graphics.newQuad(0, borderline*10, 80, 10, w, h) +end + +function BattleArena: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 = _GROUND_X + ((x-1) * 31) + ((y-1) * 10) + pixely = _GROUND_Y + ((y-1) * 20) + + return math.floor(pixelx), math.floor(pixely) +end + +function BattleArena:getTerrain(x, y) + if self.datas.terrains[y] ~= nil then + return self.datas.terrains[y][x] + else + return nil + end +end + +function BattleArena:isInGrid(x, y) + --return ((y >= 1) and (y <= 7) and (x >= 1) and (x <= 12)) + return ( self:getTerrain(x, y) ~= nil ) +end + +function BattleArena:caseIsEmpty(x, y) + local isEmpty = true + + for i,v in ipairs(self.entities) do + if (v.x == x) and (v.y == y) then + isEmpty = false + else + isEmpty = true + end + end + + return isEmpty +end + +function BattleArena:getObjectInCase(x, y) + for i,v in ipairs(self.entities) do + if (v.x == x) and (v.y == y) then + print("one entity found in case " .. x .. ";" .. y) + return v + end + end + + print("no entity found in case " .. x .. ";" .. y) + return nil +end + +function BattleArena:update(dt) + for i,v in ipairs(self.entities) do + v:update(dt) + end +end + +function BattleArena:draw() + self:drawBackgrounds() + self:drawBorder() + self:drawTerrains() + self:drawShadows() + +end + +function BattleArena:drawEntities() + for i,v in ipairs(self.entities) do + v:draw() + end +end + +function BattleArena:drawShadows() + for i,v in ipairs(self.entities) do + v:drawShadow() + end +end + +function BattleArena:drawBackgrounds() + for i=1, 4 do + if (i == 2) or (i == 4) then + love.graphics.draw(self.textures.back1, (i)*240, 20, 0, -1, 1) + else + love.graphics.draw(self.textures.back1, (i-1)*240, 20, 0, 1, 1) + end + end + + for i=1, 3 do + love.graphics.draw(self.textures.back2, (i-1)*240, 20, 0, 1, 1) + end +end + +function BattleArena:drawBorder() + for i=1, 7 do + love.graphics.draw(self.textures.borders, self.quads.borders, (i-1)*80, 80, 0, 1, 1) + end +end + +function BattleArena:drawTerrains() + local vl, vhd, vd + vl = 1 + vhd = .7 + vd = .5 + for i=1, 9 do + for j= -2, 17 do + local k = 1 + ((i + j) % 2) + + local terrain = self:getTerrain(j, i) + local x, y = self:gridToPixel(j, i, false) + + if (terrain ~= nil) then + local isActive = self.controller.cursor.isActive + if ((isActive == false) or (self.controller.cursor:gridIsActive(j, i))) then + love.graphics.setColor(vl, vl, vl, 1) + else + love.graphics.setColor(vhd, vhd, vhd, 1) + end + self:drawTile(x, y - 4, terrain, k) + else + love.graphics.setColor(vd, vd, vd, 1) + self:drawTile(x, y - 4, 0, k) + end + end + end + + love.graphics.setColor(1, 1, 1, 1) +end + +function BattleArena:drawTile(x, y, type, variant) + if type == 0 then + love.graphics.draw(self.textures.tiles, self.quads.tiles[variant], x, y) + else + love.graphics.draw(self.textures.sptiles, self.quads.sptiles[type], x, y-2) + end +end + +return BattleArena diff --git a/sonic-radiance.love/scenes/battlesystem/controller/cursor.lua b/sonic-radiance.love/scenes/battlesystem/controller/cursor.lua new file mode 100644 index 0000000..23d8978 --- /dev/null +++ b/sonic-radiance.love/scenes/battlesystem/controller/cursor.lua @@ -0,0 +1,165 @@ +local Cursor = Object:extend() + +local EmptyGrid = { + {00,00,00,00,00,00,00,00,00,00,00,00}, + {00,00,00,00,00,00,00,00,00,00,00,00}, + {00,00,00,00,00,00,00,00,00,00,00,00}, + {00,00,00,00,00,00,00,00,00,00,00,00}, + {00,00,00,00,00,00,00,00,00,00,00,00}, + {00,00,00,00,00,00,00,00,00,00,00,00}, + {00,00,00,00,00,00,00,00,00,00,00,00} +} + +function Cursor:new(controller) + self.controller = controller + + self.x = 1 + self.y = 1 + self.isActive = false + self.frame = 1 + self.tx = 1 + self.ty = 1 + + self.grid = EmptyGrid + + self:loadRessources() +end + +function Cursor:loadRessources() + + self.texture = love.graphics.newImage("assets/gui/cursor.png") + self.texture2 = love.graphics.newImage("assets/gui/cursor2.png") + + local w, h = self.texture:getDimensions() + self.sprite = {} + self.sprite[1] = love.graphics.newQuad(0, 0, 28, 11, w, h) + self.sprite[2] = love.graphics.newQuad(28, 0, 28, 11, w, h) + self.sprite[3] = love.graphics.newQuad(56, 0, 28, 11, w, h) + self.sprite[4] = love.graphics.newQuad(28, 0, 28, 11, w, h) +end + +function Cursor:set(x, y) + self.x = math.max(math.min(x, 12), 1) + self.y = math.max(math.min(y, 07), 1) + self.tx = self.x + self.ty = self.y + + self.isActive = true +end + +function Cursor:setGrid(type, x, y, value, whitelistedEntity) + self.grid = { + {00,00,00,00,00,00,00,00,00,00,00,00}, + {00,00,00,00,00,00,00,00,00,00,00,00}, + {00,00,00,00,00,00,00,00,00,00,00,00}, + {00,00,00,00,00,00,00,00,00,00,00,00}, + {00,00,00,00,00,00,00,00,00,00,00,00}, + {00,00,00,00,00,00,00,00,00,00,00,00}, + {00,00,00,00,00,00,00,00,00,00,00,00} + } + if type == "square" then + local x = x - value + local y = y - value + local value = (value * 2) + 1 + + for i=1, value do + for j=1, value do + local dx, dy + dx = x + i - 1 + dy = y + j - 1 + if (dy >= 1) and (dy <= 7) and (dx >= 1) and (dx <= 12) then + if ((self.controller.battlearena:getObjectInCase(dx, dy) == nil) or + (self.controller.battlearena:getObjectInCase(dx, dy) == whitelistedEntity) and (whitelistedEntity ~= nil)) and + (self.controller.battlearena:getTerrain(dx, dy) ~= 3) then + self.grid[dy][dx] = 1 + end + end + end + end + end +end + +function Cursor:gridIsActive(x, y) + if self.grid[y] ~= nil then + return (self.grid[y][x] == 1) + else + return false + end +end + +function Cursor:resetGrid() + self.grid = EmptyGrid +end + +function Cursor:unset() + self.isActive = false +end + +function Cursor:update(dt) + if (self.isActive) then + self.frame = self.frame + dt*4 + if (self.frame >= 4) then + self.frame = 1 + end + local keys = game.input.keys + + if (keys["up"].isPressed) then + dy = math.max(self.y - 1, 1) + if (self.grid[dy][self.x] == 1) then + self.y = dy + end + end + if (keys["down"].isPressed) then + dy = math.min(self.y + 1, 7) + if (self.grid[dy][self.x] == 1) then + self.y = dy + end + end + if (keys["left"].isPressed) then + dx = math.max(self.x - 1, 1) + if (self.grid[self.y][dx] == 1) then + self.x = dx + end + end + if (keys["right"].isPressed) then + dx = math.min(self.x + 1, 12) + if (self.grid[self.y][dx] == 1) then + self.x = dx + end + end + + if (keys["A"].isPressed) then + self.controller.actormanager:sendSignalToCurrentEntity() + end + + self.tx = (self.tx) + ((self.x) - (self.tx)) * dt*30 + self.ty = (self.ty) + ((self.y) - (self.ty)) * dt*30 + -- test + --game + end +end + +function Cursor:drawBottom() + + if (self.isActive) then + local x, y, frame + x, y = self.controller.battlearena:gridToPixel(self.tx, self.ty, true) + frame = math.floor(self.frame) + + love.graphics.draw(self.texture, self.sprite[frame], x, y, 0, 1, 1, 14, 6) + end + +end + +function Cursor:drawTop() + + if (self.isActive) then + local x, y + x, y = self.controller.battlearena:gridToPixel(self.tx, self.ty, true) + + love.graphics.draw(self.texture2, x, y - 24, 0, 1, 1, 7, 26) + end + +end + +return Cursor diff --git a/sonic-radiance.love/scenes/battlesystem/controller/hud.lua b/sonic-radiance.love/scenes/battlesystem/controller/hud.lua new file mode 100644 index 0000000..827c4ba --- /dev/null +++ b/sonic-radiance.love/scenes/battlesystem/controller/hud.lua @@ -0,0 +1,55 @@ +local BattleHUD = Object:extend() + +function BattleHUD:new(controller) + self.controller = controller + + self:loadAssets() +end + +function BattleHUD:loadAssets() + self.progressbarImage = love.graphics.newImage("assets/gui/progressbar.png") + self.barBack = love.graphics.newQuad(0, 0, 211, 12, 211, 24) + self.barFore = love.graphics.newQuad(0, 12, 211, 12, 211, 24) + self.hud1 = love.graphics.newImage("assets/gui/boosthud1.png") + self.hud2 = love.graphics.newImage("assets/gui/boosthud2.png") + self.hud7 = love.graphics.newImage("assets/gui/status_bar.png") + + self.ring = love.graphics.newImage("assets/gui/ring.png") + + self.font = love.graphics.newImageFont("assets/gui/hudnumbers.png", " 0123456789:/", 1) + self.font2 = love.graphics.newImageFont("assets/gui/hudsmallnumbers.png", " 0123456789", 0) + + self.time = love.graphics.newImage("assets/gui/hudtime.png") + self.score = love.graphics.newImage("assets/gui/hudscore.png") + self.bonus = love.graphics.newImage("assets/gui/hudbonus.png") + + self.controller.assets:addTileset("lifeicon", "assets/sprites/characters/charicons") +end + +function BattleHUD:destroy( ) + self.progressbarImage:release( ) + self.barBack:release( ) + self.barFore:release( ) + self.hud1:release( ) + self.hud2:release( ) +end + +function BattleHUD:update(dt) + +end + +function BattleHUD:draw() + love.graphics.setFont( self.font ) + self:drawFrame() + --self.controller:resetFont( ) +end + +function BattleHUD:drawFrame() + love.graphics.draw(self.hud1, 0, 0) + love.graphics.draw(self.hud7, -8, 22) + love.graphics.draw(self.hud7, -8, 22 + 24) + love.graphics.draw(self.hud7, -8 + 126 - 2, 23) + --love.graphics.draw(self.hud2, 0, 200) +end + +return BattleHUD diff --git a/sonic-radiance.love/scenes/battlesystem/controller/init.lua b/sonic-radiance.love/scenes/battlesystem/controller/init.lua new file mode 100644 index 0000000..cecf966 --- /dev/null +++ b/sonic-radiance.love/scenes/battlesystem/controller/init.lua @@ -0,0 +1,64 @@ +local Controller = Object:extend() +local GUI = require "modules.gui" +local Assets = require "modules.assets" + +local BattleArena = require "scenes.battlesystem.controller.battlearena" +local ActorManager = require "scenes.battlesystem.controller.actors" +local HUD = require "scenes.battlesystem.controller.hud" +local Cursor = require "scenes.battlesystem.controller.cursor" +local MenuSystem = require "scenes.battlesystem.controller.menu" + +function Controller:new() + self.assets = Assets() + self.gui = GUI() + + self:initManagers() +end + +function Controller:restart() +end + +function Controller:exitLevel() + Gamestate.switch(Scenes.options) +end + +function Controller:initManagers() + --self.loader = Loader() + self.datas = {} + self.battlearena = BattleArena(self) + self.actormanager = ActorManager(self) + self.hud = HUD(self) + self.cursor = Cursor(self) + self.menusystem = MenuSystem(self) +end + +function Controller:destroy() + self.world:destroy() + self.battlearena = nil + --self.assets:clear() +end + +function Controller:update(dt) + -- Ici sera tout ce qui se passe dans une update + self.hud:update(dt) + self.battlearena:update(dt) + self.cursor:update(dt) + self.assets:update(dt) + + self.actormanager:update(dt) + self.menusystem:update(dt) +end + +function Controller:draw() + self.battlearena:draw() + self.cursor:drawBottom() + self.battlearena:drawEntities() + self.cursor:drawTop() + self.hud:draw() + self.actormanager:draw() + + self.menusystem:draw(dt) + +end + +return Controller diff --git a/sonic-radiance.love/scenes/battlesystem/controller/menu.lua b/sonic-radiance.love/scenes/battlesystem/controller/menu.lua new file mode 100644 index 0000000..85e5fba --- /dev/null +++ b/sonic-radiance.love/scenes/battlesystem/controller/menu.lua @@ -0,0 +1,160 @@ +local MenuSystem = Object:extend() +local BaseMenu = {"attack", "techs", "object", "defend", "flee", "back"} + +local MENUPOS_X1, MENUPOS_X2, MENUPOS_Y = 32, 32, 110 + +function MenuSystem:new( controller ) + self.controller = controller + self.isActive = false + self.techList = {} + + self.menu = {} + self.menu[1] = BaseMenu + + self.texture = love.graphics.newImage("assets/gui/attacklist.png") + self.cursorTexture = love.graphics.newImage("assets/gui/cursor-menulist.png") + self.font = love.graphics.newFont("assets/fonts/PixelOperator.ttf", 16) + self.cursor = 1 + self.cursorTransition = 1 + self.view = 1 +end + +function MenuSystem:set(currentCharacter) + self.isActive = true + self.cursor = 1 + self.cursorTransition = 0 + self.activeMenu = 1 + + self.character = currentCharacter + + self.menu[2] = self:getSkillList() + self.menu[3] = {"healitems", "rings", "wisps", "other", "back"} + +end + +function MenuSystem:getSkillList() + local list = game.characters:getSkillList(self.character.charid) + local skillmenu = {} + for k,v in pairs(list) do + table.insert(skillmenu, k) + end + + table.insert(skillmenu, "back") + + return skillmenu +end + +function MenuSystem:unset( ) + self.isActive = false +end + +function MenuSystem:update(dt) + if (self.isActive) then + local keys = game.input.keys + + if self.cursor < self.view then + self.view = self.cursor + end + if self.cursor > self.view + 5 then + self.view = self.cursor - 5 + end + + local relativecursor = self.cursor - self.view + + local transition = self.cursorTransition - relativecursor + + if math.abs(transition) < 0.1 then + self.cursorTransition = relativecursor + else + self.cursorTransition = (self.cursorTransition) + ((relativecursor) - (self.cursorTransition)) * dt*45 + end + + if (keys["up"].isPressed) then + if (self.cursor == 1) then + self.cursor = #self.menu[self.activeMenu] + else + self.cursor = self.cursor - 1 + end + end + + if (keys["down"].isPressed) then + if (self.cursor == #self.menu[self.activeMenu]) then + self.cursor = 1 + else + self.cursor = self.cursor + 1 + end + end + + if keys["left"].isPressed then + self.character.direction = -1 + end + + if keys["right"].isPressed then + self.character.direction = 1 + end + + if (keys["A"].isPressed) then + if self.activeMenu == 1 then + if (self.cursor == 2 or self.cursor == 3) then + self.activeMenu = self.cursor + self.cursor = 1 + else + self:sendSignal(self.activeMenu, self.cursor) + end + else + self:sendSignal(self.activeMenu, self.cursor) + end + end + + if (keys["B"].isPressed) then + if self.activeMenu == 1 then + self:sendSignal(1, 6) + else + self.cursor = self.activeMenu + self.activeMenu = 1 + end + end + end +end + +function MenuSystem:sendSignal(menu, id) + --print(self.menu[menu][id]) + self.isActive = false + if (menu == 1) then + self.character:getSignal(BaseMenu[id], 1) + else + self.character:getSignal(BaseMenu[menu], id) + end +end + +function MenuSystem:draw() + if (self.isActive) then + local x, y, addition + x = 32 + y = 32 + addition = 16 + local currentMenu = self.menu[self.activeMenu] + -- MENUPOS_X1, MENUPOS_X2, MENUPOS_Y + local MENUPOS_X = MENUPOS_X1 + local maxView = math.min(#currentMenu, (self.view + 5)) + + for i = self.view, maxView do + love.graphics.draw(self.texture, MENUPOS_X - 16, MENUPOS_Y + (i-self.view)*addition + 3) + love.graphics.setFont(self.font) + love.graphics.setColor(0, 0, 0, .8) + love.graphics.print(currentMenu[i], MENUPOS_X + 1, MENUPOS_Y + (i-self.view)*addition + 1) + if (i == self.cursor) then + love.graphics.setColor(1, 1, 1, 1) + else + love.graphics.setColor(1, 1, 1, 1) + end + love.graphics.print(currentMenu[i], MENUPOS_X, MENUPOS_Y + (i-self.view)*addition) + + love.graphics.setColor(1, 1, 1, 1) + end + + love.graphics.draw(self.cursorTexture, MENUPOS_X - 12, MENUPOS_Y + (self.cursorTransition) * addition + 2 ) + end +end + +return MenuSystem diff --git a/sonic-radiance.love/scenes/battlesystem/entities/actor.lua b/sonic-radiance.love/scenes/battlesystem/entities/actor.lua new file mode 100644 index 0000000..afbaf1e --- /dev/null +++ b/sonic-radiance.love/scenes/battlesystem/entities/actor.lua @@ -0,0 +1,36 @@ +local Entity = require("scenes.battlesystem.entities.base") +local Actor = Entity:extend() + +function Actor:new(controller, x, y, z) + Actor.super.new(self, controller, x, y, z) + + self.isActor = true + self.speed = 3 + self.isActive = false + self.debugActiveTimer = 0 +end + +function Actor:setActive() + print("actor " .. self.id .. " is active") + self.isActive = true + self.debugActiveTimer = 0 + print(self.debugActiveTimer) +end + +function Actor:update(dt) + if (self.isActive) then + self.debugActiveTimer = self.debugActiveTimer + dt + print(math.floor(self.debugActiveTimer * 60)) + if self.debugActiveTimer >= 1 then + self.controller.actormanager:switchActiveActor() + --self.controller.actormanager.turns.changeActor = false + self.isActive = false + end + end +end + +function Actor:validateAction() + +end + +return Actor diff --git a/sonic-radiance.love/scenes/battlesystem/entities/base.lua b/sonic-radiance.love/scenes/battlesystem/entities/base.lua new file mode 100644 index 0000000..a77e072 --- /dev/null +++ b/sonic-radiance.love/scenes/battlesystem/entities/base.lua @@ -0,0 +1,61 @@ +local BaseEntity = Object:extend() -- On créer la classe des entitées, c'est la classe de base + +function BaseEntity:new(controller, x, y, z) + self.depth = 0 + self.x = x + self.y = y + self.z = z or 0 + self.direction = 1 + --self.id = self.world.creationID + + self.controller = controller + self.assets = self.controller.assets + + self.isHero = false + self.isActor = false + self.isEnnemy = false + + self:register() +end + +function BaseEntity:register() + self.controller.battlearena:registerEntity(self) + self.id = self.controller.battlearena.globalID +end + +function BaseEntity:setSprite(name, ox, oy, active) + self.sprite = {} + + self.sprite.name = name + self.sprite.ox = ox or 0 + self.sprite.oy = oy or 0 + self.sprite.active = active or false +end + +function BaseEntity:drawSprite(tx, ty) + utils.draw.resetColor() + + local x, y = self.controller.battlearena:gridToPixel(self.x, self.y, true) + + local tx = tx or 0 + local ty = ty or 0 + + if (self.sprite.active) then + self.assets.sprites[self.sprite.name]:drawAnimation(x + tx, y + ty, 0, self.direction, 1, self.sprite.ox, self.sprite.oy) + end +end + +function BaseEntity:update(dt) + -- lol +end + +function BaseEntity:draw() + +end + +function BaseEntity:drawShadow() + local x, y = self.controller.battlearena:gridToPixel(self.x, self.y, true) + love.graphics.draw(self.controller.battlearena.textures.shadow, x, y, 0, 1, 1, 12, 5) +end + +return BaseEntity diff --git a/sonic-radiance.love/scenes/battlesystem/entities/character.lua b/sonic-radiance.love/scenes/battlesystem/entities/character.lua new file mode 100644 index 0000000..e157209 --- /dev/null +++ b/sonic-radiance.love/scenes/battlesystem/entities/character.lua @@ -0,0 +1,135 @@ +local Actor = require("scenes.battlesystem.entities.actor") +local Character = Actor:extend() + +function Character:new(controller, x, y, charid) + Character.super.new(self, controller, x, y, 0) + self.isHero = true + self.turnAction = nil + self.startx, self.starty = self.x, self.y + self.dx, self.dy = self.x, self.y + self.direction = 1 + self.directionPrevious = 1 + + if charid == nil then + err("FATAL ERROR: charid not set") + end + self.charid = charid + self.actionPerTurn = game.characters.list[self.charid].base_stats.turns + self.assets:addSprite(charid, "assets/sprites/characters/" .. charid) + self.assets.sprites[self.charid]:setCustomSpeed(16) + self:setAnimation("idle") + self:setSprite(charid, 32, 48, true) +end + +function Character:setAnimation(animation) + if (self.animation ~= animation) then + self.animation = animation + self.assets.sprites[self.charid]:changeAnimation(animation, true) + end +end + +function Character:draw() + x, y = self.controller.battlearena:gridToPixel(self.x, self.y, true) + --love.graphics.rectangle("fill", x - 8, y - 32, 16, 32) + self:drawSprite() +end + +function Character:drawIcon(x, y) + local iconID = 1 + self.assets.tileset["charicons"]:drawTile(iconID, x, y) +end + +function Character:setActive() + local gridsize = game.characters.list[self.charid].base_stats.move + self.controller.cursor:setGrid("square", self.x, self.y, gridsize, self) + self.startx, self.starty = self.x, self.y + self.controller.cursor:set(self.startx, self.starty) + self.currentAction = "selectDirection" + + self.directionPrevious = self.direction +end + +function Character:update(dt) + if (self.currentAction == "moving") then + self.xprevious = self.x + self.yprevious = self.y + self.x = (self.x) + ((self.dx) - (self.x)) * dt*15 + self.y = (self.y) + ((self.dy) - (self.y)) * dt*15 + + local xspeed, yspeed = math.abs(self.x - self.xprevious), + math.abs(self.y - self.yprevious) + + local speed = math.sqrt(xspeed*xspeed + yspeed*yspeed) * 32 + self.assets.sprites[self.charid]:setCustomSpeed(speed * 60) + local direction = utils.math.sign(self.x - self.xprevious) + if direction ~= 0 then + self.direction = direction + end + if (math.abs(self.x - self.dx) < 0.01) and (math.abs(self.y - self.dy) < 0.01) then + self.x = self.dx + self.y = self.dy + self:setAnimation("idle") + self.currentAction = "selectAttack" + self.controller.menusystem:set( self ) + end + + elseif (self.currentAction == "selectAttack") then + if (game.input.keys["B"].isPressed) then + --self.currentAction = "selectDirection" + --self.controller.cursor:set(self.x, self.y) + end + elseif (self.currentAction == "selectDirection") then + self.xprevious = self.x + self.yprevious = self.y + + self.x = (self.x) + ((self.startx) - (self.x)) * dt*15 + self.y = (self.y) + ((self.starty) - (self.y)) * dt*15 + + local xspeed, yspeed = math.abs(self.x - self.xprevious), + math.abs(self.y - self.yprevious) + + local speed = math.sqrt(xspeed*xspeed + yspeed*yspeed) * 32 + self.assets.sprites[self.charid]:setCustomSpeed(speed * 60) + local direction = utils.math.sign(self.x - self.xprevious) + if direction ~= 0 then + self.direction = direction + end + + if (math.abs(self.x - self.startx) < 0.01) and (math.abs(self.y - self.starty) < 0.01) then + self.x = self.startx + self.y = self.starty + self:setAnimation("idle") + self.direction = self.directionPrevious + end + end +end + +function Character:validateAction() + if (self.currentAction == "selectDirection") then + self:setAnimation("walk") + self.currentAction = "moving" + self.dx, self.dy = self.controller.cursor.x, self.controller.cursor.y + + self.controller.cursor:unset( ) + end +end + +function Character:getStats() + return game.characters.list[self.charid].stats +end + +function Character:getSignal(action_type, id) + --print(action_type .. " " .. id) + if (action_type == "back") then + self.currentAction = "selectDirection" + self.controller.cursor:set(self.x, self.y) + self:setAnimation("walk") + elseif (action_type == "defend") then + self.turnAction = "defend" + self.controller.actormanager:switchActiveActor( ) + else + self.controller.actormanager:switchActiveActor( ) + end +end + +return Character diff --git a/sonic-radiance.love/scenes/battlesystem/entities/ennemy.lua b/sonic-radiance.love/scenes/battlesystem/entities/ennemy.lua new file mode 100644 index 0000000..efaa870 --- /dev/null +++ b/sonic-radiance.love/scenes/battlesystem/entities/ennemy.lua @@ -0,0 +1,31 @@ +local Actor = require("scenes.battlesystem.entities.actor") +local Ennemy = Actor:extend() + +function Ennemy:new(controller, x, y) + Ennemy.super.new(self, controller, x, y, 0) + self.isEnnemy = true + + self.actionPerTurn = 2 +end + +function Ennemy:draw() + x, y = self.controller.battlearena:gridToPixel(self.x, self.y, true) + love.graphics.setColor(1, 0, 0, 1) + love.graphics.rectangle("fill", x - 8, y - 32, 16, 32) + love.graphics.setColor(1, 1, 1, 1) +end + +function Ennemy:drawIcon(x, y) + love.graphics.setColor(1, 0, 0, 1) + love.graphics.rectangle("fill", x, y, 16, 16) + love.graphics.setColor(1, 1, 1, 1) +end + +function Ennemy:getStats() + local stats = {} + stats.speed = 100 + + return stats +end + +return Ennemy diff --git a/sonic-radiance.love/scenes/battlesystem/entities/init.lua b/sonic-radiance.love/scenes/battlesystem/entities/init.lua new file mode 100644 index 0000000..29bab7a --- /dev/null +++ b/sonic-radiance.love/scenes/battlesystem/entities/init.lua @@ -0,0 +1,8 @@ +local entities = {} + +local baseURI = "scenes.battlesystem.entities." + +entities.Character = require(baseURI .. "character") +entities.Ennemy = require(baseURI .. "ennemy") + +return entities diff --git a/sonic-radiance.love/scenes/battlesystem/entities/menu.lua b/sonic-radiance.love/scenes/battlesystem/entities/menu.lua new file mode 100644 index 0000000..e69de29 diff --git a/sonic-radiance.love/scenes/battlesystem/init.lua b/sonic-radiance.love/scenes/battlesystem/init.lua new file mode 100644 index 0000000..19a52e1 --- /dev/null +++ b/sonic-radiance.love/scenes/battlesystem/init.lua @@ -0,0 +1,31 @@ +local BattleSystem = {} +local Controller = require "scenes.battlesystem.controller" + +function BattleSystem:enter() + self.controller = Controller() + --self.background = love.graphics.newImage("assets/background/testbackground.png") +end + +function BattleSystem:update(dt) + game:update(dt) + game.input:update(dt) + self.controller:update(dt) +end + +function BattleSystem:draw() + --CScreen:apply() + love.graphics.setColor(1, 1, 1, 1) + love.graphics.rectangle("fill", 0, 0, 424, 240) + --love.graphics.draw(self.background, 0, 0) + self.controller:draw() + --CScreen:cease() +end + +function BattleSystem:leave() + self.controller:destroy() + self.controller = nil + + collectgarbage() +end + +return BattleSystem diff --git a/sonic-radiance.love/scenes/init.lua b/sonic-radiance.love/scenes/init.lua index 0ad2e04..64af5eb 100644 --- a/sonic-radiance.love/scenes/init.lua +++ b/sonic-radiance.love/scenes/init.lua @@ -1,4 +1,5 @@ return { test = require "scenes.test_scene", title = require "scenes.titlescreen", + cbs = require "scenes.battlesystem", }