let csd = GetCurrentScriptDirectory;

  let cx=GetCenterX();
  let cy=GetCenterY();
  let minx=GetClipMinX();
  let miny=GetClipMinY();
  let maxx=GetClipMaxX();
  let maxy=GetClipMaxY();
  let PlayerDefaultX = 224;
  let PlayerDefaultY = 400;
  let BombDefaultNum = 1;

  let backframe = 0;
  let stagenum = 0;
  let stagephase = 0;
  let continuenum = 0;
  let modesave = false;
  let replay = false;

 /* let playmode = 0;
  let playcharacter = 0;
  let difficult = 0;    */

 let EnemyBlue = csd~"zako\img\enemy\faily_blue.png";     LoadGraphic(EnemyBlue);
 let EnemyRed = csd~"zako\img\enemy\faily_red.png";       LoadGraphic(EnemyRed);
 let EnemyGreen = csd~"zako\img\enemy\faily_green.png";   LoadGraphic(EnemyGreen);
 let EnemyYellow = csd~"zako\img\enemy\faily_yellow.png"; LoadGraphic(EnemyYellow);
 let EnemyEx1 = csd~"zako\img\enemy\faily_ex1.png";       LoadGraphic(EnemyEx1);
 let EnemyEx2 = csd~"zako\img\enemy\faily_ex2.png";       LoadGraphic(EnemyEx2);
 let EnemyOther = csd~"zako\img\enemy\other.png";         LoadGraphic(EnemyOther);

 let Title = csd~"zako\img\word\Title.png";              LoadGraphic(Title);
 let Menu = csd~"zako\img\word\Menu.png";                LoadGraphic(Menu);
 let OutText = csd~"zako\img\word\OutText.png";          LoadGraphic(OutText);
 let Continue = csd~"zako\img\word\Continue.png";        LoadGraphic(Continue);
 let spell1 = csd~"zako\img\word\spell001_010.png";      LoadGraphic(spell1);
 let White = csd~"zako\img\word\White.png";              LoadGraphic(White);

  let BGtitle = csd~"BG\titleBG.png";                    LoadGraphic(BGtitle);
  let BG1_1 = csd~"BG\stage1-1.png";                     LoadGraphic(BG1_1);
  let BG1_2 = csd~"BG\stage1-2.png";                     LoadGraphic(BG1_2);

 let bgm0_1 = csd~ "bgm\Title.wav";                       LoadMusic(bgm0_1);
 let bgm0_2 = csd~ "bgm\GameOver.wav";                    LoadMusic(bgm0_2);
 let bgm1_1 = csd~ "bgm\Stage1.wav";                      LoadMusic(bgm1_1);
 let bgm1_2 = csd~ "bgm\Boss1.wav";                       LoadMusic(bgm1_2);
 let bgmSP_1 = csd~ "bgm\SpellPractice1.wav";             LoadMusic(bgmSP_1); 
 
 let seshot1 = csd~ "se\enemyshot01.wav";                LoadSE(seshot1);
 let seshot3 = csd~ "se\enemyshot03.wav";                LoadSE(seshot3); 
 let seshot5 = csd~ "se\enemyshot05.wav";                LoadSE(seshot5); 
 let selaser1 = csd~ "se\enemylaser01.wav";              LoadSE(selaser1); 
 let BossVanish = csd~ "se\BossVanish.wav";              LoadSE(BossVanish);  
 let Concentration = csd~ "se\Concentration.wav";        LoadSE(Concentration);  
 let timecounter1 = csd~ "se\timecounter01.wav";         LoadSE(timecounter1);  
 let timecounter2 = csd~ "se\timecounter02.wav";         LoadSE(timecounter2);  
 let counter = csd~ "se\counter.wav";                    LoadSE(counter);  
 let ghost = csd~ "se\ghost.wav";                        LoadSE(ghost);  
 let break2 = csd~ "se\barrierbreak02.wav";              LoadSE(break2);  
 let push = csd~ "se\Push.wav";                          LoadSE(push);  
 let pi1 = csd~ "se\Pi01.wav";                           LoadSE(pi1);  
 let pi2 = csd~ "se\Pi02.wav";                           LoadSE(pi2); 
 let pi3 = csd~ "se\Pi03.wav";                           LoadSE(pi3); 
 let pi4 = csd~ "se\Pi04.wav";                           LoadSE(pi4); 
 let pi5 = csd~ "se\Pi05.wav";                           LoadSE(pi5); 
 let cancel = csd~ "se\cancel.wav";                      LoadSE(cancel); 

   LoadCommonData; 
  let info_ver = GetCommonDataDefaultEx("","ver",0);
  let PracticeStageFrag = GetCommonDataDefaultEx("","psf",[false]);
  let PracticeCardFrag = GetCommonDataDefaultEx("","pcf",[false]);
  let SpellCardHistory = GetCommonDataDefaultEx("","sch",[0]);
  let GetSpellCard = GetCommonDataDefaultEx("","gsc",[0]);
  let HighestScore = GetCommonDataDefaultEx("","hs",[1000000]);
  let GameOverFrag = GetCommonDataDefaultEx("","gof",false);

  if(info_ver < 0.01){
     loop(104-length(PracticeStageFrag)){
        PracticeStageFrag = PracticeStageFrag~[false];
                }
     loop(104-length(HighestScore)){
         HighestScore = HighestScore~[1000000];
            }
      loop(11-length(PracticeCardFrag)){
        PracticeCardFrag = PracticeCardFrag~[false];
                }
      loop(11-length(SpellCardHistory)){
       SpellCardHistory = SpellCardHistory~[0];
                }
      loop(11-length(GetSpellCard)){
        GetSpellCard = GetSpellCard~[0];
                }
    info_ver = 0.01;
         }
 /*SetCommonDataEx("","mode",0);
 SetCommonDataEx("","dif",0);
 SetCommonDataEx("","chr",0);*/
  SetCommonDataEx("","ver",info_ver);
  SetCommonDataEx("","psf",PracticeStageFrag);
  SetCommonDataEx("","pcf",PracticeCardFrag);
  SetCommonDataEx("","sch",SpellCardHistory);
  SetCommonDataEx("","gsc",GetSpellCard);
  SetCommonDataEx("","hs",HighestScore);
  SetCommonDataEx("","gof",GameOverFrag);

 task BackGraphic{
  alternative(stagenum)
   case(0){
  SetTexture(BGtitle);
  SetRenderState(ALPHA);
 SetAlpha(120-120*cos(backframe/10));
 SetColor(255,255,255);
 SetGraphicAngle(180,0,0);
 SetGraphicScale(0.75,0.75);
 SetViewTo(cx,cy,0);
 SetViewFrom(100,90,0);
 SetPerspectiveClip(10,1000);
 SetGraphicRect(0,0,640,480);
  if(!OnEnemySpell){
 DrawGraphic3D(cx+80,cy-20,-200);
         }
 if(backframe > 180*10){backframe = 180*10;}
        }

  case(1){
  alternative(stagephase)
  case(1){
  SetTexture(BG1_1);
 SetRenderState(ALPHA);
 SetAlpha(255);
 SetColor(255,255,255);
 SetGraphicAngle(135,0,0);
 SetGraphicScale(0.1,2);
 SetViewTo(cx,cy,0);
 SetViewFrom(100,90,0);
 SetPerspectiveClip(10,10000);
 SetGraphicRect(0,0,640*5,960);
 SetFog(1000-backframe/3,1400-backframe/3,0,0,0);
  if(!OnEnemySpell){
 DrawGraphic3D(cx,cy+360-75-backframe/3*sin(45),-200+backframe/3*cos(45));
         }
       }
  case(2){
  SetTexture(BG1_2);
 SetRenderState(ALPHA);
 SetAlpha(backframe/10);
 SetColor(255,255,255);
 SetGraphicAngle(120,0*sin(backframe/5),0);
 SetGraphicScale(1,1);
 SetViewTo(cx,cy,0);
 SetViewFrom(100,90,0);
 SetPerspectiveClip(0,10000);
 SetGraphicRect(0,0,70*60,70*90);
  if(!OnEnemySpell){
 DrawGraphic3D(cx,cy-backframe/2*sin(30),-600+backframe/2*cos(30));
         } 
 if(backframe > 60*36){backframe = 60*36;}
       }
     }

   }

 task DrawOutFrame{
   DrawOutScore;
       task DrawOutScore{
           let c= Obj_Create(OBJ_EFFECT);
             Obj_SetX(c,cx+210);
             Obj_SetY(c,cy-200);
             Obj_SetAngle(c,0);
             ObjEffect_SetAngle(c,0,0,0);
             ObjEffect_SetTexture(c,OutText);
             ObjEffect_SetRenderState(c,ALPHA);
             ObjEffect_SetPrimitiveType(c,PRIMITIVE_TRIANGLESTRIP);
             ObjEffect_SetLayer(c,8);
             ObjEffect_SetScale(c,0.7,0.7);
  let dx = [  0,  0, 70, 70,  0,  0, 70, 70,  0,  0, 70, 70,  0, 0,  70, 70,  0,  0, 70, 70,  0,  0, 70, 70,  0,  0, 70, 70,  0,  0, 70, 70,  0,  0, 70, 70,  0,  0, 70, 70,  0];
  let dy = [  0, 32, 32, 64, 64, 96, 96,128,128,160,160,192,192,224,224,256,256,288,288,320,320,288,288,256,256,224,224,192,192,160,160,128,128, 96, 96, 64, 64, 32, 32,  0,  0];
   ObjEffect_CreateVertex(c,length(dx));
            ascent(let i in 0..length(dx)){
                ObjEffect_SetVertexXY(c,i,dx[i],dy[i]);
                ObjEffect_SetVertexUV(c,i,dx[i],dy[i]+200);
                ObjEffect_SetVertexColor(c,i,255-128*(i%2),255,255,255);
            }    
     
       loop{
   if(GetCommonDataDefaultEx("","mode",0) != 0){

 if(GetCommonDataDefaultEx("","mode",0) < 4){
      let highestscore = truncate(log10(HighestScore[100*GetCommonDataDefaultEx("","chr",0) + 10*GetCommonDataDefaultEx("","stagelist",0) + GetCommonDataDefaultEx("","dif",0)]))+1;
     if(HighestScore[100*GetCommonDataDefaultEx("","chr",0) + 10*GetCommonDataDefaultEx("","stagelist",0) + GetCommonDataDefaultEx("","dif",0)] > 0){
        ascent(a in 0..highestscore){
         Num(cx+360-10*a,cy-200,truncate(HighestScore[100*GetCommonDataDefaultEx("","chr",0) + 10*GetCommonDataDefaultEx("","stagelist",0) + GetCommonDataDefaultEx("","dif",0)]/(10^a))-truncate(HighestScore[100*GetCommonDataDefaultEx("","chr",0) + 10*GetCommonDataDefaultEx("","stagelist",0) + GetCommonDataDefaultEx("","dif",0)]/(10^(a+1)))*10);
            }
         }
    else{Num(cx+360,cy-200,0);}
         }
  else if(truncate(GetCommonDataDefaultEx("","mode",0)) == 4){
     Num(cx+310,cy-200,10);
       let chanum = truncate(log10(SpellCardHistory[GetCommonDataDefaultEx("","spellnow",0)]))+1;
       let getnum = truncate(log10(GetSpellCard[GetCommonDataDefaultEx("","spellnow",0)]))+1;
        if(SpellCardHistory[GetCommonDataDefaultEx("","spellnow",0)] > 0){
        ascent(a in 0..chanum){
         Num(cx+320+10*(chanum-a-1),cy-200,truncate(SpellCardHistory[GetCommonDataDefaultEx("","spellnow",0)]/(10^a))-truncate(SpellCardHistory[GetCommonDataDefaultEx("","spellnow",0)]/(10^(a+1)))*10);
            }
         }
     else{Num(cx+320,cy-200,0);}
        if(GetSpellCard[GetCommonDataDefaultEx("","spellnow",0)] > 0){
        ascent(a in 0..getnum){
         Num(cx+300-10*a,cy-200,truncate(GetSpellCard[GetCommonDataDefaultEx("","spellnow",0)]/(10^a))-truncate(GetSpellCard[GetCommonDataDefaultEx("","spellnow",0)]/(10^(a+1)))*10);
            }
         }
     else{Num(cx+300,cy-200,0);}

     }

        let scorestate = truncate(log10(GetScore))+1;
     if(GetScore > 0){
        ascent(a in 0..scorestate){
         Num(cx+360-10*a,cy-175,truncate(GetScore/(10^a))-truncate(GetScore/(10^(a+1)))*10);
            }
         }
    else{Num(cx+360,cy-175,0);}

 let grazestate = truncate(log10(GetGraze))+1;
      if(GetGraze > 0){
        ascent(a in 0..grazestate){
         Num(cx+300-10*a,cy-35,truncate(GetGraze/(10^a))-truncate(GetGraze/(10^(a+1)))*10);
            }
         }
    else{Num(cx+300,cy-35,0);}

 let pointstate = truncate(log10(GetPoint))+1;
      if(GetPoint > 0){
        ascent(a in 0..pointstate){
         Num(cx+300-10*a,cy-13,truncate(GetPoint/(10^a))-truncate(GetPoint/(10^(a+1)))*10);
            }
         }
    else{Num(cx+300,cy-13,0);}

   if(GetPlayerLife > 1){
     ascent(a in 0..(GetPlayerLife-1)){
      NumStar(cx+260+15*a,cy-132,255,0,200);
         }
       }
   if(GetPlayerBomb > 0){
     ascent(a in 0..(GetPlayerBomb)){
      NumStar(cx+260+15*a,cy-109,0,255,0);
         }
        }
  ShowDifficult(cx+260,cy-230,GetCommonDataDefaultEx("","dif",0));
     } /*if*/
         wait(1);
             }
        }
    
   task Num(x,y,num){
           let c= Obj_Create(OBJ_EFFECT);
             Obj_SetX(c,x);
             Obj_SetY(c,y);
             Obj_SetAngle(c,0);
             ObjEffect_SetAngle(c,0,0,0);
             ObjEffect_SetTexture(c,OutText);
             ObjEffect_SetRenderState(c,ALPHA);
             ObjEffect_SetPrimitiveType(c,PRIMITIVE_TRIANGLESTRIP);
             ObjEffect_SetLayer(c,8);
             ObjEffect_SetScale(c,0.7,0.7);
  let cut = 0;
    alternative(num)
   case(0){cut++;} 
   case(1){cut+=6;} 
   case(2){cut+=12;}
   case(3){cut+=18;}
   case(4){cut+=24;}
   case(5){cut+=30;} 
   case(6){cut+=34;} 
   case(7){cut+=40;}
   case(8){cut+=45;}
   case(9){cut+=50;}
   case(10){cut+=53;}
   others{}
 
  let dx = [18*num+cut,18*num+cut,18*(num+1)+cut,18*(num+1)+cut,18*num+cut];
  let dy = [0,32,32,0,0];
   ObjEffect_CreateVertex(c,length(dx));
            ascent(let i in 0..length(dx)){
                ObjEffect_SetVertexXY(c,i,dx[i]-18*num-cut,dy[i]);
                ObjEffect_SetVertexUV(c,i,dx[i],dy[i]+168);
                ObjEffect_SetVertexColor(c,i,255-128*(i%2),255,255,255);
            }    
    wait(1);  Obj_Delete(c);
        }
   task NumStar(x,y,r,g,b){
           let c= Obj_Create(OBJ_EFFECT);
             Obj_SetX(c,x);
             Obj_SetY(c,y);
             Obj_SetAngle(c,0);
             ObjEffect_SetAngle(c,0,0,0);
             ObjEffect_SetTexture(c,OutText);
             ObjEffect_SetRenderState(c,ALPHA);
             ObjEffect_SetPrimitiveType(c,PRIMITIVE_TRIANGLESTRIP);
             ObjEffect_SetLayer(c,8);
             ObjEffect_SetScale(c,0.7,0.7);
 
  let dx = [0,0,35,35,0];
  let dy = [0,32,32,0,0];
   ObjEffect_CreateVertex(c,length(dx));
            ascent(let i in 0..length(dx)){
                ObjEffect_SetVertexXY(c,i,dx[i],dy[i]);
                ObjEffect_SetVertexUV(c,i,dx[i],dy[i]+30);
                ObjEffect_SetVertexColor(c,i,255-128*(i%2),r,g,b);
            }    
    wait(1);  Obj_Delete(c);
        }
   task ShowDifficult(x,y,level){
           let c= Obj_Create(OBJ_EFFECT);
             Obj_SetX(c,x);
             Obj_SetY(c,y);
             Obj_SetAngle(c,0);
             ObjEffect_SetAngle(c,0,0,0);
             ObjEffect_SetTexture(c,OutText);
             ObjEffect_SetRenderState(c,ALPHA);
             ObjEffect_SetPrimitiveType(c,PRIMITIVE_TRIANGLESTRIP);
             ObjEffect_SetLayer(c,8);
             ObjEffect_SetScale(c,0.7,0.7);
  let dx = [0,0,0,0,0];
  let dy = [0,32,32,0,0];
  let cut = 0;
  let r = 255; let g = 255; let b = 255;
 alternative(level)
  case(0){dx = [0,0,65,65,0]; r = 64; b = 64;}
  case(1){dx = [80,80,180,180,80]; cut = 80; r = 64;}
  case(2){dx = [190,190,260,260,190]; cut = 190; r = 64; g = 64;}
  case(3){dx = [270,270,390,390,270]; cut = 270; g = 0;}
  others{}
  
   ObjEffect_CreateVertex(c,length(dx));
            ascent(let i in 0..length(dx)){
                ObjEffect_SetVertexXY(c,i,dx[i]-cut,dy[i]);
                ObjEffect_SetVertexUV(c,i,dx[i],dy[i]);
                ObjEffect_SetVertexColor(c,i,255-128*(i%2),r,g,b);
            }    
    wait(1);  Obj_Delete(c);
        }
    }

function ContinueSystem(mode1,mode2,mode3){
  let key = 1;
  let arraymode = [mode1,mode2,mode3];
  ForbidShot(true);
  ForbidBomb(true);
  loop{
  if(GetKeyState(VK_DOWN) == KEY_PUSH){key++; PlaySE(counter);}
  else if(GetKeyState(VK_UP) == KEY_PUSH){key--; PlaySE(counter);}
   if(key < 1){key = 3;} if(key > 3){key = 1;}
   Ask(cx-128,cy+40,1);
   Ask(cx-128,cy+70,2);
   Ask(cx-128,cy+100,3);
   if(GetKeyState(VK_SHOT) == KEY_PUSH){
 SetCommonDataEx("","mode",arraymode[key-1]);
      alternative(key)
       case(1){modesave = true;   PlaySE(pi1); wait(0); Retry;}
       case(2){modesave = false;  PlaySE(pi1); wait(0); Retry;}
       case(3){modesave = false;  PlaySE(break2); wait(0); Clear;}
          break;
        }
 SetPlayerX(PlayerDefaultX); SetPlayerY(PlayerDefaultY);
   wait(1);
     }   

     task Ask(x,y,id){
           let c= Obj_Create(OBJ_EFFECT);
             Obj_SetX(c,x);
             Obj_SetY(c,y);
             Obj_SetAngle(c,0);
             ObjEffect_SetAngle(c,0,0,0);
             ObjEffect_SetTexture(c,Continue);
             ObjEffect_SetRenderState(c,ALPHA);
             ObjEffect_SetPrimitiveType(c,PRIMITIVE_TRIANGLESTRIP);
             ObjEffect_SetLayer(c,8);
             ObjEffect_SetScale(c,1,1);
    let dx = [0,0,200,200,0];
    let dy = [32*id,32*(id+1),32*(id+1),32*id,32*id];
    let cut = 32*id;
    let r = 255; let g = 255; let b = 255;
 alternative(id)
  case(0){b = 64;}
  case(1,2,3){
     if(id == key){g = 64; b = 64;}
     else{r = 64; g = 64; b = 64;}
       }
   others{}
  
        ObjEffect_CreateVertex(c,length(dx));
            ascent(let i in 0..length(dx)){
                ObjEffect_SetVertexXY(c,i,dx[i],dy[i]-cut);
                ObjEffect_SetVertexUV(c,i,dx[i],dy[i]);
                ObjEffect_SetVertexColor(c,i,255-128*(i%2),r,g,b);
            }    
    wait(1);  Obj_Delete(c);
         }

      }

  task ContinueCount(num){
     loop{
     let continuetf = GetAllowedContinueCount;
      wait(1);
   if(GetAllowedContinueCount < continuetf){continuenum++;}
    if(continuenum  >= num && GetPlayerLife <= 0){
  GameOverFrag = true; SetCommonDataEx("","gof",GameOverFrag);
   enemy(csd~"zako\TimeStopper.txt",maxx+300,maxy+300,0,0,[10,1,100,0,8,11,1,100,0,0,0,0]);
   DeleteMusic(bgm1_1);
   DeleteMusic(bgm1_2);
  PlayMusic(bgm0_2);
   wait(60*8-30);
  DeleteMusic(bgm0_2);
       ContinueSystem(GetCommonDataDefaultEx("","mode",0),0,-1); break;
         }
        }
     }

 task StageTitle1(x,y,al,r,g,b){
           let c= Obj_Create(OBJ_EFFECT);
             Obj_SetX(c,x);
             Obj_SetY(c,y);
             Obj_SetAngle(c,0);
             ObjEffect_SetAngle(c,0,0,0);
             ObjEffect_SetTexture(c,OutText);
             ObjEffect_SetRenderState(c,ADD);
             ObjEffect_SetPrimitiveType(c,PRIMITIVE_TRIANGLESTRIP);
             ObjEffect_SetLayer(c,7);
             ObjEffect_SetScale(c,1,1);
  let dx = [0,0,100,100,0];
  let dy = [130,165,165,130,130]; 
   ObjEffect_CreateVertex(c,length(dx));
            ascent(let i in 0..length(dx)){
                ObjEffect_SetVertexXY(c,i,dx[i],dy[i]-131);
                ObjEffect_SetVertexUV(c,i,dx[i],dy[i]);
                ObjEffect_SetVertexColor(c,i,al-(al/2)*(i%2),r,g,b);
            }    
      wait(60);
        Obj_Delete(c);
        }