From a30342b6b3d44dd065cf4b33b1a08eb675398182 Mon Sep 17 00:00:00 2001 From: Charles Date: Wed, 16 May 2001 16:15:38 +0000 Subject: [PATCH] --- source/enemy/npcdata.cpp | 4 +- source/enemy/nworm.cpp | 84 +++++++++++++++++++++++++++++++++++++++- source/enemy/nworm.h | 7 +++- 3 files changed, 90 insertions(+), 5 deletions(-) diff --git a/source/enemy/npcdata.cpp b/source/enemy/npcdata.cpp index 17a05f311..2e52cdf3a 100644 --- a/source/enemy/npcdata.cpp +++ b/source/enemy/npcdata.cpp @@ -859,7 +859,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 3, 128, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__HIT_ENEMY, 256, 0, @@ -928,7 +928,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 3, 2048, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__HIT_ENEMY, 256, 0, diff --git a/source/enemy/nworm.cpp b/source/enemy/nworm.cpp index f5ff436ec..32f65dc3a 100644 --- a/source/enemy/nworm.cpp +++ b/source/enemy/nworm.cpp @@ -35,6 +35,10 @@ #include "gfx\prim.h" #endif +#ifndef __ANIM_SEASNAKE_HEADER__ +#include +#endif + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void CNpcParasiticWormSegment::init() @@ -495,6 +499,52 @@ void CNpcParasiticWormEnemy::render() //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +int CNpcParasiticWormEnemy::checkCollisionAgainst( CThing *_thisThing, int _frames ) +{ + DVECTOR pos,thisThingPos; + int radius; + int collided; + + pos=getCollisionCentre(); + thisThingPos=_thisThing->getCollisionCentre(); + + radius=getCollisionRadius()+_thisThing->getCollisionRadius(); + collided=false; + if(abs(pos.vx-thisThingPos.vx)getCollisionArea(); + + if(((thisRect.x1>=thatRect.x1&&thisRect.x1<=thatRect.x2)||(thisRect.x2>=thatRect.x1&&thisRect.x2<=thatRect.x2)||(thisRect.x1<=thatRect.x1&&thisRect.x2>=thatRect.x2))&& + ((thisRect.y1>=thatRect.y1&&thisRect.y1<=thatRect.y2)||(thisRect.y2>=thatRect.y1&&thisRect.y2<=thatRect.y2)||(thisRect.y1<=thatRect.y1&&thisRect.y2>=thatRect.y2))) + { + collided=true; + } + } + + // go through segments + + CNpcParasiticWormSegment *segment = m_segment; + + while( segment ) + { + if ( segment->checkCollisionAgainst( _thisThing, _frames ) ) + { + collided = true; + } + + segment = segment->m_nextSegment; + } + + return collided; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void CNpcParasiticWormSegment::render() { POLY_FT4 *SprFrame = NULL; @@ -512,7 +562,7 @@ void CNpcParasiticWormSegment::render() if ( renderFlag ) { - SprFrame = m_actorGfx->Render(renderPos,0,0,0); + SprFrame = m_actorGfx->Render(renderPos,ANIM_SEASNAKE_BODYSTATIC,0,0); m_actorGfx->RotateScale( SprFrame, renderPos, m_heading, 4096, m_scale ); sBBox boundingBox = m_actorGfx->GetBBox(); @@ -546,3 +596,35 @@ void CNpcParasiticWormSegment::render() #endif } } + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +int CNpcParasiticWormSegment::checkCollisionAgainst( CThing *_thisThing, int _frames ) +{ + DVECTOR pos,thisThingPos; + int radius; + int collided; + + pos = getCollisionCentre(); + thisThingPos = _thisThing->getCollisionCentre(); + + radius = getCollisionRadius() + _thisThing->getCollisionRadius(); + collided = false; + if(abs(pos.vx-thisThingPos.vx)getCollisionArea(); + + if(((thisRect.x1>=thatRect.x1&&thisRect.x1<=thatRect.x2)||(thisRect.x2>=thatRect.x1&&thisRect.x2<=thatRect.x2)||(thisRect.x1<=thatRect.x1&&thisRect.x2>=thatRect.x2))&& + ((thisRect.y1>=thatRect.y1&&thisRect.y1<=thatRect.y2)||(thisRect.y2>=thatRect.y1&&thisRect.y2<=thatRect.y2)||(thisRect.y1<=thatRect.y1&&thisRect.y2>=thatRect.y2))) + { + collided=true; + } + } + + return collided; +} \ No newline at end of file diff --git a/source/enemy/nworm.h b/source/enemy/nworm.h index 44cfd0f36..a0d88631e 100644 --- a/source/enemy/nworm.h +++ b/source/enemy/nworm.h @@ -26,12 +26,14 @@ public: virtual DVECTOR getPos() {return( Pos );} virtual void setHeading( s16 newHeading ) {m_heading = newHeading;} void updateCollisionArea(); - -protected: + virtual int checkCollisionAgainst(CThing *_thisThing, int _frames); virtual void setCollisionSize(int _w,int _h); virtual void setCollisionCentreOffset(int _x,int _y) {m_collisionCentreOffset.vx=_x;m_collisionCentreOffset.vy=_y;} virtual CRECT const &getCollisionArea() {return m_collisionArea;} + DVECTOR const &getCollisionCentre() {return m_collisionCentre;} + int getCollisionRadius() {return m_collisionRadius;} +protected: u16 m_scale; CActorGfx *m_actorGfx; DVECTOR Pos; @@ -49,6 +51,7 @@ public: virtual void postInit(); virtual void shutdown(); virtual void render(); + virtual int checkCollisionAgainst(CThing *_thisThing, int _frames); protected: virtual bool processSensor(); virtual void processClose( int _frames );