This commit is contained in:
Charles 2001-05-08 16:25:45 +00:00
parent 26d50aa503
commit 9beaeed67a
7 changed files with 88 additions and 30 deletions

View file

@ -282,6 +282,8 @@ void CNpcHazard::init()
m_extension = 0; m_extension = 0;
m_extendDir = 0; m_extendDir = 0;
m_heading = 0; m_heading = 0;
clearPlatform();
} }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -335,6 +337,8 @@ void CNpcHazard::think(int _frames)
{ {
processTimer( _frames ); processTimer( _frames );
} }
clearPlatform();
} }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View file

@ -65,6 +65,10 @@ public:
static NPC_HAZARD_UNIT_TYPE getTypeFromMapEdit( u16 newType ); static NPC_HAZARD_UNIT_TYPE getTypeFromMapEdit( u16 newType );
static CNpcHazard *Create(sThingHazard *ThisHazard); static CNpcHazard *Create(sThingHazard *ThisHazard);
void setPlatform(CThing *_newPlatform) {m_platform = _newPlatform;}
void clearPlatform() {m_platform = NULL;}
CThing *isOnPlatform() {return m_platform;}
protected: protected:
enum enum
{ {
@ -93,6 +97,8 @@ protected:
s32 m_heading; s32 m_heading;
CModelGfx *m_modelGfx; CModelGfx *m_modelGfx;
CThing *m_platform;
static NPC_HAZARD_UNIT_TYPE mapEditConvertTable[NPC_HAZARD_TYPE_MAX]; static NPC_HAZARD_UNIT_TYPE mapEditConvertTable[NPC_HAZARD_TYPE_MAX];
}; };

View file

@ -19,6 +19,10 @@
#include "level\layercollision.h" #include "level\layercollision.h"
#endif #endif
#ifndef __PLATFORM_PLATFORM_H__
#include "platform\platform.h"
#endif
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CNpcDualPlatformBarrelHazard::init() void CNpcDualPlatformBarrelHazard::init()
@ -45,42 +49,25 @@ void CNpcDualPlatformBarrelHazard::processMovement( int _frames )
bool pathComplete; bool pathComplete;
if ( m_npcPath.thinkFlat( Pos, &pathComplete, &distX, &distY, &m_heading ) ) m_npcPath.thinkFlat( Pos, &pathComplete, &distX, &distY, &m_heading );
if ( pathComplete )
{ {
if ( pathComplete ) // reset
{
// reset
Pos = m_base; Pos = m_base;
m_npcPath.resetPath(); m_npcPath.resetPath();
return; return;
}
else
{
// check for vertical movement
groundHeight = m_layerCollision->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 );
if ( groundHeight <= yMovement )
{
// groundHeight <= yMovement indicates either just above ground or on or below ground
moveY = groundHeight;
}
else
{
// fall
moveY = yMovement;
}
}
} }
else else
{ {
// check for collision // check for collision
distX = distX / abs( distX ); if ( distX )
{
distX = distX / abs( distX );
}
if ( m_layerCollision->getHeightFromGround( Pos.vx + ( distX * 3 * _frames ), Pos.vy ) < -maxHeight ) if ( m_layerCollision->getHeightFromGround( Pos.vx + ( distX * 3 * _frames ), Pos.vy ) < -maxHeight )
{ {
@ -103,9 +90,27 @@ void CNpcDualPlatformBarrelHazard::processMovement( int _frames )
} }
else else
{ {
// fall CNpcPlatform *platform = (CNpcPlatform *) isOnPlatform();
moveY = yMovement; if ( platform )
{
// stick to platform top
moveY = platform->getHeightFromPlatformAtPosition( Pos.vx, Pos.vy + yMovement );
if ( !platform->canDrop() )
{
// if platform cannot drop any further, move in X
moveX = distX * 3 * _frames;
}
}
else
{
// fall
moveY = yMovement;
}
} }
} }
} }

View file

@ -83,6 +83,29 @@ void CNpcDualPlatform::setWaypoints( sThingPlatform *ThisPlatform )
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
u8 CNpcDualPlatform::canDrop()
{
if ( m_isMaster )
{
s32 extensionLeft = m_maxExtension - m_extension;
if ( extensionLeft == 0 )
{
return( false );
}
else
{
return( true );
}
}
else
{
return( false );
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CNpcDualPlatform::processMovement( int _frames ) void CNpcDualPlatform::processMovement( int _frames )
{ {
if ( m_isMaster ) if ( m_isMaster )

View file

@ -24,6 +24,7 @@ public:
void setMaster( u8 isMaster ); void setMaster( u8 isMaster );
void setOtherPlatform( CNpcDualPlatform *other ); void setOtherPlatform( CNpcDualPlatform *other );
void setMovement( DVECTOR move ); void setMovement( DVECTOR move );
virtual u8 canDrop();
protected: protected:
virtual void setWaypoints( sThingPlatform *ThisPlatform ); virtual void setWaypoints( sThingPlatform *ThisPlatform );
virtual void processMovement( int _frames ); virtual void processMovement( int _frames );

View file

@ -29,6 +29,10 @@
#include "player\player.h" #include "player\player.h"
#endif #endif
#ifndef __HAZARD_HAZARD_H__
#include "hazard\hazard.h"
#endif
#ifndef __ENEMY_NPCPATH_H__ #ifndef __ENEMY_NPCPATH_H__
#include "enemy\npcpath.h" #include "enemy\npcpath.h"
#endif #endif
@ -826,6 +830,20 @@ void CNpcPlatform::collidedWith( CThing *_thisThing )
{ {
m_contact = true; m_contact = true;
CNpcHazard *hazard;
hazard = (CNpcHazard *)_thisThing;
hazard->setPlatform( this );
/*DVECTOR newPos = _thisThing->getPos();
s32 yDiff = getHeightFromPlatformAtPosition( newPos.vx, newPos.vy );
newPos.vy += yDiff;
_thisThing->setPos( newPos );*/
break; break;
} }

View file

@ -91,6 +91,7 @@ public:
void shutdown(); void shutdown();
virtual void think(int _frames); virtual void think(int _frames);
virtual void render(); virtual void render();
virtual u8 canDrop() {return true;}
void setType( NPC_PLATFORM_UNIT_TYPE newType ) {m_type = newType;} void setType( NPC_PLATFORM_UNIT_TYPE newType ) {m_type = newType;}
void setTypeFromMapEdit( u16 newType ); void setTypeFromMapEdit( u16 newType );
void setLayerCollision( class CLayerCollision *_layer ) {m_layerCollision=_layer;} void setLayerCollision( class CLayerCollision *_layer ) {m_layerCollision=_layer;}