From f821541cf302e9866e21457c371e27c46bcaf759 Mon Sep 17 00:00:00 2001 From: Charles Date: Wed, 30 May 2001 18:31:57 +0000 Subject: [PATCH] --- source/enemy/nsdart.cpp | 2 +- source/platform/pconveyr.cpp | 122 ++++++++++++++++++++++++++-------- source/platform/pconveyr.h | 5 ++ source/platform/pfallnor.cpp | 125 +++++++++++++++++++++++++++++------ source/platform/pfallnor.h | 6 ++ 5 files changed, 213 insertions(+), 47 deletions(-) diff --git a/source/enemy/nsdart.cpp b/source/enemy/nsdart.cpp index 1cb376fe4..dcf140574 100644 --- a/source/enemy/nsdart.cpp +++ b/source/enemy/nsdart.cpp @@ -185,7 +185,7 @@ void CNpcSquidDartEnemy::processClose( int _frames ) } else { - if ( yAim ) + if ( abs( yAim ) > 20 ) { movement = yAim; diff --git a/source/platform/pconveyr.cpp b/source/platform/pconveyr.cpp index 1a2806bea..fd1abb7b7 100644 --- a/source/platform/pconveyr.cpp +++ b/source/platform/pconveyr.cpp @@ -27,6 +27,11 @@ #include "platform\pfallnor.h" #endif +#ifndef __VID_HEADER_ +#include "system\vid.h" +#endif + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void CNpcConveyorPlatformGenerator::collidedWith(CThing *_thisThing) @@ -102,6 +107,9 @@ void CNpcConveyorPlatform::postInit() CNpcPlatform::postInit(); m_npcPath.setPathType( CNpcPath::SINGLE_USE_PATH ); + + m_spinFinish = false; + m_rotation = 0; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -112,40 +120,59 @@ void CNpcConveyorPlatform::processMovement( int _frames ) s32 distX, distY; bool pathComplete, waypointChange; - m_npcPath.think( Pos, &pathComplete, &waypointChange, &distX, &distY ); - - if ( pathComplete ) + if ( m_spinFinish ) { - setToShutdown(); + m_rotation += 64 * _frames; + m_rotation &= 4095; + + DVECTOR offset = CLevel::getCameraPos(); + + Pos.vy += 3 * _frames; + + s32 yPos = Pos.vy - offset.vy; + + if ( yPos > VidGetScrH() ) + { + setToShutdown(); + } } else { - if ( distX ) - { - moveX = distX; + m_npcPath.think( Pos, &pathComplete, &waypointChange, &distX, &distY ); - if ( moveX > 1 ) - { - moveX = 1; - } - else if ( moveX < -1 ) - { - moveX = -1; - } + if ( pathComplete ) + { + m_spinFinish = true; } else { - moveY = distY; - - s32 verticalMovement = 3 * _frames; - - if ( moveY > verticalMovement ) + if ( distX ) { - moveY = verticalMovement; + moveX = distX; + + if ( moveX > 1 ) + { + moveX = 1; + } + else if ( moveX < -1 ) + { + moveX = -1; + } } - else if ( moveY < -verticalMovement ) + else { - moveY = -verticalMovement; + moveY = distY; + + s32 verticalMovement = 3 * _frames; + + if ( moveY > verticalMovement ) + { + moveY = verticalMovement; + } + else if ( moveY < -verticalMovement ) + { + moveY = -verticalMovement; + } } } } @@ -225,9 +252,10 @@ void CNpcConveyorPlatform::collidedWith( CThing *_thisThing ) case TYPE_HAZARD: { - // needs to explode or something - - setToShutdown(); + if ( !m_spinFinish ) + { + m_spinFinish = true; + } break; } @@ -237,3 +265,45 @@ void CNpcConveyorPlatform::collidedWith( CThing *_thisThing ) break; } } + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void CNpcConveyorPlatform::render() +{ + if ( m_isActive ) + { + CPlatformThing::render(); + + // Render + if (canRender()) + { + DVECTOR &renderPos=getRenderPos(); + + SVECTOR rotation; + rotation.vx = 0; + rotation.vy = 0; + rotation.vz = m_rotation; + + VECTOR scale; + scale.vx = ONE; + scale.vy = ONE; + scale.vz = ONE; + + m_modelGfx->Render(renderPos,&rotation,&scale); + } + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +int CNpcConveyorPlatform::checkCollisionAgainst(CThing *_thisThing, int _frames) +{ + if ( m_spinFinish ) + { + return( false ); + } + else + { + return( CNpcPlatform::checkCollisionAgainst( _thisThing, _frames ) ); + } +} diff --git a/source/platform/pconveyr.h b/source/platform/pconveyr.h index b1e87a2d6..ac1e7b247 100644 --- a/source/platform/pconveyr.h +++ b/source/platform/pconveyr.h @@ -23,9 +23,14 @@ class CNpcConveyorPlatform : public CNpcPlatform public: virtual void postInit(); virtual CRECT const *getThinkBBox(); + virtual void render(); + virtual int checkCollisionAgainst(CThing *_thisThing, int _frames); protected: virtual void processMovement( int _frames ); virtual void collidedWith(CThing *_thisThing); + + u8 m_spinFinish; + s16 m_rotation; }; class CNpcConveyorPlatformGenerator : public CNpcPlatform diff --git a/source/platform/pfallnor.cpp b/source/platform/pfallnor.cpp index a289aa166..c932e1c9a 100644 --- a/source/platform/pfallnor.cpp +++ b/source/platform/pfallnor.cpp @@ -23,6 +23,11 @@ #include "utils\utils.h" #endif +#ifndef __VID_HEADER_ +#include "system\vid.h" +#endif + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void CNpcFallingNoRespawnPlatform::postInit() @@ -30,46 +35,84 @@ void CNpcFallingNoRespawnPlatform::postInit() CNpcPlatform::postInit(); m_npcPath.setPathType( CNpcPath::SINGLE_USE_PATH ); + + m_spinFinish = false; + m_rotation = 0; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void CNpcFallingNoRespawnPlatform::processMovement( int _frames ) { - s32 moveX, moveY; + s32 moveX = 0, moveY = 0; s32 distX, distY, heading; bool pathComplete; - m_npcPath.thinkVertical( Pos, &pathComplete, &distX, &distY, &heading ); - - if ( pathComplete ) + if ( m_spinFinish ) { - setToShutdown(); + m_rotation += 64 * _frames; + m_rotation &= 4095; + + DVECTOR offset = CLevel::getCameraPos(); + + if ( m_bounceDir ) + { + Pos.vx += 2 * _frames; + } + else + { + Pos.vx -= 2 * _frames; + } + + Pos.vy += m_speed * _frames; + + if ( m_speed < 3 ) + { + m_speed++; + } + + s32 yPos = Pos.vy - offset.vy; + + if ( yPos > VidGetScrH() ) + { + setToShutdown(); + } } else { - moveX = 0; - moveY = m_speed * _frames; + m_npcPath.thinkVertical( Pos, &pathComplete, &distX, &distY, &heading ); - if ( heading == 3072 ) + if ( pathComplete ) { - moveY = -moveY; + m_spinFinish = true; + m_speed = -5; + m_bounceDir = getRnd() % 2; } - - s32 groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx + moveX, Pos.vy + moveY, 16 ); - - if ( groundHeight < moveY ) + else { - if ( ( CGameScene::getCollision()->getCollisionBlock( Pos.vx, Pos.vy + groundHeight + 8 ) & COLLISION_TYPE_MASK ) != COLLISION_TYPE_FLAG_DEATH_FALL ) + moveX = 0; + moveY = m_speed * _frames; + + if ( heading == 3072 ) { - moveY = groundHeight; - moveX = 2 * _frames; + moveY = -moveY; + } + + s32 groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx + moveX, Pos.vy + moveY, 16 ); + + if ( groundHeight < moveY ) + { + if ( ( CGameScene::getCollision()->getCollisionBlock( Pos.vx, Pos.vy + groundHeight + 8 ) & COLLISION_TYPE_MASK ) != COLLISION_TYPE_FLAG_DEATH_FALL ) + { + moveY = groundHeight; + moveX = 2 * _frames; + } } } - - Pos.vx += moveX; - Pos.vy += moveY; } + + Pos.vx += moveX; + Pos.vy += moveY; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -85,4 +128,46 @@ const CRECT *CNpcFallingNoRespawnPlatform::getThinkBBox() objThinkBox.y2 = thinkBBox.YMax; return &objThinkBox; -} \ No newline at end of file +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void CNpcFallingNoRespawnPlatform::render() +{ + if ( m_isActive ) + { + CPlatformThing::render(); + + // Render + if (canRender()) + { + DVECTOR &renderPos=getRenderPos(); + + SVECTOR rotation; + rotation.vx = 0; + rotation.vy = 0; + rotation.vz = m_rotation; + + VECTOR scale; + scale.vx = ONE; + scale.vy = ONE; + scale.vz = ONE; + + m_modelGfx->Render(renderPos,&rotation,&scale); + } + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +int CNpcFallingNoRespawnPlatform::checkCollisionAgainst(CThing *_thisThing, int _frames) +{ + if ( m_spinFinish ) + { + return( false ); + } + else + { + return( CNpcPlatform::checkCollisionAgainst( _thisThing, _frames ) ); + } +} diff --git a/source/platform/pfallnor.h b/source/platform/pfallnor.h index 8b0c380ea..089df9029 100644 --- a/source/platform/pfallnor.h +++ b/source/platform/pfallnor.h @@ -23,8 +23,14 @@ class CNpcFallingNoRespawnPlatform : public CNpcPlatform public: virtual void postInit(); virtual CRECT const *getThinkBBox(); + virtual int checkCollisionAgainst(CThing *_thisThing, int _frames); protected: + virtual void render(); virtual void processMovement( int _frames ); + + u8 m_spinFinish; + s16 m_rotation; + u8 m_bounceDir; }; #endif \ No newline at end of file