// Path: core/src/com/galvarez/ttw/model/map/MapPosition.java
// public final class MapPosition extends Component {
// 
//   public final int x, y;
// 
//   public MapPosition(int x, int y) {
//     this.x = x;
//     this.y = y;
//   }
// 
//   @Override
//   public int hashCode() {
//     return x + y * 31;
//   }
// 
//   @Override
//   public boolean equals(Object obj) {
//     if (obj == this)
//       return true;
//     else if (obj instanceof MapPosition) {
//       MapPosition p = (MapPosition) obj;
//       return x == p.x && y == p.y;
//     }
//     return false;
//   }
// 
//   @Override
//   public String toString() {
//     return "(" + x + "," + y + ")";
//   }
// }
// 
// Path: core/src/com/galvarez/ttw/model/map/MapTools.java
// public class MapTools {
// 
//   public static final int col_multiple = 34;
// 
//   public static final int row_multiple = 38;
// 
//   public enum Border {
//     BOTTOM_RIGHT {
//       @Override
//       public MapPosition getNeighbor(int x, int y) {
//         return new MapPosition(x + 1, y - ((x + 1) % 2));
//       }
//     },
//     BOTTOM {
//       @Override
//       public MapPosition getNeighbor(int x, int y) {
//         return new MapPosition(x, y - 1);
//       }
//     },
//     BOTTOM_LEFT {
//       @Override
//       public MapPosition getNeighbor(int x, int y) {
//         return new MapPosition(x - 1, y - ((x + 1) % 2));
//       }
//     },
//     TOP_LEFT {
//       @Override
//       public MapPosition getNeighbor(int x, int y) {
//         return new MapPosition(x - 1, y + (x % 2));
//       }
//     },
//     TOP {
//       @Override
//       public MapPosition getNeighbor(int x, int y) {
//         return new MapPosition(x, y + 1);
//       }
//     },
//     TOP_RIGHT {
//       @Override
//       public MapPosition getNeighbor(int x, int y) {
//         return new MapPosition(x + 1, y + (x % 2));
//       }
//     };
// 
//     abstract public MapPosition getNeighbor(int x, int y);
// 
//     public final MapPosition getNeighbor(MapPosition pos) {
//       return getNeighbor(pos.x, pos.y);
//     }
//   }
// 
//   public static int distance(MapPosition p0, MapPosition p1) {
//     int x0 = p0.x;
//     int y0 = p0.y;
//     int x1 = p1.x;
//     int y1 = p1.y;
// 
//     int dx = Math.abs(x1 - x0);
//     int dy = Math.abs(y1 - y0);
// 
//     // The distance can be tricky, because of how the columns are shifted.
//     // Different cases must be considered, because the dx and dy above
//     // are not sufficient to determine distance.
// 
//     if ((dx) % 2 == 0) {
//       // distance from even->even or odd->odd column
//       // important to know since evens and odds are offset
//       return MyMath.max(dx, dx / 2 + dy);
//     }
// 
//     // Otherwise the distance must be even->odd
//     else if (((x0 % 2 == 0) && (y0 > y1)) || ((x1 % 2 == 0) && (y1 > y0))) {
//       // even on top
//       return MyMath.max(dx, (dx - 1) / 2 + dy);
//     }
//     // otherwise odd must be on top
//     return MyMath.max(dx, (dx + 1) / 2 + dy);
//   }
// 
//   public static MapPosition window2world(float x, float y, OrthographicCamera camera) {
//     Vector3 pos = new Vector3(x, y, 0);
//     camera.unproject(pos);
//     int posx = (int) ((pos.x - 6f) / col_multiple);
//     int posy = (int) ((pos.y - (float) row_multiple * (posx % 2) / 2) / row_multiple);
//     return new MapPosition(posx, posy);
//   }
// 
//   public static MapPosition libgdx2world(float x, float y) {
//     Vector3 pos = new Vector3(x, y, 0);
//     int posx = (int) ((pos.x - 6f) / col_multiple);
//     int posy = (int) ((pos.y - (float) row_multiple * (posx % 2) / 2) / row_multiple);
//     return new MapPosition(posx, posy);
//   }
// 
//   public static FloatPair world2window(float x, float y) {
//     int x0 = (int) x;
//     float dx = x - x0; // purely the decimal part
// 
//     float posX = 5.5f + (x + 0.5f) * col_multiple;
//     float posY = row_multiple * (y + 0.5f + (x0 % 2) * (0.5f - dx / 2f) + (x0 + 1) % 2 * dx / 2f);
// 
//     return new FloatPair(posX, posY);
//   }
// 
//   public static FloatPair world2window(MapPosition pos) {
//     int x = pos.x;
//     int y = pos.y;
// 
//     float posX = 5.5f + (x + 0.5f) * col_multiple;
//     float posY = row_multiple * (y + 0.5f + (x % 2) * 0.5f);
// 
//     return new FloatPair(posX, posY);
//   }
// 
// }


import java.util.Arrays;
import com.artemis.Aspect;
import com.artemis.Component;
import com.artemis.EntitySystem;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.MathUtils;
import com.galvarez.ttw.model.map.MapPosition;
import com.galvarez.ttw.model.map.MapTools;
package com.galvarez.ttw.rendering;



public abstract class AbstractRendererSystem extends EntitySystem {

  protected final OrthographicCamera camera;

  protected final SpriteBatch batch;

  public AbstractRendererSystem(Aspect aspect, OrthographicCamera camera, SpriteBatch batch) {
    super(aspect);
    this.camera = camera;
    this.batch = batch;
  }

  @SafeVarargs
  protected static Aspect with(Class<? extends Component> ... components) {
// Path: core/src/com/galvarez/ttw/model/map/MapPosition.java
// public final class MapPosition extends Component {
// 
//   public final int x, y;
// 
//   public MapPosition(int x, int y) {
//     this.x = x;
//     this.y = y;
//   }
// 
//   @Override
//   public int hashCode() {
//     return x + y * 31;
//   }
// 
//   @Override
//   public boolean equals(Object obj) {
//     if (obj == this)
//       return true;
//     else if (obj instanceof MapPosition) {
//       MapPosition p = (MapPosition) obj;
//       return x == p.x && y == p.y;
//     }
//     return false;
//   }
// 
//   @Override
//   public String toString() {
//     return "(" + x + "," + y + ")";
//   }
// }
// 
// Path: core/src/com/galvarez/ttw/model/map/MapTools.java
// public class MapTools {
// 
//   public static final int col_multiple = 34;
// 
//   public static final int row_multiple = 38;
// 
//   public enum Border {
//     BOTTOM_RIGHT {
//       @Override
//       public MapPosition getNeighbor(int x, int y) {
//         return new MapPosition(x + 1, y - ((x + 1) % 2));
//       }
//     },
//     BOTTOM {
//       @Override
//       public MapPosition getNeighbor(int x, int y) {
//         return new MapPosition(x, y - 1);
//       }
//     },
//     BOTTOM_LEFT {
//       @Override
//       public MapPosition getNeighbor(int x, int y) {
//         return new MapPosition(x - 1, y - ((x + 1) % 2));
//       }
//     },
//     TOP_LEFT {
//       @Override
//       public MapPosition getNeighbor(int x, int y) {
//         return new MapPosition(x - 1, y + (x % 2));
//       }
//     },
//     TOP {
//       @Override
//       public MapPosition getNeighbor(int x, int y) {
//         return new MapPosition(x, y + 1);
//       }
//     },
//     TOP_RIGHT {
//       @Override
//       public MapPosition getNeighbor(int x, int y) {
//         return new MapPosition(x + 1, y + (x % 2));
//       }
//     };
// 
//     abstract public MapPosition getNeighbor(int x, int y);
// 
//     public final MapPosition getNeighbor(MapPosition pos) {
//       return getNeighbor(pos.x, pos.y);
//     }
//   }
// 
//   public static int distance(MapPosition p0, MapPosition p1) {
//     int x0 = p0.x;
//     int y0 = p0.y;
//     int x1 = p1.x;
//     int y1 = p1.y;
// 
//     int dx = Math.abs(x1 - x0);
//     int dy = Math.abs(y1 - y0);
// 
//     // The distance can be tricky, because of how the columns are shifted.
//     // Different cases must be considered, because the dx and dy above
//     // are not sufficient to determine distance.
// 
//     if ((dx) % 2 == 0) {
//       // distance from even->even or odd->odd column
//       // important to know since evens and odds are offset
//       return MyMath.max(dx, dx / 2 + dy);
//     }
// 
//     // Otherwise the distance must be even->odd
//     else if (((x0 % 2 == 0) && (y0 > y1)) || ((x1 % 2 == 0) && (y1 > y0))) {
//       // even on top
//       return MyMath.max(dx, (dx - 1) / 2 + dy);
//     }
//     // otherwise odd must be on top
//     return MyMath.max(dx, (dx + 1) / 2 + dy);
//   }
// 
//   public static MapPosition window2world(float x, float y, OrthographicCamera camera) {
//     Vector3 pos = new Vector3(x, y, 0);
//     camera.unproject(pos);
//     int posx = (int) ((pos.x - 6f) / col_multiple);
//     int posy = (int) ((pos.y - (float) row_multiple * (posx % 2) / 2) / row_multiple);
//     return new MapPosition(posx, posy);
//   }
// 
//   public static MapPosition libgdx2world(float x, float y) {
//     Vector3 pos = new Vector3(x, y, 0);
//     int posx = (int) ((pos.x - 6f) / col_multiple);
//     int posy = (int) ((pos.y - (float) row_multiple * (posx % 2) / 2) / row_multiple);
//     return new MapPosition(posx, posy);
//   }
// 
//   public static FloatPair world2window(float x, float y) {
//     int x0 = (int) x;
//     float dx = x - x0; // purely the decimal part
// 
//     float posX = 5.5f + (x + 0.5f) * col_multiple;
//     float posY = row_multiple * (y + 0.5f + (x0 % 2) * (0.5f - dx / 2f) + (x0 + 1) % 2 * dx / 2f);
// 
//     return new FloatPair(posX, posY);
//   }
// 
//   public static FloatPair world2window(MapPosition pos) {
//     int x = pos.x;
//     int y = pos.y;
// 
//     float posX = 5.5f + (x + 0.5f) * col_multiple;
//     float posY = row_multiple * (y + 0.5f + (x % 2) * 0.5f);
// 
//     return new FloatPair(posX, posY);
//   }
// 
// }


// Path: core/src/com/galvarez/ttw/rendering/AbstractRendererSystem.java
import java.util.Arrays;
import com.artemis.Aspect;
import com.artemis.Component;
import com.artemis.EntitySystem;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.MathUtils;
import com.galvarez.ttw.model.map.MapPosition;
import com.galvarez.ttw.model.map.MapTools;

package com.galvarez.ttw.rendering;



public abstract class AbstractRendererSystem extends EntitySystem {

  protected final OrthographicCamera camera;

  protected final SpriteBatch batch;

  public AbstractRendererSystem(Aspect aspect, OrthographicCamera camera, SpriteBatch batch) {
    super(aspect);
    this.camera = camera;
    this.batch = batch;
  }

  @SafeVarargs
  protected static Aspect with(Class<? extends Component> ... components) {
    return Aspect.getEmpty().all(Arrays.asList(components));