sonic-radiance/sonic-radiance.love/scenes/overworld/gui/menus/character/init.lua

175 lines
7.2 KiB
Lua

local CharacterScreen = require("birb.modules.gui.screen"):extend()
local DrawableElement = require("birb.modules.gui.elements.drawable")
local BoxedText = require "scenes.overworld.gui.menus.commons.boxedtext"
local PageIndicator = require "scenes.overworld.gui.menus.character.pageindicator"
local CharBars = require "scenes.overworld.gui.menus.character.charbars"
local Description = require "scenes.overworld.gui.menus.character.description"
local FancyMenu = require "game.modules.gui.fancymenu"
local BoxedMenu = require "game.modules.gui.boxedmenu"
local const = require "scenes.overworld.gui.menus.commons.const"
local subpages = require "scenes.overworld.gui.menus.character.subpages"
local textFunc = require "scenes.overworld.gui.menus.character.texts"
local MENU_W = 128
local MENU_X, MENU_Y = const.X2 - MENU_W - 14, const.Y2 - 48 + 2
local PAGEINDIC_X, PAGEINDIC_Y = const.X2 - 16*5, const.Y - 14
function CharacterScreen:new(characterName)
self.characterName = characterName
self.artworkPosition = require("datas.gamedata.characters." .. characterName .. ".artwork")
self.character = game.characters.list[characterName]
CharacterScreen.super.new(self, characterName)
self:setCustomTransforms()
self.defaultFocus = self.characterName .. "ActMenu"
self.nbr = 1
end
function CharacterScreen:setCustomTransforms()
local show = {}
local hide = {}
self:addCustomTween(show, "Artwork", false, 1, nil, self.artworkPosition.x)
self:addCustomTween(hide, "Artwork", true, -1, nil, self.artworkPosition.x)
self:addCustomTween(show, "ActMenu", false, 1, nil, MENU_X)
self:addCustomTween(hide, "ActMenu", true, -1, nil, MENU_X)
self:addCustomTween(show, "Indicator", false, 1, nil, PAGEINDIC_X)
self:addCustomTween(hide, "Indicator", true, -1, nil, PAGEINDIC_X)
self:addTweens(show, "basic", false, -1)
self:addTweens(hide, "", true, 1)
self:addTransform("show", show)
self:addTransform("hide", hide)
self.desc = ""
end
function CharacterScreen:createElements()
local elementDatas = subpages.getElements()
local list = {}
local drawable = love.graphics.newImage("datas/gamedata/characters/" .. self.characterName .. "/artwork.png")
table.insert(list, {DrawableElement(self.characterName .. "Artwork", drawable, self.artworkPosition.x, self.artworkPosition.y,0,1,1,0,0, 0), 0, 1})
self.dataMenus = {}
for i, element in ipairs(elementDatas) do
local name = self.characterName .. element.name
local x, y, w, h = const.X - 16, const.Y + element.data.y, const.CHARPAGESIZE, element.data.h
if (element.data.isTextBox) then
local boxedText = BoxedText(name, x, y, w, h, function() return textFunc["get" .. element.name](self.character, const.CHARPAGESIZE) end)
table.insert(list, {boxedText, 0, 1})
elseif (element.data.isMenu) then
self.dataMenus[element.name] = BoxedMenu(name, x, y + 4, w, h, true, true)
self.dataMenus[element.name].opacity = 0
self.dataMenus[element.name]:addCancelAction(function ()
self.gui.scene.assets.sfx["mBack"]:play()
self.gui:setFocus(self.characterName .. "ActMenu")
self.desc = ""
end)
table.insert(list, {self.dataMenus[element.name], 0, 1})
else
table.insert(list, {CharBars(name, x, y, self.character), 0, 1})
end
end
self:rebuildMenus()
table.insert(list, {self:createGlobalMenu(), 0, 1})
table.insert(list, {PageIndicator(self, self.characterName .. "Indicator", PAGEINDIC_X, PAGEINDIC_Y, subpages.list), 0, 1})
table.insert(list, {Description(self, self.characterName .. "Description"), 0, -100})
return list
end
function CharacterScreen:rebuildMenus()
for i, equip in ipairs(subpages.equip) do
local fullname = "No " .. equip
local obj = self.character.equip[equip]
if (not utils.string.isEmpty(obj)) then
fullname = core.datas:get("items", obj).fullname
end
self.dataMenus["EquipMenu"]:addItem(fullname, "left", function () end, "select")
end
for _, skill in ipairs(self.character.skills) do
local skillData = core.datas:get("skills", skill.name)
local cost = utils.math.numberToString(skillData.cost, 2)
self.dataMenus["SkillsMenu"]:addItem(skillData.fullname, "left", function () end, "select", {{cost, "right"}}, nil, {skillData.description})
end
self.dataMenus["SkillsMenu"]:addHoverAction(function (widget)
self.desc = widget.datas[1]
end)
end
function CharacterScreen:getDescription()
return self.desc or ""
end
function CharacterScreen:createGlobalMenu()
self.menu = FancyMenu(self.characterName .. "ActMenu", MENU_X, MENU_Y, MENU_W, 3, false)
self.menu.opacity = 0
for i, name in ipairs(subpages.list) do
self.menu:addPage(name)
end
self.menu:switch("skills")
self.menu:addItem("See skill", "left", function()
self.gui:setFocus(self.characterName .. "SkillsMenu")
self.desc = core.datas:get("skills", self.character.skills[1].name).description
end, "navigate")
self.menu:switch("stats")
self.menu:addItem("Remove item", "left", function() self.gui:setFocus(self.characterName .. "EquipMenu") end, "navigate")
for i, name in ipairs(subpages.list) do
self.menu:switch(name)
self.menu:addItem("Back", "left", function() self.gui:showScreen("mainmenuScreen", "navCharMenu", self.nbr, "main") end, "back")
self.menu:setCancelWidget()
end
self.menu:addLateralAction(function (key) if (key == "left") then self:changePage(-1) else self:changePage(1) end end)
self.menu.packAtEnd = 1
self.menu:switch(subpages.list[1])
return self.menu
end
function CharacterScreen:changePage(direction)
local currentPage = self.menu:getCurrentPageName()
self.menu:switch(subpages.relativePage(currentPage, direction))
self:hidePage(currentPage, utils.math.sign(direction))
self:showPage(self.menu:getCurrentPageName(), utils.math.sign(direction))
self.gui.scene.assets.sfx["mBeep"]:play()
end
function CharacterScreen:hidePage(name, direction)
local transform = {}
self:addTweens(transform, name, true, direction)
self.gui:transform(transform, 0)
end
function CharacterScreen:showPage(name, direction)
local transform = {}
self:addTweens(transform, name, false, direction)
self.gui:transform(transform, 0)
end
function CharacterScreen:addTweens(list, name, isHiding, direction)
for _, elem in ipairs(subpages.getElements(name)) do
self:addCustomTween(list, elem.name, isHiding, direction)
end
end
function CharacterScreen:addCustomTween(list, name, isHiding, direction, speed, x)
local begin, duration = utils.math.either(isHiding, 0, 0.1), speed or 0.3
local trueDirection, opacity = utils.math.either(isHiding, direction, 0), utils.math.either(isHiding, 0, 1)
x = x or const.X
if (not isHiding) then self:addCustomTween(list, name, true, direction * -1, 0.1, x) end
table.insert(list, {self.characterName .. name, "tween", begin, duration, {x = x - 16*trueDirection, opacity = opacity}, "inOutQuad"})
end
function CharacterScreen:getCurrentPageName()
return self.menu:getCurrentPageName()
end
return CharacterScreen