// $Id$
-//
+//
// SuperTux
-// Copyright (C) 2005 Matthias Braun <matze@braunis.de>
+// Copyright (C) 2006 Matthias Braun <matze@braunis.de>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// 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.
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
#include <config.h>
-#include "block.h"
+#include "block.hpp"
+#include "log.hpp"
#include <stdexcept>
-#include "resources.h"
-#include "player.h"
-#include "sector.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"
-#include "lisp/list_iterator.h"
-#include "object_factory.h"
+#include "resources.hpp"
+#include "player.hpp"
+#include "sector.hpp"
+#include "sprite/sprite.hpp"
+#include "sprite/sprite_manager.hpp"
+#include "video/drawing_context.hpp"
+#include "lisp/lisp.hpp"
+#include "gameobjs.hpp"
+#include "specialriser.hpp"
+#include "growup.hpp"
+#include "flower.hpp"
+#include "oneup.hpp"
+#include "star.hpp"
+#include "player_status.hpp"
+#include "badguy/badguy.hpp"
+#include "coin.hpp"
+#include "object_factory.hpp"
+#include "lisp/list_iterator.hpp"
+#include "object_factory.hpp"
static const float BOUNCY_BRICK_MAX_OFFSET=8;
static const float BOUNCY_BRICK_SPEED=90;
: sprite(newsprite), bouncing(false), bounce_dir(0), bounce_offset(0)
{
bbox.set_size(32, 32.1);
+ set_group(COLGROUP_STATIC);
flags |= FLAG_SOLID;
+ sound_manager->preload("sounds/upgrade.wav");
+ sound_manager->preload("sounds/brick.wav");
}
Block::~Block()
}
HitResponse
-Block::collision(GameObject& other, const CollisionHit& hitdata)
+Block::collision(GameObject& other, const CollisionHit& )
{
Player* player = dynamic_cast<Player*> (&other);
if(player) {
- // collided from below?
- if(hitdata.normal.x == 0 && hitdata.normal.y < 0) {
+ if(player->get_bbox().get_top() > get_bbox().get_bottom() - 7.0) {
hit(*player);
}
}
}
}
- return FORCE_MOVE;
+ return SOLID;
}
void
//---------------------------------------------------------------------------
BonusBlock::BonusBlock(const Vector& pos, int data)
- : Block(sprite_manager->create("bonusblock")), object(0)
+ : Block(sprite_manager->create("images/objects/bonus_block/bonusblock.sprite")), object(0)
{
bbox.set_pos(pos);
sprite->set_action("normal");
case 4: contents = CONTENT_1UP; break;
case 5: contents = CONTENT_ICEGROW; break;
default:
- std::cerr << "Invalid box contents!\n";
+ log_warning << "Invalid box contents" << std::endl;
contents = CONTENT_COIN;
break;
}
}
BonusBlock::BonusBlock(const lisp::Lisp& lisp)
- : Block(sprite_manager->create("bonusblock"))
+ : Block(sprite_manager->create("images/objects/bonus_block/bonusblock.sprite"))
{
Vector pos;
} else if(contentstring == "custom") {
contents = CONTENT_CUSTOM;
} else {
- std::cerr << "Invalid box contents '" << contentstring << "'.\n";
+ log_warning << "Invalid box contents '" << contentstring << "'" << std::endl;
}
} else {
if(contents == CONTENT_CUSTOM) {
throw std::runtime_error(
"Only MovingObjects are allowed inside BonusBlocks");
} else {
- std::cerr << "Invalid element '" << token << "' in bonusblock.\n";
+ log_warning << "Invalid element '" << token << "' in bonusblock" << std::endl;
}
}
}
try_open();
}
+HitResponse
+BonusBlock::collision(GameObject& other, const CollisionHit& hit){
+ BadGuy* badguy = dynamic_cast<BadGuy*> (&other);
+ if(badguy) {
+ // if( badguy->can_break() && (hit.left||hit.right||hit.bottom) ){ //TODO: find out why hit contains no information and fix it
+ if( badguy->can_break() && ( badguy->get_pos().y > get_pos().y ) ){
+ try_open();
+ }
+ }
+ return Block::collision(other, hit);
+}
+
void
BonusBlock::try_open()
{
- if(sprite->get_action_name() == "empty") {
+ if(sprite->get_action() == "empty") {
sound_manager->play("sounds/brick.wav");
return;
}
switch(contents) {
case CONTENT_COIN:
Sector::current()->add_object(new BouncyCoin(get_pos()));
- player.get_status()->incCoins();
+ player.get_status()->add_coins(1);
break;
case CONTENT_FIREGROW:
sector->add_object(riser);
} else {
SpecialRiser* riser = new SpecialRiser(
- get_pos(), new Flower(Flower::FIREFLOWER));
+ get_pos(), new Flower(FIRE_BONUS));
sector->add_object(riser);
}
sound_manager->play("sounds/upgrade.wav");
sector->add_object(riser);
} else {
SpecialRiser* riser = new SpecialRiser(
- get_pos(), new Flower(Flower::ICEFLOWER));
+ get_pos(), new Flower(ICE_BONUS));
sector->add_object(riser);
}
sound_manager->play("sounds/upgrade.wav");
sector->add_object(riser);
sound_manager->play("sounds/upgrade.wav");
break;
-
- //default:
- //assert(false);
}
start_bounce();
//---------------------------------------------------------------------------
Brick::Brick(const Vector& pos, int data)
- : Block(sprite_manager->create("brick")), breakable(false),
+ : Block(sprite_manager->create("images/objects/bonus_block/brick.sprite")), breakable(false),
coin_counter(0)
{
bbox.set_pos(pos);
void
Brick::hit(Player& )
{
- if(sprite->get_action_name() == "empty")
+ if(sprite->get_action() == "empty")
return;
try_break(true);
}
+HitResponse
+Brick::collision(GameObject& other, const CollisionHit& hit){
+ BadGuy* badguy = dynamic_cast<BadGuy*> (&other);
+ if(badguy) {
+ // if( badguy->can_break() && (hit.left||hit.right||hit.bottom) ){ //TODO: find out why hit contains no information and fix it
+ if( badguy->can_break() && ( badguy->get_pos().y > get_pos().y ) ){
+ try_break(false);
+ }
+ }
+ return Block::collision(other, hit);
+}
+
void
Brick::try_break(bool playerhit)
{
- if(sprite->get_action_name() == "empty")
+ if(sprite->get_action() == "empty")
return;
sound_manager->play("sounds/brick.wav");
if(coin_counter > 0) {
sector->add_object(new BouncyCoin(get_pos()));
coin_counter--;
- player.get_status()->incCoins();
+ player.get_status()->add_coins(1);
if(coin_counter == 0)
sprite->set_action("empty");
start_bounce();