mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
6324 lines
187 KiB
C++
6324 lines
187 KiB
C++
#include "laptop.h"
|
|
#include "email.h"
|
|
#include "Utilities.h"
|
|
#include "WCheck.h"
|
|
#include "DEBUG.H"
|
|
#include "WordWrap.h"
|
|
#include "Encrypted File.h"
|
|
#include "Cursors.h"
|
|
#include "Soldier Profile.h"
|
|
#include "CharProfile.h"
|
|
#include "IMP Compile Character.h"
|
|
#include "IMP Portraits.h"
|
|
#include "Game Clock.h"
|
|
#include "AimMembers.h"
|
|
#include "random.h"
|
|
#include "Text.h"
|
|
#include "LaptopSave.h"
|
|
#include "PostalService.h"
|
|
#include "faces.h"
|
|
#include "GameSettings.h"
|
|
#include <string>
|
|
#include "soldier profile type.h"
|
|
#include "message.h"
|
|
|
|
#ifdef JA2UB
|
|
#include "Ja25_Tactical.h"
|
|
#include "Ja25 Strategic Ai.h"
|
|
#include "ub_config.h"
|
|
|
|
#define EMAIL_EDT_FILE_JA25 "BINARYDATA\\Email25.edt"
|
|
#define EMAIL_EDT_FILE_JA2 "BINARYDATA\\Email.edt"
|
|
#endif
|
|
|
|
using namespace std;
|
|
|
|
//static EmailPtr pEmailList;
|
|
EmailPtr pEmailList;
|
|
static PagePtr pPageList;
|
|
static INT32 iLastPage=-1;
|
|
static INT32 iCurrentPage=0;
|
|
INT32 iDeleteId=0;
|
|
BOOLEAN fUnReadMailFlag=FALSE;
|
|
BOOLEAN fOldUnreadFlag=TRUE;
|
|
BOOLEAN fNewMailFlag=FALSE;
|
|
BOOLEAN fOldNewMailFlag=FALSE;
|
|
BOOLEAN fDisplayMessageFlag=FALSE;
|
|
BOOLEAN fOldDisplayMessageFlag=FALSE;
|
|
BOOLEAN fReDraw=FALSE;
|
|
BOOLEAN fDeleteMailFlag=FALSE;
|
|
BOOLEAN fReDrawMessageFlag = FALSE;
|
|
BOOLEAN fOnLastPageFlag=FALSE;
|
|
BOOLEAN fJustStartedEmail = FALSE;
|
|
BOOLEAN fDeleteInternal = FALSE;
|
|
BOOLEAN fOpenMostRecentUnReadFlag = FALSE;
|
|
INT32 iViewerPositionY=0;
|
|
|
|
INT32 giMessageId = -1;
|
|
INT32 giPrevMessageId = -1;
|
|
INT32 giMessagePage = -1;
|
|
INT32 giNumberOfPagesToCurrentEmail = -1;
|
|
UINT32 guiEmailWarning;
|
|
|
|
#define EMAIL_TOP_BAR_HEIGHT 22
|
|
|
|
#define LIST_MIDDLE_COUNT 18
|
|
// object positions
|
|
#define TITLE_X 0+LAPTOP_SCREEN_UL_X
|
|
#define TITLE_Y 0+LAPTOP_SCREEN_UL_Y
|
|
|
|
#define STAMP_X LAPTOP_SCREEN_UL_X
|
|
#define STAMP_Y LAPTOP_SCREEN_UL_Y
|
|
/*
|
|
#define TOP_X 0+LAPTOP_SCREEN_UL_X
|
|
#define TOP_Y 62+LAPTOP_SCREEN_UL_Y
|
|
|
|
#define BOTTOM_X 0+LAPTOP_SCREEN_UL_X
|
|
#define BOTTOM_Y 359+LAPTOP_SCREEN_UL_Y
|
|
*/
|
|
#define MIDDLE_X 0+LAPTOP_SCREEN_UL_X
|
|
#define MIDDLE_Y iScreenHeightOffset + 72 + EMAIL_TOP_BAR_HEIGHT
|
|
#define MIDDLE_WIDTH 19
|
|
|
|
|
|
// new graphics
|
|
#define EMAIL_LIST_WINDOW_Y iScreenHeightOffset + 22
|
|
#define EMAIL_TITLE_BAR_X iScreenWidthOffset + 5
|
|
|
|
// email columns
|
|
#define SENDER_X LAPTOP_SCREEN_UL_X+65
|
|
#define SENDER_WIDTH 246-158
|
|
|
|
#define DATE_X LAPTOP_SCREEN_UL_X+428
|
|
#define DATE_WIDTH 592-527
|
|
|
|
#define SUBJECT_X LAPTOP_SCREEN_UL_X+175
|
|
#define SUBJECT_WIDTH 254
|
|
#define INDIC_X iScreenWidthOffset + 128
|
|
#define INDIC_WIDTH 155-123
|
|
#define INDIC_HEIGHT 145-128
|
|
|
|
#define LINE_WIDTH 592-121
|
|
|
|
#define MESSAGE_WIDTH 528 - 125
|
|
#define MESSAGE_COLOR FONT_BLACK
|
|
#define MESSAGE_GAP 2
|
|
|
|
#define MESSAGE_HEADER_WIDTH 209-151
|
|
#define MESSAGE_HEADER_X VIEWER_X+4
|
|
|
|
#define VIEWER_HEAD_X iScreenWidthOffset + 140
|
|
#define VIEWER_HEAD_Y iScreenHeightOffset + 9
|
|
#define VIEWER_HEAD_WIDTH 445-VIEWER_HEAD_X
|
|
#define MAX_BUTTON_COUNT 1
|
|
#define VIEWER_WIDTH 500
|
|
#define VIEWER_HEIGHT 195
|
|
|
|
#define MESSAGEX_X iScreenWidthOffset + 425
|
|
#define MESSAGEX_Y iScreenHeightOffset + 6
|
|
|
|
#define EMAIL_WARNING_X iScreenWidthOffset + 210
|
|
#define EMAIL_WARNING_Y iScreenHeightOffset + 140
|
|
#define EMAIL_WARNING_WIDTH 254
|
|
#define EMAIL_WARNING_HEIGHT 138
|
|
|
|
#define NEW_BTN_X EMAIL_WARNING_X +(338-245)
|
|
#define NEW_BTN_Y EMAIL_WARNING_Y +(278-195)
|
|
|
|
#define EMAIL_TEXT_FONT FONT10ARIAL
|
|
#define TRAVERSE_EMAIL_FONT FONT14ARIAL
|
|
#define EMAIL_BOX_FONT FONT14ARIAL
|
|
#define MESSAGE_FONT EMAIL_TEXT_FONT
|
|
#define EMAIL_HEADER_FONT FONT14ARIAL
|
|
#define EMAIL_WARNING_FONT FONT12ARIAL
|
|
|
|
|
|
// the max number of pages to an email
|
|
#define MAX_NUMBER_EMAIL_PAGES 100
|
|
|
|
#define PREVIOUS_PAGE 0
|
|
#define NEXT_PAGE 1
|
|
|
|
#define NEXT_PAGE_X LAPTOP_UL_X + 562
|
|
#define NEXT_PAGE_Y iScreenHeightOffset + 51
|
|
|
|
#define PREVIOUS_PAGE_X NEXT_PAGE_X - 21
|
|
#define PREVIOUS_PAGE_Y NEXT_PAGE_Y
|
|
|
|
#define ENVELOPE_BOX_X iScreenWidthOffset + 116
|
|
|
|
#define FROM_BOX_X iScreenWidthOffset + 166
|
|
#define FROM_BOX_WIDTH 246-160
|
|
|
|
#define SUBJECT_BOX_X iScreenWidthOffset + 276
|
|
#define SUBJECT_BOX_WIDTH 528-249
|
|
|
|
#define DATE_BOX_X iScreenWidthOffset + 530
|
|
#define DATE_BOX_WIDTH 594-530
|
|
|
|
#define FROM_BOX_Y iScreenHeightOffset + 51 + EMAIL_TOP_BAR_HEIGHT
|
|
#define TOP_HEIGHT 118-95
|
|
|
|
#define EMAIL_TITLE_FONT FONT14ARIAL
|
|
#define EMAIL_TITLE_X iScreenWidthOffset + 140
|
|
#define EMAIL_TITLE_Y iScreenHeightOffset + 33
|
|
#define VIEWER_MESSAGE_BODY_START_Y VIEWER_Y+72
|
|
#define MIN_MESSAGE_HEIGHT_IN_LINES 5
|
|
|
|
|
|
#define INDENT_Y_OFFSET 310
|
|
#define INDENT_X_OFFSET 325
|
|
#define INDENT_X_WIDTH 544 - 481
|
|
|
|
// the position of the page number being displayed in the email program
|
|
#define PAGE_NUMBER_X iScreenWidthOffset + 516
|
|
#define PAGE_NUMBER_Y iScreenHeightOffset + 58
|
|
|
|
// defines for location of message 'title'/'headers'
|
|
|
|
#define MESSAGE_FROM_Y VIEWER_Y+28
|
|
|
|
#define MESSAGE_DATE_Y MESSAGE_FROM_Y
|
|
|
|
#define MESSAGE_SUBJECT_Y MESSAGE_DATE_Y+16
|
|
|
|
|
|
#define SUBJECT_LINE_X VIEWER_X+47
|
|
#define SUBJECT_LINE_Y VIEWER_Y+42
|
|
#define SUBJECT_LINE_WIDTH 278-47
|
|
|
|
|
|
// maximum size of a email message page, so not to overrun the bottom of the screen
|
|
#define MAX_EMAIL_MESSAGE_PAGE_SIZE ( GetFontHeight( MESSAGE_FONT ) + MESSAGE_GAP ) * 20
|
|
enum{
|
|
PREVIOUS_BUTTON=0,
|
|
NEXT_BUTTON,
|
|
};
|
|
|
|
|
|
// X button position
|
|
#define BUTTON_X VIEWER_X + 396
|
|
#define BUTTON_Y VIEWER_Y + 3
|
|
#define BUTTON_LOWER_Y BUTTON_Y + 22
|
|
#define PREVIOUS_PAGE_BUTTON_X VIEWER_X + 302
|
|
#define NEXT_PAGE_BUTTON_X VIEWER_X +395
|
|
#define DELETE_BUTTON_X NEXT_PAGE_BUTTON_X
|
|
#define LOWER_BUTTON_Y BUTTON_Y + 299
|
|
|
|
|
|
BOOLEAN fSortDateUpwards = FALSE;
|
|
BOOLEAN fSortSenderUpwards = FALSE;
|
|
BOOLEAN fSortSubjectUpwards = FALSE;
|
|
BOOLEAN gfPageButtonsWereCreated = FALSE;
|
|
|
|
// mouse regions
|
|
MOUSE_REGION pEmailRegions[MAX_MESSAGES_PAGE];
|
|
extern MOUSE_REGION pScreenMask; // symbol already defined in laptop.cpp (jonathanl)
|
|
MOUSE_REGION pDeleteScreenMask;
|
|
MOUSE_REGION pMailViewMessageRegion;
|
|
|
|
// the email info struct to speed up email
|
|
EmailPageInfoStruct pEmailPageInfo[ MAX_NUMBER_EMAIL_PAGES ];
|
|
|
|
//buttons
|
|
INT32 giMessageButton[MAX_BUTTON_COUNT];
|
|
INT32 giMessageButtonImage[MAX_BUTTON_COUNT];
|
|
INT32 giDeleteMailButton[2];
|
|
INT32 giDeleteMailButtonImage[2];
|
|
INT32 giSortButton[4];
|
|
INT32 giSortButtonImage[4];
|
|
INT32 giNewMailButton[1];
|
|
INT32 giNewMailButtonImage[1];
|
|
INT32 giMailMessageButtons[3];
|
|
INT32 giMailMessageButtonsImage[3];
|
|
INT32 giMailPageButtons[ 2 ];
|
|
INT32 giMailPageButtonsImage[ 2 ];
|
|
|
|
|
|
// mouse regions
|
|
MOUSE_REGION pEmailMoveRegions[NEXT_BUTTON+1];
|
|
MOUSE_REGION pSortMailRegions[3];
|
|
|
|
// the message record list, for the currently displayed message
|
|
RecordPtr pMessageRecordList=NULL;
|
|
|
|
// video handles
|
|
UINT32 guiEmailTitle;
|
|
UINT32 guiEmailStamp;
|
|
UINT32 guiEmailBackground;
|
|
UINT32 guiEmailIndicator;
|
|
UINT32 guiEmailMessage;
|
|
UINT32 guiMAILDIVIDER;
|
|
|
|
INT16 giCurrentIMPSlot = PLAYER_GENERATED_CHARACTER_ID;
|
|
EMAIL_MERC_AVAILABLE_VALUES EmailMercAvailableText[NUM_PROFILES];
|
|
EMAIL_MERC_LEVEL_UP_VALUES EmailMercLevelUpText[NUM_PROFILES];
|
|
EMAIL_OTHER_VALUES EmailOtherText[EMAIL_INDEX];
|
|
BOOLEAN ReadXMLEmail = TRUE; // TRUE - read email from XML, FALSE - read email from EDT
|
|
EMAIL_TYPE gEmailT[EMAIL_VAL];
|
|
std::vector<EMAIL_XML> gEmails{};
|
|
BOOLEAN SaveNewEmailDataToSaveGameFile( HWFILE hFile );
|
|
BOOLEAN LoadNewEmailDataFromLoadGameFile( HWFILE hFile );
|
|
|
|
// the enumeration of headers
|
|
enum{
|
|
FROM_HEADER=0,
|
|
SUBJECT_HEADER,
|
|
RECD_HEADER,
|
|
};
|
|
|
|
|
|
// position of header text on the email list
|
|
#define FROM_X iScreenWidthOffset + 205
|
|
#define FROM_Y FROM_BOX_Y + 5
|
|
#define SUBJECTHEAD_X iScreenWidthOffset + 368
|
|
#define RECD_X iScreenWidthOffset + 550
|
|
|
|
// size of prev/next strings
|
|
#define PREVIOUS_WIDTH StringPixLength(pTraverseStrings[PREVIOUS_BUTTON], TRAVERSE_EMAIL_FONT)
|
|
#define NEXT_WIDTH StringPixLength(pTraverseStrings[NEXT_BUTTON], TRAVERSE_EMAIL_FONT)
|
|
#define PREVIOUS_HEIGHT GetFontHeight(TRAVERSE_EMAIL_FONT)
|
|
#define NEXT_HEIGHT GetFontHeight(TRAVERSE_EMAIL_FONT)
|
|
|
|
|
|
// current line in the email list that is highlighted, -1 is no line highlighted
|
|
INT32 iHighLightLine=-1;
|
|
|
|
// whther or not we need to redraw the new mail box
|
|
BOOLEAN fReDrawNewMailFlag = FALSE;
|
|
INT32 giNumberOfMessageToEmail = 0;
|
|
INT32 iTotalHeight = 0;
|
|
|
|
// function list
|
|
void SwapMessages(INT32 iIdA, INT32 iIdB);
|
|
void PlaceMessagesinPages();
|
|
BOOLEAN fFirstTime=TRUE;
|
|
void EmailBtnCallBack(MOUSE_REGION * pRegion, INT32 iReason );
|
|
void EmailMvtCallBack(MOUSE_REGION * pRegion, INT32 iReason );
|
|
void PreviousRegionButtonCallback(GUI_BUTTON *btn,INT32 reason);
|
|
void NextRegionButtonCallback(GUI_BUTTON *btn,INT32 reason);
|
|
void SetUnNewMessages();
|
|
INT32 DisplayEmailMessage(EmailPtr pMail);
|
|
void AddDeleteRegionsToMessageRegion(INT32 iViewerY);
|
|
void DetermineNextPrevPageDisplay();
|
|
void CreateDestroyNextPreviousRegions();
|
|
void ReDraw();
|
|
void DeleteEmail();
|
|
BOOLEAN DisplayDeleteNotice(EmailPtr pMail);
|
|
void CreateDestroyDeleteNoticeMailButton();
|
|
void SetUpSortRegions();
|
|
void DeleteSortRegions();
|
|
void DisplayTextOnTitleBar( void );
|
|
void DisplayEmailMessageSubjectDateFromLines( EmailPtr pMail, INT32 iViewerY );
|
|
void DrawEmailMessageDisplayTitleText( INT32 iViewerY );
|
|
void CreateMailScreenButtons( void );
|
|
void DestroyMailScreenButtons( void );
|
|
void DrawLineDividers( void );
|
|
void FromCallback(GUI_BUTTON *btn, INT32 iReason );
|
|
void SubjectCallback(GUI_BUTTON *btn, INT32 iReason );
|
|
void DateCallback(GUI_BUTTON *btn, INT32 iReason );
|
|
void ReadCallback(GUI_BUTTON *btn, INT32 iReason );
|
|
void BtnPreviousEmailPageCallback(GUI_BUTTON *btn,INT32 reason);
|
|
void BtnNextEmailPageCallback(GUI_BUTTON *btn,INT32 reason);
|
|
void ViewMessageRegionCallBack( MOUSE_REGION * pRegion, INT32 iReason );
|
|
void DisplayEmailList();
|
|
void ClearOutEmailMessageRecordsList( void );
|
|
void AddEmailRecordToList( STR16 pString );
|
|
void UpDateMessageRecordList( void );
|
|
void HandleAnySpecialEmailMessageEvents(INT32 iMessageId );
|
|
BOOLEAN HandleMailSpecialMessages( UINT16 usMessageId, INT32 *iResults, EmailPtr pMail );
|
|
#ifdef JA2UB
|
|
BOOLEAN HandleNewUBMailSpecialMessages( UINT16 usMessageId, INT32 *iResults, EmailPtr pMail );
|
|
void AddBobbyREmailJA2(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType );
|
|
#endif
|
|
void HandleIMPCharProfileResultsMessage( void );
|
|
void HandleEmailViewerButtonStates( void );
|
|
void SetUpIconForButton( void );
|
|
void DeleteCurrentMessage( void );
|
|
void BtnDeleteCallback(GUI_BUTTON *btn, INT32 iReason );
|
|
void CreateNextPreviousEmailPageButtons( void );
|
|
void UpdateStatusOfNextPreviousButtons( void );
|
|
void DisplayWhichPageOfEmailProgramIsDisplayed( void );
|
|
void OpenMostRecentUnreadEmail( void );
|
|
BOOLEAN DisplayNumberOfPagesToThisEmail( INT32 iViewerY );
|
|
INT32 GetNumberOfPagesToEmail( );
|
|
void PreProcessEmail( EmailPtr pMail );
|
|
void ModifyInsuranceEmails( UINT16 usMessageId, INT32 *iResults, EmailPtr pMail );
|
|
BOOLEAN ReplaceMercNameAndAmountWithProperData( CHAR16 *pFinishedString, EmailPtr pMail );
|
|
BOOLEAN ReplaceBiffNameWithProperMercName( CHAR16 *pFinishedString, EmailPtr pMail, CHAR16 *pMercName );
|
|
extern INT16 gusCurShipmentDestinationID;
|
|
extern CPostalService gPostalService;
|
|
|
|
|
|
static void InitializeMouseRegions()
|
|
{
|
|
INT32 iCounter=0;
|
|
|
|
// init mouseregions
|
|
for(iCounter=0; iCounter <MAX_MESSAGES_PAGE; iCounter++)
|
|
{
|
|
MSYS_DefineRegion(&pEmailRegions[iCounter],MIDDLE_X ,((INT16)(MIDDLE_Y+iCounter*MIDDLE_WIDTH)), MIDDLE_X+LINE_WIDTH ,(INT16)(MIDDLE_Y+iCounter*MIDDLE_WIDTH+MIDDLE_WIDTH),
|
|
MSYS_PRIORITY_NORMAL+2,MSYS_NO_CURSOR, EmailMvtCallBack, EmailBtnCallBack );
|
|
MSYS_AddRegion(&pEmailRegions[iCounter]);
|
|
MSYS_SetRegionUserData(&pEmailRegions[iCounter],0,iCounter);
|
|
}
|
|
|
|
//SetUpSortRegions();
|
|
|
|
CreateDestroyNextPreviousRegions();
|
|
}
|
|
|
|
static void DeleteEmailMouseRegions()
|
|
{
|
|
|
|
// this function will remove the mouse regions added
|
|
INT32 iCounter=0;
|
|
|
|
|
|
for(iCounter=0; iCounter <MAX_MESSAGES_PAGE; iCounter++)
|
|
{
|
|
MSYS_RemoveRegion( &pEmailRegions[iCounter]);
|
|
}
|
|
//DeleteSortRegions();
|
|
CreateDestroyNextPreviousRegions();
|
|
|
|
}
|
|
void GameInitEmail()
|
|
{
|
|
pEmailList=NULL;
|
|
pPageList=NULL;
|
|
|
|
iLastPage=-1;
|
|
|
|
iCurrentPage=0;
|
|
iDeleteId=0;
|
|
|
|
// reset display message flag
|
|
fDisplayMessageFlag=FALSE;
|
|
|
|
// reset page being displayed
|
|
giMessagePage = 0;
|
|
}
|
|
|
|
BOOLEAN EnterEmail()
|
|
{
|
|
VOBJECT_DESC VObjectDesc;
|
|
// load graphics
|
|
|
|
iCurrentPage = LaptopSaveInfo.iCurrentEmailPage;
|
|
|
|
// title bar
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
FilenameForBPP("LAPTOP\\programtitlebar.sti", VObjectDesc.ImageFile);
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiEmailTitle));
|
|
|
|
// the list background
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
FilenameForBPP("LAPTOP\\Mailwindow.sti", VObjectDesc.ImageFile);
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiEmailBackground));
|
|
|
|
// the indication/notification box
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
FilenameForBPP("LAPTOP\\MailIndicator.sti", VObjectDesc.ImageFile);
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiEmailIndicator));
|
|
|
|
// the message background
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
FilenameForBPP("LAPTOP\\emailviewer.sti", VObjectDesc.ImageFile);
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiEmailMessage));
|
|
|
|
// the message background
|
|
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
FilenameForBPP("LAPTOP\\maillistdivider.sti", VObjectDesc.ImageFile);
|
|
CHECKF(AddVideoObject(&VObjectDesc, &guiMAILDIVIDER));
|
|
|
|
//AddEmail(IMP_EMAIL_PROFILE_RESULTS, IMP_EMAIL_PROFILE_RESULTS_LENGTH, IMP_PROFILE_RESULTS, GetWorldTotalMin( ), -1, -1 );
|
|
// initialize mouse regions
|
|
InitializeMouseRegions();
|
|
|
|
// just started email
|
|
fJustStartedEmail = TRUE;
|
|
|
|
// create buttons
|
|
CreateMailScreenButtons( );
|
|
|
|
// marks these buttons dirty
|
|
MarkButtonsDirty( );
|
|
|
|
// no longer fitrst time in email
|
|
fFirstTime = FALSE;
|
|
|
|
// reset current page of the message being displayed
|
|
giMessagePage = 0;
|
|
|
|
// render email background and text
|
|
RenderEmail();
|
|
|
|
//AddEmail( MERC_REPLY_GRIZZLY, MERC_REPLY_LENGTH_GRIZZLY, GRIZZLY_MAIL, GetWorldTotalMin(), -1, -1 );
|
|
//RenderButtons( );
|
|
|
|
return( TRUE );
|
|
}
|
|
|
|
void ExitEmail()
|
|
{
|
|
LaptopSaveInfo.iCurrentEmailPage = iCurrentPage;
|
|
|
|
// clear out message record list
|
|
ClearOutEmailMessageRecordsList( );
|
|
|
|
// displayed message?...get rid of it
|
|
if(fDisplayMessageFlag)
|
|
{
|
|
fDisplayMessageFlag = FALSE;
|
|
AddDeleteRegionsToMessageRegion( 0 );
|
|
fDisplayMessageFlag = TRUE;
|
|
fReDrawMessageFlag = TRUE;
|
|
}
|
|
else
|
|
{
|
|
giMessageId = -1;
|
|
}
|
|
|
|
// delete mail notice?...get rid of it
|
|
if(fDeleteMailFlag)
|
|
{
|
|
fDeleteMailFlag=FALSE;
|
|
CreateDestroyDeleteNoticeMailButton();
|
|
}
|
|
|
|
// remove all mouse regions in use in email
|
|
DeleteEmailMouseRegions();
|
|
|
|
// reset flags of new messages
|
|
SetUnNewMessages();
|
|
|
|
// remove video objects being used by email screen
|
|
DeleteVideoObjectFromIndex(guiEmailTitle);
|
|
DeleteVideoObjectFromIndex(guiEmailBackground);
|
|
DeleteVideoObjectFromIndex(guiMAILDIVIDER);
|
|
DeleteVideoObjectFromIndex(guiEmailIndicator);
|
|
DeleteVideoObjectFromIndex(guiEmailMessage);
|
|
|
|
// remove buttons
|
|
DestroyMailScreenButtons( );
|
|
}
|
|
|
|
void HandleEmail( void )
|
|
{
|
|
INT32 iViewerY = 0;
|
|
static BOOLEAN fEmailListBeenDrawAlready = FALSE;
|
|
//RenderButtonsFastHelp( );
|
|
|
|
// check if email message record list needs to be updated
|
|
UpDateMessageRecordList( );
|
|
|
|
// does email list need to be draw, or can be drawn
|
|
if( ( (!fDisplayMessageFlag)&&(!fNewMailFlag) && ( !fDeleteMailFlag ) )&&( fEmailListBeenDrawAlready == FALSE ) )
|
|
{
|
|
DisplayEmailList();
|
|
fEmailListBeenDrawAlready = TRUE;
|
|
}
|
|
// if the message flag, show message
|
|
else if((fDisplayMessageFlag)&&(fReDrawMessageFlag))
|
|
{
|
|
// redisplay list
|
|
DisplayEmailList();
|
|
|
|
// this simply redraws message without button manipulation
|
|
iViewerY = DisplayEmailMessage(GetEmailMessage(giMessageId));
|
|
fEmailListBeenDrawAlready = FALSE;
|
|
}
|
|
else if((fDisplayMessageFlag)&&(!fOldDisplayMessageFlag))
|
|
{
|
|
// redisplay list
|
|
DisplayEmailList();
|
|
|
|
// this simply redraws message with button manipulation
|
|
iViewerY = DisplayEmailMessage(GetEmailMessage(giMessageId));
|
|
AddDeleteRegionsToMessageRegion( iViewerY );
|
|
fEmailListBeenDrawAlready = FALSE;
|
|
|
|
}
|
|
|
|
// not displaying anymore?
|
|
if( ( fDisplayMessageFlag == FALSE ) && ( fOldDisplayMessageFlag ) )
|
|
{
|
|
// then clear it out
|
|
ClearOutEmailMessageRecordsList( );
|
|
}
|
|
|
|
// if new message is being displayed...check to see if it's buttons need to be created or destroyed
|
|
AddDeleteRegionsToMessageRegion( 0 );
|
|
|
|
// same with delete notice
|
|
CreateDestroyDeleteNoticeMailButton();
|
|
|
|
// if delete notice needs to be displayed?...display it
|
|
if(fDeleteMailFlag)
|
|
DisplayDeleteNotice(GetEmailMessage(iDeleteId));
|
|
|
|
// update buttons
|
|
HandleEmailViewerButtonStates( );
|
|
|
|
// set up icons for buttons
|
|
SetUpIconForButton( );
|
|
|
|
// redraw screen
|
|
//ReDraw();
|
|
|
|
//redraw headers to sort buttons
|
|
DisplayEmailHeaders( );
|
|
|
|
// handle buttons states
|
|
UpdateStatusOfNextPreviousButtons( );
|
|
|
|
if( fOpenMostRecentUnReadFlag == TRUE )
|
|
{
|
|
// enter email due to email icon on program panel
|
|
OpenMostRecentUnreadEmail( );
|
|
fOpenMostRecentUnReadFlag = FALSE;
|
|
|
|
}
|
|
}
|
|
|
|
void DisplayEmailHeaders( void )
|
|
{
|
|
// draw the text at the top of the screen
|
|
|
|
// font stuff
|
|
SetFont(EMAIL_WARNING_FONT);
|
|
SetFontShadow(NO_SHADOW);
|
|
SetFontForeground(FONT_BLACK);
|
|
SetFontBackground(FONT_BLACK);
|
|
|
|
// draw headers to the email list the player sees
|
|
|
|
// sender text
|
|
//mprintf(FROM_X, FROM_Y, pEmailHeaders[FROM_HEADER]);
|
|
|
|
// subject text
|
|
//mprintf(SUBJECTHEAD_X, FROM_Y, pEmailHeaders[SUBJECT_HEADER]);
|
|
|
|
// date re'vd
|
|
//mprintf(RECD_X, FROM_Y, pEmailHeaders[RECD_HEADER]);
|
|
|
|
// reset shadow
|
|
SetFontShadow(DEFAULT_SHADOW);
|
|
}
|
|
|
|
void RenderEmail( void )
|
|
{
|
|
HVOBJECT hHandle;
|
|
|
|
// get and blt the email list background
|
|
GetVideoObject( &hHandle, guiEmailBackground );
|
|
|
|
BltVideoObject( FRAME_BUFFER, hHandle, 0,LAPTOP_SCREEN_UL_X, LAPTOP_SCREEN_UL_Y + 22, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
// get and blt the email title bar
|
|
GetVideoObject( &hHandle, guiEmailTitle );
|
|
BltVideoObject( FRAME_BUFFER, hHandle, 0,LAPTOP_SCREEN_UL_X, LAPTOP_SCREEN_UL_Y - 2, VO_BLT_SRCTRANSPARENCY,NULL );
|
|
|
|
// show text on titlebar
|
|
DisplayTextOnTitleBar( );
|
|
|
|
// redraw list if no graphics are being displayed on top of it
|
|
//if((!fDisplayMessageFlag)&&(!fNewMailFlag))
|
|
//{
|
|
DisplayEmailList( );
|
|
//}
|
|
|
|
// redraw line dividers
|
|
DrawLineDividers( );
|
|
|
|
// show next/prev page buttons depending if there are next/prev page
|
|
//DetermineNextPrevPageDisplay( );
|
|
|
|
// draw headers for buttons
|
|
DisplayEmailHeaders();
|
|
|
|
// display border
|
|
GetVideoObject(&hHandle, guiLaptopBACKGROUND);
|
|
|
|
BltVideoObject(FRAME_BUFFER, hHandle, 0, iScreenWidthOffset + 108, iScreenHeightOffset + 23, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
ReDisplayBoxes( );
|
|
|
|
BlitTitleBarIcons( );
|
|
|
|
// show which page we are on
|
|
DisplayWhichPageOfEmailProgramIsDisplayed( );
|
|
|
|
InvalidateRegion(0,0,SCREEN_WIDTH, SCREEN_HEIGHT);
|
|
// invalidate region to force update
|
|
}
|
|
|
|
//--
|
|
|
|
void AddEmailWithSpecialData(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iFirstData, UINT32 uiSecondData, UINT8 EmailType, UINT32 EmailAIM, UINT16 EnumEmailXML)
|
|
{
|
|
if ( EnumEmailXML != XML_NOEMAIL && gEmails.size() > 0 )
|
|
{
|
|
AddEmailWithSpecialDataXML(EnumEmailXML, iDate, -1, -1, false, iFirstData, uiSecondData, iMessageOffset, -1, -1, -1);
|
|
}
|
|
else
|
|
{
|
|
CHAR16 pSubject[MAIL_STRING_SIZE];
|
|
Email FakeEmail;
|
|
// starts at iSubjectOffset amd goes iSubjectLength, reading in string
|
|
#ifdef JA2UB
|
|
if ( EmailType == TYPE_EMAIL_EMAIL_EDT )
|
|
{
|
|
if ( FileExists(EMAIL_EDT_FILE_JA25) )
|
|
{
|
|
LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE);
|
|
}
|
|
else
|
|
{
|
|
LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE);
|
|
}
|
|
}
|
|
else if ( EmailType == TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT || EmailType == TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT )
|
|
{
|
|
LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE);
|
|
}
|
|
#else
|
|
LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE);
|
|
#endif
|
|
|
|
//Make a fake email that will contain the codes ( ie the merc ID )
|
|
FakeEmail.iFirstData = iFirstData;
|
|
FakeEmail.uiSecondData = uiSecondData;
|
|
|
|
//Replace the $mercname$ with the actual mercname
|
|
ReplaceMercNameAndAmountWithProperData(pSubject, &FakeEmail);
|
|
|
|
// add message to list
|
|
AddEmailMessage(iMessageOffset, iMessageLength, pSubject, iDate, ubSender, FALSE, iFirstData, uiSecondData, 0, 0, 0, 0, -1, -1, EmailType, EmailAIM);
|
|
|
|
// if we are in fact in the laptop, redraw icons, might be change in mail status
|
|
if ( fCurrentlyInLaptop == TRUE )
|
|
{
|
|
// redraw icons, might be new mail
|
|
DrawLapTopIcons();
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
//--- XML Read Mail ---
|
|
void AddEmailWithSpecialDataXML(INT32 iMessageOffset, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, BOOLEAN alreadyRead, INT32 iFirstData, UINT32 uiSecondData, INT32 iThirdData, INT32 iFourthData, UINT32 uiFifthData, UINT32 uiSixData)
|
|
{
|
|
CHAR16 pSubject[MAIL_STRING_SIZE];
|
|
Email FakeEmail;
|
|
|
|
if ( iMessageOffset < gEmails.size() )
|
|
{
|
|
auto& email = gEmails[iMessageOffset];
|
|
wcscpy( pSubject, email.Subject);
|
|
|
|
//Make a fake email that will contain the codes ( ie the merc ID )
|
|
FakeEmail.iFirstData = iFirstData;
|
|
FakeEmail.uiSecondData = uiSecondData;
|
|
|
|
//Replace the $mercname$ with the actual mercname
|
|
ReplaceMercNameAndAmountWithProperData( pSubject, &FakeEmail );
|
|
|
|
// add message to list
|
|
AddEmailMessage(iMessageOffset, email.Messages.size(), pSubject, iDate, email.Sender, false, iFirstData, uiSecondData, iThirdData, iFourthData, uiFifthData, uiSixData, iCurrentIMPPosition, iCurrentShipmentDestinationID, TYPE_EMAIL_XML, TYPE_E_NONE);
|
|
|
|
// if we are in fact in the laptop, redraw icons, might be change in mail status
|
|
if( fCurrentlyInLaptop == TRUE )
|
|
{
|
|
// redraw icons, might be new mail
|
|
DrawLapTopIcons();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ScreenMsg(FONT_LTRED, MSG_INTERFACE, L"%s%d %s", L"Tried to add email #", iMessageOffset, L"but could not find it in Emails.xml! If playing unmodded 1.13, please report this at https://github.com/1dot13/source/issues");
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void AddPreReadEmailTypeXML( INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, UINT8 EmailType )
|
|
{
|
|
CHAR16 pSubject[320];
|
|
wcscpy( pSubject, L"None" );
|
|
|
|
UINT8 subjectLine = 0;
|
|
if ( EmailType == TYPE_EMAIL_AIM_AVAILABLE )
|
|
{
|
|
if (EmailMercAvailableText[subjectLine].szSubject !='\0')
|
|
wcscpy( pSubject, EmailMercAvailableText[ubSender].szSubject );
|
|
}
|
|
else if ( EmailType == TYPE_EMAIL_MERC_LEVEL_UP )
|
|
{
|
|
if (EmailMercLevelUpText[subjectLine].szSubject !='\0')
|
|
wcscpy( pSubject, EmailMercLevelUpText[ubSender].szSubject );
|
|
}
|
|
|
|
// add message to list
|
|
AddEmailMessage( iMessageOffset,iMessageLength, pSubject, iDate, ubSender, TRUE, 0, 0, 0, 0, 0, 0, -1, -1 , EmailType, TYPE_E_NONE );
|
|
|
|
// if we are in fact int he laptop, redraw icons, might be change in mail status
|
|
|
|
if( fCurrentlyInLaptop )
|
|
{
|
|
// redraw icons, might be new mail
|
|
DrawLapTopIcons();
|
|
}
|
|
}
|
|
|
|
void AddEmailTypeXML( INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, UINT8 EmailType )
|
|
{
|
|
CHAR16 pSubject[320];
|
|
wcscpy( pSubject, L"None" );
|
|
|
|
if ( EmailType == TYPE_EMAIL_AIM_AVAILABLE )
|
|
{
|
|
if (EmailMercAvailableText[ubSender].szSubject !='\0')
|
|
wcscpy( pSubject, EmailMercAvailableText[ubSender].szSubject );
|
|
}
|
|
else if ( EmailType == TYPE_EMAIL_MERC_LEVEL_UP )
|
|
{
|
|
if (EmailMercLevelUpText[ubSender].szSubject !='\0')
|
|
wcscpy( pSubject, EmailMercLevelUpText[ubSender].szSubject );
|
|
}
|
|
|
|
AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, 0, 0, 0, 0, iCurrentIMPPosition, -1, EmailType, TYPE_E_NONE);
|
|
|
|
// if we are in fact in the laptop, redraw icons, might be change in mail status
|
|
if( fCurrentlyInLaptop )
|
|
{
|
|
// redraw icons, might be new mail
|
|
DrawLapTopIcons();
|
|
}
|
|
}
|
|
|
|
void AddEmailFromXML(INT32 iMessageOffset, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, BOOLEAN alreadyRead, INT32 iFirstData, UINT32 uiSecondData, INT32 iThirdData, INT32 iFourthData, UINT32 uiFifthData, UINT32 uiSixData)
|
|
{
|
|
if ( iMessageOffset < gEmails.size() )
|
|
{
|
|
auto& email = gEmails[iMessageOffset];
|
|
AddEmailMessage(iMessageOffset, email.Messages.size(), email.Subject, iDate, email.Sender, alreadyRead, iFirstData, uiSecondData, iThirdData, iFourthData, uiFifthData, uiSixData, iCurrentIMPPosition, iCurrentShipmentDestinationID, TYPE_EMAIL_XML, TYPE_E_NONE);
|
|
|
|
// if we are in fact in the laptop, redraw icons, might be change in mail status
|
|
if ( fCurrentlyInLaptop == TRUE )
|
|
{
|
|
// redraw icons, might be new mail
|
|
DrawLapTopIcons();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ScreenMsg(FONT_LTRED, MSG_INTERFACE, L"%s%d %s", L"Tried to add email #", iMessageOffset, L"but could not find it in Emails.xml! If playing unmodded 1.13, please report this at https://github.com/1dot13/source/issues");
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef JA2UB
|
|
void AddBobbyREmailJA2(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType )
|
|
{
|
|
CHAR16 pSubject[MAIL_STRING_SIZE];
|
|
UINT8 subjectLine = 0;
|
|
|
|
LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, MAIL_STRING_SIZE*(iMessageOffset), MAIL_STRING_SIZE);
|
|
|
|
// add message to list
|
|
AddEmailMessage(iMessageOffset, iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, -1, -1, -1, -1, iCurrentIMPPosition, iCurrentShipmentDestinationID, EmailType, TYPE_EMAIL_BOBBY_R_L1);
|
|
|
|
// if we are in fact int he laptop, redraw icons, might be change in mail status
|
|
|
|
if( fCurrentlyInLaptop == TRUE )
|
|
{
|
|
// redraw icons, might be new mail
|
|
DrawLapTopIcons();
|
|
}
|
|
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
//--- End XML Read Mail ---
|
|
|
|
void AddEmailWFMercAvailable(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, UINT8 EmailType)
|
|
{
|
|
CHAR16 pSubject[320];
|
|
|
|
UINT8 subjectLine = 0;
|
|
|
|
// WF mercs
|
|
if (iMessageLength < 178) // -> see: New113AIMMercMailTexts
|
|
subjectLine = (iMessageLength - 170) * 2;
|
|
// Generic mercs
|
|
else
|
|
subjectLine = 16; // -> see: New113AIMMercMailTexts
|
|
|
|
wcscpy( pSubject, New113AIMMercMailTexts[subjectLine] );
|
|
|
|
AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, 0, 0, 0, 0, iCurrentIMPPosition, -1 , EmailType, TYPE_E_NONE);
|
|
|
|
// if we are in fact int he laptop, redraw icons, might be change in mail status
|
|
|
|
if( fCurrentlyInLaptop == TRUE )
|
|
{
|
|
// redraw icons, might be new mail
|
|
DrawLapTopIcons();
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType, UINT16 EnumEmailXML)
|
|
{
|
|
CHAR16 pSubject[MAIL_STRING_SIZE];
|
|
UINT8 subjectLine = 0;
|
|
|
|
if ( EnumEmailXML != XML_NOEMAIL && gEmails.size() > 0 )
|
|
{
|
|
AddEmailFromXML(EnumEmailXML, iDate, iCurrentIMPPosition, iCurrentShipmentDestinationID, false, -1, -1, iMessageOffset, -1, -1, -1);
|
|
}
|
|
else
|
|
{
|
|
#ifdef JA2UB
|
|
if ( EmailType == TYPE_EMAIL_EMAIL_EDT )
|
|
{
|
|
if ( FileExists(EMAIL_EDT_FILE_JA25) )
|
|
LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE);
|
|
else
|
|
LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE);
|
|
}
|
|
else if ( EmailType == TYPE_EMAIL_BOBBY_R_EMAIL_JA2_EDT || EmailType == TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT || EmailType == TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT )
|
|
{
|
|
LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE);
|
|
}
|
|
else if ( EmailType == TYPE_EMAIL_BOBBY_R )
|
|
{
|
|
/* if (EmailBobbyRText[0] !='\0')
|
|
wcscpy( pSubject, EmailBobbyRText[0] );
|
|
else
|
|
wcscpy( pSubject, L"None" );
|
|
*/
|
|
}
|
|
// add message to list
|
|
AddEmailMessage(iMessageOffset, iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, 0, 0, 0, 0, iCurrentIMPPosition, iCurrentShipmentDestinationID, EmailType, TYPE_E_NONE);
|
|
|
|
#else
|
|
|
|
// WANNE: Short work in both ways
|
|
LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE);
|
|
// add message to list
|
|
AddEmailMessage(iMessageOffset, iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, 0, 0, 0, 0, iCurrentIMPPosition, iCurrentShipmentDestinationID, EmailType, TYPE_E_NONE);
|
|
#endif
|
|
|
|
// if we are in fact in the laptop, redraw icons, might be change in mail status
|
|
if ( fCurrentlyInLaptop == TRUE )
|
|
{
|
|
// redraw icons, might be new mail
|
|
DrawLapTopIcons();
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
void AddPreReadEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, UINT8 EmailType)
|
|
{
|
|
CHAR16 pSubject[MAIL_STRING_SIZE];
|
|
|
|
#ifdef JA2UB
|
|
if ( EmailType == TYPE_EMAIL_EMAIL_EDT )
|
|
{
|
|
if ( FileExists(EMAIL_EDT_FILE_JA25) )
|
|
LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE);
|
|
else
|
|
LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE);
|
|
}
|
|
else if ( EmailType == TYPE_EMAIL_BOBBY_R_EMAIL_JA2_EDT || EmailType == TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT || EmailType == TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT )
|
|
{
|
|
LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE);
|
|
}
|
|
|
|
// add message to list
|
|
AddEmailMessage(iMessageOffset, iMessageLength, pSubject, iDate, ubSender, TRUE, 0, 0, 0, 0, 0, 0, -1, -1, EmailType, TYPE_E_NONE);
|
|
|
|
#else
|
|
|
|
// starts at iSubjectOffset amd goes iSubjectLength, reading in string
|
|
LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE);
|
|
// add message to list
|
|
AddEmailMessage(iMessageOffset, iMessageLength, pSubject, iDate, ubSender, TRUE, 0, 0, 0, 0, 0, 0, -1, -1, EmailType, TYPE_E_NONE);
|
|
#endif
|
|
|
|
// if we are in fact in the laptop, redraw icons, might be change in mail status
|
|
if ( fCurrentlyInLaptop == TRUE )
|
|
{
|
|
// redraw icons, might be new mail
|
|
DrawLapTopIcons();
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void AddEmailMessage(INT32 iMessageOffset, INT32 iMessageLength,STR16 pSubject, INT32 iDate, UINT8 ubSender, BOOLEAN fAlreadyRead, INT32 iFirstData, UINT32 uiSecondData, INT32 iThirdData, INT32 iFourthData, UINT32 uiFifthData, UINT32 uiSixData, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType, UINT32 EmailAIM )
|
|
{
|
|
// will add a message to the list of messages
|
|
EmailPtr pEmail=pEmailList;
|
|
EmailPtr pTempEmail=NULL;
|
|
INT32 iId=0;
|
|
|
|
// run through list of messages, get id of oldest message
|
|
if(pEmail)
|
|
{
|
|
while(pEmail)
|
|
{
|
|
if(pEmail->iId >iId)
|
|
iId=pEmail->iId;
|
|
pEmail=pEmail->Next;
|
|
}
|
|
}
|
|
|
|
// reset pEmail
|
|
pEmail=pEmailList;
|
|
|
|
// move to end of list
|
|
if( pEmail )
|
|
{
|
|
while( pEmail->Next)
|
|
pEmail = pEmail->Next;
|
|
}
|
|
|
|
// add new element onto list
|
|
pTempEmail = (EmailPtr) MemAlloc(sizeof(Email));
|
|
memset( pTempEmail, 0, sizeof(Email) );
|
|
// add in strings
|
|
//while(pMessage !=NULL)
|
|
//{
|
|
//pTempEmail->pText[iCounter]=MemAlloc((wcslen(pMessage->pString)+2)*2);
|
|
//wcscpy(pTempEmail->pText[iCounter],pMessage->pString);
|
|
//pMessage=pMessage->Next;
|
|
//iCounter++;
|
|
//}
|
|
//pTempEmail->pText[iCounter]=NULL;
|
|
|
|
/*
|
|
// WANNE: Not needed anymore, bug is fixed!!
|
|
// WANNE: Fix the memory heap problem -> CTD (fix by BirdFlu)
|
|
// The text for the wildfire merc is too long (> 128 characters)!!
|
|
// copy subject
|
|
int _len = wcslen(pSubject);
|
|
pTempEmail->pSubject = (STR16) MemAlloc( (_len + 1) * sizeof(CHAR16) );
|
|
memset( pTempEmail->pSubject, 0, sizeof( CHAR16 ) * (_len + 1) );
|
|
wcsncpy(pTempEmail->pSubject,pSubject,_len);
|
|
pTempEmail->pSubject[_len] = 0;
|
|
*/
|
|
|
|
// copy subject
|
|
pTempEmail->pSubject = (STR16) MemAlloc( 128 * sizeof(CHAR16) );
|
|
memset( pTempEmail->pSubject, 0, sizeof( CHAR16 ) * 128 );
|
|
wcscpy(pTempEmail->pSubject,pSubject);
|
|
|
|
pTempEmail->EmailVersion = EmailType;
|
|
|
|
pTempEmail->EmailType = EmailAIM;
|
|
|
|
// copy offset and length of the actual message in email.edt
|
|
pTempEmail->usOffset =(UINT16)iMessageOffset;
|
|
pTempEmail->usLength =(UINT16)iMessageLength;
|
|
|
|
// null out last byte of subject
|
|
pTempEmail->pSubject[wcslen(pSubject)+1]=0;
|
|
|
|
pTempEmail->iCurrentIMPPosition = iCurrentIMPPosition;
|
|
|
|
// WANNE.MAIL: Fix
|
|
pTempEmail->iCurrentShipmentDestinationID = iCurrentShipmentDestinationID;
|
|
|
|
|
|
// set date and sender, Id
|
|
if(pEmail)
|
|
pTempEmail->iId=iId+1;
|
|
else
|
|
pTempEmail->iId=0;
|
|
gEmailT[ (UINT32)pTempEmail->iId ].EmailVersion = EmailType;
|
|
gEmailT[ (UINT32)pTempEmail->iId ].EmailType = EmailAIM;
|
|
|
|
// copy date and sender id's
|
|
pTempEmail->iDate=iDate;
|
|
pTempEmail->ubSender=ubSender;
|
|
|
|
// the special data
|
|
pTempEmail->iFirstData = iFirstData;
|
|
pTempEmail->uiSecondData = uiSecondData;
|
|
pTempEmail->iThirdData = iThirdData;
|
|
pTempEmail->iFourthData = iFourthData;
|
|
pTempEmail->uiFifthData = uiFifthData;
|
|
pTempEmail->uiSixData = uiSixData;
|
|
|
|
// place into list
|
|
if(pEmail)
|
|
{
|
|
// list exists, place at end
|
|
pEmail->Next=pTempEmail;
|
|
pTempEmail->Prev=pEmail;
|
|
}
|
|
else
|
|
{
|
|
// no list, becomes head of a new list
|
|
pEmail=pTempEmail;
|
|
pTempEmail->Prev=NULL;
|
|
pEmailList=pEmail;
|
|
}
|
|
|
|
// reset Next ptr
|
|
pTempEmail->Next=NULL;
|
|
|
|
// set flag that new mail has arrived
|
|
fNewMailFlag=TRUE;
|
|
|
|
// add this message to the pages of email
|
|
AddMessageToPages(pTempEmail->iId);
|
|
|
|
// reset read flag of this particular message
|
|
pTempEmail->fRead=fAlreadyRead;
|
|
|
|
// set fact this message is new
|
|
pTempEmail->fNew=TRUE;
|
|
return;
|
|
}
|
|
|
|
|
|
void RemoveEmailMessage(INT32 iId)
|
|
{
|
|
// run through list and remove message, update everyone afterwards
|
|
EmailPtr pEmail=pEmailList;
|
|
EmailPtr pTempEmail=NULL;
|
|
|
|
|
|
// error check
|
|
if(!pEmail)
|
|
return;
|
|
|
|
// look for message
|
|
pEmail = GetEmailMessage( iId );
|
|
|
|
gEmailT[ (UINT32)iId ].EmailType = 0;
|
|
|
|
//while((pEmail->iId !=iId)&&(pEmail->Next))
|
|
// pEmail=pEmail->Next;
|
|
|
|
// end of list, no mail found, leave
|
|
if(!pEmail)
|
|
return;
|
|
// found
|
|
|
|
// set tempt object current
|
|
pTempEmail=pEmail;
|
|
|
|
// check position of message in list
|
|
if((pEmail->Prev)&&(pTempEmail->Next))
|
|
{
|
|
// in the middle of the list
|
|
pEmail=pEmail->Prev;
|
|
pTempEmail=pTempEmail->Next;
|
|
MemFree(pEmail->Next->pSubject);
|
|
//while(pEmail->Next->pText[iCounter])
|
|
//{
|
|
//MemFree(pEmail->Next->pText[iCounter]);
|
|
//iCounter++;
|
|
//}
|
|
MemFree(pEmail->Next);
|
|
pEmail->Next=pTempEmail;
|
|
pTempEmail->Prev=pEmail;
|
|
}
|
|
else if(pEmail->Prev)
|
|
{
|
|
// end of the list
|
|
pEmail=pEmail->Prev;
|
|
MemFree(pEmail->Next->pSubject);
|
|
//while(pEmail->Next->pText[iCounter])
|
|
//{
|
|
//MemFree(pEmail->Next->pText[iCounter]);
|
|
//iCounter++;
|
|
//}
|
|
MemFree(pEmail->Next);
|
|
pEmail->Next=NULL;
|
|
}
|
|
else if(pTempEmail->Next)
|
|
{
|
|
// beginning of the list
|
|
pEmail=pTempEmail;
|
|
pTempEmail=pTempEmail->Next;
|
|
MemFree(pEmail->pSubject);
|
|
//while(pEmail->pText[iCounter])
|
|
//{
|
|
//MemFree(pEmail->pText[iCounter]);
|
|
//iCounter++;
|
|
//}
|
|
MemFree(pEmail);
|
|
pTempEmail->Prev=NULL;
|
|
pEmailList=pTempEmail;
|
|
}
|
|
else
|
|
{
|
|
// all alone
|
|
MemFree(pEmail->pSubject);
|
|
// while(pEmail->pText[iCounter])
|
|
//{
|
|
//MemFree(pEmail->pText[iCounter]);
|
|
//iCounter++;
|
|
//}
|
|
MemFree(pEmail);
|
|
pEmailList=NULL;
|
|
}
|
|
}
|
|
|
|
EmailPtr GetEmailMessage(INT32 iId)
|
|
{
|
|
EmailPtr pEmail=pEmailList;
|
|
// return pointer to message with iId
|
|
|
|
// invalid id
|
|
if(iId==-1)
|
|
return NULL;
|
|
|
|
// invalid list
|
|
if( pEmail == NULL )
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
// look for message
|
|
while( (pEmail->iId !=iId)&&(pEmail->Next) )
|
|
pEmail=pEmail->Next;
|
|
|
|
if( ( pEmail->iId != iId ) && ( pEmail->Next == NULL ) )
|
|
{
|
|
pEmail = NULL;
|
|
}
|
|
|
|
// no message, or is there?
|
|
if(!pEmail)
|
|
return NULL;
|
|
else
|
|
return pEmail;
|
|
}
|
|
|
|
|
|
static void AddEmailPage()
|
|
{
|
|
// simple adds a page to the list
|
|
PagePtr pPage=pPageList;
|
|
if(pPage)
|
|
{
|
|
while(pPage->Next)
|
|
pPage=pPage->Next;
|
|
}
|
|
|
|
|
|
if(pPage)
|
|
{
|
|
|
|
// there is a page, add current page after it
|
|
pPage->Next = (pagemessages *) MemAlloc(sizeof(Page));
|
|
pPage->Next->Prev=pPage;
|
|
pPage=pPage->Next;
|
|
pPage->Next=NULL;
|
|
pPage->iPageId=pPage->Prev->iPageId+1;
|
|
memset(pPage->iIds, -1, sizeof(INT32) * MAX_MESSAGES_PAGE );
|
|
}
|
|
else
|
|
{
|
|
|
|
// page becomes head of page list
|
|
pPageList = (PagePtr) MemAlloc(sizeof(Page));
|
|
pPage=pPageList;
|
|
pPage->Prev=NULL;
|
|
pPage->Next=NULL;
|
|
pPage->iPageId=0;
|
|
memset(pPage->iIds, -1, sizeof(INT32) * MAX_MESSAGES_PAGE );
|
|
pPageList=pPage;
|
|
}
|
|
iLastPage++;
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
static void RemoveEmailPage(INT32 iPageId)
|
|
{
|
|
PagePtr pPage=pPageList;
|
|
PagePtr pTempPage=NULL;
|
|
|
|
// run through list until page is matched, or out of pages
|
|
while((pPage->iPageId !=iPageId)&&(pPage))
|
|
pPage=pPage->Next;
|
|
|
|
// error check
|
|
if(!pPage)
|
|
return;
|
|
|
|
|
|
// found
|
|
pTempPage=pPage;
|
|
if((pPage->Prev)&&(pTempPage->Next))
|
|
{
|
|
// in the middle of the list
|
|
pPage=pPage->Prev;
|
|
pTempPage=pTempPage->Next;
|
|
MemFree(pPage->Next);
|
|
pPage->Next=pTempPage;
|
|
pTempPage->Prev=pPage;
|
|
}
|
|
else if(pPage->Prev)
|
|
{
|
|
// end of the list
|
|
pPage=pPage->Prev;
|
|
MemFree(pPage->Next);
|
|
pPage->Next=NULL;
|
|
}
|
|
else if(pTempPage->Next)
|
|
{
|
|
// beginning of the list
|
|
pPage=pTempPage;
|
|
pTempPage=pTempPage->Next;
|
|
MemFree(pPage);
|
|
pTempPage->Prev=NULL;
|
|
}
|
|
else
|
|
{
|
|
// all alone
|
|
|
|
MemFree(pPage);
|
|
pPageList=NULL;
|
|
}
|
|
if(iLastPage !=0)
|
|
iLastPage--;
|
|
}
|
|
|
|
void AddMessageToPages(INT32 iMessageId)
|
|
{
|
|
// go to end of page list
|
|
PagePtr pPage=pPageList;
|
|
INT32 iCounter=0;
|
|
if(!pPage)
|
|
AddEmailPage();
|
|
pPage=pPageList;
|
|
while((pPage->Next)&&(pPage->iIds[MAX_MESSAGES_PAGE-1]!=-1))
|
|
pPage=pPage->Next;
|
|
// if list is full, add new page
|
|
while(iCounter <MAX_MESSAGES_PAGE)
|
|
{
|
|
if(pPage->iIds[iCounter]==-1)
|
|
break;
|
|
iCounter++;
|
|
}
|
|
if(iCounter==MAX_MESSAGES_PAGE)
|
|
{
|
|
AddEmailPage();
|
|
AddMessageToPages(iMessageId);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
pPage->iIds[iCounter]=iMessageId;
|
|
}
|
|
return;
|
|
}
|
|
|
|
static void SortMessages(INT32 iCriteria)
|
|
{
|
|
EmailPtr pA = pEmailList;
|
|
EmailPtr pB = pEmailList;
|
|
CHAR16 pSubjectA[256];
|
|
CHAR16 pSubjectB[256];
|
|
|
|
// no messages to sort?
|
|
if ( (pA == NULL) || (pB == NULL) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// nothing here either?
|
|
if ( !pA->Next )
|
|
return;
|
|
|
|
pB = pA->Next;
|
|
switch ( iCriteria )
|
|
{
|
|
case RECEIVED:
|
|
while ( pA )
|
|
{
|
|
// set B to next in A
|
|
pB = pA->Next;
|
|
while ( pB )
|
|
{
|
|
|
|
if ( fSortDateUpwards )
|
|
{
|
|
// if date is lesser, swap
|
|
if ( pA->iDate > pB->iDate )
|
|
SwapMessages(pA->iId, pB->iId);
|
|
}
|
|
else
|
|
{
|
|
// if date is lesser, swap
|
|
if ( pA->iDate < pB->iDate )
|
|
SwapMessages(pA->iId, pB->iId);
|
|
}
|
|
|
|
|
|
// next in B's list
|
|
pB = pB->Next;
|
|
}
|
|
|
|
// next in A's List
|
|
pA = pA->Next;
|
|
}
|
|
break;
|
|
case SENDER:
|
|
while ( pA )
|
|
{
|
|
pB = pA->Next;
|
|
while ( pB )
|
|
{
|
|
// lesser string?...need sorting
|
|
if ( fSortSenderUpwards )
|
|
{
|
|
if ( (wcscmp(pSenderNameList[pA->ubSender], pSenderNameList[pB->ubSender])) < 0 )
|
|
SwapMessages(pA->iId, pB->iId);
|
|
}
|
|
else
|
|
{
|
|
if ( (wcscmp(pSenderNameList[pA->ubSender], pSenderNameList[pB->ubSender])) > 0 )
|
|
SwapMessages(pA->iId, pB->iId);
|
|
}
|
|
// next in B's list
|
|
pB = pB->Next;
|
|
}
|
|
// next in A's List
|
|
pA = pA->Next;
|
|
}
|
|
break;
|
|
case SUBJECT:
|
|
while ( pA )
|
|
{
|
|
pB = pA->Next;
|
|
while ( pB )
|
|
{
|
|
// clear out control codes
|
|
CleanOutControlCodesFromString(pA->pSubject, pSubjectA);
|
|
CleanOutControlCodesFromString(pB->pSubject, pSubjectB);
|
|
|
|
// lesser string?...need sorting
|
|
if ( fSortSubjectUpwards )
|
|
{
|
|
if ( (wcscmp(pA->pSubject, pB->pSubject)) < 0 )
|
|
SwapMessages(pA->iId, pB->iId);
|
|
}
|
|
else
|
|
{
|
|
if ( (wcscmp(pA->pSubject, pB->pSubject)) > 0 )
|
|
SwapMessages(pA->iId, pB->iId);
|
|
}
|
|
// next in B's list
|
|
pB = pB->Next;
|
|
}
|
|
// next in A's List
|
|
pA = pA->Next;
|
|
}
|
|
break;
|
|
|
|
case READ:
|
|
while ( pA )
|
|
{
|
|
pB = pA->Next;
|
|
while ( pB )
|
|
{
|
|
// one read and another not?...need sorting
|
|
if ( (pA->fRead) && (!(pB->fRead)) )
|
|
SwapMessages(pA->iId, pB->iId);
|
|
|
|
// next in B's list
|
|
pB = pB->Next;
|
|
}
|
|
// next in A's List
|
|
pA = pA->Next;
|
|
}
|
|
break;
|
|
}
|
|
|
|
// place new list into pages of email
|
|
//PlaceMessagesinPages();
|
|
|
|
// redraw the screen
|
|
fReDrawScreenFlag = TRUE;
|
|
}
|
|
|
|
void SwapMessages(INT32 iIdA, INT32 iIdB)
|
|
{
|
|
// swaps locations of messages in the linked list
|
|
EmailPtr pA = pEmailList;
|
|
EmailPtr pB = pEmailList;
|
|
EmailPtr pTemp = (EmailPtr)MemAlloc(sizeof(Email));
|
|
pTemp->pSubject = (STR16)MemAlloc(128 * sizeof(CHAR16));
|
|
|
|
memset(pTemp->pSubject, 0, sizeof(CHAR16) * 128);
|
|
|
|
if ( !pA->Next )
|
|
return;
|
|
//find pA
|
|
while ( pA->iId != iIdA )
|
|
pA = pA->Next;
|
|
// find pB
|
|
while ( pB->iId != iIdB )
|
|
pB = pB->Next;
|
|
|
|
// swap
|
|
|
|
// pTemp becomes pA
|
|
pTemp->iId = pA->iId;
|
|
pTemp->fRead = pA->fRead;
|
|
pTemp->fNew = pA->fNew;
|
|
pTemp->usOffset = pA->usOffset;
|
|
pTemp->EmailVersion = pA->EmailVersion;
|
|
pTemp->usLength = pA->usLength;
|
|
pTemp->iDate = pA->iDate;
|
|
pTemp->ubSender = pA->ubSender;
|
|
|
|
if ( pA->EmailVersion == TYPE_EMAIL_AIM_AVAILABLE )
|
|
wcscpy(pTemp->pSubject, EmailMercAvailableText[pA->ubSender].szSubject);
|
|
else if ( pA->EmailVersion == TYPE_EMAIL_MERC_LEVEL_UP )
|
|
wcscpy(pTemp->pSubject, EmailMercLevelUpText[pA->ubSender].szSubject);
|
|
else
|
|
wcscpy(pTemp->pSubject, pA->pSubject);
|
|
|
|
// pA becomes pB
|
|
pA->iId = pB->iId;
|
|
pA->fRead = pB->fRead;
|
|
pA->fNew = pB->fNew;
|
|
pA->usOffset = pB->usOffset;
|
|
pA->EmailVersion = pB->EmailVersion;
|
|
pA->usLength = pB->usLength;
|
|
pA->iDate = pB->iDate;
|
|
pA->ubSender = pB->ubSender;
|
|
wcscpy(pA->pSubject, pB->pSubject);
|
|
|
|
// pB becomes pTemp
|
|
pB->iId = pTemp->iId;
|
|
pB->fRead = pTemp->fRead;
|
|
pB->fNew = pTemp->fNew;
|
|
pB->usOffset = pTemp->usOffset;
|
|
pB->EmailVersion = pTemp->EmailVersion;
|
|
pB->usLength = pTemp->usLength;
|
|
pB->iDate = pTemp->iDate;
|
|
pB->ubSender = pTemp->ubSender;
|
|
|
|
if ( pB->EmailVersion == TYPE_EMAIL_AIM_AVAILABLE )
|
|
wcscpy(pB->pSubject, EmailMercAvailableText[pTemp->ubSender].szSubject);
|
|
else if ( pB->EmailVersion == TYPE_EMAIL_MERC_LEVEL_UP )
|
|
wcscpy(pB->pSubject, EmailMercLevelUpText[pTemp->ubSender].szSubject);
|
|
else
|
|
wcscpy(pB->pSubject, pTemp->pSubject);
|
|
|
|
// free up memory
|
|
MemFree(pTemp->pSubject);
|
|
MemFree(pTemp);
|
|
}
|
|
|
|
static void ClearPages()
|
|
{
|
|
// run through list of message pages and set to -1
|
|
PagePtr pPage=pPageList;
|
|
|
|
// error check
|
|
if( pPageList == NULL )
|
|
{
|
|
return;
|
|
}
|
|
|
|
while(pPage->Next)
|
|
{
|
|
pPage=pPage->Next;
|
|
MemFree(pPage->Prev);
|
|
}
|
|
if(pPage)
|
|
MemFree(pPage);
|
|
|
|
pPageList=NULL;
|
|
iLastPage=-1;
|
|
}
|
|
|
|
void PlaceMessagesinPages()
|
|
{
|
|
EmailPtr pEmail=pEmailList;
|
|
// run through the list of messages and add to pages
|
|
ClearPages();
|
|
while(pEmail)
|
|
{
|
|
AddMessageToPages(pEmail->iId);
|
|
pEmail=pEmail->Next;
|
|
|
|
}
|
|
if(iCurrentPage >iLastPage)
|
|
iCurrentPage=iLastPage;
|
|
return;
|
|
}
|
|
|
|
static void DisplayMessageList(INT32 iPageNum)
|
|
{
|
|
// will display page with idNumber iPageNum
|
|
PagePtr pPage=pPageList;
|
|
while(pPage->iPageId!=iPageNum)
|
|
{
|
|
pPage=pPage->Next;
|
|
if(!pPage)
|
|
return;
|
|
}
|
|
// found page show it
|
|
}
|
|
|
|
static void DrawLetterIcon(INT32 iCounter, BOOLEAN fRead)
|
|
{
|
|
HVOBJECT hHandle;
|
|
// will draw the icon for letter in mail list depending if the mail has been read or not
|
|
|
|
// grab video object
|
|
GetVideoObject(&hHandle, guiEmailIndicator);
|
|
|
|
// is it read or not?
|
|
if(fRead)
|
|
BltVideoObject(FRAME_BUFFER, hHandle, 0,INDIC_X, (MIDDLE_Y+iCounter*MIDDLE_WIDTH+2), VO_BLT_SRCTRANSPARENCY,NULL);
|
|
else
|
|
BltVideoObject(FRAME_BUFFER, hHandle, 1,INDIC_X, (MIDDLE_Y+iCounter*MIDDLE_WIDTH+2), VO_BLT_SRCTRANSPARENCY,NULL);
|
|
}
|
|
|
|
static void DrawSubject(INT32 iCounter, STR16 pSubject, BOOLEAN fRead)
|
|
{
|
|
CHAR16 pTempSubject[320];
|
|
|
|
// draw subject line of mail being viewed in viewer
|
|
|
|
// lock buffer to prevent overwrite
|
|
SetFontDestBuffer(FRAME_BUFFER, SUBJECT_X , ((UINT16)(MIDDLE_Y+iCounter*MIDDLE_WIDTH)) , SUBJECT_X + SUBJECT_WIDTH , ( ( UINT16 ) ( MIDDLE_Y + iCounter * MIDDLE_WIDTH ) ) + MIDDLE_WIDTH, FALSE );
|
|
SetFontShadow(NO_SHADOW);
|
|
SetFontForeground( FONT_BLACK );
|
|
SetFontBackground( FONT_BLACK );
|
|
|
|
wcscpy( pTempSubject, pSubject );
|
|
|
|
if( fRead )
|
|
{
|
|
//if the subject will be too long, cap it, and add the '...'
|
|
if( StringPixLength( pTempSubject, MESSAGE_FONT ) >= SUBJECT_WIDTH - 10 )
|
|
{
|
|
ReduceStringLength( pTempSubject, SUBJECT_WIDTH - 10, MESSAGE_FONT );
|
|
}
|
|
|
|
// display string subject
|
|
IanDisplayWrappedString(SUBJECT_X, (( UINT16 )( 4 + MIDDLE_Y + iCounter * MIDDLE_WIDTH ) ) , SUBJECT_WIDTH, MESSAGE_GAP, MESSAGE_FONT, MESSAGE_COLOR ,pTempSubject,0 ,FALSE ,LEFT_JUSTIFIED );
|
|
}
|
|
else
|
|
{
|
|
//if the subject will be too long, cap it, and add the '...'
|
|
if( StringPixLength( pTempSubject, FONT10ARIALBOLD ) >= SUBJECT_WIDTH - 10 )
|
|
{
|
|
ReduceStringLength( pTempSubject, SUBJECT_WIDTH - 10, FONT10ARIALBOLD );
|
|
}
|
|
|
|
// display string subject
|
|
IanDisplayWrappedString(SUBJECT_X, (( UINT16 )( 4 + MIDDLE_Y + iCounter * MIDDLE_WIDTH ) ) , SUBJECT_WIDTH, MESSAGE_GAP, FONT10ARIALBOLD, MESSAGE_COLOR ,pTempSubject,0 ,FALSE ,LEFT_JUSTIFIED );
|
|
|
|
}
|
|
SetFontShadow(DEFAULT_SHADOW);
|
|
// reset font dest buffer
|
|
SetFontDestBuffer(FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE );
|
|
}
|
|
|
|
static void DrawSender(INT32 iCounter, UINT8 ubSender, BOOLEAN fRead, UINT8 EmailType)
|
|
{
|
|
// draw name of sender in mail viewer
|
|
SetFontShadow(NO_SHADOW);
|
|
|
|
SetFontShadow(NO_SHADOW);
|
|
SetFontForeground( FONT_BLACK );
|
|
SetFontBackground( FONT_BLACK );
|
|
|
|
if( fRead )
|
|
{
|
|
SetFont( MESSAGE_FONT );
|
|
}
|
|
else
|
|
{
|
|
SetFont( FONT10ARIALBOLD );
|
|
}
|
|
|
|
if ( EmailType == TYPE_EMAIL_AIM_AVAILABLE || EmailType == TYPE_EMAIL_MERC_LEVEL_UP )
|
|
{
|
|
if (gMercProfiles[ ubSender ].zNickname !='\0')
|
|
mprintf(SENDER_X,(( UINT16 )( 4 + MIDDLE_Y + iCounter * MIDDLE_WIDTH ) ) ,gMercProfiles[ ubSender ].zNickname);
|
|
else
|
|
mprintf(SENDER_X,(( UINT16 )( 4 + MIDDLE_Y + iCounter * MIDDLE_WIDTH ) ) ,L"None");
|
|
}
|
|
else if ( EmailType == TYPE_EMAIL_EMAIL_EDT || EmailType == TYPE_EMAIL_BOBBY_R || EmailType == TYPE_EMAIL_BOBBY_R_EMAIL_JA2_EDT || EmailType == TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT || EmailType == TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT || EmailType == TYPE_EMAIL_XML )
|
|
{
|
|
mprintf(SENDER_X,(( UINT16 )( 4 + MIDDLE_Y + iCounter * MIDDLE_WIDTH ) ) ,pSenderNameList[ubSender]);
|
|
}
|
|
else if ( EmailType == TYPE_EMAIL_EMAIL_EDT_NAME_MERC )
|
|
{
|
|
if (gMercProfiles[ ubSender ].zNickname !='\0')
|
|
mprintf(SENDER_X,(( UINT16 )( 4 + MIDDLE_Y + iCounter * MIDDLE_WIDTH ) ) ,gMercProfiles[ ubSender ].zNickname);
|
|
else
|
|
mprintf(SENDER_X,(( UINT16 )( 4 + MIDDLE_Y + iCounter * MIDDLE_WIDTH ) ) ,L"None");
|
|
}
|
|
|
|
SetFont( MESSAGE_FONT );
|
|
SetFontShadow(DEFAULT_SHADOW);
|
|
}
|
|
|
|
static void DrawDate(INT32 iCounter, INT32 iDate, BOOLEAN fRead)
|
|
{
|
|
CHAR16 sString[20];
|
|
|
|
SetFontShadow(NO_SHADOW);
|
|
SetFontForeground( FONT_BLACK );
|
|
SetFontBackground( FONT_BLACK );
|
|
|
|
if( fRead )
|
|
{
|
|
SetFont( MESSAGE_FONT );
|
|
}
|
|
else
|
|
{
|
|
SetFont( FONT10ARIALBOLD );
|
|
}
|
|
// draw date of message being displayed in mail viewer
|
|
swprintf(sString, L"%s %d", pDayStrings[ 0 ], iDate/ ( 24 * 60 ) );
|
|
mprintf(DATE_X,(( UINT16 )( 4 + MIDDLE_Y + iCounter * MIDDLE_WIDTH ) ),sString);
|
|
|
|
SetFont( MESSAGE_FONT );
|
|
SetFontShadow(DEFAULT_SHADOW);
|
|
}
|
|
|
|
void DisplayEmailList()
|
|
{
|
|
INT32 iCounter=0;
|
|
// look at current page, and display
|
|
PagePtr pPage=pPageList;
|
|
EmailPtr pEmail=NULL;
|
|
|
|
// error check, if no page, return
|
|
if(!pPage)
|
|
return;
|
|
|
|
// if current page ever ends up negative, reset to 0
|
|
if(iCurrentPage==-1)
|
|
iCurrentPage=0;
|
|
|
|
// loop until we get to the current page
|
|
while((pPage->iPageId!=iCurrentPage)&&(iCurrentPage <=iLastPage))
|
|
pPage=pPage->Next;
|
|
|
|
// now we have current page, display it
|
|
pEmail=GetEmailMessage(pPage->iIds[iCounter]);
|
|
SetFontShadow(NO_SHADOW);
|
|
SetFont(EMAIL_TEXT_FONT);
|
|
|
|
// draw each line of the list for this page
|
|
while(pEmail)
|
|
{
|
|
// highlighted message, set text of message in list to blue
|
|
if(iCounter==iHighLightLine)
|
|
{
|
|
SetFontForeground(FONT_BLUE);
|
|
}
|
|
else if(pEmail->fRead)
|
|
{
|
|
// message has been read, reset color to black
|
|
SetFontForeground(FONT_BLACK);
|
|
//SetFontBackground(FONT_BLACK);
|
|
|
|
}
|
|
else
|
|
{
|
|
// defualt, message is not read, set font red
|
|
SetFontForeground(FONT_RED);
|
|
//SetFontBackground(FONT_BLACK);
|
|
}
|
|
SetFontBackground(FONT_BLACK);
|
|
|
|
//draw the icon, sender, date, subject
|
|
DrawLetterIcon(iCounter,pEmail->fRead );
|
|
DrawSubject(iCounter, pEmail->pSubject, pEmail->fRead );
|
|
|
|
if ( pEmail->EmailVersion == TYPE_EMAIL_AIM_AVAILABLE || pEmail->EmailVersion == TYPE_EMAIL_MERC_LEVEL_UP )
|
|
DrawSender(iCounter, pEmail->ubSender, pEmail->fRead, pEmail->EmailVersion);
|
|
else if ( pEmail->EmailVersion == TYPE_EMAIL_EMAIL_EDT || pEmail->EmailVersion == TYPE_EMAIL_EMAIL_EDT_NAME_MERC || pEmail->EmailVersion == TYPE_EMAIL_BOBBY_R || pEmail->EmailVersion == TYPE_EMAIL_BOBBY_R_EMAIL_JA2_EDT || pEmail->EmailVersion == TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT || pEmail->EmailVersion == TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT )
|
|
DrawSender(iCounter, pEmail->ubSender, pEmail->fRead, pEmail->EmailVersion);
|
|
else if ( pEmail->EmailVersion == TYPE_EMAIL_XML )
|
|
DrawSender(iCounter, pEmail->ubSender, pEmail->fRead, pEmail->EmailVersion);
|
|
|
|
DrawDate(iCounter, pEmail->iDate, pEmail->fRead );
|
|
|
|
++iCounter;
|
|
|
|
// too many messages onthis page, reset pEmail, so no more are drawn
|
|
if(iCounter >= MAX_MESSAGES_PAGE)
|
|
pEmail=NULL;
|
|
else
|
|
pEmail=GetEmailMessage(pPage->iIds[iCounter]);
|
|
}
|
|
|
|
InvalidateRegion(LAPTOP_SCREEN_UL_X,LAPTOP_SCREEN_UL_Y,LAPTOP_SCREEN_LR_X,LAPTOP_SCREEN_LR_Y);
|
|
|
|
SetFontShadow(DEFAULT_SHADOW);
|
|
}
|
|
|
|
void LookForUnread()
|
|
{
|
|
BOOLEAN fStatusOfNewEmailFlag = fUnReadMailFlag;
|
|
|
|
// simply runrs through list of messages, if any unread, set unread flag
|
|
|
|
EmailPtr pA=pEmailList;
|
|
|
|
// reset unread flag
|
|
fUnReadMailFlag=FALSE;
|
|
|
|
// look for unread mail
|
|
while(pA)
|
|
{
|
|
// unread mail found, set flag
|
|
if(!(pA->fRead))
|
|
fUnReadMailFlag=TRUE;
|
|
pA=pA->Next;
|
|
}
|
|
|
|
if( fStatusOfNewEmailFlag != fUnReadMailFlag )
|
|
{
|
|
//Since there is no new email, get rid of the hepl text
|
|
CreateFileAndNewEmailIconFastHelpText( LAPTOP_BN_HLP_TXT_YOU_HAVE_NEW_MAIL, (BOOLEAN )!fUnReadMailFlag );
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void EmailBtnCallBack(MOUSE_REGION * pRegion, INT32 iReason )
|
|
{
|
|
INT32 iCount;
|
|
PagePtr pPage=pPageList;
|
|
INT32 iId=0;
|
|
if (iReason & MSYS_CALLBACK_REASON_INIT)
|
|
{
|
|
return;
|
|
}
|
|
if(fDisplayMessageFlag)
|
|
return;
|
|
if(iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
|
|
{
|
|
|
|
// error check
|
|
iCount=MSYS_GetRegionUserData(pRegion, 0);
|
|
// check for valid email
|
|
// find surrent page
|
|
if(!pPage)
|
|
return;
|
|
while((pPage->Next)&&(pPage->iPageId!=iCurrentPage))
|
|
pPage=pPage->Next;
|
|
if(!pPage)
|
|
return;
|
|
// found page
|
|
|
|
// get id for element iCount
|
|
iId=pPage->iIds[iCount];
|
|
|
|
// invalid message
|
|
if(iId==-1)
|
|
{
|
|
fDisplayMessageFlag=FALSE;
|
|
return;
|
|
}
|
|
// Get email and display
|
|
fDisplayMessageFlag=TRUE;
|
|
giMessagePage = 0;
|
|
giPrevMessageId = giMessageId;
|
|
giMessageId=iId;
|
|
|
|
|
|
}
|
|
else if(iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
|
|
{
|
|
iCount=MSYS_GetRegionUserData(pRegion, 0);
|
|
|
|
// error check
|
|
if(!pPage)
|
|
{
|
|
HandleRightButtonUpEvent( );
|
|
return;
|
|
}
|
|
|
|
giMessagePage = 0;
|
|
|
|
while((pPage->Next)&&(pPage->iPageId!=iCurrentPage))
|
|
pPage=pPage->Next;
|
|
if(!pPage)
|
|
{
|
|
HandleRightButtonUpEvent( );
|
|
return;
|
|
}
|
|
// found page
|
|
// get id for element iCount
|
|
iId=pPage->iIds[iCount];
|
|
if(!GetEmailMessage(iId))
|
|
{
|
|
// no mail here, handle right button up event
|
|
HandleRightButtonUpEvent( );
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
fDeleteMailFlag=TRUE;
|
|
iDeleteId=iId;
|
|
//DisplayDeleteNotice(GetEmailMessage(iDeleteId));
|
|
//DeleteEmail();
|
|
}
|
|
}
|
|
}
|
|
void EmailMvtCallBack(MOUSE_REGION * pRegion, INT32 iReason )
|
|
{
|
|
if (iReason & MSYS_CALLBACK_REASON_INIT)
|
|
{
|
|
return;
|
|
}
|
|
if(fDisplayMessageFlag)
|
|
return;
|
|
if (iReason == MSYS_CALLBACK_REASON_MOVE)
|
|
{
|
|
|
|
// set highlight to current regions data, this is the message to display
|
|
iHighLightLine=MSYS_GetRegionUserData(pRegion, 0);
|
|
}
|
|
if (iReason == MSYS_CALLBACK_REASON_LOST_MOUSE )
|
|
{
|
|
|
|
// reset highlight line to invalid message
|
|
iHighLightLine=-1;
|
|
}
|
|
}
|
|
|
|
static void BtnMessageXCallback(GUI_BUTTON *btn,INT32 reason)
|
|
{
|
|
if (!(btn->uiFlags & BUTTON_ENABLED))
|
|
return;
|
|
|
|
if((reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )||(reason & MSYS_CALLBACK_REASON_RBUTTON_DWN))
|
|
{
|
|
btn->uiFlags |= BUTTON_CLICKED_ON;
|
|
}
|
|
else if((reason & MSYS_CALLBACK_REASON_LBUTTON_UP )||(reason & MSYS_CALLBACK_REASON_RBUTTON_UP))
|
|
{
|
|
if(btn->uiFlags& BUTTON_CLICKED_ON)
|
|
{
|
|
// X button has been pressed and let up, this means to stop displaying the currently displayed message
|
|
|
|
// reset display message flag
|
|
fDisplayMessageFlag=FALSE;
|
|
|
|
// reset button flag
|
|
btn->uiFlags &= ~BUTTON_CLICKED_ON;
|
|
|
|
// reset page being displayed
|
|
giMessagePage = 0;
|
|
|
|
// redraw icons
|
|
DrawLapTopIcons();
|
|
|
|
// force update of entire screen
|
|
fPausedReDrawScreenFlag=TRUE;
|
|
|
|
// rerender email
|
|
//RenderEmail();
|
|
}
|
|
}
|
|
}
|
|
void SetUnNewMessages()
|
|
{
|
|
// on exit from the mailer, set all new messages as 'un'new
|
|
EmailPtr pEmail=pEmailList;
|
|
|
|
// run through the list of messages and add to pages
|
|
while(pEmail)
|
|
{
|
|
pEmail->fNew=FALSE;
|
|
pEmail=pEmail->Next;
|
|
}
|
|
return;
|
|
}
|
|
|
|
INT32 DisplayEmailMessage(EmailPtr pMail)
|
|
{
|
|
HVOBJECT hHandle;
|
|
INT32 iHeight=0;
|
|
INT32 iCounter=1;
|
|
// CHAR16 pString[MAIL_STRING_SIZE/2 + 1];
|
|
CHAR16 pString[MAIL_STRING_SIZE];
|
|
INT32 iOffSet=0;
|
|
RecordPtr pTempRecord;
|
|
BOOLEAN fDonePrintingMessage = FALSE;
|
|
|
|
if(!pMail)
|
|
return 0;
|
|
|
|
iOffSet=(INT32)pMail->usOffset;
|
|
|
|
// reset redraw email message flag
|
|
fReDrawMessageFlag = FALSE;
|
|
|
|
// we KNOW the player is going to "read" this, so mark it as so
|
|
pMail->fRead=TRUE;
|
|
|
|
giCurrentIMPSlot = pMail->iCurrentIMPPosition;
|
|
|
|
// draw text for title bar
|
|
//swprintf(pString, L"%s / %s", pSenderNameList[pMail->ubSender],pMail->pSubject);
|
|
//DisplayWrappedString(VIEWER_X+VIEWER_HEAD_X+4, VIEWER_Y+VIEWER_HEAD_Y+4, VIEWER_HEAD_WIDTH, MESSAGE_GAP, MESSAGE_FONT, MESSAGE_COLOR, pString, 0,FALSE,0);
|
|
|
|
// increment height for size of one line
|
|
iHeight+=GetFontHeight( MESSAGE_FONT );
|
|
|
|
// is there any special event meant for this mail?..if so, handle it
|
|
if ( pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT )
|
|
HandleAnySpecialEmailMessageEvents( iOffSet );
|
|
else if ( pMail->EmailVersion == TYPE_EMAIL_XML )
|
|
HandleAnySpecialEmailMessageEvents(pMail->iThirdData);
|
|
|
|
if ( pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT ) //|| pMail->EmailVersion == TYPE_EMAIL_BOBBY_R_EMAIL_JA2_EDT || pMail->EmailVersion == TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT )
|
|
HandleMailSpecialMessages( ( UINT16 ) ( iOffSet ), &iViewerPositionY, pMail);
|
|
else if ( pMail->EmailVersion == TYPE_EMAIL_XML )
|
|
HandleMailSpecialMessages(pMail->iThirdData, &iViewerPositionY, pMail);
|
|
|
|
#ifdef JA2UB
|
|
if ( pMail->EmailType != TYPE_E_NONE || pMail->EmailVersion == TYPE_EMAIL_XML )
|
|
{
|
|
HandleNewUBMailSpecialMessages( 198, &iViewerPositionY, pMail );
|
|
HandleNewUBMailSpecialMessages( 170, &iViewerPositionY, pMail );
|
|
HandleNewUBMailSpecialMessages( 211, &iViewerPositionY, pMail );
|
|
HandleNewUBMailSpecialMessages( 206, &iViewerPositionY, pMail );
|
|
HandleNewUBMailSpecialMessages( 217, &iViewerPositionY, pMail );
|
|
}
|
|
#endif
|
|
|
|
PreProcessEmail( pMail );
|
|
|
|
pTempRecord = pMessageRecordList;
|
|
|
|
// blt in top line of message as a blank graphic
|
|
// get a handle to the bitmap of EMAIL VIEWER Background
|
|
GetVideoObject( &hHandle, guiEmailMessage );
|
|
|
|
// place the graphic on the frame buffer
|
|
BltVideoObject( FRAME_BUFFER, hHandle, 1,VIEWER_X, VIEWER_MESSAGE_BODY_START_Y + iViewerPositionY, VO_BLT_SRCTRANSPARENCY,NULL );
|
|
BltVideoObject( FRAME_BUFFER, hHandle, 1,VIEWER_X, VIEWER_MESSAGE_BODY_START_Y + GetFontHeight( MESSAGE_FONT ) + iViewerPositionY, VO_BLT_SRCTRANSPARENCY,NULL );
|
|
|
|
// set shadow
|
|
SetFontShadow(NO_SHADOW);
|
|
|
|
// get a handle to the bitmap of EMAIL VIEWER
|
|
GetVideoObject(&hHandle, guiEmailMessage);
|
|
|
|
// place the graphic on the frame buffer
|
|
BltVideoObject(FRAME_BUFFER, hHandle, 0,VIEWER_X, VIEWER_Y + iViewerPositionY, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
// the icon for the title of this box
|
|
GetVideoObject( &hHandle, guiTITLEBARICONS );
|
|
BltVideoObject( FRAME_BUFFER, hHandle, 0,VIEWER_X + 5, VIEWER_Y + iViewerPositionY + 2, VO_BLT_SRCTRANSPARENCY,NULL );
|
|
|
|
// display header text
|
|
DisplayEmailMessageSubjectDateFromLines( pMail, iViewerPositionY );
|
|
|
|
// display title text
|
|
DrawEmailMessageDisplayTitleText( iViewerPositionY );
|
|
|
|
iCounter=0;
|
|
// now blit the text background based on height
|
|
for (iCounter=2; iCounter < ( ( iTotalHeight ) / ( GetFontHeight( MESSAGE_FONT ) ) ); iCounter++ )
|
|
{
|
|
// get a handle to the bitmap of EMAIL VIEWER Background
|
|
GetVideoObject( &hHandle, guiEmailMessage );
|
|
|
|
// place the graphic on the frame buffer
|
|
BltVideoObject( FRAME_BUFFER, hHandle, 1,VIEWER_X, iViewerPositionY + VIEWER_MESSAGE_BODY_START_Y+( (GetFontHeight( MESSAGE_FONT ) ) * ( iCounter )), VO_BLT_SRCTRANSPARENCY,NULL );
|
|
}
|
|
|
|
// now the bottom piece to the message viewer
|
|
GetVideoObject( &hHandle, guiEmailMessage );
|
|
|
|
if( giNumberOfPagesToCurrentEmail <= 2 )
|
|
{
|
|
// place the graphic on the frame buffer
|
|
BltVideoObject( FRAME_BUFFER, hHandle, 2,VIEWER_X, iViewerPositionY + VIEWER_MESSAGE_BODY_START_Y+( ( GetFontHeight( MESSAGE_FONT ) ) * ( iCounter )), VO_BLT_SRCTRANSPARENCY,NULL );
|
|
}
|
|
else
|
|
{
|
|
// place the graphic on the frame buffer
|
|
BltVideoObject( FRAME_BUFFER, hHandle, 3,VIEWER_X, iViewerPositionY + VIEWER_MESSAGE_BODY_START_Y+( ( GetFontHeight( MESSAGE_FONT ) ) * ( iCounter )), VO_BLT_SRCTRANSPARENCY,NULL );
|
|
}
|
|
|
|
// reset iCounter and iHeight
|
|
iCounter = 1;
|
|
iHeight = GetFontHeight(MESSAGE_FONT);
|
|
|
|
// draw body of text. Any particular email can encompass more than one "record" in the
|
|
// email file. Draw each record (length is number of records)
|
|
|
|
// now place the text
|
|
|
|
// reset ptemprecord to head of list
|
|
pTempRecord = pMessageRecordList;
|
|
// reset shadow
|
|
SetFontShadow( NO_SHADOW );
|
|
|
|
pTempRecord = pEmailPageInfo[ giMessagePage ].pFirstRecord;
|
|
|
|
if( pTempRecord )
|
|
{
|
|
while( fDonePrintingMessage == FALSE )
|
|
{
|
|
// copy over string
|
|
wcscpy( pString, pTempRecord->pRecord );
|
|
|
|
// get the height of the string, ONLY!...must redisplay ON TOP OF background graphic
|
|
iHeight += IanDisplayWrappedString(VIEWER_X + 9, ( UINT16 )( VIEWER_MESSAGE_BODY_START_Y + iHeight + iViewerPositionY), MESSAGE_WIDTH, MESSAGE_GAP, MESSAGE_FONT, MESSAGE_COLOR,pString,0,FALSE, IAN_WRAP_NO_SHADOW);
|
|
|
|
// increment email record ptr
|
|
pTempRecord = pTempRecord->Next;
|
|
|
|
if( pTempRecord == NULL )
|
|
{
|
|
fDonePrintingMessage = TRUE;
|
|
}
|
|
else if( ( pTempRecord == pEmailPageInfo[ giMessagePage ].pLastRecord ) && ( pEmailPageInfo[ giMessagePage + 1 ].pFirstRecord != NULL ) )
|
|
{
|
|
fDonePrintingMessage = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
if(iTotalHeight < MAX_EMAIL_MESSAGE_PAGE_SIZE)
|
|
{
|
|
fOnLastPageFlag = TRUE;
|
|
while( pTempRecord )
|
|
{
|
|
// copy over string
|
|
wcscpy( pString, pTempRecord->pRecord );
|
|
|
|
// get the height of the string, ONLY!...must redisplay ON TOP OF background graphic
|
|
iHeight += IanDisplayWrappedString(VIEWER_X + MESSAGE_X + 4, ( UINT16 )( VIEWER_MESSAGE_BODY_START_Y + iHeight + iViewerPositionY), MESSAGE_WIDTH, MESSAGE_GAP, MESSAGE_FONT, MESSAGE_COLOR,pString,0,FALSE, IAN_WRAP_NO_SHADOW);
|
|
|
|
// increment email record ptr
|
|
pTempRecord = pTempRecord->Next;
|
|
}
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
iYPositionOnPage = 0;
|
|
// go to the right record
|
|
pTempRecord = GetFirstRecordOnThisPage( pMessageRecordList, MESSAGE_FONT, MESSAGE_WIDTH, MESSAGE_GAP, giMessagePage, MAX_EMAIL_MESSAGE_PAGE_SIZE );
|
|
while( pTempRecord )
|
|
{
|
|
// copy over string
|
|
wcscpy( pString, pTempRecord->pRecord );
|
|
|
|
if( pString[ 0 ] == 0 )
|
|
{
|
|
// on last page
|
|
fOnLastPageFlag = TRUE;
|
|
}
|
|
|
|
|
|
if( ( iYPositionOnPage + IanWrappedStringHeight(0, 0, MESSAGE_WIDTH, MESSAGE_GAP,
|
|
MESSAGE_FONT, 0, pTempRecord->pRecord,
|
|
0, 0, 0 ) ) <= MAX_EMAIL_MESSAGE_PAGE_SIZE )
|
|
{
|
|
// now print it
|
|
iYPositionOnPage += IanDisplayWrappedString(VIEWER_X + MESSAGE_X + 4, ( UINT16 )( VIEWER_MESSAGE_BODY_START_Y + 10 +iYPositionOnPage + iViewerPositionY), MESSAGE_WIDTH, MESSAGE_GAP, MESSAGE_FONT, MESSAGE_COLOR,pString,0,FALSE, IAN_WRAP_NO_SHADOW);
|
|
fGoingOffCurrentPage = FALSE;
|
|
}
|
|
else
|
|
{
|
|
// gonna get cut off...end now
|
|
fGoingOffCurrentPage = TRUE;
|
|
}
|
|
|
|
|
|
pTempRecord = pTempRecord->Next;
|
|
|
|
|
|
if( ( pTempRecord == NULL ) && ( fGoingOffCurrentPage == FALSE ) )
|
|
{
|
|
// on last page
|
|
fOnLastPageFlag = TRUE;
|
|
}
|
|
else
|
|
{
|
|
fOnLastPageFlag = FALSE;
|
|
}
|
|
|
|
// record get cut off?...end now
|
|
|
|
if( fGoingOffCurrentPage == TRUE )
|
|
{
|
|
pTempRecord = NULL;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
*/
|
|
// show number of pages to this email
|
|
DisplayNumberOfPagesToThisEmail( iViewerPositionY );
|
|
|
|
// mark this area dirty
|
|
InvalidateRegion( LAPTOP_SCREEN_UL_X,LAPTOP_SCREEN_UL_Y,LAPTOP_SCREEN_LR_X,LAPTOP_SCREEN_LR_Y );
|
|
|
|
// reset shadow
|
|
SetFontShadow( DEFAULT_SHADOW );
|
|
|
|
return iViewerPositionY;
|
|
}
|
|
|
|
static void BtnNewOkback(GUI_BUTTON *btn,INT32 reason)
|
|
{
|
|
if (!(btn->uiFlags & BUTTON_ENABLED))
|
|
return;
|
|
|
|
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
|
|
{
|
|
if(!(btn->uiFlags & BUTTON_CLICKED_ON))
|
|
{
|
|
}
|
|
|
|
btn->uiFlags|=(BUTTON_CLICKED_ON);
|
|
}
|
|
else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
|
|
{
|
|
if(btn->uiFlags & BUTTON_CLICKED_ON)
|
|
{
|
|
btn->uiFlags&=~(BUTTON_CLICKED_ON);
|
|
fNewMailFlag=FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
void AddDeleteRegionsToMessageRegion(INT32 iViewerY)
|
|
{
|
|
// will create/destroy mouse region for message display
|
|
if((fDisplayMessageFlag)&&(!fOldDisplayMessageFlag))
|
|
{
|
|
// set old flag
|
|
fOldDisplayMessageFlag=TRUE;
|
|
|
|
// add X button
|
|
giMessageButtonImage[0]= LoadButtonImage( "LAPTOP\\X.sti" ,-1,0,-1,1,-1 );
|
|
giMessageButton[0] = QuickCreateButton( giMessageButtonImage[0], BUTTON_X + 2,(INT16) ( BUTTON_Y + ( INT16 )iViewerY + 1),
|
|
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
|
|
(GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnMessageXCallback );
|
|
SetButtonCursor(giMessageButton[0], CURSOR_LAPTOP_SCREEN);
|
|
|
|
if( giNumberOfPagesToCurrentEmail > 2 )
|
|
{
|
|
// add next and previous mail page buttons
|
|
giMailMessageButtonsImage[0]= LoadButtonImage( "LAPTOP\\NewMailButtons.sti" ,-1,0,-1,3,-1 );
|
|
giMailMessageButtons[0] = QuickCreateButton( giMailMessageButtonsImage[0], PREVIOUS_PAGE_BUTTON_X,(INT16) ( LOWER_BUTTON_Y + ( INT16 )iViewerY + 2),
|
|
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
|
|
(GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnPreviousEmailPageCallback );
|
|
|
|
giMailMessageButtonsImage[1]= LoadButtonImage( "LAPTOP\\NewMailButtons.sti" ,-1,1,-1,4,-1 );
|
|
giMailMessageButtons[1] = QuickCreateButton( giMailMessageButtonsImage[1], NEXT_PAGE_BUTTON_X ,(INT16) ( LOWER_BUTTON_Y + ( INT16 )iViewerY + 2),
|
|
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
|
|
(GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnNextEmailPageCallback );
|
|
|
|
gfPageButtonsWereCreated = TRUE;
|
|
}
|
|
|
|
// add delete message button
|
|
giMailMessageButtonsImage[2]= LoadButtonImage( "LAPTOP\\NewMailButtons.sti" ,-1,2,-1,5,-1 );
|
|
giMailMessageButtons[2] = QuickCreateButton( giMailMessageButtonsImage[2], DELETE_BUTTON_X,(INT16) ( BUTTON_LOWER_Y + ( INT16 )iViewerY + 2),
|
|
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
|
|
(GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnDeleteCallback );
|
|
/*
|
|
// set up disable methods
|
|
SpecifyDisabledButtonStyle( giMailMessageButtons[1], DISABLED_STYLE_SHADED );
|
|
SpecifyDisabledButtonStyle( giMailMessageButtons[0], DISABLED_STYLE_SHADED );
|
|
*/
|
|
// set cursors
|
|
SetButtonCursor(giMailMessageButtons[0], CURSOR_LAPTOP_SCREEN);
|
|
SetButtonCursor(giMailMessageButtons[1], CURSOR_LAPTOP_SCREEN);
|
|
SetButtonCursor(giMailMessageButtons[2], CURSOR_LAPTOP_SCREEN);
|
|
SetButtonCursor(giMessageButton[0], CURSOR_LAPTOP_SCREEN);
|
|
|
|
// set up email message region
|
|
MSYS_DefineRegion( &pMailViewMessageRegion, VIEWER_X + 2, (INT16) ( VIEWER_Y + (INT16)iViewerY + 2), VIEWER_X + 416, (INT16) ( VIEWER_Y + (INT16)iViewerY + 72 + iTotalHeight), MSYS_PRIORITY_HIGH,
|
|
CURSOR_LAPTOP_SCREEN, MSYS_NO_CALLBACK, ViewMessageRegionCallBack );
|
|
MSYS_AddRegion( &pMailViewMessageRegion );
|
|
|
|
// force update of screen
|
|
fReDrawScreenFlag=TRUE;
|
|
}
|
|
else if((!fDisplayMessageFlag)&&(fOldDisplayMessageFlag))
|
|
{
|
|
// delete region
|
|
fOldDisplayMessageFlag=FALSE;
|
|
RemoveButton(giMessageButton[0] );
|
|
UnloadButtonImage( giMessageButtonImage[0] );
|
|
|
|
// next/previous email page buttons
|
|
if( gfPageButtonsWereCreated )
|
|
{
|
|
RemoveButton(giMailMessageButtons[0] );
|
|
UnloadButtonImage( giMailMessageButtonsImage[0] );
|
|
RemoveButton(giMailMessageButtons[1] );
|
|
UnloadButtonImage( giMailMessageButtonsImage[1] );
|
|
gfPageButtonsWereCreated = FALSE;
|
|
}
|
|
|
|
RemoveButton(giMailMessageButtons[2] );
|
|
UnloadButtonImage( giMailMessageButtonsImage[2] );
|
|
|
|
MSYS_RemoveRegion( &pMailViewMessageRegion );
|
|
|
|
// force update of screen
|
|
fReDrawScreenFlag=TRUE;
|
|
}
|
|
}
|
|
|
|
void CreateDestroyNewMailButton()
|
|
{
|
|
static BOOLEAN fOldNewMailFlag=FALSE;
|
|
|
|
// check if we are video conferencing, if so, do nothing
|
|
if( gubVideoConferencingMode != 0 )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if((fNewMailFlag)&&(!fOldNewMailFlag))
|
|
{
|
|
// create new mail dialog box button
|
|
|
|
// set old flag (stating button has been created)
|
|
fOldNewMailFlag=TRUE;
|
|
|
|
// load image and setup button
|
|
giNewMailButtonImage[0]=LoadButtonImage( "LAPTOP\\YesNoButtons.sti" ,-1,0,-1,1,-1 );
|
|
giNewMailButton[0]= QuickCreateButton( giNewMailButtonImage[0], NEW_BTN_X+10, NEW_BTN_Y,
|
|
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST-2,
|
|
(GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnNewOkback);
|
|
|
|
// set cursor
|
|
SetButtonCursor(giNewMailButton[0], CURSOR_LAPTOP_SCREEN);
|
|
|
|
// set up screen mask region
|
|
MSYS_DefineRegion(&pScreenMask, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, MSYS_PRIORITY_HIGHEST-3,
|
|
CURSOR_LAPTOP_SCREEN, MSYS_NO_CALLBACK, LapTopScreenCallBack);
|
|
MSYS_AddRegion(&pScreenMask);
|
|
MarkAButtonDirty( giNewMailButton[0] );
|
|
fReDrawScreenFlag = TRUE;
|
|
}
|
|
else if((!fNewMailFlag)&&(fOldNewMailFlag))
|
|
{
|
|
// reset old flag
|
|
fOldNewMailFlag=FALSE;
|
|
|
|
// remove the button
|
|
RemoveButton( giNewMailButton[0] );
|
|
UnloadButtonImage( giNewMailButtonImage[0] );
|
|
|
|
// remove screen mask
|
|
MSYS_RemoveRegion( &pScreenMask );
|
|
|
|
//re draw screen
|
|
fReDraw=TRUE;
|
|
|
|
// redraw screen
|
|
fPausedReDrawScreenFlag=TRUE;
|
|
}
|
|
}
|
|
|
|
BOOLEAN DisplayNewMailBox( void )
|
|
{
|
|
HVOBJECT hHandle;
|
|
static BOOLEAN fOldNewMailFlag=FALSE;
|
|
// will display a new mail box whenever new mail has arrived
|
|
|
|
// check if we are video conferencing, if so, do nothing
|
|
if( gubVideoConferencingMode != 0 )
|
|
{
|
|
return( FALSE );
|
|
}
|
|
|
|
// just stopped displaying box, reset old flag
|
|
if( ( !fNewMailFlag ) && ( fOldNewMailFlag ) )
|
|
{
|
|
fOldNewMailFlag=FALSE;
|
|
return ( FALSE );
|
|
}
|
|
|
|
// not even set, leave NOW!
|
|
if( !fNewMailFlag )
|
|
return ( FALSE );
|
|
|
|
// is set but already drawn, LEAVE NOW!
|
|
//if( ( fNewMailFlag ) && ( fOldNewMailFlag ) )
|
|
// return ( FALSE );
|
|
|
|
GetVideoObject( &hHandle, guiEmailWarning );
|
|
BltVideoObject( FRAME_BUFFER, hHandle, 0,EMAIL_WARNING_X, EMAIL_WARNING_Y, VO_BLT_SRCTRANSPARENCY,NULL );
|
|
|
|
// the icon for the title of this box
|
|
GetVideoObject( &hHandle, guiTITLEBARICONS );
|
|
BltVideoObject( FRAME_BUFFER, hHandle, 0,EMAIL_WARNING_X + 5, EMAIL_WARNING_Y + 2, VO_BLT_SRCTRANSPARENCY,NULL );
|
|
|
|
// font stuff
|
|
SetFont( EMAIL_HEADER_FONT );
|
|
SetFontForeground( FONT_WHITE );
|
|
SetFontBackground( FONT_BLACK );
|
|
SetFontShadow( DEFAULT_SHADOW );
|
|
|
|
// print warning
|
|
mprintf(EMAIL_WARNING_X + 30, EMAIL_WARNING_Y + 8, pEmailTitleText[0] );
|
|
|
|
// font stuff
|
|
SetFontShadow( NO_SHADOW );
|
|
SetFont( EMAIL_WARNING_FONT );
|
|
SetFontForeground( FONT_BLACK );
|
|
|
|
// printf warning string
|
|
mprintf(EMAIL_WARNING_X + 60, EMAIL_WARNING_Y + 63, pNewMailStrings[0] );
|
|
DrawLapTopIcons( );
|
|
|
|
// invalidate region
|
|
InvalidateRegion( EMAIL_WARNING_X, EMAIL_WARNING_Y, EMAIL_WARNING_X + 270, EMAIL_WARNING_Y + 200 );
|
|
|
|
// mark button
|
|
MarkAButtonDirty( giNewMailButton[0] );
|
|
|
|
// reset shadow
|
|
SetFontShadow( DEFAULT_SHADOW );
|
|
|
|
// redraw icons
|
|
|
|
// set box as displayed
|
|
fOldNewMailFlag=TRUE;
|
|
|
|
// return
|
|
return ( TRUE );
|
|
}
|
|
|
|
void ReDrawNewMailBox( void )
|
|
{
|
|
// this function will check to see if the new mail region needs to be redrawn
|
|
if( fReDrawNewMailFlag == TRUE )
|
|
{
|
|
if( fNewMailFlag )
|
|
{
|
|
// set display flag back to orginal
|
|
fNewMailFlag = FALSE;
|
|
|
|
// display new mail box
|
|
DisplayNewMailBox( );
|
|
|
|
// dirty buttons
|
|
MarkAButtonDirty( giNewMailButton[0] );
|
|
|
|
// set display flag back to orginal
|
|
fNewMailFlag = TRUE;
|
|
|
|
// time to redraw
|
|
DisplayNewMailBox( );
|
|
}
|
|
|
|
// reset flag for redraw
|
|
fReDrawNewMailFlag = FALSE;
|
|
}
|
|
}
|
|
|
|
static void SwitchEmailPages( void )
|
|
{
|
|
// this function will switch current page
|
|
|
|
// gone too far, reset page to start
|
|
if( iCurrentPage >iLastPage )
|
|
iCurrentPage=0;
|
|
|
|
// set to last page
|
|
if( iCurrentPage < 0 )
|
|
iCurrentPage=iLastPage;
|
|
}
|
|
|
|
|
|
void DetermineNextPrevPageDisplay( void )
|
|
{
|
|
// will determine which of previous and next page graphics to display
|
|
if( iCurrentPage > 0 )
|
|
{
|
|
// display Previous graphic
|
|
|
|
// font stuff
|
|
SetFont( TRAVERSE_EMAIL_FONT );
|
|
SetFontForeground( FONT_RED );
|
|
SetFontBackground( FONT_BLACK );
|
|
|
|
// print previous string
|
|
mprintf( PREVIOUS_PAGE_X, PREVIOUS_PAGE_Y, pTraverseStrings[PREVIOUS_PAGE] );
|
|
}
|
|
|
|
// less than last page, so there is a next page
|
|
if(iCurrentPage <iLastPage)
|
|
{
|
|
// display Next graphic
|
|
|
|
// font stuff
|
|
SetFont( TRAVERSE_EMAIL_FONT );
|
|
SetFontForeground( FONT_RED );
|
|
SetFontBackground( FONT_BLACK );
|
|
|
|
// next string
|
|
mprintf( NEXT_PAGE_X, NEXT_PAGE_Y, pTraverseStrings[NEXT_PAGE] );
|
|
}
|
|
}
|
|
|
|
void NextRegionButtonCallback(GUI_BUTTON *btn,INT32 reason )
|
|
{
|
|
|
|
if (!(btn->uiFlags & BUTTON_ENABLED))
|
|
return;
|
|
|
|
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
|
|
{
|
|
if(!(btn->uiFlags & BUTTON_CLICKED_ON))
|
|
{
|
|
}
|
|
btn->uiFlags|=(BUTTON_CLICKED_ON);
|
|
}
|
|
else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
|
|
{
|
|
if(btn->uiFlags & BUTTON_CLICKED_ON)
|
|
{
|
|
btn->uiFlags&=~(BUTTON_CLICKED_ON);
|
|
|
|
// not on last page, move ahead one
|
|
if(iCurrentPage <iLastPage)
|
|
{
|
|
iCurrentPage++;
|
|
fReDraw=TRUE;
|
|
RenderEmail();
|
|
MarkButtonsDirty( );
|
|
}
|
|
}
|
|
}
|
|
else if (reason & MSYS_CALLBACK_REASON_RBUTTON_UP)
|
|
{
|
|
// nothing yet
|
|
}
|
|
}
|
|
|
|
void BtnPreviousEmailPageCallback(GUI_BUTTON *btn,INT32 reason)
|
|
{
|
|
if (!(btn->uiFlags & BUTTON_ENABLED))
|
|
return;
|
|
|
|
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
|
|
{
|
|
if(!(btn->uiFlags & BUTTON_CLICKED_ON))
|
|
{
|
|
}
|
|
btn->uiFlags|=(BUTTON_CLICKED_ON);
|
|
}
|
|
else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
|
|
{
|
|
if(btn->uiFlags & BUTTON_CLICKED_ON)
|
|
{
|
|
if( giMessagePage > 0 )
|
|
{
|
|
giMessagePage--;
|
|
}
|
|
|
|
btn->uiFlags&=~(BUTTON_CLICKED_ON);
|
|
|
|
fReDraw=TRUE;
|
|
RenderEmail();
|
|
MarkButtonsDirty( );
|
|
}
|
|
}
|
|
else if (reason & MSYS_CALLBACK_REASON_RBUTTON_UP)
|
|
{
|
|
// nothing yet
|
|
}
|
|
}
|
|
|
|
void BtnNextEmailPageCallback(GUI_BUTTON *btn,INT32 reason)
|
|
{
|
|
if (!(btn->uiFlags & BUTTON_ENABLED))
|
|
return;
|
|
|
|
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
|
|
{
|
|
if(!(btn->uiFlags & BUTTON_CLICKED_ON))
|
|
{
|
|
}
|
|
btn->uiFlags|=(BUTTON_CLICKED_ON);
|
|
}
|
|
else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
|
|
{
|
|
// not on last page, move ahead one
|
|
btn->uiFlags&=~(BUTTON_CLICKED_ON);
|
|
|
|
if( ( giNumberOfPagesToCurrentEmail - 1 ) <= giMessagePage )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( ! ( fOnLastPageFlag ) )
|
|
{
|
|
if( ( giNumberOfPagesToCurrentEmail - 1 ) > ( giMessagePage + 1 ) )
|
|
giMessagePage++;
|
|
}
|
|
|
|
MarkButtonsDirty( );
|
|
fReDrawScreenFlag = TRUE;
|
|
}
|
|
else if (reason & MSYS_CALLBACK_REASON_RBUTTON_UP)
|
|
{
|
|
// nothing yet
|
|
}
|
|
}
|
|
|
|
void PreviousRegionButtonCallback(GUI_BUTTON *btn,INT32 reason)
|
|
{
|
|
if (!(btn->uiFlags & BUTTON_ENABLED))
|
|
return;
|
|
|
|
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
|
|
{
|
|
if(!(btn->uiFlags & BUTTON_CLICKED_ON))
|
|
{
|
|
}
|
|
btn->uiFlags|=(BUTTON_CLICKED_ON);
|
|
}
|
|
else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
|
|
{
|
|
if(btn->uiFlags & BUTTON_CLICKED_ON)
|
|
{
|
|
btn->uiFlags&=~(BUTTON_CLICKED_ON);
|
|
// if we are not on forst page, more back one
|
|
if(iCurrentPage>0)
|
|
{
|
|
iCurrentPage--;
|
|
fReDraw=TRUE;
|
|
RenderEmail();
|
|
MarkButtonsDirty( );
|
|
}
|
|
}
|
|
}
|
|
else if (reason & MSYS_CALLBACK_REASON_RBUTTON_UP)
|
|
{
|
|
// nothing yet
|
|
}
|
|
}
|
|
|
|
static void BtnDeleteNoback(GUI_BUTTON *btn,INT32 reason)
|
|
{
|
|
if (!(btn->uiFlags & BUTTON_ENABLED))
|
|
return;
|
|
|
|
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
|
|
{
|
|
if(!(btn->uiFlags & BUTTON_CLICKED_ON))
|
|
{
|
|
}
|
|
btn->uiFlags|=(BUTTON_CLICKED_ON);
|
|
}
|
|
else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
|
|
{
|
|
if(btn->uiFlags & BUTTON_CLICKED_ON)
|
|
{
|
|
btn->uiFlags&=~(BUTTON_CLICKED_ON);
|
|
fDeleteMailFlag=FALSE;
|
|
fReDrawScreenFlag=TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void BtnDeleteYesback(GUI_BUTTON *btn,INT32 reason)
|
|
{
|
|
if (!(btn->uiFlags & BUTTON_ENABLED))
|
|
return;
|
|
|
|
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
|
|
{
|
|
if(!(btn->uiFlags & BUTTON_CLICKED_ON))
|
|
{
|
|
}
|
|
btn->uiFlags|=(BUTTON_CLICKED_ON);
|
|
}
|
|
else if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
|
|
{
|
|
if(btn->uiFlags & BUTTON_CLICKED_ON)
|
|
{
|
|
btn->uiFlags&=~(BUTTON_CLICKED_ON);
|
|
fReDrawScreenFlag=TRUE;
|
|
DeleteEmail();
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
void CreateDestroyNextPreviousRegions()
|
|
{
|
|
static BOOLEAN fCreated=FALSE;
|
|
if(fCreated)
|
|
{
|
|
// destroy already create next, previous mouse regions
|
|
fCreated=FALSE;
|
|
|
|
RemoveButton( giMailPageButtons[ 1 ] );
|
|
UnloadButtonImage( giMailPageButtonsImage[ 1 ] );
|
|
|
|
RemoveButton( giMailPageButtons[ 0 ] );
|
|
UnloadButtonImage( giMailPageButtonsImage[ 0 ] );
|
|
|
|
}
|
|
else
|
|
{
|
|
// create uncreated mouse regions
|
|
fCreated=TRUE;
|
|
|
|
CreateNextPreviousEmailPageButtons( );
|
|
|
|
/*
|
|
// ' next' region
|
|
MSYS_DefineRegion(&pEmailMoveRegions[NEXT_BUTTON],NEXT_PAGE_X, NEXT_PAGE_Y,(INT16) (NEXT_PAGE_X+NEXT_WIDTH), (INT16)(NEXT_PAGE_Y+NEXT_HEIGHT),
|
|
MSYS_PRIORITY_NORMAL+2,MSYS_NO_CURSOR, MSYS_NO_CALLBACK, NextRegionButtonCallback);
|
|
|
|
// ' previous ' region
|
|
MSYS_DefineRegion(&pEmailMoveRegions[PREVIOUS_BUTTON],PREVIOUS_PAGE_X,PREVIOUS_PAGE_Y, (INT16)(PREVIOUS_PAGE_X+PREVIOUS_WIDTH),(INT16)(PREVIOUS_PAGE_Y+PREVIOUS_HEIGHT),
|
|
MSYS_PRIORITY_NORMAL+2,MSYS_NO_CURSOR, MSYS_NO_CALLBACK, PreviousRegionButtonCallback );
|
|
|
|
// add regions
|
|
MSYS_AddRegion(&pEmailMoveRegions[PREVIOUS_BUTTON]);
|
|
MSYS_AddRegion(&pEmailMoveRegions[NEXT_BUTTON]);
|
|
*/
|
|
}
|
|
}
|
|
|
|
void ReDraw()
|
|
{
|
|
// forces update of entire laptop screen
|
|
if(fReDraw)
|
|
{
|
|
RenderLaptop( );
|
|
//EnterNewLaptopMode();
|
|
DrawLapTopText();
|
|
ReDrawHighLight();
|
|
MarkButtonsDirty( );
|
|
fReDraw=FALSE;
|
|
}
|
|
}
|
|
|
|
void CreateDestroyDeleteNoticeMailButton()
|
|
{
|
|
static BOOLEAN fOldDeleteMailFlag=FALSE;
|
|
if((fDeleteMailFlag)&&(!fOldDeleteMailFlag))
|
|
{
|
|
// confirm delete email buttons
|
|
|
|
// YES button
|
|
fOldDeleteMailFlag=TRUE;
|
|
giDeleteMailButtonImage[0]=LoadButtonImage( "LAPTOP\\YesNoButtons.sti" ,-1,0,-1,1,-1 );
|
|
giDeleteMailButton[0]= QuickCreateButton( giDeleteMailButtonImage[0], NEW_BTN_X+1, NEW_BTN_Y,
|
|
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 2,
|
|
(GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnDeleteYesback);
|
|
|
|
// NO button
|
|
giDeleteMailButtonImage[1]=LoadButtonImage( "LAPTOP\\YesNoButtons.sti" ,-1,2,-1,3,-1 );
|
|
giDeleteMailButton[1]= QuickCreateButton( giDeleteMailButtonImage[1], NEW_BTN_X+40, NEW_BTN_Y,
|
|
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 2,
|
|
(GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnDeleteNoback);
|
|
|
|
// set up cursors
|
|
SetButtonCursor(giDeleteMailButton[0], CURSOR_LAPTOP_SCREEN);
|
|
SetButtonCursor(giDeleteMailButton[1], CURSOR_LAPTOP_SCREEN);
|
|
|
|
// set up screen mask to prevent other actions while delete mail box is destroyed
|
|
MSYS_DefineRegion(&pDeleteScreenMask,0, 0,SCREEN_WIDTH, SCREEN_HEIGHT,
|
|
MSYS_PRIORITY_HIGHEST-3,CURSOR_LAPTOP_SCREEN, MSYS_NO_CALLBACK, LapTopScreenCallBack);
|
|
MSYS_AddRegion(&pDeleteScreenMask);
|
|
|
|
// force update
|
|
fReDrawScreenFlag = TRUE;
|
|
|
|
}
|
|
else if((!fDeleteMailFlag)&&(fOldDeleteMailFlag))
|
|
{
|
|
|
|
// clear out the buttons and screen mask
|
|
fOldDeleteMailFlag=FALSE;
|
|
RemoveButton( giDeleteMailButton[0] );
|
|
UnloadButtonImage( giDeleteMailButtonImage[0] );
|
|
RemoveButton( giDeleteMailButton[1] );
|
|
UnloadButtonImage( giDeleteMailButtonImage[1] );
|
|
|
|
// the region
|
|
MSYS_RemoveRegion(&pDeleteScreenMask);
|
|
|
|
// force refresh
|
|
fReDrawScreenFlag=TRUE;
|
|
}
|
|
}
|
|
|
|
BOOLEAN DisplayDeleteNotice(EmailPtr pMail)
|
|
{
|
|
HVOBJECT hHandle;
|
|
// will display a delete mail box whenever delete mail has arrived
|
|
if(!fDeleteMailFlag)
|
|
return(FALSE);
|
|
|
|
if( !fReDrawScreenFlag )
|
|
{
|
|
// no redraw flag, leave
|
|
return( FALSE );
|
|
}
|
|
|
|
// error check.. no valid message passed
|
|
if( pMail == NULL )
|
|
{
|
|
return ( FALSE );
|
|
}
|
|
|
|
// load graphics
|
|
|
|
GetVideoObject(&hHandle, guiEmailWarning);
|
|
BltVideoObject(FRAME_BUFFER, hHandle, 0,EMAIL_WARNING_X, EMAIL_WARNING_Y, VO_BLT_SRCTRANSPARENCY,NULL);
|
|
|
|
// font stuff
|
|
SetFont( EMAIL_HEADER_FONT );
|
|
SetFontForeground( FONT_WHITE );
|
|
SetFontBackground( FONT_BLACK );
|
|
SetFontShadow( DEFAULT_SHADOW );
|
|
|
|
// the icon for the title of this box
|
|
GetVideoObject( &hHandle, guiTITLEBARICONS );
|
|
BltVideoObject( FRAME_BUFFER, hHandle, 0,EMAIL_WARNING_X + 5, EMAIL_WARNING_Y + 2, VO_BLT_SRCTRANSPARENCY,NULL );
|
|
|
|
// title
|
|
mprintf(EMAIL_WARNING_X + 30, EMAIL_WARNING_Y + 8, pEmailTitleText[0] );
|
|
|
|
// shadow, font, and foreground
|
|
SetFontShadow( NO_SHADOW );
|
|
SetFont( EMAIL_WARNING_FONT );
|
|
SetFontForeground( FONT_BLACK );
|
|
|
|
// draw text based on mail being read or not
|
|
if((pMail->fRead))
|
|
mprintf(EMAIL_WARNING_X + 95 , EMAIL_WARNING_Y + 65,pDeleteMailStrings[0]);
|
|
else
|
|
mprintf(EMAIL_WARNING_X + 70, EMAIL_WARNING_Y + 65,pDeleteMailStrings[1]);
|
|
|
|
// invalidate screen area, for refresh
|
|
|
|
if( ! fNewMailFlag )
|
|
{
|
|
// draw buttons
|
|
MarkButtonsDirty( );
|
|
InvalidateRegion(EMAIL_WARNING_X, EMAIL_WARNING_Y ,EMAIL_WARNING_X+EMAIL_WARNING_WIDTH,EMAIL_WARNING_Y+EMAIL_WARNING_HEIGHT);
|
|
}
|
|
|
|
// reset font shadow
|
|
SetFontShadow(DEFAULT_SHADOW);
|
|
|
|
return ( TRUE );
|
|
}
|
|
|
|
void DeleteEmail()
|
|
{
|
|
// error check, invalid mail, or not time to delete mail
|
|
if( fDeleteInternal != TRUE )
|
|
{
|
|
if((iDeleteId==-1)||(!fDeleteMailFlag))
|
|
return;
|
|
}
|
|
// remove the message
|
|
RemoveEmailMessage(iDeleteId);
|
|
|
|
// stop displaying message, if so
|
|
fDisplayMessageFlag = FALSE;
|
|
|
|
// upadte list
|
|
PlaceMessagesinPages();
|
|
|
|
// redraw icons (if deleted message was last unread, remove checkmark)
|
|
DrawLapTopIcons();
|
|
|
|
// if all of a sudden we are beyond last page, move back one
|
|
if(iCurrentPage > iLastPage)
|
|
iCurrentPage=iLastPage;
|
|
|
|
// rerender mail list
|
|
RenderEmail();
|
|
|
|
// nolong time to delete mail
|
|
fDeleteMailFlag=FALSE;
|
|
fReDrawScreenFlag=TRUE;
|
|
// refresh screen (get rid of dialog box image)
|
|
//ReDraw();
|
|
|
|
// invalidate
|
|
InvalidateRegion(0,0,SCREEN_WIDTH, SCREEN_HEIGHT);
|
|
}
|
|
|
|
|
|
void FromCallback(GUI_BUTTON *btn, INT32 iReason )
|
|
{
|
|
if (iReason & MSYS_CALLBACK_REASON_INIT)
|
|
{
|
|
return;
|
|
}
|
|
if(iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
|
|
{
|
|
// sort messages based on sender name, then replace into pages of email
|
|
fSortSenderUpwards = !fSortSenderUpwards;
|
|
|
|
SortMessages(SENDER);
|
|
|
|
//SpecifyButtonIcon( giSortButton[1] , giArrowsForEmail, UINT16 usVideoObjectIndex, INT8 bXOffset, INT8 bYOffset, TRUE );
|
|
|
|
fJustStartedEmail = FALSE;
|
|
|
|
PlaceMessagesinPages();
|
|
btn->uiFlags&= ~(BUTTON_CLICKED_ON);
|
|
}
|
|
|
|
else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
|
|
{
|
|
// nothing yet
|
|
}
|
|
}
|
|
|
|
void SubjectCallback(GUI_BUTTON *btn, INT32 iReason )
|
|
{
|
|
if (iReason & MSYS_CALLBACK_REASON_INIT)
|
|
{
|
|
return;
|
|
}
|
|
if(iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
|
|
{
|
|
// sort message on subject and reorder list
|
|
fSortSubjectUpwards = !fSortSubjectUpwards;
|
|
|
|
SortMessages(SUBJECT);
|
|
fJustStartedEmail = FALSE;
|
|
PlaceMessagesinPages();
|
|
|
|
btn->uiFlags&= ~(BUTTON_CLICKED_ON);
|
|
}
|
|
else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
|
|
{
|
|
// nothing yet
|
|
}
|
|
|
|
}
|
|
|
|
void BtnDeleteCallback(GUI_BUTTON *btn, INT32 iReason )
|
|
{
|
|
if (iReason & MSYS_CALLBACK_REASON_INIT)
|
|
{
|
|
return;
|
|
}
|
|
if(iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
|
|
{
|
|
|
|
btn->uiFlags&= ~(BUTTON_CLICKED_ON);
|
|
iDeleteId = giMessageId;
|
|
fDeleteMailFlag = TRUE;
|
|
|
|
}
|
|
else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
|
|
{
|
|
// nothing yet
|
|
}
|
|
}
|
|
|
|
void DateCallback(GUI_BUTTON *btn, INT32 iReason )
|
|
{
|
|
if (iReason & MSYS_CALLBACK_REASON_INIT)
|
|
{
|
|
return;
|
|
}
|
|
if(iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
|
|
{
|
|
// sort messages based on date recieved and reorder lsit
|
|
fSortDateUpwards = !fSortDateUpwards;
|
|
SortMessages(RECEIVED);
|
|
PlaceMessagesinPages();
|
|
|
|
fJustStartedEmail = FALSE;
|
|
|
|
btn->uiFlags&= ~(BUTTON_CLICKED_ON);
|
|
}
|
|
else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
|
|
{
|
|
// nothing yet
|
|
}
|
|
}
|
|
|
|
void ReadCallback(GUI_BUTTON *btn, INT32 iReason )
|
|
{
|
|
if (iReason & MSYS_CALLBACK_REASON_INIT)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
|
|
{
|
|
// sort messages based on date recieved and reorder lsit
|
|
SortMessages(READ);
|
|
PlaceMessagesinPages();
|
|
|
|
fJustStartedEmail = FALSE;
|
|
|
|
btn->uiFlags&= ~(BUTTON_CLICKED_ON);
|
|
}
|
|
else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
|
|
{
|
|
// nothing yet
|
|
}
|
|
}
|
|
|
|
void ViewMessageRegionCallBack( MOUSE_REGION * pRegion, INT32 iReason )
|
|
{
|
|
if (iReason & MSYS_CALLBACK_REASON_INIT)
|
|
{
|
|
return;
|
|
}
|
|
if( iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
|
|
{
|
|
// simulate X button has been pressed and let up, this means to stop displaying the currently displayed message
|
|
|
|
// reset display message flag
|
|
fDisplayMessageFlag=FALSE;
|
|
|
|
// reset page being displayed
|
|
giMessagePage = 0;
|
|
|
|
// redraw icons
|
|
DrawLapTopIcons();
|
|
|
|
// force update of entire screen
|
|
fPausedReDrawScreenFlag=TRUE;
|
|
|
|
// rerender email
|
|
//RenderEmail();
|
|
}
|
|
else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
|
|
{
|
|
// delete message
|
|
iDeleteId = giMessageId;
|
|
fDeleteMailFlag = TRUE;
|
|
}
|
|
}
|
|
|
|
void SetUpSortRegions()
|
|
{
|
|
// have been replaced by buttons
|
|
return;
|
|
|
|
// will set up sort mail regions
|
|
|
|
// from region
|
|
/*
|
|
MSYS_DefineRegion(&pSortMailRegions[0],FROM_BOX_X ,FROM_BOX_Y, FROM_BOX_X+FROM_BOX_WIDTH ,FROM_BOX_Y+TOP_HEIGHT,
|
|
MSYS_PRIORITY_NORMAL+2,MSYS_NO_CURSOR,MSYS_NO_CALLBACK, FromCallback );
|
|
|
|
// subject region
|
|
MSYS_DefineRegion(&pSortMailRegions[1],SUBJECT_X ,FROM_BOX_Y, SUBJECT_BOX_X+SUBJECT_WIDTH ,FROM_BOX_Y+TOP_HEIGHT,
|
|
MSYS_PRIORITY_NORMAL+2,MSYS_NO_CURSOR,MSYS_NO_CALLBACK, SubjectCallback );
|
|
|
|
// date region
|
|
MSYS_DefineRegion(&pSortMailRegions[2],DATE_X ,FROM_BOX_Y, DATE_BOX_X+DATE_WIDTH ,FROM_BOX_Y+TOP_HEIGHT,
|
|
MSYS_PRIORITY_NORMAL+2,MSYS_NO_CURSOR,MSYS_NO_CALLBACK, DateCallback );
|
|
|
|
//add regions
|
|
MSYS_AddRegion(&pSortMailRegions[0]);
|
|
MSYS_AddRegion(&pSortMailRegions[1]);
|
|
MSYS_AddRegion(&pSortMailRegions[2]);
|
|
|
|
return;
|
|
*/
|
|
}
|
|
|
|
void DeleteSortRegions()
|
|
{
|
|
|
|
// have been replaced by buttons
|
|
return;
|
|
/*
|
|
MSYS_RemoveRegion(&pSortMailRegions[0]);
|
|
MSYS_RemoveRegion(&pSortMailRegions[1]);
|
|
MSYS_RemoveRegion(&pSortMailRegions[2]);
|
|
*/
|
|
}
|
|
|
|
void DisplayTextOnTitleBar( void )
|
|
{
|
|
// draw email screen title text
|
|
|
|
// font stuff
|
|
SetFont( EMAIL_TITLE_FONT );
|
|
SetFontForeground( FONT_WHITE );
|
|
SetFontBackground( FONT_BLACK );
|
|
|
|
// printf the title
|
|
mprintf( EMAIL_TITLE_X, EMAIL_TITLE_Y, pEmailTitleText[0] );
|
|
|
|
// reset the shadow
|
|
}
|
|
|
|
void DestroyMailScreenButtons( void )
|
|
{
|
|
// this function will destory the buttons used in the email screen
|
|
|
|
// the sort email buttons
|
|
RemoveButton( giSortButton[0] );
|
|
UnloadButtonImage( giSortButtonImage[0] );
|
|
RemoveButton( giSortButton[1] );
|
|
UnloadButtonImage( giSortButtonImage[1] );
|
|
RemoveButton( giSortButton[2] );
|
|
UnloadButtonImage( giSortButtonImage[2] );
|
|
RemoveButton( giSortButton[3] );
|
|
UnloadButtonImage( giSortButtonImage[3] );
|
|
}
|
|
|
|
void CreateMailScreenButtons( void )
|
|
{
|
|
// create sort buttons, right now - not finished
|
|
|
|
// read sort
|
|
giSortButtonImage[0]= LoadButtonImage( "LAPTOP\\mailbuttons.sti" ,-1,0,-1,4,-1 );
|
|
giSortButton[0] = QuickCreateButton( giSortButtonImage[0], ENVELOPE_BOX_X, FROM_BOX_Y,
|
|
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
|
|
(GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)ReadCallback);
|
|
SetButtonCursor(giSortButton[0], CURSOR_LAPTOP_SCREEN);
|
|
|
|
// subject sort
|
|
giSortButtonImage[1]= LoadButtonImage( "LAPTOP\\mailbuttons.sti" ,-1,1,-1,5,-1 );
|
|
giSortButton[1] = QuickCreateButton( giSortButtonImage[1], FROM_BOX_X, FROM_BOX_Y,
|
|
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
|
|
(GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)FromCallback);
|
|
SetButtonCursor(giSortButton[1], CURSOR_LAPTOP_SCREEN);
|
|
SpecifyFullButtonTextAttributes( giSortButton[1], pEmailHeaders[FROM_HEADER], EMAIL_WARNING_FONT,
|
|
FONT_BLACK, FONT_BLACK,
|
|
FONT_BLACK, FONT_BLACK, TEXT_CJUSTIFIED );
|
|
|
|
// sender sort
|
|
giSortButtonImage[2]= LoadButtonImage( "LAPTOP\\mailbuttons.sti" ,-1,2,-1,6,-1 );
|
|
giSortButton[2] = QuickCreateButton( giSortButtonImage[2], SUBJECT_BOX_X, FROM_BOX_Y,
|
|
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
|
|
(GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)SubjectCallback );
|
|
SetButtonCursor(giSortButton[2], CURSOR_LAPTOP_SCREEN);
|
|
SpecifyFullButtonTextAttributes( giSortButton[2], pEmailHeaders[SUBJECT_HEADER], EMAIL_WARNING_FONT,
|
|
FONT_BLACK, FONT_BLACK,
|
|
FONT_BLACK, FONT_BLACK, TEXT_CJUSTIFIED );
|
|
|
|
// date sort
|
|
giSortButtonImage[3]= LoadButtonImage( "LAPTOP\\mailbuttons.sti" ,-1,3,-1,7,-1 );
|
|
giSortButton[3] = QuickCreateButton( giSortButtonImage[3], DATE_BOX_X, FROM_BOX_Y,
|
|
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
|
|
(GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)DateCallback);
|
|
SetButtonCursor(giSortButton[3], CURSOR_LAPTOP_SCREEN);
|
|
SpecifyFullButtonTextAttributes( giSortButton[3], pEmailHeaders[RECD_HEADER], EMAIL_WARNING_FONT,
|
|
FONT_BLACK, FONT_BLACK,
|
|
FONT_BLACK, FONT_BLACK, TEXT_CJUSTIFIED );
|
|
}
|
|
|
|
void DisplayEmailMessageSubjectDateFromLines( EmailPtr pMail , INT32 iViewerY)
|
|
{
|
|
// this procedure will draw the title/headers to From, Subject, Date fields in the display
|
|
// message box
|
|
INT16 usX, usY;
|
|
CHAR16 sString[100];
|
|
|
|
// font stuff
|
|
SetFont(MESSAGE_FONT);
|
|
SetFontForeground(FONT_BLACK);
|
|
SetFontBackground(FONT_BLACK);
|
|
SetFontShadow(NO_SHADOW);
|
|
|
|
// all headers, but not info are right justified
|
|
|
|
// print from
|
|
FindFontRightCoordinates( MESSAGE_HEADER_X-20, ( INT16 ) ( MESSAGE_FROM_Y + (INT16)iViewerY ) , MESSAGE_HEADER_WIDTH, ( INT16 ) ( MESSAGE_FROM_Y + GetFontHeight ( MESSAGE_FONT ) ) ,pEmailHeaders[0] ,MESSAGE_FONT, &usX, &usY);
|
|
mprintf( usX, MESSAGE_FROM_Y + (UINT16)iViewerY, pEmailHeaders[0]);
|
|
|
|
// the actual from info
|
|
if ( pMail->EmailVersion == TYPE_EMAIL_AIM_AVAILABLE || pMail->EmailVersion == TYPE_EMAIL_MERC_LEVEL_UP )
|
|
{
|
|
if (gMercProfiles[ pMail->ubSender ].zNickname !='\0')
|
|
mprintf( MESSAGE_HEADER_X+MESSAGE_HEADER_WIDTH-13, MESSAGE_FROM_Y + iViewerY, gMercProfiles[ pMail->ubSender ].zNickname);
|
|
else
|
|
mprintf( MESSAGE_HEADER_X+MESSAGE_HEADER_WIDTH-13, MESSAGE_FROM_Y + iViewerY, L"None");
|
|
}
|
|
else if ( pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT || pMail->EmailVersion == TYPE_EMAIL_BOBBY_R || pMail->EmailVersion == TYPE_EMAIL_BOBBY_R_EMAIL_JA2_EDT || pMail->EmailVersion == TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT || pMail->EmailVersion == TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT || pMail->EmailVersion == TYPE_EMAIL_XML)
|
|
{
|
|
mprintf( MESSAGE_HEADER_X+MESSAGE_HEADER_WIDTH-13, MESSAGE_FROM_Y + iViewerY, pSenderNameList[pMail->ubSender]);
|
|
}
|
|
else if ( pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT_NAME_MERC )
|
|
{
|
|
if (gMercProfiles[ pMail->ubSender ].zNickname !='\0')
|
|
mprintf( MESSAGE_HEADER_X+MESSAGE_HEADER_WIDTH-13, MESSAGE_FROM_Y + iViewerY, gMercProfiles[ pMail->ubSender ].zNickname);
|
|
else
|
|
mprintf( MESSAGE_HEADER_X+MESSAGE_HEADER_WIDTH-13, MESSAGE_FROM_Y + iViewerY, L"None");
|
|
}
|
|
|
|
// print date
|
|
FindFontRightCoordinates( MESSAGE_HEADER_X+168, ( INT16 ) ( MESSAGE_DATE_Y + (UINT16)iViewerY ), MESSAGE_HEADER_WIDTH, ( INT16 ) ( MESSAGE_DATE_Y + GetFontHeight ( MESSAGE_FONT ) ) ,pEmailHeaders[2] ,MESSAGE_FONT, &usX, &usY);
|
|
mprintf( usX, MESSAGE_DATE_Y+ (UINT16)iViewerY , pEmailHeaders[2]);
|
|
|
|
// the actual date info
|
|
swprintf(sString, L"%d", ( ( pMail->iDate ) / ( 24 * 60) ) );
|
|
mprintf( MESSAGE_HEADER_X+235, MESSAGE_DATE_Y + (UINT16)iViewerY, sString);
|
|
|
|
|
|
|
|
// print subject
|
|
FindFontRightCoordinates( MESSAGE_HEADER_X-20, MESSAGE_SUBJECT_Y , MESSAGE_HEADER_WIDTH, ( INT16 ) (MESSAGE_SUBJECT_Y + GetFontHeight ( MESSAGE_FONT )),pEmailHeaders[1] ,MESSAGE_FONT, &usX, &usY);
|
|
mprintf( usX, MESSAGE_SUBJECT_Y + (UINT16)iViewerY, pEmailHeaders[1]);
|
|
|
|
// the actual subject info
|
|
//mprintf( , MESSAGE_SUBJECT_Y, pMail->pSubject);
|
|
IanDisplayWrappedString(SUBJECT_LINE_X+2, (INT16) ( SUBJECT_LINE_Y+2 + (UINT16)iViewerY ), SUBJECT_LINE_WIDTH, MESSAGE_GAP, MESSAGE_FONT, MESSAGE_COLOR,pMail->pSubject,0,FALSE,0);
|
|
|
|
|
|
// reset shadow
|
|
SetFontShadow(DEFAULT_SHADOW);
|
|
return;
|
|
}
|
|
|
|
|
|
void DrawEmailMessageDisplayTitleText( INT32 iViewerY )
|
|
{
|
|
// this procedure will display the title of the email message display box
|
|
|
|
// font stuff
|
|
SetFont( EMAIL_HEADER_FONT );
|
|
SetFontForeground( FONT_WHITE );
|
|
SetFontBackground( FONT_BLACK );
|
|
|
|
// dsiplay mail viewer title on message viewer
|
|
mprintf( VIEWER_X + 30, VIEWER_Y + 8 + (UINT16) iViewerY, pEmailTitleText[0] );
|
|
|
|
return;
|
|
}
|
|
|
|
void DrawLineDividers( void )
|
|
{
|
|
// this function draws divider lines between lines of text
|
|
INT32 iCounter=0;
|
|
HVOBJECT hHandle;
|
|
|
|
for(iCounter=1; iCounter < 19; iCounter++)
|
|
{
|
|
GetVideoObject( &hHandle, guiMAILDIVIDER );
|
|
BltVideoObject(FRAME_BUFFER, hHandle, 0,INDIC_X-10, (MIDDLE_Y+iCounter*MIDDLE_WIDTH - 1), VO_BLT_SRCTRANSPARENCY,NULL);
|
|
}
|
|
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
void ClearOutEmailMessageRecordsList( void )
|
|
{
|
|
RecordPtr pTempRecord;
|
|
INT32 iCounter = 0;
|
|
|
|
// runt hrough list freeing records up
|
|
while(pMessageRecordList)
|
|
{
|
|
// set temp to current
|
|
pTempRecord = pMessageRecordList;
|
|
|
|
// next element
|
|
pMessageRecordList = pMessageRecordList->Next;
|
|
|
|
MemFree( pTempRecord );
|
|
}
|
|
|
|
for( iCounter = 0; iCounter < MAX_NUMBER_EMAIL_PAGES; iCounter++ )
|
|
{
|
|
pEmailPageInfo[ iCounter ].pFirstRecord = NULL;
|
|
pEmailPageInfo[ iCounter ].pLastRecord = NULL;
|
|
pEmailPageInfo[ iCounter ].iPageNumber = iCounter;
|
|
}
|
|
|
|
// null out list
|
|
pMessageRecordList = NULL;
|
|
|
|
return;
|
|
}
|
|
|
|
void AddEmailRecordToList( STR16 pString )
|
|
{
|
|
RecordPtr pTempRecord;
|
|
|
|
// set to head of list
|
|
pTempRecord=pMessageRecordList;
|
|
|
|
if(!pTempRecord)
|
|
{
|
|
// list empty, set this node to head
|
|
pTempRecord = (RecordPtr) MemAlloc( sizeof(Record));
|
|
pMessageRecordList = pTempRecord;
|
|
}
|
|
else
|
|
{
|
|
// run to end of list
|
|
while(pTempRecord->Next)
|
|
{
|
|
pTempRecord = pTempRecord->Next;
|
|
}
|
|
|
|
// found, alloc
|
|
pTempRecord->Next = (messagerecord *) MemAlloc( sizeof(Record) );
|
|
|
|
// move to node
|
|
pTempRecord = pTempRecord->Next;
|
|
}
|
|
|
|
// set next to null
|
|
pTempRecord->Next = NULL;
|
|
|
|
// copy in string
|
|
wcscpy( pTempRecord->pRecord, pString );
|
|
|
|
// done return
|
|
}
|
|
|
|
void UpDateMessageRecordList( void )
|
|
{
|
|
// simply checks to see if old and new message ids are the same, if so, do nothing
|
|
// otherwise clear list
|
|
|
|
if( giMessageId != giPrevMessageId )
|
|
{
|
|
// if chenged, clear list
|
|
ClearOutEmailMessageRecordsList( );
|
|
|
|
// set prev to current
|
|
giPrevMessageId = giMessageId;
|
|
}
|
|
}
|
|
|
|
void HandleAnySpecialEmailMessageEvents(INT32 iMessageId )
|
|
{
|
|
// handles any special message events
|
|
#ifdef JA2UB
|
|
switch( iMessageId )
|
|
{
|
|
case EMAIL_MAKECONTACT:
|
|
if( !( gJa25SaveStruct.ubEmailFromSectorFlag & SECTOR_EMAIL__ANOTHER_SECTOR ) )
|
|
{
|
|
AddStrategicEvent( EVENT_SEND_ENRICO_UNDERSTANDING_EMAIL, GetWorldTotalMin() + ( 2 * 60 ) + Random( 120 ), 0 );
|
|
}
|
|
break;
|
|
|
|
case( IMP_EMAIL_AGAIN ):
|
|
SetBookMark(IMP_BOOKMARK);
|
|
break;
|
|
case( IMP_EMAIL_INTRO ):
|
|
SetBookMark(IMP_BOOKMARK);
|
|
break;
|
|
}
|
|
#else
|
|
// handles any special message events
|
|
|
|
switch( iMessageId )
|
|
{
|
|
|
|
case( IMP_EMAIL_AGAIN ):
|
|
SetBookMark(IMP_BOOKMARK);
|
|
break;
|
|
case( IMP_EMAIL_INTRO ):
|
|
SetBookMark(IMP_BOOKMARK);
|
|
break;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void ReDisplayBoxes( void )
|
|
{
|
|
// the email message itself
|
|
if(fDisplayMessageFlag)
|
|
{
|
|
// this simply redraws message with button manipulation
|
|
DisplayEmailMessage(GetEmailMessage(giMessageId));
|
|
}
|
|
|
|
if(fDeleteMailFlag)
|
|
{
|
|
// delete message, redisplay
|
|
DisplayDeleteNotice(GetEmailMessage(iDeleteId));
|
|
}
|
|
|
|
if(fNewMailFlag)
|
|
{
|
|
// if new mail, redisplay box
|
|
DisplayNewMailBox( );
|
|
}
|
|
}
|
|
|
|
#ifdef JA2UB
|
|
|
|
BOOLEAN HandleNewUBMailSpecialMessages( UINT16 usMessageId, INT32 *iResults, EmailPtr pMail )
|
|
{
|
|
BOOLEAN fSpecialCase = FALSE;
|
|
|
|
wstring wstrMail;
|
|
wstring::size_type index;
|
|
CHAR16 szMail[MAIL_STRING_SIZE];
|
|
|
|
if ( (pMail->EmailType == TYPE_E_INSURANCE_L3 && pMail->EmailVersion == TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT && usMessageId == 170) || (pMail->EmailVersion == TYPE_EMAIL_XML && pMail->iThirdData == 170) )
|
|
{
|
|
if ( gGameUBOptions.LaptopLinkInsurance == TRUE )
|
|
ModifyInsuranceEmails( usMessageId, iResults, pMail );
|
|
}
|
|
else if ( (pMail->EmailType == TYPE_E_INSURANCE_L2 && pMail->EmailVersion == TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT && usMessageId == INSUR_1HOUR_FRAUD) || (pMail->EmailVersion == TYPE_EMAIL_XML && pMail->iThirdData == INSUR_1HOUR_FRAUD) )
|
|
{
|
|
if ( gGameUBOptions.LaptopLinkInsurance == TRUE )
|
|
ModifyInsuranceEmails( usMessageId, iResults, pMail );
|
|
}
|
|
else if ( (pMail->EmailType == TYPE_E_AIM_L1 && pMail->EmailVersion == TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT && usMessageId == 206) || (pMail->EmailVersion == TYPE_EMAIL_XML && pMail->iThirdData == 206) )
|
|
{
|
|
if ( gGameUBOptions.fDeadMerc == TRUE )
|
|
ModifyInsuranceEmails( usMessageId, iResults, pMail );
|
|
}
|
|
else if ( (pMail->EmailType == TYPE_E_AIM_L3 && pMail->EmailVersion == TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT && usMessageId == 217) || (pMail->EmailVersion == TYPE_EMAIL_XML && pMail->iThirdData == 217) )
|
|
{
|
|
if ( gGameUBOptions.fDeadMerc == TRUE )
|
|
ModifyInsuranceEmails( usMessageId, iResults, pMail );
|
|
}
|
|
//Dealtar's Airport Externalization
|
|
else if ( (pMail->EmailType == TYPE_EMAIL_BOBBY_R_L1 && gGameUBOptions.fBobbyRSite == TRUE && pMail->EmailVersion == TYPE_EMAIL_BOBBY_R_EMAIL_JA2_EDT) || (pMail->EmailVersion == TYPE_EMAIL_XML && pMail->iThirdData == 198) )
|
|
{
|
|
if (!pMessageRecordList)
|
|
{
|
|
// WANNE.MAIL: Fix
|
|
gusCurShipmentDestinationID = -1; // Reset
|
|
gusCurShipmentDestinationID = pMail->iCurrentShipmentDestinationID;
|
|
|
|
// Loop through each line of the shipment EDT-file
|
|
for (int i = 0; i < BOBBYR_SHIPMENT_ARRIVED_LENGTH; ++i)
|
|
{
|
|
|
|
wstrMail.clear();
|
|
if ( pMail->EmailVersion == TYPE_EMAIL_XML && pMail->usOffset < gEmails.size() )
|
|
{
|
|
wstrMail = gEmails[pMail->usOffset].Messages[i];
|
|
}
|
|
else
|
|
{
|
|
LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", szMail, MAIL_STRING_SIZE *usMessageId, MAIL_STRING_SIZE);
|
|
}
|
|
|
|
wstrMail = szMail;
|
|
|
|
index = wstrMail.find(L"$DESTINATIONNAME$");
|
|
|
|
// WANNE.MAIL: Fix
|
|
if (gusCurShipmentDestinationID > 0)
|
|
{
|
|
if (index != wstring::npos)
|
|
{
|
|
wstrMail.erase(index, strlen("$DESTINATIONNAME$"));
|
|
RefToDestinationStruct ds = gPostalService.GetDestination(gusCurShipmentDestinationID);
|
|
wstrMail.insert(index, ds.wstrName.c_str());
|
|
}
|
|
}
|
|
|
|
AddEmailRecordToList((STR16)wstrMail.c_str());
|
|
|
|
usMessageId++;
|
|
}
|
|
}
|
|
giPrevMessageId = giMessageId;
|
|
}
|
|
|
|
return fSpecialCase;
|
|
}
|
|
|
|
#endif
|
|
|
|
BOOLEAN HandleMailSpecialMessages( UINT16 usMessageId, INT32 *iResults, EmailPtr pMail )
|
|
{
|
|
BOOLEAN fSpecialCase = FALSE;
|
|
|
|
// this procedure will handle special cases of email messages that are not stored in email.edt, or need special processing
|
|
switch( usMessageId )
|
|
{
|
|
case( IMP_EMAIL_PROFILE_RESULTS ):
|
|
|
|
HandleIMPCharProfileResultsMessage( );
|
|
fSpecialCase = TRUE;
|
|
break;
|
|
#ifdef JA2UB
|
|
//no UB
|
|
#else
|
|
case( MERC_INTRO ):
|
|
SetBookMark( MERC_BOOKMARK );
|
|
fReDrawScreenFlag = TRUE;
|
|
break;
|
|
|
|
case INSUR_PAYMENT:
|
|
case INSUR_SUSPIC:
|
|
case INSUR_SUSPIC_2:
|
|
case INSUR_INVEST_OVER:
|
|
case INSUR_CHEAT_FRAUD:
|
|
case INSUR_1HOUR_FRAUD:
|
|
case MERC_DIED_ON_OTHER_ASSIGNMENT:
|
|
case AIM_MEDICAL_DEPOSIT_REFUND:
|
|
case AIM_MEDICAL_DEPOSIT_NO_REFUND:
|
|
case AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND:
|
|
ModifyInsuranceEmails(usMessageId, iResults, pMail);
|
|
break;
|
|
|
|
case MERC_NEW_SITE_ADDRESS:
|
|
//Set the book mark so the player can access the site
|
|
SetBookMark( MERC_BOOKMARK );
|
|
break;
|
|
|
|
//Dealtar's Airport Externalization
|
|
case BOBBYR_SHIPMENT_ARRIVED:
|
|
if (!pMessageRecordList)
|
|
{
|
|
wstring wstrMail;
|
|
wstring::size_type index;
|
|
CHAR16 szMail[MAIL_STRING_SIZE];
|
|
|
|
// WANNE.MAIL: Fix
|
|
gusCurShipmentDestinationID = -1; // Reset
|
|
gusCurShipmentDestinationID = pMail->iCurrentShipmentDestinationID;
|
|
|
|
// Loop through each line of the shipment EDT-file
|
|
for (int i = 0; i < pMail->usLength; ++i)
|
|
{
|
|
wstrMail.clear();
|
|
if ( pMail->EmailVersion == TYPE_EMAIL_XML && pMail->usOffset < gEmails.size())
|
|
{
|
|
wstrMail = gEmails[pMail->usOffset].Messages[i];
|
|
}
|
|
else
|
|
{
|
|
LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", szMail, MAIL_STRING_SIZE *usMessageId, MAIL_STRING_SIZE);
|
|
wstrMail = szMail;
|
|
}
|
|
|
|
/* if (FileExists(EMAIL_EDT_FILE_JA25))
|
|
{
|
|
LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, szMail, MAIL_STRING_SIZE *usMessageId, MAIL_STRING_SIZE);
|
|
}
|
|
else
|
|
{
|
|
LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, szMail, MAIL_STRING_SIZE *usMessageId, MAIL_STRING_SIZE);
|
|
}
|
|
*/
|
|
index = wstrMail.find(L"$DESTINATIONNAME$");
|
|
|
|
// WANNE.MAIL: Fix
|
|
if (gusCurShipmentDestinationID > 0)
|
|
{
|
|
if (index != wstring::npos)
|
|
{
|
|
wstrMail.erase(index, strlen("$DESTINATIONNAME$"));
|
|
RefToDestinationStruct ds = gPostalService.GetDestination(gusCurShipmentDestinationID);
|
|
wstrMail.insert(index, ds.wstrName.c_str());
|
|
}
|
|
}
|
|
|
|
AddEmailRecordToList((STR16)wstrMail.c_str());
|
|
|
|
++usMessageId;
|
|
}
|
|
}
|
|
giPrevMessageId = giMessageId;
|
|
break;
|
|
|
|
case(PMC_INTRO) :
|
|
SetBookMark( PMC_BOOKMARK );
|
|
fReDrawScreenFlag = TRUE;
|
|
break;
|
|
|
|
case(MILITIAROSTER_INTRO) :
|
|
SetBookMark( MILITIAROSTER_BOOKMARK );
|
|
fReDrawScreenFlag = TRUE;
|
|
break;
|
|
|
|
case INTEL_ENRICO_INTRO:
|
|
SetBookMark( INTELMARKET_BOOKMARK );
|
|
fReDrawScreenFlag = TRUE;
|
|
break;
|
|
#endif
|
|
}
|
|
|
|
return fSpecialCase;
|
|
}
|
|
#ifdef JA2UB
|
|
|
|
#define IMP_RESULTS_INTRO_LENGTH 9
|
|
|
|
#define IMP_RESULTS_PERSONALITY_INTRO IMP_RESULTS_INTRO_LENGTH // 0 - 9
|
|
#define IMP_RESULTS_PERSONALITY_INTRO_LENGTH 5
|
|
#define IMP_PERSONALITY_NORMAL IMP_RESULTS_PERSONALITY_INTRO + IMP_RESULTS_PERSONALITY_INTRO_LENGTH // 14 - 18
|
|
#define IMP_PERSONALITY_LENGTH 4
|
|
#define IMP_PERSONALITY_HEAT IMP_PERSONALITY_NORMAL + IMP_PERSONALITY_LENGTH // 19 - 22
|
|
#define IMP_PERSONALITY_NERVOUS IMP_PERSONALITY_HEAT + IMP_PERSONALITY_LENGTH // 23 - 26
|
|
#define IMP_PERSONALITY_CLAUSTROPHOBIC IMP_PERSONALITY_NERVOUS + IMP_PERSONALITY_LENGTH // 27 - 30
|
|
#define IMP_PERSONALITY_NONSWIMMER IMP_PERSONALITY_CLAUSTROPHOBIC + IMP_PERSONALITY_LENGTH // 31 - 34
|
|
#define IMP_PERSONALITY_FEAR_OF_INSECTS IMP_PERSONALITY_NONSWIMMER + IMP_PERSONALITY_LENGTH
|
|
#define IMP_PERSONALITY_FORGETFUL IMP_PERSONALITY_FEAR_OF_INSECTS + IMP_PERSONALITY_LENGTH + 1
|
|
#define IMP_PERSONALITY_PSYCHO IMP_PERSONALITY_FORGETFUL + IMP_PERSONALITY_LENGTH
|
|
#define IMP_RESULTS_ATTITUDE_INTRO IMP_PERSONALITY_PSYCHO + IMP_PERSONALITY_LENGTH + 1
|
|
#define IMP_RESULTS_ATTITUDE_LENGTH 5
|
|
#define IMP_ATTITUDE_LENGTH 5
|
|
#define IMP_ATTITUDE_NORMAL IMP_RESULTS_ATTITUDE_INTRO + IMP_RESULTS_ATTITUDE_LENGTH
|
|
#define IMP_ATTITUDE_FRIENDLY IMP_ATTITUDE_NORMAL + IMP_ATTITUDE_LENGTH
|
|
#define IMP_ATTITUDE_LONER IMP_ATTITUDE_FRIENDLY + IMP_ATTITUDE_LENGTH + 1
|
|
#define IMP_ATTITUDE_OPTIMIST IMP_ATTITUDE_LONER + IMP_ATTITUDE_LENGTH + 1
|
|
#define IMP_ATTITUDE_PESSIMIST IMP_ATTITUDE_OPTIMIST + IMP_ATTITUDE_LENGTH + 1
|
|
#define IMP_ATTITUDE_AGGRESSIVE IMP_ATTITUDE_PESSIMIST + IMP_ATTITUDE_LENGTH + 1
|
|
#define IMP_ATTITUDE_ARROGANT IMP_ATTITUDE_AGGRESSIVE + IMP_ATTITUDE_LENGTH + 1 /// 88
|
|
#define IMP_ATTITUDE_ASSHOLE IMP_ATTITUDE_ARROGANT + IMP_ATTITUDE_LENGTH + 1
|
|
#define IMP_ATTITUDE_COWARD IMP_ATTITUDE_ASSHOLE + IMP_ATTITUDE_LENGTH
|
|
#define IMP_RESULTS_SKILLS IMP_ATTITUDE_COWARD + IMP_ATTITUDE_LENGTH + 1
|
|
#define IMP_RESULTS_SKILLS_LENGTH 7
|
|
#define IMP_SKILLS_IMPERIAL_SKILLS IMP_RESULTS_SKILLS + IMP_RESULTS_SKILLS_LENGTH + 1
|
|
#define IMP_SKILLS_IMPERIAL_MARK IMP_SKILLS_IMPERIAL_SKILLS + 1
|
|
#define IMP_SKILLS_IMPERIAL_MECH IMP_SKILLS_IMPERIAL_SKILLS + 2
|
|
#define IMP_SKILLS_IMPERIAL_EXPL IMP_SKILLS_IMPERIAL_SKILLS + 3
|
|
#define IMP_SKILLS_IMPERIAL_MED IMP_SKILLS_IMPERIAL_SKILLS + 4
|
|
|
|
#define IMP_SKILLS_NEED_TRAIN_SKILLS IMP_SKILLS_IMPERIAL_MED + 1
|
|
#define IMP_SKILLS_NEED_TRAIN_MARK IMP_SKILLS_NEED_TRAIN_SKILLS + 1 // 119
|
|
#define IMP_SKILLS_NEED_TRAIN_MECH IMP_SKILLS_NEED_TRAIN_SKILLS + 2
|
|
#define IMP_SKILLS_NEED_TRAIN_EXPL IMP_SKILLS_NEED_TRAIN_SKILLS + 3
|
|
#define IMP_SKILLS_NEED_TRAIN_MED IMP_SKILLS_NEED_TRAIN_SKILLS + 4
|
|
|
|
#define IMP_SKILLS_NO_SKILL IMP_SKILLS_NEED_TRAIN_MED + 1
|
|
#define IMP_SKILLS_NO_SKILL_MARK IMP_SKILLS_NO_SKILL + 1 // 124
|
|
#define IMP_SKILLS_NO_SKILL_MECH IMP_SKILLS_NO_SKILL + 2
|
|
#define IMP_SKILLS_NO_SKILL_EXPL IMP_SKILLS_NO_SKILL + 3
|
|
#define IMP_SKILLS_NO_SKILL_MED IMP_SKILLS_NO_SKILL + 4 // 127
|
|
|
|
#define IMP_SKILLS_SPECIAL_INTRO IMP_SKILLS_NO_SKILL_MED + 1 // 128, 129
|
|
#define IMP_SKILLS_SPECIAL_INTRO_LENGTH 2
|
|
#define IMP_SKILLS_SPECIAL_LOCK IMP_SKILLS_SPECIAL_INTRO + IMP_SKILLS_SPECIAL_INTRO_LENGTH // 130
|
|
#define IMP_SKILLS_SPECIAL_HAND IMP_SKILLS_SPECIAL_LOCK + 1
|
|
#define IMP_SKILLS_SPECIAL_ELEC IMP_SKILLS_SPECIAL_HAND + 1
|
|
#define IMP_SKILLS_SPECIAL_NIGHT IMP_SKILLS_SPECIAL_ELEC + 1
|
|
#define IMP_SKILLS_SPECIAL_THROW IMP_SKILLS_SPECIAL_NIGHT + 1
|
|
#define IMP_SKILLS_SPECIAL_TEACH IMP_SKILLS_SPECIAL_THROW + 1
|
|
#define IMP_SKILLS_SPECIAL_HEAVY IMP_SKILLS_SPECIAL_TEACH + 1
|
|
#define IMP_SKILLS_SPECIAL_AUTO IMP_SKILLS_SPECIAL_HEAVY + 1 // 137
|
|
#define IMP_SKILLS_SPECIAL_STEALTH IMP_SKILLS_SPECIAL_AUTO + 1
|
|
#define IMP_SKILLS_SPECIAL_AMBI IMP_SKILLS_SPECIAL_STEALTH + 1
|
|
#define IMP_SKILLS_SPECIAL_THIEF IMP_SKILLS_SPECIAL_AMBI + 1
|
|
#define IMP_SKILLS_SPECIAL_MARTIAL IMP_SKILLS_SPECIAL_THIEF + 1
|
|
#define IMP_SKILLS_SPECIAL_KNIFE IMP_SKILLS_SPECIAL_MARTIAL + 1 // 142
|
|
|
|
// WANNE: These 2 skills are missing in the email!
|
|
// The problem is, that there is no description in binarydata\impass.edt
|
|
#define IMP_SKILLS_SPECIAL_SNIPER IMP_SKILLS_SPECIAL_KNIFE + 1
|
|
#define IMP_SKILLS_SPECIAL_CAMOUFLAGED IMP_SKILLS_SPECIAL_SNIPER + 1
|
|
|
|
#define IMP_RESULTS_PHYSICAL IMP_SKILLS_SPECIAL_KNIFE + 1
|
|
#define IMP_RESULTS_PHYSICAL_LENGTH 7
|
|
|
|
#define IMP_PHYSICAL_SUPER IMP_RESULTS_PHYSICAL + IMP_RESULTS_PHYSICAL_LENGTH
|
|
#define IMP_PHYSICAL_SUPER_LENGTH 1
|
|
|
|
#define IMP_PHYSICAL_SUPER_HEALTH IMP_PHYSICAL_SUPER + IMP_PHYSICAL_SUPER_LENGTH
|
|
#define IMP_PHYSICAL_SUPER_AGILITY IMP_PHYSICAL_SUPER_HEALTH + 1
|
|
#define IMP_PHYSICAL_SUPER_DEXTERITY IMP_PHYSICAL_SUPER_AGILITY + 1
|
|
#define IMP_PHYSICAL_SUPER_STRENGTH IMP_PHYSICAL_SUPER_DEXTERITY + 1
|
|
#define IMP_PHYSICAL_SUPER_LEADERSHIP IMP_PHYSICAL_SUPER_STRENGTH + 1
|
|
#define IMP_PHYSICAL_SUPER_WISDOM IMP_PHYSICAL_SUPER_LEADERSHIP + 1
|
|
|
|
#define IMP_PHYSICAL_LOW IMP_PHYSICAL_SUPER_WISDOM + 1
|
|
#define IMP_PHYSICAL_LOW_LENGTH 1
|
|
|
|
#define IMP_PHYSICAL_LOW_HEALTH IMP_PHYSICAL_LOW + IMP_PHYSICAL_LOW_LENGTH
|
|
#define IMP_PHYSICAL_LOW_AGILITY IMP_PHYSICAL_LOW_HEALTH + 1
|
|
#define IMP_PHYSICAL_LOW_DEXTERITY IMP_PHYSICAL_LOW_AGILITY + 2
|
|
#define IMP_PHYSICAL_LOW_STRENGTH IMP_PHYSICAL_LOW_DEXTERITY + 1
|
|
#define IMP_PHYSICAL_LOW_LEADERSHIP IMP_PHYSICAL_LOW_STRENGTH + 1
|
|
#define IMP_PHYSICAL_LOW_WISDOM IMP_PHYSICAL_LOW_LEADERSHIP + 1
|
|
|
|
|
|
#define IMP_PHYSICAL_VERY_LOW IMP_PHYSICAL_LOW_WISDOM + 1
|
|
#define IMP_PHYSICAL_VERY_LOW_LENGTH 1
|
|
|
|
#define IMP_PHYSICAL_VERY_LOW_HEALTH IMP_PHYSICAL_VERY_LOW + IMP_PHYSICAL_VERY_LOW_LENGTH
|
|
#define IMP_PHYSICAL_VERY_LOW_AGILITY IMP_PHYSICAL_VERY_LOW_HEALTH + 1
|
|
#define IMP_PHYSICAL_VERY_LOW_DEXTERITY IMP_PHYSICAL_VERY_LOW_AGILITY + 1
|
|
#define IMP_PHYSICAL_VERY_LOW_STRENGTH IMP_PHYSICAL_VERY_LOW_DEXTERITY + 1
|
|
#define IMP_PHYSICAL_VERY_LOW_LEADERSHIP IMP_PHYSICAL_VERY_LOW_STRENGTH + 1
|
|
#define IMP_PHYSICAL_VERY_LOW_WISDOM IMP_PHYSICAL_VERY_LOW_LEADERSHIP + 1
|
|
|
|
|
|
#define IMP_PHYSICAL_END IMP_PHYSICAL_VERY_LOW_WISDOM + 1
|
|
#define IMP_PHYSICAL_END_LENGTH 3
|
|
|
|
#define IMP_RESULTS_PORTRAIT IMP_PHYSICAL_END + IMP_PHYSICAL_END_LENGTH
|
|
#define IMP_RESULTS_PORTRAIT_LENGTH 6
|
|
|
|
|
|
#define IMP_PORTRAIT_MALE_1 IMP_RESULTS_PORTRAIT + IMP_RESULTS_PORTRAIT_LENGTH
|
|
#define IMP_PORTRAIT_MALE_2 IMP_PORTRAIT_MALE_1 + 4
|
|
#define IMP_PORTRAIT_MALE_3 IMP_PORTRAIT_MALE_2 + 4
|
|
#define IMP_PORTRAIT_MALE_4 IMP_PORTRAIT_MALE_3 + 4
|
|
#define IMP_PORTRAIT_MALE_5 IMP_PORTRAIT_MALE_4 + 4
|
|
#define IMP_PORTRAIT_MALE_6 IMP_PORTRAIT_MALE_5 + 4
|
|
|
|
#define IMP_PORTRAIT_FEMALE_1 IMP_PORTRAIT_MALE_6 + 4
|
|
#define IMP_PORTRAIT_FEMALE_2 IMP_PORTRAIT_FEMALE_1 + 4
|
|
#define IMP_PORTRAIT_FEMALE_3 IMP_PORTRAIT_FEMALE_2 + 4
|
|
#define IMP_PORTRAIT_FEMALE_4 IMP_PORTRAIT_FEMALE_3 + 4
|
|
#define IMP_PORTRAIT_FEMALE_5 IMP_PORTRAIT_FEMALE_4 + 4
|
|
|
|
#define IMP_RESULTS_END IMP_PORTRAIT_FEMALE_5 + 5
|
|
#define IMP_RESULTS_END_LENGTH 3
|
|
|
|
#else
|
|
|
|
#define IMP_RESULTS_INTRO_LENGTH 9
|
|
|
|
#define IMP_RESULTS_PERSONALITY_INTRO IMP_RESULTS_INTRO_LENGTH
|
|
#define IMP_RESULTS_PERSONALITY_INTRO_LENGTH 5
|
|
#define IMP_PERSONALITY_NORMAL IMP_RESULTS_PERSONALITY_INTRO + IMP_RESULTS_PERSONALITY_INTRO_LENGTH
|
|
#define IMP_PERSONALITY_LENGTH 4
|
|
#define IMP_PERSONALITY_HEAT IMP_PERSONALITY_NORMAL + IMP_PERSONALITY_LENGTH
|
|
#define IMP_PERSONALITY_NERVOUS IMP_PERSONALITY_HEAT + IMP_PERSONALITY_LENGTH
|
|
#define IMP_PERSONALITY_CLAUSTROPHOBIC IMP_PERSONALITY_NERVOUS + IMP_PERSONALITY_LENGTH
|
|
#define IMP_PERSONALITY_NONSWIMMER IMP_PERSONALITY_CLAUSTROPHOBIC + IMP_PERSONALITY_LENGTH
|
|
#define IMP_PERSONALITY_FEAR_OF_INSECTS IMP_PERSONALITY_NONSWIMMER + IMP_PERSONALITY_LENGTH
|
|
#define IMP_PERSONALITY_FORGETFUL IMP_PERSONALITY_FEAR_OF_INSECTS + IMP_PERSONALITY_LENGTH + 1
|
|
#define IMP_PERSONALITY_PSYCHO IMP_PERSONALITY_FORGETFUL + IMP_PERSONALITY_LENGTH
|
|
#define IMP_RESULTS_ATTITUDE_INTRO IMP_PERSONALITY_PSYCHO + IMP_PERSONALITY_LENGTH + 1
|
|
#define IMP_RESULTS_ATTITUDE_LENGTH 5
|
|
#define IMP_ATTITUDE_LENGTH 5
|
|
#define IMP_ATTITUDE_NORMAL IMP_RESULTS_ATTITUDE_INTRO + IMP_RESULTS_ATTITUDE_LENGTH
|
|
#define IMP_ATTITUDE_FRIENDLY IMP_ATTITUDE_NORMAL + IMP_ATTITUDE_LENGTH
|
|
#define IMP_ATTITUDE_LONER IMP_ATTITUDE_FRIENDLY + IMP_ATTITUDE_LENGTH + 1
|
|
#define IMP_ATTITUDE_OPTIMIST IMP_ATTITUDE_LONER + IMP_ATTITUDE_LENGTH + 1
|
|
#define IMP_ATTITUDE_PESSIMIST IMP_ATTITUDE_OPTIMIST + IMP_ATTITUDE_LENGTH + 1
|
|
#define IMP_ATTITUDE_AGGRESSIVE IMP_ATTITUDE_PESSIMIST + IMP_ATTITUDE_LENGTH + 1
|
|
#define IMP_ATTITUDE_ARROGANT IMP_ATTITUDE_AGGRESSIVE + IMP_ATTITUDE_LENGTH + 1
|
|
#define IMP_ATTITUDE_ASSHOLE IMP_ATTITUDE_ARROGANT + IMP_ATTITUDE_LENGTH + 1
|
|
#define IMP_ATTITUDE_COWARD IMP_ATTITUDE_ASSHOLE + IMP_ATTITUDE_LENGTH
|
|
#define IMP_RESULTS_SKILLS IMP_ATTITUDE_COWARD + IMP_ATTITUDE_LENGTH + 1
|
|
#define IMP_RESULTS_SKILLS_LENGTH 7
|
|
#define IMP_SKILLS_IMPERIAL_SKILLS IMP_RESULTS_SKILLS + IMP_RESULTS_SKILLS_LENGTH + 1
|
|
#define IMP_SKILLS_IMPERIAL_MARK IMP_SKILLS_IMPERIAL_SKILLS + 1
|
|
#define IMP_SKILLS_IMPERIAL_MECH IMP_SKILLS_IMPERIAL_SKILLS + 2
|
|
#define IMP_SKILLS_IMPERIAL_EXPL IMP_SKILLS_IMPERIAL_SKILLS + 3
|
|
#define IMP_SKILLS_IMPERIAL_MED IMP_SKILLS_IMPERIAL_SKILLS + 4
|
|
|
|
#define IMP_SKILLS_NEED_TRAIN_SKILLS IMP_SKILLS_IMPERIAL_MED + 1
|
|
#define IMP_SKILLS_NEED_TRAIN_MARK IMP_SKILLS_NEED_TRAIN_SKILLS + 1
|
|
#define IMP_SKILLS_NEED_TRAIN_MECH IMP_SKILLS_NEED_TRAIN_SKILLS + 2
|
|
#define IMP_SKILLS_NEED_TRAIN_EXPL IMP_SKILLS_NEED_TRAIN_SKILLS + 3
|
|
#define IMP_SKILLS_NEED_TRAIN_MED IMP_SKILLS_NEED_TRAIN_SKILLS + 4
|
|
|
|
#define IMP_SKILLS_NO_SKILL IMP_SKILLS_NEED_TRAIN_MED + 1
|
|
#define IMP_SKILLS_NO_SKILL_MARK IMP_SKILLS_NO_SKILL + 1
|
|
#define IMP_SKILLS_NO_SKILL_MECH IMP_SKILLS_NO_SKILL + 2
|
|
#define IMP_SKILLS_NO_SKILL_EXPL IMP_SKILLS_NO_SKILL + 3
|
|
#define IMP_SKILLS_NO_SKILL_MED IMP_SKILLS_NO_SKILL + 4
|
|
|
|
#define IMP_SKILLS_SPECIAL_INTRO IMP_SKILLS_NO_SKILL_MED + 1
|
|
#define IMP_SKILLS_SPECIAL_INTRO_LENGTH 2
|
|
#define IMP_SKILLS_SPECIAL_LOCK IMP_SKILLS_SPECIAL_INTRO + IMP_SKILLS_SPECIAL_INTRO_LENGTH
|
|
#define IMP_SKILLS_SPECIAL_HAND IMP_SKILLS_SPECIAL_LOCK + 1
|
|
#define IMP_SKILLS_SPECIAL_ELEC IMP_SKILLS_SPECIAL_HAND + 1
|
|
#define IMP_SKILLS_SPECIAL_NIGHT IMP_SKILLS_SPECIAL_ELEC + 1
|
|
#define IMP_SKILLS_SPECIAL_THROW IMP_SKILLS_SPECIAL_NIGHT + 1
|
|
#define IMP_SKILLS_SPECIAL_TEACH IMP_SKILLS_SPECIAL_THROW + 1
|
|
#define IMP_SKILLS_SPECIAL_HEAVY IMP_SKILLS_SPECIAL_TEACH + 1
|
|
#define IMP_SKILLS_SPECIAL_AUTO IMP_SKILLS_SPECIAL_HEAVY + 1
|
|
#define IMP_SKILLS_SPECIAL_STEALTH IMP_SKILLS_SPECIAL_AUTO + 1
|
|
#define IMP_SKILLS_SPECIAL_AMBI IMP_SKILLS_SPECIAL_STEALTH + 1
|
|
#define IMP_SKILLS_SPECIAL_THIEF IMP_SKILLS_SPECIAL_AMBI + 1
|
|
#define IMP_SKILLS_SPECIAL_MARTIAL IMP_SKILLS_SPECIAL_THIEF + 1
|
|
#define IMP_SKILLS_SPECIAL_KNIFE IMP_SKILLS_SPECIAL_MARTIAL + 1
|
|
|
|
#define IMP_RESULTS_PHYSICAL IMP_SKILLS_SPECIAL_KNIFE + 1
|
|
#define IMP_RESULTS_PHYSICAL_LENGTH 7
|
|
|
|
#define IMP_PHYSICAL_SUPER IMP_RESULTS_PHYSICAL + IMP_RESULTS_PHYSICAL_LENGTH
|
|
#define IMP_PHYSICAL_SUPER_LENGTH 1
|
|
|
|
#define IMP_PHYSICAL_SUPER_HEALTH IMP_PHYSICAL_SUPER + IMP_PHYSICAL_SUPER_LENGTH
|
|
#define IMP_PHYSICAL_SUPER_AGILITY IMP_PHYSICAL_SUPER_HEALTH + 1
|
|
#define IMP_PHYSICAL_SUPER_DEXTERITY IMP_PHYSICAL_SUPER_AGILITY + 1
|
|
#define IMP_PHYSICAL_SUPER_STRENGTH IMP_PHYSICAL_SUPER_DEXTERITY + 1
|
|
#define IMP_PHYSICAL_SUPER_LEADERSHIP IMP_PHYSICAL_SUPER_STRENGTH + 1
|
|
#define IMP_PHYSICAL_SUPER_WISDOM IMP_PHYSICAL_SUPER_LEADERSHIP + 1
|
|
|
|
#define IMP_PHYSICAL_LOW IMP_PHYSICAL_SUPER_WISDOM + 1
|
|
#define IMP_PHYSICAL_LOW_LENGTH 1
|
|
|
|
#define IMP_PHYSICAL_LOW_HEALTH IMP_PHYSICAL_LOW + IMP_PHYSICAL_LOW_LENGTH
|
|
#define IMP_PHYSICAL_LOW_AGILITY IMP_PHYSICAL_LOW_HEALTH + 1
|
|
#define IMP_PHYSICAL_LOW_DEXTERITY IMP_PHYSICAL_LOW_AGILITY + 2
|
|
#define IMP_PHYSICAL_LOW_STRENGTH IMP_PHYSICAL_LOW_DEXTERITY + 1
|
|
#define IMP_PHYSICAL_LOW_LEADERSHIP IMP_PHYSICAL_LOW_STRENGTH + 1
|
|
#define IMP_PHYSICAL_LOW_WISDOM IMP_PHYSICAL_LOW_LEADERSHIP + 1
|
|
|
|
|
|
#define IMP_PHYSICAL_VERY_LOW IMP_PHYSICAL_LOW_WISDOM + 1
|
|
#define IMP_PHYSICAL_VERY_LOW_LENGTH 1
|
|
|
|
#define IMP_PHYSICAL_VERY_LOW_HEALTH IMP_PHYSICAL_VERY_LOW + IMP_PHYSICAL_VERY_LOW_LENGTH
|
|
#define IMP_PHYSICAL_VERY_LOW_AGILITY IMP_PHYSICAL_VERY_LOW_HEALTH + 1
|
|
#define IMP_PHYSICAL_VERY_LOW_DEXTERITY IMP_PHYSICAL_VERY_LOW_AGILITY + 1
|
|
#define IMP_PHYSICAL_VERY_LOW_STRENGTH IMP_PHYSICAL_VERY_LOW_DEXTERITY + 1
|
|
#define IMP_PHYSICAL_VERY_LOW_LEADERSHIP IMP_PHYSICAL_VERY_LOW_STRENGTH + 1
|
|
#define IMP_PHYSICAL_VERY_LOW_WISDOM IMP_PHYSICAL_VERY_LOW_LEADERSHIP + 1
|
|
|
|
|
|
#define IMP_PHYSICAL_END IMP_PHYSICAL_VERY_LOW_WISDOM + 1
|
|
#define IMP_PHYSICAL_END_LENGTH 3
|
|
|
|
#define IMP_RESULTS_PORTRAIT IMP_PHYSICAL_END + IMP_PHYSICAL_END_LENGTH
|
|
#define IMP_RESULTS_PORTRAIT_LENGTH 6
|
|
|
|
|
|
#define IMP_PORTRAIT_MALE_1 IMP_RESULTS_PORTRAIT + IMP_RESULTS_PORTRAIT_LENGTH
|
|
#define IMP_PORTRAIT_MALE_2 IMP_PORTRAIT_MALE_1 + 4
|
|
#define IMP_PORTRAIT_MALE_3 IMP_PORTRAIT_MALE_2 + 4
|
|
#define IMP_PORTRAIT_MALE_4 IMP_PORTRAIT_MALE_3 + 4
|
|
#define IMP_PORTRAIT_MALE_5 IMP_PORTRAIT_MALE_4 + 4
|
|
#define IMP_PORTRAIT_MALE_6 IMP_PORTRAIT_MALE_5 + 4
|
|
|
|
#define IMP_PORTRAIT_FEMALE_1 IMP_PORTRAIT_MALE_6 + 4
|
|
#define IMP_PORTRAIT_FEMALE_2 IMP_PORTRAIT_FEMALE_1 + 4
|
|
#define IMP_PORTRAIT_FEMALE_3 IMP_PORTRAIT_FEMALE_2 + 4
|
|
#define IMP_PORTRAIT_FEMALE_4 IMP_PORTRAIT_FEMALE_3 + 4
|
|
#define IMP_PORTRAIT_FEMALE_5 IMP_PORTRAIT_FEMALE_4 + 4
|
|
#define IMP_PORTRAIT_FEMALE_6 IMP_PORTRAIT_FEMALE_5 + 4
|
|
|
|
|
|
|
|
#define IMP_RESULTS_END IMP_PORTRAIT_FEMALE_6 + 1
|
|
#define IMP_RESULTS_END_LENGTH 3
|
|
|
|
|
|
#endif
|
|
|
|
void HandleIMPCharProfileResultsMessage( void)
|
|
{
|
|
// special case, IMP profile return
|
|
INT32 iHeight=0;
|
|
INT32 iCounter=0;
|
|
CHAR16 pString[MAIL_STRING_SIZE];
|
|
INT32 iOffSet=0;
|
|
RecordPtr pTempRecord;
|
|
INT32 iEndOfSection =0;
|
|
INT32 iRand = 0;
|
|
BOOLEAN fSufficientMechSkill = FALSE, fSufficientMarkSkill = FALSE, fSufficientMedSkill = FALSE, fSufficientExplSkill = FALSE;
|
|
BOOLEAN fSufficientHlth = FALSE, fSufficientStr = FALSE, fSufficientWis = FALSE, fSufficientAgi = FALSE, fSufficientDex = FALSE, fSufficientLdr = FALSE;
|
|
|
|
INT16 iCurrentIMPSlot = -1;
|
|
|
|
iRand = Random( 32767 );
|
|
|
|
// set record ptr to head of list
|
|
pTempRecord=pMessageRecordList;
|
|
|
|
// increment height for size of one line
|
|
iHeight+=GetFontHeight( MESSAGE_FONT );
|
|
|
|
// load intro
|
|
iEndOfSection = IMP_RESULTS_INTRO_LENGTH;
|
|
|
|
// list doesn't exist, reload
|
|
if( !pTempRecord )
|
|
{
|
|
while(iEndOfSection > iCounter)
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
|
|
// have to place players name into string for first record
|
|
if( iCounter == 0)
|
|
{
|
|
CHAR16 zTemp[512];
|
|
|
|
iCurrentIMPSlot = giCurrentIMPSlot;
|
|
|
|
swprintf( zTemp, L" %s", gMercProfiles[ iCurrentIMPSlot ].zName );
|
|
wcscat( pString, zTemp );
|
|
}
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// increment email record counter
|
|
iCounter++;
|
|
}
|
|
|
|
// now the personality intro
|
|
iOffSet = IMP_RESULTS_PERSONALITY_INTRO;
|
|
iEndOfSection = IMP_RESULTS_PERSONALITY_INTRO_LENGTH + 1;
|
|
iCounter = 0;
|
|
|
|
while(iEndOfSection > iCounter)
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// increment email record counter
|
|
iCounter++;
|
|
}
|
|
|
|
// personality itself
|
|
switch( gMercProfiles[ iCurrentIMPSlot ].bDisability)
|
|
{
|
|
// normal as can be
|
|
case( NO_DISABILITY ):
|
|
iOffSet = IMP_PERSONALITY_NORMAL;
|
|
break;
|
|
case( HEAT_INTOLERANT ):
|
|
iOffSet = IMP_PERSONALITY_HEAT;
|
|
break;
|
|
case( NERVOUS ):
|
|
iOffSet = IMP_PERSONALITY_NERVOUS;
|
|
break;
|
|
case( CLAUSTROPHOBIC ):
|
|
iOffSet = IMP_PERSONALITY_CLAUSTROPHOBIC;
|
|
break;
|
|
case( NONSWIMMER ):
|
|
iOffSet = IMP_PERSONALITY_NONSWIMMER;
|
|
break;
|
|
case( FEAR_OF_INSECTS ):
|
|
iOffSet = IMP_PERSONALITY_FEAR_OF_INSECTS;
|
|
break;
|
|
case( FORGETFUL ):
|
|
iOffSet = IMP_PERSONALITY_FORGETFUL;
|
|
break;
|
|
case( PSYCHO ):
|
|
iOffSet = IMP_PERSONALITY_PSYCHO;
|
|
break;
|
|
}
|
|
|
|
// Flugente: new personalities do not get their text from .edt files
|
|
if ( gMercProfiles[ iCurrentIMPSlot ].bDisability == DEAF )
|
|
{
|
|
swprintf( pString, gzIMPDisabilityTraitEmailTextDeaf[0] );
|
|
|
|
AddEmailRecordToList( pString );
|
|
|
|
swprintf( pString, gzIMPDisabilityTraitEmailTextDeaf[1] );
|
|
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
else if ( gMercProfiles[ iCurrentIMPSlot ].bDisability == SHORTSIGHTED )
|
|
{
|
|
swprintf( pString, gzIMPDisabilityTraitEmailTextShortSighted[0] );
|
|
|
|
AddEmailRecordToList( pString );
|
|
|
|
swprintf( pString, gzIMPDisabilityTraitEmailTextShortSighted[1] );
|
|
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
else if ( gMercProfiles[iCurrentIMPSlot].bDisability == HEMOPHILIAC )
|
|
{
|
|
swprintf( pString, gzIMPDisabilityTraitEmailTextHemophiliac[0] );
|
|
|
|
AddEmailRecordToList( pString );
|
|
|
|
swprintf( pString, gzIMPDisabilityTraitEmailTextHemophiliac[1] );
|
|
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
else if ( gMercProfiles[iCurrentIMPSlot].bDisability == AFRAID_OF_HEIGHTS )
|
|
{
|
|
swprintf( pString, gzIMPDisabilityTraitEmailTextAfraidOfHeights[0] );
|
|
|
|
AddEmailRecordToList( pString );
|
|
|
|
swprintf( pString, gzIMPDisabilityTraitEmailTextAfraidOfHeights[1] );
|
|
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
else if ( gMercProfiles[iCurrentIMPSlot].bDisability == SELF_HARM )
|
|
{
|
|
swprintf( pString, gzIMPDisabilityTraitEmailTextSelfHarm[0] );
|
|
|
|
AddEmailRecordToList( pString );
|
|
|
|
swprintf( pString, gzIMPDisabilityTraitEmailTextSelfHarm[1] );
|
|
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
else
|
|
{
|
|
// personality tick
|
|
// DEF: removed 1/12/99, cause it was changing the length of email that were already calculated
|
|
//LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + Random( IMP_PERSONALITY_LENGTH - 1 ) + 1 ), MAIL_STRING_SIZE );
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + 1 ), MAIL_STRING_SIZE );
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// personality paragraph
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + IMP_PERSONALITY_LENGTH ), MAIL_STRING_SIZE );
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// extra paragraph for bugs
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bDisability == FEAR_OF_INSECTS )
|
|
{
|
|
// personality paragraph
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + IMP_PERSONALITY_LENGTH + 1 ), MAIL_STRING_SIZE );
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
}
|
|
|
|
// attitude intro
|
|
// now the personality intro
|
|
iOffSet = IMP_RESULTS_ATTITUDE_INTRO;
|
|
iEndOfSection = IMP_RESULTS_ATTITUDE_LENGTH;
|
|
iCounter = 0;
|
|
|
|
while(iEndOfSection > iCounter)
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// increment email record counter
|
|
iCounter++;
|
|
}
|
|
|
|
// WANNE: Old trait system: attitudes
|
|
if (!gGameOptions.fNewTraitSystem)
|
|
{
|
|
// personality itself
|
|
switch( gMercProfiles[ iCurrentIMPSlot ].bAttitude )
|
|
{
|
|
// normal as can be
|
|
case( ATT_NORMAL ):
|
|
iOffSet = IMP_ATTITUDE_NORMAL;
|
|
break;
|
|
case( ATT_FRIENDLY ):
|
|
iOffSet = IMP_ATTITUDE_FRIENDLY;
|
|
break;
|
|
case( ATT_LONER ):
|
|
iOffSet = IMP_ATTITUDE_LONER;
|
|
break;
|
|
case( ATT_OPTIMIST ):
|
|
iOffSet = IMP_ATTITUDE_OPTIMIST;
|
|
break;
|
|
case( ATT_PESSIMIST ):
|
|
iOffSet = IMP_ATTITUDE_PESSIMIST;
|
|
break;
|
|
case( ATT_AGGRESSIVE ):
|
|
iOffSet = IMP_ATTITUDE_AGGRESSIVE;
|
|
break;
|
|
case( ATT_ARROGANT ):
|
|
iOffSet = IMP_ATTITUDE_ARROGANT;
|
|
break;
|
|
case( ATT_ASSHOLE ):
|
|
iOffSet = IMP_ATTITUDE_ASSHOLE;
|
|
break;
|
|
case( ATT_COWARD ):
|
|
iOffSet = IMP_ATTITUDE_COWARD;
|
|
break;
|
|
}
|
|
|
|
// attitude title
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet ), MAIL_STRING_SIZE );
|
|
}
|
|
// WANNE: New trait system: Character traits
|
|
else
|
|
{
|
|
// WANNE: Try to map "new character traits" to matching old attitudes, so we have meaningful text in IMP mail
|
|
switch( gMercProfiles[ iCurrentIMPSlot ].bCharacterTrait )
|
|
{
|
|
case (CHAR_TRAIT_NORMAL):
|
|
wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_NORMAL]);
|
|
iOffSet = IMP_ATTITUDE_NORMAL;
|
|
break;
|
|
case (CHAR_TRAIT_SOCIABLE):
|
|
wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_SOCIABLE]);
|
|
iOffSet = IMP_ATTITUDE_FRIENDLY;
|
|
break;
|
|
case (CHAR_TRAIT_LONER):
|
|
wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_LONER]);
|
|
iOffSet = IMP_ATTITUDE_LONER;
|
|
break;
|
|
case (CHAR_TRAIT_OPTIMIST):
|
|
wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_OPTIMIST]);
|
|
iOffSet = IMP_ATTITUDE_OPTIMIST;
|
|
break;
|
|
case (CHAR_TRAIT_ASSERTIVE):
|
|
wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_ASSERTIVE]);
|
|
iOffSet = IMP_ATTITUDE_OPTIMIST;
|
|
break;
|
|
case (CHAR_TRAIT_INTELLECTUAL):
|
|
wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_INTELLECTUAL]);
|
|
iOffSet = IMP_ATTITUDE_FRIENDLY;
|
|
break;
|
|
case (CHAR_TRAIT_PRIMITIVE):
|
|
wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_PRIMITIVE]);
|
|
iOffSet = IMP_ATTITUDE_ARROGANT;
|
|
break;
|
|
case (CHAR_TRAIT_AGGRESSIVE):
|
|
wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_AGGRESSIVE]);
|
|
iOffSet = IMP_ATTITUDE_AGGRESSIVE;
|
|
break;
|
|
case (CHAR_TRAIT_PHLEGMATIC):
|
|
wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_PHLEGMATIC]);
|
|
iOffSet = IMP_ATTITUDE_PESSIMIST;
|
|
break;
|
|
case (CHAR_TRAIT_DAUNTLESS):
|
|
wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_DAUNTLESS]);
|
|
iOffSet = IMP_ATTITUDE_AGGRESSIVE;
|
|
break;
|
|
case (CHAR_TRAIT_PACIFIST):
|
|
wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_PACIFIST]);
|
|
iOffSet = IMP_ATTITUDE_COWARD;
|
|
break;
|
|
case (CHAR_TRAIT_MALICIOUS):
|
|
wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_MALICIOUS]);
|
|
iOffSet = IMP_ATTITUDE_ASSHOLE;
|
|
break;
|
|
case (CHAR_TRAIT_SHOWOFF):
|
|
wcscpy(pString, gzIMPCharacterTraitText[CHAR_TRAIT_SHOWOFF]);
|
|
iOffSet = IMP_ATTITUDE_ARROGANT;
|
|
break;
|
|
case CHAR_TRAIT_COWARD:
|
|
wcscpy( pString, gzIMPCharacterTraitText[CHAR_TRAIT_COWARD] );
|
|
iOffSet = IMP_ATTITUDE_COWARD;
|
|
break;
|
|
}
|
|
|
|
wcscat(pString, L". ±");
|
|
}
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// attitude tick
|
|
//DEF: removed 1/12/99, cause it was changing the length of email that were already calculated
|
|
//LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + Random( IMP_ATTITUDE_LENGTH - 2 ) + 1 ), MAIL_STRING_SIZE );
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + 1 ), MAIL_STRING_SIZE );
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// attitude paragraph
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + IMP_ATTITUDE_LENGTH - 1 ), MAIL_STRING_SIZE );
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
//check for second paragraph
|
|
if( iOffSet != IMP_ATTITUDE_NORMAL )
|
|
{
|
|
// attitude paragraph
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + IMP_ATTITUDE_LENGTH ), MAIL_STRING_SIZE );
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
// skills
|
|
// now the skills intro
|
|
iOffSet = IMP_RESULTS_SKILLS;
|
|
iEndOfSection = IMP_RESULTS_SKILLS_LENGTH;
|
|
iCounter = 0;
|
|
|
|
while(iEndOfSection > iCounter)
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// increment email record counter
|
|
iCounter++;
|
|
}
|
|
|
|
// imperial skills
|
|
iOffSet = IMP_SKILLS_IMPERIAL_SKILLS;
|
|
iEndOfSection = 0;
|
|
iCounter = 0;
|
|
|
|
// marksmanship
|
|
if ( gMercProfiles[ iCurrentIMPSlot ].bMarksmanship >= SUPER_SKILL_VALUE )
|
|
{
|
|
fSufficientMarkSkill = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
// medical
|
|
if ( gMercProfiles[ iCurrentIMPSlot ].bMedical >= SUPER_SKILL_VALUE )
|
|
{
|
|
fSufficientMedSkill = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
// mechanical
|
|
if ( gMercProfiles[ iCurrentIMPSlot ].bMechanical >= SUPER_SKILL_VALUE )
|
|
{
|
|
fSufficientMechSkill = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
if ( gMercProfiles[ iCurrentIMPSlot ].bExplosive >= SUPER_SKILL_VALUE )
|
|
{
|
|
fSufficientExplSkill = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
while (iEndOfSection > iCounter)
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// increment email record counter
|
|
iCounter++;
|
|
}
|
|
|
|
// now handle skills
|
|
if ( fSufficientMarkSkill )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_IMPERIAL_MARK ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if ( fSufficientMedSkill )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_IMPERIAL_MED ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if ( fSufficientMechSkill )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_IMPERIAL_MECH ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
// explosives
|
|
if ( fSufficientExplSkill )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_IMPERIAL_EXPL ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
fSufficientMechSkill = FALSE;
|
|
fSufficientMarkSkill = FALSE;
|
|
fSufficientExplSkill = FALSE;
|
|
fSufficientMedSkill = FALSE;
|
|
|
|
// imperial skills
|
|
iOffSet = IMP_SKILLS_NEED_TRAIN_SKILLS;
|
|
iEndOfSection = 0;
|
|
iCounter = 0;
|
|
|
|
// now the needs training values
|
|
if( ( gMercProfiles[ iCurrentIMPSlot ].bMarksmanship > NO_CHANCE_IN_HELL_SKILL_VALUE ) &&( gMercProfiles[ iCurrentIMPSlot ].bMarksmanship <= NEEDS_TRAINING_SKILL_VALUE ) )
|
|
{
|
|
fSufficientMarkSkill = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
if( ( gMercProfiles[ iCurrentIMPSlot ].bMedical > NO_CHANCE_IN_HELL_SKILL_VALUE ) &&( gMercProfiles[ iCurrentIMPSlot ].bMedical <= NEEDS_TRAINING_SKILL_VALUE ) )
|
|
{
|
|
fSufficientMedSkill = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
if( ( gMercProfiles[ iCurrentIMPSlot ].bMechanical > NO_CHANCE_IN_HELL_SKILL_VALUE ) &&( gMercProfiles[ iCurrentIMPSlot ].bMechanical <= NEEDS_TRAINING_SKILL_VALUE ) )
|
|
{
|
|
fSufficientMechSkill = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
if( ( gMercProfiles[ iCurrentIMPSlot ].bExplosive > NO_CHANCE_IN_HELL_SKILL_VALUE ) &&( gMercProfiles[ iCurrentIMPSlot ].bExplosive <= NEEDS_TRAINING_SKILL_VALUE ) )
|
|
{
|
|
fSufficientExplSkill = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
while(iEndOfSection > iCounter)
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// increment email record counter
|
|
iCounter++;
|
|
}
|
|
|
|
if( fSufficientMarkSkill )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_NEED_TRAIN_MARK ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientMedSkill )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_NEED_TRAIN_MED ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientMechSkill )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_NEED_TRAIN_MECH ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientExplSkill )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_NEED_TRAIN_EXPL ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
fSufficientMechSkill = FALSE;
|
|
fSufficientMarkSkill = FALSE;
|
|
fSufficientExplSkill = FALSE;
|
|
fSufficientMedSkill = FALSE;
|
|
|
|
// and the no chance in hell of doing anything useful values
|
|
|
|
// no skill
|
|
iOffSet = IMP_SKILLS_NO_SKILL;
|
|
iEndOfSection = 0;
|
|
iCounter = 0;
|
|
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bMarksmanship <= NO_CHANCE_IN_HELL_SKILL_VALUE )
|
|
{
|
|
fSufficientMarkSkill = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bMedical <= NO_CHANCE_IN_HELL_SKILL_VALUE )
|
|
{
|
|
fSufficientMedSkill = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bMechanical <= NO_CHANCE_IN_HELL_SKILL_VALUE )
|
|
{
|
|
fSufficientMechSkill = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bExplosive <= NO_CHANCE_IN_HELL_SKILL_VALUE )
|
|
{
|
|
fSufficientExplSkill = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
while(iEndOfSection > iCounter)
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// increment email record counter
|
|
iCounter++;
|
|
}
|
|
|
|
if( fSufficientMechSkill )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_NO_SKILL_MECH ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientMarkSkill )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_NO_SKILL_MARK ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientMedSkill )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_NO_SKILL_MED ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
if( fSufficientExplSkill )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_NO_SKILL_EXPL ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
// now the specialized skills
|
|
// imperial skills
|
|
iOffSet = IMP_SKILLS_SPECIAL_INTRO;
|
|
iEndOfSection = IMP_SKILLS_SPECIAL_INTRO_LENGTH;
|
|
iCounter = 0;
|
|
|
|
while(iEndOfSection > iCounter)
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// increment email record counter
|
|
iCounter++;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// SANDRO - switch for old/new traits
|
|
if ( gGameOptions.fNewTraitSystem )
|
|
{
|
|
// Auto Weapons
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, AUTO_WEAPONS_NT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_AUTO ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Heavy Weapons
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, HEAVY_WEAPONS_NT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_HEAVY ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Sniper
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, SNIPER_NT ) > 0 )
|
|
{
|
|
wcscpy(pString, MissingIMPSkillsDescriptions[0]);
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Ranger
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, RANGER_NT ) > 0 )
|
|
{
|
|
wcscpy(pString, MissingIMPSkillsDescriptions[2]);
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Gunslinger
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, GUNSLINGER_NT ) > 0 )
|
|
{
|
|
wcscpy(pString, MissingIMPSkillsDescriptions[3]);
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Martial Artist
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, MARTIAL_ARTS_NT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_MARTIAL ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Squadleader
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, SQUADLEADER_NT ) > 0 )
|
|
{
|
|
wcscpy(pString, MissingIMPSkillsDescriptions[4]);
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Technician
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, TECHNICIAN_NT ) > 0 )
|
|
{
|
|
wcscpy(pString, MissingIMPSkillsDescriptions[5]);
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Doctor
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, DOCTOR_NT ) > 0 )
|
|
{
|
|
wcscpy(pString, MissingIMPSkillsDescriptions[6]);
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Ambidextrous
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, AMBIDEXTROUS_NT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_AMBI ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Melee
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, MELEE_NT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_KNIFE ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Throwing
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, THROWING_NT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_THROW ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Night Ops
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, NIGHT_OPS_NT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_NIGHT ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Stealthy
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, STEALTHY_NT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_STEALTH ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Athletics
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, ATHLETICS_NT ) > 0 )
|
|
{
|
|
wcscpy(pString, MissingIMPSkillsDescriptions[7]);
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Bodybuilding
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, BODYBUILDING_NT ) > 0 )
|
|
{
|
|
wcscpy(pString, MissingIMPSkillsDescriptions[8]);
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Demolitions
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, DEMOLITIONS_NT ) > 0 )
|
|
{
|
|
wcscpy(pString, MissingIMPSkillsDescriptions[9]);
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Teaching
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, TEACHING_NT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_TEACH ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Scouting
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, SCOUTING_NT ) > 0 )
|
|
{
|
|
wcscpy(pString, MissingIMPSkillsDescriptions[10]);
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Covert ops
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, COVERT_NT ) > 0 )
|
|
{
|
|
wcscpy(pString, MissingIMPSkillsDescriptions[11]);
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Radio Operator
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, RADIO_OPERATOR_NT ) > 0 )
|
|
{
|
|
wcscpy(pString, MissingIMPSkillsDescriptions[12]);
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Survival
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, SURVIVAL_NT ) > 0 )
|
|
{
|
|
wcscpy( pString, MissingIMPSkillsDescriptions[13] );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Lockpick
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, LOCKPICKING_OT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_LOCK ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Hand to Hand
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, HANDTOHAND_OT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_HAND ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Electronics
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, ELECTRONICS_OT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_ELEC ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Night Ops
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, NIGHTOPS_OT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_NIGHT ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Throwing
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, THROWING_OT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_THROW ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Teaching
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, TEACHING_OT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_TEACH ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Heavy Weapons
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, HEAVY_WEAPS_OT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_HEAVY ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Auto Weapons
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, AUTO_WEAPS_OT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_AUTO ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Stealthy
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, STEALTHY_OT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_STEALTH ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Ambidextrous
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, AMBIDEXT_OT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_AMBI ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Thief
|
|
/*if( ( gMercProfiles[ iCurrentIMPSlot ].bSkillTrait == THIEF_OT )||( gMercProfiles[ iCurrentIMPSlot ].bSkillTrait2 == THIEF_OT ) )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_THIEF ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}*/
|
|
// Martial Arts
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, MARTIALARTS_OT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_MARTIAL ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Knifing
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, KNIFING_OT ) > 0 )
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_SKILLS_SPECIAL_KNIFE ), MAIL_STRING_SIZE );
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Sniper
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, PROF_SNIPER_OT ) > 0 )
|
|
{
|
|
wcscpy(pString, MissingIMPSkillsDescriptions[0]);
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
// Camouflage
|
|
if ( ProfileHasSkillTrait( iCurrentIMPSlot, CAMOUFLAGED_OT ) > 0 )
|
|
{
|
|
if ( gGameExternalOptions.fShowCamouflageFaces == TRUE )
|
|
{
|
|
gCamoFace[iCurrentIMPSlot].gCamoface = TRUE;
|
|
gCamoFace[iCurrentIMPSlot].gUrbanCamoface = FALSE;
|
|
gCamoFace[iCurrentIMPSlot].gDesertCamoface = FALSE;
|
|
gCamoFace[iCurrentIMPSlot].gSnowCamoface = FALSE;
|
|
}
|
|
wcscpy(pString, MissingIMPSkillsDescriptions[1]);
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// now the physical
|
|
// imperial physical
|
|
iOffSet = IMP_RESULTS_PHYSICAL;
|
|
iEndOfSection = IMP_RESULTS_PHYSICAL_LENGTH;
|
|
iCounter = 0;
|
|
|
|
while(iEndOfSection > iCounter)
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// increment email record counter
|
|
iCounter++;
|
|
}
|
|
|
|
// super physical
|
|
iOffSet = IMP_PHYSICAL_SUPER;
|
|
iEndOfSection = 0;
|
|
iCounter = 0;
|
|
|
|
// health
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bLife >= SUPER_STAT_VALUE )
|
|
{
|
|
fSufficientHlth = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
// dex
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bDexterity >= SUPER_STAT_VALUE )
|
|
{
|
|
fSufficientDex = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
// agility
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bAgility >= SUPER_STAT_VALUE )
|
|
{
|
|
fSufficientAgi = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
// strength
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bStrength >= SUPER_STAT_VALUE )
|
|
{
|
|
fSufficientStr = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
// wisdom
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bWisdom >= SUPER_STAT_VALUE )
|
|
{
|
|
fSufficientWis = TRUE;
|
|
iEndOfSection =1;
|
|
}
|
|
|
|
// leadership
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bLeadership >= SUPER_STAT_VALUE )
|
|
{
|
|
fSufficientLdr = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
while(iEndOfSection > iCounter)
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// increment email record counter
|
|
iCounter++;
|
|
}
|
|
|
|
if( fSufficientHlth )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_SUPER_HEALTH ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
|
|
if( fSufficientDex )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_SUPER_DEXTERITY ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientStr )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_SUPER_STRENGTH ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientAgi )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_SUPER_AGILITY ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientWis )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_SUPER_WISDOM ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientLdr )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_SUPER_LEADERSHIP ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
fSufficientHlth = FALSE;
|
|
fSufficientStr = FALSE;
|
|
fSufficientWis = FALSE;
|
|
fSufficientAgi = FALSE;
|
|
fSufficientDex = FALSE;
|
|
fSufficientLdr = FALSE;
|
|
|
|
// now the low attributes
|
|
// super physical
|
|
iOffSet = IMP_PHYSICAL_LOW;
|
|
iEndOfSection = 0;
|
|
iCounter = 0;
|
|
|
|
// health
|
|
if( ( gMercProfiles[ iCurrentIMPSlot ].bLife < NEEDS_TRAINING_STAT_VALUE ) &&( gMercProfiles[ iCurrentIMPSlot ].bLife > NO_CHANCE_IN_HELL_STAT_VALUE ) )
|
|
{
|
|
fSufficientHlth = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
// strength
|
|
if( (gMercProfiles[ iCurrentIMPSlot ].bStrength < NEEDS_TRAINING_STAT_VALUE )&&( gMercProfiles[ iCurrentIMPSlot ].bStrength > NO_CHANCE_IN_HELL_STAT_VALUE ) )
|
|
{
|
|
fSufficientStr = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
// agility
|
|
if( (gMercProfiles[ iCurrentIMPSlot ].bAgility < NEEDS_TRAINING_STAT_VALUE )&&( gMercProfiles[ iCurrentIMPSlot ].bAgility <= NO_CHANCE_IN_HELL_STAT_VALUE ) )
|
|
{
|
|
fSufficientAgi = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
// wisdom
|
|
if( (gMercProfiles[ iCurrentIMPSlot ].bWisdom < NEEDS_TRAINING_STAT_VALUE)&&( gMercProfiles[ iCurrentIMPSlot ].bWisdom > NO_CHANCE_IN_HELL_STAT_VALUE ) )
|
|
{
|
|
fSufficientWis = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
// leadership
|
|
if( (gMercProfiles[ iCurrentIMPSlot ].bLeadership < NEEDS_TRAINING_STAT_VALUE)&&( gMercProfiles[ iCurrentIMPSlot ].bLeadership > NO_CHANCE_IN_HELL_STAT_VALUE ) )
|
|
{
|
|
fSufficientLdr = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
// dex
|
|
if( (gMercProfiles[ iCurrentIMPSlot ].bDexterity < NEEDS_TRAINING_STAT_VALUE )&&( gMercProfiles[ iCurrentIMPSlot ].bDexterity > NO_CHANCE_IN_HELL_STAT_VALUE ) )
|
|
{
|
|
fSufficientDex = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
while(iEndOfSection > iCounter)
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// increment email record counter
|
|
iCounter++;
|
|
}
|
|
|
|
if( fSufficientHlth )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_LOW_HEALTH ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientDex )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_LOW_DEXTERITY ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientStr )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_LOW_STRENGTH ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientAgi )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_LOW_AGILITY ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientWis )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_LOW_WISDOM ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientLdr )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_LOW_LEADERSHIP ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
// very low physical
|
|
iOffSet = IMP_PHYSICAL_VERY_LOW;
|
|
iEndOfSection = 0;
|
|
iCounter = 0;
|
|
|
|
fSufficientHlth = FALSE;
|
|
fSufficientStr = FALSE;
|
|
fSufficientWis = FALSE;
|
|
fSufficientAgi = FALSE;
|
|
fSufficientDex = FALSE;
|
|
fSufficientLdr = FALSE;
|
|
|
|
// health
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bLife <= NO_CHANCE_IN_HELL_STAT_VALUE )
|
|
{
|
|
fSufficientHlth = TRUE;
|
|
iEndOfSection =1;
|
|
}
|
|
|
|
// dex
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bDexterity <= NO_CHANCE_IN_HELL_STAT_VALUE )
|
|
{
|
|
fSufficientDex = TRUE;
|
|
iEndOfSection =1;
|
|
}
|
|
|
|
// strength
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bStrength <= NO_CHANCE_IN_HELL_STAT_VALUE )
|
|
{
|
|
fSufficientStr = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
// agility
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bAgility <= NO_CHANCE_IN_HELL_STAT_VALUE )
|
|
{
|
|
fSufficientAgi = TRUE;
|
|
iEndOfSection = 1;
|
|
}
|
|
|
|
// wisdom
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bWisdom <= NO_CHANCE_IN_HELL_STAT_VALUE )
|
|
{
|
|
fSufficientWis = TRUE;
|
|
iEndOfSection =1;
|
|
}
|
|
|
|
while(iEndOfSection > iCounter)
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// increment email record counter
|
|
iCounter++;
|
|
}
|
|
|
|
if( fSufficientHlth )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_VERY_LOW_HEALTH ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientDex )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_VERY_LOW_DEXTERITY ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientStr )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_VERY_LOW_STRENGTH ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientAgi )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_VERY_LOW_AGILITY ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
if( fSufficientWis )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_VERY_LOW_WISDOM ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
// leadership
|
|
if( gMercProfiles[ iCurrentIMPSlot ].bLeadership <= NO_CHANCE_IN_HELL_STAT_VALUE )
|
|
{
|
|
fSufficientLdr = TRUE;
|
|
}
|
|
|
|
if( fSufficientLdr )
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( IMP_PHYSICAL_VERY_LOW_LEADERSHIP ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
}
|
|
|
|
// very low physical
|
|
iOffSet = IMP_RESULTS_PORTRAIT;
|
|
iEndOfSection = IMP_RESULTS_PORTRAIT_LENGTH;
|
|
iCounter = 0;
|
|
|
|
while(iEndOfSection > iCounter)
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// increment email record counter
|
|
iCounter++;
|
|
}
|
|
|
|
// portraits
|
|
switch( iPortraitNumber )
|
|
{
|
|
case( 0 ):
|
|
if( fCharacterIsMale )
|
|
iOffSet = IMP_PORTRAIT_MALE_1;
|
|
else
|
|
iOffSet = IMP_PORTRAIT_FEMALE_1;
|
|
break;
|
|
case( 1 ):
|
|
if( fCharacterIsMale )
|
|
iOffSet = IMP_PORTRAIT_MALE_2;
|
|
else
|
|
iOffSet = IMP_PORTRAIT_FEMALE_2;
|
|
break;
|
|
case( 2 ):
|
|
if( fCharacterIsMale )
|
|
iOffSet = IMP_PORTRAIT_MALE_3;
|
|
else
|
|
iOffSet = IMP_PORTRAIT_FEMALE_3;
|
|
break;
|
|
case( 3 ):
|
|
if( fCharacterIsMale )
|
|
iOffSet = IMP_PORTRAIT_MALE_4;
|
|
else
|
|
iOffSet = IMP_PORTRAIT_FEMALE_4;
|
|
break;
|
|
case( 4 ):
|
|
if( fCharacterIsMale )
|
|
iOffSet = IMP_PORTRAIT_MALE_5;
|
|
else
|
|
iOffSet = IMP_PORTRAIT_FEMALE_4;
|
|
break;
|
|
case( 5 ):
|
|
if( fCharacterIsMale )
|
|
iOffSet = IMP_PORTRAIT_MALE_5;
|
|
else
|
|
iOffSet = IMP_PORTRAIT_FEMALE_5;
|
|
break;
|
|
case( 6 ):
|
|
if( fCharacterIsMale )
|
|
iOffSet = IMP_PORTRAIT_MALE_6;
|
|
else
|
|
iOffSet = IMP_PORTRAIT_FEMALE_5;
|
|
break;
|
|
case( 7 ):
|
|
if( fCharacterIsMale )
|
|
iOffSet = IMP_PORTRAIT_MALE_6;
|
|
else
|
|
iOffSet = IMP_PORTRAIT_FEMALE_3;
|
|
break;
|
|
case( 8 ):
|
|
if( fCharacterIsMale )
|
|
iOffSet = IMP_PORTRAIT_MALE_4;
|
|
else
|
|
iOffSet = IMP_PORTRAIT_FEMALE_4;
|
|
break;
|
|
case( 9 ):
|
|
if( fCharacterIsMale )
|
|
iOffSet = IMP_PORTRAIT_MALE_5;
|
|
else
|
|
iOffSet = IMP_PORTRAIT_FEMALE_5;
|
|
break;
|
|
default:
|
|
if( fCharacterIsMale )
|
|
iOffSet = IMP_PORTRAIT_MALE_1;
|
|
else
|
|
iOffSet = IMP_PORTRAIT_FEMALE_1;
|
|
break;
|
|
}
|
|
|
|
if( ( iRand % 2 ) == 0 )
|
|
{
|
|
iOffSet += 2;
|
|
}
|
|
|
|
iEndOfSection = 2;
|
|
iCounter = 0;
|
|
|
|
while(iEndOfSection > iCounter)
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// increment email record counter
|
|
iCounter++;
|
|
}
|
|
|
|
iOffSet = IMP_RESULTS_END;
|
|
iEndOfSection = IMP_RESULTS_END_LENGTH;
|
|
iCounter = 0;
|
|
|
|
while(iEndOfSection > iCounter)
|
|
{
|
|
// read one record from email file
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Impass.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// increment email record counter
|
|
iCounter++;
|
|
}
|
|
|
|
giPrevMessageId = giMessageId;
|
|
|
|
}
|
|
|
|
pTempRecord = pMessageRecordList;
|
|
|
|
}
|
|
|
|
void HandleEmailViewerButtonStates( void )
|
|
{
|
|
// handle state of email viewer buttons
|
|
|
|
if( fDisplayMessageFlag == FALSE )
|
|
{
|
|
// not displaying message, leave
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
if( giNumberOfPagesToCurrentEmail <= 2 )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// turn off previous page button
|
|
if( giMessagePage == 0 )
|
|
{
|
|
DisableButton( giMailMessageButtons[ 0 ] );
|
|
}
|
|
else
|
|
{
|
|
EnableButton( giMailMessageButtons[ 0 ] );
|
|
}
|
|
|
|
|
|
// turn off next page button
|
|
if( pEmailPageInfo[ giMessagePage + 1 ].pFirstRecord == NULL )
|
|
{
|
|
DisableButton( giMailMessageButtons[ 1 ] );
|
|
}
|
|
else
|
|
{
|
|
EnableButton( giMailMessageButtons[ 1 ] );
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
void SetUpIconForButton( )
|
|
{
|
|
// if we just got in, return, don't set any
|
|
|
|
if( fJustStartedEmail == TRUE )
|
|
{
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
void DeleteCurrentMessage( void )
|
|
{
|
|
// will delete the currently displayed message
|
|
|
|
// set current message to be deleted
|
|
iDeleteId = giMessageId;
|
|
|
|
// set the currently displayed message to none
|
|
giMessageId = -1;
|
|
|
|
// reset display message flag
|
|
fDisplayMessageFlag=FALSE;
|
|
|
|
// reset page being displayed
|
|
giMessagePage = 0;
|
|
|
|
fDeleteInternal = TRUE;
|
|
|
|
// delete message
|
|
DeleteEmail( );
|
|
|
|
fDeleteInternal = FALSE;
|
|
|
|
// force update of entire screen
|
|
fReDrawScreenFlag=TRUE;
|
|
|
|
// rerender email
|
|
RenderEmail();
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
void CreateNextPreviousEmailPageButtons( void )
|
|
{
|
|
|
|
// this function will create the buttons to advance and go back email pages
|
|
|
|
// next button
|
|
giMailPageButtonsImage[0]= LoadButtonImage( "LAPTOP\\NewMailButtons.sti" ,-1,1,-1,4,-1 );
|
|
giMailPageButtons[0] = QuickCreateButton( giMailPageButtonsImage[0],NEXT_PAGE_X, NEXT_PAGE_Y,
|
|
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
|
|
(GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)NextRegionButtonCallback );
|
|
SetButtonCursor(giMailPageButtons[0], CURSOR_LAPTOP_SCREEN);
|
|
|
|
// previous button
|
|
giMailPageButtonsImage[1]= LoadButtonImage( "LAPTOP\\NewMailButtons.sti" ,-1,0,-1,3,-1 );
|
|
giMailPageButtons[1] = QuickCreateButton( giMailPageButtonsImage[1],PREVIOUS_PAGE_X, NEXT_PAGE_Y,
|
|
BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
|
|
(GUI_CALLBACK)BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)PreviousRegionButtonCallback );
|
|
SetButtonCursor(giMailPageButtons[1], CURSOR_LAPTOP_SCREEN);
|
|
|
|
/*
|
|
// set up disable methods
|
|
SpecifyDisabledButtonStyle( giMailPageButtons[1], DISABLED_STYLE_SHADED );
|
|
SpecifyDisabledButtonStyle( giMailPageButtons[0], DISABLED_STYLE_SHADED );
|
|
*/
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
void UpdateStatusOfNextPreviousButtons( void )
|
|
{
|
|
|
|
// set the states of the page advance buttons
|
|
|
|
DisableButton( giMailPageButtons[ 0 ]);
|
|
DisableButton( giMailPageButtons[ 1 ]);
|
|
|
|
if( iCurrentPage > 0 )
|
|
{
|
|
EnableButton( giMailPageButtons[ 1 ]);
|
|
}
|
|
|
|
if( iCurrentPage < iLastPage )
|
|
{
|
|
EnableButton( giMailPageButtons[ 0 ] );
|
|
}
|
|
}
|
|
|
|
|
|
void DisplayWhichPageOfEmailProgramIsDisplayed( void )
|
|
{
|
|
// will draw the number of the email program we are viewing right now
|
|
CHAR16 sString[ 10 ];
|
|
|
|
// font stuff
|
|
SetFont(MESSAGE_FONT);
|
|
SetFontForeground(FONT_BLACK);
|
|
SetFontBackground(FONT_BLACK);
|
|
SetFontShadow(NO_SHADOW);
|
|
|
|
// page number
|
|
if( iLastPage < 0 )
|
|
swprintf( sString, L"%d / %d", 1, 1);
|
|
else
|
|
swprintf( sString, L"%d / %d", iCurrentPage + 1, iLastPage + 1);
|
|
|
|
// print it
|
|
mprintf( PAGE_NUMBER_X ,PAGE_NUMBER_Y, sString );
|
|
|
|
// restore shadow
|
|
SetFontShadow( DEFAULT_SHADOW );
|
|
|
|
return;
|
|
}
|
|
|
|
void OpenMostRecentUnreadEmail( void )
|
|
{
|
|
// will open the most recent email the player has recieved and not read
|
|
INT32 iMostRecentMailId = -1;
|
|
EmailPtr pB=pEmailList;
|
|
UINT32 iLowestDate = 9999999;
|
|
|
|
while( pB )
|
|
{
|
|
// if date is lesser and unread , swap
|
|
if( ( pB->iDate < iLowestDate )&&( pB->fRead == FALSE ) )
|
|
{
|
|
iMostRecentMailId = pB->iId;
|
|
iLowestDate = pB->iDate;
|
|
}
|
|
|
|
// next in B's list
|
|
pB=pB->Next;
|
|
}
|
|
|
|
// set up id
|
|
giMessageId = iMostRecentMailId;
|
|
|
|
// valid message, show it
|
|
if( giMessageId != -1 )
|
|
{
|
|
fDisplayMessageFlag = TRUE;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
BOOLEAN DisplayNumberOfPagesToThisEmail( INT32 iViewerY )
|
|
{
|
|
// display the indent for the display of pages to this email..along with the current page/number of pages
|
|
INT16 sX = 0, sY = 0;
|
|
CHAR16 sString[ 32 ];
|
|
|
|
|
|
// get and blt the email list background
|
|
// load, blt and delete graphics
|
|
//VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
|
// FilenameForBPP( "LAPTOP\\mailindent.sti", VObjectDesc.ImageFile );
|
|
//CHECKF( AddVideoObject( &VObjectDesc, &uiMailIndent ) );
|
|
// GetVideoObject( &hHandle, uiMailIndent );
|
|
// BltVideoObject( FRAME_BUFFER, hHandle, 0,VIEWER_X + INDENT_X_OFFSET, VIEWER_Y + iViewerY + INDENT_Y_OFFSET - 10, VO_BLT_SRCTRANSPARENCY,NULL );
|
|
// DeleteVideoObjectFromIndex( uiMailIndent );
|
|
|
|
// parse current page and max number of pages to email
|
|
swprintf( sString,L"%d / %d", ( giMessagePage + 1 ), ( giNumberOfPagesToCurrentEmail - 1 ) );
|
|
|
|
SetFont( FONT12ARIAL );
|
|
SetFontForeground( FONT_BLACK );
|
|
SetFontBackground( FONT_BLACK );
|
|
|
|
// turn off the shadows
|
|
SetFontShadow(NO_SHADOW);
|
|
|
|
SetFontDestBuffer(FRAME_BUFFER, 0 , 0 , SCREEN_WIDTH, SCREEN_HEIGHT, FALSE );
|
|
|
|
FindFontCenterCoordinates(VIEWER_X + INDENT_X_OFFSET, 0,INDENT_X_WIDTH, 0, sString, FONT12ARIAL, &sX, &sY);
|
|
mprintf( sX, VIEWER_Y + iViewerY + INDENT_Y_OFFSET - 2, sString );
|
|
|
|
|
|
// restore shadows
|
|
SetFontShadow( DEFAULT_SHADOW );
|
|
|
|
return ( TRUE );
|
|
}
|
|
|
|
|
|
INT32 GetNumberOfPagesToEmail( )
|
|
{
|
|
RecordPtr pTempRecord;
|
|
INT32 iNumberOfPagesToEmail = 0;
|
|
|
|
|
|
// set temp record to head of list
|
|
pTempRecord=pMessageRecordList;
|
|
|
|
// run through messages, and find out how many
|
|
while( pTempRecord )
|
|
{
|
|
pTempRecord = GetFirstRecordOnThisPage( pMessageRecordList, MESSAGE_FONT, MESSAGE_WIDTH, MESSAGE_GAP, iNumberOfPagesToEmail, MAX_EMAIL_MESSAGE_PAGE_SIZE );
|
|
iNumberOfPagesToEmail++;
|
|
}
|
|
|
|
|
|
return( iNumberOfPagesToEmail );
|
|
}
|
|
|
|
|
|
void ShutDownEmailList()
|
|
{
|
|
UINT32 cnt;
|
|
|
|
EmailPtr pEmail = pEmailList;
|
|
EmailPtr pTempEmail = NULL;
|
|
|
|
for( cnt=0; cnt<EMAIL_VAL; cnt++)
|
|
{
|
|
gEmailT[cnt].EmailType = 0;
|
|
}
|
|
|
|
//loop through all the emails to delete them
|
|
while( pEmail )
|
|
{
|
|
pTempEmail = pEmail;
|
|
|
|
pEmail = pEmail->Next;
|
|
|
|
MemFree( pTempEmail->pSubject );
|
|
pTempEmail->pSubject = NULL;
|
|
|
|
MemFree( pTempEmail );
|
|
pTempEmail = NULL;
|
|
}
|
|
pEmailList = NULL;
|
|
|
|
ClearPages();
|
|
}
|
|
|
|
// Pre Process the mail, when clicking on a mail in the mail list
|
|
void PreProcessEmail( EmailPtr pMail )
|
|
{
|
|
RecordPtr pTempRecord, pCurrentRecord, pLastRecord , pTempList;
|
|
CHAR16 pString[ 512 ];
|
|
INT32 iCounter = 0, iHeight = 0, iOffSet = 0;
|
|
BOOLEAN fGoingOffCurrentPage = FALSE;
|
|
INT32 iYPositionOnPage = 0;
|
|
|
|
iOffSet=(INT32)pMail->usOffset;
|
|
|
|
// set record ptr to head of list
|
|
pTempRecord=pMessageRecordList;
|
|
|
|
if( pEmailPageInfo[ 0 ].pFirstRecord != NULL )
|
|
{
|
|
// already processed
|
|
return;
|
|
}
|
|
|
|
// WANNE: Get the text and replace name!
|
|
int iNew113MERCMerc = 0;
|
|
int iNew113AIMMerc = 0;
|
|
|
|
int iEmailMERCMessage = 0;
|
|
int iEmailAIMMessage = 0;
|
|
int iEmailOther = 0;
|
|
int iEmailBobbyRMessage = 0;
|
|
int iEmailInsurance = 0;
|
|
int iNew113CustomUserMerc = 0;
|
|
|
|
if ( pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT )
|
|
{
|
|
if (pMail->usLength == MERC_UP_LEVEL_GASTON || pMail->usLength == MERC_UP_LEVEL_STOGIE ||
|
|
pMail->usLength == MERC_UP_LEVEL_TEX || pMail->usLength == MERC_UP_LEVEL_BIGGENS)
|
|
{
|
|
iNew113MERCMerc = pMail->usLength;
|
|
pMail->usLength = 2;
|
|
}
|
|
else if (pMail->usLength >= 170 && pMail->usLength <= 177)
|
|
{
|
|
iNew113AIMMerc = pMail->usLength;
|
|
pMail->usLength = 2;
|
|
}
|
|
// User made merc
|
|
else if (pMail->usLength >= 178 && pMail->usLength <= 254)
|
|
{
|
|
iNew113CustomUserMerc = pMail->usLength;
|
|
pMail->usLength = 2;
|
|
}
|
|
}
|
|
else if ( pMail->EmailVersion == TYPE_EMAIL_MERC_LEVEL_UP )
|
|
{
|
|
iEmailMERCMessage = pMail->usLength;
|
|
pMail->usLength = 2;
|
|
}
|
|
else if ( pMail->EmailVersion == TYPE_EMAIL_BOBBY_R )
|
|
{
|
|
iEmailBobbyRMessage = pMail->usLength;
|
|
pMail->usLength = 4;
|
|
}
|
|
else if ( pMail->EmailVersion == TYPE_EMAIL_AIM_AVAILABLE )
|
|
{
|
|
iEmailAIMMessage = pMail->usLength;
|
|
pMail->usLength = 2;
|
|
}
|
|
|
|
// list doesn't exist, reload
|
|
if( !pTempRecord )
|
|
{
|
|
while(pMail->usLength > iCounter)
|
|
{
|
|
// read one record from email file
|
|
// read one record from email file
|
|
#ifdef JA2UB
|
|
//if ( pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT || pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT_NAME_MERC )
|
|
//{
|
|
if (FileExists(EMAIL_EDT_FILE_JA25) )
|
|
{
|
|
if ( pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT || pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT_NAME_MERC )
|
|
LoadEncryptedDataFromFile( EMAIL_EDT_FILE_JA25, pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
}
|
|
else
|
|
{
|
|
if ( pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT || pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT_NAME_MERC )
|
|
LoadEncryptedDataFromFile( EMAIL_EDT_FILE_JA2, pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
}
|
|
//}
|
|
if ( pMail->EmailVersion == TYPE_EMAIL_BOBBY_R_EMAIL_JA2_EDT || pMail->EmailVersion == TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT || pMail->EmailVersion == TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT )
|
|
{
|
|
LoadEncryptedDataFromFile( EMAIL_EDT_FILE_JA2, pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
}
|
|
#else
|
|
if ( pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT || pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT_NAME_MERC )
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Email.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE );
|
|
#endif
|
|
|
|
else if ( pMail->EmailVersion == TYPE_EMAIL_XML )
|
|
{
|
|
wcscpy(pString, L"\0");
|
|
wcscat(pString, gEmails[pMail->usOffset].Messages[iCounter].c_str());
|
|
}
|
|
|
|
// ----------------
|
|
// New MERC Merc
|
|
// ----------------
|
|
// WANNE: We have a new 1.13 MERC merc (Text, Gaston, Stogie or Biggens)
|
|
if (iNew113MERCMerc != 0 )
|
|
{
|
|
// WANNE: TODO: Replace "Biff" with the name of the 1.13 merc
|
|
if (iCounter == 1 && pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT )
|
|
{
|
|
wcscpy(pString, L"\0");
|
|
if (iNew113MERCMerc == MERC_UP_LEVEL_GASTON)
|
|
{
|
|
wcscpy( pString, New113MERCMercMailTexts[0] );
|
|
}
|
|
else if (iNew113MERCMerc == MERC_UP_LEVEL_STOGIE)
|
|
{
|
|
wcscpy( pString, New113MERCMercMailTexts[1] );
|
|
}
|
|
else if (iNew113MERCMerc == MERC_UP_LEVEL_TEX)
|
|
{
|
|
wcscpy( pString, New113MERCMercMailTexts[2] );
|
|
}
|
|
else if (iNew113MERCMerc == MERC_UP_LEVEL_BIGGENS)
|
|
{
|
|
wcscpy( pString, New113MERCMercMailTexts[3] );
|
|
}
|
|
}
|
|
}
|
|
|
|
// ----------------
|
|
// New AIM Merc
|
|
// ----------------
|
|
// WANNE: We have a new 1.13 AIM Wildfire merc
|
|
if (iNew113AIMMerc != 0)
|
|
{
|
|
wcscpy(pString, L"\0");
|
|
|
|
// Only output the mail text, not the subject, cause we already have the subject as text
|
|
if (iCounter == 1 && pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT )
|
|
{
|
|
if (iNew113AIMMerc == 170)
|
|
{
|
|
wcscpy( pString, New113AIMMercMailTexts[1] );
|
|
}
|
|
else if (iNew113AIMMerc == 171)
|
|
{
|
|
wcscpy( pString, New113AIMMercMailTexts[3] );
|
|
}
|
|
else if (iNew113AIMMerc == 172)
|
|
{
|
|
wcscpy( pString, New113AIMMercMailTexts[5] );
|
|
}
|
|
else if (iNew113AIMMerc == 173)
|
|
{
|
|
wcscpy( pString, New113AIMMercMailTexts[7] );
|
|
}
|
|
else if (iNew113AIMMerc == 174)
|
|
{
|
|
wcscpy( pString, New113AIMMercMailTexts[9] );
|
|
}
|
|
else if (iNew113AIMMerc == 175)
|
|
{
|
|
wcscpy( pString, New113AIMMercMailTexts[11] );
|
|
}
|
|
else if (iNew113AIMMerc == 176)
|
|
{
|
|
wcscpy( pString, New113AIMMercMailTexts[13] );
|
|
}
|
|
else if (iNew113AIMMerc == 177)
|
|
{
|
|
wcscpy( pString, New113AIMMercMailTexts[15] );
|
|
}
|
|
// Additional Generic Merc mail message
|
|
else
|
|
{
|
|
wcscpy( pString, New113AIMMercMailTexts[17] );
|
|
}
|
|
}
|
|
}
|
|
|
|
// --------------------------
|
|
// New Customer User Merc
|
|
// --------------------------
|
|
// WANNE: We have a new 1.13 AIM Wildfire merc
|
|
if (iNew113CustomUserMerc != 0 && pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT_NAME_MERC)
|
|
{
|
|
wcscpy(pString, L"\0");
|
|
|
|
// Only output the mail text, not the subject, cause we already have the subject as text
|
|
if (iCounter == 1)
|
|
{
|
|
wcscpy( pString, New113AIMMercMailTexts[17] );
|
|
}
|
|
}
|
|
|
|
if (iCounter == 1)
|
|
{
|
|
if ( pMail->EmailVersion == TYPE_EMAIL_AIM_AVAILABLE )
|
|
{
|
|
wcscpy(pString, L"\0");
|
|
wcscpy( pString, EmailMercAvailableText[iEmailAIMMessage].szMessage);
|
|
}
|
|
else if ( pMail->EmailVersion == TYPE_EMAIL_MERC_LEVEL_UP)
|
|
{
|
|
wcscpy(pString, L"\0");
|
|
wcscpy( pString, EmailMercLevelUpText[iEmailMERCMessage].szMessage);
|
|
}
|
|
/*
|
|
else if ( pMail->EmailVersion == TYPE_EMAIL_BOBBY_R)
|
|
{
|
|
wcscpy(pString, L"\0");
|
|
wcscpy( pString, EmailBobbyRText[0]);
|
|
}
|
|
*/
|
|
}
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
// increment email record counter
|
|
++iCounter;
|
|
}
|
|
|
|
if ( pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT )
|
|
{
|
|
// WANNE: Set the value back
|
|
if (iNew113MERCMerc != 0)
|
|
{
|
|
pMail->usLength = iNew113MERCMerc;
|
|
}
|
|
|
|
// WANNE: Set the value back
|
|
if (iNew113AIMMerc != 0)
|
|
{
|
|
pMail->usLength = iNew113AIMMerc;
|
|
}
|
|
|
|
// WANNE: Set the value back
|
|
if (iNew113CustomUserMerc != 0)
|
|
{
|
|
pMail->usLength = iNew113CustomUserMerc;
|
|
}
|
|
}
|
|
else if ( pMail->EmailVersion == TYPE_EMAIL_BOBBY_R )
|
|
{
|
|
if (iEmailBobbyRMessage != 0)
|
|
{
|
|
pMail->usLength = iEmailBobbyRMessage;
|
|
}
|
|
}
|
|
else if ( pMail->EmailVersion == TYPE_EMAIL_AIM_AVAILABLE )
|
|
pMail->usLength = iEmailAIMMessage;
|
|
else if ( pMail->EmailVersion == TYPE_EMAIL_MERC_LEVEL_UP )
|
|
pMail->usLength = iEmailMERCMessage;
|
|
|
|
giPrevMessageId = giMessageId;
|
|
}
|
|
|
|
// set record ptr to head of list
|
|
pTempRecord=pMessageRecordList;
|
|
|
|
//def removed
|
|
// pass the subject line
|
|
if ( pTempRecord && pMail->usOffset != IMP_EMAIL_PROFILE_RESULTS && pMail->EmailVersion != TYPE_EMAIL_XML )
|
|
{
|
|
pTempRecord = pTempRecord->Next;
|
|
}
|
|
|
|
// get number of pages to this email
|
|
giNumberOfPagesToCurrentEmail = GetNumberOfPagesToEmail( );
|
|
|
|
while( pTempRecord )
|
|
{
|
|
// copy over string
|
|
wcscpy(pString, pTempRecord->pRecord);
|
|
|
|
// get the height of the string, ONLY!...must redisplay ON TOP OF background graphic
|
|
iHeight += IanWrappedStringHeight(VIEWER_X + 9, ( UINT16 )( VIEWER_MESSAGE_BODY_START_Y + iHeight + GetFontHeight(MESSAGE_FONT)), MESSAGE_WIDTH, MESSAGE_GAP, MESSAGE_FONT, MESSAGE_COLOR,pString,0,FALSE,0);
|
|
|
|
// next message record string
|
|
pTempRecord = pTempRecord->Next;
|
|
}
|
|
|
|
iViewerPositionY = ( 261 - iHeight ) / 2;
|
|
|
|
if ( iViewerPositionY < 0 )
|
|
{
|
|
iViewerPositionY = 0;
|
|
}
|
|
|
|
// set total height to height of records displayed
|
|
iTotalHeight=iHeight;
|
|
|
|
// if the message background is less than MIN_MESSAGE_HEIGHT_IN_LINES, set to that number
|
|
if( ( iTotalHeight / GetFontHeight( MESSAGE_FONT ) ) < MIN_MESSAGE_HEIGHT_IN_LINES)
|
|
{
|
|
iTotalHeight=GetFontHeight( MESSAGE_FONT ) * MIN_MESSAGE_HEIGHT_IN_LINES;
|
|
}
|
|
|
|
if(iTotalHeight > MAX_EMAIL_MESSAGE_PAGE_SIZE)
|
|
{
|
|
// if message to big to fit on page
|
|
iTotalHeight = MAX_EMAIL_MESSAGE_PAGE_SIZE + 10;
|
|
}
|
|
else
|
|
{
|
|
iTotalHeight += 10;
|
|
}
|
|
|
|
pTempRecord=pMessageRecordList;
|
|
|
|
if( iTotalHeight < MAX_EMAIL_MESSAGE_PAGE_SIZE )
|
|
{
|
|
fOnLastPageFlag = TRUE;
|
|
|
|
if( pTempRecord && pMail->usOffset != IMP_EMAIL_PROFILE_RESULTS && pMail->EmailVersion != TYPE_EMAIL_XML )
|
|
{
|
|
pTempRecord = pTempRecord->Next;
|
|
}
|
|
|
|
/*
|
|
//Def removed
|
|
if( pTempRecord )
|
|
{
|
|
pTempRecord = pTempRecord->Next;
|
|
}
|
|
*/
|
|
|
|
pEmailPageInfo[ 0 ].pFirstRecord = pTempRecord ;
|
|
pEmailPageInfo[ 0 ].iPageNumber = 0;
|
|
|
|
Assert(pTempRecord); // required, otherwise we're testing pCurrentRecord when undefined later
|
|
|
|
while( pTempRecord )
|
|
{
|
|
pCurrentRecord = pTempRecord;
|
|
|
|
// increment email record ptr
|
|
pTempRecord = pTempRecord->Next;
|
|
}
|
|
|
|
// only one record to this email?..then set next to null
|
|
if( pCurrentRecord == pEmailPageInfo[ 0 ].pFirstRecord )
|
|
{
|
|
pCurrentRecord = NULL;
|
|
}
|
|
|
|
// set up the last record for the page
|
|
pEmailPageInfo[ 0 ].pLastRecord = pCurrentRecord;
|
|
|
|
// now set up the next page
|
|
pEmailPageInfo[ 1 ].pFirstRecord = NULL;
|
|
pEmailPageInfo[ 1 ].pLastRecord = NULL;
|
|
pEmailPageInfo[ 1 ].iPageNumber = 1;
|
|
}
|
|
else
|
|
{
|
|
fOnLastPageFlag = FALSE;
|
|
pTempList = pMessageRecordList;
|
|
|
|
if( pTempList && pMail->usOffset != IMP_EMAIL_PROFILE_RESULTS && pMail->EmailVersion != TYPE_EMAIL_XML )
|
|
{
|
|
pTempList = pTempList->Next;
|
|
}
|
|
|
|
/*
|
|
//def removed
|
|
// skip the subject
|
|
if( pTempList )
|
|
{
|
|
pTempList = pTempList->Next;
|
|
}
|
|
|
|
*/
|
|
iCounter = 0;
|
|
|
|
// more than one page
|
|
//for( iCounter = 0; iCounter < giNumberOfPagesToCurrentEmail; iCounter++ )
|
|
while( pTempRecord = GetFirstRecordOnThisPage( pTempList, MESSAGE_FONT, MESSAGE_WIDTH, MESSAGE_GAP, iCounter, MAX_EMAIL_MESSAGE_PAGE_SIZE ) )
|
|
{
|
|
iYPositionOnPage = 0;
|
|
|
|
pEmailPageInfo[ iCounter ].pFirstRecord = pTempRecord;
|
|
pEmailPageInfo[ iCounter ].iPageNumber = iCounter;
|
|
pLastRecord = NULL;
|
|
|
|
// go to the right record
|
|
while( pTempRecord )
|
|
{
|
|
// copy over string
|
|
wcscpy( pString, pTempRecord->pRecord );
|
|
|
|
if( pString[ 0 ] == 0 )
|
|
{
|
|
// on last page
|
|
fOnLastPageFlag = TRUE;
|
|
}
|
|
|
|
if( ( iYPositionOnPage + IanWrappedStringHeight(0, 0, MESSAGE_WIDTH, MESSAGE_GAP,
|
|
MESSAGE_FONT, 0, pTempRecord->pRecord,
|
|
0, 0, 0 ) ) <= MAX_EMAIL_MESSAGE_PAGE_SIZE )
|
|
{
|
|
// now print it
|
|
|
|
iYPositionOnPage += IanWrappedStringHeight(VIEWER_X + 9, ( UINT16 )( VIEWER_MESSAGE_BODY_START_Y + 10 +iYPositionOnPage + iViewerPositionY), MESSAGE_WIDTH, MESSAGE_GAP, MESSAGE_FONT, MESSAGE_COLOR,pString,0,FALSE, IAN_WRAP_NO_SHADOW);
|
|
fGoingOffCurrentPage = FALSE;
|
|
}
|
|
else
|
|
{
|
|
// gonna get cut off...end now
|
|
fGoingOffCurrentPage = TRUE;
|
|
}
|
|
|
|
pCurrentRecord = pTempRecord;
|
|
pTempRecord = pTempRecord->Next;
|
|
|
|
if( fGoingOffCurrentPage == FALSE )
|
|
{
|
|
pLastRecord = pTempRecord;
|
|
}
|
|
// record get cut off?...end now
|
|
|
|
if( fGoingOffCurrentPage == TRUE )
|
|
{
|
|
pTempRecord = NULL;
|
|
}
|
|
}
|
|
|
|
if( pLastRecord == pEmailPageInfo[ iCounter ].pFirstRecord )
|
|
{
|
|
pLastRecord = NULL;
|
|
}
|
|
|
|
pEmailPageInfo[ iCounter ].pLastRecord = pLastRecord;
|
|
++iCounter;
|
|
}
|
|
|
|
pEmailPageInfo[ iCounter ].pFirstRecord = NULL;
|
|
pEmailPageInfo[ iCounter ].pLastRecord = NULL;
|
|
pEmailPageInfo[ iCounter ].iPageNumber = iCounter;
|
|
}
|
|
}
|
|
|
|
|
|
void ModifyInsuranceEmails( UINT16 usMessageId, INT32 *iResults, EmailPtr pMail )
|
|
{
|
|
INT32 iHeight=0;
|
|
RecordPtr pTempRecord;
|
|
// CHAR16 pString[MAIL_STRING_SIZE/2 + 1];
|
|
CHAR16 pString[MAIL_STRING_SIZE];
|
|
UINT8 ubCnt;
|
|
|
|
// Replace the name in the subject line
|
|
// swprintf( pMail->pSubject, gMercProfiles[ pMail->ubFirstData ].zNickname );
|
|
|
|
// set record ptr to head of list
|
|
pTempRecord=pMessageRecordList;
|
|
|
|
// increment height for size of one line
|
|
iHeight+=GetFontHeight( MESSAGE_FONT );
|
|
|
|
// list doesn't exist, reload
|
|
if( !pTempRecord )
|
|
{
|
|
for ( ubCnt = 0; ubCnt < pMail->usLength; ubCnt++ )
|
|
{
|
|
// read one record from email file
|
|
#ifdef JA2UB
|
|
if ( pMail->EmailVersion != TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT || pMail->EmailVersion != TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT )
|
|
{
|
|
if (FileExists(EMAIL_EDT_FILE_JA25))
|
|
{
|
|
LoadEncryptedDataFromFile( EMAIL_EDT_FILE_JA25, pString, MAIL_STRING_SIZE * usMessageId, MAIL_STRING_SIZE );
|
|
}
|
|
else
|
|
{
|
|
LoadEncryptedDataFromFile( EMAIL_EDT_FILE_JA2, pString, MAIL_STRING_SIZE * usMessageId, MAIL_STRING_SIZE );
|
|
}
|
|
}
|
|
|
|
if ( pMail->EmailType == TYPE_E_INSURANCE_L3 || pMail->EmailType == TYPE_E_INSURANCE_L2 || pMail->EmailType == TYPE_E_AIM_L1 || pMail->EmailType == TYPE_E_AIM_L3 ||
|
|
pMail->EmailVersion == TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT || pMail->EmailVersion == TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT )
|
|
{
|
|
LoadEncryptedDataFromFile( EMAIL_EDT_FILE_JA2, pString, MAIL_STRING_SIZE * usMessageId, MAIL_STRING_SIZE );
|
|
}
|
|
#else
|
|
if ( pMail->EmailVersion == TYPE_EMAIL_XML && pMail->usOffset < gEmails.size() )
|
|
{
|
|
wcscpy(pString, gEmails[pMail->usOffset].Messages[ubCnt].c_str());
|
|
}
|
|
else
|
|
{
|
|
LoadEncryptedDataFromFile( "BINARYDATA\\Email.edt", pString, MAIL_STRING_SIZE * usMessageId, MAIL_STRING_SIZE );
|
|
}
|
|
#endif
|
|
//Replace the $MERCNAME$ and $AMOUNT$ with the mercs name and the amountm if the string contains the keywords.
|
|
ReplaceMercNameAndAmountWithProperData( pString, pMail );
|
|
|
|
// add to list
|
|
AddEmailRecordToList( pString );
|
|
|
|
++usMessageId;
|
|
}
|
|
}
|
|
|
|
giPrevMessageId = giMessageId;
|
|
}
|
|
|
|
BOOLEAN ReplaceBiffNameWithProperMercName( CHAR16 *pFinishedString, EmailPtr pMail, CHAR16 *pMercName )
|
|
{
|
|
CHAR16 pTempString[MAIL_STRING_SIZE];
|
|
INT32 iLength=0;
|
|
INT32 iCurLocInSourceString=0;
|
|
INT32 iLengthOfSourceString = wcslen( pFinishedString ); //Get the length of the source string
|
|
CHAR16 *pMercNameString=NULL;
|
|
CHAR16 *pSubString=NULL;
|
|
BOOLEAN fReplacingMercName = TRUE;
|
|
|
|
CHAR16 sMercName[ 32 ] = L"Biff"; //Doesnt need to be translated, inside Email.txt and will be replaced by the mercs name
|
|
CHAR16 sSearchString[32];
|
|
|
|
//Copy the original string over to the temp string
|
|
wcscpy( pTempString, pFinishedString );
|
|
|
|
//Null out the string
|
|
pFinishedString[0] = L'\0';
|
|
|
|
//Keep looping through to replace all references to the keyword
|
|
while( iCurLocInSourceString < iLengthOfSourceString )
|
|
{
|
|
iLength = 0;
|
|
pSubString = NULL;
|
|
|
|
//Find out if the $MERCNAME$ is in the string
|
|
pMercNameString = wcsstr( &pTempString[ iCurLocInSourceString ], sMercName );
|
|
|
|
//pAmountString = wcsstr( &pTempString[ iCurLocInSourceString ], sAmount );
|
|
|
|
if( pMercNameString != NULL)
|
|
{
|
|
fReplacingMercName = TRUE;
|
|
pSubString = pMercNameString;
|
|
wcscpy( sSearchString, sMercName);
|
|
}
|
|
else
|
|
{
|
|
pSubString = NULL;
|
|
}
|
|
|
|
// if there is a substring
|
|
if( pSubString != NULL )
|
|
{
|
|
iLength = pSubString - &pTempString[ iCurLocInSourceString ];
|
|
|
|
//Copy the part of the source string upto the keyword
|
|
wcsncat( pFinishedString, &pTempString[ iCurLocInSourceString ], iLength );
|
|
|
|
//increment the source string counter by how far in the keyword is and by the length of the keyword
|
|
iCurLocInSourceString+= iLength + wcslen( sSearchString );
|
|
|
|
if( fReplacingMercName )
|
|
{
|
|
//add the mercs name to the string
|
|
wcscat( pFinishedString, pMercName );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//add the rest of the string
|
|
wcscat( pFinishedString, &pTempString[ iCurLocInSourceString ] );
|
|
|
|
iCurLocInSourceString += wcslen( &pTempString[ iCurLocInSourceString ] );
|
|
}
|
|
}
|
|
|
|
return( TRUE );
|
|
}
|
|
|
|
|
|
BOOLEAN ReplaceMercNameAndAmountWithProperData( CHAR16 *pFinishedString, EmailPtr pMail )
|
|
{
|
|
// CHAR16 pTempString[MAIL_STRING_SIZE/2 + 1];
|
|
CHAR16 pTempString[MAIL_STRING_SIZE];
|
|
INT32 iLength=0;
|
|
INT32 iCurLocInSourceString=0;
|
|
INT32 iLengthOfSourceString = wcslen( pFinishedString ); //Get the length of the source string
|
|
CHAR16 *pMercNameString=NULL;
|
|
CHAR16 *pAmountString=NULL;
|
|
CHAR16 *pSubString=NULL;
|
|
BOOLEAN fReplacingMercName = TRUE;
|
|
|
|
CHAR16 sMercName[ 32 ] = L"$MERCNAME$"; //Doesnt need to be translated, inside Email.txt and will be replaced by the mercs name
|
|
CHAR16 sAmount[32] = L"$AMOUN$"; //Doesnt need to be translated, inside Email.txt and will be replaced by a dollar amount
|
|
CHAR16 sSearchString[32];
|
|
|
|
//Copy the original string over to the temp string
|
|
wcscpy( pTempString, pFinishedString );
|
|
|
|
//Null out the string
|
|
pFinishedString[0] = L'\0';
|
|
|
|
//Keep looping through to replace all references to the keyword
|
|
while( iCurLocInSourceString < iLengthOfSourceString )
|
|
{
|
|
iLength = 0;
|
|
pSubString = NULL;
|
|
|
|
//Find out if the $MERCNAME$ is in the string
|
|
pMercNameString = wcsstr( &pTempString[ iCurLocInSourceString ], sMercName );
|
|
|
|
pAmountString = wcsstr( &pTempString[ iCurLocInSourceString ], sAmount );
|
|
|
|
if( pMercNameString != NULL && pAmountString != NULL )
|
|
{
|
|
if( pMercNameString < pAmountString )
|
|
{
|
|
fReplacingMercName = TRUE;
|
|
pSubString = pMercNameString;
|
|
wcscpy( sSearchString, sMercName);
|
|
}
|
|
else
|
|
{
|
|
fReplacingMercName = FALSE;
|
|
pSubString = pAmountString;
|
|
wcscpy( sSearchString, sAmount);
|
|
}
|
|
}
|
|
else if( pMercNameString != NULL )
|
|
{
|
|
fReplacingMercName = TRUE;
|
|
pSubString = pMercNameString;
|
|
wcscpy( sSearchString, sMercName);
|
|
}
|
|
else if( pAmountString != NULL )
|
|
{
|
|
fReplacingMercName = FALSE;
|
|
pSubString = pAmountString;
|
|
wcscpy( sSearchString, sAmount);
|
|
}
|
|
else
|
|
{
|
|
pSubString = NULL;
|
|
}
|
|
|
|
// if there is a substring
|
|
if( pSubString != NULL )
|
|
{
|
|
iLength = pSubString - &pTempString[ iCurLocInSourceString ];
|
|
|
|
//Copy the part of the source string upto the keyword
|
|
wcsncat( pFinishedString, &pTempString[ iCurLocInSourceString ], iLength );
|
|
|
|
//increment the source string counter by how far in the keyword is and by the length of the keyword
|
|
iCurLocInSourceString+= iLength + wcslen( sSearchString );
|
|
|
|
if( fReplacingMercName )
|
|
{
|
|
//add the mercs name to the string
|
|
if ( pMail->uiSecondData < NUM_PROFILES )
|
|
{
|
|
wcscat( pFinishedString, gMercProfiles[ pMail->uiSecondData ].zName );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//add the mercs name to the string
|
|
wcscat( pFinishedString, FormatMoney(pMail->iFirstData).data() );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//add the rest of the string
|
|
wcscat( pFinishedString, &pTempString[ iCurLocInSourceString ] );
|
|
|
|
iCurLocInSourceString += wcslen( &pTempString[ iCurLocInSourceString ] );
|
|
}
|
|
}
|
|
|
|
return( TRUE );
|
|
}
|
|
|
|
#ifdef JA2BETAVERSION
|
|
void AddAllEmails()
|
|
{
|
|
#ifdef JA2UB
|
|
//no UB
|
|
#else
|
|
const auto date = GetWorldTotalMin();
|
|
const auto money = 1000000; // 1 MILLION DOLLARS!
|
|
const auto mercID = 0;
|
|
for ( size_t i = 0; i < gEmails.size(); i++ )
|
|
{
|
|
// Insurance emails
|
|
if ( i >= XML_INSURANCE_APPROVED && i <= XML_INSURANCE_POLICYVIOLATION )
|
|
{
|
|
AddEmailWithSpecialDataXML(i, date, -1, -1, false, money, mercID, INSUR_PAYMENT, -1, -1, -1);
|
|
}
|
|
// BR Shipment arrival
|
|
else if ( i == XML_BR_SHIPMENTARRIVAL )
|
|
{
|
|
AddEmailFromXML(i, date, -1, 1, false, -1, -1, BOBBYR_SHIPMENT_ARRIVED, -1, -1, -1);
|
|
}
|
|
// AIM Notification of death
|
|
// Medical deposit refunds
|
|
else if ( i >= XML_AIM_NOTICE_OF_DEATH && i <= XML_AIM_NOREFUND )
|
|
{
|
|
const auto money = 1000000; // 1 MILLION DOLLARS!
|
|
const auto mercID = 0;
|
|
AddEmailWithSpecialDataXML(i, date, -1, -1, false, money, mercID, MERC_DIED_ON_OTHER_ASSIGNMENT, -1, -1, -1);
|
|
}
|
|
else
|
|
{
|
|
AddEmailFromXML(i, date, -1, -1, false, 0, 0, 0, 0, 0, 0);
|
|
}
|
|
}
|
|
|
|
#if 0 // EDIT email data
|
|
UINT32 uiCnt;
|
|
UINT32 uiOffset;
|
|
|
|
AddEmail(IMP_EMAIL_INTRO,IMP_EMAIL_INTRO_LENGTH,CHAR_PROFILE_SITE, date, -1, -1, TYPE_EMAIL_EMAIL_EDT );
|
|
AddEmail(ENRICO_CONGRATS,ENRICO_CONGRATS_LENGTH,MAIL_ENRICO, date, -1, -1, TYPE_EMAIL_EMAIL_EDT );
|
|
AddEmail(IMP_EMAIL_AGAIN,IMP_EMAIL_AGAIN_LENGTH,1, date, -1, -1, TYPE_EMAIL_EMAIL_EDT );
|
|
AddEmail(MERC_INTRO, MERC_INTRO_LENGTH, SPECK_FROM_MERC, date, -1, -1, TYPE_EMAIL_EMAIL_EDT );
|
|
AddEmail( MERC_NEW_SITE_ADDRESS, MERC_NEW_SITE_ADDRESS_LENGTH, SPECK_FROM_MERC, date, -1, -1, TYPE_EMAIL_EMAIL_EDT );
|
|
|
|
AddEmail(IMP_EMAIL_PROFILE_RESULTS, IMP_EMAIL_PROFILE_RESULTS_LENGTH, IMP_PROFILE_RESULTS, date, -1, -1, TYPE_EMAIL_EMAIL_EDT );
|
|
|
|
AddEmail( MERC_WARNING, MERC_WARNING_LENGTH, SPECK_FROM_MERC, date, -1, -1, TYPE_EMAIL_EMAIL_EDT);
|
|
AddEmail( MERC_INVALID, MERC_INVALID_LENGTH, SPECK_FROM_MERC, date, -1, -1, TYPE_EMAIL_EMAIL_EDT);
|
|
AddEmail( NEW_MERCS_AT_MERC, NEW_MERCS_AT_MERC_LENGTH, SPECK_FROM_MERC, date, -1, -1, TYPE_EMAIL_EMAIL_EDT);
|
|
AddEmail( MERC_FIRST_WARNING, MERC_FIRST_WARNING_LENGTH, SPECK_FROM_MERC, date, -1, -1, TYPE_EMAIL_EMAIL_EDT);
|
|
|
|
uiOffset = MERC_UP_LEVEL_BIFF;
|
|
for( uiCnt=0; uiCnt<10; ++uiCnt)
|
|
{
|
|
AddEmail( uiOffset, MERC_UP_LEVEL_LENGTH_BIFF, SPECK_FROM_MERC, date, -1, -1, TYPE_EMAIL_EMAIL_EDT_NAME_MERC );
|
|
uiOffset += MERC_UP_LEVEL_LENGTH_BIFF;
|
|
}
|
|
|
|
// AddEmail( ( UINT8 )( AIM_REPLY_BARRY + ( AIM_REPLY_LENGTH_BARRY ) ), AIM_REPLY_LENGTH_BARRY, AIM_REPLY_BARRY, date, -1, -1 );
|
|
|
|
uiOffset = AIM_REPLY_BARRY;
|
|
for( uiCnt=0; uiCnt<40; ++uiCnt )
|
|
{
|
|
AddEmail( ( UINT8 )( uiOffset + ( uiCnt * AIM_REPLY_LENGTH_BARRY ) ), AIM_REPLY_LENGTH_BARRY, ( UINT8 )( 6 + uiCnt ), date, -1, -1, TYPE_EMAIL_EMAIL_EDT_NAME_MERC );
|
|
}
|
|
|
|
AddEmail(OLD_ENRICO_1,OLD_ENRICO_1_LENGTH,MAIL_ENRICO, date, -1, -1, TYPE_EMAIL_EMAIL_EDT );
|
|
AddEmail(OLD_ENRICO_2,OLD_ENRICO_2_LENGTH,MAIL_ENRICO, date, -1, -1, TYPE_EMAIL_EMAIL_EDT );
|
|
AddEmail(OLD_ENRICO_3,OLD_ENRICO_3_LENGTH,MAIL_ENRICO, date, -1, -1, TYPE_EMAIL_EMAIL_EDT );
|
|
AddEmail(RIS_REPORT,RIS_REPORT_LENGTH,RIS_EMAIL, date, -1, -1, TYPE_EMAIL_EMAIL_EDT );
|
|
|
|
AddEmail( ENRICO_MIGUEL, ENRICO_MIGUEL_LENGTH, MAIL_ENRICO, date, -1, -1, TYPE_EMAIL_EMAIL_EDT );
|
|
AddEmail(ENRICO_PROG_20, ENRICO_PROG_20_LENGTH, MAIL_ENRICO, date, -1, -1, TYPE_EMAIL_EMAIL_EDT);
|
|
AddEmail(ENRICO_PROG_55, ENRICO_PROG_55_LENGTH, MAIL_ENRICO, date, -1, -1, TYPE_EMAIL_EMAIL_EDT);
|
|
AddEmail(ENRICO_PROG_80, ENRICO_PROG_80_LENGTH, MAIL_ENRICO, date, -1, -1, TYPE_EMAIL_EMAIL_EDT);
|
|
AddEmail(ENRICO_SETBACK, ENRICO_SETBACK_LENGTH, MAIL_ENRICO, date, -1, -1, TYPE_EMAIL_EMAIL_EDT);
|
|
AddEmail(ENRICO_SETBACK_2, ENRICO_SETBACK_2_LENGTH, MAIL_ENRICO, date, -1, -1, TYPE_EMAIL_EMAIL_EDT);
|
|
AddEmail(LACK_PLAYER_PROGRESS_1, LACK_PLAYER_PROGRESS_1_LENGTH, MAIL_ENRICO, date, -1, -1, TYPE_EMAIL_EMAIL_EDT);
|
|
AddEmail(LACK_PLAYER_PROGRESS_2, LACK_PLAYER_PROGRESS_2_LENGTH, MAIL_ENRICO, date, -1, -1, TYPE_EMAIL_EMAIL_EDT);
|
|
AddEmail(LACK_PLAYER_PROGRESS_3, LACK_PLAYER_PROGRESS_3_LENGTH, MAIL_ENRICO, date, -1, -1, TYPE_EMAIL_EMAIL_EDT);
|
|
AddEmail(ENRICO_CREATURES, ENRICO_CREATURES_LENGTH, MAIL_ENRICO, date, -1, -1, TYPE_EMAIL_EMAIL_EDT);
|
|
|
|
//Add an email telling the user that he received an insurance payment
|
|
AddEmailWithSpecialData( INSUR_PAYMENT, INSUR_PAYMENT_LENGTH, INSURANCE_COMPANY, date, 20, 0, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE );
|
|
AddEmailWithSpecialData( INSUR_SUSPIC, INSUR_SUSPIC_LENGTH, INSURANCE_COMPANY, date, 20, 0, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE );
|
|
AddEmailWithSpecialData( INSUR_SUSPIC_2, INSUR_SUSPIC_2_LENGTH, INSURANCE_COMPANY, date, 20, 0, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE );
|
|
AddEmail( BOBBYR_NOW_OPEN, BOBBYR_NOW_OPEN_LENGTH, BOBBY_R, date, -1, -1, TYPE_EMAIL_EMAIL_EDT);
|
|
AddEmail( KING_PIN_LETTER, KING_PIN_LETTER_LENGTH, KING_PIN, date, -1, -1, TYPE_EMAIL_EMAIL_EDT );
|
|
AddEmail( BOBBYR_SHIPMENT_ARRIVED, BOBBYR_SHIPMENT_ARRIVED_LENGTH, BOBBY_R, date, -1, -1, TYPE_EMAIL_EMAIL_EDT );
|
|
|
|
AddEmail( JOHN_KULBA_GIFT_IN_DRASSEN, JOHN_KULBA_GIFT_IN_DRASSEN_LENGTH, JOHN_KULBA, date, -1, -1, TYPE_EMAIL_EMAIL_EDT );
|
|
|
|
AddEmailWithSpecialData(MERC_DIED_ON_OTHER_ASSIGNMENT, MERC_DIED_ON_OTHER_ASSIGNMENT_LENGTH, AIM_SITE, date, 0, 0, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE );
|
|
|
|
AddEmailWithSpecialData( INSUR_1HOUR_FRAUD, INSUR_1HOUR_FRAUD_LENGTH, INSURANCE_COMPANY, date, 20, 0, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE );
|
|
|
|
//add an email
|
|
AddEmailWithSpecialData( AIM_MEDICAL_DEPOSIT_REFUND, AIM_MEDICAL_DEPOSIT_REFUND_LENGTH, AIM_SITE, date, 20, 0, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE );
|
|
|
|
AddEmailWithSpecialData( AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND, AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND_LENGTH, AIM_SITE, date, 20, 0, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE );
|
|
|
|
AddEmailWithSpecialData( AIM_MEDICAL_DEPOSIT_NO_REFUND, AIM_MEDICAL_DEPOSIT_NO_REFUND_LENGTH, AIM_SITE, date, 20, 0, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE );
|
|
#endif
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
BOOLEAN SaveNewEmailDataToSaveGameFile( HWFILE hFile )
|
|
{
|
|
UINT32 uiNumBytesWritten;
|
|
|
|
FileWrite( hFile, &gEmailT, sizeof( gEmailT), &uiNumBytesWritten );
|
|
if( uiNumBytesWritten != sizeof( gEmailT ) )
|
|
{
|
|
return( FALSE );
|
|
}
|
|
|
|
return( TRUE );
|
|
}
|
|
|
|
BOOLEAN LoadNewEmailDataFromLoadGameFile( HWFILE hFile )
|
|
{
|
|
UINT32 uiNumBytesRead;
|
|
UINT32 uiNumOfEmails=0;
|
|
EmailPtr pEmail = pEmailList;
|
|
|
|
FileRead( hFile, &gEmailT, sizeof( gEmailT), &uiNumBytesRead );
|
|
if( uiNumBytesRead != sizeof( gEmailT ) )
|
|
{
|
|
return( FALSE );
|
|
}
|
|
/*
|
|
while(pEmail)
|
|
{
|
|
pEmail=pEmail->Next;
|
|
uiNumOfEmails++;
|
|
}
|
|
|
|
for( UINT32 cnt=0; cnt<uiNumOfEmails; cnt++)
|
|
{
|
|
if ( ReadXMLEmail == FALSE )
|
|
{
|
|
if ( gEmailT[ cnt ].EmailVersion == TYPE_EMAIL_AIM_AVAILABLE || gEmailT[ cnt ].EmailVersion == TYPE_EMAIL_MERC_LEVEL_UP )
|
|
{
|
|
gEmailT[ cnt ].EmailVersion = TYPE_EMAIL_EMAIL_EDT_NAME_MERC;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( gEmailT[ cnt ].EmailVersion == TYPE_EMAIL_EMAIL_EDT_NAME_MERC )
|
|
{
|
|
gEmailT[ cnt ].EmailVersion = TYPE_EMAIL_AIM_AVAILABLE;
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
while(pEmail)
|
|
{
|
|
pEmail->EmailVersion = gEmailT[ uiNumOfEmails ].EmailVersion;
|
|
pEmail=pEmail->Next;
|
|
++uiNumOfEmails;
|
|
}
|
|
|
|
return( TRUE );
|
|
}
|