Quelltext von Spacegunner

See Level Load

		/*
    AS3 Programm "Gunship"
        Gunship.as (als Dokumentklasse)
        Ship.as
        Obstacle.as    
        Projektil.as
        Background.as

    Copyright (C) 2010  Gerhard Porpaczy

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

package {
    import flash.display.MovieClip;
    import flash.utils.ByteArray;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.KeyboardEvent;    
    import flash.ui.Mouse;
    import flash.net.*;
    import flash.media.Sound;
    import flash.media.SoundChannel;        
    import com.geri3d.objects.*;
    import com.geri3d.menus.*;
    
    public class Gunship extends MovieClip {
        private var soundOn:Boolean=true;
        // Objekte
        private var loader:URLLoader;
        private var loader2:URLLoader;
        //private var myBackground:Background=new Background();
        private var myBackground:deepspace=new deepspace();
        private var myRandstreifen:sideborder=new sideborder();
        private var myShip:spaceship=new spaceship();
        private var drum:LaserSound = new LaserSound();
        private var backSound:SoundChannel = new SoundChannel();
        
        private var levelInfo:Array=new Array();
        private var repeatLevelInfo:Array=new Array();
        private var levelCache:Array=new Array();
        private var infoText:tx;
        private var scoreText:tx;
        private var livesText:tx;
        private var waitTimer:Timer = new Timer(10);
        
        // Einstellungen
        private var showFps:Boolean=false;
        private var levelSpeed:uint=0;
        private var currentSpeed:uint=0;
        private var gameHardness:uint=1;
        private var gamePause:Boolean=false;
        private var gameSpeed:uint=2;
        
        // Werte
        private var playerScore:Number=0;
        private var playerName:String='Spieler 1';
        private var bonusLevel:Boolean;
        private var bonusItem:int=0;
        private var inputString:String='';
        private var levelEnemyHits:uint=0;
        private var levelEnemyTotal:uint=0;
        private var levelSelect:String='';
        private var levelLoad:String='';
        private var playerLives:int=-1;
        private var playerDieEv:String='start';
        
        // Bei Release für Web gegebenenfalls umstellen!
        private var splitVar:String="\r\n";
        //private var splitVar:String="\n";
        
        // Zähler
        private var laserCount:uint;
        private var fireCount:uint;
        private var frameCount:uint;
        private var missleCount:uint;
        private var enemyFireCount:uint;
        private var levelCount:int=0;
        private var cacheCount:int=0;
        private var sectionCount:int=0;
        private var bonusCount:int=-1;
        private var waitCount:int=0;
        
        // LevelScripting
        private var repeatLevel:uint=0;
        private var repeatCount:int=0;
        private var repeatOrder:uint=0;
        
        public function Gunship() {
        // Konstruktor der Gunship Klasse, diese Anweisungen werden
        // einmalig beim Abspielen der zugehörigen swf-Datei ausgeführt

            var req:URLRequest;
            
            var myTimer:Timer = new Timer(1000);
            removeChildAt(0); // Der Text Games by .. von der Bühne entfernen
            // Vorbereiten der Textelemente
            infoText=neuesLabel('fix','loading...','',0,10,0,0x00FFFF,0x0066FF,false,true,0);
            scoreText=neuesLabel('fix','Score:','',1,620,0,0x00FFFF,0x0066FF,false,true,0);
            livesText=neuesLabel('fix','Lives:','',0,400,0,0x00FFFF,0x0066FF,false,true,0);
            // Hinzufügen der Objekte auf der Bühne
            addChild(myBackground);
            addChild(myRandstreifen);
            addChild(myShip);
            addChild(infoText);                        
            addChild(scoreText);                                    
            addChild(livesText);    
            // Dynamisches hinzufügen der "virtuellen" Schaltflächen
            //addChild(neuesLabel('btnOption','Optionen','options',2,250,550,0x00FFFF,0x0066FF,true,true,0));
            //addChild(neuesLabel('btnOption','Ready','ready',2,300,550,0x00FFFF,0x0066FF,true,true,0));
            
            // wichtig damit 1. Eintrag nicht den Index 0 hat
            levelCache.push('0 Empty');
            
            // Leveldaten laden muss noch vor der Ereignissbehandlung statt finden
            levelSelect='loader';
            
            //loadLevel(levelSelect);
            
            req = new URLRequest("levels/loader.txt");
            loader = new URLLoader();
            loader.load(req);
            
            // hier werden Ereignissbehandlungs Routinen angemeldet
            stage.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheelHandler);
            stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
            stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown);
            loader.addEventListener(Event.COMPLETE, loaderCompleteHandler);            
            stage.addEventListener(Event.ENTER_FRAME, frameHandler);
            myTimer.addEventListener("timer", timerHandler);
            waitTimer.addEventListener("timer", waitHandler);            
            
            // Einstellungen vor dem Start
            myShip.gotoAndStop(2);
            myShip.explode=true;            
            myTimer.start();
            //waitTimer.start();
            //stage.frameRate=180;
            stage.frameRate=90;
            //stage.frameRate=65;
        }

        private function mouseWheelHandler(event:MouseEvent):void {
            var obj:Object;
            var i:uint;
            var n:uint;
            var m:uint;
            var b:Boolean=true;
            for (i=0;i<numChildren;i++){
                if (getChildAt(i) is tx){
                    obj=getChildAt(i);
                    if (obj.effect==3){
                        m++;
                    }
                }
            }
            for (i=0;i<numChildren;i++){
                if (getChildAt(i) is tx){
                    obj=getChildAt(i);
                    if (obj.effect==3){
                        n++;
                        if (n==m){// beim letzten Mal
                            if (obj.y<480&&event.delta<0) b=false;
                        }
                    }
                }
            }
            n=0;            
            for (i=0;i<numChildren;i++){
                if (getChildAt(i) is tx){
                    obj=getChildAt(i);
                    if (obj.effect==3){
                        n++;
                        if (n==1){// beim 1. Mal
                            if (obj.y>120&&event.delta>0) b=false;
                        }
                        if (b) obj.y+=event.delta*10;
                        if ((obj.y<150||obj.y>450)){
                            obj.visible=false;
                        }else{
                            obj.visible=true;
                        }                        
                    }
                }
            }
        }
        
        public function waitHandler(event:TimerEvent):void {
        // Diese Funktion wird alle 10 ms aufgerufen, nachdem eine Wait-Anweisung verarbeitet wurde
            if (waitCount){
                waitCount--;
                levelCount=0;
            } else {
                waitTimer.stop();
                levelCount=levelSpeed;
            }
        }
        
        private function frameHandler(event:Event):void{
        // Diese Funktion wird für jedes Frame aufgerufen
            updateStage(); // Die Hauptroutine auslösen
        }        

        public function timerHandler(event:TimerEvent):void {
        // Diese Funktion wird jede sekunde aufgerufen
            //if (showFps) infoText.Inhalt=String(frameCount) + 'fps'; // Anzeige der Framerate
            if (showFps) scoreText.Inhalt=String(frameCount) + ' fps Score: ' + String(playerScore)
            //infoText.Inhalt=String(levelEnemyHits) + ' von ' + String(levelEnemyTotal);
            frameCount=0; // Zähler zurücksetzen
        }
        
        private function loaderCompleteHandler(event:Event):void{
        // Diese Funktion wird nach dem Laden der Leveldaten aufgerufen
            //infoText.Inhalt='geben Sie ihren Namen ein...';
            levelInfo = loader.data.split(splitVar);
            //levelInfo = loader.data.split("\r\n");
            // Für eine Online Version diese Split Zeile verwenden
            //levelInfo = loader.data.split("\n");
            
            levelSpeed=1;
            levelCount=levelSpeed;
            loader.removeEventListener(Event.COMPLETE, loaderCompleteHandler);
            // trace('Loader Complete');
        }

        private function reportKeyDown(event:KeyboardEvent):void{
        // Diese Funktion wird ausgelöst, wenn eine Taste gedrückt ist
        // damit kann der Benutzer seinen Namen eingeben oder Cheats...
            switch (event.charCode){
            case 0:
                break;
            case 8: // Backspace
                inputString=inputString.substr(0,inputString.length-1); // letzten Buchstaben löschen
                break;
            case 13:
                parseLine(inputString,false); // Die Eingabe wird direkt der Befehlsverarbeitung zugeführt
                inputString='';
                break
            case 27: // ESC-Taste
                inputString='';
                break
            case 41: // Korrektur =
                inputString+='=';
                break;
            case 44: // Korrektur ,
                inputString+=',';
                break;
            case 60: // Korrektur ;
                inputString+=';';
                break;                
            default:
                //infoText.Inhalt=String(event.charCode);
                inputString+=String.fromCharCode(event.charCode); // Die Erfassung der Eingabe
                break;
            }
            infoText.Inhalt=inputString; // Text ausgeben
        }
        
        private function updateStage():void{
        // Diese Funktion ist der Dreh und Angelpunkt des ganzen Programms
        // hier werden alle Elemente auf dem Bildschirm auf den neuesten Stand gebracht
        // Parameter: Keine, ohne Rückgabewert
        // Auslöser: EnterFrameEvent oder TimerEvent
            var i:uint;
            var n:uint;
            var obj:Object;
            var sObj:Object;
            
            frameCount++; // Frame Zähler um 1 erhöhen
            // Status der einzelnen Elemente überprüfen und Updates durchführen (Pos. usw.)
            for (i=0;i<numChildren;i++){ // für jedes Element auf der Bühne
                obj=getChildAt(i); // auf eine Objekt-Variable legen
                // Falls das Objekt über eine updateChild-Methode verfügt und gerade nicht Pause ist, updaten
                if (obj.hasOwnProperty('updateChild')&&!gamePause){
                    obj.updateChild();
                } else {
                    trace (obj.name);
                }
                
                if (myShip.dead){
                    // Schaltflächen Ready und Optionen anzeigen
                    playerLives--;
                    if (playerLives<0){
                        //highScore();
                        parseLine(playerDieEv,true);
                        myShip.dead=false;
                    } else {
                        livesText.Inhalt=String(playerLives);
                        myShip.visible=true;
                        myShip.dead=false;
                        Mouse.hide()
                        //parseString('GotoSection=$SectionCount');
                    }
                }

                if (obj is tx){ // Falls Objekt von der Klasse "Texte" instanziert wurde
                    if (obj.dirty){
                        //trace("cLabel.text>" + obj.Inhalt + '<\n>' + obj.cmd + '<');
                        //Wenn sich Textfeld Inhalt geändert hat
                        switch (obj.cmd.toLocaleLowerCase()){
                            case 'playername':
                                playerName=obj.Inhalt;
                                break;
                            default:
                                //existierende Variable wird gespeichert
                                setCacheVar(obj.cmd,obj.Inhalt);
                            break;
                        }
                        
                        obj.dirty=false;
                        //Das verhindert Codeeingabe bei Textfeldern
                        //inputString='';
                    }
                    if (obj.y<150&&obj.effect==1){ // Falls Objekt gewisse Höhe erreicht hat
                        removeChildAt(i); // Objekt von der Bühne entfernen (vernichten)
                        i--; // Index-Zähler Korrektur (sonnst würde nächstes Element übergangen)
                    }
                    if (obj.effect==3){
                        if ((obj.y<150||obj.y>450)){
                            obj.visible=false;
                        }else{
                            obj.visible=true;
                        }
                    }
                }
                if (obj is endboss){ // Falls Element ein Endboss ist
                    if (obj.cmd.length){ // Wenn das Objekt einen Befehl ausführen will
                        parseLine(obj.cmd,true); // Soll der Gegner ein Objekt erzeugen z.B. verlorenes Triebwerk
                        //parseString(obj.cmd);
                        obj.cmd=''; // Befehlsübergabe zurückstellen
                    }
                    if (obj.canHit){
                    //if (!obj.explode && obj.hitTestObject(myShip)){ // Falls Gegner nicht beim explodieren ist, Kollisionsabfrage Gegner/Schiff
                        if (obj.hitTestObject(myShip)){
                            if (playerLives<0) playerLives=3; // Wenn vorher noch nicht tot war
                            myShip.explode=true; // Schiff explodieren lassen
                            bonusCount=-1; // Bonuspunkte zurückstellen
                            Mouse.show(); // Maus wieder sichtbar machen                        
                        }
                    }
                    if (obj.currentFrame==40 || obj.y>600 || obj.x<0 || obj.x>800){ // Falls Gegner fertig explodiert ist oder aus dem Bild geflogen ist
                        if (obj.currentFrame==40){ // Falls Gegner abgeschossen wurde
                            levelEnemyHits++; // Anzahl abgeschossener Gegner um 1 erhöhen
                            //scoreText.Inhalt='Score: ' + String(++playerScore);
                            //scoreText.Inhalt='Score: ' + String(playerScore);
                        }
                        removeChildAt(i); // das Element jetzt entfernen
                        i--; // Index-Zähler Korrektur
                    }else{
                        if (obj.currentFrame>1){
                            obj.ship_X=myShip.x; // den Gegner über X-Position des Schiffes informieren
                            obj.ship_Y=myShip.y; // den Gegner über Y-Position des Schiffes informieren
                            // mehrere Enemies erhöhen öfter den Zähler, keine schiessen nie
                            if (enemyFireCount++>500){ // Falls Warte-Zähler den Wert erreicht hat
                                firePlasmaBall(obj.x,obj.y); // Gegnerisches Feuer eröffnen
                                firePlasmaBall(obj.x+5,obj.y+5);
                                firePlasmaBall(obj.x-5,obj.y-5);
                                enemyFireCount=0; // Zähler zurückstellen
                            }
                        }
                    }
                }
                
                if (obj is obstacle){ // Falls Element ein Gegner ist
                    if (obj.cmd.length){ // Wenn das Objekt einen Befehl ausführen will
                        parseLine(obj.cmd,true); // Soll der Gegner ein Objekt erzeugen z.B. verlorenes Triebwerk
                        //parseString(obj.cmd);
                        obj.cmd=''; // Befehlsübergabe zurückstellen
                    }
                    if (obj.explode && obj.bonusPunkte){ // Falls es Bonuspunkte hat und gerade explodiert
                        // es müssen alle Gegner die Bonuspunkte haben abgeschossen werden
                        obj.bonusPunkte=false; // Den Bonus für diesen Gegner entfernen
                        bonusCount--; // den Bonus-Zähler um 1 erniedrigen
                        if (bonusCount==0){ // Falls Bonus-Zähler 0 erreicht hat
                            populateBonus(obj.x,obj.y,bonusItem); // den Bonus auswerfen
                            bonusItem=0; // zurückstellen BonusItem 0 = Random
                        }
                    }
                    
                    if (obj.canHit){
                    //if (!obj.explode && obj.hitTestObject(myShip)){ // Falls Gegner nicht beim explodieren ist, Kollisionsabfrage Gegner/Schiff
                        if (obj.hitTestObject(myShip)){
                            if (!myShip.shield){
                                n=myShip.currentFrame;
                                
                                if (n>1 && n<15){
                                    // Doppelschiff
                                    n--;
                                    if (n<1) n=1;
                                    myShip.gotoAndStop(n);
                                    myShip.fireMulti=n;
                                    myShip.fireProjektil/=2;
                                    myShip.laserRate*=2;
                                    myShip.missleRate*=2;
                                    myShip.fireRate*=2;
                                    myShip.fireProjektil=int(myShip.fireProjektil);
                                    myShip.fireDamage/=2;                                    
                                    obj.verhalten=0;
                                    obj.gotoAndPlay('explode');
                                    obj.explode=true; // Gegner explodieren lassen
                                    obj.canHit=false;                                    
                                } else {
                                    //levelSpeed=0; // Scriptabarbeitung anhalten
                                    if (!myShip.explode){ // Falls eigenes Schiff noch nicht beim explodieren ist
                                        obj.verhalten=0;
                                        obj.gotoAndPlay('explode');
                                        obj.explode=true; // Gegner explodieren lassen
                                        obj.canHit=false;
                                    }
                                    
                                    myShip.explode=true; // Schiff explodieren lassen
                                    bonusCount=-1; // Bonuspunkte zurückstellen
                                    
                                    Mouse.show(); // Maus wieder sichtbar machen
                                    
                                    trace('playerLives=' + playerLives)
                                    if (playerLives<0) playerLives=3; // Wenn vorher noch nicht tot war
                                }
                            }else{
                                // Shielde halten
                                obj.verhalten=0;
                                obj.gotoAndPlay('explode');
                                obj.explode=true; // Gegner explodieren lassen
                                obj.canHit=false;
                                myShip.shield=false;
                            }
                        }
                    }
                    
                    if (obj.currentFrame==100 || obj.y>600 || obj.x<0 || obj.x>800){ // Falls Gegner fertig explodiert ist oder aus dem Bild geflogen ist
                        if (obj.currentFrame==100){ // Falls Gegner abgeschossen wurde
                            levelEnemyHits++; // Anzahl abgeschossener Gegner um 1 erhöhen
                            //scoreText.Inhalt='Score: ' + String(++playerScore);
                        }
                        if (obj.bonusPunkte && bonusCount > 0){
                            // Falls ein Schiff mit Bonuspunkten aus dem Bildschirm geflogen ist
                            bonusCount=-1; // Bonus-Zähler zurückstellen (keine weitere Bonus nach unten Zählung)
                            infoText.Inhalt='Kein Bonus!';
                        }
                        removeChildAt(i); // das Element jetzt entfernen
                        i--; // Index-Zähler Korrektur
                    }else{
                        if (obj.currentFrame>1){
                            obj.ship_X=myShip.x; // den Gegner über X-Position des Schiffes informieren
                            obj.ship_Y=myShip.y; // den Gegner über Y-Position des Schiffes informieren
                            // mehrere Enemies erhöhen öfter den Zähler, keine schiessen nie
                            if (enemyFireCount++>500){ // Falls Warte-Zähler den Wert erreicht hat
                                firePlasmaBall(obj.x,obj.y); // Gegnerisches Feuer eröffnen
                                enemyFireCount=0; // Zähler zurückstellen
                            }
                        }
                    }
                }
                if (obj is sideborder){
                    if (obj.square.hitTestPoint(myShip.x,myShip.y,true)){
                        //trace ('Kollision: obj:' + obj);
                        
                        if (playerLives<0) playerLives=3; // Wenn vorher noch nicht tot war
                        if (myShip.visible){
                            myShip.explode=true; // Schiff explodieren lassen
                            bonusCount=-1; // Bonuspunkte zurückstellen
                            Mouse.show(); // Maus wieder sichtbar machen
                        }
                    }
                    if (obj.cmdExec){
                        n=repeatLevel;
                        repeatLevel=0;
                        parseLine(obj.cmd,true);
                        obj.cmdExec=false;
                        repeatLevel=n;
                    }
                }
                if (obj is bonusitem){
                    if (obj.hitTestObject(myShip) && myShip.visible){
                        playerScore+=25;
                        scoreText.Inhalt='Score: ' + String(playerScore);
                        if (soundOn){
                            var channel:SoundChannel = drum.play();
                        }
                        obj.y=800;
                        switch (obj.currentFrame){
                        case 1:
                            if (myShip.fireProjektil==1){
                                infoText.Inhalt='Heavy Gun';
                                myShip.fireProjektil++;
                                myShip.fireDamage+=0.5;
                                myShip.fireRate+=6;                            
                            } else if (myShip.fireProjektil==2) {
                                infoText.Inhalt='Double Fire';
                                myShip.fireProjektil++;
                                //myShip.fireRate-=3;    
                            } else {
                                if (myShip.fireProjektil<20) myShip.fireProjektil++;
                                myShip.fireDamage+=0.2;
                                infoText.Inhalt='Weapon upgrade=' + String(myShip.fireDamage);                                
//                                if (myShip.fireRate>3){
//                                    myShip.fireRate--;
//                                }
                            }
                            break;
                        case 2:
                            if (myShip.missleRate==0){
                                infoText.Inhalt='Missles';
                                myShip.missleRate=160;
                            } else {
                                if (myShip.missleRate>60){
                                    infoText.Inhalt='More Missles';
                                    myShip.missleRate-=20;
                                } else {
                                    myShip.missleDamage+=0.2;
                                    infoText.Inhalt='Missle upgrade=' + String(myShip.missleDamage);
                                }
                            }
                            break;
                        case 3:
                            myShip.fireDamage+=0.5;
                            if (myShip.fireRate>3){
                                myShip.fireRate--;
                            }
                            n=myShip.Speed;
                            if (n>1){
                                infoText.Inhalt='Speed up';
                                n--;
                                myShip.Speed=n;
                            }
                            break;
                        case 4:
                            // Shild Bonusitem
                            infoText.Inhalt='Shield';
                            myShip.shield=true;
                            break;
                        
                        case 5:
                            // Doublefire Bonusitem
                                                        
                            if (myShip.fireMulti<3){
                                //trace('FireMulti=' + myShip.fireMulti);
                                myShip.fireMulti++;
                                infoText.Inhalt='Doublefire=' + myShip.fireMulti;
                            } else {
                                if (myShip.missleMulti<6){
                                    myShip.missleMulti++;
                                    infoText.Inhalt='Misslefire=' + myShip.missleMulti;
                                    //trace('MissleMulti=' + myShip.missleMulti);
                                } else {
                                    infoText.Inhalt='Verdopplung vollständig';
                                }
                            }
                            break;
                        case 6:
                            // Explode Bonusitem
                            trace('Explode');
                            ExplodeAll();
                            break;
                        case 7:
                            myShip.laserRate-=5;
                            if (myShip.laserRate<5) myShip.laserRate=5;
                            infoText.Inhalt='LaserRate=' + myShip.laserRate;
                            break;
                        case 8:
                            obj.y=myShip.y;
                            //trace('-Bonus Y=' + obj.y);
                            obj.gotoAndPlay(20);
                            if (!myShip.shield){
                                n=myShip.currentFrame;
                                if (n>1) {
                                    n--;
                                    infoText.Inhalt='Frachtraum ' + String(n) + ' wurde in die Luft gesprengt';
                                    if (n<1) n=1;
                                    myShip.gotoAndStop(n);
                                    myShip.fireMulti=n;
                                } else {
                                    if (myShip.fireProjektil>1){
                                        myShip.fireProjektil/=2;
                                        myShip.laserRate*=2;
                                        myShip.missleRate*=2;
                                        myShip.fireRate*=2;
                                        myShip.fireProjektil=int(myShip.fireProjektil);
                                        myShip.fireDamage/=2;
                                        infoText.Inhalt='Feuerkraft wurde halbiert ' + myShip.fireDamage;
                                    } else {
                                        infoText.Inhalt='Frachtraum wurde in die Luft gesprengt';
                                        myShip.explode=true;
                                    }
                                }
                            } else {
                                infoText.Inhalt='Der Schutzschild wurde beschädigt!';
                                myShip.shield=false;                            
                            }
                            break;
                        case 9:
                            infoText.Inhalt='Dubbleship';
                            n=myShip.currentFrame;
                            if (n<4) {
                                n++;
                                myShip.gotoAndStop(n);
                                myShip.fireMulti=n;
                            } else {
                                infoText.Inhalt='Verdopplung vollständig';
                            }
                            
                            break;
                        case 10:
                            playerLives++;
                            infoText.Inhalt='Freileben';
                            livesText.Inhalt=String(playerLives);
                            break;
                        default:
                            obj.y=myShip.y+20;
                            obj.x=myShip.x;
                            break;
                        }
                    }
                    if (obj.y>600||obj.y<-500||obj.x>750||obj.x<0||obj.currentFrame==30){
                        removeChildAt(i);
                        i--;
                    }
                }                
                if (obj is plasmaball){
                    if (obj.hitTestObject(myShip) && myShip.visible){
                        //levelSpeed=0;
                        obj.x=-10; // Den Plasmaball verschwinden lassen
//                        obj.vY=0;
//                        obj.vX=0;
//                        infoText.Inhalt='x=' + obj.x + 'Y=' + obj.y;
                        if (!myShip.shield){
                            n=myShip.currentFrame;
                            if (n>1 && n<15){
                                // Doppelschiff
                                n--;
                                myShip.gotoAndStop(n);
                                myShip.fireMulti=n;
                                myShip.fireProjektil/=2;
                                myShip.laserRate*=2;
                                myShip.missleRate*=2;
                                myShip.fireRate*=2;
                                myShip.fireProjektil=int(myShip.fireProjektil);
                                myShip.fireDamage/=2;                                
                                infoText.Inhalt='Doppeltes Schiff wurde getroffen!';
                            } else {
                                if (myShip.fireMulti>1){
                                    myShip.laserRate=30;
                                    myShip.fireMulti=1;
                                    myShip.missleMulti=1;
                                    infoText.Inhalt='Das Nachladesystem wurde getroffen!';
                                } else {
                                    if (myShip.fireProjektil>1){
                                        if (myShip.missleRate){
                                            myShip.missleRate=0;
                                            infoText.Inhalt='Raketensilo wurde beschädigt!';
                                        } else {
                                            myShip.fireProjektil--;
                                            //myShip.fireRate+=5;
                                            //myShip.fireRate+=2;
                                            if (myShip.fireDamage > 5){
                                                myShip.fireDamage--;
                                                myShip.fireRate--;
                                            } else {
                                                myShip.fireDamage-=0.5;
                                            }
                                            if (myShip.fireDamage<1) {
                                                myShip.fireDamage=1;
                                                infoText.Inhalt='Die Lebenserhaltungssysteme fallen aus!';
                                            } else {
                                                infoText.Inhalt='Ein Bordgeschütz ist ausgefallen! ' + myShip.fireDamage;
                                            }
                                        }
                                    } else {
                                        if (playerLives<0) playerLives=3; // Wenn vorher noch nicht tot war
            
                                        bonusCount=-1;
                                        myShip.explode=true;
                                        Mouse.show();
                                    }
                                }
                            }
                        }else{
                            infoText.Inhalt='Der Schutzschild wurde getroffen!';
                            myShip.shield=false;
                        }
                    }
                    if (obj.y>600||obj.y<0||obj.x>750||obj.x<0){
                        removeChildAt(i);
                        i--;
                    }
                }

                if (obj is laserl){
                    if (obj.x<0||obj.x>750){
                        removeChildAt(i);
                        i--;
                    }else{            
                        for (n=0;n<numChildren;n++){
                            sObj=getChildAt(n);

                            if (sObj is sideborder){
                                if (sObj.square.hitTestPoint(obj.x,obj.y,true)){
                                    //trace (obj.height);
                                    obj.x=-500;
                                    break;
                                }
                            }
                            if (sObj is endboss){                            
                                if (sObj.canHit){
                                    if (sObj.hitTestObject(getChildAt(i))){
                                        sObj.damage+=obj.damage;
                                        scoreText.Inhalt='Score: ' + String(playerScore++);
                                        obj.x=-500;
                                        //trace('Hits>' + sObj.damage);
                                        break;                                    
                                    }
                                }
                            }
                            if (getChildAt(n) is obstacle){
                                sObj=getChildAt(n);
//                                if (sObj.y>0){
//                                    if (!sObj.explode && sObj.hitTestObject(getChildAt(i))){
//                                        sObj.damage+=obj.damage;
//                                        obj.y=-500;
//                                        break;
//                                    }
//                                }
                                if (sObj.canHit){
                                    if (sObj.hitTestObject(getChildAt(i))){
                                        sObj.damage+=obj.damage;
                                        obj.x=-500;
                                        break;                                                                        
                                    }
                                }
                            }
                        }
                    }
                }                
                
                if (obj is projektil){
                    if (obj.y<-200){
                        removeChildAt(i);
                        i--;
                    }else{            
                        for (n=0;n<numChildren;n++){
                            sObj=getChildAt(n);

                            if (sObj is sideborder){
                                if (sObj.square.hitTestPoint(obj.x,obj.y,true)){
                                    //trace (obj.height);
                                    obj.y=-500;
                                    break;
                                }
                            }
                            if (sObj is endboss){                            
                                if (sObj.canHit){
                                    if (sObj.hitTestObject(getChildAt(i))){
                                        sObj.damage+=obj.damage;
                                        scoreText.Inhalt='Score: ' + String(playerScore++);
                                        obj.y=-500;
                                        //trace('Hits>' + sObj.damage);
                                        break;                                    
                                    }
                                }
                            }
                            if (getChildAt(n) is obstacle){
                                sObj=getChildAt(n);
//                                if (sObj.y>0){
//                                    if (!sObj.explode && sObj.hitTestObject(getChildAt(i))){
//                                        sObj.damage+=obj.damage;
//                                        obj.y=-500;
//                                        break;
//                                    }
//                                }
                                if (sObj.canHit){
                                    if (sObj.hitTestObject(getChildAt(i))){
                                        sObj.damage+=obj.damage;
                                        obj.y=-500;
                                        break;                                                                        
                                    }
                                }
                            }
                        }
                    }
                }
                if (obj is missle){
                    if (obj.y<0||obj.y>600||obj.x<0||obj.x>800||obj.currentFrame==15){
                        removeChildAt(i);
                        i--;
                    }else{
                        for (n=0;n<numChildren;n++){
                            if (getChildAt(n) is obstacle || getChildAt(n) is endboss ){
                                sObj=getChildAt(n);
                                if (!sObj.explode){
                                    if (!obj.targetObj||obj.targetObj.explode){
                                        obj.targetObj=sObj;
                                    }
                                    if (sObj.hitTestObject(getChildAt(i))){
                                        sObj.damage+=obj.damage;
                                        obj.y=-50;
                                        break;
                                    }
                                }
                            }
                        }                        
                    }
                }
            }
            if (!gamePause){
                if (levelSpeed){
                    if (levelCount++>levelSpeed){
                        levelCount=-1;
                        while (levelCount==-1){
                            levelCount=0;
                            if (levelInfo.length){
                                parseLine(levelInfo[0],false);
                                levelInfo.splice(0,1);
                            } else {
                                break;
                            }
                        }
                    }
                }
                if (laserCount++>myShip.laserRate){
                    if (myShip.fire && !myShip.explode && myShip.visible){
                        fireLaser(myShip.x,myShip.y,myShip.fireProjektil);
                        laserCount=0;
                    }
                    //myShip.fire=false;
                }
                if (fireCount++>myShip.fireRate){
                    if (myShip.fire && !myShip.explode && myShip.visible){
                        for (i=0;i<myShip.fireMulti;i++){
                            fireProjektil(myShip.x+int(Math.random()*20),myShip.y+i*(80/myShip.fireMulti),myShip.fireProjektil);
                        }
                        fireCount=0;
                    }
                    //myShip.fire=false;
                }
                if (myShip.missleRate && missleCount++>myShip.missleRate){
                    if (myShip.fire && !myShip.explode && myShip.visible){
                        for (i=0;i<myShip.missleMulti;i++){
                            fireMissle(myShip.x+int(Math.random()*20),myShip.y+i*(80/myShip.missleMulti));
                        }
                        missleCount=0;
                    }
                }
            }
        }
        
        private function parseBool(str:String):Boolean {
            switch (str.toLocaleLowerCase()){
                case '':
                    return false;
                    break;
                case 'false':
                    return false;
                    break;                    
                case 'true':
                    return true;
                    break;                    
                case 'on':
                    return true;
                    break;                                        
                case 'off':
                    return true;
                    break;
                default:
                    return Boolean(int(str));
                    break;
            }
            return true;
        }
        
        private function getCacheIndex(param_var:String):uint {
        // Diese Funktion sucht im Cache nach einer Variablen und gibt den Index zurück
            var s:String='';
            var i:uint;
            for (i=0;i<levelCache.length;i++){
                if (param_var==levelCache[i].substr(levelCache[i].indexOf(' ')+1)){
                    break;
                }
            }
            if (i<levelCache.length){
                i=int(levelCache[i].substr(0,levelCache[i].indexOf(' ')));
            } else {
                i=0;
            }            
            return i;
        }
        
        private function getCacheVar(param_var:String):String {
        // Diese Funktion prüft ob eine Variable definiert ist und gibt den Wert zurück
            var i:uint;
            i=getCacheIndex(param_var);
            if (i){
                return levelCache[i];
            } else {
                return '<Empty>';
            }
        }
        
        private function setCacheVar(param_var:String,param_val:String):void {
            var i:uint;

            for (i=0;i<levelCache.length;i++){
                if (param_var==levelCache[i].substr(levelCache[i].indexOf(' ')+1)){
                    break;
                }
            }
            if (i<levelCache.length){
                levelCache[int(levelCache[i].substr(0,levelCache[i].indexOf(' ')))]=param_val;
            } else {
                trace('Unbekannt: >' + param_var + '<');
            }            
        }

        private function newCacheVar(param_var:String,param_val:String):void {
            var i:uint;
            var s:String='';
            for (i=0;i<levelCache.length;i++){
                if (param_var==levelCache[i].substr(levelCache[i].indexOf(' ')+1)){
                    break;
                }
            }
            if (i<levelCache.length){
                trace('Bekannt: >' + param_var + '<');
            } else {
                s= String(levelCache.push(param_val)-1) + ' ' + param_var;
                levelCache.push(s);
            }
        }
        
        private function objPropSet(param_obj:String,param_prop:String,param_val:String):void {
        // Diese Funktion setzt eine Eigenschaft eines Objektes.
        // Parameter param_obj: Benannte Objekte z.B. Mouse, Ship usw.
        // Parameter param_prop: Name der Eigenschaft z.B. Visible
        // Parameter param_val: der einzustellende Wert
            var b:Boolean;
            b=parseBool(param_val);
            switch (param_obj.toLocaleLowerCase()){
                case 'mousepointer':
                    switch (param_prop.toLocaleLowerCase()){
                        case 'visible':
                            if (b){
                                Mouse.show();
                            } else {
                                Mouse.hide();
                            }
                            break;
                        default:
                            break;                        
                    }
                    break;
                case 'ship':
                    switch (param_prop.toLocaleLowerCase()){
                        case 'visible':
                            myShip.visible=b;
                            break;
                        default:
                            break;
                    }                
                    break;
                default:
                    break;
            }
        }
        
        private function execIf(str:String):Boolean {
        // Diese Funktion wertet einen Ausdruck aus und liefert Ja oder Nein
        // Parameter str: Die Bedingung die ausgewertet werden soll
        // z.B. execIf(a=b) oder execIf(StageClear)
            var s:String;
            var p:String;
            if (str.indexOf('>')>-1){
                s=parseVal(str.substr(0,str.indexOf('>'))); // alles vor dem =Zeichen auswerten
                p=parseVal(str.substr(str.indexOf('>')+1)); // alles nach dem =Zeichen auswerten
                trace('s,p:' + s + ',' + p);
                if ( int(s) > int(p)){ // der Vergleich ob s grösser p ist
                    trace('s>p:' + s + '>' + p);
                    return true;
                } else {
                    trace('not s>p:' + s + '<' + p);
                    return false;
                }            
            } else {
                if (str.indexOf('=')>-1){
                    s=parseVal(str.substr(0,str.indexOf('='))); // alles vor dem =Zeichen auswerten
                    p=parseVal(str.substr(str.indexOf('=')+1)); // alles nach dem =Zeichen auswerten
                } else {
                    switch (str.toLocaleLowerCase()){
                        case 'stageclear':
                            return stageClear();
                            break;
                        case 'easy':
                            if (gameHardness!=1) return false;
                            break;
                        case 'fine':
                            if (gameHardness!=2) return false;
                            break;
                        case 'hard':
                            if (gameHardness!=3) return false;
                            break;
                        case 'playerlives':
                            if (playerLives==0) return false;
                            break;
                        case 'playerdead':
                            if (playerLives==-1) return false;
                            break;
                        case 'sectioncount':
                            if (sectionCount<1) return false;
                            break;                    
                        default:
                            // Rückgabe true
                            //trace ('Unbekannt:> ' + str);
                            break;
                    }            
                }
                if (s == p){ // der Vergleich ob zwei Werte gleich sind
                    return true;
                } else {
                    return false;
                }
            }
        }
        
        private function parseVal(str:String):String {
            // Diese Funktion sucht am Anfang eines beliebigen Textes
            // den Namen einer Variablen und fügt deren Wert ein.
            // Parameter str: die auszuwertende Variable oder Funktion
            // Rückgabewert ist der Wert der Variable und ggf. den Rest der Zeile
            var i:uint;
            var s:String='';
            
            s='$'; // Escape funktion für $Zeichen in einem Text ($$)
            if (str.toLocaleLowerCase().indexOf(s)==0){
                return '#Dollar#' + str.substr(s.length);
            }            
            s='levelselect';
            if (str.toLocaleLowerCase().indexOf(s)==0){
                if (levelSelect.length){
                    return levelSelect + str.substr(s.length);                    
                } else {
                    return String(1) + str.substr(s.length);
                }
            }
            s='gamespeed';
            if (str.toLocaleLowerCase().indexOf(s)==0){
                return String(gameSpeed) + str.substr(s.length);
            }
            s='gamehardness';
            if (str.toLocaleLowerCase().indexOf(s)==0){
                return String(gameHardness) + str.substr(s.length);
            }            
            s='levelhitpercent';
            if (str.toLocaleLowerCase().indexOf(s)==0){
                //trace(levelEnemyTotal + ' _ ' + levelEnemyHits);
                return String(Math.round((100/levelEnemyTotal)*levelEnemyHits)) + str.substr(s.length);
            }
            s='repeatcount';
            if (str.toLocaleLowerCase().indexOf(s)==0){
                return String(repeatCount) + str.substr(s.length);
            }
            s='sectioncount';
            if (str.toLocaleLowerCase().indexOf(s)==0){
                return String(sectionCount) + str.substr(s.length);
            }            
            s='levelhits';
            if (str.toLocaleLowerCase().indexOf(s)==0){
                if (levelEnemyHits==0){
                    return '0' + str.substr(s.length);
                } else if (levelEnemyHits==levelEnemyTotal) {
                    return '1' + str.substr(s.length);
                } else {
                    return '2' + str.substr(s.length);
                }
            }
            s='playerscore';
            if (str.toLocaleLowerCase().indexOf(s)==0){
                return String(playerScore) + str.substr(s.length);
            }

            s='playername';
            if (str.toLocaleLowerCase().indexOf(s)==0){
                return playerName + str.substr(s.length);
            }
            
            for (i=0;i<levelCache.length;i++){
                s=levelCache[i].substr(levelCache[i].indexOf(' ')+1);
                if (levelCache[i]!=s){
                    //trace('Suche: >' + str + '< >' + s + '<');
                    if (str.toLocaleLowerCase().indexOf(s.toLocaleLowerCase())==0){
                        break;
                    }
                }
            }
            if (i<levelCache.length){
                //trace('Gefunden: >' + str + '< >' + levelCache[i] + '<');
                str=levelCache[int(levelCache[i].substr(0,levelCache[i].indexOf(' ')))] + str.substr(s.length);
            } else {
                //trace('Unbekannt: >' + str + '<');
            }
            return str;
        }
        private function parseStr(str:String,param_escape:Boolean):String {
        // Wenn ein Wert in Gänsefüsschen steht müssen Zeichen escaped werden
            var s:String='';
            var o:String='';
            var p:RegExp = /"/g;
            
            if (param_escape){
                if (str.indexOf('"')>-1){
                    s=str.substr(str.indexOf('"')+1);
                    str=str.substr(0,str.indexOf('"')) + '#Gaesef#';
                    if (s.indexOf('"')>-1){
                        o='#Gaesef#' + s.substr(s.indexOf('"')+1);
                        s=s.substr(0,s.indexOf('"'));
                        p = /\)/g;
                        s=s.replace(p,'#KlammerZu#');
                        p = /\(/g;
                        s=s.replace(p,'#KlammerAuf#');                    
                        p = /,/g;
                        s=s.replace(p,'#Beistr#');                                            
                    }
                    str+=s + o;
                    str=parseStr(str,true);
                }
            } else {
                p = /#Gaesef#/g;
                str=str.replace(p,'');                
                p = /#KlammerZu#/g;
                str=str.replace(p,')');
                p = /#KlammerAuf#/g;
                str=str.replace(p,'(');
//                p = /#40#/g;
//                str=str.replace(p,'(');                
//                p = /#41#/g;
//                str=str.replace(p,')');    
                p = /#Dollar#/g;
                str=str.replace(p,'$');                
                p = /#Beistr#/g;
                str=str.replace(p,',');                                
            }
            //str=str.replace(p,'');
            return str;
        }
        private function parseIndex(str:String):uint {
            var i:uint=0;
            
            if (str.indexOf('[')==0 && str.indexOf(']')==str.length-1){
                //trace(str);
                str=str.substr(str.indexOf('[')+1);
                str=str.substr(0,str.indexOf(']'));
                if (levelCache.length>int(str)){
                    i=int(str);
                }
            }            
            return i;
        }
        
        private function parseParamInt(str:String,param:uint):uint {
            var arr:Array=new Array();
            
            arr=str.split(',');
            //trace (arr[param]);
            return int(arr[param]);
        }
        
        private function parseExp(str:String):String {
        // Diese Funktion werten einen Ausdruck aus und liefert das Ergebniss als Rückgabewert
        // Parameter str: Der Auszuwertende Ausdruck
        // z.B. In einem Text ?Bedingung(AntwortJa,AntwortNein) oder $VariablenName...
            var s:String='';
            var p:String='';
            var e:String='';
            var n:uint=0;
            var arr:Array=new Array();
            
            if (str.indexOf('[')==0 && str.indexOf(']')==str.length-1){
                //trace(str);
                s=str.substr(str.indexOf('[')+1);
                s=s.substr(0,s.indexOf(']'));
                if (levelCache.length>int(s)){
                    return levelCache[int(s)];
                }
            }
            s='';
            //trace (parseStr(str,false));
            str=parseStr(str,false);
            // Bedingungen auswerten
            if (str.indexOf('?')>-1){ // Falls ein ?-Zeichen vorkommt
                //trace ('?>' + str);
                if (str.indexOf('(')>-1){ // und eine Klammer-Auf vorkommt
                    // Wenn vor dem ? noch eine Klammer Auf vorkommt
                    if (str.indexOf('(')<str.indexOf('?')){
                        e=str.substr(0,str.indexOf('(')+1);
                        str=str.substr(str.indexOf('(')+1);
                    }
                    p=str.substr(str.indexOf('(')+1); // Alles nach der Klammer-Auf
                    str=str.substr(0,str.indexOf('(')); // Alles vor der Klammer-Auf
                    //trace ('? p>' + p + ' str>' + str);
                    if (p.indexOf(')')>-1){ // Falls Klammer-Zu
                        if (p.length > p.indexOf(')')){ // Falls nach Klammer-Zu noch Etwas
                            s=p.substr(p.indexOf(')')+1);// Alles nach Klammer-Zu
                        }
                        p=p.substr(0,p.indexOf(')')); // Alles zwischen Klammer-Auf und -Zu
                    }
                    if (p.length){ // Falls Etwas in Klammern war
                        arr=p.split(','); // in ein Array legen z.B. (a,b,c,d)
                    }

                    p=str.substr(0,str.indexOf('?')); // Alles vor dem ?-Zeichen
                    //trace('v:' + parseVal(str.substr(str.indexOf('?')+1)) + ' p>' + p);
                    n=int(parseVal(str.substr(str.indexOf('?')+1))); // Den Wert den parseVal(Bedingung) liefert in eine Zahl umwandeln
                    if (n < arr.length){ // Falls Zahl kleiner als Anzahl der Parameter ist
                        str=arr[n]; // den mit n bezifferten Parameter zurückliefern
                    } else {
                        str=String(n); // die ermittelte Zahl als String zurückliefern
                    }
                    //trace ('? n>' + String(n) + ' str>' + str + ' e>' + e);
                    str=e+p+str+s; // Alles was vor dem ?-Zeichen war vorne anhängen und alles nach Klammer-Zu hinten
                    str=parseExp(str); // Rekursiver aufruf um alle ?Bedingingung(a,b,c) zu beseitigen
                }
            }
            // Variablen auswerten
            if (str.indexOf('$')>-1){ // Falls ein $-Zeichen vorkommt
                // Aufruf der Funktion parseVal() um das Ergebnis einzusetzen
                str=str.substr(0,str.indexOf('$'))+parseVal(str.substr(str.indexOf('$')+1));
                str=parseExp(str); // Rekursiver aufruf um alle $Variablen zu beseitigen
            }
            
            // Listenwerte
            if (str.indexOf('[')>0&&str.indexOf('[')<str.indexOf(']')){
                if (getCacheIndex(str.substr(0,str.indexOf('[')))){
                    s=str.substr(str.indexOf('[')+1);
                    s=s.substr(0,s.indexOf(']'));
                    str=getCacheVar(str.substr(0,str.indexOf('[')));
                    str=parseFun('getline ' + s,str);
                }
            }

            return str; //parseStr(str,false); // Rückgabewert enthält keine ", $Variablen und keine ?Bedingingung(a,b,c) Konstrukte jedoch einzelne Fragezeichen
        }        
        
        private function evalString(param_value:*,param_type:uint):String{
        // Diese Funktion liefert den Text eines Wertes (z.B. hard=1)
            var i:int;
            var str:String='';
            i=int(param_value);
            switch (param_type){
            case 0:
                str='';
                break;
            case 1:// GameSpeed
                switch (i){
                case 3:
                    str='Schnell';
                    break;
                case 2:
                    str='Normal';
                    break;
                case 1:
                    str='Langsam';
                    break;                    
                default:
                    str=String(param_value);
                    break;                    
                }
                break;                    
            case 2:// Hardness
                switch (i){
                case 1:
                    str='Leicht';
                    break;
                case 2:
                    str='Mittel';
                    break;
                case 3:
                    str='Schwer';
                    break;                    
                default:
                    str='Wahnsinn';
                    break;                    
                }
                break;                    
            default:
                break;
            }
            return str;
        }
        
        private function cacheEinfach(str:String):Boolean {
            var i:uint;
            var n:uint;
            for (i=0;i<levelCache.length;i++){
                if (str==levelCache[i].substr(0,levelCache[i].indexOf(' '))){
                    n++;
                    if (n>1) break;
                }
            }
            if (n>1){
                return false;
            } else {
                return true;
            }
        }
        
        private function calcExp(param_exp:String):Number {
        // Diese Funktion ist in die Schule gegangen und kann rechnen!
            var s:String;
            var i:uint;
            var n:Number;
            var arr:Array=new Array;
            
            s=param_exp;
            if (isNaN(Number(s))){
                arr=s.split('+');
                if (arr.length >1){
                    n=0;
                    for (i=0;i<arr.length;i++){
                        n+=calcExp(arr[i]);
                    }
                    s='';
                }
                arr=s.split('-');
                if (arr.length >1){
                    n=calcExp(arr[0]);
                    for (i=1;i<arr.length;i++){
                        n-=calcExp(arr[i]);
                    }
                    s='';
                }
                arr=s.split('*');
                if (arr.length >1){
                    n=1;
                    for (i=0;i<arr.length;i++){
                        n*=calcExp(arr[i]);
                    }
                    s='';
                }
                arr=s.split('/');
                if (arr.length >1){
                    n=calcExp(arr[0]);
                    for (i=1;i<arr.length;i++){
                        n/=calcExp(arr[i]);
                    }
                }
            } else {
                n=Number(s);
            }
            return n;
        }
        

        private function parseOnOff(str:String):Boolean{
            

            switch (str.toLocaleLowerCase()){
                case '':
                    break;
                case 'off':
                    return false;
                    break;
                case 'aus':
                    return false;
                    break;
                    
                default:
                    //trace (s);
                break;
            }
        
            return true;
            

            
        }
        
        private function parseFun(str:String,param_param:String):String{
            var s:String='';
            var p:String='';
            var arr:Array=new Array;
            
            if (str.indexOf(' ')>=0){
                p=str.substr(str.indexOf(' ')+1);
                str=str.substr(0,str.indexOf(' '));
            }
            
            switch (str.toLocaleLowerCase()){
                case '':
                    break;
                case 'getnumlines':
                    arr=param_param.split('\n');
                    s=String(arr.length);
                    break;
                case 'getline':
                    arr=param_param.split('\n');
                    //trace ('p=' + int(p) + ' arr.l=' + arr.length);
                    s=arr[int(p)-1];
                    break;
                default:
                    break;
            }
            return s;
        }
        
        private function registerEvent(str:String,param_action:String):void {
        // Diese Funktion regisrtiert eine Ereingnisbehandlungsroutine
        // geeignete Ereignisse sind: z.B. "PlayerDie"
            
            switch (str.toLocaleLowerCase()){
                case '':
                    break;
                case 'playerdie':
                    playerDieEv=param_action;
                    break;
                case 'getline':

                    break;
                default:
                    trace('Unbekannt On >' + str + '<  do >' + param_action + '<');
                    break;
            }            
        }
        
        private function parseString(str:String):void {
        // Diese Funktion sucht nach Zeilen in einem String und führt Befehle aus.
            var arr:Array = new Array;
            var i:uint;
            
            if (levelSpeed==0){
                //trace('Exec >'+ str + '<');
                levelInfo.unshift('');
                levelInfo.unshift('levelspeed=0');
            } else {
                levelInfo[0]='';
            }
            if(str.indexOf('\n')>-1){
                //trace('str >'+ str + '< rl=' + repeatLevel);
                arr=str.split('\n');
                arr.reverse();
                if (repeatLevel){
                    arr.unshift('RepeatLevel=' + repeatLevel);
                }
                repeatLevel=0;
                for (i=0;i<arr.length;i++){
                    levelInfo.unshift(arr[i]);
                }
                if (!levelSpeed) {
                    levelSpeed=1;
                }
                levelCount=levelSpeed;
                //trace('Info ls=' + levelSpeed + ' lc=' + levelCount + '\nund:>'+ levelInfo + '<');
            } else {
                parseLine(str,true);
            }            
        }
        
        private function parseClass(str:String):String {
        // Diese Funktion trennt Werte die gespeichert werden müssen von einem Befehl
            var n:Number;
            var i:uint;
            var s:String='';
            var p:String='';
            
            if(str.indexOf('{')>-1){
                if (str.indexOf('?')==0){
                    s=str.substr(str.indexOf('?')+1);
                    s=s.substr(0,s.indexOf('{'));
                    for (i=0;i<levelCache.length;i++){
                        if (s==levelCache[i].substr(levelCache[i].indexOf(' ')+1)){
                            break;
                        }
                    }
                    if (i<levelCache.length){                    
                        //trace('gefunden str>' + str + '\np>' + p + '\ns>' + s);
                        str='';
                    } else {
                        str=str.substr(str.indexOf('?')+1);
                        //trace('Nö ? str>' + str + '\np>' + p + '\ns>' + s);
                    }
                }
                if (str.length){                    
                    //trace ('geschwungene Klammer\n' + levelInfo);
                    s=str.substr(str.indexOf('{')+1);
                    str=str.substr(0,str.indexOf('{'));
                    if(s.indexOf('}')>-1){
                        p=s.substr(s.indexOf('}')+1);
                        s=s.substr(0,s.indexOf('}'));
                    } else {
                        if (levelInfo.length){
                            n=0;
                            for (i=1;i<levelInfo.length ;i++){
                                if(levelInfo[i].indexOf('{')>-1){
                                    n++;
                                }
                                if(!n && levelInfo[i].indexOf('}')>-1){
                                    s+=levelInfo[i].substr(0,levelInfo[i].indexOf('}'));
                                    levelInfo[i]=levelInfo[i].substr(levelInfo[i].indexOf('}')+1);
                                    break;
                                } else {
                                    if (n && levelInfo[i].indexOf('}')>-1){
                                        n--;
                                    }
                                    if (i==1&&!s.length){
                                        s=levelInfo[i];
                                    } else {
                                        s+='\n' + levelInfo[i];
                                    }
                                    levelInfo[i]='#';
                                }
                            }
                        }
                    }
                    //str+=s+p;
                    //levelInfo[0]=str+s+p;
                    //levelCache.push('x Hallo');
                    if (levelCache.length){
                        for (i=0;i<levelCache.length;i++){
                            if (s==levelCache[i]){
                                break;
                            }
                        }
                    }
                    if (i<levelCache.length){
                        str+='[' + String(i) + ']' + p;
                    } else {
                        for (i=0;i<levelCache.length;i++){
                            if (str==levelCache[i].substr(levelCache[i].indexOf(' ')+1)){
                                break;
                            }
                        }
                        if (i<levelCache.length){
                            if (cacheEinfach(levelCache[i].substr(0,levelCache[i].indexOf(' ')))){
                                i=int(levelCache[i].substr(0,levelCache[i].indexOf(' ')));
                                levelCache[i]=s;
                                str+='[' + String(i) + ']' + p;
                            } else {
                                levelCache[i]=String(levelCache.length) + ' ' + str;
                                str+='[' + String(levelCache.push(s)-1) + ']' + p;
                            }
                        } else {
                            str+='[' + String(levelCache.push(s)-1) + ']' + p;                        
                        }                    
                    }
                }
            }            
            return str;
        }
        
        private function parseLine(str:String,param_inLine:Boolean):void {
        // Diese Funktion führt eine Zeile oder einen einzelnen Befehl aus.
        // str: die Zeile oder der Befehl
        // param_inLine: true gibt an, dass "str" als einzelner Befehl behandelt wird und nicht als Zeile
        // Auslöser ist updateStage() wenn levelCount==levelSpeed.
        // Diese Funktion kann sich selber aufrufen (Rekursiv)
            
            var n:Number;
            var i:uint;
            var s:String='';
            var p:String='';
            var arr:Array=new Array();
            var myPattern:RegExp = /;/g;
            var iText:Object;
            
            if(str.indexOf('//')==0){ // Falls Kommentarzeile (// ganz am Anfang!) wird auf schnelle Weise ignoriert.
                levelCount=-1;// bewirkt, dass die nächste Zeile ohne Wartezeit ausgeführt wird.
                return;
            }
            
            if(str.indexOf('\n')>-1){
                //trace('>' + str + '<');
                //trace (levelInfo);
                arr=str.split('\n');
                str='';
                if (levelSpeed==0){
                    for (i=0;i<arr.length;i++){
                        parseLine(arr[i],true);
                    }
                } else {
                    arr.reverse();
                    //trace (arr);
                    for (i=0;i<arr.length;i++){
                        levelInfo.unshift(arr[i]);
                    }
                }
            }
            
            if(str.indexOf('{')>-1){
                str=parseClass(str);
            }

            // Befehle in Zeilen (mit ; getrennt) müssen in einzele Befehle gesplittet werden
            if(str.indexOf(';')>-1){
                if (repeatLevel){ // Wenn eine Repeat-Schleife der Fall ist
                    //wird die gesammte Zeile auf einen speziellen Stack gelegt
                    repeatLevelInfo.unshift(str);
                }
                if (str.indexOf(';')==0){
                    // ein Befehl mit Strichpunkt am Anfang wird "schnell ignoriert"
                    levelCount=-1;
                } else {
                    arr=str.split(';'); // jetzt wird das Array gebildet mit einzelnen Befehlen
                    
                    if (levelInfo.length){
                        n=0; // Indikator für Befehlszeilen mit "...Befehl;;Befehl..." (leere Anweisung dazwischen)
                    } else {
                        n=2;
                    }
                    for (i=0;i<arr.length ;i++){ // Alle Befehle in arr durchlaufen
                        if (arr[i]=='' && !n){
                            // Wenn jetzt eine leere Anweisung ist und bisher noch kein (;;) vorkam
                            levelInfo[0]=''; // Die aktuelle Zeile leeren (Array arr hat die Zeile)
                            n=1; // Den Indikator setzten
                        } else {
                            if (n==1){
                                // Wenn eine leere Anweisung vorkommt wird die Zeile neu gebildet
                                levelInfo[0]+=arr[i];
                                if (i<arr.length-1){
                                    // Falls es noch nicht das letzte Element ist kommt ein ; dazu
                                    levelInfo[0]+=';';
                                }
                            } else {
                                // Wenn es keine leere Anweisung ist wird sie jetzt Ausgeführt
                                //trace ('Befehl>' + arr[i] + '\n' + arr);
                                parseLine(arr[i],true);
                                if (levelSpeed&&levelCount==levelSpeed&&!n){
                                    //trace('warten...');
                                    levelInfo[0]=''; // Die aktuelle Zeile leeren
                                    n=1; // Den Indikator setzten
                                    //levelCount=0;
                                }                                
                            }
                        }
                    }
                    if (arr[i-1]=='#' && levelCount==0){
                        levelCount=levelSpeed;
//                        if (levelSpeed==0) {
//                            levelCount=-1;
//                        }
                    }else{
                        if (levelCount>0) levelCount=0;
                    }
                    if (n==1){
                        // Wenn eine leere Anweisung enthalten war muss eine Null-Anweisung
                        // auf den Stack gelegt werden, damit der Rest noch ausgeführt wird
                        levelInfo.unshift('#');
                    }
                    // Hier ist die Funktion fertig, das return könnte man auch weglassen.
                    return;
                }
            } else {
                // Hier kommen im Befehl keine Strichpunkte mehr vor, es ist ein einzelner Befehl.
                //infoText.Inhalt=str;
                
                if (repeatLevel&&!param_inLine){ // Wenn eine Repeat-Schleife der Fall ist und einzelner Befehl..
                    //wird die dieser Befehl auf einen speziellen Stack gelegt
                    repeatLevelInfo.unshift(str);
                    //Anm. Wenn es vorher eine Zeile war liegt sie bereits auf diesem Stack.
                }
                
                str=parseStr(str,true);
                
                //trace('>' + str + '<');
                
                // die Auswertung der Klammern
                if (str.indexOf('(')>-1){
                    // Wenn nicht vorher = vorkommt z.B. Variable=?Bedingung(Nein,Ja)
                    if (str.indexOf('(')<str.indexOf('=')||str.indexOf('=')==-1){
                        p=str.substr(str.indexOf('(')+1); // Alles nach Klammer-Auf
                        str=str.substr(0,str.indexOf('(')); // Alles vor Klammer-Auf
                        if (p.indexOf(')')>-1){ // Falls Klammer-Zu angegeben ist
                            if (p.length > p.indexOf(')')){ // Falls nach Klammer-Zu was steht
                                s=p.substr(p.indexOf(')')+1); // Alles nach Klammer-Zu
                            }
                            p=p.substr(0,p.indexOf(')')); // Alles zwischen Klammer-Auf und -Zu
                        } else {
                            // In der Zeile gibt es keine Klammer Zu
                            //trace ('KlammerZu\n' + levelInfo);
                            levelInfo[1]=levelInfo[0]+levelInfo[1];
                            levelInfo.splice(0,1);
                            //trace('>' + levelInfo[0] + '<');
                            parseLine(levelInfo[0],false);
                            str='';
                            return;
                        }
                    }
                }
                if (p.length){ // Falls Parameter in Klammern angegeben wurden
                    arr=p.split(','); // die Parameter in Klammern werden in ein Array gelegt
                }
                // den Befehl vom Rest trennen
                if (str.indexOf(' ')>-1){ // Falls ein Leerzeichen enthalten ist
                    p=str.substr(str.indexOf(' ')+1); // Alles nach dem 1.Leerzeichen
                    str=str.substr(0,str.indexOf(' ')); // Alles vor dem 1.Leerzeichen
                    // wenn noch keine Parameter in arr liegen
                    if (!arr.length){ // Falls keine Parameter in Klammern waren
                        // Parameter die mit Komma getrennt wurden jetzt in arr speichern.
                        arr=p.split(',');
                    }
                }
                
                // die eigentliche Auswertung des Befehls
                //infoText.Inhalt=str;
                //trace('str>' + str + '\np>' + p + '\ns>' + s);
                
                switch (str.toLocaleLowerCase()){
                    case '': // Leerzeile bewirkt wartezeit auf nächsten Befehl
                        break;
                    case '#': // Null-Anweisung bewirkt sofortige Ausführung des nächsten Befehls
                        levelCount=-1;
                        break;
                    case 'cls':
                        clearStage();
                        //livesText.Inhalt=String(playerLives);
                        break;
                    case 'reset':
                        inputString='';
                        // levelCache löschen
                        //levelCache
                        levelCache.splice(0);
                        levelCache.push('0 Empty');
                        trace('LevelCache Clear');
                        break;
                    case 'highscore':
                        trace('highscore');
                        highScore()
                        break;
                    case 'rofl':
                        str='TypeText=rofl das Auto weint';
                        parseString(str);
                        break;
                    case 'link':
                        trace('Link');
                        str='TypeText=Geheime Seite von Spacegunner';
                        parseString(str);
                        highScore()
                        break;
                    case 'ship':
                        Mouse.hide();
                        myShip.visible=true;
                        break;
                    case 'nokia':
                        clearStage();
                        break;
                    case 'aikon':
                        n=gameSpeed;
                        str='LevelSpeed=30;GameSpeed=1;ClearStage;Show(MousePointer);Hide(Ship)\n';
                        str+='TypeText=Geheime Seite von Spacegunner;Wait=200;';
                        str+='TypeText=Es gibt keine Geheimnisse\n';
                        str+='TypeText=Alles was sie hier lesen ist wahr\n';
                        str+='TypeText=Quelltexte sind offengelegt\n';
                        str+='TypeText=Satanische Verse;Wait=200;';
                        str+='TypeText=Einzige Regel ist der Syntax\n';
                        str+='TypeText=Programme\nTypeText=Adobe Flash CS3 Professional\nTypeText=Notepad\nTypeText=IE7\nTypeText=Flashplayer 9 r.45\nTypeText="2theMax";Wait=200;';
                        str+='TypeText=Rechtschreibung ist verbindlich\nTypeText=Ford Prefect;Wait=250;';
                        str+='ClearStage;LevelSpeed=0;GameSpeed=' + String(n) + ';options;';
                        //str+='PushButton(350,550,"Ok")options;';
                        //n=levelSpeed;
                        //i=stage.frameRate;
                        //stage.frameRate=130;
                        //levelSpeed=1;
                        parseString(str);

                        
                        break;
                    case 'test':
                        trace('Test s>' + s + '<  p>' + p + '< arr(' + String(arr.length) + ')>' + arr);
                        trace('playerLives=' + playerLives);
                        trace('Levelcache:');
                        trace(levelCache);
                        trace('LevelInfo:');                        
                        trace(levelInfo);                        
                        n=gameSpeed;
                        str='LevelSpeed=30;GameSpeed=1;ClearStage;Show(MousePointer);Hide(Ship)\n';
                        str+='TypeText(450,130)Testseite;';
                        str+='TypeText(200,430)Dieser Text ist ein Test;Wait=200;';
                        str+='TypeText=$PlayerName;Wait=200;';
                        //trace(parseVal('PlayerName').toLocaleLowerCase());
//                        if (parseVal('PlayerName').toLocaleLowerCase()=='test'){
//                            str+='TypeText(200,330)Test Bestanden;Wait=200;';
//                        }
                        //str+='TypeText=' + parseVal('$PlayerName') + ';Wait=200;';
                        str+='TypeText=Ende des Tests\nTypeText=Ford Prefect;Wait=250;';
                        str+='ClearStage;LevelSpeed=0;GameSpeed=' + String(n) + ';PushButton(500,300,Start)LoadLevel=loader;';
                        //str+='ClearStage;LevelSpeed=0;GameSpeed=' + String(n) + ';options;';
                        parseString(str);
                        //str='TypeText=Testseite;Wait=200;';
                        //parseString(str);
                        break;
                    case 'play': // Pause aus
                        gamePause=false;
                        break;
                    case 'pause': // Pause (ein/aus)
                        gamePause=(gamePause)?false:true;
                        break;
                    case 'fps': // Zeige Frames pro Sekunden an (ein/aus)
                        showFps=(showFps)?false:true;
                        break;
                    case 'hide':
                        //trace('hide s>' + s + '<  p>' + p + '< arr(' + String(arr.length) + ')>' + arr);                    
                        objPropSet(p,'visible','0')
                        break;                    
                    case 'show':
                        //trace('Show s>' + s + '<  p>' + p + '< arr(' + String(arr.length) + ')>' + arr);                    
                        //arr.length
                        objPropSet(p,'visible','1')
                        break;
                    case 'iamtheone': // Cheeeeeter !!! :[=]
                        myShip.fireRate=10;
                        myShip.fireMulti=3;
                        myShip.fireDamage=2;
                        myShip.fireProjektil=3;
                        myShip.missleRate=60;
                        myShip.missleMulti=3;
                        myShip.missleDamage=2;
                        myShip.updateSpeed=1;
                        break;
                    case 'clearstage':
                        clearStage();
                        break;
                    case 'clearscore':
                        playerScore=0;
                        scoreText.Inhalt='Score: ' + String(playerScore);
                        break;
                    case 'stopchilds':
                        // trace ('Die Kinder aufhalten');
                        break
                    case 'listbox':
                        //trace('Listbox s>' + s + '<  p>' + p + '< arr(' + String(arr.length) + ')>' + arr);
                        if (isNaN(calcExp(arr[2]))){
                            if (getCacheIndex(arr[2])){
                                str=getCacheVar(arr[2]);
                                n=int(parseFun('getnumlines',str));
                            } else {
                                n=0;
                            }
                        }
                        for (i=0;i<n;i++){
                            addChild(neuesLabel('btnOption',parseFun('getline ' + String(i+1),str),s,0,calcExp(parseExp(arr[0])),i * 30 + calcExp(parseExp(arr[1])),0x00FFFF,0x0066FF,true,true,3));
                        }
                        break;
                    case 'inputtext': // Texteingabe
                        iText = addChild(neuesLabel('TypeText',parseExp(s),'',3,arr[0],arr[1],0x00FFFF,0x0066FF,false,true,0));
                        iText = addChild(neuesLabel('InputText',parseVal(arr[2]),arr[2],4,int(arr[0]) + iText.tWidth + 30,arr[1],0x00FFFF,0x0066FF,false,true,0));
                        iText.Prop='border=true,width=250,selectable=true,autosize=none,editable=true';
                        //iText.setSize(100,100);
                        break;
                    case 'typetext': // Textausgabe
                        addChild(neuesLabel('TypeText',parseExp(s),'',0,arr[0],arr[1],0x00FFFF,0x0066FF,false,true,0));
                        break;
                    case 'pushbutton': // Schaltfläche
                        //trace('PushButton s>' + s + '<  p>' + p + '< arr(' + String(arr.length) + ')>' + arr);
                        iText = addChild(neuesLabel('btnOption',parseExp(arr[2]),'',2,calcExp(parseExp(arr[0])),calcExp(parseExp(arr[1])),0x00FFFF,0x0066FF,true,true,0));
                        iText.cmd=parseExp(s);
                        break;
                    case 'sideborder':
                        //trace('SideBorder s>' + s + '<  p>' + p + '< arr(' + String(arr.length) + ')>' + arr);
                        myRandstreifen.setProp=p;
                        levelCount=-1;
                        break;
                    case 'on': // Ereingnisse registrieren
                        registerEvent(arr[0],s);
                        break;
                    case 'var': // Variable
                        trace('  p>' + p );
                        //trace(getCacheVar('options'));
                        if (p.indexOf('=')>-1){
                            s=p.substr(0,p.indexOf('='))
                            str=p.substr(p.indexOf('=')+1);
                            str=parseStr(str,false);
                            if (getCacheVar(s)=='<Empty>'){
                                trace(s + ' Existiert nicht');
                                str=parseVal(str);
                                newCacheVar(s,str);
                                
                                trace('Var=' + getCacheVar(s));
                                //trace(getCacheVar(s));
                            }else{
                                trace(getCacheVar(s));
                            }
                        }
                        //trace(levelCache);
                        break;
                    case '?': // Bedingte Anweisung
                        //trace('?  p>' + p );
                        if(execIf(p)){
                            parseLine(s,true); // ausführen wenn Bedingung Wahr (als Inline-Befehl!)
                        } else {
                            levelCount=-1; // schnell zum nächsten Befehl wenn Bedingung Falsch
                        }
                        break;
                    case 'if': // If-Anweisung wandelt alle folgenden Befehle in ?(Bedingung)Befehl; um
                        if (repeatLevel){
                            // Bei Repeat-Aufzeichnung die letzte Zeile im Repeat-Array löschen
                            // sonnst wird das gleiche If später nochmal verarbeitet
                            repeatLevelInfo.splice(0,1);
                        }
                        for (i=1;i<levelInfo.length;i++){
                            // Alle folgenden Zeilen durchlaufen bis ;Zeichen am Anfang steht
                            if (repeatLevel){ // Falls Repeat-Schleife aktiv ist
                                if (levelInfo[i].indexOf(';')){ // Falls ; Trennzeichen enthalten sind
                                    if(execIf(p)){ // Wenn die Bedingung erfüllt ist
                                        // jedes ; in der Zeile ersetzen durch ;?(Bedingung)
                                        // damit wird jede Anweisung mit der Bedingung geimpft
                                        levelInfo[i]='?(' + p + ')' + levelInfo[i].replace(myPattern,';?(' + p + ')');
                                    } else {
                                        // Falls die Bedingung nicht erfüllt ist aber Repeat aktiv ist
                                        // den geimpften Befehl auf den Wiederholungs-Stack legen
                                        repeatLevelInfo.unshift('?(' + p + ')' + levelInfo[i].replace(myPattern,';?(' + p + ')'));
                                    }
                                }
                            }
                            if (levelInfo[i].indexOf(';')==0){ // Das ; Zeichen am Anfang der Zeile beendet den If-Block
                                break;
                            } else {
                                if(!execIf(p)){ // Wenn die Bedingung nicht erfüllt wurde
                                    levelInfo[i]='#'; // den Befehl ersetzen durch # (NOP)
                                }
                            }
                        }
                        // Bug: Wenn kein Repeat, wird ; nicht abgefragt
                        levelCount=-1; // Nächsten Befehl sofort laden
                        break;
                    case 'ifnot': // Ifnot-Anweisung wandelt alle folgenden Befehle in ?(Bedingung)Befehl; um
                        //trace('  p>' + p );
                        if (repeatLevel){
                            // Bei Repeat-Aufzeichnung die letzte Zeile im Repeat-Array löschen
                            // sonnst wird das gleiche IfNot später nochmal verarbeitet
                            repeatLevelInfo.splice(0,1);
                        }
                        for (i=1;i<levelInfo.length;i++){
                            // Alle folgenden Zeilen durchlaufen bis ;Zeichen am Anfang steht
                            if (repeatLevel){ // Falls Repeat-Schleife aktiv ist
                                if (levelInfo[i].indexOf(';')){ // Falls ; Trennzeichen enthalten sind
                                    if(!execIf(p)){ // Wenn die Bedingung erfüllt ist
                                        // jedes ; in der Zeile ersetzen durch ;?(Bedingung)
                                        // damit wird jede Anweisung mit der Bedingung geimpft
                                        levelInfo[i]='?(' + p + ')' + levelInfo[i].replace(myPattern,';?(' + p + ')');
                                    } else {
                                        // Falls die Bedingung erfüllt ist aber Repeat aktiv ist
                                        // den geimpften Befehl auf den Wiederholungs-Stack legen
                                        repeatLevelInfo.unshift('?(' + p + ')' + levelInfo[i].replace(myPattern,';?(' + p + ')'));
                                    }
                                }
                            }
                            if (levelInfo[i].indexOf(';')==0){ // Das ; Zeichen am Anfang der Zeile beendet den If-Block
                                break;
                            } else {
                                if(execIf(p)){ // Wenn die Bedingung erfüllt wurde
                                    levelInfo[i]='#'; // den Befehl ersetzen durch # (NOP)
                                }
                            }
                        }
                        // Bug: Wenn kein Repeat, wird ; nicht abgefragt
                        levelCount=-1; // Nächsten Befehl sofort laden
                        break;

                    case 'repeat': // Schleife beginnen
                        // Alle Zeilen werden in einem Array gespeichert
                        // die bei Continue wieder auf den Stack gelegt werden
                        if (arr.length >1){
                            // Wenn ein 2. Parameter angegeben wurde
                            if (arr[1].toLocaleLowerCase()=='reverse'){
                                // Reverse führt die Zeilen von unten nach oben aus
                                repeatOrder=1
                            }
                            // Geplant ist noch der Modus Random (beliebige Reihenfolge)
                        }
                        repeatLevelInfo.splice(0); // das Array leeren
                        if (isNaN(calcExp(arr[0]))){
                            if (getCacheIndex(arr[0])){
                                arr[0]=parseFun('getnumlines',getCacheVar(arr[0]));
                            } else {
                                trace ('Repeat was denn?>' + arr[0] + '<');
                            }
                        }
                        if (int(arr[0])>1){ // Wenn die Repeat Anzahl grösser 1 ist (sonst wäre es keine Wiederholung)
                            repeatLevelInfo.push('repeat(' + String(int(arr[0])-1) + ')'); // der Repeat noch mal auf den Stack legen, Zahl um Eins verringern
                            repeatLevelInfo.push('#'); // das #Zeichen signalisiert, dass die Schleife noch nicht zu Ende ist
                        }
                        repeatCount++; // Repeat Zähler erhöhen
                        repeatLevel++; // Repeat-Aufzeichnung starten
                        levelCount=-1; // Nächsten Befehl sofort laden
                        break;                    
                    case 'continue': // Schleife beenden
                        //trace ('continue ' + param_inLine + ' >' + repeatLevelInfo);
                        repeatLevelInfo.splice(0,1);
                        if (repeatLevelInfo.length>1){
                            // das #Zeichen im letzten Element zeigt an, dass die Schleife noch nicht fertig ist
                            if(repeatLevelInfo[repeatLevelInfo.length-1]=='#'){
                                if (repeatOrder==1){ // Reverse, Stack umdrehen
                                    repeatLevelInfo.splice(-1,1);
                                    repeatLevelInfo.reverse();
                                    repeatLevelInfo.push(repeatLevelInfo[0]);
                                    repeatLevelInfo.splice(0,1);
                                    repeatLevelInfo.push('#');
                                }
                                // die zu wiederholenden Zeilen auf den Stack legen
                                for (i=0;i<repeatLevelInfo.length;i++){
                                    levelInfo.unshift(repeatLevelInfo[i]);
                                }
                                repeatOrder=0; // Reihenfolge wieder auf normal stellen
                                repeatLevelInfo.splice(0); // Wiederholungs-Stack leeren
                            } else {
                                // Die in Repeat angegebene Zahl der Wiederholungen wurde erreicht
                                if (!execIf(p)){
                                    // Die Schleife solange weiterführen wenn Bedingung nicht erfüllt ist
                                    for (i=0;i<repeatLevelInfo.length;i++){
                                        levelInfo.unshift(repeatLevelInfo[i]);
                                    }
                                    repeatCount++ // der Zähler kann höher werden als in Repeat angegeben
                                } else {
                                    // Das Ende der Schleife wurde erreicht, Bedingung ist erfüllt
                                    repeatCount=0;
                                }
                            }
                        } else {
                            // für den Fall, dass im Schleifen-Stack Befehle sind
                            repeatCount=0;
                            //trace ('Feddisch? sollte nicht passieren');
                        }    
                        if (repeatLevel>0){
                            // Wenn Repeat-Aufzeichnung noch aktiv ist jetzt beenden
                            repeatLevel--;
                        }
                        levelCount=-1; // Den nächsen Befehl sofort laden
                        break;
                    default:
                        // Befehle die bisher noch nicht verarbeitet wurden
                        
                        if (str.indexOf('=')>-1){
                            // Zuweisung mit =Zeichen in der Form Variable=Wert;
                            s=str.substr(str.indexOf('=')+1);
                            if (p.length){
                                s+= ' ' + p; // Falls das vorher abgeschnitten wurde wieder dranheften
                            }
                            switch (str.substr(0,str.indexOf('=')).toLocaleLowerCase()){
                                case '':
                                    //trace ('No Object!');
                                    break;
                                case 'wait': // Warte-Anweisung
                                    levelCount=levelSpeed; // Nächster Befehl aber nicht unmittelbar danach
                                    if (s.toLocaleLowerCase()=='stageclear'){
                                        if (!stageClear()){
                                            levelInfo.unshift('wait=stageclear')
                                            return;
                                        }
                                    }
                                    if (Number(s)){
                                        waitCount=int(s); //*gameSpeed;
                                        waitTimer.start();
                                    }
                                    break;
                                case 'b': // Bonus-Item
                                    if (!bonusLevel){
                                        bonusCount=0;
                                    }
                                    bonusLevel=true;
                                    bonusItem=0;
                                    populateObstacle(s); // Ein Alienraumschiff mit Zufälligem Bonusitem
                                    break;
                                case 'b1': // Bonus-Item 1
                                    if (!bonusLevel){
                                        bonusCount=0;
                                    }
                                    bonusLevel=true;
                                    bonusItem=1;
                                    populateObstacle(s); // Ein Alienraumschiff mit dem Bonusitem Laser
                                    break;
                                case 'b2': // Bonus-Item 2
                                    if (!bonusLevel){
                                        bonusCount=0;
                                    }
                                    bonusLevel=true;
                                    bonusItem=2;
                                    populateObstacle(s); // Ein Alienraumschiff mit dem Bonusitem Missles
                                    break;

                                case 'b3': // Bonus-Item 3
                                    if (!bonusLevel){
                                        bonusCount=0;
                                    }
                                    bonusLevel=true;
                                    bonusItem=3;
                                    populateObstacle(s); // Ein Alienraumschiff mit dem Bonusitem Power
                                    break;
                                    
                                case 'b4': // Bonus-Item 4
                                    if (!bonusLevel){
                                        bonusCount=0;
                                    }
                                    bonusLevel=true;
                                    bonusItem=4;
                                    populateObstacle(s); // Ein Alienraumschiff mit dem Bonusitem Shield
                                    break;
                                
                                case 'b5': // Bonus-Item 5
                                    if (!bonusLevel){
                                        bonusCount=0;
                                    }
                                    bonusLevel=true;
                                    bonusItem=5;
                                    populateObstacle(s); // Ein Alienraumschiff mit dem Bonusitem Doublefire
                                    break;

                                case 'b6': // Bonus-Item 6
                                    if (!bonusLevel){
                                        bonusCount=0;
                                    }
                                    bonusLevel=true;
                                    bonusItem=6;
                                    populateObstacle(s); // Ein Alienraumschiff mit dem Bonusitem Explode
                                    break;
                                case 'b7': // Bonus-Item 7
                                    if (!bonusLevel){
                                        bonusCount=0;
                                    }
                                    bonusLevel=true;
                                    bonusItem=7;
                                    populateObstacle(s); // Ein Alienraumschiff mit dem Bonusitem Freileben
                                    break;

                                    
                                case 'bonus'://Spezielles Bonusitem
                                    //trace(parseParamInt(s,1));
                                    //Format  Bonus=Typ,X-Pos
                                    populateBonus(parseParamInt(s,1),100,parseParamInt(s,0));                                
                                    break;
                                case 'boss':
                                    //trace('BOSS!> ' + parseParamInt(s,1));
                                    populateEndboss(s);
                                    break;
                                case 'score':
                                    //trace('Score>' + s);
                                    //Populate Score
                                    playerScore+=int(s);
                                    scoreText.Inhalt='Score: ' + String(playerScore);
                                    break;
                                case 'sound':
                                    if (parseOnOff(s)){
                                        infoText.Inhalt='Sound On';
                                        soundOn=true;
                                    } else {
                                        infoText.Inhalt='Sound Off';                                        
                                        backSound.stop();
                                        soundOn=false;
                                    }

                                    
                                
                                    break;
                                case 'mouse':
                                    switch (s.toLocaleLowerCase()){
                                        case '':
                                            break;
                                        case 'on':
                                            Mouse.show();
                                            break;    
                                        case 'off':
                                            Mouse.hide();
                                            break;                                                
                                        default:
                                            trace (s);
                                        break;
                                    }
                                    break;
                                case 'sideborder':
                                    p=parseExp(s);
                                    n=0;
                                    if (p!=s){
                                        n=parseIndex(s);
                                        if (n==levelCache.length-1){
                                            levelCache.splice(n,1);
                                        }
                                    }
                                    //myRandstreifen.loadSideBorder(p);
                                    break;
                                case 'playsound':
                                    //trace ('PlaySound> ' + s );
                                    backSound.stop();
                                    if (soundOn){
                                        if (s.toLowerCase()!="none"){
                                            var bSound = new Sound(new URLRequest(s));
                                            backSound = bSound.play();
                                        }
                                    }
                                    break;
                                case 'infotext':
                                    infoText.Inhalt=parseExp(s);
                                    break;
                                case 'playerlives':
                                    trace('s=' + s);
                                    playerLives=int(s);
                                    livesText.Inhalt=String(playerLives);
                                    break;
                                case 'gamespeed':
                                    s=parseVal(s);
                                    trace('sGamespeed=' + s);
                                    n=int(s);
                                    gameSpeed=n;
                                    //stage.frameRate=65;
                                    trace('GameSpeed=' + n);
                                    trace('FrameRate=' + (30+(n*3)*5));
                                    stage.frameRate=30+(n*3)*5;
                                    //stage.frameRate=60+(n*5)*10;
                                    break;
                                case 'levelname': // Name des Levels wird angezeigt, Zähler zurückstellen
                                    levelEnemyHits=0;
                                    levelEnemyTotal=0;
                                    levelCount=-1;
                                    infoText.Inhalt=s;
                                    //trace(s);
                                    break;
                                case 'loadlevel':
                                    trace('loadlevel > ' + s);
                                    loadLevel(s);
                                    break;
                                case 'gotosection':
                                    //trace('GotoSection s>' + s + '<  p>' + p + '< arr(' + String(arr.length) + ')>' + arr);
                                    levelSpeed=0;
                                    if (isNaN(calcExp(s))){
                                    // es wurde ein Bezeichner für einen SectionNamen verwendet
                                        arr.splice(0);
                                        levelInfo.splice(0);
                                        //arr = loader.data.split("\r\n");
                                        arr = loader.data.split(splitVar);
                                        n=0;
                                        for (i=0;i<arr.length;i++){
                                            if (n==1){
                                                levelInfo.push(arr[i]);
                                            } else {
                                                if (arr[i].indexOf(';')==-1){
                                                    arr[i]+=';';
                                                }
                                                if (arr[i].indexOf('//')){
                                                    //trace (arr[i].substr(0,arr[i].indexOf(';')).toLocaleLowerCase());
                                                    if (arr[i].substr(0,arr[i].indexOf(';')).toLocaleLowerCase()=='sectionname=' + s.toLocaleLowerCase()){
                                                        levelInfo.push(arr[i]);
                                                        n=1;
                                                    }
                                                }
                                            }
                                        }
                                        sectionCount=0;
                                    } else {
                                        //trace(s + ' ist eine Zahl');
                                        if (sectionCount){
                                            infoText.Inhalt='Section:' + String(sectionCount) + ' lvInfo:' + levelInfo.length + ' rpLvl:' + repeatLevel;
                                            //if (repeatLevel){
                                                //trace('v>' + levelInfo);
                                                myShip.visible=true;
                                                Mouse.hide();
                                                if (repeatLevelInfo.length){
                                                    for (i=0;i<repeatLevelInfo.length;i++){
                                                        if (repeatLevelInfo[i].toLocaleLowerCase().indexOf('sectionname=')==0){
                                                            //trace(i + '>' + repeatLevelInfo[i]);
                                                            levelInfo.unshift(repeatLevelInfo[i]);
                                                            break;
                                                        } else {
                                                            levelInfo.unshift(repeatLevelInfo[i]);
                                                        }
                                                    }
                                                    repeatLevelInfo.splice(0);
                                                } else {
                                                    trace ('Repeatlevel ist leer');
                                                    trace ('Info ls>' + levelSpeed + '\n' + levelInfo);
//                                                    levelInfo.splice(0);
//                                                    repeatLevelInfo.splice(0);
//                                                    levelInfo = loader.data.split("\r\n");                                        
//                                                    repeatCount=0;
//                                                    repeatLevel=0;
                                                }

                                        } else {
                                            trace('Kein SectionCount!');
                                        }
                                        
                                    }
                                    clearStage();
                                    levelSpeed=currentSpeed;
                                    levelCount=levelSpeed;
                                    //trace ('arr(' + arr.length + ')\n' + arr);
                                    //trace ('ls:' + levelSpeed);
                                    if (levelSpeed==0) {
                                        levelSpeed=1;
                                    }
                                    //sectionCount=0;
                                    break;
                                case 'sectionname': // Name der Sektion wird angezeigt
                                    sectionCount++;
                                    levelCount=-1;
                                    infoText.Inhalt=parseExp(s);
                                    break;
                                case 'typetext': // Eine Textzeile mit Tipp-effekt anzeigen
                                    addChild(neuesLabel('TypeText',parseExp(s),'',0,50,400,0x00FFFF,0x0066FF,false,true,2));
                                    break;                                                            
                                case 'repeatlevel': // In gewissen Fällen soll die Repeat-Funktion ausser kraft gesetzt werden, z.B. wenn das "Ship" explodiert
                                    repeatLevel=int(s);
                                    break;
                                case 'levelspeed': // Geschwindigkeit mit der das Levelscript verarbeitet wird
                                    levelCount=-1;
                                    levelSpeed=int(s)*2;
                                    if (levelSpeed>0) currentSpeed=levelSpeed;
                                    break;
                                case 'background': // Hintergrundbild zeichnen
                                    levelCount=-1;
                                    //trace('Background S>' + s);
                                    myBackground.zeichneBackground(s);
                                    break;
                                default:
                                    
                                    //trace('BossName=' + str.substr(0,str.indexOf('=')).toLocaleLowerCase());
                                    trace('S>' + s);
                                    
                                    //trace (str);
                                    
                                    // Falls Ein Endboss
                                    bossCommand(str.substr(0,str.indexOf('=')),s);
                                    
                                    
                                    
                                    
                                    break;
                            }
                        } else {
                            if (str.indexOf('[')>-1){
                                s=str.substr(str.indexOf('[')+1);
                                str=str.substr(0,str.indexOf('['));
                                s=s.substr(0,s.indexOf(']'));
                                
                                for (i=0;i<levelCache.length;i++){
                                    if (str==levelCache[i].substr(levelCache[i].indexOf(' ')+1)){
                                        break;
                                    }
                                }
                                if (i<levelCache.length){
                                    //trace(str + ' gefunden >' + levelCache[i] + '<\ns1>' + s + '<\nCache\n' + levelCache);
                                } else {
                                    levelCache.push(s + ' ' + str);
                                }
                                
                                //s=levelCache[int(s)];
                                //s=s.substr(s.indexOf(' ')+1);
                                //trace('str>' + str + ' Ls:' + levelSpeed + ' uC:' + levelCount);
                                //levelCount=levelSpeed;
                                levelCount=-1;
                                
                            } else {
                                for (i=0;i<levelCache.length;i++){
                                    if (str==levelCache[i].substr(levelCache[i].indexOf(' ')+1)){
                                        break;
                                    }
                                }
                                if (i<levelCache.length){
                                    //trace(str + ' gefunden >' + levelCache[i]);
                                    switch (str.toLocaleLowerCase()){
                                        case '':
                                            break;
                                        case 'start':
                                            if (levelSelect==levelLoad){                                
                                                //trace('Start levelLoad >' + levelLoad);
                                            }else{
                                                //trace('Geh LOAD!!! >' + levelSelect);
                                                loadLevel(levelSelect);
                                            }
                                            i=int(levelCache[i].substr(0,levelCache[i].indexOf(' ')));
                                            parseString(levelCache[i]);
                                            break;
                                        default:
                                            i=int(levelCache[i].substr(0,levelCache[i].indexOf(' ')));
                                            parseString(levelCache[i]);
                                            break;
                                    }
                                    
                                } else {
                                    // Befehle die überschreibbar sind
                                    switch (str.toLocaleLowerCase()){
                                        case '':
                                            break;
                                        case 'start':
                                            //addChild(neuesLabel('btnOption','Ready','Ready',2,350,550,0x00FFFF,0x0066FF,true,true,0));
                                            break;
                                        default:
                                            //trace ('>' + str + '< Ship!');
                                            
                                            // Wenn eine Anweisung bis hier noch nicht verarbeitet wurde
                                            // wird ein gegnerisches Schiff erstellt. Anweisungen wie 1,400 usw.
                                            if (arr.length ) str+=arr.join(',');
                                            bonusLevel=false;
                                            populateObstacle(str);
                                            break;
                                    }
                                }                                
                            }
                        }
                }
            }
        }
        
        private function bossCommand(param_name:String,param_cmd:String ):void{
            var obj:Object;
            //trace('BossName=' + param_name);
            //trace('Cmd=' + param_cmd);            
            for (var i=0;i<numChildren;i++){
                if (getChildAt(i) is endboss){
                    obj=getChildAt(i);
                    if (obj.bossName==param_name){
                        //trace('Boss cmd OK!');
                        obj.Ki=param_cmd;
                        return;
                    }
                }
            }
        }
                                
        private function stageClear():Boolean {
            for (var i=0;i<numChildren;i++){
                if (getChildAt(i) is obstacle){
                    return false;
                }
                if (getChildAt(i) is endboss){
                    return false;
                }
            }
            return true;
        }

        private function ExplodeAll():void {
            var obj:Object;
            for (var i=0;i<numChildren;i++){
                obj=getChildAt(i);
//                if (getChildAt(i) is endboss){
//                    removeChildAt(i); // den Endboss jetzt entfernen
//                    i--; // Index-Zähler Korrektur
//                }
                if (getChildAt(i) is obstacle){
                    obj.verhalten=0;
                    obj.gotoAndPlay('explode');
                    obj.explode=true; // Gegner explodieren lassen
                    obj.canHit=false;
                    //obj.visible=false;
                    //removeChildAt(i); // den Gegner jetzt entfernen
                    //i--; // Index-Zähler Korrektur
                }
                if (getChildAt(i) is plasmaball){
                    removeChildAt(i); // den PlasmaBall jetzt entfernen
                    i--; // Index-Zähler Korrektur
                }                
            }
        }        

        
        private function clearStage():void {
            var obj:Object;
            for (var i=0;i<numChildren;i++){
                if (getChildAt(i) is endboss){
                    removeChildAt(i); // den Endboss jetzt entfernen
                    i--; // Index-Zähler Korrektur
                }
                if (getChildAt(i) is obstacle){
                    removeChildAt(i); // den Gegner jetzt entfernen
                    i--; // Index-Zähler Korrektur
                }
                if (getChildAt(i) is plasmaball){
                    removeChildAt(i); // den PlasmaBall jetzt entfernen
                    i--; // Index-Zähler Korrektur
                }                
                if (getChildAt(i) is tx){
                    obj=getChildAt(i);
                    if (obj.Bez!='fix'){
                        removeChildAt(i); // das Element jetzt entfernen
                        i--; // Index-Zähler Korrektur
                    }
                }                
            }
        }        

        private function loadLevel(param_name:String):void{
            var req:URLRequest;
            
            // trace('Load >' + param_name);
            levelLoad=param_name;
            levelSelect=levelLoad;
            req = new URLRequest("levels/" + levelLoad + ".txt");
            loader = new URLLoader();
            loader.load(req);
            loader.addEventListener(Event.COMPLETE, loaderCompleteHandler);
        }
        
        private function neuesLabel(param_name:String,param_text:String,param_cmd:String,param_orientation:uint,param_x:int,param_y:int,param_color:uint,param_over:uint,param_event:Boolean,param_visible:Boolean,param_effect:uint):tx{
            var objLabel:tx=new tx();
            var p:RegExp = /"/g;
            p = /#40#/g;
            param_text=param_text.replace(p,'(');                
            p = /#41#/g;
            param_text=param_text.replace(p,')');                

            objLabel.x=param_x;
            objLabel.y=param_y;
            objLabel.Farbe=param_color;
            objLabel.colorOver=param_over;
            objLabel.colorOut=param_color;
            objLabel.Bez=param_name;
            objLabel.effect=param_effect;
            objLabel.Orientation=param_orientation;
            objLabel.cmd=param_cmd;
            objLabel.Inhalt=param_text;
            objLabel.visible=param_visible;
            if (param_event){
                objLabel.Events=true;
                objLabel.addEventListener(MouseEvent.MOUSE_DOWN, mausDown);
                objLabel.addEventListener(MouseEvent.MOUSE_UP, mausReleased);                        
            }
            return objLabel;
        }
        
        private function fireMissle(param_x:uint,param_y:uint):void{
            var myMissle:missle=new missle();
            myMissle.x=param_x;
            myMissle.y=param_y;
            myMissle.damage=myShip.missleDamage;
            myMissle.gotoAndStop(1);
            addChild (myMissle);    
        }

        private function populateBonus(param_x:uint,param_y:uint,param_item:uint):void{
            var myBonus:bonusitem=new bonusitem();
            var n:uint=1;
            var m:uint=0;
            // Ship Status
            //Anzahl der Definierten Schlüsselbilder
            if (!param_item){
                n=int(Math.random() * 10);
                m=int(Math.random() * 25);
                if (m==10) n=m;
            }else{
                n=param_item;
            }
            if (param_x==0) param_x=int(Math.random()*700)+50;
            myBonus.x=param_x;
            myBonus.y=param_y;
            myBonus.gotoAndStop(n);
            addChild (myBonus);    
        }
        
        private function fireLaser(param_x:uint,param_y:uint,param_projektil:uint):void{
            var myLaserL:laserl=new laserl();
            myLaserL.x=param_x;
            myLaserL.y=param_y+25;
            myLaserL.vX=8;
            myLaserL.damage=myShip.fireDamage;
            addChild (myLaserL);

            var myLaserR:laserl=new laserl();
            myLaserR.x=param_x;
            myLaserR.y=param_y+25;
            myLaserR.vX=-8;
            myLaserR.damage=myShip.fireDamage;
            addChild (myLaserR);
            
        }
        
        private function fireProjektil(param_x:uint,param_y:uint,param_projektil:uint):void{
            var myProjektil:projektil=new projektil();
            myProjektil.x=param_x;
            myProjektil.y=param_y;
            myProjektil.damage=myShip.fireDamage;
            myProjektil.gotoAndStop(param_projektil);
            addChild (myProjektil);    
    
            //var channel:SoundChannel = drum.play();
        }
        
        private function firePlasmaBall(param_x:uint,param_y:uint):void{
            var myPlasmaBall:plasmaball=new plasmaball();
            var i:uint;
            myPlasmaBall.x=param_x;
            myPlasmaBall.y=param_y;
            i=int((Math.abs(myShip.x-param_x)+Math.abs(myShip.y-param_y))/6);
            myPlasmaBall.vX=int((myShip.x-param_x)/i);
            myPlasmaBall.vY=int((myShip.y-param_y)/i);
            myPlasmaBall.gotoAndStop(1);
            addChild (myPlasmaBall);    
        }        

        private function populateEndboss(param_str:String):void{
            var myEndboss:endboss;

            myEndboss=new endboss();
            myEndboss.x=250;
            myEndboss.y=250;
            //myEndboss.Ki=s;
            myEndboss.bossName=param_str;
            myEndboss.gotoAndStop(1);
            myEndboss.verhalten=1;
            addChild (myEndboss);                
            levelEnemyTotal++;
        
        }
        
        private function populateObstacle(param_str:String):void{
            var myObstacle:obstacle;
            var arr:Array=new Array();
            var s:String='';
            var i:uint;
            arr=param_str.split(',');
            if (arr.length==2){
                arr.push('0');
            }
            if (int(arr[0])==0){
                return;
            }
            //Wenn 2. Wert (x) = 0 dann zufälliger Wert für x
            if (arr.length>1){
                if (int(arr[1])==0){
                    arr.splice(1,1,String(int(Math.random()*700)));
                }
            }
            //Args auf Numerischen Wert prüfen und leere Elemente löschen
            for (i=0;i<arr.length;i++){
                if (arr[i].charCodeAt(0)!=45&&(arr[i].charCodeAt(0)<48||arr[i].charCodeAt(0)>57)){
                    s+=arr[i] + ',';
                    arr.splice(i,1);
                    i--;
                    //trace(arr[i].charCodeAt(0) + ' ' + arr[i]);
                }
                if (arr[i]==''){
                    arr.splice(i,1);
                    i--;
                }
            }
            //if (s.length) trace( s + '>' +  arr + '(' + arr.length + ')');
            
            //infoText.Inhalt=param_str;
            if (arr.length>3){
                for (i=0;i<arr[3];i++){
                    myObstacle=new obstacle();
                    myObstacle.x=int(arr[1]) + i * int(arr[4]);
                    myObstacle.y=int(arr[2]) + i * int(arr[5]);
                    myObstacle.Ki=s;
                    if (bonusLevel){
                        bonusCount++;
                        myObstacle.bonusPunkte=bonusLevel;
                    }
                    myObstacle.gotoAndStop(arr[0]);
                    myObstacle.verhalten=arr[0];
                    myObstacle.BummSoundOn=soundOn;
                    addChild (myObstacle);
                    levelEnemyTotal++;
                }
            } else {
                myObstacle=new obstacle();
                myObstacle.x=arr[1];
                myObstacle.y=arr[2];
                myObstacle.Ki=s;
                if (bonusLevel){
                    bonusCount++;
                    myObstacle.bonusPunkte=bonusLevel;
                }
                myObstacle.gotoAndStop(arr[0]);
                myObstacle.verhalten=arr[0];
                myObstacle.BummSoundOn=soundOn;
                addChild (myObstacle);                
                levelEnemyTotal++;
            }
        }
        
        private function mausDown(event:MouseEvent):void {
            switch(event.target.name)
            {
                case 'btnOption':
                    event.target.y+=2;
                    break;
                default:
                    break;
            }
        }

        private function highScore():void{
            //var PlayerName:String = parseVal('PlayerName').toLocaleLowerCase();
            if (playerName == 'Spieler 1'){
                trace('Name=player1');
                infoText.Inhalt='Highscore wurde nicht eingetragen (Name fehlt)';
            } else{
                var variables:URLVariables = new URLVariables("spieler=" + playerName + "&punkte=" + String(playerScore));
                var request:URLRequest = new URLRequest();
                request.url = "http://www.luschen.at/hi.php";
                //request.url = "/hi.php";
                request.method = URLRequestMethod.POST;
                request.data = variables;
                var loader2:URLLoader = new URLLoader();
                //loader2.dataFormat = URLLoaderDataFormat.VARIABLES;
                loader2.dataFormat = URLLoaderDataFormat.TEXT;
                loader2.addEventListener(Event.COMPLETE, hiCompleteHandler);
                try
                {
                    loader2.load(request);
                }
                catch (error:Error)
                {
                    trace("Unable to load URL");
                }
                infoText.Inhalt='Highscore wurde eingetragen';
            }

            
        }

        function hiCompleteHandler(event:Event):void
        {
            trace("load URL");
            trace(event.target.data);
            //loader2.removeEventListener(Event.COMPLETE, hiCompleteHandler);
            //loadLevel('highscore');
            //levelInfo = event.target.data.split(splitVar);
            levelInfo = event.target.data.split('\n');
            levelSpeed=1;
            levelCount=levelSpeed;
        }        

        private function mausReleased(event:MouseEvent):void {
            var obj:Object;
            var i:uint;
            switch(event.target.name)
            {
                case 'btnOption':
                    if (event.target.y) event.target.y-=2;
                    for (i=0;i<numChildren;i++){
                        if (getChildAt(i) is tx){
                            obj=getChildAt(i);
                            if (obj.Bez==event.target.name){
                                obj.Farbe=0xFFFFFF;
                            }
                        }
                    }
                    obj=event.target.parent;
                    switch(obj.cmd.toLocaleLowerCase()){                    
                        case 'slow':
                            gameSpeed=1;
                            stage.frameRate=65;
                            //stage.frameRate=60+(gameSpeed*5)*10;
                            infoText.Inhalt='Geschwindigkeit festlegen: (' + evalString(gameSpeed,1) + ')';
                            break;
                        case 'normal':
                            gameSpeed=2;
                            stage.frameRate=90;
                            //stage.frameRate=60+(gameSpeed*5)*10;
                            infoText.Inhalt='Geschwindigkeit festlegen: (' + evalString(gameSpeed,1) + ')';
                            break;
                        case 'fast':
                            gameSpeed=3;
                            stage.frameRate=120;
                            //stage.frameRate=60+(gameSpeed*5)*10;
                            infoText.Inhalt='Geschwindigkeit festlegen: (' + evalString(gameSpeed,1) + ')';
                            break;
                        case 'easy':
                            gameHardness=1;
                            infoText.Inhalt='Schwierigkeitsstufe festlegen: (' + evalString(gameHardness,2) + ')';

                            break;
                        case 'fine':
                            gameHardness=2;
                            infoText.Inhalt='Schwierigkeitsstufe festlegen: (' + evalString(gameHardness,2) + ')';
                            break;
                        case 'hard':
                            gameHardness=3;
                            infoText.Inhalt='Schwierigkeitsstufe festlegen: (' + evalString(gameHardness,2) + ')';
                            break;
                        case 'ready':
                            if (playerLives<0) playerLives=3;
//                            clearStage();
//                            levelSpeed=1;
                            //sectionCount=0;
                            if (sectionCount==-1){
                                infoText.Inhalt='Section:' + String(sectionCount) + ' lvInfo:' + levelInfo.length + ' rpLvl:' + repeatLevel;
                                if (repeatLevel){
                                    //trace('v>' + levelInfo);
                                    if (repeatLevelInfo.length){
                                        for (i=0;i<repeatLevelInfo.length;i++){
                                            if (repeatLevelInfo[i].toLocaleLowerCase().indexOf('sectionname=')==0){
                                                //trace(i + '>' + repeatLevelInfo[i]);
                                                levelInfo.unshift(repeatLevelInfo[i]);
                                                break;
                                            } else {
                                                levelInfo.unshift(repeatLevelInfo[i]);
                                            }
                                        }
                                        repeatLevelInfo.splice(0);
                                    } else {
                                        levelInfo.splice(0);
                                        repeatLevelInfo.splice(0);
                                        levelInfo = loader.data.split(splitVar);
                                        levelSpeed=1;
                                        levelCount=levelSpeed;
                                        //levelInfo = loader.data.split("\r\n");                                        
                                        repeatCount=0;
                                        repeatLevel=0;                                        
                                    }
                                    //trace('n>' + levelInfo);
                                }
                                levelSpeed=currentSpeed;
                                //levelInfo.length
                            }else{
//                                levelInfo.splice(0);
//                                repeatLevelInfo.splice(0);
//                                levelInfo = loader.data.split("\r\n");
                                
//                                repeatCount=0;
//                                repeatLevel=0;
                            }
                            
                            levelSpeed=currentSpeed;
                            if (levelSpeed<1) levelSpeed=1;
                            
                            Mouse.hide();
        //                    myShip.x=int(Math.random()*300)+300;
        //                    myShip.y=int(Math.random()*200)+200;
                            myShip.visible=true;
                            break;
                        case 'levelselect':                            
                            infoText.Inhalt=obj.Inhalt;
                            levelSelect=obj.Inhalt;
                            break;                        
                        case 'XXok1':
                            levelSpeed=0;
                            clearStage();
                            addChild(neuesLabel('btnOption','Optionen','options',2,300,550,0x00FFFF,0x0066FF,true,true,0));
                            addChild(neuesLabel('btnOption','Ready','ready',2,450,550,0x00CC00,0x00FF00,true,true,0));                            
                            break;
                        default:
                            //infoText.Inhalt='Unbekannter Befehl:>' + obj.cmd;
                            //trace ('Befehl:>' + obj.cmd + '<');
                            parseLine(obj.cmd,true);
                            //trace (levelInfo);
                            break;
                    }
                    obj.Farbe=0xFF0000;
                    break;
                default:
                    if (event.target.y) event.target.y-=2;
                    break;
            }
        }
        
        
        private function mouseDownHandler(event:MouseEvent):void {
            //fireProjektil(myShip.x+int(Math.random()*20),myShip.y,1);
            myShip.fire=true;
        }
        
        private function mouseUpHandler(event:MouseEvent):void {
            myShip.fire=false;
        }        
    }
}