diff --git a/source/enemy/nanemone.cpp b/source/enemy/nanemone.cpp index 6055ec417..13922ecc1 100644 --- a/source/enemy/nanemone.cpp +++ b/source/enemy/nanemone.cpp @@ -186,6 +186,8 @@ void CNpcEnemy::processCloseAnemone2Attack( int _frames ) nextThing = nextThing->getNext(); } + removeAllChild(); + // attach new spikes for ( fireLoop = 0 ; fireLoop < 5 ; fireLoop++ ) diff --git a/source/enemy/npc.cpp b/source/enemy/npc.cpp index 19d24c882..913f370ed 100644 --- a/source/enemy/npc.cpp +++ b/source/enemy/npc.cpp @@ -248,6 +248,7 @@ void CNpcEnemy::init() m_heading = m_fireHeading = 0; m_movementTimer = 0; m_timerTimer = 0; + m_attackTimer = 0; m_velocity = 0; m_extension = 0; m_rotation = 0; @@ -577,6 +578,7 @@ void CNpcEnemy::reinit() m_heading = m_fireHeading = 0; m_movementTimer = 0; m_timerTimer = 0; + m_attackTimer = 0; m_velocity = 0; m_extension = 0; m_rotation = 0; @@ -622,6 +624,19 @@ void CNpcEnemy::shutdown() m_positionHistory = NULL; delete m_actorGfx; + + // remove child elements + + CThing *List = this->getNext(); + + while ( List ) + { + CThing *Next = List->getNext(); + List->shutdown(); + + List = Next; + } + CEnemyThing::shutdown(); } @@ -709,7 +724,7 @@ void CNpcEnemy::collidedWith( CThing *_thisThing ) { case TYPE_PLAYER: { - if ( m_controlFunc != NPC_CONTROL_COLLISION ) + if ( m_controlFunc != NPC_CONTROL_COLLISION && m_attackTimer == 0 ) { // only detect collision if one isn't already happening @@ -1288,6 +1303,7 @@ void CNpcEnemy::processMovementModifier(int _frames, s32 distX, s32 distY, s32 d void CNpcEnemy::hasBeenAttacked() { m_controlFunc = NPC_CONTROL_SHOT; + m_state = NPC_GENERIC_HIT_CHECK_HEALTH; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1352,7 +1368,17 @@ void CNpcEnemy::processShot() { if ( !m_animPlaying ) { - this->shutdown(); + if ( m_data[m_type].respawning ) + { + m_isActive = false; + + m_timerFunc = NPC_TIMER_RESPAWN; + m_timerTimer = 4 * GameState::getOneSecondInFrames(); + } + else + { + shutdown(); + } } break; @@ -1512,10 +1538,12 @@ void CNpcEnemy::processCollision() { CPlayer *player = GameScene.getPlayer(); - //player->takeDamage( m_data[m_type].damageToUserType ); + player->takeDamage( m_data[m_type].damageToUserType ); m_controlFunc = m_oldControlFunc; + m_attackTimer = GameState::getOneSecondInFrames(); + break; } @@ -1532,6 +1560,16 @@ void CNpcEnemy::processCollision() void CNpcEnemy::processTimer(int _frames) { + if ( m_attackTimer > 0 ) + { + m_attackTimer -= _frames; + + if ( m_attackTimer < 0 ) + { + m_attackTimer = 0; + } + } + if ( m_timerTimer > 0 ) { m_timerTimer -= _frames; @@ -1663,11 +1701,18 @@ bool CNpcEnemy::canBeCaughtByNet() void CNpcEnemy::caughtWithNet() { - if ( m_isActive ) + if ( m_data[m_type].respawning ) { - m_isActive = false; + if ( m_isActive ) + { + m_isActive = false; - m_timerFunc = NPC_TIMER_RESPAWN; - m_timerTimer = 4 * GameState::getOneSecondInFrames(); + m_timerFunc = NPC_TIMER_RESPAWN; + m_timerTimer = 4 * GameState::getOneSecondInFrames(); + } + } + else + { + shutdown(); } } \ No newline at end of file diff --git a/source/enemy/npc.h b/source/enemy/npc.h index c238b9b3b..c487157d6 100644 --- a/source/enemy/npc.h +++ b/source/enemy/npc.h @@ -435,6 +435,7 @@ protected: u16 recoilAnim; NPC_COLLISION_FUNC collisionFunc; bool canBeNetted; + bool respawning; } NPC_DATA; @@ -601,6 +602,7 @@ protected: bool m_reversed; s32 m_health; bool m_isActive; + s32 m_attackTimer; s32 m_frame; int m_animNo; diff --git a/source/enemy/npcdata.cpp b/source/enemy/npcdata.cpp index 9d8ce38c6..571d74e0f 100644 --- a/source/enemy/npcdata.cpp +++ b/source/enemy/npcdata.cpp @@ -336,6 +336,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_FISH_HOOK @@ -359,6 +360,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_DUST_DEVIL @@ -382,6 +384,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_PENDULUM @@ -405,6 +408,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_FIREBALL @@ -428,6 +432,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_SAW_BLADE @@ -451,6 +456,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_SMALL_JELLYFISH_1 @@ -465,7 +471,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 3, 128, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__SHOCK_ENEMY, 16, ANIM_JELLYFISH1_SWIM, @@ -474,6 +480,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = ANIM_JELLYFISH1_SWIM, NPC_COLLISION_GENERIC, true, + true, }, { // NPC_SMALL_JELLYFISH_2 @@ -488,7 +495,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 3, 128, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__SHOCK_ENEMY, 32, 0, @@ -497,6 +504,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + true, }, { // NPC_ANEMONE_1 @@ -520,6 +528,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_ANEMONE_2 @@ -543,6 +552,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_ANEMONE_3 @@ -566,6 +576,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_SKELETAL_FISH @@ -580,7 +591,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 3, 2048, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__BITE_ENEMY, 0, ANIM_SKELETALFISH_SWIM, @@ -589,6 +600,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = ANIM_SKELETALFISH_GETHIT, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_CLAM_JUMP @@ -603,7 +615,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 0, 128, - DETECT_NO_COLLISION, + DETECT_ATTACK_COLLISION_GENERIC, DAMAGE__HIT_ENEMY, 0, 0, @@ -612,6 +624,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_CLAM_STATIC @@ -626,7 +639,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 0, 128, - DETECT_NO_COLLISION, + DETECT_ATTACK_COLLISION_GENERIC, DAMAGE__HIT_ENEMY, 0, 0, @@ -635,6 +648,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_SQUID_DART @@ -649,7 +663,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 5, 256, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__HIT_ENEMY, 16, ANIM_SQUIDDART_SWIM, @@ -658,6 +672,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_FISH_FOLK @@ -681,6 +696,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_PRICKLY_BUG @@ -695,7 +711,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 1, 128, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__POISON_ENEMY, 48, ANIM_CATERPILLAR_CRAWL, @@ -704,6 +720,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = ANIM_CATERPILLAR_GETHIT, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_SEA_SNAKE @@ -718,7 +735,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 3, 256, - DETECT_NO_COLLISION, + DETECT_ATTACK_COLLISION_GENERIC, DAMAGE__SHOCK_ENEMY, 56, 0, @@ -727,6 +744,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_PUFFA_FISH @@ -741,7 +759,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 2, 128, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__HIT_ENEMY, 64, ANIM_PUFFAFISH_SWIM, @@ -750,6 +768,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_ANGLER_FISH @@ -773,6 +792,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_HERMIT_CRAB @@ -787,7 +807,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 2, 128, - DETECT_NO_COLLISION, + DETECT_ATTACK_COLLISION_GENERIC, DAMAGE__HIT_ENEMY, 32, ANIM_HERMITCRAB_SCUTTLE, @@ -796,6 +816,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = ANIM_HERMITCRAB_GETHIT, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_MINE @@ -810,7 +831,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 0, 128, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__HIT_ENEMY, 0, 0, @@ -819,6 +840,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_BOOGER_MONSTER @@ -833,7 +855,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 0, 128, - DETECT_NO_COLLISION, + DETECT_ATTACK_COLLISION_GENERIC, DAMAGE__BITE_ENEMY, 0, 0, @@ -842,6 +864,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_SPIDER_CRAB @@ -865,6 +888,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = ANIM_SPIDERCRAB_HIT, NPC_COLLISION_SPIDER_CRAB_BITE, false, + false, }, { // NPC_EYEBALL @@ -888,6 +912,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_BABY_OCTOPUS @@ -902,7 +927,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 2, 512, - DETECT_NO_COLLISION, + DETECT_ATTACK_COLLISION_GENERIC, DAMAGE__HIT_ENEMY, 32, ANIM_BABYOCTOPUS_SWIM, @@ -911,6 +936,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = ANIM_BABYOCTOPUS_HIT, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_ZOMBIE_FISH_FOLK @@ -925,7 +951,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 2, 2048, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__HIT_ENEMY, 16, 0, @@ -934,6 +960,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_NINJA_STARFISH @@ -948,7 +975,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 3, 64, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__HIT_ENEMY, 16, 0, @@ -957,6 +984,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_GHOST @@ -971,7 +999,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 2, 128, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__HIT_ENEMY, 0, ANIM_GHOST_MOVE, @@ -980,6 +1008,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_GHOST_PIRATE @@ -994,7 +1023,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 0, 128, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__HIT_ENEMY, 160, 0, @@ -1003,6 +1032,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_FLAMING_SKULL @@ -1017,7 +1047,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 3, 128, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__BURN_ENEMY, 16, ANIM_FLAMINGSKULL_MOVE, @@ -1026,6 +1056,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_SHARK_MAN @@ -1040,7 +1071,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 3, 2048, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__BITE_ENEMY, 16, ANIM_SHARKMAN_RUN, @@ -1049,6 +1080,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = ANIM_SHARKMAN_BLOCK, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_OIL_BLOB @@ -1063,7 +1095,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 3, 64, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__HIT_ENEMY, 0, 0, @@ -1072,6 +1104,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_SKULL_STOMPER @@ -1086,7 +1119,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 5, 2048, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__SQUASH_ENEMY, 0, ANIM_STOMPER_CRUSH, @@ -1095,6 +1128,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_MOTHER_JELLYFISH @@ -1118,6 +1152,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_SUB_SHARK @@ -1141,6 +1176,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_PARASITIC_WORM @@ -1164,6 +1200,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_FLYING_DUTCHMAN @@ -1187,6 +1224,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = ANIM_FLYINGDUTCHMAN_GETHIT, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_IRON_DOGFISH @@ -1210,6 +1248,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = ANIM_IRONDOGFISH_GETHIT, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_PARASITIC_WORM_SEGMENT @@ -1233,6 +1272,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, { // NPC_BALL_BLOB @@ -1247,7 +1287,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = false, 3, 128, - DETECT_NO_COLLISION, + DETECT_ALL_COLLISION, DAMAGE__BURN_ENEMY, 16, ANIM_BALLBLOB_WOBBLE, @@ -1256,6 +1296,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] = 0, NPC_COLLISION_GENERIC, false, + false, }, }; diff --git a/source/player/pmjelly.cpp b/source/player/pmjelly.cpp index 55ab364c4..d57ee3fcc 100644 --- a/source/player/pmjelly.cpp +++ b/source/player/pmjelly.cpp @@ -290,6 +290,7 @@ void CPlayerModeJellyLauncher::launchProjectile() CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE, CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE, 5*60); + projectile->setLayerCollision( m_player->getLayerCollision() ); fireHeading+=512; m_player->useOneJelly(); } @@ -304,6 +305,7 @@ void CPlayerModeJellyLauncher::launchProjectile() CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE, CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE, 5*60); + projectile->setLayerCollision( m_player->getLayerCollision() ); m_player->useOneJelly(); } } diff --git a/source/player/pmnet.cpp b/source/player/pmnet.cpp index 5c4fe0d27..b91115518 100644 --- a/source/player/pmnet.cpp +++ b/source/player/pmnet.cpp @@ -168,6 +168,7 @@ void CPlayerModeNet::think() CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE, CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE, 5*60); + projectile->setLayerCollision( m_player->getLayerCollision() ); m_netState=NET_STATE__JUST_LAUNCHED_SOMETHING; } diff --git a/source/projectl/projectl.cpp b/source/projectl/projectl.cpp index 6355c4fed..9dbfe7118 100644 --- a/source/projectl/projectl.cpp +++ b/source/projectl/projectl.cpp @@ -43,6 +43,10 @@ #include "player\player.h" #endif +#ifndef __ENEMY_NPC_H__ +#include "enemy\npc.h" +#endif + /*****************************************************************************/ @@ -356,6 +360,28 @@ void CProjectile::processEvent( GAME_EVENT evt, CThing *sourceThing ) { } +void CProjectile::collidedWith(CThing *_thisThing) +{ + switch(_thisThing->getThingType()) + { + case TYPE_PLAYER: + { + CPlayer *player = (CPlayer *) _thisThing; + + player->takeDamage( DAMAGE__HIT_ENEMY ); + + shutdown(); + delete this; + + break; + } + + default: + ASSERT(0); + break; + } +} + /*****************************************************************************/ void CPlayerProjectile::init() @@ -492,4 +518,23 @@ void CPlayerProjectile::processEvent( GAME_EVENT evt, CThing *sourceThing ) { } +void CPlayerProjectile::collidedWith(CThing *_thisThing) +{ + switch(_thisThing->getThingType()) + { + case TYPE_ENEMY: + { + CNpcEnemy *enemy = (CNpcEnemy *) _thisThing; + + enemy->hasBeenAttacked(); + + break; + } + + default: + ASSERT(0); + break; + } +} + /*****************************************************************************/ diff --git a/source/projectl/projectl.h b/source/projectl/projectl.h index 13fdc10e6..957360f9b 100644 --- a/source/projectl/projectl.h +++ b/source/projectl/projectl.h @@ -64,6 +64,7 @@ private: protected: DVECTOR getScreenOffset(); bool processTargetSeek( int _frames, DVECTOR targetPos ); + void collidedWith( CThing *_thisThing ); class SpriteBank *m_spriteBank; DVECTOR m_initPos; @@ -111,6 +112,7 @@ private: protected: DVECTOR getScreenOffset(); + void collidedWith( CThing *_thisThing ); class SpriteBank *m_spriteBank; DVECTOR m_initPos; diff --git a/source/thing/thing.cpp b/source/thing/thing.cpp index 41cd4b25b..e4a99513b 100644 --- a/source/thing/thing.cpp +++ b/source/thing/thing.cpp @@ -198,6 +198,24 @@ void CThingManager::thinkAllThings(int _frames) thing1=thing1->m_nextThing; } + // 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); + } + thing2=thing2->m_nextThing; + } + thing1=thing1->m_nextThing; + } + } /*----------------------------------------------------------------------