I decided to take a closer look at “poisons” and “diseases”, as I hope to unravel and use them a little more in my second module, Predestinated Days. At first glance, I think there are a few points that need clarifying for me … or points I am considering working on.
A few questions …
It seems to me that a creature item (eg: Ghast Claw) that can give “Ghoul Fever” may suggest one DC (in its item properties), but actually be that set via the disease.2da description. EG: Properties says DC16 and 2da has 18. In practice, the 2da is the correct DC. Anyone able to confirm or add info here?
If I recall correctly, these areas of code may now be more “hard-coded”. Again, anyone able to confirm or deny where exactly? For instance, I don’t see where the save versus DC is set for the above disease example. In the game, it saves vs fortitude, but where is this determined? Maybe I missed it? Or is this part of what is hard-coded for disease type checks? Is a disease save always vs fortitude?
Any other observations from anyone that I may want to keep in mind? Eg: Are all diseases and poisons still available in some way? EG: If I applied the Red Slaad Eggs disease and made a correct template for the slaad, do the scripts for that disease still work … or have they been disabled in some other way?
Thank you for responding, but, unfortunately, you misread my post.
I know all that you wrote … My questions were more specific to actual NWN mechanics as supplied in the toolset and how they are implemented. Take a closer read to see what I mean.
Perhaps, as an example of the third question, I should have been more clear and say something like, “Has anyone, like yourself, confirmed they have the Red Slaad Eggs disease up and running”? If so, were you able to alter what a PC saved against? And, where did you set the DC property for the disease when coming from a creature attack? (Or does that get ignored, like a Ghast claw attack property?)
itemproperty ip = ItemPropertyOnMonsterHitProperties(IP_CONST_ONMONSTERHIT_POISON, nRow);
The function description says that this cannot apply the effect to a weapon, and yet …
IF WE PASS nRow AS 11 … IT DOES APPEAR TO WORK. (Black Adder Venom.) ( * )
BUT IF WE PASS nRow AS 18 … IT DOES NOT APPEAR TO WORK. (Carrion Crawler.) ( * )
( * ) On a dagger in a test.
Any understanding of what is happening here?
I’ll try messing around a bit more, but any other feedback from others who may have already looked at this closer may be helpful.
EDIT: OK, In further testing, I have so far found that the function works if the row value passed to the poison.2da is a value of 13 or less. In a quick test, it even appeared to fire the script attached to the poison, which means we may be able to re-employ the first 13 rows (14 counting line zero) to more “special” poisons and have them work via a weapon still.
Did you ever succeed in applying poisons above row 13 using scripting? I cannot see any way of applying more than this set number from a poison.2da that also uses additional scripts for weapons. Are you able to shed any light here? (i.e. It sounds like you got Dragon Bile @ 15 to work, but I have not been successful in applying that as a “memorable” or “detectable” property.) EG: I was working on a “Carrion_Crawler_Brain_Juice” (18) poison and it does not fire off its script from a successful hit of a weapon that supposedly has it applied. i.e. ITEM_PROPERTY_ON_MONSTER_HIT only appears to be applied as a detectable property if the row number for which it applies is 13 or less.
While we can have some of the poisons work from poison.2da using the unadvisable “ItemPropertyOnMonsterHitProperties” function, we CANNOT (by default) get any of the attached scripts to also fire from this 2da as it currently works. (I am working on an alternative system to make use of this.)
There is also the added issue that we cannot detect the presence of ITEM_PROPERTY_ON_MONSTER_HIT when applied using a row > 13 from the poison.2da. However, this is surmountable using normal variables, which is then used to determine if the poison is already applied or not.
Bottom line … As it currently stands, the poison.2da only partially works with weapons when using the “ItemPropertyOnMonsterHitProperties” function. I am going to see if I can get a system working that associates scripts to fire too. (I’ll report back.)
I was able to simply store the script to run on the weapon (after referencing the poison.2da), and check for impact on a creature during combat.
The poison.2da script then runs. I have only tested the first script instance, but see no reason why a delayed second script would not work too.
The only caveat (as such) is that these scripts run either immediately on impact, or a minute later as a secondary script regardless, unless the creature is immune to poison. i.e. They fire whether the creature makes any initial poison save or not (if fired). However, you can always update the scripts individually to allow the PC to have another saving throw for the scripted event if preferred. HOWEVER, I think this is how the mechanics for the script additions is supposed to work anyway.
EG: Blue_Whinnis will fire its initial checks for poison and (if the save is failed) apply its 1 CON damage as normal. However, currently, the default system does not fire the attached NW_S0_2BluWhinn secondary script (making a creature unconscious for ten rounds) in my testing. My new approach allows these additional scripts to play alongside these poisons again. My point being, this secondary script will always fire after one minute after impact even if the creature makes the initial poison save to prevent the CON damage. Therefore, it may be worth adding the additional save at the time the secondary poison kicks in. I would also probably add a check for Neutralise Poison being in place.
DISEASE 2DA: System works fine … scripts fire as expected. No need for any updates as far as I can see.
EDIT: I am also trying to work another method, which may then work more like the original system. i.e. Applying the poison direct to the creature, which will trigger the saves and scripts.
I managed to make the new poison system a lot simpler by just using one “poison” ref on the weapon that fires the poison attack directly on the creature if they are not immune to poison. The creature then makes a saving throw, and if fails, the poison scripts run just like they would have done in the old NWN system.
Check out the chat window (and examine) where Barran failed and succumbed to poison. In this test example, the poison was “Carrion Crawler Brain Juice” and he is paralysed until he can make a save.
I was able to implement some more diseases long ago in my campaign, such as “lung rot” for the Underdark. I recall being able to give some specific disease-causing capabilities to some creatures as well, but that was years ago. Part of what I did was add entries to the disease.2da. It looks like you found your solution though, so congratulations!
I found that the diseases 2DA appears to work as expected. It was the changes in the way poisons worked between NWN1 and NWN2 that I wanted to address, as I like the way we can specialise events with scripts. In NWN2, this ability was removed, but the system I use now allows me to bring it back. Eg The poison example I demonstrate above … Potential paralysis and not just attribute damage.
I built a system, which is available in my own campaign (that can be downloaded), but have not released a stand-alone system to date. As the system I use requires working around some other aspects of my campaign, I would have had to double my workload if I tried to release it as a separate system.
It does work well though, from what I have managed to test to date. As you can appreciate, however, until it has had a thorough testing with all potential poisons (which I have not done yet), then I suppose there could be room for tweaks required. However, the system worked as I currently have it, and have effectively two poison systems running alongside one another, which is explained in the campaign itself.
Thanks for asking.
EDIT: I updated both the nx1_s2_poisonwp and the x2_s2_poisonwp scripts. (I could post the scripts?, but they refer to libraries and likely variables set elsewhere. Better to review them in the context of the entire campaign setting, so you can refer to supporting scripts.)