Files
source/Laptop/files.cpp
T
Overhaul 7a27e7105d New attack busy system
Added missing #includes

Added LUA scripting and console

Changed the way tracers are visualized, so they work more like real tracers instead of a light fountain

Fixed signedness of many grid variables used in GetMouseMapPos calls

Fixed enemy weapon choosing:  Sometimes a mortar is chosen but later rejected, but the grenade class was not reset.  Caused assertion failure

Added checks so enemies don't try to chuck RPG grenades with their hands

Now possible to shoot a someone in the head if he's in water

Fixed InitSightArrays to also clear soldier interrupt duel points.  This was causing an assertion failure elsewhere in the code because the interrupt list still had soldiers on it sometimes when this function was called.

Soldiers are much less willing to forfeit their turn over an attempt to use more APs than they have

Removed early setting of muzzle flash.  This would allow enemies to get an interrupt before you even fired.

Fixed item dropping by AI.  If AI tried to drop something while standing it would cause deadlock

Change to greatly speed up closing the sector inventory window in an unloaded sector

Added conditional compile flag to always give robot weapon ready advantage, even for 360 degree sighting


Check builddefines.h for the conditional flags.  Of greatest interest might be LUA_CONSOLE.  This will cause the game to bring up a command console when run.  However this console is severely lacking in many areas.  If anybody knows of an open-source terminal/console that could be used instead, it would be appreciated.  The existing console does bad things when you try to close it, and since it counts as a separate app, it pauses the game while it has focus.

LUA scripting is very limited, basically just proof of concept.  There is one global variable, the Soldiers array.  An array index gives you the soldier in that slot in the currently loaded sector.  The soldier has a few things that can be accessed:  name (short name); fullname (long name); grid (current grid #, can be changed); walkto(grid) (function to walk to another grid); runto(grid) (function to run to another grid)


git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@924 3b4a5df2-a311-0410-b5c6-a8a6f20db521
2007-06-09 09:01:04 +00:00

1836 lines
45 KiB
C++

#ifdef PRECOMPILEDHEADERS
#include "Laptop All.h"
#else
#include "builddefines.h"
#include <stdio.h>
#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;
INT32 iCounter=0;
// 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;
INT32 iBytesWritten=0;
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
INT32 iCounter=7;
// 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 <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;
INT16 sTextWidth = 0;
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 iTotalYPosition = 0;
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 );
}
// 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 iTotalYPosition = 0;
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 );
}