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"
|
|
|
|
|
2020-03-09 16:29:38 +00:00
|
|
|
#ifdef __OpenBSD__
|
|
|
|
#include "sys/types.h"
|
|
|
|
#else
|
2020-09-17 11:42:48 +00:00
|
|
|
#include "stdint.h"
|
2020-03-09 16:29:38 +00:00
|
|
|
#endif
|
|
|
|
|
2020-09-17 18:01:40 +00:00
|
|
|
#define MAX(VAL1, VAL2) ((VAL1) > (VAL2) ? (VAL1) : (VAL2))
|
|
|
|
#define MIN(VAL1, VAL2) ((VAL1) < (VAL2) ? (VAL1) : (VAL2))
|
|
|
|
|
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-19 12:59:55 +00:00
|
|
|
init(struct buffer *buf, uint16_t width, uint16_t height)
|
2019-12-13 03:27:13 +00:00
|
|
|
{
|
|
|
|
// initialize width/height of terminal
|
2020-09-19 12:59:55 +00:00
|
|
|
buf->width = width;
|
|
|
|
buf->height = height;
|
2019-12-13 03:27:13 +00:00
|
|
|
|
2020-03-09 16:29:38 +00:00
|
|
|
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.
|
2020-09-17 18:40:38 +00:00
|
|
|
memset(buf->buf + len, opts->truecolor ? 34 : 12, buf->width);
|
2019-12-13 03:27:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// update the framebuffer
|
|
|
|
void
|
2020-09-17 12:04:12 +00:00
|
|
|
dofire(struct buffer *buf)
|
2019-12-13 03:27:13 +00:00
|
|
|
{
|
2020-03-09 16:29:38 +00:00
|
|
|
size_t src;
|
2020-09-19 12:59:55 +00:00
|
|
|
size_t rnd_wind = (lrand48() % 7) & 3;
|
|
|
|
size_t rnd_lose = lrand48() % 100;
|
|
|
|
size_t rnd_loss = (lrand48() % 7) & 3;
|
2020-03-09 16:29:38 +00:00
|
|
|
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) {
|
2020-09-19 12:59:55 +00:00
|
|
|
// TODO; test rngs
|
|
|
|
if ((lrand48() % opts->random_factor) == 0) {
|
|
|
|
rnd_wind = (lrand48() % 7) & 3;
|
|
|
|
rnd_lose = lrand48() % 100;
|
|
|
|
rnd_loss = (lrand48() % 7) & 3;
|
2020-09-17 12:10:27 +00:00
|
|
|
}
|
2019-12-13 03:27:13 +00:00
|
|
|
|
2020-09-17 18:01:40 +00:00
|
|
|
src = y * buf->width + x;
|
2019-12-13 03:27:13 +00:00
|
|
|
|
2020-09-17 18:01:40 +00:00
|
|
|
if (opts->random_wind) {
|
2020-09-19 12:59:55 +00:00
|
|
|
dest = src - rnd_wind + opts->wind;
|
2020-09-17 18:01:40 +00:00
|
|
|
} else {
|
|
|
|
dest = src + opts->wind;
|
2020-09-17 12:10:27 +00:00
|
|
|
}
|
2019-12-13 03:27:13 +00:00
|
|
|
|
2020-09-17 18:01:40 +00:00
|
|
|
size_t max_value;
|
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 18:01:40 +00:00
|
|
|
max_value = 35;
|
2020-09-17 12:10:27 +00:00
|
|
|
} else {
|
|
|
|
colors = (struct tb_cell*) &normcolors;
|
2020-09-17 18:01:40 +00:00
|
|
|
max_value = 12;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (buf->width > dest) {
|
|
|
|
dest = 0;
|
|
|
|
} else {
|
|
|
|
dest -= buf->width;
|
|
|
|
}
|
|
|
|
|
2020-09-19 12:59:55 +00:00
|
|
|
size_t loss = rnd_lose < opts->heat_loss ? 2 : 0;
|
|
|
|
buf->buf[dest] = MAX(buf->buf[src] - (rnd_loss & loss), 0);
|
2020-09-17 18:01:40 +00:00
|
|
|
|
|
|
|
if (buf->buf[dest] > max_value) {
|
|
|
|
buf->buf[dest] = 0;
|
2020-09-17 12:10:27 +00:00
|
|
|
}
|
2019-12-13 21:35:13 +00:00
|
|
|
|
2020-09-19 12:59:55 +00:00
|
|
|
// TODO: comment everything
|
|
|
|
|
|
|
|
// copy from our buffer to termbox's buffer
|
|
|
|
// unless, of course, our buffer is bigger
|
|
|
|
if (src >= tb_width() * tb_height()) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
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);
|
|
|
|
}
|