133 lines
4.7 KiB
Plaintext
133 lines
4.7 KiB
Plaintext
/*
|
|
----------------
|
|
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
|
|
}
|