/*
* 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 : OGFILEA.CPP
//Description : Game File Array
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//--------- Define constant ---------//
enum { FILE_MENU_WIDTH = 638,
FILE_MENU_HEIGHT = 398 };
enum { FILE_MAIN_MENU_X1 = 80,
FILE_MAIN_MENU_Y1 = 175 };
enum { FILE_IN_GAME_MENU_X1 = 80,
FILE_IN_GAME_MENU_Y1 = 115 };
enum { BROWSE_X1 = 34,
BROWSE_Y1 = 31,
BROWSE_REC_WIDTH = 538,
BROWSE_REC_HEIGHT = 62,
BROWSE_X2 = BROWSE_X1 + BROWSE_REC_WIDTH - 1 };
enum { SCROLL_X1 = 595,
SCROLL_Y1 = 47,
SCROLL_X2 = 609,
SCROLL_Y2 = 324,
SCROLL_WIDTH = SCROLL_X2 - SCROLL_X1 + 1,
SCROLL_HEIGHT = SCROLL_Y2 - SCROLL_Y1 + 1 };
//----- File name of the game file array --------//
#define MAX_BROWSE_DISP_REC 5 // max. no. of records can be displayed in the saved game browser
#define HALL_OF_FAME_FILE_NAME "HALLFAME.DAT"
//------- Declare static vars & functions ----------//
static char action_mode;
static short browse_recno;
static short browse_top_recno;
static short menu_x1, menu_y1;
static int sort_game_file_function( const void *a, const void *b );
static int last_game_recno();
static void key_search();
static void disp_scroll_bar_func(SlideVBar *scroll, int);
//------ Begin of function GameFileArray constuctor ------//
GameFileArray::GameFileArray() : DynArray( sizeof(GameFile), 10 )
{
demo_format = 0;
#ifdef DEMO
demo_format = 1;
#endif
#ifdef DEMO_DESIGN
demo_format = 1;
#endif
last_file_name[0] = NULL;
has_read_hall_of_fame = 0;
memset( hall_fame_array, 0, sizeof(HallFame)*HALL_FAME_NUM );
}
//-------- End of function GameFileArray constuctor ------//
//------ Begin of function GameFileArray::init ------//
void GameFileArray::init(char *extStr)
{
//------------- Read Hall of Fame ------------//
if( !has_read_hall_of_fame ) // only read once, GameFileArray::init() is called every time the load/save game menu is brought up.
{
read_hall_of_fame();
has_read_hall_of_fame = 1;
}
//-- Load all headers of all saved game files in current directory --//
load_all_game_header(extStr);
}
//-------- End of function GameFileArray::init ------//
//------ Begin of function GameFileArray::deinit ------//
void GameFileArray::deinit()
{
}
//-------- End of function GameFileArray::deinit ------//
#define LSOPTION_SLOT(n) (1 << (n))
#define LSOPTION_ALL_SLOTS 0x0000ffff
#define LSOPTION_PAGE 0x00010000
#define LSOPTION_SCROLL 0x00020000
#define LSOPTION_ALL 0xffffffff
//-------- Begin of function GameFileArray::menu --------//
//
// actionMode = -2 - save screen to back buffer
// -1 - restore screen to back buffer
// 1 - save game
// 2 - load game
//
// recno = if overwritting save game or load game acion
// is succcessful, return the recno of GameFile
//
// return : 1 - game loaded/saved
// 0 - user cancel loading/saving
// -1 - loading/saving error
//
int GameFileArray::menu(int actionMode, int *recno)
{
if( actionMode == -2 || actionMode == -1)
{
// copy or restore screen to back buffer
int scrnX1, scrnY1, scrnX2, scrnY2;
if( game.game_mode==GAME_PREGAME ) // called from the main menu, not in the game
{
scrnX1 = FILE_MAIN_MENU_X1;
scrnY1 = FILE_MAIN_MENU_Y1;
}
else
{
scrnX1 = FILE_IN_GAME_MENU_X1;
scrnY1 = FILE_IN_GAME_MENU_Y1;
}
scrnX2 = scrnX1 + FILE_MENU_WIDTH-1;
scrnY2 = scrnY1 + FILE_MENU_HEIGHT-1;
mouse.hide_area( scrnX1, scrnY1, scrnX2, scrnY2);
if( actionMode == -2 )
// save to back buffer
IMGcopy(vga_back.buf_ptr(), vga_back.buf_pitch(),
vga_front.buf_ptr(), vga_front.buf_pitch(),
scrnX1, scrnY1, scrnX2, scrnY2);
else
// restore from back buffer
IMGcopy(vga_front.buf_ptr(), vga_front.buf_pitch(),
vga_back.buf_ptr(), vga_back.buf_pitch(),
scrnX1, scrnY1, scrnX2, scrnY2);
mouse.show_area();
return 1;
}
// #### begin Gilbert 25/9 ########//
//#ifdef DEMO // No game saving in demo version
// box.msg( "Sorry, you cannot load/save game in the demo version." );
// return -1;
//#endif
// #### end Gilbert 25/9 ########//
action_mode = actionMode;
if( action_mode==2 && size()==0 )
{
box.msg( "You haven't saved any games yet." );
return 0;
}
// load race icon
char deinitGameSet=0;
char deinitUnitRes=0;
char deinitRaceRes=0;
if( !game_set.set_opened_flag )
{
game_set.open_set(1);
deinitGameSet = 1;
}
if( !unit_res.init_flag )
{
unit_res.init();
deinitUnitRes = 1;
}
if( !race_res.init_flag )
{
race_res.init();
deinitRaceRes = 1;
}
//-------------------------------------//
if( game.game_mode==GAME_PREGAME ) // called from the main menu, not in the game
{
menu_x1 = FILE_MAIN_MENU_X1;
menu_y1 = FILE_MAIN_MENU_Y1;
}
else
{
menu_x1 = FILE_IN_GAME_MENU_X1;
menu_y1 = FILE_IN_GAME_MENU_Y1;
}
int x=menu_x1, y=menu_y1+17;
// vga_back.adjust_brightness( x, y, x+menu_x1-1, y+menu_y1-1, -6 );
vga.blt_buf( x, y, x+menu_x1-1, y+menu_y1-1, 0 );
mouse_cursor.set_icon(CURSOR_NORMAL);
power.win_opened = 1;
int minRecno = action_mode == 1 ? 0 : 1;
//------ set current record no. -------//
for( int i=1 ; i<=size() ; i++ )
{
if( strcmp(last_file_name, game_file_array[i]->file_name)==0 )
{
browse_recno = i;
break;
}
}
//---------------------------------//
browse_top_recno = minRecno;
// in save game mode, browse_recno = 0 means selecting empty slot
// in load game mode, browse_recno = 0 means nonthing is selected
// browse_top_recno = browse_recno ? browse_recno : minRecno;
//--------------------------------------//
Button3D scrollUp, scrollDown, saveButton, saveNewButton, delButton, cancelButton;
int retFlag = 0;
int refreshFlag = LSOPTION_ALL;
//int scrollButtonY1 = menu_y1+SCROLL_Y1, scrollButtonY2 = menu_y1+SCROLL_Y2;
//int dragingScrollBar = 0;
//int dragScrollYDiff; // when draging begins, mouse.cur_y - scrollButtonY1
SlideVBar scrollBar;
scrollBar.init_scroll(menu_x1+SCROLL_X1, menu_y1+SCROLL_Y1, menu_x1+SCROLL_X2, menu_y1+SCROLL_Y2,
MAX_BROWSE_DISP_REC, disp_scroll_bar_func);
scrollBar.set(minRecno, size(), browse_top_recno);
// try to centre the selected record on the browser
//browse_top_recno = browse_recno - MAX_BROWSE_DISP_REC /2;
//if( browse_top_recno > size()-MAX_BROWSE_DISP_REC+1)
// browse_top_recno = size()-MAX_BROWSE_DISP_REC+1;
//if( browse_top_recno < minRecno )
// browse_top_recno = minRecno;
browse_top_recno = scrollBar.set_view_recno(browse_recno - MAX_BROWSE_DISP_REC /2);
Blob browseArea[MAX_BROWSE_DISP_REC];
Blob scrollArea;
while(1)
{
//---------- yield --------//
sys.yield();
mouse.get_event();
// --------- display ----------//
if( refreshFlag )
{
if( refreshFlag & LSOPTION_PAGE )
{
mouse.hide_area(menu_x1, menu_y1, menu_x1+FILE_MENU_WIDTH, menu_y1+FILE_MENU_HEIGHT);
image_interface.put_front( menu_x1, menu_y1, actionMode==1 ? (char*)"SAVEGAME" : (char*)"LOADGAME" );
scrollUp.paint(menu_x1+SCROLL_X1+1,menu_y1+SCROLL_Y1-17, "SV-UP-U", "SV-UP-D");
scrollDown.paint(menu_x1+SCROLL_X1+1,menu_y1+SCROLL_Y2+1, "SV-DW-U", "SV-DW-D");
if( action_mode == 1)
{
saveButton.paint(menu_x1+34, menu_y1+354, "SAVE", "CANCEL1D");
saveNewButton.paint(menu_x1+147, menu_y1+354, "SAVE-NEW", "CANCEL1D");
delButton.paint(menu_x1+260, menu_y1+354, "DELETE", "CANCEL1D");
}
else if( action_mode == 2)
{
saveButton.paint(menu_x1+34, menu_y1+354, "LOAD", "CANCEL1D");
}
cancelButton.paint(menu_x1+473, menu_y1+354, "CANCEL1", "CANCEL1D");
// capture browseArea, scrollArea
for( int j = 0; j < MAX_BROWSE_DISP_REC; ++j)
{
browseArea[j].resize(2*sizeof(short)+BROWSE_REC_WIDTH*BROWSE_REC_HEIGHT);
vga_front.read_bitmap(
menu_x1+BROWSE_X1, menu_y1+BROWSE_Y1+j*BROWSE_REC_HEIGHT,
menu_x1+BROWSE_X2, menu_y1+BROWSE_Y1+j*BROWSE_REC_HEIGHT+BROWSE_REC_HEIGHT-1,
browseArea[j].ptr);
}
scrollArea.resize(2*sizeof(short)+SCROLL_WIDTH*SCROLL_HEIGHT);
vga_front.read_bitmap( menu_x1+SCROLL_X1, menu_y1+SCROLL_Y1,
menu_x1+SCROLL_X2, menu_y1+SCROLL_Y2, scrollArea.ptr);
mouse.show_area();
}
if( scrollBar.max_recno != size() )
{
scrollBar.set_max_recno(size());
if( scrollBar.view_recno > scrollBar.max_view_recno() )
{
scrollBar.view_recno = scrollBar.max_view_recno();
}
refreshFlag |= LSOPTION_SCROLL;
}
if( refreshFlag & LSOPTION_SCROLL )
{
vga_front.put_bitmap( menu_x1+SCROLL_X1, menu_y1+SCROLL_Y1,
scrollArea.ptr);
scrollBar.paint();
}
if( refreshFlag & LSOPTION_ALL_SLOTS )
{
for(int slot = 0; slot < MAX_BROWSE_DISP_REC; ++slot)
{
int rec = slot + scrollBar.view_recno;
if( refreshFlag & LSOPTION_SLOT(slot) )
{
int browseSlotX1 = menu_x1+BROWSE_X1;
int browseSlotY1 = menu_y1+BROWSE_Y1+slot*BROWSE_REC_HEIGHT;
int browseSlotX2 = menu_x1+BROWSE_X2;
int browseSlotY2 = menu_y1+BROWSE_Y1+(slot+1)*BROWSE_REC_HEIGHT-1;
mouse.hide_area(browseSlotX1, browseSlotY1,
browseSlotX2, browseSlotY2);
vga_front.put_bitmap( browseSlotX1, browseSlotY1,
browseArea[rec%MAX_BROWSE_DISP_REC].ptr);
if( rec == 0 )
{
err_when( action_mode!=1 );
font_bible.center_put( browseSlotX1, browseSlotY1,
browseSlotX2, browseSlotY2, "Empty Game Slot" );
}
else if( rec <= size() )
{
game_file_array[rec]->disp_info(browseSlotX1, browseSlotY1);
}
if( rec == browse_recno )
{
vga_front.adjust_brightness( browseSlotX1, browseSlotY1,
browseSlotX2, browseSlotY2, -2);
vga_front.put_bitmap_trans_decompress(browseSlotX1, browseSlotY1,
image_button.read("LS-DWN"));
}
mouse.show_area();
}
}
// disp_browse();
}
refreshFlag = 0;
}
sys.blt_virtual_buf();
if( scrollBar.detect() == 1 )
{
browse_top_recno = scrollBar.view_recno;
refreshFlag |= LSOPTION_SCROLL | LSOPTION_ALL_SLOTS;
}
else if( scrollUp.detect() )
{
// click on scroll up
int oldValue = scrollBar.view_recno;
if( oldValue != scrollBar.set_view_recno(oldValue-1) )
refreshFlag |= LSOPTION_SCROLL | LSOPTION_ALL_SLOTS;
browse_top_recno = scrollBar.view_recno;
}
else if( scrollDown.detect() )
{
// click on scroll down
// click on scroll up
int oldValue = scrollBar.view_recno;
if( oldValue != scrollBar.set_view_recno(oldValue+1) )
refreshFlag |= LSOPTION_SCROLL | LSOPTION_ALL_SLOTS;
browse_top_recno = scrollBar.view_recno;
}
else if( mouse.double_click( menu_x1+BROWSE_X1, menu_y1+BROWSE_Y1,
menu_x1+BROWSE_X1+BROWSE_REC_WIDTH-1,
menu_y1+BROWSE_Y1+ BROWSE_REC_HEIGHT*MAX_BROWSE_DISP_REC -1) )
{
// double click on game slot
int oldValue = browse_recno;
int newValue = scrollBar.view_recno + (mouse.click_y(0) - BROWSE_Y1 - menu_y1) / BROWSE_REC_HEIGHT;
if( newValue <= size())
{
// ######## begin Gilbert 31/10 ########//
if( newValue == oldValue )
{
browse_recno = newValue;
refreshFlag |= LSOPTION_SLOT(newValue-scrollBar.view_recno);
if( oldValue-scrollBar.view_recno >= 0 && oldValue-scrollBar.view_recno < MAX_BROWSE_DISP_REC )
refreshFlag |= LSOPTION_SLOT(oldValue-scrollBar.view_recno);
if( recno )
*recno = browse_recno;
retFlag = process_action(0);
// if( retFlag < 0 )
// box.msg("Error");
break;
}
// ######## end Gilbert 31/10 ########//
}
}
else if( mouse.single_click( menu_x1+BROWSE_X1, menu_y1+BROWSE_Y1,
menu_x1+BROWSE_X1+BROWSE_REC_WIDTH-1,
menu_y1+BROWSE_Y1+ BROWSE_REC_HEIGHT*MAX_BROWSE_DISP_REC -1) )
{
// click on game slot
int oldValue = browse_recno;
int newValue = scrollBar.view_recno + (mouse.click_y(0) - BROWSE_Y1 - menu_y1) / BROWSE_REC_HEIGHT;
if( newValue <= size())
{
// ##### begin Gilbert 31/10 #######//
//if( oldValue == browse_recno )
//{
// browse_recno = newValue;
// refreshFlag |= LSOPTION_SLOT(oldValue-scrollBar.view_recno)
// | LSOPTION_SLOT(newValue-scrollBar.view_recno);
//}
if( newValue != oldValue )
{
browse_recno = newValue;
refreshFlag |= LSOPTION_SLOT(newValue-scrollBar.view_recno);
if( oldValue-scrollBar.view_recno >= 0 && oldValue-scrollBar.view_recno < MAX_BROWSE_DISP_REC )
refreshFlag |= LSOPTION_SLOT(oldValue-scrollBar.view_recno);
}
// ##### end Gilbert 31/10 #######//
}
}
else if( cancelButton.detect(KEY_ESC) || mouse.any_click(RIGHT_BUTTON) > 0) // also when ESC key is pressed or right button
{
// cancel button or escape key
refreshFlag = LSOPTION_ALL;
retFlag = 0;
break; // break while(1)
}
else if( (action_mode == 1 || (action_mode == 2 && browse_recno))
&& saveButton.detect() )
{
// save / load button
refreshFlag = LSOPTION_ALL;
if( recno )
*recno = browse_recno;
retFlag = process_action(0);
// ##### begin Gilbert 15/10 #####//
if( retFlag != 0 )
{
// if( retFlag < 0 )
// box.msg("Error");
break;
}
// ##### end Gilbert 15/10 #####//
}
else if( action_mode == 1 && saveNewButton.detect() )
{
// save new button
refreshFlag = LSOPTION_ALL;
retFlag = process_action(1);
// if( retFlag < 0 )
// box.msg("Error");
break;
}
else if( action_mode == 1 && browse_recno && delButton.detect() )
{
// delete save game button
if( browse_recno != 0 ) // cannot del save game slot
{
del_game();
if( browse_recno > size() )
{
browse_recno = size();
}
if( browse_top_recno > size()-MAX_BROWSE_DISP_REC+1)
browse_top_recno = size()-MAX_BROWSE_DISP_REC+1;
if( browse_top_recno < minRecno )
browse_top_recno = minRecno;
scrollBar.set_view_recno(browse_top_recno);
refreshFlag |= LSOPTION_ALL_SLOTS | LSOPTION_SCROLL;
}
else
{
box.msg("Cannot delete this slot");
}
refreshFlag = LSOPTION_ALL;
}
}
power.win_opened = 0;
if( retFlag <= 0 )
{
// if load game is successful, no need to deinit resource
if( deinitGameSet )
game_set.close_set();
if( deinitUnitRes )
unit_res.deinit();
if( deinitRaceRes )
race_res.deinit();
}
mouse.reset_click();
return retFlag;
}
//---------- End of function GameFileArray::menu --------//
//-------- Begin of function GameFileArray::disp_browse --------//
//
// Display saved game info on the browser.
//
void GameFileArray::disp_browse()
{
int lastRec = min(browse_top_recno+MAX_BROWSE_DISP_REC-1, size());
int x = menu_x1 + BROWSE_X1;
int y = menu_y1 + BROWSE_Y1;
for( int i=browse_top_recno ; i<=lastRec ; i++, y+=BROWSE_REC_HEIGHT )
{
if( i==0 )
{
err_when( action_mode!=1 );
font_bible.center_put( x, y, x+BROWSE_REC_WIDTH-1, y+BROWSE_REC_HEIGHT-1, "Empty Game Slot" );
}
else
{
game_file_array[i]->disp_info(x, y);
}
if( i == browse_recno )
{
vga_front.adjust_brightness(x,y,x+BROWSE_REC_WIDTH-1,y+BROWSE_REC_HEIGHT-1,-2);
vga_front.put_bitmap_trans_decompress( x, y, image_button.read("LS-DWN"));
}
}
}
//--------- End of function GameFileArray::disp_browse --------//
//-------- Begin of function GameFile::disp_info --------//
//
void GameFile::disp_info(int x, int y)
{
vga_front.put_bitmap(x+10, y+10, unit_res[ race_res[race_id]->basic_unit_id ]->king_icon_ptr);
x+=60;
//------ display player color -----//
nation_array.disp_nation_color( x+1, y+13, nation_color );
//-------- display king name ------//
String str;
str = translate.process("King ");
str += player_name;
font_bible.put( x+18, y+8, str );
//------- display game date --------//
str = translate.process("Game Date: ");
str += date.date_str(game_date);
font_bible.put( x, y+30, str );
//---------------------------------//
str = translate.process("File Name: ");
str += file_name;
#if(defined(FRENCH))
font_small.put( x+320, y+16, str );
#elif(defined(GERMAN))
font_small.put( x+320, y+16, str );
#else
font_small.put( x+335, y+16, str );
#endif
SYSTEMTIME sysTime;
FILETIME localFileTime;
FileTimeToLocalFileTime( &file_date, &localFileTime );
FileTimeToSystemTime( &localFileTime, &sysTime );
str = translate.process("File Date: ");
str += date.date_str(date.julian(sysTime.wYear, sysTime.wMonth,sysTime.wDay), 1);
str += " ";
str += date.time_str( sysTime.wHour * 100 + sysTime.wMinute );
#if(defined(FRENCH))
font_small.put( x+318, y+34, str );
#elif(defined(GERMAN))
font_small.put( x+320, y+34, str );
#else
font_small.put( x+335, y+34, str );
#endif
}
//--------- End of function GameFile::disp_info --------//
//------- Begin of function GameFileArray::process_action ------//
//
// [int] saveNew - save on a new game file
// (default : 0)
//
// return : 1 - process ok
// 0 - process cancelled
// -1 - save/load failed
//
int GameFileArray::process_action(int saveNew)
{
//------------ save game --------------//
if( action_mode == 1 )
{
if( saveNew || browse_recno==0 ) // save on empty slot
{
save_new_game();
}
else // save on existing slot
{
if( !box.ask( "It will overwrite the existing saved game, proceed ?" ) )
return 0;
GameFile* gameFile = game_file_array[browse_recno];
if( !gameFile->save_game())
return -1;
strcpy( last_file_name, gameFile->file_name );
}
return 1;
}
//----------- load game -------------//
else
{
GameFile* gameFile = game_file_array[browse_recno];
int rc = gameFile->load_game();
if( rc > 0 )
strcpy( last_file_name, gameFile->file_name );
return rc;
}
return 0;
}
//--------- End of function GameFileArray::process_action ------//
//-------- Begin of function GameFileArray::save_new_game -----//
//
// Save current game to a new saved game file immediately without
// prompting menu.
//
// Called by GameFileArray::process_action() and error handler.
//
// [char*] fileName - file name of the saved game
//
void GameFileArray::save_new_game(char* fileName)
{
GameFile gameFile;
GameFile* gameFilePtr;
int addFlag=1;
int gameFileRecno;
memset( &gameFile, 0, sizeof(GameFile) );
if( fileName )
{
//----- check for overwriting an existing file ----//
for( gameFileRecno=1 ; gameFileRecno<=game_file_array.size() ; gameFileRecno++ )
{
gameFilePtr = game_file_array[gameFileRecno];
if( strcmp(gameFilePtr->file_name, fileName)==0 ) // if this file name already exist
{
addFlag=0;
break;
}
}
strcpy( gameFile.file_name, fileName );
}
else
{
gameFile.set_file_name(); // give it a new game_file_name based on current group name
}
//----------- save game now ------------//
if( gameFile.save_game(fileName) )
{
strcpy( last_file_name, gameFile.file_name );
if( addFlag )
{
linkin(&gameFile);
quick_sort( sort_game_file_function );
}
else
{
game_file_array.update(&gameFile, gameFileRecno);
}
}
}
//-------- End of function GameFileArray::save_new_game -------//
//------- Begin of function GameFileArray::del_game ------//
void GameFileArray::del_game()
{
int recNo = browse_recno;
if( !box.ask( "This saved game will be deleted, proceed ?" ) )
return;
//---------------------------------------------------//
unlink(game_file_array[recNo]->file_name); // unlink() is a C standard function in io.h, for delete file
go(recNo);
linkout();
go(recNo-1); // skip back one record
}
//--------- End of function GameFileArray::del_game ------//
//------- Begin of function GameFileArray::write_hall_of_fame ------//
//
int GameFileArray::write_hall_of_fame()
{
int rc;
File file;
rc = file.file_create( HALL_OF_FAME_FILE_NAME, 0, 1 ); // 0=don't handle error itself
if( !rc )
return 0;
// 1=allow the writing size and the read size to be different
//--------- Write Hall of Fame ----------//
if( rc )
rc = file.file_write( hall_fame_array, sizeof(HallFame) * HALL_FAME_NUM );
//------ write last saved game file name ------//
if( rc )
rc = file.file_write( last_file_name, MAX_PATH+1 );
file.file_close();
return rc;
}
//--------- End of function GameFileArray::write_hall_of_fame ------//
//------- Begin of function GameFileArray::read_hall_of_fame ------//
//
int GameFileArray::read_hall_of_fame()
{
if( !m.is_file_exist(HALL_OF_FAME_FILE_NAME) )
return 0;
int rc;
File file;
rc = file.file_open( HALL_OF_FAME_FILE_NAME, 0, 1 ); // 0=don't handle error itself
// 1=allow the writing size and the read size to be different
if( !rc )
return 0;
// 1=allow the writing size and the read size to be different
//--------- Read Hall of Fame ----------//
if( rc )
rc = file.file_read( hall_fame_array, sizeof(HallFame) * HALL_FAME_NUM );
//------ read last saved game file name ------//
if( rc )
rc = file.file_read( last_file_name, MAX_PATH+1);
file.file_close();
return rc;
}
//--------- End of function GameFileArray::read_hall_of_fame ------//
//-------- Begin of function GameFileArray::load_all_game_header --------//
//
// Load all headers of all saved game files in current directory.
//
void GameFileArray::load_all_game_header(char *extStr)
{
int i;
Directory gameDir;
GameFile gameFile;
File file;
gameDir.read( extStr, 1 ); // 1-Sort file names
//-------- read in the headers of all game sets -------//
zap();
for( i=1 ; i<=gameDir.size() ; i++ )
{
if( file.file_open( gameDir[i]->name, 1, 1 ) // last 1=allow varying read & write size
&& file.file_read(&gameFile, sizeof(GameFile))
&& gameFile.validate_header() )
{
strcpy( gameFile.file_name, gameDir[i]->name ); // in case that the name may be different
gameFile.file_date = gameDir[i]->time;
linkin(&gameFile);
}
file.file_close();
}
}
//------ End of function GameFileArray::load_all_game_header --------//
//------ Begin of function sort_game_file_function ------//
//
static int sort_game_file_function( const void *a, const void *b )
{
return strcmp( ((GameFile*)a)->file_name, ((GameFile*)b)->file_name );
}
//------- End of function sort_game_file_function ------//
//------ Begin of function last_game_recno ------//
//
static int last_game_recno()
{
int i;
for( i=game_file_array.size() ; i>0 ; i-- )
{
if( strcmp(game_file_array[i]->file_name, game_file_array.last_file_name)==0 )
return i;
}
return 0; // if none of them match, return 1 as the first record
}
//------- End of function last_game_recno ------//
//------- Begin of function GameFileArray::operator[] -----//
GameFile* GameFileArray::operator[](int recNo)
{
GameFile* gameFile = (GameFile*) get(recNo);
return gameFile;
}
//--------- End of function GameFileArray::operator[] ----//
//------- Begin of static function key_search --------//
static void key_search()
{
int i;
int searchKey = m.upper(mouse.key_code);
if( searchKey < '0' || searchKey > 'Z' )
return;
for( i=1 ; i<=game_file_array.size() ; i++ )
{
if( m.upper(game_file_array[i]->file_name[0]) >= searchKey )
{
browse_recno = i+(action_mode==1);
return;
}
}
}
//------- End of static function key_search --------//
//------- Begin of static function disp_scroll_bar_func --------//
static void disp_scroll_bar_func(SlideVBar *scroll, int)
{
short rectTop = scroll->rect_top();
short rectBottom = scroll->rect_bottom();
vga_front.bar( scroll->scrn_x1, rectTop, scroll->scrn_x2, rectBottom, VGA_YELLOW+1);
if( rectBottom - rectTop > 6 )
{
vga_front.d3_panel_up(scroll->scrn_x1, rectTop, scroll->scrn_x2, rectBottom,2,0);
}
}
//------- End of static function disp_scroll_bar_func --------//