projetos e jogos abertos
 
 
Corram, os Scuds estão chegando
O processamento dos mísseis dos inimigos
 

Lá vem bombaaaaaa.... Precisamos definir o que acontece quando um Scud cai em território inimigo, ou seja, em uma de nossas bases. Já definimos que, aleatoriamente seriam provocados danos materiais, ou seja, recursos financeiros seria drenados para os devidos reparos.

O inimigo dispõe de duas classe de mísseis, os All Hussein e os All Abbas, sendo que esses últimos são mais poderosos. Além das classes, os mísseis são divididos em relação ao tipo de ogiva que possuem: ogivas explosivas e ogivas de gás tóxico.

Para piorar um pouco as coisas, os mísseis com ogivas explosivas, quando acertam o alvo, provocam ainda a perda de alguns dos nossos mísseis, que terão de ser repostos mais adiante.

Nas rotinas estão indicadas as áreas funcionais para que cada um possa, mais tarde, implementar outras alternativas de danos. Clique aqui e baixe o pacote zip com os fontes do jogo até esta etapa.

Daqui em diante fica com você... A estrutura do jogo e seu funcionamento foram detalhadas de modo a permitir que você escolha um acabamento mais apropriado ou ainda sofisticar o sistema como um todo.

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

SÉTIMA PARTE

Para desviar o processamento de um bombardeio, tivemos
que reescrever a procedure MoveMissil. Assim facilitamos
futuras implementações:

procedure MoveMissil;
label
  Quad1,Quad2,Quad3,Quad4,Quad5,Fim;
begin
  TelRad:= Form1.Radar.Canvas.Handle;
  {Repõe o conteúdo}
  SetPixel(TelRad,Mis[Qms,0],Mis[Qms,1],Mcr[Qms]);
  if Mis[Qms,5] < Mis[Qms,6] then goto Quad3;

Quad1:
  Mis[Qms,4]:= Mis[Qms,4]+Mis[Qms,6];
  if Mis[Qms,4] < Mis[Qms,5] then goto Quad2;
  Mis[Qms,4]:= Mis[Qms,4]-Mis[Qms,5];
  Mis[Qms,1]:= Mis[Qms,1]+Mis[Qms,8];
Quad2:
  if Tip[Qms,1] <> 0 then begin
    Tip[Qms,1]:= Tip[Qms,1] - 1;
    if Tip[Qms,1] = 0 then goto Quad5; end;
  Mis[Qms,0]:= Mis[Qms,0]+Mis[Qms,7];
  MCr[Qms]:= GetPixel(TelRad,Mis[Qms,0],Mis[Qms,1]);
  if ((Mis[Qms,1] < 81) and (AvRad1 <> 1000)) or
     ((Mis[Qms,1] > 80 ) and (Mis[Qms,1] < 162) and
     (AvRad2 <> 1000)) or ((Mis[Qms,1] > 161 ) and
     (Mis[Qms,1] < 243) and (AvRad3 <> 1000)) or
     ((Mis[Qms,1] > 242) and (AvRad4 <> 1000))
     then SetPixel(TelRad,Mis[Qms,0],Mis[Qms,1],Cms);
  if (Mis[Qms,7] = 1) and (Mis[Qms,0] <= Mis[Qms,2]) then
     goto Fim;
  if (Mis[Qms,7] = -1) and (Mis[Qms,0] >= Mis[Qms,2]) then
     goto Fim;
  {Missil atingiu o alvo}
  SetPixel(TelRad,Mis[Qms,0],Mis[Qms,1],Mcr[Qms]);
  {Desativa a trilha do míssil}
  AcertouAlvo;
  Mis[Qms,0]:= 0;
  goto Fim;
Quad3:
  Mis[Qms,4]:= Mis[Qms,4]+Mis[Qms,5];
  if Mis[Qms,4] < Mis[Qms,6] then goto Quad4;
  Mis[Qms,4]:= Mis[Qms,4]-Mis[Qms,6];
  Mis[Qms,0]:= Mis[Qms,0]+Mis[Qms,7];
Quad4:
  if Tip[Qms,1] <> 0 then begin
    Tip[Qms,1]:= Tip[Qms,1] - 1;
    if Tip[Qms,1] = 0 then goto Quad5; end;
  Mis[Qms,1]:= Mis[Qms,1]+Mis[Qms,8];
  {Salva o conteúdo da nova posição do míssil}
  MCr[Qms]:= GetPixel(TelRad,Mis[Qms,0],Mis[Qms,1]);
  {Mostra o míssil, se o AWAC estiver em voo}
  if ((Mis[Qms,1] < 81) and (AvRad1 <> 1000)) or
     ((Mis[Qms,1] > 80 ) and (Mis[Qms,1] < 162) and
     (AvRad2 <> 1000)) or((Mis[Qms,1] > 161 ) and
     (Mis[Qms,1] < 243) and (AvRad3 <> 1000)) or
     ((Mis[Qms,1] > 242) and (AvRad4 <> 1000))
     then SetPixel(TelRad,Mis[Qms,0],Mis[Qms,1],Cms);
  if (Mis[Qms,8] = 1) and (Mis[Qms,1] <= Mis[Qms,3]) then
     goto Fim;
  if (Mis[Qms,8] = -1) and (Mis[Qms,1] >= Mis[Qms,3]) then
     goto Fim;
Quad5:
  {Missil atingiu o alvo}
  SetPixel(TelRad,Mis[Qms,0],Mis[Qms,1],Mcr[Qms]);
  AcertouAlvo;
  {Desativa a trilha do míssil}
  Mis[Qms,0]:= 0;
Fim:
end;

Basicamente criamos chamadas para uma nova procedure,
a qual damos o nome de AcertouAlvo, já deixando
espaço para mais tarde escrever sobre os danos que
causaremos nas bases inimigas.   

procedure AcertouAlvo;
var
  Danos: integer;
begin
  {Foi um míssil Cruise}
  if Tip[Qms,0] = 2 then begin

  end;
  {Foi um míssil Tomahawk}
  if Tip[Qms,0] = 3 then begin

  end;
  {Foi um scud - caiu em uma das bases aliadas}
  if (Tip[Qms,0] > 3) and (Tip[Qms,0] < 8) then begin
    {Decide se vai causar danos ou se errou o alvo}
    if Random(10) > 6 then begin {Errou}
      {Manda o fax}
      SendFax('Scud atingiu '+NomeDaBase(Tip[Qms,2]),
              'porém não causou',
              'danos de grande valor.',
              '','','','');
    end else begin {Acertou}
      {Manda o fax descrevendo tipo e oviga do Scud}

      SendFax(NomeDaBase(Tip[Qms,2]) + ' foi atingida por',
              'um míssil Scud:',
              '',
              'Modelo: ' + copy(TipoDeScud(Tip[Qms,0]),1,11),
              'Ogiva '+ copy(TipoDeScud(Tip[Qms,0]),13,10),
              '','');
      {Calcula os prejuizos e danos à base}
      Danos:= (Tip[Qms,0] - 3) * 3;
      if TotDin > Danos then TotDin:= TotDin - Danos
      else TotDin:= 0; {Dinheiro gasto na reconstrução}
      MostraDin;
      {se ogiva explosiva, perde ainda alguns mísseis}
      if (Tip[Qms,0] = 4) or (Tip[Qms,0] = 6) then begin
        if ParBase[Tip[Qms,2]*2+1] > 3 then
          ParBase[Tip[Qms,2]*2+1]:= ParBase[Tip[Qms,2]*2+1]-3
        else begin
          ParBase[Tip[Qms,2]*2+0]:= 0;
          ParBase[Tip[Qms,2]*2+1]:= 0;
        end;
      end;
      {Mostra o estoque de mísseis da base atual}
      if Base-1 = Tip[Qms,2] then AtivarBase(Base);
    end;
  end;

end;

Complementamos com duas pequenas functions, uma para escrever
o nome da base aliada e outra para escrever o tipo de míssil
Scud.

function NomeDaBase (Indice: integer): string;
begin
  case Indice of
    0: NomeDaBase:= 'Haifa';
    1: NomeDaBase:= 'Telaviv';
    2: NomeDaBase:= 'Holon';
    3: NomeDaBase:= 'Riad';
    4: NomeDaBase:= 'Dharan';
  end;
end;

function TipoDeScud (Indice: integer): string;
begin
  case Indice of
    4: TipoDeScud:= 'All Hussein explosiva';
    5: TipoDeScud:= 'All Hussein de gás';
    6: TipoDeScud:= 'All Abbas   explosiva';
    7: TipoDeScud:= 'All Abbas   de gás';
  end;
end;

{---------- Fim do programa / comentário ----------}

  online