Program fireworks (input,output);

USES CRT, GRAPH;

CONST
     rnum=8;

VAR
   rocket:ARRAY [1..8,1..13] OF REAL;
              {  rocket number, 1=x
                                2=y
                                3=af
                                4=uf
                                5=fuse
                                6=x2
                                7=y2
                                8=x3
                                9=y3
                               10=x4
                               11=y4
                               12=x5
                               13=y5}
   fall:ARRAY [1..164,1..38] OF REAL;
              {  rocket number, fallout number, same, 38=colour}
   loop,loop2,n,m:INTEGER;
   Gm,Gd:INTEGER;

procedure fire_rocket;
BEGIN
     n:=0;
     for loop:=1 to rnum do
     begin
          if (rocket[loop,2]=0) and (n=0) then
          begin
               n:=1;
               rocket[loop,1]:=random(600)+20;
               rocket[loop,2]:=480;
               rocket[loop,3]:=(random(4)+2)/3;
               if rocket[loop,1]>320 then
                  rocket[loop,3]:=rocket[loop,3]*-1;
               rocket[loop,4]:=(random(8)+17)/3;
               rocket[loop,5]:=130+random(20);
          end;
     end;
end;

procedure move_rocket;
BEGIN
     for loop:=1 to rnum do
     begin
          if rocket[loop,2]<>0 then
          begin
               rocket[loop,12]:=rocket[loop,10];
               rocket[loop,13]:=rocket[loop,11];
               rocket[loop,10]:=rocket[loop,8];
               rocket[loop,11]:=rocket[loop,9];
               rocket[loop,8]:=rocket[loop,6];
               rocket[loop,9]:=rocket[loop,7];
               rocket[loop,6]:=rocket[loop,1];
               rocket[loop,7]:=rocket[loop,2];
               rocket[loop,1]:=rocket[loop,1]+rocket[loop,3];
               rocket[loop,2]:=rocket[loop,2]-rocket[loop,4];
               rocket[loop,4]:=rocket[loop,4]-0.07;
               putpixel(round(rocket[loop,1]),
                        round(rocket[loop,2]),15);
               putpixel(round(rocket[loop,1]+1),
                        round(rocket[loop,2]),15);
               putpixel(round(rocket[loop,1]),
                        round(rocket[loop,2]+1),15);
               putpixel(round(rocket[loop,1]+1),
                        round(rocket[loop,2]+1),15);
               putpixel(round(rocket[loop,6]+1),
                        round(rocket[loop,7]),0);
               putpixel(round(rocket[loop,6]),
                        round(rocket[loop,7]+1),0);
               putpixel(round(rocket[loop,6]+1),
                        round(rocket[loop,7]+1),0);
               putpixel(round(rocket[loop,12]),
                        round(rocket[loop,13]),0);
          end;
     end;
end;

procedure check_fuse;
begin
for loop:=1 to rnum do
begin
 if rocket[loop,2]<>0 then
 begin
     rocket[loop,5]:=rocket[loop,5]-1;
     if rocket[loop,5]=0 then
     begin
         for loop2:=3 to 5 do
         begin
              putpixel(round(rocket[loop,loop2*2]),
                       round(rocket[loop,loop2*2+1]),0);
         end;
         putpixel(round(rocket[loop,1]),
                  round(rocket[loop,2]),0);
         putpixel(round(rocket[loop,1]+1),
                  round(rocket[loop,2]),0);
         putpixel(round(rocket[loop,1]),
                  round(rocket[loop,2]+1),0);
         putpixel(round(rocket[loop,1]+1),
                  round(rocket[loop,2]+1),0);
         n:=0;
         for loop2:=1 to 164 do
         begin
              if (fall[loop2,2]=0) and (n<8) then
              begin
                   n:=n+1;
                   fall[loop2,1]:=rocket[loop,1];
                   fall[loop2,2]:=rocket[loop,2];
                   fall[loop2,3]:=(random(4)-2)/3;
                   fall[loop2,4]:=(random(6)-1)/4;
                   fall[loop2,5]:=150;
                   fall[loop2,38]:=random(13)+1;
              end;
         end;
         rocket[loop,2]:=0;
     end;
 end;
end;
end;

procedure move_fallout;
BEGIN
     for loop:=1 to (rnum*8) do
     begin
          if fall[loop,2]<>0 then
          begin
               for loop2:=18 downto 4 do
               begin
                    fall[loop,loop2*2]:=fall[loop,loop2*2-2];
                    fall[loop,loop2*2+1]:=fall[loop,loop2*2-1];
               end;
               fall[loop,6]:=fall[loop,1];
               fall[loop,7]:=fall[loop,2];
               fall[loop,1]:=fall[loop,1]+fall[loop,3];
               fall[loop,2]:=fall[loop,2]-fall[loop,4];
               fall[loop,4]:=fall[loop,4]-0.02;
               fall[loop,5]:=fall[loop,5]-1;
               if fall[loop,5]>16 then
                   putpixel(round(fall[loop,1]),
                           round(fall[loop,2]),round(fall[loop,38]));
               putpixel(round(fall[loop,36]),
                        round(fall[loop,37]),0);
               if fall[loop,5]=0 then
                  fall[loop,2]:=0;
          end;
     end;
end;

BEGIN

     Gd := Detect;
     InitGraph(Gd, Gm,'');
     if GraphResult <> grOk then
          Halt(1);
     cleardevice;
     outtextxy(0,0,'Adam Hatherly');
     randomize;
     repeat
           n:=random(5);
           if n=1 then fire_rocket;
           move_rocket;
           check_fuse;
           move_fallout;
           delay(8);
     until keypressed;

END.

syntax highlighted by Code2HTML, v. 0.8.11