Compare commits

..

8 commits
0.5.9 ... main

9 changed files with 113 additions and 62 deletions

3
.gitignore vendored
View file

@ -4,4 +4,5 @@
/inv.txt
/inv_users.txt
/polls.txt
/elem.tar.gz
/elem.tar.gz
/combos.txt

View file

@ -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/) 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, 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
```
To set up multi-player mode, use the guide with the [Web proxy](https://git.dervland.net/elemental/elemental-to-web).

View file

@ -1,10 +1,11 @@
#include "map.h"
#include <time.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include "loader.h"
#include "main.h"
// huge cleanup operation soon
@ -142,8 +143,13 @@ int success_handler(const void *key, size_t size, uintptr_t val, void *usr) {
}
char *handle_pages(char *command, char *invs) {
char *data;
char *data2;
if (strncmp(command, invs, strlen(invs)) == 0) {
return &command[strlen(invs)];
data = &command[strlen(invs)];
data2 = malloc(strlen(data) + 1);
memcpy(data2,data,strlen(data) + 1);
return data2;
} else {
return 0;
}
@ -159,7 +165,7 @@ int handle_pages_int(char *command, char *invs) {
}
}
int suggest_command(char *command, char *command_re, hashmap *polls, char *name,
int suggest_command(char *command, char *command_re, hashmap *polls, hashmap *combos, char *name,
int was_combination) {
char *page = handle_pages(command, "/suggest ");
@ -177,6 +183,8 @@ int suggest_command(char *command, char *command_re, hashmap *polls, char *name,
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());
@ -204,12 +212,9 @@ int suggest_command(char *command, char *command_re, hashmap *polls, char *name,
printf("Poll was added into the game!\n");
FILE *fptr;
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);
hashmap_set(combos, command_re, strlen(command_re), (uintptr_t)page, 0);
write_elements(combos, "../elem_data/" COMBO_FILE, 0);
return 1;
}
@ -219,14 +224,7 @@ int suggest_command(char *command, char *command_re, hashmap *polls, char *name,
FILE *fptr;
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);
write_elements(polls, "../elem_data/" POLL_FILE, 3);
return 1;
}

View file

@ -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,
char *name, int was_combination);
hashmap *combos, 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,

View file

@ -6,7 +6,58 @@
#include "main.h"
int load_elements(hashmap *m, char *table, int use_inv) {
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) {
FILE *fptr;
fptr = fopen(table, "r");
@ -19,6 +70,8 @@ int load_elements(hashmap *m, char *table, int use_inv) {
int did_something = 0;
int lines_get = 0;
while (1) {
str2 = calloc(MAX_FILE_SIZE, sizeof(char));
if (!fgets(str2, MAX_FILE_SIZE, fptr)) {
@ -26,13 +79,15 @@ int load_elements(hashmap *m, char *table, int use_inv) {
break;
}
lines_get++;
str = calloc(strlen(str2) + 1, sizeof(char));
strcpy(str, str2);
free(str2);
did_something = 1;
if (use_inv == 1) {
if (mode == 1) {
hashmap_set(m, str, strlen(str) - 1, (uintptr_t)1, 0);
continue;
}
@ -44,7 +99,7 @@ int load_elements(hashmap *m, char *table, int use_inv) {
char *combo = calloc(strlen(combo_o) + 1, sizeof(char));
strcpy(combo, combo_o);
if (use_inv == 3) {
if (mode == 3) {
uintptr_t result;
hashmap_get(m, str, strlen(str) - 1, &result);
@ -54,7 +109,7 @@ int load_elements(hashmap *m, char *table, int use_inv) {
continue;
}
if (use_inv == 2 || use_inv == 3) {
if (mode == 2 || mode == 3) {
hashmap_set(m, str, strlen(str) - 1, (uintptr_t)combo, 1);
continue;
}

View file

@ -1,2 +1,3 @@
#include "map.h"
int load_elements(hashmap *m, char *table, int use_inv);
int load_elements(hashmap *m, char *table, int mode);
void write_elements(hashmap *m, char *table, int mode);

View file

@ -1,5 +1,6 @@
#include "command.h"
#include "loader.h"
#include "map.h"
#include <ctype.h>
#include <stdint.h>
#include <stdio.h>
@ -12,24 +13,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, 3);
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[]) {
@ -81,14 +82,17 @@ int main(int argc, char *argv[]) {
}
if (was_combination &&
suggest_command(command, command_re, polls, name, was_combination)) {
suggest_command(command, command_re, polls, elements, name, was_combination)) {
continue;
}
was_combination = 0;
if (help_command(command))
continue;
if (polls_command(command, polls, elements))
continue;
if (polls_command(command, polls, elements)) {
hashmap_free(polls);
polls = hashmap_create();
init_tables(elements, inv, polls, elements_rev, 0);
}
if (slash_command(command, inv))
continue;
@ -148,15 +152,7 @@ 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);
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);
write_elements(inv, INV_FILE, 1);
}
// free(command);

View file

@ -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

View file

@ -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
strip --strip-all bin/elem
tar -cvf elem.tar.gz bin