PRC8/nwn/nwnprc/trunk/psionics/psi_pow_retrieve.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

127 lines
4.6 KiB
Plaintext

/*
----------------
Retrieve
psi_pow_retrieve
----------------
27/3/05 by Stratovarius
*/ /** @file
Retrieve
Psychoportation (Teleportation)
Level: Psion/wilder 6
Manifesting Time: 1 standard action
Range: Medium (100 ft. + 10 ft./ level)
Target: One object you can hold or carry in one hand, weighing up to 10 lb./level
Duration: Instantaneous
Saving Throw: Will negates; see text
Power Resistance: No
Power Points: 11
Metapsionics: None
You automatically teleport an item you can see within range directly to your
hand. If the object is in the possession of an opponent, it comes to your
hand if your opponent fails a Will save. *
Augment: For every additional power point you spend, the weight limit of the
target increases by 10 pounds.
Implementation notes:
WARNING: The method used for moving the object involves creating a copy and
destroying the original. This may break some modules.
* The power will only take a weapon from the main hand if targeted at a
creature, and only if that creature is set to be disarmable.
*/
#include "psi_inc_psifunc"
#include "psi_inc_pwresist"
#include "psi_spellhook"
#include "prc_inc_spells"
#include "prc_inc_teleport"
void main()
{
/*
Spellcast Hook Code
Added 2004-11-02 by Stratovarius
If you want to make changes to all powers,
check psi_spellhook to find out more
*/
if (!PsiPrePowerCastCode())
{
// If code within the PrePowerCastHook (i.e. UMD) reports FALSE, do not run this spell
return;
}
// End of Spell Cast Hook
object oManifester = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
struct manifestation manif =
EvaluateManifestation(oManifester, oTarget,
PowerAugmentationProfile(PRC_NO_GENERIC_AUGMENTS,
1, PRC_UNLIMITED_AUGMENTATION
),
METAPSIONIC_NONE
);
if(manif.bCanManifest)
{
int nDC = GetManifesterDC(oManifester);
int nMaxWeight = 100 * (manif.nManifesterLevel + manif.nTimesAugOptUsed_1); // Weight is tenths of a pound
// Make sure the target can be teleported
if(GetCanTeleport(oTarget, GetLocation(oTarget), TRUE))
{
// If target is an item
if(GetObjectType(oTarget) == OBJECT_TYPE_ITEM)
{
// And light enough
if(GetWeight(oTarget) <= nMaxWeight)
{
// Copy it
CopyItem(oTarget, oManifester, FALSE);
MyDestroyObject(oTarget); // Make sure the item does get destroyed
}
else
FloatingTextStrRefOnCreature(16824062, oManifester, FALSE); // "This item is too heavy for you to pick up"
}// end if - Target is an item
else if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
{
// Check disarmability
if(GetIsCreatureDisarmable(oTarget) && !GetPRCSwitch(PRC_PNP_DISARM))
{
// Let the AI know
PRCSignalSpellEvent(oTarget, TRUE, manif.nSpellID, oManifester);
// Save - Will negates
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_NONE))
{
// Target the creature's mainhand weapon
oTarget = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);
// Check that there was anything in the slot
if(GetIsObjectValid(oTarget))
{
// Make sure it's light enough
if(GetWeight(oTarget) <= nMaxWeight)
{
// Copy it and destroy the original
CopyItem(oTarget, oManifester, FALSE);
MyDestroyObject(oTarget); // Make sure the item does get destroyed
}
else
FloatingTextStrRefOnCreature(16824062, oManifester, FALSE); // "This item is too heavy for you to pick up"
}// end if - There is a weapon to yoink
}// end if - Save
}// end if - Target is disarmable
}// end else - Target is a creature
}// end if - Teleportability check
}// end if - Successfull manifestation
}