7 #include "special/sprite.h"
8 #include "special/sprite_manager.h"
9 #include "video/drawing_context.h"
11 #include "specialriser.h"
17 static const float BOUNCY_BRICK_MAX_OFFSET=8;
18 static const float BOUNCY_BRICK_SPEED=90;
19 static const float EPSILON = .0001;
21 Block::Block(const Vector& pos, Sprite* newsprite)
22 : sprite(newsprite), bouncing(false), bounce_dir(0), bounce_offset(0)
25 bbox.set_size(32, 32);
36 Block::collision(GameObject& other, const CollisionHit& hitdata)
38 // TODO kill badguys when bumping them...
40 Player* player = dynamic_cast<Player*> (&other);
42 // collided from below?
43 if(hitdata.normal.x == 0 && hitdata.normal.y < 0) {
52 Block::action(float elapsed_time)
57 float offset = original_y - get_pos().y;
58 if(offset > BOUNCY_BRICK_MAX_OFFSET) {
59 bounce_dir = BOUNCY_BRICK_SPEED;
60 movement = Vector(0, bounce_dir * elapsed_time);
61 } else if(offset < BOUNCY_BRICK_SPEED * elapsed_time && bounce_dir > 0) {
62 movement = Vector(0, offset);
66 movement = Vector(0, bounce_dir * elapsed_time);
71 Block::draw(DrawingContext& context)
73 sprite->draw(context, get_pos(), LAYER_OBJECTS+1);
80 bounce_dir = -BOUNCY_BRICK_SPEED;
84 //---------------------------------------------------------------------------
86 BonusBlock::BonusBlock(const Vector& pos, int newdata)
87 : Block(pos, sprite_manager->create("bonusblock")), data(newdata)
89 sprite->set_action("default");
93 BonusBlock::hit(Player& player)
95 if(sprite->get_action_name() == "empty") {
96 SoundManager::get()->play_sound(IDToSound(SND_BRICK));
100 Sector* sector = Sector::current();
103 Sector::current()->add_object(new BouncyCoin(get_pos()));
104 player.get_status().incCoins();
107 case 2: // grow/fireflower
108 if(player.size == SMALL) {
109 SpecialRiser* riser = new SpecialRiser(
110 new GrowUp(get_pos() + Vector(0, -32)));
111 sector->add_object(riser);
113 SpecialRiser* riser = new SpecialRiser(
114 new Flower(get_pos() + Vector(0, -32), Flower::FIREFLOWER));
115 sector->add_object(riser);
117 SoundManager::get()->play_sound(IDToSound(SND_UPGRADE));
120 case 5: // grow/iceflower
121 if(player.size == SMALL) {
122 SpecialRiser* riser = new SpecialRiser(
123 new GrowUp(get_pos() + Vector(0, -32)));
124 sector->add_object(riser);
126 SpecialRiser* riser = new SpecialRiser(
127 new Flower(get_pos() + Vector(0, -32), Flower::ICEFLOWER));
128 sector->add_object(riser);
130 SoundManager::get()->play_sound(IDToSound(SND_UPGRADE));
134 sector->add_object(new Star(get_pos() + Vector(0, -32)));
138 sector->add_object(new OneUp(get_pos()));
146 sprite->set_action("empty");
149 //---------------------------------------------------------------------------
151 Brick::Brick(const Vector& pos, int data)
152 : Block(pos, sprite_manager->create("brick")), breakable(false),
162 Brick::hit(Player& player)
164 if(sprite->get_action_name() == "empty")
167 SoundManager::get()->play_sound(IDToSound(SND_BRICK));
168 Sector* sector = Sector::current();
169 if(coin_counter > 0) {
170 sector->add_object(new BouncyCoin(get_pos()));
172 player.get_status().incCoins();
173 if(coin_counter == 0)
174 sprite->set_action("empty");
176 } else if(breakable) {
177 if(player.size == SMALL) {
183 new BrokenBrick(new Sprite(*sprite), get_pos(), Vector(-100, -400)));
185 new BrokenBrick(new Sprite(*sprite), get_pos() + Vector(0, 16),
186 Vector(-150, -300)));
188 new BrokenBrick(new Sprite(*sprite), get_pos() + Vector(16, 0),
191 new BrokenBrick(new Sprite(*sprite), get_pos() + Vector(16, 16),