From 6c4c3a9d8c5397e437397dd3bd6ef0ccb718ea02 Mon Sep 17 00:00:00 2001 From: Wanne Date: Mon, 24 Mar 2014 20:08:42 +0000 Subject: [PATCH] Merged from revision: 7114 Updates/Fixes (by Sevenfm) 1. Added grenade throwing range modifier to item_settings.ini: RANGE_GRENADE_MODIFIER = 1.0 This modifier is applied to grenades and regular thrown items. 2. Changed 100 to bBreathMax in throwing range penalty calculation. This should make grenades more useful. 3. Minor visual fixes (alt healthbar placement, 'roof' text placement when SHOW_ENEMY_WEAPON is true ) 4. Added xml tags for merge type <13>: you can use u.knife on tripwire roll to get 2 tripwires. Status of tripwire roll will be reduced by 2 points. Also lookup table for merges is updated for xml editor to work correctly. 5. Added several new loadscreenhints. 6. Press 'y' in tactical for quick transformation of item in hand - useful for switching flashlights on and off. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7116 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameSettings.cpp | 2 + GameSettings.h | 2 + Strategic/Quest Debug System.cpp | 2 +- Tactical/Interface.cpp | 318 +++++++++++++++++-------------- Tactical/Interface.h | 5 + Tactical/Turn Based Input.cpp | 80 ++++++++ Tactical/Weapons.cpp | 8 +- Utils/_ChineseText.cpp | 4 +- Utils/_DutchText.cpp | 4 +- Utils/_EnglishText.cpp | 4 +- Utils/_FrenchText.cpp | 4 +- Utils/_GermanText.cpp | 4 +- Utils/_ItalianText.cpp | 4 +- Utils/_PolishText.cpp | 4 +- Utils/_RussianText.cpp | 4 +- Utils/_TaiwaneseText.cpp | 4 +- 16 files changed, 290 insertions(+), 163 deletions(-) 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",