From 9de1206cc2c61d25cb509f1bf0867767afc2015e Mon Sep 17 00:00:00 2001 From: Charles Date: Thu, 5 Jul 2001 18:21:45 +0000 Subject: [PATCH] --- Graphics/characters/Ghost/AnimList.Txt | 2 +- source/enemy/ndustdev.cpp | 134 ++++++++++++++++--------- source/enemy/ndustdev.h | 5 + source/enemy/npcdata.cpp | 8 +- 4 files changed, 99 insertions(+), 50 deletions(-) diff --git a/Graphics/characters/Ghost/AnimList.Txt b/Graphics/characters/Ghost/AnimList.Txt index 9d7210287..e91095d8e 100644 --- a/Graphics/characters/Ghost/AnimList.Txt +++ b/Graphics/characters/Ghost/AnimList.Txt @@ -1,2 +1,2 @@ Idle -Move + diff --git a/source/enemy/ndustdev.cpp b/source/enemy/ndustdev.cpp index 03845a7ea..54ffa46a2 100644 --- a/source/enemy/ndustdev.cpp +++ b/source/enemy/ndustdev.cpp @@ -29,6 +29,35 @@ void CNpcDustDevilEnemy::postInit() { m_npcPath.setPathType( CNpcPath::SINGLE_USE_PATH ); + + m_fadeVal = 128; + m_fadeOut = false; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void CNpcDustDevilEnemy::render() +{ + SprFrame = NULL; + + if ( m_isActive ) + { + CEnemyThing::render(); + + if (canRender()) + { + DVECTOR &renderPos=getRenderPos(); + + SprFrame = m_actorGfx->Render(renderPos,m_animNo,( m_frame >> 8 ),m_reversed); + setSemiTrans( SprFrame, true ); + m_actorGfx->RotateScale( SprFrame, renderPos, m_drawRotation, 4096, 4096 ); + setRGB0( SprFrame, m_fadeVal, m_fadeVal, m_fadeVal ); + + sBBox boundingBox = m_actorGfx->GetBBox(); + setCollisionSize( ( boundingBox.XMax - boundingBox.XMin ), ( boundingBox.YMax - boundingBox.YMin ) ); + setCollisionCentreOffset( ( boundingBox.XMax + boundingBox.XMin ) >> 1, ( boundingBox.YMax + boundingBox.YMin ) >> 1 ); + } + } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -57,73 +86,88 @@ void CNpcDustDevilEnemy::processMovement( int _frames ) m_animNo = m_data[m_type].moveAnim; } - // ignore y component of waypoint, since we are stuck to the ground - - if ( m_npcPath.thinkFlat( Pos, &pathComplete, &distX, &distY, &m_heading ) ) + if ( m_fadeOut ) { - // path has finished, waypoint has changed, or there are no waypoints - do not move horizontally + m_fadeVal -= _frames * 12; - if ( pathComplete ) + if ( m_fadeVal < 0 ) { m_npcPath.resetPath(); Pos = m_base; - } - else - { - // check for vertical movement - groundHeight = CGameScene::getCollision()->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; - } + m_fadeOut = false; + m_fadeVal = 128; } } else { - // check for collision + // ignore y component of waypoint, since we are stuck to the ground - distX = distX / abs( distX ); - - if ( CGameScene::getCollision()->getHeightFromGround( Pos.vx + ( distX * m_speed * _frames ), Pos.vy ) < -maxHeight ) + if ( m_npcPath.thinkFlat( Pos, &pathComplete, &distX, &distY, &m_heading ) ) { - // there is an obstacle in the way, increment the path point (hopefully this will resolve the problem) + // path has finished, waypoint has changed, or there are no waypoints - do not move horizontally - m_npcPath.incPath(); - } - else - { - // check for vertical movement - - groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); - - if ( groundHeight <= yMovement ) + if ( pathComplete ) { - // groundHeight <= yMovement indicates either just above ground or on or below ground - - moveX = distX * m_speed * _frames; - moveY = groundHeight; + m_fadeOut = true; } else { - // fall + // check for vertical movement - moveY = yMovement; + groundHeight = CGameScene::getCollision()->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 + { + // check for collision - processMovementModifier( _frames, moveX, moveY, moveVel, moveDist ); + distX = distX / abs( distX ); + + if ( CGameScene::getCollision()->getHeightFromGround( Pos.vx + ( distX * m_speed * _frames ), Pos.vy ) < -maxHeight ) + { + // there is an obstacle in the way, increment the path point (hopefully this will resolve the problem) + + m_npcPath.incPath(); + } + else + { + // check for vertical movement + + groundHeight = CGameScene::getCollision()->getHeightFromGround( Pos.vx, Pos.vy, yMovement + 16 ); + + if ( groundHeight <= yMovement ) + { + // groundHeight <= yMovement indicates either just above ground or on or below ground + + moveX = distX * m_speed * _frames; + moveY = groundHeight; + } + else + { + // fall + + moveY = yMovement; + } + } + } + + processMovementModifier( _frames, moveX, moveY, moveVel, moveDist ); + } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/enemy/ndustdev.h b/source/enemy/ndustdev.h index acf856952..50ee572f3 100644 --- a/source/enemy/ndustdev.h +++ b/source/enemy/ndustdev.h @@ -18,10 +18,15 @@ class CNpcDustDevilEnemy : public CNpcEnemy { public: void postInit(); + void render(); + u8 canCollideWithEnemy() {return( false );} protected: s32 getFrameShift( int _frames ); void processMovement( int _frames ); void processMovementModifier( int _frames, s32 distX, s32 distY, s32 dist, s16 headingChange ); + + s16 m_fadeVal; + u8 m_fadeOut; }; #endif \ No newline at end of file diff --git a/source/enemy/npcdata.cpp b/source/enemy/npcdata.cpp index 688b78de2..9064cd525 100644 --- a/source/enemy/npcdata.cpp +++ b/source/enemy/npcdata.cpp @@ -123,8 +123,8 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 3, 2048, - DETECT_NO_COLLISION, - DAMAGE__NONE, + DETECT_ALL_COLLISION, + DAMAGE__HIT_ENEMY, 1, ANIM_DUSTDEVIL_TWIST, NPC_SHOT_GENERIC, @@ -133,7 +133,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, false, false, - true, + false, CSoundMediator::NUM_SFXIDS, CSoundMediator::NUM_SFXIDS, false, @@ -699,7 +699,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = DETECT_ALL_COLLISION, DAMAGE__HIT_ENEMY, 1, - ANIM_GHOST_MOVE, + ANIM_GHOST_IDLE, NPC_SHOT_GENERIC, 0, 0,