From e5d8a7f87485ecdb35b1b8b24dc65b36990d87ad Mon Sep 17 00:00:00 2001 From: Kazhnuz Date: Fri, 23 Apr 2021 10:21:54 +0200 Subject: [PATCH] feat: add the char page structure Fixes #61 Fixes #62 --- .../datas/gamedata/skills/spinattack.lua | 1 + .../datas/gamedata/skills/spindash.lua | 1 + sonic-radiance.love/scenes/overworld/init.lua | 3 + .../screens/mainmenu/character/basicpage.lua | 38 ++------ .../screens/mainmenu/character/init.lua | 38 ++++++-- .../screens/mainmenu/character/pageparent.lua | 46 ++++++++++ .../screens/mainmenu/character/skillpage.lua | 68 +++++++++++++++ .../screens/mainmenu/character/statpage.lua | 87 +++++++++++++++++++ .../scenes/overworld/screens/parent.lua | 3 + 9 files changed, 247 insertions(+), 38 deletions(-) create mode 100644 sonic-radiance.love/scenes/overworld/screens/mainmenu/character/pageparent.lua create mode 100644 sonic-radiance.love/scenes/overworld/screens/mainmenu/character/skillpage.lua create mode 100644 sonic-radiance.love/scenes/overworld/screens/mainmenu/character/statpage.lua diff --git a/sonic-radiance.love/datas/gamedata/skills/spinattack.lua b/sonic-radiance.love/datas/gamedata/skills/spinattack.lua index 0276a18..4368023 100644 --- a/sonic-radiance.love/datas/gamedata/skills/spinattack.lua +++ b/sonic-radiance.love/datas/gamedata/skills/spinattack.lua @@ -7,6 +7,7 @@ return { name = "spinattack", fullname = "Spin Attack", cost = 03, + description = "Spin to attack. Roll at the right time for more damages", targetNumber = 1, -- 0 for targeting all ennemies targetEnnemies = true, diff --git a/sonic-radiance.love/datas/gamedata/skills/spindash.lua b/sonic-radiance.love/datas/gamedata/skills/spindash.lua index 919c3cc..98fda96 100644 --- a/sonic-radiance.love/datas/gamedata/skills/spindash.lua +++ b/sonic-radiance.love/datas/gamedata/skills/spindash.lua @@ -1,6 +1,7 @@ return { name = "spindash", fullname = "Spin Dash", + description = "Sonic's signature attack ! Charge for more damage", cost = 05, targetNumber = 1, -- 0 for targeting all ennemies targetEnnemies = true, diff --git a/sonic-radiance.love/scenes/overworld/init.lua b/sonic-radiance.love/scenes/overworld/init.lua index 4eb54f3..7d28009 100644 --- a/sonic-radiance.love/scenes/overworld/init.lua +++ b/sonic-radiance.love/scenes/overworld/init.lua @@ -214,6 +214,9 @@ function OverWorld:drawScreenTopLayer() self.assets.fonts["hudnbrs"]:print(game:getTimeString(), 424 - 16, 240 - self.timeBorder, "right") + if (self.currentScreen ~= nil) then + self.currentScreen:drawOverEverything() + end end return OverWorld diff --git a/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/basicpage.lua b/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/basicpage.lua index 91b3c78..e1a6f2a 100644 --- a/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/basicpage.lua +++ b/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/basicpage.lua @@ -1,4 +1,5 @@ -local BasicPage = Object:extend() +local PageParent = require "scenes.overworld.screens.mainmenu.character.pageparent" +local BasicPage = PageParent:extend() local menu = require "game.modules.menus.fancy" local gui = require "game.modules.gui" @@ -21,22 +22,15 @@ function BasicPage:new(view, character) self.hpbar:setColorBackground(112/255, 0, 0) self.ppbar:setColorForeground(0, 248/255, 248/255, 1) self.ppbar:setColorBackground(0, 54/255, 229/255) -end - -function BasicPage:getMenuWidgets() - -end - -function BasicPage:update(dt) + BasicPage.super.new(self, view, character, {}) end function BasicPage:draw() self:drawIdentity(const.X, const.Y) self:drawHPPP(const.X, const.Y + 48) self:drawLevel(const.X, 100) - self:drawStats(const.X, 160) - --self:drawWeakStrong(const.X, 160) + self:drawWeakStrong(const.X, 160) end function BasicPage:drawIdentity(x, y) @@ -63,29 +57,9 @@ function BasicPage:drawLevel(x, y) self.view.scene.assets.fonts["small"]:draw(levelString, x + 6, y + 4, -1, "left") end -function BasicPage:drawStats(x, y) - local statString = "ATK " .. self.character.stats.attack .. "\n" - statString = statString .. "DEF " .. self.character.stats.defense .. "\n" - - local statString2 = "POW " .. self.character.stats.power .. "\n" - statString2 = statString2 .. "MND " .. self.character.stats.mind .. "\n" - - local statString3 = "SPD " .. self.character.stats.speed .. "\n" - statString3 = statString3 .. "TEK " .. self.character.stats.technic - - local pos1 = const.CHARPAGESIZE * (1/3) - local pos2 = const.CHARPAGESIZE * (2/3) - - love.graphics.draw(self.nameBox, x, y) - - self.view.scene.assets.fonts["small"]:draw(statString, x + 6, y + 4, -1, "left") - self.view.scene.assets.fonts["small"]:draw(statString2, x + 6 + pos1, y + 4, -1, "left") - self.view.scene.assets.fonts["small"]:draw(statString3, x + 6 + pos2, y + 4, -1, "left") -end - function BasicPage:drawWeakStrong(x, y) - local weakString = "Weak to: Earth, Lightning" - local strongString = "Resist To: Fire" + local weakString = "Weak to: Nothing"--"Earth, Lightning" + local strongString = "Resist To: Nothing" love.graphics.draw(self.nameBox, x, y) self.view.scene.assets.fonts["small"]:draw(weakString .. "\n" .. strongString, x + 6, y + 4, -1, "left") diff --git a/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/init.lua b/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/init.lua index 570ac5e..9306497 100644 --- a/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/init.lua +++ b/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/init.lua @@ -6,7 +6,9 @@ local gui = require "game.modules.gui" local const = require "scenes.overworld.screens.mainmenu.const" local BasicPage = require "scenes.overworld.screens.mainmenu.character.basicpage" -local pageList = {BasicPage} +local StatPage = require "scenes.overworld.screens.mainmenu.character.statpage" +local SkillPage = require "scenes.overworld.screens.mainmenu.character.skillpage" +local pageList = {BasicPage, StatPage, SkillPage} local ReturnWidget = menu.BaseWidget:extend() @@ -48,18 +50,22 @@ function CharacterScreen:setPage(newPageIndex) end function CharacterScreen:setMenu() - local itemNumber = 1 + local itemNumber = self.page:getMenuSize() local y = const.Y2 - (16*itemNumber) + 2 - menu.FancyMenu(self.scene, "menu", const.X2 - 128 - 14, y, 128, 1, false) + menu.FancyMenu(self.scene, "menu", const.X2 - 128 - 14, y, 128, itemNumber, false) self.page:getMenuWidgets() - --menu.BaseWidget(self.scene, "equip", "Change talent", ">") - --menu.BaseWidget(self.scene, "equip", "Battle skills", ">") - --menu.BaseWidget(self.scene, "equip", "Equipement", ">") ReturnWidget(self.scene, self.charName) + local customMenu = self.page:getCustomMenus() + self.scene.menusystem:switchMenu("menu") self.scene.menusystem.menus["menu"]:getFocus() self.scene.menusystem.menus["menu"]:setCancelWidget() + self.scene.menusystem.menus["menu"].isLocked = true + if (customMenu ~= nil) then + customMenu.isLocked = true + customMenu.isVisible = true + end end function CharacterScreen:draw() @@ -67,12 +73,32 @@ function CharacterScreen:draw() if (self.page ~= nil) then self.page:draw() end + + for i = 1, #pageList, 1 do + local radius = 2 + if (i == self.pageIndex) then + radius = 3 + end + local x = (16*i) + 240 + 64 + local y = 17 + local outlineLight = 0.15 + love.graphics.circle("fill", x + 8, y + 8, radius, 8) + love.graphics.setColor(outlineLight, outlineLight, outlineLight, 1) + love.graphics.circle("line", x + 8, y + 8, radius, 8) + utils.graphics.resetColor() + end end function CharacterScreen:drawBackground() love.graphics.draw(self.artwork, self.artworkOrigin.x, self.artworkOrigin.y) end +function CharacterScreen:drawOverEverything() + if (self.page ~= nil) then + self.page:drawOverEverything() + end +end + -- Widgets function ReturnWidget:new(scene, charName) diff --git a/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/pageparent.lua b/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/pageparent.lua new file mode 100644 index 0000000..9cc279f --- /dev/null +++ b/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/pageparent.lua @@ -0,0 +1,46 @@ +local PageParent = Object:extend() +local menu = require "game.modules.menus.fancy" +local Widget = menu.BaseWidget:extend() + +function PageParent:new(view, character, menu) + self.view = view + self.character = game.characters.list[character] + self.menu = menu or {} +end + +function PageParent:update(dt) +end + +function PageParent:getMenuSize() + return #self.menu + 1 +end + +function PageParent:getMenuWidgets() + for index, name in ipairs(self.menu) do + Widget(self, name, index) + end +end + +function PageParent:menuResponses(i) +end + +function PageParent:getCustomMenus() +end + +function PageParent:draw() +end + +function PageParent:drawOverEverything() +end + +function Widget:new(page, name, num) + self.num = num + self.page = page + Widget.super.new(self, self.page.view.scene, "menu", name, ">") +end + +function Widget:action() + self.page:menuResponses(self.num) +end + +return PageParent diff --git a/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/skillpage.lua b/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/skillpage.lua new file mode 100644 index 0000000..a3cfe37 --- /dev/null +++ b/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/skillpage.lua @@ -0,0 +1,68 @@ +local PageParent = require "scenes.overworld.screens.mainmenu.character.pageparent" +local StatPage = PageParent:extend() + +local menu = require "game.modules.menus.list" +local const = require "scenes.overworld.screens.mainmenu.const" + +local SkillMenu = menu.ListMenu:extend() +local SkillWidget = menu.DualTextWidget:extend() +local PLAYER_MESSAGE = 240 - 24 + +function StatPage:new(view, character) + StatPage.super.new(self, view, character, {"See skill"}) + self.message = "" +end + +function StatPage:getCustomMenus() + return SkillMenu(self, self.character) +end + +function StatPage:menuResponses(i) + if (#self.character.skills > 0) then + self.view.scene.menusystem:switchMenu("equip") + end +end + +function StatPage:drawOverEverything() + if (not utils.string.isEmpty(self.message)) then + love.graphics.setColor(0,0,0, 0.66) + love.graphics.rectangle("fill", 0, PLAYER_MESSAGE, 424, 16) + self.view.scene.assets.fonts["small"]:setColor(1,1,1, 1) + self.view.scene.assets.fonts["small"]:draw(self.message, 424/2, PLAYER_MESSAGE - 1, -1, "center") + self.view.scene.assets.fonts["small"]:setColor(1,1,1, 1) + utils.graphics.resetColor() + end +end + +function StatPage:setMessage(message) + self.message = message +end + +function StatPage:removeEquip(type) + self.character:removeEquip(type) +end + +function SkillMenu:new(page, character) + self.page = page + SkillMenu.super.new(self, page.view.scene, "equip", const.X, const.Y + 4, const.CHARPAGESIZE, 9, true, true) + for _, skill in ipairs(character.skills) do + SkillWidget(page, skill.name) + end +end + +function SkillMenu:cancelAction() + self.scene.menusystem.menus["menu"]:getFocus() + self.page:setMessage("") +end + +function SkillWidget:new(page, skill) + self.page = page + self.skillData = game.skills:getSkillData(skill) + SkillWidget.super.new(self, self.page.view.scene, "equip", self.skillData.fullname, utils.math.numberToString(self.skillData.cost, 2)) +end + +function SkillWidget:selectAction() + self.page:setMessage(self.skillData.description) +end + +return StatPage diff --git a/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/statpage.lua b/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/statpage.lua new file mode 100644 index 0000000..70a97d0 --- /dev/null +++ b/sonic-radiance.love/scenes/overworld/screens/mainmenu/character/statpage.lua @@ -0,0 +1,87 @@ +local PageParent = require "scenes.overworld.screens.mainmenu.character.pageparent" +local StatPage = PageParent:extend() + +local menu = require "game.modules.menus.list" +local gui = require "game.modules.gui" +local const = require "scenes.overworld.screens.mainmenu.const" + +local EquipMenu = menu.ListMenu:extend() +local EquipWidget = menu.DualTextWidget:extend() + +local itemutils = require "game.utils.items" +local STATS = require "datas.stats" + +function StatPage:new(view, character) + self.statBox = gui.newTextBox("assets/gui/dialogbox.png", const.CHARPAGESIZE, 40 + 32) + + StatPage.super.new(self, view, character, {"Remove item"}) +end + +function StatPage:getCustomMenus() + return EquipMenu(self) +end + +function StatPage:menuResponses(i) + self.view.scene.menusystem:switchMenu("equip") +end + +function StatPage:draw() + self:drawStats(const.X, 100) +end + +function StatPage:drawStats(x, y) + love.graphics.draw(self.statBox, x, y) + + local char = self.character + for i, statName in ipairs(STATS.LIST) do + local xStat = x + (((i - 1) % 2) * (const.CHARPAGESIZE/2)) + 6 + local yStat = y + (math.floor((i-1)/2) * 16) + 4 + local middle = xStat + 10 + const.CHARPAGESIZE/4 + local stat = char.stats[statName] + self.view.scene.assets.fonts["small"]:draw(STATS.SIMPLENAME[statName], xStat, yStat, const.CHARPAGESIZE, "left") + self.view.scene.assets.fonts["small"]:setColor(1, 1, 1, 0.9) + self.view.scene.assets.fonts["small"]:draw(stat, middle, yStat, -1, "center") + self.view.scene.assets.fonts["small"]:setColor(1, 1, 1, 1) + utils.graphics.resetColor() + end +end + +function StatPage:removeEquip(type) + self.character:removeEquip(type) +end + +function EquipMenu:new(page) + self.page = page + EquipMenu.super.new(self, page.view.scene, "equip", const.X, const.Y + 4, const.CHARPAGESIZE, 3, true, true) + EquipWidget(page, "gloves") + EquipWidget(page, "shoes") + EquipWidget(page, "accessories") +end + +function EquipMenu:cancelAction() + self.scene.menusystem.menus["menu"]:getFocus() +end + +function EquipWidget:new(page, type) + self.page = page + self.type = type + local label = self:getLabel() + EquipWidget.super.new(self, self.page.view.scene, "equip", label, "") +end + +function EquipWidget:getLabel() + local obj = self.page.character.equip[self.type] + if (utils.string.isEmpty(obj)) then + return "No " .. self.type + end + local data = itemutils.getItemData(self.type, obj) + return data.fullname +end + +function EquipWidget:action() + self.page:removeEquip(self.type) + self.label = self:getLabel() + self:redrawCanvas() +end + +return StatPage diff --git a/sonic-radiance.love/scenes/overworld/screens/parent.lua b/sonic-radiance.love/scenes/overworld/screens/parent.lua index fb625ef..061077b 100644 --- a/sonic-radiance.love/scenes/overworld/screens/parent.lua +++ b/sonic-radiance.love/scenes/overworld/screens/parent.lua @@ -43,4 +43,7 @@ function MenuScreenParent:drawBackground() end +function MenuScreenParent:drawOverEverything() +end + return MenuScreenParent