PRC8/nwn/nwnprc/trunk/scripts/poison_appl_food.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
Updated AMS marker feats.  Removed arcane & divine marker feats.  Updated Dread Necromancer for epic progression. Updated weapon baseitem models.  Updated new weapons for crafting & npc equip.
 Updated prefix.  Updated release archive.
2024-02-11 14:01:05 -05:00

130 lines
4.8 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Poison Food spellscript
//:: poison_appl_food
//::///////////////////////////////////////////////
/** @file
Applies a poison to the targeted food item based on
local integer "pois_idx" on the item being cast from.
The last 3 letters of the item's tag will be used instead
if the following module switch is set:
PRC_USE_TAGBASED_INDEX_FOR_POISON
Any non-contact poison will have no effect. An already
poisoned food cannot be poisoned again.
Whether an object is food or not is determined by
executing a script called "poison_is_food".
This script is not present in it's compiled form in
the hak, so you can compile it in your module without
having to take it out of the hak.
You need to add your own checks into that script, as
by default it only returns false.
The item will have a 2 local integers applied to it:
pois_food_idx - The number of poison to use. A line
in poison.2da
pois_food - Set to TRUE. Because idx can have 0
as it's value, this is needed for
absolute certainty about whether the
food is poisoned.
For the poisoned food to have any effect, you will have to
hook "poison_eat_hook" into wherever you handle eating & drinking
in your module. The hook checks for presence of poison on the food
item, so you needn't add such check to your own script.
Add the following lines to such script(s):
SetLocalObject(GetModule(), "poison_eat_hook_item", oFood);
ExecuteScript("poison_eat_hook", oEater);
DeleteLocalObject(GetModule(), "poison_eat_hook_item");
oFood - Whichever item was eaten or drunk. This should hold
the pois_food and pois_food_idx locals.
oEater - Whomever does the eating. This is the target to be poisoned.
*/
//:://////////////////////////////////////////////
//:: Created By: Ornedan
//:: Created On: 10.01.2005
//:://////////////////////////////////////////////
#include "prc_alterations"
#include "inc_poison"
void main()
{
object oItem = GetSpellCastItem();
object oPC = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
// Make sure the target is an item
if (oTarget == OBJECT_INVALID || GetObjectType(oTarget) != OBJECT_TYPE_ITEM)
{
SendMessageToPCByStrRef(oPC, STRREF_INVALID_TARGET); // * Target is not an item *
return;
}
// Make sure the target is some type of food or drink
// Get the name of the script to run from a switch. If it's not present, use default
string sIsFoodScriptName = GetLocalString(GetModule(), PRC_POISON_IS_FOOD_SCRIPT_NAME);
if(sIsFoodScriptName == "") sIsFoodScriptName = "poison_is_food";
// Run it
if(!ExecuteScriptAndReturnInt(sIsFoodScriptName, oTarget))
{
SendMessageToPCByStrRef(oPC, STRREF_TARGET_NOT_FOOD); // "Target is not food."
return;
}
// Get the 2da row to lookup the poison from
int nRow;
if(GetPRCSwitch(PRC_USE_TAGBASED_INDEX_FOR_POISON))
nRow = StringToInt(GetStringRight(GetTag(oItem), 3));
else
nRow = GetLocalInt(oItem, "pois_idx");
// Some paranoia re. valid values
if (nRow < 0)
{
SendMessageToPCByStrRef(oPC, 83360); //"Nothing happens
WriteTimestampedLogEntry ("Error: Item with resref " +GetResRef(oItem)+ ", tag " +GetTag(oItem) + " has the PoisonFood spellscript attached but "
+ (GetPRCSwitch(PRC_USE_TAGBASED_INDEX_FOR_POISON) ? "it's tag" : "it's local integer variable 'pois_idx'")
+ " contains an invalid value!");
return;
}
// Make sure the poison is a contact poison
if(GetPoisonType(nRow) != POISON_TYPE_INGESTED)
{
SendMessageToPCByStrRef(oPC, STRREF_NOT_INGESTED_POISON);
return;
}
/* If item is already poisoned, inform user and stop. */
if(GetLocalInt(oTarget, "pois_food"))
{
SendMessageToPCByStrRef(oPC, STRREF_TARGET_ALREADY_POISONED);
return;
}
/** Done with the paranoia, now to start applying the poison **/
// * Force attacks of opportunity
AssignCommand(oPC, ClearAllActions(TRUE));
SetLocalInt(oTarget, "pois_itm_idx", nRow);
SetLocalInt(oTarget, "pois_food", TRUE);
// Inform player
SendMessageToPC(oPC,
GetStringByStrRef(STRREF_POISON_FOOD_USE_1) + " " +
GetStringByStrRef(StringToInt(Get2DACache("poison", "Name", nRow))) + " " +
GetStringByStrRef(STRREF_POISON_FOOD_USE_2) + " " +
GetName(oTarget) + "."
); //"You put some xxxx into yyyy"
}