Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
116 lines
3.4 KiB
Plaintext
116 lines
3.4 KiB
Plaintext
/*:://////////////////////////////////////////////
|
|
//:: Spell Name Forcecage: On Heartbeat
|
|
//:: Spell FileName PHS_S_ForcecageC
|
|
//:://////////////////////////////////////////////
|
|
//:: Spell Effects Applied / Notes
|
|
//:://////////////////////////////////////////////
|
|
Needs 4 placeables for the bars, and an AOE within the centre of it. If
|
|
any of the bars are destroyed (via. disintegration ETC), it means the entire
|
|
spell collapses.
|
|
|
|
The AOE is plotted too, and does the correct 50% vs ranged attack consealment
|
|
as they will have to shoot through the bars.
|
|
|
|
On Heartbeat:
|
|
|
|
- Round 1. We set the placeables used as walls from the caster to us, and set us to plot.
|
|
- First 2 rounds: If there is no one in the area in the first 2 rounds, it will collapse
|
|
- Every round: If any of the 4 walls are destroyed by magic, it will collapse.
|
|
|
|
-Collapsing-
|
|
- Destroys any of the walls left
|
|
- Destroys ourselves
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Jasperre
|
|
//::////////////////////////////////////////////*/
|
|
|
|
#include "PHS_INC_SPELLS"
|
|
|
|
// Destroys self, and any remaining barriers.
|
|
void Collapse(object oSelf, string sSetup);
|
|
|
|
void main()
|
|
{
|
|
// Setup variables
|
|
object oCaster = GetAreaOfEffectCreator();
|
|
object oSelf = OBJECT_SELF;
|
|
// We always start nRoundsDone on 1, so the first heartbeat this is 1.
|
|
int nRoundsDone = PHS_IncreaseStoredInteger(oSelf, "PHS_FORCECAGE_SETUP");
|
|
string sSetup = "PHS_FORCEWALL_WALL";
|
|
string sTotal;
|
|
object oObject;
|
|
int nCnt;
|
|
if(nRoundsDone == 1)
|
|
{
|
|
for(nCnt = 1; nCnt <= 4; nCnt++)
|
|
{
|
|
sTotal = sSetup + IntToString(nCnt);
|
|
// Set it from the casters variable
|
|
SetLocalObject(oSelf, sTotal, GetLocalObject(oCaster, sTotal));
|
|
// Delete it from the caster
|
|
DeleteLocalObject(oCaster, sTotal);
|
|
}
|
|
}
|
|
|
|
// Check AOE creator, check the 4 forcewalls, check if anyone is in the AOE.
|
|
if(!GetIsObjectValid(oCaster))
|
|
{
|
|
// Go
|
|
Collapse(oSelf, sSetup);
|
|
return;
|
|
}
|
|
// Check if we are in the first or second round
|
|
if(nRoundsDone <= 2)
|
|
{
|
|
// Check validity of objects in the AOE
|
|
oObject = GetFirstInPersistentObject(OBJECT_SELF, OBJECT_TYPE_CREATURE);
|
|
if(!GetIsObjectValid(oObject))
|
|
{
|
|
// Go
|
|
Collapse(oSelf, sSetup);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Check the 4 walls are still there
|
|
for(nCnt = 1; nCnt <= 4; nCnt++)
|
|
{
|
|
sTotal = sSetup + IntToString(nCnt);
|
|
// Get the wall at the position
|
|
oObject = GetLocalObject(oSelf, sTotal);
|
|
|
|
if(!GetIsObjectValid(oObject))
|
|
{
|
|
// Go
|
|
Collapse(oSelf, sSetup);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Destroys self, and any remaining barriers.
|
|
void Collapse(object oSelf, string sSetup)
|
|
{
|
|
string sTotal;
|
|
object oObject;
|
|
int nCnt;
|
|
// Check the 4 walls and destroy any left.
|
|
for(nCnt = 1; nCnt <= 4; nCnt++)
|
|
{
|
|
sTotal = sSetup + IntToString(nCnt);
|
|
// Get the wall at the position
|
|
oObject = GetLocalObject(oSelf, sTotal);
|
|
|
|
if(GetIsObjectValid(oObject))
|
|
{
|
|
// Destory it
|
|
SetPlotFlag(oObject, FALSE);
|
|
DestroyObject(oObject);
|
|
}
|
|
}
|
|
|
|
// Set our plot flag to false and go ourselves
|
|
SetPlotFlag(oSelf, FALSE);
|
|
DestroyObject(oSelf);
|
|
}
|