- New prisoner class: Civilians can be interrogated. Does not work for profile-based charcters.

- Capturing civilians is possible if their faction has <fCanBeCaptured> set to 1.

Requires GameDir >= r2215.

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7762 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2015-02-28 22:35:30 +00:00
parent 4b70b1e400
commit 9d8e5a4c3a
22 changed files with 321 additions and 99 deletions
+2 -2
View File
@@ -1830,7 +1830,7 @@ void LoadGameExternalOptions()
gGameExternalOptions.ubPrisonerInterrogationPoints[PRISONER_ELITE] = iniReader.ReadInteger("Strategic Gameplay Settings","PRISONER_INTERROGATION_POINTS_ELITE", 80, gGameExternalOptions.ubPrisonerInterrogationPoints[PRISONER_REGULAR], 1000);
gGameExternalOptions.ubPrisonerInterrogationPoints[PRISONER_OFFICER] = iniReader.ReadInteger("Strategic Gameplay Settings","PRISONER_INTERROGATION_POINTS_OFFICER", 150, gGameExternalOptions.ubPrisonerInterrogationPoints[PRISONER_ELITE], 1000 );
gGameExternalOptions.ubPrisonerInterrogationPoints[PRISONER_GENERAL] = iniReader.ReadInteger("Strategic Gameplay Settings","PRISONER_INTERROGATION_POINTS_GENERAL", 250, gGameExternalOptions.ubPrisonerInterrogationPoints[PRISONER_OFFICER], 1000 );
gGameExternalOptions.ubPrisonerInterrogationPoints[PRISONER_THUG] = 100;
gGameExternalOptions.ubPrisonerInterrogationPoints[PRISONER_CIVILIAN] = iniReader.ReadInteger("Strategic Gameplay Settings", "PRISONER_INTERROGATION_POINTS_CIVILIAN", 25, 10, 1000 );
gGameExternalOptions.ubPrisonerInterrogationPoints[PRISONER_SECRET1] = 100;
gGameExternalOptions.ubPrisonerInterrogationPoints[PRISONER_SECRET2] = 100;
@@ -1839,7 +1839,7 @@ void LoadGameExternalOptions()
gGameExternalOptions.ubPrisonerInterrogationEnemyGeneralInfoChance[PRISONER_ELITE] = iniReader.ReadInteger( "Strategic Gameplay Settings", "PRISONER_INTERROGATION_ENEMY_GENERAL_CHANCE_ELITE", 10, gGameExternalOptions.ubPrisonerInterrogationEnemyGeneralInfoChance[PRISONER_REGULAR], 100 );
gGameExternalOptions.ubPrisonerInterrogationEnemyGeneralInfoChance[PRISONER_OFFICER] = iniReader.ReadInteger( "Strategic Gameplay Settings", "PRISONER_INTERROGATION_ENEMY_GENERAL_CHANCE_OFFICER", 60, gGameExternalOptions.ubPrisonerInterrogationEnemyGeneralInfoChance[PRISONER_ELITE], 100 );
gGameExternalOptions.ubPrisonerInterrogationEnemyGeneralInfoChance[PRISONER_GENERAL] = iniReader.ReadInteger( "Strategic Gameplay Settings", "PRISONER_INTERROGATION_ENEMY_GENERAL_CHANCE_GENERAL", 80, gGameExternalOptions.ubPrisonerInterrogationEnemyGeneralInfoChance[PRISONER_OFFICER], 100 );
gGameExternalOptions.ubPrisonerInterrogationEnemyGeneralInfoChance[PRISONER_THUG] = 0;
gGameExternalOptions.ubPrisonerInterrogationEnemyGeneralInfoChance[PRISONER_CIVILIAN] = iniReader.ReadInteger( "Strategic Gameplay Settings", "PRISONER_INTERROGATION_ENEMY_GENERAL_CHANCE_CIVILIAN", 0, 0, 100 );
gGameExternalOptions.ubPrisonerInterrogationEnemyGeneralInfoChance[PRISONER_SECRET1] = 0;
gGameExternalOptions.ubPrisonerInterrogationEnemyGeneralInfoChance[PRISONER_SECRET2] = 0;
+61 -37
View File
@@ -6764,6 +6764,11 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
++numinterrogators[PRISONER_GENERAL];
interrogationpoints[PRISONER_GENERAL] += points;
}
else if ( pSoldier->usSoldierFlagMask2 & SOLDIER_INTERROGATE_CIVILIAN )
{
++numinterrogators[PRISONER_CIVILIAN];
interrogationpoints[PRISONER_CIVILIAN] += points;
}
// admin is default
else
{
@@ -6846,16 +6851,18 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
return;
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_PROCESSED],
interrogatedprisoners[PRISONER_OFFICER], interrogatedprisoners[PRISONER_ELITE], interrogatedprisoners[PRISONER_REGULAR], interrogatedprisoners[PRISONER_ADMIN] );
interrogatedprisoners[PRISONER_OFFICER], interrogatedprisoners[PRISONER_ELITE], interrogatedprisoners[PRISONER_REGULAR],
interrogatedprisoners[PRISONER_ADMIN], interrogatedprisoners[PRISONER_GENERAL], interrogatedprisoners[PRISONER_CIVILIAN] );
UINT16 turnedmilitia[PRISONER_MAX] = { 0 };
UINT16 volunteers = 0;
UINT32 revealedpositions = 0;
UINT32 ransomscollected = 0;
UINT32 ransommoney = 0;
for ( UINT32 i = 0; i < prisonersinterrogated; ++i )
{
// what kind of a prisoner is this?
UINT8 prisonertype = PRISONER_THUG;
UINT8 prisonertype = PRISONER_CIVILIAN;
if ( i < interrogatedprisoners[PRISONER_ADMIN] )
prisonertype = PRISONER_ADMIN;
else if ( i < interrogatedprisoners[PRISONER_ADMIN] + interrogatedprisoners[PRISONER_REGULAR] )
@@ -6877,8 +6884,9 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
if ( prisonertype == PRISONER_GENERAL )
chances[PRISONER_INTERROGATION_DEFECT] = 0;
if ( prisonertype == PRISONER_THUG )
chances[PRISONER_INTERROGATION_DEFECT] = 0;
// civilians know nothing about army movement
if ( prisonertype == PRISONER_CIVILIAN )
chances[PRISONER_INTERROGATION_INFO] = 0;
// for normalisation, get sum of chances
UINT16 sumchance = 0;
@@ -6903,14 +6911,21 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
if ( result < chances[PRISONER_INTERROGATION_DEFECT] )
{
// troops are converted to militia, but there is a chance that they will be demoted in the process
if ( prisonertype >= PRISONER_OFFICER && Chance( 80 ) )
// civilians need to receive basic training - these are volunteers
if ( prisonertype == PRISONER_CIVILIAN )
++volunteers;
else if ( prisonertype >= PRISONER_OFFICER && Chance( 80 ) )
++turnedmilitia[PRISONER_OFFICER];
else if ( prisonertype >= PRISONER_ELITE && Chance( 80 ) )
++turnedmilitia[PRISONER_ELITE];
else if ( prisonertype >= PRISONER_REGULAR && Chance( 80 ) )
++turnedmilitia[PRISONER_REGULAR];
else
else if ( prisonertype >= PRISONER_ADMIN && Chance( 80 ) )
++turnedmilitia[PRISONER_ADMIN];
else
// some might even fail to qualify as admins, these are volunteers - we have to 'retrain' them
++volunteers;
// we continue so that this guy cannot also run back to the queen
continue;
@@ -6918,30 +6933,8 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
// chance that prisoner will give us random info about enemy positions
else if ( result < chances[PRISONER_INTERROGATION_DEFECT] + chances[PRISONER_INTERROGATION_INFO] )
{
// if this guy is an elite or a special prisoner, there is a chance he might tell us about high-value targets!
BOOLEAN fGetInfoOnHiddenVIPs = FALSE;
if ( prisonertype == PRISONER_ADMIN )
{
if ( Chance( gGameExternalOptions.ubPrisonerInterrogationEnemyGeneralInfoChance[PRISONER_ADMIN] ) )
fGetInfoOnHiddenVIPs = TRUE;
}
else if ( prisonertype == PRISONER_REGULAR )
{
if ( Chance( gGameExternalOptions.ubPrisonerInterrogationEnemyGeneralInfoChance[PRISONER_REGULAR] ) )
fGetInfoOnHiddenVIPs = TRUE;
}
else if ( prisonertype == PRISONER_ELITE )
{
if ( Chance( gGameExternalOptions.ubPrisonerInterrogationEnemyGeneralInfoChance[PRISONER_ELITE] ) )
fGetInfoOnHiddenVIPs = TRUE;
}
else if ( prisonertype == PRISONER_OFFICER )
{
if ( Chance( gGameExternalOptions.ubPrisonerInterrogationEnemyGeneralInfoChance[PRISONER_OFFICER] ) )
fGetInfoOnHiddenVIPs = TRUE;
}
if ( fGetInfoOnHiddenVIPs )
// there is a chance this guy might tell us about high-value targets!
if ( Chance( gGameExternalOptions.ubPrisonerInterrogationEnemyGeneralInfoChance[prisonertype] ) )
{
UINT16 unknownvipector = 0;
if ( GetRandomUnknownVIPSector( unknownvipector ) )
@@ -7006,8 +6999,8 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
ransom *= 3;
else if ( prisonertype == PRISONER_GENERAL )
ransom *= 10;
else if ( prisonertype == PRISONER_THUG )
ransom *= 0.7f;
else if ( prisonertype == PRISONER_CIVILIAN )
ransom *= 0.5f;
ransommoney += ransom;
@@ -7021,7 +7014,11 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
// there is a chance that escaped prisoners may return to the queen...
if ( Random( 100 ) < gGameExternalOptions.ubPrisonerReturntoQueenChance )
++giReinforcementPool;
{
// but not for civilians
if ( prisonertype != PRISONER_CIVILIAN )
++giReinforcementPool;
}
}
if ( turnedmilitia[PRISONER_ADMIN] + turnedmilitia[PRISONER_REGULAR] + turnedmilitia[PRISONER_ELITE] + turnedmilitia[PRISONER_OFFICER] )
@@ -7034,6 +7031,15 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_TURN_MILITIA], turnedmilitia[PRISONER_OFFICER], turnedmilitia[PRISONER_ELITE], turnedmilitia[PRISONER_REGULAR], turnedmilitia[PRISONER_ADMIN] );
}
if ( volunteers )
{
AddVolunteers( volunteers );
// we add the volunteers anyway, but only show the message if this feature is on
if ( gGameExternalOptions.fMilitiaVolunteerPool )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_TURN_VOLUNTEER], volunteers );
}
if ( revealedpositions )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_DETECTION], revealedpositions );
@@ -7046,7 +7052,12 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
// give experience rewards to the interrogators
// exp gained depends on prisoner type
FLOAT totalexp = (FLOAT)(4 * interrogatedprisoners[PRISONER_ADMIN] + 5 * interrogatedprisoners[PRISONER_REGULAR] + 7 * interrogatedprisoners[PRISONER_ELITE] + 10 * interrogatedprisoners[PRISONER_OFFICER]);
FLOAT totalexp = (FLOAT)(4 * interrogatedprisoners[PRISONER_ADMIN]
+ 5 * interrogatedprisoners[PRISONER_REGULAR]
+ 7 * interrogatedprisoners[PRISONER_ELITE]
+ 10 * interrogatedprisoners[PRISONER_OFFICER]
+ 30 * interrogatedprisoners[PRISONER_GENERAL]
+ 3 * interrogatedprisoners[PRISONER_CIVILIAN]);
FLOAT expratio = totalexp / sum_points;
// award experience
@@ -7165,7 +7176,7 @@ void HandlePrison( INT16 sMapX, INT16 sMapY, INT8 bZ )
fBeginRiot = TRUE;
// we now have to determine the combined strength of the prisoners
UINT32 prisonerriotvalue = 100 * aPrisoners[PRISONER_THUG]
UINT32 prisonerriotvalue = 60 * aPrisoners[PRISONER_CIVILIAN]
+ 200 * aPrisoners[PRISONER_GENERAL]
+ 200 * aPrisoners[PRISONER_OFFICER]
+ 125 * aPrisoners[PRISONER_ELITE]
@@ -7189,8 +7200,8 @@ void HandlePrison( INT16 sMapX, INT16 sMapY, INT8 bZ )
for (int i = PRISONER_ADMIN; i < PRISONER_MAX; ++i )
escapedprisoners[i] = min( Random( aPrisoners[i] * prisonertoguardratio ), aPrisoners[i] );
// add enemies
pSectorInfo->ubNumTroops = min( 512, pSectorInfo->ubNumTroops + escapedprisoners[PRISONER_REGULAR] + escapedprisoners[PRISONER_THUG] );
// add enemies (PRISONER_CIVILIAN just flee)
pSectorInfo->ubNumTroops = min( 512, pSectorInfo->ubNumTroops + escapedprisoners[PRISONER_REGULAR] );
pSectorInfo->ubNumElites = min( 512, pSectorInfo->ubNumElites + escapedprisoners[PRISONER_ELITE] + escapedprisoners[PRISONER_OFFICER] + escapedprisoners[PRISONER_GENERAL] );
pSectorInfo->ubNumAdmins = min( 512, pSectorInfo->ubNumAdmins + escapedprisoners[PRISONER_ADMIN] );
@@ -12066,6 +12077,14 @@ void PrisonerMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason )
fShowAssignmentMenu = FALSE;
giAssignHighLine = -1;
}
else if ( iValue == PRISONER_MENU_CIVILIAN )
{
pSoldier->usSoldierFlagMask2 &= ~SOLDIER_INTERROGATE_ALL;
pSoldier->usSoldierFlagMask2 |= SOLDIER_INTERROGATE_CIVILIAN;
fShowPrisonerMenu = FALSE;
fShowAssignmentMenu = FALSE;
giAssignHighLine = -1;
}
// rerender tactical stuff
gfRenderPBInterface = TRUE;
@@ -15959,6 +15978,7 @@ void HandleShadingOfLinesForPrisonerMenu( void )
UnShadeStringInBox( ghPrisonerBox, PRISONER_MENU_ELITE );
UnShadeStringInBox( ghPrisonerBox, PRISONER_MENU_OFFICER );
UnShadeStringInBox( ghPrisonerBox, PRISONER_MENU_GENERAL );
UnShadeStringInBox( ghPrisonerBox, PRISONER_MENU_CIVILIAN );
if ( pSoldier->usSoldierFlagMask2 & SOLDIER_INTERROGATE_ADMIN )
{
@@ -15980,6 +16000,10 @@ void HandleShadingOfLinesForPrisonerMenu( void )
{
ShadeStringInBox( ghPrisonerBox, PRISONER_MENU_GENERAL );
}
else if ( pSoldier->usSoldierFlagMask2 & SOLDIER_INTERROGATE_CIVILIAN )
{
ShadeStringInBox( ghPrisonerBox, PRISONER_MENU_CIVILIAN );
}
}
void HandleShadingOfLinesForSnitchSectorMenu( void )
+1 -1
View File
@@ -432,7 +432,7 @@ typedef enum
PRISONER_OFFICER,
PRISONER_GENERAL, // generals can be captured too, interogating them gives special rewards
PRISONER_THUG, // captured enemies not affiliated to the army fall into this category
PRISONER_CIVILIAN, // captured civilians (Kingpin, Hicks...)
PRISONER_SECRET1, // tbA
PRISONER_SECRET2, // tbA
PRISONER_MAX,
@@ -458,8 +458,19 @@ void AddTextToTownBox( void )
// prisoners
swprintf( wString, L"%s:", pwTownInfoStrings[ 13 ] );
AddMonoString( &hStringHandle, wString );
swprintf( wString, pwTownInfoStrings[ 14 ], numprisoners, capacity, aPrisoners[PRISONER_ADMIN], aPrisoners[PRISONER_REGULAR], aPrisoners[PRISONER_ELITE], aPrisoners[PRISONER_OFFICER], aPrisoners[PRISONER_GENERAL] );
swprintf( wString, pwTownInfoStrings[14], numprisoners, capacity );
AddSecondColumnMonoString( &hStringHandle, wString );
for ( int i = 0; i < PRISONER_MAX; ++i )
{
if ( aPrisoners[i] )
{
swprintf( wString, L"" );
AddMonoString( &hStringHandle, wString );
swprintf( wString, pwTownInfoStrings[15 + i], aPrisoners[i] );
AddSecondColumnMonoString( &hStringHandle, wString );
}
}
}
}
+1
View File
@@ -166,6 +166,7 @@ enum {
PRISONER_MENU_ELITE,
PRISONER_MENU_OFFICER,
PRISONER_MENU_GENERAL,
PRISONER_MENU_CIVILIAN,
PRISONER_MENU_CANCEL,
MAX_PRISONER_MENU_STRING_COUNT,
};
+2 -2
View File
@@ -5367,11 +5367,11 @@ BOOLEAN LoadStrategicInfoFromSavedFile( HWFILE hFile )
if ( guiCurrentSaveGameVersion < PRISONER_EXPANSION )
{
SectorInfo[sectorID].uiNumberOfPrisonersOfWar[PRISONER_GENERAL] = 0;
SectorInfo[sectorID].uiNumberOfPrisonersOfWar[PRISONER_THUG] = 0;
SectorInfo[sectorID].uiNumberOfPrisonersOfWar[PRISONER_CIVILIAN] = 0;
SectorInfo[sectorID].uiNumberOfPrisonersOfWar[PRISONER_SECRET1] = 0;
SectorInfo[sectorID].uiNumberOfPrisonersOfWar[PRISONER_SECRET2] = 0;
SectorInfo[sectorID].ubNumTanks = SectorInfo[sectorID].uiInterrogationHundredsLeft[PRISONER_GENERAL];
SectorInfo[sectorID].ubTanksInBattle = SectorInfo[sectorID].uiInterrogationHundredsLeft[PRISONER_THUG];
SectorInfo[sectorID].ubTanksInBattle = SectorInfo[sectorID].uiInterrogationHundredsLeft[PRISONER_CIVILIAN];
}
}
// uiSize = sizeof( SECTORINFO ) * 256;
+1 -1
View File
@@ -1248,7 +1248,7 @@ INT32 HandleItem( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel, UINT16 usHa
}
// Flugente: handcuffing people
if ( gGameExternalOptions.fAllowPrisonerSystem && HasItemFlag( usHandItem, HANDCUFFS ) && pTargetSoldier && pTargetSoldier->CanBeHandcuffed( ) )
if ( gGameExternalOptions.fAllowPrisonerSystem && HasItemFlag( usHandItem, HANDCUFFS ) && pTargetSoldier && pTargetSoldier->CanBeCaptured( ) )
{
// ATE: AI CANNOT GO THROUGH HERE!
INT32 usMapPos;
+1
View File
@@ -82,6 +82,7 @@ typedef struct
BOOLEAN Enabled; //add
BOOLEAN Loyalty;
BOOLEAN AddToBattle;
BOOLEAN fCanBeCaptured; // Flugente: if TRUE, members of this faction can be captured
CHAR16 szCurGroup[MAX_ENEMY_NAMES_CHARS];
} CIV_NAMES_VALUES;
+57 -10
View File
@@ -6789,7 +6789,7 @@ void RemoveCapturedEnemiesFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ )
for ( pTeamSoldier = Menptr, cnt = 0; cnt < TOTAL_SOLDIERS; ++pTeamSoldier, ++cnt )
{
// Kill those not already dead.,...
if ( pTeamSoldier->bActive && pTeamSoldier->bInSector && pTeamSoldier->bTeam == ENEMY_TEAM )
if ( pTeamSoldier->bActive && pTeamSoldier->bInSector )
{
// Only pows that are not dead yet
if ( (pTeamSoldier->usSoldierFlagMask & SOLDIER_POW) && !(pTeamSoldier->flags.uiStatusFlags & SOLDIER_DEAD) )
@@ -6802,7 +6802,7 @@ void RemoveCapturedEnemiesFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ )
++sNumPrisoner[PRISONER_GENERAL];
else if ( pTeamSoldier->usSoldierFlagMask & SOLDIER_ENEMY_OFFICER )
++sNumPrisoner[PRISONER_OFFICER];
else
else if ( pTeamSoldier->bTeam == ENEMY_TEAM )
{
switch ( pTeamSoldier->ubSoldierClass )
{
@@ -6815,6 +6815,10 @@ void RemoveCapturedEnemiesFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ )
break;
}
}
else //if ( pTeamSoldier->bTeam == CIV_TEAM )
{
++sNumPrisoner[PRISONER_CIVILIAN];
}
// Flugente: VIPs
if ( pTeamSoldier->usSoldierFlagMask & SOLDIER_VIP )
@@ -10427,6 +10431,12 @@ void PrisonerSurrenderMessageBoxCallBack( UINT8 ubExitValue )
// if the merc asking for surrender is experienced in capitulation negotiations, we get a bonus to our strength
if ( pSoldier )
playersidestrength = (playersidestrength * (100 + pSoldier->GetBackgroundValue(BG_PERC_CAPITULATION))) / 100;
// Capturing profile-based NPCs would be desirable, but is a good way to break quests. Due to this, we don't allow capturing them.
// As it would be odd if the entire enemy team surrenders apart from one guy, we don't allow surrender, no matter the surrender strength, if a hostile profile-based NPC is around.
// We also don't allow surrender if the enemy has a tank.
// We justify this storywise by these soldiers being very determined leaders who don't allow surrender categorically.
BOOLEAN fNoSurrender = FALSE;
// enemy team
firstid = gTacticalStatus.Team[ ENEMY_TEAM ].bFirstID;
@@ -10436,6 +10446,9 @@ void PrisonerSurrenderMessageBoxCallBack( UINT8 ubExitValue )
if( pSoldier->bActive && ( pSoldier->sSectorX == gWorldSectorX ) && ( pSoldier->sSectorY == gWorldSectorY ) && ( pSoldier->bSectorZ == gbWorldSectorZ) )
{
enemysidestrength += pSoldier->GetSurrenderStrength();
if ( pSoldier->ubProfile != NO_PROFILE || pSoldier->ubSoldierClass == SOLDIER_CLASS_TANK )
fNoSurrender = TRUE;
}
}
@@ -10447,8 +10460,14 @@ void PrisonerSurrenderMessageBoxCallBack( UINT8 ubExitValue )
if( pSoldier->bActive && ( pSoldier->sSectorX == gWorldSectorX ) && ( pSoldier->sSectorY == gWorldSectorY ) && ( pSoldier->bSectorZ == gbWorldSectorZ) )
{
// if a civilian is not neutral and on the enemy side, add his strength to the team
if ( !pSoldier->aiData.bNeutral && pSoldier->bSide == 1 )
enemysidestrength += pSoldier->GetSurrenderStrength();
if ( !pSoldier->aiData.bNeutral && pSoldier->bSide == 1 && zCivGroupName[pSoldier->ubCivilianGroup].fCanBeCaptured && pSoldier->ubProfile != NO_PROFILE )
fNoSurrender = TRUE;
// a civilian can only be captured if his faction is allowed to. This should prevent the player from exploiting a huge numerical superiority against small enemy groups, like lone assassins.
if ( !pSoldier->CanBeCaptured() )
continue;
enemysidestrength += pSoldier->GetSurrenderStrength( );
}
}
@@ -10464,7 +10483,7 @@ void PrisonerSurrenderMessageBoxCallBack( UINT8 ubExitValue )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113Message[MSG113_SURRENDER_VALUES], playersidestrength, gGameExternalOptions.fSurrenderMultiplier * enemysidestrength );
// perhaps this can be fleshed out more, for now, let's see if this is acceptable behaviour
if ( playersidestrength >= gGameExternalOptions.fSurrenderMultiplier * enemysidestrength )
if ( !fNoSurrender && playersidestrength >= gGameExternalOptions.fSurrenderMultiplier * enemysidestrength )
{
// it is enough to simply set all soldiers to captured
firstid = gTacticalStatus.Team[ ENEMY_TEAM ].bFirstID;
@@ -10473,8 +10492,12 @@ void PrisonerSurrenderMessageBoxCallBack( UINT8 ubExitValue )
{
if( pSoldier->bActive && ( pSoldier->sSectorX == gWorldSectorX ) && ( pSoldier->sSectorY == gWorldSectorY ) && ( pSoldier->bSectorZ == gbWorldSectorZ) )
{
// only if not dying, and if not a NPC (Mike...)
if( pSoldier->stats.bLife >= OKLIFE && pSoldier->ubProfile == NO_PROFILE )
// can this guy be captured?
if ( !pSoldier->CanBeCaptured( ) )
continue;
// only if not dying
if( pSoldier->stats.bLife >= OKLIFE )
{
pSoldier->usSoldierFlagMask |= SOLDIER_POW;
@@ -10483,10 +10506,34 @@ void PrisonerSurrenderMessageBoxCallBack( UINT8 ubExitValue )
}
}
}
firstid = gTacticalStatus.Team[CIV_TEAM].bFirstID;
lastid = gTacticalStatus.Team[CIV_TEAM].bLastID;
for ( uiCnt = firstid, pSoldier = MercPtrs[uiCnt]; uiCnt <= lastid; ++uiCnt, ++pSoldier )
{
if ( pSoldier->bActive && (pSoldier->sSectorX == gWorldSectorX) && (pSoldier->sSectorY == gWorldSectorY) && (pSoldier->bSectorZ == gbWorldSectorZ) )
{
// can this guy be captured?
if ( !pSoldier->CanBeCaptured() )
continue;
// only if not dying
if ( pSoldier->stats.bLife >= OKLIFE )
{
pSoldier->usSoldierFlagMask |= SOLDIER_POW;
// Remove as target
RemoveManAsTarget( pSoldier );
}
}
}
}
else
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_REFUSE_SURRENDER] );
if ( fNoSurrender )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_REFUSE_SURRENDER_LEADER] );
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_REFUSE_SURRENDER] );
// if asking for surrender while undercover and the enemy refuses, he learns who you are, so he uncovers you
if ( gusSelectedSoldier != NOBODY && MercPtrs[ gusSelectedSoldier ]->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
@@ -10561,8 +10608,8 @@ void PrisonerSurrenderMessageBoxCallBack( UINT8 ubExitValue )
// Flugente: offer the enemy the chance to surrender
void HandleSurrenderOffer( SOLDIERTYPE* pSoldier )
{
// only against enemies...
if ( !pSoldier || pSoldier->bTeam != ENEMY_TEAM )
// abort if bad pointer, or not an enemy and not a capturable civilian
if ( !pSoldier || !pSoldier->CanBeCaptured( ) )
return;
// remember the target's ID
+24 -8
View File
@@ -16176,13 +16176,28 @@ BOOLEAN SOLDIERTYPE::FreePrisoner( )
return FALSE;
}
// can this guy be handcuffed?
BOOLEAN SOLDIERTYPE::CanBeHandcuffed( )
// can this guy be captured (by handcuffing or asking him to surrender)?
BOOLEAN SOLDIERTYPE::CanBeCaptured( )
{
// if this is an enemy that has not already been captured, and is not a NPC, we can handcuff and thus capture him
if ( this->bTeam == ENEMY_TEAM && !(this->usSoldierFlagMask & SOLDIER_POW) && this->ubProfile == NO_PROFILE )
return TRUE;
// if this guy is not already handcuffed, and is not an NPC
if ( !(this->usSoldierFlagMask & SOLDIER_POW) && this->ubProfile == NO_PROFILE )
{
// tanks cannot be captured
if ( this->ubSoldierClass == SOLDIER_CLASS_TANK )
return FALSE;
// enemies can be captured
if ( this->bTeam == ENEMY_TEAM )
return TRUE;
// civilians can be captured if their faction can, and if they are hostile
if ( this->bTeam == CIV_TEAM && zCivGroupName[this->ubCivilianGroup].fCanBeCaptured )
{
if ( !this->aiData.bNeutral && this->bSide == 1 )
return TRUE;
}
}
return FALSE;
}
@@ -19795,7 +19810,7 @@ void SOLDIERTYPE::EVENT_SoldierHandcuffPerson( INT32 sGridNo, UINT8 ubDirection
UINT8 ubPerson = WhoIsThere2( sGridNo, this->pathing.bLevel );
if ( ubPerson != NOBODY && MercPtrs[ubPerson]->CanBeHandcuffed( ) )
if ( ubPerson != NOBODY && MercPtrs[ubPerson]->CanBeCaptured( ) )
{
// we found someone we can handcuff
SOLDIERTYPE* pSoldier = MercPtrs[ubPerson];
@@ -20390,8 +20405,9 @@ BOOLEAN SOLDIERTYPE::PlayerSoldierStartTalking( UINT8 ubTargetID, BOOLEAN fValid
DeductPoints( this, sAPCost, 0, UNTRIGGERED_INTERRUPT );
apsDeducted = TRUE;
// Flugente: if we are talking to an enemy, we have the option to offer them surrendering... but not on y levels >= 16 (no surrendering in the palace, as we have to kill, not capture, the queen)
if ( pTSoldier->bTeam == ENEMY_TEAM && (gGameExternalOptions.fEnemyCanSurrender || gGameExternalOptions.fPlayerCanAsktoSurrender) && gWorldSectorY < WORLD_MAP_X - 2 )
// Flugente: if we are talking to an enemy, we have the option to offer them surrender...
if ( (pTSoldier->bTeam == ENEMY_TEAM || (pTSoldier->bTeam == CIV_TEAM && zCivGroupName[pTSoldier->ubCivilianGroup].fCanBeCaptured) )
&& (gGameExternalOptions.fEnemyCanSurrender || gGameExternalOptions.fPlayerCanAsktoSurrender) )
{
HandleSurrenderOffer( pTSoldier );
return(FALSE);
+4 -2
View File
@@ -407,7 +407,9 @@ enum
#define SOLDIER_INTERROGATE_OFFICER 0x00000040 //64 // interrogate officers
#define SOLDIER_INTERROGATE_GENERAL 0x00000080 //128 // interrogate generals
#define SOLDIER_INTERROGATE_ALL 0x000000F8 // all interrogation flags
#define SOLDIER_INTERROGATE_CIVILIAN 0x00000100 //256 // interrogate civilian
#define SOLDIER_INTERROGATE_ALL 0x000001F8 // all interrogation flags
// ----------------------------------------------------------------
// -------- added by Flugente: disease property flags --------
@@ -1769,7 +1771,7 @@ public:
BOOLEAN CanProcessPrisoners();
UINT32 GetSurrenderStrength();
BOOLEAN FreePrisoner(); // used for an enemy liberating fellow prisoners
BOOLEAN CanBeHandcuffed(); // can this guy be handcuffed?
BOOLEAN CanBeCaptured(); // can this guy be captured (by handcuffing or asking him to surrender)?
// Flugente: scuba gear
BOOLEAN UsesScubaGear();
+1 -1
View File
@@ -2253,7 +2253,7 @@ UINT8 HandleHandcuffCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT32 uiCurso
{
// is there a person here?
UINT8 usSoldierIndex = WhoIsThere2( sGridNo, pSoldier->pathing.bLevel );
if ( usSoldierIndex != NOBODY && MercPtrs[usSoldierIndex]->CanBeHandcuffed( ) )
if ( usSoldierIndex != NOBODY && MercPtrs[usSoldierIndex]->CanBeCaptured( ) )
{
return( HANDCUFF_GREY_UICURSOR );
}
+7
View File
@@ -49,6 +49,7 @@ civGroupNamesStartElementHandle(void *userData, const XML_Char *name, const XML_
strcmp(name, "Enabled") == 0 ||
strcmp(name, "Loyalty") == 0 ||
strcmp(name, "AddToBattle") == 0 ||
strcmp(name, "fCanBeCaptured" ) == 0 ||
strcmp(name, "szGroup") == 0 ))
{
pData->curElement = ELEMENT_PROPERTY;
@@ -98,6 +99,7 @@ civGroupNamesEndElementHandle(void *userData, const XML_Char *name)
zCivGroupName[pData->curCivGroupNames.uiIndex].AddToBattle = pData->curCivGroupNames.AddToBattle;
zCivGroupName[pData->curCivGroupNames.uiIndex].Loyalty = pData->curCivGroupNames.Loyalty;
zCivGroupName[pData->curCivGroupNames.uiIndex].fCanBeCaptured = pData->curCivGroupNames.fCanBeCaptured;
}
else
{
@@ -125,6 +127,11 @@ civGroupNamesEndElementHandle(void *userData, const XML_Char *name)
pData->curElement = ELEMENT;
pData->curCivGroupNames.AddToBattle = (BOOLEAN) atol(pData->szCharData);
}
else if ( strcmp( name, "fCanBeCaptured" ) == 0 )
{
pData->curElement = ELEMENT;
pData->curCivGroupNames.fCanBeCaptured = (BOOLEAN)atol( pData->szCharData );
}
else if(strcmp(name, "szGroup") == 0 )
{
pData->curElement = ELEMENT;
+2
View File
@@ -858,6 +858,8 @@ enum
SRT_PRISONER_INI_SETTING_OFF,
STR_PRISONER_X_FREES_Y,
STR_PRISONER_DETECTION_VIP,
STR_PRISONER_REFUSE_SURRENDER_LEADER,
STR_PRISONER_TURN_VOLUNTEER,
TEXT_NUM_PRISONER_STR
};
+18 -4
View File
@@ -2277,16 +2277,18 @@ STR16 pPrisonerMenuStrings[] = // TODO.Translate
L"Interrogate elites",
L"Interrogate officers",
L"Interrogate generals",
L"Interrogate civilians",
L"Cancel",
};
STR16 pPrisonerMenuDescStrings[] =
{
L"Administrators are easy to process, but give only poor results",
L"Regular troops are common an don't give you high rewards.",
L"Regular troops are common and don't give you high rewards.",
L"If elite troops defect to you, they can become veteran militia.",
L"Interrogating enemy officers can lead you to find enemy generals.",
L"Generals cannot join your militia, but lead to high ransoms.",
L"Civilians don't offer much resistance, but are second-rate troops at best.",
L"Cancel",
};
@@ -3565,8 +3567,18 @@ STR16 pwTownInfoStrings[] =
L"民兵训练度", // 10 // state of civilian training in town
L"民兵", // the state of the trained civilians in the town
L"巡逻民兵", // L"Mobile Training", // HEADROCK HAM 3.6: The stat of Mobile militia training in town
L"囚犯", // Flugente: display number of prisoners
L"%d/%d - %dA %dR %dE %dO %dG", // TODO.Translate // Info: Total # of prisoners/capacity - # of Admins # of Regulars # of Elites # of Officers # of Generals
// Flugente: prisoner texts // TODO.Translate
L"囚犯", //L"Prisoners",
L"%d (capacity %d)",
L"%d Admins",
L"%d Regulars",
L"%d Elites",
L"%d Officers",
L"%d Generals",
L"%d Civilians",
L"%d Special1",
L"%d Special2",
};
// Mine strings
@@ -8131,7 +8143,7 @@ STR16 szFoodTextStr[]=
STR16 szPrisonerTextStr[]=
{
L"审讯了%d军官,%d精英士兵,%d普通士兵和%d巡逻官。",
L"%d officers, %d elites, %d regulars, %d admins, %d generals and %d civilians were interrogated.", // TODO.Translate
L"%d 名俘虏已支付赎金", //L"%d prisoners paid ransom money.",
L"%d 名俘虏已供出同伙位置", //L"%d prisoners revealed enemy positions.",
L"%d军官,%d精英士兵,%d普通士兵和%d巡逻官加入了我方。",
@@ -8144,6 +8156,8 @@ STR16 szPrisonerTextStr[]=
L"这些可以在 INI 设置关闭。", // L"This behaviour is set OFF in your ini settings.",
L"%s释放了%s", //L"%s has freed %s!",
L"A prisoner revealed the location of a high-ranking army officer in %s!", // TODO.Translate
L"The enemy leader refuses to even consider surrender!",
L"%d prisoners volunteered to join our forces.",
};
STR16 szMTATextStr[]=
+18 -4
View File
@@ -2275,16 +2275,18 @@ STR16 pPrisonerMenuStrings[] = // TODO.Translate
L"Interrogate elites",
L"Interrogate officers",
L"Interrogate generals",
L"Interrogate civilians",
L"Cancel",
};
STR16 pPrisonerMenuDescStrings[] =
{
L"Administrators are easy to process, but give only poor results",
L"Regular troops are common an don't give you high rewards.",
L"Regular troops are common and don't give you high rewards.",
L"If elite troops defect to you, they can become veteran militia.",
L"Interrogating enemy officers can lead you to find enemy generals.",
L"Generals cannot join your militia, but lead to high ransoms.",
L"Civilians don't offer much resistance, but are second-rate troops at best.",
L"Cancel",
};
@@ -3563,8 +3565,18 @@ STR16 pwTownInfoStrings[] =
L"Training Burgers", // 10 // state of civilian training in town
L"Militie", // the state of the trained civilians in the town
L"Mobile Training", // HEADROCK HAM 3.6: The stat of Mobile militia training in town // TODO.Translate
L"Prisoners", // Flugente: display number of prisoners // TODO.Translate
L"%d/%d - %dA %dR %dE %dO %dG", // TODO.Translate // Info: Total # of prisoners/capacity - # of Admins # of Regulars # of Elites # of Officers # of Generals
// Flugente: prisoner texts
L"Prisoners",
L"%d (capacity %d)",
L"%d Admins",
L"%d Regulars",
L"%d Elites",
L"%d Officers",
L"%d Generals",
L"%d Civilians",
L"%d Special1",
L"%d Special2",
};
// Mine strings
@@ -8142,7 +8154,7 @@ STR16 szFoodTextStr[]=
// TODO.Translate
STR16 szPrisonerTextStr[]=
{
L"%d officers, %d elites, %d regulars and %d admins were interrogated.",
L"%d officers, %d elites, %d regulars, %d admins, %d generals and %d civilians were interrogated.", // TODO.Translate
L"%d prisoners paid ransom money.",
L"%d prisoners revealed enemy positions.",
L"%d officers, %d elites, %d regulars and %d admins joined our cause.",
@@ -8155,6 +8167,8 @@ STR16 szPrisonerTextStr[]=
L"This behaviour is set OFF in your ini settings.",
L"%s has freed %s!",
L"A prisoner revealed the location of a high-ranking army officer in %s!", // TODO.Translate
L"The enemy leader refuses to even consider surrender!",
L"%d prisoners volunteered to join our forces.",
};
STR16 szMTATextStr[]= // TODO.Translate
+18 -4
View File
@@ -2278,16 +2278,18 @@ STR16 pPrisonerMenuStrings[] =
L"Interrogate elites",
L"Interrogate officers",
L"Interrogate generals",
L"Interrogate civilians",
L"Cancel",
};
STR16 pPrisonerMenuDescStrings[] =
{
L"Administrators are easy to process, but give only poor results",
L"Regular troops are common an don't give you high rewards.",
L"Regular troops are common and don't give you high rewards.",
L"If elite troops defect to you, they can become veteran militia.",
L"Interrogating enemy officers can lead you to find enemy generals.",
L"Generals cannot join your militia, but lead to high ransoms.",
L"Civilians don't offer much resistance, but are second-rate troops at best.",
L"Cancel",
};
@@ -3564,8 +3566,18 @@ STR16 pwTownInfoStrings[] =
L"Civilian Training", // 10 // state of civilian training in town
L"Militia", // the state of the trained civilians in the town
L"Mobile Training", // HEADROCK HAM 3.6: The stat of Mobile militia training in town
L"Prisoners", // Flugente: display number of prisoners
L"%d/%d - %dA %dR %dE %dO %dG", // Info: Total # of prisoners/capacity - # of Admins # of Regulars # of Elites # of Officers # of Generals
// Flugente: prisoner texts
L"Prisoners",
L"%d (capacity %d)",
L"%d Admins",
L"%d Regulars",
L"%d Elites",
L"%d Officers",
L"%d Generals",
L"%d Civilians",
L"%d Special1",
L"%d Special2",
};
// Mine strings
@@ -8129,7 +8141,7 @@ STR16 szFoodTextStr[]=
STR16 szPrisonerTextStr[]=
{
L"%d officers, %d elites, %d regulars and %d admins were interrogated.",
L"%d officers, %d elites, %d regulars, %d admins, %d generals and %d civilians were interrogated.",
L"%d prisoners paid ransom money.",
L"%d prisoners revealed enemy positions.",
L"%d officers, %d elites, %d regulars and %d admins joined our cause.",
@@ -8142,6 +8154,8 @@ STR16 szPrisonerTextStr[]=
L"This behaviour is set OFF in your ini settings.",
L"%s has freed %s!",
L"A prisoner revealed the location of a high-ranking army officer in %s!",
L"The enemy leader refuses to even consider surrender!",
L"%d prisoners volunteered to join our forces.",
};
STR16 szMTATextStr[]=
+18 -4
View File
@@ -2284,16 +2284,18 @@ STR16 pPrisonerMenuStrings[] = // TODO.Translate
L"Interrogate elites",
L"Interrogate officers",
L"Interrogate generals",
L"Interrogate civilians",
L"Cancel",
};
STR16 pPrisonerMenuDescStrings[] =
{
L"Administrators are easy to process, but give only poor results",
L"Regular troops are common an don't give you high rewards.",
L"Regular troops are common and don't give you high rewards.",
L"If elite troops defect to you, they can become veteran militia.",
L"Interrogating enemy officers can lead you to find enemy generals.",
L"Generals cannot join your militia, but lead to high ransoms.",
L"Civilians don't offer much resistance, but are second-rate troops at best.",
L"Cancel",
};
@@ -3568,8 +3570,18 @@ STR16 pwTownInfoStrings[] =
L"Formation ", // 10 // state of civilian training in town
L"Milice ", // the state of the trained civilians in the town
L"Formation mobile ", // HEADROCK HAM 3.6: The stat of Mobile militia training in town
L"Prisonnier ", // Flugente: display number of prisoners
L"%d/%d = %dA %dR %dÉ %dO %dG", // TODO.Translate // Info: Total # of prisoners/capacity - # of Admins # of Regulars # of Elites # of Officers # of Generals
// Flugente: prisoner texts // TODO.Translate
L"Prisonnier ",
L"%d (capacity %d)",
L"%d Admins",
L"%d Regulars",
L"%d Elites",
L"%d Officers",
L"%d Generals",
L"%d Civilians",
L"%d Special1",
L"%d Special2",
};
// Mine strings
@@ -8128,7 +8140,7 @@ STR16 szFoodTextStr[]=
STR16 szPrisonerTextStr[]=
{
L"Prisonnier(s) ayant été interrogé(s) : %d officiers, %d élite(s), %d régulier(s) et %d administratif(s).",
L"%d officers, %d elites, %d regulars, %d admins, %d generals and %d civilians were interrogated.", // TODO.Translate
L"Prisonnier(s) ayant payé une rançon : %d.",
L"Prisonnier(s) ayant révélé les positions ennemies : %d.",
L"Prisonnier(s) ayant rejoint notre cause : %d officiers, %d élite(s), %d régulier(s) et %d administratif(s).",
@@ -8141,6 +8153,8 @@ STR16 szPrisonerTextStr[]=
L"Ce comportement est désactivé dans vos fichiers ini.",
L"%s a libéré %s !",
L"A prisoner revealed the location of a high-ranking army officer in %s!", // TODO.Translate
L"The enemy leader refuses to even consider surrender!",
L"%d prisoners volunteered to join our forces.",
};
STR16 szMTATextStr[]=
+19 -5
View File
@@ -2280,16 +2280,18 @@ STR16 pPrisonerMenuStrings[] = // TODO.Translate
L"Interrogate elites",
L"Interrogate officers",
L"Interrogate generals",
L"Interrogate civilians",
L"Cancel",
};
STR16 pPrisonerMenuDescStrings[] =
{
L"Administrators are easy to process, but give only poor results",
L"Regular troops are common an don't give you high rewards.",
L"Regular troops are common and don't give you high rewards.",
L"If elite troops defect to you, they can become veteran militia.",
L"Interrogating enemy officers can lead you to find enemy generals.",
L"Generals cannot join your militia, but lead to high ransoms.",
L"Civilians don't offer much resistance, but are second-rate troops at best.",
L"Cancel",
};
@@ -3562,8 +3564,18 @@ STR16 pwTownInfoStrings[] =
L"Zivilistentraining", // 10 // state of civilian training in town
L"Miliz", // the state of the trained civilians in the town
L"Mobile M. Training", // HEADROCK HAM 3.6: The stat of Mobile militia training in town
L"Prisoners", // Flugente: display number of prisoners // TODO.Translate
L"%d/%d - %dA %dR %dE %dO %dG", // TODO.Translate // Info: Total # of prisoners/capacity - # of Admins # of Regulars # of Elites # of Officers # of Generals
// Flugente: prisoner texts
L"Gefangene",
L"%d (max. %d)",
L"%d Hilfssoldaten",
L"%d Truppen",
L"%d Elite",
L"%d Offiziere",
L"%d Generele",
L"%d Zivilisten",
L"%d Special1",
L"%d Special2",
};
// Mine strings
@@ -7959,7 +7971,7 @@ STR16 szFoodTextStr[]=
STR16 szPrisonerTextStr[]=
{
L"%d Offiziere, %d Elite-, %d Reguläre und %d Hilfssoldaten wurden verhört.",
L"%d Offiziere, %d Elite-, %d Reguläre, %d Hilfssoldaten, %d Generäle und %d Zivilisten wurden verhört.",
L"%d Gefangene wurden gegen Lösegeld freigelassen.",
L"%d Gefangene haben uns Truppenstandorte verraten.",
L"%d Offiziere, %d Elite-, %d Reguläre und %d Hilfssoldaten laufen zu uns über.",
@@ -7971,7 +7983,9 @@ STR16 szPrisonerTextStr[]=
L"Der Feind weigert sich, Sie als Gefangenen zu nehmen - Er möchte Sie tod sehen!",
L"Dieses Verhalten ist ausgeschaltet in der ja2_options.ini Datei.",
L"%s hat %s befreit!",
L"A prisoner revealed the location of a high-ranking army officer in %s!", // TODO.Translate
L"Ein Gefangener hat den Aufenthaltsort eines hochrangigen Offiziers in %s enthüllt!",
L"Der feindliche Anführer denkt nicht mal an Kapitulation!",
L"%d Gefangene sind uns als Freiwillige beigetreten.",
};
STR16 szMTATextStr[]=
+18 -5
View File
@@ -2266,22 +2266,23 @@ STR16 pSnitchSectorMenuDescStrings[] =
STR16 pPrisonerMenuStrings[] = // TODO.Translate
{
// toggle snitching
L"Interrogate admins",
L"Interrogate troops",
L"Interrogate elites",
L"Interrogate officers",
L"Interrogate generals",
L"Interrogate civilians",
L"Cancel",
};
STR16 pPrisonerMenuDescStrings[] =
{
L"Administrators are easy to process, but give only poor results",
L"Regular troops are common an don't give you high rewards.",
L"Regular troops are common and don't give you high rewards.",
L"If elite troops defect to you, they can become veteran militia.",
L"Interrogating enemy officers can lead you to find enemy generals.",
L"Generals cannot join your militia, but lead to high ransoms.",
L"Civilians don't offer much resistance, but are second-rate troops at best.",
L"Cancel",
};
@@ -3559,8 +3560,18 @@ STR16 pwTownInfoStrings[] =
L"addestramento civili", // 10 // state of civilian training in town
L"Esercito", // the state of the trained civilians in the town
L"Mobile Training", // HEADROCK HAM 3.6: The stat of Mobile militia training in town // TODO.Translate
L"Prisoners", // Flugente: display number of prisoners // TODO.Translate
L"%d/%d - %dA %dR %dE %dO %dG", // TODO.Translate // Info: Total # of prisoners/capacity - # of Admins # of Regulars # of Elites # of Officers # of Generals
// Flugente: prisoner texts // TODO.Translate
L"Prisoners",
L"%d (capacity %d)",
L"%d Admins",
L"%d Regulars",
L"%d Elites",
L"%d Officers",
L"%d Generals",
L"%d Civilians",
L"%d Special1",
L"%d Special2",
};
// Mine strings
@@ -8137,7 +8148,7 @@ STR16 szFoodTextStr[]=
// TODO.Translate
STR16 szPrisonerTextStr[]=
{
L"%d officers, %d elites, %d regulars and %d admins were interrogated.",
L"%d officers, %d elites, %d regulars, %d admins, %d generals and %d civilians were interrogated.", // TODO.Translate
L"%d prisoners paid ransom money.",
L"%d prisoners revealed enemy positions.",
L"%d officers, %d elites, %d regulars and %d admins joined our cause.",
@@ -8150,6 +8161,8 @@ STR16 szPrisonerTextStr[]=
L"This behaviour is set OFF in your ini settings.",
L"%s has freed %s!",
L"A prisoner revealed the location of a high-ranking army officer in %s!", // TODO.Translate
L"The enemy leader refuses to even consider surrender!",
L"%d prisoners volunteered to join our forces.",
};
STR16 szMTATextStr[]= // TODO.Translate
+18 -4
View File
@@ -2286,16 +2286,18 @@ STR16 pPrisonerMenuStrings[] = // TODO.Translate
L"Interrogate elites",
L"Interrogate officers",
L"Interrogate generals",
L"Interrogate civilians",
L"Cancel",
};
STR16 pPrisonerMenuDescStrings[] =
{
L"Administrators are easy to process, but give only poor results",
L"Regular troops are common an don't give you high rewards.",
L"Regular troops are common and don't give you high rewards.",
L"If elite troops defect to you, they can become veteran militia.",
L"Interrogating enemy officers can lead you to find enemy generals.",
L"Generals cannot join your militia, but lead to high ransoms.",
L"Civilians don't offer much resistance, but are second-rate troops at best.",
L"Cancel",
};
@@ -3573,8 +3575,18 @@ STR16 pwTownInfoStrings[] =
L"Szkolenie cywili", // 10 // state of civilian training in town
L"Samoobrona", // the state of the trained civilians in the town
L"Mobile Training", // HEADROCK HAM 3.6: The stat of Mobile militia training in town // TODO.Translate
L"Prisoners", // Flugente: display number of prisoners // TODO.Translate
L"%d/%d - %dA %dR %dE %dO %dG", // TODO.Translate // Info: Total # of prisoners/capacity - # of Admins # of Regulars # of Elites # of Officers # of Generals
// Flugente: prisoner texts // TODO.Translate
L"Prisoners",
L"%d (capacity %d)",
L"%d Admins",
L"%d Regulars",
L"%d Elites",
L"%d Officers",
L"%d Generals",
L"%d Civilians",
L"%d Special1",
L"%d Special2",
};
// Mine strings
@@ -8154,7 +8166,7 @@ STR16 szFoodTextStr[]=
// TODO.Translate
STR16 szPrisonerTextStr[]=
{
L"%d officers, %d elites, %d regulars and %d admins were interrogated.",
L"%d officers, %d elites, %d regulars, %d admins, %d generals and %d civilians were interrogated.", // TODO.Translate
L"%d prisoners paid ransom money.",
L"%d prisoners revealed enemy positions.",
L"%d officers, %d elites, %d regulars and %d admins joined our cause.",
@@ -8167,6 +8179,8 @@ STR16 szPrisonerTextStr[]=
L"This behaviour is set OFF in your ini settings.",
L"%s has freed %s!",
L"A prisoner revealed the location of a high-ranking army officer in %s!", // TODO.Translate
L"The enemy leader refuses to even consider surrender!",
L"%d prisoners volunteered to join our forces.",
};
STR16 szMTATextStr[]= // TODO.Translate
+18 -4
View File
@@ -2277,16 +2277,18 @@ STR16 pPrisonerMenuStrings[] = // TODO.Translate
L"Interrogate elites",
L"Interrogate officers",
L"Interrogate generals",
L"Interrogate civilians",
L"Cancel",
};
STR16 pPrisonerMenuDescStrings[] = // TODO.Translate
{
L"Administrators are easy to process, but give only poor results",
L"Regular troops are common an don't give you high rewards.",
L"Regular troops are common and don't give you high rewards.",
L"If elite troops defect to you, they can become veteran militia.",
L"Interrogating enemy officers can lead you to find enemy generals.",
L"Generals cannot join your militia, but lead to high ransoms.",
L"Civilians don't offer much resistance, but are second-rate troops at best.",
L"Cancel",
};
@@ -3561,8 +3563,18 @@ STR16 pwTownInfoStrings[] =
L"Тренировка ополчения", // 10 // state of civilian training in town
L"Ополчение", // the state of the trained civilians in the town
L"Тренинг мобильных групп", // HEADROCK HAM 3.6: The stat of Mobile militia training in town //Mobile Training
L"Заключенные", // Flugente: display number of prisoners
L"%d/%d - %dA %dR %dE %dO %dG", // TODO.Translate // Info: Total # of prisoners/capacity - # of Admins # of Regulars # of Elites # of Officers # of Generals
// Flugente: prisoner texts // TODO.Translate
L"Заключенные",
L"%d (capacity %d)",
L"%d Admins",
L"%d Regulars",
L"%d Elites",
L"%d Officers",
L"%d Generals",
L"%d Civilians",
L"%d Special1",
L"%d Special2",
};
// Mine strings
@@ -8124,7 +8136,7 @@ STR16 szFoodTextStr[]=
STR16 szPrisonerTextStr[]=
{
L"%d офицеров, %d элитных солдат, %d рядовых и %d полицейских были допрошены.",
L"%d officers, %d elites, %d regulars, %d admins, %d generals and %d civilians were interrogated.", // TODO.Translate
L"%d пленных заплатили выкуп.",
L"%d пленных выдали расположение отрядов армии.",
L"%d офицеров, %d элитных солдат, %d рядовых и %d полицейских решили присоединиться к нам.",
@@ -8137,6 +8149,8 @@ STR16 szPrisonerTextStr[]=
L"Этот режим отключен в настройках.",
L"%s освободил %s!",
L"A prisoner revealed the location of a high-ranking army officer in %s!", // TODO.Translate
L"The enemy leader refuses to even consider surrender!",
L"%d prisoners volunteered to join our forces.",
};
STR16 szMTATextStr[]=