Prodigy ideas

All new ideas for the upcoming releases of ToME 4.x.x should be discussed here

Moderator: Moderator

Message
Author
SageAcrin
Sher'Tul Godslayer
Posts: 1884
Joined: Tue Apr 10, 2012 6:52 pm

Re: Prodigy ideas

#31 Post by SageAcrin »

That'd be Chronomancy oriented, probably, so Magic or Will.

Also, to make it more competitive, I'd probably lower the CD down to 8-10. Still, cool idea, and nice and simple.

King Gainer
Halfling
Posts: 88
Joined: Thu Jul 12, 2012 8:37 pm

Re: Prodigy ideas

#32 Post by King Gainer »

I'd say magic would fit best. Maybe a cooldown of 15ish.
I like the idea a lot.

SageAcrin
Sher'Tul Godslayer
Posts: 1884
Joined: Tue Apr 10, 2012 6:52 pm

Re: Prodigy ideas

#33 Post by SageAcrin »

Well, remember, +15% global speed is a skill.

15% global speed grants you an extra turn once every seven or eight turns.

This is a bit more versatile and on demand, but still, 10 turns for it seems reasonable with that comparison.

eliotn
Wyrmic
Posts: 244
Joined: Mon Sep 26, 2011 1:49 pm

Re: Prodigy ideas

#34 Post by eliotn »

Wow you guys are coding prodigies? Awesome. I will try to code some as soon as I finish my current game.

Here are some ideas for more prodigies:

Arcane skin

Requirements:
Mag 50

Passive
Studying the secrets of the golems, you have found out how to reflect damage you take. X% of the damage you take is reflected back to the enemy. The percentage of damage reflected scales with Magic.

Portal Attacker

Requirements:
Wil 50
Must have dealt over 50000 temporal damage

Sustain
Takes a turn to activate/deactivate.
Your mastery of portals allows you to increase the range of all melee attacks, arrows, and staff blasts by 3, but reduces the amount of damage you deal with those attacks by 25%.

SageAcrin
Sher'Tul Godslayer
Posts: 1884
Joined: Tue Apr 10, 2012 6:52 pm

Re: Prodigy ideas

#35 Post by SageAcrin »

In str.lua:

Code: Select all

uberTalent{
	name = "Superpower",
	mode = "passive",
	info = function(self, t)
		return ([[A healthy body is key to a healty mind. And a healthy mind is powerful indeed.
		Grants a Mindpower bonus equal to 25%% of your Strength.
		Additionally, you treat all weapons as having an additional 40%% willpower modifier.]])
		:format()
	end,
}
In combat.lua, below Arcane Might:

Code: Select all

	if self:knowTalent(self.T_SUPERPOWER) then
		totstat = totstat + self:getStat("wil") * 0.4
	end
In combat.lua, just above Gesture of Power's bonus to Mindpower:

Code: Select all

	if self:knowTalent(self.T_SUPERPOWER) then
		add = add + 25 * self:getStr() / 100
	end
Easy stuff this time.

Also adjusted the main list I made with tweaks to skills I made while coding them and with some of DarkGod's comments on them-probably going to have to add new ideas.

I'm shooting for releasing an addon when I hit 12(two of each), for DarkGod to look over and see if he likes stuff out of. 18 would be better, but with the changes to the list, it's getting harder to pull off before I need another round of brainstorming skills.

Of course, if other people keep making new skills, there'll be 18 skills from this thread even if I only get 12 up. :)

lukep
Sher'Tul Godslayer
Posts: 1712
Joined: Mon Mar 14, 2011 10:32 am
Location: Canada

Re: Prodigy ideas

#36 Post by lukep »

idea for a Con one: be invulnerable during your turn, instant cast, 10 cooldown. This would allow you to prevent your own splash damage, defensive throws, retaliation damage, martyrdom, etc...
Some of my tools for helping make talents:
Melee Talent Creator
Annotated Talent Code (incomplete)

SageAcrin
Sher'Tul Godslayer
Posts: 1884
Joined: Tue Apr 10, 2012 6:52 pm

Re: Prodigy ideas

#37 Post by SageAcrin »

In /uber/wil.lua:

Code: Select all

uberTalent{
	name = "Mental Tyranny",
	mode = "sustained",
	require = { },
	cooldown = 20,
	tactical = { BUFF = 2 },
	activate = function(self, t)
		game:playSoundNear(self, "talents/distortion")
		return {
			converttype = self:addTemporaryValue("all_damage_convert", DamageType.MIND),
			convertamount = self:addTemporaryValue("all_damage_convert_percent", 100),
			dam = self:addTemporaryValue("inc_damage", {[DamageType.MIND] = 10}),
			resist = self:addTemporaryValue("resists_pen", {[DamageType.MIND] = 30}),
		}
	end,
	deactivate = function(self, t, p)
		self:removeTemporaryValue("all_damage_convert", p.converttype)
		self:removeTemporaryValue("all_damage_convert_percent", p.convertamount)
		self:removeTemporaryValue("inc_damage", p.dam)
		self:removeTemporaryValue("resists_pen", p.resist)
		return true
	end,
	info = function(self, t)
		return ([[Transcend the physical and rule over all with an iron will.
		While this sustain is active, all of your damage is converted into Mind damage.
		Additionally, you gain 30%% Mind resistance penetration, and +10%% Mind damage. ]]):
		format()
	end,
}
Another easy one down. I nerfed it a bit more-on reflection, people can stack a lot of damage bonuses(even if they are kinda rare for Mind) when they only rely on one element, which probably means that, even in spite of the possible saving against the damage, it's better than it sounds. Should still be pretty good.

SageAcrin
Sher'Tul Godslayer
Posts: 1884
Joined: Tue Apr 10, 2012 6:52 pm

Re: Prodigy ideas

#38 Post by SageAcrin »

In /uber/str.lua:

Code: Select all

uberTalent{
	name = "Unstoppable Strike",
	mode = "activated",
	require = {  },
	cooldown = 25,
	tactical = { ATTACK = 4 },
	no_energy = true,
	action = function(self, t)
		self:setEffect(self.EFF_UNSTOPPABLE_STRIKE, 4, {power=100})
		return true
	end,
	info = function(self, t)
		return ([[Utterly shatter your enemy's guard.
		You strike your enemy so hard that they cannot possibly defend against it, gaining 100%% Physical resistance penetration.
		The enemy's armor is also nothing to you for this time, granting you +100 Armor Penetration.
		This effect lasts five turns, and takes no time to use.]]):
		format()
	end,
}
In timed_effects/physical.lua:

Code: Select all

newEffect{
	name = "UNSTOPPABLE_STRIKE", image = "talents/unstoppable_strike.png",
	desc = "Unstoppable Strike",
	long_desc = function(self, eff) return ("The target's armour penetration is increased by %d, and their physical resistance penetration is increased by %d%%."):format(eff.power, eff.power) end,
	type = "physical",
	subtype = { focus=true },
	status = "beneficial",
	parameters = { power=100 },
	on_gain = function(self, err) return "#Target# begins crushing defenses!" end,
	on_lose = function(self, err) return "#Target# can no longer maintain the effort of crushing defenses." end,
	activate = function(self, eff)
		eff.tmpapr = self:addTemporaryValue("combat_apr", eff.power)
		eff.tmprespen = self:addTemporaryValue("resists_pen", {[DamageType.PHYSICAL] = eff.power})
	end,
	deactivate = function(self, eff)
		self:removeTemporaryValue("combat_apr", eff.tmpapr)
		self:removeTemporaryValue("resists_pen", eff.tmprespen)
	end,
}
You know, I kinda feel like this Prodigy has been here all the time and I just now found it.

The values could be tweaked if it's too powerful/weak, and if it turns out to be a bad idea...well, it took like twenty minutes to code.

But I've seen enough people lament the lack of physical resistance penetration in the game to think it'll have value to some, even if I'm not sure who I personally would grab it for.

SageAcrin
Sher'Tul Godslayer
Posts: 1884
Joined: Tue Apr 10, 2012 6:52 pm

Re: Prodigy ideas

#39 Post by SageAcrin »

In /uber/str.lua:

Code: Select all

uberTalent{
	name = "Reckless Abandon",
	mode = "sustained",
	require = { },
	cooldown = 20,
	tactical = { BUFF = 3 },
	no_energy = true,
	getCleaveChance = function(self, t) return 20 + self:getStr() / 3 end,
	getRepel = function(self, t) return 5 + self:getStr() / 10 end,
	getSurge = function(self, t) return (10 + self:getWil() / 2) / 100 end,
	on_attackTarget = function(self, t, target)
		if inCleave then return end
		inCleave = true

		local chance = t.getCleaveChance(self, t)
			if self:isTalentActive(self.T_CLEAVE) then
				chance = chance/3
			end
		if rng.percent(chance) then
			local start = rng.range(0, 8)
			for i = start, start + 8 do
				local x = self.x + (i % 3) - 1
				local y = self.y + math.floor((i % 9) / 3) - 1
				local secondTarget = game.level.map(x, y, Map.ACTOR)
				if secondTarget and secondTarget ~= target and self:reactionToward(secondTarget) < 0 then
					game.logSeen(self, "%s cleaves through %s!", self.name:capitalize(), secondTarget.name)
					self:attackTarget(secondTarget, nil, 0.7, true)
					inCleave = false
					return
				end
			end
		end
		inCleave = false
	end,
	isRepelled = function(self, t)
		local chance = t.getRepel(self, t)
		return rng.percent(chance)
	end,
	activate = function(self, t)
		return {
			surge = self:addTemporaryValue("movement_speed", t.getSurge(self, t)),
			luck = self:addTemporaryValue("inc_stats", {[self.STAT_LCK] = -10})
		}
	end,
	deactivate = function(self, t, p)
		self:removeTemporaryValue("movement_speed", p.surge)
		self:removeTemporaryValue("inc_stats", p.luck)
		return true
	end,
	info = function(self, t)
		local deflect = t.getRepel(self, t)
		local cleave = t.getCleaveChance(self, t)
		local move = t.getSurge(self, t)
		return ([[Slaughter your enemies with all of your hatred.
		While active, you have %d%% chance of repelling physical attacks, taking no damage from them.
		Additionally, you have a %d%% chance of cleaving through your enemies, striking a second target for 70%%.
		Finally, your movement speed is raised by %d%%.
		The extreme recklessness of your actions brings you great misfortune (-10 Luck).
		Your repel chance and cleaving chance are raised with the Strength stat, and your movement speed is raised by the Willpower stat.
		(Note: This skill does not conflict with Repel, Surge or Cleave.
		Cleaves from this talent occur at a greatly reduced(33%%) rate while Cleave is active, but may be triggered off other cleaving attacks.)]]):
		format(deflect, cleave, move * 100)
	end,
}
In combat.lua, just below Cleave's code:

Code: Select all

	-- different source of Cleave
	if self:isTalentActive(self.T_RECKLESS_ABANDON) then
		local t = self:getTalentFromId(self.T_RECKLESS_ABANDON)
		t.on_attackTarget(self, t, target)
	end
In combat.lua, just below Repel's code:

Code: Select all

	-- check repel from Reckless Abandon
	if repelled == false then
		if target:isTalentActive(target.T_RECKLESS_ABANDON) then
			local t = target:getTalentFromId(target.T_RECKLESS_ABANDON)
			repelled = t.isRepelled(target, t)
		end
	else end
It's basically a Talent Level 1 Surge/Repel/Cleave, without the secondary weapon-specific effects, that can be stacked on top of those skills. And has a unique effect to keep it from getting out of control when stacked with Cleave, which was basically converting a not-horribly-overpowered bug into a feature in a neat way.

Considering that, even at L1, stacking all three of those skills is reasonably powerful, I think it'll be a neat option.

SageAcrin
Sher'Tul Godslayer
Posts: 1884
Joined: Tue Apr 10, 2012 6:52 pm

Re: Prodigy ideas

#40 Post by SageAcrin »

In /uber/dex.lua

Code: Select all

uberTalent{
	name = "Sonic Gale",
	mode = "sustained",
	require = { },
	cooldown = 25,
	sustain_stamina = 10,
	tactical = { ATTACKAREA = { weapon = 1 } },
	activate = function(self, t)
		return {
			dam = self:addTemporaryValue("sonic_gale", 0.7),
		}
	end,
	deactivate = function(self, t, p)
		self:removeTemporaryValue("sonic_gale", p.dam)
		return true
	end,
	info = function(self, t)
		return ([[Fire your arrows with incredible speed.
		Every arrow you fire will, on impact, produce 2 radius sonic blasts, dealing 70%% weapon damage to all caught in them, in addition to their normal damage.
		This strenuous technique consumes 10 Stamina with every shot.]]):
		format()
	end,
}
In /interface/archery.lua:

Code: Select all

	-- Sonic Gale
	if hitted and weapon and self:attr("sonic_gale") and (not self.sonic_gale_last_turn or self.sonic_gale_last_turn < game.turn) then
		local dam = dam * self.sonic_gale
		self:project({type="ball", radius=2, selffire=false}, target.x, target.y, DamageType.PHYSICAL, dam)
		self:incStamina(-10)
		self.sonic_gale_last_turn = game.turn
	end
Easier than I expected.

Edit: Added a negligable(10) sustain cost so that it actually turns off when you hit 0 from its cost. It wasn't doing that before, which was meaning you could spam it forever. You just wouldn't have any stamina left. Oops.

SageAcrin
Sher'Tul Godslayer
Posts: 1884
Joined: Tue Apr 10, 2012 6:52 pm

Re: Prodigy ideas

#41 Post by SageAcrin »

In /uber/const.lua:

Code: Select all

uberTalent{
	name = "Corrupted Shell",
	mode = "passive",
	on_learn = function(self, t)
		self.max_life = self.max_life + 150
	end,
	info = function(self, t)
		return ([[Thanks to your newfound knowledge of corruption, you've learned some tricks for toughening your body. If you are healthy enough to withstand them.
		Improves your Life by 150, your Defense by %d, and your saves by %d, as your natural toughness and reflexes are pushed beyond their normal limits.
		Your saves and defense will raise with the Constitution stat.]])
		:format(self:getCon() / 3, self:getCon() / 3)
	end,
}
In Combat.lua(four places, in the Defense, physical save, magical save and mental save calculations):

Code: Select all

	if self:knowTalent(self.T_CORRUPTED_SHELL) then
		add = add + self:getCon() / 3
	end
This ended up unbelievably simple. I think it's kinda cool though, and the less complex flat-rate life bonus makes it more interesting to those swapping for Con. I could see a no-Con Archmage working with this...maybe. Then again, it works better with Con, obviously.

SageAcrin
Sher'Tul Godslayer
Posts: 1884
Joined: Tue Apr 10, 2012 6:52 pm

Re: Prodigy ideas

#42 Post by SageAcrin »

In /uber/wil.lua:

Code: Select all

uberTalent{
	name = "Walls of the Mind",
	mode = "passive",
	on_learn = function(self, t)
		self.slow_projectiles = (self.slow_projectiles or 0) + 50
	end,
	info = function(self, t)
		return ([[The dexterous dodge weapons. Those with true strength simply don't get hit.
		Increases your Defense by %d, and permanently slows all projectiles by 50%%, as your will hinders all attacks upon you.]])
		:format(20 + self:getWil() / 4)
	end,
}
In combat.lua:

Code: Select all

	if self:knowTalent(self.T_WALLS_OF_THE_MIND) then
		add = add + 20 + self:getWil() / 4
	end
Another simple one. Feels really appropriate, though.

bricks
Sher'Tul
Posts: 1262
Joined: Mon Jun 13, 2011 4:10 pm

Re: Prodigy ideas

#43 Post by bricks »

Just to prevent bugs from downstream balance changes, you may want to generalize the scaling functions and reference them in Combat.lua instead of copying the formula. A language nitpick: "Thanks to your newfound knowledge of corruption, you've learned some tricks for toughening your body. If you are healthy enough to withstand them." The latter is a sentence fragment. Maybe instead: "The touch of corruption has mutated and toughened your body."

A silly thought for this or another talent; becoming "corrupted" could forbid you from using infusions (and remove current infusions), so the prodigy sort of turns you into a ghoul/horror. Could also come with a regeneration/heal mod bonus to compensate for the lack of infusions.
Sorry about all the parentheses (sometimes I like to clarify things).

Sradac
Sher'Tul
Posts: 1081
Joined: Fri Sep 21, 2007 3:18 am
Location: Angolwen

Re: Prodigy ideas

#44 Post by Sradac »

get a golem, or get a second golem

SageAcrin
Sher'Tul Godslayer
Posts: 1884
Joined: Tue Apr 10, 2012 6:52 pm

Re: Prodigy ideas

#45 Post by SageAcrin »

"But only if you are healthy enough to withstand the strain from the changes." is how I changed that in the on-HD version of the skill. You're right, it was more awkward before.

In /uber/const.lua:

Code: Select all

uberTalent{
	name = "Adamant",
	mode = "activated",
	require = {  },
	cooldown = 15,
	tactical = { BUFF = 4 },
	no_energy = true,
	action = function(self, t)
		self:setEffect(self.EFF_VICTORY_RUSH_ZIGUR, 1, {power=1})
		return true
	end,
	info = function(self, t)
		return ([[If you see the pain coming, you can take it.
		You are invulnerable for two turns. All damage during this time is completely nulled.]]):
		format()
	end,
}
lukep's idea, a bit more generalized. I think it's pretty interesting.

In /uber/magic.lua:

Code: Select all

uberTalent{
	name = "Elemental Mastery",
	mode = "sustained",
	require = { },
	cooldown = 20,
	tactical = { BUFF = 3 },
	activate = function(self, t)
		game:playSoundNear(self, "talents/arcane")
		return {
			mastery = self:addTemporaryValue("elemental_mastery", 1),
		}
	end,
	deactivate = function(self, t, p)
		self:removeTemporaryValue("elemental_mastery", p.mastery)
		return true
	end,
	info = function(self, t)
		return ([[Invoke your elemental mastery, and use it to split your damage into a prismatic blast.
		All of your damage will be split into 30%% of its original value in Arcane damage, 30%% in Fire, 30%% in Cold and 30%% in Lightning, for a net gain of 20%% additional damage.]])
		:format()
	end,
}
Not really something I did-DarkGod actually coded the Elemental Mastery function in damage_types, which was the only hard part. I figure coding the actual talent for it makes life easier for him though.
Last edited by SageAcrin on Wed Dec 19, 2012 2:43 am, edited 1 time in total.

Post Reply