From cf1b9982ba434b7872081457cef3df45e5876b08 Mon Sep 17 00:00:00 2001 From: Flugente Date: Sun, 18 May 2014 14:40:58 +0000 Subject: [PATCH] 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 --- Strategic/Assignments.cpp | 56 ++++++++----------- .../Map Screen Interface TownMine Info.cpp | 2 +- Tactical/Overhead.cpp | 15 +---- Utils/_ChineseText.cpp | 4 +- Utils/_DutchText.cpp | 4 +- Utils/_EnglishText.cpp | 4 +- Utils/_FrenchText.cpp | 4 +- Utils/_GermanText.cpp | 4 +- Utils/_ItalianText.cpp | 4 +- Utils/_PolishText.cpp | 4 +- Utils/_RussianText.cpp | 4 +- Utils/_TaiwaneseText.cpp | 4 +- 12 files changed, 44 insertions(+), 65 deletions(-) diff --git a/Strategic/Assignments.cpp b/Strategic/Assignments.cpp index cb7338d0..0f30eb19 100644 --- a/Strategic/Assignments.cpp +++ b/Strategic/Assignments.cpp @@ -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 ); } diff --git a/Strategic/Map Screen Interface TownMine Info.cpp b/Strategic/Map Screen Interface TownMine Info.cpp index 895884f4..77b00ab5 100644 --- a/Strategic/Map Screen Interface TownMine Info.cpp +++ b/Strategic/Map Screen Interface TownMine Info.cpp @@ -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 ); } } diff --git a/Tactical/Overhead.cpp b/Tactical/Overhead.cpp index 09c66902..0f38ebc8 100644 --- a/Tactical/Overhead.cpp +++ b/Tactical/Overhead.cpp @@ -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 ) diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index b54e74a7..5fa315d0 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -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!", diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 3af6e1ef..5690fcb3 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -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!", diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index 0e99e376..af7ce5d2 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -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!", diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index 59128565..fe116fec 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -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) !", diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 4e335b9e..0499f1c5 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -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!", diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 363e1c01..f3369609 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -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!", diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index 0f8face2..2624b457 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -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!", diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index 595d1108..f30569f6 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -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!", diff --git a/Utils/_TaiwaneseText.cpp b/Utils/_TaiwaneseText.cpp index 0488d691..ef210299 100644 --- a/Utils/_TaiwaneseText.cpp +++ b/Utils/_TaiwaneseText.cpp @@ -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!",