Jump to content


Whirlwind and Plague bugs (Kotor 1 and TSL)


Recommended Posts

The Whirlwind and Plague force powers are buggy.


- Whirlwind Kotor 1 description says it will incapacitate enemies for 12 sec:




No. This is not correct. The script applies the effect for 9 seconds only (=3 rounds). At least in Kotor 1. Fixed in Kotor 2 by Obsidian:


//ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink1, oTarget, 9.0);

//RWT-OEI 09/27/04 - QA says they fall too soon. Upping this to 12 to

//see if that fixes it. FMP#6266

ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink1, oTarget, 12.0);


Yet Bioware never bothered to fix this for Kotor 1! If the spell was supposed to last for 9 sec. only in Kotor 1, then at least Bioware should have fixed the spell description by now!


- The Plague spell is so buggy both in Kotor 1 and 2, it's unbelievable it passed quality testing!


Spell works completely differently from the description. Am I really the first one to notice this?!:




It's supposed to last 12 seconds (=4 rounds), dealing 1 point damage to each attribute every second.


Instead, it lasts 72 seconds (=24 rounds), dealing 1 point attribute damage every 6 seconds (=every second round). So basically it's an effective saving throw decrease of 1 point at most, given the enemy has an even number Con/Dex/Wis, unless you are willing to wait for over a minute until the spell kicks in fully.


Damn it! I knew there was something wrong! I was casting it on enemies in both Kotors and it's always just one point saving throw decrease. Now I understand why!


The spell effect in Kotor 1 is applied permanently (1000 seconds to be precise). This doesn't matter however, since the spell gets its duration from poison.2da, NOT from the spell script. Seems Obsidian didn't get this, cause they added the following to their k_inc_force.nss:


//Sp_ApplyEffects(FALSE, oTarget, 0.0, 1, eLink1, 1000.0, eInvalid, 0.0);

//RWT-OEI 09/27/04 - This is apparently supposed to be 12 seconds instead

//of permanent.

Sp_ApplyEffects(FALSE, oTarget, 0.0, 1, eLink1, 12.0, eInvalid, 0.0);


Obsidian, it doesn't matter what the script says, it's the "duration" column in poison.2da that defines the effect duration! That's where EffectPoison gets its duration from! And that is exactly the problem - poison.2da file has wrong values!:




Duration column: 72 -> change to 12

Period column: 6 -> change to 1


Same problem with Affliction!:




Spell duration set to 12 rounds, dealing 1 point attribute damage every 2 rounds. Yet the spell description says 7 rounds, 1 point attribute damage every single round!




Duration column value has to be 21

Period column value has to be 3


In Kotor 2, several enemies on Korriban have a saving throw DC of 60-100. Plague is supposed to be irresistable (DC =100), meaning it's supposed to have a success chance of 100 per cent. Yet the Raven phantom on Korriban has a Fortitude saving throw of 100, which ironically means the spell has a success chance of 0, yes, ZERO per cent! Why? Because even if Raven gets a roll of 1, it's still 100 + 1=101 vs. Plague DC 100! Saving throw successful, thank you very much Obsidian!


Same goes for Sion and several Sith Assassins on Korriban, if they get a roll of 20, they shoot right over 100 saving throw DC, saving themselves from Plague! Plague needs a DC of 121 to have 100 per cent of success:


Raven phantom: saving throw 100+Roll 20= 120 vs. Plague DC 121. Any lower DC than 121 reduces the success chance of this spell:


poison.2da, POISON_ABILITY_SCORE_VIRULENT row, dc_save column:


Change 100 to 121. Only necessary for Kotor 2

Link to comment
Share on other sites

  • 3 weeks later...

there's yet another problem with the Whirlwind spell, both Kotor 1 and TSL - it deals more damage than it should. The problem is with the following code:


ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDamage, oTarget);


the duration is not set, so the damage is applied once only, but it's still more damage than there should be, because damage is already handled by the following code:


SP_InterativeDamage(eDamage, 13, oTarget);


so if your jedi is level 12, for example, the spell should deal 6*4=24 pts damage, but instead a single casting of the spell actually applies 6*4+4=28 pts damage at lvl 12, because every time you cast the spell additional 1/3 of your caster lvl is applied in damage. So the first code line above needs to be removed.


And yet another problem with Plague and all other spells or special abilities that apply poison to a target: due to a hardcoded bug the poison effect is applied for a lesser amount of rounds than it should be, for example, if the effect is applied for 12 seconds, it should actually last for exactly 4 rounds, meaning you should be actually be able to cast 4 spells before it wears off, but it will often wear off 500-700 milliseconds before you cast your 4th spell, which basically leaves you with 3.8-3.9 rounds duration, which is completely and utterly useless.


To fix this, the duration should be increased by like 700 milliseconds, but since the effect is handled not through scripting, but through a hardcoded function relying on poison.2da, the changes must be done to the 2da file. I have to test this yet though. There's a duration column there, if you set the "POISON_ABILITY_SCORE_VIRULENT" duration to 12.7 it should actually allow you to cast 4 spells before plague wears off. The duration should not be increased to 13 seconds, because then the spell would be dealing more attribute damage than it should, since it applies -1 to all attributes each second


hmm, I just tested the poison function some more, and it seems poison.2da doesn't accept mathematical fractions, only natural numbers, so it's basically either 12 seconds or 13. 13 is too much, dealing more attribute damage than the spell should and 12 is not enough due to the bug described above. So it's best to delay the execution of the script by a couple of milliseconds. In k_inc_force.nss, find the plague script and change the line:


Sp_ApplyEffects(FALSE, oTarget, 0.0, 1, eLink1, 1000.0, eInvalid, 0.0);




DelayCommand(0.1f, Sp_ApplyEffects(FALSE, oTarget, 0.0, 1, eLink1, 1000.0, eInvalid, 0.0));


Use the same line for TSL too! As described above, Obsidian changed the duration of the spell from permanent to 12 sec., but the real duration is set in poison.2da anyway. Still, the Obsidian change is not without consequence, since if the number in the script is lower than the one in poison.2da, the hardcoded poison function and the hardcoded ApplyEffectToObject functions will interfere with each other, the game engine will become confused and remove the effect earlier than is set in poison.2da


0.1 float should be enough, but if not, try changing it to 0.2 or even higher, but don't set it too high, otherwise it will change the way the spell is supposed to work


Combined double post - please use the "edit" function for your posts in future -- j7

Link to comment
Share on other sites


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

  • Create New...