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
This commit is contained in:
Flugente
2014-03-01 01:48:43 +00:00
parent 618b1c1f8a
commit 3ae95a6c20
17 changed files with 156 additions and 37 deletions
+26 -2
View File
@@ -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];
+28 -1
View File
@@ -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
+7 -5
View File
@@ -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 --------
+28 -16
View File
@@ -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;
}
+2 -2
View File
@@ -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.
+9
View File
@@ -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;
+7 -2
View File
@@ -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.....
}
+4
View File
@@ -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,
};
+5 -1
View File
@@ -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[]=
+5 -1
View File
@@ -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[]=
+5 -1
View File
@@ -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[]=
+5 -1
View File
@@ -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[]=
+5 -1
View File
@@ -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[]=
+5 -1
View File
@@ -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[]=
+5 -1
View File
@@ -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[]=
+5 -1
View File
@@ -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[]=
+5 -1
View File
@@ -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[]=