diff --git a/GameSettings.cpp b/GameSettings.cpp index 5d3c9789..0bae2bd2 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -2313,6 +2313,8 @@ void LoadSkillTraitsExternalSettings() gSkillTraitValues.ubRAWeatherPenaltiesReduction = iniReader.ReadInteger("Ranger","WEATHER_PENALTIES_REDUCTION", 50, 0, 100); //gSkillTraitValues.ubRACamoEffectivenessBonus = iniReader.ReadInteger("Ranger","CAMO_EFFECTIVENESS_BONUS_PERCENT", 10, 0, 100); gSkillTraitValues.ubRACamoWornountSpeedReduction = iniReader.ReadInteger("Ranger","CAMO_WORNOUT_SPEED_REDUCTION", 50, 0, 100); + gSkillTraitValues.usTrackerMaxRange = iniReader.ReadInteger( "Ranger", "TRACKER_MAX_RANGE", 30, 0, 50 ); + gSkillTraitValues.usTrackerAbility = iniReader.ReadInteger( "Ranger", "TRACKER_ABILITY", 30, 0, 50 ); // GUNSLINGER gSkillTraitValues.ubGSFiringSpeedBonusPistols = iniReader.ReadInteger("Gunslinger","FIRING_SPEED_BONUS_PISTOLS", 15, 0, 45); diff --git a/GameSettings.h b/GameSettings.h index 3c8f7c50..1f9396ac 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -1608,6 +1608,8 @@ typedef struct UINT8 ubRACamoWornountSpeedReduction; UINT8 ubRAFiringSpeedBonusShotguns; UINT8 ubRAAimClicksAdded; + UINT16 usTrackerMaxRange; + UINT8 usTrackerAbility; // GUNSLINGER UINT8 ubGSFiringSpeedBonusPistols; diff --git a/GameVersion.cpp b/GameVersion.cpp index 1d5d320c..ae5f1848 100644 --- a/GameVersion.cpp +++ b/GameVersion.cpp @@ -15,9 +15,9 @@ #ifdef JA2EDITOR #ifdef JA2UB - CHAR16 zVersionLabel[256] = { L"Unfinished Business - Map Editor v1.13.7614 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Unfinished Business - Map Editor v1.13.7646 (Development Build)" }; #else - CHAR16 zVersionLabel[256] = { L"Map Editor v1.13.7614 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Map Editor v1.13.7646 (Development Build)" }; #endif // ------------------------------ @@ -27,11 +27,11 @@ //DEBUG BUILD VERSION #ifdef JA2UB - CHAR16 zVersionLabel[256] = { L"Debug: Unfinished Business - v1.13.7614 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Debug: Unfinished Business - v1.13.7646 (Development Build)" }; #elif defined (JA113DEMO) - CHAR16 zVersionLabel[256] = { L"Debug: JA2 Demo - v1.13.7614 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Debug: JA2 Demo - v1.13.7646 (Development Build)" }; #else - CHAR16 zVersionLabel[256] = { L"Debug: v1.13.7614 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Debug: v1.13.7646 (Development Build)" }; #endif #elif defined CRIPPLED_VERSION @@ -46,16 +46,16 @@ //RELEASE BUILD VERSION #ifdef JA2UB - CHAR16 zVersionLabel[256] = { L"Release Unfinished Business - v1.13.7614 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Release Unfinished Business - v1.13.7646 (Development Build)" }; #elif defined (JA113DEMO) - CHAR16 zVersionLabel[256] = { L"Release JA2 Demo - v1.13.7614 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Release JA2 Demo - v1.13.7646 (Development Build)" }; #else - CHAR16 zVersionLabel[256] = { L"Release v1.13.7614 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Release v1.13.7646 (Development Build)" }; #endif #endif -CHAR8 czVersionNumber[16] = { "Build 14.10.26" }; //YY.MM.DD +CHAR8 czVersionNumber[16] = { "Build 14.11.3" }; //YY.MM.DD CHAR16 zTrackingNumber[16] = { L"Z" }; // SAVE_GAME_VERSION is defined in header, change it there diff --git a/Laptop/IMP Background.cpp b/Laptop/IMP Background.cpp index 1d534caa..dfe889aa 100644 --- a/Laptop/IMP Background.cpp +++ b/Laptop/IMP Background.cpp @@ -499,6 +499,11 @@ void AssignBackgroundHelpText( UINT16 ubNumber, MOUSE_REGION* pMouseregion ) swprintf( atStr, szBackgroundText_Value[i] ); wcscat( apStr, atStr ); } + else if ( BG_TRACKER_ABILITY == i && zBackground[ubNumber].value[i] ) + { + swprintf( atStr, szBackgroundText_Value[i], (UINT16)((gSkillTraitValues.usTrackerMaxRange * zBackground[ubNumber].value[i]) / 100) ); + wcscat( apStr, atStr ); + } else if ( zBackground[ ubNumber ].value[i] ) { swprintf(atStr, szBackgroundText_Value[ i ], zBackground[ ubNumber ].value[i] > 0 ? L"+" : L"", zBackground[ ubNumber ].value[i] ); diff --git a/Laptop/personnel.cpp b/Laptop/personnel.cpp index 2739b766..0dcfc970 100644 --- a/Laptop/personnel.cpp +++ b/Laptop/personnel.cpp @@ -7444,6 +7444,13 @@ void AssignPersonnelSkillTraitHelpText( UINT8 ubTraitNumber, BOOLEAN fExpertLeve swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[11], ( gSkillTraitValues.ubRACamoWornountSpeedReduction * (fExpertLevel ? 2 : 1)), sSpecialCharacters[0]); wcscat( apStr, atStr ); } + + if ( gSkillTraitValues.usTrackerMaxRange && gSkillTraitValues.usTrackerAbility ) + { + swprintf( atStr, gzIMPMajorTraitsHelpTextsRanger[12], (gSkillTraitValues.usTrackerAbility * (fExpertLevel ? 2 : 1) * gSkillTraitValues.usTrackerMaxRange / 100) ); + wcscat( apStr, atStr ); + } + break; } case GUNSLINGER_NT: diff --git a/Tactical/DisplayCover.cpp b/Tactical/DisplayCover.cpp index c96f2c51..b00bd83e 100644 --- a/Tactical/DisplayCover.cpp +++ b/Tactical/DisplayCover.cpp @@ -41,45 +41,13 @@ class SOLDIERTYPE; //******* Local Defines ************************************************** -// Flugente: mines display - stuff needs to be here -enum MINES_VALUES -{ - MINES_ALL = MAX_COVER + 1, - MINE_BOMB, - MINE_WIRE, - MINE_BOMB_AND_WIRE, - MINES_NET_1, - MINES_NET_2, - MINES_NET_3, - MINES_NET_4, - MINES_LVL_1, - MINES_LVL_2, - MINES_LVL_3, - MINES_LVL_4, - MAX_MINES -}; - -// Flugente: trait display -enum TRAIT_VALUES -{ - TRAIT_ALL = MAX_MINES + 1, - TRAIT_1, - TRAIT_2, - MAX_TRAIT -}; - struct CoverCell { INT32 sGridNo; - INT8 bCover; - BOOLEAN fInverseColor; - - INT8 bMines; - INT8 bTrait; - - CoverCell() : sGridNo(NOWHERE), bCover(INVALID_COVER), fInverseColor(FALSE), bMines(MINES_ALL), bTrait(TRAIT_ALL) {} + INT8 bOverlayType; + CoverCell( ) : sGridNo( NOWHERE ), bOverlayType( INVALID_COVER ) {} }; const UINT8 animArr[3] = { @@ -107,6 +75,7 @@ MINES_DRAW_MODE gubDrawModeMine = MINES_DRAW_OFF; // Flugente: mines display TRAIT_DRAW_MODE gubDrawModeTrait = TRAIT_DRAW_OFF; // Flugente: mines display +TRACKER_DRAW_MODE gubDrawModeTracker = TRACKER_DRAW_OFF; // Flugente: tracker display //******* Local Function Prototypes *********************************** @@ -115,18 +84,16 @@ CHAR16* GetTerrainName( const UINT8& ubTerrainType ); // anv: additional tile properties CHAR16* GetDetailedTerrainName( ADDITIONAL_TILE_PROPERTIES_VALUES zGivenTileProperties ); -TileDefines GetTileCoverIndex( const INT8& bCover ); - -void AddCoverObjectToWorld( const INT32& sGridNo, const UINT16& usGraphic, const BOOLEAN& fRoof ); +void AddCoverObjectToWorld( const INT32& sGridNo, const UINT16& usGraphic, const BOOLEAN& fRoof, BOOLEAN fNightTime ); void RemoveCoverObjectFromWorld( const INT32 sGridNo, const UINT16& usGraphic, const BOOLEAN& fRoof ); void AddCoverObjectsToViewArea(); void RemoveCoverObjectsFromViewArea(); -void RemoveMinesObjectsFromViewArea(); // added by Flugente, has to be declared here -void RemoveTraitObjectsFromViewArea(); - void CalculateCover(); +void CalculateMines(); +void CalculateTraitRange(); +void CalculateTrackerRange(); void GetGridNoForViewPort( const INT32& ubX, const INT32& ubY, INT32& sGridNo ); @@ -135,6 +102,76 @@ BOOLEAN GridNoOnScreenAndAround( const INT32& sGridNo, const UINT8& ubRadius=2 ) BOOLEAN IsTheRoofVisible( const INT32& sGridNo ); BOOLEAN HasAdjTile( const INT32& ubX, const INT32& ubY ); +// resets the overlay modes so that everything will be reset at the NEXT display cycle +void ResetOverlayModes() +{ + gubDrawMode = COVER_DRAW_OFF; + gubDrawModeMine = MINES_DRAW_OFF; + gubDrawModeTrait = TRAIT_DRAW_OFF; + gubDrawModeTracker = TRACKER_DRAW_OFF; +} + +TileDefines GetOverlayIndex( const INT8& bOverlayType ) +{ + switch ( bOverlayType ) + { + case NO_COVER: + + case NO_SEE: + + case MINES_ALL: + case MINE_BOMB: + case MINES_NET_1: + case MINES_LVL_4: + + case TRACKS_BLOOD: + return SPECIALTILE_COVER_1; // red + + case MIN_COVER: + + case MIN_SEE: + + case MINE_BOMB_AND_WIRE: + case MINES_NET_2: + case MINES_LVL_3: + + case TRAIT_2: + + case TRACKS_VERYOLD: + return SPECIALTILE_COVER_2; // orange + + case MED_COVER: + + case MED_SEE: + + case MINE_WIRE: + case MINES_NET_3: + case MINES_LVL_2: + + case TRAIT_ALL: + + case TRACKS_OLD: + return SPECIALTILE_COVER_3; // yellow + + case MAX_COVER: + + case MAX_SEE: + + case MINES_NET_4: + case MINES_LVL_1: + + case TRAIT_1: + + case TRACKS_RECENT: + return SPECIALTILE_COVER_5; // green + + case MAX_MINES: + case MAX_TRAIT: + default: + return SPECIALTILE_COVER_4; // light green, can be used to denote that you just don't know. + } +} + //******* Functions ************************************************** ///BEGIN key binding functions @@ -185,22 +222,6 @@ void ToggleMercView() SwitchToMercView(); } } - -void SwitchCoverDrawMode() -{ - switch(gubDrawMode) - { - case COVER_DRAW_OFF: - SwitchToMercView(); - break; - case COVER_DRAW_MERC_VIEW: - SwitchToEnemyView(); - break; - default: - SwitchViewOff(); - break; - } -} ///END key binding functions void GetGridNoForViewPort( const INT32& ubX, const INT32& ubY, INT32& sGridNo ) @@ -293,23 +314,7 @@ CHAR16* GetDetailedTerrainName( ADDITIONAL_TILE_PROPERTIES_VALUES zGivenTileProp } } -TileDefines GetTileCoverIndex( const INT8& bCover ) -{ - switch(bCover) { - case NO_COVER: - return SPECIALTILE_COVER_1; // red - case MIN_COVER: - return SPECIALTILE_COVER_2; // orange - case MED_COVER: - return SPECIALTILE_COVER_3; // yellow - case MAX_COVER: - return SPECIALTILE_COVER_5; // green - default: - return SPECIALTILE_COVER_4; // light green, can be used to denote that you just don't know. - } -} - -void AddCoverObjectToWorld( const INT32& sGridNo, const UINT16& usGraphic, const BOOLEAN& fRoof ) +void AddCoverObjectToWorld( const INT32& sGridNo, const UINT16& usGraphic, const BOOLEAN& fRoof, BOOLEAN fNightTime ) { LEVELNODE *pNode; @@ -326,7 +331,7 @@ void AddCoverObjectToWorld( const INT32& sGridNo, const UINT16& usGraphic, const pNode->uiFlags |= LEVELNODE_REVEAL; - if( NightTime() ) + if ( fNightTime ) { pNode->ubShadeLevel=DEFAULT_SHADE_LEVEL; pNode->ubNaturalShadeLevel=DEFAULT_SHADE_LEVEL; @@ -362,10 +367,8 @@ BOOLEAN HasAdjTile( const INT32& ubX, const INT32& ubY, const INT32& ubZ ) { continue; } - - INT8& bCover = gCoverViewArea[ ubTX ][ ubTY ][ ubZ ].bCover; - - if ( bCover > -1 && bCover < MAX_COVER ) + + if ( gCoverViewArea[ubTX][ubTY][ubZ].bOverlayType > INVALID_COVER && gCoverViewArea[ubTX][ubTY][ubZ].bOverlayType != MAX_COVER && gCoverViewArea[ubTX][ubTY][ubZ].bOverlayType != NO_SEE ) { return TRUE; } @@ -378,28 +381,27 @@ BOOLEAN HasAdjTile( const INT32& ubX, const INT32& ubY, const INT32& ubZ ) void AddCoverObjectsToViewArea() { if (gsMaxCellY == -1) - { return; - } register INT32 ubX, ubY, ubZ; BOOLEAN fChanged = FALSE; + BOOLEAN fNightTime = NightTime( ); + for ( ubX=gsMinCellX; ubX<=gsMaxCellX; ++ubX ) { for ( ubY=gsMinCellY; ubY<=gsMaxCellY; ++ubY ) { for ( ubZ=0; ubZ guiCoverNextUpdateTime ) ) { - CalculateCover(); + if ( gubDrawMode != COVER_DRAW_OFF ) + CalculateCover(); + else if ( gubDrawModeMine != MINES_DRAW_OFF ) + CalculateMines( ); + else if ( gubDrawModeTrait != TRAIT_DRAW_OFF ) + CalculateTraitRange( ); + else //if ( gubDrawModeTracker != TRAIT_DRAW_OFF ) + CalculateTrackerRange( ); + guiCoverNextUpdateTime = GetTickCount() + gGameExternalOptions.ubCoverDisplayUpdateWait; } } @@ -508,11 +515,7 @@ void CalculateCover() { return; } - - // at we're here, we want to display cover, so remove the mines display - if ( gubDrawModeMine != MINES_DRAW_OFF ) - RemoveMinesObjectsFromViewArea(); - + GetSoldier( &pSoldier, gusSelectedSoldier ); INT16 usTmp; @@ -532,59 +535,60 @@ void CalculateCover() GetGridNoForViewPort( ubX, ubY, sGridNo ); if( !GridNoOnScreenAndAround( sGridNo, 2 ) ) - { continue; - } - // do not show stuff on ground if roof is shown if ( IsTheRoofVisible( sGridNo ) ) { + // do not show stuff on ground if roof is shown if ( ubZ == I_GROUND_LEVEL ) continue; } - // do not show stuff on roofs if ground is shown - else if ( ubZ == I_ROOF_LEVEL ) - continue; - - if ( !NewOKDestination( pSoldier, sGridNo, false, ubZ ) ) + else { - continue; + // do not show stuff on roofs if ground is shown + if ( ubZ == I_ROOF_LEVEL ) + continue; } - INT8& bCover = gCoverViewArea[ ubX ][ ubY ][ ubZ ].bCover; - BOOLEAN& fInverseColor = gCoverViewArea[ ubX ][ ubY ][ ubZ ].fInverseColor; + if ( !NewOKDestination( pSoldier, sGridNo, false, ubZ ) ) + continue; + + INT8& bOverlayType = gCoverViewArea[ubX][ubY][ubZ].bOverlayType; if ( gubDrawMode == COVER_DRAW_ENEMY_VIEW ) // view of enemies against your selected merc { // reset cover value - bCover = MAX_COVER; - CalculateCoverForSoldier( pSoldier, sGridNo, ubZ, bCover ); - fInverseColor = FALSE; + bOverlayType = MAX_COVER; + CalculateCoverForSoldier( pSoldier, sGridNo, ubZ, bOverlayType ); } else if ( gubDrawMode == COVER_DRAW_MERC_VIEW ) { // reset cover value - bCover = MAX_COVER; + bOverlayType = MAX_COVER; if ( gTacticalStatus.fAtLeastOneGuyOnMultiSelect ) // view of selected mercs { // OK, loop through all guys who are 'multi-selected' and - INT32 cnt; - cnt = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; - for ( pSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; cnt++, pSoldier++ ) + INT32 cnt = gTacticalStatus.Team[gbPlayerNum].bFirstID; + for ( pSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; ++cnt, ++pSoldier ) { if ( pSoldier->bActive && pSoldier->bInSector ) { if ( pSoldier->flags.uiStatusFlags & SOLDIER_MULTI_SELECTED ) { - CalculateCoverFromSoldier( pSoldier, sGridNo, ubZ, bCover ); + CalculateCoverFromSoldier( pSoldier, sGridNo, ubZ, bOverlayType ); + + // if the tile is already NO_COVER, there's no need to continue + if ( NO_COVER == bOverlayType ) + break; } } } } else // single view from your merc - CalculateCoverFromSoldier( pSoldier, sGridNo, ubZ, bCover ); - - fInverseColor = TRUE; // we don't want to show the cover for the enemy + CalculateCoverFromSoldier( pSoldier, sGridNo, ubZ, bOverlayType ); + + // we use different enums for our merc's sight to avoid confusing inverse sight + bOverlayType = MAX_SEE - bOverlayType; } } } @@ -593,7 +597,7 @@ void CalculateCover() AddCoverObjectsToViewArea(); } -void CalculateCoverForSoldier( SOLDIERTYPE* pSoldier, const INT32& sTargetGridNo, const BOOLEAN& fRoof, INT8& bCover ) +void CalculateCoverForSoldier( SOLDIERTYPE* pSoldier, const INT32& sTargetGridNo, const BOOLEAN& fRoof, INT8& bOverlayType ) { UINT32 uiLoop; SOLDIERTYPE *pOpponent; @@ -626,17 +630,17 @@ void CalculateCoverForSoldier( SOLDIERTYPE* pSoldier, const INT32& sTargetGridNo continue; // next merc } - CalculateCoverFromSoldier( pOpponent, sTargetGridNo, fRoof, bCover, pSoldier ); + CalculateCoverFromSoldier( pOpponent, sTargetGridNo, fRoof, bOverlayType, pSoldier ); // if we got no cover, just return, can't get any worse than that. Helldorados lets you count - if (bCover == NO_COVER) + if ( bOverlayType == NO_COVER ) { return; } } } -void CalculateCoverFromSoldier( SOLDIERTYPE* pFromSoldier, const INT32& sTargetGridNo, const BOOLEAN& fRoof, INT8& bCover, SOLDIERTYPE* pToSoldier ) +void CalculateCoverFromSoldier( SOLDIERTYPE* pFromSoldier, const INT32& sTargetGridNo, const BOOLEAN& fRoof, INT8& bOverlayType, SOLDIERTYPE* pToSoldier ) { UINT16 usSightLimit = pFromSoldier->GetMaxDistanceVisible(sTargetGridNo, (INT8)fRoof, CALC_FROM_WANTED_DIR); @@ -654,12 +658,25 @@ void CalculateCoverFromSoldier( SOLDIERTYPE* pFromSoldier, const INT32& sTargetG if ( SoldierToVirtualSoldierLineOfSightTest( pFromSoldier, sTargetGridNo, (INT8) fRoof, ubStance, FALSE, usAdjustedSight ) != 0 ) { - if (bCover > i) bCover = i; + if ( bOverlayType > i ) bOverlayType = i; break; // we go from prone to stand, if soldier can see someone crouching, he can also see someone standing } } } +BOOLEAN CanSoldierSeeFloor( SOLDIERTYPE* pSoldier, INT32 sGridNo, INT8 bLevel ) +{ + if ( !pSoldier ) + return FALSE; + + UINT16 usSightLimit = pSoldier->GetMaxDistanceVisible( sGridNo, bLevel, CALC_FROM_WANTED_DIR ); + + if ( SoldierToVirtualSoldierLineOfSightTest( pSoldier, sGridNo, bLevel, ANIM_PRONE, FALSE, usSightLimit ) != 0 ) + return TRUE; + + return FALSE; +} + void DisplayRangeToTarget( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo ) { UINT16 usRange=0; @@ -851,22 +868,11 @@ BOOLEAN IsTheRoofVisible( const INT32& sGridNo ) // ----------------------------- Mines display after this ---------------------------------------- // added by Flugente -//****** Local Variables ********************************************* - -INT16 gsMineMinCellX, gsMineMinCellY, gsMineMaxCellX, gsMineMaxCellY = -1; - -DWORD guiMinesNextUpdateTime = 0; - //******* Local Function Prototypes *********************************** -TileDefines GetTileMinesIndex( const INT8& bMines ); - void AddMinesObjectsToViewArea(); -void CalculateMines(); -void DetermineMineDisplayInTile( INT32 sGridNo, INT8 bLevel, INT8& bMines, BOOLEAN fWithMineDetector = FALSE ); - -BOOLEAN MineTileHasAdjTile( const INT32& ubX, const INT32& ubY, const INT32& ubZ ); +void DetermineMineDisplayInTile( INT32 sGridNo, INT8 bLevel, INT8& bOverlayType, BOOLEAN fWithMineDetector = FALSE ); //******* Functions ************************************************** @@ -878,7 +884,7 @@ void SwitchToTrapNetworkView() gubDrawModeMine = MINES_DRAW_PLAYERTEAM_NETWORKS; ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Display trap network"); - DisplayMines(TRUE); + DisplayCover( TRUE ); } void SwitchToHostileTrapsView() @@ -888,7 +894,7 @@ void SwitchToHostileTrapsView() gubDrawModeMine = MINES_DRAW_DETECT_ENEMY; ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Display nearby traps"); - DisplayMines(TRUE); + DisplayCover( TRUE ); } void SwitchMineViewOff() @@ -898,7 +904,7 @@ void SwitchMineViewOff() gubDrawModeMine = MINES_DRAW_OFF; ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Turning off trap display"); - DisplayMines(TRUE); + DisplayCover( TRUE ); } void ToggleHostileTrapsView() @@ -923,128 +929,68 @@ void SwitchMinesDrawModeForNetworks() case MINES_DRAW_DETECT_ENEMY: gubDrawModeMine = MINES_DRAW_PLAYERTEAM_NETWORKS; ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Display trap network"); - DisplayMines(TRUE); break; - case MINES_DRAW_PLAYERTEAM_NETWORKS: gubDrawModeMine = MINES_DRAW_NETWORKCOLOURING; ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Display trap network colouring"); - DisplayMines(TRUE); break; case MINES_DRAW_NETWORKCOLOURING: gubDrawModeMine = MINES_DRAW_NET_A; ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Display trap network A"); - DisplayMines(TRUE); break; case MINES_DRAW_NET_A: gubDrawModeMine = MINES_DRAW_NET_B; ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Display trap network B"); - DisplayMines(TRUE); break; case MINES_DRAW_NET_B: gubDrawModeMine = MINES_DRAW_NET_C; ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Display trap network C"); - DisplayMines(TRUE); break; case MINES_DRAW_NET_C: gubDrawModeMine = MINES_DRAW_NET_D; ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Display trap network D"); - DisplayMines(TRUE); break; case MINES_DRAW_NET_D: case MINES_DRAW_MAX: default: gubDrawModeMine = MINES_DRAW_OFF; ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Turning off trap display"); - DisplayMines(TRUE); break; } + + DisplayCover( TRUE ); } ///END key binding functions -TileDefines GetTileMinesIndex( const INT8& bMines ) -{ - switch(bMines) - { - case MINES_ALL: - case MINE_BOMB: - case MINES_NET_1: - case MINES_LVL_4: - return SPECIALTILE_COVER_1; // red - case MINE_BOMB_AND_WIRE: - case MINES_NET_2: - case MINES_LVL_3: - return SPECIALTILE_COVER_2; // orange - case MINE_WIRE: - case MINES_NET_3: - case MINES_LVL_2: - return SPECIALTILE_COVER_3; // yellow - case MINES_NET_4: - case MINES_LVL_1: - return SPECIALTILE_COVER_4; // green - case MAX_MINES: - default: - return SPECIALTILE_COVER_5; // light green, can be used to denote that you just don't know. looks just like normal green, though... - } -} - -BOOLEAN MineTileHasAdjTile( const INT32& ubX, const INT32& ubY, const INT32& ubZ ) -{ - // no search for adjacent tiles wehn looking at a specific network (we have only 4 colours, need them all :-) - if ( gubDrawModeMine == MINES_DRAW_NETWORKCOLOURING || gubDrawModeMine == MINES_DRAW_NET_A || gubDrawModeMine == MINES_DRAW_NET_B || gubDrawModeMine == MINES_DRAW_NET_C || gubDrawModeMine == MINES_DRAW_NET_D ) - return FALSE; - - INT32 ubTX, ubTY; - - for ( ubTX = ubX-1; ubTX <= ubX+1; ++ubTX ) - { - if ( ubTX < 0 || ubTX > WORLD_COLS ) - { - continue; - } - - for ( ubTY = ubY-1; ubTY <= ubY+1; ++ubTY ) - { - if ( ubTY < 0 || ubTY > WORLD_ROWS ) - { - continue; - } - - INT8& bMines = gCoverViewArea[ ubTX ][ ubTY ][ ubZ ].bMines; - - if ( bMines > MINES_ALL && bMines < MAX_MINES ) - { - return TRUE; - } - } - } - - return FALSE; -} - void AddMinesObjectsToViewArea() { - if (gsMineMaxCellY == -1) - { + if (gsMaxCellY == -1) return; - } - INT32 ubX, ubY, ubZ; + + register INT32 ubX, ubY, ubZ; BOOLEAN fChanged = FALSE; - for ( ubX=gsMineMinCellX; ubX<=gsMineMaxCellX; ++ubX ) + BOOLEAN fNightTime = NightTime( ); + + BOOLEAN fSearchAdjTile = TRUE; + // no search for adjacent tiles when looking at a specific network (we have only 4 colours, need them all :-) + if ( gubDrawModeMine == MINES_DRAW_NETWORKCOLOURING || gubDrawModeMine == MINES_DRAW_NET_A || gubDrawModeMine == MINES_DRAW_NET_B || gubDrawModeMine == MINES_DRAW_NET_C || gubDrawModeMine == MINES_DRAW_NET_D ) + fSearchAdjTile = FALSE; + + for ( ubX=gsMinCellX; ubX<=gsMaxCellX; ++ubX ) { - for ( ubY=gsMineMinCellY; ubY<=gsMineMaxCellY; ++ubY ) + for ( ubY=gsMinCellY; ubY<=gsMaxCellY; ++ubY ) { for ( ubZ=0; ubZ guiMinesNextUpdateTime ) ) - { - CalculateMines(); - guiMinesNextUpdateTime = GetTickCount() + gGameExternalOptions.ubCoverDisplayUpdateWait; - } -} - void CalculateMines() { - INT32 ubX, ubY, ubZ; + INT32 ubX, ubY; + INT8 ubZ; SOLDIERTYPE* pSoldier; - RemoveMinesObjectsFromViewArea(); + RemoveCoverObjectsFromViewArea( ); if( gubDrawModeMine == MINES_DRAW_OFF ) { return; } - if( gusSelectedSoldier == NOBODY ) - { + if ( gusSelectedSoldier == NOBODY || !GetSoldier( &pSoldier, gusSelectedSoldier ) || !pSoldier->bInSector ) return; - } - - // at we're here, we want to display mines, so remove the cover display - if ( gubDrawMode != COVER_DRAW_OFF ) - RemoveCoverObjectsFromViewArea(); - - GetSoldier( &pSoldier, gusSelectedSoldier ); // if we want to detect hostile mines and we have an metal detector in our hands, allow seeking BOOLEAN fWithMineDetector = FALSE; @@ -1151,14 +1039,14 @@ void CalculateMines() const INT32& sSelectedSoldierGridNo = MercPtrs[ gusSelectedSoldier ]->sGridNo; INT16 usTmp; - GetScreenXYWorldCell( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, &gsMineMinCellX, &usTmp ); - GetScreenXYWorldCell( gsVIEWPORT_END_X, gsVIEWPORT_END_Y, &gsMineMaxCellX, &usTmp ); + GetScreenXYWorldCell( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, &gsMinCellX, &usTmp ); + GetScreenXYWorldCell( gsVIEWPORT_END_X, gsVIEWPORT_END_Y, &gsMaxCellX, &usTmp ); - GetScreenXYWorldCell( gsVIEWPORT_END_X, gsVIEWPORT_START_Y, &usTmp, &gsMineMinCellY ); - GetScreenXYWorldCell( gsVIEWPORT_START_X, gsVIEWPORT_END_Y, &usTmp, &gsMineMaxCellY ); - for ( ubX=gsMineMinCellX; ubX<=gsMineMaxCellX; ++ubX ) + GetScreenXYWorldCell( gsVIEWPORT_END_X, gsVIEWPORT_START_Y, &usTmp, &gsMinCellY ); + GetScreenXYWorldCell( gsVIEWPORT_START_X, gsVIEWPORT_END_Y, &usTmp, &gsMaxCellY ); + for ( ubX=gsMinCellX; ubX<=gsMaxCellX; ++ubX ) { - for ( ubY=gsMineMinCellY; ubY<=gsMineMaxCellY; ++ubY ) + for ( ubY=gsMinCellY; ubY<=gsMaxCellY; ++ubY ) { for ( ubZ=0; ubZusItem, NO_METAL_DETECTION) || HasItemFlag((*pObj)[0]->data.misc.usBombItem, NO_METAL_DETECTION) ) ) { // display all mines - bMines = MINE_BOMB; + bOverlayType = MINE_BOMB; } else { @@ -1235,9 +1122,9 @@ void DetermineMineDisplayInTile( INT32 sGridNo, INT8 bLevel, INT8& bMines, BOOLE if ( Item[pObj->usItem].tripwire == 1 ) { // if we're already marked as MINE_BOMB, switch to MINE_BOMB_AND_WIRE - if ( bMines == MINE_BOMB ) - bMines = MINE_BOMB_AND_WIRE; - else if ( bMines == MINE_BOMB_AND_WIRE ) + if ( bOverlayType == MINE_BOMB ) + bOverlayType = MINE_BOMB_AND_WIRE; + else if ( bOverlayType == MINE_BOMB_AND_WIRE ) ; else { @@ -1254,18 +1141,18 @@ void DetermineMineDisplayInTile( INT32 sGridNo, INT8 bLevel, INT8& bMines, BOOLE } if ( fgunfound ) - bMines = MINE_BOMB_AND_WIRE; + bOverlayType = MINE_BOMB_AND_WIRE; else - bMines = MINE_WIRE; + bOverlayType = MINE_WIRE; } } else { // if we're already marked as MINE_WIRE, switch to MINE_BOMB_AND_WIRE - if ( bMines == MINE_WIRE ) - bMines = MINE_BOMB_AND_WIRE; + if ( bOverlayType == MINE_WIRE ) + bOverlayType = MINE_BOMB_AND_WIRE; else - bMines = MINE_BOMB; + bOverlayType = MINE_BOMB; } } break; @@ -1283,109 +1170,49 @@ void DetermineMineDisplayInTile( INT32 sGridNo, INT8 bLevel, INT8& bMines, BOOLE { // correct network? if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_1 ) != 0 ) - bMines = MINES_NET_1; + bOverlayType = MINES_NET_1; else if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_2 ) != 0 ) - bMines = MINES_NET_2; + bOverlayType = MINES_NET_2; else if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_3 ) != 0 ) - bMines = MINES_NET_3; + bOverlayType = MINES_NET_3; else if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_4 ) != 0 ) - bMines = MINES_NET_4; + bOverlayType = MINES_NET_4; } } } break; case MINES_DRAW_NET_A: - { - if ( Item[pObj->usItem].tripwire == 1 ) - { - // determine if wire is of the network we're searching for - // determine this tripwire's flag - UINT32 ubWireNetworkFlag = (*pObj)[0]->data.ubWireNetworkFlag; - - // correct network? - if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_OWNER_PLAYER ) != 0 && (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_1 ) != 0 ) - { - bMines = MINES_LVL_1; - - if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_2 ) ) != 0 ) - bMines = MINES_LVL_2; - else if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_3 ) ) != 0 ) - bMines = MINES_LVL_3; - else if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_4 ) ) != 0 ) - bMines = MINES_LVL_4; - } - } - } - break; - case MINES_DRAW_NET_B: - { - if ( Item[pObj->usItem].tripwire == 1 ) - { - // determine if wire is of the network we're searching for - // determine this tripwire's flag - UINT32 ubWireNetworkFlag = (*pObj)[0]->data.ubWireNetworkFlag; - - // correct network? - if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_OWNER_PLAYER ) != 0 && (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_2 ) != 0 ) - { - bMines = MINES_LVL_1; - - if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_2 ) ) != 0 ) - bMines = MINES_LVL_2; - else if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_3 ) ) != 0 ) - bMines = MINES_LVL_3; - else if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_4 ) ) != 0 ) - bMines = MINES_LVL_4; - } - } - } - break; - case MINES_DRAW_NET_C: - { - if ( Item[pObj->usItem].tripwire == 1 ) - { - // determine if wire is of the network we're searching for - // determine this tripwire's flag - UINT32 ubWireNetworkFlag = (*pObj)[0]->data.ubWireNetworkFlag; - - // correct network? - if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_OWNER_PLAYER ) != 0 && (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_3 ) != 0 ) - { - bMines = MINES_LVL_1; - - if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_2 ) ) != 0 ) - bMines = MINES_LVL_2; - else if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_3 ) ) != 0 ) - bMines = MINES_LVL_3; - else if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_4 ) ) != 0 ) - bMines = MINES_LVL_4; - } - } - } - break; - case MINES_DRAW_NET_D: { if ( Item[pObj->usItem].tripwire == 1 ) { + UINT32 specificnet = 0; + switch ( gubDrawModeMine ) + { + case MINES_DRAW_NET_A: specificnet = TRIPWIRE_NETWORK_NET_1; break; + case MINES_DRAW_NET_B: specificnet = TRIPWIRE_NETWORK_NET_2; break; + case MINES_DRAW_NET_C: specificnet = TRIPWIRE_NETWORK_NET_3; break; + case MINES_DRAW_NET_D: specificnet = TRIPWIRE_NETWORK_NET_4; break; + } + // determine if wire is of the network we're searching for // determine this tripwire's flag UINT32 ubWireNetworkFlag = (*pObj)[0]->data.ubWireNetworkFlag; // correct network? - if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_OWNER_PLAYER ) != 0 && (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_4 ) != 0 ) + if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_OWNER_PLAYER) != 0 && (ubWireNetworkFlag & specificnet) != 0 ) { - bMines = MINES_LVL_1; + bOverlayType = MINES_LVL_1; if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_2 ) ) != 0 ) - bMines = MINES_LVL_2; + bOverlayType = MINES_LVL_2; else if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_3 ) ) != 0 ) - bMines = MINES_LVL_3; + bOverlayType = MINES_LVL_3; else if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_4 ) ) != 0 ) - bMines = MINES_LVL_4; + bOverlayType = MINES_LVL_4; } } } @@ -1408,14 +1235,8 @@ void DetermineMineDisplayInTile( INT32 sGridNo, INT8 bLevel, INT8& bMines, BOOLE //******* Local Function Prototypes *********************************** -TileDefines GetTileTraitIndex( const INT8& bTrait ); - void AddTraitObjectsToViewArea(); -void CalculateTraitRange(); - -BOOLEAN TraitTileHasAdjTile( const INT32& ubX, const INT32& ubY, const INT32& ubZ ); - UINT32 usDisplayTrait = NO_SKILLTRAIT_NT; INT32 sTraitgridNo = NOWHERE; @@ -1427,6 +1248,7 @@ void ToggleTraitRangeView(BOOLEAN fOn) gubDrawModeTrait = TRAIT_DRAW_RANGE; gubDrawMode = COVER_DRAW_OFF; gubDrawModeMine = MINES_DRAW_OFF; + gubDrawModeTracker = TRACKER_DRAW_OFF; } else { @@ -1436,7 +1258,7 @@ void ToggleTraitRangeView(BOOLEAN fOn) } //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Display trait ranges"); - DisplayTraitRange(TRUE); + DisplayCover( TRUE ); } void SetTraitToDisplay( UINT32 aTrait ) @@ -1449,31 +1271,19 @@ void SetGridNoForTraitDisplay( INT32 sGridNo ) sTraitgridNo = sGridNo; } -void DisplayTraitRange( const BOOLEAN& forceUpdate ) -{ - if ( gGameExternalOptions.ubCoverDisplayUpdateWait == -1 ) - { - return; - } - - if ( forceUpdate || ( !gfScrollPending && !gfScrollInertia && GetTickCount() > guiMinesNextUpdateTime ) ) - { - CalculateTraitRange(); - guiMinesNextUpdateTime = GetTickCount() + gGameExternalOptions.ubCoverDisplayUpdateWait; - } -} void CalculateTraitRange() { - INT32 ubX, ubY, ubZ; + INT32 ubX, ubY; + INT8 ubZ; SOLDIERTYPE* pSoldier; - RemoveTraitObjectsFromViewArea(); + RemoveCoverObjectsFromViewArea( ); if ( gubDrawModeTrait == TRAIT_DRAW_OFF ) return; - if( gusSelectedSoldier == NOBODY || !GetSoldier( &pSoldier, gusSelectedSoldier ) ) + if ( gusSelectedSoldier == NOBODY || !GetSoldier( &pSoldier, gusSelectedSoldier ) || !pSoldier->bInSector ) return; UINT16 range1 = 0; @@ -1497,25 +1307,18 @@ void CalculateTraitRange() default: return; } - - //remove other displays - if( gubDrawModeMine != MINES_DRAW_OFF ) - RemoveMinesObjectsFromViewArea(); - - if ( gubDrawMode != COVER_DRAW_OFF ) - RemoveCoverObjectsFromViewArea(); - + const INT32& sSelectedSoldierGridNo = MercPtrs[ gusSelectedSoldier ]->sGridNo; INT16 usTmp; - GetScreenXYWorldCell( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, &gsMineMinCellX, &usTmp ); - GetScreenXYWorldCell( gsVIEWPORT_END_X, gsVIEWPORT_END_Y, &gsMineMaxCellX, &usTmp ); + GetScreenXYWorldCell( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, &gsMinCellX, &usTmp ); + GetScreenXYWorldCell( gsVIEWPORT_END_X, gsVIEWPORT_END_Y, &gsMaxCellX, &usTmp ); - GetScreenXYWorldCell( gsVIEWPORT_END_X, gsVIEWPORT_START_Y, &usTmp, &gsMineMinCellY ); - GetScreenXYWorldCell( gsVIEWPORT_START_X, gsVIEWPORT_END_Y, &usTmp, &gsMineMaxCellY ); - for ( ubX=gsMineMinCellX; ubX<=gsMineMaxCellX; ++ubX ) + GetScreenXYWorldCell( gsVIEWPORT_END_X, gsVIEWPORT_START_Y, &usTmp, &gsMinCellY ); + GetScreenXYWorldCell( gsVIEWPORT_START_X, gsVIEWPORT_END_Y, &usTmp, &gsMaxCellY ); + for ( ubX=gsMinCellX; ubX<=gsMaxCellX; ++ubX ) { - for ( ubY=gsMineMinCellY; ubY<=gsMineMaxCellY; ++ubY ) + for ( ubY=gsMinCellY; ubY<=gsMaxCellY; ++ubY ) { for ( ubZ=0; ubZbInSector ) + return; + + FLOAT trackerskill = (FLOAT)(NUM_SKILL_TRAITS( pSoldier, RANGER_NT ) * gSkillTraitValues.usTrackerAbility + pSoldier->GetBackgroundValue( BG_TRACKER_ABILITY )) / 100.0f; + + if ( trackerskill < 0.01f ) + return; + + UINT16 range = gSkillTraitValues.usTrackerMaxRange * trackerskill; + + const INT32& sSelectedSoldierGridNo = MercPtrs[gusSelectedSoldier]->sGridNo; + + INT16 usTmp; + GetScreenXYWorldCell( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, &gsMinCellX, &usTmp ); + GetScreenXYWorldCell( gsVIEWPORT_END_X, gsVIEWPORT_END_Y, &gsMaxCellX, &usTmp ); + + GetScreenXYWorldCell( gsVIEWPORT_END_X, gsVIEWPORT_START_Y, &usTmp, &gsMinCellY ); + GetScreenXYWorldCell( gsVIEWPORT_START_X, gsVIEWPORT_END_Y, &usTmp, &gsMaxCellY ); + for ( ubX = gsMinCellX; ubX <= gsMaxCellX; ++ubX ) + { + for ( ubY = gsMinCellY; ubY <= gsMaxCellY; ++ubY ) + { + for ( ubZ = 0; ubZ WORLD_COLS ) + { + continue; + } + + for ( ubTY = ubY - 1; ubTY <= ubY + 1; ++ubTY ) + { + if ( ubTY < 0 || ubTY > WORLD_ROWS ) + { + continue; + } + + INT8& bOverlayType = gCoverViewArea[ubTX][ubTY][ubZ].bOverlayType; + + if ( bOverlayType == TRACKS_VERYOLD || bOverlayType == TRACKS_OLD || bOverlayType == TRACKS_RECENT || bOverlayType == TRACKS_BLOOD ) + { + return TRUE; + } + } + } + + return FALSE; +} diff --git a/Tactical/DisplayCover.h b/Tactical/DisplayCover.h index ce0bb4f5..f2853d06 100644 --- a/Tactical/DisplayCover.h +++ b/Tactical/DisplayCover.h @@ -1,8 +1,8 @@ #ifndef _DISPLAY_COVER__H_ #define _DISPLAY_COVER__H_ -void DisplayCoverOfSelectedGridNo( ); -void RemoveCoverOfSelectedGridNo(); +// resets the overlay modes so that everything will be reset at the NEXT display cycle +void ResetOverlayModes(); void DisplayRangeToTarget( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo ); void DisplayCover(const BOOLEAN& forceUpdate = FALSE); @@ -14,29 +14,66 @@ void SwitchViewOff(); void ToggleMercView(); void ToggleEnemyView(); -void SwitchCoverDrawMode(); - -void RemoveVisibleGridNoAtSelectedGridNo(); -void DisplayGridNoVisibleToSoldierGrid( ); - void CalculateCoverForSoldier( SOLDIERTYPE* pForSoldier, const INT32& sTargetGridNo, const BOOLEAN& fRoof, INT8& bCover ); void CalculateCoverFromSoldier( SOLDIERTYPE* pFromSoldier, const INT32& sTargetGridNo, const BOOLEAN& fRoof, INT8& bCover, SOLDIERTYPE* pToSoldier = NULL ); +BOOLEAN CanSoldierSeeFloor( SOLDIERTYPE* pSoldier, INT32 sGridNo, INT8 bLevel ); - -#define DC_MAX_COVER_RANGE 43 //31 -#define DC__SOLDIER_VISIBLE_RANGE 43 //31 -#define DC__MIN_SIZE 4 -#define DC__MAX_SIZE 21 //11 - -enum COVER_VALUES +// Flugente: all different overlays in one enum +enum OVERLAY_VALUES { INVALID_COVER = -1, - NO_COVER = 0, - MIN_COVER = 1, - MED_COVER = 2, - MAX_COVER = 3 + NO_COVER, + MIN_COVER, + MED_COVER, + MAX_COVER, + + NO_SEE, + MIN_SEE, + MED_SEE, + MAX_SEE, + + MINES_ALL, + MINE_BOMB, + MINE_WIRE, + MINE_BOMB_AND_WIRE, + MINES_NET_1, + MINES_NET_2, + MINES_NET_3, + MINES_NET_4, + MINES_LVL_1, + MINES_LVL_2, + MINES_LVL_3, + MINES_LVL_4, + MAX_MINES, + + TRAIT_ALL, + TRAIT_1, + TRAIT_2, + MAX_TRAIT, + + TRACKS_VERYOLD, + TRACKS_OLD, + TRACKS_RECENT, + TRACKS_BLOOD, + MAX_TRACKS, }; +enum COVER_DRAW_MODE { + COVER_DRAW_OFF, + COVER_DRAW_MERC_VIEW, + COVER_DRAW_ENEMY_VIEW +}; + +void ChangeSizeOfDisplayCover( INT32 iNewSize ); + +void ChangeSizeOfLOS( INT32 iNewSize ); +//ddd for optimize oppponent turn +INT8 CalcCoverForGridNoBasedOnTeamKnownEnemies( SOLDIERTYPE *pSoldier, INT16 sTargetGridNo, INT8 bStance ); +//ddd for optimize oppponent turn + + +// ----------------------------- Mines display after this ---------------------------------------- +// added by Flugente: display of mine, bombs and tripwire // Flugente: mines display - stuff needs to be here // Sevenfm: moved here from DisplayCover.cpp enum MINES_DRAW_MODE { @@ -51,35 +88,6 @@ enum MINES_DRAW_MODE { MINES_DRAW_MAX }; -// Flugente: trait draw mode -enum TRAIT_DRAW_MODE { - TRAIT_DRAW_OFF, - TRAIT_DRAW_RANGE, - TRAIT_DRAW_MAX -}; - -enum COVER_DRAW_MODE { - COVER_DRAW_OFF, - COVER_DRAW_MERC_VIEW, - COVER_DRAW_ENEMY_VIEW -}; - -#ifdef JA2TESTVERSION - void DisplayLosAndDisplayCoverUsageScreenMsg(); -#endif - -void ChangeSizeOfDisplayCover( INT32 iNewSize ); - -void ChangeSizeOfLOS( INT32 iNewSize ); -//ddd for optimize oppponent turn -INT8 CalcCoverForGridNoBasedOnTeamKnownEnemies( SOLDIERTYPE *pSoldier, INT16 sTargetGridNo, INT8 bStance ); -//ddd for optimize oppponent turn - - -// ----------------------------- Mines display after this ---------------------------------------- -// added by Flugente: display of mine, bombs and tripwire -void DisplayMines(const BOOLEAN& forceUpdate = FALSE); - void SwitchToTrapNetworkView(); void SwitchToHostileTrapsView(); void SwitchMineViewOff(); @@ -91,10 +99,27 @@ void SwitchMinesDrawModeForNetworks(); // ----------------------------- trait range display after this ---------------------------------------- // added by Flugente: display of ranges and areas of effects for traits -void DisplayTraitRange(const BOOLEAN& forceUpdate = FALSE); +// Flugente: trait draw mode +enum TRAIT_DRAW_MODE { + TRAIT_DRAW_OFF, + TRAIT_DRAW_RANGE, + TRAIT_DRAW_MAX +}; void ToggleTraitRangeView(BOOLEAN fOn = TRUE); void SetTraitToDisplay( UINT32 aTrait ); void SetGridNoForTraitDisplay( INT32 sGridNo ); +// ----------------------------- tracker display after this ---------------------------------------- +// added by Flugente: display of ranges and areas of effects for traits + +// Flugente: trait draw mode +enum TRACKER_DRAW_MODE { + TRACKER_DRAW_OFF, + TRACKER_DRAW_SMELL, + TRACKER_DRAW_MAX +}; + +extern TRACKER_DRAW_MODE gubDrawModeTracker; + #endif diff --git a/Tactical/Handle UI.cpp b/Tactical/Handle UI.cpp index b6d2abe4..3ab9fcf0 100644 --- a/Tactical/Handle UI.cpp +++ b/Tactical/Handle UI.cpp @@ -650,8 +650,6 @@ UINT32 HandleTacticalUI( void ) DisplayCover(); - DisplayMines(); // added by Flugente - if ( HandleItemPickupMenu( ) ) { uiNewEvent = A_CHANGE_TO_MOVE; diff --git a/Tactical/Interface.h b/Tactical/Interface.h index e347e8d4..e2664d73 100644 --- a/Tactical/Interface.h +++ b/Tactical/Interface.h @@ -189,6 +189,7 @@ enum { BG_PERC_SPOTTER, BG_PERC_DISEASE_DIAGNOSE, BG_PERC_DISEASE_TREAT, + BG_TRACKER_ABILITY, BG_DISLIKEBG, // dislike any other background that has the negative of this value set diff --git a/Tactical/Overhead.cpp b/Tactical/Overhead.cpp index cbcd546d..4ce6e1d8 100644 --- a/Tactical/Overhead.cpp +++ b/Tactical/Overhead.cpp @@ -2691,6 +2691,7 @@ void HandleJohnArrival( SOLDIERTYPE * pSoldier ) } } +extern void DisplayCover( const BOOLEAN& forceUpdate ); BOOLEAN HandleAtNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving ) { @@ -2940,6 +2941,11 @@ BOOLEAN HandleAtNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving ) HandleSystemNewAISituation( pSoldier, FALSE ); + // Flugente: tracker... + if ( pSoldier->bInSector && gusSelectedSoldier == pSoldier->ubID && !pSoldier->bCollapsed ) + { + DisplayCover( TRUE ); + } #ifdef LUA_OVERHEAD LetLuaMyCustomHandleAtNewGridNo(NULL,pSoldier->ubProfile, 0); diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index a7b963a7..fb0d766a 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -17372,6 +17372,8 @@ INT16 SOLDIERTYPE::GetInterruptModifier( UINT8 usDistance ) return bonus; } +extern void DisplayCover( const BOOLEAN& forceUpdate ); + void SOLDIERTYPE::SoldierPropertyUpkeep( ) { // these effects last only one turn @@ -17427,7 +17429,12 @@ void SOLDIERTYPE::SoldierPropertyUpkeep( ) { this->usSoldierFlagMask &= ~SOLDIER_BATTLE_PARTICIPATION; } + + if ( this->bInSector && this->bTeam == gbPlayerNum && !this->bCollapsed ) + { + DisplayCover( TRUE ); } +} // check if Soldier can use the spell skillwise, with fAPCheck = TRUE also check current APs BOOLEAN SOLDIERTYPE::CanUseSkill( INT8 iSkill, BOOLEAN fAPCheck ) diff --git a/Tactical/Turn Based Input.cpp b/Tactical/Turn Based Input.cpp index c35bfa25..b29170a7 100644 --- a/Tactical/Turn Based Input.cpp +++ b/Tactical/Turn Based Input.cpp @@ -8231,6 +8231,7 @@ void HandleTacticalCoverMenu( void ) gzUserDefinedButtonColor[1] = FONT_MCOLOR_LTYELLOW; gzUserDefinedButtonColor[2] = FONT_MCOLOR_LTYELLOW; gzUserDefinedButtonColor[4] = gDisplayEnemyRoles ? FONT_MCOLOR_LTGREEN : FONT_LTRED; + gzUserDefinedButtonColor[6] = (gubDrawModeTracker == TRACKER_DRAW_OFF) ? FONT_LTRED : FONT_MCOLOR_LTGREEN; gzUserDefinedButtonColor[8] = FONT_ORANGE; gzUserDefinedButtonColor[9] = FONT_ORANGE; gzUserDefinedButtonColor[10] = FONT_ORANGE; @@ -8244,22 +8245,18 @@ void HandleTacticalCoverMenu( void ) void TacticalCoverMessageBoxCallBack( UINT8 ubExitValue ) { - gubDrawModeMine = MINES_DRAW_OFF; - gubDrawMode = COVER_DRAW_OFF; switch( ubExitValue ) { case 1: - gubDrawModeMine = MINES_DRAW_OFF; - gubDrawMode = COVER_DRAW_OFF; - DisplayMines(TRUE); + ResetOverlayModes( ); break; case 2: + ResetOverlayModes( ); gubDrawMode = COVER_DRAW_ENEMY_VIEW; - DisplayCover(TRUE); break; case 3: + ResetOverlayModes( ); gubDrawMode = COVER_DRAW_MERC_VIEW; - DisplayCover(TRUE); break; case 4: break; @@ -8269,40 +8266,52 @@ void TacticalCoverMessageBoxCallBack( UINT8 ubExitValue ) case 6: break; case 7: + if ( gubDrawModeTracker == TRACKER_DRAW_SMELL ) + { + ResetOverlayModes( ); + } + else + { + ResetOverlayModes( ); + gubDrawModeTracker = TRACKER_DRAW_SMELL; + } break; case 8: break; case 9: + ResetOverlayModes( ); gubDrawModeMine = MINES_DRAW_PLAYERTEAM_NETWORKS; - DisplayMines(TRUE); break; case 10: + ResetOverlayModes( ); gubDrawModeMine = MINES_DRAW_NETWORKCOLOURING; - DisplayMines(TRUE); break; case 11: + ResetOverlayModes( ); gubDrawModeMine = MINES_DRAW_DETECT_ENEMY; - DisplayMines(TRUE); break; case 12: break; case 13: + ResetOverlayModes( ); gubDrawModeMine = MINES_DRAW_NET_A; - DisplayMines(TRUE); break; case 14: + ResetOverlayModes( ); gubDrawModeMine = MINES_DRAW_NET_B; - DisplayMines(TRUE); break; case 15: + ResetOverlayModes( ); gubDrawModeMine = MINES_DRAW_NET_C; - DisplayMines(TRUE); break; case 16: + ResetOverlayModes( ); gubDrawModeMine = MINES_DRAW_NET_D; - DisplayMines(TRUE); break; } + + DisplayCover( TRUE ); + if( ubExitValue <= TACTICAL_COVER_DIALOG_NUM ) ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szTacticalCoverDialogPrintString[ubExitValue-1]); } diff --git a/Tactical/XML_Background.cpp b/Tactical/XML_Background.cpp index 4f9aa971..8b06a703 100644 --- a/Tactical/XML_Background.cpp +++ b/Tactical/XML_Background.cpp @@ -128,6 +128,7 @@ backgroundStartElementHandle(void *userData, const XML_Char *name, const XML_Cha strcmp(name, "spotter") == 0 || strcmp(name, "disease_diagnose" ) == 0 || strcmp(name, "disease_treatment" ) == 0 || + strcmp(name, "tracker_ability" ) == 0 || strcmp(name, "dislikebackground" ) == 0 || strcmp(name, "druguse") == 0 || strcmp(name, "xenophobic") == 0 || @@ -137,7 +138,7 @@ backgroundStartElementHandle(void *userData, const XML_Char *name, const XML_Cha strcmp(name, "traplevel") == 0 || strcmp(name, "no_male") == 0 || strcmp(name, "no_female") == 0 || - strcmp( name, "loyalitylossondeath" ) == 0 )) + strcmp(name, "loyalitylossondeath" ) == 0 )) { pData->curElement = ELEMENT_PROPERTY; @@ -538,6 +539,11 @@ backgroundEndElementHandle(void *userData, const XML_Char *name) pData->curElement = ELEMENT; pData->curBackground.value[BG_PERC_DISEASE_TREAT] = min( 50, max( -50, (INT16)atol( pData->szCharData ) ) ); } + else if ( strcmp( name, "tracker_ability" ) == 0 ) + { + pData->curElement = ELEMENT; + pData->curBackground.value[BG_TRACKER_ABILITY] = min( 40, max( 0, (INT16)atol( pData->szCharData ) ) ); + } else if ( strcmp( name, "dislikebackground" ) == 0 ) { pData->curElement = ELEMENT; diff --git a/TileEngine/Smell.cpp b/TileEngine/Smell.cpp index b330dd99..f581b080 100644 --- a/TileEngine/Smell.cpp +++ b/TileEngine/Smell.cpp @@ -63,19 +63,19 @@ UINT8 ubBloodGraphicLUT [ ] = { 3, 3, 2, 2, 1, 1, 0, 0 }; -#define SMELL_STRENGTH_MAX 63 -#define BLOOD_STRENGTH_MAX 7 -#define BLOOD_DELAY_MAX 3 +#define SMELL_STRENGTH_MAX 63 +#define BLOOD_STRENGTH_MAX 7 +#define BLOOD_DELAY_MAX 3 -#define SMELL_TYPE_BITS( s ) (s & 0x03) +#define SMELL_TYPE_BITS( s ) (s & 0x03) -#define BLOOD_ROOF_TYPE( s ) (s & 0x02) -#define BLOOD_FLOOR_TYPE( s ) (s & 0x01) +#define BLOOD_ROOF_TYPE( s ) (s & 0x02) +#define BLOOD_FLOOR_TYPE( s ) (s & 0x01) #define BLOOD_ROOF_STRENGTH( b ) (b & 0xE0) -#define BLOOD_FLOOR_STRENGTH( b ) ( (b & 0x1C) >> 2 ) -#define BLOOD_DELAY_TIME( b ) (b & 0x03) -#define NO_BLOOD_STRENGTH( b ) ((b & 0xFC) == 0) +#define BLOOD_FLOOR_STRENGTH( b ) ( (b & 0x1C) >> 2 ) +#define BLOOD_DELAY_TIME( b ) (b & 0x03) +#define NO_BLOOD_STRENGTH( b ) ((b & 0xFC) == 0) #define DECAY_SMELL_STRENGTH( s ) \ { \ @@ -150,17 +150,13 @@ void RemoveBlood( INT32 sGridNo, INT8 bLevel ) UpdateBloodGraphics( sGridNo, bLevel ); } - void DecaySmells( void ) { INT32 uiLoop; MAP_ELEMENT * pMapElement; - //return; - - for (uiLoop = 0, pMapElement = gpWorldLevelData; uiLoop < WORLD_MAX; uiLoop++, pMapElement++) + for ( uiLoop = 0, pMapElement = gpWorldLevelData; uiLoop < WORLD_MAX; ++uiLoop, ++pMapElement ) { - if (pMapElement->ubSmellInfo) { // decay smell strength! @@ -174,13 +170,12 @@ void DecaySmells( void ) } } - void DecayBlood() { INT32 uiLoop; MAP_ELEMENT * pMapElement; - for (uiLoop = 0, pMapElement = gpWorldLevelData; uiLoop < WORLD_MAX; uiLoop++, pMapElement++) + for (uiLoop = 0, pMapElement = gpWorldLevelData; uiLoop < WORLD_MAX; ++uiLoop, ++pMapElement) { if (pMapElement->ubBloodInfo) { @@ -274,10 +269,10 @@ void DecayBloodAndSmells( UINT32 uiTime ) void DropSmell( SOLDIERTYPE * pSoldier ) { MAP_ELEMENT * pMapElement; - UINT8 ubOldSmell; - UINT8 ubOldStrength; - UINT8 ubSmell; - UINT8 ubStrength; + UINT8 ubOldSmell; + UINT8 ubOldStrength; + UINT8 ubSmell; + UINT8 ubStrength; /* * Here we are creating a new smell on the ground. If there is blood in @@ -354,7 +349,6 @@ void DropSmell( SOLDIERTYPE * pSoldier ) // otherwise skip dropping smell } - void InternalDropBlood( INT32 sGridNo, INT8 bLevel, UINT8 ubType, UINT8 ubStrength, INT8 bVisible ) { CHAR tmpMPDbgString[512]; @@ -381,9 +375,9 @@ void InternalDropBlood( INT32 sGridNo, INT8 bLevel, UINT8 ubType, UINT8 ubStreng // ATE: Send warning if dropping blood nowhere.... if (TileIsOutOfBounds(sGridNo)) { - #ifdef JA2BETAVERSION - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_TESTVERSION, L"Attempting to drop blood NOWHERE" ); - #endif +#ifdef JA2BETAVERSION + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_TESTVERSION, L"Attempting to drop blood NOWHERE" ); +#endif return; } @@ -469,10 +463,8 @@ void InternalDropBlood( INT32 sGridNo, INT8 bLevel, UINT8 ubType, UINT8 ubStreng { UpdateBloodGraphics( sGridNo, bLevel ); } - } - void DropBlood( SOLDIERTYPE * pSoldier, UINT8 ubStrength, INT8 bVisible ) { UINT8 ubType; @@ -485,30 +477,23 @@ void DropBlood( SOLDIERTYPE * pSoldier, UINT8 ubStrength, INT8 bVisible ) if ( pSoldier->flags.uiStatusFlags & SOLDIER_MONSTER ) { if ( pSoldier->pathing.bLevel == 0 ) - { ubType = CREATURE_ON_FLOOR; - } else - { ubType = CREATURE_ON_ROOF; - } } else { - ubType = 0; + ubType = HUMAN; } - InternalDropBlood( pSoldier->sGridNo, pSoldier->pathing.bLevel, ubType, ubStrength, bVisible ); } - - void UpdateBloodGraphics( INT32 sGridNo, INT8 bLevel ) { MAP_ELEMENT * pMapElement; - INT8 bValue; - UINT16 usIndex, usNewIndex; + INT8 bValue; + UINT16 usIndex, usNewIndex; // OK, based on level, type, display graphics for blood pMapElement = &(gpWorldLevelData[ sGridNo ]); @@ -521,7 +506,6 @@ void UpdateBloodGraphics( INT32 sGridNo, INT8 bLevel ) if ( pMapElement->uiFlags & MAPELEMENT_REEVALUATEBLOOD ) { - // Turn off flag! pMapElement->uiFlags &= ( ~MAPELEMENT_REEVALUATEBLOOD ); @@ -567,18 +551,15 @@ void UpdateBloodGraphics( INT32 sGridNo, INT8 bLevel ) //ApplyMapChangesToMapTempFile( FALSE ); - // Update rendering! pMapElement->uiFlags|=MAPELEMENT_REDRAW; SetRenderFlags(RENDER_FLAG_MARKED); - } } // Roof else { - } } } diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 0bb48123..631f631c 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -8247,6 +8247,7 @@ STR16 szBackgroundText_Value[]= L" %s%d%%发现狙击手的成功率\n", L" %s%d%% effectiveness at diagnosing diseases\n", // TODO.Translate L" %s%d%% effectiveness at treating population against diseases\n", + L"Can spot tracks up to %d tiles away\n", L" dislikes some other backgrounds", // TODO.Translate }; @@ -9109,7 +9110,7 @@ STR16 szTacticalCoverDialogString[]= L"Roles", // TODO.Translate L"", - L"", + L"Tracker", L"", L"陷阱", diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 4e4eb899..6d8c5d3e 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -8260,6 +8260,7 @@ STR16 szBackgroundText_Value[]= L" %s%d%% effectiveness as spotter for fellow snipers\n", // TODO.Translate L" %s%d%% effectiveness at diagnosing diseases\n", // TODO.Translate L" %s%d%% effectiveness at treating population against diseases\n", + L"Can spot tracks up to %d tiles away\n", L" dislikes some other backgrounds", // TODO.Translate }; @@ -9120,7 +9121,7 @@ STR16 szTacticalCoverDialogString[]= L"Roles", // TODO.Translate L"", - L"", + L"Tracker", L"", L"Traps", diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index c4c5dced..cda1f025 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -8245,6 +8245,7 @@ STR16 szBackgroundText_Value[]= L" %s%d%% effectiveness as spotter for fellow snipers\n", L" %s%d%% effectiveness at diagnosing diseases\n", L" %s%d%% effectiveness at treating population against diseases\n", + L"Can spot tracks up to %d tiles away\n", L" dislikes some other backgrounds", }; @@ -9158,7 +9159,7 @@ STR16 szTacticalCoverDialogString[]= L"Roles", L"", - L"", + L"Tracker", L"", L"Traps", diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index b9a7300d..481b30a3 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -8246,6 +8246,7 @@ STR16 szBackgroundText_Value[]= L" %s%d%% d'efficacité comme guetteur pour vos tireurs d'élite\n", L" %s%d%% effectiveness at diagnosing diseases\n", // TODO.Translate L" %s%d%% effectiveness at treating population against diseases\n", + L"Can spot tracks up to %d tiles away\n", L" dislikes some other backgrounds", // TODO.Translate }; @@ -9106,7 +9107,7 @@ STR16 szTacticalCoverDialogString[]= L"Roles", // TODO.Translate L"", - L"", + L"Tracker", L"", L"Pièges", diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 0e2565e9..a805eed1 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -8077,6 +8077,7 @@ STR16 szBackgroundText_Value[]= L" %s%d%% effectiveness as spotter for fellow snipers\n", // TODO.Translate L" %s%d%% effectiveness at diagnosing diseases\n", // TODO.Translate L" %s%d%% effectiveness at treating population against diseases\n", + L"Can spot tracks up to %d tiles away\n", L" dislikes some other backgrounds", // TODO.Translate }; @@ -8937,7 +8938,7 @@ STR16 szTacticalCoverDialogString[]= L"Roles", // TODO.Translate L"", - L"", + L"Tracker", L"", L"Traps", diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index c2b7b98b..72f02d8d 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -8256,6 +8256,7 @@ STR16 szBackgroundText_Value[]= L" %s%d%% effectiveness as spotter for fellow snipers\n", // TODO.Translate L" %s%d%% effectiveness at diagnosing diseases\n", // TODO.Translate L" %s%d%% effectiveness at treating population against diseases\n", + L"Can spot tracks up to %d tiles away\n", L" dislikes some other backgrounds", // TODO.Translate }; @@ -9116,7 +9117,7 @@ STR16 szTacticalCoverDialogString[]= L"Roles", // TODO.Translate L"", - L"", + L"Tracker", L"", L"Traps", diff --git a/Utils/_Ja25ChineseText.cpp b/Utils/_Ja25ChineseText.cpp index c6ff3ac0..da21f04e 100644 --- a/Utils/_Ja25ChineseText.cpp +++ b/Utils/_Ja25ChineseText.cpp @@ -155,6 +155,7 @@ STR16 gzIMPMajorTraitsHelpTextsRanger[]= L"天气效果惩罚 -%d%s\n",// L"-%d%s weather penalties\n", L"迷彩涂装效果 +%d%s\n",// L"+%d%s camouflage effectiveness\n", L"迷彩涂装退色的速度 -%d%s\n",// L"-%d%s worn out speed of camouflage by water or time\n", + L"Can spot tracks up to %d tiles away\n", // TODO.Translate }; STR16 gzIMPMajorTraitsHelpTextsGunslinger[]= diff --git a/Utils/_Ja25DutchText.cpp b/Utils/_Ja25DutchText.cpp index f5f27760..bf8787b4 100644 --- a/Utils/_Ja25DutchText.cpp +++ b/Utils/_Ja25DutchText.cpp @@ -155,6 +155,7 @@ STR16 gzIMPMajorTraitsHelpTextsRanger[]= L"-%d%s weather penalties\n", L"+%d%s camouflage effectiveness\n", L"-%d%s worn out speed of camouflage by water or time\n", + L"Can spot tracks up to %d tiles away\n", // TODO.Translate }; STR16 gzIMPMajorTraitsHelpTextsGunslinger[]= diff --git a/Utils/_Ja25EnglishText.cpp b/Utils/_Ja25EnglishText.cpp index f2cd7d84..0b49133e 100644 --- a/Utils/_Ja25EnglishText.cpp +++ b/Utils/_Ja25EnglishText.cpp @@ -155,6 +155,7 @@ STR16 gzIMPMajorTraitsHelpTextsRanger[]= L"-%d%s weather penalties\n", L"+%d%s camouflage effectiveness\n", L"-%d%s worn out speed of camouflage by water or time\n", + L"Can spot tracks up to %d tiles away\n", }; STR16 gzIMPMajorTraitsHelpTextsGunslinger[]= diff --git a/Utils/_Ja25FrenchText.cpp b/Utils/_Ja25FrenchText.cpp index 25effaf9..1f268bc1 100644 --- a/Utils/_Ja25FrenchText.cpp +++ b/Utils/_Ja25FrenchText.cpp @@ -156,6 +156,7 @@ STR16 gzIMPMajorTraitsHelpTextsRanger[]= L"-%d%s de pénalités du temps\n", L"+%d%s d'efficacité du camouflage\n", L"-%d%s de l'usure du camouflage due au temps ou à l'eau\n", + L"Can spot tracks up to %d tiles away\n", // TODO.Translate }; STR16 gzIMPMajorTraitsHelpTextsGunslinger[]= diff --git a/Utils/_Ja25GermanText.cpp b/Utils/_Ja25GermanText.cpp index 03309eff..8a993791 100644 --- a/Utils/_Ja25GermanText.cpp +++ b/Utils/_Ja25GermanText.cpp @@ -155,6 +155,7 @@ STR16 gzIMPMajorTraitsHelpTextsRanger[]= L"-%d%s Einfluss durch schlechtes Wetter\n", L"+%d%s Tarnungs-Effektivität\n", L"-%d%s Abnutzung von Tarnfarbe durch Wasser oder Zeit\n", + L"Can spot tracks up to %d tiles away\n", // TODO.Translate }; STR16 gzIMPMajorTraitsHelpTextsGunslinger[]= diff --git a/Utils/_Ja25ItalianText.cpp b/Utils/_Ja25ItalianText.cpp index bde25d21..36a5550a 100644 --- a/Utils/_Ja25ItalianText.cpp +++ b/Utils/_Ja25ItalianText.cpp @@ -153,6 +153,7 @@ STR16 gzIMPMajorTraitsHelpTextsRanger[]= L"-%d%s weather penalties\n", L"+%d%s camouflage effectiveness\n", L"-%d%s worn out speed of camouflage by water or time\n", + L"Can spot tracks up to %d tiles away\n", // TODO.Translate }; STR16 gzIMPMajorTraitsHelpTextsGunslinger[]= diff --git a/Utils/_Ja25PolishText.cpp b/Utils/_Ja25PolishText.cpp index 4e0ae4d6..8c38975f 100644 --- a/Utils/_Ja25PolishText.cpp +++ b/Utils/_Ja25PolishText.cpp @@ -155,6 +155,7 @@ STR16 gzIMPMajorTraitsHelpTextsRanger[]= L"-%d%s weather penalties\n", L"+%d%s camouflage effectiveness\n", L"-%d%s worn out speed of camouflage by water or time\n", + L"Can spot tracks up to %d tiles away\n", // TODO.Translate }; STR16 gzIMPMajorTraitsHelpTextsGunslinger[]= diff --git a/Utils/_Ja25RussianText.cpp b/Utils/_Ja25RussianText.cpp index 48c5ccf2..1616a503 100644 --- a/Utils/_Ja25RussianText.cpp +++ b/Utils/_Ja25RussianText.cpp @@ -155,6 +155,7 @@ STR16 gzIMPMajorTraitsHelpTextsRanger[]= L"-%d%s к штрафам от погодных условий\n", L"+%d%s к эффективности камуфляжа\n", L"-%d%s на скорость ухудшения камуфляжа от воды и времени\n", + L"Can spot tracks up to %d tiles away\n", // TODO.Translate }; STR16 gzIMPMajorTraitsHelpTextsGunslinger[]= diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index f65a032d..f9e5f194 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -8271,6 +8271,7 @@ STR16 szBackgroundText_Value[]= L" %s%d%% effectiveness as spotter for fellow snipers\n", // TODO.Translate L" %s%d%% effectiveness at diagnosing diseases\n", // TODO.Translate L" %s%d%% effectiveness at treating population against diseases\n", + L"Can spot tracks up to %d tiles away\n", L" dislikes some other backgrounds", // TODO.Translate }; @@ -9131,7 +9132,7 @@ STR16 szTacticalCoverDialogString[]= L"Roles", // TODO.Translate L"", - L"", + L"Tracker", L"", L"Traps", diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index 9a461733..6163f140 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -8243,6 +8243,7 @@ STR16 szBackgroundText_Value[]= L" %s%d%% effectiveness at diagnosing diseases\n", // TODO.Translate L" %s%d%% effectiveness at treating population against diseases\n", + L"Can spot tracks up to %d tiles away\n", L" dislikes some other backgrounds", // TODO.Translate }; @@ -9102,7 +9103,7 @@ STR16 szTacticalCoverDialogString[]= L"Roles", // TODO.Translate L"", - L"", + L"Tracker", L"", L"Ловушки",