anchor.diff:  
   part of dartcade;
   
  -abstract class Aabb2Collidable {
  -  Aabb2 hitbox;
  +class AABB2 {
  +  Vector2 center = new Vector2.zero();
  +  Vector2 half = new Vector2.zero();
  +
  +  double get left => center.x - half.x;
  +  double get right => center.x + half.x;
  +  double get top => center.y - half.y;
  +  double get bottom => center.y + half.y;
  +
  +  Vector2 get topLeft => new Vector2(top, left);
  +  Vector2 get topRight => new Vector2(top, right);
  +  Vector2 get bottomLeft => new Vector2(bottom, left);
  +  Vector2 get bottomRight => new Vector2(bottom, right);
  +  Vector2 get min => topLeft;
  +  Vector2 get max => bottomRight;
  +
  +  AABB2();
  +  AABB2.centerHalf(Vector2 this.center, Vector2 this.half);
   }
   
  -Vector2 checkAabb2InAabb2(Aabb2 innerBox, Aabb2 outerBox) {
  +abstract class BoxCollider {
  +  AABB2 bounds;
  +  Body body;
  +
  +  void update() {
  +    bounds.center.setFrom(body.position);
  +  }
  +}
  +
  +class CollisionChecker<T> {
  +  Set<T> bodies;
  +
  +  void checkBodyVsBody(T body1, T body2) {
  +
  +  }
  +
  +  void checkBodyInBody(T body1, T body2) {
  +
  +  }
  +
  +  void checkBodyVsGroup(T body1, List<T> group) {
  +
  +  }
  +
  +  void checkGroupVsGroup(List<T> group1, List<T> group2) {
  +
  +  }
  +}
  +
  +class CollisionBroadphaseSelector {
  +
  +}
  +
  +Vector2 checkAabb2InAabb2(AABB2 innerBox, AABB2 outerBox) {
     double deltaX = 0.0;
     double deltaY = 0.0;
   
  -  if (innerBox.min.x < outerBox.min.x) {
  -    deltaX = outerBox.min.x - innerBox.min.x;
  -  } else if (innerBox.max.x > outerBox.max.x) {
  -    deltaX = innerBox.max.x - outerBox.max.x;
  +  if (innerBox.left < outerBox.left) {
  +    deltaX = outerBox.left - innerBox.left;
  +  } else if (innerBox.right > outerBox.right) {
  +    deltaX = innerBox.right - outerBox.right;
     }
   
  -  if (innerBox.min.y < outerBox.min.y) {
  -    deltaY = outerBox.min.y - innerBox.min.y;
  -  } else if (innerBox.max.y > outerBox.max.y) {
  -    deltaX = innerBox.max.y - outerBox.max.y;
  +  if (innerBox.top < outerBox.top) {
  +    deltaY = outerBox.top - innerBox.top;
  +  } else if (innerBox.bottom > outerBox.bottom) {
  +    deltaX = innerBox.bottom - outerBox.bottom;
     }
   
     if (deltaX == 0.0 && deltaY == 0.0) {
  
positive.code:   } else {
      return new Vector2(0.0, py * dy.sign);
    }
  }
negative.code:   return new Vector2(deltaX, deltaY);
  }
  
  Vector2 checkAabb2VsAabb2(AABB2 box1, AABB2 box2) {
    double dx = box1.center.x - box2.center.x;
    double px = (box1.half.x + box2.half.x) - dx.abs();
    if (px < 0) return null;
  
    double dy = box1.center.y - box2.center.y;
    double py = (box1.half.y + box2.half.y) - dy.abs();
    if (py < 0) return null;
  
    if (px > py) {
  