/*
* Seven Kingdoms: Ancient Adversaries
*
* Copyright 1997,1998 Enlight Software Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
//Filename : OGFILE2.CPP
//Description : Object Game file, save game and restore game, part 2
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
// ##### begin Gilbert 2/10 #######//
#include
// ##### end Gilbert 2/10 #######//
//-------- Define constant ----------//
#define BOOK_MARK 0x1000 // book mark for validing saving data
//----------- Game file format --------------//
//
// Data of the following objects will be saved :
//
// RaceRes race_res;
// UnitRes unit_res;
// FirmRes firm_res;
// TownRes town_res;
// TechRes tech_res;
// TalkRes talk_res;
// RawRes raw_res;
// GodRes god_res;
// MonsterRes monster_res;
//
// UnitArray unit_array(100); // with derived classes
// BulletArray bullet_array(100);
// SiteArray site_array;
// TownArray town_array;
// NationArray nation_array;
// FirmArray firm_array; // with derived classes
// TornadoArray tornado_array(10);
// RebelArray rebel_array;
// SpyArray spy_array;
// SnowGroundArray snow_ground_array;
// RegionArray region_array;
// NewsArray news_array;
//
// Game game
// Config config
// Sys sys
// Info info
// Power power
// Weather weather, weather_forecast[MAX_WEATHER_FORECAST];
// MagicWeather magic_weather
// News news
// World world
// Tutor tutor
//### begin alex 23/9 ###//
// SeekPath seek_path
//#### end alex 23/9 ####//
//
//-------------------------------------------//
//--------- Define static vars ---------//
static int loaded_random_seed;
//-------- Define static class member vars -------//
File* GameFile::file_ptr;
char GameFile::last_read_success_flag=0;
//-------- Begin of function GameFile::write_file -------//
//
// Save a game to file
//
// Return : 1 - file written successfully
// 0 - not successful
//
int GameFile::write_file(File* filePtr)
{
file_ptr = filePtr; // for write_book_mark()
//----- check valid version first ------//
if( game_file_array.demo_format )
filePtr->file_put_short( -GAME_VERSION ); // negative no. means shareware version
else
filePtr->file_put_short( GAME_VERSION );
//------------------------------------------------//
//
// The order of writing data is different between
// the shareware and registered version.
//
//------------------------------------------------//
if( game_file_array.demo_format )
{
if( !write_file_1(filePtr) )
return 0;
if( !write_file_2(filePtr) )
return 0;
}
else
{
if( !write_file_2(filePtr) )
return 0;
if( !write_file_1(filePtr) )
return 0;
}
if( !write_file_3(filePtr) )
return 0;
return 1;
}
//---------- End of function GameFile::write_file -------//
//-------- Begin of function GameFile::read_file -------//
//
// Restore a game from file
//
// Return : 1 - file read successfully
// 0 - not successful
// -1 - incorrect game data version error
//
int GameFile::read_file(File* filePtr)
{
file_ptr = filePtr; // for read_book_mark()
//----- check version no. first ------//
int originalRandomSeed = m.get_random_seed();
//### begin alex 5/3 ###//
#ifdef AMPLUS
// game_file_array.load_file_game_version = filePtr->file_get_short();
game_file_array.load_file_game_version = filePtr->file_get_short();
// compare if same demo format or not
if( game_file_array.demo_format && game_file_array.load_file_game_version > 0
|| !game_file_array.demo_format && game_file_array.load_file_game_version < 0)
return -1;
// take the absolute value of game version
game_file_array.load_file_game_version = abs(game_file_array.load_file_game_version);
if(game_file_array.load_file_game_version > GAME_VERSION)
return -1; // the executing program can't handle saved game in future version
// game_file_array.same_version = (game_file_array.load_file_game_version/100==
// (game_file_array.demo_format ? -(GAME_VERSION/100) : GAME_VERSION/100));
game_file_array.same_version = ( game_file_array.load_file_game_version/100==GAME_VERSION/100 );
#else
// ###### patch begin Gilbert 20/1 ########//
// compare major version
//if( filePtr->file_get_short() != (game_file_array.demo_format ? -GAME_VERSION : GAME_VERSION) )
if( filePtr->file_get_short()/100 != (game_file_array.demo_format ? -(GAME_VERSION/100) : GAME_VERSION/100) )
return -1;
// ###### patch end Gilbert 20/1 ########//
#endif
//#### end alex 5/3 ####//
//------------------------------------------------//
//
// The order of writing data is different between
// the shareware and registered version.
//
//------------------------------------------------//
if( game_file_array.demo_format )
{
if( !read_file_1(filePtr) )
return 0;
if( !read_file_2(filePtr) )
return 0;
}
else
{
if( !read_file_2(filePtr) )
return 0;
if( !read_file_1(filePtr) )
return 0;
}
if( !read_file_3(filePtr) )
return 0;
//-------------------------------------//
err_when( originalRandomSeed != m.get_random_seed() );
m.set_random_seed(loaded_random_seed);
return 1;
}
//---------- End of function GameFile::read_file -------//
//-------- Begin of function GameFile::write_file_1 -------//
//
// Return : 1 - file written successfully
// 0 - not successful
//
int GameFile::write_file_1(File* filePtr)
{
write_book_mark( BOOK_MARK+1 );
if( !race_res.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+2 );
if( !unit_res.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+3 );
if( !firm_res.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+4 );
if( !town_res.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+5 );
if( !tech_res.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+6 );
if( !talk_res.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+7 );
if( !raw_res.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+8 );
if( !god_res.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+9 );
if( !monster_res.write_file(filePtr) )
return 0;
return 1;
}
//---------- End of function GameFile::write_file_1 -------//
//-------- Begin of function GameFile::write_file_2 -------//
//
// Save a game to file
//
// Return : 1 - file written successfully
// 0 - not successful
//
int GameFile::write_file_2(File* filePtr)
{
write_book_mark( BOOK_MARK+101 );
if( !game.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+102 );
if( !config.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+103 );
if( !sys.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+104 );
if( !info.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+105 );
if( !power.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+106 );
if( !weather.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+107 );
if( !magic_weather.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+108 );
if( !news_array.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+109 );
if( !world.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+110 );
if( !tutor.write_file(filePtr) )
return 0;
//### begin alex 23/9 ###//
write_book_mark( BOOK_MARK+111 );
if( !seek_path.write_file(filePtr) )
return 0;
//#### end alex 23/9 ####//
return 1;
}
//---------- End of function GameFile::write_file_2 -------//
//-------- Begin of function GameFile::write_file_3 -------//
//
// Return : 1 - file written successfully
// 0 - not successful
//
int GameFile::write_file_3(File* filePtr)
{
write_book_mark( BOOK_MARK+201 );
if( !unit_array.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+202 );
if( !bullet_array.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+203 );
if( !site_array.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+204 );
if( !town_array.write_file(filePtr) ) // job will affect firm, group, item
return 0;
write_book_mark( BOOK_MARK+205 );
if( !nation_array.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+206 );
if( !firm_array.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+207 );
if( !tornado_array.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+208 );
if( !rebel_array.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+209 );
if( !spy_array.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+210 );
if( !snow_ground_array.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+211 );
if( !region_array.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+212 );
if( !news_array.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+213 );
if( !rock_array.write_file(filePtr) )
return 0;
write_book_mark( BOOK_MARK+214 );
if( !dirt_array.write_file(filePtr) )
return 0;
// ##### begin Gilbert 2/10 ######//
write_book_mark( BOOK_MARK+215 );
if( !firm_die_array.write_file(filePtr) )
return 0;
// ##### end Gilbert 2/10 ######//
return 1;
}
//---------- End of function GameFile::write_file_3 -------//
//-------- Begin of function GameFile::read_file_1 -------//
//
// Return : 1 - file read successfully
// 0 - not successful
//
int GameFile::read_file_1(File* filePtr)
{
if( !read_book_mark( BOOK_MARK+1 ) )
return 0;
if( !race_res.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+2 ) )
return 0;
if( !unit_res.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+3 ) )
return 0;
if( !firm_res.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+4 ) )
return 0;
if( !town_res.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+5 ) )
return 0;
if( !tech_res.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+6 ) )
return 0;
if( !talk_res.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+7 ) )
return 0;
if( !raw_res.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+8 ) )
return 0;
if( !god_res.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+9 ) )
return 0;
if( !monster_res.read_file(filePtr) )
return 0;
return 1;
}
//---------- End of function GameFile::read_file_1 -------//
//-------- Begin of function GameFile::read_file_2 -------//
//
// Return : 1 - file read successfully
// 0 - not successful
//
int GameFile::read_file_2(File* filePtr)
{
if( !read_book_mark( BOOK_MARK+101 ) )
return 0;
if( !game.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+102 ) )
return 0;
if( !config.read_file(filePtr, 1) ) // 1-keep system settings
return 0;
if( !read_book_mark( BOOK_MARK+103 ) )
return 0;
if( !sys.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+104 ) )
return 0;
if( !info.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+105 ) )
return 0;
if( !power.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+106 ) )
return 0;
if( !weather.read_file(filePtr) )
return 0;
weather_forecast[0] = weather;
weather_forecast[0].next_day();
for(int foreDay=1; foreDay < MAX_WEATHER_FORECAST; ++foreDay)
{
weather_forecast[foreDay] = weather_forecast[foreDay-1];
weather_forecast[foreDay].next_day();
}
if( !read_book_mark( BOOK_MARK+107 ) )
return 0;
if( !magic_weather.read_file(filePtr) )
return 0;
sprite_res.update_speed();
if( !read_book_mark( BOOK_MARK+108 ) )
return 0;
if( !news_array.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+109 ) )
return 0;
if( !world.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+110 ) )
return 0;
if( !tutor.read_file(filePtr) )
return 0;
//### begin alex 23/9 ###//
if( !read_book_mark( BOOK_MARK+111 ) )
return 0;
if( !seek_path.read_file(filePtr) )
return 0;
//#### end alex 23/9 ####//
return 1;
}
//---------- End of function GameFile::read_file_2 -------//
//-------- Begin of function GameFile::read_file_3 -------//
//
// Return : 1 - file read successfully
// 0 - not successful
//
int GameFile::read_file_3(File* filePtr)
{
if( !read_book_mark( BOOK_MARK+201 ) )
return 0;
if( !unit_array.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+202 ) )
return 0;
if( !bullet_array.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+203 ) )
return 0;
if( !site_array.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+204 ) )
return 0;
if( !town_array.read_file(filePtr) ) // job will affect firm, group, item
return 0;
if( !read_book_mark( BOOK_MARK+205 ) )
return 0;
if( !nation_array.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+206 ) )
return 0;
if( !firm_array.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+207 ) )
return 0;
if( !tornado_array.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+208 ) )
return 0;
if( !rebel_array.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+209 ) )
return 0;
if( !spy_array.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+210 ) )
return 0;
if( !snow_ground_array.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+211 ) )
return 0;
if( !region_array.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+212 ) )
return 0;
if( !news_array.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+213 ) )
return 0;
if( !rock_array.read_file(filePtr) )
return 0;
if( !read_book_mark( BOOK_MARK+214 ) )
return 0;
if( !dirt_array.read_file(filePtr) )
return 0;
// ##### begin Gilbert 2/10 ######//
if( !read_book_mark( BOOK_MARK+215 ) )
if( !firm_die_array.read_file(filePtr) )
return 0;
// ##### end Gilbert 2/10 ######//
return 1;
}
//---------- End of function GameFile::read_file_3 -------//
//-------- Begin of function GameFile::write_book_mark -------//
//
void GameFile::write_book_mark(short bookMark)
{
sys.yield();
file_ptr->file_put_short(bookMark);
}
//---------- End of function GameFile::write_book_mark -------//
//-------- Begin of function GameFile::read_book_mark -------//
//
// Return : 1 - the book mark is matched
// 0 - the book mark is not matched
//
int GameFile::read_book_mark(short bookMark)
{
sys.yield();
return file_ptr->file_get_short() == bookMark;
}
//---------- End of function GameFile::read_book_mark -------//
//***//
//-------- Start of function RaceRes::write_file -------------//
//
int RaceRes::write_file(File* filePtr)
{
//------- write RaceInfo -------//
RaceInfo* raceInfo = race_info_array;
for( int i=1 ; i<=race_res.race_count ; i++, raceInfo++ )
{
filePtr->file_put_short( raceInfo->town_name_used_count );
}
return filePtr->file_write( name_used_array, sizeof(name_used_array[0]) * name_count );
}
//--------- End of function RaceRes::write_file ---------------//
//-------- Start of function RaceRes::read_file -------------//
//
int RaceRes::read_file(File* filePtr)
{
//------- read RaceInfo -------//
RaceInfo* raceInfo = race_info_array;
for( int i=1 ; i<=race_res.race_count ; i++, raceInfo++ )
{
#ifdef AMPLUS
raceInfo->town_name_used_count = (!game_file_array.same_version && i>VERSION_1_MAX_RACE) ?
0 : filePtr->file_get_short();
#else
raceInfo->town_name_used_count = filePtr->file_get_short();
#endif
}
#ifdef AMPLUS
if(!game_file_array.same_version)
{
memset(name_used_array, 0, sizeof(name_used_array[0]) * name_count);
return filePtr->file_read( name_used_array, sizeof(name_used_array[0]) * VERSION_1_RACERES_NAME_COUNT );
}
else
return filePtr->file_read( name_used_array, sizeof(name_used_array[0]) * name_count );
#else
return filePtr->file_read( name_used_array, sizeof(name_used_array[0]) * name_count );
#endif
}
//--------- End of function RaceRes::read_file ---------------//
//***//
//-------- Start of function UnitRes::write_file -------------//
//
int UnitRes::write_file(File* filePtr)
{
filePtr->file_put_short(mobile_monster_count);
UnitInfo* unitInfo = unit_info_array;
for( int i=1 ; i<=unit_res.unit_info_count ; i++, unitInfo++ )
{
if( !filePtr->file_write( unitInfo->nation_tech_level_array, sizeof(unitInfo->nation_tech_level_array) ) )
return 0;
if( !filePtr->file_write( unitInfo->nation_unit_count_array, sizeof(unitInfo->nation_unit_count_array) ) )
return 0;
if( !filePtr->file_write( unitInfo->nation_general_count_array, sizeof(unitInfo->nation_general_count_array) ) )
return 0;
}
return 1;
}
//--------- End of function UnitRes::write_file ---------------//
//-------- Start of function UnitRes::read_file -------------//
//
int UnitRes::read_file(File* filePtr)
{
mobile_monster_count = filePtr->file_get_short();
UnitInfo* unitInfo = unit_info_array;
for( int i=1 ; i<=unit_res.unit_info_count ; i++, unitInfo++ )
{
#ifdef AMPLUS
if(!game_file_array.same_version && i > VERSION_1_UNITRES_UNIT_INFO_COUNT)
{
memset(unitInfo->nation_tech_level_array, 0, sizeof(unitInfo->nation_tech_level_array));
memset(unitInfo->nation_unit_count_array, 0, sizeof(unitInfo->nation_unit_count_array));
memset(unitInfo->nation_general_count_array, 0, sizeof(unitInfo->nation_general_count_array));
continue;
}
#endif
if( !filePtr->file_read( unitInfo->nation_tech_level_array, sizeof(unitInfo->nation_tech_level_array) ) )
return 0;
if( !filePtr->file_read( unitInfo->nation_unit_count_array, sizeof(unitInfo->nation_unit_count_array) ) )
return 0;
if( !filePtr->file_read( unitInfo->nation_general_count_array, sizeof(unitInfo->nation_general_count_array) ) )
return 0;
}
return 1;
}
//--------- End of function UnitRes::read_file ---------------//
//***//
//-------- Start of function FirmRes::write_file -------------//
//
int FirmRes::write_file(File* filePtr)
{
return filePtr->file_write( firm_info_array, firm_count * sizeof(FirmInfo) );
}
//--------- End of function FirmRes::write_file ---------------//
//-------- Start of function FirmRes::read_file -------------//
//
int FirmRes::read_file(File* filePtr)
{
int arraySize = firm_count * sizeof(FirmInfo);
//----- save the firm names, so that it won't be overwritten by the saved game file ----//
FirmInfo* oldFirmInfoArray = (FirmInfo*) mem_add(arraySize);
memcpy( oldFirmInfoArray, firm_info_array, arraySize );
int rc = filePtr->file_read( firm_info_array, arraySize );
for( int i=0 ; ifile_write( town_name_used_array, sizeof(town_name_used_array[0]) * town_name_count );
}
//--------- End of function TownRes::write_file ---------------//
//-------- Start of function TownRes::read_file -------------//
//
int TownRes::read_file(File* filePtr)
{
#ifdef AMPLUS
if(!game_file_array.same_version)
{
memset(town_name_used_array, 0, sizeof(town_name_used_array));
return filePtr->file_read( town_name_used_array, sizeof(town_name_used_array[0]) * VERSION_1_TOWNRES_TOWN_NAME_COUNT );
}
else
return filePtr->file_read( town_name_used_array, sizeof(town_name_used_array[0]) * town_name_count );
#else
return filePtr->file_read( town_name_used_array, sizeof(town_name_used_array[0]) * town_name_count );
#endif
}
//--------- End of function TownRes::read_file ---------------//
//***//
//-------- Start of function TechRes::write_file -------------//
//
int TechRes::write_file(File* filePtr)
{
if( !filePtr->file_write( tech_class_array, tech_class_count * sizeof(TechClass) ) )
return 0;
if( !filePtr->file_write( tech_info_array, tech_count * sizeof(TechInfo) ) )
return 0;
return 1;
}
//--------- End of function TechRes::write_file ---------------//
//-------- Start of function TechRes::read_file -------------//
//
int TechRes::read_file(File* filePtr)
{
if( !filePtr->file_read( tech_class_array, tech_class_count * sizeof(TechClass) ) )
return 0;
#ifdef AMPLUS
if(!game_file_array.same_version)
{
if(!filePtr->file_read( tech_info_array, VERSION_1_TECH_COUNT * sizeof(TechInfo) ) )
return 0;
TechInfo *techInfoPtr = tech_info_array + VERSION_1_TECH_COUNT;
for(int i=VERSION_1_TECH_COUNT; ination_tech_level_array, 0, sizeof(techInfoPtr->nation_tech_level_array));
memset(techInfoPtr->nation_is_researching_array, 0, sizeof(techInfoPtr->nation_is_researching_array));
memset(techInfoPtr->nation_research_progress_array, 0, sizeof(techInfoPtr->nation_research_progress_array));
}
}
else
{
if( !filePtr->file_read( tech_info_array, tech_count * sizeof(TechInfo) ) )
return 0;
}
#else
if( !filePtr->file_read( tech_info_array, tech_count * sizeof(TechInfo) ) )
return 0;
#endif
return 1;
}
//--------- End of function TechRes::read_file ---------------//
//***//
//-------- Start of function TalkRes::write_file -------------//
//
int TalkRes::write_file(File* filePtr)
{
if( !filePtr->file_write( this, sizeof(TalkRes) ) )
return 0;
if( !talk_msg_array.write_file(filePtr) )
return 0;
return 1;
}
//--------- End of function TalkRes::write_file ---------------//
//-------- Start of function TalkRes::read_file -------------//
//
int TalkRes::read_file(File* filePtr)
{
//------ save talk_msg_array --------//
char* tempArray = mem_add(sizeof(DynArrayB));
memcpy( tempArray, &talk_msg_array, sizeof(DynArrayB) );
//------ read in TalkRes --------//
if( !filePtr->file_read( this, sizeof(TalkRes) ) )
return 0;
//------ restore talk_msg_array --------//
memcpy( &talk_msg_array, tempArray, sizeof(DynArrayB) );
mem_del(tempArray);
//---- read in talk_msg_array ----//
if( !talk_msg_array.read_file(filePtr) )
return 0;
return 1;
}
//--------- End of function TalkRes::read_file ---------------//
//***//
//-------- Start of function RawRes::write_file -------------//
//
int RawRes::write_file(File* filePtr)
{
for( int i=0 ; ifile_write( god_info_array, sizeof(GodInfo) * god_count );
}
//--------- End of function GodRes::write_file ---------------//
//-------- Start of function GodRes::read_file -------------//
//
int GodRes::read_file(File* filePtr)
{
#ifdef AMPLUS
if(!game_file_array.same_version)
{
memset(god_info_array, 0, sizeof(god_info_array));
return filePtr->file_read( god_info_array, sizeof(GodInfo) * VERSION_1_GODRES_GOD_COUNT );
}
else
return filePtr->file_read( god_info_array, sizeof(GodInfo) * god_count );
#else
return filePtr->file_read( god_info_array, sizeof(GodInfo) * god_count );
#endif
}
//--------- End of function GodRes::read_file ---------------//
//***//
//-------- Start of function MonsterRes::write_file -------------//
//
int MonsterRes::write_file(File* filePtr)
{
return filePtr->file_write( active_monster_array, sizeof(active_monster_array) );
}
//--------- End of function MonsterRes::write_file ---------------//
//-------- Start of function MonsterRes::read_file -------------//
//
int MonsterRes::read_file(File* filePtr)
{
return filePtr->file_read( active_monster_array, sizeof(active_monster_array) );
}
//--------- End of function MonsterRes::read_file ---------------//
//***//
//-------- Start of function Game::write_file -------------//
//
int Game::write_file(File* filePtr)
{
return filePtr->file_write( this, sizeof(Game) );
}
//--------- End of function Game::write_file ---------------//
//-------- Start of function Game::read_file -------------//
//
int Game::read_file(File* filePtr)
{
return filePtr->file_read( this, sizeof(Game) );
}
//--------- End of function Game::read_file ---------------//
//***//
//-------- Start of function Config::write_file -------------//
//
int Config::write_file(File* filePtr)
{
return filePtr->file_write( this, sizeof(Config) );
}
//--------- End of function Config::write_file ---------------//
//-------- Start of function Config::read_file -------------//
//
int Config::read_file(File* filePtr, int keepSysSettings)
{
//--- these settings are not game dependent -----//
char musicFlag = music_flag;
short cdMusicVol = cd_music_volume;
short wavMusicVol = wav_music_volume;
char soundEffectFlag = sound_effect_flag;
short soundEffectVol = sound_effect_volume;
char helpMode = help_mode;
int rc = filePtr->file_read( this, sizeof(Config) );
if( keepSysSettings )
{
music_flag = musicFlag;
cd_music_volume = cdMusicVol;
wav_music_volume = wavMusicVol;
sound_effect_flag = soundEffectFlag;
sound_effect_volume = soundEffectVol;
help_mode = helpMode;
}
return rc;
}
//--------- End of function Config::read_file ---------------//
//***//
//-------- Start of function Info::write_file -------------//
//
int Info::write_file(File* filePtr)
{
int writeSize = (char*)(&last_write_offset) - (char*)(this);
//---------- write the info data -----------//
return filePtr->file_write( this, writeSize );
}
//--------- End of function Info::write_file ---------------//
//-------- Start of function Info::read_file -------------//
//
int Info::read_file(File* filePtr)
{
int readSize = (char*)(&last_write_offset) - (char*)(this);
//------- read the info data ----------//
return filePtr->file_read( this, readSize );
}
//--------- End of function Info::read_file ---------------//
//***//
//-------- Start of function Power::write_file -------------//
//
int Power::write_file(File* filePtr)
{
return filePtr->file_write( this, sizeof(Power) );
}
//--------- End of function Power::write_file ---------------//
//-------- Start of function Power::read_file -------------//
//
int Power::read_file(File* filePtr)
{
return filePtr->file_read( this, sizeof(Power) );
}
//--------- End of function Power::read_file ---------------//
//***//
//-------- Start of function Sys::write_file -------------//
//
int Sys::write_file(File* filePtr)
{
//---- write the current random seed first ----//
if( !filePtr->file_put_long(m.get_random_seed()) )
return 0;
//---------- write some Sys data -----------//
filePtr->file_put_long(day_frame_count);
filePtr->file_put_long(frame_count);
filePtr->file_put_short(view_mode);
return 1;
}
//--------- End of function Sys::write_file ---------------//
//-------- Start of function Sys::read_file -------------//
//
int Sys::read_file(File* filePtr)
{
//------- read the random seed --------//
loaded_random_seed = filePtr->file_get_long();
//--------- read some Sys data -----------//
day_frame_count = filePtr->file_get_long();
frame_count = filePtr->file_get_long();
view_mode = (char) filePtr->file_get_short();
return 1;
}
//--------- End of function Sys::read_file ---------------//
//***//
//-------- Start of function Weather::write_file -------------//
//
int Weather::write_file(File* filePtr)
{
return filePtr->file_write( this, sizeof(Weather) );
}
//--------- End of function Weather::write_file ---------------//
//-------- Start of function Weather::read_file -------------//
//
int Weather::read_file(File* filePtr)
{
return filePtr->file_read( this, sizeof(Weather) );
}
//--------- End of function Weather::read_file ---------------//
//***//
//-------- Start of function MagicWeather::write_file -------------//
//
int MagicWeather::write_file(File* filePtr)
{
return filePtr->file_write( this, sizeof(MagicWeather) );
}
//--------- End of function MagicWeahter::write_file ---------------//
//-------- Start of function MagicWeahter::read_file -------------//
//
int MagicWeather::read_file(File* filePtr)
{
return filePtr->file_read( this, sizeof(MagicWeather) );
}
//--------- End of function MagicWeahter::read_file ---------------//
//***//
//-------- Start of function World::write_file -------------//
//
int World::write_file(File* filePtr)
{
//--------- save map -------------//
if( !filePtr->file_write(loc_matrix, max_x_loc*max_y_loc*sizeof(Location) ) )
return 0;
//--------- save vars -----------//
filePtr->file_put_short(scan_fire_x);
filePtr->file_put_short(scan_fire_y);
filePtr->file_put_short(lightning_signal);
// ######## begin Gilbert 18/7 #########//
filePtr->file_put_long(plant_count);
filePtr->file_put_long(plant_limit);
// ######## end Gilbert 18/7 #########//
map_matrix->last_map_mode = -1;
filePtr->file_put_short(map_matrix->map_mode);
filePtr->file_put_short(map_matrix->power_mode);
filePtr->file_put_long(map_matrix->cur_x_loc);
filePtr->file_put_long(map_matrix->cur_y_loc);
filePtr->file_put_long(zoom_matrix->init_lightning);
filePtr->file_put_long(zoom_matrix->vibration);
filePtr->file_put_short(zoom_matrix->lightning_x1);
filePtr->file_put_short(zoom_matrix->lightning_y1);
filePtr->file_put_short(zoom_matrix->lightning_x2);
filePtr->file_put_short(zoom_matrix->lightning_y2);
return 1;
}
//--------- End of function World::write_file ---------------//
//-------- Start of function World::read_file -------------//
//
int World::read_file(File* filePtr)
{
//-------- read in the map --------//
loc_matrix = (Location*) mem_resize( loc_matrix, max_x_loc * max_y_loc
* sizeof(Location) );
if( !filePtr->file_read(loc_matrix, max_x_loc*max_y_loc*sizeof(Location) ) )
return 0;
assign_map();
//--------- read in vars ----------//
scan_fire_x = (char) filePtr->file_get_short();
scan_fire_y = (char) filePtr->file_get_short();
lightning_signal = (char) filePtr->file_get_short();
// ######## begin Gilbert 18/7 #########//
plant_count = filePtr->file_get_long();
plant_limit = filePtr->file_get_long();
// ######## end Gilbert 18/7 #########//
map_matrix->last_map_mode = -1;
map_matrix->map_mode = (char) filePtr->file_get_short();
map_matrix->power_mode = (char) filePtr->file_get_short();
map_matrix->cur_x_loc = filePtr->file_get_long();
map_matrix->cur_y_loc = filePtr->file_get_long();
zoom_matrix->top_x_loc = map_matrix->cur_x_loc;
zoom_matrix->top_y_loc = map_matrix->cur_y_loc;
sys.zoom_need_redraw = 1;
zoom_matrix->init_lightning = filePtr->file_get_long();
zoom_matrix->vibration = filePtr->file_get_long();
zoom_matrix->lightning_x1 = filePtr->file_get_short();
zoom_matrix->lightning_y1 = filePtr->file_get_short();
zoom_matrix->lightning_x2 = filePtr->file_get_short();
zoom_matrix->lightning_y2 = filePtr->file_get_short();
return 1;
}
//--------- End of function World::read_file ---------------//
//***//
//-------- Start of function Tutor::write_file -------------//
//
int Tutor::write_file(File* filePtr)
{
filePtr->file_put_short(cur_tutor_id);
filePtr->file_put_short(cur_text_block_id);
return 1;
}
//--------- End of function Tutor::write_file ---------------//
//-------- Start of function Tutor::read_file -------------//
//
int Tutor::read_file(File* filePtr)
{
int curTutorId = filePtr->file_get_short();
if( curTutorId > 0 )
tutor.load(curTutorId); // load() will reset cur_text_block_id
cur_text_block_id = filePtr->file_get_short();
last_text_block_id = 0;
return 1;
}
//--------- End of function Tutor::read_file ---------------//
//### begin alex 23/9 ###//
//-------- Start of function SeekPath::write_file -------------//
//
int SeekPath::write_file(File* filePtr)
{
filePtr->file_put_short(total_node_avail);
return 1;
}
//--------- End of function SeekPath::write_file ---------------//
//-------- Start of function SeekPath::read_file -------------//
//
int SeekPath::read_file(File* filePtr)
{
total_node_avail = filePtr->file_get_short();
return 1;
}
//--------- End of function SeekPath::read_file ---------------//
//#### end alex 23/9 ####//