/**************************************************************
* 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;
}