(****************************************************************************

Hopefully you got this from SWAG :)

Anyways, this is my little fire routine that I wrote.  It didn't take me

very long and is far from being optimized... so it's kind of slow....

Runs fine on my pentium 100mhz though!!! :)



This code was written by Phire of Patd Programming.  Check out my homepage:

http://www.tripod.com/~rflynn  or email: rflynn@shelby.net

Please feel free to improve my code ;)

(****************************************************************************)



USES CRT, DOS;



CONST

     YMAX = 60;
     YMIN = 0;
     XMAX = 317;
     XMIN = 2;
     maxc = 1;

VAR

   X,Y,Z  : WORD;
   TOTAL  : WORD;
   A,B,C  : LONGINT;
   I      : WORD;
   SCREEN : ARRAY[1..64000] OF BYTE;
   ST, ET : REAL;
   CYCLES : LONGINT;

PROCEDURE CT(VAR MOO:REAL);
VAR
   H,M,S,MS : WORD;

BEGIN
     GETTIME(H,M,S,MS);
     MOO:=H*3600+M*60+S+MS DIV 100;
END;

procedure setcolor(color,r,g,b : byte);
begin
     port[$3c8]:=color;
     port[$3c9]:=r;
     port[$3c9]:=g;
     port[$3c9]:=b;
end;
BEGIN
     RANDOMIZE;
     ASM MOV AX, 13H; INT 10H; END;
     asm
        mov dx, 03d4h
        mov al, 9
        out dx, al
        inc dx
        and al, 0e0h
        or  al, 7
        out dx, al
     end;
  for i:=0 to 63 do setcolor(i,0,0,0);
  for i:=0 to 63 do setcolor(64+i,0,0,0);
  for i:=0 to 63 do setcolor(128+i,i,i shr 1,0);
  for i:=0 to 63 do setcolor(192+i,63,32+i shr 1,0);

  FILLCHAR(SCREEN, 64000, 0);

     WHILE KEYPRESSED DO READKEY;
     CT(ST);
     CYCLES:=0;
     REPEAT
           MOVE(SCREEN, MEM[$A000:0], 64000);
           FOR Y:=YMAX DOWNTO YMIN DO
           BEGIN
                IF Y=YMAX THEN
                   BEGIN
                        FOR Z:=XMIN TO XMAX DO
                        BEGIN
                             CASE RANDOM(10) OF
                                  0,2,4 : SCREEN[Y*320+Z]:=0;
                                  1,3,5,6,7,8,9 : SCREEN[Y*320+Z]:=255;
                             END;
                        END;
                   END;

           FOR X:=XMIN TO XMAX DO
                   BEGIN
                        IF Y<YMAX THEN
                           BEGIN
                                INC(CYCLES);
                                IF CYCLES=MAXC+1 THEN CYCLES:=0;
                                IF CYCLES=0 THEN
                                BEGIN
                                TOTAL:=0;
                                SCREEN[Y*320+X]:=SCREEN[(Y+1)*320+X];
                                TOTAL:=TOTAL+SCREEN[(Y+1)*320+(X-1)];
                                TOTAL:=TOTAL+SCREEN[(Y+1)*320+(X)];
                                TOTAL:=TOTAL+SCREEN[(Y+1)*320+(X+1)];
                                TOTAL:=TOTAL+SCREEN[(Y)*320+(X-1)];
                                TOTAL:=TOTAL+SCREEN[(Y)*320+(X)];
                                TOTAL:=TOTAL+SCREEN[(Y)*320+(X+1)];
                                A:=TOTAL DIV 6;
                                END;

                                IF A>255 THEN A:=255;
                                SCREEN[Y*320+X]:=A;
                                SCREEN[Y*320+(X-1)]:=A;
                                SCREEN[Y*320+(X+1)]:=A;
                           END;
                   END;
           END;
     UNTIL (KEYPRESSED);
     asm
        mov ax, 3h
        int 10h
     end;
END.