In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

flash on 2012-1-7

import flash.geom.Rectangle;
Get Adobe Flash player
by vladko_geek 27 Jul 2015
/**
 * Copyright vladko_geek ( http://wonderfl.net/user/vladko_geek )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/qdYl
 */

  package {
    import flash.media.Sound;
    import flash.filters.ShaderFilter;
   import flash.display.Loader;
   import flash.display.*;
   import flash.events.*;
   import flash.geom.*;
   import flash.net.*;
   import sandy.core.*;
   import sandy.core.data.*;
   import sandy.core.scenegraph.*;
   import sandy.primitive.*;
   import sandy.materials.*;
   import sandy.view.*; 
  import flash.display.Sprite;
  import flash.display.BitmapData;   
  import flash.display.Bitmap; 
  import flash.events.*;
  import flash.net.*;
  import flash.display.Loader;
  import flash.display.LoaderInfo;
  import flash.system.LoaderContext;
  import flash.display.*;
  import flash.events.*;
  import flash.geom.*;
  import flash.net.*;
  import flash.display.AVM1Movie;
  import flash.display.Sprite;
  import flash.events.*;
  import flash.ui.*;
  import flash.net.*;
  import flash.text.*;
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.geom.Rectangle;
  import flash.system.Security;
  import sandy.core.Scene3D;
  import sandy.events.*;
  import sandy.core.data.*;
  import sandy.util.*;
  import sandy.core.scenegraph.*;
  import sandy.materials.*;
  import sandy.materials.attributes.*;
  import sandy.primitive.*;
  public class GameApplication extends Sprite {

        //konstanti
        public static const GAME_POOL_X:Number=7;
        public static const GAME_POOL_Y:Number=7;
        public static const GAME_POOL_Z:Number=7;
        public static const GAME_POOL_MARGIN:Number=2;
        public static const VIEWPORT_WIDTH:Number=465;
        public static const VIEWPORT_HEIGHT:Number=465; 
        public static const CUBE_EDGE_LENGTH:Number=10;
        public static const ALPHABETH_SIZE:Number=30;
        public static const CHOISEN_WORDS_COUNT:Number=5;
        public static const LETTER_CUBE_STEP:Number=CUBE_EDGE_LENGTH+GAME_POOL_MARGIN;
        private var scene:Scene3D;
        private var GameHighscores:Array;
        private var sceneCamera:Camera3D;
        private var sceneGroup:Group;    
        private var resLoader:Loader;
        private var debugStringContainer:TextField=new TextField();
       // private var wordsStringContainer:TextField=new TextField();
        private var gamePool:Array;
        private var alphabeth:Array;
        private var words:Array;
        private var choisenWords:Array;
        private var cubeMat:Appearance;
        private var letterMats:Array;
        //private var bitm:Bitmap;
        public function GameApplication() 
        {    
            var mySweetLove:String="http://scontent-ams3-1.xx.fbcdn.net/hphotos-xpt1/v/t1.0-9/11781733_1124774390885214_5939142540557009024_n.jpg?oh=beadcb60e9f2d534ad81a5f7c6d5225c&oe=56522658";//"http://profile.ak.fbcdn.net/hprofile-ak-snc4/274341_100000752941447_4601349_q.jpg";
            var loader:Loader=new Loader;
            loader.contentLoaderInfo.addEventListener (Event.COMPLETE, OnTexturesLoaded);
            loader.contentLoaderInfo.addEventListener (ProgressEvent.PROGRESS, LoadingGame);    
            loader.load(new URLRequest(mySweetLove));                   
            //StartingGame();
        }
        private function OnTexturesLoaded(e:Event):void
        {
            var li:LoaderInfo = LoaderInfo (e.target);
            var loader:Loader = new Loader;
            loader.contentLoaderInfo.addEventListener (Event.COMPLETE, StartingGame);
            loader.loadBytes (li.bytes);
        }
        private function LoadingGame(e:ProgressEvent):void
        {
            graphics.clear();
            graphics.lineStyle (2);
            graphics.drawRect (80, 220, 304, 34);
            graphics.lineStyle ();
            graphics.beginFill (0);
            graphics.drawRect (82, 222, 300 * e.bytesLoaded / (e.bytesTotal + 1e-4), 30);
            graphics.endFill ();
        }
        private function LoadWords():void
        {
          //zaregdane na dumi4ki
          words=new Array(
              new GameWord("формат"),
              new GameWord("нула"),
              new GameWord("надпис"),
              new GameWord("име"),
              new GameWord("лента"),
              new GameWord("пица"),
              new GameWord("котка"),
              new GameWord("жила"),
              new GameWord("камила"),
              new GameWord("точка"),
              new GameWord("ера"),
              new GameWord("амплоа"),
              new GameWord("етика"),
              new GameWord("есе"),
              new GameWord("комо"),
              new GameWord("дъно"),
              new GameWord("анти"),
              new GameWord("баница"),
              new GameWord("химн"),
              new GameWord("рак"),
              new GameWord("виц"),
              new GameWord("фаза"),
              new GameWord("реми"),
              new GameWord("етил"),
              new GameWord("каре"),
              new GameWord("тиминс"),
              new GameWord("тарпан"),
              new GameWord("уловка"),
              new GameWord("звук"),
              new GameWord("новела"),
              new GameWord("гали"),
              new GameWord("секира"),
              new GameWord("лак"),
              new GameWord("хлапак"),
              new GameWord("какао"),
              new GameWord("седло"),
              new GameWord("кутия"),
              new GameWord("юнак"),
              new GameWord("бижу"),
              new GameWord("месец"),
              new GameWord("колан"),
              new GameWord("оран")
          );
          choisenWords=new Array(5);
          //na4alni izbrani dumi4ki
          for(var kpo:Number=0;kpo<5;kpo++)
          {
              ChooseNewWord(kpo);
          }
        }
        private function ChooseNewWord(choisenWordsIndex:Number):void
        {
            //tursim nai-malko elo 
            var minElo:Number=0;
            var minElosCount:Number=0;
            for(var tg:Number=0;tg<words.length;tg++)
            {
                if(words[tg].Elo<minElo)
                {
                     minElo=words[tg].Elo;   
                }                                    
            }
            for(var tht:Number=0;tht<words.length;tht++)
            {
                minElosCount+=(words[tht].Elo==minElo)?1:0;                      
            }
            //random duma
            var randWord:Number=GameStructuresGenerator.GenerateRandomNumber(0,minElosCount-1);
            var minWordConcat:Number=0;
            //izbirame duma
            for(var thtg:Number=0;thtg<words.length;thtg++)
            {                        
                if(words[thtg].Elo==minElo)  
                {          
                    if(randWord==minWordConcat)
                    {
                        choisenWords[choisenWordsIndex]=new GameWord(words[thtg].Word,true);            
                        words[thtg].Elo++;
                    }
                    minWordConcat++;
                }
            }
            //choisenWords[choisenWordsIndex].ListIndex=choisenWordsIndex;
        }       
        private function ClearHighScores():void
        {
          for(var highI:Number=0;highI<10;highI++)
          {
              GameHighscores[highI]=GamePlayer.CreateDefaultPlayer();    
          }   
        }
        private function LoadHighScores():void
        {
               var highScoreStorage:SharedObject = SharedObject.getLocal( sharedObjectId );
               if(highScoreStorage.data.hasData=="true")
               {
                   for(var hjI:Number=0;hjI<10;hjI++)
                   {
                       var playerInfo:GamePlayer;
                       var playerName:String;
                       var playerScore:Number;
                       switch(hjI)
                       {
                          case 0:
                              playerName=highScoreStorage.data.Aname;
                              playerScore=parseInt(highScoreStorage.data.Ascore);
                          break;                         
                          case 1:
                              playerName=highScoreStorage.data.Bname;
                              playerScore=parseInt(highScoreStorage.data.Bscore);
                          break;     
                          case 2:
                              playerName=highScoreStorage.data.Cname;
                              playerScore=parseInt(highScoreStorage.data.Cscore); 
                          break;                         
                          case 3:
                              playerName=highScoreStorage.data.Dname;
                              playerScore=parseInt(highScoreStorage.data.Dscore);                              
                          break;     
                          case 4:
                              playerName=highScoreStorage.data.Ename;
                              playerScore=parseInt(highScoreStorage.data.Escore);                              
                          break;                         
                          case 5:
                              playerName=highScoreStorage.data.Fname;
                              playerScore=parseInt(highScoreStorage.data.Fscore);                              
                          break;     
                          case 6:
                              playerName=highScoreStorage.data.Gname;
                              playerScore=parseInt(highScoreStorage.data.Gscore);                              
                          break;                         
                          case 7:
                              playerName=highScoreStorage.data.Hname;
                              playerScore=parseInt(highScoreStorage.data.Hscore);                              
                          break;     
                          case 8:
                              playerName=highScoreStorage.data.Iname;
                              playerScore=parseInt(highScoreStorage.data.Iscore);                              
                          break;                         
                          default:
                              playerName=highScoreStorage.data.Jname;
                              playerScore=parseInt(highScoreStorage.data.Jscore);                              
                          break;     
                       }
                       if(playerName!=null && playerScore!=0)
                       {
                           playerInfo=new GamePlayer(playerName,playerScore);    
                       }
                       else
                       {
                           playerInfo=GamePlayer.CreateDefaultPlayer();    
                       }
                       GameHighscores[hjI]=playerInfo;    
                   }                   
               }
               else
               {
                   ClearHighScores();   
               }
        }
        private function StartingGame(e:Event):void
        {
          graphics.clear ();          
          //words string container               
          debugStringContainer.width=500;
          debugStringContainer.x=20;
          debugStringContainer.y=20;
          debugStringContainer.height=350;
          this.addChild(debugStringContainer);
          //materiali      
          var li:LoaderInfo = LoaderInfo (e.target);
          var materialAttr:MaterialAttributes = new MaterialAttributes( 
              //new LineAttributes( 0.1, 0x2111BB, 0.1 )
              //new LightAttributes( true, 0.2)
                                ); 
          var materialAttrLight:MaterialAttributes = new MaterialAttributes( 
              //new LineAttributes( 0.1, 0xFFFFFF, 0.1 ),
              new LightAttributes( false, 0.1)
                                ); 
          //var bm:Bitmap = li.content as Bitmap;64
          //var bmd:BitmapData = bm.bitmapData;
          var bmd:BitmapData = new BitmapData (li.content.width, li.content.height, false, 0);
          bmd.draw (li.content);
          var material:BitmapMaterial = new BitmapMaterial( bmd ,materialAttr);//---
          material.setTiling (0.1, 0.1, 0,0);
          material.lightingEnable = true;
          //materiali za bukvi
          letterMats=new Array(31);
          var mat_i_x:Number=0;
          var mat_i_y:Number=0;
          for(var mat_i:Number=0;mat_i<31;mat_i++)
          {
              
              var materialT:BitmapMaterial = new BitmapMaterial( bmd ,materialAttr);
              var tile:Number=0.1;
              if(mat_i_x==8)
              {
                  mat_i_y++;
                  mat_i_x=0;    
              }
              materialT.setTiling (tile,tile, mat_i_x*tile,0.107+ mat_i_y*tile);
              //materialT.lightingEnable = true;
              letterMats[mat_i]=materialT;
              mat_i_x++;
          }
          var materialPointer:Material = new ColorMaterial( 0x000080 ,0.6,materialAttrLight);
          //materialPointer.setTiling (0.1, 0.1, 0,0);
          //materialPointer.lightingEnable = true;     
          pointerAppear=new Appearance(materialPointer);
          //letterMat = new Appearance( materialT );  
          cubeMat = new Appearance(material);  
          //inicializirane na kamerata za scenata
          //suzdavame game pool
          gamePool=GameStructuresGenerator.GenerateGamePool(GAME_POOL_X,GAME_POOL_Y,GAME_POOL_Z);                    
          LoadWords();
          //storage          
          //visoki resultati          
          GameHighscores=new Array(10);
          //zaregdane na visoki rezultati tuk
          LoadHighScores();
          //scena
          sceneGroup= GenerateSceneGroup();    
          var gameCam:GameCamera=new GameCamera(VIEWPORT_WIDTH,VIEWPORT_HEIGHT);
          gameCam.Position(-40,190,-40);
          gameCam.LookAt(50,50,50);
          sceneCamera=gameCam.GetCameraInstance();
          scene = new Scene3D( "scene", this, sceneCamera, sceneGroup );   
          //render subitiya          
          addEventListener( Event.ENTER_FRAME, UpdateFrame);          
          stage.addEventListener (KeyboardEvent.KEY_DOWN, keyPressedHandler);
          stage.addEventListener (KeyboardEvent.KEY_UP, keyReleasedHandler);
          stage.quality="low";
        }
        
        private var pointerAppear:Appearance;
        private var generateNewLetter:Boolean=true;
        private var letterSCoordinates:GameGeometryPoint;
        private var letterCoordinates:GameGeometryPoint=new GameGeometryPoint(0,0,0);
        private var letterSteps:Number=1;
        private var frameDelay:Number=0;
        private var ceilFreeCells:Number=0;
        private var GameIsOver:Boolean=true;
        private var RandIndex:Number=0;
        private var gravityFactor:Number=0.25;
        private var accume:Number=0;
        private var currentLetter:String="a";
        private var isPaused:Boolean=false;
        
        private function GoLeft():void
        {
              if(letterCoordinates.X>0)
                {
                    if(gamePool[letterCoordinates.X-1][letterCoordinates.Y][letterCoordinates.Z].IsSet==false
                    && gamePool[letterCoordinates.X-1][letterCoordinates.Y-1][letterCoordinates.Z].IsSet==false)
                    {
                        letterCoordinates.X-=1;
                        gamePool[letterSCoordinates.X][letterSCoordinates.Y][letterSCoordinates.Z].Geometry.x-=LETTER_CUBE_STEP; 
                    }
                }
        }

        private function GoRight():void
        {
            if(letterCoordinates.X<GAME_POOL_X-2)
                {
                    if(gamePool[letterCoordinates.X+1][letterCoordinates.Y][letterCoordinates.Z].IsSet==false
                    && gamePool[letterCoordinates.X+1][letterCoordinates.Y-1][letterCoordinates.Z].IsSet==false)
                    {
                        letterCoordinates.X+=1;
                        gamePool[letterSCoordinates.X][letterSCoordinates.Y][letterSCoordinates.Z].Geometry.x+=LETTER_CUBE_STEP; 
                    }
                }
        }
        
        private function GoUp():void
        {
                if(letterCoordinates.Z<GAME_POOL_Z-2)
                {
                    if(gamePool[letterCoordinates.X][letterCoordinates.Y][letterCoordinates.Z+1].IsSet==false
                    && gamePool[letterCoordinates.X][letterCoordinates.Y-1][letterCoordinates.Z+1].IsSet==false)
                    {
                        letterCoordinates.Z+=1;
                        gamePool[letterSCoordinates.X][letterSCoordinates.Y][letterSCoordinates.Z].Geometry.z+=LETTER_CUBE_STEP; 
                    }
                }
        }
        
        private function GoDown():void
        {
                if(letterCoordinates.Z>0)
                {
                    if(gamePool[letterCoordinates.X][letterCoordinates.Y][letterCoordinates.Z-1].IsSet==false
                    && gamePool[letterCoordinates.X][letterCoordinates.Y-1][letterCoordinates.Z-1].IsSet==false)
                    {
                    letterCoordinates.Z-=1;
                    gamePool[letterSCoordinates.X][letterSCoordinates.Y][letterSCoordinates.Z].Geometry.z-=LETTER_CUBE_STEP; 
                    }
                }
        }
        
        private function PrevMenuItem():void
        {
           if(menuIndex>0)
           {
               menuIndex--;     
           }
           else
           {
               menuIndex=menuItemsCount-1;     
           }
        }
        private function NextMenuItem():void
        {
           if(menuIndex<menuItemsCount-1)
           {
               menuIndex++;     
           }
           else
           {
               menuIndex=0;    
           }
        }
        
        private function keyPressedHandler (event:KeyboardEvent):void
        {
            if(GameIsOver==false)
            {
                switch (event.keyCode)
                {
                    case Keyboard.NUMPAD_6 || Keyboard.RIGHT :
                            if(isPaused==false)
                            {            
                                GoRight();
                            }
                            else
                            {
                               NextMenuItem();
                            }
                        break;
                    case Keyboard.NUMPAD_4 || Keyboard.LEFT:                        
                            if(isPaused==false)
                            {     
                               GoLeft();
                            }
                            else
                            {
                                 PrevMenuItem();   
                            }
                        //debugStringContainer.appendText("\n 6e odim na levo");
                        break;
                    case Keyboard.NUMPAD_8 || Keyboard.UP:
                            if(isPaused==false)
                            {     
                                GoUp();
                            }
                            else
                            {
                                PrevMenuItem();    
                            }
                        break;
                    case Keyboard.NUMPAD_2 || Keyboard.DOWN:
                        if(isPaused==false)
                            {     
                                GoDown();
                            }
                            else
                            {
                                NextMenuItem();
                            }
                        break;
                    case Keyboard.NUMPAD_5 || Keyboard.CONTROL:
                        if(isPaused==false)
                        {                     
                            if(accume==int(accume))
                            {                    
                            gravityFactor=1;                    
                            }
                        }
                        break;
                    case Keyboard.SPACE:
                        if(isPaused)
                        {
                            isPaused=false;    
                        }
                        else
                        {
                            isPaused=true;    
                        }
                    break;       
                    case Keyboard.ENTER:                    
                        isMenuItemActivated=isPaused;                        
                    break;                                                                 
                }
            }
            else
            {
                switch(event.keyCode)
                {
                      case Keyboard.NUMPAD_6 || Keyboard.RIGHT :
                               NextMenuItem();
                        break;
                    case Keyboard.NUMPAD_4 || Keyboard.LEFT:                        
                                 PrevMenuItem();   
                        break;
                    case Keyboard.NUMPAD_8 || Keyboard.UP:
                                PrevMenuItem();    
                        break;
                    case Keyboard.NUMPAD_2 || Keyboard.DOWN:
                                NextMenuItem();
                        break;
                     case Keyboard.ENTER:
                         isMenuItemActivated=true;
                     break;   
                 }    
            }
        }
          //upravlenie na pause menuto
        private var menuIndex:Number=0;
        private var isMenuItemActivated:Boolean;
        private var menuItemsCount:Number=2;
        private function ManageMainMenu():void
        {
                var menuString:String="";
                var nl:String="\n";
                switch(menuIndex)
                {                    
                    case 1:
                        menuString+="[] нов гейм"+nl;
                        menuString+="[-] високи резултати";
                        if(isMenuItemActivated==true)
                        {
                            //RegisterHighScore=true;
                            ShowHighScores=true;    
                        }
                    break;
                    default:
                        menuString+="[-] нов гейм"+nl;
                        menuString+="[] високи резултати";
                        if(isMenuItemActivated==true)
                        {
                            GameIsOver=false;  
                        }
                    break;
                }
                MenuItemsString.text=menuString;
        }
        
        private function ManagePauseMenu():void
        {
                var menuString:String="";
                var nl:String="\n";
                switch(menuIndex)
                {                    
                    case 1:
                        menuString+="[] продължи играта"+nl;
                        menuString+="[-] прекрати играта";
                        if(isMenuItemActivated==true)
                        {
                            GameIsOver=true;    
                        }
                    break;
                    default:
                        menuString+="[-] продължи играта"+nl;
                        menuString+="[] прекрати играта";
                        if(isMenuItemActivated==true)
                        {
                            isPaused=false;    
                        }
                    break;
                }
                MenuItemsString.text=menuString;
        }
        
        private function isDestroyingLetter(X:Number,Y:Number,Z:Number):Boolean
        {
              var toRet:Boolean=false;
              var letterCubeId:String="dm_cube_"+X+"_"+Y+"_"+Z;
              if(sceneGroup.getChildByName(letterCubeId)!=null)
              {
                  Box(sceneGroup.getChildByName(letterCubeId)).y+=LETTER_CUBE_STEP/2;
                  gamePool[X][Y][Z]=new PoolPosition();
                      if(Box(sceneGroup.getChildByName(letterCubeId)).y>GAME_POOL_Y*LETTER_CUBE_STEP)
                      {
                          sceneGroup.removeChildByName(letterCubeId);    
                      }
                toRet=true;                      
              }
              return toRet;
        }
        
        private function keyReleasedHandler (event:KeyboardEvent):void
        {
            switch (event.keyCode)
            {
                case Keyboard.NUMPAD_5 || Keyboard.CONTROL:
                    if(isPaused==false)
                    {     
                        gravityFactor=0.25;  
                    }
                    break;
                    case Keyboard.ENTER:                    
                        isMenuItemActivated=false;                        
                    break;
                    
            }
        }
        
        private var letterPointer:GameStaticCube;
        
        private function GenerateSceneGroup():Group {
          var g:Group = new Group();          

          //dobaviane na geometriya v scenata
          for(var ix:Number=0;ix<GAME_POOL_X;ix++)
          {
              for(var iy:Number=0;iy<GAME_POOL_Y;iy++)
              {
                  for(var iz:Number=0;iz<GAME_POOL_Z;iz++)
                  {
                      if(gamePool[ix][iy][iz].IsSet==true)
                      {
                          gamePool[ix][iy][iz].Geometry.appearance=cubeMat;
                          g.addChild(gamePool[ix][iy][iz].Geometry);    
                      }
                  }
              }    
          }          
          
          //pointer
          letterPointer=new GameStaticCube("dc_letterPointer");
          letterPointer.Geometry.appearance=pointerAppear;       
          g.addChild(letterPointer.Geometry);
          //menu items
          testl.x=-50;
          testl.y=-50;
          testl.z=-50;
          testl.enableNearClipping=false;
          var randLetteryd:Number=GameStructuresGenerator.GenerateRandomNumber(0,29);
          testl.appearance=new Appearance(letterMats[randLetteryd]);//cubeMat;
          g.addChild(testl);
          return g;
        }
        
        private var testl:Box=new Box("menuBoxi",20,20,20);
        private var hor_str:String="";
        private var vert_str:String="";
        private var GamePoints:Number=0;
        private var debugHelp:Number=0;
        private var doDestroyCols:Boolean=false;
        //private var ColsToDestroy:Array=new Array(GAME_POOL_X*GAME_POOL_Z);
        //narisuavai lenta za menu
        private var MenuItemsString:TextField;
        
        private function DrawMenuStrip(menuCaption:String,prefix:String):void
        {
           if(getChildByName(prefix+"_"+"menuBar")==null)
              {
              var menuLabel:TextField=new TextField;
              var textFormat:TextFormat=new TextFormat;
              var menuItemsTF:TextFormat=new TextFormat;
              textFormat.size=40;
              menuItemsTF.size=18;
              //izbor - publi4ni
              MenuItemsString=new TextField;
              MenuItemsString.text="";
              MenuItemsString.width=VIEWPORT_WIDTH;
              MenuItemsString.height=100;
              MenuItemsString.x=15;
              MenuItemsString.textColor= 0xEEEEEE;
              MenuItemsString.defaultTextFormat=menuItemsTF;
              MenuItemsString.name=prefix+"_"+"menuItems";
              MenuItemsString.y=VIEWPORT_HEIGHT-50;
              //zaglavie na lenta
              menuLabel.name=prefix+"_"+"menuCaption";
              menuLabel.textColor= 0xFFFFFF;
              menuLabel.defaultTextFormat=textFormat;
              menuLabel.text=menuCaption;
             
              menuLabel.width=VIEWPORT_WIDTH;
              menuLabel.height=100;              
              var rectangle:Shape = new Shape; 
              rectangle.name=prefix+"_"+"menuBar";              
              rectangle.graphics.beginFill(0x000000,0.7); 
              rectangle.graphics.drawRect(0, VIEWPORT_HEIGHT-100, VIEWPORT_WIDTH,100); 
              rectangle.graphics.endFill(); 
              menuLabel.x=5;
              menuLabel.y=VIEWPORT_HEIGHT-95;
              addChild(rectangle); 
              addChild(menuLabel);
              addChild(MenuItemsString); 
              //drawMenuBar=false;
              } 
        }
        
        //iztrii lenta za menu
        private function DestroyMenuStrip(prefix:String):void
        {
              if(getChildByName(prefix+"_"+"menuBar")!=null)
              {
                  removeChild(getChildByName(prefix+"_"+"menuBar"));
                  removeChild(getChildByName(prefix+"_"+"menuCaption")); 
                  removeChild(getChildByName(prefix+"_"+"menuItems")); 
                  menuIndex=0;
                  isMenuItemActivated=false;
              }    
        }
        //iz4ertai pause menuto        
        private function DrawPauseMenu():void
        {
            DrawMenuStrip("ПАУЗА","pause");         
        }
        
        //yasno za kvo e :)
        private function DestroyPauseMenu():void
        {
            DestroyMenuStrip("pause");
        }
        
        private function DestroyMainMenu():void
        {
            DestroyMenuStrip("main");
        }
                
        private var lastYPosition:Number=0;
        //info panel
        private var pointsDisplay:TextField;
        private var wordsDisplay:TextField;
        
        private function DrawInfoPanel(panelId:String,posX:Number,posY:Number,width:Number,height:Number,caption:String,doPoints:Boolean):void
        {
            var panelIdD:String=panelId+"_rect";
            if(getChildByName(panelIdD)==null)
            {
              var menuLabel:TextField=new TextField;
              var textFormat:TextFormat=new TextFormat;
              var menuItemsTF:TextFormat=new TextFormat;
              textFormat.size=30;
              menuItemsTF.size=22;
              //izbor - publi4ni
              if(doPoints==true)
              {
                  pointsDisplay=new TextField;
                  pointsDisplay.text="";
                  pointsDisplay.width=width;
                  pointsDisplay.height=height;
                  pointsDisplay.x=posX+5;
                  pointsDisplay.textColor= 0xEEEEEE;
                  pointsDisplay.defaultTextFormat=menuItemsTF;
                  pointsDisplay.name=panelId+"_content";
                  pointsDisplay.y=posY+32;
              }
              else
              {
                  wordsDisplay=new TextField;  
                  wordsDisplay.text="";
                  wordsDisplay.width=width;
                  wordsDisplay.height=height;
                  wordsDisplay.x=posX+5;
                  wordsDisplay.textColor= 0xEEEEEE;
                  wordsDisplay.defaultTextFormat=menuItemsTF;
                  wordsDisplay.name=panelId+"_content";
                  wordsDisplay.y=posY+32; 
              }
              //zaglavie na lenta
              menuLabel.name=panelIdD+"_"+"caption";
              menuLabel.textColor= 0xFFFFFF;
              menuLabel.defaultTextFormat=textFormat;
              menuLabel.text=caption;             
              menuLabel.width=width;
              menuLabel.height=height;              
              var rectangle:Shape = new Shape; 
              rectangle.name=panelIdD;              
              rectangle.graphics.beginFill(0x000000,0.7); 
              rectangle.graphics.drawRect(posX,posY, width,height); 
              rectangle.graphics.endFill(); 
              menuLabel.x=posX+5;
              menuLabel.y=posY;
              addChild(rectangle); 
              addChild(menuLabel);
              if(doPoints==true)
              {
                  addChild(pointsDisplay);      
              }
              else
              {
                  addChild(wordsDisplay);                 
              }
            }
        }
        
        //destroy info panel
        private function DestroyInfoPanel(panelId:String):void
        {
            var panelIdD:String=panelId+"_rect";
            if(getChildByName(panelIdD)!=null)
            {
                removeChild(getChildByName(panelIdD));
                removeChild(getChildByName(panelId+"_caption"));                            
            }
        }
        
        private function RenderGameScene():void
        {             
                  ceilFreeCells=0;                                                               
                  var str_test:String="testing";                  
                  DrawInfoPanel("pointsPanel",0,0,120,65,"точки :",true);
                  DrawInfoPanel("wordsPanel",VIEWPORT_WIDTH-120,0,120,165,"думи :",false);
                  pointsDisplay.text=GamePoints.toString();                     
                  debugStringContainer.appendText("\n");                                                              
                  //GamePoints=0;            
                  //proverka za krai na igrat              
                  for(var ix:Number=0;ix<GAME_POOL_X;ix++)
                     {
                         //debugStringContainer.appendText("\n");    
                         for(var iy:Number=0;iy<GAME_POOL_Z;iy++)
                         {
                             var isCellSet:Boolean=gamePool[ix][GAME_POOL_Y-1][iy].IsSet;
                             //debugStringContainer.appendText(" "+isCellSet);
                             ceilFreeCells+=(!isCellSet)?1:0;    
                         }    
                     }
                  if(ceilFreeCells==0)
                  {
                      GameIsOver=true;    
                  }   
                  wordsDisplay.text="";   
                  for(var l:Number=0;l<CHOISEN_WORDS_COUNT;l++)
                  {
                      //if(choisenWords[l].IsFinished==true)
                      //{
                          if(choisenWords[l].IsCompleted==true)
                          {
                              GamePoints+=100;
                              ChooseNewWord(l);                              
                              //choisenWords[l]=new GameWord(words[words.length-1].Word,true);
                              doDestroyCols=true;
                          }
                      //}           
                      wordsDisplay.appendText(choisenWords[l].Word+"\n");       
                      //debugStringContainer.appendText("дума "+String(l+1)+" : "+choisenWords[l].Word+"\n");                                                                                    
                  }                  
                  //debugStringContainer.appendText(""+gamePool[1][GAME_POOL_Y-1][0].IsSet);
                  if(generateNewLetter==true)//generirane na novo par4e   
                  {                      
                      if(doDestroyCols==true)
                      {
                        var tempBool:Boolean=false;
                        for(var gobx:Number=0;gobx<GAME_POOL_X;gobx++)
                        {
                           for(var goby:Number=0;goby<GAME_POOL_Z;goby++)
                            {
                                if(GameWord.ColsToDestroy[gobx][goby]==true)
                                {
                                    var destFlag:Boolean=isDestroyingLetter(gobx,lastYPosition,goby);
                                    for(var upCol:Number=lastYPosition+1;upCol<GAME_POOL_Y;upCol++)
                                    {
                                        var temp_bool:Boolean=isDestroyingLetter(gobx,upCol,goby);
                                    }
                                    tempBool=(destFlag==true)?destFlag:tempBool;
                                }
                            } 
                        } 
                        doDestroyCols=tempBool;
                      }
                      else
                      {
                          do
                          {
                          currentLetter=choisenWords[0].ReturnLetter();//alphabeth[choisenLetterIndex].Letter;
                          if(currentLetter=="z")
                          {
                              for(var newKol:Number=0;newKol<5;newKol++)
                              {
                                  ChooseNewWord(newKol);
                              }    
                          }
                          }
                          while(currentLetter=="z");
                          //informaciya za generirane na novo par4e              
                          RandIndex=GameStructuresGenerator.GenerateRandomNumber(0,ceilFreeCells);                 
                          var xStart:Number=-3;
                          var yStart:Number=GAME_POOL_Y-1;
                          var zStart:Number=-3;
                          var k:Number=0;
                          for(var jx:Number=0;jx<GAME_POOL_X;jx++)
                          {
                              var kBroken:Boolean=false;
                              for(var jy:Number=0;jy<GAME_POOL_Z;jy++)
                              {
                                  var IsCellSet:Boolean=gamePool[jx][GAME_POOL_Y-1][jy].IsSet;
                                  if(!IsCellSet)
                                  {
                                       if(k==RandIndex)
                                       {
                                           xStart=jx;
                                           zStart=jy;
                                           kBroken=true; 
                                           break;   
                                       }
                                       k++;   
                                  }    
                              } 
                              if(kBroken==true)
                              {
                                break;   
                              }   
                          }
                          var letter:GameLetterCube=GameStructuresGenerator.GenerateLetterBox(xStart,zStart);
                          letter.Geometry.appearance=new Appearance(letterMats[GameLetter.LetterToIndex(currentLetter)]);
                          letter.IsSet=false;
                          gamePool[xStart][yStart][zStart]=letter;
                          letterSteps=1;
                          letterSCoordinates=new GameGeometryPoint(xStart,yStart,zStart);
                          letterCoordinates=new GameGeometryPoint(xStart,yStart,zStart);
                          sceneGroup.addChild(gamePool[xStart][yStart][zStart].Geometry);                      
                          generateNewLetter=false;
                      }
                  }
                  else if(gamePool[letterCoordinates.X][letterCoordinates.Y-1][letterCoordinates.Z].IsSet==false)//ako par4eto ne e popadnalo varhu drugo
                  {
                      var boogie:Number=CUBE_EDGE_LENGTH+GAME_POOL_MARGIN;
                      var letterStep:Number=gravityFactor;//normalno 6te e 0.25;pri forsirane 0.5 triabva da e 4ast ot 1
                      gamePool[letterSCoordinates.X][letterSCoordinates.Y][letterSCoordinates.Z].Geometry.y-=letterStep;             
                      accume+=letterStep;    
                      var pointerY:Number=1;
                      for(var pointerYC:Number=1;pointerYC<GAME_POOL_Y-1;pointerYC++)
                      {
                          if(gamePool[letterCoordinates.X][pointerYC][letterCoordinates.Z].IsSet==false)
                          {
                              pointerY=pointerYC;
                              break;    
                          }
                      }                      
                      letterPointer.Position(gamePool[letterSCoordinates.X][letterSCoordinates.Y][letterSCoordinates.Z].Geometry.x,
                      (pointerY+1)*boogie,//y                  
                      gamePool[letterSCoordinates.X][letterSCoordinates.Y][letterSCoordinates.Z].Geometry.z);                                  
                      //var acumeInt:Number=int(accume);
                      if(accume>=boogie)//gamePool[letterSCoordinates.X][letterSCoordinates.Y][letterSCoordinates.Z].Geometry.y%boogie==0)
                      {
                          letterCoordinates.Y--;
                          accume=0;
                      }
                  }
                  else//ako par4eto e padnalo varhu  drugo 6te triabva da generirame novo v sledva6tiya kadur
                  {
                     gamePool[letterCoordinates.X][letterCoordinates.Y][letterCoordinates.Z].IsSet=true;
                     gamePool[letterSCoordinates.X][letterSCoordinates.Y][letterSCoordinates.Z].Geometry.name="dm_cube_"+letterCoordinates.X+"_"+letterCoordinates.Y+"_"+letterCoordinates.Z;                     
                     gamePool[letterCoordinates.X][letterCoordinates.Y][letterCoordinates.Z].Letter=currentLetter;
                     hor_str="";
                     vert_str="";
                        for(var linX:Number=0;linX<GAME_POOL_X;linX++)
                        {                                                       
                                                     
                            hor_str+="/"; 
                            vert_str+="/";  
                            for(var linY:Number=0;linY<GAME_POOL_Y;linY++)
                            {
                                if(gamePool[linX][letterCoordinates.Y][linY].Letter!="wall")
                                {
                                    hor_str+=gamePool[linX][letterCoordinates.Y][linY].Letter; 
                                }
                                if(gamePool[linY][letterCoordinates.Y][linX].Letter!="wall")
                                {
                                    vert_str+=gamePool[linY][letterCoordinates.Y][linX].Letter;    
                                }
                            }
                        }
                     GameWord.ColsToDestroy=GameStructuresGenerator.GenerateGamePoolFlagSurface(GAME_POOL_X,GAME_POOL_Z);        
                     for(var wordIk:Number=0;wordIk<5;wordIk++)
                     {                        
                        choisenWords[wordIk].CheckWordCompletion(hor_str,vert_str);                     
                     }                     
                     generateNewLetter=true;
                     lastYPosition=letterCoordinates.Y;
                  }                       
        }     
        //cvc
        //scena za igra
        private function DestroyAllCols():void
        {
            for(var hx:Number=0;hx<GAME_POOL_X;hx++)
            {
                for(var hy:Number=0;hy<GAME_POOL_Y;hy++)
                {                    
                    for(var hz:Number=0;hz<GAME_POOL_Z;hz++)
                    {
                        var letterCubeId:String="dm_cube_"+hx+"_"+hy+"_"+hz;
                        if(sceneGroup.getChildByName(letterCubeId)!=null)
                        {
                             sceneGroup.removeChildByName(letterCubeId);   
                             gamePool[hx][hy][hz]=new PoolPosition();
                        }                        
                    }    
                }    
            }            
        }
        
        private function CreateInGameScene():void
        {                                             
            /*sceneGroup=null;
            sceneGroup=GenerateSceneGroup();*/
            GameWord.ColsToDestroy=null;
            GameWord.Alphabeth=null;
            LoadWords();
            sceneCamera.lookAt(50,50,50);
            GamePoints=0;
            accume=0;
            generateNewLetter=true;
            doDestroyCols=false;      
            DestroyAllCols();      
            /*gameCam.Position(-40,190,-40);
            gameCam.LookAt(50,50,50);*/
            sceneCamera.x=-40;
            sceneCamera.y=190;
            sceneCamera.z=-40;
            sceneCamera.lookAt(50,50,50);
            isPaused=false;            
        }
        
        //glavno menu
        private function DrawMainMenu():void
        {            
            DrawMenuStrip("ГЛАВНО МЕНЮ","main");
        }
        
        //scena za menu
        private function CreateMenuScene():void
        { 
            sceneCamera.x=0;
            sceneCamera.y=0;
            sceneCamera.z=0;                      
            sceneCamera.lookAt(-50,-50,-50);                   
        }
        
        private var isMenu:Boolean=true;
        private var isGame:Boolean=true;
        private var ShowHighScores:Boolean=false;
        private var RegisterHighScore:Boolean=false;
        //ShowHighScoresMenu()
        
        private function ShowHighScoresMenu():void
        {
            DrawMenuStrip("ВИСОКИ РЕЗУЛТАТИ","highscores");    
        }
        
        private function DestroyHighScoresMenu():void
        {
           DestroyMenuStrip("highscores");
        }
        
        //ShowRegisterScoreMenu()
        private var nameInput:TextField;
        
        private function ShowRegisterScoreMenu():void
        {
            DrawMenuStrip("НОВ ВИСОК РЕЗУЛТАТ!","newHighscore");
            if(getChildByName("newHighNameInput")==null)
            { 
                nameInput=new TextField;
                var formath:TextFormat=new TextFormat;      
                formath.size=18;          
                nameInput.type=TextFieldType.INPUT;
                nameInput.name="newHighNameInput";
                nameInput.text="";
                nameInput.maxChars=16;
                nameInput.defaultTextFormat=formath;
                nameInput.textColor=0xEEEEEE;
                nameInput.x=75;
                nameInput.y=VIEWPORT_HEIGHT-50;
                nameInput.width=VIEWPORT_WIDTH-75;
                nameInput.height=30;
                addChild(nameInput);
            }
        }
        
        private function DestroyRegisterScoreMenu():void
        {
            if(getChildByName("newHighNameInput")!=null)
            {
                removeChild(getChildByName("newHighNameInput"));
            }
            DestroyMenuStrip("newHighscore");              
        }
        
        private var sharedObjectId:String="_ruska_save";
        
        private function PushInStorage():void
        {            
           var highScoreStorage:SharedObject = SharedObject.getLocal( sharedObjectId );
           highScoreStorage.data.hasData="true";
           highScoreStorage.data.Aname=GameHighscores[0].Name;
           highScoreStorage.data.Ascore=String(GameHighscores[0].Score);
           highScoreStorage.data.Bname=GameHighscores[1].Name;
           highScoreStorage.data.Bscore=String(GameHighscores[1].Score);
           highScoreStorage.data.Cname=GameHighscores[2].Name;
           highScoreStorage.data.Cscore=String(GameHighscores[2].Score);
           highScoreStorage.data.Dname=GameHighscores[3].Name;
           highScoreStorage.data.Dscore=String(GameHighscores[3].Score);
           highScoreStorage.data.Ename=GameHighscores[4].Name;
           highScoreStorage.data.Escore=String(GameHighscores[4].Score);
           highScoreStorage.data.Fname=GameHighscores[5].Name;
           highScoreStorage.data.Fscore=String(GameHighscores[5].Score);
           highScoreStorage.data.Gname=GameHighscores[6].Name;
           highScoreStorage.data.Gscore=String(GameHighscores[6].Score);
           highScoreStorage.data.Hname=GameHighscores[7].Name;
           highScoreStorage.data.Hscore=String(GameHighscores[7].Score);
           highScoreStorage.data.Iname=GameHighscores[8].Name;
           highScoreStorage.data.Iscore=String(GameHighscores[8].Score);
           highScoreStorage.data.Jname=GameHighscores[9].Name;
           highScoreStorage.data.Jscore=String(GameHighscores[9].Score);
           highScoreStorage.flush();   
        }
        
        //ManageRegisterScoreMenu()
        private var userName:String="";
        private var errorString:String="";
        
        private function ManageRegisterScoreMenu():void
        {
                var menuString:String="";
                var nl:String="\n";                
                switch(menuIndex)
                {                    
                    case 1:
                        stage.focus=null;     
                        nameInput.text="";
                        //validaciya                                       
                        menuString+="[] име: "+userName+nl;
                        if(errorString.length>0)
                        {
                            menuString+=errorString;
                            menuIndex=0;
                        }                        
                        else
                        {
                            menuString+="[-] напред";
                        }                        
                        if(isMenuItemActivated==true && errorString.length==0)
                        {
                            RegisterHighScore=false;
                            ShowHighScores=true;
                            AddHighScore(userName,GamePoints);
                        }
                    break;
                    default:
                        stage.focus=nameInput;    
                        userName=nameInput.text;     
                        if(userName.length<4)
                        {
                            errorString="[!] името трябва да има поне 4 символа ";
                        } 
                        else
                        {
                            errorString="";    
                        }                 
                        menuString+="[-] име: "+nl;
                        if(errorString.length>0)
                        {
                             menuString+=errorString;   
                        }
                        else
                        {         
                            menuString+="[] напред";
                        }
                        //nameInput.focusRect();
                        /*if(isMenuItemActivated==true)
                        {
                            ShowHighScores=false;    
                        }*/
                    break;
                }
                MenuItemsString.text=menuString;   
        }
        //DrawHighScores();   
        private var highScoreBarPrefix:String="hsb_";
        
        private function DrawHighScores():void
        {
            if(getChildByName(highScoreBarPrefix+String(0))==null)
            {
                var panelX:Number=VIEWPORT_WIDTH/4;
                var panelY:Number=20;     
                var margin:Number=4;
                var scorePanelWidth:Number=50;
                var panelWidth:Number=VIEWPORT_WIDTH/2-(scorePanelWidth+margin);  
                var panelHeight:Number=25;                 
                for(var hScoreI:Number=0;hScoreI<10;hScoreI++)
                {
                   var tFormat:TextFormat=new TextFormat;
                   tFormat.size=15;
                   var playerString:String=String(GameHighscores[hScoreI].Name);
                   var pointsString:String=String(GameHighscores[hScoreI].Score);
                   var hsPanel:TextField=new TextField;
                   var hsScorePanel:TextField=new TextField;
                   hsScorePanel.width=scorePanelWidth;
                   hsScorePanel.height=panelHeight;
                   hsScorePanel.defaultTextFormat=tFormat;
                   hsScorePanel.y=panelY+((hScoreI*(panelHeight+margin)));
                   hsScorePanel.x=panelX+panelWidth+margin;
                   hsScorePanel.background=true;
                   hsScorePanel.textColor=0xEEEEEE;
                   hsScorePanel.backgroundColor=0x000000;
                   hsScorePanel.alpha=0.7;
                   hsScorePanel.text=pointsString;
                   hsScorePanel.name=highScoreBarPrefix+String(hScoreI)+"_sc";
                   //
                   hsPanel.width=panelWidth;
                   hsPanel.height=panelHeight;
                   hsPanel.y=panelY+((hScoreI*(panelHeight+margin)));
                   hsPanel.background=true;
                   hsPanel.defaultTextFormat=tFormat;
                   hsPanel.textColor=0xEEEEEE;
                   hsPanel.backgroundColor=0x000000;
                   hsPanel.alpha=0.7;
                   hsPanel.x=panelX;
                   hsPanel.text=playerString;
                   hsPanel.name=highScoreBarPrefix+String(hScoreI);
                   addChild(hsPanel);    
                   addChild(hsScorePanel);     
                }
            }
        }
        
        private function DeleteHighScoresDrawings():void
        {
            if(getChildByName(highScoreBarPrefix+String(0))!=null)
            {
                for(var delHighI:Number=0;delHighI<10;delHighI++)
                {
                    if(getChildByName(highScoreBarPrefix+String(delHighI))!=null)
                    {
                         removeChild(getChildByName(highScoreBarPrefix+String(delHighI)));
                         removeChild(getChildByName(highScoreBarPrefix+String(delHighI)+"_sc"));
                    }    
                }
            }
        }   
        
        private function IsScoreHigh(score:Number):Boolean          
        {
            var toRet:Boolean=score>=GameHighscores[9].Score && score>0;
            return toRet;   
        }
        
        private function SortHighScores():void
        {
            for(var hI:Number=0;hI<10-1;hI++)
            {
                for(var gI:Number=0;gI<10-hI-1;gI++)
                {
                    if(GameHighscores[gI].Score<GameHighscores[gI+1].Score)
                    {
                        var swap:GamePlayer=GamePlayer.CreateDefaultPlayer();//GameHighscores[gI];
                        swap.Name=GameHighscores[gI].Name;
                        swap.Score=GameHighscores[gI].Score;
                        GameHighscores[gI].Name=GameHighscores[gI+1].Name;
                        GameHighscores[gI].Score=GameHighscores[gI+1].Score;
                        GameHighscores[gI+1].Name=swap.Name;
                        GameHighscores[gI+1].Score=swap.Score;
                    }
                }        
            }    
        }        
        
        private function AddHighScore(player:String,points:Number):void
        {
            if(IsScoreHigh(points)==true)
            {
            GameHighscores[9]=new GamePlayer(player,points);
            }
            SortHighScores();
        }
        
        //ManageHighScores()
        private function ManageHighScores():void
        {
                var menuString:String="";
                var nl:String="\n";
                switch(menuIndex)
                {                    
                    case 1:
                        menuString+="[] към главното меню"+nl;
                        menuString+="[-] заличи резултатите ";
                        if(isMenuItemActivated==true)
                        {
                            ClearHighScores();
                            DeleteHighScoresDrawings();
                            DrawHighScores();
                        }
                    break;
                    default:
                        menuString+="[-] към главното меню "+nl;
                        menuString+="[] заличи резултатите";
                        if(isMenuItemActivated==true)
                        {
                            ShowHighScores=false;    
                            PushInStorage();
                        }
                    break;
                }
                MenuItemsString.text=menuString;
        } 
        
        private function UpdateFrame( event : Event ) : void 
        {                                   
              if(GameIsOver==false)
              {                                                  
                  if(isMenu==true)
                  {
                      CreateInGameScene();
                      isMenu=false;
                  }
                  DestroyMainMenu();
                  //
                  if(isPaused==true)
                  {
                      DrawPauseMenu();       
                      ManagePauseMenu();   
                  }
                  else
                  {                 
                  //iz4ertavame scenata
                  DestroyPauseMenu();
                  RenderGameScene();                  
                  }     
                  isGame=true;       
            }
            else            
            {                                        
                testl.pan+=0.3;
                //testl.Geometry.size=12;             
                DestroyPauseMenu();  
                DestroyInfoPanel("pointsPanel");
                DestroyInfoPanel("wordsPanel");
                if(isGame==true)                
                {
                    if(wordsDisplay!=null)
                    {
                        wordsDisplay.text="";
                    }
                    if(pointsDisplay!=null)
                    {
                        pointsDisplay.text="";
                    }
                    CreateMenuScene();                  
                    if(IsScoreHigh(GamePoints)==true)
                    {
                         RegisterHighScore=true;   
                    }
                    isGame=false;   
                }
                //ekran za populvane na visok rezultat
                if(RegisterHighScore==true)
                {
                      DestroyMainMenu();
                      ShowRegisterScoreMenu();
                      ManageRegisterScoreMenu();
                }
                else
                {
                    //pokazvane na visok rezultat                    
                    if(ShowHighScores==true)
                    {
                        DestroyRegisterScoreMenu();
                        DestroyMainMenu();
                        ShowHighScoresMenu();
                        DrawHighScores();
                        ManageHighScores();                            
                    }
                    //glavno menu
                    else
                    {                         
                        DeleteHighScoresDrawings();
                        DestroyRegisterScoreMenu();
                        DestroyHighScoresMenu();
                        DrawMainMenu();
                        ManageMainMenu();
                    }                    
                }
                isMenu=true;
           }
           scene.render();
        }     

    }
  
}

import flash.media.Sound;
import flash.text.engine.GroupElement;
  
  import flash.display.Loader;
  import flash.display.AVM1Movie;
  import flash.display.Sprite;
  import flash.events.*;
  import flash.ui.*;
  import flash.net.*;
  import flash.text.*;
  import sandy.core.Scene3D;
  import sandy.events.*;
  import sandy.core.data.*;
  import sandy.util.*;
  import sandy.core.scenegraph.*;
  import sandy.materials.*;
  import sandy.materials.attributes.*;
  import sandy.primitive.*;
  //KLASOVE V IGRATA
    //klas za to4ka
    class GameGeometryPoint
    {
        public var X:Number;
        public var Y:Number;
        public var Z:Number;
        public function GameGeometryPoint(x:Number,y:Number,z:Number):void
        {
            X=x;
            Y=y;
            Z=z;
        }
    
    }
    
    //klas za kub4eta v igrata        
    class GameCube
    {
        public var Geometry:Box;
        public var IsSet:Boolean;
        public function Position(x:Number,y:Number,z:Number):void
        {
             Geometry.x=x;
             Geometry.y=y;
             Geometry.z=z;   
        }    
    }
    
    //klas za kub4eta granici
    class GameStaticCube extends GameCube
    {        
        public var Letter:String;
        public function GameStaticCube(objectId:String):void
        {
            Geometry=new Box( objectId, GameApplication.CUBE_EDGE_LENGTH, GameApplication.CUBE_EDGE_LENGTH, GameApplication.CUBE_EDGE_LENGTH);
            Geometry.enableClipping=true;
            Letter="wall";
        }
    }
    
    //klas za prazna poziciya
    class PoolPosition
    {
        public var IsSet:Boolean;
        public var Letter:String;
        public var Location:GameGeometryPoint;
        public function Position(x:Number,y:Number,z:Number):void
        {
            Location=new GameGeometryPoint(x,y,z);    
        }
        public function PoolPosition():void
        {
            Letter="_";    
        }
    }

    //klas za kub4eta s bukva
    class GameLetterCube extends GameCube    
    {
            public var Letter:String;
            public function GameLetterCube(objectId:String)
            {
                Geometry=new Box(objectId,GameApplication.CUBE_EDGE_LENGTH,GameApplication.CUBE_EDGE_LENGTH,GameApplication.CUBE_EDGE_LENGTH);    
                Geometry.enableClipping=true;
            }
            
    }
    
    //klas za kamera
    class GameCamera
    {
       private var _camera:Camera3D;
       public function GameCamera(viewportWidth:Number,viewportHeight:Number):void
       {
           _camera=new Camera3D(viewportWidth,viewportHeight);
       }
       public function Position(x:Number,y:Number,z:Number):void
       {
          _camera.x=x;
          _camera.y=y;
          _camera.z=z;    
       }
       public function LookAt(x:Number,y:Number,z:Number):void
       {
           _camera.lookAt(x,y,z);    
       }
       public function GetCameraInstance():Camera3D
       {
            return _camera;   
       } 
    }
    
//klas za bukvi v igrata
class GameLetter
{
     public var Letter:String;
     public var IsActive:Boolean;
     public var RefNumber:Number=0;
     public function GameLetter(letter:String):void
     {
          Letter=letter;   
          IsActive=true;
     } 
     public static function LetterToIndex(letter:String):Number
     {
         var toRet:Number=-2;
         var alphabethArray:Array=new Array(
         "а","б","в","г","д","е","ж","з","и","й","к","л",
         "м","н","о","п","р","с","т","у","ф","х","ц","ч",
         "ш","щ","ь","ъ","ю","я","z"
         );    
         for(var alphI:Number=0;alphI<alphabethArray.length;alphI++)
         {
             if(letter==alphabethArray[alphI])
             {
                 toRet=alphI;
                 break;    
             }    
         }
         return toRet;
     }    
}

//klas za igra4 v igrata
class GamePlayer
{
    public var Score:Number;
    public var Name:String;
    public function GamePlayer(name:String,score:Number):void
    {    
        Name=name;
        Score=score;
    }    
    public static function CreateDefaultPlayer():GamePlayer
    {
         return new GamePlayer("никой",0);   
    }
}

//klas za dumi v igrata
class GameWord
{
    public var Word:String;
    public static var ColsToDestroy:Array;
    public static var Alphabeth:Array;
    public var IsFinished:Boolean=false;
    public var IsCompleted:Boolean=false;
    public var WordLocationY:Number;
    //
    public var Elo:Number;
    //public var ListIndex:Number=0;
    //public var NumOfFreeLetters:Number;
    public function GameWord(word:String,explode:Boolean=false):void
    {
        Elo=0;
        if(Alphabeth==null)
        {
            Alphabeth=GameStructuresGenerator.GenerateAlphabeth();
        }
        if(ColsToDestroy==null)
        {
            ColsToDestroy=GameStructuresGenerator.GenerateGamePoolFlagSurface(GameApplication.GAME_POOL_X,GameApplication.GAME_POOL_Z);        
        }
        Word=word;
        //IsChecked=false;
        if(explode)
        {
            ExplodeWord();        
        }
    }
    
    private function ExplodeWord():void
    {
        for(var wordLetterI:Number=0;wordLetterI<Word.length;wordLetterI++)
        {
             var letterD:String=Word.charAt(wordLetterI);
             var letterID:Number=GameLetter.LetterToIndex(letterD);
             Alphabeth[letterID].RefNumber++;
             //GameWord.GlobalLetters[GameWord.LetterIndex+wordLetterI]=new GameLetter(Word.charAt(wordLetterI));
             //NumOfFreeLetters++;           
        }
        //GameWord.LetterIndex+=Word.length;           
    }
    
    public function CheckWordCompletion(hor_str:String,vert_str:String):void
    {            
            var toRet:Array;
            var hor:String=hor_str;
            var hor_:String=GameStructuresGenerator.ReverseString(hor_str);
            var vert:String=vert_str;            
            var vert_:String=GameStructuresGenerator.ReverseString(vert_str);    
            var inHorLines:Boolean=GameStructuresGenerator.SubStringInString(Word,hor);
            var inRevHorLines:Boolean=GameStructuresGenerator.SubStringInString(Word,hor_);
            var inVertLines:Boolean=GameStructuresGenerator.SubStringInString(Word,vert);
            var inRevVertLines:Boolean=GameStructuresGenerator.SubStringInString(Word,vert_);
            if(inHorLines)
            {
               IsCompleted=true;    
               var subrIndex:Number=hor.indexOf(Word);                         
               var x:Number=int(subrIndex/7);
               var y:Number=int(subrIndex%7)-1;
               for(var tgx:Number=0;tgx<GameApplication.GAME_POOL_X-1;tgx++)
               {
                   for(var tgy:Number=0;tgy<GameApplication.GAME_POOL_Z-1;tgy++)
                   {
                       if(tgx==x)                       
                       if(tgy>=y && tgy<y+Word.length)
                       {
                           ColsToDestroy[tgx][tgy]=true;                           
                       }                                           
                   }        
               }
            }
            if(inRevHorLines)
            {
               IsCompleted=true;    
               var rSubrIndex:Number=hor_.indexOf(Word);                         
               var rx:Number=5-int(rSubrIndex/7);
               var ry:Number=6-((int(rSubrIndex%7)-1)+Word.length);
               for(var rtgx:Number=0;rtgx<GameApplication.GAME_POOL_X-1;rtgx++)
               {
                   for(var rtgy:Number=0;rtgy<GameApplication.GAME_POOL_Z-1;rtgy++)
                   {
                       if(rtgx==rx)                       
                       if(rtgy>=ry && rtgy<ry+Word.length)
                       {
                           ColsToDestroy[rtgx][rtgy]=true;                           
                       }                                           
                   }        
               }
            }
            if(inVertLines)
            {
                   IsCompleted=true;      
                   var vSubrIndex:Number=vert.indexOf(Word);                         
                   var vx:Number=int(vSubrIndex/7);
                   var vy:Number=int(vSubrIndex%7)-1;
                   for(var vtgx:Number=0;vtgx<GameApplication.GAME_POOL_X-1;vtgx++)
                   {
                       for(var vtgy:Number=0;vtgy<GameApplication.GAME_POOL_Z-1;vtgy++)
                       {
                           if(vtgx==vx)                       
                           if(vtgy>=vy && vtgy<vy+Word.length)
                           {
                               ColsToDestroy[vtgy][vtgx]=true;                           
                           }                                           
                       }        
                   }                          
            }
            if(inRevVertLines)
            {
                   IsCompleted=true;      
                   var rvSubrIndex:Number=vert_.indexOf(Word);                         
                   var rvx:Number=5-int(rvSubrIndex/7);
                   var rvy:Number=6-((int(rvSubrIndex%7)-1)+Word.length);
                   for(var rvtgx:Number=0;rvtgx<GameApplication.GAME_POOL_X-1;rvtgx++)
                   {
                       for(var rvtgy:Number=0;rvtgy<GameApplication.GAME_POOL_Z-1;rvtgy++)
                       {
                           if(rvtgx==rvx)                       
                           if(rvtgy>=rvy && rvtgy<rvy+Word.length)
                           {
                               ColsToDestroy[rvtgy][rvtgx]=true;                           
                           }                                           
                       }        
                   }                          
            }                                         
    }
    
    public function ReturnLetter(deac:Boolean=true):String
    {
        var letterToRet:String="z";
        var numOfFreeLetters:Number=0;
        for(var lettI:Number=0;lettI<Alphabeth.length;lettI++)
        {
            if(Alphabeth[lettI].RefNumber>0)
            {
                numOfFreeLetters++;    
            }    
        }        
        if(numOfFreeLetters>0)
        {
            var randLetterIndex:Number=GameStructuresGenerator.GenerateRandomNumber(0,numOfFreeLetters-1);
            var klo:Number=0;            
            for(var lettSI:Number=0;lettSI<Alphabeth.length;lettSI++)
            {
                   if(Alphabeth[lettSI].RefNumber>0)
                   {
                        if(randLetterIndex==klo)
                        {
                            letterToRet=Alphabeth[lettSI].Letter;
                            if(deac==true)
                            {
                               Alphabeth[lettSI].RefNumber--;
                            }
                            break;            
                        }
                        klo++;   
                   }
            }
        }
        //NumOfFreeLetters=numOfFreeLetters;
        return letterToRet;    
    }
}

//generator za strukturite ot igrata
class GameStructuresGenerator
{
     public static function GenerateGamePool(sizeX:Number,sizeY:Number,sizeZ:Number):Array
     {
         var multArray:Array=new Array(sizeX);
         for(var ix:Number=0;ix<sizeX;ix++)
         {
             multArray[ix]=new Array(sizeY);
             for(var iy:Number=0;iy<sizeY;iy++)
             {
                 multArray[ix][iy]=new Array(sizeZ);
                 for(var iz:Number=0;iz<sizeZ;iz++)
                 {
                        var cubeSize:Number=GameApplication.CUBE_EDGE_LENGTH+GameApplication.GAME_POOL_MARGIN;
                        var posX:Number=((ix+1)*(cubeSize));
                        var posY:Number=((iy+1)*(cubeSize));
                        var posZ:Number=((iz+1)*(cubeSize));                 
                        if( iy==0 || ix==sizeX-1 || iz==sizeZ-1)//ix==sizeX-1 || iz==sizeZ-1
                        {
                        var stCube:GameStaticCube=new GameStaticCube("st_cube"+ix+iy+iz);
                        stCube.Position(posX,posY,posZ);
                        stCube.IsSet=true;
                        multArray[ix][iy][iz]=stCube;
                        }
                        else
                        {
                           var poolPos:PoolPosition=new PoolPosition();
                           poolPos.Position(posX,posY,posZ);
                           poolPos.IsSet=false;    
                           multArray[ix][iy][iz]=poolPos;
                        }
                    
                 }    
             }
         }
         return multArray;
     }
     
     public static function ReverseString(input:String):String
     {
         var toRet:String="";
         for(var str_i:Number=input.length-1;str_i>=0;str_i--)
         {
             toRet+=input.charAt(str_i);             
         }
         return toRet;    
     }
     
     public static function GenerateRandomNumber(min:Number,max:Number):Number
     {
           return Math.ceil(Math.random() * (max - min + 1)) + (min - 1);
     } 
     
     public static function GenerateGamePoolFlagSurface(sizeX:Number,sizeY:Number):Array
     {
         var multArray:Array=new Array(sizeX);
         for(var ix:Number=0;ix<sizeX;ix++)
         {
             multArray[ix]=new Array(sizeY);
             for(var iy:Number=0;iy<sizeY;iy++)
             {
                 multArray[ix][iy]=false;                 
             }
         }
         return multArray;
     }   
     
     public static function GenerateLetterBox(x:Number,y:Number):GameLetterCube
     {
         var pieceX:Number=x;//GenerateRandomNumber(1,GameApplication.GAME_POOL_X-1);
         var pieceY:Number=GameApplication.GAME_POOL_Y-1;
         var pieceZ:Number=y;//GenerateRandomNumber(1,GameApplication.GAME_POOL_Z-1);
         var letterCube:GameLetterCube=new GameLetterCube("dm_cube_"+pieceX+"_"+pieceY+"_"+pieceZ);
         var cubeSize:Number=GameApplication.CUBE_EDGE_LENGTH+GameApplication.GAME_POOL_MARGIN;
         var posX:Number=((pieceX+1)*(cubeSize));
         var posY:Number=((pieceY+1)*(cubeSize));
         var posZ:Number=((pieceZ+1)*(cubeSize));
         letterCube.Position(posX,posY,posZ);
         //letterCube.IsSet=true;
         return letterCube;
     }
     
     public static function GenerateAlphabeth():Array
     {
         var alphabethArray:Array=new Array(
         "а","б","в","г","д","е","ж","з","и","й","к","л",
         "м","н","о","п","р","с","т","у","ф","х","ц","ч",
         "ш","щ","ь","ъ","ю","я"
         );  
         var toRet:Array=new Array(30);         
         for(var bn:Number=0;bn<alphabethArray.length;bn++)
         {
              toRet[bn]=new GameLetter(alphabethArray[bn]);   
         }
         return toRet;
     }
     
     public static function SubStringInString(subInput:String,bigStrInput:String):Boolean
     {         
         var subStringIndex:Number=bigStrInput.indexOf(subInput);
         var toRet:Boolean=false;
         if(subStringIndex>=0)
         {
            toRet=true;     
         }
         return toRet;
     }
}