Community Patch 1.72 Beta 9 Released
download
To install it, follow as in 1.71 manual installation. Simply unpack the archive into folder with NWN files (thus if you do this right it will want to overwrite bunch of files which you have to confirm). The 1.72 is international, works for all languages as there are no changes in dialog.tlk file yet.
To uninstall it, either run 1.69 critical rebuild, 1.71 installation, or manually delete/rename the xp2patch.key file and rename the xp2patch171.key which is included in the 1.72 beta distribution.
Beta9 contains new auto 2DA merged, called 2dilate from leo_x. It has so many advantages over previous tool. The output is readable so there is no longer need to re-save the merged 2das with some 2da editor, also its reliable and it even allows user to select what he wants to merge and what not (in a limited extend controlled by 2da merging schemas that I prepared). You can find it in 1.72 builders resources.
Just one warning, this release changelog is huuge wall of text which most of it is understandable only by builders. However feel free to ask for details on anything I wrote. The changelog has limited space so it can't contain all details and factors around.
Neverwinter Nights Community Patch 1.72 beta 9 content:
Fixed broken stuff from previous Patch versions:
- Barbarian rage and Mighty rage abilities: fixed selfstacking of the ac penalty + any possible custom effects applied via epicrages that might stack
- Cure light wounds: due to the typo actually healed 3d8 hitpoints more
- Sunburst: added missing kill feedback in case spell killed vampire
- Undeath to death: added missing kill feedback
- fixed quite a critical bug in spellsIsLightVulnerable function which was always true; this caused Sunbeam to always do 6d6 damage instead of 3d6 and allowed Sunburst to kill any undead not just vampires
- readded fix for associates able to speak while they shouldn't be, that somehow didn't get added although it has been announced in beta5
- Greater Sanctuary, Melf's Acid Arrow, Tenser's Transformation, Bigby's Clenched Fist and Bigby's Crushing Fist: fixed some of the declarations of caster level to account for spell overrides
- fixed bug where creature in darkness couldn't use gaze abilities even if she had ultravision/trueseeing
- fixed bug where creature in darkness was considered immune to the gaze effects, even if she had ultravision/trueseeing
- fixed two tiles from beta8 that threw SQRT Domain error when placing
Revisited features from previous Patch versions:
- edit comments in the various scripts has been improved so its easier to see what was changed in 1.72 over 1.71
- Delayed Blast Fireball and Glyph of Warding spells were given an exception from the AOE behavior, thus they will affect spell mantle as they very probably should
- Continual flame: the previous solution removed, spell will again mark item as stolen, however this time only in multiplayer
HAK version:
- added quickened banshee visual effect into hak version - builders are recommended to add this vfx into their haks, as players without CP installed might think that banshee is bugged and is killing faster than it should, which isn't true, banshee kills quicker now as should and those with CP installed will see both death effect and wailing visual perfectly synchronized
New fixes and features:
Tileset fixes:
ttd01_edge.2da - fixed missing cliff edge tile in the corner of the area
tid01_b10_01 - fixed polygon gaps in floor
tid01_b11_01 - fixed polygon gaps in floor
tid01_d15_01 - fixed polygon gap in wall
tcn01_e04_02 - fixed polygon gaps in black coverage with tilefading enabled
2DAs:
- itemprops.2da: cast spell itemproperty will be available also on healer kits and thieves tools
- visualeffects.2da: added two new hidden visual effects, VFX_DUR_QUESTION_MARK and VFX_DUR_EXCLAMATION_MARK. Note: this will be visible only for players with this community patch version installed
- diffsettings.2da: very difficult difficulty extra damage reduced from 200% to 150% so this difficulty is more playable now when CP adds so many small features under it such as faster aura activating, smarter AI in reaction on Black Blade of Disaster and some more
- feat.2da: Blinding speed AI category changed to aura in order to force to use this feat as soon as possible and without checking close combat
Spells and spellabilities:
- All creature auras (blind, fear, menace, stun, unnatural): made supernatural as per DnD rules; this has basically only one effect, to prevent the same monster who stunned/feared/blinded you with his own aura to dispel that effect from you with Mordekainen's Disjunction or beholder dispel
- Battletide: added special workaround to handle how AI casts this spell. (Default AI casts this spell on enemy and then gives benefits to caster, community patch changed every spell to give benefits to target to fix potions and enable 2da customization, but if someone didnt merged spells.2da properly AI could cast this on player and give aura to player, thats a reason for this extra workaround in spellscript)
- Bard Song and Curse Song: improved lvl 30 song attack bonus, damage, will, fort and reflex by +1 from balance reasons
- Bigby's Forceful Hand: stun vfx will no longer appear on target who has not been affected by this spell at all
- Bless: duration of the visual effect in case of cast on item corrected to match with effect duration
- Blinding Speed: no longer requires concentration and thus cannot be interrupted anymore
- Chaotic shield: effects made undispellable (extraordinary)
- Choking powder: effects made undispellable (extraordinary)
- Darkness: aoe effects are now undispellable (extraordinary)
- Deafning Clang: the deafness onhit is now undispellable (extraordinary)
- Delayed blast fireball: when cast directly on single target make explosion immediately without making AOE object, this modificating is especially useful for PWs as AOEs have negative impact on monster AI and lags
- Gelatiouns cube paralysis: effects made undispellable (extraordinary)
- Identify: added custom content support when the spell is modified to cast on item instead of caster, in such case the spell will identify targetted item without any check
- Implosion: a small code improvement that allows to modify this spell to affect caster without need to code anything else to prevent the bug with automatic death without any roll
- Searing light: damage dice against undead targets raised from k6 to k8 to match spell description
- Shield of faith: removed the visual effect that was shared with protection against evil (to prevent mistaking these two), added "cessate" visual effect (this will run at the end of the duration as a kind of feedback "you just lost some beneficial spell"
- Sleep: shape size wasn't correct (started with HUGE then continued with LARGE, which caused issues)
- Time Stop: a small code improvement which will force multiplayer behavior when there is creature with immunity nearby
- Thunderstone: added sonic saving throw subtype, effects made undispellable (extraordinary)
Scripts:
- 70_spellhook: under Hardcore and higher difficulty, reading scrolls won't be possible under blindness/darkness anymore unless character has true seeing or ultravision effects
- 70_inc_spells: Bodak added into list of creatures vulnerable to light (which will allow to kill any bodak with Sunburst spell)
- 70_inc_spells: custom function GetHasSpellEffectSpecific improved to allow pass -1 as an effect type when you don't want to check any specific effect type just an effect with specific spell id and specific creator
- 70_inc_spells: new function DurationToSeconds that is intented to use instead of Rounds/Turns/HoursToSeconds calls
- 70_s2_aoo: new script that softcodes Attack of Opportunity where builder can decide when to allow and when not or give some bonus to the attacker or victim
- 70_s2_devattk: incorporated the new possibility in the module switch MODULE_SWITCH_DEVASTATING_CRITICAL_ONCE_PER_TARGET
- nw_s2_palm: added new code that softcodes Quivering Palm attack and allows builder to modify its functionality
- nwscript: added new ITEM_VISUAL_NONE constant for ItemPropertyVisualEffect function
- nwscript: added nwscript constant for hidded visual effect VFX_COM_GIB, this effect will explode player body leaves nothing visible not even corpse and also locks camera
- nwscript: added nwscript constants for two unlocked visual effects VFX_DUR_QUESTION_MARK and VFX_DUR_EXCLAMATION_MARK
- x0_i0_spells: spells will now work on dying players, this will solve the weird behavior where player drops below 1 hp by some aoe spell like creeping doom and then he lay in the aoe not taking any damage at all
- x2_inc_switches: the module switch for one roll only devastating behavior has now two possible values, 1: for everyone 2: only for players, meaning monsters with devast will work normally imposing roll vs fort on every critical hit
- x2_im_can* scripts: the variables to disable item crafting can now be used also locally, ie. item with these variables won't be allowed to change
Spell engine:
- added new field into spell engine structure, spell.Range, this is used to replace radius size range in spells with area of effect
- added new field into spell engine structure, spell.DurationType, this is used to replace RoundsToSeconds,TurnsToSeconds and HoursToSecond calls with new function DurationToSeconds
- added new field into spell engine structure, spell.DamageCap, this is used to replace a damage cap in various damaging spells, spells affected: blade barrier, burning hands, call of lightning, chain lightning, cone of cold, delayed fireball, fireball, fire storm, flame strike, hammer of gods, horrid wilting, lightning bolt, searing light, sunbeam, vampire touch, bombardment, earthquake, firebrand, sunburst, mestil's acid breath, crumble, gedlees' electric loop, glyph of warding, horizikaul's boom, ice dagger, scincilating sphere, undeath to death
- added new field into spell engine structure, spell.Limit, this is used to replace cap/limit of the various spells, this can be number of missiles, or damage if its not based on hitdice or max hitpoints affected etc, spells affected: epic hellball, epic greater ruin, power word: kill, isaac lesser missile storm, isaac greater missile storm, tide of battle
- new spell overriding variable, use int SPELL_METAMAGIC_MODIFIER on caster to add metamagic on top of already existing metamagic (if any), example SPELL_METAMAGIC_MODIFIER int 2 = every spell cast will be also extended to any of the used metamagic. This is only useable for spells, not special abilities and not items as those cant be already enhanced by metamagic so override is the only variable thats needed there.
- new spell overriding variable, use int SPELL_DAMAGE_CAP_OVERRIDE on caster to override spell damage cap (if any), example SPELL_DAMAGE_CAP_OVERRIDE int 80 = every spell that has a damage cap will have this cap raised to the 80, thus for example Horrid Wilting 1d8 per level up to 80d8 damage.
- new spell overriding variable, use int SPELL_DAMAGE_CAP_MODIFIER on caster to modify spell damage cap (if any), example SPELL_DAMAGE_CAP_MODIFIER int 10 = every spell that has a damage cap will have this cap raised by 10, thus for example Horrid Wilting 1d8 per level up to 35d8 damage.
- new spell overriding variable, use int SPECIAL_ABILITY_DAMAGE_CAP_OVERRIDE on creature
- new spell overriding variable, use int SPECIAL_ABILITY_DAMAGE_CAP_MODIFIER on creature
- new spell overriding variable, use int ITEM_DAMAGE_CAP_OVERRIDE on item
- new spell overriding variable, use int ITEM_DAMAGE_CAP_MODIFIER on item
- new spell overriding variable, use float SPELL_RANGE_OVERRIDE on caster to override spell area of effect height, example SPELL_RANGE_OVERRIDE float 10.0 = sets all spells to have RADIUS_SIZE_COLOSSAL
- new spell overriding variable, use float SPELL_RANGE_MODIFIER on caster to modify spell area of effect height, example SPELL_RANGE_MODIFIER float 2.0 = all spells will have their area of effect heighten by 2.0
- new spell overriding variable, use float SPECIAL_ABILITY_RANGE_OVERRIDE on caster
- new spell overriding variable, use float SPECIAL_ABILITY_RANGE_MODIFIER on caster
- new spell overriding variable, use float ITEM_RANGE_OVERRIDE on item
- new spell overriding variable, use float ITEM_RANGE_MODIFIER on item
- new spell overriding variable, use int SPELL_DURATION_TYPE_OVERRIDE on caster to override spell duration type, 4 possible values, 1 - seconds, 2 - rounds, 3 - turns, 4 - hours. Example: SPELL_DURATION_TYPE_OVERRIDE int 2 = all spells will lasts rounds.
- new spell overriding variable, use int SPELL_DURATION_TYPE_MODIFIER on caster to modify spell duration type. Example: SPELL_DURATION_TYPE_MODIFIER int 1 = spells that lasted seconds will last rounds, spell that lasted rounds will last turns and so on.
- new spell overriding variable, use int SPECIAL_ABILITY_DURATION_TYPE_OVERRIDE on caster
- new spell overriding variable, use int SPECIAL_ABILITY_DURATION_TYPE_MODIFIER on caster
- new spell overriding variable, use int ITEM_DURATION_TYPE_OVERRIDE on item
- new spell overriding variable, use int ITEM_DURATION_TYPE_MODIFIER on item
- new spell overriding variable, use float SPELL_DURATION_OVERRIDE on caster to override spell exact duration, note this happens *after* extending the value you will use won't be doubled anymore. Example: SPELL_DURATION_OVERRIDE float 18.0 = all spells will last only 3rounds.
- new spell overriding variable, use float SPELL_DURATION_MODIFIER on caster to modify spell exact duration, note this happens *after* extending the value you will use won't be doubled anymore. Example: SPELL_DURATION_MODIFIER float 6.0 = all spells will last one round more.
- new spell overriding variable, use float SPECIAL_ABILITY_DURATION_OVERRIDE on caster
- new spell overriding variable, use float SPECIAL_ABILITY_DURATION_MODIFIER on caster
- new spell overriding variable, use float ITEM_DURATION_OVERRIDE on item
- new spell overriding variable, use float ITEM_DURATION_MODIFIER on item
- new spell overriding variable, use int X_CASTER_LEVEL_OVERRIDE on item or caster to override caster level of the spell with ID of X, example 368_CASTER_LEVEL_OVERRIDE int 80 = ice storm with caster level 80
- new spell overriding variable, use int X_DC_OVERRIDE on item or caster to override DC of the spell with ID of X, example 87_CASTER_LEVEL_OVERRIDE int 60 = implosion with DC 60
- new spell overriding variable, use int X_METAMAGIC_OVERRIDE on item or caster to override metamagic of the spell with ID of X, example 463_CASTER_LEVEL_OVERRIDE int 7 = extended, empowered and maximiyed Bigby's Crushing Hand
- new spell overriding variable, use int X_DAMAGE_CAP_OVERRIDE on item or caster to override damage cap of the spell with ID of X, example 58_CASTER_LEVEL_OVERRIDE int 40 = fireball doing 1k6/level up to 40k6
- new spell overriding variable, use float X_RANGE_OVERRIDE on item or caster to override area of effect height of the spell with ID of X, example 114_RANGE_OVERRIDE float 20.0 = Mass Heal will have height of 20.0 (twice as much as RADIUS_SIZE_COLOSSAL)
- new spell overriding variable, use int X_DURATION_TYPE_OVERRIDE on item or caster to override duration type of the spell with ID of X, 4 possible values, 1 - seconds, 2 - rounds, 3 - turns, 4 - hours. Example: 88_DURATION_TYPE_OVERRIDE int 2 = Improved Invisibility will last level/rounds instead of level/turns.
- new spell overriding variable, use float X_DURATION_OVERRIDE on item or caster to override exact duration of the spell with ID of X, note this happens *after* extending the value you will use won't be doubled anymore. Example: 443_DURATION_OVERRIDE float 24.0 = Greater Sanctuary will last 4 rounds only.
- new spell overriding variable, use int X_LIMIT_OVERRIDE Y on item or caster to override various limit of the spell with ID of X, where X is an ID of the spell (448 IGMS, 640 Greater Ruin etc.) and Y is an actual limit value. Example 448_LIMIT_OVERRIDE 50 = Isaac Greater Missile Storm doing up to 50 missiles (if caster has 50caster level). Due to the speciality of this variable there is no ITEM_ / SPECIAL_ABILITY_ / SPELL_ variant only ID version since this can't be really used globally as each spell has different limit, so each spell must be set standalone.
- new spell overriding variable, use object SPELL_TARGET_OVERRIDE on caster to override an actual target of the spell. This is designed mostly for DMs in mind (for example, DM uses DM tool feat on NPC to mark her as a target of the spells, then whatever spell he casts on himself will be cast on this creature), can be used for other purposed eg. sharing spells with familiars. Either way this variable expects a scripting system via spellhook.
Client:
- added few colorized feat icons from the Amethyst Dragon
- new metamagic icons in radial menu/spellbook
- fixed epic spell scroll icons (the fix is only partial, its not an actual scroll but spell icon instead, still its better than "TEMP")
NWNX_Patch and NWNCX_Patch plugins (current version v1.12):
- added some more debug informations to make bugtracking easier
- fixed nonfunctional FavoredEnemyFeat feature and FE_MODIFIER variable
- enabled Spontaneous Casting for other classes than cleric, this is controlled by already existing collumn in spells.2da SpontaneouslyCast, where value is now ID of class that can cast the spell spontaneously. 10 = Wizard, 3 = Druid, 2 = Cleric. Value of 1 will for compatibility reasons works as Cleric, obviously. Bard and Sorcerer are not able to use this anyway since they already cast spontaneously and everything. Its not possible to select more than one class but if you would want to make a spontaneous spell for both cleric and druid for example you can always create a two version of that spell, one that will be in druid spellbook one that will be in cleric spellbook only.
- softcoded quivering palm feat, Deathless Mastery feat now grants immunity (which doesn't apply in vanilla due to an overlook)
- softcoded attacks of opportunity + aoo disabled when casting or doing rogue actions, also when wearing magical staff in hand
Notes:
This update is huge. I finally decided to step up in the radical spellscript change. Most calls of the RoundsToSeconds, TurnsToSeconds and HoursToSeconds were replaced by new function DurationToSeconds, and spellscripts now uses four new structure elements, spell.Range, spell.DurationType, spell.DamageCap and spell.Limit. And this is just a start. If this change and the new features arising from this will be appreciated, I plan to add also spell.DamageType which would allow to dynamically change spell damage type.
Anyway from this reason, the final 1.72 has to be delayed as this might add new issues, I bet I overlooked some spells as usually, actually in the process of rewriting all spells I found out that in few 1.71 spellscripts the spellsDeclareMajorVariables was declared before spellhook which means that spell overrides weren't functional for these spells, this is of course foxed now.
I also had to change the spellscript organization a bit. From this reason and the fact that there is so many changes already, I no longer care about backwards comparability. That means that I removed huge wall of comments, unused variables, lines that was commented out and extra blank lines, all with one purpose. To make spellscripts effcient,, easy to read and easy to compare against each other.
The new spell script organization is this:
1) pre-declaration, that is filling up spell.Range, spell.DurationType, spell.DamageCap and spell.Limit
2) spellhook [2a) internal spellhook in 70_spellhook, 2b) module spellhook if any]
3) declaration of the spell engine structure via spellsDeclareMajorVariables();
4) spell code
You have to follow this new spellscript organization, otherwise the spell-engine overriding features won't work correctly. Pre-declaration has to happen before spellhook, otherwise it won't be possible to read these informations in spellhook.
To get access to these informations in module spellhook, use this:
int spellDamageCap = GetLocalInt(OBJECT_SELF,"70_SPELLHOOK_DAMAGECAP");
int spellDurationType = GetLocalInt(OBJECT_SELF,"70_SPELLHOOK_DURATION");
int spellLimit = GetLocalInt(OBJECT_SELF,"70_SPELLHOOK_LIMIT");
float spellRange = GetLocalFloat(OBJECT_SELF,"70_SPELLHOOK_RANGE");
As for new spell overrides. Except the examples I showed in the beta9 changelog, this can be used to:
- make items which will extend duration of certain spells when carried in inventory
- new itemproperties to do this like "Extended Spell Duration: +1 round" or "Increased Spell Damage Cap: +1"
- enforce a fixed duration for some of the problematic spells like Greater Sanctuary
- new metamagic feats that will automatically make spells heightened or lasts longer
Most of these new overrides is however not very practical to use manually. Most of the times you will want to do this in spellhook dynamically. In spellhook, you can read current spell range, damagecap, durationtype and limit and then you can decide whether and how to modify it. In case of fixed duration for example, you should check whether extend metamagic was used before you set duration override as the duration modifications are resolved *after* extending in spellscript.