//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "visorAtaque.h"
#include "Tmain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"


#include <stdio.h>
#include "inifiles.hpp"

#define min(a, b)  (((a) < (b)) ? (a) : (b))


TvisorAtaques *visorAtaques;
//---------------------------------------------------------------------------
__fastcall TvisorAtaques::TvisorAtaques(TComponent* Owner)
        : TForm(Owner)
{
  /* Magnetic Form */
  snapped=false;
  UpdateWorkArea();  //set our workarea rect
  thresh = 25; //get threshold
  snapwin = FindWindow("Tmain",NULL); //get window to snap to
  /*****************/  


  tipoD->ItemIndex=0;
  updatingDB=false;


  /***********************/



}
//---------------------------------------------------------------------------
void __fastcall TvisorAtaques::nextTABcontrol(TObject *Sender, char &Key)
{
  if ( Key==VK_RETURN )
  {
        Key=0;
        SelectNext( (TWinControl*)Sender,true,true );
  }
}
//---------------------------------------------------------------------------
void __fastcall TvisorAtaques::SpeedButton2Click(TObject *Sender)
{
  guardarAtaque();      
}
//---------------------------------------------------------------------------
int __fastcall TvisorAtaques::guardarAtaque(void)
{
  int n;
  AnsiString aux;

  if ( ataqueActual==NULL )
  {
        ataqueActual = new TAtaqueOfensivo;
        AtaquesOfensivos->Add(ataqueActual);
        dgAtaques->RowCount = AtaquesOfensivos->Count+1;
  }

  ataqueActual->lanzado=false;

  ataqueActual->evento.status=12;ataqueActual->evento.avisado=true;

  ataqueActual->numNaves=0;
  /* Fijamos la velocidad Factor / Base */
  switch( velocidadFactor->ItemIndex )
  {
    case '0':   ataqueActual->velocidadFactor = 10;  break;
    case '1':   ataqueActual->velocidadFactor = 9;  break;
    case '2':   ataqueActual->velocidadFactor = 8;  break;
    case '3':   ataqueActual->velocidadFactor = 7;  break;
    case '4':   ataqueActual->velocidadFactor = 6;  break;
    case '5':   ataqueActual->velocidadFactor = 5;  break;
    case '6':   ataqueActual->velocidadFactor = 4;  break;
    case '7':   ataqueActual->velocidadFactor = 3;  break;
    case '8':   ataqueActual->velocidadFactor = 2;  break;
    case '9':   ataqueActual->velocidadFactor = 1;  break;
    case '10':  ataqueActual->velocidadFactor = 15;  break;
    case '11':  ataqueActual->velocidadFactor = 20;  break;
    case '12':  ataqueActual->velocidadFactor = 90;  break;

    default:
          ataqueActual->velocidadFactor = 10;
          break;
  }
  switch( velocidadBase->ItemIndex )
  {
    case 0:  ataqueActual->velocidadBase = 0; break;
    case 1:  ataqueActual->velocidadBase = 15000; break;
    case 2:  ataqueActual->velocidadBase = 10000; break;
    case 3:  ataqueActual->velocidadBase = 100000000; break;

    default:
        ataqueActual->velocidadBase = 0;
        break;
  }

  // Marca de uso de satelites (Posible BUG de oGAME)
  ataqueActual->usarSatelites = usarSatelites->Checked;


  // Origen del ataque
  aux = planetasOrigen->Items->Strings[ planetasOrigen->ItemIndex ];
  ataqueActual->evento.gO=aux.SubString(1,1).ToIntDef(0);
  ataqueActual->evento.sO=aux.SubString(3,3).ToIntDef(0);
  ataqueActual->evento.pO=aux.SubString(7,2).ToIntDef(0);
  ataqueActual->evento.tO=aux.SubString(11,1).ToIntDef(0);

  // Destino del ataque
  ataqueActual->evento.gD=gD->Text.ToIntDef(0);
  ataqueActual->evento.sD=sD->Text.ToIntDef(0);
  ataqueActual->evento.pD=pD->Text.ToIntDef(0);
  ataqueActual->evento.tD=(tipoD->ItemIndex+1);

  // Mision
  switch( ordenes->ItemIndex )
  {
        case 0: ataqueActual->evento.mision='a'; break;
        case 1: ataqueActual->evento.mision='d'; break;
        case 2: ataqueActual->evento.mision='t'; break;
        case 3: ataqueActual->evento.mision='r'; break;
        case 4: ataqueActual->evento.mision='e'; break;
  }

  // Naves que intervienen...

  // CARGA PEQUEÑA
  n = Edit1->Text.ToIntDef(0);
  if ( n>0 )
  {
    ataqueActual->naves[ataqueActual->numNaves].id=202;
    ataqueActual->naves[ataqueActual->numNaves].consumption=10;
    ataqueActual->naves[ataqueActual->numNaves].speed=5000;
    ataqueActual->naves[ataqueActual->numNaves].capacity=5000;

    ataqueActual->naves[ataqueActual->numNaves].maxship = n;
    ataqueActual->naves[ataqueActual->numNaves].ship = n;
    ataqueActual->numNaves++;
  }


  // CARGA GRANDE
  n = Edit2->Text.ToIntDef(0);
  if ( n>0 )
  {
    ataqueActual->naves[ataqueActual->numNaves].id=203;
    ataqueActual->naves[ataqueActual->numNaves].consumption=50;
    ataqueActual->naves[ataqueActual->numNaves].speed=7500;
    ataqueActual->naves[ataqueActual->numNaves].capacity=25000;

    ataqueActual->naves[ataqueActual->numNaves].maxship = n;
    ataqueActual->naves[ataqueActual->numNaves].ship = n;
    ataqueActual->numNaves++;
  }


  // CAZADOR LIGERO
  n = Edit3->Text.ToIntDef(0);
  if ( n>0 )
  {
    ataqueActual->naves[ataqueActual->numNaves].id=204;
    ataqueActual->naves[ataqueActual->numNaves].consumption=20;
    ataqueActual->naves[ataqueActual->numNaves].speed=12500;
    ataqueActual->naves[ataqueActual->numNaves].capacity=50;

    ataqueActual->naves[ataqueActual->numNaves].maxship = n;
    ataqueActual->naves[ataqueActual->numNaves].ship = n;
    ataqueActual->numNaves++;
  }

  // CAZADOR PESADO
  n = Edit4->Text.ToIntDef(0);
  if ( n>0 )
  {
    ataqueActual->naves[ataqueActual->numNaves].id=205;
    ataqueActual->naves[ataqueActual->numNaves].consumption=75;
    ataqueActual->naves[ataqueActual->numNaves].speed=10000;
    ataqueActual->naves[ataqueActual->numNaves].capacity=100;

    ataqueActual->naves[ataqueActual->numNaves].maxship = n;
    ataqueActual->naves[ataqueActual->numNaves].ship = n;
    ataqueActual->numNaves++;
  }

  // CRUCERO
  n = Edit5->Text.ToIntDef(0);
  if ( n>0 )
  {
    ataqueActual->naves[ataqueActual->numNaves].id=206;
    ataqueActual->naves[ataqueActual->numNaves].consumption=300;
    ataqueActual->naves[ataqueActual->numNaves].speed=15000;
    ataqueActual->naves[ataqueActual->numNaves].capacity=800;

    ataqueActual->naves[ataqueActual->numNaves].maxship = n;
    ataqueActual->naves[ataqueActual->numNaves].ship = n;
    ataqueActual->numNaves++;
  }

  // NAVE DE BATALLA
  n = Edit6->Text.ToIntDef(0);
  if ( n>0 )
  {
    ataqueActual->naves[ataqueActual->numNaves].id=207;
    ataqueActual->naves[ataqueActual->numNaves].consumption=500;
    ataqueActual->naves[ataqueActual->numNaves].speed=10000;
    ataqueActual->naves[ataqueActual->numNaves].capacity=1500;

    ataqueActual->naves[ataqueActual->numNaves].maxship = n;
    ataqueActual->naves[ataqueActual->numNaves].ship = n;
    ataqueActual->numNaves++;
  }

  // COLONIZADOR
  n = Edit7->Text.ToIntDef(0);
  if ( n>0 )
  {
    ataqueActual->naves[ataqueActual->numNaves].id=208;
    ataqueActual->naves[ataqueActual->numNaves].consumption=1000;
    ataqueActual->naves[ataqueActual->numNaves].speed=2500;
    ataqueActual->naves[ataqueActual->numNaves].capacity=7500;

    ataqueActual->naves[ataqueActual->numNaves].maxship = n;
    ataqueActual->naves[ataqueActual->numNaves].ship = n;
    ataqueActual->numNaves++;
  }


  // RECICLADOR
  n = Edit8->Text.ToIntDef(0);
  if ( n>0 )
  {
    ataqueActual->naves[ataqueActual->numNaves].id=209;
    ataqueActual->naves[ataqueActual->numNaves].consumption=300;
    ataqueActual->naves[ataqueActual->numNaves].speed=2000;
    ataqueActual->naves[ataqueActual->numNaves].capacity=20000;

    ataqueActual->naves[ataqueActual->numNaves].maxship = n;
    ataqueActual->naves[ataqueActual->numNaves].ship = n;
    ataqueActual->numNaves++;
  }

  // SONDA DE ESPIONAJE
  n = Edit9->Text.ToIntDef(0);
  if ( n>0 )
  {
    ataqueActual->naves[ataqueActual->numNaves].id=210;
    ataqueActual->naves[ataqueActual->numNaves].consumption=1;
    ataqueActual->naves[ataqueActual->numNaves].speed=100000000;
    ataqueActual->naves[ataqueActual->numNaves].capacity=5;

    ataqueActual->naves[ataqueActual->numNaves].maxship = n;
    ataqueActual->naves[ataqueActual->numNaves].ship = n;
    ataqueActual->numNaves++;
  }

  // BOMBARDERO
  n = Edit10->Text.ToIntDef(0);
  if ( n>0 )
  {
    ataqueActual->naves[ataqueActual->numNaves].id=211;
    ataqueActual->naves[ataqueActual->numNaves].consumption=1000;
    ataqueActual->naves[ataqueActual->numNaves].speed=4000;
    ataqueActual->naves[ataqueActual->numNaves].capacity=500;

    ataqueActual->naves[ataqueActual->numNaves].maxship = n;
    ataqueActual->naves[ataqueActual->numNaves].ship = n;
    ataqueActual->numNaves++;
  }

  // SATELITE SOLAR
  n = Edit11->Text.ToIntDef(0);
  if ( n>0 )
  {
    ataqueActual->naves[ataqueActual->numNaves].id=212;
    ataqueActual->naves[ataqueActual->numNaves].consumption=1;
    ataqueActual->naves[ataqueActual->numNaves].speed=100000000;
    ataqueActual->naves[ataqueActual->numNaves].capacity=10000000;

    ataqueActual->naves[ataqueActual->numNaves].maxship = n;
    ataqueActual->naves[ataqueActual->numNaves].ship = n;
    ataqueActual->numNaves++;
  }

  // DESTRUCTOR
  n = Edit12->Text.ToIntDef(0);
  if ( n>0 )
  {
    ataqueActual->naves[ataqueActual->numNaves].id=213;
    ataqueActual->naves[ataqueActual->numNaves].consumption=1000;
    ataqueActual->naves[ataqueActual->numNaves].speed=5000;
    ataqueActual->naves[ataqueActual->numNaves].capacity=2000;

    ataqueActual->naves[ataqueActual->numNaves].maxship = n;
    ataqueActual->naves[ataqueActual->numNaves].ship = n;
    ataqueActual->numNaves++;
  }


  // ESTRELLA DE LA MUERTE
  n = Edit13->Text.ToIntDef(0);
  if ( n>0 )
  {
    ataqueActual->naves[ataqueActual->numNaves].id=214;
    ataqueActual->naves[ataqueActual->numNaves].consumption=1;
    ataqueActual->naves[ataqueActual->numNaves].speed=100;
    ataqueActual->naves[ataqueActual->numNaves].capacity=1000000;

    ataqueActual->naves[ataqueActual->numNaves].maxship = n;
    ataqueActual->naves[ataqueActual->numNaves].ship = n;
    ataqueActual->numNaves++;
  }

  return AtaquesOfensivos->IndexOf(ataqueActual);
}

//---------------------------------------------------------------------------
void __fastcall TvisorAtaques::SpeedButton5Click(TObject *Sender)
{
 if ( dgAtaques->Row < (dgAtaques->RowCount-1) )
                                 dgAtaques->Row++;
}
//---------------------------------------------------------------------------

void __fastcall TvisorAtaques::SpeedButton6Click(TObject *Sender)
{
 if ( dgAtaques->Row > 1 )
                                 dgAtaques->Row--;

}
//---------------------------------------------------------------------------
void __fastcall TvisorAtaques::nuevoAtaque(void)
{
  int i;
  ataqueActual=NULL;
  i = guardarAtaque();
  resetAtaque(i);
  cargarAtaque(i);
}
//---------------------------------------------------------------------------
void __fastcall TvisorAtaques::SpeedButton1Click(TObject *Sender)
{
  guardarAtaque();
  nuevoAtaque();
  dgAtaques->Row=dgAtaques->RowCount-1;
}
//---------------------------------------------------------------------------
void __fastcall TvisorAtaques::resetAtaque(int i)
{
  AnsiString aux;
  
  ataqueActual = (TAtaqueOfensivo *)AtaquesOfensivos->Items[i];

  ataqueActual->lanzado=false;
  ataqueActual->numNaves=0;
  ataqueActual->velocidadBase = 0;
  ataqueActual->velocidadFactor = 0;
  ataqueActual->usarSatelites = false;

  // Origen del ataque
  aux = planetasOrigen->Items->Strings[ 0 ];
  ataqueActual->evento.gO=aux.SubString(1,1).ToIntDef(0);
  ataqueActual->evento.sO=aux.SubString(3,3).ToIntDef(0);
  ataqueActual->evento.pO=aux.SubString(7,2).ToIntDef(0);
  ataqueActual->evento.tO=aux.SubString(11,1).ToIntDef(0);

  // Destino del ataque
  ataqueActual->evento.gD=ataqueActual->evento.gO;
  ataqueActual->evento.sD=0;
  ataqueActual->evento.pD=0;
  ataqueActual->evento.tD=1;

  // Mision
  ataqueActual->evento.mision='a';

  // Naves que intervienen...
  for ( i=0; i<13; i++ )
  {
    ataqueActual->naves[i].id = 0;
    ataqueActual->naves[i].ship = 0;
  }
}
//---------------------------------------------------------------------------
void __fastcall TvisorAtaques::cargarAtaque(int i)
{
  ataqueActual = (TAtaqueOfensivo *)AtaquesOfensivos->Items[i];
  dgAtaques->RowCount = AtaquesOfensivos->Count+1;

  // Fijamos los datos del destino...
  gD->Text = AnsiString( ataqueActual->evento.gD );
  sD->Text = AnsiString( ataqueActual->evento.sD );
  pD->Text = AnsiString( ataqueActual->evento.pD );
  tipoD->ItemIndex = (ataqueActual->evento.tD-1);
  // mision
  switch( ataqueActual->evento.mision )
  {
    case 'a': ordenes->ItemIndex=0; break;
    case 'd': ordenes->ItemIndex=1; break;
    case 't': ordenes->ItemIndex=2; break;
    case 'r': ordenes->ItemIndex=3; break;
    case 'e': ordenes->ItemIndex=4; break;
  }
  // Fijamos los datos del origen...
  AnsiString aux;
  aux = Format("%d:%.3d:%.2d -%d-",ARRAYOFCONST((ataqueActual->evento.gO,ataqueActual->evento.sO,ataqueActual->evento.pO,ataqueActual->evento.tO)) );
  /* buscamos en la lista de planetas origen, un patron que concuerde con el formato anterior */
  for( i=0;i<planetasOrigen->Items->Count;i++ )
    if ( planetasOrigen->Items->Strings[i].Pos(aux)!=0 )
        planetasOrigen->ItemIndex=i;

  /* Fijamos la velocidad Factor / Base */
  switch( ataqueActual->velocidadFactor )
  {
    case '10':  velocidadFactor->ItemIndex = 0;  break;
    case '9':   velocidadFactor->ItemIndex = 1;  break;
    case '8':   velocidadFactor->ItemIndex = 2;  break;
    case '7':   velocidadFactor->ItemIndex = 3;  break;
    case '6':   velocidadFactor->ItemIndex = 4;  break;
    case '5':   velocidadFactor->ItemIndex = 5;  break;
    case '4':   velocidadFactor->ItemIndex = 6;  break;
    case '3':   velocidadFactor->ItemIndex = 7;  break;
    case '2':   velocidadFactor->ItemIndex = 8;  break;
    case '1':   velocidadFactor->ItemIndex = 9;  break;
    case '15':  velocidadFactor->ItemIndex = 10;  break;
    case '20':  velocidadFactor->ItemIndex = 11;  break;
    case '90':  velocidadFactor->ItemIndex = 12;  break;

    default:
          velocidadFactor->ItemIndex = 0;
          break;
  }
  switch( ataqueActual->velocidadBase )
  {
    case 0:         velocidadBase->ItemIndex = 0; break;
    case 15000:     velocidadBase->ItemIndex = 1; break;
    case 10000:     velocidadBase->ItemIndex = 2; break;
    case 100000000: velocidadBase->ItemIndex = 3; break;

    default:
        velocidadBase->ItemIndex = 0;
        break;
  }

  // Marca de uso de satelites (Posible BUG de oGAME)
  usarSatelites->Checked = ataqueActual->usarSatelites;


  Edit1->Text=0;Edit2->Text=0;Edit3->Text=0;Edit4->Text=0;Edit5->Text=0;Edit6->Text=0;Edit7->Text=0;Edit8->Text=0;
  Edit9->Text=0;Edit10->Text=0;Edit11->Text=0;Edit12->Text=0;Edit13->Text=0;
  // Naves que intervienen...
  for ( i=0; i<ataqueActual->numNaves; i++ )
  {
    switch( ataqueActual->naves[i].id )
    {
        case 202: Edit1->Text = ataqueActual->naves[i].ship; break;
        case 203: Edit2->Text = ataqueActual->naves[i].ship; break;
        case 204: Edit3->Text = ataqueActual->naves[i].ship; break;
        case 205: Edit4->Text = ataqueActual->naves[i].ship; break;
        case 206: Edit5->Text = ataqueActual->naves[i].ship; break;
        case 207: Edit6->Text = ataqueActual->naves[i].ship; break;
        case 208: Edit7->Text = ataqueActual->naves[i].ship; break;
        case 209: Edit8->Text = ataqueActual->naves[i].ship; break;
        case 210: Edit9->Text = ataqueActual->naves[i].ship; break;
        case 211: Edit10->Text = ataqueActual->naves[i].ship; break;
        case 212: Edit11->Text = ataqueActual->naves[i].ship; break;
        case 213: Edit12->Text = ataqueActual->naves[i].ship; break;
        case 214: Edit13->Text = ataqueActual->naves[i].ship; break;
    }
  }


}
//---------------------------------------------------------------------------
void __fastcall TvisorAtaques::dgAtaquesDrawCell(TObject *Sender,
      int ACol, int ARow, TRect &Rect, TGridDrawState State)
{
  if ( ARow==0 )
  {
        if ( ACol==0 )
                  dgAtaques->RowHeights[0]=18;

                  dgAtaques->Canvas->TextOut(Rect.Left,Rect.Top," Planeta Origen");
                  dgAtaques->Canvas->TextOut(Rect.Left+120,Rect.Top," [GSP] Destino"   );
                  dgAtaques->Canvas->TextOut(Rect.Left+240,Rect.Top," Ord"   );
  } else {
    if ( ARow <= AtaquesOfensivos->Count )
//    if ( (ARow-1) < AtaquesOfensivos->Count )
    {

        int tH,tM,tS;
        PAtaqueOfensivo EAtaque;
        EAtaque = (PAtaqueOfensivo)AtaquesOfensivos->Items[ARow-1];

        // Fondo del GRID
        if (!State.Contains(gdFocused))
        {
          switch( EAtaque->evento.mision )
          {
                case 's': dgAtaques->Canvas->Brush->Color = 0x007DDBFF; break;
                case 't': dgAtaques->Canvas->Brush->Color = clSkyBlue;  break;
                case 'A': dgAtaques->Canvas->Brush->Color = 0x006262FF; break;
                case 'r': dgAtaques->Canvas->Brush->Color = 0x007282B8; break; /* BGR */
                default:
                          dgAtaques->Canvas->Brush->Color = clWhite;
          }
        }
                  dgAtaques->Canvas->TextRect(TRect(Rect.Left,Rect.Top,Rect.Right,Rect.Top+16),Rect.Left,Rect.Top,"["+AnsiString(EAtaque->evento.gO)+":"+AnsiString(EAtaque->evento.sO)+":"+AnsiString(EAtaque->evento.pO)+"]."+AnsiString(EAtaque->evento.tO));
                  dgAtaques->Canvas->TextRect(TRect(Rect.Left+120,Rect.Top,Rect.Right,Rect.Top+16),Rect.Left+120,Rect.Top,"["+AnsiString(EAtaque->evento.gD)+":"+AnsiString(EAtaque->evento.sD)+":"+AnsiString(EAtaque->evento.pD)+"]."+AnsiString(EAtaque->evento.tD));
                  dgAtaques->Canvas->TextRect(TRect(Rect.Left+240,Rect.Top,Rect.Right,Rect.Top+16),Rect.Left+240,Rect.Top, EAtaque->evento.mision);
                  dgAtaques->Canvas->TextRect(TRect(Rect.Left,Rect.Top+16,Rect.Right,Rect.Bottom),Rect.Left,Rect.Top + 16, digerirFlota(EAtaque->naves,EAtaque->numNaves) );

        if (State.Contains(gdFocused))
               dgAtaques->Canvas->DrawFocusRect(Rect);
    }
  }

}
//---------------------------------------------------------------------------

void __fastcall TvisorAtaques::dgAtaquesSelectCell(TObject *Sender,
      int ACol, int ARow, bool &CanSelect)
{
 if ( ARow<1 ) CanSelect=false;
 else {
         if (!updatingDB)
                         guardarAtaque();
         cargarAtaque(ARow-1);
 }
}
//---------------------------------------------------------------------------
AnsiString __fastcall TvisorAtaques::digerirFlota(THangar *naves,int numNaves)
{
  AnsiString dev;
  int i;
  for ( i=0; i<numNaves; i++ )
  {
    switch( naves[i].id )
    {
        case 202: dev += AnsiString(naves[i].ship)+AnsiString("c "); break;
        case 203: dev += AnsiString(naves[i].ship)+AnsiString("C "); break;
        case 204: dev += AnsiString(naves[i].ship)+AnsiString("lg "); break;
        case 205: dev += AnsiString(naves[i].ship)+AnsiString("ps "); break;
        case 206: dev += AnsiString(naves[i].ship)+AnsiString("cr "); break;
        case 207: dev += AnsiString(naves[i].ship)+AnsiString("nb "); break;
        case 208: dev += AnsiString(naves[i].ship)+AnsiString("col "); break;
        case 209: dev += AnsiString(naves[i].ship)+AnsiString("R "); break;
        case 210: dev += AnsiString(naves[i].ship)+AnsiString("S "); break;
        case 211: dev += AnsiString(naves[i].ship)+AnsiString("B "); break;
        case 212: dev += AnsiString(naves[i].ship)+AnsiString("sat "); break;
        case 213: dev += AnsiString(naves[i].ship)+AnsiString("D "); break;
        case 214: dev += AnsiString(naves[i].ship)+AnsiString("EdlM "); break;
    }
  }
  return dev;
}
//---------------------------------------------------------------------------
void __fastcall TvisorAtaques::SpeedButton4Click(TObject *Sender)
{
 int i,rc;
 updatingDB = true;


 i = AtaquesOfensivos->IndexOf(ataqueActual);
 if ( i>=0 )
 {
         delete ataqueActual;
         ataqueActual = NULL;
         AtaquesOfensivos->Delete(i);

         if ( AtaquesOfensivos->Count==0 )
         {
                 nuevoAtaque();
                 dgAtaques->RowCount = AtaquesOfensivos->Count + 1;
                 dgAtaques->FixedRows=1;
                 dgAtaques->Row=1;
         } else {
                if ( i==0 )
                {
                         cargarAtaque(0);
                         dgAtaques->Row=1;
                } else {
                         cargarAtaque(i-1);
                         dgAtaques->Row=i;
                }
         }
 }

 updatingDB = false;
}
//---------------------------------------------------------------------------

void __fastcall TvisorAtaques::SpeedButton3Click(TObject *Sender)
{
  bool save;
  int i;
  if (SaveDialog1->Execute())
  {
    save = true;
    if ( FileExists(SaveDialog1->FileName) )
      save = ( MessageDlg("El fichero destino ya existe. ¿reemplazar archivo? ",
                 mtWarning, TMsgDlgButtons() << mbYes << mbNo << mbCancel, 0)  == mrYes
             );

    if ( save ) {

    FILE *out;
    if ((out = fopen(SaveDialog1->FileName.c_str(), "wt")) != NULL)
    {
        // Parseamos la lista de ataques a un CVS
        // gO,sO,pO,tO,mision,gD,sD,pD,tD,velocidad,metal,cristal,deuterio,-1,-2,-3,-4,-5,#c,#C,#lg,#cz,#cr,#nb~,#col,#rc,#S,#b,#sat,#d,#edlm
        TAtaqueOfensivo *Ataque;
        for (i=0;i<AtaquesOfensivos->Count; i++ )
        {
           Ataque = (TAtaqueOfensivo *)AtaquesOfensivos->Items[i];
           fprintf( out, "%d:%0.3d:%0.2d.%d,%c,%d:%0.3d:%0.2d.%d,%d,%ld,0,0,0,0,0,0,%d,%d:{%d:%d,%d:%d,%d:%d,%d:%d,%d:%d,%d:%d,%d:%d,%d:%d,%d:%d,%d:%d,%d:%d,%d:%d,%d:%d}\n",
                        Ataque->evento.gO,Ataque->evento.sO,Ataque->evento.pO,Ataque->evento.tO,
                        Ataque->evento.mision,
                        Ataque->evento.gD,Ataque->evento.sD,Ataque->evento.pD,Ataque->evento.tD,
                        Ataque->velocidadFactor,Ataque->velocidadBase,
                        (Ataque->usarSatelites?1:0),
                        Ataque->numNaves,
                        Ataque->naves[0].id,Ataque->naves[0].ship,
                        Ataque->naves[1].id,Ataque->naves[1].ship,
                        Ataque->naves[2].id,Ataque->naves[2].ship,
                        Ataque->naves[3].id,Ataque->naves[3].ship,
                        Ataque->naves[4].id,Ataque->naves[4].ship,
                        Ataque->naves[5].id,Ataque->naves[5].ship,
                        Ataque->naves[6].id,Ataque->naves[6].ship,
                        Ataque->naves[7].id,Ataque->naves[7].ship,
                        Ataque->naves[8].id,Ataque->naves[8].ship,
                        Ataque->naves[9].id,Ataque->naves[9].ship,
                        Ataque->naves[10].id,Ataque->naves[10].ship,
                        Ataque->naves[11].id,Ataque->naves[11].ship,
                        Ataque->naves[12].id,Ataque->naves[12].ship
                );
        }
      fclose(out);
    }
   }
  }
}
//---------------------------------------------------------------------------

void __fastcall TvisorAtaques::SpeedButton7Click(TObject *Sender)
{

  if (OpenDialog1->Execute() && FileExists(OpenDialog1->FileName) )
  {
    updatingDB = true;
    dgAtaques->RowCount = 1;



    TIniFile *ini;
    ini = new TIniFile(ExtractFileDir(Application->ExeName)+"\\salvaVidas.ini");
    if ( main->cargarAtaques(OpenDialog1->FileName) )
    {
          ini->WriteString("colaAtaques","nombreCola",OpenDialog1->FileName);

          dgAtaques->RowCount = AtaquesOfensivos->Count+1;
          if (dgAtaques->RowCount>1)
          {
                dgAtaques->FixedRows=1;
//        ataqueActual = NULL;
                cargarAtaque(0);
//        dgAtaques->Row=1;
          }
    } else
          ini->WriteString("colaAtaques","nombreCola","");
    delete ini;

    updatingDB = false;

  }
}

/*
bool __fastcall TvisorAtaques::cargarAtaques(AnsiString filename)
{
  float aux;
  bool dev;

  dev=false;

    FILE *in;
    if ((in = fopen(filename.c_str(), "rt")) != NULL)
    {
      TAtaqueOfensivo *Ataque;

      // BEGIN -- Limpiamos la cola actual
      int i;
      for (i=0;i<AtaquesOfensivos->Count;i++)
      {
        Ataque = (TAtaqueOfensivo *)AtaquesOfensivos->Items[i];
        delete Ataque;
      }
      AtaquesOfensivos->Clear();
      // END  -- Limpiamos la cola actual

      int _usarSatelites;
      i=0;
      Ataque = new TAtaqueOfensivo;
      do
      {
        i = fscanf(in,"%d:%d:%d.%d,%c,%d:%d:%d.%d,%d,%ld,%d,%d,%d,%d,%d,%d,%d,%d:{%d:%d,%d:%d,%d:%d,%d:%d,%d:%d,%d:%d,%d:%d,%d:%d,%d:%d,%d:%d,%d:%d,%d:%d,%d:%d}",
                        &Ataque->evento.gO,&Ataque->evento.sO,&Ataque->evento.pO,&Ataque->evento.tO,
                        &Ataque->evento.mision,
                        &Ataque->evento.gD,&Ataque->evento.sD,&Ataque->evento.pD,&Ataque->evento.tD,
                        &Ataque->velocidadFactor,&Ataque->velocidadBase,
                        &aux,&aux,&aux,&aux,&aux,&aux,
                        &_usarSatelites,
                        &Ataque->numNaves,
                        &Ataque->naves[0].id,&Ataque->naves[0].ship,
                        &Ataque->naves[1].id,&Ataque->naves[1].ship,
                        &Ataque->naves[2].id,&Ataque->naves[2].ship,
                        &Ataque->naves[3].id,&Ataque->naves[3].ship,
                        &Ataque->naves[4].id,&Ataque->naves[4].ship,
                        &Ataque->naves[5].id,&Ataque->naves[5].ship,
                        &Ataque->naves[6].id,&Ataque->naves[6].ship,
                        &Ataque->naves[7].id,&Ataque->naves[7].ship,
                        &Ataque->naves[8].id,&Ataque->naves[8].ship,
                        &Ataque->naves[9].id,&Ataque->naves[9].ship,
                        &Ataque->naves[10].id,&Ataque->naves[10].ship,
                        &Ataque->naves[11].id,&Ataque->naves[11].ship,
                        &Ataque->naves[12].id,&Ataque->naves[12].ship
                );
        if ( i>0 )
        {
              Ataque->usarSatelites = (_usarSatelites==1);
              Ataque->lanzado = false;
              Ataque->evento.status=12;Ataque->evento.avisado=true;

              if ( Ataque->numNaves>13 ) Ataque->numNaves=13;
              main->fixParams(Ataque->naves);
              AtaquesOfensivos->Add(Ataque);
              Ataque = new TAtaqueOfensivo;
        }
      }while( i>0 );
      delete Ataque;


      fclose(in);

      dev = true;
    }

    return dev;
}
*/
//---------------------------------------------------------------------------
/* Magnetic Form */
/*****************/
//---------------------------------------------------------------------------
void __fastcall TvisorAtaques::SettingChanged(TMessage &msg)
{
  UpdateWorkArea();
}
//---------------------------------------------------------------------------
void __fastcall TvisorAtaques::WMWindowPosChanging(TWMWindowPosChanging &msg)
{
  RECT sr;
  snapped=false;
  //test window
  if (snapwin && IsWindowVisible(snapwin))
  {
    if (GetWindowRect(snapwin,&sr))
    {
      if ( (msg.WindowPos->x <= (sr.right+thresh)) &&
           (msg.WindowPos->x >= (sr.right-thresh)) ) {
        if ((msg.WindowPos->y > sr.top) && (msg.WindowPos->y < sr.bottom)) {
          snapped=true;
          msg.WindowPos->x = sr.right;
        }
      }
      else if ((msg.WindowPos->x + msg.WindowPos->cx) >= (sr.left-thresh) &&
               (msg.WindowPos->x + msg.WindowPos->cx) <= (sr.left+thresh)) {
        if ((msg.WindowPos->y > sr.top) && (msg.WindowPos->y < sr.bottom)) {
          snapped=true;
          msg.WindowPos->x = sr.left-msg.WindowPos->cx;
        }
      }

      if ( (msg.WindowPos->y <= (sr.bottom+thresh)) &&
           (msg.WindowPos->y >= (sr.bottom-thresh)) ) {
        if ((msg.WindowPos->x > sr.left) && (msg.WindowPos->x < sr.right)) {
          snapped=true;
          msg.WindowPos->y = sr.bottom;
        }
      }
      else if ((msg.WindowPos->y + msg.WindowPos->cy) <= (sr.top+thresh) &&
               (msg.WindowPos->y + msg.WindowPos->cy) >= (sr.top-thresh)) {
        if ((msg.WindowPos->x > sr.left) && (msg.WindowPos->x < sr.right)) {
          snapped=true;
          msg.WindowPos->y = sr.top-msg.WindowPos->cy;
        }
      }
    }
  }

  //test screen
  sr = work_area;
  if (abs(msg.WindowPos->x) <= (sr.left+thresh)) {
    snapped=true;
    msg.WindowPos->x = sr.left;
  }
  else if ((msg.WindowPos->x + msg.WindowPos->cx) >= (sr.right-thresh) &&
           (msg.WindowPos->x + msg.WindowPos->cx) <= (sr.right+thresh)) {
    snapped=true;
    msg.WindowPos->x = sr.right-msg.WindowPos->cx;
  }

  if (abs(msg.WindowPos->y) <= (sr.top+thresh)) {
    snapped=true;
    msg.WindowPos->y = sr.top;
  }
  else if ((msg.WindowPos->y+msg.WindowPos->cy) >= (sr.bottom-thresh) &&
           (msg.WindowPos->y+msg.WindowPos->cy) <= (sr.bottom+thresh)) {
    snapped=true;
    msg.WindowPos->y = sr.bottom-msg.WindowPos->cy;
  }
}
//---------------------------------------------------------------------------
void __fastcall TvisorAtaques::UpdateWorkArea()
{
  SystemParametersInfo(SPI_GETWORKAREA, 0, &work_area, 0);
  //get the size of the desktop or whatever
}
//---------------------------------------------------------------------------

