X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fblock.cpp;h=08f04fc228895824f0c8870c7551bfce50747551;hb=c0093d25093395cb62fc2526ab42be65a9f015b8;hp=ccede815ccc94ede31891a97080aa9cdf2329b4a;hpb=3510a03c0e807c7a0ddde3cdf07ba91bda9393c4;p=supertux.git diff --git a/src/object/block.cpp b/src/object/block.cpp index ccede815c..08f04fc22 100644 --- a/src/object/block.cpp +++ b/src/object/block.cpp @@ -1,32 +1,53 @@ +// $Id$ +// +// SuperTux +// Copyright (C) 2005 Matthias Braun +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA. + #include #include "block.h" #include "resources.h" #include "player.h" #include "sector.h" -#include "special/sprite.h" -#include "special/sprite_manager.h" +#include "sprite/sprite.h" +#include "sprite/sprite_manager.h" #include "video/drawing_context.h" +#include "lisp/lisp.h" #include "gameobjs.h" #include "specialriser.h" #include "growup.h" #include "flower.h" #include "oneup.h" #include "star.h" +#include "player_status.h" #include "badguy/badguy.h" #include "coin.h" +#include "object_factory.h" static const float BOUNCY_BRICK_MAX_OFFSET=8; static const float BOUNCY_BRICK_SPEED=90; static const float EPSILON = .0001; -Block::Block(const Vector& pos, Sprite* newsprite) +Block::Block(Sprite* newsprite) : sprite(newsprite), bouncing(false), bounce_dir(0), bounce_offset(0) { - bbox.set_pos(pos); - bbox.set_size(32, 32); + bbox.set_size(32, 32.1); flags |= FLAG_SOLID; - original_y = pos.y; } Block::~Block() @@ -87,6 +108,7 @@ Block::draw(DrawingContext& context) void Block::start_bounce() { + original_y = bbox.p1.y; bouncing = true; bounce_dir = -BOUNCY_BRICK_SPEED; bounce_offset = 0; @@ -94,10 +116,49 @@ Block::start_bounce() //--------------------------------------------------------------------------- -BonusBlock::BonusBlock(const Vector& pos, int newdata) - : Block(pos, sprite_manager->create("bonusblock")), data(newdata) +BonusBlock::BonusBlock(const Vector& pos, int data) + : Block(sprite_manager->create("bonusblock")) +{ + 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")) { - sprite->set_action("default"); + Vector pos; + lisp.get("x", pos.x); + lisp.get("y", pos.y); + bbox.set_pos(pos); + + std::string contentstring; + contents = CONTENT_COIN; + if(lisp.get("contents", 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 { + std::cerr << "Invalid box contents '" << contentstring << "'.\n"; + } + } } void @@ -110,20 +171,20 @@ void BonusBlock::try_open() { if(sprite->get_action_name() == "empty") { - SoundManager::get()->play_sound(IDToSound(SND_BRICK)); + sound_manager->play_sound("brick"); return; } Sector* sector = Sector::current(); Player& player = *(sector->player); - switch(data) { - case 1: // coin + switch(contents) { + case CONTENT_COIN: Sector::current()->add_object(new BouncyCoin(get_pos())); - player.get_status().incCoins(); + player.get_status()->incCoins(); break; - case 2: // grow/fireflower - if(player.size == SMALL) { + case CONTENT_FIREGROW: + if(player.get_status()->bonus == NO_BONUS) { SpecialRiser* riser = new SpecialRiser( new GrowUp(get_pos() + Vector(0, -32))); sector->add_object(riser); @@ -132,11 +193,11 @@ BonusBlock::try_open() new Flower(get_pos() + Vector(0, -32), Flower::FIREFLOWER)); sector->add_object(riser); } - SoundManager::get()->play_sound(IDToSound(SND_UPGRADE)); + sound_manager->play_sound("upgrade"); break; - case 5: // grow/iceflower - if(player.size == SMALL) { + case CONTENT_ICEGROW: + if(player.get_status()->bonus == NO_BONUS) { SpecialRiser* riser = new SpecialRiser( new GrowUp(get_pos() + Vector(0, -32))); sector->add_object(riser); @@ -145,14 +206,14 @@ BonusBlock::try_open() new Flower(get_pos() + Vector(0, -32), Flower::ICEFLOWER)); sector->add_object(riser); } - SoundManager::get()->play_sound(IDToSound(SND_UPGRADE)); + sound_manager->play_sound("upgrade"); break; - case 3: // star + case CONTENT_STAR: sector->add_object(new Star(get_pos() + Vector(0, -32))); break; - case 4: // 1up + case CONTENT_1UP: sector->add_object(new OneUp(get_pos())); break; @@ -164,12 +225,15 @@ BonusBlock::try_open() sprite->set_action("empty"); } +IMPLEMENT_FACTORY(BonusBlock, "bonusblock") + //--------------------------------------------------------------------------- Brick::Brick(const Vector& pos, int data) - : Block(pos, sprite_manager->create("brick")), breakable(false), + : Block(sprite_manager->create("brick")), breakable(false), coin_counter(0) { + bbox.set_pos(pos); if(data == 1) coin_counter = 5; else @@ -191,18 +255,18 @@ Brick::try_break(bool playerhit) if(sprite->get_action_name() == "empty") return; - SoundManager::get()->play_sound(IDToSound(SND_BRICK)); + sound_manager->play_sound("brick"); Sector* sector = Sector::current(); Player& player = *(sector->player); if(coin_counter > 0) { sector->add_object(new BouncyCoin(get_pos())); coin_counter--; - player.get_status().incCoins(); + player.get_status()->incCoins(); if(coin_counter == 0) sprite->set_action("empty"); start_bounce(); } else if(breakable) { - if(playerhit && player.size == SMALL) { + if(playerhit && !player.is_big()) { start_bounce(); return; } @@ -222,3 +286,4 @@ Brick::try_break(bool playerhit) } } +//IMPLEMENT_FACTORY(Brick, "brick")