mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
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:
+24
-32
@@ -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
@@ -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 )
|
||||
|
||||
@@ -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!",
|
||||
|
||||
@@ -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!",
|
||||
|
||||
@@ -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!",
|
||||
|
||||
@@ -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) !",
|
||||
|
||||
@@ -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!",
|
||||
|
||||
@@ -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!",
|
||||
|
||||
@@ -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!",
|
||||
|
||||
@@ -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!",
|
||||
|
||||
@@ -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!",
|
||||
|
||||
Reference in New Issue
Block a user