This commit is contained in:
Daveo 2001-05-10 21:48:04 +00:00
parent 4c5d514e54
commit 830a15a56f

View file

@ -158,7 +158,7 @@ void CThingManager::killAllThingsForRespawn()
Params: Params:
Returns: Returns:
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
bool FO=false;
void CThingManager::thinkAllThings(int _frames) void CThingManager::thinkAllThings(int _frames)
{ {
// Setup Screen BBox's // Setup Screen BBox's
@ -171,7 +171,8 @@ DVECTOR const &CamPos=CLevel::getCameraPos();
int i; int i;
CThing *thing; CThing *thing;
CThing *thing1,*thing2; CThing *thing1,*thing2,*playerThing;
initList(s_CollisionLists);
for(i=0;i<CThing::MAX_TYPE;i++) for(i=0;i<CThing::MAX_TYPE;i++)
{ {
@ -191,6 +192,10 @@ DVECTOR const &CamPos=CLevel::getCameraPos();
{ {
thing->think(_frames); thing->think(_frames);
thing->updateCollisionArea(); thing->updateCollisionArea();
if (thing->canCollide())
{
CThingManager::addToCollisionList(thing);
}
} }
thing=thing->m_nextListThing; thing=thing->m_nextListThing;
} }
@ -203,160 +208,155 @@ DVECTOR const &CamPos=CLevel::getCameraPos();
player->clearPlatform(); player->clearPlatform();
} }
// Player -> Platform collision playerThing=s_CollisionLists[CThing::TYPE_PLAYER];
thing1=s_thingLists[CThing::TYPE_PLATFORM];
thing2=s_thingLists[CThing::TYPE_PLAYER];
thing2->setHasPlatformCollided( false ); if (playerThing)
thing2->setNewCollidedPos( thing2->getPos() );
while(thing1&&thing2)
{ {
if(thing1->canCollide() && thing1->checkCollisionAgainst(thing2, _frames)) playerThing->setHasPlatformCollided( false );
{ playerThing->setNewCollidedPos( playerThing->getPos() );
thing1->collidedWith(thing2);
}
thing1=thing1->m_nextListThing;
}
// Player -> Pickup collision // Player -> Platform collision
thing1=s_thingLists[CThing::TYPE_PICKUP]; thing1=s_CollisionLists[CThing::TYPE_PLATFORM];
thing2=s_thingLists[CThing::TYPE_PLAYER]; while(thing1)
while(thing1&&thing2)
{
if(thing1->canCollide() && thing1->checkCollisionAgainst(thing2, _frames))
{ {
thing1->collidedWith(thing2); if(thing1->checkCollisionAgainst(playerThing, _frames))
}
thing1=thing1->m_nextListThing;
}
// Player -> Enemy collision
thing1=s_thingLists[CThing::TYPE_ENEMY];
thing2=s_thingLists[CThing::TYPE_PLAYER];
while(thing1&&thing2)
{
if(thing1->canCollide() && thing1->checkCollisionAgainst(thing2, _frames))
{
thing1->collidedWith(thing2);
}
thing1=thing1->m_nextListThing;
}
// Player -> Friend collision
thing1=s_thingLists[CThing::TYPE_NPC];
thing2=s_thingLists[CThing::TYPE_PLAYER];
while(thing1&&thing2)
{
if(thing1->canCollide() && thing1->checkCollisionAgainst(thing2, _frames))
{
thing1->collidedWith(thing2);
}
thing1=thing1->m_nextListThing;
}
// Player -> Hazard collision
thing1=s_thingLists[CThing::TYPE_HAZARD];
thing2=s_thingLists[CThing::TYPE_PLAYER];
while(thing1&&thing2)
{
if(thing1->canCollide() && thing1->checkCollisionAgainst(thing2, _frames))
{
thing1->collidedWith(thing2);
}
thing1=thing1->m_nextListThing;
}
// Player -> Enemy projectile collision
thing1=s_thingLists[CThing::TYPE_ENEMYPROJECTILE];
thing2=s_thingLists[CThing::TYPE_PLAYER];
while(thing1&&thing2)
{
if(thing1->canCollide() && thing1->checkCollisionAgainst(thing2, _frames))
{
thing1->collidedWith(thing2);
}
thing1=thing1->m_nextListThing;
}
// Player -> Trigger collision
thing1=s_thingLists[CThing::TYPE_TRIGGER];
thing2=s_thingLists[CThing::TYPE_PLAYER];
while(thing1&&thing2)
{
if(thing1->canCollide() && thing1->checkCollisionAgainst(thing2, _frames))
{
thing1->collidedWith(thing2);
}
thing1=thing1->m_nextListThing;
}
// Enemy -> Player projectile collision
thing1=s_thingLists[CThing::TYPE_PLAYERPROJECTILE];
thing2=s_thingLists[CThing::TYPE_ENEMY];
while(thing1)
{
while(thing2)
{
if(thing1->canCollide()&& thing2->canCollide() && thing1->checkCollisionAgainst(thing2, _frames))
{ {
thing1->collidedWith(thing2); thing1->collidedWith(playerThing);
} }
thing2=thing2->m_nextListThing; thing1=thing1->m_nextCollisionThing;
} }
thing1=thing1->m_nextListThing;
}
// Enemy -> Enemy collision // Player -> Pickup collision
thing1=s_thingLists[CThing::TYPE_ENEMY]; thing1=s_CollisionLists[CThing::TYPE_PICKUP];
while(thing1) while(thing1)
{
thing2=s_thingLists[CThing::TYPE_ENEMY];
while(thing2)
{ {
if ( thing1 != thing2 ) if(thing1->checkCollisionAgainst(playerThing, _frames))
{ {
if ( thing1->canCollide() && thing2->canCollide() && thing1->checkCollisionAgainst( thing2, _frames ) ) thing1->collidedWith(playerThing);
}
thing1=thing1->m_nextCollisionThing;
}
// Player -> Enemy collision
thing1=s_CollisionLists[CThing::TYPE_ENEMY];
while(thing1)
{
if(thing1->checkCollisionAgainst(playerThing, _frames))
{
thing1->collidedWith(playerThing);
}
thing1=thing1->m_nextCollisionThing;
}
// Player -> Friend collision
thing1=s_CollisionLists[CThing::TYPE_NPC];
while(thing1)
{
if(thing1->checkCollisionAgainst(playerThing, _frames))
{
thing1->collidedWith(playerThing);
}
thing1=thing1->m_nextCollisionThing;
}
// Player -> Hazard collision
thing1=s_CollisionLists[CThing::TYPE_HAZARD];
while(thing1)
{
if(thing1->checkCollisionAgainst(playerThing, _frames))
{
thing1->collidedWith(playerThing);
}
thing1=thing1->m_nextCollisionThing;
}
// Player -> Enemy projectile collision
thing1=s_CollisionLists[CThing::TYPE_ENEMYPROJECTILE];
while(thing1)
{
if(thing1->checkCollisionAgainst(playerThing, _frames))
{
thing1->collidedWith(playerThing);
}
thing1=thing1->m_nextCollisionThing;
}
// Player -> Trigger collision
thing1=s_CollisionLists[CThing::TYPE_TRIGGER];
while(thing1)
{
if(thing1->checkCollisionAgainst(playerThing, _frames))
{
thing1->collidedWith(playerThing);
}
thing1=thing1->m_nextCollisionThing;
}
// Enemy -> Player projectile collision
thing1=s_CollisionLists[CThing::TYPE_PLAYERPROJECTILE];
thing2=s_CollisionLists[CThing::TYPE_ENEMY];
while(thing1)
{
while(thing2)
{
if(thing1->checkCollisionAgainst(thing2, _frames))
{ {
thing1->collidedWith( thing2 ); thing1->collidedWith(thing2);
//thing2->collidedWith( thing1 );
} }
thing2=thing2->m_nextCollisionThing;
} }
thing1=thing1->m_nextCollisionThing;
thing2 = thing2->m_nextListThing;
} }
thing1 = thing1->m_nextListThing; // Enemy -> Enemy collision
} thing1=s_CollisionLists[CThing::TYPE_ENEMY];
while(thing1)
// Hazard -> Platform collision
thing1=s_thingLists[CThing::TYPE_PLATFORM];
while(thing1)
{
thing2=s_thingLists[CThing::TYPE_HAZARD];
while(thing2)
{ {
if ( thing1 != thing2 ) thing2=thing1->m_nextCollisionThing;//s_CollisionLists[CThing::TYPE_ENEMY];
{
if ( thing1->canCollide() && thing2->canCollide() && thing1->checkCollisionAgainst( thing2, _frames ) )
{
thing1->collidedWith( thing2 );
//thing2->collidedWith( thing1 );
}
}
thing2 = thing2->m_nextListThing; while(thing2)
{
ASSERT(thing1 != thing2 );
// if ( thing1 != thing2 )
{
if (thing1->checkCollisionAgainst( thing2, _frames ) )
{
thing1->collidedWith( thing2 );
//thing2->collidedWith( thing1 );
}
}
thing2 = thing2->m_nextCollisionThing;
}
thing1 = thing1->m_nextCollisionThing;
} }
thing1 = thing1->m_nextListThing; // Hazard -> Platform collision
} thing1=s_CollisionLists[CThing::TYPE_PLATFORM];
while(thing1)
{
thing2=s_CollisionLists[CThing::TYPE_HAZARD];
while(thing2)
{
if ( thing1 != thing2 )
{
if (thing1->checkCollisionAgainst( thing2, _frames ) )
{
thing1->collidedWith( thing2 );
//thing2->collidedWith( thing1 );
}
}
thing2 = thing2->m_nextCollisionThing;
}
thing1 = thing1->m_nextCollisionThing;
}
}
// Shut emm down, sh sh shut em down, we shutem down // Shut emm down, sh sh shut em down, we shutem down
for(i=0;i<CThing::MAX_TYPE;i++) for(i=0;i<CThing::MAX_TYPE;i++)
{ {
thing=s_thingLists[i]; thing=s_CollisionLists[i];
CThing *nextThing = thing; CThing *nextThing = thing;
while(thing) while(thing)
{ {
@ -454,8 +454,7 @@ CThing *CThingManager::checkCollisionAreaAgainstThings(CRECT *_area,int _type,i
} }
while(thing) while(thing)
{ {
if(thing->canCollide()&& if(thing->canCollide() && thing->checkCollisionAgainstArea(_area))
thing->checkCollisionAgainstArea(_area))
{ {
return thing; return thing;
} }
@ -471,10 +470,11 @@ CThing *CThingManager::checkCollisionAreaAgainstThings(CRECT *_area,int _type,i
Params: Params:
Returns: Returns:
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
void CThingManager::addToThingList(CThing *_this) void CThingManager::addToThingList(CThing *_this)
{ {
_this->m_nextListThing=s_thingLists[_this->getThingType()]; int Type=_this->getThingType();
s_thingLists[_this->getThingType()]=_this; _this->m_nextListThing=s_thingLists[Type];
s_thingLists[Type]=_this;
} }
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
@ -483,7 +483,7 @@ void CThingManager::addToThingList(CThing *_this)
Params: Params:
Returns: Returns:
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
void CThingManager::removeFromThingList(CThing *_this) void CThingManager::removeFromThingList(CThing *_this)
{ {
CThing *prevThing,*thing; CThing *prevThing,*thing;
@ -505,6 +505,21 @@ void CThingManager::removeFromThingList(CThing *_this)
} }
} }
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
void CThingManager::addToCollisionList(CThing *_this)
{
int Type=_this->getThingType();
_this->m_nextCollisionThing=s_CollisionLists[Type];
s_CollisionLists[Type]=_this;
}
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
Function: Function:
Purpose: Purpose: