From 3ae95a6c20fe689c2673f8d7f23f0c31eb798727 Mon Sep 17 00:00:00 2001 From: Flugente Date: Sat, 1 Mar 2014 01:48:43 +0000 Subject: [PATCH] Merged revision(s) 6997-6998 from branches/ja2_source_official_2014: - Campaign stats take spy actions and SAM sabotages into account - spy encounters are not reproted if nothing of interest happened - Fix: error in food system automatic canteen refill - Fix: if min enemy group size is too high, the AI never replensishes garrisons, thereby severely dumbing down the game. - Fix: enemy groups do not receive minimum size - Fix: enemy groups sizes are cut down needlessly git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6999 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Laptop/CampaignHistory_Summary.cpp | 28 +++++++++++++++++-- Laptop/CampaignStats.cpp | 29 +++++++++++++++++++- Laptop/CampaignStats.h | 12 ++++---- Strategic/Strategic AI.cpp | 44 +++++++++++++++++++----------- Tactical/Food.cpp | 4 +-- Tactical/Soldier Control.cpp | 9 ++++++ TileEngine/Explosion Control.cpp | 9 ++++-- Utils/Text.h | 4 +++ Utils/_ChineseText.cpp | 6 +++- Utils/_DutchText.cpp | 6 +++- Utils/_EnglishText.cpp | 6 +++- Utils/_FrenchText.cpp | 6 +++- Utils/_GermanText.cpp | 6 +++- Utils/_ItalianText.cpp | 6 +++- Utils/_PolishText.cpp | 6 +++- Utils/_RussianText.cpp | 6 +++- Utils/_TaiwaneseText.cpp | 6 +++- 17 files changed, 156 insertions(+), 37 deletions(-) diff --git a/Laptop/CampaignHistory_Summary.cpp b/Laptop/CampaignHistory_Summary.cpp index dd46a271f..4787e1a7a 100644 --- a/Laptop/CampaignHistory_Summary.cpp +++ b/Laptop/CampaignHistory_Summary.cpp @@ -698,9 +698,19 @@ void RenderCampaignHistory_MostImportant() if ( picend < usPosY ) usPosX = LAPTOP_SCREEN_UL_X; } - if ( incident.usIncidentFlags & INCIDENT_BUILDINGS_DAMAGED ) + if ( incident.usIncidentFlags & INCIDENT_SAMSITE_SABOTAGED ) { - swprintf(sText, szCampaignHistoryDetail[TEXT_CAMPAIGNHISTORY_DETAIL_BUILDINGDAMAGE], incident.usKills[CAMPAIGNHISTORY_SD_CIV], incident.usWounds[CAMPAIGNHISTORY_SD_CIV] ); + swprintf(sText, szCampaignHistoryDetail[TEXT_CAMPAIGNHISTORY_DETAIL_SAMSITESABOTAGED] ); + usPosY += DisplayWrappedString( usPosX, usPosY, LAPTOP_SCREEN_LR_X - usPosX, 2, CAMPHIS_FONT_SMALL, CAMPAIGN_HISTORY_FONT_COLOR_REGULAR,sText, FONT_MCOLOR_BLACK, FALSE, 0); + if ( picend < usPosY ) usPosX = LAPTOP_SCREEN_UL_X; + } + else if ( incident.usIncidentFlags & INCIDENT_BUILDINGS_DAMAGED ) + { + if ( incident.usKills[CAMPAIGNHISTORY_SD_CIV] + incident.usWounds[CAMPAIGNHISTORY_SD_CIV] > 0 ) + swprintf(sText, szCampaignHistoryDetail[TEXT_CAMPAIGNHISTORY_DETAIL_BUILDINGANDCIVDAMAGE], incident.usKills[CAMPAIGNHISTORY_SD_CIV], incident.usWounds[CAMPAIGNHISTORY_SD_CIV] ); + else + swprintf(sText, szCampaignHistoryDetail[TEXT_CAMPAIGNHISTORY_DETAIL_BUILDINGDAMAGE] ); + usPosY += DisplayWrappedString( usPosX, usPosY, LAPTOP_SCREEN_LR_X - usPosX, 2, CAMPHIS_FONT_SMALL, CAMPAIGN_HISTORY_FONT_COLOR_REGULAR,sText, FONT_MCOLOR_BLACK, FALSE, 0); if ( picend < usPosY ) usPosX = LAPTOP_SCREEN_UL_X; } @@ -758,6 +768,20 @@ void RenderCampaignHistory_MostImportant() if ( picend < usPosY ) usPosX = LAPTOP_SCREEN_UL_X; } + if ( incident.usIncidentFlags & INCIDENT_SPYACTION_ENEMY ) + { + swprintf(sText, szCampaignHistoryDetail[TEXT_CAMPAIGNHISTORY_DETAIL_SPY_ENEMY] ); + usPosY += DisplayWrappedString( usPosX, usPosY, LAPTOP_SCREEN_LR_X - usPosX, 2, CAMPHIS_FONT_SMALL, CAMPAIGN_HISTORY_FONT_COLOR_REGULAR,sText, FONT_MCOLOR_BLACK, FALSE, 0); + if ( picend < usPosY ) usPosX = LAPTOP_SCREEN_UL_X; + } + + if ( incident.usIncidentFlags & INCIDENT_SPYACTION_PLAYERSIDE ) + { + swprintf(sText, szCampaignHistoryDetail[TEXT_CAMPAIGNHISTORY_DETAIL_SPY_PLAYER] ); + usPosY += DisplayWrappedString( usPosX, usPosY, LAPTOP_SCREEN_LR_X - usPosX, 2, CAMPHIS_FONT_SMALL, CAMPAIGN_HISTORY_FONT_COLOR_REGULAR,sText, FONT_MCOLOR_BLACK, FALSE, 0); + if ( picend < usPosY ) usPosX = LAPTOP_SCREEN_UL_X; + } + { // team losses UINT16 rebellosses = incident.usKills[CAMPAIGNHISTORY_SD_MERC] + incident.usKills[CAMPAIGNHISTORY_SD_MILITIA_GREEN] + incident.usKills[CAMPAIGNHISTORY_SD_MILITIA_REGULAR] + incident.usKills[CAMPAIGNHISTORY_SD_MILITIA_ELITE]; diff --git a/Laptop/CampaignStats.cpp b/Laptop/CampaignStats.cpp index d7d297501..b357a0289 100644 --- a/Laptop/CampaignStats.cpp +++ b/Laptop/CampaignStats.cpp @@ -87,7 +87,8 @@ Incident_Stats::CalcInterestRating() if ( usIncidentFlags & INCIDENT_BUILDINGS_DAMAGED ) usInterestRating += 100; if ( usIncidentFlags & INCIDENT_WIN ) usInterestRating += 100; else usInterestRating += 200; - + if ( usIncidentFlags & INCIDENT_SAMSITE_SABOTAGED ) usInterestRating += 1500; + if ( usOneTimeEventFlags & INCIDENT_ONETIMEEVENT_OMERTA ) usInterestRating += 1000; if ( usOneTimeEventFlags & INCIDENT_ONETIMEEVENT_DEATH_KINGPIN ) usInterestRating += 500; if ( usOneTimeEventFlags & (INCIDENT_ONETIMEEVENT_MASSACRE_HICKS|INCIDENT_ONETIMEEVENT_MASSACRE_BLOODCATS) ) usInterestRating += 800; @@ -688,6 +689,32 @@ Campaign_Stats::AddConsumption(UINT8 aType, FLOAT aVal) // add this incident to the campaign stats and then clear it void FinishIncident(INT16 sX, INT16 sY, INT8 sZ) { + // it is possible to enter a combat without any real fighting. + // For now, lets just assume this happens with undetected spies. If nothing of interest happened, don't add this incident (it would be boring to read anyway) + if ( gCurrentIncident.usIncidentFlags & (INCIDENT_SPYACTION_ENEMY|INCIDENT_SPYACTION_PLAYERSIDE) && !(gCurrentIncident.usIncidentFlags & INCIDENT_SPYACTION_UNCOVERED) ) + { + // if noting of interest happened... + if ( !(gCurrentIncident.usIncidentFlags & INCIDENT_EVENT) && gCurrentIncident.usOneTimeEventFlags == 0 ) + { + UINT16 i = 0; + + // if nobody was harmed... + for (i = 0; i < CAMPAIGNHISTORY_SD_MAX; ++i) + { + if ( gCurrentIncident.usKills[i] || gCurrentIncident.usWounds[i] || gCurrentIncident.usPrisoners[i] ) + break; + } + + if ( i == CAMPAIGNHISTORY_SD_MAX ) + { + // totally boring. Don't add this, just clean it an exit + gCurrentIncident.clear(); + + return; + } + } + } + // due to odd coding, we do not know when an incident starts // (checking for entering combat isn't enough, as we do that multiple times per battle) // we thus set the relevant data when finishing an incident diff --git a/Laptop/CampaignStats.h b/Laptop/CampaignStats.h index b429adae4..45011eeb6 100644 --- a/Laptop/CampaignStats.h +++ b/Laptop/CampaignStats.h @@ -45,15 +45,17 @@ #define INCIDENT_WIN 0x01000000 //16777216 // player won battle (otherwise he lost) #define INCIDENT_OMERTA_LANDING 0x02000000 //33554432 // omerta landing #define INCIDENT_FIRST_LIBERATION 0x04000000 //67108864 // first time we free a sector -/*#define PLAYER_NET_4_LVL_3 0x08000000 //134217728 +#define INCIDENT_SAMSITE_SABOTAGED 0x08000000 //134217728 // SAM site controls were destroyed -#define PLAYER_NET_1_LVL_4 0x10000000 //268435456 -#define PLAYER_NET_2_LVL_4 0x20000000 //536870912 -#define WH40K_SOLDIER_ILLUSION 0x40000000 //1073741824 // Soldier is an Illusion -#define WH40K_SOLDIER_KILLTHISTURN 0x80000000 //2147483648 // Soldier is on a kill streak*/ +#define INCIDENT_SPYACTION_ENEMY 0x10000000 //268435456 // side used spies. Depending on the other actions, this report might not even show up, as nobody knows there WAS any action... +#define INCIDENT_SPYACTION_PLAYERSIDE 0x20000000 //536870912 +#define INCIDENT_SPYACTION_UNCOVERED 0x40000000 //1073741824 // a spy was uncovered +//#define WH40K_SOLDIER_KILLTHISTURN 0x80000000 //2147483648 // Soldier is on a kill streak #define INCIDENT_PLAYER_ALLDIRS (INCIDENT_ATTACKDIR_NORTH|INCIDENT_ATTACKDIR_WEST|INCIDENT_ATTACKDIR_SOUTH|INCIDENT_ATTACKDIR_EAST) #define INCIDENT_ENEMY_ALLDIRS (INCIDENT_ATTACKDIR_NORTH_ENEMY|INCIDENT_ATTACKDIR_WEST_ENEMY|INCIDENT_ATTACKDIR_SOUTH_ENEMY|INCIDENT_ATTACKDIR_EAST_ENEMY) + +#define INCIDENT_EVENT 0x0E00FF3F // any interesting event that might have happened // ---------------------------------------------------------------- // -------- added by Flugente: flags for one time events that commence an individual report -------- diff --git a/Strategic/Strategic AI.cpp b/Strategic/Strategic AI.cpp index df1c68c9a..71057eda5 100644 --- a/Strategic/Strategic AI.cpp +++ b/Strategic/Strategic AI.cpp @@ -563,7 +563,7 @@ INT32 GarrisonReinforcementsRequested( INT32 iGarrisonID, UINT8 *pubExtraReinfor //until it is finally excepted or an absolute max is made. *pubExtraReinforcements = (UINT8)(gubGarrisonReinforcementsDenied[ iGarrisonID ] / (6 - gGameOptions.ubDifficultyLevel)); //Make sure the number of extra reinforcements don't bump the force size past the max of MAX_STRATEGIC_TEAM_SIZE. - *pubExtraReinforcements = (UINT8)min( (INT32)*pubExtraReinforcements, min( (INT32)(*pubExtraReinforcements), iMaxEnemyGroupSize - iReinforcementsRequested ) ); + *pubExtraReinforcements = (UINT16)min( (INT32)*pubExtraReinforcements, min( (INT32)(*pubExtraReinforcements), iMaxEnemyGroupSize - iReinforcementsRequested ) ); iReinforcementsRequested = min( iMaxEnemyGroupSize, iReinforcementsRequested ); @@ -2088,7 +2088,7 @@ BOOLEAN ReinforcementsApproved( INT32 iGarrisonID, UINT16 *pusDefencePoints ) //Reinforcements will have to wait. For now, increase the reinforcements denied. The amount increase is 20 percent //of the garrison's priority. gubGarrisonReinforcementsDenied[ iGarrisonID ] += (UINT8)(gArmyComp[ gGarrisonGroup[ iGarrisonID ].ubComposition ].bPriority / 2); - + return FALSE; } @@ -2919,11 +2919,16 @@ void SendReinforcementsForGarrison( INT32 iDstGarrisonID, UINT16 usDefencePoints gArmyComp[ gGarrisonGroup[ iDstGarrisonID ].ubComposition ].bPriority / 50; if( iReinforcementsRequested + ubNumExtraReinforcements > iMaxReinforcementsAllowed ) - { //adjust the extra reinforcements so that it doesn't exceed the maximum allowed. + { + //adjust the extra reinforcements so that it doesn't exceed the maximum allowed. fLimitMaxTroopsAllowable = TRUE; - ubNumExtraReinforcements = (UINT8)(iMaxReinforcementsAllowed - iReinforcementsRequested); + ubNumExtraReinforcements = (UINT16)(max(0, iMaxReinforcementsAllowed - iReinforcementsRequested)); } + // Flugente: this is stupid. why would we limit the groupsize by the desired population? If that is smaller than the minimum group size, then we'll create a group smaller than that + // this would forbid us from properly moving it. Why does gGameExternalOptions.iMaxEnemyGroupSize exist if it isn't properly used? + ubNumExtraReinforcements = (UINT16)(max(0, gubMinEnemyGroupSize - iReinforcementsRequested)); + iReinforcementsRequested += ubNumExtraReinforcements; if( iReinforcementsRequested <= 0 ) @@ -3057,8 +3062,9 @@ void SendReinforcementsForGarrison( INT32 iDstGarrisonID, UINT16 usDefencePoints //Send the lowest of the two: number requested or number available iReinforcementsApproved = min( iReinforcementsRequested, iReinforcementsAvailable ); - if( iReinforcementsApproved > iMaxReinforcementsAllowed - ubNumExtraReinforcements ) - { //The force isn't strong enough, but the queen isn't willing to apply extra resources + if( iReinforcementsApproved < iMaxReinforcementsAllowed - ubNumExtraReinforcements ) + { + //The force isn't strong enough, but the queen isn't willing to apply extra resources iReinforcementsApproved = iMaxReinforcementsAllowed - ubNumExtraReinforcements; } else if( (iReinforcementsApproved + ubNumExtraReinforcements) * 3 < usDefencePoints ) @@ -3667,11 +3673,11 @@ BOOLEAN LoadStrategicAI( HWFILE hFile ) gubPatrolReinforcementsDenied = NULL; } gubPatrolReinforcementsDenied = (UINT8*)MemAlloc( giPatrolArraySize ); - FileRead( hFile, gubPatrolReinforcementsDenied, giPatrolArraySize, &uiNumBytesRead ); - if( uiNumBytesRead != (UINT32)giPatrolArraySize ) - { - return FALSE; - } + FileRead( hFile, gubPatrolReinforcementsDenied, giPatrolArraySize, &uiNumBytesRead ); + if( uiNumBytesRead != (UINT32)giPatrolArraySize ) + { + return FALSE; + } //Load the list of reinforcement garrison points. if( gubGarrisonReinforcementsDenied ) @@ -3680,11 +3686,11 @@ BOOLEAN LoadStrategicAI( HWFILE hFile ) gubGarrisonReinforcementsDenied = NULL; } gubGarrisonReinforcementsDenied = (UINT8*)MemAlloc( giGarrisonArraySize ); - FileRead( hFile, gubGarrisonReinforcementsDenied, giGarrisonArraySize, &uiNumBytesRead ); - if( uiNumBytesRead != (UINT32)giGarrisonArraySize ) - { - return FALSE; - } + FileRead( hFile, gubGarrisonReinforcementsDenied, giGarrisonArraySize, &uiNumBytesRead ); + if( uiNumBytesRead != (UINT32)giGarrisonArraySize ) + { + return FALSE; + } #ifdef JA2BETAVERSION InitStrategicMovementCosts(); @@ -5796,6 +5802,12 @@ BOOLEAN GarrisonRequestingMinimumReinforcements( INT32 iGarrisonID ) { return TRUE; } + + // Flugente: The above check is insufficient. if we increase gubMinEnemyGroupSize (to, say, make the game harder), this check will never evaluate to true. Congratulations, you've broken the AI! + // Instead, if we have nobody here, but want someone to be here, then a minimum-sized group is in order. + if( iDesired > 0 && iAvailable == 0 ) + return TRUE; + return FALSE; } diff --git a/Tactical/Food.cpp b/Tactical/Food.cpp index 7d9c6ab3a..15c63f7a3 100644 --- a/Tactical/Food.cpp +++ b/Tactical/Food.cpp @@ -1019,11 +1019,11 @@ OBJECTTYPE* GetUsableWaterDrumInSector( void ) return( NULL ); } -// soldier refills canteen while auto-consuming. Only clean sector water souces are consumed, an sector inventory is not touched (sector is likely not loaded) +// soldier refills canteen while auto-consuming. Only clean sector water souces are consumed, and sector inventory is not touched (sector is likely not loaded) void SoldierAutoFillCanteens(SOLDIERTYPE *pSoldier) { // no functionality if in combat, invalid/travelling/asleep/non-profile soldier - if ( (gTacticalStatus.uiFlags & INCOMBAT) || !pSoldier || !pSoldier->bInSector || pSoldier->flags.fMercAsleep || pSoldier->ubProfile == NO_PROFILE ) + if ( (gTacticalStatus.uiFlags & INCOMBAT) || !pSoldier || !pSoldier->bActive || pSoldier->flags.fMercAsleep || pSoldier->ubProfile == NO_PROFILE ) return; // determine if there are any patches of water in this sector. diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index 04328455c..5c0cc23da 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -15643,6 +15643,12 @@ BOOLEAN SOLDIERTYPE::RecognizeAsCombatant(UINT8 ubTargetID) } } + // campaign stats + if ( pSoldier->bTeam == ENEMY_TEAM ) + gCurrentIncident.usIncidentFlags |= INCIDENT_SPYACTION_ENEMY; + else + gCurrentIncident.usIncidentFlags |= INCIDENT_SPYACTION_PLAYERSIDE; + // do we recognize this guy as an enemy? if ( !pSoldier->SeemsLegit(this->ubID) ) { @@ -15663,6 +15669,9 @@ BOOLEAN SOLDIERTYPE::RecognizeAsCombatant(UINT8 ubTargetID) this->aiData.bOppList[pSoldier->ubID] = NOT_HEARD_OR_SEEN; ManSeesMan(this, pSoldier, pSoldier->sGridNo, pSoldier->pathing.bLevel, 0, 0); + + // campaign stats + gCurrentIncident.usIncidentFlags |= INCIDENT_SPYACTION_UNCOVERED; } return TRUE; diff --git a/TileEngine/Explosion Control.cpp b/TileEngine/Explosion Control.cpp index d7495358a..449b1aa8e 100644 --- a/TileEngine/Explosion Control.cpp +++ b/TileEngine/Explosion Control.cpp @@ -4796,10 +4796,11 @@ void UpdateAndDamageSAMIfFound( INT16 sSectorX, INT16 sSectorY, INT16 sSectorZ, // Damage..... sSectorNo = CALCULATE_STRATEGIC_INDEX( sSectorX, sSectorY ); + INT8 statusbefore = StrategicMap[ sSectorNo ].bSAMCondition; + if ( StrategicMap[ sSectorNo ].bSAMCondition >= ubDamage ) { - StrategicMap[ sSectorNo ].bSAMCondition = - StrategicMap[ sSectorNo ].bSAMCondition - ubDamage; + StrategicMap[ sSectorNo ].bSAMCondition -= ubDamage; } else { @@ -4809,6 +4810,10 @@ void UpdateAndDamageSAMIfFound( INT16 sSectorX, INT16 sSectorY, INT16 sSectorZ, // SAM site may have been put out of commission... UpdateAirspaceControl( ); + // Flugente: campaign stats: if SAM was functional before and isn't anymore, note this + if ( statusbefore >= MIN_CONDITION_FOR_SAM_SITE_TO_WORK && StrategicMap[ sSectorNo ].bSAMCondition < MIN_CONDITION_FOR_SAM_SITE_TO_WORK ) + gCurrentIncident.usIncidentFlags |= INCIDENT_SAMSITE_SABOTAGED; + // ATE: GRAPHICS UPDATE WILL GET DONE VIA NORMAL EXPLOSION CODE..... } diff --git a/Utils/Text.h b/Utils/Text.h index 91181da62..8fa9ab334 100644 --- a/Utils/Text.h +++ b/Utils/Text.h @@ -2579,6 +2579,7 @@ enum TEXT_CAMPAIGNHISTORY_DETAIL_UNKNOWNLOCATION, TEXT_CAMPAIGNHISTORY_DETAIL_BUILDINGDAMAGE, + TEXT_CAMPAIGNHISTORY_DETAIL_BUILDINGANDCIVDAMAGE, TEXT_CAMPAIGNHISTORY_DETAIL_REINFORCE_BOTH, TEXT_CAMPAIGNHISTORY_DETAIL_REINFORCE, TEXT_CAMPAIGNHISTORY_DETAIL_CHEMICAL_BOTH, @@ -2587,6 +2588,9 @@ enum TEXT_CAMPAIGNHISTORY_DETAIL_TANKS, TEXT_CAMPAIGNHISTORY_DETAIL_SNIPERS_BOTH, TEXT_CAMPAIGNHISTORY_DETAIL_SNIPERS, + TEXT_CAMPAIGNHISTORY_DETAIL_SAMSITESABOTAGED, + TEXT_CAMPAIGNHISTORY_DETAIL_SPY_ENEMY, + TEXT_CAMPAIGNHISTORY_DETAIL_SPY_PLAYER, TEXT_CAMPAIGNHISTORY_DETAIL_MAX, }; diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index bdf5dc6e9..691174d14 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -8333,7 +8333,8 @@ STR16 szCampaignHistoryDetail[]= L"和", L"an unknown location", // TODO.Translate - L"该分区的建筑受损。%d名市民被杀,%d名市民受伤。", + L"Buildings in the sector were damaged.", // TODO.Translate + L"In the fighting, buildings in the sector were damaged, and %d civilians were killed and %d wounded.", L"在战斗中,%s和%s呼叫了支援。", L"在战斗中,%s呼叫了支援。", L"目击者报道交战双方都使用了化学武器。", @@ -8342,6 +8343,9 @@ STR16 szCampaignHistoryDetail[]= L"%s部署了%d辆坦克,%d辆坦克在激烈的交火中被摧毁。", L"据称双方都部署了狙击手。", L"未经证实的消息称有%s名狙击手参与了交火。" + L"This sector is of huge strategic importance, as it houses one of the handful of anti-air missile batteries the arulcan army posesses. Aerial photographs show extensive damage to the command center. This will leave the airspace above Arulco undefended for the time being.", + L"The situation on the ground has gotten even more confusing, as it seems rebel infighting has reached a new level. We now have confirmation that rebel militia engaed in active combat with foreign mercenaries.", + L"The royalists position seems more precarious than previously thought. Reports of a split surfaced, with amry personnel opening fire on each other.", }; STR16 szCampaignHistoryTimeString[]= diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index f5f326a1a..c2ba5d47d 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -8347,7 +8347,8 @@ STR16 szCampaignHistoryDetail[]= L"and", L"an unknown location", // TODO.Translate - L"Buildings in the sector were damaged. %d civilians were killed and %d wounded.", + L"Buildings in the sector were damaged.", // TODO.Translate + L"In the fighting, buildings in the sector were damaged, and %d civilians were killed and %d wounded.", L"During the attack, %s and %s called reinforcements.", L"During the attack, %s called reinforcements.", L"Eyewitnesses report the use of chemical weapons from both sides.", @@ -8356,6 +8357,9 @@ STR16 szCampaignHistoryDetail[]= L"%d tanks were used by %s, %d of them were destroyed in the fierce fighting.", L"Both sides are said to have used snipers.", L"Unverified reports indicate %s snipers were involved in the firefight." + L"This sector is of huge strategic importance, as it houses one of the handful of anti-air missile batteries the arulcan army posesses. Aerial photographs show extensive damage to the command center. This will leave the airspace above Arulco undefended for the time being.", + L"The situation on the ground has gotten even more confusing, as it seems rebel infighting has reached a new level. We now have confirmation that rebel militia engaed in active combat with foreign mercenaries.", + L"The royalists position seems more precarious than previously thought. Reports of a split surfaced, with amry personnel opening fire on each other.", }; STR16 szCampaignHistoryTimeString[]= diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index 926e210b3..bd5714d3b 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -8331,7 +8331,8 @@ STR16 szCampaignHistoryDetail[]= L"and", L"an unknown location", - L"Buildings in the sector were damaged. %d civilians were killed and %d wounded.", + L"Buildings in the sector were damaged.", + L"In the fighting, buildings in the sector were damaged, and %d civilians were killed and %d wounded.", L"During the attack, %s and %s called reinforcements.", L"During the attack, %s called reinforcements.", L"Eyewitnesses report the use of chemical weapons from both sides.", @@ -8340,6 +8341,9 @@ STR16 szCampaignHistoryDetail[]= L"%d tanks were used by %s, %d of them were destroyed in the fierce fighting.", L"Both sides are said to have used snipers.", L"Unverified reports indicate %s snipers were involved in the firefight.", + L"This sector is of huge strategic importance, as it houses one of the handful of anti-air missile batteries the arulcan army posesses. Aerial photographs show extensive damage to the command center. This will leave the airspace above Arulco undefended for the time being.", + L"The situation on the ground has gotten even more confusing, as it seems rebel infighting has reached a new level. We now have confirmation that rebel militia engaed in active combat with foreign mercenaries.", + L"The royalists position seems more precarious than previously thought. Reports of a split surfaced, with amry personnel opening fire on each other.", }; STR16 szCampaignHistoryTimeString[]= diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index 1a6e18636..06d837310 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -8330,7 +8330,8 @@ STR16 szCampaignHistoryDetail[]= L"et", L"an unknown location", // TODO.Translate - L"Des bâtiments ont été endommagés. Il y a eu %d civils tués et %d blessés.", + L"Des bâtiments ont été endommagés.", + L"In the fighting, buildings in the sector were damaged, and %d civilians were killed and %d wounded.", // TODO.Translate L"Pendant l'attaque, %s et %s ont appelé des renforts.", L"Pendant l'attaque, %s a appelé des renforts.", L"Les témoins rapportent l'utilisation d'armes chimiques par les deux camps.", @@ -8339,6 +8340,9 @@ STR16 szCampaignHistoryDetail[]= L"Il y avait %d chars pour renforcer %s. %d d'entre eux ont été détruits dans des combats acharnés.", L"Les deux camps avaient des tireurs d'élite.", L"Des sources non vérifiées indiquent que %s tireurs d'élite ont été impliqués dans le combat." + L"This sector is of huge strategic importance, as it houses one of the handful of anti-air missile batteries the arulcan army posesses. Aerial photographs show extensive damage to the command center. This will leave the airspace above Arulco undefended for the time being.", + L"The situation on the ground has gotten even more confusing, as it seems rebel infighting has reached a new level. We now have confirmation that rebel militia engaed in active combat with foreign mercenaries.", + L"The royalists position seems more precarious than previously thought. Reports of a split surfaced, with amry personnel opening fire on each other.", }; STR16 szCampaignHistoryTimeString[]= diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index d8c6e0edf..851a08684 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -8157,7 +8157,8 @@ STR16 szCampaignHistoryDetail[]= L"and", L"an unknown location", // TODO.Translate - L"Buildings in the sector were damaged. %d civilians were killed and %d wounded.", + L"Buildings in the sector were damaged.", // TODO.Translate + L"In the fighting, buildings in the sector were damaged, and %d civilians were killed and %d wounded.", L"During the attack, %s and %s called reinforcements.", L"During the attack, %s called reinforcements.", L"Eyewitnesses report the use of chemical weapons from both sides.", @@ -8166,6 +8167,9 @@ STR16 szCampaignHistoryDetail[]= L"%d tanks were used by %s, %d of them were destroyed in the fierce fighting.", L"Both sides are said to have used snipers.", L"Unverified reports indicate %s snipers were involved in the firefight." + L"This sector is of huge strategic importance, as it houses one of the handful of anti-air missile batteries the arulcan army posesses. Aerial photographs show extensive damage to the command center. This will leave the airspace above Arulco undefended for the time being.", + L"The situation on the ground has gotten even more confusing, as it seems rebel infighting has reached a new level. We now have confirmation that rebel militia engaed in active combat with foreign mercenaries.", + L"The royalists position seems more precarious than previously thought. Reports of a split surfaced, with amry personnel opening fire on each other.", }; STR16 szCampaignHistoryTimeString[]= diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 3873f97eb..6a6554150 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -8339,7 +8339,8 @@ STR16 szCampaignHistoryDetail[]= L"and", L"an unknown location", // TODO.Translate - L"Buildings in the sector were damaged. %d civilians were killed and %d wounded.", + L"Buildings in the sector were damaged.", // TODO.Translate + L"In the fighting, buildings in the sector were damaged, and %d civilians were killed and %d wounded.", L"During the attack, %s and %s called reinforcements.", L"During the attack, %s called reinforcements.", L"Eyewitnesses report the use of chemical weapons from both sides.", @@ -8348,6 +8349,9 @@ STR16 szCampaignHistoryDetail[]= L"%d tanks were used by %s, %d of them were destroyed in the fierce fighting.", L"Both sides are said to have used snipers.", L"Unverified reports indicate %s snipers were involved in the firefight." + L"This sector is of huge strategic importance, as it houses one of the handful of anti-air missile batteries the arulcan army posesses. Aerial photographs show extensive damage to the command center. This will leave the airspace above Arulco undefended for the time being.", + L"The situation on the ground has gotten even more confusing, as it seems rebel infighting has reached a new level. We now have confirmation that rebel militia engaed in active combat with foreign mercenaries.", + L"The royalists position seems more precarious than previously thought. Reports of a split surfaced, with amry personnel opening fire on each other.", }; STR16 szCampaignHistoryTimeString[]= diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index 21733def9..48533cd5a 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -8357,7 +8357,8 @@ STR16 szCampaignHistoryDetail[]= L"and", L"an unknown location", // TODO.Translate - L"Buildings in the sector were damaged. %d civilians were killed and %d wounded.", + L"Buildings in the sector were damaged.", // TODO.Translate + L"In the fighting, buildings in the sector were damaged, and %d civilians were killed and %d wounded.", L"During the attack, %s and %s called reinforcements.", L"During the attack, %s called reinforcements.", L"Eyewitnesses report the use of chemical weapons from both sides.", @@ -8366,6 +8367,9 @@ STR16 szCampaignHistoryDetail[]= L"%d tanks were used by %s, %d of them were destroyed in the fierce fighting.", L"Both sides are said to have used snipers.", L"Unverified reports indicate %s snipers were involved in the firefight." + L"This sector is of huge strategic importance, as it houses one of the handful of anti-air missile batteries the arulcan army posesses. Aerial photographs show extensive damage to the command center. This will leave the airspace above Arulco undefended for the time being.", + L"The situation on the ground has gotten even more confusing, as it seems rebel infighting has reached a new level. We now have confirmation that rebel militia engaed in active combat with foreign mercenaries.", + L"The royalists position seems more precarious than previously thought. Reports of a split surfaced, with amry personnel opening fire on each other.", }; STR16 szCampaignHistoryTimeString[]= diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index 15174bd17..100789f68 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -8335,7 +8335,8 @@ STR16 szCampaignHistoryDetail[]= L"and", L"an unknown location", // TODO.Translate - L"Buildings in the sector were damaged. %d civilians were killed and %d wounded.", + L"Buildings in the sector were damaged.", // TODO.Translate + L"In the fighting, buildings in the sector were damaged, and %d civilians were killed and %d wounded.", L"During the attack, %s and %s called reinforcements.", L"During the attack, %s called reinforcements.", L"Eyewitnesses report the use of chemical weapons from both sides.", @@ -8344,6 +8345,9 @@ STR16 szCampaignHistoryDetail[]= L"%d tanks were used by %s, %d of them were destroyed in the fierce fighting.", L"Both sides are said to have used snipers.", L"Unverified reports indicate %s snipers were involved in the firefight." + L"This sector is of huge strategic importance, as it houses one of the handful of anti-air missile batteries the arulcan army posesses. Aerial photographs show extensive damage to the command center. This will leave the airspace above Arulco undefended for the time being.", + L"The situation on the ground has gotten even more confusing, as it seems rebel infighting has reached a new level. We now have confirmation that rebel militia engaed in active combat with foreign mercenaries.", + L"The royalists position seems more precarious than previously thought. Reports of a split surfaced, with amry personnel opening fire on each other.", }; STR16 szCampaignHistoryTimeString[]= diff --git a/Utils/_TaiwaneseText.cpp b/Utils/_TaiwaneseText.cpp index 84deba885..bc7dd75e6 100644 --- a/Utils/_TaiwaneseText.cpp +++ b/Utils/_TaiwaneseText.cpp @@ -8347,7 +8347,8 @@ STR16 szCampaignHistoryDetail[]= L"and", L"an unknown location", // TODO.Translate - L"Buildings in the sector were damaged. %d civilians were killed and %d wounded.", + L"Buildings in the sector were damaged.", // TODO.Translate + L"In the fighting, buildings in the sector were damaged, and %d civilians were killed and %d wounded.", L"During the attack, %s and %s called reinforcements.", L"During the attack, %s called reinforcements.", L"Eyewitnesses report the use of chemical weapons from both sides.", @@ -8356,6 +8357,9 @@ STR16 szCampaignHistoryDetail[]= L"%d tanks were used by %s, %d of them were destroyed in the fierce fighting.", L"Both sides are said to have used snipers.", L"Unverified reports indicate %s snipers were involved in the firefight." + L"This sector is of huge strategic importance, as it houses one of the handful of anti-air missile batteries the arulcan army posesses. Aerial photographs show extensive damage to the command center. This will leave the airspace above Arulco undefended for the time being.", + L"The situation on the ground has gotten even more confusing, as it seems rebel infighting has reached a new level. We now have confirmation that rebel militia engaed in active combat with foreign mercenaries.", + L"The royalists position seems more precarious than previously thought. Reports of a split surfaced, with amry personnel opening fire on each other.", }; STR16 szCampaignHistoryTimeString[]=