#ifndef __EMAIL_H #define __EMAIL_H #include "types.h" // defines #define MAX_EMAIL_LINES 10 //max number of lines can be shown in a message #define MAX_MESSAGES_PAGE 18 // max number of messages per page #define IMP_EMAIL_INTRO 0 #define IMP_EMAIL_INTRO_LENGTH 10 #define ENRICO_CONGRATS (IMP_EMAIL_INTRO + IMP_EMAIL_INTRO_LENGTH) #define ENRICO_CONGRATS_LENGTH 3 #define IMP_EMAIL_AGAIN (ENRICO_CONGRATS + ENRICO_CONGRATS_LENGTH) #define IMP_EMAIL_AGAIN_LENGTH 6 #define MERC_INTRO (IMP_EMAIL_AGAIN + IMP_EMAIL_AGAIN_LENGTH) #define MERC_INTRO_LENGTH 5 #define MERC_NEW_SITE_ADDRESS ( MERC_INTRO + MERC_INTRO_LENGTH ) #define MERC_NEW_SITE_ADDRESS_LENGTH 2 #define AIM_MEDICAL_DEPOSIT_REFUND ( MERC_NEW_SITE_ADDRESS + MERC_NEW_SITE_ADDRESS_LENGTH ) #define AIM_MEDICAL_DEPOSIT_REFUND_LENGTH 3 #define IMP_EMAIL_PROFILE_RESULTS ( AIM_MEDICAL_DEPOSIT_REFUND + AIM_MEDICAL_DEPOSIT_REFUND_LENGTH ) #define IMP_EMAIL_PROFILE_RESULTS_LENGTH 1 #define MERC_WARNING ( IMP_EMAIL_PROFILE_RESULTS_LENGTH + IMP_EMAIL_PROFILE_RESULTS ) #define MERC_WARNING_LENGTH 2 #define MERC_INVALID ( MERC_WARNING + MERC_WARNING_LENGTH ) #define MERC_INVALID_LENGTH 2 #define NEW_MERCS_AT_MERC ( MERC_INVALID + MERC_INVALID_LENGTH ) #define NEW_MERCS_AT_MERC_LENGTH 2 #define MERC_FIRST_WARNING ( NEW_MERCS_AT_MERC + NEW_MERCS_AT_MERC_LENGTH ) #define MERC_FIRST_WARNING_LENGTH 2 // merc up a level emails #define MERC_UP_LEVEL_BIFF ( MERC_FIRST_WARNING + MERC_FIRST_WARNING_LENGTH ) #define MERC_UP_LEVEL_LENGTH_BIFF 2 #define MERC_UP_LEVEL_HAYWIRE ( MERC_UP_LEVEL_LENGTH_BIFF + MERC_UP_LEVEL_BIFF ) #define MERC_UP_LEVEL_LENGTH_HAYWIRE 2 #define MERC_UP_LEVEL_GASKET ( MERC_UP_LEVEL_LENGTH_HAYWIRE + MERC_UP_LEVEL_HAYWIRE ) #define MERC_UP_LEVEL_LENGTH_GASKET 2 #define MERC_UP_LEVEL_RAZOR ( MERC_UP_LEVEL_LENGTH_GASKET + MERC_UP_LEVEL_GASKET ) #define MERC_UP_LEVEL_LENGTH_RAZOR 2 #define MERC_UP_LEVEL_FLO ( MERC_UP_LEVEL_LENGTH_RAZOR + MERC_UP_LEVEL_RAZOR ) #define MERC_UP_LEVEL_LENGTH_FLO 2 #define MERC_UP_LEVEL_GUMPY ( MERC_UP_LEVEL_LENGTH_FLO + MERC_UP_LEVEL_FLO ) #define MERC_UP_LEVEL_LENGTH_GUMPY 2 #define MERC_UP_LEVEL_LARRY ( MERC_UP_LEVEL_LENGTH_GUMPY + MERC_UP_LEVEL_GUMPY ) #define MERC_UP_LEVEL_LENGTH_LARRY 2 #define MERC_UP_LEVEL_COUGAR ( MERC_UP_LEVEL_LENGTH_LARRY + MERC_UP_LEVEL_LARRY ) #define MERC_UP_LEVEL_LENGTH_COUGAR 2 #define MERC_UP_LEVEL_NUMB ( MERC_UP_LEVEL_LENGTH_COUGAR + MERC_UP_LEVEL_COUGAR ) #define MERC_UP_LEVEL_LENGTH_NUMB 2 #define MERC_UP_LEVEL_BUBBA ( MERC_UP_LEVEL_LENGTH_NUMB + MERC_UP_LEVEL_NUMB ) #define MERC_UP_LEVEL_LENGTH_BUBBA 2 // merc left-me-a-message-and-now-I'm-back emails #define AIM_REPLY_BARRY ( MERC_UP_LEVEL_LENGTH_BUBBA + MERC_UP_LEVEL_BUBBA ) #define AIM_REPLY_LENGTH_BARRY 2 #define AIM_REPLY_MELTDOWN (AIM_REPLY_BARRY + ( 39 * AIM_REPLY_LENGTH_BARRY )) #define AIM_REPLY_LENGTH_MELTDOWN AIM_REPLY_LENGTH_BARRY // old EXISTING emails when player starts game. They must look "read" #define OLD_ENRICO_1 ( AIM_REPLY_LENGTH_MELTDOWN + AIM_REPLY_MELTDOWN ) #define OLD_ENRICO_1_LENGTH 3 #define OLD_ENRICO_2 ( OLD_ENRICO_1 + OLD_ENRICO_1_LENGTH ) #define OLD_ENRICO_2_LENGTH 3 #define RIS_REPORT ( OLD_ENRICO_2 + OLD_ENRICO_2_LENGTH ) #define RIS_REPORT_LENGTH 2 #define OLD_ENRICO_3 ( RIS_REPORT + RIS_REPORT_LENGTH ) #define OLD_ENRICO_3_LENGTH 3 // emails that occur from Enrico once player accomplishes things #define ENRICO_MIGUEL ( OLD_ENRICO_3 + OLD_ENRICO_3_LENGTH ) #define ENRICO_MIGUEL_LENGTH 3 #define ENRICO_PROG_20 ( ENRICO_MIGUEL + ENRICO_MIGUEL_LENGTH ) #define ENRICO_PROG_20_LENGTH 3 #define ENRICO_PROG_55 ( ENRICO_PROG_20 + ENRICO_PROG_20_LENGTH ) #define ENRICO_PROG_55_LENGTH 3 #define ENRICO_PROG_80 ( ENRICO_PROG_55 + ENRICO_PROG_55_LENGTH ) #define ENRICO_PROG_80_LENGTH 3 #define ENRICO_SETBACK ( ENRICO_PROG_80 + ENRICO_PROG_80_LENGTH ) #define ENRICO_SETBACK_LENGTH 3 #define ENRICO_SETBACK_2 ( ENRICO_SETBACK + ENRICO_SETBACK_LENGTH ) #define ENRICO_SETBACK_2_LENGTH 3 #define ENRICO_CREATURES ( ENRICO_SETBACK_2 + ENRICO_SETBACK_2_LENGTH ) #define ENRICO_CREATURES_LENGTH 3 // insurance company emails #define INSUR_PAYMENT ( ENRICO_CREATURES + ENRICO_CREATURES_LENGTH ) #define INSUR_PAYMENT_LENGTH 3 #define INSUR_SUSPIC ( INSUR_PAYMENT + INSUR_PAYMENT_LENGTH ) #define INSUR_SUSPIC_LENGTH 3 #define INSUR_INVEST_OVER ( INSUR_SUSPIC + INSUR_SUSPIC_LENGTH ) #define INSUR_INVEST_OVER_LENGTH 3 #define INSUR_SUSPIC_2 ( INSUR_INVEST_OVER + INSUR_INVEST_OVER_LENGTH ) #define INSUR_SUSPIC_2_LENGTH 3 #define BOBBYR_NOW_OPEN ( INSUR_SUSPIC_2 + INSUR_SUSPIC_2_LENGTH ) #define BOBBYR_NOW_OPEN_LENGTH 3 #define KING_PIN_LETTER ( BOBBYR_NOW_OPEN + BOBBYR_NOW_OPEN_LENGTH ) #define KING_PIN_LETTER_LENGTH 4 #define LACK_PLAYER_PROGRESS_1 ( KING_PIN_LETTER + KING_PIN_LETTER_LENGTH ) #define LACK_PLAYER_PROGRESS_1_LENGTH 3 #define LACK_PLAYER_PROGRESS_2 ( LACK_PLAYER_PROGRESS_1 + LACK_PLAYER_PROGRESS_1_LENGTH ) #define LACK_PLAYER_PROGRESS_2_LENGTH 3 #define LACK_PLAYER_PROGRESS_3 ( LACK_PLAYER_PROGRESS_2 + LACK_PLAYER_PROGRESS_2_LENGTH ) #define LACK_PLAYER_PROGRESS_3_LENGTH 3 //A package from bobby r has arrived in Drassen #define BOBBYR_SHIPMENT_ARRIVED ( LACK_PLAYER_PROGRESS_3 + LACK_PLAYER_PROGRESS_3_LENGTH ) #define BOBBYR_SHIPMENT_ARRIVED_LENGTH 4 // John Kulba has left the gifts for theplayers in drassen #define JOHN_KULBA_GIFT_IN_DRASSEN ( BOBBYR_SHIPMENT_ARRIVED + BOBBYR_SHIPMENT_ARRIVED_LENGTH ) #define JOHN_KULBA_GIFT_IN_DRASSEN_LENGTH 4 //when a merc dies on ANOTHER assignment ( ie not with the player ) #define MERC_DIED_ON_OTHER_ASSIGNMENT ( JOHN_KULBA_GIFT_IN_DRASSEN + JOHN_KULBA_GIFT_IN_DRASSEN_LENGTH ) #define MERC_DIED_ON_OTHER_ASSIGNMENT_LENGTH 5 #define INSUR_1HOUR_FRAUD ( MERC_DIED_ON_OTHER_ASSIGNMENT + MERC_DIED_ON_OTHER_ASSIGNMENT_LENGTH ) #define INSUR_1HOUR_FRAUD_LENGTH 3 //when a merc is fired, and is injured #define AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND ( INSUR_1HOUR_FRAUD + INSUR_1HOUR_FRAUD_LENGTH ) #define AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND_LENGTH 3 //when a merc is fired, and is dead #define AIM_MEDICAL_DEPOSIT_NO_REFUND ( AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND + AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND_LENGTH ) #define AIM_MEDICAL_DEPOSIT_NO_REFUND_LENGTH 3 #define BOBBY_R_MEDUNA_SHIPMENT ( AIM_MEDICAL_DEPOSIT_NO_REFUND + AIM_MEDICAL_DEPOSIT_NO_REFUND_LENGTH ) #define BOBBY_R_MEDUNA_SHIPMENT_LENGTH 4 // WANNE: New 1.13 MERC merc mail text for level up that Speck sends //#define MERC_UP_LEVEL_GASTON (BOBBY_R_MEDUNA_SHIPMENT + BOBBY_R_MEDUNA_SHIPMENT_LENGTH) //#define MERC_UP_LEVEL_GASTON_LENGTH 2 //#define MERC_UP_LEVEL_STOGIE (MERC_UP_LEVEL_GASTON + MERC_UP_LEVEL_GASTON_LENGTH) //#define MERC_UP_LEVEL_STOGIE_LENGTH 2 //#define MERC_UP_LEVEL_TEX (MERC_UP_LEVEL_STOGIE + MERC_UP_LEVEL_STOGIE_LENGTH) //#define MERC_UP_LEVEL_TEX_LENGTH 2 //#define MERC_UP_LEVEL_BIGGENS (MERC_UP_LEVEL_TEX + MERC_UP_LEVEL_TEX_LENGTH) //#define MERC_UP_LEVEL_BIGGENS_LENGTH 2 #define MERC_UP_LEVEL_GASTON 165 #define MERC_UP_LEVEL_STOGIE 166 #define MERC_UP_LEVEL_TEX 167 #define MERC_UP_LEVEL_BIGGENS 168 struct message{ STR16 pString; struct message *Next; struct message *Prev; }; typedef struct message EmailMessage; typedef EmailMessage *MessagePtr; struct email { STR16 pSubject; UINT16 usOffset; UINT16 usLength; UINT8 ubSender; UINT32 iDate; INT32 iId; INT32 iFirstData; UINT32 uiSecondData; BOOLEAN fRead; BOOLEAN fNew; INT32 iThirdData; INT32 iFourthData; UINT32 uiFifthData; UINT32 uiSixData; // WANNE: A reference to the IMP position in the gMercProfiles array. // So we know which analyse email belongs to the imp INT32 iCurrentIMPPosition; struct email *Next; struct email *Prev; }; typedef struct email Email; typedef Email *EmailPtr; // This used when saving the emails to disk. typedef struct { UINT16 usOffset; UINT16 usLength; UINT8 ubSender; UINT32 iDate; INT32 iId; INT32 iFirstData; UINT32 uiSecondData; INT32 iThirdData; INT32 iFourthData; UINT32 uiFifthData; UINT32 uiSixData; BOOLEAN fRead; BOOLEAN fNew; INT32 iCurrentIMPPosition; } SavedEmailStruct; struct pagemessages{ INT32 iIds[MAX_MESSAGES_PAGE]; INT32 iPageId; struct pagemessages *Next; struct pagemessages *Prev; }; typedef struct pagemessages Page; typedef Page *PagePtr; struct messagerecord{ // CHAR16 pRecord[ 320 ]; CHAR16 pRecord[ 640 ]; struct messagerecord *Next; }; typedef struct messagerecord Record; typedef Record *RecordPtr; typedef struct { RecordPtr pFirstRecord; RecordPtr pLastRecord; INT32 iPageNumber; } EmailPageInfoStruct; enum { SENDER=0, RECEIVED, SUBJECT, READ, }; enum { MAIL_ENRICO=0, CHAR_PROFILE_SITE, GAME_HELP, IMP_PROFILE_RESULTS, SPECK_FROM_MERC, RIS_EMAIL, BARRY_MAIL, MELTDOWN_MAIL = BARRY_MAIL+ 39, INSURANCE_COMPANY, BOBBY_R, KING_PIN, JOHN_KULBA, AIM_SITE, }; // the length of the subject in char #define EMAIL_SUBJECT_LENGTH 128 extern BOOLEAN fUnReadMailFlag; extern BOOLEAN fNewMailFlag; extern BOOLEAN fOldUnreadFlag; extern BOOLEAN fOldNewMailFlag; extern BOOLEAN fDeleteMailFlag; extern BOOLEAN fDisplayMessageFlag; extern BOOLEAN fReDrawNewMailFlag; extern BOOLEAN fOpenMostRecentUnReadFlag; extern EmailPtr pEmailList; extern UINT32 guiEmailWarning; void GameInitEmail(); BOOLEAN EnterEmail(); void ExitEmail(); void HandleEmail(); void RenderEmail(); #define CHECK_X iScreenWidthOffset + 15 #define CHECK_Y iScreenHeightOffset + 13 #define VIEWER_X iScreenWidthOffset + 155 #define VIEWER_Y iScreenHeightOffset + 70 + 21 #define MAIL_STRING_SIZE 640 // message manipulation void AddEmailMessage(INT32 iMessageOffset, INT32 iMessageLength,STR16 pSubject, INT32 iDate, UINT8 ubSender, BOOLEAN fAlreadyRead, INT32 uiFirstData, UINT32 uiSecondData, INT32 iCurrentIMPPosition ); void RemoveEmailMessage(INT32 iId); EmailPtr GetEmailMessage(INT32 iId); void LookForUnread(); void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition); // WANNE: For the new WF merc void AddEmailWFMercLevelUp(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition); void AddPreReadEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate); BOOLEAN DisplayNewMailBox(); void CreateDestroyNewMailButton(); void CreateDestroyDeleteNoticeMailButton(); void AddDeleteRegionsToMessageRegion(INT32 iViewerY); void DisplayEmailHeaders( void ); void ReDrawNewMailBox( void ); void ReDisplayBoxes( void ); void ShutDownEmailList(); void AddMessageToPages(INT32 iMessageId); void AddEmailWithSpecialData(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iFirstData, UINT32 uiSecondData ); #ifdef JA2BETAVERSION void AddAllEmails(); #endif #endif