-}
-
-//---------------------------------------------------------------------------
-
-BonusBlock::BonusBlock(const Vector& pos, int data)
- : Block(sprite_manager->create("bonusblock")), object(0)
-{
- bbox.set_pos(pos);
- sprite->set_action("normal");
- switch(data) {
- case 1: contents = CONTENT_COIN; break;
- case 2: contents = CONTENT_FIREGROW; break;
- case 3: contents = CONTENT_STAR; break;
- case 4: contents = CONTENT_1UP; break;
- case 5: contents = CONTENT_ICEGROW; break;
- default:
- std::cerr << "Invalid box contents!\n";
- contents = CONTENT_COIN;
- break;
- }
-}
-
-BonusBlock::BonusBlock(const lisp::Lisp& lisp)
- : Block(sprite_manager->create("bonusblock"))
-{
- Vector pos;
-
- contents = CONTENT_COIN;
- lisp::ListIterator iter(&lisp);
- while(iter.next()) {
- const std::string& token = iter.item();
- if(token == "x") {
- iter.value()->get(pos.x);
- } else if(token == "y") {
- iter.value()->get(pos.y);
- } else if(token == "contents") {
- std::string contentstring;
- iter.value()->get(contentstring);
- if(contentstring == "coin") {
- contents = CONTENT_COIN;
- } else if(contentstring == "firegrow") {
- contents = CONTENT_FIREGROW;
- } else if(contentstring == "icegrow") {
- contents = CONTENT_ICEGROW;
- } else if(contentstring == "star") {
- contents = CONTENT_STAR;
- } else if(contentstring == "1up") {
- contents = CONTENT_1UP;
- } else if(contentstring == "custom") {
- contents = CONTENT_CUSTOM;
- } else {
- std::cerr << "Invalid box contents '" << contentstring << "'.\n";
- }
- } else {
- if(contents == CONTENT_CUSTOM) {
- GameObject* game_object = create_object(token, *(iter.lisp()));
- object = dynamic_cast<MovingObject*> (game_object);
- if(object == 0)
- throw std::runtime_error(
- "Only MovingObjects are allowed inside BonusBlocks");
- } else {
- std::cerr << "Invalid element '" << token << "' in bonusblock.\n";
- }
- }
- }
-
- if(contents == CONTENT_CUSTOM && object == 0)
- throw std::runtime_error("Need to specify content object for custom block");
-
- bbox.set_pos(pos);
-}
-
-BonusBlock::~BonusBlock()
-{
- delete object;
-}
-
-void
-BonusBlock::hit(Player& )
-{
- try_open();
-}
-
-void
-BonusBlock::try_open()
-{
- if(sprite->get_action_name() == "empty") {
- sound_manager->play("sounds/brick.ogg");
- return;
- }
-
- Sector* sector = Sector::current();
- Player& player = *(sector->player);
- switch(contents) {
- case CONTENT_COIN:
- Sector::current()->add_object(new BouncyCoin(get_pos()));
- player.get_status()->incCoins();
- break;
-
- case CONTENT_FIREGROW:
- if(player.get_status()->bonus == NO_BONUS) {
- SpecialRiser* riser = new SpecialRiser(get_pos(), new GrowUp());
- sector->add_object(riser);
- } else {
- SpecialRiser* riser = new SpecialRiser(
- get_pos(), new Flower(Flower::FIREFLOWER));
- sector->add_object(riser);
- }
- sound_manager->play("sounds/upgrade.ogg");
- break;
-
- case CONTENT_ICEGROW:
- if(player.get_status()->bonus == NO_BONUS) {
- SpecialRiser* riser = new SpecialRiser(get_pos(), new GrowUp());
- sector->add_object(riser);
- } else {
- SpecialRiser* riser = new SpecialRiser(
- get_pos(), new Flower(Flower::ICEFLOWER));
- sector->add_object(riser);
- }
- sound_manager->play("sounds/upgrade.ogg");
- break;
-
- case CONTENT_STAR:
- sector->add_object(new Star(get_pos() + Vector(0, -32)));
- break;
-
- case CONTENT_1UP:
- sector->add_object(new OneUp(get_pos()));
- break;