+
+ Rect dest = moving_object_2->dest;
+
+ Vector rel_movement
+ = movement - moving_object_2->get_movement();
+
+ if(Collision::rectangle_rectangle(temphit, object->dest, rel_movement, dest)
+ && temphit.time > hit.time) {
+ hit = temphit;
+ collided_with = moving_object_2;
+ }
+ }
+
+ if(hit.time < 0)
+ return true;
+
+ HitResponse response = object->collision(*collided_with, hit);
+ hit.normal *= -1;
+ if(collided_with != solids) {
+ MovingObject* moving_object = (MovingObject*) collided_with;
+ HitResponse other_response = moving_object->collision(*object, hit);
+ if(other_response == ABORT_MOVE) {
+ moving_object->dest = moving_object->get_bbox();
+ } else if(other_response == FORCE_MOVE) {
+ // the static object "wins" move tux out of the collision
+ object->dest.move(-hit.normal * (hit.depth + DELTA));
+ return false;
+ } else if(other_response == PASS_MOVEMENT) {
+ object->dest.move(moving_object->get_movement());
+ //object->movement += moving_object->get_movement();
+ }
+ }
+
+ if(response == CONTINUE) {
+ object->dest.move(-hit.normal * (hit.depth + DELTA));
+ return false;
+ } else if(response == ABORT_MOVE) {
+ object->dest = object->get_bbox();
+ return true;
+ }
+
+ // force move
+ return false;
+}
+
+void
+Sector::handle_collisions()
+{
+ // calculate destination positions of the objects
+ for(MovingObjects::iterator i = moving_objects.begin();
+ i != moving_objects.end(); ++i) {
+ MovingObject* moving_object = *i;
+
+ moving_object->dest = moving_object->get_bbox();
+ moving_object->dest.move(moving_object->get_movement());
+ }
+
+ // part1: COLGROUP_MOVING vs COLGROUP_STATIC and tilemap
+ // we do this up to 4 times and have to sort all results for the smallest
+ // one before we can continue here
+ for(MovingObjects::iterator i = moving_objects.begin();
+ i != moving_objects.end(); ++i) {
+ MovingObject* moving_object = *i;
+ if((moving_object->get_group() != COLGROUP_MOVING
+ && moving_object->get_group() != COLGROUP_MOVING_ONLY_STATIC)
+ || !moving_object->is_valid())