/*
 * KkkgSkel.java v2
 * Kincskereső Kisgömböc váza (szkeletonja). JDK1.2, applet és application is.
 * by pts@fazekas.hu at 2000.03.22
 * további doksi: a README-ben és e file legkülső class-ának fejkommentjében
 *
 * Kincskereső Kisgömböc (C) Early May 2001 by eNTitánok (Rév Szilvia,
 * Szabó Péter <pts@inf.bme.hu>, Szurdi Miklós, Weizengruber Attila).
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or   
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package eNTitanok.kkkg;
import eNTitanok.gfx.Skel;
import eNTitanok.gfx.Skel.SzekvenciaCanvas;
import eNTitanok.gfx.Skel.SzekvenciaBejegyzes;
import eNTitanok.gfx.OkosAWT.OkosApplet;
import eNTitanok.gfx.OkosAWT.OkosFrame;
import eNTitanok.gfx.OkosAWT.OkosCanvas;

/**
 * Ez a file tartalmazza a Kincskereső Kisgömböc játék vázát (szkeletonját),
 * a szekeleton megjelenítését kivéve.
 *
 * <P>Csapat: eNTitánok
 * <BR>Megnevezés: 6. Szkeleton beadása
 * <BR>Programfile-ok: ** /*.java
 * <BR>Fordítás: javac -g eNTitanok/kkkg/KkkgSkel.java
 * <BR>Futtatás: java eNTitanok.kkkg.KkkgSkel
 * <BR>Futtatás: appletviewer KkkgSkel.html
 * <BR>A futtatáshoz JDK1.2.2 (nem más!!) és grafikus megjelenítő szükséges.
 */
public final class KkkgSkel extends Skel {
  public static class Csucs {
    public Csucs() {
      skel.constructor();
      skel.leave();
    }
    public void osszekot(Csucs masik) {
      skel.enter();
      skel.leave();
    }
    public int tavolsag(Csucs masik) {
      /* milyen messze van this és masik -- feltesszük, hogy szomszédosak */
      skel.enter();
      skel.leave();
      return 0;
    }
    public int tavolsag(int merre) {
      skel.enter();
      skel.leave();
      return 0;
    }
  }

  public static class Helyzet {
    public void ugrik() {
      skel.enter();
      skel.leave();
    }

    public Helyzet() {
      /* gagyi, kamu konstruktor, kesobb csucsba-val lehet korrigalni */
      skel.constructor();
      skel.leave();
    }
    public Helyzet(Csucs c1) {
      skel.constructor();
      skel.leave();
    }

    public void csucsba(Csucs c1) {
      skel.enter();
      skel.leave();
    }

    public int mennyit_mehet(int merre) {
      /* @return: innen mennyit mehet az akt. élen a megadott irányba */
      skel.enter();
      skel.leave();
      return 0;
    }
  } /// class Helyzet

  // ---

  public static abstract class Lathato extends Helyzet {
    Labirintus labirintus;
    public boolean utkozik_e(Lathato masik) {
      // Imp: / 0 felé kerekítsen!! (x>=0??)
      skel.enter();
      skel.leave();
      return false;
    }

    protected abstract void halad();
    // ^^^ egy lépes egy iterációban; nem feltétlenül mozgás
  } /// class Lathato

  public static abstract class Targy extends Lathato {
    abstract void felveve();
    protected void halad() {
      // a tárgyak alapból nem haladnak semerre, de a Kisgömböc felveheti
      // őket.
      skel.enter();
      if (skel.ask_boolean("Ütközök :Kisgömböc-cel?")) {
        felveve();
        labirintus.removeLathato(this);
      }
      skel.leave();
    }
  } /// class Targy

  public static class Gyemant extends Targy {
    public Gyemant(Labirintus l) {
      skel.constructor();
      labirintus=l;
      skel.leave();
    }
    public void felveve() {
      skel.enter();
      labirintus.getJatek().novelPontszam(23);
      labirintus.csokkentGyemantszam();
      skel.leave();
    }
    public void halad() { skel.enter()super.halad(); skel.leave()}
  } /// class Gyemant

  public static class KetyegoBomba extends Lathato {
    public KetyegoBomba(Labirintus l) {
      skel.constructor();
      labirintus=l;
      skel.leave();
    }
    public void halad() {
      skel.enter();
      if (skel.ask_boolean("Robbanjak fel?")) {
        int i;
        while  (0!=(i=skel.ask("Mivel ütközök még?","már semmivel/Szörnnyel/Kisgömböccel"))) {
          if (i==1) labirintus.removeLathato(null);
          else if (i==2) labirintus.getJatek().csokkentEletszam();
        }
        labirintus.removeLathato(this);
      }
      skel.leave();
    }
  } /// class KetyegoBomba

  public static abstract class Ajandek extends Targy {
    protected void halad() {
      skel.enter();
      super.halad();
      if (skel.ask_boolean("Lejárt az időm és tűnjek el?")) {
        labirintus.removeLathato(this);
      }
      skel.leave();
    }
  } /// class Ajandek

  public static class FelvehetoBomba extends Ajandek {
    public FelvehetoBomba(Labirintus l) {
      skel.constructor();
      labirintus=l;
      skel.leave();
    }
    public void felveve() {
      skel.enter();
      labirintus.getJatek().novelPontszam(1);
      labirintus.getJatek().novelBombaszam();
      skel.leave();
    }
    public void halad() { skel.enter()super.halad(); skel.leave()}
  } /// class FelvehetoBomba

  public static class Bonusz extends Ajandek {
    public Bonusz(Labirintus l) {
      skel.constructor();
      labirintus=l;
      skel.leave();
    }
    public void felveve() {
      skel.enter();
      labirintus.getJatek().novelPontszam(99);
      skel.leave();
    }
    public void halad() { skel.enter()super.halad(); skel.leave()}
  } /// class Bonusz

  public static class SimaElixir extends Ajandek {
    public SimaElixir(Labirintus l) {
      skel.constructor();
      labirintus=l;
      skel.leave();
    }
    public void felveve() {
      skel.enter();
      labirintus.getJatek().novelPontszam(17);
      labirintus.getJatek().novelEletszam(1);
      skel.leave();
    }
    public void halad() { skel.enter()super.halad(); skel.leave()}
  } /// class SimaElixir

  public static class SzuperElixir extends Ajandek {
    public SzuperElixir(Labirintus l) {
      skel.constructor();
      labirintus=l;
      skel.leave();
    }
    public void felveve() {
      skel.enter();
      labirintus.getJatek().novelPontszam(17);
      labirintus.getJatek().novelEletszam(0);
      skel.leave();
    }
    public void halad() { skel.enter()super.halad(); skel.leave()}
  } /// class SzuperElixir

  public static abstract class Mozgo extends Lathato {
    protected abstract void elfordult();
    // ^^^ akkor hivodik meg, ha a haladasi irany megvaltozik. Feluldefinialando.
    public void halad() {
      skel.enter();
      skel.leave();
    }
  }

  public static abstract class Szorny extends Mozgo {
  }

  public static class ButaSzorny extends Szorny {
    protected void elfordult() {
      skel.enter();
      skel.leave();
    }
    protected void halad_veletlenszeruen() {
      skel.enter();
      skel.leave();
    }
    public void halad() {
      skel.enter();
      halad_veletlenszeruen();
      if (skel.ask_boolean("Ütközök-e Kisgömböccel?")) {
        labirintus.getJatek().csokkentEletszam();
      }
      skel.leave();
    }
    public ButaSzorny(Labirintus l) {
      skel.constructor();
      labirintus=l;
      skel.leave();
    }
  } /// ButaSzorny

  public static class OkosSzorny extends Szorny {
    protected void elfordult() {
      skel.enter();
      skel.leave();
    }
    protected void halad_legrovidebb_uton() {
      skel.enter();
      skel.leave();
    }
    public void halad() {
      skel.enter();
      halad_legrovidebb_uton();
      if (skel.ask_boolean("Ütközök-e Kisgömböccel?")) {
        labirintus.getJatek().csokkentEletszam();
      }
      skel.leave();
    }
    public OkosSzorny(Labirintus l) {
      skel.constructor();
      labirintus=l;
      skel.leave();
    }
  } /// OkosSzorny

  public static class Kisgomboc extends Mozgo {
    protected void elfordult() {
      skel.enter();
      skel.leave();
    }
    protected void fordul(int merre) {
      skel.enter();
      skel.leave();
    }
    public void halad() {
      /* megprobal kanyarodni; ha nem sikerul, megy tovabb egyenesen
       * tipikusan a player adja meg `merre'-t
       */
      skel.enter();
      skel.leave();
    }
    public Kisgomboc(Labirintus l) {
      skel.constructor();
      labirintus=l;
      skel.leave();
    }
  } /// Kisgomboc

  public static class Jatek extends Thread {
    protected Labirintus labirintus;
    protected Csucslista csucslista;
    public Jatek(Csucslista csucslista) {
      skel.constructor();
      this.csucslista=csucslista;
      skel.leave();
    }
    public synchronized void szintlepes() {
      skel.enter();
      skel.leave();
    }
    public synchronized void bombatLerak() {
      skel.enter();
      skel.leave();
    }
    public synchronized void megallit() {
      skel.enter();
      skel.leave();
    }
    public boolean akartBombazni() {
      return skel.ask_boolean("A játékos akart bombát lerakni?");
    }
    public void run() {
      // ez _volt_ a Probac run() metodusa, ami kulon szalban fut.
      // ez a szal frissiti a jatekallast (,,mozgatja'' a jatekot),
      // tovabba ez a szal rajzol az `sd'-re.
      skel.enter();
      while (skel.ask_boolean("Van-e még élete a Kisgömböcnek?")) {
        if (labirintus==null || labirintus.gyemantokElfogytak()) {
          labirintus=new Labirintus(this, 0);
          labirintus.palya_betoltve();
        } else if (labirintus!=null && skel.ask_boolean("Alaphelyzetbe kell-e tenni a labirintust?")) {
          labirintus.alaphelyzetbe();
        }
        if (skel.ask_boolean("Szünetel-e a játék?")) continue;
        labirintus.getKisgomboc().fordul(skel.ask("Merre akar menni a játékos?","le/fel/jobbra/balra"));
        labirintus.mozgat();
        if (skel.ask_boolean("Van-e idő kirajzolni a játékállást?")) {
          labirintus.elorajzol();
          statRajzol();
        }
      }
      if (skel.ask_boolean("Bekerültünk-e a csúcslistába?")) {
        CsucslistaBejegyzes csb=new CsucslistaBejegyzes("",skel.ask_int("Elért pontszám =?",0,Integer.MAX_VALUE));
        csucslista.felvesz(csb);
        String s;
        while (0!=(s=skel.ask_string("A név következő karaktere? (üres=vége)")).length()) {
          csucslista.nevet_gepel(csb, s.charAt(0));
        }
        csucslista.kiment("filenév");
      }
      skel.leave();
    } /// run()

    protected void statValtozott() {
      skel.enter();
      skel.leave();
    }
    protected void statRajzol() {
      skel.enter();
      skel.leave();
    } /// statRajzol()

    public void novelPontszam(int mennyivel) {
      skel.enter();
      statValtozott();
      skel.leave();
    }
    public void novelEletszam(int mennyivel) {
      skel.enter();
      statValtozott();
      skel.leave();
    }
    public void novelBombaszam() {
      skel.enter();
      statValtozott();
      skel.leave();
    }
    public void csokkentEletszam() {
      // a valódi csökkentés nem itt történek, hanem a run()-ban
      // itt csak egy flag-et állítunk be, hogy csökkenteni kell
      skel.enter();
      statValtozott();
      skel.leave();
    }
    public boolean csokkentBombaszam() {
      skel.enter();
      if (skel.ask_boolean("Van-e még bomba a Kisgömböcnél?")) {
        statValtozott();
        skel.leave();
        return true;
      } else {
        skel.leave();
        return false;
      }
    }
  } /// class Jatek

  public static class Labirintus {
    public void csokkentGyemantszam() {
      skel.enter();
      skel.leave();
    }
    public boolean gyemantokElfogytak() {
      skel.enter();
      boolean b=skel.ask_boolean("Elfogytak-e a gyémántok?");
      skel.leave();
      return b;
    }

    protected Jatek jatek;
    // protected Lathato lathatok[]; -- a valódi programban ez lesz
    // vvv ezek csak a szkeletonban vannak, demonstrációnak. A valódi
    //     programban ezek a lathatol[] tömbben lesznek, összevissza
    protected Kisgomboc kisgomboc;
    protected OkosSzorny okosSzorny;
    protected ButaSzorny butaSzorny;
    protected FelvehetoBomba felvehetoBomba;
    protected Bonusz bonusz;
    protected SimaElixir simaElixir;
    protected SzuperElixir szuperElixir;
    protected KetyegoBomba ketyegoBomba;
    protected Gyemant gyemant;

    public Kisgomboc getKisgomboc() { return kisgomboc; }
    public Jatek getJatek() { return jatek; }

    protected Lathato addLathato(Lathato lathato) {
      /* egy új :Látható-t helyez el this.lathatok-ban */
      skel.enter();
      skel.leave();
      return null;
    }
    public void removeLathato(int id) {
      skel.enter();
      skel.leave();
    }
    public void removeLathato(Lathato lathato) {
      skel.enter();
      removeLathato(0);
      skel.leave();
    }

    public void feloszlat() {
      /* amikor a :Játék felszabadítja, akkor hívódik meg */
      skel.enter();
      skel.leave();
    }
    public void elorajzol() {
      skel.enter();
      skel.leave();
    }

    public Labirintus(Jatek jatek, int sorszam) {
      skel.constructor();
      this.jatek=jatek;
      skel.leave();
    }
    public Lathato[] getUtkozesek(int id) {
      skel.enter();
      skel.leave();
      return null;
    }

    public void palya_betoltve() {
      /* inicializálás miután a pálya már betöltődött */
      skel.enter();
      grafot_felepit();
      skel.leave();
    }

    public void mozgat() {
      skel.enter();
      keletkeznek();
      utkozesvizsgalat();
      haladnak();
      eltunnek();
      skel.leave();
    }

    public void keletkeznek() {
      skel.enter();
      int i;
      if (jatek.akartBombazni()) {
        ketyegoBomba=new KetyegoBomba(this);
      }
      while (0!=(i=skel.ask("Mi keletkezik?","semmi/FelvehetőBomba/Bónusz/SimaElixír/SzuperElixír/OkosSzörny/ButaSzörny"))) {
             if (i==1) felvehetoBomba=new FelvehetoBomba(this);
        else if (i==2) bonusz=new Bonusz(this);
        else if (i==3) simaElixir=new SimaElixir(this);
        else if (i==4) szuperElixir=new SzuperElixir(this);
        else if (i==5) okosSzorny=new OkosSzorny(this);
        else if (i==6) butaSzorny=new ButaSzorny(this);
      }
      skel.leave();
    }
    public void utkozesvizsgalat() {
      // ez számos metódust meghív, és az eredményt egy tömbbe helyezi.
      // Nincs sok értelme a részleteket bevenni a szkeletonba, mert a tömb
      // amúgy sem jelenik meg (kérdésekkel váltjuk ki).
      skel.enter();
      skel.leave();
    }
    public void haladnak() {
      skel.enter();
      int i;
      while (0!=(i=skel.ask("Mi halad még?","már semmi/FelvehetőBomba/Bónusz/SimaElixír/SzuperElixír/OkosSzörny/ButaSzörny/Kisgömböc/KetyegőBomba/Gyémánt"))) {
             if (i==1 && felvehetoBomba!=null) felvehetoBomba.halad();
        else if (i==2 && bonusz!=null) bonusz.halad();
        else if (i==3 && simaElixir!=null) simaElixir.halad();
        else if (i==4 && szuperElixir!=null) szuperElixir.halad();
        else if (i==5 && okosSzorny!=null) okosSzorny.halad();
        else if (i==6 && butaSzorny!=null) butaSzorny.halad();
        else if (i==7 && kisgomboc!=null) kisgomboc.halad();
        else if (i==8 && ketyegoBomba!=null) ketyegoBomba.halad();
        else if (i==9 && gyemant!=null) gyemant.halad();
        else skel.println_plussz(" !! ilyen :Látható nincs is a :Labirintusban!");
      }
      skel.leave();
    }
    public void eltunnek() {
      // ezt sincs sok értelme részletezni a szkeletonban, mert destruktorok
      // amúgy sem szerepelnek, és az eltűnési viszonyok már a halad()-ok
      // meghívásakor eldőltek
      skel.enter();
      skel.leave();
    }

    public void grafot_felepit() {
      // a labirintust egy .gif file-ból építjük fel
      skel.enter();
      Csucs cs1=new Csucs();
      kisgomboc=new Kisgomboc(this);
      cs1.osszekot(null);
      new Csucs();
      gyemant=new Gyemant(this);
      cs1.osszekot(null);
      new Csucs();
      new Gyemant(this);
      skel.leave();
    }
    public void alaphelyzetbe() {
      /* akkor hívódik meg, amikor a Kisgömböc meghalt, és a Labirintus az alaphelyzetből indul tovább */
      skel.enter();
      skel.leave();
    }
  }

  public static class CsucslistaBejegyzes implements java.io.Serializable {
    // `implements Comparable', de az nincs a JDK1.1-ben :-(
    // muszáj `implements Serializable', nem elég Csucslistának
    public CsucslistaBejegyzes(String nev, int pontszam) {
      skel.constructor();
      skel.leave();
    }
    public int compareTo(Object masik) {
      skel.enter();
      skel.leave();
      return 0;
    }
  }
  public static class Csucslista implements java.io.Serializable {
    protected void alapErtek() {
      /* alapértékekkel feltöltött :Csúcslistát hoz létre */
      skel.enter();
      skel.leave();
    }
    public Csucslista() {
      skel.constructor();
      alapErtek();
      skel.leave();
    }
    public static Csucslista betolt(String filenev) {
      skel.enter();
      skel.leave();
      return null;
    }
    public void kiment(String filenev) {
      skel.enter();
      skel.leave();
    }
    public int felvesz(CsucslistaBejegyzes csb) {
      /* felveszi a bejegyzést a csúcslistába, ha elég nagy a pontszám.
       * Visszadja az indexet, ahová felvételre került, vagy -1.
       */
      skel.enter();
      skel.leave();
      return 0;
    }
    public int nevet_gepel(CsucslistaBejegyzes csb, char c) {
      skel.enter();
      skel.leave();
      return 0;
    }

  } /// class Csucslista

  public static class KkkgSzekvenciaCanvas extends SzekvenciaCanvas {
    public KkkgSzekvenciaCanvas() {
      super();
      hanySorFerKi();
      SzekvenciaBejegyzes t[]=new SzekvenciaBejegyzes[13];
      t[0]=new SzekvenciaBejegyzes("Szkeleton","Szkeleton",0);
      t[1]=new SzekvenciaBejegyzes("Jatek","Jatek",1);
      t[2]=new SzekvenciaBejegyzes("Labirintus","Lab.tus",2);
      t[3]=new SzekvenciaBejegyzes("Kisgomboc","Kisgomboc",3);
      t[4]=new SzekvenciaBejegyzes("Gyemant","Gyemant",4);
      t[5]=new SzekvenciaBejegyzes("FelvehetoBomba","F.Bomba",5);
      t[6]=new SzekvenciaBejegyzes("KetyegoBomba","K.Bomba",6);
      t[7]=new SzekvenciaBejegyzes("OkosSzorny","O.Szorny",7);
      t[8]=new SzekvenciaBejegyzes("SzuperElixir","Sz.Elixir",8);
      t[9]=new SzekvenciaBejegyzes("Csucslista","Csucslista",9);
      t[10]=new SzekvenciaBejegyzes("ButaSzorny","B.Szorny",10);
      t[11]=new SzekvenciaBejegyzes("SimaElixir","Si.Elixir",11);
      t[12]=new SzekvenciaBejegyzes("Csucs","Csucs",12);
      // OK: ButaSzorny es SimaElixir is!
      sorok[0]=new SzekvenciaSor(t,0);
      utso=1;
    }
  }

  // ---

  public void init() {
    initFont2();
    this.c=new KkkgSzekvenciaCanvas();
    super.init();
  }

  public void skel_main() {
    skel.enter();
    while (skel.ask_boolean("Induljon új játék?")) {
      Csucslista cs=new Csucslista();
      Jatek j=new Jatek(cs);
      j.run();
    }
    skel.leave();
  }

  public KkkgSkel() { }
  public KkkgSkel(boolean application_e) { this.application_e=application_e; }

  public static void main(String args[]) {
    System.err.println("Kincskereso Kisgomboc Szkeleton, 1. verzio\n(C) Spring 2001 by eNTitanok. http://www.inf.bme.hu/~pts/entitanok/\n");
    final OkosApplet a=new KkkgSkel(true);
    final OkosFrame f=new OkosFrame("eNTitánok: Kincskereső Kisgömböc, szkeleton", a, OkosFrame.A_APPLETKILEP);
    a.init();
    f.show();
    a.start();
  }
} /// class KkkgSkel