Jump to content

Project: Spells Missing Ability Headers


Recommended Posts

Posted

Bioware got really lazy when it came to spells that have abilities dependent on caster level. Call Lightning (sppr302) is a good example: damage is supposed to be 2d8 + 1d8/caster level. However, looking at the spell you'll notice that the spell has ability headers for level 1 and then skips to levels 6-18. The level 1 ability actually does 7d8 damage (i.e. level 5 equivalent).

 

Since characters begin the game at 89000 or 161000 XP, Bioware never planned for characters to be casting spells at low levels. Because of this, many spells lack low-level headers. However, this does not account for characters that dual-class or characters that have been level-drained. In this example, any cleric below level 6 would use the level 1 header, which would cast Call Lightning at the equivalent of a level 5 caster. (Call Lightning is also missing its level 19 and 20 headers, but that's a different bugfix. :) ) As an aside, this is especially acute when these spell files are used in Tutu, so this is something that should be dropped into Tutufix.

 

We need someone to peruse the spell files and check the available headers to see where else Bioware has been lazy.

Posted

Who loves WeiDU?

Barkskin [SPPR202.SPL]:
 Apparent spell level: 2
 Initial ability level: 1
 Second ability level: 4

Goodberry [SPPR207.SPL]:
 Apparent spell level: 2
 Initial ability level: 1
 Second ability level: 6

Spiritual Hammer [SPPR213.SPL]:
 Apparent spell level: 2
 Initial ability level: 1
 Second ability level: 4

Draw Upon Holy Might [SPPR214.SPL]:
 Apparent spell level: 2
 Initial ability level: 1
 Second ability level: 6

Animate Dead [SPPR301.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 10

Call Lightning [SPPR302.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 6

Glyph of Warding [SPPR304.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 6

Holy Smite [SPPR313.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 6

Unholy Blight [SPPR314.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 6

Free Action [SPPR403.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Protection from Lightning [SPPR407.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Protection from Evil 10' Radius [SPPR408.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Death Ward [SPPR409.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Poison [SPPR411.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 10

Holy Power [SPPR412.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Flame Strike [SPPR503.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Iron Skins [SPPR506.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 8

Champion's Strength [SPPR507.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Chaotic Commands [SPPR508.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Magic Resistance [SPPR509.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Greater Command [SPPR512.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Righteous Magic [SPPR513.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Mass Cure [SPPR514.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Slay Living [SPPR599.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Aerial Servant [SPPR601.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 12

Conjure Fire Elemental [SPPR605.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 12

Shield of the Archons [SPPR701.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 15

Conjure Earth Elemental [SPPR702.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 15

Fire Storm [SPPR705.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 15

Symbol, Fear [SPPR706.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 15

Sunray [SPPR707.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 15

Finger of Death [SPPR708.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 15

Confusion [SPPR709.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 16

Regeneration [SPPR711.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 15

Symbol, Stun [SPPR718.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 15

Summon Deva [SPPR726.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 14

Summon Fallen Deva [SPPR727.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 14

Aura of Flaming Death [SPPR730.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 14

Friends [SPWI107.SPL]:
 Apparent spell level: 1
 Initial ability level: 1
 Second ability level: 3

Magic Missile [SPWI112.SPL]:
 Apparent spell level: 1
 Initial ability level: 1
 Second ability level: 3

Blur [SPWI201.SPL]:
 Apparent spell level: 2
 Initial ability level: 1
 Second ability level: 4

Melf's Acid Arrow [SPWI211.SPL]:
 Apparent spell level: 2
 Initial ability level: 1
 Second ability level: 6

Mirror Image [SPWI212.SPL]:
 Apparent spell level: 2
 Initial ability level: 1
 Second ability level: 4

Strength [SPWI214.SPL]:
 Apparent spell level: 2
 Initial ability level: 1
 Second ability level: 4

Ray of Enfeeblement [SPWI221.SPL]:
 Apparent spell level: 2
 Initial ability level: 1
 Second ability level: 4

Chaos Shield [SPWI222.SPL]:
 Apparent spell level: 2
 Initial ability level: 1
 Second ability level: 5

Mirror Image [SPWI298.SPL]:
 Apparent spell level: 2
 Initial ability level: 1
 Second ability level: 4

Flame Arrow [SPWI303.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 10

Fireball [SPWI304.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 6

Haste [SPWI305.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 6

Lightning Bolt [SPWI308.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 6

Monster Summoning I [SPWI309.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 6

Skull Trap [SPWI313.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 6

Vampiric Touch [SPWI314.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 6

Minor Spell Deflection [SPWI318.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 6

Protection from Fire [SPWI319.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 6

Protection from Cold [SPWI320.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 6

Hold Undead [SPWI324.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 6

Melf's Minute Meteors [SPWI325.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 6

Lightning Bolt [SPWI399.SPL]:
 Apparent spell level: 3
 Initial ability level: 1
 Second ability level: 6

Confusion [SPWI401.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 6

Fire Shield (Blue) [SPWI403.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Improved Invisibility [SPWI405.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Minor Globe of Invulneribility [SPWI406.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Monster Summoning II [SPWI407.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Stoneskin [SPWI408.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Emotion [SPWI411.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Greater Malison [SPWI412.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Polymorph Self [SPWI416.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Fire Shield (Red) [SPWI418.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Spider Spawn [SPWI423.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Farsight [SPWI424.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Wizard Eye [SPWI425.SPL]:
 Apparent spell level: 4
 Initial ability level: 1
 Second ability level: 8

Animate Dead [SPWI501.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Cone of Cold [SPWI503.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 11

Monster Summoning III [SPWI504.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Shadow Door [SPWI505.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Hold Monster [SPWI507.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Protection from Normal Weapons [SPWI511.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Protection from Electricity [SPWI512.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Lower Resistance [SPWI514.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Conjure Lesser Fire Elemental [SPWI516.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Protection from Acid [SPWI517.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Phantom Blade [SPWI518.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Conjure Lesser Air Elemental [SPWI520.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Conjure Lesser Earth Elemental [SPWI521.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Sunfire [SPWI523.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Immunity: Abjuration [SPWI590.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Immunity: Conjuration [SPWI591.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Immunity: Divination [SPWI592.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Immunity: Enchantment [SPWI593.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Immunity: Illusion [SPWI594.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Immunity: Evocation [SPWI595.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Immunity: Necromancy [SPWI596.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Immunity: Alteration [SPWI597.SPL]:
 Apparent spell level: 5
 Initial ability level: 1
 Second ability level: 10

Globe of Invulnerability [SPWI602.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 13

Tenser's Transformation [SPWI603.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 13

Protection from Magic Energy [SPWI606.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 13

Mislead [SPWI607.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 13

Pierce Magic [SPWI608.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 13

Improved Haste [SPWI613.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 13

Chain Lightning [SPWI615.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 14

Contingency [SPWI617.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 15

Spell Deflection [SPWI618.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 13

Wyvern Call [SPWI619.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 13

Conjure Fire Elemental [SPWI620.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 12

Conjure Air Elemental [SPWI621.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 15

Conjure Earth Elemental [SPWI622.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 15

Carrion Summons [SPWI623.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 12

Summon Nishruu [SPWI624.SPL]:
 Apparent spell level: 6
 Initial ability level: 1
 Second ability level: 13

Spell Turning [SPWI701.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 15

Protection from the Elements [SPWI702.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 15

Project Image [SPWI703.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 15

Mordenkainen's Sword [SPWI716.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 15

Summon Efreeti [SPWI717.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 15

Summon Djinni [SPWI718.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 15

Summon Hakeashar [SPWI719.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 16

Control Undead [SPWI720.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 15

Mass Invisibility [SPWI721.SPL]:
 Apparent spell level: 7
 Initial ability level: 1
 Second ability level: 15

Protection from Energy [SPWI803.SPL]:
 Apparent spell level: 8
 Initial ability level: 1
 Second ability level: 17

Simulacrum [SPWI804.SPL]:
 Apparent spell level: 8
 Initial ability level: 1
 Second ability level: 17

Pierce Shield [SPWI805.SPL]:
 Apparent spell level: 8
 Initial ability level: 1
 Second ability level: 17

Incendiary Cloud [SPWI810.SPL]:
 Apparent spell level: 8
 Initial ability level: 1
 Second ability level: 17

Symbol, Fear [SPWI811.SPL]:
 Apparent spell level: 8
 Initial ability level: 1
 Second ability level: 18

Abi-Dalzim's Horrid Wilting [SPWI812.SPL]:
 Apparent spell level: 8
 Initial ability level: 1
 Second ability level: 17

Symbol, Stun [SPWI816.SPL]:
 Apparent spell level: 8
 Initial ability level: 1
 Second ability level: 18

Symbol, Stun [SPWI898.SPL]:
 Apparent spell level: 8
 Initial ability level: 1
 Second ability level: 17

Symbol, Fear [SPWI899.SPL]:
 Apparent spell level: 8
 Initial ability level: 1
 Second ability level: 17

Summon Planetar [SPWI923.SPL]:
 Apparent spell level: 9
 Initial ability level: 1
 Second ability level: 18

Summon Dark Planetar [SPWI924.SPL]:
 Apparent spell level: 9
 Initial ability level: 1
 Second ability level: 18

I'll whip up something to compare to the actual required caster level if I get the time or there's sufficient interest. Regardless, this probably won't be a bug in most cases (helping Tutu is nowhere near sufficient as a reason to start patching files in a BG2 bug fix-pack, IMO).

Posted

Cool, thanks devSin. Now it's just the easy part of fixing them.

 

It's a BG2 bugfix too though, because you can easily end up casting at low levels if you dual-class or are level-drained.

 

However, this does not account for characters that dual-class or characters that have been level-drained.

 

:)

Posted

The code:

COPY_EXISTING_REGEXP ~^SPPR[1-7].+\.SPL$~ ~OVERRIDE~
 READ_STRREF 0x08 ~spellName~
 READ_LONG 0x34 ~apparentSpellLevel~ ELSE 0x01
 READ_LONG 0x64 ~abilitiesOffset~ ELSE 0x72
 READ_SHORT 0x68 ~numberOfAbilities~ ELSE 0x00
 PATCH_IF (~%numberOfAbilities%~ > 0x01)
 BEGIN
   READ_SHORT ~%abilitiesOffset%~ + 0x10 ~spellLevel1~ ELSE 0x01
   READ_SHORT ~%abilitiesOffset%~ + 0x38 ~spellLevel2~ ELSE 0x02
   SET ~requiredLevel~ = (~%apparentSpellLevel%~ = 0x01) ? 1 :
                         (~%apparentSpellLevel%~ = 0x02) ? 3 :
                         (~%apparentSpellLevel%~ = 0x03) ? 5 :
                         (~%apparentSpellLevel%~ = 0x04) ? 7 :
                         (~%apparentSpellLevel%~ = 0x05) ? 9 :
                         (~%apparentSpellLevel%~ = 0x06) ? 11 : 14
   PATCH_IF (~%spellLevel2%~ != (~%spellLevel1%~ + 0x01))
        AND (~%spellLevel2%~ > (~%requiredLevel%~ + 0x01))
   BEGIN
     PATCH_PRINT ~%spellName% [%SOURCE_FILE%]:
 Apparent spell level: %apparentSpellLevel%
 Required caster level: %requiredLevel%
 Initial ability level: %spellLevel1%
 Second ability level: %spellLevel2%~
   END
 END
BUT_ONLY_IF_IT_CHANGES

COPY_EXISTING_REGEXP ~^SPWI[1-9].+\.SPL$~ ~OVERRIDE~
 READ_STRREF 0x08 ~spellName~
 READ_LONG 0x34 ~apparentSpellLevel~ ELSE 0x01
 READ_LONG 0x64 ~abilitiesOffset~ ELSE 0x72
 READ_SHORT 0x68 ~numberOfAbilities~ ELSE 0x00
 PATCH_IF (~%numberOfAbilities%~ > 0x01)
 BEGIN
   READ_SHORT ~%abilitiesOffset%~ + 0x10 ~spellLevel1~ ELSE 0x01
   READ_SHORT ~%abilitiesOffset%~ + 0x38 ~spellLevel2~ ELSE 0x02
   SET ~requiredLevel~ = (~%apparentSpellLevel%~ = 0x01) ? 1 :
                         (~%apparentSpellLevel%~ = 0x02) ? 3 :
                         (~%apparentSpellLevel%~ = 0x03) ? 5 :
                         (~%apparentSpellLevel%~ = 0x04) ? 7 :
                         (~%apparentSpellLevel%~ = 0x05) ? 9 :
                         (~%apparentSpellLevel%~ = 0x06) ? 12 :
                         (~%apparentSpellLevel%~ = 0x07) ? 14 :
                         (~%apparentSpellLevel%~ = 0x08) ? 16 : 18
   PATCH_IF (~%spellLevel2%~ != (~%spellLevel1%~ + 0x01))
        AND (~%spellLevel2%~ > (~%requiredLevel%~ + 0x01))
   BEGIN
     PATCH_PRINT ~%spellName% [%SOURCE_FILE%]:
 Apparent spell level: %apparentSpellLevel%
 Required caster level: %requiredLevel%
 Initial ability level: %spellLevel1%
 Second ability level: %spellLevel2%~
   END
 END
BUT_ONLY_IF_IT_CHANGES

And the list:

Goodberry [SPPR207.SPL]:
 Apparent spell level: 2
 Required caster level: 3
 Initial ability level: 1
 Second ability level: 6

Draw Upon Holy Might [SPPR214.SPL]:
 Apparent spell level: 2
 Required caster level: 3
 Initial ability level: 1
 Second ability level: 6

Animate Dead [SPPR301.SPL]:
 Apparent spell level: 3
 Required caster level: 5
 Initial ability level: 1
 Second ability level: 10

Poison [SPPR411.SPL]:
 Apparent spell level: 4
 Required caster level: 7
 Initial ability level: 1
 Second ability level: 10

Confusion [SPPR709.SPL]:
 Apparent spell level: 7
 Required caster level: 14
 Initial ability level: 1
 Second ability level: 16

Friends [SPWI107.SPL]:
 Apparent spell level: 1
 Required caster level: 1
 Initial ability level: 1
 Second ability level: 3

Magic Missile [SPWI112.SPL]:
 Apparent spell level: 1
 Required caster level: 1
 Initial ability level: 1
 Second ability level: 3

Melf's Acid Arrow [SPWI211.SPL]:
 Apparent spell level: 2
 Required caster level: 3
 Initial ability level: 1
 Second ability level: 6

Chaos Shield [SPWI222.SPL]:
 Apparent spell level: 2
 Required caster level: 3
 Initial ability level: 1
 Second ability level: 5

Flame Arrow [SPWI303.SPL]:
 Apparent spell level: 3
 Required caster level: 5
 Initial ability level: 1
 Second ability level: 10

Cone of Cold [SPWI503.SPL]:
 Apparent spell level: 5
 Required caster level: 9
 Initial ability level: 1
 Second ability level: 11

Chain Lightning [SPWI615.SPL]:
 Apparent spell level: 6
 Required caster level: 12
 Initial ability level: 1
 Second ability level: 14

Contingency [SPWI617.SPL]:
 Apparent spell level: 6
 Required caster level: 12
 Initial ability level: 1
 Second ability level: 15

Conjure Air Elemental [SPWI621.SPL]:
 Apparent spell level: 6
 Required caster level: 12
 Initial ability level: 1
 Second ability level: 15

Conjure Earth Elemental [SPWI622.SPL]:
 Apparent spell level: 6
 Required caster level: 12
 Initial ability level: 1
 Second ability level: 15

Summon Hakeashar [SPWI719.SPL]:
 Apparent spell level: 7
 Required caster level: 14
 Initial ability level: 1
 Second ability level: 16

Symbol, Fear [SPWI811.SPL]:
 Apparent spell level: 8
 Required caster level: 16
 Initial ability level: 1
 Second ability level: 18

Symbol, Stun [SPWI816.SPL]:
 Apparent spell level: 8
 Required caster level: 16
 Initial ability level: 1
 Second ability level: 18

Posted
It's a BG2 bugfix too though, because you can easily end up casting at low levels if you dual-class or are level-drained.
But you still have to be the minimum caster level, no? So if you have to be level n to cast a spell, and the spell effects change every three levels, then you'll only need a level 1 (acts as level n, since you can't even cast the spell until level n), and then n + [3,6,9,...]. BioWare always started spell abilities at level 1 (perhaps this is required for ForceSpell() type actions or creatures that have non-player classes; most likely it was just the logical thing to do). It's not a bug unless the player can actually cast the spell where the effects would be applied at an inappropriate level (if you could actually cast Call Lightning at level 1, for instance, but it was doing level 5 damage until level 6, then that would be a bug).

 

At least, that's the way I understand it.

Posted

Scrolls should either be cast instantly (using the level 1 ability, which is the level n ability), in which case the spell is cast with the minimum effect parameters (as appropriate for the spell level and the required caster level), or at a pre-determined level (I think BioWare used level 10 for all of these, so about half will use the level 1 ability effects anyway). There is no contingency for having spells a player is unable to cast (so there is no "real" level 1 ability for Symbol, Death, for instance); any allowed class can cast a scroll of any level, and the effects will most likely be the minimum level at which the spell can legitimately be cast. This is the same for other types of items that have cast spell effects; I do not believe this to be a bug (otherwise, most scrolls would be worthless).

 

Unless your question was alluding to something other than my previous post, in which case, I'm just rambling.

Posted

And, based on all that, my list of potential issues:

Animate Dead [SPPR301.SPL]: Uses Level 9 effects for Levels 5-9
Cone of Cold [SPWI503.SPL]: Uses Level 10 effects for Level 9 and Level 10
Conjure Air Elemental [SPWI621.SPL]: Uses Level 14 effects for Levels 12-14
Conjure Earth Elemental [SPWI622.SPL]: Uses Level 14 effects for Levels 12-14
Summon Hakeashar [SPWI719.SPL]: Uses Level 15 effects for Level 14 and Level 15

Someone will need to verify, but these all look to me like bugs.

Posted
Bioware got really lazy when it came to spells that have abilities dependent on caster level. Call Lightning (sppr302) is a good example: damage is supposed to be 2d8 + 1d8/caster level. However, looking at the spell you'll notice that the spell has ability headers for level 1 and then skips to levels 6-18. The level 1 ability actually does 7d8 damage (i.e. level 5 equivalent).

 

Since characters begin the game at 89000 or 161000 XP, Bioware never planned for characters to be casting spells at low levels. Because of this, many spells lack low-level headers.

devSin is correct. It has more to do with "below fifth level no one can cast a third level druid spell." Although my observations are far from comprehensive, of the spells I looked at, that was always the case--first an effect for level 1 which applies to the lowest level at which it's possible to cast the spell, then effects for each level at which something about the spell changed.

 

Scrolls are supposed to function as if cast by the wizard/sorcerer/cleric/druid who created them, at the time they were created (so if you create a scroll at level 10 and then gain five levels, it still works as if cast by a 10th-level caster, it doesn't track your rising level and become more powerful).

Posted

All scrolls are intended to be cast at level 10, unless there's either a bug anywhere, or it's specifically intended otherwise.

 

And yeah, if you take a look at any spell; fireball, skull trap, lightning bolt, their first usable incarnation is at level 5, so why bother making an effect for levels 1-4? I think the reason they make the first usable effect work for level 1 is in case they mistakenly code an enemy as level 1. An ogre-mage, say, who has fireball manually added to his repertoire, or perhaps cast via script.

 

I put forward that making fixes for instances in which it will never ever have an effect should not have effort wasted on it. Much like writing content for the CG Korgan, or the Romanced Valygar. I forget who did that, and which one it was. Quitch and Korgan, I think? Anyways, the point still stands.

Posted
I put forward that making fixes for instances in which it will never ever have an effect should not have effort wasted on it.  Much like writing content for the CG Korgan, or the Romanced Valygar.  I forget who did that, and which one it was.  Quitch and Korgan, I think?  Anyways, the point still stands.

Yes, I agree.

Posted

The 5 I listed are legitimate bugs that need fixing, though.

 

EDIT: My patches

COPY_EXISTING ~SPPR301.SPL~ ~OVERRIDE~
 WRITE_EVALUATED_ASCII 0x9e ~%SOURCE_RES%B~ #8
 WRITE_EVALUATED_ASCII 0xc6 ~%SOURCE_RES%B~ #8
 WRITE_EVALUATED_ASCII 0xee ~%SOURCE_RES%B~ #8
 WRITE_EVALUATED_ASCII 0x0116 ~%SOURCE_RES%B~ #8
 WRITE_EVALUATED_ASCII 0x013e ~%SOURCE_RES%B~ #8
 WRITE_EVALUATED_ASCII 0x0166 ~%SOURCE_RES%B~ #8
 WRITE_BYTE 0x018d 0x03
 WRITE_BYTE 0x019c 0x37
 WRITE_BYTE 0x01cd 0x38
 WRITE_BYTE 0x01fd 0x38
 WRITE_BYTE 0x02bc 0x2d
 READ_LONG 0x64 ~abilitiesOffset~ ELSE 0x72
 READ_SHORT 0x68 ~numberOfAbilities~ ELSE 0x00
 READ_ASCII ~%abilitiesOffset%~ ~cloneAbility~ ELSE ~~ (40)
 FOR (index = 0x04; index > 0x00; index = index - 0x01) BEGIN
   INSERT_BYTES ~%abilitiesOffset%~ + 0x28 0x28
   WRITE_EVALUATED_ASCII ~%abilitiesOffset%~ + 0x28 ~%cloneAbility%~ #40
   WRITE_SHORT ~%abilitiesOffset%~ + 0x38 ~%index%~ + 0x05
 END
 WRITE_LONG 0x6a ~%effectsOffset%~ + 0xa0
 WRITE_SHORT 0x68 ~%numberOfAbilities%~ + 0x04
 READ_LONG 0x6a ~effectsOffset~ ELSE 0x72
 READ_SHORT 0x70 ~numberOfEffects~ ELSE 0x00
 READ_ASCII ~%effectsOffset%~ ~cloneEffect~ ELSE ~~ (144)
 READ_SHORT ~%abilitiesOffset%~ + 0x1e ~numberOfAbilityEffects~ ELSE 0x00
 SET ~numberOfEffects~ = ~%numberOfEffects%~ + ~%numberOfAbilityEffects%~
 FOR (index = 0x04; index > 0x00; index = index - 0x01) BEGIN
   INSERT_BYTES ~%effectsOffset%~ + (~%numberOfEffects%~ * 0x30) 0x90
   WRITE_EVALUATED_ASCII ~%effectsOffset%~ + (~%numberOfEffects%~ * 0x30) ~%cloneEffect%~ #144
 END
 SET ~probability~ = 0x4b
 FOR (READ_SHORT 0x68 numberOfAbilities ELSE 0x00; numberOfAbilities > 0x01; numberOfAbilities = numberOfAbilities - 0x01) BEGIN
   FOR (index = numberOfEffects; index > 0x00; index = index - 0x01) BEGIN
     READ_BYTE ~%effectsOffset%~ + 0x12 ~probabilityOne~ ELSE 0x00
     READ_BYTE ~%effectsOffset%~ + 0x13 ~probabilityTwo~ ELSE 0x00
     WRITE_BYTE ~%effectsOffset%~ + 0x12 (~%probabilityTwo%~ = 0x00) ? ~%probability%~ : ~%probabilityOne%~
     WRITE_BYTE ~%effectsOffset%~ + 0x13 (~%probabilityOne%~ = 0x64) ? ~%probability%~ + 0x01 : ~%probabilityTwo%~
     SET ~effectsOffset~ = ~%effectsOffset%~ + 0x30
   END
   SET ~probability~ = ~%probability%~ - 0x05
 END
BUT_ONLY_IF_IT_CHANGES

COPY_EXISTING ~SPWI503.SPL~ ~OVERRIDE~
 WRITE_SHORT 0x80 0x0c
 READ_LONG 0x64 ~abilitiesOffset~ ELSE 0x72
 READ_SHORT 0x68 ~numberOfAbilities~ ELSE 0x00
 READ_ASCII ~%abilitiesOffset%~ ~cloneAbility~ ELSE ~~ (40)
 INSERT_BYTES ~%abilitiesOffset%~ + 0x28 0x28
 WRITE_EVALUATED_ASCII ~%abilitiesOffset%~ + 0x28 ~%cloneAbility%~ #40
 WRITE_SHORT ~%abilitiesOffset%~ + 0x38 0x0a
 WRITE_LONG 0x6a ~%effectsOffset%~ + 0x28
 WRITE_SHORT 0x68 ~%numberOfAbilities%~ + 0x01
 READ_LONG 0x6a ~effectsOffset~ ELSE 0x72
 READ_SHORT 0x70 ~numberOfEffects~ ELSE 0x00
 READ_ASCII ~%effectsOffset%~ ~cloneEffect~ ELSE ~~ (96)
 READ_SHORT ~%abilitiesOffset%~ + 0x1e ~numberOfAbilityEffects~ ELSE 0x00
 SET ~numberOfEffects~ = ~%numberOfEffects%~ + ~%numberOfAbilityEffects%~
 INSERT_BYTES ~%effectsOffset%~ + (~%numberOfEffects%~ * 0x30) 0x60
 WRITE_EVALUATED_ASCII ~%effectsOffset%~ + (~%numberOfEffects%~ * 0x30) ~%cloneEffect%~ #96
 WRITE_LONG 0x0286 0x04
 WRITE_LONG 0x029e 0x04
 WRITE_LONG 0x032e 0x06
 WRITE_LONG 0x035e 0x05
BUT_ONLY_IF_IT_CHANGES

COPY_EXISTING_REGEXP ~^SPWI62[12]\.SPL$~ ~OVERRIDE~
 READ_LONG 0x64 ~abilitiesOffset~ ELSE 0x72
 READ_SHORT 0x68 ~numberOfAbilities~ ELSE 0x00
 READ_ASCII ~%abilitiesOffset%~ ~cloneAbility~ ELSE ~~ (40)
 INSERT_BYTES ~%abilitiesOffset%~ + 0x28 0x28
 WRITE_EVALUATED_ASCII ~%abilitiesOffset%~ + 0x28 ~%cloneAbility%~ #40
 WRITE_SHORT ~%abilitiesOffset%~ + 0x38 0x0e
 INSERT_BYTES ~%abilitiesOffset%~ + 0x28 0x28
 WRITE_EVALUATED_ASCII ~%abilitiesOffset%~ + 0x28 ~%cloneAbility%~ #40
 WRITE_SHORT ~%abilitiesOffset%~ + 0x38 0x0d
 WRITE_LONG 0x6a ~%effectsOffset%~ + 0x50
 WRITE_SHORT 0x68 ~%numberOfAbilities%~ + 0x02
 READ_LONG 0x6a ~effectsOffset~ ELSE 0x72
 READ_SHORT 0x70 ~numberOfEffects~ ELSE 0x00
 READ_ASCII ~%effectsOffset%~ ~cloneEffect~ ELSE ~~ (288)
 READ_SHORT ~%abilitiesOffset%~ + 0x1e ~numberOfAbilityEffects~ ELSE 0x00
 SET ~numberOfEffects~ = ~%numberOfEffects%~ + ~%numberOfAbilityEffects%~
 INSERT_BYTES ~%effectsOffset%~ + (~%numberOfEffects%~ * 0x30) 0x0120
 WRITE_EVALUATED_ASCII ~%effectsOffset%~ + (~%numberOfEffects%~ * 0x30) ~%cloneEffect%~ #288
 INSERT_BYTES ~%effectsOffset%~ + (~%numberOfEffects%~ * 0x30) 0x0120
 WRITE_EVALUATED_ASCII ~%effectsOffset%~ + (~%numberOfEffects%~ * 0x30) ~%cloneEffect%~ #288
 SET ~effectLength~ = 0x02d0
 FOR (READ_SHORT 0x68 numberOfAbilities ELSE 0x00; numberOfAbilities > 0x00; numberOfAbilities = numberOfAbilities - 0x01) BEGIN
   FOR (index = numberOfEffects; index > 0x00; index = index - 0x01) BEGIN
     READ_LONG ~%effectsOffset%~ + 0x0e ~currentLength~ ELSE 0x00
     WRITE_LONG ~%effectsOffset%~ + 0x0e (~%currentLength%~ > 0x3c) ? ~%effectLength%~ : ~%currentLength%~
     SET ~effectsOffset~ = ~%effectsOffset%~ + 0x30
   END
   SET ~effectLength~ = ~%effectLength%~ + 0x3c
 END
BUT_ONLY_IF_IT_CHANGES

COPY_EXISTING ~SPWI719.SPL~ ~OVERRIDE~
 READ_LONG 0x64 ~abilitiesOffset~ ELSE 0x72
 READ_SHORT 0x68 ~numberOfAbilities~ ELSE 0x00
 READ_ASCII ~%abilitiesOffset%~ ~cloneAbility~ ELSE ~~ (40)
 INSERT_BYTES ~%abilitiesOffset%~ + 0x28 0x28
 WRITE_EVALUATED_ASCII ~%abilitiesOffset%~ + 0x28 ~%cloneAbility%~ #40
 WRITE_SHORT ~%abilitiesOffset%~ + 0x38 0x0f
 WRITE_LONG 0x6a ~%effectsOffset%~ + 0x28
 WRITE_SHORT 0x68 ~%numberOfAbilities%~ + 0x01
 READ_LONG 0x6a ~effectsOffset~ ELSE 0x72
 READ_SHORT 0x70 ~numberOfEffects~ ELSE 0x00
 READ_ASCII ~%effectsOffset%~ ~cloneEffect~ ELSE ~~ (48)
 READ_SHORT ~%abilitiesOffset%~ + 0x1e ~numberOfAbilityEffects~ ELSE 0x00
 SET ~numberOfEffects~ = ~%numberOfEffects%~ + ~%numberOfAbilityEffects%~
 INSERT_BYTES ~%effectsOffset%~ + (~%numberOfEffects%~ * 0x30) 0x30
 WRITE_EVALUATED_ASCII ~%effectsOffset%~ + (~%numberOfEffects%~ * 0x30) ~%cloneEffect%~ #48
 WRITE_LONG 0x0198 132
BUT_ONLY_IF_IT_CHANGES

You can tell when I start getting tired of Baldur's Gate II bugs when my patches come out half-assed like this. Hopefully, this will give enough info to Cam for him to whip up razzle-dazzle patches without having to troll throught the individual spells.

Posted

So I open up NI to look at the SPLs, and the very first thing I encounter is Grease's duration not accurately reflecting the description (it says 3 rounds + 1/level, but you actually get a duration of 10). Off to a good start!

Posted

I had bumbled across one of the legit ones a long time ago, and vaguely remembered it. I starting thumbing through the files, not even considering that a third level spell can't even be cast by someone below fifth level, which is a rather embarassing oversight. :)

 

In a vague attempt to actually spot in a wolf amidst my cries, the PC's innate Vampiric Touch and DUHM need some low-level headers as well.

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...