SBSPSS/source/enemy/npcpath.cpp
Charles c33e2a4acd
2001-01-16 21:56:29 +00:00

130 lines
No EOL
1.9 KiB
C++

/*=========================================================================
npcpath.cpp
Author: CRB
Created:
Project: Spongebob
Purpose:
Copyright (c) 2000 Climax Development Ltd
===========================================================================*/
#ifndef __ENEMY_NCPPATH_H__
#include "enemy\ncppath.h"
#endif
bool CNpcWaypoint::isPointNear( DVECTOR testPos )
{
s32 xDistSqr, yDistSqr;
xDistSqr = testPos.vx - this->pos.vx;
xDistSqr *= xDistSqr;
yDistSqr = testPos.vy - this->pos.vy;
yDistSqr *= yDistSqr;
if ( xDistSqr + yDistSqr < 100 )
{
return( true );
}
else
{
return( false );
}
}
void CNpcPath::initPath()
{
int loop;
for ( loop = 0 ; loop < NPC_MAX_WAYPOINTS ; loop++ )
{
waypoint[loop].pos.vx = 0;
waypoint[loop].pox.vy = 0;
}
pathType = SINGLE_USE_PATH;
currentWaypoint = 0;
waypointCount = 0;
reversePath = false;
}
void CNpcPath::addWaypoint( DVECTOR newPos )
{
if ( waypointCount < NPC_MAX_WAYPOINTS )
{
waypoint[waypointCount] = newPos;
waypointCount++;
}
}
void CNpcPath::setPathType( NPC_PATH_TYPE newPathType )
{
pathType = newPathType;
}
bool CNpcPath::incPath()
{
if ( !reversePath )
{
if ( currentWaypoint < waypointCount )
{
currentWaypoint++;
}
else
{
switch( pathType )
{
case SINGLE_USE_PATH:
// path is completed
return( true );
case REPEATING_PATH:
// go back to start
currentWaypoint = 0;
break;
case PONG_PATH:
// reverse path
reversePath = !reversePath;
currentWaypoint--;
break;
}
}
}
else
{
// must be pong path if reversed
if ( currentWaypoint > 0 )
{
currentWaypoint--;
}
else
{
reversePath = !reversePath;
currentWaypoint++;
}
}
return( false );
}
void CNpcPath::think( DVECTOR currentPos )
{
CNpcWaypoint *currentWaypoint;
currentWaypoint = &waypoint[currentWaypoint]
if ( currentWaypoint->isPointNear( currentPos ) )
{
incPath();
}
}