diff --git a/GameSettings.cpp b/GameSettings.cpp index f47acc80..915e34b8 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -361,6 +361,7 @@ void LoadGameExternalOptions() //Sight range gGameExternalOptions.ubStraightSightRange = iniReader.ReadInteger("JA2 Tactical Settings","BASE_SIGHT_RANGE",13); gGameExternalOptions.ubVisDistDecreasePerRainIntensity = iniReader.ReadInteger("JA2 Tactical Settings","VISUAL_DISTANCE_DECREASE_PER_RAIN_INTENSITY",20); + gGameExternalOptions.gfAllowLimitedVision = iniReader.ReadBoolean("JA2 Tactical Settings","ALLOW_LIMITED_VISION",0); // Maximal search distance for grenades //gGameExternalOptions.guiMaxTossSearchDist = iniReader.ReadInteger("JA2 Tactical Settings","MaxTossSearchDist",3); diff --git a/GameSettings.h b/GameSettings.h index 253e8004..f10d9c94 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -207,6 +207,7 @@ typedef struct //Sight range UINT8 ubStraightSightRange; UINT32 ubVisDistDecreasePerRainIntensity; + BOOLEAN gfAllowLimitedVision; // Rain settings BOOLEAN gfAllowRain; diff --git a/GameVersion.cpp b/GameVersion.cpp index 7536ce72..e6c6319b 100644 --- a/GameVersion.cpp +++ b/GameVersion.cpp @@ -23,7 +23,7 @@ INT16 zVersionLabel[256] = { L"Beta v. 0.98" }; #else //RELEASE BUILD VERSION - INT16 zVersionLabel[256] = { L"Release v1.13.125" }; + INT16 zVersionLabel[256] = { L"Release v1.13.128" }; #endif diff --git a/JA2.vcproj b/JA2.vcproj index ee55a12f..1fa6c17e 100644 --- a/JA2.vcproj +++ b/JA2.vcproj @@ -43,7 +43,7 @@ bLevel; - sAirRaidSaveStruct.bTeam = gpRaidSoldier->bTeam; - sAirRaidSaveStruct.bSide = gpRaidSoldier->bSide; - sAirRaidSaveStruct.ubAttackerID = gpRaidSoldier->ubAttackerID; - sAirRaidSaveStruct.usAttackingWeapon = gpRaidSoldier->usAttackingWeapon; - sAirRaidSaveStruct.dXPos = gpRaidSoldier->dXPos; - sAirRaidSaveStruct.dYPos = gpRaidSoldier->dYPos; - sAirRaidSaveStruct.sX = gpRaidSoldier->sX; - sAirRaidSaveStruct.sY = gpRaidSoldier->sY; - sAirRaidSaveStruct.sGridNo = gpRaidSoldier->sGridNo; - - sAirRaidSaveStruct.sRaidSoldierID = MAX_NUM_SOLDIERS - 1; -// sAirRaidSaveStruct.sRaidSoldierID = gpRaidSoldier->ubID; - } - else +// if( gpRaidSoldier ) +// { +// sAirRaidSaveStruct.bLevel = gpRaidSoldier->bLevel; +// sAirRaidSaveStruct.bTeam = gpRaidSoldier->bTeam; +// sAirRaidSaveStruct.bSide = gpRaidSoldier->bSide; +// sAirRaidSaveStruct.ubAttackerID = gpRaidSoldier->ubAttackerID; +// sAirRaidSaveStruct.usAttackingWeapon = gpRaidSoldier->usAttackingWeapon; +// sAirRaidSaveStruct.dXPos = gpRaidSoldier->dXPos; +// sAirRaidSaveStruct.dYPos = gpRaidSoldier->dYPos; +// sAirRaidSaveStruct.sX = gpRaidSoldier->sX; +// sAirRaidSaveStruct.sY = gpRaidSoldier->sY; +// sAirRaidSaveStruct.sGridNo = gpRaidSoldier->sGridNo; +// +// sAirRaidSaveStruct.sRaidSoldierID = MAX_NUM_SOLDIERS - 1; +//// sAirRaidSaveStruct.sRaidSoldierID = gpRaidSoldier->ubID; +// } +// else sAirRaidSaveStruct.sRaidSoldierID = -1; diff --git a/Tactical/DisplayCover.cpp b/Tactical/DisplayCover.cpp index e70c02f1..447824e6 100644 --- a/Tactical/DisplayCover.cpp +++ b/Tactical/DisplayCover.cpp @@ -434,7 +434,9 @@ INT8 CalcCoverForGridNoBasedOnTeamKnownEnemies( SOLDIERTYPE *pSoldier, INT16 sTa } usRange = (UINT16)GetRangeInCellCoordsFromGridNoDiff( pOpponent->sGridNo, sTargetGridNo ); - usSightLimit = DistanceVisible( pOpponent, DIRECTION_IRRELEVANT, DIRECTION_IRRELEVANT, sTargetGridNo, pSoldier->bLevel, pSoldier ); + // Lesh: changed 2-nd parameter in DistanceVisible function call + usSightLimit = DistanceVisible( pOpponent, (gGameExternalOptions.gfAllowLimitedVision ? pSoldier->bDesiredDirection : DIRECTION_IRRELEVANT), DIRECTION_IRRELEVANT, sTargetGridNo, pSoldier->bLevel, pSoldier ); + if( usRange > ( usSightLimit * CELL_X_SIZE ) ) { @@ -932,8 +934,9 @@ INT8 CalcIfSoldierCanSeeGridNo( SOLDIERTYPE *pSoldier, INT16 sTargetGridNo, BOOL } } + // Lesh: changed 2-nd parameter in DistanceVisible function call + usSightLimit = DistanceVisible( pSoldier, (gGameExternalOptions.gfAllowLimitedVision ? pSoldier->bDesiredDirection : DIRECTION_IRRELEVANT), DIRECTION_IRRELEVANT, sTargetGridNo, fRoof, pSoldier ); - usSightLimit = DistanceVisible( pSoldier, DIRECTION_IRRELEVANT, DIRECTION_IRRELEVANT, sTargetGridNo, fRoof, pSoldier ); // // Prone diff --git a/Tactical/Interface Items.cpp b/Tactical/Interface Items.cpp index dd90886f..984f7f11 100644 --- a/Tactical/Interface Items.cpp +++ b/Tactical/Interface Items.cpp @@ -7325,11 +7325,11 @@ void GetHelpTextForItem( INT16 * pzStr, OBJECTTYPE *pObject, SOLDIERTYPE *pSoldi INT16 apStr2[20]; UINT8 ubAttackAPs = BaseAPsToShootOrStab( DEFAULT_APS, DEFAULT_AIMSKILL, pObject ); - swprintf( (wchar_t *)apStr, L"%2d", ubAttackAPs ); + swprintf( (wchar_t *)apStr, L"%d", ubAttackAPs ); if (GetShotsPerBurst(pObject) > 0) { - swprintf( (wchar_t *)apStr2, L" / %2d", ubAttackAPs + CalcAPsToBurst( DEFAULT_APS, pObject ) ); + swprintf( (wchar_t *)apStr2, L" / %d", ubAttackAPs + CalcAPsToBurst( DEFAULT_APS, pObject ) ); wcscat( apStr, apStr2 ); } else @@ -7339,7 +7339,7 @@ void GetHelpTextForItem( INT16 * pzStr, OBJECTTYPE *pObject, SOLDIERTYPE *pSoldi if (GetAutofireShotsPerFiveAPs(pObject) > 0) { - swprintf( (wchar_t *)apStr2, L" / %2d", ubAttackAPs + CalcAPsToAutofire( DEFAULT_APS, pObject, 3 ) ); + swprintf( (wchar_t *)apStr2, L" / %d", ubAttackAPs + CalcAPsToAutofire( DEFAULT_APS, pObject, 3 ) ); wcscat( apStr, apStr2 ); } else @@ -7374,11 +7374,29 @@ void GetHelpTextForItem( INT16 * pzStr, OBJECTTYPE *pObject, SOLDIERTYPE *pSoldi ); } - // The next is for ammunition which gets the measurement 'rnds' - else if (Item[ usItem ].usItemClass == IC_AMMO) - { - swprintf( (wchar_t *)pStr, L"%s [%d rnds]", ItemNames[ usItem ], pObject->ubShotsLeft[0] ); - } + // The next is for ammunition which gets the measurement 'rnds' + else if (Item[ usItem ].usItemClass == IC_AMMO) + { + swprintf( (wchar_t *)pStr, L"%s [%d rnds]\n%s %1.1f %s", + ItemNames[ usItem ], //Item long name + pObject->ubShotsLeft[0], //Shots left + gWeaponStatsDesc[ 12 ], //Weight String + fWeight, //Weight + GetWeightUnitString() //Weight units + ); + + //Lal: do not delete, commented out for next version + //swprintf( (wchar_t *)pStr, L"%s %s %s %d [%d rnds]\n%s %1.1f %s", + // AmmoCaliber[ Magazine[ Item[usItem].ubClassIndex ].ubCalibre ], //Ammo calibre + // AmmoTypes[Magazine[ Item[usItem].ubClassIndex ].ubAmmoType].ammoName, //Ammo type + // MagNames[Magazine[ Item[usItem].ubClassIndex ].ubMagType], //Magazine type + // Magazine[ Item[usItem].ubClassIndex ].ubMagSize, //Magazine capacity + // pObject->ubShotsLeft[0], //Shots left + // gWeaponStatsDesc[ 12 ], //Weight String + // fWeight, //Weight + // GetWeightUnitString() //Weight units + // ); + } // explosives else if ( (Item[ usItem ].usItemClass == IC_GRENADE)||(Item[ usItem ].usItemClass == IC_BOMB) ) diff --git a/Tactical/opplist.cpp b/Tactical/opplist.cpp index a26718f4..611d60f2 100644 --- a/Tactical/opplist.cpp +++ b/Tactical/opplist.cpp @@ -1096,8 +1096,18 @@ INT16 DistanceVisible( SOLDIERTYPE *pSoldier, INT8 bFacingDir, INT8 bSubjectDir, } else { + // Lesh: added this + if( gGameExternalOptions.gfAllowLimitedVision ) + { + bSubjectDir = (INT8) GetDirectionToGridNoFromGridNo( pSoldier->sGridNo, sSubjectGridNo ); + } + sDistVisible = gbLookDistance[bFacingDir][bSubjectDir]; + // Lesh: and this + if ( (sDistVisible == 0) && (gGameExternalOptions.gfAllowLimitedVision) ) + return(0); + if ( sDistVisible != STRAIGHT ) sDistVisible = sDistVisible * ((100 - GetPercentTunnelVision(pSoldier))/100); @@ -1227,28 +1237,30 @@ void EndMuzzleFlash( SOLDIERTYPE * pSoldier ) { if ( pOtherSoldier->bOppList[ pSoldier->ubID ] == SEEN_CURRENTLY ) { - if ( pOtherSoldier->sGridNo != NOWHERE ) - { - if ( PythSpacesAway( pOtherSoldier->sGridNo, pSoldier->sGridNo ) > DistanceVisible( pOtherSoldier, DIRECTION_IRRELEVANT, DIRECTION_IRRELEVANT, pSoldier->sGridNo, pSoldier->bLevel, pSoldier ) ) - { - // if this guy can no longer see us, change to seen this turn - HandleManNoLongerSeen( pOtherSoldier, pSoldier, &(pOtherSoldier->bOppList[ pSoldier->ubID ]), &(gbPublicOpplist[ pOtherSoldier->bTeam ][ pSoldier->ubID ] ) ); - } - // else this person is still seen, if the looker is on our side or the militia the person should stay visible - #ifdef WE_SEE_WHAT_MILITIA_SEES_AND_VICE_VERSA - else if ( pOtherSoldier->bTeam == gbPlayerNum || pOtherSoldier->bTeam == MILITIA_TEAM ) - #else - else if ( pOtherSoldier->bTeam == gbPlayerNum ) - #endif - { - pSoldier->bVisible = TRUE; // yes, still seen - } - } + if ( pOtherSoldier->sGridNo != NOWHERE ) + { + if ( PythSpacesAway( pOtherSoldier->sGridNo, pSoldier->sGridNo ) > DistanceVisible( pOtherSoldier, (gGameExternalOptions.gfAllowLimitedVision ? pOtherSoldier->bDesiredDirection : DIRECTION_IRRELEVANT), DIRECTION_IRRELEVANT, pSoldier->sGridNo, pSoldier->bLevel, pSoldier ) ) + { + // if this guy can no longer see us, change to seen this turn + HandleManNoLongerSeen( pOtherSoldier, pSoldier, &(pOtherSoldier->bOppList[ pSoldier->ubID ]), &(gbPublicOpplist[ pOtherSoldier->bTeam ][ pSoldier->ubID ] ) ); + } + + // else this person is still seen, if the looker is on our side or the militia the person should stay visible +#ifdef WE_SEE_WHAT_MILITIA_SEES_AND_VICE_VERSA + else if ( pOtherSoldier->bTeam == gbPlayerNum || pOtherSoldier->bTeam == MILITIA_TEAM ) +#else + else if ( pOtherSoldier->bTeam == gbPlayerNum ) +#endif + + { + pSoldier->bVisible = TRUE; // yes, still seen + } + } } } } DecideTrueVisibility( pSoldier, FALSE ); - + } void TurnOffEveryonesMuzzleFlashes( void ) @@ -1766,7 +1778,7 @@ INT16 ManLooksForMan(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, UINT8 ubCall bAware = TRUE; // then we look for him full viewing distance in EVERY direction - sDistVisible = DistanceVisible(pSoldier, DIRECTION_IRRELEVANT, 0, pOpponent->sGridNo, pOpponent->bLevel, pOpponent ); + sDistVisible = DistanceVisible(pSoldier, (gGameExternalOptions.gfAllowLimitedVision ? pSoldier->bDesiredDirection : DIRECTION_IRRELEVANT), 0, pOpponent->sGridNo, pOpponent->bLevel, pOpponent ); //if (pSoldier->ubID == 0) //sprintf(gDebugStr,"ALREADY KNOW: ME %d him %d val %d",pSoldier->ubID,pOpponent->ubID,pSoldier->bOppList[pOpponent->ubID]); } @@ -5602,7 +5614,7 @@ void HearNoise(SOLDIERTYPE *pSoldier, UINT8 ubNoiseMaker, UINT16 sGridNo, INT8 b } } - sDistVisible = DistanceVisible( pSoldier, DIRECTION_IRRELEVANT, DIRECTION_IRRELEVANT, sGridNo, bLevel, pSoldier ); + sDistVisible = DistanceVisible( pSoldier, (gGameExternalOptions.gfAllowLimitedVision ? pSoldier->bDesiredDirection : DIRECTION_IRRELEVANT), DIRECTION_IRRELEVANT, sGridNo, bLevel, pSoldier ); if ( fMuzzleFlash ) { @@ -6452,7 +6464,7 @@ void NoticeUnseenAttacker( SOLDIERTYPE * pAttacker, SOLDIERTYPE * pDefender, INT } } - ubTileSightLimit = (UINT8) DistanceVisible( pDefender, DIRECTION_IRRELEVANT, 0, pAttacker->sGridNo, pAttacker->bLevel, pAttacker ); + ubTileSightLimit = (UINT8) DistanceVisible( pDefender, (gGameExternalOptions.gfAllowLimitedVision ? pDefender->bDesiredDirection : DIRECTION_IRRELEVANT), 0, pAttacker->sGridNo, pAttacker->bLevel, pAttacker ); if (SoldierToSoldierLineOfSightTest( pDefender, pAttacker, ubTileSightLimit, TRUE ) != 0) { fSeesAttacker = TRUE; @@ -6712,7 +6724,7 @@ INT8 GetHighestVisibleWatchedLoc( UINT8 ubID ) { if ( gsWatchedLoc[ ubID ][ bLoop ] != NOWHERE && gubWatchedLocPoints[ ubID ][ bLoop ] > bHighestPoints ) { - sDistVisible = DistanceVisible( MercPtrs[ ubID ], DIRECTION_IRRELEVANT, DIRECTION_IRRELEVANT, gsWatchedLoc[ ubID ][ bLoop ], gbWatchedLocLevel[ ubID ][ bLoop ], MercPtrs[ubID] ); + sDistVisible = DistanceVisible( MercPtrs[ ubID ], (gGameExternalOptions.gfAllowLimitedVision ? MercPtrs[ ubID ]->bDesiredDirection : DIRECTION_IRRELEVANT), DIRECTION_IRRELEVANT, gsWatchedLoc[ ubID ][ bLoop ], gbWatchedLocLevel[ ubID ][ bLoop ], MercPtrs[ubID] ); // look at standing height if ( SoldierTo3DLocationLineOfSightTest( MercPtrs[ ubID ], gsWatchedLoc[ ubID ][ bLoop ], gbWatchedLocLevel[ ubID ][ bLoop ], 3, (UINT8) sDistVisible, TRUE ) ) {