PRC8_fork/trunk/psionics/psi_ast_con_man.nss
Jaysyn904 1662218bb4 Initial upload.
Adding base PRC 4.19a files to repository.
2022-10-07 13:51:24 -04:00

118 lines
4.0 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Power: Astral Construct
//:: psi_ast_con_man
//:://////////////////////////////////////////////
/** @file
Creates an astral construct as specified by the
contents of a set of local variables set by
the Astral Contruct Options conversation.
@author Ornedan
@date Created - 2005.01.26
@date Modified - 2006.01.31
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
#include "psi_inc_ac_manif"
#include "psi_spellhook"
//////////////////////////////////////////////////
/* Constant defintions */
//////////////////////////////////////////////////
const int AC_SLOT_1 = 14036;
const int AC_SLOT_2 = 14037;
const int AC_SLOT_3 = 14038;
const int AC_SLOT_4 = 14039;
//////////////////////////////////////////////////
/* Function prototypes */
//////////////////////////////////////////////////
/**
* Determines which slot was used for this manifestation.
*
* @param nSpellID The spellID of this particular manifestation
* @return The number of the slot used
*/
int GetACSlotUsed(int nSpellID);
//////////////////////////////////////////////////
/* Function defintions */
//////////////////////////////////////////////////
void main()
{
if (!PsiPrePowerCastCode()){ return; }
// End of Spell Cast Hook
object oManifester = OBJECT_SELF;
string sSlot = IntToString(GetACSlotUsed(PRCGetSpellId()));
int nACLevel = GetLocalInt(oManifester, ASTRAL_CONSTRUCT_LEVEL + sSlot);
if(nACLevel < 1 || nACLevel > 9)
{
SendMessageToPCByStrRef(oManifester, STRREF_INVALID_CONSTRUCT_IN_SLOT);
return;
}
// Check if the manifester can. Since AC is sort of a special case in the augmenting
// scheme, we need to temporarily change the value of augmentation
// Do the augmentation override
struct user_augment_profile uapOverride;
uapOverride.nOption_1 = nACLevel - 1; // The other options are left auto-initialised to 0
SetAugmentationOverride(oManifester, uapOverride);
// Determine manifestation
struct manifestation manif;
manif = EvaluateManifestation(oManifester, OBJECT_INVALID,
PowerAugmentationProfile(PRC_NO_GENERIC_AUGMENTS,
2, PRC_UNLIMITED_AUGMENTATION
),
METAPSIONIC_EXTEND /*| METAPSIONIC_TWIN Can't be used as long as the effect is a real summon and not a henchmand*/
);
if(!manif.bCanManifest)
return;
int nOptionFlags = GetLocalInt(oManifester, ASTRAL_CONSTRUCT_OPTION_FLAGS + sSlot);
int nResElemFlags = GetLocalInt(oManifester, ASTRAL_CONSTRUCT_RESISTANCE_FLAGS + sSlot);
int nETchElemFlags = GetLocalInt(oManifester, ASTRAL_CONSTRUCT_ENERGY_TOUCH_FLAGS + sSlot);
int nEBltElemFlags = GetLocalInt(oManifester, ASTRAL_CONSTRUCT_ENERGY_BOLT_FLAGS + sSlot);
DoAstralConstructCreation(manif, GetSpellTargetLocation(), nACLevel,
nOptionFlags, nResElemFlags, nETchElemFlags, nEBltElemFlags);
// Mark the slot manifested out of on the manifester
SetLocalString(oManifester, MANIFESTED_SLOT, sSlot);
}
int GetACSlotUsed(int nSpellID)
{
int nRet;
switch(nSpellID)
{
case AC_SLOT_1: nRet = 1; break;
case AC_SLOT_2: nRet = 2; break;
case AC_SLOT_3: nRet = 3; break;
case AC_SLOT_4: nRet = 4; break;
default: nRet = -1;
}
if(DEBUG) DoDebug("GetACSlotUsed():\n"
+ "nSpellID = " + IntToString(nSpellID) + "\n"
+ "nRet = " + IntToString(nRet) + "\n"
);
return nRet;
}