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

#16 Post by SageAcrin »

I'm not really feeling refunds or equalization for Prodigies. Feels...unthematic and weird.

Of course, there's no reason, strictly speaking, that Mighty Power couldn't set your Weapon Mastery to 5. It's reasonably thematic.

That way, you can't possibly lose anything if you were in a full Dagger build, and a full onehanded weapon build still breaks even. It only "penalizes" builds that partially/fully build knives as a support to onehander/dagger dualwield builds-and any build that does that is still going to want the skill, as it benefits them the most(since any build that's doing that is heavily building Strength, and dualwielding onehanders is going to give optimal benefit to that.).

Edit: Tweaked my suggestions based on other suggestions, also clarified Sonic Gale a bit better(you can tell that particular skill was sort of stream of thought) and retooled Superpower(Sober thought made me realize that, not only is the Mindsave a bad idea just for Solipsists in general, but the Mindpower bonus was way too high-a Berserker can get 90+ rescaled physical power and a Wyrmic isn't too far behind. I'm not sure handing out nearly 100 Mindpower to any class is good. 20% is much more reasonable, though it still might be a little high...).

Edit 2:

Code: Select all

uberTalent{
	name = "Magic Fist",
	mode = "activated",
	message = "@Source@ casts Fist!",
	require = {  },
	cooldown = 25,
	radius = 5,
	range = 1,
	tactical = { ATTACK = { PHYSICAL=2 }, DISABLE = { daze = 2 } },
	target = function(self, t)
		return {type="ball", range=self:getTalentRange(t), selffire=false, radius=self:getTalentRadius(t), talent=t} end,
	getDamage = function(self, t) return 10 + self:getMag() * 3 end,
	action = function(self, t)
		local tg = self:getTalentTarget(t)
			local grids = self:project(tg, self.x, self.y, DamageType.ARCANE, self:spellCrit(t.getDamage(self, t)))
			game.level.map:particleEmitter(self.x, self.y, tg.radius, "ball_fire", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80})
			game:playSoundNear(self, "talents/flame")
		local tg = self:getTalentTarget(t)
		self:project(tg, self.x, self.y, function(px, py, tg, self)
			local target = game.level.map(px, py, Map.ACTOR)
			if target and target ~= self then
				self.combat_atk = self.combat_atk + 1000
				local hit = self:attackTarget(target, nil, 4, true, true)
				self.combat_atk = self.combat_atk - 1000
				if hit and target:canBe("stun") then
					target:setEffect(target.EFF_DAZED, 5, {})
				end
			end
		end)
		return true
	end,
	info = function(self, t)
		return ([[You draw incredible arcane force into your hand, and release it upon your enemies, punching them into oblivion. The resulting explosion deals 400%% normal unarmed damage, and an additional %0.2f Arcane damage, in a radius 5 explosion around you. Enemies caught in this explosion will also be dazed for five turns. This attack cannot miss. The Arcane damage will increase with your Magic stat.]])
		:format(damDesc(self, DamageType.ARCANE, 10 + self:getMag() * 3))
	end,
}
Seems to work. ball_arcane particles would be better but that's only SVN, not b43.

Zonk
Sher'Tul
Posts: 1067
Joined: Sat Mar 01, 2003 4:01 pm

Re: Prodigy ideas

#17 Post by Zonk »

What if Remembered Life gave you a *racial*tree(as if you started as that race) as you remember what you actually were in life? Picking Cornac could give +1 category, which would be an interesting case of exchanging 1 prodigy for 1 cat point.
Also, I'd see it as Wil/Cun based..

(Yes, there is some silliness with your tile not looking...proper if you pick yeek/dwarf/halfling. Let's assume the player was made of parts from multiple beings that end up looking human-ish, and Remembered Life is focusing on a specific race.)

Also, time ago I suggested an undead-only prodigy, based on Wil or Con, that let you use ONE infusion. DarkGod seemed to think it would be too 'must get', however.
ToME online profile: http://te4.org/users/zonk
Addons (most likely obsolete): Wights, Trolls, Starting prodigy, Alternate save/resistance system

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

Re: Prodigy ideas

#18 Post by SageAcrin »

One infusion probably would be too must get, psychologically.

My current idea for Remembered Life is one class tree, but one class tree and one racial generic tree would be very interesting indeed. I've been thinking that retheming it as communing with the dead would allow it to become more universal-basically you're gaining the knowledge of someone else's past life, that way. Undead would still logically be better at it.

Current Class category ideas(At 0.8, or possibly 0.8/1.0 if you are undead):

Magic:

Spell/Fire
Spell/Nightfall
Chronomancy/Matter(+Spacetime Tuning)
Corruptions/Bone(Slightly worse than the others due to the relevant resource, but gets you a better sustain. It only costs half of your remaining Class points at L40!)

Physical:

Techniques/Warcries
Techniques/Battle Tactics
Cunning/Tactical
Cursed/Strife(Seems to run entirely off strength, and while the last skill is biased towards sword/shield, it's still always useful)

Mind:

Wild-Gift/Venom Drake(Has the most Mindpower skills.)
Cursed/Force of Will
Psionic/Distortion
Psionic/Absorption

For Generic, most of those could give either a randomized Racial category at 0.7 or, in Venom Drake's specific case, the Call tree so that there's no Equi problems. (Force of Will could also similarly grant Feed.)

I think those look pretty self consistently useful, so that people looking for a good class sink will usually not regret what they get, even with the lowish class level. Thoughts?

(Also, I suppose the skill would have to do something special if an Adventurer actually learns it. Maybe check and see if you know all the applicable Class categories, and just raise their points by 0.2 if you do.)

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

Re: Prodigy ideas

#19 Post by bricks »

I'm still a little confused on the mechanics, SageAcrin. You choose Magic/Physical/Mind, and then it grants you a random category? Presumably, unlocked? Like I said before, making it random means that anyone who wants a specific category will just save-scum for it (and if save-scumming is somehow disallowed, they just won't bother).

Also, the Undead-only/preferred thing is starting to seem tacked-on. If Remembered Life granted knowledge of a racial tree, I think it would make more sense, both lore-wise (the Blighted Ruins lore specifically refers to the player's chosen class, or at least it used to) and mechanically (Undead have access to fewer generic trees, on the whole).
Sorry about all the parentheses (sometimes I like to clarify things).

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

Re: Prodigy ideas

#20 Post by SageAcrin »

Undead preferred is possible but not required. If it seems too tacked on, I'll just drop it, no big.

The idea is that it force saves after, yes. If no one will bother, though, the chosen categories are too narrow or the target levels are too low, though. Basically, I consider that an artifact of the skill not being strong enough yet, if it's worthless.

Yes, the idea is to have it be that you can choose the power it runs off of(because if it is more random than that, people won't use it, and it's better to do a choice than automation, just so people can do weirder builds if they want if nothing else.). Yeah, it'd be unlocked.

Basically, the idea is that you can use it to get a Class point dump in a good, but only partially controllable, category. If it's not good enough yet, even with the idea of a randomized Racial ability(which could potentially be very, very good), do you have any suggestions for what would make it more interesting?

Basically, Prodigies don't need to be universally appealing. Some of this is simple-to-code ways to make an endgame build more interesting-and as long as they're at least arguably competitive, it doesn't necessarily matter if not a lot of people use them, so long as there is a use.

That's the idea, anyways. It might turn out to be not viable, in this case, but it sounds good, doesn't it?

Edit:

In uber/dex.lua:

Code: Select all

uberTalent{
	name = "Quick Cast",
	mode = "activated",
	message = "@Source@ rapidly casts spells!",
	require = {  },
	cooldown = 40,
	tactical = { BUFF = 1 },
	no_energy = true,
	action = function(self, t)
		self:setEffect(self.EFF_QUICK_CAST, 3, {power=1})
		return true
	end,
	info = function(self, t)
		return ([[Your incredible dexterity has allowed you to cast spells at an amazing rate, for a short time.
		For the next four turns, the time it takes to cast your spells will be cut in half. ]]):
		format()
	end,
}
In timed_effects/other.lua:

Code: Select all

local _M = loadPrevious(...)

newEffect{
	name = "QUICK_CAST", image = "talents/haste.png",
	desc = "Quick Cast",
	long_desc = function(self, eff) return ("Halves the time it takes to cast a spell."):format() end,
	type = "other",
	subtype = { tactic=true },
	parameters = {power = 1},
	status = "beneficial",
	on_gain = function(self, err) return "#Target# starts casting at high speed.", "+Quick Cast" end,
	on_lose = function(self, err) return "#Target#'s casting speed returns to normal.", "-Quick Cast" end,
	activate = function(self, eff)
		self:effectTemporaryValue(eff, "combat_spellspeed", eff.power)
	end,
}
That's the third one down, since I got Archlich's Majesty in another thread. I decided the per-cast limit shouldn't be necessary, unless someone, at some point, makes another skill that spikes casting speed by 50% or more with no downside that keeps it in check. That seems unlikely, since nothing comes even close to doing that right now, and with good reason.

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

Re: Prodigy ideas

#21 Post by bricks »

The problem I see is akin to the problem with escort rewards - they can be very powerful, but there's so much inherent randomness that it tends to upset players more than anything. I think the Adventurer class already covers the desire to play with a mix of talent trees.

A related idea to play with: A prodigy that unlocks one of the categories found within your meta-class. So you could have Wyrmics with summons or Fearscape Reavers. I'd let the player choose the category. I'd also allow the prodigy to simply unlock an available locked category.
Sorry about all the parentheses (sometimes I like to clarify things).

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

Re: Prodigy ideas

#22 Post by SageAcrin »

I think that's an incredible amount of coding that also has to be updated to match any possible new classes-and, optimally, should automatically do so.

Not that it's not neat, it's just out of my league as a coder.

(It...may also go out of control power-wise much more easily than my idea-Fearscape on a Reaver is very strong, and tossing something like Solipsism on a Mindslayer or Necrotic Minions on an Alchemist can spiral out of control very fast...)

As to the general idea of randomization...well, it's one skill.

If someone doesn't like it, they do have a lot of other skills. As long as the roles are kept generally high use and fairly consistent(Which is why I don't like absorption much, incidentally...need to see if I can come up with a good replacement), and explained in the description, they don't all have to do exactly the same thing to be useful.

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

Re: Prodigy ideas

#23 Post by bricks »

Actually, it should be pretty straightforward. You just grab the birth descriptors from the meta-class, add the category sets together, and subtract the currently unlocked categories. Easy if you can perform set operations in Lua, slightly trickier otherwise.
Sorry about all the parentheses (sometimes I like to clarify things).

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

Re: Prodigy ideas

#24 Post by SageAcrin »

Well, if you have an idea and you feel it easy to code, I certainly wouldn't mind you coding it.

This isn't supposed to just be my ideas, here. :)

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

Re: Prodigy ideas

#25 Post by King Gainer »

Zonk wrote:What if Remembered Life gave you a *racial*tree(as if you started as that race) as you remember what you actually were in life? Picking Cornac could give +1 category, which would be an interesting case of exchanging 1 prodigy for 1 cat point.
Also, I'd see it as Wil/Cun based..

(Yes, there is some silliness with your tile not looking...proper if you pick yeek/dwarf/halfling. Let's assume the player was made of parts from multiple beings that end up looking human-ish, and Remembered Life is focusing on a specific race.)

Also, time ago I suggested an undead-only prodigy, based on Wil or Con, that let you use ONE infusion. DarkGod seemed to think it would be too 'must get', however.
I think this is a great idea, instead of undead only though you could make it available for all races and involve remembering your past lives/incarnations.
This seems like it would fit as a will based prodigy. (I don't actually know if reincarnation is a thing in Maj'Eyal though).

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

Re: Prodigy ideas

#26 Post by SageAcrin »

I feel like you could handwave that question by making it about receiving the knowledge and powers of those that have passed on.

Basically, you're not recalling your past lives, you're gaining the powers of the dead.

Also, in uber/const.lua:

Code: Select all

local _M = loadPrevious(...)

uberTalent{
	name = "Nature's Grace",
	mode = "sustained",
	require = { },
	cooldown = 10,
	tactical = { BUFF = 3 },
	no_energy = true,
	getLifeRegen = function(self, t) return 1 + self:getCon() / 15 end,
	getAffinityBonus = function(self, t) return 1 + self:getCon() / 25 end,
	on_learn = function(self, t) 
		if self:knowTalentType("wild-gift/fungus") then
			self:setTalentTypeMastery("wild-gift/fungus", self:getTalentTypeMastery("wild-gift/fungus") + 0.2)
		else
			self:learnTalent(self.T_WILD_GROWTH, true, 3)
		end
	end,
	activate = function(self, t)
		game:playSoundNear(self, "talents/heal")
		return {
			regen = self:addTemporaryValue("life_regen", t.getLifeRegen(self, t) ),
			affinity = self:addTemporaryValue("damage_affinity", {
			[DamageType.ACID] = t.getAffinityBonus(self, t),
			[DamageType.LIGHTNING] = t.getAffinityBonus(self, t),
			[DamageType.FIRE] = t.getAffinityBonus(self, t),
			[DamageType.COLD] = t.getAffinityBonus(self, t),
			[DamageType.LIGHT] = t.getAffinityBonus(self, t),
			[DamageType.DARKNESS] = t.getAffinityBonus(self, t),
			[DamageType.BLIGHT] = t.getAffinityBonus(self, t),
			[DamageType.TEMPORAL] = t.getAffinityBonus(self, t),
			[DamageType.ARCANE] = t.getAffinityBonus(self, t),
			}),
		}
	end,
	deactivate = function(self, t, p)
		self:removeTemporaryValue("life_regen", p.regen)
		self:removeTemporaryValue("damage_affinity", p.affinity)
		return true
	end,
	info = function(self, t)
		local regen = t.getLifeRegen(self, t)
		local healaffinity = t.getAffinityBonus(self, t)
		return ([[Feel the power of nature. While this sustain is active, your life regeneration will be boosted by %0.2f, and you will heal from all non-physical/nature/mind damage %0.2f%% of the damage they deal.
		These values will scale with the Constitution stat.
		Additionally, by learning this skill, you will also gain the Wild Growth skill at Talent Level 3 if you do not have the Fungus tree unlocked, or gain a bonus 0.2 Category rating to that tree if you do have it unlocked.]]):
		format(regen, healaffinity)
	end,
}
Hey, I coded something and it never threw an error or obvious problem, ever, doing exactly what I wanted it to do the first time.

...

There's GOT to be something I'm missing wrong with it. Until I find that, :D

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

Re: Prodigy ideas

#27 Post by SageAcrin »

Got Crushing Will...more or less done.

For some strange reason, I had strange problems with getting a new pinning damage type working(gravitypin or pinning might work, but neither checks Mindpower).

After sober reflection, I found myself questioning how much, if at all, it would even matter and raised the radius on the ability somewhat to compensate for the lack of it, rather than messing more with it.

I also had problems getting a proper radius particle effect...or having them deactivate properly when I added one at all, which was even weirder.

I'm chalking this up to tiredness after trying to code stuff half the day. In the meantime it does work and doesn't look particularly off, it's just a little odd to have a field effect with no graphical feedback, even if it is thematic in this case.

In actor.lua:

Code: Select all

	if self:isTalentActive(self.T_CRUSHING_WILL) then
		local t = self:getTalentFromId(self.T_CRUSHING_WILL)
		t.do_crushing(self, t)
	end
In uber/wil.lua:

Code: Select all

local _M = loadPrevious(...)

uberTalent{
	name = "Crushing Will",
	mode = "sustained",
	require = { },
	cooldown = 12,
	tactical = { BUFF = 3 },
	getSmash = function(self, t) return 10 + self:combatMindpower() * 2 end,
	getRange = function(self, t)
		return 0 end,
	getRadius = function(self, t)
		return 5 end,
	getTarget = function(self, t)
		return {type="ball", range=t.getRange(self, t), radius=t.getRadius(self, t), selffire=false, friendlyfire=false} end,
	requires_target = function(self, t)
		return false
	end,
	do_crushing = function(self, t)
		local dam = t.getSmash(self, t)
		local tg = t.getTarget(self, t)
		self:project(tg, self.x, self.y, function(tx, ty)
			local act = game.level.map(tx, ty, engine.Map.ACTOR)
			if act then
				self:breakStepUp()
			end
			DamageType:get(DamageType.PHYSICAL).projector(self, tx, ty, DamageType.PHYSICAL, dam)
		end)
	end,
	activate = function(self, t)
		game:playSoundNear(self, "talents/earth")
		return {}
	end,
	deactivate = function(self, t, p)
		return true
	end,
	info = function(self, t)
		local smash = t.getSmash(self, t)
		local rad = t.getRadius(self, t)
		return ([[You have become talented enough at mental arts that your very presence can physically crush enemies.
		Enemies caught within the %d radius of your mental aura will be constantly crushed, taking %0.2f physical damage every turn.
		This talent ignores allies, and is sustainable at no cost.]]):
		format(rad, damDesc(self, DamageType.PHYSICAL, smash))
	end,
}

supermini
Uruivellas
Posts: 800
Joined: Tue May 15, 2012 11:44 pm

Re: Prodigy ideas

#28 Post by supermini »

Here's the Blue Moon, done and tested.

Code: Select all

Index: mag.lua
===================================================================
--- mag.lua	(revision 6096)
+++ mag.lua	(working copy)
@@ -184,3 +184,54 @@
 		:format()
 	end,
 }
+
+uberTalent {
+	name = "Blue Moon",
+	mode = "passive",
+	
+	trigger = function(self, t, source_t)
+	
+		if (source_t.mana) then
+			if (source_t.mana > 0) then 
+				self:incMana(source_t.mana/2) 
+				return true 
+			end
+		end
+		
+		if (source_t.vim) then
+			if (source_t.vim > 0) then
+				self:incVim(source_t.vim/2)
+				return true
+			end
+		end
+		
+		if (source_t.positive) then
+			if(source_t.positive < 0)  then 
+				self:incPositive(source_t.positive/2) 
+				return true
+			end
+		end
+		
+		if (source_t.negative) then
+			if(source_t.negative > 0) then
+				self:incNegative(source_t.negative/2)
+				return true
+			end
+		end
+		
+		if(source_t.paradox) then
+			if(source_t.paradox > 0) then
+				self:incParadox(source_t.paradox/2)
+				return true
+			end
+		end
+		
+	end,
+	
+	info = function()
+		return ([[Your spell criticals recover half of base cost of resource used to cast the spell.  
+		Works with mana, vim, negative energy, and paradox.  
+		Criticals with positive energy talents generate half as much positive energy.]]):format()
+	end,	
+}
+

Code: Select all

Index: damage_types.lua
===================================================================
--- damage_types.lua	(revision 6096)
+++ damage_types.lua	(working copy)
@@ -445,7 +445,11 @@
 			if src.knowTalent and src:knowTalent(src.T_ELEMENTAL_SURGE) then
 				src:triggerTalent(src.T_ELEMENTAL_SURGE, nil, target, type, dam)
 			end
-
+			
+			if src.knowTalent and src:knowTalent(src.T_BLUE_MOON) then
+				 local tal = source_talent
+				 src:triggerTalent(src.T_BLUE_MOON, nil, tal)
+			end
 			src.turn_procs.is_crit = nil
 		end
 
I've also attached .diff files.
Attachments
blue moon.7z
(831 Bytes) Downloaded 188 times
<darkgod> all this fine balancing talk is boring
<darkgod> brb buffing boulder throwers

Parcae2
Uruivellas
Posts: 709
Joined: Sat Jan 14, 2012 12:02 am

Re: Prodigy ideas

#29 Post by Parcae2 »

I'm also not super enthusiastic about the notion of randomness. How about Imitated Skills - your great dexterity enables you to imitate a past companion's racial skills (gives access to one selected racial tree at .8 mastery, requires having saved X escorts or being in the Arena/ID)? I feel like we need Str/Dex prodigies the most.

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

Re: Prodigy ideas

#30 Post by lukep »

Code: Select all

uberTalent{
	name = "Pause",
	mode = "activated",
	message = "@Source@ pauses time!",
	require = {  },
	cooldown = 20,
	tactical = { BUFF = 1 },
	no_energy = true,
	action = function(self, t)
		self.energy.value = self.energy.value + game.energy_to_act
		return true
	end,
	info = function(self, t)
		return ([[The world around you freezes for a moment, effectively giving you an extra turn.]]):
		format()
	end,
}
Not sure which stat it goes best with, or if it needs to be re-flavoured.
Some of my tools for helping make talents:
Melee Talent Creator
Annotated Talent Code (incomplete)

Post Reply