diff --git a/GameSettings.cpp b/GameSettings.cpp index d1dd0c57..e9e77b6f 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -1030,6 +1030,8 @@ void LoadGameExternalOptions() // WANNE: Hide the hit count when enemy gets hit gGameExternalOptions.ubEnemyHitCount = iniReader.ReadInteger("Tactical Interface Settings","ENEMY_HIT_COUNT", 0, 0, 4); + // sevenfm: added similar option for player hit count + gGameExternalOptions.ubPlayerHitCount = iniReader.ReadInteger("Tactical Interface Settings","PLAYER_HIT_COUNT", 0, 0, 4); // sevenfm: show additional suppression info above soldier gGameExternalOptions.ubShowSuppressionCount = iniReader.ReadInteger("Tactical Interface Settings","SHOW_SUPPRESSION_COUNT", 0, 0, 2); @@ -1179,6 +1181,7 @@ void LoadGameExternalOptions() gGameExternalOptions.fEnableSoldierTooltipMorale = iniReader.ReadBoolean("Tactical Tooltip Settings", "SOLDIER_TOOLTIP_DISPLAY_MORALE", TRUE); gGameExternalOptions.fEnableSoldierTooltipShock = iniReader.ReadBoolean("Tactical Tooltip Settings", "SOLDIER_TOOLTIP_DISPLAY_SHOCK", TRUE); gGameExternalOptions.fEnableSoldierTooltipSuppressionPoints = iniReader.ReadBoolean("Tactical Tooltip Settings", "SOLDIER_TOOLTIP_DISPLAY_SUPPRESSION", TRUE); + gGameExternalOptions.fEnableSoldierTooltipSuppressionInfo = iniReader.ReadBoolean("Tactical Tooltip Settings", "SOLDIER_TOOLTIP_DISPLAY_SUPPRESSION_INFO", TRUE); gGameExternalOptions.fEnableSoldierTooltipTraits = iniReader.ReadBoolean("Tactical Tooltip Settings", "SOLDIER_TOOLTIP_DISPLAY_TRAITS", TRUE); // added by SANDRO gGameExternalOptions.fEnableSoldierTooltipHelmet = iniReader.ReadBoolean("Tactical Tooltip Settings", "SOLDIER_TOOLTIP_DISPLAY_HELMET", TRUE); gGameExternalOptions.fEnableSoldierTooltipVest = iniReader.ReadBoolean("Tactical Tooltip Settings", "SOLDIER_TOOLTIP_DISPLAY_VEST", TRUE); @@ -1301,6 +1304,9 @@ void LoadGameExternalOptions() gGameExternalOptions.fCanJumpThroughClosedWindows = iniReader.ReadBoolean("Tactical Gameplay Settings","CAN_JUMP_THROUGH_CLOSED_WINDOWS", TRUE); gGameExternalOptions.fCanClimbOnWalls = iniReader.ReadBoolean("Tactical Gameplay Settings","CAN_CLIMB_ON_WALLS", FALSE); + // sevenfm + gGameExternalOptions.fShowEnemyWeapon = iniReader.ReadBoolean("Tactical Gameplay Settings","SHOW_ENEMY_WEAPON", FALSE); + //legion by Jazz gGameExternalOptions.fIndividualHiddenPersonNames = iniReader.ReadBoolean("Tactical Gameplay Settings","INDIVIDUAL_HIDDEN_PERSON_NAMES", FALSE); diff --git a/GameSettings.h b/GameSettings.h index 905c9fd6..d72c6f69 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -714,6 +714,7 @@ typedef struct BOOLEAN fEnableSoldierTooltipMorale; BOOLEAN fEnableSoldierTooltipShock; //Moa: debug tooltip only BOOLEAN fEnableSoldierTooltipSuppressionPoints; //Moa: debug tooltip only + BOOLEAN fEnableSoldierTooltipSuppressionInfo; //sevenfm: additional suppression info BOOLEAN fEnableSoldierTooltipTraits; // added by SANDRO BOOLEAN fEnableSoldierTooltipHelmet; BOOLEAN fEnableSoldierTooltipVest; @@ -1164,6 +1165,9 @@ typedef struct BOOLEAN fCanJumpThroughClosedWindows; BOOLEAN fCanClimbOnWalls; + // sevenfm: show enemy weapon above soldier in tactical + BOOLEAN fShowEnemyWeapon; + //legion by Jazz BOOLEAN fIndividualHiddenPersonNames; @@ -1197,6 +1201,7 @@ typedef struct BOOLEAN fShowHealthBarsOnHead; UINT8 ubEnemyHitCount; + UINT8 ubPlayerHitCount; // sevenfm: new additional info above soldier UINT8 ubShowSuppressionCount; diff --git a/Tactical/Interface Control.cpp b/Tactical/Interface Control.cpp index 0d4eab87..b54d2c08 100644 --- a/Tactical/Interface Control.cpp +++ b/Tactical/Interface Control.cpp @@ -738,210 +738,9 @@ void RenderTopmostTacticalInterface( ) DrawSelectedUIAboveGuy((UINT16)pSoldier->ubID); } - // Use world coordinates! - INT16 sMercScreenX, sMercScreenY, sOffsetX, sOffsetY, sDamageX, sDamageY; - - // sevenfm: added for suppression counters - INT16 sSuppressionX, sSuppressionY; - UINT16 widthDamage = 0; - UINT16 widthSuppression = 0; - UINT16 height = 0; - BOOLEAN printDamage = FALSE; // determines if any value is printed after standart moving damage counter - BOOLEAN printSuppression = FALSE; // determines if any value is printed above soldier (only for new suppression counters) - - if ( gGameExternalOptions.ubShowSuppressionCount == 1 || - gGameExternalOptions.ubShowShockCount == 1 || - gGameExternalOptions.ubShowAPCount == 1 || - gGameExternalOptions.ubShowMoraleCount == 1 ) - printDamage = TRUE; - if ( gGameExternalOptions.ubShowSuppressionCountAlt || - gGameExternalOptions.ubShowSuppressionCount == 2 || - gGameExternalOptions.ubShowShockCount == 2 || - gGameExternalOptions.ubShowAPCount == 2 || - gGameExternalOptions.ubShowMoraleCount == 2 ) - printSuppression = TRUE; - - if (!TileIsOutOfBounds(pSoldier->sGridNo) && pSoldier->bVisible != -1 ) - { - // coordinates for suppression counter - GetSoldierScreenPos( pSoldier, &sMercScreenX, &sMercScreenY ); - GetSoldierAnimOffsets( pSoldier, &sOffsetX, &sOffsetY ); - if ( pSoldier->ubBodyType == QUEENMONSTER ) - { - sSuppressionX = sMercScreenX - pSoldier->sBoundingBoxOffsetX; - sSuppressionY = sMercScreenY - pSoldier->sBoundingBoxOffsetY; - sSuppressionX += 25; - sSuppressionY += 10; + DrawCounters( pSoldier ); } - else - { - sSuppressionX = sOffsetX + (INT16)(sMercScreenX + ( 2 * 30 / 3 ) ); - sSuppressionY = sOffsetY + (INT16)(sMercScreenY - 5 ); - sSuppressionX -= sOffsetX; - sSuppressionY -= sOffsetY; - if ( sSuppressionY < gsVIEWPORT_WINDOW_START_Y ) - { - sSuppressionY = ( sMercScreenY - sOffsetY ); } - } - // if showing suppression - move damage counter higher on screen - //if( printSuppression) - // height = WFGetFontHeight ( TINYFONT1 ); - - // print current ubSuppressionPoints counter - if( gGameExternalOptions.ubShowSuppressionCountAlt && pSoldier->stats.bLife >= OKLIFE ) - { - if( pSoldier->ubSuppressionPoints >0 ) - { - UINT8 scale = PRINT_SCALE_PLAIN_NUMBER; - if( gGameExternalOptions.ubShowSuppressionUseAsterisks ) - { - // print multi asterisk only if no other suppression counter will be printed - /*if ( gGameExternalOptions.ubShowShockCount <2 && - gGameExternalOptions.ubShowAPCount <2 && - gGameExternalOptions.ubShowMoraleCount <2 ) - scale = PRINT_SCALE_ASTERISK_SUPPRESSION; - else - scale = PRINT_SCALE_ASTERISK;*/ - scale = PRINT_SCALE_ASTERISK_SUPPRESSION; - } - PrintSuppressionCounter( sSuppressionX, sSuppressionY, pSoldier->ubSuppressionPoints, widthSuppression, FONT_MCOLOR_LTGRAY, scale ); - } - } - } - - if ( pSoldier->flags.fDisplayDamage ) - { - // Display damage - if (!TileIsOutOfBounds(pSoldier->sGridNo) && pSoldier->bVisible != -1 ) - { - GetSoldierScreenPos( pSoldier, &sMercScreenX, &sMercScreenY ); - GetSoldierAnimOffsets( pSoldier, &sOffsetX, &sOffsetY ); - - if ( pSoldier->ubBodyType == QUEENMONSTER ) - { - sDamageX = sMercScreenX + pSoldier->sDamageX - pSoldier->sBoundingBoxOffsetX; - sDamageY = sMercScreenY + pSoldier->sDamageY - pSoldier->sBoundingBoxOffsetY; - - sDamageX += 25; - sDamageY += 10; - } - else - { - sDamageX = pSoldier->sDamageX + (INT16)(sMercScreenX + ( 2 * 30 / 3 ) ); - sDamageY = pSoldier->sDamageY + (INT16)(sMercScreenY - 5 ); - - sDamageX -= sOffsetX; - sDamageY -= sOffsetY; - - if ( sDamageY < gsVIEWPORT_WINDOW_START_Y ) - { - sDamageY = ( sMercScreenY - sOffsetY ); - } - } - // if showing suppression - move damage counter higher on screen - if( printSuppression) - sDamageY -= WFGetFontHeight ( TINYFONT1 ); - - SetFont( TINYFONT1 ); - - SetFontBackground( FONT_MCOLOR_BLACK ); - SetFontForeground( FONT_MCOLOR_WHITE ); - - bool showDamage = true; - if (gGameExternalOptions.ubEnemyHitCount > 0 && ( pSoldier->bTeam == ENEMY_TEAM || pSoldier->bTeam == CREATURE_TEAM) ) - showDamage = false; - - if (showDamage) - { - if ( pSoldier->sDamage >= 0 ) - { - // print moving damage counter - if( pSoldier->sDamage > 0 ) - { - if ( printDamage ) - PrintSuppressionCounter( sDamageX, sDamageY, pSoldier->sDamage, widthDamage, FONT_MCOLOR_WHITE, PRINT_SCALE_PLAIN_NUMBER ); - else // original code - { - gprintfdirty( sDamageX, sDamageY, L"-%d", pSoldier->sDamage ); - mprintf( sDamageX, sDamageY, L"-%d", pSoldier->sDamage ); - } - } - } - else // Flugente: it is possible that someone might regain negative damage as zombies can regenerate health through bleeding - { - if( printDamage ) - { - PrintSuppressionCounter( sDamageX, sDamageY, -pSoldier->sDamage, widthDamage, FONT_MCOLOR_LTGREEN, PRINT_SCALE_PLAIN_NUMBER ); - } - else // original code - { - SetFontForeground( FONT_MCOLOR_LTGREEN ); - gprintfdirty( sDamageX, sDamageY, L"+%d", -pSoldier->sDamage ); - mprintf( sDamageX, sDamageY, L"+%d", -pSoldier->sDamage ); - SetFontForeground( FONT_MCOLOR_WHITE ); - } - } - } - else - { - if (gGameExternalOptions.ubEnemyHitCount == 1) - { - gprintfdirty( sDamageX, sDamageY, L"%s", gzHiddenHitCountStr[0]); - mprintf( sDamageX, sDamageY, L"%s", gzHiddenHitCountStr[0]); - } - else if (gGameExternalOptions.ubEnemyHitCount == 3) // print white asterisks - { - PrintSuppressionCounter( sDamageX, sDamageY, pSoldier->sDamage, widthDamage, FONT_MCOLOR_WHITE, PRINT_SCALE_ASTERISK_DAMAGE ); - } - else if (gGameExternalOptions.ubEnemyHitCount == 4) // print red asterisks - { - PrintSuppressionCounter( sDamageX, sDamageY, pSoldier->sDamage, widthDamage, FONT_MCOLOR_DKRED, PRINT_SCALE_ASTERISK_DAMAGE ); - } - else - { - gprintfdirty( sDamageX, sDamageY, L""); - mprintf( sDamageX, sDamageY, L""); - } - } - if ( pSoldier->stats.bLife >= OKLIFE ) - { - // replace ubLastSuppression count on screen - if( gGameExternalOptions.ubShowSuppressionCountAlt && gGameExternalOptions.ubShowSuppressionCount == 2 && pSoldier->ubLastSuppression > 0 ) - widthSuppression = 0; - // display suppression from last attack - if( gGameExternalOptions.ubShowSuppressionCount == 1 ) // show after damage counter - PrintSuppressionCounter( sDamageX, sDamageY, pSoldier->ubLastSuppression, widthDamage, FONT_MCOLOR_LTGRAY, - gGameExternalOptions.ubShowSuppressionUseAsterisks ? PRINT_SCALE_ASTERISK_SUPPRESSION : PRINT_SCALE_PLAIN_NUMBER ); - if( gGameExternalOptions.ubShowSuppressionCount == 2 ) // show after suppression counter - PrintSuppressionCounter( sSuppressionX, sSuppressionY, pSoldier->ubLastSuppression, widthSuppression, FONT_MCOLOR_LTGRAY, - gGameExternalOptions.ubShowSuppressionUseAsterisks ? PRINT_SCALE_ASTERISK_SUPPRESSION : PRINT_SCALE_PLAIN_NUMBER ); - // display shock from last attack - if( gGameExternalOptions.ubShowShockCount == 1 ) // show after damage counter - PrintSuppressionCounter( sDamageX, sDamageY, pSoldier->ubLastShock + pSoldier->ubLastShockFromHit, widthDamage, FONT_MCOLOR_LTYELLOW, - gGameExternalOptions.ubShowSuppressionUseAsterisks ? PRINT_SCALE_ASTERISK_SHOCK : PRINT_SCALE_PLAIN_NUMBER ); - if( gGameExternalOptions.ubShowShockCount == 2 ) // show after suppression counter - PrintSuppressionCounter( sSuppressionX, sSuppressionY, pSoldier->ubLastShock + pSoldier->ubLastShockFromHit, widthSuppression, FONT_MCOLOR_LTYELLOW, - gGameExternalOptions.ubShowSuppressionUseAsterisks ? PRINT_SCALE_ASTERISK_SHOCK : PRINT_SCALE_PLAIN_NUMBER ); - // display morale hit from last attack - if( gGameExternalOptions.ubShowMoraleCount == 1 ) // show after damage counter - PrintSuppressionCounter( sDamageX, sDamageY, pSoldier->ubLastMorale + pSoldier->ubLastMoraleFromHit, widthDamage, FONT_MCOLOR_LTGREEN, - gGameExternalOptions.ubShowSuppressionUseAsterisks ? PRINT_SCALE_ASTERISK_MORALE : PRINT_SCALE_PLAIN_NUMBER ); - if( gGameExternalOptions.ubShowMoraleCount == 2 ) // show after suppression counter - PrintSuppressionCounter( sSuppressionX, sSuppressionY, pSoldier->ubLastMorale + pSoldier->ubLastMoraleFromHit, widthSuppression, FONT_MCOLOR_LTGREEN, - gGameExternalOptions.ubShowSuppressionUseAsterisks ? PRINT_SCALE_ASTERISK_MORALE : PRINT_SCALE_PLAIN_NUMBER ); - // display AP loss from last attack - if( gGameExternalOptions.ubShowAPCount == 1 ) // show after damage counter - PrintSuppressionCounter( sDamageX, sDamageY, pSoldier->ubLastAP + pSoldier->ubLastAPFromHit, widthDamage, FONT_MCOLOR_LTBLUE, - gGameExternalOptions.ubShowSuppressionUseAsterisks ? PRINT_SCALE_ASTERISK_AP : PRINT_SCALE_PLAIN_NUMBER ); - if( gGameExternalOptions.ubShowAPCount == 2 ) // show after suppression counter - PrintSuppressionCounter( sSuppressionX, sSuppressionY, pSoldier->ubLastAP + pSoldier->ubLastAPFromHit, widthSuppression, FONT_MCOLOR_LTBLUE, - gGameExternalOptions.ubShowSuppressionUseAsterisks ? PRINT_SCALE_ASTERISK_AP : PRINT_SCALE_PLAIN_NUMBER ); - } - } - } - } - } if ( gusSelectedSoldier != NOBODY ) { @@ -1251,7 +1050,7 @@ BOOLEAN InterfaceOKForMeanwhilePopup() return( TRUE ); } -void PrintSuppressionCounter( INT16 x, INT16 y, INT16 data, UINT16 &width, UINT8 ubForegound, UINT8 scale ) +void PrintCounter( INT16 x, INT16 y, INT16 data, UINT16 &width, UINT8 ubForegound, UINT8 scale ) { CHAR16 pStr[100]; UINT8 num = 0; @@ -1263,19 +1062,19 @@ void PrintSuppressionCounter( INT16 x, INT16 y, INT16 data, UINT16 &width, UINT8 switch ( scale ) { case PRINT_SCALE_ASTERISK_SUPPRESSION: - num = CalcScaleSuppression( data ); + num = CalcScaleSuppression( abs(data) ); break; case PRINT_SCALE_ASTERISK_DAMAGE: - num = CalcScaleDamage( data ); + num = CalcScaleDamage( abs(data) ); break; case PRINT_SCALE_ASTERISK_MORALE: - num = CalcScaleMorale( data ); + num = CalcScaleMorale( abs(data) ); break; case PRINT_SCALE_ASTERISK_AP: - num = CalcScaleAP( data ); + num = CalcScaleAP( abs(data) ); break; case PRINT_SCALE_ASTERISK_SHOCK: - num = CalcScaleShock( data ); + num = CalcScaleShock( abs(data) ); break; default: num = 1; @@ -1293,19 +1092,13 @@ void PrintSuppressionCounter( INT16 x, INT16 y, INT16 data, UINT16 &width, UINT8 swprintf( pStr, L"*" ); for ( i = 1; i 3 ) return 2; return 1; } + +void DrawCounters( SOLDIERTYPE *pSoldier ) +{ + // Use world coordinates! + INT16 sMercScreenX, sMercScreenY, sOffsetX, sOffsetY, sDamageX, sDamageY; + + // sevenfm: added for suppression counters + INT16 sSuppressionX, sSuppressionY; + UINT16 widthDamage = 0; // print damage counters one after another in one line + UINT16 widthSuppression = 0; // print suppression counters (not moving) one after another in one line above soldier + BOOLEAN printSuppression = FALSE; // determines if any value is printed above soldier (only for new suppression counters) + UINT8 hitCount; + CHAR16 pStr[100]; + + if ( gGameExternalOptions.ubShowSuppressionCountAlt || + gGameExternalOptions.ubShowSuppressionCount == 2 || + gGameExternalOptions.ubShowShockCount == 2 || + gGameExternalOptions.ubShowAPCount == 2 || + gGameExternalOptions.ubShowMoraleCount == 2 ) + printSuppression = TRUE; + + if (!TileIsOutOfBounds(pSoldier->sGridNo) && pSoldier->bVisible != -1 ) + { + GetSoldierScreenPos( pSoldier, &sMercScreenX, &sMercScreenY ); + GetSoldierAnimOffsets( pSoldier, &sOffsetX, &sOffsetY ); + // coordinates for suppression counter + + if ( pSoldier->ubBodyType == QUEENMONSTER ) + { + sSuppressionX = sMercScreenX - pSoldier->sBoundingBoxOffsetX; + sSuppressionY = sMercScreenY - pSoldier->sBoundingBoxOffsetY; + sSuppressionX += 25; + sSuppressionY += 10; + } + else + { + sSuppressionX = (INT16)(sMercScreenX + ( 2 * 30 / 3 ) ); + sSuppressionY = (INT16)(sMercScreenY - 5 ); + + if ( sSuppressionY < gsVIEWPORT_WINDOW_START_Y ) + sSuppressionY = ( sMercScreenY - sOffsetY ); + } + // coordinates for damage counter + if ( pSoldier->ubBodyType == QUEENMONSTER ) + { + sDamageX = sMercScreenX + pSoldier->sDamageX - pSoldier->sBoundingBoxOffsetX; + sDamageY = sMercScreenY + pSoldier->sDamageY - pSoldier->sBoundingBoxOffsetY; + sDamageX += 25; + sDamageY += 10; + } + else + { + sDamageX = pSoldier->sDamageX + (INT16)(sMercScreenX + ( 2 * 30 / 3 ) ); + sDamageY = pSoldier->sDamageY + (INT16)(sMercScreenY - 5 ); + sDamageX -= sOffsetX; + sDamageY -= sOffsetY; + // if showing suppression - move damage counter higher on screen + if( printSuppression) +// sDamageY -= 2*WFGetFontHeight ( TINYFONT1 ); + sDamageY -= WFGetFontHeight ( TINYFONT1 ); + if ( sSuppressionY < gsVIEWPORT_WINDOW_START_Y ) + sSuppressionY = ( sMercScreenY - sOffsetY ); + } + // print current ubSuppressionPoints counter + if( gGameExternalOptions.ubShowSuppressionCountAlt && pSoldier->stats.bLife >= OKLIFE ) + { + if( pSoldier->ubSuppressionPoints >0 ) + { + PrintCounter( sSuppressionX, sSuppressionY, pSoldier->ubSuppressionPoints, widthSuppression, FONT_MCOLOR_LTGRAY, + gGameExternalOptions.ubShowSuppressionUseAsterisks ? PRINT_SCALE_ASTERISK_SUPPRESSION : PRINT_SCALE_PLAIN_NUMBER ); + } + } + + if ( pSoldier->flags.fDisplayDamage ) + { + // Display damage + SetFont( TINYFONT1 ); + + SetFontBackground( FONT_MCOLOR_BLACK ); + SetFontForeground( FONT_MCOLOR_WHITE ); + + if( pSoldier->bTeam == OUR_TEAM ) + hitCount = gGameExternalOptions.ubPlayerHitCount; + else + hitCount = gGameExternalOptions.ubEnemyHitCount; + + if( pSoldier->sDamage < 0 ) + { + // Flugente: it is possible that someone might regain negative damage as zombies can regenerate health through bleeding + SetFontForeground( FONT_MCOLOR_LTGREEN ); + swprintf( pStr, L"+%d ", -pSoldier->sDamage ); + gprintfdirty( sDamageX, sDamageY, pStr ); + mprintf( sDamageX, sDamageY, pStr ); + widthDamage += StringPixLength ( pStr, TINYFONT1 ); + SetFontForeground( FONT_MCOLOR_WHITE ); + } + else // normal soldier + { + switch (hitCount) + { + case 0: // show damage as usual + if( pSoldier->sDamage > 0 ) + //PrintCounter( sDamageX, sDamageY, pSoldier->sDamage, widthDamage, FONT_MCOLOR_WHITE, PRINT_SCALE_PLAIN_NUMBER ); + swprintf( pStr, L"-%d ", pSoldier->sDamage ); + gprintfdirty( sDamageX, sDamageY, pStr ); + mprintf( sDamageX, sDamageY, pStr ); + widthDamage += StringPixLength ( pStr, TINYFONT1 ); + break; + case 1: // show ? indicator + if( pSoldier->sDamage != 0 ) + { + swprintf( pStr, L"%s ", gzHiddenHitCountStr[0] ); + gprintfdirty( sDamageX, sDamageY, pStr ); + mprintf( sDamageX, sDamageY, pStr ); + widthDamage += StringPixLength ( pStr, TINYFONT1 ); + } + break; + case 2: // do not show anything + break; + case 3: // show white asterisks + PrintCounter( sDamageX, sDamageY, pSoldier->sDamage, widthDamage, FONT_MCOLOR_WHITE, PRINT_SCALE_ASTERISK_DAMAGE ); + break; + case 4: // show red asterisks + PrintCounter( sDamageX, sDamageY, pSoldier->sDamage, widthDamage, FONT_MCOLOR_DKRED, PRINT_SCALE_ASTERISK_DAMAGE ); + break; + default: + break; + } + } + + // do not show suppression info for dying soldier + if ( pSoldier->stats.bLife >= OKLIFE ) + { + // replace ubLastSuppression count on screen + if( gGameExternalOptions.ubShowSuppressionCountAlt && gGameExternalOptions.ubShowSuppressionCount == 2 && pSoldier->ubLastSuppression > 0 ) + widthSuppression = 0; + // display suppression from last attack + PrintSuppressionCounter( sDamageX, sDamageY, sSuppressionX, sSuppressionY, pSoldier->ubLastSuppression, widthDamage, widthSuppression, + FONT_MCOLOR_LTGRAY, PRINT_SCALE_ASTERISK_SUPPRESSION, gGameExternalOptions.ubShowSuppressionCount ); + // display shock from last attack + PrintSuppressionCounter( sDamageX, sDamageY, sSuppressionX, sSuppressionY, pSoldier->ubLastShock + pSoldier->ubLastShockFromHit, widthDamage, widthSuppression, + FONT_MCOLOR_LTYELLOW, PRINT_SCALE_ASTERISK_SHOCK, gGameExternalOptions.ubShowShockCount ); + // display morale hit from last attack + PrintSuppressionCounter( sDamageX, sDamageY, sSuppressionX, sSuppressionY, pSoldier->ubLastMorale + pSoldier->ubLastMoraleFromHit, widthDamage, widthSuppression, + FONT_MCOLOR_LTGREEN, PRINT_SCALE_ASTERISK_MORALE, gGameExternalOptions.ubShowMoraleCount ); + // display AP loss from last attack + PrintSuppressionCounter( sDamageX, sDamageY, sSuppressionX, sSuppressionY, pSoldier->ubLastAP + pSoldier->ubLastAPFromHit, widthDamage, widthSuppression, + FONT_MCOLOR_LTBLUE, PRINT_SCALE_ASTERISK_AP, gGameExternalOptions.ubShowAPCount ); + } + } + } +} + +void PrintSuppressionCounter( INT16 x, INT16 y, INT16 sX, INT16 sY, UINT8 data, UINT16 &widthDamage, UINT16 &widthSuppression, UINT8 ubForeground, UINT8 scale, UINT8 option) +{ + if( option == 1 ) // show after damage counter + PrintCounter( x, y, data, widthDamage, ubForeground, gGameExternalOptions.ubShowSuppressionUseAsterisks ? scale : PRINT_SCALE_PLAIN_NUMBER ); + if( option == 2 ) // show after suppression counter + PrintCounter( sX, sY, data, widthSuppression, ubForeground, gGameExternalOptions.ubShowSuppressionUseAsterisks ? scale : PRINT_SCALE_PLAIN_NUMBER ); +} diff --git a/Tactical/Interface Control.h b/Tactical/Interface Control.h index 299ad7bf..7fb9967b 100644 --- a/Tactical/Interface Control.h +++ b/Tactical/Interface Control.h @@ -59,7 +59,10 @@ UINT8 CalcScaleMorale( INT16 data ); UINT8 CalcScaleAP( INT16 data ); UINT8 CalcScaleShock( INT16 data ); +void DrawCounters( SOLDIERTYPE *pSoldier ); + // print counter as number or asterisks ( applying provided scale when displaying asterisks ) // width is updated as X offset after printing -void PrintSuppressionCounter( INT16 x, INT16 y, INT16 data, UINT16 &width, UINT8 ubForegound, UINT8 scale = PRINT_SCALE_PLAIN_NUMBER ); +void PrintCounter( INT16 x, INT16 y, INT16 data, UINT16 &width, UINT8 ubForegound, UINT8 scale = PRINT_SCALE_PLAIN_NUMBER ); +void PrintSuppressionCounter( INT16 x, INT16 y, INT16 sX, INT16 sY, UINT8 data, UINT16 &widthDamage, UINT16 &widthSuppression, UINT8 ubForeground, UINT8 scale, UINT8 option); #endif \ No newline at end of file diff --git a/Tactical/Interface.cpp b/Tactical/Interface.cpp index 000c3a73..a37fca5b 100644 --- a/Tactical/Interface.cpp +++ b/Tactical/Interface.cpp @@ -2298,6 +2298,89 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) } } } + if ( gGameExternalOptions.fShowEnemyWeapon ) + { + INT16 height = 30; + INT32 range; + UINT32 maxExactWeaponDistance; + BOOLEAN showExactWeaponType = FALSE; + + if( !gGameExternalOptions.fEnemyRank || !gGameExternalOptions.fEnemyNames ) + height = 10; + + // calc range to target + if ( gusSelectedSoldier != NOBODY ) + { + range = GetRangeInCellCoordsFromGridNoDiff( MercPtrs[ gusSelectedSoldier ]->sGridNo, pSoldier->sGridNo ) / 10; + + // calc max range for exact weapon type based on visible distance + maxExactWeaponDistance = (UINT32)( MercPtrs[ gusSelectedSoldier ]->GetMaxDistanceVisible( pSoldier->sGridNo, 0, CALC_FROM_WANTED_DIR) ) / 2 ; + // apply experience level factor + maxExactWeaponDistance *= 1 + (FLOAT(EffectiveExpLevel(MercPtrs[ gusSelectedSoldier ]))/ 10); + + // check for bad weather conditions + if ( gGameExternalOptions.gfAllowLimitedVision ) + maxExactWeaponDistance *= 1 - (FLOAT (gGameExternalOptions.ubVisDistDecreasePerRainIntensity) / 100); + + if ( maxExactWeaponDistance >= range ) + showExactWeaponType = TRUE; + } + + // for testing - show calculated ranges on screen + /* + swprintf( NameStr, L"range=%d", range ); + gprintfdirty( sXPos + 100, sYPos + 10, NameStr ); + mprintf( sXPos + 100, sYPos + 10, NameStr ); + + swprintf( NameStr, L"max dist=%d", maxExactWeaponDistance ); + gprintfdirty( sXPos + 100, sYPos + 20, NameStr ); + mprintf( sXPos + 100, sYPos + 20, NameStr ); + */ + + if ( WeaponInHand( pSoldier ) ) + { + SetFont( TINYFONT1 ); + SetFontBackground( FONT_MCOLOR_BLACK ); + SetFontForeground( FONT_ORANGE ); + + if ( showExactWeaponType ) + { + swprintf( NameStr, L"%s", ItemNames[ pSoldier->inv[ HANDPOS ].usItem ] ); + } + else + { + // display general weapon class + switch( Weapon[pSoldier->inv[ HANDPOS ].usItem].ubWeaponClass ) + { + case HANDGUNCLASS: + swprintf( NameStr, L"%s", gzTooltipStrings[STR_TT_HANDGUN] ); + break; + case SMGCLASS: + swprintf( NameStr, L"%s", gzTooltipStrings[STR_TT_SMG] ); + break; + case RIFLECLASS: + swprintf( NameStr, L"%s", gzTooltipStrings[STR_TT_RIFLE] ); + break; + case MGCLASS: + swprintf( NameStr, L"%s", gzTooltipStrings[STR_TT_MG] ); + break; + case SHOTGUNCLASS: + swprintf( NameStr, L"%s", gzTooltipStrings[STR_TT_SHOTGUN] ); + break; + case KNIFECLASS: + swprintf( NameStr, L"%s", gzTooltipStrings[STR_TT_KNIFE] ); + break; + default: + swprintf( NameStr, L"%s", gzTooltipStrings[STR_TT_HEAVY_WEAPON] ); + break; + } + } + + FindFontCenterCoordinates( sXPos, (INT16)( sYPos + height ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); + gprintfdirty( sX, sY, NameStr ); + mprintf( sX, sY, NameStr ); + } + } } // Flugente: soldier profiles else if ( pSoldier->bTeam == MILITIA_TEAM && gGameExternalOptions.fSoldierProfiles_Militia && pSoldier->usSoldierProfile ) diff --git a/Tactical/Overhead.cpp b/Tactical/Overhead.cpp index ca6a83ee..07d92f96 100644 --- a/Tactical/Overhead.cpp +++ b/Tactical/Overhead.cpp @@ -8344,6 +8344,9 @@ void HandleSuppressionFire( UINT8 ubTargetedMerc, UINT8 ubCausedAttacker ) fCower = false; // SANDRO - STOMP traits + // sevenfm: moved bShockForCower calculation to CalcEffectiveShockLevel() + INT8 bShockForCower = CalcEffectiveShockLevel( pSoldier ); + /* INT8 bShockForCower = pSoldier->aiData.bShock; if ( gGameOptions.fNewTraitSystem ) { @@ -8365,6 +8368,7 @@ void HandleSuppressionFire( UINT8 ubTargetedMerc, UINT8 ubCausedAttacker ) // Flugente: personal fear resistance bShockForCower = (INT8)((bShockForCower * (100 - pSoldier->GetFearResistanceBonus()) / 100 ) + 0.5); } + */ if (bShockForCower >= bTolerance) { fCower = true; @@ -8604,7 +8608,7 @@ void HandleSuppressionFire( UINT8 ubTargetedMerc, UINT8 ubCausedAttacker ) pSoldier->ubLastSuppression = pSoldier->ubSuppressionPoints; pSoldier->ubLastAP = ubPointsLost; - // add suppression valued from hit to shock valued calculated in this function + // add suppression values from hit to shock values calculated in this function pSoldier->ubLastShock += pSoldier->ubLastShockFromHit; pSoldier->ubLastShockFromHit = 0; pSoldier->ubLastAP += pSoldier->ubLastAPFromHit; @@ -8612,19 +8616,17 @@ void HandleSuppressionFire( UINT8 ubTargetedMerc, UINT8 ubCausedAttacker ) pSoldier->ubLastMorale += pSoldier->ubLastMoraleFromHit; pSoldier->ubLastMoraleFromHit = 0; - if( ubPointsLost > 0 ) - { - if( pSoldier->flags.fDisplayDamage ) - { - // prolongate damage show time - pSoldier->bDisplayDamageCount = 0; - } - else - { - // start new damage show counter + // determine if any suppression value will be shown + BOOLEAN showSuppression = FALSE; + if( gGameExternalOptions.ubShowSuppressionCount || + gGameExternalOptions.ubShowShockCount || + gGameExternalOptions.ubShowAPCount || + gGameExternalOptions.ubShowMoraleCount ) + showSuppression = TRUE; + + // show suppression counters - use original damage counter timer for this + if( showSuppression && ubPointsLost > 0 ) SetDamageDisplayCounter( pSoldier ); - } - } // HEADROCK HAM 3.5: After sufficient testing, suppression clearing now works immediately at the end of // the attack. ubAPsLostToSuppression is only cleared at the end of the turn, but no longer plays a role @@ -10575,4 +10577,30 @@ void KillOnePrisoner( SECTORINFO *pSectorInfo ) break; } } -} \ No newline at end of file +} + +INT8 CalcEffectiveShockLevel( SOLDIERTYPE * pSoldier ) +{ + INT8 bShockForCower = pSoldier->aiData.bShock; + if ( gGameOptions.fNewTraitSystem ) + { + // Squadleader's resistance to cowering + if ( HAS_SKILL_TRAIT( pSoldier, SQUADLEADER_NT )) + { + bShockForCower = (INT8)((bShockForCower * (100 - gSkillTraitValues.ubSLFearResistance * NUM_SKILL_TRAITS( pSoldier, SQUADLEADER_NT )) /100) + 0.5); + } + // Check for character traits + if ( gMercProfiles[pSoldier->ubProfile].bCharacterTrait == CHAR_TRAIT_INTELLECTUAL ) + { + bShockForCower = (INT8)((bShockForCower * 23 / 20 ) + 0.5); // +15% as shock + } + else if ( gMercProfiles[pSoldier->ubProfile].bCharacterTrait == CHAR_TRAIT_DAUNTLESS ) + { + bShockForCower = (INT8)((bShockForCower * 17 / 20 ) + 0.5); // -15% as shock + } + + // Flugente: personal fear resistance + bShockForCower = (INT8)((bShockForCower * (100 - pSoldier->GetFearResistanceBonus()) / 100 ) + 0.5); + } + return bShockForCower; +} diff --git a/Tactical/Overhead.h b/Tactical/Overhead.h index 14013eb1..6a73873e 100644 --- a/Tactical/Overhead.h +++ b/Tactical/Overhead.h @@ -385,5 +385,8 @@ void DeleteAllPrisoners( UNDERGROUND_SECTORINFO *pSectorInfo ); // used when the player kills a prisoner. We kill of high-value prisoners first, to punish this kind of behaviour void KillOnePrisoner( SECTORINFO *pSectorInfo ); +// sevenfm: calc shock level with modifiers (traits, backgrounds, ...) +INT8 CalcEffectiveShockLevel( SOLDIERTYPE * pSoldier ); + #endif diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index 814083a1..da9cb55d 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -9947,7 +9947,7 @@ UINT8 SOLDIERTYPE::SoldierTakeDamage( INT8 bHeight, INT16 sLifeDeduct, INT16 sPo */ // sevenfm: moved code to function SetDamageDisplayCounter(this); - // zero suppression valued stored from last attack + // zero suppression values stored from last attack this->ubLastShock = 0; this->ubLastSuppression = 0; this->ubLastMorale = 0; @@ -21277,6 +21277,7 @@ void SetDamageDisplayCounter(SOLDIERTYPE* pSoldier) if( pSoldier->flags.fDisplayDamage ) { + pSoldier->bDisplayDamageCount = 0; return; } diff --git a/Tactical/SoldierTooltips.cpp b/Tactical/SoldierTooltips.cpp index 722c5325..dde00fc4 100644 --- a/Tactical/SoldierTooltips.cpp +++ b/Tactical/SoldierTooltips.cpp @@ -69,6 +69,12 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) INT16 a1,a2; BOOLEAN fDrawTooltip = FALSE; + // sevenfm: do not show tooltip if ALT is pressed for adding autofire bullets + SOLDIERTYPE *pShooter; + GetSoldier( &pShooter, gusSelectedSoldier ); + if(gfUICtHBar && pShooter && pShooter->bDoAutofire > 1) + return; + if ( gfKeyState[ALT] && pSoldier && IsPointInScreenRectWithRelative( gusMouseXPos, gusMouseYPos, &aRect, &a1, &a2 ) ) { @@ -238,6 +244,14 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) // changed this to ubLastSuppression - it stores suppression points from last attack if ( gGameExternalOptions.fEnableSoldierTooltipSuppressionPoints ) swprintf( pStrInfo, gzTooltipStrings[STR_TT_CAT_SUPPRESION], pStrInfo, pSoldier->ubLastSuppression ); + // sevenfm: show additional suppression info + if ( gGameExternalOptions.fEnableSoldierTooltipSuppressionInfo ) + { + swprintf( pStrInfo, gzTooltipStrings[STR_TT_SUPPRESSION_AP], pStrInfo, pSoldier->ubAPsLostToSuppression ); + swprintf( pStrInfo, gzTooltipStrings[STR_TT_SUPPRESSION_TOLERANCE], pStrInfo, CalcSuppressionTolerance( pSoldier ) ); + swprintf( pStrInfo, gzTooltipStrings[STR_TT_EFFECTIVE_SHOCK], pStrInfo, CalcEffectiveShockLevel( pSoldier ) ); + swprintf( pStrInfo, gzTooltipStrings[STR_TT_AI_MORALE], pStrInfo, pSoldier->aiData.bAIMorale ); + } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Added by SANDRO - show enemy skills if ( gGameExternalOptions.fEnableSoldierTooltipTraits ) diff --git a/Utils/Text.h b/Utils/Text.h index b9cda97b..1e6335ad 100644 --- a/Utils/Text.h +++ b/Utils/Text.h @@ -608,6 +608,11 @@ enum STR_TT_SKILL_TRAIT_1, STR_TT_SKILL_TRAIT_2, STR_TT_SKILL_TRAIT_3, + // Additional suppression effects info - sevenfm + STR_TT_SUPPRESSION_AP, + STR_TT_SUPPRESSION_TOLERANCE, + STR_TT_EFFECTIVE_SHOCK, + STR_TT_AI_MORALE, TEXT_NUM_STR_TT }; diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 904737a0..ccd59685 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -6414,6 +6414,11 @@ STR16 gzTooltipStrings[] = L"%s|技能 1: %s\n", L"%s|技能 2: %s\n", L"%s|技能 3: %s\n", + // Additional suppression effects - sevenfm // TODO.Translate + L"%s|A|Ps lost due to |S|uppression: %d\n", + L"%s|Suppression |Tolerance: %d\n", + L"%s|Effective |S|hock |Level: %d\n", + L"%s|A|I |Morale: %d\n", }; STR16 New113Message[] = diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 2b2d24e7..9addfb7a 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -6420,6 +6420,11 @@ STR16 gzTooltipStrings[] = L"%s|Skill 1: %s\n", L"%s|Skill 2: %s\n", L"%s|Skill 3: %s\n", + // Additional suppression effects - sevenfm // TODO.Translate + L"%s|A|Ps lost due to |S|uppression: %d\n", + L"%s|Suppression |Tolerance: %d\n", + L"%s|Effective |S|hock |Level: %d\n", + L"%s|A|I |Morale: %d\n", }; STR16 New113Message[] = diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index caf25e63..b78d60c6 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -6412,6 +6412,11 @@ STR16 gzTooltipStrings[] = L"%s|Skill 1: %s\n", L"%s|Skill 2: %s\n", L"%s|Skill 3: %s\n", + // Additional suppression effects - sevenfm + L"%s|A|Ps lost due to |S|uppression: %d\n", + L"%s|Suppression |Tolerance: %d\n", + L"%s|Effective |S|hock |Level: %d\n", + L"%s|A|I |Morale: %d\n", }; STR16 New113Message[] = diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index f0952afc..3a3905ea 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -6415,6 +6415,11 @@ STR16 gzTooltipStrings[] = L"%s|Compétence 1 : %s\n", L"%s|Compétence 2 : %s\n", L"%s|Compétence 3 : %s\n", + // Additional suppression effects - sevenfm // TODO.Translate + L"%s|A|Ps lost due to |S|uppression: %d\n", + L"%s|Suppression |Tolerance: %d\n", + L"%s|Effective |S|hock |Level: %d\n", + L"%s|A|I |Morale: %d\n", }; STR16 New113Message[] = diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index a6201b4b..b5ae7552 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -6240,6 +6240,11 @@ STR16 gzTooltipStrings[] = L"%s|Fertigkeit 1: %s\n", L"%s|Fertigkeit 2: %s\n", L"%s|Fertigkeit 3: %s\n", + // Additional suppression effects - sevenfm // TODO.Translate + L"%s|A|Ps lost due to |S|uppression: %d\n", + L"%s|Suppression |Tolerance: %d\n", + L"%s|Effective |S|hock |Level: %d\n", + L"%s|A|I |Morale: %d\n", }; STR16 New113Message[] = diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 4ffd77f4..0256894f 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -6406,6 +6406,11 @@ STR16 gzTooltipStrings[] = L"%s|Skill 1: %s\n", L"%s|Skill 2: %s\n", L"%s|Skill 3: %s\n", + // Additional suppression effects - sevenfm // TODO.Translate + L"%s|A|Ps lost due to |S|uppression: %d\n", + L"%s|Suppression |Tolerance: %d\n", + L"%s|Effective |S|hock |Level: %d\n", + L"%s|A|I |Morale: %d\n", }; STR16 New113Message[] = diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index 54756c72..f759fa58 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -6426,6 +6426,11 @@ STR16 gzTooltipStrings[] = L"%s|Umiejętność 1: %s\n", L"%s|Umiejętność 2: %s\n", L"%s|Umiejętność 3: %s\n", + // Additional suppression effects - sevenfm // TODO.Translate + L"%s|A|Ps lost due to |S|uppression: %d\n", + L"%s|Suppression |Tolerance: %d\n", + L"%s|Effective |S|hock |Level: %d\n", + L"%s|A|I |Morale: %d\n", }; STR16 New113Message[] = diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index 2260244b..f927c7c1 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -6413,6 +6413,11 @@ STR16 gzTooltipStrings[] = L"%s|Навык 1: %s\n", //%s|Skill 1: %s\n L"%s|Навык 2: %s\n", L"%s|Навык 3: %s\n", + // Additional suppression effects - sevenfm // TODO.Translate + L"%s|A|Ps lost due to |S|uppression: %d\n", + L"%s|Suppression |Tolerance: %d\n", + L"%s|Effective |S|hock |Level: %d\n", + L"%s|A|I |Morale: %d\n", }; STR16 New113Message[] = diff --git a/Utils/_TaiwaneseText.cpp b/Utils/_TaiwaneseText.cpp index 302e1d3b..ec14353a 100644 --- a/Utils/_TaiwaneseText.cpp +++ b/Utils/_TaiwaneseText.cpp @@ -6422,6 +6422,11 @@ STR16 gzTooltipStrings[] = L"%s|Skill 1: %s\n", L"%s|Skill 2: %s\n", L"%s|Skill 3: %s\n", + // Additional suppression effects - sevenfm // TODO.Translate + L"%s|A|Ps lost due to |S|uppression: %d\n", + L"%s|Suppression |Tolerance: %d\n", + L"%s|Effective |S|hock |Level: %d\n", + L"%s|A|I |Morale: %d\n", }; STR16 New113Message[] =