diff --git a/GameSettings.cpp b/GameSettings.cpp index f91488c1..dcf08043 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -2253,6 +2253,8 @@ void LoadGameExternalOptions() gGameExternalOptions.fAdministrationPointsPerPercent = (FLOAT)iniReader.ReadDouble( "Strategic Assignment Settings", "ADMINISTRATION_POINTS_PER_PERCENT", 20.0f, 1.0f, 1000.0f ); gGameExternalOptions.fAdministrationMaxPercent = iniReader.ReadInteger( "Strategic Assignment Settings", "ADMINISTRATION_MAX_PERCENTAGE", 15, 0, 100 ); + + gGameExternalOptions.fExplorationPointsModifier = (FLOAT)iniReader.ReadDouble("Strategic Assignment Settings", "EXPLORATION_POINTS_MODIFIER", 1.0f, 0.01f, 10.0f ); gGameExternalOptions.fUseXMLSquadNames = iniReader.ReadBoolean("Strategic Assignment Settings", "USE_XML_SQUADNAMES", FALSE); diff --git a/GameSettings.h b/GameSettings.h index 0a6ca1fe..b2b64cb0 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -737,6 +737,8 @@ typedef struct FLOAT fAdministrationPointsPerPercent; UINT16 fAdministrationMaxPercent; + FLOAT fExplorationPointsModifier; + INT32 ubTrainingSkillMin; INT32 ubTrainingSkillMax; INT32 ubSelfTrainingDivisor; diff --git a/GameVersion.cpp b/GameVersion.cpp index 8076c223..fb092e6a 100644 --- a/GameVersion.cpp +++ b/GameVersion.cpp @@ -55,8 +55,8 @@ #endif -CHAR8 czVersionNumber[16] = { "Build 20.05.30" }; //YY.MM.DD +CHAR8 czVersionNumber[16] = { "Build 20.06.01" }; //YY.MM.DD CHAR16 zTrackingNumber[16] = { L"Z" }; -CHAR16 zRevisionNumber[16] = { L"Revision 8811" }; +CHAR16 zRevisionNumber[16] = { L"Revision 8815" }; // SAVE_GAME_VERSION is defined in header, change it there diff --git a/Standard Gaming Platform/line.cpp b/Standard Gaming Platform/line.cpp index 2435f21a..3b0f3341 100644 --- a/Standard Gaming Platform/line.cpp +++ b/Standard Gaming Platform/line.cpp @@ -366,7 +366,7 @@ void PixelDraw( BOOLEAN fClip, INT32 xp, INT32 yp, INT16 sColor, UINT8 *pScreen } // Flugente: alter the colour of existing pixels instead of fully replacing the colour -void PixelAlterColour(BOOLEAN fClip, INT32 xp, INT32 yp, UINT8 col1, UINT8 col2, UINT8 *pScreen) +void PixelAlterColour(BOOLEAN fClip, INT32 xp, INT32 yp, INT16 sColor, UINT8 *pScreen) { if ( fClip && !ClipPoint( xp, yp ) ) return; @@ -374,6 +374,9 @@ void PixelAlterColour(BOOLEAN fClip, INT32 xp, INT32 yp, UINT8 col1, UINT8 col2, // point to the bitmap address first pixel to draw pScreen += yp * giImageWidth + xp * 2; + INT8 col2 = sColor >> 8; + INT8 col1 = sColor & 0x00ff; + pScreen[0] |= col1; pScreen[1] |= col2; } diff --git a/Standard Gaming Platform/line.h b/Standard Gaming Platform/line.h index 1fdf3494..5846f8d9 100644 --- a/Standard Gaming Platform/line.h +++ b/Standard Gaming Platform/line.h @@ -59,7 +59,7 @@ void SetClippingRegionAndImageWidth( void PixelDraw( BOOLEAN fClip, INT32 xp, INT32 yp, INT16 sColor, UINT8 *pScreen ); // Flugente: alter the colour of existing pixels instead of fully replacing the colour -void PixelAlterColour( BOOLEAN fClip, INT32 xp, INT32 yp, UINT8 col1, UINT8 col2, UINT8 *pScreen ); +void PixelAlterColour( BOOLEAN fClip, INT32 xp, INT32 yp, INT16 sColor, UINT8 *pScreen ); void LineDraw( BOOL fClip, int XStart, int YStart, int XEnd, int YEnd, short Color, UINT8 *ScreenPtr); void LineDraw( BOOL fClip, int XStart, int YStart, int XEnd, int YEnd, short Color, UINT8 *ScreenPtr); diff --git a/Strategic/Assignments.cpp b/Strategic/Assignments.cpp index 3efad77d..81e4d6b1 100644 --- a/Strategic/Assignments.cpp +++ b/Strategic/Assignments.cpp @@ -513,6 +513,9 @@ void HandleSpyAssignments(); // Flugente: handle administration assignment void HandleAdministrationAssignments(); +// Flugente: handle exploration assignements +void HandleExplorationAssignments(); + // is the character between secotrs in mvt BOOLEAN CharacterIsBetweenSectors( SOLDIERTYPE *pSoldier ); @@ -1111,6 +1114,29 @@ BOOLEAN CanCharacterAdministration( SOLDIERTYPE *pSoldier ) return TRUE; } +BOOLEAN CanCharacterExplore( SOLDIERTYPE *pSoldier ) +{ + AssertNotNIL( pSoldier ); + + if ( !BasicCanCharacterAssignment( pSoldier, TRUE ) ) + return FALSE; + + if ( pSoldier->bSectorZ ) + { + UNDERGROUND_SECTORINFO* pSector = FindUnderGroundSector( pSoldier->sSectorX, pSoldier->sSectorY, pSoldier->bSectorZ ); + if ( !pSector || pSector->usExplorationProgress >= 250 ) + return FALSE; + } + else + { + SECTORINFO* pSector = &( SectorInfo[SECTOR( pSoldier->sSectorX, pSoldier->sSectorY )] ); + if ( !pSector || pSector->usExplorationProgress >= 250 ) + return FALSE; + } + + return TRUE; +} + BOOLEAN IsAnythingAroundForSoldierToRepair( SOLDIERTYPE * pSoldier ) { AssertNotNIL(pSoldier); @@ -2967,6 +2993,9 @@ void UpdateAssignments() // handle administration assignment HandleAdministrationAssignments(); + // handle exploration + HandleExplorationAssignments(); + // check to see if anyone is done healing? UpdatePatientsWhoAreDoneHealing( ); @@ -6898,6 +6927,96 @@ void HandleAdministrationAssignments() } } +// Flugente: handle exploration assignments +void HandleExplorationAssignments() +{ + SOLDIERTYPE *pSoldier = NULL; + UINT32 uiCnt = 0; + UINT32 firstid = gTacticalStatus.Team[gbPlayerNum].bFirstID; + UINT32 lastid = gTacticalStatus.Team[gbPlayerNum].bLastID; + for ( uiCnt = firstid, pSoldier = MercPtrs[uiCnt]; uiCnt <= lastid; ++uiCnt, ++pSoldier ) + { + if ( pSoldier && pSoldier->bAssignment == EXPLORATION && !pSoldier->flags.fMercAsleep && EnoughTimeOnAssignment( pSoldier ) ) + { + UINT32 pts = pSoldier->GetExplorationPoints(); + + bool awardpts = false; + + if ( pSoldier->bSectorZ ) + { + UNDERGROUND_SECTORINFO *pSector; + pSector = FindUnderGroundSector( pSoldier->sSectorX, pSoldier->sSectorY, pSoldier->bSectorZ ); + if ( pSector && pSector->usExplorationProgress < 250 ) + { + awardpts = true; + + UINT32 oldprogress = pSector->usExplorationProgress; + UINT32 newprogress = min( 255, oldprogress + pts ); + + if ( newprogress > 250 ) + { + pSector->usExplorationProgress = 255; + + CHAR16 wSectorName[64]; + GetShortSectorString( pSoldier->sSectorX, pSoldier->sSectorY, wSectorName ); + + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, Message[STR_ASSIGNMENT_EXPLORATION_DONE], pSoldier->GetName(), wSectorName ); + + AssignmentDone( pSoldier, TRUE, TRUE ); + } + else + { + pSector->usExplorationProgress = (UINT8)newprogress; + } + } + else + { + AssignmentDone( pSoldier, TRUE, TRUE ); + } + } + else + { + SECTORINFO* pSector = &( SectorInfo[SECTOR( pSoldier->sSectorX, pSoldier->sSectorY )] ); + + if ( pSector && pSector->usExplorationProgress < 250 ) + { + awardpts = true; + + UINT32 oldprogress = pSector->usExplorationProgress; + UINT32 newprogress = min( 255, oldprogress + pts ); + + if ( newprogress > 250 ) + { + pSector->usExplorationProgress = 255; + + CHAR16 wSectorName[64]; + GetShortSectorString( pSoldier->sSectorX, pSoldier->sSectorY, wSectorName ); + + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, Message[STR_ASSIGNMENT_EXPLORATION_DONE], pSoldier->GetName(), wSectorName ); + + AssignmentDone( pSoldier, TRUE, TRUE ); + } + else + { + pSector->usExplorationProgress = (UINT8)newprogress; + } + } + else + { + AssignmentDone( pSoldier, TRUE, TRUE ); + } + } + + if ( awardpts ) + { + StatChange( pSoldier, AGILAMT, 1, FROM_TRAINING ); + StatChange( pSoldier, WISDOMAMT, 1, FROM_TRAINING ); + StatChange( pSoldier, EXPERAMT, 1, FROM_TRAINING ); + } + } + } +} + // handle snitch spreading propaganda assignment // totally not a copy of HandleRadioScanInSector void HandleSpreadingPropagandaInSector( INT16 sMapX, INT16 sMapY, INT8 bZ ) @@ -10567,7 +10686,19 @@ void HandleShadingOfLinesForAssignmentMenus( void ) { ShadeStringInBox( ghAssignmentBox, ASSIGN_MENU_ADMINISTRATION ); } - + + // exploration + if ( CanCharacterExplore( pSoldier ) ) + { + // unshade line + UnShadeStringInBox( ghAssignmentBox, ASSIGN_MENU_EXPLORATION ); + } + else + { + // shade line + ShadeStringInBox( ghAssignmentBox, ASSIGN_MENU_EXPLORATION ); + } + // militia if ( CanCharacterOnDuty( pSoldier ) ) { @@ -14130,6 +14261,42 @@ void AssignmentMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason ) } break; + case ASSIGN_MENU_EXPLORATION: + if ( CanCharacterExplore( pSoldier ) ) + { + // stop showing menu + fShowAssignmentMenu = FALSE; + giAssignHighLine = -1; + + pSoldier->bOldAssignment = pSoldier->bAssignment; + + if ( ( pSoldier->bAssignment != EXPLORATION ) ) + { + SetTimeOfAssignmentChangeForMerc( pSoldier ); + } + + // remove from squad + if ( pSoldier->bOldAssignment == VEHICLE ) + { + TakeSoldierOutOfVehicle( pSoldier ); + } + RemoveCharacterFromSquads( pSoldier ); + + ChangeSoldiersAssignment( pSoldier, EXPLORATION ); + + AssignMercToAMovementGroup( pSoldier ); + + MakeSoldiersTacticalAnimationReflectAssignment( pSoldier ); + + // set dirty flag + fTeamPanelDirty = TRUE; + fMapScreenBottomDirty = TRUE; + + // set assignment for group + SetAssignmentForList( (INT8)EXPLORATION, 0 ); + } + break; + case( ASSIGN_MENU_CANCEL ): fShowAssignmentMenu = FALSE; giAssignHighLine = -1; @@ -17083,6 +17250,30 @@ void SetSoldierAssignment( SOLDIERTYPE *pSoldier, INT8 bAssignment, INT32 iParam AssignMercToAMovementGroup( pSoldier ); } break; + + case EXPLORATION: + if ( CanCharacterExplore( pSoldier ) ) + { + pSoldier->bOldAssignment = pSoldier->bAssignment; + + // remove from squad + RemoveCharacterFromSquads( pSoldier ); + + // remove from any vehicle + if ( pSoldier->bOldAssignment == VEHICLE ) + { + TakeSoldierOutOfVehicle( pSoldier ); + } + + if ( pSoldier->bAssignment != bAssignment ) + { + SetTimeOfAssignmentChangeForMerc( pSoldier ); + } + + ChangeSoldiersAssignment( pSoldier, bAssignment ); + AssignMercToAMovementGroup( pSoldier ); + } + break; } } @@ -18234,6 +18425,10 @@ void ReEvaluateEveryonesNothingToDo( BOOLEAN aDoExtensiveCheck ) fNothingToDo = !CanCharacterAdministration( pSoldier ) || !GetNumberofAdministratableMercs( pSoldier->sSectorX, pSoldier->sSectorY ); break; + case EXPLORATION: + fNothingToDo = !CanCharacterExplore( pSoldier ); + break; + case VEHICLE: default: // squads fNothingToDo = FALSE; @@ -18589,6 +18784,15 @@ void SetAssignmentForList( INT8 bAssignment, INT8 bParam ) } break; + case EXPLORATION: + if ( CanCharacterExplore( pSoldier ) ) + { + pSoldier->bOldAssignment = pSoldier->bAssignment; + SetSoldierAssignment( pSoldier, bAssignment, bParam, 0, 0 ); + fItWorked = TRUE; + } + break; + case( SQUAD_1 ): case( SQUAD_2 ): case( SQUAD_3 ): diff --git a/Strategic/Assignments.h b/Strategic/Assignments.h index b905aecc..8fa1189a 100644 --- a/Strategic/Assignments.h +++ b/Strategic/Assignments.h @@ -98,6 +98,7 @@ enum DRILL_MILITIA, // train existing militia (does not create new ones) BURIAL, // merc removes corpses in this sector ADMINISTRATION, // merc boosts the effectiveness of other mercs + EXPLORATION, // merc searches the sector for undiscovered items NUM_ASSIGNMENTS, }; @@ -213,6 +214,7 @@ BOOLEAN CanCharacterSpyAssignment( SOLDIERTYPE *pSoldier ); BOOLEAN CanCharacterBurial( SOLDIERTYPE *pSoldier ); BOOLEAN CanCharacterAdministration( SOLDIERTYPE *pSoldier ); +BOOLEAN CanCharacterExplore( SOLDIERTYPE *pSoldier ); // can this character be assigned as a repairman? BOOLEAN CanCharacterRepair( SOLDIERTYPE *pCharacter ); diff --git a/Strategic/Campaign Types.h b/Strategic/Campaign Types.h index 84ecc095..8f67fad4 100644 --- a/Strategic/Campaign Types.h +++ b/Strategic/Campaign Types.h @@ -574,7 +574,7 @@ typedef struct SECTORINFO UINT8 ubNumAdmins_Turncoat; UINT8 ubNumTroops_Turncoat; UINT8 ubNumElites_Turncoat; - UINT8 bPadding_1; + UINT8 usExplorationProgress; INT8 bPadding[ 8 ]; @@ -624,8 +624,9 @@ typedef struct UNDERGROUND_SECTORINFO UINT8 ubNumJeeps; UINT8 ubJeepsInBattle; + UINT8 usExplorationProgress; - INT8 bPadding[14]; + INT8 bPadding[12]; //no padding left! }UNDERGROUND_SECTORINFO; diff --git a/Strategic/Map Screen Interface.h b/Strategic/Map Screen Interface.h index 71f5bc67..d1386f9b 100644 --- a/Strategic/Map Screen Interface.h +++ b/Strategic/Map Screen Interface.h @@ -134,6 +134,7 @@ enum { ASSIGN_MENU_FORTIFY, // added by Flugente ASSIGN_MENU_SPY, // added by Flugente ASSIGN_MENU_ADMINISTRATION, // added by Flugente + ASSIGN_MENU_EXPLORATION, // added by Flugente ASSIGN_MENU_FACILITY, // HEAROCK HAM 3.6: Facility List menu ASSIGN_MENU_CANCEL, MAX_ASSIGN_STRING_COUNT, diff --git a/Tactical/Faces.cpp b/Tactical/Faces.cpp index 862e3051..94d6e135 100644 --- a/Tactical/Faces.cpp +++ b/Tactical/Faces.cpp @@ -2428,6 +2428,16 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE swprintf(sString, L"%d/%3.1f", sPtsAvailable, bPtsAvailable); break; + + case EXPLORATION: + sIconIndex_Assignment = 34; + fDoIcon_Assignment = TRUE; + fShowCustomText = TRUE; + sPtsAvailable = (INT16)MercPtrs[pFace->ubSoldierID]->GetExplorationPoints(); + + // we only show our points, not how far we are with the task, lest the player deduct how many items there are to find in the first place + swprintf( sString, L"%d", sPtsAvailable ); + break; } // Check for being serviced... diff --git a/Tactical/Interface Control.cpp b/Tactical/Interface Control.cpp index 81dac527..efb0cb10 100644 --- a/Tactical/Interface Control.cpp +++ b/Tactical/Interface Control.cpp @@ -619,6 +619,8 @@ void DrawExplosionWarning( INT32 sGridno, INT8 sLevel, INT8 sDelay ) // make sure to check for these boundaries later on, and only draw inside them SetClippingRegionAndImageWidth( uiDestPitchBYTES, gsVIEWPORT_START_X, gsVIEWPORT_WINDOW_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_WINDOW_END_Y ); + UINT16 red = Get16BPPColor( FROMRGB( 255, 0, 0 ) ); + INT16 numcircles = max( 1, 4 - sDelay); // we determine the biggest rectangle we have to reserve @@ -658,7 +660,7 @@ void DrawExplosionWarning( INT32 sGridno, INT8 sLevel, INT8 sDelay ) if ( radius_inner <= diff && diff <= radius_outer ) { // we alter the colour of existing pixels instead of fully replacing the colour. As a result, one can still see the map regions we draw over, which looks a lot better - PixelAlterColour( FALSE, x, y, 0x00, 0x88, pDestBuf ); + PixelAlterColour( FALSE, x, y, red, pDestBuf ); sthdrawn = TRUE; } @@ -733,6 +735,8 @@ void DrawTraitRadius( INT32 sGridno, INT8 sLevel, INT32 sRadius, INT16 sThicknes best_yl = min( best_yl, yl ); best_yr = max( best_yr, yr ); + UINT16 blue = Get16BPPColor( FROMRGB( 0, 0, 255 ) ); + for ( INT32 x = xl; x <= xr; ++x ) { FLOAT xdiffsquared = (FLOAT)((sScreenX - x) * (sScreenX - x)); @@ -744,7 +748,7 @@ void DrawTraitRadius( INT32 sGridno, INT8 sLevel, INT32 sRadius, INT16 sThicknes if ( radius_inner <= diff && diff <= radius_outer ) { // we alter the colour of existing pixels instead of fully replacing the colour. As a result, one can still see the map regions we draw over, which looks a lot better - PixelAlterColour( FALSE, x, y, 0xFF, 0x00, pDestBuf ); + PixelAlterColour( FALSE, x, y, blue, pDestBuf ); sthdrawn = TRUE; } diff --git a/Tactical/Interface.h b/Tactical/Interface.h index 6ecb6cbb..e531076b 100644 --- a/Tactical/Interface.h +++ b/Tactical/Interface.h @@ -205,6 +205,7 @@ enum { BG_HACKERSKILL, // hacking skill from 0 to 100, > 0 means hacking is possible BG_BURIAL_ASSIGNMENT, // modifies effectivity of 'BURIAL' assignment BG_ADMINISTRATION_ASSIGNMENT, // modifies effectivity of 'ADMINISTRATION' assignment + BG_EXPLORATION_ASSIGNMENT, // modifies effectivity of 'EXPLORATION' assignment BG_MAX, }; diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index bfc8c5f1..7dd4acb7 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -20684,7 +20684,7 @@ FLOAT SOLDIERTYPE::GetAdministrationModifier() // Flugente: those with the background occasionally steal money from the locals UINT8 SOLDIERTYPE::GetThiefStealMoneyChance() { - if ( this->stats.bLife < OKLIFE ) + if ( this->stats.bLife < OKLIFE || ( this->usSoldierFlagMask & SOLDIER_POW ) ) return 0; UINT32 val = 1 * EffectiveAgility( this, FALSE ) + 8 * EffectiveDexterity( this, FALSE ) + 10 * EffectiveExpLevel( this, FALSE ); @@ -21001,6 +21001,60 @@ void SOLDIERTYPE::OrderAllTurnCoatToSwitchSides() } } +UINT32 SOLDIERTYPE::GetExplorationPoints() +{ + if ( this->stats.bLife < OKLIFE || ( this->usSoldierFlagMask & SOLDIER_POW ) ) + return 0; + + // if not on correct assignment, no gain + if ( this->bAssignment != EXPLORATION ) + return 0; + + UINT32 val = 400 + 1 * EffectiveWisdom( this ) + 1 * EffectiveAgility( this, FALSE ) + 5 * EffectiveExpLevel( this, FALSE ) + + 150 * NUM_SKILL_TRAITS( this, SCOUTING_NT ) + 50 * NUM_SKILL_TRAITS( this, SURVIVAL_NT ) + (this->HasBackgroundFlag( BACKGROUND_SCROUNGING ) ? 150 : 0); + + // personality/disability modifiers + FLOAT persmodifier = 1.0f; + //if ( DoesMercHaveDisability( this, HEAT_INTOLERANT ) ) persmodifier -= 0.20f; + //if ( DoesMercHaveDisability( this, NERVOUS ) ) persmodifier -= 0.20f; + if ( DoesMercHaveDisability( this, CLAUSTROPHOBIC ) ) persmodifier -= 0.03f; + //if ( DoesMercHaveDisability( this, NONSWIMMER ) ) persmodifier -= 0.20f; + //if ( DoesMercHaveDisability( this, FEAR_OF_INSECTS ) ) persmodifier -= 0.20f; + if ( DoesMercHaveDisability( this, FORGETFUL ) ) persmodifier -= 0.30f; + //if ( DoesMercHaveDisability( this, PSYCHO ) ) persmodifier -= 0.20f; + //if ( DoesMercHaveDisability( this, DEAF ) ) persmodifier -= 0.15f; + if ( DoesMercHaveDisability( this, SHORTSIGHTED ) ) persmodifier -= 0.30f; + //if ( DoesMercHaveDisability( this, HEMOPHILIAC ) ) persmodifier -= 0.20f; + if ( DoesMercHaveDisability( this, AFRAID_OF_HEIGHTS ) ) persmodifier -= 0.02f; + //if ( DoesMercHaveDisability( this, SELF_HARM ) ) persmodifier -= 0.20f; + + if ( gGameOptions.fNewTraitSystem ) + { + //if ( DoesMercHavePersonality( this, CHAR_TRAIT_SOCIABLE ) ) persmodifier += 0.25f; + //if ( DoesMercHavePersonality( this, CHAR_TRAIT_LONER ) ) persmodifier -= 0.05f; + //if ( DoesMercHavePersonality( this, CHAR_TRAIT_OPTIMIST ) ) persmodifier += 0.05f; + //if ( DoesMercHavePersonality( this, CHAR_TRAIT_ASSERTIVE ) ) persmodifier += 0.15f; + //if ( DoesMercHavePersonality( this, CHAR_TRAIT_INTELLECTUAL ) ) persmodifier += 0.15f; + //if ( DoesMercHavePersonality( this, CHAR_TRAIT_PRIMITIVE ) ) persmodifier -= 0.15f; + //if ( DoesMercHavePersonality( this, CHAR_TRAIT_AGGRESSIVE ) ) persmodifier -= 0.15f; + //if ( DoesMercHavePersonality( this, CHAR_TRAIT_PHLEGMATIC ) ) persmodifier -= 0.05f; + //if ( DoesMercHavePersonality( this, CHAR_TRAIT_DAUNTLESS ) ) persmodifier -= 0.13f; + //if ( DoesMercHavePersonality( this, CHAR_TRAIT_PACIFIST ) ) persmodifier -= 0.03f; + //if ( DoesMercHavePersonality( this, CHAR_TRAIT_MALICIOUS ) ) persmodifier -= 0.13f; + //if ( DoesMercHavePersonality( this, CHAR_TRAIT_SHOWOFF ) ) persmodifier -= 0.08f; + if ( DoesMercHavePersonality( this, CHAR_TRAIT_COWARD ) ) persmodifier -= 0.02f; + } + + // background modifier + persmodifier += ( this->GetBackgroundValue( BG_EXPLORATION_ASSIGNMENT ) ) / 100.0f; + + UINT32 totalvalue = val * persmodifier * gGameExternalOptions.fExplorationPointsModifier / 10; + + ReducePointsForFatigue( this, &totalvalue ); + + return totalvalue; +} + INT32 CheckBleeding( SOLDIERTYPE *pSoldier ) { INT8 bBandaged; //,savedOurTurn; diff --git a/Tactical/Soldier Control.h b/Tactical/Soldier Control.h index 606cfcd6..96a5b4b4 100644 --- a/Tactical/Soldier Control.h +++ b/Tactical/Soldier Control.h @@ -2038,6 +2038,9 @@ public: void AttemptToCreateTurncoat( UINT16 usID ); BOOLEAN OrderTurnCoatToSwitchSides( UINT16 usID ); void OrderAllTurnCoatToSwitchSides(); + + // Flugente: exploration assignment + UINT32 GetExplorationPoints(); ////////////////////////////////////////////////////////////////////////////// }; // SOLDIERTYPE; diff --git a/Tactical/XML_Background.cpp b/Tactical/XML_Background.cpp index 43159dd7..001d3d17 100644 --- a/Tactical/XML_Background.cpp +++ b/Tactical/XML_Background.cpp @@ -140,6 +140,7 @@ backgroundStartElementHandle(void *userData, const XML_Char *name, const XML_Cha strcmp(name, "hackerskill" ) == 0 || strcmp(name, "burial_assignment" ) == 0 || strcmp(name, "administration_assignment" ) == 0 || + strcmp(name, "exploration_assignment" ) == 0 || strcmp(name, "druguse") == 0 || strcmp(name, "xenophobic") == 0 || strcmp(name, "corruptionspread") == 0 || @@ -610,6 +611,11 @@ backgroundEndElementHandle(void *userData, const XML_Char *name) pData->curElement = ELEMENT; pData->curBackground.value[BG_ADMINISTRATION_ASSIGNMENT] = min( 1000, max( -50, (INT16)atol( pData->szCharData ) ) ); } + else if ( strcmp( name, "exploration_assignment" ) == 0 ) + { + pData->curElement = ELEMENT; + pData->curBackground.value[BG_EXPLORATION_ASSIGNMENT] = min( 1000, max( -100, (INT16)atol( pData->szCharData ) ) ); + } else if(strcmp(name, "druguse") == 0) { pData->curElement = ELEMENT; diff --git a/TileEngine/overhead map.cpp b/TileEngine/overhead map.cpp index 6f329026..b69b84bc 100644 --- a/TileEngine/overhead map.cpp +++ b/TileEngine/overhead map.cpp @@ -39,6 +39,7 @@ #include "tile surface.h" #include "GameSettings.h" #include + #include "Action Items.h" // added by Flugente #endif #include "connect.h" @@ -110,6 +111,7 @@ BOOLEAN GetOverheadMouseGridNoForFullSoldiersGridNo( INT32 *psGridNo ); extern BOOLEAN AnyItemsVisibleOnLevel( ITEM_POOL *pItemPool, INT8 bZLevel ); extern void HandleAnyMercInSquadHasCompatibleStuff( UINT8 ubSquad, OBJECTTYPE *pObject, BOOLEAN fReset ); +extern UNDERGROUND_SECTORINFO* FindUnderGroundSector( INT16 sMapX, INT16 sMapY, UINT8 bMapZ ); //Isometric utilities (for overhead stuff only) BOOLEAN GetOverheadMouseGridNo( INT32 *psGridNo ); @@ -1664,66 +1666,169 @@ void RenderOverheadOverlays() UINT16 blue = Get16BPPColor(FROMRGB(0, 0, 255)); UINT16 green = Get16BPPColor(FROMRGB(0, 255, 0)); UINT16 white = Get16BPPColor(FROMRGB(255, 255, 255)); + UINT16 red_dull = Get16BPPColor( FROMRGB( 142, 0, 0 ) ); + UINT16 blue_dull = Get16BPPColor( FROMRGB( 0, 0, 248 ) ); + UINT16 green_dull = Get16BPPColor( FROMRGB( 0, 127, 0 ) ); + + // Flugente: exploration assignment + bool explored = false; + if ( gbWorldSectorZ ) + { + UNDERGROUND_SECTORINFO *pSector; + pSector = FindUnderGroundSector( gWorldSectorX, gWorldSectorY, gbWorldSectorZ ); + if ( pSector && pSector->usExplorationProgress >= 250 ) + explored = true; + } + else + { + UINT8 sector = SECTOR( gWorldSectorX, gWorldSectorY ); + + if ( SectorInfo[sector].usExplorationProgress >= 250 ) + explored = true; + } + + INT32 radiusingridnos = 5; + FLOAT thickness = 4; + + // determine radius + // x-diff is 4 per unit, y-diff 2 per unit + FLOAT xdiffsquared = (FLOAT)( 16 * radiusingridnos * radiusingridnos ); + FLOAT radius = sqrt( (FLOAT)( xdiffsquared + 4 * 4 * radiusingridnos * radiusingridnos ) ); + + FLOAT radius_inner = radius - thickness / 2; + FLOAT radius_outer = radius + thickness / 2; for( i = 0 ; i < guiNumWorldItems; ++i ) { pWorldItem = &gWorldItems[ i ]; - if( !pWorldItem || !pWorldItem->fExists || pWorldItem->bVisible != VISIBLE && !(gTacticalStatus.uiFlags & SHOW_ALL_ITEMS) ) + if( !pWorldItem || !pWorldItem->fExists ) continue; - if(!GetOverheadScreenXYFromGridNo(pWorldItem->sGridNo, &sX, &sY))//dnl ch45 041009 - continue; - - //adjust for position. - //sX += 2; - sY += 6; - sY -= ( GetOffsetLandHeight( pWorldItem->sGridNo ) /5); - - sY += ( gsRenderHeight / 5 ); - - // Smaller maps - if (gsStartRestrictedX > 0) + // display item + if ( pWorldItem->bVisible == VISIBLE + || ( gTacticalStatus.uiFlags & SHOW_ALL_ITEMS ) ) { - sX += gsStartRestrictedX; - } - // Full size maps - else - { - sX += iOffsetHorizontal; + if ( !GetOverheadScreenXYFromGridNo( pWorldItem->sGridNo, &sX, &sY ) )//dnl ch45 041009 + continue; + + //adjust for position. + + // Smaller maps + if ( gsStartRestrictedX > 0 ) + { + sX += gsStartRestrictedX; + } + // Full size maps + else + { + sX += iOffsetHorizontal; + } + + INT16 offsetlandheight = GetOffsetLandHeight( pWorldItem->sGridNo ) / 5; + sY += 6 - offsetlandheight; + sY += ( gsRenderHeight / 5 ); + + // Smaller maps + if ( gsStartRestrictedY > 0 ) + { + sY += gsStartRestrictedY; + } + // Full size maps + else + { + sY += iOffsetVertical; + } + + /*sX += iOffsetHorizontal + gsStartRestrictedX; + sY += iOffsetVertical + gsStartRestrictedY;*/ + + if ( gfOverItemPool && gsOveritemPoolGridNo == pWorldItem->sGridNo ) + { + usLineColor = red; + } + else if ( gfRadarCurrentGuyFlash ) + { + usLineColor = black; + } + else switch ( pWorldItem->bVisible ) + { + case HIDDEN_ITEM: usLineColor = blue; break; + case BURIED: usLineColor = red; break; + case HIDDEN_IN_OBJECT: usLineColor = blue; break; + case INVISIBLE: usLineColor = green; break; + case VISIBLE: usLineColor = white; break; + } + + PixelDraw( FALSE, sX, sY, usLineColor, pDestBuf ); } - // Smaller maps - if (gsStartRestrictedY > 0) + // Flugente: exploration + // draw a circle around items the player does not yet know of if the player has been fully explored + // exclude most action items, except for explosive ones + if ( explored + && pWorldItem->bVisible != VISIBLE + && ( pWorldItem->object.usItem != ACTION_ITEM || pWorldItem->object[0]->data.misc.bActionValue == ACTION_ITEM_BLOW_UP ) ) { - sY += gsStartRestrictedY; - } - // Full size maps - else - { - sY += iOffsetVertical; - } + // in order not go give away the precise location of the item, have the center of the circles vary, but with the item being inside + // we can't use random numbers as the circles shouldn't move upon repeated calls, so use modulo magic + INT16 totalvariationsquared = ( 4 + pWorldItem->sGridNo * 37 ) % radiusingridnos*radiusingridnos; + INT16 variation_x = sqrt(( ( pWorldItem->sGridNo * 13 ) % 100 ) * totalvariationsquared / 100); + INT16 variation_y = sqrt( totalvariationsquared - variation_x * variation_x ); - /*sX += iOffsetHorizontal + gsStartRestrictedX; - sY += iOffsetVertical + gsStartRestrictedY;*/ - - if ( gfOverItemPool && gsOveritemPoolGridNo == pWorldItem->sGridNo ) - { - usLineColor = red; - } - else if (gfRadarCurrentGuyFlash) - { - usLineColor = black; - } - else switch (pWorldItem->bVisible) - { - case HIDDEN_ITEM: usLineColor = blue; break; - case BURIED: usLineColor = red; break; - case HIDDEN_IN_OBJECT: usLineColor = blue; break; - case INVISIBLE: usLineColor = green; break; - case VISIBLE: usLineColor = white; break; - } + if ( pWorldItem->sGridNo % 8 < 4 ) variation_x *= -1; + if ( (2 + pWorldItem->sGridNo) % 8 < 4 ) variation_y *= -1; - PixelDraw( FALSE, sX, sY, usLineColor, pDestBuf ); + INT32 centergridno = pWorldItem->sGridNo + variation_y * WORLD_COLS + variation_x; + INT16 sX_Center, sY_Center; + if ( GetOverheadScreenXYFromGridNo( centergridno, &sX_Center, &sY_Center ) ) + { + //adjust for position. + + // Smaller maps + if ( gsStartRestrictedX > 0 ) + sX_Center += gsStartRestrictedX; + // Full size maps + else + sX_Center += iOffsetHorizontal; + + sY_Center += 6 - GetOffsetLandHeight( pWorldItem->sGridNo ) / 5; + sY_Center += ( gsRenderHeight / 5 ); + + // Smaller maps + if ( gsStartRestrictedY > 0 ) + sY_Center += gsStartRestrictedY; + // Full size maps + else + sY_Center += iOffsetVertical; + + // determine area of where the circle will be drawn in, take into account what part of the sector we actually see + INT32 xr = sX_Center + radius; + INT32 yr = sY_Center + radius; + + for ( INT32 x = sX_Center - radius; x <= xr; ++x ) + { + FLOAT xdiffsquared = (FLOAT)( ( sX_Center - x ) * ( sX_Center - x ) ); + + for ( INT32 y = sY_Center - radius; y <= yr; ++y ) + { + FLOAT diff = sqrt( (FLOAT)( xdiffsquared + 4 * ( sY_Center - y ) * ( sY_Center - y ) ) ); + + if ( radius_inner <= diff && diff <= radius_outer ) + { + // we alter the colour of existing pixels instead of fully replacing the colour. As a result, one can still see the map regions we draw over, which looks a lot better + switch ( pWorldItem->bVisible ) + { + case HIDDEN_ITEM: PixelAlterColour( FALSE, x, y, blue_dull, pDestBuf ); break; + case BURIED: PixelAlterColour( FALSE, x, y, red_dull, pDestBuf ); break; + case HIDDEN_IN_OBJECT: PixelAlterColour( FALSE, x, y, blue_dull, pDestBuf ); break; + case INVISIBLE: PixelAlterColour( FALSE, x, y, green_dull, pDestBuf ); break; + case VISIBLE: PixelAlterColour( FALSE, x, y, white, pDestBuf ); break; + } + } + } + } + } + } InvalidateRegion( sX, sY, (INT16)( sX + 1 ), (INT16)( sY + 1 ) ); } diff --git a/Utils/Text.h b/Utils/Text.h index 659c2ce7..767919f6 100644 --- a/Utils/Text.h +++ b/Utils/Text.h @@ -610,6 +610,8 @@ enum STR_ASSIGNMENT_NOTPOSSIBLE, STR_ASSIGNMENT_NOMILITIAPRESENT, + STR_ASSIGNMENT_EXPLORATION_DONE, + TEXT_NUM_STR_MESSAGE, }; diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 5e0e1d25..49918ea7 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -2364,6 +2364,8 @@ CHAR16 Message[][STRING_LENGTH] = L"此时无法分配任务", //L"Assignment not possible at the moment", L"没有能够训练的民兵。", //L"No militia that can be drilled present.", + + L"%s has fully explored %s.", // TODO.Translate }; // the country and its noun in the game @@ -2477,6 +2479,7 @@ STR16 pAssignmentStrings[] = L"训练民兵", //L"DMilitia", L"掩埋尸体", //L"Burial", L"管理", //L"Admin", + L"Explore", // TODO.Translate }; @@ -2586,6 +2589,7 @@ STR16 pPersonnelAssignmentStrings[] = L"训练现有的民兵", //L"Drill existing militia", L"掩埋尸体", //L"Bury corpses", L"管理人员", //L"Administration", + L"Exploration", // TODO.Translate }; @@ -2654,6 +2658,7 @@ STR16 pLongAssignmentStrings[] = L"训练现有的民兵", //L"Drill existing militia", L"掩埋尸体", //L"Bury corpses", L"管理人员", //L"Administration", + L"Exploration", // TODO.Translate }; @@ -2778,6 +2783,7 @@ STR16 pAssignMenuStrings[] = L"筑防", //L"Fortify", fortify sector L"情报", //L"Intel", covert assignments L"管理", //L"Administer", + L"Explore", // TODO.Translate L"设施", // the merc is using/staffing a facility //ham3.6 L"取消", }; @@ -9106,6 +9112,7 @@ STR16 szBackgroundText_Value[]= L" 间谍技能: %s%d ",//L" hacking skill: %s%d ", L" %s%d%% 掩埋尸体速度 \n", //L" %s%d%% burial speed\n", L" %s%d%% 管理效率 \n", //L" %s%d%% administration effectiveness\n", + L" %s%d%% exploration effectiveness\n", // TODO.Translate }; STR16 szBackgroundTitleText[] = diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 95f484fa..18d418d6 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -2363,6 +2363,8 @@ CHAR16 Message[][STRING_LENGTH] = L"Assignment not possible at the moment", // TODO.Translate L"No militia that can be drilled present.", + + L"%s has fully explored %s.", // TODO.Translate }; // the country and its noun in the game @@ -2476,6 +2478,7 @@ STR16 pAssignmentStrings[] = L"DMilitia", L"Burial", L"Admin", // TODO.Translate + L"Explore", // TODO.Translate }; @@ -2585,6 +2588,7 @@ STR16 pPersonnelAssignmentStrings[] = L"Drill existing militia", L"Bury corpses", L"Administration", // TODO.Translate + L"Exploration", // TODO.Translate }; @@ -2653,6 +2657,7 @@ STR16 pLongAssignmentStrings[] = L"Drill existing militia", L"Bury corpses", L"Administration", // TODO.Translate + L"Exploration", // TODO.Translate }; @@ -2777,6 +2782,7 @@ STR16 pAssignMenuStrings[] = L"Fortify", // fortify sector // TODO.Translate L"Intel", // covert assignments // TODO.Translate L"Administer", // TODO.Translate + L"Explore", // TODO.Translate L"Facility", // the merc is using/staffing a facility // TODO.Translate L"Stop", // cancel this menu }; @@ -9125,6 +9131,7 @@ STR16 szBackgroundText_Value[]= L" hacking skill: %s%d ", // TODO.Translate L" %s%d%% burial speed\n", // TODO.Translate L" %s%d%% administration effectiveness\n", // TODO.Translate + L" %s%d%% exploration effectiveness\n", // TODO.Translate }; STR16 szBackgroundTitleText[] = // TODO.Translate diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index eebcb3de..74cc6993 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -2364,6 +2364,8 @@ CHAR16 Message[][STRING_LENGTH] = L"Assignment not possible at the moment", L"No militia that can be drilled present.", + + L"%s has fully explored %s.", }; // the country and its noun in the game @@ -2477,6 +2479,7 @@ STR16 pAssignmentStrings[] = L"DMilitia", L"Burial", L"Admin", + L"Explore", }; @@ -2586,6 +2589,7 @@ STR16 pPersonnelAssignmentStrings[] = L"Drill existing militia", L"Bury corpses", L"Administration", + L"Exploration", }; @@ -2654,6 +2658,7 @@ STR16 pLongAssignmentStrings[] = L"Drill existing militia", L"Bury corpses", L"Administration", + L"Exploration", }; @@ -2778,6 +2783,7 @@ STR16 pAssignMenuStrings[] = L"Fortify", // fortify sector L"Intel", // covert assignments L"Administer", + L"Explore", L"Facility", // the merc is using/staffing a facility L"Cancel", // cancel this menu }; @@ -9120,6 +9126,7 @@ STR16 szBackgroundText_Value[]= L" hacking skill: %s%d ", L" %s%d%% burial speed\n", L" %s%d%% administration effectiveness\n", + L" %s%d%% exploration effectiveness\n", }; STR16 szBackgroundTitleText[] = diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index 1d00bfe4..dd1da0a3 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -2372,6 +2372,8 @@ CHAR16 Message[][STRING_LENGTH] = L"Assignment not possible at the moment", // TODO.Translate L"No militia that can be drilled present.", + + L"%s has fully explored %s.", // TODO.Translate }; // the country and its noun in the game // TODO.Translate @@ -2485,6 +2487,7 @@ STR16 pAssignmentStrings[] = L"DMilitia", L"Burial", L"Admin", // TODO.Translate + L"Explore", // TODO.Translate }; @@ -2594,6 +2597,7 @@ STR16 pPersonnelAssignmentStrings[] = L"Drill existing militia", L"Bury corpses", L"Administration", // TODO.Translate + L"Exploration", // TODO.Translate }; @@ -2662,6 +2666,7 @@ STR16 pLongAssignmentStrings[] = L"Drill existing militia", L"Bury corpses", L"Administration", // TODO.Translate + L"Exploration", // TODO.Translate }; @@ -2786,6 +2791,7 @@ STR16 pAssignMenuStrings[] = L"Fortify", // fortify sector // TODO.Translate L"Intel", // covert assignments // TODO.Translate L"Administer", // TODO.Translate + L"Explore", // TODO.Translate L"Affectat.", // the merc is using/staffing a facility L"Annuler", // cancel this menu }; @@ -9107,6 +9113,7 @@ STR16 szBackgroundText_Value[]= L" hacking skill: %s%d ", // TODO.Translate L" %s%d%% burial speed\n", // TODO.Translate L" %s%d%% administration effectiveness\n", // TODO.Translate + L" %s%d%% exploration effectiveness\n", // TODO.Translate }; STR16 szBackgroundTitleText[] = diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 89841132..f3d180d0 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -2380,6 +2380,8 @@ CHAR16 Message[][STRING_LENGTH] = L"Assignment not possible at the moment", // TODO.Translate L"No militia that can be drilled present.", + + L"%s hat %s vollständig erkundet.", }; // the country and its noun in the game @@ -2490,6 +2492,7 @@ STR16 pAssignmentStrings[] = L"DMilitia", L"Burial", L"Admin", // TODO.Translate + L"Explore", // TODO.Translate }; STR16 pMilitiaString[] = @@ -2595,6 +2598,7 @@ STR16 pPersonnelAssignmentStrings[] = L"Drill existing militia", L"Bury corpses", L"Administration", // TODO.Translate + L"Exploration", // TODO.Translate }; // refer to above for comments @@ -2661,6 +2665,7 @@ STR16 pLongAssignmentStrings[] = L"Drill existing militia", L"Bury corpses", L"Administration", // TODO.Translate + L"Exploration", // TODO.Translate }; // the contract options @@ -2781,6 +2786,7 @@ STR16 pAssignMenuStrings[] = L"Fortify", // fortify sector // TODO.Translate L"Intel", // covert assignments // TODO.Translate L"Administer", // TODO.Translate + L"Explore", // TODO.Translate L"Betrieb", // the merc is using/staffing a facility L"Abbrechen", // cancel this menu }; @@ -8937,6 +8943,7 @@ STR16 szBackgroundText_Value[]= L" hacking skill: %s%d ", // TODO.Translate L" %s%d%% burial speed\n", // TODO.Translate L" %s%d%% administration effectiveness\n", // TODO.Translate + L" %s%d%% exploration effectiveness\n", // TODO.Translate }; STR16 szBackgroundTitleText[] = // TODO.Translate diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 0ac089b1..0114370b 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -2358,6 +2358,8 @@ CHAR16 Message[][STRING_LENGTH] = L"Assignment not possible at the moment", // TODO.Translate L"No militia that can be drilled present.", + + L"%s has fully explored %s.", // TODO.Translate }; // the country and its noun in the game @@ -2471,6 +2473,7 @@ STR16 pAssignmentStrings[] = L"DMilitia", L"Burial", L"Admin", // TODO.Translate + L"Explore", // TODO.Translate }; @@ -2580,6 +2583,7 @@ STR16 pPersonnelAssignmentStrings[] = L"Drill existing militia", L"Bury corpses", L"Administration", // TODO.Translate + L"Exploration", // TODO.Translate }; @@ -2648,6 +2652,7 @@ STR16 pLongAssignmentStrings[] = L"Drill existing militia", L"Bury corpses", L"Administration", // TODO.Translate + L"Exploration", // TODO.Translate }; @@ -2772,6 +2777,7 @@ STR16 pAssignMenuStrings[] = L"Fortify", // fortify sector // TODO.Translate L"Intel", // covert assignments // TODO.Translate L"Administer", // TODO.Translate + L"Explore", // TODO.Translate L"Facility", // the merc is using/staffing a facility // TODO.Translate L"Annulla", // cancel this menu }; @@ -9116,6 +9122,7 @@ STR16 szBackgroundText_Value[]= L" hacking skill: %s%d ", // TODO.Translate L" %s%d%% burial speed\n", // TODO.Translate L" %s%d%% administration effectiveness\n", // TODO.Translate + L" %s%d%% exploration effectiveness\n", // TODO.Translate }; STR16 szBackgroundTitleText[] = // TODO.Translate diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index 8d3c406c..c25f15db 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -2370,6 +2370,8 @@ CHAR16 Message[][STRING_LENGTH] = L"Assignment not possible at the moment", // TODO.Translate L"No militia that can be drilled present.", + + L"%s has fully explored %s.", // TODO.Translate }; // the country and its noun in the game @@ -2483,6 +2485,7 @@ STR16 pAssignmentStrings[] = L"DMilitia", L"Burial", L"Admin", // TODO.Translate + L"Explore", // TODO.Translate }; @@ -2592,6 +2595,7 @@ STR16 pPersonnelAssignmentStrings[] = L"Drill existing militia", L"Bury corpses", L"Administration", // TODO.Translate + L"Exploration", // TODO.Translate }; @@ -2660,6 +2664,7 @@ STR16 pLongAssignmentStrings[] = L"Drill existing militia", L"Bury corpses", L"Administration", // TODO.Translate + L"Exploration", // TODO.Translate }; @@ -2784,6 +2789,7 @@ STR16 pAssignMenuStrings[] = L"Fortify", // fortify sector // TODO.Translate L"Intel", // covert assignments // TODO.Translate L"Administer", // TODO.Translate + L"Explore", // TODO.Translate L"Facility", // the merc is using/staffing a facility // TODO.Translate L"Anuluj", // cancel this menu }; @@ -9129,6 +9135,7 @@ STR16 szBackgroundText_Value[]= L" hacking skill: %s%d ", // TODO.Translate L" %s%d%% burial speed\n", // TODO.Translate L" %s%d%% administration effectiveness\n", // TODO.Translate + L" %s%d%% exploration effectiveness\n", // TODO.Translate }; STR16 szBackgroundTitleText[] = // TODO.Translate diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index 437cbbf2..9ba34dd6 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -2364,6 +2364,8 @@ CHAR16 Message[][STRING_LENGTH] = L"Assignment not possible at the moment", // TODO.Translate L"No militia that can be drilled present.", + + L"%s has fully explored %s.", // TODO.Translate }; // the country and its noun in the game @@ -2477,6 +2479,7 @@ STR16 pAssignmentStrings[] = L"DMilitia", L"Burial", L"Admin", // TODO.Translate + L"Explore", // TODO.Translate }; @@ -2586,6 +2589,7 @@ STR16 pPersonnelAssignmentStrings[] = L"Drill existing militia", L"Bury corpses", L"Administration", // TODO.Translate + L"Exploration", // TODO.Translate }; @@ -2654,6 +2658,7 @@ STR16 pLongAssignmentStrings[] = L"Drill existing militia", L"Bury corpses", L"Administration", // TODO.Translate + L"Exploration", // TODO.Translate }; @@ -2778,6 +2783,7 @@ STR16 pAssignMenuStrings[] = L"Укреплять", // fortify sector L"Intel", // covert assignments // TODO.Translate L"Administer", // TODO.Translate + L"Explore", // TODO.Translate L"Занятия", // the merc is using/staffing a facility L"Отмена", // cancel this menu }; @@ -9106,6 +9112,7 @@ STR16 szBackgroundText_Value[]= L" Взлом: %s%d ", L" %s%d%% burial speed\n", // TODO.Translate L" %s%d%% administration effectiveness\n", // TODO.Translate + L" %s%d%% exploration effectiveness\n", // TODO.Translate }; STR16 szBackgroundTitleText[] =