X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fbadguy%2Fsnail.cpp;h=f0f62f209677dcfd9434326bcea402fc099f8237;hb=b91dbe6bc1d5047a127cdc688dda836c59e8c2d1;hp=cff4b6304fb4f8de9647e9cb6cabb8babdc68ad4;hpb=fefd18c624061788e7ad599c07dea1dbf7ed6042;p=supertux.git diff --git a/src/badguy/snail.cpp b/src/badguy/snail.cpp index cff4b6304..f0f62f209 100644 --- a/src/badguy/snail.cpp +++ b/src/badguy/snail.cpp @@ -30,29 +30,29 @@ const float SNAIL_KICK_SPEED_Y = -500; /**< y-velocity gained when kicked */ } Snail::Snail(const Reader& reader) : - WalkingBadguy(reader, "images/creatures/snail/snail.sprite", "left", "right"), - state(STATE_NORMAL), + WalkingBadguy(reader, "images/creatures/snail/snail.sprite", "left", "right"), + state(STATE_NORMAL), kicked_delay_timer(), squishcount(0) { walk_speed = 80; max_drop_height = 600; - sound_manager->preload("sounds/iceblock_bump.wav"); - sound_manager->preload("sounds/stomp.wav"); - sound_manager->preload("sounds/kick.wav"); + SoundManager::current()->preload("sounds/iceblock_bump.wav"); + SoundManager::current()->preload("sounds/stomp.wav"); + SoundManager::current()->preload("sounds/kick.wav"); } Snail::Snail(const Vector& pos, Direction d) : - WalkingBadguy(pos, d, "images/creatures/snail/snail.sprite", "left", "right"), - state(STATE_NORMAL), + WalkingBadguy(pos, d, "images/creatures/snail/snail.sprite", "left", "right"), + state(STATE_NORMAL), kicked_delay_timer(), squishcount(0) { walk_speed = 80; max_drop_height = 600; - sound_manager->preload("sounds/iceblock_bump.wav"); - sound_manager->preload("sounds/stomp.wav"); - sound_manager->preload("sounds/kick.wav"); + SoundManager::current()->preload("sounds/iceblock_bump.wav"); + SoundManager::current()->preload("sounds/stomp.wav"); + SoundManager::current()->preload("sounds/kick.wav"); } void @@ -87,7 +87,7 @@ Snail::be_kicked() state = STATE_KICKED_DELAY; sprite->set_action(dir == LEFT ? "flat-left" : "flat-right", 1); - physic.set_velocity_x(0); + physic.set_velocity_x(dir == LEFT ? -SNAIL_KICK_SPEED : SNAIL_KICK_SPEED); physic.set_velocity_y(0); // start a timer to delay addition of upward movement until we are (hopefully) out from under the player @@ -102,6 +102,12 @@ Snail::can_break(){ void Snail::active_update(float elapsed_time) { + if(frozen) + { + BadGuy::active_update(elapsed_time); + return; + } + switch (state) { case STATE_NORMAL: @@ -132,16 +138,28 @@ Snail::active_update(float elapsed_time) BadGuy::active_update(elapsed_time); } +bool +Snail::is_freezable() const +{ + return true; +} + void Snail::collision_solid(const CollisionHit& hit) { + if(frozen) + { + WalkingBadguy::collision_solid(hit); + return; + } + switch (state) { case STATE_NORMAL: WalkingBadguy::collision_solid(hit); return; case STATE_KICKED: if(hit.left || hit.right) { - sound_manager->play("sounds/iceblock_bump.wav", get_pos()); + SoundManager::current()->play("sounds/iceblock_bump.wav", get_pos()); if( ( dir == LEFT && hit.left ) || ( dir == RIGHT && hit.right) ){ dir = (dir == LEFT) ? RIGHT : LEFT; @@ -166,6 +184,9 @@ Snail::collision_solid(const CollisionHit& hit) HitResponse Snail::collision_badguy(BadGuy& badguy, const CollisionHit& hit) { + if(frozen) + return WalkingBadguy::collision_badguy(badguy, hit); + switch(state) { case STATE_NORMAL: return WalkingBadguy::collision_badguy(badguy, hit); @@ -182,28 +203,60 @@ Snail::collision_badguy(BadGuy& badguy, const CollisionHit& hit) return ABORT_MOVE; } +HitResponse +Snail::collision_player(Player& player, const CollisionHit& hit) +{ + if(frozen) + return WalkingBadguy::collision_player(player, hit); + + // handle kicks from left or right side + if(state == STATE_FLAT && (hit.left || hit.right)) { + if(hit.left) { + dir = RIGHT; + } else if(hit.right) { + dir = LEFT; + } + player.kick(); + be_kicked(); + return FORCE_MOVE; + } + + return BadGuy::collision_player(player, hit); +} + bool Snail::collision_squished(GameObject& object) { + if(frozen) + return WalkingBadguy::collision_squished(object); + + Player* player = dynamic_cast(&object); + if(player && (player->does_buttjump || player->is_invincible())) { + kill_fall(); + player->bounce(*this); + return true; + } + switch(state) { case STATE_KICKED: case STATE_NORMAL: - { - Player* player = dynamic_cast(&object); + + // Can't stomp in midair + if(!on_ground()) + break; + squishcount++; - if ((squishcount >= MAX_SNAIL_SQUISHES) || (player && player->does_buttjump)) { + if (squishcount >= MAX_SNAIL_SQUISHES) { kill_fall(); return true; } - } - - sound_manager->play("sounds/stomp.wav", get_pos()); - be_flat(); - break; + SoundManager::current()->play("sounds/stomp.wav", get_pos()); + be_flat(); + break; case STATE_FLAT: - sound_manager->play("sounds/kick.wav", get_pos()); + SoundManager::current()->play("sounds/kick.wav", get_pos()); { MovingObject* movingobject = dynamic_cast(&object); if (movingobject && (movingobject->get_pos().x < get_pos().x)) { @@ -220,7 +273,6 @@ Snail::collision_squished(GameObject& object) } - Player* player = dynamic_cast(&object); if (player) player->bounce(*this); return true; }