Implement multiselection for contract renewal

This commit is contained in:
Asdow
2024-11-09 20:23:38 +02:00
parent 2b024d63c6
commit fdd6859726
3 changed files with 273 additions and 37 deletions
+181 -35
View File
@@ -560,8 +560,6 @@ void HandleShadingOfLinesForSnitchSectorMenu( void );
// Flugente: prisoner menu
void HandleShadingOfLinesForPrisonerMenu( void );
// post message about contract
void PostContractMessage( SOLDIERTYPE *pCharacter, INT32 iContract );
BOOLEAN DisplayVehicleMenu( SOLDIERTYPE *pSoldier );
BOOLEAN DisplayRepairMenu( SOLDIERTYPE *pSoldier );
@@ -12879,40 +12877,69 @@ void ContractMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason )
switch( iValue )
{
case( CONTRACT_MENU_DAY ):
MercContractHandling( pSoldier, CONTRACT_EXTEND_1_DAY );
PostContractMessage( pSoldier, CONTRACT_EXTEND_1_DAY );
case( CONTRACT_MENU_DAY ):
if (gSelectedSoldiers.size() > 0)
{
for (size_t i=0; i < gSelectedSoldiers.size(); ++i)
{
pSoldier = gSelectedSoldiers[i];
MercContractHandling(pSoldier, CONTRACT_EXTEND_1_DAY);
}
}
else
{
MercContractHandling( pSoldier, CONTRACT_EXTEND_1_DAY );
}
fOkToClose = TRUE;
break;
case( CONTRACT_MENU_WEEK ):
MercContractHandling( pSoldier, CONTRACT_EXTEND_1_WEEK );
PostContractMessage( pSoldier, CONTRACT_EXTEND_1_WEEK );
if (gSelectedSoldiers.size() > 0)
{
for (size_t i = 0; i < gSelectedSoldiers.size(); ++i)
{
pSoldier = gSelectedSoldiers[i];
MercContractHandling(pSoldier, CONTRACT_EXTEND_1_WEEK);
}
}
else
{
MercContractHandling(pSoldier, CONTRACT_EXTEND_1_WEEK);
}
fOkToClose = TRUE;
break;
case( CONTRACT_MENU_TWO_WEEKS ):
MercContractHandling( pSoldier, CONTRACT_EXTEND_2_WEEK );
PostContractMessage( pSoldier, CONTRACT_EXTEND_2_WEEK );
if (gSelectedSoldiers.size() > 0)
{
for (size_t i = 0; i < gSelectedSoldiers.size(); ++i)
{
pSoldier = gSelectedSoldiers[i];
MercContractHandling(pSoldier, CONTRACT_EXTEND_2_WEEK);
}
}
else
{
MercContractHandling(pSoldier, CONTRACT_EXTEND_2_WEEK);
}
fOkToClose = TRUE;
break;
case( CONTRACT_MENU_TERMINATE ):
gpDismissSoldier = pSoldier;
gpDismissSoldier = pSoldier;
// If in the renewal sequence.. do right away...
// else put up requester.
if ( gfInContractMenuFromRenewSequence )
{
MercDismissConfirmCallBack( MSG_BOX_RETURN_YES );
}
else
{
// The game should be unpaused when this message box disappears
UnPauseGame();
DoMapMessageBox( MSG_BOX_BASIC_STYLE, gzLateLocalizedString[ 48 ], MAP_SCREEN, MSG_BOX_FLAG_YESNO, MercDismissConfirmCallBack );
}
fOkToClose = TRUE;
// If in the renewal sequence.. do right away...
// else put up requester.
if ( gfInContractMenuFromRenewSequence )
{
MercDismissConfirmCallBack( MSG_BOX_RETURN_YES );
}
else
{
// The game should be unpaused when this message box disappears
UnPauseGame();
DoMapMessageBox( MSG_BOX_BASIC_STYLE, gzLateLocalizedString[ 48 ], MAP_SCREEN, MSG_BOX_FLAG_YESNO, MercDismissConfirmCallBack );
}
fOkToClose = TRUE;
break;
}
@@ -12929,14 +12956,13 @@ void ContractMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason )
fGlowContractRegion = FALSE;
fShowContractMenu = FALSE;
// dirty region
// dirty region
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
fCharacterInfoPanelDirty = TRUE;
gfRenderPBInterface = TRUE;
gfRenderPBInterface = TRUE;
}
return;
}
@@ -14723,14 +14749,6 @@ void HandleShadingOfLinesForSquadMenu( void )
}
void PostContractMessage( SOLDIERTYPE *pCharacter, INT32 iContract )
{
// send a message stating that offer of contract extension made
//MapScreenMessage(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Offered to extend %s's contract by another %s.", pCharacter->GetName(), pContractExtendStrings[ iContract ] );
return;
}
BOOLEAN DisplayVehicleMenu( SOLDIERTYPE *pSoldier )
{
BOOLEAN fVehiclePresent=FALSE;
@@ -15294,6 +15312,134 @@ void CreateContractBox( SOLDIERTYPE *pCharacter )
}
void CreateContractBoxMultiSelect(INT32 DailySalaries, INT32 WeeklySalaries, INT32 BiweeklySalaries)
{
UINT32 hStringHandle;
UINT32 uiCounter;
CHAR16 sString[50];
CHAR16 sDollarString[50];
// rebuild contractbox for this merc
RemoveBox(ghContractBox);
ghContractBox = -1;
fShowContractMenu = TRUE;
ContractPosition.iX = (SCREEN_WIDTH - INTERFACE_WIDTH) / 2 + OrigContractPosition.iX;
ContractPosition.iY = yResOffset + OrigContractPosition.iY;
if (giBoxY != 0)
{
ContractPosition.iX = giBoxY;
}
CreatePopUpBox(&ghContractBox, ContractDimensions, ContractPosition, (POPUP_BOX_FLAG_CLIP_TEXT | POPUP_BOX_FLAG_RESIZE));
SetBoxBuffer(ghContractBox, FRAME_BUFFER);
SetBorderType(ghContractBox, guiPOPUPBORDERS);
SetBackGroundSurface(ghContractBox, guiPOPUPTEX);
SetMargins(ghContractBox, 6, 6, 4, 4);
SetLineSpace(ghContractBox, 2);
// set current box to this one
SetCurrentBox(ghContractBox);
// not null character?
//if (pCharacter != NULL)
{
for (uiCounter = 0; uiCounter < MAX_CONTRACT_MENU_STRING_COUNT; uiCounter++)
{
switch (uiCounter)
{
case(CONTRACT_MENU_CURRENT_FUNDS):
/*
// add current balance after title string
swprintf( sDollarString, L"%d", LaptopSaveInfo.iCurrentBalance);
InsertCommasForDollarFigure( sDollarString );
InsertDollarSignInToString( sDollarString );
swprintf( sString, L"%s %s", pContractStrings[uiCounter], sDollarString );
AddMonoString(&hStringHandle, sString);
*/
AddMonoString(&hStringHandle, pContractStrings[uiCounter]);
break;
case(CONTRACT_MENU_DAY):
//if (pCharacter->ubWhatKindOfMercAmI != MERC_TYPE__AIM_MERC)
//{
// swprintf(sDollarString, L"%d", 0);
//}
//else
{
swprintf(sDollarString, L"%d", DailySalaries);
}
InsertCommasForDollarFigure(sDollarString);
InsertDollarSignInToString(sDollarString);
swprintf(sString, L"%s ( %s )", pContractStrings[uiCounter], sDollarString);
AddMonoString(&hStringHandle, sString);
break;
case(CONTRACT_MENU_WEEK):
//if (pCharacter->ubWhatKindOfMercAmI != MERC_TYPE__AIM_MERC)
//{
// swprintf(sDollarString, L"%d", 0);
//}
//else
{
swprintf(sDollarString, L"%d", WeeklySalaries);
}
InsertCommasForDollarFigure(sDollarString);
InsertDollarSignInToString(sDollarString);
swprintf(sString, L"%s ( %s )", pContractStrings[uiCounter], sDollarString);
AddMonoString(&hStringHandle, sString);
break;
case(CONTRACT_MENU_TWO_WEEKS):
//if (pCharacter->ubWhatKindOfMercAmI != MERC_TYPE__AIM_MERC)
//{
// swprintf(sDollarString, L"%d", 0);
//}
//else
{
swprintf(sDollarString, L"%d", BiweeklySalaries);
}
InsertCommasForDollarFigure(sDollarString);
InsertDollarSignInToString(sDollarString);
swprintf(sString, L"%s ( %s )", pContractStrings[uiCounter], sDollarString);
AddMonoString(&hStringHandle, sString);
break;
default:
AddMonoString(&hStringHandle, pContractStrings[uiCounter]);
break;
}
UnHighLightLine(hStringHandle);
}
}
SetBoxFont(ghContractBox, MAP_SCREEN_FONT);
SetBoxHighLight(ghContractBox, FONT_WHITE);
SetBoxForeground(ghContractBox, FONT_LTGREEN);
SetBoxBackground(ghContractBox, FONT_BLACK);
// shaded color..for darkened text
SetBoxShade(ghContractBox, FONT_GRAY7);
//if (pCharacter != NULL)
{
// now set the color for the current balance value
SetBoxLineForeground(ghContractBox, 0, FONT_YELLOW);
}
// resize box to text
ResizeBoxToText(ghContractBox);
fTeamPanelDirty = TRUE;
fCharacterInfoPanelDirty = TRUE;
}
void CreateAttributeBox( void )
{
UINT32 hStringHandle;
+89 -1
View File
@@ -131,6 +131,8 @@
#include "LuaInitNPCs.h"
#endif
std::vector<SOLDIERTYPE*> gSelectedSoldiers{};
// Flugente: militia movement
// plot
@@ -790,6 +792,7 @@ void InterruptTimeForMenus( void );
void CreateAttributeBox( void );
void CreateVehicleBox( void );
void CreateContractBox( SOLDIERTYPE *pCharacter );
void CreateContractBoxMultiSelect(INT32 DailySalaries, INT32 WeeklySalaries, INT32 BiweeklySalaries);
void CreateAssignmentsBox( void );
void CreateTrainingBox( void );
void CreateMercRemoveAssignBox( void );
@@ -12014,6 +12017,67 @@ void TeamListSleepRegionMvtCallBack( MOUSE_REGION *pRegion, INT32 iReason )
}
static void HandleSelectedMercsContract()
{
INT32 iCounter = 0;
UINT8 ubNumberOfSelectedSoldiers = 0;
INT32 DailySalaries = 0;
INT32 WeeklySalaries = 0;
INT32 BiweeklySalaries = 0;
SOLDIERTYPE* pSoldier = nullptr;
gSelectedSoldiers.clear();
for (iCounter = 0; iCounter < giMAXIMUM_NUMBER_OF_PLAYER_SLOTS; ++iCounter)
{
pSoldier = nullptr;
// if the current character in the list is valid...then grab soldier pointer for the character
if (gCharactersList[iCounter].fValid)
{
// get the soldier pointer
pSoldier = &Menptr[gCharactersList[iCounter].usSolID];
if (pSoldier->bActive == FALSE)
{
continue;
}
if (IsEntryInSelectedListSet((INT8)iCounter) == FALSE)
{
continue;
}
if (CanExtendContractForCharSlot((INT8)iCounter))
{
// up the total number of soldiers
gSelectedSoldiers.push_back(pSoldier);
ubNumberOfSelectedSoldiers++;
DailySalaries += gMercProfiles[pSoldier->ubProfile].sSalary;
WeeklySalaries += gMercProfiles[pSoldier->ubProfile].uiWeeklySalary;
BiweeklySalaries += gMercProfiles[pSoldier->ubProfile].uiBiWeeklySalary;
bSelectedContractChar = bSelectedInfoChar;
giContractHighLine = bSelectedContractChar;
}
}
}
if (ubNumberOfSelectedSoldiers > 1)
{
for (size_t i = 0; i < ubNumberOfSelectedSoldiers; i++)
{
CheckIfSalaryIncreasedAndSayQuote(gSelectedSoldiers[i], false);
}
CreateContractBoxMultiSelect(DailySalaries, WeeklySalaries, BiweeklySalaries);
}
else if (ubNumberOfSelectedSoldiers == 1)
{
RequestContractMenu();
}
}
void TeamListContractRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
{
@@ -12027,6 +12091,7 @@ void TeamListContractRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
// marke strogg more mercs must add skipped mercs FIRSTmercTOdisplay
iValue = MSYS_GetRegionUserData( pRegion, 0 );
#if 0
if( gCharactersList[ iValue ].fValid == TRUE && ValidSelectableCharForNextOrPrev(iValue + FIRSTmercTOdisplay))
{
if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
@@ -12047,7 +12112,29 @@ void TeamListContractRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason )
ContractRegionBtnCallback( pRegion, iReason );
}
#else
if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
{
if ((gCharactersList[iValue + FIRSTmercTOdisplay].fValid == TRUE))
{
// HEADROCK HAM B2.8: Added argument for multi-select entire squads
if (HandleCtrlOrShiftInTeamPanel((INT8)iValue + FIRSTmercTOdisplay, FALSE))
{
return;
}
// reset list if the clicked character isn't also selected
ChangeSelectedInfoChar((INT8)iValue + FIRSTmercTOdisplay, (BOOLEAN)(IsEntryInSelectedListSet((INT8)iValue + FIRSTmercTOdisplay) == FALSE));
HandleSelectedMercsContract();
}
else
{
// reset selected characters
ResetAllSelectedCharacterModes();
}
}
#endif
if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
{
// reset selected characters
@@ -12741,7 +12828,8 @@ void HandleShadingOfLinesForContractMenu( void )
}
// if THIS soldier is involved in a fight (dismissing in a hostile sector IS ok...)
if( ( gTacticalStatus.uiFlags & INCOMBAT ) && pSoldier->bInSector )
// Also if we have multiple mercs selected, disable terminating contracts
if( gSelectedSoldiers.size() > 0 || (( gTacticalStatus.uiFlags & INCOMBAT ) && pSoldier->bInSector ))
{
ShadeStringInBox( ghContractBox, CONTRACT_MENU_TERMINATE );
}
+3 -1
View File
@@ -134,6 +134,8 @@ extern BOOLEAN gfInChangeArrivalSectorMode;
extern BOOLEAN gfSkyriderEmptyHelpGiven;
extern std::vector<SOLDIERTYPE*> gSelectedSoldiers;
BOOLEAN SetInfoChar(UINT16 ubID);
void EndMapScreen( BOOLEAN fDuringFade );
@@ -228,4 +230,4 @@ void RetreatBandageCallback( UINT8 ubResult );
bool isWidescreenUI(void);
#endif
#endif