#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 #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 //max number of lines can be shown in an opened email messagebox #define MAX_EMAIL_LINES 20 // 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 ) * MAX_EMAIL_LINES 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 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 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 != static_cast(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 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 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 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; cntNext; 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[MAIL_STRING_SIZE]; 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; cntEmailVersion = gEmailT[ uiNumOfEmails ].EmailVersion; pEmail=pEmail->Next; ++uiNumOfEmails; } return( TRUE ); }