Initial commit - SVN checkpoint to git branch

This commit is contained in:
rftrdev
2022-10-11 00:17:12 -07:00
parent 9cc567644f
commit 7b0830c060
28 changed files with 2232 additions and 206 deletions
+78
View File
@@ -4157,6 +4157,84 @@ void LoadRebelCommandSettings()
gRebelCommandSettings.iFortificationsBonus = iniReader.ReadInteger("Rebel Command Settings", "FORTIFICATIONS_BONUS", 10, 0, 100);
// agent missions
gRebelCommandSettings.iDeepDeploymentSuccessChance = iniReader.ReadInteger("Rebel Command Settings", "DEEP_DEPLOYMENT_SUCCESS_CHANCE", 50, 0, 100);
gRebelCommandSettings.iDeepDeploymentRangeNS = iniReader.ReadInteger("Rebel Command Settings", "DEEP_DEPLOYMENT_RANGE_NS", 200, 0, 1000);
gRebelCommandSettings.iDeepDeploymentRangeEW = iniReader.ReadInteger("Rebel Command Settings", "DEEP_DEPLOYMENT_RANGE_EW", 350, 0, 1000);
gRebelCommandSettings.iDeepDeploymentRangeNS_Bonus_Covert = iniReader.ReadInteger("Rebel Command Settings", "DEEP_DEPLOYMENT_RANGE_NS_BONUS_COVERT", 50, 0, 1000);
gRebelCommandSettings.iDeepDeploymentRangeEW_Bonus_Covert = iniReader.ReadInteger("Rebel Command Settings", "DEEP_DEPLOYMENT_RANGE_EW_BONUS_COVERT" , 15, 0, 1000);
gRebelCommandSettings.iDeepDeploymentRangeNS_Bonus_Scouting = iniReader.ReadInteger("Rebel Command Settings", "DEEP_DEPLOYMENT_RANGE_NS_BONUS_SCOUTING" , 25, 0, 1000);
gRebelCommandSettings.iDeepDeploymentRangeEW_Bonus_Scouting = iniReader.ReadInteger("Rebel Command Settings", "DEEP_DEPLOYMENT_RANGE_EW_BONUS_SCOUTING" , 40, 0, 1000);
gRebelCommandSettings.iDeepDeploymentRangeNS_Bonus_Stealthy = iniReader.ReadInteger("Rebel Command Settings", "DEEP_DEPLOYMENT_RANGE_NS_BONUS_STEALTHY" , 15, 0, 1000);
gRebelCommandSettings.iDeepDeploymentRangeEW_Bonus_Stealthy = iniReader.ReadInteger("Rebel Command Settings", "DEEP_DEPLOYMENT_RANGE_EW_BONUS_STEALTHY" , 30, 0, 1000);
gRebelCommandSettings.iDeepDeploymentRangeNS_Bonus_Survival = iniReader.ReadInteger("Rebel Command Settings", "DEEP_DEPLOYMENT_RANGE_NS_BONUS_SURVIVAL" , 15, 0, 1000);
gRebelCommandSettings.iDeepDeploymentRangeEW_Bonus_Survival = iniReader.ReadInteger("Rebel Command Settings", "DEEP_DEPLOYMENT_RANGE_EW_BONUS_SURVIVAL" , 30, 0, 1000);
gRebelCommandSettings.iDeepDeploymentDuration = iniReader.ReadInteger("Rebel Command Settings", "DEEP_DEPLOYMENT_DURATION" , 72, 0, 255);
gRebelCommandSettings.iDeepDeploymentDuration_Bonus_Covert = iniReader.ReadInteger("Rebel Command Settings", "DEEP_DEPLOYMENT_DURATION_BONUS_COVERT" , 24, 0, 255);
gRebelCommandSettings.iDeepDeploymentDuration_Bonus_Scouting = iniReader.ReadInteger("Rebel Command Settings", "DEEP_DEPLOYMENT_DURATION_BONUS_SCOUTING" , 48, 0, 255);
gRebelCommandSettings.iDeepDeploymentDuration_Bonus_Stealthy = iniReader.ReadInteger("Rebel Command Settings", "DEEP_DEPLOYMENT_DURATION_BONUS_STEALTHY" , 36, 0, 255);
gRebelCommandSettings.iDeepDeploymentDuration_Bonus_Survival = iniReader.ReadInteger("Rebel Command Settings", "DEEP_DEPLOYMENT_DURATION_BONUS_SURVIVAL" , 36, 0, 255);
gRebelCommandSettings.iGetEnemyMovementTargetsSuccessChance = iniReader.ReadInteger("Rebel Command Settings", "STRATEGIC_INTEL_SUCCESS_CHANCE", 50, 0, 100);
gRebelCommandSettings.iGetEnemyMovementTargetsDuration = iniReader.ReadInteger("Rebel Command Settings", "STRATEGIC_INTEL_DURATION", 72, 0, 255);
gRebelCommandSettings.iGetEnemyMovementTargetsDuration_Bonus_Covert = iniReader.ReadInteger("Rebel Command Settings", "STRATEGIC_INTEL_DURATION_BONUS_COVERT", 48, 0, 255);
gRebelCommandSettings.iGetEnemyMovementTargetsDuration_Bonus_Radio = iniReader.ReadInteger("Rebel Command Settings", "STRATEGIC_INTEL_DURATION_BONUS_RADIO", 48, 0, 255);
gRebelCommandSettings.iImproveLocalShopsSuccessChance = iniReader.ReadInteger("Rebel Command Settings", "IMPROVE_LOCAL_SHOPS_SUCCESS_CHANCE", 50, 0, 100);
gRebelCommandSettings.iImproveLocalShopsDuration = iniReader.ReadInteger("Rebel Command Settings", "IMPROVE_LOCAL_SHOPS_DURATION", 72, 0, 255);
gRebelCommandSettings.iReduceStrategicDecisionSpeedSuccessChance = iniReader.ReadInteger("Rebel Command Settings", "SLOWER_STRATEGIC_DECISIONS_SUCCESS_CHANCE", 50, 0, 100);
gRebelCommandSettings.fReduceStrategicDecisionSpeedModifier = iniReader.ReadFloat("Rebel Command Settings", "SLOWER_STRATEGIC_DECISIONS_MODIFIER", 1.1f, 1.f, 10.f);
gRebelCommandSettings.fReduceStrategicDecisionSpeedModifier_Covert = iniReader.ReadFloat("Rebel Command Settings", "SLOWER_STRATEGIC_DECISIONS_MODIFIER_BONUS_COVERT", 1.25f, 1.f, 10.f);
gRebelCommandSettings.fReduceStrategicDecisionSpeedModifier_Deputy = iniReader.ReadFloat("Rebel Command Settings", "SLOWER_STRATEGIC_DECISIONS_MODIFIER_BONUS_DEPUTY", 1.25f, 1.f, 10.f);
gRebelCommandSettings.fReduceStrategicDecisionSpeedModifier_Snitch = iniReader.ReadFloat("Rebel Command Settings", "SLOWER_STRATEGIC_DECISIONS_MODIFIER_BONUS_SNITCH", 1.25f, 1.f, 10.f);
gRebelCommandSettings.iReduceStrategicDecisionSpeedDuration = iniReader.ReadInteger("Rebel Command Settings", "SLOWER_STRATEGIC_DECISIONS_DURATION", 72, 0, 255);
gRebelCommandSettings.iReduceStrategicDecisionSpeedDuration_Bonus_Covert = iniReader.ReadInteger("Rebel Command Settings", "SLOWER_STRATEGIC_DECISIONS_DURATION_BONUS_COVERT", 24, 0, 255);
gRebelCommandSettings.iReduceStrategicDecisionSpeedDuration_Bonus_Deputy = iniReader.ReadInteger("Rebel Command Settings", "SLOWER_STRATEGIC_DECISIONS_DURATION_BONUS_DEPUTY", 24, 0, 255);
gRebelCommandSettings.iReduceStrategicDecisionSpeedDuration_Bonus_Snitch = iniReader.ReadInteger("Rebel Command Settings", "SLOWER_STRATEGIC_DECISIONS_DURATION_BONUS_SNITCH", 24, 0, 255);
gRebelCommandSettings.iReduceUnalertedEnemyVisionSuccessChance = iniReader.ReadInteger("Rebel Command Settings", "LOWER_READINESS_SUCCESS_CHANCE", 50, 0, 100);
gRebelCommandSettings.fReduceUnlaertedEnemyVisionModifier = iniReader.ReadFloat("Rebel Command Settings", "LOWER_READINESS_MODIFIER", 0.15f, 0.f, 1.f);
gRebelCommandSettings.fReduceUnlaertedEnemyVisionModifier_Covert = iniReader.ReadFloat("Rebel Command Settings", "LOWER_READINESS_MODIFIER_COVERT", 0.15f, 0.f, 1.f);
gRebelCommandSettings.fReduceUnlaertedEnemyVisionModifier_Radio = iniReader.ReadFloat("Rebel Command Settings", "LOWER_READINESS_MODIFIER_RADIO", 0.15f, 0.f, 1.f);
gRebelCommandSettings.fReduceUnlaertedEnemyVisionModifier_Stealthy = iniReader.ReadFloat("Rebel Command Settings", "LOWER_READINESS_MODIFIER_STEALTHY", 0.15f, 0.f, 1.f);
gRebelCommandSettings.iReduceUnalertedEnemyVisionDuration = iniReader.ReadInteger("Rebel Command Settings", "LOWER_READINESS_DURATION", 72, 0, 255);
gRebelCommandSettings.iReduceUnalertedEnemyVisionDuration_Bonus_Covert = iniReader.ReadInteger("Rebel Command Settings", "LOWER_READINESS_DURATION_BONUS_COVERT", 72, 0, 255);
gRebelCommandSettings.iReduceUnalertedEnemyVisionDuration_Bonus_Radio = iniReader.ReadInteger("Rebel Command Settings", "LOWER_READINESS_DURATION_BONUS_RADIO", 72, 0, 255);
gRebelCommandSettings.iSabotageInfantryEquipmentSuccessChance = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_EQUIPMENT_SUCCESS_CHANCE", 50, 0, 100);
gRebelCommandSettings.iSabotageInfantryEquipmentModifier = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_EQUIPMENT_MODIFIER", 10, 0, 100);
gRebelCommandSettings.iSabotageInfantryEquipmentModifier_Auto_Weapons = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_EQUIPMENT_MODIFIER_AUTO_WEAPONS", 10, 0, 100);
gRebelCommandSettings.iSabotageInfantryEquipmentModifier_Covert = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_EQUIPMENT_MODIFIER_COVERT", 10, 0, 100);
gRebelCommandSettings.iSabotageInfantryEquipmentModifier_Demolitions = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_EQUIPMENT_MODIFIER_DEMOLITIONS", 10, 0, 100);
gRebelCommandSettings.iSabotageInfantryEquipmentModifier_Gunslinger = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_EQUIPMENT_MODIFIER_GUNSLINGER", 10, 0, 100);
gRebelCommandSettings.iSabotageInfantryEquipmentModifier_Ranger = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_EQUIPMENT_MODIFIER_RANGER", 10, 0, 100);
gRebelCommandSettings.iSabotageInfantryEquipmentModifier_Sniper = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_EQUIPMENT_MODIFIER_SNIPER", 10, 0, 100);
gRebelCommandSettings.iSabotageInfantryEquipmentDuration = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_EQUIPMENT_DURATION", 72, 0, 255);
gRebelCommandSettings.iSabotageInfantryEquipmentDuration_Bonus_Auto_Weapons = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_EQUIPMENT_DURATION_BONUS_AUTO_WEAPONS", 72, 0, 255);
gRebelCommandSettings.iSabotageInfantryEquipmentDuration_Bonus_Covert = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_EQUIPMENT_DURATION_BONUS_COVERT", 72, 0, 255);
gRebelCommandSettings.iSabotageInfantryEquipmentDuration_Bonus_Demolitions = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_EQUIPMENT_DURATION_BONUS_DEMOLITIONS", 72, 0, 255);
gRebelCommandSettings.iSabotageInfantryEquipmentDuration_Bonus_Gunslinger = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_EQUIPMENT_DURATION_BONUS_GUNSLINGER", 72, 0, 255);
gRebelCommandSettings.iSabotageInfantryEquipmentDuration_Bonus_Ranger = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_EQUIPMENT_DURATION_BONUS_RANGER", 72, 0, 255);
gRebelCommandSettings.iSabotageInfantryEquipmentDuration_Bonus_Sniper = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_EQUIPMENT_DURATION_BONUS_SNIPER", 72, 0, 255);
gRebelCommandSettings.iSabotageMechanicalUnitsSuccessChance = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_VEHICLES_SUCCESS_CHANCE", 50, 0, 100);
gRebelCommandSettings.iSabotageMechanicalUnitsStatLoss = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_VEHICLES_STAT_LOSS", 20, 0, 100);
gRebelCommandSettings.iSabotageMechanicalUnitsStatLoss_Covert = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_VEHICLES_STAT_LOSS_COVERT", 20, 0, 100);
gRebelCommandSettings.iSabotageMechanicalUnitsStatLoss_Demolitions = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_VEHICLES_STAT_LOSS_DEMOLITIONS", 20, 0, 100);
gRebelCommandSettings.iSabotageMechanicalUnitsStatLoss_Heavy_Weapons = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_VEHICLES_STAT_LOSS_HEAVY_WEAPONS", 20, 0, 100);
gRebelCommandSettings.iSabotageMechanicalUnitsDuration = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_VEHICLES_DURATION", 72, 0, 255);
gRebelCommandSettings.iSabotageMechanicalUnitsDuration_Bonus_Covert = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_VEHICLES_DURATION_BONUS_COVERT", 72, 0, 255);
gRebelCommandSettings.iSabotageMechanicalUnitsDuration_Bonus_Demolitions = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_VEHICLES_DURATION_BONUS_DEMOLITIONS", 72, 0, 255);
gRebelCommandSettings.iSabotageMechanicalUnitsDuration_Bonus_Heavy_Weapons = iniReader.ReadInteger("Rebel Command Settings", "SABOTAGE_VEHICLES_DURATION_BONUS_HEAVY_WEAPONS", 72, 0, 255);
gRebelCommandSettings.iTrainMilitiaAnywhereSuccessChance = iniReader.ReadInteger("Rebel Command Settings", "TRAIN_MILITIA_ANYWHERE_SUCCESS_CHANCE", 50, 0, 100);
gRebelCommandSettings.iTrainMilitiaAnywhereMaxTrainers = iniReader.ReadInteger("Rebel Command Settings", "TRAIN_MILITIA_ANYWHERE_MAX_TRAINERS", 1, 1, 4);
gRebelCommandSettings.iTrainMilitiaAnywhereMaxTrainers_Teaching = iniReader.ReadInteger("Rebel Command Settings", "TRAIN_MILITIA_ANYWHERE_MAX_TRAINERS_TEACHING", 1, 1, 4);
gRebelCommandSettings.iTrainMilitiaAnywhereDuration = iniReader.ReadInteger("Rebel Command Settings", "TRAIN_MILITIA_ANYWHERE_DURATION", 72, 0, 255);;
gRebelCommandSettings.iTrainMilitiaAnywhereDuration_Bonus_Covert = iniReader.ReadInteger("Rebel Command Settings", "TRAIN_MILITIA_ANYWHERE_DURATION_BONUS_COVERT", 72, 0, 255);;
gRebelCommandSettings.iTrainMilitiaAnywhereDuration_Bonus_Survival = iniReader.ReadInteger("Rebel Command Settings", "TRAIN_MILITIA_ANYWHERE_DURATION_BONUS_SURVIVAL", 72, 0, 255);;
gRebelCommandSettings.iTrainMilitiaAnywhereDuration_Bonus_Teaching = iniReader.ReadInteger("Rebel Command Settings", "TRAIN_MILITIA_ANYWHERE_DURATION_BONUS_TEACHING", 72, 0, 255);;
}
void FreeGameExternalOptions()
+79
View File
@@ -1842,6 +1842,85 @@ typedef struct
INT16 iFortificationsBonus;
// agent missions
INT8 iDeepDeploymentSuccessChance;
INT16 iDeepDeploymentRangeNS;
INT16 iDeepDeploymentRangeEW;
INT16 iDeepDeploymentRangeNS_Bonus_Covert;
INT16 iDeepDeploymentRangeEW_Bonus_Covert;
INT16 iDeepDeploymentRangeNS_Bonus_Scouting;
INT16 iDeepDeploymentRangeEW_Bonus_Scouting;
INT16 iDeepDeploymentRangeNS_Bonus_Stealthy;
INT16 iDeepDeploymentRangeEW_Bonus_Stealthy;
INT16 iDeepDeploymentRangeNS_Bonus_Survival;
INT16 iDeepDeploymentRangeEW_Bonus_Survival;
UINT8 iDeepDeploymentDuration;
UINT8 iDeepDeploymentDuration_Bonus_Covert;
UINT8 iDeepDeploymentDuration_Bonus_Scouting;
UINT8 iDeepDeploymentDuration_Bonus_Stealthy;
UINT8 iDeepDeploymentDuration_Bonus_Survival;
INT8 iGetEnemyMovementTargetsSuccessChance;
UINT8 iGetEnemyMovementTargetsDuration;
UINT8 iGetEnemyMovementTargetsDuration_Bonus_Covert;
UINT8 iGetEnemyMovementTargetsDuration_Bonus_Radio;
INT8 iImproveLocalShopsSuccessChance;
UINT8 iImproveLocalShopsDuration;
INT8 iReduceStrategicDecisionSpeedSuccessChance;
FLOAT fReduceStrategicDecisionSpeedModifier;
FLOAT fReduceStrategicDecisionSpeedModifier_Covert;
FLOAT fReduceStrategicDecisionSpeedModifier_Deputy;
FLOAT fReduceStrategicDecisionSpeedModifier_Snitch;
UINT8 iReduceStrategicDecisionSpeedDuration;
UINT8 iReduceStrategicDecisionSpeedDuration_Bonus_Covert;
UINT8 iReduceStrategicDecisionSpeedDuration_Bonus_Deputy;
UINT8 iReduceStrategicDecisionSpeedDuration_Bonus_Snitch;
INT8 iReduceUnalertedEnemyVisionSuccessChance;
FLOAT fReduceUnlaertedEnemyVisionModifier;
FLOAT fReduceUnlaertedEnemyVisionModifier_Covert;
FLOAT fReduceUnlaertedEnemyVisionModifier_Radio;
FLOAT fReduceUnlaertedEnemyVisionModifier_Stealthy;
UINT8 iReduceUnalertedEnemyVisionDuration;
UINT8 iReduceUnalertedEnemyVisionDuration_Bonus_Covert;
UINT8 iReduceUnalertedEnemyVisionDuration_Bonus_Radio;
INT8 iSabotageInfantryEquipmentSuccessChance;
INT8 iSabotageInfantryEquipmentModifier;
INT8 iSabotageInfantryEquipmentModifier_Auto_Weapons;
INT8 iSabotageInfantryEquipmentModifier_Covert;
INT8 iSabotageInfantryEquipmentModifier_Demolitions;
INT8 iSabotageInfantryEquipmentModifier_Gunslinger;
INT8 iSabotageInfantryEquipmentModifier_Ranger;
INT8 iSabotageInfantryEquipmentModifier_Sniper;
UINT8 iSabotageInfantryEquipmentDuration;
UINT8 iSabotageInfantryEquipmentDuration_Bonus_Auto_Weapons;
UINT8 iSabotageInfantryEquipmentDuration_Bonus_Covert;
UINT8 iSabotageInfantryEquipmentDuration_Bonus_Demolitions;
UINT8 iSabotageInfantryEquipmentDuration_Bonus_Gunslinger;
UINT8 iSabotageInfantryEquipmentDuration_Bonus_Ranger;
UINT8 iSabotageInfantryEquipmentDuration_Bonus_Sniper;
INT8 iSabotageMechanicalUnitsSuccessChance;
INT8 iSabotageMechanicalUnitsStatLoss;
INT8 iSabotageMechanicalUnitsStatLoss_Covert;
INT8 iSabotageMechanicalUnitsStatLoss_Demolitions;
INT8 iSabotageMechanicalUnitsStatLoss_Heavy_Weapons;
UINT8 iSabotageMechanicalUnitsDuration;
UINT8 iSabotageMechanicalUnitsDuration_Bonus_Covert;
UINT8 iSabotageMechanicalUnitsDuration_Bonus_Demolitions;
UINT8 iSabotageMechanicalUnitsDuration_Bonus_Heavy_Weapons;
INT8 iTrainMilitiaAnywhereSuccessChance;
INT8 iTrainMilitiaAnywhereMaxTrainers;
INT8 iTrainMilitiaAnywhereMaxTrainers_Teaching;
UINT8 iTrainMilitiaAnywhereDuration;
UINT8 iTrainMilitiaAnywhereDuration_Bonus_Covert;
UINT8 iTrainMilitiaAnywhereDuration_Bonus_Survival;
UINT8 iTrainMilitiaAnywhereDuration_Bonus_Teaching;
} REBELCOMMAND_SETTINGS;
typedef struct
+17 -3
View File
@@ -1,3 +1,4 @@
#pragma optimize("",off)
#ifdef PRECOMPILEDHEADERS
#include "Strategic All.h"
#include "GameSettings.h"
@@ -1658,6 +1659,9 @@ BOOLEAN BasicCanCharacterTrainMilitia( SOLDIERTYPE *pSoldier )
// check if sam site
if( fSamSitePresent == FALSE )
{
if (RebelCommand::CanTrainMilitiaAnywhere())
return( TRUE );
// nope
return ( FALSE );
}
@@ -1971,6 +1975,9 @@ BOOLEAN CanCharacterTrainMilitia( SOLDIERTYPE *pSoldier )
}
}
if (RebelCommand::CanTrainMilitiaAnywhere())
ubFacilityTrainersAllowed = RebelCommand::GetMaxTrainersForTrainMilitiaAnywhere();
// Count number of trainers already operating here
if ( CountMilitiaTrainersInSoldiersSector( pSoldier, TOWN_MILITIA ) >= ubFacilityTrainersAllowed )
{
@@ -2033,6 +2040,9 @@ BOOLEAN DoesSectorMercIsInHaveSufficientLoyaltyToTrainMilitia( SOLDIERTYPE *pSol
{
return( TRUE );
}
if (RebelCommand::CanTrainMilitiaAnywhere())
return(TRUE);
return( FALSE );
}
@@ -2085,7 +2095,7 @@ BOOLEAN IsMilitiaTrainableFromSoldiersSectorMaxed( SOLDIERTYPE *pSoldier, INT8 i
// is there a town really here
if( bTownId == BLANK_SECTOR )
{
fSamSitePresent = IsThisSectorASAMSector( pSoldier->sSectorX, pSoldier->sSectorY, pSoldier->bSectorZ );
fSamSitePresent = IsThisSectorASAMSector( pSoldier->sSectorX, pSoldier->sSectorY, pSoldier->bSectorZ ) || RebelCommand::CanTrainMilitiaAnywhere();
// if there is a sam site here
if( fSamSitePresent )
@@ -6136,7 +6146,8 @@ void HandleTrainingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
}
// check if we're doing a sector where militia can be trained
if( ( (StrategicMap[CALCULATE_STRATEGIC_INDEX(sMapX, sMapY) ].bNameId != BLANK_SECTOR ) || ( fSamSiteInSector == TRUE ) ) && (bZ == 0) )
const BOOL canTrainMilitiaAnywhere = RebelCommand::CanTrainMilitiaAnywhere();
if( (canTrainMilitiaAnywhere || (StrategicMap[CALCULATE_STRATEGIC_INDEX(sMapX, sMapY) ].bNameId != BLANK_SECTOR ) || ( fSamSiteInSector == TRUE ) ) && (bZ == 0) )
{
// init town trainer list
memset( TownTrainer, 0, sizeof( TownTrainer ) );
@@ -7898,7 +7909,7 @@ BOOLEAN TrainTownInSector( SOLDIERTYPE *pTrainer, INT16 sMapX, INT16 sMapY, INT1
// get town index
ubTownId = StrategicMap[CALCULATE_STRATEGIC_INDEX(pTrainer->sSectorX, pTrainer->sSectorY ) ].bNameId;
if( fSamSiteInSector == FALSE )
if( fSamSiteInSector == FALSE && !RebelCommand::CanTrainMilitiaAnywhere())
{
AssertNE(ubTownId, BLANK_SECTOR);
}
@@ -20165,6 +20176,9 @@ BOOLEAN CanCharacterTrainMilitiaWithErrorReport( SOLDIERTYPE *pSoldier )
}
}
if (RebelCommand::CanTrainMilitiaAnywhere())
ubFacilityTrainersAllowed = RebelCommand::GetMaxTrainersForTrainMilitiaAnywhere();
// If we are here, then TrainersAllowed > 0.
// Otherwise we'd have failed the BasicCanTrain check
if ( CountMilitiaTrainersInSoldiersSector( pSoldier, TOWN_MILITIA ) >= ubFacilityTrainersAllowed )
+1
View File
@@ -100,6 +100,7 @@ enum
ADMINISTRATION, // merc boosts the effectiveness of other mercs
EXPLORATION, // merc searches the sector for undiscovered items
ASSIGNMENT_MINIEVENT,
ASSIGNMENT_REBELCOMMAND,
NUM_ASSIGNMENTS,
};
+5
View File
@@ -51,6 +51,7 @@
#include "Player Command.h" // added by Flugente
#include "LuaInitNPCs.h" // added by Flugente
#include "MiniEvents.h"
#include "Rebel Command.h"
#endif
#include "connect.h"
@@ -680,6 +681,10 @@ BOOLEAN ExecuteStrategicEvent( STRATEGICEVENT *pEvent )
CheckMiniEvents(pEvent->uiParam);
}
break;
case EVENT_REBELCOMMAND:
RebelCommand::HandleStrategicEvent(pEvent->uiParam);
break;
}
gfPreventDeletionOfAnyEvent = fOrigPreventFlag;
return TRUE;
+2
View File
@@ -152,6 +152,8 @@ enum
EVENT_MINIEVENT,
EVENT_REBELCOMMAND,
NUMBER_OF_EVENT_TYPES_PLUS_ONE,
NUMBER_OF_EVENT_TYPES = NUMBER_OF_EVENT_TYPES_PLUS_ONE - 1
};
+1
View File
@@ -140,6 +140,7 @@ CHAR16 gEventName[NUMBER_OF_EVENT_TYPES_PLUS_ONE][40]={
L"bandit attack",
L"ArmyFinishTraining",
L"MiniEvent",
L"ARC_Event",
};
#endif
+38
View File
@@ -1,3 +1,4 @@
#pragma optimize("",off)
#ifdef PRECOMPILEDHEADERS
#include "Strategic All.h"
#include "GameSettings.h"
@@ -49,6 +50,7 @@
#include "Map Screen Interface Map Inventory.h" // added by Flugente
#include "LuaInitNPCs.h" // added by Flugente
#include "Game Event Hook.h" // added by Flugente
#include "Rebel Command.h"
#endif
#include "Quests.h"
@@ -844,6 +846,42 @@ void fillMapColoursForVisitedSectors(INT32(&colorMap)[ MAXIMUM_VALID_Y_COORDINAT
}
}
}
if (RebelCommand::ShowEnemyMovementTargets())
{
const auto targetColor = MAP_SHADE_LT_RED;
GROUP* pGroup = gpGroupList;
while (pGroup)
{
if (pGroup->usGroupTeam == ENEMY_TEAM)
{
const UINT8 intention = pGroup->pEnemyGroup->ubIntention;
if (intention == STAGING
|| intention == REINFORCEMENTS
|| intention == PURSUIT
|| intention == ASSAULT)
{
WAYPOINT* wp = pGroup->pWaypoints;
while (wp)
{
if (wp->next == nullptr)
break;
wp = wp->next;
}
if (GetSectorFlagStatus(wp->x-1, wp->y-1, (UINT8)iCurrentMapSectorZ, SF_ALREADY_VISITED))
{
colorMap[wp->y-1][wp->x-1] = targetColor;
}
}
}
pGroup = pGroup->next;
}
}
}
+1
View File
@@ -1529,6 +1529,7 @@ void MiniEventsLua(UINT32 eventId)
&& pSoldier->stats.bLife > 0
&& pSoldier->bAssignment != IN_TRANSIT
&& pSoldier->bAssignment != ASSIGNMENT_POW
&& pSoldier->bAssignment != ASSIGNMENT_REBELCOMMAND
&& !(pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE))
{
gAllMercs.push_back(pSoldier);
+1787 -133
View File
File diff suppressed because it is too large Load Diff
+89 -5
View File
@@ -6,9 +6,43 @@
#include "Types.h"
#define REBEL_COMMAND_MAX_ACTIONS_PER_REGION 6
#define NUM_ARC_AGENT_SLOTS 2
namespace RebelCommand
{
// applies to RegionSaveInfo.actionLevels: use the MSB as the active flag since I don't expect it to be used otherwise
constexpr UINT8 ADMIN_ACTION_ACTIVE_BIT = 1 << 7;
// for rebelCommandSaveInfo.uBitMask
// requirement breakdown
// 1 bit for notification toggle
// 5 * 4 bits for random mission selection (2off, 2def) = 32 choices each
// need some bits to track mission area (friendly/hostile? num towns?)
// remaining bits to track up/downgrades?
// some should be ASD specific?
// can we not do this and just check strategic events? GetAllStrategicEventsOfType(). could be costly. iterates over event LL on each call
// can we cache in-flight events on load? no real need to save this, right?
//constexpr UINT64 AGENT_NOTIFICATION_BIT = 1 << 0;
// the FIRST and SECOND strategic events share the same type (EVENT_REBELCOMMAND - no need to have multiple types yet, I think...)
// so the 32-bit int will have to block out information for both events
// FIRST EVENT BREAKDOWN
// A######B CCCCCCCC DDDDDDDD EEEEEEEE
// A (1 bit) - always 0 to indicate that this is the FIRST event (ie, keeping a merc busy for a set duration)
// B (1 bit) - 0 if the player sent a generic rebel agent, 1 if the player sent one of their own mercs
// C (8 bit) - the profile number of the merc that was sent. invalid if B == 0
// D (8 bit) - the mission ID. should match up with RebelCommandAgentMissions enum
// E (8 bit) - the mission duration, in hours. if 0, mission failed.
// the rest of the bits depend on the mission?
//
// SECOND EVENT BREAKDOWN
// A####### #######B CCCCCCCC DDDDDDDD
// A (1 bit) - always 1 to indicate that this is the SECOND event (ie, this event fires when the mission bonus expires)
// B (1 bit) - 0 if the player sent a generic rebel agent, 1 if the player sent one of their own mercs
// C (8 bit) - the profile number of the merc that was sent. invalid if B == 0
// D (8 bit) - the mission ID. should match up with RebelCommandAgentMissions enum
// extra bits are for ???????????
enum RebelCommandDirectives
{
@@ -49,6 +83,36 @@ enum RebelCommandAdminActions
RCAA_NUM_ACTIONS
};
enum RebelCommandAgentMissions
{
RCAM_NONE = -1,
RCAM_DEEP_DEPLOYMENT = 0,
RCAM_GET_ENEMY_MOVEMENT_TARGETS, // aka Strategic Intel
RCAM_IMPROVE_LOCAL_SHOPS,
RCAM_REDUCE_STRATEGIC_DECISION_SPEED, // aka Slower Strategic Decisions
RCAM_REDUCE_UNALERTED_ENEMY_VISION, // aka Lower Readiness
RCAM_SABOTAGE_INFANTRY_EQUIPMENT, // aka Sabotage Equipment
RCAM_SABOTAGE_MECHANICAL_UNITS, // aka Sabotage Vehicles
RCAM_TRAIN_MILITIA_ANYWHERE,
RCAM_NUM_MISSIONS,
// ideas/unimplemented - rename some?
// need to have permanent and temporary boons
RCAM_SEND_SUPPLIES_TO_TOWN,
RCAM_BOOST_TOWN_ADMIN_ACTIONS,
RCAM_PROCURE_ITEMS,
RCAM_MILITIA_SKILL_TRAITS, // should override militia skill traits ini option - split into multiple (weapon spec, bodybuilding, athletic, night ops)
RCAM_OBSERVE_SECTORS, // ??? competes with scouts?
RCAM_PURCHASE_SUPPLIES, // increase daily supply income, decrease daily $ income
RCAM_SABOTAGE_ASD, // see ASD.cpp for things that can be played with
RCAM_SABOTAGE_MINE,
RCAM_REDUCE_ENEMY_POOL, // need to make sure enemy pool is not infinite // giReinforcementPool, also gfUnlimitedTroops = zDiffSetting[gGameOptions.ubDifficultyLevel].bUnlimitedPoolOfTroops;
// militia/mercs get bonus vision (???)
// share vision with civilians?
};
enum RegionAdminStatus
{
RAS_NONE,
@@ -97,8 +161,13 @@ typedef struct RegionSaveInfo
UINT8 actionLevels[REBEL_COMMAND_MAX_ACTIONS_PER_REGION];
UINT8 ubMaxLoyalty;
BOOLEAN IsActive(UINT8 index) { return (actionLevels[index] & ADMIN_ACTION_ACTIVE_BIT) == 0; }
// rftr: I know these fly in the face of convention, but I'm lazy and this preserves savegame compatibility without needing to add any additional code
void SetActive(UINT8 index) { actionLevels[index] &= ~ADMIN_ACTION_ACTIVE_BIT; } // active bit value = 0
void SetInactive(UINT8 index) { actionLevels[index] |= ADMIN_ACTION_ACTIVE_BIT; } // inactive bit value = 1
INT32 GetAdminDeployCost(INT16 numAdminTeams) { return 10 * numAdminTeams * numAdminTeams; };
INT32 GetAdminReactivateCost(INT16 numAdminTeams) { return GetAdminDeployCost(numAdminTeams) / 4; };
UINT8 GetLevel(INT16 index) { return actionLevels[index] & ~ADMIN_ACTION_ACTIVE_BIT; }
} RegionSaveInfo;
typedef struct SaveInfo
@@ -110,9 +179,10 @@ typedef struct SaveInfo
INT32 iActiveDirective;
INT32 iSelectedDirective;
INT8 iMilitiaStatsLevel;
UINT8 uSupplyDropCount;
UINT8 uSupplyDropCount; // keeping this around for compatibility with old saves
INT8 availableMissions[NUM_ARC_AGENT_SLOTS];
INT8 filler[19];
INT8 filler[17];
} SaveInfo;
extern SaveInfo rebelCommandSaveInfo;
@@ -122,6 +192,7 @@ void ExitWebsite();
void RenderWebsite();
void HandleWebsite();
// admin actions
void ApplyEnemyPenalties(SOLDIERTYPE* pSoldier);
void ApplyMilitiaBonuses(SOLDIERTYPE* pMilitia);
UINT8 GetApproximateEnemyLocationResolutionIndex();
@@ -139,17 +210,30 @@ FLOAT GetPathfindersSpeedBonus(UINT8 sector);
BOOLEAN NeutraliseRole(const SOLDIERTYPE* pSoldier);
void RaidMines(INT32 &playerIncome, INT32 &enemyIncome);
BOOLEAN ShowApproximateEnemyLocations();
void ShowWebsiteAvailableMessage();
// agent missions
void ApplyEnemyMechanicalUnitPenalties(SOLDIERTYPE* pSoldier);
void ApplyMilitiaTraits(SOLDIERTYPE* pSoldier);
void ApplyVisionModifier(const SOLDIERTYPE* pSoldier, INT32& sight);
BOOLEAN CanAssignTraitsToMilitia();
BOOLEAN CanTrainMilitiaAnywhere();
UINT8 GetMaxTrainersForTrainMilitiaAnywhere();
INT16 GetAdditionalDeployRange(const UINT8 insertionCode);
INT8 GetEnemyEquipmentCoolnessModifier();
INT8 GetEnemyEquipmentStatusModifier(const INT8 initialStatus);
UINT8 GetMerchantCoolnessBonus();
FLOAT GetStrategicDecisionSpeedModifier();
void HandleStrategicEvent(const UINT32 eventParam);
BOOLEAN ShowEnemyMovementTargets();
void DailyUpdate();
void HourlyUpdate();
void Init();
void ShowWebsiteAvailableMessage();
BOOLEAN Load(HWFILE file);
BOOLEAN Save(HWFILE file);
}
//BOOLEAN LoadRebelCommand( HWFILE file ) { return RebelCommand::Load( file ); }
#endif
+5
View File
@@ -36,6 +36,7 @@
#include "Map Information.h"
#include "interface dialogue.h"
#include "ASD.h" // added by Flugente
#include "Rebel Command.h"
#endif
#include "GameInitOptionsScreen.h"
@@ -1198,6 +1199,8 @@ void InitStrategicAI()
dEnemyGeneralsSpeedupFactor = max( 0.5f, dEnemyGeneralsSpeedupFactor - gStrategicStatus.usVIPsLeft * gGameExternalOptions.fEnemyGeneralStrategicDecisionSpeedBonus );
}
dEnemyGeneralsSpeedupFactor *= RebelCommand::GetStrategicDecisionSpeedModifier();
giReinforcementPool = zDiffSetting[gGameOptions.ubDifficultyLevel].iQueensInitialPoolOfTroops;
giForcePercentage = zDiffSetting[gGameOptions.ubDifficultyLevel].iInitialGarrisonPercentages;
giArmyAlertness = zDiffSetting[gGameOptions.ubDifficultyLevel].iEnemyStartingAlertLevel;
@@ -3456,6 +3459,8 @@ void EvaluateQueenSituation()
{
dEnemyGeneralsSpeedupFactor = max( 0.5f, dEnemyGeneralsSpeedupFactor - gStrategicStatus.usVIPsLeft * gGameExternalOptions.fEnemyGeneralStrategicDecisionSpeedBonus );
}
dEnemyGeneralsSpeedupFactor *= RebelCommand::GetStrategicDecisionSpeedModifier();
uiOffset += dEnemyGeneralsSpeedupFactor * (zDiffSetting[gGameOptions.ubDifficultyLevel].iBaseDelayInMinutesBetweenEvaluations + Random( zDiffSetting[gGameOptions.ubDifficultyLevel].iEvaluationDelayVariance ));
+3 -2
View File
@@ -1,3 +1,4 @@
#pragma optimize("",off)
#include "builddefines.h"
#ifdef PRECOMPILEDHEADERS
@@ -279,7 +280,7 @@ void TownMilitiaTrainingCompleted( SOLDIERTYPE *pTrainer, INT16 sMapX, INT16 sMa
if( ubTownId == BLANK_SECTOR )
{
Assert( IsThisSectorASAMSector( sMapX, sMapY, 0 ) );
Assert( IsThisSectorASAMSector( sMapX, sMapY, 0 ) || RebelCommand::CanTrainMilitiaAnywhere() );
}
// force tactical to update militia status
@@ -1293,7 +1294,7 @@ BOOLEAN IsSAMSiteFullOfMilitia( INT16 sSectorX, INT16 sSectorY, INT8 iMilitiaTyp
INT32 iMaxMilitiaPerSector = gGameExternalOptions.iMaxMilitiaPerSector;
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"Militia5");
// check if SAM site is ours?
fSamSitePresent = IsThisSectorASAMSector( sSectorX, sSectorY, 0 );
fSamSitePresent = IsThisSectorASAMSector(sSectorX, sSectorY, 0) || RebelCommand::CanTrainMilitiaAnywhere();
if( fSamSitePresent == FALSE )
{
+4 -2
View File
@@ -1,3 +1,4 @@
#pragma optimize("",off)
#ifdef PRECOMPILEDHEADERS
#include "Tactical All.h"
#else
@@ -15,6 +16,7 @@
#include "Random.h"
#include "Shopkeeper Interface.h"
#include "connect.h"
#include "Rebel Command.h"
#endif
//forward declarations of common classes to eliminate includes
@@ -1008,8 +1010,8 @@ UINT8 GetCurrentSuitabilityForItem( INT8 bArmsDealer, UINT16 usItemIndex, BOOLEA
// WDS - Improve Tony's and Devin's inventory like BR's
// Tony has the better stuff sooner (than Bobby R's)
if (bArmsDealer >= 0) {
ubMinCoolness += armsDealerInfo[bArmsDealer].addToCoolness;
ubMaxCoolness += armsDealerInfo[bArmsDealer].addToCoolness;
ubMinCoolness += armsDealerInfo[bArmsDealer].addToCoolness + RebelCommand::GetMerchantCoolnessBonus();
ubMaxCoolness += armsDealerInfo[bArmsDealer].addToCoolness + RebelCommand::GetMerchantCoolnessBonus();
ubMinCoolness = max( armsDealerInfo[bArmsDealer].minCoolness, min( 9, ubMinCoolness ) );
// silversurfer: max coolness should never be lower than min coolness!
//ubMaxCoolness = max( 2, min( armsDealerInfo[bArmsDealer].maxCoolness, ubMaxCoolness ) );
+8 -2
View File
@@ -1,3 +1,4 @@
#pragma optimize("",off)
#ifdef PRECOMPILEDHEADERS
#include "AI All.h"
#include "DisplayCover.h"
@@ -34,6 +35,7 @@
#include "UI Cursors.h"
#include "soldier profile type.h"
#include "Interface Cursors.h" // added by Flugente for UICursorDefines
#include "Rebel Command.h"
#endif
//forward declarations of common classes to eliminate includes
@@ -759,7 +761,7 @@ void CalculateCoverFromSoldier( SOLDIERTYPE* pFromSoldier, const INT32& sTargetG
{
const UINT8& ubStance = animArr[i];
INT32 usAdjustedSight;
INT32 usAdjustedSight = 0;
if (pToSoldier == NULL) {
usAdjustedSight = usSightLimit;
@@ -767,6 +769,8 @@ void CalculateCoverFromSoldier( SOLDIERTYPE* pFromSoldier, const INT32& sTargetG
usAdjustedSight = usSightLimit + usSightLimit * GetSightAdjustment( pToSoldier, GetStealth(pToSoldier), GetSightAdjustmentBasedOnLBE(pToSoldier), sTargetGridNo, (INT8) fRoof, ubStance ) /100;
}
RebelCommand::ApplyVisionModifier(pFromSoldier, usAdjustedSight);
if ( SoldierToVirtualSoldierLineOfSightTest( pFromSoldier, sTargetGridNo, (INT8) fRoof, ubStance, FALSE, usAdjustedSight ) != 0 )
{
if ( bOverlayType > i ) bOverlayType = i;
@@ -784,7 +788,7 @@ static void CalculateCoverFromEnemySoldier(SOLDIERTYPE* pFromSoldier, const INT3
{
const UINT8& ubStance = animArr[i];
INT32 usAdjustedSight;
INT32 usAdjustedSight = 0;
if (pToSoldier == nullptr) {
usAdjustedSight = usSightLimit;
@@ -793,6 +797,8 @@ static void CalculateCoverFromEnemySoldier(SOLDIERTYPE* pFromSoldier, const INT3
usAdjustedSight = usSightLimit + usSightLimit * GetSightAdjustment(pToSoldier, ToSoldierStealth, ToSoldierLBeSightAdjustment, sTargetGridNo, (INT8)fRoof, ubStance) / 100;
}
RebelCommand::ApplyVisionModifier(pFromSoldier, usAdjustedSight);
if (SoldierToVirtualSoldierLineOfSightTest(pFromSoldier, sTargetGridNo, (INT8)fRoof, ubStance, FALSE, usAdjustedSight) != 0)
{
if (bOverlayType > i) bOverlayType = i;
+20 -6
View File
@@ -20,6 +20,7 @@
#include "message.h"
#include "Tactical Save.h" // added by Flugente
#include "Soldier macros.h" // added by Flugente
#include "Rebel Command.h"
#endif
extern WorldItems gAllWorldItems;
@@ -276,6 +277,10 @@ void GenerateRandomEquipment( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass, INT8
// SANDRO - new behaviour of progress setting
bEquipmentModifier = bEquipmentRating + ( ( CalcDifficultyModifier( bSoldierClass ) / 10 ) - 5 );
if (bSoldierClass >= SOLDIER_CLASS_ADMINISTRATOR && bSoldierClass <= SOLDIER_CLASS_ARMY)
bEquipmentModifier += RebelCommand::GetEnemyEquipmentCoolnessModifier();
switch( gGameOptions.ubProgressSpeedOfItemsChoices )
{
case ITEM_PROGRESS_VERY_SLOW:
@@ -943,6 +948,8 @@ void ChooseWeaponForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bWeaponC
// don't allow it to be lower than marksmanship, we don't want it to affect their chances of hitting
bStatus = (INT8)max( pp->bMarksmanship, bStatus );
// ... unless we've done something to ruin their gear
bStatus = RebelCommand::GetEnemyEquipmentStatusModifier(bStatus);
CreateItem( usGunIndex, bStatus, &(pp->Inv[ HANDPOS ]) );
pp->Inv[ HANDPOS ].fFlags |= OBJECT_UNDROPPABLE;
@@ -1457,6 +1464,7 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC
//INVTYPE *pItem;
//UINT16 usRandom;
UINT16 usItem = 0, usHelmetItem = 0, usVestItem = 0, usLeggingsItem = 0;
INT8 bStatus = 0;
//UINT16 usNumMatches;
//INT8 bOrigVestClass = bVestClass;
@@ -1494,7 +1502,8 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC
if(!gGameExternalOptions.fSoldiersWearAnyArmour) usHelmetItem = PickARandomItem(HELMET, pp->ubSoldierClass, bHelmetClass );
if ( usHelmetItem > 0 && Item[usHelmetItem].usItemClass == IC_ARMOUR && !(pp->Inv[ HELMETPOS ].fFlags & OBJECT_NO_OVERWRITE) && Armour[ Item[usHelmetItem].ubClassIndex ].ubArmourClass == ARMOURCLASS_HELMET )
{
CreateItem( usHelmetItem, (INT8)(70+Random(31)), &(pp->Inv[ HELMETPOS ]) );
bStatus = RebelCommand::GetEnemyEquipmentStatusModifier(70 + Random(31));
CreateItem( usHelmetItem, bStatus, &(pp->Inv[ HELMETPOS ]) );
pp->Inv[ HELMETPOS ].fFlags |= OBJECT_UNDROPPABLE;
// roll to see if he gets an attachment, too. Higher chance the higher his entitled helmet class is
@@ -1503,7 +1512,8 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC
UINT16 usAttachment = PickARandomAttachment(ARMOURATTACHMENT, pp->ubSoldierClass, usHelmetItem, bHelmetClass, FALSE);
if ( usAttachment > 0 )
{
CreateItem( usAttachment, (INT8)(70+Random(31)), &gTempObject );
bStatus = RebelCommand::GetEnemyEquipmentStatusModifier(70 + Random(31));
CreateItem( usAttachment, bStatus, &gTempObject );
gTempObject.fFlags |= OBJECT_UNDROPPABLE;
pp->Inv[ HELMETPOS ].AttachObject( NULL, &gTempObject, FALSE );
}
@@ -1567,7 +1577,8 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC
if(!gGameExternalOptions.fSoldiersWearAnyArmour) usVestItem = PickARandomItem(VEST, pp->ubSoldierClass, bVestClass );
if ( usVestItem > 0 && Item[usVestItem].usItemClass == IC_ARMOUR && !(pp->Inv[ VESTPOS ].fFlags & OBJECT_NO_OVERWRITE) && Armour[ Item[usVestItem].ubClassIndex ].ubArmourClass == ARMOURCLASS_VEST )
{
CreateItem( usVestItem, (INT8)(70+Random(31)), &(pp->Inv[ VESTPOS ]) );
bStatus = RebelCommand::GetEnemyEquipmentStatusModifier(70 + Random(31));
CreateItem( usVestItem, bStatus, &(pp->Inv[ VESTPOS ]) );
pp->Inv[ VESTPOS ].fFlags |= OBJECT_UNDROPPABLE;
// roll to see if he gets a CERAMIC PLATES, too. Higher chance the higher his entitled vest class is
@@ -1576,7 +1587,8 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC
UINT16 usAttachment = PickARandomAttachment(ARMOURATTACHMENT, pp->ubSoldierClass, usVestItem, bVestClass, FALSE);
if ( usAttachment > 0 )
{
CreateItem( usAttachment, (INT8)(70+Random(31)), &gTempObject );
bStatus = RebelCommand::GetEnemyEquipmentStatusModifier(70 + Random(31));
CreateItem( usAttachment, bStatus, &gTempObject );
gTempObject.fFlags |= OBJECT_UNDROPPABLE;
pp->Inv[ VESTPOS ].AttachObject( NULL, &gTempObject, FALSE );
}
@@ -1661,7 +1673,8 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC
if(!gGameExternalOptions.fSoldiersWearAnyArmour) usLeggingsItem = PickARandomItem(LEGS, pp->ubSoldierClass, bLeggingsClass );
if ( usLeggingsItem > 0 && Item[usLeggingsItem].usItemClass == IC_ARMOUR && !(pp->Inv[ LEGPOS ].fFlags & OBJECT_NO_OVERWRITE) && Armour[ Item[usLeggingsItem].ubClassIndex ].ubArmourClass == ARMOURCLASS_LEGGINGS )
{
CreateItem( usLeggingsItem, (INT8)(70+Random(31)), &(pp->Inv[ LEGPOS ]) );
bStatus = RebelCommand::GetEnemyEquipmentStatusModifier(70 + Random(31));
CreateItem( usLeggingsItem, bStatus, &(pp->Inv[ LEGPOS ]) );
pp->Inv[ LEGPOS ].fFlags |= OBJECT_UNDROPPABLE;
// roll to see if he gets an attachment, too. Higher chance the higher his entitled Leggings class is
@@ -1670,7 +1683,8 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC
UINT16 usAttachment = PickARandomAttachment(ARMOURATTACHMENT, pp->ubSoldierClass, usLeggingsItem, bLeggingsClass, FALSE);
if ( usAttachment > 0 )
{
CreateItem( usAttachment, (INT8)(70+Random(31)), &gTempObject );
bStatus = RebelCommand::GetEnemyEquipmentStatusModifier(70 + Random(31));
CreateItem( usAttachment, bStatus, &gTempObject );
gTempObject.fFlags |= OBJECT_UNDROPPABLE;
pp->Inv[ LEGPOS ].AttachObject( NULL, &gTempObject, FALSE);
}
+8
View File
@@ -1837,6 +1837,8 @@ BOOLEAN TacticalCopySoldierFromCreateStruct( SOLDIERTYPE *pSoldier, SOLDIERCREAT
RebelCommand::ApplyMilitiaBonuses(pSoldier);
if ((SOLDIER_CLASS_ENEMY(pSoldier->ubSoldierClass) || pSoldier->ubSoldierClass == SOLDIER_CLASS_BANDIT))
RebelCommand::ApplyEnemyPenalties(pSoldier);
if (pCreateStruct->bTeam == ENEMY_TEAM && (ENEMYROBOT(pCreateStruct) || ARMED_VEHICLE(pCreateStruct)))
RebelCommand::ApplyEnemyMechanicalUnitPenalties(pSoldier);
// Flugente: enemy roles
if ( gGameExternalOptions.fEnemyRoles && gGameExternalOptions.fEnemyOfficers && SOLDIER_CLASS_ENEMY( pSoldier->ubSoldierClass ) )
@@ -3223,6 +3225,8 @@ SOLDIERTYPE* TacticalCreateEnemyTank()
// Flugente: why would a vehicle's armour depend on game progress? Always give them 100 HP
pSoldier->stats.bLifeMax = 100;
pSoldier->stats.bLife = pSoldier->stats.bLifeMax;
RebelCommand::ApplyEnemyMechanicalUnitPenalties(pSoldier);
}
return( pSoldier );
@@ -3263,6 +3267,8 @@ SOLDIERTYPE* TacticalCreateEnemyJeep( )
// Flugente: why would a vehicle's armour depend on game progress? Always give them 100 HP
pSoldier->stats.bLifeMax = 100;
pSoldier->stats.bLife = pSoldier->stats.bLifeMax;
RebelCommand::ApplyEnemyMechanicalUnitPenalties(pSoldier);
}
return(pSoldier);
@@ -3303,6 +3309,8 @@ SOLDIERTYPE* TacticalCreateEnemyRobot()
pSoldier->stats.bLifeMax = 80;
pSoldier->stats.bLife = pSoldier->stats.bLifeMax;
RebelCommand::ApplyEnemyMechanicalUnitPenalties(pSoldier);
}
return(pSoldier);
+2 -1
View File
@@ -14,6 +14,7 @@
#include "strategicmap.h"
#include "worldman.h"
#include "PreBattle Interface.h" // added by Flugente
#include "Rebel Command.h"
#endif
#include "connect.h"
@@ -1401,7 +1402,7 @@ INT32 SearchForClosestPrimaryMapEdgepoint(INT32 sGridNo, UINT8 ubInsertionCode,
break;
}
// WANNE - MP: Center
if ( ( (is_networked || GetEnemyEncounterCode() == ENEMY_AMBUSH_DEPLOYMENT_CODE ) && ubInsertionCode == INSERTION_CODE_CENTER) || ubInsertionCode == INSERTION_CODE_CHOPPER )
if ( ( (is_networked || GetEnemyEncounterCode() == ENEMY_AMBUSH_DEPLOYMENT_CODE ) && ubInsertionCode == INSERTION_CODE_CENTER) || ubInsertionCode == INSERTION_CODE_CHOPPER || (RebelCommand::GetAdditionalDeployRange(ubInsertionCode) > 0) )
{
InitCenterEdgepoint( ubInsertionCode == INSERTION_CODE_CENTER );
psArray = gps1stCenterEdgepointArray;
+10 -4
View File
@@ -1,3 +1,4 @@
#pragma optimize("",off)
#include "builddefines.h"
// WANNE 2 <changed some lines>
@@ -41,6 +42,7 @@
#include "renderworld.h"//dnl ch45 051009
#include "merc entering.h"
#include "CampaignStats.h" // added by Flugente
#include "Rebel Command.h"
typedef struct MERCPLACEMENT
{
@@ -910,6 +912,7 @@ void RenderTacticalPlacementGUI()
if(sWorldScreenY <= PLACEMENT_OFFSET)
{
sY = (PLACEMENT_OFFSET - sWorldScreenY) / 5;
sY += RebelCommand::GetAdditionalDeployRange(INSERTION_CODE_NORTH)/5;
gTPClipRect.iTop += sY;
}
break;
@@ -917,6 +920,7 @@ void RenderTacticalPlacementGUI()
if((sWorldScreenX + NORMAL_MAP_SCREEN_WIDTH) >= (MAPWIDTH - PLACEMENT_OFFSET))
{
sX = ((sWorldScreenX + NORMAL_MAP_SCREEN_WIDTH) - (MAPWIDTH - PLACEMENT_OFFSET)) / 5;
sX += RebelCommand::GetAdditionalDeployRange(INSERTION_CODE_EAST)/5;
gTPClipRect.iRight -= sX;
}
break;
@@ -924,6 +928,7 @@ void RenderTacticalPlacementGUI()
if((sWorldScreenY + NORMAL_MAP_SCREEN_HEIGHT) >= (MAPHEIGHT - PLACEMENT_OFFSET))
{
sY = ((sWorldScreenY + NORMAL_MAP_SCREEN_HEIGHT) - (MAPHEIGHT - PLACEMENT_OFFSET)) / 5;
sY += RebelCommand::GetAdditionalDeployRange(INSERTION_CODE_SOUTH)/5;
gTPClipRect.iBottom -= sY;
}
break;
@@ -931,6 +936,7 @@ void RenderTacticalPlacementGUI()
if(sWorldScreenX <= PLACEMENT_OFFSET)
{
sX = (PLACEMENT_OFFSET - sWorldScreenX) / 5;
sX += RebelCommand::GetAdditionalDeployRange(INSERTION_CODE_WEST)/5;
gTPClipRect.iLeft += sX;
}
break;
@@ -1234,19 +1240,19 @@ void TacticalPlacementHandle()
switch(gMercPlacement[gbCursorMercID].ubStrategicInsertionCode)
{
case INSERTION_CODE_NORTH:
if(sWorldScreenY <= PLACEMENT_OFFSET)
if(sWorldScreenY <= (PLACEMENT_OFFSET + RebelCommand::GetAdditionalDeployRange(INSERTION_CODE_NORTH)))
gfValidCursor = TRUE;
break;
case INSERTION_CODE_EAST:
if(sWorldScreenX >= (MAPWIDTH - PLACEMENT_OFFSET))
if(sWorldScreenX >= ((MAPWIDTH - PLACEMENT_OFFSET - RebelCommand::GetAdditionalDeployRange(INSERTION_CODE_EAST))))
gfValidCursor = TRUE;
break;
case INSERTION_CODE_SOUTH:
if(sWorldScreenY >= (MAPHEIGHT - PLACEMENT_OFFSET))
if(sWorldScreenY >= ((MAPHEIGHT - PLACEMENT_OFFSET - RebelCommand::GetAdditionalDeployRange(INSERTION_CODE_SOUTH))))
gfValidCursor = TRUE;
break;
case INSERTION_CODE_WEST:
if(sWorldScreenX <= PLACEMENT_OFFSET)
if(sWorldScreenX <= (PLACEMENT_OFFSET + RebelCommand::GetAdditionalDeployRange(INSERTION_CODE_WEST)))
gfValidCursor = TRUE;
break;
}
+1
View File
@@ -3138,6 +3138,7 @@ extern STR16 szRebelCommandText[];
extern STR16 szRebelCommandHelpText[];
extern STR16 szRebelCommandAdminActionsText[];
extern STR16 szRebelCommandDirectivesText[];
extern STR16 szRebelCommandAgentMissionsText[];
extern STR16 szRobotText[];
enum {
+35 -35
View File
@@ -290,7 +290,7 @@ STR16 pEncyclopediaFilterCharText[] =
{//major char filter button text
//..L"------v"
L"全部",//All
L"A.I.M",
L"A.I.M.",
L"MERC",
L"RPC",
L"NPC",
@@ -4218,7 +4218,7 @@ STR16 pHelicopterEtaStrings[] =
L"Skyrider",
L"着陆点",
L"直升机严重受损,必须降落在敌军领地!", // warning that the sector the helicopter is going to use for refueling is under enemy control ->
L"直升机将直接返回基地,你希望在此之前下乘客吗?",
L"直升机将直接返回基地,你希望在此之前下乘客吗?",
L"剩余燃料:",
L"到加油站距离:",
};
@@ -5097,7 +5097,7 @@ STR16 pLaptopIcons[] =
STR16 pBookMarkStrings[] =
{
L"A.I.M",
L"A.I.M.",
L"Bobby Ray's",
L"I.M.P",
L"M.E.R.C",
@@ -7030,7 +7030,7 @@ STR16 pMessageStrings[] =
L"磁盘空间不足。只有%sMB可用空间,《铁血联盟2》需要%sMB。",
L"从AIM雇佣了%s。", //"Hired %s from AIM",
L"%s抓住了%s。", //"%s has caught %s.", //'Merc name' has caught 'item' -- let SirTech know if name comes after item.
L"%s使用了(拾取)%s。", //L"%s has taken %s。",
L"%s使用了%s。", //L"%s has taken %s。",
L"%s没有医疗技能", //"%s has no medical skill",//'Merc name' has no medical skill.
//CDRom errors (such as ejecting CD while attempting to read the CD)
@@ -11369,19 +11369,19 @@ STR16 szIMPGearPocketText[] =
L"选择背心", // L"Select vest",
L"选择裤子", //L"Select pants",
L"选择头部装备", //L"Select face gear",
L"选择头部装备", //L"Select face gear",
L"选择头部装备", // L"Select face gear",
L"选择主武器", //L"Select main gun",
L"选择副武器", //L"Select sidearm",
L"选择主", // L"Select main gun",
L"选择手枪", //L"Select sidearm",
L"选择LBE背心", //L"Select LBE vest",
L"选择LBE", //L"Select left LBE holster",
L"选择LBE", //L"Select right LBE holster",
L"选择LBE", //L"Select left LBE holster",
L"选择LBE", //L"Select right LBE holster",
L"选择LBE战斗包", //L"Select LBE combat pack",
L"选择LBE背包", //L"Select LBE backpack",
L"选择发射器/步枪", //L"Select launcher / rifle",
L"选择近战武器", //L"Select melee weapon",
L"Select launcher / rifle",
L"选择武器", //L"Select melee weapon",
L"选择附加物品", //L"Select additional items", //BIGPOCK1POS
L"选择附加物品", //L"Select additional items",
@@ -11390,28 +11390,28 @@ STR16 szIMPGearPocketText[] =
L"选择附加物品", //L"Select additional items",
L"选择附加物品", //L"Select additional items",
L"选择附加物品", //L"Select additional items",
L"选择医疗套件", //L"Select medkit",MEDPOCK1POS
L"选择医疗套件", //L"Select medkit",
L"选择医疗套件", //L"Select medkit",
L"选择医疗套件", //L"Select medkit",
L"选择主武器弹药", //L"Select main gun ammo",SMALLPOCK1POS
L"选择主武器弹药", //L"Select main gun ammo",
L"选择主武器弹药", //L"Select main gun ammo",
L"选择主武器弹药", //L"Select main gun ammo",
L"选择主武器弹药", //L"Select main gun ammo",
L"选择发射器/枪弹药", //L"Select launcher / rifle ammo",SMALLPOCK6POS
L"选择发射器/枪弹药", //L"Select launcher / rifle ammo",
L"选择发射器/枪弹药", //L"Select launcher / rifle ammo",
L"选择发射器/枪弹药", //L"Select launcher / rifle ammo",
L"选择发射器/枪弹药", //L"Select launcher / rifle ammo",
L"选择配枪弹药", //L"Select sidearm ammo",SMALLPOCK11POS
L"选择配枪弹药", //L"Select sidearm ammo",
L"选择配枪弹药", //L"Select sidearm ammo",
L"选择配枪弹药", //L"Select sidearm ammo",
L"选择配枪弹药", //L"Select sidearm ammo",
L"选择配枪弹药", //L"Select sidearm ammo",
L"选择配枪弹药", //L"Select sidearm ammo",
L"选择配枪弹药", //L"Select sidearm ammo",
L"Select medkit", //MEDPOCK1POS
L"Select medkit",
L"Select medkit",
L"Select medkit",
L"Select main gun ammo", //SMALLPOCK1POS
L"Select main gun ammo",
L"Select main gun ammo",
L"Select main gun ammo",
L"Select main gun ammo",
L"Select launcher / rifle ammo", //SMALLPOCK6POS
L"Select launcher / rifle ammo",
L"Select launcher / rifle ammo",
L"Select launcher / rifle ammo",
L"Select launcher / rifle ammo",
L"Select sidearm ammo", //SMALLPOCK11POS
L"Select sidearm ammo",
L"Select sidearm ammo",
L"Select sidearm ammo",
L"Select sidearm ammo",
L"Select sidearm ammo",
L"Select sidearm ammo",
L"Select sidearm ammo",
L"选择附加物品", //L"Select additional items", //SMALLPOCK19POS
L"选择附加物品", //L"Select additional items",
L"选择附加物品", //L"Select additional items",
@@ -11424,7 +11424,7 @@ STR16 szIMPGearPocketText[] =
L"选择附加物品", //L"Select additional items",
L"选择附加物品", //L"Select additional items",
L"选择附加物品", //L"Select additional items", //SMALLPOCK30POS
L"左键单击选择项目/右键单击关闭窗口", //L"Left click to select item / Right click to close window",
L"Left click to select item / Right click to close window",
};
STR16 szMilitiaStrategicMovementText[] =
@@ -11966,7 +11966,7 @@ STR16 szRebelCommandAdminActionsText[] =
L"民兵武器库", //L"Militia Warehouses",
L"在偏远地区建造仓库,让反抗军为民兵储备武器。提供每日民兵资源。", //L"Construct warehouses in remote areas, allowing the rebels to stockpile weapons for the militia. Provides daily militia resources.",
L"税务局", //L"Regional Taxes",
L"从当地人那里筹集资金来帮助你。这是一种永久的行为。增加每日收入,但地区忠诚度会逐日下降。", //L"Collect money from the locals to assist your efforts. This is a permanent action. Increases daily income, but regional loyalty falls daily.",
L"从当地人那里筹集资金来帮助你。增加每日收入,但地区忠诚度会逐日下降。", //L"Collect money from the locals to assist your efforts. Increases daily income, but regional loyalty falls daily.",
L"民间援助", //L"Civilian Aid",
L"指派一些反抗军直接协助和支持该地区的平民。增加每天志愿者的总数。", //L"Assign some rebels to directly assist and support civilians in the area. Increases daily volunteer pool growth.",
L"私人佣兵团", //L"Merc Support",
+1 -1
View File
@@ -11976,7 +11976,7 @@ STR16 szRebelCommandAdminActionsText[] = // TODO.Translate
L"Militia Warehouses",
L"Construct warehouses in remote areas, allowing the rebels to stockpile weapons for the militia. Provides daily militia resources.",
L"Regional Taxes",
L"Collect money from the locals to assist your efforts. This is a permanent action. Increases daily income, but regional loyalty falls daily.",
L"Collect money from the locals to assist your efforts. Increases daily income, but regional loyalty falls daily.",
L"Civilian Aid",
L"Assign some rebels to directly assist and support civilians in the area. Increases daily volunteer pool growth.",
L"Merc Support",
+32 -7
View File
@@ -11864,12 +11864,16 @@ STR16 gLbeStatsDesc[14] =
STR16 szRebelCommandText[] =
{
L"Arulco Rebel Command - National Overview",
L"Arulco Rebel Command - Regional Overview",
L"Switch to Regional Overview",
L"Switch to National Overview",
L"National Overview",
L"Regional Overview",
L"Mission Overview",
L"Select View:",
L"Regional (2)",
L"National (1)",
L"Mission (3)",
L"Supplies:",
L"Incoming Supplies",
L"Intel:",
L"/day",
L"Current Directive",
L"Improve Directive ($%d)",
@@ -11932,12 +11936,11 @@ STR16 szRebelCommandText[] =
STR16 szRebelCommandHelpText[] =
{
L"|S|u|p|p|l|i|e|s\n \nFood, water, medical supplies, weapons, and anything else that\nthe rebels might find useful. Supplies are obtained automatically\nby the rebels.",
L"|I|n|c|o|m|i|n|g |S|u|p|p|l|i|e|s\n \nEach day, the rebels will gather supplies on their own. As you\ntake over more towns, the amount of supplies they will be\nable to find per day will increase.",
L"|I|n|c|o|m|i|n|g |S|u|p|p|l|i|e|s\n \nEach day, the rebels will gather supplies on their own. As you\ntake over more towns, the amount of supplies they will be\nable to find per day will increase.\n \n+%d (Base income)",
L"|C|u|r|r|e|n|t |D|i|r|e|c|t|i|v|e\n \nYou can choose how the rebels will prioritise their strategic\nobjectives. New directives will become available as you make\nprogress.",
L"|A|d|m|i|n|i|s|t|r|a|t|i|o|n |T|e|a|m\n \nOnce deployed, an admin team is responsible for handling the\nday-to-day affairs of the region. This includes supporting\nlocals, creating rebel propaganda, establishing regional\npolicies, and more.",
L"|L|o|y|a|l|t|y\n \nThe effectiveness of many Administrative Actions depends on\nthe region's loyalty to your cause. It is in your best interest\nto raise loyalty as high as possible.",
L"|M|a|x|i|m|u|m |L|o|y|a|l|t|y\n \nYou will need to convince the locals to fully trust you. This\ncan be done by creating a supply line to them, showing that\nyou intend to improve their quality of life.",
L"|G|r|a|n|t |S|u|p|p|l|i|e|s\n \nSend supplies to the admin team here and allow them to use them\nas needed. This will increase the region's loyalty by a small amount\neach time you do this. However, doing this will slightly increase\nthe cost of enacting regional policies.",
L"This Admin Action applies its bonus to town sectors only.",
L"This Admin Action applies its bonus to town sectors, and\nsectors immediately adjacent to them.",
L"This Admin Action applies its bonus to town sectors, one\nsector away at Tier 1, and up to two sectors away at Tier 2.",
@@ -11966,7 +11969,7 @@ STR16 szRebelCommandAdminActionsText[] =
L"Militia Warehouses",
L"Construct warehouses in remote areas, allowing the rebels to stockpile weapons for the militia. Provides daily militia resources.",
L"Regional Taxes",
L"Collect money from the locals to assist your efforts. This is a permanent action. Increases daily income, but regional loyalty falls daily.",
L"Collect money from the locals to assist your efforts. Increases daily income, but regional loyalty falls daily.",
L"Civilian Aid",
L"Assign some rebels to directly assist and support civilians in the area. Increases daily volunteer pool growth.",
L"Merc Support",
@@ -12030,6 +12033,28 @@ STR16 szRebelCommandDirectivesText[] =
L"Improving this directive will increase the number of volunteers gained per day.",
};
STR16 szRebelCommandAgentMissionsText[] =
{
L"New missions will be available every 48 hours.",
L"A mission is currently active.",
L"Deep Deployment",
L"Coordinate efforts to find ways to sneak up on the enemy, but be careful: it's equally possible to put yourself in a disadvantaged deployment area. When attacking enemy forces, the deployment area is much larger.",
L"Strategic Intel",
L"Intercept plans and discover where enemies intend to strike. When viewing teams on the strategic map, sectors prioritised by the enemy will be marked in red.",
L"Improve Local Shops",
L"Set up ways for merchants across the country to acquire better goods more easily. Shopkeepers will have better than usual inventories.",
L"Slow Strategic Decisions",
L"Sow confusion and misdirection at the highest levels of enemy command. The enemy takes longer to make decisions at a strategic level.",
L"Lower Readiness",
L"Trick enemy soldiers into letting their guard down. Enemy soldiers have reduced vision range until they are alerted to your mercs' presence.",
L"Sabotage Equipment",
L"Disrupt enemy supply chains and prevent the enemy from maintaining their gear properly. Enemy soldiers use equipment that is worse than normal.",
L"Sabotage Vehicles",
L"Sabotage vehicle maintenance hubs to reduce their combat effectiveness and readiness. Enemy vehicles encountered have reduced stats.",
L"Train Militia Anywhere",
L"Create training areas in the wilderness that can be quickly set up and torn down. Militia can be trained in uncontested sectors outside of town.",
};
STR16 szRobotText[] =
{
L"The robot's installed weapon cannot be changed.",
+1 -1
View File
@@ -11958,7 +11958,7 @@ STR16 szRebelCommandAdminActionsText[] = // TODO.Translate
L"Militia Warehouses",
L"Construct warehouses in remote areas, allowing the rebels to stockpile weapons for the militia. Provides daily militia resources.",
L"Regional Taxes",
L"Collect money from the locals to assist your efforts. This is a permanent action. Increases daily income, but regional loyalty falls daily.",
L"Collect money from the locals to assist your efforts. Increases daily income, but regional loyalty falls daily.",
L"Civilian Aid",
L"Assign some rebels to directly assist and support civilians in the area. Increases daily volunteer pool growth.",
L"Merc Support",
+1 -1
View File
@@ -11880,7 +11880,7 @@ STR16 szRebelCommandAdminActionsText[] = // TODO.Translate
L"Militia Warehouses",
L"Construct warehouses in remote areas, allowing the rebels to stockpile weapons for the militia. Provides daily militia resources.",
L"Regional Taxes",
L"Collect money from the locals to assist your efforts. This is a permanent action. Increases daily income, but regional loyalty falls daily.",
L"Collect money from the locals to assist your efforts. Increases daily income, but regional loyalty falls daily.",
L"Civilian Aid",
L"Assign some rebels to directly assist and support civilians in the area. Increases daily volunteer pool growth.",
L"Merc Support",
+1 -1
View File
@@ -11967,7 +11967,7 @@ STR16 szRebelCommandAdminActionsText[] = // TODO.Translate
L"Militia Warehouses",
L"Construct warehouses in remote areas, allowing the rebels to stockpile weapons for the militia. Provides daily militia resources.",
L"Regional Taxes",
L"Collect money from the locals to assist your efforts. This is a permanent action. Increases daily income, but regional loyalty falls daily.",
L"Collect money from the locals to assist your efforts. Increases daily income, but regional loyalty falls daily.",
L"Civilian Aid",
L"Assign some rebels to directly assist and support civilians in the area. Increases daily volunteer pool growth.",
L"Merc Support",
+1 -1
View File
@@ -11980,7 +11980,7 @@ STR16 szRebelCommandAdminActionsText[] = // TODO.Translate
L"Militia Warehouses",
L"Construct warehouses in remote areas, allowing the rebels to stockpile weapons for the militia. Provides daily militia resources.",
L"Regional Taxes",
L"Collect money from the locals to assist your efforts. This is a permanent action. Increases daily income, but regional loyalty falls daily.",
L"Collect money from the locals to assist your efforts. Increases daily income, but regional loyalty falls daily.",
L"Civilian Aid",
L"Assign some rebels to directly assist and support civilians in the area. Increases daily volunteer pool growth.",
L"Merc Support",
+1 -1
View File
@@ -11961,7 +11961,7 @@ STR16 szRebelCommandAdminActionsText[] = // TODO.Translate
L"Militia Warehouses",
L"Construct warehouses in remote areas, allowing the rebels to stockpile weapons for the militia. Provides daily militia resources.",
L"Regional Taxes",
L"Collect money from the locals to assist your efforts. This is a permanent action. Increases daily income, but regional loyalty falls daily.",
L"Collect money from the locals to assist your efforts. Increases daily income, but regional loyalty falls daily.",
L"Civilian Aid",
L"Assign some rebels to directly assist and support civilians in the area. Increases daily volunteer pool growth.",
L"Merc Support",