+bool
+Sector::collision_static(MovingObject* object, const Vector& movement)
+{
+ GameObject* collided_with = solids;
+ CollisionHit hit;
+ hit.time = -1;
+
+ collision_tilemap(object->dest, movement, hit);
+
+ // collision with other (static) objects
+ CollisionHit temphit;
+ for(MovingObjects::iterator i2 = moving_objects.begin();
+ i2 != moving_objects.end(); ++i2) {
+ MovingObject* moving_object_2 = *i2;
+ if(moving_object_2->get_group() != COLGROUP_STATIC
+ || !moving_object_2->is_valid())
+ continue;
+
+ 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;
+}
+