Init
This commit is contained in:
commit
6383a35cc5
|
@ -0,0 +1 @@
|
||||||
|
coderain
|
|
@ -0,0 +1,3 @@
|
||||||
|
coderain: coderain.c
|
||||||
|
gcc -o coderain coderain.c -lncurses
|
||||||
|
|
|
@ -0,0 +1,189 @@
|
||||||
|
#include <ncurses.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#define CHAR_COUNT 17
|
||||||
|
|
||||||
|
#define COLOR_LIGHT_GREEN 8
|
||||||
|
#define COLOR_MID_GREEN 9
|
||||||
|
#define COLOR_DARK_GREEN 10
|
||||||
|
#define COLOR_BLACK_GREEN 11
|
||||||
|
|
||||||
|
#define WHITE 1
|
||||||
|
#define LIGHT_GREEN 2
|
||||||
|
#define MID_GREEN 3
|
||||||
|
#define DARK_GREEN 4
|
||||||
|
#define BLACK_GREEN 5
|
||||||
|
|
||||||
|
|
||||||
|
const char CHARS[] = "!$%&?#@Y0123456789";
|
||||||
|
|
||||||
|
|
||||||
|
struct Cursor {
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int speed;
|
||||||
|
int length;
|
||||||
|
char string[256];
|
||||||
|
bool is_expanding;
|
||||||
|
bool is_active;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int get_random_number(int max_number)
|
||||||
|
{
|
||||||
|
double index = (rand() / (double)RAND_MAX) * max_number;
|
||||||
|
|
||||||
|
return (int)index % max_number;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char get_random_char()
|
||||||
|
{
|
||||||
|
return CHARS[get_random_number(CHAR_COUNT)];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void generate_random_string(char * string, int length)
|
||||||
|
{
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
for (int c = 0; c < length; c++) {
|
||||||
|
string[c] = get_random_char();
|
||||||
|
index = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
string[index + 1] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void print_with_color(char c, int x, int y, int color_pair)
|
||||||
|
{
|
||||||
|
attron(COLOR_PAIR(color_pair));
|
||||||
|
mvaddch(y, x, c);
|
||||||
|
attroff(COLOR_PAIR(color_pair));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void draw_cursor(struct Cursor * cursor, int * screen_height)
|
||||||
|
{
|
||||||
|
print_with_color(cursor->string[cursor->y], cursor->x, cursor->y, WHITE);
|
||||||
|
|
||||||
|
if (cursor->y > 0) {
|
||||||
|
print_with_color(cursor->string[cursor->y - 1], cursor->x, cursor->y - 1, LIGHT_GREEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
++cursor->y;
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (cursor->y > 4 && cursor->length > 4 && get_random_number(100) > 90) {
|
||||||
|
char random_char = get_random_char();
|
||||||
|
int char_index = cursor->y - get_random_number(cursor->length - 4);
|
||||||
|
|
||||||
|
cursor->string[char_index] = random_char;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (cursor->is_expanding) {
|
||||||
|
++cursor->length;
|
||||||
|
|
||||||
|
if (cursor->length > *screen_height * 0.1) {
|
||||||
|
cursor->is_expanding = get_random_number(10) > 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mvaddch(cursor->y - cursor->length - 4, cursor->x, ' ');
|
||||||
|
print_with_color(cursor->string[cursor->y - cursor->length], cursor->x, cursor->y - cursor->length - 3, BLACK_GREEN);
|
||||||
|
print_with_color(cursor->string[cursor->y - cursor->length], cursor->x, cursor->y - cursor->length - 2, DARK_GREEN);
|
||||||
|
print_with_color(cursor->string[cursor->y - cursor->length + 1], cursor->x, cursor->y - cursor->length - 1, MID_GREEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cursor->y > *screen_height + cursor->length + 3) {
|
||||||
|
cursor->length = 0;
|
||||||
|
cursor->y = 0;
|
||||||
|
cursor->is_active = false;
|
||||||
|
cursor->is_expanding = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void control_cursor(struct Cursor * cursor, int * screen_height)
|
||||||
|
{
|
||||||
|
if (cursor->is_active) {
|
||||||
|
draw_cursor(cursor, screen_height);
|
||||||
|
} else {
|
||||||
|
cursor->is_active = get_random_number(*screen_height) > *screen_height * 0.5;
|
||||||
|
|
||||||
|
if (cursor->is_active) {
|
||||||
|
generate_random_string(cursor->string, *screen_height + 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int screen_width = 0;
|
||||||
|
int screen_height = 0;
|
||||||
|
|
||||||
|
srand(time(NULL));
|
||||||
|
|
||||||
|
initscr();
|
||||||
|
|
||||||
|
if (!has_colors()) {
|
||||||
|
printf("Your shell does not support colors!\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
getmaxyx(stdscr, screen_height, screen_width);
|
||||||
|
|
||||||
|
struct Cursor cursors[screen_width];
|
||||||
|
|
||||||
|
for (int c = 0; c < screen_width; c++) {
|
||||||
|
struct Cursor cursor;
|
||||||
|
|
||||||
|
cursor.x = c;
|
||||||
|
cursor.y = -1 * get_random_number(screen_height);
|
||||||
|
cursor.speed = 0;
|
||||||
|
cursor.length = 0;
|
||||||
|
cursor.is_active = false;
|
||||||
|
cursor.is_expanding = true;
|
||||||
|
|
||||||
|
cursors[c] = cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
cbreak();
|
||||||
|
curs_set(0);
|
||||||
|
noecho();
|
||||||
|
keypad(stdscr, 1);
|
||||||
|
start_color();
|
||||||
|
|
||||||
|
init_color(COLOR_WHITE, 1000, 1000, 1000);
|
||||||
|
init_color(COLOR_LIGHT_GREEN, 500, 1000, 500);
|
||||||
|
init_color(COLOR_MID_GREEN, 0, 600, 0);
|
||||||
|
init_color(COLOR_DARK_GREEN, 0, 200, 0);
|
||||||
|
init_color(COLOR_BLACK_GREEN, 0, 50, 0);
|
||||||
|
|
||||||
|
|
||||||
|
init_pair(WHITE, COLOR_WHITE, COLOR_BLACK);
|
||||||
|
init_pair(LIGHT_GREEN, COLOR_LIGHT_GREEN, COLOR_BLACK);
|
||||||
|
init_pair(MID_GREEN, COLOR_MID_GREEN, COLOR_BLACK);
|
||||||
|
init_pair(DARK_GREEN, COLOR_DARK_GREEN, COLOR_BLACK);
|
||||||
|
init_pair(BLACK_GREEN, COLOR_DARK_GREEN, COLOR_BLACK);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
for (int c = 0; c < screen_width; c++) {
|
||||||
|
control_cursor(&cursors[c], &screen_height);
|
||||||
|
}
|
||||||
|
|
||||||
|
refresh();
|
||||||
|
|
||||||
|
usleep(90000);
|
||||||
|
}
|
||||||
|
|
||||||
|
endwin();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue