mirror of
https://github.com/1dot13/source.git
synced 2026-09-09 14:46:05 +02:00
Add proper checks and bonuses for active missions
This commit is contained in:
+86
-33
@@ -3848,7 +3848,6 @@ BOOLEAN Load(HWFILE file)
|
|||||||
// go through every strategic event to find active agent missions
|
// go through every strategic event to find active agent missions
|
||||||
std::vector<std::pair<UINT32,UINT32>> missions = GetAllStrategicEventsOfType(EVENT_REBELCOMMAND);
|
std::vector<std::pair<UINT32,UINT32>> missions = GetAllStrategicEventsOfType(EVENT_REBELCOMMAND);
|
||||||
missionMap.clear();
|
missionMap.clear();
|
||||||
// example is EVENT_BLOODCAT_ATTACK
|
|
||||||
for (std::vector<std::pair<UINT32,UINT32>>::iterator it = missions.begin(); it != missions.end(); ++it)
|
for (std::vector<std::pair<UINT32,UINT32>>::iterator it = missions.begin(); it != missions.end(); ++it)
|
||||||
{
|
{
|
||||||
MissionFirstEvent evt1;
|
MissionFirstEvent evt1;
|
||||||
@@ -4134,21 +4133,39 @@ void ApplyEnemyMechanicalUnitPenalties(SOLDIERTYPE* pSoldier)
|
|||||||
if (!gGameExternalOptions.fRebelCommandEnabled)
|
if (!gGameExternalOptions.fRebelCommandEnabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// rftr todo: check agent mission bitmask
|
const std::unordered_map<RebelCommandAgentMissions, UINT32>::iterator iter = missionMap.find(RCAM_SABOTAGE_MECHANICAL_UNITS);
|
||||||
|
|
||||||
pSoldier->stats.bLife -= 40;
|
if (iter == missionMap.end())
|
||||||
pSoldier->stats.bLifeMax = pSoldier->stats.bLife;
|
return;
|
||||||
pSoldier->stats.bAgility -= 40;
|
|
||||||
pSoldier->stats.bDexterity -= 40;
|
|
||||||
pSoldier->stats.bStrength -= 40;
|
|
||||||
pSoldier->stats.bMarksmanship -= 40;
|
|
||||||
|
|
||||||
pSoldier->stats.bLife = max(33, pSoldier->stats.bLife);
|
MissionSecondEvent evt;
|
||||||
pSoldier->stats.bLifeMax = max(33, pSoldier->stats.bLifeMax);
|
DeserialiseMissionSecondEvent(iter->second, evt);
|
||||||
pSoldier->stats.bAgility = max(33, pSoldier->stats.bAgility);
|
|
||||||
pSoldier->stats.bDexterity = max(33, pSoldier->stats.bDexterity);
|
if (evt.isSecondEvent)
|
||||||
pSoldier->stats.bStrength = max(33, pSoldier->stats.bStrength);
|
{
|
||||||
pSoldier->stats.bMarksmanship = max(33, pSoldier->stats.bMarksmanship);
|
INT8 statLoss = 0;
|
||||||
|
switch (evt.extraBits)
|
||||||
|
{
|
||||||
|
case MissionHelpers::SABOTAGE_MECHANICAL_UNITS_COVERT: statLoss = gRebelCommandSettings.iSabotageMechanicalUnitsStatLoss_Covert; break;
|
||||||
|
case MissionHelpers::SABOTAGE_MECHANICAL_UNITS_DEMOLITIONS: statLoss = gRebelCommandSettings.iSabotageMechanicalUnitsStatLoss_Demolitions; break;
|
||||||
|
case MissionHelpers::SABOTAGE_MECHANICAL_UNITS_HEAVY_WEAPONS: statLoss = gRebelCommandSettings.iSabotageMechanicalUnitsStatLoss_Heavy_Weapons; break;
|
||||||
|
default: statLoss = gRebelCommandSettings.iSabotageMechanicalUnitsStatLoss; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pSoldier->stats.bLife -= statLoss;
|
||||||
|
pSoldier->stats.bLifeMax = pSoldier->stats.bLife;
|
||||||
|
pSoldier->stats.bAgility -= statLoss;
|
||||||
|
pSoldier->stats.bDexterity -= statLoss;
|
||||||
|
pSoldier->stats.bStrength -= statLoss;
|
||||||
|
pSoldier->stats.bMarksmanship -= statLoss;
|
||||||
|
|
||||||
|
pSoldier->stats.bLife = max(33, pSoldier->stats.bLife);
|
||||||
|
pSoldier->stats.bLifeMax = max(33, pSoldier->stats.bLifeMax);
|
||||||
|
pSoldier->stats.bAgility = max(33, pSoldier->stats.bAgility);
|
||||||
|
pSoldier->stats.bDexterity = max(33, pSoldier->stats.bDexterity);
|
||||||
|
pSoldier->stats.bStrength = max(33, pSoldier->stats.bStrength);
|
||||||
|
pSoldier->stats.bMarksmanship = max(33, pSoldier->stats.bMarksmanship);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApplyMilitiaTraits(SOLDIERTYPE* pSoldier)
|
void ApplyMilitiaTraits(SOLDIERTYPE* pSoldier)
|
||||||
@@ -4164,11 +4181,29 @@ void ApplyVisionModifier(const SOLDIERTYPE* pSoldier, INT32& sight)
|
|||||||
if (!gGameExternalOptions.fRebelCommandEnabled)
|
if (!gGameExternalOptions.fRebelCommandEnabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// rftr todo: check bitmask
|
const std::unordered_map<RebelCommandAgentMissions, UINT32>::iterator iter = missionMap.find(RCAM_REDUCE_UNALERTED_ENEMY_VISION);
|
||||||
|
|
||||||
if (pSoldier->bTeam == ENEMY_TEAM && pSoldier->aiData.bAlertStatus == STATUS_GREEN)
|
if (iter == missionMap.end())
|
||||||
|
return;
|
||||||
|
|
||||||
|
MissionSecondEvent evt;
|
||||||
|
DeserialiseMissionSecondEvent(iter->second, evt);
|
||||||
|
|
||||||
|
if (evt.isSecondEvent)
|
||||||
{
|
{
|
||||||
sight = static_cast<INT32>(sight * (1.f - 0.15f));
|
FLOAT modifier = 0.f;
|
||||||
|
switch (evt.extraBits)
|
||||||
|
{
|
||||||
|
case MissionHelpers::REDUCE_UNALERTED_ENEMY_VISION_MODIFIER_COVERT: modifier = gRebelCommandSettings.fReduceUnlaertedEnemyVisionModifier_Covert; break;
|
||||||
|
case MissionHelpers::REDUCE_UNALERTED_ENEMY_VISION_MODIFIER_RADIO: modifier = gRebelCommandSettings.fReduceUnlaertedEnemyVisionModifier_Radio; break;
|
||||||
|
case MissionHelpers::REDUCE_UNALERTED_ENEMY_VISION_MODIFIER_STEALTHY: modifier = gRebelCommandSettings.fReduceUnlaertedEnemyVisionModifier_Stealthy; break;
|
||||||
|
default: modifier = gRebelCommandSettings.fReduceUnlaertedEnemyVisionModifier; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pSoldier->bTeam == ENEMY_TEAM && pSoldier->aiData.bAlertStatus == STATUS_GREEN)
|
||||||
|
{
|
||||||
|
sight = static_cast<INT32>(sight * (1.f - modifier));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4228,8 +4263,6 @@ INT16 GetAdditionalDeployRange(const UINT8 insertionCode)
|
|||||||
if (iter == missionMap.end())
|
if (iter == missionMap.end())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// rftr todo: check bitmask
|
|
||||||
|
|
||||||
INT16 range = 0;
|
INT16 range = 0;
|
||||||
|
|
||||||
MissionSecondEvent evt;
|
MissionSecondEvent evt;
|
||||||
@@ -4287,9 +4320,15 @@ INT8 GetEnemyEquipmentCoolnessModifier()
|
|||||||
if (!gGameExternalOptions.fRebelCommandEnabled)
|
if (!gGameExternalOptions.fRebelCommandEnabled)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// rftr todo: check bitmask
|
const std::unordered_map<RebelCommandAgentMissions, UINT32>::iterator iter = missionMap.find(RCAM_SABOTAGE_INFANTRY_EQUIPMENT);
|
||||||
|
|
||||||
return -1;
|
if (iter == missionMap.end())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
MissionSecondEvent evt;
|
||||||
|
DeserialiseMissionSecondEvent(iter->second, evt);
|
||||||
|
|
||||||
|
return evt.isSecondEvent ? -1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
INT8 GetEnemyEquipmentStatusModifier(const INT8 initialStatus)
|
INT8 GetEnemyEquipmentStatusModifier(const INT8 initialStatus)
|
||||||
@@ -4297,13 +4336,31 @@ INT8 GetEnemyEquipmentStatusModifier(const INT8 initialStatus)
|
|||||||
if (!gGameExternalOptions.fRebelCommandEnabled)
|
if (!gGameExternalOptions.fRebelCommandEnabled)
|
||||||
return initialStatus;
|
return initialStatus;
|
||||||
|
|
||||||
// rftr todo: check bitmask
|
const std::unordered_map<RebelCommandAgentMissions, UINT32>::iterator iter = missionMap.find(RCAM_SABOTAGE_INFANTRY_EQUIPMENT);
|
||||||
|
|
||||||
INT8 newStatus = initialStatus;
|
if (iter == missionMap.end())
|
||||||
newStatus -= 10;
|
return initialStatus;
|
||||||
|
|
||||||
newStatus = max(1, min(newStatus, 100));
|
MissionSecondEvent evt;
|
||||||
return newStatus;
|
DeserialiseMissionSecondEvent(iter->second, evt);
|
||||||
|
|
||||||
|
if (evt.isSecondEvent)
|
||||||
|
{
|
||||||
|
INT8 modifier = 0;
|
||||||
|
switch (evt.extraBits)
|
||||||
|
{
|
||||||
|
case MissionHelpers::SABOTAGE_ENEMY_INFANTRY_EQUIPMENT_MODIFIER_AUTO_WEAPONS: modifier = gRebelCommandSettings.iSabotageInfantryEquipmentModifier_Auto_Weapons; break;
|
||||||
|
case MissionHelpers::SABOTAGE_ENEMY_INFANTRY_EQUIPMENT_MODIFIER_COVERT: modifier = gRebelCommandSettings.iSabotageInfantryEquipmentModifier_Covert; break;
|
||||||
|
case MissionHelpers::SABOTAGE_ENEMY_INFANTRY_EQUIPMENT_MODIFIER_DEMOLITIONS: modifier = gRebelCommandSettings.iSabotageInfantryEquipmentModifier_Demolitions; break;
|
||||||
|
case MissionHelpers::SABOTAGE_ENEMY_INFANTRY_EQUIPMENT_MODIFIER_GUNSLINGER: modifier = gRebelCommandSettings.iSabotageInfantryEquipmentModifier_Gunslinger; break;
|
||||||
|
case MissionHelpers::SABOTAGE_ENEMY_INFANTRY_EQUIPMENT_MODIFIER_RANGER: modifier = gRebelCommandSettings.iSabotageInfantryEquipmentModifier_Ranger; break;
|
||||||
|
case MissionHelpers::SABOTAGE_ENEMY_INFANTRY_EQUIPMENT_MODIFIER_SNIPER: modifier = gRebelCommandSettings.iSabotageInfantryEquipmentModifier_Sniper; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return max(1, min(initialStatus - modifier, 100));
|
||||||
|
}
|
||||||
|
|
||||||
|
return initialStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT8 GetMerchantCoolnessBonus()
|
UINT8 GetMerchantCoolnessBonus()
|
||||||
@@ -4319,8 +4376,6 @@ UINT8 GetMerchantCoolnessBonus()
|
|||||||
MissionSecondEvent evt;
|
MissionSecondEvent evt;
|
||||||
DeserialiseMissionSecondEvent(iter->second, evt);
|
DeserialiseMissionSecondEvent(iter->second, evt);
|
||||||
|
|
||||||
// rftr todo: check bitmask
|
|
||||||
|
|
||||||
return evt.isSecondEvent ? 1 : 0;
|
return evt.isSecondEvent ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4332,13 +4387,11 @@ FLOAT GetStrategicDecisionSpeedModifier()
|
|||||||
const std::unordered_map<RebelCommandAgentMissions, UINT32>::iterator iter = missionMap.find(RCAM_REDUCE_STRATEGIC_DECISION_SPEED);
|
const std::unordered_map<RebelCommandAgentMissions, UINT32>::iterator iter = missionMap.find(RCAM_REDUCE_STRATEGIC_DECISION_SPEED);
|
||||||
|
|
||||||
if (iter == missionMap.end())
|
if (iter == missionMap.end())
|
||||||
return 0;
|
return 1.f;
|
||||||
|
|
||||||
MissionSecondEvent evt;
|
MissionSecondEvent evt;
|
||||||
DeserialiseMissionSecondEvent(iter->second, evt);
|
DeserialiseMissionSecondEvent(iter->second, evt);
|
||||||
|
|
||||||
// rftr todo: check bitmask
|
|
||||||
|
|
||||||
FLOAT modifier = 1.f;
|
FLOAT modifier = 1.f;
|
||||||
|
|
||||||
if (evt.isSecondEvent)
|
if (evt.isSecondEvent)
|
||||||
@@ -4346,6 +4399,8 @@ FLOAT GetStrategicDecisionSpeedModifier()
|
|||||||
switch (evt.extraBits)
|
switch (evt.extraBits)
|
||||||
{
|
{
|
||||||
case MissionHelpers::REDUCE_STRATEGIC_DECISION_SPEED_MODIFIER_COVERT: modifier = gRebelCommandSettings.fReduceStrategicDecisionSpeedModifier_Covert; break;
|
case MissionHelpers::REDUCE_STRATEGIC_DECISION_SPEED_MODIFIER_COVERT: modifier = gRebelCommandSettings.fReduceStrategicDecisionSpeedModifier_Covert; break;
|
||||||
|
case MissionHelpers::REDUCE_STRATEGIC_DECISION_SPEED_MODIFIER_DEPUTY: modifier = gRebelCommandSettings.fReduceStrategicDecisionSpeedModifier_Deputy; break;
|
||||||
|
case MissionHelpers::REDUCE_STRATEGIC_DECISION_SPEED_MODIFIER_SNITCH: modifier = gRebelCommandSettings.fReduceStrategicDecisionSpeedModifier_Snitch; break;
|
||||||
default: modifier = gRebelCommandSettings.fReduceStrategicDecisionSpeedModifier; break;
|
default: modifier = gRebelCommandSettings.fReduceStrategicDecisionSpeedModifier; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4515,8 +4570,6 @@ BOOLEAN ShowEnemyMovementTargets()
|
|||||||
if (iter == missionMap.end())
|
if (iter == missionMap.end())
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
// rftr todo: check bitmask
|
|
||||||
|
|
||||||
MissionSecondEvent evt;
|
MissionSecondEvent evt;
|
||||||
DeserialiseMissionSecondEvent(iter->second, evt);
|
DeserialiseMissionSecondEvent(iter->second, evt);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user