7 #include "special/sprite.h"
8 #include "special/sprite_manager.h"
9 #include "video/drawing_context.h"
11 #include "specialriser.h"
16 #include "player_status.h"
17 #include "badguy/badguy.h"
19 #include "object_factory.h"
21 static const float BOUNCY_BRICK_MAX_OFFSET=8;
22 static const float BOUNCY_BRICK_SPEED=90;
23 static const float EPSILON = .0001;
25 Block::Block(const Vector& pos, Sprite* newsprite)
26 : sprite(newsprite), bouncing(false), bounce_dir(0), bounce_offset(0)
29 bbox.set_size(32, 32.1);
40 Block::collision(GameObject& other, const CollisionHit& hitdata)
42 Player* player = dynamic_cast<Player*> (&other);
44 // collided from below?
45 if(hitdata.normal.x == 0 && hitdata.normal.y < 0) {
51 BadGuy* badguy = dynamic_cast<BadGuy*> (&other);
55 Coin* coin = dynamic_cast<Coin*> (&other);
65 Block::action(float elapsed_time)
70 float offset = original_y - get_pos().y;
71 if(offset > BOUNCY_BRICK_MAX_OFFSET) {
72 bounce_dir = BOUNCY_BRICK_SPEED;
73 movement = Vector(0, bounce_dir * elapsed_time);
74 } else if(offset < BOUNCY_BRICK_SPEED * elapsed_time && bounce_dir > 0) {
75 movement = Vector(0, offset);
79 movement = Vector(0, bounce_dir * elapsed_time);
84 Block::draw(DrawingContext& context)
86 sprite->draw(context, get_pos(), LAYER_OBJECTS+1);
92 original_y = bbox.p1.y;
94 bounce_dir = -BOUNCY_BRICK_SPEED;
98 //---------------------------------------------------------------------------
100 BonusBlock::BonusBlock(const Vector& pos, int newdata)
101 : Block(pos, sprite_manager->create("bonusblock")), data(newdata)
103 sprite->set_action("default");
107 BonusBlock::hit(Player& )
113 BonusBlock::try_open()
115 if(sprite->get_action_name() == "empty") {
116 SoundManager::get()->play_sound(IDToSound(SND_BRICK));
120 Sector* sector = Sector::current();
121 Player& player = *(sector->player);
124 Sector::current()->add_object(new BouncyCoin(get_pos()));
125 player.get_status().incCoins();
128 case 2: // grow/fireflower
129 if(player.size == SMALL) {
130 SpecialRiser* riser = new SpecialRiser(
131 new GrowUp(get_pos() + Vector(0, -32)));
132 sector->add_object(riser);
134 SpecialRiser* riser = new SpecialRiser(
135 new Flower(get_pos() + Vector(0, -32), Flower::FIREFLOWER));
136 sector->add_object(riser);
138 SoundManager::get()->play_sound(IDToSound(SND_UPGRADE));
141 case 5: // grow/iceflower
142 if(player.size == SMALL) {
143 SpecialRiser* riser = new SpecialRiser(
144 new GrowUp(get_pos() + Vector(0, -32)));
145 sector->add_object(riser);
147 SpecialRiser* riser = new SpecialRiser(
148 new Flower(get_pos() + Vector(0, -32), Flower::ICEFLOWER));
149 sector->add_object(riser);
151 SoundManager::get()->play_sound(IDToSound(SND_UPGRADE));
155 sector->add_object(new Star(get_pos() + Vector(0, -32)));
159 sector->add_object(new OneUp(get_pos()));
167 sprite->set_action("empty");
170 //IMPLEMENT_FACTORY(BonusBlock, "bonusblock")
172 //---------------------------------------------------------------------------
174 Brick::Brick(const Vector& pos, int data)
175 : Block(pos, sprite_manager->create("brick")), breakable(false),
187 if(sprite->get_action_name() == "empty")
194 Brick::try_break(bool playerhit)
196 if(sprite->get_action_name() == "empty")
199 SoundManager::get()->play_sound(IDToSound(SND_BRICK));
200 Sector* sector = Sector::current();
201 Player& player = *(sector->player);
202 if(coin_counter > 0) {
203 sector->add_object(new BouncyCoin(get_pos()));
205 player.get_status().incCoins();
206 if(coin_counter == 0)
207 sprite->set_action("empty");
209 } else if(breakable) {
210 if(playerhit && player.size == SMALL) {
216 new BrokenBrick(new Sprite(*sprite), get_pos(), Vector(-100, -400)));
218 new BrokenBrick(new Sprite(*sprite), get_pos() + Vector(0, 16),
219 Vector(-150, -300)));
221 new BrokenBrick(new Sprite(*sprite), get_pos() + Vector(16, 0),
224 new BrokenBrick(new Sprite(*sprite), get_pos() + Vector(16, 16),
230 //IMPLEMENT_FACTORY(Brick, "brick")