/* Space Construct v0.3-dev Beanzilla@21:4/110 on FsxNet Beanzilla@637:1/110 on HappyNet */ #define VERSION_MAJOR 0 #define VERSION_MINOR 3 #ifndef VERSION_TYPE #define VERSION_TYPE "dev" #endif #define PATH_MAX 256 #define PATH_SEP "/" #include #include #if defined(_MSC_VER) || defined(WIN32) #define snprintf _snprintf #define strcasecmp _stricmp #include #ifndef _MSC_VER #define _MSC_VER 1 #endif #else #include #endif // Standard C #include #include #include #include #include #include #include #include #include // 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) int shieldsup; // 0 means yes, anything else means shields are offline, deduct if not 0 for each attack. int laston; // 20200630 is 6-30-2020 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; // DateStamp Structure to provide date difference typedef struct dateTamp { int year; // YYYY, or number of years difference int month; // MM, or number of months difference int day; // DD, or number of days difference. int age; // Taking down to aproximate day count. } dT; // YYYYMMDD it in int form 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); } int dateStamp() { // YYYYMMDD \o/ In a INT so we can store it and compare against it! struct tm *time_now; time_t timen; int result = 0; timen = time(NULL); time_now = localtime(&timen); result += ((time_now->tm_year + 1900) * 10000); result += (time_now->tm_mon * 100) + 100; result += time_now->tm_mday; return result; } int compareDate(int dt) { // Returns integer of difference, from now. struct tm *time_now; time_t timen; int now = 0; timen = time(NULL); time_now = localtime(&timen); now += ((time_now->tm_year + 1900) * 10000); now += (time_now->tm_mon * 100) + 100; now += time_now->tm_mday; return (now - dt); // 10000 = 1 Year, 100 = 1 Month, 1 = 1 Day } dT formDate(int diff) { // Reverse process so we can compare exact days or get the structure back out too. dT result; result.year = 0; result.month = 0; result.day = 0; result.age = 0; int notDone = 1; while(notDone) { if(diff >= 10000) { diff -= 10000; result.year += 1; } else if(diff >= 100) { diff -= 100; result.month += 1; } else if(diff >= 1) { diff -= 1; result.day += 1; } else { notDone = 0; } } // Process Aprox day count if(result.year != 0) { result.age += (365 * result.year); } else if(result.month != 0) { result.age += (30 * result.month); } else if(result.day != 0) { result.age += result.day; } return result; } int db_test() { sqlite3 *db; sqlite3_stmt *stmt; char sqlbuffer[256]; char strbuffer[256]; int sizeofdb = 0; 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) { 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 %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), sqlite3_column_name(stmt, 12), // int, shieldsup sqlite3_column_int(stmt, 12), sqlite3_column_name(stmt, 13), // int, laston sqlite3_column_int(stmt, 13) ); sizeofdb += 1; } // Clean up database sqlite3_finalize(stmt); sqlite3_close(db); return sizeofdb; } 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: 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 yesNo() { char ch; int done = 0; md_printf("`bright black`(`bright white`Y`bright black`)`white`es `bright black`(`bright red`N`bright black`)`red`o"); ch = md_get_answer("YyNn\r"); md_printf("\r\n"); switch(tolower(ch)) { case 'y': done = 1; break; case '\r': case 'n': break; } return done; } int randrange(int min, int max){ return min + rand() / (RAND_MAX / (max - min + 1) + 1); } 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, 1, uuid); 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); result.shieldsup = sqlite3_column_int(stmt, 12); result.laston = sqlite3_column_int(stmt, 13); } else { //dolog("E: Unable to locate user with id=%d got %s (%d)", uuid, sqlite3_errmsg(db), rc); sqlite3_finalize(stmt); sqlite3_close(db); result.uid = 0; return result; } 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=?, shieldsup=?, laston=? 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.shieldsup); sqlite3_bind_int(stmt, 12, data.laston); sqlite3_bind_int(stmt, 13, 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); } int create_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); strcpy(sqlbuffer, "INSERT INTO user (nick, real, experience, metal, fuel, guns, armors, shields, armorpoints, shieldpoints, hitpoints, shieldsup, laston) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"); sqlite3_prepare_v2(db, sqlbuffer, strlen(sqlbuffer) + 1, &stmt, NULL); sqlite3_bind_text(stmt, 1, data.nick, strlen(data.nick), SQLITE_STATIC); sqlite3_bind_text(stmt, 2, data.real, strlen(data.real), SQLITE_STATIC); sqlite3_bind_int(stmt, 3, data.experience); sqlite3_bind_int(stmt, 4, data.metal); sqlite3_bind_int(stmt, 5, data.fuel); sqlite3_bind_int(stmt, 6, data.guns); sqlite3_bind_int(stmt, 7, data.armors); sqlite3_bind_int(stmt, 8, data.shields); sqlite3_bind_int(stmt, 9, data.armorpoints); sqlite3_bind_int(stmt, 10, data.shieldpoints); sqlite3_bind_int(stmt, 11, data.hitpoints); sqlite3_bind_int(stmt, 12, data.shieldsup); sqlite3_bind_int(stmt, 13, data.laston); rc = sqlite3_step(stmt); if(rc != SQLITE_DONE) { dolog("E: failed inserting player=%d got error %s (%d)", data.nick, sqlite3_errmsg(db), rc); sqlite3_finalize(stmt); sqlite3_close(db); md_exit(-1); } sqlite3_finalize(stmt); sqlite3_close(db); return 1; // Good } void delete_player(int uuid) { sqlite3 *db; sqlite3_stmt *stmt; char sqlbuffer[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); strcpy(sqlbuffer, "DELETE FROM user WHERE uid=?;"); sqlite3_prepare_v2(db, sqlbuffer, strlen(sqlbuffer) + 1, &stmt, NULL); sqlite3_bind_int(stmt, 1, uuid); rc = sqlite3_step(stmt); if (rc != SQLITE_DONE){ dolog("E: Unable to locate user with id=%d got %s (%d)", uuid, sqlite3_errmsg(db), rc); sqlite3_finalize(stmt); sqlite3_close(db); md_exit(-1); } sqlite3_finalize(stmt); sqlite3_close(db); } void delete_players() { sqlite3 *db; sqlite3_stmt *stmt; char sqlbuffer[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); strcpy(sqlbuffer, "DELETE FROM user;"); sqlite3_prepare_v2(db, sqlbuffer, strlen(sqlbuffer) + 1, &stmt, NULL); rc = sqlite3_step(stmt); if (rc != SQLITE_DONE){ dolog("E: Delete_players 1/2, Unexpected error got %s (%d)", sqlite3_errmsg(db), rc); sqlite3_finalize(stmt); sqlite3_close(db); md_exit(-1); } strcpy(sqlbuffer, "UPDATE sqlite_sequence SET seq = 0 WHERE name='user';"); sqlite3_prepare_v2(db, sqlbuffer, strlen(sqlbuffer) + 1, &stmt, NULL); rc = sqlite3_step(stmt); if (rc != SQLITE_DONE){ dolog("E: Delete_players 2/2, Unexpected error got %s (%d)", sqlite3_errmsg(db), rc); sqlite3_finalize(stmt); sqlite3_close(db); md_exit(-1); } sqlite3_finalize(stmt); sqlite3_close(db); } int display_all_players() { 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); strcpy(sqlbuffer, "SELECT * from user ORDER BY experience DESC, nick DESC;"); sqlite3_prepare_v2(db, sqlbuffer, strlen(sqlbuffer) + 1, &stmt, NULL); int total = 0; md_printf("`bright green`___ The Players ___\r\n"); while(sqlite3_step(stmt) == SQLITE_ROW) { md_printf("`bright white` %s (%d)\r\n", sqlite3_column_text(stmt, 1), sqlite3_column_int(stmt, 3)); total += 1; } if(total > 1) { md_printf("`green`There are a total of `bright green`%d`green` players\r\n", total); } else { md_printf("`green`There are a total of `bright green`%d`green` player\r\n", total); } sqlite3_finalize(stmt); sqlite3_close(db); return total; } user_inf build_menu(user_inf my) { int done = 0; int didUp = 0; char ch; if(my.metal != 0) { while(!done) { md_clr_scr(); md_sendfile("ansis/sc_build.ans", FALSE); md_printf("`bright yellow`You have %d metal\r\n", my.metal); ch = md_get_answer("GgAaSsCcRr\r"); switch(tolower(ch)) { case 'g': if(my.metal >= (4 * (my.guns + 1))) { my.metal -= (4 * (my.guns + 1)); my.guns += 1; my.hitpoints += 1; didUp = 1; // We need to save md_printf("`bright green`Added a new gun!\r\n`white`"); paws(); } else { md_printf("`bright red`You don't have the %d metal for this!\r\n`white`", (4 * (my.guns + 1))); paws(); } break; case 'a': if(my.metal >= (3 * (my.armors + 1))) { my.metal -= (3 * (my.armors + 1)); my.armors += 1; my.hitpoints += 1; my.armorpoints += 8; didUp = 1; // We need to save md_printf("`bright green`Added a new armor!\r\n`white`"); paws(); } else { md_printf("`bright red`You don't have the %d metal for this!\r\n`white`", (3 * (my.armors + 1))); paws(); } break; case 's': if(my.metal >= (6 * (my.shields + 1))) { my.metal -= (6 * (my.shields + 1)); my.shields += 1; my.hitpoints += 1; if(my.shieldsup == 0) { my.shieldpoints += 3; } else { my.shieldpoints += 1; } didUp = 1; // We need to save md_printf("`bright green`Added a new shield!\r\n`white`"); paws(); } else { md_printf("`bright red`You don't have the %d metal for this!\r\n`white`", (6 * (my.shields + 1))); paws(); } break; case '\r': case 'c': done = 1; break; case 'r': if(my.experience > 25) { if(my.metal > 25) { my.experience -= 25; my.metal -= 25; my.fuel += 5; didUp = 1; md_printf("`bright green`Made 5 fuel using 25 experience and 25 metal!\r\n"); paws(); } else { md_printf("`bright red`You need 25 experience and 25 metal to make fuel!\r\n"); paws(); } } else { md_printf("`bright red`You need 25 experience and 25 metal to make fuel!\r\n"); paws(); } break; } } if(didUp) { update_player(my); } return my; } else { return my; } } user_inf combat_menu(user_inf my, int targ_hp, int targ_dmg, int asteroid) { int done = 0; int playerWon = 0; // Did the player win? (1 = Yes, 2 = No, 3 = Flee) char ch; int armorRep = 0; // Can armor be repaired? int temp = 0; int temp1 = 0; int temp2 = 0; int temp_hp = targ_hp; int flee = 0; int fire = 0; int regen = 0; while(!done) { if(asteroid == 0) { md_printf("`bright white`Pirate has %d hitpoints left\r\n", targ_hp); } else if(asteroid == 1) { md_printf("`bright white`Asteroid has %d hitpoints left\r\n", targ_hp); } else if(asteroid == 2) { md_printf("`bright white`Unknown One has %d hitpoints left\r\n", targ_hp); } // Proccess Shields comming back online if(my.shieldsup != 0) { my.shieldsup -= 1; } // Proccess Crew repairing hull if(my.hitpoints < (my.guns + my.armors + my.shields + 2)) { regen = rand() % 100; if(regen >= 90) { my.hitpoints += 1; if(my.hitpoints > (my.guns + my.armors + my.shields + 2)) { my.hitpoints = (my.guns + my.armors + my.shields + 2); } md_printf("`bright green`Your crew repaired your hull for 1 point!\r\n"); } } if(my.shieldsup == 0) { // Proccess Shield Regeneration if(my.shieldpoints < (my.shields * 3)) { regen = rand() % 100; if(regen >= 70) { my.shieldpoints += (my.shields + 1); if(my.shieldpoints > (my.shields * 3)) { my.shieldpoints = (my.shields * 3); } md_printf("`bright green`Your shields regenerate %d points!\r\n", my.shields); } } md_printf("`bright white`Your ship has `bright blue`%d`bright white` shields, %d armor and %d hitpoints left:\r\n", my.shieldpoints, my.armorpoints, my.hitpoints); } else { // Shields should still regenerate some if(my.shieldpoints < (my.shields * 3)) { regen = rand() % 100; if(regen >= 70) { my.shieldpoints += 1; if(my.shieldpoints > (my.shields * 3)) { my.shieldpoints = (my.shields * 3); } md_printf("`bright green`Your shields regenerate 1 points!\r\n"); } } md_printf("`bright white`Your ship has `blue`%d`bright white` shields, %d armor and %d hitpoints left:\r\n", my.shieldpoints, my.armorpoints, my.hitpoints); } // Forming Combat Menu md_printf("`bright black`(`bright white`A`bright black`)`white`ttack\r\n"); if(my.armorpoints < (my.armors * 8)) { md_printf("`bright black`(`bright white`R`bright black`)`white`epair Armor\r\n"); armorRep = 1; // Yes we can repair armor } md_printf("`bright black`(`bright white`F`bright black`)`white`lee\r\n"); // Proccess User action ch = md_get_answer("AaRrFf\r"); switch(tolower(ch)) { case '\r': case 'a': fire = rand() % 100; if(asteroid == 1) { // Its a rock so allow player to hit it more frequent fire += 15; } if(fire >= 50) { targ_hp -= my.guns; if(targ_hp <= 0) { md_printf("`bright red`Target Destroyed!\r\n"); done = 1; playerWon = 1; } else { md_printf("`bright red`Target took %d damage!\r\n", my.guns); } } else { md_printf("`white`You Missed!\r\n"); } break; case 'r': if(armorRep) { if(my.metal > 0) { my.metal -= 1; my.armorpoints += 2; if(my.armorpoints < (my.armors * 8)) { my.armorpoints = (my.armors * 8); } md_printf("`bright green`Repaired 2 Armor points!\r\n"); } else { md_printf("`bright red`You need metal inorder to repair!\r\n"); } } else { md_printf("`bright yellow`You don't seem to need repairs!\r\n"); } break; case 'f': flee = rand() % 100; if(asteroid == 1) { flee = 100; // Always allow fleeing from asteroid } else if(asteroid == 2) { flee = 0; // Never allow fleeing from Unknown One } if(flee >= 82) { playerWon = 3; done = 1; md_printf("`bright green`You ran away!\r\n"); } else { md_printf("`bright red`Target found you!\r\n"); } break; } // If Enemy is alive proccess incomming attack if(targ_hp > 0) { temp = targ_dmg; fire = rand() % 100; if(asteroid == 1) { // Yup it doesn't have gunz cuz it's rock. fire = 0; } else if(asteroid == 2) { // This is the Unknown One fire += 5; } if(fire >= 40) { // Shields if(my.shieldsup == 0 && my.shieldpoints != 0) { if(temp >= my.shieldpoints) { // Damage will lower shields! my.shieldsup = (my.shields + 2); temp -= my.shieldpoints; my.shieldpoints = 0; md_printf("`bright blue`Shields absorbed %d damage and went offline!\r\n`white`", targ_dmg); } else { // Damage to shields but not lower them temp1 = temp; temp -= my.shieldpoints; my.shieldpoints -= temp1; temp1 = 0; md_printf("`bright blue`Shields absorbed %d damage!\r\n`white`", targ_dmg); } } // shields now armor if(temp > 0) { if(my.armorpoints != 0) { // We do have armor if(temp >= my.armorpoints) { // Damage will destroy armor! temp2 = temp; temp -= my.armorpoints; my.armorpoints = 0; md_printf("`yellow`Armor took %d damage and broke!\r\n`white`", temp2); } else { // Nope armor is good temp1 = temp; temp2 = temp; temp -= my.armorpoints; my.armorpoints -= temp1; temp1 = 0; md_printf("`bright yellow`Armor took %d damage!\r\n`white`", temp2); } } } // armor now hull if(temp > 0) { if(temp < my.hitpoints) { temp1 = temp; temp -= my.hitpoints; // should be 0 my.hitpoints -= temp1; md_printf("`bright red`Hull took %d damage!\r\n", temp1); } else { playerWon = 2; // Nope the target did us in done = 1; my.hitpoints = 0; md_printf("`red`Hull took %d damage and broke!\r\n", temp); } } } // firing } // Winning move? if(playerWon) { if(playerWon == 1) { // Player won my.experience += (temp_hp + targ_dmg); my.metal += temp_hp; if(asteroid == 1) { // If asteroid reward more experience and metal! my.experience += 2; my.metal += 2; } else if(asteroid == 2) { // If it was the boss! my.experience += 8; my.metal += 8; } my.fuel -= 2; if(my.fuel < 0) { my.fuel = 0; } md_printf("`bright green`Congrats on your victory!\r\n`white`"); } else if(playerWon == 2) { // Target won my.experience -= (temp_hp + targ_dmg); my.metal -= temp_hp; my.fuel -= 3; if(my.experience < 0) { my.experience = 0; } if(my.metal < 0) { my.metal = 0; } if(my.fuel < 0) { my.fuel = 0; } md_printf("`bright red`Sorry for your loss! (We rebuild your ship)\r\n"); my.hitpoints = 4; my.armorpoints = 8; my.shieldpoints = 0; my.shieldsup = 0; my.armors = 1; my.shields = 0; my.guns = 1; } else if(playerWon == 3) { // Chicken! my.fuel -= 1; } } } update_player(my); return my; } void about_game() { int done = 0; int page = 1; char p[12]; char targ[256]; while(!done) { switch(page) { case 1: md_clr_scr(); md_sendfile("ansis/sc_doc_1.ans", FALSE); paws(); break; case 2: md_clr_scr(); md_sendfile("ansis/sc_doc_2.ans", FALSE); paws(); break; case 3: md_clr_scr(); md_sendfile("ansis/sc_doc_3.ans", FALSE); paws(); break; case 4: md_clr_scr(); md_sendfile("ansis/sc_doc_4.ans", FALSE); paws(); break; case 5: done = 1; break; } md_clr_scr(); page += 1; } } void play_game() { int done = 0; char ch; char ch1[256]; user_inf myself; user_inf myself2; user_inf testing; int reset = 0; int doRefuel = 0; int pirate_encounter = 0; int pirate_hp = 0; // Reused for asteroid int pirate_dmg = 0; // Reused for asteroid int asteroid = 0; // 1 means yes we need to remove damage... completely. int me = locate_player(mdcontrol.user_firstname, mdcontrol.user_lastname); if(me != 0) { //myself = load_player(me); testing = load_player(me); if(testing.uid != 0) { myself = load_player(me); } dT age = formDate(compareDate(myself.laston)); // Process player inactivity if(age.age >= 180) { // 6 Months or 1/2 a Year me = 0; reset = 1; } // Processing fuel regeneration if(age.age != 0) { doRefuel = 1; } } if(me != 0) { md_printf("`bright white`Welcome back `bright green`%s\r\n", myself.nick); dT age = formDate(compareDate(myself.laston)); dolog("%s is now playing (G=%d A=%d S=%d F=%d M=%d AP=%d SP=%d (%d) HP=%d LO=%d or %d days)", myself.nick, myself.guns, myself.armors, myself.shields, myself.fuel, myself.metal, myself.armorpoints, myself.shieldpoints, myself.shieldsup, myself.hitpoints, myself.laston, age.age); myself.laston = dateStamp(); if(age.day != 0 || age.month != 0 || age.year != 0) { md_printf("`bright yellow`Haven't seen you for"); } if(age.day != 0) { if(age.day > 1) { md_printf(" %d days", age.day); } else { md_printf(" %d day", age.day); } } if(age.month != 0) { if(age.month > 1) { md_printf(" %d months", age.month); } else { md_printf(" %d month", age.month); } } if(age.year != 0) { if(age.year > 1) { md_printf(" %d years", age.year); } else { md_printf(" %d year", age.year); } } if(age.day != 0 || age.month != 0 || age.year != 0) { md_printf("\r\n"); } if(doRefuel) { if(myself.fuel != 0) { myself.fuel += (age.age * 2); } else { myself.fuel += ((age.age * 2) + 10); md_printf("`bright green`For using all your fuel last time you get bonus fuel today!\r\n"); } md_printf("`bright green`You now have %d fuel\r\n", myself.fuel); } update_player(myself); paws(); } else { md_printf("`bright white`You look new here. (Hit Enter to use your alias)\r\n"); while(done == 0) { md_printf("`bright yellow`What's your name: "); md_getstring(ch1, 26, 32, 126); md_printf("\r\n"); if(strlen(ch1) > 0) { //md_getstring(ch1, 256, 32, 126); strcpy(myself.nick, ch1); } else { strcpy(myself.nick, mdcontrol.user_alias); } md_printf("`bright white`Are you sure you want to be called `bright green`%s\r\n"); done = yesNo(); if(done) { if(reset) { // So we are reseting the user, this wipes all values and uses update instead of create myself.experience = 0; myself.metal = 0; myself.fuel = 10; myself.guns = 1; myself.armors = 1; myself.shields = 0; myself.armorpoints = 8; myself.shieldpoints = 0; myself.hitpoints = 4; myself.shieldsup = 0; myself.laston = dateStamp(); update_player(myself); } else { // Brand new user char name[256]; strcpy(myself2.nick, myself.nick); strcpy(name, ""); strcat(name, mdcontrol.user_firstname); strcat(name, " "); strcat(name, mdcontrol.user_lastname); strcpy(myself2.real, name); myself2.experience = 0; myself2.metal = 0; myself2.fuel = 10; myself2.guns = 1; myself2.armors = 1; myself2.shields = 0; myself2.armorpoints = 8; myself2.shieldpoints = 0; myself2.hitpoints = 4; myself2.shieldsup = 0; myself2.laston = dateStamp(); create_player(myself2); myself = load_player(locate_player(mdcontrol.user_firstname, mdcontrol.user_lastname)); } } } done = 0; // Reset this for our next loop. } // Ok user is here now lets ask what they want to do... build/attack md_clr_scr(); while(!done) { md_printf("`bright yellow`You have %d fuel left for today,\r\n", myself.fuel); if(myself.shieldsup == 0) { md_printf("`bright yellow`Your ship has `bright blue`%d`bright yellow` shields, %d armor and %d hitpoints left:\r\n", myself.shieldpoints, myself.armorpoints, myself.hitpoints); } else { md_printf("`bright yellow`Your ship has %d armor, `blue`%d`bright yellow` shields and %d hitpoints left:\r\n", myself.armorpoints, myself.shieldpoints, myself.hitpoints); } if(myself.armorpoints < (myself.armors * 8)) { md_printf("`bright black`(`bright white`R`bright black`)`white`epair Armor\r\n"); } if(myself.shieldpoints < (myself.shields * 3)) { md_printf("`bright black`(`bright white`G`bright black`)`white`enerate Shields\r\n"); } if(myself.fuel >= 2) { md_sendfile("ansis/sc_gameh.ans", FALSE); ch = md_get_answer("SsHhBbQqRrGgLl\r"); } else { md_sendfile("ansis/sc_gamel.ans", FALSE); ch = md_get_answer("BbQqRrGgLl\r"); } md_clr_scr(); switch(tolower(ch)) { case '\r': case 's': if(myself.fuel >= 2) { pirate_encounter = rand() % 100; if(pirate_encounter >= 75) { // 25% chance to encounter a Pirate if(myself.experience > 5000) { if(pirate_encounter >= 95) { // 5% chance to encounter unknown one md_printf("`bright yellow`You encounter the `bright red`Unknown One\r\n`white`"); asteroid = 2; } else { md_printf("`bright yellow`You encounter a `bright red`Pirate\r\n`white`"); asteroid = 0; } } } else { // 75% chance to encounter a Asteroid md_printf("`bright yellow`You encounter a `bright red`Asteroid\r\n`white`"); asteroid = 1; } if(asteroid == 0 || asteroid == 2) { pirate_hp = ((myself.hitpoints + 1) + (rand() % 4)); if(asteroid == 2) { pirate_hp += 10; } // Increase difficulty based on experience... pirate_dmg = (myself.experience / 500); if(pirate_dmg == 0) { // Always deal damage pirate_dmg = 1; } if(asteroid == 2) { // Increase boss damage pirate_dmg += 2; } // Send off to combat menu myself = combat_menu(myself, pirate_hp, pirate_dmg, asteroid); } else { pirate_hp = (myself.hitpoints + 1) + (rand() % 10); // Send off to combat menu myself = combat_menu(myself, pirate_hp, 0, asteroid); } } break; case 'h': md_printf("`bright white`Comming v0.4-dev\r\n"); break; case 'b': if(myself.metal != 0) { // Send off to build menu md_clr_scr(); //md_sendfile("ansis/sc_build.ans", FALSE); myself = build_menu(myself); } else { md_printf("`bright white`I am sorry you have no metal go fight.`white`\r\n"); } break; case 'q': done = 1; break; case 'r': if(myself.armorpoints < (myself.armors * 8)) { if(myself.metal > 0) { myself.metal -= 1; myself.armorpoints += 4; if(myself.armorpoints > (myself.armors * 8)) { myself.armorpoints = (myself.armors * 8); } md_printf("`bright green`Repaired 4 Armor Points!\r\n`white`"); } else { md_printf("`bright red`You need metal inorder to repair!\r\n`white`"); } } else { md_printf("`bright yellow`You don't seem to need repairs!\r\n`white`"); } break; case 'g': if(myself.shieldpoints < (myself.shields * 3)) { myself.shieldpoints = (myself.shields * 3); md_printf("`bright green`Regenerated Shields!\r\n`white`"); } else { md_printf("`bright yellow`You don't seem to need to regenerate shields!\r\n`white`"); } break; } } } void main_menu() { // Main menu for once things are done being initalized int done = 0; int done1 = 0; // For Reset Game and for New Day... also for Debug int targ_ply = 1; // Target player to perform op! int targ_max = 0; // Total number of players affected! user_inf targ; // Player Struct dT targ_age; // Date Struct char targ_real[256]; char ch; // 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(); } while(!done) { md_clr_scr(); if(mdcontrol.user_seclevel == 99 || mdcontrol.user_seclevel == 255) { md_sendfile("ansis/sc_mainh.ans", TRUE); } else { md_sendfile("ansis/sc_mainl.ans", TRUE); } ch = md_get_answer("PpLlVvQqRrNnSsAa\r"); md_clr_scr(); switch(tolower(ch)){ case 'q': // Quit done = 1; break; case '\r': case 'p': // Play Game (Default if the player just hits enter) if (inuse == 1) { md_printf("`bright red`______________\r\n"); md_printf("`bright red` Game in use!\r\n"); md_printf("`bright red`______________\r\n"); paws(); } else { //md_printf("`bright white`Play\r\n"); play_game(); } break; case 'a': about_game(); break; case 'l': // List Players in the game display_all_players(); 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` By: Beanzilla\r\n"); md_printf("`bright yellow` FsxNet 21:4/110\r\n"); md_printf("`bright yellow` HappyNet 637:1/110\r\n"); md_printf("`bright yellow`_____________________________\r\n"); paws(); break; case 'r': if(mdcontrol.user_seclevel == 99 || mdcontrol.user_seclevel == 255) { md_printf("`bright red`__ Reset ___\r\n"); md_printf("`bright red`DANGER THIS WILL DELETE ALL PLAYERS IN GAME\r\n"); if(yesNo() == 0) { md_printf("`bright red`ABORTED!\r\n"); paws(); break; } dolog("%s issued reset", mdcontrol.user_alias); delete_players(); // Delete all players in user table } else { md_printf("`bright red`Not Authorized, Contact System Operator if you feel this was in error!\r\n"); } paws(); break; case 's': if(mdcontrol.user_seclevel == 99 || mdcontrol.user_seclevel == 255) { md_printf("`bright yellow`__ Show Debug ___\r\n"); while(!done1) { targ = load_player(targ_ply); if(targ.uid != 0) { targ_age = formDate(compareDate(targ.laston)); md_printf("* %s has %d guns, %d armor, %d shields\r\n", targ.nick, targ.guns, targ.armors, targ.shields); md_printf(" %d armorpoints, %d shieldpoints, %d hitpoints\r\n", targ.armorpoints, targ.shieldpoints, targ.hitpoints); md_printf(" %d laston (raw), %d laston (days), %d shieldsup\r\n", targ.laston, targ_age.age, targ.shieldsup); md_printf(" %d fuel, %d metal, %d experience\r\n\r\n", targ.fuel, targ.metal, targ.experience); } else { done1 = 1; } targ_ply += 1; targ_max += 1; } md_printf("`bright yellow`%d players\r\n", (targ_max - 1)); targ_ply = 1; targ_max = 0; done1 = 0; } else { md_printf("`bright yellow`Not Authorized, Contact System Operator if you feel this was in error!\r\n"); } paws(); break; case 'n': if(mdcontrol.user_seclevel == 99 || mdcontrol.user_seclevel == 255) { md_printf("`bright yellow`__ New Day ___\r\n"); dolog("%s issued new day", mdcontrol.user_alias); while(!done1) { targ = load_player(targ_ply); if(targ.uid != 0) { targ.laston -= 1; // Travel back 1 day update_player(targ); // Save } else { done1 = 1; } targ_ply += 1; targ_max += 1; } md_printf("`bright yellow`%d players\r\n", (targ_max - 1)); targ_ply = 1; targ_max = 0; done1 = 0; } else { md_printf("`bright yellow`Not Authorized, Contact System Operator if you feel this was in error!\r\n"); } paws(); break; } } // Unlock game if (inuse == 0) { rel_lock(); } } 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"); } paws(); md_clr_scr(); } else { dolog("--- Debug ---"); } // Main Menu main_menu(); // Goodbye md_exit(0); }