+void
+MrIceBlock::set_state(IceState state, bool up)
+{
+ if(ice_state == state)
+ return;
+
+ switch(state) {
+ case ICESTATE_NORMAL:
+ this->set_action(dir == LEFT ? "left" : "right", /* loops = */ -1);
+ WalkingBadguy::initialize();
+ break;
+ case ICESTATE_FLAT:
+ if(up) {
+ physic.set_velocity_y(-KICKSPEED);
+ } else {
+ sound_manager->play("sounds/stomp.wav", get_pos());
+ physic.set_velocity_x(0);
+ physic.set_velocity_y(0);
+ }
+ this->set_action(dir == LEFT ? "flat-left" : "flat-right", /* loops = */ -1);
+ flat_timer.start(4);
+ break;
+ case ICESTATE_KICKED:
+ sound_manager->play("sounds/kick.wav", get_pos());
+
+ physic.set_velocity_x(dir == LEFT ? -KICKSPEED : KICKSPEED);
+ this->set_action(dir == LEFT ? "flat-left" : "flat-right", /* loops = */ -1);
+ // we should slide above 1 block holes now...
+ bbox.set_size(34, 31.8f);
+ 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;
+ this->set_action(dir == LEFT ? "flat-left" : "flat-right", /* loops = */ -1);
+ set_state(ICESTATE_GRABBED);
+ set_colgroup_active(COLGROUP_DISABLED);
+}
+
+void
+MrIceBlock::ungrab(MovingObject& , Direction dir)
+{
+ if(dir == UP) {
+ set_state(ICESTATE_FLAT, true);
+ } else {
+ this->dir = dir;
+ set_state(ICESTATE_KICKED);
+ }
+ set_colgroup_active(COLGROUP_MOVING);
+}
+
+bool
+MrIceBlock::is_portable() const
+{
+ return ice_state == ICESTATE_FLAT;
+}
+
+SmartBlock::SmartBlock(const Reader& reader) :
+ MrIceBlock(reader)
+{
+ max_drop_height = 16;
+ sprite = sprite_manager->create("images/creatures/mr_iceblock/smart_block/smart_block.sprite");
+}
+
+/* EOF */