Files
oboe/osx/boe.fileio.cpp
Celtic Minstrel 434d4c522f Fix several crucial bits of data not being loaded
- Creature save data
- Outdoor wandering encounters
- Fix crash when entering outdoor combat after loading
- Stop using char types in cItemRec
- Move all pending attributes from cMonster to cCreature
2014-04-21 21:35:26 -04:00

1617 lines
46 KiB
C++

#include <CoreFoundation/CoreFoundation.h>
#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.fields.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 party_record_type party;
//extern pc_record_type adven[6];
//extern cOutdoors outdoors[2][2];
//extern unsigned char out[96][96],out_e[96][96];
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;
//extern current_town_type c_town;
//extern town_item_list t_i;
extern location center;
extern long register_flag;
extern sf::RenderWindow mainPtr;
//extern stored_items_list_type stored_items[3];
//extern stored_town_maps_type maps;
//extern stored_outdoor_maps_type o_maps;
//extern big_tr_type t_d;
//extern short town_size[3];
extern short town_type,current_pc;
extern bool web,crate,barrel,fire_barrier,force_barrier,quickfire,force_wall,fire_wall,antimagic,scloud,ice_wall,blade_wall;
extern bool sleep_field;
//extern setup_save_type setup_save;
//extern unsigned char misc_i[64][64],sfx[64][64];
//extern unsigned char template_terrain[64][64];
//extern tiny_tr_type anim_t_d;
extern bool map_visible;
//extern location monster_targs[60];
extern sf::RenderWindow mini_map;
extern short which_combat_type;
extern short cur_town_talk_loaded;
extern cScenario scenario;
extern cUniverse univ;
//extern piles_of_stuff_dumping_type *data_store;
//std::vector<std::string> scen_names;
//stored_town_maps_type town_maps;
//extern talking_record_type talking;
//extern outdoor_strs_type outdoor_text[2][2];
cScenarioList scen_headers;
extern ter_num_t combat_terrain[64][64];
extern bool belt_present;
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;
bool cur_scen_is_mac = true;
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;
//outdoor_record_type dummy_out;////
//town_record_type dummy_town;
// Trying this to fix bug. Hope it works.
// tiny_tr_type tiny_t;
// ave_tr_type ave_t;
//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;
// 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;
}
town_type = scenario.town_size[univ.town.num];
// 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_web(j,k) == true)
web = true;
if (univ.town.is_crate(j,k) == true)
crate = true;
if (univ.town.is_barrel(j,k) == true)
barrel = true;
if (univ.town.is_fire_barr(j,k) == true)
fire_barrier = true;
if (univ.town.is_force_barr(j,k) == true)
force_barrier = true;
if (univ.town.is_quickfire(j,k) == true)
quickfire = true;
if ((scenario.ter_types[univ.town->terrain(j,k)].special == TER_SPEC_CONVEYOR))
belt_present = true;
}
force_wall = true;
fire_wall = true;
antimagic = true;
scloud = true;
ice_wall = true;
blade_wall = true;
sleep_field = true;
center = univ.town.p_loc;
}
redraw_screen(REFRESH_ALL);
current_pc = first_active_pc();
loaded_yet = true;
strcpy ((char *) 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 port_save_file(party_record_type* party){
// if(!mac_is_intel) return;
// short i,j;
// flip_long(&univ.party->age);
// flip_short(&univ.party->gold);
// flip_short(&univ.party->food);
// flip_short(&univ.party->light_level);
// for(i = 0; i < 30; i++)
// flip_short(&univ.party->boats[i].which_town);
// for(i = 0; i < 30; i++)
// flip_short(&univ.party->horses[i].which_town);
// flip_short
// creature_list_type creature_save[4];
// short in_boat,in_horse;
// outdoor_creature_type out_c[10];
// cItemRec magic_store_items[5][10];
// short imprisoned_monst[4];
// char m_seen[256];
// char journal_str[50];
// short journal_day[50];
// short special_notes_str[140][2];
// talk_save_type talk_save[120];
// short direction,at_which_save_slot;
// char alchemy[20];
// bool can_find_town[200];
// short key_times[100];
// short party_event_timers[30];
// short global_or_town[30];
// short node_to_call[30];
// char spec_items[50],help_received[120];
// short m_killed[200];
// long total_m_killed,total_dam_done,total_xp_gained,total_dam_taken;
// char scen_name[256];
//}
void set_terrain(location l, ter_num_t terrain_type)
{
univ.town->terrain(l.x,l.y) = terrain_type;
combat_terrain[l.x][l.y] = terrain_type;
}
void swap_val(unsigned char *val,short a,short b)
{
if (*val == a)
*val = b;
else if (*val == b)
*val = a;
}
void change_val_4 (unsigned char *val,short a,short b,short c,short d)
{
if (*val == a)
*val = b;
else if (*val == b)
*val = c;
else if (*val == c)
*val = d;
else if (*val == d)
*val = a;
}
void change_val (unsigned char *val,short a,short b)
{
if (*val == a)
*val = b;
}
//void build_scen_file_name (Str255 file_n)
//{
// sprintf((char *) file_n,"::::Blades of Exile Scenarios:%s",univ.party.scen_name);
// c2pstr((char*)file_n);
//}
// mode 0 want town and talking, 1 talking only, 2 want a string only, and extra is string num
// Hey's let's be kludgy and overload these value again! If extra is -1, and mode 2, that
// means we want to load all the strings and only the strings
//void load_town(short town_num,short mode,short extra,char *str)
//{
// short file_id;
// short i,j;
// long store = 0;
// short which_town;
// long len,len_to_jump = 0;
// OSErr error;
// char file_name[256];
//
// if (town_num != minmax(0,scenario.num_towns - 1,town_num)) {
// give_error("The scenario tried to place you into a non-existant town.","",0);
// return;
// }
//
// which_town = town_num;
//
// //HGetVol((StringPtr) start_name,&start_volume,&start_dir);
// build_scen_file_name(file_name);
//
// error = HOpen(start_volume,start_dir,file_name,3,&file_id);
// if (error != 0) {
// //FCD(949,0);
// SysBeep(50);
// return;
// }
// len_to_jump = sizeof(scenario_data_type);
// len_to_jump += sizeof(scen_item_data_type);
// for (i = 0; i < 300; i++)
// len_to_jump += (long) scenario.scen_str_len[i];
// store = 0;
// for (i = 0; i < 100; i++)
// for (j = 0; j < 2; j++)
// store += (long) (scenario.out_data_size[i][j]);
// for (i = 0; i < which_town; i++)
// for (j = 0; j < 5; j++)
// store += (long) (scenario.town_data_size[i][j]);
// len_to_jump += store;
//
// error = SetFPos (file_id, 1, len_to_jump);
// if (error != 0) {FSClose(file_id);oops_error(35);}
//
// len = sizeof(town_record_type);
//
// if (mode == 0) {
// error = FSRead(file_id, &len , (char *) &univ.town.town);
// port_town();
// }
// else error = FSRead(file_id, &len , (char *) &dummy_town);
// if (error != 0) {FSClose(file_id);oops_error(36);}
//
// switch (scenario.town_size[which_town]) {
// case 0:
// len = sizeof(big_tr_type);
// if (mode == 0) {
// FSRead(file_id, &len, (char *) &t_d);
// port_t_d();
// }
// else error = SetFPos (file_id, 3, len);
//
// break;
//
// case 1:
// len = sizeof(ave_tr_type);
// if (mode == 0) {
// FSRead(file_id, &len, (char *) &ave_t);
// for (i = 0; i < 48; i++)
// for (j = 0; j < 48; j++) {
// t_d.terrain[i][j] = ave_t.terrain[i][j];
// t_d.lighting[i / 8][j] = ave_t.lighting[i / 8][j];
// }
// //print_nums(5555,5555,5555);
// //for (i = 0; i < 8; i++)
// // for (j = 0; j < 48; j++)
// // if (t_d.lighting[i][j] != 0) {
// // print_nums(i,j,t_d.lighting[i][j]);
// // }
//
// for (i = 0; i < 16; i++) {
// t_d.room_rect[i] = ave_t.room_rect[i];
// }
// for (i = 0; i < 40; i++) {
// t_d.creatures[i] = ave_t.creatures[i];
// }
// for (i = 40; i < 60; i++) {
// t_d.creatures[i].number = 0;
// }
// port_t_d();
// }
// else error = SetFPos (file_id, 3, len);
//
// break;
//
// case 2:
// len = sizeof(tiny_tr_type);
// if (mode == 0) {
// FSRead(file_id,&len , (char *) &tiny_t);
// for (i = 0; i < 32; i++)
// for (j = 0; j < 32; j++) {
// t_d.terrain[i][j] = tiny_t.terrain[i][j];
// t_d.lighting[i / 8][j] = tiny_t.lighting[i / 8][j];
// }
// for (i = 0; i < 16; i++) {
// t_d.room_rect[i] = tiny_t.room_rect[i];
// }
// for (i = 0; i < 30; i++) {
// t_d.creatures[i] = tiny_t.creatures[i];
// }
// for (i = 30; i < 60; i++) {
// t_d.creatures[i].number = 0;
// }
// port_t_d();
// }
// else error = SetFPos (file_id, 3, len);
// break;
// }
//
// for (i = 0; i < 140; i++) {
// len = (mode == 0) ? (long) (univ.town.town.strlens[i]) : (long) (dummy_town.strlens[i]);
// switch (mode) {
// case 0:
// FSRead(file_id, &len, (char *) &(town_strs[i]));
// data_store->town_strs[i][len] = 0;
// break;
// case 1:
// SetFPos (file_id, 3, len);
// break;
// case 2:
// if (extra < 0) {
// FSRead(file_id, &len, (char *) &(data_store->town_strs[i]));
// data_store->town_strs[i][len] = 0;
// }
// else if (i == extra) {
// FSRead(file_id, &len, (char *) str);
// str[len] = 0;
// }
// else SetFPos (file_id, 3, len);
// break;
// }
// }
//
// if (mode < 2) {
// len = sizeof(talking_record_type);
// error = FSRead(file_id, &len , (char *) &talking);
// port_talk_nodes();
// if (error != 0) {FSClose(file_id);oops_error(37);}
//
// for (i = 0; i < 170; i++) {
// len = (long) (talking.strlens[i]);
// FSRead(file_id, &len, (char *) &(talk_strs[i]));
// data_store->talk_strs[i][len] = 0;
// }
// cur_town_talk_loaded = town_num;
// }
// if (mode == 0)
// town_type = scenario.town_size[which_town];
// error = FSClose(file_id);
// if (error != 0) {FSClose(file_id);oops_error(38);}
//
// // Now more initialization is needed. First need to properly create the misc_i array.
//
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 load_outdoors(short to_create_x, short to_create_y, short targ_x, short targ_y,
// short mode,short extra,char *str)
////short to_create_x, to_create_y; // actual sector being loaded
////short targ_x, targ_y; // 0 or 1
//// mode 0 - whole out, 1 - just string number extra
//{
// short file_id;
// short i,j;
// long len;
// char file_name[256];
// short out_sec_num;
// long len_to_jump = 0,store = 0;
// OSErr error;
//
// if ((to_create_x != minmax(0,scenario.out_width - 1,to_create_x)) ||
// (to_create_y != minmax(0,scenario.out_height - 1,to_create_y))) { // not exist
// for (i = 0; i < 48; i++)
// for (j = 0; j < 48; j++)
// univ.out.outdoors[targ_x][targ_y].terrain[i][j] = 5;
// for (i = 0; i < 18; i++) {
// univ.out.outdoors[targ_x][targ_y].special_id[i] = -1;
// univ.out.outdoors[targ_x][targ_y].special_locs[i].x = 100;
// }
// return;
// }
//
// build_scen_file_name(file_name);
//
// error = HOpen(start_volume,start_dir,file_name,3,&file_id);
//
// out_sec_num = scenario.out_width * to_create_y + to_create_x;
//
// len_to_jump = sizeof(scenario_data_type);
// len_to_jump += sizeof(scen_item_data_type);
// for (i = 0; i < 300; i++)
// len_to_jump += (long) scenario.scen_str_len[i];
// store = 0;
// for (i = 0; i < out_sec_num; i++)
// for (j = 0; j < 2; j++)
// store += (long) (scenario.out_data_size[i][j]);
// len_to_jump += store;
//
// error = SetFPos (file_id, 1, len_to_jump);
// if (error != 0) {FSClose(file_id);oops_error(32);}
//
// len = sizeof(outdoor_record_type);
// if (mode == 0) {
// error = FSRead(file_id, &len, (char *) &univ.out.outdoors[targ_x][targ_y]);
// port_out(&univ.out.outdoors[targ_x][targ_y]);
// if (error != 0) {FSClose(file_id);oops_error(33);}
// }
// else error = FSRead(file_id, &len, (char *) &dummy_out);
//
// if (mode == 0) {
// for (i = 0; i < 9; i++) {
// len = (long) (univ.out.outdoors[targ_x][targ_y].strlens[i]);
// FSRead(file_id, &len, (char *) &(outdoor_text[targ_x][targ_y].out_strs[i]));
// outdoor_text[targ_x][targ_y].out_strs[i][len] = 0;
// }
// }
// if (mode == 1) {
// for (i = 0; i < 120; i++) {
// len = (long) (dummy_out.strlens[i]);
// if (i == extra) {
// FSRead(file_id, &len, (char *) str);
// str[len] = 0;
// }
// else SetFPos (file_id, 3, len);
// }
//
// }
//
// error = FSClose(file_id);
// if (error != 0) {FSClose(file_id);oops_error(33);}
//}
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";
}
}
}
// expecting party record to contain name of proper scenario to load
//bool load_scenario()
//{
//
// short i,file_id;
// bool file_ok = false;
// OSErr error;
// long len;
// char file_name[256];
//
// build_scen_file_name(file_name);
//
// error = HOpen(start_volume,start_dir,file_name,3,&file_id);
// if (error != 0) {
// oops_error(10000 + error);
// SysBeep(2); return false;
// }
//
// len = (long) sizeof(scenario_data_type);
// if ((error = FSRead(file_id, &len, (char *) &scenario)) != 0){
// FSClose(file_id); oops_error(29); return false;
// }
// if ((scenario.flag1 == 10) && (scenario.flag2 == 20)
// && (scenario.flag3 == 30)
// && (scenario.flag4 == 40)) {
// file_ok = true;
// cur_scen_is_mac = true;
// }
// if ((scenario.flag1 == 20) && (scenario.flag2 == 40)
// && (scenario.flag3 == 60)
// && (scenario.flag4 == 80)) {
// file_ok = true;
// cur_scen_is_mac = false;
// }
// if (file_ok == false) {
// FSClose(file_id);
// give_error("This is not a legitimate Blades of Exile scenario.","",0);
// return false;
// }
// port_scenario();
// len = sizeof(scen_item_data_type); // item data
// if ((error = FSRead(file_id, &len, (char *) &(scen_item_list))) != 0){
// FSClose(file_id); oops_error(30); return false;
// }
// port_item_list();
// for (i = 0; i < 270; i++) {
// len = (long) (scenario.scen_str_len[i]);
// FSRead(file_id, &len, (char *) &(scen_strs[i]));
// scen_strs[i][len] = 0;
// }
//
// FSClose(file_id);
// load_spec_graphics();
// set_up_ter_pics();
// return true;
//}
//void set_up_ter_pics()
//{
// short i;
//
// set_terrain_blocked();
// for (i = 0; i < 256; i++)
// terrain_pic[i] = scenario.ter_types[i].picture;
//}
//void oops_error(short error)
//{
// char error_str[256];
//
// SysBeep(50);
// SysBeep(50);
// SysBeep(50);
// sprintf((char *) error_str,"Giving the scenario editor more memory might also help. Be sure to back your scenario up often. Error number: %d.",error);
// give_error("The program encountered an error while loading/saving/creating the scenario. To prevent future problems, the program will now terminate. Trying again may solve the problem.",(char *) error_str,0);
// //ExitToShell();
//}
/*
typedef struct {
unsigned char flag1, flag2, flag3, flag4;
unsigned char ver[3],min_run_ver,prog_make_ver[3],num_towns;
unsigned char out_width,out_height,difficulty,intro_pic,default_ground;
} scen_header_type;
*/
void build_scen_headers()
{
fs::path scenDir = progDir;
// scenDir.erase(scenDir.find_last_of("/"));
scenDir /= "Blades of Exile Scenarios";
printf("%s\n%s\n",progDir.c_str(),scenDir.c_str());
scen_headers.clear();
// for (i = 0; i < 25; i++)
// scen_headers[i].flag1 = 0;
// FSOpenIterator(&folderRef,0,&files);
fs::path folderRef(scenDir); // TODO: This variable is unnecessary
fs::directory_iterator iter(folderRef);
/**TESTING**/
// UniChar x[] = {0x0024, 0x0041, 0x0020, 0x0075, 0x0073, 0x0065, 0x006c, 0x0065, 0x0073, 0x0073, 0x0020, 0x0066, 0x0069, 0x006c, 0x0065};
// err = FSCreateFileUnicode (&ref, 15, x, NULL, NULL, NULL, NULL);
// if(err != noErr)printf("Error creating file.");
/**END TESTING**/
// 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
//myCPB.dirInfo.ioCompletion = NULL;
//myCPB.dirInfo.ioNamePtr = scen_name;
//myCPB.dirInfo.ioVRefNum = start_volume;
// HFSUniStr255 names[MAXSHEETS];
// FSSpec locations[MAXSHEETS];
// int numFound=0;
// FSGetCatalogInfoBulk (files,(ItemCount)MAXSHEETS,(ItemCount*)&numFound,NULL,kFSCatInfoNone,NULL,NULL,locations, names)
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.
// SetFPos(file_id,1,0);
// len = 41942;//(long) sizeof(scenario_data_type);
// error = FSRead(file_id, &len, (char *) &scenario);
// if (error != 0){
// FSClose(file_id);
// oops_error(29);
// return false;
// }
// store = scenario.rating;
// if (mac_header == false)
// flip_short(&store);
// curScen.default_ground = store;
//
// len = 39200;//sizeof(scen_item_data_type);
// if (SetFPos(file_id,3,len) != 0){
// FSClose(file_id);
// return false;
// }
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);
// for (i = 0; i < 3; i++) {
// store = (short) scenario.scen_str_len[i];
// len = (long) (store);
// FSRead(file_id, &len, (char *) load_str);
// load_str[len] = 0;
// if (i == 0)
// load_str[29] = 0;
// else load_str[59] = 0;
// scen_strs[i] = (char*)load_str;
// }
//FSClose(file_id);
return true;
}
//extern GWorldPtr spec_scen_g;
//void load_spec_graphics()
//{
// short i,file_num;
// char file_name[256];
//
// if (spec_scen_g != NULL) {
// DisposeGWorld(spec_scen_g);
// spec_scen_g = NULL;
// }
// build_scen_file_name(file_name);
// for (i = 0; i < 250; i++) {
// if (file_name[i] == '.') {
// file_name[i + 1] = 'm';
// file_name[i + 2] = 'e';
// file_name[i + 3] = 'g';
// i = 250;
// }
// }
// file_num = HOpenResFile(start_volume,start_dir,file_name,1);
// if (file_num < 0)
// {
// for (i = 0; i < 250; i++) {
// if (file_name[i] == '.') {
// file_name[i + 1] = 'b';
// file_name[i + 2] = 'm';
// file_name[i + 3] = 'p';
// i = 250;
// }
// }
// spec_scen_g = load_bmp_from_file(file_name);
// return;
// }
// spec_scen_g = load_pict(1);
// CloseResFile(file_num);
//}
//short init_data(short flag)
//{
// long k = 0;
//
// k = (long) flag;
// k = k * k;
// jl = jl * jl + 84 + k;
// k = k + 51;
// jl = jl * 2 + 1234 + k;
//k = k % 3000;
// jl = jl * 54;
// jl = jl * 2 + 1234 + k;
// k = k * 82;
// k = k % 10000;
// k = k + 10000;
//
// return (short) k;
//}
//
//short town_s(short flag)
//{
// long k = 0;
//
// k = (long) flag;
// k = k * k * k;
// jl = jl * 54;
// jl = jl * 2 + 1234 + k;
// k = k + 51;
// k = k % 3000;
// jl = jl * 2 + 1234 + k;
// k = k * scenario.num_towns;
// k = k % 10000;
// jl = jl * jl + 84 + k;
// k = k + 10000;
//
// return (short) k;
//}
//
//short out_s(short flag)
//{
// long k = 0;
//
// k = (long) flag;
// k = k * k * k;
// jl = jl * jl + 84 + k;
// k = k + scenario.out_data_size[0][1];
// k = k % 3000;
// k = k * 4;
// jl = jl * 2 + 1234 + k;
// jl = jl * 54;
// jl = jl * 2 + 1234 + k;
// k = k % 10000;
// k = k + 4;
//
// return (short) k;
//}
//
//short str_size_1(short flag)
//{
// long k = 0;
//
// k = (long) flag;
// k = k * k;
// jl = jl * 2 + 1234 + k;
// jl = jl * jl + 84 + k;
// k = k + scenario.scen_str_len[0] + scenario.scen_str_len[1] + scenario.scen_str_len[2];
// jl = jl * 2 + 1234 + k;
// k = k % 3000;
// jl = jl * 54;
// jl = jl * jl + 84 + k;
// k = k * 4;
// k = k % 5000;
// k = k - 9099;
//
// return (short) k;
//}
//
//short str_size_2(short flag)
//{
// long k = 0;
//
// k = (long) flag;
// jl = jl * jl + 84 + k;
// k = k * k * k * k;
// jl = jl * 54;
// k = k + 80;
// k = k % 3000;
// jl = jl * 2 + 1234 + k;
// k = k * scenario.out_width * scenario.out_height;
// jl = jl * jl + 84 + k;
// k = k % 3124;
// k = k - 5426;
//
// return (short) k;
//}
//
//short str_size_3(short flag)
//{
// long k = 0;
//
// k = (long) flag;
// k = k * (scenario.town_data_size[0][0] + scenario.town_data_size[0][1] + scenario.town_data_size[0][2] + scenario.town_data_size[0][3]);
// k = k + 80;
// jl = jl * jl + 84 + k;
// k = k % 3000;
// jl = jl * 2 + 1234 + k;
// k = k * 45;
// jl = jl * 54;
// jl = jl * jl + 84 + k;
// k = k % 887;
// k = k + 9452;
//
// return (short) k;
//}
//
//short get_buf_ptr(short flag)
//{
// long k = 0;
//
// k = (long) flag;
// jl = jl * jl + 84 + k;
// k = k * (scenario.out_width + scenario.out_width + scenario.out_height + scenario.town_data_size[0][3]);
// k = k + 80;
// jl = jl * jl + 84 + k;
// k = k % 2443;
// jl = jl * 54;
// k = k * 322;
// jl = jl * 2 + 1234 + k;
// k = k % 2542;
// jl = jl * jl + 84 + k;
// k = k + 234;
//
// return (short) k;
//}
//
//bool check_p (short pword)
//{
// if (scenario.flag_b != town_s(pword))
// return false;
// if (scenario.flag_c != out_s(pword))
// return false;
// if (scenario.flag_e != str_size_1(pword))
// return false;
// if (scenario.flag_f != str_size_2(pword))
// return false;
// if (scenario.flag_h != str_size_3(pword))
// return false;
// if (scenario.flag_d != init_data(pword))
// return false;
//
// return true;
//}
//void port_talk_nodes()
//{
// short i;
//
// if (cur_scen_is_mac != mac_is_intel)
// return;
// for (i = 0; i < 60; i++) {
// flip_short(&talking.talk_nodes[i].personality);
// flip_short(&talking.talk_nodes[i].type);
// flip_short(&talking.talk_nodes[i].extras[0]);
// flip_short(&talking.talk_nodes[i].extras[1]);
// flip_short(&talking.talk_nodes[i].extras[2]);
// flip_short(&talking.talk_nodes[i].extras[3]);
// }
//}
//
//void port_town()
//{
// short i;
//
// if (cur_scen_is_mac != mac_is_intel)
// return;
// flip_short(&univ.town.town.town_chop_time);
// flip_short(&univ.town.town.town_chop_key);
// flip_short(&univ.town.town.lighting);
// for (i =0 ; i < 4; i++)
// flip_short(&univ.town.town.exit_specs[i]);
// flip_rect(&univ.town.town.in_town_rect);
// for (i =0 ; i < 64; i++) {
// flip_short(&univ.town.town.preset_items[i].item_code);
// flip_short(&univ.town.town.preset_items[i].ability);
// }
// for (i =0 ; i < 50; i++) {
// flip_short(&univ.town.town.preset_fields[i].field_type);
// }
// flip_short(&univ.town.town.max_num_monst);
// flip_short(&univ.town.town.spec_on_entry);
// flip_short(&univ.town.town.spec_on_entry_if_dead);
// for (i =0 ; i < 8; i++)
// flip_short(&univ.town.town.timer_spec_times[i]);
// for (i =0 ; i < 8; i++)
// flip_short(&univ.town.town.timer_specs[i]);
// flip_short(&univ.town.town.difficulty);
// for (i =0 ; i < 100; i++)
// flip_spec_node(&univ.town.town.specials[i]);
//
//}
//
//void port_t_d()
//{
// short i;
// if (cur_scen_is_mac != mac_is_intel)
// return;
//
// for (i =0 ; i < 16; i++)
// flip_rect(&t_d.room_rect[i]);
// for (i =0 ; i < 60; i++) {
// flip_short(&t_d.creatures[i].spec1);
// flip_short(&t_d.creatures[i].spec2);
// flip_short(&t_d.creatures[i].monster_time);
// flip_short(&t_d.creatures[i].personality);
// flip_short(&t_d.creatures[i].special_on_kill);
// flip_short(&t_d.creatures[i].facial_pic);
//
// }
//}
//
//void port_scenario()
//{
// short i,j;
//
// if (cur_scen_is_mac != mac_is_intel)
// return;
// flip_short(&scenario.flag_a);
// flip_short(&scenario.flag_b);
// flip_short(&scenario.flag_c);
// flip_short(&scenario.flag_d);
// flip_short(&scenario.flag_e);
// flip_short(&scenario.flag_f);
// flip_short(&scenario.flag_g);
// flip_short(&scenario.flag_h);
// flip_short(&scenario.flag_i);
// flip_short(&scenario.intro_mess_pic);
// flip_short(&scenario.intro_mess_len);
// flip_short(&scenario.which_town_start);
// for (i = 0; i < 200; i++)
// for (j = 0; j < 5; j++)
// flip_short(&scenario.town_data_size[i][j]);
// for (i = 0; i < 10; i++)
// flip_short(&scenario.town_to_add_to[i]);
// for (i = 0; i < 10; i++)
// for (j = 0; j < 2; j++)
// flip_short(&scenario.flag_to_add_to_town[i][j]);
// for (i = 0; i < 100; i++)
// for (j = 0; j < 2; j++)
// flip_short(&scenario.out_data_size[i][j]);
// for (i = 0; i < 3; i++)
// flip_rect(&scenario.store_item_rects[i]);
// for (i = 0; i < 3; i++)
// flip_short(&scenario.store_item_towns[i]);
// for (i = 0; i < 50; i++)
// flip_short(&scenario.special_items[i]);
// for (i = 0; i < 50; i++)
// flip_short(&scenario.special_item_special[i]);
// flip_short(&scenario.rating);
// flip_short(&scenario.uses_custom_graphics);
// for (i = 0; i < 256; i++) {
// flip_short(&scenario.scen_monsters[i].health);
// flip_short(&scenario.scen_monsters[i].m_health);
// flip_short(&scenario.scen_monsters[i].max_mp);
// flip_short(&scenario.scen_monsters[i].mp);
// flip_short(&scenario.scen_monsters[i].a[1]);
// flip_short(&scenario.scen_monsters[i].a[0]);
// flip_short(&scenario.scen_monsters[i].a[2]);
// flip_short(&scenario.scen_monsters[i].morale);
// flip_short(&scenario.scen_monsters[i].m_morale);
// flip_short(&scenario.scen_monsters[i].corpse_item);
// flip_short(&scenario.scen_monsters[i].corpse_item_chance);
// flip_short(&scenario.scen_monsters[i].picture_num);
// }
//
// for (i = 0; i < 256; i++) {
// flip_short(&scenario.ter_types[i].picture);
// }
// for (i = 0; i < 30; i++) {
// flip_short(&scenario.boats[i].which_town);
// }
// for (i = 0; i < 30; i++) {
// flip_short(&scenario.horses[i].which_town);
// }
// for (i = 0; i < 20; i++)
// flip_short(&scenario.scenario_timer_times[i]);
// for (i = 0; i < 20; i++)
// flip_short(&scenario.scenario_timer_specs[i]);
// for (i = 0; i < 256; i++) {
// flip_spec_node(&scenario.scen_specials[i]);
// }
// for (i = 0; i < 10; i++) {
// flip_short(&scenario.storage_shortcuts[i].ter_type);
// flip_short(&scenario.storage_shortcuts[i].property);
// for (j = 0; j < 10; j++) {
// flip_short(&scenario.storage_shortcuts[i].item_num[j]);
// flip_short(&scenario.storage_shortcuts[i].item_odds[j]);
// }
// }
// flip_short(&scenario.last_town_edited);
//}
//
//
//void port_item_list()
//{
// short i;
//
// if (cur_scen_is_mac != mac_is_intel)
// return;
//
// for (i = 0; i < 400; i++) {
// flip_short(&(scenario.scen_items[i].variety));
// flip_short(&(scenario.scen_items[i].item_level));
// flip_short(&(scenario.scen_items[i].value));
// }
//}
//
//void port_out(outdoor_record_type *out)
//{
// short i;
//
// if (cur_scen_is_mac != mac_is_intel)
// return;
//
// for (i = 0; i < 4; i++) {
// flip_short(&(out->wandering[i].spec_on_meet));
// flip_short(&(out->wandering[i].spec_on_win));
// flip_short(&(out->wandering[i].spec_on_flee));
// flip_short(&(out->wandering[i].cant_flee));
// flip_short(&(out->wandering[i].end_spec1));
// flip_short(&(out->wandering[i].end_spec2));
// flip_short(&(out->special_enc[i].spec_on_meet));
// flip_short(&(out->special_enc[i].spec_on_win));
// flip_short(&(out->special_enc[i].spec_on_flee));
// flip_short(&(out->special_enc[i].cant_flee));
// flip_short(&(out->special_enc[i].end_spec1));
// flip_short(&(out->special_enc[i].end_spec2));
// }
// for (i = 0; i < 8; i++)
// flip_rect(&(out->info_rect[i]));
// for (i = 0; i < 60; i++)
// flip_spec_node(&(out->specials[i]));
//}
//
//void flip_spec_node(cSpecial *spec)
//{
// flip_short(&(spec->type));
// flip_short(&(spec->sd1));
// flip_short(&(spec->sd2));
// flip_short(&(spec->pic));
// flip_short(&(spec->m1));
// flip_short(&(spec->m2));
// flip_short(&(spec->ex1a));
// flip_short(&(spec->ex1b));
// flip_short(&(spec->ex2a));
// flip_short(&(spec->ex2b));
// flip_short(&(spec->jumpto));
//}
//
//void flip_short(short *s)
//{
// char store,*s1, *s2;
//
// s1 = (char *) s;
// s2 = s1 + 1;
// store = *s1;
// *s1 = *s2;
// *s2 = store;
//
//}
//
//void flip_long(long *s)
//{
// char store,*s1, *s2, *s3, *s4;
//
// s1 = (char *) s;
// s2 = s1 + 1;
// s3 = s1 + 2;
// s4 = s1 + 3;
// store = *s1;
// *s1 = *s4;
// *s4 = store;
// store = *s2;
// *s2 = *s3;
// *s3 = store;
//
//}
//void alter_rect(RECT *r)
//{
// short a;
//
// a = r->top;
// r->top = r->left;
// r->left = a;
// a = r->bottom;
// r->bottom = r->right;
// r->right = a;
//}
//
//void flip_rect(RECT *s)
//{
// flip_short(&(s->top));
// flip_short(&(s->bottom));
// flip_short(&(s->left));
// flip_short(&(s->right));
// alter_rect(s);
//}