Page 1 of 2

The Stoneshaper (Wilder subclass)

Posted: Mon May 01, 2017 8:33 pm
by Erenion

After some time and three other addon ideas that I thought of, started making and then scrapped, here is my new class addon!

The Stoneshaper is a wilder class specializing in terrain. You create it, you destroy it, you shape it into giant golems to pummel your enemies to death...
Basically, the class has three different specializations: caster, pseudo-summoner and melee warrior. Each of these specializations has a locked and an unlocked class tree, and you can - and probably will - mix freely between them.
If you have any feedback, be it about balance, issues, errors or otherwise, please leave a comment.

Class Overview

Class mechanic: Rubble Fields
Some of your skills create "rubble". Rubble damages, slows and (20% chance) pins everything inside each turn.
If you are a summoned Stone Warrior or have the Rock Travel skill sustained, you completely ignore rubble fields.

You make walls, you break walls.

Call the Stone
Summons a single wall tile, blocking movement and sight. If an enemy is on the tile, it deals damage to the enemy - but no wall appears.

Reduce to Rubble
Destroy all walls in a radius 1 area, creating a rubble field for each wall destroyed.

Rocky Burst
Walls. Lots of them. You mark an area, and a bunch of walls appears in random locations within that area.

Unmake the Shaping
You detonate all your summoned walls within range 10 (and LOS), dealing physical damage and bleeding enemies hit.
This can do 7000+ damage lategame when cast immediately after Rocky Burst. And there is a talent that resets skill cooldowns...

Wild-gift/Rubble (locked)
Creating MORE rubble fields!

Rock Claws
Deal physical damage and pin enemies within a cone.

Rubble Shaping
Whenever you summon walls with Call the Stone or Rocky Burst, you have a chance to get a free rubble field!

Violent Disturbance
What's better than a lot of rubble? BIG rubble. That lasts long. And really hurts.

Power of the Deep
Phys pen. Also, your rubble now does extra nature and darkness damage.

How about golems?

Awaken the Warriors
You turn walls in an area into golems. These golems are fairly tanky and do decent damage, but are fairly immobile.

Stone Armoury
Because no one likes golems that miss and do pitiful damage when they actually manage to hit.

Violent End
Golems are cool. Rubble fields are cool as well. So let's make rubble from golems.
(Best used on one-turn-remaining, about to die golems)

Living Statues
Health regen for your golems. And now they pin enemies every few turns.

Stone Army (locked)
Better golems. And more of them.

Warriors Throw
A friendly golem gives you a hand when it comes to mobility.

Hardened Stone
Your golems gain armor hardiness and extra talents.

Tremor Shock
Each golem in LOS stomps, releasing a shockwave that slows enemies. If an enemy is hit by more than one shockwave, that enemy takes damage.
Brief example since description might be slightly confusing:
Let's assume the skill does 100 damage.

The first shockwave that hits will do no damage, but slow.
The second shockwave will do 100 damage.
The third shockwave will do 125 damage.
The fourth shockwave will do (125 * 1.25) = 156 damage.

Enduring Animation
Your golems split into two smaller golems when they die, each having a fraction of the precursors stats.

A specialized melee weapon replaces your attacks. Now with staff accuracy bonus!

Stoneforged Weapon
Basic weapon stats, and sustain that replaces your melee attacks with the weapon.

Stone-plated Armor
Extra armor, hardiness, and pseudo-"earthen fury" ego for your Stoneforged Weapon

Masterful Forger
Weapon mastery. Also bleed retaliation.

Empowering Throw
You project a melee attack with your Stoneforged Weapon, temporarily gaining nature damage on hit for each enemy hit.

Wild-gift/Ancient Blade (locked)

Deeprock Weapon
While sustained, gain lifesteal and ignore part of opposing shields, but you gain equilibrium on each hit.

Living Weapon
You passively gain bonus nature damage on Stoneforged Weapon hits. While this is sustained, that damage splashes in a cone behind the target, but you gain equilibrium on each hit.

Empower the Stoneforge
You instantly activate both Deeprock and Living Weapon, and for a few turns they can't deactivate due to high equilibrium.
But when this ends, you take nature damage based on your equilibrium...

Heartbeat of Eyal
Nature pen. Also, while sustained, your Stoneforged Weapon gains moss effects on hit.

Wild-gift/Stoneform (generic)
Move through stone, eat stone, breathe stone...

Rock Travel
While sustained, you gain the ability to pass through most walls (like Wraithform), but are slowed.

Mending Stone
While in walls, you regenerate health, equilibrium and move faster.

Absorb Stone
Eat the wall you're in, gaining a bonus to damage for a few turns.
For non-combat purposes, use this while traveling through walls to create a space to regain some air.

One with the Stone
Temporarily gain armor and the ability to survive without air.

Wild-gift/Enhanced Powers
Synergy between talent trees.

Rock General
For each Stone Warrior in LoS, you gain resist all. Whenever you crit with your Stoneforged Weapon, you buff all Stone Warriors in LoS.

Ruler of Rubble
Increases the pinning chance of your rubble fields. Your Stone Warriors deal bonus physical damage versus pinned targets.

Shattering Blade
Your Stoneforged Weapon reduces the armor of enemies. While standing in rubble, gain bonus armor.

Deeprock Enhancement
Critting with your Stoneforged Weapon creates rubble fields. Whenever you transform a summoned wall into a Stone Warrior, all Stone Warriors summoned with this ability cast gain bonus stats.

Animation Enhancement
Taking physical damage will increase your armor. Your summoned walls now deal a small amount of physical damage around them each turn.

Shaped Enhancement
Your Stone Warriors gain bonus movement speed. Unmake the Shaping now reduces physical resistance.

Re: The Stoneshaper (Wilder subclass)

Posted: Sun Sep 03, 2017 2:12 am
by astralInferno
I haven't played much recently, but this writeup looks really cool and well thought out! I was concerned that you might have too many things to do, but making your spellcasting battlefield control and summons solves that p well!

Re: The Stoneshaper (Wilder subclass)

Posted: Mon Sep 04, 2017 11:14 am
by Erenion
So, I went ahead and update this addon. (I must confess, I'd almost forgotten about it)

Contents of the 1.1.0 update:
- fixed the error on level change (hopefully)
- fixed Stone Warriors having certain talents even though they don't have them
- Changed Stoneforged Weapon. Instead of attacking alongside your melee attack, it now replaces it (while the sustain is on, there's also a "manual" attack button that just attacks with the weapon once.) This was the way I wanted it to work initially, but I couldn't figure out how to do it until yesterday.
- Massively buffed Stoneforged Weapon in the lategame. Changing it to replace attack means you lose out on a LOT of damage otherwise.
- Added a new talent category: Enhanced Powers
- Fixed rubble slowing by 25000% instead of 25%

Re: The Stoneshaper (Wilder subclass)

Posted: Mon Sep 04, 2017 4:12 pm
by Jarinex
The stoneshaper definitely does seem like a fun and unique class. It's a shame that the walls are impassible, as I'm sure it would make the class even better.

I wonder what may be causing the issue. I know that some walls are impassible (like maze walls and vault walls), so maybe something there is causing it to not work.

Re: The Stoneshaper (Wilder subclass)

Posted: Tue Sep 05, 2017 9:09 pm
by astralInferno
22:07 DarkGod can_pass = {pass_wall=1},
22:07 DarkGod add that
22:07 DarkGod to the wall definition
Does this help? :)

Re: The Stoneshaper (Wilder subclass)

Posted: Wed Sep 06, 2017 7:23 am
by Erenion

Code: Select all

local e ={
			old_feat = oe,
			name = "stone wall", image = "terrain/rocky_mountain.png",
			display = '#', color_r=255, color_g=255, color_b=255, back_color=colors.GREY,
			desc = "a summoned wall of stone",
			type = "wall", subtype = "summoned",
			always_remember = true,
			does_block_move = true,
			block_move = true,
			can_pass = {pass_wall=1},
			block_sight = true,
			air_level = -20,
			nice_editer = mountain_editer,
			nice_tiler = { method="replace", base={"MOUNTAIN_WALL", 70, 1, 6} },
			temporary = t.getDuration(self, t),
			x = x, y = y,
			canAct = false,
			act = function(self)
				self.temporary = self.temporary - 1
				if self.temporary <= 0 then, self.y, engine.Map.TERRAIN, self.old_feat)
					game.nicer_tiles:updateAround(game.level, self.x, self.y)
			dig = function(src, x, y, old)
				return nil, old.old_feat
			summoner_gain_exp = true,
			summoner = self,
That... was already in there.

Code: Select all

desc = "a summoned wall of stone",
type = "wall", --subtype = "floor",
always_remember = true,
can_pass = {pass_wall=1},
does_block_move = true,
Stone Wall has that code as well and it doesn't work.

Code: Select all

activate = function(self, eff)
	eff.tmpid = self:addTemporaryValue("can_pass", {pass_wall=20})
And Wraithform

Code: Select all

activate = function(self, t)
	local ret = {}

	self:talentTemporaryValue(ret, "can_pass", {pass_wall=20})
	self:talentTemporaryValue(ret, "movement_speed", -t.getSlow(self, t))
and Rock Travel use the same code.

Re: The Stoneshaper (Wilder subclass)

Posted: Wed Sep 06, 2017 12:22 pm
by astralInferno
...darkgod gave me wrong information! :O

I'm sure if you find him on IRC you can hash out what the actual issue here is.
Sorry for assuming you'd missed something obvious!

Re: The Stoneshaper (Wilder subclass)

Posted: Wed Sep 06, 2017 1:43 pm
by Erenion
Well, I tested it without most of my addons... and it is apparently a base game issue.
Summoned walls just can't be walked through.
No Burrow, no Wraithform. (Tested on Ice Wall and on Stone Wall.)

Re: The Stoneshaper (Wilder subclass)

Posted: Wed Sep 06, 2017 2:51 pm
by Frumple
Don't suppose trying =20 instead of =1 makes a difference? You'd think those bits of code would want to be lining up instead of having different values.

Re: The Stoneshaper (Wilder subclass)

Posted: Wed Sep 06, 2017 11:57 pm
by HousePet
I'm pretty sure you need to have a pass_wall value higher than the wall has to walk through it.
I vaguely remember discovering that pass wall just doesn't work with temporary walls.

Re: The Stoneshaper (Wilder subclass)

Posted: Thu Sep 07, 2017 12:52 am
by astralInferno
Maybe because they're entities and not just terrain..? You can teleport onto them using the debug teleport and it doesn't telefrag them like it would enemies, but it does do weird things. (IIRC it said 'player turned back into floor' instead of 'stone wall turned back into floor')

Re: The Stoneshaper (Wilder subclass)

Posted: Thu Sep 07, 2017 5:28 am
by nsrr
I tried this class out a while back and had quite a bit of fun with it. I really like the idea, and it's themed really well.

So, I spent a little time considering some of the issues you're facing with the class, and I had a few ideas for solutions. It would have been kind of hard to explain, plus I was a little rusty, so I just went ahead and fiddled around a bit.

As for being able to pass summoned walls, it does seem that there's something in the engine that handles movement which doesn't recognize the can_pass and pass_wall values. So, we just have to work around the engine instead :D

I added a callbackOnMove to Rock Travel which basically checks to see if the tile you are trying to move onto is terrain. If it is, it then checks to see if it's summoned and you are its summoner. If so, you're force-moved onto the tile and an appropriate amount of turn energy (based on your move speed) is expended. Once you are on the tile, everything is hunky-dory and all of the synergies from being in a wall are activated.

Code: Select all

callbackOnMove = function(self, t, moved, force, ox, oy, x, y)
		if self:isTalentActive(self.T_ONION_STONE_HARMONY) and not force then
			local wall =, y, Map.TERRAIN)
			if wall and wall.summoner and wall.summoner == self then
				if self.can_pass.pass_wall and wall.can_pass.pass_wall and self.can_pass.pass_wall >= wall.can_pass.pass_wall then
					local speed = self:combatMovementSpeed(x, y)
					self:move(x, y, true)
					self:useEnergy(game.energy_to_act * speed)
Note, this should also work for any and all walls you summon. I tested it with Wrap of Stone and it worked just fine. (Did you know that the walls created by the Wrap don't cause you to lose air? They have no defined air_level. Weird, huh?)

As for One with the Stone not stopping suffocation once it has started... that's easy: we just make the talent clear the effect when you activate it:

Code: Select all

action = function(self, t)
		if self.is_suffocating and self:hasEffect(self.EFF_SUFFOCATING) then
			self.is_suffocating = nil
			self:removeEffect(self.EFF_SUFFOCATING, false, true)
		self:setEffect(self.EFF_ONION_ONE_WITH_STONE, t.getDuration(self, t), {power = t.getBonusArmour(self, t)})
		return true
Hope this is helpful. I'm fairly certain you won't have any problem with the adjusted code in OwtS, and I gave the callback in Rock Travel a fair bit of testing, but I certainly did not cover every wall-scenario and combination of wall-related talents out there. You might want to play around with it a bit before implementing it to make sure it's working as you intended.

Cheers :)

Re: The Stoneshaper (Wilder subclass)

Posted: Thu Sep 07, 2017 8:27 am
by Erenion
The 1.1.1 update (aka nsrr fixes all my bugs) is out!

- Fixed the suffocation and the wall-passing bug. Thanks, nsrr!
- Updated some talent descriptions.
- Added visual and sound to Empower the Stoneforge.
- Changed the way the attack-replacing is handled to make this addon compatible with others that do the same (Celestial Oddities, for example).

Re: The Stoneshaper (Wilder subclass)

Posted: Thu Sep 07, 2017 5:50 pm
by nsrr
Erenion wrote:Thanks, nsrr!
Hey, glad I could help :)

Modding ToME is probably my favorite hobby and I don't have much time for it any more, so I was glad for an excuse to do a little code wrangling.

Also, a minor thing I realized this morning: Rock Travel could probably stand to have one more check added to the callback. Everything inside the callback could be tucked inside an if statement such that it will not go through the rest of the checks when the actor is on the world map (i.e. if not then). It's not totally necessary, as it wouldn't be exploitable or break anything without it, it just helps to cut down on the resources the game is using, which tend to be higher on the world map.

Re: The Stoneshaper (Wilder subclass)

Posted: Fri Sep 08, 2017 12:12 am
by Jarinex
Nsrr you are awesome! I will definitely need to give this class a spin sometime.