#include "video/drawing_context.hpp"
#include "lisp/lisp.hpp"
#include "gameobjs.hpp"
+#include "portable.hpp"
#include "specialriser.hpp"
#include "growup.hpp"
#include "flower.hpp"
#include "object_factory.hpp"
#include "lisp/list_iterator.hpp"
#include "object_factory.hpp"
+#include "level.hpp"
-static const float BOUNCY_BRICK_MAX_OFFSET=8;
-static const float BOUNCY_BRICK_SPEED=90;
-static const float EPSILON = .0001;
+static const float BOUNCY_BRICK_MAX_OFFSET = 8;
+static const float BOUNCY_BRICK_SPEED = 90;
+static const float EPSILON = .0001f;
Block::Block(Sprite* newsprite)
- : sprite(newsprite), bouncing(false), bounce_dir(0), bounce_offset(0)
+ : sprite(newsprite), bouncing(false), breaking(false), bounce_dir(0), bounce_offset(0)
{
- bbox.set_size(32, 32.1);
+ bbox.set_size(32, 32.1f);
set_group(COLGROUP_STATIC);
sound_manager->preload("sounds/upgrade.wav");
sound_manager->preload("sounds/brick.wav");
}
}
- if(bouncing) {
+ // only interact with other objects if...
+ // 1) we are bouncing
+ // and
+ // 2) the object is not portable (either never or not currently)
+ Portable* portable = dynamic_cast<Portable*> (&other);
+ if(bouncing && (portable == 0 || (!portable->is_portable()))) {
+
+ // Badguys get killed
BadGuy* badguy = dynamic_cast<BadGuy*> (&other);
if(badguy) {
badguy->kill_fall();
}
+
+ // Coins get collected
Coin* coin = dynamic_cast<Coin*> (&other);
if(coin) {
coin->collect();
}
+
}
return SOLID;
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);
}
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:
try_break(false);
}
}
+ 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_break();
+ }
+ }
return Block::collision(other, hit);
}