From aba3688b4b9832c2b44bbc00ceb74d245d823b0a Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Tue, 30 Dec 2025 18:08:36 +0200 Subject: [PATCH 01/18] Add framework for adding externalized emails Emails from new GameDir file TableData/Email/Emails.xml can be added via lua scripting using calls to AddEmailFromXML & AddPreReadEmailFromXML. The order of emails in Emails.xml acts as the index to be referenced and provided when calling lua functions. An error message will be displayed if an email is added with an out-of-scope index but game will be able to continue. Localization is supported and was tested on Chinese localization. --- Ja2/Init.cpp | 83 +++++--- Laptop/XML_Email.cpp | 401 +++++++++++++++----------------------- Laptop/email.cpp | 156 ++++++++++----- Laptop/email.h | 9 + Strategic/LuaInitNPCs.cpp | 39 ++++ Tactical/XML.h | 3 +- 6 files changed, 363 insertions(+), 328 deletions(-) diff --git a/Ja2/Init.cpp b/Ja2/Init.cpp index 5b5c27ede..59d9a569a 100644 --- a/Ja2/Init.cpp +++ b/Ja2/Init.cpp @@ -1184,40 +1184,61 @@ if( g_lang != i18n::Lang::en ) { } } -if ( ReadXMLEmail == TRUE ) -{ + if ( ReadXMLEmail == TRUE ) + { + // Externalized emails + strcpy(fileName, directoryName); + strcat(fileName, EMAILSFILENAME); + // Only load external emails if we find the file + if ( FileExists(fileName) ) + { + DebugMsg(TOPIC_JA2, DBG_LEVEL_3, String("LoadExternalGameplayData, fileName = %s", fileName)); + SGP_THROW_IFFALSE(ReadInExternalizedEmails(fileName, FALSE), EMAILSFILENAME); + + if ( g_lang != i18n::Lang::en ) + { + AddLanguagePrefix(fileName); + if ( FileExists(fileName) ) + { + DebugMsg(TOPIC_JA2, DBG_LEVEL_3, String("LoadExternalGameplayData, fileName = %s", fileName)); + if ( !ReadInExternalizedEmails(fileName, TRUE) ) + return FALSE; + } + } + } + // EMAIL MERC AVAILABLE by Jazz strcpy(fileName, directoryName); strcat(fileName, EMAILMERCAVAILABLE); - DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LoadExternalGameplayData, fileName = %s", fileName)); - SGP_THROW_IFFALSE(ReadInEmailMercAvailable(fileName,FALSE), EMAILMERCAVAILABLE); + DebugMsg(TOPIC_JA2, DBG_LEVEL_3, String("LoadExternalGameplayData, fileName = %s", fileName)); + SGP_THROW_IFFALSE(ReadInEmailMercAvailable(fileName, FALSE), EMAILMERCAVAILABLE); -if( g_lang != i18n::Lang::en ) { - AddLanguagePrefix(fileName); - if ( FileExists(fileName) ) + if ( g_lang != i18n::Lang::en ) { - DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LoadExternalGameplayData, fileName = %s", fileName)); - if(!ReadInEmailMercAvailable(fileName,TRUE)) - return FALSE; + AddLanguagePrefix(fileName); + if ( FileExists(fileName) ) + { + DebugMsg(TOPIC_JA2, DBG_LEVEL_3, String("LoadExternalGameplayData, fileName = %s", fileName)); + if ( !ReadInEmailMercAvailable(fileName, TRUE) ) + return FALSE; + } } -} // EMAIL MERC LEVEL UP by Jazz strcpy(fileName, directoryName); strcat(fileName, EMAILMERCLEVELUP); - DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LoadExternalGameplayData, fileName = %s", fileName)); - SGP_THROW_IFFALSE(ReadInEmailMercLevelUp(fileName,FALSE), EMAILMERCLEVELUP); + DebugMsg(TOPIC_JA2, DBG_LEVEL_3, String("LoadExternalGameplayData, fileName = %s", fileName)); + SGP_THROW_IFFALSE(ReadInEmailMercLevelUp(fileName, FALSE), EMAILMERCLEVELUP); -if( g_lang != i18n::Lang::en ) { - AddLanguagePrefix(fileName); - if ( FileExists(fileName) ) - { - DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LoadExternalGameplayData, fileName = %s", fileName)); - if(!ReadInEmailMercLevelUp(fileName,TRUE)) - return FALSE; + if ( g_lang != i18n::Lang::en ) { + AddLanguagePrefix(fileName); + if ( FileExists(fileName) ) + { + DebugMsg(TOPIC_JA2, DBG_LEVEL_3, String("LoadExternalGameplayData, fileName = %s", fileName)); + if ( !ReadInEmailMercLevelUp(fileName, TRUE) ) + return FALSE; + } } -} -} /* // EMAIL OTHER by Jazz strcpy(fileName, directoryName); @@ -1225,16 +1246,18 @@ if( g_lang != i18n::Lang::en ) { DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LoadExternalGameplayData, fileName = %s", fileName)); SGP_THROW_IFFALSE(ReadInEmailOther(fileName,FALSE), EMAILOTHER); -if( g_lang != i18n::Lang::en ) { - AddLanguagePrefix(fileName); - if ( FileExists(fileName) ) - { - DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LoadExternalGameplayData, fileName = %s", fileName)); - if(!ReadInEmailOther(fileName,TRUE)) - return FALSE; + if( g_lang != i18n::Lang::en ) { + AddLanguagePrefix(fileName); + if ( FileExists(fileName) ) + { + DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LoadExternalGameplayData, fileName = %s", fileName)); + if(!ReadInEmailOther(fileName,TRUE)) + return FALSE; + } } -} */ + } + //new vehicles by Jazz InitNewVehicles (); diff --git a/Laptop/XML_Email.cpp b/Laptop/XML_Email.cpp index ba0cd80f5..76a4cf8ff 100644 --- a/Laptop/XML_Email.cpp +++ b/Laptop/XML_Email.cpp @@ -1,295 +1,204 @@ - #include "sgp.h" - #include "Debug Control.h" - #include "expat.h" - #include "XML.h" - #include "Interface.h" - #include "LuaInitNPCs.h" - #include "email.h" +#include "sgp.h" +#include "Debug Control.h" +#include "expat.h" +#include "XML.h" +#include "Interface.h" +#include "LuaInitNPCs.h" +#include "email.h" struct { - PARSE_STAGE curElement; + PARSE_STAGE curElement; - CHAR8 szCharData[MAIL_STRING_SIZE+1]; - EMAIL_OTHER_VALUES curEmailOther; + CHAR8 szCharData[MAIL_STRING_SIZE + 1]; + CHAR16 currentMessage[MAIL_STRING_SIZE]; + UINT16 currentEmailIndex; + UINT16 currentMessageIndex; - UINT32 maxArraySize; - UINT32 curIndex; - UINT32 currentDepth; - UINT32 maxReadDepth; -} + UINT32 maxArraySize; + UINT32 curIndex; + UINT32 currentDepth; + UINT32 maxReadDepth; +} typedef EmailXMLParseData; -typedef EmailOtherParseData; - -BOOLEAN EmailOther_TextOnly; +BOOLEAN Emails_TextOnly; static void XMLCALL -EmailOtherStartElementHandle(void *userData, const XML_Char *name, const XML_Char **atts) +EmailOtherStartElementHandle(void* userData, const XML_Char* name, const XML_Char** atts) { - EmailOtherParseData * pData = (EmailOtherParseData *)userData; + EmailXMLParseData* pData = (EmailXMLParseData*)userData; - if(pData->currentDepth <= pData->maxReadDepth) //are we reading this element? - { - if(strcmp(name, "NEW_EMAIL") == 0 && pData->curElement == ELEMENT_NONE) - { - pData->curElement = ELEMENT_LIST; + if (pData->currentDepth <= pData->maxReadDepth) //are we reading this element? + { + if (strcmp(name, "EMAILS") == 0 && pData->curElement == ELEMENT_NONE) + { + pData->curElement = ELEMENT_LIST; - pData->maxReadDepth++; //we are not skipping this element - } - else if(strcmp(name, "EMAIL") == 0 && pData->curElement == ELEMENT_LIST) - { - pData->curElement = ELEMENT; + pData->maxReadDepth++; //we are not skipping this element + } + else if (strcmp(name, "EMAIL") == 0 && pData->curElement == ELEMENT_LIST) + { + pData->curElement = ELEMENT; - pData->maxReadDepth++; //we are not skipping this element - } - else if(pData->curElement == ELEMENT && - (strcmp(name, "uiIndex") == 0 || - strcmp(name, "Subject") == 0 || - strcmp(name, "Message0") == 0 || - strcmp(name, "Message1") == 0 || - strcmp(name, "Message2") == 0 || - strcmp(name, "Message3") == 0 || - strcmp(name, "Message4") == 0 || - strcmp(name, "Message5") == 0 || - strcmp(name, "Message6") == 0 || - strcmp(name, "Message7") == 0 || - strcmp(name, "Message8") == 0 || - strcmp(name, "Message9") == 0 || - strcmp(name, "Message10") == 0 || - strcmp(name, "Message11") == 0 || - strcmp(name, "Message12") == 0 || - strcmp(name, "Message13") == 0 || - strcmp(name, "Message14") == 0 || - strcmp(name, "Message15") == 0 || - strcmp(name, "Message16") == 0 || - strcmp(name, "Message17") == 0 || - strcmp(name, "Message18") == 0 || - strcmp(name, "Message19") == 0 || - strcmp(name, "Message20") == 0 || - strcmp(name, "Message21") == 0 || - strcmp(name, "Message22") == 0 || - strcmp(name, "Message23") == 0 || - strcmp(name, "Message24") == 0 || - strcmp(name, "Message25") == 0 || - strcmp(name, "Message26") == 0 || - strcmp(name, "Message27") == 0 || - strcmp(name, "Message28") == 0 || - strcmp(name, "Message29") == 0 )) - { - pData->curElement = ELEMENT_PROPERTY; + pData->maxReadDepth++; //we are not skipping this element + } + else if (pData->curElement == ELEMENT && + (strcmp(name, "Index") == 0 || + strcmp(name, "Sender") == 0 || + strcmp(name, "Subject") == 0 || + strcmp(name, "Message") == 0)) + { + pData->curElement = ELEMENT_PROPERTY; - pData->maxReadDepth++; //we are not skipping this element - } + pData->maxReadDepth++; //we are not skipping this element + } - pData->szCharData[0] = '\0'; - } + pData->szCharData[0] = '\0'; + } - pData->currentDepth++; + pData->currentDepth++; } static void XMLCALL -EmailOtherCharacterDataHandle(void *userData, const XML_Char *str, int len) +EmailOtherCharacterDataHandle(void* userData, const XML_Char* str, int len) { - EmailOtherParseData * pData = (EmailOtherParseData *)userData; + EmailXMLParseData* pData = (EmailXMLParseData*)userData; - if( (pData->currentDepth <= pData->maxReadDepth) && - (strlen(pData->szCharData) < MAX_CHAR_DATA_LENGTH) - ){ - strncat(pData->szCharData,str,__min((unsigned int)len,MAX_CHAR_DATA_LENGTH-strlen(pData->szCharData))); - } + if ((pData->currentDepth <= pData->maxReadDepth) && + (strlen(pData->szCharData) < MAX_CHAR_DATA_LENGTH) + ) { + strncat(pData->szCharData, str, __min((unsigned int)len, MAX_CHAR_DATA_LENGTH - strlen(pData->szCharData))); + } } static void XMLCALL -EmailOtherEndElementHandle(void *userData, const XML_Char *name) +EmailOtherEndElementHandle(void* userData, const XML_Char* name) { - EmailOtherParseData * pData = (EmailOtherParseData *)userData; + EmailXMLParseData* pData = (EmailXMLParseData*)userData; - if(pData->currentDepth <= pData->maxReadDepth) - { - if(strcmp(name, "NEW_EMAIL") == 0) - { - pData->curElement = ELEMENT_NONE; - } - else if(strcmp(name, "EMAIL") == 0) - { - pData->curElement = ELEMENT_LIST; - - if (!EmailOther_TextOnly) - { - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szSubject, pData->curEmailOther.szSubject); - // L"12345678901234567890123456789" <- max lenght (szMessage[30]) - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[0], L"1. sdssdsfs dfg fdgd fg test" ); //pData-curEmailOther.szMessage[0]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[1], L"2. sdssdsfs dfg fgfgffds test" ); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[2], L"3. sdssdsfsd gdfg fdfgsf test" ); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[3], L"4. sdssdsf dgdfg dgsfdsf test" ); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[4], L"5. sdssdsfdgdfg dgfddsf test" ); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[5], L"6. sdssdsfsffdsf test" ); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[6], L"7. sdssdsfsffdsf test" ); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[7], L"8. sdssdsfsfdgdgfgfdsf test" ); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[8], L"9. sdssdsfsff dg gdg dsf test" ); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[9], L"10. sdssdsfsfgdsgdfgfdsf test" ); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[10], L"11. sdssdsfsff dgfgd dsf test" ); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[11], L"12. sdssdsfsf dfgdfg dsf test" ); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[12], L"13. sdssdsfsf dfgg gfdsf test" ); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[13], L"14. sdssdsf dgdf gsffdsf test" ); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[14], L"15. sdssdsf dgdf f ffdsf test" ); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[15], L"16. sdssdsfs dgdf gffdsf test" ); + if (pData->currentDepth <= pData->maxReadDepth) + { + if (strcmp(name, "EMAILS") == 0) + { + pData->curElement = ELEMENT_NONE; + } + else if (strcmp(name, "EMAIL") == 0) + { + pData->curElement = ELEMENT_LIST; + if ( Emails_TextOnly ) + { + pData->currentEmailIndex += 1; + pData->currentMessageIndex = 0; + } + } + else if (strcmp(name, "Sender") == 0) + { + pData->curElement = ELEMENT; + if ( !Emails_TextOnly ) + { + gEmails.push_back(EMAIL_XML {}); + gEmails.back().Sender = atol(pData->szCharData); + } + } + else if (strcmp(name, "Subject") == 0) + { + pData->curElement = ELEMENT; + if ( !Emails_TextOnly ) + { + MultiByteToWideChar(CP_UTF8, 0, pData->szCharData, -1, gEmails.back().Subject, sizeof(gEmails.back().Subject) / sizeof(gEmails.back().Subject[0])); + } + else + { + // Replace existing text with localized version + const auto i = pData->currentEmailIndex; + MultiByteToWideChar(CP_UTF8, 0, pData->szCharData, -1, gEmails[i].Subject, sizeof(gEmails[i].Subject) / sizeof(gEmails[i].Subject[0])); + } + } + else if (strcmp(name, "Message") == 0) + { + pData->curElement = ELEMENT; + MultiByteToWideChar(CP_UTF8, 0, pData->szCharData, -1, pData->currentMessage, sizeof(pData->currentMessage) / sizeof(pData->currentMessage[0])); - /* - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[1], pData->curEmailOther.szMessage[1]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[2], pData->curEmailOther.szMessage[2]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[3], pData->curEmailOther.szMessage[3]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[4], pData->curEmailOther.szMessage[4]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[5], pData->curEmailOther.szMessage[5]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[6], pData->curEmailOther.szMessage[6]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[7], pData->curEmailOther.szMessage[7]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[8], pData->curEmailOther.szMessage[8]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[9], pData->curEmailOther.szMessage[9]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[10], pData->curEmailOther.szMessage[10]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[11], pData->curEmailOther.szMessage[11]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[12], pData->curEmailOther.szMessage[12]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[13], pData->curEmailOther.szMessage[13]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[14], pData->curEmailOther.szMessage[14]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[15], pData->curEmailOther.szMessage[15]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[16], pData->curEmailOther.szMessage[16]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[17], pData->curEmailOther.szMessage[17]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[18], pData->curEmailOther.szMessage[18]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[19], pData->curEmailOther.szMessage[19]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[20], pData->curEmailOther.szMessage[20]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[21], pData->curEmailOther.szMessage[21]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[22], pData->curEmailOther.szMessage[22]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[23], pData->curEmailOther.szMessage[23]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[24], pData->curEmailOther.szMessage[24]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[25], pData->curEmailOther.szMessage[25]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[26], pData->curEmailOther.szMessage[26]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[27], pData->curEmailOther.szMessage[27]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[28], pData->curEmailOther.szMessage[28]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[29], pData->curEmailOther.szMessage[29]); - */ - } - else - { - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szSubject, pData->curEmailOther.szSubject); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[0], L"sdssdsfsffdsf test" ); //pData->curEmailOther.szMessage[0]); - /* - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[1], pData->curEmailOther.szMessage[1]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[2], pData->curEmailOther.szMessage[2]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[3], pData->curEmailOther.szMessage[3]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[4], pData->curEmailOther.szMessage[4]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[5], pData->curEmailOther.szMessage[5]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[6], pData->curEmailOther.szMessage[6]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[7], pData->curEmailOther.szMessage[7]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[8], pData->curEmailOther.szMessage[8]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[9], pData->curEmailOther.szMessage[9]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[10], pData->curEmailOther.szMessage[10]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[11], pData->curEmailOther.szMessage[11]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[12], pData->curEmailOther.szMessage[12]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[13], pData->curEmailOther.szMessage[13]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[14], pData->curEmailOther.szMessage[14]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[15], pData->curEmailOther.szMessage[15]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[16], pData->curEmailOther.szMessage[16]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[17], pData->curEmailOther.szMessage[17]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[18], pData->curEmailOther.szMessage[18]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[19], pData->curEmailOther.szMessage[19]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[20], pData->curEmailOther.szMessage[20]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[21], pData->curEmailOther.szMessage[21]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[22], pData->curEmailOther.szMessage[22]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[23], pData->curEmailOther.szMessage[23]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[24], pData->curEmailOther.szMessage[24]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[25], pData->curEmailOther.szMessage[25]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[26], pData->curEmailOther.szMessage[26]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[27], pData->curEmailOther.szMessage[27]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[28], pData->curEmailOther.szMessage[28]); - wcscpy(EmailOtherText[pData->curEmailOther.uiIndex].szMessage[29], pData->curEmailOther.szMessage[29]); - */ - } - } - else if(strcmp(name, "uiIndex") == 0) - { - pData->curElement = ELEMENT; - pData->curEmailOther.uiIndex = (UINT8) atol(pData->szCharData); - } - else if(strcmp(name, "Subject") == 0 ) - { - pData->curElement = ELEMENT; + if ( !Emails_TextOnly ) + { + gEmails.back().Messages.emplace_back(pData->currentMessage); + } + else + { + // Replace existing text with localized version + const auto i = pData->currentEmailIndex; + const auto j = pData->currentMessageIndex; + gEmails[i].Messages[j] = pData->currentMessage; - MultiByteToWideChar( CP_UTF8, 0, pData->szCharData, -1, pData->curEmailOther.szSubject, sizeof(pData->curEmailOther.szSubject)/sizeof(pData->curEmailOther.szSubject[0]) ); - pData->curEmailOther.szSubject[sizeof(pData->curEmailOther.szSubject)/sizeof(pData->curEmailOther.szSubject[0]) - 1] = '\0'; - } - /* - else if(strcmp(name, "Message0") == 0 ) - { - pData->curElement = ELEMENT; + pData->currentMessageIndex++; + } + } - MultiByteToWideChar( CP_UTF8, 0, pData->szCharData, -1, pData->curEmailOther.szMessage[0], sizeof(pData->curEmailOther.szMessage[0])/sizeof(pData->curEmailOther.szMessage[0]) ); - pData->curEmailOther.szMessage[sizeof(pData->curEmailOther.szMessage[0])/sizeof(pData->curEmailOther.szMessage[0]) - 1][0] = '\0'; - } - */ - pData->maxReadDepth--; - } - pData->currentDepth--; + pData->maxReadDepth--; + } + pData->currentDepth--; } -BOOLEAN ReadInEmailOther(STR fileName, BOOLEAN localizedVersion) +BOOLEAN ReadInExternalizedEmails(STR fileName, BOOLEAN localizedVersion) { - HWFILE hFile; - UINT32 uiBytesRead; - UINT32 uiFSize; - CHAR8 * lpcBuffer; - XML_Parser parser = XML_ParserCreate(NULL); + HWFILE hFile; + UINT32 uiBytesRead; + UINT32 uiFSize; + CHAR8* lpcBuffer; + XML_Parser parser = XML_ParserCreate(NULL); - EmailOtherParseData pData; + EmailXMLParseData pData; - DebugMsg(TOPIC_JA2, DBG_LEVEL_3, "Loading EmailOther.xml" ); + DebugMsg(TOPIC_JA2, DBG_LEVEL_3, "Loading Emails.xml"); - EmailOther_TextOnly = localizedVersion; - - // Open file - hFile = FileOpen( fileName, FILE_ACCESS_READ, FALSE ); - if ( !hFile ) - return( localizedVersion ); + Emails_TextOnly = localizedVersion; - uiFSize = FileGetSize(hFile); - lpcBuffer = (CHAR8 *) MemAlloc(uiFSize+1); + // Open file + hFile = FileOpen(fileName, FILE_ACCESS_READ, FALSE); + if (!hFile) + return(localizedVersion); - //Read in block - if ( !FileRead( hFile, lpcBuffer, uiFSize, &uiBytesRead ) ) - { - MemFree(lpcBuffer); - return( FALSE ); - } + uiFSize = FileGetSize(hFile); + lpcBuffer = (CHAR8*)MemAlloc(uiFSize + 1); - lpcBuffer[uiFSize] = 0; //add a null terminator + //Read in block + if (!FileRead(hFile, lpcBuffer, uiFSize, &uiBytesRead)) + { + MemFree(lpcBuffer); + return(FALSE); + } - FileClose( hFile ); + lpcBuffer[uiFSize] = 0; //add a null terminator + + FileClose(hFile); - XML_SetElementHandler(parser, EmailOtherStartElementHandle, EmailOtherEndElementHandle); - XML_SetCharacterDataHandler(parser, EmailOtherCharacterDataHandle); + XML_SetElementHandler(parser, EmailOtherStartElementHandle, EmailOtherEndElementHandle); + XML_SetCharacterDataHandler(parser, EmailOtherCharacterDataHandle); - memset(&pData,0,sizeof(pData)); - XML_SetUserData(parser, &pData); + memset(&pData, 0, sizeof(pData)); + XML_SetUserData(parser, &pData); + + gEmails.reserve(50); + if (!XML_Parse(parser, lpcBuffer, uiFSize, TRUE)) + { + CHAR8 errorBuf[511]; + + sprintf(errorBuf, "XML Parser Error in Emails.xml: %s at line %d", XML_ErrorString(XML_GetErrorCode(parser)), XML_GetCurrentLineNumber(parser)); + LiveMessage(errorBuf); + + MemFree(lpcBuffer); + return FALSE; + } + + MemFree(lpcBuffer); - if(!XML_Parse(parser, lpcBuffer, uiFSize, TRUE)) - { - CHAR8 errorBuf[511]; - - sprintf(errorBuf, "XML Parser Error in EmailOther.xml: %s at line %d", XML_ErrorString(XML_GetErrorCode(parser)), XML_GetCurrentLineNumber(parser)); - LiveMessage(errorBuf); - - MemFree(lpcBuffer); - return FALSE; - } - - MemFree(lpcBuffer); + XML_ParserFree(parser); - XML_ParserFree(parser); - - - return( TRUE ); + return(TRUE); } diff --git a/Laptop/email.cpp b/Laptop/email.cpp index 723b464b1..6974d3c5f 100644 --- a/Laptop/email.cpp +++ b/Laptop/email.cpp @@ -22,6 +22,7 @@ #include #include "soldier profile type.h" #include "strategicmap.h" +#include "message.h" #ifdef JA2UB #include "Ja25_Tactical.h" @@ -261,6 +262,7 @@ EMAIL_OTHER_VALUES EmailOtherText[EMAIL_INDEX]; EMAIL_MERC_INSURANCE_VALUES EmailInsuranceText[NUM_PROFILES]; 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 ); @@ -839,6 +841,18 @@ void AddEmailTypeXML( INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender } } +static void AddEmailFromXML(INT32 iMessageOffset, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, BOOLEAN alreadyRead) +{ + if ( iMessageOffset < gEmails.size() ) + { + auto& email = gEmails[iMessageOffset]; + AddEmailMessage(iMessageOffset, email.Messages.size(), email.Subject, iDate, email.Sender, alreadyRead, 0, 0, iCurrentIMPPosition, iCurrentShipmentDestinationID, TYPE_EMAIL_XML, TYPE_E_NONE); + } + 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 ) { @@ -902,36 +916,51 @@ void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 //MessagePtr pMessageList; //MessagePtr pMessage; //CHAR16 pMessageString[320]; + #ifdef JA2UB + if ( EmailType == TYPE_EMAIL_XML ) + { + AddEmailFromXML(iMessageOffset, iDate, iCurrentIMPPosition, iCurrentShipmentDestinationID, false); + } + else + { + if ( EmailType == TYPE_EMAIL_EMAIL_EDT ) + { + if ( FileExists(EMAIL_EDT_FILE_JA25) ) + LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, pSubject, 640 * (iMessageOffset), 640); + else + LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, 640 * (iMessageOffset), 640); + } + 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, 640 * (iMessageOffset), 640); + } + 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, iCurrentIMPPosition, iCurrentShipmentDestinationID, EmailType, TYPE_E_NONE); + } - if ( EmailType == TYPE_EMAIL_EMAIL_EDT ) - { - if (FileExists(EMAIL_EDT_FILE_JA25)) - LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, pSubject, 640*(iMessageOffset), 640); - else - LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, 640*(iMessageOffset), 640); - } - 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, 640*(iMessageOffset), 640); - } - else if ( EmailType == TYPE_EMAIL_BOBBY_R ) - { - /* if (EmailBobbyRText[0] !='\0') - wcscpy( pSubject, EmailBobbyRText[0] ); - else - wcscpy( pSubject, L"None" ); - */ - } - #else - // WANNE: Short work in both ways - LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, 640*(iMessageOffset), 640); -#endif - // add message to list - AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, iCurrentIMPPosition, iCurrentShipmentDestinationID, EmailType, TYPE_E_NONE); - // if we are in fact int he laptop, redraw icons, might be change in mail status + if ( EmailType == TYPE_EMAIL_XML ) + { + AddEmailFromXML(iMessageOffset, iDate, iCurrentIMPPosition, iCurrentShipmentDestinationID, false); + } + else + { + // WANNE: Short work in both ways + LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, 640 * (iMessageOffset), 640); + // add message to list + AddEmailMessage(iMessageOffset, iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, iCurrentIMPPosition, iCurrentShipmentDestinationID, EmailType, TYPE_E_NONE); + } +#endif if( fCurrentlyInLaptop == TRUE ) { @@ -950,31 +979,49 @@ void AddPreReadEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, //CHAR16 pMessageString[320]; #ifdef JA2UB - if ( EmailType == TYPE_EMAIL_EMAIL_EDT ) + if ( EmailType == TYPE_EMAIL_XML ) { - if (FileExists(EMAIL_EDT_FILE_JA25) ) - LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, pSubject, 640*(iMessageOffset), 640); - else - LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, 640*(iMessageOffset), 640); + AddEmailFromXML(iMessageOffset, iDate, -1, -1, true); } - 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 ) + else { - LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, 640*(iMessageOffset), 640); + if ( EmailType == TYPE_EMAIL_EMAIL_EDT ) + { + if ( FileExists(EMAIL_EDT_FILE_JA25) ) + LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, pSubject, 640 * (iMessageOffset), 640); + else + LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, 640 * (iMessageOffset), 640); + } + 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, 640 * (iMessageOffset), 640); + } + + // add message to list + AddEmailMessage(iMessageOffset, iMessageLength, pSubject, iDate, ubSender, TRUE, 0, 0, -1, -1, EmailType, TYPE_E_NONE); + } + +#else + + if ( EmailType == TYPE_EMAIL_XML ) + { + AddEmailFromXML(iMessageOffset, iDate, -1, -1, true); + } + else + { + // starts at iSubjectOffset amd goes iSubjectLength, reading in string + LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, 640 * (iMessageOffset), 640); + // add message to list + AddEmailMessage( iMessageOffset,iMessageLength, pSubject, iDate, ubSender, TRUE, 0, 0, -1, -1 , EmailType, TYPE_E_NONE ); } -#else - // starts at iSubjectOffset amd goes iSubjectLength, reading in string - LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, 640*(iMessageOffset), 640); #endif - // add message to list - AddEmailMessage( iMessageOffset,iMessageLength, pSubject, iDate, ubSender, TRUE, 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 == TRUE ) - { - // redraw icons, might be new mail - DrawLapTopIcons(); - } + // 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; } @@ -1688,7 +1735,7 @@ void DrawSender(INT32 iCounter, UINT8 ubSender, BOOLEAN fRead, UINT8 EmailType) 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_OTHER ) + 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_OTHER || EmailType == TYPE_EMAIL_XML ) { mprintf(SENDER_X,(( UINT16 )( 4 + MIDDLE_Y + iCounter * MIDDLE_WIDTH ) ) ,pSenderNameList[ubSender]); } @@ -1783,7 +1830,9 @@ void DisplayEmailList() 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 || pEmail->EmailVersion == TYPE_EMAIL_OTHER ) 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; @@ -3194,7 +3243,7 @@ void DisplayEmailMessageSubjectDateFromLines( EmailPtr pMail , INT32 iViewerY) 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_OTHER ) + 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_OTHER || pMail->EmailVersion == TYPE_EMAIL_XML) { mprintf( MESSAGE_HEADER_X+MESSAGE_HEADER_WIDTH-13, MESSAGE_FROM_Y + iViewerY, pSenderNameList[pMail->ubSender]); } @@ -5600,6 +5649,11 @@ void PreProcessEmail( EmailPtr pMail ) wcscat( pString, EmailOtherText[iEmailOther].szMessage[pMail->usLength]); // wcscat( pString, EmailOtherText[0].szMessage[1]); } + else if ( pMail->EmailVersion == TYPE_EMAIL_XML ) + { + wcscpy(pString, L"\0"); + wcscat(pString, gEmails[pMail->usOffset].Messages[iCounter].c_str()); + } // ---------------- // New MERC Merc @@ -5773,7 +5827,7 @@ void PreProcessEmail( EmailPtr pMail ) //def removed // pass the subject line - if( pTempRecord && pMail->usOffset != IMP_EMAIL_PROFILE_RESULTS) + if ( pTempRecord && pMail->usOffset != IMP_EMAIL_PROFILE_RESULTS && pMail->EmailVersion != TYPE_EMAIL_XML ) { pTempRecord = pTempRecord->Next; } @@ -5825,7 +5879,7 @@ void PreProcessEmail( EmailPtr pMail ) { fOnLastPageFlag = TRUE; - if( pTempRecord && pMail->usOffset != IMP_EMAIL_PROFILE_RESULTS) + if( pTempRecord && pMail->usOffset != IMP_EMAIL_PROFILE_RESULTS && pMail->EmailVersion != TYPE_EMAIL_XML ) { pTempRecord = pTempRecord->Next; } @@ -5870,7 +5924,7 @@ void PreProcessEmail( EmailPtr pMail ) fOnLastPageFlag = FALSE; pTempList = pMessageRecordList; - if( pTempList && pMail->usOffset != IMP_EMAIL_PROFILE_RESULTS) + if( pTempList && pMail->usOffset != IMP_EMAIL_PROFILE_RESULTS && pMail->EmailVersion != TYPE_EMAIL_XML ) { pTempList = pTempList->Next; } diff --git a/Laptop/email.h b/Laptop/email.h index 683da10d3..1821c26ec 100644 --- a/Laptop/email.h +++ b/Laptop/email.h @@ -594,6 +594,14 @@ void AddCustomEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, void AddAllEmails(); #endif +typedef struct +{ + UINT8 Sender; + CHAR16 Subject[EMAIL_SUBJECT_LENGTH]; + std::vector Messages; +} EMAIL_XML; +extern std::vector gEmails; + typedef struct { UINT8 uiIndex; @@ -674,6 +682,7 @@ enum { TYPE_EMAIL_KING_PIN, TYPE_EMAIL_JOHN_KULBA, TYPE_EMAIL_AIM_SITE, + TYPE_EMAIL_XML, TYPE_EMAIL_OTHER, }; diff --git a/Strategic/LuaInitNPCs.cpp b/Strategic/LuaInitNPCs.cpp index bf7c34d6e..62ea521fc 100644 --- a/Strategic/LuaInitNPCs.cpp +++ b/Strategic/LuaInitNPCs.cpp @@ -408,6 +408,8 @@ static int l_AddEmail(lua_State* L); static int l_AddEmailXML(lua_State* L); static int l_AddEmailXML2(lua_State* L); static int l_AddEmailLevelUpXML(lua_State* L); +static int l_AddEmailFromXML(lua_State* L); +static int l_AddPreReadEmailFromXML(lua_State* L); static int l_EVENT_SoldierGotHit(lua_State* L); static int l_EVENT_InitNewSoldierAnim(lua_State* L); @@ -1030,6 +1032,8 @@ static void IniFunction(lua_State* L, BOOLEAN bQuests) lua_register(L, "AddEmailMercAvailableXML", l_AddEmailXML); lua_register(L, "AddEmailMercLevelUpXML", l_AddEmailLevelUpXML); lua_register(L, "AddEmailXML", l_AddEmailXML2); + lua_register(L, "AddPreReadEmailFromXML", l_AddPreReadEmailFromXML); + lua_register(L, "AddEmailFromXML", l_AddEmailFromXML); //------Time------ @@ -7531,6 +7535,41 @@ static int l_AddPreReadEmail(lua_State* L) return 0; } +// New externalized emails +//AddEmail +static int l_AddEmailFromXML(lua_State* L) +{ + if (lua_gettop(L)) + { + UINT8 index = lua_tointeger(L, 1); + INT32 iCurrentIMPPosition = -1; + INT16 iCurrentShipmentDestinationID = -1; + INT32 unused = 0; + + if ( lua_gettop(L) >= 3 ) + { + iCurrentIMPPosition = lua_tointeger(L, 2); + iCurrentShipmentDestinationID = lua_tointeger(L, 3); + } + AddEmail(index, unused, unused, GetWorldTotalMin(), iCurrentIMPPosition, iCurrentShipmentDestinationID, TYPE_EMAIL_XML); + } + + return 0; +} + +//AddPreReadEmail +static int l_AddPreReadEmailFromXML(lua_State* L) +{ + if (lua_gettop(L)) + { + UINT8 index = lua_tointeger(L, 1); + INT32 unused = 0; + AddPreReadEmail(index, unused, unused, GetWorldTotalMin(), TYPE_EMAIL_XML); + } + + return 0; +} + //gfBoxerFought static int l_SetgfBoxerFought(lua_State* L) { diff --git a/Tactical/XML.h b/Tactical/XML.h index 277a8bd03..e009af15b 100644 --- a/Tactical/XML.h +++ b/Tactical/XML.h @@ -181,6 +181,7 @@ typedef PARSE_STAGE; #define LAPTOPFUNERALLOCATIONFILENAME "Laptop\\FuneralPositions.xml" #define LAPTOPADDITIONALFILESFILENAME "AdditionalFiles.xml" +#define EMAILSFILENAME "Email\\Emails.xml" #define EMAILSENDERNAMELIST "Email\\EmailSenderNameList.xml" #define EMAILMERCAVAILABLE "Email\\EmailMercAvailable.xml" #define EMAILMERCLEVELUP "Email\\EmailMercLevelUp.xml" @@ -558,7 +559,7 @@ extern BOOLEAN WriteInActionItems( STR fileName); extern BOOLEAN ReadInEmailMercAvailable(STR fileName, BOOLEAN localizedVersion); extern BOOLEAN ReadInEmailMercLevelUp(STR fileName, BOOLEAN localizedVersion); -extern BOOLEAN ReadInEmailOther(STR fileName, BOOLEAN localizedVersion); +extern BOOLEAN ReadInExternalizedEmails(STR fileName, BOOLEAN localizedVersion); extern BOOLEAN ReadInBriefingRoom(STR fileName, BOOLEAN localizedVersion, BRIEFINGROOM_M_DATA *Ency, UINT32 FileType2 ); extern BOOLEAN ReadInMinerals(STR fileName, BOOLEAN localizedVersion); From ff3079ff23ce6c28a1737ba8282712464a7dca42 Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Tue, 30 Dec 2025 18:08:51 +0200 Subject: [PATCH 02/18] Formatting --- Laptop/email.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Laptop/email.cpp b/Laptop/email.cpp index 6974d3c5f..dd597fe8d 100644 --- a/Laptop/email.cpp +++ b/Laptop/email.cpp @@ -833,7 +833,7 @@ void AddEmailTypeXML( INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, 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 we are in fact in the laptop, redraw icons, might be change in mail status if( fCurrentlyInLaptop ) { // redraw icons, might be new mail @@ -853,6 +853,8 @@ static void AddEmailFromXML(INT32 iMessageOffset, INT32 iDate, INT32 iCurrentIMP 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 ) { @@ -962,6 +964,7 @@ void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 } #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 From 30070035cc6d4803d229eb2a07bd0df50b65e25c Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Tue, 30 Dec 2025 18:09:20 +0200 Subject: [PATCH 03/18] Correct pSubject size --- Laptop/email.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Laptop/email.cpp b/Laptop/email.cpp index dd597fe8d..727c8e197 100644 --- a/Laptop/email.cpp +++ b/Laptop/email.cpp @@ -913,7 +913,7 @@ void AddEmailWFMercAvailable(INT32 iMessageOffset, INT32 iMessageLength, UINT8 u void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType) { - CHAR16 pSubject[320]; + CHAR16 pSubject[640]; UINT8 subjectLine = 0; //MessagePtr pMessageList; //MessagePtr pMessage; @@ -976,7 +976,7 @@ void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 void AddPreReadEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate , UINT8 EmailType ) { - CHAR16 pSubject[320]; + CHAR16 pSubject[640]; //MessagePtr pMessageList; //MessagePtr pMessage; //CHAR16 pMessageString[320]; From f8b6ee16725dc27d6c3b9dcf3524b04a6a33c81e Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Fri, 2 Jan 2026 22:08:42 +0200 Subject: [PATCH 04/18] Use externalized emails --- Ja2/SaveLoadGame.cpp | 6 +- Laptop/PostalService.cpp | 32 +- Laptop/XML_Email.cpp | 2 +- Laptop/email.cpp | 461 ++++++++++++++------------ Laptop/email.h | 95 +++++- Laptop/insurance Contract.cpp | 65 ++-- Laptop/laptop.cpp | 2 +- Laptop/mercs.cpp | 11 +- Strategic/Game Event Hook.cpp | 21 +- Strategic/LuaInitNPCs.cpp | 47 +-- Strategic/Map Screen Interface.cpp | 2 +- Strategic/Merc Contract.cpp | 19 +- Strategic/Player Command.cpp | 2 +- Strategic/Strategic Event Handler.cpp | 4 +- Strategic/Strategic Status.cpp | 18 +- Tactical/Campaign.cpp | 4 +- Tactical/End Game.cpp | 12 +- Tactical/Merc Hiring.cpp | 13 +- 18 files changed, 476 insertions(+), 340 deletions(-) diff --git a/Ja2/SaveLoadGame.cpp b/Ja2/SaveLoadGame.cpp index b486e84ed..9546b02eb 100644 --- a/Ja2/SaveLoadGame.cpp +++ b/Ja2/SaveLoadGame.cpp @@ -6296,8 +6296,10 @@ BOOLEAN LoadSavedGame( int ubSavedGameID ) #ifdef JA2UB #else - if(!fBookMark && !fEmail) - AddEmail(MERC_INTRO, MERC_INTRO_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin( ), -1, -1 , TYPE_EMAIL_EMAIL_EDT); + if ( !fBookMark && !fEmail ) + { + AddEmail(MERC_INTRO, MERC_INTRO_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_SPECK_INTRO); + } #endif } diff --git a/Laptop/PostalService.cpp b/Laptop/PostalService.cpp index 5081540f4..ff2bdfeb8 100644 --- a/Laptop/PostalService.cpp +++ b/Laptop/PostalService.cpp @@ -565,25 +565,35 @@ BOOLEAN CPostalService::DeliverShipment(UINT16 usShipmentID) StopTimeCompression(); #ifdef JA2UB - -//no UB if ( gGameUBOptions.fBobbyRSite == TRUE ) { // Shipment from Bobby Ray - if (shs.sSenderID == BOBBYR_SENDER_ID) - AddBobbyREmailJA2( 198, 4, BOBBY_R, GetWorldTotalMin(), -1, gusCurShipmentDestinationID, TYPE_EMAIL_BOBBY_R_EMAIL_JA2_EDT); + if ( shs.sSenderID == BOBBYR_SENDER_ID ) + { + if ( gEmails.size() > 0 ) + { + AddEmailFromXML(XML_BR_SHIPMENTARRIVAL, GetWorldTotalMin(), -1, gusCurShipmentDestinationID, false, -1, -1, 198, -1, -1, -1); + } + else + { + AddBobbyREmailJA2(198, 4, BOBBY_R, GetWorldTotalMin(), -1, gusCurShipmentDestinationID, TYPE_EMAIL_BOBBY_R_EMAIL_JA2_EDT); // Shipment from John Kulba //else // AddEmail( JOHN_KULBA_GIFT_IN_DRASSEN, JOHN_KULBA_GIFT_IN_DRASSEN_LENGTH, JOHN_KULBA, GetWorldTotalMin(), -1, gusCurShipmentDestinationID, TYPE_EMAIL_EMAIL_EDT); + } + } } #else - - // Shipment from Bobby Ray - if (shs.sSenderID == BOBBYR_SENDER_ID) - AddEmail( BOBBYR_SHIPMENT_ARRIVED, BOBBYR_SHIPMENT_ARRIVED_LENGTH, BOBBY_R, GetWorldTotalMin(), -1, gusCurShipmentDestinationID, TYPE_EMAIL_EMAIL_EDT); - // Shipment from John Kulba - else - AddEmail( JOHN_KULBA_GIFT_IN_DRASSEN, JOHN_KULBA_GIFT_IN_DRASSEN_LENGTH, JOHN_KULBA, GetWorldTotalMin(), -1, gusCurShipmentDestinationID, TYPE_EMAIL_EMAIL_EDT); + // Shipment from Bobby Ray + if ( shs.sSenderID == BOBBYR_SENDER_ID ) + { + AddEmail(BOBBYR_SHIPMENT_ARRIVED, BOBBYR_SHIPMENT_ARRIVED_LENGTH, BOBBY_R, GetWorldTotalMin(), -1, gusCurShipmentDestinationID, TYPE_EMAIL_EMAIL_EDT, XML_BR_SHIPMENTARRIVAL); + } + // Shipment from John Kulba + else + { + AddEmail(JOHN_KULBA_GIFT_IN_DRASSEN, JOHN_KULBA_GIFT_IN_DRASSEN_LENGTH, JOHN_KULBA, GetWorldTotalMin(), -1, gusCurShipmentDestinationID, TYPE_EMAIL_EMAIL_EDT, XML_JOHNKULBA_SENTGUNS); + } #endif } diff --git a/Laptop/XML_Email.cpp b/Laptop/XML_Email.cpp index 76a4cf8ff..8947fa290 100644 --- a/Laptop/XML_Email.cpp +++ b/Laptop/XML_Email.cpp @@ -182,7 +182,7 @@ BOOLEAN ReadInExternalizedEmails(STR fileName, BOOLEAN localizedVersion) memset(&pData, 0, sizeof(pData)); XML_SetUserData(parser, &pData); - gEmails.reserve(50); + gEmails.reserve(XML_JA2UB_SPECK_DISMISSALREFUND); if (!XML_Parse(parser, lpcBuffer, uiFSize, TRUE)) { CHAR8 errorBuf[511]; diff --git a/Laptop/email.cpp b/Laptop/email.cpp index 727c8e197..8cb24da5b 100644 --- a/Laptop/email.cpp +++ b/Laptop/email.cpp @@ -349,7 +349,7 @@ void OpenMostRecentUnreadEmail( void ); BOOLEAN DisplayNumberOfPagesToThisEmail( INT32 iViewerY ); INT32 GetNumberOfPagesToEmail( ); void PreProcessEmail( EmailPtr pMail ); -void ModifyInsuranceEmails( UINT16 usMessageId, INT32 *iResults, EmailPtr pMail, UINT8 ubNumberOfRecords ); +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; @@ -670,7 +670,7 @@ void AddCustomEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, LoadEncryptedDataFromFile(EMAIL_EDT_CUSTOM_FILE, pSubject, 640*(iMessageOffset), 640); // add message to list - AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, iCurrentIMPPosition, iCurrentShipmentDestinationID, EmailType, TYPE_E_NONE ); + AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, 0, 0, 0, 0, iCurrentIMPPosition, iCurrentShipmentDestinationID, EmailType, TYPE_E_NONE ); // if we are in fact int he laptop, redraw icons, might be change in mail status @@ -683,92 +683,88 @@ void AddCustomEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, //-- -void AddEmailWithSpecialData(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iFirstData, UINT32 uiSecondData, UINT8 EmailType, UINT32 EmailAIM ) +void AddEmailWithSpecialData(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iFirstData, UINT32 uiSecondData, UINT8 EmailType, UINT32 EmailAIM, UINT16 EnumEmailXML) { - CHAR16 pSubject[320]; - //MessagePtr pMessageList; - //MessagePtr pMessage; - //CHAR16 pMessageString[320]; - Email FakeEmail; - - - // starts at iSubjectOffset amd goes iSubjectLength, reading in string + if ( EnumEmailXML != XML_NOEMAIL && gEmails.size() > 0 ) + { + AddEmailWithSpecialDataXML(EnumEmailXML, iDate, -1, -1, false, iFirstData, uiSecondData, iMessageOffset, -1, -1, -1); + } + else + { + CHAR16 pSubject[320]; + 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)) + if ( EmailType == TYPE_EMAIL_EMAIL_EDT ) { - LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, pSubject, 640*(iMessageOffset), 640); + if ( FileExists(EMAIL_EDT_FILE_JA25) ) + { + LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, pSubject, 640 * (iMessageOffset), 640); + } + else + { + LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, 640 * (iMessageOffset), 640); + } } - else + 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, 640*(iMessageOffset), 640); + LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, 640 * (iMessageOffset), 640); } - } - 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, 640*(iMessageOffset), 640); - } #else - LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, 640*(iMessageOffset), 640); + LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, 640 * (iMessageOffset), 640); #endif - //Make a fake email that will contain the codes ( ie the merc ID ) - FakeEmail.iFirstData = iFirstData; - FakeEmail.uiSecondData = uiSecondData; + //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 ); + //Replace the $mercname$ with the actual mercname + ReplaceMercNameAndAmountWithProperData(pSubject, &FakeEmail); - // add message to list - AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, iFirstData, uiSecondData, -1 , -1, EmailType, EmailAIM ); + // 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 int he laptop, redraw icons, might be change in mail status - - if( fCurrentlyInLaptop == TRUE ) - { - // redraw icons, might be new mail - DrawLapTopIcons(); + // 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 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iFirstData, UINT32 uiSecondData, UINT8 EmailType, UINT32 EmailAIM ) +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[320]; - //MessagePtr pMessageList; - //MessagePtr pMessage; - //CHAR16 pMessageString[320]; - Email FakeEmail; - UINT8 subjectLine = 0; + CHAR16 pSubject[640]; + Email FakeEmail; - if ( EmailType == TYPE_EMAIL_INSURANCE_COMPANY ) + if ( iMessageOffset < gEmails.size() ) { - wcscpy( pSubject, EmailInsuranceText[iMessageLength].szSubject ); + 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(); + } } - - // starts at iSubjectOffset amd goes iSubjectLength, reading in string - //LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, 640*(iMessageOffset), 640); - - //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, -1 , -1, EmailType, EmailAIM); - - // if we are in fact int he laptop, redraw icons, might be change in mail status - - if( fCurrentlyInLaptop == TRUE ) + else { - // redraw icons, might be new mail - DrawLapTopIcons(); + 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; @@ -792,7 +788,7 @@ void AddPreReadEmailTypeXML( INT32 iMessageOffset, INT32 iMessageLength, UINT8 u } // add message to list - AddEmailMessage( iMessageOffset,iMessageLength, pSubject, iDate, ubSender, TRUE, 0, 0, -1, -1 , EmailType, TYPE_E_NONE ); + 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 @@ -831,7 +827,7 @@ void AddEmailTypeXML( INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender wcscpy( pSubject, EmailOtherText[ubSender].szSubject ); } - AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, iCurrentIMPPosition, -1, EmailType, TYPE_E_NONE); + 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 ) @@ -841,12 +837,19 @@ void AddEmailTypeXML( INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender } } -static void AddEmailFromXML(INT32 iMessageOffset, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, BOOLEAN alreadyRead) +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, 0, 0, iCurrentIMPPosition, iCurrentShipmentDestinationID, TYPE_EMAIL_XML, TYPE_E_NONE); + 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 { @@ -858,7 +861,7 @@ static void AddEmailFromXML(INT32 iMessageOffset, INT32 iDate, INT32 iCurrentIMP #ifdef JA2UB void AddBobbyREmailJA2(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType ) { - CHAR16 pSubject[320]; + CHAR16 pSubject[640]; UINT8 subjectLine = 0; //MessagePtr pMessageList; //MessagePtr pMessage; @@ -867,7 +870,7 @@ void AddBobbyREmailJA2(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSende LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, 640*(iMessageOffset), 640); // add message to list - AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, iCurrentIMPPosition, iCurrentShipmentDestinationID, EmailType, TYPE_EMAIL_BOBBY_R_L1); + 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 @@ -898,7 +901,7 @@ void AddEmailWFMercAvailable(INT32 iMessageOffset, INT32 iMessageLength, UINT8 u wcscpy( pSubject, New113AIMMercMailTexts[subjectLine] ); - AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, iCurrentIMPPosition, -1 , EmailType, TYPE_E_NONE); + 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 @@ -911,21 +914,18 @@ void AddEmailWFMercAvailable(INT32 iMessageOffset, INT32 iMessageLength, UINT8 u return; } -void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType) +void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType, UINT16 EnumEmailXML) { - CHAR16 pSubject[640]; - UINT8 subjectLine = 0; - //MessagePtr pMessageList; - //MessagePtr pMessage; - //CHAR16 pMessageString[320]; + CHAR16 pSubject[640]; + UINT8 subjectLine = 0; -#ifdef JA2UB - if ( EmailType == TYPE_EMAIL_XML ) + if ( EnumEmailXML != XML_NOEMAIL && gEmails.size() > 0 ) { - AddEmailFromXML(iMessageOffset, iDate, iCurrentIMPPosition, iCurrentShipmentDestinationID, false); + 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) ) @@ -946,90 +946,65 @@ void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 */ } // add message to list - AddEmailMessage(iMessageOffset, iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, iCurrentIMPPosition, iCurrentShipmentDestinationID, EmailType, TYPE_E_NONE); - } + AddEmailMessage(iMessageOffset, iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, 0, 0, 0, 0, iCurrentIMPPosition, iCurrentShipmentDestinationID, EmailType, TYPE_E_NONE); #else - if ( EmailType == TYPE_EMAIL_XML ) - { - AddEmailFromXML(iMessageOffset, iDate, iCurrentIMPPosition, iCurrentShipmentDestinationID, false); - } - else - { - // WANNE: Short work in both ways - LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, 640 * (iMessageOffset), 640); - // add message to list - AddEmailMessage(iMessageOffset, iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, iCurrentIMPPosition, iCurrentShipmentDestinationID, EmailType, TYPE_E_NONE); - } + // WANNE: Short work in both ways + LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, 640 * (iMessageOffset), 640); + // 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; + // 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 ) +void AddPreReadEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, UINT8 EmailType) { - CHAR16 pSubject[640]; - //MessagePtr pMessageList; - //MessagePtr pMessage; - //CHAR16 pMessageString[320]; + CHAR16 pSubject[640]; #ifdef JA2UB - if ( EmailType == TYPE_EMAIL_XML ) - { - AddEmailFromXML(iMessageOffset, iDate, -1, -1, true); - } - else - { - if ( EmailType == TYPE_EMAIL_EMAIL_EDT ) - { - if ( FileExists(EMAIL_EDT_FILE_JA25) ) - LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, pSubject, 640 * (iMessageOffset), 640); - else - LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, 640 * (iMessageOffset), 640); - } - 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, 640 * (iMessageOffset), 640); - } + if ( EmailType == TYPE_EMAIL_EMAIL_EDT ) + { + if ( FileExists(EMAIL_EDT_FILE_JA25) ) + LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, pSubject, 640 * (iMessageOffset), 640); + else + LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, 640 * (iMessageOffset), 640); + } + 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, 640 * (iMessageOffset), 640); + } - // add message to list - AddEmailMessage(iMessageOffset, iMessageLength, pSubject, iDate, ubSender, TRUE, 0, 0, -1, -1, EmailType, TYPE_E_NONE); - } + // add message to list + AddEmailMessage(iMessageOffset, iMessageLength, pSubject, iDate, ubSender, TRUE, 0, 0, 0, 0, 0, 0, -1, -1, EmailType, TYPE_E_NONE); #else - if ( EmailType == TYPE_EMAIL_XML ) - { - AddEmailFromXML(iMessageOffset, iDate, -1, -1, true); - } - else - { - // starts at iSubjectOffset amd goes iSubjectLength, reading in string - LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, 640 * (iMessageOffset), 640); - // add message to list - AddEmailMessage( iMessageOffset,iMessageLength, pSubject, iDate, ubSender, TRUE, 0, 0, -1, -1 , EmailType, TYPE_E_NONE ); - } + // starts at iSubjectOffset amd goes iSubjectLength, reading in string + LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, 640 * (iMessageOffset), 640); + // 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 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; + return; } -void AddEmailMessage(INT32 iMessageOffset, INT32 iMessageLength,STR16 pSubject, INT32 iDate, UINT8 ubSender, BOOLEAN fAlreadyRead, INT32 iFirstData, UINT32 uiSecondData, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType, UINT32 EmailAIM ) +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; @@ -1119,6 +1094,10 @@ void AddEmailMessage(INT32 iMessageOffset, INT32 iMessageLength,STR16 pSubject, // 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) @@ -2066,13 +2045,17 @@ INT32 DisplayEmailMessage(EmailPtr pMail) // is there any special event meant for this mail?..if so, handle it if ( pMail->EmailVersion == TYPE_EMAIL_EMAIL_EDT ) - HandleAnySpecialEmailMessageEvents( iOffSet ); + 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); - + 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 ) + if ( pMail->EmailType != TYPE_E_NONE || pMail->EmailVersion == TYPE_EMAIL_XML ) { HandleNewUBMailSpecialMessages( 198, &iViewerPositionY, pMail ); HandleNewUBMailSpecialMessages( 170, &iViewerPositionY, pMail ); @@ -3465,28 +3448,28 @@ BOOLEAN HandleNewUBMailSpecialMessages( UINT16 usMessageId, INT32 *iResults, Ema 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 ) + 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, INSUR_PAYMENT_LENGTH ); + 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 ) + 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, INSUR_1HOUR_FRAUD_LENGTH ); + 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 ) + 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, MERC_DIED_ON_OTHER_ASSIGNMENT_LENGTH ); + 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 ) + 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, AIM_MEDICAL_DEPOSIT_REFUND_LENGTH ); + 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 ) + 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) { @@ -3499,7 +3482,14 @@ BOOLEAN HandleNewUBMailSpecialMessages( UINT16 usMessageId, INT32 *iResults, Ema { wstrMail.clear(); - LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", szMail, MAIL_STRING_SIZE *usMessageId, MAIL_STRING_SIZE); + 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; @@ -3554,11 +3544,12 @@ BOOLEAN HandleMailSpecialMessages( UINT16 usMessageId, INT32 *iResults, EmailPtr case INSUR_SUSPIC_2: case INSUR_INVEST_OVER: case INSUR_CHEAT_FRAUD: - ModifyInsuranceEmails( usMessageId, iResults, pMail, INSUR_PAYMENT_LENGTH ); - break; - case INSUR_1HOUR_FRAUD: - ModifyInsuranceEmails( usMessageId, iResults, pMail, INSUR_1HOUR_FRAUD_LENGTH ); + 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: @@ -3566,15 +3557,6 @@ BOOLEAN HandleMailSpecialMessages( UINT16 usMessageId, INT32 *iResults, EmailPtr SetBookMark( MERC_BOOKMARK ); break; - case MERC_DIED_ON_OTHER_ASSIGNMENT: - ModifyInsuranceEmails( usMessageId, iResults, pMail, MERC_DIED_ON_OTHER_ASSIGNMENT_LENGTH ); - break; - - case AIM_MEDICAL_DEPOSIT_REFUND: - case AIM_MEDICAL_DEPOSIT_NO_REFUND: - case AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND: - ModifyInsuranceEmails( usMessageId, iResults, pMail, AIM_MEDICAL_DEPOSIT_REFUND_LENGTH ); - break; //Dealtar's Airport Externalization case BOBBYR_SHIPMENT_ARRIVED: if (!pMessageRecordList) @@ -3588,10 +3570,18 @@ BOOLEAN HandleMailSpecialMessages( UINT16 usMessageId, INT32 *iResults, EmailPtr gusCurShipmentDestinationID = pMail->iCurrentShipmentDestinationID; // Loop through each line of the shipment EDT-file - for (int i = 0; i < BOBBYR_SHIPMENT_ARRIVED_LENGTH; ++i) + for (int i = 0; i < pMail->usLength; ++i) { wstrMail.clear(); - LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", szMail, MAIL_STRING_SIZE *usMessageId, MAIL_STRING_SIZE); + 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)) { @@ -3602,8 +3592,6 @@ BOOLEAN HandleMailSpecialMessages( UINT16 usMessageId, INT32 *iResults, EmailPtr LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, szMail, MAIL_STRING_SIZE *usMessageId, MAIL_STRING_SIZE); } */ - wstrMail = szMail; - index = wstrMail.find(L"$DESTINATIONNAME$"); // WANNE.MAIL: Fix @@ -6011,7 +5999,7 @@ void PreProcessEmail( EmailPtr pMail ) } -void ModifyInsuranceEmails( UINT16 usMessageId, INT32 *iResults, EmailPtr pMail, UINT8 ubNumberOfRecords ) +void ModifyInsuranceEmails( UINT16 usMessageId, INT32 *iResults, EmailPtr pMail ) { INT32 iHeight=0; RecordPtr pTempRecord; @@ -6031,7 +6019,7 @@ void ModifyInsuranceEmails( UINT16 usMessageId, INT32 *iResults, EmailPtr pMail, // list doesn't exist, reload if( !pTempRecord ) { - for( ubCnt=0; ubCntusLength; ubCnt++ ) { // read one record from email file #ifdef JA2UB @@ -6053,7 +6041,14 @@ void ModifyInsuranceEmails( UINT16 usMessageId, INT32 *iResults, EmailPtr pMail, LoadEncryptedDataFromFile( EMAIL_EDT_FILE_JA2, pString, MAIL_STRING_SIZE * usMessageId, MAIL_STRING_SIZE ); } #else - LoadEncryptedDataFromFile( "BINARYDATA\\Email.edt", pString, MAIL_STRING_SIZE * usMessageId, MAIL_STRING_SIZE ); + 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 ); @@ -6218,7 +6213,10 @@ BOOLEAN ReplaceMercNameAndAmountWithProperData( CHAR16 *pFinishedString, EmailPt if( fReplacingMercName ) { //add the mercs name to the string - wcscat( pFinishedString, gMercProfiles[ pMail->uiSecondData ].zName ); + if ( pMail->uiSecondData < NUM_PROFILES ) + { + wcscat( pFinishedString, gMercProfiles[ pMail->uiSecondData ].zName ); + } } else { @@ -6244,73 +6242,104 @@ 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, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT ); - AddEmail(ENRICO_CONGRATS,ENRICO_CONGRATS_LENGTH,MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT ); - AddEmail(IMP_EMAIL_AGAIN,IMP_EMAIL_AGAIN_LENGTH,1, GetWorldTotalMin( ), -1, -1, TYPE_EMAIL_EMAIL_EDT ); - AddEmail(MERC_INTRO, MERC_INTRO_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin( ), -1, -1, TYPE_EMAIL_EMAIL_EDT ); - AddEmail( MERC_NEW_SITE_ADDRESS, MERC_NEW_SITE_ADDRESS_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT ); + 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, GetWorldTotalMin( ), -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, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); - AddEmail( MERC_INVALID, MERC_INVALID_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); - AddEmail( NEW_MERCS_AT_MERC, NEW_MERCS_AT_MERC_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); - AddEmail( MERC_FIRST_WARNING, MERC_FIRST_WARNING_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -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, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT_NAME_MERC ); + 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, GetWorldTotalMin(), -1, -1 ); +// 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 ), GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT_NAME_MERC ); + 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, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT ); - AddEmail(OLD_ENRICO_2,OLD_ENRICO_2_LENGTH,MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT ); - AddEmail(OLD_ENRICO_3,OLD_ENRICO_3_LENGTH,MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT ); - AddEmail(RIS_REPORT,RIS_REPORT_LENGTH,RIS_EMAIL, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT ); + 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, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT ); - AddEmail(ENRICO_PROG_20, ENRICO_PROG_20_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); - AddEmail(ENRICO_PROG_55, ENRICO_PROG_55_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); - AddEmail(ENRICO_PROG_80, ENRICO_PROG_80_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); - AddEmail(ENRICO_SETBACK, ENRICO_SETBACK_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); - AddEmail(ENRICO_SETBACK_2, ENRICO_SETBACK_2_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); - AddEmail(LACK_PLAYER_PROGRESS_1, LACK_PLAYER_PROGRESS_1_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); - AddEmail(LACK_PLAYER_PROGRESS_2, LACK_PLAYER_PROGRESS_2_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); - AddEmail(LACK_PLAYER_PROGRESS_3, LACK_PLAYER_PROGRESS_3_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); - AddEmail(ENRICO_CREATURES, ENRICO_CREATURES_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -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, GetWorldTotalMin(), 20, 0, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); - AddEmailWithSpecialData( INSUR_SUSPIC, INSUR_SUSPIC_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), 20, 0, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); - AddEmailWithSpecialData( INSUR_SUSPIC_2, INSUR_SUSPIC_2_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), 20, 0, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); - AddEmail( BOBBYR_NOW_OPEN, BOBBYR_NOW_OPEN_LENGTH, BOBBY_R, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); - AddEmail( KING_PIN_LETTER, KING_PIN_LETTER_LENGTH, KING_PIN, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT ); - AddEmail( BOBBYR_SHIPMENT_ARRIVED, BOBBYR_SHIPMENT_ARRIVED_LENGTH, BOBBY_R, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT ); + 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, GetWorldTotalMin(), -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, GetWorldTotalMin(), 0, 0, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); + 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, GetWorldTotalMin(), 20, 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, GetWorldTotalMin(), 20, 0, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); + 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, GetWorldTotalMin(), 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, GetWorldTotalMin(), 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 diff --git a/Laptop/email.h b/Laptop/email.h index 1821c26ec..a2233db05 100644 --- a/Laptop/email.h +++ b/Laptop/email.h @@ -567,11 +567,10 @@ void RenderEmail(); // message manipulation -void AddEmailMessage(INT32 iMessageOffset, INT32 iMessageLength,STR16 pSubject, INT32 iDate, UINT8 ubSender, BOOLEAN fAlreadyRead, INT32 uiFirstData, UINT32 uiSecondData, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType, UINT32 EmailAIM ); +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 ); void RemoveEmailMessage(INT32 iId); EmailPtr GetEmailMessage(INT32 iId); void LookForUnread(); -void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType); // WANNE: For the new WF merc, when they available again void AddEmailWFMercAvailable(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, UINT8 EmailType); @@ -586,7 +585,6 @@ 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, UINT8 EmailType, UINT32 EmailAIM ); void AddCustomEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType); @@ -706,6 +704,88 @@ enum { TYPE_EMAIL_BOBBY_R_L1 = 11, }; +enum { + XML_NOEMAIL = -1, + XML_ENRICO_INQUIRY = 0, + XML_ENRICO_FOLLOWUP, + XML_ENRICO_CONFIRMED, + XML_ENRICO_GOODLUCK, + XML_ENRICO_GREATNEWS, + XML_ENRICO_PROGRESS, + XML_ENRICO_GOODWORK, + XML_ENRICO_FINALPUSH, + XML_ENRICO_SETBACK, + XML_ENRICO_BADNEWS, + XML_ENRICO_CREPITUS, + XML_ENRICO_CONCERNED, + XML_ENRICO_WORRIED, + XML_ENRICO_DISAPPOINTED, + XML_ENRICO_MILITIA_WEBSITE, + XML_ENRICO_INTEL, + XML_IMP_INTRO, + XML_IMP_INTROAGAIN, + XML_SPECK_INTRO, + XML_SPECK_NEWSITE, + XML_SPECK_NOTICE, + XML_SPECK_NEWPERSONNEL, + XML_SPECK_PLEASEPAY, + XML_SPECK_DELINQUENT, + XML_RISREPORT, + XML_INSURANCE_APPROVED, + XML_INSURANCE_SUSPICIOUS, + XML_INSURANCE_COMPLETED, + XML_INSURANCE_INVESTIGATION, + XML_INSURANCE_REFUSED, + XML_INSURANCE_POLICYVIOLATION, + XML_BR_VISITEDSITE, + XML_BR_SHIPMENTARRIVAL, + XML_BR_MEDUNA, + XML_KINGPIN_STOLEMONEY, + XML_KINGPIN_JOBOPPORTUNITY, + XML_KINGPIN_WELLDONE, + XML_KINGPIN_FAILURE, + XML_KINGPIN_FAILUREOBSTACLES, + XML_JOHNKULBA_SENTGUNS, + XML_JOHNKULBA_MISSEDTRANSFERFLIGHT, + XML_JOHNKULBA_CRASHLANDEDHELI, + XML_JOHNKULBA_AMBUSHEDBYCATS, + XML_AIM_NOTICE_OF_DEATH, + XML_AIM_REFUND, + XML_AIM_PARTIALREFUND, + XML_AIM_NOREFUND, + XML_KERBERUS_OFFER, + XML_DASILVA_THANKYOU, + XML_JA2UB_ENRICO_HELP, + XML_JA2UB_ENRICO_INQUIRY, + XML_JA2UB_ENRICO_STILLNOWORD, + XML_JA2UB_ENRICO_GOODNEWS, + XML_JA2UB_ENRICO_CONCERNED, + XML_JA2UB_ENRICO_URGENT, + XML_JA2UB_ENRICO_PILOTTROUBLE, + XML_JA2UB_ENRICO_PILOTFOUND, + XML_JA2UB_ENRICO_CONGRATS, + XML_JA2UB_ENRICO_CONGRATS_MIGUELSICK, + XML_JA2UB_ENRICO_CONGRATS_MIGUELSICK_MANUELDEAD, + XML_JA2UB_ENRICO_CONGRATS_MIGUELSICK_MANUELALIVE, + XML_JA2UB_ENRICO_CONGRATS_MANUELDEAD, + XML_JA2UB_ENRICO_CONGRATS_MANUELALIVE, + XML_JA2UB_IMP_INTRO, + XML_JA2UB_IMP_INTROAGAIN, + XML_JA2UB_MIGUEL_HELLO, + XML_JA2UB_MIGUEL_SORRY, + XML_JA2UB_MIGUEL_SORRY_HIREDMANUEL, + XML_JA2UB_MIGUEL_SICK, + XML_JA2UB_MIGUEL_CIGARETTES, + XML_JA2UB_AIM_SPECIALOFFER, + XML_JA2UB_AIM_BONUSOFFER, + XML_JA2UB_AIM_SPECIALBONUSOFFER, + XML_JA2UB_AIM_DISMISSALREFUND, + XML_JA2UB_SPECK_EVENBETTEROFFER, + XML_JA2UB_SPECK_DISMISSALREFUND +}; +void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType, UINT16 EnumEmailXML = XML_NOEMAIL); +void AddEmailWithSpecialData(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iFirstData, UINT32 uiSecondData, UINT8 EmailType, UINT32 EmailAIM, UINT16 EnumEmailXML = XML_NOEMAIL); + extern EMAIL_MERC_AVAILABLE_VALUES EmailMercAvailableText[NUM_PROFILES]; extern EMAIL_MERC_LEVEL_UP_VALUES EmailMercLevelUpText[NUM_PROFILES]; extern EMAIL_MERC_INSURANCE_VALUES EmailInsuranceText[NUM_PROFILES]; @@ -714,7 +794,8 @@ extern EMAIL_OTHER_VALUES EmailOtherText[EMAIL_INDEX]; extern BOOLEAN ReadXMLEmail; extern void AddEmailTypeXML( INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, UINT8 EmailType ); extern void AddPreReadEmailTypeXML( INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, UINT8 EmailType ); -extern void AddEmailWithSpecialDataXML(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iFirstData, UINT32 uiSecondData, UINT8 EmailTyp, UINT32 EmailAIMe ); +extern void AddEmailFromXML(INT32 iMessageOffset, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, BOOLEAN alreadyRead, INT32 iFirstData, UINT32 uiSecondData, INT32 iThirdData, INT32 iFourthData, UINT32 uiFifthData, UINT32 uiSixData); +extern void AddEmailWithSpecialDataXML(INT32 iMessageOffset, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, BOOLEAN alreadyRead, INT32 iFirstData, UINT32 uiSecondData, INT32 iThirdData, INT32 iFourthData, UINT32 uiFifthData, UINT32 uiSixData); extern BOOLEAN SaveNewEmailDataToSaveGameFile( HWFILE hFile ); extern BOOLEAN LoadNewEmailDataFromLoadGameFile( HWFILE hFile ); @@ -723,9 +804,3 @@ extern void AddBobbyREmailJA2(INT32 iMessageOffset, INT32 iMessageLength, UINT8 #endif #endif - - - - - - diff --git a/Laptop/insurance Contract.cpp b/Laptop/insurance Contract.cpp index 413493ea8..a61e9f8da 100644 --- a/Laptop/insurance Contract.cpp +++ b/Laptop/insurance Contract.cpp @@ -1350,7 +1350,8 @@ BOOLEAN AddLifeInsurancePayout( SOLDIERTYPE *pSoldier ) void StartInsuranceInvestigation( UINT16 ubPayoutID ) { - UINT8 ubDays; + const auto mercID = LaptopSaveInfo.pLifeInsurancePayouts[ubPayoutID].ubMercID; + const auto payoutPrice = LaptopSaveInfo.pLifeInsurancePayouts[ubPayoutID].iPayOutPrice; // send an email telling player an investigation is taking place if (gStrategicStatus.ubInsuranceInvestigationsCnt == 0) @@ -1361,10 +1362,12 @@ void StartInsuranceInvestigation( UINT16 ubPayoutID ) if( gubQuest[ QUEST_FIX_LAPTOP ] == QUESTDONE || gGameUBOptions.LaptopQuestEnabled == FALSE ) { if ( gGameUBOptions.LaptopLinkInsurance == TRUE ) - AddEmailWithSpecialData( 173, INSUR_SUSPIC_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].iPayOutPrice, LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubMercID, TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT, TYPE_E_INSURANCE_L4 ); + { + AddEmailWithSpecialData(173, INSUR_SUSPIC_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), payoutPrice, mercID, TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT, TYPE_E_INSURANCE_L4, XML_INSURANCE_SUSPICIOUS); + } } #else - AddEmailWithSpecialData( INSUR_SUSPIC, INSUR_SUSPIC_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].iPayOutPrice, LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubMercID, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); + AddEmailWithSpecialData(INSUR_SUSPIC, INSUR_SUSPIC_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), payoutPrice, mercID, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE, XML_INSURANCE_SUSPICIOUS); #endif } else @@ -1375,14 +1378,17 @@ void StartInsuranceInvestigation( UINT16 ubPayoutID ) if( gubQuest[ QUEST_FIX_LAPTOP ] == QUESTDONE || gGameUBOptions.LaptopQuestEnabled == FALSE ) { if ( gGameUBOptions.LaptopLinkInsurance == TRUE ) - AddEmailWithSpecialData( 179, INSUR_SUSPIC_2_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].iPayOutPrice, LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubMercID, TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT, TYPE_E_INSURANCE_L5 ); + { + AddEmailWithSpecialData(179, INSUR_SUSPIC_2_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), payoutPrice, mercID, TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT, TYPE_E_INSURANCE_L5, XML_INSURANCE_INVESTIGATION); + } } #else - AddEmailWithSpecialData( INSUR_SUSPIC_2, INSUR_SUSPIC_2_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].iPayOutPrice, LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubMercID, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); + AddEmailWithSpecialData(INSUR_SUSPIC_2, INSUR_SUSPIC_2_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), payoutPrice, mercID, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE, XML_INSURANCE_INVESTIGATION); #endif } - if ( gMercProfiles[ LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubMercID ].ubSuspiciousDeath == VERY_SUSPICIOUS_DEATH ) + UINT8 ubDays; + if ( gMercProfiles[ mercID ].ubSuspiciousDeath == VERY_SUSPICIOUS_DEATH ) { // the fact that you tried to cheat them gets realized very quickly. :-) ubDays = 1; @@ -1403,42 +1409,47 @@ void StartInsuranceInvestigation( UINT16 ubPayoutID ) void EndInsuranceInvestigation( UINT16 ubPayoutID ) { + const auto mercID = LaptopSaveInfo.pLifeInsurancePayouts[ubPayoutID].ubMercID; + const auto payoutPrice = LaptopSaveInfo.pLifeInsurancePayouts[ubPayoutID].iPayOutPrice; + // send an email telling player the investigation is over - if ( gMercProfiles[ LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubMercID ].ubSuspiciousDeath == VERY_SUSPICIOUS_DEATH ) + if ( gMercProfiles[ mercID ].ubSuspiciousDeath == VERY_SUSPICIOUS_DEATH ) { // fraud, no payout! #ifdef JA2UB -// no UB - if( gubQuest[ QUEST_FIX_LAPTOP ] == QUESTDONE || gGameUBOptions.LaptopQuestEnabled == FALSE ) - { - if ( gGameUBOptions.LaptopLinkInsurance == TRUE ) - AddEmailWithSpecialData( INSUR_1HOUR_FRAUD, INSUR_1HOUR_FRAUD_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].iPayOutPrice, LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubMercID, TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT, TYPE_E_INSURANCE_L2 ); - } + if ( gubQuest[QUEST_FIX_LAPTOP] == QUESTDONE || gGameUBOptions.LaptopQuestEnabled == FALSE ) + { + if ( gGameUBOptions.LaptopLinkInsurance == TRUE ) + { + AddEmailWithSpecialData(INSUR_1HOUR_FRAUD, INSUR_1HOUR_FRAUD_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), payoutPrice, mercID, TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT, TYPE_E_INSURANCE_L2, XML_INSURANCE_REFUSED); + } + } #else - AddEmailWithSpecialData( INSUR_1HOUR_FRAUD, INSUR_1HOUR_FRAUD_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].iPayOutPrice, LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubMercID, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); + AddEmailWithSpecialData(INSUR_1HOUR_FRAUD, INSUR_1HOUR_FRAUD_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), payoutPrice, mercID, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE, XML_INSURANCE_REFUSED); #endif } // Flugente: also don't pay out if the death was suspicious. I mean, we get this if there were no enemies of the player straight up shot the guy... - else if ( gMercProfiles[LaptopSaveInfo.pLifeInsurancePayouts[ubPayoutID].ubMercID].ubSuspiciousDeath == SUSPICIOUS_DEATH ) + else if ( gMercProfiles[mercID].ubSuspiciousDeath == SUSPICIOUS_DEATH ) { #ifdef JA2UB // WANNE: I really don't know if we should call something here. At least it fixed the compilation error when compiling UB version. #else // fraud, no payout! - AddEmailWithSpecialData( INSUR_CHEAT_FRAUD, INSUR_CHEAT_FRAUD_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), LaptopSaveInfo.pLifeInsurancePayouts[ubPayoutID].iPayOutPrice, LaptopSaveInfo.pLifeInsurancePayouts[ubPayoutID].ubMercID, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); + AddEmailWithSpecialData(INSUR_CHEAT_FRAUD, INSUR_CHEAT_FRAUD_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), payoutPrice, mercID, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE, XML_INSURANCE_POLICYVIOLATION); #endif } else { #ifdef JA2UB -// No UB if( gubQuest[ QUEST_FIX_LAPTOP ] == QUESTDONE || gGameUBOptions.LaptopQuestEnabled == FALSE ) { if ( gGameUBOptions.LaptopLinkInsurance == TRUE ) - AddEmailWithSpecialData( 176, INSUR_INVEST_OVER_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].iPayOutPrice, LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubMercID, TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT, TYPE_E_INSURANCE_L6 ); + { + AddEmailWithSpecialData(176, INSUR_INVEST_OVER_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), payoutPrice, mercID, TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT, TYPE_E_INSURANCE_L6, XML_INSURANCE_COMPLETED); + } } #else - AddEmailWithSpecialData( INSUR_INVEST_OVER, INSUR_INVEST_OVER_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].iPayOutPrice, LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubMercID, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); + AddEmailWithSpecialData(INSUR_INVEST_OVER, INSUR_INVEST_OVER_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), payoutPrice, mercID, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE, XML_INSURANCE_COMPLETED); #endif // only now make a payment (immediately) @@ -1450,6 +1461,9 @@ void EndInsuranceInvestigation( UINT16 ubPayoutID ) //void InsuranceContractPayLifeInsuranceForDeadMerc( LIFE_INSURANCE_PAYOUT *pPayoutStruct ) void InsuranceContractPayLifeInsuranceForDeadMerc( UINT16 ubPayoutID ) { + const auto mercID = LaptopSaveInfo.pLifeInsurancePayouts[ubPayoutID].ubMercID; + const auto payoutPrice = LaptopSaveInfo.pLifeInsurancePayouts[ubPayoutID].iPayOutPrice; + //if the mercs id number is the same what is in the soldier array if( LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubSoldierID == LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubSoldierID->ubID ) { @@ -1459,24 +1473,25 @@ void InsuranceContractPayLifeInsuranceForDeadMerc( UINT16 ubPayoutID ) } //add transaction to players account - AddTransactionToPlayersBook( INSURANCE_PAYOUT, LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubMercID, GetWorldTotalMin(), LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].iPayOutPrice ); + AddTransactionToPlayersBook( INSURANCE_PAYOUT, mercID, GetWorldTotalMin(), payoutPrice ); //add to the history log the fact that the we paid the insurance claim - AddHistoryToPlayersLog( HISTORY_INSURANCE_CLAIM_PAYOUT, LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubMercID, GetWorldTotalMin(), -1, -1 ); + AddHistoryToPlayersLog( HISTORY_INSURANCE_CLAIM_PAYOUT, mercID, GetWorldTotalMin(), -1, -1 ); //if there WASNT an investigation - if( gMercProfiles[ LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubMercID ].ubSuspiciousDeath == 0 ) + if( gMercProfiles[ mercID ].ubSuspiciousDeath == 0 ) { //Add an email telling the user that he received an insurance payment #ifdef JA2UB -// no UB if( gubQuest[ QUEST_FIX_LAPTOP ] == QUESTDONE || gGameUBOptions.LaptopQuestEnabled == FALSE ) { if ( gGameUBOptions.LaptopLinkInsurance == TRUE ) - AddEmailWithSpecialData( 170, INSUR_PAYMENT_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].iPayOutPrice, LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubMercID, TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT, TYPE_E_INSURANCE_L3 ); + { + AddEmailWithSpecialData(170, INSUR_PAYMENT_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), payoutPrice, mercID, TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT, TYPE_E_INSURANCE_L3, XML_INSURANCE_APPROVED); + } } #else - AddEmailWithSpecialData( INSUR_PAYMENT, INSUR_PAYMENT_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].iPayOutPrice, LaptopSaveInfo.pLifeInsurancePayouts[ ubPayoutID ].ubMercID, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); + AddEmailWithSpecialData(INSUR_PAYMENT, INSUR_PAYMENT_LENGTH, INSURANCE_COMPANY, GetWorldTotalMin(), payoutPrice, mercID, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE, XML_INSURANCE_APPROVED); #endif } diff --git a/Laptop/laptop.cpp b/Laptop/laptop.cpp index b6f556cfe..3a83198b7 100644 --- a/Laptop/laptop.cpp +++ b/Laptop/laptop.cpp @@ -3294,7 +3294,7 @@ void HaventMadeImpMercEmailCallBack() if( ( LaptopSaveInfo.fIMPCompletedFlag == FALSE ) && ( LaptopSaveInfo.fSentImpWarningAlready == FALSE ) ) { LaptopSaveInfo.fSentImpWarningAlready = TRUE; - AddEmail(IMP_EMAIL_AGAIN,IMP_EMAIL_AGAIN_LENGTH,1, GetWorldTotalMin( ), -1, -1, TYPE_EMAIL_EMAIL_EDT ); + AddEmail(IMP_EMAIL_AGAIN,IMP_EMAIL_AGAIN_LENGTH,1, GetWorldTotalMin( ), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_IMP_INTROAGAIN); } #endif } diff --git a/Laptop/mercs.cpp b/Laptop/mercs.cpp index e46370d77..be64cee54 100644 --- a/Laptop/mercs.cpp +++ b/Laptop/mercs.cpp @@ -1039,7 +1039,7 @@ void DailyUpdateOfMercSite( UINT16 usDate) LaptopSaveInfo.gubPlayersMercAccountStatus = MERC_ACCOUNT_INVALID; if( IsSpeckComAvailable() ) { - AddEmail( MERC_INVALID, MERC_INVALID_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(MERC_INVALID, MERC_INVALID_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_SPECK_NOTICE); } else { @@ -1055,7 +1055,7 @@ void DailyUpdateOfMercSite( UINT16 usDate) LaptopSaveInfo.gubPlayersMercAccountStatus = MERC_ACCOUNT_SUSPENDED; if( IsSpeckComAvailable() ) { - AddEmail( MERC_WARNING, MERC_WARNING_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(MERC_WARNING, MERC_WARNING_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_SPECK_DELINQUENT); // Have speck complain next time player come to site LaptopSaveInfo.uiSpeckQuoteFlags |= SPECK_QUOTE__SENT_EMAIL_ABOUT_LACK_OF_PAYMENT; @@ -1074,7 +1074,7 @@ void DailyUpdateOfMercSite( UINT16 usDate) LaptopSaveInfo.gubPlayersMercAccountStatus = MERC_ACCOUNT_VALID_FIRST_WARNING; if( IsSpeckComAvailable() ) { - AddEmail( MERC_FIRST_WARNING, MERC_FIRST_WARNING_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(MERC_FIRST_WARNING, MERC_FIRST_WARNING_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_SPECK_PLEASEPAY); // Have speck complain next time player come to site LaptopSaveInfo.uiSpeckQuoteFlags |= SPECK_QUOTE__SENT_EMAIL_ABOUT_LACK_OF_PAYMENT; @@ -2899,8 +2899,7 @@ void GetMercSiteBackOnline() if( IsSpeckComAvailable() ) { //Add an email telling the user the site is back up - AddEmail( MERC_NEW_SITE_ADDRESS, MERC_NEW_SITE_ADDRESS_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1 , TYPE_EMAIL_EMAIL_EDT); - + AddEmail(MERC_NEW_SITE_ADDRESS, MERC_NEW_SITE_ADDRESS_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_SPECK_NEWSITE); //Set a flag indicating that the server just went up ( so speck can make a comment when the player next visits the site ) LaptopSaveInfo.fFirstVisitSinceServerWentDown = TRUE; } @@ -3213,7 +3212,7 @@ void NewMercsAvailableAtMercSiteCallBack() if (!sentNewMercsEmail) { sentNewMercsEmail = true; - AddEmail(NEW_MERCS_AT_MERC, NEW_MERCS_AT_MERC_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(NEW_MERCS_AT_MERC, NEW_MERCS_AT_MERC_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_SPECK_NEWPERSONNEL); } //new mercs are available diff --git a/Strategic/Game Event Hook.cpp b/Strategic/Game Event Hook.cpp index 2e7e38011..91a0eb625 100644 --- a/Strategic/Game Event Hook.cpp +++ b/Strategic/Game Event Hook.cpp @@ -210,7 +210,7 @@ BOOLEAN ExecuteStrategicEvent( STRATEGICEVENT *pEvent ) #ifdef JA2UB //No JA25 UB #else - AddEmail(MERC_INTRO, MERC_INTRO_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin( ), -1, -1 ,TYPE_EMAIL_EMAIL_EDT ); + AddEmail(MERC_INTRO, MERC_INTRO_LENGTH, SPECK_FROM_MERC, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_SPECK_INTRO); #endif } break; @@ -487,7 +487,7 @@ BOOLEAN ExecuteStrategicEvent( STRATEGICEVENT *pEvent ) // No PCM in UB #else case EVENT_PMC_EMAIL: - AddEmail( PMC_INTRO, PMC_INTRO_LENGTH, PMC, GetWorldTotalMin( ), -1, -1, TYPE_EMAIL_EMAIL_EDT ); + AddEmail(PMC_INTRO, PMC_INTRO_LENGTH, PMC, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_KERBERUS_OFFER); break; #endif @@ -503,16 +503,14 @@ BOOLEAN ExecuteStrategicEvent( STRATEGICEVENT *pEvent ) gMercProfiles[MARIA].bMercStatus != MERC_IS_DEAD && gMercProfiles[ANGEL].bMercStatus != MERC_IS_DEAD ) { StartQuest( QUEST_KINGPIN_ANGEL_MARIA, gWorldSectorX, gWorldSectorY ); - - AddEmail( KINGPIN_BOUNTY_INITIAL, KINGPIN_BOUNTY_INITIAL_LENGTH, KING_PIN, GetWorldTotalMin( ), -1, -1, TYPE_EMAIL_EMAIL_EDT ); + AddEmail(KINGPIN_BOUNTY_INITIAL, KINGPIN_BOUNTY_INITIAL_LENGTH, KING_PIN, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_KINGPIN_JOBOPPORTUNITY); } break; case EVENT_KINGPIN_BOUNTY_END_KILLEDTHEM: if ( gMercProfiles[KINGPIN].bMercStatus != MERC_IS_DEAD && !CheckFact( FACT_KINGPIN_DEAD, NO_PROFILE ) && !CheckFact( FACT_KINGPIN_IS_ENEMY, NO_PROFILE ) ) { - AddEmail( KINGPIN_BOUNTY_KINGPIN_REWARD, KINGPIN_BOUNTY_KINGPIN_REWARD_LENGTH, KING_PIN, GetWorldTotalMin( ), -1, -1, TYPE_EMAIL_EMAIL_EDT ); - + AddEmail(KINGPIN_BOUNTY_KINGPIN_REWARD, KINGPIN_BOUNTY_KINGPIN_REWARD_LENGTH, KING_PIN, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_KINGPIN_WELLDONE); // also authorise payment from kingpin to the player AddTransactionToPlayersBook( ANONYMOUS_DEPOSIT, 0, GetWorldTotalMin( ), 10000 ); } @@ -528,14 +526,13 @@ BOOLEAN ExecuteStrategicEvent( STRATEGICEVENT *pEvent ) if ( gMercProfiles[MARIA].bMercStatus != MERC_IS_DEAD && gMercProfiles[ANGEL].bMercStatus != MERC_IS_DEAD && CheckFact( FACT_BOUNTYHUNTER_KILLED_1, NO_PROFILE ) && CheckFact( FACT_BOUNTYHUNTER_KILLED_2, NO_PROFILE ) ) { - AddEmail( KINGPIN_BOUNTY_ANGEL_THANKS, KINGPIN_BOUNTY_ANGEL_THANKS_LENGTH, ANGEL_DASILVA, GetWorldTotalMin( ), -1, -1, TYPE_EMAIL_EMAIL_EDT ); - - AddEmail( KINGPIN_BOUNTY_TARGET_GOTAWAY, KINGPIN_BOUNTY_TARGET_GOTAWAY_LENGTH, KING_PIN, GetWorldTotalMin( ), -1, -1, TYPE_EMAIL_EMAIL_EDT ); + AddEmail(KINGPIN_BOUNTY_ANGEL_THANKS, KINGPIN_BOUNTY_ANGEL_THANKS_LENGTH, ANGEL_DASILVA, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_DASILVA_THANKYOU); + AddEmail(KINGPIN_BOUNTY_TARGET_GOTAWAY, KINGPIN_BOUNTY_TARGET_GOTAWAY_LENGTH, KING_PIN, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_KINGPIN_FAILUREOBSTACLES); } // we can assume that the bounty hunters for to them first - Kingpin sends an email and states that someone else finished the job else if ( gMercProfiles[KINGPIN].bMercStatus != MERC_IS_DEAD && !CheckFact( FACT_KINGPIN_DEAD, NO_PROFILE ) && !CheckFact( FACT_KINGPIN_IS_ENEMY, NO_PROFILE ) ) { - AddEmail( KINGPIN_BOUNTY_BH_GOTTARGET, KINGPIN_BOUNTY_BH_GOTTARGET_LENGTH, KING_PIN, GetWorldTotalMin( ), -1, -1, TYPE_EMAIL_EMAIL_EDT ); + AddEmail(KINGPIN_BOUNTY_BH_GOTTARGET, KINGPIN_BOUNTY_BH_GOTTARGET_LENGTH, KING_PIN, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_KINGPIN_FAILURE); } // in any case, this quest is now over @@ -601,7 +598,7 @@ BOOLEAN ExecuteStrategicEvent( STRATEGICEVENT *pEvent ) #ifndef JA2UB case EVENT_MILITIAROSTER_EMAIL: - AddEmail( MILITIAROSTER_INTRO, MILITIAROSTER_INTRO_LENGTH, MAIL_ENRICO, GetWorldTotalMin( ), -1, -1, TYPE_EMAIL_EMAIL_EDT ); + AddEmail(MILITIAROSTER_INTRO, MILITIAROSTER_INTRO_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_ENRICO_MILITIA_WEBSITE); break; #endif @@ -628,7 +625,7 @@ BOOLEAN ExecuteStrategicEvent( STRATEGICEVENT *pEvent ) #ifndef JA2UB case EVENT_INTEL_ENRICO_EMAIL: - AddEmail( INTEL_ENRICO_INTRO, INTEL_ENRICO_INTRO_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT ); + AddEmail(INTEL_ENRICO_INTRO, INTEL_ENRICO_INTRO_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_ENRICO_INTEL); break; #endif diff --git a/Strategic/LuaInitNPCs.cpp b/Strategic/LuaInitNPCs.cpp index 62ea521fc..1e99451e9 100644 --- a/Strategic/LuaInitNPCs.cpp +++ b/Strategic/LuaInitNPCs.cpp @@ -409,7 +409,6 @@ static int l_AddEmailXML(lua_State* L); static int l_AddEmailXML2(lua_State* L); static int l_AddEmailLevelUpXML(lua_State* L); static int l_AddEmailFromXML(lua_State* L); -static int l_AddPreReadEmailFromXML(lua_State* L); static int l_EVENT_SoldierGotHit(lua_State* L); static int l_EVENT_InitNewSoldierAnim(lua_State* L); @@ -1032,7 +1031,6 @@ static void IniFunction(lua_State* L, BOOLEAN bQuests) lua_register(L, "AddEmailMercAvailableXML", l_AddEmailXML); lua_register(L, "AddEmailMercLevelUpXML", l_AddEmailLevelUpXML); lua_register(L, "AddEmailXML", l_AddEmailXML2); - lua_register(L, "AddPreReadEmailFromXML", l_AddPreReadEmailFromXML); lua_register(L, "AddEmailFromXML", l_AddEmailFromXML); //------Time------ @@ -7542,31 +7540,38 @@ static int l_AddEmailFromXML(lua_State* L) if (lua_gettop(L)) { UINT8 index = lua_tointeger(L, 1); + bool preReadMail = false; INT32 iCurrentIMPPosition = -1; INT16 iCurrentShipmentDestinationID = -1; - INT32 unused = 0; + INT32 specialData1 = -1; + UINT32 specialData2 = -1; + INT32 specialData3 = -1; + INT32 specialData4 = -1; + UINT32 specialData5 = -1; + UINT32 specialData6 = -1; - if ( lua_gettop(L) >= 3 ) + if ( lua_gettop(L) >= 2 ) { - iCurrentIMPPosition = lua_tointeger(L, 2); - iCurrentShipmentDestinationID = lua_tointeger(L, 3); + preReadMail = lua_toboolean(L, 2); + } + if ( lua_gettop(L) >= 7 ) + { + iCurrentIMPPosition = lua_tointeger(L, 3); + iCurrentShipmentDestinationID = lua_tointeger(L, 4); + specialData1 = lua_tointeger(L, 5); + specialData2 = lua_tointeger(L, 6); + specialData3 = lua_tointeger(L, 7); + } + + if ( specialData1 != -1 || specialData2 != -1 ) + { + AddEmailWithSpecialDataXML(index, GetWorldTotalMin(), iCurrentIMPPosition, iCurrentShipmentDestinationID, preReadMail, specialData1, specialData2, specialData3, specialData4, specialData5, specialData6); + } + else + { + AddEmailFromXML(index, GetWorldTotalMin(), iCurrentIMPPosition, iCurrentShipmentDestinationID, preReadMail, specialData1, specialData2, specialData3, specialData4, specialData5, specialData6); } - AddEmail(index, unused, unused, GetWorldTotalMin(), iCurrentIMPPosition, iCurrentShipmentDestinationID, TYPE_EMAIL_XML); } - - return 0; -} - -//AddPreReadEmail -static int l_AddPreReadEmailFromXML(lua_State* L) -{ - if (lua_gettop(L)) - { - UINT8 index = lua_tointeger(L, 1); - INT32 unused = 0; - AddPreReadEmail(index, unused, unused, GetWorldTotalMin(), TYPE_EMAIL_XML); - } - return 0; } diff --git a/Strategic/Map Screen Interface.cpp b/Strategic/Map Screen Interface.cpp index b7ef4678e..4905ae11f 100644 --- a/Strategic/Map Screen Interface.cpp +++ b/Strategic/Map Screen Interface.cpp @@ -6162,7 +6162,7 @@ BOOLEAN HandleTimeCompressWithTeamJackedInAndGearedToGo( void ) //no ja25 UB #else // Add e-mail message - AddEmail(ENRICO_CONGRATS,ENRICO_CONGRATS_LENGTH,MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(ENRICO_CONGRATS, ENRICO_CONGRATS_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_ENRICO_GOODLUCK); #endif return( TRUE ); diff --git a/Strategic/Merc Contract.cpp b/Strategic/Merc Contract.cpp index 3f0ac34bf..e215205eb 100644 --- a/Strategic/Merc Contract.cpp +++ b/Strategic/Merc Contract.cpp @@ -1102,10 +1102,12 @@ void CalculateMedicalDepositRefund( SOLDIERTYPE *pSoldier ) if( gubQuest[ QUEST_FIX_LAPTOP ] == QUESTDONE || gGameUBOptions.LaptopQuestEnabled == FALSE ) { if ( gGameUBOptions.fDeadMerc == TRUE ) - AddEmailWithSpecialData( 27, AIM_MEDICAL_DEPOSIT_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), pSoldier->usMedicalDeposit, pSoldier->ubProfile, TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT, TYPE_E_AIM_L2 ); + { + AddEmailWithSpecialData(27, AIM_MEDICAL_DEPOSIT_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), pSoldier->usMedicalDeposit, pSoldier->ubProfile, TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT, TYPE_E_AIM_L2, XML_AIM_REFUND); + } } #else - AddEmailWithSpecialData( AIM_MEDICAL_DEPOSIT_REFUND, AIM_MEDICAL_DEPOSIT_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), pSoldier->usMedicalDeposit, pSoldier->ubProfile, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); + AddEmailWithSpecialData(AIM_MEDICAL_DEPOSIT_REFUND, AIM_MEDICAL_DEPOSIT_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), pSoldier->usMedicalDeposit, pSoldier->ubProfile, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE, XML_AIM_REFUND); #endif } //else if the merc is a dead, refund NOTHING!! @@ -1116,14 +1118,15 @@ void CalculateMedicalDepositRefund( SOLDIERTYPE *pSoldier ) //add an email #ifdef JA2UB -//no UB if( gubQuest[ QUEST_FIX_LAPTOP ] == QUESTDONE || gGameUBOptions.LaptopQuestEnabled == FALSE ) { if ( gGameUBOptions.fDeadMerc == TRUE ) - AddEmailWithSpecialData( 217, AIM_MEDICAL_DEPOSIT_NO_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), pSoldier->usMedicalDeposit, pSoldier->ubProfile, TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT, TYPE_E_AIM_L3 ); + { + AddEmailWithSpecialData(217, AIM_MEDICAL_DEPOSIT_NO_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), pSoldier->usMedicalDeposit, pSoldier->ubProfile, TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT, TYPE_E_AIM_L3, XML_AIM_NOREFUND); + } } #else - AddEmailWithSpecialData( AIM_MEDICAL_DEPOSIT_NO_REFUND, AIM_MEDICAL_DEPOSIT_NO_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), pSoldier->usMedicalDeposit, pSoldier->ubProfile, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); + AddEmailWithSpecialData(AIM_MEDICAL_DEPOSIT_NO_REFUND, AIM_MEDICAL_DEPOSIT_NO_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), pSoldier->usMedicalDeposit, pSoldier->ubProfile, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE, XML_AIM_NOREFUND); #endif } //else the player is injured, refund a partial amount @@ -1141,10 +1144,12 @@ void CalculateMedicalDepositRefund( SOLDIERTYPE *pSoldier ) if( gubQuest[ QUEST_FIX_LAPTOP ] == QUESTDONE || gGameUBOptions.LaptopQuestEnabled == FALSE ) { if ( gGameUBOptions.fDeadMerc == TRUE ) - AddEmailWithSpecialData( 214, AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), iRefundAmount, pSoldier->ubProfile, TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT, TYPE_E_AIM_L4 ); + { + AddEmailWithSpecialData(214, AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), iRefundAmount, pSoldier->ubProfile, TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT, TYPE_E_AIM_L4, XML_AIM_PARTIALREFUND); + } } #else - AddEmailWithSpecialData( AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND, AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), iRefundAmount, pSoldier->ubProfile, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); + AddEmailWithSpecialData(AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND, AIM_MEDICAL_DEPOSIT_PARTIAL_REFUND_LENGTH, AIM_SITE, GetWorldTotalMin(), iRefundAmount, pSoldier->ubProfile, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE, XML_AIM_PARTIALREFUND); #endif } } diff --git a/Strategic/Player Command.cpp b/Strategic/Player Command.cpp index 009f766ba..85d472de2 100644 --- a/Strategic/Player Command.cpp +++ b/Strategic/Player Command.cpp @@ -249,7 +249,7 @@ BOOLEAN SetThisSectorAsPlayerControlled( INT16 sMapX, INT16 sMapY, INT8 bMapZ, B #ifdef JA2UB // no UB #else - AddEmail( BOBBYR_NOW_OPEN, BOBBYR_NOW_OPEN_LENGTH, BOBBY_R, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(BOBBYR_NOW_OPEN, BOBBYR_NOW_OPEN_LENGTH, BOBBY_R, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_BR_VISITEDSITE); #endif LaptopSaveInfo.ubHaveBeenToBobbyRaysAtLeastOnceWhileUnderConstruction = BOBBYR_ALREADY_SENT_EMAIL; } diff --git a/Strategic/Strategic Event Handler.cpp b/Strategic/Strategic Event Handler.cpp index 1e57e3168..ae772e6b6 100644 --- a/Strategic/Strategic Event Handler.cpp +++ b/Strategic/Strategic Event Handler.cpp @@ -689,7 +689,7 @@ void HandleNPCSystemEvent( UINT32 uiEvent ) #ifdef JA2UB // no UB #else - AddEmail( KING_PIN_LETTER, KING_PIN_LETTER_LENGTH, KING_PIN, GetWorldTotalMin(), -1, -1 , TYPE_EMAIL_EMAIL_EDT ); + AddEmail(KING_PIN_LETTER, KING_PIN_LETTER_LENGTH, KING_PIN, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_KINGPIN_STOLEMONEY); #endif StartQuest( QUEST_KINGPIN_MONEY, gMercProfiles[ KINGPIN ].sSectorX, gMercProfiles[ KINGPIN ].sSectorY ); // add event to send terrorists two days from now @@ -795,7 +795,7 @@ void HandleNPCSystemEvent( UINT32 uiEvent ) #ifdef JA2UB // no UB #else - AddEmail( ENRICO_MIGUEL, ENRICO_MIGUEL_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1 , TYPE_EMAIL_EMAIL_EDT); + AddEmail(ENRICO_MIGUEL, ENRICO_MIGUEL_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_ENRICO_GREATNEWS); #endif break; diff --git a/Strategic/Strategic Status.cpp b/Strategic/Strategic Status.cpp index b1c30b398..9ea6ff2a2 100644 --- a/Strategic/Strategic Status.cpp +++ b/Strategic/Strategic Status.cpp @@ -253,7 +253,7 @@ void HandleEnricoEmail(void) // if creatures have attacked a mine (doesn't care if they're still there or not at the moment) if (HasAnyMineBeenAttackedByMonsters() && !(gStrategicStatus.usEnricoEmailFlags & ENRICO_EMAIL_SENT_CREATURES)) { - AddEmail(ENRICO_CREATURES, ENRICO_CREATURES_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(ENRICO_CREATURES, ENRICO_CREATURES_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_ENRICO_CREPITUS); gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_CREATURES; return; // avoid any other E-mail at the same time } @@ -261,21 +261,21 @@ void HandleEnricoEmail(void) if ((ubCurrentProgress >= SOME_PROGRESS_THRESHOLD) && !(gStrategicStatus.usEnricoEmailFlags & ENRICO_EMAIL_SENT_SOME_PROGRESS)) { - AddEmail(ENRICO_PROG_20, ENRICO_PROG_20_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(ENRICO_PROG_20, ENRICO_PROG_20_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_ENRICO_PROGRESS); gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_SOME_PROGRESS; return; // avoid any setback E-mail at the same time } if ((ubCurrentProgress >= ABOUT_HALFWAY_THRESHOLD) && !(gStrategicStatus.usEnricoEmailFlags & ENRICO_EMAIL_SENT_ABOUT_HALFWAY)) { - AddEmail(ENRICO_PROG_55, ENRICO_PROG_55_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(ENRICO_PROG_55, ENRICO_PROG_55_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_ENRICO_GOODWORK); gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_ABOUT_HALFWAY; return; // avoid any setback E-mail at the same time } if ((ubCurrentProgress >= NEARLY_DONE_THRESHOLD) && !(gStrategicStatus.usEnricoEmailFlags & ENRICO_EMAIL_SENT_NEARLY_DONE)) { - AddEmail(ENRICO_PROG_80, ENRICO_PROG_80_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(ENRICO_PROG_80, ENRICO_PROG_80_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_ENRICO_FINALPUSH); gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_NEARLY_DONE; return; // avoid any setback E-mail at the same time } @@ -285,7 +285,7 @@ void HandleEnricoEmail(void) (((ubHighestProgress - ubCurrentProgress) >= MINOR_SETBACK_THRESHOLD) && (gStrategicStatus.usEnricoEmailFlags & ENRICO_EMAIL_FLAG_SETBACK_OVER))) && !(gStrategicStatus.usEnricoEmailFlags & ENRICO_EMAIL_SENT_MAJOR_SETBACK)) { - AddEmail(ENRICO_SETBACK, ENRICO_SETBACK_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(ENRICO_SETBACK, ENRICO_SETBACK_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_ENRICO_BADNEWS); gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_MAJOR_SETBACK; } else @@ -293,7 +293,7 @@ void HandleEnricoEmail(void) if (((ubHighestProgress - ubCurrentProgress) >= MINOR_SETBACK_THRESHOLD) && !(gStrategicStatus.usEnricoEmailFlags & (ENRICO_EMAIL_SENT_MINOR_SETBACK | ENRICO_EMAIL_SENT_MAJOR_SETBACK))) { - AddEmail(ENRICO_SETBACK_2, ENRICO_SETBACK_2_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(ENRICO_SETBACK_2, ENRICO_SETBACK_2_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_ENRICO_SETBACK); gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_MINOR_SETBACK; } else @@ -356,15 +356,15 @@ void HandleEnricoEmail(void) switch( bComplaint ) { case 3: - AddEmail(LACK_PLAYER_PROGRESS_3, LACK_PLAYER_PROGRESS_3_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(LACK_PLAYER_PROGRESS_3, LACK_PLAYER_PROGRESS_3_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_ENRICO_DISAPPOINTED); gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_LACK_PROGRESS3; break; case 2: - AddEmail(LACK_PLAYER_PROGRESS_2, LACK_PLAYER_PROGRESS_2_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(LACK_PLAYER_PROGRESS_2, LACK_PLAYER_PROGRESS_2_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_ENRICO_WORRIED); gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_LACK_PROGRESS2; break; default: - AddEmail(LACK_PLAYER_PROGRESS_1, LACK_PLAYER_PROGRESS_1_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(LACK_PLAYER_PROGRESS_1, LACK_PLAYER_PROGRESS_1_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_ENRICO_CONCERNED); gStrategicStatus.usEnricoEmailFlags |= ENRICO_EMAIL_SENT_LACK_PROGRESS1; break; diff --git a/Tactical/Campaign.cpp b/Tactical/Campaign.cpp index 4c71810f9..41922cbc0 100644 --- a/Tactical/Campaign.cpp +++ b/Tactical/Campaign.cpp @@ -1352,13 +1352,13 @@ void HandleUnhiredMercDeaths( INT32 iProfileID ) { if ( gMercProfiles[iProfileID].Type == PROFILETYPE_AIM && gGameUBOptions.fDeadMerc == TRUE ) //new profiles by Jazz //send an email to the player telling the player that a merc died - AddEmailWithSpecialData(206, MERC_DIED_ON_OTHER_ASSIGNMENT_LENGTH, AIM_SITE, GetWorldTotalMin(), 0, iProfileID, TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT, TYPE_E_AIM_L1 ); + AddEmailWithSpecialData(206, MERC_DIED_ON_OTHER_ASSIGNMENT_LENGTH, AIM_SITE, GetWorldTotalMin(), 0, iProfileID, TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT, TYPE_E_AIM_L1, XML_AIM_NOTICE_OF_DEATH); } #else if ( gMercProfiles[iProfileID].Type == PROFILETYPE_AIM ) { //send an email to the player telling the player that a merc died - AddEmailWithSpecialData(MERC_DIED_ON_OTHER_ASSIGNMENT, MERC_DIED_ON_OTHER_ASSIGNMENT_LENGTH, AIM_SITE, GetWorldTotalMin(), 0, iProfileID, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE ); + AddEmailWithSpecialData(MERC_DIED_ON_OTHER_ASSIGNMENT, MERC_DIED_ON_OTHER_ASSIGNMENT_LENGTH, AIM_SITE, GetWorldTotalMin(), 0, iProfileID, TYPE_EMAIL_EMAIL_EDT, TYPE_E_NONE, XML_AIM_NOTICE_OF_DEATH); } #endif } diff --git a/Tactical/End Game.cpp b/Tactical/End Game.cpp index ad509af73..af6af61ff 100644 --- a/Tactical/End Game.cpp +++ b/Tactical/End Game.cpp @@ -507,37 +507,37 @@ void HandleAddingTheEndGameEmails() // email # 12a - Miguel dead, Manuel never recruited if( !fMiguelAlive && !fManuelHired ) { - AddEmail( EMAIL_CONGRATS, EMAIL_CONGRATS_LENGTH, MAIL_ENRICO, GetWorldTotalMin(),-1 ,-1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(EMAIL_CONGRATS, EMAIL_CONGRATS_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_JA2UB_ENRICO_CONGRATS); } // email # 12b - Miguel alive, Manuel never recruited else if( fMiguelAlive && !fManuelHired ) { - AddEmail( EMAIL_CONGRATSICK, EMAIL_CONGRATSICK_LENGTH, MAIL_ENRICO, GetWorldTotalMin(),-1 ,-1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(EMAIL_CONGRATSICK, EMAIL_CONGRATSICK_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_JA2UB_ENRICO_CONGRATS_MIGUELSICK); } // email # 12c - Miguel alive, Manuel dead else if( fMiguelAlive && !fManuelAlive ) { - AddEmail( EMAIL_CONGRATMIGMANUELDEAD, EMAIL_CONGRATMIGMANUELDEAD_LENGTH, MAIL_ENRICO, GetWorldTotalMin() , -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(EMAIL_CONGRATMIGMANUELDEAD, EMAIL_CONGRATMIGMANUELDEAD_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_JA2UB_ENRICO_CONGRATS_MIGUELSICK_MANUELDEAD); } // email # 12d - Miguel alive, Manuel recruited and alive else if( fMiguelAlive && fManuelAlive && fManuelHired ) { - AddEmail( EMAIL_CONGRATMIGMANUELALIVE, EMAIL_CONGRATMIGMANUELALIVE_LENGTH, MAIL_ENRICO, GetWorldTotalMin() , -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(EMAIL_CONGRATMIGMANUELALIVE, EMAIL_CONGRATMIGMANUELALIVE_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_JA2UB_ENRICO_CONGRATS_MIGUELSICK_MANUELALIVE); } // email # 12e - Miguel dead, Manuel dead else if( !fMiguelAlive && !fManuelAlive ) { - AddEmail( EMAIL_CONGRATMANUELDEAD, EMAIL_CONGRATMANUELDEAD_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1 , -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(EMAIL_CONGRATMANUELDEAD, EMAIL_CONGRATMANUELDEAD_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_JA2UB_ENRICO_CONGRATS_MANUELDEAD); } // email # 12f - Miguel dead, Manuel recruited and alive else if( !fMiguelAlive && fManuelAlive && fManuelHired ) { - AddEmail( EMAIL_CONGRATMANUELALIVE, EMAIL_CONGRATMANUELALIVE_LENGTH, MAIL_ENRICO, GetWorldTotalMin() , -1, -1, TYPE_EMAIL_EMAIL_EDT); + AddEmail(EMAIL_CONGRATMANUELALIVE, EMAIL_CONGRATMANUELALIVE_LENGTH, MAIL_ENRICO, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_JA2UB_ENRICO_CONGRATS_MANUELALIVE); } else diff --git a/Tactical/Merc Hiring.cpp b/Tactical/Merc Hiring.cpp index e185bc8bd..40b91bf2f 100644 --- a/Tactical/Merc Hiring.cpp +++ b/Tactical/Merc Hiring.cpp @@ -458,13 +458,12 @@ void MercArrivesCallback( SoldierID ubSoldierID ) { pSoldier->uiTimeSoldierWillArrive = pSoldier->uiTimeSoldierWillArrive + 720 + Random ( 720 ); AddStrategicEvent( EVENT_DELAYED_HIRING_OF_MERC, pSoldier->uiTimeSoldierWillArrive, pSoldier->ubID ); - if(LaptopSaveInfo.ubJohnPossibleMissedFlights == 3 ) - AddEmail( JOHN_KULBA_MISSED_FLIGHT_1, JOHN_KULBA_MISSED_FLIGHT_1_LENGTH, JOHN_KULBA, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT ); - else if(LaptopSaveInfo.ubJohnPossibleMissedFlights == 2 ) - AddEmail( JOHN_KULBA_MISSED_FLIGHT_2, JOHN_KULBA_MISSED_FLIGHT_2_LENGTH, JOHN_KULBA, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT ); - else if(LaptopSaveInfo.ubJohnPossibleMissedFlights == 1 ) - AddEmail( JOHN_KULBA_MISSED_FLIGHT_3, JOHN_KULBA_MISSED_FLIGHT_3_LENGTH, JOHN_KULBA, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT ); - + if ( LaptopSaveInfo.ubJohnPossibleMissedFlights == 3 ) + AddEmail(JOHN_KULBA_MISSED_FLIGHT_1, JOHN_KULBA_MISSED_FLIGHT_1_LENGTH, JOHN_KULBA, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_JOHNKULBA_MISSEDTRANSFERFLIGHT); + else if ( LaptopSaveInfo.ubJohnPossibleMissedFlights == 2 ) + AddEmail(JOHN_KULBA_MISSED_FLIGHT_2, JOHN_KULBA_MISSED_FLIGHT_2_LENGTH, JOHN_KULBA, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_JOHNKULBA_CRASHLANDEDHELI); + else if ( LaptopSaveInfo.ubJohnPossibleMissedFlights == 1 ) + AddEmail(JOHN_KULBA_MISSED_FLIGHT_3, JOHN_KULBA_MISSED_FLIGHT_3_LENGTH, JOHN_KULBA, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_EMAIL_EDT, XML_JOHNKULBA_AMBUSHEDBYCATS); LaptopSaveInfo.ubJohnPossibleMissedFlights--; return; } From fe69dba95808364793af4697f81fa51a3c6cf6d5 Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Sat, 3 Jan 2026 13:31:21 +0200 Subject: [PATCH 05/18] Add missing email --- Laptop/email.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Laptop/email.h b/Laptop/email.h index a2233db05..0ec7a839e 100644 --- a/Laptop/email.h +++ b/Laptop/email.h @@ -761,7 +761,8 @@ enum { XML_JA2UB_ENRICO_GOODNEWS, XML_JA2UB_ENRICO_CONCERNED, XML_JA2UB_ENRICO_URGENT, - XML_JA2UB_ENRICO_PILOTTROUBLE, + XML_JA2UB_ENRICO_RECEIVEDEMAIL, + XML_JA2UB_ENRICO_RECEIVEDEMAILMONEY, XML_JA2UB_ENRICO_PILOTFOUND, XML_JA2UB_ENRICO_CONGRATS, XML_JA2UB_ENRICO_CONGRATS_MIGUELSICK, From 5ed79c3edbad8b7dfb6f0826821c306e87e45469 Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Sat, 3 Jan 2026 14:01:13 +0200 Subject: [PATCH 06/18] Fix email sorting * Simplify pSubject copying else ifs * Formatting --- Laptop/email.cpp | 365 +++++++++++++++++++++++------------------------ 1 file changed, 178 insertions(+), 187 deletions(-) diff --git a/Laptop/email.cpp b/Laptop/email.cpp index 8cb24da5b..676cd046d 100644 --- a/Laptop/email.cpp +++ b/Laptop/email.cpp @@ -1370,217 +1370,208 @@ void AddMessageToPages(INT32 iMessageId) return; } -void SortMessages(INT32 iCriteria) +static void SortMessages(INT32 iCriteria) { - EmailPtr pA=pEmailList; - EmailPtr pB=pEmailList; - CHAR16 pSubjectA[256]; - CHAR16 pSubjectB[256]; + EmailPtr pA = pEmailList; + EmailPtr pB = pEmailList; + CHAR16 pSubjectA[256]; + CHAR16 pSubjectB[256]; - // no messages to sort? - if( ( pA == NULL) ||( pB == NULL ) ) - { - return; - } + // no messages to sort? + if ( (pA == NULL) || (pB == NULL) ) + { + return; + } - // nothing here either? - if(!pA->Next) - return; + // nothing here either? + if ( !pA->Next ) + return; - pB=pA->Next; - switch(iCriteria) - { - case RECEIVED: - while(pA) - { + pB = pA->Next; + switch ( iCriteria ) + { + case RECEIVED: + while ( pA ) + { + // set B to next in A + pB = pA->Next; + while ( pB ) + { - // 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); - } + 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 B's list + pB = pB->Next; + } - // next in A's List - pA=pA->Next; - } - break; - case SENDER: - while(pA) - { + // 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); - 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) - { + // 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; - pB = pA->Next; - while(pB) - { - // clear out control codes - CleanOutControlCodesFromString( pA->pSubject, pSubjectA ); - CleanOutControlCodesFromString( pB->pSubject, pSubjectB ); + 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); - // 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; + // next in B's list + pB = pB->Next; + } + // next in A's List + pA = pA->Next; + } + break; + } - case READ: - while(pA) - { + // place new list into pages of email + //PlaceMessagesinPages(); - 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; + // 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) ); + // 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 ); + 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; + if ( !pA->Next ) + return; + //find pA + while ( pA->iId != iIdA ) + pA = pA->Next; + // find pB + while ( pB->iId != iIdB ) + pB = pB->Next; - // swap + // 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 if ( pA->EmailVersion == TYPE_EMAIL_OTHER ) - wcscpy(pTemp->pSubject,EmailOtherText[pA->usLength].szSubject); - else if ( pA->EmailVersion == TYPE_EMAIL_BOBBY_R || pA->EmailVersion == TYPE_EMAIL_BOBBY_R_EMAIL_JA2_EDT ) - wcscpy(pTemp->pSubject,pA->pSubject); - else if ( pA->EmailVersion == TYPE_EMAIL_EMAIL_EDT || pA->EmailVersion == TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT || pA->EmailVersion == TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT ) - wcscpy(pTemp->pSubject,pA->pSubject); + // 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; - // 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); + 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 if ( pA->EmailVersion == TYPE_EMAIL_OTHER ) + wcscpy(pTemp->pSubject, EmailOtherText[pA->usLength].szSubject); + else + wcscpy(pTemp->pSubject, pA->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 if ( pB->EmailVersion == TYPE_EMAIL_OTHER ) - wcscpy(pB->pSubject,EmailOtherText[pTemp->usLength].szSubject); - else if ( pB->EmailVersion == TYPE_EMAIL_BOBBY_R || pB->EmailVersion == TYPE_EMAIL_BOBBY_R_EMAIL_JA2_EDT ) - wcscpy(pB->pSubject, pTemp->pSubject); - else if ( pB->EmailVersion == TYPE_EMAIL_EMAIL_EDT || pB->EmailVersion == TYPE_EMAIL_INSURANCE_COMPANY_EMAIL_JA2_EDT || pB->EmailVersion == TYPE_EMAIL_DEAD_MERC_AIM_SITE_EMAIL_JA2_EDT ) - wcscpy(pB->pSubject, pTemp->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); - // free up memory - MemFree(pTemp->pSubject); - MemFree( pTemp ); + // 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 if ( pB->EmailVersion == TYPE_EMAIL_OTHER ) + wcscpy(pB->pSubject, EmailOtherText[pTemp->usLength].szSubject); + else + wcscpy(pB->pSubject, pTemp->pSubject); + + // free up memory + MemFree(pTemp->pSubject); + MemFree(pTemp); } void ClearPages() From 622cffce826b1456a8a91c72e655237129aaf108 Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Sat, 3 Jan 2026 14:07:13 +0200 Subject: [PATCH 07/18] Use #define instead of magic numbers --- Laptop/email.cpp | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/Laptop/email.cpp b/Laptop/email.cpp index 676cd046d..10930e407 100644 --- a/Laptop/email.cpp +++ b/Laptop/email.cpp @@ -34,7 +34,6 @@ #endif #define EMAIL_EDT_CUSTOM_FILE "BINARYDATA\\Email_Custom.edt" -void AddCustomEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition); using namespace std; @@ -663,12 +662,12 @@ void RenderEmail( void ) //-----------Custom email void AddCustomEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType ) { - CHAR16 pSubject[320]; + CHAR16 pSubject[MAIL_STRING_SIZE]; //MessagePtr pMessageList; //MessagePtr pMessage; //CHAR16 pMessageString[320]; - LoadEncryptedDataFromFile(EMAIL_EDT_CUSTOM_FILE, pSubject, 640*(iMessageOffset), 640); + LoadEncryptedDataFromFile(EMAIL_EDT_CUSTOM_FILE, 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 ); @@ -691,7 +690,7 @@ void AddEmailWithSpecialData(INT32 iMessageOffset, INT32 iMessageLength, UINT8 u } else { - CHAR16 pSubject[320]; + CHAR16 pSubject[MAIL_STRING_SIZE]; Email FakeEmail; // starts at iSubjectOffset amd goes iSubjectLength, reading in string #ifdef JA2UB @@ -699,19 +698,19 @@ void AddEmailWithSpecialData(INT32 iMessageOffset, INT32 iMessageLength, UINT8 u { if ( FileExists(EMAIL_EDT_FILE_JA25) ) { - LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, pSubject, 640 * (iMessageOffset), 640); + LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE); } else { - LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, 640 * (iMessageOffset), 640); + 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, 640 * (iMessageOffset), 640); + LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE); } #else - LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, 640 * (iMessageOffset), 640); + 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 ) @@ -737,7 +736,7 @@ void AddEmailWithSpecialData(INT32 iMessageOffset, INT32 iMessageLength, UINT8 u //--- 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[640]; + CHAR16 pSubject[MAIL_STRING_SIZE]; Email FakeEmail; if ( iMessageOffset < gEmails.size() ) @@ -861,13 +860,13 @@ void AddEmailFromXML(INT32 iMessageOffset, INT32 iDate, INT32 iCurrentIMPPositio #ifdef JA2UB void AddBobbyREmailJA2(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType ) { - CHAR16 pSubject[640]; + CHAR16 pSubject[MAIL_STRING_SIZE]; UINT8 subjectLine = 0; //MessagePtr pMessageList; //MessagePtr pMessage; //CHAR16 pMessageString[320]; - LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, 640*(iMessageOffset), 640); + 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); @@ -916,7 +915,7 @@ void AddEmailWFMercAvailable(INT32 iMessageOffset, INT32 iMessageLength, UINT8 u void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType, UINT16 EnumEmailXML) { - CHAR16 pSubject[640]; + CHAR16 pSubject[MAIL_STRING_SIZE]; UINT8 subjectLine = 0; if ( EnumEmailXML != XML_NOEMAIL && gEmails.size() > 0 ) @@ -929,13 +928,13 @@ void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 if ( EmailType == TYPE_EMAIL_EMAIL_EDT ) { if ( FileExists(EMAIL_EDT_FILE_JA25) ) - LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, pSubject, 640 * (iMessageOffset), 640); + LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE); else - LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, 640 * (iMessageOffset), 640); + 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, 640 * (iMessageOffset), 640); + LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE); } else if ( EmailType == TYPE_EMAIL_BOBBY_R ) { @@ -951,7 +950,7 @@ void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 #else // WANNE: Short work in both ways - LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, 640 * (iMessageOffset), 640); + 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 @@ -968,19 +967,19 @@ void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 void AddPreReadEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, UINT8 EmailType) { - CHAR16 pSubject[640]; + 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, 640 * (iMessageOffset), 640); + LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA25, pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE); else - LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, 640 * (iMessageOffset), 640); + 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, 640 * (iMessageOffset), 640); + LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, MAIL_STRING_SIZE * (iMessageOffset), MAIL_STRING_SIZE); } // add message to list @@ -989,7 +988,7 @@ void AddPreReadEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, #else // starts at iSubjectOffset amd goes iSubjectLength, reading in string - LoadEncryptedDataFromFile("BINARYDATA\\Email.edt", pSubject, 640 * (iMessageOffset), 640); + 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 From 6b7bc51a529e8267b89d1dd7c5c636240819bc59 Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Sat, 3 Jan 2026 14:09:45 +0200 Subject: [PATCH 08/18] Remove commented out variables --- Laptop/email.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Laptop/email.cpp b/Laptop/email.cpp index 10930e407..486a4c9ee 100644 --- a/Laptop/email.cpp +++ b/Laptop/email.cpp @@ -663,9 +663,6 @@ void RenderEmail( void ) void AddCustomEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType ) { CHAR16 pSubject[MAIL_STRING_SIZE]; - //MessagePtr pMessageList; - //MessagePtr pMessage; - //CHAR16 pMessageString[320]; LoadEncryptedDataFromFile(EMAIL_EDT_CUSTOM_FILE, pSubject, MAIL_STRING_SIZE*(iMessageOffset), MAIL_STRING_SIZE); // add message to list @@ -862,9 +859,6 @@ void AddBobbyREmailJA2(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSende { CHAR16 pSubject[MAIL_STRING_SIZE]; UINT8 subjectLine = 0; - //MessagePtr pMessageList; - //MessagePtr pMessage; - //CHAR16 pMessageString[320]; LoadEncryptedDataFromFile(EMAIL_EDT_FILE_JA2, pSubject, MAIL_STRING_SIZE*(iMessageOffset), MAIL_STRING_SIZE); From ebcc5449c5198a875faf828ef369d579df26d5fc Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Sat, 3 Jan 2026 14:11:02 +0200 Subject: [PATCH 09/18] Make functions static --- Laptop/email.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Laptop/email.cpp b/Laptop/email.cpp index 486a4c9ee..1fdc77570 100644 --- a/Laptop/email.cpp +++ b/Laptop/email.cpp @@ -355,7 +355,7 @@ extern INT16 gusCurShipmentDestinationID; extern CPostalService gPostalService; -void InitializeMouseRegions() +static void InitializeMouseRegions() { INT32 iCounter=0; @@ -373,7 +373,7 @@ void InitializeMouseRegions() CreateDestroyNextPreviousRegions(); } -void DeleteEmailMouseRegions() +static void DeleteEmailMouseRegions() { // this function will remove the mouse regions added @@ -1242,7 +1242,7 @@ EmailPtr GetEmailMessage(INT32 iId) } -void AddEmailPage() +static void AddEmailPage() { // simple adds a page to the list PagePtr pPage=pPageList; @@ -1282,7 +1282,7 @@ void AddEmailPage() } -void RemoveEmailPage(INT32 iPageId) +static void RemoveEmailPage(INT32 iPageId) { PagePtr pPage=pPageList; PagePtr pTempPage=NULL; @@ -1567,7 +1567,7 @@ void SwapMessages(INT32 iIdA, INT32 iIdB) MemFree(pTemp); } -void ClearPages() +static void ClearPages() { // run through list of message pages and set to -1 PagePtr pPage=pPageList; @@ -1606,7 +1606,7 @@ void PlaceMessagesinPages() return; } -void DisplayMessageList(INT32 iPageNum) +static void DisplayMessageList(INT32 iPageNum) { // will display page with idNumber iPageNum PagePtr pPage=pPageList; @@ -1619,7 +1619,7 @@ void DisplayMessageList(INT32 iPageNum) // found page show it } -void DrawLetterIcon(INT32 iCounter, BOOLEAN fRead) +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 @@ -1634,7 +1634,7 @@ void DrawLetterIcon(INT32 iCounter, BOOLEAN fRead) BltVideoObject(FRAME_BUFFER, hHandle, 1,INDIC_X, (MIDDLE_Y+iCounter*MIDDLE_WIDTH+2), VO_BLT_SRCTRANSPARENCY,NULL); } -void DrawSubject(INT32 iCounter, STR16 pSubject, BOOLEAN fRead) +static void DrawSubject(INT32 iCounter, STR16 pSubject, BOOLEAN fRead) { CHAR16 pTempSubject[320]; @@ -1676,7 +1676,7 @@ void DrawSubject(INT32 iCounter, STR16 pSubject, BOOLEAN fRead) SetFontDestBuffer(FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE ); } -void DrawSender(INT32 iCounter, UINT8 ubSender, BOOLEAN fRead, UINT8 EmailType) +static void DrawSender(INT32 iCounter, UINT8 ubSender, BOOLEAN fRead, UINT8 EmailType) { // draw name of sender in mail viewer SetFontShadow(NO_SHADOW); @@ -1717,7 +1717,7 @@ void DrawSender(INT32 iCounter, UINT8 ubSender, BOOLEAN fRead, UINT8 EmailType) SetFontShadow(DEFAULT_SHADOW); } -void DrawDate(INT32 iCounter, INT32 iDate, BOOLEAN fRead) +static void DrawDate(INT32 iCounter, INT32 iDate, BOOLEAN fRead) { CHAR16 sString[20]; @@ -1947,7 +1947,7 @@ void EmailMvtCallBack(MOUSE_REGION * pRegion, INT32 iReason ) } } -void BtnMessageXCallback(GUI_BUTTON *btn,INT32 reason) +static void BtnMessageXCallback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; @@ -2232,7 +2232,7 @@ INT32 DisplayEmailMessage(EmailPtr pMail) return iViewerPositionY; } -void BtnNewOkback(GUI_BUTTON *btn,INT32 reason) +static void BtnNewOkback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; @@ -2488,7 +2488,7 @@ void ReDrawNewMailBox( void ) } } -void SwitchEmailPages( void ) +static void SwitchEmailPages( void ) { // this function will switch current page @@ -2672,7 +2672,7 @@ void PreviousRegionButtonCallback(GUI_BUTTON *btn,INT32 reason) } } -void BtnDeleteNoback(GUI_BUTTON *btn,INT32 reason) +static void BtnDeleteNoback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; @@ -2695,7 +2695,7 @@ void BtnDeleteNoback(GUI_BUTTON *btn,INT32 reason) } } -void BtnDeleteYesback(GUI_BUTTON *btn,INT32 reason) +static void BtnDeleteYesback(GUI_BUTTON *btn,INT32 reason) { if (!(btn->uiFlags & BUTTON_ENABLED)) return; From 96de96e9c6cb42e58113098f05c34861726e8b3b Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Sat, 3 Jan 2026 14:13:13 +0200 Subject: [PATCH 10/18] Remove unused includes * Formatting --- Laptop/email.cpp | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/Laptop/email.cpp b/Laptop/email.cpp index 1fdc77570..9d4d3cc84 100644 --- a/Laptop/email.cpp +++ b/Laptop/email.cpp @@ -1,27 +1,25 @@ - #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 "finances.h" - #include "PostalService.h" - #include "faces.h" - #include "GameSettings.h" - #include +#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 "strategicmap.h" #include "message.h" #ifdef JA2UB From 6f6aadf89cc073658c26bc1e1955154ee74a1e7d Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Sat, 3 Jan 2026 14:26:49 +0200 Subject: [PATCH 11/18] Remove unused & unfinished email externalizations --- Laptop/email.cpp | 42 +++------------------------------------ Laptop/email.h | 3 --- Strategic/LuaInitNPCs.cpp | 16 --------------- 3 files changed, 3 insertions(+), 58 deletions(-) diff --git a/Laptop/email.cpp b/Laptop/email.cpp index 9d4d3cc84..44f5f2d56 100644 --- a/Laptop/email.cpp +++ b/Laptop/email.cpp @@ -256,7 +256,6 @@ 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]; -EMAIL_MERC_INSURANCE_VALUES EmailInsuranceText[NUM_PROFILES]; BOOLEAN ReadXMLEmail = TRUE; // TRUE - read email from XML, FALSE - read email from EDT EMAIL_TYPE gEmailT[EMAIL_VAL]; std::vector gEmails{}; @@ -808,18 +807,6 @@ void AddEmailTypeXML( INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender if (EmailMercLevelUpText[ubSender].szSubject !='\0') wcscpy( pSubject, EmailMercLevelUpText[ubSender].szSubject ); } - /* - else if ( EmailType == TYPE_EMAIL_BOBBY_R ) - { - if (EmailBobbyRText[0] !='\0') - wcscpy( pSubject, EmailBobbyRText[0] ); - } - */ - else if ( EmailType == TYPE_EMAIL_OTHER ) - { - if (EmailOtherText[ubSender].szSubject !='\0') - wcscpy( pSubject, EmailOtherText[ubSender].szSubject ); - } AddEmailMessage(iMessageOffset,iMessageLength, pSubject, iDate, ubSender, FALSE, 0, 0, 0, 0, 0, 0, iCurrentIMPPosition, -1, EmailType, TYPE_E_NONE); @@ -1525,8 +1512,6 @@ void SwapMessages(INT32 iIdA, INT32 iIdB) wcscpy(pTemp->pSubject, EmailMercAvailableText[pA->ubSender].szSubject); else if ( pA->EmailVersion == TYPE_EMAIL_MERC_LEVEL_UP ) wcscpy(pTemp->pSubject, EmailMercLevelUpText[pA->ubSender].szSubject); - else if ( pA->EmailVersion == TYPE_EMAIL_OTHER ) - wcscpy(pTemp->pSubject, EmailOtherText[pA->usLength].szSubject); else wcscpy(pTemp->pSubject, pA->pSubject); @@ -1555,8 +1540,6 @@ void SwapMessages(INT32 iIdA, INT32 iIdB) wcscpy(pB->pSubject, EmailMercAvailableText[pTemp->ubSender].szSubject); else if ( pB->EmailVersion == TYPE_EMAIL_MERC_LEVEL_UP ) wcscpy(pB->pSubject, EmailMercLevelUpText[pTemp->ubSender].szSubject); - else if ( pB->EmailVersion == TYPE_EMAIL_OTHER ) - wcscpy(pB->pSubject, EmailOtherText[pTemp->usLength].szSubject); else wcscpy(pB->pSubject, pTemp->pSubject); @@ -1699,7 +1682,7 @@ static void DrawSender(INT32 iCounter, UINT8 ubSender, BOOLEAN fRead, UINT8 Emai 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_OTHER || EmailType == TYPE_EMAIL_XML ) + 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]); } @@ -1792,7 +1775,7 @@ void DisplayEmailList() 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 || pEmail->EmailVersion == TYPE_EMAIL_OTHER ) + 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); @@ -3211,7 +3194,7 @@ void DisplayEmailMessageSubjectDateFromLines( EmailPtr pMail , INT32 iViewerY) 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_OTHER || pMail->EmailVersion == TYPE_EMAIL_XML) + 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]); } @@ -5579,11 +5562,6 @@ void PreProcessEmail( EmailPtr pMail ) iEmailInsurance = pMail->usLength; pMail->usLength = 2; } - else if ( pMail->EmailVersion == TYPE_EMAIL_OTHER ) - { - iEmailOther = pMail->usLength; - //pMail->usLength = 6; - } // list doesn't exist, reload if( !pTempRecord ) @@ -5615,13 +5593,6 @@ void PreProcessEmail( EmailPtr pMail ) LoadEncryptedDataFromFile( "BINARYDATA\\Email.edt", pString, MAIL_STRING_SIZE * ( iOffSet + iCounter ), MAIL_STRING_SIZE ); #endif - else if ( pMail->EmailVersion == TYPE_EMAIL_OTHER ) - { - //if ( iCounter != 29 ) - wcscpy(pString, L"\0"); - wcscat( pString, EmailOtherText[iEmailOther].szMessage[pMail->usLength]); - // wcscat( pString, EmailOtherText[0].szMessage[1]); - } else if ( pMail->EmailVersion == TYPE_EMAIL_XML ) { wcscpy(pString, L"\0"); @@ -5735,11 +5706,6 @@ void PreProcessEmail( EmailPtr pMail ) wcscpy(pString, L"\0"); wcscpy( pString, EmailMercLevelUpText[iEmailMERCMessage].szMessage); } - else if ( pMail->EmailVersion == TYPE_EMAIL_INSURANCE_COMPANY ) - { - wcscpy(pString, L"\0"); - wcscpy( pString, EmailInsuranceText[iEmailMERCMessage].szMessage); - } /* else if ( pMail->EmailVersion == TYPE_EMAIL_BOBBY_R) { @@ -5787,8 +5753,6 @@ void PreProcessEmail( EmailPtr pMail ) pMail->usLength = iEmailAIMMessage; else if ( pMail->EmailVersion == TYPE_EMAIL_MERC_LEVEL_UP ) pMail->usLength = iEmailMERCMessage; - else if ( pMail->EmailVersion == TYPE_EMAIL_OTHER ) - pMail->usLength = iEmailOther; else if ( pMail->EmailVersion == TYPE_EMAIL_INSURANCE_COMPANY ) pMail->usLength = iEmailInsurance; diff --git a/Laptop/email.h b/Laptop/email.h index 0ec7a839e..72177753f 100644 --- a/Laptop/email.h +++ b/Laptop/email.h @@ -789,9 +789,6 @@ void AddEmailWithSpecialData(INT32 iMessageOffset, INT32 iMessageLength, UINT8 u extern EMAIL_MERC_AVAILABLE_VALUES EmailMercAvailableText[NUM_PROFILES]; extern EMAIL_MERC_LEVEL_UP_VALUES EmailMercLevelUpText[NUM_PROFILES]; -extern EMAIL_MERC_INSURANCE_VALUES EmailInsuranceText[NUM_PROFILES]; - -extern EMAIL_OTHER_VALUES EmailOtherText[EMAIL_INDEX]; extern BOOLEAN ReadXMLEmail; extern void AddEmailTypeXML( INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, UINT8 EmailType ); extern void AddPreReadEmailTypeXML( INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, UINT8 EmailType ); diff --git a/Strategic/LuaInitNPCs.cpp b/Strategic/LuaInitNPCs.cpp index 1e99451e9..1eedecd60 100644 --- a/Strategic/LuaInitNPCs.cpp +++ b/Strategic/LuaInitNPCs.cpp @@ -406,7 +406,6 @@ static int l_AddToShouldBecomeHostileOrSayQuoteList(lua_State* L); static int l_AddPreReadEmail(lua_State* L); static int l_AddEmail(lua_State* L); static int l_AddEmailXML(lua_State* L); -static int l_AddEmailXML2(lua_State* L); static int l_AddEmailLevelUpXML(lua_State* L); static int l_AddEmailFromXML(lua_State* L); @@ -1030,7 +1029,6 @@ static void IniFunction(lua_State* L, BOOLEAN bQuests) lua_register(L, "AddEmail", l_AddEmail); lua_register(L, "AddEmailMercAvailableXML", l_AddEmailXML); lua_register(L, "AddEmailMercLevelUpXML", l_AddEmailLevelUpXML); - lua_register(L, "AddEmailXML", l_AddEmailXML2); lua_register(L, "AddEmailFromXML", l_AddEmailFromXML); //------Time------ @@ -7450,20 +7448,6 @@ static int l_ExecuteStrategicAIAction(lua_State* L) return 0; } -//AddEmailXML -static int l_AddEmailXML2(lua_State* L) -{ - if (lua_gettop(L) >= 3) - { - INT32 offset = lua_tointeger(L, 1); - INT32 messagelength = lua_tointeger(L, 2); - UINT8 sender = lua_tointeger(L, 3); - - AddEmailTypeXML(offset, messagelength, sender, GetWorldTotalMin(), -1, TYPE_EMAIL_OTHER); - } - - return 0; -} //AddEmailXML static int l_AddEmailXML(lua_State* L) From 13689622445fd8d2cbf31978f9da701c4f46fe80 Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Sat, 3 Jan 2026 14:27:38 +0200 Subject: [PATCH 12/18] Rename function to be more descriptive --- Strategic/LuaInitNPCs.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Strategic/LuaInitNPCs.cpp b/Strategic/LuaInitNPCs.cpp index 1eedecd60..c1bd96461 100644 --- a/Strategic/LuaInitNPCs.cpp +++ b/Strategic/LuaInitNPCs.cpp @@ -405,7 +405,7 @@ static int l_AddToShouldBecomeHostileOrSayQuoteList(lua_State* L); static int l_AddPreReadEmail(lua_State* L); static int l_AddEmail(lua_State* L); -static int l_AddEmailXML(lua_State* L); +static int l_AddEmailMercAvailableXML(lua_State* L); static int l_AddEmailLevelUpXML(lua_State* L); static int l_AddEmailFromXML(lua_State* L); @@ -1027,7 +1027,7 @@ static void IniFunction(lua_State* L, BOOLEAN bQuests) lua_register(L, "AddPreReadEmail", l_AddPreReadEmail); lua_register(L, "AddEmail", l_AddEmail); - lua_register(L, "AddEmailMercAvailableXML", l_AddEmailXML); + lua_register(L, "AddEmailMercAvailableXML", l_AddEmailMercAvailableXML); lua_register(L, "AddEmailMercLevelUpXML", l_AddEmailLevelUpXML); lua_register(L, "AddEmailFromXML", l_AddEmailFromXML); @@ -7450,7 +7450,7 @@ static int l_ExecuteStrategicAIAction(lua_State* L) //AddEmailXML -static int l_AddEmailXML(lua_State* L) +static int l_AddEmailMercAvailableXML(lua_State* L) { if (lua_gettop(L)) { From 1c86d96e9d0f076f4dd7584a47031e7bef1b12b1 Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Sat, 3 Jan 2026 14:39:32 +0200 Subject: [PATCH 13/18] Remove custom_email.edt Unfinished feature as far as I can tell and new emails will be easier to add via Emails.xml --- Laptop/email.cpp | 20 -------------------- Laptop/email.h | 4 ---- Strategic/LuaInitNPCs.cpp | 18 ------------------ 3 files changed, 42 deletions(-) diff --git a/Laptop/email.cpp b/Laptop/email.cpp index 44f5f2d56..25c709f02 100644 --- a/Laptop/email.cpp +++ b/Laptop/email.cpp @@ -31,8 +31,6 @@ #define EMAIL_EDT_FILE_JA2 "BINARYDATA\\Email.edt" #endif -#define EMAIL_EDT_CUSTOM_FILE "BINARYDATA\\Email_Custom.edt" - using namespace std; //static EmailPtr pEmailList; @@ -656,24 +654,6 @@ void RenderEmail( void ) // invalidate region to force update } -//-----------Custom email -void AddCustomEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType ) -{ - CHAR16 pSubject[MAIL_STRING_SIZE]; - - LoadEncryptedDataFromFile(EMAIL_EDT_CUSTOM_FILE, 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 ); - - // 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 AddEmailWithSpecialData(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iFirstData, UINT32 uiSecondData, UINT8 EmailType, UINT32 EmailAIM, UINT16 EnumEmailXML) diff --git a/Laptop/email.h b/Laptop/email.h index 72177753f..92b70ef20 100644 --- a/Laptop/email.h +++ b/Laptop/email.h @@ -586,8 +586,6 @@ void ReDisplayBoxes( void ); void ShutDownEmailList(); void AddMessageToPages(INT32 iMessageId); -void AddCustomEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition, INT16 iCurrentShipmentDestinationID, UINT8 EmailType); - #ifdef JA2BETAVERSION void AddAllEmails(); #endif @@ -681,8 +679,6 @@ enum { TYPE_EMAIL_JOHN_KULBA, TYPE_EMAIL_AIM_SITE, TYPE_EMAIL_XML, - - TYPE_EMAIL_OTHER, }; enum { diff --git a/Strategic/LuaInitNPCs.cpp b/Strategic/LuaInitNPCs.cpp index c1bd96461..49b110f9a 100644 --- a/Strategic/LuaInitNPCs.cpp +++ b/Strategic/LuaInitNPCs.cpp @@ -112,8 +112,6 @@ static int l_CheckMission(lua_State* L); void FatigueCharacter(SOLDIERTYPE* pSoldier); -static int l_AddCustomEmail(lua_State* L); - static int l_SetDefaultArrivalSector(lua_State* L); static int l_GetDefaultArrivalSector(lua_State* L); static int l_SetMercArrivalLocation(lua_State* L); @@ -1642,8 +1640,6 @@ static void IniFunction(lua_State* L, BOOLEAN bQuests) lua_register(L, "ReStartingGame", l_ReStartingGame); - lua_register(L, "AddCustomEmail", l_AddCustomEmail); - lua_register(L, "SetDefaultArrivalSector", l_SetDefaultArrivalSector); lua_register(L, "GetDefaultArrivalSector", l_GetDefaultArrivalSector); lua_register(L, "SetDefaultArrivalGridNo", l_SetMercArrivalLocation); @@ -2002,20 +1998,6 @@ static int l_SetHandleGlobalLoyaltyEvent(lua_State* L) return 0; } -static int l_AddCustomEmail(lua_State* L) -{ - if (lua_gettop(L) >= 3) - { - INT32 iMessageOffset = lua_tointeger(L, 1); - INT32 iMessageLength = lua_tointeger(L, 2); - UINT8 ubSender = lua_tointeger(L, 3); - - AddCustomEmail(iMessageOffset, iMessageLength, ubSender, GetWorldTotalMin(), -1, -1, TYPE_EMAIL_OTHER); - } - - return 0; -} - static int l_gMercProfileGearset(lua_State* L) { if (lua_gettop(L) >= 8) From d51f1e60885f433673682c8fe7a569599144571a Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Sat, 3 Jan 2026 14:39:43 +0200 Subject: [PATCH 14/18] Add comment --- Laptop/email.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Laptop/email.h b/Laptop/email.h index 92b70ef20..25e075caa 100644 --- a/Laptop/email.h +++ b/Laptop/email.h @@ -678,6 +678,7 @@ enum { TYPE_EMAIL_KING_PIN, TYPE_EMAIL_JOHN_KULBA, TYPE_EMAIL_AIM_SITE, + //Read message from Email\Emails.xml and sender read from Email\EmailSenderNameList.xml TYPE_EMAIL_XML, }; From 8d00a316c5c178e7e999bbf1d9337197e6a49691 Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Sat, 3 Jan 2026 14:42:19 +0200 Subject: [PATCH 15/18] Remove unused enum conditionals --- Laptop/email.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Laptop/email.cpp b/Laptop/email.cpp index 25c709f02..66d346f0b 100644 --- a/Laptop/email.cpp +++ b/Laptop/email.cpp @@ -5537,11 +5537,6 @@ void PreProcessEmail( EmailPtr pMail ) iEmailAIMMessage = pMail->usLength; pMail->usLength = 2; } - else if ( pMail->EmailVersion == TYPE_EMAIL_INSURANCE_COMPANY ) - { - iEmailInsurance = pMail->usLength; - pMail->usLength = 2; - } // list doesn't exist, reload if( !pTempRecord ) @@ -5733,8 +5728,6 @@ void PreProcessEmail( EmailPtr pMail ) pMail->usLength = iEmailAIMMessage; else if ( pMail->EmailVersion == TYPE_EMAIL_MERC_LEVEL_UP ) pMail->usLength = iEmailMERCMessage; - else if ( pMail->EmailVersion == TYPE_EMAIL_INSURANCE_COMPANY ) - pMail->usLength = iEmailInsurance; giPrevMessageId = giMessageId; } From cc984b09f625a8b5b3e0fd1e328b758f157ac967 Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Sat, 3 Jan 2026 16:59:31 +0200 Subject: [PATCH 16/18] Fix comparison check --- Laptop/email.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Laptop/email.cpp b/Laptop/email.cpp index 66d346f0b..9262e032b 100644 --- a/Laptop/email.cpp +++ b/Laptop/email.cpp @@ -877,7 +877,7 @@ void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 CHAR16 pSubject[MAIL_STRING_SIZE]; UINT8 subjectLine = 0; - if ( EnumEmailXML != XML_NOEMAIL && gEmails.size() > 0 ) + if ( EnumEmailXML != static_cast(XML_NOEMAIL) && gEmails.size() > 0 ) { AddEmailFromXML(EnumEmailXML, iDate, iCurrentIMPPosition, iCurrentShipmentDestinationID, false, -1, -1, iMessageOffset, -1, -1, -1); } From b1c076416cf916119abbb6281318a648e4e8ab77 Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Sun, 4 Jan 2026 14:57:29 +0200 Subject: [PATCH 17/18] Remove magic numbers --- Laptop/email.cpp | 8 +++++--- Laptop/email.h | 3 +-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Laptop/email.cpp b/Laptop/email.cpp index 9262e032b..10f1b2740 100644 --- a/Laptop/email.cpp +++ b/Laptop/email.cpp @@ -187,9 +187,11 @@ UINT32 guiEmailWarning; #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 ) * 20 +#define MAX_EMAIL_MESSAGE_PAGE_SIZE ( GetFontHeight( MESSAGE_FONT ) + MESSAGE_GAP ) * MAX_EMAIL_LINES + enum{ PREVIOUS_BUTTON=0, NEXT_BUTTON, @@ -5475,7 +5477,7 @@ UINT32 cnt; void PreProcessEmail( EmailPtr pMail ) { RecordPtr pTempRecord, pCurrentRecord, pLastRecord , pTempList; - CHAR16 pString[ 512 ]; + CHAR16 pString[MAIL_STRING_SIZE]; INT32 iCounter = 0, iHeight = 0, iOffSet = 0; BOOLEAN fGoingOffCurrentPage = FALSE; INT32 iYPositionOnPage = 0; diff --git a/Laptop/email.h b/Laptop/email.h index 25e075caa..100d8739c 100644 --- a/Laptop/email.h +++ b/Laptop/email.h @@ -5,8 +5,7 @@ #include "soldier profile type.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 MAX_MESSAGES_PAGE 18 // max number of emails per page in inbox //---ja25 ub #ifdef JA2UB From f3ce1d5ff9d3374234c0eb11877cbc46302963f9 Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Sat, 10 Jan 2026 16:37:14 +0200 Subject: [PATCH 18/18] Fix Tank suppression fire Code used wrong item to calculate recoil and burst APs causing the burst length loop to be stuck until the whole 2000 round mg magazine would be fired in one go. --- TacticalAI/DecideAction.cpp | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/TacticalAI/DecideAction.cpp b/TacticalAI/DecideAction.cpp index df27421ac..83becb945 100644 --- a/TacticalAI/DecideAction.cpp +++ b/TacticalAI/DecideAction.cpp @@ -8587,15 +8587,8 @@ INT8 ArmedVehicleDecideActionRed( SOLDIERTYPE *pSoldier) (fExtraClip || pSoldier->inv[BestShot.bWeaponIn][0]->data.gun.ubGunShotsLeft > gGameExternalOptions.ubAISuppressionMinimumMagSize) ) { // then do it! - - // if necessary, swap the usItem from holster into the hand position DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "ArmedVehicleDecideActionRed: suppression fire possible!" ); - if ( BestShot.bWeaponIn != HANDPOS ) - { - RearrangePocket( pSoldier, HANDPOS, BestShot.bWeaponIn, FOREVER ); - } - pSoldier->aiData.usActionData = BestShot.sTarget; pSoldier->bTargetLevel = BestShot.bTargetLevel; pSoldier->aiData.bAimTime = 0; @@ -8603,33 +8596,42 @@ INT8 ArmedVehicleDecideActionRed( SOLDIERTYPE *pSoldier) pSoldier->bDoBurst = 1; INT16 ubBurstAPs = 0; + INT16 totalUsedAPs = 0; FLOAT dTotalRecoil = 0; + auto& weapon = pSoldier->inv[BestShot.bWeaponIn]; + const auto remainingAmmo = weapon[0]->data.gun.ubGunShotsLeft; if ( UsingNewCTHSystem( ) ) { do { pSoldier->bDoAutofire++; - dTotalRecoil += AICalcRecoilForShot( pSoldier, &(pSoldier->inv[BestShot.bWeaponIn]), pSoldier->bDoAutofire ); - ubBurstAPs = CalcAPsToAutofire( pSoldier->CalcActionPoints( ), &(pSoldier->inv[BestShot.bWeaponIn]), pSoldier->bDoAutofire, pSoldier ); - } while ( pSoldier->bActionPoints >= BestShot.ubAPCost + ubBurstAPs && pSoldier->inv[pSoldier->ubAttackingHand][0]->data.gun.ubGunShotsLeft >= pSoldier->bDoAutofire - && dTotalRecoil <= 10.0f ); + dTotalRecoil += AICalcRecoilForShot( pSoldier, &weapon, pSoldier->bDoAutofire ); + ubBurstAPs = CalcAPsToAutofire( pSoldier->CalcActionPoints( ), &weapon, pSoldier->bDoAutofire, pSoldier ); + totalUsedAPs = BestShot.ubAPCost + ubBurstAPs; + } while ( pSoldier->bActionPoints >= totalUsedAPs && remainingAmmo >= pSoldier->bDoAutofire && dTotalRecoil <= 10.0f ); } else { do { pSoldier->bDoAutofire++; - ubBurstAPs = CalcAPsToAutofire( pSoldier->CalcActionPoints( ), &(pSoldier->inv[BestShot.bWeaponIn]), pSoldier->bDoAutofire, pSoldier ); - } while ( pSoldier->bActionPoints >= BestShot.ubAPCost + ubBurstAPs && - pSoldier->inv[pSoldier->ubAttackingHand][0]->data.gun.ubGunShotsLeft >= pSoldier->bDoAutofire && - GetAutoPenalty( &pSoldier->inv[pSoldier->ubAttackingHand], gAnimControl[pSoldier->usAnimState].ubEndHeight == ANIM_PRONE )*pSoldier->bDoAutofire <= 80 ); + ubBurstAPs = CalcAPsToAutofire( pSoldier->CalcActionPoints( ), &weapon, pSoldier->bDoAutofire, pSoldier ); + totalUsedAPs = BestShot.ubAPCost + ubBurstAPs; + } while ( pSoldier->bActionPoints >= totalUsedAPs && remainingAmmo >= pSoldier->bDoAutofire && + GetAutoPenalty( &weapon, gAnimControl[pSoldier->usAnimState].ubEndHeight == ANIM_PRONE )*pSoldier->bDoAutofire <= 80 ); } pSoldier->bDoAutofire--; // Make sure we decided to fire at least one shot! - ubBurstAPs = CalcAPsToAutofire( pSoldier->CalcActionPoints( ), &(pSoldier->inv[BestShot.bWeaponIn]), pSoldier->bDoAutofire, pSoldier ); + ubBurstAPs = CalcAPsToAutofire( pSoldier->CalcActionPoints( ), &weapon, pSoldier->bDoAutofire, pSoldier ); + + // if necessary, swap the usItem from holster into the hand position + if ( BestShot.bWeaponIn != HANDPOS ) + { + RearrangePocket( pSoldier, HANDPOS, BestShot.bWeaponIn, FOREVER ); + } // minimum 5 bullets if ( pSoldier->bDoAutofire >= 5 && pSoldier->bActionPoints >= BestShot.ubAPCost + ubBurstAPs )