You are speaking of technical correctness, im speaking about game balancing, given the engine at hand.
As for stacking same spells, thats the first thing all the fixpacks have been fixing from the beginning of time, from Baldurdash to G3fixpack. How is this now ok for regeneration. This is another thing to fix not to advertise. Besides, there is a difference between obviously exploiting the engine, like casting same spells on itself, cloudkilling unaware targets etc. And legit looking technique made possible through patches. And stacking regen will make chars easily unkillable with just a few buffs. 60hp/rnd regen. This doesnt look like an intended core behavior at all.
PS it doesnt matter how it is working in the engine, the result counts and module balancing. Saw Diablo II mentioned, just throwing some words here(absurdly broken): Manaburn, Souls lightning damage, FE mobs(lol).
Game-balancing is ideally a tweak. Obviously, sometimes the line is blurred because one can argue that a obvious bug that prevented things from being uber shouldn't be fixed.
As for regeneration, I wish to extend the facts we know about this by re-iterating what is stated in TobEx_ini.txt under 'Regeneration Fix', which applies to poison fix, disease fix, repeating eff fix, etc.
Fixes a bug with the regeneration opcode where a creature with multiple instances of disease, poison, wing buffet, regeneration and/or repeating effect opcodes would only have the highest frequency instance applied
Now, I give you an example of vanilla behaviour. Your character gets at time zero:
1. hit by a zombie - 1 damage per second for 60 sec
2. shot with a poison arrow - 1 damage every 2 sec for 40 sec
3. gets wing buffeted by a dragon - hard-coded to apply every 2/15ths of a second for 2 sec
4. You have an item equipped with regeneration of 1
HP every 6 sec.
What happens?
0-2 seconds: every 2/15ths of these two seconds, you get wing buffeted. Disease (58 sec left), poison (38 sec left), and regeneration (no expiry) do not apply.
3-61 seconds: you get 1 damage per second from disease (58 damage only, not 60). During this time poison expires (you never ever get poison damage). Regeneration (no expiry) does not apply.
62+ seconds: Only regeneration is left, you get 1HP every 6 sec.
Intended? I think not.
This is the stacking I am talking about: it is not just within effect, but between effect as well.
OK, comments as requested. First a meta-point: I continue to think that you might do better to continue distributing a .ini file (at least for some modifications) and just stopping supporting user modifications, rather than removing it entirely. (Maybe have various options set to 1 by default, i.e. unless the relevant line is included in the .ini. Maybe even put the file somewhere less immediately-visible, like in the ToBEx folder.) That way, if you break compatibility with some obscure mod, and the modder knows what they're doing, they can disable the relevant fix (at their own risk). And that way if someone absolutely hates something then they can write a "revert" mod. In many cases I'd rather go down that route than re-route something into Tweaks that really should be a fix. (You might also find that leaving a user-accessible .ini helps you with debugging.)
Fair idea. We must then though draw the line between what is likely to break compatibility and what is not, which adds another layer of complexity onto things. The way that I have approached TobEx is to be conservative as possible with maintaining vanilla compatibility, so ideally 'break compatibility with some obscure mod' should never happen. Leaving .ini options available to help with debugging sounds exactly like what the current incarnation of TobEx is - that means I have to be prepared support and debug 2^n combinations of code, where n is the number of configurable hacks. It is far easier for me to debug one group of code than to account for all combinations of activated/deactivated code.
The idea of putting fix/extension/debug as non-configurable, and moving tweak to a completely different mod makes things a lot simpler, because I can remove all that code that checks whether .ini stuff is enabled/disabled in the former, and therefore reduce the number of code execution pathways possible. Tweaks don't get that advantage, obviously.
Blindness fix: I'd leave this one for tweaks or third-party mods - erring on the side of caution.
Remember that the existing blindness opcode is bugged because of stacking of 10
THAC0 penalty. The question is: which one is 'the fix'? Is it correcting this stacking behaviour, or is it correcting the entire blindness fix opcode to match the spell description.
Allow 99 spells per level: am I right in thinking that the ToBEx component only allows the possibility of this happening, and the functionality is enabled by modifying the relevant 2DA file? If so, is it possible to leave it as an extension, so that mods can enable it by editing the 2DA file? (Or am I just confused?)
Yes, you are correct. We can have TobEx leave SPELLS.2DA alone.
Correct Experience Gain: in 2nd edition AD&D, the majority of characters have a 10% XP bonus due to having high statistics. Is it possible that's where Bioware is coming from?
I'm pretty sure they didn't code such a multiplier by mistake, either, so (in Fixpack terms) the current behavior is developer intent (irregardless of the source of that XP boost). Of course, the 'incorrect report' bit classifies as a fix IMHO.
Point taken.
PickpocketFailed Trigger: best left (if possible) as something third-party mods could enable. It's only relevant to someone who actually wants this behaviour in their mod.
Making it possible to bundle the PickPocketFailed change with mods wouldn't be unwelcome (but not necessarily having it enabled by default). That way I think I could retire tob_hacks from Rogue Rebalancing, for example.
The thing that errs me towards tweak is that it
replaces the Attacked() trigger that is sent in vanilla. Therefore, failed pickpockets may end up not provoking a hostile reaction in creatures with AttackedBy() -> Enemy() scripts. We can modify this to allow both triggers to be sent, thus maintaining vanilla behaviour, as a customisable thing.
Fix (after the crashing bug is solved, obviously): in Italian, 'Spell Immunity: Abjuration' is translated as 'Immunità agli Incantesimi: Scongiurazione', which is truncated to 'Immunità agli Incantesim...' in the tooltip, leaving you with no way to know which of the eight spells is SI:A (short of memorizing the icons).
I am more inclined to call this extension more than fix, although that is a moot point in itself, because I intend both fixes and extensions to be non-configurable. Anyway, it's not a crashing bug, just an assertion warning and a window redraw bug.
This sounds like the very definition of a flavour tweak to me. Since this isn't even relevant unless the player is using a mod where you start at level 1, the only effect of including this would be to have a non-configurable impact on Tutu/BGT/CA/etc games, whether the player wanted it or not.
Point taken. So we would like to TCs a choice as to whether enforce custom proficiency restrictions at level one.
Now with expanded stats, it might be possible to define non-cumulative stats externally in .2da tables, and discard the whole "non-cumulative effect ID" idea I was toying around with. These stats would be accessed via the new stat change opcode.
If I had to choose between this and the ID idea, I'd stick with the ID idea. The reason being that the former globally modifies the stat, whereas with IDs you can configure stackability at the effect-level, as opposed to the stat-level.
Animation Attack Sounds: tweak
This is almost certainly a fix, as the mbam.2da files have referenced sounds that never fire, or fire inappropriately, due to some sort of math-related bug in the engine. (Now a mod that adds more sounds to the 2da files to take advantage of this fix would be a tweak.)
Clarification here, Animation Sound Fix fixes the math error. Enable Animation Attack Sounds enable ATTACK_SLASH/BACKSLASH/JAB. Let's have an example (MDEM.2DA):
SOUND
ATTACK demo01 demo01a demo01b
ATTACK 2 0 0
...
ATTACK_SLASH demo03 nosound
ATTACK_SLASH 2 0
ATTACK_BACKSLASH demo04 nosound
ATTACK_BACKSLASH 2 0
ATTACK_JAB demo05 nosound
ATTACK_JAB 2 0
...
Vanilla: ATTACK_SLASH/BACKSLASH/JAB never play on attack. Only demo01 or demo01b will play.
Animation Sound Fix: ATTACK_SLASH/BACKSLASH/JAB never play on attack. One of demo01, demo01a, or demo01b will play.
Add Enable Animation Attack Sounds: ATTACK_SLASH/BACKSLASH/JAB play depending on slash/backslash/jab. One of demo01, demo01a, or demo01b will
also play.
Edited by Ascension64, 03 February 2011 - 12:45 AM.