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

/* Tato třída reprezentuje hráče jako podtřídu třídy TiledSprite.

   Hráč může sbírat předměty. Vyhrává, jakmile je posbírá všechny.

   Je-li hráč 'zasažen' vetřelcem, ztrácí jeden život.
   Když takto vyčerpá všechny své životy, tak prohrál.

   Hráč komunikuje s objektem typu WorldDisplay, od něhož se 
   dozvídá informace o herním světě (např. je-li na aktuální
   dlaždici předmět k sebrání).

   K následujícím událostem jsou připojeny zvukové efekty:
     * sebrání předmětu
     * pokus o sebrání předmětu na dlaždici bez předmětu
     * zásah vetřelcem
     * pokus o přesun do neprůchozí oblasti nebo na dlaždici s překážkou
*/

import java.awt.*;
import java.util.*;


public class PlayerSprite extends TiledSprite
{
  // počet životů hráče
  private final static int MAX_HITS = 3;

  private ClipsLoader clipsLoader;   // pro přehrávání zvukových efektů
  private AlienTilesPanel atPanel;

  private int hitCount = 0;


  public PlayerSprite(int x, int y, int w, int h, 
                                ClipsLoader clipsLd, ImagesLoader imsLd, 
                                WorldDisplay wd, AlienTilesPanel atp)
  { super(x, y, w, h, imsLd, "still", wd);
    clipsLoader = clipsLd;
    atPanel = atp;
  } // konec konstruktoru: PlayerSprite()


  public boolean tryPickup()
  /* Uživatel požaduje, aby se hráčův sprite pokusil sebrat předmět
     z aktuální dlaždice. 
  */
  {
    String pickupName;
    // System.out.println("předmět: " + getTileLoc() );
    if ((pickupName = world.overPickup( getTileLoc())) == null) {
      clipsLoader.play("noPickup", false);     // nic k sebrání
      return false;
    }
    else {     // nalezen předmět
      clipsLoader.play("gotPickup", false);
      world.removePickup(pickupName);    // oznam objektu typu WorldDisplay
      return true;
    }
  }


  // ----------------- metody vztahující se k zásahu vetřelcem ---------------


  public void hitByAlien()
  /* Objekt typu WorldDisplay oznamuje hráči, že byl zasažen.
     Pokud se tak stalo dostatečněkrát, oznam objektu typu AlienTilesPanel, 
     že hra skončila. */
  { clipsLoader.play("hit", false);
    hitCount++;
    if (hitCount == MAX_HITS)    // hráč je mrtev
      atPanel.gameOver();
  } // konec metody: hitByAlien()


  public String getHitStatus()
  // Tuto metodu využívá třída AlienTilesPanel pro zobrazení zprávy o stavu hráče
  {  
    int livesLeft = MAX_HITS-hitCount;
    if (livesLeft <= 0)
      return "You're D*E*A*D";
    else if (livesLeft == 1)
      return "1 life left";
    else
      return  "" + livesLeft + " zbývající život(y)";  
  } // konec metody: getHitStatus()



  // ----------------- metody pro pohyb ---------------------------

  public void move(int quad)
  /*  Pokusí se přesunout ve směru zadaném pomocí kvadrantu.
      Není-li to možné, pohyb se neprovede. Je-li pohyb možný,
      pak aktualizuj lokaci dlaždice spritu, jeho obrázek a oznam
      objektu typu WorldDisplay, že došlo k pohybu hráče.
  */
  {
    Point newPt = tryMove(quad);
    if (newPt == null) {   // pohyb není možný
      clipsLoader.play("slap", false);
      standStill();
    }
    else {    // pohyb je možný
      setTileLoc(newPt);    // aktualizuj polohu dlaždice spritu
      if (quad == NE)
        setImage("ne");
      else if (quad == SE)
        setImage("se");
      else if (quad == SW)
        setImage("sw");
      else // quad == NW
        setImage("nw");
      world.playerHasMoved(newPt, quad);
    }
  }  // konec metody: move()


  public void standStill()
  {  setImage("still");    }

}  // konec třídy: PlayerSprite