ncurses-experiments/src/animate.main.c

120 lines
2.4 KiB
C

#include "mr4th/mr4th_base.h"
#include <ncurses.h>
#include "mr4th/mr4th_base.c"
int main(){
Arena *arena = arena_alloc();
// initializes ncurses
initscr();
// settings
noecho();
cbreak();
curs_set(0);
B32 animating = 1;
// get size
U32 window_x = 0;
U32 window_y = 0;
getmaxyx(stdscr, window_y, window_x);
U32 window_stride = window_x;
// window buffer
U32 buffer_size = window_stride*window_y;
U8 *buffer = push_array(arena, U8, buffer_size);
// cell grid
U32 grid_x = window_x + 2;
U32 grid_y = window_y + 2;
B8 *cell = push_array(arena, B8, grid_x*grid_y);
B8 *celln = push_array(arena, B8, grid_x*grid_y);
cell[ 7 + 9*grid_x] = 1;
cell[ 8 + 9*grid_x] = 1;
cell[11 + 9*grid_x] = 1;
cell[12 + 9*grid_x] = 1;
cell[13 + 9*grid_x] = 1;
cell[10 + 10*grid_x] = 1;
cell[ 8 + 11*grid_x] = 1;
cell[12 + 13*grid_x] = 1;
cell[13 + 13*grid_x] = 1;
cell[16 + 13*grid_x] = 1;
cell[17 + 13*grid_x] = 1;
cell[18 + 13*grid_x] = 1;
cell[15 + 14*grid_x] = 1;
cell[13 + 15*grid_x] = 1;
// animation
U32 t = 0;
for (;;){
// cell -> buffer
for (U32 y = 0; y < window_y; y += 1){
for (U32 x = 0; x < window_x; x += 1){
U8 b = ' ';
if (cell[(x + 1) + (y + 1)*grid_x]){
b = '#';
}
buffer[x + y*window_stride] = b;
}
}
// print
move(0, 0);
printw("%.*s", buffer_size, buffer);
refresh();
if (animating){
os_sleep_milliseconds(1000/6);
}
else{
getch();
}
// iterate
t += 1;
for (S32 y = 0; y < window_y; y += 1){
S32 cy = y + 1;
for (S32 x = 0; x < window_x; x += 1){
S32 cx = x + 1;
static S8 neighborhood[] = {
-1, -1, 0, -1, +1, -1,
-1, 0, +1, 0,
-1, +1, 0, +1, +1, +1,
};
S32 count = 0;
for (S32 i = 0; i < ArrayCount(neighborhood); i += 2){
S32 xi = cx + neighborhood[i];
S32 yi = cy + neighborhood[i + 1];
count += cell[xi + yi*grid_x];
}
B8 n = 0;
if (cell[cx + cy*grid_x]){
if (count == 2 || count == 3){
n = 1;
}
}
else{
if (count == 3){
n = 1;
}
}
celln[cx + cy*grid_x] = n;
}
}
Swap(B8*, cell, celln);
}
return(0);
}