This commit is contained in:
Charles 2001-04-12 16:33:48 +00:00
parent c050e9fb83
commit 8538d72b10
9 changed files with 187 additions and 29 deletions

View File

@ -186,6 +186,8 @@ void CNpcEnemy::processCloseAnemone2Attack( int _frames )
nextThing = nextThing->getNext(); nextThing = nextThing->getNext();
} }
removeAllChild();
// attach new spikes // attach new spikes
for ( fireLoop = 0 ; fireLoop < 5 ; fireLoop++ ) for ( fireLoop = 0 ; fireLoop < 5 ; fireLoop++ )

View File

@ -248,6 +248,7 @@ void CNpcEnemy::init()
m_heading = m_fireHeading = 0; m_heading = m_fireHeading = 0;
m_movementTimer = 0; m_movementTimer = 0;
m_timerTimer = 0; m_timerTimer = 0;
m_attackTimer = 0;
m_velocity = 0; m_velocity = 0;
m_extension = 0; m_extension = 0;
m_rotation = 0; m_rotation = 0;
@ -577,6 +578,7 @@ void CNpcEnemy::reinit()
m_heading = m_fireHeading = 0; m_heading = m_fireHeading = 0;
m_movementTimer = 0; m_movementTimer = 0;
m_timerTimer = 0; m_timerTimer = 0;
m_attackTimer = 0;
m_velocity = 0; m_velocity = 0;
m_extension = 0; m_extension = 0;
m_rotation = 0; m_rotation = 0;
@ -622,6 +624,19 @@ void CNpcEnemy::shutdown()
m_positionHistory = NULL; m_positionHistory = NULL;
delete m_actorGfx; delete m_actorGfx;
// remove child elements
CThing *List = this->getNext();
while ( List )
{
CThing *Next = List->getNext();
List->shutdown();
List = Next;
}
CEnemyThing::shutdown(); CEnemyThing::shutdown();
} }
@ -709,7 +724,7 @@ void CNpcEnemy::collidedWith( CThing *_thisThing )
{ {
case TYPE_PLAYER: 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 // 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() void CNpcEnemy::hasBeenAttacked()
{ {
m_controlFunc = NPC_CONTROL_SHOT; m_controlFunc = NPC_CONTROL_SHOT;
m_state = NPC_GENERIC_HIT_CHECK_HEALTH;
} }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -1352,7 +1368,17 @@ void CNpcEnemy::processShot()
{ {
if ( !m_animPlaying ) 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; break;
@ -1512,10 +1538,12 @@ void CNpcEnemy::processCollision()
{ {
CPlayer *player = GameScene.getPlayer(); CPlayer *player = GameScene.getPlayer();
//player->takeDamage( m_data[m_type].damageToUserType ); player->takeDamage( m_data[m_type].damageToUserType );
m_controlFunc = m_oldControlFunc; m_controlFunc = m_oldControlFunc;
m_attackTimer = GameState::getOneSecondInFrames();
break; break;
} }
@ -1532,6 +1560,16 @@ void CNpcEnemy::processCollision()
void CNpcEnemy::processTimer(int _frames) void CNpcEnemy::processTimer(int _frames)
{ {
if ( m_attackTimer > 0 )
{
m_attackTimer -= _frames;
if ( m_attackTimer < 0 )
{
m_attackTimer = 0;
}
}
if ( m_timerTimer > 0 ) if ( m_timerTimer > 0 )
{ {
m_timerTimer -= _frames; m_timerTimer -= _frames;
@ -1663,11 +1701,18 @@ bool CNpcEnemy::canBeCaughtByNet()
void CNpcEnemy::caughtWithNet() 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_timerFunc = NPC_TIMER_RESPAWN;
m_timerTimer = 4 * GameState::getOneSecondInFrames(); m_timerTimer = 4 * GameState::getOneSecondInFrames();
}
}
else
{
shutdown();
} }
} }

View File

@ -435,6 +435,7 @@ protected:
u16 recoilAnim; u16 recoilAnim;
NPC_COLLISION_FUNC collisionFunc; NPC_COLLISION_FUNC collisionFunc;
bool canBeNetted; bool canBeNetted;
bool respawning;
} }
NPC_DATA; NPC_DATA;
@ -601,6 +602,7 @@ protected:
bool m_reversed; bool m_reversed;
s32 m_health; s32 m_health;
bool m_isActive; bool m_isActive;
s32 m_attackTimer;
s32 m_frame; s32 m_frame;
int m_animNo; int m_animNo;

View File

@ -336,6 +336,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_FISH_HOOK { // NPC_FISH_HOOK
@ -359,6 +360,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_DUST_DEVIL { // NPC_DUST_DEVIL
@ -382,6 +384,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_PENDULUM { // NPC_PENDULUM
@ -405,6 +408,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_FIREBALL { // NPC_FIREBALL
@ -428,6 +432,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_SAW_BLADE { // NPC_SAW_BLADE
@ -451,6 +456,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_SMALL_JELLYFISH_1 { // NPC_SMALL_JELLYFISH_1
@ -465,7 +471,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
3, 3,
128, 128,
DETECT_NO_COLLISION, DETECT_ALL_COLLISION,
DAMAGE__SHOCK_ENEMY, DAMAGE__SHOCK_ENEMY,
16, 16,
ANIM_JELLYFISH1_SWIM, ANIM_JELLYFISH1_SWIM,
@ -474,6 +480,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
ANIM_JELLYFISH1_SWIM, ANIM_JELLYFISH1_SWIM,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
true, true,
true,
}, },
{ // NPC_SMALL_JELLYFISH_2 { // NPC_SMALL_JELLYFISH_2
@ -488,7 +495,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
3, 3,
128, 128,
DETECT_NO_COLLISION, DETECT_ALL_COLLISION,
DAMAGE__SHOCK_ENEMY, DAMAGE__SHOCK_ENEMY,
32, 32,
0, 0,
@ -497,6 +504,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
true,
}, },
{ // NPC_ANEMONE_1 { // NPC_ANEMONE_1
@ -520,6 +528,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_ANEMONE_2 { // NPC_ANEMONE_2
@ -543,6 +552,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_ANEMONE_3 { // NPC_ANEMONE_3
@ -566,6 +576,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_SKELETAL_FISH { // NPC_SKELETAL_FISH
@ -580,7 +591,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
3, 3,
2048, 2048,
DETECT_NO_COLLISION, DETECT_ALL_COLLISION,
DAMAGE__BITE_ENEMY, DAMAGE__BITE_ENEMY,
0, 0,
ANIM_SKELETALFISH_SWIM, ANIM_SKELETALFISH_SWIM,
@ -589,6 +600,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
ANIM_SKELETALFISH_GETHIT, ANIM_SKELETALFISH_GETHIT,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_CLAM_JUMP { // NPC_CLAM_JUMP
@ -603,7 +615,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
0, 0,
128, 128,
DETECT_NO_COLLISION, DETECT_ATTACK_COLLISION_GENERIC,
DAMAGE__HIT_ENEMY, DAMAGE__HIT_ENEMY,
0, 0,
0, 0,
@ -612,6 +624,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_CLAM_STATIC { // NPC_CLAM_STATIC
@ -626,7 +639,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
0, 0,
128, 128,
DETECT_NO_COLLISION, DETECT_ATTACK_COLLISION_GENERIC,
DAMAGE__HIT_ENEMY, DAMAGE__HIT_ENEMY,
0, 0,
0, 0,
@ -635,6 +648,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_SQUID_DART { // NPC_SQUID_DART
@ -649,7 +663,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
5, 5,
256, 256,
DETECT_NO_COLLISION, DETECT_ALL_COLLISION,
DAMAGE__HIT_ENEMY, DAMAGE__HIT_ENEMY,
16, 16,
ANIM_SQUIDDART_SWIM, ANIM_SQUIDDART_SWIM,
@ -658,6 +672,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_FISH_FOLK { // NPC_FISH_FOLK
@ -681,6 +696,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_PRICKLY_BUG { // NPC_PRICKLY_BUG
@ -695,7 +711,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
1, 1,
128, 128,
DETECT_NO_COLLISION, DETECT_ALL_COLLISION,
DAMAGE__POISON_ENEMY, DAMAGE__POISON_ENEMY,
48, 48,
ANIM_CATERPILLAR_CRAWL, ANIM_CATERPILLAR_CRAWL,
@ -704,6 +720,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
ANIM_CATERPILLAR_GETHIT, ANIM_CATERPILLAR_GETHIT,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_SEA_SNAKE { // NPC_SEA_SNAKE
@ -718,7 +735,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
3, 3,
256, 256,
DETECT_NO_COLLISION, DETECT_ATTACK_COLLISION_GENERIC,
DAMAGE__SHOCK_ENEMY, DAMAGE__SHOCK_ENEMY,
56, 56,
0, 0,
@ -727,6 +744,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_PUFFA_FISH { // NPC_PUFFA_FISH
@ -741,7 +759,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
2, 2,
128, 128,
DETECT_NO_COLLISION, DETECT_ALL_COLLISION,
DAMAGE__HIT_ENEMY, DAMAGE__HIT_ENEMY,
64, 64,
ANIM_PUFFAFISH_SWIM, ANIM_PUFFAFISH_SWIM,
@ -750,6 +768,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_ANGLER_FISH { // NPC_ANGLER_FISH
@ -773,6 +792,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_HERMIT_CRAB { // NPC_HERMIT_CRAB
@ -787,7 +807,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
2, 2,
128, 128,
DETECT_NO_COLLISION, DETECT_ATTACK_COLLISION_GENERIC,
DAMAGE__HIT_ENEMY, DAMAGE__HIT_ENEMY,
32, 32,
ANIM_HERMITCRAB_SCUTTLE, ANIM_HERMITCRAB_SCUTTLE,
@ -796,6 +816,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
ANIM_HERMITCRAB_GETHIT, ANIM_HERMITCRAB_GETHIT,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_MINE { // NPC_MINE
@ -810,7 +831,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
0, 0,
128, 128,
DETECT_NO_COLLISION, DETECT_ALL_COLLISION,
DAMAGE__HIT_ENEMY, DAMAGE__HIT_ENEMY,
0, 0,
0, 0,
@ -819,6 +840,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_BOOGER_MONSTER { // NPC_BOOGER_MONSTER
@ -833,7 +855,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
0, 0,
128, 128,
DETECT_NO_COLLISION, DETECT_ATTACK_COLLISION_GENERIC,
DAMAGE__BITE_ENEMY, DAMAGE__BITE_ENEMY,
0, 0,
0, 0,
@ -842,6 +864,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_SPIDER_CRAB { // NPC_SPIDER_CRAB
@ -865,6 +888,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
ANIM_SPIDERCRAB_HIT, ANIM_SPIDERCRAB_HIT,
NPC_COLLISION_SPIDER_CRAB_BITE, NPC_COLLISION_SPIDER_CRAB_BITE,
false, false,
false,
}, },
{ // NPC_EYEBALL { // NPC_EYEBALL
@ -888,6 +912,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_BABY_OCTOPUS { // NPC_BABY_OCTOPUS
@ -902,7 +927,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
2, 2,
512, 512,
DETECT_NO_COLLISION, DETECT_ATTACK_COLLISION_GENERIC,
DAMAGE__HIT_ENEMY, DAMAGE__HIT_ENEMY,
32, 32,
ANIM_BABYOCTOPUS_SWIM, ANIM_BABYOCTOPUS_SWIM,
@ -911,6 +936,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
ANIM_BABYOCTOPUS_HIT, ANIM_BABYOCTOPUS_HIT,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_ZOMBIE_FISH_FOLK { // NPC_ZOMBIE_FISH_FOLK
@ -925,7 +951,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
2, 2,
2048, 2048,
DETECT_NO_COLLISION, DETECT_ALL_COLLISION,
DAMAGE__HIT_ENEMY, DAMAGE__HIT_ENEMY,
16, 16,
0, 0,
@ -934,6 +960,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_NINJA_STARFISH { // NPC_NINJA_STARFISH
@ -948,7 +975,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
3, 3,
64, 64,
DETECT_NO_COLLISION, DETECT_ALL_COLLISION,
DAMAGE__HIT_ENEMY, DAMAGE__HIT_ENEMY,
16, 16,
0, 0,
@ -957,6 +984,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_GHOST { // NPC_GHOST
@ -971,7 +999,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
2, 2,
128, 128,
DETECT_NO_COLLISION, DETECT_ALL_COLLISION,
DAMAGE__HIT_ENEMY, DAMAGE__HIT_ENEMY,
0, 0,
ANIM_GHOST_MOVE, ANIM_GHOST_MOVE,
@ -980,6 +1008,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_GHOST_PIRATE { // NPC_GHOST_PIRATE
@ -994,7 +1023,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
0, 0,
128, 128,
DETECT_NO_COLLISION, DETECT_ALL_COLLISION,
DAMAGE__HIT_ENEMY, DAMAGE__HIT_ENEMY,
160, 160,
0, 0,
@ -1003,6 +1032,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_FLAMING_SKULL { // NPC_FLAMING_SKULL
@ -1017,7 +1047,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
3, 3,
128, 128,
DETECT_NO_COLLISION, DETECT_ALL_COLLISION,
DAMAGE__BURN_ENEMY, DAMAGE__BURN_ENEMY,
16, 16,
ANIM_FLAMINGSKULL_MOVE, ANIM_FLAMINGSKULL_MOVE,
@ -1026,6 +1056,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_SHARK_MAN { // NPC_SHARK_MAN
@ -1040,7 +1071,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
3, 3,
2048, 2048,
DETECT_NO_COLLISION, DETECT_ALL_COLLISION,
DAMAGE__BITE_ENEMY, DAMAGE__BITE_ENEMY,
16, 16,
ANIM_SHARKMAN_RUN, ANIM_SHARKMAN_RUN,
@ -1049,6 +1080,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
ANIM_SHARKMAN_BLOCK, ANIM_SHARKMAN_BLOCK,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_OIL_BLOB { // NPC_OIL_BLOB
@ -1063,7 +1095,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
3, 3,
64, 64,
DETECT_NO_COLLISION, DETECT_ALL_COLLISION,
DAMAGE__HIT_ENEMY, DAMAGE__HIT_ENEMY,
0, 0,
0, 0,
@ -1072,6 +1104,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_SKULL_STOMPER { // NPC_SKULL_STOMPER
@ -1086,7 +1119,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
5, 5,
2048, 2048,
DETECT_NO_COLLISION, DETECT_ALL_COLLISION,
DAMAGE__SQUASH_ENEMY, DAMAGE__SQUASH_ENEMY,
0, 0,
ANIM_STOMPER_CRUSH, ANIM_STOMPER_CRUSH,
@ -1095,6 +1128,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_MOTHER_JELLYFISH { // NPC_MOTHER_JELLYFISH
@ -1118,6 +1152,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_SUB_SHARK { // NPC_SUB_SHARK
@ -1141,6 +1176,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_PARASITIC_WORM { // NPC_PARASITIC_WORM
@ -1164,6 +1200,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_FLYING_DUTCHMAN { // NPC_FLYING_DUTCHMAN
@ -1187,6 +1224,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
ANIM_FLYINGDUTCHMAN_GETHIT, ANIM_FLYINGDUTCHMAN_GETHIT,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_IRON_DOGFISH { // NPC_IRON_DOGFISH
@ -1210,6 +1248,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
ANIM_IRONDOGFISH_GETHIT, ANIM_IRONDOGFISH_GETHIT,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_PARASITIC_WORM_SEGMENT { // NPC_PARASITIC_WORM_SEGMENT
@ -1233,6 +1272,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
{ // NPC_BALL_BLOB { // NPC_BALL_BLOB
@ -1247,7 +1287,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
false, false,
3, 3,
128, 128,
DETECT_NO_COLLISION, DETECT_ALL_COLLISION,
DAMAGE__BURN_ENEMY, DAMAGE__BURN_ENEMY,
16, 16,
ANIM_BALLBLOB_WOBBLE, ANIM_BALLBLOB_WOBBLE,
@ -1256,6 +1296,7 @@ CNpcEnemy::NPC_DATA CNpcEnemy::m_data[NPC_UNIT_TYPE_MAX] =
0, 0,
NPC_COLLISION_GENERIC, NPC_COLLISION_GENERIC,
false, false,
false,
}, },
}; };

View File

@ -290,6 +290,7 @@ void CPlayerModeJellyLauncher::launchProjectile()
CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE, CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE,
CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE, CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE,
5*60); 5*60);
projectile->setLayerCollision( m_player->getLayerCollision() );
fireHeading+=512; fireHeading+=512;
m_player->useOneJelly(); m_player->useOneJelly();
} }
@ -304,6 +305,7 @@ void CPlayerModeJellyLauncher::launchProjectile()
CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE, CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE,
CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE, CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE,
5*60); 5*60);
projectile->setLayerCollision( m_player->getLayerCollision() );
m_player->useOneJelly(); m_player->useOneJelly();
} }
} }

View File

@ -168,6 +168,7 @@ void CPlayerModeNet::think()
CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE, CPlayerProjectile::PLAYER_PROJECTILE_DUMBFIRE,
CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE, CPlayerProjectile::PLAYER_PROJECTILE_FINITE_LIFE,
5*60); 5*60);
projectile->setLayerCollision( m_player->getLayerCollision() );
m_netState=NET_STATE__JUST_LAUNCHED_SOMETHING; m_netState=NET_STATE__JUST_LAUNCHED_SOMETHING;
} }

View File

@ -43,6 +43,10 @@
#include "player\player.h" #include "player\player.h"
#endif #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() 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;
}
}
/*****************************************************************************/ /*****************************************************************************/

View File

@ -64,6 +64,7 @@ private:
protected: protected:
DVECTOR getScreenOffset(); DVECTOR getScreenOffset();
bool processTargetSeek( int _frames, DVECTOR targetPos ); bool processTargetSeek( int _frames, DVECTOR targetPos );
void collidedWith( CThing *_thisThing );
class SpriteBank *m_spriteBank; class SpriteBank *m_spriteBank;
DVECTOR m_initPos; DVECTOR m_initPos;
@ -111,6 +112,7 @@ private:
protected: protected:
DVECTOR getScreenOffset(); DVECTOR getScreenOffset();
void collidedWith( CThing *_thisThing );
class SpriteBank *m_spriteBank; class SpriteBank *m_spriteBank;
DVECTOR m_initPos; DVECTOR m_initPos;

View File

@ -198,6 +198,24 @@ void CThingManager::thinkAllThings(int _frames)
thing1=thing1->m_nextThing; 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;
}
} }
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------