AndakRainor wrote:minmay wrote:- Might doesn't really work right, the stat bonuses should be applied in the condition's onRecomputeStats with Champion:addStatModifier(), instead of trying to use Champion:setBaseStat().
Why not, but is it really safe to read the current stat inside the onRecomputeStats function? Or do you have another idea in mind to get the stat value?
You would read getCurrentStat() upon casting the spell, as now, then store that value and read it in the onRecomputeStats hook. getCurrentStat() should indeed be avoided inside onRecomputeStats, I should have been more precise.
Using setBaseStat() for temporary buffs is bad for a few reasons.
1. It makes it difficult for modders to retrieve the champion's
real base stat
2. Think about what happens when you cast might, save, then import the party from that save into a new game - the party's stats are permanently doubled in the process
AndakRainor wrote:minmay wrote:- handling for not meeting energy costs (e.g. reduced cost of disrupt) is really bad. It should act the same as not meeting the energy cost in the builtin spell system. Consider changing it from "energy cost is reduced by X" to "X energy is refunded after casting" which would not suffer the same problem.
That is what I had for those spells in a previous version of the pack. I was not happy with it... So, the only thing I can imagine is different from the builtin spells is about PartyComponent.onCastSpell triggering hooks for non paid spells, is that the problem? (every thing else has builtin similar behavior I think). If so, a solution could also be to report the test to the main onCastSpell hook of spells_functions.lua
No, the problem is that instead of the "not enough energy" indicator appearing in the spell panel and inflicting a 1 second cooldown - the behaviour that
should happen when you try to cast a spell without enough energy - you just have an hudPrint. I do not think there is a clean way to reproduce the builtin out of energy behaviour which is why I suggest using a refund instead to avoid that problem. It's ugly, but...it's
less ugly, you know? Maybe energy discounts just aren't worth it...
AndakRainor wrote:minmay wrote:- discharge should be removed since it can break so many puzzles by killing normally-unreachable monsters
Is there really such puzzles in the mod? Is this good puzzle design?
There are plenty of badly designed puzzles in the mod. If you want to try to get the authors to make well-designed replacements for all of them, be my guest. As for puzzles/challenges broken specifically by discharge, I can't think of any immediately but I don't think I can verify that there are none, and in any case discharge is a terribly-designed spell so surely it should be removed anyway! I mean, truth be told, I'm fine with including effects that can reach normally-unreachable places, it's not going to be any more degenerate than the standard poison_cloud spell going through grates, I just want to get rid of discharge because it's an embarrassment.
AndakRainor wrote:minmay wrote:- air/earth/fire/water enchantment are, frankly, really obtuse and also overpowered. Should be removed.
Okay, would a nerf and some notes in the dungeon about their effects change your mind?
No.
AndakRainor wrote:minmay wrote:- like Discharge, zone effects can be used to affect monsters that are supposed to be unreachable. Not sure how to fix this without doing some fairly complex pathfinding. Unlike discharge I think the ranges are short enough that they don't currently break any rooms, though.
Do you have examples of such rooms that I could test?
Like I said, I don't think they break any rooms at the moment... but here is an easy theoretical example of a monster that is supposed to be unreachable:
Code: Select all
P = party
M = monster
. = pit
X = wall
XXXXX
X..PX
X...X
XM..X
XXXXX
Here the party cannot damage the monster with anything in the base game, but they can with Discharge or zone effects.
AndakRainor wrote:minmay wrote:- zone effects also use the wrong geometry to compute whether a tile is within their radius, remember that while Grimrock's space is visually Euclidean, it is functionally Taxicab for the most part (gravity-affected projectiles are an exception, not the norm)
I think you refer to my use of tiles coordinates on non 3 meters module height maps? I should correct that, sure!
No, I'm referring to how the big nested for loop in zoneEffects() determines whether a tile is within range or not. In Taxicab geometry, which is what Grimrock uses for all player and monster movement, these are the squares the party can reach in 5 or fewer moves, i.e. a Taxicab "circle" with radius 5.5:
Code: Select all
.....X.....
....XXX....
...XXXXX...
..XXXXXXX..
.XXXXXXXXX.
XXXXXPXXXXX
.XXXXXXXXX.
..XXXXXXX..
...XXXXX...
....XXX....
.....X.....
But your code produces this pattern for a zone effect with a range of 5, which is an aliased
Euclidean circle with a radius of 5.5:
Code: Select all
.....X.....
..XXXXXXX..
.XXXXXXXXX.
.XXXXXXXXX.
.XXXXXXXXX.
XXXXXPXXXXX
.XXXXXXXXX.
.XXXXXXXXX.
.XXXXXXXXX.
..XXXXXXX..
.....X.....
Instead of comparing x^2+y^2 to range^2 (Euclidean distance) you should compare x+y to range (Taxicab distance). If you were primarily making a visual effect then checking the Euclidean distance would make sense because the world space is Euclidean, but the space that the party and monsters move, attack, and do damage in is Taxicab with very few exceptions.
Making zone effects care about module height would make this problem
worse, not better; module height is almost exclusively visual (only GravityComponent and LadderComponent change for gameplay purposes, even monsters change elevation at the same speed regardless of module height).
AndakRainor wrote:minmay wrote:- ice shards should be reverted to the builtin targeting rules like the other burst spells (custom damage rules is fine). You don't actually have to check the ground in front of the party because IceShardsComponent does that automatically; see my recreation of the spell.
Okay, I totally missed this component functionalities when I reproduced the behavior. I can remove it, but from what I tested so far, I managed to get the same behavior as the builtin ice shards. If I remove it, I suppose the ice shards component can be used for other ground attack spells too?
Actually your ice shards recreation is busted in several ways which is why I suggested copying mine.
1. It's instant, unlike the builtin version
2. It creates one ice_shards object on the first tile, 2 on the second tile, 3 on the 3rd tile, 4 on the 4th tile, 5 of the 5th tile.... because IceShardsComponent itself creates more ice_shards objects in a line until its range runs out.
3. If checkGroundLine() encounters an obstacle with a "health" component it stops, builtin spells do not.
AndakRainor wrote:minmay wrote:- your poison cloud implementation doesn't merge CloudSpellComponents like the builtin one, this is important because yours allows stacking a large number of poison clouds. Cloud merging is nontrivial to recreate and you will pretty much have to reimplement CloudSpellComponent with TileDamagerComponent and TimerComponent (to decay the attack power). I think that with rock fall added, earth magic doesn't need poison cloud anyway so it is likely better to remove it.
I never knew this even existed. Is there really a potential FPS problem with stacking clouds? What does the engine do about it, are you talking about merging objects? Because components merging does not make sens to me, unless you talk about components from multiple objects. I did not know the game deleted those objects to protect its framerate in the first place. Is there a plausible scenario in which a player would stack TOO MUCH clouds? (Removing one of the original spells is a bit excessive, isn't it?)
When you cast poison cloud, if there is already a poison cloud on the targeted tile, instead of creating a new cloud the existing cloud gets its duration and attack power set to the maxima of its current duration/power and the new cloud's, and its damage interval set to the minimum of its current damage interval and the new cloud's. Every time CloudSpellComponent's damage interval passes it damages its tile and multiplies its attack power by 0.9 (you might have noticed that non-fresh poison clouds do very little damage).
The merging is not just for framerate purposes; stacked poison clouds would do a ton of damage very fast.
But after looking at it again I
think the CloudSpellComponent methods available in the user scripting interface should be sufficient to reproduce poison cloud merging.
AndakRainor wrote:minmay wrote:- I know you had good intentions by removing the firebeam tracer, but you misunderstand its purpose. The tracer is required for the spell to work properly on heightmapped levels; by removing the tracer you have allowed the spell to pass through the ground. (I will fix this next time I get the file).
I left it quoted after testing some spells behaviors with non-integer elevation casting. I stopped working on it when you told me you had a new version of the spell.
No problem, I'll just put the new version in next time I edit the mod.
AndakRainor wrote:minmay wrote:- I still massively disagree with your hailstorm buff against freezing immune targets. If water magic actually gets better against cold immune targets, then what's the point of cold immunity even existing?
Well, first "frozen" immune targets and "cold" damage type immune targets are not the same. Water spells crowd control may be very powerful, but they are always disabled against bosses in all games since the dawn of humanity (don't come with an odd case!). The idea is to give water school some damage when its crowd control is negated. Its cold damage will still be reduced by monsters' resistance. And monsters not immune to its crowd control will still require using the low damage crowd control spells to build a "shatter" effect. May be another spell should do it but not hailstorm, but I think it should be a water spell (or a multi schools spell with water). Also, perhaps this spell should remove the frozen condition on hit, so a storm type spell is not ideal.
Cold immunity implies frozen immunity. Unless you are saying that the spell should only do extra damage against monsters that explicitly have frozen listed as an immunity? That sounds very bad, because there is no way for a player to know if a cold immune monster has frozen immunity specifically listed or not. For example ice guardians and summon stones do not have the explicit immunity but because they have cold absorb/immune they cannot be frozen. Whereas air elementals have explicit frozen immunity despite already having implicit frozen immunity from being cold immune (admittedly they are also physical immune so hailstorm won't affect them either way, but I think you get the point). Because the damage is half physical and half cold, a cold immune, frozen immune monster still takes 50% more damage from a hailstorm than a non-cold-immune, non-frozen-immune monster.
If the damage were pure cold it would be more reasonable but I still don't like the way it takes away water magic's biggest disadvantage.
AndakRainor wrote:minmay wrote:- I do not think spells should give haste, rage, or resurrection - those are supposed to be limited resources and haste is extremely powerful.
I thought rage was the best effect (when stacked)? I don't mind removing haste from wind_rider though, now that it as the air cushion effect. Do you want to remove all buff spells? Also spells are supposed to be powerful, just not too much compared to non-casters champions. Before removing a spell or effect, you can always try to reduce its power.
I am a little bothered by buff spells in general but Shield only applies to the champion that casts it and elemental shields are not duplicated by potions. Haste and resurrection are big high-level potions so making spells that duplicate their effects really rubs me the wrong way. And while stacked rage is ridiculous a single speed potion is much better than a single rage potion.
AndakRainor wrote:minmay wrote:- Spells should be learned as soon as the scroll is obtained, instead of making players carry the scroll the first time they cast it. At the very least, use PartyComponent:isCarrying() to determine whether the party has the scroll, instead of making you put it in a specific champion's inventory and remove it from containers. Alternatively, it's easy to change my spellbook to automatically record new spells as the scrolls are picked up.
I totally missed this function! But reading a spell scroll from inside a bag or other champions' pockets is not easy =D
A new way to learn spells is really welcome! Making scroll usable and/or using your spellbook + using PartyComponent:isCarrying() should be nice features. Also, I never had any answer about the spell restriction feature. Perhaps nobody wants it in the first place?
I don't really care whether the spell restriction is present or not. I just want the interface to be pleasant. If you don't object to implementing the spellbook thing I'll just do it the next time I claim the file (seeing a pattern here yet?)
AndakRainor wrote:minmay wrote:1. Get rid of most of the "palette swap" spells - only have a rune trap for one element, only have a meteor storm for one element, probably just get rid of frostburst (ice shards is a much more unique spell, and there's already frostbolt for freezing things), and there's no need for the combined storms or combined shields.
Again depending on allowing import party or not, palette swap is mainly there to neuter the "bad skill choice! no luck!" effect I found awful with Isle of Nex spells that led me to making this pack. Not sure if you will agree, but I see it that way; earth magic was the bad choice trap for uninformed players, as much boring with so few spells as weak compared to real end game magic schools like fire, fire or fire. (Air and Water are debatable, but not for their damage). that must be why so many people here have posted custom spells frequently for the earth magic school. I don't think a game with a leveling system that simple and character customization that limited should have a few good builds and all the rest is garbage. So, the goal was a least one new spell each time the player levels up, and yes similar spells, not very exiting but efficient from a player perspective I think.
But making all the spell schools the
same is even worse than making them unbalanced - there's no point in having both fire and air magic in the game if they play the same way. I also don't know where this myth about earth magic comes from, poison bolt is cheaper than fireball and lightning bolt and is generally more powerful. But even if earth is so bad, you can correct that by giving it unique spells. You could give earth the only trap rune, or the only resurrection spell, or the only cure wounds spell, or the only healing spell, and the same for the other schools.
AndakRainor wrote:minmay wrote:1.5. Alternatively, have just a single "Bolt Storm" spell that includes bolts from the elemental schools you have. So if you only have fire magic 4, it acts like meteor storm, and if you only have air magic 4, it acts like thunder storm, and if you have fire,air,earth,water 4, it acts like elemental storm. Do the same thing for elemental shielding. This reduces 30 overly similar spells to 2 spells.
Why not, but again, learning a new spell when you level up, to me is not the same as your old spell gaining +20% damage. I understand it may be unnatural to you to see it that way, after all learning a new spell from a new scroll that just does 20% more damage than your old spell is in fine the same thing as a passive stat boost, but I believe it is more enjoyable for the average player.
The BIG BIG BIG advantage of elemental storm is not the pretty colors or even damage type considerations, but the fact that it requires 2 skill points in each elemental school, for a total of 8 skill points, while meteor storm requires 5 fire magic + 3 concentraion (was air magic in the builtin version) for the same total. So the player who wanted to play an elementalist and thought it was a good idea will not be punished by the game and be left with only burst and ice shards spells, no projectile spell, at the same level an informed player gets meteor storm.
Oops, I see now that I completely misread the multi-element storm definitions, for some reason I thought that the two-element storms produced 2x the bolts of the single-element ones, etc.
So the merged elemental storm should actually look something like this:
Code: Select all
{
name = "elemental_storm",
uiName = "Elemental Storm",
requirements = {"concentration", 3},
gesture = 1478963,
manaCost = 69,
description = "Unleashes a devastating storm of all elemental bolt spells that you are able to cast.\n- Cost : 69 energy\nPower : 30 per fireball, 27 per lightning bolt, 15 per frostbolt, 15 per poison bolt",
onCast = function(champion, x, y, direction, elevation, skillLevel)
local skillMissiles = {
fire_magic={"fireball_large_cast"},
air_magic={"lightning_bolt_greater_cast"},
water_magic={"frostbolt_cast"},
earth_magic={"poison_bolt_greater_cast"},
}
local ord = champion:getOrdinal()
for skill,missile in pairs(skillMissiles) do
if champion:getSkillLevel(skill) >= 3 then
local power = spells_functions.script.getPower(2.5, champion, skill)
spells_functions.script.missiles(power, missile, ord)
end
end
local power = spells_functions.script.getPower(2.5, champion, "fire_magic", "air_magic", "water_magic", "earth_magic")
spells_functions.script.stopInvisibility()
end
},
(add something to prevent it being cast if you have no elemental skills >= 3 at all, or you could add arcane bolts? Also the real implementation should obviously not cast 2+ bolts on the same frame, this is just for demonstrative purposes)
This doesn't particularly reward or punish specializing, you could even reduce the skill level requirement to 2.
However, your argument works directly
against the way you implemented the multi-shield spells. Currently you can get fire shield for 6 skill points, or you can get elemental shield for 4 skill points! Surely merging them is the right way to go if different skill point distributions are supposed to be similarly powerful.
Also I'm not going to change any of your stuff without your permission. Sorry if I gave that impression.
aaneton wrote:can my Ogre in Hall of queens cellar be killed without opening the portcullis with your spells (it won't break the game but there would he would be talking from "his grave" if dead when opening it/walkng by it). I have no idea if this is possible (I assume area spells do not bypass doors but as said I haven't looked into your spells, so I don't know).
Bad news: it was already possible before any new spells were added, because builtin poison cloud can be cast through sparse doors for some reason.