diff --git a/Strategic/Assignments.cpp b/Strategic/Assignments.cpp index d68ef0864..ec1410dfa 100644 --- a/Strategic/Assignments.cpp +++ b/Strategic/Assignments.cpp @@ -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; diff --git a/Strategic/mapscreen.cpp b/Strategic/mapscreen.cpp index cac4c6b35..d1bf91a47 100644 --- a/Strategic/mapscreen.cpp +++ b/Strategic/mapscreen.cpp @@ -131,6 +131,8 @@ #include "LuaInitNPCs.h" #endif +std::vector 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 ); } diff --git a/Strategic/mapscreen.h b/Strategic/mapscreen.h index 47ae79364..44deeb259 100644 --- a/Strategic/mapscreen.h +++ b/Strategic/mapscreen.h @@ -134,6 +134,8 @@ extern BOOLEAN gfInChangeArrivalSectorMode; extern BOOLEAN gfSkyriderEmptyHelpGiven; +extern std::vector gSelectedSoldiers; + BOOLEAN SetInfoChar(UINT16 ubID); void EndMapScreen( BOOLEAN fDuringFade ); @@ -228,4 +230,4 @@ void RetreatBandageCallback( UINT8 ubResult ); bool isWidescreenUI(void); -#endif \ No newline at end of file +#endif