fire/draw.c

93 lines
1.7 KiB
C
Raw Normal View History

2019-12-13 03:27:13 +00:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
2019-12-13 21:15:29 +00:00
#include "args.h"
2019-12-13 03:27:13 +00:00
#include "termbox.h"
#include "draw.h"
#include "colors.h"
2019-12-13 21:15:29 +00:00
#include "output.h"
#ifdef __OpenBSD__
#include "sys/types.h"
#else
2020-09-17 11:42:48 +00:00
#include "stdint.h"
#endif
2019-12-13 21:15:29 +00:00
// arguments
extern struct Options *opts;
2019-12-13 03:27:13 +00:00
// initialize the framebuffer
void
2020-09-17 12:04:12 +00:00
init(struct buffer *buf)
2019-12-13 03:27:13 +00:00
{
// initialize width/height of terminal
buf->width = tb_width();
buf->height = tb_height();
size_t len = buf->width * buf->height;
2020-09-17 12:06:16 +00:00
buf->buf = (uint8_t*) calloc(len, sizeof(uint8_t));
2019-12-13 03:27:13 +00:00
len -= buf->width;
if (buf->buf == NULL) {
2020-09-17 12:07:24 +00:00
EPRINT("fire: cannot ");
2019-12-13 03:27:13 +00:00
perror("calloc()");
exit(1);
}
2020-09-17 12:07:24 +00:00
// calloc sets the entire screen to black
2019-12-13 03:27:13 +00:00
// ...except for the last row, which is white.
// this is the 'base' of the fire.
memset(buf->buf + len, 12, buf->width);
}
// update the framebuffer
void
2020-09-17 12:04:12 +00:00
dofire(struct buffer *buf)
2019-12-13 03:27:13 +00:00
{
size_t src;
size_t random;
size_t dest;
2019-12-13 03:27:13 +00:00
struct tb_cell *realbuf = tb_cell_buffer();
2020-09-17 12:10:27 +00:00
for (size_t x = 0; x < buf->width; ++x) {
for (size_t y = 1; y < buf->height; ++y) {
2019-12-13 03:27:13 +00:00
src = y * buf->width + x;
random = (rand() % 7) & 3;
dest = src - random + 1;
2020-09-17 12:10:27 +00:00
if (buf->width > dest) {
2019-12-13 03:27:13 +00:00
dest = 0;
2020-09-17 12:10:27 +00:00
} else {
2019-12-13 03:27:13 +00:00
dest -= buf->width;
2020-09-17 12:10:27 +00:00
}
2019-12-13 03:27:13 +00:00
buf->buf[dest] = buf->buf[src] - (random & 1);
2020-09-17 12:10:27 +00:00
if (buf->buf[dest] > 12) {
2019-12-13 03:27:13 +00:00
buf->buf[dest] = 0;
2020-09-17 12:10:27 +00:00
}
2019-12-13 03:27:13 +00:00
2019-12-13 21:35:13 +00:00
struct tb_cell *colors;
2020-09-17 12:10:27 +00:00
if (opts->truecolor == TRUE) {
2019-12-13 21:35:13 +00:00
colors = (struct tb_cell*) &truecolors;
2020-09-17 12:10:27 +00:00
} else {
colors = (struct tb_cell*) &normcolors;
}
2019-12-13 21:35:13 +00:00
realbuf[dest] = colors[buf->buf[dest]];
realbuf[src] = colors[buf->buf[src]];
2019-12-13 03:27:13 +00:00
}
}
}
2019-12-13 04:03:58 +00:00
// free framebuffer and shutdown termbox
void
2020-09-17 12:04:12 +00:00
cleanup(struct buffer *buf)
2019-12-13 04:03:58 +00:00
{
free(buf->buf);
tb_shutdown();
}