From b7adaf802ae85df4b7631e81997c2d0fc57781f0 Mon Sep 17 00:00:00 2001 From: Sevenfm Date: Wed, 1 Sep 2021 16:48:13 +0000 Subject: [PATCH] Small arc update (by rftr): - 2 new directives - 3 new admin actions - arc website dropdown fix - one admin action per region can now be changed git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@9161 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameSettings.cpp | 16 + GameSettings.h | 16 + Strategic/Auto Resolve.cpp | 10 + Strategic/Rebel Command.cpp | 594 +++++++++++++++++++++++++++---- Strategic/Rebel Command.h | 8 + Strategic/Strategic Movement.cpp | 5 + Utils/_ChineseText.cpp | 21 ++ Utils/_DutchText.cpp | 21 ++ Utils/_EnglishText.cpp | 21 ++ Utils/_FrenchText.cpp | 21 ++ Utils/_GermanText.cpp | 21 ++ Utils/_ItalianText.cpp | 21 ++ Utils/_PolishText.cpp | 21 ++ Utils/_RussianText.cpp | 21 ++ 14 files changed, 742 insertions(+), 75 deletions(-) diff --git a/GameSettings.cpp b/GameSettings.cpp index abbcf1ce..93106e63 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -3901,6 +3901,16 @@ void LoadRebelCommandSettings() FillArrayValues(iniReader, "Rebel Command Settings", "RAID_MINES_COSTS", gRebelCommandSettings.iRaidMinesCosts); FillArrayValues(iniReader, "Rebel Command Settings", "RAID_MINES_PERCENTAGE", gRebelCommandSettings.fRaidMinesPercentage); + gRebelCommandSettings.uCreateTurncoatsProgressRequirement = iniReader.ReadUINT8("Rebel Command Settings", "CREATE_TURNCOATS_PROGRESS_REQUIREMENT", 33, 0, 100); + gRebelCommandSettings.fCreateTurncoatsIntelCost = iniReader.ReadFloat("Rebel Command Settings", "CREATE_TURNCOATS_INTEL_COST", 20.f, 0.f, 1000.f); + FillArrayValues(iniReader, "Rebel Command Settings", "CREATE_TURNCOATS_COSTS", gRebelCommandSettings.iCreateTurncoatsCosts); + FillArrayValues(iniReader, "Rebel Command Settings", "CREATE_TURNCOATS_PER_DAY", gRebelCommandSettings.iCreateTurncoatsPerDay); + + gRebelCommandSettings.uDraftProgressRequirement = iniReader.ReadUINT8("Rebel Command Settings", "DRAFT_PROGRESS_REQUIREMENT", 25, 0, 100); + FillArrayValues(iniReader, "Rebel Command Settings", "DRAFT_COSTS", gRebelCommandSettings.iDraftCosts); + FillArrayValues(iniReader, "Rebel Command Settings", "DRAFT_PER_DAY_MODIFIER", gRebelCommandSettings.iDraftPerDayModifier); + FillArrayValues(iniReader, "Rebel Command Settings", "DRAFT_LOYALTY_LOSS_PER_DAY", gRebelCommandSettings.iDraftLoyaltyLossPerDay); + // admin actions gRebelCommandSettings.iSupplyLineMaxLoyaltyIncrease = iniReader.ReadInteger("Rebel Command Settings", "SUPPLY_LINE_MAX_LOYALTY_INCREASE", 10, 1, 100); @@ -3931,6 +3941,12 @@ void LoadRebelCommandSettings() gRebelCommandSettings.iMiningPolicyBonus = iniReader.ReadInteger("Rebel Command Settings", "MINING_POLICY_BONUS", 10, 0, 100); + gRebelCommandSettings.uPathfindersSpeedBonus = iniReader.ReadUINT8("Rebel Command Settings", "PATHFINDERS_SPEED_BONUS", 20, 0, 100); + + gRebelCommandSettings.uHarriersSpeedPenalty = iniReader.ReadUINT8("Rebel Command Settings", "HARRIERS_SPEED_PENALTY", 50, 0, 100); + + gRebelCommandSettings.iFortificationsBonus = iniReader.ReadInteger("Rebel Command Settings", "FORTIFICATIONS_BONUS", 10, 0, 100); + } void FreeGameExternalOptions() diff --git a/GameSettings.h b/GameSettings.h index ba5e425e..7dc3d4d8 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -1740,6 +1740,16 @@ typedef struct std::vector iRaidMinesCosts; std::vector fRaidMinesPercentage; + UINT8 uCreateTurncoatsProgressRequirement; + FLOAT fCreateTurncoatsIntelCost; + std::vector iCreateTurncoatsCosts; + std::vector iCreateTurncoatsPerDay; + + UINT8 uDraftProgressRequirement; + std::vector iDraftCosts; + std::vector iDraftPerDayModifier; + std::vector iDraftLoyaltyLossPerDay; + // admin actions INT32 iSupplyLineMaxLoyaltyIncrease; @@ -1770,6 +1780,12 @@ typedef struct INT32 iMiningPolicyBonus; + UINT8 uPathfindersSpeedBonus; + + UINT8 uHarriersSpeedPenalty; + + INT16 iFortificationsBonus; + } REBELCOMMAND_SETTINGS; typedef struct diff --git a/Strategic/Auto Resolve.cpp b/Strategic/Auto Resolve.cpp index 2ac75605..175aceb1 100644 --- a/Strategic/Auto Resolve.cpp +++ b/Strategic/Auto Resolve.cpp @@ -4472,6 +4472,16 @@ void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget ) usAttack -= (usAttack * gGameExternalOptions.sMercsAutoresolveDeffenseBonus /200); } + // check fortifications bonus + if (pTarget->pSoldier->ubSoldierClass == SOLDIER_CLASS_GREEN_MILITIA + || pTarget->pSoldier->ubSoldierClass == SOLDIER_CLASS_REG_MILITIA + || pTarget->pSoldier->ubSoldierClass == SOLDIER_CLASS_ELITE_MILITIA + || (pTarget->uiFlags & CELL_MERC)) + { + usDefence += (usDefence * RebelCommand::GetFortificationsBonus(GetAutoResolveSectorID()) / 200); + usAttack -= (usAttack * RebelCommand::GetFortificationsBonus(GetAutoResolveSectorID()) / 200); + } + // reapair values usAttack = max(0, min(1000, usAttack )); usDefence = max(0, min(1000, usDefence )); diff --git a/Strategic/Rebel Command.cpp b/Strategic/Rebel Command.cpp index b9de1122..8013b36e 100644 --- a/Strategic/Rebel Command.cpp +++ b/Strategic/Rebel Command.cpp @@ -22,8 +22,10 @@ How to add a new directive: - add strings to text files (szRebelCommandDirectivesText) - add to GameSettings (gRebelCommandSettings) and RebelCommand_Settings.ini - add to SetupInfo to read from game settings +- add to dropdown list in EnterWebsite - add to switch in DailyUpdate (for completeness) - add to switch in GetDirectiveEffect for website description +- add directive-specific effect How to add a new admin action: - add to the RebelCommandAdminActions enum in the header @@ -32,6 +34,7 @@ How to add a new admin action: - add to GameSettings (gRebelCommandSettings) and RebelCommand_Settings.ini - add to SetupInfo to read from game settings - add to Init to add to pool of valid actions on game start +- add admin-action-specific effect Points of interest: - Init() - set up rebel command for the first time @@ -82,6 +85,8 @@ Points of interest: #define DIRECTIVE_TEXT(id) RCDT_##id##, RCDT_##id##_EFFECT, RCDT_##id##_DESC, RCDT_##id##_IMPROVE, +#define ADMIN_ACTION_CHANGE_COST 15000 + #define REBEL_COMMAND_DROPDOWN DropDownTemplate::getInstance() #define WEBSITE_LEFT LAPTOP_SCREEN_UL_X @@ -92,6 +97,7 @@ Points of interest: extern UINT32 gCoolnessBySector[256]; extern UINT32 guiInsuranceBackGround; extern BOOLEAN gfTownUsesLoyalty[MAX_TOWNS]; +extern GROUP *gpGroupList; namespace RebelCommand { @@ -162,6 +168,13 @@ enum RebelCommandText // keep this synced with szRebelCommandText in the text fi RCT_WEBSITE_AVAILABLE, RCT_NOT_SAFE_TO_REACTIVATE_ADMIN_TEAM, RCT_MINE_RAID_SUCCESSFUL, + RCT_INSUFFICIENT_INTEL_TO_CREATE_TURNCOATS, + RCT_CHANGE_ADMIN_ACTION, + RCT_CANCEL, + RCT_CONFIRM, + RCT_PREV_ARROW, + RCT_NEXT_ARROW, + RCT_CONFIRM_CHANGE_ADMIN_ACTION_PROMPT, }; enum RebelCommandHelpText // keep this synced with szRebelCommandHelpText in the text files @@ -185,6 +198,14 @@ enum RebelCommandDirectivesText // keep this synced with szRebelCommandDirective DIRECTIVE_TEXT(HVT_STRIKES) DIRECTIVE_TEXT(SPOTTERS) DIRECTIVE_TEXT(RAID_MINES) + DIRECTIVE_TEXT(CREATE_TURNCOATS) + DIRECTIVE_TEXT(DRAFT) +}; + +enum ChangeAdminActionState +{ + CAAS_INIT, + CAAS_CHANGING, }; // website functions @@ -206,8 +227,8 @@ void SetDirectiveDescriptionHelpText(INT32 reason, MOUSE_REGION& region, RebelCo void SetRegionHelpText(INT32 reason, MOUSE_REGION& helpTextRegion, RebelCommandHelpText text); void SetupAdminActionBox(const UINT8 actionIndex, const UINT16 descriptionText, const UINT16 buttonText); void ToggleWebsiteView(); +void UpdateAdminActionChangeList(INT16 regionId); -void EvaluateDirectives(); INT32 GetAdminActionCostForRegion(INT16 regionId); INT16 GetAdminActionInRegion(INT16 regionId, RebelCommandAdminActions adminAction); void HandleScouting(); @@ -218,12 +239,14 @@ void UpgradeMilitiaStats(); INT32 dbgAdvanceDayBtnId = -1; INT32 dbgPrintBtnId = -1; std::vector adminActionBtnIds; +std::vector adminActionChangeBtnIds; +ChangeAdminActionState adminActionChangeState; INT32 adminTeamBtnId = -1; INT32 improveDirectiveBtnId = -1; INT32 regionNextBtnId = -1; INT32 regionPrevBtnId = -1; -INT32 viewSwapBtnId = -1; INT32 upgradeMilitiaStatsBtnId = -1; +INT32 viewSwapBtnId = -1; // help text regions MOUSE_REGION adminTeamHelpTextRegion; @@ -233,6 +256,8 @@ MOUSE_REGION suppliesHelpTextRegion; MOUSE_REGION suppliesIncomeHelpTextRegion; BOOLEAN redraw = FALSE; +std::vector adminActionChangeList; +INT8 adminActionChangeIndex = 0; Info info; INT16 iCurrentRegionId = 1; INT32 iIncomingSuppliesPerDay = 0; @@ -265,6 +290,12 @@ void ClearAllButtons() } adminActionBtnIds.clear(); + for (const auto btnId : adminActionChangeBtnIds) + { + RemoveButton(btnId); + } + adminActionChangeBtnIds.clear(); + if (adminTeamBtnId != -1) { RemoveButton(adminTeamBtnId); @@ -362,13 +393,6 @@ void DeployOrReactivateAdminTeam(INT16 regionId) } -void EvaluateDirectives() -{ - const INT16 newDirective = REBEL_COMMAND_DROPDOWN.GetSelectedEntryKey(); - rebelCommandSaveInfo.iSelectedDirective = newDirective; - iIncomingSuppliesPerDay = CurrentPlayerProgressPercentage() * gRebelCommandSettings.fIncomeModifier + static_cast((newDirective == RCD_GATHER_SUPPLIES ? rebelCommandSaveInfo.directives[RCD_GATHER_SUPPLIES].GetValue1() : 0)); -} - INT32 GetAdminActionCostForRegion(INT16 regionId) { INT16 totalLocalActions = 0; @@ -423,6 +447,14 @@ void GetDirectiveEffect(const RebelCommandDirectives directive, STR16 text) swprintf(text, szRebelCommandDirectivesText[directive * 4 + 1], rebelCommandSaveInfo.directives[directive].GetValue1(), (100.f + rebelCommandSaveInfo.directives[directive].GetValue2()) / 100.f); break; + case RCD_CREATE_TURNCOATS: + swprintf(text, szRebelCommandDirectivesText[directive * 4 + 1], rebelCommandSaveInfo.directives[directive].GetValue1(), gRebelCommandSettings.fCreateTurncoatsIntelCost); + break; + + case RCD_DRAFT: + swprintf(text, szRebelCommandDirectivesText[directive * 4 + 1], (rebelCommandSaveInfo.directives[directive].GetValue1() * CurrentPlayerProgressPercentage())); + break; + default: swprintf(text, L"Unrecognised directive id: %d. Do you need to add it to GetDirectiveEffect?", directive); break; @@ -453,6 +485,8 @@ void ImproveDirective(const RebelCommandDirectives directive) rebelCommandSaveInfo.directives[directive].Improve(); LaptopSaveInfo.iCurrentBalance -= cost; + + RenderWebsite(); } }); } @@ -489,6 +523,8 @@ void RegionNavNext() if (iCurrentRegionId >= NUM_TOWNS) iCurrentRegionId = 1; } while (gfTownUsesLoyalty[iCurrentRegionId] == FALSE); + + UpdateAdminActionChangeList(iCurrentRegionId); } } @@ -503,6 +539,8 @@ void RegionNavPrev() if (iCurrentRegionId <= 0) iCurrentRegionId = NUM_TOWNS - 1; } while (gfTownUsesLoyalty[iCurrentRegionId] == FALSE); + + UpdateAdminActionChangeList(iCurrentRegionId); } } @@ -519,36 +557,109 @@ void SetupAdminActionBox(const UINT8 actionIndex, const UINT16 descriptionText, case 2: x = WEBSITE_LEFT + 350; break; } - y = WEBSITE_TOP + 140 + 110 * (actionIndex / 3); + y = WEBSITE_TOP + 125 + 110 * (actionIndex / 3); - // show label if maxed out - if ((actionIndex == RCAA_SUPPLY_LINE && rebelCommandSaveInfo.regions[iCurrentRegionId].ubMaxLoyalty >= MAX_LOYALTY_VALUE) - || (actionIndex != RCAA_SUPPLY_LINE && rebelCommandSaveInfo.regions[iCurrentRegionId].actionLevels[actionIndex] >= 2)) + if (actionIndex < 5 || adminActionChangeState == CAAS_INIT) { - DrawTextToScreen(szRebelCommandAdminActionsText[buttonText], x, y + 7, 0, FONT10ARIALBOLD, FONT_MCOLOR_BLACK, FONT_MCOLOR_BLACK, FALSE, 0); + // show label if maxed out + if ((actionIndex == RCAA_SUPPLY_LINE && rebelCommandSaveInfo.regions[iCurrentRegionId].ubMaxLoyalty >= MAX_LOYALTY_VALUE) + || (actionIndex != RCAA_SUPPLY_LINE && rebelCommandSaveInfo.regions[iCurrentRegionId].actionLevels[actionIndex] >= 2)) + { + DrawTextToScreen(szRebelCommandAdminActionsText[buttonText], x, y + 7, 0, FONT10ARIALBOLD, FONT_MCOLOR_BLACK, FONT_MCOLOR_BLACK, FALSE, 0); + } + else // show button + { + const UINT8 level = rebelCommandSaveInfo.regions[iCurrentRegionId].actionLevels[actionIndex]; + swprintf(text, szRebelCommandText[level == 0 ? RCT_ADMIN_ACTION_ESTABLISH : RCT_ADMIN_ACTION_IMPROVE], szRebelCommandAdminActionsText[buttonText]); + const INT32 btnId = CreateTextButton(text, FONT10ARIAL, FONT_MCOLOR_LTYELLOW, FONT_BLACK, BUTTON_USE_DEFAULT, x, y, 140, 20, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK, [](GUI_BUTTON* btn, INT32 reason) + { + ButtonHelper(btn, reason, [btn]() { PurchaseAdminAction(btn->UserData[0], btn->UserData[1]); }); + }); + + Assert(ButtonList[btnId]); + ButtonList[btnId]->UserData[0] = iCurrentRegionId; + ButtonList[btnId]->UserData[1] = actionIndex; + + adminActionBtnIds.push_back(btnId); + } + + y += 22; + swprintf(text, szRebelCommandText[RCT_ADMIN_ACTION_TIER], rebelCommandSaveInfo.regions[iCurrentRegionId].actionLevels[actionIndex]); + DrawTextToScreen(text, x, y, 0, FONT10ARIAL, FONT_MCOLOR_BLACK, FONT_MCOLOR_BLACK, FALSE, 0); + + y += 13; + DisplayWrappedString(x, y, 140, 2, FONT10ARIAL, FONT_MCOLOR_BLACK, szRebelCommandAdminActionsText[descriptionText], FONT_MCOLOR_BLACK, FALSE, 0); + + // special case for index 5: show state change button + if (actionIndex == 5) + { + y += 68; + + const INT32 btnId = CreateTextButton(szRebelCommandText[RCT_CHANGE_ADMIN_ACTION], FONT10ARIAL, FONT_MCOLOR_LTYELLOW, FONT_BLACK, BUTTON_USE_DEFAULT, x, y, 140, 18, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK, [](GUI_BUTTON* btn, INT32 reason) + { + ButtonHelper(btn, reason, [btn]() { adminActionChangeState = CAAS_CHANGING; }); + }); + adminActionChangeBtnIds.push_back(btnId); + } } - else // show button + else if (actionIndex == 5 && adminActionChangeState == CAAS_CHANGING) { - const UINT8 level = rebelCommandSaveInfo.regions[iCurrentRegionId].actionLevels[actionIndex]; - swprintf(text, szRebelCommandText[level == 0? RCT_ADMIN_ACTION_ESTABLISH : RCT_ADMIN_ACTION_IMPROVE], szRebelCommandAdminActionsText[buttonText]); - const INT32 btnId = CreateTextButton(text, FONT10ARIAL, FONT_MCOLOR_LTYELLOW, FONT_BLACK, BUTTON_USE_DEFAULT, x, y, 140, 20, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK, [](GUI_BUTTON* btn, INT32 reason) + // let player change last action + RebelCommandAdminActions newAction = adminActionChangeList[adminActionChangeIndex]; + + DrawTextToScreen(szRebelCommandAdminActionsText[newAction*2], x, y + 7, 0, FONT10ARIALBOLD, FONT_MCOLOR_BLACK, FONT_MCOLOR_BLACK, FALSE, 0); + + y += 22; + DisplayWrappedString(x, y, 140, 2, FONT10ARIAL, FONT_MCOLOR_BLACK, szRebelCommandAdminActionsText[newAction*2+1], FONT_MCOLOR_BLACK, FALSE, 0); + + y += 81; + INT32 btnId = CreateTextButton(szRebelCommandText[RCT_CANCEL], FONT10ARIAL, FONT_MCOLOR_LTYELLOW, FONT_BLACK, BUTTON_USE_DEFAULT, x, y, 140, 18, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK, [](GUI_BUTTON* btn, INT32 reason) { - ButtonHelper(btn, reason, [btn]() { PurchaseAdminAction(btn->UserData[0], btn->UserData[1]); }); + ButtonHelper(btn, reason, [btn]() { adminActionChangeState = CAAS_INIT; }); }); + adminActionChangeBtnIds.push_back(btnId); - Assert(ButtonList[btnId]); - ButtonList[btnId]->UserData[0] = iCurrentRegionId; - ButtonList[btnId]->UserData[1] = actionIndex; + y += 18; + btnId = CreateTextButton(szRebelCommandText[RCT_PREV_ARROW], FONT10ARIAL, FONT_MCOLOR_LTYELLOW, FONT_BLACK, BUTTON_USE_DEFAULT, x, y, 35, 18, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK, [](GUI_BUTTON* btn, INT32 reason) + { + ButtonHelper(btn, reason, [btn]() { adminActionChangeIndex--; if (adminActionChangeIndex < 0) adminActionChangeIndex = adminActionChangeList.size() - 1; }); + }); + adminActionChangeBtnIds.push_back(btnId); - adminActionBtnIds.push_back(btnId); + btnId = CreateTextButton(szRebelCommandText[RCT_NEXT_ARROW], FONT10ARIAL, FONT_MCOLOR_LTYELLOW, FONT_BLACK, BUTTON_USE_DEFAULT, x+35, y, 35, 18, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK, [](GUI_BUTTON* btn, INT32 reason) + { + ButtonHelper(btn, reason, [btn]() { adminActionChangeIndex++; if (adminActionChangeIndex >= adminActionChangeList.size()) adminActionChangeIndex = 0; }); + }); + adminActionChangeBtnIds.push_back(btnId); + + btnId = CreateTextButton(szRebelCommandText[RCT_CONFIRM], FONT10ARIAL, FONT_MCOLOR_LTYELLOW, FONT_BLACK, BUTTON_USE_DEFAULT, x+70, y, 70, 18, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, DEFAULT_MOVE_CALLBACK, [](GUI_BUTTON* btn, INT32 reason) + { + ButtonHelper(btn, reason, [btn]() + { + if (LaptopSaveInfo.iCurrentBalance < ADMIN_ACTION_CHANGE_COST) + { + DoLapTopMessageBox(MSG_BOX_LAPTOP_DEFAULT, szRebelCommandText[RCT_INSUFFICIENT_FUNDS], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); + return; + } + + CHAR16 text[200]; + swprintf(text, szRebelCommandText[RCT_CONFIRM_CHANGE_ADMIN_ACTION_PROMPT], ADMIN_ACTION_CHANGE_COST); + DoLapTopMessageBox(MSG_BOX_LAPTOP_DEFAULT, text, LAPTOP_SCREEN, MSG_BOX_FLAG_YESNO, [](UINT8 exitValue) { + if (exitValue == MSG_BOX_RETURN_YES) + { + rebelCommandSaveInfo.regions[iCurrentRegionId].actionLevels[5] = 0; + rebelCommandSaveInfo.regions[iCurrentRegionId].actions[5] = static_cast(adminActionChangeList[adminActionChangeIndex]); + + UpdateAdminActionChangeList(iCurrentRegionId); + LaptopSaveInfo.iCurrentBalance -= ADMIN_ACTION_CHANGE_COST; + + RenderWebsite(); + } + }); + }); + }); + adminActionChangeBtnIds.push_back(btnId); } - - y += 22; - swprintf(text, szRebelCommandText[RCT_ADMIN_ACTION_TIER], rebelCommandSaveInfo.regions[iCurrentRegionId].actionLevels[actionIndex] ); - DrawTextToScreen(text, x, y, 0, FONT10ARIAL, FONT_MCOLOR_BLACK, FONT_MCOLOR_BLACK, FALSE, 0); - - y += 13; - DisplayWrappedString(x, y, 140, 2, FONT10ARIAL, FONT_MCOLOR_BLACK, szRebelCommandAdminActionsText[descriptionText], FONT_MCOLOR_BLACK, FALSE, 0); } void SetDirectiveDescriptionHelpText(INT32 reason, MOUSE_REGION& region, RebelCommandDirectives text) @@ -575,8 +686,36 @@ void ToggleWebsiteView() websiteState = RCS_REGIONAL_OVERVIEW; } +void UpdateAdminActionChangeList(INT16 regionId) +{ + adminActionChangeIndex = 0; + adminActionChangeList.clear(); + adminActionChangeState = CAAS_INIT; + + for (int aa = RCAA_SUPPLY_LINE; aa < RCAA_NUM_ACTIONS; ++aa) + { + BOOLEAN found = FALSE; + + for (int actionId = 0; actionId < REBEL_COMMAND_MAX_ACTIONS_PER_REGION; ++actionId) + { + if (rebelCommandSaveInfo.regions[regionId].actions[actionId] == aa) + { + found = TRUE; + break; + } + } + + if (found == FALSE) + { + adminActionChangeList.push_back(static_cast(aa)); + } + } +} + BOOLEAN EnterWebsite() { + UpdateAdminActionChangeList(iCurrentRegionId); + // make sure we have a valid directive if (rebelCommandSaveInfo.iActiveDirective < RCD_GATHER_SUPPLIES || rebelCommandSaveInfo.iActiveDirective >= RCD_NUM_DIRECTIVES) { @@ -612,10 +751,15 @@ BOOLEAN EnterWebsite() directivesList.push_back(std::make_pair(RCD_SPOTTERS, szRebelCommandDirectivesText[RCDT_SPOTTERS])); if (HighestPlayerProgressPercentage() >= gRebelCommandSettings.uRaidMinesProgressRequirement) directivesList.push_back(std::make_pair(RCD_RAID_MINES, szRebelCommandDirectivesText[RCDT_RAID_MINES])); + if (HighestPlayerProgressPercentage() >= gRebelCommandSettings.uCreateTurncoatsProgressRequirement) + directivesList.push_back(std::make_pair(RCD_CREATE_TURNCOATS, szRebelCommandDirectivesText[RCDT_CREATE_TURNCOATS])); + if (HighestPlayerProgressPercentage() >= gRebelCommandSettings.uDraftProgressRequirement) + directivesList.push_back(std::make_pair(RCD_DRAFT, szRebelCommandDirectivesText[RCDT_DRAFT])); REBEL_COMMAND_DROPDOWN.SetEntries(directivesList); REBEL_COMMAND_DROPDOWN.SetHelpText(szRebelCommandHelpText[RCHT_DIRECTIVES]); REBEL_COMMAND_DROPDOWN.SetSelectedEntryKey(rebelCommandSaveInfo.iSelectedDirective); + REBEL_COMMAND_DROPDOWN.Create(WEBSITE_LEFT + 5, WEBSITE_TOP + 98); RenderWebsite(); @@ -643,19 +787,19 @@ void HandleWebsite() case TAB: case SPACE: ToggleWebsiteView(); - redraw = TRUE; + RenderWebsite(); break; case 'a': case LEFTARROW: RegionNavPrev(); - redraw = TRUE; + RenderWebsite(); break; case 'd': case RIGHTARROW: RegionNavNext(); - redraw = TRUE; + RenderWebsite(); break; default: @@ -666,9 +810,11 @@ void HandleWebsite() } if (redraw) + { RenderWebsite(); - - redraw = FALSE; + REBEL_COMMAND_DROPDOWN.Display(); + redraw = FALSE; + } } @@ -676,7 +822,6 @@ void RenderWebsite() { ClearAllButtons(); ClearAllHelpTextRegions(); - REBEL_COMMAND_DROPDOWN.Destroy(); // background WebPageTileBackground(4, 4, 125, 100, guiInsuranceBackGround); @@ -1057,7 +1202,6 @@ void RenderNationalOverview() } // dropdown - has to be last, or else things after this will be drawn twice - REBEL_COMMAND_DROPDOWN.Create(dropdownX, dropdownY); REBEL_COMMAND_DROPDOWN.Display(); } @@ -1110,7 +1254,7 @@ void RenderRegionalOverview() // line between region info and admin info usPosX = WEBSITE_LEFT - 1; - usPosY += 30; + usPosY += 20; DisplaySmallColouredLineWithShadow(usPosX, usPosY, usPosX + 500, usPosY, FROMRGB(240, 240, 240)); // admin team @@ -1553,6 +1697,102 @@ void GetBonusMilitia(INT16 sx, INT16 sy, UINT8& green, UINT8& regular, UINT8& el createBonusMilitia(1); } +INT16 GetFortificationsBonus(UINT8 sector) +{ + if (!gGameExternalOptions.fRebelCommandEnabled) + return 0; + + const UINT8 x = SECTORX(sector); + const UINT8 y = SECTORY(sector); + const UINT8 townId = GetTownIdForSector(x, y); + + // not a town + if (townId < FIRST_TOWN || townId >= NUM_TOWNS) + return 0; + + // no admin team + if (rebelCommandSaveInfo.regions[townId].adminStatus != RAS_ACTIVE) + return 0; + + const INT16 index = GetAdminActionInRegion(townId, RCAA_FORTIFICATIONS); + + // action doesn't exist in region + if (index == -1) + return 0; + + // no levels in region + const UINT8 level = rebelCommandSaveInfo.regions[townId].actionLevels[index]; + if (level == 0) + return 0; + + return static_cast(info.adminActions[RCAA_FORTIFICATIONS].fValue1 * level); +} + +FLOAT GetHarriersSpeedPenalty(UINT8 sector) +{ + if (!gGameExternalOptions.fRebelCommandEnabled) + return 0.f; + + const UINT8 x = SECTORX(sector); + const UINT8 y = SECTORY(sector); + + // get towns that have harriers + std::vector> townSectors; + for (INT16 x = MINIMUM_VALID_X_COORDINATE; x <= MAXIMUM_VALID_X_COORDINATE; ++x) + { + for (INT16 y = MINIMUM_VALID_Y_COORDINATE; y < MAXIMUM_VALID_Y_COORDINATE; ++y) + { + const UINT8 townId = GetTownIdForSector(x, y); + // not a town + if (townId < FIRST_TOWN || townId >= NUM_TOWNS) + continue; + + // no admin team + if (rebelCommandSaveInfo.regions[townId].adminStatus != RAS_ACTIVE) + continue; + + const INT16 index = GetAdminActionInRegion(townId, RCAA_HARRIERS); + + // action doesn't exist in region + if (index == -1) + continue; + + // no levels in region + const UINT8 level = rebelCommandSaveInfo.regions[townId].actionLevels[index]; + if (level == 0) + continue; + + townSectors.push_back(std::tuple(x, y, level)); + } + } + + // run through townSectors to find the biggest harriers penalty + BOOLEAN found = FALSE; + for (const auto trio : townSectors) + { + const INT16 sx = std::get<0>(trio); + const INT16 sy = std::get<1>(trio); + const INT16 range = std::get<2>(trio); + + if (abs(sx - x) + abs(sy - y) <= range) + { + // level 2 penalty + if (range == 2) + return range * info.adminActions[RCAA_HARRIERS].fValue1; + + // keep searching to see if we're in range of a better penalty + found = TRUE; + } + } + + // level 1 penalty + if (found == TRUE) + return info.adminActions[RCAA_HARRIERS].fValue1; + + // nothing found, no penalty + return 0.f; +} + FLOAT GetLoyaltyGainModifier() { if (gGameExternalOptions.fRebelCommandEnabled) @@ -1654,6 +1894,71 @@ void HandleScouting() } } +FLOAT GetPathfindersSpeedBonus(UINT8 sector) +{ + if (!gGameExternalOptions.fRebelCommandEnabled) + return 0.f; + + const UINT8 x = SECTORX(sector); + const UINT8 y = SECTORY(sector); + + // get towns that have pathfinders + std::vector> townSectors; + for (INT16 x = MINIMUM_VALID_X_COORDINATE; x <= MAXIMUM_VALID_X_COORDINATE; ++x) + { + for (INT16 y = MINIMUM_VALID_Y_COORDINATE; y < MAXIMUM_VALID_Y_COORDINATE; ++y) + { + const UINT8 townId = GetTownIdForSector(x, y); + // not a town + if (townId < FIRST_TOWN || townId >= NUM_TOWNS) + continue; + + // no admin team + if (rebelCommandSaveInfo.regions[townId].adminStatus != RAS_ACTIVE) + continue; + + const INT16 index = GetAdminActionInRegion(townId, RCAA_PATHFINDERS); + + // action doesn't exist in region + if (index == -1) + continue; + + // no levels in region + const UINT8 level = rebelCommandSaveInfo.regions[townId].actionLevels[index]; + if (level == 0) + continue; + + townSectors.push_back(std::tuple(x, y, level)); + } + } + + // run through townSectors to find the biggest pathfinders bonus + BOOLEAN found = FALSE; + for (const auto trio : townSectors) + { + const INT16 sx = std::get<0>(trio); + const INT16 sy = std::get<1>(trio); + const INT16 range = std::get<2>(trio); + + if (abs(sx - x) + abs(sy - y) <= range) + { + // level 2 bonus + if (range == 2) + return range * info.adminActions[RCAA_PATHFINDERS].fValue1; + + // keep searching to see if we're in range of a better bonus + found = TRUE; + } + } + + // level 1 bonus + if (found == TRUE) + return info.adminActions[RCAA_PATHFINDERS].fValue1; + + // nothing found, no bonus + return 0.f; +} + BOOLEAN NeutraliseRole(const SOLDIERTYPE* pSoldier) { if (!gGameExternalOptions.fRebelCommandEnabled || !gGameExternalOptions.fEnemyRoles || !gGameExternalOptions.fAssignTraitsToEnemy) @@ -1714,7 +2019,6 @@ void DailyUpdate() { if (!gGameExternalOptions.fRebelCommandEnabled) return; - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"DEBUG: ARC selected/active directive: %d/%d", rebelCommandSaveInfo.iSelectedDirective, rebelCommandSaveInfo.iActiveDirective ); // make sure we have a valid directive if (rebelCommandSaveInfo.iActiveDirective < RCD_GATHER_SUPPLIES || rebelCommandSaveInfo.iActiveDirective >= RCD_NUM_DIRECTIVES) @@ -1737,29 +2041,142 @@ void DailyUpdate() break; case RCD_ELITE_MILITIA: - const UINT8 elites = static_cast(rebelCommandSaveInfo.directives[RCD_ELITE_MILITIA].GetValue1()); - // get the top-right most omerta tile - INT16 sx = 1, sy = 1; - for (sx = MAXIMUM_VALID_X_COORDINATE; sx >= MINIMUM_VALID_X_COORDINATE; --sx) { - for (sy = MINIMUM_VALID_Y_COORDINATE; sy <= MAXIMUM_VALID_Y_COORDINATE; ++sy) + const UINT8 elites = static_cast(rebelCommandSaveInfo.directives[RCD_ELITE_MILITIA].GetValue1()); + // get the top-right most omerta tile + INT16 sx = 1, sy = 1; + for (sx = MAXIMUM_VALID_X_COORDINATE; sx >= MINIMUM_VALID_X_COORDINATE; --sx) { - if (GetTownIdForSector(sx, sy) == OMERTA) + for (sy = MINIMUM_VALID_Y_COORDINATE; sy <= MAXIMUM_VALID_Y_COORDINATE; ++sy) { - goto foundOmerta; + if (GetTownIdForSector(sx, sy) == OMERTA) + { + goto foundOmerta; + } } } - } - foundOmerta: + foundOmerta: - StrategicAddMilitiaToSector(sx, sy, ELITE_MILITIA, elites); - for (int i = 0 ; i < elites ; ++i) - { - CreateNewIndividualMilitia( ELITE_MILITIA, MO_ARULCO, SECTOR(sx, sy) ); + StrategicAddMilitiaToSector(sx, sy, ELITE_MILITIA, elites); + for (int i = 0 ; i < elites ; ++i) + { + CreateNewIndividualMilitia( ELITE_MILITIA, MO_ARULCO, SECTOR(sx, sy) ); + } } break; + case RCD_CREATE_TURNCOATS: + { + if (LaptopSaveInfo.dIntelPool >= gRebelCommandSettings.fCreateTurncoatsIntelCost) + { + UINT32 groupNum = 1; + GROUP* groupPtr = gpGroupList; + GROUP* selectedGroupPtr = nullptr; + + // pick a random group + while (groupPtr != nullptr) + { + if (groupPtr->usGroupTeam != ENEMY_TEAM) + { + groupPtr = groupPtr->next; + continue; + } + + if (Random(groupNum) == 0) + { + selectedGroupPtr = groupPtr; + } + + groupNum++; + groupPtr = groupPtr->next; + } + + if (selectedGroupPtr == nullptr) + break; // couldn't find a group... + + // determine which enemies become turncoats + UINT8 turncoatsToCreate = static_cast(rebelCommandSaveInfo.directives[RCD_CREATE_TURNCOATS].GetValue1()); + UINT8 netEnemyCount = selectedGroupPtr->pEnemyGroup->ubNumAdmins + selectedGroupPtr->pEnemyGroup->ubNumTroops + selectedGroupPtr->pEnemyGroup->ubNumElites; + netEnemyCount -= selectedGroupPtr->pEnemyGroup->ubNumAdmins_Turncoat - selectedGroupPtr->pEnemyGroup->ubNumTroops_Turncoat - selectedGroupPtr->pEnemyGroup->ubNumElites_Turncoat; + Assert(netEnemyCount >= 0); + turncoatsToCreate = min(turncoatsToCreate, netEnemyCount); + + const UINT8 maxAdmins = selectedGroupPtr->pEnemyGroup->ubNumAdmins - selectedGroupPtr->pEnemyGroup->ubNumAdmins_Turncoat; + const UINT8 maxTroops = selectedGroupPtr->pEnemyGroup->ubNumTroops - selectedGroupPtr->pEnemyGroup->ubNumTroops_Turncoat; + const UINT8 maxElites = selectedGroupPtr->pEnemyGroup->ubNumElites - selectedGroupPtr->pEnemyGroup->ubNumElites_Turncoat; + + UINT8 admins = 0; + UINT8 troops = 0; + UINT8 elites = 0; + + while (turncoatsToCreate > 0) + { + std::vector vec; + // weighted odds + if (admins < maxAdmins) + { + vec.push_back(0); + vec.push_back(0); + vec.push_back(0); + } + + if (troops < maxTroops) + { + vec.push_back(1); + vec.push_back(1); + } + + if (elites < maxElites) + { + vec.push_back(2); + } + + Assert(vec.size() > 0); + + const int choice = vec[Random(vec.size())]; + + switch (choice) + { + case 0: + admins++; + break; + + case 1: + troops++; + break; + + case 2: + elites++; + break; + } + + turncoatsToCreate--; + } + + // add the turncoats + selectedGroupPtr->pEnemyGroup->ubNumAdmins_Turncoat += admins; + selectedGroupPtr->pEnemyGroup->ubNumTroops_Turncoat += troops; + selectedGroupPtr->pEnemyGroup->ubNumElites_Turncoat += elites; + + LaptopSaveInfo.dIntelPool -= gRebelCommandSettings.fCreateTurncoatsIntelCost; + } + else + { + ScreenMsg(FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szRebelCommandText[RCT_INSUFFICIENT_INTEL_TO_CREATE_TURNCOATS]); + } + } + break; + + case RCD_DRAFT: + { + AddVolunteers(static_cast(rebelCommandSaveInfo.directives[RCD_DRAFT].GetValue1() * CurrentPlayerProgressPercentage())); + for (int a = FIRST_TOWN; a < NUM_TOWNS; ++a) + { + DecrementTownLoyalty(a, static_cast(rebelCommandSaveInfo.directives[RCD_DRAFT].GetValue2())); + } + } + break; } @@ -1808,6 +2225,14 @@ void DailyUpdate() switch (static_cast(rebelCommandSaveInfo.regions[a].actions[b])) { case RCAA_SUPPLY_LINE: + case RCAA_SAFEHOUSES: + case RCAA_SUPPLY_DISRUPTION: + case RCAA_SCOUTS: + case RCAA_MERC_SUPPORT: + case RCAA_MINING_POLICY: + case RCAA_PATHFINDERS: + case RCAA_HARRIERS: + case RCAA_FORTIFICATIONS: // no daily bonuses break; @@ -1815,18 +2240,6 @@ void DailyUpdate() IncrementTownLoyalty(a, static_cast(info.adminActions[RCAA_REBEL_RADIO].fValue1 * level)); break; - case RCAA_SAFEHOUSES: - // no daily bonuses - break; - - case RCAA_SUPPLY_DISRUPTION: - // no daily bonuses - break; - - case RCAA_SCOUTS: - // no daily bonuses - break; - case RCAA_DEAD_DROPS: intelGain += (Random(static_cast(info.adminActions[RCAA_DEAD_DROPS].fValue1)) * level); break; @@ -1851,13 +2264,6 @@ void DailyUpdate() AddVolunteers(static_cast(info.adminActions[RCAA_ASSIST_CIVILIANS].fValue1 * level * Random(100) / 100.f)); break; - case RCAA_MERC_SUPPORT: - // no daily bonuses - break; - - case RCAA_MINING_POLICY: - // no daily bonuses - break; default: AssertMsg(false, "Unknown Admin Action"); @@ -1951,6 +2357,9 @@ void Init() if (gGameExternalOptions.fMilitiaVolunteerPool == TRUE) actions.push_back(RCAA_ASSIST_CIVILIANS); // RCAA_MINING_POLICY is added below in the region init + actions.push_back(RCAA_PATHFINDERS); + actions.push_back(RCAA_HARRIERS); + actions.push_back(RCAA_FORTIFICATIONS); SetupInfo(); @@ -1972,13 +2381,12 @@ void Init() } else { + // init admins + rebelCommandSaveInfo.regions[a].adminStatus = RAS_NONE; rebelCommandSaveInfo.regions[a].ubMaxLoyalty = startingMaxLoyalty; gTownLoyalty[a].ubRating = min(gTownLoyalty[a].ubRating, startingMaxLoyalty); } - // init admins - rebelCommandSaveInfo.regions[a].adminStatus = RAS_NONE; - // init admin actions per region. each region has supply line + 5 random actions std::vector vec(actions); @@ -2089,6 +2497,16 @@ void SetupInfo() d.fValue2.clear(); info.directives.insert(info.directives.begin() + RCD_RAID_MINES, d); + d.iCostToImprove = gRebelCommandSettings.iCreateTurncoatsCosts; + toFloatVec(gRebelCommandSettings.iCreateTurncoatsPerDay, d.fValue1); + d.fValue2.clear(); + info.directives.insert(info.directives.begin() + RCD_CREATE_TURNCOATS, d); + + d.iCostToImprove = gRebelCommandSettings.iDraftCosts; + toFloatVec(gRebelCommandSettings.iDraftPerDayModifier, d.fValue1); + toFloatVec(gRebelCommandSettings.iDraftLoyaltyLossPerDay, d.fValue2); + info.directives.insert(info.directives.begin() + RCD_DRAFT, d); + // init admin actions AdminAction aa; info.adminActions.clear(); @@ -2152,6 +2570,22 @@ void SetupInfo() aa.fValue2 = 0.f; aa.fValue3 = 0.f; info.adminActions.insert(info.adminActions.begin() + RCAA_MINING_POLICY, aa); + + aa.fValue1 = static_cast(gRebelCommandSettings.uPathfindersSpeedBonus); + aa.fValue2 = 0.f; + aa.fValue3 = 0.f; + info.adminActions.insert(info.adminActions.begin() + RCAA_PATHFINDERS, aa); + + aa.fValue1 = static_cast(gRebelCommandSettings.uHarriersSpeedPenalty); + aa.fValue2 = 0.f; + aa.fValue3 = 0.f; + info.adminActions.insert(info.adminActions.begin() + RCAA_HARRIERS, aa); + + aa.fValue1 = static_cast(gRebelCommandSettings.iFortificationsBonus); + aa.fValue2 = 0.f; + aa.fValue3 = 0.f; + info.adminActions.insert(info.adminActions.begin() + RCAA_FORTIFICATIONS, aa); + } void UpgradeMilitiaStats() @@ -2171,6 +2605,8 @@ void UpgradeMilitiaStats() const INT32 cost = gRebelCommandSettings.iMilitiaUpgradeCosts[rebelCommandSaveInfo.iMilitiaStatsLevel++]; LaptopSaveInfo.iCurrentBalance -= cost; + + RenderWebsite(); } }); } @@ -2194,6 +2630,14 @@ void DEBUG_PRINT() } -template<> void DropDownTemplate::SetRefresh() { RebelCommand::EvaluateDirectives(); RebelCommand::redraw = TRUE; } +template<> void DropDownTemplate::SetRefresh() +{ + using namespace RebelCommand; + const INT16 newDirective = REBEL_COMMAND_DROPDOWN.GetSelectedEntryKey(); + rebelCommandSaveInfo.iSelectedDirective = newDirective; + iIncomingSuppliesPerDay = CurrentPlayerProgressPercentage() * gRebelCommandSettings.fIncomeModifier + static_cast((newDirective == RCD_GATHER_SUPPLIES ? rebelCommandSaveInfo.directives[RCD_GATHER_SUPPLIES].GetValue1() : 0)); + + redraw = TRUE; +} diff --git a/Strategic/Rebel Command.h b/Strategic/Rebel Command.h index 7a4d3232..488ff51e 100644 --- a/Strategic/Rebel Command.h +++ b/Strategic/Rebel Command.h @@ -21,6 +21,8 @@ enum RebelCommandDirectives RCD_HVT_STRIKES, RCD_SPOTTERS, RCD_RAID_MINES, + RCD_CREATE_TURNCOATS, + RCD_DRAFT, RCD_NUM_DIRECTIVES }; @@ -40,6 +42,9 @@ enum RebelCommandAdminActions RCAA_ASSIST_CIVILIANS, RCAA_MERC_SUPPORT, RCAA_MINING_POLICY, + RCAA_PATHFINDERS, + RCAA_HARRIERS, + RCAA_FORTIFICATIONS, RCAA_NUM_ACTIONS }; @@ -122,11 +127,14 @@ UINT8 GetApproximateEnemyLocationResolutionIndex(); FLOAT GetAssignmentBonus(INT16 x, INT16 y); INT32 GetMiningPolicyBonus(INT16 townId); void GetBonusMilitia(INT16 x, INT16 y, UINT8& green, UINT8& regular, UINT8& elite, BOOLEAN createGroup); +INT16 GetFortificationsBonus(UINT8 sector); +FLOAT GetHarriersSpeedPenalty(UINT8 sector); FLOAT GetLoyaltyGainModifier(); UINT8 GetMaxTownLoyalty(INT8 townId); INT16 GetMilitiaTrainingSpeedBonus(); FLOAT GetMilitiaTrainingCostModifier(); FLOAT GetMilitiaUpkeepCostModifier(); +FLOAT GetPathfindersSpeedBonus(UINT8 sector); BOOLEAN NeutraliseRole(const SOLDIERTYPE* pSoldier); void RaidMines(INT32 &playerIncome, INT32 &enemyIncome); BOOLEAN ShowApproximateEnemyLocations(); diff --git a/Strategic/Strategic Movement.cpp b/Strategic/Strategic Movement.cpp index 7c3cd145..32c1a073 100644 --- a/Strategic/Strategic Movement.cpp +++ b/Strategic/Strategic Movement.cpp @@ -52,6 +52,7 @@ #include "Militia Control.h" // added by Flugente for ResetMilitia() #include "Creature Spreading.h" // added by Flugente #include "MilitiaIndividual.h" // added by Flugente + #include "Rebel Command.h" #endif #include "MilitiaSquads.h" @@ -3611,6 +3612,8 @@ INT32 GetSectorMvtTimeForGroup( UINT8 ubSector, UINT8 ubDirection, GROUP *pGroup iBestTraverseTime = max( 10, (iBestTraverseTime * (100 - (fSurvivalistHere * gSkillTraitValues.ubSVGroupTimeSpentForTravellingFoot)) / 100) ); iBestTraverseTime = max( 10, (iBestTraverseTime * (100 - stravelbackground_foot) / 100)); + + iBestTraverseTime = max( 10, (iBestTraverseTime * (100 - RebelCommand::GetPathfindersSpeedBonus(ubSector)) / 100)); } // all other types (except air) else if ( fAir ) @@ -3641,6 +3644,8 @@ INT32 GetSectorMvtTimeForGroup( UINT8 ubSector, UINT8 ubDirection, GROUP *pGroup } iBestTraverseTime = dEnemyGeneralsSpeedupFactor * iBestTraverseTime; + + iBestTraverseTime = iBestTraverseTime * (100 + RebelCommand::GetHarriersSpeedPenalty(ubSector)) / 100; } /////////////////////////////////////////////////////////////////////////////// diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 05257b88..ae8dc061 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -11733,6 +11733,13 @@ STR16 szRebelCommandText[] = // TODO.Translate L"[A.R.C. WEBSITE AVAILABLE] With the delivery of food and basic supplies to Omerta, you have convinced the rebels that you're here to make an impact. You have been granted access to the command system they've been working on, which is now available through your laptop.", L"It is currently not safe to reactivate the administration team here. Recapture a town sector first.", L"Mine raid successful. Stole $%d.", + L"Insufficient Intel to create turncoats!", + L"Change Admin Action", + L"Cancel", + L"Confirm", + L"<", + L">", + L"Changing this Admin Action will cost $%d and reset its tier. Confirm expenditure?", }; STR16 szRebelCommandHelpText[] = // TODO.Translate @@ -11773,6 +11780,12 @@ STR16 szRebelCommandAdminActionsText[] = // TODO.Translate L"Set up facilities to directly support your mercs assigned in the town. Increases the effectiveness of merc assignments (doctoring, repairing, militia training, etc).", L"Mining Policy", L"Import better equipment and work with the town's miners to create more balanced and efficient shift schedules. Increases the town's mine income.", + L"Pathfinders", + L"The locals guide your teams through shortcuts in the area. Reduces on-foot travel time in the region.", + L"Harriers", + L"The rebels harass nearby enemy groups, significantly increasing their travel time in the region.", + L"Fortifications", + L"Set up killzones and defensive positions. Friendly forces are more effective when fighting in this town. Autoresolve only.", }; // follows a specific format: @@ -11814,6 +11827,14 @@ STR16 szRebelCommandDirectivesText[] = // TODO.Translate L"Steal some income from mines not under your control. This directive becomes less useful as you claim mines.", L"Conduct smash-and-grab raids on hostile mines. While not always\nsuccessful, the raids that do succeed should provide a\nsmall income bump.", L"Improving this directive will increase the maximum value of stolen income.", + L"Create Turncoats", + L"Create %.0f turncoats in a random enemy group per day. Consumes %.1f Intel per day.", + L"Convince enemy soldiers to betray their army and work for you\nthrough a combination of bribery, threats, and blackmail.", + L"Improving this directive will increase the number of soldiers turned daily.", + L"Draft Civilians", + L"Gain %.0f volunteers each day. All towns lose some loyalty each day.", + L"Draft civilians as recruits for militia. The general population\nprobably won't be too happy about it, though. Effectiveness\nincreases as you capture more towns.", + L"Improving this directive will increase the number of volunteers gained per day.", }; // WANNE: Some Chinese specific strings that needs to be in unicode! diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 97c743b9..68223c31 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -11735,6 +11735,13 @@ STR16 szRebelCommandText[] = // TODO.Translate L"[A.R.C. WEBSITE AVAILABLE] With the delivery of food and basic supplies to Omerta, you have convinced the rebels that you're here to make an impact. You have been granted access to the command system they've been working on, which is now available through your laptop.", L"It is currently not safe to reactivate the administration team here. Recapture a town sector first.", L"Mine raid successful. Stole $%d.", + L"Insufficient Intel to create turncoats!", + L"Change Admin Action", + L"Cancel", + L"Confirm", + L"<", + L">", + L"Changing this Admin Action will cost $%d and reset its tier. Confirm expenditure?", }; STR16 szRebelCommandHelpText[] = // TODO.Translate @@ -11775,6 +11782,12 @@ STR16 szRebelCommandAdminActionsText[] = // TODO.Translate L"Set up facilities to directly support your mercs assigned in the town. Increases the effectiveness of merc assignments (doctoring, repairing, militia training, etc).", L"Mining Policy", L"Import better equipment and work with the town's miners to create more balanced and efficient shift schedules. Increases the town's mine income.", + L"Pathfinders", + L"The locals guide your teams through shortcuts in the area. Reduces on-foot travel time in the region.", + L"Harriers", + L"The rebels harass nearby enemy groups, significantly increasing their travel time in the region.", + L"Fortifications", + L"Set up killzones and defensive positions. Friendly forces are more effective when fighting in this town. Autoresolve only.", }; // follows a specific format: @@ -11816,6 +11829,14 @@ STR16 szRebelCommandDirectivesText[] = // TODO.Translate L"Steal some income from mines not under your control. This directive becomes less useful as you claim mines.", L"Conduct smash-and-grab raids on hostile mines. While not always\nsuccessful, the raids that do succeed should provide a\nsmall income bump.", L"Improving this directive will increase the maximum value of stolen income.", + L"Create Turncoats", + L"Create %.0f turncoats in a random enemy group per day. Consumes %.1f Intel per day.", + L"Convince enemy soldiers to betray their army and work for you\nthrough a combination of bribery, threats, and blackmail.", + L"Improving this directive will increase the number of soldiers turned daily.", + L"Draft Civilians", + L"Gain %.0f volunteers each day. All towns lose some loyalty each day.", + L"Draft civilians as recruits for militia. The general population\nprobably won't be too happy about it, though. Effectiveness\nincreases as you capture more towns.", + L"Improving this directive will increase the number of volunteers gained per day.", }; #endif //DUTCH diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index ebdcb7fb..4b607fcf 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -11739,6 +11739,13 @@ STR16 szRebelCommandText[] = L"[A.R.C. WEBSITE AVAILABLE] With the delivery of food and basic supplies to Omerta, you have convinced the rebels that you're here to make an impact. You have been granted access to the command system they've been working on, which is now available through your laptop.", L"It is currently not safe to reactivate the administration team here. Recapture a town sector first.", L"Mine raid successful. Stole $%d.", + L"Insufficient Intel to create turncoats!", + L"Change Admin Action", + L"Cancel", + L"Confirm", + L"<", + L">", + L"Changing this Admin Action will cost $%d and reset its tier. Confirm expenditure?", }; STR16 szRebelCommandHelpText[] = @@ -11779,6 +11786,12 @@ STR16 szRebelCommandAdminActionsText[] = L"Set up facilities to directly support your mercs assigned in the town. Increases the effectiveness of merc assignments (doctoring, repairing, militia training, etc).", L"Mining Policy", L"Import better equipment and work with the town's miners to create more balanced and efficient shift schedules. Increases the town's mine income.", + L"Pathfinders", + L"The locals guide your teams through shortcuts in the area. Reduces on-foot travel time in the region.", + L"Harriers", + L"The rebels harass nearby enemy groups, significantly increasing their travel time in the region.", + L"Fortifications", + L"Set up killzones and defensive positions. Friendly forces are more effective when fighting in this town. Autoresolve only.", }; // follows a specific format: @@ -11820,6 +11833,14 @@ STR16 szRebelCommandDirectivesText[] = L"Steal some income from mines not under your control. This directive becomes less useful as you claim mines.", L"Conduct smash-and-grab raids on hostile mines. While not always\nsuccessful, the raids that do succeed should provide a\nsmall income bump.", L"Improving this directive will increase the maximum value of stolen income.", + L"Create Turncoats", + L"Create %.0f turncoats in a random enemy group per day. Consumes %.1f Intel per day.", + L"Convince enemy soldiers to betray their army and work for you\nthrough a combination of bribery, threats, and blackmail.", + L"Improving this directive will increase the number of soldiers turned daily.", + L"Draft Civilians", + L"Gain %.0f volunteers each day. All towns lose some loyalty each day.", + L"Draft civilians as recruits for militia. The general population\nprobably won't be too happy about it, though. Effectiveness\nincreases as you capture more towns.", + L"Improving this directive will increase the number of volunteers gained per day.", }; #endif //ENGLISH diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index fab72c29..258a39ce 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -11717,6 +11717,13 @@ STR16 szRebelCommandText[] = // TODO.Translate L"[A.R.C. WEBSITE AVAILABLE] With the delivery of food and basic supplies to Omerta, you have convinced the rebels that you're here to make an impact. You have been granted access to the command system they've been working on, which is now available through your laptop.", L"It is currently not safe to reactivate the administration team here. Recapture a town sector first.", L"Mine raid successful. Stole $%d.", + L"Insufficient Intel to create turncoats!", + L"Change Admin Action", + L"Cancel", + L"Confirm", + L"<", + L">", + L"Changing this Admin Action will cost $%d and reset its tier. Confirm expenditure?", }; STR16 szRebelCommandHelpText[] = // TODO.Translate @@ -11757,6 +11764,12 @@ STR16 szRebelCommandAdminActionsText[] = // TODO.Translate L"Set up facilities to directly support your mercs assigned in the town. Increases the effectiveness of merc assignments (doctoring, repairing, militia training, etc).", L"Mining Policy", L"Import better equipment and work with the town's miners to create more balanced and efficient shift schedules. Increases the town's mine income.", + L"Pathfinders", + L"The locals guide your teams through shortcuts in the area. Reduces on-foot travel time in the region.", + L"Harriers", + L"The rebels harass nearby enemy groups, significantly increasing their travel time in the region.", + L"Fortifications", + L"Set up killzones and defensive positions. Friendly forces are more effective when fighting in this town. Autoresolve only.", }; // follows a specific format: @@ -11798,6 +11811,14 @@ STR16 szRebelCommandDirectivesText[] = // TODO.Translate L"Steal some income from mines not under your control. This directive becomes less useful as you claim mines.", L"Conduct smash-and-grab raids on hostile mines. While not always\nsuccessful, the raids that do succeed should provide a\nsmall income bump.", L"Improving this directive will increase the maximum value of stolen income.", + L"Create Turncoats", + L"Create %.0f turncoats in a random enemy group per day. Consumes %.1f Intel per day.", + L"Convince enemy soldiers to betray their army and work for you\nthrough a combination of bribery, threats, and blackmail.", + L"Improving this directive will increase the number of soldiers turned daily.", + L"Draft Civilians", + L"Gain %.0f volunteers each day. All towns lose some loyalty each day.", + L"Draft civilians as recruits for militia. The general population\nprobably won't be too happy about it, though. Effectiveness\nincreases as you capture more towns.", + L"Improving this directive will increase the number of volunteers gained per day.", }; #endif //FRENCH diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 6ee2e74c..04d4a978 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -11639,6 +11639,13 @@ STR16 szRebelCommandText[] = // TODO.Translate L"[A.R.C. WEBSITE AVAILABLE] With the delivery of food and basic supplies to Omerta, you have convinced the rebels that you're here to make an impact. You have been granted access to the command system they've been working on, which is now available through your laptop.", L"It is currently not safe to reactivate the administration team here. Recapture a town sector first.", L"Mine raid successful. Stole $%d.", + L"Insufficient Intel to create turncoats!", + L"Change Admin Action", + L"Cancel", + L"Confirm", + L"<", + L">", + L"Changing this Admin Action will cost $%d and reset its tier. Confirm expenditure?", }; STR16 szRebelCommandHelpText[] = // TODO.Translate @@ -11679,6 +11686,12 @@ STR16 szRebelCommandAdminActionsText[] = // TODO.Translate L"Set up facilities to directly support your mercs assigned in the town. Increases the effectiveness of merc assignments (doctoring, repairing, militia training, etc).", L"Mining Policy", L"Import better equipment and work with the town's miners to create more balanced and efficient shift schedules. Increases the town's mine income.", + L"Pathfinders", + L"The locals guide your teams through shortcuts in the area. Reduces on-foot travel time in the region.", + L"Harriers", + L"The rebels harass nearby enemy groups, significantly increasing their travel time in the region.", + L"Fortifications", + L"Set up killzones and defensive positions. Friendly forces are more effective when fighting in this town. Autoresolve only.", }; // follows a specific format: @@ -11720,6 +11733,14 @@ STR16 szRebelCommandDirectivesText[] = // TODO.Translate L"Steal some income from mines not under your control. This directive becomes less useful as you claim mines.", L"Conduct smash-and-grab raids on hostile mines. While not always\nsuccessful, the raids that do succeed should provide a\nsmall income bump.", L"Improving this directive will increase the maximum value of stolen income.", + L"Create Turncoats", + L"Create %.0f turncoats in a random enemy group per day. Consumes %.1f Intel per day.", + L"Convince enemy soldiers to betray their army and work for you\nthrough a combination of bribery, threats, and blackmail.", + L"Improving this directive will increase the number of soldiers turned daily.", + L"Draft Civilians", + L"Gain %.0f volunteers each day. All towns lose some loyalty each day.", + L"Draft civilians as recruits for militia. The general population\nprobably won't be too happy about it, though. Effectiveness\nincreases as you capture more towns.", + L"Improving this directive will increase the number of volunteers gained per day.", }; #endif //GERMAN diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index bf63b757..c57e5aad 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -11726,6 +11726,13 @@ STR16 szRebelCommandText[] = // TODO.Translate L"[A.R.C. WEBSITE AVAILABLE] With the delivery of food and basic supplies to Omerta, you have convinced the rebels that you're here to make an impact. You have been granted access to the command system they've been working on, which is now available through your laptop.", L"It is currently not safe to reactivate the administration team here. Recapture a town sector first.", L"Mine raid successful. Stole $%d.", + L"Insufficient Intel to create turncoats!", + L"Change Admin Action", + L"Cancel", + L"Confirm", + L"<", + L">", + L"Changing this Admin Action will cost $%d and reset its tier. Confirm expenditure?", }; STR16 szRebelCommandHelpText[] = // TODO.Translate @@ -11766,6 +11773,12 @@ STR16 szRebelCommandAdminActionsText[] = // TODO.Translate L"Set up facilities to directly support your mercs assigned in the town. Increases the effectiveness of merc assignments (doctoring, repairing, militia training, etc).", L"Mining Policy", L"Import better equipment and work with the town's miners to create more balanced and efficient shift schedules. Increases the town's mine income.", + L"Pathfinders", + L"The locals guide your teams through shortcuts in the area. Reduces on-foot travel time in the region.", + L"Harriers", + L"The rebels harass nearby enemy groups, significantly increasing their travel time in the region.", + L"Fortifications", + L"Set up killzones and defensive positions. Friendly forces are more effective when fighting in this town. Autoresolve only.", }; // follows a specific format: @@ -11807,6 +11820,14 @@ STR16 szRebelCommandDirectivesText[] = // TODO.Translate L"Steal some income from mines not under your control. This directive becomes less useful as you claim mines.", L"Conduct smash-and-grab raids on hostile mines. While not always\nsuccessful, the raids that do succeed should provide a\nsmall income bump.", L"Improving this directive will increase the maximum value of stolen income.", + L"Create Turncoats", + L"Create %.0f turncoats in a random enemy group per day. Consumes %.1f Intel per day.", + L"Convince enemy soldiers to betray their army and work for you\nthrough a combination of bribery, threats, and blackmail.", + L"Improving this directive will increase the number of soldiers turned daily.", + L"Draft Civilians", + L"Gain %.0f volunteers each day. All towns lose some loyalty each day.", + L"Draft civilians as recruits for militia. The general population\nprobably won't be too happy about it, though. Effectiveness\nincreases as you capture more towns.", + L"Improving this directive will increase the number of volunteers gained per day.", }; #endif //ITALIAN diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index eec3f845..a6f5210e 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -11739,6 +11739,13 @@ STR16 szRebelCommandText[] = // TODO.Translate L"[A.R.C. WEBSITE AVAILABLE] With the delivery of food and basic supplies to Omerta, you have convinced the rebels that you're here to make an impact. You have been granted access to the command system they've been working on, which is now available through your laptop.", L"It is currently not safe to reactivate the administration team here. Recapture a town sector first.", L"Mine raid successful. Stole $%d.", + L"Insufficient Intel to create turncoats!", + L"Change Admin Action", + L"Cancel", + L"Confirm", + L"<", + L">", + L"Changing this Admin Action will cost $%d and reset its tier. Confirm expenditure?", }; STR16 szRebelCommandHelpText[] = // TODO.Translate @@ -11779,6 +11786,12 @@ STR16 szRebelCommandAdminActionsText[] = // TODO.Translate L"Set up facilities to directly support your mercs assigned in the town. Increases the effectiveness of merc assignments (doctoring, repairing, militia training, etc).", L"Mining Policy", L"Import better equipment and work with the town's miners to create more balanced and efficient shift schedules. Increases the town's mine income.", + L"Pathfinders", + L"The locals guide your teams through shortcuts in the area. Reduces on-foot travel time in the region.", + L"Harriers", + L"The rebels harass nearby enemy groups, significantly increasing their travel time in the region.", + L"Fortifications", + L"Set up killzones and defensive positions. Friendly forces are more effective when fighting in this town. Autoresolve only.", }; // follows a specific format: @@ -11820,6 +11833,14 @@ STR16 szRebelCommandDirectivesText[] = // TODO.Translate L"Steal some income from mines not under your control. This directive becomes less useful as you claim mines.", L"Conduct smash-and-grab raids on hostile mines. While not always\nsuccessful, the raids that do succeed should provide a\nsmall income bump.", L"Improving this directive will increase the maximum value of stolen income.", + L"Create Turncoats", + L"Create %.0f turncoats in a random enemy group per day. Consumes %.1f Intel per day.", + L"Convince enemy soldiers to betray their army and work for you\nthrough a combination of bribery, threats, and blackmail.", + L"Improving this directive will increase the number of soldiers turned daily.", + L"Draft Civilians", + L"Gain %.0f volunteers each day. All towns lose some loyalty each day.", + L"Draft civilians as recruits for militia. The general population\nprobably won't be too happy about it, though. Effectiveness\nincreases as you capture more towns.", + L"Improving this directive will increase the number of volunteers gained per day.", }; #endif //POLISH diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index 706ce0c7..acf2f03f 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -11733,6 +11733,13 @@ STR16 szRebelCommandText[] = // TODO.Translate L"[A.R.C. WEBSITE AVAILABLE] With the delivery of food and basic supplies to Omerta, you have convinced the rebels that you're here to make an impact. You have been granted access to the command system they've been working on, which is now available through your laptop.", L"It is currently not safe to reactivate the administration team here. Recapture a town sector first.", L"Mine raid successful. Stole $%d.", + L"Insufficient Intel to create turncoats!", + L"Change Admin Action", + L"Cancel", + L"Confirm", + L"<", + L">", + L"Changing this Admin Action will cost $%d and reset its tier. Confirm expenditure?", }; STR16 szRebelCommandHelpText[] = // TODO.Translate @@ -11773,6 +11780,12 @@ STR16 szRebelCommandAdminActionsText[] = // TODO.Translate L"Set up facilities to directly support your mercs assigned in the town. Increases the effectiveness of merc assignments (doctoring, repairing, militia training, etc).", L"Mining Policy", L"Import better equipment and work with the town's miners to create more balanced and efficient shift schedules. Increases the town's mine income.", + L"Pathfinders", + L"The locals guide your teams through shortcuts in the area. Reduces on-foot travel time in the region.", + L"Harriers", + L"The rebels harass nearby enemy groups, significantly increasing their travel time in the region.", + L"Fortifications", + L"Set up killzones and defensive positions. Friendly forces are more effective when fighting in this town. Autoresolve only.", }; // follows a specific format: @@ -11814,6 +11827,14 @@ STR16 szRebelCommandDirectivesText[] = // TODO.Translate L"Steal some income from mines not under your control. This directive becomes less useful as you claim mines.", L"Conduct smash-and-grab raids on hostile mines. While not always\nsuccessful, the raids that do succeed should provide a\nsmall income bump.", L"Improving this directive will increase the maximum value of stolen income.", + L"Create Turncoats", + L"Create %.0f turncoats in a random enemy group per day. Consumes %.1f Intel per day.", + L"Convince enemy soldiers to betray their army and work for you\nthrough a combination of bribery, threats, and blackmail.", + L"Improving this directive will increase the number of soldiers turned daily.", + L"Draft Civilians", + L"Gain %.0f volunteers each day. All towns lose some loyalty each day.", + L"Draft civilians as recruits for militia. The general population\nprobably won't be too happy about it, though. Effectiveness\nincreases as you capture more towns.", + L"Improving this directive will increase the number of volunteers gained per day.", }; #endif //RUSSIAN