Files
source/Laptop/files.cpp
T
00fb898600 Delete builddefines.h
Nothing was left in it but the include of profiler.h, and 132 translation units
were including it for that alone. Fifteen files were leaning on profiler.h to
drag in <set>, <vector> and <ostream> for them; those now include what they use.

This is the commit that moves line numbers. Removing an include line shifts
__LINE__ by one for everything below it, and __LINE__ is an immediate operand in
every Assert() and DebugMsg() call, so the four game executables differ from
their predecessors by roughly a thousand 32-bit constants each. Every one of
those is accounted for: each is a single immediate that moved by -1 where the
builddefines.h include went away, or +1 where a <set>/<vector> include was
added. Nothing else in .text, .rdata or .data moves, no object file's section
sizes change, and symbolize_crash and Ja2Export stay bit-identical.

The one non-immediate difference is that the 24 Editor translation units of the
non-editor apps stop emitting __Avx2WmemEnabledWeakValue, a 4-byte weak COMDAT
they only ever instantiated through profiler.h's <vector>. It is a UCRT weak
default that other translation units still provide.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 01:07:26 -03:00

2414 lines
61 KiB
C++

#include <stdio.h>
#include <list>
#include "laptop.h"
#include "files.h"
#include "Game Clock.h"
#include "Utilities.h"
#include "WCheck.h"
#include "DEBUG.H"
#include "WordWrap.h"
#include "Encrypted File.h"
#include "Cursors.h"
#include "email.h"
#include "Text.h"
// HEADROCK PROFEX: This is required to display the proper facial image.
#include "Soldier Profile.h"
#include "GameSettings.h"
#include "XML.h"
#include "expat.h"
#include "Debug Control.h"
#ifdef JA2UB
#include "ub_config.h"
#endif
#define TOP_X LAPTOP_SCREEN_UL_X
#define TOP_Y LAPTOP_SCREEN_UL_Y
#define BLOCK_FILE_HEIGHT 10
#define BOX_HEIGHT 14
#define TITLE_X iScreenWidthOffset + 140
#define TITLE_Y iScreenHeightOffset + 33
#define TEXT_X iScreenWidthOffset + 140
#define PAGE_SIZE 22
#define FILES_TITLE_FONT FONT14ARIAL
#define FILES_TEXT_FONT FONT10ARIAL
#define BLOCK_HEIGHT 10
#define FILES_SENDER_TEXT_X TOP_X + 15
#define MAX_FILES_LIST_LENGTH 28
#define NUMBER_OF_FILES_IN_FILE_MANAGER 20
#define FILE_VIEWER_X iScreenWidthOffset + 236
#define FILE_VIEWER_Y iScreenHeightOffset + 85
#define FILE_VIEWER_WIDTH 598 - 240
#define FILE_GAP 2
#define FILE_TEXT_COLOR FONT_BLACK
#define FILE_STRING_SIZE 400
#define MAX_FILES_PAGE MAX_FILES_LIST_LENGTH
#define FILES_LIST_X FILES_SENDER_TEXT_X
#define FILES_LIST_Y ( 9 * BLOCK_HEIGHT )
#define FILES_LIST_WIDTH 100
#ifdef JA2UB
#define LENGTH_OF_ENRICO_FILE 39 //Ja25 68
#else
#define LENGTH_OF_ENRICO_FILE 68
#endif
#define MAX_FILE_MESSAGE_PAGE_SIZE 325
#define MAX_TEXT_FILE_MESSAGE_PAGE_SIZE (350)
#define VIEWER_MESSAGE_BODY_START_Y FILES_LIST_Y
#define PREVIOUS_FILE_PAGE_BUTTON_X iScreenWidthOffset + 553
#define PREVIOUS_FILE_PAGE_BUTTON_Y iScreenHeightOffset + 53
#define NEXT_FILE_PAGE_BUTTON_X iScreenWidthOffset + 577
#define NEXT_FILE_PAGE_BUTTON_Y PREVIOUS_FILE_PAGE_BUTTON_Y
#define FILES_COUNTER_1_WIDTH 7
#define FILES_COUNTER_2_WIDTH 43
#define FILES_COUNTER_3_WIDTH 45
#ifdef JA2UB
#define RIS_EDT_FILE_JA25 "BINARYDATA\\RIS25.edt"
#define RIS_EDT_FILE_JA2 "BINARYDATA\\RIS.edt"
#define MAP_JA25 "LAPTOP\\TraconaMap.sti"
#define MAP_JA2 "LAPTOP\\ArucoFilesMap.sti"
#endif
// the highlighted line
INT32 iHighLightFileLine=-1;
// the files record list
FilesUnitPtr pFilesListHead=NULL;
FileStringPtr pFileStringList = NULL;
// are we in files mode
BOOLEAN fInFilesMode=FALSE;
BOOLEAN fOnLastFilesPageFlag = FALSE;
//. did we enter due to new file icon?
BOOLEAN fEnteredFileViewerFromNewFileIcon = FALSE;
BOOLEAN fWaitAFrame = FALSE;
// are there any new files
BOOLEAN fNewFilesInFileViewer = FALSE;
// graphics handles
extern UINT32 guiTITLE; // symbol already defined in laptop.cpp (jonathanl)
UINT32 guiFileBack;
extern UINT32 guiTOP; // symbol already defined in finances.cpp (jonathanl)
UINT32 guiHIGHLIGHT;
// currewnt page of multipage files we are on
INT32 giFilesPage = 0;
// strings
#define SLAY_LENGTH 12
#define ENRICO_LENGTH 0
UINT8 ubFileRecordsLength[]={
ENRICO_LENGTH,
SLAY_LENGTH,
SLAY_LENGTH,
SLAY_LENGTH,
SLAY_LENGTH,
SLAY_LENGTH,
SLAY_LENGTH,
};
UINT16 ubFileOffsets[]={
0,
ENRICO_LENGTH,
SLAY_LENGTH + ENRICO_LENGTH,
2 * SLAY_LENGTH + ENRICO_LENGTH,
3 * SLAY_LENGTH + ENRICO_LENGTH,
4 * SLAY_LENGTH + ENRICO_LENGTH,
5 * SLAY_LENGTH + ENRICO_LENGTH,
};
UINT16 usProfileIdsForTerroristFiles[]={
0, // no body
112, // elgin
64, // slay
82, // mom
83, // imposter
110, // tiff
111, // t-rex
112, // elgin
};
// buttons for next and previous pages
UINT32 giFilesPageButtons[ 2 ];
UINT32 giFilesPageButtonsImage[ 2 ];
// the previous and next pages buttons
enum{
PREVIOUS_FILES_PAGE_BUTTON=0,
NEXT_FILES_PAGE_BUTTON,
};
// mouse regions
MOUSE_REGION pFilesRegions[MAX_FILES_PAGE];
// function definitions
void RenderFilesBackGround( void );
BOOLEAN LoadFiles( void );
void RemoveFiles( void );
UINT32 ProcessAndEnterAFilesRecord( UINT8 ubCode, UINT32 uiDate, UINT8 ubFormat,STR8 pFirstPicFile, STR8 pSecondPicFile, BOOLEAN fRead );
void OpenAndReadFilesFile( void );
BOOLEAN OpenAndWriteFilesFile( void );
void ClearFilesList( void );
void DrawFilesTitleText( void );
void DrawFilesListBackGround( void );
void DisplayFilesList( void );
BOOLEAN OpenAndWriteFilesFile( void );
void DisplayFileMessage( void );
void InitializeFilesMouseRegions( void );
void RemoveFilesMouseRegions( void );
BOOLEAN DisplayFormattedText( void );
// buttons
void CreateButtonsForFilesPage( void );
void DeleteButtonsForFilesPage( void );
void HandleFileViewerButtonStates( void );
// open new files for viewing
void OpenFirstUnreadFile( void );
void CheckForUnreadFiles( void );
// file string structure manipulations
void ClearFileStringList( void );
void AddStringToFilesList( STR16 pString );
BOOLEAN HandleSpecialFiles( UINT8 ubFormat );
BOOLEAN HandleSpecialTerroristFile( INT32 iFileNumber, STR sPictureName );
BOOLEAN HandleMissionBriefingFiles( UINT8 ubFormat ); //mission briefing by Jazz
FileRecordWidthPtr CreateWidthRecordsForMissionBriefingFile( void );
// callbacks
void FilesBtnCallBack(MOUSE_REGION * pRegion, INT32 iReason );
void BtnPreviousFilePageCallback(GUI_BUTTON *btn,INT32 reason);
void BtnNextFilePageCallback(GUI_BUTTON *btn,INT32 reason);
// file width manipulation
void ClearOutWidthRecordsList( FileRecordWidthPtr pFileRecordWidthList );
FileRecordWidthPtr CreateWidthRecordsForAruloIntelFile( void );
FileRecordWidthPtr CreateWidthRecordsForTerroristFile( void );
FileRecordWidthPtr CreateRecordWidth( INT32 iRecordNumber, INT32 iRecordWidth, INT32 iRecordHeightAdjustment, UINT8 ubFlags );
// sun_alf: functionality of additional files processing
#define ADDFILES_NAME_MAX_LENGTH (16)
#define ADDFILES_PATH_MAX_LENGTH (128)
typedef struct
{
CHAR16 name[ADDFILES_NAME_MAX_LENGTH + 1]; // in-game displayed name of file
CHAR8 path[ADDFILES_PATH_MAX_LENGTH + 1]; // local path to file under "/Laptop" dir
BOOLEAN atInit; // is the file available from game init
UINT8 font; // font code
UINT8 textColor; // text color code
UINT8 bkgdColor; // text background color code
UINT8 fileCode; // file code to integrate with vanilla files (starts with ADDITIONAL_FILE_0)
} AdditionalFiles_Descriptor;
typedef enum
{
ADDFILES_ELEMENT_NONE = 0,
ADDFILES_ELEMENT_ADDITIONALFILES,
ADDFILES_ELEMENT_FILE,
ADDFILES_ELEMENT,
} AdditionalFiles_ParseStage;
typedef struct
{
AdditionalFiles_ParseStage curElement;
CHAR8 szCharData[MAX_CHAR_DATA_LENGTH + 1];
UINT32 currentDepth;
UINT32 maxReadDepth;
UINT8 fileCode;
AdditionalFiles_Descriptor parsedData;
} AdditionalFiles_ParseData;
static BOOLEAN HandleAdditionalTextFile( FilesUnitPtr file );
static std::list<AdditionalFiles_Descriptor> g_AdditionalFilesList;
static AdditionalFiles_Descriptor* AdditionalFiles_GetDescriptor( UINT8 ubCode )
{
for ( AdditionalFiles_Descriptor &item : g_AdditionalFilesList )
{
if ( item.fileCode == ubCode )
{
return &item;
}
}
return NULL;
}
static AdditionalFiles_Descriptor* AdditionalFiles_LoadTextFile( FilesUnitPtr file )
{
AdditionalFiles_Descriptor *descr = AdditionalFiles_GetDescriptor( file->ubCode );
if ( descr )
{
ClearFileStringList();
CHAR8 fileName[MAX_PATH + 1] = TABLEDATA_DIRECTORY TABLEDATA_LAPTOP_DIRECTORY;
strncat( fileName, descr->path, MAX_PATH );
if ( FileExists( fileName ) )
{
HWFILE hFile = FileOpen( fileName, FILE_ACCESS_READ, FALSE );
if ( hFile )
{
std::string utf8Line;
while ( FileReadLine( hFile, &utf8Line ) )
{
std::wstring wcharLine = utf8_to_wstring( utf8Line );
AddStringToFilesList( (STR16) wcharLine.c_str() );
}
FileClose( hFile );
}
}
}
return descr;
}
static INT32 AdditionalFiles_GetFontHandler( UINT8 font )
{
INT32 iFont = (INT32)font;
if ( IsFontLoaded( iFont ) == FALSE )
iFont = FILES_TEXT_FONT;
return iFont;
}
static BOOLEAN AdditionalFiles_IsValid( AdditionalFiles_Descriptor *descr )
{
BOOLEAN result = FALSE;
CHAR8 fileName[MAX_PATH] = TABLEDATA_DIRECTORY TABLEDATA_LAPTOP_DIRECTORY;
strcat( fileName, descr->path );
BOOLEAN exists = FileExists( fileName );
if ( exists && wcslen( descr->name ) > 0 &&
(INT32)descr->font <= MAX_FONTS &&
ADDITIONAL_FILE_0 <= descr->fileCode && descr->fileCode <= ADDITIONAL_FILE_MAX )
{
result = TRUE;
}
return result;
}
// Process the opening tag in this expat callback.
static void XMLCALL AdditionalFiles_StartElementHandler( void *userData, const XML_Char *name, const XML_Char **atts )
{
AdditionalFiles_ParseData *pData = (AdditionalFiles_ParseData*) userData;
if ( pData->currentDepth <= pData->maxReadDepth )
{
if ( strcmp( name, "AdditionalFiles" ) == 0 && pData->curElement == ADDFILES_ELEMENT_NONE )
{
pData->fileCode = ADDITIONAL_FILE_0; // assign ID to each <File> entry
pData->curElement = ADDFILES_ELEMENT_ADDITIONALFILES;
pData->maxReadDepth++;
}
else if ( strcmp( name, "File" ) == 0 && pData->curElement == ADDFILES_ELEMENT_ADDITIONALFILES )
{
memset( &pData->parsedData, 0, sizeof(pData->parsedData) );
pData->curElement = ADDFILES_ELEMENT_FILE;
pData->maxReadDepth++;
}
else if ( pData->curElement == ADDFILES_ELEMENT_FILE &&
(strcmp( name, "Name" ) == 0 ||
strcmp( name, "Path" ) == 0 ||
strcmp( name, "AtInit" ) == 0 ||
strcmp( name, "Font" ) == 0 ||
strcmp( name, "TextColor" ) == 0 ||
strcmp( name, "BkgdColor" ) == 0) )
{
pData->curElement = ADDFILES_ELEMENT;
pData->maxReadDepth++;
}
pData->szCharData[0] = '\0';
}
pData->currentDepth++;
}
// Process any text content in this callback.
static void XMLCALL AdditionalFiles_CharacterDataHandler( void *userData, const XML_Char *str, int len )
{
AdditionalFiles_ParseData *pData = (AdditionalFiles_ParseData*) userData;
if ( pData->currentDepth <= pData->maxReadDepth && strlen( pData->szCharData ) < MAX_CHAR_DATA_LENGTH )
strncat( pData->szCharData, str, __min( (unsigned int)len, MAX_CHAR_DATA_LENGTH - strlen( pData->szCharData ) ) );
}
// Process the closing tag in this expat callback.
static void XMLCALL AdditionalFiles_EndElementHandler( void *userData, const XML_Char *name )
{
AdditionalFiles_ParseData *pData = (AdditionalFiles_ParseData*) userData;
if ( pData->currentDepth <= pData->maxReadDepth )
{
if ( pData->curElement == ADDFILES_ELEMENT_ADDITIONALFILES && strcmp( name, "AdditionalFiles" ) == 0 )
{
pData->curElement = ADDFILES_ELEMENT_NONE;
}
else if ( pData->curElement == ADDFILES_ELEMENT_FILE && strcmp( name, "File" ) == 0 )
{
pData->parsedData.fileCode = pData->fileCode++;
if ( AdditionalFiles_IsValid( &pData->parsedData ) == TRUE )
{
g_AdditionalFilesList.push_back( pData->parsedData );
}
pData->curElement = ADDFILES_ELEMENT_ADDITIONALFILES;
}
else if ( pData->curElement == ADDFILES_ELEMENT )
{
if ( strcmp( name, "Name" ) == 0 )
{
std::string strName( pData->szCharData );
std::wstring wstrName = utf8_to_wstring( strName );
wcsncpy( pData->parsedData.name, wstrName.c_str(), ADDFILES_NAME_MAX_LENGTH );
}
else if ( strcmp( name, "Path" ) == 0 )
strncpy( (CHAR8*)pData->parsedData.path, pData->szCharData, ADDFILES_PATH_MAX_LENGTH );
else if ( strcmp( name, "AtInit" ) == 0 )
pData->parsedData.atInit = (BOOLEAN)atol( pData->szCharData );
else if ( strcmp( name, "Font" ) == 0 )
pData->parsedData.font = (UINT8)atol( pData->szCharData );
else if ( strcmp( name, "TextColor" ) == 0 )
pData->parsedData.textColor = (UINT8)atol( pData->szCharData );
else if ( strcmp( name, "BkgdColor" ) == 0 )
pData->parsedData.bkgdColor = (UINT8)atol( pData->szCharData );
pData->curElement = ADDFILES_ELEMENT_FILE;
}
pData->maxReadDepth--;
}
pData->currentDepth--;
}
// Parse AdditionalFiles.xml and build list of file descriptors
static void LocateAdditionalFiles( )
{
g_AdditionalFilesList.clear();
CHAR8 fileName[MAX_PATH] = TABLEDATA_DIRECTORY TABLEDATA_LAPTOP_DIRECTORY;
strcat( fileName, LAPTOPADDITIONALFILESFILENAME );
if ( FileExists( fileName ) )
{
HWFILE hFile = FileOpen( fileName, FILE_ACCESS_READ, FALSE );
if ( hFile )
{
UINT32 uiBytesRead;
UINT32 uiFileSize = FileGetSize( hFile );
CHAR8 *fileBuffer = (CHAR8*)MemAlloc( uiFileSize + 1 );
if ( FileRead( hFile, fileBuffer, uiFileSize, &uiBytesRead ) )
{
XML_Parser parser = XML_ParserCreate( NULL );
XML_SetElementHandler( parser, AdditionalFiles_StartElementHandler, AdditionalFiles_EndElementHandler );
XML_SetCharacterDataHandler( parser, AdditionalFiles_CharacterDataHandler );
AdditionalFiles_ParseData pData;
memset( &pData, 0, sizeof( pData ) );
XML_SetUserData( parser, &pData );
fileBuffer[uiFileSize] = 0; // put a safe-guard null terminator
if ( XML_Parse( parser, fileBuffer, uiFileSize, TRUE ) != XML_STATUS_OK )
{
CHAR8 errorBuf[MAX_CHAR_DATA_LENGTH];
sprintf( errorBuf, "XML Parser Error in %s: %s at line %d", LAPTOPADDITIONALFILESFILENAME, XML_ErrorString( XML_GetErrorCode( parser ) ), XML_GetCurrentLineNumber( parser ) );
LiveMessage( errorBuf );
}
XML_ParserFree( parser );
}
MemFree( fileBuffer );
FileClose( hFile );
}
}
}
UINT32 AddFilesToPlayersLog(UINT8 ubCode, UINT32 uiDate, UINT8 ubFormat, STR8 pFirstPicFile, STR8 pSecondPicFile )
{
// adds Files item to player's log(Files List), returns unique id number of it
// outside of the Files system(the code in this .c file), this is the only function you'll ever need
UINT32 uiId=0;
// if not in Files mode, read in from file
if(!fInFilesMode)
OpenAndReadFilesFile( );
// process the actual data
uiId = ProcessAndEnterAFilesRecord(ubCode, uiDate, ubFormat ,pFirstPicFile, pSecondPicFile, FALSE );
// set unread flag, if nessacary
CheckForUnreadFiles( );
// write out to file if not in Files mode
if(!fInFilesMode)
OpenAndWriteFilesFile( );
// return unique id of this transaction
return uiId;
}
void GameInitFiles( )
{
if ( FileExists( FILES_DAT_FILE ) == TRUE )
{
FileDelete( FILES_DAT_FILE );
}
ClearFilesList( );
// add background check by RIS
AddFilesToPlayersLog( ENRICO_BACKGROUND, 0,255, NULL, NULL );
// additional files: add all available from game beginning files
LocateAdditionalFiles();
for ( AdditionalFiles_Descriptor item : g_AdditionalFilesList )
{
if ( item.atInit )
AddFilesToPlayersLog( item.fileCode, 0, FFORMAT_ADDITIONAL_TEXT, NULL, NULL );
}
//mission briefing by Jazz
//AddFilesToPlayersLog( MISSION_BRIEFING, 0,4, NULL, NULL );
}
void EnterFiles()
{
// load grpahics for files system
LoadFiles( );
//AddFilesToPlayersLog(1, 0, 0,"LAPTOP\\portrait.sti", "LAPTOP\\portrait.sti");
//AddFilesToPlayersLog(0, 0, 3,"LAPTOP\\portrait.sti", "LAPTOP\\portrait.sti");
//AddFilesToPlayersLog(2, 0, 1,"LAPTOP\\portrait.sti", "LAPTOP\\portrait.sti");
// in files mode now, set the fact
fInFilesMode=TRUE;
// initialize mouse regions
InitializeFilesMouseRegions( );
// create buttons
CreateButtonsForFilesPage( );
// now set start states
HandleFileViewerButtonStates( );
// Re-locate additional files: parse AdditionalFiles.xml and build descriptors. Processing from scratch on each Laptop
// files mode opening come handy for modders, also it follows such rule of this (files.cpp) module.
LocateAdditionalFiles( );
// build files list
OpenAndReadFilesFile( );
// render files system
RenderFiles( );
// entered due to icon
if( fEnteredFileViewerFromNewFileIcon == TRUE )
{
OpenFirstUnreadFile( );
fEnteredFileViewerFromNewFileIcon = FALSE;
}
}
void ExitFiles()
{
// write files list out to disk
OpenAndWriteFilesFile( );
// remove mouse regions
RemoveFilesMouseRegions( );
// delete buttons
DeleteButtonsForFilesPage( );
fInFilesMode = FALSE;
// remove files
RemoveFiles( );
// clear and allow to re-load all the stuff at next Laptop opening
g_AdditionalFilesList.clear();
}
void HandleFiles()
{
CheckForUnreadFiles( );
}
void RenderFiles()
{
HVOBJECT hHandle;
// render the background
RenderFilesBackGround( );
// draw the title bars text
DrawFilesTitleText( );
// the columns
DrawFilesListBackGround( );
// display the list of senders
DisplayFilesList( );
// draw the highlighted file
DisplayFileMessage( );
// title bar icon
BlitTitleBarIcons( );
// display border
GetVideoObject(&hHandle, guiLaptopBACKGROUND);
BltVideoObject(FRAME_BUFFER, hHandle, 0,iScreenWidthOffset + 108, iScreenHeightOffset + 23, VO_BLT_SRCTRANSPARENCY,NULL);
}
void RenderFilesBackGround( void )
{
// render generic background for file system
HVOBJECT hHandle;
// get title bar object
GetVideoObject(&hHandle, guiTITLE);
// blt title bar to screen
BltVideoObject(FRAME_BUFFER, hHandle, 0,TOP_X, TOP_Y - 2, VO_BLT_SRCTRANSPARENCY,NULL);
// get and blt the top part of the screen, video object and blt to screen
GetVideoObject( &hHandle, guiTOP );
BltVideoObject( FRAME_BUFFER, hHandle, 0,TOP_X, TOP_Y + 22, VO_BLT_SRCTRANSPARENCY, NULL );
return;
}
void DrawFilesTitleText( void )
{
// setup the font stuff
SetFont(FILES_TITLE_FONT);
SetFontForeground(FONT_WHITE);
SetFontBackground(FONT_BLACK);
// reset shadow
SetFontShadow(DEFAULT_SHADOW);
// draw the pages title
mprintf(TITLE_X,TITLE_Y,pFilesTitle[0]);
return;
}
BOOLEAN LoadFiles( void )
{
VOBJECT_DESC VObjectDesc;
// load files video objects into memory
// title bar
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("LAPTOP\\programtitlebar.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiTITLE));
// top portion of the screen background
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("LAPTOP\\fileviewer.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiTOP));
// the highlight
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("LAPTOP\\highlight.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiHIGHLIGHT));
// top portion of the screen background
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("LAPTOP\\fileviewerwhite.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiFileBack));
return (TRUE);
}
void RemoveFiles( void )
{
// delete files video objects from memory
DeleteVideoObjectFromIndex(guiTOP);
DeleteVideoObjectFromIndex(guiTITLE);
DeleteVideoObjectFromIndex(guiHIGHLIGHT);
DeleteVideoObjectFromIndex(guiFileBack);
return;
}
UINT32 ProcessAndEnterAFilesRecord( UINT8 ubCode, UINT32 uiDate, UINT8 ubFormat ,STR8 pFirstPicFile, STR8 pSecondPicFile, BOOLEAN fRead )
{
UINT32 uiId=0;
FilesUnitPtr pFiles=pFilesListHead;
// add to Files list
if(pFiles)
{
while(pFiles)
{
// check to see if the file is already there
if(pFiles->ubCode==ubCode)
{
// if so, return it's id number
return ( pFiles->uiIdNumber );
}
// next in the list
pFiles = pFiles->Next;
}
// reset pointer
pFiles=pFilesListHead;
// go to end of list
while(pFiles->Next)
{
pFiles = pFiles->Next;
}
// alloc space
pFiles->Next = (files *) MemAlloc(sizeof(FilesUnit));
// increment id number
uiId = pFiles->uiIdNumber + 1;
// set up information passed
pFiles = pFiles->Next;
pFiles->Next = NULL;
pFiles->ubCode = ubCode;
pFiles->uiDate = uiDate;
pFiles->uiIdNumber = uiId;
pFiles->ubFormat = ubFormat;
pFiles->fRead = fRead;
}
else
{
// alloc space
pFiles = (FilesUnitPtr) MemAlloc(sizeof(FilesUnit));
// setup info passed
pFiles->Next = NULL;
pFiles->ubCode = ubCode;
pFiles->uiDate = uiDate;
pFiles->uiIdNumber = uiId;
pFilesListHead = pFiles;
pFiles->ubFormat=ubFormat;
pFiles->fRead = fRead;
}
// null out ptr's to picture file names
pFiles->pPicFileNameList[0] = NULL;
pFiles->pPicFileNameList[1] = NULL;
// copy file name strings
// first file
if(pFirstPicFile)
{
if((pFirstPicFile[0]) != 0)
{
pFiles->pPicFileNameList[0] = (STR8) MemAlloc(strlen(pFirstPicFile) + 1 );
strcpy( pFiles->pPicFileNameList[0], pFirstPicFile);
pFiles->pPicFileNameList[0][strlen(pFirstPicFile)] = 0;
}
}
// second file
if(pSecondPicFile)
{
if((pSecondPicFile[0]) != 0)
{
pFiles->pPicFileNameList[1] = (STR8) MemAlloc(strlen(pSecondPicFile) + 1 );
strcpy( pFiles->pPicFileNameList[1], pSecondPicFile);
pFiles->pPicFileNameList[1][ strlen( pSecondPicFile ) ] = 0;
}
}
// return unique id
return uiId;
}
void OpenAndReadFilesFile( void )
{
// this procedure will open and read in data to the finance list
HWFILE hFileHandle;
UINT8 ubCode;
UINT32 uiDate;
INT32 iBytesRead=0;
UINT32 uiByteCount=0;
CHAR8 pFirstFilePath[128];
CHAR8 pSecondFilePath[128];
UINT8 ubFormat;
BOOLEAN fRead;
// clear out the old list
ClearFilesList( );
// no file, return
if ( ! (FileExists( FILES_DAT_FILE ) ) )
return;
// open file
hFileHandle=FileOpen( FILES_DAT_FILE,( FILE_OPEN_EXISTING | FILE_ACCESS_READ ), FALSE );
// failed to get file, return
if(!hFileHandle)
{
return;
}
// make sure file is more than 0 length
if ( FileGetSize( hFileHandle ) == 0 )
{
FileClose( hFileHandle );
return;
}
// file exists, read in data, continue until file end
while( FileGetSize( hFileHandle ) > uiByteCount)
{
// read in data
FileRead( hFileHandle, &ubCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &uiDate, sizeof(UINT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &pFirstFilePath, 128, (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &pSecondFilePath, 128, (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &ubFormat, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &fRead, sizeof(UINT8), (UINT32 *)&iBytesRead );
// add transaction
ProcessAndEnterAFilesRecord(ubCode, uiDate, ubFormat,pFirstFilePath, pSecondFilePath, fRead);
// increment byte counter
uiByteCount += sizeof( UINT32 ) + sizeof( UINT8 )+ 128 + 128 + sizeof(UINT8) + sizeof( BOOLEAN );
}
// close file
FileClose( hFileHandle );
return;
}
BOOLEAN OpenAndWriteFilesFile( void )
{
// this procedure will open and write out data from the finance list
HWFILE hFileHandle;
FilesUnitPtr pFilesList=pFilesListHead;
CHAR8 pFirstFilePath[128];
CHAR8 pSecondFilePath[128];
memset(&pFirstFilePath, 0, sizeof( pFirstFilePath ) );
memset(&pSecondFilePath, 0, sizeof( pSecondFilePath ) );
if( pFilesList != NULL )
{
if(pFilesList->pPicFileNameList[0])
{
strcpy(pFirstFilePath, pFilesList->pPicFileNameList[0]);
}
if(pFilesList->pPicFileNameList[1])
{
strcpy(pSecondFilePath, pFilesList->pPicFileNameList[1]);
}
}
// open file
hFileHandle=FileOpen( FILES_DAT_FILE, FILE_ACCESS_WRITE|FILE_CREATE_ALWAYS, FALSE);
// if no file exits, do nothing
if(!hFileHandle)
{
return ( FALSE );
}
// write info, while there are elements left in the list
while(pFilesList)
{
// now write date and amount, and code
FileWrite( hFileHandle, &(pFilesList->ubCode), sizeof ( UINT8 ), NULL );
FileWrite( hFileHandle, &(pFilesList->uiDate), sizeof ( UINT32 ), NULL );
FileWrite( hFileHandle, &(pFirstFilePath), 128, NULL );
FileWrite( hFileHandle, &(pSecondFilePath), 128, NULL );
FileWrite( hFileHandle, &(pFilesList->ubFormat), sizeof(UINT8), NULL );
FileWrite( hFileHandle, &(pFilesList->fRead), sizeof(UINT8), NULL );
// next element in list
pFilesList = pFilesList->Next;
}
// close file
FileClose( hFileHandle );
// clear out the old list
ClearFilesList( );
return ( TRUE );
}
void ClearFilesList( void )
{
// remove each element from list of transactions
FilesUnitPtr pFilesList=pFilesListHead;
FilesUnitPtr pFilesNode=pFilesList;
// while there are elements in the list left, delete them
while( pFilesList )
{
// set node to list head
pFilesNode=pFilesList;
// set list head to next node
pFilesList=pFilesList->Next;
// if present, dealloc string
if(pFilesNode->pPicFileNameList[0])
{
MemFree(pFilesNode->pPicFileNameList[0]);
}
if(pFilesNode->pPicFileNameList[1])
{
MemFree(pFilesNode->pPicFileNameList[1]);
}
// delete current node
MemFree(pFilesNode);
}
pFilesListHead=NULL;
return;
}
void DrawFilesListBackGround( void )
{
// proceudre will draw the background for the list of files
// HVOBJECT hHandle;
// now the columns
return;
}
void DisplayFilesList( void )
{
// this function will run through the list of files of files and display the 'sender'
FilesUnitPtr pFilesList=pFilesListHead;
INT32 iCounter=0;
HVOBJECT hHandle;
// font stuff
SetFont(FILES_TEXT_FONT);
SetFontForeground(FONT_BLACK);
SetFontBackground(FONT_BLACK);
SetFontShadow(NO_SHADOW);
// runt hrough list displaying 'sender'
while((pFilesList))//&&(iCounter < MAX_FILES_LIST_LENGTH))
{
if (iCounter==iHighLightFileLine)
{
// render highlight
GetVideoObject(&hHandle, guiHIGHLIGHT);
BltVideoObject(FRAME_BUFFER, hHandle, 0, FILES_SENDER_TEXT_X - 5, iScreenHeightOffset + ( ( iCounter + 9 ) * BLOCK_HEIGHT) + ( iCounter * 2 ) - 4 , VO_BLT_SRCTRANSPARENCY,NULL);
}
if ( pFilesList->ubCode <= LAST_JA2_VANILLA_FILE )
{
mprintf( FILES_SENDER_TEXT_X, iScreenHeightOffset + ((iCounter + 9) * BLOCK_HEIGHT) + (iCounter * 2) - 2, pFilesSenderList[pFilesList->ubCode] );
}
else // additional file case
{
AdditionalFiles_Descriptor *descr = AdditionalFiles_GetDescriptor( pFilesList->ubCode );
if ( descr )
mprintf( FILES_SENDER_TEXT_X, iScreenHeightOffset + ((iCounter + 9) * BLOCK_HEIGHT) + (iCounter * 2) - 2, descr->name );
}
iCounter++;
pFilesList=pFilesList->Next;
}
// reset shadow
SetFontShadow(DEFAULT_SHADOW);
return;
}
void DisplayFileMessage( void )
{
// get the currently selected message
if(iHighLightFileLine!=-1)
{
// display text
DisplayFormattedText( );
}
else
{
HandleFileViewerButtonStates( );
}
// reset shadow
SetFontShadow(DEFAULT_SHADOW);
return;
}
void InitializeFilesMouseRegions( void )
{
INT32 iCounter=0;
// init mouseregions
for(iCounter=0; iCounter <MAX_FILES_PAGE; iCounter++)
{
MSYS_DefineRegion(&pFilesRegions[iCounter],FILES_LIST_X ,(INT16)iScreenHeightOffset + (FILES_LIST_Y + iCounter * ( BLOCK_HEIGHT + 2 ) ), FILES_LIST_X + FILES_LIST_WIDTH ,(INT16)iScreenHeightOffset + (FILES_LIST_Y + ( iCounter + 1 ) * ( BLOCK_HEIGHT + 2 ) ),
MSYS_PRIORITY_NORMAL+2,MSYS_NO_CURSOR, MSYS_NO_CALLBACK, FilesBtnCallBack );
MSYS_AddRegion(&pFilesRegions[iCounter]);
MSYS_SetRegionUserData(&pFilesRegions[iCounter],0,iCounter);
}
return;
}
void RemoveFilesMouseRegions( void )
{
INT32 iCounter=0;
for(iCounter=0; iCounter <MAX_FILES_PAGE; iCounter++)
{
MSYS_RemoveRegion( &pFilesRegions[iCounter]);
}
}
void FilesBtnCallBack(MOUSE_REGION * pRegion, INT32 iReason )
{
INT32 iFileId = -1;
INT32 iCounter = 0;
FilesUnitPtr pFilesList=pFilesListHead;
if (iReason & MSYS_CALLBACK_REASON_INIT)
{
return;
}
if(iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
{
// left button
iFileId = MSYS_GetRegionUserData(pRegion, 0);
// reset iHighLightListLine
iHighLightFileLine = -1;
if( iHighLightFileLine == iFileId )
{
return;
}
// make sure is a valid
while( pFilesList )
{
// if iCounter = iFileId, is a valid file
if( iCounter == iFileId )
{
giFilesPage = 0;
iHighLightFileLine = iFileId;
}
// next element in list
pFilesList = pFilesList->Next;
// increment counter
iCounter++;
}
fReDrawScreenFlag=TRUE;
return;
}
}
BOOLEAN DisplayFormattedText( void )
{
FilesUnitPtr pFilesList=pFilesListHead;
UINT16 usFirstWidth = 0;
UINT16 usFirstHeight = 0;
UINT16 usSecondWidth;
UINT16 usSecondHeight;
UINT32 uiCounter = 0;
UINT32 uiLength = 0;
UINT32 uiHeight = 0;
UINT32 uiOffSet = 0;
CHAR16 sString[2048];
HVOBJECT hHandle;
UINT32 uiFirstTempPicture;
UINT32 uiSecondTempPicture;
VOBJECT_DESC VObjectDesc;
INT16 usFreeSpace = 0;
static INT32 iOldMessageCode = 0;
fWaitAFrame = FALSE;
// get the file that was highlighted
for ( INT32 i = 0; i < iHighLightFileLine; i++ )
{
pFilesList = pFilesList->Next;
}
// set file as read
pFilesList->fRead = TRUE;
// clear the file string structure list
// get file background object
GetVideoObject(&hHandle, guiFileBack);
// blt background to screen
BltVideoObject(FRAME_BUFFER, hHandle, 0, FILE_VIEWER_X, FILE_VIEWER_Y - 4, VO_BLT_SRCTRANSPARENCY,NULL);
// get the offset in the file
if ( pFilesList->ubCode <= LAST_JA2_VANILLA_FILE )
{
uiOffSet = ubFileOffsets[pFilesList->ubCode];
uiLength = ubFileRecordsLength[pFilesList->ubCode];
}
// no shadow
SetFontShadow(NO_SHADOW);
switch( pFilesList->ubFormat )
{
case 0:
// no format, all text
while(uiLength > uiCounter)
{
// read one record from file manager file
LoadEncryptedDataFromFile( "BINARYDATA\\Files.edt", sString, FILE_STRING_SIZE * ( uiOffSet + uiCounter ) * 2, FILE_STRING_SIZE * 2 );
// display string and get height
uiHeight += IanDisplayWrappedString(FILE_VIEWER_X + 4, ( UINT16 )( FILE_VIEWER_Y + uiHeight ), FILE_VIEWER_WIDTH, FILE_GAP, FILES_TEXT_FONT, FILE_TEXT_COLOR, sString,0,FALSE,0);
// increment file record counter
uiCounter++;
}
break;
case 1:
// second format, one picture, all text below
// load graphic
VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
FilenameForBPP( pFilesList->pPicFileNameList[ 0 ], VObjectDesc.ImageFile );
CHECKF(AddVideoObject( &VObjectDesc, &uiFirstTempPicture ) );
GetVideoObjectETRLESubregionProperties( uiFirstTempPicture, 0, &usFirstWidth, &usFirstHeight );
// get file background object
GetVideoObject(&hHandle, uiFirstTempPicture);
// blt background to screen
BltVideoObject(FRAME_BUFFER, hHandle, 0, FILE_VIEWER_X + 4 + ( FILE_VIEWER_WIDTH - usFirstWidth ) / 2, FILE_VIEWER_Y + 10, VO_BLT_SRCTRANSPARENCY,NULL);
uiHeight = usFirstHeight + 20;
while(uiLength > uiCounter)
{
// read one record from file manager file
LoadEncryptedDataFromFile( "BINARYDATA\\Files.edt", sString, FILE_STRING_SIZE * ( uiOffSet + uiCounter ) * 2, FILE_STRING_SIZE * 2 );
// display string and get height
uiHeight += IanDisplayWrappedString(FILE_VIEWER_X + 4, ( UINT16 )( FILE_VIEWER_Y + uiHeight ), FILE_VIEWER_WIDTH, FILE_GAP, FILES_TEXT_FONT, FILE_TEXT_COLOR, sString,0,FALSE,0);
// increment file record counter
uiCounter++;
}
// delete video object
DeleteVideoObjectFromIndex( uiFirstTempPicture );
break;
case 2:
// third format, two pictures, side by side with all text below
// load first graphic
VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
FilenameForBPP( pFilesList->pPicFileNameList[ 0 ], VObjectDesc.ImageFile );
CHECKF(AddVideoObject( &VObjectDesc, &uiFirstTempPicture));
// load second graphic
VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
FilenameForBPP( pFilesList->pPicFileNameList[ 1 ] , VObjectDesc.ImageFile );
CHECKF(AddVideoObject( &VObjectDesc, &uiSecondTempPicture ) );
GetVideoObjectETRLESubregionProperties( uiFirstTempPicture, 0, &usFirstWidth, &usFirstHeight );
GetVideoObjectETRLESubregionProperties( uiSecondTempPicture, 0, &usSecondWidth, &usSecondHeight );
// get free space;
usFreeSpace = FILE_VIEWER_WIDTH - usFirstWidth - usSecondWidth;
usFreeSpace /= 3;
// get file background object
GetVideoObject(&hHandle, uiFirstTempPicture);
// blt background to screen
BltVideoObject(FRAME_BUFFER, hHandle, 0, FILE_VIEWER_X + usFreeSpace, FILE_VIEWER_Y + 10, VO_BLT_SRCTRANSPARENCY,NULL);
// get file background object
GetVideoObject(&hHandle, uiSecondTempPicture);
// get position for second picture
usFreeSpace *= 2;
usFreeSpace += usFirstWidth;
// blt background to screen
BltVideoObject(FRAME_BUFFER, hHandle, 0, FILE_VIEWER_X + usFreeSpace, FILE_VIEWER_Y + 10, VO_BLT_SRCTRANSPARENCY,NULL);
// delete video object
DeleteVideoObjectFromIndex(uiFirstTempPicture);
DeleteVideoObjectFromIndex(uiSecondTempPicture);
// put in text
uiHeight = usFirstHeight + 20;
while(uiLength > uiCounter)
{
// read one record from file manager file
LoadEncryptedDataFromFile( "BINARYDATA\\Files.edt", sString, FILE_STRING_SIZE * ( uiOffSet + uiCounter ) * 2, FILE_STRING_SIZE * 2 );
// display string and get height
uiHeight += IanDisplayWrappedString(FILE_VIEWER_X + 4, ( UINT16 )( FILE_VIEWER_Y + uiHeight ), FILE_VIEWER_WIDTH, FILE_GAP, FILES_TEXT_FONT, FILE_TEXT_COLOR, sString,0,FALSE,0);
// increment file record counter
uiCounter++;
}
break;
case 3:
// picture on the left, with text on right and below
// load first graphic
HandleSpecialTerroristFile( pFilesList->ubCode, pFilesList->pPicFileNameList[ 0 ] );
break;
case 4:
// picture on the left, with text on right and below
// load first graphic
HandleMissionBriefingFiles( pFilesList->ubFormat );
break;
case FFORMAT_ADDITIONAL_TEXT:
HandleAdditionalTextFile( pFilesList );
break;
default:
HandleSpecialFiles( pFilesList->ubFormat );
}
HandleFileViewerButtonStates( );
SetFontShadow(DEFAULT_SHADOW);
return ( TRUE );
}
//Mission briefing by Jazz
FileRecordWidthPtr CreateWidthRecordsForMissionBriefingFile( void )
{
// this fucntion will create the width list for the Arulco intelligence file
FileRecordWidthPtr pTempRecord = NULL;
FileRecordWidthPtr pRecordListHead = NULL;
// first record width
// pTempRecord = CreateRecordWidth( 7, 350, 200,0 );
pTempRecord = CreateRecordWidth( FILES_COUNTER_1_WIDTH, 200, 0,0 );
// set up head of list now
pRecordListHead = pTempRecord;
// next record
// pTempRecord->Next = CreateRecordWidth( 43, 200,0, 0 );
pTempRecord->Next = CreateRecordWidth( FILES_COUNTER_2_WIDTH, 200,0, 0 );
pTempRecord = pTempRecord->Next;
// and the next..
// pTempRecord->Next = CreateRecordWidth( 45, 200,0, 0 );
pTempRecord->Next = CreateRecordWidth( FILES_COUNTER_3_WIDTH, 200,0, 0 );
pTempRecord = pTempRecord->Next;
return( pRecordListHead );
}
BOOLEAN HandleMissionBriefingFiles( UINT8 ubFormat )
{
INT32 iCounter = 0;
CHAR16 sString[2048];
FileStringPtr pTempString = NULL ;
FileStringPtr pLocatorString = NULL;
INT32 iYPositionOnPage = 0;
INT32 iFileLineWidth = 0;
INT32 iFileStartX = 0;
UINT32 uiFlags = 0;
UINT32 uiFont = 0;
BOOLEAN fGoingOffCurrentPage = FALSE;
FileRecordWidthPtr WidthList = NULL;
UINT32 uiPicture;
HVOBJECT hHandle;
VOBJECT_DESC VObjectDesc;
ClearFileStringList( );
switch( ubFormat )
{
case( 4 ):
// load data
// read one record from file manager file
WidthList = CreateWidthRecordsForMissionBriefingFile( );
while( iCounter < 250 )
{
LoadEncryptedDataFromFile( "binarydata\\MissionBriefing.EDT", sString, FILE_STRING_SIZE * ( iCounter ) * 2, FILE_STRING_SIZE * 2 );
AddStringToFilesList( sString );
iCounter++;
}
pTempString = pFileStringList;
iYPositionOnPage = 0;
iCounter = 0;
pLocatorString = pTempString;
pTempString = GetFirstStringOnThisPage( pFileStringList,FILES_TEXT_FONT, 350, FILE_GAP, giFilesPage, MAX_FILE_MESSAGE_PAGE_SIZE, WidthList);
// find out where this string is
while( pLocatorString != pTempString )
{
iCounter++;
pLocatorString = pLocatorString->Next;
}
// move through list and display
while( pTempString )
{
uiFlags = IAN_WRAP_NO_SHADOW;
// copy over string
wcscpy( sString, pTempString->pString );
if( sString[ 0 ] == 0 )
{
// on last page
fOnLastFilesPageFlag = TRUE;
}
// set up font
uiFont = FILES_TEXT_FONT;
if( giFilesPage == 0 )
{
switch( iCounter )
{
case( 0 ):
uiFont = FILES_TITLE_FONT;
break;
}
}
if( iCounter == 0 )
{
// reset width
iFileLineWidth = 350;
iFileStartX = (UINT16) ( FILE_VIEWER_X + 10 );
}
else
{
// reset width
iFileLineWidth = 350;
iFileStartX = (UINT16) ( FILE_VIEWER_X + 10 );
}
if( ( iYPositionOnPage + IanWrappedStringHeight(0, 0, ( UINT16 )iFileLineWidth, FILE_GAP,
uiFont, 0, sString,
0, 0, 0 ) ) < MAX_FILE_MESSAGE_PAGE_SIZE )
{
// now print it
iYPositionOnPage += ( INT32 )IanDisplayWrappedString((UINT16) ( iFileStartX ), ( UINT16 )( FILE_VIEWER_Y + iYPositionOnPage), ( INT16 )iFileLineWidth, FILE_GAP, uiFont, FILE_TEXT_COLOR, sString,0,FALSE, uiFlags );
fGoingOffCurrentPage = FALSE;
}
else
{
// gonna get cut off...end now
fGoingOffCurrentPage = TRUE;
}
pTempString = pTempString->Next;
if( pTempString == NULL )
{
// on last page
fOnLastFilesPageFlag = TRUE;
}
else
{
fOnLastFilesPageFlag = FALSE;
}
// going over the edge, stop now
if( fGoingOffCurrentPage == TRUE )
{
pTempString = NULL;
}
iCounter++;
}
ClearOutWidthRecordsList( WidthList );
ClearFileStringList( );
break;
}
// place pictures
// page 1 picture of country
if( giFilesPage == 0 )
{
// title bar
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
//Ja25, new map
#ifdef JA2UB
if (FileExists(MAP_JA25))
{
FilenameForBPP("LAPTOP\\TraconaMap.sti", VObjectDesc.ImageFile);
}
else
{
FilenameForBPP("LAPTOP\\ArucoFilesMap.sti", VObjectDesc.ImageFile);
}
#else
FilenameForBPP("LAPTOP\\ArucoFilesMap.sti", VObjectDesc.ImageFile);
#endif
CHECKF(AddVideoObject(&VObjectDesc, &uiPicture));
// get title bar object
GetVideoObject(&hHandle, uiPicture);
// blt title bar to screen
BltVideoObject(FRAME_BUFFER, hHandle, 0,iScreenWidthOffset + 300, iScreenHeightOffset + 270, VO_BLT_SRCTRANSPARENCY,NULL);
DeleteVideoObjectFromIndex( uiPicture );
}
else if( giFilesPage == 1 )
{
// title bar
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
//Ja25, new map
#ifdef JA2UB
if (FileExists(MAP_JA25))
{
FilenameForBPP("LAPTOP\\TraconaMap.sti", VObjectDesc.ImageFile);
}
else
{
FilenameForBPP("LAPTOP\\ArucoFilesMap.sti", VObjectDesc.ImageFile);
}
#else
FilenameForBPP("LAPTOP\\ArucoFilesMap.sti", VObjectDesc.ImageFile);
#endif
CHECKF(AddVideoObject(&VObjectDesc, &uiPicture));
// get title bar object
GetVideoObject(&hHandle, uiPicture);
// blt title bar to screen
BltVideoObject(FRAME_BUFFER, hHandle, 0,iScreenWidthOffset + 300, iScreenHeightOffset + 270, VO_BLT_SRCTRANSPARENCY,NULL);
DeleteVideoObjectFromIndex( uiPicture );
}
return ( TRUE );
}
static BOOLEAN HandleAdditionalTextFile( FilesUnitPtr file )
{
AdditionalFiles_Descriptor *descr = AdditionalFiles_LoadTextFile( file );
if ( descr == NULL )
return FALSE;
// set up font
INT32 uiFont = AdditionalFiles_GetFontHandler( descr->font );
UINT8 ubFontColor = descr->textColor;
UINT8 ubFontBgColor = descr->bkgdColor;
UINT32 uiFlags = IAN_WRAP_NO_SHADOW;
// Create list of width(s). Actually, text file view needs only one of it.
FileRecordWidthPtr widthList = CreateRecordWidth( 0, FILE_VIEWER_WIDTH, 0, 0 );
FileStringPtr pFileString = GetFirstStringOnThisPage( pFileStringList,
uiFont, FILE_VIEWER_WIDTH, FILE_GAP, giFilesPage, MAX_TEXT_FILE_MESSAGE_PAGE_SIZE, widthList );
// move through list and display
UINT16 usPositionOnPage = 0;
while ( pFileString )
{
UINT16 drawnStringHeight = IanWrappedStringHeight( FILE_VIEWER_X + 4, FILE_VIEWER_Y + usPositionOnPage,
FILE_VIEWER_WIDTH, FILE_GAP, uiFont, ubFontColor, pFileString->pString, ubFontBgColor, FALSE, uiFlags );
// if the string we are going to draw fits current page, then draw it, otherwise stop drawing current page
if ( usPositionOnPage + drawnStringHeight < MAX_TEXT_FILE_MESSAGE_PAGE_SIZE )
{
usPositionOnPage += IanDisplayWrappedString( FILE_VIEWER_X + 4, FILE_VIEWER_Y + usPositionOnPage,
FILE_VIEWER_WIDTH, FILE_GAP, uiFont, ubFontColor, pFileString->pString, ubFontBgColor, FALSE, uiFlags );
}
else
{
break;
}
pFileString = pFileString->Next;
}
if ( pFileString == NULL )
{
fOnLastFilesPageFlag = TRUE;
}
else
{
fOnLastFilesPageFlag = FALSE;
}
ClearOutWidthRecordsList( widthList );
return TRUE;
}
//-------------------------------------------
BOOLEAN HandleSpecialFiles( UINT8 ubFormat )
{
INT32 iCounter = 0;
CHAR16 sString[2048];
FileStringPtr pTempString = NULL ;
FileStringPtr pLocatorString = NULL;
INT32 iYPositionOnPage = 0;
INT32 iFileLineWidth = 0;
INT32 iFileStartX = 0;
UINT32 uiFlags = 0;
UINT32 uiFont = 0;
BOOLEAN fGoingOffCurrentPage = FALSE;
FileRecordWidthPtr WidthList = NULL;
UINT32 uiPicture;
HVOBJECT hHandle;
VOBJECT_DESC VObjectDesc;
ClearFileStringList( );
switch( ubFormat )
{
case( 255 ):
// load data
// read one record from file manager file
WidthList = CreateWidthRecordsForAruloIntelFile( );
while( iCounter < LENGTH_OF_ENRICO_FILE )
{
#ifdef JA2UB
if (FileExists(RIS_EDT_FILE_JA25))
{
LoadEncryptedDataFromFile( RIS_EDT_FILE_JA25, sString, FILE_STRING_SIZE * ( iCounter ) * 2, FILE_STRING_SIZE * 2 );
}
else
{
LoadEncryptedDataFromFile( RIS_EDT_FILE_JA25, sString, FILE_STRING_SIZE * ( iCounter ) * 2, FILE_STRING_SIZE * 2 );
}
#else
LoadEncryptedDataFromFile( "BINARYDATA\\RIS.EDT", sString, FILE_STRING_SIZE * ( iCounter ) * 2, FILE_STRING_SIZE * 2 );
#endif
AddStringToFilesList( sString );
iCounter++;
}
pTempString = pFileStringList;
iYPositionOnPage = 0;
iCounter = 0;
pLocatorString = pTempString;
pTempString = GetFirstStringOnThisPage( pFileStringList,FILES_TEXT_FONT, 350, FILE_GAP, giFilesPage, MAX_FILE_MESSAGE_PAGE_SIZE, WidthList);
// find out where this string is
while( pLocatorString != pTempString )
{
iCounter++;
pLocatorString = pLocatorString->Next;
}
// move through list and display
while( pTempString )
{
uiFlags = IAN_WRAP_NO_SHADOW;
// copy over string
wcscpy( sString, pTempString->pString );
if( sString[ 0 ] == 0 )
{
// on last page
fOnLastFilesPageFlag = TRUE;
}
// set up font
uiFont = FILES_TEXT_FONT;
if( giFilesPage == 0 )
{
switch( iCounter )
{
case( 0 ):
uiFont = FILES_TITLE_FONT;
break;
}
}
// reset width
iFileLineWidth = 350;
iFileStartX = (UINT16) ( FILE_VIEWER_X + 10 );
// based on the record we are at, selected X start position and the width to wrap the line, to fit around pictures
if( iCounter == 0 )
{
// title
iFileLineWidth = 350;
iFileStartX = (UINT16) ( FILE_VIEWER_X + 10 );
}
else if( iCounter == 1 )
{
// opening on first page
iFileLineWidth = 350;
iFileStartX = (UINT16) ( FILE_VIEWER_X + 10 );
}
else if( ( iCounter > 1) &&( iCounter < FILES_COUNTER_1_WIDTH ) )
{
iFileLineWidth = 350;
iFileStartX = (UINT16) ( FILE_VIEWER_X + 10 );
}
else if( iCounter == FILES_COUNTER_1_WIDTH )
{
if( giFilesPage == 0 )
{
iYPositionOnPage += ( MAX_FILE_MESSAGE_PAGE_SIZE - iYPositionOnPage );
}
iFileLineWidth = 350;
iFileStartX = (UINT16) ( FILE_VIEWER_X + 10 );
}
else if( iCounter == FILES_COUNTER_2_WIDTH )
{
iFileLineWidth = 200;
iFileStartX = (UINT16) ( FILE_VIEWER_X + 150 );
}
else if( iCounter == FILES_COUNTER_3_WIDTH )
{
iFileLineWidth = 200;
iFileStartX = (UINT16) ( FILE_VIEWER_X + 150 );
}
else
{
iFileLineWidth = 350;
iFileStartX = (UINT16) ( FILE_VIEWER_X + 10 );
}
// not far enough, advance
if( ( iYPositionOnPage + IanWrappedStringHeight(0, 0, ( UINT16 )iFileLineWidth, FILE_GAP,
uiFont, 0, sString,
0, 0, 0 ) ) < MAX_FILE_MESSAGE_PAGE_SIZE )
{
// now print it
iYPositionOnPage += ( INT32 )IanDisplayWrappedString((UINT16) ( iFileStartX ), ( UINT16 )( FILE_VIEWER_Y + iYPositionOnPage), ( INT16 )iFileLineWidth, FILE_GAP, uiFont, FILE_TEXT_COLOR, sString,0,FALSE, uiFlags );
fGoingOffCurrentPage = FALSE;
}
else
{
// gonna get cut off...end now
fGoingOffCurrentPage = TRUE;
}
pTempString = pTempString->Next;
if( pTempString == NULL )
{
// on last page
fOnLastFilesPageFlag = TRUE;
}
else
{
fOnLastFilesPageFlag = FALSE;
}
// going over the edge, stop now
if( fGoingOffCurrentPage == TRUE )
{
pTempString = NULL;
}
iCounter++;
}
ClearOutWidthRecordsList( WidthList );
ClearFileStringList( );
break;
}
// place pictures
// page 1 picture of country
if( giFilesPage == 0 )
{
// title bar
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
#ifdef JA2UB
//Ja25, new map
if (FileExists(MAP_JA25))
{
FilenameForBPP("LAPTOP\\TraconaMap.sti", VObjectDesc.ImageFile);
}
else
{
FilenameForBPP("LAPTOP\\ArucoFilesMap.sti", VObjectDesc.ImageFile);
}
#else
FilenameForBPP("LAPTOP\\ArucoFilesMap.sti", VObjectDesc.ImageFile);
#endif
CHECKF(AddVideoObject(&VObjectDesc, &uiPicture));
// get title bar object
GetVideoObject(&hHandle, uiPicture);
// blt title bar to screen
BltVideoObject(FRAME_BUFFER, hHandle, 0,iScreenWidthOffset + 300, iScreenHeightOffset + 270, VO_BLT_SRCTRANSPARENCY,NULL);
DeleteVideoObjectFromIndex( uiPicture );
}
#ifdef JA2UB
//JA25 : no picture needed
#else
else if( giFilesPage == 4 )
{
// kid pic
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("LAPTOP\\Enrico_Y.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &uiPicture));
// get title bar object
GetVideoObject(&hHandle, uiPicture);
// blt title bar to screen
BltVideoObject(FRAME_BUFFER, hHandle, 0,iScreenWidthOffset + 260, iScreenHeightOffset + 225, VO_BLT_SRCTRANSPARENCY,NULL);
DeleteVideoObjectFromIndex( uiPicture );
}
#endif
#ifdef JA2UB
//Ja25 No picture
#else
else if( giFilesPage == 5 )
{
// wedding pic
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("LAPTOP\\Enrico_W.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &uiPicture));
// get title bar object
GetVideoObject(&hHandle, uiPicture);
// blt title bar to screen
BltVideoObject(FRAME_BUFFER, hHandle, 0,iScreenWidthOffset + 260, iScreenHeightOffset + 85, VO_BLT_SRCTRANSPARENCY,NULL);
DeleteVideoObjectFromIndex( uiPicture );
}
#endif
return ( TRUE );
}
void AddStringToFilesList( STR16 pString )
{
FileStringPtr pFileString;
FileStringPtr pTempString = pFileStringList;
// create string structure
pFileString = (FileStringPtr) MemAlloc( sizeof( FileString ) );
// alloc string and copy
pFileString->pString = (STR16) MemAlloc( ( wcslen( pString ) * sizeof(CHAR16) ) + 2 );
wcscpy( pFileString->pString, pString );
pFileString->pString[ wcslen( pString ) ] = 0;
// set Next to NULL
pFileString->Next = NULL;
if( pFileStringList == NULL )
{
pFileStringList = pFileString;
}
else
{
while( pTempString->Next )
{
pTempString = pTempString->Next;
}
pTempString->Next = pFileString;
}
return;
}
void ClearFileStringList( void )
{
FileStringPtr pFileString;
FileStringPtr pDeleteFileString;
pFileString = pFileStringList;
if( pFileString == NULL )
{
return;
}
while( pFileString->Next)
{
pDeleteFileString = pFileString;
pFileString = pFileString->Next;
MemFree( pDeleteFileString->pString);
MemFree( pDeleteFileString );
}
// last one
MemFree( pFileString );
pFileStringList = NULL;
}
void CreateButtonsForFilesPage( void )
{
// will create buttons for the files page
giFilesPageButtonsImage[0]= LoadButtonImage( "LAPTOP\\arrows.sti" ,-1,0,-1,1,-1 );
giFilesPageButtons[0] = QuickCreateButton( giFilesPageButtonsImage[0], PREVIOUS_FILE_PAGE_BUTTON_X, PREVIOUS_FILE_PAGE_BUTTON_Y,
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
(GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnPreviousFilePageCallback );
giFilesPageButtonsImage[ 1 ]= LoadButtonImage( "LAPTOP\\arrows.sti" ,-1,6,-1,7,-1 );
giFilesPageButtons[ 1 ] = QuickCreateButton( giFilesPageButtonsImage[ 1 ], NEXT_FILE_PAGE_BUTTON_X, NEXT_FILE_PAGE_BUTTON_Y ,
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
(GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnNextFilePageCallback );
SetButtonCursor(giFilesPageButtons[ 0 ], CURSOR_LAPTOP_SCREEN);
SetButtonCursor(giFilesPageButtons[ 1 ], CURSOR_LAPTOP_SCREEN);
return;
}
void DeleteButtonsForFilesPage( void )
{
// destroy buttons for the files page
RemoveButton(giFilesPageButtons[ 0 ] );
UnloadButtonImage( giFilesPageButtonsImage[ 0 ] );
RemoveButton(giFilesPageButtons[ 1 ] );
UnloadButtonImage( giFilesPageButtonsImage[ 1 ] );
return;
}
// callbacks
void BtnPreviousFilePageCallback(GUI_BUTTON *btn,INT32 reason)
{
if (!(btn->uiFlags & BUTTON_ENABLED))
return;
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
if( fWaitAFrame == TRUE )
{
return;
}
if(!(btn->uiFlags & BUTTON_CLICKED_ON))
{
btn->uiFlags|=(BUTTON_CLICKED_ON);
}
}
else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
if( fWaitAFrame == TRUE )
{
return;
}
if((btn->uiFlags & BUTTON_CLICKED_ON))
{
if( giFilesPage > 0 )
{
giFilesPage--;
fWaitAFrame = TRUE;
}
fReDrawScreenFlag = TRUE;
btn->uiFlags&=~(BUTTON_CLICKED_ON);
MarkButtonsDirty( );
}
}
return;
}
void BtnNextFilePageCallback(GUI_BUTTON *btn,INT32 reason)
{
if (!(btn->uiFlags & BUTTON_ENABLED))
return;
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
if( fWaitAFrame == TRUE )
{
return;
}
if(!(btn->uiFlags & BUTTON_CLICKED_ON))
{
btn->uiFlags|=(BUTTON_CLICKED_ON);
}
}
else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
if( fWaitAFrame == TRUE )
{
return;
}
if((btn->uiFlags & BUTTON_CLICKED_ON))
{
if( ( fOnLastFilesPageFlag ) == FALSE )
{
fWaitAFrame = TRUE;
giFilesPage++;
}
fReDrawScreenFlag = TRUE;
btn->uiFlags&=~(BUTTON_CLICKED_ON);
MarkButtonsDirty( );
}
}
return;
}
void HandleFileViewerButtonStates( void )
{
// handle state of email viewer buttons
if( iHighLightFileLine == -1 )
{
// not displaying message, leave
DisableButton( giFilesPageButtons[ 0 ] );
DisableButton( giFilesPageButtons[ 1 ] );
ButtonList[ giFilesPageButtons[ 0 ] ]->uiFlags &= ~( BUTTON_CLICKED_ON );
ButtonList[ giFilesPageButtons[ 1 ] ]->uiFlags &= ~( BUTTON_CLICKED_ON );
return;
}
// turn off previous page button
if( giFilesPage == 0 )
{
DisableButton( giFilesPageButtons[ 0 ] );
ButtonList[ giFilesPageButtons[ 0 ] ]->uiFlags &= ~( BUTTON_CLICKED_ON );
}
else
{
EnableButton( giFilesPageButtons[ 0 ] );
}
// turn off next page button
if( fOnLastFilesPageFlag == TRUE )
{
DisableButton( giFilesPageButtons[ 1 ] );
ButtonList[ giFilesPageButtons[ 1 ] ]->uiFlags &= ~( BUTTON_CLICKED_ON );
}
else
{
EnableButton( giFilesPageButtons[ 1 ] );
}
return;
}
FileRecordWidthPtr CreateRecordWidth( INT32 iRecordNumber, INT32 iRecordWidth, INT32 iRecordHeightAdjustment, UINT8 ubFlags)
{
FileRecordWidthPtr pTempRecord = NULL;
// allocs and inits a width info record for the multipage file viewer...this will tell the procedure that does inital computation on which record is the start of the current page
// how wide special records are ( ones that share space with pictures )
pTempRecord = (FileRecordWidthPtr) MemAlloc( sizeof( FileRecordWidth ) );
pTempRecord->Next = NULL;
pTempRecord->iRecordNumber = iRecordNumber;
pTempRecord->iRecordWidth = iRecordWidth;
pTempRecord->iRecordHeightAdjustment = iRecordHeightAdjustment;
pTempRecord->ubFlags = ubFlags;
return ( pTempRecord );
}
FileRecordWidthPtr CreateWidthRecordsForAruloIntelFile( void )
{
// this fucntion will create the width list for the Arulco intelligence file
FileRecordWidthPtr pTempRecord = NULL;
FileRecordWidthPtr pRecordListHead = NULL;
// first record width
// pTempRecord = CreateRecordWidth( 7, 350, 200,0 );
pTempRecord = CreateRecordWidth( FILES_COUNTER_1_WIDTH, 350, MAX_FILE_MESSAGE_PAGE_SIZE,0 );
// set up head of list now
pRecordListHead = pTempRecord;
// next record
// pTempRecord->Next = CreateRecordWidth( 43, 200,0, 0 );
pTempRecord->Next = CreateRecordWidth( FILES_COUNTER_2_WIDTH, 200,0, 0 );
pTempRecord = pTempRecord->Next;
// and the next..
// pTempRecord->Next = CreateRecordWidth( 45, 200,0, 0 );
pTempRecord->Next = CreateRecordWidth( FILES_COUNTER_3_WIDTH, 200,0, 0 );
pTempRecord = pTempRecord->Next;
return( pRecordListHead );
}
FileRecordWidthPtr CreateWidthRecordsForTerroristFile( void )
{
// this fucntion will create the width list for the Arulco intelligence file
FileRecordWidthPtr pTempRecord = NULL;
FileRecordWidthPtr pRecordListHead = NULL;
// first record width
pTempRecord = CreateRecordWidth( 4, 170, 0,0 );
// set up head of list now
pRecordListHead = pTempRecord;
// next record
pTempRecord->Next = CreateRecordWidth( 5, 170,0, 0 );
pTempRecord = pTempRecord->Next;
pTempRecord->Next = CreateRecordWidth( 6, 170,0, 0 );
pTempRecord = pTempRecord->Next;
return( pRecordListHead );
}
void ClearOutWidthRecordsList( FileRecordWidthPtr pFileRecordWidthList )
{
FileRecordWidthPtr pTempRecord = NULL;
FileRecordWidthPtr pDeleteRecord = NULL;
// set up to head of the list
pTempRecord = pDeleteRecord = pFileRecordWidthList;
// error check
if( pFileRecordWidthList == NULL )
{
return;
}
while( pTempRecord->Next )
{
// set up delete record
pDeleteRecord = pTempRecord;
// move to next record
pTempRecord = pTempRecord->Next;
MemFree( pDeleteRecord );
}
// now get the last element
MemFree( pTempRecord );
// null out passed ptr
pFileRecordWidthList = NULL;
return;
}
void OpenFirstUnreadFile( void )
{
// open the first unread file in the list
INT32 iCounter = 0;
FilesUnitPtr pFilesList=pFilesListHead;
// make sure is a valid
while( pFilesList )
{
// if iCounter = iFileId, is a valid file
if( pFilesList->fRead == FALSE )
{
iHighLightFileLine = iCounter;
}
// next element in list
pFilesList = pFilesList->Next;
// increment counter
iCounter++;
}
return;
}
void CheckForUnreadFiles( void )
{
BOOLEAN fStatusOfNewFileFlag = fNewFilesInFileViewer;
// willc heck for any unread files and set flag if any
FilesUnitPtr pFilesList=pFilesListHead;
fNewFilesInFileViewer = FALSE;
while( pFilesList )
{
// unread?...if so, set flag
if( pFilesList->fRead == FALSE )
{
fNewFilesInFileViewer = TRUE;
}
// next element in list
pFilesList = pFilesList->Next;
}
//if the old flag and the new flag arent the same, either create or destory the fast help region
if( fNewFilesInFileViewer != fStatusOfNewFileFlag )
{
CreateFileAndNewEmailIconFastHelpText( LAPTOP_BN_HLP_TXT_YOU_HAVE_NEW_FILE, (BOOLEAN)!fNewFilesInFileViewer );
}
}
BOOLEAN HandleSpecialTerroristFile( INT32 iFileNumber, STR sPictureName )
{
INT32 iCounter = 0;
CHAR16 sString[2048];
FileStringPtr pTempString = NULL ;
FileStringPtr pLocatorString = NULL;
INT32 iYPositionOnPage = 0;
INT32 iFileLineWidth = 0;
INT32 iFileStartX = 0;
UINT32 uiFlags = 0;
UINT32 uiFont = 0;
BOOLEAN fGoingOffCurrentPage = FALSE;
FileRecordWidthPtr WidthList = NULL;
INT32 iOffset = 0;
UINT32 uiPicture;
HVOBJECT hHandle;
VOBJECT_DESC VObjectDesc;
CHAR sTemp[ 128 ];
iOffset = ubFileOffsets[ iFileNumber ] ;
// grab width list
WidthList = CreateWidthRecordsForTerroristFile( );
while( iCounter < ubFileRecordsLength[ iFileNumber ] )
{
LoadEncryptedDataFromFile( "BINARYDATA\\files.EDT", sString, FILE_STRING_SIZE * ( iOffset + iCounter ) * 2, FILE_STRING_SIZE * 2 );
AddStringToFilesList( sString );
iCounter++;
}
pTempString = pFileStringList;
iYPositionOnPage = 0;
iCounter = 0;
pLocatorString = pTempString;
pTempString = GetFirstStringOnThisPage( pFileStringList,FILES_TEXT_FONT, 350, FILE_GAP, giFilesPage, MAX_FILE_MESSAGE_PAGE_SIZE, WidthList);
// find out where this string is
while( pLocatorString != pTempString )
{
iCounter++;
pLocatorString = pLocatorString->Next;
}
// move through list and display
while( pTempString )
{
uiFlags = IAN_WRAP_NO_SHADOW;
// copy over string
wcscpy( sString, pTempString->pString );
if( sString[ 0 ] == 0 )
{
// on last page
fOnLastFilesPageFlag = TRUE;
}
// set up font
uiFont = FILES_TEXT_FONT;
if( giFilesPage == 0 )
{
switch( iCounter )
{
case( 0 ):
uiFont = FILES_TITLE_FONT;
break;
}
}
if( ( iCounter > 3 ) && ( iCounter < 7 ) )
{
iFileLineWidth = 170;
iFileStartX = (UINT16) ( FILE_VIEWER_X + 180 );
}
else
{
// reset width
iFileLineWidth = 350;
iFileStartX = (UINT16) ( FILE_VIEWER_X + 10 );
}
// based on the record we are at, selected X start position and the width to wrap the line, to fit around pictures
if( ( iYPositionOnPage + IanWrappedStringHeight(0, 0, ( UINT16 )iFileLineWidth, FILE_GAP,
uiFont, 0, sString,
0, 0, 0 ) ) < MAX_FILE_MESSAGE_PAGE_SIZE )
{
// now print it
iYPositionOnPage += ( INT32 )IanDisplayWrappedString((UINT16) ( iFileStartX ), ( UINT16 )( FILE_VIEWER_Y + iYPositionOnPage), ( INT16 )iFileLineWidth, FILE_GAP, uiFont, FILE_TEXT_COLOR, sString,0,FALSE, uiFlags );
fGoingOffCurrentPage = FALSE;
}
else
{
// gonna get cut off...end now
fGoingOffCurrentPage = TRUE;
}
pTempString = pTempString->Next;
if( ( pTempString == NULL ) && ( fGoingOffCurrentPage == FALSE ) )
{
// on last page
fOnLastFilesPageFlag = TRUE;
}
else
{
fOnLastFilesPageFlag = FALSE;
}
// going over the edge, stop now
if( fGoingOffCurrentPage == TRUE )
{
pTempString = NULL;
}
// show picture
if( ( giFilesPage == 0 ) && ( iCounter == 5 ) )
{
if (gGameExternalOptions.fReadProfileDataFromXML)
{
// HEADROCK PROFEX: Do not read direct profile number, instead, look inside the profile for a ubFaceIndex value.
sprintf( sTemp, "%s%02d.sti", "FACES\\BIGFACES\\", gMercProfiles[usProfileIdsForTerroristFiles[iFileNumber + 1]].ubFaceIndex );
}
else
{
sprintf( sTemp, "%s%02d.sti", "FACES\\BIGFACES\\", usProfileIdsForTerroristFiles[iFileNumber + 1] );
}
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP(sTemp, VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &uiPicture));
//Blt face to screen to
GetVideoObject(&hHandle, uiPicture);
//def: 3/24/99
// BltVideoObject(FRAME_BUFFER, hHandle, 0,( INT16 ) ( FILE_VIEWER_X + 30 ), ( INT16 ) ( iYPositionOnPage + 5), VO_BLT_SRCTRANSPARENCY,NULL);
BltVideoObject(FRAME_BUFFER, hHandle, 0,( INT16 ) ( FILE_VIEWER_X + 30 ), ( INT16 ) ( iScreenHeightOffset + iYPositionOnPage + 21), VO_BLT_SRCTRANSPARENCY,NULL);
DeleteVideoObjectFromIndex( uiPicture );
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("LAPTOP\\InterceptBorder.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &uiPicture));
//Blt face to screen to
GetVideoObject(&hHandle, uiPicture);
BltVideoObject(FRAME_BUFFER, hHandle, 0,( INT16 ) ( FILE_VIEWER_X + 25 ), ( INT16 ) ( iScreenHeightOffset + iYPositionOnPage + 16 ), VO_BLT_SRCTRANSPARENCY,NULL);
DeleteVideoObjectFromIndex( uiPicture );
}
iCounter++;
}
ClearOutWidthRecordsList( WidthList );
ClearFileStringList( );
return( TRUE );
}
// add a file about this terrorist
BOOLEAN AddFileAboutTerrorist( INT32 iProfileId )
{
INT32 iCounter = 0;
for( iCounter = 1; iCounter < 7; iCounter++ )
{
if( usProfileIdsForTerroristFiles[ iCounter ] == iProfileId )
{
// checked, and this file is there
AddFilesToPlayersLog( ( UINT8 )iCounter, 0, 3, NULL, NULL );
return( TRUE );
}
}
return( FALSE );
}