This commit is contained in:
Charles 2001-04-18 23:12:24 +00:00
parent f338710074
commit 63598d2f73
17 changed files with 363 additions and 72 deletions

View File

@ -78,7 +78,8 @@ enemy_src := npc \
nworm \ nworm \
nhcrab \ nhcrab \
nbblob \ nbblob \
npuffa npuffa \
ngen
projectl_src := projectl projectl_src := projectl

26
source/enemy/ngen.cpp Normal file
View File

@ -0,0 +1,26 @@
/*=========================================================================
ngen.cpp
Author: CRB
Created:
Project: Spongebob
Purpose:
Copyright (c) 2001 Climax Development Ltd
===========================================================================*/
#ifndef __ENEMY_NGEN_H__
#include "enemy\ngen.h"
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CNpcEnemyGenerator::render()
{
// do nothing
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

28
source/enemy/ngen.h Normal file
View File

@ -0,0 +1,28 @@
/*=========================================================================
ngen.h
Author: CRB
Created:
Project: Spongebob
Purpose:
Copyright (c) 2001 Climax Development Ltd
===========================================================================*/
#ifndef __ENEMY_NGEN_H__
#define __ENEMY_NGEN_H__
#ifndef __ENEMY_NPC_H__
#include "enemy\npc.h"
#endif
class CNpcEnemyGenerator : public CNpcEnemy
{
public:
void render();
};
#endif

View File

@ -261,6 +261,7 @@ void CNpcEnemy::init()
m_timerFunc = m_data[this->m_type].timerFunc; m_timerFunc = m_data[this->m_type].timerFunc;
m_sensorFunc = m_data[this->m_type].sensorFunc; m_sensorFunc = m_data[this->m_type].sensorFunc;
m_movementFunc = m_data[this->m_type].movementFunc;
m_controlFunc = NPC_CONTROL_MOVEMENT; m_controlFunc = NPC_CONTROL_MOVEMENT;
@ -560,6 +561,23 @@ void CNpcEnemy::postInit()
break; break;
} }
case NPC_INIT_SPIDER_CRAB:
{
m_npcPath.setPathType( CNpcPath::PONG_PATH );
if ( m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, 16 ) < 0 )
//if ( m_layerCollision->Get( Pos.vx >> 4, Pos.vy >> 4 ) )
{
// starting off below ground, jump initially
m_velocity = 5;
m_movementFunc = NPC_MOVEMENT_SPIDER_CRAB_INITJUMP;
}
break;
}
default: default:
break; break;
@ -590,6 +608,7 @@ void CNpcEnemy::reinit()
m_timerFunc = m_data[this->m_type].timerFunc; m_timerFunc = m_data[this->m_type].timerFunc;
m_sensorFunc = m_data[this->m_type].sensorFunc; m_sensorFunc = m_data[this->m_type].sensorFunc;
m_movementFunc = m_data[this->m_type].movementFunc;
m_controlFunc = NPC_CONTROL_MOVEMENT; m_controlFunc = NPC_CONTROL_MOVEMENT;
@ -623,18 +642,6 @@ void CNpcEnemy::shutdown()
delete m_actorGfx; delete m_actorGfx;
// remove child elements
CThing *List = this->getNext();
while ( List )
{
CThing *Next = List->getNext();
List->shutdown();
List = Next;
}
CEnemyThing::shutdown(); CEnemyThing::shutdown();
} }
@ -1156,7 +1163,7 @@ void CNpcEnemy::processMovement(int _frames)
s32 moveVel = 0; s32 moveVel = 0;
s32 moveDist = 0; s32 moveDist = 0;
switch( m_data[this->m_type].movementFunc ) switch( m_movementFunc )
{ {
case NPC_MOVEMENT_STATIC: case NPC_MOVEMENT_STATIC:
{ {
@ -1280,6 +1287,20 @@ void CNpcEnemy::processMovement(int _frames)
break; break;
} }
case NPC_MOVEMENT_SPIDER_CRAB_SPAWNER:
{
processSpiderCrabSpawnerMovement( _frames );
break;
}
case NPC_MOVEMENT_SPIDER_CRAB_INITJUMP:
{
processSpiderCrabInitJumpMovement( _frames );
break;
}
default: default:
break; break;
@ -1735,4 +1756,4 @@ void CNpcEnemy::caughtWithNet()
{ {
shutdown(); shutdown();
} }
} }

View File

@ -138,6 +138,7 @@ public:
NPC_MINE, NPC_MINE,
NPC_BOOGER_MONSTER, NPC_BOOGER_MONSTER,
NPC_SPIDER_CRAB, NPC_SPIDER_CRAB,
NPC_SPIDER_CRAB_SPAWNER,
NPC_EYEBALL, NPC_EYEBALL,
NPC_BABY_OCTOPUS, NPC_BABY_OCTOPUS,
NPC_ZOMBIE_FISH_FOLK, NPC_ZOMBIE_FISH_FOLK,
@ -209,6 +210,7 @@ protected:
NPC_INIT_EYEBALL, NPC_INIT_EYEBALL,
NPC_INIT_BALL_BLOB, NPC_INIT_BALL_BLOB,
NPC_INIT_ANEMONE_2, NPC_INIT_ANEMONE_2,
NPC_INIT_SPIDER_CRAB,
}; };
enum NPC_CONTROL_FUNC enum NPC_CONTROL_FUNC
@ -292,6 +294,8 @@ protected:
NPC_MOVEMENT_SHARK_MAN, NPC_MOVEMENT_SHARK_MAN,
NPC_MOVEMENT_BALL_BLOB, NPC_MOVEMENT_BALL_BLOB,
NPC_MOVEMENT_RETURNING_HAZARD_GROUND, NPC_MOVEMENT_RETURNING_HAZARD_GROUND,
NPC_MOVEMENT_SPIDER_CRAB_SPAWNER,
NPC_MOVEMENT_SPIDER_CRAB_INITJUMP,
}; };
enum NPC_MOVEMENT_MODIFIER_FUNC enum NPC_MOVEMENT_MODIFIER_FUNC
@ -489,6 +493,8 @@ protected:
void processCloseSpiderCrabAttack( int _frames ); void processCloseSpiderCrabAttack( int _frames );
void processSpiderCrabCollision(); void processSpiderCrabCollision();
void processSpiderCrabSpawnerMovement( int _frames );
void processSpiderCrabInitJumpMovement( int _frames );
// hermit crab functions // hermit crab functions
@ -586,6 +592,7 @@ protected:
NPC_CONTROL_FUNC m_oldControlFunc; NPC_CONTROL_FUNC m_oldControlFunc;
NPC_TIMER_FUNC m_timerFunc; NPC_TIMER_FUNC m_timerFunc;
NPC_SENSOR_FUNC m_sensorFunc; NPC_SENSOR_FUNC m_sensorFunc;
NPC_MOVEMENT_FUNC m_movementFunc;
CNpcPath m_npcPath; CNpcPath m_npcPath;
s32 m_heading; s32 m_heading;
s32 m_fireHeading; s32 m_fireHeading;
@ -625,6 +632,5 @@ protected:
CNpcPositionHistory *m_positionHistory; CNpcPositionHistory *m_positionHistory;
}; };
/*****************************************************************************/ /*****************************************************************************/
#endif #endif

View File

@ -870,7 +870,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
{ // NPC_SPIDER_CRAB { // NPC_SPIDER_CRAB
ACTORS_SPIDERCRAB_SBK, ACTORS_SPIDERCRAB_SBK,
ANIM_SPIDERCRAB_IDLE, ANIM_SPIDERCRAB_IDLE,
NPC_INIT_DEFAULT, NPC_INIT_SPIDER_CRAB,
NPC_SENSOR_SPIDER_CRAB_USER_CLOSE, NPC_SENSOR_SPIDER_CRAB_USER_CLOSE,
NPC_MOVEMENT_FIXED_PATH_WALK, NPC_MOVEMENT_FIXED_PATH_WALK,
NPC_MOVEMENT_MODIFIER_NONE, NPC_MOVEMENT_MODIFIER_NONE,
@ -891,6 +891,30 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
}, },
{ // NPC_SPIDER_CRAB_SPAWNER
ACTORS_SPIDERCRAB_SBK,
ANIM_SPIDERCRAB_IDLE,
NPC_INIT_DEFAULT,
NPC_SENSOR_NONE,
NPC_MOVEMENT_SPIDER_CRAB_SPAWNER,
NPC_MOVEMENT_MODIFIER_NONE,
NPC_CLOSE_NONE,
NPC_TIMER_NONE,
false,
3,
2048,
DETECT_NO_COLLISION,
DAMAGE__PINCH_ENEMY,
0,
ANIM_SPIDERCRAB_RUN,
NPC_SHOT_NONE,
ANIM_SPIDERCRAB_DIE,
ANIM_SPIDERCRAB_HIT,
NPC_COLLISION_GENERIC,
false,
false,
},
{ // NPC_EYEBALL { // NPC_EYEBALL
ACTORS_EYEBALL_SBK, ACTORS_EYEBALL_SBK,
ANIM_EYEBALL_STALK, ANIM_EYEBALL_STALK,
@ -1330,6 +1354,7 @@ CNpcEnemy::NPC_UNIT_TYPE CNpcEnemy::mapEditConvertTable[NPC_UNIT_TYPE_MAX] =
NPC_SQUID_DART, NPC_SQUID_DART,
NPC_SKULL_STOMPER, NPC_SKULL_STOMPER,
NPC_DUST_DEVIL, NPC_DUST_DEVIL,
NPC_SPIDER_CRAB_SPAWNER,
NPC_FALLING_ITEM, NPC_FALLING_ITEM,
NPC_FISH_HOOK, NPC_FISH_HOOK,
NPC_PENDULUM, NPC_PENDULUM,

View File

@ -147,6 +147,11 @@ void CNpcPath::setPathType( u8 newPathType )
pathType = (NPC_PATH_TYPE) newPathType; pathType = (NPC_PATH_TYPE) newPathType;
} }
u8 CNpcPath::getPathType()
{
return( pathType );
}
bool CNpcPath::incPath() bool CNpcPath::incPath()
{ {
if ( !reversePath ) if ( !reversePath )
@ -349,4 +354,9 @@ bool CNpcPath::thinkVertical( DVECTOR currentPos, bool *pathComplete, s32 *distX
} }
return( pointChange ); return( pointChange );
} }
CNpcWaypoint *CNpcPath::getWaypointList()
{
return( waypoint );
}

View File

@ -40,6 +40,7 @@ public:
void addWaypoint( DVECTOR newPos ); void addWaypoint( DVECTOR newPos );
void removeAllWaypoints(); void removeAllWaypoints();
void setPathType( u8 newPathType ); void setPathType( u8 newPathType );
u8 getPathType();
bool incPath(); bool incPath();
void resetPath(); void resetPath();
void reversePathDir(); void reversePathDir();
@ -49,6 +50,7 @@ public:
bool getDistToNextWaypoint( DVECTOR currentPos, s32 *distX, s32 *distY ); bool getDistToNextWaypoint( DVECTOR currentPos, s32 *distX, s32 *distY );
void getPathXExtents( s32 *minExtent, s32 *maxExtent ); void getPathXExtents( s32 *minExtent, s32 *maxExtent );
void getPathYExtents( s32 *minExtent, s32 *maxExtent ); void getPathYExtents( s32 *minExtent, s32 *maxExtent );
CNpcWaypoint *getWaypointList();
private: private:
CNpcWaypoint *waypoint; CNpcWaypoint *waypoint;

View File

@ -146,4 +146,87 @@ void CNpcEnemy::processSpiderCrabCollision()
m_controlFunc = m_oldControlFunc; m_controlFunc = m_oldControlFunc;
} }
}
void CNpcEnemy::processSpiderCrabInitJumpMovement( int _frames )
{
s32 velocity;
bool completed = false;
bool collision = false;
if ( m_animNo != ANIM_SPIDERCRAB_JUMP )
{
m_animPlaying = true;
m_animNo = ANIM_SPIDERCRAB_JUMP;
m_frame = 0;
}
velocity = m_velocity * _frames;
m_extension += velocity;
if ( m_extension > 128 )
{
m_extension = 128;
completed = true;
}
Pos.vy = m_base.vy - ( ( 50 * rsin( abs( m_extension ) << 4 ) ) >> 12 );
if ( m_extension > 64 )
{
// check for collision on the way back down
if ( m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy ) < 0 )
{
collision = true;
}
}
if ( completed || collision )
{
m_movementFunc = m_data[m_type].movementFunc;
}
}
void CNpcEnemy::processSpiderCrabSpawnerMovement( int _frames )
{
if ( getNumChildren() < 3 )
{
m_movementTimer -= _frames;
if ( m_movementTimer < 0 )
{
m_movementTimer = 3 * GameState::getOneSecondInFrames();
CNpcEnemy *enemy;
enemy = new( "spider crab" ) CNpcEnemy;
ASSERT(enemy);
enemy->setType( CNpcEnemy::NPC_SPIDER_CRAB );
enemy->init();
enemy->setLayerCollision( m_layerCollision );
enemy->setStartPos( Pos.vx >> 4, Pos.vy >> 4 );
CNpcWaypoint *sourceWaypoint = m_npcPath.getWaypointList();
if ( sourceWaypoint )
{
// skip first waypoint
sourceWaypoint = sourceWaypoint->nextWaypoint;
while( sourceWaypoint )
{
enemy->addWaypoint( sourceWaypoint->pos.vx >> 4, sourceWaypoint->pos.vy >> 4 );
sourceWaypoint = sourceWaypoint->nextWaypoint;
}
}
enemy->setPathType( m_npcPath.getPathType() );
enemy->postInit();
addChild( enemy );
}
}
} }

View File

@ -27,6 +27,10 @@
#include "enemy\npc.h" #include "enemy\npc.h"
#endif #endif
#ifndef __ENEMY_NGEN_H__
#include "enemy\ngen.h"
#endif
#ifndef __ENEMY_NPLATFRM_H__ #ifndef __ENEMY_NPLATFRM_H__
#include "enemy\nplatfrm.h" #include "enemy\nplatfrm.h"
#endif #endif
@ -109,7 +113,7 @@ const s32 Scale = (512<<12)/(256);
/*****************************************************************************/ /*****************************************************************************/
void CGameScene::init() void CGameScene::init()
{ {
// Setup Constant Camera Matrix // Setup Constant Camera Matrix
SetIdentNoTrans(&CamMtx); SetIdentNoTrans(&CamMtx);
CamMtx.t[2]=ZPos; CamMtx.t[2]=ZPos;
@ -159,7 +163,7 @@ void CGameScene::shutdown()
{ {
// CFileIO::EnableASync(false); // CFileIO::EnableASync(false);
shutdownLevel(); shutdownLevel();
CSoundMediator::dumpSong(); CSoundMediator::dumpSong();
m_pauseMenu->shutdown(); delete m_pauseMenu; m_pauseMenu->shutdown(); delete m_pauseMenu;
s_genericFont->dump(); delete s_genericFont; s_genericFont->dump(); delete s_genericFont;
@ -179,7 +183,7 @@ void CGameScene::render()
/*****************************************************************************/ /*****************************************************************************/
void CGameScene::think(int _frames) void CGameScene::think(int _frames)
{ {
//#ifdef __USER_paul__ //#ifdef __USER_paul__
// if(!CConversation::isActive()&&PadGetDown(0)&PAD_START) // if(!CConversation::isActive()&&PadGetDown(0)&PAD_START)
// { // {
// CConversation::trigger(SCRIPTS_SPEECHTEST_DAT); // CConversation::trigger(SCRIPTS_SPEECHTEST_DAT);
@ -201,7 +205,7 @@ void CGameScene::think(int _frames)
s_levelFinished=false; s_levelFinished=false;
} }
if(!m_pauseMenu->isActive()&&PadGetDown(0)&PAD_START&&canPause()) if(!m_pauseMenu->isActive()&&PadGetDown(0)&PAD_START&&canPause())
{ {
m_pauseMenu->select(); m_pauseMenu->select();
@ -217,7 +221,7 @@ void CGameScene::think(int _frames)
//PKG //PKG
// if(camPos.vx<0){camPos.vx=0;PAUL_DBGMSG("cx<0");} // if(camPos.vx<0){camPos.vx=0;PAUL_DBGMSG("cx<0");}
// if(camPos.vy<0){camPos.vy=0;PAUL_DBGMSG("cy<0");} // if(camPos.vy<0){camPos.vy=0;PAUL_DBGMSG("cy<0");}
//PKG //PKG
/* if (!s_levelFinished) */CBubicleFactory::setMapOffset(&camPos); /* if (!s_levelFinished) */CBubicleFactory::setMapOffset(&camPos);
/* if (!s_levelFinished) */Level.setCameraCentre(camPos); /* if (!s_levelFinished) */Level.setCameraCentre(camPos);
/* if (!s_levelFinished) */Level.think(_frames); /* if (!s_levelFinished) */Level.think(_frames);
@ -268,15 +272,15 @@ void CGameScene::initLevel()
pos.vx+=64; createPickup(PICKUP__LIFE,&pos); pos.vx+=64; createPickup(PICKUP__LIFE,&pos);
pos.vx+=64; createPickup(PICKUP__SPATULA,&pos); pos.vx+=64; createPickup(PICKUP__SPATULA,&pos);
pos.vx+=64; createPickup(PICKUP__JELLY_LAUNCHER_AMMO,&pos); pos.vx+=64; createPickup(PICKUP__JELLY_LAUNCHER_AMMO,&pos);
pos.vx+=64; createPickup(PICKUP__BUBBLE_MIXTURE,&pos); pos.vx+=64; createPickup(PICKUP__BUBBLE_MIXTURE,&pos);
pos.vx+=64; createPickup(PICKUP__BUBBLE_WAND,&pos); pos.vx+=64; createPickup(PICKUP__BUBBLE_WAND,&pos);
pos.vx+=64; createPickup(PICKUP__NET,&pos); pos.vx+=64; createPickup(PICKUP__NET,&pos);
pos.vx+=64; createPickup(PICKUP__GLASSES,&pos); pos.vx+=64; createPickup(PICKUP__GLASSES,&pos);
pos.vx+=64; createPickup(PICKUP__SQUEAKY_SHOES,&pos); pos.vx+=64; createPickup(PICKUP__SQUEAKY_SHOES,&pos);
pos.vx+=64; createPickup(PICKUP__BALLOON,&pos); pos.vx+=64; createPickup(PICKUP__BALLOON,&pos);
pos.vx+=64; createPickup(PICKUP__HELMET,&pos); pos.vx+=64; createPickup(PICKUP__HELMET,&pos);
pos.vx+=64; createPickup(PICKUP__CORAL_BLOWER,&pos); pos.vx+=64; createPickup(PICKUP__CORAL_BLOWER,&pos);
pos.vx+=64; createPickup(PICKUP__QUEST_ITEM__TEST,&pos); pos.vx+=64; createPickup(PICKUP__QUEST_ITEM__TEST,&pos);
// CNpcPlatform *platform; // CNpcPlatform *platform;
// platform=new ("test platform") CNpcPlatform; // platform=new ("test platform") CNpcPlatform;
@ -351,6 +355,50 @@ void CGameScene::initLevel()
break; break;
} }
case CActorPool::ACTOR_ENEMY_GENERATOR_NPC:
{
CNpcEnemyGenerator *enemy;
enemy = new ("npc enemy generator") CNpcEnemyGenerator;
ASSERT(enemy);
enemy->setTypeFromMapEdit( actorList[actorNum]->Type );
enemy->init();
enemy->setLayerCollision( Level.getCollisionLayer() );
u16 *PntList=(u16*)MakePtr(actorList[actorNum],sizeof(sThingActor));
u16 newXPos, newYPos;
newXPos = (u16) *PntList;
PntList++;
newYPos = (u16) *PntList;
PntList++;
enemy->setStartPos( newXPos, newYPos );
enemy->addWaypoint( newXPos, newYPos );
if ( actorList[actorNum]->PointCount > 1 )
{
for ( pointNum = 1 ; pointNum < actorList[actorNum]->PointCount ; pointNum++ )
{
newXPos = (u16) *PntList;
PntList++;
newYPos = (u16) *PntList;
PntList++;
enemy->addWaypoint( newXPos, newYPos );
if ( pointNum == 1 )
{
enemy->setHeading( newXPos, newYPos );
}
}
}
enemy->postInit();
break;
}
default: default:
break; break;
} }
@ -418,4 +466,4 @@ void CGameScene::shutdownLevel()
Level.shutdown(); Level.shutdown();
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -18,46 +18,47 @@ int ShadowYOfs=32;
/*****************************************************************************/ /*****************************************************************************/
CActorPool::ACTOR_TYPE CActorPool::actorType[38] = CActorPool::ACTOR_TYPE CActorPool::actorType[39] =
{ {
ACTOR_PLAYER, //SpongeBob=0 ACTOR_PLAYER, //SpongeBob=0
ACTOR_FRIEND_NPC, //BarnacleBoy=1 ACTOR_FRIEND_NPC, //BarnacleBoy=1
ACTOR_FRIEND_NPC, //Gary=2 ACTOR_FRIEND_NPC, //Gary=2
ACTOR_FRIEND_NPC, //Krusty=3 ACTOR_FRIEND_NPC, //Krusty=3
ACTOR_FRIEND_NPC, //MermaidMan=4 ACTOR_FRIEND_NPC, //MermaidMan=4
ACTOR_FRIEND_NPC, //Patrick=5 ACTOR_FRIEND_NPC, //Patrick=5
ACTOR_FRIEND_NPC, //Sandy=6 ACTOR_FRIEND_NPC, //Sandy=6
ACTOR_FRIEND_NPC, //Squidward=7 ACTOR_FRIEND_NPC, //Squidward=7
ACTOR_FRIEND_NPC, //Plankton=8 ACTOR_FRIEND_NPC, //Plankton=8
ACTOR_UNKNOWN, ACTOR_UNKNOWN,
ACTOR_ENEMY_NPC, //SmallJellyfish-Level1=10 ACTOR_ENEMY_NPC, //SmallJellyfish-Level1=10
ACTOR_ENEMY_NPC, //SmallJellyfish-Level2=11 ACTOR_ENEMY_NPC, //SmallJellyfish-Level2=11
ACTOR_ENEMY_NPC, //Motherjellyfish=12 ACTOR_ENEMY_NPC, //Motherjellyfish=12
ACTOR_ENEMY_NPC, //Anenome-Level1=13 ACTOR_ENEMY_NPC, //Anenome-Level1=13
ACTOR_ENEMY_NPC, //SpikeyAnenome=14 ACTOR_ENEMY_NPC, //SpikeyAnenome=14
ACTOR_ENEMY_NPC, //Anenome-Level3=15 ACTOR_ENEMY_NPC, //Anenome-Level3=15
ACTOR_ENEMY_NPC, //BabyOctopus=16 ACTOR_ENEMY_NPC, //BabyOctopus=16
ACTOR_ENEMY_NPC, //Ballblob=17 ACTOR_ENEMY_NPC, //Ballblob=17
ACTOR_ENEMY_NPC, //Boogermonster=18 ACTOR_ENEMY_NPC, //Boogermonster=18
ACTOR_ENEMY_NPC, //Caterpillar=19 ACTOR_ENEMY_NPC, //Caterpillar=19
ACTOR_ENEMY_NPC, //Clam-Level1=20 ACTOR_ENEMY_NPC, //Clam-Level1=20
ACTOR_ENEMY_NPC, //Clam-Level2=21 ACTOR_ENEMY_NPC, //Clam-Level2=21
ACTOR_ENEMY_NPC, //Eyeball=22 ACTOR_ENEMY_NPC, //Eyeball=22
ACTOR_ENEMY_NPC, //Flamingskull=23 ACTOR_ENEMY_NPC, //Flamingskull=23
ACTOR_ENEMY_NPC, //FlyingDutchman=24 ACTOR_ENEMY_NPC, //FlyingDutchman=24
ACTOR_ENEMY_NPC, //Ghost=25 ACTOR_ENEMY_NPC, //Ghost=25
ACTOR_ENEMY_NPC, //GiantWorm=26 ACTOR_ENEMY_NPC, //GiantWorm=26
ACTOR_ENEMY_NPC, //HermitCrab=27 ACTOR_ENEMY_NPC, //HermitCrab=27
ACTOR_ENEMY_NPC, //IronDogFish=28 ACTOR_ENEMY_NPC, //IronDogFish=28
ACTOR_ENEMY_NPC, //PuffaFish=29 ACTOR_ENEMY_NPC, //PuffaFish=29
ACTOR_ENEMY_NPC, //SeaSnake=30 ACTOR_ENEMY_NPC, //SeaSnake=30
ACTOR_ENEMY_NPC, //Sharkman=31 ACTOR_ENEMY_NPC, //Sharkman=31
ACTOR_ENEMY_NPC, //SharkSub=32 ACTOR_ENEMY_NPC, //SharkSub=32
ACTOR_ENEMY_NPC, //Skeletalfish=33 ACTOR_ENEMY_NPC, //Skeletalfish=33
ACTOR_ENEMY_NPC, //SpiderCrab=34 ACTOR_ENEMY_NPC, //SpiderCrab=34
ACTOR_ENEMY_NPC, //Squiddart=35 ACTOR_ENEMY_NPC, //Squiddart=35
ACTOR_ENEMY_NPC, //Stomper=36 ACTOR_ENEMY_NPC, //Stomper=36
ACTOR_ENEMY_NPC, //DustDevil=37 ACTOR_ENEMY_NPC, //DustDevil=37
ACTOR_ENEMY_GENERATOR_NPC, //SiderCrabSpawner=38
}; };
/*****************************************************************************/ /*****************************************************************************/

View File

@ -69,6 +69,7 @@ public:
ACTOR_PLAYER = 0, ACTOR_PLAYER = 0,
ACTOR_FRIEND_NPC = 1, ACTOR_FRIEND_NPC = 1,
ACTOR_ENEMY_NPC, ACTOR_ENEMY_NPC,
ACTOR_ENEMY_GENERATOR_NPC,
ACTOR_UNKNOWN, ACTOR_UNKNOWN,
}; };

View File

@ -354,6 +354,7 @@ void CThing::init()
{ {
Parent=NULL; Parent=NULL;
Next=NULL; Next=NULL;
m_numChildren = 0;
Pos.vx=Pos.vy=10; Pos.vx=Pos.vy=10;
@ -511,12 +512,14 @@ CThing *List=Next;
} }
List->Next=Child; List->Next=Child;
Child->Parent=this; Child->Parent=this;
m_numChildren++;
} }
else else
{ {
// List does not exist, create // List does not exist, create
Next = Child; Next = Child;
Child->Parent=this; Child->Parent=this;
m_numChildren++;
} }
} }
@ -552,6 +555,8 @@ CThing *Last=NULL;
this->Next = List->Next; this->Next = List->Next;
} }
m_numChildren--;
Child->Parent=NULL; Child->Parent=NULL;
} }
@ -573,6 +578,19 @@ CThing *List=Next;
List=Next; List=Next;
} }
Next=NULL; Next=NULL;
m_numChildren = 0;
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
int CThing::getNumChildren()
{
return( m_numChildren );
} }
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------

View File

@ -106,6 +106,7 @@ public:
void removeChild(CThing *Child); void removeChild(CThing *Child);
void removeAllChild(); void removeAllChild();
bool hasChild(CThing *Child); bool hasChild(CThing *Child);
int getNumChildren();
DVECTOR getPos() {return Pos;} DVECTOR getPos() {return Pos;}
@ -122,7 +123,8 @@ protected:
// Linkage // Linkage
CThing *Parent,*Next; CThing *Parent,*Next;
// Count
int m_numChildren;
// Pos // Pos
DVECTOR Pos, PosLast, PosDelta; DVECTOR Pos, PosLast, PosDelta;

View File

@ -49,6 +49,7 @@ SpiderCrab=34
Squiddart=35 Squiddart=35
Stomper=36 Stomper=36
DustDevil=37 DustDevil=37
SpiderCrabSpawner=38
################################################ ################################################

View File

@ -352,3 +352,13 @@ TurnRate=0
Collision=0 Collision=0
Health=0 Health=0
AttackStrength=20 AttackStrength=20
[SpiderCrabSpawner]
Gfx=..\..\graphics\characters\spidercrab\render\psx\SpiderCrab_Idle0001.bmp
WayPoints=16
Speed=3
TurnRate=0
Collision=1
Health=2
# 1st shot stuns, if shot again is killed
AttackStrength=20

View File

@ -149,6 +149,14 @@ SOURCE=..\..\..\source\enemy\ngary.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\..\source\enemy\ngen.cpp
# End Source File
# Begin Source File
SOURCE=..\..\..\source\enemy\ngen.h
# End Source File
# Begin Source File
SOURCE=..\..\..\source\enemy\ngeneric.cpp SOURCE=..\..\..\source\enemy\ngeneric.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File