+void
+MrIceBlock::set_state(IceState state)
+{
+ if(ice_state == state)
+ return;
+
+ if(state == ICESTATE_FLAT)
+ flags |= FLAG_PORTABLE;
+ else
+ flags &= ~FLAG_PORTABLE;
+
+ switch(state) {
+ case ICESTATE_NORMAL:
+ WalkingBadguy::activate();
+ break;
+ case ICESTATE_FLAT:
+ sound_manager->play("sounds/stomp.wav", get_pos());
+ physic.set_velocity_x(0);
+ physic.set_velocity_y(0);
+
+ sprite->set_action(dir == LEFT ? "flat-left" : "flat-right");
+ flat_timer.start(4);
+ break;
+ case ICESTATE_KICKED:
+ sound_manager->play("sounds/kick.wav", get_pos());
+
+ physic.set_velocity_x(dir == LEFT ? -KICKSPEED : KICKSPEED);
+ sprite->set_action(dir == LEFT ? "flat-left" : "flat-right");
+ // we should slide above 1 block holes now...
+ bbox.set_size(34, 31.8);
+ break;
+ case ICESTATE_GRABBED:
+ flat_timer.stop();
+ break;
+ default:
+ assert(false);
+ }
+ ice_state = state;
+}
+
+void
+MrIceBlock::grab(MovingObject&, const Vector& pos, Direction dir)
+{
+ movement = pos - get_pos();
+ this->dir = dir;
+ sprite->set_action(dir == LEFT ? "flat-left" : "flat-right");
+ set_state(ICESTATE_GRABBED);
+ set_group(COLGROUP_DISABLED);
+}
+
+void
+MrIceBlock::ungrab(MovingObject& , Direction dir)
+{
+ this->dir = dir;
+ set_state(ICESTATE_KICKED);
+ set_group(COLGROUP_MOVING);
+}
+