X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy.cpp;h=db846834305bccd7b908b92c1dc00394f58f183b;hb=05802469d9bdacc1c4db6039026f7d09615576a2;hp=aa092ca8405df7347b3dd8c97f32307cdb92f68e;hpb=63585855b8937f6a492b13e2a8e62bf45b279084;p=supertux.git diff --git a/src/badguy.cpp b/src/badguy.cpp index aa092ca84..db8468343 100644 --- a/src/badguy.cpp +++ b/src/badguy.cpp @@ -75,6 +75,8 @@ Sprite* img_snowball_right; Sprite* img_snowball_squished_left; Sprite* img_snowball_squished_right; Sprite* img_wingling_left; +Sprite* img_walkingtree_left; +Sprite* img_walkingtree_left_small; #define BADGUY_WALK_SPEED .8f #define WINGLING_FLY_SPEED 1.6f @@ -103,6 +105,8 @@ BadGuyKind badguykind_from_string(const std::string& str) return BAD_SNOWBALL; else if (str == "wingling") return BAD_WINGLING; + else if (str == "walkingtree") + return BAD_WALKINGTREE; else { printf("Couldn't convert badguy: '%s'\n", str.c_str()); @@ -147,6 +151,8 @@ std::string badguykind_to_string(BadGuyKind kind) case BAD_WINGLING: return "wingling"; break; + case BAD_WALKINGTREE: + return "walkingtree"; default: return "snowball"; } @@ -201,6 +207,7 @@ BadGuy::init() dir = LEFT; seen = false; animation_offset = 0; + target.x = target.y = -1; sprite_left = sprite_right = 0; physic.reset(); frozen_timer.init(true); @@ -244,6 +251,7 @@ BadGuy::activate(Direction activation_dir) { mode = NORMAL; animation_offset = 0; + target.x = target.y = -1; physic.reset(); frozen_timer.init(true); timer.init(true); @@ -289,6 +297,13 @@ BadGuy::activate(Direction activation_dir) physic.set_velocity(dirsign * WINGLING_FLY_SPEED, 0); physic.enable_gravity(false); set_sprite(img_wingling_left, img_wingling_left); + } else if (kind == BAD_WALKINGTREE) { + // TODO: why isn't the height/width being set properly in set_sprite? + physic.set_velocity(dirsign * BADGUY_WALK_SPEED, 0); + mode = BGM_BIG; + set_sprite(img_walkingtree_left, img_walkingtree_left); + base.width = 66; + base.height = 66; } base.x = start_position.x; @@ -791,11 +806,19 @@ BadGuy::action_wingling(double elapsed_time) else { Player& tux = *World::current()->get_tux(); + int dirsign = physic.get_velocity_x() < 0 ? -1 : 1; - if (fabsf(tux.base.x - base.x) < 200 && base.y < tux.base.y && tux.dying == DYING_NOT) - physic.set_velocity(-2.0f, -2.0f); - else - physic.set_velocity(-WINGLING_FLY_SPEED, 0); + if (fabsf(tux.base.x - base.x) < 150 && base.y < tux.base.y && tux.dying == DYING_NOT) + { + if (target.x < 0 && target.y < 0) + { + target.x = tux.base.x; + target.y = tux.base.y; + physic.set_velocity(dirsign * 1.5f, -2.25f); + } + } + else if (base.y >= target.y - 16) + physic.set_velocity(dirsign * WINGLING_FLY_SPEED, 0); } physic.apply(elapsed_time, base.x, base.y); @@ -803,7 +826,26 @@ BadGuy::action_wingling(double elapsed_time) // Handle dying timer: if (dying == DYING_SQUISHED && !timer.check()) - remove_me(); + remove_me(); + + // TODO: Winglings should be removed after flying off the screen +} + +void +BadGuy::action_walkingtree(double elapsed_time) +{ + if (dying == DYING_NOT) + check_horizontal_bump(); + + fall(); + + physic.apply(elapsed_time, base.x, base.y); + if (dying != DYING_FALLING) + collision_swept_object_map(&old_base,&base); + + // Handle dying timer: + if (dying == DYING_SQUISHED && !timer.check()) + remove_me(); } @@ -911,6 +953,10 @@ BadGuy::action(float elapsed_time) action_wingling(elapsed_time); break; + case BAD_WALKINGTREE: + action_walkingtree(elapsed_time); + break; + default: break; } @@ -1090,9 +1136,25 @@ BadGuy::squish(Player* player) } else if(kind == BAD_WINGLING) { squish_me(player); set_sprite(img_wingling_left, img_wingling_left); + } else if(kind == BAD_WALKINGTREE) { + if (mode == BGM_BIG) + { + set_sprite(img_walkingtree_left_small, img_walkingtree_left_small); + physic.set_velocity_x(physic.get_velocity_x() * 2.0f); + // XXX magic number: 66 is BGM_BIG height + + make_player_jump(player); + base.y += 66 - base.height; + + World::current()->add_score(Vector(base.x, base.y), + 25 * player_status.score_multiplier); + player_status.score_multiplier++; + + mode = BGM_SMALL; + } + else + squish_me(player); } - - } void @@ -1341,6 +1403,8 @@ void load_badguy_gfx() img_snowball_squished_left = sprite_manager->load("snowball-squished-left"); img_snowball_squished_right = sprite_manager->load("snowball-squished-right"); img_wingling_left = sprite_manager->load("wingling-left"); + img_walkingtree_left = sprite_manager->load("walkingtree-left"); + img_walkingtree_left_small = sprite_manager->load("walkingtree-left-small"); } void free_badguy_gfx()