diff --git a/GameSettings.cpp b/GameSettings.cpp index 7041ca85..8a4e5b2c 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -2804,6 +2804,8 @@ void LoadItemSettings() gItemSettings.fRangeModifierGun[GUN_SHOTGUN] = iniReader.ReadFloat ("Weapon Settings","RANGE_SHOTGUN_MODIFIER", 1.0f, 0.1f, 5.0f); // -------- LAUNCHERs --------- gItemSettings.fRangeModifierLauncher = iniReader.ReadFloat ("Weapon Settings","RANGE_LAUNCHER_MODIFIER", 1.0f, 0.1f, 5.0f); + // throwing hand grenades + gItemSettings.fRangeModifierGrenade = iniReader.ReadFloat ("Weapon Settings","RANGE_GRENADE_MODIFIER", 1.0f, 0.1f, 5.0f); // weapon damage modifiers // ----------- GUNS ----------- diff --git a/GameSettings.h b/GameSettings.h index 18531702..eb0545df 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -2197,6 +2197,8 @@ typedef struct // range modifiers FLOAT fRangeModifierGun[9]; FLOAT fRangeModifierLauncher; + FLOAT fRangeModifierGrenade; + // damage modifiers FLOAT fDamageModifierGun[9]; FLOAT fDamageModifierBlade; diff --git a/Strategic/Quest Debug System.cpp b/Strategic/Quest Debug System.cpp index 924abf15..ceb0c03b 100644 --- a/Strategic/Quest Debug System.cpp +++ b/Strategic/Quest Debug System.cpp @@ -3675,7 +3675,7 @@ INT16 IsMercInTheSector( UINT16 usMercID ) return( FALSE ); UINT8 cnt; - for ( cnt=0; cnt <= TOTAL_SOLDIERS; cnt++ ) + for ( cnt=0; cnt < TOTAL_SOLDIERS; cnt++ ) { //if the merc is active if( Menptr[ cnt ].ubProfile == usMercID ) diff --git a/Tactical/Interface.cpp b/Tactical/Interface.cpp index 92c05108..2f339f2a 100644 --- a/Tactical/Interface.cpp +++ b/Tactical/Interface.cpp @@ -1944,7 +1944,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, (INT16)(sYPos ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); fRaiseName = TRUE; } else if ( gfUIMouseOnValidCatcher == 3 && pSoldier->ubID == gubUIValidCatcherID ) @@ -1953,7 +1952,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, (INT16)(sYPos ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); fRaiseName = TRUE; } else if ( gfUIMouseOnValidCatcher == 4 && pSoldier->ubID == gubUIValidCatcherID ) @@ -1962,7 +1960,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, (INT16)(sYPos ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); fRaiseName = TRUE; } else if ( pSoldier->bAssignment >= ON_DUTY ) @@ -1972,7 +1969,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, (INT16)(sYPos ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); fRaiseName = TRUE; } else if ( pSoldier->bTeam == gbPlayerNum && pSoldier->bAssignment < ON_DUTY && pSoldier->bAssignment != CurrentSquad() && !( pSoldier->flags.uiStatusFlags & SOLDIER_MULTI_SELECTED ) ) @@ -1985,7 +1981,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, (INT16)(sYPos ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); fRaiseName = TRUE; } @@ -2043,7 +2038,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, (INT16)( sYPos - 10 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); } else { @@ -2081,7 +2075,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, sYPos, (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); } } @@ -2096,7 +2089,7 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) INT16 interval = gGameExternalOptions.ubShowHealthBarsOnHead; //if( interval > 3 ) // interval -= 2; - sXPos += 27; + sXPos += 28; sYPos += 7; iBack = RegisterBackgroundRect(BGND_FLAG_SINGLE, NULL, sXPos, sYPos-1, (INT16)(sXPos + 24 ), (INT16)(sYPos + 3 + interval*3 ) ); if ( iBack != -1 ) @@ -2120,7 +2113,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) SetFontForeground( FONT_MCOLOR_DKRED ); gprintfdirty( sXPos-2-len, sYPos-2, NameStr ); mprintf( sXPos-2-len, sYPos-2, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); } } else @@ -2173,7 +2165,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, (INT16)(sYPos + 10 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); } else { @@ -2186,7 +2177,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, (INT16)( sYPos + 10 ), (INT16)(80 ), 1, pStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, pStr ); mprintf( sX, sY, pStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); //----------------- if ( pSoldier->bInSector && pSoldier->ubProfile == NO_PROFILE ) @@ -2205,7 +2195,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, (INT16)( sYPos + 20 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); } else if (gGameExternalOptions.fEnemyNames == TRUE && gGameExternalOptions.fEnemyRank == FALSE) { @@ -2225,7 +2214,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, (INT16)( sYPos + 20 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); break; } @@ -2250,7 +2238,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, (INT16)( sYPos + 20 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); break; } @@ -2271,7 +2258,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, (INT16)( sYPos + 20 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); } else if (gGameExternalOptions.fCivGroupName == TRUE && pSoldier->ubCivilianGroup > 0 ) { @@ -2287,7 +2273,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, (INT16)( sYPos + 20 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); } } } @@ -2297,18 +2282,21 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) } else //pSoldier->ubProfile != NO_PROFILE || ( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) { + // show (roof) text if ( pSoldier->pathing.bLevel != 0 ) { - // Display name + // sevenfm: fix for overlapping with SHOW_ENEMY_WEAPON feature + if( !gGameExternalOptions.fShowEnemyWeapon || !gfUIFullTargetFound ) + { SetFont( TINYFONT1 ); SetFontBackground( FONT_MCOLOR_BLACK ); SetFontForeground( FONT_YELLOW ); swprintf( NameStr, gzLateLocalizedString[ 15 ] ); - FindFontCenterCoordinates( sXPos, (INT16)(sYPos + 10 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); + FindFontCenterCoordinates( sXPos, (INT16)(sYPos + 10), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); + } } pStr = GetSoldierHealthString( pSoldier ); @@ -2326,7 +2314,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, sYPos, (INT16)(80 ), 1, pStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, pStr ); mprintf( sX, sY, pStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); //----------------- if ( pSoldier->bInSector && pSoldier->ubProfile == NO_PROFILE ) @@ -2345,7 +2332,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, (INT16)( sYPos -10 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); } else #endif @@ -2364,7 +2350,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, (INT16)( sYPos + 20 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); } else if (gGameExternalOptions.fEnemyNames == TRUE) { @@ -2384,7 +2369,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) FindFontCenterCoordinates( sXPos, (INT16)( sYPos + 20 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); break; } @@ -2416,135 +2400,21 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) //legion2 gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); break; } } } } - - // show weapon name and additional info - BOOLEAN showExactInfo = FALSE; - INT16 height = 0; - SOLDIERTYPE *pSelectedSoldier, *pTargetSoldier; - pSelectedSoldier = MercPtrs[ gusSelectedSoldier ]; - pTargetSoldier = pSoldier; - // calc max range for exact info - if ( gusSelectedSoldier != NOBODY ) - showExactInfo = ShowExactInfo( pSelectedSoldier, pTargetSoldier ); + //FindFontCenterCoordinates( sXPos, (INT16)( sYPos ), (INT16)(80 ), 1, L"", TINYFONT1, &sX, &sY ); - // show weapon/armour/items info - if ( gGameExternalOptions.fShowEnemyWeapon && gTacticalStatus.ubCurrentTeam == OUR_TEAM && pTargetSoldier->ubBodyType <= REGFEMALE ) - { - height = 30; - - SetFont( TINYFONT1 ); - SetFontBackground( FONT_MCOLOR_BLACK ); - - if( !gGameExternalOptions.fEnemyRank || !gGameExternalOptions.fEnemyNames ) - height = 10; - - swprintf( NameStr, L"" ); - GetEnemyInfoString( pSelectedSoldier, pTargetSoldier, showExactInfo, NameStr ); - // print item name - FindFontCenterCoordinates( sXPos, (INT16)( sYPos + height ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY ); - gprintfdirty( sX, sY, NameStr ); - mprintf( sX, sY, NameStr ); - maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) ); + // sevenfm: show weapon name and additional info + ShowEnemyWeapon( sX, sY, pSoldier ); + ShowEnemyHealthBar( sX, sY, pSoldier ); + ShowAdditionalInfo( sX, sY, pSoldier ); + ShowRankIcon( sXPos, sYPos, pSoldier ); } - - height = 0; - FindFontCenterCoordinates( sXPos, (INT16)( sYPos + height ), (INT16)(80 ), 1, L"", TINYFONT1, &sX, &sY ); - - // show enemy health bar - if( gGameExternalOptions.ubShowEnemyHealth > 1 && gTacticalStatus.ubCurrentTeam == OUR_TEAM ) - { - UINT8 ubLines = gGameExternalOptions.ubShowEnemyHealth - 1; - INT32 iBarWidth = 24; - INT32 iBarHeight; - - iBarHeight = 2 + 3 * ubLines - 1; - sY += 10; - sY -= iBarHeight; - sX -= iBarWidth / 2; - - iBack = RegisterBackgroundRect(BGND_FLAG_SINGLE, NULL, sX, sY, (INT16)(sX + iBarWidth), (INT16)(sY + iBarHeight ) ); - if ( iBack != -1 ) - SetBackgroundRectFilled( iBack ); - - DrawEnemyHealthBar( pSoldier, sX, sY, ubLines, iBarWidth - 2, iBarHeight ); - } - - FindFontCenterCoordinates( sXPos, (INT16)( sYPos + height ), (INT16)(80 ), 1, L"", TINYFONT1, &sX, &sY ); - sX-=maxWidth / 2 + StringPixLength ( L"***", TINYFONT1 ); - - // show additional info - if( gGameExternalOptions.fShowEnemyAwareness && gTacticalStatus.ubCurrentTeam == OUR_TEAM ) - { - SetFont( TINYFONT1 ); - SetFontBackground( FONT_MCOLOR_BLACK ); - // show awareness sign only when in stealth mode or disguised - if( ( gusSelectedSoldier != NOBODY ) && - ( MercPtrs[ gusSelectedSoldier ]->bStealthMode || MercPtrs[ gusSelectedSoldier ]->bSoldierFlagMask & ( SOLDIER_COVERT_CIV | SOLDIER_COVERT_SOLDIER ) ) ) - { - if( pSoldier->aiData.bOppList[ MercPtrs[ gusSelectedSoldier ]->ubID ] == SEEN_CURRENTLY ) - swprintf( NameStr, L"%s", L"<*>" ); - else - swprintf( NameStr, L"%s", L"<->" ); - - SetFontForeground( FONT_GRAY1 ); - switch ( pSoldier->aiData.bAlertStatus ) - { - case STATUS_GREEN: // everything's OK, no suspicion - SetFontForeground( FONT_GREEN ); - break; - case STATUS_YELLOW: // he or his friend heard something - SetFontForeground( FONT_YELLOW ); - break; - case STATUS_RED: // has definite evidence of opponent - SetFontForeground( FONT_ORANGE ); - break; - case STATUS_BLACK: // currently sees an active opponent - SetFontForeground( FONT_DKRED ); - break; - } - - if ( showExactInfo ) - { - if( gGameExternalOptions.ubShowEnemyHealth > 1 ) - { - gprintfdirty( sX + maxWidth / 2 - 15, sY + height, NameStr ); - mprintf( sX + maxWidth / 2 - 13, sY + height, NameStr ); - } - else - { - gprintfdirty( sX, sY + height, NameStr ); - mprintf( sX, sY + height, NameStr ); - } - height += 10; - } - } - } - // show rank icon - if( gGameExternalOptions.ubShowEnemyRankIcon && gTacticalStatus.ubCurrentTeam == OUR_TEAM ) - //&& (!gGameExternalOptions.fEnemyNames) && (!gGameExternalOptions.fEnemyRank)) - { - sX = sXPos + 50; - sY = sYPos + 17; - if(gGameExternalOptions.fEnemyNames) - sY+=10; - if(gGameExternalOptions.fEnemyRank) - sY+=10; - - iBack = RegisterBackgroundRect(BGND_FLAG_SINGLE, NULL, sX, sY, (INT16)(sX + 22 ), (INT16)(sY + 14 ) ); - if ( iBack != -1 ) - SetBackgroundRectFilled( iBack ); - - DrawRankIcon( pSoldier->stats.bExpLevel, sX, sY ); - } - } // Flugente: soldier profiles else if ( pSoldier->bTeam == MILITIA_TEAM && gGameExternalOptions.fSoldierProfiles_Militia && pSoldier->usSoldierProfile ) { @@ -2574,6 +2444,9 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID ) gprintfdirty( sX, sY, NameStr ); mprintf( sX, sY, NameStr ); } + // sevenfm: show weapon name and additional info + FindFontCenterCoordinates( sXPos, (INT16)( sYPos ), (INT16)(80 ), 1, L"", TINYFONT1, &sX, &sY ); + ShowEnemyWeapon( sX, sY, pSoldier ); } } } @@ -6316,12 +6189,15 @@ void GetEnemyInfoString( SOLDIERTYPE* pSelectedSoldier, SOLDIERTYPE* pTargetSold { case AIM_SHOT_HEAD: swprintf( NameStr, L"%s", gzTooltipStrings[STR_TT_HELMET] ); + //swprintf( NameStr, L"%s", L"Helmet" ); break; case AIM_SHOT_TORSO: swprintf( NameStr, L"%s", gzTooltipStrings[STR_TT_VEST] ); + //swprintf( NameStr, L"%s", L"Vest" ); break; case AIM_SHOT_LEGS: swprintf( NameStr, L"%s", gzTooltipStrings[STR_TT_LEGGINGS] ); + //swprintf( NameStr, L"%s", L"Leggings" ); break; } } @@ -6424,6 +6300,162 @@ void GetEnemyInfoString( SOLDIERTYPE* pSelectedSoldier, SOLDIERTYPE* pTargetSold } } } + +void ShowEnemyWeapon( INT16 sX, INT16 sY, SOLDIERTYPE* pTargetSoldier ) +{ + SOLDIERTYPE *pSelectedSoldier; + BOOLEAN showExactInfo = FALSE; + CHAR16 NameStr[ MAX_ENEMY_NAMES_CHARS ]; + UINT16 usTotalWidth; + INT32 iRange; + INT32 iVisibleDistance; + + if ( gusSelectedSoldier != NOBODY ) + pSelectedSoldier = MercPtrs[ gusSelectedSoldier ]; + else + return; + + if( gGameExternalOptions.fEnemyRank || gGameExternalOptions.fEnemyNames ) + return; + + iRange = GetRangeInCellCoordsFromGridNoDiff( pSelectedSoldier->sGridNo, pTargetSoldier->sGridNo ) / 10; + iVisibleDistance = (INT32)( pSelectedSoldier->GetMaxDistanceVisible( pTargetSoldier->sGridNo, 0, CALC_FROM_WANTED_DIR) ) ; + + if( iRange > iVisibleDistance ) + return; + + if( !pTargetSoldier->bVisible ) + return; + + // calc max range for exact info + if ( gusSelectedSoldier != NOBODY ) + showExactInfo = ShowExactInfo( pSelectedSoldier, pTargetSoldier ); + + // show weapon/armour/items info + if ( gGameExternalOptions.fShowEnemyWeapon && gTacticalStatus.ubCurrentTeam == OUR_TEAM && pTargetSoldier->ubBodyType <= REGFEMALE ) + { + SetFont( TINYFONT1 ); + SetFontBackground( FONT_MCOLOR_BLACK ); + + swprintf( NameStr, L"" ); + GetEnemyInfoString( pSelectedSoldier, pTargetSoldier, showExactInfo, NameStr ); + usTotalWidth = StringPixLength ( NameStr, TINYFONT1 ); + sX -= usTotalWidth/2; + + // print item name + gprintfdirty( sX, sY + 10, NameStr ); + mprintf( sX, sY + 10, NameStr ); + } +} + +void ShowAdditionalInfo( INT16 sX, INT16 sY, SOLDIERTYPE* pTargetSoldier ) +{ + BOOLEAN showExactInfo; + CHAR16 NameStr[ MAX_ENEMY_NAMES_CHARS ]; + SOLDIERTYPE *pSelectedSoldier; + + if ( gusSelectedSoldier != NOBODY ) + pSelectedSoldier = MercPtrs[ gusSelectedSoldier ]; + else + return; + + if( gGameExternalOptions.fEnemyRank || gGameExternalOptions.fEnemyNames ) + return; + + // calc max range for exact info + if ( gusSelectedSoldier != NOBODY ) + showExactInfo = ShowExactInfo( pSelectedSoldier, pTargetSoldier ); + + sX -= StringPixLength ( L"*", TINYFONT1 ); + if( gGameExternalOptions.fShowEnemyAwareness && gTacticalStatus.ubCurrentTeam == OUR_TEAM ) + { + SetFont( TINYFONT1 ); + SetFontBackground( FONT_MCOLOR_BLACK ); + // show awareness sign only when in stealth mode or disguised + if( ( gusSelectedSoldier != NOBODY ) && + ( MercPtrs[ gusSelectedSoldier ]->bStealthMode || MercPtrs[ gusSelectedSoldier ]->bSoldierFlagMask & ( SOLDIER_COVERT_CIV | SOLDIER_COVERT_SOLDIER ) ) ) + { + if( pTargetSoldier->aiData.bOppList[ MercPtrs[ gusSelectedSoldier ]->ubID ] == SEEN_CURRENTLY ) + swprintf( NameStr, L"%s", L"*" ); + else + swprintf( NameStr, L"%s", L"-" ); + + SetFontForeground( FONT_GRAY1 ); + switch ( pTargetSoldier->aiData.bAlertStatus ) + { + case STATUS_GREEN: // everything's OK, no suspicion + SetFontForeground( FONT_GREEN ); + break; + case STATUS_YELLOW: // he or his friend heard something + SetFontForeground( FONT_YELLOW ); + break; + case STATUS_RED: // has definite evidence of opponent + SetFontForeground( FONT_ORANGE ); + break; + case STATUS_BLACK: // currently sees an active opponent + SetFontForeground( FONT_DKRED ); + break; + } + + if ( showExactInfo ) + { + // this feature is a part of 'show enemy health bar' + if( gGameExternalOptions.ubShowEnemyHealth > 1 ) + { + gprintfdirty( sX - 15, sY, NameStr ); + mprintf( sX - 15, sY, NameStr ); + } + } + } + } +} + +void ShowEnemyHealthBar( INT16 sX, INT16 sY, SOLDIERTYPE* pSoldier ) +{ + INT32 iBack; + UINT8 ubLines = gGameExternalOptions.ubShowEnemyHealth - 1; + INT32 iBarWidth = 24; + INT32 iBarHeight; + + // show enemy health bar + if( gGameExternalOptions.ubShowEnemyHealth > 1 && gTacticalStatus.ubCurrentTeam == OUR_TEAM ) + { + iBarHeight = 2 + 3 * ubLines - 1; + sY += 10; + sY -= iBarHeight; + sX -= iBarWidth / 2; + + iBack = RegisterBackgroundRect(BGND_FLAG_SINGLE, NULL, sX, sY, (INT16)(sX + iBarWidth), (INT16)(sY + iBarHeight ) ); + if ( iBack != -1 ) + SetBackgroundRectFilled( iBack ); + + DrawEnemyHealthBar( pSoldier, sX, sY, ubLines, iBarWidth - 2, iBarHeight ); + } +} + +void ShowRankIcon( INT16 sXPos, INT16 sYPos, SOLDIERTYPE* pSoldier ) +{ + INT32 iBack; + INT16 sX, sY; + + if( gGameExternalOptions.ubShowEnemyRankIcon && gTacticalStatus.ubCurrentTeam == OUR_TEAM ) + //&& (!gGameExternalOptions.fEnemyNames) && (!gGameExternalOptions.fEnemyRank)) + { + sX = sXPos + 50; + sY = sYPos + 17; + if(gGameExternalOptions.fEnemyNames) + sY+=10; + if(gGameExternalOptions.fEnemyRank) + sY+=10; + + iBack = RegisterBackgroundRect(BGND_FLAG_SINGLE, NULL, sX, sY, (INT16)(sX + 11 ), (INT16)(sY + 14 ) ); + if ( iBack != -1 ) + SetBackgroundRectFilled( iBack ); + + DrawRankIcon( pSoldier->stats.bExpLevel, sX, sY ); + } +} + void DrawLine( INT32 x1, INT32 y1, INT32 x2, INT32 y2, UINT16 color8, UINT16 color16, UINT8 *pDestBuf ) { if(gbPixelDepth==16) diff --git a/Tactical/Interface.h b/Tactical/Interface.h index 85e292cd..021a6d56 100644 --- a/Tactical/Interface.h +++ b/Tactical/Interface.h @@ -544,4 +544,9 @@ void DrawNCTHCursorItemPics( INT16 sStartScreenX, INT16 sStartScreenY ); void GetEnemyInfoString( SOLDIERTYPE* pSelectedSoldier, SOLDIERTYPE* pTargetSoldier, BOOLEAN showExactInfo, CHAR16 *NameStr ); +void ShowEnemyWeapon( INT16 sX, INT16 sY, SOLDIERTYPE* pTargetSoldier ); +void ShowAdditionalInfo( INT16 sX, INT16 sY, SOLDIERTYPE* pTargetSoldier ); +void ShowRankIcon( INT16 sXPos, INT16 sYPos, SOLDIERTYPE* pSoldier ); +void ShowEnemyHealthBar( INT16 sX, INT16 sY, SOLDIERTYPE* pSoldier ); + #endif \ No newline at end of file diff --git a/Tactical/Turn Based Input.cpp b/Tactical/Turn Based Input.cpp index 57c6de63..5ef0257d 100644 --- a/Tactical/Turn Based Input.cpp +++ b/Tactical/Turn Based Input.cpp @@ -333,6 +333,8 @@ void TacticalInventoryMessageBoxCallBack( UINT8 ubExitValue ); void HandleTacticalCoverMenu( void ); void TacticalCoverMessageBoxCallBack( UINT8 ubExitValue ); void HandleTacticalAmmoCrates( UINT8 magType ); +void HandleTacticalTransformItem( void ); +BOOLEAN FindTransformation( UINT16 usItem, TransformInfoStruct **pTransformation ); void GetTBMouseButtonInput( UINT32 *puiNewEvent ) { @@ -4117,6 +4119,10 @@ void GetKeyboardInput( UINT32 *puiNewEvent ) { *puiNewEvent = I_LOSDEBUG; } + else + { + HandleTacticalTransformItem(); + } } //else if( gusSelectedSoldier != NOBODY ) break; @@ -7901,5 +7907,79 @@ void TacticalCoverMessageBoxCallBack( UINT8 ubExitValue ) ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szTacticalCoverDialogPrintString[ubExitValue-1]); } +void HandleTacticalTransformItem( void ) +{ + UINT16 usItem; + TransformInfoStruct *pTransformation; + OBJECTTYPE* pObj; + + SOLDIERTYPE* pSoldier; + if( !GetSoldier( &pSoldier, gusSelectedSoldier ) ) + return; + if( !pSoldier->inv[ HANDPOS ].exists() ) + return; + + usItem = pSoldier->inv[ HANDPOS ].usItem; + + if( FindTransformation( usItem, &pTransformation ) ) + { + + if ( pTransformation->usAPCost > 0 && gTacticalStatus.uiFlags & INCOMBAT && gTacticalStatus.uiFlags & TURNBASED ) + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s (%d AP)", pTransformation->szMenuRowText, pTransformation->usAPCost ); + else + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pTransformation->szMenuRowText); + + pSoldier->inv[ HANDPOS ].TransformObject( pSoldier, 0, pTransformation, NULL ); + } + // sevenfm: failed to make attachment transformation to work correctly + /* + else // not found transformation for the item - search transformations for attachments + { + attachmentList::iterator iterend; + attachmentList::iterator iter; + pObj = &(pSoldier->inv[ HANDPOS ]); + + // check all attachments, search for available transformations + iterend = (*pObj)[0]->attachments.end(); + for (iter = (*pObj)[0]->attachments.begin(); iter != iterend; ++iter) + { + if ( iter->exists() && Item[iter->usItem].usItemClass == IC_MISC ) + { + usItem = Item[iter->usItem].uiIndex; + + if( FindTransformation( usItem, &pTransformation ) ) + { + if ( pTransformation->usAPCost > 0 && gTacticalStatus.uiFlags & INCOMBAT && gTacticalStatus.uiFlags & TURNBASED ) + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s (%d AP)", pTransformation->szMenuRowText, pTransformation->usAPCost ); + else + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pTransformation->szMenuRowText); + + // RENDER_ITEM_NOSTATUS = 20 + // RENDER_ITEM_ATTACHMENT1 = 200 + iter->TransformObject( pSoldier, 0, pTransformation, pObj ); + } + } + } + } + */ +} + +BOOLEAN FindTransformation( UINT16 usItem, TransformInfoStruct **pTransformation ) +{ + // find transformation + for (INT32 x = 0; x < MAXITEMS; x++) + { + if ( Transform[x].usItem == (UINT16)-1 ) + { + break; + } + if ( Transform[x].usItem == usItem ) + { + *pTransformation = &Transform[x]; + return TRUE; + } + } + return FALSE; +} diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp index 489b1a46..0e727720 100644 --- a/Tactical/Weapons.cpp +++ b/Tactical/Weapons.cpp @@ -11310,8 +11310,14 @@ INT32 CalcMaxTossRange( SOLDIERTYPE * pSoldier, UINT16 usItem, BOOLEAN fArmed, O iRange = 2 + ( ( EffectiveStrength( pSoldier, FALSE ) / ( 5 + itemWeight) ) ); } + // sevenfm: for grenades and aerodynamic items - apply modifier + if ( ! Item[ usItem ].unaerodynamic ) + iRange = (INT32)( iRange * gItemSettings.fRangeModifierGrenade ); + // adjust for thrower's remaining breath (lose up to 1/2 of range) - iRange -= (iRange * (100 - pSoldier->bBreath)) / 200; + // sevenfm changed max breath value to pSoldier->bBreathMax + //iRange -= (iRange * (100 - pSoldier->bBreath)) / 200; + iRange -= (iRange * ( pSoldier->bBreathMax - pSoldier->bBreath)) / 200; //////////////////////////////////////////////////////////////////////////////////////////////// // SANDRO - old/new traits diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 6755e3df..8893d40a 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -6520,8 +6520,8 @@ STR16 gzTooltipStrings[] = L"%s|作|战|裤: %s\n", // Limited, Basic L"|护|甲: ", - L"头盔 ", - L"防弹衣 ", + L"头盔", + L"防弹衣", L"作战裤", L"装备了", L"无护甲", diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 7975e8b9..89eef726 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -6526,8 +6526,8 @@ STR16 gzTooltipStrings[] = L"%s|Leggings: %s\n", // Limited, Basic L"|Armor: ", - L"Helmet ", - L"Vest ", + L"Helmet", + L"Vest", L"Leggings", L"worn", L"no Armor", diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index a1ce7b76..a2777c19 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -6517,8 +6517,8 @@ STR16 gzTooltipStrings[] = L"%s|Leggings: %s\n", // Limited, Basic L"|Armor: ", - L"Helmet ", - L"Vest ", + L"Helmet", + L"Vest", L"Leggings", L"worn", L"no Armor", diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index 0bebb746..1b6d524b 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -6523,8 +6523,8 @@ STR16 gzTooltipStrings[] = L"%s|Pantalon : %s\n", // Limited, Basic L"|Armure : ", - L"Casque ", - L"Veste ", + L"Casque", + L"Veste", L"Pantalon", L"usé", L"pas d'armure", diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 5f6bd03c..80202417 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -6347,8 +6347,8 @@ STR16 gzTooltipStrings[] = L"%s|Hose: %s\n", // Limited, Basic L"|Rüstung: ", - L"Helm ", - L"Weste ", + L"Helm", + L"Weste", L"Hose", L"getragen", L"keine Rüstung", diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 69b6ba10..b33acf87 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -6517,8 +6517,8 @@ STR16 gzTooltipStrings[] = L"%s|Leggings: %s\n", // Limited, Basic L"|Armor: ", - L"Helmet ", - L"Vest ", + L"Helmet", + L"Vest", L"Leggings", L"worn", L"no Armor", diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index f9e34f8c..1a506dc1 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -6531,8 +6531,8 @@ STR16 gzTooltipStrings[] = L"%s|Getry ochronne: %s\n", // Limited, Basic L"|Pancerz: ", - L"hełm ", - L"kamizelka ", + L"hełm", + L"kamizelka", L"getry ochronne", L"używane", L"brak pancerza", diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index 42f5bd9e..0280b9db 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -6520,8 +6520,8 @@ STR16 gzTooltipStrings[] = L"%s|Брюки: %s\n", // Limited, Basic L"|Броня: ", - L"Каска ", - L"Жилет ", + L"Каска", + L"Жилет", L"Брюки", L"Одет", L"нет брони", diff --git a/Utils/_TaiwaneseText.cpp b/Utils/_TaiwaneseText.cpp index 00117fef..1e239a7a 100644 --- a/Utils/_TaiwaneseText.cpp +++ b/Utils/_TaiwaneseText.cpp @@ -6525,8 +6525,8 @@ STR16 gzTooltipStrings[] = L"%s|Leggings: %s\n", // Limited, Basic L"|Armor: ", - L"Helmet ", - L"Vest ", + L"Helmet", + L"Vest", L"Leggings", L"worn", L"no Armor",