From f8a0a5eb2cd864393b45944614aaf7408ea3cd8f Mon Sep 17 00:00:00 2001 From: Wanne Date: Mon, 16 Dec 2013 09:13:55 +0000 Subject: [PATCH] New options in ja2_options.ini (by Sevenfm) 1) PLAYER_HIT_COUNT = 0 This works as ENEMY_HIT_COUNT option, but for player mercs. Possible values: 0 - 4 2) SOLDIER_TOOLTIP_DISPLAY_SUPPRESSION_INFO = TRUE Show additional info in tactical tooltip: - APs lost due to suppression - Suppression Tolerance - Effective Shock Level ( Shock level modified by traits and backgrounds. This value is compared with current suppression tolerance to determine "cowering" effect ) - AI morale level 3) SHOW_ENEMY_WEAPON = TRUE Show enemy weapon name above soldier - after health, name and rank. You can see exact weapon name only on short distances, range calculation is similar to dynamic tooltips and based on soldiers actual viewing range and experience. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6691 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameSettings.cpp | 6 + GameSettings.h | 5 + Tactical/Interface Control.cpp | 387 +++++++++++++++------------------ Tactical/Interface Control.h | 5 +- Tactical/Interface.cpp | 83 +++++++ Tactical/Overhead.cpp | 56 +++-- Tactical/Overhead.h | 3 + Tactical/Soldier Control.cpp | 3 +- Tactical/SoldierTooltips.cpp | 14 ++ Utils/Text.h | 5 + Utils/_ChineseText.cpp | 5 + Utils/_DutchText.cpp | 5 + Utils/_EnglishText.cpp | 5 + Utils/_FrenchText.cpp | 5 + Utils/_GermanText.cpp | 5 + Utils/_ItalianText.cpp | 5 + Utils/_PolishText.cpp | 5 + Utils/_RussianText.cpp | 5 + Utils/_TaiwaneseText.cpp | 5 + 19 files changed, 379 insertions(+), 233 deletions(-) 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[] =