Plan 9 from Bell Labs’s /usr/web/sources/contrib/fgb/root/sys/src/ape/lib/curses/demos/firework.c

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


/* $Id: firework.c,v 1.24 2007/07/11 01:01:08 wmcbrine Exp $ */

#include <stdio.h>
#include <signal.h>
#include <curses.h>
#include <ctype.h>
#include <stdlib.h>
#include <sys/types.h>
#include <time.h>

#define DELAYSIZE 200

void myrefresh(void);
void get_color(void);
void explode(int, int);

short color_table[] =
{
	COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_CYAN,
	COLOR_RED, COLOR_MAGENTA, COLOR_YELLOW, COLOR_WHITE
};

int main(int argc, char **argv)
{
	int i, start, end, row, diff, flag, direction, seed;

#ifdef XCURSES
	Xinitscr(argc, argv);
#else
	initscr();
#endif
	nodelay(stdscr, TRUE);
	noecho();

	if (has_colors())
		start_color();

	for (i = 0; i < 8; i++)
		init_pair(i, color_table[i], COLOR_BLACK);

	seed = time((time_t *)0);
	srand(seed);
	flag = 0;
       
	while (getch() == ERR)		/* loop until a key is hit */
	{
		do {
			start = rand() % (COLS - 3);
			end = rand() % (COLS - 3);
			start = (start < 2) ? 2 : start;
			end = (end < 2) ? 2 : end;
			direction = (start > end) ? -1 : 1;
			diff = abs(start - end);

		} while (diff < 2 || diff >= LINES - 2);

		attrset(A_NORMAL);

		for (row = 0; row < diff; row++)
		{
			mvaddstr(LINES - row, row * direction + start,
				(direction < 0) ? "\\" : "/");

			if (flag++)
			{
				myrefresh();
				erase();
				flag = 0;
			}
		}

		if (flag++)
		{
			myrefresh();
			flag = 0;
		}

		explode(LINES - row, diff * direction + start);
		erase();
		myrefresh();
	}

	endwin();

	return 0;
}

void explode(int row, int col)
{
	erase();
	mvaddstr(row, col, "-");
	myrefresh();

	--col;

	get_color();
	mvaddstr(row - 1, col, " - ");
	mvaddstr(row,     col, "-+-");
	mvaddstr(row + 1, col, " - ");
	myrefresh();

	--col;

	get_color();
	mvaddstr(row - 2, col, " --- ");
	mvaddstr(row - 1, col, "-+++-");
	mvaddstr(row,     col, "-+#+-");
	mvaddstr(row + 1, col, "-+++-");
	mvaddstr(row + 2, col, " --- ");
	myrefresh();

	get_color();
	mvaddstr(row - 2, col, " +++ ");
	mvaddstr(row - 1, col, "++#++");
	mvaddstr(row,     col, "+# #+");
	mvaddstr(row + 1, col, "++#++");
	mvaddstr(row + 2, col, " +++ ");
	myrefresh();

	get_color();
	mvaddstr(row - 2, col, "  #  ");
	mvaddstr(row - 1, col, "## ##");
	mvaddstr(row,     col, "#   #");
	mvaddstr(row + 1, col, "## ##");
	mvaddstr(row + 2, col, "  #  ");
	myrefresh();

	get_color();
	mvaddstr(row - 2, col, " # # ");
	mvaddstr(row - 1, col, "#   #");
	mvaddstr(row,     col, "     ");
	mvaddstr(row + 1, col, "#   #");
	mvaddstr(row + 2, col, " # # ");
	myrefresh();
}

void myrefresh(void)
{
	napms(DELAYSIZE);
	move(LINES - 1, COLS - 1);
	refresh();
}

void get_color(void)
{
	chtype bold = (rand() % 2) ? A_BOLD : A_NORMAL;
	attrset(COLOR_PAIR(rand() % 8) | bold);
}

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.