Spellsword (formerly Addon reworking Arcane Blade Class)

A place to post your add ons and ideas for them

Moderator: Moderator

Message
Author
Dracos
Archmage
Posts: 405
Joined: Sun Jul 13, 2014 4:09 pm

Re: Spellsword (formerly Addon reworking Arcane Blade Class)

#211 Post by Dracos »

Is this 1.4 friendly? *will prolly do another run anyway and find out*
ToME Tips - auto-generated spoilers for ToME. - someone else made. I find super awesome, so spreading as well.

Dracos
Archmage
Posts: 405
Joined: Sun Jul 13, 2014 4:09 pm

Re: Spellsword (formerly Addon reworking Arcane Blade Class)

#212 Post by Dracos »

Think there is a minor bad chunk of lua somewhere. I've gotten through the whole game, but I do sometimes see a:
Lua Error: attempt to call a nil value
At [C]:-1

And a friend tried it recently and mentioned he suddenly got that on char creation after turning this on. Possibly another addon, but at least two pointers toward this one.
ToME Tips - auto-generated spoilers for ToME. - someone else made. I find super awesome, so spreading as well.

Hirumakai
Thalore
Posts: 192
Joined: Wed Aug 11, 2010 2:39 pm

Re: Spellsword (formerly Addon reworking Arcane Blade Class)

#213 Post by Hirumakai »

I'm not sure about the bugs people are seeing with the old 1.3.3 version. Given Darkgod has moved onto 1.5.3 in the time I've been neglecting this addon, I'm going to simply say if people still are interested in this addon, try the 1.5.3 compatible version I just uploaded. :D

I've just done a straight forward compatibility update. No balance changes or other tweaks. I still need to sit down and play with some more classes in 1.5 to get a feel for how things have changed in the last year or so. Hopefully I didn't introduce any bugs in when updating it, but feel free to let me know in this thread if you run into any.

Jarinex
Higher
Posts: 79
Joined: Sun Aug 23, 2015 5:49 pm

Re: Spellsword (formerly Addon reworking Arcane Blade Class)

#214 Post by Jarinex »

I haven't had a chance to try out the addon, but I do appreciate your continued support for it :)

Hirumakai
Thalore
Posts: 192
Joined: Wed Aug 11, 2010 2:39 pm

Re: Spellsword (formerly Addon reworking Arcane Blade Class)

#215 Post by Hirumakai »

Thanks for the comment.

So I've been re-reading the last few pages of this thread, trying to figure out where I left off.

Things I'm getting are:
1) I tend to play all-element style, grabbing all the strikes. Other players do not necessarily.
2) People note mana generation may not be up for sustaining a mono or dual-elemental build using the closed spell trees.
3) The trees that needed the most work were the 2 generic trees. People seemed more or less happy with the class tree options and selection.

Comparing to some other classes, I've noticed some things:
1) Feather Wind is now doing a lot, not only providing 15% fatigue reduction, but 100% pinning resistance, over 50% stunning resistance, plus ranged defense, some trap immunity and movement speed. Oh and its original purpose of increasing carrying capacity is still in there somewhere...
2) Stone skin not only provides armor, but a cooldown reduction effect (possibly quite powerful on Stone Wall).
3) Automated Cloak Tessellation provides flat damage reduction against all types of effect, plus a flat chance to do something not unlike Master Deflection all the time.

Which makes me think Arcane Armor needs a rework.

At 5/5 Arcane armor currently is:
-15% fatigue
up to 24 armor (depends on worm armor, helps massive armor the most)

So one option I'm thinking of is turning the armor portion of Arcane Armor into a flat reduction against everything like Automated Cloak Tessellation, decouple it from worn armor (to allow people to go light armor if they so choose), and have some small fraction of the absorbed damage be converted to mana. Something like at 5/5 and level 50 stats, reducing all damage by 25 and generating something like 0.1 mana per point of damage absorbed in this way. (Each independent hit/proc effectively producing up to 2.5 mana late game). It would retain its fatigue reducing effects as well.

Similarly, looking at Mana Focus, which at 5/5 currently is:
0.83 mana/turn
2.0 mana returned on melee hit

Comparing against the Arcane Blade and Shadowblade equivalent talents which are:
0.89 mana/turn
Physical/Spell Crit +14%
or
1.41 mana/turn
13.7% attack/spell speed

It seems to be a bit lack luster. The other two seem to be trying to increase overall damage per turn by 7-15% (depending on crit mod - possibly more). +2 to +4 mana per turn while in melee hitting stuff doesn't quite feel the same, especially for a 5/5 generic investment. Given the class is in the Mage category these days, it starts with 0.5 mana generation, unlike the Arcane Blade and Shadowblade, so even the mana/turn isn't as crucial. I'm tempted to remove the mana/turn and just make the mana on hit be very large, and possibly doubled for two-handed weapons, to even it out with dual-wielding. Something like at 5/5, 10 mana per melee hit dual wielding, 20 with a two-hander, and 15 with a weapon and shield. So if you're in the thick of combat, its more, but if you're hiding around a corner not really anything.

So you do lose out on the bonus mana from mana surge. At high level, say 1300% every 25 turns, which is 10.79 for 10 turns out of every 25. 107.9/25 or about 4.36 extra per turn. This would increase mana for dual-wielding by 16 mana per turn, every turn that you are swinging those weapons. Lets say in combat that is every other turn, for about 8 extra mana/turn average.

Both changes combined results in a class which generates more resources when actively in the thick of things at the expense of when running away or hiding, which I think may be a good thing.

I still also want to consider some changes to the other generic talents but this is what I've got so far for ideas. Comments and suggestions welcome.

Chronosplit
Archmage
Posts: 318
Joined: Fri Oct 09, 2015 2:27 pm

Re: Spellsword (formerly Addon reworking Arcane Blade Class)

#216 Post by Chronosplit »

I tend to play all-element style, grabbing all the strikes. Other players do not necessarily
Guilty. Unless I'm playing Ogre, usually Fire in particular doesn't get much from me due to the two-hand focus. Then I just have a one-hand/Dagger and on another set one-hand/Shield. Sometimes I'll pick up swift hands, sometimes not (depends partially on charm availability). This is unless I find a really good two-hander early, in which Air doesn't get much.

With Ogre I just use a two-hander in both sets and focus all elements.

Hirumakai
Thalore
Posts: 192
Joined: Wed Aug 11, 2010 2:39 pm

Re: Spellsword (formerly Addon reworking Arcane Blade Class)

#217 Post by Hirumakai »

In the interest of improving the resource tree, Arcane Veteran I've pushed the changes I was considering earlier.

Mana Focus now returns 2/4/6/8/10 mana per hit, doubled when wielding two-handed weapons, and x1.5 when wielding a shield.

Arcane Armor still reduces fatigue by 3/6/9/12/15, but now reduces damage by a flat amount, using the same scaling as Automated Cloak Tessellation (from the Avoidance tree). It also returns between 5% and 11% of the damage reduced as mana. So at 5/5, and if you take 100 damage, and its reduced by 20 damage to 80, then you'll get back 20*0.11 = 2.2 mana.

We'll see if these need to be tuned down later. Although if you've spent 10 of your 40-50ish generic points(depending on race) on mana regen, you probably deserve not to have mana problems.

Hirumakai
Thalore
Posts: 192
Joined: Wed Aug 11, 2010 2:39 pm

Re: Spellsword (formerly Addon reworking Arcane Blade Class)

#218 Post by Hirumakai »

So I have been playing around with the class after the Arcane Veteran tree changes, and I think I like the change. It may still need some numerical tweaks but it feels like it rewards getting into the thick of things.

However, at low levels I'm finding there isn't much to spend mana on. So I've been doing some counting of open and closed talent trees on the classes and I'm noticing more recent class reworks tend to have more talent trees and more talent trees open. Also hybrid classes tend to have even more than that.

For example, Archer starts with 9 open trees, and 14 trees total. Rogue starts with 10 open trees and 15 total. Arcane blade starts with 11 trees open and 17 total, while Shadowblade starts with a whopping 12 open and 16 total.

Spellsword starts with a more modest 8 open trees and 15 total. Some classes which are older have less than this. For example Berserkers and Bulwarks begin with 7 open trees and 13 total. Or the poor Cursed who starts with 6 open trees and 10 total.

Anyways, what I'm considering is increasing the number of open trees. The easiest way to do so would be to simply have the class start with an additional category point, allowing you to open a single magic tree (Fire, Air, Earth or Water) or the Combat Techniques tree (for Rush) which provides a way to deal with ranged enemies as well as possibly spending mana.

Now the category point could also be used to open the Survival Tree, increase a category multiplier, or even buy an additional rune slot. Maybe that is okay. Alternatively, I could try to figure out how to get a dialog box to open at level 1 which asks the player what they'd like to specialize in, allowing only one of those category to be opened instead of giving complete freedom.

This would put the class at 9 open and 15 total categories (when compared to say, Archmage's 9 open categories and 17 total). It would certainly give those people who want to try playing a single or dual element build an easier start by allowing access to the magic tree at 1st.

Dracos
Archmage
Posts: 405
Joined: Sun Jul 13, 2014 4:09 pm

Re: Spellsword (formerly Addon reworking Arcane Blade Class)

#219 Post by Dracos »

Sounds good.
ToME Tips - auto-generated spoilers for ToME. - someone else made. I find super awesome, so spreading as well.

Hirumakai
Thalore
Posts: 192
Joined: Wed Aug 11, 2010 2:39 pm

Re: Spellsword (formerly Addon reworking Arcane Blade Class)

#220 Post by Hirumakai »

So I pushed the addon with an extra talent category point at birth. We'll see how it does. Trying setup a pop-up window just felt really clunky, especially when starting with different modes.

Dracos
Archmage
Posts: 405
Joined: Sun Jul 13, 2014 4:09 pm

Re: Spellsword (formerly Addon reworking Arcane Blade Class)

#221 Post by Dracos »

In 1.6 (and onward) this breaks Elemental Woes/Surge (which is sad since that has good synergy here).

The problem is in the superload of actor.lua:

Code: Select all

function _M:act()
	if not engine.Actor.act(self) then return end

	self.changed = true
	self.turn_procs = {}

	-- Break some sustains if certain resources are too low
	-- Note: force_talent_ignore_ressources has no effect here
	-- consider replacing the minimum resource value of 1 with a number based on the talent and resource
	for tid, p in pairs(self.sustain_talents) do
		local deact, t = false, self.talents_def[tid]
		-- check each possible resource the talent uses
		for res, res_def in ipairs(_M.resources_def) do
			if (t.remove_on_zero == nil and res_def.depleted_unsustain) or (t.remove_on_zero ~= nil and util.getval(t.remove_on_zero, self, t)) then
				if t[res_def.sustain_prop] then
					if res == self.RS_STAMINA and (self:hasEffect(self.EFF_ADRENALINE_SURGE) or self:hasEffect(self.EFF_MARTIAL_MAGIC)) then
					elseif res == self.RS_MANA and self:hasEffect(self.EFF_MARTIAL_MAGIC) then 
					else
						if res_def.invert_values then
							if self[res_def.maxname] and (self[res_def.maxname] - self[res_def.short_name]) < 1 then
								deact = true break
							end
						else
							if self[res_def.minname] and (self[res_def.short_name] - self[res_def.minname]) < 1 then
								deact = true break
							end
						end
					end
				end
			end
		end
		if deact then self:forceUseTalent(tid, {ignore_energy=true}) end
	end
	
	-- clear grappling
	if self:hasEffect(self.EFF_GRAPPLING) and self.stamina < 1 and not self:hasEffect(self.EFF_ADRENALINE_SURGE) then
		self:removeEffect(self.EFF_GRAPPLING)
	end

	-- disable spell sustains
	if self:attr("spell_failure") then
		for tid, _ in pairs(self.sustain_talents) do
			local t = self:getTalentFromId(tid)
			if t.is_spell and rng.percent(self:attr("spell_failure")/10)then
				self:forceUseTalent(tid, {ignore_energy=true})
				if not silent then game.logSeen(self, "%s has been disrupted by #ORCHID#anti-magic forces#LAST#!", t.name) end
			end
		end
	end

	if self:attr("paralyzed") then
		self.paralyzed_counter = (self.paralyzed_counter or 0) + (self:attr("stun_immune") or 0) * 100
		if self.paralyzed_counter < 100 then
			self.energy.value = 0
		else
			-- We are saved for this turn
			self.paralyzed_counter = self.paralyzed_counter - 100
			game.logSeen(self, "%s temporarily fights the paralyzation.", self.name:capitalize())
		end
	end
	if self:attr("stoned") then self.energy.value = 0 end
	if self:attr("dont_act") then self.energy.value = 0 end
	if self:attr("time_stun") then self.energy.value = 0 end
	if self:attr("time_prison") then self.energy.value = 0 end

	-- Regain natural balance?
	local equilibrium_level = game.level.map:checkEntity(self.x, self.y, Map.TERRAIN, "equilibrium_level")
	if equilibrium_level then self:incEquilibrium(equilibrium_level) end

	-- Do stuff to things standing in the fire
	game.level.map:checkEntity(self.x, self.y, Map.TERRAIN, "on_stand", self)

	-- Still enough energy to act ?
	if self.energy.value < game.energy_to_act then return false end

	-- Still not dead ?
	if self.dead then return false end

	-- Register life for this turn
	self.old_life = self.life

	-- Ok reset the seen cache
	self:resetCanSeeCache()

	if self.on_act then self:on_act() end

	if self:attr("never_act") then return false end

	if not game.zone.wilderness and not self:attr("confused") and not self:attr("terrified") then self:automaticTalents() end

	-- Compute bonuses based on actors in FOV
	if self:knowTalent(self.T_MILITANT_MIND) and not self:hasEffect(self.EFF_MILITANT_MIND) then
		local nb_foes = 0
		local act
		for i = 1, #self.fov.actors_dist do
			act = self.fov.actors_dist[i]
			if act and self:reactionToward(act) < 0 and self:canSee(act) then nb_foes = nb_foes + 1 end
		end
		if nb_foes > 1 then
			nb_foes = math.min(nb_foes, 5)
			self:setEffect(self.EFF_MILITANT_MIND, 4, {power=self:getTalentLevel(self.T_MILITANT_MIND) * nb_foes * 1.5})
		end
	end

	-- Beckon (chance to move actor and consume energy)
	if self:hasEffect(self.EFF_BECKONED) then
		self.tempeffect_def[self.EFF_BECKONED].do_act(self, self:hasEffect(self.EFF_BECKONED))
	end
	-- Paranoid (chance to attack anyone nearby)
	if self:hasEffect(self.EFF_PARANOID) then
		self.tempeffect_def[self.EFF_PARANOID].do_act(self, self:hasEffect(self.EFF_PARANOID))
	end
	-- Panicked (chance to run away)
	if self:hasEffect(self.EFF_PANICKED) then
		self.tempeffect_def[self.EFF_PANICKED].do_act(self, self:hasEffect(self.EFF_PANICKED))
	end

	self:fireTalentCheck("callbackOnAct")

	-- Still enough energy to act ?
	if self.energy.value < game.energy_to_act then return false end

	if self.sound_random and rng.chance(self.sound_random_chance or 15) then game:playSoundNear(self, self.sound_random) end

	-- Cauterize ?
	if self:hasEffect(self.EFF_CAUTERIZE) then
		local eff = self:hasEffect(self.EFF_CAUTERIZE)
		if eff.invulnerable then eff.invulnerable = nil end
	end

	return true
end
I had the same problem in autorest reload, so I can at least pass along what the probable fix is (or at least something really close, not testing deeply at the second). Basically the function isn't very friendly to copy function/add. That said you're only seeming to just want to add a force unsustain on top of usual act behavior, so checking it twice shouldn't be a problem.

Code: Select all

-- store the original act function
-- store the original act function
local act = _M.act
function _M:act()
   local ret = act(self)

   -- Break some sustains if certain resources are too low
   -- Note: force_talent_ignore_ressources has no effect here
   -- consider replacing the minimum resource value of 1 with a number based on the talent and resource
   for tid, p in pairs(self.sustain_talents) do
      local deact, t = false, self.talents_def[tid]
      -- check each possible resource the talent uses
      for res, res_def in ipairs(_M.resources_def) do
         if (t.remove_on_zero == nil and res_def.depleted_unsustain) or (t.remove_on_zero ~= nil and util.getval(t.remove_on_zero, self, t)) then
            if t[res_def.sustain_prop] then
               if res == self.RS_STAMINA and (self:hasEffect(self.EFF_ADRENALINE_SURGE) or self:hasEffect(self.EFF_MARTIAL_MAGIC)) then
               elseif res == self.RS_MANA and self:hasEffect(self.EFF_MARTIAL_MAGIC) then
               else
                  if res_def.invert_values then
                     if self[res_def.maxname] and (self[res_def.maxname] - self[res_def.short_name]) < 1 then
                        deact = true break
                     end
                  else
                     if self[res_def.minname] and (self[res_def.short_name] - self[res_def.minname]) < 1 then
                        deact = true break
                     end
                  end
               end
            end
         end
      end
      if deact then self:forceUseTalent(tid, {ignore_energy=true}) end
   end
   return ret
end
ToME Tips - auto-generated spoilers for ToME. - someone else made. I find super awesome, so spreading as well.

nsrr
Sher'Tul
Posts: 1126
Joined: Mon Sep 21, 2015 8:45 pm
Location: Middle of Nowhere

Re: Spellsword (formerly Addon reworking Arcane Blade Class)

#222 Post by nsrr »

Not digging in at the moment, but at a glance this should be able to be done just as effectively and much more cleanly with a simple callbackOnAct in the relevant talent. Check if the talent is active > check the resource > force use the talent if the resource is too low.

Post Reply