Skip to content
Snippets Groups Projects
Commit e71157f2 authored by Grayswandir's avatar Grayswandir
Browse files

Restructure how gems work.

Moved most of the gem color information for various talents into a table.
Now more amenable to adding new gem colors.
Tirakai's Maul can have gem interactions defined easier.
Goedalath Rock now gives golems shadowflame damage.
Shadowflame damage type now has a text color.
Gems show their 'latent damage type' on tooltips.
parent fafed4cb
No related branches found
No related tags found
No related merge requests found
......@@ -1541,6 +1541,13 @@ function _M:getTextualDesc(compare_with, use_actor)
end
end
local latent = table.get(self.color_attributes, 'damage_type')
if latent then
latent = DamageType:get(latent) or {}
desc:add({"color","YELLOW",}, "Latent Damage Type: ", {"color","LAST",},
latent.text_color or "#WHITE#", latent.name:capitalize(), {"color", "LAST",}, true)
end
if self.inscription_data and self.inscription_talent then
use_actor.__inscription_data_fake = self.inscription_data
local t = self:getTalentFromId("T_"..self.inscription_talent.."_1")
......
......@@ -136,7 +136,8 @@ function _M:attackTarget(target, damtype, mult, noenergy, force_unharmed)
local gems = self:getInven(self.INVEN_GEM)
local types = {}
for i = 1, #gems do
if gems[i] and gems[i].attack_type then types[#types+1] = gems[i].attack_type end
local damtype = table.get(gems[i], 'color_attributes', 'damage_type')
if damtype then table.insert(types, damtype) end
end
if #types > 0 then
damtype = rng.table(types)
......
......@@ -1049,7 +1049,7 @@ newDamageType{
-- Darkness + Fire
newDamageType{
name = "shadowflame", type = "SHADOWFLAME",
name = "shadowflame", type = "SHADOWFLAME", text_color = "#BF7F73#",
projector = function(src, x, y, type, dam)
DamageType:get(DamageType.FIRE).projector(src, x, y, DamageType.FIRE, dam / 2)
DamageType:get(DamageType.DARKNESS).projector(src, x, y, DamageType.DARKNESS, dam / 2)
......
......@@ -30,15 +30,36 @@ newEntity{
desc = [[Gems can be sold for money or used in arcane rituals.]],
}
local colors_attacks = {
black = DamageType.ACID,
blue = DamageType.LIGHTNING,
green = DamageType.NATURE,
red = DamageType.FIRE,
violet = DamageType.ARCANE,
white = DamageType.COLD,
yellow = DamageType.LIGHT,
}
local gem_color_attributes = {
black = {
damage_type = 'ACID',
alt_damage_type = 'ACID_DISARM',
particle = 'acid',},
blue = {
damage_type = 'LIGHTNING',
alt_damage_type = 'LIGHTNING_DAZE',
particle = 'lightning_explosion',},
green = {
damage_type = 'NATURE',
alt_damage_type = 'SPYDRIC_POISON',
particle = 'slime',},
red = {
damage_type = 'FIRE',
alt_damage_type = 'FLAMESHOCK',
particle = 'flame',},
violet = {
damage_type = 'ARCANE',
alt_damage_type = 'ARCANE_SILENCE',
particle = 'manathrust',},
white = {
damage_type = 'COLD',
alt_damage_type = 'ICE',
particle = 'freeze',},
yellow = {
damage_type = 'LIGHT',
alt_damage_type = 'LIGHT_BLIND',
particle = 'light',},}
mod.class.Object.gem_color_attributes = gem_color_attributes
local function newGem(name, image, cost, rarity, color, min_level, max_level, tier, power, imbue, bomb)
-- Gems, randomly lootable
......@@ -50,7 +71,8 @@ local function newGem(name, image, cost, rarity, color, min_level, max_level, ti
material_level = tier,
imbue_powers = imbue,
wielder = imbue,
attack_type = colors_attacks[color],
attack_type = gem_color_attributes[color].damage_type, -- deprecated, hopefully nothing's still using it.
color_attributes = gem_color_attributes[color],
}
-- Alchemist gems, not lootable, only created by talents
newEntity{ base = "BASE_GEM", define_as = "ALCHEMIST_GEM_"..name:gsub(" ", "_"):upper(), name = "alchemist "..name:lower(), type='alchemist-gem', subtype = color,
......
......@@ -162,6 +162,7 @@ newEntity{ base = "BASE_GEM",
unique = true,
unided_name = "unearthly black stone",
name = "Goedalath Rock", subtype = "demonic", image = "object/artifact/goedalath_rock.png",
define_as = 'GOEDALATH_ROCK',
color = colors.PURPLE,
level_range = {42, 50},
desc = [[A small rock that seems from beyond this world, vibrating with a fierce energy. It feels warped and terrible and evil... and yet oh so powerful.]],
......@@ -187,7 +188,7 @@ newEntity{ base = "BASE_GEM",
on_melee_hit = {[DamageType.DARKNESS] = 34},
healing_factor = 0.5,
},
}
color_attributes = {damage_type = 'SHADOWFLAME',},}
newEntity{ base = "BASE_CLOAK",
power_source = {arcane=true}, define_as = "THREADS_FATE",
......@@ -400,7 +401,7 @@ newEntity{ base = "BASE_LONGSWORD", define_as = "SWORD_DAWN",
inc_damage_type={
undead=25,
demon=25,
},
},
},
on_wear = function(self, who)
if who.descriptor and who.descriptor.subclass == "Sun Paladin" then
......
......@@ -6272,6 +6272,17 @@ newEntity{ base = "BASE_GREATMAUL",
damrange=1.3,
dammod = {str=1.2, mag=0.1},
},
-- executed for specific gems.
-- key corresponds to: gem.define_as or gem.name
unique_gems = {
GOEDALATH_ROCK = function(maul, gem)
maul.combat.damtype = 'SHADOWFLAME'
table.mergeAdd(maul.wielder, {
inc_damage = {FIRE = 3 * gem.material_level, DARKNESS = 3 * gem.material_level,},
resists_pen = {all = 2 * gem.material_level},},
true)
maul.gemDesc = "Demonic"
end,},
max_power = 10, power_regen = 1,
use_power = { name = "imbue the hammer with a gem of your choice", power = 10,
use = function(self, who)
......@@ -6318,96 +6329,41 @@ newEntity{ base = "BASE_GREATMAUL",
self.combat.physcrit = 4 + (2 * combatFactor)
self.combat.dammod = {str=1.2, mag=0.1}
self.combat.damrange = 1.3
self.wielder = {
inc_stats = {[Stats.STAT_MAG] = (2 * scalingFactor), [Stats.STAT_CUN] = (2 * scalingFactor), [Stats.STAT_DEX] = (2 * scalingFactor),},
}
-- Each element merges its effect into the combat/wielder tables (or anything else) after the base stats are scaled
-- You can modify damage and such here too but you should probably make static tables instead of merging
if gem.subtype =="black" then -- Acid
self.combat.damtype = DamageType.ACID
table.mergeAdd(self.wielder, {inc_damage = { [DamageType.ACID] = 4 * scalingFactor} }, true)
self.combat.burst_on_crit = {[DamageType.ACID_DISARM] = 12 * scalingFactor,}
self.gemDesc = "Acid"
end
if gem.subtype =="blue" then -- Lightning
self.combat.damtype = DamageType.LIGHTNING
table.mergeAdd(self.wielder, {
inc_damage = { [DamageType.LIGHTNING] = 4 * scalingFactor}
}, true)
self.combat.burst_on_crit = {[DamageType.LIGHTNING_DAZE] = 12 * scalingFactor,}
self.gemDesc = "Lightning"
end
if gem.subtype =="green" then -- Nature
self.combat.damtype = DamageType.NATURE
table.mergeAdd(self.wielder, {
inc_damage = { [DamageType.NATURE] = 4 * scalingFactor}
}, true)
self.combat.burst_on_crit = {[DamageType.SPYDRIC_POISON] = 12 * scalingFactor,}
self.gemDesc = "Nature"
end
if gem.subtype =="red" then -- Fire
self.combat.damtype = DamageType.FIRE
table.mergeAdd(self.wielder, {
inc_damage = { [DamageType.FIRE] = 4 * scalingFactor},
}, true)
self.combat.burst_on_crit = {[DamageType.FLAMESHOCK] = 12 * scalingFactor,}
self.gemDesc = "Fire"
end
if gem.subtype =="violet" then -- Arcane
self.combat.damtype = DamageType.ARCANE
table.mergeAdd(self.wielder, {
inc_damage = { [DamageType.ARCANE] = 4 * scalingFactor}
}, true)
self.combat.burst_on_crit = {[DamageType.ARCANE_SILENCE] = 12 * scalingFactor,}
self.gemDesc = "Arcane"
end
if gem.subtype =="white" then -- Cold
self.combat.damtype = DamageType.COLD
table.mergeAdd(self.wielder, {
inc_damage = { [DamageType.COLD] = 4 * scalingFactor}
}, true)
self.combat.burst_on_crit = {[DamageType.ICE] = 12 * scalingFactor,}
self.gemDesc = "Cold"
end
if gem.subtype =="yellow" then -- Light
self.combat.damtype = DamageType.LIGHT
table.mergeAdd(self.wielder, {
inc_damage = { [DamageType.LIGHT] = 4 * scalingFactor}
}, true)
self.combat.burst_on_crit = {[DamageType.LIGHT_BLIND] = 12 * scalingFactor,}
self.gemDesc = "Light"
end
if gem.subtype == "multi-hued" then -- Some but not all artifacts, if you want to do artifact specific effects make conditionals by name, don't use this
if gem.on_tirakai_maul_equip then
gem:on_tirakai_maul_equip(self)
elseif self.unique_gems[gem.define_as or gem.name] then
self.unique_gems[gem.define_as or gem.name](self, gem)
elseif gem.color_attributes then
self.combat.damtype = gem.color_attributes.damage_type
table.mergeAdd(self.wielder,
{inc_damage = {[gem.color_attributes.damage_type] = 4 * scalingFactor},},
true)
self.combat.burst_on_crit = {[gem.color_attributes.alt_damage_type] = 12 * scalingFactor,}
self.gemDesc = gem.color_attributes.desc or gem.color_attributes.damage_type:lower():capitalize()
else -- Backup for weird artifacts.
table.mergeAdd(self.combat, {convert_damage = {[DamageType.COLD] = 25, [DamageType.FIRE] = 25, [DamageType.LIGHTNING] = 25, [DamageType.ARCANE] = 25,} }, true)
table.mergeAdd(self.wielder, {
inc_damage = { all = 2 * scalingFactor},
resists_pen = { all = 2 * scalingFactor},
}, true)
self.gemDesc = "Unique"
end
if gem.subtype == "demonic" then -- Goedalath Rock
self.combat.damtype = DamageType.SHADOWFLAME
table.mergeAdd(self.wielder, {
inc_damage = { [DamageType.FIRE] = 3 * scalingFactor, [DamageType.DARKNESS] = 3 * scalingFactor,},
resists_pen = { all = 2 * scalingFactor},
}, true)
self.gemDesc = "Demonic"
}, true)
self.gemDesc = 'Unique'
end
game.logPlayer(who, "You imbue your %s with %s.", self:getName{do_colour=true, no_count=true}, gem:getName{do_colour=true, no_count=true})
--self.name = (gem.name .. " of Divinity")
table.mergeAdd(self.wielder, gem.imbue_powers, true)
if gem.talent_on_spell then
self.talent_on_spell = self.talent_on_spell or {}
table.append(self.talent_on_spell, gem.talent_on_spell)
......
......@@ -191,28 +191,18 @@ newTalent{
end
end)
if #list <= 0 then return end
local elem = {
black = {DamageType.ACID, "acid"},
blue = {DamageType.LIGHTNING, "lightning_explosion"},
green = {DamageType.NATURE, "slime"},
red = {DamageType.FIRE, "flame"},
violet = {DamageType.ARCANE, "manathrust"},
white = {DamageType.COLD, "freeze"},
yellow = {DamageType.LIGHT, "light"},
["multi-hued"] = {DamageType.MIND, "light"},
}
local bolt = {DamageType.MIND, "light"}
if gem.subtype and elem[gem.subtype] then bolt = elem[gem.subtype] end
local color = gem.color_attributes or {}
local bolt = {color.damage_type or 'MIND', color.particle or 'light'}
table.sort(list, "dist")
local a = list[1].a
self:project({type="ball", range=6, radius=0, selffire=false, talent=t}, a.x, a.y, bolt[1], self:mindCrit(self:hasEffect(self.EFF_PSIFRENZY).damage), {type=bolt[2]})
end
return
end
if not p.mindstar_grab then return end
if not rng.percent(p.mindstar_grab.chance) then return end
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment