/* * Copyright Matt Goff (Kline) 2009 * If you use my code, please give credit where it is due. * Support provided at www.ackmud.net */ #include "h/areaconvert.h" /* Store variables for all formats we will support, just don't write the ones we don't need later :) */ /* * format: ack431 format: ackfuss * * #AREA #AREA * name Revision * Q -- revision CanRead none~ * K -- keyword CanWrite none~ * L -- level_label Flags EOL~ * N -- ignore Keyword none~ * I -- min_level, max_level LevLabel none~ * V -- min_vnum, max_vnum LevRange 1 20 * X -- offset Name none~ * F -- reset_rate Owner none~ * U -- reset_msg ResetMsg none~ * O -- owner ResetRate 15 * R -- can_read VnumRange 1 100 * W -- can_write End * T -- flag TELEPORT * P -- flag PAY_AREA * M -- flag NO_ROOM_AFF * B -- flag BUILDING * S -- flag NO_SHOW */ area_data area; list<room_data *> room_list; list<npc_data *> npc_list; list<obj_data *> obj_list; list<shop_data *> shop_list; list<reset_data *> reset_list; int main( int argc, char *argv[] ) { string filename, source, dest; ifstream infile; ofstream outfile; int typein = TYPE_NONE, typeout = TYPE_NONE; if( argc < 2 || argc > 4 ) { display_help(); return 0; } if( argc >= 2 ) filename = argv[1]; if( argc >= 3 ) source = argv[2]; if( argc == 4 ) dest = argv[3]; if( !infile_init(filename,infile) || !outfile_init(filename,outfile) ) { cleanup_outfile(filename); return 0; } if( !typein_init(source,typein) || !typeout_init(dest,typeout) ) { cleanup_outfile(filename); return 0; } if( typein == typeout ) { cout << "You can not have the same source and destination format. Aborting." << endl; cleanup_outfile(filename); return 0; } process_infile(infile,typein); flag_handler(typein,typeout); process_outfile(outfile,typein,typeout); infile.close(); outfile.close(); shutdown_cleanup(); return 0; } void display_help( void ) { cout << endl << VERS << endl; cout << SPACER << endl; cout << "areaconvert filename [source format] [dest format]" << endl; cout << SPACER << endl; cout << "filename will be saved as filename.converted" << endl; cout << "default options are listed in (parenthesis)" << endl; cout << SPACER << endl; cout << "if a bit/flag is not converted you will receive" << endl; cout << "a list of them so you may manually attempt to" << endl; cout << SPACER << endl; cout << "supported src formats: (ack431)" << endl; cout << "supported dst formats: (ackfuss)" << endl << endl; return; } void cleanup_outfile( string filename ) { string cmd = "rm -f "; filename += ".converted"; cmd += filename; /* system returns different values on different platforms */ if( system(cmd.c_str()) ) {} /* so we wrap it inside an if() to silence ignore the return result */ return; } bool infile_init( string filename, ifstream &file ) { file.open(filename.c_str(),ios::in); if( file.is_open() ) return true; cout << "Unable to open input file [" << filename << "]. Aborting." << endl; return false; } bool outfile_init( string filename, ofstream &file ) { filename += ".converted"; file.open(filename.c_str(),ios::out); if( file.is_open() ) return true; cout << "Unable to open output file [" << filename << "]. Aborting." << endl; return false; } bool typein_init( string name, int &type ) { if( name.empty() ) type = TYPE_ACK431; else { if( name == "ack431" ) type = TYPE_ACK431; if( type == TYPE_NONE ) { cout << "Unknown input type [" << name << "]. Aborting." << endl; return false; } } return true; } bool typeout_init( string name, int &type ) { if( name.empty() ) type = TYPE_ACKFUSS; else { if( name == "ackfuss" ) type = TYPE_ACKFUSS; if( type == TYPE_NONE ) { cout << "Unknown output type [" << name << "]. Aborting." << endl; return false; } } return true; } void process_infile( ifstream &file, int type ) { switch( type ) { case TYPE_ACK431: read_ack431(file); break; } return; } void process_outfile( ofstream &file, int typein, int typeout ) { switch( typeout ) { case TYPE_ACKFUSS: write_ackfuss(file,typein); break; } return; } void shutdown_cleanup( void ) { if( !area.flags_found.empty() ) cout << "The following area flags were not converted: " << area.flags_found << endl; else cout << "Area converted successfully." << endl; for_each(room_list.begin(),room_list.end(),DeleteObject()); for_each(npc_list.begin(),npc_list.end(),DeleteObject()); for_each(obj_list.begin(),obj_list.end(),DeleteObject()); for_each(shop_list.begin(),shop_list.end(),DeleteObject()); for_each(reset_list.begin(),reset_list.end(),DeleteObject()); return; } int str2int( string &str ) { stringstream ss(str); int i = 0; ss >> i; return i; } string int2str( int i ) { stringstream ss; ss << i; return ss.str(); }