diff --git a/sonic-radiance.love/datas/gamedata/battles/elements.lua b/sonic-radiance.love/datas/gamedata/battles/elements.lua new file mode 100644 index 0000000..3ec5f5b --- /dev/null +++ b/sonic-radiance.love/datas/gamedata/battles/elements.lua @@ -0,0 +1,42 @@ +return { + ["none"] = { + fullname = "None", + weakTo = {}, + resists = {} + }, + ["water"] = { + fullname = "Water", + weakTo = {"light"}, + resists = {"fire", "water"} + }, + ["fire"] = { + fullname = "Fire", + weakTo = {"water"}, + resists = {"ice", "fire"} + }, + ["ice"] = { + fullname = "Fire", + weakTo = {"fire"}, + resists = {"wind", "ice"} + }, + ["wind"] = { + fullname = "Fire", + weakTo = {"ice"}, + resists = {"earth", "wind"} + }, + ["earth"] = { + fullname = "Fire", + weakTo = {"wind"}, + resists = {"light", "earth"} + }, + ["light"] = { + fullname = "Fire", + weakTo = {"earth"}, + resists = {"water", "light"} + }, + ["chaos"] = { + fullname = "Chaos", + weakTo = {"chaos"}, + resists = {} + } +} \ No newline at end of file diff --git a/sonic-radiance.love/datas/gamedata/battles/protectypes.lua b/sonic-radiance.love/datas/gamedata/battles/protectypes.lua new file mode 100644 index 0000000..222ce6f --- /dev/null +++ b/sonic-radiance.love/datas/gamedata/battles/protectypes.lua @@ -0,0 +1,22 @@ +return { + ["basic"] = { + resistTo = {}, + backDamage = {} + }, + ["aerial"] = { + resistTo = {"basic"}, + backDamage = {} + }, + ["shielded"] = { + resistTo = {"basic", "projectile"}, + backDamage = {} + }, + ["spiked"] = { + resistTo = {"basic", "aerial"}, + backDamage = {"basic", "aerial"} + }, + ["backspiked"] = { + resistTo = {"aerial"}, + backDamage = {"aerial"} + }, +} \ No newline at end of file diff --git a/sonic-radiance.love/datas/gamedata/characters/amy/init.lua b/sonic-radiance.love/datas/gamedata/characters/amy/init.lua index ab50f27..0621f24 100644 --- a/sonic-radiance.love/datas/gamedata/characters/amy/init.lua +++ b/sonic-radiance.love/datas/gamedata/characters/amy/init.lua @@ -13,6 +13,9 @@ return { canGoSuper = true, canBreakCraft = false, + weakTo = {}, + resists = {}, + icon = 3, charset = "perso", charId = 3, diff --git a/sonic-radiance.love/datas/gamedata/characters/sonic/init.lua b/sonic-radiance.love/datas/gamedata/characters/sonic/init.lua index cc1a34b..80f68cc 100644 --- a/sonic-radiance.love/datas/gamedata/characters/sonic/init.lua +++ b/sonic-radiance.love/datas/gamedata/characters/sonic/init.lua @@ -13,6 +13,9 @@ return { canGoSuper = true, canBreakCraft = false, + weakTo = {"water"}, + resists = {"wind"}, + icon = 1, charset = "perso", charId = 1, diff --git a/sonic-radiance.love/datas/gamedata/characters/tails/init.lua b/sonic-radiance.love/datas/gamedata/characters/tails/init.lua index eca83a7..56b76a6 100644 --- a/sonic-radiance.love/datas/gamedata/characters/tails/init.lua +++ b/sonic-radiance.love/datas/gamedata/characters/tails/init.lua @@ -13,6 +13,9 @@ return { canGoSuper = true, canBreakCraft = false, + weakTo = {"light"}, + resists = {"earth"}, + icon = 2, charset = "perso", charId = 2, diff --git a/sonic-radiance.love/game/abstractmobs/character/datas.lua b/sonic-radiance.love/game/abstractmobs/character/datas.lua index 14a4aa1..d688f71 100644 --- a/sonic-radiance.love/game/abstractmobs/character/datas.lua +++ b/sonic-radiance.love/game/abstractmobs/character/datas.lua @@ -7,4 +7,12 @@ function CharacterData:getCommonData() self.turns = self.data.turns end +function CharacterData:getWeaknesses() + return self.data.weakTo +end + +function CharacterData:getResistences() + return self.data.resists +end + return CharacterData diff --git a/sonic-radiance.love/game/abstractmobs/ennemy.lua b/sonic-radiance.love/game/abstractmobs/ennemy.lua index a49e55c..7005bd2 100644 --- a/sonic-radiance.love/game/abstractmobs/ennemy.lua +++ b/sonic-radiance.love/game/abstractmobs/ennemy.lua @@ -1,6 +1,7 @@ local AbstractMobParent = require "game.abstractmobs.parent" local AbstractEnnemy = AbstractMobParent:extend() +local elements = require "datas.gamedata.battles.elements" function AbstractEnnemy:new(directory, name) self.simplename = name @@ -8,6 +9,16 @@ function AbstractEnnemy:new(directory, name) self.super.new(self) end +function AbstractEnnemy:getWeaknesses() + local elementData = elements[self.data.element] or elements["none"] + return elementData.weakTo +end + +function AbstractEnnemy:getResistences() + local elementData = elements[self.data.element] or elements["none"] + return elementData.resists +end + function AbstractEnnemy:haveProtecType(protectype) return utils.table.contain(self.data.protectypes, protectype) end diff --git a/sonic-radiance.love/game/utils/battle/init.lua b/sonic-radiance.love/game/utils/battle/init.lua index bbf9582..a6bde26 100644 --- a/sonic-radiance.love/game/utils/battle/init.lua +++ b/sonic-radiance.love/game/utils/battle/init.lua @@ -1,5 +1,6 @@ local BattleUtils = {} local CONSTS = require "datas.consts.battle" +local protectypes = require "datas.gamedata.battles.protectypes" function BattleUtils.computeLaunchingDamages(base, stats, isSpecial) local damages = base / CONSTS.DAMAGE.DIVISOR @@ -26,11 +27,32 @@ function BattleUtils.computeReceivingDamages(base, stats, isSpecial, isDefending return damages end -function BattleUtils.applyProtectTypes(value, type, protectype) - if (utils.table.contain(protectype, "aerial") and type == "basic") then - value = value * CONSTS.ATKWRONGTYPE - end - return value +function BattleUtils.applyProtectTypes(value, type, protectypeList) + for _, protectype in ipairs(protectypeList) do + local protecttypeData = protectypes[protectype] + if protecttypeData ~= nil then + if (utils.table.contain(protecttypeData.resistTo, type)) then + value = value * CONSTS.ATKWRONGTYPE + end + else + core.debug:warning("battleutils", "protectype " .. protectype .. " doesn't exists ") + end + end + return value +end + +function BattleUtils.applyWeaknesses(damages, element, weaknessList) + if (utils.table.contain(weaknessList, element)) then + damages = damages * 1.2 + end + return damages +end + +function BattleUtils.applyResistences(damages, element, resistsList) + if (utils.table.contain(resistsList, element)) then + damages = damages * 0.8 + end + return damages end function BattleUtils.isAttackSuccess(statutList) diff --git a/sonic-radiance.love/scenes/battlesystem/controllers/fighters/parent.lua b/sonic-radiance.love/scenes/battlesystem/controllers/fighters/parent.lua index bafa8d9..ed7e734 100644 --- a/sonic-radiance.love/scenes/battlesystem/controllers/fighters/parent.lua +++ b/sonic-radiance.love/scenes/battlesystem/controllers/fighters/parent.lua @@ -1,6 +1,5 @@ local FighterParent = Object:extend() -local CONST = require "datas.consts.battle" local battleutils = require "game.utils.battle" function FighterParent:new(owner, isHero, id) @@ -85,6 +84,8 @@ end function FighterParent:receiveDamage(value, type, element, isSpecial, fromWho) local damages = battleutils.computeReceivingDamages(value, self:getStats(), isSpecial, self.isDefending) damages = battleutils.applyProtectTypes(damages, type, self.abstract:getProtecTypes()) + damages = battleutils.applyResistences(damages, element, self.abstract:getResistences()) + damages = battleutils.applyWeaknesses(damages, element, self.abstract:getWeaknesses()) if (battleutils.isAttackSuccess(nil)) then self:applyDamage(damages)