From 0ebedabc8187bf3937daae61af4acac2fdd6105c Mon Sep 17 00:00:00 2001 From: Wanne Date: Fri, 8 Sep 2006 20:25:49 +0000 Subject: [PATCH] - bugfix: CTD when bullets hit door - Added ShadowWorrier's tooltip fix git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@517 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameSettings.cpp | 3 +- GameSettings.h | 1 + JA2.suo | Bin 90112 -> 98304 bytes Tactical/LOS.cpp | 62 ++++++------ Tactical/SoldierTooltips.cpp | 178 +++++++++++++++++++++++++++-------- 5 files changed, 174 insertions(+), 70 deletions(-) diff --git a/GameSettings.cpp b/GameSettings.cpp index 6cee0a78..5fbbe525 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -525,8 +525,9 @@ void LoadGameExternalOptions() gGameExternalOptions.fVehicleInventory = iniReader.ReadBoolean("JA2 Gameplay Settings", "VEHICLE_INVENTORY", TRUE); // ShadoWarrior: Tooltip changes (start) - gGameExternalOptions.ubSoldierTooltipDetailLevel = iniReader.ReadInteger("JA2 Tactical Settings", "SOLDIER_TOOLTIP_DETAIL_LEVEL", 2); + gGameExternalOptions.ubSoldierTooltipDetailLevel = iniReader.ReadInteger("JA2 Tactical Settings", "SOLDIER_TOOLTIP_DETAIL_LEVEL", 1); + gGameExternalOptions.fEnableDynamicSoldierTooltips = iniReader.ReadBoolean("JA2 Tactical Settings", "DYNAMIC_SOLDIER_TOOLTIPS", TRUE); gGameExternalOptions.fEnableSoldierTooltipLocation = iniReader.ReadBoolean("JA2 Tactical Settings", "SOLDIER_TOOLTIP_DISPLAY_LOCATION", TRUE); gGameExternalOptions.fEnableSoldierTooltipBrightness = iniReader.ReadBoolean("JA2 Tactical Settings", "SOLDIER_TOOLTIP_DISPLAY_BRIGHTNESS", TRUE); gGameExternalOptions.fEnableSoldierTooltipRangeToTarget = iniReader.ReadBoolean("JA2 Tactical Settings", "SOLDIER_TOOLTIP_DISPLAY_RANGE_TO_TARGET", TRUE); diff --git a/GameSettings.h b/GameSettings.h index e6085f89..b4a46bf2 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -346,6 +346,7 @@ typedef struct // ShadoWarrior: Tooltip changes (start) UINT8 ubSoldierTooltipDetailLevel; + BOOLEAN fEnableDynamicSoldierTooltips; BOOLEAN fEnableSoldierTooltipLocation; BOOLEAN fEnableSoldierTooltipBrightness; BOOLEAN fEnableSoldierTooltipRangeToTarget; diff --git a/JA2.suo b/JA2.suo index b808fb99d0fd908337cf9252024db63e91c8c6f6..a1b073a7326a73c9ff5900ccd7ded79902b4be75 100644 GIT binary patch delta 2169 zcmb7EUrd`-6hEi^`iIi5w54FPIcyMh7T5{}B2yeKi2RF`4Wi z+#QN@+`@`jlI?ME~NK;m3#Mrl`2N!_xaHLKtv-J>M`(9k>`WfnHN ztxY@6STE4*_*m+$(~boQhycqZ-;)$;9#>(W)db)n3G+&8bWJNG#Q@s-T9NjvEBM3+ zhwg-an1Cr5r+Sfx!B z#hi-4B(+miW2!8q822c$O6VdfAaRp$0=y*5`3Q@6o{IRd;Wv9uhfF`@rDodu`jvcA zr`E5HmN@xz9=Qc4T$@_y()Zq3S#uT;!6#xPCR01BpVkNk@o$l^Vn~D(Y)P7MzvV+R zx~NqSJdPiTZWA8%e?f{RlFv!5kX$9Ar^#4|Rm z&?asv=|8Nv2gMyL+J(Ip$HagOqoOYl{pmhCZkz4-wD0a^(^F2okiQf}Q__zy97uQj z@oSH^^@%U-tH6?Cakd%Hr|&djsUl*%I4=@MaZxNN7)sM^;wHY6j|-d~;-_{D*IV@F zrStK41nSK{ql347$^_KR`Z)jWIq%|g=e)eOac6-EVyFdLIx#MOvEf1UTM!qX2)3pJ zJs3n0e;pUnr~9x@5!(l_UAPaUcV8!T!BIFseLSJ}`=vZRI537ql?OGkxEE&}ZF1W- z6q|=|R$OkvlGz^W@o`Evzm5q?_imUt#NiAyLx|o&6-1yGnxKx#6NNC%>uFX)Obv0B zw2BfJqFI=Jbvj=S)#Oo4o;-VxPE=JLuBojXq%sGH8K=aYfMa5#oI0Yo1Lw7^ze=^u zTB~+F=vxRT#Fm{JM?d#m<~lG3;`k9v>Pj^tm5jmcCDpI^OG1OOBCB`A_<_-gDLFxc zmW-0IJ8P_7m3qcpeVH|5&-ikVeTURDKAEFmlX}M9tlqI9^&3{vSh9PgVOu6RWA2UK zm3l_0Z!E!$brAyS%+k% fw}9~>J3Q#HEqjhpZ-EgpAH{0*e`Nh;J~sRd+;{F2 delta 1156 zcmZ8gO-vI(6rNYMr7hbnrKKSa5>P}TgcO4$CK~<%ltOE($blFIT0o^K4ORpASCtbQ z4~*?39@Gn{fC%hiFCI|97$6+vpz-9H177gL0e!Qr()f~Z-^{mfzIik6O)RF1EotXN zf)x2R5Np}`1Q`TvOdb{70%+t_{oM=`NJ#xo8TIRnwLItn9T9Ko9^q)(FYk$ZFcShm z$Y;bB;uy6^Rzts@kQW9F!kLZMNy9?Gj+6T|mwu7TY^_|njdYU;iIPG564FYG%z39< zMI2s0@+t|D>zvNPPdi2iR5F005U067BMD+07Z~D{95i3XtPkPXgy4zutm$r!Ps~aY z|H!D-C-R9cEmCLJ5Rysgp4ClPtWIq<{uAhkZH+dVDrq#=CtCiKk#}>eG`U&0OhlLv z5@H{9_hl$qhDFD)Q{ynoqwdabfz$H0nNWc!pbTEyL5k6}vvk>gW@3Fs%txMY%#-8k z%e(8(s_5v7E8YcVY)1zr@p<^3(7iC0Owd?H5l234i3}Es-Q%4-~iSmK|Sjm8U1-CV9qaB9X4>uI>EV5#lwie^i;tOz!EjGfK!DCD^9;K!U ziom#?nVfHDCh{P`W*cGLq_#KG+!yg(X_BAgZI8x%aT?!|(&Rp!|C);DK8yJ=8ro1hSklPO}-z>r9=jg#P2Yg%*@ixR}r4U!5hTSR?h&+%1q<31;u z+MXWVEV~ABN?cgIFfIwT3}KgTx59N*+(02 audv!EgD7&a>pt%jH15>{4zL|Bbo>FfRxoS; diff --git a/Tactical/LOS.cpp b/Tactical/LOS.cpp index cb07a2af..2b88e733 100644 --- a/Tactical/LOS.cpp +++ b/Tactical/LOS.cpp @@ -2468,43 +2468,47 @@ INT32 HandleBulletStructureInteraction( BULLET * pBullet, STRUCTURE * pStructure // Does it have a lock? INT16 lockBustingPower = AmmoTypes[pBullet->pFirer->inv[ pBullet->pFirer->ubAttackingHand ].ubGunAmmoType].lockBustingPower; - DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Door info: damage = %d, pick difficulty = %d, smash difficulty = %d, lockbuster power = %d",pDoor->bLockDamage,LockTable[ pDoor->ubLockID ].ubPickDifficulty,LockTable[ pDoor->ubLockID ].ubSmashDifficulty,lockBustingPower) ); - - if ( pDoor && (( LockTable[ pDoor->ubLockID ].ubPickDifficulty < 50 && LockTable[ pDoor->ubLockID ].ubSmashDifficulty < 70 ) || lockBustingPower*2 >= LockTable[ pDoor->ubLockID ].ubSmashDifficulty ) ) + // WANNE: bugfix: No door returned, so the game crashes! + if (pDoor) { - // Yup..... + DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Door info: damage = %d, pick difficulty = %d, smash difficulty = %d, lockbuster power = %d",pDoor->bLockDamage,LockTable[ pDoor->ubLockID ].ubPickDifficulty,LockTable[ pDoor->ubLockID ].ubSmashDifficulty,lockBustingPower) ); - // Chance that it hit the lock.... - if ( PreRandom( 2 ) == 0 || lockBustingPower > 0 ) + if ( pDoor && (( LockTable[ pDoor->ubLockID ].ubPickDifficulty < 50 && LockTable[ pDoor->ubLockID ].ubSmashDifficulty < 70 ) || lockBustingPower*2 >= LockTable[ pDoor->ubLockID ].ubSmashDifficulty ) ) { - // Adjust damage-- CC adjust this based on gun type, etc..... - //sLockDamage = (INT16)( 35 + Random( 35 ) ); - sLockDamage = (INT16) (pBullet->iImpact - pBullet->iImpactReduction ); - sLockDamage += (INT16) PreRandom( sLockDamage ); - sLockDamage += lockBustingPower; + // Yup..... - sLockDamage = min(sLockDamage,127); - - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ LOCK_HAS_BEEN_HIT ] ); - - //Madd: catch the overflow - if ( sLockDamage + pDoor->bLockDamage > 127 ) - pDoor->bLockDamage = 127; - else - pDoor->bLockDamage+= sLockDamage; - - // Check if it has been shot! - if ( pDoor->bLockDamage > LockTable[ pDoor->ubLockID ].ubSmashDifficulty || sLockDamage > LockTable[ pDoor->ubLockID ].ubSmashDifficulty ) + // Chance that it hit the lock.... + if ( PreRandom( 2 ) == 0 || lockBustingPower > 0 ) { - // Display message! - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ LOCK_HAS_BEEN_DESTROYED ] ); + // Adjust damage-- CC adjust this based on gun type, etc..... + //sLockDamage = (INT16)( 35 + Random( 35 ) ); + sLockDamage = (INT16) (pBullet->iImpact - pBullet->iImpactReduction ); + sLockDamage += (INT16) PreRandom( sLockDamage ); + sLockDamage += lockBustingPower; - // succeeded! door can never be locked again, so remove from door list... - RemoveDoorInfoFromTable( pDoor->sGridNo ); + sLockDamage = min(sLockDamage,127); - // MARKSMANSHIP GAIN (marksPts): Opened/Damaged a door - StatChange( pBullet->pFirer, MARKAMT, 10, FALSE ); + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ LOCK_HAS_BEEN_HIT ] ); + //Madd: catch the overflow + if ( sLockDamage + pDoor->bLockDamage > 127 ) + pDoor->bLockDamage = 127; + else + pDoor->bLockDamage+= sLockDamage; + + // Check if it has been shot! + if ( pDoor->bLockDamage > LockTable[ pDoor->ubLockID ].ubSmashDifficulty || sLockDamage > LockTable[ pDoor->ubLockID ].ubSmashDifficulty ) + { + // Display message! + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ LOCK_HAS_BEEN_DESTROYED ] ); + + // succeeded! door can never be locked again, so remove from door list... + RemoveDoorInfoFromTable( pDoor->sGridNo ); + + // MARKSMANSHIP GAIN (marksPts): Opened/Damaged a door + StatChange( pBullet->pFirer, MARKAMT, 10, FALSE ); + + } } } } diff --git a/Tactical/SoldierTooltips.cpp b/Tactical/SoldierTooltips.cpp index 98e6c1b7..29b6b493 100644 --- a/Tactical/SoldierTooltips.cpp +++ b/Tactical/SoldierTooltips.cpp @@ -16,15 +16,17 @@ const int DL_Basic = 2; const int DL_Full = 3; const int DL_Debug = 4; -void DisplayWeaponInfo( SOLDIERTYPE*, CHAR16*, UINT8 ); +void DisplayWeaponInfo( SOLDIERTYPE*, CHAR16*, UINT8, UINT8 ); void DrawMouseTooltip(void); +#define MAX(a, b) (a > b ? a : b) + void SoldierTooltip( SOLDIERTYPE* pSoldier ) { - SGPRect aRect; + SGPRect aRect; extern void GetSoldierScreenRect(SOLDIERTYPE*,SGPRect*); GetSoldierScreenRect( pSoldier, &aRect ); - INT16 a1,a2; + INT16 a1,a2; if ( gfKeyState[ALT] && pSoldier && IsPointInScreenRectWithRelative( gusMouseXPos, gusMouseYPos, &aRect, &a1, &a2 ) ) @@ -32,27 +34,82 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) MOUSETT *pRegion = &mouseTT; CHAR16 pStrInfo[ sizeof( pRegion->FastHelpText ) ]; int iNVG = 0; - INT8 bGasMaskPos; - INT16 sSoldierGridNo; + BOOLEAN fDisplayBigSlotItem = FALSE; + BOOLEAN fMercIsUsingScope = FALSE; + UINT16 iCarriedRL = 0; + INT32 iRangeToTarget = 0; + UINT8 ubTooltipDetailLevel = gGameExternalOptions.ubSoldierTooltipDetailLevel; + UINT32 uiMaxTooltipDistance = gGameExternalOptions.ubStraightSightRange; - //Get the gridno the cursor is at + // get the gridno the cursor is at GetMouseMapPos( &sSoldierGridNo ); + // get the distance to enemy's tile from the selected merc + if ( gusSelectedSoldier != NOBODY ) + iRangeToTarget = GetRangeInCellCoordsFromGridNoDiff( MercPtrs[ gusSelectedSoldier ]->sGridNo, sSoldierGridNo ) / 10; + + if ( gGameExternalOptions.fEnableDynamicSoldierTooltips ) + { + for ( INT32 cnt = 0; cnt < MAX_ATTACHMENTS; cnt++ ) + { + if ( Item[MercPtrs[gusSelectedSoldier]->inv[HANDPOS].usAttachItem[cnt]].visionrangebonus > 0 ) + { + fMercIsUsingScope = TRUE; + break; + } + } + + if ( fMercIsUsingScope ) + { + // set detail level to (at least) Full + ubTooltipDetailLevel = MAX(DL_Full,ubTooltipDetailLevel); + } + else + { + // add 10% to max tooltip viewing distance per level of the merc + uiMaxTooltipDistance *= 1 + (MercPtrs[ gusSelectedSoldier ]->bExpLevel / 10); + + if ( gGameExternalOptions.gfAllowLimitedVision ) + uiMaxTooltipDistance *= 1 - (gGameExternalOptions.ubVisDistDecreasePerRainIntensity / 100); + + if ( !(Item[MercPtrs[gusSelectedSoldier]->inv[HEAD1POS].usItem].nightvisionrangebonus > 0) && + !(Item[MercPtrs[gusSelectedSoldier]->inv[HEAD2POS].usItem].nightvisionrangebonus > 0) && + !DayTime() ) + { + // if night reduce max tooltip viewing distance by a factor of 4 if merc is not wearing NVG + uiMaxTooltipDistance >>= 2; + } + + if ( iRangeToTarget <= (INT32)(uiMaxTooltipDistance / 2) ) + { + // at under half the maximum view distance set tooltip detail to (at least) Basic + ubTooltipDetailLevel = MAX(DL_Basic,ubTooltipDetailLevel); + } + else if ( iRangeToTarget <= (INT32)uiMaxTooltipDistance ) + { + // at under the maximum view distance set tooltip detail to (at least) Limited + ubTooltipDetailLevel = MAX(DL_Limited,ubTooltipDetailLevel); + } + else + { + // beyond visual range, do not display tooltip if player has not chosen full or debug details + if ( ubTooltipDetailLevel < DL_Full ) + return; + } + } // fMercIsUsingScope is false + } // gGameExternalOptions.fEnableDynamicSoldierTooltips + swprintf( pStrInfo, L"" ); - if ( gGameExternalOptions.ubSoldierTooltipDetailLevel == DL_Debug ) + if ( ubTooltipDetailLevel == DL_Debug ) { // display "debug" info if ( gGameExternalOptions.fEnableSoldierTooltipLocation ) swprintf( pStrInfo, L"%s|Location: %d\n", pStrInfo, sSoldierGridNo ); if ( gGameExternalOptions.fEnableSoldierTooltipBrightness ) swprintf( pStrInfo, L"%s|Brightness: %d / %d\n", pStrInfo, SHADE_MIN - LightTrueLevel( sSoldierGridNo, gsInterfaceLevel ), SHADE_MIN ); - if ( ( gGameExternalOptions.fEnableSoldierTooltipRangeToTarget ) && - ( gusSelectedSoldier != NOBODY ) ) - { - swprintf( pStrInfo, L"%s|Range to |Target: %d\n", pStrInfo, - GetRangeInCellCoordsFromGridNoDiff( MercPtrs[ gusSelectedSoldier ]->sGridNo, sSoldierGridNo ) / 10 ); - } + if ( gGameExternalOptions.fEnableSoldierTooltipRangeToTarget ) + swprintf( pStrInfo, L"%s|Range to |Target: %d\n", pStrInfo, iRangeToTarget ); if ( gGameExternalOptions.fEnableSoldierTooltipID ) swprintf( pStrInfo, L"%s|I|D: %d\n", pStrInfo, pSoldier->ubID ); if ( gGameExternalOptions.fEnableSoldierTooltipOrders ) @@ -66,7 +123,7 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) } // armor info code block start - if ( gGameExternalOptions.ubSoldierTooltipDetailLevel >= DL_Full ) + if ( ubTooltipDetailLevel >= DL_Full ) { if ( gGameExternalOptions.fEnableSoldierTooltipHelmet ) swprintf( pStrInfo, L"%s|Helmet: %s\n", pStrInfo, pSoldier->inv[HELMETPOS].usItem ? ItemNames[ pSoldier->inv[HELMETPOS].usItem ] : L"No helmet" ); @@ -85,7 +142,7 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) if ( ArmourPercent( pSoldier ) ) { swprintf( pStrInfo, L"|Armor: " ); - if ( gGameExternalOptions.ubSoldierTooltipDetailLevel == DL_Basic ) + if ( ubTooltipDetailLevel == DL_Basic ) { if ( gGameExternalOptions.fEnableSoldierTooltipHelmet ) swprintf( pStrInfo, L"%s%s", pStrInfo, pSoldier->inv[HELMETPOS].usItem ? L"helmet " : L"" ); @@ -95,7 +152,7 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) swprintf( pStrInfo, L"%s%s", pStrInfo, pSoldier->inv[LEGPOS].usItem ? L"leggings" : L"" ); wcscat( pStrInfo, L"\n" ); } - else // gGameExternalOptions.ubSoldierTooltipDetailLevel == DL_Limited + else // ubTooltipDetailLevel == DL_Limited { swprintf( pStrInfo, L"|Armor: %s\n", L"worn" ); } @@ -109,7 +166,7 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) // armor info code block end // head slots info code block start - if ( gGameExternalOptions.ubSoldierTooltipDetailLevel != DL_Debug ) + if ( ubTooltipDetailLevel != DL_Debug ) { if( Item[pSoldier->inv[HEAD1POS].usItem].nightvisionrangebonus > 0 ) @@ -121,7 +178,7 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) !gGameExternalOptions.fEnableSoldierTooltipHeadItem2) ) // do not display the NVG/mask lines if both head slot toggles are set to false { - if ( gGameExternalOptions.ubSoldierTooltipDetailLevel >= DL_Full ) + if ( ubTooltipDetailLevel >= DL_Full ) { swprintf( pStrInfo, L"%s|N|V|G: %s\n", pStrInfo, iNVG ? ItemNames[ pSoldier->inv[ iNVG ].usItem ] : L"no NVG" ); @@ -130,9 +187,8 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) { swprintf( pStrInfo, L"%s|N|V|G: %s\n", pStrInfo, iNVG ? L"worn" : L"no NVG" ); } - bGasMaskPos = FindGasMask(pSoldier); swprintf( pStrInfo, L"%s|Gas |Mask: %s\n", pStrInfo, - ( bGasMaskPos == HEAD1POS || bGasMaskPos == HEAD2POS ) ? L"worn" : L"no mask" ); + ( FindGasMask(pSoldier) != NO_SLOT ) ? L"worn" : L"no mask" ); } } else // gGameExternalOptions.ubSoldierTooltipDetailLevel == DL_Debug @@ -147,7 +203,7 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) // weapon in primary hand info code block start if ( gGameExternalOptions.fEnableSoldierTooltipWeapon ) { - DisplayWeaponInfo( pSoldier, pStrInfo, HANDPOS ); + DisplayWeaponInfo( pSoldier, pStrInfo, HANDPOS, ubTooltipDetailLevel ); } // gGameExternalOptions.fEnableSoldierTooltipWeapon // weapon in primary hand info code block end @@ -158,7 +214,7 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) { // if there's something in the slot display it wcscat( pStrInfo, L"\n" ); - DisplayWeaponInfo( pSoldier, pStrInfo, SECONDHANDPOS ); + DisplayWeaponInfo( pSoldier, pStrInfo, SECONDHANDPOS, ubTooltipDetailLevel ); } } // weapon in off hand info code block end @@ -190,6 +246,9 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) break; } + if ( Item[ pSoldier->inv[ BigSlot ].usItem ].rocketlauncher ) + iCarriedRL = pSoldier->inv[ BigSlot ].usItem; // remember that enemy is carrying a rocket launcher when check for rocket ammo is made later on + if ( ( Item[ pSoldier->inv[ BigSlot ].usItem ].usItemClass == IC_LAUNCHER ) || ( Item[ pSoldier->inv[ BigSlot ].usItem ].usItemClass == IC_GUN ) ) { @@ -198,19 +257,33 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) ( Weapon[pSoldier->inv[ BigSlot ].usItem].ubWeaponClass != SMGCLASS ) ) { // it's a long gun or heavy weapon - wcscat( pStrInfo, L"\n(In Backpack) " ); - DisplayWeaponInfo( pSoldier, pStrInfo, BigSlot ); + fDisplayBigSlotItem = TRUE; } } + else + { + // check for rocket ammo + if ( ( iCarriedRL != 0 ) && // soldier is carrying a RL ... + ValidLaunchable( pSoldier->inv[ BigSlot ].usItem, iCarriedRL ) ) // this item is launchable by the RL + { + fDisplayBigSlotItem = TRUE; + } + } + if ( fDisplayBigSlotItem ) + { + wcscat( pStrInfo, L"\n(In Backpack) " ); + DisplayWeaponInfo( pSoldier, pStrInfo, BigSlot, ubTooltipDetailLevel ); + fDisplayBigSlotItem = FALSE; + } } // large objects in big inventory slots info code block end pRegion->iX = gusMouseXPos; pRegion->iY = gusMouseYPos; - if ( gGameExternalOptions.ubSoldierTooltipDetailLevel == DL_Debug ) - swprintf( pRegion->FastHelpText, L"%s\n|String |Length|: %d", pStrInfo, wcslen(pStrInfo) ); - else +// if ( gGameExternalOptions.ubSoldierTooltipDetailLevel == DL_Debug ) +// swprintf( pRegion->FastHelpText, L"%s\n|String |Length|: %d", pStrInfo, wcslen(pStrInfo) ); +// else wcscpy( pRegion->FastHelpText, pStrInfo ); } @@ -222,11 +295,16 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier ) } // SoldierTooltip(SOLDIERTYPE* pSoldier) -void DisplayWeaponInfo( SOLDIERTYPE* pSoldier, CHAR16* pStrInfo, UINT8 ubSlot ) +void DisplayWeaponInfo( SOLDIERTYPE* pSoldier, CHAR16* pStrInfo, UINT8 ubSlot, UINT8 ubTooltipDetailLevel ) { - INT32 iNumAttachments = 0; + const int TriggerGroup = 1026; + const int GunBarrelExtender = 310; + const int CMagAdapter556mm = 1001; + const int CMagAdapter9mm = 1002; + INT32 iNumAttachments = 0; + BOOLEAN fDisplayAttachment = FALSE; - if ( gGameExternalOptions.ubSoldierTooltipDetailLevel >= DL_Full ) + if ( ubTooltipDetailLevel >= DL_Full ) { // display exact weapon model swprintf( pStrInfo, L"%s|Weapon: %s ", pStrInfo, @@ -234,7 +312,7 @@ void DisplayWeaponInfo( SOLDIERTYPE* pSoldier, CHAR16* pStrInfo, UINT8 ubSlot ) } else { - if ( gGameExternalOptions.ubSoldierTooltipDetailLevel == DL_Limited ) + if ( ubTooltipDetailLevel == DL_Limited ) { // display general weapon class switch( Weapon[pSoldier->inv[ubSlot].usItem].ubWeaponClass ) @@ -277,30 +355,50 @@ void DisplayWeaponInfo( SOLDIERTYPE* pSoldier, CHAR16* pStrInfo, UINT8 ubSlot ) { if ( pSoldier->inv[ubSlot].usAttachItem[ cnt ] != NOTHING ) { - if ( gGameExternalOptions.ubSoldierTooltipDetailLevel == DL_Basic ) + if ( ubTooltipDetailLevel == DL_Basic ) { // display only externally-visible weapon attachments - // don't display inseparable attachments + // don't display inseparable attachments such as the integral GLs on OICW & AICW if ( !Item[pSoldier->inv[ubSlot].usAttachItem[ cnt ]].inseparable ) { - iNumAttachments++; - if ( iNumAttachments == 1 ) - wcscat( pStrInfo, L"\n[" ); - else - wcscat( pStrInfo, L", " ); - wcscat( pStrInfo, ItemNames[ pSoldier->inv[ubSlot].usAttachItem[ cnt ] ] ); - + if ( pSoldier->inv[ubSlot].usAttachItem[ cnt ] != TriggerGroup ) + { + fDisplayAttachment = TRUE; + } + } + else + { + // display C-mags and barrel extensions + switch( pSoldier->inv[ubSlot].usAttachItem[ cnt ] ) + { + case GunBarrelExtender: + fDisplayAttachment = TRUE; + break; + case CMagAdapter556mm: + fDisplayAttachment = TRUE; + break; + case CMagAdapter9mm: + fDisplayAttachment = TRUE; + break; + default: + break; + } } } else { // display all weapon attachments + fDisplayAttachment = TRUE; + } + if ( fDisplayAttachment ) + { iNumAttachments++; if ( iNumAttachments == 1 ) wcscat( pStrInfo, L"\n[" ); else wcscat( pStrInfo, L", " ); wcscat( pStrInfo, ItemNames[ pSoldier->inv[ubSlot].usAttachItem[ cnt ] ] ); + fDisplayAttachment = FALSE; // clear flag for next loop iteration } } // pSoldier->inv[HANDPOS].usAttachItem[ cnt ] != NOTHING } // for