/************************************************************** * FFTacticsMUD : startup.cpp * ************************************************************** * (c) 2002 Damien Dailidenas (Trenton). All rights reserved. * **************************************************************/ #include "main.h" #include <strstream> #include <fstream> #include <iomanip> #include <cstdio> #include <unistd.h> #include "mysql/mysql.h" time_t time(time_t *tloc); string lcom, lfun, login_screen; TID time_info; bool fBootDb; void init_mm args(()); void load_login_screen args(()); void load_areas(); void startup() { long lhour, lday, lmonth; fBootDb = true; init_mm(); lhour = (current_time - 650336715) / (PULSE_TICK / PPS); time_info.hour = lhour % 24; lday = lhour / 24; time_info.day = lday % 35; lmonth = lday / 35; time_info.month = lmonth % 17; time_info.year = lmonth / 17; load_login_screen(); load_areas(); load_battle_areas(); // load_shops(); // load_global_settings(); fBootDb = false; log_string("Loading complete."); return; } void load_login_screen() { ifstream file("../src/login"); char c_temp[256]; ostrstream ost; while(file.getline(c_temp, 256)) ost << c_temp << endl; file.close(); ost << ends; login_screen = ost.str(); return; } void load_areas() { log_string("Loading areas..."); AREA *area; ROOM *room; for(short x = 1; area_table[x].name; ++x) { area = new AREA; area->next = area_list; area_list = area; area->id = x; room = new ROOM; area->room[ROOM_OUTSIDE] = room; room->area = area; room->id = ROOM_OUTSIDE; } return; } void load_global_settings() { MYSQL mysql; MYSQL_RES *res; MYSQL_ROW row; extern bool wizlock, newlock; log_string("Loading global settings..."); mysql_init(&mysql); if(!mysql_real_connect(&mysql, DB_LOC, DB_USER, DB_PASS, DB_NAME, 0, NULL, 0)) return; mysql_query(&mysql, "SELECT * FROM globalSettings"); res = mysql_store_result(&mysql); while((row = mysql_fetch_row(res))) wizlock = atoi(row[0]), newlock = atoi(row[1]); mysql_free_result(res); mysql_close(&mysql); return; } void load_battle_area(string str) { BATTLE_ROOM *room; unsigned int size, x; string str_name, str_temp; split(str, str_name); short aID = atoi(str.c_str()); ifstream file(str_name.c_str()); if(!file.is_open()) { log_string("ERROR: Couldn't open " + str_name + ".area"); return; } BATTLE_AREA *area = new BATTLE_AREA; area->next = battle_area_list; battle_area_list = area; getline(file, area->name); getline(file, area->name); area->id = aID; file >> area->width; file >> area->height; file >> area->weather; size = area->size(); for(x = 1; x <= size; ++x) { room = new BATTLE_ROOM; area->room[x] = room; room->area = area; room->id = x; file >> room->sector >> room->type >> room->height >> room->depth; } file.close(); area->set_coordinates(); return; } void load_battle_areas() { log_string("Loading battle areas..."); ifstream file("../areas/battle_area.list"); if(!file.is_open()) { log_string("ERROR: Couldn't open ../areas/battle_area.list"); return; } short cnt = 0; string str_filename; ostrstream ost; char c_temp[30]; while(file.getline(c_temp, 30)) { str_filename = c_temp; ost.freeze(false); ost.seekp(0, ios::beg); ost << "../areas/" << str_filename << ' ' << ++cnt << ends; load_battle_area(ost.str()); } file.close(); return; } void load_shops() { MYSQL mysql; MYSQL_RES *res; MYSQL_ROW row; ROOM *room; AREA *area; SHOP *shop; log_string("Loading shops..."); mysql_init(&mysql); if(!mysql_real_connect(&mysql, DB_LOC, DB_USER, DB_PASS, DB_NAME, 0, NULL, 0)) return; mysql_query(&mysql, "SELECT * FROM shop_data"); res = mysql_store_result(&mysql); while((row = mysql_fetch_row(res))) { area = get_area(atoi(row[0])); room = area->room[atoi(row[1])]; if(!room->shop) { shop = new SHOP; room->shop = shop; } room->shop->add(create_obj(atoi(row[2]))); } mysql_free_result(res); mysql_close(&mysql); return; } long flag_convert(char letter) { long bitsum = 0; char i; if('A' <= letter && letter <= 'Z') { bitsum = 1; for(i = letter; i > 'A'; i--) bitsum *= 2; } else if('a' <= letter && letter <= 'z') { bitsum = 67108864; // 2^26 for(i = letter; i > 'a'; i --) bitsum *= 2; } return bitsum; } int num_range(int from, int to) { int power, number; if(from == 0 && to == 0) return 0; if((to = to - from + 1) <= 1) return from; for(power = 2; power < to; power <<= 1) ; while((number = number_mm() & (power - 1)) >= to) ; return from + number; } int num_percent() { int percent; while((percent = number_mm() & (128-1)) > 99) ; return 1 + percent; } void init_mm() { srandom(time(NULL)^getpid()); return; } long number_mm() { return random() >> 6; } void append_file(CH *ch, const string str_file, const string str = "") { if(str.empty()) return; ofstream file(str_file.c_str()); if(!file.is_open()) { perror(str_file.c_str()); ch->printf("Could not open the file!\n\r"); } else { file << ch->name << ": " << str << ends; file.close(); } return; } long db_read_flags(const string str_flags) { int number = 0, x = 0; char c = str_flags[x]; if(!isdigit(c)) { while(('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')) { number += flag_convert(c); c = str_flags[++x]; } } while(isdigit(c)) { number = number * 10 + c - '0'; c = str_flags[++x]; } return number; }