/* fire.c (comment5.c) - Don Yang (uguu.org) DOS only, runs under windowed DOS box but fullscreen highly recommended. Compiles with MSC 6.0 or TC 3.0 11/29/98: main */ /* Includes */ #include #include /* Macros */ #define Rnd() \ (RndTable[RndIndex = (RndIndex + 1) & 0x7fff]) /* Globals (all data are global) */ int Palette[] = { 0x0400, 0x02b0, 0x0ab0, 0x0ab1, 0x2ab2, 0x2bb0, 0x3fb0, 0x2fb1, 0x3fb1, 0x2fb2, 0x3fb2, 0x7fb0, 0x7fb1, 0x7fb2, 0x4fdb, 0x4fdb, 0x4fdb}; int *AltPalette; int OldImage[80 * 25], Image[80 * 25], Fire[80 * 27 + 2]; int shift = 0, dir = 1, skip = 0, spark1 = 20, spark2 = 60; unsigned i, RndIndex; int _far *Screen = (int _far *)0xb8000000L; char *Text; unsigned char RndTable[0x8000]; /* Main */ void cdecl main(void) { /* Save image */ for(i = 0; i < 80 * 25; i++) OldImage[i] = Screen[i]; /* Generate random numbers */ for(i = 0; i < 0x8000; i++) RndTable[i] = (unsigned char)(rand() & 0x3f); /* Initialize dithering palette */ AltPalette = Palette + 1; Text = (char *)&Image[12 * 80 + 32]; /* Loop until keypress */ while( !kbhit() ) { /* Burn */ /* Generate random pixels (heat source) */ for(i = 0; i < 162; i++) Fire[80 * 25 + i] = Rnd() + shift; /* Add sparks */ Fire[80 * 25 + spark1] = 255; Fire[80 * 25 + spark2] = 0; if( Rnd() & 1 ) spark1++; else spark1 += 79; if( Rnd() & 1 ) spark2++; else spark2 += 79; spark1 %= 80; spark2 %= 80; skip = (skip + 1) % 4; if( !skip ) { shift += dir; if( !shift || shift == 0xc0 ) dir = -dir; } /* Update pixels */ for(i = 0; i < 80 * 25; i++) { Fire[i] = (Fire[i + 80] * 16 + Fire[i + 160] * 14 + Fire[i + 161] + Fire[i + 162]) >> 5; } /* Render */ for(i = 0; i < 80 * 25; i++) { Image[i] = (Fire[i] & 0xf > Rnd() & 0xf) ? Palette[Fire[i] >> 4] : AltPalette[Fire[i] >> 4]; } Text[0] = 'D'; Text[4] = 'O'; Text[8] = 'N'; Text[16] = 'Y'; Text[20] = 'A'; Text[24] = 'N'; Text[28] = 'G'; /* Blit */ /* Wait for vertical synchronization */ while( inp(0x3da) & 8 ); while( !(inp(0x3da) & 8) ); for(i = 0; i < 80 * 25; i++) Screen[i] = Image[i]; } /* Clear keystroke */ if( !getch() ) getch(); /* Restore screen */ for(i = 0; i < 80 * 25; i++) Screen[i] = OldImage[i]; } /* main() */