X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fbadguy%2Fyeti.cpp;h=8d1b49b58b25b75e2bf2d98bbbe0f6dea3f01757;hb=2e163cb10e0a6af504275585e7c31091931dd7b2;hp=ba8b54a4f9f5aed43d93423c64d83d2431aef6f5;hpb=8099ed94a2642c410ebcd1315a28d14fa6524d49;p=supertux.git diff --git a/src/badguy/yeti.cpp b/src/badguy/yeti.cpp index ba8b54a4f..8d1b49b58 100644 --- a/src/badguy/yeti.cpp +++ b/src/badguy/yeti.cpp @@ -36,19 +36,19 @@ const float JUMP_DOWN_VY = -250; /**< vertical speed while jumping off the dais const float RUN_VX = 350; /**< horizontal speed while running */ const float JUMP_UP_VX = 350; /**< horizontal speed while jumping on the dais */ -const float JUMP_UP_VY = -800; /**< vertical speed while jumping on the dais */ +const float JUMP_UP_VY = -700; /**< vertical speed while jumping on the dais */ -const float STOMP_VY = -250; /** vertical speed while stomping on the dais */ +const float STOMP_VY = -300; /** vertical speed while stomping on the dais */ -const float LEFT_STAND_X = 16; /**< x-coordinate of left dais' end position */ -const float RIGHT_STAND_X = 800-60-16; /**< x-coordinate of right dais' end position */ -const float LEFT_JUMP_X = LEFT_STAND_X+224; /**< x-coordinate of from where to jump on the left dais */ -const float RIGHT_JUMP_X = RIGHT_STAND_X-224; /**< x-coordinate of from where to jump on the right dais */ +const float LEFT_STAND_X = 80; /**< x-coordinate of left dais' end position */ +const float RIGHT_STAND_X = 1280-LEFT_STAND_X-60; /**< x-coordinate of right dais' end position */ +const float LEFT_JUMP_X = LEFT_STAND_X+448; /**< x-coordinate of from where to jump on the left dais */ +const float RIGHT_JUMP_X = RIGHT_STAND_X-448; /**< x-coordinate of from where to jump on the right dais */ const float STOMP_WAIT = .5; /**< time we stay on the dais before jumping again */ const float SAFE_TIME = .5; /**< the time we are safe when tux just hit us */ -const int INITIAL_HITPOINTS = 3; /**< number of hits we can take */ +const int INITIAL_HITPOINTS = 5; /**< number of hits we can take */ -const float SQUISH_TIME = 5; +const float YETI_SQUISH_TIME = 5; } Yeti::Yeti(const Reader& reader) : @@ -62,8 +62,8 @@ Yeti::Yeti(const Reader& reader) : { hit_points = INITIAL_HITPOINTS; countMe = false; - sound_manager->preload("sounds/yeti_gna.wav"); - sound_manager->preload("sounds/yeti_roar.wav"); + SoundManager::current()->preload("sounds/yeti_gna.wav"); + SoundManager::current()->preload("sounds/yeti_roar.wav"); hud_head = Surface::create("images/creatures/yeti/hudlife.png"); } @@ -93,14 +93,12 @@ Yeti::draw(DrawingContext& context) void Yeti::draw_hit_points(DrawingContext& context) { - int i; - if (hud_head) { context.push_transform(); context.set_translation(Vector(0, 0)); - for (i = 0; i < hit_points; ++i) + for (int i = 0; i < hit_points; ++i) { context.draw_surface(hud_head, Vector(BORDER_X + (i * hud_head->get_width()), BORDER_Y + 1), LAYER_FOREGROUND1); } @@ -126,7 +124,7 @@ Yeti::active_update(float elapsed_time) break; case BE_ANGRY: if(state_timer.check()) { - sound_manager->play("sounds/yeti_gna.wav"); + SoundManager::current()->play("sounds/yeti_gna.wav"); physic.set_velocity_y(STOMP_VY); sprite->set_action((dir==RIGHT)?"stomp-right":"stomp-left"); } @@ -172,23 +170,16 @@ void Yeti::be_angry() { //turn around - dir = (dir==RIGHT)?LEFT:RIGHT; + dir = (dir==RIGHT) ? LEFT : RIGHT; - sprite->set_action((dir==RIGHT)?"stand-right":"stand-left"); + sprite->set_action((dir==RIGHT) ? "stand-right" : "stand-left"); physic.set_velocity_x(0); physic.set_velocity_y(0); - if (hit_points < INITIAL_HITPOINTS) summon_snowball(); stomp_count = 0; state = BE_ANGRY; state_timer.start(STOMP_WAIT); } -void -Yeti::summon_snowball() -{ - Sector::current()->add_object(new BouncingSnowball(Vector(get_pos().x+(dir == RIGHT ? 64 : -64), get_pos().y), dir)); -} - bool Yeti::collision_squished(GameObject& object) { @@ -212,7 +203,7 @@ void Yeti::take_hit(Player& ) if(safe_timer.started()) return; - sound_manager->play("sounds/yeti_roar.wav"); + SoundManager::current()->play("sounds/yeti_roar.wav"); hit_points--; if(hit_points <= 0) { @@ -221,8 +212,11 @@ void Yeti::take_hit(Player& ) physic.set_velocity_x(0); physic.set_velocity_y(0); + // Set the badguy layer to be above the foremost, so that + // this does not reveal secret tilemaps: + layer = Sector::current()->get_foremost_layer() + 1; state = SQUISHED; - state_timer.start(SQUISH_TIME); + state_timer.start(YETI_SQUISH_TIME); set_colgroup_active(COLGROUP_MOVING_ONLY_STATIC); sprite->set_action("dead"); @@ -237,7 +231,6 @@ void Yeti::kill_fall() { // shooting bullets or being invincible won't work :) - //take_hit(*get_nearest_player()); // FIXME: debug only(?) } void @@ -246,28 +239,29 @@ Yeti::drop_stalactite() // make a stalactite falling down and shake camera a bit Sector::current()->camera->shake(.1f, 0, 10); - YetiStalactite* nearest = 0; - float dist = FLT_MAX; - Player* player = this->get_nearest_player(); if (!player) return; Sector* sector = Sector::current(); for(Sector::GameObjects::iterator i = sector->gameobjects.begin(); i != sector->gameobjects.end(); ++i) { - YetiStalactite* stalactite = dynamic_cast (*i); + YetiStalactite* stalactite = dynamic_cast(i->get()); if(stalactite && stalactite->is_hanging()) { - float sdist - = fabsf(stalactite->get_pos().x - player->get_pos().x); - if(sdist < dist) { - nearest = stalactite; - dist = sdist; + if (hit_points >= 3) { + // drop stalactites within 3 of player, going out with each jump + float distancex = fabsf(stalactite->get_bbox().get_middle().x - player->get_bbox().get_middle().x); + if(distancex < stomp_count*32) { + stalactite->start_shaking(); + } } - } + else { /* if (hitpoints < 3) */ + // drop every 3rd pair of stalactites + if(((((int)stalactite->get_pos().x + 16) / 64) % 3) == (stomp_count % 3)) { + stalactite->start_shaking(); + } + } + } /* if(stalactite && stalactite->is_hanging()) */ } - - if(nearest) - nearest->start_shaking(); } void