7 #include "special/sprite.h"
8 #include "special/sprite_manager.h"
9 #include "video/drawing_context.h"
11 #include "specialriser.h"
16 #include "badguy/badguy.h"
19 static const float BOUNCY_BRICK_MAX_OFFSET=8;
20 static const float BOUNCY_BRICK_SPEED=90;
21 static const float EPSILON = .0001;
23 Block::Block(const Vector& pos, Sprite* newsprite)
24 : sprite(newsprite), bouncing(false), bounce_dir(0), bounce_offset(0)
27 bbox.set_size(32, 32);
38 Block::collision(GameObject& other, const CollisionHit& hitdata)
40 Player* player = dynamic_cast<Player*> (&other);
42 // collided from below?
43 if(hitdata.normal.x == 0 && hitdata.normal.y < 0) {
49 BadGuy* badguy = dynamic_cast<BadGuy*> (&other);
53 Coin* coin = dynamic_cast<Coin*> (&other);
63 Block::action(float elapsed_time)
68 float offset = original_y - get_pos().y;
69 if(offset > BOUNCY_BRICK_MAX_OFFSET) {
70 bounce_dir = BOUNCY_BRICK_SPEED;
71 movement = Vector(0, bounce_dir * elapsed_time);
72 } else if(offset < BOUNCY_BRICK_SPEED * elapsed_time && bounce_dir > 0) {
73 movement = Vector(0, offset);
77 movement = Vector(0, bounce_dir * elapsed_time);
82 Block::draw(DrawingContext& context)
84 sprite->draw(context, get_pos(), LAYER_OBJECTS+1);
91 bounce_dir = -BOUNCY_BRICK_SPEED;
95 //---------------------------------------------------------------------------
97 BonusBlock::BonusBlock(const Vector& pos, int newdata)
98 : Block(pos, sprite_manager->create("bonusblock")), data(newdata)
100 sprite->set_action("default");
104 BonusBlock::hit(Player& player)
106 if(sprite->get_action_name() == "empty") {
107 SoundManager::get()->play_sound(IDToSound(SND_BRICK));
111 Sector* sector = Sector::current();
114 Sector::current()->add_object(new BouncyCoin(get_pos()));
115 player.get_status().incCoins();
118 case 2: // grow/fireflower
119 if(player.size == SMALL) {
120 SpecialRiser* riser = new SpecialRiser(
121 new GrowUp(get_pos() + Vector(0, -32)));
122 sector->add_object(riser);
124 SpecialRiser* riser = new SpecialRiser(
125 new Flower(get_pos() + Vector(0, -32), Flower::FIREFLOWER));
126 sector->add_object(riser);
128 SoundManager::get()->play_sound(IDToSound(SND_UPGRADE));
131 case 5: // grow/iceflower
132 if(player.size == SMALL) {
133 SpecialRiser* riser = new SpecialRiser(
134 new GrowUp(get_pos() + Vector(0, -32)));
135 sector->add_object(riser);
137 SpecialRiser* riser = new SpecialRiser(
138 new Flower(get_pos() + Vector(0, -32), Flower::ICEFLOWER));
139 sector->add_object(riser);
141 SoundManager::get()->play_sound(IDToSound(SND_UPGRADE));
145 sector->add_object(new Star(get_pos() + Vector(0, -32)));
149 sector->add_object(new OneUp(get_pos()));
157 sprite->set_action("empty");
160 //---------------------------------------------------------------------------
162 Brick::Brick(const Vector& pos, int data)
163 : Block(pos, sprite_manager->create("brick")), breakable(false),
173 Brick::hit(Player& player)
175 if(sprite->get_action_name() == "empty")
178 SoundManager::get()->play_sound(IDToSound(SND_BRICK));
179 Sector* sector = Sector::current();
180 if(coin_counter > 0) {
181 sector->add_object(new BouncyCoin(get_pos()));
183 player.get_status().incCoins();
184 if(coin_counter == 0)
185 sprite->set_action("empty");
187 } else if(breakable) {
188 if(player.size == SMALL) {
194 new BrokenBrick(new Sprite(*sprite), get_pos(), Vector(-100, -400)));
196 new BrokenBrick(new Sprite(*sprite), get_pos() + Vector(0, 16),
197 Vector(-150, -300)));
199 new BrokenBrick(new Sprite(*sprite), get_pos() + Vector(16, 0),
202 new BrokenBrick(new Sprite(*sprite), get_pos() + Vector(16, 16),