+
+ for(Sector::Portables::iterator i = sector->portables.begin();
+ i != sector->portables.end(); ++i) {
+ Portable* portable = *i;
+ if(!portable->is_portable())
+ continue;
+
+ MovingObject* moving_object = dynamic_cast<MovingObject*> (portable);
+ assert(portable);
+ if(moving_object == NULL)
+ continue;
+
+ if(moving_object->get_bbox().contains(pos)) {
+ grabbed_object = portable;
+ grabbed_object->grab(*this, get_pos(), dir);
+ break;
+ }
+ }
+ }
+
+ if(!controller->hold(Controller::ACTION) && grabbed_object) {
+ // move the grabbed object a bit away from tux
+ Vector pos = get_pos() +
+ Vector(dir == LEFT ? -bbox.get_width()-1 : bbox.get_width()+1,
+ bbox.get_height()*0.66666 - 32);
+ Rect dest(pos, pos + Vector(32, 32));
+ if(Sector::current()->is_free_of_statics(dest)) {
+ MovingObject* moving_object = dynamic_cast<MovingObject*> (grabbed_object);
+ if(moving_object) {
+ moving_object->set_pos(pos);
+ } else {
+ log_debug << "Non MovingObjetc grabbed?!?" << std::endl;
+ }
+ grabbed_object->ungrab(*this, dir);
+ grabbed_object = NULL;
+ }
+ }
+}
+
+void
+Player::handle_input_ghost()
+{
+ float vx = 0;
+ float vy = 0;
+ if (controller->hold(Controller::LEFT)) {
+ dir = LEFT;
+ vx -= MAX_RUN_XM * 2;
+ }
+ if (controller->hold(Controller::RIGHT)) {
+ dir = RIGHT;
+ vx += MAX_RUN_XM * 2;
+ }
+ if ((controller->hold(Controller::UP)) || (controller->hold(Controller::JUMP))) {
+ vy -= MAX_RUN_XM * 2;
+ }
+ if (controller->hold(Controller::DOWN)) {
+ vy += MAX_RUN_XM * 2;
+ }
+ if (controller->hold(Controller::ACTION)) {
+ set_ghost_mode(false);