- try_open();
-}
-
-HitResponse
-BonusBlock::collision(GameObject& other, const CollisionHit& hit){
- BadGuy* badguy = dynamic_cast<BadGuy*> (&other);
- if(badguy) {
- // hit contains no information for collisions with blocks.
- // Badguy's bottom has to be below the top of the bonusblock
- // +7 is required to slide over one tile gaps.
- if( badguy->can_break() && ( badguy->get_bbox().get_bottom() > get_bbox().get_top() + 7.0) ){
- try_open();
- }
- }
- Portable* portable = dynamic_cast<Portable*> (&other);
- if(portable) {
- MovingObject* moving = dynamic_cast<MovingObject*> (&other);
- if(moving->get_bbox().get_top() > get_bbox().get_bottom() - 7.0) {
- try_open();
- }
- }
- return Block::collision(other, hit);
-}
-
-void
-BonusBlock::try_open()
-{
- if(sprite->get_action() == "empty") {
- sound_manager->play("sounds/brick.wav");
- return;
- }
-
- Sector* sector = Sector::current();
- assert(sector);
- assert(sector->player);
- Player& player = *(sector->player);
- Direction direction = (player.get_bbox().get_middle().x > get_bbox().get_middle().x) ? LEFT : RIGHT;
-
- switch(contents) {
- case CONTENT_COIN:
- Sector::current()->add_object(new BouncyCoin(get_pos()));
- player.get_status()->add_coins(1);
- Sector::current()->get_level()->stats.coins++;
- break;
-
- case CONTENT_FIREGROW:
- if(player.get_status()->bonus == NO_BONUS) {
- SpecialRiser* riser = new SpecialRiser(get_pos(), new GrowUp(direction));
- sector->add_object(riser);
- } else {
- SpecialRiser* riser = new SpecialRiser(
- get_pos(), new Flower(FIRE_BONUS));
- sector->add_object(riser);
- }
- sound_manager->play("sounds/upgrade.wav");
- break;
-
- case CONTENT_ICEGROW:
- if(player.get_status()->bonus == NO_BONUS) {
- SpecialRiser* riser = new SpecialRiser(get_pos(), new GrowUp(direction));
- sector->add_object(riser);
- } else {
- SpecialRiser* riser = new SpecialRiser(
- get_pos(), new Flower(ICE_BONUS));
- sector->add_object(riser);
- }
- sound_manager->play("sounds/upgrade.wav");
- break;
-
- case CONTENT_STAR:
- sector->add_object(new Star(get_pos() + Vector(0, -32), direction));
- break;
-
- case CONTENT_1UP:
- sector->add_object(new OneUp(get_pos(), direction));
- break;
-
- case CONTENT_CUSTOM:
- SpecialRiser* riser = new SpecialRiser(get_pos(), object);
- object = 0;
- sector->add_object(riser);
- sound_manager->play("sounds/upgrade.wav");
- break;
- }
-
- start_bounce();
- sprite->set_action("empty");