118 lines
4.0 KiB
Plaintext
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;
|
|
}
|