|
|
@@ -0,0 +1,260 @@ |
|
|
|
/* |
|
|
|
* cacafire fire demo using libcaca |
|
|
|
* Copyright (c) 2003 Sam Hocevar <sam@zoy.org> |
|
|
|
* Jan Hubicka (hubicka@freesoft.cz) |
|
|
|
* Thomas A. K. Kjaer (takjaer@daimi.aau.dk) |
|
|
|
* Tim Newsome (nuisance@cmu.edu) |
|
|
|
* Kamil Toman (toman@artax.karlin.mff.cuni.cz) |
|
|
|
* All Rights Reserved |
|
|
|
* |
|
|
|
* $Id$ |
|
|
|
* |
|
|
|
* This program is free software; you can redistribute it and/or |
|
|
|
* modify it under the terms of the GNU Lesser General Public |
|
|
|
* License as published by the Free Software Foundation; either |
|
|
|
* version 2 of the License, or (at your option) any later version. |
|
|
|
* |
|
|
|
* This program is distributed in the hope that it will be useful, |
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
|
|
* Lesser General Public License for more details. |
|
|
|
* |
|
|
|
* You should have received a copy of the GNU Lesser General Public |
|
|
|
* License along with this program; if not, write to the Free Software |
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA |
|
|
|
* 02111-1307 USA |
|
|
|
*/ |
|
|
|
|
|
|
|
#ifdef LIBCACA |
|
|
|
#include "config.h" |
|
|
|
#include <stdio.h> |
|
|
|
#include <stdlib.h> |
|
|
|
#include "caca.h" |
|
|
|
|
|
|
|
#define XSIZ (caca_get_width() * 2) |
|
|
|
#define YSIZ (caca_get_height() * 2 - 4) |
|
|
|
#else |
|
|
|
#include <stdio.h> |
|
|
|
#include "aalib.h" |
|
|
|
|
|
|
|
#define XSIZ aa_imgwidth(context) |
|
|
|
#define YSIZ (aa_imgheight(context)-4) |
|
|
|
#endif |
|
|
|
#define MAXTABLE (256*5) |
|
|
|
#ifdef LIBCACA |
|
|
|
static struct caca_bitmap *caca_bitmap; |
|
|
|
static char *bitmap; |
|
|
|
#else |
|
|
|
static aa_context *context; |
|
|
|
static aa_renderparams *params; |
|
|
|
static aa_palette palette; |
|
|
|
#endif |
|
|
|
static unsigned int table[MAXTABLE]; |
|
|
|
#ifdef LIBCACA |
|
|
|
const static int pal[] = |
|
|
|
#else |
|
|
|
__AA_CONST static int pal[] = |
|
|
|
#endif |
|
|
|
{ |
|
|
|
0, 0, 0, 0, 0, 6, 0, 0, 6, 0, 0, 7, 0, 0, 8, 0, 0, 8, 0, 0, 9, 0, 0, 10, |
|
|
|
2, 0, 10, 4, 0, 9, 6, 0, 9, 8, 0, 8, 10, 0, 7, 12, 0, 7, 14, 0, 6, 16, 0, 5, |
|
|
|
18, 0, 5, 20, 0, 4, 22, 0, 4, 24, 0, 3, 26, 0, 2, 28, 0, 2, 30, 0, 1, 32, 0, 0, |
|
|
|
32, 0, 0, 33, 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 0, 36, 0, 0, 37, 0, 0, 38, 0, 0, |
|
|
|
39, 0, 0, 40, 0, 0, 40, 0, 0, 41, 0, 0, 42, 0, 0, 43, 0, 0, 44, 0, 0, 45, 0, 0, |
|
|
|
46, 1, 0, 47, 1, 0, 48, 2, 0, 49, 2, 0, 50, 3, 0, 51, 3, 0, 52, 4, 0, 53, 4, 0, |
|
|
|
54, 5, 0, 55, 5, 0, 56, 6, 0, 57, 6, 0, 58, 7, 0, 59, 7, 0, 60, 8, 0, 61, 8, 0, |
|
|
|
63, 9, 0, 63, 9, 0, 63, 10, 0, 63, 10, 0, 63, 11, 0, 63, 11, 0, 63, 12, 0, 63, 12, 0, |
|
|
|
63, 13, 0, 63, 13, 0, 63, 14, 0, 63, 14, 0, 63, 15, 0, 63, 15, 0, 63, 16, 0, 63, 16, 0, |
|
|
|
63, 17, 0, 63, 17, 0, 63, 18, 0, 63, 18, 0, 63, 19, 0, 63, 19, 0, 63, 20, 0, 63, 20, 0, |
|
|
|
63, 21, 0, 63, 21, 0, 63, 22, 0, 63, 22, 0, 63, 23, 0, 63, 24, 0, 63, 24, 0, 63, 25, 0, |
|
|
|
63, 25, 0, 63, 26, 0, 63, 26, 0, 63, 27, 0, 63, 27, 0, 63, 28, 0, 63, 28, 0, 63, 29, 0, |
|
|
|
63, 29, 0, 63, 30, 0, 63, 30, 0, 63, 31, 0, 63, 31, 0, 63, 32, 0, 63, 32, 0, 63, 33, 0, |
|
|
|
63, 33, 0, 63, 34, 0, 63, 34, 0, 63, 35, 0, 63, 35, 0, 63, 36, 0, 63, 36, 0, 63, 37, 0, |
|
|
|
63, 38, 0, 63, 38, 0, 63, 39, 0, 63, 39, 0, 63, 40, 0, 63, 40, 0, 63, 41, 0, 63, 41, 0, |
|
|
|
63, 42, 0, 63, 42, 0, 63, 43, 0, 63, 43, 0, 63, 44, 0, 63, 44, 0, 63, 45, 0, 63, 45, 0, |
|
|
|
63, 46, 0, 63, 46, 0, 63, 47, 0, 63, 47, 0, 63, 48, 0, 63, 48, 0, 63, 49, 0, 63, 49, 0, |
|
|
|
63, 50, 0, 63, 50, 0, 63, 51, 0, 63, 52, 0, 63, 52, 0, 63, 52, 0, 63, 52, 0, 63, 52, 0, |
|
|
|
63, 53, 0, 63, 53, 0, 63, 53, 0, 63, 53, 0, 63, 54, 0, 63, 54, 0, 63, 54, 0, 63, 54, 0, |
|
|
|
63, 54, 0, 63, 55, 0, 63, 55, 0, 63, 55, 0, 63, 55, 0, 63, 56, 0, 63, 56, 0, 63, 56, 0, |
|
|
|
63, 56, 0, 63, 57, 0, 63, 57, 0, 63, 57, 0, 63, 57, 0, 63, 57, 0, 63, 58, 0, 63, 58, 0, |
|
|
|
63, 58, 0, 63, 58, 0, 63, 59, 0, 63, 59, 0, 63, 59, 0, 63, 59, 0, 63, 60, 0, 63, 60, 0, |
|
|
|
63, 60, 0, 63, 60, 0, 63, 60, 0, 63, 61, 0, 63, 61, 0, 63, 61, 0, 63, 61, 0, 63, 62, 0, |
|
|
|
63, 62, 0, 63, 62, 0, 63, 62, 0, 63, 63, 0, 63, 63, 1, 63, 63, 2, 63, 63, 3, 63, 63, 4, |
|
|
|
63, 63, 5, 63, 63, 6, 63, 63, 7, 63, 63, 8, 63, 63, 9, 63, 63, 10, 63, 63, 10, 63, 63, 11, |
|
|
|
63, 63, 12, 63, 63, 13, 63, 63, 14, 63, 63, 15, 63, 63, 16, 63, 63, 17, 63, 63, 18, 63, 63, 19, |
|
|
|
63, 63, 20, 63, 63, 21, 63, 63, 21, 63, 63, 22, 63, 63, 23, 63, 63, 24, 63, 63, 25, 63, 63, 26, |
|
|
|
63, 63, 27, 63, 63, 28, 63, 63, 29, 63, 63, 30, 63, 63, 31, 63, 63, 31, 63, 63, 32, 63, 63, 33, |
|
|
|
63, 63, 34, 63, 63, 35, 63, 63, 36, 63, 63, 37, 63, 63, 38, 63, 63, 39, 63, 63, 40, 63, 63, 41, |
|
|
|
63, 63, 42, 63, 63, 42, 63, 63, 43, 63, 63, 44, 63, 63, 45, 63, 63, 46, 63, 63, 47, 63, 63, 48, |
|
|
|
63, 63, 49, 63, 63, 50, 63, 63, 51, 63, 63, 52, 63, 63, 52, 63, 63, 53, 63, 63, 54, 63, 63, 55, |
|
|
|
63, 63, 56, 63, 63, 57, 63, 63, 58, 63, 63, 59, 63, 63, 60, 63, 63, 61, 63, 63, 62, 63, 63, 63}; |
|
|
|
|
|
|
|
|
|
|
|
static void |
|
|
|
initialize (void) |
|
|
|
{ |
|
|
|
int i; |
|
|
|
#ifdef LIBCACA |
|
|
|
int r[256], g[256], b[256]; |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifdef LIBCACA |
|
|
|
if (caca_init()) |
|
|
|
{ |
|
|
|
printf ("Failed to initialize libcaca\n"); |
|
|
|
exit (1); |
|
|
|
} |
|
|
|
#else |
|
|
|
context = aa_autoinit (&aa_defparams); |
|
|
|
if (context == NULL) |
|
|
|
{ |
|
|
|
printf ("Failed to initialize aalib\n"); |
|
|
|
exit (1); |
|
|
|
} |
|
|
|
aa_autoinitkbd (context, 0); |
|
|
|
params = aa_getrenderparams (); |
|
|
|
#endif |
|
|
|
|
|
|
|
for (i = 0; i < 256; i++) |
|
|
|
#ifdef LIBCACA |
|
|
|
{ |
|
|
|
r[i] = pal[i * 3] * 64; |
|
|
|
g[i] = pal[i * 3 + 1] * 64; |
|
|
|
b[i] = pal[i * 3 + 2] * 64; |
|
|
|
} |
|
|
|
#else |
|
|
|
aa_setpalette (palette, i, pal[i * 3] * 4, |
|
|
|
pal[i * 3 + 1] * 4, pal[i * 3 + 2] * 4); |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifdef LIBCACA |
|
|
|
caca_bitmap = caca_create_bitmap(8, XSIZ, YSIZ - 4, XSIZ, 0, 0, 0); |
|
|
|
caca_set_bitmap_palette(caca_bitmap, r, g, b); |
|
|
|
bitmap = malloc(XSIZ * YSIZ * sizeof(char)); |
|
|
|
caca_set_dithering(CACA_DITHERING_ORDERED8); |
|
|
|
#else |
|
|
|
aa_hidecursor (context); |
|
|
|
#endif |
|
|
|
fprintf(stderr, "%i %i\n", XSIZ, YSIZ); |
|
|
|
} |
|
|
|
static void |
|
|
|
uninitialize (void) |
|
|
|
{ |
|
|
|
#ifdef LIBCACA |
|
|
|
caca_end(); |
|
|
|
#else |
|
|
|
aa_close (context); |
|
|
|
#endif |
|
|
|
exit (0); |
|
|
|
} |
|
|
|
static void |
|
|
|
gentable (void) |
|
|
|
{ |
|
|
|
unsigned int i, p2; |
|
|
|
unsigned int minus = 800 / YSIZ; |
|
|
|
if (minus == 0) |
|
|
|
minus = 1; |
|
|
|
for (i = 0; i < MAXTABLE; i++) |
|
|
|
{ |
|
|
|
if (i > minus) |
|
|
|
{ |
|
|
|
p2 = (i - minus) / 5; |
|
|
|
table[i] = p2; |
|
|
|
} |
|
|
|
else |
|
|
|
table[i] = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#define MA 5 |
|
|
|
static void |
|
|
|
firemain (void) |
|
|
|
{ |
|
|
|
register unsigned int i; |
|
|
|
unsigned char *p; |
|
|
|
#ifndef LIBCACA |
|
|
|
char *bitmap = aa_image (context); |
|
|
|
#endif |
|
|
|
i = 0; |
|
|
|
#define END (bitmap + XSIZ * YSIZ) |
|
|
|
for (p = bitmap; p <= (unsigned char *) (END); p += 1) |
|
|
|
{ |
|
|
|
*p = table[(*(p + XSIZ - 1) + *(p + XSIZ + 1) + *(p + XSIZ)) + |
|
|
|
(*(p + 2 * XSIZ - 1) + *(p + 2 * XSIZ + 1))]; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#define min(x,y) ((x)<(y)?(x):(y)) |
|
|
|
static void |
|
|
|
drawfire (void) |
|
|
|
{ |
|
|
|
unsigned int i, last1, i1, i2; |
|
|
|
static int loop = 0, sloop = 0; |
|
|
|
static unsigned int height = 0; |
|
|
|
register unsigned char *p; |
|
|
|
#ifndef LIBCACA |
|
|
|
char *bitmap = aa_image (context); |
|
|
|
#endif |
|
|
|
|
|
|
|
height++; |
|
|
|
loop--; |
|
|
|
if (loop < 0) |
|
|
|
loop = rand () % 3, sloop++;; |
|
|
|
i1 = 1; |
|
|
|
i2 = 4 * XSIZ + 1; |
|
|
|
for (p = (char *) bitmap + XSIZ * (YSIZ + 0); |
|
|
|
p < ((unsigned char *) bitmap + XSIZ * (YSIZ + 1)); |
|
|
|
p++, i1 += 4, i2 -= 4) |
|
|
|
{ |
|
|
|
last1 = rand () % min (i1, min (i2, height)); |
|
|
|
i = rand () % 6; |
|
|
|
for (; p < (unsigned char *) bitmap + XSIZ * (YSIZ + 1) && i != 0; |
|
|
|
p++, i--, i1 += 4, i2 -= 4) |
|
|
|
*p = last1, last1 += rand () % 6 - 2, *(p + XSIZ) = last1, last1 += |
|
|
|
rand () % 6 - 2; |
|
|
|
*(p + 2 * XSIZ) = last1, last1 += rand () % 6 - 2; |
|
|
|
} |
|
|
|
i = 0; |
|
|
|
firemain (); |
|
|
|
#ifdef LIBCACA |
|
|
|
caca_draw_bitmap(0, 0, caca_get_width() - 1, caca_get_height() - 1, |
|
|
|
caca_bitmap, bitmap); |
|
|
|
caca_refresh(); |
|
|
|
#else |
|
|
|
aa_renderpalette (context, palette, params, 0, 0, aa_scrwidth (context), |
|
|
|
aa_scrheight (context)); |
|
|
|
aa_flush (context); |
|
|
|
#endif |
|
|
|
} |
|
|
|
static void |
|
|
|
game (void) |
|
|
|
{ |
|
|
|
int event; |
|
|
|
gentable (); |
|
|
|
#ifdef LIBCACA |
|
|
|
while (!(event = caca_get_event())) |
|
|
|
#else |
|
|
|
while (!(event = aa_getevent (context, 0)) || event == AA_RESIZE) |
|
|
|
#endif |
|
|
|
{ |
|
|
|
drawfire (); |
|
|
|
} |
|
|
|
} |
|
|
|
int |
|
|
|
main (int argc, char **argv) |
|
|
|
{ |
|
|
|
#ifndef LIBCACA |
|
|
|
if (!aa_parseoptions (NULL, NULL, &argc, argv) || argc != 1) |
|
|
|
{ |
|
|
|
printf ("%s", aa_help); |
|
|
|
exit (1); |
|
|
|
} |
|
|
|
#endif |
|
|
|
initialize (); |
|
|
|
#ifndef LIBCACA |
|
|
|
aa_resizehandler (context, (void *) aa_resize); |
|
|
|
#endif |
|
|
|
game (); |
|
|
|
uninitialize (); |
|
|
|
return 1; |
|
|
|
} |