1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
#include "globalincs/pstypes.h"
#include "pilotfile/pilotfile_convert.h"
#include "cfile/cfile.h"
#include "playerman/managepilot.h"
pilotfile_convert::pilotfile_convert()
{
fver = 0;
m_size_offset = 0;
cfp = NULL;
plr = NULL;
csg = NULL;
}
pilotfile_convert::~pilotfile_convert()
{
if (cfp) {
cfclose(cfp);
}
if (plr) {
delete plr;
}
if (csg) {
delete csg;
}
}
void pilotfile_convert::startSection(Section::id section_id)
{
Assert( cfp );
const int zero = 0;
cfwrite_ushort( (ushort)section_id, cfp );
// to be updated when endSection() is called
cfwrite_int(zero, cfp);
// starting offset, for size of section
m_size_offset = cftell(cfp);
}
void pilotfile_convert::endSection()
{
Assert( cfp );
Assert( m_size_offset > 0 );
size_t cur = cftell(cfp);
Assert( cur >= m_size_offset );
size_t section_size = cur - m_size_offset;
if (section_size) {
// go back to section size in file and write proper value
cfseek(cfp, cur - section_size - sizeof(int), CF_SEEK_SET);
cfwrite_int((int)section_size, cfp);
// go back to previous location for next section
cfseek(cfp, cur, CF_SEEK_SET);
}
}
void convert_pilot_files()
{
size_t idx, j, i;
size_t count, inf_count;
int max_convert, num_converted = 0;
SCP_vector<SCP_string> existing;
SCP_vector<SCP_string> old_files;
// get list of pilots which already exist (new or converted already)
cf_get_file_list(existing, CF_TYPE_PLAYERS, "*.plr");
// get list of old pilots which may need converting, starting with inferno pilots
Get_file_list_child = "inferno";
cf_get_file_list(old_files, CF_TYPE_SINGLE_PLAYERS, "*.pl2");
inf_count = old_files.size();
cf_get_file_list(old_files, CF_TYPE_SINGLE_PLAYERS, "*.pl2");
if ( old_files.empty() ) {
return;
}
// rip out all files which already exist
i = 0;
count = old_files.size();
for (idx = 0; idx < existing.size(); idx++) {
const char *fname = existing[idx].c_str();
for (j = 0; j < count; j++) {
if ( !stricmp(fname, old_files[j].c_str()) ) {
// NOTE: we just clear the name here to avoid the fragmentation
// from resizing the vector
old_files[j] = "";
++i;
}
}
}
// don't convert enough pilots to exceed the pilot limit
max_convert = MAX_PILOTS - existing.size();
// if everything is already converted then bail
// also bail if MAX_PILOTS (or more!) already exist
if (i == count || max_convert <= 0) {
return;
}
mprintf(("PILOT: Beginning pilot file conversion...\n"));
// now proceed to convert all of the old files
count = old_files.size();
for (idx = 0; idx < count; idx++) {
if ( old_files[idx].empty() ) {
continue;
}
pilotfile_convert *pcon = new pilotfile_convert;
bool inferno = (idx < inf_count);
if ( pcon->plr_convert(old_files[idx].c_str(), inferno) ) {
SCP_vector<SCP_string> savefiles;
SCP_string wildcard(old_files[idx]);
wildcard.append("*.cs2");
if (inferno) {
Get_file_list_child = "inferno";
}
cf_get_file_list(savefiles, CF_TYPE_SINGLE_PLAYERS, const_cast<char*>(wildcard.c_str()));
for (j = 0; j < savefiles.size(); j++) {
pcon->csg_convert(savefiles[j].c_str(), inferno);
}
++num_converted;
}
delete pcon;
if (num_converted >= max_convert) {
break;
}
}
mprintf(("PILOT: Pilot file conversion complete!\n"));
}
|