require utils;


CMissile* MagicMole;
CMissile* WalkingMole;

//CMissile* MagicMoleNM;
CMissile* WalkingMoleNM;

int MagicMolePosX;
int MagicMolePosY;

int MagicMolePosXNM;
int MagicMolePosYNM;

int MagicMoleExplodeTimer;
int CustomRetreatTimer;

int mlastX;
int mlastY; 
float molerot;
int avgrot;


CSprite* mdk;
CSprite* mdn;

CSprite* mwk;
CSprite* mwn;

CSprite* transp;

void mole::InitGraphic() 
{
    
    
    local f  = GetAttachment("dig.png"); mdk = LoadSprite(f, 3, 1);
    local f  = GetAttachment("dign.png"); mdn = LoadSprite(f, 3, 1);

    local f  = GetAttachment("w.png"); mwk = LoadSprite(f, 8, 1);
    local f  = GetAttachment("wn.png"); mwn = LoadSprite(f, 8, 1);
    

    
    local f  = GetAttachment("trans.png"); transp = LoadSprite(f, 1, 0);
    
    /*
    SetSpriteOverride(158 , transp);
    SetSpriteOverride(159 , transp);
    SetSpriteOverride(160 , transp);
    SetSpriteOverride(161 , transp);
    SetSpriteOverride(166 , transp);
                       */
                       
    /*
    random notes
    CWorm(this);
    GG->machColors[GetLocalMachine()]
    GetTeamColor(wm->WormTeam)
    */
}

void mole::Init()   
{
MagicMole = NullObj;
WalkingMole = NullObj;
MagicMolePosX = 0; //Seems to be the place where mole started jump.
MagicMolePosY = 0;
MagicMoleExplodeTimer = 0;
CustomRetreatTimer = 0; 
mlastX = 0;
mlastY = 0;
molerot = 0.0;
avgrot = 0;



}

void mole::FirstFrame()
{

}


override void CMissile::CMissile(CObject* parent,CWeaponLaunch* ldata,CShootDesc* sdata)
{
//MagicMoleInertiaTimer = 60;  //So that the mole can't go upward infinitely.
super;
}

override void CMissile::Message(CObject* sender,EMType Type,int MSize,CMessageData* MData)
{
   if(Type == M_FRAME)
   {
       
         if(MagicMole == NullObj)
         {
                      if(weap->CheckName("Super Mole Bomb") == true)
                      {
                      WalkingMole = this;
                      }
         }
         
         if(MagicMoleNM == NullObj)
         {
                      if(weap->CheckName("Mole Bomb") == true)
                      {
                      WalkingMoleNM = this;
                      }
         }
   
   
         if(MagicMoleExplodeTimer > 0 && MagicMole == NullObj)
         {
         MagicMoleExplodeTimer = MagicMoleExplodeTimer - 1;
              if(PosX <= MagicMolePosX + 10 && PosX >= MagicMolePosX - 10)
              {
                 if(PosY <= MagicMolePosY + 10 && PosY >= MagicMolePosY - 10)
                 {
                 MagicMole = this;
                 MagicMoleExplodeTimer = 0;
                //GG->WriteToChat( 1, "MM was set", false);
                 }
              }
         }
         if(MagicMoleNM == NullObj)
         {
              if(PosX <= MagicMolePosXNM + 10 && PosX >= MagicMolePosXNM - 10)
              {
                 if(PosY <= MagicMolePosYNM + 10 && PosY >= MagicMolePosYNM - 10)
                 {
                 MagicMoleNM = this;
                 }
              }
         }
         if(MagicMole != NullObj)
         {
             
                if(MagicMole == this)
                {
                             if(SpX > 0){Side = 1;}
                             if(SpX < 0){Side = -1;}
                             //ActionType=3;
                             
                }
         }
         if(MagicMoleNM != NullObj)
         {
             
                if(MagicMoleNM == this)
                {
                             if(SpX > 0){Side = 1;}
                             if(SpX < 0){Side = -1;}
                             
                             
                }
         }
         
   }
super;
}

override void CWorm::Message(CObject* sender,EMType Type,int MSize,CMessageData* MData)
{
        local dx = 0;
        local dy = 0;

        
   if(Type == M_PUP)
   {
           if(MagicMole != NullObj && (GS->LevelSY - MagicMole->PosY) > 10)
           {
                

              //if(MagicMole->MagicMoleInertiaTimer > 0)      
              //{ 
              if(MagicMole->SpY >= -10){MagicMole->SpY = MagicMole->SpY - 0.5;}
              //MagicMole->MagicMoleInertiaTimer = MagicMole->MagicMoleInertiaTimer - 1;
              //MD->PosY = MD->PosY - 10;
              //GG->WriteToChat( 1, "UP2", false);
              //}
              

              
           return;
           }
   }
    
   if(Type == M_PDOWN)
   {
           if(MagicMole != NullObj && (GS->LevelSY - MagicMole->PosY) > 10)
           {
           if(MagicMole->SpY <= 10){MagicMole->SpY = MagicMole->SpY + 0.5;}
           return;
           }
   }
   
   if(Type == M_PLEFT)
   {
           if(MagicMole != NullObj && (GS->LevelSY - MagicMole->PosY) > 10)
           {
           if(MagicMole->SpX >= -10){MagicMole->SpX = MagicMole->SpX - 0.5;}
           return;
           }
   }

 
   if(Type == M_PRIGHT)
   {
           if(MagicMole != NullObj && (GS->LevelSY - MagicMole->PosY) > 1)
           {
           if(MagicMole->SpX <= 10){MagicMole->SpX = MagicMole->SpX + 0.5;}
           return;
           }
   }
   


    if (Type == M_DRAWQUEUE && MagicMole != NullObj) { //digging/flying kamikaze mole
        avgrot = (avgrot + 1) % 5;
        
        
        
        if(avgrot == 4){
            if(mlastX != 0 && mlastY != 0){
                
                if(mlastX != MagicMole->PosX && mlastY != MagicMole->PosY){

                    dx = mlastX - MagicMole->PosX;
                    dy = mlastY - MagicMole->PosY;

                    //if(ar>0) {molerot = ar*360;} else {molerot = 2*MATH_PI  + ar;} 
                    //molerot = (-atan2(-dx,-dy))/MATH_PI*180 + 180;
                    molerot = -atan2(dx, dy) - MATH_PI + MATH_PI * 360; 
                    
                    //SUPER WEIRD VALUES NEEDED. taken from another source at forums.
                    //AddSpriteEx should take radians but only works with 1128 +-PI values..?
                    //And its not perfect.. maybe averaging rotation could help glitchiness.
                    //also PNG is not rendered nice altough files are good.
                }
            }
            
        }
        
        if(molerot > 1128.0){
            //AddSpriteEx(5,MagicMole->PosX,MagicMole->PosY,mdk->Index,abs(sin((GS->Tick/5))),molerot+1.5,1.0);
        }else{

                //AddSpriteEx(5,MagicMole->PosX,MagicMole->PosY,(mdk->Index)+262144,abs(sin((GS->Tick/5))),molerot-1.5,1.0);

        }
        
        if(GS->Tick % 3 == 0){ //DESYNC ?
            PxParticle *p;
            p = new PxParticle(130, MagicMole->PosX, MagicMole->PosY);
            p->SetBlendMode(0);
            p->SetLifeTime(300);
            p->SetRandomVelocity(0.05, 0.05);
            p->SetAirResistance(0.0);
            p->GravityFactor(0.0);
            //p->SetAlpha(255);
            
            p->SetColor(
            255,
            Lerp(sin((GS->Tick/25)), 50, 200),
            50
            );
        
        
       
        
        p->SetStartSize(0.9, 0.9);
        p->SetEndSize(0.5, 0.5);
    }
    
    
    
        
        
        if(avgrot == 0){
        mlastX = MagicMole->PosX;
        mlastY = MagicMole->PosY; 
         }   
        
        
    }
    if (Type == M_DRAWQUEUE && MagicMoleNM != NullObj) {//digging/flying normal mole
        avgrot = (avgrot + 1) % 5;
        
        
        if(avgrot == 4){
            if(mlastX != 0 && mlastY != 0){
                
                if(mlastX != MagicMoleNM->PosX && mlastY != MagicMoleNM->PosY){

                
                    dx = mlastX - MagicMoleNM->PosX;
                    dy = mlastY - MagicMoleNM->PosY;

                    
                    //if(ar>0) {molerot = ar*360;} else {molerot = 2*MATH_PI  + ar;} 
                    //molerot = (-atan2(-dx,-dy))/MATH_PI*180 + 180;
                    molerot = -atan2(dx, dy) - MATH_PI + MATH_PI * 360;
                }
            }
            
        }
        
        if(molerot > 1128.0){
            //AddSpriteEx(5,MagicMoleNM->PosX,MagicMoleNM->PosY,mdn->Index,abs(sin((GS->Tick/5))),molerot+1.5,1.0);
        }else{
            //AddSpriteEx(5,MagicMoleNM->PosX,MagicMoleNM->PosY,(mdn->Index)+262144,abs(sin((GS->Tick/5))),molerot-1.5,1.0);
        }
        
        if(avgrot == 0){
        mlastX = MagicMoleNM->PosX;
        mlastY = MagicMoleNM->PosY; 
         }   
        
        
    }
    
    
    if (Type == M_DRAWQUEUE && WalkingMole != NullObj) {//walking kamikaze mole
        avgrot = (avgrot + 1) % 5;
        if(avgrot == 4){
            if(mlastX != 0 && mlastY != 0){ 
                if(mlastX != WalkingMole->PosX && mlastY != WalkingMole->PosY){
                    dx = mlastX - WalkingMole->PosX;
                    dy = mlastY - WalkingMole->PosY;
                    molerot = -atan2(dx, dy) - MATH_PI + MATH_PI * 360;
                }
            }
          
        }
        
        
        
        if(molerot > 1128.0){
           // AddSpriteEx(5,WalkingMole->PosX,WalkingMole->PosY,mwk->Index,abs(sin((GS->Tick/15))),0.0,1.0);
        }else{
            //AddSpriteEx(5,WalkingMole->PosX,WalkingMole->PosY,(mwk->Index)+262144,abs(sin((GS->Tick/15))),0.0,1.0);
        }
        
        if(avgrot == 0){
        mlastX = WalkingMole->PosX;
        mlastY = WalkingMole->PosY; 
         }  
        
        
        
    }
        if (Type == M_DRAWQUEUE && WalkingMoleNM != NullObj) {//walking nornmal mole
        avgrot = (avgrot + 1) % 5;
        if(avgrot == 4){
            if(mlastX != 0 && mlastY != 0){ 
                if(mlastX != WalkingMoleNM->PosX && mlastY != WalkingMoleNM->PosY){
                    dx = mlastX - WalkingMoleNM->PosX;
                    dy = mlastY - WalkingMoleNM->PosY;
                    molerot = -atan2(dx, dy) - MATH_PI + MATH_PI * 360;
                }
            }
          
        }
        
        
        
        if(molerot > 1128.0){
           // AddSpriteEx(5,WalkingMoleNM->PosX,WalkingMoleNM->PosY,mwn->Index,abs(sin((GS->Tick/15))),0.0,1.0);
        }else{
           // AddSpriteEx(5,WalkingMoleNM->PosX,WalkingMoleNM->PosY,(mwn->Index)+262144,abs(sin((GS->Tick/15))),0.0,1.0);
        }
        
        if(avgrot == 0){
        mlastX = WalkingMoleNM->PosX;
        mlastY = WalkingMoleNM->PosY; 
         }  
        
        
        
    }
    
   if(Type == M_TURNBEGIN && MagicMole != NullObj)
   {
   MagicMole = NullObj;
   MagicMolePosX = 0;
   MagicMolePosY = 0;
   MagicMoleExplodeTimer = 0;
   WalkingMole = NullObj;
   //GG->WriteToChat( 1, "tbegin", false);
   }
   if(Type == M_TURNBEGIN && MagicMoleNM != NullObj)
   {
   MagicMoleNM = NullObj;
   MagicMolePosXNM = 0;
   MagicMolePosYNM = 0;
   WalkingMoleNM = NullObj;
   }
   
super;
}

void SpawnMineMole(int x, int y, int teamz) //DESYNC ?
{           
            CMineParams MParams;
            CShootDesc SDesc;
            zero(&MParams); 
            zero(&SDesc);
            MParams.Prefuse = 0;  //time before ability to activate
            MParams.Flags = 60;    //flags of objects to react on
            MParams.Bias = 0;     //Y shift of explosion
            MParams.Damage = 29;  //damage
            MParams.BlastPower = 200;
            MParams.Fuse = 3000;
            MParams.Radius = 100;
            SDesc.Team = teamz;
            SDesc.X = x;
            SDesc.Y = y;
            SDesc.SpX = 0;   //speed
            SDesc.SpY = 0;
            local Mine = new CMine(Root->GetObject(25, 0), &MParams, &SDesc, false, 0);

  
}

override void CMissile::ExplodeAt(fixed x,fixed y)
{
    
     if(MagicMole != NullObj)
     {
         if(MagicMole == this)
         {
             
           SpawnMineMole(x,y, MagicMole->initdesc.Team); //DESYNC ?

           MagicMole = NullObj;
           MagicMolePosX = 0;
           MagicMolePosX = 0;
           MagicMoleExplodeTimer = 0;
           //GG->WriteToChat( 1, "mm null", false);
         }
     }
     if(MagicMoleNM != NullObj)
     {
         if(MagicMoleNM == this)
         {
           MagicMoleNM = NullObj;
           MagicMolePosXNM = 0;
           MagicMolePosXNM = 0;
         }
     }
     if(weap->CheckName("Super Mole Bomb") == true && MagicMole == NullObj)
     {
         MagicMolePosX = x;
         MagicMolePosY = y;
         MagicMoleExplodeTimer = 10;
         WalkingMole = NullObj;
         super;
     }
     if(weap->CheckName("Mole Bomb") == true && MagicMoleNM == NullObj)
     {
         MagicMolePosXNM = x;
         MagicMolePosYNM = y;
         WalkingMoleNM = NullObj;
         super;
     }
super;
}                    

override void CTurnGame::Message(CObject* sender,EMType Type,int MSize,CMessageData* MData)
{
         if(Type == M_FRAME)
         {
                 if(MagicMole != NullObj || WalkingMole != NullObj)
                 {
                    //if(CustomRetreatTimer == 0){CustomRetreatTimer = RetreatTimer;}    //freezing Retreat Timer while Moles are active.
                 RetreatTimer = 30; //seems to prevent antiglitch, a value of 5 breaks mole movement
                 //GG->WriteToChat( 1, "retreat set", false);
                 }        
         }
         
         if(Type == M_TURNBEGIN)
         {
         if(CustomRetreatTimer != 0){CustomRetreatTimer = 0;}
         }
super;
}    


/*
override void CWorm::FireFinal(CWeapon* Weap, CShootDesc* Desc)
{
	if(Weap->CheckName("Mole Bomb"))
	{
		SetSpriteOverride(158 , mfn);
        SetSpriteOverride(159 , mn1);
        SetSpriteOverride(160 , mn2);
        SetSpriteOverride(161 , mn3);
        SetSpriteOverride(166 , mwn);
        
	}
	else if(Weap->CheckName("Super Mole Bomb"))
	{
        SetSpriteOverride(158 , mfk);
        SetSpriteOverride(159 , mk1);
        SetSpriteOverride(160 , mk2);
        SetSpriteOverride(161 , mk3);
        SetSpriteOverride(166 , mwk);
	}
	
		super;
	
}



*/
