# ====================================================================
# dark_castle.py - Ein Text-Adventure in Python
#
# Copyright 2024 Cleto Pescia, post@linux-burg.de
#
# Redistribution and use in source and binary forms, with
# or without modification, are permitted provided that the following
# conditions are met:
#
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer
#    in the documentation and/or other materials provided
#    with the distribution.
#
# 3. Neither the name of the copyright holder nor the names
#    of its contributors may be used to endorse or promote products
#    derived from this software without specific prior written
#    permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
# OF SUCH DAMAGE.
#
# Letzte Änderung: 2024-03-19
# ====================================================================

# --------------------------------------------------------------------
# Einführung
# --------------------------------------------------------------------

def intro():
    """Einführung zu Dark Castle"""
    description = """
*** DARK CASTLE ***

Willkommen! Dieses Text-Adventure spielt in einem geheimnisvollen
Schloss irgendwo in den Alpen."""
    print(description)

# --------------------------------------------------------------------
# Definition der Räume
# --------------------------------------------------------------------

def room1():
    """Raum 1: Dunkler Raum"""

    # Beschreibung des Raumes
    description = """
Du befindest Dich in einem dunklen Raum.
Im Osten siehst du einen Balkon.
Im Westen ist eine grosse Halle."""
    print(description)
    # Dieser Teil der Beschreibung ist davon abhängig,
    # ob wir schon den Schlüssel zur Vorratskammer haben oder nicht
    if (not ("Schluessel_Vorratskammer" in objects)):
        print("Im Süden ist eine Vorratskammer, deren Tür aber verschlossen ist...")
    else:
        print("Im Süden ist eine Vorratskammer.")

    # Gültige Aktionen für diesen Raum
    actions = {
        "o": "Gehe nach Osten",
        "s": "Gehe nach Süden",
        "w": "Gehe nach Westen"
    }
    # Frage den Spieler, was er machen möchte
    user_action = user_input(actions)

    # Führe die gewählte Aktion aus
    if (user_action == "o"):
        next_room = "room5"
        print("\nDu kommst auf einem offenen Balkon und merkst zu spät,\n" +
              "dass der Holzboden dein Gewicht nicht halten kann...\n" +
              "Der Sturz ist heftig. Für dich ist es das Ende.")
    elif (user_action == "s"):
        if ("Schluessel_Vorratskammer" in objects):
            print("\nDu öffnest die Tür zur Vorratskammer.")
            next_room = "room4"
        else:
            print("\nDa kannst Du aber nicht rein...")
            next_room = "room1"
    elif (user_action == "w"):
        next_room = "room2"

    return next_room

# --------------------------------------------------------------------

def room2():
    """Raum 2: Grosse Halle"""

    # Beschreibung des Raumes
    description = "\nDie Halle ist ziemlich dunkel und düster.\nAber am südlichen Ende bemerkst du eine offene Tür."
    print(description)
    if (not ("Schluessel_Vorratskammer" in objects)):
        print("In einer Ecke liegt ein grosser Schlüssel!\nVielleicht der Schlüssel zur Vorratskammer?")
    # Gültige Aktionen für diesen Raum
    actions = {
        "o": "Gehe nach Osten",
        "s": "Gehe nach Süden"
    }
    # Den Schlüssel darf man nur dann nehmen, wenn man ihn noch
    # nicht hat!
    if (not ("Schluessel_Vorratskammer" in objects)):
        actions["t"] = "Nehme den grossen Schlüssel mit"
    # Frage den Spieler, was er machen möchte
    user_action = user_input(actions)

    # Führe die gewählte Aktion aus
    if (user_action == "s"):
        next_room = "room3"
    elif (user_action == "o"):
        next_room = "room1"
    elif (user_action == "t"):
        print("\nDu hast den grossen Schlüssel mitgenommen!")
        # Füge den Schlüssel zur Vorratskammer zur Liste der Gegenstände hinzu
        objects.append("Schluessel_Vorratskammer")
        # Wir bleiben im selben Raum!
        next_room = "room2"

    return next_room

# --------------------------------------------------------------------

def room3():
    """Raum 3: Bibliothek"""

    # Beschreibung des Raumes
    description = "\nDu betrittst eine alte Bibliothek.\n\
Überall an den Wänden sind Regale mit Hunderten von Büchern.\n\
Du wählst ein Buch aus und vertiefst dich in der Lekture."
    print(description)

    # Gültige Aktionen für diesen Raum
    actions = {
        "n": "Gehe nach Norden",
    }
    if ("Schluessel_Bibliothek" in objects):
        actions["o"] = "Öffne den Ausgang"
        print("Nach einer Stunde hast Du genug vom Lesen... Da erinnerst Du dich\nan den Schlüssel für den Ausgang!")
        print("Du willst schauen, ob der Schlüssel wirklich die Tür öffnet.")
    # Frage den Spieler, was er machen möchte
    user_action = user_input(actions)

    # Führe die gewählte Aktion aus
    if (user_action == "n"):
        next_room = "room2"
    elif (user_action == "o"):
        print("\nSehr gut! Du hast das Spiel beendet!\n")
        next_room = "game_over"

    return next_room

# --------------------------------------------------------------------

def room4():
    """Raum 4: Vorratskammer"""

    # Beschreibung des Raumes
    description = "\nDie Vorratskammer ist klein, scheint aber gut gefüllt zu sein!"
    print(description)
    # Gültige Aktionen für diesen Raum
    actions = {
        "n": "Gehe nach Norden",
    }
    if (not ("Schluessel_Bibliothek" in objects)):
        print("In einer Ecke findest Du einen weiteren Schlüssel.")
        print("Auf dem Anhänger steht: 'Ausgang in der Bibliothek'.")
        actions["t"] = "Nehme den Schlüssel mit"
    # Frage den Spieler, was er machen möchte
    user_action = user_input(actions)

    # Führe die gewählte Aktion aus
    if (user_action == "n"):
        next_room = "room1"
    elif (user_action == "t"):
        print("\nDu hast den Schlüssel genommen!")
        # Füge den Schlüssel zum Ausgang in der Bibliothek zur Liste der Gegenstände hinzu
        objects.append("Schluessel_Bibliothek")
        # Wir bleiben im selben Raum!
        next_room = "room4"

    return next_room

# --------------------------------------------------------------------
# Verwalte die Eingabe des Spielers
# --------------------------------------------------------------------

def user_input(allowed_actions):
    """Frage den Spieler nach einer der erlaubten Aktionen"""
    go_on = 1
    while (go_on == 1):
        go_on = 0  # Per Default ist die Antwort gültig :)
        # Frage den Spieler, was er machen möchte
        print("\nMögliche Aktionen:")
        for command, action in allowed_actions.items():
            print(f"{command}: {action}")
        user_action = input("Was möchtest Du tun? ").lower()
        # Überprüfe die Antwort
        if (not (user_action in allowed_actions.keys())):
            print("\nUngültige Antwort...\n")
            go_on = 1

    return user_action

# --------------------------------------------------------------------
# Die Hauptfunktion des Adventures
# --------------------------------------------------------------------

# Liste der Gegenstände, die man mitnehmen kann
objects = []

intro()
room = "room1"  # Wir starten im Raum 1
stop = 0
while (not stop):
    if room == "room1":
        next_room = room1()
    if room == "room2":
        next_room = room2()
    if room == "room3":
        next_room = room3()
    if room == "room4":
        next_room = room4()
    if room == "room5" or room == "game_over":
        stop = 1
    room = next_room

# --------------------------------------------------------------------
