mirror of
https://github.com/kiedtl/fire.git
synced 2024-12-22 22:26:39 +00:00
Allow user to have finer control on fire params
Plus numerous fixes
This commit is contained in:
parent
d3e4ed96d6
commit
7a417130c9
11
args.h
11
args.h
@ -3,9 +3,10 @@
|
|||||||
// by 20h
|
// by 20h
|
||||||
//
|
//
|
||||||
|
|
||||||
// This file is was proudly stol^Hborrowed
|
// This file was proudly stol^Hborrowed
|
||||||
// from the st project and is copyright all
|
// from the st project.
|
||||||
// st contributors. View the LICENSE at:
|
//
|
||||||
|
// (c) all st contributors. View the LICENSE at:
|
||||||
// https://git.suckless.org/st/file/LICENSE.html
|
// https://git.suckless.org/st/file/LICENSE.html
|
||||||
|
|
||||||
|
|
||||||
@ -24,6 +25,10 @@ extern char *argv0;
|
|||||||
|
|
||||||
typedef struct Options {
|
typedef struct Options {
|
||||||
size_t refresh_rate;
|
size_t refresh_rate;
|
||||||
|
size_t max_heat_loss;
|
||||||
|
size_t wind;
|
||||||
|
size_t random_factor;
|
||||||
|
bool random_wind;
|
||||||
bool truecolor;
|
bool truecolor;
|
||||||
} Options;
|
} Options;
|
||||||
|
|
||||||
|
64
colors.h
64
colors.h
@ -2,7 +2,6 @@
|
|||||||
#define COLORS_INCLUDED
|
#define COLORS_INCLUDED
|
||||||
|
|
||||||
#include "termbox.h"
|
#include "termbox.h"
|
||||||
#define CLRS_LEN 13
|
|
||||||
|
|
||||||
#ifdef __OpenBSD__
|
#ifdef __OpenBSD__
|
||||||
#include "sys/types.h"
|
#include "sys/types.h"
|
||||||
@ -10,12 +9,9 @@
|
|||||||
#include "stdint.h"
|
#include "stdint.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define RED 0xdd1111
|
|
||||||
#define BLACK 0x000000
|
#define BLACK 0x000000
|
||||||
#define YELLOW 0xff7700
|
|
||||||
#define WHITE 0xffffff
|
|
||||||
|
|
||||||
struct tb_cell normcolors[CLRS_LEN] =
|
struct tb_cell normcolors[13] =
|
||||||
{
|
{
|
||||||
// default
|
// default
|
||||||
{ ' ', 9, 0 },
|
{ ' ', 9, 0 },
|
||||||
@ -39,28 +35,42 @@ struct tb_cell normcolors[CLRS_LEN] =
|
|||||||
{ 0x2588, 8, 2 },
|
{ 0x2588, 8, 2 },
|
||||||
};
|
};
|
||||||
|
|
||||||
struct tb_cell truecolors[CLRS_LEN] =
|
struct tb_cell truecolors[36] = {
|
||||||
{
|
{ ' ', BLACK, 0x070707 },
|
||||||
// default
|
{ ' ', BLACK, 0x1F0707 },
|
||||||
{ ' ', 9, 0 },
|
{ ' ', BLACK, 0x2F0F07 },
|
||||||
|
{ ' ', BLACK, 0x470F07 },
|
||||||
// red/black
|
{ ' ', BLACK, 0x571707 },
|
||||||
{ 0x2591, RED, BLACK },
|
{ ' ', BLACK, 0x671F07 },
|
||||||
{ 0x2592, RED, BLACK },
|
{ ' ', BLACK, 0x771F07 },
|
||||||
{ 0x2593, RED, BLACK },
|
{ ' ', BLACK, 0x8F2707 },
|
||||||
{ 0x2588, RED, BLACK },
|
{ ' ', BLACK, 0x9F2F07 },
|
||||||
|
{ ' ', BLACK, 0xAF3F07 },
|
||||||
// yellow/red
|
{ ' ', BLACK, 0xBF4707 },
|
||||||
{ 0x2591, YELLOW, RED },
|
{ ' ', BLACK, 0xC74707 },
|
||||||
{ 0x2592, YELLOW, RED },
|
{ ' ', BLACK, 0xDF4F07 },
|
||||||
{ 0x2593, YELLOW, RED },
|
{ ' ', BLACK, 0xDF5707 },
|
||||||
{ 0x2588, YELLOW, RED },
|
{ ' ', BLACK, 0xDF5707 },
|
||||||
|
{ ' ', BLACK, 0xD75F07 },
|
||||||
// white/red
|
{ ' ', BLACK, 0xD7670F },
|
||||||
{ 0x2591, WHITE, RED },
|
{ ' ', BLACK, 0xCF6F0F },
|
||||||
{ 0x2592, WHITE, RED },
|
{ ' ', BLACK, 0xCF770F },
|
||||||
{ 0x2593, WHITE, RED },
|
{ ' ', BLACK, 0xCF7F0F },
|
||||||
{ 0x2588, WHITE, RED },
|
{ ' ', BLACK, 0xCF8717 },
|
||||||
|
{ ' ', BLACK, 0xC78717 },
|
||||||
|
{ ' ', BLACK, 0xC78F17 },
|
||||||
|
{ ' ', BLACK, 0xC7971F },
|
||||||
|
{ ' ', BLACK, 0xBF9F1F },
|
||||||
|
{ ' ', BLACK, 0xBF9F1F },
|
||||||
|
{ ' ', BLACK, 0xBFA727 },
|
||||||
|
{ ' ', BLACK, 0xBFA727 },
|
||||||
|
{ ' ', BLACK, 0xBFAF2F },
|
||||||
|
{ ' ', BLACK, 0xB7AF2F },
|
||||||
|
{ ' ', BLACK, 0xB7B737 },
|
||||||
|
{ ' ', BLACK, 0xCFCF6F },
|
||||||
|
{ ' ', BLACK, 0xDFDF9F },
|
||||||
|
{ ' ', BLACK, 0xEFEFC7 },
|
||||||
|
{ ' ', BLACK, 0xFFFFFF }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
39
draw.c
39
draw.c
@ -14,6 +14,9 @@
|
|||||||
#include "stdint.h"
|
#include "stdint.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define MAX(VAL1, VAL2) ((VAL1) > (VAL2) ? (VAL1) : (VAL2))
|
||||||
|
#define MIN(VAL1, VAL2) ((VAL1) < (VAL2) ? (VAL1) : (VAL2))
|
||||||
|
|
||||||
// arguments
|
// arguments
|
||||||
extern struct Options *opts;
|
extern struct Options *opts;
|
||||||
|
|
||||||
@ -46,16 +49,34 @@ void
|
|||||||
dofire(struct buffer *buf)
|
dofire(struct buffer *buf)
|
||||||
{
|
{
|
||||||
size_t src;
|
size_t src;
|
||||||
size_t random;
|
size_t random = (rand() % 7) & 3;
|
||||||
size_t dest;
|
size_t dest;
|
||||||
|
|
||||||
struct tb_cell *realbuf = tb_cell_buffer();
|
struct tb_cell *realbuf = tb_cell_buffer();
|
||||||
|
|
||||||
for (size_t x = 0; x < buf->width; ++x) {
|
for (size_t x = 0; x < buf->width; ++x) {
|
||||||
for (size_t y = 1; y < buf->height; ++y) {
|
for (size_t y = 1; y < buf->height; ++y) {
|
||||||
src = y * buf->width + x;
|
if ((rand() % opts->random_factor) == 0) {
|
||||||
random = (rand() % 7) & 3;
|
random = (rand() % 7) & 3;
|
||||||
dest = src - random + 1;
|
}
|
||||||
|
|
||||||
|
src = y * buf->width + x;
|
||||||
|
|
||||||
|
if (opts->random_wind) {
|
||||||
|
dest = src - random + opts->wind;
|
||||||
|
} else {
|
||||||
|
dest = src + opts->wind;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t max_value;
|
||||||
|
struct tb_cell *colors;
|
||||||
|
if (opts->truecolor == TRUE) {
|
||||||
|
colors = (struct tb_cell*) &truecolors;
|
||||||
|
max_value = 35;
|
||||||
|
} else {
|
||||||
|
colors = (struct tb_cell*) &normcolors;
|
||||||
|
max_value = 12;
|
||||||
|
}
|
||||||
|
|
||||||
if (buf->width > dest) {
|
if (buf->width > dest) {
|
||||||
dest = 0;
|
dest = 0;
|
||||||
@ -63,19 +84,13 @@ dofire(struct buffer *buf)
|
|||||||
dest -= buf->width;
|
dest -= buf->width;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf->buf[dest] = buf->buf[src] - (random & 1);
|
size_t loss = MIN(opts->max_heat_loss, 3);
|
||||||
|
buf->buf[dest] = MAX(buf->buf[src] - (random & loss), 0);
|
||||||
|
|
||||||
if (buf->buf[dest] > 12) {
|
if (buf->buf[dest] > max_value) {
|
||||||
buf->buf[dest] = 0;
|
buf->buf[dest] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct tb_cell *colors;
|
|
||||||
if (opts->truecolor == TRUE) {
|
|
||||||
colors = (struct tb_cell*) &truecolors;
|
|
||||||
} else {
|
|
||||||
colors = (struct tb_cell*) &normcolors;
|
|
||||||
}
|
|
||||||
|
|
||||||
realbuf[dest] = colors[buf->buf[dest]];
|
realbuf[dest] = colors[buf->buf[dest]];
|
||||||
realbuf[src] = colors[buf->buf[src]];
|
realbuf[src] = colors[buf->buf[src]];
|
||||||
}
|
}
|
||||||
|
38
main.c
38
main.c
@ -19,9 +19,9 @@ char *argv0;
|
|||||||
struct Options *opts;
|
struct Options *opts;
|
||||||
|
|
||||||
int
|
int
|
||||||
main ( int argc, char *argv[] )
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
opts = (struct Options*) calloc(1, sizeof(struct Options*));
|
opts = (struct Options*) calloc(1, sizeof(struct Options));
|
||||||
if (opts == NULL) {
|
if (opts == NULL) {
|
||||||
perror("fire: error: calloc()");
|
perror("fire: error: calloc()");
|
||||||
}
|
}
|
||||||
@ -30,6 +30,10 @@ main ( int argc, char *argv[] )
|
|||||||
opts->refresh_rate = 5;
|
opts->refresh_rate = 5;
|
||||||
size_t output_mode = TB_OUTPUT_NORMAL;
|
size_t output_mode = TB_OUTPUT_NORMAL;
|
||||||
opts->truecolor = FALSE;
|
opts->truecolor = FALSE;
|
||||||
|
opts->max_heat_loss = 1;
|
||||||
|
opts->wind = 1;
|
||||||
|
opts->random_wind = TRUE;
|
||||||
|
opts->random_factor = 4;
|
||||||
|
|
||||||
// argument parsing
|
// argument parsing
|
||||||
argv0 = argv[0];
|
argv0 = argv[0];
|
||||||
@ -42,18 +46,44 @@ main ( int argc, char *argv[] )
|
|||||||
case 'r':
|
case 'r':
|
||||||
opts->refresh_rate = atoi(ARGF());
|
opts->refresh_rate = atoi(ARGF());
|
||||||
break;
|
break;
|
||||||
|
case 'l':
|
||||||
|
opts->max_heat_loss = atoi(ARGF());
|
||||||
|
break;
|
||||||
|
case 'w':
|
||||||
|
opts->wind = atoi(ARGF());
|
||||||
|
break;
|
||||||
|
case 'R':
|
||||||
|
opts->random_wind = FALSE;
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
opts->random_factor = atoi(ARGF());
|
||||||
|
break;
|
||||||
case 'V':
|
case 'V':
|
||||||
printf("%s %s\n", argv0, VERSION);
|
printf("%s %s\n", argv0, VERSION);
|
||||||
return 0;
|
return 0;
|
||||||
case 'h':
|
case 'h':
|
||||||
default:
|
default:
|
||||||
printf("Usage: %s [-tVh] [-r rate]\n", argv0);
|
printf("Usage: %s [-RtVh] [-r speed] [-l loss] [-w wind] [-f fact]\n", argv0);
|
||||||
printf("Display a nice fiery animation.\n\n");
|
printf("Display a nice fiery animation.\n\n");
|
||||||
printf("ARGUMENTS:\n");
|
printf("ARGUMENTS:\n");
|
||||||
printf(" -r [rate] Change refresh rate. (default: 5)\n");
|
printf(" -r [speed] Change refresh rate. (default: 5)\n");
|
||||||
|
printf(" -l [loss] Maximum heat loss for each row upward. (default: 1)\n");
|
||||||
|
printf(" Higher values will lead to a smaller fire.\n");
|
||||||
|
printf(" -w [wind] Wind. Negative values, or values less than one will\n");
|
||||||
|
printf(" cause the fire to be blown west. (default: 1)\n");
|
||||||
|
printf(" To disable wind, set this value to 0 and use the -R flag.\n");
|
||||||
|
printf(" -f [fact] Set the chance of the random value being refreshed\n");
|
||||||
|
printf(" for each tile in the fire animation. (default: 4)\n");
|
||||||
|
printf(" High values will cause a matrix-like effect.\n");
|
||||||
|
printf(" -R Disable random wind factor.\n");
|
||||||
printf(" -t Enable truecolor. (Will not work on *rxvt)\n");
|
printf(" -t Enable truecolor. (Will not work on *rxvt)\n");
|
||||||
printf(" -h Display this help message and exit.\n");
|
printf(" -h Display this help message and exit.\n");
|
||||||
printf(" -V Display version and exit.\n\n");
|
printf(" -V Display version and exit.\n\n");
|
||||||
|
printf("EXAMPLES:\n");
|
||||||
|
printf(" %s 'Normal' fire.\n");
|
||||||
|
printf(" %s -Rw0 -f100 Cmatrix-esque effect.\n");
|
||||||
|
printf(" %s -l2 -w2 Small fire with wind blowing east.\n");
|
||||||
|
printf(" %s -Rw0 -f10000000 Heatwaves!\n");
|
||||||
printf("(c) Kiëd Llaentenn, nullgemm\n");
|
printf("(c) Kiëd Llaentenn, nullgemm\n");
|
||||||
printf("https://github.com/lptstr/fire\n");
|
printf("https://github.com/lptstr/fire\n");
|
||||||
|
|
||||||
|
2
makefile
2
makefile
@ -11,7 +11,7 @@ WARNING = -Wall -Wextra -pedantic -Wmissing-prototypes \
|
|||||||
INC = -Isub/termbox_next/src
|
INC = -Isub/termbox_next/src
|
||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS = -std=c99 -O3 $(WARNING) $(INC)
|
CFLAGS = -std=c99 $(WARNING) $(INC) -fsanitize=address -Og -ggdb
|
||||||
LDFLAGS =
|
LDFLAGS =
|
||||||
|
|
||||||
TRMBOX = sub/termbox_next/bin/termbox.a
|
TRMBOX = sub/termbox_next/bin/termbox.a
|
||||||
|
Loading…
Reference in New Issue
Block a user