diff --git a/.gitignore b/.gitignore index 97fedc6..7ac3b40 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,4 @@ /inv.txt /inv_users.txt /polls.txt -/elem.tar.gz -/combos.txt \ No newline at end of file +/elem.tar.gz \ No newline at end of file diff --git a/README.md b/README.md index d5d6b6f..f95e7a8 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ # Elemental on Command Line This is an elemental combination game written in C, with optional multi-player support. -## Clients -- [PenguinMod client](https://studio.penguinmod.com/?fps=200&clones=Infinity&offscreen&size=850x480#7218964246) for playing the game online with a fancy interface -- [Discord client](https://discord.gg/DKZTWyWH3B) for playing the game publicly with other Discord members -- [Web client](https://elem.dervland.net/index.html) for a demo of the multiplayer version -- [Original client](https://git.dervland.net/elemental/elemental-on-terminal/releases) for developers, administrators, and command line fans - ## Single-player A single-player example pack is provided as an example in ``bin/combos.txt``. This can be customized by the user, although internal limitations require the combination string to be in alphabetical order. ## Multi-player -To set up multi-player mode, use the guide with the [Web proxy](https://git.dervland.net/elemental/elemental-to-web). \ No newline at end of file +To set up multi-player mode, create a directory ``../elem_data``. Also, create separate directories for each user that plays. + +The game can now be played with the following syntax, inside your user directory: +```sh +cd ../your_user_dir +../elemental-command-line/bin/elem your_username +``` \ No newline at end of file diff --git a/src/command.c b/src/command.c index 749cbdc..e03572f 100644 --- a/src/command.c +++ b/src/command.c @@ -1,11 +1,10 @@ #include "map.h" -#include #include #include #include #include #include -#include "loader.h" + #include "main.h" // huge cleanup operation soon @@ -81,7 +80,7 @@ int inv_handler(const void *key, size_t size, uintptr_t val, void *usr) { if (val2[strlen(val2) - 1] == '\n') { printf("- user:%s suggested %s", key3, val2); } else { - printf("- user:%s suggested %s\n", key3, val2); + printf("- user:%s suggested %s\n", key3, val2); } free(key3); @@ -104,52 +103,36 @@ int inv_handler(const void *key, size_t size, uintptr_t val, void *usr) { int polls_handler(const void *key, size_t size, uintptr_t val, void *usr) { struct verifier *verified = (struct verifier *)usr; - char *val2 = (char *)val; - char *val3 = malloc(strlen(val2) + 1); - strcpy(val3, val2); - - if (val3[strlen(val3) - 1] == '\n') { - val3[strlen(val3) - 1] = '\0'; + if (((char *)val)[strlen(((char *)val)) - 1] == '\n') { + ((char *)val)[strlen(((char *)val)) - 1] = '\0'; } if (strncmp(verified->name, key, strlen(verified->name)) == 0 && - strcmp(verified->sugg, val3) == 0) { - free(val3); + strcmp(verified->sugg, (char *)val) == 0) return -1; - } - free(val3); return 0; } int success_handler(const void *key, size_t size, uintptr_t val, void *usr) { struct succ *verified = (struct succ *)usr; - char *val2 = (char *)val; - char *val3 = malloc(strlen(val2) + 1); - strcpy(val3, val2); + char *val2 = (char*) val; - if (val3[strlen(val3) - 1] == '\n') { - val3[strlen(val3) - 1] = '\0'; + if ((char *)val != verified->sugg && val2[strlen(val2) - 1] == '\n') { + val2[strlen(val2) - 1] = '\0'; } - if (strcmp(verified->sugg, val3) == 0) { + if (strcmp(verified->sugg, (char *)val) == 0) { verified->points[0]++; } - free(val3); - return 0; } char *handle_pages(char *command, char *invs) { - char *data; - char *data2; if (strncmp(command, invs, strlen(invs)) == 0) { - data = &command[strlen(invs)]; - data2 = malloc(strlen(data) + 1); - memcpy(data2,data,strlen(data) + 1); - return data2; + return &command[strlen(invs)]; } else { return 0; } @@ -165,7 +148,7 @@ int handle_pages_int(char *command, char *invs) { } } -int suggest_command(char *command, char *command_re, hashmap *polls, hashmap *combos, char *name, +int suggest_command(char *command, char *command_re, hashmap *polls, char *name, int was_combination) { char *page = handle_pages(command, "/suggest "); @@ -183,8 +166,6 @@ int suggest_command(char *command, char *command_re, hashmap *polls, hashmap *co char *val = calloc(MAX_BUF_LENGTH, sizeof(char)); sprintf(val, "%s;%s", page, command_re); - srand(time(NULL)); - char *key = calloc(MAX_BUF_LENGTH, sizeof(char)); sprintf(key, "%s_%i", name, (int)rand()); @@ -212,9 +193,12 @@ int suggest_command(char *command, char *command_re, hashmap *polls, hashmap *co printf("Poll was added into the game!\n"); FILE *fptr; - hashmap_set(combos, command_re, strlen(command_re), (uintptr_t)page, 0); - - write_elements(combos, "../elem_data/" COMBO_FILE, 0); + fptr = fopen("../elem_data/" combo_file, "a"); + if (fptr == NULL) + return 1; + fwrite(val, sizeof(char), strlen(val), fptr); + fwrite("\n", sizeof(char), 1, fptr); + fclose(fptr); return 1; } @@ -224,7 +208,14 @@ int suggest_command(char *command, char *command_re, hashmap *polls, hashmap *co FILE *fptr; - write_elements(polls, "../elem_data/" POLL_FILE, 3); + fptr = fopen("../elem_data/" poll_file, "a"); + if (fptr == NULL) + return 1; + fwrite(key, sizeof(char), strlen(key), fptr); + fwrite(";", sizeof(char), 1, fptr); + fwrite(val, sizeof(char), strlen(val), fptr); + fwrite("\n", sizeof(char), 1, fptr); + fclose(fptr); return 1; } diff --git a/src/command.h b/src/command.h index cdd78bf..bba66a4 100644 --- a/src/command.h +++ b/src/command.h @@ -2,7 +2,7 @@ int get_command(char *command, char *command_re, char **sort_tmp); int slash_command(char *command, hashmap *inv); int suggest_command(char *command, char *command_re, hashmap *polls, - hashmap *combos, char *name, int was_combination); + char *name, int was_combination); int help_command(char *command); int polls_command(char *command, hashmap *polls, hashmap *cmd); int path_command(char *command, hashmap *elements_rev, hashmap *already_done, diff --git a/src/loader.c b/src/loader.c index a41a19d..67c3efe 100644 --- a/src/loader.c +++ b/src/loader.c @@ -6,58 +6,7 @@ #include "main.h" -struct write_struct { - FILE *fptr; - int mode; -}; - -int entry_handler(const void *key, size_t size, uintptr_t val, void *usr) { - struct write_struct *usr2 = (struct write_struct *)usr; - - char *val2 = (char *)val; - char *key2 = (char *)key; - - if (usr2->mode == 0) { - fwrite(val2, sizeof(char), strlen(val2), usr2->fptr); - fwrite(";", sizeof(char), 1, usr2->fptr); - fwrite(key2, sizeof(char), strlen(key2), usr2->fptr); - if (key2[strlen(key2) - 1] != '\n') { - fwrite("\n", sizeof(char), 1, usr2->fptr); - } - } else if (usr2->mode == 1) { - fwrite(key2, sizeof(char), strlen(key2), usr2->fptr); - if (key2[strlen(key2) - 1] != '\n') { - fwrite("\n", sizeof(char), 1, usr2->fptr); - } - } else { - fwrite(key2, sizeof(char), strlen(key2), usr2->fptr); - fwrite(";", sizeof(char), 1, usr2->fptr); - fwrite(val2, sizeof(char), strlen(val2), usr2->fptr); - if (val2[strlen(val2) - 1] != '\n') { - fwrite("\n", sizeof(char), 1, usr2->fptr); - } - } - - return 1; -} - -void write_elements(hashmap *m, char *table, int mode) { - FILE *fptr; - - fptr = fopen(table, "w"); - - if (fptr == NULL) - return; - - struct write_struct writer = {.fptr = fptr, .mode = mode}; - - hashmap_iterate(m, entry_handler, (void *)&writer); - //fwrite("\n", sizeof(char), 1, fptr); - - fclose(fptr); -} - -int load_elements(hashmap *m, char *table, int mode) { +int load_elements(hashmap *m, char *table, int use_inv) { FILE *fptr; fptr = fopen(table, "r"); @@ -70,8 +19,6 @@ int load_elements(hashmap *m, char *table, int mode) { int did_something = 0; - int lines_get = 0; - while (1) { str2 = calloc(MAX_FILE_SIZE, sizeof(char)); if (!fgets(str2, MAX_FILE_SIZE, fptr)) { @@ -79,15 +26,13 @@ int load_elements(hashmap *m, char *table, int mode) { break; } - lines_get++; - str = calloc(strlen(str2) + 1, sizeof(char)); strcpy(str, str2); free(str2); did_something = 1; - if (mode == 1) { + if (use_inv == 1) { hashmap_set(m, str, strlen(str) - 1, (uintptr_t)1, 0); continue; } @@ -99,7 +44,7 @@ int load_elements(hashmap *m, char *table, int mode) { char *combo = calloc(strlen(combo_o) + 1, sizeof(char)); strcpy(combo, combo_o); - if (mode == 3) { + if (use_inv == 3) { uintptr_t result; hashmap_get(m, str, strlen(str) - 1, &result); @@ -109,7 +54,7 @@ int load_elements(hashmap *m, char *table, int mode) { continue; } - if (mode == 2 || mode == 3) { + if (use_inv == 2 || use_inv == 3) { hashmap_set(m, str, strlen(str) - 1, (uintptr_t)combo, 1); continue; } diff --git a/src/loader.h b/src/loader.h index ad57b8d..116d3ad 100644 --- a/src/loader.h +++ b/src/loader.h @@ -1,3 +1,2 @@ #include "map.h" -int load_elements(hashmap *m, char *table, int mode); -void write_elements(hashmap *m, char *table, int mode); \ No newline at end of file +int load_elements(hashmap *m, char *table, int use_inv); \ No newline at end of file diff --git a/src/main.c b/src/main.c index 0028bb7..69f9365 100644 --- a/src/main.c +++ b/src/main.c @@ -1,6 +1,5 @@ #include "command.h" #include "loader.h" -#include "map.h" #include #include #include @@ -13,24 +12,24 @@ void init_tables(hashmap *elements, hashmap *inv, hashmap *polls, hashmap *elements_rev, int do_inv) { - load_elements(elements, "../elem_data/" COMBO_FILE, 0); - load_elements(elements, COMBO_FILE, 0) || - load_elements(elements, "bin/" COMBO_FILE, 0); + load_elements(elements, "../elem_data/" combo_file, 0); + load_elements(elements, combo_file, 0) || + load_elements(elements, "bin/" combo_file, 0); - load_elements(elements_rev, "../elem_data/" COMBO_FILE, 3); - load_elements(elements_rev, COMBO_FILE, 3) || - load_elements(elements_rev, "bin/" COMBO_FILE, 3); + load_elements(elements_rev, "../elem_data/" combo_file, 3); + load_elements(elements_rev, combo_file, 3) || + load_elements(elements_rev, "bin/" combo_file, 3); - load_elements(polls, "../elem_data/" POLL_FILE, 3); + load_elements(polls, "../elem_data/" poll_file, 2); if (!do_inv) return; - load_elements(inv, "../elem_data/" INV_BASE_FILE, 1) || - load_elements(inv, INV_BASE_FILE, 1) || - load_elements(inv, "bin/" INV_BASE_FILE, 1); + load_elements(inv, "../elem_data/" inv_base_file, 1) || + load_elements(inv, inv_base_file, 1) || + load_elements(inv, "bin/" inv_base_file, 1); - load_elements(inv, INV_FILE, 1); + load_elements(inv, inv_file, 1); } int main(int argc, char *argv[]) { @@ -82,17 +81,14 @@ int main(int argc, char *argv[]) { } if (was_combination && - suggest_command(command, command_re, polls, elements, name, was_combination)) { + suggest_command(command, command_re, polls, name, was_combination)) { continue; } was_combination = 0; if (help_command(command)) continue; - if (polls_command(command, polls, elements)) { - hashmap_free(polls); - polls = hashmap_create(); - init_tables(elements, inv, polls, elements_rev, 0); - } + if (polls_command(command, polls, elements)) + continue; if (slash_command(command, inv)) continue; @@ -152,7 +148,15 @@ int main(int argc, char *argv[]) { hashmap_set(inv, res_str, strlen(res_str), (uintptr_t)1, 0); printf("You made %s!\n", res_str); - write_elements(inv, INV_FILE, 1); + + FILE *fptr; + + fptr = fopen(inv_file, "a"); + if (fptr == NULL) + continue; + fwrite(res_str, sizeof(char), strlen(res_str), fptr); + fwrite("\n", sizeof(char), 1, fptr); + fclose(fptr); } // free(command); diff --git a/src/main.h b/src/main.h index 9e1ac77..7761ac3 100644 --- a/src/main.h +++ b/src/main.h @@ -1,9 +1,9 @@ -#define INV_FILE "inv.txt" -#define INV_BASE_FILE "inv_base.txt" -#define COMBO_FILE "combos.txt" -#define POLL_FILE "polls.txt" -#define POLLS_LOCK_FILE "polls_lock.txt" -#define LB_FILE "lb.txt" +#define inv_file "inv.txt" +#define inv_base_file "inv_base.txt" +#define combo_file "combos.txt" +#define poll_file "polls.txt" +#define polls_lock_file "polls_lock.txt" +#define lb_file "lb.txt" #define MAX_BUF_LENGTH 1024 #define MAX_COMBO_LENGTH 1024 diff --git a/wrap.sh b/wrap.sh index dce3017..a15f60a 100755 --- a/wrap.sh +++ b/wrap.sh @@ -1,6 +1,6 @@ make CC=x86_64-w64-mingw32-gcc BIN=bin/elem.exe make CC=i686-w64-mingw32-gcc BIN=bin/elem_32.exe make -strip --strip-all bin/elem rm elem.tar.gz -tar -cvf elem.tar.gz bin \ No newline at end of file +tar -cvf elem.tar.gz bin +strip --strip-all bin/elem \ No newline at end of file