forked from Jaysyn/PRC8
Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
144 lines
5.1 KiB
Plaintext
144 lines
5.1 KiB
Plaintext
//:://////////////////////////////////////////////
|
|
//:: Teleportation Circle Auxiliary
|
|
//:: prc_telecirc_aux
|
|
//:://////////////////////////////////////////////
|
|
/** @file
|
|
Teleportation Circle auxiliary script, run on
|
|
the area of effect object created by the
|
|
spell / power or on the PC when they make
|
|
their selection about the target of the circle.
|
|
|
|
Creates the trapped trigger and, if this
|
|
is supposed to be a visible circle, starts
|
|
VFX heartbeat.
|
|
Also, starts monitor heartbeats on itself
|
|
and the trigger.
|
|
|
|
@author Ornedan
|
|
@date Created - 2005.10.25
|
|
@date Modified - 2006.06.04
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "spinc_telecircle"
|
|
|
|
void TrapMonitorHB(object oAoE)
|
|
{
|
|
if(DEBUG) DoDebug("prc_telecirc_aux: Running TrapMonitorHB on " + GetTag(OBJECT_SELF));
|
|
if(!GetIsObjectValid(oAoE))
|
|
{
|
|
if(DEBUG) DoDebug("prc_telecirc_aux: AoE no longer exists");
|
|
DestroyObject(OBJECT_SELF);
|
|
}
|
|
else
|
|
DelayCommand(6.0f, TrapMonitorHB(oAoE));
|
|
}
|
|
|
|
void AoEMonitorHB()
|
|
{
|
|
if(DEBUG) DoDebug("prc_telecirc_aux: Running AoEMonitorHB on " + GetTag(OBJECT_SELF));
|
|
// Loop over all traps and see if they still exist
|
|
int i;
|
|
for(i = 0; i < TC_NUM_TRAPS; i++)
|
|
{
|
|
if(!GetIsObjectValid(GetLocalObject(OBJECT_SELF, "Trap_" + IntToString(i))))
|
|
{
|
|
if(DEBUG) DoDebug("prc_telecirc_aux: Trap " + IntToString(i) + " no longer exists");
|
|
DestroyObject(OBJECT_SELF);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Got this far, all traps are OK
|
|
DelayCommand(6.0f, AoEMonitorHB());
|
|
}
|
|
|
|
void VFXHB(location lCenter)
|
|
{
|
|
// Do a smoke puff pentagram. Cliche - but meh :P
|
|
DrawPentacle(DURATION_TYPE_INSTANT, VFX_FNF_SMOKE_PUFF, lCenter,
|
|
FeetToMeters(5.0f), // Radius
|
|
0.0f, // VFX Duration
|
|
40, // # of nodes - orig 50
|
|
2.0f, // Number of revolutions
|
|
6.0f, // Time for drawing
|
|
0.0f, "z" // Angle offset and axis
|
|
);
|
|
DrawCircle(DURATION_TYPE_INSTANT, VFX_FNF_SMOKE_PUFF, lCenter, FeetToMeters(5.0f),
|
|
0.0f, 24 /*36*/, 1.0f, 6.0f, 0.0f, "z"
|
|
);
|
|
|
|
DelayCommand(6.0f, VFXHB(lCenter));
|
|
}
|
|
|
|
void main()
|
|
{
|
|
// Check whether we are running for the PC who selected the location the circle points at or for the area of effect object
|
|
if(GetTag(OBJECT_SELF) != Get2DACache("vfx_persistent", "LABEL", AOE_PER_TELEPORTATIONCIRCLE))
|
|
{
|
|
object oPC = OBJECT_SELF;
|
|
// Finish the casting
|
|
TeleportationCircleAux(oPC);
|
|
}
|
|
// Or for the circle AoE to initialise it
|
|
else
|
|
{
|
|
object oAoE = OBJECT_SELF;
|
|
object oArea = GetArea(oAoE);
|
|
object oTrap;
|
|
int bVisible = GetLocalInt(oAoE, "IsVisible");
|
|
int i;
|
|
vector vPosition = GetPosition(oAoE);
|
|
float fSideLength = FeetToMeters(2.5f) * sqrt(2.0f);
|
|
|
|
// Spawn a series of traps at lTarget, rotated by a certain offset relative to each other
|
|
for(i = 0; i < TC_NUM_TRAPS; i++)
|
|
{
|
|
oTrap = CreateTrapAtLocation(TRAP_BASE_TYPE_TELECIRCLE,
|
|
Location(oArea, vPosition, (90.0f / TC_NUM_TRAPS) * i),
|
|
fSideLength, // Length of the square's sides
|
|
"PRC_TELECIRCLE_TRAP_" + IntToString(i), // Tag of the trap
|
|
STANDARD_FACTION_HOSTILE, // Faction of the trap - this may or may not cause problems
|
|
"prc_telecirc_dis", // OnDisarm script
|
|
"" // OnTrigger script - nothing
|
|
);
|
|
if(!GetIsObjectValid(oTrap))
|
|
{
|
|
string sErr = "prc_telecirc_aux: ERROR: Failed to create trap " + IntToString(i) + "!";
|
|
if(DEBUG) DoDebug(sErr);
|
|
else WriteTimestampedLogEntry(sErr);
|
|
|
|
// Abort the the circle creation
|
|
DestroyObject(oAoE);
|
|
return;
|
|
}
|
|
|
|
// Set the trap to reset itself after being triggered
|
|
SetTrapOneShot(oTrap, FALSE);
|
|
|
|
// Set the trap to not be recoverable
|
|
SetTrapRecoverable(oTrap, FALSE);
|
|
|
|
// Set the detection DC - 0 if visible, 34 if hidden
|
|
SetTrapDetectDC(oTrap, bVisible ? 0 : 34);
|
|
|
|
// Store references to each other
|
|
SetLocalObject(oAoE, "Trap_" + IntToString(i), oTrap);
|
|
SetLocalObject(oTrap, "AreaOfEffectObject", oAoE);
|
|
|
|
// Start the trap's monitor HB
|
|
AssignCommand(oTrap, TrapMonitorHB(oAoE));
|
|
}
|
|
|
|
// Start the AoE's monitor HB
|
|
AssignCommand(oAoE, AoEMonitorHB());
|
|
|
|
// Do VFX
|
|
if(bVisible)
|
|
AssignCommand(oAoE, VFXHB(GetLocation(oAoE)));
|
|
|
|
// Mark the initalisation being done
|
|
SetLocalInt(oAoE, "PRC_TeleCircle_AoE_Inited", TRUE);
|
|
}
|
|
} |