5 #include "object/camera.h"
6 #include "yeti_stalactite.h"
8 static const float JUMP_VEL1 = 250;
9 static const float JUMP_VEL2 = 700;
10 static const float RUN_SPEED = 350;
11 static const float JUMP_TIME = 1.6;
12 static const float ANGRY_JUMP_WAIT = .5;
14 Yeti::Yeti(const lisp::Lisp& reader)
16 reader.get("x", start_position.x);
17 reader.get("y", start_position.y);
18 bbox.set_size(80, 120);
19 sprite = sprite_manager->create("yeti");
22 sound_gna = SoundManager::get()->load_sound(
23 get_resource_filename("sounds/yeti_gna.wav"));
28 Mix_FreeChunk(sound_gna);
32 Yeti::active_action(float elapsed_time)
38 physic.set_velocity_x(RUN_SPEED);
40 physic.set_velocity_y(JUMP_VEL2);
43 physic.set_velocity_x(-RUN_SPEED);
45 physic.set_velocity_y(JUMP_VEL2);
50 SoundManager::get()->play_sound(sound_gna);
51 physic.set_velocity_y(JUMP_VEL1);
58 movement = physic.get_movement(elapsed_time);
64 // jump and move right
65 physic.set_velocity_y(JUMP_VEL1);
66 physic.set_velocity_x(RUN_SPEED);
68 timer.start(JUMP_TIME);
74 physic.set_velocity_y(JUMP_VEL1);
75 physic.set_velocity_x(-RUN_SPEED);
77 timer.start(JUMP_TIME);
84 timer.start(ANGRY_JUMP_WAIT);
85 state = ANGRY_JUMPING;
86 physic.set_velocity_x(0);
90 Yeti::collision_squished(Player& player)
92 kill_squished(player);
97 Yeti::write(lisp::Writer& )
102 Yeti::drop_stalactite()
104 YetiStalactite* nearest = 0;
105 float dist = FLT_MAX;
107 Sector* sector = Sector::current();
108 for(Sector::GameObjects::iterator i = sector->gameobjects.begin();
109 i != sector->gameobjects.end(); ++i) {
110 YetiStalactite* stalactite = dynamic_cast<YetiStalactite*> (*i);
111 if(stalactite && stalactite->is_hanging()) {
113 = fabsf(stalactite->get_pos().x - sector->player->get_pos().x);
115 nearest = stalactite;
122 nearest->start_shaking();
126 Yeti::collision_solid(GameObject& , const CollisionHit& hit)
128 if(fabsf(hit.normal.y) > .5) { // hit floor or roof?
129 physic.set_velocity_y(0);
132 } else if(state == GO_LEFT && !timer.started()) {
135 } else if(state == GO_RIGHT && !timer.started()) {
138 } else if(state == ANGRY_JUMPING) {
139 if(!timer.started()) {
142 // make a stalactite falling down and shake camera a bit
143 Sector::current()->camera->shake(.1, 0, 10);
146 // go to other side after 3 jumps
154 timer.start(ANGRY_JUMP_WAIT);
163 IMPLEMENT_FACTORY(Yeti, "yeti")