From 9d8e5a4c3a64bc39b6e218134bb6a78379011ec8 Mon Sep 17 00:00:00 2001 From: Flugente Date: Sat, 28 Feb 2015 22:35:30 +0000 Subject: [PATCH] - New prisoner class: Civilians can be interrogated. Does not work for profile-based charcters. - Capturing civilians is possible if their faction has 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 --- GameSettings.cpp | 4 +- Strategic/Assignments.cpp | 98 ++++++++++++------- Strategic/Campaign Types.h | 2 +- .../Map Screen Interface TownMine Info.cpp | 13 ++- Strategic/Map Screen Interface.h | 1 + Strategic/strategicmap.cpp | 4 +- Tactical/Handle Items.cpp | 2 +- Tactical/Interface.h | 1 + Tactical/Overhead.cpp | 67 +++++++++++-- Tactical/Soldier Control.cpp | 32 ++++-- Tactical/Soldier Control.h | 6 +- Tactical/UI Cursors.cpp | 2 +- Tactical/XML_CivGroupNames.cpp | 7 ++ Utils/Text.h | 2 + Utils/_ChineseText.cpp | 22 ++++- Utils/_DutchText.cpp | 22 ++++- Utils/_EnglishText.cpp | 22 ++++- Utils/_FrenchText.cpp | 22 ++++- Utils/_GermanText.cpp | 24 ++++- Utils/_ItalianText.cpp | 23 ++++- Utils/_PolishText.cpp | 22 ++++- Utils/_RussianText.cpp | 22 ++++- 22 files changed, 321 insertions(+), 99 deletions(-) diff --git a/GameSettings.cpp b/GameSettings.cpp index 2836cd4f..aca247bb 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -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; diff --git a/Strategic/Assignments.cpp b/Strategic/Assignments.cpp index 2018fc0b..d4894f7c 100644 --- a/Strategic/Assignments.cpp +++ b/Strategic/Assignments.cpp @@ -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 ) diff --git a/Strategic/Campaign Types.h b/Strategic/Campaign Types.h index a0290ecf..e9b9b7a7 100644 --- a/Strategic/Campaign Types.h +++ b/Strategic/Campaign Types.h @@ -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, diff --git a/Strategic/Map Screen Interface TownMine Info.cpp b/Strategic/Map Screen Interface TownMine Info.cpp index e2311a44..49ee7fef 100644 --- a/Strategic/Map Screen Interface TownMine Info.cpp +++ b/Strategic/Map Screen Interface TownMine Info.cpp @@ -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 ); + } + } } } diff --git a/Strategic/Map Screen Interface.h b/Strategic/Map Screen Interface.h index 56939de5..fba03a02 100644 --- a/Strategic/Map Screen Interface.h +++ b/Strategic/Map Screen Interface.h @@ -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, }; diff --git a/Strategic/strategicmap.cpp b/Strategic/strategicmap.cpp index 4f03d099..13aa5dca 100644 --- a/Strategic/strategicmap.cpp +++ b/Strategic/strategicmap.cpp @@ -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; diff --git a/Tactical/Handle Items.cpp b/Tactical/Handle Items.cpp index 32ebc321..62f614a4 100644 --- a/Tactical/Handle Items.cpp +++ b/Tactical/Handle Items.cpp @@ -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; diff --git a/Tactical/Interface.h b/Tactical/Interface.h index e2664d73..fd04c715 100644 --- a/Tactical/Interface.h +++ b/Tactical/Interface.h @@ -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; diff --git a/Tactical/Overhead.cpp b/Tactical/Overhead.cpp index 9658d0f1..1d445dab 100644 --- a/Tactical/Overhead.cpp +++ b/Tactical/Overhead.cpp @@ -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 diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index bb08cc18..18a72b24 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -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); diff --git a/Tactical/Soldier Control.h b/Tactical/Soldier Control.h index 49089a47..d2edea14 100644 --- a/Tactical/Soldier Control.h +++ b/Tactical/Soldier Control.h @@ -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(); diff --git a/Tactical/UI Cursors.cpp b/Tactical/UI Cursors.cpp index 6eab2c37..45aef828 100644 --- a/Tactical/UI Cursors.cpp +++ b/Tactical/UI Cursors.cpp @@ -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 ); } diff --git a/Tactical/XML_CivGroupNames.cpp b/Tactical/XML_CivGroupNames.cpp index dba1d52d..1ba9a141 100644 --- a/Tactical/XML_CivGroupNames.cpp +++ b/Tactical/XML_CivGroupNames.cpp @@ -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; diff --git a/Utils/Text.h b/Utils/Text.h index f6797711..b6f61d06 100644 --- a/Utils/Text.h +++ b/Utils/Text.h @@ -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 }; diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 64cd1b2e..04ca4be0 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -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[]= diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index adad36e2..202407ad 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -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 diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index c7e1cd19..12c44360 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -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[]= diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index 6cf88a32..6ebb6ed9 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -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[]= diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 4391f19c..7453b0be 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -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[]= diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index f16af92c..4cfa7e0b 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -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 diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index a96bf675..f87b99df 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -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 diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index b227dbf7..0fcc6466 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -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[]=