added unstable_tile object
[supertux.git] / src / object / unstable_tile.cpp
1 #include <config.h>
2
3 #include "unstable_tile.h"
4 #include "lisp/lisp.h"
5 #include "object_factory.h"
6 #include "player.h"
7 #include "sector.h"
8 #include "resources.h"
9 #include "special/sprite_manager.h"
10 #include "special/sprite.h"
11
12 static const float CRACKTIME = 1;
13 static const float FALLTIME = 1.5;
14
15 UnstableTile::UnstableTile(const lisp::Lisp& lisp)
16   : hit(false), falling(false)
17 {
18   lisp.get("x", bbox.p1.x);
19   lisp.get("y", bbox.p1.y);
20   bbox.set_size(32, 32);
21   sprite = sprite_manager->create("unstable_tile");
22   flags |= FLAG_SOLID;
23 }
24
25 UnstableTile::~UnstableTile()
26 {
27   delete sprite;
28 }
29
30 HitResponse
31 UnstableTile::collision(GameObject& other, const CollisionHit& hitdata)
32 {
33   if(hitdata.normal.y < 0.8)
34     return FORCE_MOVE;
35
36   Player* player = dynamic_cast<Player*> (&other);
37   if(player)
38     hit = true;
39
40   return FORCE_MOVE;
41 }
42
43 void
44 UnstableTile::draw(DrawingContext& context)
45 {
46   Vector pos = get_pos();
47   // shacking
48   if(timer.get_timegone() > CRACKTIME) {
49     pos.x += (rand() % 6) - 3;
50   } 
51
52   sprite->draw(context, pos, LAYER_TILES);
53 }
54
55 void
56 UnstableTile::action(float elapsed_time)
57 {
58   if(falling) {
59     movement = physic.get_movement(elapsed_time);
60     if(!Sector::current()->inside(bbox)) {
61       remove_me();
62       return;
63     }
64   } else if(hit) {
65     if(timer.check()) {
66       falling = true;
67       physic.enable_gravity(true);      
68       flags &= ~FLAG_SOLID;
69       timer.stop();
70     } else if(!timer.started()) {
71       timer.start(FALLTIME);
72     }
73   } else {
74     timer.stop();
75   }
76   hit = false;
77 }
78
79 IMPLEMENT_FACTORY(UnstableTile, "unstable_tile");