Skip to content
Snippets Groups Projects
Commit a2986f06 authored by DarkGod's avatar DarkGod
Browse files

Merge branch 'Bulwark' into 'master'

Bulwhat?

Continuing attempts to remove high armor edge cases early game, this time Shield Wall paired with expanding access to APR via itemization.  Since Bulwark is already very weak and SW has been its only really selling point this also attempts to compensate them with various misc buffs.

Shield Wall:  This was at the top of the randboss armor problem list both at low levels and high levels.  Early on it regularly 0s weapon class damage when paired with just about anything.  It also scales incredibly well, and from the PC perspective trivializes weapon damage in a degenerate way.  This removes the false choice physical damage reduction, greatly reduces the early armor and late game armor scaling, and adds a block value bonus.  Cooldown is also reduced because a primary defense going down for 30 turns is ridiculous.

Last Stand:  Weird talent.  Scales very well but takes a turn to activate and deactivate.  The concept of exchanging mobility for tankiness is good, so dropping this to 6 cooldown from 30 should help Bulwark a bit.

Life Rating:  Up to 6 from 2.  Since Shield Wall had to lose a lot of power a larger base life pool is a similarly passive replacement.  We don't have a lot of large base health pools on just about anything as is, may as well give it to someone.

Items:  Raised APR values and lowered minimum level on several APR egos, and added a new greater egos with APR+Physical Penetration+Accuracy for weapons.  APR is a very hard stat to get right now.

Scaling:  Increased the power of the Combat Accuracy and Heavy Armor Training scaling to 0.75.

See merge request !390
parents bf034704 c16717d6
No related branches found
No related tags found
1 merge request!390Bulwhat?
Pipeline #
......@@ -144,7 +144,7 @@ newBirthDescriptor{
},
},
copy_add = {
life_rating = 2,
life_rating = 6,
},
}
......
......@@ -317,13 +317,12 @@ newEntity{
keywords = {murder=true},
level_range = {30, 50},
greater_ego = 1,
rarity = 16,
rarity = 20,
cost = 40,
wielder = {
combat_physcrit = resolvers.mbonus_material(3, 3),
combat_critical_power = resolvers.mbonus_material(10, 10),
combat_atk = resolvers.mbonus_material(5, 5),
combat_apr = resolvers.mbonus_material(4, 4),
combat_apr = resolvers.mbonus_material(10, 10),
},
}
......
......@@ -321,7 +321,7 @@ newEntity{
power_source = {technique=true},
name = "murderer's ", prefix=true, instant_resolve=true,
keywords = {murderer=true},
level_range = {20, 50},
level_range = {10, 50},
greater_ego = 1,
rarity = 20,
cost = 40,
......@@ -447,7 +447,7 @@ newEntity{
power_source = {technique=true},
name = " of backstabbing", suffix=true, instant_resolve=true,
keywords = {backstab=true},
level_range = {40, 50},
level_range = {30, 50},
greater_ego = 1,
rarity = 35,
cost = 70,
......
......@@ -73,6 +73,23 @@ newEntity{
},
}
newEntity{
power_source = {technique=true},
name = "truestriking ", prefix=true, instant_resolve=true,
keywords = {truestriking=true},
level_range = {30, 50},
greater_ego = 1,
rarity = 15,
cost = 40,
wielder = {
combat_atk = resolvers.mbonus_material(10, 5),
combat_apr = resolvers.mbonus_material(10, 5),
resists_pen = {
[DamageType.PHYSICAL] = resolvers.mbonus_material(10, 5),
},
},
}
newEntity{
power_source = {technique=true},
name = "warbringer's ", prefix=true, instant_resolve=true,
......
......@@ -56,7 +56,7 @@ newTalent{
return 0
end,
-- Called by _M:combatArmor in mod.class.interface.Combat.lua
getArmor = function(self, t) return self:combatTalentScale(t, 1, 7) * t.ArmorEffect(self, t) end,
getArmor = function(self, t) return self:combatTalentScale(t, 1, 7, 0.75) * t.ArmorEffect(self, t) end,
-- Called by _M:combatArmorHardiness in mod.class.interface.Combat.lua
getArmorHardiness = function(self, t) -- Matches previous progression for "heavy" armor
return math.max(0, self:combatLimit(self:getTalentLevel(t) * 5 * t.ArmorEffect(self, t), 100, 5, 3.75, 50, 37.5))
......@@ -155,7 +155,7 @@ newTalent{
points = 5,
require = { level=function(level) return (level - 1) * 4 end },
mode = "passive",
getAttack = function(self, t) return self:combatTalentScale(t, 10, 50) end, -- match values at 1 and 5 for old formula
getAttack = function(self, t) return self:combatTalentScale(t, 10, 50, 0.75) end, -- match values at 1 and 5 for old formula
info = function(self, t)
local attack = t.getAttack(self, t)
return ([[Increases the accuracy of unarmed, melee and ranged weapons by %d.]]):
......
......@@ -189,14 +189,17 @@ newTalent{
require = techs_req1,
mode = "sustained",
points = 5,
cooldown = 30,
cooldown = 10,
sustain_stamina = 30,
tactical = { DEFEND = 2 },
on_pre_use = function(self, t, silent) if not self:hasShield() then if not silent then game.logPlayer(self, "You require a weapon and a shield to use this talent.") end return false end return true end,
getarmor = function(self,t) return self:combatScale((1+self:getDex(4))*self:getTalentLevel(t), 5, 0, 30, 25, 0.375) + self:combatTalentScale(self:getTalentLevel(self.T_SHIELD_EXPERTISE), 1, 5, 0.75) end, -- Scale separately with talent level and talent level of Shield Expertise
getDefense = function(self, t)
return self:combatScale((1 + self:getDex(4, true)) * self:getTalentLevel(t), 6.4, 1.4, 30, 25) + self:combatTalentScale(self:getTalentLevel(self.T_SHIELD_EXPERTISE), 2, 10, 0.75)
return t.getDexArmor(self, t) + t.getExpertiseArmor(self,t)
end,
getExpertiseArmor = function(self, t) return self:combatTalentScale(self:getTalentLevel(self.T_SHIELD_EXPERTISE), 1, 5, 0.5) end,
getDexArmor = function(self, t) return self:combatTalentStatDamage(t, "dex", 6, 20) end,
getArmor = function(self,t) return t.getDexArmor(self, t) + t.getExpertiseArmor(self,t) end, -- Scale separately with talent level and talent level of Shield Expertise
getBlock = function(self, t) return self:combatTalentStatDamage(t, "str", 40, 150) end,
stunKBresist = function(self, t) return self:combatTalentLimit(t, 1, 0.15, 0.50) end, -- Limit <100%
activate = function(self, t)
local shield = self:hasShield()
......@@ -207,9 +210,10 @@ newTalent{
local ret = {
stun = self:addTemporaryValue("stun_immune", t.stunKBresist(self, t)),
knock = self:addTemporaryValue("knockback_immune", t.stunKBresist(self, t)),
dam = self:addTemporaryValue("inc_damage", {[DamageType.PHYSICAL]=-20}),
def = self:addTemporaryValue("combat_def", t.getDefense(self, t)),
armor = self:addTemporaryValue("combat_armor", t.getarmor(self,t)),
armor = self:addTemporaryValue("combat_armor", t.getArmor(self,t)),
block = self:addTemporaryValue("block_bonus", t.getBlock(self,t)),
}
if core.shader.active(4) then
self:talentParticles(ret, {type="shader_shield", args={toback=true, size_factor=1, img="rotating_shield"}, shader={type="rotatingshield", noup=2.0, appearTime=0.2}})
......@@ -220,15 +224,15 @@ newTalent{
deactivate = function(self, t, p)
self:removeTemporaryValue("combat_def", p.def)
self:removeTemporaryValue("combat_armor", p.armor)
self:removeTemporaryValue("inc_damage", p.dam)
self:removeTemporaryValue("stun_immune", p.stun)
self:removeTemporaryValue("knockback_immune", p.knock)
self:removeTemporaryValue("block_bonus", p.block)
return true
end,
info = function(self, t)
return ([[Enter a protective battle stance, increasing Defense by %d and Armour by %d at the cost of -20%% physical damage. The Defense and Armor increase is based on your Dexterity.
return ([[Enter a protective battle stance, increasing Defense by %d, Armour by %d, and Block value by %d. The Defense and Armor increase is based on your Dexterity, the Block on your Strength.
It also grants %d%% resistance to stunning and knockback.]]):
format(t.getDefense(self, t), t.getarmor(self, t), 100*t.stunKBresist(self, t))
format(t.getDefense(self, t), t.getArmor(self, t), t.getBlock(self, t), 100*t.stunKBresist(self, t))
end,
}
......@@ -306,8 +310,8 @@ newTalent{
require = techs_req4,
mode = "sustained",
points = 5,
cooldown = 30,
sustain_stamina = 50,
cooldown = 6,
sustain_stamina = 30,
tactical = { DEFEND = 3 },
no_npc_use = true,
on_pre_use = function(self, t, silent) if not self:hasShield() then if not silent then game.logPlayer(self, "You require a weapon and a shield to use this talent.") end return false end return true 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