PRC8/nwn/nwnprc/trunk/scripts/prc_maze_mvtrig.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
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.
2024-02-11 14:01:05 -05:00

108 lines
3.3 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Maze area movement trigger onenter
//:: prc_maze_mvtrig
//:://////////////////////////////////////////////
/** @file
This script is used with the Maze spell's maze
area movement control triggers. It determines
the directions the PC can go and randomly
selects one. If possible, it avoids moving
to the same direction the PC came from.
The directions possible are stored as bit flags
on a local integer called "directions" on the
trigger.
The non-preferred direction is stored as
local integer "PRC_Maze_Direction" on the creature.
@author Ornedan
@date Created - 2005.10.6
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
#include "prc_alterations"
#include "spinc_maze"
int SelectRandomDirection(int nPosDirFlags, int nNumDirs)
{
// Determine which of the possible directions to use
int nChoice;
switch(nNumDirs)
{
case 1:
nChoice = 1;
break;
case 2:
nChoice = d2();
break;
case 3:
nChoice = d3();
break;
}
// Determine the choiceth direction
int nFound = 0, i;
for(i = EAST; i <= NORTH; i <<= 4)
{
if(nPosDirFlags & i){
nFound++;
if(LOCAL_DEBUG) DoDebug("prc_maze_mvtrig: SelectRandomDirection(): Found a 1 bit, value = " + DebugDir2String(i) + "\nRemaining to find: " + IntToString(nChoice - nFound));
}
if(nFound == nChoice)
return i;
}
string s = "";
if(nPosDirFlags & NORTH) s += " NORTH";
if(nPosDirFlags & SOUTH) s += " SOUTH";
if(nPosDirFlags & WEST) s += " WEST";
if(nPosDirFlags & EAST) s += " EAST";
if(LOCAL_DEBUG) DoDebug("prc_maze_mvtrig: SelectRandomDirection(): ERROR: Direction not chosen in loop! Possible directions: " + s);
return 0;
}
void main()
{
object oCreature = GetEnteringObject();
int nDirCameFrom = GetLocalInt(oCreature, "PRC_Maze_Direction");
int nPosDirFlags = GetLocalInt(OBJECT_SELF, "directions");
int nNumDirs = 0;
int nChoice;
// Nuke the old forbidden direction
// Determine how many directions are possible
if(nPosDirFlags & NORTH) nNumDirs++;
if(nPosDirFlags & SOUTH) nNumDirs++;
if(nPosDirFlags & WEST) nNumDirs++;
if(nPosDirFlags & EAST) nNumDirs++;
if(LOCAL_DEBUG) DoDebug("prc_maze_mvtrig: Possible directions = " + IntToString(nNumDirs) + "; Non-preferred direction: " + DebugDir2String(nDirCameFrom));
switch(nNumDirs)
{
case 1:
// Go to the only possible direction
if(nPosDirFlags & NORTH) GoDirection(oCreature, NORTH);
if(nPosDirFlags & SOUTH) GoDirection(oCreature, SOUTH);
if(nPosDirFlags & WEST) GoDirection(oCreature, WEST);
if(nPosDirFlags & EAST) GoDirection(oCreature, EAST);
break;
case 2:
case 3:
case 4:
nChoice = SelectRandomDirection(nPosDirFlags ^ nDirCameFrom, nNumDirs - 1); // Remove the direction the creature came from from the set of possibilities
GoDirection(oCreature, nChoice);
break;
default:
if(LOCAL_DEBUG) DoDebug("prc_maze_mvtrig: ERROR: No directions defined on trigger");
}
}