Merged revision(s) 7209 from branches/ja2_source_official_2014:

- improved prisoner handling code

- Fix: imprisoned officers were wrongly converted into elites


git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7210 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2014-05-18 14:40:58 +00:00
parent c117a02441
commit cf1b9982ba
12 changed files with 44 additions and 65 deletions
+24 -32
View File
@@ -6607,7 +6607,6 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
{
if( pSoldier->bActive && ( pSoldier->sSectorX == sMapX ) && ( pSoldier->sSectorY == sMapY ) && ( pSoldier->bSectorZ == bZ) )
{
// if he's training teammates in this stat
if( ( pSoldier->bAssignment == FACILITY_INTERROGATE_PRISONERS ) && ( EnoughTimeOnAssignment( pSoldier ) ) && ( pSoldier->flags.fMercAsleep == FALSE ) )
{
++numinterrogators;
@@ -6618,11 +6617,8 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
else if( ( pSoldier->bAssignment == FACILITY_PRISON_SNITCH ) && CanCharacterSnitchInPrison(pSoldier) && EnoughTimeOnAssignment( pSoldier ) && ( pSoldier->flags.fMercAsleep == FALSE ) )
{
// first check if he wasn't exposed
if( HandleSnitchExposition(pSoldier) )
{
//exposition fallout handled in HandleSnitchExposition
}
else
if( !HandleSnitchExposition(pSoldier) )
{
++numinterrogators;
@@ -6659,9 +6655,9 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
if ( !prisonersinterrogated )
return;
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_PROCESSED], interrogatedprisoners[PRISONER_ELITE], interrogatedprisoners[PRISONER_REGULAR], interrogatedprisoners[PRISONER_ADMIN] );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_PROCESSED], interrogatedprisoners[PRISONER_OFFICER], interrogatedprisoners[PRISONER_ELITE], interrogatedprisoners[PRISONER_REGULAR], interrogatedprisoners[PRISONER_ADMIN] );
UINT8 turnedmilitia_elite = 0, turnedmilitia_regular= 0, turnedmilitia_admin = 0;
UINT16 turnedmilitia[PRISONER_MAX] = { 0 };
UINT32 revealedpositions = 0;
UINT32 ransomscollected = 0;
UINT32 ransommoney = 0;
@@ -6674,12 +6670,14 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
if ( result < gGameExternalOptions.ubPrisonerProcessDefectChance )
{
// troops are converted to militia, but there is a chance that they will be demoted in the process
if ( i >= interrogatedprisoners[PRISONER_ADMIN] + interrogatedprisoners[PRISONER_REGULAR] + interrogatedprisoners[PRISONER_ELITE] && Chance( 80 ) )
++turnedmilitia[PRISONER_OFFICER];
if ( i >= interrogatedprisoners[PRISONER_ADMIN] + interrogatedprisoners[PRISONER_REGULAR] && Chance( 80 ) )
++turnedmilitia_elite;
++turnedmilitia[PRISONER_ELITE];
else if ( i >= interrogatedprisoners[PRISONER_ADMIN] && Chance( 80 ) )
++turnedmilitia_regular;
++turnedmilitia[PRISONER_REGULAR];
else
++turnedmilitia_admin;
++turnedmilitia[PRISONER_ADMIN];
// we continue so that this guy cannot also run back to the queen
continue;
@@ -6781,14 +6779,14 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
++giReinforcementPool;
}
if ( turnedmilitia_elite + turnedmilitia_regular + turnedmilitia_admin )
if ( turnedmilitia[PRISONER_ADMIN] + turnedmilitia[PRISONER_REGULAR] + turnedmilitia[PRISONER_ELITE] + turnedmilitia[PRISONER_OFFICER] )
{
// add these guys to the local garrison as green militias
StrategicAddMilitiaToSector(sMapX, sMapY, GREEN_MILITIA, turnedmilitia_admin);
StrategicAddMilitiaToSector(sMapX, sMapY, REGULAR_MILITIA, turnedmilitia_regular);
StrategicAddMilitiaToSector(sMapX, sMapY, ELITE_MILITIA, turnedmilitia_elite);
StrategicAddMilitiaToSector( sMapX, sMapY, GREEN_MILITIA, turnedmilitia[PRISONER_ADMIN] );
StrategicAddMilitiaToSector( sMapX, sMapY, REGULAR_MILITIA, turnedmilitia[PRISONER_REGULAR] );
StrategicAddMilitiaToSector( sMapX, sMapY, ELITE_MILITIA, turnedmilitia[PRISONER_ELITE] + turnedmilitia[PRISONER_OFFICER] );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_TURN_MILITIA], turnedmilitia_elite, turnedmilitia_regular, turnedmilitia_admin );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_TURN_MILITIA], turnedmilitia[PRISONER_OFFICER], turnedmilitia[PRISONER_ELITE], turnedmilitia[PRISONER_REGULAR], turnedmilitia[PRISONER_ADMIN] );
}
if ( revealedpositions )
@@ -6868,11 +6866,6 @@ void HandlePrison( INT16 sMapX, INT16 sMapY, INT8 bZ )
UINT8 prisonersofficer = 0, prisonerselite = 0, prisonersregular = 0, prisonersadmin = 0;
UINT16 numprisoners = GetNumberOfPrisoners( pSectorInfo, &prisonersofficer, &prisonerselite, &prisonersregular, &prisonersadmin );
// for now, simply count officers as elites
ChangeNumberOfPrisoners( pSectorInfo, -prisonersofficer, prisonersofficer, 0, 0 );
prisonerselite += prisonersofficer;
prisonersofficer = 0;
if ( !numprisoners )
return;
@@ -6884,7 +6877,7 @@ void HandlePrison( INT16 sMapX, INT16 sMapY, INT8 bZ )
{
// add enemies
pSectorInfo->ubNumTroops = min(255, pSectorInfo->ubNumTroops + prisonersregular);
pSectorInfo->ubNumElites = min(255, pSectorInfo->ubNumElites + prisonerselite);
pSectorInfo->ubNumElites = min(255, pSectorInfo->ubNumElites + prisonerselite + prisonersofficer);
pSectorInfo->ubNumAdmins = min(255, pSectorInfo->ubNumAdmins + prisonersadmin);
// all prisoners are free, reduce count!
@@ -6908,16 +6901,14 @@ void HandlePrison( INT16 sMapX, INT16 sMapY, INT8 bZ )
prisonguardvalue = CalculateAllGuardsValueInPrison( sMapX, sMapY, bZ );
// anv: snitches can only prevent mutiny if there are normal guards to cooperate with
if( !numprisonguards )
{
if( numprisonguards )
prisonguardvalue += CalculateAllSnitchesGuardValueInPrison( sMapX, sMapY, bZ );
}
if ( !numprisonguards )
fBeginRiot = TRUE;
// we now have to determine the combined strength of the prisoners
UINT32 prisonerriotvalue = 125 * prisonerselite + 100 * prisonersregular + 75 * prisonersadmin;
UINT32 prisonerriotvalue = 200 * prisonersofficer + 125 * prisonerselite + 100 * prisonersregular + 75 * prisonersadmin;
if ( prisonerriotvalue > prisonguardvalue )
{
@@ -6932,17 +6923,18 @@ void HandlePrison( INT16 sMapX, INT16 sMapY, INT8 bZ )
prisonertoguardratio = (FLOAT)(prisonerriotvalue / prisonguardvalue);
// in a riot, prisoners escape and are added to the sector as enemies. Not all might escape - the worse the prisoner/guard ratio, the more escape
UINT8 escapedadmins = min( Random(prisonersadmin + prisonersadmin * prisonertoguardratio) , prisonersadmin);
UINT8 escapedregulars = min( Random(prisonersregular + prisonersregular * prisonertoguardratio) , prisonersregular);
UINT8 escapedelites = min( Random(prisonerselite + prisonerselite * prisonertoguardratio) , prisonerselite);
INT16 escapedadmins = min( Random( prisonersadmin * prisonertoguardratio ), prisonersadmin );
INT16 escapedregulars = min( Random( prisonersregular * prisonertoguardratio ), prisonersregular );
INT16 escapedelites = min( Random( prisonerselite * prisonertoguardratio ), prisonerselite );
INT16 escapedofficers = min( Random( prisonersofficer * prisonertoguardratio ), prisonersofficer );
// add enemies
pSectorInfo->ubNumTroops = min(255, pSectorInfo->ubNumTroops + escapedregulars);
pSectorInfo->ubNumElites = min(255, pSectorInfo->ubNumElites + escapedelites);
pSectorInfo->ubNumAdmins = min(255, pSectorInfo->ubNumAdmins + escapedadmins);
pSectorInfo->ubNumTroops = min( 512, pSectorInfo->ubNumTroops + escapedregulars );
pSectorInfo->ubNumElites = min( 512, pSectorInfo->ubNumElites + escapedelites + escapedofficers );
pSectorInfo->ubNumAdmins = min( 512, pSectorInfo->ubNumAdmins + escapedadmins );
// reduce prisoner count!
ChangeNumberOfPrisoners( pSectorInfo, -prisonersofficer, -escapedelites, -escapedregulars, -escapedadmins, sMapX, sMapY );
ChangeNumberOfPrisoners( pSectorInfo, -escapedofficers, -escapedelites, -escapedregulars, -escapedadmins, sMapX, sMapY );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_RIOT], wSectorName );
}
@@ -457,7 +457,7 @@ void AddTextToTownBox( void )
// prisoners
swprintf( wString, L"%s:", pwTownInfoStrings[13] );
AddMonoString( &hStringHandle, wString );
swprintf( wString, L"%d/%d/%d/%d%/%d", prisoners[PRISONER_ADMIN], prisoners[PRISONER_REGULAR], prisoners[PRISONER_ELITE], prisoners[PRISONER_OFFICER], capacity );
swprintf( wString, L"%d/%d - %dA %dR %dE %dO", numprisoners, capacity, prisoners[PRISONER_ADMIN], prisoners[PRISONER_REGULAR], prisoners[PRISONER_ELITE], prisoners[PRISONER_OFFICER] );
AddSecondColumnMonoString( &hStringHandle, wString );
}
}
+1 -14
View File
@@ -10649,19 +10649,6 @@ void ChangeNumberOfPrisoners( SECTORINFO *pSectorInfo, INT16 aOfficer, INT16 aEl
pSectorInfo->uiNumberOfPrisonersOfWar[PRISONER_ELITE] = max(0, min(255, pSectorInfo->uiNumberOfPrisonersOfWar[PRISONER_ELITE] + aElite) );
pSectorInfo->uiNumberOfPrisonersOfWar[PRISONER_REGULAR] = max(0, min(255, pSectorInfo->uiNumberOfPrisonersOfWar[PRISONER_REGULAR] + aRegular) );
pSectorInfo->uiNumberOfPrisonersOfWar[PRISONER_ADMIN] = max(0, min(255, pSectorInfo->uiNumberOfPrisonersOfWar[PRISONER_ADMIN] + aAdmin) );
// anv: handle change of number of prisoners knowing snitch's identity
//if( sX != 0 && sY != 0 )
//{
// for( UINT8 cnt = 0; cnt < NUM_PROFILES; cnt++ )
// {
// if( gMercProfiles[ cnt ].ubExposedInSector[ SECTOR(sX, sY) ] != 0 )
// {
// gMercProfiles[ cnt ].ubExposedInSector[ SECTOR(sX, sY) ] = max( 0, min( 255, gMercProfiles[ cnt ].ubExposedInSector[ SECTOR(sX, sY) ] + aSpecial + aElite + aRegular + aAdmin ) );
// }
// }
//}
}
void ChangeNumberOfPrisoners( UNDERGROUND_SECTORINFO *pSectorInfo, INT16 aOfficer, INT16 aElite, INT16 aRegular, INT16 aAdmin )
@@ -10693,7 +10680,7 @@ void DeleteAllPrisoners( UNDERGROUND_SECTORINFO *pSectorInfo )
pSectorInfo->uiNumberOfPrisonersOfWar[i] = 0;
}
// used when the player kills a prisoner. We kill of high-value prisoners first, to punish this kind of behaviour
// used when the player kills a prisoner. We kill off high-value prisoners first, to punish this kind of behaviour
void KillOnePrisoner( SECTORINFO *pSectorInfo )
{
if ( !pSectorInfo )
+2 -2
View File
@@ -8058,10 +8058,10 @@ STR16 szFoodTextStr[]=
STR16 szPrisonerTextStr[]=
{
L"%d 精英, %d 正规军 和 %d 长官被审问.", //L"%d elites, %d regulars and %d amins were interrogated.",
L"%d officers, %d elites, %d regulars and %d admins were interrogated.", // TODO.Translate
L"%d 名俘虏已支付赎金", //L"%d prisoners paid ransom money.",
L"%d 名俘虏已供出同伙位置", //L"%d prisoners revealed enemy positions.",
L"%d 精英, %d 正规军 and %d 长官加入我们.", //L"%d elites, %d regulars and %d amins joined our cause.",
L"%d officers, %d elites, %d regulars and %d admins joined our cause.", // TODO.Translate
L"俘虏掀起大规模暴动!在 %s 监狱!", //L"Prisoners start a massive riot in %s!",
L"俘虏被押送前往 %s 监狱", //L"The army now occupies the prison in %s, the prisoners were freed!",
L"俘虏已被释放!", //L"Prisoners have been released!",
+2 -2
View File
@@ -8071,10 +8071,10 @@ STR16 szFoodTextStr[]=
// TODO.Translate
STR16 szPrisonerTextStr[]=
{
L"%d elites, %d regulars and %d admins were interrogated.",
L"%d officers, %d elites, %d regulars and %d admins were interrogated.",
L"%d prisoners paid ransom money.",
L"%d prisoners revealed enemy positions.",
L"%d elites, %d regulars and %d admins joined our cause.",
L"%d officers, %d elites, %d regulars and %d admins joined our cause.",
L"Prisoners start a massive riot in %s!",
L"%d prisoners were sent to %s!",
L"Prisoners have been released!",
+2 -2
View File
@@ -8056,10 +8056,10 @@ STR16 szFoodTextStr[]=
STR16 szPrisonerTextStr[]=
{
L"%d elites, %d regulars and %d admins were interrogated.",
L"%d officers, %d elites, %d regulars and %d admins were interrogated.",
L"%d prisoners paid ransom money.",
L"%d prisoners revealed enemy positions.",
L"%d elites, %d regulars and %d admins joined our cause.",
L"%d officers, %d elites, %d regulars and %d admins joined our cause.",
L"Prisoners start a massive riot in %s!",
L"%d prisoners were sent to %s!",
L"Prisoners have been released!",
+2 -2
View File
@@ -8056,10 +8056,10 @@ STR16 szFoodTextStr[]=
STR16 szPrisonerTextStr[]=
{
L"Prisonnier(s) ayant été interrogé(s) : %d élite(s), %d régulier(s) et %d administratif(s).", // TODO.Translate. A voir définition (to see finished, definition)
L"%d officers, %d elites, %d regulars and %d admins were interrogated.", // TODO.Translate
L"Prisonnier(s) ayant payé une rançon : %d.", // TODO.Translate. A voir définition (to see finished, definition)
L"Prisonnier(s) ayant révélé les positions ennemies : %d.", // TODO.Translate. A voir définition (to see finished, definition)
L"Prisonnier(s) ayant rejoint notre cause : %d élite(s), %d régulier(s) et %d administratif(s).", // TODO.Translate. A voir définition (to see finished, definition)
L"%d officers, %d elites, %d regulars and %d admins joined our cause.", // TODO.Translate
L"Prisonnier(s) ayant commencé une émeute : %s !", // TODO.Translate. A voir définition (to see finished, definition)
L"Prisonnier(s) envoyé(s) en %s : %d !", // TODO.Translate. A voir définition (to see finished, definition)
L"Prisonnier(s) libéré(s) !",
+2 -2
View File
@@ -7884,10 +7884,10 @@ STR16 szFoodTextStr[]=
STR16 szPrisonerTextStr[]=
{
L"%d Elite-, %d Reguläre und %d Hilfssoldaten wurden verhört.",
L"%d Offiziere, %d Elite-, %d Reguläre und %d Hilfssoldaten wurden verhört.",
L"%d Gefangene wurden gegen Lösegeld freigelassen.",
L"%d Gefangene haben uns Truppenstandorte verraten.",
L"%d Elite-, %d Reguläre und %d Hilfssoldaten laufen zu uns über.",
L"%d Offiziere, %d Elite-, %d Reguläre und %d Hilfssoldaten laufen zu uns über.",
L"Gefangenenaufstand in %s!",
L"%d Gefangene wurden nach %s geschickt!",
L"Gefangene freigelassen!",
+2 -2
View File
@@ -8062,10 +8062,10 @@ STR16 szFoodTextStr[]=
// TODO.Translate
STR16 szPrisonerTextStr[]=
{
L"%d elites, %d regulars and %d admins were interrogated.",
L"%d officers, %d elites, %d regulars and %d admins were interrogated.",
L"%d prisoners paid ransom money.",
L"%d prisoners revealed enemy positions.",
L"%d elites, %d regulars and %d admins joined our cause.",
L"%d officers, %d elites, %d regulars and %d admins joined our cause.",
L"Prisoners start a massive riot in %s!",
L"%d prisoners were sent to %s!",
L"Prisoners have been released!",
+2 -2
View File
@@ -8080,10 +8080,10 @@ STR16 szFoodTextStr[]=
// TODO.Translate
STR16 szPrisonerTextStr[]=
{
L"%d elites, %d regulars and %d admins were interrogated.",
L"%d officers, %d elites, %d regulars and %d admins were interrogated.",
L"%d prisoners paid ransom money.",
L"%d prisoners revealed enemy positions.",
L"%d elites, %d regulars and %d admins joined our cause.",
L"%d officers, %d elites, %d regulars and %d admins joined our cause.",
L"Prisoners start a massive riot in %s!",
L"%d prisoners were sent to %s!",
L"Prisoners have been released!",
+2 -2
View File
@@ -8060,10 +8060,10 @@ STR16 szFoodTextStr[]=
// TODO.Translate
STR16 szPrisonerTextStr[]=
{
L"%d elites, %d regulars and %d admins were interrogated.",
L"%d officers, %d elites, %d regulars and %d admins were interrogated.",
L"%d prisoners paid ransom money.",
L"%d prisoners revealed enemy positions.",
L"%d elites, %d regulars and %d admins joined our cause.",
L"%d officers, %d elites, %d regulars and %d admins joined our cause.",
L"Prisoners start a massive riot in %s!",
L"%d prisoners were sent to %s!",
L"Prisoners have been released!",
+2 -2
View File
@@ -8071,10 +8071,10 @@ STR16 szFoodTextStr[]=
// TODO.Translate
STR16 szPrisonerTextStr[]=
{
L"%d elites, %d regulars and %d admins were interrogated.",
L"%d officers, %d elites, %d regulars and %d admins were interrogated.",
L"%d prisoners paid ransom money.",
L"%d prisoners revealed enemy positions.",
L"%d elites, %d regulars and %d admins joined our cause.",
L"%d officers, %d elites, %d regulars and %d admins joined our cause.",
L"Prisoners start a massive riot in %s!",
L"%d prisoners were sent to %s!",
L"Prisoners have been released!",