diff --git a/zsnes/src/makefile.dos b/zsnes/src/makefile.dos index 7d3b340f..e7c0bd7a 100644 --- a/zsnes/src/makefile.dos +++ b/zsnes/src/makefile.dos @@ -59,7 +59,9 @@ MAINOBJ=cfgload.o endmem.o fixsin.o init.o ui.o vcache.o water.o smoke.o OBJS=${CHIPSOBJ} ${CPUOBJ} ${DOSOBJ} ${GUIOBJ} ${VIDEOBJ} ${PREOBJ} ${MAINOBJ} ${ZIPOBJ} LIBS=-lz -lm -lpng -CFLAGS=-O2 -Wall -Wno-unused -D__MSDOS__ +#CFLAGS=-O2 -Wall -Wno-unused -D__MSDOS__ +CFLAGS=-O3 -march=i486 -mpentium -fno-rtti -fno-exceptions -ffast-math\ +-fomit-frame-pointer -fno-unroll-loops -Wall -Wno-unused -D__MSDOS__ ASM=nasm ASMFLAGS=-f coff -D__MSDOS__ CC=gcc diff --git a/zsnes/src/smoke.c b/zsnes/src/smoke.c index 687f49ce..fb9f135d 100644 --- a/zsnes/src/smoke.c +++ b/zsnes/src/smoke.c @@ -5,20 +5,27 @@ #else # include # include +# include #endif -// Ripped from an Allegro example (exflame.c). :P -// Should be fire, but looks more like smoke in ZSNES. +/* -#define MIN(x,y) \ +Ripped from an Allegro example (exflame.c). :) + +Should be fire, but looks more like smoke in ZSNES. + +*/ + + +#define MIN(x, y) \ (((x) < (y)) ? (x) : (y)) #define ABS(x) \ (((x) >= 0) ? (x) : ( - (x))) -#define FIRE_HOTSPOTS 80 +#define FIRE_HOTSPOTS 80 static int fire_hotspot [FIRE_HOTSPOTS]; @@ -26,9 +33,9 @@ static int fire_hotspot [FIRE_HOTSPOTS]; extern char * vidbuffer; -#define SCRW 288 +#define SCRW 288 -#define SCRH 224 +#define SCRH 224 static unsigned char fire_line [SCRW]; @@ -39,11 +46,13 @@ static unsigned char fire_buffer [SCRW * SCRH]; static int fire_init_flag; -static void draw_bottom_line_of_fire (void) +static __inline__ void draw_bottom_line_of_fire (void) { - int count, count2; + int count, count2; + + + memset ((& fire_line), 0, SCRW); - memset (&fire_line, 0, SCRW); for (count = 0; count < FIRE_HOTSPOTS; count ++) { @@ -53,13 +62,15 @@ static void draw_bottom_line_of_fire (void) if ((count2 >= 0) && (count2 < SCRW)) { fire_line [count2] = - MIN((fire_line [count2] + 20) - - ABS(fire_hotspot [count] - count2), 256); + MIN ((fire_line [count2] + 20) - + ABS (fire_hotspot [count] - count2), 256); } } + fire_hotspot [count] += ((rand () & 7) - 3); + if (fire_hotspot [count] < 0) { fire_hotspot [count] += SCRW; @@ -70,74 +81,91 @@ static void draw_bottom_line_of_fire (void) } } + for (count = 0; count < SCRW; count ++) { fire_buffer [((SCRH - 1) * - (SCRW)) + count] = fire_line [count]; + (SCRW)) + count] = fire_line [count]; } } -static void InitFire (void) +static __inline__ void init_fire (void) { int x, y, pixel, count; + + srand (time (0)); + + for (count = 0; count < FIRE_HOTSPOTS; count ++) { fire_hotspot [count] = (rand () % SCRW); } + for (count = 0; count < SCRH; count ++) { draw_bottom_line_of_fire (); + for (y = 0; y < (SCRH - 1); y ++) { for (x = 0; x < SCRW; x ++) { pixel = fire_buffer [((y + 1) * SCRW) + x]; + if (pixel > 0) { pixel --; } - + + fire_buffer [(y * SCRW) + x] = pixel; } } } + fire_init_flag = 1; } -// void DrawFire (void) +/* void DrawFire (void) */ + void DrawSmoke (void) { int x, y, pixel, pixel2; - if (fire_init_flag != 1) + + if (! fire_init_flag) { - InitFire (); + init_fire (); } + draw_bottom_line_of_fire (); + for (y = 0; y < (SCRH - 1); y ++) { for (x = 0; x < SCRW; x ++) { pixel = fire_buffer [((y + 1) * SCRW) + x]; + if (pixel > 0) { pixel --; } + fire_buffer [(y * SCRW) + x] = pixel; } } + for (y = 0; y < SCRH; y ++) { for (x = 0; x < SCRW; x ++) @@ -146,6 +174,7 @@ void DrawSmoke (void) pixel2 = (fire_buffer [(y * SCRW) + x] / 8); + if (pixel2 > pixel) { vidbuffer [(y * SCRW) + x] = pixel2;