#ifdef PRECOMPILEDHEADERS #include "Laptop All.h" #else #include "builddefines.h" #include #include "laptop.h" #include "files.h" #include "Game clock.h" #include "Utilities.h" #include "WCheck.h" #include "Debug.h" #include "WordWrap.h" #include "Render Dirty.h" #include "Encrypted File.h" #include "cursors.h" #include "email.h" #include "text.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 #define LENGTH_OF_ENRICO_FILE 68 #define MAX_FILE_MESSAGE_PAGE_SIZE 325 #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 // 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 ); // 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 ); 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 ) ) { FileClearAttributes( FILES_DAT_FILE ); FileDelete( FILES_DAT_FILE ); } ClearFilesList( ); // add background check by RIS AddFilesToPlayersLog( ENRICO_BACKGROUND, 0,255, 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( ); // 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( ); } 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); } mprintf(FILES_SENDER_TEXT_X, iScreenHeightOffset + (( iCounter + 9 ) * BLOCK_HEIGHT) + ( iCounter * 2 ) - 2 ,pFilesSenderList[pFilesList->ubCode]); 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 Next; // increment counter iCounter++; } fReDrawScreenFlag=TRUE; return; } } BOOLEAN DisplayFormattedText( void ) { FilesUnitPtr pFilesList=pFilesListHead; UINT16 usFirstWidth = 0; UINT16 usFirstHeight = 0; UINT16 usSecondWidth; UINT16 usSecondHeight; INT32 iCounter=0; INT32 iLength=0; INT32 iHeight=0; INT32 iOffSet=0; INT32 iMessageCode; 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 while(iCounter < iHighLightFileLine) { iCounter++; pFilesList=pFilesList->Next; } // message code found, reset counter iMessageCode = pFilesList->ubCode; iCounter=0; // 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 while( iCounter < iMessageCode) { // increment increment offset iOffSet+=ubFileRecordsLength[iCounter]; // increment counter iCounter++; } iLength = ubFileRecordsLength[pFilesList->ubCode]; if( pFilesList->ubFormat < ENRICO_BACKGROUND ) { LoadEncryptedDataFromFile("BINARYDATA\\Files.edt", sString, FILE_STRING_SIZE * (iOffSet) * 2, FILE_STRING_SIZE * iLength * 2); } // reset counter iCounter=0; // no shadow SetFontShadow(NO_SHADOW); switch( pFilesList->ubFormat ) { case 0: // no format, all text while(iLength > iCounter) { // read one record from file manager file LoadEncryptedDataFromFile( "BINARYDATA\\Files.edt", sString, FILE_STRING_SIZE * ( iOffSet + iCounter ) * 2, FILE_STRING_SIZE * 2 ); // display string and get height iHeight += IanDisplayWrappedString(FILE_VIEWER_X + 4, ( UINT16 )( FILE_VIEWER_Y + iHeight ), FILE_VIEWER_WIDTH, FILE_GAP, FILES_TEXT_FONT, FILE_TEXT_COLOR, sString,0,FALSE,0); // increment file record counter iCounter++; } 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); iHeight = usFirstHeight + 20; while(iLength > iCounter) { // read one record from file manager file LoadEncryptedDataFromFile( "BINARYDATA\\Files.edt", sString, FILE_STRING_SIZE * ( iOffSet + iCounter ) * 2, FILE_STRING_SIZE * 2 ); // display string and get height iHeight += IanDisplayWrappedString(FILE_VIEWER_X + 4, ( UINT16 )( FILE_VIEWER_Y + iHeight ), FILE_VIEWER_WIDTH, FILE_GAP, FILES_TEXT_FONT, FILE_TEXT_COLOR, sString,0,FALSE,0); // increment file record counter iCounter++; } // 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 iHeight = usFirstHeight + 20; while(iLength > iCounter) { // read one record from file manager file LoadEncryptedDataFromFile( "BINARYDATA\\Files.edt", sString, FILE_STRING_SIZE * ( iOffSet + iCounter ) * 2, FILE_STRING_SIZE * 2 ); // display string and get height iHeight += IanDisplayWrappedString(FILE_VIEWER_X + 4, ( UINT16 )( FILE_VIEWER_Y + iHeight ), FILE_VIEWER_WIDTH, FILE_GAP, FILES_TEXT_FONT, FILE_TEXT_COLOR, sString,0,FALSE,0); // increment file record counter iCounter++; } break; case 3: // picture on the left, with text on right and below // load first graphic HandleSpecialTerroristFile( pFilesList->ubCode, pFilesList->pPicFileNameList[ 0 ] ); break; default: HandleSpecialFiles( pFilesList->ubFormat ); break; } HandleFileViewerButtonStates( ); SetFontShadow(DEFAULT_SHADOW); 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 ) { LoadEncryptedDataFromFile( "BINARYDATA\\RIS.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; } } // 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; FilenameForBPP("LAPTOP\\ArucoFilesMap.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 + 300, iScreenHeightOffset + 270, VO_BLT_SRCTRANSPARENCY,NULL); DeleteVideoObjectFromIndex( uiPicture ); } 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 ); } 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 ); } 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( usProfileIdsForTerroristFiles[ iFileNumber + 1 ] < 100 ) { sprintf(sTemp, "%s%02d.sti", "FACES\\BIGFACES\\", usProfileIdsForTerroristFiles[ iFileNumber + 1 ]); } else { sprintf(sTemp, "%s%03d.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 ); }