Files
oboe/TFILEIO.CPP
2009-07-13 14:34:08 +00:00

386 lines
8.1 KiB
C++

#include <iostream>
#include "Global.h"
#include "TFILEIO.h"
extern scenario_data_type scenario;
short jl = 0;
// outdoor_record_type current_terrain;
Boolean cur_scen_is_win = 1;
void print_write_position ();
short wd_to_pwd(char *str)
{
char pwd[8] = "aaaaaa";
short i;
long val = 0,pow[6] = {1,10,100,1000,9999,99999};
for (i = 0; i < 6; i++) {
if (str[i] == 0)
i = 6;
else {
if ((str[i] >= 65) && (str[i] <= 90))
pwd[i] = str[i] + 32;
else if ((str[i] >= 48) && (str[i] <= 57))
pwd[i] = str[i] + 49;
else if ((str[i] >= 97) && (str[i] <= 122))
pwd[i] = str[i];
}
}
for (i = 0; i < 6; i++)
val = val + pow[i] * (long) (pwd[i] - 97);
val = val % 30000;
return (short) val;
}
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 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 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;
}
Boolean save_scenario(char * argv[])
{
Boolean file_ok = FALSE;
FILE *pFile;
char error;
pFile = fopen(argv[1], "rb+");
if(pFile == NULL){
return FALSE;
}
short pass = wd_to_pwd(argv[2]); //set the password variables
scenario.flag_a = sizeof(scenario_data_type) + get_ran(1,-1000,1000);
scenario.flag_b=town_s(pass);
scenario.flag_c=out_s(pass);
scenario.flag_e=str_size_1(pass);
scenario.flag_f=str_size_2(pass);
scenario.flag_h=str_size_3(pass);
scenario.flag_g = 10000 + get_ran(1,0,5000);
scenario.flag_d=init_data(pass);
/* printf("flag b : %d\nflag c : %d\n flag e : %d \n flag f : %d \n flag h : %d\n flag d : %d\n",town_s(pass),out_s(pass),str_size_1(pass),str_size_2(pass),str_size_3(pass),init_data(pass));*/
if(cur_scen_is_win == FALSE)//if Mac made scenario flip it back
port_scenario();
if((error = fwrite(&scenario, sizeof(scenario_data_type),1, pFile)) != 1 )
{
fclose(pFile);
return FALSE;
}
fclose(pFile);
return TRUE;
}
Boolean load_scenario(char * argv[])
{
Boolean file_ok = FALSE;
FILE *pFile;
char error;
pFile = fopen(argv[1], "rb");
if(pFile == NULL){
return FALSE;
}
if((error = fread(&scenario, sizeof(scenario_data_type),1, pFile)) != 1 )
{
fclose(pFile);
return FALSE;
}
if ((scenario.flag1 == 10) && (scenario.flag2 == 20)
&& (scenario.flag3 == 30)
&& (scenario.flag4 == 40)) {
cur_scen_is_win = FALSE;
file_ok = TRUE;
port_scenario();
}
if ((scenario.flag1 == 20) && (scenario.flag2 == 40)
&& (scenario.flag3 == 60)
&& (scenario.flag4 == 80)) {
cur_scen_is_win = TRUE;
file_ok = TRUE;
}
if (file_ok == FALSE) {
fclose(pFile);
printf("This is not a legitimate Blades of Exile scenario.\n","",0);
return FALSE;
}
fclose(pFile);
return TRUE;
}
void port_scenario()
{
short i,j,k,l;
if (cur_scen_is_win == TRUE)
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.scen_boats[i].which_town);
}
for (i = 0; i < 30; i++) {
flip_short(&scenario.scen_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 flip_short(short *s)
{
char store,*s1, *s2;
s1 = (char *) s;
s2 = s1 + 1;
store = *s1;
*s1 = *s2;
*s2 = store;
}
void flip_spec_node(special_node_type *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 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((short *) &(s->top));
flip_short((short *) &(s->bottom));
flip_short((short *) &(s->left));
flip_short((short *) &(s->right));
alter_rect(s);
}
void flip_rect(RECT16 *s)
{
flip_short((short *) &(s->top));
flip_short((short *) &(s->bottom));
flip_short((short *) &(s->left));
flip_short((short *) &(s->right));
alter_rect(s);
}
void alter_rect(RECT16 *r)
{
short a;
a = r->top;
r->top = r->left;
r->left = a;
a = r->bottom;
r->bottom = r->right;
r->right = a;
}