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