Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

304 Zeilen
9.1 KiB

  1. /*
  2. * cacafire fire demo for libcaca
  3. * Copyright (c) 2003-2010 Sam Hocevar <sam@hocevar.net>
  4. * 1998, 1999, 2001 Jan Hubicka <hubicka@freesoft.cz>
  5. * All Rights Reserved
  6. *
  7. * This program is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2 of the License, or (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  20. * 02111-1307 USA
  21. */
  22. #ifdef LIBCACA
  23. #include "config.h"
  24. #if !defined(__KERNEL__)
  25. # include <stdio.h>
  26. # include <stdlib.h>
  27. # include <string.h>
  28. #endif
  29. #include "caca.h"
  30. #else
  31. #include <stdio.h>
  32. #include "aalib.h"
  33. #define XSIZ aa_imgwidth(context)
  34. #define YSIZ (aa_imgheight(context)-4)
  35. #endif
  36. #define MAXTABLE (256*5)
  37. #ifdef LIBCACA
  38. static caca_canvas_t *cv;
  39. static caca_display_t *dp;
  40. static int XSIZ, YSIZ;
  41. static caca_dither_t *caca_dither;
  42. static char *bitmap;
  43. static int paused = 0;
  44. #else
  45. static aa_context *context;
  46. static aa_renderparams *params;
  47. static aa_palette palette;
  48. #endif
  49. static unsigned int table[MAXTABLE];
  50. #ifdef LIBCACA
  51. static int const pal[] =
  52. #else
  53. __AA_CONST static int pal[] =
  54. #endif
  55. {
  56. 0, 0, 0, 0, 0, 6, 0, 0, 6, 0, 0, 7, 0, 0, 8, 0, 0, 8, 0, 0, 9, 0, 0, 10,
  57. 2, 0, 10, 4, 0, 9, 6, 0, 9, 8, 0, 8, 10, 0, 7, 12, 0, 7, 14, 0, 6, 16, 0, 5,
  58. 18, 0, 5, 20, 0, 4, 22, 0, 4, 24, 0, 3, 26, 0, 2, 28, 0, 2, 30, 0, 1, 32, 0, 0,
  59. 32, 0, 0, 33, 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 0, 36, 0, 0, 37, 0, 0, 38, 0, 0,
  60. 39, 0, 0, 40, 0, 0, 40, 0, 0, 41, 0, 0, 42, 0, 0, 43, 0, 0, 44, 0, 0, 45, 0, 0,
  61. 46, 1, 0, 47, 1, 0, 48, 2, 0, 49, 2, 0, 50, 3, 0, 51, 3, 0, 52, 4, 0, 53, 4, 0,
  62. 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. 63, 9, 0, 63, 9, 0, 63, 10, 0, 63, 10, 0, 63, 11, 0, 63, 11, 0, 63, 12, 0, 63, 12, 0,
  64. 63, 13, 0, 63, 13, 0, 63, 14, 0, 63, 14, 0, 63, 15, 0, 63, 15, 0, 63, 16, 0, 63, 16, 0,
  65. 63, 17, 0, 63, 17, 0, 63, 18, 0, 63, 18, 0, 63, 19, 0, 63, 19, 0, 63, 20, 0, 63, 20, 0,
  66. 63, 21, 0, 63, 21, 0, 63, 22, 0, 63, 22, 0, 63, 23, 0, 63, 24, 0, 63, 24, 0, 63, 25, 0,
  67. 63, 25, 0, 63, 26, 0, 63, 26, 0, 63, 27, 0, 63, 27, 0, 63, 28, 0, 63, 28, 0, 63, 29, 0,
  68. 63, 29, 0, 63, 30, 0, 63, 30, 0, 63, 31, 0, 63, 31, 0, 63, 32, 0, 63, 32, 0, 63, 33, 0,
  69. 63, 33, 0, 63, 34, 0, 63, 34, 0, 63, 35, 0, 63, 35, 0, 63, 36, 0, 63, 36, 0, 63, 37, 0,
  70. 63, 38, 0, 63, 38, 0, 63, 39, 0, 63, 39, 0, 63, 40, 0, 63, 40, 0, 63, 41, 0, 63, 41, 0,
  71. 63, 42, 0, 63, 42, 0, 63, 43, 0, 63, 43, 0, 63, 44, 0, 63, 44, 0, 63, 45, 0, 63, 45, 0,
  72. 63, 46, 0, 63, 46, 0, 63, 47, 0, 63, 47, 0, 63, 48, 0, 63, 48, 0, 63, 49, 0, 63, 49, 0,
  73. 63, 50, 0, 63, 50, 0, 63, 51, 0, 63, 52, 0, 63, 52, 0, 63, 52, 0, 63, 52, 0, 63, 52, 0,
  74. 63, 53, 0, 63, 53, 0, 63, 53, 0, 63, 53, 0, 63, 54, 0, 63, 54, 0, 63, 54, 0, 63, 54, 0,
  75. 63, 54, 0, 63, 55, 0, 63, 55, 0, 63, 55, 0, 63, 55, 0, 63, 56, 0, 63, 56, 0, 63, 56, 0,
  76. 63, 56, 0, 63, 57, 0, 63, 57, 0, 63, 57, 0, 63, 57, 0, 63, 57, 0, 63, 58, 0, 63, 58, 0,
  77. 63, 58, 0, 63, 58, 0, 63, 59, 0, 63, 59, 0, 63, 59, 0, 63, 59, 0, 63, 60, 0, 63, 60, 0,
  78. 63, 60, 0, 63, 60, 0, 63, 60, 0, 63, 61, 0, 63, 61, 0, 63, 61, 0, 63, 61, 0, 63, 62, 0,
  79. 63, 62, 0, 63, 62, 0, 63, 62, 0, 63, 63, 0, 63, 63, 1, 63, 63, 2, 63, 63, 3, 63, 63, 4,
  80. 63, 63, 5, 63, 63, 6, 63, 63, 7, 63, 63, 8, 63, 63, 9, 63, 63, 10, 63, 63, 10, 63, 63, 11,
  81. 63, 63, 12, 63, 63, 13, 63, 63, 14, 63, 63, 15, 63, 63, 16, 63, 63, 17, 63, 63, 18, 63, 63, 19,
  82. 63, 63, 20, 63, 63, 21, 63, 63, 21, 63, 63, 22, 63, 63, 23, 63, 63, 24, 63, 63, 25, 63, 63, 26,
  83. 63, 63, 27, 63, 63, 28, 63, 63, 29, 63, 63, 30, 63, 63, 31, 63, 63, 31, 63, 63, 32, 63, 63, 33,
  84. 63, 63, 34, 63, 63, 35, 63, 63, 36, 63, 63, 37, 63, 63, 38, 63, 63, 39, 63, 63, 40, 63, 63, 41,
  85. 63, 63, 42, 63, 63, 42, 63, 63, 43, 63, 63, 44, 63, 63, 45, 63, 63, 46, 63, 63, 47, 63, 63, 48,
  86. 63, 63, 49, 63, 63, 50, 63, 63, 51, 63, 63, 52, 63, 63, 52, 63, 63, 53, 63, 63, 54, 63, 63, 55,
  87. 63, 63, 56, 63, 63, 57, 63, 63, 58, 63, 63, 59, 63, 63, 60, 63, 63, 61, 63, 63, 62, 63, 63, 63};
  88. static void
  89. initialize (void)
  90. {
  91. int i;
  92. #ifdef LIBCACA
  93. uint32_t r[256], g[256], b[256], a[256];
  94. #endif
  95. #ifdef LIBCACA
  96. cv = caca_create_canvas(80, 32);
  97. if (!cv)
  98. {
  99. printf ("Failed to initialize libcaca\n");
  100. exit (1);
  101. }
  102. dp = caca_create_display(cv);
  103. if (!dp)
  104. {
  105. printf ("Failed to initialize libcaca\n");
  106. exit (1);
  107. }
  108. caca_set_display_time(dp, 10000);
  109. XSIZ = caca_get_canvas_width(cv) * 2;
  110. YSIZ = caca_get_canvas_height(cv) * 2 - 4;
  111. #else
  112. context = aa_autoinit (&aa_defparams);
  113. if (context == NULL)
  114. {
  115. printf ("Failed to initialize aalib\n");
  116. exit (1);
  117. }
  118. aa_autoinitkbd (context, 0);
  119. params = aa_getrenderparams ();
  120. #endif
  121. for (i = 0; i < 256; i++)
  122. #ifdef LIBCACA
  123. {
  124. r[i] = pal[i * 3] * 64;
  125. g[i] = pal[i * 3 + 1] * 64;
  126. b[i] = pal[i * 3 + 2] * 64;
  127. a[i] = 0xfff;
  128. }
  129. #else
  130. aa_setpalette (palette, i, pal[i * 3] * 4,
  131. pal[i * 3 + 1] * 4, pal[i * 3 + 2] * 4);
  132. #endif
  133. #ifdef LIBCACA
  134. caca_dither = caca_create_dither(8, XSIZ, YSIZ - 2, XSIZ, 0, 0, 0, 0);
  135. caca_set_dither_palette(caca_dither, r, g, b, a);
  136. bitmap = malloc(4 * caca_get_canvas_width(cv)
  137. * caca_get_canvas_height(cv));
  138. memset(bitmap, 0, 4 * caca_get_canvas_width(cv)
  139. * caca_get_canvas_height(cv));
  140. #else
  141. aa_hidecursor (context);
  142. #endif
  143. }
  144. static void
  145. uninitialize (void)
  146. {
  147. #ifdef LIBCACA
  148. caca_free_display(dp);
  149. caca_free_canvas(cv);
  150. #else
  151. aa_close (context);
  152. #endif
  153. exit (0);
  154. }
  155. static void
  156. gentable (void)
  157. {
  158. unsigned int i, p2;
  159. unsigned int minus = 800 / YSIZ;
  160. if (minus == 0)
  161. minus = 1;
  162. for (i = 0; i < MAXTABLE; i++)
  163. {
  164. if (i > minus)
  165. {
  166. p2 = (i - minus) / 5;
  167. table[i] = p2;
  168. }
  169. else
  170. table[i] = 0;
  171. }
  172. }
  173. #define MA 5
  174. static void
  175. firemain (void)
  176. {
  177. register unsigned int i;
  178. unsigned char *p;
  179. #ifndef LIBCACA
  180. char *bitmap = aa_image (context);
  181. #endif
  182. i = 0;
  183. #define END (bitmap + XSIZ * YSIZ)
  184. for (p = (unsigned char*)bitmap;
  185. (char*)p <= (( char *) (END));
  186. p += 1)
  187. {
  188. *p = table[(*(p + XSIZ - 1) + *(p + XSIZ + 1) + *(p + XSIZ)) +
  189. (*(p + 2 * XSIZ - 1) + *(p + 2 * XSIZ + 1))];
  190. }
  191. }
  192. #define min(x,y) ((x)<(y)?(x):(y))
  193. static void
  194. drawfire (void)
  195. {
  196. unsigned int i, last1, i1, i2;
  197. static int loop = 0, sloop = 0;
  198. static unsigned int height = 0;
  199. register unsigned char *p;
  200. #ifndef LIBCACA
  201. char *bitmap = aa_image (context);
  202. #else
  203. if(paused)
  204. goto _paused;
  205. #endif
  206. height++;
  207. loop--;
  208. if (loop < 0)
  209. loop = rand () % 3, sloop++;;
  210. i1 = 1;
  211. i2 = 4 * XSIZ + 1;
  212. for (p = (unsigned char *) bitmap + XSIZ * (YSIZ + 0);
  213. p < ((unsigned char *) bitmap + XSIZ * (YSIZ + 1));
  214. p++, i1 += 4, i2 -= 4)
  215. {
  216. last1 = rand () % min (i1, min (i2, height));
  217. i = rand () % 6;
  218. for (; p < (unsigned char *) bitmap + XSIZ * (YSIZ + 1) && i != 0;
  219. p++, i--, i1 += 4, i2 -= 4)
  220. *p = last1, last1 += rand () % 6 - 2, *(p + XSIZ) = last1, last1 +=
  221. rand () % 6 - 2;
  222. *(p + 2 * XSIZ) = last1, last1 += rand () % 6 - 2;
  223. }
  224. i = 0;
  225. firemain ();
  226. #ifdef LIBCACA
  227. _paused:
  228. caca_dither_bitmap(cv, 0, 0, caca_get_canvas_width(cv),
  229. caca_get_canvas_height(cv), caca_dither, bitmap);
  230. caca_set_color_ansi(cv, CACA_WHITE, CACA_BLUE);
  231. if (sloop < 100)
  232. caca_put_str(cv, caca_get_canvas_width(cv) - 30,
  233. caca_get_canvas_height(cv) - 2,
  234. " -=[ Powered by libcaca ]=- ");
  235. caca_refresh_display(dp);
  236. /*XSIZ = caca_get_width() * 2;
  237. YSIZ = caca_get_height() * 2 - 4;*/
  238. #else
  239. aa_renderpalette (context, palette, params, 0, 0, aa_scrwidth (context),
  240. aa_scrheight (context));
  241. aa_flush (context);
  242. #endif
  243. }
  244. static void
  245. game (void)
  246. {
  247. #ifndef LIBCACA
  248. int event;
  249. #endif
  250. gentable ();
  251. #ifdef LIBCACA
  252. for(;;)
  253. #else
  254. while (!(event = aa_getevent (context, 0)) || event == AA_RESIZE)
  255. #endif
  256. {
  257. #ifdef LIBCACA
  258. caca_event_t ev;
  259. if(caca_get_event(dp, CACA_EVENT_KEY_PRESS|CACA_EVENT_QUIT, &ev, 0))
  260. {
  261. if (caca_get_event_type(&ev) & CACA_EVENT_QUIT)
  262. return;
  263. switch(caca_get_event_key_ch(&ev))
  264. {
  265. case CACA_KEY_CTRL_C:
  266. case CACA_KEY_CTRL_Z:
  267. case CACA_KEY_ESCAPE: return;
  268. case ' ': paused = !paused;
  269. }
  270. }
  271. #endif
  272. drawfire ();
  273. }
  274. }
  275. int
  276. main (int argc, char **argv)
  277. {
  278. #ifndef LIBCACA
  279. if (!aa_parseoptions (NULL, NULL, &argc, argv) || argc != 1)
  280. {
  281. printf ("%s", aa_help);
  282. exit (1);
  283. }
  284. #endif
  285. initialize ();
  286. #ifndef LIBCACA
  287. aa_resizehandler (context, (void *) aa_resize);
  288. #endif
  289. game ();
  290. uninitialize ();
  291. return 1;
  292. }