From: Ricardo Cruz Date: Sun, 18 Apr 2004 11:09:55 +0000 (+0000) Subject: Patch by Ryan: X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=919d46f4dc58a127596d4b8a6b29409fcbf128b9;p=supertux.git Patch by Ryan: � Here's a patch that makes a few changes that makes ST more like SMB. Changes include: * Kicked mriceblocks (laptops) don't die after hitting a single enemy, they keep going to kill more badguys (or Tux if you're not careful) * You can now kick mriceblocks (laptops) by running into their sides. Before you had to jump on them to "kick" them and if you walked into their sides you would die (or shrink). * When badguys walk into one another they turn around instead of walking through eachother. � SVN-Revision: 550 --- diff --git a/src/badguy.cpp b/src/badguy.cpp index 2f7940530..91ca082a8 100644 --- a/src/badguy.cpp +++ b/src/badguy.cpp @@ -957,6 +957,7 @@ BadGuy::collision(void *p_c_object, int c_object, CollisionType type) return; } + /* COLLISION_NORMAL */ switch (c_object) { case CO_BULLET: @@ -965,13 +966,12 @@ BadGuy::collision(void *p_c_object, int c_object, CollisionType type) case CO_BADGUY: pbad_c = (BadGuy*) p_c_object; + + /* If we're a kicked mriceblock, kill any badguys we hit */ if(kind == BAD_LAPTOP && mode == KICK && pbad_c->kind != BAD_FLAME && pbad_c->kind != BAD_BOMB) { - /* We're in kick mode, kill the other guy - and yourself(wuahaha) : */ pbad_c->kill_me(); - kill_me(); } /* Kill badguys that run into exploding bomb */ @@ -993,8 +993,46 @@ BadGuy::collision(void *p_c_object, int c_object, CollisionType type) { pbad_c->kill_me(); } + + /* When enemies run into eachother, make them change directions */ + else + { + // Jumpy is an exception + if (pbad_c->kind == BAD_MONEY) + break; + if (dir == LEFT) + dir = RIGHT; + else if (dir == RIGHT) + dir = LEFT; + + physic.inverse_velocity_x(); + } break; + + case CO_PLAYER: + Player* player = static_cast(p_c_object); + /* Get kicked if were flat */ + if (mode == FLAT && !dying) + { + play_sound(sounds[SND_KICK], SOUND_CENTER_SPEAKER); + + // Hit from left side + if (player->base.x < base.x) { + physic.set_velocity(5, physic.get_velocity_y()); + dir = RIGHT; + } + // Hit from right side + else { + physic.set_velocity(-5, physic.get_velocity_y()); + dir = LEFT; + } + + mode = KICK; + set_sprite(img_laptop_flat_left, img_laptop_flat_right, 1); + } + break; + } } diff --git a/src/player.cpp b/src/player.cpp index b9a61cd32..f95f16375 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -726,8 +726,8 @@ Player::collision(void* p_c_object, int c_object) { case CO_BADGUY: pbad_c = (BadGuy*) p_c_object; - /* Hurt the player if he just touched it: */ + /* Hurt player if he touches a badguy */ if (!pbad_c->dying && !dying && !safe_timer.started() && pbad_c->mode != HELD) @@ -737,30 +737,24 @@ Player::collision(void* p_c_object, int c_object) pbad_c->mode = HELD; pbad_c->base.y-=8; } + else if (pbad_c->mode == FLAT) + { + // Don't get hurt if we're kicking a flat badguy! + } else if (pbad_c->mode == KICK) { - if (base.y < pbad_c->base.y - 16) + /* Hurt if you get hit by kicked laptop: */ + if (!invincible_timer.started()) { - /* Step on (stop being kicked) */ - - pbad_c->mode = FLAT; - play_sound(sounds[SND_STOMP], SOUND_CENTER_SPEAKER); + kill(SHRINK); } else { - /* Hurt if you get hit by kicked laptop: */ - if (!invincible_timer.started()) - { - kill(SHRINK); - } - else - { - pbad_c->dying = DYING_FALLING; - play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER); - World::current()->add_score(pbad_c->base.x - scroll_x, - pbad_c->base.y, - 25 * player_status.score_multiplier); - } + pbad_c->dying = DYING_FALLING; + play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER); + World::current()->add_score(pbad_c->base.x - scroll_x, + pbad_c->base.y, + 25 * player_status.score_multiplier); } } else diff --git a/src/world.cpp b/src/world.cpp index 101725332..1be985ed9 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -315,6 +315,7 @@ World::collision_handler() else { tux.collision(&bad_guys[i], CO_BADGUY); + bad_guys[i].collision(&tux, CO_PLAYER, COLLISION_NORMAL); } } }