Files
oboe/osx/boe.fileio.cpp

670 lines
21 KiB
C++

#include <iostream>
#include <fstream>
//#include "item.h"
#include "boe.global.h"
#include "classes.h"
#include "boe.fileio.h"
#include "boe.text.h"
#include "boe.town.h"
#include "boe.items.h"
#include "boe.graphics.h"
#include "boe.locutils.h"
#include "boe.newgraph.h"
#include "boe.dlgutil.h"
#include "boe.infodlg.h"
#include "boe.graphutil.h"
#include "graphtool.h"
#include "soundtool.h"
#include "mathutil.h"
#include "dlogutil.h"
#include "fileio.h"
#include "porting.h" // only needed for one little flip_short call, though...
#include <boost/filesystem.hpp>
#include "restypes.hpp"
#define DONE_BUTTON_ITEM 1
extern short give_delays,stat_screen_mode;
extern eGameMode overall_mode;
extern bool play_sounds,sys_7_avail,save_maps,party_in_memory,in_scen_debug,ghost_mode;
extern location center;
extern long register_flag;
extern sf::RenderWindow mainPtr;
extern short current_pc;
extern bool map_visible;
extern sf::RenderWindow mini_map;
extern short which_combat_type;
extern short cur_town_talk_loaded;
extern cScenario scenario;
extern cUniverse univ;
cScenarioList scen_headers;
extern ter_num_t combat_terrain[64][64];
extern bool mac_is_intel;
bool loaded_yet = false, got_nagged = false,ae_loading = false;
char last_load_file[63] = "Blades of Exile Save";
fs::path file_to_load;
fs::path store_file_reply;
short jl;
extern bool cur_scen_is_mac;
void print_write_position ();
void save_outdoor_maps();
void add_outdoor_maps();
short specials_res_id,data_dump_file_id;
char start_name[256];
short start_volume,data_volume;
extern fs::path progDir;
//template_town_type town_template;
cCustomGraphics spec_scen_g;
extern bool pc_gworld_loaded;
extern sf::Texture pc_gworld;
std::ofstream flog("bladeslog.txt");
void finish_load_party(){
bool town_restore = univ.town.num < 200;
bool in_scen = univ.party.scen_name.length() > 0;
party_in_memory = true;
in_scen_debug = false;
ghost_mode = false;
// now if not in scen, this is it.
if (!in_scen) {
if(overall_mode != MODE_STARTUP) {
reload_startup();
draw_startup(0);
}
if(!pc_gworld_loaded) {
pc_gworld.loadFromImage(*ResMgr::get<ImageRsrc>("pcs"));
pc_gworld_loaded = true;
}
overall_mode = MODE_STARTUP;
return;
}
fs::path path;
path = progDir/"Blades of Exile Scenarios";
path /= univ.party.scen_name;
std::cout<<"Searching for scenario at:\n"<<path<<'\n';
if (!load_scenario(path))
return;
// Saved creatures may not have had their monster attributes saved
// Make sure that they know what they are!
// Cast to cMonster base class and assign, to avoid clobbering other attributes
for(int i = 0; i < 4; i++) {
for(int j = 0; j < 60; j++) {
int number = univ.party.creature_save[i][j].number;
cMonster& monst = univ.party.creature_save[i][j];
monst = scenario.scen_monsters[number];
}
}
for(int j = 0; j < 60; j++) {
int number = univ.town.monst[j].number;
cMonster& monst = univ.town.monst[j];
monst = scenario.scen_monsters[number];
}
// if at this point, startup must be over, so make this call to make sure we're ready,
// graphics wise
end_startup();
load_outdoors(loc(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y + 1),univ.out.outdoors[1][1]);
load_outdoors(loc(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y + 1),univ.out.outdoors[0][1]);
load_outdoors(loc(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y),univ.out.outdoors[1][0]);
load_outdoors(loc(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y),univ.out.outdoors[0][0]);
//end_anim();
overall_mode = town_restore ? MODE_TOWN : MODE_OUTDOORS;
stat_screen_mode = 0;
build_outdoors();
erase_out_specials();
if (!town_restore) {
center = univ.party.p_loc;
}
else {
load_town(univ.town.num,univ.town.record);
load_town_str(univ.town.num,univ.town.record);
for (int i = 0; i < univ.town->max_monst(); i++){
univ.town.monst[i].targ_loc.x = 0;
univ.town.monst[i].targ_loc.y = 0;
}
// Set up field booleans
for (int j = 0; j < univ.town->max_dim(); j++)
for (int k = 0; k < univ.town->max_dim(); k++) {
if (univ.town.is_quickfire(j,k) == true)
univ.town.quickfire_present = true;
if(scenario.ter_types[univ.town->terrain(j,k)].special == eTerSpec::CONVEYOR)
univ.town.belt_present = true;
}
center = univ.town.p_loc;
}
redraw_screen(REFRESH_ALL);
current_pc = first_active_pc();
loaded_yet = true;
// TODO: Why is this still a C-string?
strcpy (last_load_file, file_to_load.filename().c_str());
store_file_reply = file_to_load;
add_string_to_buf("Load: Game loaded. ");
// Set sounds, map saving, and speed
if (((play_sounds == true) && (PSD[SDF_NO_SOUNDS] == 1)) ||
((play_sounds == false) && (PSD[SDF_NO_SOUNDS] == 0))) {
flip_sound();
}
give_delays = PSD[SDF_NO_FRILLS];
if (PSD[SDF_NO_MAPS] == 0)
save_maps = true;
else save_maps = false;
in_scen_debug = false;
}
void init_town(){ // formerly part of load_town
// Initialize barriers, etc. Note non-sfx gets forgotten if this is a town recently visited.
// if (mode == 0) {
unsigned int i,j;
for (i = 0; i < 64; i++)
for (j = 0; j < 64; j++) {
univ.town.fields[i][j] = 0;
//univ.out.sfx[i][j] = 0;
}
for (i = 0; i < 50; i++)
if (univ.town->special_locs[i].x < 100){
univ.town.set_special(univ.town->special_locs[i].x,univ.town->special_locs[i].y,true);
}
for (i = 0; i < univ.town->preset_fields.size(); i++) {
switch(univ.town->preset_fields[i].type){
case 1: // currently unused
univ.town.set_block(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true);
break;
case 2:
univ.town.set_spot(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true);
break;
case 3:
univ.town.set_web(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true);
break;
case 4:
univ.town.set_crate(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true);
break;
case 5:
univ.town.set_barrel(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true);
break;
case 6:
univ.town.set_fire_barr(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true);
break;
case 7:
univ.town.set_force_barr(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true);
break;
case 8:
univ.town.set_quickfire(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true);
break;
case 14:
univ.town.set_sm_blood(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true);
break;
case 15:
univ.town.set_med_blood(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true);
break;
case 16:
univ.town.set_lg_blood(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true);
break;
case 17:
univ.town.set_sm_slime(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true);
break;
case 18:
univ.town.set_lg_slime(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true);
break;
case 19:
univ.town.set_ash(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true);
break;
case 20:
univ.town.set_bones(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true);
break;
case 21:
univ.town.set_rubble(univ.town->preset_fields[i].loc.x,univ.town->preset_fields[i].loc.y,true);
break;
}
}
// }
}
void shift_universe_left()
{
short i,j;
make_cursor_watch();
save_outdoor_maps();
univ.party.outdoor_corner.x--;
univ.party.i_w_c.x++;
univ.party.p_loc.x += 48;
univ.out.outdoors[1][0] = univ.out.outdoors[0][0];
univ.out.outdoors[1][1] = univ.out.outdoors[0][1];
// outdoor_text[1][0] = outdoor_text[0][0];
// outdoor_text[1][1] = outdoor_text[0][1];
for (i = 48; i < 96; i++)
for (j = 0; j < 96; j++)
univ.out.out_e[i][j] = univ.out.out_e[i - 48][j];
for (i = 0; i < 48; i++)
for (j = 0; j < 96; j++)
univ.out.out_e[i][j] = 0;
for (i = 0; i < 10; i++) {
if (univ.party.out_c[i].m_loc.x > 48)
univ.party.out_c[i].exists = false;
if (univ.party.out_c[i].exists == true)
univ.party.out_c[i].m_loc.x += 48;
}
load_outdoors(loc(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y),univ.out.outdoors[0][0]);
load_outdoors(loc(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y + 1),univ.out.outdoors[0][1]);
build_outdoors();
restore_cursor();
}
void shift_universe_right()
{
short i,j;
make_cursor_watch();
save_outdoor_maps();
univ.party.outdoor_corner.x++;
univ.party.i_w_c.x--;
univ.party.p_loc.x -= 48;
univ.out.outdoors[0][0] = univ.out.outdoors[1][0];
univ.out.outdoors[0][1] = univ.out.outdoors[1][1];
// outdoor_text[0][0] = outdoor_text[1][0];
// outdoor_text[0][1] = outdoor_text[1][1];
for (i = 0; i < 48; i++)
for (j = 0; j < 96; j++)
univ.out.out_e[i][j] = univ.out.out_e[i + 48][j];
for (i = 48; i < 96; i++)
for (j = 0; j < 96; j++)
univ.out.out_e[i][j] = 0;
for (i = 0; i < 10; i++) {
if (univ.party.out_c[i].m_loc.x < 48)
univ.party.out_c[i].exists = false;
if (univ.party.out_c[i].exists == true)
univ.party.out_c[i].m_loc.x -= 48;
}
load_outdoors(loc(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y),univ.out.outdoors[1][0]);
load_outdoors(loc(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y + 1),univ.out.outdoors[1][1]);
build_outdoors();
restore_cursor();
}
void shift_universe_up()
{
short i,j;
make_cursor_watch();
save_outdoor_maps();
univ.party.outdoor_corner.y--;
univ.party.i_w_c.y++;
univ.party.p_loc.y += 48;
univ.out.outdoors[0][1] = univ.out.outdoors[0][0];
univ.out.outdoors[1][1] = univ.out.outdoors[1][0];
// outdoor_text[0][1] = outdoor_text[0][0];
// outdoor_text[1][1] = outdoor_text[1][0];
for (i = 0; i < 96; i++)
for (j = 48; j < 96; j++)
univ.out.out_e[i][j] = univ.out.out_e[i][j - 48];
for (i = 0; i < 96; i++)
for (j = 0; j < 48; j++)
univ.out.out_e[i][j] = 0;
for (i = 0; i < 10; i++) {
if (univ.party.out_c[i].m_loc.y > 48)
univ.party.out_c[i].exists = false;
if (univ.party.out_c[i].exists == true)
univ.party.out_c[i].m_loc.y += 48;
}
load_outdoors(loc(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y),univ.out.outdoors[0][0]);
load_outdoors(loc(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y),univ.out.outdoors[1][0]);
build_outdoors();
restore_cursor();
}
void shift_universe_down()
{
short i,j;
make_cursor_watch();
save_outdoor_maps();
univ.party.outdoor_corner.y++;
univ.party.i_w_c.y--;
univ.party.p_loc.y = univ.party.p_loc.y - 48;
univ.out.outdoors[0][0] = univ.out.outdoors[0][1];
univ.out.outdoors[1][0] = univ.out.outdoors[1][1];
// outdoor_text[0][0] = outdoor_text[0][1];
// outdoor_text[1][0] = outdoor_text[1][1];
for (i = 0; i < 96; i++)
for (j = 0; j < 48; j++)
univ.out.out_e[i][j] = univ.out.out_e[i][j + 48];
for (i = 0; i < 96; i++)
for (j = 48; j < 96; j++)
univ.out.out_e[i][j] = 0;
for (i = 0; i < 10; i++) {
if (univ.party.out_c[i].m_loc.y < 48)
univ.party.out_c[i].exists = false;
if (univ.party.out_c[i].exists == true)
univ.party.out_c[i].m_loc.y = univ.party.out_c[i].m_loc.y - 48;
}
load_outdoors(loc(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y + 1),univ.out.outdoors[0][1]);
load_outdoors(loc(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y + 1),univ.out.outdoors[1][1]);
build_outdoors();
restore_cursor();
}
void position_party(short out_x,short out_y,short pc_pos_x,short pc_pos_y) ////
{
short i,j;
if ((pc_pos_x != minmax(0,47,pc_pos_x)) || (pc_pos_y != minmax(0,47,pc_pos_y)) ||
(out_x != minmax(0,scenario.out_width - 1,out_x)) || (out_y != minmax(0,scenario.out_height - 1,out_y))) {
giveError("The scenario has tried to place you in an out of bounds outdoor location.");
return;
}
save_outdoor_maps();
univ.party.p_loc.x = pc_pos_x;
univ.party.p_loc.y = pc_pos_y;
univ.party.loc_in_sec = global_to_local(univ.party.p_loc);
if ((univ.party.outdoor_corner.x != out_x) || (univ.party.outdoor_corner.y != out_y)) {
univ.party.outdoor_corner.x = out_x;
univ.party.outdoor_corner.y = out_y;
load_outdoors(loc(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y + 1),univ.out.outdoors[1][1]);
load_outdoors(loc(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y + 1),univ.out.outdoors[0][1]);
load_outdoors(loc(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y),univ.out.outdoors[1][0]);
load_outdoors(loc(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y),univ.out.outdoors[0][0]);
}
univ.party.i_w_c.x = (univ.party.p_loc.x > 47) ? 1 : 0;
univ.party.i_w_c.y = (univ.party.p_loc.y > 47) ? 1 : 0;
for (i = 0; i < 10; i++)
univ.party.out_c[i].exists = false;
for (i = 0; i < 96; i++)
for (j = 0; j < 96; j++)
univ.out.out_e[i][j] = 0;
build_outdoors();
}
void build_outdoors()
{
short i,j;
for (i = 0; i < 48; i++)
for (j = 0; j < 48; j++) {
univ.out[i][j] = univ.out.outdoors[0][0].terrain[i][j];
univ.out[48 + i][j] = univ.out.outdoors[1][0].terrain[i][j];
univ.out[i][48 + j] = univ.out.outdoors[0][1].terrain[i][j];
univ.out[48 + i][48 + j] = univ.out.outdoors[1][1].terrain[i][j];
}
fix_boats();
add_outdoor_maps();
// make_out_trim();
// TODO: This might be another relic of the "demo" mode
if(overall_mode != MODE_STARTUP)
erase_out_specials();
for (i = 0; i < 10; i++)
if (univ.party.out_c[i].exists == true)
if ((univ.party.out_c[i].m_loc.x < 0) || (univ.party.out_c[i].m_loc.y < 0) ||
(univ.party.out_c[i].m_loc.x > 95) || (univ.party.out_c[i].m_loc.y > 95))
univ.party.out_c[i].exists = false;
}
short onm(char x_sector,char y_sector)
{
short i;
i = y_sector * scenario.out_width + x_sector;
return i;
}
// This adds the current outdoor map info to the saved outdoor map info
void save_outdoor_maps()
{
short i,j;
for (i = 0; i < 48; i++)
for (j = 0; j < 48; j++) {
if (univ.out.out_e[i][j] > 0)
univ.out_maps[onm(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y)][i / 8][j] =
univ.out_maps[onm(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y)][i / 8][j] |
(char) (s_pow(2,i % 8));
if (univ.party.outdoor_corner.x + 1 < scenario.out_width) {
if (univ.out.out_e[i + 48][j] > 0)
univ.out_maps[onm(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y)][i / 8][j] =
univ.out_maps[onm(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y)][i / 8][j] |
(char) (s_pow(2,i % 8));
}
if (univ.party.outdoor_corner.y + 1 < scenario.out_height) {
if (univ.out.out_e[i][j + 48] > 0)
univ.out_maps[onm(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y + 1)][i / 8][j] =
univ.out_maps[onm(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y + 1)][i / 8][j] |
(char) (s_pow(2,i % 8));
}
if ((univ.party.outdoor_corner.y + 1 < scenario.out_height) &&
(univ.party.outdoor_corner.x + 1 < scenario.out_width)) {
if (univ.out.out_e[i + 48][j + 48] > 0)
univ.out_maps[onm(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y + 1)][i / 8][j] =
univ.out_maps[onm(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y + 1)][i / 8][j] |
(char) (s_pow(2,i % 8));
}
}
}
void add_outdoor_maps() // This takes the existing outdoor map info and supplements it
// with the saved map info
{
short i,j;
for (i = 0; i < 48; i++)
for (j = 0; j < 48; j++) {
if ((univ.out.out_e[i][j] == 0) &&
((univ.out_maps[onm(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y)][i / 8][j] &
(char) (s_pow(2,i % 8))) != 0))
univ.out.out_e[i][j] = 1;
if (univ.party.outdoor_corner.x + 1 < scenario.out_width) {
if ((univ.out.out_e[i + 48][j] == 0) &&
((univ.out_maps[onm(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y)][i / 8][j] &
(char) (s_pow(2,i % 8))) != 0))
univ.out.out_e[i + 48][j] = 1;
}
if (univ.party.outdoor_corner.y + 1 < scenario.out_height) {
if ((univ.out.out_e[i][j + 48] == 0) &&
((univ.out_maps[onm(univ.party.outdoor_corner.x,univ.party.outdoor_corner.y + 1)][i / 8][j] &
(char) (s_pow(2,i % 8))) != 0))
univ.out.out_e[i][j + 48] = 1;
}
if ((univ.party.outdoor_corner.y + 1 < scenario.out_height) &&
(univ.party.outdoor_corner.x + 1 < scenario.out_width)) {
if ((univ.out.out_e[i + 48][j + 48] == 0) &&
((univ.out_maps[onm(univ.party.outdoor_corner.x + 1,univ.party.outdoor_corner.y + 1)][i / 8][j] &
(char) (s_pow(2,i % 8))) != 0))
univ.out.out_e[i + 48][j + 48] = 1;
}
}
}
void fix_boats()
{
short i;
for (i = 0; i < 30; i++)
if ((univ.party.boats[i].exists == true) && (univ.party.boats[i].which_town == 200)) {
if (univ.party.boats[i].sector.x == univ.party.outdoor_corner.x)
univ.party.boats[i].loc.x = univ.party.boats[i].loc_in_sec.x;
else if (univ.party.boats[i].sector.x == univ.party.outdoor_corner.x + 1)
univ.party.boats[i].loc.x = univ.party.boats[i].loc_in_sec.x + 48;
else univ.party.boats[i].loc.x = 500;
if (univ.party.boats[i].sector.y == univ.party.outdoor_corner.y)
univ.party.boats[i].loc.y = univ.party.boats[i].loc_in_sec.y;
else if (univ.party.boats[i].sector.y == univ.party.outdoor_corner.y + 1)
univ.party.boats[i].loc.y = univ.party.boats[i].loc_in_sec.y + 48;
else univ.party.boats[i].loc.y = 500;
}
for (i = 0; i < 30; i++)
if ((univ.party.horses[i].exists == true) && (univ.party.horses[i].which_town == 200)) {
if (univ.party.horses[i].sector.x == univ.party.outdoor_corner.x)
univ.party.horses[i].loc.x = univ.party.horses[i].loc_in_sec.x;
else if (univ.party.horses[i].sector.x == univ.party.outdoor_corner.x + 1)
univ.party.horses[i].loc.x = univ.party.horses[i].loc_in_sec.x + 48;
else univ.party.horses[i].loc.x = 500;
if (univ.party.horses[i].sector.y == univ.party.outdoor_corner.y)
univ.party.horses[i].loc.y = univ.party.horses[i].loc_in_sec.y;
else if (univ.party.horses[i].sector.y == univ.party.outdoor_corner.y + 1)
univ.party.horses[i].loc.y = univ.party.horses[i].loc_in_sec.y + 48;
else univ.party.horses[i].loc.y = 500;
}
}
void start_data_dump() {
fs::path path = progDir/"Data Dump.txt";
std::ofstream fout(path.c_str());
fout << "Begin data dump:\n";
fout << " Overall mode " << overall_mode << "\n";
fout << " Outdoor loc " << univ.party.outdoor_corner.x << " " << univ.party.outdoor_corner.y;
fout << " Ploc " << univ.party.p_loc.x << " " << univ.party.p_loc.y << "\n";
if ((is_town()) || (is_combat())) {
fout << " Town num " << univ.town.num << " Town loc " << univ.town.p_loc.x << " " << univ.town.p_loc.y << " \n";
if (is_combat()) {
fout << " Combat type " << which_combat_type << " \n";
}
for (long i = 0; i < univ.town->max_monst(); i++) {
fout << " Monster " << i << " Status " << univ.town.monst[i].active;
fout << " Loc " << univ.town.monst[i].cur_loc.x << " " << univ.town.monst[i].cur_loc.y;
fout << " Number " << univ.town.monst[i].number << " Att " << univ.town.monst[i].attitude;
fout << " Tf " << univ.town.monst[i].time_flag << "\n";
}
}
}
void build_scen_headers()
{
fs::path scenDir = progDir;
scenDir /= "Blades of Exile Scenarios";
printf("%s\n%s\n",progDir.c_str(),scenDir.c_str());
scen_headers.clear();
fs::path folderRef(scenDir); // TODO: This variable is unnecessary
fs::directory_iterator iter(folderRef);
// TODO: Double-check that kFSIterateFlat is identical to the behaviour of Boost's directory_iterator
#if 0
err = FSOpenIterator(&folderRef, kFSIterateFlat, &iter);
if(err != noErr){
printf("Error opening iterator!\n");
return;
}
#endif
while(iter != fs::directory_iterator()) {
fs::file_status stat = iter->status();
if(stat.type() == fs::regular_file)
load_scenario_header(iter->path());
iter++;
}
if (scen_headers.size() == 0) { // no scens present
// TODO: Should something be done here?
}
}
// This is only called at startup, when bringing headers of active scenarios.
// This wipes out the scenario record, so be sure not to call it while in an active scenario.
bool load_scenario_header(fs::path file/*,short header_entry*/){
bool file_ok = false;
long len;
bool mac_header = true;
// TODO: Rewrite using ifstream, or maybe ifstream_buf
FILE* file_id = fopen(file.c_str(), "rb");
if (file_id == NULL) {
return false;
}
scen_header_type curScen;
len = (long) sizeof(scen_header_type);
if (fread(&curScen, len, 1, file_id) < 1){
fclose(file_id); return false;
}
if ((curScen.flag1 == 10) && (curScen.flag2 == 20)
&& (curScen.flag3 == 30)
&& (curScen.flag4 == 40)) {
file_ok = true;
mac_header = true;
} else
if ((curScen.flag1 == 20) && (curScen.flag2 == 40)
&& (curScen.flag3 == 60)
&& (curScen.flag4 == 80)) {
file_ok = true;
mac_header = false;
}
if (file_ok == false) {
//scen_headers[header_entry].flag1 = 0;
//scen_headers.pop_back();
fclose(file_id);
return false;
}
// So file is OK, so load in string data and close it.
fclose(file_id);
load_scenario(file);
scen_header_str_type scen_strs;
scen_strs.name = scenario.scen_name;
scen_strs.who1 = scenario.who_wrote[0];
scen_strs.who2 = scenario.who_wrote[1];
std::string curScenarioName(file.filename().string());
scen_strs.file = curScenarioName;
if(scen_strs.file == "valleydy.exs" ||
scen_strs.file == "stealth.exs" ||
scen_strs.file == "zakhazi.exs"/* ||
scen_strs.file == "busywork.exs" */)
return false;
scen_headers.push_back(curScen,scen_strs);
return true;
}