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

/* Představuje vetřelce jako potřídu třídy TiledSprite.

   Podtřídy mohou přetížit:
      void playerHasMoved()   -- volá se při pohybu hráče
	  void move()             -- přesune vetřelce
*/

import java.awt.*;


public class AlienSprite extends TiledSprite
{
  private final static int UPDATE_FREQ = 30;

  private int updateCounter = 0;


  public AlienSprite(int x, int y, int w, int h, ImagesLoader imsLd, WorldDisplay wd)
  { super(x, y, w, h, imsLd, "baddieStill", wd);  } 


  public void playerHasMoved(Point playerLoc)
  /* Called by the WorldDisplay object whenever
     the player has moved. This can be used to trigger
     a recalculation of the alien's movement 'plan'.
  */
  {  }


  public void update()
  /* Volá se ze třídy AlientTilesPanel pro aktualizaci vetřelce.

     Pokusí se zasáhnout hráče. Není-li to možné, pokračuje v dalším pohybu.

     K aktualizaci vetřelce dochází po každých UPDATE_FREQ voláních této metody,
     což vede k jeho zpomalení. Jinak by totiž na pohyby hráče reagoval příliš rychle.
  */
  { updateCounter = (updateCounter+1)%UPDATE_FREQ;
    if (updateCounter == 0) {   // snížená frekvence aktualizace
      if (!hitPlayer()) 
        move();
    }
  } // konec metody: update()


  private boolean hitPlayer()
  /* Je-li vetřelec na téže dlaždici jako hráč, došlo k zasažení hráče, kteroužto  
     skutečnost oznam objektu typu WorldDisplay.
     Vrácená logická hodnota signalizuje, došlo-li k zásahu.
  */
  {
    Point playerLoc = world.getPlayerLoc();
    if (playerLoc.equals( getTileLoc() )) {
      world.hitByAlien();   // úder!
      return true;
    }
    return false;
  } // konec metody: hitPlayer()


  protected void move()
  /* Přesuň se v náhodném směru. Je-li cesta blokována,
     vyzkoušej směr jiný. Tímto způsobem
     může v krajním případě dojít k zaseknutí spritu.
  */
  {
    int quad = getRandDirection();
    Point newPt;
    while ((newPt = tryMove(quad)) == null)  
      quad = getRandDirection();
      // cyklus by se nějakou chvíli mohl opakovat, 
      // ale nakonec by měl najít možný směr
    setMove(newPt, quad);
  } // konec metody: move()



  protected void setMove(Point newPt, int quad)
  /* Přesuň vetřelce na novou dlaždici a změň jeho sprite.
     Novou pozici kontrolujeme, což je nicméně zbytečné - 
     zkontrolovali jsme ji totiž už při jejím výběru.
  */
  { if (world.validTileLoc(newPt.x, newPt.y)) {   // mělo by být ok
      setTileLoc(newPt);
      if ((quad == NE) || (quad == SE))
        setImage("baddieRight");
      else if ((quad == SW) || (quad == NW))
        setImage("baddieLeft");
      else 
        System.out.println("Neznámý kvadrant vetřelce: + quad);
    }
    else
      System.out.println("Vetřelce nelze přesunout na (" + newPt.x + ", " + newPt.y + ")");
  }  // konec metody: setMove()


}  // konec třídy: AlienSprite
