Page 1 of 2

Balance on Rush

Posted: Sun Sep 18, 2011 6:39 pm
by bricks
Rush is a frighteningly powerful talent at the levels some NPCs can get it. I think this is mostly because its cooldown and range both scale linearly. The current formulas:

Code: Select all

cooldown = function(self, t) return math.floor(40 - self:getTalentLevel(t) * 4) end,
  ...
range = function(self, t) return math.floor(5 + self:getTalentLevelRaw(t)) end,
By comparison, Blindside, a similar talent, has a fixed range and cooldown. Naga Myrmidons have Rush level 8, which has a range of 13 and a cooldown of 8. This is very deadly, since it can hit you from well outside of the typical vision radius, and the Daze component often means that it is a two-hit talent. The worst offender, to my knowledge, is Massok the Dragonslayer, with Rush level 9 (range 14 and cooldown of 4). I've actually been instakilled by Massok, thanks to Rush. I have to wonder if random bosses can get Rush level 10. AKA, no cooldown at all. As a ranged player character, abilities like Rush are a great counter, but they shouldn't be game-ending, or totally subversive of fighting at range.

I suggest that the cooldown and range be changed to the following:

Code: Select all

cooldown = function(self, t) return math.max( math.floor(20 - math.sqrt( self:getTalentLevel(t) ) * 3), 6) end,
  ...
range = function(self, t) return math.min( math.floor(5 + self:getTalentLevelRaw(t)), 8) end,
The damage is also very high for an ability that can grant one additional attack. 80% damage at most seems appropriate. I expect this change would make Rush more viable as a counter to ranged attackers and less of a physical nuke. It also means that Rush is more powerful at lower levels. To better balance these changes, Rush also needs a smaller stamina cost.

Re: Balance on Rush

Posted: Sun Sep 18, 2011 6:53 pm
by Frumple
I'd probably just say cap the CD and range at 10, then leave it be. Least complicated change you could make. Possibly just set it to run off raw. With that, the lowest CD you'd see is five (for stuff wearing armor of the dragon) and nothing would be dazing you outside the normal LoS. The damage, etc, could be left alone. It's a pretty expensive talent, after all.

Re: Balance on Rush

Posted: Sun Sep 18, 2011 7:10 pm
by marvalis
This is very unconventional, but you could modify the range based on elite status as a completely different way of balancing this skill:

range 4 for normal
range 6 for elite
range 8 for bosses

Range should be fixed, and obviously not scale on talent level (maps do not get bigger simply because you are higher level). Adding a minimum cooldown should be simple.

Re: Balance on Rush

Posted: Sun Sep 18, 2011 8:34 pm
by bricks
Frumple wrote:I'd probably just say cap the CD and range at 10, then leave it be. Least complicated change you could make. Possibly just set it to run off raw. With that, the lowest CD you'd see is five (for stuff wearing armor of the dragon) and nothing would be dazing you outside the normal LoS. The damage, etc, could be left alone. It's a pretty expensive talent, after all.
I forgot to mention; I also think the stamina cost should be dropped. It's overall a lot of changes, but the talent just doesn't seem to serve the purpose it should. Some NPCs have insane stamina regen, to the point where the cost isn't even meaningful, and high resource cost isn't a good balance choice. (Look at Vaporize.) Caps are fine, but many talents are balanced in a similar fashion (square-roots for diminishing returns). Running off raw is something I try to avoid as far as design goes, since the player could want to increase overall mastery, and I believe at least one artifact does increase the mastery of the tree.
marvalis wrote:This is very unconventional, but you could modify the range based on elite status as a completely different way of balancing this skill:

range 4 for normal
range 6 for elite
range 8 for bosses

Range should be fixed, and obviously not scale on talent level (maps do not get bigger simply because you are higher level). Adding a minimum cooldown should be simple.
I don't think that balances the skill at all. Seems like that would further stratify it, actually. I think what I have proposed works and fits within ToME's standard design considerations.

Re: Balance on Rush

Posted: Sun Sep 18, 2011 9:03 pm
by marvalis
Yes, I actually didn't read your code the first time :3. But I did now ^_^. I suggest capping range at 8 (and starting at 4+1), and recharge at something like 6 instead of 4 (note that, the range is still bigger than the cool-down so you can keep rushing your target if it is running: min cooldown 6, max range 8 ).

Code: Select all

cooldown = function(self, t) return math.max( math.floor(20 - math.sqrt( self:getTalentLevel(t) ) * 3), 6) end,
  ...
range = function(self, t) return math.min( math.floor(4 + self:getTalentLevelRaw(t)), 8) end,

Re: Balance on Rush

Posted: Sun Sep 18, 2011 9:52 pm
by bricks
Yes, I think you are right. Not to mention that there is a lot of cooldown decreasing equipment for Rush, like Frumple mentioned. Editing OP to reflect that.

Re: Balance on Rush

Posted: Sun Sep 18, 2011 9:58 pm
by edge2054
This is how I would rewrite it. Trade the weapon hit for some strength based physical damage and lowered cooldown and stamina cost.

Code: Select all

newTalent{
	name = "Rush",
	type = {"technique/combat-techniques-active", 2},
	message = "@Source@ rushes out!",
	require = techs_strdex_req2,
	points = 5,
	random_ego = "attack",
	stamina = 20,
	cooldown = 20,
	tactical = { ATTACK = 1, CLOSEIN = 3 },
	requires_target = true,
	range = function(self, t) return math.floor(5 + self:getTalentLevelRaw(t)) end,
	getDamage = function(self, t) return self:combatTalentStatDamage(t, "str", 20, 200) end,
	action = function(self, t)
		if self:attr("never_move") then game.logPlayer(self, "You can not do that currently.") return end

		local tg = {type="hit", range=self:getTalentRange(t)}
		local x, y, target = self:getTarget(tg)
		if not x or not y or not target then return nil end
		if core.fov.distance(self.x, self.y, x, y) > self:getTalentRange(t) then return nil end

		local block_actor = function(_, bx, by) return game.level.map:checkEntity(bx, by, Map.TERRAIN, "block_move", self) end
		local l = self:lineFOV(x, y, block_actor)
		local lx, ly, is_corner_blocked = l:step(block_actor)
		if is_corner_blocked or game.level.map:checkAllEntities(lx, ly, "block_move", self) then
			game.logPlayer(self, "You are too close to build up momentum!")
			return
		end
		local tx, ty = lx, ly
		lx, ly, is_corner_blocked = l:step(block_actor)
		while lx and ly do
			if is_corner_blocked or game.level.map:checkAllEntities(lx, ly, "block_move", self) then break end
			tx, ty = lx, ly
			lx, ly, is_corner_blocked = l:step(block_actor)
		end

		local ox, oy = self.x, self.y
		self:move(tx, ty, true)
		if config.settings.tome.smooth_move > 0 then
			self:resetMoveAnim()
			self:setMoveAnim(ox, oy, 8, 5)
		end

		-- Attack ?
		if core.fov.distance(self.x, self.y, x, y) == 1 then
			if target:checkHit(self:combatAttack(), target:combatDefense(), 0, 95, 5 - self:getTalentLevel(t) / 2) then
				self:project(target, target.x, target.y, DamageType.PHYSICAL, t.getDamage(self, t))
				if target:canBe("stun") then
					-- Daze, no save
					target:setEffect(target.EFF_DAZED, 3, {})
				end
		end

		return true
	end,
	info = function(self, t)
		local damage = t.getDamage(self, t)
		return ([[Rushes toward your target with incredible speed and attempt to daze it with a vicious shoulder check that deals %0.2f physical damage.
		If the attack hits the target is dazed for 3 turns.
		You must rush from at least 2 tiles away.]]):format(damDesc(self, DamageType.PHYSICAL, (damage)))
	end,
}

Re: Balance on Rush

Posted: Sun Sep 18, 2011 10:51 pm
by Grey
I definitely think the damage should be nerfed on it. The daze is already quite a strong effect.

Re: Balance on Rush

Posted: Sun Sep 18, 2011 10:54 pm
by marvalis
Daze should be replaced by something that allows you to act, for example, a 1 turn confuse or stun.
Damage should be something around 60% of a normal hit.

Mobility + damage + daze is to much of a turn advantage (you get two attacks and a movement = 3 actions).

Getting a move+a small attack + a status effect is still worth at least two action so that is more than enough.

Your code gives a lua error btw edge.

Re: Balance on Rush

Posted: Sun Sep 18, 2011 11:59 pm
by edge2054
Yeah, I didn't bother to test it and was in a hurry.

Anyway the point of the daze on Rush is so the player can close and not worry about the NPC phase dooring the next turn before you get to act. Nerfing the damage output on Rush would let you close (get a little damage in with that) and then get a follow up attack just like you do now.

I think the biggest killer on this talent is the 120% weapon damage.

*edit* And I think I fixed the lua errors in what I posted above, still not tested. It's mostly just an example anyway.

Re: Balance on Rush

Posted: Mon Sep 19, 2011 2:35 am
by marvalis
if you want to keep the daze to let the player decide what attack to use, then I suggest to remove the damage. Daze will give the person that uses rush a free turn to attack.

Prove that the current rush is overpowered: Our number one killer in the game (http://te4.org/game-statistics):
Top 25 killers

* 6811 kills: Bill the Stone Troll

Code: Select all

newEntity{ define_as = "TROLL_BILL",
	resolvers.talents{
		[Talents.T_RUSH]=4,
		[Talents.T_KNOCKBACK]=3,
	},
Players die because Bill can rush from range and hit (for 120% damage) and follow up with another attack while the player is dazed.
Like you said, the 120% attack is the killer, and I think removing it completely is best. If you want to keep the attack, then remove the daze.

Re: Balance on Rush

Posted: Mon Sep 19, 2011 2:38 am
by edge2054
I agree. 20, 200 stat damage off strength is really pretty low.

Better at lower levels when you have a crappy weapon but note that in my example it can't crit and even at 100 strength and 5/5 talent level it's probably not going to do more then 200 damage. On the other hand it will bypass armor so there's that.

Anyway, it was just a quick and dirty example of another way to do it. But yes, the daze should stay.

Re: Balance on Rush

Posted: Mon Sep 19, 2011 2:42 am
by Frumple
Bill is not a good example, unfortunately. Not only has he not had rush for a significant number of those kills, he's also used to be where Prox is now (meaning he could go up against something below level four very easily). Being the first boss most people encounter doesn't help, either. Knockback/rush is also a peculiar combination, as it's pretty easy for the former to lead into the latter, which is considerably more devastating than just rush alone. I've been two-turn murdered by knockback -> rush -> third hit more than once.

With the considered rush change, edge, give a damage boost for size differential and I'd be happy :P

If you're going to remove the attack component, mar, the stamina cost would need to be reduced accordingly. Rush is currently one of the most expensive active stamina talents.

Re: Balance on Rush

Posted: Mon Sep 19, 2011 2:57 am
by marvalis
Reducing the stamina cost is a great idea. Stamina cost does absolutely nothing to balance rush for monsters, and for players it only makes them 'r'est more between battles.
By removing the damage from rush and reducing the stamina cost, everybody wins.

Re: Balance on Rush

Posted: Mon Sep 19, 2011 12:11 pm
by Elkan
marvalis wrote: By removing the damage from rush and reducing the stamina cost, everybody wins.
Except that sweet old lady alchemist who makes the blue pills for stamina... without a market she's out of a job and on the streets...


Edit: just gave me an an artifact potion idea UnId'ed Blue pill. ID'd "Tablet of Vigoura" permanently increases stamina regeneration by 0.3