X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy.cpp;h=ac0e59b0eac3557597b0a38be8405186ee8a6091;hb=03bc45b5d64e7295cb64a30116c9dbf90c0a0c7a;hp=e0efb7208987aae4e50ad9902ab8260c5b330a39;hpb=842613191ccab33d3d183cb518f86891e09b710f;p=supertux.git diff --git a/src/badguy.cpp b/src/badguy.cpp index e0efb7208..ac0e59b0e 100644 --- a/src/badguy.cpp +++ b/src/badguy.cpp @@ -34,6 +34,7 @@ #include "level.h" #include "sector.h" #include "tilemap.h" +#include "statistics.h" Sprite* img_mriceblock_flat_left; Sprite* img_mriceblock_flat_right; @@ -339,16 +340,23 @@ BadGuy::action_mriceblock(double elapsed_time) { /* FIXME: The pbad object shouldn't know about pplayer objects. */ /* If we're holding the iceblock */ dir = tux.dir; - if(dir==RIGHT) + if(tux.size == SMALL) { - base.x = tux.base.x + 16; - base.y = tux.base.y + tux.base.height/1.5 - base.height; + if(dir == RIGHT) + base.x = tux.base.x + 24; + else // dir == LEFT + base.x = tux.base.x - 12; + base.y = tux.base.y + tux.base.height/1.5 - base.height; } - else /* facing left */ + else // TUX == BIG { - base.x = tux.base.x - 16; - base.y = tux.base.y + tux.base.height/1.5 - base.height; + if(dir == RIGHT) + base.x = tux.base.x + 24; + else // dir == LEFT + base.x = tux.base.x - 4; + base.y = tux.base.y + tux.base.height/1.5 - base.height; } + if(collision_object_map(base)) { base.x = tux.base.x; @@ -358,9 +366,9 @@ BadGuy::action_mriceblock(double elapsed_time) if(tux.input.fire != DOWN) /* SHOOT! */ { if(dir == LEFT) - base.x -= 24; + base.x = tux.base.x - base.width; else - base.x += 24; + base.x = tux.base.x + tux.base.width; old_base = base; mode=KICK; @@ -397,20 +405,27 @@ void BadGuy::check_horizontal_bump(bool checkcliff) { float halfheight = base.height / 2; - if (dir == LEFT && issolid( base.x, (int) base.y + halfheight)) + if (dir == LEFT && issolid( base.x, base.y + halfheight)) { if (kind == BAD_MRICEBLOCK && mode == KICK) + { Sector::current()->trybreakbrick(Vector(base.x, base.y + halfheight), false); + Sector::current()->tryemptybox(Vector(base.x, base.y + halfheight), dir); + } dir = RIGHT; physic.set_velocity(-physic.get_velocity_x(), physic.get_velocity_y()); return; } - if (dir == RIGHT && issolid( base.x + base.width, (int)base.y + halfheight)) + if (dir == RIGHT && issolid( base.x + base.width, base.y + halfheight)) { if (kind == BAD_MRICEBLOCK && mode == KICK) + { Sector::current()->trybreakbrick( - Vector(base.x + base.width, (int) base.y + halfheight), false); + Vector(base.x + base.width, base.y + halfheight), false); + Sector::current()->tryemptybox( + Vector(base.x + base.width, base.y + halfheight), dir); + } dir = LEFT; physic.set_velocity(-physic.get_velocity_x(), physic.get_velocity_y()); @@ -1056,6 +1071,8 @@ BadGuy::squish(Player* player) Sector::current()->add_score(Vector(base.x, base.y), 25 * player_status.score_multiplier); SoundManager::get()->play_sound(IDToSound(SND_SQUISH), get_pos(), Sector::current()->player->get_pos()); + + global_stats.add_points(BADGUYS_SQUISHED_STAT, 1); player_status.score_multiplier++; return; @@ -1107,6 +1124,8 @@ BadGuy::squish(Player* player) Sector::current()->add_score(Vector(base.x, base.y), 25 * player_status.score_multiplier); + + global_stats.add_points(BADGUYS_SQUISHED_STAT, 1); player_status.score_multiplier++; // simply remove the fish... @@ -1142,7 +1161,8 @@ BadGuy::squish(Player* player) player->bounce(this); base.y += 66 - base.height; - + + global_stats.add_points(BADGUYS_SQUISHED_STAT, 1); Sector::current()->add_score(Vector(base.x, base.y), 25 * player_status.score_multiplier); player_status.score_multiplier++; @@ -1325,7 +1345,8 @@ BadGuy::collision(void *p_c_object, int c_object, CollisionType type) // Put bad guys a part (or they get jammed) // only needed to do to one of them - base.x = pbad_c->base.x + pbad_c->base.width + 1; + if (physic.get_velocity_x() != 0) + base.x = pbad_c->base.x + pbad_c->base.width + 1; } else if (dir == RIGHT) {