PRC8_fork/trunk/psionics/psi_pow_psyref.nss

133 lines
4.7 KiB
Plaintext
Raw Normal View History

/*
----------------
Psychic Reformation
psi_pow_psyref
----------------
25/3/05 by Stratovarius
*/ /** @file
Psychic Reformation
Telepathy [Mind-Affecting]
Level: Psion/wilder 4
Manifesting Time: 1 standard action
Range: Close (25 ft. + 5 ft./2 levels)
Target: One creature
Duration: Instantaneous
Saving Throw: None
Power Resistance: No
Power Points: 7, XP; see text
Metapsionics: None
When this power is manifested, the subject can choose to make again all the
decisions related to the latest level it has gained.
The subject can undo decisions of these sorts that were made at lower
levels, if both the subject and the manifester agree to pay the necessary XP
before this power is manifested (see below).
XP Cost: This power costs 50 XP to manifest to reformat choices made when
the character reached her current level. For each additional previous level
into which the revision reaches, the power costs an additional 50 XP. The
manifester and subject split all XP costs evenly.
Augmentation: For every additional power point you spend, the revision
reaches one level further. The XP cost is accordingly
increased, as specified above.
Implementation Note: This power may optionally be nerfed via a switch,
changing it's behaviour to only allow reselection of
psionic powers gained in the reformed levels.
*/
#include "psi_inc_psifunc"
#include "psi_inc_pwresist"
#include "psi_spellhook"
#include "prc_alterations"
/// Determines how long to wait before restoring the target's XP value
const float XP_RESTORE_DELAY = 1.0f;
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_EXTEND
);
if(manif.bCanManifest)
{
int nLevels = 1 + manif.nTimesAugOptUsed_1;
int nOrigXP = GetXP(oTarget);
int nOrigHD = GetHitDice(oTarget);
int nTargetHD = max(1, nOrigHD - nLevels);
int nXPCost = nLevels *
(GetPRCSwitch(PRC_PSI_PSYCHIC_REFORMATION_NERF) == 2 ?
25 : // If nerf is set, the XP cost may also be reduced to 25 per level
50 // Default is 50 per level
);
// Targeting restrictions. Reforming your opponent mid-battle would be quite nasty, so you only get to do it to allies :P
if(oTarget == oManifester ||
GetIsFriend(oTarget)
)
{
// Check whether a behaviour changing switch has been set
if(!GetPRCSwitch(PRC_PSI_PSYCHIC_REFORMATION_NERF))
{
// Level the target down
SetXP(oTarget, ((nTargetHD * (nTargetHD - 1)) / 2) * 1000);
// Schedule the OnLevelDown virtual event to be run right away
SetLocalInt(oTarget, "PRC_OnLevelDown_OldLevel", nOrigHD);
DelayCommand(0.0f, ExecuteScript("prc_onleveldown", oTarget));
}// end if - Default behaviour
else
{
// Nerfed - Only remove powers known tied to the reformed levels
int i = nOrigHD;
for(; i > nTargetHD; i--)
RemovePowersKnownOnLevel(oTarget, i);
}// end else - Only reform powers
// Level reduction is immediate, so restore XP right away to avoid mess with HB detecting level loss
if(oManifester == oTarget)
{
// Targeted self, pay full cost
SetXP(oTarget, nOrigXP - nXPCost);
}
else
{
// Targeted other, manifester pays half
SetXP(oManifester, GetXP(oManifester) - (nXPCost / 2));
// Target pays other half
SetXP(oTarget, nOrigXP - (nXPCost / 2));
}
}// end if - Targeting restrictions
}// end if - Successfull manifestation
}