5 #include "object/camera.h"
6 #include "yeti_stalactite.h"
7 #include "bouncing_snowball.h"
9 static const float JUMP_VEL1 = 250;
10 static const float JUMP_VEL2 = 700;
11 static const float RUN_SPEED = 350;
12 static const float JUMP_TIME = 1.6;
13 static const float ANGRY_JUMP_WAIT = .5;
14 static const int INITIAL_HITPOINTS = 3;
15 static const int INITIAL_BULLET_HP = 10;
17 Yeti::Yeti(const lisp::Lisp& reader)
19 reader.get("x", start_position.x);
20 reader.get("y", start_position.y);
21 bbox.set_size(80, 120);
22 sprite = sprite_manager->create("yeti");
25 hitpoints = INITIAL_HITPOINTS;
26 bullet_hitpoints = INITIAL_BULLET_HP;
27 sound_gna = SoundManager::get()->load_sound(
28 get_resource_filename("sounds/yeti_gna.wav"));
29 sound_roar = SoundManager::get()->load_sound(
30 get_resource_filename("sounds/yeti_roar.wav"));
35 Mix_FreeChunk(sound_gna);
39 Yeti::active_action(float elapsed_time)
45 physic.set_velocity_x(RUN_SPEED);
47 physic.set_velocity_y(JUMP_VEL2);
50 physic.set_velocity_x(-RUN_SPEED);
52 physic.set_velocity_y(JUMP_VEL2);
57 SoundManager::get()->play_sound(sound_gna);
58 physic.set_velocity_y(JUMP_VEL1);
65 movement = physic.get_movement(elapsed_time);
71 // jump and move right
72 physic.set_velocity_y(JUMP_VEL1);
73 physic.set_velocity_x(RUN_SPEED);
75 timer.start(JUMP_TIME);
81 physic.set_velocity_y(JUMP_VEL1);
82 physic.set_velocity_x(-RUN_SPEED);
84 timer.start(JUMP_TIME);
91 timer.start(ANGRY_JUMP_WAIT);
92 state = ANGRY_JUMPING;
93 physic.set_velocity_x(0);
97 Yeti::summon_snowball()
99 Sector::current()->add_object(new BouncingSnowball(get_pos().x+(side == LEFT ? 64 : -64), get_pos().y, (side == LEFT ? RIGHT : LEFT)));
103 Yeti::collision_player(Player& player, const CollisionHit& hit)
105 if(player.is_invincible()) {
109 if(hit.normal.y > .9) {
112 SoundManager::get()->play_sound(sound_roar);
113 if(collision_squished(player))
115 else if (hitpoints <= 0) {
116 bullet_hitpoints = 0;
117 player.kill(Player::SHRINK);
121 std::cout << "COLLISION - HITPOINTS: " << hitpoints << ", BULLET HP: " << bullet_hitpoints << std::endl;
122 player.kill(Player::SHRINK);
127 Yeti::collision_squished(Player& player)
130 player.bounce(*this);
131 if (hitpoints <= 0) {
132 bullet_hitpoints = 0;
133 //sprite->set_action("dead");
134 kill_squished(player);
141 Yeti::write(lisp::Writer& )
146 Yeti::drop_stalactite()
148 YetiStalactite* nearest = 0;
149 float dist = FLT_MAX;
151 Sector* sector = Sector::current();
152 for(Sector::GameObjects::iterator i = sector->gameobjects.begin();
153 i != sector->gameobjects.end(); ++i) {
154 YetiStalactite* stalactite = dynamic_cast<YetiStalactite*> (*i);
155 if(stalactite && stalactite->is_hanging()) {
157 = fabsf(stalactite->get_pos().x - sector->player->get_pos().x);
159 nearest = stalactite;
166 nearest->start_shaking();
170 Yeti::collision_solid(GameObject& , const CollisionHit& hit)
172 if(fabsf(hit.normal.y) > .5) { // hit floor or roof?
173 physic.set_velocity_y(0);
176 } else if(state == GO_LEFT && !timer.started()) {
180 } else if(state == GO_RIGHT && !timer.started()) {
184 } else if(state == ANGRY_JUMPING) {
185 if(!timer.started()) {
188 // make a stalactite falling down and shake camera a bit
189 Sector::current()->camera->shake(.1, 0, 10);
192 // go to other side after 3 jumps
200 timer.start(ANGRY_JUMP_WAIT);
212 SoundManager::get()->play_sound(sound_roar);
214 if (bullet_hitpoints <= 0) {
215 SoundManager::get()->play_sound(IDToSound(SND_FALL), this,
216 Sector::current()->player->get_pos());
217 physic.set_velocity_y(0);
218 physic.enable_gravity(true);
219 set_state(STATE_FALLING);
221 std::cout << "KILL_FALL - HITPOINTS: " << hitpoints << ", BULLET HP: " << bullet_hitpoints << std::endl;
224 IMPLEMENT_FACTORY(Yeti, "yeti")