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