
// TiledSprite.java 
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th

/* Objekt typu TiledSprite se přesouvá z jedné dalždice na druhou.
   Jeho pohyb je omezen čtyřmi směry (hlavní strany kompasu, nebo-li kvadranty):
   NE, SE, SW, NW a STILL pro žádný pohyb.

   Třída TiledSprite rozšiřuje třídu Sprite, nepoužívá však její 
   souřadnice (locx, locky) v pixelech. Místo toho udržuje vlastní
   pozici aktuální dlaždice (xTile, yTile).

   To znamená, že se instance této třídy nemůže pohybovat
   uvnitř dlaždice, ale jen mezi jednotlivými dlaždicemi.

   Pozice spritu v pixelech (tj. jeho pozice v panelu JPanel) 
   je aktualizována objektem typu WorldDisplay těsně před tím, než
   se hra vykreslí na panel JPanel.
*/

import java.awt.*;


public class TiledSprite extends Sprite
{
  // směry možného pohybu spritu
  public final static int NE = 0;
  public final static int SE = 1;
  public final static int SW = 2;
  public final static int NW = 3;
  public final static int STILL = 4;

  public final static int NUM_DIRS = 4;

  // chráněnné proměnné 
  protected int xTile, yTile;    // souřadnice dlaždice for the sprite
  protected WorldDisplay world;


  public TiledSprite(int x, int y, int w, int h,
                           ImagesLoader imsLd, String name,
		                   WorldDisplay wd)
  { super(0, 0, w, h, imsLd, name);
    setStep(0, 0);      // žádný pohyb
    world = wd;

    if (!world.validTileLoc(x, y)) {  // zeptej se herního světa, je-li dlaždice (x,y) platná
      System.out.println("Pozice dlaždice vetřelce (" + x + "," + y +
                                        ") není platná; použije se (0,0)");
      x = 0; y = 0;
    }
    xTile = x; yTile = y; 
  }  // konec konstruktoru: TiledSprite()


  public void setTileLoc(Point pt)
  { xTile = pt.x;
    yTile = pt.y;  
  }

  public Point getTileLoc()
  {  return new Point(xTile, yTile);  }


  // ------------------ metody pohybu ---------------------

  public Point tryMove(int quad)
  /* Převede kvadrant na souřadnici dlaždice a otestuje její platnost.
     Převod se liší v závislosti na tom, je-li pozice řádku aktuální dlaždice (yTile)
     sudá nebo lichá. Vrací null, pokud nová pozice není platná.
  */
  {
    Point nextPt;
    if (quad == NE)
      nextPt = (yTile%2 == 0)? new Point(xTile,yTile-1) : new Point(xTile+1,yTile-1);
    else if (quad == SE)
      nextPt = (yTile%2 == 0)? new Point(xTile,yTile+1) : new Point(xTile+1,yTile+1);
    else if (quad == SW)
      nextPt = (yTile%2 == 0)? new Point(xTile-1,yTile+1) : new Point(xTile,yTile+1);
    else if (quad == NW)
      nextPt = (yTile%2 == 0)? new Point(xTile-1,yTile-1) : new Point(xTile,yTile-1);
    else
      return null;

    if (world.validTileLoc(nextPt.x, nextPt.y))  
      // zeptej se objektu typu WorldDisplay, je-li cílová dlaždice v platné lokaci
      return nextPt;
    else
     return null;
  } // konec metody: tryMove()

  

  public int getRandDirection() 
  // vrátí náhodný směr
  {   return (int)(NUM_DIRS * Math.random());  }


  public int whichQuadrant(Point p)
  /* Zjistí směr od aktuální pozice spritu k bodu p (p sousedí s aktuální dlaždicí).
     Vrátí -1 pokud vhodný směr neexistuje.
  */
  { // System.out.println("dlaždice: " + xTile + ", " + yTile);
    // System.out.println("k: " + p.x + ", " + p.y);

    if ((xTile == p.x) && (yTile == p.y))
      return STILL;   // sprite se již nachází v bodě p

    if (yTile%2 == 0) {    // aktuální dlaždice je na sudém řádku
      if ((xTile == p.x) && (yTile-1 == p.y))
        return NE;
      if ((xTile == p.x) && (yTile+1 == p.y))
        return SE;
      if ((xTile-1 == p.x) && (yTile+1 == p.y))
        return SW;
      if ((xTile-1 == p.x) && (yTile-1 == p.y))
        return NW;
    }
    else {    // aktuální dlaždice je na lichém řádku
      if ((xTile+1 == p.x) && (yTile-1 == p.y))
        return NE;
      if ((xTile+1 == p.x) && (yTile+1 == p.y))
        return SE;
      if ((xTile == p.x) && (yTile+1 == p.y))
        return SW;
      if ((xTile == p.x) && (yTile-1 == p.y))
        return NW;
    }
    return -1;
  }  // konec metody: whichQuadrant()

}  // konec třídy: TiledSprite