3 #include "stalactite.h"
5 static const int SHAKE_RANGE = 40;
6 static const float SHAKE_TIME = .8;
7 static const float SQUISH_TIME = 2;
9 Stalactite::Stalactite(const lisp::Lisp& lisp)
11 lisp.get("x", start_position.x);
12 lisp.get("y", start_position.y);
13 bbox.set_size(31.8, 31.8);
14 sprite = sprite_manager->create("stalactite");
15 state = STALACTITE_HANGING;
19 Stalactite::write(lisp::Writer& writer)
21 writer.start_list("stalactite");
22 writer.write_float("x", start_position.x);
23 writer.write_float("y", start_position.y);
24 writer.end_list("stalactite");
28 Stalactite::active_action(float elapsed_time)
30 if(state == STALACTITE_HANGING) {
31 Player* player = Sector::current()->player;
32 if(player->get_bbox().p2.x > bbox.p1.x - SHAKE_RANGE
33 && player->get_bbox().p1.x < bbox.p2.x + SHAKE_RANGE
34 && player->get_bbox().p2.y > bbox.p1.y) {
35 timer.start(SHAKE_TIME);
36 state = STALACTITE_SHAKING;
38 } else if(state == STALACTITE_SHAKING) {
40 state = STALACTITE_FALLING;
41 physic.enable_gravity(true);
43 } else if(state == STALACTITE_FALLING || state == STALACTITE_SQUISHED) {
44 movement = physic.get_movement(elapsed_time);
45 if(state == STALACTITE_SQUISHED && timer.check())
51 Stalactite::collision_solid(GameObject& , const CollisionHit& hit)
53 if(state != STALACTITE_FALLING && state != STALACTITE_SQUISHED)
56 if(fabsf(hit.normal.y) > .5) { // hit floor or roof?
57 state = STALACTITE_SQUISHED;
58 physic.set_velocity_y(0);
59 sprite->set_action("squished");
61 timer.start(SQUISH_TIME);
68 Stalactite::collision_player(Player& player, const CollisionHit& )
70 if(state != STALACTITE_SQUISHED) {
71 player.kill(Player::SHRINK);
78 Stalactite::kill_fall()
83 Stalactite::draw(DrawingContext& context)
85 if(state == STALACTITE_SHAKING) {
86 sprite->draw(context, get_pos() + Vector((rand() % 6)-3, 0), LAYER_OBJECTS);
88 sprite->draw(context, get_pos(), LAYER_OBJECTS);
93 Stalactite::deactivate()
95 if(state != STALACTITE_HANGING)
99 IMPLEMENT_FACTORY(Stalactite, "stalactite")