diff --git a/Strategic/Map Screen Interface.cpp b/Strategic/Map Screen Interface.cpp index 07772ae9..a37e0e98 100644 --- a/Strategic/Map Screen Interface.cpp +++ b/Strategic/Map Screen Interface.cpp @@ -2017,53 +2017,27 @@ void UpdateCharRegionHelpText( void ) { // person (health/energy/morale) GetMoraleString( pSoldier, pMoraleStr ); - - if ( gGameOptions.fFoodSystem ) + + if ( pSoldier->bPoisonSum ) { - if ( pSoldier->bPoisonSum ) - { - INT8 bPoisonBandaged = pSoldier->bPoisonSum - pSoldier->bPoisonBleeding - pSoldier->bPoisonLife; - swprintf( sString, L"%s: %d/%d, %s: %d/%d/%d - %d, %s: %d/%d, %s: %s, %s: %d%s, %s: %d%s", - pMapScreenStatusStrings[ 0 ], pSoldier->stats.bLife, pSoldier->stats.bLifeMax, - pMapScreenStatusStrings[ 5 ], pSoldier->bPoisonBleeding, bPoisonBandaged, pSoldier->bPoisonLife, pSoldier->bPoisonSum, - pMapScreenStatusStrings[ 1 ], pSoldier->bBreath, pSoldier->bBreathMax, - pMapScreenStatusStrings[ 2 ], pMoraleStr, - pMapScreenStatusStrings[ 6 ], (INT32)(100*(pSoldier->bDrinkLevel - FOOD_MIN) / FOOD_HALF_RANGE), sSpecialCharacters[0], - pMapScreenStatusStrings[ 7 ], (INT32)(100*(pSoldier->bFoodLevel - FOOD_MIN) / FOOD_HALF_RANGE), sSpecialCharacters[0] ); - } - else - { - swprintf( sString, L"%s: %d/%d, %s: %d/%d, %s: %s, %s: %d%s, %s: %d%s", - pMapScreenStatusStrings[ 0 ], pSoldier->stats.bLife, pSoldier->stats.bLifeMax, - pMapScreenStatusStrings[ 1 ], pSoldier->bBreath, pSoldier->bBreathMax, - pMapScreenStatusStrings[ 2 ], pMoraleStr, - pMapScreenStatusStrings[ 6 ], (INT32)(100*(pSoldier->bDrinkLevel - FOOD_MIN) / FOOD_HALF_RANGE), sSpecialCharacters[0], - pMapScreenStatusStrings[ 7 ], (INT32)(100*(pSoldier->bFoodLevel - FOOD_MIN) / FOOD_HALF_RANGE), sSpecialCharacters[0] ); - } + INT8 bPoisonBandaged = pSoldier->bPoisonSum - pSoldier->bPoisonBleeding - pSoldier->bPoisonLife; + swprintf( sString, L"%s: %d/%d, %s: %d/%d/%d - %d, %s: %d/%d, %s: %s", + pMapScreenStatusStrings[ 0 ], pSoldier->stats.bLife, pSoldier->stats.bLifeMax, + pMapScreenStatusStrings[ 5 ], pSoldier->bPoisonBleeding, bPoisonBandaged, pSoldier->bPoisonLife, pSoldier->bPoisonSum, + pMapScreenStatusStrings[ 1 ], pSoldier->bBreath, pSoldier->bBreathMax, + pMapScreenStatusStrings[ 2 ], pMoraleStr ); } else { - if ( pSoldier->bPoisonSum ) - { - INT8 bPoisonBandaged = pSoldier->bPoisonSum - pSoldier->bPoisonBleeding - pSoldier->bPoisonLife; - swprintf( sString, L"%s: %d/%d, %s: %d/%d/%d - %d, %s: %d/%d, %s: %s", - pMapScreenStatusStrings[ 0 ], pSoldier->stats.bLife, pSoldier->stats.bLifeMax, - pMapScreenStatusStrings[ 5 ], pSoldier->bPoisonBleeding, bPoisonBandaged, pSoldier->bPoisonLife, pSoldier->bPoisonSum, - pMapScreenStatusStrings[ 1 ], pSoldier->bBreath, pSoldier->bBreathMax, - pMapScreenStatusStrings[ 2 ], pMoraleStr ); - } - else - { - swprintf( sString, L"%s: %d/%d, %s: %d/%d, %s: %s", - pMapScreenStatusStrings[ 0 ], pSoldier->stats.bLife, pSoldier->stats.bLifeMax, - pMapScreenStatusStrings[ 1 ], pSoldier->bBreath, pSoldier->bBreathMax, - pMapScreenStatusStrings[ 2 ], pMoraleStr ); - } + swprintf( sString, L"%s: %d/%d, %s: %d/%d, %s: %s", + pMapScreenStatusStrings[ 0 ], pSoldier->stats.bLife, pSoldier->stats.bLifeMax, + pMapScreenStatusStrings[ 1 ], pSoldier->bBreath, pSoldier->bBreathMax, + pMapScreenStatusStrings[ 2 ], pMoraleStr ); } + + pSoldier->PrintFoodDesc( sString, TRUE ); - { - pSoldier->PrintDiseaseDesc( sString, TRUE ); - } + pSoldier->PrintDiseaseDesc( sString, TRUE ); } } else diff --git a/Tactical/Food.cpp b/Tactical/Food.cpp index b07d7346..d24a83ae 100644 --- a/Tactical/Food.cpp +++ b/Tactical/Food.cpp @@ -295,10 +295,10 @@ void GetFoodSituation( SOLDIERTYPE *pSoldier, UINT8* pFoodSituation, UINT8* pWat for ( UINT8 i = FOOD_STUFFED; i < NUM_FOOD_MORALE_TYPES; ++i ) { - if ( pSoldier->bFoodLevel < FoodMoraleMods[i].bThreshold ) + if ( pSoldier->bFoodLevel <= FoodMoraleMods[i].bThreshold ) *pFoodSituation = i; - if ( pSoldier->bDrinkLevel < FoodMoraleMods[i].bThreshold ) + if ( pSoldier->bDrinkLevel <= FoodMoraleMods[i].bThreshold ) *pWaterSituation = i; } } diff --git a/Tactical/Interface Items.cpp b/Tactical/Interface Items.cpp index dd64de00..f276a924 100644 --- a/Tactical/Interface Items.cpp +++ b/Tactical/Interface Items.cpp @@ -14486,52 +14486,26 @@ void UpdateMercBodyRegionHelpText( ) // person (health/energy/morale) GetMoraleString( pSoldier, pMoraleStr ); - if ( gGameOptions.fFoodSystem ) + if ( pSoldier->bPoisonSum ) { - if ( pSoldier->bPoisonSum ) - { - INT8 bPoisonBandaged = pSoldier->bPoisonSum - pSoldier->bPoisonBleeding - pSoldier->bPoisonLife; - swprintf( sString, L"%s: %d/%d, %s: %d/%d/%d - %d, %s: %d/%d, %s: %s, %s: %d%s, %s: %d%s", - pMapScreenStatusStrings[0], pSoldier->stats.bLife, pSoldier->stats.bLifeMax, - pMapScreenStatusStrings[5], pSoldier->bPoisonBleeding, bPoisonBandaged, pSoldier->bPoisonLife, pSoldier->bPoisonSum, - pMapScreenStatusStrings[1], pSoldier->bBreath, pSoldier->bBreathMax, - pMapScreenStatusStrings[2], pMoraleStr, - pMapScreenStatusStrings[6], (INT32)(100 * (pSoldier->bDrinkLevel - FOOD_MIN) / FOOD_HALF_RANGE), sSpecialCharacters[0], - pMapScreenStatusStrings[7], (INT32)(100 * (pSoldier->bFoodLevel - FOOD_MIN) / FOOD_HALF_RANGE), sSpecialCharacters[0] ); - } - else - { - swprintf( sString, L"%s: %d/%d, %s: %d/%d, %s: %s, %s: %d%s, %s: %d%s", - pMapScreenStatusStrings[0], pSoldier->stats.bLife, pSoldier->stats.bLifeMax, - pMapScreenStatusStrings[1], pSoldier->bBreath, pSoldier->bBreathMax, - pMapScreenStatusStrings[2], pMoraleStr, - pMapScreenStatusStrings[6], (INT32)(100 * (pSoldier->bDrinkLevel - FOOD_MIN) / FOOD_HALF_RANGE), sSpecialCharacters[0], - pMapScreenStatusStrings[7], (INT32)(100 * (pSoldier->bFoodLevel - FOOD_MIN) / FOOD_HALF_RANGE), sSpecialCharacters[0] ); - } + INT8 bPoisonBandaged = pSoldier->bPoisonSum - pSoldier->bPoisonBleeding - pSoldier->bPoisonLife; + swprintf( sString, L"%s: %d/%d, %s: %d/%d/%d - %d, %s: %d/%d, %s: %s", + pMapScreenStatusStrings[0], pSoldier->stats.bLife, pSoldier->stats.bLifeMax, + pMapScreenStatusStrings[5], pSoldier->bPoisonBleeding, bPoisonBandaged, pSoldier->bPoisonLife, pSoldier->bPoisonSum, + pMapScreenStatusStrings[1], pSoldier->bBreath, pSoldier->bBreathMax, + pMapScreenStatusStrings[2], pMoraleStr ); } else { - if ( pSoldier->bPoisonSum ) - { - INT8 bPoisonBandaged = pSoldier->bPoisonSum - pSoldier->bPoisonBleeding - pSoldier->bPoisonLife; - swprintf( sString, L"%s: %d/%d, %s: %d/%d/%d - %d, %s: %d/%d, %s: %s", - pMapScreenStatusStrings[0], pSoldier->stats.bLife, pSoldier->stats.bLifeMax, - pMapScreenStatusStrings[5], pSoldier->bPoisonBleeding, bPoisonBandaged, pSoldier->bPoisonLife, pSoldier->bPoisonSum, - pMapScreenStatusStrings[1], pSoldier->bBreath, pSoldier->bBreathMax, - pMapScreenStatusStrings[2], pMoraleStr ); - } - else - { - swprintf( sString, L"%s: %d/%d, %s: %d/%d, %s: %s", - pMapScreenStatusStrings[0], pSoldier->stats.bLife, pSoldier->stats.bLifeMax, - pMapScreenStatusStrings[1], pSoldier->bBreath, pSoldier->bBreathMax, - pMapScreenStatusStrings[2], pMoraleStr ); - } + swprintf( sString, L"%s: %d/%d, %s: %d/%d, %s: %s", + pMapScreenStatusStrings[0], pSoldier->stats.bLife, pSoldier->stats.bLifeMax, + pMapScreenStatusStrings[1], pSoldier->bBreath, pSoldier->bBreathMax, + pMapScreenStatusStrings[2], pMoraleStr ); } - { - pSoldier->PrintDiseaseDesc( sString, TRUE ); - } + pSoldier->PrintFoodDesc( sString, TRUE ); + + pSoldier->PrintDiseaseDesc( sString, TRUE ); } } } diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index ff97255c..bb93a750 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -18904,6 +18904,110 @@ void SOLDIERTYPE::PrintDiseaseDesc( CHAR16* apStr, BOOLEAN fFullDesc ) } } +void SOLDIERTYPE::PrintFoodDesc( CHAR16* apStr, BOOLEAN fFullDesc ) +{ + if ( !gGameOptions.fFoodSystem ) + return; + + // only for living mercs with a profile with a valid infection method + if ( this->flags.uiStatusFlags & SOLDIER_VEHICLE || this->ubProfile == NO_PROFILE ) + return; + + CHAR16 atStr[500]; + swprintf( atStr, L"" ); + + UINT8 foodsituation; + UINT8 watersituation; + GetFoodSituation( this, &foodsituation, &watersituation ); + + INT8 bMoraleModifier_Food = FoodMoraleMods[foodsituation].bMoraleModifier; + INT8 bMoraleModifier_Water = FoodMoraleMods[watersituation].bMoraleModifier; + + INT8 bSleepModifier_Food = FoodMoraleMods[foodsituation].bSleepModifier; + INT8 bSleepModifier_Water = FoodMoraleMods[watersituation].bSleepModifier; + + INT8 bBreathRegenModifier_Food = FoodMoraleMods[foodsituation].bBreathRegenModifier; + INT8 bBreathRegenModifier_Water = FoodMoraleMods[watersituation].bBreathRegenModifier; + + INT8 bAssignmentEfficiencyModifier_Food = FoodMoraleMods[foodsituation].bAssignmentEfficiencyModifier; + INT8 bAssignmentEfficiencyModifier_Water = FoodMoraleMods[watersituation].bAssignmentEfficiencyModifier; + + UINT8 ubStatDamageChance_Food = FoodMoraleMods[foodsituation].ubStatDamageChance; + UINT8 ubStatDamageChance_Water = FoodMoraleMods[watersituation].ubStatDamageChance; + + swprintf( atStr, szFoodText[0], (INT32)(100 * (this->bDrinkLevel - FOOD_MIN) / FOOD_HALF_RANGE) ); + wcscat( apStr, atStr ); + + if ( watersituation != FOOD_NORMAL ) + { + if ( bMoraleModifier_Water ) + { + swprintf( atStr, szFoodText[2], bMoraleModifier_Water > 0 ? L"+" : L"", bMoraleModifier_Water ); + wcscat( apStr, atStr ); + } + + if ( bSleepModifier_Water ) + { + swprintf( atStr, szFoodText[3], bSleepModifier_Water > 0 ? L"+" : L"", bSleepModifier_Water ); + wcscat( apStr, atStr ); + } + + if ( bBreathRegenModifier_Water ) + { + swprintf( atStr, szFoodText[4], bBreathRegenModifier_Water > 0 ? L"+" : L"", bBreathRegenModifier_Water ); + wcscat( apStr, atStr ); + } + + if ( bAssignmentEfficiencyModifier_Water ) + { + swprintf( atStr, szFoodText[5], bAssignmentEfficiencyModifier_Water > 0 ? L"+" : L"", bAssignmentEfficiencyModifier_Water ); + wcscat( apStr, atStr ); + } + + if ( ubStatDamageChance_Water ) + { + swprintf( atStr, szFoodText[6], ubStatDamageChance_Water > 0 ? L"+" : L"", ubStatDamageChance_Water ); + wcscat( apStr, atStr ); + } + } + + swprintf( atStr, szFoodText[1], (INT32)(100 * (this->bFoodLevel - FOOD_MIN) / FOOD_HALF_RANGE) ); + wcscat( apStr, atStr ); + + if ( foodsituation != FOOD_NORMAL ) + { + if ( bMoraleModifier_Food ) + { + swprintf( atStr, szFoodText[2], bMoraleModifier_Food > 0 ? L"+" : L"", bMoraleModifier_Food ); + wcscat( apStr, atStr ); + } + + if ( bSleepModifier_Food ) + { + swprintf( atStr, szFoodText[3], bSleepModifier_Food > 0 ? L"+" : L"", bSleepModifier_Food ); + wcscat( apStr, atStr ); + } + + if ( bBreathRegenModifier_Food ) + { + swprintf( atStr, szFoodText[4], bBreathRegenModifier_Food > 0 ? L"+" : L"", bBreathRegenModifier_Food ); + wcscat( apStr, atStr ); + } + + if ( bAssignmentEfficiencyModifier_Food ) + { + swprintf( atStr, szFoodText[5], bAssignmentEfficiencyModifier_Food > 0 ? L"+" : L"", bAssignmentEfficiencyModifier_Food ); + wcscat( apStr, atStr ); + } + + if ( ubStatDamageChance_Food ) + { + swprintf( atStr, szFoodText[6], ubStatDamageChance_Food > 0 ? L"+" : L"", ubStatDamageChance_Food ); + wcscat( apStr, atStr ); + } + } +} + // get percentage protection from infections via contact FLOAT SOLDIERTYPE::GetDiseaseContactProtection( ) { diff --git a/Tactical/Soldier Control.h b/Tactical/Soldier Control.h index 0654bb8b..cc8f6cdc 100644 --- a/Tactical/Soldier Control.h +++ b/Tactical/Soldier Control.h @@ -1879,6 +1879,7 @@ public: BOOLEAN HasDisease(BOOLEAN fDiagnosedOnly, BOOLEAN fHealableOnly, BOOLEAN fSymbolOnly = FALSE); FLOAT GetDiseaseMagnitude( UINT8 aDisease ); // get the magnitude os a disease we might have, used to determine wether there are any effects void PrintDiseaseDesc( CHAR16* apStr, BOOLEAN fFullDesc = FALSE ); + void PrintFoodDesc( CHAR16* apStr, BOOLEAN fFullDesc = FALSE ); FLOAT GetDiseaseContactProtection(); // get percentage protection from infections via contact INT16 GetDiseaseResistance(); diff --git a/Utils/Text.h b/Utils/Text.h index 92fe7558..55884f64 100644 --- a/Utils/Text.h +++ b/Utils/Text.h @@ -2905,6 +2905,7 @@ enum }; extern STR16 szDiseaseText[]; +extern STR16 szFoodText[]; extern STR16 szIMPGearWebSiteText[]; extern STR16 szIMPGearDropDownText[]; diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 16b2a790..1c0f733f 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -10086,6 +10086,18 @@ STR16 szDiseaseText[] = L"Cancel", }; +STR16 szFoodText[] = +{ + L"\n\n|W|a|t|e|r: %d%%\n", + L"\n\n|F|o|o|d: %d%%\n", + + L"max morale altered by %s%d\n", + L" %s%d need for sleep\n", + L" %s%d%% breath regeneration\n", + L" %s%d%% assignment efficiency\n", + L" %s%d%% chance to lose stats\n", +}; + STR16 szIMPGearWebSiteText[] = // TODO.Translate { // IMP Gear Entrance diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 24070d86..1c04f259 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -10097,6 +10097,18 @@ STR16 szDiseaseText[] = L"Cancel", }; +STR16 szFoodText[] = +{ + L"\n\n|W|a|t|e|r: %d%%\n", + L"\n\n|F|o|o|d: %d%%\n", + + L"max morale altered by %s%d\n", + L" %s%d need for sleep\n", + L" %s%d%% breath regeneration\n", + L" %s%d%% assignment efficiency\n", + L" %s%d%% chance to lose stats\n", +}; + STR16 szIMPGearWebSiteText[] = // TODO.Translate { // IMP Gear Entrance diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index 58bc30e7..9d285d51 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -10135,6 +10135,18 @@ STR16 szDiseaseText[] = L"Cancel", }; +STR16 szFoodText[] = +{ + L"\n\n|W|a|t|e|r: %d%%\n", + L"\n\n|F|o|o|d: %d%%\n", + + L"max morale altered by %s%d\n", + L" %s%d need for sleep\n", + L" %s%d%% breath regeneration\n", + L" %s%d%% assignment efficiency\n", + L" %s%d%% chance to lose stats\n", +}; + STR16 szIMPGearWebSiteText[] = { // IMP Gear Entrance diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index 746b833b..1b958542 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -10083,6 +10083,18 @@ STR16 szDiseaseText[] = L"Cancel", }; +STR16 szFoodText[] = +{ + L"\n\n|W|a|t|e|r: %d%%\n", + L"\n\n|F|o|o|d: %d%%\n", + + L"max morale altered by %s%d\n", + L" %s%d need for sleep\n", + L" %s%d%% breath regeneration\n", + L" %s%d%% assignment efficiency\n", + L" %s%d%% chance to lose stats\n", +}; + STR16 szIMPGearWebSiteText[] = // TODO.Translate { // IMP Gear Entrance diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index fe243d5b..c69bd2f6 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -9914,6 +9914,18 @@ STR16 szDiseaseText[] = L"Cancel", }; +STR16 szFoodText[] = +{ + L"\n\n|W|a|t|e|r: %d%%\n", + L"\n\n|F|o|o|d: %d%%\n", + + L"max morale altered by %s%d\n", + L" %s%d need for sleep\n", + L" %s%d%% breath regeneration\n", + L" %s%d%% assignment efficiency\n", + L" %s%d%% chance to lose stats\n", +}; + STR16 szIMPGearWebSiteText[] = // TODO.Translate { // IMP Gear Entrance diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index e6de231c..2b29e1a1 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -10092,6 +10092,18 @@ STR16 szDiseaseText[] = L"Cancel", }; +STR16 szFoodText[] = +{ + L"\n\n|W|a|t|e|r: %d%%\n", + L"\n\n|F|o|o|d: %d%%\n", + + L"max morale altered by %s%d\n", + L" %s%d need for sleep\n", + L" %s%d%% breath regeneration\n", + L" %s%d%% assignment efficiency\n", + L" %s%d%% chance to lose stats\n", +}; + STR16 szIMPGearWebSiteText[] = // TODO.Translate { // IMP Gear Entrance diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index 80ccd709..7ddaa5b5 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -10109,6 +10109,18 @@ STR16 szDiseaseText[] = L"Cancel", }; +STR16 szFoodText[] = +{ + L"\n\n|W|a|t|e|r: %d%%\n", + L"\n\n|F|o|o|d: %d%%\n", + + L"max morale altered by %s%d\n", + L" %s%d need for sleep\n", + L" %s%d%% breath regeneration\n", + L" %s%d%% assignment efficiency\n", + L" %s%d%% chance to lose stats\n", +}; + STR16 szIMPGearWebSiteText[] = // TODO.Translate { // IMP Gear Entrance diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index 810b590b..5d610f5a 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -10082,6 +10082,18 @@ STR16 szDiseaseText[] = L"Cancel", }; +STR16 szFoodText[] = +{ + L"\n\n|W|a|t|e|r: %d%%\n", + L"\n\n|F|o|o|d: %d%%\n", + + L"max morale altered by %s%d\n", + L" %s%d need for sleep\n", + L" %s%d%% breath regeneration\n", + L" %s%d%% assignment efficiency\n", + L" %s%d%% chance to lose stats\n", +}; + STR16 szIMPGearWebSiteText[] = // TODO.Translate { // IMP Gear Entrance