diff --git a/Laptop/BaseTable.cpp b/Laptop/BaseTable.cpp index e1c8ec37..7b21984b 100644 --- a/Laptop/BaseTable.cpp +++ b/Laptop/BaseTable.cpp @@ -657,12 +657,19 @@ TestTable::Display( ) UINT32 scrollareaheigth = (scrollbarheigth * shownentries) / totalentries; UINT32 areabegin = (scrollbarheigth * mFirstEntryShown) / totalentries; + ColorFillVideoSurfaceArea( FRAME_BUFFER, + GetX( ) + GetWidth( ) - SCROLLARROW_WIDTH - 2, + GetY( ) + SCROLLARROW_HEIGTH, + GetX( ) + GetWidth( ) - 2, + GetY( ) + SCROLLARROW_HEIGTH + GetHeight( ) - SCROLLARROW_HEIGTH, + GetColorLineShadow( ) ); + ColorFillVideoSurfaceArea( FRAME_BUFFER, GetX( ) + GetWidth( ) - SCROLLARROW_WIDTH - 2, GetY( ) + SCROLLARROW_HEIGTH + areabegin, GetX( ) + GetWidth( ) - 2, GetY( ) + SCROLLARROW_HEIGTH + areabegin + scrollareaheigth, - Get16BPPColor( FROMRGB( 20, 250, 50 ) ) ); + GetColorLine() ); CreateScrollAreaButtons( ); } diff --git a/Laptop/MilitiaWebsite.cpp b/Laptop/MilitiaWebsite.cpp index c1bf0f18..416a9d80 100644 --- a/Laptop/MilitiaWebsite.cpp +++ b/Laptop/MilitiaWebsite.cpp @@ -238,7 +238,7 @@ enum InidivualMilitiaOriginState IMOS_DEFECTOR }; -CHAR16 gInidividualMilitiaWebsiteSectorNamesstr[256][10]; +CHAR16 gInidividualMilitiaWebsiteSectorNamesstr[256][128]; std::vector > GetMilitiaSectorDropVector( ) { @@ -256,7 +256,7 @@ std::vector > GetMilitiaSectorDropVector( ) for ( std::set::iterator it = sectorset.begin( ); it != sectorset.end(); ++it ) { - GetShortSectorString( SECTORX( (*it) ), SECTORY( (*it) ), gInidividualMilitiaWebsiteSectorNamesstr[(*it)] ); + GetSectorIDString( SECTORX( (*it) ), SECTORY( (*it) ), 0, gInidividualMilitiaWebsiteSectorNamesstr[(*it)], FALSE ); sectorvector.push_back( std::make_pair( (INT16)(*it), gInidividualMilitiaWebsiteSectorNamesstr[(*it)] ) ); } diff --git a/Laptop/merccompare.cpp b/Laptop/merccompare.cpp index 29960a1b..09193653 100644 --- a/Laptop/merccompare.cpp +++ b/Laptop/merccompare.cpp @@ -921,21 +921,36 @@ BOOLEAN DisplayMercData( UINT8 usProfileA, UINT8 usProfileB ) // draw the final verdict val = SoldierRelation( pSoldierA, pSoldierB ); + BOOLEAN addhint1 = ( val >= BUDDY_OPINION || val <= HATED_OPINION ); swprintf( sText, gzMercCompare[15] ); DisplayWrappedString( usPosX + MCA_NUMBEROFFSET - 10, usPosY, LAPTOP_SCREEN_LR_X - LAPTOP_SCREEN_UL_X, 2, CAMPHIS_FONT_MED, MERCOMP_FONT_COLOR, sText, FONT_MCOLOR_BLACK, FALSE, 0 ); usPosY += 12; - swprintf( sText, L"%d", val ); + if ( addhint1 ) + swprintf( sText, L"%d * ", val ); + else + swprintf( sText, L"%d", val ); usPosY += DisplayWrappedString( usPosX + MCA_NUMBEROFFSET, usPosY, LAPTOP_SCREEN_LR_X - LAPTOP_SCREEN_UL_X, 2, CAMPHIS_FONT_MED, (val > 0) ? FONT_MCOLOR_LTGREEN : (val < 0) ? FONT_MCOLOR_LTRED : MERCOMP_FONT_COLOR, sText, FONT_MCOLOR_BLACK, FALSE, 0 ); val = SoldierRelation( pSoldierB, pSoldierA ); + BOOLEAN addhint2 = (val >= BUDDY_OPINION || val <= HATED_OPINION); swprintf( sText, gzMercCompare[15] ); DisplayWrappedString( usPosX + MCA_SIDEOFFSET + MCA_NUMBEROFFSET - 10, usPosY2, LAPTOP_SCREEN_LR_X - LAPTOP_SCREEN_UL_X, 2, CAMPHIS_FONT_MED, MERCOMP_FONT_COLOR, sText, FONT_MCOLOR_BLACK, FALSE, 0 ); usPosY2 += 12; - swprintf( sText, L"%d", val ); + if ( addhint2 ) + swprintf( sText, L"%d * ", val ); + else + swprintf( sText, L"%d", val ); usPosY2 += DisplayWrappedString( usPosX + MCA_SIDEOFFSET + MCA_NUMBEROFFSET, usPosY2, LAPTOP_SCREEN_LR_X - LAPTOP_SCREEN_UL_X, 2, CAMPHIS_FONT_MED, (val > 0) ? FONT_MCOLOR_LTGREEN : (val < 0) ? FONT_MCOLOR_LTRED : MERCOMP_FONT_COLOR, sText, FONT_MCOLOR_BLACK, FALSE, 0 ); + // add a note that opinion is always between HATED_OPINION and BUDDY_OPINION otherwise players will shout 'bug!' + if ( addhint1 || addhint2 ) + { + swprintf( sText, gzMercCompare[17], HATED_OPINION, BUDDY_OPINION ); + DisplayWrappedString( usPosX, LAPTOP_SCREEN_LR_Y, LAPTOP_SCREEN_LR_X - LAPTOP_SCREEN_UL_X, 2, FONT10ARIAL, MERCOMP_FONT_COLOR, sText, FONT_MCOLOR_BLACK, FALSE, 0 ); + } + return TRUE; } diff --git a/MessageBoxScreen.cpp b/MessageBoxScreen.cpp index a7a239bf..7d5f7d0e 100644 --- a/MessageBoxScreen.cpp +++ b/MessageBoxScreen.cpp @@ -250,7 +250,7 @@ INT32 DoMessageBox( UINT8 ubStyle, const STR16 zString, UINT32 uiExitScreen, UIN if ( gMsgBox.usFlags & MSG_BOX_FLAG_IMAGE ) heightincrease = 130; - if ( usFlags & MSG_BOX_FLAG_DROPDOWN ) + if ( usFlags & ( MSG_BOX_FLAG_DROPDOWN_1 | MSG_BOX_FLAG_DROPDOWN_2 ) ) heightincrease = 130; UINT16 usMBWidth=MSGBOX_DEFAULT_WIDTH; @@ -919,9 +919,13 @@ INT32 DoMessageBox( UINT8 ubStyle, const STR16 zString, UINT32 uiExitScreen, UIN } } - if ( gMsgBox.usFlags & MSG_BOX_FLAG_DROPDOWN ) + if ( gMsgBox.usFlags & MSG_BOX_FLAG_DROPDOWN_1 ) { DropDownTemplate::getInstance( ).Create( (INT16)(gMsgBox.sX + 15), (INT16)(gMsgBox.sY + 35) ); + } + + if ( gMsgBox.usFlags & MSG_BOX_FLAG_DROPDOWN_2 ) + { DropDownTemplate::getInstance( ).Create( (INT16)(gMsgBox.sX + 15), (INT16)(gMsgBox.sY + 66) ); } @@ -954,27 +958,30 @@ template<> void DropDownTemplate::SetRefresh() { INT16 box1key = DropDownTemplate::getInstance( ).GetSelectedEntryKey( ); - std::vector > dropdownvector_2 = GetTileSetIndexVector( box1key ); - - DropDownTemplate::getInstance( ).SetEntries( dropdownvector_2 ); - - if ( !dropdownvector_2.empty( ) ) + if ( gMsgBox.usFlags & MSG_BOX_FLAG_DROPDOWN_2 ) { - BOOLEAN found = FALSE; - for ( std::vector >::iterator it = dropdownvector_2.begin( ); it != dropdownvector_2.end( ); ++it ) + std::vector > dropdownvector_2 = GetTileSetIndexVector( box1key ); + + DropDownTemplate::getInstance( ).SetEntries( dropdownvector_2 ); + + if ( !dropdownvector_2.empty( ) ) { - if ( (*it).first == guiMessageBoxImageIndex ) + BOOLEAN found = FALSE; + for ( std::vector >::iterator it = dropdownvector_2.begin( ); it != dropdownvector_2.end( ); ++it ) { - found = TRUE; - break; + if ( (*it).first == guiMessageBoxImageIndex ) + { + found = TRUE; + break; + } } + + if ( !found ) + guiMessageBoxImageIndex = dropdownvector_2[0].first; } - if ( !found ) - guiMessageBoxImageIndex = dropdownvector_2[0].first; + DropDownTemplate::getInstance( ).SetSelectedEntryKey( guiMessageBoxImageIndex ); } - - DropDownTemplate::getInstance( ).SetSelectedEntryKey( guiMessageBoxImageIndex ); if ( gMsgBox.usFlags & MSG_BOX_FLAG_IMAGE ) { @@ -1249,9 +1256,13 @@ UINT32 ExitMsgBox( INT8 ubExitCode ) DeleteVideoObjectFromIndex( guiMessageBoxImage ); } - if ( gMsgBox.usFlags & MSG_BOX_FLAG_DROPDOWN ) + if ( gMsgBox.usFlags & MSG_BOX_FLAG_DROPDOWN_1 ) { DropDownTemplate::getInstance( ).Destroy( ); + } + + if ( gMsgBox.usFlags & MSG_BOX_FLAG_DROPDOWN_2 ) + { DropDownTemplate::getInstance( ).Destroy( ); } @@ -1666,9 +1677,13 @@ UINT32 MessageBoxScreenHandle( ) BltVideoObject( FRAME_BUFFER, hIconHandle, guiMessageBoxImageIndex, gMsgBox.sX + 70, gMsgBox.sY + 90, VO_BLT_SRCTRANSPARENCY, NULL ); } - if ( gMsgBox.usFlags & MSG_BOX_FLAG_DROPDOWN ) + if ( gMsgBox.usFlags & MSG_BOX_FLAG_DROPDOWN_1 ) { DropDownTemplate::getInstance( ).Display( ); + } + + if ( gMsgBox.usFlags & MSG_BOX_FLAG_DROPDOWN_2 ) + { DropDownTemplate::getInstance( ).Display( ); } diff --git a/MessageBoxScreen.h b/MessageBoxScreen.h index 8369959e..fa34152e 100644 --- a/MessageBoxScreen.h +++ b/MessageBoxScreen.h @@ -23,8 +23,9 @@ #define MSG_BOX_FLAG_GENERIC_EIGHT_BUTTONS 0x00004000 // Displays eight numbered buttons with definable labels #define MSG_BOX_FLAG_GENERIC_SIXTEEN_BUTTONS 0x00008000 // Displays sixteen numbered buttons with definable labels -#define MSG_BOX_FLAG_DROPDOWN 0x00010000 // Displays an aditional dropdown box -#define MSG_BOX_FLAG_IMAGE 0x00020000 // Displays an image +#define MSG_BOX_FLAG_DROPDOWN_1 0x00010000 // Displays an additional dropdown box +#define MSG_BOX_FLAG_DROPDOWN_2 0x00020000 // Displays another additional dropdown box +#define MSG_BOX_FLAG_IMAGE 0x00040000 // Displays an image // message box return codes #define MSG_BOX_RETURN_OK 1 // ENTER or on OK button diff --git a/Tactical/Overhead.cpp b/Tactical/Overhead.cpp index 224efcb7..6ff58d7c 100644 --- a/Tactical/Overhead.cpp +++ b/Tactical/Overhead.cpp @@ -112,6 +112,7 @@ #include "Inventory Choosing.h" // added by Flugente for TakeMilitiaEquipmentfromSector() #include "CampaignStats.h" // added by Flugente #include "DynamicDialogue.h" // added by Flugente for HandleDynamicOpinions() +#include "DropDown.h" // added by Flugente #endif #include "connect.h" @@ -6707,7 +6708,7 @@ void DeathNoMessageTimerCallback( ) } // get a vector of all player-controlled sectors with prison facilities. It is assumed that a sector has max. one of these -BOOLEAN GetPlayerControlledPrisonList( std::vector& arSectorIDVector ) +BOOLEAN GetPlayerControlledPrisonList( std::vector& arSectorIDVector ) { arSectorIDVector.clear(); @@ -6755,26 +6756,8 @@ INT16 gsNumPrisoner[PRISONER_MAX] = {0}; void PrisonerMessageBoxCallBack( UINT8 ubExitValue ) { - UINT32 usSectorID = 0; - - // Get a list of all available prisons, and create a fitting messagebox - std::vector prisonsectorvector; - if ( GetPlayerControlledPrisonList( prisonsectorvector ) ) - { - UINT8 cnt = 1; - std::vector::iterator itend = prisonsectorvector.end( ); - for ( std::vector::iterator it = prisonsectorvector.begin( ); it != itend; ++it ) - { - if ( ubExitValue == cnt ) - { - usSectorID = (*it); - break; - } - - ++cnt; - } - } - + UINT8 usSectorID = (UINT8)(DropDownTemplate::getInstance( ).GetSelectedEntryKey( )); + // if sector is still not set, then we did not select one - release prisoners if ( usSectorID == 0 ) { @@ -6796,8 +6779,8 @@ void PrisonerMessageBoxCallBack( UINT8 ubExitValue ) ChangeNumberOfPrisoners( pPrisonSectorInfo, gsNumPrisoner ); - CHAR16 wString[64]; - GetShortSectorString( SECTORX( usSectorID ), SECTORY( usSectorID ), wString ); + CHAR16 wString[128]; + GetSectorIDString( SECTORX( usSectorID ), SECTORY( usSectorID ), 0, wString, TRUE ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_SENTTOSECTOR], prisonerstobemoved, wString ); } } @@ -6813,6 +6796,9 @@ void PrisonerMessageBoxCallBack( UINT8 ubExitValue ) } } + +CHAR16 gPrisonSectorNamesStr[256][128]; + void RemoveCapturedEnemiesFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ ) { SOLDIERTYPE* pTeamSoldier; @@ -6941,35 +6927,31 @@ void RemoveCapturedEnemiesFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ ) AllSoldiersLookforItems( TRUE ); // Get a list of all available prisons, and create a fitting messagebox - std::vector prisonsectorvector; + std::vector prisonsectorvector; if ( GetPlayerControlledPrisonList( prisonsectorvector ) ) { - UINT8 cnt = 0; - std::vector::iterator itend = prisonsectorvector.end( ); - for ( std::vector::iterator it = prisonsectorvector.begin( ); it != itend; ++it ) - { - UINT32 usSectorID = (*it); - CHAR16 zShortTownIDString[50]; - - GetShortSectorString( SECTORX( usSectorID ), SECTORY( usSectorID ), zShortTownIDString ); - - // Set string for generic button - swprintf( gzUserDefinedButton[cnt++], L"%s", zShortTownIDString ); - - if ( cnt >= 7 ) - break; - } - - for ( ; cnt < 8; ++cnt ) - { - wcscpy( gzUserDefinedButton[cnt], TacticalStr[PRISONER_LETGO_STR] ); - } - // remember all prisoners... for ( int i = PRISONER_ADMIN; i < PRISONER_MAX; ++i ) gsNumPrisoner[i] = sNumPrisoner[i]; - DoMessageBox( MSG_BOX_BASIC_MEDIUM_BUTTONS, TacticalStr[ PRISONER_DECIDE_STR ], GAME_SCREEN, MSG_BOX_FLAG_GENERIC_EIGHT_BUTTONS, PrisonerMessageBoxCallBack, NULL ); + std::vector > dropdownvector_1; + + std::vector::iterator itend = prisonsectorvector.end( ); + for ( std::vector::iterator it = prisonsectorvector.begin( ); it != itend; ++it ) + { + UINT8 usSectorID = (*it); + + GetSectorIDString( SECTORX( usSectorID ), SECTORY( usSectorID ), 0, gPrisonSectorNamesStr[usSectorID], FALSE ); + + dropdownvector_1.push_back( std::make_pair( (INT16)(usSectorID), gPrisonSectorNamesStr[usSectorID] ) ); + } + + DropDownTemplate::getInstance( ).SetEntries( dropdownvector_1 ); + + CHAR16 sString[256]; + swprintf( sString, TacticalStr[PRISONER_DECIDE_STR], ubNumPrisoners ); + + DoMessageBox( MSG_BOX_BASIC_MEDIUM_BUTTONS, sString, GAME_SCREEN, (MSG_BOX_FLAG_OK | MSG_BOX_FLAG_DROPDOWN_1), PrisonerMessageBoxCallBack, NULL ); } // if we control no prison, we have to let them go... else diff --git a/Tactical/Turn Based Input.cpp b/Tactical/Turn Based Input.cpp index f201b633..1a520f3c 100644 --- a/Tactical/Turn Based Input.cpp +++ b/Tactical/Turn Based Input.cpp @@ -3081,7 +3081,7 @@ void GetKeyboardInput( UINT32 *puiNewEvent ) AddVideoObject( &VObjectDesc, &guiMessageBoxImage ); } - DoMessageBox( MSG_BOX_BASIC_STYLE, text, GAME_SCREEN, (MSG_BOX_FLAG_OK | MSG_BOX_FLAG_DROPDOWN | MSG_BOX_FLAG_IMAGE), FortificationSettingCallBack, NULL ); + DoMessageBox( MSG_BOX_BASIC_STYLE, text, GAME_SCREEN, (MSG_BOX_FLAG_OK | MSG_BOX_FLAG_DROPDOWN_1 | MSG_BOX_FLAG_DROPDOWN_2 | MSG_BOX_FLAG_IMAGE), FortificationSettingCallBack, NULL ); } } else if ( fCtrl ) diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 5110a770..d46f462c 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -3962,8 +3962,8 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = // added by Flugente: decide what to do with prisoners L"你现在没有可用的监狱关押这些俘虏,你不得不放他们走。", //L"You have no prison for these prisoners, you have to let them go", - L"将俘虏送入监狱", //L"Let them go", - L"放俘虏离开这里", + L"Where do you want to send the %d prisoners?", // TODO.Translate + L"Let them go", L"你想要做什么?", L"劝说敌人投降", L"劝降", //L"Offer surrender", @@ -8640,6 +8640,7 @@ STR16 gzMercCompare[] = L"Past grievances", L"____", // 15 L"/", + L"* Opinion is always in [%d; %d]", // TODO.Translate }; // Flugente: Temperature-based text similar to HAM 4's condition-based text. diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 133261f2..b735a110 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -3961,7 +3961,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = // added by Flugente: decide what to do with prisoners L"You have no prison for these prisoners, you have to let them go", - L"Where do you want to send the prisoners?", + L"Where do you want to send the %d prisoners?", // TODO.Translate L"Let them go", L"What do you want to do?", L"Demand surrender", @@ -8653,6 +8653,7 @@ STR16 gzMercCompare[] = L"Past grievances", L"____", // 15 L"/", + L"* Opinion is always in [%d; %d]", // TODO.Translate }; // Flugente: Temperature-based text similar to HAM 4's condition-based text. diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index f123a3a5..8041c9ac 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -3960,7 +3960,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = // added by Flugente: decide what to do with prisoners L"You have no prison for these prisoners, you have to let them go", - L"Where do you want to send the prisoners?", + L"Where do you want to send the %d prisoners?", L"Let them go", L"What do you want to do?", L"Demand surrender", @@ -8638,6 +8638,7 @@ STR16 gzMercCompare[] = L"Past grievances", L"____", // 15 L"/", + L"* Opinion is always in [%d; %d]", }; // Flugente: Temperature-based text similar to HAM 4's condition-based text. diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index fbeba069..724a4532 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -3966,7 +3966,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = // added by Flugente: decide what to do with prisoners L"Vous n'avez pas de prison. Vous les laissez partir.", - L"Où voulez-vous envoyer les prisonniers ?", + L"Où voulez-vous envoyer les %d prisonniers ?", L"Les relâcher", L"Voulez-vous proposer ?", L"Leur reddition", @@ -8638,6 +8638,7 @@ STR16 gzMercCompare[] = L"Past grievances", L"____", // 15 L"/", + L"* Opinion is always in [%d; %d]", // TODO.Translate }; // Flugente: Temperature-based text similar to HAM 4's condition-based text. diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 733f4077..18610410 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -3968,7 +3968,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = // added by Flugente: decide what to do with prisoners L"Sie haben kein Gefängnis für die Gefangenen und müssen diese nun laufen lassen", - L"Wohin mit den Gefangenen?", + L"Wohin mit den %d Gefangenen?", L"Freilassen", L"Was möchten Sie tun?", L"Kapitulation fordern", @@ -8468,6 +8468,7 @@ STR16 gzMercCompare[] = L"Past grievances", L"____", // 15 L"/", + L"* Opinion is always in [%d; %d]", // TODO.Translate }; // Flugente: Temperature-based text similar to HAM 4's condition-based text. diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 3a380855..cae4514e 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -3955,7 +3955,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = // added by Flugente: decide what to do with prisoners L"You have no prison for these prisoners, you have to let them go", - L"Where do you want to send the prisoners?", + L"Where do you want to send the %d prisoners?", // TODO.Translate L"Let them go", L"What do you want to do?", L"Demand surrender", @@ -8643,6 +8643,7 @@ STR16 gzMercCompare[] = L"Past grievances", L"____", // 15 L"/", + L"* Opinion is always in [%d; %d]", // TODO.Translate }; // Flugente: Temperature-based text similar to HAM 4's condition-based text. diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index d05005bb..2119ff16 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -3966,7 +3966,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = // added by Flugente: decide what to do with prisoners L"You have no prison for these prisoners, you have to let them go", - L"Where do you want to send the prisoners?", + L"Where do you want to send the %d prisoners?", // TODO.Translate L"Let them go", L"What do you want to do?", L"Demand surrender", @@ -8655,6 +8655,7 @@ STR16 gzMercCompare[] = L"Past grievances", L"____", // 15 L"/", + L"* Opinion is always in [%d; %d]", // TODO.Translate }; // Flugente: Temperature-based text similar to HAM 4's condition-based text. diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index 89be38c5..fe323284 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -3960,7 +3960,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = // added by Flugente: decide what to do with prisoners L"У вас нет тюрьмы для содержания заключённых, придётся отпустить их", - L"В какую тюрьму отправить пленных?", + L"Where do you want to send the %d prisoners?", // TODO.Translate L"Отпустить", L"Что вы хотите сделать?", L"Требовать сдаться", @@ -8638,6 +8638,7 @@ STR16 gzMercCompare[] = L"Затаил обиду", //Past grievances L"____", // 15 L"/", + L"* Opinion is always in [%d; %d]", // TODO.Translate }; // Flugente: Temperature-based text similar to HAM 4's condition-based text.