/*
 * Csucslista.java
 * a játék csúcslistájának adatszerkezete
 * by pts@fazekas.hu at Sun Apr 22 19:28:17 CEST 2001
 * 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 java.io.FileNotFoundException;
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.Serializable;

/**
 * A játék csúcslistájának (Hősi Halottaink, hall of fame, toplista, legjobbak
 * listája) adatszerkezetét reprezentálja. A csúcslistát (mint objektumot,
 * serialization-nel) ki lehet menteni lemezre és vissza is lehet tölteni.
 */
public class Csucslista implements Serializable {
  public static class CsucslistaBejegyzes implements Serializable {
    // `implements Comparable', de az nincs a JDK1.1-ben :-(
    // muszáj `implements Serializable', nem elég Csucslistának
    protected String nev;
    protected int pontszam;
    public CsucslistaBejegyzes(String nev, int pontszam) {
      this.nev=nev;
      this.pontszam=pontszam;
    }
    public int compareTo(Object masik) {
      CsucslistaBejegyzes masikcs=(CsucslistaBejegyzes)masik;
      return this.pontszam==masikcs.pontszam ? 0 :
             this.pontszam> masikcs.pontszam ? 1 : -1;
    }
    public String toString() { return nev+": "+pontszam; }
    public void hozzafuz(char c) { nev+=c; }
  }
  protected String filenev;
  public static final int MERET=9, NOVEKMENY=100;
  private CsucslistaBejegyzes bejegyzesek[];
  protected void alapErtek() {
    /* alapértékekkel feltöltött :Csúcslistát hoz létre */
    bejegyzesek=new CsucslistaBejegyzes[MERET];
    for (int i=0;i<bejegyzesek.length;i++) bejegyzesek[i]=new CsucslistaBejegyzes("eNTitánok"(bejegyzesek.length-1-i)*NOVEKMENY);
  }
  public Csucslista setFilenev(String filenev) {
    this.filenev=filenev;
    return this;
  }
  public Csucslista() { alapErtek()}
  public static Csucslista betolt(String filenev) {
    if (filenev==null) return new Csucslista();
    Csucslista ures=new Csucslista().setFilenev(filenev);
    try {
      FileInputStream f;
      ObjectInputStream o;
      try { f=new FileInputStream(filenev)}
      catch (IOException e) { return ures; }
      // catch (FileNotFoundException e) { return new Csucslista(); }
      try { o=new ObjectInputStream(f)}
      catch (java.io.StreamCorruptedException e) { return ures; } 
      catch (IOException e) { return ures; } 
      try { return ((Csucslista)o.readObject()).setFilenev(filenev)}
      catch (IOException e) { return ures; }
      catch (ClassNotFoundException e) { return ures; }
    } catch (Exception e) {
      // hülye böngészők, appletviewerek ezerféle szabványtalan kivételt
      // képesek küldeni.
      return ures;
    }
  }
  public void kiment() {
    if (filenev==null) return;
    FileOutputStream f;
    try {
      f=new FileOutputStream(filenev);
      ObjectOutputStream o=new ObjectOutputStream(f);
      o.writeObject(this);
    }
    //catch (IOException e) {}
    catch (Exception e) {}
  }
  /**
   * Az utoljára felvett bejegyzés indexe, vagy `-1', ha nem volt ilyen.
   */
  protected int utoljara_felvett=-1;
  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.
     */
    int i=0;
    while (i<bejegyzesek.length && csb.compareTo(bejegyzesek[i])<0) i++;
    if (i==bejegyzesek.length) return utoljara_felvett=-1;
    System.arraycopy(bejegyzesek, i, bejegyzesek, i+1, bejegyzesek.length-i-1);
    bejegyzesek[i]=csb;
    return utoljara_felvett=i;
  }
  public int felvesz(int pontszam) {
    return felvesz(new CsucslistaBejegyzes("", pontszam));
  }
  
  /**
   * Az utoljára felvett bejegyzés nevéhez fűz egy karaktert.
   */
  public void hozzafuz(char c) {
    if (utoljara_felvett!=-1) bejegyzesek[utoljara_felvett].hozzafuz(c);
  }
  
  /**
   * Az utoljára felvett bejegyzés nevét zárja le, és visszaadja a bejegyzést
   * String debug info formájában. (null is lehet)
   */
  public String lezar() {
   int i=utoljara_felvett;
   if (i==-1) return null;
   utoljara_felvett=-1;
   return bejegyzesek[i].toString();
  }
  
  public void kiir() {
    for (int i=0;i<bejegyzesek.length;i++) System.out.println(bejegyzesek[i].toString());
    System.out.println("");
  }

  public CsucslistaBejegyzes elementAt(int i) { return bejegyzesek[i]}
  public String nevAt(int i) { return bejegyzesek[i].nev; }
  public int pontszamAt(int i) { return bejegyzesek[i].pontszam; }
  public int length() { return bejegyzesek.length; }
} /// class Csucslista