From 7810a35a968e1d3b2ff66cb608e01e8d953829c2 Mon Sep 17 00:00:00 2001 From: Sevenfm Date: Tue, 24 Mar 2020 20:32:13 +0000 Subject: [PATCH] [F] key should correctly show CTH for different types of attacks: - gun - launcher - grenade - thrown knife - punch - toss item git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8775 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Tactical/DisplayCover.cpp | 344 +++++++++++++++++++++----------------- 1 file changed, 195 insertions(+), 149 deletions(-) diff --git a/Tactical/DisplayCover.cpp b/Tactical/DisplayCover.cpp index c562eee9..4aec35ec 100644 --- a/Tactical/DisplayCover.cpp +++ b/Tactical/DisplayCover.cpp @@ -799,169 +799,215 @@ BOOLEAN CanSoldierSeeFloor( SOLDIERTYPE* pSoldier, INT32 sGridNo, INT8 bLevel ) return FALSE; } -void DisplayRangeToTarget( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo ) +void DisplayRangeToTarget(SOLDIERTYPE *pSoldier, INT32 sTargetGridNo) { - UINT16 usRange=0; + UINT16 usRange = 0; CHAR16 zOutputString[512]; UINT8 title = (UsingNewCTHSystem() == true ? DC_MSG__NCTH_GUN_RANGE_INFORMATION : DC_MSG__GUN_RANGE_INFORMATION); - if( sTargetGridNo == NOWHERE || sTargetGridNo == 0 ) + if (sTargetGridNo == NOWHERE || sTargetGridNo == 0) { return; } + UINT8 ubLightLevel = LightTrueLevel(sTargetGridNo, gsInterfaceLevel); + UINT8 ubBrightness = 100 - 100 * (ubLightLevel - SHADE_MAX) / (SHADE_MIN - SHADE_MAX); // percentage + + UINT8 ubTerrainType = NO_TERRAIN; + + // anv: additional tile properties + ADDITIONAL_TILE_PROPERTIES_VALUES zGivenTileProperties; + memset(&zGivenTileProperties, 0, sizeof(zGivenTileProperties)); + if (gGameExternalOptions.fAdditionalTileProperties) { - UINT8 ubLightLevel = LightTrueLevel(sTargetGridNo, gsInterfaceLevel); - UINT8 ubBrightness = 100 - 100 * (ubLightLevel-SHADE_MAX)/(SHADE_MIN-SHADE_MAX); // percentage - - UINT8 ubTerrainType = NO_TERRAIN; - - // anv: additional tile properties - ADDITIONAL_TILE_PROPERTIES_VALUES zGivenTileProperties; - memset(&zGivenTileProperties,0,sizeof(zGivenTileProperties)); - if(gGameExternalOptions.fAdditionalTileProperties) - { - zGivenTileProperties = GetAllAdditonalTilePropertiesForGrid(sTargetGridNo, gsInterfaceLevel); - } - else - { - ubTerrainType = GetTerrainTypeForGrid(sTargetGridNo, gsInterfaceLevel); - } - - INT8 ubCover = - GetSightAdjustment(pSoldier, GetStealth(pSoldier), GetSightAdjustmentBasedOnLBE(pSoldier), sTargetGridNo, gsInterfaceLevel); - - //display a string with cover value of current selected merc and brightness - //swprintf( zOutputString, gzDisplayCoverText[DC_MSG__COVER_INFORMATION], ubCover, GetTerrainName(ubTerrainType), ubBrightness ); - - //Display the msg - //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, zOutputString ); - - if(gGameExternalOptions.fAdditionalTileProperties) - { - if(!gGameExternalOptions.fCoverTooltipDetailedTileProperties) - { - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, - gzDisplayCoverText[DC_MSG__COVER_INFORMATION], - ubCover, GetDetailedTerrainName(zGivenTileProperties), ubBrightness ); - } - else - { - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, - gzDisplayCoverText[DC_MSG__COVER_INFORMATION_WITH_DETAILED_CAMO], - ubCover, ubBrightness ); - - UINT8 ubApplicableProperties = 0; - swprintf( zOutputString, L"" ); - if(zGivenTileProperties.bWoodCamoAffinity > 0) - { - swprintf( zOutputString + wcslen(zOutputString), gzDisplayCoverText[DC_TTI__WOOD]); - swprintf( zOutputString + wcslen(zOutputString), L": %d/100", zGivenTileProperties.bWoodCamoAffinity); - ubApplicableProperties++; - } - if(zGivenTileProperties.bDesertCamoAffinity > 0) - { - if(ubApplicableProperties) - swprintf( zOutputString + wcslen(zOutputString), L", "); - swprintf( zOutputString + wcslen(zOutputString), gzDisplayCoverText[DC_TTI__DESERT]); - swprintf( zOutputString + wcslen(zOutputString), L": %d/100", zGivenTileProperties.bDesertCamoAffinity); - ubApplicableProperties++; - } - if(zGivenTileProperties.bUrbanCamoAffinity > 0) - { - if(ubApplicableProperties) - swprintf( zOutputString + wcslen(zOutputString), L", "); - swprintf( zOutputString + wcslen(zOutputString), gzDisplayCoverText[DC_TTI__URBAN]); - swprintf( zOutputString + wcslen(zOutputString), L": %d/100", zGivenTileProperties.bUrbanCamoAffinity); - ubApplicableProperties++; - } - if(zGivenTileProperties.bSnowCamoAffinity > 0) - { - if(ubApplicableProperties) - swprintf( zOutputString + wcslen(zOutputString), L", "); - swprintf( zOutputString + wcslen(zOutputString), gzDisplayCoverText[DC_TTI__SNOW]); - swprintf( zOutputString + wcslen(zOutputString), L": %d/100", zGivenTileProperties.bSnowCamoAffinity); - ubApplicableProperties++; - } - if(zGivenTileProperties.bSoundModifier != 0) - { - if(ubApplicableProperties) - swprintf( zOutputString + wcslen(zOutputString), L", "); - swprintf( zOutputString + wcslen(zOutputString), gzDisplayCoverText[DC_TTI__DETAILED_SOUND]); - if(zGivenTileProperties.bSoundModifier > 0) - swprintf( zOutputString + wcslen(zOutputString), L": +%d", zGivenTileProperties.bSoundModifier); - else - swprintf( zOutputString + wcslen(zOutputString), L": %d", zGivenTileProperties.bSoundModifier); - ubApplicableProperties++; - } - if(zGivenTileProperties.bStealthDifficultyModifer != 0) - { - if(ubApplicableProperties) - swprintf( zOutputString + wcslen(zOutputString), L", "); - swprintf( zOutputString + wcslen(zOutputString), gzDisplayCoverText[DC_TTI__DETAILED_STEALTH]); - if(zGivenTileProperties.bStealthDifficultyModifer > 0) - swprintf( zOutputString + wcslen(zOutputString), L": +%d/100", zGivenTileProperties.bStealthDifficultyModifer); - else - swprintf( zOutputString + wcslen(zOutputString), L": %d/100", zGivenTileProperties.bStealthDifficultyModifer); - ubApplicableProperties++; - } - if(zGivenTileProperties.bTrapBonus != 0) - { - if(ubApplicableProperties) - swprintf( zOutputString + wcslen(zOutputString), L", "); - swprintf( zOutputString + wcslen(zOutputString), gzDisplayCoverText[DC_TTI__DETAILED_TRAP_LEVEL]); - if(zGivenTileProperties.bTrapBonus > 0) - swprintf( zOutputString + wcslen(zOutputString), L": +%d", zGivenTileProperties.bTrapBonus); - else - swprintf( zOutputString + wcslen(zOutputString), L": %d", zGivenTileProperties.bTrapBonus); - ubApplicableProperties++; - } - if( wcslen(zOutputString) > 0 ) - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, zOutputString ); - } - } - else - { - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, - gzDisplayCoverText[DC_MSG__COVER_INFORMATION], - ubCover, GetTerrainName(ubTerrainType), ubBrightness ); - } - } - - //Get the range to the target location - usRange = GetRangeInCellCoordsFromGridNoDiff( pSoldier->sGridNo, sTargetGridNo ); - - //if the soldier has a weapon in hand, display gun range and chance to hit - if( WeaponInHand( pSoldier ) ) - { - UINT32 uiHitChance; - //AXP 30.03.2007: Fix CtH calculation for first shot after changing aim level (roof/ground) - INT8 bTempTargetLevel = pSoldier->bTargetLevel; - pSoldier->bTargetLevel = (INT8)gsInterfaceLevel; - uiHitChance = CalcChanceToHitGun( pSoldier, sTargetGridNo, (INT8)(pSoldier->aiData.bShownAimTime ), pSoldier->bAimShotLocation ); - // HEADROCK HAM B2.7: CTH approximation? - if (gGameExternalOptions.fApproximateCTH) - { - uiHitChance = ChanceToHitApproximation( pSoldier, uiHitChance ); - } - pSoldier->bTargetLevel = bTempTargetLevel; - - // HEADROCK HAM 3.6: Calculate Gun Range using formula. - // Flugente: we might be equipped with an underbarrel gun.... - OBJECTTYPE* pObjhand = pSoldier->GetUsedWeapon(&pSoldier->inv[HANDPOS]); - UINT16 usGunRange = GunRange(pObjhand, pSoldier ); // SANDRO - added argument - - swprintf( zOutputString, gzDisplayCoverText[title], usRange / 10, usGunRange / 10, uiHitChance ); - //Display the msg - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, zOutputString ); + zGivenTileProperties = GetAllAdditonalTilePropertiesForGrid(sTargetGridNo, gsInterfaceLevel); } else { - swprintf( zOutputString, gzDisplayCoverText[title], usRange / 10, 0, 0 ); - - //Display the msg - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, zOutputString ); + ubTerrainType = GetTerrainTypeForGrid(sTargetGridNo, gsInterfaceLevel); } + INT8 ubCover = -GetSightAdjustment(pSoldier, GetStealth(pSoldier), GetSightAdjustmentBasedOnLBE(pSoldier), sTargetGridNo, gsInterfaceLevel); + + //display a string with cover value of current selected merc and brightness + //swprintf( zOutputString, gzDisplayCoverText[DC_MSG__COVER_INFORMATION], ubCover, GetTerrainName(ubTerrainType), ubBrightness ); + + //Display the msg + //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, zOutputString ); + + if (gGameExternalOptions.fAdditionalTileProperties) + { + if (!gGameExternalOptions.fCoverTooltipDetailedTileProperties) + { + ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, + gzDisplayCoverText[DC_MSG__COVER_INFORMATION], + ubCover, GetDetailedTerrainName(zGivenTileProperties), ubBrightness); + } + else + { + ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, + gzDisplayCoverText[DC_MSG__COVER_INFORMATION_WITH_DETAILED_CAMO], + ubCover, ubBrightness); + + UINT8 ubApplicableProperties = 0; + swprintf(zOutputString, L""); + if (zGivenTileProperties.bWoodCamoAffinity > 0) + { + swprintf(zOutputString + wcslen(zOutputString), gzDisplayCoverText[DC_TTI__WOOD]); + swprintf(zOutputString + wcslen(zOutputString), L": %d/100", zGivenTileProperties.bWoodCamoAffinity); + ubApplicableProperties++; + } + if (zGivenTileProperties.bDesertCamoAffinity > 0) + { + if (ubApplicableProperties) + swprintf(zOutputString + wcslen(zOutputString), L", "); + swprintf(zOutputString + wcslen(zOutputString), gzDisplayCoverText[DC_TTI__DESERT]); + swprintf(zOutputString + wcslen(zOutputString), L": %d/100", zGivenTileProperties.bDesertCamoAffinity); + ubApplicableProperties++; + } + if (zGivenTileProperties.bUrbanCamoAffinity > 0) + { + if (ubApplicableProperties) + swprintf(zOutputString + wcslen(zOutputString), L", "); + swprintf(zOutputString + wcslen(zOutputString), gzDisplayCoverText[DC_TTI__URBAN]); + swprintf(zOutputString + wcslen(zOutputString), L": %d/100", zGivenTileProperties.bUrbanCamoAffinity); + ubApplicableProperties++; + } + if (zGivenTileProperties.bSnowCamoAffinity > 0) + { + if (ubApplicableProperties) + swprintf(zOutputString + wcslen(zOutputString), L", "); + swprintf(zOutputString + wcslen(zOutputString), gzDisplayCoverText[DC_TTI__SNOW]); + swprintf(zOutputString + wcslen(zOutputString), L": %d/100", zGivenTileProperties.bSnowCamoAffinity); + ubApplicableProperties++; + } + if (zGivenTileProperties.bSoundModifier != 0) + { + if (ubApplicableProperties) + swprintf(zOutputString + wcslen(zOutputString), L", "); + swprintf(zOutputString + wcslen(zOutputString), gzDisplayCoverText[DC_TTI__DETAILED_SOUND]); + if (zGivenTileProperties.bSoundModifier > 0) + swprintf(zOutputString + wcslen(zOutputString), L": +%d", zGivenTileProperties.bSoundModifier); + else + swprintf(zOutputString + wcslen(zOutputString), L": %d", zGivenTileProperties.bSoundModifier); + ubApplicableProperties++; + } + if (zGivenTileProperties.bStealthDifficultyModifer != 0) + { + if (ubApplicableProperties) + swprintf(zOutputString + wcslen(zOutputString), L", "); + swprintf(zOutputString + wcslen(zOutputString), gzDisplayCoverText[DC_TTI__DETAILED_STEALTH]); + if (zGivenTileProperties.bStealthDifficultyModifer > 0) + swprintf(zOutputString + wcslen(zOutputString), L": +%d/100", zGivenTileProperties.bStealthDifficultyModifer); + else + swprintf(zOutputString + wcslen(zOutputString), L": %d/100", zGivenTileProperties.bStealthDifficultyModifer); + ubApplicableProperties++; + } + if (zGivenTileProperties.bTrapBonus != 0) + { + if (ubApplicableProperties) + swprintf(zOutputString + wcslen(zOutputString), L", "); + swprintf(zOutputString + wcslen(zOutputString), gzDisplayCoverText[DC_TTI__DETAILED_TRAP_LEVEL]); + if (zGivenTileProperties.bTrapBonus > 0) + swprintf(zOutputString + wcslen(zOutputString), L": +%d", zGivenTileProperties.bTrapBonus); + else + swprintf(zOutputString + wcslen(zOutputString), L": %d", zGivenTileProperties.bTrapBonus); + ubApplicableProperties++; + } + if (wcslen(zOutputString) > 0) + ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, zOutputString); + } + } + else + { + ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, + gzDisplayCoverText[DC_MSG__COVER_INFORMATION], + ubCover, GetTerrainName(ubTerrainType), ubBrightness); + } + + //Get the range to the target location + usRange = GetRangeInCellCoordsFromGridNoDiff(pSoldier->sGridNo, sTargetGridNo); + UINT8 ubItemCursor = GetActionModeCursor(pSoldier); + UINT32 uiHitChance = 0; + UINT16 usGunRange = 0; + INT8 bTempTargetLevel = pSoldier->bTargetLevel; + UINT16 usTempAttackingWeapon = pSoldier->usAttackingWeapon; + + pSoldier->usAttackingWeapon = 0; + //AXP 30.03.2007: Fix CtH calculation for first shot after changing aim level (roof/ground) + pSoldier->bTargetLevel = (INT8)gsInterfaceLevel; + + //if the soldier has a weapon in hand, display gun range and chance to hit + if (WeaponInHand(pSoldier)) + { + // Flugente: we might be equipped with an underbarrel gun.... + OBJECTTYPE* pObjhand = pSoldier->GetUsedWeapon(&pSoldier->inv[HANDPOS]); + UINT32 usItemClass = Item[pObjhand->usItem].usItemClass; + + pSoldier->usAttackingWeapon = pObjhand->usItem; + + // sevenfm: if using launcher or throwing knife, use CalcThrownChanceToHit + if (ubItemCursor == TRAJECTORYCURS || usItemClass == IC_THROWING_KNIFE) + { + uiHitChance = CalcThrownChanceToHit(pSoldier, sTargetGridNo, pSoldier->aiData.bShownAimTime, pSoldier->bAimShotLocation); + usGunRange = CalcMaxTossRange(pSoldier, pObjhand->usItem, TRUE) * CELL_X_SIZE; + } + else if (usItemClass == IC_BLADE) + { + if (gfUIFullTargetFound && MercPtrs[gusUIFullTargetID]) + uiHitChance = CalcChanceToStab(pSoldier, MercPtrs[gusUIFullTargetID], pSoldier->aiData.bShownAimTime); + else + uiHitChance = 0; + usGunRange = 15; + swprintf(zOutputString, gzDisplayCoverText[title], usRange / 10, usGunRange / 10, uiHitChance); + } + else if (ubItemCursor == TOSSCURS) + { + uiHitChance = CalcThrownChanceToHit(pSoldier, sTargetGridNo, pSoldier->aiData.bShownAimTime, pSoldier->bAimShotLocation); + usGunRange = CalcMaxTossRange(pSoldier, pSoldier->inv[HANDPOS].usItem, TRUE) * CELL_X_SIZE; + swprintf(zOutputString, gzDisplayCoverText[title], usRange / 10, usGunRange / 10, uiHitChance); + } + else + { + uiHitChance = CalcChanceToHitGun(pSoldier, sTargetGridNo, (INT8)(pSoldier->aiData.bShownAimTime), pSoldier->bAimShotLocation); + // HEADROCK HAM B2.7: CTH approximation? + if (gGameExternalOptions.fApproximateCTH) + { + uiHitChance = ChanceToHitApproximation(pSoldier, uiHitChance); + } + // HEADROCK HAM 3.6: Calculate Gun Range using formula. + usGunRange = GunRange(pObjhand, pSoldier); // SANDRO - added argument + } + swprintf(zOutputString, gzDisplayCoverText[title], usRange / 10, usGunRange / 10, uiHitChance); + } + else if (pSoldier->inv[HANDPOS].exists() && ubItemCursor == TOSSCURS) + { + pSoldier->usAttackingWeapon = pSoldier->inv[HANDPOS].usItem; + uiHitChance = CalcThrownChanceToHit(pSoldier, sTargetGridNo, pSoldier->aiData.bShownAimTime, pSoldier->bAimShotLocation); + usGunRange = CalcMaxTossRange(pSoldier, pSoldier->inv[HANDPOS].usItem, TRUE) * CELL_X_SIZE; + swprintf(zOutputString, gzDisplayCoverText[title], usRange / 10, usGunRange / 10, uiHitChance); + } + else if ((!pSoldier->inv[HANDPOS].exists() || Item[pSoldier->inv[HANDPOS].usItem].usItemClass == IC_PUNCH) && gfUIFullTargetFound && MercPtrs[gusUIFullTargetID]) + { + if (pSoldier->inv[HANDPOS].exists()) + pSoldier->usAttackingWeapon = pSoldier->inv[HANDPOS].usItem; + else + pSoldier->usAttackingWeapon = 0; + uiHitChance = CalcChanceToPunch(pSoldier, MercPtrs[gusUIFullTargetID], pSoldier->aiData.bShownAimTime); + usGunRange = 15; + swprintf(zOutputString, gzDisplayCoverText[title], usRange / 10, usGunRange / 10, uiHitChance); + } + else + { + swprintf(zOutputString, gzDisplayCoverText[title], usRange / 10, 0, 0); + } + + pSoldier->bTargetLevel = bTempTargetLevel; + pSoldier->usAttackingWeapon = usTempAttackingWeapon; + + //Display the msg + ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, zOutputString); + //increment the display gun range counter ( just seeing how many times people use it ) //gJa25SaveStruct.uiDisplayGunRangeCounter++; }