diff --git a/sonic-radiance.love/datas/gamedata/characters/baseteam.lua b/sonic-radiance.love/datas/gamedata/characters/baseteam.lua new file mode 100644 index 0000000..765b627 --- /dev/null +++ b/sonic-radiance.love/datas/gamedata/characters/baseteam.lua @@ -0,0 +1 @@ +return {"sonic"} diff --git a/sonic-radiance.love/datas/gamedata/characters/default.lua b/sonic-radiance.love/datas/gamedata/characters/default.lua new file mode 100644 index 0000000..244037c --- /dev/null +++ b/sonic-radiance.love/datas/gamedata/characters/default.lua @@ -0,0 +1,57 @@ +return { + name = "Default", + name_full = "Default the Character", + class = "Speedster", + startlevel = 1, + isUnlockedAtStart = true, + + base_stats = { + hpmax = 200, -- + ppmax = 50, -- + + attack = 50, -- + power = 50, -- + defense = 50, -- + technic = 50, -- + mind = 50, -- + speed = 50, -- + + turns = 3, -- number of attacks by turn (unused) + move = 2, -- how far the character can get in one turn + }, + + color = {1, 1, 1}, + + skill_list = { + --{attack_name, level}, + }, + + flags = { + canGoSuper = true, + }, + + assets = { + charset = {"", 1}, + lifeicon = 1, + spriteset = "sonic", + }, + + inventory = { + haveShoes = true, + haveMechs = false, + haveGlove = true, + haveHammer= false, + accessories_number = 3, + chao_number = 1, + }, + + boost_stats = { + spd = 5, + jmp = 3, + jumpaction = "doublejump", + jumpaction_power = 2, + action = "spinattack", + action_power = 1, + canBreakCraft = false, + } +} diff --git a/sonic-radiance.love/datas/gamedata/characters/init.lua b/sonic-radiance.love/datas/gamedata/characters/init.lua new file mode 100644 index 0000000..6fe4ebc --- /dev/null +++ b/sonic-radiance.love/datas/gamedata/characters/init.lua @@ -0,0 +1,9 @@ +return { + "sonic", + "tails", + "knuckles", + "amy", + "cream", + "shadow", + "rouge", +} diff --git a/sonic-radiance.love/datas/gamedata/characters/sonic.lua b/sonic-radiance.love/datas/gamedata/characters/sonic.lua new file mode 100644 index 0000000..9b3bee1 --- /dev/null +++ b/sonic-radiance.love/datas/gamedata/characters/sonic.lua @@ -0,0 +1,70 @@ +return { + name = "Default", + name_full = "Default the Character", + class = "Speedster", + startlevel = 100, + isUnlockedAtStart = true, + + base_stats = { + hpmax = 200, -- + ppmax = 50, -- + + attack = 50, -- + power = 50, -- + defense = 50, -- + technic = 50, -- + mind = 50, -- + speed = 50, -- + + turns = 3, -- number of attacks by turn (unused) + move = 3, -- how far the character can get in one turn + }, + + color = {1, 1, 1}, + + skill_list = { + --{attack_name, level}, + {"spinattack", 2}, + {"spinjump", 3}, + {"spindash", 8}, + {"hommingattack", 11}, + {"spinattack", 15}, + {"sonicflare", 18}, + {"bluetornado", 22}, + {"spindash", 26}, + {"soniccracker", 30}, + {"hommingattack", 35}, + {"bluetornado", 40}, + {"boost", 62}, + {"lightspeedattack", 70}, + }, + + flags = { + canGoSuper = true, + }, + + assets = { + charset = {"", 1}, + lifeicon = 1, + spriteset = "sonic", + }, + + inventory = { + haveShoes = true, + haveMechs = false, + haveGlove = true, + haveHammer= false, + accessories_number = 3, + chao_number = 1, + }, + + boost_stats = { + spd = 5, + jmp = 3, + jumpaction = "doublejump", + jumpaction_power = 2, + action = "spinattack", + action_power = 1, + canBreakCraft = false, + } +} diff --git a/sonic-radiance.love/game/characters.lua b/sonic-radiance.love/game/characters.lua new file mode 100644 index 0000000..ab60ef6 --- /dev/null +++ b/sonic-radiance.love/game/characters.lua @@ -0,0 +1,199 @@ +-- game/characters :: The character handler. This object handle all the character +-- and is able to get and set datas about them. + +--[[ + Copyright © 2019 Kazhnuz + + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal in + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +]] + +local CharacterManager = Object:extend() + +function CharacterManager:new(controller) + self.controller = controller + self.namelist = require "datas.characters" + self.list = {} + self.team = require "datas.characters.baseteam" + self.active = 1 + self:init() +end + +function CharacterManager:init() + for k, v in pairs(self.namelist) do + local dir = "datas/characters/" .. v .. ".lua" + local fileinfo = love.filesystem.getInfo(dir) + if fileinfo ~= nil then + self:initCharacter(v) + end + end +end + +function CharacterManager:getCharacterData(charname) + -- va eprmettre de récupérer les données d'un personnage + return require("datas.characters." .. charname) +end + +function CharacterManager:initCharacter(id) + local stats = {} + local character = self:getCharacterData(id) + + stats.level = character.startlevel + stats.exp = self:getExpValue(stats.level) + stats.exp_next = self:getExpValue(stats.level + 1) + stats.hpmax = character.base_stats.hpmax + stats.ppmax = character.base_stats.ppmax + stats.attack = character.base_stats.attack + stats.power = character.base_stats.power + stats.defense = character.base_stats.defense + stats.technic = character.base_stats.technic + stats.mind = character.base_stats.mind + stats.speed = character.base_stats.speed + stats.turns = character.base_stats.turns + + character.stats = stats + self.list[id] = character + + self:recalculateStats(id) + + stats.hp = stats.hpmax + stats.pp = stats.ppmax + stats.status = 0 + + character.stats = stats + self.list[id] = character +end + +function CharacterManager:getExpValue(level) + return math.floor( ( 4 * ( level ^ 3 ) ) / 5 ) +end + +function CharacterManager:setLevel(id, newlevel) + self.list[id].stats.level = newlevel + local stats = self.list[id].stats + local exp, exp_next, exp_current + exp = self:getExpValue(stats.level) + exp_next = self:getExpValue(stats.level + 1) + exp_current = self.list[id].stats.exp + + self.list[id].stats.exp = math.max(math.min(exp_current, exp_next - 1), exp) + self.list[id].stats.exp_next = exp_next + + self:recalculateStats(id) +end + +function CharacterManager:levelUp(id) + self:setLevel(id, self.list[id].stats.level + 1) +end + +function CharacterManager:getStatValue(level, base) + return math.floor( (((base * 2) * level)/100) ) + 5 +end + +function CharacterManager:getHPValue(level, base) + return math.floor( (((base * 2.7) * level)/100) ) + 15 + level +end + +function CharacterManager:getPPValue(level, base) + return math.floor( (((base * 1.5) * level)/100) ) + 8 +end + +function CharacterManager:recalculateStats(id) + local character = self.list[id] + local stats = character.stats + local base_stats = character.base_stats + + stats.hpmax = self:getHPValue(stats.level, base_stats.hpmax) + stats.ppmax = self:getPPValue(stats.level, base_stats.ppmax) + stats.attack = self:getStatValue(stats.level, base_stats.attack) + stats.power = self:getStatValue(stats.level, base_stats.power) + stats.defense = self:getStatValue(stats.level, base_stats.defense) + stats.mind = self:getStatValue(stats.level, base_stats.mind) + stats.technic = self:getStatValue(stats.level, base_stats.technic) + stats.speed = self:getStatValue(stats.level, base_stats.speed) +end + +function CharacterManager:getSkillList(id) + local character = self.list[id] + local learnedlist = {} + + for i, v in ipairs(character.skill_list) do + local tech_name, tech_level, isLearned = v[1], v[2], false + if tech_level <= character.stats.level then + + if learnedlist[tech_name] == nil then + learnedlist[tech_name] = 1 + else + learnedlist[tech_name] = learnedlist[tech_name] + 1 + end + + end + -- On continue ensuite d'itérer dans la liste + end + + return learnedlist +end + +function CharacterManager:getData() + local data = {} + data.list = self.list + data.team = self.team + return data +end + +function CharacterManager:setData(data) + local data = data + self.list = data.list + self.team = data.team +end + +function CharacterManager:heal(id) + self.list[id].stats.hp = self.list[id].stats.hpmax + self.list[id].stats.hp = self.list[id].stats.ppmax + self.list[id].stats.status = 0 +end + +function CharacterManager:addToTeam(id) + self:heal(id) + table.insert(self.team, id) +end + +function CharacterManager:removeToTeam(teamid) + self.team[teamid] = "" +end + +function CharacterManager:getActiveCharacter() + return self.team[self.active] +end + +-- DEBUG FUNCTIONS + +function CharacterManager:printCharacter(id) + local character = self.list[id] + local stats = character.stats + print(id .. ". " .. character.fullname) + print("Lvl " .. character.stats.level .. " (" .. stats.exp .. "/" .. stats.exp_next .. " exp)") +end + +function CharacterManager:printTeam() + for i,v in ipairs(self.team) do + self:printCharacter(v) + print("-----") + end +end + +return CharacterManager