/*
   NAME: FIRE.C--
   INFO: Written by Midnight.
         Conversion to C-- (and a little palette messing) by SPHINX.
   DESCRIPTION: This program displays a fire like simulation on a
                VGA 320x200 256 colour screen.
   RUN FILE SIZE: 457 bytes.
*/

?use80386
?resize FALSE
?assumeDSSS TRUE

?include "VIDEO.H--"
?include "VGA.H--"
?include "RANDOM.H--"
?include "KEYCODES.H--"

byte palette[768];

// byte pic = FROM "c--.cut";

word F;
word LowLimit;


void SetCols ()
byte N;
{

/*
BX = 0;
do {
    SI = BX+BX+BX;
    palette[SI] = BL >> 2;
    palette[SI+1] = BL >> 3;
    palette[SI+2] = 0;
    BX++;
    } while( BX < 256 );
*/


palette[0]=0;
palette[1]=0;
palette[2]=0;
BX = 0;
do {
    DI = BX+BX+BX;

    AX = BX * 64 / 85;
    DL = AL;
    palette[DI+3] = DL;
    palette[DI+3+1] = 0;
    palette[DI+3+2] = 0;

    palette[DI+3+85+85+85] = 63;
    palette[DI+3+85+85+85+1] = DL;
    palette[DI+3+85+85+85+2] = 0;

    palette[DI+3+85+85+85+85+85+85] = 63;
    palette[DI+3+85+85+85+85+85+85+1] = 63;
    palette[DI+3+85+85+85+85+85+85+2] = DL;

    BX++;
    } while( BX < 85 );


SETVGAPALETTE( ,0,256,#palette);
}



void AddFire (word N)
{
loop(N)
    {
    AX = RAND()%10+1;
    SI = AX+AX;
    AX = RAND()%298 + 64010;
    DI = AX;
    AL = RAND()&127 + 128;
    loop(SI)
	{
	ESBYTE[DI] = AL;
	ESBYTE[DI+640] = AL;
	DI++;
	}
    }
}


void CopyAvg ()
{
DI = 1280;
do {
    BX = 2;
    do {
	AX = ESBYTE[DI+BX-2] +  ESBYTE[DI+BX+2] + ESBYTE[DI+BX] +
		  ESBYTE[DI+BX+640] / 4;
	AX = AX + ESBYTE[DI+BX-640] >> 1;
	IF( AL > 128 )
	    AL-=2;
	ELSE IF( AL > 3)
	    AL -=4;
	ELSE
	    AL = 0;

	AH = AL;
	ESWORD[DI+BX-1280] = AX;
	ESWORD[DI+BX-1280+320] = AX;
	BX += 2;
	} while( BX < 318 );
    DI += 640;
    } while( DI < 320*204 );
}



void main ()
{
@ SETVIDEOMODE(byte vid_320x200_256);

SetCols();

ES = 0xA000;

F = 0;
do {
    AddFire(F / 32 + 1);
    CopyAvg();
    IF( F < 512 )
	F++;
    LowLimit = F >> 2 + 128 >> 2;
//    IF( F % 80 == 0 )
//        overimage19(80,90,#pic,0);
    } while( BIOSKEYCHECK() == 0 );

do {BIOSREADKEY();
    } while( BIOSKEYCHECK() != 0 );

@ SETVIDEOMODE(byte vid_text80c);
}


/* end of FIRE.C-- */