Files
source/Laptop/finances.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

2716 lines
71 KiB
C++

#ifdef PRECOMPILEDHEADERS
#include "Laptop All.h"
#else
#include "laptop.h"
#include "finances.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 "Soldier Profile.h"
#include "Text.h"
#include "Strategic Mines.h"
#include "LaptopSave.h"
#include "Campaign Types.h"
#include "strategicmap.h"
#endif
// the global defines
// graphical positions
#define TOP_X LAPTOP_SCREEN_UL_X
#define TOP_Y LAPTOP_SCREEN_UL_Y
#define BLOCK_HEIGHT 10
#define TOP_DIVLINE_Y iScreenHeightOffset + 102
#define DIVLINE_X iScreenWidthOffset + 130
#define MID_DIVLINE_Y iScreenHeightOffset + 205
#define BOT_DIVLINE_Y iScreenHeightOffset + 180
#define MID_DIVLINE_Y2 iScreenHeightOffset + 263 + 20
#define BOT_DIVLINE_Y2 MID_DIVLINE_Y2 + MID_DIVLINE_Y - BOT_DIVLINE_Y
#define TITLE_X iScreenWidthOffset + 140
#define TITLE_Y iScreenHeightOffset + 33
#define TEXT_X iScreenWidthOffset + 140
#define PAGE_SIZE 17
// yesterdyas/todays income and balance text positions
#define YESTERDAYS_INCOME iScreenHeightOffset + 114
#define YESTERDAYS_OTHER iScreenHeightOffset + 138
#define YESTERDAYS_DEBITS iScreenHeightOffset + 162
#define YESTERDAYS_BALANCE iScreenHeightOffset + 188
#define TODAYS_INCOME iScreenHeightOffset + 215
#define TODAYS_OTHER iScreenHeightOffset + 239
#define TODAYS_DEBITS iScreenHeightOffset + 263
#define TODAYS_CURRENT_BALANCE iScreenHeightOffset + 263 + 28
#define TODAYS_CURRENT_FORCAST_INCOME iScreenHeightOffset + 330
#define TODAYS_CURRENT_FORCAST_BALANCE iScreenHeightOffset + 354
//#define SUMMARY_NUMBERS_X
#define FINANCE_HEADER_FONT FONT14ARIAL
#define FINANCE_TEXT_FONT FONT12ARIAL
#define NUM_RECORDS_PER_PAGE PAGE_SIZE
// records text positions
#define RECORD_CREDIT_WIDTH 106-47
#define RECORD_DEBIT_WIDTH RECORD_CREDIT_WIDTH
#define RECORD_DATE_X TOP_X+10
#define RECORD_TRANSACTION_X RECORD_DATE_X+RECORD_DATE_WIDTH
#define RECORD_TRANSACTION_WIDTH 500-280
#define RECORD_DEBIT_X RECORD_TRANSACTION_X+RECORD_TRANSACTION_WIDTH
#define RECORD_CREDIT_X RECORD_DEBIT_X+RECORD_DEBIT_WIDTH
#define RECORD_Y iScreenHeightOffset + 107-10
#define RECORD_DATE_WIDTH 47
#define RECORD_BALANCE_X RECORD_DATE_X+385
#define RECORD_BALANCE_WIDTH 479-385
#define RECORD_HEADER_Y iScreenHeightOffset + 90
#define PAGE_NUMBER_X TOP_X+297
#define PAGE_NUMBER_Y TOP_Y+33
// BUTTON defines
enum{
PREV_PAGE_BUTTON=0,
NEXT_PAGE_BUTTON,
FIRST_PAGE_BUTTON,
LAST_PAGE_BUTTON,
};
// button positions
#define FIRST_PAGE_X iScreenWidthOffset + 505
#define NEXT_BTN_X iScreenWidthOffset + 553//577
#define PREV_BTN_X iScreenWidthOffset + 529//553
#define LAST_PAGE_X iScreenWidthOffset + 577
#define BTN_Y iScreenHeightOffset + 53
// sizeof one record
#define RECORD_SIZE ( sizeof( UINT32 ) + sizeof( INT32 ) + sizeof( INT32 ) + sizeof( UINT8 ) + sizeof( UINT8 ) )
// the financial record list
FinanceUnitPtr pFinanceListHead=NULL;
// current players balance
//INT32 iCurrentBalance=0;
// current page displayed
INT32 iCurrentPage=0;
// current financial record (the one at the top of the current page)
FinanceUnitPtr pCurrentFinance=NULL;
// video object id's
UINT32 guiTITLE;
UINT32 guiGREYFRAME;
UINT32 guiTOP;
UINT32 guiMIDDLE;
UINT32 guiBOTTOM;
UINT32 guiLINE;
UINT32 guiLONGLINE;
UINT32 guiLISTCOLUMNS;
// are in the financial system right now?
BOOLEAN fInFinancialMode=FALSE;
extern BOOLEAN fMapScreenBottomDirty;
// the last page loaded
UINT32 guiLastPageLoaded = 0;
// the last page altogether
UINT32 guiLastPageInRecordsList = 0;
// finance screen buttons
INT32 giFinanceButton[4];
INT32 giFinanceButtonImage[4];
// internal functions
UINT32 ProcessAndEnterAFinacialRecord( UINT8 ubCode, UINT32 uiDate, INT32 iAmount, UINT8 ubSecondCode, INT32 iBalanceToDate);
void RenderBackGround( void );
BOOLEAN LoadFinances();
void DrawSummary( void );
void DrawSummaryLines( void );
void DrawFinanceTitleText( void );
void InvalidateLapTopScreen( void );
void RemoveFinances( void );
void DrawSummaryText( void );
INT32 GetCurrentBalance( void );
void ClearFinanceList( void );
void OpenAndReadFinancesFile( void );
void DrawAPageOfRecords( void );
void DrawRecordsBackGround( void );
void DrawRecordsText( void );
void DrawRecordsColumnHeadersText( void );
void BtnFinanceDisplayNextPageCallBack(GUI_BUTTON *btn,INT32 reason);
void BtnFinanceFirstLastPageCallBack(GUI_BUTTON *btn,INT32 reason);
void BtnFinanceDisplayPrevPageCallBack(GUI_BUTTON *btn,INT32 reason);
void CreateFinanceButtons( void );
void DestroyFinanceButtons( void );
void IncrementCurrentPageFinancialDisplay( void );
void ProcessTransactionString(STR16 pString, FinanceUnitPtr pFinance);
void DisplayFinancePageNumberAndDateRange( void );
void GetBalanceFromDisk( void );
BOOLEAN WriteBalanceToDisk( void );
BOOLEAN AppendFinanceToEndOfFile( FinanceUnitPtr pFinance );
UINT32 ReadInLastElementOfFinanceListAndReturnIdNumber( void );
void SetLastPageInRecords( void );
BOOLEAN LoadInRecords( UINT32 uiPage );
BOOLEAN LoadPreviousPage( void );
BOOLEAN LoadNextPage( void );
INT32 GetPreviousBalanceToDate( void );
INT32 GetPreviousDaysIncome( void );
INT32 GetPreviousDaysBalance( void );
void SetFinanceButtonStates( void );
INT32 GetTodaysBalance( void );
INT32 GetTodaysDebits( void );
INT32 GetYesterdaysOtherDeposits( void );
INT32 GetTodaysOtherDeposits( void );
INT32 GetYesterdaysDebits( void );
UINT32 AddTransactionToPlayersBook (UINT8 ubCode, UINT8 ubSecondCode, UINT32 uiDate, INT32 iAmount)
{
// adds transaction to player's book(Financial List), returns unique id number of it
// outside of the financial system(the code in this .c file), this is the only function you'll ever need
INT32 iCurPage = iCurrentPage;
UINT32 uiId=0;
FinanceUnitPtr pFinance=pFinanceListHead;
// read in balance from file
GetBalanceFromDisk( );
// process the actual data
//
// If this transaction is for the hiring/extending of a mercs contract
//
if( ubCode == HIRED_MERC ||
ubCode == IMP_PROFILE ||
ubCode == PAYMENT_TO_NPC ||
ubCode == EXTENDED_CONTRACT_BY_1_DAY ||
ubCode == EXTENDED_CONTRACT_BY_1_WEEK ||
ubCode == EXTENDED_CONTRACT_BY_2_WEEKS
)
{
gMercProfiles[ ubSecondCode ].uiTotalCostToDate += -iAmount;
}
// clear list
ClearFinanceList( );
pFinance=pFinanceListHead;
// update balance
LaptopSaveInfo.iCurrentBalance += iAmount;
uiId = ProcessAndEnterAFinacialRecord(ubCode, uiDate, iAmount, ubSecondCode, LaptopSaveInfo.iCurrentBalance);
// write balance to disk
WriteBalanceToDisk( );
// append to end of file
AppendFinanceToEndOfFile( pFinance );
// set number of pages
SetLastPageInRecords( );
if( !fInFinancialMode )
{
ClearFinanceList( );
}
else
{
SetFinanceButtonStates( );
// force update
fPausedReDrawScreenFlag = TRUE;
}
fMapScreenBottomDirty = TRUE;
// return unique id of this transaction
return uiId;
}
FinanceUnitPtr GetFinance(UINT32 uiId)
{
FinanceUnitPtr pFinance=pFinanceListHead;
// get a finance object and return a pointer to it, the obtaining of the
// finance object is via a unique ID the programmer must store
// , it is returned on addition of a financial transaction
// error check
if(!pFinance)
return ( NULL );
// look for finance object with Id
while(pFinance)
{
if(pFinance->uiIdNumber == uiId)
break;
// next finance record
pFinance = pFinance->Next;
}
return (pFinance);
}
UINT32 GetTotalDebits()
{
// returns the total of the debits
UINT32 uiDebits=0;
FinanceUnitPtr pFinance=pFinanceListHead;
// run to end of list
while(pFinance)
{
// if a debit, add to debit total
if(pFinance->iAmount > 0)
uiDebits+=( (UINT32) (pFinance->iAmount));
// next finance record
pFinance=pFinance->Next;
}
return uiDebits;
}
UINT32 GetTotalCredits()
{
// returns the total of the credits
UINT32 uiCredits = 0;
FinanceUnitPtr pFinance=pFinanceListHead;
// run to end of list
while( pFinance )
{
// if a credit, add to credit total
if( pFinance->iAmount < 0 )
uiCredits += ( (UINT32) ( pFinance->iAmount ));
// next finance record
pFinance = pFinance->Next;
}
return uiCredits;
}
UINT32 GetDayCredits(UINT32 usDayNumber)
{
// returns the total of the credits for day( note resolution of usDayNumber is days)
UINT32 uiCredits = 0;
FinanceUnitPtr pFinance = pFinanceListHead;
while( pFinance )
{
// if a credit and it occurs on day passed
if(( pFinance->iAmount < 0)&&( (pFinance->uiDate / (60*24)) ==usDayNumber ))
uiCredits+=((UINT32)(pFinance->iAmount));
// next finance record
pFinance=pFinance->Next;
}
return uiCredits;
}
UINT32 GetDayDebits(UINT32 usDayNumber)
{
// returns the total of the debits
UINT32 uiDebits=0;
FinanceUnitPtr pFinance=pFinanceListHead;
while(pFinance)
{
if(( pFinance->iAmount > 0 )&&( (pFinance->uiDate / (60*24) ) ==usDayNumber ) )
uiDebits += ( (UINT32) (pFinance->iAmount));
// next finance record
pFinance=pFinance->Next;
}
return uiDebits;
}
INT32 GetTotalToDay( INT32 sTimeInMins )
{
// gets the total amount to this day
UINT32 uiTotal = 0;
FinanceUnitPtr pFinance = pFinanceListHead;
while(pFinance)
{
if(((INT32)( pFinance->uiDate / (60*24)) <= sTimeInMins/(24*60) ))
uiTotal += ((UINT32)(pFinance->iAmount));
// next finance record
pFinance=pFinance->Next;
}
return uiTotal;
}
INT32 GetYesterdaysIncome( void )
{
// get income for yesterday
return ( GetDayDebits(( ( GetWorldTotalMin() - (24*60) ) / (24*60) )) + GetDayCredits(( (UINT32) ( GetWorldTotalMin() -(24*60) )/ (24*60) )));
}
INT32 GetCurrentBalance( void )
{
// get balance to this minute
return ( LaptopSaveInfo.iCurrentBalance );
// return(GetTotalDebits((GetWorldTotalMin()))+GetTotalCredits((GetWorldTotalMin())));
}
INT32 GetTodaysIncome( void )
{
// get income
return ( GetCurrentBalance() - GetTotalToDay( GetWorldTotalMin() - ( 24*60 ) ));
}
INT32 GetProjectedTotalDailyIncome( void )
{
// return total projected income, including what is earned today already
// CJC: I DON'T THINK SO!
// The point is: PredictIncomeFromPlayerMines isn't dependant on the time of day
// (anymore) and this would report income of 0 at midnight!
/*
if (GetWorldMinutesInDay() <= 0)
{
return ( 0 );
}
*/
// look at we earned today
// then there is how many deposits have been made, now look at how many mines we have, thier rate, amount of ore left and predict if we still
// had these mines how much more would we get?
return( PredictIncomeFromPlayerMines() );
}
INT32 GetProjectedBalance( void )
{
// return the projected balance for tommorow - total for today plus the total income, projected.
return( GetProjectedTotalDailyIncome( ) + GetCurrentBalance( ) );
}
INT32 GetConfidenceValue()
{
// return confidence that the projected income is infact correct
return(( ( GetWorldMinutesInDay()*100 ) / (60*24) ));
}
void GameInitFinances()
{
// initialize finances on game start up
// unlink Finances data file
if( (FileExists( FINANCES_DATA_FILE ) ) )
{
FileClearAttributes( FINANCES_DATA_FILE );
FileDelete( FINANCES_DATA_FILE );
}
GetBalanceFromDisk( );
}
void EnterFinances()
{
//entry into finanacial system, load graphics, set variables..draw screen once
// set the fact we are in the financial display system
fInFinancialMode=TRUE;
// build finances list
//OpenAndReadFinancesFile( );
// reset page we are on
iCurrentPage = LaptopSaveInfo.iCurrentFinancesPage;
// get the balance
GetBalanceFromDisk( );
// clear the list
ClearFinanceList( );
// force redraw of the entire screen
fReDrawScreenFlag=TRUE;
// set number of pages
SetLastPageInRecords( );
// load graphics into memory
LoadFinances( );
// create buttons
CreateFinanceButtons( );
// set button state
SetFinanceButtonStates( );
// draw finance
RenderFinances( );
// DrawSummary( );
// draw page number
DisplayFinancePageNumberAndDateRange( );
//InvalidateRegion(0,0,640,480);
return;
}
void ExitFinances( void )
{
LaptopSaveInfo.iCurrentFinancesPage = iCurrentPage;
// not in finance system anymore
fInFinancialMode=FALSE;
// destroy buttons
DestroyFinanceButtons( );
// clear out list
ClearFinanceList( );
// remove graphics
RemoveFinances( );
return;
}
void HandleFinances( void )
{
}
void RenderFinances( void )
{
HVOBJECT hHandle;
// draw background
RenderBackGround();
// if we are on the first page, draw the summary
if(iCurrentPage==0)
DrawSummary( );
else
DrawAPageOfRecords( );
//title
DrawFinanceTitleText( );
// draw pages and dates
DisplayFinancePageNumberAndDateRange( );
// display border
GetVideoObject(&hHandle, guiLaptopBACKGROUND);
BltVideoObject(FRAME_BUFFER, hHandle, 0,iScreenWidthOffset + 108, iScreenHeightOffset + 23, VO_BLT_SRCTRANSPARENCY,NULL);
// title bar icon
BlitTitleBarIcons( );
return;
}
BOOLEAN LoadFinances( void )
{
VOBJECT_DESC VObjectDesc;
// load Finance 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\\Financeswindow.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiTOP));
// black divider line - long ( 480 length)
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("LAPTOP\\divisionline480.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiLONGLINE));
// the records columns
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("LAPTOP\\recordcolumns.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiLISTCOLUMNS));
// black divider line - long ( 480 length)
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("LAPTOP\\divisionline.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiLINE));
return (TRUE);
}
void RemoveFinances( void )
{
// delete Finance video objects from memory
DeleteVideoObjectFromIndex(guiLONGLINE);
DeleteVideoObjectFromIndex(guiLINE);
DeleteVideoObjectFromIndex(guiLISTCOLUMNS);
DeleteVideoObjectFromIndex(guiTOP);
DeleteVideoObjectFromIndex(guiTITLE);
return;
}
void RenderBackGround( void )
{
// render generic background for Finance system
HVOBJECT hHandle;
INT32 iCounter=0;
// get title bar object
GetVideoObject(&hHandle, guiTITLE);
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);
DrawFinanceTitleText( );
return;
}
void DrawSummary( void )
{
// draw day's summary to screen
DrawSummaryLines( );
DrawSummaryText( );
DrawFinanceTitleText( );
return;
}
void DrawSummaryLines( void )
{
// draw divider lines on screen
HVOBJECT hHandle;
// the summary LINE object handle
GetVideoObject(&hHandle, guiLINE);
// blit summary LINE object to screen
BltVideoObject(FRAME_BUFFER, hHandle, 0,DIVLINE_X, TOP_DIVLINE_Y, VO_BLT_SRCTRANSPARENCY,NULL);
BltVideoObject(FRAME_BUFFER, hHandle, 0,DIVLINE_X, TOP_DIVLINE_Y+2, VO_BLT_SRCTRANSPARENCY,NULL);
//BltVideoObject(FRAME_BUFFER, hHandle, 0,DIVLINE_X, MID_DIVLINE_Y, VO_BLT_SRCTRANSPARENCY,NULL);
BltVideoObject(FRAME_BUFFER, hHandle, 0,DIVLINE_X, BOT_DIVLINE_Y, VO_BLT_SRCTRANSPARENCY,NULL);
BltVideoObject(FRAME_BUFFER, hHandle, 0,DIVLINE_X, MID_DIVLINE_Y2, VO_BLT_SRCTRANSPARENCY,NULL);
//BltVideoObject(FRAME_BUFFER, hHandle, 0,DIVLINE_X, BOT_DIVLINE_Y2, VO_BLT_SRCTRANSPARENCY,NULL);
return;
}
void DrawAPageOfRecords( void )
{
// this procedure will draw a series of financial records to the screen
INT32 iCurPage=1;
INT32 iCount=0;
pCurrentFinance=pFinanceListHead;
// (re-)render background
DrawRecordsBackGround( );
// error check
if(iCurrentPage==-1)
return;
// current page is found, render from here
DrawRecordsText( );
DisplayFinancePageNumberAndDateRange( );
return;
}
void DrawRecordsBackGround( void )
{
// proceudre will draw the background for the list of financial records
INT32 iCounter=6;
HVOBJECT hHandle;
// render the generic background
RenderBackGround( );
// now the columns
for(iCounter; iCounter <35; iCounter++)
{
// get and blt middle background to screen
GetVideoObject(&hHandle, guiLISTCOLUMNS);
BltVideoObject(FRAME_BUFFER, hHandle, 0, TOP_X + 10, TOP_Y + 18 + ( iCounter * BLOCK_HEIGHT ) + 1, VO_BLT_SRCTRANSPARENCY,NULL);
}
// the divisorLines
GetVideoObject(&hHandle, guiLONGLINE);
BltVideoObject(FRAME_BUFFER, hHandle, 0,TOP_X + 10, TOP_Y + 17 + ( 6 * ( BLOCK_HEIGHT ) ), VO_BLT_SRCTRANSPARENCY,NULL);
GetVideoObject(&hHandle, guiLONGLINE);
BltVideoObject(FRAME_BUFFER, hHandle, 0,TOP_X + 10, TOP_Y + 19 + ( 6 * ( BLOCK_HEIGHT ) ) , VO_BLT_SRCTRANSPARENCY,NULL);
GetVideoObject(&hHandle, guiLONGLINE);
BltVideoObject(FRAME_BUFFER, hHandle, 0,TOP_X + 10, TOP_Y + 19 + ( ( iCounter ) * ( BLOCK_HEIGHT ) ) , VO_BLT_SRCTRANSPARENCY,NULL);
// the header text
DrawRecordsColumnHeadersText( );
return;
}
void DrawRecordsColumnHeadersText( void )
{
// write the headers text for each column
INT16 usX, usY;
// font stuff
SetFont(FINANCE_TEXT_FONT);
SetFontForeground(FONT_BLACK);
SetFontBackground(FONT_BLACK);
SetFontShadow(NO_SHADOW);
// the date header
FindFontCenterCoordinates(RECORD_DATE_X,0,RECORD_DATE_WIDTH,0, pFinanceHeaders[0], FINANCE_TEXT_FONT,&usX, &usY);
mprintf(usX, RECORD_HEADER_Y, pFinanceHeaders[0]);
// debit header
FindFontCenterCoordinates(RECORD_DEBIT_X,0,RECORD_DEBIT_WIDTH,0, pFinanceHeaders[1], FINANCE_TEXT_FONT,&usX, &usY);
mprintf(usX, RECORD_HEADER_Y, pFinanceHeaders[1]);
// credit header
FindFontCenterCoordinates(RECORD_CREDIT_X,0,RECORD_CREDIT_WIDTH,0, pFinanceHeaders[2], FINANCE_TEXT_FONT,&usX, &usY);
mprintf(usX, RECORD_HEADER_Y, pFinanceHeaders[2]);
// balance header
FindFontCenterCoordinates(RECORD_BALANCE_X,0,RECORD_BALANCE_WIDTH,0, pFinanceHeaders[4], FINANCE_TEXT_FONT,&usX, &usY);
mprintf(usX, RECORD_HEADER_Y, pFinanceHeaders[4]);
// transaction header
FindFontCenterCoordinates(RECORD_TRANSACTION_X,0,RECORD_TRANSACTION_WIDTH,0, pFinanceHeaders[3], FINANCE_TEXT_FONT,&usX, &usY);
mprintf(usX, RECORD_HEADER_Y, pFinanceHeaders[3]);
SetFontShadow(DEFAULT_SHADOW);
return;
}
void DrawRecordsText( void )
{
// draws the text of the records
FinanceUnitPtr pCurFinance=pCurrentFinance;
FinanceUnitPtr pTempFinance=pFinanceListHead;
CHAR16 sString[512];
INT32 iCounter=0;
INT16 usX, usY;
INT32 iBalance=0;
// setup the font stuff
SetFont(FINANCE_TEXT_FONT);
SetFontForeground(FONT_BLACK);
SetFontBackground(FONT_BLACK);
SetFontShadow(NO_SHADOW);
// anything to print
if( pCurrentFinance == NULL )
{
// nothing to print
return;
}
// get balance to this point
while( pTempFinance !=pCurFinance)
{
// increment balance by amount of transaction
iBalance += pTempFinance->iAmount;
// next element
pTempFinance = pTempFinance->Next;
}
// loop through record list
for(iCounter; iCounter <NUM_RECORDS_PER_PAGE; iCounter++)
{
// get and write the date
swprintf(sString, L"%d", pCurFinance->uiDate / ( 24*60 ) );
FindFontCenterCoordinates(RECORD_DATE_X,0,RECORD_DATE_WIDTH,0, sString, FINANCE_TEXT_FONT,&usX, &usY);
mprintf(usX, 12+RECORD_Y + ( iCounter * ( GetFontHeight( FINANCE_TEXT_FONT ) + 6 ) ), sString);
// get and write debit/ credit
if(pCurFinance->iAmount >=0)
{
// increase in asset - debit
swprintf(sString, L"%d", pCurFinance->iAmount);
// insert commas
InsertCommasForDollarFigure( sString );
// insert dollar sight for first record in the list
//DEF: 3/19/99: removed cause we want to see the dollar sign on ALL entries
// if( iCounter == 0 )
{
InsertDollarSignInToString( sString );
}
FindFontCenterCoordinates(RECORD_DEBIT_X,0,RECORD_DEBIT_WIDTH,0, sString, FINANCE_TEXT_FONT,&usX, &usY);
mprintf(usX, 12+RECORD_Y + (iCounter * ( GetFontHeight( FINANCE_TEXT_FONT ) + 6 ) ), sString);
}
else
{
// decrease in asset - credit
swprintf(sString, L"%d", pCurFinance->iAmount * (-1));
SetFontForeground(FONT_RED);
InsertCommasForDollarFigure( sString );
// insert dollar sight for first record in the list
//DEF: 3/19/99: removed cause we want to see the dollar sign on ALL entries
// if( iCounter == 0 )
{
InsertDollarSignInToString( sString );
}
FindFontCenterCoordinates(RECORD_CREDIT_X ,0 , RECORD_CREDIT_WIDTH,0, sString, FINANCE_TEXT_FONT,&usX, &usY);
mprintf(usX, 12+RECORD_Y + (iCounter * ( GetFontHeight( FINANCE_TEXT_FONT ) + 6 ) ), sString);
SetFontForeground(FONT_BLACK);
}
// the balance to this point
iBalance = pCurFinance->iBalanceToDate;
// set font based on balance
if(iBalance >=0)
{
SetFontForeground(FONT_BLACK);
}
else
{
SetFontForeground(FONT_RED);
iBalance = ( iBalance ) * ( -1 );
}
// transaction string
ProcessTransactionString(sString, pCurFinance);
FindFontCenterCoordinates(RECORD_TRANSACTION_X,0,RECORD_TRANSACTION_WIDTH,0, sString, FINANCE_TEXT_FONT,&usX, &usY);
mprintf(usX, 12+RECORD_Y + (iCounter * ( GetFontHeight( FINANCE_TEXT_FONT ) + 6 ) ), sString);
// print the balance string
swprintf(sString, L"%d", iBalance);
InsertCommasForDollarFigure( sString );
// insert dollar sight for first record in the list
//DEF: 3/19/99: removed cause we want to see the dollar sign on ALL entries
// if( iCounter == 0 )
{
InsertDollarSignInToString( sString );
}
FindFontCenterCoordinates(RECORD_BALANCE_X,0,RECORD_BALANCE_WIDTH,0, sString, FINANCE_TEXT_FONT,&usX, &usY);
mprintf(usX, 12+RECORD_Y + (iCounter * ( GetFontHeight( FINANCE_TEXT_FONT ) + 6 ) ), sString);
// restore font color
SetFontForeground(FONT_BLACK);
// next finance
pCurFinance = pCurFinance->Next;
// last page, no finances left, return
if( ! pCurFinance )
{
// restore shadow
SetFontShadow(DEFAULT_SHADOW);
return;
}
}
// restore shadow
SetFontShadow(DEFAULT_SHADOW);
return;
}
void DrawFinanceTitleText( void )
{
// setup the font stuff
SetFont(FINANCE_HEADER_FONT);
SetFontForeground(FONT_WHITE);
SetFontBackground(FONT_BLACK);
// reset shadow
SetFontShadow(DEFAULT_SHADOW);
// draw the pages title
mprintf(TITLE_X,TITLE_Y,pFinanceTitle[0]);
return;
}
void InvalidateLapTopScreen( void )
{
// invalidates blit region to force refresh of screen
InvalidateRegion(LAPTOP_SCREEN_UL_X,LAPTOP_SCREEN_UL_Y,LAPTOP_SCREEN_LR_X,LAPTOP_SCREEN_LR_Y);
return;
}
void DrawSummaryText( void )
{
INT16 usX, usY;
CHAR16 pString[100];
INT32 iBalance = 0;
// setup the font stuff
SetFont(FINANCE_TEXT_FONT);
SetFontForeground(FONT_BLACK);
SetFontBackground(FONT_BLACK);
SetFontShadow(NO_SHADOW);
// draw summary text to the screen
mprintf(TEXT_X,YESTERDAYS_INCOME,pFinanceSummary[2]);
mprintf(TEXT_X,YESTERDAYS_OTHER,pFinanceSummary[3]);
mprintf(TEXT_X,YESTERDAYS_DEBITS,pFinanceSummary[4]);
mprintf(TEXT_X,YESTERDAYS_BALANCE,pFinanceSummary[5]);
mprintf(TEXT_X,TODAYS_INCOME,pFinanceSummary[6]);
mprintf(TEXT_X,TODAYS_OTHER,pFinanceSummary[7]);
mprintf(TEXT_X,TODAYS_DEBITS,pFinanceSummary[8]);
mprintf(TEXT_X,TODAYS_CURRENT_BALANCE, pFinanceSummary[9]);
mprintf(TEXT_X,TODAYS_CURRENT_FORCAST_INCOME, pFinanceSummary[10]);
mprintf(TEXT_X,TODAYS_CURRENT_FORCAST_BALANCE, pFinanceSummary[11]);
// draw the actual numbers
// yesterdays income
iBalance = GetPreviousDaysIncome( );
swprintf(pString, L"%d", iBalance );
InsertCommasForDollarFigure( pString );
if( iBalance != 0 )
InsertDollarSignInToString( pString );
FindFontRightCoordinates(0,0,iScreenWidthOffset + 580,0,pString,FINANCE_TEXT_FONT, &usX, &usY);
mprintf(usX,YESTERDAYS_INCOME,pString);
SetFontForeground( FONT_BLACK );
// yesterdays other
iBalance = GetYesterdaysOtherDeposits( );
swprintf(pString, L"%d", iBalance );
InsertCommasForDollarFigure( pString );
if( iBalance != 0 )
InsertDollarSignInToString( pString );
FindFontRightCoordinates(0,0,iScreenWidthOffset + 580,0,pString,FINANCE_TEXT_FONT, &usX, &usY);
mprintf(usX,YESTERDAYS_OTHER,pString);
SetFontForeground( FONT_RED );
// yesterdays debits
iBalance = GetYesterdaysDebits( );
if( iBalance < 0 )
{
SetFontForeground( FONT_RED );
iBalance *= -1;
}
swprintf(pString, L"%d", iBalance );
InsertCommasForDollarFigure( pString );
if( iBalance != 0 )
InsertDollarSignInToString( pString );
FindFontRightCoordinates(0,0,iScreenWidthOffset + 580,0,pString,FINANCE_TEXT_FONT, &usX, &usY);
mprintf(usX,YESTERDAYS_DEBITS,pString);
SetFontForeground( FONT_BLACK );
// yesterdays balance..ending balance..so todays balance then
iBalance = GetTodaysBalance( );
if( iBalance < 0 )
{
SetFontForeground( FONT_RED );
iBalance *= -1;
}
swprintf(pString, L"%d", iBalance );
InsertCommasForDollarFigure( pString );
if( iBalance != 0 )
InsertDollarSignInToString( pString );
FindFontRightCoordinates(0,0,iScreenWidthOffset + 580,0,pString,FINANCE_TEXT_FONT, &usX, &usY);
mprintf(usX,YESTERDAYS_BALANCE,pString);
SetFontForeground( FONT_BLACK );
// todays income
iBalance = GetTodaysDaysIncome( );
swprintf(pString, L"%d", iBalance );
InsertCommasForDollarFigure( pString );
if( iBalance != 0 )
InsertDollarSignInToString( pString );
FindFontRightCoordinates(0,0,iScreenWidthOffset + 580,0,pString,FINANCE_TEXT_FONT, &usX, &usY);
mprintf(usX,TODAYS_INCOME,pString);
SetFontForeground( FONT_BLACK );
// todays other
iBalance = GetTodaysOtherDeposits( );
swprintf(pString, L"%d", iBalance );
InsertCommasForDollarFigure( pString );
if( iBalance != 0 )
InsertDollarSignInToString( pString );
FindFontRightCoordinates(0,0,iScreenWidthOffset + 580,0,pString,FINANCE_TEXT_FONT, &usX, &usY);
mprintf(usX,TODAYS_OTHER,pString);
SetFontForeground( FONT_RED );
// todays debits
iBalance = GetTodaysDebits( );
// absolute value
if( iBalance < 0 )
{
iBalance *= ( -1 );
}
swprintf(pString, L"%d", iBalance );
InsertCommasForDollarFigure( pString );
if( iBalance != 0 )
InsertDollarSignInToString( pString );
FindFontRightCoordinates(0,0,iScreenWidthOffset + 580,0,pString,FINANCE_TEXT_FONT, &usX, &usY);
mprintf(usX,TODAYS_DEBITS,pString);
SetFontForeground( FONT_BLACK );
// todays current balance
iBalance = GetCurrentBalance( );
if( iBalance < 0 )
{
iBalance *= -1;
SetFontForeground( FONT_RED );
swprintf(pString, L"%d", iBalance );
iBalance *= -1;
}
else
{
swprintf(pString, L"%d", iBalance );
}
InsertCommasForDollarFigure( pString );
if( iBalance != 0 )
InsertDollarSignInToString( pString );
FindFontRightCoordinates(0,0,iScreenWidthOffset + 580,0,pString,FINANCE_TEXT_FONT, &usX, &usY);
mprintf(usX,TODAYS_CURRENT_BALANCE,pString);
SetFontForeground( FONT_BLACK );
// todays forcast income
iBalance = GetProjectedTotalDailyIncome( );
swprintf(pString, L"%d", iBalance );
InsertCommasForDollarFigure( pString );
if( iBalance != 0 )
InsertDollarSignInToString( pString );
FindFontRightCoordinates(0,0,iScreenWidthOffset + 580,0,pString,FINANCE_TEXT_FONT, &usX, &usY);
mprintf(usX,TODAYS_CURRENT_FORCAST_INCOME,pString);
SetFontForeground( FONT_BLACK );
// todays forcast balance
iBalance = GetCurrentBalance( ) + GetProjectedTotalDailyIncome( );
if( iBalance < 0 )
{
iBalance *= -1;
SetFontForeground( FONT_RED );
swprintf(pString, L"%d", iBalance );
iBalance *= -1;
}
else
{
swprintf(pString, L"%d", iBalance );
}
InsertCommasForDollarFigure( pString );
if( iBalance != 0 )
InsertDollarSignInToString( pString );
FindFontRightCoordinates(0,0,iScreenWidthOffset + 580,0,pString,FINANCE_TEXT_FONT, &usX, &usY);
mprintf(usX,TODAYS_CURRENT_FORCAST_BALANCE,pString);
SetFontForeground( FONT_BLACK );
// reset the shadow
SetFontShadow(DEFAULT_SHADOW);
return;
}
void OpenAndReadFinancesFile( void )
{
// this procedure will open and read in data to the finance list
HWFILE hFileHandle;
UINT8 ubCode, ubSecondCode;
UINT32 uiDate;
INT32 iAmount;
INT32 iBalanceToDate;
INT32 iBytesRead=0;
UINT32 uiByteCount=0;
// clear out the old list
ClearFinanceList( );
// no file, return
if ( ! (FileExists( FINANCES_DATA_FILE ) ) )
return;
// open file
hFileHandle=FileOpen( FINANCES_DATA_FILE,( FILE_OPEN_EXISTING | FILE_ACCESS_READ ), FALSE );
// failed to get file, return
if(!hFileHandle)
{
// close file
FileClose( hFileHandle );
return;
}
// make sure file is more than 0 length
if ( FileGetSize( hFileHandle ) == 0 )
{
FileClose( hFileHandle );
return;
}
// read in balance
// write balance to disk first
FileRead( hFileHandle, &(LaptopSaveInfo.iCurrentBalance), sizeof ( INT32 ), (UINT32 *)&iBytesRead );
uiByteCount += sizeof( INT32 );
AssertMsg( iBytesRead, "Failed To Read Data Entry");
// file exists, read in data, continue until file end
while( FileGetSize( hFileHandle ) > uiByteCount)
{
// read in other data
FileRead( hFileHandle, &ubCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &ubSecondCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &uiDate, sizeof(UINT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &iAmount, sizeof(INT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &iBalanceToDate, sizeof(INT32), (UINT32 *)&iBytesRead );
AssertMsg( iBytesRead, "Failed To Read Data Entry");
// add transaction
ProcessAndEnterAFinacialRecord(ubCode, uiDate, iAmount, ubSecondCode, iBalanceToDate);
// increment byte counter
uiByteCount += sizeof( INT32 ) + sizeof( UINT32 ) + sizeof( UINT8 )+ sizeof(UINT8) + sizeof( INT32 );
}
// close file
FileClose( hFileHandle );
return;
}
void ClearFinanceList( void )
{
// remove each element from list of transactions
FinanceUnitPtr pFinanceList=pFinanceListHead;
FinanceUnitPtr pFinanceNode=pFinanceList;
// while there are elements in the list left, delete them
while( pFinanceList )
{
// set node to list head
pFinanceNode=pFinanceList;
// set list head to next node
pFinanceList=pFinanceList->Next;
// delete current node
MemFree(pFinanceNode);
}
pCurrentFinance = NULL;
pFinanceListHead = NULL;
return;
}
UINT32 ProcessAndEnterAFinacialRecord( UINT8 ubCode, UINT32 uiDate, INT32 iAmount, UINT8 ubSecondCode, INT32 iBalanceToDate )
{
UINT32 uiId = 0;
FinanceUnitPtr pFinance=pFinanceListHead;
// add to finance list
if(pFinance)
{
// go to end of list
while(pFinance->Next)
pFinance=pFinance->Next;
// alloc space
pFinance->Next = (finance *) MemAlloc(sizeof(FinanceUnit));
// increment id number
uiId = pFinance->uiIdNumber + 1;
// set up information passed
pFinance = pFinance->Next;
pFinance->Next = NULL;
pFinance->ubCode = ubCode;
pFinance->ubSecondCode = ubSecondCode;
pFinance->uiDate = uiDate;
pFinance->iAmount = iAmount;
pFinance->uiIdNumber = uiId;
pFinance->iBalanceToDate = iBalanceToDate;
}
else
{
// alloc space
uiId = ReadInLastElementOfFinanceListAndReturnIdNumber( );
pFinance = (FinanceUnitPtr) MemAlloc(sizeof(FinanceUnit));
// setup info passed
pFinance->Next = NULL;
pFinance->ubCode = ubCode;
pFinance->ubSecondCode = ubSecondCode;
pFinance->uiDate = uiDate;
pFinance->iAmount= iAmount;
pFinance->uiIdNumber = uiId;
pFinance->iBalanceToDate = iBalanceToDate;
pFinanceListHead = pFinance;
}
pCurrentFinance = pFinanceListHead;
return uiId;
}
void CreateFinanceButtons( void )
{
giFinanceButtonImage[PREV_PAGE_BUTTON] = LoadButtonImage( "LAPTOP\\arrows.sti" ,-1,0,-1,1,-1 );
giFinanceButton[PREV_PAGE_BUTTON] = QuickCreateButton( giFinanceButtonImage[PREV_PAGE_BUTTON], PREV_BTN_X, BTN_Y,
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnFinanceDisplayPrevPageCallBack);
giFinanceButtonImage[NEXT_PAGE_BUTTON]= UseLoadedButtonImage( giFinanceButtonImage[PREV_PAGE_BUTTON] ,-1,6,-1,7,-1 );
giFinanceButton[NEXT_PAGE_BUTTON] = QuickCreateButton( giFinanceButtonImage[NEXT_PAGE_BUTTON], NEXT_BTN_X, BTN_Y,
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnFinanceDisplayNextPageCallBack);
//button to go to the first page
giFinanceButtonImage[FIRST_PAGE_BUTTON]= UseLoadedButtonImage( giFinanceButtonImage[PREV_PAGE_BUTTON], -1,3,-1,4,-1 );
giFinanceButton[FIRST_PAGE_BUTTON] = QuickCreateButton( giFinanceButtonImage[FIRST_PAGE_BUTTON], FIRST_PAGE_X, BTN_Y,
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnFinanceFirstLastPageCallBack);
MSYS_SetBtnUserData( giFinanceButton[FIRST_PAGE_BUTTON], 0, 0 );
//button to go to the last page
giFinanceButtonImage[LAST_PAGE_BUTTON]= UseLoadedButtonImage( giFinanceButtonImage[PREV_PAGE_BUTTON], -1,9,-1,10,-1 );
giFinanceButton[LAST_PAGE_BUTTON] = QuickCreateButton( giFinanceButtonImage[LAST_PAGE_BUTTON], LAST_PAGE_X, BTN_Y,
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnFinanceFirstLastPageCallBack);
MSYS_SetBtnUserData( giFinanceButton[LAST_PAGE_BUTTON], 0, 1 );
SetButtonCursor(giFinanceButton[0], CURSOR_LAPTOP_SCREEN);
SetButtonCursor(giFinanceButton[1], CURSOR_LAPTOP_SCREEN);
SetButtonCursor(giFinanceButton[2], CURSOR_LAPTOP_SCREEN);
SetButtonCursor(giFinanceButton[3], CURSOR_LAPTOP_SCREEN);
return;
}
void DestroyFinanceButtons( void )
{
UINT32 uiCnt;
for( uiCnt=0; uiCnt<4; uiCnt++ )
{
RemoveButton( giFinanceButton[ uiCnt ] );
UnloadButtonImage( giFinanceButtonImage[ uiCnt ] );
}
}
void BtnFinanceDisplayPrevPageCallBack(GUI_BUTTON *btn,INT32 reason)
{
if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
btn->uiFlags&=~(BUTTON_CLICKED_ON);
// if greater than page zero, we can move back, decrement iCurrentPage counter
LoadPreviousPage( );
pCurrentFinance=pFinanceListHead;
// set button state
SetFinanceButtonStates( );
fReDrawScreenFlag=TRUE;
}
}
void BtnFinanceDisplayNextPageCallBack(GUI_BUTTON *btn,INT32 reason)
{
if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
btn->uiFlags&=~(BUTTON_CLICKED_ON);
// increment currentPage
//IncrementCurrentPageFinancialDisplay( );
LoadNextPage( );
// set button state
SetFinanceButtonStates( );
pCurrentFinance=pFinanceListHead;
// redraw screen
fReDrawScreenFlag=TRUE;
}
}
void BtnFinanceFirstLastPageCallBack(GUI_BUTTON *btn,INT32 reason)
{
if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
UINT32 uiButton = MSYS_GetBtnUserData( btn, 0 );
btn->uiFlags&=~(BUTTON_CLICKED_ON);
//if its the first page button
if( uiButton == 0 )
{
iCurrentPage = 0;
LoadInRecords( iCurrentPage );
}
//else its the last page button
else
{
LoadInRecords( guiLastPageInRecordsList + 1 );
iCurrentPage = guiLastPageInRecordsList + 1;
}
// set button state
SetFinanceButtonStates( );
pCurrentFinance=pFinanceListHead;
// redraw screen
fReDrawScreenFlag=TRUE;
}
}
void IncrementCurrentPageFinancialDisplay( void )
{
// run through list, from pCurrentFinance, to NUM_RECORDS_PER_PAGE +1 FinancialUnits
FinanceUnitPtr pTempFinance=pCurrentFinance;
BOOLEAN fOkToIncrementPage=FALSE;
INT32 iCounter=0;
// on the overview page, simply set iCurrent to head of list, and page to 1
if(iCurrentPage==0)
{
pCurrentFinance=pFinanceListHead;
iCurrentPage=1;
return;
}
// no list, we are on page 2
if( pTempFinance == NULL )
{
iCurrentPage = 2;
return;
}
// haven't reached end of list and not yet at beginning of next page
while( ( pTempFinance )&&( ! fOkToIncrementPage ) )
{
// found the next page, first record thereof
if(iCounter==NUM_RECORDS_PER_PAGE+1)
{
fOkToIncrementPage=TRUE;
pCurrentFinance=pTempFinance->Next;
}
//next record
pTempFinance=pTempFinance->Next;
iCounter++;
}
// if ok to increment, increment
if(fOkToIncrementPage)
{
iCurrentPage++;
}
return;
}
void ProcessTransactionString(STR16 pString, FinanceUnitPtr pFinance)
{
switch( pFinance->ubCode)
{
case ACCRUED_INTEREST:
swprintf(pString, L"%s", pTransactionText[ACCRUED_INTEREST]);
break;
case ANONYMOUS_DEPOSIT:
swprintf(pString, L"%s", pTransactionText[ANONYMOUS_DEPOSIT]);
break;
case TRANSACTION_FEE:
swprintf(pString, L"%s", pTransactionText[TRANSACTION_FEE]);
break;
case HIRED_MERC:
swprintf(pString, pMessageStrings[ MSG_HIRED_MERC ], gMercProfiles[pFinance->ubSecondCode].zNickname );
break;
case BOBBYR_PURCHASE:
swprintf(pString, L"%s", pTransactionText[ BOBBYR_PURCHASE ]);
break;
case PAY_SPECK_FOR_MERC:
swprintf(pString, L"%s", pTransactionText[ PAY_SPECK_FOR_MERC ], gMercProfiles[pFinance->ubSecondCode].zName);
break;
case MEDICAL_DEPOSIT:
swprintf(pString, pTransactionText[ MEDICAL_DEPOSIT ] , gMercProfiles[pFinance->ubSecondCode].zNickname);
break;
case IMP_PROFILE:
swprintf(pString, L"%s", pTransactionText[ IMP_PROFILE ] );
break;
case PURCHASED_INSURANCE:
swprintf(pString, pTransactionText[ PURCHASED_INSURANCE ], gMercProfiles[pFinance->ubSecondCode].zNickname );
break;
case REDUCED_INSURANCE:
swprintf(pString, pTransactionText[ REDUCED_INSURANCE ], gMercProfiles[pFinance->ubSecondCode].zNickname );
break;
case EXTENDED_INSURANCE:
swprintf(pString, pTransactionText[ EXTENDED_INSURANCE ], gMercProfiles[pFinance->ubSecondCode].zNickname );
break;
case CANCELLED_INSURANCE:
swprintf(pString, pTransactionText[ CANCELLED_INSURANCE ], gMercProfiles[pFinance->ubSecondCode].zNickname );
break;
case INSURANCE_PAYOUT:
swprintf(pString, pTransactionText[ INSURANCE_PAYOUT ], gMercProfiles[pFinance->ubSecondCode].zNickname);
break;
case EXTENDED_CONTRACT_BY_1_DAY:
swprintf(pString, pTransactionAlternateText[ 1 ], gMercProfiles[pFinance->ubSecondCode].zNickname );
break;
case EXTENDED_CONTRACT_BY_1_WEEK:
swprintf(pString, pTransactionAlternateText[ 2 ], gMercProfiles[pFinance->ubSecondCode].zNickname );
break;
case EXTENDED_CONTRACT_BY_2_WEEKS:
swprintf(pString, pTransactionAlternateText[ 3 ], gMercProfiles[pFinance->ubSecondCode].zNickname );
break;
case DEPOSIT_FROM_GOLD_MINE:
case DEPOSIT_FROM_SILVER_MINE:
swprintf( pString, pTransactionText[ 16 ] );
break;
case PURCHASED_FLOWERS:
swprintf(pString, L"%s", pTransactionText[ PURCHASED_FLOWERS ] );
break;
case FULL_MEDICAL_REFUND:
swprintf(pString, pTransactionText[ FULL_MEDICAL_REFUND ], gMercProfiles[pFinance->ubSecondCode].zNickname);
break;
case PARTIAL_MEDICAL_REFUND:
swprintf(pString, pTransactionText[ PARTIAL_MEDICAL_REFUND ], gMercProfiles[pFinance->ubSecondCode].zNickname);
break;
case NO_MEDICAL_REFUND:
swprintf(pString, pTransactionText[ NO_MEDICAL_REFUND ], gMercProfiles[pFinance->ubSecondCode].zNickname);
break;
case TRANSFER_FUNDS_TO_MERC:
swprintf(pString,pTransactionText[ TRANSFER_FUNDS_TO_MERC ], gMercProfiles[pFinance->ubSecondCode].zNickname);
break;
case TRANSFER_FUNDS_FROM_MERC:
swprintf(pString, pTransactionText[ TRANSFER_FUNDS_FROM_MERC ], gMercProfiles[pFinance->ubSecondCode].zNickname);
break;
case PAYMENT_TO_NPC:
swprintf(pString, pTransactionText[ PAYMENT_TO_NPC ], gMercProfiles[ pFinance->ubSecondCode ].zNickname );
break;
case( TRAIN_TOWN_MILITIA ):
{
CHAR16 str[ 128 ];
UINT8 ubSectorX;
UINT8 ubSectorY;
ubSectorX = (UINT8)SECTORX( pFinance->ubSecondCode );
ubSectorY = (UINT8)SECTORY( pFinance->ubSecondCode );
GetSectorIDString( ubSectorX, ubSectorY, 0, str, TRUE );
swprintf(pString, pTransactionText[ TRAIN_TOWN_MILITIA ], str );
}
break;
case( SOLD_ITEMS ):
swprintf(pString, L"%s", pTransactionText[ SOLD_ITEMS ] );
break;
case( PURCHASED_ITEM_FROM_DEALER ):
swprintf(pString, pTransactionText[ PURCHASED_ITEM_FROM_DEALER ], gMercProfiles[ pFinance->ubSecondCode ].zNickname );
break;
case( MERC_DEPOSITED_MONEY_TO_PLAYER_ACCOUNT ):
swprintf(pString, pTransactionText[ MERC_DEPOSITED_MONEY_TO_PLAYER_ACCOUNT ], gMercProfiles[ pFinance->ubSecondCode ].zNickname );
break;
}
}
void DisplayFinancePageNumberAndDateRange( void )
{
// this function will go through the list of 'histories' starting at current until end or
// MAX_PER_PAGE...it will get the date range and the page number
INT32 iLastPage=0;
INT32 iCounter=0;
UINT32 uiLastDate;
FinanceUnitPtr pTempFinance=pFinanceListHead;
CHAR16 sString[50];
// setup the font stuff
SetFont(FINANCE_TEXT_FONT);
SetFontForeground(FONT_BLACK);
SetFontBackground(FONT_BLACK);
SetFontShadow(NO_SHADOW);
if( !pCurrentFinance )
{
pCurrentFinance = pFinanceListHead;
if( !pCurrentFinance )
{
swprintf( sString, L"%s %d / %d",pFinanceHeaders[5], iCurrentPage + 1 , guiLastPageInRecordsList + 2 );
mprintf( PAGE_NUMBER_X, PAGE_NUMBER_Y, sString );
return;
}
}
uiLastDate=pCurrentFinance->uiDate;
// find last page
while(pTempFinance)
{
iCounter++;
pTempFinance=pTempFinance->Next;
}
// get the last page
swprintf( sString, L"%s %d / %d",pFinanceHeaders[5], iCurrentPage + 1 , guiLastPageInRecordsList + 2 );
mprintf( PAGE_NUMBER_X, PAGE_NUMBER_Y, sString );
// reset shadow
SetFontShadow(DEFAULT_SHADOW);
}
BOOLEAN WriteBalanceToDisk( void )
{
// will write the current balance to disk
HWFILE hFileHandle;
INT32 iBytesWritten=0;
FinanceUnitPtr pFinanceList=pFinanceListHead;
// open file
hFileHandle=FileOpen( FINANCES_DATA_FILE, FILE_ACCESS_WRITE|FILE_CREATE_ALWAYS, FALSE);
// write balance to disk
FileWrite( hFileHandle, &(LaptopSaveInfo.iCurrentBalance), sizeof ( INT32 ), NULL );
// close file
FileClose( hFileHandle );
return( TRUE );
}
void GetBalanceFromDisk( void )
{
// will grab the current blanace from disk
// assuming file already openned
// this procedure will open and read in data to the finance list
HWFILE hFileHandle;
INT32 iBytesRead=0;
// open file
hFileHandle=FileOpen( FINANCES_DATA_FILE,( FILE_OPEN_EXISTING | FILE_ACCESS_READ ), FALSE );
// failed to get file, return
if(!hFileHandle)
{
LaptopSaveInfo.iCurrentBalance = 0;
// close file
FileClose( hFileHandle );
return;
}
// start at beginning
FileSeek( hFileHandle, 0, FILE_SEEK_FROM_START);
// get balance from disk first
FileRead( hFileHandle, &(LaptopSaveInfo.iCurrentBalance), sizeof ( INT32 ), (UINT32 *)&iBytesRead );
AssertMsg( iBytesRead, "Failed To Read Data Entry");
// close file
FileClose( hFileHandle );
return;
}
BOOLEAN AppendFinanceToEndOfFile( FinanceUnitPtr pFinance )
{
// will write the current finance to disk
HWFILE hFileHandle;
INT32 iBytesWritten=0;
FinanceUnitPtr pFinanceList=pFinanceListHead;
// open file
hFileHandle=FileOpen( FINANCES_DATA_FILE, FILE_ACCESS_WRITE|FILE_OPEN_ALWAYS, FALSE);
// if no file exits, do nothing
if(!hFileHandle)
{
// close file
FileClose( hFileHandle );
return ( FALSE );
}
// go to the end
if( FileSeek( hFileHandle,0,FILE_SEEK_FROM_END ) == FALSE )
{
// error
FileClose( hFileHandle );
return( FALSE );
}
// write finance to disk
// now write date and amount, and code
FileWrite( hFileHandle, &(pFinanceList->ubCode), sizeof ( UINT8 ), NULL );
FileWrite( hFileHandle, &(pFinanceList->ubSecondCode), sizeof ( UINT8 ), NULL );
FileWrite( hFileHandle, &(pFinanceList->uiDate), sizeof ( UINT32 ), NULL );
FileWrite( hFileHandle, &(pFinanceList->iAmount), sizeof ( INT32 ), NULL );
FileWrite( hFileHandle, &(pFinanceList->iBalanceToDate), sizeof ( INT32 ), NULL );
// close file
FileClose( hFileHandle );
return( TRUE );
}
UINT32 ReadInLastElementOfFinanceListAndReturnIdNumber( void )
{
// this function will read in the last unit in the finance list, to grab it's id number
HWFILE hFileHandle;
INT32 iBytesRead=0;
INT32 iFileSize = 0;
// no file, return
if ( ! (FileExists( FINANCES_DATA_FILE ) ) )
return 0;
// open file
hFileHandle=FileOpen( FINANCES_DATA_FILE,( FILE_OPEN_EXISTING | FILE_ACCESS_READ ), FALSE );
// failed to get file, return
if(!hFileHandle)
{
// close file
FileClose( hFileHandle );
return 0;
}
// make sure file is more than balance size + length of 1 record - 1 byte
if ( FileGetSize( hFileHandle ) < sizeof( INT32 ) + sizeof( UINT32 ) + sizeof( UINT8 )+ sizeof(UINT8) + sizeof( INT32 ) )
{
FileClose( hFileHandle );
return 0;
}
// size is?
iFileSize = FileGetSize( hFileHandle );
// done with file, close it
FileClose( hFileHandle );
// file size -1 / sizeof record in bytes is id
return ( ( iFileSize - 1 ) / ( sizeof( INT32 ) + sizeof( UINT32 ) + sizeof( UINT8 )+ sizeof(UINT8) + sizeof( INT32 )) );
}
void SetLastPageInRecords( void )
{
// grabs the size of the file and interprets number of pages it will take up
HWFILE hFileHandle;
INT32 iBytesRead=0;
// no file, return
if ( ! (FileExists( FINANCES_DATA_FILE ) ) )
return;
// open file
hFileHandle=FileOpen( FINANCES_DATA_FILE,( FILE_OPEN_EXISTING | FILE_ACCESS_READ ), FALSE );
// failed to get file, return
if(!hFileHandle)
{
LaptopSaveInfo.iCurrentBalance = 0;
return;
}
// make sure file is more than 0 length
if ( FileGetSize( hFileHandle ) == 0 )
{
FileClose( hFileHandle );
guiLastPageInRecordsList = 1;
return;
}
// done with file, close it
FileClose( hFileHandle );
guiLastPageInRecordsList = ( ReadInLastElementOfFinanceListAndReturnIdNumber( ) - 1 )/ NUM_RECORDS_PER_PAGE;
return;
}
BOOLEAN LoadPreviousPage( void )
{
// clear out old list of records, and load in previous page worth of records
ClearFinanceList( );
// load previous page
if( ( iCurrentPage == 1 )||( iCurrentPage == 0 ) )
{
iCurrentPage = 0;
return ( FALSE );
}
// now load in previous page's records, if we can
if ( LoadInRecords( iCurrentPage - 1 ) )
{
iCurrentPage--;
return ( TRUE );
}
else
{
LoadInRecords( iCurrentPage );
return ( FALSE );
}
}
BOOLEAN LoadNextPage( void )
{
// clear out old list of records, and load in previous page worth of records
ClearFinanceList( );
// now load in previous page's records, if we can
if ( LoadInRecords( iCurrentPage + 1 ) )
{
iCurrentPage++;
return ( TRUE );
}
else
{
LoadInRecords( iCurrentPage );
return ( FALSE );
}
}
BOOLEAN LoadInRecords( UINT32 uiPage )
{
// loads in records belogning, to page uiPage
// no file, return
BOOLEAN fOkToContinue=TRUE;
INT32 iCount =0;
HWFILE hFileHandle;
UINT8 ubCode, ubSecondCode;
INT32 iBalanceToDate;
UINT32 uiDate;
INT32 iAmount;
INT32 iBytesRead=0;
UINT32 uiByteCount=0;
// check if bad page
if( uiPage == 0 )
{
return ( FALSE );
}
if ( ! (FileExists( FINANCES_DATA_FILE ) ) )
return( FALSE );
// open file
hFileHandle=FileOpen( FINANCES_DATA_FILE,( FILE_OPEN_EXISTING | FILE_ACCESS_READ ), FALSE );
// failed to get file, return
if(!hFileHandle)
{
// close file
FileClose( hFileHandle );
return( FALSE );
}
// make sure file is more than 0 length
if ( FileGetSize( hFileHandle ) == 0 )
{
FileClose( hFileHandle );
return( FALSE );
}
// is the file long enough?
if( ( FileGetSize( hFileHandle ) - sizeof( INT32 ) - 1) / ( NUM_RECORDS_PER_PAGE * ( sizeof( INT32 ) + sizeof( UINT32 ) + sizeof( UINT8 )+ sizeof(UINT8) + sizeof( INT32 )) ) + 1 < uiPage )
{
// nope
FileClose( hFileHandle );
return( FALSE );
}
FileSeek( hFileHandle, sizeof( INT32 ) + ( uiPage - 1 ) * NUM_RECORDS_PER_PAGE * ( sizeof( INT32 )+ sizeof( UINT32 ) + sizeof( UINT8 )+ sizeof(UINT8) + sizeof( INT32)), FILE_SEEK_FROM_START );
uiByteCount = sizeof( INT32 )+( uiPage - 1 ) * NUM_RECORDS_PER_PAGE * ( sizeof( INT32 ) + sizeof( UINT32 ) + sizeof( UINT8 )+ sizeof(UINT8) + sizeof( INT32 ) );
// file exists, read in data, continue until end of page
while( ( iCount < NUM_RECORDS_PER_PAGE )&&( fOkToContinue ) &&( uiByteCount < FileGetSize( hFileHandle ) ) )
{
// read in data
FileRead( hFileHandle, &ubCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &ubSecondCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &uiDate, sizeof(UINT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &iAmount, sizeof(INT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &iBalanceToDate, sizeof(INT32), (UINT32 *)&iBytesRead );
AssertMsg( iBytesRead, "Failed To Read Data Entry");
// add transaction
ProcessAndEnterAFinacialRecord(ubCode, uiDate, iAmount, ubSecondCode, iBalanceToDate);
// increment byte counter
uiByteCount += sizeof( INT32 ) + sizeof( UINT32 ) + sizeof( UINT8 )+ sizeof(UINT8) + sizeof( INT32 );
// we've overextended our welcome, and bypassed end of file, get out
if( uiByteCount >= FileGetSize( hFileHandle ) )
{
// not ok to continue
fOkToContinue = FALSE;
}
iCount++;
}
// close file
FileClose( hFileHandle );
// check to see if we in fact have a list to display
if( pFinanceListHead == NULL )
{
// got no records, return false
return( FALSE );
}
// set up current finance
pCurrentFinance = pFinanceListHead;
return( TRUE );
}
void InsertCommasForDollarFigure( STR16 pString )
{
INT16 sCounter =0;
INT16 sZeroCount =0;
INT16 sTempCounter = 0;
INT16 sEndPosition = 0;
// go to end of dollar figure
while( pString[ sCounter ] != 0 )
{
sCounter++;
}
// negative?
if( pString[0] == '-' )
{
// stop one slot in advance of normal
sEndPosition = 1;
}
// is there under $1,000?
if( sCounter < 4 )
{
// can't do anything, return
return;
}
// at end, start backing up until beginning
while( sCounter > sEndPosition )
{
// enough for a comma?
if( sZeroCount==3 )
{
// reset count
sZeroCount =0;
// set tempcounter to current counter
sTempCounter = sCounter;
// run until end
while( pString[ sTempCounter ] != 0 )
{
sTempCounter++;
}
// now shift everything over ot the right one place until sTempCounter = sCounter
while( sTempCounter >= sCounter )
{
pString[ sTempCounter+1 ] = pString[ sTempCounter ];
sTempCounter--;
}
// now insert comma
pString[ sCounter ]=L',';
}
// increment count of digits
sZeroCount++;
// decrement counter
sCounter--;
}
return;
}
void InsertDollarSignInToString( STR16 pString )
{
// run to end of string, copy everything in string 2 places right, insert a space at pString[ 1 ] and a L'$' at pString[ 0 ]
INT32 iCounter =0;
// run to end of string
while( pString[ iCounter ] != 0 )
{
iCounter++;
}
// now copy over
while( iCounter >= 0 )
{
pString[ iCounter + 1] = pString[ iCounter ];
iCounter--;
}
pString[ 0 ] = L'$';
return;
}
INT32 GetPreviousBalanceToDate( void )
{
// will grab balance to date of previous record
// grabs the size of the file and interprets number of pages it will take up
HWFILE hFileHandle;
INT32 iBytesRead=0;
INT32 iBalanceToDate=0;
// no file, return
if ( ! (FileExists( FINANCES_DATA_FILE ) ) )
return 0;
// open file
hFileHandle=FileOpen( FINANCES_DATA_FILE,( FILE_OPEN_EXISTING | FILE_ACCESS_READ ), FALSE );
// failed to get file, return
if(!hFileHandle)
{
// close file
FileClose( hFileHandle );
return 0;
}
if ( FileGetSize( hFileHandle ) < sizeof( INT32 ) + sizeof( UINT32 ) + sizeof( UINT8 )+ sizeof(UINT8) + sizeof( INT32 ) )
{
FileClose( hFileHandle );
return 0;
}
FileSeek( hFileHandle, ( sizeof( INT32 ) ) , FILE_SEEK_FROM_END );
// get balnce to date
FileRead( hFileHandle, &iBalanceToDate, sizeof(INT32), (UINT32 *)&iBytesRead );
FileClose( hFileHandle );
return iBalanceToDate;
}
INT32 GetPreviousDaysBalance( void )
{
// find out what today is, then go back 2 days, get balance for that day
INT32 iPreviousDaysBalance = 0;
HWFILE hFileHandle;
INT32 iBytesRead=0;
UINT32 iDateInMinutes = 0;
BOOLEAN fOkToContinue = FALSE;
UINT32 iByteCount = 0;
INT32 iCounter =1;
UINT8 ubCode;
UINT8 ubSecondCode;
UINT32 uiDate;
INT32 iAmount;
INT32 iBalanceToDate;
BOOLEAN fGoneTooFar= FALSE;
INT32 iFileSize = 0;
// what day is it?
iDateInMinutes = GetWorldTotalMin( ) - ( 60 * 24 );
// error checking
// no file, return
if ( ! (FileExists( FINANCES_DATA_FILE ) ) )
return 0;
// open file
hFileHandle=FileOpen( FINANCES_DATA_FILE,( FILE_OPEN_EXISTING | FILE_ACCESS_READ ), FALSE );
// failed to get file, return
if(!hFileHandle)
{
// close file
FileClose( hFileHandle );
return 0;
}
// start at the end, move back until Date / 24 * 60 on the record is = ( iDateInMinutes / ( 24 * 60 ) ) - 2
iByteCount+= sizeof( INT32 );
// loop, make sure we don't pass beginning of file, if so, we have an error, and check for condifition above
while( ( iByteCount < FileGetSize( hFileHandle ) ) && ( ! fOkToContinue ) && ( ! fGoneTooFar ) )
{
FileSeek( hFileHandle, RECORD_SIZE * iCounter , FILE_SEEK_FROM_END );
// incrment byte count
iByteCount += RECORD_SIZE;
FileRead( hFileHandle, &ubCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &ubSecondCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &uiDate, sizeof(UINT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &iAmount, sizeof(INT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &iBalanceToDate, sizeof(INT32), (UINT32 *)&iBytesRead );
// check to see if we are far enough
if( ( uiDate / ( 24 * 60 ) ) == ( iDateInMinutes / ( 24 * 60 ) ) - 2 )
{
fOkToContinue = TRUE;
}
if( iDateInMinutes / ( 24 * 60 ) >= 2 )
{
// there are no entries for the previous day
if( ( uiDate / ( 24 * 60 ) ) < ( iDateInMinutes / ( 24 * 60 ) ) - 2 )
{
fGoneTooFar = TRUE;
}
}
else
{
fGoneTooFar = TRUE;
}
iCounter++;
}
if( fOkToContinue == FALSE )
{
// reached beginning of file, nothing found, return 0
// close file
FileClose( hFileHandle );
return 0;
}
FileClose( hFileHandle );
// reached 3 days ago, or beginning of file
return iBalanceToDate;
}
INT32 GetTodaysBalance( void )
{
// find out what today is, then go back 2 days, get balance for that day
INT32 iPreviousDaysBalance = 0;
HWFILE hFileHandle;
INT32 iBytesRead=0;
UINT32 iDateInMinutes = 0;
BOOLEAN fOkToContinue = FALSE;
UINT32 iByteCount = 0;
INT32 iCounter = 1;
UINT8 ubCode;
UINT8 ubSecondCode;
UINT32 uiDate;
INT32 iAmount;
INT32 iBalanceToDate;
BOOLEAN fGoneTooFar= FALSE;
// what day is it?
iDateInMinutes = GetWorldTotalMin( );
// error checking
// no file, return
if ( ! (FileExists( FINANCES_DATA_FILE ) ) )
return 0;
// open file
hFileHandle=FileOpen( FINANCES_DATA_FILE,( FILE_OPEN_EXISTING | FILE_ACCESS_READ ), FALSE );
// failed to get file, return
if(!hFileHandle)
{
// close file
FileClose( hFileHandle );
return 0;
}
// start at the end, move back until Date / 24 * 60 on the record is = ( iDateInMinutes / ( 24 * 60 ) ) - 2
iByteCount+= sizeof( INT32 );
// loop, make sure we don't pass beginning of file, if so, we have an error, and check for condifition above
while( ( iByteCount < FileGetSize( hFileHandle ) ) && ( ! fOkToContinue ) && ( ! fGoneTooFar ) )
{
FileSeek( hFileHandle, RECORD_SIZE * iCounter , FILE_SEEK_FROM_END );
// incrment byte count
iByteCount += RECORD_SIZE;
FileRead( hFileHandle, &ubCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &ubSecondCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &uiDate, sizeof(UINT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &iAmount, sizeof(INT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &iBalanceToDate, sizeof(INT32), (UINT32 *)&iBytesRead );
AssertMsg( iBytesRead, "Failed To Read Data Entry");
// check to see if we are far enough
if( ( uiDate / ( 24 * 60 ) ) == ( iDateInMinutes / ( 24 * 60 ) ) - 1 )
{
fOkToContinue = TRUE;
}
iCounter++;
}
FileClose( hFileHandle );
// not found ?
if( fOkToContinue == FALSE )
{
iBalanceToDate = 0;
}
// reached 3 days ago, or beginning of file
return iBalanceToDate;
}
INT32 GetPreviousDaysIncome( void )
{
// will return the income from the previous day
// which is todays starting balance - yesterdays starting balance
INT32 iPreviousDaysBalance = 0;
HWFILE hFileHandle;
INT32 iBytesRead=0;
UINT32 iDateInMinutes = 0;
BOOLEAN fOkToContinue = FALSE;
BOOLEAN fOkToIncrement = FALSE;
UINT32 iByteCount = 0;
INT32 iCounter = 1;
UINT8 ubCode;
UINT8 ubSecondCode;
UINT32 uiDate;
INT32 iAmount;
INT32 iBalanceToDate;
BOOLEAN fGoneTooFar = FALSE;
INT32 iTotalPreviousIncome = 0;
// what day is it?
iDateInMinutes = GetWorldTotalMin( );
// error checking
// no file, return
if ( ! (FileExists( FINANCES_DATA_FILE ) ) )
return 0;
// open file
hFileHandle=FileOpen( FINANCES_DATA_FILE,( FILE_OPEN_EXISTING | FILE_ACCESS_READ ), FALSE );
// failed to get file, return
if(!hFileHandle)
{
// close file
FileClose( hFileHandle );
return 0;
}
// start at the end, move back until Date / 24 * 60 on the record is = ( iDateInMinutes / ( 24 * 60 ) ) - 2
iByteCount+= sizeof( INT32 );
// loop, make sure we don't pass beginning of file, if so, we have an error, and check for condifition above
while( ( iByteCount < FileGetSize( hFileHandle ) ) && ( ! fOkToContinue ) &&( !fGoneTooFar ) )
{
FileGetPos( hFileHandle );
FileSeek( hFileHandle, RECORD_SIZE * iCounter , FILE_SEEK_FROM_END );
// incrment byte count
iByteCount += RECORD_SIZE;
FileGetPos( hFileHandle );
FileRead( hFileHandle, &ubCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &ubSecondCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &uiDate, sizeof(UINT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &iAmount, sizeof(INT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &iBalanceToDate, sizeof(INT32), (UINT32 *)&iBytesRead );
AssertMsg( iBytesRead, "Failed To Read Data Entry");
// check to see if we are far enough
if( ( uiDate / ( 24 * 60 ) )== ( iDateInMinutes / ( 24 * 60 ) ) - 2 )
{
fOkToContinue = TRUE;
}
// there are no entries for the previous day
if( ( uiDate / ( 24 * 60 ) ) < ( iDateInMinutes / ( 24 * 60 ) ) - 2 )
{
fGoneTooFar = TRUE;
}
if( ( uiDate / ( 24 * 60 ) ) == ( iDateInMinutes / ( 24 * 60 ) ) - 1 )
{
// now ok to increment amount
fOkToIncrement = TRUE;
}
if( ( fOkToIncrement ) && ( ( ubCode == DEPOSIT_FROM_GOLD_MINE ) || ( ubCode == DEPOSIT_FROM_SILVER_MINE) ) )
{
// increment total
iTotalPreviousIncome += iAmount;
}
iCounter++;
}
// now run back one more day and add up the total of deposits
// close file
FileClose( hFileHandle );
return( iTotalPreviousIncome );
}
INT32 GetTodaysDaysIncome( void )
{
// will return the income from the previous day
// which is todays starting balance - yesterdays starting balance
INT32 iPreviousDaysBalance = 0;
HWFILE hFileHandle;
INT32 iBytesRead=0;
UINT32 iDateInMinutes = 0;
BOOLEAN fOkToContinue = FALSE;
BOOLEAN fOkToIncrement = FALSE;
UINT32 iByteCount = 0;
INT32 iCounter = 1;
UINT8 ubCode;
UINT8 ubSecondCode;
UINT32 uiDate;
INT32 iAmount;
INT32 iBalanceToDate;
BOOLEAN fGoneTooFar = FALSE;
INT32 iTotalIncome = 0;
// what day is it?
iDateInMinutes = GetWorldTotalMin( );
// error checking
// no file, return
if ( ! (FileExists( FINANCES_DATA_FILE ) ) )
return 0;
// open file
hFileHandle=FileOpen( FINANCES_DATA_FILE,( FILE_OPEN_EXISTING | FILE_ACCESS_READ ), FALSE );
// failed to get file, return
if(!hFileHandle)
{
// close file
FileClose( hFileHandle );
return 0;
}
// start at the end, move back until Date / 24 * 60 on the record is = ( iDateInMinutes / ( 24 * 60 ) ) - 2
iByteCount+=sizeof( INT32 );
// loop, make sure we don't pass beginning of file, if so, we have an error, and check for condifition above
while( ( iByteCount < FileGetSize( hFileHandle ) ) && ( ! fOkToContinue ) &&( !fGoneTooFar ) )
{
FileSeek( hFileHandle, RECORD_SIZE * iCounter , FILE_SEEK_FROM_END );
// incrment byte count
iByteCount += RECORD_SIZE;
FileRead( hFileHandle, &ubCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &ubSecondCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &uiDate, sizeof(UINT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &iAmount, sizeof(INT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &iBalanceToDate, sizeof(INT32), (UINT32 *)&iBytesRead );
AssertMsg( iBytesRead, "Failed To Read Data Entry");
// check to see if we are far enough
if( ( uiDate / ( 24 * 60 ) ) == ( iDateInMinutes / ( 24 * 60 ) ) - 1 )
{
fOkToContinue = TRUE;
}
if( ( uiDate / ( 24 * 60 ) ) > ( iDateInMinutes / ( 24 * 60 ) ) - 1 )
{
// now ok to increment amount
fOkToIncrement = TRUE;
}
if( ( fOkToIncrement ) && ( ( ubCode == DEPOSIT_FROM_GOLD_MINE ) || ( ubCode == DEPOSIT_FROM_SILVER_MINE) ) )
{
// increment total
iTotalIncome += iAmount;
fOkToIncrement = FALSE;
}
iCounter++;
}
// no entries, return nothing - no income for the day
if( fGoneTooFar == TRUE )
{
FileClose( hFileHandle );
return 0;
}
// now run back one more day and add up the total of deposits
// close file
FileClose( hFileHandle );
return( iTotalIncome );
}
void SetFinanceButtonStates( void )
{
// this function will look at what page we are viewing, enable and disable buttons as needed
if( iCurrentPage == 0 )
{
// first page, disable left buttons
DisableButton( giFinanceButton[PREV_PAGE_BUTTON] );
DisableButton( giFinanceButton[FIRST_PAGE_BUTTON] );
}
else
{
// enable buttons
EnableButton( giFinanceButton[PREV_PAGE_BUTTON] );
EnableButton( giFinanceButton[FIRST_PAGE_BUTTON] );
}
if( LoadNextPage( ) )
{
// decrement page
LoadPreviousPage( );
// enable buttons
EnableButton( giFinanceButton[ NEXT_PAGE_BUTTON ] );
EnableButton( giFinanceButton[ LAST_PAGE_BUTTON ] );
}
else
{
DisableButton( giFinanceButton[ NEXT_PAGE_BUTTON ] );
DisableButton( giFinanceButton[ LAST_PAGE_BUTTON ] );
}
}
INT32 GetTodaysOtherDeposits( void )
{
// grab todays other deposits
INT32 iPreviousDaysBalance = 0;
HWFILE hFileHandle;
INT32 iBytesRead=0;
UINT32 iDateInMinutes = 0;
BOOLEAN fOkToContinue = FALSE;
BOOLEAN fOkToIncrement = FALSE;
UINT32 iByteCount = 0;
INT32 iCounter = 1;
UINT8 ubCode;
UINT8 ubSecondCode;
UINT32 uiDate;
INT32 iAmount;
INT32 iBalanceToDate;
BOOLEAN fGoneTooFar = FALSE;
INT32 iTotalIncome = 0;
// what day is it?
iDateInMinutes = GetWorldTotalMin( );
// error checking
// no file, return
if ( ! (FileExists( FINANCES_DATA_FILE ) ) )
return 0;
// open file
hFileHandle=FileOpen( FINANCES_DATA_FILE,( FILE_OPEN_EXISTING | FILE_ACCESS_READ ), FALSE );
// failed to get file, return
if(!hFileHandle)
{
// close file
FileClose( hFileHandle );
return 0;
}
// start at the end, move back until Date / 24 * 60 on the record is = ( iDateInMinutes / ( 24 * 60 ) ) - 2
iByteCount+= sizeof( INT32 );
// loop, make sure we don't pass beginning of file, if so, we have an error, and check for condifition above
while( ( iByteCount < FileGetSize( hFileHandle ) ) && ( ! fOkToContinue ) &&( !fGoneTooFar ) )
{
FileSeek( hFileHandle, RECORD_SIZE * iCounter , FILE_SEEK_FROM_END );
// incrment byte count
iByteCount += RECORD_SIZE;
FileRead( hFileHandle, &ubCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &ubSecondCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &uiDate, sizeof(UINT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &iAmount, sizeof(INT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &iBalanceToDate, sizeof(INT32), (UINT32 *)&iBytesRead );
AssertMsg( iBytesRead, "Failed To Read Data Entry");
// check to see if we are far enough
if( ( uiDate / ( 24 * 60 ) ) == ( iDateInMinutes / ( 24 * 60 ) ) - 1 )
{
fOkToContinue = TRUE;
}
if( ( uiDate / ( 24 * 60 ) ) > ( iDateInMinutes / ( 24 * 60 ) ) - 1 )
{
// now ok to increment amount
fOkToIncrement = TRUE;
}
if( ( fOkToIncrement ) && ( ( ubCode != DEPOSIT_FROM_GOLD_MINE ) && ( ubCode != DEPOSIT_FROM_SILVER_MINE) ) )
{
if( iAmount > 0 )
{
// increment total
iTotalIncome += iAmount;
fOkToIncrement = FALSE;
}
}
iCounter++;
}
// no entries, return nothing - no income for the day
if( fGoneTooFar == TRUE )
{
FileClose( hFileHandle );
return 0;
}
// now run back one more day and add up the total of deposits
// close file
FileClose( hFileHandle );
return( iTotalIncome );
}
INT32 GetYesterdaysOtherDeposits( void )
{
INT32 iPreviousDaysBalance = 0;
HWFILE hFileHandle;
INT32 iBytesRead=0;
UINT32 iDateInMinutes = 0;
BOOLEAN fOkToContinue = FALSE;
BOOLEAN fOkToIncrement = FALSE;
UINT32 iByteCount = 0;
INT32 iCounter = 1;
UINT8 ubCode;
UINT8 ubSecondCode;
UINT32 uiDate;
INT32 iAmount;
INT32 iBalanceToDate;
BOOLEAN fGoneTooFar = FALSE;
INT32 iTotalPreviousIncome = 0;
// what day is it?
iDateInMinutes = GetWorldTotalMin( );
// error checking
// no file, return
if ( ! (FileExists( FINANCES_DATA_FILE ) ) )
return 0;
// open file
hFileHandle=FileOpen( FINANCES_DATA_FILE,( FILE_OPEN_EXISTING | FILE_ACCESS_READ ), FALSE );
// failed to get file, return
if(!hFileHandle)
{
// close file
FileClose( hFileHandle );
return 0;
}
// start at the end, move back until Date / 24 * 60 on the record is = ( iDateInMinutes / ( 24 * 60 ) ) - 2
iByteCount+= sizeof( INT32 );
// loop, make sure we don't pass beginning of file, if so, we have an error, and check for condifition above
while( ( iByteCount < FileGetSize( hFileHandle ) ) && ( ! fOkToContinue ) &&( !fGoneTooFar ) )
{
FileSeek( hFileHandle, RECORD_SIZE * iCounter , FILE_SEEK_FROM_END );
// incrment byte count
iByteCount += RECORD_SIZE;
FileRead( hFileHandle, &ubCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &ubSecondCode, sizeof(UINT8), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &uiDate, sizeof(UINT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &iAmount, sizeof(INT32), (UINT32 *)&iBytesRead );
FileRead( hFileHandle, &iBalanceToDate, sizeof(INT32), (UINT32 *)&iBytesRead );
AssertMsg( iBytesRead, "Failed To Read Data Entry");
// check to see if we are far enough
if( ( uiDate / ( 24 * 60 ) )== ( iDateInMinutes / ( 24 * 60 ) ) - 2 )
{
fOkToContinue = TRUE;
}
// there are no entries for the previous day
if( ( uiDate / ( 24 * 60 ) ) < ( iDateInMinutes / ( 24 * 60 ) ) - 2 )
{
fGoneTooFar = TRUE;
}
if( ( uiDate / ( 24 * 60 ) ) == ( iDateInMinutes / ( 24 * 60 ) ) - 1 )
{
// now ok to increment amount
fOkToIncrement = TRUE;
}
if( ( fOkToIncrement ) && ( ( ubCode != DEPOSIT_FROM_GOLD_MINE ) && ( ubCode != DEPOSIT_FROM_SILVER_MINE) ) )
{
if( iAmount > 0 )
{
// increment total
iTotalPreviousIncome += iAmount;
}
}
iCounter++;
}
// close file
FileClose( hFileHandle );
return( iTotalPreviousIncome );
}
INT32 GetTodaysDebits( void )
{
// return the expenses for today
// currentbalance - todays balance - Todays income - other deposits
return( GetCurrentBalance( ) - GetTodaysBalance( ) - GetTodaysDaysIncome( ) - GetTodaysOtherDeposits( ) );
}
INT32 GetYesterdaysDebits( void )
{
// return the expenses for yesterday
return( GetTodaysBalance( ) - GetPreviousDaysBalance( ) - GetPreviousDaysIncome( ) - GetYesterdaysOtherDeposits( ) );
}
void LoadCurrentBalance( void )
{
// will load the current balance from finances.dat file
HWFILE hFileHandle;
INT32 iBytesRead=0;
// is the first record in the file
// error checking
// no file, return
if ( ! (FileExists( FINANCES_DATA_FILE ) ) )
{
LaptopSaveInfo.iCurrentBalance= 0;
return;
}
// open file
hFileHandle=FileOpen( FINANCES_DATA_FILE,( FILE_OPEN_EXISTING | FILE_ACCESS_READ ), FALSE );
// failed to get file, return
if(!hFileHandle)
{
LaptopSaveInfo.iCurrentBalance= 0;
// close file
FileClose( hFileHandle );
return;
}
FileSeek( hFileHandle, 0 , FILE_SEEK_FROM_START );
FileRead( hFileHandle, &LaptopSaveInfo.iCurrentBalance, sizeof( INT32 ), (UINT32 *)&iBytesRead );
AssertMsg( iBytesRead, "Failed To Read Data Entry");
// close file
FileClose( hFileHandle );
return;
}