From e67ec7d3faf84426bc7267c9c3aeba6eed89ef77 Mon Sep 17 00:00:00 2001 From: bePrivate Date: Wed, 1 Nov 2023 15:15:38 +0100 Subject: [PATCH] feature implemented user-specified theme colors (TODO: make cmdline arguments work (segfault)) --- main | Bin 22088 -> 26528 bytes src/main.c | 381 ++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 337 insertions(+), 44 deletions(-) diff --git a/main b/main index 595bbdae186a27e2118704117ef9973a0809f5cb..fb34a5b98ce0161c57edf8981a8356210e01843c 100755 GIT binary patch literal 26528 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 #include -char *RESET = "\x1b[0m"; -char *INCORRECT = "\x1b[31m"; -char *CORRECT = "\x1b[32m"; -char *OUTOFPLACE = "\x1b[33m"; -char *ASCII = "\x1b[7m"; +char *RESET = "\x1b[0m"; +char *INCORRECT = "\x1b[31m"; +char *CORRECT = "\x1b[32m"; +char *OUTOFPLACE = "\x1b[33m"; +char *ASCII = "\x1b[7m"; + +char *RESET_USER = "\x1b[0m"; +char *INCORRECT_USER = "\x1b[31m"; +char *CORRECT_USER = "\x1b[32m"; +char *OUTOFPLACE_USER = "\x1b[33m"; +char *ASCII_USER = "\x1b[7m"; -int flag_verbose = 0; -int flag_worldlist = 0; int flag_light_theme = 0; +int flag_user_theme = 0; +int flag_verbose = 0; +int flag_wordlist = 0; int len_wordlist = 0; int lose = 0; char pf_props[6][5][2] = { @@ -80,6 +87,7 @@ void put_word_into_playfield(char word[]); int search_word(char word[], char target); int search_wordlist(char wordlist[][6], char target[]); void set_theme(); +void set_user_theme(); void show(); void show_win_lose_message(); @@ -92,23 +100,38 @@ int argparse(int argc, char *argv[]) { /* look for invalid arguments */ - if (strcmp(argv[i], argv[0]) != 0 && - strcmp(argv[i], "-h") != 0 && - strcmp(argv[i], "--help") != 0 && - strcmp(argv[i], "-l") != 0 && - strcmp(argv[i], "--light-theme") != 0 && - strcmp(argv[i], "-t") != 0 && - strcmp(argv[i], "--theme") != 0 - strcmp(argv[i], "-v") != 0 && - strcmp(argv[i], "--verbose") != 0 && - strcmp(argv[i], "-w") != 0 && - strcmp(argv[i-1], "-w") != 0 && - strcmp(argv[i], "--wordlist") != 0 && - strcmp(argv[i-1], "--wordlist") != 0 && + if (strcmp(argv[i], argv[0]) != 0 && + strcmp(argv[i], "-h") != 0 && + strcmp(argv[i], "--help") != 0 && + strcmp(argv[i], "-l") != 0 && + strcmp(argv[i], "--light-theme") != 0 && + strcmp(argv[i], "-t") != 0 && + strcmp(argv[i], "--theme") != 0 && + strcmp(argv[i-1], "-t") != 0 && // RESET color + strcmp(argv[i-1], "--theme") != 0 && + strcmp(argv[i-2], "-t") != 0 && // INCORRECT color, + strcmp(argv[i-2], "--theme") != 0 && + strcmp(argv[i-3], "-t") != 0 && // CORRECT color + strcmp(argv[i-3], "--theme") != 0 && + strcmp(argv[i-4], "-t") != 0 && // OUTOFPLACE color + strcmp(argv[i-4], "--theme") != 0 && + strcmp(argv[i-5], "-t") != 0 && // ASCII color + strcmp(argv[i-5], "--theme") != 0 && + strcmp(argv[i], "-v") != 0 && + strcmp(argv[i], "--verbose") != 0 && ) { fprintf(stderr, "Invalid argument %s\n", argv[i]); flag_error = 1; } + if (strcmp(argv[i], "-w") != 0 && + strcmp(argv[i], "--wordlist") != 0 + ) { + if (strcmp(argv[i-1], "-w") != 0 && + strcmp(argv[i-1], "--wordlist") != 0 + ) { + + } + } /* print the help & usage @@ -149,28 +172,43 @@ int argparse(int argc, char *argv[]) { /* getting the path to the wordlist */ - if (strcmp(argv[i], "--wordlist") == 0 && flag_worldlist == 0) { - flag_worldlist = 1; + if (strcmp(argv[i], "--wordlist") == 0 && flag_wordlist == 0) { + flag_wordlist = 1; if (argv[i+1] != NULL) { // if there is an argument present after that, read it as the wordlist path strcpy(wordlist_path, argv[i+1]); } else { fprintf(stderr, "Missing argument after %s\nUsage: %s \n", argv[i], argv[i]); flag_error = 1; } - } else if (strcmp(argv[i], "--wordlist") != 0 && flag_worldlist == 0) { + } else if (strcmp(argv[i], "--wordlist") != 0 && flag_wordlist == 0) { strcpy(wordlist_path, "lib/wordlist"); + flag_wordlist = 1; } // -------------------------------------------------------------- - if (strcmp(argv[i], "--wordlist") == 0 && flag_worldlist == 0) { - flag_worldlist = 1; + if (strcmp(argv[i], "-w") == 0 && flag_wordlist == 0) { + flag_wordlist = 1; if (argv[i+1] != NULL) { // if there is an argument present after that, read it as the wordlist path strcpy(wordlist_path, argv[i+1]); } else { fprintf(stderr, "Missing argument after %s\nUsage: %s \n", argv[i], argv[i]); flag_error = 1; } - } else if (strcmp(argv[i], "--wordlist") != 0 && flag_worldlist == 0) { + } else if (strcmp(argv[i], "-w") != 0 && flag_wordlist == 0) { strcpy(wordlist_path, "lib/wordlist"); + flag_wordlist = 1; + } + + /* + getting user-specified theme colors + */ + if (strcmp(argv[i], "-t") != 0 && flag_user_theme == 0) { + flag_user_theme = 1; + set_user_theme(argv[i+1], argv[i+2], argv[i+3], argv[i+4], argv[i+5]); + } + // -------------------------------------------------------------- + if (strcmp(argv[i], "--theme") != 0 && flag_user_theme == 0) { + flag_user_theme = 1; + set_user_theme(argv[i+1], argv[i+2], argv[i+3], argv[i+4], argv[i+5]); } } @@ -324,7 +362,7 @@ int main(int argc, char *argv[]) { } // set light/dark theme - set_theme(); + if (flag_user_theme == 0) set_theme(); // prerequisite 1 get_random_word(word_to_guess, wordlist_path); @@ -353,13 +391,12 @@ void print_help_and_usage() { " specify a custom wordlist\n" " RULES: five characters on each line (no empty lines),\n" " each new line is separated by '\\n' (Enter/Return)\n" - "-t/--theme \n" // TODO: make work + "-t/--theme \n" // TODO: make work " specify the colors in which the playfield will be visible\n" " RULES: choose the color from this list:\n" - " [ black, red, green, yellow, blue, magenta, cyan, white ]\n" - " append ':b' (background color) or ':f' (foreground color)\n" - " add a ';' between the background and foreground colors\n" - " EXAMPLE: '-t green:f;black:b cyan:b;white:f red:b;black:f white:b;black:f'\n" + " [ 'x' (default/reset), 'b' (black), 'r' (red), 'g' (green), 'y' (yellow), 'l' (blue), 'm' (magenta), 'c' (cyan), 'w' (white) ]\n" + " the format is \n" + " EXAMPLE: '-t xx gb bw bb wb'\n" "-l/--light-theme\n" " activate light theme\n" "-v/--verbose\n" @@ -413,24 +450,280 @@ int search_wordlist(char wordlist[][6], char target[]) { } /* - set the theme (light/dark) + set the theme (light/dark/user-specified) */ void set_theme() { - if (flag_light_theme == 1) { - RESET = "\x1b[0;0m"; - INCORRECT = "\x1b[0;41m"; - CORRECT = "\x1b[0;42m"; - OUTOFPLACE = "\x1b[0;43m"; - ASCII = "\x1b[0;7m"; + if (flag_user_theme != 1) { + // handle light/dark mode + if (flag_light_theme == 1) { + RESET = "\x1b[0;0m"; + INCORRECT = "\x1b[0;41m"; + CORRECT = "\x1b[0;42m"; + OUTOFPLACE = "\x1b[0;43m"; + ASCII = "\x1b[0;7m"; + } else { + RESET = "\x1b[37;0m"; + INCORRECT = "\x1b[37;41m"; + CORRECT = "\x1b[37;42m"; + OUTOFPLACE = "\x1b[37;43m"; + ASCII = "\x1b[37;90m"; + } } else { - RESET = "\x1b[37;0m"; - INCORRECT = "\x1b[37;41m"; - CORRECT = "\x1b[37;42m"; - OUTOFPLACE = "\x1b[37;43m"; - ASCII = "\x1b[37;90m"; + // handle user-specified theme + + strcpy(RESET, RESET_USER); + strcpy(INCORRECT, INCORRECT_USER); + strcpy(CORRECT, CORRECT_USER); + strcpy(OUTOFPLACE, OUTOFPLACE_USER); + strcpy(ASCII, ASCII_USER); } } +/* + set user-specified theme +*/ +void set_user_theme(char reset[], char incorrect[], char correct[], char outofplace[], char ascii[]) { + /* x = reset + * b = black + * r = red + * g = green + * y = yellow + * l = blue + * m = magenta + * c = cyan + * w = white + */ + + int reset_int[2]; + int incorrect_int[2]; + int correct_int[2]; + int outofplace_int[2]; + int ascii_int[2]; + + // converting the flags into usable numbers + for (int i = 0; i < 2; i++) { + switch (reset[i]) { + case 'x': + if (i == 0) reset_int[i] = 0; + if (i == 1) reset_int[i] = 0; + break; + case 'b': + if (i == 0) reset_int[i] = 30; + if (i == 1) reset_int[i] = 40; + break; + case 'r': + if (i == 0) reset_int[i] = 31; + if (i == 1) reset_int[i] = 41; + break; + case 'g': + if (i == 0) reset_int[i] = 32; + if (i == 1) reset_int[i] = 42; + break; + case 'y': + if (i == 0) reset_int[i] = 33; + if (i == 1) reset_int[i] = 43; + break; + case 'l': + if (i == 0) reset_int[i] = 34; + if (i == 1) reset_int[i] = 44; + break; + case 'm': + if (i == 0) reset_int[i] = 35; + if (i == 1) reset_int[i] = 45; + break; + case 'c': + if (i == 0) reset_int[i] = 36; + if (i == 1) reset_int[i] = 46; + break; + case 'w': + if (i == 0) reset_int[i] = 37; + if (i == 1) reset_int[i] = 47; + break; + } + } + + for (int i = 0; i < 2; i++) { + switch (incorrect[i]) { + case 'x': + if (i == 0) incorrect_int[i] = 0; + if (i == 1) incorrect_int[i] = 0; + break; + case 'b': + if (i == 0) incorrect_int[i] = 30; + if (i == 1) incorrect_int[i] = 40; + break; + case 'r': + if (i == 0) incorrect_int[i] = 31; + if (i == 1) incorrect_int[i] = 41; + break; + case 'g': + if (i == 0) incorrect_int[i] = 32; + if (i == 1) incorrect_int[i] = 42; + break; + case 'y': + if (i == 0) incorrect_int[i] = 33; + if (i == 1) incorrect_int[i] = 43; + break; + case 'l': + if (i == 0) incorrect_int[i] = 34; + if (i == 1) incorrect_int[i] = 44; + break; + case 'm': + if (i == 0) incorrect_int[i] = 35; + if (i == 1) incorrect_int[i] = 45; + break; + case 'c': + if (i == 0) incorrect_int[i] = 36; + if (i == 1) incorrect_int[i] = 46; + break; + case 'w': + if (i == 0) incorrect_int[i] = 37; + if (i == 1) incorrect_int[i] = 47; + break; + } + } + + for (int i = 0; i < 2; i++) { + switch (correct[i]) { + case 'x': + if (i == 0) correct_int[i] = 0; + if (i == 1) correct_int[i] = 0; + break; + case 'b': + if (i == 0) correct_int[i] = 30; + if (i == 1) correct_int[i] = 40; + break; + case 'r': + if (i == 0) correct_int[i] = 31; + if (i == 1) correct_int[i] = 41; + break; + case 'g': + if (i == 0) correct_int[i] = 32; + if (i == 1) correct_int[i] = 42; + break; + case 'y': + if (i == 0) correct_int[i] = 33; + if (i == 1) correct_int[i] = 43; + break; + case 'l': + if (i == 0) correct_int[i] = 34; + if (i == 1) correct_int[i] = 44; + break; + case 'm': + if (i == 0) correct_int[i] = 35; + if (i == 1) correct_int[i] = 45; + break; + case 'c': + if (i == 0) correct_int[i] = 36; + if (i == 1) correct_int[i] = 46; + break; + case 'w': + if (i == 0) correct_int[i] = 37; + if (i == 1) correct_int[i] = 47; + break; + } + } + + for (int i = 0; i < 2; i++) { + switch (outofplace[i]) { + case 'x': + if (i == 0) outofplace_int[i] = 0; + if (i == 1) outofplace_int[i] = 0; + break; + case 'b': + if (i == 0) outofplace_int[i] = 30; + if (i == 1) outofplace_int[i] = 40; + break; + case 'r': + if (i == 0) outofplace_int[i] = 31; + if (i == 1) outofplace_int[i] = 41; + break; + case 'g': + if (i == 0) outofplace_int[i] = 32; + if (i == 1) outofplace_int[i] = 42; + break; + case 'y': + if (i == 0) outofplace_int[i] = 33; + if (i == 1) outofplace_int[i] = 43; + break; + case 'l': + if (i == 0) outofplace_int[i] = 34; + if (i == 1) outofplace_int[i] = 44; + break; + case 'm': + if (i == 0) outofplace_int[i] = 35; + if (i == 1) outofplace_int[i] = 45; + break; + case 'c': + if (i == 0) outofplace_int[i] = 36; + if (i == 1) outofplace_int[i] = 46; + break; + case 'w': + if (i == 0) outofplace_int[i] = 37; + if (i == 1) outofplace_int[i] = 47; + break; + } + } + + for (int i = 0; i < 2; i++) { + switch (ascii[i]) { + case 'x': + if (i == 0) ascii_int[i] = 0; + if (i == 1) ascii_int[i] = 0; + break; + case 'b': + if (i == 0) ascii_int[i] = 30; + if (i == 1) ascii_int[i] = 40; + break; + case 'r': + if (i == 0) ascii_int[i] = 31; + if (i == 1) ascii_int[i] = 41; + break; + case 'g': + if (i == 0) ascii_int[i] = 32; + if (i == 1) ascii_int[i] = 42; + break; + case 'y': + if (i == 0) ascii_int[i] = 33; + if (i == 1) ascii_int[i] = 43; + break; + case 'l': + if (i == 0) ascii_int[i] = 34; + if (i == 1) ascii_int[i] = 44; + break; + case 'm': + if (i == 0) ascii_int[i] = 35; + if (i == 1) ascii_int[i] = 45; + break; + case 'c': + if (i == 0) ascii_int[i] = 36; + if (i == 1) ascii_int[i] = 46; + break; + case 'w': + if (i == 0) ascii_int[i] = 37; + if (i == 1) ascii_int[i] = 47; + break; + } + } + + int reset_f = reset_int[0]; + int reset_b = reset_int[1]; + int incorrect_f = incorrect_int[0]; + int incorrect_b = incorrect_int[1]; + int correct_f = correct_int[0]; + int correct_b = correct_int[1]; + int outofplace_f = outofplace_int[0]; + int outofplace_b = outofplace_int[1]; + int ascii_f = ascii_int[0]; + int ascii_b = ascii_int[1]; + + sprintf(RESET_USER, "\x1b[%d;%dm", reset_f, reset_b); + sprintf(INCORRECT_USER, "\x1b[%d;%dm", incorrect_f, incorrect_b); + sprintf(CORRECT_USER, "\x1b[%d;%dm", correct_f, correct_b); + sprintf(OUTOFPLACE_USER, "\x1b[%d;%dm", outofplace_f, outofplace_b); + sprintf(ASCII_USER, "\x1b[%d;%dm", ascii_f, ascii_b); +} + /* prints the current state of the game shows