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 = 300;
11 static const float JUMP_TIME = 1.6;
12 static const float ANGRY_JUMP_WAIT = .5;
13 static const float STUN_TIME = 2;
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"));
31 jump_time_left = 0.0f;
36 Mix_FreeChunk(sound_gna);
40 Yeti::active_action(float elapsed_time)
46 physic.set_velocity_x(RUN_SPEED);
47 if(jump_timer.check())
48 physic.set_velocity_y(JUMP_VEL2);
51 physic.set_velocity_x(-RUN_SPEED);
52 if(jump_timer.check())
53 physic.set_velocity_y(JUMP_VEL2);
56 if(jump_timer.check()) {
58 SoundManager::get()->play_sound(sound_gna);
59 physic.set_velocity_y(JUMP_VEL1);
64 if (stun_timer.check()) {
72 movement = physic.get_movement(elapsed_time);
78 // jump and move right
79 physic.set_velocity_y(JUMP_VEL1);
80 physic.set_velocity_x(RUN_SPEED);
82 jump_timer.start(JUMP_TIME);
88 physic.set_velocity_y(JUMP_VEL1);
89 physic.set_velocity_x(-RUN_SPEED);
91 jump_timer.start(JUMP_TIME);
98 jump_timer.start(ANGRY_JUMP_WAIT);
99 state = ANGRY_JUMPING;
100 physic.set_velocity_x(0);
106 physic.set_acceleration(0.0f, 0.0f);
107 physic.set_velocity(0.0f, 0.0f);
108 jump_time_left = jump_timer.get_timeleft();
110 stun_timer.start(STUN_TIME);
115 Yeti::collision_player(Player& player, const CollisionHit& hit)
117 if(player.is_invincible()) {
121 if(hit.normal.y > .9) {
122 //TODO: fix inaccuracy (tux sometimes dies even if badguy was hit)
123 // give badguys some invincible time (prevent them from being hit multiple times)
126 if(collision_squished(player))
128 else if (hitpoints <= 0) {
129 bullet_hitpoints = 0;
130 player.kill(Player::SHRINK);
135 if (state == STUNNED)
138 player.kill(Player::SHRINK);
143 Yeti::collision_badguy(BadGuy& badguy, const CollisionHit&)
145 YetiStalactite* yeti_stal = dynamic_cast<YetiStalactite*>(&badguy);
147 if (state == STUNNED && yeti_stal && yeti_stal->is_harmful())
157 Yeti::collision_squished(Player& player)
159 // we don't use the player object, even though it was given to us
169 Yeti::write(lisp::Writer& )
174 Yeti::drop_stalactite()
176 YetiStalactite* nearest = 0;
177 float dist = FLT_MAX;
179 Sector* sector = Sector::current();
180 for(Sector::GameObjects::iterator i = sector->gameobjects.begin();
181 i != sector->gameobjects.end(); ++i) {
182 YetiStalactite* stalactite = dynamic_cast<YetiStalactite*> (*i);
183 if(stalactite && stalactite->is_hanging()) {
185 = fabsf(stalactite->get_pos().x - sector->player->get_pos().x);
187 nearest = stalactite;
194 nearest->start_shaking();
198 Yeti::collision_solid(GameObject& , const CollisionHit& hit)
200 if(fabsf(hit.normal.y) > .5) { // hit floor or roof?
201 physic.set_velocity_y(0);
204 } else if(state == GO_LEFT && !jump_timer.started()) {
207 } else if(state == GO_RIGHT && !jump_timer.started()) {
210 } else if(state == ANGRY_JUMPING) {
211 if(!jump_timer.started()) {
214 // make a stalactite falling down and shake camera a bit
215 Sector::current()->camera->shake(.1, 0, 10);
218 // go to other side after 3 jumps
226 jump_timer.start(ANGRY_JUMP_WAIT);
238 SoundManager::get()->play_sound(sound_roar);
240 if (bullet_hitpoints <= 0) {
241 SoundManager::get()->play_sound(IDToSound(SND_FALL), this,
242 Sector::current()->player->get_pos());
243 physic.set_velocity_y(0);
244 physic.enable_gravity(true);
245 set_state(STATE_FALLING);
249 IMPLEMENT_FACTORY(Yeti, "yeti")