% Spieldaten einlesen
function l06_lese_spiel( FileName, PathName )
    % Versuch, die Datei zu FileName zu öffnen
    fid = fopen( FileName, 'r' );
    if( fid == -1 )
       beep;
       errordlg( ['Datei ', FileName, ' kann nicht geöffnet werden!'] );
       return;
    end
    
    % Erste Zeile der Datei einlesen und checken
    tline = fgetl(fid);
    if( l06_check_zeile1( tline ) == 1 ) 
      beep;
      errordlg( [FileName, ' ist keine gültige Labyrinth-Datei!'] );   
      fclose( fid );
      return;
    end
    
    % alle Zeilen der Datei nacheinander lesen (Totschleife)
    while( 1 )
        tline = fgetl(fid);
        % Check, ob Datei-Ende erreicht ist
        if ~ischar(tline)
            break;
        end
        
        % Analyse der gerade eingelesenen Zeile
        if( l06_next_line(tline) == 1 )
          beep;
          errordlg( [FileName, ' ist keine gültige Labyrinth-Datei!'] );   
          fclose( fid );
          return;
        end  
    end
    
    fclose( fid );
    
    % Flag, dass jetzt die Daten vorhanden sind
    global l06_data;
    l06_data.geladen = 1;
    
    % Spielfeld zeichnen
    l06_draw;
return;
%--- Ende der Funktion l06_lese_spiel ---

% Unterfunktion: l06_check_zeile1
function r = l06_check_zeile1( tline )
    % Check 1. Zeile
    % in 1. Zeile muss der Kenner 'l06' stehen
    if( strcmp( tline, 'l06' ) == 1 )
        r = 0;
    else
        r = 1;  % falscher Kenner, Rückgabewert 1
    end

return;
%--- Ende der Funktion l06_check_zeile1 ---

% Unterfunktion: l06_next_line 
%   zur Analyse der eingelesenen Zeile tline
function r = l06_next_line( tline )
    global l06_data;  
    r = 0;   % Rückgabewert vorbelegen
        
    % 1. Zeichen der Zeile in cl speichern
    c1 = tline(1);
    % Auswahl nach Art des 1. Zeichens der Zeile
    switch( c1 )
        % Kommentar- und Leerzeilen überspringen
        case '%'
            return;  
        case ' '
            return;
         
        % Zeilenzahl bestimmen: Kenner 'z'   
        case 'z'
            % Daten der Zeile in Vektor ln schreiben
            ln = sscanf( tline, '%c %lg' );
            % 2. Eintrag ln(2) enthält die Zeilenzahl
            l06_data.zeilen  = ln(2);
        
        % Spaltenzahl bestimmen, analog für Kenner 's'
        case 's'
            ln = sscanf( tline, '%c %lg' );
            l06_data.spalten  = ln(2);

            % jetzt die Datenfeld-Arrays initialisieren
            if( l06_data.zeilen > 0 ) 
              l06_data_init;
            end
            
        % Startposition bestimmen: Kenner 'p'  
        case 'p'
            ln = sscanf( tline, '%c %lg %lg' );
            % 2. Eintrag ln(2) enthält die Startzeile
            l06_data.p(1) = ln(2);
            % 3. Eintrag ln(3) enthält die Startspalte
            l06_data.p(2) = ln(3);
           
        % Endposition (Ziel) bestimmen, analog für Kenner 'e'  
        case 'e'
            ln = sscanf( tline, '%c %lg %lg' );
            l06_data.ziel(1) = ln(2);
            l06_data.ziel(2) = ln(3);
           
         % Labyrinth-Zeile mit den Steinen einlesen 
         case 'n'
            % Checks auf Konsistenz 
            if( l06_data.zeilen == 0 ) 
               beep;
               errordlg( 'Keine Zeilenzahl definiert!');
               r = 1;  % Fehler, deshalb r = 1 und raus
               return;
            end
            if( l06_data.spalten == 0 ) 
               beep;
               errordlg( 'Keine Spaltenzahl definiert!');
               r = 1;  % Fehler, deshalb r = 1 und raus
               return;
            end
             
            % Zeile einlesen, Steine stehen ab ln(3)
            ln = sscanf( tline, '%c %lg %s' );
            % 2. Eintrag enthält Nummer der Spielzeile
            akt_zeile = ln(2);
               
            % nacheinander den String mit den Steinen analysieren
            for( n= 1:l06_data.spalten ) 
               % Feldtyp stein: 1=frei, 0=Stein gesetzt
               stein = str2double( char(ln(n+2)) );
               % in Spalte n eintragen, ob Stein gesetzt ist
               l06_data.feld( akt_zeile, n ) = stein;
            end        
          
        otherwise
            errordlg( ['Ungültiger Kenner ',c1] );
            r = 1;  % Fehler, deshalb r = 1 und raus
            return;
    end
return