3 #include "mriceblock.h"
5 static const float WALKSPEED = 80;
6 static const float KICKSPEED = 500;
7 static const int MAXSQUISHES = 10;
9 MrIceBlock::MrIceBlock(LispReader& reader)
10 : ice_state(ICESTATE_NORMAL), squishcount(0)
12 reader.read_float("x", start_position.x);
13 reader.read_float("y", start_position.y);
14 bbox.set_size(32, 32);
15 sprite = sprite_manager->create("mriceblock");
19 MrIceBlock::write(LispWriter& writer)
21 writer.start_list("mriceblock");
23 writer.write_float("x", get_pos().x);
24 writer.write_float("y", get_pos().y);
26 writer.end_list("mriceblock");
30 MrIceBlock::activate()
32 physic.set_velocity_x(dir == LEFT ? -WALKSPEED : WALKSPEED);
33 sprite->set_action(dir == LEFT ? "left" : "right");
37 MrIceBlock::active_action(float elapsed_time)
39 if(ice_state == ICESTATE_FLAT && flat_timer.check()) {
41 ice_state = ICESTATE_NORMAL;
42 physic.set_velocity_x(dir == LEFT ? -WALKSPEED : WALKSPEED);
43 sprite->set_action(dir == LEFT ? "left" : "right");
45 BadGuy::active_action(elapsed_time);
49 MrIceBlock::collision_solid(GameObject& , const CollisionHit& hit)
51 if(fabsf(hit.normal.y) > .5) { // floor or roof
52 physic.set_velocity_y(0);
58 dir = dir == LEFT ? RIGHT : LEFT;
59 sprite->set_action(dir == LEFT ? "left" : "right");
60 physic.set_velocity_x(-physic.get_velocity_x());
63 dir = dir == LEFT ? RIGHT : LEFT;
64 sprite->set_action(dir == LEFT ? "flat-left" : "flat-right");
65 physic.set_velocity_x(-physic.get_velocity_x());
66 SoundManager::get()->play_sound(IDToSound(SND_RICOCHET), get_pos(),
67 Sector::current()->player->get_pos());
70 physic.set_velocity_x(0);
78 MrIceBlock::collision_squished(Player& player)
84 if(squishcount >= MAXSQUISHES) {
90 SoundManager::get()->play_sound(IDToSound(SND_STOMP), get_pos(),
92 physic.set_velocity_x(0);
93 physic.set_velocity_y(0);
95 sprite->set_action(dir == LEFT ? "flat-left" : "flat-right");
97 ice_state = ICESTATE_FLAT;
102 SoundManager::get()->play_sound(IDToSound(SND_KICK), this,
105 if(player.get_pos().x < get_pos().x) {
110 physic.set_velocity_x(dir == LEFT ? -KICKSPEED : KICKSPEED);
111 sprite->set_action(dir == LEFT ? "flat-left" : "flat-right");
112 ice_state = ICESTATE_KICKED;
117 player.bounce(*this);