package propra2012.gruppe33.bomberman.ai;
import java.awt.Point;
import java.io.Serializable;
/**
* DIESES INTERFACE IST EIN ERSTER ENTWURF UND SOMIT NOCH NICHT FUER DEN
* PRAKTISCHEN EINSATZ GEEIGNET.
* <p>
* Dieses Interface dient als Schnittstelle zwischen der KI und dem Spiel. Die
* KI kann die Methoden, die dieses Interface definiert nutzen um eigene
* Berechnungen anzustellen oder um der KI-Figur Befehle zu erteilen.
* <p>
* Dieses Interface wird mit aeußerster Hinsicht auf Performance implementiert,
* das bedeutet die KI muss sich keine Gedanken darum machen, wie oft Sie z.B.
* die int[][][] fields() Methode aufruft.
* <p>
* Die KI muss sich selbst um Dinge wie Pathfinding etc. kuemmern. Dieses
* Interface stellt nur die notwendigsten Funktionen zur Verfuegung, damit die
* KI Pathfinding etc. ueberhaupt betreiben kann.
* <p>
* Die KI kann ihrer Spielfigur nicht direkt Movementbefehle geben, sondern
* stattdessen lediglich "Pfade" setzen. Die interne Impl. wird dann fuer die
* Animation der Spielfigur sorgen. Mit anderen Worten: Die KI kann nur sagen
* "Gehe mal zu diesem Punkt und benutze dafuer diese Felder". Die interne Impl.
* wird gewisse Standardchecks durchfuehren um ein Fehlverhalten der KI zu
* verhindern. Dennoch sollte sich der Programmierer der KI SELBST Gedanken
* ueber die Richtigkeit seiner Impl. machen.
*
* VORABENTSCHEIDUNG: Dieses Interface ist THREAD-SAFE.
*
* @version 0.1 Alpha
*
* @author (IMPLEMENTED BY) Christopher Probst
* @author (USED BY) Malte Schmidt
*/
public interface AIControl extends Serializable {
/**
* Repräsentiert einen absolut soliden Block (Unzerstörbar).
*/
int SOLID = 0;
/**
* Repräsentiert einen zerstörbaren Block.
*/
int BREAKABLE = 1;
/**
* Repräsentiert eine gelegte Bombe.
*/
int BOMB = 2;
/**
* Repräsentiert eine (gleich stattfindende) Explosion.
*/
int EXPLOSION = 3;
/**
* Repräsentiert einen Spieler.
*/
int PLAYER = 4;
/**
* Repräsentiert ein gutes, aufnehmbares Item.
*/
int GOOD_ITEM = 5;
/**
* Repräsentiert ein schlechtes, aufnehmbares Item.
*/
int BAD_ITEM = 6;
boolean placeDefaultBomb();
boolean placeNukeBomb();
boolean placeFastBomb();
boolean placePalisade();
boolean useShield();
/**
* Diese Methode gibt das Kantengewicht (Wichtig fuer Pathfinding) zurueck.
* <p>
* Wichtig: Feld A und Feld B muessen logischerweise aneinander liegen. Dies
* wird ueberprueft. Falls ein Fehler hierbei auftritt wird eine Exception
* intern geworfen.
* <p>
*
*
* @param a
* Feld A (Von...)
* @param b
* Feld B (Nach...)
* @return Liefert das Kantengewicht zurueck.
*/
float edgeWeight(Point a, Point b);
/**
* @return Liefert die akuelle Position der ueberwachten Spielfigur zurueck.
* Die KI muss nicht ueberpruefen ob die Position innerhalb des
* Feldes ist, dies wird intern gecheckt und sollte somit immer
* korrekt sein.
*/
Point activePosition();
/**
* @return Liefert ein Int-Array des AKTUELLEN FELDES (Also wo der Spieler
* gerade steht) zurueck. Dieses Int-Array beinhaltet alle dort
* befindlichen Gegenstaender zurueck. Welcher Int-Wert zu welchem
* Gegenstand gehoert sollte den FINALEN Werten am Anfang dieses
* Interfaces entnommen werden.
*/
int[] activeField();
/**
* @return Liefert true zurueck wenn der gesetzte Pfad "vollendet" wurde.
* Mit anderen Worten wenn der Spieler den gesamten gesetzen Pfad
* abgelaufen hat. Wenn der Pfad vorzeitig geloescht wird (also z.b.
* = null gesetzt wird) gibt diese Methode auch true zurueck. MIT
* ANDEREN WORTEN: Diese Methode gibt immer dann true zurueck wenn
* sich die Figur gerade nicht bewegt.
*/
boolean isResting();
/**
* Gegenteil von
*
* @see AIControl#isResting()
*/
boolean isMoving();
/**
* Diese Methode setzt einen Pfad. Das bedeutet es wird ein Array von Points
* verlangt und ab diesem Punkt wird die interne Impl. die Figur ueber diese
* Punkte animieren (das bedeutet bewegen).
* <p>
* Diese Methode macht intern einige Tests um zu gewaehrleisten, dass der KI
* Programmierer keine Fehler gemacht hat!!! Das beinhaltet z.B. ob keiner
* der uebergebenen Punkt null ist und ob alle Punkte jeweils aneinander
* liegen.
*
* @param points
* Ein Array mit allen Punkten ueber die der Spieler hinweg
* animiert wird.
*/
void setPath(Point... points);
/**
* @see AIControl#setPath(Point...)
* @return Liefert den akutell gesetzten Pfad zurueck.
*/
Point[] getPath();
/**
* @return Liefert true zurueck falls sich das Feld in IRGENDEINERWEISE
* geaendert hat. Das betrifft jede Kleinigkeit wie z.B. das Setzen
* einer Bombe, das Aufnehmen eines Items, das Verschwinden einer
* SpawnExplosion etc.
*/
boolean hasFieldChanged();
/**
*
* @return Liefert das gesamte Feld zurueck. Warum 3d-Array ?? Nun, die
* ersten 2 Dimensionen spiegeln das 2D-Feld wieder. WICHTIG: die 1.
* Dimension ist y und 2. Dimension ist x. Also umgekehrt zum
* kartesischen Koordinatensystem. Die 3. Dimension liefert das
* Array an Objekten auf diesem Feld zurueck.
*/
int[][][] fields();
}