|
|
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 ----------}
|
|
|