

  let csd = GetCurrentScriptDirectory;
  let cx=GetCenterX();
  let cy=GetCenterY();
  let minx=GetClipMinX();
  let miny=GetClipMinY();
  let maxx=GetClipMaxX();
  let maxy=GetClipMaxY();
  let difficult = GetCommonDataDefaultEx("","dif",1);
  let playmode = GetCommonDataDefaultEx("","mode",1);
  let PracticeCardFrag = GetCommonDataDefaultEx("","pcf",[false]);
  let SpellCardHistory = GetCommonDataDefaultEx("","sch",[0]);
  let GetSpellCard = GetCommonDataDefaultEx("","gsc",[0]);

 let seshot1 = csd~ "..\se\enemyshot01.wav";   
 let seshot3 = csd~ "..\se\enemyshot03.wav";                           
 let seshot5 = csd~ "..\se\enemyshot05.wav";              
 let BossVanish = csd~ "..\se\BossVanish.wav"; 
 let Concentration = csd~ "..\se\Concentration.wav";                       
 let timecounter1 = csd~ "..\se\timecounter01.wav";        
 let timecounter2 = csd~ "..\se\timecounter02.wav";                              
 let ghost = csd~ "..\se\ghost.wav";                    
 let SpellBack = csd~".\img\spellback.png"; LoadGraphic(SpellBack);
 let anchor =  csd~".\img\anchor.png"; LoadGraphic(anchor);
  SetRateScoreSystemEnable(false);
 SetEffectForZeroLife(0,0,0);
 SetEnemyMarker(true);
  let sgrnum = 0;
 /* let shake = false;*/
 let damage = 5;
 Graph;   

    task Count{
        while(GetTimer > 10){yield;}
     loop(5){
      PlaySE(timecounter1); 
        loop(60){yield;}
       }
       loop(5){
          PlaySE(timecounter2); 
        loop(60){yield;}
       }
    }

  task End{
  while(GetLife > 0 && GetTimer >= 0){wait(1);}
  let radius = 0;
 PlaySE(BossVanish);
  loop{
  DeleteEnemyShotToItemInCircle(ALL,GetX,GetY,radius);
  radius += 10;
   wait(1);
        }
      }

  task Graph{
  let second = 0;
  loop{
   alternative(sgrnum)
    case(0){
     alternative(second)
         case(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14){sgr(0,0); second++;}
         case(15,16,17,18,19,20,21,22,23,24,25,26,27,28,29){sgr(0,1); second++;}
         case(30,31,32,33,34,35,36,37,38,39,40,41,42,43,44){sgr(0,2); second++;}
         case(45,46,47,48,49,50,51,52,53,54,55,56,57,58,59){sgr(0,3); second = 0;}
         others{second = 0;}
      }   
    case(1){
       alternative(second)
         case(0,1,2,3,4,5,6,7,8,9){sgr(2,0); second++;}
         case(10){sgr(2,1); second = 10;}
        others{second = 10;}
     }
      case(2){
       alternative(second)
         case(0,1,2,3,4,5,6,7,8,9){sgr(2,2); second++;}
         case(10){sgr(2,3); second = 10;}
        others{second = 10;}
     }
     case(3){
     alternative(second)
         case(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14){sgr(4,0); second++;}
         case(15,16,17,18,19,20,21,22,23,24,25,26,27,28,29){sgr(4,1); second++;}
         case(30,31,32,33,34,35,36,37,38,39,40,41,42,43,44){sgr(4,2); second++;}
         case(45,46,47,48,49,50,51,52,53,54,55,56,57,58,59){sgr(4,3); second=45;}
         others{second = 0;}
      } 
  case(4){
         if(second%40 >= 0 && second%40 < 10){sgr(4,0); second++;}
         else if(second%40 >= 10 && second%40 < 20){sgr(4,1); second++;}
         else if(second%40 >= 20 && second%40 < 30){sgr(4,2); second++;}
         else if(second%40 >= 30 && second%40 < 40){sgr(4,3); second++;}
         if(second > 40 && second <= 80){SetGraphicScale(-1,1);}
         else if(second > 80){SetGraphicScale(1,1);}
         if(second > 119){second = 119;}
      } 
   others{second = 0;}
   wait(1);
    }
  }

  task Anchor(x,y,v,angle,accel,size,kill){
           let c= Obj_Create(OBJ_EFFECT);
             Obj_SetX(c,x);
             Obj_SetY(c,y);
             Obj_SetAngle(c,angle);
             ObjEffect_SetAngle(c,0,0,angle-90);
             ObjEffect_SetTexture(c,anchor);
             ObjEffect_SetRenderState(c,ALPHA);
             ObjEffect_SetPrimitiveType(c,PRIMITIVE_TRIANGLEFAN);
             ObjEffect_SetLayer(c,5);
             ObjEffect_CreateVertex(c,62);
             ObjEffect_SetVertexXY(c,0,0,0);
             ObjEffect_SetVertexUV(c,0,64,320);
             ObjEffect_SetVertexColor(c,0,255,255,255,255);
             ObjEffect_SetScale(c,0,size/10);
 let shake = false;
            ascent(let i in 0..61){
                ObjEffect_SetVertexXY(c,i+1,cos(i*6)*20,sin(i*6)*20);
                ObjEffect_SetVertexUV(c,i+1,cos(i*6)*64+64,sin(i*6)*64+320);
                ObjEffect_SetVertexColor(c,i+1,255,255,255,255);
            }
    ascent(q in 0..20){
    ObjEffect_SetScale(c,size/10*q/20,size/10);
    wait(1);
      }
 let speed = 0;
   alternative(difficult)
    case(0){E;}
    case(1){N;}
    case(2){H;}
    case(3){L;}

      Move;
   Coll;
   wait(kill);
   Obj_Delete(c);

  task E{
 let ang = angle + 180;
   while(!shake){
  let x = Obj_GetX(c);
 let y = Obj_GetY(c);
  let vx = speed*cos(angle)/3;
  let vy = 0;
  let ax = 0;
  let ay = 0.005;
  let lx = 0;
  let ly = speed/3+0.1;
  let color = 22;
  let delay = 0;
   CreateShot12(x,y,vx,vy,ax,ay,lx,ly,color,delay);
  ascent(h in 0..2){
  let v2 = 1+0.5*h;
  CreateShot01(x,y,v2,ang,color-1,delay+10);
  CreateShot01(x,y,v2,2*angle-ang,color-1,delay+10);
   }
  ang += 10;
   wait(5);
      }
    }
  task N{
  let ang = angle + 180;
   while(!shake){
 let x = Obj_GetX(c);
 let y = Obj_GetY(c);
  let vx = speed*cos(angle)/3;
  let vy = 0;
  let ax = 0;
  let ay = 0.005;
  let lx = 0;
  let ly = speed/3+0.1;
  let color = 22;
  let delay = 0;
   CreateShot12(x,y,vx,vy,ax,ay,lx,ly,color,delay);
   ascent(h in 0..4){
  let v2 = 1+0.5*h;
  CreateShot01(x,y,v2,ang,color-1,delay+10);
  CreateShot01(x,y,v2,2*angle-ang,color-1,delay+10);
   }
  ang += 6;
   wait(3);
      }
   }
  task H{
  let ang = angle + 180;
   while(!shake){
 let x = Obj_GetX(c);
 let y = Obj_GetY(c);
  let vx = speed*cos(angle)/3;
  let vy = 0;
  let ax = 0;
  let ay = 0.005;
  let lx = 0;
  let ly = speed/3+0.1;
  let color = 22;
  let delay = 0;
   CreateShot12(x,y,vx,vy,ax,ay,lx,ly,color,delay);
   ascent(h in 0..3){
  let v2 = 1+0.5*h;
  CreateShot01(x,y,v2,ang,color-1,delay+10);
  CreateShot01(x,y,v2,2*angle-ang,color-1,delay+10);
   }
  ang += 8;
   wait(4);
      }
    }
  task L{
   let ang = angle + 180;
   while(!shake){
 let x = Obj_GetX(c);
 let y = Obj_GetY(c);
  let vx = speed*cos(angle)/3;
  let vy = 0;
  let ax = 0;
  let ay = 0.005;
  let lx = 0;
  let ly = speed/3+0.1;
  let color = 22;
  let delay = 0;
   ascent(p in 0..5){
   CreateShot12(x,y,vx+0.3*(p-2),vy,ax,ay,lx,ly,color,delay);
  }
   ascent(h in 0..4){
  let v2 = 1+0.5*h;
  CreateShot01(x,y,v2,ang,color-1,delay+10);
  CreateShot01(x,y,v2,2*angle-ang,color-1,delay+10);
   }
  ang += 8;
   wait(4);
      }
   }

    task Move{
  let cou = 0;
   while(!Obj_BeDeleted(c)){
    Obj_SetX(c,Obj_GetX(c)+speed*cos(angle));
    Obj_SetY(c,Obj_GetY(c)+speed*sin(angle));
 if(cou == 0){AnchorCover(Obj_GetX(c),Obj_GetY(c),0,angle,0,size); cou = 1;} 
  cou--;
   speed += accel;
  if(speed > v){speed = v;}
    yield;
  if(Obj_GetY(c) > maxy-size || Obj_GetY(c) < miny+size || Obj_GetX(c) > maxx-size || Obj_GetX(c) < minx+size){speed = 0; shake = true;  break;}
         }
   PlaySE(seshot5);
  wait(10);
  /*shake = false;*/
  wait(120);
 let o = 0;
  if(Obj_GetX(c) <= GetX){
   while(Obj_GetX(c) <= maxx+size*2){
    ObjEffect_SetAngle(c,0,0,Obj_GetAngle(c)-90+o);
    Obj_SetX(c,Obj_GetX(c)+1);
  o++;
    wait(1);
             }
    Obj_Delete(c);
           }
   else if(Obj_GetX(c) >= GetX){
   while(Obj_GetX(c) >= minx-size*2){
    ObjEffect_SetAngle(c,0,0,Obj_GetAngle(c)-90-o);
    Obj_SetX(c,Obj_GetX(c)-1);
   o++;
    wait(1);
             }
    Obj_Delete(c);
           }
        }
  task Coll{
   while(!Obj_BeDeleted(c)){
 if( ((Obj_GetX(c)-GetPlayerX)^2 + (Obj_GetY(c)-GetPlayerY)^2)^0.5 < size*1.25 && GetTimeOfPlayerInvincibility == 0){ShootDownPlayer;}
   wait(1);
        }
      }
    }

   task AnchorCover(x,y,v,angle,accel,size){
           let c= Obj_Create(OBJ_EFFECT);
             Obj_SetX(c,x);
             Obj_SetY(c,y);
             Obj_SetAngle(c,angle);
             ObjEffect_SetAngle(c,0,0,angle-90);
             ObjEffect_SetTexture(c,anchor);
             ObjEffect_SetRenderState(c,ADD);
             ObjEffect_SetPrimitiveType(c,PRIMITIVE_TRIANGLEFAN);
             ObjEffect_SetLayer(c,2);
             ObjEffect_CreateVertex(c,62);
             ObjEffect_SetVertexXY(c,0,0,0);
             ObjEffect_SetVertexUV(c,0,64,320);
             ObjEffect_SetVertexColor(c,0,255,255,255,255);
             ObjEffect_SetScale(c,size/10,size/10);

            ascent(let i in 0..61){
                ObjEffect_SetVertexXY(c,i+1,cos(i*6)*20,sin(i*6)*20);
                ObjEffect_SetVertexUV(c,i+1,cos(i*6)*64+64,sin(i*6)*64+320);
                ObjEffect_SetVertexColor(c,i+1,255,255,255,255);
            }
   wait(1);
   ascent(b in 1..5){
       ObjEffect_ResizeVertexCount(c,20);
        ObjEffect_SetVertexXY(c,0,0,0);
        ObjEffect_SetVertexUV(c,0,64,320);
        ObjEffect_SetVertexColor(c,0,255,230-10*b,230-b*10,230-b*10);
         ascent(let i in 0..19){
                ObjEffect_SetVertexXY(c,i+1,cos(i*20)*20,sin(i*20)*20);
                ObjEffect_SetVertexUV(c,i+1,cos(i*20)*64+64,sin(i*20)*64+320);
                ObjEffect_SetVertexColor(c,i+1,255,230-10*b,230-b*10,230-b*10);
                }
      wait(1);
            }
     Obj_Delete(c);
     }

 task SpellBackGround(size){
           let c= Obj_Create(OBJ_EFFECT);
             Obj_SetX(c,cx);
             Obj_SetY(c,cy);
             Obj_SetAngle(c,0);
             ObjEffect_SetAngle(c,0,0,0);
             ObjEffect_SetTexture(c,SpellBack);
             ObjEffect_SetRenderState(c,ADD);
             ObjEffect_SetPrimitiveType(c,PRIMITIVE_TRIANGLEFAN);
             ObjEffect_SetLayer(c,0);
             ObjEffect_CreateVertex(c,62);
             ObjEffect_SetVertexXY(c,0,0,0);
             ObjEffect_SetVertexUV(c,0,320,240);
             ObjEffect_SetVertexColor(c,0,128,255,255,255);
             ObjEffect_SetScale(c,size/10,size/10);

            ascent(let i in 0..61){
                ObjEffect_SetVertexXY(c,i+1,cos(i*6)*20,sin(i*6)*20);
                ObjEffect_SetVertexUV(c,i+1,cos(i*6)*800+320,sin(i*6)*600+240);
                ObjEffect_SetVertexColor(c,i+1,128,255,255,255);
            }
     Set; 
     Movee;
  let k = 128;
  let dk = 1;
  loop{
    ObjEffect_ResizeVertexCount(c,62); 
     ObjEffect_SetVertexXY(c,0,0,0);
     ObjEffect_SetVertexUV(c,0,320,240);
      ObjEffect_SetVertexColor(c,0,k,255,255,255);
     ascent(let i in 0..61){
                ObjEffect_SetVertexXY(c,i+1,cos(i*6)*20,sin(i*6)*20);
                ObjEffect_SetVertexUV(c,i+1,cos(i*6)*400+320,sin(i*6)*300+240);
                ObjEffect_SetVertexColor(c,i+1,k,255,255,255);
            }
   k+=dk;
   if(k > 192 || k < 64){dk = -dk;}
   wait(1);
     }

     task Set{
   let i = 0;
         while(!Obj_BeDeleted(c)){
            ObjEffect_SetAngle(c,0,0,i/10);
        i--;
            yield;
           }
        }
   task Movee{
   let n = 0.01;
  let h = 0;
         while(!Obj_BeDeleted(c)){
      Obj_SetX(c,Obj_GetX(c)-h);
      Obj_SetY(c,Obj_GetY(c)+h);
        h += n;
    if(h > 2 || h < -1.9){n = -n;}
            yield;
           }
        }
    }