public boolean shouldBounceOffWall(double xd, double yd) {
   if (bounceWallTime > 0) return false;
   Tile nextTile =
       level.getTile(
           (int) (pos.x / Tile.WIDTH + Math.signum(xd)),
           (int) (pos.y / Tile.HEIGHT + Math.signum(yd)));
   boolean re = (nextTile != null && !nextTile.canPass(this));
   if (re) bounceWallTime = 10;
   return re;
 }
  public boolean isTargetBehindWall(double dx2, double dy2, Entity e) {
    int x1 = (int) pos.x / Tile.WIDTH;
    int y1 = (int) pos.y / Tile.HEIGHT;
    int x2 = (int) dx2 / Tile.WIDTH;
    int y2 = (int) dy2 / Tile.HEIGHT;

    int dx, dy, inx, iny, a;
    Tile temp;
    Tile dTile1;
    Tile dTile2;
    dx = x2 - x1;
    dy = y2 - y1;
    inx = dx > 0 ? 1 : -1;
    iny = dy > 0 ? 1 : -1;

    dx = java.lang.Math.abs(dx);
    dy = java.lang.Math.abs(dy);

    if (dx >= dy) {
      dy <<= 1;
      a = dy - dx;
      dx <<= 1;
      while (x1 != x2) {
        temp = level.getTile(x1, y1);
        if (!temp.canPass(e)) {
          return true;
        }
        if (a >= 0) {
          dTile1 = level.getTile(x1 + inx, y1);
          dTile2 = level.getTile(x1, y1 + iny);
          if (!(dTile1.canPass(e) || dTile2.canPass(e))) {
            return true;
          }
          y1 += iny;
          a -= dx;
        }
        a += dy;
        x1 += inx;
      }
    } else {
      dx <<= 1;
      a = dx - dy;
      dy <<= 1;
      while (y1 != y2) {
        temp = level.getTile(x1, y1);
        if (!temp.canPass(e)) {
          return true;
        }
        if (a >= 0) {
          dTile1 = level.getTile(x1 + inx, y1);
          dTile2 = level.getTile(x1, y1 + iny);
          if (!(dTile1.canPass(e) || dTile2.canPass(e))) {
            return true;
          }
          x1 += inx;
          a -= dy;
        }
        a += dx;
        y1 += iny;
      }
    }
    temp = level.getTile(x1, y1);
    if (!temp.canPass(e)) {
      return true;
    }
    return false;
  }