salvaVidas/scr/Tmain.~cpp
2021-09-01 18:26:41 +02:00

3840 lines
161 KiB
Plaintext
Raw Permalink Blame History

//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <mmsystem.h>
#include <dateutils.hpp>
#pragma hdrstop
#include "Tmain.h"
#include "THTTPdownloader.h"
#include "inifiles.hpp"
#include "TAlertBox.h"
#include "visorAtaque.h"
#include "TInfoBox.h"
#include "TComprobadorActividad.h"
//---------------------------------------------------------------------------
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define csREADPASS -2
#define csRESETPASS -1
#define csLOGIN 0
#define csREADY 1
#pragma package(smart_init)
#pragma resource "*.dfm"
Tmain *main;
//---------------------------------------------------------------------------
__fastcall Tmain::Tmain(TComponent* Owner)
: TForm(Owner)
{
currentState = csLOGIN;
/* Magnetic Form */
snapped=false;
UpdateWorkArea(); //set our workarea rect
thresh = 25; //get threshold
// snapwin = FindWindow("TvisorAtaques",NULL); //get window to snap to
/*****************/
computacionesOcupadas = -1;
numEventos = 0;
randomize();
nextUpdateCLK=60;
/*
nextUpdate->Interval=nextUpdateCLK*1000;
nextUpdate->Enabled=true;
*/
MyEvents = new TList;
MyAttacks = new TList;
MyPlanets = new TList;
AtaquesOfensivos = new TList;
TIniFile *ini;
ini = new TIniFile(ExtractFileDir(Application->ExeName)+"\\salvaVidas.ini");
this->Top = ini->ReadInteger("window","TOP",this->Top);
this->Left = ini->ReadInteger("window","LEFT",this->Left);
this->Width = ini->ReadInteger("window","WIDTH",this->Width);
this->Height = ini->ReadInteger("window","HEIGHT",this->Height);
CFG_programSondeo = ini->ReadString("avisos","programSondeo","");;
CFG_ejecutarProgama = !CFG_programSondeo.IsEmpty();
sndCHK_ataque->Checked = ini->ReadBool("avisos","ataqueAutomatico",false);
sndCHK_sondeo->Checked = ini->ReadBool("avisos","sondeoAlEnemigo",false);
sndCHK_peligro->Checked =ini->ReadBool("avisos","atacanteDetectado",true);
sndCHK_error->Checked = ini->ReadBool("avisos","erroresGenerales",false);
sndCHK_network->Checked =ini->ReadBool("avisos","sinConexionRed",true);
chkSondeo5min->Checked = ini->ReadBool("avisos","sondeo5min",false);
chkSondeo2min->Checked = ini->ReadBool("avisos","sondeo3min",false);
chkAviso5min->Checked = ini->ReadBool("avisos","aviso5min",false);
MenuItem5->Checked = ini->ReadBool("avisos","alarmaPersonal",false);
activarColaAtaques->Checked = ini->ReadBool("colaAtaques","colaActiva",true);
AnsiString colaAtaques = ini->ReadString("colaAtaques","nombreCola","");
int x = ini->ReadInteger("colaAtaques","siguienteAtaque",0);
oG_email = ini->ReadString("login","email","");
oG_urlReadPass= ini->ReadString("login","urlReadPass","");
oG_login = ini->ReadString("login","user","");
oG_password = ini->ReadString("login","pass","");
oG_host = ini->ReadString("login","host","");
oG_Universo = ini->ReadInteger("login","univ",12);
oG_userAgent = ini->ReadString("login","userAgent","Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1");
oG_lphu = ini->ReadString("login","lphu","");
if ( !oG_lphu.IsEmpty() )
oG_decode(oG_lphu,&oG_login,&oG_password,&oG_host,&oG_Universo);
else {
oG_encode(&oG_lphu,oG_login,oG_password,oG_host,oG_Universo);
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+oG_lphu );
}
oG_location = ini->ReadString("login","redir","");
CFG_visionGeneralSoloLunas = ini->ReadBool("keepAlive","visionGeneralSoloLunas",false);
CFG_tiempoCritico = ini->ReadInteger("keepAlive","tiempoCritico",4); // Cuatro segundos antes de que llegue el ataque, retirar TODO.
CFG_ocuparMaxComputaciones = ini->ReadInteger("keepAlive","ocuparMaxComputaciones",10); // Computaciones m<>ximas que se quieren tener ocupadas para los ataques automatizados
setComputaciones->Position = CFG_ocuparMaxComputaciones;
CFG_verbose = ini->ReadBool("keepAlive","verbose",true); // Mostrar toda la informacion posible de lo que estamos haciendo
CFG_ocultarActividadDespuesResetServer = ini->ReadBool("keepAlive","ocultarActividadDespuesResetServer",false); // Oculta el * despues de logar por segunda vez (por ejemplo tras el reset del server a las 3:00 am)
delete ini;
/*
oG_login = "cataglyphis";
oG_password = "cabrones";
oG_host = "ogame310.de";
oG_Universo = 14;
*/
oG_session = "";
oG_SSID = "";
oG_Cookie = "";
session->Text = oG_session;
PHPSESSID->Text = oG_Cookie;
PageControl1->ActivePage=TabSheet1;
Application->Title = "sV: "+oG_login+" - U"+AnsiString(oG_Universo);
this->Caption = "salvaVidas 0.5 Alpha :: "+oG_login+" - U"+AnsiString(oG_Universo);
espacioEntreAtaques = nextUpdateCLK + 60; // La cola de ataque se activa 60 segundos despues de la primera vision general...
espacioEntreAtaques = 30; // La cola de ataque se activa 180 segundos despues de lanzar el programa...
if ( !colaAtaques.IsEmpty() && cargarAtaques(colaAtaques) )
{
// marcamos todos los ataques (hasta x) como lanzados
x = min(x,AtaquesOfensivos->Count);
for (int i=0;i<x;i++) ((TAtaqueOfensivo *)AtaquesOfensivos->Items[i])->lanzado = true;
dgAtaques->RowCount = AtaquesOfensivos->Count+1;
if ( dgAtaques->RowCount>1 ) dgAtaques->FixedRows=1;
}
}
//---------------------------------------------------------------------------
void __fastcall Tmain::oG_decode(AnsiString oG_lphu,AnsiString *oG_login,AnsiString *oG_password,AnsiString *oG_host,int *oG_Universo)
{
char buffer[256], *aux;
int i,j,z;
i=5;
aux = buffer;
for (j=1;j<=oG_lphu.Length() && oG_lphu[j]!='<27>';j++)
*(aux++) = (unsigned char)oG_lphu[j]-(unsigned char)((i++)%26);
j++;*(aux++)='\0';
*oG_login = buffer;
aux = buffer;
for (;j<=oG_lphu.Length() && oG_lphu[j]!='<27>';j++)
*(aux++) = (unsigned char)oG_lphu[j]-(unsigned char)((i++)%26);
j++;*(aux++)='\0';
*oG_password = buffer;
aux = buffer;
for (;j<=oG_lphu.Length() && oG_lphu[j]!='<27>';j++)
*(aux++) = (unsigned char)oG_lphu[j]-(unsigned char)((i++)%26);
j++;*(aux++)='\0';
*oG_host = buffer;
*oG_Universo = oG_lphu[j]-'0';
}
//---------------------------------------------------------------------------
void __fastcall Tmain::oG_encode(AnsiString *oG_lphu,AnsiString oG_login,AnsiString oG_password,AnsiString oG_host,int oG_Universo)
{
char buffer[256], *aux;
int i,j,z;
i=5;
aux = buffer;
for (j=1;j<=oG_login.Length();j++)
*(aux++) = (unsigned char)oG_login[j]+(unsigned char)((i++)%26);
*(aux++)='<27>';
for (j=1;j<=oG_password.Length();j++)
*(aux++)= (unsigned char)oG_password[j]+(unsigned char)((i++)%26);
*(aux++)='<27>';
for (j=1;j<=oG_host.Length();j++)
*(aux++)= (unsigned char)oG_host[j]+(unsigned char)((i++)%26);
*(aux++)='<27>';
*(aux++)=oG_Universo+'0';
*(aux++)='\0';
*oG_lphu = buffer;
}
//---------------------------------------------------------------------------
void __fastcall Tmain::Button3Click(TObject *Sender)
{
HTTPdownloader->Show();
}
//---------------------------------------------------------------------------
int __fastcall Tmain::recuperarPassword(void) {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > CAMBIO DE PASSWORD") );
nextUpdateCLK = 5;
AnsiString request, host, page;
int error;
int s;
host = oG_urlReadPass.SubString(8, oG_urlReadPass.Length()-7);
s = host.Pos("/");
page = host.SubString( s, host.Length()-s );
host = host.SubString( 1, s-1 );
request ="GET "+page+" HTTP/1.1\r\n";
request+="Host: "+host+"\r\n";
request+="User-Agent: "+oG_userAgent+"\r\n";
request+="Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
request+="Accept-Language: es,es-ar;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
request+="Accept-Encoding: gzip,deflate\r\n";
request+="Accept-Charset: windows-1252,utf-8;q=0.7,*;q=0.7\r\n";
request+="Keep-Alive: 300\r\n";
request+="Connection: keep-alive\r\n";
lastRequest = lastRequest_login;
TMemoryStream* out = new TMemoryStream();
error = HTTPdownloader->descargarHTML(host.c_str(),request.c_str(),out);
if ( error==-1 ) {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > Inicio Sesion: error recuperando password") );
} else {
out->Position=0;
if ( ((char *)out->Memory)[0] == 'p' && ((char *)out->Memory)[1] == '|' ) {
oG_password = AnsiString((char *)out->Memory+2);
currentState = csLOGIN;
}
}
}
//---------------------------------------------------------------------------
int __fastcall Tmain::cambioPassword(void) {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > CAMBIO DE PASSWORD") );
nextUpdateCLK = 5;
AnsiString request;
int error;
request ="POST http://"+oG_host+"/game/reg/fa_pass.php HTTP/1.1\r\n";
request+="Host: "+oG_host+"\r\n";
request+="User-Agent: "+oG_userAgent+"\r\n";
request+="Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
request+="Accept-Language: es,es-ar;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
request+="Accept-Encoding: gzip,deflate\r\n";
request+="Accept-Charset: windows-1252,utf-8;q=0.7,*;q=0.7\r\n";
request+="Keep-Alive: 300\r\n";
request+="Connection: keep-alive\r\n";
request+="Referer: http://"+oG_host+"/game/reg/mail.php\r\n";
request+="Content-Type: application/x-www-form-urlencoded\r\n";
AnsiString params="email="+oG_email+"&send_pass=Enviar datos de acceso";
request+="Content-Length: "+AnsiString(params.Length())+"\r\n\r\n";
request+=params;
lastRequest = lastRequest_login;
TMemoryStream* out = new TMemoryStream();
error = HTTPdownloader->descargarHTML(oG_host.c_str(),request.c_str(),out);
if ( error==-1 ) {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > Inicio Sesion: error cambiando password") );
} else {
currentState = csREADPASS;
}
}
//---------------------------------------------------------------------------
int __fastcall Tmain::iniciarSesion()
{
/*****************************/
TDateTime start = Time();
TDateTime stop;
/*****************************/
AnsiString request, v;
int error = -1;
if ( !CFG_ocultarActividadDespuesResetServer )
MyPlanets->Clear();
request ="POST http://"+oG_host+"/game/reg/login2.php HTTP/1.1\r\n";
request+="Host: "+oG_host+"\r\n";
request+="User-Agent: "+oG_userAgent+"\r\n";
request+="Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
request+="Accept-Language: es,es-ar;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
request+="Accept-Encoding: gzip,deflate\r\n";
request+="Accept-Charset: windows-1252,utf-8;q=0.7,*;q=0.7\r\n";
request+="Keep-Alive: 300\r\n";
request+="Connection: keep-alive\r\n";
request+="Referer: http://ogame.com.es/home.php\r\n";
request+="Content-Type: application/x-www-form-urlencoded\r\n";
AnsiString params="v=2&is_utf8=0&login="+oG_login+"&pass="+oG_password;
request+="Content-Length: "+AnsiString(params.Length())+"\r\n\r\n";
request+=params;
lastRequest = lastRequest_login;
TMemoryStream* out = new TMemoryStream();
error = HTTPdownloader->descargarHTML(oG_host.c_str(),request.c_str(),out);
/*****************************/
stop=Time();
/*****************************/
if ( error==-1 ) {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > Inicio Sesion: error de conexi<78>n") );
} else {
if ( out->Size <= 10 ) return -1;
error = checkError( out );
if ( error==-1 ) return -1;
oG_Cookie=obtenerOGCookie(); // Tambien obtiene la session (la session Ya no, ahora va en el meta)
if ( oG_session.IsEmpty() )
{
char *pos, *posEnd, session[13];
out->Position=0;
pos=StrPos((char *)out->Memory,"session=")+8;
oG_session = AnsiString( StrLCopy(session,pos,12) );
}
if ( !oG_session.IsEmpty() )
{
statusBar->SelAttributes->Color = clGreen;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > Inicio Sesion: ")+oG_session+" ["+AnsiString(MilliSecondsBetween(stop,start))+" / "+AnsiString(MilliSecondsBetween(Time(),stop))+"]");
session->Text = oG_session;
PHPSESSID->Text = oG_Cookie;
error = 0;
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > Inicio Sesion: oGameXXX.de SERVER error") );
}
}
if ( error==-1 ) {
errorCONEXION ++;
if ( errorCONEXION>20 ) {
nextUpdateCLK = 600;
} else
if ( errorCONEXION>3 ) {
nextUpdateCLK = 60;
} else
nextUpdateCLK = 10;
currentState = csLOGIN;
} else {
errorCONEXION = 0;
currentState = csREADY;
nextUpdateCLK = 1;
}
return error;
}
//---------------------------------------------------------------------------
AnsiString __fastcall Tmain::obtenerOGCookie(void)
{
AnsiString gameIndex_url;
HTTPheaders_list HeaderStruct;
int i;
gameIndex_url="";
oG_Cookie="";
for (i=0;i<HTTPdownloader->headers->Count; i++ )
{
HeaderStruct = (HTTPheaders_list)HTTPdownloader->headers->Items[i];
if ( HeaderStruct->key=="set-cookie" )
{
oG_Cookie = HeaderStruct->value.SubString(0,HeaderStruct->value.Pos(";"))+oG_Cookie;
}
if ( HeaderStruct->key=="location" )
gameIndex_url = HeaderStruct->value;
}
/*
Set-Cookie: PHPSESSID=351a763aba26b96a6766556cef275e6b; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: U_es14:lupenlll=U_es14%3Alupenlll; expires=Sun, 23 Sep 2007 22:02:52 GMT; path=/
*/
oG_session = "";
int pos;
pos = gameIndex_url.Pos("session=");
if ( pos>0 )
{
oG_session = gameIndex_url.SubString(pos+8,12);
}
// NOS QUEDAMOS SOLO CON EL PHPSESSID
// SOY consciente de que en alg<6C>n momento
// (probablemente al inicio de sessi<73>n en ogame.com.es, perd<72> el AMA
// que creo estar seguro que representa el TIMESTAMP del PHPSESSID)
oG_Cookie = oG_Cookie.SubString(0,oG_Cookie.Length()-1);
/*
i = oG_Cookie.Pos("PHPSESSID=");
if ( i>0 )
oG_Cookie = "PHPSESSID="+oG_Cookie.SubString(i+10,32);
*/
return oG_Cookie;
}
//---------------------------------------------------------------------------
int __fastcall Tmain::visionGeneral(void)
{
int p=0;
if (MyPlanets->Count>0)
{
if ( activarSondeo->Checked )
{
// Cuando el sondeo esta activo, las actualizaciones se producen solo desde el planeta origen del sondeo.
p = (int)planetasOrigenSondeo->Items->Objects[planetasOrigenSondeo->ItemIndex];
} else {
do {
p = rand() % MyPlanets->Count;
} while ( CFG_visionGeneralSoloLunas && ((PPlanetas)MyPlanets->Items[p])->t!=3 );
}
}
return _visionGeneral(p);
}
//---------------------------------------------------------------------------
int __fastcall Tmain::_visionGeneral(int idxPLANET)
{
TDateTime start=Time();
TDateTime stop;
bool enc;
bool nosAtacan = false;
int error;
AnsiString request;
// Descargamos la p<>gina de mensajes...
// oG_host, oG_session, oG_SSID, oG_Cookie;
error = 0;
if ( oG_session=="" )
{
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Session vacia") );
currentState = csLOGIN;
nextUpdateCLK = 0;
}
if ( error!=-1 )
{
request = "GET /game/index.php?page=overview&session="+oG_session;
if ( MyPlanets->Count>0 && idxPLANET>=0 && idxPLANET<MyPlanets->Count )
{
request+="&cp="+AnsiString(((PPlanetas)MyPlanets->Items[idxPLANET])->cp)+"&mode=&gid=&messageziel=&re=0";
}
request+=" HTTP/1.1\r\n";
request+= "Host: "+oG_host+"\r\n";
request+= "User-Agent: "+oG_userAgent+"\r\n";//Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.7.12) Gecko/20050919 Firefox/1.0.7\r\n";
request+= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
request+= "Accept-Language: es-es,es;q=0.8\r\n";
request+= "Accept-Encoding: gzip,deflate\r\n";
request+= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
request+= "Keep-Alive: 300\r\n";
request+= "Connection: keep-alive\r\n";
if ( !oG_Cookie.IsEmpty() )
request+= "Cookie: "+oG_Cookie+"\r\n";
request+= "\r\n";
lastRequest = lastRequest_overview;
TMemoryStream* out = new TMemoryStream();
error = HTTPdownloader->descargarHTML(oG_host.c_str(),request.c_str(),out);
/*******************/
stop=Time();
/*******************/
if ( error!=-1 )
{
error = checkError( out );
if ( error!=-1 )
{
// Parseamos el listado de mensajes...
int i;
if ( oG_Cookie.IsEmpty() )
oG_Cookie = obtenerOGCookie();
int eventos;
int gO,pO,sO,tO;
int gD,pD,sD,tD;
unsigned char *pos,*posEnd, *aux; int posOffset;
char buffer[80],ordenes[45],tiempo[15],star[15],gsp_o[9],planeta_o[45],gsp_d[9],planeta_d[45];
long lstar,t,last_numEventos;
last_numEventos = numEventos;
out->Position = 0; numEventos = 0;
posEnd = (char *)out->Memory;
// Si aun no hemos rellenado la lista de nuestros planetas...
if ( MyPlanets->Count==0 )
{
posEnd = obtenerListaPlanetas(posEnd);
cargarPlanetasEnVisorAtaques();
cargarPlanetasEnColaSondeos();
}
// ######################
// Buscamos nuestro punto de partida (La cabecera "eventos")
pos = StrPos( posEnd, "Eventos" );
if ( pos )
{
PEventos EStruct;
/***** ESTO ES UNA CHAPUZA, PERO ES LA FORMA MAS FACIL SIN RECODIFICAR TODO ******/
long status[40][2]; // Maximo n<>mero de computaciones, 40...
for (i = 0; i<last_numEventos && i<40; i++)
{
EStruct = (PEventos) MyEvents->Items[i];
// Solo lo tenemos en cuenta si es una ataque NUESTRO //
if ( EStruct->mision=='a' )
{
status[i][0]=EStruct->start;
status[i][1]=(long)EStruct->status + (EStruct->avisado?((long)0x00010000):0);
} else {
status[i][0]=0;
status[i][1]=0;
}
}
/***********************/
// Parseamos fila a fila el contenido de la tabla de eventos.
while( pos=StrPos(pos,"<tr class='") )
{
// tipo de evento...
pos+=11; posEnd=StrPos(pos,"'");
StrLCopy(ordenes,pos,min(posEnd-pos,44) );
StrCopy(buffer,"class='"); StrCat(buffer,ordenes);
// tiempo restante
pos=StrPos(posEnd,"='bxx");
if ( pos>0 )
{
pos=StrPos(pos,"title='")+7;
posEnd=StrPos(pos,"'");
StrLCopy(tiempo,pos,min(posEnd-pos,14) );
pos=StrPos(pos,"star='")+6;
posEnd=StrPos(pos,"'");
StrLCopy(star,pos,min(posEnd-pos,14) );
lstar=atol(star);
/*
pos=StrPos(pos,buffer)+7;//+StrLen(buffer);
posEnd=StrPos(pos,"'");
StrLCopy(ordenes,pos,min(posEnd-pos,44));
*/
pos=StrPos(pos,"='3'><span class='")+18;//+StrLen(buffer);
posEnd=StrPos(pos,"'");
StrLCopy(ordenes,pos,min(posEnd-pos,44));
tO=2;
// Vision General: transporte nuestro Vuelte
if ( strcmp(ordenes,"return owntransport")==0 )
{
aux=StrPos(pos,"[")+1;
if ( StrPos(pos+10,"[") == 0 ) // v.0.77b
{
// Obtenemos el tipo de origen
{ tO=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta ")+8; }
// Extraemos el nombre del PLANETA DESTINO
posEnd = StrPos(pos,"<");
StrLCopy(planeta_d,pos,min(posEnd-pos,44) );
// Extraemos coordenadas ORIGEN
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_d,pos,min(posEnd-pos,8));
strcpy(gsp_o,"0:0:0");
strcpy(planeta_o,"-");
} else { // v. < 0.77b >= 0.77c
// Obtenemos el tipo de origen
{ tO=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta "); }
if ( pos!=0 )
{
if (tO==1) pos = pos + 8;
posEnd = StrPos(pos,"<");
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas ORIGEN
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
pos = posEnd;
aux=StrPos(pos,"[")+1;
// Extraemos el nombre del PLANETA DESTINO
{ tO=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta "); }
if ( pos!=0 )
{
if (tO==1) pos = pos + 8;
posEnd = StrPos(pos,"<");
StrLCopy(planeta_d,pos,min(posEnd-pos,44) );
// Extraemos coordenadas DESTINO
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_d,pos,min(posEnd-pos,8));
}
}
}
} else
if ( strcmp(ordenes,"holding owntransport")==0 )
{
aux=StrPos(pos,"[")+1;
// Obtenemos el tipo de origen
tO=3; pos=StrPos(posEnd,"Luna ");
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta ")+8; }
// Extraemos el nombre del PLANETA ORIGEN
posEnd = StrPos(pos,"<");
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas ORIGEN
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
// Destino
StrLCopy(planeta_d,"Expedición P16",44); //"Expedici<63>n P16",44 );
pos = StrPos(posEnd,"[")+1;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_d,pos,min(posEnd-pos,8));
} else
// Vision General: transporte nuestro IDA
if ( strcmp(ordenes,"flight owntransport")==0 )
{
aux=StrPos(pos,"[")+1;
// Obtenemos el tipo de origen
pos=StrPos(posEnd,"Escombros ");
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta ")+8; }
// Extraemos el nombre del PLANETA ORIGEN
posEnd = StrPos(pos,"<");
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas ORIGEN
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
aux=StrPos(pos,"[")+1;
// Extraemos el nombre del PLANETA DESTINO
pos = StrPos(posEnd,"posición"); //"posici<63>n "); // v.0.77b
if ( pos== 0 ) // v. < 0.77a >= 0.77c
{
{ tO=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta ")+8; }
} else pos = pos + 9;
posEnd = StrPos(pos,"<");
StrLCopy(planeta_d,pos,min(posEnd-pos,44) );
// Extraemos coordenadas DESTINO
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_d,pos,min(posEnd-pos,8));
} else
// Vision General: ataque nuestro IDA
if ( strcmp(ordenes,"flight ownattack")==0 )
{
aux=StrPos(pos,"[")+1;
// Obtenemos el tipo de origen
pos=StrPos(posEnd,"Escombros ");
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta ")+8; }
// Extraemos el nombre del PLANETA ORIGEN
posEnd = StrPos(pos,"<");
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas ORIGEN
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
// Extraemos el nombre del PLANETA DESTINO
pos = StrPos(posEnd,"posición"); //"posici<63>n "); // v.0.77b
if ( pos== 0 ) // v. < 0.77a >= 0.77c
{
pos=StrPos(posEnd,"Escombros ");
if ( pos==0 || pos>aux ) { tD=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tD=1; pos=StrPos(posEnd,"planeta ")+8; }
} else pos = pos + 9;
posEnd = StrPos(pos,"<");
StrLCopy(planeta_d,pos,min(posEnd-pos,44) );
// Extraemos coordenadas DESTINO
pos = StrPos(posEnd,"[")+1;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_d,pos,min(posEnd-pos,8));
} else
// Vision General: ataque nuestro VUELTA
if ( strcmp(ordenes,"return ownattack")==0 ||
strcmp(ordenes,"return ownfederation")==0
)
{
aux=StrPos(pos,"[")+1;
// Obtenemos el tipo de origen
pos=StrPos(posEnd,"Escombros ");
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta "); }
if ( pos==0 || pos>aux )
StrCopy(planeta_o,"Expedicion Desconocida");
else {
// Extraemos el nombre del PLANETA ORIGEN (de partida)
if ( tO==1 ) pos = pos + 8;
posEnd = StrPos(pos,"<");
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas ORIGEN
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
aux = StrPos(posEnd,"[")+1;
// Extraemos el nombre del PLANETA DESTINO
tD=3; pos=StrPos(posEnd,"Luna ");
if ( pos==0 || pos>aux ) { tD=1; pos=StrPos(posEnd,"planeta "); }
if ( pos==0 || pos>aux )
{
tD = 0;
// v. 0.77b
strcpy(gsp_d,"0:0:0");
strcpy(planeta_d,"-");
} else {
StrLCopy(planeta_d,planeta_o,44);
StrLCopy(gsp_d,gsp_o,8);
// v. < 0.77a >= 0.77c
posEnd = StrPos(pos,"<");
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas DESTINO
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
}
}
} else
// Vision General: despliegue nuestro
if ( strcmp(ordenes,"flight owndeploy")==0 )
{
aux=StrPos(pos,"[")+1;
// Obtenemos el tipo de origen
pos=StrPos(posEnd,"Escombros ");
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta ")+8; }
// Extraemos el nombre del PLANETA ORIGEN (de partida)
posEnd = StrPos(pos,"<");
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas ORIGEN
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
aux = StrPos(posEnd,"[")+1;
// Extraemos el nombre del PLANETA DESTINO
tD=3; pos=StrPos(posEnd,"Luna ");
if ( pos==0 || pos>aux ) { tD=1; pos=StrPos(posEnd,"planeta "); }
if ( pos==0 || pos>aux )
{
tD = 0;
// v. 0.77b
strcpy(gsp_d,"0:0:0");
strcpy(planeta_d,"-");
} else {
StrLCopy(planeta_d,planeta_o,44);
StrLCopy(gsp_d,gsp_o,8);
// v. < 0.77a >= 0.77c
posEnd = StrPos(pos,"<");
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas DESTINO
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
}
} else
// Vision General: Espionaje nuestro IDA
if ( strcmp(ordenes,"flight ownespionage")==0 )
{
aux=StrPos(pos,"[")+1;
// Obtenemos el tipo de origen
pos=StrPos(posEnd,"Escombros ");
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta ")+8; }
// Extraemos el nombre del PLANETA ORIGEN
posEnd = StrPos(pos,"<");
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas ORIGEN
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
// Extraemos el nombre del PLANETA DESTINO
pos = StrPos(posEnd,"posición"); //"posici<63>n "); // v.0.77b
if ( pos== 0 ) // v. < 0.77a >= 0.77c
{
pos=StrPos(posEnd,"Escombros ");
if ( pos==0 || pos>aux ) { tD=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tD=1; pos=StrPos(posEnd,"planeta ")+8; }
} else pos = pos + 9;
posEnd = StrPos(pos,"<");
StrLCopy(planeta_d,pos,min(posEnd-pos,44) );
// Extraemos coordenadas DESTINO
pos = StrPos(posEnd,"[")+1;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_d,pos,min(posEnd-pos,8));
} else
// Vision General: Espionaje nuestro VUELTA
if ( strcmp(ordenes,"return ownespionage")==0 )
{
/*
<span class='return ownespionage'>Una de tus
<a href='#' onmouseover='return overlib("&lt;font color=white&gt;&lt;b&gt;Sonda de espionaje 4&lt;br&gt;&lt;/b&gt;&lt;/font&gt;");' onmouseout='return nd();' class='ownespionage'>flotas</a><a href='#' title='Sonda de espionaje 4'></a>
vuelve de el planeta DANAG <a href="index.php?page=galaxy&galaxy=2&system=334&position=9&session=c7148a3231f1" ownespionage>[2:334:9]</a> a el planeta 2500 arcturus <a href="index.php?page=galaxy&galaxy=2&system=334&position=6&session=c7148a3231f1" ownespionage>[2:334:6]</a>. Su misi<73>n era: <span class='class'>Espionaje</span></span>
*/
aux = StrPos(posEnd,"[");
pos = StrPos(posEnd,"vuelve "); // v.0.77b
if ( pos==0 || pos>aux ) // v. < 0.77a >= 0.77c
{
// Extraemos el nombre del PLANETA DE REGRESO
pos = StrPos(posEnd,"llega");
posEnd = StrPos(pos,"<");
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas DESTINO
pos = StrPos(posEnd,"[")+1;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
strcpy(gsp_d,"0:0:0");
strcpy(planeta_d,"-");
} else {
aux=StrPos(pos,"[")+1;
// Obtenemos el tipo de origen
pos=StrPos(posEnd,"Escombros ");
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta ")+8; }
// Extraemos el nombre del PLANETA ORIGEN (de partida)
posEnd = StrPos(pos,"<");
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas ORIGEN
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
aux = StrPos(posEnd,"[")+1;
// Extraemos el nombre del PLANETA DESTINO
tD=3; pos=StrPos(posEnd,"Luna ");
if ( pos==0 || pos>aux ) { tD=1; pos=StrPos(posEnd,"planeta "); }
if ( pos==0 || pos>aux )
{
tD = 0;
// v. 0.77b
strcpy(gsp_d,"0:0:0");
strcpy(planeta_d,"-");
} else {
StrLCopy(planeta_d,planeta_o,44);
StrLCopy(gsp_d,gsp_o,8);
// v. < 0.77a >= 0.77c
posEnd = StrPos(pos,"<");
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas DESTINO
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
}
}
} else
// Vision General: Ataque <20><><EFBFBD> NOS ATACAN !!! en confederacion
if ( strcmp(ordenes,"flight federation")==0 || strcmp(ordenes,"federation")==0 )
{
strcpy(ordenes, "flight attack");
aux=StrPos(pos,"[")+1;
// Obtenemos el tipo de origen
tO=3; pos=StrPos(posEnd,"luna ");
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta "); if (pos!=0) pos+=8; }
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"de la ")+6; }
// Extraemos el nombre del PLANETA ORIGEN
posEnd = StrPos(pos,"<");
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas ORIGEN
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
// Obtenemos el tipo de destino
aux = StrPos(posEnd,"[")+1;
tD=3; pos=StrPos(posEnd,"luna ");
if ( pos==0 || pos>aux ) { tD=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tD=1; pos=StrPos(posEnd,"planeta ")+8; }
// Extraemos el nombre del PLANETA DESTINO
posEnd = StrPos(pos,"<");
StrLCopy(planeta_d,pos,min(posEnd-pos,44) );
// Extraemos coordenadas DESTINO
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_d,pos,min(posEnd-pos,8));
} else
// Vision General: Ataque <20><><EFBFBD> NOS ATACAN !!!
if ( strcmp(ordenes,"flight attack")==0 ||
strcmp(ordenes,"flight ")==0 ||
strcmp(ordenes,"attack")==0 ||
ordenes==NULL )
{
strcpy(ordenes, "flight attack");
aux=StrPos(pos,"[")+1;
// Obtenemos el tipo de origen
pos=StrPos(posEnd,"Escombros ");
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"luna "); }
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta "); if (pos!=0) pos+=8; }
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"de la ")+6; }
// Extraemos el nombre del PLANETA ORIGEN
posEnd = StrPos(pos,"<");
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas ORIGEN
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
// Obtenemos el tipo de destino
aux = StrPos(posEnd,"[")+1;
tD=3; pos=StrPos(posEnd,"luna ");
if ( pos==0 || pos>aux ) { tD=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tD=1; pos=StrPos(posEnd,"planeta ")+8; }
// Extraemos el nombre del PLANETA DESTINO
posEnd = StrPos(pos,"<");
StrLCopy(planeta_d,pos,min(posEnd-pos,44) );
// Extraemos coordenadas DESTINO
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_d,pos,min(posEnd-pos,8));
} else
if ( strcmp(ordenes,"flight espionage")==0 )
// Espionaje enemigo <20><>Atenci<63>n pueden meter naves no deseadas!!
{
/*
<tr class='flight'>
<th><div id='bxx1' title='1120'star='1214002911'></div></th>
<th colspan='3'><span class='flight espionage'>
Una <a href='#' onmouseover='return overlib("&lt;font color=white&gt;&lt;b&gt;N<>mero de naves: 5 &lt;br&gt;Sonda de espionaje 5&lt;br&gt;&lt;/b&gt;&lt;/font&gt;");' onmouseout='return nd();' class='espionage'>flota</a><a href='#' title='N<>mero de naves: 5 Sonda de espionaje 5'></a> enemiga de ulises21 <a href='#' onclick='showMessageMenu(189016)'><img src='http://uni14.ogame.com.es/evolution/img/m.gif' title='Escribir mensaje' alt='Escribir mensaje'></a>
de el planeta 81 <a href="javascript:showGalaxy(2,224,6)" espionage>
[2:224:6]</a> llega a la Luna <a href="javascript:showGalaxy(2,334,6)" espionage>[2:334:6]</a>. La misi<73>n es: Espionaje</span>
</th>
</tr>
------------
Una flota enemiga de ulises21 de el planeta 81 [2:224:6] llega a la Luna [2:334:6]. La misi<73>n es: Espionaje
-------------
*/
aux=StrPos(pos,"[")+1;
/************************************************/
// Si es un ataque encubierto, en un espionaje...
posEnd = StrPos(pos,"Nave de batalla");
if ( posEnd!=0 && posEnd<aux ) strcpy(ordenes,"flight attack"); else
{
posEnd = StrPos(pos,"Cazador ligero");
if ( posEnd!=0 && posEnd<aux ) strcpy(ordenes,"flight attack"); else
{
posEnd = StrPos(pos,"Nave peque");
if ( posEnd!=0 && posEnd<aux ) strcpy(ordenes,"flight attack"); else
{
posEnd = StrPos(pos,"Crucero");
if ( posEnd!=0 && posEnd<aux ) strcpy(ordenes,"flight attack"); else
{
posEnd = StrPos(pos,"Acorazado");
if ( posEnd!=0 && posEnd<aux ) strcpy(ordenes,"flight attack"); else
{
posEnd = aux;
}
}
}
}
}
/************************************************/
posEnd = pos;
// Obtenemos el tipo de origen
tO=2; pos=StrPos(posEnd,"Escombros "); posOffset = 10;
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"luna"); posOffset=4; }
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"Luna"); posOffset=4; }
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta "); posOffset=8; }
pos = pos + posOffset;
// Extraemos el nombre del PLANETA ORIGEN
posEnd = StrPos(pos,"<");
if ( posEnd==0 ) pos = posEnd;
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas ORIGEN
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
// Obtenemos el tipo de destino
aux = StrPos(posEnd,"[")+1;
tD=3; pos=StrPos(posEnd,"luna "); posOffset = 5;
if ( pos==0 || pos>aux ) { tD=3; pos=StrPos(posEnd,"Luna "); posOffset = 5; }
if ( pos==0 || pos>aux ) { tD=1; pos=StrPos(posEnd,"planeta "); posOffset = 8; }
pos = pos + posOffset;
// Extraemos el nombre del PLANETA DESTINO
posEnd = StrPos(pos,"<");
StrLCopy(planeta_d,pos,min(posEnd-pos,44) );
// Extraemos coordenadas DESTINO
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_d,pos,min(posEnd-pos,8));
} else
if ( strcmp(ordenes,"flight owndestroy")==0 ) {
// Detruir Luna
aux=StrPos(pos,"[")+1;
// Obtenemos el tipo de origen
pos=StrPos(posEnd,"luna ");
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta "); if (pos!=0) pos+=8; }
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"de la ")+6; }
// Extraemos el nombre del PLANETA ORIGEN
posEnd = StrPos(pos,"<");
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas ORIGEN
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
// Obtenemos el tipo de destino
aux = StrPos(posEnd,"[")+1;
tD=3; pos=StrPos(posEnd,"luna ");
if ( pos==0 || pos>aux ) { tD=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tD=1; pos=StrPos(posEnd,"planeta ")+8; }
// Extraemos el nombre del PLANETA DESTINO
posEnd = StrPos(pos,"<");
StrLCopy(planeta_d,pos,min(posEnd-pos,44) );
// Extraemos coordenadas DESTINO
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_d,pos,min(posEnd-pos,8));
} else
if ( strcmp(ordenes,"return owndestroy")==0 ) {
// Detruir Luna
aux=StrPos(pos,"[")+1;
// Obtenemos el tipo de origen
tO=3; pos=StrPos(posEnd,"luna ");
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta "); if (pos!=0) pos+=8; }
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"de la ")+6; }
// Extraemos el nombre del PLANETA ORIGEN
posEnd = StrPos(pos,"<") -1;
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
// Extraemos coordenadas ORIGEN
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_o,pos,min(posEnd-pos,8));
// Obtenemos el tipo de destino
aux = StrPos(posEnd,"[")+1;
tD=3; pos=StrPos(posEnd,"luna ");
if ( pos==0 || pos>aux ) { tD=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tD=1; pos=StrPos(posEnd,"planeta ")+8; }
// Extraemos el nombre del PLANETA DESTINO
posEnd = StrPos(pos,"<");
StrLCopy(planeta_d,pos,min(posEnd-pos,44) );
// Extraemos coordenadas DESTINO
pos = aux;
posEnd = StrPos(pos,"]");
StrLCopy(gsp_d,pos,min(posEnd-pos,8));
} else {
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// Extraemos las coordenadas para otro tipo de misiones...
aux=StrPos(pos,"[")+1;
// Obtenemos el tipo de origen
tO=3; pos=StrPos(posEnd,"luna ");
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tO=2; pos=StrPos(posEnd,"Escombros "); }
if ( pos==0 || pos>aux ) { tO=1; pos=StrPos(posEnd,"planeta "); if (pos!=0) pos+=8; }
if ( pos==0 || pos>aux ) { tO=3; pos=StrPos(posEnd,"de la "); if (pos!=0) pos+=6; }
if ( pos>0 ) {
// Extraemos el nombre del PLANETA ORIGEN
posEnd = StrPos(pos,"<") -1;
StrLCopy(planeta_o,pos,min(posEnd-pos,44) );
}
// Extraemos coordenadas ORIGEN
if ( aux>0 ) {
pos = aux;
posEnd = StrPos(pos,"]");
if ( posEnd>0 ) StrLCopy(gsp_o,pos,min(posEnd-pos,8));
}
if ( posEnd>0 ) {
// Obtenemos el tipo de destino
aux = StrPos(posEnd,"[")+1;
tD=3; pos=StrPos(posEnd,"luna ");
if ( pos==0 || pos>aux ) { tD=3; pos=StrPos(posEnd,"Luna "); }
if ( pos==0 || pos>aux ) { tD=1; pos=StrPos(posEnd,"planeta "); if (pos!=0) pos+=8; }
if ( pos>0 ) {
// Extraemos el nombre del PLANETA DESTINO
posEnd = StrPos(pos,"<");
if ( posEnd>0 ) StrLCopy(planeta_d,pos,min(posEnd-pos,44) );
}
}
if ( aux>0 ) {
// Extraemos coordenadas DESTINO
pos = aux;
posEnd = StrPos(pos,"]");
if ( posEnd>0 ) StrLCopy(gsp_d,pos,min(posEnd-pos,8));
}
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
}
///////////////////////////// ADD-FLIGHT-TO-LIST
/////////////////////////////////////////////////////////////////////////////////////////////////
sscanf(gsp_o,"%d:%d:%d",&gO,&sO,&pO);
sscanf(gsp_d,"%d:%d:%d",&gD,&sD,&pD);
t=atol(tiempo);
enc=false;
/*
// Si es una flota que regresa al planeta origen...
if ( strncmp(ordenes,"return",6)==0 )
{
// Vemos si aun no llego a su destino
for (i = 0; i < computacionesOcupadas; i++)
{
EStruct = (PEventos) MyEvents->Items[i];
if ( EStruct->stop == lstar ||
(EStruct->stop == 0 &&
EStruct->gD == gO && EStruct->sD == sO && EStruct->pD == pO && EStruct->tD == tO &&
EStruct->gO == gD && EStruct->sO == sD && EStruct->pO == pD && EStruct->tO == tD
)
) {
EStruct->vuelta = t;//atol(tiempo);
EStruct->stop = lstar;
enc=true;
break;
}
}
}
*/
if ( !enc )
{
if ( MyEvents->Count<=numEventos )
{
EStruct = new TEventos;
MyEvents->Add(EStruct);
}
EStruct = (PEventos)MyEvents->Items[numEventos];
EStruct->status = 0;
EStruct->avisado = false;
EStruct->mision='i';
/* (e)spiar, (E)spiado, (a)tacar, (A)tacado, (r)ecolectar, (i)ndefinido */
if ( strncmp(ordenes,"return",6)==0 )
{
if ( strcmp(ordenes+7,"ownattack")==0 ) EStruct->mision = 'a'; else
if ( strcmp(ordenes+7,"owndeploy")==0 ) EStruct->mision = 'd'; else
if ( strcmp(ordenes+7,"ownespionage")==0 ) EStruct->mision = 'e'; else
if ( strcmp(ordenes+7,"owntransport")==0 ) EStruct->mision = 't'; else
if ( strcmp(ordenes+7,"ownharvest")==0 ) EStruct->mision = 'r'; else
if ( strcmp(ordenes+7,"owndestroy")==0 ) EStruct->mision = 'D';
EStruct->ida = 0;
EStruct->vuelta = t;//atol(tiempo);
EStruct->gO = gD;
EStruct->sO = sD;
EStruct->pO = pD;
EStruct->tO = tD;
strcpy(EStruct->planeta_o,planeta_d);
EStruct->gD = gO;
EStruct->sD = sO;
EStruct->pD = pO;
EStruct->tD = tO;
strcpy(EStruct->planeta_d,planeta_o);
EStruct->start = 0;
EStruct->stop = lstar;
} else
if ( strncmp(ordenes,"flight ",7)==0 )
{
if ( strcmp(ordenes+7,"owntransport")==0 ) EStruct->mision = 't'; else
if ( strcmp(ordenes+7,"owndeploy")==0 ) EStruct->mision = 'd'; else
if ( strcmp(ordenes+7,"transport")==0 ) EStruct->mision = 'T'; else
if ( strcmp(ordenes+7,"ownattack")==0 ) EStruct->mision = 'a'; else
if ( strcmp(ordenes+7,"ownespionage")==0 ) EStruct->mision = 'e'; else
if ( strcmp(ordenes+7,"espionage")==0 ) EStruct->mision = 'E'; else
if ( strcmp(ordenes+7,"ownharvest")==0 ) EStruct->mision = 'r'; else
if ( strcmp(ordenes+7,"owndestroy")==0 ) EStruct->mision = 'D'; else
/* COSIDERAR ATAQUE CUALQUIER ACCION DESCONOCIDA
if ( strcmp(ordenes+7,"attack")==0
|| strcmp(ordenes,"flight ")==0
|| strcmp(ordenes+7,"federation")==0
)
*/
{
nosAtacan = true;
EStruct->mision = 'A';
if ( sndCHK_peligro->Checked )
sndPlaySound("snd\\recibiendoAtaque.wav", SND_ASYNC | SND_FILENAME | SND_LOOP);
//toFront=true; ShowMessage("Alerta: escuadron hostil detectado");
AlertBox->Visible=true;
}
EStruct->ida = t;//atol(tiempo);
EStruct->vuelta = 0;
EStruct->gO = gO;
EStruct->sO = sO;
EStruct->pO = pO;
EStruct->tO = tO;
strcpy(EStruct->planeta_o,planeta_o);
EStruct->gD = gD;
EStruct->sD = sD;
EStruct->pD = pD;
EStruct->tD = tD;
strcpy(EStruct->planeta_d,planeta_d);
EStruct->start = lstar;
EStruct->stop = 0;
/*** CHAPU ****/
enc=false;
for (i=0;i<last_numEventos && i<40;i++)
{
if (status[i][0]==EStruct->start)
{
EStruct->status=(int)(status[i][1]&0x0000FFFF);
EStruct->avisado=(status[i][1]&0x00010000);
enc=true;
break;
}
}
/**************/
} else
if ( strncmp(ordenes, "holding",7)== 0 )
{
if ( strcmp(ordenes+7,"owntransport")==0 ) EStruct->mision = 'x';
EStruct->ida = 0;
EStruct->vuelta = t;//atol(tiempo);
EStruct->gO = gD;
EStruct->sO = sD;
EStruct->pO = pD;
EStruct->tO = tD;
strcpy(EStruct->planeta_o,planeta_d);
EStruct->gD = gO;
EStruct->sD = sO;
EStruct->pD = pO;
EStruct->tD = tO;
strcpy(EStruct->planeta_d,planeta_o);
EStruct->start = 0;
EStruct->stop = lstar;
}
numEventos++;
}
/////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////// END ADD-FLIGHT-TO-LIST
} // Fin flota en vuelo
} // END ** while( pos=StrPos(pos,"<tr class='") ) **
dgEventos->RowCount = numEventos+1;
if (numEventos>0) dgEventos->FixedRows=1;
// Marcamos para borrar todos los elementos en la lista de ataque...
PAtaques EAtaque;
int attack;
for(i=0;i<MyAttacks->Count;i++)
((PAtaques)MyAttacks->Items[i])->borrar=true;
for (i = 0; i < numEventos; i++)
{
EStruct = (PEventos) MyEvents->Items[i];
if ( EStruct->mision=='A' )
{
enc = false;
for(attack=0;attack<MyAttacks->Count;attack++)
{
EAtaque =(PAtaques)MyAttacks->Items[attack];
if ( EAtaque->start == EStruct->start )
{
EAtaque->t = EStruct->ida; // Actualizamos el tiempo que queda para el ataque.
EAtaque->borrar = false;
enc=true;
break;
}
}
if ( !enc )
{
EAtaque = new TAtaques;
EAtaque->t = EStruct->ida;
EAtaque->start = EStruct->start;
EAtaque->gO = EStruct->gO; EAtaque->sO = EStruct->sO; EAtaque->pO = EStruct->pO; EAtaque->tO = EStruct->tO;
EAtaque->gD = EStruct->gD; EAtaque->sD = EStruct->sD; EAtaque->pD = EStruct->pD; EAtaque->tD = EStruct->tD;
EAtaque->borrar = false;
EAtaque->status = 0; // Aun no hemos manipulado este ataque
EAtaque->tDelay = 0;
MyAttacks->Add(EAtaque);
}
}
}
// ********************************
}
// ######################
pos = StrPos( posEnd, "</html>" );
sprintf(buffer,"%s > Visi<73>n General [%d:%0.3d:%0.2d].%d [%ld/%ld]",AnsiString(Now()),((PPlanetas)MyPlanets->Items[idxPLANET])->g,((PPlanetas)MyPlanets->Items[idxPLANET])->s,((PPlanetas)MyPlanets->Items[idxPLANET])->p,((PPlanetas)MyPlanets->Items[idxPLANET])->t,MilliSecondsBetween(stop,start),MilliSecondsBetween(Time(),stop) );
if ( pos )
{
statusBar->SelAttributes->Color = clBlack;statusBar->Lines->Add(buffer);
if (sndCHK_network->Checked && !AlertBox->Visible) sndPlaySound(0,0);
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(buffer)+" <20><>INCOMPLETA!!" );
error = -1;
}
if ( CFG_verbose )
{
char buffer[255];
PAtaques EAtaque;
for (i = 0; i<MyAttacks->Count; i++)
{
EAtaque =(PAtaques)MyAttacks->Items[i];
sprintf(buffer,"> %0.4ld < [%d:%0.3d:%0.2d].%d -> [%d:%0.3d:%0.2d].%d (%d) %s",EAtaque->t,EAtaque->gO,EAtaque->sO,EAtaque->pO,EAtaque->tO,EAtaque->gD,EAtaque->sD,EAtaque->pD,EAtaque->tD,EAtaque->status,(EAtaque->borrar?"CANCELADO":""));
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add( buffer );
}
}
// Si no hay ataques en curso, y estaban todas las computaciones ocupadas
// revisar si se ha quedado alguna libre...
if ( computacionesOcupadas>=CFG_ocuparMaxComputaciones )
computacionesOcupadas = -1;
/*
if ( !nosAtacan && computacionesOcupadas>=CFG_ocuparMaxComputaciones )
{
Hangar NavesAparcadas[14];
flota_obtenerFlota(((PPlanetas)MyPlanets->Items[idxPLANET])->cp,&RecursosDisp,NavesAparcadas);
}
*/
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Error vision general (Sesion caducada)") );
/*
error = iniciarSesion();
// Deberiamos reintentar descargar los mensajes...
if ( error!=-1 )
_visionGeneral(-1);
*/
}
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Error vision general") );
}
delete out;
}
return error;
}
//---------------------------------------------------------------------------
char * __fastcall Tmain::obtenerListaPlanetas(char *html)
{
char buffer[80];
char *pos, *posEnd, *aux;
PPlanetas EPlanetas;
posEnd = pos = html;
while( pos = StrPos( posEnd, "<option" ) )
{
EPlanetas = new TPlanetas;
pos = StrPos( posEnd, "&cp=" )+4;
posEnd = StrPos(pos,"&");
StrLCopy(buffer,pos,min(posEnd-pos,12));
EPlanetas->cp = atol(buffer);
pos = StrPos(posEnd,">")+1;
posEnd=StrPos(pos,"[");
/* ver. 0.76 */
aux=StrPos(pos,"<");
posEnd = min(posEnd,aux);
/***/
StrLCopy(EPlanetas->planeta,pos,min(posEnd-pos,44)); // Deberia hacer TRIM sobre el planeta
strRTrim(EPlanetas->planeta);
// if ( strcmp(EPlanetas->planeta,"Luna")==0 )
if ( StrPos(EPlanetas->planeta,"Luna")!=NULL )
EPlanetas->t=3;
else
EPlanetas->t=1;
pos=StrPos(pos,"[")+1;
posEnd=StrPos(pos,"]");
StrLCopy(buffer,pos,min(posEnd-pos,8) );
sscanf(buffer,"%d:%d:%d",&EPlanetas->g,&EPlanetas->s,&EPlanetas->p);
MyPlanets->Add(EPlanetas);
}
return posEnd;
}
//---------------------------------------------------------------------------
int __fastcall Tmain::descargarMensajes()
{
int error;
AnsiString request;
// Descargamos la p<>gina de mensajes...
// oG_host, oG_session, oG_SSID, oG_Cookie;
error = 0;
if ( oG_session=="" )
{
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Session vacia") );
currentState = csLOGIN;
nextUpdateCLK = 0;
error = -1;
}
if ( error!=-1 )
{
// request = "GET http://"+oG_host+"/game/index.php?page=messages&session="+oG_session+" HTTP/1.1\r\n";
request = "GET /game/index.php?page=messages&session="+oG_session+" HTTP/1.1\r\n";
request+= "Host: "+oG_host+"\r\n";
request+= "User-Agent: "+oG_userAgent+"\r\n";
request+= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
request+= "Accept-Language: es-es,es;q=0.8\r\n";
request+= "Accept-Encoding: gzip,deflate\r\n";
request+= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
request+= "Keep-Alive: 300\r\n";
request+= "Connection: keep-alive\r\n";
if ( !oG_Cookie.IsEmpty() )
request+= "Cookie: "+oG_Cookie+"\r\n";
request+= "\r\n";
lastRequest = lastRequest_messages;
TMemoryStream* out = new TMemoryStream();
error = HTTPdownloader->descargarHTML(oG_host.c_str(),request.c_str(),out);
if ( error!=-1 )
{
error = checkError( out );
if ( error!=-1 )
{
// Parseamos el listado de mensajes...
out->Position = 0;
// ######################
// ######################
statusBar->SelAttributes->Color = clBlack;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Descarga de mensajes") );
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Error descargando mensaje (Sesion caducada)") );
currentState = csLOGIN;
nextUpdateCLK = 0;
error = -1;
}
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Error descargando mensaje") );
}
delete out;
}
return error;
}
//---------------------------------------------------------------------------
int __fastcall Tmain::checkError(TMemoryStream *html)
{
int error=0;
if ( StrPos((char *)(html->Memory)+1,"Esta cuenta esta suspendida") >= html->Memory ) { error=-1; currentState = csLOGIN; }
if ( StrPos((char *)(html->Memory)+1,"Problema de base de datos") >= html->Memory ) { error=-1; currentState = csLOGIN; }
if ( StrPos((char *)(html->Memory)+1,"action=\"/game/logout.php?")>0 ) { error=-1; currentState = csLOGIN; }
if ( StrPos((char *)(html->Memory)+1,"Tu sesión es inv") >0 ) { error=-1; currentState = csLOGIN; } // "Tu sesi<73>n es inv") >0 ) error=-1;
if ( StrPos((char *)(html->Memory)+1,"Se presento un error") >0 ) { error=-1; currentState = csLOGIN; }
if ( StrPos((char *)(html->Memory)+1,"Esta cuenta no existe o introdujiste una contra") >0 ) { error=-1; currentState = csRESETPASS; }
return error;
}
//---------------------------------------------------------------------------
void __fastcall Tmain::ToolButton4Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall Tmain::btTestClick(TObject *Sender)
{
HINSTANCE HApp;
// Cargar el SpeedSim
HApp = ShellExecute(this, // handle to parent window
NULL, // pointer to string that specifies operation to perform
"speedSIM\\speedSIM.exe", // pointer to filename string
NULL, // pointer to string that specifies executable-file parameters
NULL, // pointer to string that specifies default directory
SW_SHOWNORMAL // whether file is shown when opened
);
/*
TMemoryStream* out = new TMemoryStream();
HTTPdownloader->descargarHTML("www.infdj.com","GET / HTTP/1.1\r\nHost: infdj.com\r\nAccept-Encoding: gzip,deflate\r\n\r\n",out);
// HTTPdownloader->descargarHTML("localhost","GET / HTTP/1.1\r\nHost: localhost\r\nAccept-Encoding: gzip,deflate\r\n\r\n",out);
delete out;
*/
}
//---------------------------------------------------------------------------
void __fastcall Tmain::btDownloaderClick(TObject *Sender)
{
HTTPdownloader->Show();
}
//---------------------------------------------------------------------------
void __fastcall Tmain::ToolButton2Click(TObject *Sender)
{
// Guardamos las preferencias...
TIniFile *ini;
ini = new TIniFile(ExtractFileDir(Application->ExeName)+"\\salvaVidas.ini");
ini->WriteBool("avisos","ataqueAutomatico",sndCHK_ataque->Checked);
ini->WriteBool("avisos","sondeoAlEnemigo",sndCHK_sondeo->Checked);
ini->WriteBool("avisos","atacanteDetectado",sndCHK_peligro->Checked);
ini->WriteBool("avisos","erroresGenerales",sndCHK_error->Checked);
ini->WriteBool("avisos","sinConexionRed",sndCHK_network->Checked);
ini->WriteBool("avisos","sondeo5min",chkSondeo5min->Checked);
ini->WriteBool("avisos","sondeo3min",chkSondeo2min->Checked);
ini->WriteBool("avisos","aviso5min",chkAviso5min->Checked);
ini->WriteBool("avisos","alarmaPersonal",MenuItem5->Checked);
ini->WriteBool("colaAtaques","colaActiva",activarColaAtaques->Checked);
delete ini;
nextUpdateCLK = 0;
}
//---------------------------------------------------------------------------
void __fastcall Tmain::dgEventosDrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
/*
dgEventos->Canvas->Brush->Color = clBackground;
dgEventos->Canvas->FillRect(Rect);
*/
if ( ARow==0 )
{
switch( ACol )
{
case 0:
dgEventos->Canvas->TextOut(Rect.Left,Rect.Top,"Tiempo");
dgEventos->Canvas->TextOut(Rect.Left,Rect.Top + dgEventos->Canvas->Font->Size+4,"Ida / Vuelta");
break;
case 1:
dgEventos->Canvas->TextOut(Rect.Left,Rect.Top,"[GSP]" );
dgEventos->Canvas->TextOut(Rect.Left,Rect.Top + dgEventos->Canvas->Font->Size+4,"Planeta Origen");
break;
case 2:
dgEventos->Canvas->TextOut(Rect.Left,Rect.Top,"[GSP]" );
dgEventos->Canvas->TextOut(Rect.Left,Rect.Top + dgEventos->Canvas->Font->Size+4,"Planeta Destino");
break;
case 3:
dgEventos->Canvas->TextOut(Rect.Left,Rect.Top + dgEventos->Canvas->Font->Size,"Ordenes" );
break;
}
} else {
if ( ARow<=MyEvents->Count ) //numEventos
{
int tH,tM,tS;
PEventos EStruct;
EStruct = (PEventos)MyEvents->Items[ARow-1];
// Fondo del GRID
switch( EStruct->mision )
{
case 'D': dgEventos->Canvas->Brush->Color = 0x00C1E0FF; break;
case 'S': dgEventos->Canvas->Brush->Color = 0x007DDBFF; break;
case 'T': dgEventos->Canvas->Brush->Color = clSkyBlue; break;
case 'A': dgEventos->Canvas->Brush->Color = 0x006262FF; break;
case 'r': dgEventos->Canvas->Brush->Color = 0x007282B8; break; /* BGR */
default:
dgEventos->Canvas->Brush->Color = clWhite;
}
switch( ACol )
{
case 0:
if ( EStruct->ida > 0 )
{
tH = EStruct->ida/3600; tM = EStruct->ida%3600;
dgEventos->Canvas->TextRect(TRect(Rect.Left,Rect.Top,Rect.Right,Rect.Top+dgEventos->Canvas->Font->Size+4),Rect.Left,Rect.Top,Format("%02.2d:%02.2d:%02.2d",ARRAYOFCONST((tH,(tM/60),(tM%60))) ));
}
if ( EStruct->vuelta > 0 )
{
tH = EStruct->vuelta/3600; tM = EStruct->vuelta%3600;
dgEventos->Canvas->TextRect(TRect(Rect.Left,Rect.Top+dgEventos->Canvas->Font->Size+4,Rect.Right,Rect.Bottom),Rect.Left,Rect.Top + dgEventos->Canvas->Font->Size+4,Format("%02.2d:%02.2d:%02.2d",ARRAYOFCONST((tH,(tM/60),(tM%60))) ));
}
break;
case 1:
dgEventos->Canvas->TextRect(TRect(Rect.Left,Rect.Top,Rect.Right,Rect.Top+dgEventos->Canvas->Font->Size+4),Rect.Left,Rect.Top,"["+AnsiString(EStruct->gO)+":"+AnsiString(EStruct->sO)+":"+AnsiString(EStruct->pO)+"]."+AnsiString(EStruct->tO) );
dgEventos->Canvas->TextRect(TRect(Rect.Left,Rect.Top+dgEventos->Canvas->Font->Size+4,Rect.Right,Rect.Bottom),Rect.Left,Rect.Top + dgEventos->Canvas->Font->Size+4,EStruct->planeta_o);
break;
case 2:
dgEventos->Canvas->TextRect(TRect(Rect.Left,Rect.Top,Rect.Right,Rect.Top+dgEventos->Canvas->Font->Size+4),Rect.Left,Rect.Top,"["+AnsiString(EStruct->gD)+":"+AnsiString(EStruct->sD)+":"+AnsiString(EStruct->pD)+"]."+AnsiString(EStruct->tD) );
dgEventos->Canvas->TextRect(TRect(Rect.Left,Rect.Top+dgEventos->Canvas->Font->Size+4,Rect.Right,Rect.Bottom),Rect.Left,Rect.Top + dgEventos->Canvas->Font->Size+4,EStruct->planeta_d);
break;
case 3:
dgEventos->Canvas->TextRect(Rect,Rect.Left,Rect.Top + dgEventos->Canvas->Font->Size+4, AnsiString(EStruct->mision) + (EStruct->mision=='a'?(AnsiString(" - ")+AnsiString(EStruct->status)):AnsiString("")) );
break;
}
if (State.Contains(gdFocused))
dgEventos->Canvas->DrawFocusRect(Rect);
}
}
}
//---------------------------------------------------------------------------
void __fastcall Tmain::FormDestroy(TObject *Sender)
{
PEventos EStruct;
// Clean up <20> must free memory for the items as well as the list
for (int i = 0; i < MyEvents->Count; i++)
{
EStruct = (PEventos) MyEvents->Items[i];
delete EStruct;
}
delete MyEvents;
PPlanetas EPlanetas;
// Clean up <20> must free memory for the items as well as the list
for (int i = 0; i < MyPlanets->Count; i++)
{
EPlanetas = (PPlanetas) MyPlanets->Items[i];
delete EPlanetas;
}
delete MyPlanets;
PAtaques EAtaques;
// Clean up <20> must free memory for the items as well as the list
for (int i = 0; i < MyAttacks->Count; i++)
{
EAtaques = (PAtaques) MyAttacks->Items[i];
delete EAtaques;
}
delete MyAttacks;
PAtaqueOfensivo AtaqueOfensivo;
// Clean up <20> must free memory for the items as well as the list
for (int i = 0; i < AtaquesOfensivos->Count; i++)
{
AtaqueOfensivo = (PAtaqueOfensivo) AtaquesOfensivos->Items[i];
delete AtaqueOfensivo;
}
delete AtaquesOfensivos;
}
//---------------------------------------------------------------------------
void __fastcall Tmain::sessionKeyPress(TObject *Sender, char &Key)
{
if ( Key==VK_RETURN && session->Text.Length()==12 ) {
oG_session = session->Text;
currentState = csREADY;
}
}
//---------------------------------------------------------------------------
void __fastcall Tmain::maxResources(TRecursos *RecursosDisp,Hangar *Naves,TRecursos *maxRecursos)
{
long capacidadDeCarga;
// Debemos maximizar la cantidad de recursos cargados, para llevarnos todo lo que podamos.
capacidadDeCarga=0;
maxRecursos->Metal=0;
maxRecursos->Cristal=0;
maxRecursos->Deuterio=0;
for ( int h=0;h<14;h++ )
{
// Seleccionamos todas las naves del planeta (menos los satelites solares)
if ( Naves[h].id>0 && Naves[h].id!=212 )
capacidadDeCarga+= (Naves[h].capacity * Naves[h].ship);
}
// Prioridad al DEUTERIO / CRISTAL / METAL
maxRecursos->Deuterio = min( RecursosDisp->Deuterio, capacidadDeCarga );
capacidadDeCarga -= maxRecursos->Deuterio;
maxRecursos->Cristal = min( RecursosDisp->Cristal, capacidadDeCarga );
capacidadDeCarga -= maxRecursos->Cristal;
maxRecursos->Metal = min( RecursosDisp->Metal, capacidadDeCarga );
capacidadDeCarga -= maxRecursos->Metal;
}
//---------------------------------------------------------------------------
int __fastcall Tmain::numNaves(Hangar *Naves)
{
int h,num;
num=0;
for ( h=0;h<14;h++ )
{
// Seleccionamos todas las naves del planeta (menos los satelites solares)
if ( Naves[h].id>0 && Naves[h].id!=212 )
num += Naves[h].maxship;
}
return num;
}
//---------------------------------------------------------------------------
int __fastcall Tmain::cmpNaves(Hangar *A, Hangar *B)
{
int hA, hB;
int dev=0;
for ( hA=0;hA<13 && dev>=0;hA++ )
{
if ( A[hA].id>0 && A[hA].id!=212 && A[hA].ship>0 )
{
for ( hB=0;hB<14;hB++ )
{
if ( B[hB].id==A[hA].id )
{
if ( B[hB].ship > A[hA].ship )
{
dev = -1;
break;
}
}
}
}
}
return dev;
}
//---------------------------------------------------------------------------
// OBTIENE el total de flota disponible en el planeta
int __fastcall Tmain::flota_obtenerFlota(int idPlaneta,TRecursos *RecursosDisp,Hangar *NavesAparcadas)
{
/*****************************/
TDateTime start = Time();
TDateTime stop;
/*****************************/
AnsiString request,timeStamp, v;
int error = -1;
// request ="GET http://"+oG_host+"/game/index.php?page=flotten1&session="+oG_session+"&cp="+idPlaneta+"&mode=Flotte&gid=&messageziel=&re=0 HTTP/1.1\r\n";
request ="GET /game/index.php?page=flotten1&session="+oG_session+"&cp="+idPlaneta+"&mode=Flotte&gid=&messageziel=&re=0 HTTP/1.1\r\n";
request+="Host: "+oG_host+"\r\n";
request+="User-Agent: "+oG_userAgent+"\r\n";
request+="Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
request+="Accept-Language: es-es,es;q=0.8\r\n";
request+="Accept-Encoding: gzip,deflate\r\n";
request+="Accept-Charset: windows-1252,utf-8;q=0.7,*;q=0.7\r\n";
request+="Keep-Alive: 300\r\n";
request+="Connection: keep-alive\r\n";
request+="Referer: http://"+oG_host+"/game/index.php?page=flotten1&session="+oG_session+"&mode=Flotte\r\n";
if ( !oG_Cookie.IsEmpty() )
request+= "Cookie: "+oG_Cookie+"\r\n";
request+="\r\n";
lastRequest = lastRequest_flotten1;
TMemoryStream* out = new TMemoryStream();
error = HTTPdownloader->descargarHTML(oG_host.c_str(),request.c_str(),out);
/*****************************/
stop=Time();
/*****************************/
if ( error!=-1 )
{
error = checkError( out );
if ( error!=-1 )
{
if ( oG_Cookie.IsEmpty() )
oG_Cookie = obtenerOGCookie();
out->Position=0;
char buffer[255];
char *pos,*posEnd,*aux, *aux1;
pos = StrPos((char *)out->Memory,"Energía"); // "Energ<72>a");
if ( pos>0 )
{
aux = pos;
// Extraemos las computaciones ocupadas
pos = StrPos(pos,"Flotas ");
aux1 = StrPos(pos,"Misión");//"Misi<73>n");
posEnd = StrPos(pos,"</table>"); // v.0.77b
if ( aux1>posEnd ) // v.0.77c
posEnd = StrPos(aux1,"</table>");
do {
aux1 = pos;
pos = StrPos(pos,"<tr")+4;
} while( pos>0 && pos<posEnd );
pos = StrPos(aux1,"<th>")+4;
posEnd = StrPos(pos,"<");
StrLCopy(buffer, pos, min( (posEnd-pos), 3) );
computacionesOcupadas = atoi(buffer);
//////////////////////////////////////////////////////
pos = aux;
pos = extraerRecursos(pos,RecursosDisp);
/*
pos = extraerYcombinarFlota(pos,Flotas);
*/
pos = extraerNavesAparcadas(pos,NavesAparcadas);
/*****************************/
statusBar->SelAttributes->Color = clGreen;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > Flota en hangar (1/4)")+" ["+AnsiString(MilliSecondsBetween(stop,start))+"]");
/*****************************/
error = 0;
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > Flota en hangar: ParseR ERROR") );
//nextUpdate->Interval = 10000; // Reintenamos logarnos 10segundos
error = -1;
}
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Error vision general (Sesion caducada)") );
}
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > Flota en hangar: CONNECT ERROR") );
//nextUpdate->Interval = 2000; // Reintenamos logarnos 10segundos
nextUpdateCLK = 0;
// nextUpdateTimer(0);
error = -1;
}
return error;
}
//---------------------------------------------------------------------------
// SELECCIONA la flota que va a utilisarse
int __fastcall Tmain::flota_seleccionarFlota(Hangar *NavesAparcadas,TRecursos *RecursosDisp)
{
/*****************************/
TDateTime start = Time();
TDateTime stop;
/*****************************/
AnsiString request,timeStamp, v;
int error = -1;
// request ="POST http://"+oG_host+"/game/index.php?page=flotten2&session="+oG_session+" HTTP/1.1\r\n";
request ="POST /game/index.php?page=flotten2&session="+oG_session+" HTTP/1.1\r\n";
request+="Host: "+oG_host+"\r\n";
request+="User-Agent: "+oG_userAgent+"\r\n";
request+="Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
request+="Accept-Language: es-es,es;q=0.8\r\n";
request+="Accept-Encoding: gzip,deflate\r\n";
request+="Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
request+="Keep-Alive: 300\r\n";
request+="Connection: keep-alive\r\n";
request+="Referer: http://"+oG_host+"/game/index.php?page=flotten1&session="+oG_session+"&mode=Flotte\r\n";
if ( !oG_Cookie.IsEmpty() )
request+= "Cookie: "+oG_Cookie+"\r\n";
request+="Content-Type: application/x-www-form-urlencoded\r\n";
AnsiString params;
for ( int h=0;h<14;h++ )
{
// Seleccionamos todas las naves del planeta (menos los satelites solares)
if ( NavesAparcadas[h].id>0 && NavesAparcadas[h].id!=212 )
{
if ( !params.IsEmpty() )
params+="&";
params+="maxship"+AnsiString(NavesAparcadas[h].id)+"="+AnsiString(NavesAparcadas[h].maxship);
params+="&consumption"+AnsiString(NavesAparcadas[h].id)+"="+AnsiString(NavesAparcadas[h].consumption);
params+="&speed"+AnsiString(NavesAparcadas[h].id)+"="+AnsiString(NavesAparcadas[h].speed);
params+="&capacity"+AnsiString(NavesAparcadas[h].id)+"="+AnsiString(NavesAparcadas[h].capacity);
params+="&ship"+AnsiString(NavesAparcadas[h].id)+"="+AnsiString(NavesAparcadas[h].ship);
}
}
request+="Content-Length: "+AnsiString(params.Length())+"\r\n\r\n";
request+=params;
lastRequest = lastRequest_flotten2;
TMemoryStream* out = new TMemoryStream();
error = HTTPdownloader->descargarHTML(oG_host.c_str(),request.c_str(),out);
/*****************************/
stop=Time();
/*****************************/
if ( error!=-1 )
{
char *pos;
out->Position=0;
pos = StrPos((char *)out->Memory,"Energía");//"Energ<72>a");
if ( pos>0 )
{
pos = extraerRecursos(pos,RecursosDisp);
statusBar->SelAttributes->Color = clGreen;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > Flota sel. naves (2/4)")+" ["+AnsiString(MilliSecondsBetween(stop,start))+"]");
error = 0;
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > Flota en hangar: ParseR ERROR") );
//nextUpdate->Interval = 2000; // Reintenamos logarnos 2segundos
error = -1;
}
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > Flota en hangar: CONNECT ERROR") );
//nextUpdate->Interval = 2000; // Reintenamos logarnos 10segundos
// nextUpdateTimer(0);
nextUpdateCLK = 0;
error = -1;
}
return error;
}
//---------------------------------------------------------------------------
// FIJA EL OBJETIVO (tipo Planeta,luna,escombros) y la velocidad
int __fastcall Tmain::flota_fijarObjetivo(int gO,int sO,int pO,int tipoO, TRecursos *RecursosDisp,Hangar *NavesAparcadas, int gD,int sD, int pD, int tipoD, int velocidad)
{
/*****************************/
TDateTime start = Time();
TDateTime stop;
/*****************************/
AnsiString request,timeStamp, v;
int error = -1;
// request ="POST http://"+oG_host+"/game/index.php?page=flotten3&session="+oG_session+" HTTP/1.1\r\n";
request ="POST /game/index.php?page=flotten3&session="+oG_session+" HTTP/1.1\r\n";
request+="Host: "+oG_host+"\r\n";
request+="User-Agent: "+oG_userAgent+"\r\n";
request+="Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
request+="Accept-Language: es-es,es;q=0.8\r\n";
request+="Accept-Encoding: gzip,deflate\r\n";
request+="Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
request+="Keep-Alive: 300\r\n";
request+="Connection: keep-alive\r\n";
request+="Referer: http://"+oG_host+"/game/index.php?page=flotten2&session="+oG_session+"&mode=Flotte\r\n";
if ( !oG_Cookie.IsEmpty() )
request+= "Cookie: "+oG_Cookie+"\r\n";
request+="Content-Type: application/x-www-form-urlencoded\r\n";
AnsiString params;
params+="thisgalaxy"+AnsiString(gO)+"&thissystem="+AnsiString(sO)+"&thisplanet="+AnsiString(pO);
params+="&thisplanettype="+AnsiString(tipoO)+"&speedfactor=1";
params+="&thisresource1="+AnsiString(RecursosDisp->Metal)+"&thisresource2="+AnsiString(RecursosDisp->Cristal)+"&thisresource3="+AnsiString(RecursosDisp->Deuterio);
for ( int h=0;h<14;h++ )
{
// Seleccionamos todas las naves del planeta (menos los satelites solares)
if ( NavesAparcadas[h].id>0 && NavesAparcadas[h].id!=212 )
{
params+="&ship"+AnsiString(NavesAparcadas[h].id)+"="+AnsiString(NavesAparcadas[h].ship);
params+="&consumption"+AnsiString(NavesAparcadas[h].id)+"="+AnsiString(NavesAparcadas[h].consumption);
params+="&speed"+AnsiString(NavesAparcadas[h].id)+"="+AnsiString(NavesAparcadas[h].speed);
params+="&capacity"+AnsiString(NavesAparcadas[h].id)+"="+AnsiString(NavesAparcadas[h].capacity);
}
}
params+="&galaxy"+AnsiString(gD)+"&system="+AnsiString(sD)+"&planet="+AnsiString(pD)+"&planettype="+AnsiString(tipoD)+"&speed="+AnsiString(velocidad);
request+="Content-Length: "+AnsiString(params.Length())+"\r\n\r\n";
request+=params;
lastRequest = lastRequest_flotten3;
TMemoryStream* out = new TMemoryStream();
error = HTTPdownloader->descargarHTML(oG_host.c_str(),request.c_str(),out);
/*****************************/
stop=Time();
/*****************************/
if ( error!=-1 )
{
out->Position=0;
/***************************/
/* La respuesta no nos interesa */
/***************************/
statusBar->SelAttributes->Color = clGreen;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > Flota sel. destino (3/4)") );
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > Flota en hangar: CONNECT ERROR") );
//nextUpdate->Interval = 2000; // Reintenamos logarnos 10segundos
// nextUpdateTimer(0);
nextUpdateCLK = 0;
error = -1;
}
return error;
}
//---------------------------------------------------------------------------
// FIJA LA MISION y RECURSOS
int __fastcall Tmain::flota_ejecutarMision(int gO,int sO,int pO,int tipoO, TRecursos *RecursosDisp,Hangar *NavesAparcadas, int gD,int sD, int pD, int tipoD, int velocidad, int mision, TRecursos *RecursosD,bool usarBUGS)
{
/*****************************/
TDateTime start = Time();
TDateTime stop;
/*****************************/
AnsiString request,timeStamp, v;
int error = -1;
// request ="POST http://"+oG_host+"/game/index.php?page=flottenversand&session="+oG_session+" HTTP/1.1\r\n";
request ="POST /game/index.php?page=flottenversand&session="+oG_session+" HTTP/1.1\r\n";
request+="Host: "+oG_host+"\r\n";
request+="User-Agent: "+oG_userAgent+"\r\n";
request+="Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
request+="Accept-Language: es-es,es;q=0.8\r\n";
request+="Accept-Encoding: gzip,deflate\r\n";
request+="Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
request+="Keep-Alive: 300\r\n";
request+="Connection: keep-alive\r\n";
request+="Referer: http://"+oG_host+"/game/index.php?page=flotten3&session="+oG_session+"\r\n";
if ( !oG_Cookie.IsEmpty() )
request+= "Cookie: "+oG_Cookie+"\r\n";
request+="Content-Type: application/x-www-form-urlencoded\r\n";
AnsiString params;
params+="thisgalaxy"+AnsiString(gO)+"&thissystem="+AnsiString(sO)+"&thisplanet="+AnsiString(pO);
params+="&thisplanettype="+AnsiString(tipoO)+"&speedfactor=1";
params+="&thisresource1="+AnsiString(RecursosDisp->Metal)+"&thisresource2="+AnsiString(RecursosDisp->Cristal)+"&thisresource3="+AnsiString(RecursosDisp->Deuterio);
params+="&galaxy="+AnsiString(gD)+"&system="+AnsiString(sD)+"&planet="+AnsiString(pD)+"&planettype="+AnsiString(tipoD);
for ( int h=0;h<14;h++ )
{
// Seleccionamos todas las naves del planeta (menos los satelites solares)
if ( NavesAparcadas[h].id>0 && ( NavesAparcadas[h].id!=212 || usarBUGS) )
{
params+="&ship"+AnsiString(NavesAparcadas[h].id)+"="+AnsiString(NavesAparcadas[h].ship);
params+="&consumption"+AnsiString(NavesAparcadas[h].id)+"="+AnsiString(NavesAparcadas[h].consumption);
params+="&speed"+AnsiString(NavesAparcadas[h].id)+"="+AnsiString(NavesAparcadas[h].speed);
params+="&capacity"+AnsiString(NavesAparcadas[h].id)+"="+AnsiString(NavesAparcadas[h].capacity);
}
}
params+="&speed="+AnsiString(velocidad)+"&order="+AnsiString(mision);
params+="&resource1="+AnsiString(RecursosD->Metal)+"&resource2="+AnsiString(RecursosD->Cristal)+"&resource3="+AnsiString(RecursosD->Deuterio);
request+="Content-Length: "+AnsiString(params.Length())+"\r\n\r\n";
request+=params;
lastRequest = lastRequest_flottenversand;
TMemoryStream* out = new TMemoryStream();
error = HTTPdownloader->descargarHTML(oG_host.c_str(),request.c_str(),out);
/*****************************/
stop=Time();
/*****************************/
if ( error!=-1 )
{
// La flota no ha podido ser enviada
// La flota ha sido enviada
char *pos;
out->Position=0;
pos = StrPos((char *)out->Memory,"La flota ha sido enviada");
if ( pos>0 )
{
error = 0;
statusBar->SelAttributes->Color = clGreen;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > Flota sel. mision (4/4)") );
} else {
error = -1;
statusBar->SelAttributes->Color = clGreen;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > Flota sel. mision ERROR (4/4)") );
}
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > Flota sel. mission: CONNECT ERROR") );
//nextUpdate->Interval = 2000; // Reintenamos logarnos 10segundos
// nextUpdateTimer(0);
nextUpdateCLK = 0;
error = -1;
}
return error;
}
//---------------------------------------------------------------------------
char * __fastcall Tmain::extraerNavesAparcadas(char *html,Hangar *NavesAparcadas)
{
char buffer[255];
char *pos,*posEnd;
pos = html;
int h; // Vaciamos "nuestro" hangar...
for ( h=0;h<14;h++ )
NavesAparcadas[h].id=-1;
// Buscamos el punto de inicio
pos = StrPos(pos,"elegir naves");
if ( pos )
{
h=0;
posEnd=pos;
while( pos = StrPos(posEnd,"title=\"Velocidad:") )
{
if ( h>13 ) { statusBar->SelAttributes->Color = clPurple;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Extraer flota: El n<>mero de naves supera lo esperado." )); break; }
// Extraemos los datos de la nave... [ Asumimos que siempre vienen como CONSUMO/VELOCIDAD/CAPACIDAD//NAVES ]
pos = StrPos(pos,"name=\"") + 13; // name="maxship
posEnd = StrPos(pos,"\"");
StrLCopy(buffer,pos,min(posEnd-pos,254));
NavesAparcadas[h].id = atoi(buffer);
/** VALUE **/
pos = StrPos(pos,"value=\"") + 7; // value="
posEnd = StrPos(pos,"\"");
StrLCopy(buffer,pos,min(posEnd-pos,254));
NavesAparcadas[h].maxship = atol(buffer);
/*
pos = StrPos(pos,"name=\"") + 17; // name="consumption
posEnd = StrPos(pos,"\"");
StrLCopy(buffer,pos,min(posEnd-pos,254));
NavesAparcadas[h].id = atoi(buffer);
*/
/** VALUE **/
pos = StrPos(pos,"value=\"") + 7; // value="
posEnd = StrPos(pos,"\"");
StrLCopy(buffer,pos,min(posEnd-pos,254));
NavesAparcadas[h].consumption = atol(buffer);
/*
pos = StrPos(pos,"name=\"") + 11; // name="speed
posEnd = StrPos(pos,"\"");
StrLCopy(buffer,pos,min(posEnd-pos,254));
NavesAparcadas[h].id = atoi(buffer);
*/
/** VALUE **/
pos = StrPos(pos,"value=\"") + 7; // value="
posEnd = StrPos(pos,"\"");
StrLCopy(buffer,pos,min(posEnd-pos,254));
NavesAparcadas[h].speed = atol(buffer);
/*
pos = StrPos(pos,"name=\"") + 14; // name="capacity
posEnd = StrPos(pos,"\"");
StrLCopy(buffer,pos,min(posEnd-pos,254));
NavesAparcadas[h].id = atoi(buffer);
*/
/** VALUE **/
pos = StrPos(pos,"value=\"") + 7; // value="
posEnd = StrPos(pos,"\"");
StrLCopy(buffer,pos,min(posEnd-pos,254));
NavesAparcadas[h].capacity = atol(buffer);
/*
pos = StrPos(pos,"name=\"") + 11; // name="ship
posEnd = StrPos(pos,"\"");
StrLCopy(buffer,pos,min(posEnd-pos,254));
NavesAparcadas[h].id = atoi(buffer);
*/
/** VALUE **/
/*
pos = StrPos(pos,"value=\"") + 7; // value="
posEnd = StrPos(pos,"\"");
StrLCopy(buffer,pos,min(posEnd-pos,254));
NavesAparcadas[h].ship = atol(buffer);
*/
NavesAparcadas[h].ship = NavesAparcadas[h].maxship;
/*
<tr height="20">
<th><a title="Velocidad: 220000000">Sonda de espionaje</a></th>
^^^^^^^^^^^^^^^^^
<th>56<input type="hidden" name="maxship210" value="56"/></th>
<!-- <th>220000000 -->
<input type="hidden" name="consumption210" value="1"/>
<input type="hidden" name="speed210" value="220000000" /></th>
<input type="hidden" name="capacity210" value="5" /></th>
<th><a href="javascript:maxShip('ship210');" >m<>x</a> </th>
<th><input name="ship210" size="10" value="0" alt="Sonda de espionaje 56"/></th>
</tr>
*/
h++;
}
}
return pos;
}
//---------------------------------------------------------------------------
char * __fastcall Tmain::extraerRecursos(char *html, TRecursos *RecursosDisp)
{
char buffer[255];
char *pos,*posEnd;
pos = html;
// Metal / Cristal / Deuterio / Energ<72>aConsumida | EnergiaProducida
//****************************************************************************************
pos = StrPos( StrPos(pos,"<font")+5, ">")+1;
posEnd = StrPos(pos,"<");
StrLCopy(buffer,pos,min(posEnd-pos,15) );
RecursosDisp->Metal = toNumber(buffer);
pos = StrPos( StrPos(posEnd,"<font")+5, ">")+1;
posEnd = StrPos(pos,"<");
StrLCopy(buffer,pos,min(posEnd-pos,15) );
RecursosDisp->Cristal = toNumber(buffer);
pos = StrPos( StrPos(posEnd,"<font")+5, ">")+1;
posEnd = StrPos(pos,"<");
StrLCopy(buffer,pos,min(posEnd-pos,15) );
RecursosDisp->Deuterio = toNumber(buffer);
RecursosDisp->energiaConsumida = 0;
RecursosDisp->energiaProducida = 0;
//****************************************************************************************
return posEnd;
}
//---------------------------------------------------------------------------
void __fastcall Tmain::ToolButton5Click(TObject *Sender)
{
char zBuffer[255];
if ( oG_location.IsEmpty() )
{
StrCopy(zBuffer,"http://"); StrCat(zBuffer,oG_host.c_str()); StrCat(zBuffer,"/game/index.php?page=overview&session=");
} else {
StrCopy(zBuffer,oG_location.c_str());
}
StrCat(zBuffer,oG_session.c_str());
StrCat(zBuffer,"&stat_universo="); StrCat(zBuffer,AnsiString(oG_Universo).c_str());
StrCat(zBuffer,"&url=http://localhost/oGame");
//68b27494f258
ShellExecute(Application->MainForm->Handle, 0, zBuffer, "","", SW_SHOWNOACTIVATE > 32);
}
//---------------------------------------------------------------------------
void __fastcall Tmain::regresarNaves(PAtaques EAtaque)
{
if ( sndCHK_peligro->Checked )
sndPlaySound("snd\\regresarNavesRecursos.wav", SND_ASYNC | SND_FILENAME );
statusBar->SelAttributes->Color = clBlack;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Regresando naves ")+"["+EAtaque->gD+":"+EAtaque->sD+":"+EAtaque->pD+"]" );
}
//---------------------------------------------------------------------------
bool __fastcall Tmain::cambiarPlaneta(int g, int s, int p,int t)
{
bool enc;
int i,idxP;
PPlanetas EPlanetas;
enc = false;
// Buscamos el ID del planeta que esta siendo atacado
for(i=0;i<MyPlanets->Count;i++ )
{
EPlanetas = (PPlanetas)MyPlanets->Items[i];
if ( EPlanetas->g==g && EPlanetas->s==s && EPlanetas->p==p && EPlanetas->t==t )
{
idxP=i;
enc=true;
break;
}
}
if ( enc )
{
enc = ( _visionGeneral(idxP)!=-1 );
if ( !enc )
{
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Error cambiando al origen ")+"["+g+":"+s+":"+p+"]."+t );
}
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Planeta origen no encontrado ")+"["+g+":"+s+":"+p+"]."+t );
}
return enc;
}
//---------------------------------------------------------------------------
int __fastcall Tmain::sondearAtacante(PAtaques EAtaque)
{
int status;
if ( sndCHK_sondeo->Checked )
sndPlaySound("snd\\sondearAtacante.wav", SND_ASYNC | SND_FILENAME );
status = sondearPlaneta(EAtaque->gD,EAtaque->sD,EAtaque->pD,EAtaque->tD,EAtaque->gO,EAtaque->sO,EAtaque->pO,EAtaque->tO);
return status;
}
//---------------------------------------------------------------------------
int __fastcall Tmain::sondearPlaneta(int gO,int sO, int pO,int tO,int gD,int sD, int pD,int tD)
{
int status = -1;
TDateTime start=Time();
if ( cambiarPlaneta(gO,sO,pO,tO) )
{
// Cargar la galaxia...
cargarGalaxia(gD,sD,pD);
status = enviarSondaModoGalaxia(gD,sD,pD,tD);
statusBar->SelAttributes->Color = 0x0075BAFF;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Sondeando planeta ")+"["+gD+":"+sD+":"+pD+"]."+tD+" ["+AnsiString(MilliSecondsBetween(Time(),start))+"]" );
// A<>adimos el evento a la cola de eventos...
addEvent( gO,sO,pO,tO,"Espionaje",0,0,gD,sD,pD,tD,"lanzado...",0,0,'e' );
}
return status;
}
//---------------------------------------------------------------------------
int __fastcall Tmain::cargarGalaxia(int g,int s, int p)
{
int error;
AnsiString request,post;
if ( (g<1 || g>9) || (s<1 || s>499) || (p<1 || p>15) )
{
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Error Galaxia (Fuera de rango)") );
return 0;
}
error = 0;
if ( error!=-1 )
{
request = "GET /game/index.php?page=galaxy&galaxy="+AnsiString(g)+"&system="+AnsiString(s)+"&position="+AnsiString(p)+"&session="+oG_session+" HTTP/1.1\r\n";
request+= "Host: "+oG_host+"\r\n";
request+= "User-Agent: "+oG_userAgent+"\r\n";
request+= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
request+= "Accept-Language: es-es,es;q=0.8\r\n";
request+= "Accept-Encoding: gzip,deflate\r\n";
request+= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
request+= "Keep-Alive: 300\r\n";
request+= "Connection: keep-alive\r\n";
request+= "Referer: http://"+oG_host+"/game/index.php?page=flotten1&session="+oG_session+"&mode=Flotte\r\n";
if ( !oG_Cookie.IsEmpty() )
request+= "Cookie: "+oG_Cookie+"\r\n";
request+= "\r\n";
lastRequest = lastRequest_galaxy;
TMemoryStream* out = new TMemoryStream();
error = HTTPdownloader->descargarHTML(oG_host.c_str(),request.c_str(),out);
if ( error!=-1 )
{
error = checkError( out );
if ( error!=-1 )
{
// Parseamos el listado de mensajes...
/*
out->Position = 0;
(char *)out->Memory;
*/
statusBar->SelAttributes->Color = clGreen;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Cargar Galaxia [")+AnsiString(g)+AnsiString(":")+AnsiString(s)+AnsiString("]") );
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Error descargando mensaje (Sesion caducada)") );
}
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Error Galaxia") );
}
delete out;
}
return error;
}
//---------------------------------------------------------------------------
/**** SONDEO DE PLANETA DESDE EL MODO GALAXIA ***********/
int __fastcall Tmain::enviarSondaModoGalaxia(int g,int s, int p,int pt)
{
int error;
AnsiString request,post;
// Descargamos la p<>gina de mensajes...
// oG_host, oG_session, oG_SSID, oG_Cookie;
if ( (g<1 || g>9) || (s<1 || s>499) || (p<1 || p>15) || (pt<1 || pt>2) )
{
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Error sondeando planeta (Fuera de rango)") );
return 0;
}
error = 0;
if ( oG_session=="" )
{
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Session vacia") );
currentState = csLOGIN;
nextUpdateCLK = 0;
}
if ( error!=-1 )
{
/*?session="+oG_session+"*/
// request = "POST http://"+oG_host+"/game/index.php?ajax=1&page=flottenversand&session="+oG_session+" HTTP/1.1\r\n";
request = "POST /game/index.php?ajax=1&page=flottenversand&session="+oG_session+" HTTP/1.1\r\n";
request+= "Host: "+oG_host+"\r\n";
request+= "User-Agent: "+oG_userAgent+"\r\n";
request+= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
request+= "Accept-Language: es-es,es;q=0.8\r\n";
request+= "Accept-Encoding: gzip,deflate\r\n";
request+= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
request+= "Keep-Alive: 300\r\n";
request+= "Connection: keep-alive\r\n";
request+= "Content-Type: application/x-www-form-urlencoded\r\n";
request+= "Referer: http://"+oG_host+"/game/index.php?page=galaxy&no_header=1&session="+oG_session+"\r\n";
// request+= "Referer: http://"+oG_host+"/game/index.php?page=galaxy&session="+oG_session+"&no_header=1\r\n";
post = "session="+oG_session+"&order=6&galaxy="+g+"&system="+s+"&planet="+p+"&planettype="+pt+"&shipcount=2&speed=10&reply=short&rndval="+AnsiString(MilliSecondsBetween(TDateTime::CurrentDateTime(),EncodeDateTime(1970,1,1,0,0,0,0)));
request+= "Content-Length: "+AnsiString(post.Length())+"\r\n";
if ( !oG_Cookie.IsEmpty() )
request+= "Cookie: "+oG_Cookie+"\r\n";
request+= "Pragma: no-cache\r\n";
request+= "Cache-Control: no-cache\r\n";
request+= "\r\n";
request+= post;
lastRequest = lastRequest_galaxyProbe;
TMemoryStream* out = new TMemoryStream();
error = HTTPdownloader->descargarHTML(oG_host.c_str(),request.c_str(),out);
if ( error!=-1 )
{
error = checkError( out );
if ( error!=-1 )
{
// Parseamos el listado de mensajes...
out->Position = 0;
// ######################
char buffer[255];
strncpy(buffer,(char *)out->Memory,3);
/*
*
* 600 OK
* 601 no planet exists there
* 602 no moon exists there
* 603 player is in noob protection
* 604 player is too strong
* 605 player is in u-mode
* 610 not enough espionage probes, sending x (parameter is the second return value)
* 611 no espionage probes, nothing send
* 612 no fleet slots free, nothing send
* 613 not enough deuterium to send a probe
*
*/
error = atoi(buffer);
// ######################
statusBar->SelAttributes->Color = clGreen;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Sondeo de planeta [")+AnsiString(g)+AnsiString(":")+AnsiString(s)+AnsiString(":")+AnsiString(p)+AnsiString("].")+AnsiString(pt)+AnsiString(" <20>")+AnsiString(error)+AnsiString("!") );
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Error descargando mensaje (Sesion caducada)") );
/*
error = iniciarSesion();
// Deberiamos reintentar descargar los mensajes...
if ( error!=-1 )
sondearPlaneta(g,s,p,1);
*/
}
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Error sondeando planeta") );
}
delete out;
}
return error;
}
//---------------------------------------------------------------------------
int __fastcall Tmain::retirarNavesRecursos(PAtaques EAtaque, bool irAEscombros, int velocidadRec )
{
int error=0;
TRecursos maxRecursos;
Hangar NavesAparcadas[14];
int velocidad=10; // 10%
int mision=4; // 3 - transportar // 4 - desplegar // 8 - recolectar
int gO,sO,pO,tipoO;
int gD,sD,pD,tipoD;
tipoD=1;// 1 - planeta // 2 - Escombros // 3 - Luna
int idPlaneta;
// ######################################
gO=EAtaque->gD; sO=EAtaque->sD; pO=EAtaque->pD; tipoO=EAtaque->tD;
gD=EAtaque->gD; sD=EAtaque->sD; pD=EAtaque->pD; tipoD=2; mision=8;
velocidad=1;
// ######################################
int i;bool enc=false;
for ( i=0; i<MyPlanets->Count && !enc; i++ )
if ( ((PPlanetas)MyPlanets->Items[i])->g==gO &&
((PPlanetas)MyPlanets->Items[i])->s==sO &&
((PPlanetas)MyPlanets->Items[i])->p==pO &&
((PPlanetas)MyPlanets->Items[i])->t==tipoO ) { enc=true; break; }
if ( enc )
{
idPlaneta=((PPlanetas)MyPlanets->Items[i])->cp;
if ( irAEscombros )
{
gD=EAtaque->gD; sD=EAtaque->sD; pD=EAtaque->pD; tipoD=2; mision=8; velocidad=velocidadRec;
}else {
buscarRefugio(idPlaneta,&gD,&sD,&pD,&tipoD);
if ( tipoD==2 )
{
mision = 8;
velocidad=9;
} else mision=4;
}
error = flota_obtenerFlota(idPlaneta,&RecursosDisp,NavesAparcadas);
if ( error!=-1 )
{
if ( numNaves(NavesAparcadas)<=0 )
{
statusBar->SelAttributes->Color = 0x0075BAFF;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("<22>No hay naves! ")+"["+EAtaque->gD+":"+EAtaque->sD+":"+EAtaque->pD+"]" );
EAtaque->status = ATAQUE_SACAR_NAVES_EN_ULTIMO_SEGUNDO;
error = -1;
} else {
error = flota_seleccionarFlota(NavesAparcadas,&RecursosDisp);
if ( error!=-1 )
{
error = flota_fijarObjetivo(gO,sO,pO,tipoO,&RecursosDisp,NavesAparcadas,gD,sD,pD,tipoD,velocidad);
if ( error!=-1 )
{
maxResources(&RecursosDisp,NavesAparcadas,&maxRecursos);
error = flota_ejecutarMision(gO,sO,pO,tipoO,&RecursosDisp,NavesAparcadas,gD,sD,pD,tipoD,velocidad,mision,&maxRecursos,false);
if ( error!=-1 )
{
if ( sndCHK_peligro->Checked )
sndPlaySound("snd\\retirarNavesRecursos.wav", SND_ASYNC | SND_FILENAME );
statusBar->SelAttributes->Color = 0x0075BAFF;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Retirando naves ")+"["+EAtaque->gD+":"+EAtaque->sD+":"+EAtaque->pD+"]" );
} // ejecutarMision y seleccion de recursos
} // fijarObjetivo
} // seleccionarFlota
} // sin naves en el hangar
} // obtenerFlota
if ( error==-1 )
{
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Retirando naves ")+"["+EAtaque->gD+":"+EAtaque->sD+":"+EAtaque->pD+"]."+EAtaque->tD );
if ( sndCHK_error->Checked )
sndPlaySound("snd\\retirarNavesRecursos_error.wav", SND_ASYNC | SND_FILENAME );
}
} else {
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Flota: ERROR de ORIGEN ")+"["+EAtaque->gD+":"+EAtaque->sD+":"+EAtaque->pD+"]."+EAtaque->tD );
error=-1;
}
return error;
}
//---------------------------------------------------------------------------
void __fastcall Tmain::cron(TObject *Sender)
{
nextUpdateCLK--;
if ( currentState==csREADY ) runREADY();
if ( nextUpdateCLK<=0 ) {
switch( currentState ) {
case csREADPASS:
if ( recuperarPassword() ) {
currentState = csLOGIN;
} else
nextUpdateCLK = 5;
break;
case csRESETPASS:
cambioPassword();
if( sndCHK_network->Checked ) sndPlaySound("snd\\errorConexion.wav", SND_ASYNC | SND_FILENAME | SND_LOOP);
break;
case csLOGIN:
iniciarSesion();
break;
case csREADY:
int error = visionGeneral();
if ( error==-1 ) {
errorCONEXION++;
if ( errorCONEXION>3 ) {
nextUpdateCLK = 5;
if( sndCHK_network->Checked ) sndPlaySound("snd\\errorConexion.wav", SND_ASYNC | SND_FILENAME | SND_LOOP);
} else {
nextUpdateCLK = 1;
}
} else {
errorCONEXION = 0;
currentState = csREADY;
nextUpdateCLK=20*60 + (rand()%100)*6;
}
break;
}
}
nextUpdateCLOCK->Caption = AnsiString(nextUpdateCLK/60)+" minutos "+AnsiString(nextUpdateCLK%60)+" seg.";
dgEventos->Refresh();
}
void __fastcall Tmain::runREADY() {
PEventos EStruct;
PAtaques EAtaque;
espacioEntreAtaques--;
int dev,aux;
unsigned long i, t;
t=9999999;
/*
// Borramos los ataques marcados para tal...
for(i=0;i<MyAttacks->Count;i++)
{
try { EAtaque = (PAtaques)MyAttacks->Items[i]; } catch(...) { break; }
if ( EAtaque->borrar==true ) {
if ( EAtaque->status==ATAQUE_NAVES_VOLANDO ) {
regresarNaves(EAtaque);
}
MyAttacks->Delete(i);
delete EAtaque;
}
}
MyAttacks->Pack();
*/
// Atendemos al resto de ataques...
bool pack;
pack=false;
for(i=0;i<MyAttacks->Count;i++)
{
try { EAtaque = (PAtaques)MyAttacks->Items[i]; } catch(...) { break; } // Si no podemos llegar a este ataque, abortamos el bucle
EAtaque->t--;
EAtaque->tDelay++;
if ( EAtaque->borrar==true )
{
pack=true;
// Han cancelado el ataque, pero nuestras naves ya hab<61>an sido desplegadas...
if ( EAtaque->status==ATAQUE_NAVES_VOLANDO )
regresarNaves(EAtaque);
MyAttacks->Delete(i);
delete EAtaque;
} else {
t = min( t, EAtaque->t );
// Si estamos dentro del tiempo cr<63>tico, no intentar sondearlo, escapar directamente
if ( EAtaque->t <= CFG_tiempoCritico && EAtaque->status==ATAQUE_SONDEAR_ATACANTE ) EAtaque->status=ATAQUE_BUSCAR_RUTA_ESCAPE;
switch( EAtaque->status )
{
case ATAQUE_SONDEAR_ATACANTE: // Sondear al enemigo
// Esperamos 5 Minutos antes de sondear a este atacante...
if ( EAtaque->tDelay >= 300 )
{
dev = 0;
// Evitar sondeos dobles
// Si ya hemos sondeado al planeta atacante (y hace menos de 5 minutos)
{
PAtaques a;
for (int s=0;s<MyAttacks->Count;s++)
{
try { a=(PAtaques)MyAttacks->Items[s]; } catch(...) { break; }
if ( a->status == ATAQUE_ESCAPAR_A_ESCOMBROS
&& a->gO==EAtaque->gO && a->sO==EAtaque->sO && a->pO==EAtaque->pO )
{
dev = 600;
break;
}
}
}
EAtaque->status=ATAQUE_ESCAPAR_A_ESCOMBROS;
EAtaque->tDelay = 0;
if ( dev == 0)
{
dev = sondearAtacante(EAtaque);
if ( CFG_ejecutarProgama ) ejecutarProgramaAntiSondeo(EAtaque);
switch(dev)
{
case 600:
break; // TODO OK
default:
break;
}
}
}
break;
case ATAQUE_ESCAPAR_A_ESCOMBROS: // Retirar el ataque cuando llegue al tiempo cr<63>tico PARA ESCAPE A ESCOMBROS
if ( EAtaque->t <= 618 ) // 10 minutos y 18 segundos
{
if ( EAtaque->t<=375) aux = 10; // 6 min y 15 seg
else { if ( EAtaque->t<=415) aux = 9; // 6 min y 55 seg
else { if ( EAtaque->t<=466) aux = 8; // 7 min y 46 seg
else { if ( EAtaque->t<=531) aux = 7; // 8 min y 51 seg
else { if ( EAtaque->t<=618 ) aux = 6; // 10 min y 18 seg
}
}
}
}
dev = retirarNavesRecursos(EAtaque,true,aux); // Ir a escombros al 60%
if ( dev != -1 )
{
addEvent( EAtaque->gO,EAtaque->sO,EAtaque->pO,EAtaque->tO,"ATAQUE",0,0,EAtaque->gD,EAtaque->sD,EAtaque->pD,EAtaque->tD,"DETECTADO",0,0,'A' );
// computacionesOcupadas++;
EAtaque->status=ATAQUE_NAVES_VOLANDO;
} else
EAtaque->status=ATAQUE_BUSCAR_RUTA_ESCAPE; // El siguiente intento sera escapar segun reglas definidas por el usuario
EAtaque->tDelay = 0;
}
break;
case ATAQUE_BUSCAR_RUTA_ESCAPE: // Retirar el ataque cuando llegue al tiempo cr<63>tico
if ( EAtaque->t <= CFG_tiempoCritico )
{
dev = retirarNavesRecursos(EAtaque,false,0);
if ( dev != -1 )
{
addEvent( EAtaque->gO,EAtaque->sO,EAtaque->pO,EAtaque->tO,"ATAQUE",0,0,EAtaque->gD,EAtaque->sD,EAtaque->pD,EAtaque->tD,"DETECTADO",0,0,'A' );
// computacionesOcupadas++;
EAtaque->status=ATAQUE_NAVES_VOLANDO;
} else
EAtaque->status = ATAQUE_SACAR_NAVES_EN_ULTIMO_SEGUNDO;
EAtaque->tDelay = 0;
}
break;
case ATAQUE_SACAR_NAVES_EN_ULTIMO_SEGUNDO:
if ( EAtaque->t <= 6 )
{
dev = retirarNavesRecursos(EAtaque,false,0);
if ( dev != -1 )
{
addEvent( EAtaque->gO,EAtaque->sO,EAtaque->pO,EAtaque->tO,"ATAQUE",0,0,EAtaque->gD,EAtaque->sD,EAtaque->pD,EAtaque->tD,"DETECTADO",0,0,'A' );
// computacionesOcupadas++;
EAtaque->status=ATAQUE_NAVES_VOLANDO;
EAtaque->tDelay = 0;
}
}
break;
}
}
}
if ( pack ) MyAttacks->Pack();
// Control de la flota en vuelo (VISION GENERAL)
for(i=0;i<numEventos;i++)
{
EStruct = (PEventos) MyEvents->Items[i];
EStruct->ida--;
EStruct->vuelta--;
if ( /* t==9999999 && */ EStruct->ida<=-30 && EStruct->vuelta<=-30 ) nextUpdateCLK=0;
}
computaciones->Caption = (computacionesOcupadas<0?AnsiString("n/a"):AnsiString(computacionesOcupadas))+" / "+AnsiString(CFG_ocuparMaxComputaciones)+" Ev.("+AnsiString(numEventos)+")";
// Hay un ataque en curso, asi que programamos la proxima actualizacion
// para dentro de la mitad de tiempo que quede para llegar el ataque
if ( t!=9999999 )
{
t = (t/2); if ( t<=0 ) t=10; // Grantizamos poder conectar incluso en el <20>ltimo segundo...
if ( t>0 && nextUpdateCLK>t )
nextUpdateCLK = t;
} else {
// Si esta activada la opci<63>n de sondeo autom<6F>tico...
if ( ( chkSondeo5min->Checked || chkSondeo2min->Checked || chkAviso5min->Checked )
// computacionesOcupadas<=CFG_ocuparMaxComputaciones
)
{
PEventos EStruct;
for ( i=0;i<MyEvents->Count;i++ )
{
EStruct = (PEventos)MyEvents->Items[i];
if ( EStruct->mision=='a' && // Ataque nuestro
EStruct->ida>0 // Que aun no ha llegado
)
{
// Sondeo de los 5 minutos 25 segundos ...
if ( EStruct->ida>46 && EStruct->ida<325 )
{
// Aviso 25 segundos despues de lanzar el sondeo...
if ( chkAviso5min->Checked && EStruct->avisado == false && EStruct->ida<300 ) { EStruct->avisado = true;
sndPlaySound("snd\\alarmaAtaquePropio.wav", SND_ASYNC | SND_FILENAME | SND_LOOP);
InfoBox->Visible=true;
}
// Sondeo de los 2 minutos...
if ( EStruct->ida>55 && computacionesOcupadas<=CFG_ocuparMaxComputaciones )
{
if ( EStruct->status!=12 && chkSondeo2min->Checked && EStruct->ida<120 ) { EStruct->status=12; sondearPlaneta(EStruct->gO,EStruct->sO,EStruct->pO,EStruct->tO,EStruct->gD,EStruct->sD,EStruct->pD,EStruct->tD); break; }
if ( EStruct->status==00 && chkSondeo5min->Checked ) { EStruct->status=15; sondearPlaneta(EStruct->gO,EStruct->sO,EStruct->pO,EStruct->tO,EStruct->gD,EStruct->sD,EStruct->pD,EStruct->tD); break; }
}
}
}
}
}
// Si no estamos siendo atacados,
// - hay una computaci<63>n libre
// - y tenemos una lista de ataques (con ataques pendientes)
// - y hay un margen entre el <20>timo ataque y este prudencial...
// ...lanzamos el siguiente ataque.
// if ( activarColaAtaques->Checked &&
if (
computacionesOcupadas<CFG_ocuparMaxComputaciones &&
espacioEntreAtaques <= 0
)
{
// Las colas de sondeo tienen prioridad frente a las de ataque...
if ( activarSondeo->Checked )
{
if ( sondeoMasivo->Lines->Count == 0 ) activarSondeo->Checked = false;
else {
int gD,sD,pD,tD;
tD = 1;
// Computaciones ocupadas==-1 // Justo despues de una vision general, cuando todas las computaciones ocupadas
if ( computacionesOcupadas<0 )
{
Hangar NavesAparcadas[14];
flota_obtenerFlota(((PPlanetas)MyPlanets->Items[ (int)planetasOrigenSondeo->Items->Objects[planetasOrigenSondeo->ItemIndex] ])->cp,&RecursosDisp,NavesAparcadas);
}
if ( computacionesOcupadas<CFG_ocuparMaxComputaciones )
{
// Parseamos la primera linea de ataque...
sscanf(sondeoMasivo->Lines->Strings[0].c_str(),"%d:%d:%d",&gD,&sD,&pD);
// Para sondear modo galaxia, hay que estar previamente en "modo galaxia"
if ( !(lastRequest==lastRequest_galaxy || lastRequest==lastRequest_galaxyProbe) ) cargarGalaxia(gD,sD,pD);
sondeoMasivo->Lines->Delete(0);
espacioEntreAtaques = 2+ (rand()%5);
tD = enviarSondaModoGalaxia(gD,sD,pD,tD);
if ( tD<600 ) lastRequest = lastRequest_galaxyProbeError;
else {
// A<>adimos el evento a la cola de eventos...
addEvent( 0,0,0,0,"Espionaje",0,0,gD,sD,pD,tD,"lanzado...",0,0,'e' );
// Lanzado un bloque de espionaje, esperamos 100 segundos, antes de actualizar la vision general
if ( computacionesOcupadas>=CFG_ocuparMaxComputaciones ) nextUpdateCLK = 100;
}
}
}
} else
if ( activarColaAtaques->Checked )
{
espacioEntreAtaques = 20; // Dejamos entre este ataque y el siguiente, almenos 20segundos de margen.
// Localizamos el siguiente objetivo (no atacado) de nuestra "cola de ataques"
bool enc = false;
for (i=0;i<AtaquesOfensivos->Count;i++)
{
enc = ((TAtaqueOfensivo *)AtaquesOfensivos->Items[i])->lanzado == false;
if (enc) break;
}
if ( enc==true )
{
int error;
error = siguienteAtaque( ((TAtaqueOfensivo *)AtaquesOfensivos->Items[i]) );
if ( error>=0 )
nextUpdateCLK = 5;
} else {
// Cola de ataques vacia...
activarColaAtaques->Checked = btAutoReiniciarCola->Down; // Modo repetici<63>n activado ?
if ( activarColaAtaques->Checked )
{
// Marcamos a toda la cola como NO ATACADOS
for (i=0;i<AtaquesOfensivos->Count;i++)
((TAtaqueOfensivo *)AtaquesOfensivos->Items[i])->lanzado = false;
}
}
} // Sondeo / Cola de Ataque
}
}
}
//---------------------------------------------------------------------------
void __fastcall Tmain::addEvent(int gO,int sO,int pO,int tO,char *nO,long ida,long start, int gD,int sD,int pD,int tD,char *nD,long vuelta,long stop,char mision)
{
// A<>adimos este ataque al control de vuelo de flota...
TEventos *EStruct;
if ( MyEvents->Count<=numEventos )
{
EStruct = new TEventos;
MyEvents->Add(EStruct);
} else
EStruct = (PEventos)MyEvents->Items[numEventos];
EStruct->ida=ida;
EStruct->start=start;
EStruct->vuelta=vuelta;
EStruct->stop=stop;
EStruct->gO = gO; EStruct->sO = sO; EStruct->pO = pO; EStruct->tO = tO;
strcpy(EStruct->planeta_o,nO);
EStruct->gD = gD; EStruct->sD = sD; EStruct->pD = pD; EStruct->tD = tD;
strcpy(EStruct->planeta_d,nD);
EStruct->mision=mision;
dgEventos->RowCount++;
numEventos++;
computacionesOcupadas++;
}
//---------------------------------------------------------------------------
long __fastcall Tmain::toNumber(char *n)
{
long dev = 0;
for( ; *n!=0; n++ )
{
if ( *n>='0' && *n<='9' )
dev = dev*10 + (*n-'0');
}
return dev;
}
//---------------------------------------------------------------------------
char * __fastcall Tmain::strRTrim(char *string)
{
char *pos;
if ( pos=StrRScan(string,' ') )
do { *pos='\0'; pos--; } while( *pos==' ' || *pos=='\t' );
return string;
}
//---------------------------------------------------------------------------
bool __fastcall Tmain::buscarRefugio(int idPlaneta,int *gD,int *sD,int *pD,int *tipoD)
{
bool enc;
enc = false;
return enc;
}
//---------------------------------------------------------------------------
int __fastcall Tmain::siguienteAtaque(TAtaqueOfensivo *tropas)
{
int error,idPlaneta,velocidad=10;
TRecursos maxRecursos;
Hangar NavesAparcadas[14];
int i,n;bool enc=false;
for ( i=0; i<MyPlanets->Count && !enc; i++ )
if ( ((PPlanetas)MyPlanets->Items[i])->g==tropas->evento.gO &&
((PPlanetas)MyPlanets->Items[i])->s==tropas->evento.sO &&
((PPlanetas)MyPlanets->Items[i])->p==tropas->evento.pO &&
((PPlanetas)MyPlanets->Items[i])->t==tropas->evento.tO ) { enc=true; break; }
if ( enc )
{
velocidad = tropas->velocidadFactor;
// falseamos las velocidades base
if ( tropas->velocidadBase>0 )
{
for( n=0; n<14; n++ )
tropas->naves[n].speed = tropas->velocidadBase;
}
idPlaneta=((PPlanetas)MyPlanets->Items[i])->cp;
error = flota_obtenerFlota(idPlaneta,&RecursosDisp,NavesAparcadas);
if ( error!=-1 )
{
if ( computacionesOcupadas>=0 && computacionesOcupadas<CFG_ocuparMaxComputaciones )
{
if ( cmpNaves(NavesAparcadas,tropas->naves)<0 )
{
statusBar->SelAttributes->Color = 0x0075BAFF;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("<22>No hay suficientes naves en ")+"["+tropas->evento.gO+":"+tropas->evento.sO+":"+tropas->evento.pO+"]."+tropas->evento.tO+"!" );
// DEBERIA MARCARSE COMO ESTADO DE ERROR
tropas->lanzado=true;
error = -1;
} else {
error = flota_seleccionarFlota(tropas->naves,&RecursosDisp);
if ( error!=-1 )
{
error = flota_fijarObjetivo(tropas->evento.gO,tropas->evento.sO,tropas->evento.pO,tropas->evento.tO,&RecursosDisp,tropas->naves,tropas->evento.gD,tropas->evento.sD,tropas->evento.pD,tropas->evento.tD,velocidad);
if ( error!=-1 )
{
maxRecursos.Metal=0;
maxRecursos.Cristal=0;
maxRecursos.Deuterio=0;
RecursosDisp.Metal = min( labs(RecursosDisp.Metal),labs(maxRecursos.Metal) );
RecursosDisp.Cristal = min( labs(RecursosDisp.Cristal),labs(maxRecursos.Cristal) );
RecursosDisp.Deuterio = min( labs(RecursosDisp.Deuterio),labs(maxRecursos.Deuterio) );
maxResources(&RecursosDisp,tropas->naves,&maxRecursos);
error = flota_ejecutarMision(tropas->evento.gO,tropas->evento.sO,tropas->evento.pO,tropas->evento.tO,&RecursosDisp,tropas->naves,tropas->evento.gD,tropas->evento.sD,tropas->evento.pD,tropas->evento.tD,velocidad,oG_mision(tropas->evento.mision),&maxRecursos,tropas->usarSatelites);
if ( error!=-1 )
{
tropas->lanzado = true;
if ( sndCHK_ataque->Checked )
sndPlaySound("snd\\ataqueLanzado.wav", SND_ASYNC | SND_FILENAME );
addEvent( tropas->evento.gO,tropas->evento.sO,tropas->evento.pO,tropas->evento.tO,"Ataque",0,0,tropas->evento.gD,tropas->evento.sD,tropas->evento.pD,tropas->evento.tD,"lanzado...",0,0,'a' );
statusBar->SelAttributes->Color = 0x0075BAFF;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Ataque encolado [")+tropas->evento.gO+":"+tropas->evento.sO+":"+tropas->evento.pO+"]."+tropas->evento.tO+" -> ["+tropas->evento.gD+":"+tropas->evento.sD+":"+tropas->evento.pD+"]"+tropas->evento.tD );
} // ejecutarMision y seleccion de recursos
} // fijarObjetivo
} // seleccionarFlota
} // sin naves en el hangar
} else error=-2;// computaciones disponibles
} // obtenerFlota
if ( error==-1 )
{
// DEBERIA MARCARSE COMO ESTADO DE ERROR
tropas->lanzado = true;
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Encolando ataque [")+tropas->evento.gO+":"+tropas->evento.sO+":"+tropas->evento.pO+"]."+tropas->evento.tO+" -> ["+tropas->evento.gD+":"+tropas->evento.sD+":"+tropas->evento.pD+"]"+tropas->evento.tD );
if ( sndCHK_error->Checked )
sndPlaySound("snd\\retirarNavesRecursos_error.wav", SND_ASYNC | SND_FILENAME );
}
} else {
// DEBERIA MARCARSE COMO ESTADO DE ERROR
tropas->lanzado = true;
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Ataque encolado -ERROR de origen ")+"["+tropas->evento.gO+":"+tropas->evento.sO+":"+tropas->evento.pO+"]" );
error=-1;
}
return error;
}
//---------------------------------------------------------------------------
void __fastcall Tmain::btEditarAtaqueOfensivoClick(TObject *Sender)
{
// cargarPlanetasEnVisorAtaques();
visorAtaques->AtaquesOfensivos=AtaquesOfensivos;
//>> visorAtaques->nuevoAtaque();
// visorAtaques->Visible=true;
visorAtaques->ShowModal();
dgAtaques->RowCount = AtaquesOfensivos->Count+1;
if ( dgAtaques->RowCount>1 ) dgAtaques->FixedRows=1;
}
//---------------------------------------------------------------------------
void __fastcall Tmain::cargarPlanetasEnColaSondeos(void)
{
int i;
// Completa la lista de planetas en el desplegable...
TPlanetas *planeta;
planetasOrigenSondeo->Items->Clear();
for ( i=0;i<MyPlanets->Count;i++ )
{
planeta = (TPlanetas *)MyPlanets->Items[i];
planetasOrigenSondeo->Items->AddObject(Format("%d:%.3d:%.2d -%d- %s",ARRAYOFCONST((planeta->g,planeta->s,planeta->p,planeta->t,planeta->planeta)) ), (TObject *)i );
}
planetasOrigenSondeo->ItemIndex=0;
}
//---------------------------------------------------------------------------
void __fastcall Tmain::cargarPlanetasEnVisorAtaques(void)
{
int i;
// Completa la lista de planetas en el desplegable...
if ( visorAtaques->planetasOrigen->Items->Count < MyPlanets->Count )
{
TPlanetas *planeta;
visorAtaques->planetasOrigen->Items->Clear();
for ( i=0;i<MyPlanets->Count;i++ )
{
planeta = (TPlanetas *)MyPlanets->Items[i];
visorAtaques->planetasOrigen->Items->Add(Format("%d:%.3d:%.2d -%d- %s",ARRAYOFCONST((planeta->g,planeta->s,planeta->p,planeta->t,planeta->planeta)) ) );
}
visorAtaques->planetasOrigen->ItemIndex=0;
}
}
//---------------------------------------------------------------------------
void __fastcall Tmain::dgAtaquesDrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
if ( ARow==0 )
{
dgAtaques->Canvas->Font->Style = TFontStyles();
switch(ACol)
{
case 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" );
break;
case 1:
break;
}
} else {
if ( ARow <= AtaquesOfensivos->Count )
{
PAtaqueOfensivo EAtaque;
EAtaque = (PAtaqueOfensivo)AtaquesOfensivos->Items[ARow-1];
if ( EAtaque->lanzado==true )
dgAtaques->Canvas->Font->Style = TFontStyles()<< fsStrikeOut;
else
dgAtaques->Canvas->Font->Style = TFontStyles();
switch(ACol)
{
case 0:
int tH,tM,tS;
// 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, AnsiString(EAtaque->evento.mision) + (EAtaque->evento.mision=='a'?(AnsiString(" - ")+AnsiString(EAtaque->evento.status)):AnsiString("")) );
dgAtaques->Canvas->TextRect(TRect(Rect.Left,Rect.Top+16,Rect.Right,Rect.Bottom),Rect.Left,Rect.Top + 16, digerirFlota(EAtaque->naves,EAtaque->numNaves) );
break;
case 1:
// ESTADO actual del ataque...
break;
}
if (State.Contains(gdFocused))
dgAtaques->Canvas->DrawFocusRect(Rect);
}
}
}
//---------------------------------------------------------------------------
int __fastcall Tmain::oG_mision(char m)
{
int ogM;
switch( m )
{
case 'a': ogM=1; break;
case 'd': ogM=4; break;
case 't': ogM=3; break;
case 'r': ogM=8; break;
case 'e': ogM=6; break;
}
return ogM;
}
//---------------------------------------------------------------------------
AnsiString __fastcall Tmain::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;
case 215: dev += AnsiString(naves[i].ship)+AnsiString("A "); break;
}
}
return dev;
}
//---------------------------------------------------------------------------
void __fastcall Tmain::btLoginClick(TObject *Sender)
{
// Guardar LOG a disco...
if (SaveDialog1->Execute())
statusBar->Lines->SaveToFile(SaveDialog1->FileName);
}
//---------------------------------------------------------------------------
void __fastcall Tmain::setComputacionesClick(TObject *Sender, TUDBtnType Button)
{
CFG_ocuparMaxComputaciones = setComputaciones->Position;
}
//---------------------------------------------------------------------------
void __fastcall Tmain::ToolButton8Click(TObject *Sender)
{
MessageDlg("Programador de Ataques en prueba. \n -no disponible en esta versi<73>n-",mtInformation, TMsgDlgButtons() << mbOK, 0);
}
//---------------------------------------------------------------------------
void __fastcall Tmain::ToolButton9Click(TObject *Sender)
{
recuperarPassword();
MessageDlg("Cola de Construcci<63>n en pruebas. \n -no disponible en esta versi<73>n-",mtInformation, TMsgDlgButtons() << mbOK, 0);
}
//---------------------------------------------------------------------------
void __fastcall Tmain::SpeedButton1Click(TObject *Sender)
{
// Activar / Desactivar, comprobador de actividad...
comprobadorActividad->Show();
}
//---------------------------------------------------------------------------
/* Magnetic Form */
/*****************/
//---------------------------------------------------------------------------
void __fastcall Tmain::SettingChanged(TMessage &msg)
{
UpdateWorkArea();
}
//---------------------------------------------------------------------------
void __fastcall Tmain::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 Tmain::UpdateWorkArea()
{
SystemParametersInfo(SPI_GETWORKAREA, 0, &work_area, 0);
//get the size of the desktop or whatever
}
//---------------------------------------------------------------------------
void __fastcall Tmain::FormClose(TObject *Sender, TCloseAction &Action)
{
// Guardamos las preferencias...
TIniFile *ini;
ini = new TIniFile(ExtractFileDir(Application->ExeName)+"\\salvaVidas.ini");
ini->WriteInteger("window","TOP",this->Top);
ini->WriteInteger("window","LEFT",this->Left);
ini->WriteInteger("window","WIDTH",this->Width);
ini->WriteInteger("window","HEIGHT",this->Height);
ini->WriteBool("colaAtaques","colaActiva",activarColaAtaques->Checked);
int i; bool enc = false;
for (i=0;i<AtaquesOfensivos->Count;i++)
{
enc = ((TAtaqueOfensivo *)AtaquesOfensivos->Items[i])->lanzado == false;
if (enc) break;
}
ini->WriteInteger("colaAtaques","siguienteAtaque",enc?i:0);
ShortDateFormat = "yyyy/mm/dd";
DateSeparator = '-';
TimeSeparator = ';';
statusBar->Lines->SaveToFile( ExtractFilePath(Application->ExeName)+"log\\"+DateTimeToStr(Now())+".rtf" );
delete ini;
}
//---------------------------------------------------------------------------
bool __fastcall Tmain::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/*,
&Ataque->naves[13].id,&Ataque->naves[13].ship */
);
if ( i>0 )
{
Ataque->usarSatelites = (_usarSatelites==1);
Ataque->lanzado = false;
Ataque->evento.status=12;Ataque->evento.avisado=true;
if ( Ataque->numNaves>14 ) Ataque->numNaves=14;
fixParams(Ataque->naves);
AtaquesOfensivos->Add(Ataque);
Ataque = new TAtaqueOfensivo;
}
}while( i>0 );
delete Ataque;
fclose(in);
dev = true;
}
return dev;
}
//---------------------------------------------------------------------------
void __fastcall Tmain::fixParams(THangar *naves)
{
int i;
for ( i=0; i<14; i++ )
{
switch( naves[i].id )
{
// Nave peque<75>a de carga
case 202:
naves[i].consumption=20;
naves[i].speed=30000;
naves[i].capacity=5000;
naves[i].maxship = naves[i].ship;
break;
// Nave grande de carga
case 203:
naves[i].consumption=50;
naves[i].speed=16500;
naves[i].capacity=25000;
naves[i].maxship = naves[i].ship;
break;
// Cazador ligero
case 204:
naves[i].consumption=20;
naves[i].speed=27500;
naves[i].capacity=50;
naves[i].maxship = naves[i].ship;
break;
// Cazador Pesado
case 205:
naves[i].consumption=75;
naves[i].speed=30000;
naves[i].capacity=100;
naves[i].maxship = naves[i].ship;
break;
// Crucero
case 206:
naves[i].consumption=300;
naves[i].speed=45000;
naves[i].capacity=800;
naves[i].maxship = naves[i].ship;
break;
// Nave de Batalla
case 207:
naves[i].consumption=500;
naves[i].speed=31000;
naves[i].capacity=1500;
naves[i].maxship = naves[i].ship;
break;
// Colonizador
case 208:
naves[i].consumption=1000;
naves[i].speed=7500;
naves[i].capacity=7500;
naves[i].maxship = naves[i].ship;
break;
// Reciclador
case 209:
naves[i].consumption=300;
naves[i].speed=4400;
naves[i].capacity=20000;
naves[i].maxship = naves[i].ship;
break;
// Sonda
case 210:
naves[i].consumption=1;
naves[i].speed=220000000;
naves[i].capacity=5;
naves[i].maxship = naves[i].ship;
break;
// Bombardero
case 211:
naves[i].consumption=1000;
naves[i].speed=12000;
naves[i].capacity=500;
naves[i].maxship = naves[i].ship;
break;
//
case 212:
naves[i].consumption=1;
naves[i].speed=100000000;
naves[i].capacity=10000000;
naves[i].maxship = naves[i].ship;
break;
// Destructor
case 213:
naves[i].consumption=1000;
naves[i].speed=15500;
naves[i].capacity=2000;
naves[i].maxship = naves[i].ship;
break;
// EdM
case 214:
naves[i].consumption=1;
naves[i].speed=100;
naves[i].capacity=1000000;
naves[i].maxship = naves[i].ship;
break;
// Acorazado
case 215:
naves[i].consumption=250;
naves[i].speed=31000;
naves[i].capacity=750;
naves[i].maxship = naves[i].ship;
break;
default:
naves[i].id = 0;
naves[i].maxship = naves[i].ship = 0;
break;
}
}
}
//---------------------------------------------------------------------------
void __fastcall Tmain::ejecutarProgramaAntiSondeo(PAtaques a)
{
HINSTANCE HApp;
AnsiString params;
params = AnsiString("\"[")+AnsiString(a->gO)+AnsiString(":")+AnsiString(a->sO)+AnsiString(":")+AnsiString(a->pO)+AnsiString("].")+AnsiString(a->tO)+AnsiString("\"");
params+= AnsiString(" ");
params+= AnsiString("\"[")+AnsiString(a->gD)+AnsiString(":")+AnsiString(a->sD)+AnsiString(":")+AnsiString(a->pD)+AnsiString("].")+AnsiString(a->tD)+AnsiString("\"");
params+= AnsiString(" ");
params+= AnsiString(a->start);
params+= AnsiString(" ");
params+= AnsiString(a->t);
HApp = ShellExecute(this, // handle to parent window
NULL, // pointer to string that specifies operation to perform
(char*)(CFG_programSondeo.data()), // pointer to filename string
(char*)(params.data()), // pointer to string that specifies executable-file parameters
NULL, // pointer to string that specifies default directory
0 // whether file is shown when opened
);
}
//---------------------------------------------------------------------------
void __fastcall Tmain::PHPSESSIDKeyPress(TObject *Sender, char &Key)
{
// if ( Key==VK_RETURN && PHPSESSID->Text.Length()==32 )
oG_Cookie = PHPSESSID->Text;
}
//---------------------------------------------------------------------------
// BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -
// BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -
// BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -
// BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -
// BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -BORRAME -
int __fastcall Tmain::getGameServer(AnsiString *oG_server, AnsiString *oG_v)
{
lastRequest = lastRequest_getServer;
int error = -1;
AnsiString request;
AnsiString loginHost="ogame.com.es";
request ="GET http://"+loginHost+"/home.php HTTP/1.1\r\n";
request+="Host: "+loginHost+"\r\n";
request+="User-Agent: "+oG_userAgent+"\r\n";
request+="Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
request+="Accept-Language: es,es-ar;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
request+="Accept-Encoding: gzip,deflate\r\n";
request+="Accept-Charset: windows-1252,utf-8;q=0.7,*;q=0.7\r\n";
request+="Keep-Alive: 300\r\n";
request+="Connection: keep-alive\r\n\r\n";
TMemoryStream* out = new TMemoryStream();
error = HTTPdownloader->descargarHTML(loginHost.c_str(),request.c_str(),out);
if ( error!=-1 )
{
char *pos,buffer[255];
oG_Cookie=obtenerOGCookie();
out->Position=0;
error=-1;
pos=StrPos((char *)out->Memory,"ame=\"v\"");
if ( pos>0 )
{
pos=StrPos(pos,"value=\"");
StrLCopy(buffer,pos+7,1);
*oG_v=buffer;
}
pos=StrPos((char *)out->Memory, "name='universe'");
if ( pos>0 )
{
if ( oG_Universo>1 )
pos=StrPos((char *)out->Memory, AnsiString(AnsiString( (oG_Universo-1) )+". Universo").c_str() );
if ( pos>0 )
{
pos=StrPos(pos,"value=\"") + 7;
StrLCopy(buffer,pos, StrPos(pos+7,"\"") - pos );
*oG_server=buffer;
error = 0;
}
}
}
return error;
}