forgot to add new files
[supertux.git] / src / badguy / flyingsnowball.cpp
1 #include <config.h>
2 #include <stdio.h>
3
4 #include "flyingsnowball.h"
5
6 static const float FLYTIME = 1.0;
7 static const float FLYSPEED = 100.0;
8
9 FlyingSnowBall::FlyingSnowBall(const lisp::Lisp& reader)
10 {
11   reader.get("x", start_position.x);
12   reader.get("y", start_position.y);
13   bbox.set_size(31.8, 31.8);
14   sprite = sprite_manager->create("flyingsnowball");
15   physic.enable_gravity(false);
16 }
17
18 FlyingSnowBall::FlyingSnowBall(float pos_x, float pos_y)
19 {
20   start_position.x = pos_x;
21   start_position.y = pos_y;
22   bbox.set_size(31.8, 31.8);
23   sprite = sprite_manager->create("flyingsnowball");
24   physic.enable_gravity(false);
25 }
26
27 void
28 FlyingSnowBall::write(lisp::Writer& writer)
29 {
30   writer.start_list("flyingsnowball");
31
32   writer.write_float("x", start_position.x);
33   writer.write_float("y", start_position.y);
34
35   writer.end_list("flyingsnowball");
36 }
37
38 void 
39 FlyingSnowBall::activate()
40 {
41   sprite->set_action(dir == LEFT ? "left" : "right");
42   mode = FLY_UP;
43   physic.set_velocity_y(FLYSPEED);
44   timer.start(FLYTIME/2);
45 }
46
47 bool
48 FlyingSnowBall::collision_squished(Player& player)
49 {
50   sprite->set_action(dir == LEFT ? "squished-left" : "squished-right");
51   kill_squished(player);
52   return true;
53 }
54
55 HitResponse
56 FlyingSnowBall::collision_solid(GameObject& , const CollisionHit& hit)
57 {
58   if(fabsf(hit.normal.y) > .5) { // hit floor or roof?
59     physic.set_velocity_y(0);
60   }
61
62   return CONTINUE;
63 }
64
65 void
66 FlyingSnowBall::active_action(float elapsed_time) 
67 {
68   if(timer.check()) {
69     if(mode == FLY_UP) {
70       mode = FLY_DOWN;
71       physic.set_velocity_y(-FLYSPEED);
72     } else if(mode == FLY_DOWN) {
73       mode = FLY_UP;
74       physic.set_velocity_y(FLYSPEED);
75     }
76     timer.start(FLYTIME);
77   }
78   movement=physic.get_movement(elapsed_time);
79   dir= Sector::current()->player->get_pos().x>get_pos().x?RIGHT:LEFT;
80   sprite->set_action(dir == LEFT ? "left" : "right");
81 }
82