diff --git a/Strategic/Assignments.cpp b/Strategic/Assignments.cpp index c7cf881d..a10635dc 100644 --- a/Strategic/Assignments.cpp +++ b/Strategic/Assignments.cpp @@ -8746,24 +8746,31 @@ void HandlePrison( INT16 sMapX, INT16 sMapY, INT8 bZ ) { FLOAT prisonertoguardratio = 1.0f; if ( prisonguardvalue ) - prisonertoguardratio = (FLOAT)(prisonerriotvalue / prisonguardvalue); + prisonertoguardratio = (FLOAT)prisonerriotvalue / (FLOAT)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 INT16 escapedprisoners[PRISONER_MAX] = {0}; - for (int i = PRISONER_ADMIN; i < PRISONER_MAX; ++i ) - escapedprisoners[i] = min( Random( aPrisoners[i] * prisonertoguardratio ), aPrisoners[i] ); + INT16 sTotalEscapedPrisoners = 0; + for (int i = PRISONER_ADMIN; i < PRISONER_MAX; ++i) + { + escapedprisoners[i] = min(Random(1 + aPrisoners[i] * prisonertoguardratio), aPrisoners[i]); + sTotalEscapedPrisoners += escapedprisoners[i]; + } - // 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] ); + if (sTotalEscapedPrisoners > 0) + { + // add enemies (PRISONER_CIVILIAN just flee) + pSectorInfo->ubNumTroops = min(255, pSectorInfo->ubNumTroops + escapedprisoners[PRISONER_REGULAR]); + pSectorInfo->ubNumElites = min(255, pSectorInfo->ubNumElites + escapedprisoners[PRISONER_ELITE] + escapedprisoners[PRISONER_OFFICER] + escapedprisoners[PRISONER_GENERAL]); + pSectorInfo->ubNumAdmins = min(255, pSectorInfo->ubNumAdmins + escapedprisoners[PRISONER_ADMIN]); - // reduce prisoner count! - // we have to change the sign - for ( int i = PRISONER_ADMIN; i < PRISONER_MAX; ++i ) - escapedprisoners[i] = -escapedprisoners[i]; + // reduce prisoner count! + // we have to change the sign + for (int i = PRISONER_ADMIN; i < PRISONER_MAX; ++i) + escapedprisoners[i] = -escapedprisoners[i]; - ChangeNumberOfPrisoners( pSectorInfo, escapedprisoners ); + ChangeNumberOfPrisoners(pSectorInfo, escapedprisoners); + } ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_RIOT], wSectorName ); }