diff --git a/Strategic/Assignments.cpp b/Strategic/Assignments.cpp index 2b5facce..b9949f32 100644 --- a/Strategic/Assignments.cpp +++ b/Strategic/Assignments.cpp @@ -814,6 +814,11 @@ BOOLEAN BasicCanCharacterAssignment( SOLDIERTYPE * pSoldier, BOOLEAN fNotInComba return( FALSE ); } + if (pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND) + { + return( FALSE ); + } + return( TRUE ); } @@ -2501,7 +2506,7 @@ BOOLEAN CanCharacterSleep( SOLDIERTYPE *pSoldier, BOOLEAN fExplainWhyNot ) } // POW? - if( pSoldier->bAssignment == ASSIGNMENT_POW || pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) + if( pSoldier->bAssignment == ASSIGNMENT_POW || pSoldier->bAssignment == ASSIGNMENT_MINIEVENT || pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND ) { return( FALSE ); } @@ -2719,7 +2724,7 @@ INT8 CanCharacterSquad( SOLDIERTYPE *pSoldier, INT8 bSquadValue ) return ( CHARACTER_CANT_JOIN_SQUAD ); } - if ( pSoldier->bAssignment == ASSIGNMENT_POW || (pSoldier->bAssignment == ASSIGNMENT_MINIEVENT && pSoldier->ubHoursRemainingOnMiniEvent > 0)) + if ( pSoldier->bAssignment == ASSIGNMENT_POW || (pSoldier->bAssignment == ASSIGNMENT_MINIEVENT && pSoldier->ubHoursRemainingOnMiniEvent > 0) || (pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND) ) { // not allowed to be put on a squad return( CHARACTER_CANT_JOIN_SQUAD ); @@ -5840,7 +5845,7 @@ void FatigueCharacter( SOLDIERTYPE *pSoldier ) } // POW? - if( pSoldier->bAssignment == ASSIGNMENT_POW || pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) + if( pSoldier->bAssignment == ASSIGNMENT_POW || pSoldier->bAssignment == ASSIGNMENT_MINIEVENT || pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND ) { return; } @@ -16323,7 +16328,7 @@ void HandleRestFatigueAndSleepStatus( void ) continue; } - if( ( pSoldier->bAssignment == ASSIGNMENT_POW ) || ( pSoldier->bAssignment == IN_TRANSIT ) || ( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) ) + if( ( pSoldier->bAssignment == ASSIGNMENT_POW ) || ( pSoldier->bAssignment == IN_TRANSIT ) || ( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) || ( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND ) ) { continue; } @@ -16472,7 +16477,7 @@ void HandleRestFatigueAndSleepStatus( void ) continue; } - if( ( pSoldier->bAssignment == ASSIGNMENT_POW ) || ( pSoldier->bAssignment == IN_TRANSIT ) || ( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) ) + if( ( pSoldier->bAssignment == ASSIGNMENT_POW ) || ( pSoldier->bAssignment == IN_TRANSIT ) || ( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) || ( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND ) ) { continue; } @@ -19453,7 +19458,8 @@ BOOLEAN CanCharacterRepairAnotherSoldiersStuff( SOLDIERTYPE *pSoldier, SOLDIERTY ( AM_A_ROBOT( pSoldier ) ) || ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__EPC ) || ( pOtherSoldier->bAssignment == ASSIGNMENT_DEAD ) || - ( pOtherSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) ) + ( pOtherSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) || + ( pOtherSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND ) ) { return( FALSE ); } diff --git a/Strategic/Hourly Update.cpp b/Strategic/Hourly Update.cpp index 800e5603..876211ad 100644 --- a/Strategic/Hourly Update.cpp +++ b/Strategic/Hourly Update.cpp @@ -712,6 +712,7 @@ void HourlyStealUpdate() && pSoldier->bAssignment != IN_TRANSIT && pSoldier->bAssignment != ASSIGNMENT_POW && pSoldier->bAssignment != ASSIGNMENT_MINIEVENT + && pSoldier->bAssignment != ASSIGNMENT_REBELCOMMAND && !( ( ( gWorldSectorX == pSoldier->sSectorX ) && ( gWorldSectorY == pSoldier->sSectorY ) && ( gbWorldSectorZ == pSoldier->bSectorZ ) ) && ( gTacticalStatus.fEnemyInSector || guiCurrentScreen == GAME_SCREEN ) ) ) { UINT8 ubSectorId = SECTOR( pSoldier->sSectorX, pSoldier->sSectorY ); @@ -741,6 +742,7 @@ void HourlyStealUpdate() && pOtherSoldier->bAssignment != IN_TRANSIT && pOtherSoldier->bAssignment != ASSIGNMENT_POW && pOtherSoldier->bAssignment != ASSIGNMENT_MINIEVENT + && pOtherSoldier->bAssignment != ASSIGNMENT_REBELCOMMAND && !SPY_LOCATION( pOtherSoldier->bAssignment ) && pOtherSoldier->bActive && !pOtherSoldier->flags.fMercAsleep diff --git a/Strategic/Map Screen Interface Bottom.cpp b/Strategic/Map Screen Interface Bottom.cpp index f1a730c4..004a67e4 100644 --- a/Strategic/Map Screen Interface Bottom.cpp +++ b/Strategic/Map Screen Interface Bottom.cpp @@ -1795,6 +1795,7 @@ BOOLEAN AnyUsableRealMercenariesOnTeam( void ) ( pSoldier->bAssignment != ASSIGNMENT_POW ) && ( pSoldier->bAssignment != ASSIGNMENT_DEAD ) && ( pSoldier->bAssignment != ASSIGNMENT_MINIEVENT ) && + ( pSoldier->bAssignment != ASSIGNMENT_REBELCOMMAND ) && ( pSoldier->ubWhatKindOfMercAmI != MERC_TYPE__EPC ) ) { return( TRUE ); diff --git a/Strategic/Map Screen Interface Map.cpp b/Strategic/Map Screen Interface Map.cpp index 58041913..39cca58a 100644 --- a/Strategic/Map Screen Interface Map.cpp +++ b/Strategic/Map Screen Interface Map.cpp @@ -1366,6 +1366,7 @@ INT32 ShowAssignedTeam(INT16 sMapX, INT16 sMapY, INT32 iCount) ( pSoldier->bAssignment != IN_TRANSIT ) && ( pSoldier->bAssignment != ASSIGNMENT_POW ) && ( pSoldier->bAssignment != ASSIGNMENT_MINIEVENT ) && + ( pSoldier->bAssignment != ASSIGNMENT_REBELCOMMAND ) && ( pSoldier->stats.bLife > 0 ) && ( !PlayerIDGroupInMotion( pSoldier->ubGroupID ) ) ) { @@ -6976,6 +6977,7 @@ BOOLEAN CanMercsScoutThisSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ ) ( pSoldier->bAssignment == ASSIGNMENT_POW ) || ( pSoldier->bAssignment == ASSIGNMENT_DEAD ) || ( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) || + ( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND ) || ( pSoldier->flags.fMercAsleep == TRUE ) || ( pSoldier->stats.bLife < OKLIFE ) ) { diff --git a/Strategic/Map Screen Interface.cpp b/Strategic/Map Screen Interface.cpp index 40974757..41111229 100644 --- a/Strategic/Map Screen Interface.cpp +++ b/Strategic/Map Screen Interface.cpp @@ -1938,7 +1938,7 @@ void UpdateCharRegionHelpText( void ) pSoldier = MercPtrs[ gCharactersList[ bSelectedInfoChar ].usSolID ]; // health/energy/morale - if( pSoldier->bAssignment != ASSIGNMENT_POW && pSoldier->bAssignment != ASSIGNMENT_MINIEVENT ) + if( pSoldier->bAssignment != ASSIGNMENT_POW && pSoldier->bAssignment != ASSIGNMENT_MINIEVENT && pSoldier->bAssignment != ASSIGNMENT_REBELCOMMAND ) { if ( pSoldier->stats.bLife != 0 ) { @@ -3713,7 +3713,7 @@ void SetUpMovingListsForSector( INT16 sSectorX, INT16 sSectorY, INT16 sSectorZ ) pSoldier = MercPtrs[ gCharactersList[ iCounter ].usSolID ]; if( ( pSoldier->bActive ) && - ( pSoldier->bAssignment != IN_TRANSIT ) && ( pSoldier->bAssignment != ASSIGNMENT_POW ) && !SPY_LOCATION( pSoldier->bAssignment ) && ( pSoldier->bAssignment != ASSIGNMENT_MINIEVENT ) && + ( pSoldier->bAssignment != IN_TRANSIT ) && ( pSoldier->bAssignment != ASSIGNMENT_POW ) && !SPY_LOCATION( pSoldier->bAssignment ) && ( pSoldier->bAssignment != ASSIGNMENT_MINIEVENT ) && ( pSoldier->bAssignment != ASSIGNMENT_REBELCOMMAND ) && ( pSoldier->sSectorX == sSectorX ) && ( pSoldier->sSectorY == sSectorY ) && ( pSoldier->bSectorZ == sSectorZ ) ) { if ( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) @@ -6063,8 +6063,8 @@ BOOLEAN CanCharacterMoveInStrategic( SOLDIERTYPE *pSoldier, INT8 *pbErrorNumber return( FALSE ); } - // mini event? - if ( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) + // mini event/rebel command? + if ( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT || pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND ) { *pbErrorNumber = 29; return( FALSE ); diff --git a/Strategic/PreBattle Interface.cpp b/Strategic/PreBattle Interface.cpp index f285cd2e..d27d0654 100644 --- a/Strategic/PreBattle Interface.cpp +++ b/Strategic/PreBattle Interface.cpp @@ -2376,6 +2376,7 @@ BOOLEAN PlayerMercInvolvedInThisCombat( SOLDIERTYPE *pSoldier ) pSoldier->bAssignment != ASSIGNMENT_POW && pSoldier->bAssignment != ASSIGNMENT_DEAD && pSoldier->bAssignment != ASSIGNMENT_MINIEVENT && + pSoldier->bAssignment != ASSIGNMENT_REBELCOMMAND && !(pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE) && // Robot is involved if it has a valid controller with it, uninvolved otherwise ( !AM_A_ROBOT( pSoldier ) || ( pSoldier->ubRobotRemoteHolderID != NOBODY ) ) && diff --git a/Strategic/Queen Command.cpp b/Strategic/Queen Command.cpp index eb32fe44..497d71b5 100644 --- a/Strategic/Queen Command.cpp +++ b/Strategic/Queen Command.cpp @@ -299,7 +299,7 @@ UINT16 NumPlayerTeamMembersInSector( INT16 sSectorX, INT16 sSectorY, INT8 sSecto // we test several conditions before we allow adding an opinion // other merc must be active, have a profile, be someone else and not be in transit or dead if ( pTeamSoldier->bActive && !pTeamSoldier->flags.fBetweenSectors && pTeamSoldier->stats.bLife > 0 && !(pTeamSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE) && - !(pTeamSoldier->bAssignment == IN_TRANSIT || pTeamSoldier->bAssignment == ASSIGNMENT_DEAD || pTeamSoldier->bAssignment == ASSIGNMENT_POW || pTeamSoldier->bAssignment == ASSIGNMENT_MINIEVENT) && + !(pTeamSoldier->bAssignment == IN_TRANSIT || pTeamSoldier->bAssignment == ASSIGNMENT_DEAD || pTeamSoldier->bAssignment == ASSIGNMENT_POW || pTeamSoldier->bAssignment == ASSIGNMENT_MINIEVENT || pTeamSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND) && (pTeamSoldier->sSectorX == sSectorX && pTeamSoldier->sSectorY == sSectorY && pTeamSoldier->bSectorZ == sSectorZ) ) { ++teammemberspresent; @@ -2795,6 +2795,11 @@ void EnemyCapturesPlayerSoldier( SOLDIERTYPE *pSoldier ) return; } + if (pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND) + { + return; + } + if ( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) { return; diff --git a/Strategic/Rebel Command.cpp b/Strategic/Rebel Command.cpp index 681bf905..d1ea5165 100644 --- a/Strategic/Rebel Command.cpp +++ b/Strategic/Rebel Command.cpp @@ -87,6 +87,7 @@ Points of interest: #include "Queen Command.h" #include "random.h" #include "SaveLoadGame.h" +#include "Squads.h" #include "strategic.h" #include "strategicmap.h" #include "Strategic Mines.h" @@ -95,6 +96,7 @@ Points of interest: #include "Text.h" #include "Town Militia.h" #include "Utilities.h" +#include "Vehicles.h" #include "WCheck.h" #include "WordWrap.h" #endif @@ -171,6 +173,9 @@ void GetMissionInfo(RebelCommandAgentMissions mission, const MERCPROFILESTRUCT* intModifierSkill = 0; extraBits = 0; + if (mission == RCAM_NONE) + return; + const std::vector* skills = gGameOptions.fNewTraitSystem ? &missionInfo[mission].newSkills : &missionInfo[mission].oldSkills; for (int i = 0; i < sizeof(merc->bSkillTraits) / sizeof(merc->bSkillTraits[0]); ++i) @@ -2128,6 +2133,8 @@ BOOLEAN SetupMissionAgentBox(UINT16 x, UINT16 y, INT8 index) if (agentIndex[index] < 0) agentIndex[index] = static_cast(mercs.size()); else if (agentIndex[index] > static_cast(mercs.size())) agentIndex[index] = 0; + // rftr todo: handle RCAM_NONE (ie, mission prep in progress!) + // draw mission title switch (rebelCommandSaveInfo.availableMissions[index]) { @@ -2407,19 +2414,27 @@ BOOLEAN SetupMissionAgentBox(UINT16 x, UINT16 y, INT8 index) } // draw "start mission" button - const UINT8 townId = GetTownIdForSector(mercs[agentIndex[index]]->sSectorX, mercs[agentIndex[index]]->sSectorY); - const UINT8 townLoyalty = GetRegionLoyalty(townId); - if ((agentIndex[index] < static_cast(mercs.size())) && (townId < FIRST_TOWN || townId >= NUM_TOWNS || townLoyalty < gRebelCommandSettings.iMinLoyaltyForMission)) + BOOLEAN canStartMission = TRUE; + if (agentIndex[index] < static_cast(mercs.size())) { - swprintf(sText, L"Agent not in loyal town"); - DrawTextToScreen(sText, x, y+295, 231, FONT10ARIAL, FONT_RED, FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED); + const UINT8 townId = GetTownIdForSector(mercs[agentIndex[index]]->sSectorX, mercs[agentIndex[index]]->sSectorY); + const UINT8 townLoyalty = GetRegionLoyalty(townId); + + if (townId < FIRST_TOWN || townId >= NUM_TOWNS || townLoyalty < gRebelCommandSettings.iMinLoyaltyForMission) + { + canStartMission = FALSE; + swprintf(sText, L"Agent not in loyal town"); + DrawTextToScreen(sText, x, y+295, 231, FONT10ARIAL, FONT_RED, FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED); + } } else if ((gTacticalStatus.uiFlags & INCOMBAT) || gTacticalStatus.fEnemyInSector) { + canStartMission = FALSE; swprintf(sText, L"Battle in progress"); DrawTextToScreen(sText, x, y+295, 231, FONT10ARIAL, FONT_RED, FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED); } - else // ok to start mission + + if (canStartMission) { swprintf(sText, L"Start Mission (%d supplies)", GetMissionCost()); btnId = CreateTextButton(sText, FONT10ARIAL, FONT_MCOLOR_LTYELLOW, FONT_BLACK, BUTTON_USE_DEFAULT, x, y+290, 231, 20, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK, [](GUI_BUTTON* btn, INT32 reason) @@ -2646,37 +2661,42 @@ void StartMission(INT8 index) MissionFirstEvent evt; DeserialiseMissionFirstEvent(MissionHelpers::missionParam, evt); - for (UINT8 i = gTacticalStatus.Team[OUR_TEAM].bFirstID; i <= gTacticalStatus.Team[OUR_TEAM].bLastID; ++i) + if (!evt.sentGenericRebelAgent) { - SOLDIERTYPE* pSoldier = MercPtrs[i]; - - if (pSoldier->ubProfile != evt.mercProfileId) - continue; - - //TakeSoldierOutOfVehicle(pSoldier); - //RemoveCharacterFromSquads(pSoldier); - //pSoldier->ubHoursRemainingOnMiniEvent = hoursOnMiniEvent; - //pSoldier->bSectorZ += MINI_EVENT_Z_OFFSET; - //pSoldier->bBleeding = 0; - //SetTimeOfAssignmentChangeForMerc(pSoldier); - //ChangeSoldiersAssignment(pSoldier, ASSIGNMENT_REBELCOMMAND); - - for (INT8 i = 0; i < NUM_ARC_AGENT_SLOTS; ++i) + //for (UINT8 i = gTacticalStatus.Team[OUR_TEAM].bFirstID; i <= gTacticalStatus.Team[OUR_TEAM].bLastID; ++i) { - if (evt.missionId == rebelCommandSaveInfo.availableMissions[i]) - { - rebelCommandSaveInfo.availableMissions[i] = RCAM_NONE; - break; - } + SOLDIERTYPE* pSoldier = MercPtrs[evt.mercProfileId]; + + //if (pSoldier->ubProfile != evt.mercProfileId) + // continue; + + TakeSoldierOutOfVehicle(pSoldier); + RemoveCharacterFromSquads(pSoldier); + pSoldier->bSectorZ += REBEL_COMMAND_Z_OFFSET; + pSoldier->bBleeding = 0; + SetTimeOfAssignmentChangeForMerc(pSoldier); + ChangeSoldiersAssignment(pSoldier, ASSIGNMENT_REBELCOMMAND); + + //break; } - - // actually start the mission - AddStrategicEvent(EVENT_REBELCOMMAND, GetWorldTotalMin() + 60 * 24, MissionHelpers::missionParam); - missionMap[static_cast(evt.missionId)] = MissionHelpers::missionParam; - - return; } + + for (INT8 i = 0; i < NUM_ARC_AGENT_SLOTS; ++i) + { + if (evt.missionId == rebelCommandSaveInfo.availableMissions[i]) + { + rebelCommandSaveInfo.availableMissions[i] = RCAM_NONE; + break; + } + } + + // actually start the mission + //AddStrategicEvent(EVENT_REBELCOMMAND, GetWorldTotalMin() + 60 * 24, MissionHelpers::missionParam); + AddStrategicEvent(EVENT_REBELCOMMAND, GetWorldTotalMin() + 60, MissionHelpers::missionParam); // rftr todo: DELETE ME + missionMap[static_cast(evt.missionId)] = MissionHelpers::missionParam; } + + RenderWebsite(); }); } // end website @@ -4291,8 +4311,6 @@ void HandleStrategicEvent(const UINT32 eventParam) { const RebelCommandAgentMissions mission = static_cast(evt1.missionId); const MERCPROFILESTRUCT merc = gMercProfiles[evt1.mercProfileId]; - - // rftr todo: mission successful! give some experience pts // what mission did we do? apply bonuses here, and don't forget to check them later when checking to see if a mission bonus should be applied UINT32 durationBonus = 0; @@ -4332,7 +4350,24 @@ void HandleStrategicEvent(const UINT32 eventParam) AddStrategicEvent(EVENT_REBELCOMMAND, GetWorldTotalMin() + 60 * evt1.missionDurationInHours, SerialiseMissionSecondEvent(evt1.sentGenericRebelAgent, evt1.mercProfileId, mission, extraBits)); - // rftr todo: tell the player that the mission has started. popupbox or screenmsg? + if (!evt1.sentGenericRebelAgent) + { + //for (UINT8 i = gTacticalStatus.Team[OUR_TEAM].bFirstID; i <= gTacticalStatus.Team[OUR_TEAM].bLastID; ++i) + { + SOLDIERTYPE* pSoldier = MercPtrs[evt1.mercProfileId]; + + //if (pSoldier->ubProfile != evt1.mercProfileId) + // continue; + + // rftr todo: tell the player that the mission has started. popupbox or screenmsg? + // rftr todo: mission successful! give some experience pts + pSoldier->bSectorZ -= REBEL_COMMAND_Z_OFFSET; + pSoldier->ubInsertionDirection = DIRECTION_IRRELEVANT; + pSoldier->ubStrategicInsertionCode = INSERTION_CODE_CENTER; + AssignmentDone(pSoldier, TRUE, FALSE); + AddCharacterToAnySquad(pSoldier); + } + } } missionMap[mission] = eventParam; diff --git a/Strategic/Strategic Movement.cpp b/Strategic/Strategic Movement.cpp index 67d0e69d..e0668545 100644 --- a/Strategic/Strategic Movement.cpp +++ b/Strategic/Strategic Movement.cpp @@ -5475,7 +5475,7 @@ BOOLEAN TestForBloodcatAmbush( GROUP *pGroup ) { if( MercPtrs[ i ]->bActive && MercPtrs[ i ]->stats.bLife && !(MercPtrs[ i ]->flags.uiStatusFlags & SOLDIER_VEHICLE) ) { - if ( MercPtrs[ i ]->sSectorX == pGroup->ubSectorX && MercPtrs[ i ]->sSectorY == pGroup->ubSectorY && MercPtrs[ i ]->bAssignment != ASSIGNMENT_POW && MercPtrs[ i ]->bAssignment != ASSIGNMENT_MINIEVENT && MercPtrs[ i ]->stats.bLife >= OKLIFE ) + if ( MercPtrs[ i ]->sSectorX == pGroup->ubSectorX && MercPtrs[ i ]->sSectorY == pGroup->ubSectorY && MercPtrs[ i ]->bAssignment != ASSIGNMENT_POW && MercPtrs[ i ]->bAssignment != ASSIGNMENT_MINIEVENT && MercPtrs[i]->bAssignment != ASSIGNMENT_REBELCOMMAND && MercPtrs[ i ]->stats.bLife >= OKLIFE ) { if( HAS_SKILL_TRAIT( MercPtrs[ i ], SCOUTING_NT ) && MercPtrs[ i ]->ubProfile != NO_PROFILE ) { @@ -5880,6 +5880,7 @@ BOOLEAN GroupHasInTransitDeadOrPOWMercs( GROUP *pGroup ) if( ( pPlayer->pSoldier->bAssignment == IN_TRANSIT ) || ( pPlayer->pSoldier->bAssignment == ASSIGNMENT_POW ) || ( pPlayer->pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) || + ( pPlayer->pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND ) || SPY_LOCATION( pPlayer->pSoldier->bAssignment ) || ( pPlayer->pSoldier->bAssignment == ASSIGNMENT_DEAD ) ) { diff --git a/Strategic/mapscreen.cpp b/Strategic/mapscreen.cpp index e9798e15..325f557b 100644 --- a/Strategic/mapscreen.cpp +++ b/Strategic/mapscreen.cpp @@ -2411,7 +2411,8 @@ void DrawCharBars( void ) if( ( pSoldier->stats.bLife == 0 ) || ( pSoldier->bAssignment == ASSIGNMENT_DEAD ) || ( pSoldier->bAssignment == ASSIGNMENT_POW ) || - ( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) ) + ( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) || + ( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND ) ) { return; } @@ -2829,7 +2830,7 @@ void DrawCharHealth( INT16 sCharNum ) pSoldier = &Menptr[gCharactersList[sCharNum].usSolID]; - if( pSoldier->bAssignment != ASSIGNMENT_POW && pSoldier->bAssignment != ASSIGNMENT_MINIEVENT ) + if( pSoldier->bAssignment != ASSIGNMENT_POW && pSoldier->bAssignment != ASSIGNMENT_MINIEVENT && pSoldier->bAssignment != ASSIGNMENT_REBELCOMMAND ) { // find starting X coordinate by centering all 3 substrings together, then print them separately (different colors)! swprintf( sString, L"%d/%d", pSoldier->stats.bLife, pSoldier->stats.bLifeMax ); @@ -11328,7 +11329,7 @@ void TeamListInfoRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason ) fPlotForMilitia = FALSE; // if not dead or POW, select his sector - if( ( pSoldier->stats.bLife > 0 ) && ( pSoldier->bAssignment != ASSIGNMENT_POW ) && ( pSoldier->bAssignment != ASSIGNMENT_MINIEVENT ))//&& !SPY_LOCATION( pSoldier->bAssignment ) ) + if( ( pSoldier->stats.bLife > 0 ) && ( pSoldier->bAssignment != ASSIGNMENT_POW ) && ( pSoldier->bAssignment != ASSIGNMENT_MINIEVENT ) && ( pSoldier->bAssignment != ASSIGNMENT_REBELCOMMAND ) )//&& !SPY_LOCATION( pSoldier->bAssignment ) ) { ChangeSelectedMapSector( pSoldier->sSectorX, pSoldier->sSectorY, pSoldier->bSectorZ ); } @@ -11384,7 +11385,7 @@ void TeamListInfoRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason ) fPlotForMilitia = FALSE; // if not dead or POW, select his sector - if( ( pSoldier->stats.bLife > 0 ) && ( pSoldier->bAssignment != ASSIGNMENT_POW ) && !SPY_LOCATION( pSoldier->bAssignment ) && ( pSoldier->bAssignment != ASSIGNMENT_MINIEVENT ) ) + if( ( pSoldier->stats.bLife > 0 ) && ( pSoldier->bAssignment != ASSIGNMENT_POW ) && !SPY_LOCATION( pSoldier->bAssignment ) && ( pSoldier->bAssignment != ASSIGNMENT_MINIEVENT ) && ( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND ) ) { ChangeSelectedMapSector( pSoldier->sSectorX, pSoldier->sSectorY, pSoldier->bSectorZ ); } @@ -11567,7 +11568,7 @@ void TeamListAssignmentRegionBtnCallBack(MOUSE_REGION *pRegion, INT32 iReason ) fShownAssignmentMenu = FALSE; // if not dead or POW, select his sector - if( ( pSoldier->stats.bLife > 0 ) && ( pSoldier->bAssignment != ASSIGNMENT_POW ) && ( pSoldier->bAssignment != ASSIGNMENT_MINIEVENT ) ) + if( ( pSoldier->stats.bLife > 0 ) && ( pSoldier->bAssignment != ASSIGNMENT_POW ) && ( pSoldier->bAssignment != ASSIGNMENT_MINIEVENT ) && ( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND ) ) { ChangeSelectedMapSector( pSoldier->sSectorX, pSoldier->sSectorY, pSoldier->bSectorZ ); } @@ -15115,6 +15116,7 @@ BOOLEAN MapCharacterHasAccessibleInventory( INT8 bCharNumber ) if( ( pSoldier->bAssignment == IN_TRANSIT ) || ( pSoldier->bAssignment == ASSIGNMENT_POW ) || ( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) || + ( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND ) || // Kaiden: Vehicle Inventory change - Commented the following line // ( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) || // And added this instead: @@ -15303,7 +15305,7 @@ BOOLEAN CanChangeSleepStatusForSoldier( SOLDIERTYPE *pSoldier ) // if a vehicle, robot, in transit, or a POW if( ( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) || AM_A_ROBOT( pSoldier ) || - ( pSoldier->bAssignment == IN_TRANSIT ) || ( pSoldier->bAssignment == ASSIGNMENT_POW ) || ( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) ) + ( pSoldier->bAssignment == IN_TRANSIT ) || ( pSoldier->bAssignment == ASSIGNMENT_POW ) || ( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) || ( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND ) ) { // can't change the sleep status of such mercs return ( FALSE ); @@ -15856,7 +15858,7 @@ INT16 CalcLocationValueForChar( INT32 iCounter ) pSoldier = MercPtrs[ gCharactersList[ iCounter ].usSolID ]; // don't reveal location of POWs! - if( pSoldier->bAssignment != ASSIGNMENT_POW && pSoldier->bAssignment != ASSIGNMENT_MINIEVENT ) + if( pSoldier->bAssignment != ASSIGNMENT_POW && pSoldier->bAssignment != ASSIGNMENT_MINIEVENT && pSoldier->bAssignment != ASSIGNMENT_REBELCOMMAND ) { sLocValue = SECTOR( pSoldier->sSectorX, pSoldier->sSectorY ); // underground: add 1000 per sublevel @@ -15950,6 +15952,7 @@ BOOLEAN AnyMovableCharsInOrBetweenThisSector( INT16 sSectorX, INT16 sSectorY, IN SPY_LOCATION( pSoldier->bAssignment ) || ( pSoldier->bAssignment == ASSIGNMENT_DEAD ) || ( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) || + ( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND ) || ( pSoldier->stats.bLife == 0 ) ) { continue; @@ -16554,6 +16557,11 @@ void GetMapscreenMercLocationString( SOLDIERTYPE *pSoldier, CHAR16 sString[] ) // mini event - unknown location, use the same string as POWs swprintf( sString, L"%s", pPOWStrings[ 1 ] ); } + else if (pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND) + { + // on a rebel command mission + swprintf( sString, L"%s%s*", pMapVertIndex[pSoldier->sSectorY], pMapHortIndex[pSoldier->sSectorX] ); + } else if ( SPY_LOCATION( pSoldier->bAssignment ) ) { swprintf( pTempString, L"%s%s%s", @@ -16594,6 +16602,7 @@ void GetMapscreenMercDestinationString( SOLDIERTYPE *pSoldier, CHAR16 sString[] if( ( pSoldier->bAssignment == ASSIGNMENT_DEAD ) || ( pSoldier->bAssignment == ASSIGNMENT_POW ) || ( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) || + ( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND ) || SPY_LOCATION( pSoldier->bAssignment ) || ( pSoldier->stats.bLife == 0 ) ) { diff --git a/Strategic/strategicmap.cpp b/Strategic/strategicmap.cpp index 03a881c7..dda550d9 100644 --- a/Strategic/strategicmap.cpp +++ b/Strategic/strategicmap.cpp @@ -5229,7 +5229,7 @@ BOOLEAN CanGoToTacticalInSector( INT16 sX, INT16 sY, UINT8 ubZ ) { // ARM: now allows loading of sector with all mercs below OKLIFE as long as they're alive if( ( pSoldier->bActive && pSoldier->stats.bLife ) && !( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) && - ( pSoldier->bAssignment != IN_TRANSIT ) && ( pSoldier->bAssignment != ASSIGNMENT_POW ) && ( pSoldier->bAssignment != ASSIGNMENT_MINIEVENT ) && + ( pSoldier->bAssignment != IN_TRANSIT ) && ( pSoldier->bAssignment != ASSIGNMENT_POW ) && ( pSoldier->bAssignment != ASSIGNMENT_MINIEVENT ) && ( pSoldier->bAssignment != ASSIGNMENT_REBELCOMMAND ) && ( pSoldier->bAssignment != ASSIGNMENT_DEAD ) && !SoldierAboardAirborneHeli( pSoldier ) ) @@ -6402,7 +6402,7 @@ void HandleSlayDailyEvent( void ) } // valid soldier? - if ( (pSoldier->bActive == FALSE) || (pSoldier->stats.bLife == 0) || (pSoldier->bAssignment == IN_TRANSIT) || (pSoldier->bAssignment == ASSIGNMENT_POW) || (pSoldier->bAssignment == ASSIGNMENT_MINIEVENT) ) + if ( (pSoldier->bActive == FALSE) || (pSoldier->stats.bLife == 0) || (pSoldier->bAssignment == IN_TRANSIT) || (pSoldier->bAssignment == ASSIGNMENT_POW) || (pSoldier->bAssignment == ASSIGNMENT_MINIEVENT) || (pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND) ) { // no return; diff --git a/Tactical/Dialogue Control.cpp b/Tactical/Dialogue Control.cpp index 2d2efb52..1c95d70e 100644 --- a/Tactical/Dialogue Control.cpp +++ b/Tactical/Dialogue Control.cpp @@ -1515,6 +1515,9 @@ BOOLEAN DelayedTacticalCharacterDialogue( SOLDIERTYPE *pSoldier, UINT16 usQuoteN if( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) return( FALSE ); + if( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND) + return( FALSE ); + return( CharacterDialogue( pSoldier->ubProfile, usQuoteNum, pSoldier->iFaceIndex, DIALOGUE_TACTICAL_UI, TRUE, TRUE ) ); } @@ -1574,6 +1577,9 @@ BOOLEAN TacticalCharacterDialogueWithSpecialEventEx( SOLDIERTYPE *pSoldier, UINT if( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) return( FALSE ); + + if( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND) + return( FALSE ); } return( CharacterDialogueWithSpecialEventEx( pSoldier->ubProfile, usQuoteNum, pSoldier->iFaceIndex, DIALOGUE_TACTICAL_UI, TRUE, FALSE, uiFlag, uiData1, uiData2, uiData3 ) ); @@ -1625,6 +1631,9 @@ BOOLEAN TacticalCharacterDialogue( SOLDIERTYPE *pSoldier, UINT16 usQuoteNum ) if( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) return( FALSE ); + if( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND) + return( FALSE ); + // OK, let's check if this is the exact one we just played, if so, skip. if ( pSoldier->ubProfile == gTacticalStatus.ubLastQuoteProfileNUm && usQuoteNum == gTacticalStatus.ubLastQuoteSaid ) @@ -1717,6 +1726,9 @@ BOOLEAN SnitchTacticalCharacterDialogue( SOLDIERTYPE *pSoldier, UINT16 usQuoteNu if( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) return( FALSE ); + if( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND) + return( FALSE ); + // OK, let's check if this is the exact one we just played, if so, skip. //if ( pSoldier->ubProfile == gTacticalStatus.ubLastQuoteProfileNUm && // usQuoteNum == gTacticalStatus.ubLastQuoteSaid ) @@ -1774,6 +1786,9 @@ BOOLEAN AdditionalTacticalCharacterDialogue_CallsLua( SOLDIERTYPE *pSoldier, UIN if( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) return( FALSE ); + if( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND) + return( FALSE ); + if ( AM_AN_EPC( pSoldier ) && !( gMercProfiles[pSoldier->ubProfile].ubMiscFlags & PROFILE_MISC_FLAG_FORCENPCQUOTE ) ) return( FALSE ); @@ -1802,7 +1817,7 @@ void AdditionalTacticalCharacterDialogue_AllInSector(INT16 aSectorX, INT16 aSect if ( pSoldier->stats.bLife >= OKLIFE && pSoldier->bActive && pSoldier->ubProfile != ausIgnoreProfile && pSoldier->sSectorX == aSectorX && pSoldier->sSectorY == aSectorY && pSoldier->bSectorZ == aSectorZ && - pSoldier->bAssignment != ASSIGNMENT_POW && pSoldier->bAssignment != IN_TRANSIT && pSoldier->bAssignment != ASSIGNMENT_MINIEVENT && + pSoldier->bAssignment != ASSIGNMENT_POW && pSoldier->bAssignment != IN_TRANSIT && pSoldier->bAssignment != ASSIGNMENT_MINIEVENT && pSoldier->bAssignment != ASSIGNMENT_REBELCOMMAND && (aAroundGridno == NOWHERE || PythSpacesAway( pSoldier->sGridNo, aAroundGridno ) <= aRadius ) && !pSoldier->flags.fBetweenSectors ) { @@ -2105,6 +2120,9 @@ BOOLEAN ExecuteCharacterDialogue( UINT8 ubCharacterNum, UINT16 usQuoteNum, INT32 if( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) return( FALSE ); + if( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND) + return( FALSE ); + // sleeping guys don't talk.. go to standby to talk if( pSoldier->flags.fMercAsleep == TRUE ) { diff --git a/Tactical/DynamicDialogue.cpp b/Tactical/DynamicDialogue.cpp index 68b69b1d..ac6e5f95 100644 --- a/Tactical/DynamicDialogue.cpp +++ b/Tactical/DynamicDialogue.cpp @@ -960,6 +960,9 @@ BOOLEAN DynamicOpinionTacticalCharacterDialogue( DynamicOpinionSpeechEvent& aEve if( pSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) return( FALSE ); + if( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND) + return( FALSE ); + CHAR16 gzQuoteStr[500]; // remove old box, in case that still exists @@ -2020,7 +2023,7 @@ UINT8 GetFittingInterjectorProfile( UINT8 usEvent, UINT8 usProfileVictim, UINT8 for ( pTeamSoldier = MercPtrs[bMercID]; bMercID <= bLastTeamID; ++bMercID, pTeamSoldier++ ) { // only people that are here - if ( !pTeamSoldier->bActive || pTeamSoldier->bAssignment == IN_TRANSIT || pTeamSoldier->bAssignment == ASSIGNMENT_DEAD || pTeamSoldier->bAssignment == ASSIGNMENT_POW || pTeamSoldier->bAssignment == ASSIGNMENT_MINIEVENT ) + if ( !pTeamSoldier->bActive || pTeamSoldier->bAssignment == IN_TRANSIT || pTeamSoldier->bAssignment == ASSIGNMENT_DEAD || pTeamSoldier->bAssignment == ASSIGNMENT_POW || pTeamSoldier->bAssignment == ASSIGNMENT_MINIEVENT || pTeamSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND ) continue; // if fSameSector is TRUE then the teammate must be in the same sector diff --git a/Tactical/Food.cpp b/Tactical/Food.cpp index 07172191..2d1e6399 100644 --- a/Tactical/Food.cpp +++ b/Tactical/Food.cpp @@ -606,7 +606,7 @@ void HourlyFoodAutoDigestion( SOLDIERTYPE *pSoldier ) AddFoodpoints(pSoldier->bFoodLevel, powfoodadd); } // while on a minievent, assume that we can feed ourselves.. somehow - else if (pSoldier->bAssignment == ASSIGNMENT_MINIEVENT) + else if (pSoldier->bAssignment == ASSIGNMENT_MINIEVENT || pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND) { const INT16 water = gGameExternalOptions.usFoodDigestionHourlyBaseDrink * gGameExternalOptions.sFoodDigestionAssignment; const INT16 foodadd = water * gGameExternalOptions.usFoodDigestionHourlyBaseFood / max(1, gGameExternalOptions.usFoodDigestionHourlyBaseDrink); diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index e3fe1d3a..dbdea3f8 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -6311,7 +6311,7 @@ void SOLDIERTYPE::EVENT_SoldierGotHit( UINT16 usWeaponIndex, INT16 sDamage, INT1 // If anything other than on a squad or guard, make them guard.... if ( this->bTeam == gbPlayerNum ) { - if ( this->bAssignment >= ON_DUTY && this->bAssignment != ASSIGNMENT_POW && this->bAssignment != ASSIGNMENT_MINIEVENT ) + if ( this->bAssignment >= ON_DUTY && this->bAssignment != ASSIGNMENT_POW && this->bAssignment != ASSIGNMENT_MINIEVENT && this->bAssignment != ASSIGNMENT_REBELCOMMAND) { if ( this->flags.fMercAsleep ) { diff --git a/Tactical/Squads.cpp b/Tactical/Squads.cpp index dc6176c9..91ef1777 100644 --- a/Tactical/Squads.cpp +++ b/Tactical/Squads.cpp @@ -1389,6 +1389,11 @@ BOOLEAN IsSquadInSector( SOLDIERTYPE *pSoldier, UINT8 ubSquad ) return( FALSE ); } + if( pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND) + { + return( FALSE ); + } + if( SquadIsEmpty( ubSquad ) == TRUE ) { return( TRUE ); diff --git a/Tactical/Strategic Exit GUI.cpp b/Tactical/Strategic Exit GUI.cpp index b56531d0..00274713 100644 --- a/Tactical/Strategic Exit GUI.cpp +++ b/Tactical/Strategic Exit GUI.cpp @@ -238,7 +238,7 @@ BOOLEAN InternalInitSectorExitMenu( UINT8 ubDirection, INT32 sAdditionalData )// pSoldier->stats.bLife >= OKLIFE && ( pSoldier->bAssignment != MercPtrs[ gusSelectedSoldier ]->bAssignment || ( pSoldier->bAssignment == VEHICLE && pSoldier->iVehicleId != MercPtrs[ gusSelectedSoldier ]->iVehicleId ) ) && - pSoldier->bAssignment != ASSIGNMENT_POW && pSoldier->bAssignment != IN_TRANSIT && pSoldier->bAssignment != ASSIGNMENT_DEAD && pSoldier->bAssignment != ASSIGNMENT_MINIEVENT + pSoldier->bAssignment != ASSIGNMENT_POW && pSoldier->bAssignment != IN_TRANSIT && pSoldier->bAssignment != ASSIGNMENT_DEAD && pSoldier->bAssignment != ASSIGNMENT_MINIEVENT && pSoldier->bAssignment != ASSIGNMENT_REBELCOMMAND && !(pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE) ) { //KM: We need to determine if there are more than one squad (meaning other concious mercs in a different squad or assignment) // These conditions were done to the best of my knowledge, so if there are other situations that require modification, diff --git a/Tactical/opplist.cpp b/Tactical/opplist.cpp index 8f6db0d0..a4fb07cb 100644 --- a/Tactical/opplist.cpp +++ b/Tactical/opplist.cpp @@ -6001,7 +6001,7 @@ void ProcessNoise(UINT8 ubNoiseMaker, INT32 sGridNo, INT8 bLevel, UINT8 ubTerrTy continue; // skip } - if ( bTeam == gbPlayerNum && (pSoldier->bAssignment == ASSIGNMENT_POW || pSoldier->bAssignment == ASSIGNMENT_MINIEVENT) ) + if ( bTeam == gbPlayerNum && (pSoldier->bAssignment == ASSIGNMENT_POW || pSoldier->bAssignment == ASSIGNMENT_MINIEVENT || pSoldier->bAssignment == ASSIGNMENT_REBELCOMMAND) ) { // POWs should not be processed for noise continue; diff --git a/TileEngine/Tactical Placement GUI.cpp b/TileEngine/Tactical Placement GUI.cpp index 8c897f8e..3a8523d6 100644 --- a/TileEngine/Tactical Placement GUI.cpp +++ b/TileEngine/Tactical Placement GUI.cpp @@ -340,6 +340,7 @@ void InitTacticalPlacementGUI() !( MercPtrs[ i ]->flags.uiStatusFlags & ( SOLDIER_VEHICLE ) ) && // ATE Ignore vehicles MercPtrs[ i ]->bAssignment != ASSIGNMENT_POW && MercPtrs[ i ]->bAssignment != ASSIGNMENT_MINIEVENT && + MercPtrs[ i ]->bAssignment != ASSIGNMENT_REBELCOMMAND && !( MercPtrs[i]->usSoldierFlagMask2 & SOLDIER_CONCEALINSERTION ) && MercPtrs[ i ]->bAssignment != IN_TRANSIT ) { @@ -357,6 +358,7 @@ void InitTacticalPlacementGUI() CurrentBattleSectorIs( MercPtrs[i]->sSectorX, MercPtrs[i]->sSectorY, MercPtrs[i]->bSectorZ ) && MercPtrs[ i ]->bAssignment != ASSIGNMENT_POW && MercPtrs[ i ]->bAssignment != ASSIGNMENT_MINIEVENT && + MercPtrs[ i ]->bAssignment != ASSIGNMENT_REBELCOMMAND && !( MercPtrs[i]->usSoldierFlagMask2 & SOLDIER_CONCEALINSERTION ) && MercPtrs[ i ]->bAssignment != IN_TRANSIT && !( MercPtrs[ i ]->flags.uiStatusFlags & ( SOLDIER_VEHICLE ) ) ) // ATE Ignore vehicles diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index 2c27afb7..e4f8d35a 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -2480,7 +2480,8 @@ STR16 pAssignmentStrings[] = L"Burial", L"Admin", L"Explore", - L"Event"// rftr: merc is on a mini event + L"Event", // rftr: merc is on a mini event + L"Mission", // rftr: rebel command };