landsandboat/scripts/data/element_tables.lua
Xaver-DaRed 8df4dea7b3 Convert skillchain damage calculations to lua
Co-Authored-By: WinterSolstice8 <WinterSolstice8@users.noreply.github.com>
2026-06-29 19:34:56 +02:00

348 lines
14 KiB
Lua

-----------------------------------
-- Tables defining diferent elemental caracteristics.
-- Ordered by element ID.
-----------------------------------
xi = xi or {}
xi.data = xi.data or {}
xi.data.element = xi.data.element or {}
-----------------------------------
local column =
{
ELEMENT_OPPOSED = 1,
DAY_ASSOCIATED = 2,
WEATHER_SINGLE = 3,
WEATHER_DOUBLE = 4,
MOD_ELEMENT_SDT = 5,
MOD_ELEMENT_RES_RANK = 6,
MOD_ELEMENT_NULL = 7,
MOD_ELEMENT_ABSORB = 8,
MOD_ELEMENT_MAB = 9,
MOD_ELEMENT_MACC = 10,
MOD_ELEMENT_MEVA = 11,
MOD_ELEMENT_FTP_BONUS = 12,
MOD_STAFF_BONUS = 13,
MOD_FORCE_DW_BONUS = 14,
EFFECT_BARSPELL = 15,
MERIT_ELEMENT_POTENCY = 16,
MERIT_ELEMENT_MACC = 17,
}
xi.data.element.dataTable =
{
[xi.element.FIRE ] = { xi.element.WATER, xi.day.FIRESDAY, xi.weather.HOT_SPELL, xi.weather.HEAT_WAVE, xi.mod.FIRE_SDT, xi.mod.FIRE_RES_RANK, xi.mod.FIRE_NULL, xi.mod.FIRE_ABSORB, xi.mod.FIRE_MAB, xi.mod.FIRE_MACC, xi.mod.FIRE_MEVA, xi.mod.FIRE_FTP_BONUS, xi.mod.FIRE_STAFF_BONUS, xi.mod.FORCE_FIRE_DWBONUS, xi.effect.BARFIRE, xi.merit.FIRE_MAGIC_POTENCY, xi.merit.FIRE_MAGIC_ACCURACY },
[xi.element.ICE ] = { xi.element.FIRE, xi.day.ICEDAY, xi.weather.SNOW, xi.weather.BLIZZARDS, xi.mod.ICE_SDT, xi.mod.ICE_RES_RANK, xi.mod.ICE_NULL, xi.mod.ICE_ABSORB, xi.mod.ICE_MAB, xi.mod.ICE_MACC, xi.mod.ICE_MEVA, xi.mod.ICE_FTP_BONUS, xi.mod.ICE_STAFF_BONUS, xi.mod.FORCE_ICE_DWBONUS, xi.effect.BARBLIZZARD, xi.merit.ICE_MAGIC_POTENCY, xi.merit.ICE_MAGIC_ACCURACY },
[xi.element.WIND ] = { xi.element.ICE, xi.day.WINDSDAY, xi.weather.WIND, xi.weather.GALES, xi.mod.WIND_SDT, xi.mod.WIND_RES_RANK, xi.mod.WIND_NULL, xi.mod.WIND_ABSORB, xi.mod.WIND_MAB, xi.mod.WIND_MACC, xi.mod.WIND_MEVA, xi.mod.WIND_FTP_BONUS, xi.mod.WIND_STAFF_BONUS, xi.mod.FORCE_WIND_DWBONUS, xi.effect.BARAERO, xi.merit.WIND_MAGIC_POTENCY, xi.merit.WIND_MAGIC_ACCURACY },
[xi.element.EARTH ] = { xi.element.WIND, xi.day.EARTHSDAY, xi.weather.DUST_STORM, xi.weather.SAND_STORM, xi.mod.EARTH_SDT, xi.mod.EARTH_RES_RANK, xi.mod.EARTH_NULL, xi.mod.EARTH_ABSORB, xi.mod.EARTH_MAB, xi.mod.EARTH_MACC, xi.mod.EARTH_MEVA, xi.mod.EARTH_FTP_BONUS, xi.mod.EARTH_STAFF_BONUS, xi.mod.FORCE_EARTH_DWBONUS, xi.effect.BARSTONE, xi.merit.EARTH_MAGIC_POTENCY, xi.merit.EARTH_MAGIC_ACCURACY },
[xi.element.THUNDER] = { xi.element.EARTH, xi.day.LIGHTNINGDAY, xi.weather.THUNDER, xi.weather.THUNDERSTORMS, xi.mod.THUNDER_SDT, xi.mod.THUNDER_RES_RANK, xi.mod.LTNG_NULL, xi.mod.LTNG_ABSORB, xi.mod.THUNDER_MAB, xi.mod.THUNDER_MACC, xi.mod.THUNDER_MEVA, xi.mod.THUNDER_FTP_BONUS, xi.mod.THUNDER_STAFF_BONUS, xi.mod.FORCE_LIGHTNING_DWBONUS, xi.effect.BARTHUNDER, xi.merit.LIGHTNING_MAGIC_POTENCY, xi.merit.LIGHTNING_MAGIC_ACCURACY },
[xi.element.WATER ] = { xi.element.THUNDER, xi.day.WATERSDAY, xi.weather.RAIN, xi.weather.SQUALL, xi.mod.WATER_SDT, xi.mod.WATER_RES_RANK, xi.mod.WATER_NULL, xi.mod.WATER_ABSORB, xi.mod.WATER_MAB, xi.mod.WATER_MACC, xi.mod.WATER_MEVA, xi.mod.WATER_FTP_BONUS, xi.mod.WATER_STAFF_BONUS, xi.mod.FORCE_WATER_DWBONUS, xi.effect.BARWATER, xi.merit.WATER_MAGIC_POTENCY, xi.merit.WATER_MAGIC_ACCURACY },
[xi.element.LIGHT ] = { xi.element.DARK, xi.day.LIGHTSDAY, xi.weather.AURORAS, xi.weather.STELLAR_GLARE, xi.mod.LIGHT_SDT, xi.mod.LIGHT_RES_RANK, xi.mod.LIGHT_NULL, xi.mod.LIGHT_ABSORB, xi.mod.LIGHT_MAB, xi.mod.LIGHT_MACC, xi.mod.LIGHT_MEVA, xi.mod.LIGHT_FTP_BONUS, xi.mod.LIGHT_STAFF_BONUS, xi.mod.FORCE_LIGHT_DWBONUS, 0, 0, 0 },
[xi.element.DARK ] = { xi.element.LIGHT, xi.day.DARKSDAY, xi.weather.GLOOM, xi.weather.DARKNESS, xi.mod.DARK_SDT, xi.mod.DARK_RES_RANK, xi.mod.DARK_NULL, xi.mod.DARK_ABSORB, xi.mod.DARK_MAB, xi.mod.DARK_MACC, xi.mod.DARK_MEVA, xi.mod.DARK_FTP_BONUS, xi.mod.DARK_STAFF_BONUS, xi.mod.FORCE_DARK_DWBONUS, 0, 0, 0 },
}
-- Table with skillchain elemental properties, keyed by element: Row -> Element; Column -> Skillchain ID
xi.data.element.skillchainElementTable =
{
-- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-- T C L S R D I I G D F F L D L D
[xi.element.FIRE ] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0 },
[xi.element.ICE ] = { 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 },
[xi.element.WIND ] = { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0 },
[xi.element.EARTH ] = { 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1 },
[xi.element.THUNDER] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0 },
[xi.element.WATER ] = { 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1 },
[xi.element.LIGHT ] = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0 },
[xi.element.DARK ] = { 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1 },
}
-- Get element to which the element being checked is weak against.
xi.data.element.getElementWeakness = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return 0
end
return xi.data.element.dataTable[elementToCheck][column.ELEMENT_OPPOSED]
end
-- Get element to which the element being checked is strong against.
xi.data.element.getElementStrength = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return 0
end
-- Get element.
for i = xi.element.FIRE, xi.element.DARK do
local opositeElement = xi.data.element.dataTable[i][column.ELEMENT_OPPOSED]
if opositeElement == elementToCheck then
return i
end
end
end
-----------------------------------
-- Day-related functions
-----------------------------------
xi.data.element.getAssociatedDay = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return -1
end
return xi.data.element.dataTable[elementToCheck][column.DAY_ASSOCIATED]
end
xi.data.element.getOppositeDay = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return -1
end
-- Fetch opposite element.
elementToCheck = xi.data.element.dataTable[elementToCheck][column.ELEMENT_OPPOSED]
return xi.data.element.dataTable[elementToCheck][column.DAY_ASSOCIATED]
end
xi.data.element.getDayElement = function(day)
-- Validate fed value.
local dayToCheck = utils.defaultIfNil(day, -1)
for elementToCheck = xi.element.FIRE, xi.element.DARK do
if dayToCheck == xi.data.element.dataTable[elementToCheck][column.DAY_ASSOCIATED] then
return elementToCheck
end
end
return xi.element.NONE
end
-----------------------------------
-- Weather-related functions
-----------------------------------
xi.data.element.getAssociatedSingleWeather = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return -1
end
return xi.data.element.dataTable[elementToCheck][column.WEATHER_SINGLE]
end
xi.data.element.getOppositeSingleWeather = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return -1
end
-- Fetch opposite element.
elementToCheck = xi.data.element.dataTable[elementToCheck][column.ELEMENT_OPPOSED]
return xi.data.element.dataTable[elementToCheck][column.WEATHER_SINGLE]
end
xi.data.element.getAssociatedDoubleWeather = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return -1
end
return xi.data.element.dataTable[elementToCheck][column.WEATHER_DOUBLE]
end
xi.data.element.getOppositeDoubleWeather = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return -1
end
-- Fetch opposite element.
elementToCheck = xi.data.element.dataTable[elementToCheck][column.ELEMENT_OPPOSED]
return xi.data.element.dataTable[elementToCheck][column.WEATHER_DOUBLE]
end
xi.data.element.getWeatherElement = function(weather)
-- Validate fed value.
local weatherToCheck = utils.defaultIfNil(weather, 0)
for elementChecked = xi.element.FIRE, xi.element.DARK do
local elementalSingle = xi.data.element.dataTable[elementChecked][column.WEATHER_SINGLE]
local elementalDouble = xi.data.element.dataTable[elementChecked][column.WEATHER_DOUBLE]
if weatherToCheck == elementalSingle or weatherToCheck == elementalDouble then
return elementChecked
end
end
return xi.element.NONE
end
-----------------------------------
-- Modifier-related functions
-----------------------------------
xi.data.element.getElementalSDTModifier = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return 0
end
return xi.data.element.dataTable[elementToCheck][column.MOD_ELEMENT_SDT]
end
xi.data.element.getElementalResistanceRankModifier = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return 0
end
return xi.data.element.dataTable[elementToCheck][column.MOD_ELEMENT_RES_RANK]
end
xi.data.element.getElementalNullificationModifier = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return 0
end
return xi.data.element.dataTable[elementToCheck][column.MOD_ELEMENT_NULL]
end
xi.data.element.getElementalAbsorptionModifier = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return 0
end
return xi.data.element.dataTable[elementToCheck][column.MOD_ELEMENT_ABSORB]
end
xi.data.element.getElementalMABModifier = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return 0
end
return xi.data.element.dataTable[elementToCheck][column.MOD_ELEMENT_MAB]
end
xi.data.element.getElementalMACCModifier = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return 0
end
return xi.data.element.dataTable[elementToCheck][column.MOD_ELEMENT_MACC]
end
xi.data.element.getElementalMEVAModifier = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return 0
end
return xi.data.element.dataTable[elementToCheck][column.MOD_ELEMENT_MEVA]
end
xi.data.element.getElementalFTPModifier = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return 0
end
return xi.data.element.dataTable[elementToCheck][column.MOD_ELEMENT_FTP_BONUS]
end
xi.data.element.getElementalStaffModifier = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return 0
end
return xi.data.element.dataTable[elementToCheck][column.MOD_STAFF_BONUS]
end
xi.data.element.getForcedDayOrWeatherBonusModifier = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.DARK then
return 0
end
return xi.data.element.dataTable[elementToCheck][column.MOD_FORCE_DW_BONUS]
end
-----------------------------------
-- Effect-related functions
-----------------------------------
xi.data.element.getAssociatedBarspellEffect = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.WATER then
return 0
end
return xi.data.element.dataTable[elementToCheck][column.EFFECT_BARSPELL]
end
-----------------------------------
-- Merit-related functions
-----------------------------------
xi.data.element.getElementalPotencyMerit = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.WATER then
return 0
end
return xi.data.element.dataTable[elementToCheck][column.MERIT_ELEMENT_POTENCY]
end
xi.data.element.getElementalAccuracyMerit = function(element)
-- Validate fed value.
local elementToCheck = utils.defaultIfNil(element, 0)
if elementToCheck < xi.element.FIRE or elementToCheck > xi.element.WATER then
return 0
end
return xi.data.element.dataTable[elementToCheck][column.MERIT_ELEMENT_MACC]
end