# (c) Hochschule Anhalt, veröffentlicht unter MIT-Lizenz
# Level2
# Autor: Viktor Lysow, Johannes Tümler, Wending Huang
# Letzte Änderung: 19.04.2023
# Zweck: Organisation und Steuerung des zweiten Levels
 
 
# Der Nachfolgende Codeblock "BLOCK1" sorgt dafür, dass man aus jeder Datei heraus das Hauptprogramm starten kann.
# Dadurch kann man in jeder Datei auf "play" drücken und es wird automatisch main.py gestartet.
if __name__=="__main__":
    import subprocess
    # Auf Linux oder Mac aktivieren Sie die folgende Zeile und deaktivieren Sie die Zeile danach:
    #subprocess.call("python3 main.py", shell=True)  # die richtige Main-Datei aufrufen (unser eigentliches Hauptprogramm)
    subprocess.call("main.py", shell=True)  # die richtige Main-Datei aufrufen (unser eigentliches Hauptprogramm)
    exit(0) # nun das Programm hier beenden .. wir wollen ja nur das Hauptprogramm starten und nicht *diese* Datei.
# Ende "BLOCK1"

from KlasseLevelmanagement import LevelManagement
import pygame
import sounds
from screen import screen
from hindernisse import feld
from hindernisse import drawLevel2
from time import time
from KlassePrinzessin import Prinzessin
from KlasseHarpyie import Harpyie
from KlasseMonster import Monster
import DatenSammeln as ds                                                          # Für den Matlab Beleg

zeitStart = True
zeit = 0

hintergrundLevel = pygame.image.load("Bilder/Karte/Level2.png")
tor = pygame.Rect(3*feld,0,48,48)                                      #Ziel in Level 2
LevelManagement.Level = 2
prinzessin = Prinzessin(x = feld*10, y = feld*3, geschw = 7, breite = feld, hoehe = feld, level = LevelManagement.Level, bildFigur = "Prinzessin", zeitMonster= time())


# display text
pygame.font.init() # you have to call this at the start, if you want to use this module.
myfont = pygame.font.SysFont('Comic Sans MS', 30)
gewonnen = False


def Level2(spieler):
    global zeitStart, zeit, gewonnen

    def resetLvl2():
        global gewonnen, zeitStart
        ds.daten_csv(9,len(Monster.monsterListe)) #Level2 Moster Anzahl (für Matlab)
        Monster.anzahlGeister = 0
        Monster.monsterListe = []
        Monster.zeitDupl = 0            
        prinzessin.reset()                                                        #Es wird Alles für die Prinzessin zurück gesetzt
        gewonnen = False
        zeitStart = True
    
    screen.blit(hintergrundLevel, (0, 0))
    if len(Monster.monsterListe) == 0: # falls bereits alle Monster getötet wurden, erstellen wir ein neues Monster für den Neustart des Levels
        monster1 = Harpyie(x = feld*4, y = feld*3, geschw = 4, breite = feld, hoehe = feld, level = LevelManagement.Level, bildFigur ="Harpyie", zeitMonster = time())
        Monster.monsterListe.append(monster1)
    

    if LevelManagement.debug:        
        pygame.draw.rect(screen, (0,255,0), (spieler.x,spieler.y,spieler.breite,spieler.hoehe),0)  # Zeile aktivieren, falls man die Kollisionsboxen der Monster sichtbar machen möchte
        pygame.draw.rect(screen, (255,255,0), (3*feld,0,48,48),0) 
        pygame.draw.rect(screen, (255,0,255), (prinzessin.x, prinzessin.y, prinzessin.breite, prinzessin.hoehe), 0)

    # Tor anzeigen

    if LevelManagement.numFrames >= LevelManagement.fpsTarget:
        LevelManagement.fpsCurrent = LevelManagement.timeNeeded / LevelManagement.numFrames
        LevelManagement.numFrames = 0
        LevelManagement.timeNeeded = 0
    textsurface = myfont.render("%i fps" % (1000/LevelManagement.fpsCurrent), False, (255, 255, 0))
    screen.blit(textsurface,(10,0))	

    #drawLevel2()

    if zeitStart:                                                                 #Zeit wird ab den ersten aufruf gemäßen (für Matlab)
        zeitStart = False
        LevelManagement.Level = 2
        zeit = time()

    prinzessin.mlaufen(spieler)    
    lebendeMonster = 0
    if not gewonnen: # wenn noch nicht gewonnen: aktuelle Anzahl Monster zählen
        for dupli in Monster.monsterListe:
            if dupli.leben:
                lebendeMonster += 1                
        if lebendeMonster == 0:
            gewonnen = True
            sounds.soundGewonnen()
    for dupli in Monster.monsterListe:                                                            #Alle erschaffenen Monster in Bewegung bringen            
        if LevelManagement.debug:        
            pygame.draw.rect(screen, (255,0,0), (dupli.x,dupli.y,dupli.breite,dupli.hoehe),0)
            pygame.draw.circle(surface = screen, color = (255,0,0), center = (dupli.x,dupli.y), radius = Monster.angriffsradius, width = 2)
        if dupli.mlaufen(spieler) or not prinzessin.leben:          #mit mlaufen läuft der Boss und es wird überprüft ob der Held getötet wurde
            pygame.display.update()                                                   #mit mlaufen läuft die Prinzessin und es wird überprüft ob die Prinzessin getötet wurde
            pygame.time.wait(1000)
            #Monster.reset()                                               #Es wird Alles für den Geist zurück gesetzt
                        # ich muss kein monster.reset machen, weil ich einfach alle Monster lösche. Damit müssen sie sowieso neu erstellt werden

            LevelManagement.Level = 3
            #ds.daten_csv(9, round(time() - zeit))                                     #Zeit für Level3 (für Matlab)
            ds.daten_csv(11, 2)

            resetLvl2()
            return LevelManagement.Level
        
    if spieler.obenKollision.colliderect(tor):                                    #Held muss mit dem Kopf den Eingang berühren
        LevelManagement.Level = 4
        ds.daten_csv(11, 3)                         #Nehmen das letzte Level des Spiels auf
        for monster in Monster.monsterListe: #Kein Monster mehr da? Wir haben gewonnen.
            if monster.leben:  
                LevelManagement.Level = 3
                ds.daten_csv(11, 2)                         #Nehmen das letzte Level des Spiels auf
                break
          
        sounds.soundTor()
        pygame.time.wait(500)
        
        #Monster.reset()                                               #Es wird Alles für den Geist zurück gesetzt
                    # man muss kein monster.reset machen, weil  einfach alle Monster gelöscht werden. Damit müssen sie sowieso neu erstellt werden
       
        resetLvl2()
        return LevelManagement.Level
    else:                                                                         #Das Level läuft weiter
        spieler.steuerung()        
        return LevelManagement.Level