Further file organization
Further file organization
This commit is contained in:
130
nwn/nwnprc/trunk/scripts/poison_appl_food.nss
Normal file
130
nwn/nwnprc/trunk/scripts/poison_appl_food.nss
Normal file
@@ -0,0 +1,130 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: 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"
|
||||
}
|
Reference in New Issue
Block a user