- colour TestTable scrollbar

- militia website sector filter uses longer names
- prisoner surrender dialogue explains how many prisoners were captured, and allows selecting prison via dropdown selection
- explain soldier relation boundaries on Melody website

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8228 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2016-05-20 22:39:29 +00:00
parent c0d25c3cb7
commit 74bebdd454
15 changed files with 109 additions and 81 deletions
+8 -1
View File
@@ -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( );
}
+2 -2
View File
@@ -238,7 +238,7 @@ enum InidivualMilitiaOriginState
IMOS_DEFECTOR
};
CHAR16 gInidividualMilitiaWebsiteSectorNamesstr[256][10];
CHAR16 gInidividualMilitiaWebsiteSectorNamesstr[256][128];
std::vector<std::pair<INT16, STR16> > GetMilitiaSectorDropVector( )
{
@@ -256,7 +256,7 @@ std::vector<std::pair<INT16, STR16> > GetMilitiaSectorDropVector( )
for ( std::set<UINT8>::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)] ) );
}
+17 -2
View File
@@ -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;
}
+33 -18
View File
@@ -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<DROPDOWNNR_MSGBOX_1>::getInstance( ).Create( (INT16)(gMsgBox.sX + 15), (INT16)(gMsgBox.sY + 35) );
}
if ( gMsgBox.usFlags & MSG_BOX_FLAG_DROPDOWN_2 )
{
DropDownTemplate<DROPDOWNNR_MSGBOX_2>::getInstance( ).Create( (INT16)(gMsgBox.sX + 15), (INT16)(gMsgBox.sY + 66) );
}
@@ -954,27 +958,30 @@ template<> void DropDownTemplate<DROPDOWNNR_MSGBOX_1>::SetRefresh()
{
INT16 box1key = DropDownTemplate<DROPDOWNNR_MSGBOX_1>::getInstance( ).GetSelectedEntryKey( );
std::vector<std::pair<INT16, STR16> > dropdownvector_2 = GetTileSetIndexVector( box1key );
DropDownTemplate<DROPDOWNNR_MSGBOX_2>::getInstance( ).SetEntries( dropdownvector_2 );
if ( !dropdownvector_2.empty( ) )
if ( gMsgBox.usFlags & MSG_BOX_FLAG_DROPDOWN_2 )
{
BOOLEAN found = FALSE;
for ( std::vector<std::pair<INT16, STR16> >::iterator it = dropdownvector_2.begin( ); it != dropdownvector_2.end( ); ++it )
std::vector<std::pair<INT16, STR16> > dropdownvector_2 = GetTileSetIndexVector( box1key );
DropDownTemplate<DROPDOWNNR_MSGBOX_2>::getInstance( ).SetEntries( dropdownvector_2 );
if ( !dropdownvector_2.empty( ) )
{
if ( (*it).first == guiMessageBoxImageIndex )
BOOLEAN found = FALSE;
for ( std::vector<std::pair<INT16, STR16> >::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<DROPDOWNNR_MSGBOX_2>::getInstance( ).SetSelectedEntryKey( guiMessageBoxImageIndex );
}
DropDownTemplate<DROPDOWNNR_MSGBOX_2>::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<DROPDOWNNR_MSGBOX_1>::getInstance( ).Destroy( );
}
if ( gMsgBox.usFlags & MSG_BOX_FLAG_DROPDOWN_2 )
{
DropDownTemplate<DROPDOWNNR_MSGBOX_2>::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<DROPDOWNNR_MSGBOX_1>::getInstance( ).Display( );
}
if ( gMsgBox.usFlags & MSG_BOX_FLAG_DROPDOWN_2 )
{
DropDownTemplate<DROPDOWNNR_MSGBOX_2>::getInstance( ).Display( );
}
+3 -2
View File
@@ -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
+28 -46
View File
@@ -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<UINT32>& arSectorIDVector )
BOOLEAN GetPlayerControlledPrisonList( std::vector<UINT8>& 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<UINT32> prisonsectorvector;
if ( GetPlayerControlledPrisonList( prisonsectorvector ) )
{
UINT8 cnt = 1;
std::vector<UINT32>::iterator itend = prisonsectorvector.end( );
for ( std::vector<UINT32>::iterator it = prisonsectorvector.begin( ); it != itend; ++it )
{
if ( ubExitValue == cnt )
{
usSectorID = (*it);
break;
}
++cnt;
}
}
UINT8 usSectorID = (UINT8)(DropDownTemplate<DROPDOWNNR_MSGBOX_1>::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<UINT32> prisonsectorvector;
std::vector<UINT8> prisonsectorvector;
if ( GetPlayerControlledPrisonList( prisonsectorvector ) )
{
UINT8 cnt = 0;
std::vector<UINT32>::iterator itend = prisonsectorvector.end( );
for ( std::vector<UINT32>::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<std::pair<INT16, STR16> > dropdownvector_1;
std::vector<UINT8>::iterator itend = prisonsectorvector.end( );
for ( std::vector<UINT8>::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<DROPDOWNNR_MSGBOX_1>::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
+1 -1
View File
@@ -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 )
+3 -2
View File
@@ -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.
+2 -1
View File
@@ -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.
+2 -1
View File
@@ -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.
+2 -1
View File
@@ -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.
+2 -1
View File
@@ -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.
+2 -1
View File
@@ -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.
+2 -1
View File
@@ -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.
+2 -1
View File
@@ -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.