Refonte pour utiliser le systeme de GUI #112

Merged
kazhnuz merged 102 commits from feat/gui into master 2022-01-06 19:15:16 +01:00
36 changed files with 1065 additions and 1382 deletions
Showing only changes of commit 17c4b0de8e - Show all commits

View file

@ -32,6 +32,15 @@ local hideBackground = {
{"overlayDarken", "tween", 0.0, 0.6, {opacity = 0}, "outExpo"} {"overlayDarken", "tween", 0.0, 0.6, {opacity = 0}, "outExpo"}
} }
local showBackgroundPause = {
{"overlayDarken", "tween", 0.0, 0.2, {opacity = OVERLAY_OPACITY}, "inOutQuart"}
}
local hideBackgroundPause = {
{"overlayDarken", "tween", 0.0, 0.2, {opacity = 0}, "inOutQuart"}
}
local showVersion = { local showVersion = {
{"version", "movement", 0.0, 0.5, 380, 220, "inOutQuart"}, {"version", "movement", 0.0, 0.5, 380, 220, "inOutQuart"},
} }
@ -62,6 +71,8 @@ function OverlayScreen:new(active, doShowVersion)
self:addTransform("hide", animateDisappear) self:addTransform("hide", animateDisappear)
self:addTransform("showBackground", showBackground) self:addTransform("showBackground", showBackground)
self:addTransform("hideBackground", hideBackground) self:addTransform("hideBackground", hideBackground)
self:addTransform("showBackgroundPause", showBackgroundPause)
self:addTransform("hideBackgroundPause", hideBackgroundPause)
self:addTransform("showVersion", showVersion) self:addTransform("showVersion", showVersion)
self:addTransform("hideVersion", hideVersion) self:addTransform("hideVersion", hideVersion)

View file

@ -0,0 +1,34 @@
local CharBars = require("birb.modules.gui.elements.canvas"):extend()
local HPBAR_SIZE = 80
local W, H = HPBAR_SIZE*2, 32
local const = require "scenes.overworld.gui.menus.commons.const"
local ComplexHPBar = require "game.modules.gui.complexhpbar"
function CharBars:new(name, x, y, character)
CharBars.super.new(self, name, x, y, W, H)
self.canvas.padding = 24
self.character = character
self.hpbar = ComplexHPBar(HPBAR_SIZE)
self.ppbar = ComplexHPBar(HPBAR_SIZE)
self.hpbar:setColorForeground(248/255, 160/255, 0, 1)
self.hpbar:setColorBackground(112/255, 0, 0)
self.ppbar:setColorForeground(0, 248/255, 248/255, 1)
self.ppbar:setColorBackground(0, 54/255, 229/255)
self.opacity = 0
end
function CharBars:drawTexture()
local stats = self.character.stats
local x, y = self.canvas.padding, self.canvas.padding
self.scene.assets.fonts["hudnbrs_small"]:set()
self.hpbar:drawWithLabels(x, y - 4, self.character.hp, stats:get(stats.HPMAX))
local xx = x + const.CHARPAGESIZE - HPBAR_SIZE - 7
self.ppbar:drawWithLabels(xx, y - 4, self.character.pp, stats:get(stats.PPMAX))
end
return CharBars

View file

@ -0,0 +1,21 @@
local Description = require("birb.modules.gui.elements.canvas"):extend()
local PLAYER_MESSAGE = 240 - 24
function Description:new(owner, name)
self.owner = owner
Description.super.new(self, name, 0, PLAYER_MESSAGE, 424, 16)
self.canvas.isAnimated = true
end
function Description:drawTexture()
if (not utils.string.isEmpty(self.owner:getDescription())) then
love.graphics.setColor(0,0,0, 0.66)
love.graphics.rectangle("fill", self.canvas.padding, self.canvas.padding, self.w, self.h)
self.gui.scene.assets.fonts["small"]:setColor(1,1,1, 1)
self.gui.scene.assets.fonts["small"]:draw(self.owner:getDescription(), self.canvas.padding, self.canvas.padding - 1, self.w, "center")
self.gui.scene.assets.fonts["small"]:setColor(1,1,1, 1)
utils.graphics.resetColor()
end
end
return Description

View file

@ -0,0 +1,175 @@
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

View file

@ -0,0 +1,27 @@
local PageIndicator = require("birb.modules.gui.elements.canvas"):extend()
local DIST = 16
local RAD_SMALL, RAD_LARGE = 2, 3
local OUTLINE_LIGHT = 0.15
function PageIndicator:new(owner, name, x, y, pageList)
self.pageList = pageList
self.owner = owner
local w, h = (DIST*(#pageList + 1)), 16
PageIndicator.super.new(self, name, x, y, w, h)
self.canvas.isAnimated = true
self.opacity = 0
end
function PageIndicator:drawTexture()
for i, pageName in ipairs(self.pageList) do
local radius = utils.math.either (pageName == self.owner:getCurrentPageName(), RAD_LARGE, RAD_SMALL)
local x, y = (i+1) * DIST, math.floor(self.h / 2)
love.graphics.circle("fill", x, y, radius, 8)
love.graphics.setColor(OUTLINE_LIGHT, OUTLINE_LIGHT, OUTLINE_LIGHT, 1)
love.graphics.circle("line", x, y, radius, 8)
utils.graphics.resetColor()
end
end
return PageIndicator

View file

@ -0,0 +1,56 @@
local const = require "scenes.overworld.gui.menus.commons.const"
local subpages = {}
subpages.list = {"basic", "stats", "skills"}
subpages.elements = {
["basic"] = {"IdentityBox", "Bars", "LevelBox", "WeakStrongBox"},
["stats"] = {"EquipMenu", "StatsBox"},
["skills"] = {"SkillsMenu"}
}
subpages.equip = {"gloves", "shoes", "accessories"}
subpages.elementsData = {
IdentityBox = {y = 0, h = 40, isTextBox = true },
Bars = {y = 48, h = 0, isTextBox = false, isMenu = false},
LevelBox = {y = 72-13, h = 56, isTextBox = true},
WeakStrongBox = {y = 132-13, h = 40, isTextBox = true },
EquipMenu = {y = 0, h = 3, isTextBox = false, isMenu = true},
StatsBox = {y = 72, h = 72, isTextBox = true },
SkillsMenu = {y = 0, h = 9, isTextBox = false, isMenu = true},
}
function subpages.fromId(id)
return subpages.list[id]
end
function subpages.fromName(name)
for i, subPageName in ipairs(subpages.list) do
if subPageName == name then
return i
end
end
return -1
end
function subpages.relativePage(pageName, direction)
local id = utils.math.wrap(subpages.fromName(pageName) + direction, 1, #subpages.list)
return subpages.fromId(id)
end
function subpages.getElements(filter)
local list = {}
for i, subpageName in ipairs(subpages.list) do
if (filter == nil or filter == "" or filter == subpageName) then
for j, elementName in ipairs(subpages.elements[subpageName]) do
local data = subpages.elementsData[elementName]
table.insert(list, {name = elementName, page = subpageName, data = data})
end
end
end
return list
end
return subpages

View file

@ -0,0 +1,41 @@
local TextsFuncs = {}
local STATS = require "datas.consts.stats"
function TextsFuncs.getIdentityBox(character)
local identityString = character.fullname .. "\n"
identityString = identityString .. "Class: " .. character.data.class
return {{1, identityString}}
end
function TextsFuncs.getLevelBox(character)
local levelString = "Level: " .. character.level .. "\n"
levelString = levelString .. "Current exp: " .. character.exp .. "\n"
levelString = levelString .. "Next level: " .. character.exp_next
return {{1, levelString}}
end
function TextsFuncs.getWeakStrongBox(character)
local weakStrongString = "Weak to: Nothing" .. "\n"--"Earth, Lightning"
weakStrongString = weakStrongString .. "Resist To: Nothing"
return {{1, weakStrongString}}
end
function TextsFuncs.getStatsBox(character, pageSize)
local char = character
local statStringList = {}
for i, statName in ipairs(STATS.LIST) do
local xStat = (((i - 1) % 2) * (pageSize/2)) + 6
local line = math.floor((i + 1)/2)
local middle = xStat + 10 + pageSize/4
local stat = char.stats:get(statName)
table.insert(statStringList, {line, STATS.SIMPLENAME[statName], "left", xStat, 0, {1,1,1,1}, pageSize})
table.insert(statStringList, {line, stat, "center", middle, 0, {1,1,1,0.9}, -1})
end
return statStringList
end
return TextsFuncs

View file

@ -0,0 +1,38 @@
local BoxedTextElement = require("birb.modules.gui.elements.canvas"):extend()
local gui = require "game.modules.gui"
local PADDING = 6
local PADDING_H = 4
local LINEHEIGHT = 16
function BoxedTextElement:new(name, x, y, w, h, linesFunc)
BoxedTextElement.super.new(self, name, x, y, w, h)
self.textwidth = w - (PADDING * 2)
self.opacity = 0
self.canvas.isAnimated = true
self.linesFunc = linesFunc
self.box = gui.newTextBox("assets/gui/dialogbox.png", w, h)
self.canvas.padding = 0
end
function BoxedTextElement:getLines()
-- return {line, text, align, x, y, color}
return self.linesFunc()
end
function BoxedTextElement:drawTexture()
love.graphics.draw(self.box, 0, 0)
local lines = self:getLines()
assert(lines ~= nil, "No lines for " .. self.name)
for i, line in ipairs(lines) do
local lineNbr, text, align, x, y = line[1], line[2] or "", line[3] or "left", line[4] or 0, line[5] or 0
local color, width = line[6] or {1, 1, 1, 1}, line[7] or self.textwidth
self.assets.fonts["small"]:setColor(color[1], color[2], color[3], color[4])
self.assets.fonts["small"]:draw(text, PADDING + x, PADDING_H + LINEHEIGHT*(lineNbr-1) + y, width, align or "left")
self.assets.fonts["small"]:setColor(1, 1, 1, 1)
utils.graphics.resetColor()
end
end
return BoxedTextElement

View file

@ -0,0 +1,91 @@
local CharacterMenu = require("birb.modules.gui.menus.listbox"):extend()
local CharacterWidget = require("birb.modules.gui.menus.widgets.base"):extend()
local const = require "scenes.overworld.gui.menus.commons.const"
local ComplexHPBar = require "game.modules.gui.complexhpbar"
local Emblem = require "game.modules.gui.emblem"
function CharacterMenu:new(name, x, func, showEquip)
local w = const.WIDTH - x + 28
CharacterMenu.super.new(self, name, x, const.Y, w, const.HEIGHT, 4)
self.func = func
self.showEquip = (showEquip == true)
self.opacity = 1
self:buildFromTeam()
self.canvas.isAnimated = true
end
function CharacterMenu:buildFromTeam()
self.charName = game.characters.team[1]
for i, name in ipairs(game.characters.team) do
local widget = CharacterWidget(self.name, name)
widget:setFunc(function () self.func(name, i) end)
end
self:addHoverAction(function(widget) self.charName = widget.charName end)
end
function CharacterWidget:new(menuName, charName)
CharacterWidget.super.new(self, menuName)
self.charName = charName
self.emblem = Emblem(game.characters.list[charName], self.scene)
self.font = self.scene.assets.fonts["small"]
self.font2 = self.scene.assets.fonts["hudnbrs_small"]
self.hpbar = ComplexHPBar(88)
self.ppbar = ComplexHPBar(88)
self.hpbar:setColorForeground(248 / 255, 160 / 255, 0, 1)
self.hpbar:setColorBackground(112 / 255, 0, 0)
self.ppbar:setColorForeground(0, 248 / 255, 248 / 255, 1)
self.ppbar:setColorBackground(0, 54 / 255, 229 / 255)
self.canvas.isAnimated = true
self.character = game.characters.list[self.charName]
end
function CharacterWidget:drawCanvas()
local xDebut = 32
local yDebut = 16
self.emblem:draw(0, 6)
self.font:setFilter("shadow")
self.font:draw(self.character.fullname, xDebut, 0, -1, "left")
if (self.menu.showEquip ~= nil and self.menu.showEquip ~= false) then
self:drawEquip(xDebut, yDebut)
else
self:drawHPPP(xDebut, yDebut)
self:drawLvlExp(xDebut, yDebut)
end
end
function CharacterWidget:drawLvlExp(x, y)
self.scene.assets.images["lvl"]:draw(x, y)
self.scene.assets.images["exp"]:draw(x, y + 10)
self.font2:print(self.character.level, x + 19, y, "left")
local expString = self.character.exp .. "/" .. self.character.exp_next
self.font2:print(expString, x + 19, y + 10, "left")
end
function CharacterWidget:drawEquip(x, y)
local charEquip = self.character.equip[self.menu.showEquip]
local equipString = "None"
if (not utils.string.isEmpty(charEquip)) then
local data = core.datas:get("items", charEquip)
equipString = data.fullname
end
self.font:draw(equipString, x, y, -1, "left")
end
function CharacterWidget:drawHPPP(x, y)
local xDebut = x + 20
local yDebut = y - 1
self.scene.assets.fonts["hudnbrs_small"]:set()
local stats = self.character.stats
self.hpbar:drawWithLabels(xDebut + 53, yDebut, self.character.hp, stats:get(stats.HPMAX))
self.ppbar:drawWithLabels(xDebut + 64, yDebut + 11, self.character.pp, stats:get(stats.PPMAX))
end
return CharacterMenu

View file

@ -0,0 +1,35 @@
local TextElement = require "birb.modules.gui.elements.text"
local ScreenNameElement = TextElement:extend()
local nameList = {
mainmenuScreen = "Menu",
itemScreen = "Items",
useItemScreen = "Use item",
setEquipScreen = "Equip item"
}
function ScreenNameElement:new(owner, fontName, x, y, align)
self.owner = owner
ScreenNameElement.super.new(self, "screenName", fontName, "", x, y, align)
self.opacity = 0
self.currentScreen = "Menu"
end
function ScreenNameElement:getText()
if (self.owner.subscreens == nil) then
return "Menu"
end
local newScreen = self.owner.subscreens.currentScreen
if (not utils.string.isEmpty(newScreen)) then
if game.characters.list[newScreen] ~= nil then
local data = core.datas:get("characters", newScreen)
self.currentScreen = data.name
else
self.currentScreen = nameList[newScreen]
end
end
return self.currentScreen or ""
end
return ScreenNameElement

View file

@ -0,0 +1,44 @@
local GuiScreen = require "birb.modules.gui.screen"
local MenuScreen = GuiScreen:extend()
local ScreenNameElement = require "scenes.overworld.gui.menus.commons.screenName"
local MainMenuScreen = require "scenes.overworld.gui.menus.mainmenu"
local ItemScreen = require "scenes.overworld.gui.menus.items"
local UseItemScreen = require "scenes.overworld.gui.menus.useItem"
local SetEquipScreen = require "scenes.overworld.gui.menus.useItem.equip"
local CharacterScreen = require "scenes.overworld.gui.menus.character"
local show = {
{"screenName", "movement", 0, 0.5, 160, 12, "inOutQuart"},
{"screenName", "tween", 0, 0.5, {opacity = 1}, "inOutQuart"},
}
local hide = {
{"screenName", "movement", 0, 0.5, 160, -18, "inOutQuart"},
{"screenName", "tween", 0, 0.5, {opacity = 0}, "inOutQuart"},
}
function MenuScreen:new()
MenuScreen.super.new(self, "startmenu")
self:addTransform("show", show)
self:addTransform("hide", hide)
self:addSubscreen(MainMenuScreen())
self:addSubscreen(ItemScreen())
self:addSubscreen(UseItemScreen())
self:addSubscreen(SetEquipScreen())
for charName, _ in pairs(game.characters.list) do
self:addSubscreen(CharacterScreen(charName))
end
self.subscreens.delay = -1
end
function MenuScreen:createElements()
local list = {
{ScreenNameElement(self, "SA2font", 160, -18, "left"), 0, -100}
}
return list
end
return MenuScreen

View file

@ -0,0 +1,171 @@
local ItemsScreen = require("birb.modules.gui.screen"):extend()
local ItemMenu = require("game.modules.gui.boxedmenu")
local BoxedText = require("scenes.overworld.gui.menus.commons.boxedtext")
local ItemRoulette = require("scenes.overworld.gui.menus.items.roulette")
local POCKET_LIST = require "datas.gamedata.items"
local const = require "scenes.overworld.gui.menus.commons.const"
local MENU_WIDTH, DESC_SIZE, USE_SIZE = 128+32, 48*4, 96
local EFFECT_H, DESC_H = 40, 56
local HIDE_X, USE_X = 16, 16 - USE_SIZE / 2
local DESC_Y, USE_Y = (EFFECT_H + 8) + DESC_H, 24
local ConfirmDialog = require "game.modules.confirmdialog"
local show = {
{"itemRoulette", "movement", 0.1, 0.3, const.X, const.Y, "inOutQuart"},
{"itemRoulette", "tween", 0.1, 0.3, {opacity = 1}, "inOutQuart"},
{"descText", "movement", 0.1, 0.3, const.X, const.Y2 - DESC_Y, "inOutQuart"},
{"descText", "tween", 0.1, 0.3, {opacity = 1}, "inOutQuart"},
{"effectText", "movement", 0.1, 0.3, const.X, const.Y2 - EFFECT_H, "inOutQuart"},
{"effectText", "tween", 0.1, 0.3, {opacity = 1}, "inOutQuart"},
{"itemMenu", "movement", 0.1, 0.3, const.X2 - MENU_WIDTH, const.Y + 4, "inOutQuart"},
{"itemMenu", "tween", 0.1, 0.3, {opacity = 1}, "inOutQuart"},
{"useMenu", "tween", 0.0, 0.3, {opacity = 0, sx = 1, sy = 1}, "inOutQuart"},
}
local hide = {
{"itemRoulette", "movement", 0, 0.3, const.X - HIDE_X, const.Y, "inOutQuart"},
{"itemRoulette", "tween", 0, 0.3, {opacity = 0}, "inOutQuart"},
{"descText", "movement", 0, 0.3, const.X - HIDE_X, const.Y2 - DESC_Y, "inOutQuart"},
{"descText", "tween", 0, 0.3, {opacity = 0}, "inOutQuart"},
{"effectText", "movement", 0, 0.3, const.X - HIDE_X, const.Y2 - EFFECT_H, "inOutQuart"},
{"effectText", "tween", 0, 0.3, {opacity = 0}, "inOutQuart"},
{"itemMenu", "movement", 0, 0.3, const.X2 - MENU_WIDTH + HIDE_X, const.Y + 4, "inOutQuart"},
{"itemMenu", "tween", 0, 0.3, {opacity = 0}, "inOutQuart"},
{"useMenu", "tween", 0.0, 0.3, {opacity = 0, sx = 0.8, sy = 0.8}, "inOutQuart"},
}
local showUseMenu = {
{"useMenu", "tween", 0.0, 0.3, {opacity = 1, sx = 1, sy = 1}, "inOutQuart"},
{"useMenu", "delayFocus", 0}
}
local hideUseMenu = {
{"useMenu", "tween", 0.0, 0.3, {opacity = 0, sx = 0.8, sy = 0.8}, "inOutQuart"},
{"itemMenu", "delayFocus", 0}
}
function ItemsScreen:new()
self.desc, self.effect = "", ""
ItemsScreen.super.new(self, "itemScreen")
self:addTransform("show", show)
self:addTransform("hide", hide)
self:addTransform("showUseMenu", showUseMenu)
self:addTransform("hideUseMenu", hideUseMenu)
self.defaultFocus = "itemMenu"
end
function ItemsScreen:createElements()
self.menu = ItemMenu("itemMenu", const.X2 - MENU_WIDTH, const.Y + 4, MENU_WIDTH, 9, true, true)
self.menu.opacity = 0
self:rebuildMenu()
self.use = ItemMenu("useMenu", const.X2 + USE_X, const.Y2 - USE_Y, USE_SIZE, 3, true, false)
self.use.opacity, self.use.ox, self.use.oy = 0, USE_SIZE/2, self.use.h / 2
return {{self.menu, 0, 1},
{BoxedText("descText", const.X, const.Y2 - DESC_Y, DESC_SIZE, DESC_H, function () return {{1, self.desc}} end), 0, 1},
{BoxedText("effectText", const.X, const.Y2 - EFFECT_H, DESC_SIZE, EFFECT_H, function () return {{1, self.effect}} end), 0, 1},
{ItemRoulette(self, const.X, const.Y), 0, 1},
{self.use, 0, 1}
}
end
function ItemsScreen:rebuildMenu()
self.menu:clear()
for i, pocket in ipairs(POCKET_LIST) do
self.menu:addPage(pocket.name)
self.menu:switch(pocket.name)
local pocketData = game.loot:getPocketById(i)
for j,item in ipairs(pocketData.list) do
local itemData = core.datas:get("items", item.name)
self.menu:addItem(itemData.fullname, "left", function () self:showUseMenu(item, j) end, "navigate", {{"x" .. utils.math.numberToString(item.number, 2), "right"}}, nil, {item.name})
end
self.menu:addItem("Back", "left", function() self.gui:showScreen("mainmenuScreen") end, "back")
self.menu:addHoverAction(function(widget) self:setDescEffectFromWidget(widget) end)
self.menu:setCancelWidget()
self.menu:addLateralAction(function (key) if (key == "left") then self:changePage(-1) else self:changePage(1) end end)
end
self.menu:switch("medicines")
end
function ItemsScreen:showUseMenu(item, i)
self.dropQuantity = 1
self.use:clear()
self.use:addItem("Use", "left", function () self:useItem(item.name, i) end, "")
self.use:addItem("Drop", "left", function () self:dropItem(item.name) end, "select", {{"<" .. utils.math.numberToString(self.dropQuantity, 2) .. ">", "right"}})
self.use:addItem("Back", "left", function () self:playTransform("hideUseMenu") end, "back")
self.use:addLateralAction(function(key, funcWidget, id)
if (key == "left" and id == 2) then
self:modifyDrop(-1, funcWidget, item.number)
elseif (key == "right" and id == 2) then
self:modifyDrop(1, funcWidget, item.number)
end end)
self.use:setCancelWidget()
self:playTransform("showUseMenu")
end
function ItemsScreen:useItem(itemName, i)
local pocketData = game.loot:getPocketByName(self.menu:getCurrentPageName())
local itemData = core.datas:get("items", itemName)
if (pocketData.isEquipement) then
self.gui:showScreen("setEquipScreen", nil, nil, nil, {self.menu:getCurrentPageName(), game.loot:getPocketByName(self.menu:getCurrentPageName()).list[i], i})
self.gui.scene.assets:playSFX("mSelect")
elseif (itemData.usableOnMap) then
self.gui:showScreen("useItemScreen", nil, nil, nil, {self.menu:getCurrentPageName(), game.loot:getPocketByName(self.menu:getCurrentPageName()).list[i], i})
self.gui.scene.assets:playSFX("mSelect")
else
self.gui.scene.assets:playSFX("mError")
end
end
function ItemsScreen:dropItem(itemName)
local confirm = ConfirmDialog(self.scene, "Do you want to drop these items ? \nYou won't be able to recover them.",
function()
game.loot:removeItem(self.menu:getCurrentPageName(), itemName, self.dropQuantity)
self:rebuildMenu()
self:playTransform("hideUseMenu")
end)
confirm:setCancelChoice(2)
confirm.autoDismiss = true
end
function ItemsScreen:modifyDrop(direction, widget, max)
self.dropQuantity = utils.math.wrap(self.dropQuantity + direction, 1, max)
widget:replaceLabel(2, "<" .. utils.math.numberToString(self.dropQuantity, 2) .. ">")
widget.canvas.needRedraw = true
self.use.canvas.needRedraw = true
self.gui.scene.assets.sfx["mBeep"]:play()
end
function ItemsScreen:setDescEffectFromWidget(widget)
if (widget.datas ~= nil) then
self:setDescEffect(widget.datas[1])
else
self.desc, self.effect = "", ""
end
end
function ItemsScreen:changePage(direction)
local id = self:getPocketData()
local newMenuIndex = utils.math.wrap(id + direction, 1, #POCKET_LIST)
self.menu:switch(POCKET_LIST[newMenuIndex].name)
self.gui.scene.assets.sfx["mBeep"]:play()
end
function ItemsScreen:setDescEffect(name)
local itemData = core.datas:get("items", name)
self.desc, self.effect = itemData.description, game.loot:getEffectStrings("", name)
end
function ItemsScreen:getPocketData()
local id = game.loot:getPocketIdByName(self.menu:getCurrentPageName())
return id, self.menu:getCurrentPageName(), POCKET_LIST[id].fullname
end
return ItemsScreen

View file

@ -0,0 +1,40 @@
local ItemRoulette = require("birb.modules.gui.elements.canvas"):extend()
local gui = require "game.modules.gui"
local W, H = 48*4, 48 + 20
function ItemRoulette:new(owner, x, y)
ItemRoulette.super.new(self, "itemRoulette", x, y, W, H)
self.choiceBack = gui.newChoiceBack(W)
self.opacity = 0
self.owner = owner
self.canvas.padding = 0
self.canvas.isAnimated = true
end
function ItemRoulette:drawTexture()
love.graphics.draw(self.choiceBack, 0, 0)
local id, _, fullName = self.owner:getPocketData()
local x2, y2, w2 = 16, -2, (W - 24)
self.scene.assets.fonts["small"]:draw("<", x2, y2, w2, "left")
self.scene.assets.fonts["small"]:draw(">", x2, y2, w2, "right")
self.scene.assets.fonts["small"]:draw(fullName, x2, y2, w2, "center")
for i, pocket in ipairs(game.loot.inventory) do
local trueIndex = i - id
if (trueIndex > 4) then
trueIndex = trueIndex - 8
end
if (trueIndex < -4) then
trueIndex = trueIndex + 8
end
if (trueIndex ~= 0) then
love.graphics.setColor(.3, .3, .3, .6)
end
self.scene.assets.tileset["itembox"]:drawTile(i, W/2 + ((trueIndex)*32), 20, 0, 1, 1, 14, 0)
utils.graphics.resetColor()
end
end
return ItemRoulette

View file

@ -0,0 +1,87 @@
local GuiScreen = require "birb.modules.gui.screen"
local MainMenuScreen = GuiScreen:extend()
local FancyMenu = require "game.modules.gui.fancymenu"
local const = require "scenes.overworld.gui.menus.commons.const"
local NavigationMenu = FancyMenu:extend()
local CharacterMenu = require "scenes.overworld.gui.menus.commons.charmenu"
local CHARMENU_X = const.X + 136
local defTransitions = require "birb.modules.transitions"
local ConfirmDialog = require "game.modules.confirmdialog"
local show = {
{"navigationMenu", "movement", 0.1, 0.3, const.X, const.Y, "inOutQuart"},
{"navigationMenu", "tween", 0.1, 0.3, {opacity = 1}, "inOutQuart"},
{"navCharMenu", "movement", 0.1, 0.3, CHARMENU_X, const.Y, "inOutQuart"},
{"navCharMenu", "tween", 0.1, 0.3, {opacity = 1}, "inOutQuart"},
}
local hide = {
{"navigationMenu", "movement", 0, 0.3, const.X - 16, const.Y, "inOutQuart"},
{"navigationMenu", "tween", 0, 0.3, {opacity = 0}, "inOutQuart"},
{"navCharMenu", "movement", 0, 0.3, CHARMENU_X + 16, const.Y, "inOutQuart"},
{"navCharMenu", "tween", 0, 0.3, {opacity = 0}, "inOutQuart"},
}
function MainMenuScreen:new()
MainMenuScreen.super.new(self, "mainmenuScreen")
self:addTransform("show", show)
self:addTransform("hide", hide)
self.defaultFocus = "navigationMenu"
end
function MainMenuScreen:createElements()
local menu = FancyMenu("navigationMenu", const.X - 16, const.Y, 108, 10, false)
menu:addItem("Team", "left", function() self.gui:setFocus("navCharMenu") end, "navigate", {{">", "right"}})
menu:addItem("Quest", "left", function() end, "navigate", {{">", "right"}})
menu:addItem("Items", "left", function() self.gui:showScreen("itemScreen") end, "navigate", {{">", "right"}})
menu:addItem("Chao", "left", function() end, "navigate", {{">", "right"}})
menu:addItem("Encylopedia", "left", function() end, "navigate", {{">", "right"}})
menu:addSubmenu("save", "Save / Exit", "main", true)
menu:addItem("Save game", "left", function() self:save() self.scene:unpause() end, "select")
menu:addItem("Save and exit", "left", function() self:save() self:exitToMenu() end, "navigate")
menu:addItem("Exit game", "left", function() self:exit() end, "select")
menu:switch("main")
menu:addItem("Resume", "left", function() self.scene:unpause() end, "back")
menu:setCancelWidget()
menu.opacity = 0
local charMenu = CharacterMenu("navCharMenu", CHARMENU_X + 16,
function (name, i)
self.gui:showScreen(name, nil, 1, "basic")
self.gui:getScreen(name).menu.canvas.needRedraw = true
self.gui:getScreen(name).desc = ""
self.gui:getScreen(name).nbr = i
end, false)
charMenu:addCancelAction(function ()
self.gui:setFocus("navigationMenu")
self.gui.scene.assets:playSFX("mBack")
end)
charMenu.opacity = 0
return {{menu, 0, 1}, {charMenu, 0, 1}}
end
function MainMenuScreen:save()
self.scene.world:savePosition()
game:write()
end
function MainMenuScreen:exit()
local confirm = ConfirmDialog(self.scene, "Do you to exit the game ? \nAll unsaved data will be lost.",
function() self:exitToMenu() end)
confirm:setCancelChoice(2)
end
function MainMenuScreen:exitToMenu()
core.screen:startTransition(defTransitions.default, defTransitions.circle, function() game:reload() scenes.menus.main() end, 424/2, 240/2)
self.gui:hideScreen("hud")
end
function NavigationMenu:new()
NavigationMenu.super.new(self)
end
return MainMenuScreen

View file

@ -0,0 +1,52 @@
local SetEquipScreen = require("scenes.overworld.gui.menus.useItem.parent"):extend()
local STATS = require "datas.consts.stats"
function SetEquipScreen:new()
SetEquipScreen.super.new(self, "setEquip", 32 * 6, true)
end
function SetEquipScreen:applyEffect(character)
character:setEquip(self.category, self.item.name)
end
function SetEquipScreen:getDescription()
local returnData = {}
table.insert(returnData, {1, self.itemData.fullname})
self.charName = self.gui:getElement("setEquipMenu").charName
if (self.charName ~= "") then
local char = game.characters.list[self.charName]
for i, statName in ipairs(STATS.LIST) do
local lineNbr = math.floor((i-1)/2)
local isLeft = ((i%2) == 1)
local stat = char.stats:get(statName)
local newStat = char:predictStat(statName, self.category, self.item.name)
local sep = ": "
if i > 2 then
sep = ": "
end
local line = STATS.SIMPLENAME[statName] .. sep .. utils.math.numberToString(stat, 3) .. " > " .. utils.math.numberToString(newStat, 3)
local color = {1, 1, 1, 1}
if (newStat > stat) then
color = {0.3, 1, 0.3, 0.9}
elseif (newStat < stat) then
color = {1, 0.3, 0.3, 0.9}
end
table.insert(returnData, {lineNbr + 2, line, utils.math.either(isLeft, "left", "right"), 0, 0, color})
end
end
return returnData
end
function SetEquipScreen:setDatas(datas)
SetEquipScreen.super.setDatas(self, datas)
self.charMenu.showEquip = self.category
end
return SetEquipScreen

View file

@ -0,0 +1,23 @@
local UseItemScreen = require("scenes.overworld.gui.menus.useItem.parent"):extend()
local EffectManager = require "game.loot.effectManager"
function UseItemScreen:new()
self.effectManager = EffectManager()
UseItemScreen.super.new(self, "useItem", 128, false)
end
function UseItemScreen:applyEffect(character)
self.effectManager:applyEffects(character)
game.loot:removeItem(self.category, self.item.name, 1)
end
function UseItemScreen:setDatas(datas)
UseItemScreen.super.setDatas(self, datas)
self.effectManager:getItemData(self.category, self.item.name)
end
function UseItemScreen:getDescription()
return {{1, self.itemData.fullname .. ":\n" .. self.effects}}
end
return UseItemScreen

View file

@ -0,0 +1,21 @@
local ItemNumberElement = require("birb.modules.gui.elements.canvas"):extend()
local W = 48 + 16
local gui = require "game.modules.gui"
function ItemNumberElement:new(owner, name, x, y)
ItemNumberElement.super.new(self, name, x, y, W, 18)
self.choiceBack = gui.newChoiceBack(W)
self.canvas.isAnimated, self.canvas.padding = true, 0
self.owner = owner
self.opacity = 0
end
function ItemNumberElement:drawTexture()
love.graphics.draw(self.choiceBack, 0, 0)
self.scene.assets.fonts["small"]:draw("x" .. self.owner:getItemNumber(), 16, -2, -1, "left")
end
return ItemNumberElement

View file

@ -0,0 +1,91 @@
local UseScreenParent = require("birb.modules.gui.screen"):extend()
local CharacterMenu = require("scenes.overworld.gui.menus.commons.charmenu")
local BoxedText = require "scenes.overworld.gui.menus.commons.boxedtext"
local ItemNumber = require "scenes.overworld.gui.menus.useItem.number"
local const = require "scenes.overworld.gui.menus.commons.const"
local DESC_H = 40 + 48
local NBR_Y = 24
function UseScreenParent:new(prefix, descW, showEquip)
self.prefix = prefix
self.descW = descW
self.showEquip = showEquip
self.nbrX = const.X + self.descW - 48
self.charMenuX = const.X + self.descW + 8
UseScreenParent.super.new(self, prefix .. "Screen")
self:addTransformsWithPrefix()
self.defaultFocus = prefix .. "Menu"
end
function UseScreenParent:addTransformsWithPrefix()
local show = {
{self.prefix .. "Desc", "movement", 0.1, 0.3, const.X, const.Y, "inOutQuart"},
{self.prefix .. "Desc", "tween", 0.1, 0.3, {opacity = 1}, "inOutQuart"},
{self.prefix .. "Nbr", "movement", 0, 0.3, self.nbrX, const.Y2 - NBR_Y, "inOutQuart"},
{self.prefix .. "Nbr", "tween", 0, 0.3, {opacity = 1}, "inOutQuart"},
{self.prefix .. "Menu", "movement", 0.1, 0.3, self.charMenuX, const.Y, "inOutQuart"},
{self.prefix .. "Menu", "tween", 0.1, 0.3, {opacity = 1}, "inOutQuart"},
}
local hide = {
{self.prefix .. "Desc", "movement", 0, 0.3, const.X - 16, const.Y, "inOutQuart"},
{self.prefix .. "Desc", "tween", 0, 0.3, {opacity = 0}, "inOutQuart"},
{self.prefix .. "Nbr", "movement", 0, 0.3, self.nbrX - 16, const.Y2 - NBR_Y, "inOutQuart"},
{self.prefix .. "Nbr", "tween", 0, 0.3, {opacity = 0}, "inOutQuart"},
{self.prefix .. "Menu", "movement", 0, 0.3, self.charMenuX + 16, const.Y, "inOutQuart"},
{self.prefix .. "Menu", "tween", 0, 0.3, {opacity = 0}, "inOutQuart"},
}
self:addTransform("show", show)
self:addTransform("hide", hide)
end
function UseScreenParent:createElements()
self.charMenu = CharacterMenu(self.prefix .. "Menu", self.charMenuX + 16, function(name) self:useItem(name) end, self.showEquip)
self.charMenu:addCancelAction(function() self:exitScreen() end)
self.charMenu.opacity = 0
return {
{self.charMenu, 0, 1},
{BoxedText(self.prefix .. "Desc", const.X - 16, const.Y, self.descW, DESC_H,
function() if (self.itemData ~= nil) then return self:getDescription() else return {{1, ""}} end end), 0, 1},
{ItemNumber(self, self.prefix .. "Nbr", self.nbrX - 16, const.Y2 - NBR_Y), 0, 1}
}
end
function UseScreenParent:useItem(charName)
local character = game.characters.list[charName]
self:applyEffect(character)
self.gui:getScreen("itemScreen"):rebuildMenu()
if (self.item.number <= 1) then
self:exitScreen()
end
end
function UseScreenParent:exitScreen()
self.gui:showScreen("itemScreen", nil, self.nbr, self.category)
self.gui.scene.assets:playSFX("mBack")
end
function UseScreenParent:setDatas(datas)
--category, item, widgetId)
local category = datas[1]
self.item = datas[2]
self.nbr = datas[3] or 1
self.itemData = core.datas:get("items", self.item.name)
self.category = category
self.effects = game.loot:getEffectStrings(self.category, self.item.name)
end
function UseScreenParent:getItemNumber()
if (self.item ~= nil) then
return self.item.number or 0
end
return 0
end
return UseScreenParent

View file

@ -27,14 +27,11 @@ local OverWorld = Scene:extend()
local World = require "scenes.overworld.world" local World = require "scenes.overworld.world"
local CharsetManager = require "scenes.overworld.charsetmanager" local CharsetManager = require "scenes.overworld.charsetmanager"
local screens = require "scenes.overworld.screens"
local gui = require "game.modules.gui"
local TweenManager = require "birb.classes.time" local TweenManager = require "birb.classes.time"
local EventManager = require "game.events" local EventManager = require "game.events"
local OWScreen = require "scenes.overworld.gui.init" local OWScreen = require "scenes.overworld.gui.init"
local MenusScreen = require "scenes.overworld.gui.menus"
function OverWorld:new(area, playerx, playery) function OverWorld:new(area, playerx, playery)
OverWorld.super.new(self, false, false) OverWorld.super.new(self, false, false)
@ -42,16 +39,11 @@ function OverWorld:new(area, playerx, playery)
self.assets:batchImport("assets.overworld") self.assets:batchImport("assets.overworld")
self.tweens = TweenManager(self) self.tweens = TweenManager(self)
self.screens = screens
World(self, area, playerx, playery) World(self, area, playerx, playery)
self.world:setPlayerNumber(1) self.world:setPlayerNumber(1)
self.world:loadMap() self.world:loadMap()
self.currentScreen = nil
self.backGroundOpacity = 0
self.borderPosition = 0
self.isPaused = false self.isPaused = false
self.canPause = false self.canPause = false
self.gui:hideScreen("overlay") self.gui:hideScreen("overlay")
@ -62,6 +54,7 @@ function OverWorld:new(area, playerx, playery)
self.events = EventManager(self) self.events = EventManager(self)
OWScreen() OWScreen()
MenusScreen()
end end
function OverWorld:updateCurrentMap(map) function OverWorld:updateCurrentMap(map)
@ -90,13 +83,6 @@ function OverWorld:endEvent()
self.canPause = true self.canPause = true
end end
function OverWorld:registerScreen(screen)
if (self.currentScreen ~= nil) then
self.currentScreen:quit()
end
self.currentScreen = screen
end
function OverWorld:update(dt) function OverWorld:update(dt)
local keys = self:getKeys(1) local keys = self:getKeys(1)
self.tweens:update(dt) self.tweens:update(dt)
@ -106,10 +92,6 @@ function OverWorld:update(dt)
self.charsetManager:update(dt) self.charsetManager:update(dt)
end end
if (self.currentScreen ~= nil) then
self.currentScreen:update(dt)
end
if (keys["start"].isPressed and self.canPause) then if (keys["start"].isPressed and self.canPause) then
if (not self.isPaused) then if (not self.isPaused) then
if (not self.gui.screens["overlay"].isVisible) then if (not self.gui.screens["overlay"].isVisible) then
@ -124,20 +106,19 @@ function OverWorld:update(dt)
end end
function OverWorld:pause() function OverWorld:pause()
self.tweens:newTween(0,0.2, {backGroundOpacity=0.75}, "inQuad")
self.gui:showScreen("overlay") self.gui:showScreen("overlay")
self.gui:playScreenTransform("hud", "pause") self.gui:playScreenTransform("hud", "pause")
self.gui:playScreenTransform("overlay", "showBackgroundPause")
self.isPaused = true self.isPaused = true
self.world.isActive = false self.world.isActive = false
screens.mainmenu.pause(self) self.gui:showScreen("startmenu")
end end
function OverWorld:gameover() function OverWorld:gameover()
self.tweens:newTween(0,0.2, {backGroundOpacity=0.75}, "inQuad")
self.gui:showScreen("overlay") self.gui:showScreen("overlay")
self.gui:hideScreen("hud") self.gui:hideScreen("hud")
self.gui:playScreenTransform("overlay", "showBackgroundPause")
self.world.isActive = false self.world.isActive = false
screens.gameover(self)
end end
function OverWorld:restored() function OverWorld:restored()
@ -152,18 +133,11 @@ function OverWorld:timerResponse(timer)
end end
function OverWorld:unpause() function OverWorld:unpause()
self.tweens:newTween(0.1, 0.2, {backGroundOpacity=0}, "inQuad")
self.tweens:newTimer(0.2, "unPause") self.tweens:newTimer(0.2, "unPause")
self.gui:playScreenTransform("overlay", "hideBackgroundPause")
self.gui:hideScreen("overlay") self.gui:hideScreen("overlay")
self.gui:playScreenTransform("hud", "unpause") self.gui:playScreenTransform("hud", "unpause")
self.gui:hideScreen("startmenu")
if (self.currentScreen ~= nil) then
self.currentScreen:quit()
end
end
function OverWorld:quitScreen()
self.currentScreen = nil
end end
function OverWorld:getEmblemsPosition() function OverWorld:getEmblemsPosition()
@ -172,28 +146,6 @@ end
function OverWorld:draw() function OverWorld:draw()
self.events:draw() self.events:draw()
self:drawScreenBottomLayer()
end
function OverWorld:drawOverTransition()
self:drawScreenTopLayer()
end
function OverWorld:drawScreenBottomLayer()
love.graphics.setColor(0, 0, 0, self.backGroundOpacity)
love.graphics.rectangle("fill", 0, 0, 424, 240)
utils.graphics.resetColor()
if (self.currentScreen ~= nil) then
self.currentScreen:drawBackground()
self.currentScreen:drawForeground()
end
end
function OverWorld:drawScreenTopLayer()
if (self.currentScreen ~= nil) then
self.currentScreen:drawOverEverything()
end
end end
return OverWorld return OverWorld

View file

@ -1,89 +0,0 @@
local BaseScreen = require "scenes.overworld.screens.parent"
local GameOver = BaseScreen:extend()
local TweenManager = require "birb.classes.time"
local gui = require "game.modules.gui"
local tw, th = 128, 32
local defTransitions = require "birb.modules.transitions"
local ConfirmDialog = require "game.modules.confirmdialog"
function GameOver:new(scene)
GameOver.super.new(self, scene, "")
self.assets = scene.assets
self.turnSystem = scene.turns
self:setVariables()
self.continueBox = gui.newTextBox("assets/gui/dialogbox.png", tw, th)
self.tweens = TweenManager(self)
self:prepareAnimation()
end
function GameOver:setVariables()
-- Vignette Opacity
self.vignetteOpacity = 0
-- Battle FInished Label
self.labelOpacity = 0
local width, height = core.screen:getDimensions()
self.labelX = width/2
-- Infobox
self.tbSize = 0.6
self.tbOpacity = 0
end
function GameOver:prepareAnimation()
-- Label
self.tweens:newTween(0, 0.6, {labelOpacity=1}, 'inExpo')
self.tweens:newTween(0.9, 0.4, {labelX=4}, 'inExpo')
self.tweens:newTimer(1.8, "continue")
end
function GameOver:update(dt)
self.tweens:update(dt)
end
function GameOver:draw()
local width, height = core.screen:getDimensions()
self:drawVignette(width, height)
self:drawLabel(width/2, 48, self.labelX, self.labelOpacity)
end
function GameOver:timerResponse(timer)
if (timer == "continue") then
local confirm = ConfirmDialog(self.scene, "Do you want to return to title ? \nYou can also reload your latest save.",
function() self:returnToTitle() end, "Return to title",
function() self:loadLastSave() end, "Reload last save")
confirm.darken = false
end
end
function GameOver:drawVignette(width, height)
love.graphics.setColor(0, 0, 0, self.vignetteOpacity)
love.graphics.rectangle("fill", 0, 0, width, height)
end
function GameOver:drawLabel(x, y, x2, opacity)
love.graphics.setColor(1, 1, 1, opacity)
self.assets.fonts["SA2font"]:print("GAME", x - x2, y, "right")
self.assets.fonts["SA2font"]:print("OVER", x + x2, y, "left")
end
function GameOver:returnToTitle()
core.screen:startTransition(defTransitions.default, defTransitions.circle, function() scenes.menus.title(true) end, 424/2, 240/2)
end
function GameOver:loadLastSave()
self.scene.tweens:newTween(0, 0.3, {borderPosition=0}, "inOutQuad")
core.screen:startTransition(defTransitions.default, defTransitions.default, function() game:reload() scenes.overworld() end, 424/2, 240/2)
end
return GameOver

View file

@ -1,4 +0,0 @@
return {
mainmenu = require "scenes.overworld.screens.mainmenu",
gameover = require "scenes.overworld.screens.gameover"
}

View file

@ -1,69 +0,0 @@
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"
local const = require "scenes.overworld.screens.mainmenu.const"
local ComplexHPBar = require "game.modules.gui.complexhpbar"
local HPBAR_SIZE = 80
function BasicPage:new(view, character)
self.view = view
self.character = game.characters.list[character]
self.statBox = gui.newTextBox("assets/gui/dialogbox.png", const.CHARPAGESIZE, 48+8)
self.nameBox = gui.newTextBox("assets/gui/dialogbox.png", const.CHARPAGESIZE, 40)
self.hpbar = ComplexHPBar(HPBAR_SIZE)
self.ppbar = ComplexHPBar(HPBAR_SIZE)
self.hpbar:setColorForeground(248/255, 160/255, 0, 1)
self.hpbar:setColorBackground(112/255, 0, 0)
self.ppbar:setColorForeground(0, 248/255, 248/255, 1)
self.ppbar:setColorBackground(0, 54/255, 229/255)
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:drawWeakStrong(const.X, 160)
end
function BasicPage:drawIdentity(x, y)
local identityString = self.character.fullname .. "\n"
identityString = identityString .. "Class: " .. self.character.data.class
love.graphics.draw(self.nameBox, x, y)
self.view.scene.assets.fonts["small"]:draw(identityString, x + 6, y + 4, -1, "left")
end
function BasicPage:drawHPPP(x, y)
local stats = self.character.stats
self.view.scene.assets.fonts["hudnbrs_small"]:set()
self.hpbar:drawWithLabels(x, y - 4, self.character.hp, stats:get(stats.HPMAX))
local xx = x + const.CHARPAGESIZE - HPBAR_SIZE - 7
self.ppbar:drawWithLabels(xx, y - 4, self.character.pp, stats:get(stats.PPMAX))
end
function BasicPage:drawLevel(x, y)
local levelString = "Level: " .. self.character.level .. "\n"
local levelString = levelString .. "Current exp: " .. self.character.exp .. "\n"
local levelString = levelString .. "Next level: " .. self.character.exp_next
love.graphics.draw(self.statBox, x, y)
self.view.scene.assets.fonts["small"]:draw(levelString, x + 6, y + 4, -1, "left")
end
function BasicPage:drawWeakStrong(x, y)
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")
end
return BasicPage

View file

@ -1,122 +0,0 @@
local ParentScreen = require "scenes.overworld.screens.parent"
local CharacterScreen = ParentScreen:extend()
local menu = require "game.modules.menus.fancy"
local gui = require "game.modules.gui"
local const = require "scenes.overworld.screens.mainmenu.const"
local BasicPage = require "scenes.overworld.screens.mainmenu.character.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()
function CharacterScreen:new(scene, character)
self.character = game.characters.list[character]
self.charName = character
self.page = BasicPage(self, character)
self.pageIndex = 1
self.artwork = love.graphics.newImage("datas/gamedata/characters/" .. character .. "/artwork.png")
self.artworkOrigin = require("datas.gamedata.characters." .. character .. ".artwork")
CharacterScreen.super.new(self, scene, self.character.name)
end
function CharacterScreen:update(dt)
local keys = self.scene:getKeys(1)
if (keys["left"].isPressed) then
self:setPage(self.pageIndex - 1)
self.scene.assets.sfx["mBeep"]:play()
end
if (keys["right"].isPressed) then
self:setPage(self.pageIndex + 1)
self.scene.assets.sfx["mBeep"]:play()
end
end
function CharacterScreen:setPage(newPageIndex)
local newPageIndex = newPageIndex or 1
if (newPageIndex > #pageList) then
newPageIndex = 1
end
if (newPageIndex < 1) then
newPageIndex = #pageList
end
self.pageIndex = newPageIndex
self.page = pageList[self.pageIndex](self, self.charName)
self.scene.menusystem:reset()
self:setMenu()
end
function CharacterScreen:setMenu()
local itemNumber = self.page:getMenuSize()
local y = const.Y2 - (16*itemNumber) + 2
menu.FancyMenu(self.scene, "menu", const.X2 - 128 - 14, y, 128, itemNumber, false)
self.page:getMenuWidgets()
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
self.scene.menusystem:setSoundFromSceneAssets("mBeep")
end
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)
self.charName = charName
ReturnWidget.super.new(self, scene, "menu", "Back", "")
end
function ReturnWidget:action()
for i, name in ipairs(game.characters.team) do
if (name == self.charName) then
self.widgetSelected = i
end
end
self.scene.assets:playSFX("mBack")
self.scene.screens.mainmenu["pause"](self.scene, "character", self.widgetSelected)
end
return CharacterScreen

View file

@ -1,47 +0,0 @@
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)
self.scene.assets.sfx["mBeep"]:play()
end
return PageParent

View file

@ -1,71 +0,0 @@
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 = ""
self.showMessage = false
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")
self.showMessage = true
end
end
function StatPage:drawOverEverything()
if (not utils.string.isEmpty(self.message) and self.showMessage) 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.showMessage = false
self.scene.assets.sfx["mBack"]:play()
end
function SkillWidget:new(page, skill)
self.page = page
self.skillData = core.datas:get("skills", 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

View file

@ -1,88 +0,0 @@
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 STATS = require "datas.consts.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:get(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()
self.scene.assets.sfx["mBack"]:play()
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 = core.datas:get("items", obj)
return data.fullname
end
function EquipWidget:action()
self.page:removeEquip(self.type)
self.label = self:getLabel()
self:redrawCanvas()
self.scene.assets.sfx["mSelect"]:play()
end
return StatPage

View file

@ -1,12 +0,0 @@
local baseMenu = require "game.modules.menus.parents.menu"
local CharacterMenu = baseMenu:extend()
local const = require "scenes.overworld.screens.mainmenu.const"
function CharacterMenu:new(scene, x)
local x = x or const.X + 136
local w = const.WIDTH - x + 28
CharacterMenu.super.new(self, scene, "character", x, const.Y, w, const.HEIGHT, 4)
end
return CharacterMenu

View file

@ -1,65 +0,0 @@
local baseWidget = require "game.modules.menus.parents.widget"
local CharacterWidget = baseWidget:extend()
local ComplexHPBar = require "game.modules.gui.complexhpbar"
local Emblem = require "game.modules.gui.emblem"
-- Hero custom widget
--
function CharacterWidget:new(scene, name, showEquip)
self.charName = name
self.emblem = Emblem(game.characters.list[name], scene)
self.font2 = scene.assets.fonts["hudnbrs_small"]
self.showEquip = showEquip
CharacterWidget.super.new(self, scene, "character")
self.hpbar = ComplexHPBar(88)
self.ppbar = ComplexHPBar(88)
self.hpbar:setColorForeground(248 / 255, 160 / 255, 0, 1)
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 CharacterWidget:drawCanvas()
local character = game.characters.list[self.charName]
self.font:setFilter("shadow")
local debut = 0
local xDebut = 32
self.font:draw(character.fullname, xDebut, debut, -1, "left")
if (self.showEquip == nil) then
local yLvl = debut + 16
local xLvl = xDebut
self.scene.assets.images["lvl"]:draw(xLvl, yLvl)
self.scene.assets.images["exp"]:draw(xLvl, yLvl + 10)
self.font2:print(character.level, xLvl + 19, yLvl, "left")
local expString = character.exp .. "/" .. character.exp_next
self.font2:print(expString, xLvl + 19, yLvl + 10, "left")
else
local charEquip = character.equip[self.showEquip]
local equipString = "None"
if (not utils.string.isEmpty(charEquip)) then
local data = core.datas:get("items", charEquip)
equipString = data.fullname
end
self.font:draw(equipString, xDebut, debut + 16, -1, "left")
end
end
function CharacterWidget:draw(x, y)
local character = game.characters.list[self.charName]
self.emblem:draw(x, y + 6)
if (self.showEquip == nil) then
local xDebut = x + 52
local yDebut = y + 15
self.scene.assets.fonts["hudnbrs_small"]:set()
local stats = character.stats
self.hpbar:drawWithLabels(xDebut + 53, yDebut, character.hp, stats:get(stats.HPMAX))
self.ppbar:drawWithLabels(xDebut + 64, yDebut + 11, character.pp, stats:get(stats.PPMAX))
end
if self.canvas.texture ~= nil then
love.graphics.draw(self.canvas.texture, x - self.ox, y - self.oy)
end
end
return CharacterWidget

View file

@ -1,115 +0,0 @@
local ParentScreen = require "scenes.overworld.screens.parent"
local EquipScreen = ParentScreen:extend()
local menu = require "game.modules.menus.list"
local const = require "scenes.overworld.screens.mainmenu.const"
local gui = require "game.modules.gui"
local baseCharacterMenu = require "scenes.overworld.screens.mainmenu.common.charmenu"
local baseCharacterWidget = require "scenes.overworld.screens.mainmenu.common.charwidget"
local CharacterMenu = baseCharacterMenu:extend()
local CharacterWidget = baseCharacterWidget:extend()
local STATS = require "datas.consts.stats"
local DESC_SIZE = 32 * 6
function EquipScreen:new(scene, category, item, widgetId)
self.category = category
self.item = item
self.itemData = core.datas:get("items", self.item.name)
self.widgetId = widgetId
self.choiceBack = gui.newChoiceBack(48 + 16)
self.descBox = gui.newTextBox("assets/gui/dialogbox.png", DESC_SIZE, 40 + 48+16)
self.desc = self.itemData.description
self.charName = ""
EquipScreen.super.new(self, scene, "Equipement")
end
function EquipScreen:setMenu()
CharacterMenu(self.scene, 224)
for i, name in ipairs(game.characters.team) do
CharacterWidget(self.scene, name, self.category)
end
self.scene.menusystem:switchMenu("character")
end
function EquipScreen:draw()
self.scene.assets.fonts["small"]:setLineHeight(16 / 18)
self:drawPocket()
self:drawDescription(const.X, const.Y)
end
function EquipScreen:drawDescription(x, y)
love.graphics.draw(self.descBox, x, y)
local xx, yy, ww = x + 6, y + 4, DESC_SIZE - 12
self.scene.assets.fonts["small"]:draw(self.itemData.fullname, xx, yy, ww, "left")
if (self.charName ~= "") then
local char = game.characters.list[self.charName]
for i, statName in ipairs(STATS.LIST) do
local xStat = xx + (((i - 1) % 2) * (ww/2))
local yStat = yy + (math.floor((i-1)/2) * 16) + 24
local middle = xStat + 10 + ww/4
local stat = char.stats:get(statName)
local newStat = char:predictStat(statName, self.category, self.item.name)
self.scene.assets.fonts["small"]:draw(STATS.SIMPLENAME[statName], xStat, yStat, ww, "left")
self.scene.assets.fonts["small"]:setColor(1, 1, 1, 0.9)
self.scene.assets.fonts["small"]:draw(stat .. " ", middle, yStat, -1, "right")
self.scene.assets.fonts["small"]:draw(">", middle, yStat, -1, "center")
if (newStat > stat) then
self.scene.assets.fonts["small"]:setColor(0.3, 1, 0.3, 0.9)
elseif (newStat < stat) then
self.scene.assets.fonts["small"]:setColor(1, 0.3, 0.3, 0.9)
end
self.scene.assets.fonts["small"]:draw(" " .. newStat, middle, yStat, -1, "left")
self.scene.assets.fonts["small"]:setColor(1, 1, 1, 1)
utils.graphics.resetColor()
end
end
end
function EquipScreen:drawPocket()
local x = const.X + DESC_SIZE - 48
local y = const.Y2 - 24
love.graphics.draw(self.choiceBack, x, y)
self.scene.assets.fonts["small"]:draw("x" .. self.item.number, x + 16, y - 2, -1, "left")
end
function EquipScreen:goBack()
self.scene.screens.mainmenu["items"](self.scene, game.loot:getPocketIdByName(self.category), self.widgetId)
end
function EquipScreen:useItem(charName)
local character = game.characters.list[charName]
if (self.item.number <= 1) then
character:setEquip(self.category, self.item.name)
self:goBack()
else
character:setEquip(self.category, self.item.name)
end
end
-- Character menu
function CharacterMenu:cancelAction()
-- Switch à l'écran précédant
self.scene.assets:playSFX("mBack")
self.scene.currentScreen:goBack()
end
-- Hero custom widget
--
function CharacterWidget:selectAction()
self.scene.currentScreen.charName = self.charName
end
function CharacterWidget:action()
self.scene.assets:playSFX("mSelect")
self.scene.currentScreen:useItem(self.charName)
self:redrawCanvas()
end
return EquipScreen

View file

@ -1,7 +0,0 @@
return {
pause = require "scenes.overworld.screens.mainmenu.pause",
character = require "scenes.overworld.screens.mainmenu.character",
items = require "scenes.overworld.screens.mainmenu.items",
useItems = require "scenes.overworld.screens.mainmenu.useitems",
equip = require "scenes.overworld.screens.mainmenu.equip"
}

View file

@ -1,258 +0,0 @@
local ParentScreen = require "scenes.overworld.screens.parent"
local ItemsScreen = ParentScreen:extend()
local menu = require "game.modules.menus.list"
local const = require "scenes.overworld.screens.mainmenu.const"
local gui = require "game.modules.gui"
local ItemWidget = menu.DualTextWidget:extend()
local BackWidget = menu.DualTextWidget:extend()
local ResumeWidget = menu.DualTextWidget:extend()
local DropWidget = menu.DualTextWidget:extend()
local UseWidget = menu.DualTextWidget:extend()
local DESC_SIZE = 48*4
local ConfirmDialog = require "game.modules.confirmdialog"
function ItemsScreen:new(scene, menuIndex, widgetIndex)
self.menuIndex = menuIndex or 1
self.widgetIndex = widgetIndex or 1
self.choiceBack = gui.newChoiceBack(DESC_SIZE)
self.descBox = gui.newTextBox("assets/gui/dialogbox.png", DESC_SIZE, 40+16)
self.effectBox = gui.newTextBox("assets/gui/dialogbox.png", DESC_SIZE, 40)
self.desc = ""
self.effects = ""
ItemsScreen.super.new(self, scene, "Items")
end
function ItemsScreen:update(dt)
if (self.scene.menusystem.menus["useMenu"] == nil) then
local keys = self.scene:getKeys(1)
if (keys["left"].isPressed) then
self.widgetIndex = 1
self:getMenu(self.menuIndex - 1)
self.scene.assets.sfx["mBeep"]:play()
end
if (keys["right"].isPressed) then
self.widgetIndex = 1
self:getMenu(self.menuIndex + 1)
self.scene.assets.sfx["mBeep"]:play()
end
end
end
function ItemsScreen:getMenu(newMenuIndex)
local newMenuIndex = newMenuIndex or 1
if (newMenuIndex > #game.loot.inventory) then
newMenuIndex = 1
end
if (newMenuIndex < 1) then
newMenuIndex = #game.loot.inventory
end
self.menuIndex = newMenuIndex
self.scene.menusystem:reset()
self:setMenu()
end
function ItemsScreen:setMenu(widgetId)
self.pocket = game.loot:getPocketById(self.menuIndex)
local w = 128+32
menu.ListMenu(self.scene, "menu", const.X2 - w, const.Y + 8, w, 9, true)
for i,item in ipairs(self.pocket.list) do
--menu.DualTextWidget(self.scene, "menu", item.name, "x" .. item.number)
ItemWidget(self.scene, self.pocket.name, item, i)
end
BackWidget(self.scene)
self.scene.menusystem.menus["menu"]:setCancelWidget()
self.scene.menusystem:switchMenu("menu")
self.scene.menusystem.menus["menu"].isLocked = true
self.scene.menusystem.menus["menu"].widget.selected = math.max(1, self.widgetIndex)
self.scene.menusystem.menus["menu"].cursorTransition = math.max(0, self.widgetIndex - 1)
self.scene.menusystem:setSoundFromSceneAssets("mBeep")
end
function ItemsScreen:setUseMenu(item, widgetId)
local w = 96
menu.ListMenu(self.scene, "useMenu", const.X2 + 16 - w, const.Y2 - 48, w, 3, true)
UseWidget(self.scene, self.pocket.name, item, widgetId)
DropWidget(self.scene, self.pocket.name, item, widgetId)
ResumeWidget(self.scene)
self.scene.menusystem.menus["useMenu"]:setCancelWidget()
self.scene.menusystem:switchMenu("useMenu")
self.scene.menusystem.menus["useMenu"]:setDepth(-1)
end
function ItemsScreen:removeUseMenu()
self.scene.menusystem.menus["useMenu"]:destroy()
self.scene.menusystem:switchMenu("menu")
end
function ItemsScreen:draw()
self:drawPocket()
self:drawDescription(const.X, const.Y2 - (88+16))
self:drawEffects(const.X, const.Y2 - 40)
end
function ItemsScreen:drawDescription(x, y)
love.graphics.draw(self.descBox, x, y)
local xx, yy, ww = x + 6, y + 4, DESC_SIZE - 12
self.scene.assets.fonts["small"]:draw(self.desc, xx, yy, ww, "left")
end
function ItemsScreen:drawEffects(x, y)
love.graphics.draw(self.effectBox, x, y)
local xx, yy, ww = x + 6, y + 4, DESC_SIZE - 12
self.scene.assets.fonts["small"]:draw(self.effects, xx, yy, ww, "left")
end
function ItemsScreen:drawPocket()
local middleX = ((16) + (DESC_SIZE - 24)) / 2
love.graphics.draw(self.choiceBack, const.X, const.Y)
self.scene.assets.fonts["small"]:draw("<", const.X + 16, const.Y - 2, -1, "left")
self.scene.assets.fonts["small"]:draw(">", const.X + DESC_SIZE - 24, const.Y - 2, -1, "right")
self.scene.assets.fonts["small"]:draw(self.pocket.fullname, const.X + middleX, const.Y - 2, -1, "center")
self:drawPocketRoll(const.X + 48*2, const.Y + 20)
end
function ItemsScreen:drawPocketRoll(x, y)
core.screen:setScissor(const.X, const.Y+ 16, 48*4, 48)
local trueX = x - ((self.menuIndex - 1) * 32)
for i, pocket in ipairs(game.loot.inventory) do
local trueIndex = i - self.menuIndex
if (trueIndex > 4) then
trueIndex = trueIndex - 8
end
if (trueIndex < -4) then
trueIndex = trueIndex + 8
end
if (trueIndex ~= 0) then
love.graphics.setColor(.3, .3, .3, .6)
end
self.scene.assets.tileset["itembox"]:drawTile(i, x + ((trueIndex)*32), y, 0, 1, 1, 14, 0)
utils.graphics.resetColor()
end
core.screen:resetScissor()
end
-- Items Widgets
function ItemWidget:new(scene, pocket, item, widgetId)
self.item = item
self.itemData = core.datas:get("items", self.item.name)
self.pocket = pocket
self.widgetId = widgetId
ItemWidget.super.new(self, scene, "menu", self.itemData.fullname, "x" .. utils.math.numberToString(self.item.number, 2))
end
function ItemWidget:selectAction()
self.scene.currentScreen.desc = self.itemData.description
self.scene.currentScreen.effects = game.loot:getEffectStrings(self.pocket, self.item.name)
end
function ItemWidget:action()
self.scene.assets:playSFX("mSelect")
self.scene.currentScreen:setUseMenu(self.item, self.widgetId)
end
function BackWidget:new(scene)
ItemWidget.super.new(self, scene, "menu", "Back", "")
end
function BackWidget:selectAction()
self.scene.currentScreen.desc = ""
self.scene.currentScreen.effects = ""
end
function BackWidget:action()
self.scene.assets:playSFX("mBack")
self.scene.screens.mainmenu["pause"](self.scene, "main", 3)
end
-- Use Menu Widget
function UseWidget:new(scene, pocket, item, widgetId)
self.item = item
self.itemData = core.datas:get("items", self.item.name)
self.pocket = pocket
self.pocketData = game.loot:getPocketByName(self.pocket)
self.widgetId = widgetId
UseWidget.super.new(self, scene, "useMenu", "Use", "")
if (not (self.itemData.usableOnMap or self.pocketData.isEquipement)) then
self.color = {0.6, 0.6, 0.6}
end
end
function UseWidget:action()
if (self.pocketData.isEquipement) then
self.scene.screens.mainmenu["equip"](self.scene, self.pocket, self.item, self.widgetId)
self.scene.assets:playSFX("mSelect")
elseif (self.itemData.usableOnMap) then
self.scene.screens.mainmenu["useItems"](self.scene, self.pocket, self.item, self.widgetId)
self.scene.assets:playSFX("mSelect")
else
self.scene.assets:playSFX("mError")
end
end
function DropWidget:new(scene, pocket, item, widgetId)
self.item = item
self.itemData = core.datas:get("items", self.item.name)
self.pocket = pocket
self.max = self.item.number
self.widgetId = widgetId
self.number = 1
DropWidget.super.new(self, scene, "useMenu", "Drop", "<" .. utils.math.numberToString(self.number, 2) .. ">")
end
function DropWidget:updateSelected()
local keys = self.scene:getKeys(1)
if (keys["left"].isPressed) then
if (self.number > 1) then
self.number = self.number - 1
else
self.number = self.max
end
self.label2 = "<" .. utils.math.numberToString(self.number, 2) .. ">"
self:invalidateCanvas()
end
if (keys["right"].isPressed) then
if (self.number < self.max) then
self.number = self.number + 1
else
self.number = 1
end
self.label2 = "<" .. utils.math.numberToString(self.number, 2) .. ">"
self:invalidateCanvas()
end
end
function DropWidget:action()
self.scene.assets:playSFX("mSelect")
local confirm = ConfirmDialog(self.scene, "Do you want to drop these items ? \nYou won't be able to recover them.",
function() self:drop() end)
confirm:setCancelChoice(2)
confirm.autoDismiss = true
end
function DropWidget:drop()
game.loot:removeItem(self.pocket, self.item.name, self.number)
self.scene.currentScreen.widgetIndex = self.widgetId
self.scene.currentScreen:removeUseMenu()
self.scene.currentScreen:setMenu()
end
function ResumeWidget:new(scene)
ResumeWidget.super.new(self, scene, "useMenu", "Back", "")
end
function ResumeWidget:action()
self.scene.assets:playSFX("mBack")
self.scene.currentScreen:removeUseMenu()
end
return ItemsScreen

View file

@ -1,137 +0,0 @@
local ParentScreen = require "scenes.overworld.screens.parent"
local PauseScreen = ParentScreen:extend()
local menu = require "game.modules.menus.fancy"
local baseCharacterMenu = require "scenes.overworld.screens.mainmenu.common.charmenu"
local baseCharacterWidget = require "scenes.overworld.screens.mainmenu.common.charwidget"
local CharacterMenu = baseCharacterMenu:extend()
local CharacterWidget = baseCharacterWidget:extend()
local TeamWidget = menu.BaseWidget:extend()
local ViewWidget = menu.BaseWidget:extend()
local SaveExitWidget = menu.BaseWidget:extend()
local defTransitions = require "birb.modules.transitions"
local radTransitions = require "game.modules.transitions"
local ConfirmDialog = require "game.modules.confirmdialog"
local const = require "scenes.overworld.screens.mainmenu.const"
function PauseScreen:new(scene, menu, widget)
self.menuSelected = menu or "main"
self.widgetSelected = widget
self.widget = widget
PauseScreen.super.new(self, scene, "Menu")
end
function PauseScreen:setMenu()
menu.FancyMenu(self.scene, "main", const.X, const.Y, 108, 10, false)
TeamWidget(self.scene)
menu.BaseWidget(self.scene, "main", "Quest", ">")
ViewWidget(self.scene, "Items", "items")
menu.BaseWidget(self.scene, "main", "Chao", ">")
menu.BaseWidget(self.scene, "main", "Encylopedia", ">")
--menu.BaseWidget(self.scene, "main", "Options", ">")
self.scene.menusystem.menus["main"]:addSubMenu("save", "Save / Exit")
SaveExitWidget(self.scene, "main", "Resume", false, false)
SaveExitWidget(self.scene, "save", "Save game", true, false)
SaveExitWidget(self.scene, "save", "Save and exit", true, true)
SaveExitWidget(self.scene, "save", "Exit game", false, true)
self.scene.menusystem.menus["main"]:finalize()
self.scene.menusystem.menus["main"]:setCancelWidget()
CharacterMenu(self.scene)
for i, name in ipairs(game.characters.team) do
CharacterWidget(self.scene, name)
end
self.scene.menusystem.menus["character"].isLocked = true
self.scene.menusystem:switchMenu(self.menuSelected)
self.scene.menusystem.menus["main"].isVisible = true
if (self.widgetSelected ~= nil) then
self.scene.menusystem.menus[self.menuSelected].widget.selected = self.widgetSelected
self.scene.menusystem.menus[self.menuSelected].cursorTransition = self.widgetSelected - 1
end
self.scene.menusystem:setSoundFromSceneAssets("mBeep")
end
function PauseScreen:draw()
end
-- Character menu
function CharacterMenu:cancelAction()
self.scene.assets:playSFX("mBeep")
self.scene.menusystem:switchMenu("main")
end
-- Hero custom widget
--
function CharacterWidget:action()
self.scene.assets:playSFX("mSelect")
self.scene.screens.mainmenu.character(self.scene, self.charName)
end
-- Team Widget
--
function TeamWidget:new(scene)
TeamWidget.super.new(self, scene, "main", "Team", ">")
end
function TeamWidget:action()
self.scene.assets:playSFX("mBeep")
self.scene.menusystem.menus["character"]:getFocus()
end
-- View Widget
function ViewWidget:new(scene, name, view)
TeamWidget.super.new(self, scene, "main", name, ">")
self.nextView = view
end
function ViewWidget:action()
self.scene.assets:playSFX("mSelect")
self.scene.screens.mainmenu[self.nextView](self.scene)
end
-- Save & Exit Widget
function SaveExitWidget:new(scene, menu, name, save, exit)
SaveExitWidget.super.new(self, scene, menu, name, "")
self.exit = exit
self.save = save
end
function SaveExitWidget:action()
if (self.save or self.exit) then
self.scene.assets:playSFX("mSelect")
else
self.scene.assets:playSFX("mBack")
end
if (self.save) then
self.scene.world:savePosition()
game:write()
end
if (self.exit) then
if (self.save) then
self:exitToMenu()
else
local confirm = ConfirmDialog(self.scene, "Do you to exit the game ? \nAll unsaved data will be lost.",
function() self:exitToMenu() end)
confirm:setCancelChoice(2)
end
else
self.scene:unpause()
end
end
function SaveExitWidget:exitToMenu()
core.screen:startTransition(defTransitions.default, defTransitions.circle, function() game:reload() scenes.menus.main() end, 424/2, 240/2)
self.scene.tweens:newTween(0, 0.3, {ringBorder=-16}, "inOutQuad")
self.scene.tweens:newTween(0, 0.3, {timeBorder=-20}, "inOutQuad")
end
return PauseScreen

View file

@ -1,91 +0,0 @@
local ParentScreen = require "scenes.overworld.screens.parent"
local UseItemsScreen = ParentScreen:extend()
local menu = require "game.modules.menus.list"
local const = require "scenes.overworld.screens.mainmenu.const"
local gui = require "game.modules.gui"
local baseCharacterMenu = require "scenes.overworld.screens.mainmenu.common.charmenu"
local baseCharacterWidget = require "scenes.overworld.screens.mainmenu.common.charwidget"
local CharacterMenu = baseCharacterMenu:extend()
local CharacterWidget = baseCharacterWidget:extend()
local EffectManager = require "game.loot.effectManager"
local DESC_SIZE = 32 * 4
function UseItemsScreen:new(scene, category, item, widgetId)
UseItemsScreen.super.new(self, scene, "Use item")
self.category = category
self.item = item
self.itemData = core.datas:get("items", self.item.name)
self.widgetId = widgetId
self.choiceBack = gui.newChoiceBack(48 + 16)
self.descBox = gui.newTextBox("assets/gui/dialogbox.png", DESC_SIZE, 40 + 48)
self.desc = self.itemData.description
self.effects = game.loot:getEffectStrings(self.category, self.item.name)
self.effectManager = EffectManager()
self.effectManager:getItemData(category, self.item.name)
end
function UseItemsScreen:setMenu()
CharacterMenu(self.scene)
for i, name in ipairs(game.characters.team) do
CharacterWidget(self.scene, name)
end
self.scene.menusystem:switchMenu("character")
end
function UseItemsScreen:draw()
self.scene.assets.fonts["small"]:setLineHeight(16 / 18)
self:drawPocket()
self:drawDescription(const.X, const.Y)
end
function UseItemsScreen:drawDescription(x, y)
love.graphics.draw(self.descBox, x, y)
local xx, yy, ww = x + 6, y + 4, DESC_SIZE - 12
self.scene.assets.fonts["small"]:draw(self.itemData.fullname .. ":\n" .. self.effects, xx, yy, ww, "left")
end
function UseItemsScreen:drawPocket()
local x = const.X + DESC_SIZE - 48
local y = const.Y2 - 24
love.graphics.draw(self.choiceBack, x, y)
self.scene.assets.fonts["small"]:draw("x" .. self.item.number, x + 16, y - 2, -1, "left")
end
function UseItemsScreen:goBack()
self.scene.screens.mainmenu["items"](self.scene, game.loot:getPocketIdByName(self.category), self.widgetId)
end
function UseItemsScreen:useItem(charName)
local character = game.characters.list[charName]
self.effectManager:applyEffects(character)
if (self.item.number <= 1) then
game.loot:removeItem(self.category, self.item.name, 1)
self:goBack()
else
game.loot:removeItem(self.category, self.item.name, 1)
end
end
-- Character menu
function CharacterMenu:cancelAction()
-- Switch à l'écran précédant
self.scene.assets:playSFX("mBack")
self.scene.currentScreen:goBack()
end
-- Hero custom widget
--
function CharacterWidget:action()
self.scene.assets:playSFX("mSelect")
self.scene.currentScreen:useItem(self.charName)
end
return UseItemsScreen

View file

@ -1,103 +0,0 @@
local ListBox = require "birb.modules.menusystem.listbox"
local Widget = require "birb.modules.menusystem.widgets"
local menu = {}
menu.CustomMenu = ListBox:extend()
menu.BasicMenu = ListBox:extend()
menu.BoxedMenu = menu.BasicMenu:extend()
menu.BasicWidget = Widget.Text:extend()
menu.BoxedWidget = menu.BasicWidget:extend()
local CONST = {}
CONST.MENU = {}
CONST.MENU.ITEM_HEIGHT = 16
local gui = require "game.modules.gui"
-- Custom Menu
function menu.CustomMenu:new(scene, name, x, y, w, h, itemNumber)
self.scene = scene
menu.CustomMenu.super.new(self, scene.menusystem, name, x, y, w, h, itemNumber)
end
-- Basic menu
function menu.BasicMenu:new(scene, name, itemNumber, x, y, w)
self.scene = scene
local h = itemNumber * CONST.MENU.ITEM_HEIGHT
menu.BasicMenu.super.new(self, scene.menusystem, name, x, y, w, h, itemNumber)
self.cursorTexture = love.graphics.newImage("assets/gui/cursor-menulist.png")
self.cursorTransition = 0
end
function menu.BasicMenu:update(dt)
menu.BasicMenu.super.update(self, dt)
local relativecursor = self.widget.selected - self.view.firstSlot
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
end
function menu.BasicMenu:drawCursor()
local addition = 17
local x = self.x - 1
local y = self.y + ((self.cursorTransition) * addition) + 1
love.graphics.draw(self.cursorTexture, x, y)
end
-- Boxed menu
function menu.BoxedMenu:new(scene, name, itemNumber, x, y, w)
menu.BoxedMenu.super.new(self, scene, name, itemNumber, x, y, w)
self.box = gui.newTextBox("assets/gui/dialogbox.png", self.w+16, self.h+16)
end
function menu.BoxedMenu:draw()
love.graphics.draw(self.box, self.x-8, self.y-8)
menu.BoxedMenu.super.draw(self)
end
-- Basic Widget
function menu.BasicWidget:new(scene, menu_name, label, label2)
local font = scene.assets.fonts["small"]
self.scene = scene
local widgetMenu = scene.menusystem.menus[menu_name]
self.label2 = label2 or ""
menu.BasicWidget.super.new(self, widgetMenu, font, label)
end
function menu.BasicWidget:drawCanvas()
local h = math.floor(self.height / 2) - (self.font:getHeight() / 2)
love.graphics.setColor(0, 0, 0, 1)
self.font:print(self.label, 9, h, "left")
self.font:print(self.label2, self.width - 7, h, "right")
utils.graphics.resetColor()
self.font:print(self.label, 8, h, "left")
self.font:print(self.label2, self.width - 8, h, "right")
end
-- Basic Widget
function menu.BoxedWidget:new(scene, menu_name, label, label2)
menu.BoxedWidget.super.new(self, scene, menu_name, label, label2)
self.box = gui.newChoiceBack(self.menu.w + 24)
end
function menu.BoxedWidget:drawCanvas()
love.graphics.draw(self.box, 0, 0)
local h = math.floor(self.height / 2) - (self.font:getHeight() / 2) - 1
love.graphics.setColor(0, 0, 0, .8)
self.font:print(self.label, 17, h, "left")
self.font:print(self.label2, self.width - 8, h, "right")
utils.graphics.resetColor()
self.font:print(self.label, 16, h, "left")
self.font:print(self.label2, self.width - 9, h, "right")
end
return menu

View file

@ -1,49 +0,0 @@
local MenuScreenParent = Object:extend()
local menu = require "scenes.overworld.screens.menu"
local const = require "scenes.overworld.screens.mainmenu.const"
function MenuScreenParent:new(scene, title)
self.scene = scene
self.menusystem = scene.menusystem
self.menuObj = menu
self.title = title or ""
self.scene:registerScreen(self)
self:setMenu()
end
function MenuScreenParent:update(dt)
end
function MenuScreenParent:setMenu()
end
function MenuScreenParent:quit()
self.scene.menusystem:reset()
self.scene:quitScreen()
end
function MenuScreenParent:drawForeground()
self.scene.assets.fonts["SA2font"]:print(self.title, 160, 12)
--love.graphics.rectangle("line", const.X, const.Y, const.WIDTH, const.HEIGHT)
self:draw()
end
function MenuScreenParent:draw()
end
function MenuScreenParent:drawBackground()
end
function MenuScreenParent:drawOverEverything()
end
return MenuScreenParent