// 11.10.2010: 18:00-19:00 - GUI für Game Over und Level Up

/*
 * Beste Reihenfolge zum Ansehen dieser Klassen:
 * 1. MainMenuGUI (diese hier, altes GUI-System)
 * 2. GameGUI (altes GUI-System)
 * 3. SnakeCollisions
 * 4. SnakeHeadMover
 * 5. SnakeTailSpriteSelector
 * 6. Simple2DFollow
 * 7. ParallaxScroller
 * 8. SnakeTailController (diese Klasse ist relativ kompliziert)
 */

/*
 * Namespaces sind wie Pakete mit Features. In Unity Skripten
 * verwendet man praktisch immer den Namespace "UnityEngine",
 * der alle Klassen enthält, die in der Scripting Referenz
 * unter "Runtime Classes" zu finden sind.
 */
using UnityEngine;

/*
 * Das Attribut "ExecuteInEditMode()" sorgt dafür, dass das
 * Skript auch im Editor ausgeführt wird. Man muss also nicht
 * erst auf "Play" klicken, um die GUI zu sehen. Für ein Startmenü
 * kann das sinnvoll sein (in diesem speziellen Fall kann man so das
 * Layout komfortabel über den Editor "designen"), ansonsten sollte
 * man mit diesem Attribut eher vorsichtig sein.
 */
[ExecuteInEditMode()]

/*
 * C# Skripte müssen als Klassennamen immer den gleichen Namen haben,
 * wie die Datei, in der sie definiert werden (MainMenuGUI). Alle
 * Skripte erben entweder direkt oder indirekt von MonoBehaviour
 * (man könnte sagen, "MonoBehaviour" ist die Vaterklasse aller
 * Unity Skripte).
 */
public class MainMenuGUI : MonoBehaviour {

    /*
     * Alle Objektvariablen, die mit public deklariert sind, werden
     * im Editor im Property Inspektor angezeigt und können dort
     * verändert werden (Ausnahme: Es gibt bestimmte Typen / Klassen,
     * die von Unity nicht dargestellt bzw. gespeichert werden können;
     * falls die Objektvariable so einen Typen hat, klappt das nicht).
     * 
     * Aufpassen muss man lediglich, weil Veränderungen
     * im "Play-Modus" nicht persistent sind, d.h. alle Änderungen,
     * die während dem Spielen im Editor durchgeführt werden, sollte
     * man sich merken (z.B. Screenshot machen) bevor man die
     * Änderungen nach einer Spieltest-Session endgültig einträgt.
     */

    public Rect startButtonPosition = new Rect(40, 40, 300, 40);
    public string startButtonText = "Spiel starten";

    public Rect quitButtonPosition = new Rect(40, 100, 300, 40);
    public string quitButtonText = "Spiel beenden";

    public GUISkin skin = null;

    /*
     * OnGUI ist eine Methode, die von Unity automatisch aufgerufen wird.
     * Sie dient dazu, Benutzerschnittstellen mit dem alten GUI-System zu 
     * implementieren. Das alte GUI-System wird noch für Editor-Scripting
     * verwendet ist ansonsten aber seit Unity 4.6 eher obsolet. Von daher
     * hat diese Implementierung eher historischen Wert ;-)
     */
    public void OnGUI() {
        GUI.skin = skin;

        /*
         * GUI.Button ist eine Methode, die den Button am Bildschirm
         * darstellt und "true" als Ergebnis zurückliefert, wenn der
         * Button vom Spieler gedrückt wird.
         */
        if (GUI.Button(startButtonPosition, startButtonText)) {
            Application.LoadLevel("Level-01");
        }

        // ! bedeutet "nicht", && bedeutet "und"
        // Also: "wenn nicht WebPlayer und gleichzeitig nicht Mobile Device"
        if (!IsWebPlayer && !IsMobileDevice) {
            if (GUI.Button(quitButtonPosition, quitButtonText)) {
                Application.Quit();
            }
        }
    }

    /*
     * Dieses sogenannte "Property" liefert "true", wenn die aktuelle
     * Plattform entweder ein Windows oder Mac Webplayer ist, oder ein
     * Mac OS Dashboard Widget. Wir verwenden das, weil auf diesen 
     * Plattformen ein "Beenden" des Spiels nicht wirklich sinnvoll 
     * wäre (und auch gar nicht möglich ist).
     */
    public bool IsWebPlayer {
        get {
            return Application.platform == RuntimePlatform.OSXWebPlayer
                || Application.platform == RuntimePlatform.OSXDashboardPlayer
                || Application.platform == RuntimePlatform.WindowsWebPlayer;
        }
    }

    /*
     * Auf mobilen Geräten wäre das auch nicht sinnvoll.
     */
    public bool IsMobileDevice {
        get {
            return Application.isMobilePlatform;
        }
    }

    /*
     * Ideen zum Erweitern:
     *   - Der "Beenden"-Button macht an sich ja auch im Editor keinen Sinn,
     *     also könnte diese Klasse so erweitert werden, dass der Button
     *     im Editor ausgeblendet wird
     *   - Man könnte Buttons einführen, um die verschiedenen Levels direkt
     *     anzuspringen
     *   - Man könnte PlayerPrefs verwenden, um zu speichern welche Levels
     *     der Spieler schon "freigespielt" hat und nur die Buttons dieser
     *     Levels anzeigen.
     *   - Man könnte das Layout (Positionierung der Buttons) automatisch
     *     die Screen-Größe anpassen (hierzu kann man Screen.width und 
     *     Screen.height verwenden)
     */
}
