projetos e jogos abertos
 
 
Abastecendo as bases
Cada base recebe um tipo especial de míssil
 

Nesta página iremos montar nossa "loja" de mísseis, ou seja, os controles que permitem equipar as bases aliadas com um dos três diferentes tipos de mísseis. Mas lembre-se que, para trocar de tipo de míssil usado numa base, ela não deverá possuir nenhuma peça. Gaste todo o arsenal dela e só então mude de tipo, adquirindo o novo modelo.

Cada missíl tem um preço específico e os melhores, os Cruise, são os mais caros (mas também são os mais precisos). Eles são usados para atacar as bases secretas de lançamento dos Scuds. Os Patriots são os mais baratos, mas a pontaria deles as vezes falha.

Não tem nada de misterioso no sistema de aquisição dos mísseis e basta uma leitura atenta da listagem para entender como tudo foi feito. Tomamos o cuidado de não permitir a compra de mísseis quando não existem recursos financeiros disponíveis. Assim não existe o perigo de endividamento, déficit orçamentário, etc. Isso fica para um outro jogo.

O segundo ponto que implementaremos nesta edição trata da localização das bases secretas dos Scuds e dos seus respectivos bombardeios. Digamos que esta é a parte que controla a estratégia de guerra do inimigo. Compreendendo bem como ela funciona, você poderá promover variações para tornar o jogo mais fácil ou mais difícil. Ou mesmo incorporar alguma inteligência artificial, na decisão de ataque. Como está, a decisão é aleatória, obedecendo apenas o horário que elas aconteciam (depois das 9 horas da noite).

Relembrando duas das matrizes dos mísseis (de 0 a 9 são os Scuds):

     Mis[Qms,0]:= X    Coordenadas X,Y do ponto
     Mis[Qms,1]:= Y
     Mis[Qms,2]:= X2   Coordenadas X2,Y2 do alvo
     Mis[Qms,3]:= Y2
     Mis[Qms,4]:= C    Contador
     Mis[Qms,5]:= L    Largura
     Mis[Qms,6]:= S    Altura
     Mis[Qms,7]:= Mx   Flags (+1) ou (-1)
     Mis[Qms,8]:= My

     Tip[Qms,0]:= 0   Tipo - 1= patriot
                             2= cruise
                             3= tomahawk
                             4= scud All Hussein explosivo
                             5= scud All Hussein gás
                             6= scud All Abbas explosivo
                             7= scud All Abbas gás
     Tip[Qms,1]:= 0   Se patriot, alcance do míssil em pontos
     Tip[Qms,2]:= 0   Se 255, patriot sem rumo/0 a 9 scud alvo
                      Se scud (0 a 4) base alvo

O controle de lançamento dos Scuds fica no TTimer do relógio. Chegado o momento, e por alguns minutos de cada hora, as decisões de lançamento são tomadas.

Carregue o pacote no telefone mais próximo e experimente como está o jogo até este ponto. Ainda não temos o controle de danos, nem o ataque às bases inimigas secretas. Clique aqui e baixe o pacote zip com os fontes do jogo até esta etapa.

{---------- Início do programa / comentário --------------}

QUINTA PARTE

Crie 3 TSpeedButton, com as seguintes características:

Caption = Patriot
Glyph = (carregue o arquivo PAT.BMP)
Height = 16
Left = 495
Name = Patriot
Top = 175
Width = 126

Caption = Tomahawk
Glyph = (carregue o arquivo TOM.BMP)
Height = 16
Left = 495
Name = Tomahawk
Top = 190
Width = 126

Caption = Cruise
Glyph = (carregue o arquivo CRU.BMP)
Height = 16
Left = 495
Name = Cruise
Top = 205
Width = 126

Os eventos OnClick correspondentes são:

procedure TForm1.PatriotClick(Sender: TObject);
begin
   if ((ParBase[(Base-1)*2] = 0) or
      (ParBase[(Base-1)*2] = 1)) and
      (TotDin > 0) then begin
      ParBase[(Base-1)*2]:= 1;
      if ParBase[Base*2-1] < 253 then
         ParBase[Base*2-1]:= ParBase[Base*2-1]+3;
      dec(TotDin); MostraDin; AtivarBase(Base);
      end;
end;

procedure TForm1.TomahawkClick(Sender: TObject);
begin
   if ((ParBase[(Base-1)*2] = 0) or
      (ParBase[(Base-1)*2] = 3)) and
      (TotDin > 0) then begin
      ParBase[(Base-1)*2]:= 3;
      if ParBase[Base*2-1] < 254 then
         ParBase[Base*2-1]:= ParBase[Base*2-1]+2;
      dec(TotDin); MostraDin; AtivarBase(Base);
      end;
end;

procedure TForm1.CruiseClick(Sender: TObject);
begin
   if ((ParBase[(Base-1)*2] = 0) or
      (ParBase[(Base-1)*2] = 2)) and
      (TotDin > 0) then begin
      ParBase[(Base-1)*2]:= 2;
      if ParBase[Base*2-1] < 255 then
         ParBase[Base*2-1]:= ParBase[Base*2-1]+1;
      dec(TotDin); MostraDin; AtivarBase(Base);
      end;
end;

Não esqueça de colocar os eventos OnMouseDown
apontando para o evento FimMouseDown, para
produzir o "click" ao ser pressionado o botão
correspondente.

Vamos criar um registro para os Scuds. Duas variáveis
globais que serão inicializadas na ativação do FORM1:

   Lancados: integer;     {Scuds que foram lançados}
   Abatidos: integer;     {Scuds abatidos}

procedure TForm1.FormActivate(Sender: TObject);
begin
   Lancados:= 0; Abatidos:= 0;
   MostraDin;
end;

No controle de voo dos mísseis fazemos a atualização:

procedure Teleguiado;
   ...
      ...
         {Acertou.... VIVA!!!!!}
         inc(Abatidos);
         TelRad:= Form1.Radar.Canvas.Handle;
         ...

A seguir temos que definir as novas constantes: duas
matrizes: uma para as coordenadas da base inimiga e
outra de status da base, ou seja, quantos mísseis tem
e se está operante.

const
   BasInim: array[0..23] of word =
    (326,22,448,131,163,57,172,61,225,82,276,90,322,
    122,354,126,351,87,296,63,400,68,402,115);
   BasOk: array[0..11] of byte =
    (200,200,55,55,55,55,55,55,55,55,55,55);

Troque toca a procedure que controla o relógio e
consequentemente os lançamentos dos Scuds. Por
enquanto só será possível testar os patriots para
defender as bases.

{--- Controle do relógio do jogo ---}
procedure TForm1.Timer1Timer(Sender: TObject);
label
   Fim;
var
   Tmp: word;
begin
   if Base <> 0 then begin
      {Se as bases estiverem ativas...}
      inc(Minuto);
      if (Minuto = 15) or (Minuto = 45) then MaisDinheiro;
      {Libera 2 sacolas de dinheiro a cada hora do jogo}
      if Minuto = 60 then begin
         {Passou uma hora?}
         Minuto:= 0; inc(Hora); if Hora < 10 then
            Relog.Caption:= '0'+IntToStr(Hora) else
            Relog.Caption:= IntToStr(Hora);
         if Hora = 24 then begin
         {Passou um dia?}
            Hora:= 0; inc(Dia); Calend.Caption:= IntToStr(Dia);
            if ((Dia = 30) and ((Mes mod 2) = 0)) or
               ((Dia = 31) and ((Mes mod 2) = 1)) then begin
               Dia:= 1; inc(Mes); NomMes.Caption:= Meses[Mes];
               {Passou um mes?}
               end;
            end;
         end;
         {Disparo dos scuds / só depois das 9h da noite}
         if (Hora > 20) and
            ((Minuto > 20) and (Minuto < 30)) and
            (Random(10) < 2) then begin
               {Ok, lançar um scud}
               Tip[Qms,0]:= Random(4)+4; {Tipo de Scud}
               Tmp:= Random(13);         {De qual base?}
               if BasOk[Tmp] = 0 then goto Fim; {Tem míssil?}
               BasOk[Tmp]:= BasOk[Tmp] - 1;
               Tmp:= Tmp * 2;
               for Qms:= 0 to 9 do begin {Procura míssil vago}
               if Mis[Qms,0] = 0 then begin
                  Cms:= clRed;    {Cor do míssil}
                  X1:= BasInim[Tmp];
                  Y1:= BasInim[Tmp+1];
                  Tmp:= Random(5);
                  Tip[Qms,2]:= Tmp;    {Base alvo}
                  Tmp:= Tmp * 2;
                  X2:= BasCord[Tmp];
                  Y2:= BasCord[Tmp+1];
                  PreparaMissil;
                  inc(Lancados);
                  goto Fim;

                  end;
               end;
            Fim:
         end;
      end;
end;
{------------ Fim do programa / comentário ---------------}

  online