123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493 |
- /*
- Space Construct by Beanzilla
- Beanzilla@21:4/110 on fsxNet
- */
- // Verion 0.1-dev
- #define VERSION_MAJOR 0
- #define VERSION_MINOR 1
- #ifndef VERSION_TYPE
- #define VERSION_TYPE "dev"
- #endif
- #define PATH_MAX 256
- #define PATH_SEP "/"
- #include <MagiDoor.h>
- #include <sqlite3.h>
- #if defined(_MSC_VER) || defined(WIN32)
- #define snprintf _snprintf
- #define strcasecmp _stricmp
- #include <winsock2.h>
- #ifndef _MSC_VER
- #define _MSC_VER 1
- #endif
- #else
- #include <arpa/inet.h>
- #endif
- // Standard C
- #include <time.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <stdarg.h>
- #include <ctype.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <unistd.h> // stat
- char * log_path = "logs";
- int inuse = 0; // Are any other copies of us running? (We are a single door!)
- int debug = 0; // Are we in debug mode?
- // User Structure (This includes guns, fuel, armor, shields, HP)
- typedef struct user_info {
- int uid; // Primary Key
- int experience; // Think about this as score
- // Was ship structure, now is part of user
- int guns; // Placed Guns, More means more damage (Deals from 1-2 damage per attack)
- int fuel; // How many "turns" do we have
- int metal; // Used to build more guns/armors/shields possibly fuel too (guns take 5, armor takes 3, shields take 7, maybe fuel takes 12)
- int armors; // Placed Armors (Each Armor takes 4 points of damage then breaks off)
- int shields; // Placed Shields (Each Shields takes 3 points of damage then is offline, regenerates 1 point per attack/turn must reach 50% of max to being protecting again)
- int hitpoints; // Total hitpoints till we die (Rules for taking damage, shields first then armor then hitpoints)
- int armorpoints; // Points we get from armors (Repairable but costs 1 metal per point, but can break if taking too much damage)
- int shieldpoints; // Points we get from shields (Self-Regenerates, and does not get destroyed)
- char nick[256]; // What they go by on score board, this allows duping since we really go by real
- char real[256]; // Their real name to match with drop file info, prevents someone from loging in as another
- } user_inf;
- void dolog(char *fmt, ...) {
- // Low end Logging
- char buffer[PATH_MAX];
- struct tm *time_now;
- time_t timen;
- FILE *logfptr;
- timen = time(NULL);
- time_now = localtime(&timen);
- if (log_path != NULL) {
- snprintf(buffer, PATH_MAX, "%s%s%04d%02d%02d.log", log_path, PATH_SEP,
- time_now->tm_year + 1900, time_now->tm_mon + 1, time_now->tm_mday);
- } else {
- snprintf(buffer, PATH_MAX, "%04d%02d%02d.log", time_now->tm_year + 1900,
- time_now->tm_mon + 1, time_now->tm_mday);
- }
- logfptr = fopen(buffer, "a");
- if (!logfptr) {
- return;
- }
- va_list ap;
- va_start(ap, fmt);
- vsnprintf(buffer, 512, fmt, ap);
- va_end(ap);
- fprintf(logfptr, "%02d:%02d:%02d %s\n", time_now->tm_hour, time_now->tm_min,
- time_now->tm_sec, buffer);
- fclose(logfptr);
- }
- void db_test() {
- sqlite3 *db;
- sqlite3_stmt *stmt;
- char sqlbuffer[256];
- char strbuffer[256];
- int rc = sqlite3_open("spaceconstruct.db3", &db);
- if(rc) { // Did we do a successful open?
- dolog("E: failed opening database %s", sqlite3_errmsg(db));
- sqlite3_close(db);
- md_exit(1);
- }
- sqlite3_busy_timeout(db, 5000);
- // DB open
- strcpy(sqlbuffer, "SELECT * FROM user;");
- sqlite3_prepare_v2(db, sqlbuffer, strlen(sqlbuffer), &stmt, NULL);
- while(sqlite3_step(stmt) == SQLITE_ROW) {
- /* Disabled to reduce logs to errors/warnings
- dolog("%s=%d %s=%s %s=%s %s=%d %s=%d %s=%d %s=%d %s=%d %s=%d %s=%d %s=%d %s=%d",
- sqlite3_column_name(stmt, 0), // int, uid
- sqlite3_column_int(stmt, 0),
- sqlite3_column_name(stmt, 1), // text, nick
- sqlite3_column_text(stmt, 1),
- sqlite3_column_name(stmt, 2), // text, real
- sqlite3_column_text(stmt, 2),
- sqlite3_column_name(stmt, 3), // int, experiece
- sqlite3_column_int(stmt, 3),
- sqlite3_column_name(stmt, 4), // int, metal
- sqlite3_column_int(stmt, 4),
- sqlite3_column_name(stmt, 5), // int, fuel
- sqlite3_column_int(stmt, 5),
- sqlite3_column_name(stmt, 6), // int, guns
- sqlite3_column_int(stmt, 6),
- sqlite3_column_name(stmt, 7), // int, armors
- sqlite3_column_int(stmt, 7),
- sqlite3_column_name(stmt, 8), // int, shields
- sqlite3_column_int(stmt, 8),
- sqlite3_column_name(stmt, 9), // int, armorpoints
- sqlite3_column_int(stmt, 9),
- sqlite3_column_name(stmt, 10), // int, shieldpoints
- sqlite3_column_int(stmt, 10),
- sqlite3_column_name(stmt, 11), // int, hitpoints
- sqlite3_column_int(stmt, 11)
- ); */
- md_printf("`white`%s=%d %s=%s %s=%s %s=%d %s=%d %s=%d %s=%d %s=%d %s=%d %s=%d %s=%d %s=%d\r\n",
- sqlite3_column_name(stmt, 0), // int, uid
- sqlite3_column_int(stmt, 0),
- sqlite3_column_name(stmt, 1), // text, nick
- sqlite3_column_text(stmt, 1),
- sqlite3_column_name(stmt, 2), // text, real
- sqlite3_column_text(stmt, 2),
- sqlite3_column_name(stmt, 3), // int, experiece
- sqlite3_column_int(stmt, 3),
- sqlite3_column_name(stmt, 4), // int, metal
- sqlite3_column_int(stmt, 4),
- sqlite3_column_name(stmt, 5), // int, fuel
- sqlite3_column_int(stmt, 5),
- sqlite3_column_name(stmt, 6), // int, guns
- sqlite3_column_int(stmt, 6),
- sqlite3_column_name(stmt, 7), // int, armors
- sqlite3_column_int(stmt, 7),
- sqlite3_column_name(stmt, 8), // int, shields
- sqlite3_column_int(stmt, 8),
- sqlite3_column_name(stmt, 9), // int, armorpoints
- sqlite3_column_int(stmt, 9),
- sqlite3_column_name(stmt, 10), // int, shieldpoints
- sqlite3_column_int(stmt, 10),
- sqlite3_column_name(stmt, 11), // int, hitpoints
- sqlite3_column_int(stmt, 11)
- );
- } // Clean up database
- sqlite3_finalize(stmt);
- sqlite3_close(db);
- }
- int check_lock() {
- // Checks stats of lock, (1 = Lock is in effect, 0 = No Lock established)
- struct stat s;
- if (stat("lock.flg", &s) == 0) {
- return 1;
- } else {
- return 0;
- }
- }
- void grab_lock() {
- // Attempt to grab lock
- int valid = check_lock();
- FILE *fhandle;
- if (valid == 0) {
- fhandle = fopen("lock.flg", "w");
- if(!fhandle) {
- dolog("E: Unable to make lock.flg!");
- fprintf(stderr, "Unable to establish lock!\r\n");
- md_exit(-1);
- }
- fprintf(fhandle, "I am in use already!\n");
- fclose(fhandle);
- } else {
- dolog("W: Lock already established!");
- }
- }
- void rel_lock() {
- // Attempt to release lock
- int valid = check_lock();
- if (valid == 1) {
- if (unlink("lock.flg") != 0) {
- dolog("E: Unable to release lock.flg!");
- fprintf(stderr, "Unable to release lock!\r\n");
- md_exit(-1);
- }
- } else {
- dolog("W: Lock already released!");
- }
- }
- void log_drop() {
- // Spits out info from Drop File:
- /* Disabled to reduce logs to errors/warnings
- dolog("First=%s Last=%s Alias=%s TimeLeft=%d SecLevel=%d Location=%s Node=%d Socket=%d Sysop=%s",
- mdcontrol.user_firstname,
- mdcontrol.user_lastname,
- mdcontrol.user_alias,
- mdcontrol.user_timeleft,
- mdcontrol.user_seclevel,
- mdcontrol.user_location,
- mdcontrol.node,
- mdcontrol.socket,
- mdcontrol.sysop_name
- );
- */
- md_printf("`white`First=%s Last=%s Alias=%s TimeLeft=%d SecLevel=%d Location=%s Node=%d Socket=%d Sysop=%s\r\n",
- mdcontrol.user_firstname,
- mdcontrol.user_lastname,
- mdcontrol.user_alias,
- mdcontrol.user_timeleft,
- mdcontrol.user_seclevel,
- mdcontrol.user_location,
- mdcontrol.node,
- mdcontrol.socket,
- mdcontrol.sysop_name
- );
- }
- void paws() {
- // Aaah, DRY
- md_printf("`white`Press any key to continue...");
- md_getc();
- md_printf("\r\n");
- }
- int locate_player(char first[], char last[]) {
- // returns user id for given real name and 0 for no record found
- sqlite3 *db;
- sqlite3_stmt *stmt;
- char sqlbuffer[256];
- int result = 0;
- char name[256];
- int rc = sqlite3_open("spaceconstruct.db3", &db);
- if(rc) { // Did we do a successful open?
- dolog("E: failed opening database %s", sqlite3_errmsg(db));
- sqlite3_close(db);
- md_exit(1);
- }
- sqlite3_busy_timeout(db, 5000);
- // Form Real Name
- strcpy(name, "");
- strcat(name, first);
- strcat(name, " ");
- strcat(name, last);
- //md_printf("realname = '%s'\r\n", name);
- // Locating user with given name
- strcpy(sqlbuffer, "SELECT * from user where real=? COLLATE NOCASE;");
- sqlite3_prepare_v2(db, sqlbuffer, strlen(sqlbuffer) + 1, &stmt, NULL);
- sqlite3_bind_text(stmt, 1, name, strlen(name), SQLITE_STATIC);
- rc = sqlite3_step(stmt);
- if (rc == SQLITE_ROW) {
- //dolog("User=%s uid=%d", name, sqlite3_column_int(stmt, 0));
- result = sqlite3_column_int(stmt, 0);
- } else {
- dolog("W: Unable to locate user=%s", name);
- result = 0;
- } // Clean Up, return results
- sqlite3_finalize(stmt);
- sqlite3_close(db);
- return result;
- }
- user_inf load_player(int uuid) {
- // Returns a player Structure from database
- sqlite3 *db;
- sqlite3_stmt *stmt;
- char sqlbuffer[256];
- user_inf result;
- int rc = sqlite3_open("spaceconstruct.db3", &db);
- if(rc) { // Did we do a successful open?
- dolog("E: failed opening database %s", sqlite3_errmsg(db));
- sqlite3_close(db);
- md_exit(1);
- }
- sqlite3_busy_timeout(db, 5000);
- strcpy(sqlbuffer, "SELECT * from user where uid=?;");
- sqlite3_prepare_v2(db, sqlbuffer, strlen(sqlbuffer) + 1, &stmt, NULL);
- sqlite3_bind_int(stmt, uuid, 1);
- rc = sqlite3_step(stmt);
- if (rc == SQLITE_ROW) {
- result.uid = sqlite3_column_int(stmt, 0);
- strcpy(result.nick, sqlite3_column_text(stmt, 1));
- strcpy(result.real, sqlite3_column_text(stmt, 2));
- result.experience = sqlite3_column_int(stmt, 3);
- result.metal = sqlite3_column_int(stmt, 4);
- result.fuel = sqlite3_column_int(stmt, 5);
- result.guns = sqlite3_column_int(stmt, 6);
- result.armors = sqlite3_column_int(stmt, 7);
- result.shields = sqlite3_column_int(stmt, 8);
- result.armorpoints = sqlite3_column_int(stmt, 9);
- result.shieldpoints = sqlite3_column_int(stmt, 10);
- result.hitpoints = sqlite3_column_int(stmt, 11);
- } else {
- dolog("E: Unable to locate user with id=%d", uuid);
- sqlite3_finalize(stmt);
- sqlite3_close(db);
- md_exit(-1);
- }
- sqlite3_finalize(stmt);
- sqlite3_close(db);
- return result;
- }
- void update_player(user_inf data) {
- sqlite3 *db;
- sqlite3_stmt *stmt;
- char sqlbuffer[1024];
- int rc = sqlite3_open("spaceconstruct.db3", &db);
- if(rc) { // Did we do a successful open?
- dolog("E: failed opening database %s", sqlite3_errmsg(db));
- sqlite3_close(db);
- md_exit(1);
- }
- sqlite3_busy_timeout(db, 5000);
- // Bad, don't do this... opens to SQL injection!
- //snprintf(sqlbuffer, 1024, "UPDATE user SET nick = '%s', experience = %d, metal = %d, fuel = %d, guns = %d, armors = %d, shields = %d, armorpoints = %d, shieldpoints = %d, hitpoints = %d WHERE uid=%d;",
- // data.nick, data.experience, data.metal, data.fuel, data.guns, data.armors, data.shields, data.armorpoints, data.shieldpoints, data.hitpoints, data.uid);
- strcpy(sqlbuffer, "UPDATE user SET nick=?, experience=?, metal=?, fuel=?, guns=?, armors=?, shields=?, armorpoints=?, shieldpoints=?, hitpoints=? WHERE uid=?;");
- sqlite3_prepare_v2(db, sqlbuffer, strlen(sqlbuffer) + 1, &stmt, NULL);
- // Bind All data values
- sqlite3_bind_text(stmt, 1, data.nick, strlen(data.nick), SQLITE_STATIC);
- sqlite3_bind_int(stmt, 2, data.experience);
- sqlite3_bind_int(stmt, 3, data.metal);
- sqlite3_bind_int(stmt, 4, data.fuel);
- sqlite3_bind_int(stmt, 5, data.guns);
- sqlite3_bind_int(stmt, 6, data.armors);
- sqlite3_bind_int(stmt, 7, data.shields);
- sqlite3_bind_int(stmt, 8, data.armorpoints);
- sqlite3_bind_int(stmt, 9, data.shieldpoints);
- sqlite3_bind_int(stmt, 10, data.hitpoints);
- sqlite3_bind_int(stmt, 11, data.uid);
- // Execute
- rc = sqlite3_step(stmt);
- if(rc != SQLITE_DONE) {
- dolog("E: failed updating player=%d got error %s (%d)", data.uid, sqlite3_errmsg(db), rc);
- sqlite3_finalize(stmt);
- sqlite3_close(db);
- md_exit(-1);
- }
- sqlite3_finalize(stmt);
- sqlite3_close(db);
- }
- void main_menu() {
- // Main menu for once things are done being initalized
- int done = 0;
- char ch;
- while(!done) {
- md_clr_scr();
- if(mdcontrol.user_seclevel == 99 || mdcontrol.user_seclevel == 255) { // Display a menu for sysops
- md_sendfile("ansis/sc_mainh.ans", TRUE);
- ch = md_get_answer("PpLlVvQqEe\r");
- } else { // And display a different menu for non-sysops
- md_sendfile("ansis/sc_mainl.ans", TRUE);
- ch = md_get_answer("PpLlVvQq\r");
- }
- md_clr_scr();
- switch(tolower(ch)){
- case 'q':
- // Quit
- md_printf("`bright white`Farewell!\r\n");
- // Hmm sleep?
- done = 1;
- break;
- case '\r':
- case 'p':
- // Play Game (Default if the player just hits enter)
- if (inuse == 1) {
- md_printf("`bright red`Game in use!\r\n");
- } else {
- md_printf("`bright white`Play\r\n");
- }
- paws();
- break;
- case 'l':
- // List Players in the game
- md_printf("`bright red`There are no players!\r\n");
- paws();
- break;
- case 'v':
- // Version
- md_clr_scr();
- md_printf("`bright yellow`|--------------------------|\r\n");
- md_printf("`bright yellow`| Space Construct v%d.%d-%s |\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_TYPE);
- md_printf("`bright yellow`|--------------------------|\r\n");
- paws();
- break;
- case 'e':
- // Edit Game (User Editor, Game Settings)
- if(mdcontrol.user_seclevel == 99 || mdcontrol.user_seclevel == 255) {
- md_printf("`bright green`Sysop Menu\r\n");
- paws();
- break;
- }
- }
- }
- }
- int main(int argc, char **argv) {
- int socket;
- if (argc < 2) { // Not enough arguments
- fprintf(stderr, "usage:\n%s (DROPFILE [SOCKET])\r\n", argv[0]);
- dolog("E %s (DROPFILE [SOCKET])", argv[0]);
- return 0;
- }
- if (argc > 2) { // If socket is found use socket
- if (argv[2][0] >= '0' && argv[2][0] <= '9') {
- socket = strtol(argv[2], NULL, 10);
- } else {
- socket = -1;
- }
- } else {
- socket = -1;
- }
- // Initiate MagiDoor
- md_init(argv[1], socket);
- md_clr_scr();
- // Debug System
- if (debug) {
- dolog("=== Debug ===");
- md_printf("`white`=== Debug ===\r\n");
- md_printf("DropFile...\r\n");
- log_drop();
- int test = check_lock();
- if (test == 0) {
- md_printf("Lock is: Avalible\r\n");
- md_printf("Database...\r\n");
- db_test();
- } else {
- md_printf("Lock is: Taken\r\n");
- md_printf("CANCELED Database Dump\r\n");
- }
- md_printf("`bright green`Continue to Program?\r\n");
- md_printf("`bright black`(`bright white`Y`bright black`)`white`es `bright black`(`bright red`N`bright black`)`red`o");
- char t = md_get_answer("YyNn\r");
- md_printf("\r\n`white`");
- switch(tolower(t)) {
- case '\r':
- case 'y':
- break;
- case 'n':
- md_exit(0);
- break;
- }
- md_clr_scr();
- } else {
- dolog("--- Debug ---");
- }
- // Check Lock
- inuse = check_lock();
- // 0 means we got the lock first, 1 means someone else has it already!
- // Lock game
- if (inuse == 0) {
- grab_lock();
- }
- // Main Menu
- //main_menu();
- user_inf ply = load_player(locate_player(mdcontrol.user_firstname, mdcontrol.user_lastname));
- ply.experience += 10;
- update_player(ply);
- // Unlock game
- if (inuse == 0) {
- rel_lock();
- }
- // Goodbye
- md_exit(0);
- }
|