{"version":3,"sources":["types/index.ts","images/empty.png","types/battle.ts","formatters.ts","types/settings.ts","types/armies.ts","types/cohorts.ts","types/countries.ts","types/modifiers.ts","types/tactics.ts","types/terrains.ts","types/transfer.ts","types/ui.ts","types/units.ts","types/utils.ts","images/unknown.png","utils.ts","types/definition.ts","data/armies.ts","data/battle.ts","images/archers.png","images/camel_cavalry.png","images/chariots.png","images/heavy_cavalry.png","images/heavy_infantry.png","images/horse_archers.png","images/light_cavalry.png","images/light_infantry.png","images/war_elephants.png","images/supply_train.png","images/martial.png","images/liburnian.png","images/trireme.png","images/tetrere.png","images/hexere.png","images/octere.png","images/mega_polyreme.png","images/artillery.png","images/cavalry.png","images/infantry.png","data/units.ts","data/countries.ts","data/modifiersIR.ts","data/modifiersEU4.ts","data/saves.ts","data/config.ts","data/settings.ts","images/bottleneck.png","images/cavalry_skirmish.png","images/deception.png","images/envelopment.png","images/hit_and_run.png","images/padma_vyuha.png","images/phalanx.png","images/shock_action.png","images/skirmishing.png","images/triplex_acies.png","images/frontal_assault.png","images/naval_envelopment.png","images/harassment.png","images/probing_attack.png","images/close_ranks.png","data/tactics.ts","images/terrain.png","data/terrains.ts","managers/countries.ts","managers/modifiers.ts","managers/units.ts","managers/army.ts","reducers/utils.ts","reducers/army.ts","types/generated.ts","combat/combat_utils.ts","combat/conversion.ts","combat/deployment.ts","combat/combat.ts","combat/analyze.ts","combat/stackwipe.ts","managers/battle.ts","reducers/battle.ts","selectors/utils.ts","selectors/terrains.ts","managers/terrains.ts","selectors/ui.ts","selectors/battle.ts","selectors/settings.ts","selectors/countries.ts","army_utils.ts","selectors/tactics.ts","managers/tactics.ts","selectors/armies.ts","selectors/units.ts","managers/combat.ts","reducers/combat.ts","reducers/countries.ts","reducers/settings.ts","managers/settings.ts","reducers/tactics.ts","reducers/terrains.ts","managers/transfer.ts","reducers/transfer.ts","data/transfer.ts","reducers/ui.ts","managers/ui.ts","reducers/units.ts","state/transforms.ts","state/utils.ts","state/index.ts","components/Utils/StyledNumber.tsx","components/Utils/Images.tsx","components/VersusList.tsx","components/Utils/LabelUnit.tsx","images/discipline.png","images/offense.png","images/defense.png","images/manpower.png","images/naval_combat.png","images/morale.png","images/attrition.png","images/fire.png","images/shock.png","images/combat_ability.png","images/cost.png","images/food.png","images/food_capacity.png","images/supply_limit.png","images/finesse.png","images/charisma.png","images/zeal.png","images/health.png","images/age.png","images/fertility.png","components/Utils/AttributeImage.tsx","components/UnitDefinitions.tsx","components/Dropdowns/SimpleDropdown.tsx","components/ValueDropdownModal.tsx","components/hooks.ts","containers/CountryManager.tsx","components/Utils/Headers.tsx","components/WearinessRange.tsx","containers/AccordionToggle.tsx","containers/TerrainDefinitions.tsx","containers/TacticDefinitions.tsx","pages/Definitions.tsx","components/Dropdowns/DropdownTable.tsx","components/Dropdowns/DropdownUnit.tsx","containers/PreferredUnitTypes.tsx","containers/TableStats.tsx","containers/CombatTooltip.tsx","components/TableArmyPart.tsx","containers/GridRowArmyPart.tsx","containers/TargetArrows.tsx","images/chance.png","components/Dropdowns/DropdownTerrain.tsx","containers/TerrainSelector.tsx","components/Tooltip.tsx","containers/WinRate.tsx","components/Detail/DelayedNumericInput.tsx","containers/UnitValueInput.tsx","components/Dropdowns/DropdownArchetype.tsx","containers/TableUnitTypes.tsx","components/Dropdowns/DropdownTactic.tsx","containers/TacticSelector.tsx","components/Utils/ListModifier.tsx","containers/CountryValueInput.tsx","containers/TableArmyInfo.tsx","containers/TableSideInfo.tsx","containers/TableDamageAttributes.tsx","containers/ParticipantSelector.tsx","pages/Battle.tsx","images/land_combat.png","pages/Navigation.tsx","components/Utils/PaddedRow.tsx","components/Utils/Inputs.tsx","components/TableAttributes.tsx","components/Dropdowns/DropdownListDefinition.tsx","components/TableModifierList.tsx","pages/CountriesIR.tsx","saves/importer.ts","pages/CountriesEU4.tsx","containers/Transfer.tsx","components/GridSettings.tsx","pages/Settings.tsx","pages/Error.tsx","components/SimpleRange.tsx","components/Charts/BaseChart.tsx","components/Charts/RoundChart.tsx","components/Charts/CumulativePercentChart.tsx","components/HelpTooltip.tsx","pages/Analyze.tsx","saves/manager.ts","saves/TableRowsSaveCountry.tsx","saves/TableRowsSaveArmy.tsx","saves/InputImportSave.tsx","saves/ImportSave.tsx","saves/ConvertSave.tsx","pages/SaveTool.tsx","saves/ExportPops.tsx","saves/TableRowCharacter.tsx","components/SimpleGrid.tsx","components/Dropdowns/SimpleMultiDropdown.tsx","components/Utils/Pagination.tsx","components/Utils/TableHeader.tsx","saves/FindCharacter.tsx","pages/ExportTool.tsx","containers/modal/BaseModal.tsx","containers/modal/ModalDiceRolls.tsx","components/ItemRemover.tsx","images/yes.png","images/no.png","components/Utils/Toggle.tsx","components/Detail/DetailToggleRow.tsx","components/Detail/DetailTextRow.tsx","components/Detail/DetailInputRow.tsx","components/Detail/DetailDropdownRow.tsx","components/UnitDetail.tsx","containers/modal/ModalCohortDetail.tsx","containers/modal/ModalUnitDetail.tsx","components/TerrainDetail.tsx","containers/modal/ModalTerrainDetail.tsx","components/TacticDetail.tsx","containers/modal/ModalTacticDetail.tsx","containers/modal/ModalValue.tsx","pages/Modals.tsx","Root.tsx","store.ts","index.tsx","data_values.ts"],"names":["CombatPhase","SideType","addSign","number","undefined","String","addSignWithZero","toManpower","settings","Math","floor","round","Setting","CohortSize","toMorale","strengthToValue","mode","Mode","Naval","toPercent","toMaintenance","toNumber","fixed","toFixed","toMultiplier","multipliers","mapRange","value","pow","toFlooredPercent","decimals","toSignedPercent","SimulationSpeed","DisciplineValue","CounteringMode","SupportDeployValue","parameterToDescription","parameter","BasePips","MaxPips","MaxGeneral","BaseCombatWidth","DiceMaximum","DiceMinimum","ExperienceDamageReduction","Precision","StackWipeCaptureChance","GlobalTargeting","FixExperience","StrengthLostMultiplier","MinimumStrength","DamageLossForMissingMorale","MoraleHitForNonSecondaryReinforcement","MoraleHitForLateDeployment","MoraleGainForWinning","MinimumMorale","MoraleLostMultiplier","DefenderAdvantage","RelativePips","BackRow","BackRowRetreat","RetreatRounds","StackwipeRounds","SoftStackWipeLimit","HardStackWipeLimit","Stackwipe","MoraleDamageBasedOnTargetStrength","CustomDeployment","DynamicFlanking","Tactics","AttackerSwapping","Martial","Tech","Culture","Food","StrengthBasedFlank","AttributeDiscipline","Damage","Both","OnlyPenalty","OnlyBonus","UseMaxMorale","FireAndShock","SupportPhase","Separately","Off","MaxCountering","CounteringDamage","DailyMoraleLoss","DailyDamageIncrease","PhaseLength","InsufficientSupportPenalty","FixFlankTargeting","DynamicTargeting","AttributeCombatAbility","AttributeDamage","AttributeLoyal","AttributeDrill","AttributeExperience","AttributeMilitaryTactics","AttributeMoraleDamage","AttributeOffenseDefense","AttributeStrengthDamage","AttributeTerrainType","MaxPhases","PhasesPerRoll","ChunkSize","Performance","ReduceRolls","CalculateWinChance","CalculateCasualties","CalculateResourceLosses","ShowGraphs","AutoRefresh","RequiredCrossingSupport","ArmyName","CharacterAttribute","ArmyPart","UnitPreferenceType","attributes","Charisma","Finesse","Zeal","isStatAttribute","attribute","includes","filterStatAttributes","filter","_","CountryName","CountryAttribute","CultureType","countryAttributeToEffect","MartialTech","OratoryTech","CivicTech","ReligiousTech","MilitaryExperience","SelectionType","ModifierType","GovermentType","TacticCalc","TacticType","TacticMatch","dictionaryTacticType","shock_action","ShockAction","envelopment","Envelopment","skirmishing","Skirmishing","deception","Deception","bottleneck","Bottleneck","greek_phalanx","Phalanx","triplex_acies","TriplexAcies","cavalry_skirmish","CavalrySkirmish","padma_vyuha","PadmaVyuha","hit_and_run_tactics","HitAndRun","frontal_assault","FrontalAssault","naval_envelopment","NavalEnvelopment","close_ranks","CloseRanks","harassment","Harassment","probing_attack","ProbingAttack","TerrainType","LocationType","TerrainCalc","terrainValueToString","data","type","calculateValue","ExportKey","ModalType","UnitType","UnitRole","UnitAttribute","formTerrainAttribute","terrain","getTerrainAttributes","terrains","flatten","map","Toughness","Pursuit","Screen","unitValueToString","definition","Maneuver","Cost","Strength","StrengthDepleted","Morale","MoraleDepleted","FoodConsumption","FoodStorage","Fire","Shock","Experience","Maintenance","AttritionWeight","dictionaryUnitType","archers","Archers","camels","CamelCavalry","chariots","Chariots","heavy_cavalry","HeavyCavalry","heavy_infantry","HeavyInfantry","horse_archers","HorseArchers","light_cavalry","LightCavalry","light_infantry","LightInfantry","warelephant","WarElephants","supply_train","SupplyTrain","liburnian","Liburnian","trireme","Trireme","tetrere","Tetrere","hexere","Hexere","octere","Octere","mega_galley","MegaPolyreme","formatAttribute","CombatWidth","OmenPower","filterAttributes","showStatistics","isAttributeEnabled","getAttributeValuesType","ValuesType","Modifier","Base","OffensiveSupport","DefensiveSupport","CaptureChance","CaptureResist","DailyLossResist","FireDamageDone","FireDamageTaken","ShockDamageDone","ShockDamageTaken","OffensiveFirePips","OffensiveMoralePips","OffensiveShockPips","DefensiveFirePips","DefensiveMoralePips","DefensiveShockPips","CombatAbility","DamageDone","DamageTaken","MilitaryTactics","MoraleDamageDone","MoraleDamageTaken","Offense","Defense","StrengthDamageDone","StrengthDamageTaken","Drill","FlankRatio","Default","Discipline","getImage","image","UnknownIcon","EmptyIcon","arrayify","item","Array","isArray","length","func","array","max","i","noZero","randomWithinRange","min","random","sumArr","arr","converter","reduce","previous","current","Number","showProgress","text","updates","dots","repeat","precision","multiplyChance","chance1","chance2","keys","object","Object","entries","values","callback","assign","k","v","forEach","excludeMissing","filterKeys","toArr","toObj","key","toSet","removeUndefined","resize","size","defaultValue","ret","slice","push","getDefaultTactic","Land","getDefaultUnitPreferences","Primary","Secondary","Flank","getDefaultArmy","reserve","unitPreferences","flankSize","general","enabled","selections","definitions","tactic","initializeDefaultArmy","getDefaultArmies","Army","Navy","getInitialTerrains","Ocean","None","Farmland","NoModifier","getDefaultSide","name","participants","getDefaultParticipant","days","rolls","dice","randomizeDice","countryName","armyName","daysUntilBattle","getDefaultMode","sides","A","Country1","B","Country2","fightOver","seed","customSeed","outdated","timestamp","getDefaultBattle","unitToIcon","IconArcher","IconCamelCavalry","IconChariots","IconHeavyCavalry","IconHeavyInfantry","IconHorseArchers","IconLightCavalry","IconLightInfantry","IconWarElephants","IconSupplyTrain","IconLiburnian","IconTrireme","IconTetrere","IconHexere","IconOctere","IconMegaPolyreme","IconMilitaryPower","Cavalry","IconCavalry","Infantry","IconInfantry","Artillery","IconArtillery","LightShip","MediumShip","HeavyShip","Latest","IconEmpty","getUnitIcon","createUnitFromJson","record","handleAttributes","unit","Type","Parent","role","Role","parent","culture","tech","baseValues","addValues","modifierValues","defaultUnits","parentsIR","concat","unitsIR","cultures","uniq","sort","getCultures","getDefaultUnits","getDefaultCountry","modifiers","Policy","expense_army_default","government","Republic","armies","units","weariness","getDefaultCountryDefinitions","buildData","byIndex","from","byIndexFiltered","relevant","byKey","byKeyFiltered","byParent","groupBy","byParentFiltered","siblings","getOne","get","siblingKeys","getName","items","getModifiers","flat","abilitiesIR","abilityData","policiesIR","policyData","lawsIR","lawData","traditionsIR","traditionData","distinctionsIR","distinctionData","ideasIR","ideaData","traitsIR","traitData","inventionsIR","inventionData","heritagesIR","heritageData","tradesIR","tradeData","deitiesIR","deityData","factionsIR","factionData","religionsIR","religionData","effectsIR","effectData","countriesIR","countryData","territoriesIR","territoryData","culturesIR","cultureData","regionsIR","regionData","techEU4","policiesEU4","laws","getConfig","configIR","getDefaultSettings","modeSettings","getDefaultLandSettings","getDefaultNavalSettings","sharedSettings","getDefaultSharedSettings","StrengthDamage","MoraleDamage","speedValues","Fast","VeryAccurate","Accurate","Normal","VeryFast","tacticToIcon","IconBottleneck","IconCavalrySkirmish","IconDeception","IconEnvelopment","IconHitAndRun","IconPadmaVyuha","IconPhalanx","IconShockAction","IconSkirmishing","IconTriplexAcies","IconFrontalAssault","IconNavalEnvelopment","IconHarassment","IconProbingAttack","IconCloseRanks","getTacticIcon","createTacticFromJson","camel_cavalry","war_elephants","mega_polyreme","Casualties","casualties","hit_and_run","phalanx","defaultTactics","getDefaultTacticState","createTerrainFromJson","IconTerrain","location","Roll","roll","combat_width","defaultTerrains","dataIR","initializeDefaultTerrains","getDefaultTerrainState","setCountryAttribute","country","addValuesWithMutate","enableCountrySelection","enableCountrySelections","clearCountrySelection","applyCountryModifiers","target","Country","addValue","convertCountryData","getCountryModifiers","convertCountryDefinition","calculated","createArmy","source","deleteArmy","filterArmies","army","getDynamicEffect","effect","modifier","getEffect","mapModifiers","getCountryAttribute","getPrimaryCountryModifiers","Invention","getTechModifiers","getOfficeModifiers","Heritage","Trade","Idea","Law","Religion","Faction","Effect","Tradition","primaryModifiers","secondaryModifiers","getSecondaryCountryModifiers","omenPower","effects","isOmen","getDeityModifiers","Deity","getGeneralModifiers","Trait","Ability","Distinction","martial","getRootParent","applyDynamicAttributes","drill","maneuver","getStrengthBasedFlank","Loss","isLoyal","LoyalMaintenance","strength","ceil","applyUnitModifiers","mapped","Text","Global","mapModifiersToUnits2","result","generateLosses","range","getCohortId","side","cohort","participantIndex","index","getCohortName","convertUnitsData","countryModifiers","generalModifiers","convertGeneralDefinition","tactics","base","filterValues","extraValues","totalValues","getAllUnitList","parents","getParents","sortBy","unitSorter","getLatestUnits","sorted","filterByTech","techSorter","find","calculateBase","getArchetypes","getActualUnits","getRootUnit","addToReserve","cohorts","selectTactic","setUnitPreference","preferenceType","setFlankSize","flankFize","setGeneralAttribute","setHasGeneral","hasGeneral","enableGeneralSelection","enableGeneralSelections","clearGeneralSelection","applyGeneralModifiers","General","typeCounter","getActionType","makeActionRemoveFirst","actionToFunction","payload","makeActionReplaceFirst","args","makeActionReplaceFirstTwice","key1","key2","getDefaultEntity","draft","action","getEntityPayload","getDefaultContainer","makeReducer","initial","getEntity","getPayload","state","params","produce","makeEntityReducer","makeContainerReducer","getContainer","compose","reducers","reducer","prev","curr","mapping","manager","clearGeneralSelections","toggleCohortLoyality","setCohortValue","valuesType","changeCohortType","deleteCohort","splice","removeFromReserve","types","findLastIndex","clearCohorts","clearGeneralAttributes","clearAllValuesWithMutate","armyReducer","calculateCohortPips","targetSupport","phase","getOffensiveCohortPips","getDefensiveCohortPips","getDefensiveSupportCohortPips","calculateExperienceReduction","damageReductionPerExperience","getCombatPhase","getCombatPhaseNumber","calculateTotalStrength","includeDefeated","iterateCohorts","iterateFrontline","frontline","front","flank","support","defeated","j","length2","isDefeated","removeDefeated","nextIndex","center","reserveSize","defeatCohort","environment","defeatedDay","day","isDestroyed","wipeCohort","enemy","captureChance","stackWipedBy","properties","uncaptureCohort","isAlive","getCombatUnit","unitTypes","damageDealt","flankRatioPenalty","flanking","moraleLoss","strengthLoss","moraleDealt","strengthDealt","damageMultiplier","targetedBy","defeatedBy","totalMoraleDealt","totalStrengthDealt","damageReduction","precalculateDamageReduction","deploymentPenalty","reinforcementPenalty","winningMoraleBonus","maxMorale","calculateValueWithoutLoss","maxStrength","experienceReduction","deploymentCost","damage","getDamages","damageTakenMultiplier","moraleTakenMultiplier","getValue","strengthTakenMultiplier","applyPhaseDamageTaken","calc","getProperties","applyDamageTypes","moraleDone","strengthDone","applyPhaseDamageDone","applyUnitTypes","applyPhaseDamage","precalculateDamage","getMultiplier","applyTerrain","LoyalDamage","sumBy","getBase","calculateModifier","getModifier","deployFront","row","preferences","pop","applyReinforcementPenalty","deployFlanks","applyLateDeploymentPenaltySub","percent","deployCohorts","leftFlank","rightFlank","backline","flankStartingIndex","deploySupport","some","maxSupportBackline","limit","count","deployBoth","sortReserve","frontReserve","isFrontUnit","flankReserve","isFlankUnit","supportReserve","isSupportUnit","Front","Support","calculatePreferredFlankSize","customValue","armyFlankCount","removeDefeatedFromNewArmies","part","remove","countCohorts","countReserve","sum","undeploy","deployed","applyWinningMoraleBonus","resortReserve","applyWinningMoraleBonusSub","bonus","moveDefeatedToRetreated","retreated","canDeploy","arrival","getDeployingArmies","deploySub","deploying","enemyArmySize","pool","combatWidth","preferredFlankSize","free_space","leftSideFreeSpace","rightSideFreeSpace","leftSideMaxSpace","rightSideMaxSpace","clamp","calculateFlankSizes","applyLateDeploymentPenalty","a","b","priority","getLeadingArmy","reinforce","field","rowIndex","nextRow","unitIndex","unitOnLeft","unitOnRight","moveUnits","doCombatRound","env","sideA","sideB","markDefeated","attacker","d","results","getDefaultCombatResults","armiesA","armiesB","sizeA","sizeB","deploy","clearState","pickTargets","dailyMultiplier","getDailyIncrease","generalA","generalD","tacticStrengthDamageMultiplier","calculateArmyPips","actualBonusPips","totalBonusPips","attack","applyLosses","moveDefeated","noCombat","checkStackWipe","armiesRemaining","getBackTarget","sourceLength","targetLength","primaryTarget","secondaryTarget","isWeak","direction","targetIndex","calculateTactic","counterTactic","versusDamage","averageEffectiveness","totalStrength","totalEffectiveness","TacticMin","TacticMax","TacticBase","getTacticMatch","effectiveness","Positive","Negative","Neutral","calculateFlankRatios","infantry","cohortsAlive","crossingSupport","armySize","armyS","armyT","generalPips","martialPip","phasePip","calculateGeneralPips","terrainPips","isAttacker","crossingSupported","enableTiles","enableBorders","activeTerrains","Border","getTerrainPips","tacticBonus","setting","ratios","flankRatio","calculateFlankRatioPenalty","multiplier","attackSub","dynamicMultiplier","strengthMultiplier","calculateDamageMultiplier","calculateMoraleLosses","calculateStrengthLosses","isSupport","definitionS","definitionT","calculateCohortDamageMultiplier","calculateTotalPips","maxPips","pips","morale","getParticipantIndexToProperties","unitProperties","interruptSimulation","interrupt","createCombatNode","branchIndex","combatPhase","weightIndex","cohortsA","copyCohortState","deployedA","copyArmiesState","cohortsB","deployedB","updateFromCombatNode","node","calculateWinRate","progressCallback","progress","calculating","defender","incomplete","draws","battles","averageDays","stackWipes","lossesA","repairMaintenance","destroyedCost","capturedCost","seizedCost","seizedRepairMaintenance","lossesB","resourceLosses","unitPropertiesA","unitPropertiesB","getRolls","dice2","phasesPerRoll","chunkSize","maxPhase","weights","totalA","currentA","sumState","totalB","currentB","avgMoraleA","avgMoraleB","avgStrengthA","avgStrengthB","maxMoraleA","maxMoraleB","maxStrengthA","maxStrengthB","moraleA","moraleB","strengthA","strengthB","winRateA","winRateB","nodes","work","rollA","rollB","winner","doPhase","doBranch","updateCasualties","calculateResourceLoss","updateProgress","worker","setTimeout","minimum","maximum","halveTimes","validRolls","getValidRolls","roll2","copyReserveState","calculateCaptureLoss","weight","own","enemyDefinitions","enemyIndex","Error","cohortCost","capture","repair","ShipRepair","enemyProperties","enemyUnitCost","enemyRepairCost","phaseLength","skipUntilNextCombatDay","getWinner","sumReserve","sumCohorts","stackWipe","amount","lossA","lossB","noDeploy","soft","total","totalEnemy","wipe","wasDefeatedDuringCurrentBattle","enemyArmy","returnCapturedCohorts","getRow","width","fill","getParticipantName","participant","getDay","battle","getStartingPhaseNumber","startingPhaseNumber","getRound","getAttacker","selectParticipantCountry","sideType","selectParticipantArmy","addParticipant","deleteParticipant","selectTerrain","setDice","setDaysUntilBattle","setPhaseDice","toggleRandomDice","setSeed","battleReducer","useSelector","createSelectorHook","getKey","getArmyKey","getTerrainsData","getProp","prop","getTerrainsDict","createCachedSelector","filterTerrain","filterTerrains","getTerrainsArray","getTerrainTypes","getMode","ui","getSelectedArmyIndex","selectedArmyIndex","getSelectedCountryIndex","selectedCountryIndex","getSelectedCountry","getCountries","getSelectedArmy","getArmies","useMode","getBattle","getTimestamp","getSide","getParticipants","getOutdated","getCombatSide","getCohorts","getSelectedTerrains","createSelector","selected","useBattle","useSide","useRound","useCohorts","getSharedSettings","getCombatWidth","attackers","getCountry","defenders","getCombatSettings","shared","useCombatSettings","countries","getCountryData","getCountryNames","getWeariness","getArmyNames","getCountryDefinition","useCulture","getCulture","convertCohortDefinition","mergeValues","shrinkUnits","shrinkValues","convertUnitDefinitions","convertUnitDefinition","merged","filterUnitDefinitions","getArmyPart","Frontline","Reserve","Defeated","getOpponent","getTacticsData","getTactics","opponent","filterTactic","filterTactics","opposingTactic","match","convertTactic","useTactics","getArmyData","getGeneral","getGeneralData","getGeneralDefinition","getParticipant","battleManager","useGeneral","useArmyData","getSubDefinitions","getUnitDefinitions","generalData","subDefinitions","copyReserve","copyArmies","freeseSize","freeze","copy","subBattle","steps","sideD","phaseNumber","Date","getMilliseconds","minimumRoll","maximumRoll","rollFrequency","abs","createEntropy","engine","MersenneTwister19937","discard","rng","Random","rollDice","integer","step","refreshBattle","pair","convertSides","getCombatEnvironment","undo","combatReducer","_2","_3","countriesMapping","createCountry","importCountry","deleteCountry","changeCountryName","oldCountry","countryMapping","clearCountrySelections","selectCulture","loadAllUnits","selectGovernment","clearCountryAttributes","changeWeariness","changeArmyName","oldArmyName","countriesReducer","changeCombatParameter","changeSiteParameter","settingsReducer","tacticsMapping","createTactic","setTacticType","oldType","deleteTactic","tacticMapping","setTacticValue","setTacticImage","setTacticMode","tacticsReducer","terrainsMapping","createTerrain","setTerrainType","deleteTerrain","terrainMapping","setTerrainImage","setTerrainLocation","setTerrainValue","terrainsReducer","exportState","exportKeys","JSON","stringify","filtered","_persist","transfer","stripRounds","Countries","Terrains","Settings","filterState","pad","padStart","saveToFile","blob","Blob","date","formatted","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","saveAs","combine","resetMissingState","resetMissing","transferMapping","setExportKey","setResetMissing","transferReducer","importMapping","importState","imported","resetState","resetAll","importReducer","initialState","modals","accordions","selectedParticipantIndex","filterNonCombat","closeModal","toggleAccordion","has","selectParticipant","openModal","selectCountry","countryIndex","selectArmy","armyIndex","setMode","toggleFilterNonCombat","uiReducer","unitsMapping","createUnit","deleteUnit","changeUnitType","unitMapping","setUnitValue","changeUnitImage","changeUnitDeployment","deployment","toggleUnitLoyality","changeParent","unitsReducer","restoreDefaultTactics","clearAllValues","restoreDefaultTerrains","restoreDefaultUnits","restoreDefaultSettings","defaultSettings","useTechLevel","getCohort","column","getCohortForEachRound","mergeUnitTypes","add","Set","getArmy","getArmyDefinition","unitDefinitions","getReserve","armyA","armyD","convertSidesSub","armyDefinitions","enemyTypes","CrossingSupport","convertArmy","reverse","convertSide","getUnitPreferences","getFlankSize","getOverridenReserveDefinitions","originals","latest","override","convertReserveDefinitions","useParticipant","getUnitDefinitionsSub","useUnitDefinitions","props","selectors","useUnitDefinition","unitType","getUnitTypeList","filterParent","getUnitList","filterParents","list","getUnitDefinition","getUnitImages","combined","reducerKeys","nextState","invalidated","combineRoot","rootReducer","StyledNumber","hideZero","formatter","positiveColor","negativeColor","neutralColor","className","str","Images","this","Image","src","avatar","Component","VersusList","images","styled","List","horizontal","Item","style","marginLeft","LabelItem","getText","getExplanation","AttributeImage","getContent","explanation","sub","margin","first","IconMorale","IconStrength","IconManpower","IconDiscipline","IconOffense","IconDefense","IconAttrition","IconCombatAbility","IconFire","IconShock","IconCost","IconFoodConsumption","IconFoodStorage","IconSupplyLimit","IconMartial","IconFinesse","IconCharisma","IconZeal","Age","IconAge","Health","IconHealth","Fertility","IconFertility","getFirstImage","second","getSecondImage","Popup","trigger","content","basic","wide","mouseEnterDelay","UnitDefinitions","filterByMode","isDamageTaken","renderRow","onRowClick","Table","Row","onClick","Cell","singleLine","celled","selectable","unstackable","Header","HeaderCell","Icon","Body","SimpleDropdown","clearable","onChange","onAdd","search","placeholder","minWidth","maxWidth","handleAddItem","useCallback","handleChange","options","useMemo","Dropdown","disabled","onAddItem","compact","selection","allowAdditions","ValueDropdownModal","onSuccess","onClose","open","message","valueLabel","dropdownLabel","buttonMessage","Modal","Content","paddingLeft","Grid","columns","Column","setState","Button","useOptionalState","useState","useBooleanState","setValue","RenderCountryRow","children","toggleOpen","countryNames","dispatch","useDispatch","handleSelect","handleChangeName","handleCreate","handleDelete","handleEdit","Value","useCountryEditors","primary","React","Children","elem","RenderArmyRow","armyNames","useArmyNames","sourceArmy","useArmyEditors","CountryManager","Headers","renderHeader","NEUTRAL","ACTIVE","BACK","WearinessRange","headers","renderCell","textAlign","renderRange","renderTrack","onMouseDown","onTouchStart","height","display","paddingRight","ref","borderRadius","background","getTrackBackground","colors","alignSelf","renderThumb","isDragged","backgroundColor","justifyContent","alignItems","boxShadow","AccordionToggle","active","title","identifier","Accordion","Title","actions","connect","TerrainDefinitions","renderAttributes","TerrainDetail","TacticDefinitions","renderVersus","versus","marginRight","TacticDetail","Definitions","modalCountry","openCreateUnit","UnitDetail","header","isPositive","isNegative","isActive","onSelect","searchQuery","positive","negative","cell","DropdownTable","setOpen","setSearchQuery","absolute","classNames","handleSearch","handleOpen","handleClose","useEffect","onSearchChange","onOpen","onBlur","scrolling","join","Menu","DropdownUnit","PreferredUnitTypes","ConnectedRow","empty","modalType","renderFlankSize","collapsing","TableStats","renderArmy","rows","renderCells","storageFormatter","defaultFormatter","storage","consumption","getAttribute","prevProps","cohortsD","CombatTooltip","BLUE","ORANGE","RED","getInfoSection","getBaseDamageSection","getDamageMultiplierSection","getStrengthSection","getMoraleSection","toAdd","phaseRoll","moraleRoll","getBaseDamageSubSection","basePips","sourcePips","targetPips","targetSupportPips","totalPips","enemyReduction","cappedPips","reductionToCap","renderModifier","toLowerCase","renderItem","terrainTypes","offenseVsDefense","targetType","damageLossForMissingMorale","renderStyledItem","strengthLostMultiplier","strengthDamage","moraleLostMultiplier","moraleStr","moraleDamage","moraleCurrent","moraleMax","strengthCurrent","label","context","inverted","convertUnit","convertTarget","WHITE_COLOR","TableArmyPart","renderCount","color","fontWeight","padding","onDeleteCohort","filler","onMouseOver","e","tooltipRow","tooltipColumn","tooltipContext","currentTarget","tooltipIsSupport","onMouseLeave","onContextMenu","preventDefault","getIcon","Retreated","prevState","rowWidth","fullRows","indexOffset","chunk","leftFiller","rightFiller","fitted","columnIndex","renderImage","gradient","IconDefeated","PureComponent","convertCohorts","GridRowArmyPart","hideIfEmpty","handleDeleteCohort","rawCohorts","useData","armyPart","convertUnits","TargetArrows","visible","attackerColor","defenderColor","id","RenderAttacker","fromStr","toStr","MemoizedRenderArrow","to","fromAnchor","toAnchor","borderColor","RenderDefender","RenderArrow","delay","zIndex","memo","MemoizedTargetArrows","DropdownTerrain","RenderTerrain","IconDice","TerrainSelector","Tooltip","position","ATTACKER_COLOR","DEFENDER_COLOR","WinRate","toTooltipPercent","toSignedTooltipPercent","toTooltipNumber","willUnmount","getInfoTooltip","getWinChanceTooltip","scale","getCasualtiesTooltip","update","calculate","avgStrengthD","maxStrengthD","verticalAlign","fontSize","convertValue","DelayedNumericInput","currentValue","setCurrentValue","timer","useRef","clearTimer","clearTimeout","newValue","replace","isNaN","handleBlur","onKeyPress","event","onFocus","select","UnitValueInput","DropdownArchetype","getAttributes","RootUnitRow","handleRowCLick","onSelectCulture","isCulture","RoleRow","archetypes","techLevel","archetype","preference","latestType","getChildUnits","UnitRow","CohortCount","useWeariness","updateReserve","LossModifier","TableUnitTypes","checkPreference","techRequirement","unitList","DropdownTactic","TacticSelector","ListModifier","showZero","sign","noPercent","float","CountryValueEffect","CountryValueInput","showEffect","ArmyInfo","useArmies","artillery","handleSelectCountry","getDefaultArmyName","TableGeneralAttribute","TableArmyInfo","last","icon","RenderSide","useLeadingArmy","RenderRoll","combat","useCombatSide","isDiceSet","DiceRolls","TableSideInfo","GeneralAttribute","TableDamageAttributes","ParticipantSelector","useParticipants","getSelectedParticipantIndex","useSelectedParticipantIndex","useRefresher","autoRefresh","useOpenCohortModal","CohortDetail","RenderFrontline","handleOpenCohortModal","battleState","isUndoAvailable","handleUndo","rounds","handleBattle","floated","dayStr","getRoundName","Checkbox","checked","circular","BattleSetup","participantA","participantB","Stats","RenderReserve","RenderDefeated","RenderRetreated","ReserveAndDefeated","Controls","Battle","Navigation","history","useHistory","path","pathname","currentMode","renderModeButton","IconLand","IconNaval","PaddedRow","cells","stretch","child","Input","FileInput","files","InputDelayed","TableAttributes","CELLS","customValueKey","baseValue","explainShort","DropdownListDefinition","getHeaders","TableModifierList","usePercentPadding","entity","PERCENT_PADDING","colSpan","DataType","ControlType","CELL_PADDING","RenderCell","entryKey","DataEntriesByParent","maxBy","DataEntryDropdown","CountriesIR","renderDropdown","renderLaws","renderByParentForCountries","renderIdeas","renderPolicies","renderByParent","onCountryItemClick","option","renderCell2","execArmy","execCountry","enable","clear","noop","rest","selectedArmy","clearAll","setCountryValue","setGeneralValue","generalDefinition","countryDefinition","Container","padded","getTechAttribute","useCountrySelection","useGeneralSelection","RenderInventions","handleOnClick","RenderTechSection","panes","menuItem","render","localeCompare","Tab","RenderTraitGroup","RenderGeneralSection","toggle","getTopTraditionTree","traditions","counts","countArray","RenderTraditionSection","selectedTradition","selectTradition","RenderAbilities","handleClick","RenderDistinctions","RenderTrades","RenderHeritages","RenderFactions","RenderReligions","RenderTradeSection","RenderDeityGroup","deities","power","RenderDeities","RenderReligionSection","bulleted","selectedCountry","CUSTOM_KEY","CountriesEU4","renderTech","level","clearTech","enableTech","Transfer","lastData","renderCheckbox","loadContent","file","then","json","TextArea","doResetMissing","parse","err","console","error","GridSettings","renderSetting","onInputChange","whiteSpace","mechanics","stackwipe","combatSettings","siteSettings","onChangeSiteParameter","onChangeCombatParameter","getSection","renderModeSettings","reset","hasError","download","Segment","SimpleRange","BaseChart","getTooltip","onActivated","containerComponent","labels","datum","theme","VictoryTheme","material","domainPadding","top","left","bottom","right","CUMULATIVE","VALUES","RoundChart","cumulative","x","y","datums","getLabel","childName","roundTicks","tickValues","dependentAxis","tickFormat","interpolation","CumulativePercentChart","isPercent","isCumulative","capitalize","maxA","maxB","dataA","dataB","ticks","HelpTooltip","formula","simulationSpeeds","Analyze","changeAnalyzeParameter","Custom","renderWinChance","attackerWinChance","defenderWinChance","averageRounds","renderCasualties","renderResourceLosses","lossesD","resource","renderGraphs","resources","indexOf","getCharacterBaseAttribute","character","finesse","charisma","zeal","getTraitEffect","traits","maintenanceToKey","getCountryName","tag","loadCountry","deity_manager","deities_database","country_database","availableLaws","primary_culture","inventions","active_inventions","heritage","militaryExperience","currency_data","military_experience","civicTech","technology","civic_tech","martialTech","military_tech","oratoryTech","oratory_tech","religiousTech","religious_tech","armyMaintenance","economic_policies","navalMaintenance","military_bonuses","surplus","ideas","idea","pantheon","deity","omen","religiousUnity","religious_unity","religion","faction","ruler_term","party","isPlayer","played_country","player","game_configuration","difficulty","government_key","endsWith","Monarch","Tribe","pops","population","capital","provinces","countSurplus","countPops","ids","category","province","goods","territory","slaves","trade_goods","baseAmount","province_rank","slavesForSurplus","buildings","trade","route","from_state","to_state","getPregnancyString","dates","birthDate","father","getLevyablePOps","territories","integratedCultures","country_culture_manager","country_culture_database","integration_status","getIntegratedCultures","regions","regionTerritories","owner","popsPerTerritory","region","governor","save","countryId","jobs","province_job","job","governorship","who","getGovernor","levyablePops","countBy","objects","sumObjects","secondary","getLevyName","substring","split","upperFirst","getCharacterName","familyName","surname","family_name","first_name_loc","getCharacterIdentity","character_database","family","families","loadCharacter","getCharacterAttribute","age","fertility","health","death_date","baseAttributes","alive","monthlyHealth","gender","female","pregnant","unborn","loadArmy","units_database","getArmyName","unit_name","ship","subunit_database","experience","loadCohort","flank_size","leader","is_army","ability","unit_ability","which","startsWith","ordinal","armySorter","loadArmies","saveCountry","levies","levyMultiplier","template","grouped","rawUnits","remaining","LevyMinimumSize","defaultTemplate","LevySupportLimit","counter","getLevies","LevyMaxMultiplier","LevySize","countTech","invention","getTagName","getCategoryName","rawCulture","loadCountryList","TableRowsSaveCountry","Civic","Oratory","Religious","toPrecision","substr","TableRowsSaveArmy","Uint8Array","errors","parseToken","token","parseValue","tokens","parseObject","resultArray","Separator","parseFile","loadFile","JSZip","loadAsync","zipped","extracted","async","buffer","binaryToPlain","formatTokens","SectionStart","SectionEnd","Integer","Float","Boolean","UnsignedInteger","BigFloat","BigInteger","parseInt","stringTokens","getErrors","parseBinaryText","getBinaryToken","code","toString","toUpperCase","isKeyValuePair","getBinaryUnsigned","getHex","hexToUnsigned","getBinaryBigSigned","hexToSigned","parseBinaryValue","getBinarySigned","string","fromCharCode","getBinaryString","DataView","ArrayBuffer","setUint32","getFloat32","getBinaryFloat","BigUnsignedInteger","getBinaryBigUnsigned","isDate","parentKey","inArray","decodateDate","input","months","year","month","hex","highbyte","bn","BigInt","loadSave","InputImportSave","onImported","loading","setLoading","handleFile","Dimmer","page","Loader","convertCountry","armyData","experiences","maxStrengths","maxMorales","lossValues","ImportSave","setCountry","setArmies","setSave","firstPlayer","ConvertSave","setErrors","SaveTool","defaultActiveIndex","exportPops","controller","province_name","totalPops","rank","loadPopsByTerritory","categories","getTerritoryName","now","ExportPops","RenderAttribute","renderer","TableRowCharacter","monthly","healthString","SimpleGridRow","SimpleMultiDropdown","multiple","fluid","paginations","Pagination","setPage","pagination","setPagination","paginated","shownItems","activePage","totalPages","onPageChange","TableHeader","exportCharacter","InputRange","setMin","setMax","MAX_SAFE_INTEGER","emptyArray","Filters","filters","setCountries","countryList","setSearch","setTraits","male","setMale","setFemale","setAlive","setPregnant","createFilterSorter","filterer","every","trait","isId","isInteger","sorter","traitsA","traitDifference","attributesA","attributesDifference","SimpleGrid","traitOptions","TableCharacters","Characters","exportCharacters","FindCharacter","characters","loadCharacters","filterSorter","setFilterSorter","handleSetFilterSorter","ExportTool","BaseModal","centered","RenderIsRollRandom","RenderSeed","RenderPhase","RenderCustomRolls","ModalDiceRolls","ItemRemover","onRemove","Toggle","IconYes","IconNo","DetailToggleRow","DetailTextRow","DetailInputRow","DetailDropdownRow","modes","deployments","allowLoss","allowModifier","allowBase","onCustomBaseValueChange","onCustomModifierValueChange","onCustomLossValueChange","onCustomLossModifierValueChange","modifierValue","lossValue","explain","onTypeChange","onParentChange","onImageChange","onChangeDeployment","onIsLoyalToggle","unitTypesWithParent","unitTypesAsDropdown","ModalCohortDetail","removeUnit","setBaseValue","setModifierValue","setLossModifierValue","changeType","toggleIsLoyal","convertCohort","dealtValues","Gain","getCohortDefinition","ModalUnitDetail","changeImage","changeDeployment","locations","onCustomValueChange","onLocationChange","ModalTerrainDetail","delete","setType","newType","setLocation","setImage","relative","onModeChange","ModalTacticDetail","ModalValue","Modals","Root","store","persistor","component","exact","TacticsTransform","createTransform","inboundState","outboundState","whitelist","TerrainsTransform","BattleTransform","CountriesTransform","SettingsTransform","migrations","11","persistConfig","version","migrate","createMigrate","debug","transforms","persistedReducer","persistReducer","initialize","createStore","devToolsEnhancer","persistStore","configureStore","ReactDOM","document","getElementById","toMerge","merge","gainValues","lossModifierValues","calculateLossModifier","calculateLoss","subAddValues","container","newValues","subClearValues","attributeKey","PRECISION","subFilterValues","filterKey","calculateGain","calculateValueSub","valueBase","valueModifier","valueGain","valueLoss","valueLossModifier","loss","gain"],"mappings":"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","file":"static/js/main.8418219d.chunk.js","sourcesContent":["export * from './analyze'\nexport * from './armies'\nexport * from './battle'\nexport * from './cohorts'\nexport * from './countries'\nexport * from './definition'\nexport * from './modifiers'\nexport * from './settings'\nexport * from './tactics'\nexport * from './terrains'\nexport * from './transfer'\nexport * from './ui'\nexport * from './units'\nexport * from './utils'\n","export default __webpack_public_path__ + \"static/media/empty.2c1b04aa.png\";","import { CountryName, Mode, TerrainType, TerrainData, CombatSettings, Cohorts } from 'types'\nimport { ArmyName, Army } from './armies'\n\nexport type Battle = {\n terrains: TerrainType[]\n sides: { [key in SideType]: SideData }\n days: {\n round: number\n startingPhaseNumber: number\n attacker: SideType\n }[]\n fightOver: boolean\n seed: number\n customSeed?: number\n outdated: boolean\n timestamp: number\n}\n\nexport enum CombatPhase {\n Fire = 'Fire',\n Shock = 'Shock',\n Default = 'Default'\n}\n\nexport type SideData = {\n type: SideType\n participants: Participant[]\n days: Side[]\n rolls: number[]\n dice: number\n randomizeDice: boolean\n}\n\nexport type ModeState = { [key in Mode]: Battle }\n\nexport type Participant = {\n countryName: CountryName\n armyName: ArmyName\n daysUntilBattle: number\n}\n\nexport enum SideType {\n A = 'Attacker',\n B = 'Defender'\n}\n\n/** Information affecting both sides of combat. */\nexport type Environment = {\n round: number\n mode: Mode\n day: number\n terrains: TerrainData[]\n settings: CombatSettings\n attacker: SideType\n}\n\nexport type FlankRatioPenalty = { [key: number]: number }\n\n/** Results from combat (mainly for tooltips). */\nexport type SideRoundInfo = {\n round: number\n tacticBonus: number\n dailyMultiplier: number\n tacticStrengthDamageMultiplier: number\n terrainPips: number\n generalPips: number\n totalBonusPips: number\n actualBonusPips: number\n dice: number\n}\n\nexport type Side = {\n results: SideRoundInfo\n armiesRemaining: boolean\n isDefeated: boolean\n armies: Army[]\n deployed: Army[]\n cohorts: Cohorts\n type: SideType\n}\n","import { mapRange } from './utils'\nimport { Mode } from './types/definition'\nimport { Setting, CombatSharedSettings } from 'types'\n\n/**\n * This file contains functions to format numbers to strings.\n */\n\nexport const hideZero = (number: number) => (number === 0 ? undefined : number)\n\nexport const addSign = (number?: number): string => {\n if (number === undefined) return ''\n if (number > 0) return '+' + String(number)\n return String(number)\n}\n\nexport const addSignWithZero = (number?: number): string => {\n if (number === undefined) return ''\n if (number >= 0) return '+' + String(number)\n return String(number)\n}\n\n/**\n * Special converter for manpower. Strength multiplied by cohort size and floored down.\n */\nexport const toManpower = (settings: CombatSharedSettings, number?: number): string => {\n if (number === undefined) return ''\n // Higher precision round removes floating point errors.\n return String(Math.floor(0.1 * Math.round(10 * settings[Setting.CohortSize] * number)))\n}\n\nexport const toMorale = (number?: number): string => {\n if (number === undefined) return ''\n // Higher precision round removes floating point errors.\n return String(Math.floor(0.01 * Math.round(10000 * number)) / 100)\n}\n\nexport const strengthToValue = (settings: CombatSharedSettings, mode: Mode, number: number) => {\n if (mode === Mode.Naval) return toPercent(number)\n return toManpower(settings, number)\n}\n\nexport const toMaintenance = (number?: number): string => {\n if (number === undefined) return ''\n return String(Math.floor(100 * number) / 100.0)\n}\n\nexport const toNumber = (number?: number, fixed = 2): string => {\n if (number === undefined) return ''\n return String(+number.toFixed(fixed))\n}\n\nexport const toMultiplier = (number?: number, fixed = 2): string => {\n if (number === undefined) return ''\n return 'x' + toNumber(number, fixed)\n}\n\nexport const toPercent = (number?: number, fixed = 2): string => {\n if (number === undefined) return ''\n return toNumber(100 * number, fixed) + '%'\n}\nconst multipliers = mapRange(10, value => Math.pow(10, value))\nexport const toFlooredPercent = (number?: number, decimals = 2): string => {\n if (number === undefined) return ''\n return Math.floor(multipliers[decimals + 2] * number) / multipliers[decimals] + '%'\n}\nexport const toSignedPercent = (number?: number, fixed = 2): string => {\n if (number === undefined) return ''\n const value = +(number * 100.0).toFixed(fixed)\n if (value >= 0) return '+' + String(value) + '%'\n return String(value) + '%'\n}\n","import { Mode } from 'types'\n\nexport enum Setting {\n GlobalTargeting = 'Units attack all targets',\n StrengthLostMultiplier = 'Multiplier for strength damage',\n MoraleLostMultiplier = 'Multiplier for morale damage',\n ExperienceDamageReduction = 'Damage reduction for 100% experience',\n DiceMinimum = 'Minimum dice roll',\n DiceMaximum = 'Maximum dice roll',\n BasePips = 'Base pips',\n MaxPips = 'Maximum pips',\n MaxGeneral = 'Maximum skill of generals',\n MaxCountering = 'Maximum countering bonus',\n CounteringDamage = 'Countering efficieny',\n CounteringMode = 'Countering mode',\n MinimumMorale = 'Minimum morale for combat',\n MinimumStrength = 'Minimum strength for combat',\n DamageLossForMissingMorale = 'Damage loss for missing morale',\n MoraleHitForNonSecondaryReinforcement = 'Morale damage for non-secondary reinforcements',\n MoraleHitForLateDeployment = 'Morale damage for late deployment',\n MoraleGainForWinning = 'Morale gain for winning',\n PhaseLength = 'Length of combat phases',\n Precision = 'Calculation precision',\n BaseCombatWidth = 'Base combat width',\n DefenderAdvantage = \"Defender's advantage\",\n RelativePips = 'Relative pips',\n AttributeDiscipline = 'Enable discipline',\n DailyMoraleLoss = 'Daily morale loss',\n DailyDamageIncrease = 'Daily damage increase',\n FixExperience = 'Fix damage reduction from experience',\n FixFlankTargeting = 'Fix targeting',\n DynamicTargeting = 'Dynamic targeting',\n BackRow = 'Enable backrow',\n BackRowRetreat = 'Enable retreating from backrow',\n RetreatRounds = 'Minimum rounds for retreat',\n StackwipeRounds = 'Minimum rounds for soft stack wipe',\n SoftStackWipeLimit = 'Strength required for soft stack wipe',\n HardStackWipeLimit = 'Strength required for hard stack wipe',\n AttackerSwapping = 'Enable attacker swapping',\n Tactics = 'Enable tactics',\n Stackwipe = 'Enable stack wiping',\n Martial = 'Enable general martial',\n Tech = 'Enable tech based units',\n Food = 'Enable food attributes',\n Culture = 'Enable culture based units',\n CustomDeployment = 'Enable deployment customization',\n DynamicFlanking = 'Enable dynamic flanking',\n UseMaxMorale = 'Morale damage based on max morale',\n SupportPhase = 'Deploy support units separately',\n InsufficientSupportPenalty = 'Penalty for insufficient support',\n StrengthBasedFlank = 'Enable strength based flank',\n FireAndShock = 'Enable fire and shock phases',\n AttributeCombatAbility = 'Enable Combat ability attribute',\n AttributeLoyal = 'Enable Loyal attribute',\n AttributeDrill = 'Enable Drill attribute',\n AttributeExperience = 'Enable Experience attribute',\n AttributeMilitaryTactics = 'Enable Military tactics attribute',\n AttributeOffenseDefense = 'Enable Offense and Defense attributes',\n AttributeDamage = 'Enable Damage done and Damage taken attributes',\n AttributeMoraleDamage = 'Enable Morale damage done and Morale damage taken attributes',\n AttributeStrengthDamage = 'Enable Strength damage done and Strength damage taken attributes',\n AttributeTerrainType = 'Enable terrain type based attributes',\n MoraleDamageBasedOnTargetStrength = 'Enable morale damaged based on target strength',\n Performance = 'Performance',\n MaxPhases = 'Maximum phases',\n PhasesPerRoll = 'Amount of phases affected by each dice roll',\n ChunkSize = 'Chunk size',\n CalculateWinChance = 'Calculate win chance',\n CalculateCasualties = 'Calculate casualties',\n CalculateResourceLosses = 'Calculate resource losses',\n ReduceRolls = 'Reduce possible dice rolls',\n ShowGraphs = 'Show graphs',\n AutoRefresh = 'Automatic refresh',\n StackWipeCaptureChance = 'Capture chance when stack wiping',\n CohortSize = 'Cohort size',\n RequiredCrossingSupport = 'Required crossing support'\n}\n\nexport enum SimulationSpeed {\n Custom = 'Custom',\n VeryAccurate = 'Very accurate',\n Accurate = 'Accurate',\n Normal = 'Normal',\n Fast = 'Fast',\n VeryFast = 'Very fast'\n}\n\nexport enum DisciplineValue {\n Off = 'Disabled',\n Damage = 'Only damage done',\n Both = 'Both damage done and taken'\n}\n\nexport enum CounteringMode {\n Default = 'Default',\n OnlyPenalty = 'OnlyPenalty',\n OnlyBonus = 'OnlyBonus'\n}\n\nexport enum SupportDeployValue {\n On = 'On',\n Separately = 'Separately',\n Off = 'Off'\n}\n\nexport const parameterToDescription = (parameter: Setting, value: string | number | boolean): string => {\n switch (parameter) {\n case Setting.BasePips:\n return 'Base pips for all units. Affects how much damage units deal. (EU4, CK3, IR)'\n case Setting.MaxPips:\n return 'Maximum amount of pips. Affects how much damage units deal. (IR)'\n case Setting.MaxGeneral:\n return 'Maximum amount of pips on generals. (EU4)'\n case Setting.BaseCombatWidth:\n return 'Base width of the frontline. Affects how many units can fight at the same time. (EU4, IR)'\n case Setting.DiceMaximum:\n return 'Maximum dice roll. Affects how much damage units deal. (EU4, CK3, IR)'\n case Setting.DiceMinimum:\n return 'Minimum dice roll. Affects how much damage units deal. (EU4, CK3, IR)'\n case Setting.ExperienceDamageReduction:\n return 'Damage reduction given at 100% experience. (IR)'\n case Setting.Precision:\n return 'Precision of combat calculations. Advanced setting. (EU4, CK3, IR)'\n case Setting.StackWipeCaptureChance:\n return 'Additional unit capture chance when stack wiping an army. (IR)'\n case Setting.GlobalTargeting:\n if (value) return 'All units simultaneously attack all targets. (CK3)'\n else return 'Units attack a single target. (EU4, IR)'\n case Setting.FixExperience:\n if (value) return 'Damage reduction from experience is fixed. All units benefit equally from the experience.'\n else\n return 'Experience works like in the game. Strength and morale damage taken affect the damage reduction. (IR)'\n case Setting.StrengthLostMultiplier:\n return 'Multiplier for strength damage. Affects how much strength damage units deal. (EU4, CK3, IR)'\n case Setting.MinimumStrength:\n return 'Strength required for combat. Affects how quicky units retreat.'\n case Setting.DamageLossForMissingMorale:\n return 'Reduced damage done for lost morale.'\n case Setting.MoraleHitForNonSecondaryReinforcement:\n return 'Percentage of total morale lost when non-secondary units reinforce. (IR)'\n case Setting.MoraleHitForLateDeployment:\n return 'Percentage of total morale lost when armies deploy after retreat is available. (IR)'\n case Setting.MoraleGainForWinning:\n return 'Percentage of total morale gained when winning a battle. (EU4)'\n case Setting.MinimumMorale:\n return 'Morale required for combat. Affects how quicky units retreat. (IR)'\n case Setting.MoraleLostMultiplier:\n return 'Multiplier for morale damage. Affects how much morale damage units deal. (EU4, IR)'\n case Setting.DefenderAdvantage:\n if (value) return \"Defending units can't be targeted when they reinforce.\"\n else return 'Defender gets no undocumented benefits. (EU4. IR)'\n case Setting.RelativePips:\n if (value) return 'The difference of pips is only applied to the side with a higher amount (CK3)'\n else return 'Pips are applied independently to both sides. (EU4. IR)'\n case Setting.BackRow:\n if (value) return 'Backrow enabled for support and reinforcement units. (EU4)'\n else return 'Only front row. (CK3, IR)'\n case Setting.BackRowRetreat:\n if (value) return 'Units can retreat from backrow'\n else return \"Units from backrow can't retreat. (EU4)\"\n case Setting.RetreatRounds:\n return 'How long the battle must last to enable retreat. (CK3, EU4, IR)'\n case Setting.StackwipeRounds:\n return 'How long the battle must last to disable soft stack wiping. (CK3, EU4, IR)'\n case Setting.SoftStackWipeLimit:\n return 'Strength multiplier for soft stack wiping. (EU4, IR)'\n case Setting.HardStackWipeLimit:\n return 'Strength multiplier for hard stack wiping. (EU4, IR)'\n case Setting.Stackwipe:\n if (value) return 'Stacking wiping rules are checked. (CK3, EU4, IR)'\n else return 'Stack wiping is not possible.'\n case Setting.MoraleDamageBasedOnTargetStrength:\n if (value) return 'Lower strength increases morale damage taken.'\n else return \"Strength doesn't affect morale damage taken. (EU4, IR).\"\n case Setting.CustomDeployment:\n if (value) return 'Preferred unit types can be selected. (IR)'\n else return 'Preferred unit types are not available. (EU4)'\n case Setting.DynamicFlanking:\n if (value) return 'Enemy army size affects flanking slots. (EU4)'\n else return 'Amount of flanking slots is only based on preferred flanking. (IR)'\n case Setting.Tactics:\n if (value) return 'Tactics available. (IR)'\n else return 'Tactics not available. (CK3, EU4)'\n case Setting.AttackerSwapping:\n if (value) return 'With multiple battles, the attacker becomes defender if it wins a battle. (CK3, EU4, IR)'\n else return 'With multiple battles, the original attacker always stays attacker.'\n case Setting.Martial:\n if (value) return 'Martial attribute available. (IR)'\n else return 'Martial not available. (CK3, EU4)'\n case Setting.Tech:\n if (value) return 'Tech level affects available units. (EU4)'\n else return 'Units are available regardless of tech level. (CK3, IR)'\n case Setting.Culture:\n if (value) return 'Culture affects available units. (EU4)'\n else return 'Units are available regardless of culture. (CK3, IR)'\n case Setting.Food:\n if (value) return 'Food consumption and storage are shown. (IR)'\n else return 'Food attributes are not available. (CK3, EU4)'\n case Setting.StrengthBasedFlank:\n if (value) return 'Every 25% of lost strength reduces maneuveur by 25%. (EU4)'\n else return 'Cohort strength has no effect on maneuver. (IR)'\n case Setting.AttributeDiscipline:\n if (value === DisciplineValue.Damage) return 'Discipline only increases damage done. (IR)'\n else if (value === DisciplineValue.Both) return 'Discipline increaes damage done and reduces damage taken. (EU4)'\n else return 'Discipline has no effect.'\n case Setting.CounteringMode:\n if (value === CounteringMode.OnlyPenalty) return 'Bonus is applied as a penalty to the opponent. (CK3).'\n else if (value === CounteringMode.OnlyBonus) return 'Penalty is applied as a bonus to the opponent.'\n else return 'Both bonus and penalty work. (IR)'\n case Setting.UseMaxMorale:\n if (value) return 'Morale damage is based on the maximum morale. (EU4)'\n else return 'Morale damage is based on the current morale. (IR)'\n case Setting.FireAndShock:\n if (value) return 'Combat alternates between fire and shock phases. (EU4)'\n else return 'Combat only has one phase, (CK3, IR).'\n case Setting.SupportPhase:\n if (value === SupportDeployValue.Separately)\n return 'Support units are deployed when no other units are available. (IR)'\n else if (value === SupportDeployValue.Off) return 'Support units won\\t deploy. (CK3)'\n else return 'Support units deploy with other units. (EU4)'\n case Setting.MaxCountering:\n return 'Maximum amount of countering. (CK3)'\n case Setting.CounteringDamage:\n return 'Damage multiplier for countering bonus and penalty. (CK3)'\n case Setting.DailyMoraleLoss:\n return 'Amount of morale lost each round. (EU4)'\n case Setting.DailyDamageIncrease:\n return 'How much damage increases every round. (EU4)'\n case Setting.PhaseLength:\n return 'How often dice rolls and phases change. (CK3, EU4, IR)'\n case Setting.InsufficientSupportPenalty:\n return 'How much damage taken is increased for having too many flanking units. (EU4)'\n case Setting.FixFlankTargeting:\n if (value) return 'Targeting is fixed.\\nLeft and right flanks work exactly same. (IR)'\n else return 'Right flank prefers left-most units.\\nLeft and right flanks behave differently. (EU4)'\n case Setting.DynamicTargeting:\n if (value) return 'Units may flank if the main target is considered too weak. (EU4)'\n else return 'Units always attack the main target. (IR)'\n case Setting.AttributeCombatAbility:\n if (value) return 'Combat ability increases damage done. (EU4)'\n else return 'Combat ability is ignored.'\n case Setting.AttributeDamage:\n if (value) return 'Damage done and Damage taken have an effect. (IR, EU4)'\n else return 'Damage done and Damage taken are ignored.'\n case Setting.AttributeLoyal:\n if (value) return 'Loyalty increase damage done. (IR)'\n else return 'Loyalty is ignored.'\n case Setting.AttributeDrill:\n if (value) return 'Drill increases damage done and reduces damage taken. (EU4)'\n else return 'Drill is ignored.'\n case Setting.AttributeExperience:\n if (value) return 'Experience reduces damage taken. (IR)'\n else return 'Experience is ignored.'\n case Setting.AttributeMilitaryTactics:\n if (value) return 'Military tactics reduces damage taken. (EU4)'\n else return 'Military tactics is ignored.'\n case Setting.AttributeMoraleDamage:\n if (value) return 'Morale damage done and Morale damage taken have an effect. (IR).'\n else return 'Morale damage done and Morale damage taken are ignored.'\n case Setting.AttributeOffenseDefense:\n if (value) return 'Offense increases damage done and Defense reduces damage taken. (IR)'\n else return 'Offense and Defense are ignored.'\n case Setting.AttributeStrengthDamage:\n if (value) return 'Strength damage done and Strength damage taken have an effect. (IR)'\n else return 'Strength damage done and Strength damage taken are ignored.'\n case Setting.AttributeTerrainType:\n if (value) return 'Terrain types affect pips and unit damage (CK3, IR).'\n else return 'Terrain types only affect pips (EU4).'\n case Setting.MaxPhases:\n return 'How many phases are simulated.\\nIncrease for higher accuracy and less incomplete rounds.\\nDecrease forg faster speed.'\n case Setting.PhasesPerRoll:\n return 'Scales length of phases.\\nIncrease for faster speed and less incomplete rounds.\\nDecrease for higher accuracy.'\n case Setting.ChunkSize:\n return 'How many battles are simulated in a row. Higher values slightly increase performance but make the UI less responsive.'\n case Setting.Performance:\n return 'Quick setting for speed and accuracy.\\nAffects phase length multiplier and maximum depth.'\n case Setting.ReduceRolls:\n return 'Halves number of available dice rolls.\\nMassively increases performance.'\n case Setting.CalculateWinChance:\n if (value) return 'Win chance and average rounds are calculated.\\nThis slightly decreases performance.'\n else return \"Win chance and average rounds won't be calculated.\\nThis slightly improves performance.\"\n case Setting.CalculateCasualties:\n if (value) return 'Casualties are calculated.\\nThis slightly decreases performance.'\n else return \"Casualties won't be calculated.\\nThis slightly improves performance.\"\n case Setting.CalculateResourceLosses:\n if (value) return 'Gold losses are calculated for naval combat.\\nThis slightly decreases performance.'\n else return \"Gold losses won't be calculated for naval combat.\\nThis slightly improves performance.\"\n case Setting.ShowGraphs:\n if (value) return 'Graphs are shown.\\nThis slightly decreases performance.'\n else return \"Graphs won't be shown.\\nThis slightly improves performance.\"\n case Setting.AutoRefresh:\n if (value) return 'Battle refreshes automatically after any changes.'\n else return 'Battle only refreshes when going to previous or next rounds.'\n case Setting.CohortSize:\n return 'Amount of manpower in a cohort.'\n case Setting.RequiredCrossingSupport:\n return 'Amount of average crossing support to ignore crossing penalties.'\n default:\n return 'No description.'\n }\n}\n\nexport type CombatModeSettings = {\n [Setting.MoraleLostMultiplier]: number\n [Setting.StrengthLostMultiplier]: number\n [Setting.StackWipeCaptureChance]: number\n}\n\nexport type CombatSharedSettings = {\n [Setting.GlobalTargeting]: boolean\n [Setting.BasePips]: number\n [Setting.MaxPips]: number\n [Setting.MaxGeneral]: number\n [Setting.CounteringDamage]: number\n [Setting.CounteringMode]: CounteringMode\n [Setting.MaxCountering]: number\n [Setting.BaseCombatWidth]: number\n [Setting.DiceMaximum]: number\n [Setting.DiceMinimum]: number\n [Setting.ExperienceDamageReduction]: number\n [Setting.MinimumStrength]: number\n [Setting.MoraleHitForNonSecondaryReinforcement]: number\n [Setting.MoraleHitForLateDeployment]: number\n [Setting.MoraleGainForWinning]: number\n [Setting.MinimumMorale]: number\n [Setting.PhaseLength]: number\n [Setting.DynamicTargeting]: boolean\n [Setting.FixFlankTargeting]: boolean\n [Setting.DefenderAdvantage]: boolean\n [Setting.FixExperience]: boolean\n [Setting.Precision]: number\n [Setting.ChunkSize]: number\n [Setting.MaxPhases]: number\n [Setting.PhasesPerRoll]: number\n [Setting.ShowGraphs]: boolean\n [Setting.BackRow]: boolean\n [Setting.RelativePips]: boolean\n [Setting.BackRowRetreat]: boolean\n [Setting.RetreatRounds]: number\n [Setting.Stackwipe]: boolean\n [Setting.StackwipeRounds]: number\n [Setting.SoftStackWipeLimit]: number\n [Setting.HardStackWipeLimit]: number\n [Setting.MoraleDamageBasedOnTargetStrength]: boolean\n [Setting.DamageLossForMissingMorale]: number\n [Setting.Tactics]: boolean\n [Setting.AttackerSwapping]: boolean\n [Setting.Martial]: boolean\n [Setting.Tech]: boolean\n [Setting.Culture]: boolean\n [Setting.Food]: boolean\n [Setting.CustomDeployment]: boolean\n [Setting.DynamicFlanking]: boolean\n [Setting.UseMaxMorale]: boolean\n [Setting.StrengthBasedFlank]: boolean\n [Setting.InsufficientSupportPenalty]: number\n [Setting.AttributeDiscipline]: DisciplineValue\n [Setting.FireAndShock]: boolean\n [Setting.SupportPhase]: SupportDeployValue\n [Setting.DailyMoraleLoss]: number\n [Setting.DailyDamageIncrease]: number\n [Setting.AttributeCombatAbility]: boolean\n [Setting.AttributeDamage]: boolean\n [Setting.AttributeDrill]: boolean\n [Setting.AttributeLoyal]: boolean\n [Setting.AttributeExperience]: boolean\n [Setting.AttributeMilitaryTactics]: boolean\n [Setting.AttributeMoraleDamage]: boolean\n [Setting.AttributeOffenseDefense]: boolean\n [Setting.AttributeStrengthDamage]: boolean\n [Setting.AttributeTerrainType]: boolean\n [Setting.CalculateWinChance]: boolean\n [Setting.CalculateCasualties]: boolean\n [Setting.CalculateResourceLosses]: boolean\n [Setting.ReduceRolls]: number\n [Setting.Performance]: SimulationSpeed\n [Setting.AutoRefresh]: boolean\n [Setting.CohortSize]: number\n [Setting.RequiredCrossingSupport]: number\n}\n\nexport type CombatSettings = CombatModeSettings & CombatSharedSettings\n\nexport type Settings = {\n modeSettings: Record\n sharedSettings: CombatSharedSettings\n}\n","import { DataValues } from 'data_values'\nimport { Mode } from 'types/definition'\nimport { TacticType, TacticData } from './tactics'\nimport { CombatPhase } from './battle'\nimport {\n Selections,\n UnitValues,\n UnitRole,\n UnitType,\n Reserve,\n ReserveData,\n ReserveDefinition,\n UnitProperties\n} from 'types'\nimport { UnitDefinitions } from './units'\nimport { filter } from 'utils'\n\nexport enum ArmyName {\n Army = 'Army',\n Navy = 'Navy'\n}\n\nexport enum CharacterAttribute {\n Martial = 'Martial',\n Finesse = 'Finesse',\n Charisma = 'Charisma',\n Zeal = 'Zeal',\n Maneuver = 'Maneuver',\n Health = 'Health',\n Age = 'Age',\n Fertility = 'Fertility'\n}\n\nconst attributes = [\n CharacterAttribute.Martial,\n CharacterAttribute.Charisma,\n CharacterAttribute.Finesse,\n CharacterAttribute.Zeal\n]\nexport const isStatAttribute = (attribute: CharacterAttribute) => attributes.includes(attribute)\nexport const filterStatAttributes = (attributes: Record) =>\n filter(attributes, (_, attribute) => isStatAttribute(attribute))\n\nexport type GeneralDefinition = {\n tactic: TacticData\n selections: Selections\n enabled: boolean\n baseValues: GeneralValues\n extraValues: GeneralValues\n values: GeneralValues\n}\n\nexport type GeneralValues = { [key in GeneralValueType]: number }\n\nexport type GeneralValueType = CharacterAttribute | CombatPhase\n\nexport type Armies = { [key in ArmyName]: ArmyData }\n\nexport interface GeneralData extends DataValues {\n tactic: TacticType\n selections: Selections\n enabled: boolean\n definitions: UnitValues\n}\n\nexport type UnitPreferences = { [key in UnitPreferenceType | UnitRole]: UnitType | null }\nexport type ArmyData = {\n mode: Mode\n unitPreferences: UnitPreferences\n flankSize: number\n general: GeneralData\n reserve: ReserveData\n}\n\nexport type ArmyDefinition = {\n unitPreferences: UnitPreferences\n unitDefinitions: UnitDefinitions\n flankSize: number\n flankRatio: number\n general: GeneralDefinition\n reserve: ReserveDefinition\n}\n\nexport enum ArmyPart {\n Frontline = 'Frontline',\n Reserve = 'Reserve',\n Defeated = 'Defeated',\n Retreated = 'Retreated'\n}\n\nexport enum UnitPreferenceType {\n Primary = 'Primary',\n Secondary = 'Secondary',\n Flank = 'PrimaryFlank'\n}\n\n/**\n * Information required for fast combat calculation.\n * CombatUnits contain most of the information precalculated.\n */\nexport type Army = {\n reserve: Reserve\n flankSize: number\n flankRatio: number\n arrival: number\n unitPreferences: UnitPreferences\n unitProperties: UnitProperties\n leftFlank: number\n rightFlank: number\n priority: number\n crossingSupport: number\n armySize: number\n tactic: TacticData\n participantIndex: number\n general: { [key in GeneralValueType]: number }\n}\n","import {\n UnitType,\n UnitValueType,\n UnitDefinition,\n UnitAttribute,\n CombatPhase,\n CountryName,\n ArmyName,\n Mode,\n UnitRole,\n Army\n} from 'types'\nimport { DataValues } from 'data_values'\n\n/** An identity of a cohort. Used to store data but shouldn't be used for anything else. */\nexport interface CohortData extends DataValues {\n type: UnitType\n isLoyal?: boolean\n}\n\n/** A full cohort (merged with unit definition). */\nexport interface CohortDefinition extends CohortData, UnitDefinition {}\n\nexport type UnitProperties = { [key in UnitType]: CohortProperties }\n\n/**\n * Interface designed for fast combat calculations. This data is cached in simulations (keep lightweight).\n */\nexport interface Cohort {\n [UnitAttribute.Morale]: number\n [UnitAttribute.Strength]: number\n /** Is the cohort considered weak for targeting. */\n isWeak: boolean\n state: CohortRoundInfo\n properties: CohortProperties\n}\n\ntype UnitCalcs = { [key in UnitValueType]: number }\n\n/**\n * Static part of a cohort. Properties which don't change during the battle.\n */\nexport interface CohortProperties extends UnitCalcs {\n damage: {\n [key in UnitAttribute.Strength | UnitAttribute.Morale | 'Damage']: {\n [key in UnitType]: { [key in CombatPhase]: number }\n }\n } // Damage multiplier for each damage type, versus each unit and for each phase.\n damageTakenMultiplier: number\n moraleTakenMultiplier: number\n strengthTakenMultiplier: { [key in CombatPhase]: number }\n participantIndex: number\n countryName: CountryName\n armyName: ArmyName\n index: number\n image: string\n type: UnitType\n isLoyal: boolean\n experience: number\n maxStrength: number\n maxMorale: number\n experienceReduction: number\n deploymentCost: number\n parent?: UnitType\n mode: Mode\n tech?: number\n role?: UnitRole\n\n // These technically change during battle but are only needed for UI.\n reinforcementPenalty: number\n deploymentPenalty: number\n winningMoraleBonus: number\n}\n\n/** Round specific state for a cohort. */\nexport interface CohortRoundInfo {\n /** Is attacking diagonally. */\n flanking: boolean\n /** Targeted enemy cohort. */\n target: Cohort | null\n /** Support cohort behind the targeted enemy. */\n targetSupport: Cohort | null\n /** Lost morale this round. */\n moraleLoss: number\n /** Lost strength this round. */\n strengthLoss: number\n /** Morale losses inflicted this round. */\n moraleDealt: number\n /** Damage inflicted this round. */\n damageDealt: number\n /** Strength losses inflicted this round. */\n strengthDealt: number\n /** Damage taken multiplier from insufficied support. */\n flankRatioPenalty: number\n /** Damage multiplier. */\n damageMultiplier: number\n /** Did the cohort get defeated. */\n isDefeated: boolean\n /** The round of defeat. */\n defeatedDay: number\n /** The cohort which targeted this cohort last. */\n targetedBy: Cohort | null\n /** The cohort which defeated this cohort. */\n defeatedBy: Cohort | null\n /** The army which stack wiped this cohort. */\n stackWipedBy: Army | null\n /** Did the cohort get destroyed. */\n isDestroyed: boolean\n /** Total morale losses inflicted during the battle. */\n totalMoraleDealt: number\n /** Total strength losses inflicted during the battle. */\n totalStrengthDealt: number\n /** Chance of getting captured. */\n captureChance: number\n}\n\nexport type Cohorts = {\n frontline: Frontline\n reserve: Reserve\n defeated: Cohort[]\n retreated: Cohort[]\n}\n\nexport type ReserveData = CohortData[]\nexport type ReserveDefinition = CohortDefinition[]\n\nexport type Reserve = {\n front: Cohort[]\n flank: Cohort[]\n support: Cohort[]\n}\n\nexport type Frontline = (Cohort | null)[][]\n","import { GovermentType, Selections } from './modifiers'\nimport { Armies } from './armies'\nimport { UnitsData, UnitAttribute } from './units'\nimport { DataValues } from 'data_values'\n\nexport type WearinessAttribute = UnitAttribute.Morale | UnitAttribute.Strength\nexport type WearinessAttributes = Record\nexport type Range = { min: number; max: number }\n\nexport enum CountryName {\n Country1 = 'Country 1',\n Country2 = 'Country 2'\n}\nexport type Countries = Record\n\nexport enum CountryAttribute {\n CombatWidth = 'Combat Width',\n FlankRatio = 'Flank Ratio',\n MilitaryExperience = 'Military Experience',\n OmenPower = 'Omen Power',\n CivicTech = 'Civic Tech',\n MartialTech = 'Martial Tech',\n OratoryTech = 'Oratory Tech',\n ReligiousTech = 'Religious Tech',\n LevySize = 'Levy Size'\n}\n\nexport const countryAttributeToEffect = (attribute: CountryAttribute) => {\n if (attribute === CountryAttribute.MartialTech) return 'military_tech'\n if (attribute === CountryAttribute.OratoryTech) return 'oratory_tech'\n if (attribute === CountryAttribute.CivicTech) return 'civic_tech'\n if (attribute === CountryAttribute.ReligiousTech) return 'religious_tech'\n if (attribute === CountryAttribute.MilitaryExperience) return 'military_experience'\n return ''\n}\n\nexport type CountryDefinitions = Record\n\nexport interface CountryModifiers extends DataValues {\n selections: Selections\n culture: CultureType\n government: GovermentType\n}\nexport type CountryData = {\n modifiers: CountryModifiers\n armies: Armies\n units: UnitsData\n weariness: WearinessAttributes\n name: CountryName\n}\n\nexport type CountryDefinition = CountryData\n\nexport type Country = Record & {\n selections: Selections\n weariness: WearinessAttributes\n culture: CultureType\n name: CountryName\n}\n\nexport enum CultureType {\n Dummy = 'Dummy'\n}\n","import { UnitType, ValuesType } from 'types'\nimport { Mode } from './definition'\nimport { ObjSet } from 'utils'\n\nexport enum SelectionType {\n Trait = 'Trait',\n Ability = 'Ability',\n Tradition = 'Tradition',\n Invention = 'Invention',\n Heritage = 'Heritage',\n Law = 'Law',\n Deity = 'Deity',\n Policy = 'Policy',\n Idea = 'Idea',\n Trade = 'Trade',\n Religion = 'Religion',\n Faction = 'Faction',\n Distinction = 'Distinction',\n Effect = 'Effect'\n}\n\nexport type Selections = Record\n\nexport enum ModifierType {\n Text = 'Text',\n Global = 'Global',\n General = 'General',\n Country = 'Country'\n}\n\nexport enum GovermentType {\n Republic = 'Republic',\n Monarch = 'Monarch',\n Tribe = 'Tribe'\n}\n\nexport interface Modifier {\n target: UnitType | ModifierType | Mode\n attribute: string\n negative?: boolean\n type: ValuesType\n noPercent?: boolean\n value: number\n}\n\nexport interface ModifierWithKey extends Modifier {\n key: string\n}\n\nexport interface DataEntry {\n name: string\n key: string\n modifiers: Modifier[]\n relevant: boolean\n parent: string\n}\n\nexport type DeityDefinition = DataEntry & { isOmen: boolean }\n\nexport type DictionaryData = Record\n\ntype Culture = {\n name: string\n template: Record\n primary: string\n secondary: string\n flank: string\n}\nexport type CultureData = Record\nexport type RegionData = Record\n\nexport interface DataEntryEU4 {\n name: string\n key: string\n modifiers: Modifier[]\n}\n","import { UnitType, Data, Mode } from 'types'\nimport { DataValues } from 'data_values'\n\nexport enum TacticCalc {\n Casualties = 'Casualties'\n}\n\nexport enum TacticType {\n Bottleneck = 'Bottleneck',\n CavalrySkirmish = 'Cavalry Skirmish',\n Deception = 'Deception',\n Envelopment = 'Envelopment',\n HitAndRun = 'Hit-and-Run',\n PadmaVyuha = 'Padma Vyuha',\n Phalanx = 'Phalanx',\n ShockAction = 'Shock Action',\n Skirmishing = 'Skirmishing',\n TriplexAcies = 'Triplex Acies',\n FrontalAssault = 'Frontal Assault',\n NavalEnvelopment = 'Naval Envelopment',\n CloseRanks = 'Close Ranks',\n Harassment = 'Harassment',\n ProbingAttack = 'Probing Attack'\n}\n\nexport type TacticsData = Record\n\nexport type TacticValueType = UnitType | TacticCalc | TacticType\n\nexport interface TacticData extends Data, DataValues {\n mode: Mode\n}\n\nexport enum TacticMatch {\n Neutral = 'Neutral',\n Positive = 'Positive',\n Negative = 'Negative'\n}\n\nexport type Tactic = {\n type: TacticType\n effect: number\n match: TacticMatch\n damage: number\n casualties: number\n image: string\n}\n\nexport const dictionaryTacticType: { [key: string]: TacticType } = {\n shock_action: TacticType.ShockAction,\n envelopment: TacticType.Envelopment,\n skirmishing: TacticType.Skirmishing,\n deception: TacticType.Deception,\n bottleneck: TacticType.Bottleneck,\n greek_phalanx: TacticType.Phalanx,\n triplex_acies: TacticType.TriplexAcies,\n cavalry_skirmish: TacticType.CavalrySkirmish,\n padma_vyuha: TacticType.PadmaVyuha,\n hit_and_run_tactics: TacticType.HitAndRun,\n frontal_assault: TacticType.FrontalAssault,\n naval_envelopment: TacticType.NavalEnvelopment,\n close_ranks: TacticType.CloseRanks,\n harassment: TacticType.Harassment,\n probing_attack: TacticType.ProbingAttack\n}\n","import { Data } from 'types'\nimport { DataValues, calculateValue } from 'data_values'\n\n// Only listed what are required by code. There is actually a lot more terrains.\nexport enum TerrainType {\n Grasslands = 'Grasslands',\n Farmland = 'Farmland',\n Forest = 'Forest',\n CrossingShore = 'Crossing shore',\n None = 'None',\n Plains = 'Plains',\n River = 'River',\n Ocean = 'Open Sea',\n NoModifier = 'No modifier'\n}\n\nexport enum LocationType {\n Border = 'Border',\n Tile = 'Tile',\n Modifier = 'Modifier'\n}\n\nexport enum TerrainCalc {\n Roll = 'Roll',\n CombatWidth = 'CombatWidth'\n}\n\nexport type TerrainsData = Record\n\nexport type TerrainValueType = TerrainCalc\n\nexport interface TerrainData extends Data, DataValues {\n location: LocationType\n}\n\nexport const terrainValueToString = (data: TerrainData, type: TerrainValueType): string => {\n const value = calculateValue(data, type)\n return String(value)\n}\n","export enum ExportKey {\n Terrains = 'Terrain Definitions',\n Tactics = 'Tactic Definitions',\n Countries = 'Countries',\n Land = 'Land Armies',\n Naval = 'Naval Armies',\n Settings = 'Settings'\n}\n\nexport type ExportKeys = { [key in ExportKey]: boolean }\n\nexport type TransferState = {\n exportKeys: ExportKeys\n resetMissing: boolean\n}\n","import { SideType } from './battle'\nimport { ArmyName } from './armies'\nimport { CountryName } from './countries'\nimport { UnitType } from './units'\nimport { TerrainType } from './terrains'\nimport { TacticType } from './tactics'\nimport { ObjSet } from 'utils'\nimport { Mode } from './definition'\n\nexport enum ModalType {\n DiceRolls = 'DiceRolls',\n CohortDetail = 'CohortDetail',\n UnitDetail = 'UnitDetail',\n TerrainDetail = 'TerrainDetail',\n TacticDetail = 'TacticDetail',\n Value = 'Value'\n}\n\nexport type UI = {\n accordions: ObjSet\n modals: Modals\n selectedParticipantIndex: Record\n mode: Mode\n selectedArmyIndex: number\n selectedCountryIndex: number\n filterNonCombat: boolean\n}\n\nexport type Modals = {\n [ModalType.DiceRolls]?: {\n side: SideType\n }\n [ModalType.CohortDetail]?: {\n side: SideType\n participantIndex: number\n index: number\n country: CountryName\n army: ArmyName\n }\n [ModalType.UnitDetail]?: {\n country: CountryName\n army: ArmyName\n type: UnitType\n remove?: boolean\n }\n [ModalType.TerrainDetail]?: {\n type: TerrainType\n }\n [ModalType.TacticDetail]?: {\n type: TacticType\n }\n [ModalType.Value]?: {\n onSuccess: (value: string) => void\n message: string\n buttonMessage: string\n initial: string\n }\n}\n","import { DataValues, calculateValue } from 'data_values'\nimport { TerrainType, Mode, CultureType, TerrainData } from 'types'\nimport { toNumber, toPercent, toSignedPercent, toMultiplier } from 'formatters'\nimport { CombatPhase } from './battle'\nimport { flatten } from 'lodash'\nimport { DataWithMode } from './definition'\n\nexport enum UnitType {\n Archers = 'Archers',\n CamelCavalry = 'Camel Cavalry',\n Chariots = 'Chariots',\n HeavyCavalry = 'Heavy Cavalry',\n HeavyInfantry = 'Heavy Infantry',\n HorseArchers = 'Horse Archers',\n LightCavalry = 'Light Cavalry',\n LightInfantry = 'Light Infantry',\n WarElephants = 'War Elephants',\n SupplyTrain = 'Supply Train',\n Liburnian = 'Liburnian',\n Trireme = 'Trireme',\n Tetrere = 'Tetrere',\n Hexere = 'Hexere',\n Octere = 'Octere',\n MegaPolyreme = 'Mega-Polyreme',\n Land = 'Land Unit',\n Naval = 'Naval Unit',\n Infantry = 'Infantry',\n Cavalry = 'Cavalry',\n Artillery = 'Artillery',\n LightShip = 'Light Ship',\n MediumShip = 'Medium Ship',\n HeavyShip = 'Heavy Ship',\n Latest = 'Latest',\n None = 'None'\n}\n\nexport enum UnitRole {\n Front = 'Front',\n Flank = 'Flank',\n Support = 'Support'\n}\n\nexport enum UnitAttribute {\n StrengthDepleted = 'Strength Depleted',\n MoraleDepleted = 'Morale Depleted',\n Morale = 'Morale',\n Strength = 'Strength',\n Discipline = 'Discipline',\n Offense = 'Offense',\n Defense = 'Defense',\n Damage = 'Damage',\n Toughness = 'Toughness',\n Pursuit = 'Pursuit',\n Screen = 'Screen',\n Maneuver = 'Maneuver',\n MoraleDamageDone = 'Morale Damage Done',\n MoraleDamageTaken = 'Morale Damage Taken',\n StrengthDamageDone = 'Strength Damage Done',\n StrengthDamageTaken = 'Strength Damage Taken',\n FireDamageDone = 'Fire Damage Done',\n FireDamageTaken = 'Fire Damage Taken',\n ShockDamageDone = 'Shock Damage Done',\n ShockDamageTaken = 'Shock Damage Taken',\n OffensiveFirePips = 'Offensive Fire Pips',\n OffensiveShockPips = 'Offensive Shock Pips',\n OffensiveMoralePips = 'Offensive Morale Pips',\n DefensiveFirePips = 'Defensive Fire Pips',\n DefensiveShockPips = 'Defensive Shock Pips',\n DefensiveMoralePips = 'Defensive Morale Pips',\n OffensiveSupport = 'Damage from Backrow',\n DefensiveSupport = 'Defensive Pips to Frontrow',\n MilitaryTactics = 'Military Tactics',\n CombatAbility = 'Combat Ability',\n DamageDone = 'Damage Done',\n DamageTaken = 'Damage Taken',\n Cost = 'Cost',\n Maintenance = 'Maintenance',\n AttritionWeight = 'Attrition Weight',\n Experience = 'Experience',\n Drill = 'Drill',\n FoodConsumption = 'Food Consumption',\n FoodStorage = 'Food Storage',\n CaptureChance = 'Capture Chance',\n CaptureResist = 'Capture Resist',\n DailyLossResist = 'Daily Loss Resist',\n CrossingSupport = 'Crossing Support'\n}\n\nexport type UnitValueType = UnitAttribute | UnitType | TerrainType | CombatPhase\nexport type UnitValues = { [key in UnitType]: UnitValue }\nexport type UnitValue = DataValues\n\nexport const formTerrainAttribute = (terrain: TerrainData | TerrainType, attribute: UnitAttribute) => {\n if (typeof terrain === 'object') return `${terrain.type} ${attribute}` as UnitValueType\n return `${terrain} ${attribute}` as UnitValueType\n}\n\nexport const getTerrainAttributes = (terrains: (TerrainData | TerrainType)[]) => {\n return flatten(\n terrains.map(terrain => [\n formTerrainAttribute(terrain, UnitAttribute.Damage),\n formTerrainAttribute(terrain, UnitAttribute.Toughness),\n formTerrainAttribute(terrain, UnitAttribute.Pursuit),\n formTerrainAttribute(terrain, UnitAttribute.Screen)\n ])\n )\n}\n\n/** A single (sub) unit definition. Used to store data but shouldn't be used for anything else. */\nexport interface UnitData extends DataWithMode, DataValues {\n role?: UnitRole\n isLoyal?: boolean\n parent?: UnitType\n culture?: CultureType\n tech?: number\n}\n\n/** A full unit definition (merged with definitions of country, general and parent unit types). */\nexport interface UnitDefinition extends UnitData {\n mode: Mode\n}\n\nexport const unitValueToString = (definition: DataValues, type: UnitValueType): string => {\n const value = calculateValue(definition, type)\n switch (type) {\n case UnitAttribute.Maneuver:\n return toNumber(Math.floor(value))\n case UnitAttribute.Cost:\n case UnitAttribute.Strength:\n case UnitAttribute.StrengthDepleted:\n case UnitAttribute.Morale:\n case UnitAttribute.MoraleDepleted:\n case UnitAttribute.FoodConsumption:\n case UnitAttribute.FoodStorage:\n return toNumber(value)\n case CombatPhase.Fire:\n case CombatPhase.Shock:\n return toMultiplier(value)\n case UnitAttribute.Experience:\n case UnitAttribute.Maintenance:\n case UnitAttribute.AttritionWeight:\n return toPercent(value)\n default:\n return toSignedPercent(value)\n }\n}\n\nexport type UnitsData = { [key in UnitType]: UnitData }\nexport type UnitDefinitions = { [key in UnitType]: UnitDefinition }\n\nexport const dictionaryUnitType: { [key: string]: UnitType } = {\n archers: UnitType.Archers,\n camels: UnitType.CamelCavalry,\n chariots: UnitType.Chariots,\n heavy_cavalry: UnitType.HeavyCavalry,\n heavy_infantry: UnitType.HeavyInfantry,\n horse_archers: UnitType.HorseArchers,\n light_cavalry: UnitType.LightCavalry,\n light_infantry: UnitType.LightInfantry,\n warelephant: UnitType.WarElephants,\n supply_train: UnitType.SupplyTrain,\n liburnian: UnitType.Liburnian,\n trireme: UnitType.Trireme,\n tetrere: UnitType.Tetrere,\n hexere: UnitType.Hexere,\n octere: UnitType.Octere,\n mega_galley: UnitType.MegaPolyreme\n}\n","import { CombatPhase, CharacterAttribute, CountryAttribute, UnitAttribute, Setting, Mode, ValuesType } from 'types'\nimport { toPercent } from 'formatters'\nimport { CombatSharedSettings, DisciplineValue } from './settings'\n\nexport const formatAttribute = (value: number, attribute: string) => {\n if (\n attribute === CountryAttribute.CombatWidth ||\n attribute === CountryAttribute.MilitaryExperience ||\n attribute === CountryAttribute.CivicTech ||\n attribute === CountryAttribute.OratoryTech ||\n attribute === CountryAttribute.ReligiousTech ||\n attribute === CountryAttribute.MartialTech ||\n attribute === CountryAttribute.OmenPower ||\n attribute in CharacterAttribute ||\n attribute in CombatPhase\n )\n return String(value)\n return toPercent(value)\n}\n\nexport const filterAttributes = (\n attributes: T[],\n settings: CombatSharedSettings,\n mode?: Mode,\n showStatistics?: boolean\n): T[] => attributes.filter(attribute => isAttributeEnabled(attribute, settings, mode, showStatistics))\n\nexport const getAttributeValuesType = (attribute: UnitAttribute) =>\n attribute === UnitAttribute.Morale ? ValuesType.Modifier : ValuesType.Base\n\nexport const isAttributeEnabled = (\n attribute: string,\n settings: CombatSharedSettings,\n mode?: Mode,\n showStatistics?: boolean\n) => {\n if (!showStatistics && (attribute === UnitAttribute.StrengthDepleted || attribute === UnitAttribute.MoraleDepleted))\n return false\n if (\n !settings[Setting.BackRow] &&\n (attribute === UnitAttribute.OffensiveSupport || attribute === UnitAttribute.DefensiveSupport)\n )\n return false\n if (mode !== Mode.Naval && (attribute === UnitAttribute.CaptureChance || attribute === UnitAttribute.CaptureResist))\n return false\n if (!settings[Setting.DailyMoraleLoss] && attribute === UnitAttribute.DailyLossResist) return false\n if (!settings[Setting.FireAndShock] && attribute in CombatPhase) return false\n if (\n !settings[Setting.FireAndShock] &&\n (attribute === UnitAttribute.FireDamageDone ||\n attribute === UnitAttribute.FireDamageTaken ||\n attribute === UnitAttribute.ShockDamageDone ||\n attribute === UnitAttribute.ShockDamageTaken)\n )\n return false\n if (\n !settings[Setting.FireAndShock] &&\n (attribute === UnitAttribute.OffensiveFirePips ||\n attribute === UnitAttribute.OffensiveMoralePips ||\n attribute === UnitAttribute.OffensiveShockPips)\n )\n return false\n if (\n !settings[Setting.FireAndShock] &&\n (attribute === UnitAttribute.DefensiveFirePips ||\n attribute === UnitAttribute.DefensiveMoralePips ||\n attribute === UnitAttribute.DefensiveShockPips)\n )\n return false\n if (\n !settings[Setting.FireAndShock] &&\n (attribute === UnitAttribute.DefensiveFirePips ||\n attribute === UnitAttribute.DefensiveMoralePips ||\n attribute === UnitAttribute.DefensiveShockPips)\n )\n return false\n if (!settings[Setting.AttributeCombatAbility] && attribute === UnitAttribute.CombatAbility) return false\n if (\n !settings[Setting.AttributeDamage] &&\n (attribute === UnitAttribute.DamageDone || attribute === UnitAttribute.DamageTaken)\n )\n return false\n if (!settings[Setting.AttributeExperience] && attribute === UnitAttribute.Experience) return false\n if (!settings[Setting.AttributeMilitaryTactics] && attribute === UnitAttribute.MilitaryTactics) return false\n if (\n !settings[Setting.AttributeMoraleDamage] &&\n (attribute === UnitAttribute.MoraleDamageDone || attribute === UnitAttribute.MoraleDamageTaken)\n )\n return false\n if (\n !settings[Setting.AttributeOffenseDefense] &&\n (attribute === UnitAttribute.Offense || attribute === UnitAttribute.Defense)\n )\n return false\n if (\n !settings[Setting.AttributeStrengthDamage] &&\n (attribute === UnitAttribute.StrengthDamageDone || attribute === UnitAttribute.StrengthDamageTaken)\n )\n return false\n if (!settings[Setting.AttributeDrill] && attribute === UnitAttribute.Drill) return false\n if (!settings[Setting.Martial] && attribute === CharacterAttribute.Martial) return false\n if (\n !settings[Setting.Food] &&\n (attribute === UnitAttribute.FoodConsumption || attribute === UnitAttribute.FoodStorage)\n )\n return false\n if (!settings[Setting.InsufficientSupportPenalty] && attribute === CountryAttribute.FlankRatio) return false\n if (attribute === CombatPhase.Default) return false\n if (settings[Setting.AttributeDiscipline] === DisciplineValue.Off && attribute === UnitAttribute.Discipline)\n return false\n return true\n}\n","export default __webpack_public_path__ + \"static/media/unknown.64f01435.png\";","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport EmptyIcon from './images/empty.png'\nimport UnknownIcon from './images/unknown.png'\n\n/**\n * Returns the image of a definition while handling missing cases.\n * Question mark is returned for existing definitions without an image.\n * Empty is returned for non-existing definitions.\n * @param definition\n */\nexport const getImage = (definition: { image?: string } | null): string =>\n (definition && definition.image) || (definition ? UnknownIcon : EmptyIcon)\n\n/**\n * Wraps a given item into an array if it's not an array already.\n * @param item\n */\nexport function arrayify(item: T[] | undefined): T[]\nexport function arrayify(item: T): Exclude[]\nexport function arrayify(item: T) {\n return item ? (Array.isArray(item) ? item : [item]) : []\n}\n\n/**\n * Maps a range to a list.\n * @param length Length of the range.\n * @param func Callback function to create the list from an index.\n */\nexport const mapRange = (length: number, func: (number: number) => T): T[] => {\n const array: T[] = Array(Math.max(0, length))\n for (let i = 0; i < length; i++) {\n array[i] = func(i)\n }\n return array\n}\n\nexport const noZero = (value: number) => (value ? value : 1.0)\n\nexport const randomWithinRange = (min: number, max: number) => min + Math.random() * (max - min)\n\n/**\n * Sums numbers in a list.\n * @param list\n * @param converter Optional converted to sum complex attributes.\n */\nexport const sumArr = (arr: T[], converter?: (value: T) => number): number =>\n arr.reduce((previous, current) => previous + (converter ? converter(current) : Number(current)), 0)\n\n/**\n * Sums numbers in a object.\n * @param sumObj\n * @param converter Optional converted to sum complex attributes.\n */\nexport const sumObj = (object: Record, converter?: (value: any) => number): number =>\n Object.values(object).reduce((previous, current) => previous + (converter ? converter(current) : Number(current)), 0)\n\nexport const showProgress = (text: string, updates: number, dots: number) =>\n '\\u00a0'.repeat(updates % dots) + text + '.'.repeat(updates % dots)\n\n/**\n * Simple round function.\n * @param number\n */\nexport const round = (number: number, precision: number): number => Math.round(precision * number) / precision\n\nexport function arrGet(arr: V[], index: number): V | undefined\nexport function arrGet(arr: V1[], index: number, initial: V2 | undefined): V1 & V2\nexport function arrGet(arr: V1[], index: number, initial?: V2) {\n if (index < 0) index = arr.length + index\n if (index < 0 || index >= arr.length) return initial\n return arr[index]\n}\n\nexport const multiplyChance = (chance1?: number, chance2?: number) =>\n chance1 && chance2\n ? 1 - (1 - Math.max(0, chance1)) * (1 - Math.max(0, chance2))\n : chance1\n ? chance1\n : chance2\n ? chance2\n : 0\n\nexport const keys = (object: Record | undefined) =>\n object ? (Object.keys(object) as K[]) : []\nconst entries = (object: Record) => Object.entries(object) as [K, V][]\nexport const values = (object: Record) => Object.values(object) as V[]\n\nexport const map = (object: Record, callback: (item: V, key: K) => R): Record =>\n Object.assign({}, ...entries(object).map(([k, v]) => ({ [k]: callback(v, k) })))\n\nexport const forEach2 = (\n object: Record>,\n callback: (item: V, row: K, column: K) => R\n): void => forEach(object, (sub, row) => forEach(sub, (item, column) => callback(item, row, column)))\nexport const forEach = (object: Record, callback: (item: V, key: K) => R): void =>\n entries(object).forEach(([k, v]) => callback(v, k))\nexport const every = (object: Record, callback: (item: V, key: K) => any): boolean => {\n let ret = true\n entries(object).forEach(([k, v]) => (ret = !!callback(v, k) && ret))\n return ret\n}\n\nexport const excludeMissing = (arr: T[]): Exclude[] =>\n arr.filter(item => item) as Exclude[]\n\nexport const filter = (object: Record, callback?: (item: V, key: K) => any): Record =>\n Object.assign(\n {},\n ...entries(object)\n .filter(([k, v]) => (callback ? callback(v, k) : object[k]))\n .map(([k, v]) => ({ [k]: v }))\n )\nexport const filterKeys = (object: Record, callback?: (key: K) => any): Record =>\n Object.assign(\n {},\n ...entries(object)\n .filter(([k, v]) => (callback ? callback(k) : v))\n .map(([k, v]) => ({ [k]: v }))\n )\n\nexport function toArr(object: Record): V[]\nexport function toArr(object: Record, callback: (value: V, key: K) => R): R[]\nexport function toArr(object: Record, callback?: (value: V, key: K) => R): (R | V)[] {\n return entries(object).map(([k, v]) => (callback ? callback(v, k) : v))\n}\n\nexport function mapKeys(object: Record): K[]\nexport function mapKeys(object: Record, callback: (key: K) => R): R[]\nexport function mapKeys(object: Record, callback?: (key: K) => R): (K | R)[] {\n return keys(object).map(key => (callback ? callback(key) : key))\n}\n\nexport function reduce(object: Record, callback: (previous: V, current: V) => V): V\nexport function reduce(object: Record, callback: (previous: R, current: V) => R, initial: R): R\nexport function reduce(object: Record, callback: (previous: R, current: V) => R, initial?: R): R {\n return values(object).reduce(callback, initial as R)\n}\n\nexport function reduceKeys(object: Record, callback: (previous: K, current: K) => K): K\nexport function reduceKeys(\n object: Record,\n callback: (previous: R, current: K) => R,\n initial: R\n): R\nexport function reduceKeys(\n object: { [key in K]: any },\n callback: (previous: R, current: K) => R,\n initial?: R\n): R {\n return keys(object).reduce(callback, initial as R)\n}\n\nexport function toObj(arr: V[], key: (value: V, index: number) => K): Record\nexport function toObj(\n arr: V[],\n key: (value: V, index: number) => K,\n value: (value: V, index: number) => R\n): Record\nexport function toObj(\n arr: V[],\n key: (value: V, index: number) => K,\n value: (value: V, index: number) => R = value => (value as any) as R\n): Record {\n return Object.assign({}, ...arr.map((v, i) => ({ [key(v, i)]: value(v, i) })))\n}\n\nexport type ObjSet = Record\n\nexport const toSet = (object: Record, key: (value: V) => R): ObjSet =>\n Object.assign({}, ...values(object).map(v => ({ [key(v)]: true })))\n\nexport const merge = (object1: Record, object2: Record): Record => ({\n ...object1,\n ...object2\n})\n\nexport const removeUndefined = (object: { [key: string]: any }) =>\n Object.keys(object).forEach(key => object[key] === undefined && delete object[key])\n\nexport function resize(arr: (V | undefined)[], size: number): (V | undefined)[]\nexport function resize(arr: (V | undefined)[], size: number, defaultValue: V): V[]\nexport function resize(arr: (V | undefined)[], size: number, defaultValue?: V): (V | undefined)[] {\n const ret = arr.slice(0, size)\n while (size > ret.length) ret.push(defaultValue)\n return ret\n}\n","export enum ValuesType {\n Base = 'Base',\n Modifier = 'Modifier',\n Gain = 'Gain',\n Loss = 'Loss',\n LossModifier = 'LossModifier'\n}\n\nexport enum Mode {\n Land = 'Land',\n Naval = 'Naval'\n}\n\nexport type Data = {\n type: T\n image: string\n}\nexport type DataWithMode = Data & {\n mode?: Mode\n}\n","import {\n Mode,\n ArmyData,\n TacticType,\n UnitPreferences,\n UnitPreferenceType,\n UnitType,\n Armies,\n ArmyName,\n UnitRole,\n Selections,\n UnitValues\n} from 'types'\n\nconst getDefaultTactic = (mode: Mode): TacticType =>\n mode === Mode.Land ? TacticType.Deception : TacticType.FrontalAssault\n\nconst getDefaultUnitPreferences = (mode: Mode): UnitPreferences => {\n if (process.env.REACT_APP_GAME === 'EU4') {\n return {\n [UnitRole.Front]: UnitType.Latest,\n [UnitRole.Flank]: UnitType.Latest,\n [UnitRole.Support]: UnitType.Latest\n } as UnitPreferences\n }\n if (mode === Mode.Naval) {\n return {\n [UnitPreferenceType.Primary]: UnitType.MegaPolyreme,\n [UnitPreferenceType.Secondary]: UnitType.MegaPolyreme,\n [UnitPreferenceType.Flank]: UnitType.MegaPolyreme\n } as UnitPreferences\n } else {\n return {\n [UnitPreferenceType.Primary]: UnitType.Archers,\n [UnitPreferenceType.Secondary]: UnitType.HeavyInfantry,\n [UnitPreferenceType.Flank]: UnitType.LightCavalry\n } as UnitPreferences\n }\n}\n\nconst initializeDefaultArmy = (mode: Mode): ArmyData => ({\n reserve: [],\n unitPreferences: getDefaultUnitPreferences(mode),\n flankSize: 5,\n general: {\n enabled: true,\n selections: {} as Selections,\n definitions: {} as UnitValues,\n tactic: getDefaultTactic(mode)\n },\n mode\n})\n\nexport const getDefaultArmyName = (mode: Mode): ArmyName => (mode === Mode.Land ? ArmyName.Army : ArmyName.Navy)\n\nexport const getDefaultArmy = (mode: Mode): ArmyData => initializeDefaultArmy(mode)\n\nexport const getDefaultArmies = (): Armies => ({\n [ArmyName.Army]: getDefaultArmy(Mode.Land),\n [ArmyName.Navy]: getDefaultArmy(Mode.Naval)\n})\n","import { Mode } from 'types/definition'\nimport { Battle, CountryName, SideType, ModeState, TerrainType, Participant, ArmyName, SideData } from 'types'\nimport { mapRange } from 'utils'\n\nconst getInitialLand = () =>\n process.env.REACT_APP_GAME === 'EU4'\n ? [TerrainType.None, TerrainType.Grasslands]\n : [TerrainType.None, TerrainType.Farmland, TerrainType.NoModifier]\n\nexport const getInitialTerrains = (mode: Mode): TerrainType[] => {\n if (mode === Mode.Naval) return [TerrainType.Ocean]\n else return getInitialLand()\n}\n\nexport const getDefaultSide = (type: SideType, name: CountryName, mode: Mode, participants: number): SideData => {\n return {\n type,\n participants: mapRange(participants, () => getDefaultParticipant(name, mode)),\n days: [],\n rolls: [0],\n dice: process.env.REACT_APP_GAME === 'EU4' ? 5 : 3,\n randomizeDice: false\n }\n}\n\nexport const getDefaultParticipant = (name: CountryName, mode: Mode): Participant => {\n return {\n countryName: name,\n armyName: mode === Mode.Land ? ArmyName.Army : ArmyName.Navy,\n daysUntilBattle: 0\n }\n}\n\nexport const getDefaultMode = (mode: Mode, participants = 1): Battle => ({\n sides: {\n [SideType.A]: getDefaultSide(SideType.A, CountryName.Country1, mode, participants),\n [SideType.B]: getDefaultSide(SideType.B, CountryName.Country2, mode, participants)\n },\n terrains: getInitialTerrains(mode),\n fightOver: true,\n seed: 0,\n customSeed: undefined,\n outdated: true,\n timestamp: 0,\n days: []\n})\n\nexport const getDefaultBattle = (participants = 1): ModeState => ({\n [Mode.Land]: getDefaultMode(Mode.Land, participants),\n [Mode.Naval]: getDefaultMode(Mode.Naval, participants)\n})\n","export default __webpack_public_path__ + \"static/media/archers.34b6325d.png\";","export default __webpack_public_path__ + \"static/media/camel_cavalry.0986464d.png\";","export default __webpack_public_path__ + \"static/media/chariots.9c3f1244.png\";","export default __webpack_public_path__ + \"static/media/heavy_cavalry.efb54858.png\";","export default __webpack_public_path__ + \"static/media/heavy_infantry.9c80d864.png\";","export default __webpack_public_path__ + \"static/media/horse_archers.7e0c48be.png\";","export default __webpack_public_path__ + \"static/media/light_cavalry.c93a68fd.png\";","export default __webpack_public_path__ + \"static/media/light_infantry.95fb8514.png\";","export default __webpack_public_path__ + \"static/media/war_elephants.88e17d81.png\";","export default __webpack_public_path__ + \"static/media/supply_train.dade9c58.png\";","export default __webpack_public_path__ + \"static/media/martial.4aa0f744.png\";","export default __webpack_public_path__ + \"static/media/liburnian.8cb13b5a.png\";","export default __webpack_public_path__ + \"static/media/trireme.6a02422f.png\";","export default __webpack_public_path__ + \"static/media/tetrere.69266eb5.png\";","export default __webpack_public_path__ + \"static/media/hexere.1c53b323.png\";","export default __webpack_public_path__ + \"static/media/octere.a282d64c.png\";","export default __webpack_public_path__ + \"static/media/mega_polyreme.84395f21.png\";","export default __webpack_public_path__ + \"static/media/artillery.777304ea.png\";","export default __webpack_public_path__ + \"static/media/cavalry.62472707.png\";","export default __webpack_public_path__ + \"static/media/infantry.4bdc1682.png\";","import {\n ValuesType,\n UnitType,\n UnitData,\n UnitAttribute,\n UnitValueType,\n UnitRole,\n TerrainType,\n UnitsData,\n Mode,\n CultureType,\n CombatPhase,\n getTerrainAttributes\n} from 'types'\nimport { addValues } from 'data_values'\nimport { toObj, removeUndefined, filter, toArr, values } from 'utils'\nimport { uniq } from 'lodash'\n\nimport unitsIR from './json/ir/units.json'\nimport parentsIR from './json/ir/parent_units.json'\nimport parentsEU4 from './json/eu4/parent_units.json'\nimport unitsEU4 from './json/eu4/units.json'\nimport parentsCK3 from './json/ck3/parent_units.json'\nimport unitsCK3 from './json/ck3/units.json'\nimport IconArcher from 'images/archers.png'\nimport IconCamelCavalry from 'images/camel_cavalry.png'\nimport IconChariots from 'images/chariots.png'\nimport IconHeavyCavalry from 'images/heavy_cavalry.png'\nimport IconHeavyInfantry from 'images/heavy_infantry.png'\nimport IconHorseArchers from 'images/horse_archers.png'\nimport IconLightCavalry from 'images/light_cavalry.png'\nimport IconLightInfantry from 'images/light_infantry.png'\nimport IconWarElephants from 'images/war_elephants.png'\nimport IconSupplyTrain from 'images/supply_train.png'\nimport IconMilitaryPower from 'images/martial.png'\nimport IconLiburnian from 'images/liburnian.png'\nimport IconTrireme from 'images/trireme.png'\nimport IconTetrere from 'images/tetrere.png'\nimport IconHexere from 'images/hexere.png'\nimport IconOctere from 'images/octere.png'\nimport IconMegaPolyreme from 'images/mega_polyreme.png'\nimport IconArtillery from 'images/artillery.png'\nimport IconCavalry from 'images/cavalry.png'\nimport IconInfantry from 'images/infantry.png'\nimport IconEmpty from 'images/empty.png'\n\nconst unitToIcon: { [key in UnitType]: string } = {\n [UnitType.Archers]: IconArcher,\n [UnitType.CamelCavalry]: IconCamelCavalry,\n [UnitType.Chariots]: IconChariots,\n [UnitType.HeavyCavalry]: IconHeavyCavalry,\n [UnitType.HeavyInfantry]: IconHeavyInfantry,\n [UnitType.HorseArchers]: IconHorseArchers,\n [UnitType.LightCavalry]: IconLightCavalry,\n [UnitType.LightInfantry]: IconLightInfantry,\n [UnitType.WarElephants]: IconWarElephants,\n [UnitType.SupplyTrain]: IconSupplyTrain,\n [UnitType.Liburnian]: IconLiburnian,\n [UnitType.Trireme]: IconTrireme,\n [UnitType.Tetrere]: IconTetrere,\n [UnitType.Hexere]: IconHexere,\n [UnitType.Octere]: IconOctere,\n [UnitType.MegaPolyreme]: IconMegaPolyreme,\n [UnitType.Land]: IconMilitaryPower,\n [UnitType.Naval]: IconMilitaryPower,\n [UnitType.Cavalry]: IconCavalry,\n [UnitType.Infantry]: IconInfantry,\n [UnitType.Artillery]: IconArtillery,\n [UnitType.LightShip]: IconMilitaryPower,\n [UnitType.MediumShip]: IconMilitaryPower,\n [UnitType.HeavyShip]: IconMilitaryPower,\n [UnitType.Latest]: IconMilitaryPower,\n [UnitType.None]: IconEmpty\n}\n\nexport const getUnitIcon = (type: UnitType) => unitToIcon[type] || ''\n\nconst createUnitFromJson = (data: UnitJSON): UnitData => {\n const record = (data as unknown) as Record\n const handleAttributes = (attributes: string[]) =>\n attributes.filter(type => record[type]).map(type => [type, record[type]] as [UnitValueType, number])\n\n let unit: UnitData = {\n type: data.Type as UnitType,\n mode: data.Mode as Mode | undefined,\n image: unitToIcon[data.Type as UnitType] ?? unitToIcon[data.Parent as UnitType] ?? '',\n role: data.Role ? (data.Role as UnitRole) : undefined,\n parent: data.Parent ? (data.Parent as UnitType) : undefined,\n culture: data.Culture ? (data.Culture as CultureType) : undefined,\n tech: data.Tech\n }\n removeUndefined(unit)\n\n const baseValues: [UnitValueType, number][] = [\n ...handleAttributes(values(UnitAttribute)),\n ...handleAttributes(values(TerrainType)),\n ...handleAttributes(values(UnitType)),\n ...handleAttributes(values(CombatPhase)),\n ...handleAttributes(getTerrainAttributes(values(TerrainType)))\n ]\n unit = addValues(unit, ValuesType.Base, unit.type, baseValues)\n\n const modifierValues: [UnitValueType, number][] = [\n ...handleAttributes(\n getTerrainAttributes(values(TerrainType)).map(attribute => `${attribute} ${ValuesType.Modifier}`)\n )\n ]\n unit = addValues(unit, ValuesType.Modifier, unit.type, modifierValues)\n return unit\n}\n\nconst initializeDefaultUnits = (): UnitsData => {\n if (process.env.REACT_APP_GAME === 'EU4')\n return toObj(parentsEU4.map(createUnitFromJson).concat(unitsEU4.map(createUnitFromJson)), unit => unit.type)\n else if (process.env.REACT_APP_GAME === 'CK3')\n return toObj(parentsCK3.map(createUnitFromJson).concat(unitsCK3.map(createUnitFromJson)), unit => unit.type)\n else return toObj(parentsIR.map(createUnitFromJson).concat(unitsIR.map(createUnitFromJson)), unit => unit.type)\n}\n\n// Should default terrains be used here for loading? CK3 has lots of terrain stuff so otherwise TerrainType must be expanded...\nconst defaultUnits = initializeDefaultUnits()\n\nconst cultures = uniq(toArr(defaultUnits, value => value.culture).filter(culture => culture) as CultureType[]).sort()\n\nexport const getCultures = (): CultureType[] => cultures\n\nexport const getDefaultUnits = (culture?: CultureType): UnitsData =>\n culture ? filter(defaultUnits, unit => !unit.culture || unit.culture === culture) : defaultUnits\nexport const getDefaultUnit = (type: UnitType): UnitData => defaultUnits[type]\n\ninterface UnitJSON {\n Parent: string | null\n Type: string\n Mode?: string\n Culture?: string\n Role?: string\n Tech?: number\n}\n","import {\n GovermentType,\n CountryName,\n CultureType,\n CountryAttribute,\n UnitAttribute,\n Selections,\n CountryDefinitions,\n CountryDefinition,\n SelectionType\n} from 'types'\nimport { getDefaultArmies } from 'data'\nimport { getDefaultUnits } from './units'\nimport { ObjSet } from 'utils'\n\nexport const getDefaultCountry = (name: CountryName): CountryDefinition => ({\n name,\n modifiers: {\n selections: {\n [SelectionType.Policy]: {\n // All army expense policies include the same levy size.\n // So better just select it by default even though it's only used for importing.\n expense_army_default: true\n } as ObjSet\n } as Selections,\n government: GovermentType.Republic,\n culture: 'Western' as CultureType,\n baseValues: {\n [CountryAttribute.FlankRatio]: {\n Base: 0.5\n },\n [CountryAttribute.OmenPower]: {\n Base: 100\n },\n [CountryAttribute.MartialTech]: {\n Base: process.env.REACT_APP_GAME === 'EU4' ? 3 : 0\n }\n } as never\n },\n\n armies: getDefaultArmies(),\n units: getDefaultUnits(process.env.REACT_APP_GAME === 'EU4' ? ('Western' as CultureType) : undefined),\n\n weariness: { [UnitAttribute.Morale]: { min: 0, max: 0 }, [UnitAttribute.Strength]: { min: 0, max: 0 } }\n})\n\nexport const getDefaultCountryDefinitions = (): CountryDefinitions => ({\n [CountryName.Country1]: getDefaultCountry(CountryName.Country1),\n [CountryName.Country2]: getDefaultCountry(CountryName.Country2)\n})\n","import { groupBy } from 'lodash'\nimport { DeityDefinition, DictionaryData, DataEntry, CultureData, RegionData, Modifier } from 'types'\n\nimport traditionData from './json/ir/traditions.json'\nimport tradeData from './json/ir/trades.json'\nimport heritageData from './json/ir/heritages.json'\nimport cultureData from './json/ir/cultures.json'\nimport inventionData from './json/ir/inventions.json'\nimport traitData from './json/ir/traits.json'\nimport lawData from './json/ir/laws.json'\nimport policyData from './json/ir/policies.json'\nimport ideaData from './json/ir/ideas.json'\nimport abilityData from './json/ir/abilities.json'\nimport countryData from './json/ir/countries.json'\nimport territoryData from './json/ir/territories.json'\nimport deityData from './json/ir/deities.json'\nimport religionData from './json/ir/religions.json'\nimport factionData from './json/ir/parties.json'\nimport effectData from './json/ir/effects.json'\nimport distinctionData from './json/ir/distinctions.json'\nimport regionData from './json/ir/regions.json'\nimport { toObj } from 'utils'\n\ntype Key = string | number\ntype Get = S extends Key[] ? T[] : T\ntype GetName = S extends Key[] ? string[] : string\n\nconst buildData = (data: unknown[]) => {\n const byIndex = Array.from(data) as T[]\n const byIndexFiltered = byIndex.filter(item => item.relevant)\n const byKey = toObj(byIndex, item => item.key)\n const byKeyFiltered = toObj(byIndexFiltered, item => item.key)\n const byParent = groupBy(byIndex, item => item.parent)\n const byParentFiltered = groupBy(byIndexFiltered, item => item.parent)\n const siblings = (key: string) => byParent[byKey[key].parent ?? '']\n const siblingKeys = (key: string) => siblings(key).map(item => item.key)\n const getOne = (key: Key) => (typeof key === 'string' ? byKey[key] : byIndex[key])\n const get = (key: S): Get => {\n if (Array.isArray(key)) return (key as Key[]).map(getOne).filter(item => item) as Get\n return getOne(key as never) as Get\n }\n const getName = (key: S): GetName => {\n const items = get(key)\n if (Array.isArray(items)) return items.map(item => item.name) as GetName\n return ((items as T)?.name ?? '') as GetName\n }\n const getModifiers = (key: S): Modifier[] => {\n const items = get(key)\n if (Array.isArray(items)) return items.map(item => item.modifiers).flat()\n return (items as T)?.modifiers ?? []\n }\n return {\n byIndex: (filter = false) => (filter ? byIndexFiltered : byIndex),\n byKey: (filter = false) => (filter ? byKeyFiltered : byKey),\n byParent: (filter = false) => (filter ? byParentFiltered : byParent),\n siblings,\n siblingKeys,\n get,\n getName,\n getModifiers\n }\n}\n\nexport const abilitiesIR = buildData(process.env.REACT_APP_GAME === 'IR' ? abilityData : [])\nexport const policiesIR = buildData(process.env.REACT_APP_GAME === 'IR' ? policyData : [])\nexport const lawsIR = buildData(process.env.REACT_APP_GAME === 'IR' ? lawData : [])\nexport const traditionsIR = buildData(process.env.REACT_APP_GAME === 'IR' ? traditionData : [])\nexport const distinctionsIR = buildData(process.env.REACT_APP_GAME === 'IR' ? distinctionData : [])\nexport const ideasIR = buildData(process.env.REACT_APP_GAME === 'IR' ? ideaData : [])\nexport const traitsIR = buildData(process.env.REACT_APP_GAME === 'IR' ? traitData : [])\nexport const inventionsIR = buildData(process.env.REACT_APP_GAME === 'IR' ? inventionData : [])\nexport const heritagesIR = buildData(process.env.REACT_APP_GAME === 'IR' ? heritageData : [])\nexport const tradesIR = buildData(process.env.REACT_APP_GAME === 'IR' ? tradeData : [])\nexport const deitiesIR = buildData(process.env.REACT_APP_GAME === 'IR' ? deityData : [])\nexport const factionsIR = buildData(process.env.REACT_APP_GAME === 'IR' ? factionData : [])\nexport const religionsIR = buildData(process.env.REACT_APP_GAME === 'IR' ? religionData : [])\nexport const effectsIR = buildData(process.env.REACT_APP_GAME === 'IR' ? effectData : [])\n\nexport const countriesIR = process.env.REACT_APP_GAME === 'IR' ? countryData : ({} as DictionaryData)\nexport const territoriesIR = process.env.REACT_APP_GAME === 'IR' ? territoryData : ({} as DictionaryData)\nexport const culturesIR = process.env.REACT_APP_GAME === 'IR' ? cultureData : ({} as CultureData)\nexport const regionsIR = process.env.REACT_APP_GAME === 'IR' ? regionData : ({} as RegionData)\n","import { DataEntryEU4 } from 'types'\n\nimport techDataEU4 from './json/eu4/tech.json'\nimport policyDataEU4 from './json/eu4/policies.json'\n\nexport type ListDefinitions = Record\n\n// Bit ugly but these enable tree shaking based on the game.\nexport const techEU4 = process.env.REACT_APP_GAME === 'EU4' ? (Array.from(techDataEU4) as DataEntryEU4[]) : []\nexport const policiesEU4 = process.env.REACT_APP_GAME === 'EU4' ? (policyDataEU4 as ListDefinitions) : {}\n","export const laws = [\n 'succession_law',\n 'monarchy_military_reforms',\n 'monarchy_maritime_laws',\n 'monarchy_economic_law',\n 'monarchy_citizen_law',\n 'monarchy_religious_laws',\n 'monarchy_legitimacy_laws',\n 'monarchy_contract_law',\n 'monarchy_divinity_statutes',\n 'monarchy_subject_laws',\n 'republic_military_recruitment_laws',\n 'republic_election_reforms',\n 'corruption_laws',\n 'republican_mediterranean_laws',\n 'republican_religious_laws',\n 'republic_integration_laws',\n 'republic_citizen_laws',\n 'republican_land_reforms',\n 'republic_military_recruitment_laws_rom',\n 'republic_election_reforms_rom',\n 'corruption_laws_rom',\n 'republican_mediterranean_laws_rom',\n 'republican_religious_laws_rom',\n 'republic_integration_laws_rom',\n 'republic_citizen_laws_rom',\n 'republican_land_reforms_rom',\n 'tribal_religious_law',\n 'tribal_currency_laws',\n 'tribal_centralization_law',\n 'tribal_authority_laws',\n 'tribal_autonomy_laws',\n 'tribal_domestic_laws',\n 'tribal_decentralized_laws',\n 'tribal_centralized_laws',\n 'tribal_super_decentralized_laws',\n 'tribal_super_centralized_laws'\n] as const\n","import configIR from './json/ir/config.json'\n\nexport const getConfig = () => configIR\n","import {\n Mode,\n CombatModeSettings,\n Setting,\n CombatSharedSettings,\n SimulationSpeed,\n Settings,\n DisciplineValue,\n SupportDeployValue,\n CounteringMode\n} from 'types'\nimport { getConfig } from './config'\n\nexport const getDefaultSettings = (): Settings => ({\n modeSettings: { [Mode.Land]: getDefaultLandSettings(), [Mode.Naval]: getDefaultNavalSettings() },\n sharedSettings: getDefaultSharedSettings()\n})\n\nexport const getDefaultLandSettings = (): CombatModeSettings => {\n if (process.env.REACT_APP_GAME === 'EU4') {\n return {\n [Setting.StrengthLostMultiplier]: 5,\n [Setting.MoraleLostMultiplier]: 25 / 2.7,\n [Setting.StackWipeCaptureChance]: 0\n }\n } else {\n return {\n [Setting.StrengthLostMultiplier]: getConfig().Land.StrengthDamage,\n [Setting.MoraleLostMultiplier]: getConfig().Land.MoraleDamage,\n [Setting.StackWipeCaptureChance]: getConfig().Land.StackWipeCaptureChance\n }\n }\n}\n\nexport const getDefaultNavalSettings = (): CombatModeSettings => {\n if (process.env.REACT_APP_GAME === 'EU4') {\n return {\n [Setting.StrengthLostMultiplier]: 5,\n [Setting.MoraleLostMultiplier]: 25 / 2.7,\n [Setting.StackWipeCaptureChance]: 0\n }\n } else {\n return {\n [Setting.StrengthLostMultiplier]: getConfig().Naval.StrengthDamage,\n [Setting.MoraleLostMultiplier]: getConfig().Naval.MoraleDamage,\n [Setting.StackWipeCaptureChance]: getConfig().Naval.StackWipeCaptureChance\n }\n }\n}\n\nexport const getDefaultSharedSettings = (): CombatSharedSettings => {\n if (process.env.REACT_APP_GAME === 'EU4') {\n return {\n [Setting.GlobalTargeting]: false,\n [Setting.MaxCountering]: 0,\n [Setting.CounteringDamage]: 0,\n [Setting.CounteringMode]: CounteringMode.Default,\n [Setting.BasePips]: 3,\n [Setting.MaxPips]: 100,\n [Setting.MaxGeneral]: 6,\n [Setting.DiceMinimum]: 0,\n [Setting.DiceMaximum]: 9,\n [Setting.PhaseLength]: 3,\n [Setting.RetreatRounds]: 12,\n [Setting.StackwipeRounds]: 12,\n [Setting.Stackwipe]: true,\n [Setting.SoftStackWipeLimit]: 2,\n [Setting.HardStackWipeLimit]: 10,\n [Setting.BaseCombatWidth]: 15,\n [Setting.ExperienceDamageReduction]: 0,\n [Setting.MinimumMorale]: 0,\n [Setting.MinimumStrength]: 0,\n [Setting.MoraleHitForNonSecondaryReinforcement]: 0,\n [Setting.MoraleHitForLateDeployment]: 0,\n [Setting.MoraleGainForWinning]: 0.5,\n [Setting.FixExperience]: false,\n [Setting.DefenderAdvantage]: false,\n [Setting.FixFlankTargeting]: false,\n [Setting.BackRow]: true,\n [Setting.RelativePips]: false,\n [Setting.DynamicTargeting]: true,\n [Setting.BackRowRetreat]: false,\n [Setting.StrengthBasedFlank]: true,\n [Setting.AttributeDiscipline]: DisciplineValue.Both,\n [Setting.DailyMoraleLoss]: 0.03,\n [Setting.DailyDamageIncrease]: 0.01,\n [Setting.UseMaxMorale]: true,\n [Setting.FireAndShock]: true,\n [Setting.InsufficientSupportPenalty]: 0.25,\n [Setting.AttributeCombatAbility]: true,\n [Setting.SupportPhase]: SupportDeployValue.On,\n [Setting.AttributeDamage]: true,\n [Setting.AttributeDrill]: true,\n [Setting.AttributeLoyal]: false,\n [Setting.AttributeExperience]: false,\n [Setting.AttributeMilitaryTactics]: true,\n [Setting.AttributeMoraleDamage]: false,\n [Setting.AttributeOffenseDefense]: false,\n [Setting.AttributeStrengthDamage]: false,\n [Setting.AttributeTerrainType]: false,\n [Setting.Tactics]: false,\n [Setting.Martial]: false,\n [Setting.AttackerSwapping]: true,\n [Setting.CustomDeployment]: false,\n [Setting.DynamicFlanking]: true,\n [Setting.Tech]: true,\n [Setting.Culture]: true,\n [Setting.Food]: false,\n [Setting.Precision]: 3,\n [Setting.AutoRefresh]: true,\n [Setting.MoraleDamageBasedOnTargetStrength]: false,\n [Setting.DamageLossForMissingMorale]: 0,\n [Setting.CohortSize]: 1000,\n [Setting.RequiredCrossingSupport]: 1,\n // Analyze\n [Setting.Performance]: SimulationSpeed.Fast,\n [Setting.ChunkSize]: 1000,\n [Setting.MaxPhases]: speedValues[SimulationSpeed.Fast][1],\n [Setting.PhasesPerRoll]: speedValues[SimulationSpeed.Fast][0],\n [Setting.ReduceRolls]: speedValues[SimulationSpeed.Fast][2],\n [Setting.CalculateWinChance]: true,\n [Setting.CalculateCasualties]: true,\n [Setting.CalculateResourceLosses]: true,\n [Setting.ShowGraphs]: false\n }\n } else {\n return {\n [Setting.GlobalTargeting]: false,\n [Setting.MaxCountering]: 100,\n [Setting.CounteringDamage]: 1,\n [Setting.CounteringMode]: CounteringMode.Default,\n [Setting.BasePips]: getConfig().BasePips,\n [Setting.MaxPips]: getConfig().MaxPips,\n [Setting.MaxGeneral]: 100,\n [Setting.DiceMinimum]: getConfig().DiceMinimum,\n [Setting.DiceMaximum]: getConfig().DiceMaximum,\n [Setting.PhaseLength]: getConfig().PhaseLength,\n [Setting.RetreatRounds]: 0,\n [Setting.StackwipeRounds]: getConfig().PhaseLength,\n [Setting.Stackwipe]: true,\n [Setting.SoftStackWipeLimit]: getConfig().SoftStackWipeLimit,\n [Setting.HardStackWipeLimit]: getConfig().HardStackWipeLimit,\n [Setting.BaseCombatWidth]: getConfig().CombatWidth,\n [Setting.ExperienceDamageReduction]: getConfig().ExperienceDamageReduction,\n [Setting.MinimumMorale]: getConfig().MinimumMorale,\n [Setting.MinimumStrength]: getConfig().MinimumStrength,\n [Setting.MoraleHitForNonSecondaryReinforcement]: getConfig().MoraleHitForNonSecondaryReinforcement,\n [Setting.MoraleHitForLateDeployment]: getConfig().MoraleHitForLateDeployment,\n [Setting.MoraleGainForWinning]: 0,\n [Setting.FixExperience]: false,\n [Setting.DefenderAdvantage]: false,\n [Setting.FixFlankTargeting]: true,\n [Setting.DynamicTargeting]: false,\n [Setting.BackRow]: false,\n [Setting.RelativePips]: false,\n [Setting.BackRowRetreat]: false,\n [Setting.StrengthBasedFlank]: false,\n [Setting.SupportPhase]: SupportDeployValue.Separately,\n [Setting.Precision]: 5,\n [Setting.ChunkSize]: 1000,\n [Setting.MaxPhases]: speedValues[SimulationSpeed.Fast][1],\n [Setting.PhasesPerRoll]: speedValues[SimulationSpeed.Fast][0],\n [Setting.Performance]: SimulationSpeed.Fast,\n [Setting.ReduceRolls]: speedValues[SimulationSpeed.Fast][2],\n [Setting.CalculateWinChance]: true,\n [Setting.CalculateCasualties]: true,\n [Setting.CalculateResourceLosses]: true,\n [Setting.ShowGraphs]: false,\n [Setting.AttributeDiscipline]: DisciplineValue.Damage,\n [Setting.DailyMoraleLoss]: 0,\n [Setting.DailyDamageIncrease]: 0,\n [Setting.UseMaxMorale]: false,\n [Setting.FireAndShock]: false,\n [Setting.InsufficientSupportPenalty]: 0.0,\n [Setting.AttributeCombatAbility]: false,\n [Setting.AttributeDamage]: true,\n [Setting.AttributeDrill]: false,\n [Setting.AttributeExperience]: true,\n [Setting.AttributeLoyal]: true,\n [Setting.AttributeMilitaryTactics]: false,\n [Setting.AttributeMoraleDamage]: true,\n [Setting.AttributeOffenseDefense]: true,\n [Setting.AttributeStrengthDamage]: true,\n [Setting.AttributeTerrainType]: true,\n [Setting.Tactics]: true,\n [Setting.Martial]: true,\n [Setting.AttackerSwapping]: true,\n [Setting.CustomDeployment]: true,\n [Setting.DynamicFlanking]: false,\n [Setting.Tech]: false,\n [Setting.Culture]: false,\n [Setting.Food]: true,\n [Setting.AutoRefresh]: true,\n [Setting.MoraleDamageBasedOnTargetStrength]: false,\n [Setting.DamageLossForMissingMorale]: 0,\n [Setting.CohortSize]: getConfig().CohortSize,\n [Setting.RequiredCrossingSupport]: getConfig().RequiredCrossingSupport\n }\n }\n}\n\nexport const speedValues: { [key: string]: number[] } =\n process.env.REACT_APP_GAME === 'EU4'\n ? {\n [SimulationSpeed.VeryAccurate]: [1, 10, 0],\n [SimulationSpeed.Accurate]: [1, 10, 1],\n [SimulationSpeed.Normal]: [2, 10, 1],\n [SimulationSpeed.Fast]: [2, 10, 2],\n [SimulationSpeed.VeryFast]: [2, 10, 3]\n }\n : {\n [SimulationSpeed.VeryAccurate]: [1, 6, 0],\n [SimulationSpeed.Accurate]: [1, 6, 0],\n [SimulationSpeed.Normal]: [2, 6, 0],\n [SimulationSpeed.Fast]: [2, 6, 1],\n [SimulationSpeed.VeryFast]: [2, 6, 2]\n }\n","export default __webpack_public_path__ + \"static/media/bottleneck.137aaa20.png\";","export default __webpack_public_path__ + \"static/media/cavalry_skirmish.1547ba92.png\";","export default __webpack_public_path__ + \"static/media/deception.e96aa474.png\";","export default __webpack_public_path__ + \"static/media/envelopment.321ac4c8.png\";","export default __webpack_public_path__ + \"static/media/hit_and_run.d86bbdc3.png\";","export default __webpack_public_path__ + \"static/media/padma_vyuha.1cc2f981.png\";","export default __webpack_public_path__ + \"static/media/phalanx.eb0b05fb.png\";","export default __webpack_public_path__ + \"static/media/shock_action.44bd7bf3.png\";","export default __webpack_public_path__ + \"static/media/skirmishing.f08ebbe8.png\";","export default __webpack_public_path__ + \"static/media/triplex_acies.40129df1.png\";","export default __webpack_public_path__ + \"static/media/frontal_assault.ad7ac2cc.png\";","export default __webpack_public_path__ + \"static/media/naval_envelopment.5da6d341.png\";","export default __webpack_public_path__ + \"static/media/harassment.f6a4e83b.png\";","export default __webpack_public_path__ + \"static/media/probing_attack.cc1eb1e2.png\";","export default __webpack_public_path__ + \"static/media/close_ranks.ce258895.png\";","import { ValuesType, Mode, TacticType, TacticCalc, TacticData, TacticValueType, UnitType, TacticsData } from 'types'\nimport { toObj } from 'utils'\n\nimport * as data from './json/ir/tactics.json'\nimport IconBottleneck from 'images/bottleneck.png'\nimport IconCavalrySkirmish from 'images/cavalry_skirmish.png'\nimport IconDeception from 'images/deception.png'\nimport IconEnvelopment from 'images/envelopment.png'\nimport IconHitAndRun from 'images/hit_and_run.png'\nimport IconPadmaVyuha from 'images/padma_vyuha.png'\nimport IconPhalanx from 'images/phalanx.png'\nimport IconShockAction from 'images/shock_action.png'\nimport IconSkirmishing from 'images/skirmishing.png'\nimport IconTriplexAcies from 'images/triplex_acies.png'\nimport IconFrontalAssault from 'images/frontal_assault.png'\nimport IconNavalEnvelopment from 'images/naval_envelopment.png'\nimport IconHarassment from 'images/harassment.png'\nimport IconProbingAttack from 'images/probing_attack.png'\nimport IconCloseRanks from 'images/close_ranks.png'\nimport { addValues } from '../data_values'\n\nconst tacticToIcon: { [key in TacticType]: string } = {\n [TacticType.Bottleneck]: IconBottleneck,\n [TacticType.CavalrySkirmish]: IconCavalrySkirmish,\n [TacticType.Deception]: IconDeception,\n [TacticType.Envelopment]: IconEnvelopment,\n [TacticType.HitAndRun]: IconHitAndRun,\n [TacticType.PadmaVyuha]: IconPadmaVyuha,\n [TacticType.Phalanx]: IconPhalanx,\n [TacticType.ShockAction]: IconShockAction,\n [TacticType.Skirmishing]: IconSkirmishing,\n [TacticType.TriplexAcies]: IconTriplexAcies,\n [TacticType.FrontalAssault]: IconFrontalAssault,\n [TacticType.NavalEnvelopment]: IconNavalEnvelopment,\n [TacticType.Harassment]: IconHarassment,\n [TacticType.ProbingAttack]: IconProbingAttack,\n [TacticType.CloseRanks]: IconCloseRanks\n}\n\nexport const getTacticIcon = (type: TacticType) => tacticToIcon[type] || ''\n\nconst createTacticFromJson = (data: TacticJSON): TacticData => {\n const tactic: TacticData = {\n type: data.type as TacticType,\n mode: data.mode as Mode,\n image: tacticToIcon[data.type as TacticType] || ''\n }\n const baseValues: [TacticValueType, number][] = [\n [UnitType.Archers, data.archers || 0],\n [UnitType.CamelCavalry, data.camel_cavalry || 0],\n [UnitType.Chariots, data.chariots || 0],\n [UnitType.HeavyCavalry, data.heavy_cavalry || 0],\n [UnitType.HeavyInfantry, data.heavy_infantry || 0],\n [UnitType.HorseArchers, data.horse_archers || 0],\n [UnitType.LightCavalry, data.light_cavalry || 0],\n [UnitType.LightInfantry, data.light_infantry || 0],\n [UnitType.WarElephants, data.war_elephants || 0],\n [UnitType.Liburnian, data.liburnian || 0],\n [UnitType.Trireme, data.trireme || 0],\n [UnitType.Tetrere, data.tetrere || 0],\n [UnitType.Hexere, data.hexere || 0],\n [UnitType.Octere, data.octere || 0],\n [UnitType.MegaPolyreme, data.mega_polyreme || 0],\n [TacticCalc.Casualties, data.casualties || 0],\n [TacticType.Bottleneck, data.bottleneck || 0],\n [TacticType.CavalrySkirmish, data.cavalry_skirmish || 0],\n [TacticType.Deception, data.deception || 0],\n [TacticType.Envelopment, data.envelopment || 0],\n [TacticType.HitAndRun, data.hit_and_run || 0],\n [TacticType.PadmaVyuha, data.padma_vyuha || 0],\n [TacticType.Phalanx, data.phalanx || 0],\n [TacticType.ShockAction, data.shock_action || 0],\n [TacticType.Skirmishing, data.skirmishing || 0],\n [TacticType.TriplexAcies, data.triplex_acies || 0],\n [TacticType.FrontalAssault, data.frontal_assault || 0],\n [TacticType.NavalEnvelopment, data.naval_envelopment || 0],\n [TacticType.CloseRanks, data.close_ranks || 0],\n [TacticType.Harassment, data.harassment || 0],\n [TacticType.ProbingAttack, data.probing_attack || 0]\n ]\n return addValues(tactic, ValuesType.Base, tactic.type, baseValues)\n}\n\nconst initializeDefaultTerrains = (): TacticsData => {\n if (process.env.REACT_APP_GAME === 'EU4') return {} as TacticsData\n else return toObj(data.tactics.map(createTacticFromJson), item => item.type)\n}\n\nconst defaultTactics = initializeDefaultTerrains()\n\nexport const getDefaultTactics = () => defaultTactics\nexport const getDefaultTactic = (type: TacticType): TacticData => defaultTactics[type]\n\nexport const getDefaultTacticState = () => getDefaultTactics()\n\ninterface TacticJSON {\n type: string\n mode: string\n archers?: number\n camel_cavalry?: number\n chariots?: number\n heavy_cavalry?: number\n heavy_infantry?: number\n horse_archers?: number\n light_cavalry?: number\n light_infantry?: number\n war_elephants?: number\n liburnian?: number\n trireme?: number\n tetrere?: number\n hexere?: number\n octere?: number\n mega_polyreme?: number\n bottleneck?: number\n cavalry_skirmish?: number\n deception?: number\n envelopment?: number\n hit_and_run?: number\n padma_vyuha?: number\n phalanx?: number\n shock_action?: number\n skirmishing?: number\n triplex_acies?: number\n casualties?: number\n frontal_assault?: number\n naval_envelopment?: number\n close_ranks?: number\n harassment?: number\n probing_attack?: number\n}\n","export default __webpack_public_path__ + \"static/media/terrain.8a63d9d1.png\";","import { ValuesType, TerrainType, LocationType, TerrainCalc, TerrainData, TerrainValueType, TerrainsData } from 'types'\nimport { addValues } from 'data_values'\nimport { toObj } from 'utils'\n\nimport dataIR from './json/ir/terrains.json'\nimport dataEU4 from './json/eu4/terrains.json'\nimport IconTerrain from 'images/terrain.png'\n\nconst createTerrainFromJson = (data: TerrainJSON): TerrainData => {\n const terrain: TerrainData = {\n type: data.type as TerrainType,\n image: IconTerrain,\n location: data.location as LocationType\n }\n const baseValues: [TerrainValueType, number][] = [\n [TerrainCalc.Roll, data.roll],\n [TerrainCalc.CombatWidth, data.combat_width]\n ]\n return addValues(terrain, ValuesType.Base, terrain.type, baseValues)\n}\n\nconst initializeDefaultTerrains = (): TerrainsData => {\n const data = process.env.REACT_APP_GAME === 'EU4' ? Array.from(dataEU4.terrain) : Array.from(dataIR)\n return toObj(data.map(createTerrainFromJson), item => item.type)\n}\n\nconst defaultTerrains = initializeDefaultTerrains()\n\nexport const getDefaultTerrains = () => defaultTerrains\nexport const getDefaultTerrain = (type: TerrainType) => defaultTerrains[type]\n\ninterface TerrainJSON {\n type: string\n location: string\n roll: number\n combat_width: number\n}\n\nexport const getDefaultTerrainState = () => getDefaultTerrains()\n","import {\n Countries,\n CountryName,\n CountryDefinition,\n GovermentType,\n CultureType,\n CountryAttribute,\n ValuesType,\n WearinessAttribute,\n Country,\n isAttributeEnabled,\n ModifierWithKey,\n CombatSharedSettings,\n ModifierType,\n SelectionType,\n Selections,\n ArmyName,\n Mode,\n CountryModifiers,\n Armies,\n CountryData\n} from 'types'\nimport { getDefaultUnits, getDefaultArmies, getDefaultCountry } from 'data'\nimport { addValuesWithMutate, clearAllValuesWithMutate, calculateValue, addValue } from 'data_values'\nimport { toObj, values, filter } from 'utils'\nimport { getCountryModifiers } from './modifiers'\n\nexport const createCountry = (countries: Countries, country: CountryName, source?: CountryName): void => {\n countries[country] = source ? countries[source] : getDefaultCountry(country)\n}\nexport const importCountry = (countries: Countries, country: CountryData): void => {\n countries[country.name] = country\n}\n\nexport const deleteCountry = (countries: Countries, country: CountryName): void => {\n delete countries[country]\n}\n\nexport const changeCountryName = (countries: Countries, oldCountry: CountryName, country: CountryName): void => {\n delete Object.assign(countries, { [country]: countries[oldCountry] })[oldCountry]\n countries[country].name = country\n}\n\nexport const setCountryAttribute = (country: CountryDefinition, attribute: CountryAttribute, value: number): void => {\n addValuesWithMutate(country.modifiers, ValuesType.Base, 'Custom', [[attribute, value]])\n}\n\nexport const clearCountryAttributes = (country: CountryDefinition): void => {\n clearAllValuesWithMutate(country.modifiers, 'Custom')\n}\n\nexport const selectGovernment = (country: CountryDefinition, government: GovermentType): void => {\n country.modifiers.government = government\n}\n\nexport const selectCulture = (country: CountryDefinition, culture: CultureType, loadAllUnits: boolean): void => {\n country.modifiers.culture = culture\n country.units = getDefaultUnits(loadAllUnits ? undefined : culture)\n}\n\nexport const enableCountrySelection = (country: CountryDefinition, type: SelectionType, key: string): void => {\n if (!country.modifiers.selections[type]) country.modifiers.selections[type] = {}\n country.modifiers.selections[type][key] = true\n}\n\nexport const enableCountrySelections = (country: CountryDefinition, type: SelectionType, keys: string[]): void => {\n keys.forEach(key => enableCountrySelection(country, type, key))\n}\n\nexport const clearCountrySelection = (country: CountryDefinition, type: SelectionType, key: string): void => {\n if (country.modifiers.selections[type]) delete country.modifiers.selections[type][key]\n}\n\nexport const clearCountrySelections = (country: CountryDefinition, type?: SelectionType, keys?: string[]): void => {\n if (keys && type) keys.forEach(key => clearCountrySelection(country, type, key))\n else if (type) delete country.modifiers.selections[type]\n else country.modifiers.selections = {} as Selections\n}\n\nexport const changeWeariness = (\n country: CountryDefinition,\n type: WearinessAttribute,\n min: number,\n max: number\n): void => {\n country.weariness[type].min = min\n country.weariness[type].max = max\n}\n\nexport const applyCountryModifiers = (country: CountryModifiers, modifiers: ModifierWithKey[]): CountryModifiers => {\n modifiers\n .filter(value => value.target === ModifierType.Country)\n .forEach(value => {\n country = addValue(country, value.type, value.key, value.attribute, value.value)\n })\n return country\n}\n\nexport const convertCountryData = (country: CountryData) => {\n const modifiers = getCountryModifiers(country.modifiers)\n return { ...country, modifiers: applyCountryModifiers(country.modifiers, modifiers) }\n}\n\nexport const convertCountryDefinition = (country: CountryDefinition, settings?: CombatSharedSettings): Country => {\n const attributes = values(CountryAttribute)\n const calculated = toObj(\n attributes,\n attribute => attribute,\n attribute =>\n !settings || isAttributeEnabled(attribute, settings) ? calculateValue(country.modifiers, attribute) : 0\n )\n return {\n ...calculated,\n selections: country.modifiers.selections,\n weariness: country.weariness,\n name: country.name,\n culture: country.modifiers.culture\n }\n}\n\nexport const createArmy = (country: CountryDefinition, armyName: ArmyName, mode: Mode, source?: ArmyName): void => {\n country.armies[armyName] = source\n ? country.armies[source]\n : getDefaultArmies()[mode === Mode.Land ? ArmyName.Army : ArmyName.Navy]\n}\n\nexport const deleteArmy = (country: CountryDefinition, armyName: ArmyName): void => {\n delete country.armies[armyName]\n}\n\nexport const changeArmyName = (country: CountryDefinition, oldArmyName: ArmyName, armyName: ArmyName): void => {\n delete Object.assign(country.armies, { [armyName]: country.armies[oldArmyName] })[oldArmyName]\n}\n\nexport const filterArmies = (armies: Armies, mode: Mode) => filter(armies, army => army.mode === mode)\n","import {\n Modifier,\n ModifierType,\n Mode,\n ModifierWithKey,\n CountryAttribute,\n GeneralData,\n CharacterAttribute,\n SelectionType,\n CountryModifiers,\n Selections,\n DataEntry,\n DeityDefinition,\n DataEntryEU4\n} from 'types'\nimport { getRootParent } from './units'\nimport { ObjSet, keys } from 'utils'\nimport { calculateValue } from 'data_values'\nimport {\n techEU4,\n inventionsIR,\n heritagesIR,\n tradesIR,\n ideasIR,\n religionsIR,\n factionsIR,\n effectsIR,\n deitiesIR,\n traitsIR,\n policiesEU4,\n abilitiesIR,\n policiesIR,\n traditionsIR,\n lawsIR,\n distinctionsIR\n} from 'data'\nimport { applyCountryModifiers } from './countries'\n\nexport const TECH_KEY = 'Tech '\n\nexport const getDynamicEffect = (key: string, value: number): ModifierWithKey[] => {\n const effect = effectsIR.get(key)\n if (!effect) return []\n return effect.modifiers.map(modifier => ({\n ...modifier,\n key: effect.name,\n value: modifier.value * value\n }))\n}\n\nconst getEffect = (key: string): ModifierWithKey[] => getDynamicEffect(key, 1.0)\n\nexport const mapModifiersToUnits = (modifiers: Modifier[]): Modifier[] => {\n const mapped: Modifier[] = []\n modifiers.forEach(modifier => {\n if (modifier.target === ModifierType.Text) return\n if (modifier.target in Mode) {\n mapped.push({ ...modifier, target: getRootParent(modifier.target as Mode) })\n return\n }\n if (modifier.target === ModifierType.Global) {\n mapped.push({ ...modifier, target: getRootParent(Mode.Naval) })\n mapped.push({ ...modifier, target: getRootParent(Mode.Land) })\n return\n }\n mapped.push(modifier)\n })\n return mapped\n}\n\nexport const mapModifiersToUnits2 = (modifiers: ModifierWithKey[]): ModifierWithKey[] => {\n const mapped: ModifierWithKey[] = []\n modifiers.forEach(modifier => {\n if (modifier.target === ModifierType.Text) return\n if (modifier.target in Mode) {\n mapped.push({ ...modifier, target: getRootParent(modifier.target as Mode) })\n return\n }\n if (modifier.target === ModifierType.Global) {\n mapped.push({ ...modifier, target: getRootParent(Mode.Naval) })\n mapped.push({ ...modifier, target: getRootParent(Mode.Land) })\n return\n }\n mapped.push(modifier)\n })\n return mapped\n}\n\nconst mapModifiers = (key: string, modifiers: Modifier[]) =>\n modifiers.map(value => ({ key, ...value })) as ModifierWithKey[]\n\nconst getTechModifiers = (modifiers: ModifierWithKey[], country: CountryModifiers) => {\n const selections = country.selections[SelectionType.Invention] ?? {}\n const techLevel = calculateValue(country, CountryAttribute.MartialTech)\n if (process.env.REACT_APP_GAME === 'EU4') {\n techEU4.forEach((tech, level) => {\n if (level > techLevel) return\n modifiers.push(...mapModifiers(TECH_KEY + level, tech.modifiers))\n })\n }\n if (process.env.REACT_APP_GAME === 'IR') {\n getModifiers(modifiers, selections, inventionsIR.get)\n }\n return modifiers\n}\n\nconst getDeityModifiers = (\n modifiers: ModifierWithKey[],\n selections: ObjSet,\n items: (key: string[]) => DeityDefinition[],\n omenPower: number\n) => {\n const selectedItems = items(keys(selections))\n selectedItems.forEach(item => {\n const effects = item.isOmen\n ? item.modifiers.map(modifier => ({ ...modifier, value: (modifier.value * omenPower) / 100.0 }))\n : item.modifiers\n modifiers.push(...mapModifiers(item.name, effects))\n })\n}\n\nconst getModifiersFromObject = (\n modifiers: ModifierWithKey[],\n selections: ObjSet | undefined,\n items: Record\n) => {\n const selectedKeys = keys(selections ?? {})\n selectedKeys.forEach(key => {\n if (items[key]) modifiers.push(...mapModifiers(items[key].name, items[key].modifiers))\n })\n}\n\nconst getModifiers = (\n modifiers: ModifierWithKey[],\n selections: ObjSet | undefined,\n items: (key: string[]) => DataEntry[]\n) => {\n const selectedItems = items(keys(selections))\n selectedItems.forEach(item => {\n modifiers.push(...mapModifiers(item.name, item.modifiers))\n })\n}\nconst getCountryAttribute = (country: CountryModifiers, attribute: CountryAttribute, key: string) => {\n const value = calculateValue(country, attribute)\n return value ? getDynamicEffect(key, value) : []\n}\n\nconst getOfficeModifiers = (modifiers: ModifierWithKey[], country: CountryModifiers) => {\n modifiers.push(...getCountryAttribute(country, CountryAttribute.MilitaryExperience, 'military_experience'))\n modifiers.push(...getCountryAttribute(country, CountryAttribute.MartialTech, 'military_tech'))\n}\n\nconst getPrimaryCountryModifiers = (country: CountryModifiers) => {\n const modifiers: ModifierWithKey[] = []\n getTechModifiers(modifiers, country)\n getOfficeModifiers(modifiers, country)\n if (process.env.REACT_APP_GAME === 'EU4') {\n getModifiersFromObject(modifiers, country.selections[SelectionType.Policy], policiesEU4)\n }\n if (process.env.REACT_APP_GAME === 'IR') {\n getModifiers(modifiers, country.selections[SelectionType.Heritage], heritagesIR.get)\n getModifiers(modifiers, country.selections[SelectionType.Trade], tradesIR.get)\n getModifiers(modifiers, country.selections[SelectionType.Idea], ideasIR.get)\n getModifiers(modifiers, country.selections[SelectionType.Law], lawsIR.get)\n getModifiers(modifiers, country.selections[SelectionType.Religion], religionsIR.get)\n getModifiers(modifiers, country.selections[SelectionType.Faction], factionsIR.get)\n getModifiers(modifiers, country.selections[SelectionType.Effect], effectsIR.get)\n getModifiers(modifiers, country.selections[SelectionType.Policy], policiesIR.get)\n getModifiers(modifiers, country.selections[SelectionType.Tradition], traditionsIR.get)\n }\n return modifiers\n}\n\nexport const getCountryModifiers = (country: CountryModifiers): ModifierWithKey[] => {\n const primaryModifiers = getPrimaryCountryModifiers(country)\n const secondaryModifiers = getSecondaryCountryModifiers(applyCountryModifiers(country, primaryModifiers))\n return primaryModifiers.concat(secondaryModifiers)\n}\n\n/**\n * Modifiers must be acquired in two steps because modifiers can affect each other.\n * For example Omen Power for omens.\n */\nexport const getSecondaryCountryModifiers = (country: CountryModifiers): ModifierWithKey[] => {\n const modifiers: ModifierWithKey[] = []\n if (process.env.REACT_APP_GAME === 'IR') {\n getDeityModifiers(\n modifiers,\n country.selections[SelectionType.Deity],\n deitiesIR.get,\n calculateValue(country, CountryAttribute.OmenPower)\n )\n }\n return modifiers\n}\n\nexport const getGeneralModifiers = (general: GeneralData): ModifierWithKey[] => {\n const modifiers: ModifierWithKey[] = []\n if (general.enabled) {\n if (process.env.REACT_APP_GAME === 'IR') {\n getModifiers(modifiers, general.selections[SelectionType.Trait], traitsIR.get)\n getModifiers(modifiers, general.selections[SelectionType.Ability], abilitiesIR.get)\n getModifiers(modifiers, general.selections[SelectionType.Distinction], distinctionsIR.get)\n const martial = calculateValue(general, CharacterAttribute.Martial)\n if (martial) modifiers.push(...getDynamicEffect('unit_martial_mod', martial))\n }\n } else {\n modifiers.push(...getEffect('army_leader_less'))\n modifiers.push(...getEffect('navy_leader_less'))\n }\n return modifiers\n}\n\nexport const getSelections = (selections: Selections, type: SelectionType) =>\n selections[type] ? Object.keys(selections[type]) : []\n","import {\n ValuesType,\n UnitValueType,\n UnitType,\n UnitRole,\n UnitData,\n UnitsData,\n Mode,\n Setting,\n UnitAttribute,\n WearinessAttributes,\n ReserveData,\n ModifierWithKey,\n CombatSharedSettings,\n SideType,\n GeneralData,\n CountryDefinition\n} from 'types'\nimport { addValuesWithMutate, calculateValue, addValues, addValue } from 'data_values'\nimport { getUnitIcon } from 'data'\nimport { toArr, round, randomWithinRange } from 'utils'\nimport { getCountryModifiers, getGeneralModifiers, mapModifiersToUnits2 } from './modifiers'\nimport { getConfig } from 'data/config'\n\nexport const setUnitValue = (\n unit: UnitData,\n valuesType: ValuesType,\n key: string,\n attribute: UnitValueType,\n value: number\n) => {\n addValuesWithMutate(unit, valuesType, key, [[attribute, value]])\n}\n\nexport const deleteUnit = (units: UnitsData, type: UnitType) => {\n delete units[type]\n}\n\nexport const createUnit = (units: UnitsData, mode: Mode, type: UnitType) => {\n units[type] = { type, image: getUnitIcon(type), role: UnitRole.Front, parent: getRootParent(mode) }\n}\n\nexport const changeUnitType = (units: UnitsData, oldType: UnitType, type: UnitType) => {\n delete Object.assign(units, { [type]: { ...units[oldType], type } })[oldType]\n}\n\nexport const changeUnitImage = (unit: UnitData, image: string) => {\n unit.image = image\n}\n\nexport const changeUnitDeployment = (unit: UnitData, deployment: UnitRole) => {\n unit.role = deployment\n}\n\nexport const toggleUnitLoyality = (unit: UnitData) => {\n unit.isLoyal = !unit.isLoyal\n}\n\nexport const changeParent = (unit: UnitData, parent: UnitType) => {\n unit.parent = parent\n}\n\nexport const getRootParent = (mode: Mode) => (mode === Mode.Naval ? UnitType.Naval : UnitType.Land)\n\nexport const applyDynamicAttributes = (definition: T, settings: CombatSharedSettings) => {\n if (settings[Setting.AttributeDrill]) {\n const drill = 0.1 * calculateValue(definition, UnitAttribute.Drill)\n definition = addValues(definition, ValuesType.Base, 'From drill', [\n [UnitAttribute.ShockDamageDone, drill],\n [UnitAttribute.FireDamageDone, drill],\n [UnitAttribute.ShockDamageTaken, -drill],\n [UnitAttribute.FireDamageTaken, -drill]\n ])\n }\n if (settings[Setting.StrengthBasedFlank]) {\n const maneuver = getStrengthBasedFlank(calculateValue(definition, UnitAttribute.Strength)) - 1\n definition = addValues(definition, ValuesType.Modifier, 'From losses', [[UnitAttribute.Maneuver, maneuver]])\n if (calculateValue(definition, UnitAttribute.Maneuver) < 1)\n definition = addValues(definition, ValuesType.Loss, 'Minimum cap', [[UnitAttribute.Maneuver, -1]])\n }\n if (definition.isLoyal)\n definition = addValues(definition, ValuesType.Modifier, 'Loyal', [\n [UnitAttribute.Maintenance, getConfig().LoyalMaintenance - 1]\n ])\n return definition\n}\n\nexport const getStrengthBasedFlank = (strength: number) => Math.pow(0.5, 4 - Math.ceil(strength * 4.0))\n\nexport const applyLosses = (values: WearinessAttributes, units: ReserveData) =>\n units.map(unit => addValues(unit, ValuesType.LossModifier, 'Custom', generateLosses(values)))\n\nexport const applyUnitModifiers = (units: UnitsData, modifiers: ModifierWithKey[]): UnitsData => {\n modifiers = mapModifiersToUnits2(modifiers)\n const result = { ...units }\n modifiers.forEach(value => {\n const type = value.target as UnitType\n if (!result[type]) return\n result[type] = addValue(result[type], value.type, value.key, value.attribute, value.value)\n })\n return result\n}\n\nconst generateLosses = (values: WearinessAttributes): [string, number][] =>\n toArr(values, (range, type) => [type, round(randomWithinRange(range.min, range.max), 100)])\n\nexport const getCohortId = (side: SideType, cohort: { index: number; participantIndex: number }) =>\n side + '-' + cohort.participantIndex + '-' + cohort.index\nexport const getCohortName = (cohort: { type: UnitType; index: number; participantIndex: number }) =>\n cohort.type + ' ' + (1000 * cohort.participantIndex + cohort.index)\n\nexport const convertUnitsData = (units: UnitsData, country: CountryDefinition, general: GeneralData) => {\n const countryModifiers = getCountryModifiers(country.modifiers)\n const generalModifiers = getGeneralModifiers(general)\n return applyUnitModifiers(units, countryModifiers.concat(generalModifiers))\n}\n","import {\n calculateValue,\n calculateBase,\n addValuesWithMutate,\n filterValues,\n addValue,\n clearAllValuesWithMutate\n} from 'data_values'\nimport {\n Mode,\n CharacterAttribute,\n UnitType,\n UnitAttribute,\n GeneralData,\n ArmyData,\n CohortData,\n ValuesType,\n UnitValueType,\n TacticType,\n UnitPreferenceType,\n GeneralDefinition,\n ReserveData,\n GeneralValueType,\n CombatPhase,\n isAttributeEnabled,\n UnitDefinitions,\n Setting,\n UnitRole,\n UnitDefinition,\n CombatSharedSettings,\n ModifierWithKey,\n ModifierType,\n Selections,\n SelectionType,\n TacticsData\n} from 'types'\nimport { toObj, toArr, toSet, ObjSet, values } from 'utils'\nimport { findLastIndex, sortBy } from 'lodash'\nimport { getRootParent } from './units'\n\nconst BASE_STAT_KEY = 'Custom'\n\nexport const convertGeneralDefinition = (\n settings: CombatSharedSettings,\n general: GeneralData,\n tactics: TacticsData\n): GeneralDefinition => {\n const base = filterValues(general, BASE_STAT_KEY)\n const attributes = [\n CharacterAttribute.Maneuver,\n CharacterAttribute.Martial,\n CombatPhase.Fire,\n CombatPhase.Shock,\n CombatPhase.Default\n ]\n const baseValues = toObj(\n attributes,\n attribute => attribute,\n attribute => (isAttributeEnabled(attribute, settings) ? calculateValue(base, attribute) : 0)\n )\n const extraValues = toObj(\n attributes,\n attribute => attribute,\n attribute =>\n isAttributeEnabled(attribute, settings) && general.enabled\n ? calculateValue(general, attribute) - calculateValue(base, attribute)\n : 0\n )\n const totalValues = toObj(\n attributes,\n attribute => attribute,\n attribute =>\n isAttributeEnabled(attribute, settings) && general.enabled\n ? Math.min(calculateValue(general, attribute), settings[Setting.MaxGeneral])\n : 0\n )\n return {\n tactic: tactics[general.tactic],\n enabled: general.enabled,\n baseValues,\n values: totalValues,\n extraValues,\n selections: general.selections\n }\n}\n\nexport const overrideRoleWithPreferences = (\n army: ArmyData,\n units: UnitDefinitions,\n latest: { [key in UnitRole]: UnitType | undefined }\n) => {\n const preferences = army.unitPreferences\n return army.reserve.map(cohort => {\n const role = units[cohort.type]?.role\n let override = role && preferences[role]\n if (role && override === UnitType.Latest) override = latest[role]\n if (override) return { ...cohort, type: override }\n return cohort\n })\n}\n\nexport const getUnitList = (\n units: UnitDefinitions,\n mode: Mode,\n filterParents: boolean,\n settings: CombatSharedSettings\n) => {\n const parents = getParents(units)\n let list = settings[Setting.Tech]\n ? [units[UnitType.Land]].concat(getArchetypes(units, mode))\n : sortBy(toArr(units), unit => unitSorter(unit, mode, parents))\n list = filterParents ? list.filter(unit => !parents[unit.type]) : list\n return list\n}\n\nexport const getAllUnitList = (units: UnitDefinitions, mode: Mode) => {\n const parents = getParents(units)\n return sortBy(toArr(units), unit => unitSorter(unit, mode, parents))\n}\n\n/** Returns latest available unit for each role. */\nexport const getLatestUnits = (units: UnitDefinitions, tech: number) => {\n const sorted = sortBy(filterByTech(toArr(units), tech), techSorter)\n return toObj(\n values(UnitRole),\n role => role,\n role => sorted.find(unit => unit.role === role)?.type\n )\n}\n\nexport const getChildUnits = (units: UnitDefinitions, tech: number, parent: UnitType) => {\n return sortBy(\n filterByTech(\n toArr(units).filter(unit => unit.parent === parent),\n tech\n ),\n techSorter\n )\n}\n\nconst techSorter = (unit: { tech?: number; type: UnitType }) => {\n return 99 - (unit.tech ?? 0) + unit.type\n}\n\nconst unitSorter = (unit: UnitDefinition, mode: Mode, parents?: ObjSet) => {\n if (parents && parents[unit.type]) return ''\n if (mode === Mode.Naval) return calculateBase(unit, UnitAttribute.Cost)\n return techSorter(unit)\n}\n\nexport const getArchetypes = (units: UnitDefinitions, mode: Mode) =>\n toArr(units).filter(unit => unit.parent === getRootParent(mode))\n\nexport const getActualUnits = (units: UnitDefinitions, mode: Mode) => {\n const parents = getParents(units)\n return sortBy(\n toArr(units).filter(unit => !parents[unit.type]),\n unit => unitSorter(unit, mode)\n )\n}\n\nconst getParents = (units: UnitDefinitions) => toSet(units, unit => unit.parent || unit.type)\n\nexport const getRootUnit = (units: UnitDefinitions, mode: Mode) =>\n mode === Mode.Naval ? units[UnitType.Naval] : units[UnitType.Land]\n\nconst filterByTech = (units: UnitDefinition[], tech: number) =>\n units.filter(unit => unit.tech === undefined || unit.tech <= tech)\n\nexport const selectCohort = (army: ArmyData, index: number, cohort: CohortData) => {\n if (cohort && index > army.reserve.length) army.reserve.push(cohort)\n else if (cohort) army.reserve[index] = cohort\n}\n\nexport const toggleCohortLoyality = (army: ArmyData, index: number) => {\n army.reserve[index].isLoyal = !army.reserve[index].isLoyal\n}\n\nexport const setCohortValue = (\n army: ArmyData,\n index: number,\n valuesType: ValuesType,\n key: string,\n attribute: UnitValueType,\n value: number\n) => {\n addValuesWithMutate(army.reserve[index], valuesType, key, [[attribute, value]])\n}\n\nexport const changeCohortType = (army: ArmyData, index: number, type: UnitType) => {\n army.reserve[index].type = type\n}\n\nexport const deleteCohort = (army: ArmyData, index: number) => {\n army.reserve.splice(index, 1)\n}\n\nexport const removeFromReserve = (army: { reserve: ReserveData }, types: UnitType[]) => {\n for (const type of types) {\n const index = findLastIndex(army.reserve, value => value.type === type)\n army.reserve = army.reserve.filter((_, i) => i !== index)\n }\n}\n\nexport const addToReserve = (army: { reserve: ReserveData }, cohorts: CohortData[]) => {\n army.reserve = army.reserve.concat(cohorts)\n}\n\nexport const clearCohorts = (army: ArmyData) => {\n army.reserve = []\n}\n\nexport const selectTactic = (army: ArmyData, tactic: TacticType) => {\n army.general.tactic = tactic\n}\n\nexport const setUnitPreference = (\n army: ArmyData,\n preferenceType: UnitPreferenceType | UnitRole,\n unit: UnitType | null\n) => {\n army.unitPreferences[preferenceType] = unit\n}\n\nexport const setFlankSize = (army: ArmyData, flankFize: number) => {\n army.flankSize = flankFize\n}\n\nexport const setGeneralAttribute = (army: ArmyData, attribute: GeneralValueType, value: number) => {\n addValuesWithMutate(army.general, ValuesType.Base, 'Custom', [[attribute, value]])\n}\n\nexport const clearGeneralAttributes = (army: ArmyData) => {\n clearAllValuesWithMutate(army.general, 'Custom')\n}\n\nexport const setHasGeneral = (army: ArmyData, hasGeneral: boolean) => {\n army.general.enabled = hasGeneral\n}\n\nexport const enableGeneralSelection = (army: ArmyData, type: SelectionType, key: string) => {\n if (!army.general.selections[type]) army.general.selections[type] = {}\n army.general.selections[type][key] = true\n}\n\nexport const enableGeneralSelections = (army: ArmyData, type: SelectionType, keys: string[]) => {\n keys.forEach(key => enableGeneralSelection(army, type, key))\n}\n\nexport const clearGeneralSelection = (army: ArmyData, type: SelectionType, key: string) => {\n if (army.general.selections[type]) delete army.general.selections[type][key]\n}\n\nexport const clearGeneralSelections = (army: ArmyData, type?: SelectionType, keys?: string[]) => {\n if (keys && type) keys.forEach(key => clearGeneralSelection(army, type, key))\n else if (type) delete army.general.selections[type]\n else army.general.selections = {} as Selections\n}\n\nexport const applyGeneralModifiers = (general: GeneralData, modifiers: ModifierWithKey[]): GeneralData => {\n modifiers\n .filter(value => value.target === ModifierType.General)\n .forEach(value => {\n general = addValue(general, value.type, value.key, value.attribute, value.value)\n })\n return general\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { produce } from 'immer'\nimport { Mode } from 'types'\nimport { Reducer, CombinedState } from 'redux'\n\nexport type Action = {\n type: string\n payload: [T1, T2, ...any[]]\n}\n\nlet typeCounter = 0\n// eslint-disable-next-line @typescript-eslint/ban-types\nconst getActionType = (func: Function) => (process.env.NODE_ENV === 'production' ? 'action' + typeCounter++ : func.name)\n\nexport type ActionToFunction = { [key: string]: (entity: T, ...args: any) => void | undefined }\n\nexport const makeActionRemoveFirst = (\n func: (entity: E, ...args: T) => any,\n actionToFunction: ActionToFunction\n) => {\n const type = getActionType(func)\n actionToFunction[type] = func\n return (...payload: T) => ({ type, payload } as unknown)\n}\n\nexport const makeActionReplaceFirst = (\n func: (entity: E, ...args: T) => any,\n actionToFunction: ActionToFunction\n) => {\n const type = getActionType(func)\n actionToFunction[type] = func\n const ret = (key: K, ...args: T) => ({ type, payload: [key, ...args] } as unknown)\n return ret\n}\n\nexport const makeAction = (\n func: (...args: T) => any,\n actionToFunction: { [key: string]: (...args: any) => void | undefined }\n) => {\n const type = getActionType(func)\n actionToFunction[type] = func\n const ret = (...args: T) => ({ type, payload: [...args] } as unknown)\n return ret\n}\n\nexport const makeActionReplaceFirstTwice = (\n func: (entity: E, ...args: T) => any,\n actionToFunction: ActionToFunction\n) => {\n const type = getActionType(func)\n actionToFunction[type] = func\n const ret = (key1: K1, key2: K2, ...args: T) => ({ type, payload: [key1, key2, ...args] } as unknown)\n return ret\n}\n\ntype GetEntity = (draft: S, action: Action, params: ReducerParams, state: S) => E\ntype GetPayload = (action: Action) => any[]\n\nconst getDefaultEntity = (draft: any, action: Action) => draft[action.payload[0]]\n\nconst getEntityPayload = (action: Action) => {\n const [, ...payload] = action.payload\n return payload\n}\n\nconst getDefaultContainer = (draft: any) => draft\n\nexport const makeReducer = (\n initial: S,\n actionToFunction: ActionToFunction,\n getEntity: GetEntity,\n getPayload?: GetPayload\n) => {\n return (state = initial, action: Action, params: ReducerParams) => {\n const func = actionToFunction[action.type]\n if (!func) return state\n return produce(state, (draft: S) => {\n func(getEntity(draft, action, params, state), ...(getPayload ? getPayload(action) : action.payload))\n })\n }\n}\n\nexport function makeEntityReducer(\n initial: S,\n actionToFunction: ActionToFunction\n): ReducerWithParam\nexport function makeEntityReducer(\n initial: S,\n actionToFunction: ActionToFunction,\n getEntity: GetEntity\n): ReducerWithParam\nexport function makeEntityReducer(\n initial: S,\n actionToFunction: ActionToFunction,\n getEntity?: GetEntity\n) {\n return makeReducer(initial, actionToFunction, getEntity ? getEntity : getDefaultEntity, getEntityPayload)\n}\n\nexport function makeContainerReducer(initial: S, actionToFunction: ActionToFunction): ReducerWithParam\nexport function makeContainerReducer(\n initial: S,\n actionToFunction: ActionToFunction,\n getContainer: GetEntity\n): ReducerWithParam\nexport function makeContainerReducer(\n initial: S,\n actionToFunction: ActionToFunction,\n getContainer?: GetEntity\n) {\n return makeReducer(initial, actionToFunction, getContainer ? getContainer : getDefaultContainer)\n}\n\nexport type ReducerParams = { mode: Mode }\n\nexport const compose = (...reducers: ReducerWithParam[]): ReducerWithParam => {\n const initial = reducers[0](undefined, { payload: [] }, {} as ReducerParams)\n const reducer = (state = initial, action: { type: string; payload: any[] }, params: ReducerParams) => {\n if (!action.payload || !Array.isArray(action.payload)) return state\n return reducers.reduce((prev, curr: any) => curr(prev, action, params), state)\n }\n return reducer as any\n}\n\ntype ReducerWithParam = (state: State | undefined, action: any, params: ReducerParams) => State\n\nexport const combineRoot = (reducers: { [K in keyof S]: ReducerWithParam }): Reducer> => {\n const reducerKeys = Object.keys(reducers) as (keyof S)[]\n\n return (state: S = {} as S, action) => {\n let nextState = {} as S\n const ui: ReducerParams = { mode: (state as any)?.ui?.mode }\n\n let invalidated = false\n for (const key of reducerKeys) {\n const reducer = reducers[key] as any\n nextState[key] = reducer(state[key], action, ui)\n if (action.type && nextState[key] !== state[key] && key !== 'ui' && key !== 'transfer') invalidated = true\n }\n if (invalidated) {\n nextState = produce(nextState, (draft: any) => {\n draft['battle'][ui.mode].outdated = true\n })\n }\n return nextState\n }\n}\n\nexport function combine(reducers: { [K in keyof S]: ReducerWithParam }): Reducer> {\n const reducerKeys = Object.keys(reducers) as (keyof S)[]\n\n return function combination(state: S = {} as S, action, settings: ReducerParams) {\n const nextState: S = {} as S\n\n for (const key of reducerKeys) {\n const reducer = reducers[key] as any\n nextState[key] = reducer(state[key], action, settings)\n }\n return nextState\n } as Reducer>\n}\n","import { ArmyData, CountryName, Countries } from 'types'\nimport { ArmyName } from 'types/armies'\nimport * as manager from 'managers/army'\nimport { getDefaultCountryDefinitions } from 'data'\nimport { ActionToFunction, makeReducer, Action, makeActionReplaceFirstTwice } from './utils'\n\nconst mapping: ActionToFunction = {}\n\nexport const clearGeneralSelection = makeActionReplaceFirstTwice(manager.clearGeneralSelection, mapping)\nexport const clearGeneralSelections = makeActionReplaceFirstTwice(manager.clearGeneralSelections, mapping)\nexport const enableGeneralSelection = makeActionReplaceFirstTwice(manager.enableGeneralSelection, mapping)\nexport const enableGeneralSelections = makeActionReplaceFirstTwice(manager.enableGeneralSelections, mapping)\nexport const selectCohort = makeActionReplaceFirstTwice(manager.selectCohort, mapping)\nexport const toggleCohortLoyality = makeActionReplaceFirstTwice(manager.toggleCohortLoyality, mapping)\nexport const setCohortValue = makeActionReplaceFirstTwice(manager.setCohortValue, mapping)\nexport const changeCohortType = makeActionReplaceFirstTwice(manager.changeCohortType, mapping)\nexport const deleteCohort = makeActionReplaceFirstTwice(manager.deleteCohort, mapping)\nexport const removeFromReserve = makeActionReplaceFirstTwice(manager.removeFromReserve, mapping)\nexport const addToReserve = makeActionReplaceFirstTwice(manager.addToReserve, mapping)\nexport const clearCohorts = makeActionReplaceFirstTwice(manager.clearCohorts, mapping)\nexport const selectTactic = makeActionReplaceFirstTwice(manager.selectTactic, mapping)\nexport const setFlankSize = makeActionReplaceFirstTwice(manager.setFlankSize, mapping)\nexport const setUnitPreference = makeActionReplaceFirstTwice(manager.setUnitPreference, mapping)\nexport const setGeneralAttribute = makeActionReplaceFirstTwice(manager.setGeneralAttribute, mapping)\nexport const clearGeneralAttributes = makeActionReplaceFirstTwice(manager.clearGeneralAttributes, mapping)\nexport const setHasGeneral = makeActionReplaceFirstTwice(manager.setHasGeneral, mapping)\n\nconst getEntity = (draft: Countries, action: Action) => {\n const [country, army] = action.payload\n return draft[country].armies[army]\n}\n\nconst getEntityPayload = (action: Action) => {\n const [, , ...payload] = action.payload\n return payload\n}\n\nexport const armyReducer = makeReducer(getDefaultCountryDefinitions(), mapping, getEntity, getEntityPayload)\n","// Note: Not yet generated but should be from data.\n\n// Different techs (connects inventions to tech).\nexport enum Tech {\n Civic = 'Civic',\n Martial = 'Martial',\n Oratory = 'Oratory',\n Religious = 'Religious'\n}\n","import { sumBy } from 'lodash'\nimport {\n TerrainCalc,\n Setting,\n UnitAttribute,\n UnitData,\n CombatPhase,\n CharacterAttribute,\n LocationType,\n CohortProperties,\n CombatSharedSettings,\n Cohorts,\n Cohort,\n Frontline,\n Reserve,\n GeneralValues,\n Environment,\n CombatSettings,\n Army\n} from 'types'\nimport { calculateValue } from 'data_values'\nimport { multiplyChance } from 'utils'\n\n/**\n * Calculates the roll modifier based on skill level difference of generals.\n * Every two levels increase dice roll by one (rounded down).\n */\nexport const calculateGeneralPips = (values: GeneralValues, enemy: GeneralValues, phase: CombatPhase): number => {\n const martialPip = Math.floor((values[CharacterAttribute.Martial] - enemy[CharacterAttribute.Martial]) / 2.0)\n const phasePip = values[phase] - enemy[phase]\n return Math.max(0, martialPip + phasePip)\n}\n\nexport const getTerrainPips = (\n { settings, terrains }: Environment,\n isAttacker: boolean,\n values: GeneralValues,\n enemy: GeneralValues,\n crossingSupport: number\n) => {\n const crossingSupported =\n crossingSupport >= settings[Setting.RequiredCrossingSupport] ||\n values[CharacterAttribute.Maneuver] > enemy[CharacterAttribute.Maneuver]\n const enableTiles = isAttacker\n const enableBorders = isAttacker && !crossingSupported\n const activeTerrains = terrains.filter(terrain =>\n terrain.location === LocationType.Border ? enableBorders : enableTiles\n )\n return sumBy(activeTerrains, terrain => calculateValue(terrain, TerrainCalc.Roll))\n}\n\n/**\n * Calculates the roll modifier from unit pips.\n */\nexport const calculateCohortPips = (\n source: CohortProperties,\n target: CohortProperties,\n targetSupport: CohortProperties | null,\n type: UnitAttribute.Strength | UnitAttribute.Morale,\n phase?: CombatPhase\n): number => {\n return (\n getOffensiveCohortPips(source, type, phase) +\n getDefensiveCohortPips(target, type, phase) +\n getDefensiveSupportCohortPips(targetSupport, type, phase)\n )\n}\n\nexport const getOffensiveCohortPips = (\n cohort: CohortProperties,\n type: UnitAttribute.Strength | UnitAttribute.Morale,\n phase?: CombatPhase\n): number => {\n if (type === UnitAttribute.Morale) return cohort[UnitAttribute.OffensiveMoralePips]\n if (phase === CombatPhase.Shock) return cohort[UnitAttribute.OffensiveShockPips]\n if (phase === CombatPhase.Fire) return cohort[UnitAttribute.OffensiveFirePips]\n return 0\n}\n\nexport const getDefensiveCohortPips = (\n cohort: CohortProperties,\n type: UnitAttribute.Strength | UnitAttribute.Morale,\n phase?: CombatPhase\n): number => {\n if (type === UnitAttribute.Morale) return -cohort[UnitAttribute.DefensiveMoralePips]\n if (phase === CombatPhase.Shock) return -cohort[UnitAttribute.DefensiveShockPips]\n if (phase === CombatPhase.Fire) return -cohort[UnitAttribute.DefensiveFirePips]\n return 0\n}\n\nexport const getDefensiveSupportCohortPips = (\n cohort: CohortProperties | null,\n type: UnitAttribute.Strength | UnitAttribute.Morale,\n phase?: CombatPhase\n): number => {\n return cohort ? Math.ceil(cohort[UnitAttribute.DefensiveSupport] * getDefensiveCohortPips(cohort, type, phase)) : 0\n}\n\nexport const calculateExperienceReduction = (settings: CombatSharedSettings, target: UnitData) => {\n let damageReductionPerExperience = settings[Setting.ExperienceDamageReduction]\n // Bug in game which makes morale damage taken and strength damage taken affect damage reduction from experience.\n if (!settings[Setting.FixExperience])\n damageReductionPerExperience *=\n (2.0 +\n calculateValue(target, UnitAttribute.MoraleDamageTaken) +\n calculateValue(target, UnitAttribute.StrengthDamageTaken)) *\n 0.5\n return -damageReductionPerExperience * calculateValue(target, UnitAttribute.Experience)\n}\n\nexport const getCombatPhase = (round: number, settings: CombatSharedSettings) => {\n if (settings[Setting.FireAndShock]) {\n const phase = getCombatPhaseNumber(round, settings)\n if (phase) return phase % 2 ? CombatPhase.Fire : CombatPhase.Shock\n }\n return CombatPhase.Default\n}\n\nexport const getCombatPhaseByPhaseNumber = (phase: number, settings: CombatSharedSettings) => {\n if (settings[Setting.FireAndShock]) {\n if (phase) return phase % 2 ? CombatPhase.Fire : CombatPhase.Shock\n }\n return CombatPhase.Default\n}\n\nexport const getCombatPhaseNumber = (round: number, settings: CombatSharedSettings) =>\n Math.ceil(round / settings[Setting.PhaseLength])\n\nexport const getDailyIncrease = (round: number, settings: CombatSharedSettings) =>\n settings[Setting.DailyDamageIncrease] * round\n\nexport const calculateTotalStrength = (cohorts: Cohorts, includeDefeated: boolean) => {\n let strength = 0.0\n const addRatio = (cohort: Cohort) => {\n strength += cohort[UnitAttribute.Strength]\n }\n iterateCohorts(cohorts, includeDefeated, addRatio)\n return strength\n}\n\n/** Calls a function for every cohort. */\nexport const iterateCohorts = (cohorts: Cohorts, includeDefeated: boolean, func: (cohort: Cohort) => void) => {\n iterateFrontline(cohorts.frontline, func)\n cohorts.reserve.front.forEach(func)\n cohorts.reserve.flank.forEach(func)\n cohorts.reserve.support.forEach(func)\n if (includeDefeated) cohorts.defeated.forEach(func)\n}\n\nexport const iterateFrontline = (frontline: Frontline, func: (cohort: Cohort) => void) => {\n let i = 0,\n j = 0\n const length = frontline.length\n const length2 = frontline[0].length\n for (; i < length; i++) {\n for (; j < length2; j++) {\n const unit = frontline[i][j]\n if (unit && !unit?.state.isDefeated) func(unit)\n }\n }\n}\n\n/**\n * Removes temporary defeated units from frontline.\n */\nexport const removeDefeated = (frontline: Frontline) => {\n for (let i = 0; i < frontline.length; i++) {\n for (let j = 0; j < frontline[i].length; j++) {\n const unit = frontline[i][j]\n if (!unit) continue\n if (unit.state.isDefeated) frontline[i][j] = null\n }\n }\n}\n\n/**\n * Calculates the next index when the order is from center to edges.\n */\nexport const nextIndex = (index: number, center: number) =>\n index < center ? index + 2 * (center - index) : index - 2 * (index - center) - 1\n\nexport const reserveSize = (reserve: Reserve) => reserve.front.length + reserve.flank.length + reserve.support.length\n\nexport const defeatCohort = (environment: Environment, cohort: Cohort) => {\n // Defeating a defeated cohort shouldn't change the time of defeat.\n if (!cohort.state.isDefeated) cohort.state.defeatedDay = environment.day\n cohort.state.isDefeated = true\n cohort.state.isDestroyed = cohort[UnitAttribute.Strength] <= 0\n}\n\nexport const wipeCohort = (environment: Environment, cohort: Cohort, enemy: Army | null, captureChance: number) => {\n cohort[UnitAttribute.Morale] = 0\n cohort[UnitAttribute.Strength] = 0\n cohort.state.stackWipedBy = enemy\n cohort.state.captureChance = multiplyChance(\n cohort.state.captureChance,\n captureChance - cohort.properties[UnitAttribute.CaptureResist]\n )\n defeatCohort(environment, cohort)\n}\n\nexport const uncaptureCohort = (cohort: Cohort) => {\n cohort.state.captureChance = 0\n}\n\nexport const isAlive = (unit: Cohort, settings: CombatSettings) =>\n unit[UnitAttribute.Morale] > settings[Setting.MinimumMorale] &&\n unit[UnitAttribute.Strength] > settings[Setting.MinimumStrength]\n","import { sumBy, values } from 'lodash'\nimport {\n TerrainData,\n UnitType,\n CohortDefinition,\n UnitAttribute,\n Setting,\n CombatSettings,\n CombatPhase,\n UnitValueType,\n Cohort,\n CohortProperties,\n DisciplineValue,\n CountryName,\n ArmyName,\n formTerrainAttribute,\n getTerrainAttributes\n} from 'types'\nimport { toObj, map, noZero } from 'utils'\nimport { calculateValue, calculateValueWithoutLoss, calculateBase, calculateModifier } from 'data_values'\nimport { calculateExperienceReduction } from './combat_utils'\nimport { getConfig } from 'data/config'\n\nexport const getProperties = (\n countryName: CountryName,\n armyName: ArmyName,\n participantIndex: number,\n index: number,\n settings: CombatSettings,\n terrains: TerrainData[],\n unitTypes: UnitType[],\n cohort: CohortDefinition\n): CohortProperties => {\n const damageReduction = precalculateDamageReduction(cohort, settings)\n const properties = {\n index,\n armyName,\n countryName,\n participantIndex,\n type: cohort.type,\n isLoyal: !!cohort.isLoyal,\n image: cohort.image,\n deploymentPenalty: 0,\n reinforcementPenalty: 0,\n winningMoraleBonus: 0,\n maxMorale: calculateValueWithoutLoss(cohort, UnitAttribute.Morale),\n maxStrength: calculateValueWithoutLoss(cohort, UnitAttribute.Strength),\n experienceReduction: calculateExperienceReduction(settings, cohort),\n // Unmodified value is used to determine deployment order.\n deploymentCost: calculateBase(cohort, UnitAttribute.Cost),\n tech: cohort.tech,\n mode: cohort.mode,\n role: cohort.role,\n parent: cohort.parent,\n damage: getDamages(settings, terrains, unitTypes, cohort),\n damageTakenMultiplier: damageReduction,\n moraleTakenMultiplier:\n damageReduction * getValue(cohort, UnitAttribute.MoraleDamageTaken, settings[Setting.AttributeMoraleDamage]),\n strengthTakenMultiplier: applyPhaseDamageTaken(\n cohort,\n damageReduction * getValue(cohort, UnitAttribute.StrengthDamageTaken, settings[Setting.AttributeStrengthDamage])\n )\n } as CohortProperties\n values(UnitAttribute).forEach(calc => {\n properties[calc] = calculateValue(cohort, calc)\n })\n values(CombatPhase).forEach(calc => {\n properties[calc] = calculateValue(cohort, calc)\n })\n getTerrainAttributes(terrains).forEach(calc => {\n properties[calc] = calculateValue(cohort, calc)\n })\n unitTypes.forEach(calc => {\n properties[calc] = calculateValue(cohort, calc)\n })\n return properties\n}\n\n/**\n * Transforms a unit to a combat unit.\n */\nexport const getCombatUnit = (\n countryName: CountryName,\n armyName: ArmyName,\n participantIndex: number,\n index: number,\n settings: CombatSettings,\n terrains: TerrainData[],\n unitTypes: UnitType[],\n cohort: CohortDefinition\n): Cohort => ({\n [UnitAttribute.Morale]: calculateValue(cohort, UnitAttribute.Morale),\n [UnitAttribute.Strength]: calculateValue(cohort, UnitAttribute.Strength),\n state: {\n damageDealt: 0,\n flankRatioPenalty: 0,\n captureChance: 0,\n target: null,\n targetSupport: null,\n flanking: false,\n moraleLoss: 0,\n strengthLoss: 0,\n moraleDealt: 0,\n strengthDealt: 0,\n damageMultiplier: 0,\n isDefeated: false,\n targetedBy: null,\n defeatedBy: null,\n defeatedDay: 0,\n stackWipedBy: null,\n isDestroyed: false,\n totalMoraleDealt: 0,\n totalStrengthDealt: 0\n },\n properties: getProperties(countryName, armyName, participantIndex, index, settings, terrains, unitTypes, cohort),\n isWeak: false\n})\n\nconst applyPhaseDamageDone = (unit: CohortDefinition, value: number) => ({\n [CombatPhase.Default]: value,\n [CombatPhase.Fire]: value * (1.0 + calculateValue(unit, UnitAttribute.FireDamageDone)),\n [CombatPhase.Shock]: value * (1.0 + calculateValue(unit, UnitAttribute.ShockDamageDone))\n})\n\nconst applyPhaseDamageTaken = (unit: CohortDefinition, value: number) => ({\n [CombatPhase.Default]: value,\n [CombatPhase.Fire]: value * (1.0 + calculateValue(unit, UnitAttribute.FireDamageTaken)),\n [CombatPhase.Shock]: value * (1.0 + calculateValue(unit, UnitAttribute.ShockDamageTaken))\n})\n\nconst applyPhaseDamage = (unit: CohortDefinition, value: number) => ({\n [CombatPhase.Default]: value,\n [CombatPhase.Fire]: value * calculateValue(unit, CombatPhase.Fire),\n [CombatPhase.Shock]: value * calculateValue(unit, CombatPhase.Shock)\n})\n\nconst applyUnitTypes = (\n unit: CohortDefinition,\n unitTypes: UnitType[],\n settings: CombatSettings,\n values: { [key in CombatPhase]: number }\n) =>\n toObj(\n unitTypes,\n type => type,\n type => map(values, damage => damage * getValue(unit, type, settings[Setting.CounteringDamage] > 0))\n )\n\nconst applyDamageTypes = (\n unit: CohortDefinition,\n settings: CombatSettings,\n values: { [key in UnitType]: { [key in CombatPhase]: number } }\n) => {\n const moraleDone =\n getValue(unit, UnitAttribute.MoraleDamageDone, settings[Setting.AttributeMoraleDamage]) *\n settings[Setting.MoraleLostMultiplier]\n const strengthDone = applyPhaseDamageDone(\n unit,\n getValue(unit, UnitAttribute.StrengthDamageDone, settings[Setting.AttributeStrengthDamage]) *\n settings[Setting.StrengthLostMultiplier]\n )\n return {\n [UnitAttribute.Strength]: map(values, values => map(values, (value, phase) => value * strengthDone[phase])),\n [UnitAttribute.Morale]: map(values, values => map(values, value => value * moraleDone)),\n Damage: values\n }\n}\n\nconst getDamages = (\n settings: CombatSettings,\n terrains: TerrainData[],\n unitTypes: UnitType[],\n cohort: CohortDefinition\n) =>\n applyDamageTypes(\n cohort,\n settings,\n applyUnitTypes(\n cohort,\n unitTypes,\n settings,\n applyPhaseDamage(cohort, precalculateDamage(terrains, cohort, settings))\n )\n )\n\nconst getValue = (unit: CohortDefinition, attribute: UnitValueType, enabled: boolean) =>\n 1.0 + getMultiplier(unit, attribute, enabled)\nconst getMultiplier = (unit: CohortDefinition, attribute: UnitValueType, enabled: boolean) =>\n enabled ? calculateValue(unit, attribute) : 0\nconst getBase = (unit: CohortDefinition, attribute: UnitValueType, enabled: boolean) =>\n enabled ? calculateBase(unit, attribute) : 0\nconst getModifier = (unit: CohortDefinition, attribute: UnitValueType, enabled: boolean) =>\n enabled ? calculateModifier(unit, attribute) : 0\n\nconst precalculateDamage = (terrains: TerrainData[], unit: CohortDefinition, settings: CombatSettings) =>\n settings[Setting.Precision] *\n applyTerrain(unit, terrains, UnitAttribute.Damage, settings) *\n getValue(\n unit,\n UnitAttribute.Discipline,\n settings[Setting.AttributeDiscipline] === DisciplineValue.Both ||\n settings[Setting.AttributeDiscipline] === DisciplineValue.Damage\n ) *\n getValue(unit, UnitAttribute.CombatAbility, settings[Setting.AttributeCombatAbility]) *\n getValue(unit, UnitAttribute.DamageDone, settings[Setting.AttributeDamage]) *\n (1.0 + (settings[Setting.AttributeLoyal] && unit.isLoyal ? getConfig().LoyalDamage : 0))\n\nconst applyTerrain = (\n unit: CohortDefinition,\n terrains: TerrainData[],\n attribute: UnitAttribute,\n settings: CombatSettings\n) => {\n const base =\n calculateBase(unit, attribute) +\n sumBy(terrains, terrain =>\n getBase(unit, formTerrainAttribute(terrain, attribute), settings[Setting.AttributeTerrainType])\n )\n const multiplier =\n calculateModifier(unit, attribute) +\n sumBy(terrains, terrain =>\n getModifier(unit, formTerrainAttribute(terrain, attribute), settings[Setting.AttributeTerrainType])\n )\n return base * (1 + multiplier)\n}\nconst precalculateDamageReduction = (unit: CohortDefinition, settings: CombatSettings) =>\n ((settings[Setting.AttributeExperience] ? 1.0 + calculateExperienceReduction(settings, unit) : 1.0) *\n getValue(unit, UnitAttribute.DamageTaken, settings[Setting.AttributeDamage])) /\n noZero(getValue(unit, UnitAttribute.Discipline, settings[Setting.AttributeDiscipline] === DisciplineValue.Both)) /\n noZero(getMultiplier(unit, UnitAttribute.MilitaryTactics, settings[Setting.AttributeMilitaryTactics]))\n","import {\n UnitPreferences,\n UnitAttribute,\n UnitPreferenceType,\n UnitRole,\n Setting,\n CombatSettings,\n Reserve,\n Cohorts,\n Cohort,\n Side,\n Environment,\n Army\n} from 'types'\nimport { sortBy, remove, clamp, sum, flatten } from 'lodash'\nimport { nextIndex, reserveSize, defeatCohort, isAlive } from './combat_utils'\nimport { getLeadingArmy } from 'managers/battle'\n\nconst armyFlankCount = (reserve: Reserve) => {\n return (\n reserve.front.filter(cohort => cohort.properties.role === UnitRole.Flank).length +\n reserve.flank.filter(cohort => cohort.properties.role === UnitRole.Flank).length +\n reserve.support.filter(cohort => cohort.properties.role === UnitRole.Flank).length\n )\n}\n\nconst deployFront = (\n cohorts: Cohort[],\n row: (Cohort | null)[],\n center: number,\n flank: number,\n settings: CombatSettings,\n preferences?: UnitPreferences\n) => {\n for (let index = center; index !== flank; index = nextIndex(index, center)) {\n if (row[index]) continue\n const cohort = cohorts.pop()\n if (cohort) {\n if (preferences) applyReinforcementPenalty(cohort, preferences, settings)\n row[index] = cohort\n } else break\n }\n}\n\nconst deployFlanks = (\n cohorts: Cohort[],\n row: (Cohort | null)[],\n center: number,\n flank: number,\n settings: CombatSettings,\n preferences?: UnitPreferences\n) => {\n for (let index = flank; index >= 0 && index < row.length; index = nextIndex(index, center)) {\n if (row[index]) continue\n const cohort = cohorts.pop()\n if (cohort) {\n if (preferences) applyReinforcementPenalty(cohort, preferences, settings)\n row[index] = cohort\n } else break\n }\n}\n\nconst deployBoth = (\n cohorts: Cohort[],\n row: (Cohort | null)[],\n center: number,\n limit: number,\n settings: CombatSettings,\n preferences?: UnitPreferences\n) => {\n for (\n let index = center, count = 0;\n index >= 0 && index < row.length && count < limit;\n index = nextIndex(index, center), count++\n ) {\n if (row[index]) continue\n const cohort = cohorts.pop()\n if (cohort) {\n if (preferences) applyReinforcementPenalty(cohort, preferences, settings)\n row[index] = cohort\n } else break\n }\n}\n\nconst applyLateDeploymentPenaltySub = (cohort: Cohort, percent: number) => {\n cohort[UnitAttribute.Morale] -= cohort.properties.maxMorale * percent\n cohort.properties.deploymentPenalty += percent\n}\n\nconst applyLateDeploymentPenalty = (reserve: Reserve, round: number, settings: CombatSettings) => {\n if (round < settings[Setting.StackwipeRounds] || !settings[Setting.MoraleHitForLateDeployment]) return\n reserve.front.forEach(cohort => applyLateDeploymentPenaltySub(cohort, settings[Setting.MoraleHitForLateDeployment]))\n reserve.flank.forEach(cohort => applyLateDeploymentPenaltySub(cohort, settings[Setting.MoraleHitForLateDeployment]))\n reserve.support.forEach(cohort => applyLateDeploymentPenaltySub(cohort, settings[Setting.MoraleHitForLateDeployment]))\n}\n\nconst applyReinforcementPenalty = (cohort: Cohort, preferences: UnitPreferences, settings: CombatSettings) => {\n if (\n cohort.properties.type !== preferences[UnitPreferenceType.Secondary] &&\n settings[Setting.MoraleHitForNonSecondaryReinforcement]\n ) {\n cohort[UnitAttribute.Morale] -=\n cohort.properties.maxMorale * settings[Setting.MoraleHitForNonSecondaryReinforcement]\n cohort.properties.reinforcementPenalty += settings[Setting.MoraleHitForNonSecondaryReinforcement]\n }\n}\n\nconst deployCohorts = (\n target: Cohorts,\n reserve: Reserve,\n leftFlank: number,\n rightFlank: number,\n settings: CombatSettings,\n preferences?: UnitPreferences\n) => {\n const frontline = target.frontline[0]\n const backline = target.frontline.length > 1 ? target.frontline[1] : null\n const center = Math.floor(frontline.length / 2.0)\n let flankStartingIndex = leftFlank > rightFlank ? leftFlank - 1 : frontline.length - rightFlank\n if (frontline.length % 2) flankStartingIndex = leftFlank >= rightFlank ? leftFlank - 1 : frontline.length - rightFlank\n const deploySupport =\n !settings[Setting.SupportPhase] ||\n (reserve.front.length === 0 && reserve.flank.length === 0 && !frontline.some(cohort => cohort))\n const maxSupportBackline = Math.floor(reserveSize(reserve) / 2)\n\n if (backline) deployBoth(reserve.support, backline, center, maxSupportBackline, settings, preferences)\n\n deployFront(reserve.front, frontline, center, flankStartingIndex, settings, preferences)\n deployFront(reserve.flank, frontline, center, flankStartingIndex, settings, preferences)\n if (deploySupport) deployFront(reserve.support, frontline, center, flankStartingIndex, settings, preferences)\n // Use front units as flank if necessary.\n deployFlanks(\n reserve.flank.length ? reserve.flank : reserve.front,\n frontline,\n center,\n flankStartingIndex,\n settings,\n preferences\n )\n if (backline) deployFront(reserve.front, backline, center, flankStartingIndex, settings, preferences)\n deployFlanks(reserve.flank, frontline, center, flankStartingIndex, settings, preferences)\n deployFlanks(reserve.front, frontline, center, flankStartingIndex, settings, preferences)\n if (deploySupport) deployFlanks(reserve.support, frontline, center, flankStartingIndex, settings, preferences)\n if (backline) deployFlanks(reserve.flank, backline, center, flankStartingIndex, settings, preferences)\n}\n\nexport const sortReserve = (reserve: Cohort[], unitPreferences: UnitPreferences): Reserve => {\n const frontReserve = reserve.filter(value => isFrontUnit(unitPreferences, value))\n const flankReserve = reserve.filter(value => isFlankUnit(unitPreferences, value))\n const supportReserve = reserve.filter(value => isSupportUnit(unitPreferences, value))\n // Calculate priorities (mostly based on unit type, ties are resolved with index numbers).\n const front = sortBy(frontReserve, value => {\n return (\n value.properties.deploymentCost * 100000 +\n value[UnitAttribute.Strength] * 1000 +\n (value.properties.type === unitPreferences[UnitPreferenceType.Primary] ? 200000000 : 0) +\n (value.properties.type === unitPreferences[UnitPreferenceType.Secondary] ? 100000000 : 0)\n )\n })\n const flank = sortBy(flankReserve, value => {\n return (\n value.properties[UnitAttribute.Maneuver] * 100000 +\n value[UnitAttribute.Strength] * 1000 +\n (value.properties.type === unitPreferences[UnitPreferenceType.Flank] ? 100000000 : 0)\n )\n })\n const support = sortBy(supportReserve, value => {\n return value[UnitAttribute.Strength] * 1000\n })\n return { front, flank, support }\n}\n\nconst isFrontUnit = (preferences: UnitPreferences, cohort: Cohort) => {\n if (\n cohort.properties.type === preferences[UnitPreferenceType.Primary] ||\n cohort.properties.type === preferences[UnitPreferenceType.Secondary]\n )\n return true\n if (cohort.properties.type === preferences[UnitPreferenceType.Flank]) return false\n return cohort.properties.role === UnitRole.Front\n}\n\nconst isFlankUnit = (preferences: UnitPreferences, cohort: Cohort) => {\n if (\n cohort.properties.type === preferences[UnitPreferenceType.Primary] ||\n cohort.properties.type === preferences[UnitPreferenceType.Secondary]\n )\n return false\n if (cohort.properties.type === preferences[UnitPreferenceType.Flank]) return true\n return cohort.properties.role === UnitRole.Flank\n}\n\nconst isSupportUnit = (preferences: UnitPreferences, cohort: Cohort) => {\n if (\n cohort.properties.type === preferences[UnitPreferenceType.Primary] ||\n cohort.properties.type === preferences[UnitPreferenceType.Secondary]\n )\n return false\n if (cohort.properties.type === preferences[UnitPreferenceType.Flank]) return false\n return cohort.properties.role === UnitRole.Support\n}\n\n/**\n * Calculates the left and right flank size.\n * @param combatWidth Size of the battlefield.\n * @param preferredFlankSize Maximum amount of flanking units per side.\n * @param reserve Sorted reserve to get amount of flanking units.\n * @param enemyUnits Enemy units to calculate space on the battlefield.\n */\nconst calculateFlankSizes = (\n combatWidth: number,\n preferredFlankSize: number,\n enemyArmySize?: number\n): [number, number] => {\n const free_space = enemyArmySize ? combatWidth - enemyArmySize : 0\n const leftSideFreeSpace = Math.ceil(free_space / 2.0)\n const rightSideFreeSpace = Math.floor(free_space / 2.0)\n // Max space checks needed for low combat widths.\n const leftSideMaxSpace = Math.ceil(combatWidth / 2.0)\n const rightSideMaxSpace = Math.floor(combatWidth / 2.0)\n const leftFlankSize = clamp(preferredFlankSize, leftSideFreeSpace, leftSideMaxSpace)\n const rightFlankSize = clamp(preferredFlankSize, rightSideFreeSpace, rightSideMaxSpace)\n return [leftFlankSize, rightFlankSize]\n}\n\nconst calculatePreferredFlankSize = (settings: CombatSettings, customValue: number, reserve: Reserve) => {\n return settings[Setting.CustomDeployment]\n ? customValue\n : Math.min(armyFlankCount(reserve) / 2, Math.floor(settings[Setting.BaseCombatWidth] / 4))\n}\n\nconst removeDefeatedFromNewArmies = (environment: Environment, side: Side, armies: Army[]) => {\n const removeFromReserve = (part: Cohort[]) => {\n for (let i = 0; i < part.length; i++) {\n const cohort = part[i]\n if (isAlive(cohort, environment.settings)) continue\n defeatCohort(environment, cohort)\n side.cohorts.defeated.push(cohort)\n remove(part, value => value === cohort)\n i--\n }\n }\n armies.forEach(army => {\n removeFromReserve(army.reserve.front)\n removeFromReserve(army.reserve.flank)\n removeFromReserve(army.reserve.support)\n })\n}\n\nexport const deploy = (environment: Environment, sideA: Side, sideB: Side) => {\n const { day, settings, round } = environment\n if (round === 0 && (!canDeploy(day, sideA) || !canDeploy(day, sideB))) return\n const armiesA = getDeployingArmies(day, sideA)\n const armiesB = getDeployingArmies(day, sideB)\n removeDefeatedFromNewArmies(environment, sideA, armiesA)\n removeDefeatedFromNewArmies(environment, sideB, armiesB)\n const sizeA = settings[Setting.DynamicFlanking] ? countCohorts(sideA) + countReserve(armiesA) : undefined\n const sizeB = settings[Setting.DynamicFlanking] ? countCohorts(sideB) + countReserve(armiesB) : undefined\n if (armiesA.length) {\n deploySub(sideA, armiesA, settings, environment.round, sizeB)\n }\n if (armiesB.length) {\n deploySub(sideB, armiesB, settings, environment.round, sizeA)\n }\n}\n\nconst countCohorts = (side: Side) =>\n reserveSize(side.cohorts.reserve) + side.cohorts.frontline[0].filter(unit => unit).length\nconst countReserve = (armies: Army[]) => sum(armies.map(army => reserveSize(army.reserve)))\n\nexport const undeploy = (environment: Environment, side: Side) => {\n if (!side.isDefeated) {\n const reserve: Cohort[] = []\n reserve.push(...flatten(side.cohorts.frontline.map(row => row.filter(cohort => cohort) as Cohort[])))\n reserve.push(...side.cohorts.reserve.flank)\n reserve.push(...side.cohorts.reserve.front)\n reserve.push(...side.cohorts.reserve.support)\n reserve.push(...side.cohorts.defeated)\n side.deployed.forEach(army => {\n army.reserve = sortReserve(\n reserve.filter(cohort => cohort.properties.participantIndex === army.participantIndex),\n army.unitPreferences\n )\n applyWinningMoraleBonus(army.reserve, environment.settings)\n side.armies.push(army)\n })\n }\n\n side.deployed = []\n side.cohorts.frontline = side.cohorts.frontline.map(row => row.map(() => null))\n side.cohorts.defeated = []\n resortReserve(side, [])\n}\n\nconst applyWinningMoraleBonusSub = (cohort: Cohort, percent: number) => {\n const bonus = Math.min(\n cohort.properties.maxMorale * percent,\n cohort.properties.maxMorale - cohort[UnitAttribute.Morale]\n )\n cohort[UnitAttribute.Morale] += bonus\n cohort.properties.winningMoraleBonus += bonus\n}\n\nconst applyWinningMoraleBonus = (reserve: Reserve, settings: CombatSettings) => {\n if (!settings[Setting.MoraleGainForWinning]) return\n reserve.front.forEach(cohort => applyWinningMoraleBonusSub(cohort, settings[Setting.MoraleGainForWinning]))\n reserve.flank.forEach(cohort => applyWinningMoraleBonusSub(cohort, settings[Setting.MoraleGainForWinning]))\n reserve.support.forEach(cohort => applyWinningMoraleBonusSub(cohort, settings[Setting.MoraleGainForWinning]))\n}\n\nexport const moveDefeatedToRetreated = (cohorts: Cohorts) => {\n cohorts.retreated.push(...cohorts.defeated)\n cohorts.defeated = []\n}\n\nconst canDeploy = (day: number, side: Side) => {\n return side.armies.length && side.armies[side.armies.length - 1].arrival <= day\n}\n\nconst getDeployingArmies = (day: number, side: Side) => {\n const armies = []\n while (side.armies.length && side.armies[side.armies.length - 1].arrival <= day) {\n const army = side.armies.pop()\n if (army) armies.push(army)\n }\n return armies\n}\n\nconst deploySub = (side: Side, deploying: Army[], settings: CombatSettings, round: number, enemyArmySize?: number) => {\n const pool: Cohort[] = []\n deploying.forEach(army => {\n const [leftFlank, rightFlank] = calculateFlankSizes(\n settings[Setting.BaseCombatWidth],\n calculatePreferredFlankSize(settings, army.flankSize, army.reserve),\n enemyArmySize\n )\n army.leftFlank = leftFlank\n army.rightFlank = rightFlank\n applyLateDeploymentPenalty(army.reserve, round, settings)\n deployCohorts(side.cohorts, army.reserve, leftFlank, rightFlank, settings)\n side.deployed.push(army)\n pool.push(...army.reserve.front)\n pool.push(...army.reserve.flank)\n pool.push(...army.reserve.support)\n })\n side.deployed.sort((a, b) => b.priority - a.priority)\n pool.push(...side.cohorts.reserve.front)\n pool.push(...side.cohorts.reserve.flank)\n pool.push(...side.cohorts.reserve.support)\n resortReserve(side, pool)\n}\n\nconst resortReserve = (side: Side, reserve: Cohort[]) => {\n const general = getLeadingArmy(side)\n // Without general there also won't be any cohorts (so sorting is not needed).\n if (general) side.cohorts.reserve = sortReserve(reserve, general.unitPreferences)\n else\n side.cohorts.reserve = {\n flank: [],\n front: [],\n support: []\n }\n}\n\nconst moveUnits = (cohorts: Cohorts) => {\n const { frontline } = cohorts\n // Move units from back to front.\n for (let rowIndex = frontline.length - 1; rowIndex > 0; rowIndex--) {\n const row = frontline[rowIndex]\n const nextRow = frontline[rowIndex - 1]\n for (let unitIndex = 0; unitIndex < row.length; unitIndex++) {\n if (nextRow[unitIndex]) continue\n nextRow[unitIndex] = row[unitIndex]\n row[unitIndex] = null\n }\n }\n // Only front cohorts can move on their row.\n const front = frontline[0]\n // Move units from left to center.\n for (let unitIndex = Math.floor(front.length / 2.0); unitIndex > 0; --unitIndex) {\n const unit = front[unitIndex]\n if (unit) continue\n const unitOnLeft = front[unitIndex - 1]\n if (unitOnLeft) {\n front[unitIndex] = unitOnLeft\n front[unitIndex - 1] = null\n }\n }\n // Move units from right to center.\n for (let unitIndex = Math.ceil(front.length / 2.0); unitIndex < front.length - 1; ++unitIndex) {\n const unit = front[unitIndex]\n if (unit) continue\n const unitOnRight = front[unitIndex + 1]\n if (unitOnRight) {\n front[unitIndex] = unitOnRight\n front[unitIndex + 1] = null\n }\n }\n}\n\n/**\n * Reinforces a given army based on reinforcement rules.\n * First priority is to move units from reserve. Then units move towards center.\n */\nexport const reinforce = (field: Environment, side: Side) => {\n const { settings } = field\n const general = getLeadingArmy(side)\n if (general && reserveSize(side.cohorts.reserve))\n deployCohorts(\n side.cohorts,\n side.cohorts.reserve,\n general.leftFlank,\n general.rightFlank,\n settings,\n general.unitPreferences\n )\n moveUnits(side.cohorts)\n}\n","import {\n TacticData,\n UnitAttribute,\n Setting,\n UnitRole,\n CombatSettings,\n CombatPhase,\n Cohorts,\n Cohort,\n Frontline,\n Side,\n Environment,\n TacticCalc,\n UnitType,\n TacticMatch,\n Army,\n FlankRatioPenalty\n} from 'types'\nimport { keys, map, multiplyChance, noZero, toArr, toObj } from 'utils'\nimport { calculateValue } from 'data_values'\nimport {\n getCombatPhase,\n calculateCohortPips,\n getDailyIncrease,\n iterateCohorts,\n removeDefeated,\n reserveSize,\n reinforce,\n calculateGeneralPips,\n getTerrainPips,\n checkStackWipe,\n defeatCohort,\n isAlive,\n iterateFrontline\n} from 'combat'\nimport { deploy, undeploy, moveDefeatedToRetreated } from './deployment'\nimport { getLeadingArmy, getDefaultCombatResults } from 'managers/battle'\nimport { getConfig } from 'data/config'\nimport { clamp, sum, sumBy } from 'lodash'\n\n/**\n * Makes given armies attach each other.\n */\nexport const doCombatRound = (env: Environment, sideA: Side, sideB: Side, markDefeated: boolean) => {\n env.round++\n const { round } = env\n const settings = env.settings\n const phase = getCombatPhase(env.round, settings)\n // Defender advantage requires detecting which one is the defender.\n const a = sideA.type === env.attacker ? sideA : sideB\n const d = sideA.type === env.attacker ? sideB : sideA\n if (markDefeated) {\n removeDefeated(a.cohorts.frontline)\n removeDefeated(d.cohorts.frontline)\n }\n if (round === 0) {\n undeploy(env, a)\n a.results = getDefaultCombatResults()\n undeploy(env, d)\n d.results = getDefaultCombatResults()\n }\n deploy(env, a, d)\n clearState(a.cohorts.frontline)\n clearState(d.cohorts.frontline)\n if (round > 0) {\n reinforce(env, a)\n if (!settings[Setting.DefenderAdvantage]) reinforce(env, d)\n pickTargets(env, a.cohorts.frontline, d.cohorts.frontline)\n if (settings[Setting.DefenderAdvantage]) reinforce(env, d)\n pickTargets(env, d.cohorts.frontline, a.cohorts.frontline)\n\n a.results.round = env.round\n d.results.round = env.round\n const dailyMultiplier = 1 + getDailyIncrease(env.round, settings)\n const generalA = getLeadingArmy(a)\n const generalD = getLeadingArmy(d)\n const tacticStrengthDamageMultiplier =\n generalA && generalD && settings[Setting.Tactics]\n ? 1.0 +\n calculateValue(generalA.tactic, TacticCalc.Casualties) +\n calculateValue(generalD.tactic, TacticCalc.Casualties)\n : 1.0\n a.results.dailyMultiplier = dailyMultiplier\n d.results.dailyMultiplier = dailyMultiplier\n calculateArmyPips(env, a, d, phase)\n calculateArmyPips(env, d, a, phase)\n if (settings[Setting.RelativePips]) {\n a.results.actualBonusPips = Math.max(0, a.results.totalBonusPips - d.results.totalBonusPips)\n d.results.actualBonusPips = Math.max(0, d.results.totalBonusPips - a.results.totalBonusPips)\n }\n attack(env, a, d, dailyMultiplier, tacticStrengthDamageMultiplier, phase)\n attack(env, d, a, dailyMultiplier, tacticStrengthDamageMultiplier, phase)\n\n applyLosses(a.cohorts.frontline)\n applyLosses(d.cohorts.frontline)\n }\n a.isDefeated =\n moveDefeated(env, a.cohorts.frontline, a.cohorts.defeated, markDefeated) && reserveSize(a.cohorts.reserve) === 0\n d.isDefeated =\n moveDefeated(env, d.cohorts.frontline, d.cohorts.defeated, markDefeated) && reserveSize(d.cohorts.reserve) === 0\n const noCombat = a.isDefeated && d.isDefeated\n\n const defenderWiped = checkStackWipe(env, d, a)\n if (!defenderWiped) checkStackWipe(env, a, d)\n a.armiesRemaining = !a.isDefeated || a.armies.length > 0\n d.armiesRemaining = !d.isDefeated || d.armies.length > 0\n if (a.isDefeated) {\n moveDefeatedToRetreated(a.cohorts)\n env.round = -1\n if (!noCombat && settings[Setting.AttackerSwapping]) env.attacker = a.type\n }\n if (d.isDefeated) {\n moveDefeatedToRetreated(d.cohorts)\n env.round = -1\n if (!noCombat && settings[Setting.AttackerSwapping]) env.attacker = d.type\n }\n}\n\nconst getBackTarget = (target: Frontline, index: number) => (target.length > 1 ? target[1][index] : null)\n\nconst clearState = (source: Frontline) => {\n for (let i = 0; i < source.length; i++) {\n for (let j = 0; j < source[i].length; j++) {\n const cohort = source[i][j]\n if (!cohort) continue\n const state = cohort.state\n state.damageMultiplier = 0\n state.moraleDealt = 0\n state.strengthDealt = 0\n state.moraleLoss = 0\n state.strengthLoss = 0\n state.target = null\n state.flanking = false\n state.targetedBy = null\n state.flankRatioPenalty = 0\n state.captureChance = 0\n // Enemies in front should never be already defeated.\n // This kind of state can come from Analyze tool because it doesn't reset the state.\n state.isDefeated = false\n state.defeatedBy = null\n state.isDestroyed = false\n }\n }\n}\n\n/**\n * Selects targets for units.\n */\nconst pickTargets = (environment: Environment, source: Frontline, target: Frontline) => {\n const settings = environment.settings\n const sourceLength = source[0].length\n const targetLength = target[0].length\n for (let i = 0; i < source.length; i++) {\n for (let j = 0; j < source[i].length; j++) {\n const cohort = source[i][j]\n if (!cohort) continue\n const state = cohort.state\n state.moraleLoss = settings[Setting.DailyMoraleLoss] * (1 - cohort.properties[UnitAttribute.DailyLossResist])\n // No need to select targets for units without effect.\n if (i > 0 && !cohort.properties[UnitAttribute.OffensiveSupport]) continue\n\n // Targets are prioritised based two things.\n // 1st: Is target considered primary (healthy).\n // 2nd: Is target directly on front.\n let primaryTarget: number | null = null\n let secondaryTarget: number | null = null\n if (target[0][j]) {\n if (target[0][j]?.isWeak) secondaryTarget = j\n else primaryTarget = j\n }\n // Primary target on front has the highest priority so no need to check flanks.\n if (primaryTarget === null) {\n const maneuver = Math.floor(cohort.properties[UnitAttribute.Maneuver])\n let direction = -1\n const min = Math.max(0, j - maneuver)\n const max = Math.min(targetLength - 1, j + maneuver)\n if (!settings[Setting.FixFlankTargeting] || j < sourceLength / 2) {\n direction = 1\n }\n for (let index = direction > 0 ? min : max; min <= index && index <= max; index += direction) {\n const isWeak = target[0][index]?.isWeak\n if (target[0][index] && (isWeak ? !secondaryTarget : !primaryTarget)) {\n if (isWeak) secondaryTarget = index\n else primaryTarget = index\n state.flanking = true\n }\n }\n }\n const targetIndex = primaryTarget ?? secondaryTarget\n if (targetIndex !== null) {\n state.target = target[0][targetIndex]\n state.targetSupport = getBackTarget(target, targetIndex)\n }\n }\n }\n}\n\n/**\n * Calculates effectiveness of a tactic against another tactic with a given army.\n */\nexport const calculateTactic = (army: Cohorts, tactic: TacticData, counterTactic?: TacticData): number => {\n const versusDamage = counterTactic ? calculateValue(tactic, counterTactic.type) : 1.0\n let averageEffectiveness = 1.0\n if (versusDamage > 0 && tactic && army) {\n let totalStrength = 0\n let totalEffectiveness = 0.0\n\n const addEffectiveness = (cohort: Cohort) => {\n totalStrength += cohort[UnitAttribute.Strength]\n totalEffectiveness += calculateValue(tactic, cohort.properties.type) * cohort[UnitAttribute.Strength]\n }\n iterateCohorts(army, true, addEffectiveness)\n if (totalStrength) averageEffectiveness = totalEffectiveness / totalStrength\n }\n\n return (\n versusDamage *\n Math.max(getConfig().TacticMin, Math.min(getConfig().TacticMax, getConfig().TacticBase + averageEffectiveness))\n )\n}\n\nexport const getTacticMatch = (tactic: TacticData, counterTactic?: TacticData): TacticMatch => {\n const effectiveness = counterTactic ? calculateValue(tactic, counterTactic.type) : 1.0\n if (effectiveness > 0) return TacticMatch.Positive\n if (effectiveness < 0) return TacticMatch.Negative\n return TacticMatch.Neutral\n}\n\nconst calculateFlankRatioPenalty = (armies: Army[], cohorts: Cohorts, setting: CombatSettings) => {\n const ratios = calculateFlankRatios(cohorts)\n return toObj(\n armies,\n army => String(army.participantIndex),\n army =>\n army.flankRatio && ratios[army.participantIndex] > army.flankRatio\n ? setting[Setting.InsufficientSupportPenalty] / (1 - setting[Setting.InsufficientSupportPenalty])\n : 0.0\n )\n}\n\nconst calculateFlankRatios = (cohorts: Cohorts): { [key: string]: number } => {\n const infantry = {} as Record\n const flank = {} as Record\n\n const addRatio = (cohort: Cohort) => {\n if (infantry[cohort.properties.participantIndex] === undefined) infantry[cohort.properties.participantIndex] = 0\n if (flank[cohort.properties.participantIndex] === undefined) flank[cohort.properties.participantIndex] = 0\n if (cohort.properties.role === UnitRole.Front)\n infantry[cohort.properties.participantIndex] += cohort[UnitAttribute.Strength]\n if (cohort.properties.role === UnitRole.Flank)\n flank[cohort.properties.participantIndex] += cohort[UnitAttribute.Strength]\n }\n iterateCohorts(cohorts, true, addRatio)\n return toObj(\n Object.keys(infantry),\n key => key,\n key => flank[key] / noZero(flank[key] + infantry[key])\n )\n}\n\n/**\n * Applies stored losses to units.\n */\nconst applyLosses = (frontline: Frontline) => {\n for (let i = 0; i < frontline.length; i++) {\n for (let j = 0; j < frontline[i].length; j++) {\n const cohort = frontline[i][j]\n if (!cohort) continue\n cohort[UnitAttribute.Morale] = Math.max(0, cohort[UnitAttribute.Morale] - cohort.state.moraleLoss)\n cohort[UnitAttribute.Strength] = Math.max(0, cohort[UnitAttribute.Strength] - cohort.state.strengthLoss)\n }\n }\n}\n\n/**\n * Moves defeated units from a frontline to defeated.\n */\nconst moveDefeated = (environment: Environment, frontline: Frontline, defeated: Cohort[], markDefeated: boolean) => {\n const settings = environment.settings\n let cohortsAlive = false\n for (let i = 0; i < frontline.length; i++) {\n for (let j = 0; j < frontline[i].length; j++) {\n const cohort = frontline[i][j]\n if (!cohort) continue\n if (isAlive(cohort, environment.settings)) {\n cohortsAlive = true\n continue\n }\n if (i > 0 && !settings[Setting.BackRowRetreat]) {\n cohortsAlive = true\n continue\n }\n if (settings[Setting.DynamicTargeting]) cohort.isWeak = true\n if (settings[Setting.RetreatRounds] > environment.round + 1) {\n cohortsAlive = true\n continue\n }\n if (cohort.state.targetedBy) {\n cohort.state.defeatedBy = cohort.state.targetedBy\n cohort.state.captureChance = multiplyChance(\n cohort.state.captureChance,\n cohort.state.targetedBy.properties[UnitAttribute.CaptureChance] -\n cohort.properties[UnitAttribute.CaptureResist]\n )\n }\n defeatCohort(environment, cohort)\n if (!markDefeated) frontline[i][j] = null\n defeated.push(cohort)\n }\n }\n return !cohortsAlive\n}\n\nconst calculateArmyPips = (environment: Environment, source: Side, target: Side, phase: CombatPhase) => {\n const { attacker } = environment\n const crossingSupport = sumBy(source.deployed, item => item.crossingSupport)\n const armySize = sumBy(source.deployed, item => item.armySize)\n const armyS = getLeadingArmy(source)\n const armyT = getLeadingArmy(target)\n const generalPips = armyS && armyT ? calculateGeneralPips(armyS.general, armyT.general, phase) : 0\n const terrainPips =\n armyS && armyT\n ? getTerrainPips(environment, source.type === attacker, armyS.general, armyT.general, crossingSupport / armySize)\n : 0\n source.results.generalPips = generalPips\n source.results.terrainPips = terrainPips\n source.results.totalBonusPips = source.results.dice + source.results.generalPips + source.results.terrainPips\n source.results.actualBonusPips = source.results.totalBonusPips\n}\n\nconst attack = (\n environment: Environment,\n source: Side,\n target: Side,\n dailyMultiplier: number,\n tacticStrengthDamageMultiplier: number,\n phase: CombatPhase\n) => {\n const { settings } = environment\n // Tactic bonus changes dynamically when units lose strength so it can't be precalculated.\n // If this is a problem a fast mode can be implemeted where to bonus is only calculated once.\n const armyS = getLeadingArmy(source)\n const armyT = getLeadingArmy(target)\n source.results.tacticStrengthDamageMultiplier = tacticStrengthDamageMultiplier\n source.results.tacticBonus =\n settings[Setting.Tactics] && armyS && armyT ? calculateTactic(source.cohorts, armyS.tactic, armyT.tactic) : 0.0\n const flankRatioPenalty = calculateFlankRatioPenalty(target.deployed, target.cohorts, settings)\n const multiplier = (1 + source.results.tacticBonus) * dailyMultiplier\n attackSub(\n source.cohorts.frontline,\n settings[Setting.BasePips] + source.results.totalBonusPips,\n multiplier,\n tacticStrengthDamageMultiplier,\n phase,\n flankRatioPenalty,\n settings\n )\n}\n\n/**\n * Calculates losses when units attack their targets.\n */\nconst attackSub = (\n frontline: Frontline,\n roll: number,\n dynamicMultiplier: number,\n strengthMultiplier: number,\n phase: CombatPhase,\n flankRatioPenalty: FlankRatioPenalty,\n settings: CombatSettings\n) => {\n for (let i = 0; i < frontline.length; i++) {\n for (let j = 0; j < frontline[i].length; j++) {\n const source = frontline[i][j]\n if (!source) continue\n const target = source.state.target\n if (!target) continue\n target.state.targetedBy = source\n target.state.flankRatioPenalty = 1.0 + (flankRatioPenalty[target.properties.participantIndex] ?? 0.0)\n const multiplier = calculateDamageMultiplier(source, target, dynamicMultiplier, i > 0, phase, settings)\n calculateMoraleLosses(source, target, source.state.targetSupport, roll, multiplier, phase, settings)\n calculateStrengthLosses(\n source,\n target,\n source.state.targetSupport,\n roll,\n multiplier * strengthMultiplier,\n phase,\n settings\n )\n }\n }\n}\n\nconst calculateCohortDamageMultiplier = (\n source: Cohort,\n target: Cohort,\n isSupport: boolean,\n settings: CombatSettings\n) => {\n const definitionS = source.properties\n const definitionT = target.properties\n\n return (\n source[UnitAttribute.Strength] *\n (settings[Setting.AttributeOffenseDefense]\n ? 1.0 + definitionS[UnitAttribute.Offense] - definitionT[UnitAttribute.Defense]\n : 1.0) *\n (isSupport ? definitionS[UnitAttribute.OffensiveSupport] : 1.0) *\n target.state.flankRatioPenalty\n )\n}\n\nconst calculateDamageMultiplier = (\n source: Cohort,\n target: Cohort,\n dynamicMultiplier: number,\n isSupport: boolean,\n phase: CombatPhase,\n settings: CombatSettings\n) => {\n dynamicMultiplier *= calculateCohortDamageMultiplier(source, target, isSupport, settings)\n if (settings[Setting.DamageLossForMissingMorale]) {\n const morale = source[UnitAttribute.Morale] / source.properties.maxMorale\n dynamicMultiplier *= 1 + (morale - 1) * settings[Setting.DamageLossForMissingMorale]\n }\n source.state.damageMultiplier =\n (dynamicMultiplier *\n source.properties.damage['Damage'][target.properties.type][phase] *\n target.properties.damageTakenMultiplier) /\n settings[Setting.Precision]\n return dynamicMultiplier\n}\n\nconst calculateTotalPips = (\n roll: number,\n maxPips: number,\n source: Cohort,\n target: Cohort,\n targetSupport: Cohort | null,\n type: UnitAttribute.Morale | UnitAttribute.Strength,\n phase?: CombatPhase\n) => {\n return Math.min(\n maxPips,\n Math.max(\n 0,\n roll +\n calculateCohortPips(\n source.properties,\n target.properties,\n targetSupport ? targetSupport.properties : null,\n type,\n phase\n )\n )\n )\n}\n\nconst calculateMoraleLosses = (\n source: Cohort,\n target: Cohort,\n targetSupport: Cohort | null,\n roll: number,\n dynamicMultiplier: number,\n phase: CombatPhase,\n settings: CombatSettings\n) => {\n const pips = calculateTotalPips(roll, settings[Setting.MaxPips], source, target, targetSupport, UnitAttribute.Morale)\n const morale = settings[Setting.UseMaxMorale] ? source.properties.maxMorale : source[UnitAttribute.Morale]\n let damage =\n pips *\n dynamicMultiplier *\n source.properties.damage[UnitAttribute.Morale][target.properties.type][phase] *\n morale *\n target.properties.moraleTakenMultiplier\n if (settings[Setting.MoraleDamageBasedOnTargetStrength]) damage /= target[UnitAttribute.Strength]\n\n source.state.moraleDealt = Math.floor(damage) / settings[Setting.Precision]\n source.state.totalMoraleDealt += source.state.moraleDealt\n target.state.moraleLoss += source.state.moraleDealt\n // Morale damage seems to carry over only when not flanking (but this can be wrong).\n if (!source.state.flanking && targetSupport) targetSupport.state.moraleLoss += source.state.moraleDealt\n}\n\nconst calculateStrengthLosses = (\n source: Cohort,\n target: Cohort,\n targetSupport: Cohort | null,\n roll: number,\n dynamicMultiplier: number,\n phase: CombatPhase,\n settings: CombatSettings\n) => {\n const pips = calculateTotalPips(\n roll,\n settings[Setting.MaxPips],\n source,\n target,\n targetSupport,\n UnitAttribute.Strength,\n phase\n )\n const damage =\n pips *\n dynamicMultiplier *\n source.properties.damage[UnitAttribute.Strength][target.properties.type][phase] *\n target.properties.strengthTakenMultiplier[phase]\n\n source.state.strengthDealt = Math.floor(damage) / settings[Setting.Precision]\n source.state.totalStrengthDealt += source.state.strengthDealt\n target.state.strengthLoss += source.state.strengthDealt\n}\n\n// Global targeting\n\nconst sumArchetypeStrength = (frontline: Frontline) => {\n const archetypes = {} as Record\n\n const add = (cohort: Cohort) => {\n const archetype = cohort.properties.parent ?? cohort.properties.type\n archetypes[archetype] = (archetypes[archetype] ?? 0) + cohort[UnitAttribute.Strength]\n }\n iterateFrontline(frontline, add)\n return archetypes\n}\n\nconst sumArchetypeCounter = (frontline: Frontline, archetypes: UnitType[]) => {\n const archetypeCounters = toObj(\n archetypes,\n key => key,\n () => 0\n )\n\n const add = (cohort: Cohort) => {\n const add2 = (type: UnitType) => {\n archetypeCounters[type] += cohort.properties[type] * cohort[UnitAttribute.Strength]\n }\n archetypes.forEach(add2)\n }\n iterateFrontline(frontline, add)\n return archetypeCounters\n}\n\nconst calculateCounterPenalty = (\n archetypes: { [key in UnitType]: number },\n counters: { [key in UnitType]: number },\n settings: CombatSettings\n) => {\n return map(\n archetypes,\n (strength, type) =>\n strength &&\n clamp(counters[type] / strength, -settings[Setting.MaxCountering], settings[Setting.MaxCountering]) *\n settings[Setting.CounteringDamage]\n )\n}\n\nconst calculateDamages = (\n frontline: Frontline,\n counterPenalties: { [key in UnitType]: number },\n pips: number,\n settings: CombatSettings\n) => {\n const multiplier = pips * settings[Setting.StrengthLostMultiplier]\n let total = 0\n const calculateDamage = (cohort: Cohort) => {\n const damage =\n cohort.properties[UnitAttribute.Damage] *\n cohort[UnitAttribute.Strength] *\n multiplier *\n (1 - counterPenalties[cohort.properties.type])\n cohort.state.damageDealt = damage\n total += damage\n }\n iterateFrontline(frontline, calculateDamage)\n return total\n}\n\nconst calculateLosses = (frontline: Frontline, totalStrength: number, totalDamage: number) => {\n let total = 0\n const calculateLoss = (cohort: Cohort) => {\n const loss =\n (totalDamage * cohort[UnitAttribute.Strength]) / totalStrength / cohort.properties[UnitAttribute.Toughness]\n cohort.state.strengthLoss = loss\n total += loss\n }\n iterateFrontline(frontline, calculateLoss)\n return total\n}\n\nconst calculateKills = (frontline: Frontline, totalKills: number, totalDamage: number) => {\n const calculateLoss = (cohort: Cohort) => {\n const kills = (totalKills * cohort.state.damageDealt) / totalDamage\n cohort.state.strengthDealt = kills\n }\n iterateFrontline(frontline, calculateLoss)\n}\n\n/**\n * CK3 damage formula. Only uses CK3 stuff.\n */\nexport const attackGlobalSub = (a: Frontline, b: Frontline, pipsA: number, pipsB: number, settings: CombatSettings) => {\n const archetypesA = sumArchetypeStrength(a)\n const strengthA = sum(toArr(archetypesA))\n const archetypesB = sumArchetypeStrength(b)\n const strengthB = sum(toArr(archetypesA))\n const counterPenaltyA = calculateCounterPenalty(archetypesA, sumArchetypeCounter(b, keys(archetypesA)), settings)\n const counterPenaltyB = calculateCounterPenalty(archetypesB, sumArchetypeCounter(a, keys(archetypesB)), settings)\n const totalDamageA = calculateDamages(a, counterPenaltyA, pipsA, settings)\n const totalDamageB = calculateDamages(b, counterPenaltyB, pipsB, settings)\n const totalLossA = calculateLosses(a, strengthA, totalDamageB)\n const totalLossB = calculateLosses(b, strengthB, totalDamageA)\n calculateKills(a, totalLossB, totalDamageA)\n calculateKills(b, totalLossA, totalDamageB)\n}\n","import {\n Setting,\n UnitAttribute,\n SideType,\n ResourceLosses,\n WinRateProgress,\n CasualtiesProgress,\n ResourceLossesProgress,\n Cohorts,\n CombatNode,\n Side,\n Environment,\n Cohort,\n UnitProperties,\n Reserve,\n Army\n} from 'types'\nimport { doCombatRound } from './combat'\nimport { mapRange, toObj } from 'utils'\nimport { getConfig } from 'data/config'\n\nexport const initResourceLosses = (): ResourceLosses => ({\n repairMaintenance: 0,\n destroyedCost: 0,\n capturedCost: 0,\n seizedCost: 0,\n seizedRepairMaintenance: 0\n})\n\nconst getParticipantIndexToProperties = (side: Side): Record =>\n toObj(\n side.armies,\n army => String(army.participantIndex),\n army => army.unitProperties\n )\n\nlet interruptSimulation = false\n\n/**\n * Interrupts current win rate calculation.\n */\nexport const interrupt = () => (interruptSimulation = true)\n\nconst createCombatNode = (\n environment: Environment,\n sideA: Side,\n sideB: Side,\n branchIndex = 0,\n combatPhase = 1,\n weightIndex = 1\n) => ({\n cohortsA: copyCohortState(sideA.cohorts),\n deployedA: copyArmiesState(sideA.deployed),\n armiesA: copyArmiesState(sideA.armies),\n cohortsB: copyCohortState(sideB.cohorts),\n deployedB: copyArmiesState(sideB.deployed),\n armiesB: copyArmiesState(sideB.armies),\n branchIndex,\n combatPhase,\n weightIndex,\n round: environment.round,\n day: environment.day,\n attacker: environment.attacker\n})\n\nconst updateFromCombatNode = (node: CombatNode, environment: Environment, sideA: Side, sideB: Side) => {\n environment.day = node.day\n environment.attacker = node.attacker\n environment.round = node.round\n // Most of the data is expected to change, so it's better to deep clone which allows mutations.\n sideA.cohorts = copyCohortState(node.cohortsA)\n sideA.deployed = copyArmiesState(node.deployedA)\n sideA.armies = copyArmiesState(node.armiesA)\n sideB.cohorts = copyCohortState(node.cohortsB)\n sideB.deployed = copyArmiesState(node.deployedB)\n sideB.armies = copyArmiesState(node.armiesB)\n}\n\n/**\n * Calculates win rate for the given battle.\n * @param simulationSettings Settings for simulation accuracy and performance.\n * @param progressCallback Callback to receive progress updates.\n * @param definitions Unit definitions.\n * @param sideA Attacker information.\n * @param sideB Defender information.\n * @param terrains Current terrains.\n */\nexport const calculateWinRate = (\n progressCallback: (progress: WinRateProgress, casualties: CasualtiesProgress, losses: ResourceLossesProgress) => void,\n environment: Environment,\n sideA: Side,\n sideB: Side\n) => {\n const progress: WinRateProgress = {\n calculating: true,\n attacker: 0.0,\n defender: 0.0,\n incomplete: 0.0,\n draws: 0.0,\n progress: 0.0,\n battles: 0,\n averageDays: 0,\n stackWipes: 0,\n days: {}\n }\n interruptSimulation = false\n const settings = environment.settings\n\n const lossesA = initResourceLosses()\n const lossesB = initResourceLosses()\n const resourceLosses: ResourceLossesProgress = { lossesA, lossesB }\n const unitPropertiesA = getParticipantIndexToProperties(sideA)\n const unitPropertiesB = getParticipantIndexToProperties(sideB)\n\n //// Performance is critical. Precalculate as many things as possible.\n const rolls = getRolls(settings[Setting.DiceMinimum], settings[Setting.DiceMaximum], settings[Setting.ReduceRolls])\n const dice2 = rolls.length\n const phasesPerRoll = Math.floor(settings[Setting.PhasesPerRoll])\n const chunkSize = settings[Setting.ChunkSize]\n const maxPhase = settings[Setting.MaxPhases]\n const weights = mapRange(maxPhase + 1, value => 1.0 / Math.pow(dice2, value))\n\n // Simulation is always done from the beginning.\n environment.day = 0\n environment.round = -1\n // Initial deployment is shared for each iteration.\n doCombatRound(environment, sideA, sideB, false)\n const totalA: State = { morale: 0, strength: 0 }\n const currentA: State = { morale: 0, strength: 0 }\n sumState(totalA, sideA)\n const totalB: State = { morale: 0, strength: 0 }\n const currentB: State = { morale: 0, strength: 0 }\n sumState(totalB, sideB)\n const casualties: CasualtiesProgress = {\n avgMoraleA: 0,\n avgMoraleB: 0,\n avgStrengthA: 0,\n avgStrengthB: 0,\n maxMoraleA: totalA.morale,\n maxMoraleB: totalB.morale,\n maxStrengthA: totalA.strength,\n maxStrengthB: totalB.strength,\n moraleA: {},\n moraleB: {},\n strengthA: {},\n strengthB: {},\n winRateA: 0,\n winRateB: 0\n }\n\n // Overview of the algorithm:\n // Initial state is the first node.\n // Nodes have a branch for each possible dice roll.\n // A branch is terminated if the battle ends before the next dice roll.\n // Otherwise end of the phase is added as a node, and set as the new starting point.\n // A node is removed when all its branches are terminated.\n // The previous node is set as the new starting point.\n // Nodes keep a track of the next branch so they know where to continue.\n // Nodes know their depth which determines their weight for win rate.\n\n // Nodes also cache state of units, only store what is absolutely necessary.\n const nodes: CombatNode[] = [createCombatNode(environment, sideA, sideB)]\n\n progressCallback(progress, casualties, resourceLosses)\n\n const work = () => {\n for (let i = 0; i < chunkSize && nodes.length && !interruptSimulation; i++) {\n progress.battles = progress.battles + 1\n const node = nodes[nodes.length - 1]\n updateFromCombatNode(node, environment, sideA, sideB)\n const [rollA, rollB] = rolls[node.branchIndex]\n sideA.results.dice = rollA\n sideB.results.dice = rollB\n let winner = doPhase(environment, sideA, sideB)\n\n let combatPhase = node.combatPhase\n let branchIndex = node.branchIndex\n let weightIndex = node.weightIndex\n\n node.branchIndex++\n if (node.branchIndex === dice2) nodes.pop()\n while (winner === undefined && combatPhase < maxPhase) {\n let doBranch = true\n if (combatPhase % phasesPerRoll === 1) {\n doBranch = false\n }\n combatPhase++\n // Current node will be still used so the cache must be deep cloned.\n // Branch starts at 1 because the current execution is 0.\n if (doBranch && dice2 > 1) {\n branchIndex = 0\n weightIndex++\n nodes.push(createCombatNode(environment, sideA, sideB, 1, combatPhase, weightIndex))\n }\n const [rollA, rollB] = rolls[branchIndex]\n sideA.results.dice = rollA\n sideB.results.dice = rollB\n winner = doPhase(environment, sideA, sideB)\n }\n sumState(currentA, sideA)\n sumState(currentB, sideB)\n if (settings[Setting.CalculateCasualties])\n updateCasualties(casualties, weights[weightIndex], totalA, totalB, currentA, currentB)\n if (settings[Setting.CalculateResourceLosses]) {\n calculateResourceLoss(sideA.cohorts, weights[weightIndex], lossesA, lossesB, unitPropertiesB)\n calculateResourceLoss(sideB.cohorts, weights[weightIndex], lossesB, lossesA, unitPropertiesA)\n }\n updateProgress(\n progress,\n weights[weightIndex],\n winner,\n environment,\n settings[Setting.Stackwipe] && (currentA.strength === 0 || currentB.strength === 0)\n )\n }\n if (!nodes.length) {\n progress.calculating = false\n progress.progress = 1\n }\n if (interruptSimulation) progress.calculating = false\n progressCallback(progress, casualties, resourceLosses)\n if (nodes.length && !interruptSimulation) worker()\n }\n\n const worker = () => setTimeout(work, 0)\n worker()\n}\n\n/** Returns an array of valid dice numbers. */\nconst getValidRolls = (minimum: number, maximum: number, halveTimes: number) => {\n let validRolls = mapRange(maximum - minimum + 1, value => value + minimum)\n for (let i = 0; i < halveTimes; i++) {\n const length = validRolls.length\n if (length % 2) validRolls = validRolls.filter((_, index) => index % 2 === 0)\n else\n validRolls = validRolls.filter((_, index) => (index < length / 2 ? index % 2 === 0 : (length - index) % 2 === 1))\n }\n return validRolls\n}\n\n/**\n * Returns a balanced set of rolls. Higher rolls are prioritized to give results faster.\n */\nconst getRolls = (minimum: number, maximum: number, halveTimes: number) => {\n const validRolls = getValidRolls(minimum, maximum, halveTimes)\n const rolls: number[][] = []\n for (let roll = maximum; roll >= minimum; roll--) {\n if (!validRolls.includes(roll)) continue\n rolls.push([roll, roll])\n for (let roll2 = roll - 1; roll2 >= minimum; roll2--) {\n if (!validRolls.includes(roll2)) continue\n rolls.push([roll2, roll])\n rolls.push([roll, roll2])\n }\n }\n return rolls\n}\n\n/**\n * Custom clone function to only copy state and keep references to constant data same.\n */\nconst copyCohortState = (cohorts: Cohorts): Cohorts => ({\n frontline: cohorts.frontline.map(row => row.map(value => (value ? { ...value } : null))),\n reserve: copyReserveState(cohorts.reserve),\n defeated: cohorts.defeated.map(value => ({ ...value })),\n retreated: cohorts.retreated.map(value => ({ ...value }))\n})\nconst copyReserveState = (reserve: Reserve): Reserve => ({\n front: reserve.front.map(value => ({ ...value })),\n flank: reserve.flank.map(value => ({ ...value })),\n support: reserve.support.map(value => ({ ...value }))\n})\nconst copyArmiesState = (armies: Army[]): Army[] =>\n armies.map(army => ({ ...army, reserve: copyReserveState(army.reserve) }))\n\nconst calculateCaptureLoss = (\n cohort: Cohort,\n weight: number,\n own: ResourceLosses,\n enemy: ResourceLosses,\n enemyDefinitions: { [key: number]: UnitProperties }\n) => {\n const enemyIndex = cohort.state.defeatedBy?.properties.participantIndex ?? cohort.state.stackWipedBy?.participantIndex\n if (enemyIndex === undefined) {\n throw Error('Defeated should always get defeated by something.')\n }\n const cohortCost = weight * cohort.properties[UnitAttribute.Cost]\n if (cohort.state.isDestroyed) {\n own.destroyedCost += cohortCost\n return\n }\n const capture = cohort.state.captureChance ?? 0.0\n const repair =\n ((cohort.properties.maxStrength - cohort[UnitAttribute.Strength]) *\n cohort.properties[UnitAttribute.Maintenance] *\n cohortCost) /\n getConfig().ShipRepair\n if (capture <= 0.0) {\n own.repairMaintenance += repair\n return\n }\n // If captured then the unit doesn't have to be repaired.\n own.repairMaintenance += (1 - capture) * repair\n // If captured then the full cost of unit is lost.\n own.capturedCost += capture * cohortCost\n const enemyProperties = enemyDefinitions[enemyIndex][cohort.properties.type]\n const enemyUnitCost =\n weight *\n (cohort.properties[UnitAttribute.Cost] -\n cohort.properties[UnitAttribute.Cost] +\n enemyProperties[UnitAttribute.Cost])\n const enemyRepairCost =\n ((cohort.properties.maxStrength - cohort[UnitAttribute.Strength]) *\n (cohort.properties[UnitAttribute.Maintenance] -\n cohort.properties[UnitAttribute.Maintenance] +\n enemyProperties[UnitAttribute.Maintenance]) *\n enemyUnitCost) /\n getConfig().ShipRepair\n // If captured then the enemy gainst full cost of the unit.\n enemy.seizedCost -= capture * enemyUnitCost\n // But enemy also has to repair the unit.\n enemy.seizedRepairMaintenance += capture * enemyRepairCost\n}\n\n/**\n * Calculates repair and other resource losses.\n */\nconst calculateResourceLoss = (\n cohorts: Cohorts,\n weight: number,\n own: ResourceLosses,\n enemy: ResourceLosses,\n enemyDefinitions: { [key: number]: UnitProperties }\n) => {\n const { frontline, defeated, retreated } = cohorts\n for (let i = 0; i < frontline.length; i++) {\n for (let j = 0; j < frontline[i].length; j++) {\n const cohort = frontline[i][j]\n if (!cohort) continue\n own.repairMaintenance +=\n (weight *\n (cohort.properties.maxStrength - cohort[UnitAttribute.Strength]) *\n cohort.properties[UnitAttribute.Maintenance] *\n cohort.properties[UnitAttribute.Cost]) /\n getConfig().ShipRepair\n }\n }\n for (let i = 0; i < defeated.length; i++) {\n const cohort = defeated[i]\n calculateCaptureLoss(cohort, weight, own, enemy, enemyDefinitions)\n }\n for (let i = 0; i < retreated.length; i++) {\n const cohort = retreated[i]\n calculateCaptureLoss(cohort, weight, own, enemy, enemyDefinitions)\n }\n}\n\ntype Winner = SideType | null | undefined\n\n/**\n * Simulates one dice roll phase.\n */\nconst doPhase = (environment: Environment, sideA: Side, sideB: Side) => {\n const phaseLength = environment.settings[Setting.PhaseLength]\n // This is only called when combat is happening.\n sideA.armiesRemaining = true\n sideA.isDefeated = false\n sideB.armiesRemaining = true\n sideB.isDefeated = false\n for (let i = 0; i < phaseLength; i++) {\n environment.day++\n doCombatRound(environment, sideA, sideB, false)\n if (sideA.isDefeated || sideB.isDefeated) break\n }\n if (environment.round === -1 && sideA.armiesRemaining && sideB.armiesRemaining)\n skipUntilNextCombatDay(environment, sideA, sideB)\n return getWinner(sideA, sideB)\n}\n\nconst getWinner = (sideA: Side, sideB: Side) => {\n let winner: Winner = undefined\n if (!sideA.armiesRemaining && !sideB.armiesRemaining) winner = null\n else if (!sideA.armiesRemaining) winner = SideType.B\n else if (!sideB.armiesRemaining) winner = SideType.A\n return winner\n}\n\nconst skipUntilNextCombatDay = (environment: Environment, sideA: Side, sideB: Side) => {\n while (environment.round === -1 && environment.day < 10000) {\n environment.day++\n doCombatRound(environment, sideA, sideB, false)\n }\n}\n\ntype State = {\n morale: number\n strength: number\n}\n\nconst sumReserve = (state: State, reserve: Reserve) => {\n for (let i = 0; i < reserve.front.length; i++) {\n const cohort = reserve.front[i]\n state.strength += cohort[UnitAttribute.Strength]\n state.morale += cohort[UnitAttribute.Morale]\n }\n for (let i = 0; i < reserve.flank.length; i++) {\n const cohort = reserve.flank[i]\n state.strength += cohort[UnitAttribute.Strength]\n state.morale += cohort[UnitAttribute.Morale]\n }\n for (let i = 0; i < reserve.support.length; i++) {\n const cohort = reserve.support[i]\n state.strength += cohort[UnitAttribute.Strength]\n state.morale += cohort[UnitAttribute.Morale]\n }\n}\n\nconst sumCohorts = (state: State, cohorts: Cohorts) => {\n for (let i = 0; i < cohorts.frontline.length; i++) {\n for (let j = 0; j < cohorts.frontline[i].length; j++) {\n const cohort = cohorts.frontline[i][j]\n if (!cohort) continue\n state.strength += cohort[UnitAttribute.Strength]\n state.morale += cohort[UnitAttribute.Morale]\n }\n }\n sumReserve(state, cohorts.reserve)\n for (let i = 0; i < cohorts.defeated.length; i++) {\n const cohort = cohorts.defeated[i]\n state.strength += cohort[UnitAttribute.Strength]\n state.morale += cohort[UnitAttribute.Morale]\n }\n for (let i = 0; i < cohorts.retreated.length; i++) {\n const cohort = cohorts.retreated[i]\n state.strength += cohort[UnitAttribute.Strength]\n state.morale += cohort[UnitAttribute.Morale]\n }\n}\n\n/**\n * Counts total morale and strength of units.\n */\nconst sumState = (state: State, side: Side) => {\n state.strength = 0\n state.morale = 0\n sumCohorts(state, side.cohorts)\n side.deployed.forEach(army => sumReserve(state, army.reserve))\n side.armies.forEach(army => sumReserve(state, army.reserve))\n}\n\n/**\n * Updates progress of the calculation.\n */\nconst updateProgress = (\n progress: WinRateProgress,\n weight: number,\n winner: Winner,\n environment: Environment,\n stackWipe: boolean\n) => {\n progress.progress += weight\n if (winner === SideType.A) progress.attacker += weight\n else if (winner === SideType.B) progress.defender += weight\n else if (winner === null) progress.draws += weight\n else progress.incomplete += weight\n if (stackWipe) progress.stackWipes += weight\n progress.averageDays += weight * environment.day\n progress.days[environment.day] = (progress.days[environment.day] || 0) + weight\n}\n\n/**\n * Updates casualties of the calculation.\n */\nconst updateCasualties = (\n casualties: CasualtiesProgress,\n amount: number,\n totalA: State,\n totalB: State,\n currentA: State,\n currentB: State\n) => {\n const lossA = totalA.strength - currentA.strength\n const lossB = totalB.strength - currentB.strength\n casualties.avgMoraleA += (totalA.morale - currentA.morale) * amount\n casualties.avgMoraleB += (totalB.morale - currentB.morale) * amount\n casualties.avgStrengthA += lossA * amount\n casualties.avgStrengthB += lossB * amount\n if (lossA < lossB) casualties.winRateA += amount\n if (lossA > lossB) casualties.winRateB += amount\n\n const moraleA = Math.max(0, currentA.morale).toFixed(1)\n const moraleB = Math.max(0, currentB.morale).toFixed(1)\n const strengthA = Math.max(0, currentA.strength).toFixed(2)\n const strengthB = Math.max(0, currentB.strength).toFixed(2)\n casualties.moraleA[moraleA] = (casualties.moraleA[moraleA] || 0) + amount\n casualties.moraleB[moraleB] = (casualties.moraleB[moraleB] || 0) + amount\n casualties.strengthA[strengthA] = (casualties.strengthA[strengthA] || 0) + amount\n casualties.strengthB[strengthB] = (casualties.strengthB[strengthB] || 0) + amount\n}\n","import { Side, Setting, Cohorts, Cohort, Environment, UnitAttribute } from 'types'\nimport { calculateTotalStrength } from 'combat'\nimport { uncaptureCohort, wipeCohort } from './combat_utils'\nimport { getLeadingArmy } from 'managers/battle'\nimport { getRootParent } from 'managers/units'\n\nexport const checkStackWipe = (environment: Environment, side: Side, enemy: Side) => {\n if (!environment.settings[Setting.Stackwipe]) return false\n if (environment.round > 0 && !side.isDefeated) return false\n const settings = environment.settings\n const noDeploy = environment.round === 0 && side.isDefeated\n const soft = 0 < environment.round && environment.round < settings[Setting.StackwipeRounds]\n const total = calculateTotalStrength(side.cohorts, true)\n const totalEnemy = calculateTotalStrength(enemy.cohorts, true)\n const wipe =\n noDeploy ||\n !total ||\n totalEnemy / total > (soft ? settings[Setting.SoftStackWipeLimit] : settings[Setting.HardStackWipeLimit])\n if (wipe) stackWipe(environment, side, enemy)\n return wipe\n}\n\nconst wasDefeatedDuringCurrentBattle = (environment: Environment, cohort: Cohort) =>\n cohort.state.defeatedDay >= environment.day - environment.round\n\nexport const stackWipe = (environment: Environment, side: Side, enemy: Side) => {\n side.isDefeated = true\n const { frontline, reserve, defeated } = side.cohorts\n const enemyArmy = getLeadingArmy(enemy)\n returnCapturedCohorts(environment, enemy.cohorts)\n const captureChance = enemyArmy\n ? environment.settings[Setting.StackWipeCaptureChance] +\n enemyArmy.unitProperties[getRootParent(environment.mode)][UnitAttribute.CaptureChance]\n : 0\n\n for (let i = 0; i < defeated.length; i++) {\n if (wasDefeatedDuringCurrentBattle(environment, defeated[i])) {\n wipeCohort(environment, defeated[i], enemyArmy, captureChance)\n }\n }\n\n const removeFromReserve = (part: Cohort[]) => {\n for (let i = 0; i < part.length; i++) {\n const cohort = part[i]\n defeated.push(cohort)\n wipeCohort(environment, cohort, enemyArmy, captureChance)\n }\n part.length = 0\n }\n\n for (let i = 0; i < frontline.length; i++) {\n for (let j = 0; j < frontline[i].length; j++) {\n const cohort = frontline[i][j]\n if (!cohort) continue\n // Already defeated is a proxy for UI purposes, just clean it up.\n if (!cohort.state.isDefeated) {\n defeated.push(cohort)\n frontline[i][j] = null\n }\n wipeCohort(environment, cohort, enemyArmy, captureChance)\n }\n }\n removeFromReserve(reserve.front)\n removeFromReserve(reserve.flank)\n removeFromReserve(reserve.support)\n}\n\n/**\n * Sets capture chance to 0 which \"returns\" captured cohorts since they can never get captured.\n * If capturing can happen outside analyze then this needs to work bit differently.\n */\nconst returnCapturedCohorts = (environment: Environment, cohorts: Cohorts) => {\n const { frontline, reserve, defeated } = cohorts\n for (let i = 0; i < defeated.length; i++) {\n if (wasDefeatedDuringCurrentBattle(environment, defeated[i])) {\n uncaptureCohort(defeated[i])\n }\n }\n\n const removeFromReserve = (part: Cohort[]) => {\n for (let i = 0; i < part.length; i++) {\n const cohort = part[i]\n defeated.push(cohort)\n uncaptureCohort(cohort)\n }\n part.length = 0\n }\n\n for (let i = 0; i < frontline.length; i++) {\n for (let j = 0; j < frontline[i].length; j++) {\n const cohort = frontline[i][j]\n if (!cohort) continue\n uncaptureCohort(cohort)\n }\n }\n removeFromReserve(reserve.front)\n removeFromReserve(reserve.flank)\n removeFromReserve(reserve.support)\n}\n","import {\n Battle,\n TerrainType,\n SideType,\n CountryName,\n TerrainData,\n CombatSettings,\n Setting,\n Army,\n UnitType,\n ArmyName,\n SideData,\n Side,\n ArmyDefinition,\n CharacterAttribute,\n Participant,\n CombatPhase,\n UnitAttribute\n} from 'types'\nimport { getCombatUnit, sortReserve } from 'combat'\nimport { map } from 'utils'\nimport { sumBy } from 'lodash'\n\nexport const selectTerrain = (battle: Battle, index: number, terrain: TerrainType) => {\n battle.terrains[index] = terrain\n}\n\nexport const setSeed = (battle: Battle, seed: number) => {\n battle.customSeed = seed || undefined\n battle.seed = seed\n}\nexport const toggleRandomDice = (battle: Battle, sideType: SideType) => {\n const side = battle.sides[sideType]\n side.randomizeDice = !side.randomizeDice\n}\n\nexport const setDice = (battle: Battle, sideType: SideType, dice: number) => {\n battle.sides[sideType].dice = dice\n}\n\nexport const setDaysUntilBattle = (battle: Battle, sideType: SideType, index: number, daysUntilBattle: number) => {\n battle.sides[sideType].participants[index].daysUntilBattle = daysUntilBattle\n}\n\nexport const setPhaseDice = (battle: Battle, sideType: SideType, phase: number, dice: number) => {\n const rolls = battle.sides[sideType].rolls\n while (rolls.length - 1 < phase) rolls.push(0)\n rolls[phase] = dice\n}\n\nexport const addParticipant = (battle: Battle, sideType: SideType, countryName: CountryName, armyName: ArmyName) => {\n battle.sides[sideType].participants.push({\n armyName,\n countryName,\n daysUntilBattle: 0\n })\n}\n\nexport const deleteParticipant = (battle: Battle, sideType: SideType, index: number) => {\n battle.sides[sideType].participants.splice(index, 1)\n}\n\nexport const selectParticipantCountry = (\n battle: Battle,\n sideType: SideType,\n index: number,\n countryName: CountryName,\n armyName: ArmyName\n) => {\n battle.sides[sideType].participants[index].countryName = countryName\n battle.sides[sideType].participants[index].armyName = armyName\n}\n\nexport const selectParticipantArmy = (battle: Battle, sideType: SideType, index: number, armyName: ArmyName) => {\n battle.sides[sideType].participants[index].armyName = armyName\n}\n\nconst getRow = (width: number) => Array(width).fill(null)\n\nexport const getDefaultCombatResults = () => ({\n dailyMultiplier: 0,\n dice: 0,\n generalPips: 0,\n round: 0,\n tacticBonus: 0,\n terrainPips: 0,\n tacticStrengthDamageMultiplier: 0,\n totalBonusPips: 0,\n actualBonusPips: 0\n})\n\nexport const convertSide = (side: SideData, armies: Army[], settings: CombatSettings): Side => {\n const width = settings[Setting.BaseCombatWidth]\n return {\n armiesRemaining: true,\n isDefeated: false,\n cohorts: {\n frontline: settings[Setting.BackRow] ? [getRow(width), getRow(width)] : [getRow(width)],\n defeated: [],\n reserve: {\n front: [],\n flank: [],\n support: []\n },\n retreated: []\n },\n armies,\n deployed: [],\n type: side.type,\n results: getDefaultCombatResults()\n }\n}\n\nexport const convertArmy = (\n participantIndex: number,\n participant: Participant,\n army: ArmyDefinition,\n enemyTypes: UnitType[],\n terrains: TerrainData[],\n settings: CombatSettings\n): Army => {\n const reserve = army.reserve.map((cohort, index) =>\n getCombatUnit(\n participant.countryName,\n participant.armyName,\n participantIndex,\n index,\n settings,\n terrains,\n enemyTypes,\n cohort\n )\n )\n const unitProperties = map(\n army.unitDefinitions,\n unit =>\n getCombatUnit(\n participant.countryName,\n participant.armyName,\n participantIndex,\n -1,\n settings,\n terrains,\n enemyTypes,\n unit\n ).properties\n )\n const sorted = sortReserve(reserve, army.unitPreferences)\n return {\n reserve: sorted,\n crossingSupport: sumBy(reserve, item => item.properties[UnitAttribute.CrossingSupport]),\n armySize: reserve.length,\n flankRatio: army.flankRatio,\n unitProperties,\n flankSize: army.flankSize,\n arrival: participant.daysUntilBattle,\n leftFlank: army.flankSize,\n rightFlank: army.flankSize,\n priority:\n army.general.values[CharacterAttribute.Martial] +\n army.general.values[CombatPhase.Fire] +\n army.general.values[CombatPhase.Shock],\n tactic: army.general.tactic,\n unitPreferences: army.unitPreferences,\n general: army.general.values,\n participantIndex\n }\n}\n\nexport const getLeadingArmy = (side: Side): Army | null => (side.deployed.length ? side.deployed[0] : null)\n\nexport const getParticipantName = (participant: Participant) => participant.countryName + ': ' + participant.armyName\nexport const getDay = (battle: Battle) => battle.days.length - 1\nexport const getStartingPhaseNumber = (battle: Battle) =>\n battle.days.length ? battle.days[battle.days.length - 1].startingPhaseNumber : 0\nexport const getRound = (battle: Battle) => (battle.days.length ? battle.days[battle.days.length - 1].round : -1)\nexport const getAttacker = (battle: Battle) =>\n battle.days.length ? battle.days[battle.days.length - 1].attacker : SideType.A\n","import * as manager from 'managers/battle'\nimport { ModeState, Battle } from 'types'\nimport { getDefaultBattle } from 'data'\nimport { ActionToFunction, makeActionRemoveFirst, Action, ReducerParams, makeReducer } from './utils'\n\nconst mapping: ActionToFunction = {}\n\nexport const selectParticipantCountry = makeActionRemoveFirst(manager.selectParticipantCountry, mapping)\nexport const selectParticipantArmy = makeActionRemoveFirst(manager.selectParticipantArmy, mapping)\nexport const addParticipant = makeActionRemoveFirst(manager.addParticipant, mapping)\nexport const deleteParticipant = makeActionRemoveFirst(manager.deleteParticipant, mapping)\nexport const selectTerrain = makeActionRemoveFirst(manager.selectTerrain, mapping)\nexport const setDice = makeActionRemoveFirst(manager.setDice, mapping)\nexport const setDaysUntilBattle = makeActionRemoveFirst(manager.setDaysUntilBattle, mapping)\nexport const setPhaseDice = makeActionRemoveFirst(manager.setPhaseDice, mapping)\nexport const toggleRandomDice = makeActionRemoveFirst(manager.toggleRandomDice, mapping)\nexport const setSeed = makeActionRemoveFirst(manager.setSeed, mapping)\n\nconst getEntity = (draft: ModeState, _: Action, params: ReducerParams) => draft[params.mode]\n\nexport const battleReducer = makeReducer(getDefaultBattle(), mapping, getEntity)\n","import { createSelectorHook, TypedUseSelectorHook } from 'react-redux'\r\nimport { AppState } from 'state'\r\nimport { CountryName, ArmyName } from 'types'\r\n\r\nexport const useSelector: TypedUseSelectorHook = createSelectorHook()\r\n\r\nexport const getKey = (_: unknown, key: T) => key ?? ''\r\n\r\nexport type ArmyKey = { countryName: CountryName; armyName: ArmyName }\r\nexport const getArmyKey = (_: AppState, key: ArmyKey) => key.countryName + '|' + key.armyName\r\n","import { filterTerrains } from 'managers/terrains'\r\nimport createCachedSelector from 're-reselect'\r\nimport { AppState } from 'state'\r\nimport { LocationType } from 'types'\r\nimport { toArr } from 'utils'\r\nimport { useSelector } from './utils'\r\n\r\nexport const getTerrainsData = (state: AppState) => state.terrains\r\nconst getProp = (_: unknown, prop: LocationType | undefined) => prop ?? ''\r\n\r\n// Terrains are cached because they rarely change and filtering would always return a new instance.\r\n\r\nexport const getTerrainsDict = createCachedSelector([getTerrainsData, getProp], (terrains, location) =>\r\n location ? filterTerrains(terrains, location) : terrains\r\n)(getProp)\r\n\r\nexport const getTerrainsArray = createCachedSelector([getTerrainsDict], terrains => toArr(terrains))(getProp)\r\n\r\nexport const getTerrainTypes = createCachedSelector([getTerrainsArray], terrains => terrains.map(item => item.type))(\r\n getProp\r\n)\r\n\r\nexport const useTerrainsDict = (location?: LocationType) => useSelector(state => getTerrainsDict(state, location))\r\n\r\nexport const useTerrainsArray = (location?: LocationType) => useSelector(state => getTerrainsArray(state, location))\r\n","import { TerrainValueType, ValuesType, TerrainData, LocationType, TerrainsData, TerrainType } from 'types'\nimport { addValuesWithMutate } from 'data_values'\nimport { filter } from 'utils'\n\nexport const setTerrainValue = (terrain: TerrainData, key: string, attribute: TerrainValueType, value: number) => {\n addValuesWithMutate(terrain, ValuesType.Base, key, [[attribute, value]])\n}\n\nexport const setTerrainLocation = (terrain: TerrainData, location: LocationType) => {\n terrain.location = location\n}\n\nexport const setTerrainImage = (terrain: TerrainData, image: string) => {\n terrain.image = image\n}\n\nexport const deleteTerrain = (terrains: TerrainsData, type: TerrainType) => {\n delete terrains[type]\n}\n\nexport const createTerrain = (terrains: TerrainsData, type: TerrainType) => {\n terrains[type] = { type, image: '', location: LocationType.Border }\n}\n\nexport const setTerrainType = (terrains: TerrainsData, oldType: TerrainType, type: TerrainType) => {\n delete Object.assign(terrains, { [type]: { ...terrains[oldType], type } })[oldType]\n}\n\nconst filterTerrain = (terrain: TerrainData, location: LocationType) => terrain.location === location\n\nexport const filterTerrains = (terrains: TerrainsData, location: LocationType) =>\n filter(terrains, terrain => filterTerrain(terrain, location))\n","import { AppState } from 'state'\r\nimport { SideType } from 'types'\r\nimport { keys } from 'utils'\r\nimport { getArmies, getCountries } from './countries'\r\nimport { useSelector } from './utils'\r\n\r\nexport const getSelectedParticipantIndex = (state: AppState, sideType: SideType) =>\r\n state.ui.selectedParticipantIndex[sideType]\r\nexport const getMode = (state: AppState) => state.ui.mode\r\nexport const getSelectedArmyIndex = (state: AppState) => state.ui.selectedArmyIndex\r\nexport const getSelectedCountryIndex = (state: AppState) => state.ui.selectedCountryIndex\r\n\r\n// No need to cache these because strings are returned and not used for combat calculations.\r\nexport const getSelectedCountry = (state: AppState) => keys(getCountries(state))[getSelectedCountryIndex(state)]\r\nexport const getSelectedArmy = (state: AppState) =>\r\n keys(getArmies(state, getSelectedCountry(state)))[getSelectedArmyIndex(state)]\r\n\r\nexport const useMode = () => useSelector(getMode)\r\nexport const useSelectedParticipantIndex = (sideType: SideType) =>\r\n useSelector(state => getSelectedParticipantIndex(state, sideType))\r\nexport const useSelectedArmyIndex = () => useSelector(getSelectedArmyIndex)\r\nexport const useSelectedCountryIndex = () => useSelector(getSelectedCountryIndex)\r\nexport const useSelectedCountry = () => useSelector(getSelectedCountry)\r\n","import * as manager from 'managers/battle'\r\nimport { createSelector } from 'reselect'\r\nimport { AppState } from 'state'\r\nimport { Mode, SideType } from 'types'\r\nimport { getTerrainsData } from './terrains'\r\nimport { getMode } from './ui'\r\nimport { useSelector } from './utils'\r\n\r\nexport const getBattle = (state: AppState, mode?: Mode) => state.battle[mode ?? getMode(state)]\r\nexport const getTimestamp = (state: AppState, mode?: Mode) => getBattle(state, mode).timestamp\r\nexport const getSide = (state: AppState, sideType: SideType, mode?: Mode) => getBattle(state, mode).sides[sideType]\r\nexport const getParticipants = (state: AppState, sideType: SideType, mode?: Mode) =>\r\n getBattle(state, mode).sides[sideType].participants\r\nexport const getRound = (state: AppState) => manager.getDay(getBattle(state))\r\nexport const getOutdated = (state: AppState) => getBattle(state).outdated\r\nexport const getCombatSide = (state: AppState, sideType: SideType) => {\r\n const side = getSide(state, sideType)\r\n return side.days[side.days.length - 1]\r\n}\r\nexport const getSelectedTerrainTypes = (state: AppState) => getBattle(state).terrains\r\n\r\nexport const getCohorts = (state: AppState, sideType: SideType) => getCombatSide(state, sideType).cohorts\r\n\r\nexport const getSelectedTerrains = createSelector([getSelectedTerrainTypes, getTerrainsData], (selected, terrains) =>\r\n selected.map(item => terrains[item])\r\n)\r\n\r\nexport const useTimestamp = () => useSelector(getTimestamp)\r\nexport const useBattle = () => useSelector(getBattle)\r\nexport const useSide = (sideType: SideType, mode?: Mode) => useSelector(state => getSide(state, sideType, mode))\r\nexport const useParticipants = (sideType: SideType, mode?: Mode) =>\r\n useSelector(state => getParticipants(state, sideType, mode))\r\nexport const useRound = () => useSelector(getRound)\r\nexport const useOutdated = () => useSelector(getOutdated)\r\nexport const useCombatSide = (sideType: SideType) => useSelector(state => getCombatSide(state, sideType))\r\nexport const useSelectedTerrains = () => useSelector(getSelectedTerrains)\r\nexport const useCohorts = (sideType: SideType) => useSelector(state => getCohorts(state, sideType))\r\n","import { calculateValue } from 'data_values'\r\nimport { sumBy } from 'lodash'\r\nimport { useSelector } from 'react-redux'\r\nimport { createSelector } from 'reselect'\r\nimport { AppState } from 'state'\r\nimport { CombatSettings, CountryAttribute, Setting, SideType, TerrainCalc } from 'types'\r\nimport { getParticipants, getSelectedTerrains } from './battle'\r\nimport { getCountry } from './countries'\r\nimport { getMode } from './ui'\r\n\r\nexport const getSharedSettings = (state: AppState) => state.settings.sharedSettings\r\nconst getModeSettings = (state: AppState) => state.settings.modeSettings[getMode(state)]\r\n\r\n// Todo: This should be cached.\r\nconst getCombatWidth = (state: AppState) => {\r\n const settings = getSharedSettings(state)\r\n const attackers = getParticipants(state, SideType.A).map(\r\n item => getCountry(state, item.countryName)[CountryAttribute.CombatWidth]\r\n )\r\n const defenders = getParticipants(state, SideType.B).map(\r\n item => getCountry(state, item.countryName)[CountryAttribute.CombatWidth]\r\n )\r\n const terrains = sumBy(getSelectedTerrains(state), terrain => calculateValue(terrain, TerrainCalc.CombatWidth))\r\n return settings[Setting.BaseCombatWidth] + terrains + Math.max(...attackers, ...defenders)\r\n}\r\n\r\nexport const getCombatSettings = createSelector(\r\n [getSharedSettings, getModeSettings, getCombatWidth],\r\n (shared, mode, combatWidth) => {\r\n const settings = { ...shared, ...mode } as CombatSettings\r\n settings[Setting.BaseCombatWidth] = combatWidth\r\n settings[Setting.Precision] = Math.pow(10, settings[Setting.Precision])\r\n return settings\r\n }\r\n)\r\n\r\nexport const useCombatSettings = () => useSelector(getCombatSettings)\r\nexport const useCombatWidth = () => useSelector(getCombatWidth)\r\n","import { convertCountryData, convertCountryDefinition, filterArmies } from 'managers/countries'\r\nimport * as manager from 'managers/modifiers'\r\nimport createCachedSelector from 're-reselect'\r\nimport { createSelector } from 'reselect'\r\nimport { AppState } from 'state'\r\nimport { CountryName } from 'types'\r\nimport { keys } from 'utils'\r\nimport { getSharedSettings } from './settings'\r\nimport { getMode } from './ui'\r\nimport { getKey, useSelector } from './utils'\r\n\r\nexport const getCountries = (state: AppState) => state.countries\r\nexport const getCountryData = (state: AppState, countryName: CountryName) => getCountries(state)[countryName]\r\nexport const getCountryNames = createSelector([getCountries], keys)\r\nexport const getWeariness = (state: AppState, countryName: CountryName) => getCountryData(state, countryName).weariness\r\nconst getCulture = (state: AppState, countryName: CountryName) => getCountryData(state, countryName).modifiers.culture\r\nconst getAllArmies = (state: AppState, countryName: CountryName) => getCountryData(state, countryName).armies\r\n\r\nexport const getArmies = createCachedSelector([getAllArmies, getMode], filterArmies)(getKey)\r\nexport const getArmyNames = createCachedSelector([getArmies], keys)(getKey)\r\n\r\nexport const getCountryModifiers = createCachedSelector([getCountryData], country => {\r\n return manager.getCountryModifiers(country.modifiers)\r\n})(getKey)\r\n\r\nexport const getCountryDefinition = createCachedSelector([getCountryData], convertCountryData)(getKey)\r\nexport const getCountry = createCachedSelector(\r\n [getCountryDefinition, getSharedSettings],\r\n convertCountryDefinition\r\n)(getKey)\r\n\r\nexport const useCountryDefinition = (countryName: CountryName) =>\r\n useSelector(state => getCountryDefinition(state, countryName))\r\n\r\nexport const useCountries = () => useSelector(getCountries)\r\nexport const useCountryNames = () => useSelector(getCountryNames)\r\nexport const useWeariness = (countryName: CountryName) => useSelector(state => getWeariness(state, countryName))\r\nexport const useCulture = (countryName: CountryName) => useSelector(state => getCulture(state, countryName))\r\nexport const useArmies = (countryName: CountryName) => useSelector(state => getArmies(state, countryName))\r\nexport const useArmyNames = (countryName: CountryName) => useSelector(state => getArmyNames(state, countryName))\r\n","import {\n Mode,\n UnitValues,\n ArmyPart,\n SideType,\n UnitsData,\n UnitType,\n UnitDefinitions,\n UnitDefinition,\n Cohorts,\n CombatSharedSettings,\n ReserveDefinition,\n CohortDefinition,\n CohortData\n} from 'types'\nimport { mergeValues, shrinkValues } from 'data_values'\nimport { map, filter } from 'utils'\nimport { applyDynamicAttributes } from 'managers/units'\n\n/** Merges cohort definitions with their units to get actual cohorts. */\nexport const convertReserveDefinitions = (\n settings: CombatSharedSettings,\n reserve: ReserveDefinition,\n units: UnitDefinitions\n): ReserveDefinition => reserve.map(cohort => convertCohortDefinition(settings, cohort, units))\n\nexport const convertCohortDefinition = (\n settings: CombatSharedSettings,\n cohort: CohortData,\n units: UnitDefinitions\n): CohortDefinition => applyDynamicAttributes(mergeValues(units[cohort.type], cohort), settings)\n\n/** Shrinks definition values under name of the unit, preventing values being overwritten when merging definitions. */\nexport const shrinkUnits = (definitions: T) =>\n map(definitions, unit => shrinkValues(unit, unit.type)) as T\n\nexport const convertUnitDefinitions = (\n settings: CombatSharedSettings,\n definitions: UnitsData,\n general: UnitValues\n): UnitDefinitions => {\n return map(definitions, (_, type) =>\n convertUnitDefinition(settings, definitions, shrinkUnits(definitions), general, type)\n )\n}\n\nexport const convertUnitDefinition = (\n settings: CombatSharedSettings,\n definitions: UnitsData,\n parents: UnitsData,\n general: UnitValues,\n type: UnitType\n): UnitDefinition => {\n let unit = mergeValues(definitions[type], general[type])\n let parent = unit.parent\n const merged = [type]\n while (parent && !merged.includes(parent)) {\n merged.push(parent)\n unit = mergeValues(mergeValues(unit, parents[parent]), general[parent])\n parent = parents[parent]?.parent\n }\n return applyDynamicAttributes(unit, settings) as UnitDefinition\n}\n\n/**\n * Returns unit definitions for current battle mode.\n * @param mode\n * @param definitions\n */\nexport const filterUnitDefinitions = (mode: Mode, definitions: UnitDefinitions): UnitDefinitions =>\n filter(definitions, unit => unit.mode === mode)\n\nexport const getArmyPart = (units: Cohorts, type: ArmyPart) => {\n if (type === ArmyPart.Frontline) return units.frontline\n if (type === ArmyPart.Reserve) return [units.reserve.front.concat(units.reserve.flank).concat(units.reserve.support)]\n if (type === ArmyPart.Defeated) return [units.defeated]\n return [units.retreated]\n}\n\nexport const getOpponent = (side: SideType) => (side === SideType.A ? SideType.B : SideType.A)\n","import { getOpponent } from 'army_utils'\r\nimport { convertTactic, filterTactics } from 'managers/tactics'\r\nimport { AppState } from 'state'\r\nimport { SideType } from 'types'\r\nimport { toArr } from 'utils'\r\nimport { getLeadingArmy } from './armies'\r\nimport { getCohorts } from './battle'\r\nimport { getMode } from './ui'\r\nimport { useSelector } from './utils'\r\n\r\nexport const getTacticsData = (state: AppState) => state.tactics\r\n\r\nconst getTactics = (state: AppState, side: SideType) => {\r\n const cohorts = getCohorts(state, side)\r\n const opponent = getLeadingArmy(state, getOpponent(side))\r\n const mode = getMode(state)\r\n const tactics = toArr(filterTactics(getTacticsData(state), mode))\r\n return opponent ? tactics.map(tactic => convertTactic(tactic, cohorts, opponent.tactic)) : []\r\n}\r\n\r\nexport const useTactics = (side: SideType) => useSelector(state => getTactics(state, side))\r\n\r\nexport const useTactic = (side: SideType) => useSelector(state => getTactics(state, side))\r\n","import {\n TacticType,\n TacticValueType,\n ValuesType,\n Mode,\n TacticData,\n TacticsData,\n Cohorts,\n Tactic,\n TacticCalc\n} from 'types'\nimport { addValuesWithMutate, calculateValue } from 'data_values'\nimport { getTacticIcon } from 'data'\nimport { calculateTactic, getTacticMatch } from 'combat'\nimport { filter } from 'utils'\n\nexport const setTacticValue = (tactic: TacticData, key: string, attribute: TacticValueType, value: number) => {\n addValuesWithMutate(tactic, ValuesType.Base, key, [[attribute, value]])\n}\n\nexport const deleteTactic = (tactics: TacticsData, type: TacticType) => {\n delete tactics[type]\n}\n\nexport const createTactic = (tactics: TacticsData, type: TacticType, mode: Mode) => {\n tactics[type] = { type, mode, image: getTacticIcon(type) }\n}\n\nexport const setTacticType = (tactics: TacticsData, oldType: TacticType, type: TacticType) => {\n delete Object.assign(tactics, { [type]: { ...tactics[oldType], type } })[oldType]\n}\n\nexport const setTacticImage = (tactic: TacticData, image: string) => {\n tactic.image = image\n}\n\nexport const setTacticMode = (tactic: TacticData, mode: Mode) => {\n tactic.mode = mode\n}\n\nexport const convertTactic = (tactic: TacticData, cohorts: Cohorts, opposingTactic: TacticData): Tactic => {\n return {\n type: tactic.type,\n effect: calculateTactic(cohorts, tactic),\n damage: calculateTactic(cohorts, tactic, opposingTactic),\n casualties: calculateValue(tactic, TacticCalc.Casualties),\n image: tactic.image,\n match: getTacticMatch(tactic, opposingTactic)\n }\n}\n\nconst filterTactic = (tactic: TacticData, mode: Mode) => tactic.mode === mode\n\nexport const filterTactics = (tactics: TacticsData, mode: Mode) => filter(tactics, tactic => filterTactic(tactic, mode))\n","import { applyGeneralModifiers, convertGeneralDefinition } from 'managers/army'\r\nimport * as manager from 'managers/modifiers'\r\nimport * as battleManager from 'managers/battle'\r\nimport createCachedSelector from 're-reselect'\r\nimport { AppState } from 'state'\r\nimport { ArmyName, CountryName, GeneralDefinition, Mode, Participant, SideType } from 'types'\r\nimport { getArmyKey, ArmyKey, useSelector } from './utils'\r\nimport { getParticipantName } from 'managers/battle'\r\nimport { getArmies, getCountryData } from './countries'\r\nimport { getCombatSettings } from './settings'\r\nimport { getTacticsData } from './tactics'\r\nimport { getCombatSide, getSide } from './battle'\r\n\r\nconst getArmyData = (state: AppState, countryName: CountryName, armyName: ArmyName) =>\r\n getArmies(state, countryName)[armyName]\r\n\r\nconst getUnitPreferences = (state: AppState, countryName: CountryName, armyName: ArmyName) =>\r\n getArmyData(state, countryName, armyName).unitPreferences\r\n\r\nconst getGeneral = (state: AppState, key: ArmyKey) =>\r\n getCountryData(state, key.countryName).armies[key.armyName].general\r\n\r\nexport const getGeneralModifiers = createCachedSelector([getGeneral], general => {\r\n return manager.getGeneralModifiers(general)\r\n})(getArmyKey)\r\n\r\nexport const getGeneralData = createCachedSelector([getGeneral, getGeneralModifiers], (general, modifiers) => {\r\n return applyGeneralModifiers(general, modifiers)\r\n})(getArmyKey)\r\n\r\nexport const getGeneralDefinition = createCachedSelector(\r\n [getCombatSettings, getGeneralData, getTacticsData],\r\n (settings, general, tactics) => convertGeneralDefinition(settings, general, tactics)\r\n)(getArmyKey)\r\n\r\nexport const getParticipant = (state: AppState, type: SideType, index: number, mode?: Mode): Participant =>\r\n getSide(state, type, mode).participants[index]\r\n\r\nexport const getLeadingArmy = (state: AppState, sideType: SideType) => {\r\n const side = getCombatSide(state, sideType)\r\n return battleManager.getLeadingArmy(side)\r\n}\r\n\r\nexport const useParticipant = (type: SideType, index: number, mode?: Mode) =>\r\n useSelector(state => getParticipant(state, type, index, mode))\r\n\r\nexport const useParticipantName = (type: SideType, index: number, mode?: Mode) =>\r\n useSelector(state => getParticipantName(getParticipant(state, type, index, mode)))\r\n\r\nexport const useGeneral = (countryName: CountryName, armyName: ArmyName): GeneralDefinition => {\r\n const key = { countryName, armyName }\r\n return useSelector(state => getGeneralDefinition(state, key))\r\n}\r\n\r\nexport const useLeadingArmy = (sideType: SideType) => useSelector(state => getLeadingArmy(state, sideType))\r\n\r\nexport const useArmyData = (countryName: CountryName, armyName: ArmyName) =>\r\n useSelector(state => getArmyData(state, countryName, armyName))\r\n\r\nexport const useUnitPrefences = (countryName: CountryName, armyName: ArmyName) =>\r\n useSelector(state => getUnitPreferences(state, countryName, armyName))\r\n","import { convertUnitDefinitions, filterUnitDefinitions } from 'army_utils'\nimport { applyUnitModifiers } from 'managers/units'\nimport createCachedSelector from 're-reselect'\nimport { AppState } from 'state'\nimport { getGeneralData, getGeneralModifiers } from './armies'\nimport { getCountryModifiers } from './countries'\nimport { getCombatSettings } from './settings'\nimport { getMode } from './ui'\nimport { ArmyKey, getArmyKey } from './utils'\n\nconst getUnits = (state: AppState, key: ArmyKey) => state.countries[key.countryName].units\n\nconst getCountryModifiersWithKey = (state: AppState, key: ArmyKey) => getCountryModifiers(state, key.countryName)\n\nconst getSubDefinitions = createCachedSelector(\n [getUnits, getCountryModifiersWithKey, getGeneralModifiers],\n (units, countryModifiers, generalModifiers) => {\n return applyUnitModifiers(units, countryModifiers.concat(generalModifiers))\n }\n)(getArmyKey)\n\nexport const getUnitDefinitions = createCachedSelector(\n [getMode, getGeneralData, getCombatSettings, getSubDefinitions],\n (mode, generalData, settings, subDefinitions) => {\n const general = generalData.definitions\n const units = convertUnitDefinitions(settings, subDefinitions, general)\n return filterUnitDefinitions(mode, units)\n }\n)(getArmyKey)\n","import { AppState, getCombatEnvironment, convertSides } from 'state'\nimport { doCombatRound, removeDefeated, getCombatPhaseNumber } from 'combat'\nimport { Battle, SideType, Setting, Cohorts, SideData, Side, Environment, Army, Reserve, Mode } from 'types'\nimport { createEntropy, MersenneTwister19937, Random } from 'random-js'\nimport { forEach } from 'utils'\nimport { getDay, getStartingPhaseNumber, getRound } from './battle'\nimport produce from 'immer'\nimport { getCombatSide, getMode } from 'selectors'\n\nconst copyCohorts = (cohorts: Cohorts): Cohorts => ({\n frontline: cohorts.frontline.map(row => row.map(value => (value ? { ...value, state: { ...value.state } } : null))),\n reserve: copyReserve(cohorts.reserve),\n defeated: cohorts.defeated.map(value => ({ ...value, state: { ...value.state } })),\n retreated: cohorts.retreated.map(value => ({ ...value, state: { ...value.state } }))\n})\n\nconst copyReserve = (reserve: Reserve): Reserve => ({\n front: reserve.front.map(value => ({ ...value, state: { ...value.state } })),\n flank: reserve.flank.map(value => ({ ...value, state: { ...value.state } })),\n support: reserve.support.map(value => ({ ...value, state: { ...value.state } }))\n})\nconst copyArmies = (armies: Army[]): Army[] => armies.map(army => ({ ...army, reserve: copyReserve(army.reserve) }))\n\nconst freeseSize = (side: Side) => {\n Object.freeze(side.armies)\n Object.freeze(side.cohorts)\n Object.freeze(side.deployed)\n}\n\n// Copy is needed because of freezing stuff.\n// And freezing is needed because of some immer issue.\nconst copy = (side: Side): Side => ({\n ...side,\n deployed: copyArmies(side.deployed),\n cohorts: copyCohorts(side.cohorts),\n armies: copyArmies(side.armies),\n results: { ...side.results }\n})\n\nexport const subBattle = (battle: Battle, env: Environment, attacker: Side, defender: Side, steps: number) => {\n const sideA = battle.sides[SideType.A]\n const sideD = battle.sides[SideType.B]\n const settings = env.settings\n const round = getRound(battle)\n const day = getDay(battle)\n const phaseNumber = getStartingPhaseNumber(battle) + getCombatPhaseNumber(getRound(battle), settings)\n\n battle.outdated = false\n battle.timestamp = new Date().getMilliseconds()\n const minimumRoll = settings[Setting.DiceMinimum]\n const maximumRoll = settings[Setting.DiceMaximum]\n const rollFrequency = settings[Setting.PhaseLength]\n // Regenerate seed for the first roll (undo resets it when going back to deployment).\n if (day + steps > 0 && !battle.seed) battle.seed = battle.customSeed ?? Math.abs(createEntropy(undefined, 1)[0])\n const engine = MersenneTwister19937.seed(battle.seed)\n engine.discard(2 * phaseNumber)\n const rng = new Random(engine)\n\n const rollDice = (side: SideData) => {\n if (getRound(battle) % rollFrequency !== 0) return null\n // Always throw dice so that manually setting one side won't affect the other.\n const random = rng.integer(minimumRoll, maximumRoll)\n const phase = getStartingPhaseNumber(battle) + getCombatPhaseNumber(getRound(battle), settings)\n if (side.randomizeDice) return random\n else if (phase < side.rolls.length && side.rolls[phase]) return side.rolls[phase]\n else return side.dice\n }\n\n if (day === -1) {\n attacker = copy(attacker)\n defender = copy(defender)\n env.day = 0\n env.round = round\n doCombatRound(env, attacker, defender, true)\n battle.fightOver = !attacker.armiesRemaining || !defender.armiesRemaining\n freeseSize(attacker)\n freeseSize(defender)\n sideA.days = [attacker]\n sideD.days = [defender]\n battle.days.push({ round: env.round, startingPhaseNumber: 0, attacker: env.attacker })\n }\n\n for (let step = 0; step < steps && !battle.fightOver; ++step) {\n attacker = copy(attacker)\n defender = copy(defender)\n attacker.results.dice = rollDice(sideA) ?? attacker.results.dice\n defender.results.dice = rollDice(sideD) ?? defender.results.dice\n env.day = getDay(battle) + 1\n env.round = getRound(battle)\n doCombatRound(env, attacker, defender, true)\n\n battle.fightOver = !attacker.armiesRemaining || !defender.armiesRemaining\n if (battle.fightOver) {\n removeDefeated(attacker.cohorts.frontline)\n removeDefeated(defender.cohorts.frontline)\n }\n let startingPhaseNumber = getStartingPhaseNumber(battle)\n if (env.round === -1) {\n startingPhaseNumber += getCombatPhaseNumber(getRound(battle), settings)\n }\n\n freeseSize(attacker)\n freeseSize(defender)\n sideA.days.push(attacker)\n sideD.days.push(defender)\n battle.days.push({ round: env.round, startingPhaseNumber, attacker: env.attacker })\n }\n}\n\nexport const battle = (pair: [AppState, AppState], steps: number) => {\n const [state, draft] = pair\n const mode = getMode(state)\n const battle = draft.battle[mode]\n subBattle(\n battle,\n getCombatEnvironment(state),\n getCombatSide(state, SideType.A),\n getCombatSide(state, SideType.B),\n steps\n )\n}\n\nexport const refreshBattle = (pair: [AppState, AppState], mode?: Mode) => {\n const [state, draft] = pair\n mode = mode ?? getMode(state)\n const battle = draft.battle[mode]\n const steps = getDay(battle)\n battle.days = []\n const [attacker, defender] = convertSides(state)\n subBattle(battle, getCombatEnvironment(draft), attacker, defender, steps)\n}\n\n/**\n * Initializes battle state to contain initial data.\n * Lots of code requires this data to work properly.\n */\nexport const initialize = (state?: AppState) => {\n if (!state) return state\n if (state.battle[Mode.Land].timestamp > 0 && state.battle[Mode.Naval].timestamp > 0) return state\n return produce(state, (draft: AppState) => {\n refreshBattle([state, draft], Mode.Land)\n refreshBattle([state, draft], Mode.Naval)\n })\n}\n\nexport const undo = (pair: [AppState, AppState], steps: number) => {\n const [state, draft] = pair\n const mode = getMode(state)\n const battle = draft.battle[mode]\n for (let step = 0; step < steps && battle.days.length > 1; ++step) {\n let seed: number = battle.seed\n if (getDay(battle) < 2) seed = battle.customSeed ? battle.customSeed : 0\n forEach(battle.sides, side => {\n side.days.pop()\n })\n battle.days.pop()\n battle.seed = seed\n battle.fightOver = false\n battle.timestamp = new Date().getMilliseconds()\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as manager from 'managers/combat'\nimport { ActionToFunction, makeActionRemoveFirst, makeReducer } from './utils'\nimport { AppState } from 'state'\n\nconst mapping: ActionToFunction<[AppState, AppState]> = {}\n\nexport const battle = makeActionRemoveFirst(manager.battle, mapping)\nexport const refreshBattle = makeActionRemoveFirst(manager.refreshBattle, mapping)\nexport const undo = makeActionRemoveFirst(manager.undo, mapping)\n\nconst getState = (draft: AppState, _2: any, _3: any, state: AppState) => [state, draft]\n\nexport const combatReducer = makeReducer({} as AppState, mapping, getState as any)\n","import * as manager from 'managers/countries'\nimport { Countries, CountryDefinition, CountryName } from 'types'\nimport { getDefaultCountryDefinitions } from 'data'\nimport {\n makeContainerReducer,\n ActionToFunction,\n makeActionRemoveFirst,\n makeEntityReducer,\n compose,\n makeActionReplaceFirst\n} from './utils'\n\nconst countriesMapping: ActionToFunction = {}\n\nexport const createCountry = makeActionRemoveFirst(manager.createCountry, countriesMapping)\nexport const importCountry = makeActionRemoveFirst(manager.importCountry, countriesMapping)\nexport const deleteCountry = makeActionRemoveFirst(manager.deleteCountry, countriesMapping)\nexport const changeCountryName = makeActionRemoveFirst(manager.changeCountryName, countriesMapping)\n\nconst countries = makeContainerReducer(getDefaultCountryDefinitions(), countriesMapping)\n\nconst countryMapping: ActionToFunction = {}\n\nexport const clearCountrySelection = makeActionReplaceFirst(manager.clearCountrySelection, countryMapping)\nexport const clearCountrySelections = makeActionReplaceFirst(manager.clearCountrySelections, countryMapping)\nexport const enableCountrySelection = makeActionReplaceFirst(manager.enableCountrySelection, countryMapping)\nexport const enableCountrySelections = makeActionReplaceFirst(manager.enableCountrySelections, countryMapping)\nexport const selectCulture = makeActionReplaceFirst(manager.selectCulture, countryMapping)\nexport const selectGovernment = makeActionReplaceFirst(manager.selectGovernment, countryMapping)\nexport const setCountryAttribute = makeActionReplaceFirst(manager.setCountryAttribute, countryMapping)\nexport const clearCountryAttributes = makeActionReplaceFirst(manager.clearCountryAttributes, countryMapping)\nexport const changeWeariness = makeActionReplaceFirst(manager.changeWeariness, countryMapping)\nexport const createArmy = makeActionReplaceFirst(manager.createArmy, countryMapping)\nexport const deleteArmy = makeActionReplaceFirst(manager.deleteArmy, countryMapping)\nexport const changeArmyName = makeActionReplaceFirst(manager.changeArmyName, countryMapping)\n\nconst country = makeEntityReducer(getDefaultCountryDefinitions(), countryMapping)\n\nexport const countriesReducer = compose(country, countries)\n","import * as manager from 'managers/settings'\nimport { makeActionRemoveFirst, makeContainerReducer, ActionToFunction } from './utils'\nimport { Settings } from 'types'\nimport { getDefaultSettings } from 'data'\n\nconst mapping: ActionToFunction = {}\n\nexport const changeCombatParameter = makeActionRemoveFirst(manager.changeCombatParameter, mapping)\nexport const changeSiteParameter = makeActionRemoveFirst(manager.changeSiteParameter, mapping)\n\nexport const settingsReducer = makeContainerReducer(getDefaultSettings(), mapping)\n","import { Settings, CombatModeSettings, CombatSharedSettings, Setting, Mode } from 'types'\nimport { speedValues } from 'data'\n\nexport const changeCombatParameter = (\n settings: Settings,\n mode: Mode,\n key: keyof CombatModeSettings,\n value: number | boolean | string\n) => {\n settings.modeSettings[mode][key] = value as never\n}\n\nexport const changeSiteParameter = (\n settings: Settings,\n key: keyof CombatSharedSettings,\n value: number | boolean | string\n) => {\n if (key === Setting.Performance && typeof value === 'string' && speedValues[value]) {\n settings.sharedSettings[Setting.PhasesPerRoll] = speedValues[value][0]\n settings.sharedSettings[Setting.MaxPhases] = speedValues[value][1]\n settings.sharedSettings[Setting.ReduceRolls] = speedValues[value][2]\n }\n settings.sharedSettings[key] = value as never\n}\n","import { getDefaultTacticState } from 'data'\nimport { TacticsData, TacticData, TacticType } from 'types'\nimport * as manager from 'managers/tactics'\nimport {\n makeActionRemoveFirst,\n makeContainerReducer,\n ActionToFunction,\n makeActionReplaceFirst,\n makeEntityReducer,\n compose\n} from './utils'\n\nconst tacticsMapping: ActionToFunction = {}\n\nexport const createTactic = makeActionRemoveFirst(manager.createTactic, tacticsMapping)\nexport const setTacticType = makeActionRemoveFirst(manager.setTacticType, tacticsMapping)\nexport const deleteTactic = makeActionRemoveFirst(manager.deleteTactic, tacticsMapping)\n\nconst tactics = makeContainerReducer(getDefaultTacticState(), tacticsMapping)\n\nconst tacticMapping: ActionToFunction = {}\n\nexport const setTacticValue = makeActionReplaceFirst(manager.setTacticValue, tacticMapping)\nexport const setTacticImage = makeActionReplaceFirst(manager.setTacticImage, tacticMapping)\nexport const setTacticMode = makeActionReplaceFirst(manager.setTacticMode, tacticMapping)\n\nconst tactic = makeEntityReducer(getDefaultTacticState(), tacticMapping)\n\nexport const tacticsReducer = compose(tactic, tactics)\n","import { getDefaultTerrainState } from 'data'\nimport { TerrainsData, TerrainData, TerrainType } from 'types'\nimport * as manager from 'managers/terrains'\nimport {\n makeActionRemoveFirst,\n makeContainerReducer,\n ActionToFunction,\n compose,\n makeActionReplaceFirst,\n makeEntityReducer\n} from './utils'\n\nconst terrainsMapping: ActionToFunction = {}\n\nexport const createTerrain = makeActionRemoveFirst(manager.createTerrain, terrainsMapping)\nexport const setTerrainType = makeActionRemoveFirst(manager.setTerrainType, terrainsMapping)\nexport const deleteTerrain = makeActionRemoveFirst(manager.deleteTerrain, terrainsMapping)\n\nconst terrains = makeContainerReducer(getDefaultTerrainState(), terrainsMapping)\n\nconst terrainMapping: ActionToFunction = {}\n\nexport const setTerrainImage = makeActionReplaceFirst(manager.setTerrainImage, terrainMapping)\nexport const setTerrainLocation = makeActionReplaceFirst(manager.setTerrainLocation, terrainMapping)\nexport const setTerrainValue = makeActionReplaceFirst(manager.setTerrainValue, terrainMapping)\n\nconst terrain = makeEntityReducer(getDefaultTerrainState(), terrainMapping)\n\nexport const terrainsReducer = compose(terrain, terrains)\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { saveAs } from 'file-saver'\nimport { AppState, stripRounds, resetMissing, resetAll } from 'state'\nimport { Mode, ExportKey, ExportKeys, TransferState } from 'types'\n\nconst filterState = (state: AppState, exportKeys?: ExportKeys): any => {\n const filtered: any = { ...state }\n filtered._persist = undefined\n filtered.transfer = undefined\n filtered.data = undefined\n filtered.ui = undefined\n filtered.battle = stripRounds(filtered.battle)\n if (exportKeys && !exportKeys[ExportKey.Countries]) filtered.countries = undefined\n if (exportKeys && !exportKeys[ExportKey.Terrains]) filtered.terrains = undefined\n if (exportKeys && !exportKeys[ExportKey.Tactics]) filtered.tactics = undefined\n if (exportKeys && !exportKeys[ExportKey.Settings]) filtered.settings = undefined\n if (exportKeys && !exportKeys[ExportKey.Land]) delete filtered.battle[Mode.Land]\n if (exportKeys && !exportKeys[ExportKey.Naval]) delete filtered.battle[Mode.Naval]\n if (exportKeys && !exportKeys[ExportKey.Land] && !exportKeys[ExportKey.Naval]) filtered.battle = undefined\n return filtered\n}\n\nexport const exportState = (state: AppState, exportKeys?: ExportKeys): string =>\n JSON.stringify(filterState(state, exportKeys), undefined, 2)\n\nconst pad = (value: number) => String(value).padStart(2, '0')\n\nexport const saveToFile = (data: string) => {\n const blob = new Blob([data], { type: 'text/plain;charset=utf-8' })\n const date = new Date()\n const formatted =\n date.getFullYear() +\n '-' +\n pad(date.getMonth()) +\n '-' +\n pad(date.getDate()) +\n '_' +\n pad(date.getHours()) +\n '-' +\n pad(date.getMinutes()) +\n '-' +\n pad(date.getSeconds())\n saveAs(blob, 'imperator-simulator_' + formatted + '.json')\n}\n\nexport const setExportKey = (transfer: TransferState, key: ExportKey, value: boolean) => {\n transfer.exportKeys[key] = value\n}\n\nexport const setResetMissing = (transfer: TransferState, value: boolean) => {\n transfer.resetMissing = value\n}\n\nexport const resetState = (state: AppState) => {\n resetAll(state)\n}\n\nconst combine = (a: any, b: any) => ({ ...(a ?? {}), ...(b ?? {}) })\n\nexport const importState = (state: AppState, imported: any, resetMissing: boolean) => {\n if (resetMissing) {\n resetMissingState(imported)\n }\n state.battle = combine(state.battle, imported.battle)\n state.countries = combine(state.countries, imported.countries)\n state.settings = combine(state.settings, imported.settings)\n state.tactics = combine(state.tactics, imported.tactics)\n state.terrains = combine(state.terrains, imported.terrains)\n}\n\nexport const resetMissingState = (state: AppState) => {\n resetMissing(state)\n}\n","import * as manager from 'managers/transfer'\nimport { TransferState } from 'types'\nimport { getDefaultTransferState } from 'data'\nimport { makeContainerReducer, ActionToFunction, makeActionRemoveFirst } from './utils'\nimport { AppState } from 'state'\n\nconst transferMapping: ActionToFunction = {}\n\nexport const setExportKey = makeActionRemoveFirst(manager.setExportKey, transferMapping)\nexport const setResetMissing = makeActionRemoveFirst(manager.setResetMissing, transferMapping)\n\nexport const transferReducer = makeContainerReducer(getDefaultTransferState(), transferMapping)\n\nconst importMapping: ActionToFunction = {}\n\nexport const importState = makeActionRemoveFirst(manager.importState, importMapping)\nexport const resetMissingState = makeActionRemoveFirst(manager.resetMissingState, importMapping)\nexport const resetState = makeActionRemoveFirst(manager.resetState, importMapping)\n\nexport const importReducer = makeContainerReducer({} as AppState, importMapping)\n","import { TransferState, ExportKeys } from 'types'\n\nexport const getDefaultTransferState = (): TransferState => ({\n exportKeys: {} as ExportKeys,\n resetMissing: false\n})\n","import * as manager from 'managers/ui'\nimport { makeActionRemoveFirst, makeContainerReducer, ActionToFunction } from './utils'\nimport { Modals, ModalType, UI, SideType, Mode } from 'types'\n\nconst mapping: ActionToFunction = {}\n\nconst initialState: UI = {\n modals: {},\n accordions: {},\n selectedParticipantIndex: { [SideType.A]: 0, [SideType.B]: 0 },\n mode: Mode.Land,\n selectedArmyIndex: 0,\n selectedCountryIndex: 0,\n filterNonCombat: true\n}\n\nexport const closeModal = makeActionRemoveFirst(manager.closeModal, mapping)\nexport const toggleAccordion = makeActionRemoveFirst(manager.toggleAccordion, mapping)\nexport const selectParticipant = makeActionRemoveFirst(manager.selectParticipant, mapping)\nexport const openModal: (\n key: T,\n object: NonNullable\n) => unknown = makeActionRemoveFirst(manager.openModal, mapping)\nexport const selectCountry = makeActionRemoveFirst(manager.selectCountry, mapping)\nexport const selectArmy = makeActionRemoveFirst(manager.selectArmy, mapping)\nexport const setMode = makeActionRemoveFirst(manager.setMode, mapping)\nexport const toggleFilterNonCombat = makeActionRemoveFirst(manager.toggleFilterNonCombat, mapping)\n\nexport const uiReducer = makeContainerReducer(initialState, mapping)\n","import { UI, ModalType, Modals, SideType, Mode } from 'types'\nimport { has } from 'lodash'\n\nexport const closeModal = (ui: UI) => {\n for (const key in ui.modals) (ui.modals as Record)[key] = undefined\n}\n\nexport const openModal = (ui: UI, key: T, object: NonNullable) => {\n ui.modals[key] = object\n}\n\nexport const selectParticipant = (ui: UI, side: SideType, index: number) => {\n ui.selectedParticipantIndex[side] = index\n}\n\nexport const toggleAccordion = (ui: UI, key: string) => {\n if (has(ui.accordions, key)) delete ui.accordions[key]\n else ui.accordions[key] = true\n}\n\nexport const toggleFilterNonCombat = (ui: UI) => {\n ui.filterNonCombat = !ui.filterNonCombat\n}\n\nexport const setMode = (ui: UI, mode: Mode) => {\n ui.mode = mode\n ui.selectedCountryIndex = 0\n ui.selectedParticipantIndex = {\n [SideType.A]: 0,\n [SideType.B]: 0\n }\n ui.selectedArmyIndex = 0\n}\n\nexport const selectCountry = (ui: UI, countryIndex: number) => {\n ui.selectedCountryIndex = countryIndex\n ui.selectedArmyIndex = 0\n}\n\nexport const selectArmy = (ui: UI, armyIndex: number) => {\n ui.selectedArmyIndex = armyIndex\n}\n","import { UnitsData, UnitData, Countries, UnitType, CountryName } from 'types'\nimport { getDefaultCountryDefinitions } from 'data'\nimport * as manager from 'managers/units'\nimport {\n ActionToFunction,\n makeActionReplaceFirst,\n makeEntityReducer,\n Action,\n makeActionReplaceFirstTwice,\n compose,\n makeReducer\n} from './utils'\n\nconst unitsMapping: ActionToFunction = {}\n\nexport const createUnit = makeActionReplaceFirst(manager.createUnit, unitsMapping)\nexport const deleteUnit = makeActionReplaceFirst(manager.deleteUnit, unitsMapping)\nexport const changeUnitType = makeActionReplaceFirst(manager.changeUnitType, unitsMapping)\n\nconst getUnits = (draft: Countries, action: Action) => draft[action.payload[0]].units\n\nconst units = makeEntityReducer(getDefaultCountryDefinitions(), unitsMapping, getUnits)\n\nconst unitMapping: ActionToFunction = {}\n\nexport const setUnitValue = makeActionReplaceFirstTwice(manager.setUnitValue, unitMapping)\nexport const changeUnitImage = makeActionReplaceFirstTwice(manager.changeUnitImage, unitMapping)\nexport const changeUnitDeployment = makeActionReplaceFirstTwice(manager.changeUnitDeployment, unitMapping)\nexport const toggleUnitLoyality = makeActionReplaceFirstTwice(manager.toggleUnitLoyality, unitMapping)\nexport const changeParent = makeActionReplaceFirstTwice(manager.changeParent, unitMapping)\n\nconst getUnit = (draft: Countries, action: Action) => {\n const [country, key] = action.payload\n return draft[country].units[key as UnitType]\n}\n\nconst getUnitPayload = (action: Action) => {\n const [, , ...payload] = action.payload\n return payload\n}\n\nconst unit = makeReducer(getDefaultCountryDefinitions(), unitMapping, getUnit, getUnitPayload)\n\nexport const unitsReducer = compose(unit, units)\n","import { getDefaultTactic, getDefaultTerrain, getDefaultUnit, getDefaultSettings } from 'data'\nimport { map } from 'utils'\nimport { mergeValues, clearAllValues } from 'data_values'\nimport { ModeState, TacticsData, TerrainsData, Settings, UnitsData } from 'types'\n\nexport const restoreDefaultTactics = (state: TacticsData): TacticsData =>\n map(state, definition => mergeValues(clearAllValues(definition, definition.type), getDefaultTactic(definition.type)))\nexport const restoreDefaultTerrains = (state: TerrainsData): TerrainsData =>\n map(state, definition => mergeValues(clearAllValues(definition, definition.type), getDefaultTerrain(definition.type)))\nexport const restoreDefaultUnits = (state: UnitsData): UnitsData =>\n map(state, definition => mergeValues(clearAllValues(definition, definition.type), getDefaultUnit(definition.type)))\nexport const restoreDefaultSettings = (state: Settings): Settings => {\n const defaultSettings = getDefaultSettings()\n return {\n ...defaultSettings,\n ...state,\n sharedSettings: { ...defaultSettings.sharedSettings, ...state.sharedSettings },\n modeSettings: map(defaultSettings.modeSettings, (_, mode) => ({\n ...defaultSettings.modeSettings[mode],\n ...state.modeSettings[mode]\n }))\n }\n}\n\nexport const stripRounds = (battle: ModeState): ModeState =>\n map(battle, value => ({\n ...value,\n outdated: false,\n timestamp: 0,\n sides: map(value.sides, value => ({ ...value, days: [] }))\n }))\n","import { AppState } from './index'\nimport { toArr, toObj, keys } from 'utils'\nimport {\n filterUnitDefinitions,\n getArmyPart,\n convertReserveDefinitions,\n convertUnitDefinitions,\n convertUnitDefinition,\n shrinkUnits\n} from '../army_utils'\nimport {\n Mode,\n CountryName,\n SideType,\n CohortDefinition,\n ArmyPart,\n UnitType,\n UnitPreferences,\n Participant,\n CombatSettings,\n ArmyName,\n GeneralDefinition,\n Setting,\n ReserveDefinition,\n CountryAttribute,\n UnitDefinitions,\n UnitDefinition,\n GeneralData,\n Cohort,\n SideData,\n Side,\n Environment,\n ArmyDefinition\n} from 'types'\nimport {\n getDefaultBattle,\n getDefaultMode,\n getDefaultCountryDefinitions,\n getDefaultSettings,\n getDefaultTacticState,\n getDefaultTerrainState\n} from 'data'\nimport { uniq, flatten } from 'lodash'\nimport * as manager from 'managers/army'\nimport { getGeneralModifiers } from 'managers/modifiers'\nimport { convertUnitsData } from 'managers/units'\nimport { convertArmy, convertSide, getRound, getAttacker } from 'managers/battle'\nimport { iterateCohorts } from 'combat'\nimport { calculateValue } from 'data_values'\nimport { useSelector } from 'react-redux'\nimport * as selectors from 'selectors/units'\nimport {\n getBattle,\n getMode,\n getSide,\n getCombatSettings,\n getTacticsData,\n getCountry,\n getSelectedTerrains,\n getSelectedArmy,\n getSelectedCountry,\n getArmyNames,\n getCohorts\n} from 'selectors'\n\nexport const useTechLevel = (countryName: CountryName): number => {\n return useSelector((state: AppState) => {\n const country = getCountry(state, countryName)\n return country[CountryAttribute.MartialTech]\n })\n}\n\nexport const getCohortDefinition = (\n state: AppState,\n country: CountryName,\n army: ArmyName,\n index: number\n): CohortDefinition => getReserve(state, country, army)[index]\n\nexport const getCohort = (\n state: AppState,\n side: SideType,\n part: ArmyPart,\n row: number,\n column: number\n): Cohort | null => getArmyPart(getCohorts(state, side), part)[row][column]\n\nexport const getCohortForEachRound = (state: AppState, side: SideType, participantIndex: number, index: number) => {\n const rounds = getSide(state, side).days\n return rounds.map(side => {\n let result = null\n iterateCohorts(side.cohorts, true, cohort => {\n if (cohort && cohort.properties.participantIndex === participantIndex && cohort.properties.index === index)\n result = cohort\n })\n return result\n })\n}\n\n/**\n * Returns unit types for the current mode from all armies.\n * @param state Application state.\n */\nexport const mergeUnitTypes = (state: AppState): UnitType[] => {\n const mode = getMode(state)\n return Array.from(\n keys(state.countries).reduce((previous, countryName) => {\n return getArmyNames(state, countryName).reduce((previous, armyName) => {\n const units = manager.getActualUnits(getUnitDefinitions(state, countryName, armyName), mode)\n units.filter(unit => unit.mode === mode).forEach(unit => previous.add(unit.type))\n return previous\n }, previous)\n }, new Set())\n )\n}\n\nconst getArmy = (state: AppState, countryName: CountryName, armyName: ArmyName): ArmyDefinition => {\n const army = getArmyDefinition(state, countryName, armyName)\n const unitDefinitions = getUnitDefinitions(state, countryName, armyName)\n const reserve = getReserve(state, countryName, armyName)\n const general = getGeneral(state, countryName, armyName)\n const settings = getCombatSettings(state)\n const unitPreferences = settings[Setting.CustomDeployment] ? army.unitPreferences : ({} as UnitPreferences)\n const flankRatio = calculateValue(state.countries[countryName].modifiers, CountryAttribute.FlankRatio)\n return { reserve, general, flankSize: army.flankSize, unitPreferences, unitDefinitions, flankRatio }\n}\n\nexport const convertSides = (state: AppState): Side[] => {\n const sideA = getSide(state, SideType.A)\n const sideD = getSide(state, SideType.B)\n const armyA = sideA.participants.map(participant => getArmy(state, participant.countryName, participant.armyName))\n const armyD = sideD.participants.map(participant => getArmy(state, participant.countryName, participant.armyName))\n const settings = getCombatSettings(state)\n return [convertSidesSub(state, sideA, armyA, armyD, settings), convertSidesSub(state, sideD, armyD, armyA, settings)]\n}\n\nconst convertSidesSub = (\n state: AppState,\n side: SideData,\n armyDefinitions: ArmyDefinition[],\n enemyDefinitions: ArmyDefinition[],\n settings: CombatSettings\n): Side => {\n const terrains = getSelectedTerrains(state)\n const enemyTypes = uniq(flatten(enemyDefinitions.map(army => army.reserve.map(unit => unit.type))))\n const armies = side.participants.map((participant, index) =>\n convertArmy(index, participant, armyDefinitions[index], enemyTypes, terrains, settings)\n )\n // Ascending + reverse ensures that smaller index gets at end.\n armies.sort((a, b) => a.arrival - b.arrival).reverse()\n return convertSide(side, armies, settings)\n}\n\nexport const getCombatEnvironment = (state: AppState): Environment => {\n const battle = getBattle(state)\n const terrains = battle.terrains.map(value => state.terrains[value])\n const settings = getCombatSettings(state)\n return {\n day: 0,\n round: getRound(battle),\n terrains,\n settings,\n attacker: getAttacker(battle),\n mode: getMode(state)\n }\n}\n\nexport const getUnitPreferences = (state: AppState, countryName: CountryName, armyName: ArmyName): UnitPreferences =>\n getArmyDefinition(state, countryName, armyName).unitPreferences\n\nexport const getFlankSize = (state: AppState, countryName: CountryName, armyName: ArmyName): number =>\n getArmyDefinition(state, countryName, armyName).flankSize\n\nconst getArmyDefinition = (state: AppState, countryName: CountryName, armyName: ArmyName) =>\n state.countries[countryName].armies[armyName]\n\nexport const getGeneralDefinition = (state: AppState, countryName: CountryName, armyName: ArmyName): GeneralData => {\n const general = getArmyDefinition(state, countryName, armyName).general\n const modifiers = getGeneralModifiers(general)\n return manager.applyGeneralModifiers(general, modifiers)\n}\nexport const getGeneral = (state: AppState, countryName: CountryName, armyName: ArmyName): GeneralDefinition =>\n manager.convertGeneralDefinition(\n getCombatSettings(state),\n getGeneralDefinition(state, countryName, armyName),\n getTacticsData(state)\n )\n\nexport const getOverridenReserveDefinitions = (\n state: AppState,\n countryName: CountryName,\n armyName: ArmyName,\n originals?: boolean\n) => {\n const army = getArmyDefinition(state, countryName, armyName)\n if (originals) return army.reserve\n const units = getUnitDefinitions(state, countryName, armyName)\n const country = getCountry(state, countryName)\n const latest = manager.getLatestUnits(units, country[CountryAttribute.MartialTech])\n return manager.overrideRoleWithPreferences(army, units, latest)\n}\n\nexport const getReserve = (\n state: AppState,\n countryName: CountryName,\n armyName: ArmyName,\n originals?: boolean\n): ReserveDefinition => {\n const settings = getCombatSettings(state)\n const definition = getOverridenReserveDefinitions(state, countryName, armyName, originals)\n const units = getUnitDefinitions(state, countryName, armyName)\n return convertReserveDefinitions(settings, definition as ReserveDefinition, units)\n}\n\nexport const useParticipant = (type: SideType): Participant => {\n return useSelector((state: AppState) => {\n const index = state.ui.selectedParticipantIndex[SideType.A]\n const participants = getBattle(state).sides[type].participants\n return participants.length < index ? participants[index] : participants[0]\n })\n}\n\nconst getUnitDefinitionsSub = (state: AppState, countryName: CountryName, armyName: ArmyName) => {\n const country = state.countries[countryName]\n const general = getGeneralDefinition(state, countryName, armyName)\n return convertUnitsData(country.units, country, general)\n}\n\nexport const useUnitDefinitions = (countryName: CountryName, armyName: ArmyName): UnitDefinitions | undefined => {\n const props = { countryName, armyName }\n return useSelector((state: AppState) => selectors.getUnitDefinitions(state, props))\n}\n\nexport const useUnitDefinition = (\n countryName: CountryName,\n armyName: ArmyName,\n unitType: UnitType\n): UnitDefinition | undefined => {\n const props = { countryName, armyName }\n return useSelector((state: AppState) => selectors.getUnitDefinitions(state, props)[unitType])\n}\n\nexport const getUnitDefinitionsCached = (\n state: AppState,\n countryName: CountryName,\n armyName: ArmyName\n): UnitDefinitions | undefined => {\n const props = { countryName, armyName }\n return selectors.getUnitDefinitions(state, props)\n}\n\nexport const getUnitDefinitions = (\n state: AppState,\n countryName?: CountryName,\n armyName?: ArmyName,\n mode?: Mode\n): UnitDefinitions => {\n const settings = getCombatSettings(state)\n countryName = countryName ?? getSelectedCountry(state)\n armyName = armyName ?? getSelectedArmy(state)\n mode = mode ?? getMode(state)\n\n const definitions = getUnitDefinitionsSub(state, countryName, armyName)\n const general = getGeneralDefinition(state, countryName, armyName).definitions\n const units = convertUnitDefinitions(settings, definitions, general)\n return filterUnitDefinitions(mode, units)\n}\n\nexport const getUnitTypeList = (\n state: AppState,\n filterParent: boolean,\n countryName?: CountryName,\n armyName?: ArmyName\n) => getUnitList(state, filterParent, countryName, armyName).map(unit => unit.type)\n\nexport const getUnitList = (\n state: AppState,\n filterParent: boolean,\n countryName?: CountryName,\n armyName?: ArmyName\n): UnitDefinition[] => {\n const mode = getMode(state)\n countryName = countryName ?? getSelectedCountry(state)\n armyName = armyName ?? getSelectedArmy(state)\n const units = getUnitDefinitions(state, countryName, armyName)\n return manager.getUnitList(units, mode, filterParent, getCombatSettings(state))\n}\n\nexport const getUnitDefinition = (\n state: AppState,\n unitType: UnitType,\n countryName?: CountryName,\n armyName?: ArmyName\n): UnitDefinition => {\n const settings = getCombatSettings(state)\n countryName = countryName ?? getSelectedCountry(state)\n armyName = armyName ?? getSelectedArmy(state)\n const general = getGeneralDefinition(state, countryName, armyName).definitions\n const units = getUnitDefinitionsSub(state, countryName, armyName)\n return convertUnitDefinition(settings, units, shrinkUnits(units), general, unitType)\n}\n\nexport const getUnitImages = (state: AppState): { [key in UnitType]: string[] } => {\n const definitions = toArr(state.countries)\n .map(definitions => toArr(definitions.units))\n .flat(1)\n const unitTypes = mergeUnitTypes(state)\n return toObj(\n unitTypes,\n type => type,\n type => uniq(definitions.filter(value => value.type === type).map(value => value.image))\n )\n}\n\n/**\n * Resets missing data by using the default data.\n * @param data\n */\nexport const resetMissing = (data: AppState) => {\n data.tactics = data.tactics || getDefaultTacticState()\n data.terrains = data.terrains || getDefaultTerrainState()\n data.battle = data.battle || getDefaultBattle()\n if (!data.battle[Mode.Land]) data.battle[Mode.Land] = getDefaultMode(Mode.Land)\n if (!data.battle[Mode.Naval]) data.battle[Mode.Naval] = getDefaultMode(Mode.Naval)\n data.settings = data.settings || getDefaultSettings()\n data.countries = data.countries || getDefaultCountryDefinitions()\n return data\n}\n\n/**\n * Resets all data.\n * @param data\n */\nexport const resetAll = (data: AppState) => {\n data.tactics = getDefaultTacticState()\n data.terrains = getDefaultTerrainState()\n data.battle = getDefaultBattle()\n data.settings = getDefaultSettings()\n data.countries = getDefaultCountryDefinitions()\n}\n","import {\n armyReducer,\n countriesReducer,\n unitsReducer,\n tacticsReducer,\n terrainsReducer,\n battleReducer,\n transferReducer,\n importReducer,\n settingsReducer,\n combatReducer,\n uiReducer\n} from 'reducers'\nimport { combineRoot, compose } from 'reducers/utils'\nimport { Reducer } from 'react'\n\nconst combined = combineRoot({\n tactics: tacticsReducer,\n terrains: terrainsReducer,\n battle: battleReducer,\n transfer: transferReducer,\n countries: compose(countriesReducer, armyReducer, unitsReducer),\n settings: settingsReducer,\n ui: uiReducer\n})\n\nexport const rootReducer = compose(combined, combatReducer, importReducer) as Reducer\n\nexport type AppState = ReturnType\nexport * from './transforms'\nexport * from './utils'\n","import React from 'react'\n\ninterface IProps {\n value: number\n reverse?: boolean\n hideZero?: boolean\n formatter: (value: number) => string\n positiveColor?: string\n neutralColor?: string\n negativeColor?: string\n}\n\n/**\n * Styles a number with positive/negative color and sign.\n */\nconst StyledNumber = ({\n hideZero,\n value,\n reverse,\n formatter,\n positiveColor,\n negativeColor,\n neutralColor\n}: IProps): JSX.Element | null => {\n if (hideZero && value === 0) return null\n const isPositive = reverse ? value < 0 : value > 0\n const className =\n value === 0\n ? neutralColor || ''\n : isPositive\n ? positiveColor || 'color-positive'\n : negativeColor || 'color-negative'\n const str = formatter(value)\n return {str}\n}\n\nexport default StyledNumber\n","import React, { Component } from 'react'\nimport { Image } from 'semantic-ui-react'\n\ninterface IProps {\n values: string[]\n}\n\nexport default class Images extends Component {\n render() {\n const { values } = this.props\n return (\n <>\n {values.map(image => (\n \n ))}\n \n )\n }\n}\n","import React, { Component } from 'react'\nimport { List } from 'semantic-ui-react'\n\nimport Images from './Utils/Images'\nimport StyledNumber from './Utils/StyledNumber'\nimport { UnitType, UnitData, TacticData } from 'types'\nimport { calculateValue } from 'data_values'\nimport { toSignedPercent } from 'formatters'\n\ninterface IProps {\n images: { [key in UnitType]: string[] }\n unitTypes: UnitType[]\n item: UnitData | TacticData\n styled?: boolean\n}\n\n/**\n * Shows unit's strength and weakness versus other units.\n */\nexport default class VersusList extends Component {\n render() {\n const { unitTypes, item, images, styled } = this.props\n return (\n \n {unitTypes\n .filter(type => calculateValue(item, type))\n .map(type => (\n \n \n {styled ? (\n \n ) : (\n toSignedPercent(calculateValue(item, type))\n )}\n \n ))}\n \n )\n }\n}\n","import React, { Component } from 'react'\nimport { Image } from 'semantic-ui-react'\nimport { getImage } from 'utils'\n\ninterface IProps {\n item?: {\n type: string\n image?: string\n tech?: number\n }\n}\n\nexport default class LabelItem extends Component {\n render() {\n const { item } = this.props\n if (!item) return null\n return (\n <>\n {item.tech}\n \n {item.type}\n \n )\n }\n}\n","export default __webpack_public_path__ + \"static/media/discipline.33b22ad9.png\";","export default __webpack_public_path__ + \"static/media/offense.77951b50.png\";","export default __webpack_public_path__ + \"static/media/defense.c53db655.png\";","export default __webpack_public_path__ + \"static/media/manpower.ccd18381.png\";","export default __webpack_public_path__ + \"static/media/naval_combat.85ccac21.png\";","export default __webpack_public_path__ + \"static/media/morale.dc58f0a7.png\";","export default __webpack_public_path__ + \"static/media/attrition.a9ef4eba.png\";","export default __webpack_public_path__ + \"static/media/fire.6847c223.png\";","export default __webpack_public_path__ + \"static/media/shock.38c09e2a.png\";","export default __webpack_public_path__ + \"static/media/combat_ability.32fec4ae.png\";","export default __webpack_public_path__ + \"static/media/cost.ca28b74a.png\";","export default __webpack_public_path__ + \"static/media/food.f6226860.png\";","export default __webpack_public_path__ + \"static/media/food_capacity.0f192308.png\";","export default __webpack_public_path__ + \"static/media/supply_limit.9e2ad2e2.png\";","export default __webpack_public_path__ + \"static/media/finesse.def528fe.png\";","export default __webpack_public_path__ + \"static/media/charisma.1d27a6b0.png\";","export default __webpack_public_path__ + \"static/media/zeal.83a20d08.png\";","export default __webpack_public_path__ + \"static/media/health.2b6b5391.png\";","export default __webpack_public_path__ + \"static/media/age.ba1d0a2b.png\";","export default __webpack_public_path__ + \"static/media/fertility.396d70c4.png\";","import React, { Component } from 'react'\nimport { Image, Popup, Header } from 'semantic-ui-react'\nimport {\n UnitAttribute,\n Mode,\n CombatPhase,\n CountryAttribute,\n CombatSharedSettings,\n isAttributeEnabled,\n Setting,\n DisciplineValue,\n CharacterAttribute\n} from 'types'\n\nimport IconDiscipline from 'images/discipline.png'\nimport IconOffense from 'images/offense.png'\nimport IconDefense from 'images/defense.png'\nimport IconManpower from 'images/manpower.png'\nimport IconStrength from 'images/naval_combat.png'\nimport IconMorale from 'images/morale.png'\nimport IconAttrition from 'images/attrition.png'\nimport IconFire from 'images/fire.png'\nimport IconShock from 'images/shock.png'\nimport IconCombatAbility from 'images/combat_ability.png'\nimport IconCost from 'images/cost.png'\nimport IconFoodConsumption from 'images/food.png'\nimport IconFoodStorage from 'images/food_capacity.png'\nimport IconSupplyLimit from 'images/supply_limit.png'\nimport IconMartial from 'images/martial.png'\nimport IconFinesse from 'images/finesse.png'\nimport IconCharisma from 'images/charisma.png'\nimport IconZeal from 'images/zeal.png'\nimport IconHealth from 'images/health.png'\nimport IconAge from 'images/age.png'\nimport IconFertility from 'images/fertility.png'\n\ntype IProps = {\n attribute: string\n settings?: CombatSharedSettings\n mode?: Mode\n}\n\nconst getFirstImage = (attribute: string, mode?: Mode) => {\n switch (attribute) {\n case UnitAttribute.Morale:\n return IconMorale\n case UnitAttribute.Strength:\n return mode === Mode.Naval ? IconStrength : IconManpower\n case UnitAttribute.Discipline:\n return IconDiscipline\n case UnitAttribute.Offense:\n case UnitAttribute.DamageDone:\n case UnitAttribute.MoraleDamageDone:\n case UnitAttribute.StrengthDamageDone:\n case UnitAttribute.FireDamageDone:\n case UnitAttribute.ShockDamageDone:\n return IconOffense\n case UnitAttribute.Defense:\n return IconDefense\n case UnitAttribute.DamageTaken:\n case UnitAttribute.MoraleDamageTaken:\n case UnitAttribute.StrengthDamageTaken:\n case UnitAttribute.ShockDamageTaken:\n case UnitAttribute.FireDamageTaken:\n return IconAttrition\n case UnitAttribute.CombatAbility:\n return IconCombatAbility\n case CombatPhase.Fire:\n return IconFire\n case CombatPhase.Shock:\n return IconShock\n case UnitAttribute.Cost:\n return IconCost\n case UnitAttribute.FoodConsumption:\n return IconFoodConsumption\n case UnitAttribute.FoodStorage:\n return IconFoodStorage\n case UnitAttribute.AttritionWeight:\n return IconSupplyLimit\n case CombatPhase.Default:\n case CharacterAttribute.Martial:\n return IconMartial\n case CharacterAttribute.Finesse:\n return IconFinesse\n case CharacterAttribute.Charisma:\n return IconCharisma\n case CharacterAttribute.Zeal:\n return IconZeal\n case CharacterAttribute.Age:\n return IconAge\n case CharacterAttribute.Health:\n return IconHealth\n case CharacterAttribute.Fertility:\n return IconFertility\n default:\n return null\n }\n}\n\nconst getSecondImage = (attribute: string, mode?: Mode) => {\n switch (attribute) {\n case UnitAttribute.MoraleDamageDone:\n case UnitAttribute.MoraleDamageTaken:\n return IconMorale\n case UnitAttribute.StrengthDamageDone:\n case UnitAttribute.StrengthDamageTaken:\n return mode === Mode.Naval ? IconStrength : IconManpower\n case UnitAttribute.ShockDamageDone:\n case UnitAttribute.ShockDamageTaken:\n return IconShock\n case UnitAttribute.FireDamageDone:\n case UnitAttribute.FireDamageTaken:\n return IconFire\n default:\n return null\n }\n}\n\nconst getText = (attribute: string) => {\n switch (attribute) {\n case UnitAttribute.OffensiveSupport:\n return 'Backrow'\n case CountryAttribute.FlankRatio:\n return 'Cavalry ratio'\n case UnitAttribute.Experience:\n return 'Exp'\n case UnitAttribute.AttritionWeight:\n return 'Supply'\n default:\n return attribute\n }\n}\n\nconst getExplanation = (attribute: string, settings?: CombatSharedSettings, mode?: Mode) => {\n if (settings && !isAttributeEnabled(attribute, settings)) return 'This attribute is currently disabled'\n switch (attribute) {\n case UnitAttribute.AttritionWeight:\n return 'Required supply'\n case UnitAttribute.CombatAbility:\n return 'Increases damage done'\n case UnitAttribute.Morale:\n case UnitAttribute.Strength:\n case CombatPhase.Fire:\n case CombatPhase.Shock:\n return attribute\n case UnitAttribute.Discipline:\n return settings && settings[Setting.AttributeDiscipline] === DisciplineValue.Both\n ? 'Increases damage done and reduces damage taken'\n : 'Increases damage'\n default:\n return null\n }\n}\n\n/**\n * Helper component for showing images of atributes.\n */\nexport default class AttributeImage extends Component {\n render() {\n const { attribute, settings, mode } = this.props\n const first = getFirstImage(attribute, mode)\n const second = getSecondImage(attribute, mode)\n const explanation = getExplanation(attribute, settings, mode)\n if (explanation) {\n return (\n <>\n \n {first && }\n {second && }\n {!first && !second && getText(attribute)}\n \n }\n content={this.getContent()}\n basic\n wide\n mouseEnterDelay={350}\n />\n \n )\n }\n return (\n \n {first && }\n {second && }\n {!first && !second && getText(attribute)}\n \n )\n }\n\n getContent = () => {\n const { attribute, settings, mode } = this.props\n const explanation = getExplanation(attribute, settings, mode)\n if (attribute === explanation) {\n return (\n \n
\n {getText(attribute)}\n
\n
\n )\n }\n return (\n \n
{getText(attribute)}
\n {explanation}\n
\n )\n }\n}\n","import React, { Component } from 'react'\nimport { Table, List, Icon } from 'semantic-ui-react'\nimport { toNumber } from 'lodash'\n\nimport {\n Mode,\n CountryName,\n UnitType,\n TerrainType,\n UnitData,\n UnitAttribute,\n UnitDefinition,\n filterAttributes,\n CombatSharedSettings,\n Setting\n} from 'types'\nimport { calculateValue } from 'data_values'\nimport { toPercent, toManpower, toSignedPercent } from 'formatters'\n\nimport StyledNumber from './Utils/StyledNumber'\nimport VersusList from './VersusList'\nimport LabelItem from './Utils/LabelUnit'\nimport AttributeImage from './Utils/AttributeImage'\n\ninterface IProps {\n mode: Mode\n country: CountryName\n units: UnitDefinition[]\n settings: CombatSharedSettings\n images: { [key in UnitType]: string[] }\n unitTypes: UnitType[]\n terrains: TerrainType[]\n onRowClick: (unit: UnitData) => void\n}\n\n// Display component for showing unit definitions for an army.\nexport default class UnitDefinitions extends Component {\n attributes = [\n UnitAttribute.Discipline,\n UnitAttribute.DamageDone,\n UnitAttribute.DamageTaken,\n UnitAttribute.Offense,\n UnitAttribute.Defense,\n UnitAttribute.CombatAbility,\n UnitAttribute.MoraleDamageDone,\n UnitAttribute.MoraleDamageTaken,\n UnitAttribute.StrengthDamageDone,\n UnitAttribute.StrengthDamageTaken,\n UnitAttribute.FireDamageDone,\n UnitAttribute.FireDamageTaken,\n UnitAttribute.ShockDamageDone,\n UnitAttribute.ShockDamageTaken,\n UnitAttribute.OffensiveSupport,\n UnitAttribute.Experience,\n UnitAttribute.Drill\n ]\n\n filterByMode = (attributes: UnitAttribute[]) =>\n attributes.filter(attribute => {\n if (this.props.mode === Mode.Naval) {\n if (attribute === UnitAttribute.Offense || attribute === UnitAttribute.Defense) return false\n }\n if (attribute === UnitAttribute.DamageDone || attribute === UnitAttribute.DamageTaken) return false\n return true\n })\n\n isDamageTaken = (attribute: UnitAttribute) =>\n attribute === UnitAttribute.DamageTaken ||\n attribute === UnitAttribute.FireDamageTaken ||\n attribute === UnitAttribute.ShockDamageTaken ||\n attribute === UnitAttribute.MoraleDamageTaken ||\n attribute === UnitAttribute.StrengthDamageTaken\n\n render() {\n const { mode, units, country, settings } = this.props\n return (\n \n \n \n {country}\n \n \n \n \n \n \n \n \n \n {this.filterByMode(filterAttributes(this.attributes, settings)).map(attribute => (\n \n \n \n ))}\n {settings[Setting.CounteringDamage] > 0 && Units}\n {settings[Setting.AttributeTerrainType] && Terrain}\n \n \n {units.map(this.renderRow)}\n
\n )\n }\n\n renderRow = (unit: UnitData) => {\n const { settings, onRowClick, mode } = this.props\n return (\n onRowClick(unit)}>\n \n \n \n {toNumber(calculateValue(unit, UnitAttribute.Morale))}\n \n {mode === Mode.Naval\n ? toPercent(calculateValue(unit, UnitAttribute.Strength))\n : toManpower(settings, calculateValue(unit, UnitAttribute.Strength))}\n \n {toNumber(calculateValue(unit, UnitAttribute.Maneuver))}\n {this.filterByMode(filterAttributes(this.attributes, settings)).map(attribute => (\n \n \n \n ))}\n {settings[Setting.CounteringDamage] > 0 && (\n \n \n \n )}\n {settings[Setting.AttributeTerrainType] && (\n \n \n {this.props.terrains\n .filter(type => calculateValue(unit, type) !== 0)\n .map(type => (\n \n {type + ': '}\n \n \n ))}\n \n \n )}\n \n )\n }\n}\n","import React, { useCallback, useMemo } from 'react'\nimport { Dropdown, DropdownProps } from 'semantic-ui-react'\n\ninterface IProps {\n value: T\n values: ({ value: T; text: string } | T)[]\n onChange?: (value: T) => void\n clearable?: boolean\n onAdd?: (value: T) => void\n style?: unknown\n search?: boolean\n placeholder?: string\n}\n\nconst SimpleDropdown = (props: IProps): JSX.Element => {\n const { value, clearable, onChange, onAdd, search, placeholder, values } = props\n const style = props.style ?? { minWidth: 170, maxWidth: 170 }\n\n const handleAddItem = useCallback((_, { value }: DropdownProps) => onAdd && onAdd(value as T), [onAdd])\n const handleChange = useCallback((_, { value }: DropdownProps) => onChange && onChange(value as T), [onChange])\n\n const options = useMemo(\n () =>\n values.map(item => {\n if (typeof item === 'object') return item\n else return { value: item, text: item }\n }),\n [values]\n )\n\n return (\n \n )\n}\n\nexport default SimpleDropdown\n","import React, { Component } from 'react'\nimport { Modal, Input, Grid, Button } from 'semantic-ui-react'\nimport SimpleDropdown from './Dropdowns/SimpleDropdown'\n\ninterface IProps {\n onSuccess: (value: T, selected: S) => void\n onClose: () => void\n message: string\n valueLabel?: string\n dropdownLabel?: string\n buttonMessage: string\n open: boolean\n value: T\n selected: S\n items: S[]\n}\n\ninterface IState {\n value: T\n selected: S\n}\n\n/**\n * Component for choosing a dropdown value in a modal.\n */\nexport default class ValueDropdownModal extends Component<\n IProps,\n IState\n> {\n constructor(props: IProps) {\n super(props)\n this.state = { value: this.props.value, selected: this.props.selected }\n }\n\n render() {\n const { onClose, open, message, items, valueLabel, dropdownLabel, buttonMessage } = this.props\n const { value, selected } = this.state\n return (\n \n {message}\n \n \n \n \n this.setState({ value: value as T })}\n />\n \n \n {dropdownLabel}\n this.setState({ selected: item })}\n />\n \n \n \n \n \n \n \n \n )\n }\n\n onSuccess = () => {\n const { onSuccess, onClose } = this.props\n const { value, selected } = this.state\n if (value) onSuccess(value, selected)\n onClose()\n }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\n\nexport const useOptionalState = () => useState(undefined)\n\nexport const useBooleanState = (initial: boolean) => {\n const [value, setValue] = useState(initial)\n const toggle = useCallback(() => {\n setValue(prev => !prev)\n }, [])\n return [value, toggle] as const\n}\n\n/** Wraps a value in a ref to break dependencies. */\nexport const useRefWrapper = (value: T) => {\n const ref = useRef(value)\n useEffect(() => {\n ref.current = value\n }, [value])\n return ref\n}\n","import React, { PropsWithChildren } from 'react'\nimport { useDispatch } from 'react-redux'\nimport SimpleDropdown from 'components/Dropdowns/SimpleDropdown'\nimport ValueDropdownModal from 'components/ValueDropdownModal'\nimport { Grid, Button } from 'semantic-ui-react'\nimport { CountryName, ModalType, ArmyName } from 'types'\nimport {\n createCountry,\n changeCountryName,\n deleteCountry,\n createArmy,\n changeArmyName,\n deleteArmy,\n selectCountry,\n selectArmy,\n openModal\n} from 'reducers'\nimport {\n useArmyNames,\n useCountryNames,\n useMode,\n useSelectedArmyIndex,\n useSelectedCountry,\n useSelectedCountryIndex\n} from 'selectors'\nimport { useBooleanState } from 'components/hooks'\n\nconst CountryManager = ({ children }: PropsWithChildren) => {\n return (\n \n {children}\n \n \n )\n}\n\nconst useCountryEditors = (countryName: CountryName, index: number, length: number) => {\n const dispatch = useDispatch()\n\n const handleSelect = (index: number) => dispatch(selectCountry(index))\n\n const handleChangeName = (name: string) => {\n dispatch(changeCountryName(countryName, name as CountryName))\n }\n const handleEdit = () =>\n dispatch(\n openModal(ModalType.Value, {\n onSuccess: handleChangeName,\n message: 'Rename country',\n buttonMessage: 'Edit',\n initial: countryName\n })\n )\n\n const handleDelete = () => {\n dispatch(deleteCountry(countryName))\n dispatch(handleSelect(index - 1))\n }\n\n const handleCreate = (country: CountryName, source?: CountryName) => {\n dispatch(createCountry(country, source))\n dispatch(selectCountry(length))\n }\n return { handleCreate, handleDelete, handleEdit, handleSelect }\n}\n\nconst RenderCountryRow = ({ children }: PropsWithChildren) => {\n const [open, toggleOpen] = useBooleanState(false)\n const country = useSelectedCountryIndex()\n const countryNames = useCountryNames()\n const values = countryNames.map((name, index) => ({ text: name, value: index }))\n\n const { handleCreate, handleDelete, handleEdit, handleSelect } = useCountryEditors(\n countryNames[country],\n country,\n countryNames.length\n )\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {React.Children.map(children, elem => (\n {elem}\n ))}\n \n )\n}\n\nconst useArmyEditors = (countryName: CountryName, armyName: ArmyName, index: number, length: number) => {\n const dispatch = useDispatch()\n const mode = useMode()\n\n const handleSelect = (index: number) => dispatch(selectArmy(index))\n\n const handleChangeName = (name: string) => {\n dispatch(changeArmyName(countryName, armyName, name as ArmyName))\n }\n\n const handleEdit = () => {\n dispatch(\n openModal(ModalType.Value, {\n onSuccess: handleChangeName,\n message: 'Rename army',\n buttonMessage: 'Edit',\n initial: armyName\n })\n )\n }\n\n const handleCreate = (army: ArmyName, sourceArmy?: ArmyName) => {\n dispatch(createArmy(countryName, army, mode, sourceArmy))\n dispatch(selectArmy(length))\n }\n\n const handleDelete = () => {\n dispatch(deleteArmy(countryName, armyName))\n handleSelect(index - 1)\n }\n\n return { handleCreate, handleDelete, handleEdit, handleSelect }\n}\n\nconst RenderArmyRow = () => {\n const [open, toggleOpen] = useBooleanState(false)\n const countryName = useSelectedCountry()\n const army = useSelectedArmyIndex()\n const armyNames = useArmyNames(countryName)\n const values = armyNames.map((name, index) => ({ text: name, value: index }))\n\n const { handleCreate, handleDelete, handleEdit, handleSelect } = useArmyEditors(\n countryName,\n armyNames[army],\n army,\n armyNames.length\n )\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nexport default CountryManager\n","import React, { Component } from 'react'\nimport { Table } from 'semantic-ui-react'\n\ninterface IProps {\n values: string[]\n}\n\n/**\n * Creates a table row with a fixed amount of cells.\n */\nexport default class Headers extends Component {\n render() {\n const { values } = this.props\n return (\n \n {values.map(this.renderHeader)}\n \n )\n }\n\n renderHeader = (value: string, index: number) => {value}\n}\n","import React, { Component } from 'react'\nimport { Table, Header } from 'semantic-ui-react'\nimport { Range, getTrackBackground } from 'react-range'\n\nimport Headers from './Utils/Headers'\nimport { WearinessAttribute, WearinessAttributes, UnitAttribute } from 'types'\nimport { toPercent } from 'formatters'\n\ntype IProps = {\n values: WearinessAttributes\n onChange: (type: WearinessAttribute, min: number, max: number) => void\n}\n\nconst NEUTRAL = '#CCC'\nconst ACTIVE = '#000'\nconst BACK = '#FFF'\n\n/**\n * Allows setting min and max value for weariness (random losses).\n */\nexport default class WearinessRange extends Component {\n readonly headers = ['', 'Morale', 'Strength']\n\n render() {\n const { values } = this.props\n return (\n \n \n \n \n Weariness\n {this.renderCell(UnitAttribute.Morale, values[UnitAttribute.Morale])}\n {this.renderCell(UnitAttribute.Strength, values[UnitAttribute.Strength])}\n \n \n
\n )\n }\n\n renderCell = (type: WearinessAttribute, range: { min: number; max: number }) => {\n const { onChange } = this.props\n return (\n \n
\n {toPercent(range.min, 0)} - {toPercent(range.max, 0)}\n
\n {this.renderRange(range.min, range.max, (min, max) => onChange(type, min, max))}\n
\n )\n }\n\n renderRange = (min: number, max: number, onChange: (min: number, max: number) => void) => (\n onChange(values[0], values[1])}\n renderTrack={({ props, children }) => (\n \n \n {children}\n \n \n )}\n renderThumb={({ props, isDragged }) => (\n \n \n \n )}\n />\n )\n}\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport { Accordion, Icon, Header } from 'semantic-ui-react'\n\nimport { AppState } from 'state'\nimport { toggleAccordion } from 'reducers'\n\ntype Props = {\n title: string\n identifier: string\n open?: boolean\n}\n\n/**\n * Togglable accordion.\n */\nclass AccordionToggle extends Component {\n render() {\n const { active, title, identifier, toggleAccordion, children } = this.props\n return (\n \n toggleAccordion(identifier)}>\n
\n \n {title}\n
\n
\n {children}\n
\n )\n }\n}\n\nconst mapStateToProps = (state: AppState, props: Props) => ({\n active: props.open ? !state.ui.accordions[props.identifier] : state.ui.accordions[props.identifier]\n})\n\nconst actions = { toggleAccordion }\n\ntype S = ReturnType\ntype D = typeof actions\ninterface IProps extends React.PropsWithChildren, S, D {}\nexport default connect(mapStateToProps, actions)(AccordionToggle)\n","import React, { Component } from 'react'\nimport { Table, Button, Image } from 'semantic-ui-react'\nimport { connect } from 'react-redux'\nimport { AppState } from 'state'\n\nimport Headers from '../components/Utils/Headers'\nimport StyledNumber from '../components/Utils/StyledNumber'\n\nimport { TerrainData, TerrainType, TerrainCalc, ModalType } from 'types'\nimport { keys, getImage } from 'utils'\nimport { calculateValue } from 'data_values'\nimport { openModal, createTerrain } from 'reducers'\nimport { addSign } from 'formatters'\nimport { getMode, getTerrainsArray } from 'selectors'\n\n// Display component for showing unit definitions for an army.\nclass TerrainDefinitions extends Component {\n readonly attributes = keys(TerrainCalc).map(k => TerrainCalc[k])\n readonly headers = ['Terrain', 'Location', 'Attacker roll', 'Combat width']\n\n render() {\n const { terrains } = this.props\n return (\n <>\n \n \n {terrains.map(this.renderRow)}\n
\n \n \n )\n }\n\n onClick = () =>\n this.props.openModal(ModalType.Value, {\n onSuccess: type => this.props.createTerrain(type as TerrainType),\n message: 'New terrain type',\n buttonMessage: 'Create',\n initial: ''\n })\n\n renderRow = (definition: TerrainData) => {\n return (\n this.openModal(definition)}>\n \n \n {definition.type}\n \n {definition.location}\n {this.renderAttributes(definition)}\n \n )\n }\n\n renderAttributes = (definition: TerrainData) =>\n this.attributes.map(type => (\n \n \n \n ))\n\n openModal = (definition: TerrainData) => this.props.openModal(ModalType.TerrainDetail, { type: definition.type })\n}\n\nconst mapStateToProps = (state: AppState) => ({\n terrains: getTerrainsArray(state, undefined),\n mode: getMode(state)\n})\n\nconst actions = {\n openModal,\n createTerrain\n}\n\ntype S = ReturnType\ntype D = typeof actions\ntype IProps = S & D\n\nexport default connect(mapStateToProps, actions)(TerrainDefinitions)\n","import React, { Component } from 'react'\nimport { Image, Table, List, Button } from 'semantic-ui-react'\n\nimport VersusList from '../components/VersusList'\nimport StyledNumber from '../components/Utils/StyledNumber'\n\nimport Headers from '../components/Utils/Headers'\nimport { TacticData, TacticType, TacticCalc, ModalType } from 'types'\nimport { calculateValue } from 'data_values'\nimport { openModal, createTactic } from 'reducers'\nimport { toSignedPercent } from 'formatters'\nimport { getImage, toArr } from 'utils'\nimport { connect } from 'react-redux'\nimport { AppState, getUnitImages, mergeUnitTypes } from 'state'\nimport { getMode, getTacticsData } from 'selectors'\n\n/**\n * Shows tactic definitions for both sides.\n */\nclass TacticDefinitions extends Component {\n readonly headers = ['Tactic', 'Unit effectiveness', 'Against other tactics', 'Casualties']\n\n render() {\n return (\n <>\n \n \n {this.props.tactics.map(this.renderRow)}\n
\n \n \n )\n }\n\n onClick = () =>\n this.props.openModal(ModalType.Value, {\n onSuccess: type => this.props.createTactic(type as TacticType, this.props.mode),\n message: 'New tactic type',\n buttonMessage: 'Create',\n initial: ''\n })\n\n renderRow = (definition: TacticData) => {\n const { images, unitTypes } = this.props\n return (\n this.openModal(definition)}>\n \n \n {definition.type}\n \n \n \n \n \n {this.renderVersus(definition)}\n \n \n \n \n \n )\n }\n\n renderVersus = (definition: TacticData) => {\n const filtered = this.props.tactics.filter(versus => calculateValue(definition, versus.type))\n return filtered.map(versus => (\n \n \n \n \n ))\n }\n\n openModal = (definition: TacticData) => this.props.openModal(ModalType.TacticDetail, { type: definition.type })\n}\n\nconst mapStateToProps = (state: AppState) => ({\n tactics: toArr(getTacticsData(state)),\n images: getUnitImages(state),\n unitTypes: mergeUnitTypes(state),\n mode: getMode(state)\n})\n\nconst actions = {\n openModal,\n createTactic\n}\n\ntype S = ReturnType\ntype D = typeof actions\ntype IProps = S & D\n\nexport default connect(mapStateToProps, actions)(TacticDefinitions)\n","import React, { Component } from 'react'\nimport { Button } from 'semantic-ui-react'\nimport { connect } from 'react-redux'\n\nimport { AppState, mergeUnitTypes, getUnitImages, getUnitDefinitions } from 'state'\nimport { createUnit, deleteUnit, changeUnitType, changeWeariness, openModal } from 'reducers'\nimport UnitDefinitions from 'components/UnitDefinitions'\nimport CountryManager from 'containers/CountryManager'\nimport { CountryName, UnitType, ModalType, Setting } from 'types'\nimport WearinessRange from 'components/WearinessRange'\nimport { getAllUnitList } from 'managers/army'\nimport AccordionToggle from 'containers/AccordionToggle'\nimport TerrainDefinitions from 'containers/TerrainDefinitions'\nimport TacticDefinitions from 'containers/TacticDefinitions'\nimport {\n getMode,\n getCombatSettings,\n getTerrainTypes,\n getSelectedArmy,\n getSelectedCountry,\n getWeariness\n} from 'selectors'\n\ninterface IState {\n modalCountry: CountryName | undefined\n openCreateUnit: boolean\n}\n\nclass Definitions extends Component {\n constructor(props: IProps) {\n super(props)\n this.state = this.initialState\n }\n\n initialState = { modalCountry: undefined, openCreateUnit: false }\n\n render() {\n const { mode, country, army, terrains, units, images, unitTypes, weariness, openModal, settings } = this.props\n return (\n <>\n \n \n \n \n
\n openModal(ModalType.UnitDetail, { country, army, type: unit.type, remove: true })}\n />\n this.props.changeWeariness(country, type, min, max)}\n />\n
\n
\n
\n
\n \n \n
\n
\n
\n
\n {settings[Setting.Tactics] && (\n \n \n
\n
\n
\n )}\n \n )\n }\n\n onClick = () =>\n this.props.openModal(ModalType.Value, {\n onSuccess: type => this.props.createUnit(this.props.country, this.props.mode, type as UnitType),\n message: 'New unit type',\n buttonMessage: 'Create',\n initial: ''\n })\n}\n\nconst mapStateToProps = (state: AppState) => ({\n units: getAllUnitList(getUnitDefinitions(state), getMode(state)),\n images: getUnitImages(state),\n unitTypes: mergeUnitTypes(state),\n terrains: getTerrainTypes(state, undefined),\n mode: getMode(state),\n country: getSelectedCountry(state),\n army: getSelectedArmy(state),\n settings: getCombatSettings(state),\n weariness: getWeariness(state, getSelectedCountry(state))\n})\n\nconst actions = {\n openModal,\n deleteUnit,\n createUnit,\n changeUnitType,\n changeWeariness\n}\n\ntype S = ReturnType\ntype D = typeof actions\ntype IProps = S & D\n\nexport default connect(mapStateToProps, actions)(Definitions)\n","import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Dropdown, DropdownOnSearchChangeData, Table } from 'semantic-ui-react'\nimport AttributeImage from '../Utils/AttributeImage'\nimport { CombatSharedSettings } from 'types'\n\ninterface IProps {\n value: T\n trigger?: React.ReactNode\n values: E[]\n headers: string[]\n getContent: (value: E, search: string) => (string | number | JSX.Element)[] | null\n isPositive?: (value: E) => boolean\n isNegative?: (value: E) => boolean\n getText?: (value: E) => string\n isActive: (value: E) => boolean\n getValue: (value: E) => T\n onSelect: (type: T) => void\n settings?: CombatSharedSettings\n clearable?: boolean\n search?: boolean\n placeholder?: string\n absolute?: boolean\n width?: number\n}\n\nconst DropdownTable = (props: IProps): JSX.Element => {\n const [open, setOpen] = useState(false)\n const [searchQuery, setSearchQuery] = useState('')\n const {\n value,\n values,\n headers,\n trigger,\n width,\n clearable,\n getText,\n search,\n placeholder,\n absolute,\n settings,\n isActive,\n onSelect\n } = props\n const selected = values.find(isActive)\n const text = trigger ? undefined : selected && getText ? getText(selected) : ''\n const style = { minWidth: width ?? 170, maxWidth: width ?? 170 }\n const classNames = []\n if (absolute) classNames.push('absolute')\n if (!trigger) classNames.push('selection')\n\n const handleSearch = useCallback((_, data: DropdownOnSearchChangeData) => setSearchQuery(data.searchQuery), [])\n const handleOpen = useCallback(() => setOpen(true), [])\n const handleClose = useCallback(() => setOpen(false), [])\n\n useEffect(() => setSearchQuery(''), [open])\n\n const handleChange = useCallback(() => {\n onSelect('' as T)\n handleClose()\n }, [onSelect, handleClose])\n\n return (\n \n \n \n {headers.length ?
: null}\n \n {values.map((item, index) => (\n \n ))}\n \n
\n
\n \n )\n}\n\nconst Header = ({ headers, settings }: { headers: string[]; settings?: CombatSharedSettings }) => (\n \n \n {headers.map(header => (\n \n \n \n ))}\n \n \n)\n\ninterface ContentProps {\n item: E\n index: number\n getContent: (value: E, search: string) => (string | number | JSX.Element)[] | null\n isPositive?: (value: E) => boolean\n isNegative?: (value: E) => boolean\n isActive: (value: E) => boolean\n searchQuery: string\n onSelect: (type: T) => void\n getValue: (value: E) => T\n onClose: () => void\n}\n\nconst Content = ({\n item,\n index,\n getContent,\n isPositive,\n isNegative,\n isActive,\n onSelect,\n searchQuery,\n getValue,\n onClose\n}: ContentProps) => {\n const onClick = useCallback(() => {\n onSelect(getValue(item))\n onClose()\n }, [onSelect, onClose, getValue, item])\n\n const content = useMemo(() => getContent(item, searchQuery), [getContent, item, searchQuery])\n if (!content) return null\n\n return (\n \n {content.map((cell, index) => (\n {cell}\n ))}\n \n )\n}\n\nexport default DropdownTable\n","import React, { Component } from 'react'\nimport { UnitDefinition, UnitType, CombatSharedSettings } from 'types'\nimport DropdownTable from './DropdownTable'\nimport LabelItem from 'components/Utils/LabelUnit'\n\ntype IProps = {\n value: UnitType\n values: UnitDefinition[]\n onSelect: (type: UnitType) => void\n settings: CombatSharedSettings\n}\n\nexport default class DropdownUnit extends Component {\n getContent = (unit: UnitDefinition) => []\n\n isActive = (item: UnitDefinition) => item.type === this.props.value\n\n getValue = (item: UnitDefinition) => item.type\n\n headers = []\n\n render() {\n const { value, values, onSelect, settings } = this.props\n return (\n unit.type === value)} />}\n settings={settings}\n />\n )\n }\n}\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport { Table, Input } from 'semantic-ui-react'\n\nimport { AppState, getUnitPreferences, getFlankSize, getUnitList } from 'state'\nimport { setFlankSize, setUnitPreference } from 'reducers'\nimport { getUnitIcon } from 'data'\nimport { UnitPreferenceType, SideType, UnitType, UnitDefinition } from 'types'\nimport DropdownUnit from 'components/Dropdowns/DropdownUnit'\nimport { getMode, getCombatSettings, getParticipant } from 'selectors'\n\n/**Table with row types and flank sizes. */\nexport default class PreferredUnitTypes extends Component {\n render() {\n return (\n \n \n \n Preferred unit types\n {UnitPreferenceType.Primary}\n {UnitPreferenceType.Secondary}\n {UnitPreferenceType.Flank}\n Flank size\n \n \n \n \n \n \n
\n )\n }\n}\n\ntype Props = {\n side: SideType\n}\n\n/**\n * Row types and flank size for a side.\n */\nclass Row extends Component {\n render() {\n const { side } = this.props\n return (\n \n {side}\n {this.renderCell(UnitPreferenceType.Primary)}\n {this.renderCell(UnitPreferenceType.Secondary)}\n {this.renderCell(UnitPreferenceType.Flank)}\n {this.renderFlankSize()}\n \n )\n }\n\n renderCell = (type: UnitPreferenceType) => {\n const { units, preferences, settings } = this.props\n const unit = preferences[type]\n const empty = { type: UnitType.None, image: getUnitIcon(UnitType.None) } as UnitDefinition\n return (\n this.setState({ modalType: type })}>\n this.setUnitPreference(type, unitType)}\n settings={settings}\n />\n \n )\n }\n\n renderFlankSize = () => {\n const { flankSize } = this.props\n return (\n \n this.setFlankSize(Number(data.value))}\n />\n \n )\n }\n\n setFlankSize = (value: number) => {\n const { setFlankSize, armyName, countryName } = this.props\n setFlankSize(countryName, armyName, value)\n }\n\n setUnitPreference = (type: UnitPreferenceType, unitType: UnitType): void => {\n const { setUnitPreference, armyName, countryName } = this.props\n setUnitPreference(countryName, armyName, type, unitType)\n }\n}\n\nconst mapStateToProps = (state: AppState, props: Props) => {\n const participant = getParticipant(state, props.side, state.ui.selectedParticipantIndex[props.side])\n const { countryName, armyName } = participant\n return {\n units: getUnitList(state, true, countryName, armyName),\n countryName,\n armyName,\n flankSize: getFlankSize(state, countryName, armyName),\n preferences: getUnitPreferences(state, countryName, armyName),\n mode: getMode(state),\n settings: getCombatSettings(state)\n }\n}\n\nconst actions = { setFlankSize, setUnitPreference }\n\ntype S = ReturnType\ntype D = typeof actions\ntype IProps = Props & S & D\n\nconst ConnectedRow = connect(mapStateToProps, actions)(Row)\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport { Image, Table } from 'semantic-ui-react'\n\nimport IconEmpty from 'images/empty.png'\nimport { SideType, UnitType, UnitAttribute, isAttributeEnabled, Cohorts, Cohort } from 'types'\nimport { strengthToValue, toNumber } from 'formatters'\nimport { getImage, round, sumArr } from 'utils'\nimport { AppState } from 'state'\nimport { flatten, uniq } from 'lodash'\nimport AttributeImage from 'components/Utils/AttributeImage'\nimport { getBattle, getMode, getCombatSettings, getCohorts } from 'selectors'\n\nclass TableStats extends Component {\n shouldComponentUpdate(prevProps: IProps) {\n return prevProps.timestamp !== this.props.timestamp\n }\n\n render() {\n return (\n <>\n {this.renderArmy(SideType.A, this.props.cohortsA)}\n {this.renderArmy(SideType.B, this.props.cohortsD)}\n \n )\n }\n\n renderArmy = (side: SideType, cohorts: Cohorts) => {\n const { mode, settings } = this.props\n const flatten = this.flatten(cohorts)\n const types = uniq(flatten.map(cohort => cohort.properties.type))\n const rows = types.map(type => this.renderRow(cohorts, type)).filter(row => row)\n return (\n \n \n \n {side}\n \n \n \n \n \n \n Strength depleted\n Morale depleted\n \n \n \n \n Monthly \n \n \n \n \n {isAttributeEnabled(UnitAttribute.FoodConsumption, settings) && (\n \n \n \n )}\n {isAttributeEnabled(UnitAttribute.FoodStorage, settings) && (\n \n \n \n )}\n \n \n \n {rows}\n \n \n \n Total\n \n {this.renderCells(flatten)}\n \n \n
\n )\n }\n\n renderRow = (cohorts: Cohorts, type: UnitType) => {\n const flatten = this.flatten(cohorts, type)\n const count = flatten.length\n if (count === 0) return null\n const image = getImage(flatten[0].properties)\n return (\n \n \n \n {type + ' (x ' + count + ')'}\n \n {this.renderCells(flatten)}\n \n )\n }\n\n renderCells = (cohorts: Cohort[]) => {\n const { mode, settings } = this.props\n return (\n <>\n \n {strengthToValue(\n settings,\n mode,\n this.sum(cohorts, cohort => cohort[UnitAttribute.Strength])\n )}{' '}\n /{' '}\n {strengthToValue(\n settings,\n mode,\n this.sum(cohorts, cohort => cohort.properties.maxStrength)\n )}\n \n \n {round(\n this.sum(cohorts, cohort => cohort[UnitAttribute.Morale]),\n 100.0\n )}{' '}\n /{' '}\n {round(\n this.sum(cohorts, cohort => cohort.properties.maxMorale),\n 100.0\n )}\n \n \n {strengthToValue(\n settings,\n mode,\n this.sum(cohorts, cohort => cohort.state.totalStrengthDealt)\n )}\n \n \n {round(\n this.sum(cohorts, cohort => cohort.state.totalMoraleDealt),\n 100.0\n )}\n \n {this.renderCell(cohorts, UnitAttribute.Cost)}\n \n {round(\n this.sum(\n cohorts,\n cohort => cohort.properties[UnitAttribute.Cost] * cohort.properties[UnitAttribute.Maintenance]\n ),\n 100.0\n )}\n \n {this.renderCell(cohorts, UnitAttribute.AttritionWeight)}\n {this.renderCell(cohorts, UnitAttribute.FoodConsumption)}\n {this.renderCell(cohorts, UnitAttribute.FoodStorage, this.storageFormatter)}\n \n )\n }\n\n renderCell = (\n cohorts: Cohort[],\n attribute: UnitAttribute,\n formatter?: (cohorts: Cohort[], attribute: UnitAttribute) => string\n ) => {\n const { settings } = this.props\n if (isAttributeEnabled(attribute, settings)) {\n return (\n \n {formatter ? formatter(cohorts, attribute) : this.defaultFormatter(cohorts, attribute)}\n \n )\n }\n return null\n }\n\n defaultFormatter = (cohorts: Cohort[], attribute: UnitAttribute) => {\n return round(\n this.sum(cohorts, cohort => cohort.properties[attribute]),\n 100.0\n )\n }\n\n storageFormatter = (cohorts: Cohort[]) => {\n const storage = this.sum(cohorts, cohort => cohort.properties[UnitAttribute.FoodStorage])\n const consumption = this.sum(cohorts, cohort => cohort.properties[UnitAttribute.FoodConsumption]) || 1.0\n return `${toNumber(storage / consumption / 12)} years (${toNumber(storage)})`\n }\n\n sum = (merged: Cohort[], getAttribute: (cohort: Cohort) => number): number => sumArr(merged, getAttribute)\n\n // Flattens units to a single list. Also filters temporary 'defeated' units because they are copies of another unit.\n flatten = (cohorts: Cohorts, type?: UnitType): Cohort[] =>\n cohorts.reserve.front\n .filter(cohort => this.filter(cohort, type))\n .concat(cohorts.reserve.flank.filter(cohort => this.filter(cohort, type)))\n .concat(cohorts.reserve.support.filter(cohort => this.filter(cohort, type)))\n .concat(\n cohorts.defeated\n .filter(cohort => this.filter(cohort, type))\n .concat(flatten(cohorts.frontline).filter(cohort => this.filter(cohort, type)) as Cohort[])\n )\n\n filter = (cohort: Cohort | null, type?: UnitType) =>\n cohort && !cohort.state.isDefeated && (!type || cohort.properties.type === type)\n}\n\nconst mapStateToProps = (state: AppState) => ({\n cohortsA: getCohorts(state, SideType.A),\n cohortsD: getCohorts(state, SideType.B),\n mode: getMode(state),\n settings: getCombatSettings(state),\n timestamp: getBattle(state).timestamp\n})\n\nconst actions = {}\n\ntype S = ReturnType\ntype D = typeof actions\ninterface IProps extends S, D {}\n\nexport default connect(mapStateToProps, actions)(TableStats)\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport { Popup, List } from 'semantic-ui-react'\n\nimport StyledNumber from 'components/Utils/StyledNumber'\n\nimport {\n SideType,\n ArmyPart,\n UnitAttribute,\n Setting,\n CombatPhase,\n Mode,\n CohortProperties,\n CohortRoundInfo,\n Cohort,\n DisciplineValue,\n formTerrainAttribute,\n UnitValueType\n} from 'types'\nimport {\n calculateCohortPips,\n getOffensiveCohortPips,\n getDefensiveCohortPips,\n getCombatPhase,\n getDefensiveSupportCohortPips\n} from 'combat'\nimport { toSignedPercent, strengthToValue, toNumber, addSign, toMultiplier, toMorale } from 'formatters'\nimport { AppState, getCohort } from 'state'\nimport { noZero } from 'utils'\nimport { getCohortName } from 'managers/units'\nimport { getCombatSettings, getCombatSide, getMode, getSelectedTerrains } from 'selectors'\n\ntype Props = {\n row: number | null\n column: number | null\n isSupport: boolean\n context: HTMLElement | null\n side: SideType\n part: ArmyPart\n}\n\ntype IState = {\n content: JSX.Element | null\n}\n\n/**\n * Displays a combat tooltip for the unit at a given index.\n * The tooltip shows strength, morale, target and damage breakdown.\n */\nclass CombatTooltip extends Component {\n constructor(props: IProps) {\n super(props)\n this.state = { content: null }\n }\n\n render() {\n const { source, context, isSupport } = this.props\n if (!context) return null\n return \n }\n\n BLUE = 'color-blue'\n ORANGE = 'color-orange'\n RED = 'color-red'\n\n getExplanation = (isSupport: boolean) => {\n const { source } = this.props\n if (!source) return null\n\n const target = source.target\n const targetSupport = source.targetSupport\n return (\n \n {this.getInfoSection(source, target)}\n {target && }\n {target && this.getBaseDamageSection(source, target, targetSupport)}\n {target && }\n {target && this.getDamageMultiplierSection(source, target, isSupport)}\n {target && }\n {target && this.getStrengthSection(source, target)}\n {target && }\n {target && this.getMoraleSection(source, target)}\n \n )\n }\n\n toNumber = (value: number) => toNumber(value, 3)\n toAdd = (value: number) => (value ? addSign(Number(this.toNumber(value))) : null)\n toMultiplier = (value: number) => toMultiplier(value, 3)\n\n getBaseDamageSection = (source: IUnit, target: IUnit, targetSupport: IUnit | null) => {\n const { results, settings } = this.props\n const { round } = results\n const phase = getCombatPhase(round, settings)\n const phaseRoll = calculateCohortPips(source, target, targetSupport, UnitAttribute.Strength, phase)\n const moraleRoll = calculateCohortPips(source, target, targetSupport, UnitAttribute.Morale)\n const multi = phaseRoll || moraleRoll\n\n if (multi) {\n return (\n <>\n {this.getBaseDamageSubSection(source, target, targetSupport, UnitAttribute.Strength, phase)}\n {}\n {this.getBaseDamageSubSection(source, target, targetSupport, UnitAttribute.Morale, phase)}\n \n )\n }\n return <>{this.getBaseDamageSubSection(source, target, targetSupport, '', phase)}\n }\n\n getBaseDamageSubSection = (\n source: IUnit,\n target: IUnit,\n targetSupport: IUnit | null,\n type: UnitAttribute.Strength | UnitAttribute.Morale | '',\n phase: CombatPhase\n ) => {\n const { settings, results } = this.props\n const { dice, terrainPips, generalPips, actualBonusPips, totalBonusPips } = results\n const basePips = settings[Setting.BasePips]\n const sourcePips = type ? getOffensiveCohortPips(source, type, phase) : 0\n const targetPips = type ? getDefensiveCohortPips(target, type, phase) : 0\n const targetSupportPips = type ? getDefensiveSupportCohortPips(targetSupport, type, phase) : 0\n const totalPips = basePips + actualBonusPips + sourcePips + targetPips + targetSupportPips\n const enemyReduction = actualBonusPips - totalBonusPips\n const cappedPips = Math.min(totalPips, settings[Setting.MaxPips])\n const reductionToCap = Math.min(0, settings[Setting.MaxPips] - cappedPips)\n const text = type === UnitAttribute.Morale ? UnitAttribute.Morale : phase\n return (\n <>\n {this.renderModifier('Base pips', basePips, this.toAdd)}\n {this.renderModifier('Dice', dice, this.toAdd)}\n {this.renderModifier('Terrain pips', terrainPips, this.toAdd)}\n {this.renderModifier('General pips', generalPips, this.toAdd)}\n {this.renderModifier(text + ' pips', sourcePips, this.toAdd)}\n {this.renderModifier('Enemy pips', enemyReduction, this.toAdd)}\n {this.renderModifier('Enemy ' + text.toLowerCase() + ' pips', targetPips, this.toAdd)}\n {this.renderModifier('Backrow ' + text.toLowerCase() + ' pips', targetSupportPips, this.toAdd)}\n {this.renderModifier('Above maximum', reductionToCap, this.toAdd)}\n {this.renderItem('Total ' + type.toLowerCase() + ' pips', cappedPips, this.toNumber)}\n \n )\n }\n\n getDamageMultiplierSection = (source: IUnit, target: IUnit, isSupport: boolean) => {\n const { terrains, settings, results } = this.props\n const { round, tacticBonus, dailyMultiplier } = results\n const phase = getCombatPhase(round, settings)\n const terrainTypes = settings[Setting.AttributeTerrainType]\n ? terrains.map(value => formTerrainAttribute(value, UnitAttribute.Damage))\n : []\n const strength = source[UnitAttribute.Strength] + source.strengthLoss\n const offenseVsDefense = settings[Setting.AttributeOffenseDefense]\n ? source[UnitAttribute.Offense] - target[UnitAttribute.Defense]\n : 0\n const experienceReduction = settings[Setting.AttributeExperience] ? target.experienceReduction : 0\n const targetType = settings[Setting.CounteringDamage] > 0 ? source[target.type] : 0\n const isLoyal = source.isLoyal\n const multiplier = source.damageMultiplier\n const morale = (source[UnitAttribute.Morale] + source.moraleLoss) / source.maxMorale\n const damageLossForMissingMorale = (morale - 1) * settings[Setting.DamageLossForMissingMorale]\n\n return (\n <>\n {this.renderStyledItem('Lost morale', damageLossForMissingMorale, toSignedPercent)}\n {this.renderStyledItem('Tactic', tacticBonus, toSignedPercent)}\n {this.renderStyledItem('Enemy insufficient support', target.flankRatioPenalty - 1, toSignedPercent)}\n {this.renderStyledItem('Loyal', isLoyal ? 0.1 : 0, toSignedPercent)}\n {settings[Setting.AttributeDiscipline] !== DisciplineValue.Off &&\n this.getAttribute(source, UnitAttribute.Discipline)}\n {settings[Setting.AttributeDamage] && this.getAttribute(source, UnitAttribute.DamageDone)}\n {settings[Setting.AttributeCombatAbility] && this.getAttribute(source, UnitAttribute.CombatAbility)}\n {this.renderStyledItem(target.type, targetType, toSignedPercent)}\n {this.renderStyledItem('Offense vs Defense', offenseVsDefense, toSignedPercent)}\n {settings[Setting.AttributeDiscipline] === DisciplineValue.Both &&\n this.renderStyledItem(\n 'Target discipline',\n 1 / noZero(target[UnitAttribute.Discipline] + 1) - 1,\n toSignedPercent\n )}\n {this.renderStyledItem('Enemy experience', experienceReduction, toSignedPercent)}\n {settings[Setting.AttributeDamage] && this.getAttribute(target, UnitAttribute.DamageTaken)}\n {terrainTypes.map(terrain => this.getAttribute(source, terrain))}\n {isSupport &&\n this.renderStyledItem(\n UnitAttribute.OffensiveSupport,\n source[UnitAttribute.OffensiveSupport] - 1,\n toSignedPercent\n )}\n {this.renderStyledItem('Battle length', dailyMultiplier - 1, toSignedPercent)}\n {settings[Setting.FireAndShock] && this.renderModifier(phase, source[phase], this.toMultiplier)}\n {settings[Setting.AttributeMilitaryTactics] &&\n this.renderModifier(\n 'Target military tactics',\n 1 / noZero(target[UnitAttribute.MilitaryTactics]),\n this.toMultiplier\n )}\n {this.renderModifier('Unit strength', strength, this.toMultiplier)}\n {this.renderItem('Damage multiplier', multiplier, this.toMultiplier)}\n \n )\n }\n\n getStrengthSection = (source: IUnit, target: IUnit) => {\n const { settings, mode, results } = this.props\n const { round, tacticStrengthDamageMultiplier } = results\n const phase = getCombatPhase(round, settings)\n const strengthLostMultiplier =\n mode === Mode.Land\n ? settings[Setting.CohortSize] * settings[Setting.StrengthLostMultiplier]\n : 100 * settings[Setting.StrengthLostMultiplier]\n const strengthDamage = source.strengthDealt\n\n return (\n <>\n {this.renderModifier('Constant', strengthLostMultiplier, this.toMultiplier)}\n {this.renderStyledItem('Tactic casualties', tacticStrengthDamageMultiplier - 1, toSignedPercent)}\n {settings[Setting.FireAndShock] &&\n this.getAttribute(\n source,\n phase === CombatPhase.Shock ? UnitAttribute.ShockDamageDone : UnitAttribute.FireDamageDone\n )}\n {settings[Setting.FireAndShock] &&\n this.getAttribute(\n target,\n phase === CombatPhase.Shock ? UnitAttribute.ShockDamageTaken : UnitAttribute.FireDamageTaken\n )}\n {settings[Setting.AttributeStrengthDamage] && this.getAttribute(source, UnitAttribute.StrengthDamageDone)}\n {settings[Setting.AttributeStrengthDamage] && this.getAttribute(target, UnitAttribute.StrengthDamageTaken)}\n {this.renderItem('Strength damage', strengthDamage, value => strengthToValue(settings, mode, value))}\n \n )\n }\n\n getMoraleSection = (source: IUnit, target: IUnit) => {\n const { settings } = this.props\n const moraleLostMultiplier = settings[Setting.MoraleLostMultiplier]\n const morale = settings[Setting.UseMaxMorale] ? source.maxMorale : source[UnitAttribute.Morale] + source.moraleLoss\n const moraleStr = settings[Setting.UseMaxMorale] ? 'Unit max morale' : 'Unit morale'\n const moraleDamage = source.moraleDealt\n\n return (\n <>\n {settings[Setting.MoraleDamageBasedOnTargetStrength] &&\n this.renderStyledItem(\n 'Target strength',\n 1 / (target[UnitAttribute.Strength] + target.strengthLoss),\n toMultiplier\n )}\n {this.renderModifier('Constant', moraleLostMultiplier, this.toMultiplier)}\n {settings[Setting.AttributeMoraleDamage] && this.getAttribute(source, UnitAttribute.MoraleDamageDone)}\n {settings[Setting.AttributeMoraleDamage] && this.getAttribute(target, UnitAttribute.MoraleDamageTaken)}\n {this.renderModifier(moraleStr, morale, this.toMultiplier)}\n {this.renderItem('Morale damage', moraleDamage, this.toNumber)}\n \n )\n }\n\n getAttribute = (unit: IUnit, attribute: UnitValueType) =>\n this.renderStyledItem(attribute, unit[attribute], toSignedPercent)\n\n getInfoSection = (source: IUnit, target: IUnit | null) => {\n const { mode, settings } = this.props\n const moraleCurrent = source[UnitAttribute.Morale]\n const moraleMax = source.maxMorale\n const moraleLoss = -source.moraleLoss\n const strengthCurrent = source[UnitAttribute.Strength]\n const strengthLoss = -source.strengthLoss\n return (\n <>\n {getCohortName(source)}\n {source.isDefeated ? {'Defeated at round ' + source.defeatedDay} : null}\n \n {'Strength: '}\n {strengthToValue(settings, mode, strengthCurrent)}\n {strengthLoss ? (\n <>\n {' ('}\n strengthToValue(settings, mode, value)}\n negativeColor={this.RED}\n />\n {')'}\n \n ) : null}\n \n \n {'Morale: '}\n {toMorale(moraleCurrent) + ' / ' + toMorale(moraleMax)}\n {moraleLoss ? (\n <>\n {' ('}\n \n {')'}\n \n ) : null}\n \n \n {'Target: '}\n {target ? getCohortName(target) : 'No target'}\n \n \n )\n }\n\n renderStyledItem = (label: string, value: number, formatter: (value: number) => string) => {\n if (!value) return null\n return (\n \n {label}\n {': '}\n \n \n )\n }\n\n renderItem = (label: string, value: number, formatter: (value: number) => string) => {\n return (\n \n {label}\n {': '}\n {formatter(value)}\n \n )\n }\n\n renderModifier = (label: string, value: number, formatter: (value: number) => string | null) => {\n const str = formatter(value)\n if (!str) return null\n return (\n \n {label}\n {': '}\n {str}\n \n )\n }\n}\n\ninterface IUnit extends CohortProperties, Omit {\n target: IUnit | null\n targetSupport: IUnit | null\n}\n\nconst convertUnit = (cohort: Cohort | null, convertTarget = true): IUnit | null => {\n if (!cohort) return null\n return {\n ...cohort.properties,\n ...cohort.state,\n ...cohort,\n target: convertTarget ? convertUnit(cohort.state.target, false) : null,\n targetSupport: convertTarget && cohort.state.targetSupport ? convertUnit(cohort.state.targetSupport, false) : null\n }\n}\n\nconst mapStateToProps = (state: AppState, props: Props) => ({\n source:\n props.row !== null && props.column !== null\n ? convertUnit(getCohort(state, props.side, props.part, props.row, props.column))\n : null,\n results: getCombatSide(state, props.side).results,\n settings: getCombatSettings(state),\n terrains: getSelectedTerrains(state),\n mode: getMode(state)\n})\n\nconst actions = {}\n\ntype S = ReturnType\ntype D = typeof actions\ninterface IProps extends React.PropsWithChildren, S, D {}\n\nexport default connect(mapStateToProps, actions)(CombatTooltip)\n","import React, { Component, PureComponent } from 'react'\nimport { Table, Image, Icon } from 'semantic-ui-react'\n\nimport IconDefeated from 'images/attrition.png'\nimport { SideType, ArmyPart, CountryName, ArmyName } from 'types'\nimport { getImage, resize } from 'utils'\nimport { getCohortId } from 'managers/units'\nimport { chunk, flatten } from 'lodash'\nimport CombatTooltip from 'containers/CombatTooltip'\n\nexport type SharedProps = {\n side: SideType\n rowWidth: number\n reverse: boolean\n // SideType, participantIndex and index are needed to find the combat unit. CountryName, ArmyName and index are needed to find the definition.\n onClick: (side: SideType, participantIndex: number, index: number, country: CountryName, army: ArmyName) => void\n part: ArmyPart\n color: string\n // Renders full rows for a cleaner look.\n fullRows?: boolean\n markDefeated?: boolean\n}\n\ntype IProps = SharedProps & {\n cohorts: ICohort[][]\n timestamp: number\n onDeleteCohort: (cohort: ICohort) => void\n}\n\ntype IState = {\n tooltipRow: number | null\n tooltipColumn: number | null\n tooltipContext: HTMLElement | null\n tooltipIsSupport: boolean\n}\n\nconst MORALE_COLOR = 'rgba(200,55,55,0.60)'\nconst MANPOWER_COLOR = 'rgba(0,0,0,0.90)'\nconst WHITE_COLOR = 'rgba(255,255,255,0)'\n\n/**\n * Shows a table of cohorts of an army (frontline, reserve, defeated or retreated).\n */\nexport default class TableArmyPart extends Component {\n constructor(props: IProps) {\n super(props)\n this.state = { tooltipRow: null, tooltipColumn: null, tooltipContext: null, tooltipIsSupport: false }\n }\n\n shouldComponentUpdate(prevProps: IProps, prevState: IState) {\n return (\n prevProps.timestamp !== this.props.timestamp ||\n prevState.tooltipRow !== this.state.tooltipRow ||\n prevState.tooltipColumn !== this.state.tooltipColumn\n )\n }\n\n render() {\n const { rowWidth, side, part, fullRows, reverse } = this.props\n const { tooltipRow, tooltipColumn, tooltipContext, tooltipIsSupport } = this.state\n let cohorts = this.props.cohorts\n let indexOffset = 0\n cohorts = flatten(cohorts.map(arr => chunk(arr, rowWidth)))\n if (!cohorts.length) cohorts.push([])\n if (fullRows) {\n cohorts = cohorts.map(arr => resize(arr, rowWidth, null))\n } else {\n // For display purposes, smaller combat width turns extra slots grey instead of removing them.\n const filler = Math.max(0, rowWidth - cohorts[0].length)\n const leftFiller = (indexOffset = Math.ceil(filler / 2.0))\n const rightFiller = Math.floor(filler / 2.0)\n cohorts = cohorts.map(row =>\n Array(leftFiller).fill(undefined).concat(row).concat(Array(rightFiller).fill(undefined))\n )\n }\n if (reverse) cohorts.reverse()\n return (\n <>\n \n \n \n {cohorts.map((row, rowIndex) => {\n let count = 0\n rowIndex = reverse ? cohorts.length - 1 - rowIndex : rowIndex\n return (\n \n \n \n \n {row.map((cohort, columnIndex) => {\n columnIndex -= indexOffset\n count += cohort && !cohort.isDefeated ? 1 : 0\n if (part === ArmyPart.Frontline) return this.renderCell(rowIndex, columnIndex, cohort, rowIndex > 0)\n else return this.renderCell(0, rowIndex * rowWidth + columnIndex, cohort, rowIndex > 0)\n })}\n {!fullRows && this.renderCount(count)}\n \n )\n })}\n \n
\n \n )\n }\n\n renderCount = (count: number) => {\n return (\n \n {count}\n \n )\n }\n\n renderCell = (row: number, column: number, cohort: ICohort, isSupport: boolean) => {\n const { side, onClick, markDefeated, onDeleteCohort } = this.props\n const filler = cohort === undefined\n return (\n \n cohort && onClick(side, cohort.participantIndex, cohort.index, cohort.countryName, cohort.armyName)\n }\n onMouseOver={(e: React.MouseEvent) =>\n cohort &&\n this.setState({\n tooltipRow: row,\n tooltipColumn: column,\n tooltipContext: e.currentTarget as HTMLElement,\n tooltipIsSupport: isSupport\n })\n }\n onMouseLeave={() =>\n cohort &&\n this.state.tooltipRow === row &&\n this.state.tooltipColumn === column &&\n this.setState({ tooltipRow: null, tooltipColumn: null, tooltipContext: null })\n }\n onContextMenu={(e: React.FocusEvent) => {\n e.preventDefault()\n onDeleteCohort(cohort)\n }}\n >\n \n \n )\n }\n\n getIcon = () => {\n const { part: type, reverse } = this.props\n if (type === ArmyPart.Frontline) return reverse ? 'arrow down' : 'arrow up'\n if (type === ArmyPart.Reserve) return 'home'\n if (type === ArmyPart.Defeated) return 'heartbeat'\n if (type === ArmyPart.Retreated) return 'trash'\n return 'square full'\n }\n}\n\ntype CellProps = {\n strength: number\n maxStrength: number\n morale: number\n maxMorale: number\n isDefeated: boolean\n image: string | null\n}\n\n/** Sub-component to hopefully help with performance (easier to prevent renders). */\nclass Cell extends PureComponent {\n render() {\n const { strength, maxStrength, morale, maxMorale, isDefeated, image } = this.props\n if (!image) return this.renderImage(getImage(null))\n if (isDefeated) return this.renderImage(IconDefeated)\n return (\n
\n
\n {this.renderImage(getImage({ image }))}\n
\n
\n )\n }\n\n renderImage = (image: string) => \n\n gradient = (color: string, current: number, max: number) =>\n 'linear-gradient(0deg, ' +\n color +\n ' 0%, ' +\n color +\n ' ' +\n this.percent(current, max) +\n '%, ' +\n WHITE_COLOR +\n ' ' +\n this.percent(current, max) +\n '%, ' +\n WHITE_COLOR +\n ' 100%)'\n\n percent = (current: number, max: number) => 100.0 - (100.0 * current) / max\n}\n\nexport type ICohort = {\n countryName: CountryName\n armyName: ArmyName\n participantIndex: number\n index: number\n isDefeated: boolean\n image?: string\n maxMorale: number\n maxStrength: number\n morale: number\n strength: number\n} | null\n","import React, { useCallback, useMemo } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Grid } from 'semantic-ui-react'\n\nimport { UnitAttribute, Cohort } from 'types'\nimport { getArmyPart } from 'army_utils'\nimport { deleteCohort } from 'reducers'\nimport { flatten } from 'lodash'\nimport TableArmyPart, { ICohort, SharedProps } from 'components/TableArmyPart'\nimport { useCohorts, useTimestamp } from 'selectors'\n\ntype Props = SharedProps & {\n hideIfEmpty?: boolean\n}\n\n/**\n * Handles data mapping for TableArmyPart, splitting the complex component.\n * Also supports hiding the table and parent grid row if no cohorts.\n */\nconst GridRowArmyPart = (props: Props): JSX.Element | null => {\n const dispatch = useDispatch()\n const { hideIfEmpty, part, side } = props\n const handleDeleteCohort = useCallback(\n (cohort: ICohort) => {\n if (!cohort) return\n dispatch(deleteCohort(cohort.countryName, cohort.armyName, cohort.index))\n },\n [dispatch]\n )\n\n const rawCohorts = useCohorts(side)\n const timestamp = useTimestamp()\n const cohorts = useMemo(() => {\n return convertCohorts(getArmyPart(rawCohorts, part))\n }, [rawCohorts, part])\n\n if (hideIfEmpty && !flatten(cohorts).length) return null\n return (\n \n \n \n \n \n )\n}\n\nconst convertCohorts = (cohorts: (Cohort | null)[][]): ICohort[][] =>\n cohorts.map(row =>\n row.map(\n cohort =>\n cohort && {\n index: cohort.properties.index,\n participantIndex: cohort.properties.participantIndex,\n armyName: cohort.properties.armyName,\n countryName: cohort.properties.countryName,\n isDefeated: cohort.state.isDefeated,\n image: cohort.properties.image,\n morale: cohort[UnitAttribute.Morale],\n maxMorale: cohort.properties.maxMorale,\n strength: cohort[UnitAttribute.Strength],\n maxStrength: cohort.properties.maxStrength\n }\n )\n )\n\nexport default GridRowArmyPart\n","import React, { memo, useMemo } from 'react'\nimport LineTo from 'react-lineto'\n\nimport { ArmyPart, SideType, Cohort } from 'types'\nimport { getArmyPart, getOpponent } from 'army_utils'\nimport { getCohortId } from 'managers/units'\nimport { useCohorts } from 'selectors'\n\ntype Props = {\n armyPart: ArmyPart\n visible: boolean\n attackerColor: string\n defenderColor: string\n}\n\nconst useData = (sideType: SideType, armyPart: ArmyPart) => {\n const cohorts = useCohorts(sideType)\n return useMemo(() => convertUnits(sideType, getArmyPart(cohorts, armyPart)), [sideType, armyPart, cohorts])\n}\n\n/**\n * Display component for showing attack targets for both sides.\n */\nconst TargetArrows = ({ armyPart, visible, attackerColor, defenderColor }: Props) => {\n const attacker = useData(SideType.A, armyPart)\n const defender = useData(SideType.B, armyPart)\n if (!visible) return null\n return (\n <>\n {attacker.map(row =>\n row.map((unit, index) => )\n )}\n {defender.map(row =>\n row.map((unit, index) => )\n )}\n \n )\n}\n\ntype SubProps = { unit: IUnit; color: string }\n\nconst RenderAttacker = ({ unit, color }: SubProps) => {\n if (!unit || !unit.target) return null\n const fromStr = unit.id\n const toStr = unit.target\n return \n}\n\nconst RenderDefender = ({ unit, color }: SubProps) => {\n if (!unit || !unit.target) return null\n const fromStr = unit.id\n const toStr = unit.target\n return \n}\n\ntype RenderArrowProps = {\n from: string\n to: string\n fromAnchor: string\n toAnchor: string\n borderColor: string\n}\n\nconst RenderArrow = ({ from, to, fromAnchor, toAnchor, borderColor }: RenderArrowProps) => (\n \n)\n\nconst MemoizedRenderArrow = memo(RenderArrow)\n\ntype IUnit = {\n id: string\n target: string | null\n} | null\n\nconst convertUnits = (side: SideType, units: (Cohort | null)[][]): IUnit[][] =>\n units.map(row =>\n row.map(cohort =>\n cohort\n ? {\n id: getCohortId(side, cohort.properties),\n target: cohort.state.target ? getCohortId(getOpponent(side), cohort.state.target.properties) : null\n }\n : null\n )\n )\n\nconst MemoizedTargetArrows = memo(TargetArrows)\nexport default MemoizedTargetArrows\n","export default __webpack_public_path__ + \"static/media/chance.9d3e23f4.png\";","import React, { Component } from 'react'\nimport { TerrainType, TerrainData, TerrainCalc, CombatSharedSettings } from 'types'\nimport { calculateValue } from 'data_values'\nimport DropdownTable from './DropdownTable'\nimport StyledNumber from 'components/Utils/StyledNumber'\nimport { addSign } from 'formatters'\nimport LabelItem from 'components/Utils/LabelUnit'\n\ntype IProps = {\n value: TerrainType\n values: TerrainData[]\n onSelect: (type: TerrainType) => void\n settings: CombatSharedSettings\n}\n\nexport default class DropdownTerrain extends Component {\n getContent = (terrain: TerrainData) => [\n ,\n ,\n \n ]\n\n isActive = (item: TerrainData) => item.type === this.props.value\n\n getValue = (item: TerrainData) => item.type\n getText = (item: TerrainData) => item.type\n\n headers = ['Terrain', 'Attacker roll', 'Combat width']\n\n render() {\n const { value, values, onSelect, settings } = this.props\n return (\n \n )\n }\n}\n","import React, { useCallback, useMemo } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Image, Table } from 'semantic-ui-react'\n\nimport IconDice from 'images/chance.png'\nimport StyledNumber from 'components/Utils/StyledNumber'\nimport { TerrainData, TerrainCalc, TerrainType } from 'types'\nimport { calculateValue } from 'data_values'\nimport { addSign } from 'formatters'\nimport { selectTerrain } from 'reducers'\nimport DropdownTerrain from 'components/Dropdowns/DropdownTerrain'\nimport { useSelectedTerrains, useCombatSettings, useTerrainsArray } from 'selectors'\n\n/**\n * Table with row types and flank sizes.\n */\nconst TerrainSelector = () => {\n const terrains = useSelectedTerrains()\n return (\n \n \n \n Location\n Terrain\n Roll modifier\n Combat width\n \n \n \n {terrains.map((terrain, index) => (\n \n ))}\n \n
\n )\n}\n\nconst RenderTerrain = ({ terrain, index }: { terrain: TerrainData; index: number }) => {\n const dispatch = useDispatch()\n const terrains = useTerrainsArray(terrain.location)\n const settings = useCombatSettings()\n\n const handleSelect = useCallback(\n (type: TerrainType): void => {\n dispatch(selectTerrain(index, type))\n },\n [dispatch, index]\n )\n const roll = useMemo(() => calculateValue(terrain, TerrainCalc.Roll), [terrain])\n const combatWidth = useMemo(() => calculateValue(terrain, TerrainCalc.CombatWidth), [terrain])\n return (\n \n {terrain.location}\n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nexport default TerrainSelector\n","import React, { Component } from 'react'\nimport { Popup } from 'semantic-ui-react'\n\ntype Props = {\n getContent: () => JSX.Element\n}\n\n/**\n * Generic tooltip.\n */\nexport default class Tooltip extends Component {\n render() {\n return (\n \n )\n }\n}\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport { Grid, Button, List } from 'semantic-ui-react'\n\nimport StyledNumber from 'components/Utils/StyledNumber'\n\nimport { AppState, getCombatEnvironment, convertSides } from 'state'\nimport { toPercent, toFlooredPercent, toNumber, toSignedPercent } from 'formatters'\nimport { interrupt, calculateWinRate } from 'combat'\nimport { showProgress } from 'utils'\nimport { Setting, WinRateProgress, CasualtiesProgress } from 'types'\nimport Tooltip from 'components/Tooltip'\n\ntype IState = {\n attacker: number\n defender: number\n draws: number\n incomplete: number\n calculating: boolean\n progress: number\n updates: number\n battles: number\n avgStrengthA: number\n maxStrengthA: number\n avgStrengthB: number\n maxStrengthB: number\n winRateA: number\n winRateB: number\n}\n\nconst DOTS = 6\nconst ATTACKER_COLOR = 'color-attacker'\nconst DEFENDER_COLOR = 'color-defender'\n/**\n * Calculates win rate for the current battle.\n */\nclass WinRate extends Component {\n constructor(props: IProps) {\n super(props)\n this.state = {\n attacker: 0,\n defender: 0,\n calculating: false,\n progress: 0,\n updates: 0,\n draws: 0,\n incomplete: 0,\n battles: 0,\n avgStrengthA: 0,\n maxStrengthA: 0,\n avgStrengthB: 0,\n maxStrengthB: 0,\n winRateA: 0,\n winRateB: 0\n }\n }\n\n toPercent = (value: number) => toPercent(value, 0)\n toTooltipPercent = (value: number) => toPercent(value, 1)\n toSignedTooltipPercent = (value: number) => toSignedPercent(value, 1)\n toTooltipNumber = (value: number) => toNumber(value, 3)\n\n willUnmount = false\n componentWillUnmount() {\n this.willUnmount = true\n interrupt()\n }\n\n render() {\n const {\n attacker,\n defender,\n calculating,\n progress,\n updates,\n draws,\n incomplete,\n avgStrengthA,\n maxStrengthA,\n avgStrengthB: avgStrengthD,\n maxStrengthB: maxStrengthD\n } = this.state\n return (\n \n \n \n \n (calculating ? interrupt() : this.calculate())}\n >\n {calculating ? showProgress(toFlooredPercent(progress, 0), updates, DOTS) : 'Analyze'}\n \n \n \n \n \n \n \n \n \n Win rate\n
\n \n {' / '}\n \n
\n
\n
\n \n \n \n Losses\n
\n \n {' / '}\n \n
\n
\n
\n
\n
\n
\n
\n
\n )\n }\n\n getInfoTooltip = () => {\n return (\n
\n

The win rate is calculated by doing thousands of battles with different dice rolls.

\n

Check Analyze page for more stats or to change speed/accuracy of calculations.

\n

\n For larges battles it's recommended to manually reduce combat width from Settings page while reducing amount\n of units.\n

\n
\n )\n }\n\n getWinChanceTooltip = () => {\n const { attacker, defender, draws, incomplete, battles } = this.state\n return (\n
\n \n \n Attacker:{' '}\n {\n \n }\n \n \n Defender:{' '}\n {\n \n }\n \n {this.scale(draws) > 0.0005 ? Draws: {this.toTooltipPercent(this.scale(draws))} : null}\n {this.scale(incomplete) > 0.0005 ? (\n Incomplete: {this.toTooltipPercent(this.scale(incomplete))}\n ) : null}\n \n Battles: {battles}\n
\n )\n }\n\n getCasualtiesTooltip = () => {\n const { winRateA, winRateB, battles, avgStrengthA, maxStrengthA, avgStrengthB, maxStrengthB } = this.state\n return (\n
\n \n \n Attacker:{' '}\n {\n \n }\n {' ('}\n {\n \n }\n {')'}\n \n \n Defender:{' '}\n {\n \n }\n {' ('}\n {\n \n }\n {')'}\n \n \n Casualties win rate:{' '}\n {\n \n }\n {' / '}\n {\n \n }\n \n \n Casualties balance:{' '}\n {}\n {' / '}\n {}\n \n \n Battles: {battles}\n
\n )\n }\n\n update = (update: WinRateProgress, casualties: CasualtiesProgress) => {\n if (this.willUnmount) return\n const { attacker, defender, progress, calculating, draws, incomplete, battles } = update\n this.setState({\n attacker,\n defender,\n progress,\n calculating,\n draws,\n incomplete,\n updates: calculating ? (this.state.updates + 1) % DOTS : 0,\n battles,\n ...casualties\n })\n }\n\n calculate = () => {\n const { state } = this.props\n // Initialization done here to prevent it happening on every render.\n const environment = getCombatEnvironment(state)\n const [attacker, defender] = convertSides(state)\n environment.settings = {\n ...environment.settings,\n [Setting.CalculateWinChance]: true,\n [Setting.CalculateCasualties]: true,\n [Setting.CalculateResourceLosses]: false\n }\n calculateWinRate(this.update, environment, attacker, defender)\n }\n\n scale = (value: number) => (this.state.progress ? value / this.state.progress : 0)\n}\n\nconst mapStateToProps = (state: AppState) => ({ state })\n\nconst actions = {}\n\ntype S = ReturnType\ntype D = typeof actions\ninterface IProps extends React.PropsWithChildren, D {}\n\nexport default connect(mapStateToProps, actions)(WinRate)\n","import React, { useEffect, useRef, useState } from 'react'\n\nimport { toPercent, toNumber } from 'formatters'\nimport { Input, InputOnChangeData } from 'semantic-ui-react'\n\ntype IProps = {\n value: number\n type?: string\n onChange: (value: number) => void\n disabled?: boolean\n percent?: boolean\n delay?: number\n}\n\nconst convertValue = (value: number, percent?: boolean) => {\n return percent ? toPercent(value) : toNumber(value)\n}\n\n/**\n * Custom numeric input which only send an update for numeric value when losing focus or after a delay.\n * This allows entering decimal numbers without the input resetting and also prevents stuttering when the battle doesn't update after every keystroke.\n */\nconst DelayedNumericInput = ({ disabled, type, value, percent, onChange, delay }: IProps) => {\n const [currentValue, setCurrentValue] = useState('')\n const timer = useRef()\n\n useEffect(() => {\n setCurrentValue(convertValue(value, percent))\n }, [value, percent])\n\n const clearTimer = () => {\n if (timer.current) clearTimeout(timer.current)\n timer.current = null\n }\n\n const update = (currentValue: string) => {\n let newValue = Number(percent ? currentValue.replace('%', '') : currentValue)\n if (percent) newValue /= 100.0\n // Non-numeric values should just reset the previous value.\n if (Number.isNaN(newValue)) setCurrentValue(convertValue(value, percent))\n else {\n setCurrentValue(convertValue(newValue, percent))\n if (value !== newValue) onChange(newValue)\n }\n }\n\n const setValue = (newValue: string) => {\n setCurrentValue(newValue)\n clearTimer()\n timer.current = setTimeout(() => update(newValue), delay ?? 2000)\n }\n\n const handleBlur = () => {\n clearTimer()\n update(currentValue)\n }\n const handleKeyPress = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter') handleBlur()\n }\n\n const handleChange = (_: unknown, { value }: InputOnChangeData) => {\n setValue(value)\n }\n\n const handleFocus = (e: React.FocusEvent) => e.target.select()\n\n return (\n
\n \n
\n )\n}\n\nexport default DelayedNumericInput\n","import React, { useCallback } from 'react'\nimport { useDispatch } from 'react-redux'\n\nimport { UnitAttribute, UnitDefinition, ValuesType, CountryName, getAttributeValuesType } from 'types'\nimport { setUnitValue } from 'reducers'\nimport DelayedNumericInput from 'components/Detail/DelayedNumericInput'\nimport { filterValues, calculateBase, calculateModifier } from 'data_values'\n\ntype Props = {\n unit: UnitDefinition\n country: CountryName\n identifier?: string\n attribute: UnitAttribute\n percent?: boolean\n type?: ValuesType\n}\n\n/**\n * Custom numeric input for setting attribute values for a unit.\n */\nconst UnitValueInput = ({ unit, country, attribute, percent, type, identifier }: Props): JSX.Element => {\n const dispatch = useDispatch()\n\n const key = identifier || 'Custom'\n\n const onChange = useCallback(\n (value: number) => {\n const valuesType = type ?? getAttributeValuesType(attribute)\n let base = 0\n if (valuesType === ValuesType.Base)\n base = calculateBase(unit, attribute) - calculateBase(filterValues(unit, key), attribute)\n else base = calculateModifier(unit, attribute) - calculateModifier(filterValues(unit, key), attribute)\n dispatch(setUnitValue(country, unit.type, valuesType, key, attribute, value - base))\n },\n [dispatch, key, attribute, country, type, unit]\n )\n\n const valuesType = type ?? getAttributeValuesType(attribute)\n let value = 0\n if (valuesType === ValuesType.Base) value = calculateBase(unit, attribute)\n else value = calculateModifier(unit, attribute)\n return \n}\n\nexport default UnitValueInput\n","import React, { Component } from 'react'\nimport { UnitType, UnitAttribute, CombatPhase, CombatSharedSettings, UnitDefinition } from 'types'\nimport DropdownTable from './DropdownTable'\nimport { calculateValue } from 'data_values'\n\ninterface IProps {\n value: UnitType\n values: UnitDefinition[]\n onSelect: (type: UnitType) => void\n settings: CombatSharedSettings\n}\n\nexport default class DropdownArchetype extends Component {\n getContent = (unit: UnitDefinition) => [\n unit.type,\n unit.tech ?? '',\n calculateValue(unit, UnitAttribute.OffensiveFirePips) + '/' + calculateValue(unit, UnitAttribute.DefensiveFirePips),\n calculateValue(unit, UnitAttribute.OffensiveShockPips) +\n '/' +\n calculateValue(unit, UnitAttribute.DefensiveShockPips),\n calculateValue(unit, UnitAttribute.OffensiveMoralePips) +\n '/' +\n calculateValue(unit, UnitAttribute.DefensiveMoralePips)\n ]\n\n isActive = (item: UnitDefinition) => item.type === this.props.value\n\n getValue = (item: UnitDefinition) => item.type\n\n getText = (item: UnitDefinition) => item.type + ' (' + (item.tech ?? 0) + ')'\n\n headers = ['Unit', 'Tech', CombatPhase.Fire, CombatPhase.Shock, UnitAttribute.Morale]\n\n render() {\n const { value, values, onSelect, settings } = this.props\n return (\n \n )\n }\n}\n","import React, { useCallback, useEffect, useMemo } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Image, Table } from 'semantic-ui-react'\n\nimport {\n SideType,\n UnitRole,\n CountryName,\n UnitType,\n UnitAttribute,\n filterAttributes,\n Setting,\n UnitDefinition,\n Mode,\n ArmyName,\n CultureType\n} from 'types'\nimport { getImage, mapRange } from 'utils'\nimport { useUnitDefinitions, useTechLevel } from 'state'\nimport { addToReserve, removeFromReserve, setUnitPreference, selectCulture } from 'reducers'\nimport { getArchetypes, getActualUnits, getLatestUnits, getChildUnits, getRootUnit } from 'managers/army'\nimport UnitValueInput from './UnitValueInput'\nimport AttributeImage from 'components/Utils/AttributeImage'\nimport DelayedNumericInput from 'components/Detail/DelayedNumericInput'\nimport { applyLosses } from 'managers/units'\nimport DropdownArchetype from 'components/Dropdowns/DropdownArchetype'\nimport { getCultures } from 'data'\nimport SimpleDropdown from 'components/Dropdowns/SimpleDropdown'\nimport { useMode, useCombatSettings, useWeariness, useCulture, useArmyData } from 'selectors'\n\ntype Props = {\n side: SideType\n countryName: CountryName\n armyName: ArmyName\n onRowClick: (country: CountryName, army: ArmyName, type: UnitType) => void\n}\n\ninterface Name {\n countryName: CountryName\n armyName: ArmyName\n}\n\nconst getAttributes = (mode: Mode) => {\n if (process.env.REACT_APP_GAME === 'EU4')\n return [UnitAttribute.Discipline, UnitAttribute.Morale, UnitAttribute.CombatAbility]\n else {\n if (mode === Mode.Naval)\n return [UnitAttribute.Discipline, UnitAttribute.Morale, UnitAttribute.DamageDone, UnitAttribute.DamageTaken]\n return [UnitAttribute.Discipline, UnitAttribute.Morale, UnitAttribute.Offense, UnitAttribute.Defense]\n }\n}\n\nconst TableUnitTypes = (props: Props): JSX.Element | null => {\n const { countryName, armyName, side } = props\n const dispatch = useDispatch()\n const units = useUnitDefinitions(countryName, armyName)\n const settings = useCombatSettings()\n const mode = useMode()\n const preferences = useArmyData(countryName, armyName).unitPreferences\n const techLevel = useTechLevel(countryName)\n\n const checkPreference = useCallback(\n (role: UnitRole) => {\n if (!units) return\n const preference = preferences[role]\n const techRequirement = preference && units[preference] && units[preference].tech\n if (techRequirement && techRequirement > techLevel) {\n dispatch(setUnitPreference(countryName, armyName, role, null))\n }\n },\n [dispatch, preferences, countryName, armyName, techLevel, units]\n )\n\n useEffect(() => {\n checkPreference(UnitRole.Front)\n checkPreference(UnitRole.Flank)\n checkPreference(UnitRole.Support)\n }, [checkPreference])\n\n if (!units) return null\n\n const unitList = settings[Setting.Tech] ? getArchetypes(units, mode) : getActualUnits(units, mode)\n return (\n \n \n \n {side}\n Amount\n {filterAttributes(getAttributes(mode), settings).map(attribute => (\n \n \n \n ))}\n \n \n \n \n {!settings[Setting.Tech] && unitList.map(unit => )}\n {settings[Setting.Tech] && }\n {settings[Setting.Tech] && }\n {settings[Setting.Tech] && }\n \n
\n )\n}\n\nconst RootUnitRow = (props: { unit: UnitDefinition } & Props) => {\n const { unit, countryName, armyName, onRowClick } = props\n const settings = useCombatSettings()\n const mode = useMode()\n const culture = useCulture(countryName)\n const dispatch = useDispatch()\n\n const handleRowCLick = useCallback(() => onRowClick(countryName, armyName, unit.type), [\n onRowClick,\n unit.type,\n countryName,\n armyName\n ])\n\n const onSelectCulture = useCallback(\n (culture: CultureType) => {\n dispatch(selectCulture(countryName, culture, false))\n },\n [dispatch, countryName]\n )\n\n const attributes = useMemo(() => {\n return filterAttributes(getAttributes(mode), settings)\n }, [mode, settings])\n\n const isCulture = settings[Setting.Culture]\n\n if (!unit) return null\n const image = getImage(unit)\n return (\n \n \n \n {isCulture ? : 'Army'}\n \n \n {attributes.map(attribute => (\n \n \n \n ))}\n \n )\n}\n\nconst RoleRow = (props: { role: UnitRole; archetypes: UnitDefinition[] } & Props) => {\n const { countryName, armyName, onRowClick, archetypes, role } = props\n const dispatch = useDispatch()\n const units = useUnitDefinitions(countryName, armyName)\n const settings = useCombatSettings()\n const mode = useMode()\n const preferences = useArmyData(countryName, armyName).unitPreferences\n const techLevel = useTechLevel(countryName)\n\n // List of archetypes -> get archetype -> get image\n const archetype = archetypes.find(unit => unit.role === role)\n const preference = preferences[role]\n const children = useMemo(() => {\n if (!archetype || !units) return null\n const latestType = getLatestUnits(units, techLevel)\n const latest = { ...units[latestType[role] || archetype.type], type: UnitType.Latest }\n return [latest].concat(...getChildUnits(units, techLevel, archetype.type))\n }, [archetype, units, role, techLevel])\n\n const handleRowCLick = useCallback(() => onRowClick(countryName, armyName, archetype?.type ?? ('' as UnitType)), [\n onRowClick,\n archetype?.type,\n countryName,\n armyName\n ])\n\n const handleSelect = useCallback(\n (type: UnitType) => {\n dispatch(setUnitPreference(countryName, armyName, role, type))\n },\n [dispatch, countryName, armyName, role]\n )\n\n const attributes = useMemo(() => {\n return filterAttributes(getAttributes(mode), settings)\n }, [mode, settings])\n\n if (!children || !archetype || !preference || !units) return null\n const image = getImage(archetype)\n\n return (\n \n \n \n \n \n \n \n \n {attributes.map(attribute => (\n \n \n \n ))}\n \n )\n}\n\nconst UnitRow = (props: { unit: UnitDefinition } & Props) => {\n const { unit, countryName, armyName, onRowClick } = props\n const settings = useCombatSettings()\n const mode = useMode()\n\n const handleRowCLick = useCallback(() => onRowClick(countryName, armyName, unit.type), [\n onRowClick,\n countryName,\n armyName,\n unit.type\n ])\n\n const attributes = useMemo(() => {\n return filterAttributes(getAttributes(mode), settings)\n }, [mode, settings])\n if (!unit) return null\n const image = getImage(unit)\n return (\n \n \n \n {unit.type}\n \n \n \n \n {attributes.map(attribute => (\n \n \n \n ))}\n \n )\n}\n\nconst CohortCount = (props: { type: UnitType } & Name) => {\n const dispatch = useDispatch()\n const { type, countryName, armyName } = props\n const reserve = useArmyData(countryName, armyName).reserve\n const weariness = useWeariness(countryName)\n const count = useMemo(() => reserve.filter(cohort => cohort.type === type).length, [reserve, type])\n\n const updateReserve = useCallback(\n (amount: number) => {\n const previous = reserve.filter(cohort => cohort.type === type).length\n if (amount > previous) {\n const units = mapRange(amount - previous, _ => ({ type, image: '' }))\n dispatch(addToReserve(countryName, armyName, applyLosses(weariness, units)))\n }\n if (amount < previous) {\n const types = mapRange(previous - amount, _ => type)\n dispatch(removeFromReserve(countryName, armyName, types))\n }\n },\n [dispatch, type, reserve, countryName, armyName, weariness]\n )\n\n return \n}\n\nexport default TableUnitTypes\n","import React, { Component } from 'react'\nimport { TacticType, Tactic, CombatSharedSettings, TacticMatch } from 'types'\nimport DropdownTable from './DropdownTable'\nimport StyledNumber from 'components/Utils/StyledNumber'\nimport { toPercent, toSignedPercent } from 'formatters'\nimport LabelItem from 'components/Utils/LabelUnit'\n\ntype IProps = {\n value: TacticType\n values: Tactic[]\n settings: CombatSharedSettings\n onSelect: (type: TacticType) => void\n}\n\nexport default class DropdownTactic extends Component {\n getContent = (tactic: Tactic) => [\n ,\n ,\n ,\n \n ]\n\n isActive = (item: Tactic) => item.type === this.props.value\n isPositive = (item: Tactic) => item.match === TacticMatch.Positive\n isNegative = (item: Tactic) => item.match === TacticMatch.Negative\n\n getValue = (item: Tactic) => item.type\n\n headers = ['Tactic', 'Effect', 'Damage', 'Casualties']\n\n render() {\n const { value, values, onSelect, settings } = this.props\n return (\n tactic.type === value)} />}\n settings={settings}\n width={150}\n />\n )\n }\n}\n","import React from 'react'\nimport { useDispatch } from 'react-redux'\nimport { selectTactic } from 'reducers'\nimport { SideType, TacticType } from 'types'\nimport DropdownTactic from 'components/Dropdowns/DropdownTactic'\nimport { useGeneral, useParticipant, useCombatSettings, useTactics } from 'selectors'\n\ntype Props = {\n side: SideType\n index: number\n}\n\nconst TacticSelector = ({ index, side }: Props) => {\n const tactics = useTactics(side)\n const settings = useCombatSettings()\n const { countryName, armyName } = useParticipant(side, index)\n const tactic = useGeneral(countryName, armyName).tactic.type\n\n const dispatch = useDispatch()\n const handleSelect = (type: TacticType) => {\n dispatch(selectTactic(countryName, armyName, type))\n }\n return \n}\n\nexport default TacticSelector\n","import React from 'react'\nimport { List } from 'semantic-ui-react'\nimport { Modifier, ModifierType } from 'types'\n\ntype Props = {\n name: string | null\n modifiers: Modifier[]\n padding?: string\n showZero?: boolean\n horizontal?: boolean\n}\n\nconst getText = (modifier: Modifier) => {\n if (modifier.target in ModifierType) return {modifier.attribute}\n return {modifier.target + ' ' + modifier.attribute + ''}\n}\n\nconst getValue = (modifier: Modifier, showZero = false, padding = '') => {\n if (!modifier.value && !showZero) return null\n const sign = modifier.value >= 0 ? '+' : '-'\n let value = Math.abs(modifier.value)\n value = modifier.noPercent ? value : value * 100\n value = +value.toFixed(3)\n const str = modifier.noPercent ? value + padding : value + ' %'\n return (\n \n {sign + str}\n \n )\n}\n\nconst ListModifier = ({ modifiers, name, showZero, padding, horizontal }: Props) => {\n return (\n \n {name && (\n \n {name}\n \n )}\n {modifiers.map((modifier, index) => (\n \n {getText(modifier)} {getValue(modifier, showZero, padding)}\n \n ))}\n \n )\n}\n\nexport default ListModifier\n","import React from 'react'\nimport { useDispatch } from 'react-redux'\n\nimport { CountryName, CountryAttribute, countryAttributeToEffect } from 'types'\nimport { setCountryAttribute } from 'reducers'\nimport DelayedNumericInput from 'components/Detail/DelayedNumericInput'\nimport { filterValues, calculateBase } from 'data_values'\nimport ListModifier from 'components/Utils/ListModifier'\nimport { getDynamicEffect } from 'managers/modifiers'\nimport { useCountryDefinition } from 'selectors'\n\ntype Props = {\n country: CountryName\n attribute: CountryAttribute\n percent?: boolean\n showEffect?: boolean\n}\n\nconst CountryValueEffect = ({ attribute, value }: { attribute: CountryAttribute; value: number }) => {\n const modifiers = getDynamicEffect(countryAttributeToEffect(attribute), value)\n return \n}\n\n/**\n * Custom numeric input for setting attribute values for a country.\n */\nconst CountryValueInput = ({ attribute, percent, country, showEffect }: Props) => {\n const dispatch = useDispatch()\n const handleChange = (value: number) => {\n const base =\n calculateBase(definition.modifiers, attribute) -\n calculateBase(filterValues(definition.modifiers, 'Custom'), attribute)\n dispatch(setCountryAttribute(country, attribute, value - base))\n }\n\n const definition = useCountryDefinition(country)\n\n const value = calculateBase(definition.modifiers, attribute)\n return (\n <>\n \n {showEffect && (\n \n \n \n )}\n \n )\n}\n\nexport default CountryValueInput\n","import React from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Table, Input, Button, InputOnChangeData } from 'semantic-ui-react'\n\nimport {\n SideType,\n CountryName,\n Setting,\n CharacterAttribute,\n GeneralValueType,\n isAttributeEnabled,\n CountryAttribute,\n ArmyName,\n Participant,\n UnitType,\n UnitAttribute\n} from 'types'\nimport { keys } from 'utils'\nimport { useUnitDefinition } from 'state'\nimport {\n selectParticipantCountry,\n selectParticipantArmy,\n setGeneralAttribute,\n deleteParticipant,\n addParticipant,\n setDaysUntilBattle,\n createArmy,\n createCountry\n} from 'reducers'\nimport StyledNumber from 'components/Utils/StyledNumber'\nimport TacticSelector from './TacticSelector'\nimport { addSign } from 'formatters'\nimport CountryValueInput from './CountryValueInput'\nimport { filterArmies } from 'managers/countries'\nimport AttributeImage from 'components/Utils/AttributeImage'\nimport UnitValueInput from './UnitValueInput'\nimport SimpleDropdown from 'components/Dropdowns/SimpleDropdown'\nimport DelayedNumericInput from 'components/Detail/DelayedNumericInput'\nimport { getDefaultArmyName } from 'data'\nimport { useGeneral, useMode, useSide, useCombatSettings, useArmies, useCountries } from 'selectors'\n\ntype Props = {\n type: SideType\n}\n\nconst TableArmyInfo = ({ type }: Props): JSX.Element => {\n const settings = useCombatSettings()\n const dispatch = useDispatch()\n const participants = useSide(type).participants\n const last = participants[participants.length - 1]\n\n const handleAddParticipant = () => {\n dispatch(addParticipant(type, last.countryName, last.armyName))\n }\n return (\n \n \n \n Country\n Army\n {settings[Setting.Martial] && General}\n {settings[Setting.Tactics] && Tactic}\n {settings[Setting.Tech] && Tech}\n {isAttributeEnabled(CountryAttribute.FlankRatio, settings) && (\n \n \n \n )}\n {isAttributeEnabled(UnitAttribute.OffensiveSupport, settings) && (\n \n \n \n )}\n Days\n \n \n \n {participants.map((item, index) => (\n \n ))}\n \n \n
\n )\n}\n\ninterface ArmyInfoProps {\n type: SideType\n index: number\n participant: Participant\n}\n\nconst ArmyInfo = ({ type, participant, index }: ArmyInfoProps) => {\n const { daysUntilBattle, armyName, countryName } = participant\n const dispatch = useDispatch()\n const countries = useCountries()\n const mode = useMode()\n const side = useSide(type)\n const settings = useCombatSettings()\n const armies = useArmies(countryName)\n const artillery = useUnitDefinition(countryName, armyName, UnitType.Artillery)\n\n const handleSetDaysUntilBattle = (value: number) => {\n dispatch(setDaysUntilBattle(type, index, value))\n }\n\n const handleSelectCountry = (name: CountryName) => {\n dispatch(\n selectParticipantCountry(\n type,\n index,\n name,\n countries[name]\n ? (Object.keys(filterArmies(countries[name].armies, mode))[0] as ArmyName)\n : getDefaultArmyName(mode)\n )\n )\n }\n const handleDeleteParticipant = () => {\n dispatch(deleteParticipant(type, index))\n }\n const handleSelectArmy = (name: ArmyName) => {\n dispatch(selectParticipantArmy(type, index, name))\n }\n const handleCreateArmy = (name: ArmyName) => {\n dispatch(createArmy(countryName, name, mode))\n }\n\n const clearable = side.participants.length > 1\n\n return (\n \n \n (name ? handleSelectCountry(name) : handleDeleteParticipant())}\n style={{ width: 110 }}\n onAdd={name => createCountry(name)}\n clearable={clearable}\n />\n \n \n \n \n {settings[Setting.Martial] && (\n \n )}\n {settings[Setting.Tactics] && (\n \n \n \n )}\n {settings[Setting.Tech] && (\n \n \n \n )}\n {isAttributeEnabled(CountryAttribute.FlankRatio, settings) && (\n \n \n \n )}\n {artillery && isAttributeEnabled(UnitAttribute.OffensiveSupport, settings) && (\n \n \n \n )}\n \n \n \n \n )\n}\n\ninterface GeneralAttributeProps {\n countryName: CountryName\n armyName: ArmyName\n attribute: GeneralValueType\n}\n\nconst TableGeneralAttribute = ({ countryName: country, armyName: army, attribute }: GeneralAttributeProps) => {\n const dispatch = useDispatch()\n const general = useGeneral(country, army)\n const handleSetGeneralAttribute = (_: unknown, { value }: InputOnChangeData) => {\n dispatch(setGeneralAttribute(country, army, attribute, Number(value)))\n }\n if (!general) return null\n return (\n \n {' '}\n \n \n )\n}\n\nexport default TableArmyInfo\n","import React from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Image, Table, Button } from 'semantic-ui-react'\n\nimport { SideType, Setting, CharacterAttribute, ModalType } from 'types'\nimport { setDice, openModal } from 'reducers'\nimport StyledNumber from 'components/Utils/StyledNumber'\nimport { getCombatPhase, getCombatPhaseNumber } from 'combat'\nimport { addSign, toSignedPercent } from 'formatters'\nimport IconDice from 'images/chance.png'\nimport IconTerrain from 'images/terrain.png'\nimport AttributeImage from 'components/Utils/AttributeImage'\nimport DelayedNumericInput from 'components/Detail/DelayedNumericInput'\nimport { getImage } from 'utils'\nimport {\n useCombatSide,\n useLeadingArmy,\n useParticipantName,\n useRound,\n useSide,\n useCombatSettings,\n useTactics\n} from 'selectors'\n\ntype Props = {\n sideType: SideType\n}\n\nconst TableSideInfo = ({ sideType }: Props) => {\n const settings = useCombatSettings()\n return (\n \n \n \n Leader\n {settings[Setting.Martial] && General}\n {settings[Setting.FireAndShock] && General}\n {settings[Setting.Tactics] && Tactic}\n Dice roll\n \n \n \n \n \n
\n )\n}\n\nconst RenderSide = ({ sideType }: Props) => {\n const settings = useCombatSettings()\n const tactics = useTactics(sideType)\n const army = useLeadingArmy(sideType)\n const tactic = tactics.find(item => item.type === army?.tactic?.type)\n const participantIndex = army?.participantIndex ?? 0\n const participant = useParticipantName(sideType, participantIndex)\n return (\n \n {participant}\n \n \n {army ? army.general[CharacterAttribute.Martial] : 0}\n \n {settings[Setting.Tactics] && (\n \n {army ? : null}\n {tactic ? : null}\n \n )}\n \n \n \n \n )\n}\n\nconst RenderRoll = ({ sideType }: Props) => {\n const dispatch = useDispatch()\n const side = useSide(sideType)\n const settings = useCombatSettings()\n const round = useRound()\n const handleClick = () => {\n dispatch(openModal(ModalType.DiceRolls, { side: sideType }))\n }\n const handleChange = (value: number) => {\n dispatch(setDice(sideType, value))\n }\n const combat = useCombatSide(sideType)\n const terrainPips = combat.results.terrainPips\n const generalPips = combat.results.generalPips\n const phase = getCombatPhaseNumber(round, settings)\n const isDiceSet = side.randomizeDice || (side.rolls.length > phase && side.rolls[phase])\n return (\n
\n \n {isDiceSet ? (\n combat.results.dice\n ) : (\n \n )}\n \n
\n )\n}\n\nexport default TableSideInfo\n","import React, { useCallback } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Table } from 'semantic-ui-react'\n\nimport { SideType, CountryName, UnitAttribute, CombatPhase, GeneralDefinition, GeneralValueType, ArmyName } from 'types'\nimport { useUnitDefinition } from 'state'\nimport { setGeneralAttribute } from 'reducers'\nimport AttributeImage from 'components/Utils/AttributeImage'\nimport StyledNumber from 'components/Utils/StyledNumber'\nimport { addSign } from 'formatters'\nimport UnitValueInput from './UnitValueInput'\nimport DelayedNumericInput from 'components/Detail/DelayedNumericInput'\nimport { getRootParent } from 'managers/units'\nimport { useGeneral, useMode, useCombatSettings } from 'selectors'\n\ntype Props = {\n side: SideType\n countryName: CountryName\n armyName: ArmyName\n}\n\nconst TableDamageAttributes = ({ side, countryName, armyName }: Props): JSX.Element | null => {\n const settings = useCombatSettings()\n const mode = useMode()\n const unit = useUnitDefinition(countryName, armyName, getRootParent(mode))\n const general = useGeneral(countryName, armyName)\n if (!unit || !general) return null\n return (\n \n \n \n {side}\n \n \n \n \n \n \n \n \n \n \n General\n \n \n \n \n \n \n \n \n Damage done\n \n \n \n \n \n \n \n \n Damage taken\n \n \n \n \n \n \n \n \n
\n )\n}\n\ninterface GeneralAttributeProps {\n countryName: CountryName\n armyName: ArmyName\n general: GeneralDefinition\n attribute: GeneralValueType\n}\n\nconst GeneralAttribute = ({ general, countryName, armyName, attribute }: GeneralAttributeProps) => {\n const dispatch = useDispatch()\n\n const handleChange = useCallback(\n (value: number) => {\n dispatch(setGeneralAttribute(countryName, armyName, attribute, value))\n },\n [dispatch, countryName, armyName, attribute]\n )\n\n return (\n <>\n {' '}\n \n \n )\n}\n\nexport default TableDamageAttributes\n","import React from 'react'\n\nimport { selectParticipant } from 'reducers'\nimport { SideType } from 'types'\nimport SimpleDropdown from 'components/Dropdowns/SimpleDropdown'\nimport { getParticipantName } from 'managers/battle'\nimport { useParticipants, useSelectedParticipantIndex } from 'selectors'\nimport { useDispatch } from 'react-redux'\n\ntype Props = {\n sideType: SideType\n}\n\n/**\n * Selector for an active participant.\n */\nconst ParticipantSelector = ({ sideType }: Props) => {\n const participants = useParticipants(sideType)\n const value = useSelectedParticipantIndex(sideType)\n const values = participants.map((item, index) => ({\n value: index,\n text: getParticipantName(item)\n }))\n\n const dispatch = useDispatch()\n const handleChange = (value: number) => dispatch(selectParticipant(sideType, value))\n\n return (\n \n Edit army: \n \n \n )\n}\n\nexport default ParticipantSelector\n","import React, { useCallback, useEffect } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Button, Grid, Header, Checkbox, CheckboxProps } from 'semantic-ui-react'\nimport { getCombatPhase } from 'combat'\nimport PreferredUnitTypes from 'containers/PreferredUnitTypes'\nimport TableStats from 'containers/TableStats'\nimport TableArmyPart from 'containers/GridRowArmyPart'\nimport TargetArrows from 'containers/TargetArrows'\nimport TerrainSelector from 'containers/TerrainSelector'\nimport WinRate from 'containers/WinRate'\nimport { clearCohorts, changeSiteParameter, refreshBattle, resetState, openModal, battle, undo } from 'reducers'\nimport { useParticipant } from 'state'\nimport { ArmyPart, CountryName, Setting, SideType, CombatPhase, UnitType, ModalType, ArmyName } from 'types'\nimport TableUnitTypes from 'containers/TableUnitTypes'\nimport TableArmyInfo from 'containers/TableArmyInfo'\nimport TableSideInfo from 'containers/TableSideInfo'\nimport TableDamageAttributes from 'containers/TableDamageAttributes'\nimport AccordionToggle from 'containers/AccordionToggle'\nimport { getDay, getRound } from 'managers/battle'\nimport ParticipantSelector from 'containers/ParticipantSelector'\nimport { useBattle, useOutdated, useRound, useCombatSettings, useCombatWidth } from 'selectors'\n\nconst ATTACKER_COLOR = '#FFAA00AA'\nconst DEFENDER_COLOR = '#00AAFFAA'\n\nconst Battle = (): JSX.Element | null => {\n useRefresher()\n return (\n <>\n \n
\n
\n \n
\n \n
\n \n
\n \n \n )\n}\n\nconst useRefresher = () => {\n const dispatch = useDispatch()\n const settings = useCombatSettings()\n const outdated = useOutdated()\n const round = useRound()\n const autoRefresh = settings[Setting.AutoRefresh]\n useEffect(() => {\n if (outdated && (autoRefresh || round < 0)) dispatch(refreshBattle())\n }, [outdated, round, dispatch, autoRefresh])\n}\n\nconst getRoundName = (day: number, round: number, fightOver: boolean, phase: CombatPhase): string => {\n const dayStr = day === round ? '' : ', Day ' + day\n let roundStr = ''\n if (fightOver) roundStr = 'Fight over'\n else if (day === 0 || round === 0) roundStr = 'Deployment'\n else if (round === -1) roundStr = 'Waiting for enemies'\n else if (phase !== CombatPhase.Default) roundStr = 'Round ' + String(round) + ' (' + phase + ')'\n else roundStr = 'Round ' + String(round)\n return roundStr + dayStr\n}\n\nconst useOpenCohortModal = () => {\n const dispatch = useDispatch()\n return useCallback(\n (side: SideType, participantIndex: number, index: number, country: CountryName, army: ArmyName): void => {\n dispatch(openModal(ModalType.CohortDetail, { side, country, army, index, participantIndex }))\n },\n [dispatch]\n )\n}\n\nconst RenderFrontline = ({ sideType }: { sideType: SideType }) => {\n const combatWidth = useCombatWidth()\n const handleOpenCohortModal = useOpenCohortModal()\n return (\n \n )\n}\n\nconst Frontline = () => {\n const dispatch = useDispatch()\n const settings = useCombatSettings()\n const battleState = useBattle()\n const { outdated, fightOver } = battleState\n const day = getDay(battleState)\n const round = getRound(battleState)\n const isUndoAvailable = day > 0\n const handleUndo = (rounds: number) => {\n dispatch(undo(rounds))\n if (outdated) dispatch(refreshBattle())\n }\n const handleBattle = (rounds: number) => {\n if (outdated) dispatch(refreshBattle())\n dispatch(battle(rounds))\n }\n const handleUndoMany = () => handleUndo(10)\n const handleUndoSingle = () => handleUndo(1)\n const handleRedoMany = () => handleBattle(10)\n const handleRedoSingle = () => handleBattle(1)\n const handleChangeAutoRefresh = (_: unknown, { checked }: CheckboxProps) => {\n dispatch(changeSiteParameter(Setting.AutoRefresh, !!checked))\n }\n\n return (\n \n \n \n
{getRoundName(day, round, fightOver, getCombatPhase(round, settings))}
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n )\n}\n\nconst BattleSetup = () => {\n const participantA = useParticipant(SideType.A)\n const participantB = useParticipant(SideType.B)\n const settings = useCombatSettings()\n const dispatch = useDispatch()\n\n const handleRowCLick = useCallback(\n (countryName: CountryName, armyName: ArmyName, type: UnitType): void => {\n dispatch(openModal(ModalType.UnitDetail, { country: countryName, army: armyName, type }))\n },\n [dispatch]\n )\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {settings[Setting.FireAndShock] && (\n \n \n \n \n \n \n \n \n )}\n \n \n \n \n \n {settings[Setting.CustomDeployment] && (\n \n \n \n \n \n )}\n \n
\n
\n )\n}\n\nconst Stats = () => {\n return (\n \n \n \n \n \n \n \n \n
\n
\n
\n )\n}\n\nconst RenderReserve = ({ sideType }: { sideType: SideType }) => {\n const handleOpenCohortModal = useOpenCohortModal()\n return (\n \n )\n}\n\nconst RenderDefeated = ({ sideType }: { sideType: SideType }) => {\n const handleOpenCohortModal = useOpenCohortModal()\n return (\n \n )\n}\nconst RenderRetreated = ({ sideType }: { sideType: SideType }) => {\n const handleOpenCohortModal = useOpenCohortModal()\n return (\n \n )\n}\n\nconst ReserveAndDefeated = () => {\n return (\n \n \n \n \n \n \n \n \n \n
\n
\n
\n )\n}\n\nconst Controls = () => {\n const dispatch = useDispatch()\n const participantA = useParticipant(SideType.A)\n const participantB = useParticipant(SideType.B)\n const handleResetUnits = () => {\n dispatch(clearCohorts(participantA.countryName, participantA.armyName))\n dispatch(clearCohorts(participantB.countryName, participantB.armyName))\n }\n\n const handleResetData = () => {\n dispatch(resetState())\n }\n return (\n \n \n \n \n \n \n \n \n )\n}\n\nexport default Battle\n","export default __webpack_public_path__ + \"static/media/land_combat.be7e2f94.png\";","import React from 'react'\nimport { useDispatch } from 'react-redux'\nimport { setMode } from 'reducers'\nimport { Menu, Image, Button } from 'semantic-ui-react'\nimport IconLand from 'images/land_combat.png'\nimport IconNaval from 'images/naval_combat.png'\nimport { Mode } from 'types'\nimport { useHistory } from 'react-router-dom'\nimport { useMode } from 'selectors'\n\n/**\n * Navigation menu for different pages.\n */\nconst Navigation = () => {\n const dispatch = useDispatch()\n const history = useHistory()\n const path = history.location.pathname\n\n const currentMode = useMode()\n\n const renderModeButton = (mode: Mode) => {\n return (\n dispatch(setMode(mode))}\n >\n \n \n )\n }\n\n return (\n \n )\n}\n\nexport default Navigation\n","import React, { Component } from 'react'\nimport { Table } from 'semantic-ui-react'\nimport { mapRange } from '../../utils'\n\ninterface IProps {\n cells: number\n stretch?: number\n}\n\n/**\n * Creates a table row with a fixed amount of cells.\n */\nexport default class PaddedRow extends Component {\n render() {\n const { cells, children } = this.props\n const stretch = (this.props.stretch === undefined ? cells : this.props.stretch) - 1\n const length = React.Children.count(children)\n return (\n \n {React.Children.map(children, (child, index) => (\n \n {child}\n \n ))}\n {mapRange(cells - length, number => (\n \n ))}\n \n )\n }\n}\n","import React, { ChangeEvent, useEffect, useState } from 'react'\nimport { Input as InputUI } from 'semantic-ui-react'\n\ntype Props = {\n value: T\n onChange?: (value: T) => void\n disabled?: boolean\n onBlur?: () => void\n style?: unknown\n placeholder?: string\n}\n\nexport const Input = ({ placeholder, value, onChange, onBlur, style }: Props) => {\n return (\n onChange && onChange(value as T)}\n />\n )\n}\n\nexport const FileInput = ({ onChange, style }: { onChange: (file: File) => void; style?: unknown }) => {\n const handleChange = (event: ChangeEvent) => {\n if (event.target.files) onChange(event.target.files[0])\n }\n return \n}\n\ninterface InputDelayedProps {\n value: T\n onChange: (value: T) => void\n placeholder?: string\n style?: unknown\n}\n\nexport const InputDelayed = ({ placeholder, value, onChange, style }: InputDelayedProps) => {\n const [currentValue, setCurrentValue] = useState(value)\n useEffect(() => {\n setCurrentValue(value)\n }, [value])\n\n const handleBlur = () => {\n onChange(currentValue)\n }\n return \n}\n","import React, { Component } from 'react'\nimport { Table } from 'semantic-ui-react'\n\nimport PaddedRow from './Utils/PaddedRow'\nimport { Input } from './Utils/Inputs'\nimport Headers from './Utils/Headers'\n\nimport { ValuesType, formatAttribute } from 'types'\nimport { getValue, explainShort, DataValues, calculateValue } from 'data_values'\n\ninterface IProps, T extends string> {\n customValueKey: string\n definition: D\n attributes: T[]\n onChange: (key: string, attribute: T, value: number) => void\n}\n\n// Display component for showing and changing some country details.\nexport default class TableAttributes, T extends string> extends Component> {\n headers = ['Attribute', 'Value', 'Custom value', 'Explained']\n\n CELLS = 4\n\n render() {\n const { attributes } = this.props\n return (\n \n \n {attributes.map(this.renderRow)}\n
\n )\n }\n\n renderRow = (attribute: T) => {\n const { definition, customValueKey, onChange } = this.props\n const baseValue = getValue(ValuesType.Base, definition, attribute, customValueKey)\n const value = calculateValue(definition, attribute)\n\n return (\n \n {attribute}\n {formatAttribute(value, attribute)}\n onChange(customValueKey, attribute, Number(value))} />\n {explainShort(definition, attribute)}\n \n )\n }\n}\n","import React, { Component } from 'react'\nimport { CombatSharedSettings, DataEntry } from 'types'\nimport DropdownTable from './DropdownTable'\nimport ListModifier from 'components/Utils/ListModifier'\n\ntype IProps = {\n value: string\n values: DataEntry[]\n settings?: CombatSharedSettings\n onSelect: (key: string) => void\n type: string\n}\n\nexport default class DropdownListDefinition extends Component {\n getContent = (item: DataEntry, search: string) =>\n item.name.toLowerCase().includes(search.toLowerCase())\n ? [item.name, ]\n : null\n\n isActive = (item: DataEntry) => item.key === this.props.value\n\n getValue = (item: DataEntry) => item.key\n\n getText = (item: DataEntry) => item.name\n\n getHeaders = () => [this.props.type, 'Effect']\n\n render() {\n const { value, values, onSelect, settings, type } = this.props\n return (\n \n )\n }\n}\n","import ListModifier from 'components/Utils/ListModifier'\nimport React from 'react'\nimport { Table } from 'semantic-ui-react'\nimport { SelectionType, Modifier } from 'types'\nimport { mapRange, ObjSet } from 'utils'\n\ntype Props = {\n selections: ObjSet | undefined\n type: SelectionType\n items: {\n key: string\n name: string\n modifiers: Modifier[]\n }[]\n columns: number\n onClick: (enabled: boolean) => (type: SelectionType, key: string) => void\n disabled?: boolean\n usePercentPadding?: boolean\n}\n\nexport const TableModifierList = ({\n selections,\n columns,\n disabled,\n items,\n onClick,\n type,\n usePercentPadding\n}: Props) => {\n const rows = Math.ceil(items.length / columns)\n return (\n \n \n {mapRange(rows, number => number).map(row => (\n \n {mapRange(columns, number => number).map(column => {\n const index = row * columns + column\n const entity = items[index]\n if (!entity) return \n const modifiers = entity.modifiers\n const key = entity.key\n return renderCell(\n type,\n key,\n entity.name,\n selections ? selections[key] : false,\n modifiers,\n onClick,\n usePercentPadding ? PERCENT_PADDING : undefined,\n disabled\n )\n })}\n \n ))}\n \n
\n )\n}\n\nconst PERCENT_PADDING = '\\u00a0\\u00a0\\u00a0\\u00a0'\nconst CELL_PADDING = '.78571429em .78571429em'\nconst renderCell = (\n type: SelectionType,\n key: string,\n name: string | null,\n enabled: boolean,\n modifiers: Modifier[],\n onClick: (enabled: boolean) => (type: SelectionType, key: string) => void,\n padding?: string,\n disabled?: boolean,\n width?: number\n) => (\n onClick(enabled)(type, key)}\n style={{ padding: CELL_PADDING }}\n >\n \n \n)\n","import React, { Component, useEffect, useState } from 'react'\nimport { Container, Grid, Table, List, Input, Checkbox, Button, Tab } from 'semantic-ui-react'\nimport { connect, useDispatch } from 'react-redux'\nimport { AppState, getGeneral, getGeneralDefinition } from 'state'\nimport { mapRange, values, keys, toArr, ObjSet } from '../utils'\n\nimport { addSignWithZero } from 'formatters'\nimport {\n DataEntry,\n Modifier,\n CountryAttribute,\n CharacterAttribute,\n CombatPhase,\n GeneralValueType,\n filterAttributes,\n CountryName,\n SelectionType,\n ArmyName,\n Country,\n GeneralDefinition\n} from 'types'\nimport {\n clearCountryAttributes,\n setCountryAttribute,\n enableCountrySelections,\n enableCountrySelection,\n clearCountrySelections,\n clearCountrySelection,\n setGeneralAttribute,\n selectGovernment,\n setHasGeneral,\n clearGeneralAttributes,\n clearGeneralSelection,\n enableGeneralSelection,\n clearGeneralSelections,\n toggleFilterNonCombat\n} from 'reducers'\n\nimport AccordionToggle from 'containers/AccordionToggle'\nimport CountryManager from 'containers/CountryManager'\nimport SimpleDropdown from 'components/Dropdowns/SimpleDropdown'\nimport StyledNumber from 'components/Utils/StyledNumber'\nimport TableAttributes from 'components/TableAttributes'\nimport CountryValueInput from 'containers/CountryValueInput'\nimport ListModifier from 'components/Utils/ListModifier'\nimport DropdownListDefinition from 'components/Dropdowns/DropdownListDefinition'\nimport {\n traditionsIR,\n traitsIR,\n tradesIR,\n deitiesIR,\n lawsIR,\n ideasIR,\n effectsIR,\n heritagesIR,\n religionsIR,\n factionsIR,\n abilitiesIR,\n policiesIR,\n inventionsIR,\n distinctionsIR\n} from 'data'\nimport { TableModifierList } from 'components/TableModifierList'\nimport { groupBy, maxBy, noop } from 'lodash'\nimport { Tech } from 'types/generated'\nimport { getSelections } from 'managers/modifiers'\nimport { getCombatSettings, getCountry, getCountryDefinition, getSelectedArmy, getSelectedCountry } from 'selectors'\n\nconst PERCENT_PADDING = '\\u00a0\\u00a0\\u00a0\\u00a0'\n\nconst CELL_PADDING = '.78571429em .78571429em'\n\ntype DataEntriesByParentProps = {\n selections: ObjSet\n type: SelectionType\n entries: Record\n onClick: (enabled: boolean) => (type: SelectionType, key: string) => void\n disabled: boolean\n padding?: string\n}\n\ntype RenderCellProps = {\n type: SelectionType\n entryKey: string\n name: string | null\n enabled: boolean\n modifiers: Modifier[]\n onClick: (enabled: boolean) => (type: SelectionType, key: string) => void\n padding?: string\n disabled?: boolean\n width?: number\n}\n\nconst RenderCell = ({\n type,\n entryKey,\n name,\n enabled,\n modifiers,\n onClick,\n padding,\n disabled,\n width\n}: RenderCellProps) => (\n onClick(enabled)(type, entryKey)}\n style={{ padding: CELL_PADDING }}\n >\n \n \n)\n\nconst DataEntriesByParent = ({ selections, type, entries, onClick, disabled, padding }: DataEntriesByParentProps) => {\n const columns = maxBy(Object.values(values), item => item.length)?.length ?? 0\n return (\n \n \n {Object.values(entries).map((items, index) => (\n \n {items.map(item => {\n const key = item.key\n return (\n \n )\n })}\n {mapRange(columns - items.length, value => (\n \n ))}\n \n ))}\n \n
\n )\n}\n\ntype DataEntryDropdownProps = {\n selections: ObjSet\n type: SelectionType\n entries: DataEntry[]\n onClick: (enabled: boolean) => (type: SelectionType, key: string) => void\n}\n\nconst DataEntryDropdown = ({ selections, entries, onClick, type }: DataEntryDropdownProps) => {\n const value = selections && keys(selections).length ? keys(selections)[0] : ''\n return (\n onClick(false)(type, key)} type={type} />\n )\n}\n\nclass CountriesIR extends Component {\n render() {\n const {\n settings,\n generalDefinition,\n general,\n filterNonCombat,\n countryDefinition,\n country,\n selectedArmy\n } = this.props\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {this.renderLaws(filterNonCombat)}\n {this.renderPolicies(filterNonCombat)}\n {this.renderIdeas(filterNonCombat)}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n }\n\n renderDropdown = (type: SelectionType, items: DataEntry[]) => {\n const selections = this.props.country.selections[type] ?? this.props.general.selections[type]\n const value = selections && keys(selections).length ? keys(selections)[0] : ''\n return (\n this.enableCountrySelection(type, key)}\n type={type}\n />\n )\n }\n\n renderLaws = (filter: boolean) => this.renderByParentForCountries(SelectionType.Law, lawsIR.byParent(filter))\n\n renderIdeas = (filter: boolean) => this.renderByParentForCountries(SelectionType.Idea, ideasIR.byParent(filter))\n\n renderPolicies = (filter: boolean) =>\n this.renderByParentForCountries(SelectionType.Policy, policiesIR.byParent(filter))\n\n renderByParentForCountries = (type: SelectionType, values: Record) =>\n this.renderByParent(type, values, this.onCountryItemClick, false, PERCENT_PADDING)\n\n renderByParent = (\n type: SelectionType,\n values: Record,\n onClick: (enabled: boolean) => (type: SelectionType, key: string) => void,\n disabled: boolean,\n padding?: string\n ) => {\n const selections = this.props.country.selections[type] ?? this.props.general.selections[type]\n const columns = maxBy(Object.values(values), item => item.length)?.length ?? 0\n return (\n \n \n {Object.values(values).map((option, index) => (\n \n {option.map(item => {\n const key = item.key\n return this.renderCell2(\n type,\n key,\n item.name,\n selections && selections[key],\n item.modifiers,\n onClick,\n padding,\n disabled\n )\n })}\n {mapRange(columns - option.length, value => (\n \n ))}\n \n ))}\n \n
\n )\n }\n\n clearGeneralSelection = (type: SelectionType, key: string) => {\n const { clearGeneralSelection } = this.props\n this.execArmy(clearGeneralSelection, type, key)\n }\n\n clearCountrySelection = (type: SelectionType, key: string) => {\n const { clearCountrySelection } = this.props\n this.execCountry(clearCountrySelection, type, key)\n }\n\n enableCountrySelection = (type: SelectionType, key: string) => {\n const { enableCountrySelection, clearCountrySelections } = this.props\n if (type === SelectionType.Heritage || type === SelectionType.Religion || type === SelectionType.Faction)\n this.execCountry(clearCountrySelections, type)\n if (type === SelectionType.Policy) {\n const keys = policiesIR.siblingKeys(key)\n if (keys) this.execCountry(clearCountrySelections, type, keys)\n }\n this.execCountry(enableCountrySelection, type, key)\n }\n\n onCountryItemClick = (enabled: boolean) => (enabled ? this.clearCountrySelection : this.enableCountrySelection)\n\n renderCell2 = (\n type: SelectionType,\n key: string,\n name: string | null,\n enabled: boolean,\n modifiers: Modifier[],\n onClick: (enabled: boolean) => (type: SelectionType, key: string) => void,\n padding?: string,\n disabled?: boolean,\n width?: number\n ) => (\n onClick(enabled)(type, key)}\n style={{ padding: CELL_PADDING }}\n >\n \n \n )\n\n renderCell = (\n key: string,\n name: string | null,\n enabled: boolean,\n modifiers: Modifier[],\n enable?: () => void,\n clear?: () => void,\n padding?: string,\n disabled?: boolean,\n width?: number\n ) => (\n \n \n \n )\n\n /** Executes a given function with currently selected country. */\n execCountry = (func: (country: CountryName, value: T1, ...rest: T2[]) => void, value: T1, ...rest: T2[]) =>\n func(this.props.country.name, value, ...rest)\n execArmy = (\n func: (country: CountryName, army: ArmyName, value: T1, ...rest: T2[]) => void,\n value: T1,\n ...rest: T2[]\n ) => func(this.props.country.name, this.props.selectedArmy, value, ...rest)\n\n /**\n * Clears all selections.\n */\n clearAll = () => {\n this.execCountry(this.props.clearCountrySelections, undefined)\n this.execCountry(this.props.clearCountryAttributes, undefined)\n this.execArmy(this.props.clearGeneralSelections, undefined)\n this.execArmy(this.props.clearGeneralAttributes, undefined)\n this.execArmy(this.props.setHasGeneral, true)\n }\n\n setCountryValue = (_: string, attribute: CountryAttribute, value: number) =>\n this.execCountry(this.props.setCountryAttribute, attribute, value)\n\n setGeneralValue = (_: string, attribute: GeneralValueType, value: number) =>\n this.execArmy(this.props.setGeneralAttribute, attribute, value)\n}\n\nconst mapStateToProps = (state: AppState) => {\n const selectedArmy = getSelectedArmy(state)\n const selectedCountry = getSelectedCountry(state)\n return {\n countryDefinition: getCountryDefinition(state, selectedCountry),\n country: getCountry(state, selectedCountry),\n filterNonCombat: state.ui.filterNonCombat,\n selectedArmy,\n generalDefinition: getGeneralDefinition(state, selectedCountry, selectedArmy),\n general: getGeneral(state, selectedCountry, selectedArmy),\n settings: getCombatSettings(state)\n }\n}\n\nconst actions = {\n clearGeneralSelections,\n setGeneralAttribute,\n setCountryAttribute,\n clearGeneralSelection,\n clearCountryAttributes,\n clearGeneralAttributes,\n selectGovernment,\n setHasGeneral,\n enableCountrySelection,\n clearCountrySelection,\n enableCountrySelections,\n clearCountrySelections,\n toggleFilterNonCombat\n}\n\ntype S = ReturnType\ntype D = typeof actions\ntype IProps = S & D\n\nconst getTechAttribute = (key: string) => {\n if (key.toLowerCase().includes('relig')) return CountryAttribute.ReligiousTech\n if (key.toLowerCase().includes('orato')) return CountryAttribute.OratoryTech\n if (key.toLowerCase().includes('civic')) return CountryAttribute.CivicTech\n return CountryAttribute.MartialTech\n}\n\nconst useCountrySelection = (countryName: CountryName) => {\n const dispatch = useDispatch()\n\n const clear = (type: SelectionType, key: string) => dispatch(clearCountrySelection(countryName, type, key))\n const enable = (type: SelectionType, key: string) => {\n if (type === SelectionType.Heritage || type === SelectionType.Religion || type === SelectionType.Faction)\n dispatch(clearCountrySelections(countryName, type))\n if (type === SelectionType.Policy) {\n const keys = policiesIR.siblingKeys(key)\n if (keys) dispatch(clearCountrySelections(countryName, type, keys))\n }\n dispatch(enableCountrySelection(countryName, type, key))\n }\n\n return (enabled: boolean) => (enabled ? clear : enable)\n}\n\nconst useGeneralSelection = (countryName: CountryName, armyName: ArmyName) => {\n const dispatch = useDispatch()\n\n const clear = (type: SelectionType, key: string) => dispatch(clearGeneralSelection(countryName, armyName, type, key))\n const enable = (type: SelectionType, key: string) => {\n if (type === SelectionType.Ability) {\n const keys = abilitiesIR.siblingKeys(key)\n if (keys) dispatch(clearGeneralSelections(countryName, armyName, type, keys))\n }\n dispatch(enableGeneralSelection(countryName, armyName, type, key))\n }\n\n return (enabled: boolean) => (enabled ? clear : enable)\n}\n\ntype CountruSelectionGroupProps = {\n country: Country\n parent: string\n filterNonCombat: boolean\n}\n\ntype RenderInventionsProps = {\n country: Country\n tech: string\n attribute: CountryAttribute\n filterNonCombat: boolean\n}\n\nconst RenderInventions = ({ country, tech, attribute, filterNonCombat }: RenderInventionsProps) => {\n const handleOnClick = useCountrySelection(country.name)\n return (\n <>\n
\n {attribute}: \n
\n\n \n \n )\n}\n\ntype CountrySelectionProps = { country: Country; filterNonCombat: boolean }\n\nconst RenderTechSection = ({ country, filterNonCombat }: CountrySelectionProps) => {\n const panes = toArr(inventionsIR.byParent(), (_, key: string) => ({\n menuItem: key,\n render: () => (\n \n )\n })).sort((a, b) =>\n a.menuItem === Tech.Martial ? -1 : b.menuItem === Tech.Martial ? 1 : a.menuItem.localeCompare(b.menuItem)\n )\n\n return (\n \n \n \n \n \n \n \n )\n}\n\ntype GeneralSelectionProps = {\n country: Country\n armyName: ArmyName\n general: GeneralDefinition\n filterNonCombat: boolean\n}\n\ntype GeneralSelectionGroupProps = GeneralSelectionProps & {\n parent: string\n}\n\nconst RenderTraitGroup = ({ country, armyName, general, parent, filterNonCombat }: GeneralSelectionGroupProps) => {\n const handleOnClick = useGeneralSelection(country.name, armyName)\n return (\n \n )\n}\n\ntype RenderGeneralProps = {\n country: Country\n armyName: ArmyName\n general: GeneralDefinition\n filterNonCombat: boolean\n}\n\nconst RenderGeneralSection = ({ country, armyName, general, filterNonCombat }: RenderGeneralProps) => {\n const panes = toArr(traitsIR.byParent(), (_, key: string) => ({\n menuItem: key,\n render: () => (\n \n )\n }))\n\n const dispatch = useDispatch()\n const handleToggleGeneral = () => {\n dispatch(setHasGeneral(country.name, armyName, !general.enabled))\n }\n const handleChange = (value: string) => {\n dispatch(setGeneralAttribute(country.name, armyName, CharacterAttribute.Martial, Number(value)))\n }\n\n return (\n \n \n \n \n Base martial:{' '}\n handleChange(value)}\n />{' '}\n with from\n traits\n \n \n \n \n \n \n )\n}\n\nconst getTopTraditionTree = (country: Country) => {\n const traditions = getSelections(country.selections, SelectionType.Tradition)\n const counts = groupBy(traditions.map(traditionsIR.get), item => item.parent)\n const countArray = toArr(counts, (value, key) => ({ key, value }))\n const max = maxBy(countArray, item => item.value)\n return max?.key ?? Object.keys(traditionsIR.byParent())[0]\n}\n\nconst RenderTraditionSection = ({ country, filterNonCombat }: CountrySelectionProps) => {\n const [selectedTradition, selectTradition] = useState(getTopTraditionTree(country))\n const handleOnClick = useCountrySelection(country.name)\n useEffect(() => {\n selectTradition(getTopTraditionTree(country))\n }, [country])\n return (\n \n \n \n \n \n \n ({ value: name, text: name }))}\n value={selectedTradition}\n style={{ width: 200 }}\n onChange={selectTradition}\n />\n \n \n
\n Military experience:{' '}\n \n
\n
\n
\n
\n \n
\n
\n
\n )\n}\n\nconst RenderAbilities = ({ country, armyName, general, filterNonCombat }: GeneralSelectionProps) => {\n const handleClick = useGeneralSelection(country.name, armyName)\n return (\n \n )\n}\n\nconst RenderDistinctions = ({ country, armyName, general, filterNonCombat }: GeneralSelectionProps) => {\n const handleClick = useGeneralSelection(country.name, armyName)\n return (\n \n )\n}\n\nconst RenderTrades = ({ country, filterNonCombat }: CountrySelectionProps) => {\n const handleClick = useCountrySelection(country.name)\n return (\n \n )\n}\nconst RenderHeritages = ({ country, filterNonCombat }: CountrySelectionProps) => {\n const handleClick = useCountrySelection(country.name)\n return (\n \n )\n}\n\nconst RenderFactions = ({ country, filterNonCombat }: CountrySelectionProps) => {\n const handleClick = useCountrySelection(country.name)\n return (\n \n )\n}\n\nconst RenderReligions = ({ country, filterNonCombat }: CountrySelectionProps) => {\n const handleClick = useCountrySelection(country.name)\n return (\n \n )\n}\nconst RenderTradeSection = ({ country, filterNonCombat }: CountrySelectionProps) => {\n return (\n \n \n \n \n \n \n \n )\n}\n\nconst RenderDeityGroup = ({ country, filterNonCombat, parent }: CountruSelectionGroupProps) => {\n const deities = deitiesIR.byParent(filterNonCombat)[parent]\n const rows = Math.ceil(deities.length / 4)\n const power = country[CountryAttribute.OmenPower]\n const selections = country.selections[SelectionType.Deity]\n const handleClick = useCountrySelection(country.name)\n return (\n \n \n {mapRange(rows, number => number).map(row => (\n \n {mapRange(4, number => number).map(column => {\n const index = row * 4 + column\n const entity = deities[index]\n if (!entity) return \n const key = entity.key\n const modifiers = entity.isOmen\n ? entity.modifiers.map(modifier => ({ ...modifier, value: (modifier.value * power) / 100 }))\n : entity.modifiers\n return (\n \n )\n })}\n \n ))}\n \n
\n )\n}\n\nconst RenderDeities = ({ country, filterNonCombat }: CountrySelectionProps) => {\n const panes = toArr(deitiesIR.byParent(), (_, key: string) => ({\n menuItem: key,\n render: () => \n }))\n return \n}\n\nconst RenderReligionSection = ({ country, filterNonCombat }: CountrySelectionProps) => {\n return (\n \n \n \n \n
\n
\n Omen power: \n \n Religional unity: 0 - 100\n Tech level: 0 - 50\n Inventions: 0 - 30\n Office: 0 - 30\n Mandated Observance: 20\n Latin tradition: 15\n Exporting Incense: 10\n Laws: -15 / 15\n Ruler: -15 / 7.5)\n Heritage: 0 / 5)\n \n Total from -30 to 300\n \n \n \n
\n
\n
\n )\n}\n\nexport default connect(mapStateToProps, actions)(CountriesIR)\n","import { toObj, keys } from 'utils'\nimport { uniq } from 'lodash'\n\nimport stringTokens from 'data/json/ir/binary.json'\nimport JSZip from 'jszip'\n\nenum DataType {\n Integer = 'Integer',\n Float = 'Float',\n Boolean = 'Boolean',\n String = 'String',\n UnsignedInteger = 'UnsignedInteger',\n BigFloat = 'BigFloat',\n BigInteger = 'BigInteger',\n BigUnsignedInteger = 'BigUnsignedInteger'\n}\n\nenum ControlType {\n Separator = '=',\n SectionStart = '{',\n SectionEnd = '}',\n None = ''\n}\n\nlet i = 0\nlet data: Uint8Array = new Uint8Array()\nlet errors: string[] | null = null\n\nconst parseToken = (token: string) => {\n const isNumber = !Number.isNaN(Number(token))\n if (isNumber) return Number(token)\n if (token.startsWith('\"')) return token.substr(1, token.length - 2)\n return token\n}\n\nconst parseValue = (tokens: string[]) => {\n for (i = i + 1; i < tokens.length; i++) {\n const token = tokens[i]\n if (token === '{') {\n return parseObject(tokens)\n }\n if (token === 'hsv') {\n parseObject(tokens)\n }\n return parseToken(token)\n }\n return null\n}\n\nconst parseObject = (tokens: string[]) => {\n const result = {} as Record\n // Object syntax is also used for arrays. Fill both and decide at end which works better.\n const resultArray = [] as unknown[]\n let previous = ''\n for (i = i + 1; i < tokens.length; i++) {\n const token = tokens[i]\n if (token === '{') {\n resultArray.push(parseObject(tokens))\n } else if (token === ControlType.Separator) {\n const value = parseValue(tokens)\n if (result[previous]) {\n if (!Array.isArray(result[previous])) result[previous] = [result[previous]]\n const prev = result[previous]\n if (Array.isArray(prev)) prev.push(value)\n } else {\n result[previous] = value\n }\n } else if (token === '}') {\n break\n } else {\n resultArray.push(parseToken(token))\n }\n previous = token\n }\n return Object.keys(result).length ? result : resultArray\n}\n\nexport const parseFile = (data: string) => {\n /* eslint-disable-next-line */\n const withoutComments = data.replace(/\\h*#.*\\r?(?:\\n|$)/g, '')\n const forceTokenizeEqualCharacter = withoutComments.replace(/=/g, ' = ')\n const tokens = forceTokenizeEqualCharacter.split(/[\\n\\r\\s]+/)\n i = -1\n return parseObject(tokens) as Record\n}\n\nexport const loadFile = async (file: File): Promise<[string, string[]]> => {\n try {\n const zipped = await new JSZip().loadAsync(file)\n const extracted = zipped.file('gamestate')\n if (!extracted) return ['', ['File is not a save file.']]\n const buffer = await extracted.async('uint8array')\n return binaryToPlain(buffer, true)\n } catch (e) {\n return [await file.text(), []]\n }\n}\n\nconst formatTokens = {\n '0000': ControlType.None,\n '0100': ControlType.Separator,\n '0300': ControlType.SectionStart,\n '0400': ControlType.SectionEnd,\n '0C00': DataType.Integer,\n '0D00': DataType.Float,\n '0E00': DataType.Boolean,\n '0F00': DataType.String,\n '1400': DataType.UnsignedInteger,\n '1700': DataType.String,\n '6701': DataType.BigFloat,\n '9001': DataType.BigFloat,\n '9C02': DataType.BigInteger\n}\n\nconst tokens = {\n ...toObj(\n keys(formatTokens),\n key => String(parseInt(key, 16)),\n key => formatTokens[key]\n ),\n ...toObj(\n keys(stringTokens),\n key => String(parseInt(key, 16)),\n key => stringTokens[key]\n )\n}\n\nexport const binaryToPlain = (buffer: Uint8Array, getErrors: boolean): [string, string[]] => {\n i = 0\n data = buffer\n errors = getErrors ? [] : null\n const result = parseBinaryText(data)\n return [result.join(''), errors ? uniq(errors) : []]\n}\n\nconst getBinaryToken = () => {\n const code = data[i++] * 256 + data[i++]\n if (tokens[code]) return tokens[code]\n errors?.push('Token ' + code.toString(16).toUpperCase() + ' not recognized.')\n return 'x_' + code.toString(16).toUpperCase()\n}\n\n/** Looks up the next token. If it's separator then previous token is a key. */\nconst isKeyValuePair = () => tokens[data[i] * 256 + data[i + 1]] === ControlType.Separator\n\nconst getBinaryBoolean = () => (data[i++] ? 'yes' : 'no')\n// Bitwise can't be used because of only 32 bytes.\nconst getBinaryLength = () => data[i++] + data[i++] * 256\nconst getBinaryUnsigned = () => {\n const value = getHex(i + 3) + getHex(i + 2) + getHex(i + 1) + getHex(i)\n i += 4\n return hexToUnsigned(value)\n}\nconst getBinarySigned = () => {\n const value = getHex(i + 3) + getHex(i + 2) + getHex(i + 1) + getHex(i)\n i += 4\n return hexToSigned(value)\n}\nconst getBinaryBigUnsigned = () => {\n const value =\n getHex(i + 7) +\n getHex(i + 6) +\n getHex(i + 5) +\n getHex(i + 4) +\n getHex(i + 3) +\n getHex(i + 2) +\n getHex(i + 1) +\n getHex(i)\n i += 8\n return hexToUnsigned(value)\n}\nconst getBinaryBigSigned = () => {\n const value =\n getHex(i + 7) +\n getHex(i + 6) +\n getHex(i + 5) +\n getHex(i + 4) +\n getHex(i + 3) +\n getHex(i + 2) +\n getHex(i + 1) +\n getHex(i)\n i += 8\n return hexToSigned(value)\n}\n\nconst getBinaryFloat = () => {\n const v = new DataView(new ArrayBuffer(4))\n v.setUint32(0, Number(getBinaryUnsigned()))\n return v.getFloat32(0)\n}\n\nconst getHex = (index: number) => data[index].toString(16).padStart(2, '0')\n\nconst getBinaryString = (length: number) => {\n let string = ''\n for (let j = 0; j < length; j++) string += String.fromCharCode(data[i + j])\n i += length\n return string\n}\n\nconst parseBinaryValue = (type: string): string => {\n if (type === DataType.UnsignedInteger) {\n return getBinaryUnsigned().toString()\n }\n if (type === DataType.Integer) {\n return getBinarySigned().toString()\n }\n if (type === DataType.String) {\n const length = getBinaryLength()\n return getBinaryString(length)\n }\n if (type === DataType.Float) {\n return String(+getBinaryFloat().toFixed(5))\n }\n if (type === DataType.BigInteger) {\n return getBinaryBigSigned().toString()\n }\n if (type === DataType.BigUnsignedInteger) {\n return getBinaryBigUnsigned().toString()\n }\n if (type === DataType.BigFloat) {\n return (Number(getBinaryBigSigned()) / 100000.0).toString()\n }\n if (type === DataType.Boolean) {\n return getBinaryBoolean()\n }\n return type\n}\n\n// Date is not its own data format so the keys must be hard coded.\nconst dates = new Set([\n 'date',\n 'death_date',\n 'start_date',\n 'last_trade_route_creation_date',\n 'arrived_here_date',\n 'stall_date',\n 'ignored',\n 'leader_date',\n 'budget_dates',\n 'last_employed_date',\n 'last_owner_change',\n 'last_controller_change',\n 'looted',\n 'plundered',\n 'deity_elevated',\n 'last_war',\n 'last_peace',\n 'last_battle_won',\n 'omen_start',\n 'omen_duration',\n 'idle',\n 'birth_date',\n 'last_send_diplomat',\n 'move_pop_command',\n 'building_construction',\n 'disband_army',\n 'spouse_death_date',\n 'last_victory',\n 'next_year_update',\n 'next_quarter_update',\n 'last_enslavement',\n 'fixed_date',\n 'regret',\n 'end_date',\n 'gather_date',\n 'last_command_date',\n 'deadline'\n])\n\nconst isDate = (key: string, parentKey: string, token: string, value: string) => {\n if (key && token === DataType.Integer) {\n if (dates.has(key)) return true\n if (parentKey === 'breaking_alliances') return true\n // HACK: Dates are always a big number and other uses of 'action' seem to use low numbers.\n if (key === 'action' && Number(value) > 100000) return true\n }\n return false\n}\n\nconst parseBinaryText = (data: Uint8Array) => {\n const tokens = [''] as unknown[]\n let pad = ''\n let key = ''\n let parentKey = ''\n let previous: string | number = ''\n let inArray = false\n while (i < data.length) {\n let token: string | number = getBinaryToken()\n if (key === 'identity' && token === DataType.BigInteger) token = DataType.BigUnsignedInteger\n if (token === ControlType.Separator) {\n tokens.push(token)\n } else if (token in DataType) {\n const value = parseBinaryValue(String(token))\n if (token === DataType.String && !isKeyValuePair()) token = '\"' + value + '\"'\n else if (isDate(key, parentKey, token, value)) token = decodateDate(Number(value))\n else token = value\n\n if (isKeyValuePair()) {\n key = String(token)\n tokens.push('\\n')\n if (pad) tokens.push(pad)\n } else if (previous !== ControlType.Separator) {\n inArray = true\n tokens.push(' ')\n }\n\n tokens.push(token)\n } else if (token === ControlType.SectionStart || token === ControlType.SectionEnd) {\n if (token === ControlType.SectionEnd) {\n parentKey = ''\n key = ''\n if (tokens[tokens.length - 1] !== '\\n' && !inArray) tokens.push('\\n')\n pad = pad.substr(1)\n if (pad && !inArray) tokens.push(pad)\n if (inArray) tokens.push(' ')\n inArray = false\n }\n if (token === ControlType.SectionStart && tokens[tokens.length - 1] !== ControlType.Separator) tokens.push(' ')\n tokens.push(token)\n if (token === ControlType.SectionStart) {\n pad += '\\t'\n parentKey = key\n }\n } else {\n if (isKeyValuePair()) {\n key = token\n tokens.push('\\n')\n if (pad) tokens.push(pad)\n } else if (previous !== ControlType.Separator) {\n inArray = true\n tokens.push(' ')\n }\n\n tokens.push(token)\n }\n previous = token\n }\n return tokens\n}\n\n/** Transforms a numeric date to a string representation. */\nconst decodateDate = (input: number) => {\n const months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n\n // let hour = input % 24\n const year = Math.floor(-5000 + input / 24 / 365)\n let day = Math.floor(1 + ((input / 24) % 365))\n let month = 1\n\n for (let i = 0; i < months.length; i++) {\n if (day > months[i]) {\n day -= months[i]\n month++\n } else {\n break\n }\n }\n return year + '.' + month + '.' + day\n}\n\nconst hexToSigned = (hex: string) => {\n if (hex.length % 2) hex = '0' + hex\n\n const highbyte = parseInt(hex.slice(0, 2), 16)\n let bn = BigInt('0x' + hex)\n\n if (0x80 & highbyte) {\n bn =\n BigInt(\n '0b' +\n bn\n .toString(2)\n .split('')\n .map(i => ('0' === i ? 1 : 0))\n .join('')\n ) + BigInt(1)\n bn = -bn\n }\n\n return bn\n}\n\nconst hexToUnsigned = (hex: string) => {\n if (hex.length % 2) hex = '0' + hex\n\n return BigInt('0x' + hex)\n}\n","import React, { Component } from 'react'\nimport { Container, Grid, Table, Checkbox, Button } from 'semantic-ui-react'\nimport { connect } from 'react-redux'\nimport { AppState, getGeneralDefinition } from 'state'\nimport { mapRange, values } from '../utils'\n\nimport {\n CountryAttribute,\n CharacterAttribute,\n CombatPhase,\n GeneralValueType,\n filterAttributes,\n CountryName,\n ArmyName,\n SelectionType,\n DataEntryEU4\n} from 'types'\nimport {\n clearGeneralSelections,\n clearCountrySelections,\n clearCountryAttributes,\n clearGeneralAttributes,\n setCountryAttribute,\n enableCountrySelection,\n clearCountrySelection,\n setGeneralAttribute,\n selectCulture,\n selectGovernment,\n setHasGeneral\n} from 'reducers'\n\nimport AccordionToggle from 'containers/AccordionToggle'\nimport CountryManager from 'containers/CountryManager'\nimport SimpleDropdown from 'components/Dropdowns/SimpleDropdown'\nimport TableAttributes from 'components/TableAttributes'\nimport { getCultures, policiesEU4, techEU4 } from 'data'\nimport CountryValueInput from 'containers/CountryValueInput'\nimport ListModifier from 'components/Utils/ListModifier'\nimport { TableModifierList } from 'components/TableModifierList'\nimport { getCombatSettings, getCountry, getCountryDefinition, getSelectedArmy, getSelectedCountry } from 'selectors'\n\nconst TECH_COLUMNS = 4\nconst CUSTOM_KEY = 'Base'\n\nconst CELL_PADDING = '.78571429em .78571429em'\n\nclass CountriesEU4 extends Component {\n render() {\n const { settings, general, country, selectedCountry, countryDefinition, setHasGeneral } = this.props\n return (\n \n \n \n \n \n \n \n item} />\n \n \n \n \n \n this.execArmy(setHasGeneral, false)\n : () => this.execArmy(setHasGeneral, true)\n }\n style={{ float: 'right' }}\n />\n \n \n \n \n \n \n Tech level: \n {this.renderTech(techEU4, country[CountryAttribute.MartialTech])}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n }\n\n renderTech = (tech: DataEntryEU4[], techLevel: number) => {\n const rows = Math.ceil(tech.length / TECH_COLUMNS)\n return (\n \n \n {mapRange(rows, number => number).map(row => (\n \n {mapRange(TECH_COLUMNS, number => number).map(column => {\n const index = row * TECH_COLUMNS + column\n const level = tech[index]\n const key = 'Tech' + index\n if (!level) return \n const enabled = index <= techLevel\n return (\n this.clearTech(index) : () => this.enableTech(index)}\n style={{ padding: CELL_PADDING }}\n >\n \n \n )\n })}\n \n ))}\n \n
\n )\n }\n\n /** Executes a given function with currently selected country. */\n execCountry = (func: (country: CountryName, value: T1, ...rest: T2[]) => void, value: T1, ...rest: T2[]) =>\n func(this.props.selectedCountry, value, ...rest)\n execArmy = (\n func: (country: CountryName, army: ArmyName, value: T1, ...rest: T2[]) => void,\n value: T1,\n ...rest: T2[]\n ) => func(this.props.selectedCountry, this.props.selectedArmy, value, ...rest)\n\n /**\n * Clears tech above a given tech level.\n */\n clearTech = (level: number) => {\n level = level || 1\n this.execCountry(this.props.setCountryAttribute, CountryAttribute.MartialTech, level - 1)\n }\n\n /**\n * Enables tech levels to a given level.\n */\n enableTech = (level: number) => {\n this.execCountry(this.props.setCountryAttribute, CountryAttribute.MartialTech, level)\n }\n\n onCountryItemClick = (enabled: boolean) => (enabled ? this.clearCountrySelection : this.enableCountrySelection)\n\n enableCountrySelection = (type: SelectionType, key: string) => {\n const { enableCountrySelection } = this.props\n this.execCountry(enableCountrySelection, type, key)\n }\n\n clearCountrySelection = (type: SelectionType, key: string) => {\n const { clearCountrySelection } = this.props\n this.execCountry(clearCountrySelection, type, key)\n }\n\n /**\n * Clears all selections.\n */\n clearAll = () => {\n this.execCountry(this.props.clearCountrySelections, undefined)\n this.execCountry(this.props.clearCountryAttributes, undefined)\n this.execArmy(this.props.clearGeneralSelections, undefined)\n this.execArmy(this.props.clearGeneralAttributes, undefined)\n this.execArmy(this.props.setHasGeneral, true)\n }\n\n setCountryValue = (_: string, attribute: CountryAttribute, value: number) =>\n this.execCountry(this.props.setCountryAttribute, attribute, value)\n\n setGeneralValue = (_: string, attribute: GeneralValueType, value: number) =>\n this.execArmy(this.props.setGeneralAttribute, attribute, value)\n}\n\nconst mapStateToProps = (state: AppState) => {\n const selectedArmy = getSelectedArmy(state)\n const selectedCountry = getSelectedCountry(state)\n return {\n countryDefinition: getCountryDefinition(state, selectedCountry),\n country: getCountry(state, selectedCountry),\n selectedCountry,\n selectedArmy,\n general: getGeneralDefinition(state, selectedCountry, selectedArmy),\n settings: getCombatSettings(state)\n }\n}\n\nconst actions = {\n setGeneralAttribute,\n selectCulture,\n setCountryAttribute,\n clearCountryAttributes,\n clearGeneralAttributes,\n clearGeneralSelections,\n selectGovernment,\n setHasGeneral,\n enableCountrySelection,\n clearCountrySelection,\n clearCountrySelections\n}\n\ntype S = ReturnType\ntype D = typeof actions\ntype IProps = S & D\n\nexport default connect(mapStateToProps, actions)(CountriesEU4)\n","import React, { Component } from 'react'\nimport { Grid, TextArea, Checkbox, List, Header, Button } from 'semantic-ui-react'\nimport { connect } from 'react-redux'\nimport {\n AppState,\n resetMissing,\n restoreDefaultTactics,\n restoreDefaultTerrains,\n restoreDefaultUnits,\n restoreDefaultSettings\n} from 'state'\nimport { values, keys } from 'utils'\nimport { ExportKey } from 'types'\nimport { exportState, saveToFile } from 'managers/transfer'\nimport { setExportKey, setResetMissing, importState } from 'reducers'\nimport { FileInput } from 'components/Utils/Inputs'\n\ninterface IState {\n data: string\n}\n\nclass Transfer extends Component {\n constructor(props: IProps) {\n super(props)\n this.state = { data: '' }\n }\n\n lastData = ''\n\n readonly attributes = values(ExportKey)\n\n render() {\n const json = exportState(this.props.state, this.props.exportKeys)\n if (this.lastData !== json) {\n // Hack to make data editable manually or when exported settings change.\n // This could probably be moved to trigger when export keys change?\n this.lastData = json\n this.setState({ data: json })\n }\n return (\n \n \n \n
Export
\n \n 1. Select which parts to export (resets any manual changes)\n {this.attributes.map(value => this.renderCheckbox(value))}\n \n 2a.{' '}\n \n \n 2b. Copy paste the data from the text box\n \n
Import
\n \n \n 1a. \n \n 1b. Copy paste the data to the text box\n 2. Select how to handle missing data\n \n this.props.setResetMissing(!this.props.resetMissing)}\n />\n \n 3. Push the button\n \n \n \n \n
Reset
\n \n Reset all data (battle, countries, units, tactics, terrains, settings)\n \n \n \n \n
\n \n this.setState({ data: String(data.value) })}\n />\n \n
\n
\n )\n }\n\n renderCheckbox = (key: ExportKey): JSX.Element => {\n return (\n \n this.props.setExportKey(key, !this.props.exportKeys[key])}\n />\n \n )\n }\n\n loadContent = (file: File) => {\n file.text().then((data: string) => this.setState({ data }))\n }\n}\n\nconst mapStateToProps = (state: AppState) => ({\n state: state,\n exportKeys: state.transfer.exportKeys,\n resetMissing: state.transfer.resetMissing\n})\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst mapDispatchToProps = (dispatch: any) => ({\n setExportKey: (key: ExportKey, value: boolean) => dispatch(setExportKey(key, value)),\n setResetMissing: (value: boolean) => dispatch(setResetMissing(value)),\n importState: (data: string, doResetMissing: boolean) => {\n try {\n if (!data) data = '{}'\n const json = JSON.parse(data)\n json.transfer = undefined\n json.ui = undefined\n json.tactics = json.tactics && restoreDefaultTactics(json.tactics)\n json.terrains = json.terrains && restoreDefaultTerrains(json.terrains)\n json.units = json.units && restoreDefaultUnits(json.units)\n json.units = json.settings && restoreDefaultSettings(json.settings)\n if (doResetMissing) resetMissing(json)\n keys(json)\n .filter(key => !json[key])\n .forEach(key => delete json[key])\n dispatch(importState(json, doResetMissing))\n } catch (err) {\n console.error(err)\n }\n }\n})\n\ninterface IProps extends ReturnType, ReturnType {}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Transfer)\n","import React, { Component } from 'react'\nimport { Table, Grid, Checkbox, Header, Input } from 'semantic-ui-react'\n\nimport { Setting, parameterToDescription, SimulationSpeed, DisciplineValue } from 'types'\nimport { toArr, values } from 'utils'\nimport SimpleDropdown from './Dropdowns/SimpleDropdown'\nimport { getDefaultLandSettings, getDefaultSharedSettings } from 'data'\n\ntype Values = string | number | boolean\n\ntype IProps = {\n settings: { [key in T]: Values }\n onChange: (key: T, str: Values) => void\n}\n\nconst defaultSettings = { ...getDefaultLandSettings(), ...getDefaultSharedSettings() }\n\n/** Component for showing and changing settings. */\nexport default class GridSettings extends Component> {\n headers = ['Attribute', 'Value', 'Custom value', 'Explained']\n\n render() {\n const { settings, onChange } = this.props\n return (\n \n \n {toArr(settings, (value, key) => {\n return (\n \n \n \n \n \n {this.renderSetting(key, value, onChange)}\n \n \n
{key}
\n {parameterToDescription(key, value)}\n
\n
\n
\n
\n
\n )\n })}\n {toArr(settings).length % 2 ? : null}\n
\n
\n )\n }\n renderSetting = (key: T, value: Values, onChange: (key: T, str: Values) => void) => {\n if (typeof value === 'number') {\n return (\n this.onInputChange(key, value, onChange)}\n />\n )\n }\n if (typeof value === 'boolean') {\n return onChange(key, !!checked)} />\n }\n if (key === Setting.Performance) {\n return (\n onChange(key, value)}\n />\n )\n }\n if (key === Setting.AttributeDiscipline) {\n return (\n onChange(key, value)}\n />\n )\n }\n return null\n }\n\n onInputChange = (key: T, str: string, onChange: (key: T, value: number) => void) => {\n const value = str.length ? +str : Number(defaultSettings[key])\n if (isNaN(value)) return\n onChange(key, value)\n }\n}\n","import React, { useCallback } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Grid, Tab } from 'semantic-ui-react'\n\nimport { AppState } from 'state'\n\nimport { filterKeys } from 'utils'\nimport { CombatModeSettings, Mode, Setting, CombatSharedSettings } from 'types'\nimport { changeCombatParameter, changeSiteParameter } from 'reducers'\nimport Transfer from 'containers/Transfer'\nimport GridSettings from 'components/GridSettings'\nimport AccordionToggle from 'containers/AccordionToggle'\n\nconst deployment = [\n Setting.CustomDeployment,\n Setting.DynamicFlanking,\n Setting.MoraleHitForNonSecondaryReinforcement,\n Setting.MoraleHitForLateDeployment,\n Setting.SupportPhase\n]\nconst mechanics = [\n Setting.FireAndShock,\n Setting.StrengthBasedFlank,\n Setting.UseMaxMorale,\n Setting.InsufficientSupportPenalty,\n Setting.PhaseLength,\n Setting.BaseCombatWidth,\n Setting.ExperienceDamageReduction,\n Setting.FixExperience,\n Setting.DefenderAdvantage,\n Setting.BackRow,\n Setting.Culture,\n Setting.AttributeLoyal,\n Setting.AttackerSwapping,\n Setting.Tactics,\n Setting.Tech,\n Setting.Martial,\n Setting.Food,\n Setting.FixFlankTargeting,\n Setting.MoraleDamageBasedOnTargetStrength,\n Setting.DamageLossForMissingMorale,\n Setting.MoraleGainForWinning,\n Setting.MaxCountering,\n Setting.CounteringDamage,\n Setting.CounteringMode,\n Setting.GlobalTargeting\n]\nconst damage = [\n Setting.DailyMoraleLoss,\n Setting.DailyDamageIncrease,\n Setting.Precision,\n Setting.BasePips,\n Setting.MaxGeneral,\n Setting.MaxPips,\n Setting.DiceMinimum,\n Setting.DiceMaximum,\n Setting.MinimumMorale,\n Setting.MinimumStrength,\n Setting.RelativePips,\n Setting.CohortSize\n]\nconst stackwipe = [\n Setting.Stackwipe,\n Setting.StackwipeRounds,\n Setting.SoftStackWipeLimit,\n Setting.HardStackWipeLimit,\n Setting.RetreatRounds,\n Setting.BackRowRetreat,\n Setting.StackWipeCaptureChance\n]\nconst attributes = [\n Setting.AttributeCombatAbility,\n Setting.AttributeDamage,\n Setting.AttributeTerrainType,\n Setting.AttributeStrengthDamage,\n Setting.AttributeMoraleDamage,\n Setting.AttributeOffenseDefense,\n Setting.AttributeMilitaryTactics,\n Setting.AttributeExperience,\n Setting.AttributeDrill,\n Setting.AttributeDiscipline\n]\n\nconst Settings = () => {\n const { modeSettings: combatSettings, sharedSettings: siteSettings } = useSelector(\n (state: AppState) => state.settings\n )\n const dispatch = useDispatch()\n const onChangeSiteParameter = useCallback(\n (key: keyof CombatSharedSettings, value: string | number | boolean) => dispatch(changeSiteParameter(key, value)),\n [dispatch]\n )\n const onChangeCombatParameter = useCallback(\n (mode: Mode, key: keyof CombatModeSettings, value: string | number | boolean) =>\n dispatch(changeCombatParameter(mode, key, value)),\n [dispatch]\n )\n\n const getSection = (key: string, attributes: Setting[]) => {\n return (\n \n \n attributes.includes(setting))}\n onChange={onChangeSiteParameter}\n />\n \n \n )\n }\n\n const getSettingsMenuItem = () => {\n return {\n menuItem: 'Settings',\n render: () => {\n return (\n \n {getSection('Attributes', attributes)}\n {getSection('Damage', damage)}\n {getSection('Deployment', deployment)}\n {renderModeSettings()}\n {getSection('Mechanics', mechanics)}\n {getSection('Stack wipe & Retreat', stackwipe)}\n \n )\n }\n }\n }\n const getTransferMenuItem = () => {\n return {\n menuItem: 'Import / Export',\n render: () => \n }\n }\n\n const renderModeSettings = () => {\n return (\n \n \n onChangeCombatParameter(Mode.Land, key, str)}\n />\n onChangeCombatParameter(Mode.Naval, key, str)}\n />\n \n \n )\n }\n\n const panes = [getSettingsMenuItem(), getTransferMenuItem()]\n return \n}\n\nexport default Settings\n","import React, { Component } from 'react'\nimport { Button, Header, Segment } from 'semantic-ui-react'\nimport { connect } from 'react-redux'\nimport { AppState } from 'state'\nimport { saveToFile, exportState } from 'managers/transfer'\nimport { resetState } from 'reducers'\n\ntype State = {\n hasError: boolean\n}\n\n/**\n * Global error page to deal with crashes from corrupted data. Also hides bugs.\n */\nclass Error extends Component {\n constructor(props: IProps) {\n super(props)\n this.state = { hasError: false }\n }\n\n componentDidCatch() {\n this.setState({ hasError: true })\n }\n\n render() {\n if (!this.state.hasError) return this.props.children\n if (process.env.NODE_ENV === 'development') return this.props.children\n return (\n <>\n
\n
\n \n
Something went wrong (probably a new version of the simulator)
\n \n \n
\n
\n

If that doesn't help please clear the cache and then force refresh the site.

\n
\n \n )\n }\n\n reset = () => {\n this.props.resetState()\n this.setState({ hasError: false })\n }\n\n download = () => saveToFile(exportState(this.props.state))\n}\n\nconst mapStateToProps = (state: AppState) => ({\n state\n})\n\nconst actions = { resetState }\n\ntype S = ReturnType\ntype D = typeof actions\ninterface IProps extends React.PropsWithChildren, D {}\n\nexport default connect(mapStateToProps, actions)(Error)\n","import React, { Component } from 'react'\nimport { Range, getTrackBackground } from 'react-range'\n\ninterface Props {\n onChange: (value: number) => void\n value: number\n min: number\n max: number\n step: number\n}\n\nconst NEUTRAL = '#CCC'\nconst ACTIVE = '#000'\nconst BACK = '#FFF'\n\n/**\n * Simple range to select a value.\n */\nexport default class SimpleRange extends Component {\n render() {\n const { onChange, value, min, max, step } = this.props\n return (\n onChange(values[0])}\n renderTrack={({ props, children }) => (\n \n \n {children}\n \n \n )}\n renderThumb={({ props, isDragged }) => (\n \n \n \n )}\n />\n )\n }\n}\n","import React, { Component } from 'react'\nimport { VictoryChart, VictoryVoronoiContainer, VictoryTheme } from 'victory'\n\ninterface IProps {\n getTooltip: (datum: Datum) => string\n onActivated: (datum: Datum[]) => void\n}\n\nexport interface Datum {\n y: number\n childName: string\n x: number\n}\n\n/**\n * Base chart for a common style.\n */\nexport default class BaseChart extends Component {\n render() {\n const { getTooltip, onActivated, children } = this.props\n return (\n getTooltip(datum)} onActivated={onActivated} />\n }\n theme={VictoryTheme.material}\n domainPadding={0}\n padding={{ top: 25, left: 50, bottom: 30, right: 50 }}\n >\n {children}\n \n )\n }\n}\n","import React, { Component } from 'react'\nimport { Header } from 'semantic-ui-react'\nimport { VictoryAxis, VictoryArea } from 'victory'\nimport { sortBy } from 'lodash'\n\nimport BaseChart from './BaseChart'\n\nimport { toPercent } from '../../formatters'\nimport { toArr, mapRange } from '../../utils'\n\ninterface IProps {\n rounds: { [key: number]: number }\n progress: number\n}\n\ninterface IState {\n label: string\n}\n\ninterface Datum {\n y: number\n childName: string\n x: number\n}\n\ninterface ChartData {\n values: { x: number; y: number }[]\n cumulative: { x: number; y: number }[]\n}\n\nconst CUMULATIVE = 'CUMULATIVE'\nconst VALUES = 'VALUES'\n\n/**\n * Shows a chart for length of a battle.\n */\nexport default class RoundChart extends Component {\n constructor(props: IProps) {\n super(props)\n this.state = { label: 'Hover over the chart for details' }\n }\n\n toPercent = (value: number) => toPercent(value, 1)\n\n calculate = (values: { [key: string]: number }, progress: number): ChartData => {\n const data: ChartData = { values: [], cumulative: [] }\n data.values = sortBy(\n toArr(values, (count, value) => ({ x: Number(value), y: count / progress })),\n item => item.x\n )\n let count = 0\n for (const value of data.values) {\n count += value.y\n data.cumulative.push({ x: value.x, y: count })\n }\n return data\n }\n\n render() {\n const { rounds, progress } = this.props\n const { label } = this.state\n const data = this.calculate(rounds, progress)\n const roundTicks = mapRange(\n data.cumulative.length ? data.cumulative[data.cumulative.length - 1].x + 1 : 11,\n value => value\n )\n\n return (\n <>\n
\n Rounds\n
\n
{label}
\n \n \n `${x * 100}%`} />\n \n \n \n \n )\n }\n\n onActivated = (datums: Datum[]) => {\n if (datums.length) {\n const datum = datums[0]\n const label = this.getLabel(datum)\n this.setState({ label })\n }\n }\n\n getLabel = (datum: Datum) => {\n if (datum.childName === VALUES) return `${this.toPercent(datum.y)} of battles end at round ${datum.x}`\n if (datum.childName === CUMULATIVE) return `${this.toPercent(datum.y)} of battles end during ${datum.x} rounds`\n return ''\n }\n\n getTooltip = (datum: Datum) => `Round ${datum.x}: ${this.toPercent(datum.y)}`\n}\n","import React, { Component } from 'react'\nimport { Header } from 'semantic-ui-react'\nimport { VictoryAxis, VictoryArea } from 'victory'\nimport { sortBy, capitalize } from 'lodash'\n\nimport BaseChart from './BaseChart'\nimport { toPercent } from 'formatters'\nimport { toArr, mapRange } from 'utils'\nimport { SideType } from 'types'\n\ninterface IProps {\n a: { [key: string]: number }\n b: { [key: string]: number }\n maxA: number\n maxB: number\n progress: number\n type: string\n}\n\ninterface IState {\n label: string\n}\n\ninterface Datum {\n y: number\n childName: string\n x: number\n}\n\ninterface ChartData {\n values: { x: number; y: number }[]\n percent: { x: number; y: number }[]\n cumulative: { x: number; y: number }[]\n}\n\n/**\n * Shows a chart used for current morale and strength\n */\nexport default class CumulativePercentChart extends Component {\n constructor(props: IProps) {\n super(props)\n this.state = { label: 'Hover over the chart for details' }\n }\n\n toPercent = (value: number) => toPercent(Math.abs(value), 1)\n\n calculate = (values: { [key: string]: number }, max: number, progress: number, reverse: boolean): ChartData => {\n const data: ChartData = { values: [], percent: [], cumulative: [] }\n if (reverse)\n data.values = sortBy(\n toArr(values, (count, value) => ({ x: -count / progress, y: Number(value) })),\n item => -item.y\n )\n else\n data.values = sortBy(\n toArr(values, (count, value) => ({ x: count / progress, y: Number(value) })),\n item => -item.y\n )\n let count = 1\n for (const value of data.values) {\n count += value.x\n data.cumulative.push({ x: count, y: value.y })\n data.percent.push({ x: count, y: value.y / max })\n }\n return data\n }\n\n render() {\n const { a, b, maxA, maxB, type, progress } = this.props\n const { label } = this.state\n\n const dataA = this.calculate(a, maxA, progress, true)\n const dataB = this.calculate(b, maxB, progress, false)\n\n const ticks = mapRange(9, value => value / 4)\n\n return (\n <>\n
{`Remaining ${type}`}
\n
{label}
\n \n `${Math.abs(1 - x) * 100}%`} />\n \n \n \n \n \n \n \n )\n }\n\n onActivated = (datums: Datum[]) => {\n if (datums.length) {\n const datum = datums[0]\n const label = this.getLabel(datum)\n this.setState({ label })\n }\n }\n\n getLabel = (datum: Datum) => {\n const { type } = this.props\n const { y, childName } = datum\n let { x } = datum\n x = 1 - x\n if (x > 1) x = 2 - x\n if (this.isPercent(childName))\n return `${this.toPercent(x)} chance to have ${this.toPercent(y)} or more ${type} remaining`\n if (this.isCumulative(childName)) return `${this.toPercent(x)} chance to have ${y} or more ${type} remaining`\n return ''\n }\n\n getTooltip = (datum: Datum) => {\n const { type } = this.props\n const { y, childName } = datum\n let { x } = datum\n x = 1 - x\n if (x > 1) x = 2 - x\n if (this.isPercent(childName)) return `${capitalize(type)} ${this.toPercent(y)}: ${this.toPercent(x)}`\n if (this.isCumulative(childName)) return `${capitalize(type)} ${y}: ${this.toPercent(x)}`\n return ''\n }\n\n isPercent = (name: string) => name === this.percent(SideType.A) || name === this.percent(SideType.B)\n isCumulative = (name: string) => name === this.cumulative(SideType.A) || name === this.cumulative(SideType.B)\n\n cumulative = (side: SideType) => `Cumulative_${this.props.type}_${side}`\n percent = (side: SideType) => `Percent_${this.props.type}_${side}`\n}\n","import React, { Component } from 'react'\nimport { Popup, Icon } from 'semantic-ui-react'\n\ninterface Props {\n value: string\n formula?: string\n}\n\n/**\n * Generic tooltip to show help.\n */\nexport default class HelpTooltip extends Component {\n render() {\n return (\n \n \n \n }\n content={this.getContent()}\n basic\n wide\n mouseEnterDelay={350}\n />\n )\n }\n\n getContent = () => {\n const { value, formula } = this.props\n return (\n <>\n

{value}

\n {formula &&

{formula}

}\n \n )\n }\n}\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport { Grid, Button, Table, Header, Checkbox } from 'semantic-ui-react'\n\nimport { AppState, getCombatEnvironment, convertSides } from 'state'\nimport { interrupt, calculateWinRate, initResourceLosses } from 'combat'\nimport { values, showProgress, filterKeys } from 'utils'\nimport {\n SimulationSpeed,\n Setting,\n Mode,\n CasualtiesProgress,\n ResourceLosses,\n WinRateProgress,\n ResourceLossesProgress,\n CombatSharedSettings\n} from 'types'\nimport { toPercent, toNumber, toFlooredPercent } from 'formatters'\nimport SimpleRange from 'components/SimpleRange'\nimport RoundChart from 'components/Charts/RoundChart'\nimport CumulativePercentChart from 'components/Charts/CumulativePercentChart'\nimport { changeSiteParameter, refreshBattle } from 'reducers'\nimport HelpTooltip from 'components/HelpTooltip'\nimport AccordionToggle from 'containers/AccordionToggle'\nimport GridSettings from 'components/GridSettings'\nimport { getMode, getCombatSettings } from 'selectors'\n\ninterface IState extends CasualtiesProgress {\n attackerWinChance: number\n defenderWinChance: number\n incomplete: number\n draws: number\n calculating: boolean\n battles: number\n updates: number\n progress: number\n averageRounds: number\n stackWipes: number\n rounds: { [key: number]: number }\n lossesA: ResourceLosses\n lossesB: ResourceLosses\n}\n\nconst DOTS = 6\n\nconst simulationSpeeds = values(SimulationSpeed)\n\nconst attributes = [Setting.PhasesPerRoll, Setting.ReduceRolls, Setting.MaxPhases, Setting.ChunkSize]\n/**\n * Calculates win rate for the current battle.\n */\nclass Analyze extends Component {\n constructor(props: IProps) {\n super(props)\n this.state = {\n attackerWinChance: 0,\n defenderWinChance: 0,\n incomplete: 0,\n calculating: false,\n progress: 0,\n updates: 0,\n averageRounds: 0,\n rounds: {},\n battles: 0,\n draws: 0,\n stackWipes: 0,\n avgMoraleA: 0,\n avgMoraleB: 0,\n avgStrengthA: 0,\n avgStrengthB: 0,\n maxMoraleA: 1,\n maxMoraleB: 1,\n maxStrengthA: 1,\n maxStrengthB: 1,\n moraleA: {},\n moraleB: {},\n strengthA: {},\n strengthB: {},\n lossesA: initResourceLosses(),\n lossesB: initResourceLosses(),\n winRateA: 0,\n winRateB: 0\n }\n }\n\n toPercent = (value: number) => toPercent(value, 1)\n toNumber = (value: number) => toNumber(value, 1)\n\n componentDidMount() {\n // Ensures that the setup is not outdated.\n this.props.refreshBattle()\n }\n\n willUnmount = false\n componentWillUnmount() {\n this.willUnmount = true\n interrupt()\n }\n\n render() {\n const { battles, calculating, progress, updates } = this.state\n const { settings, changeSiteParameter, mode } = this.props\n return (\n <>\n \n \n \n (calculating ? interrupt() : this.calculate())}\n >\n {calculating || progress ? showProgress(toFlooredPercent(progress, 0), updates, DOTS) : 'Analyze'}\n \n \n \n \n
Performance: {settings[Setting.Performance] || 'Custom'}
\n changeSiteParameter(Setting.Performance, simulationSpeeds[value])}\n />\n
\n \n Battles: {battles}\n \n
\n \n \n changeSiteParameter(Setting.CalculateWinChance, !!checked)}\n label='Win chance'\n />\n \n \n changeSiteParameter(Setting.CalculateResourceLosses, !!checked)}\n label='Naval gold losses'\n />\n \n \n changeSiteParameter(Setting.CalculateCasualties, !!checked)}\n label='Casualties'\n />\n \n \n changeSiteParameter(Setting.ShowGraphs, !!checked)}\n label='Show graphs'\n />\n \n \n
\n {settings[Setting.CalculateWinChance] && this.renderWinChance()}\n {settings[Setting.CalculateResourceLosses] && mode === Mode.Naval && this.renderResourceLosses()}\n {settings[Setting.CalculateCasualties] && this.renderCasualties()}\n {settings[Setting.ShowGraphs] && this.renderGraphs()}\n
\n \n attributes.includes(setting))}\n onChange={this.changeAnalyzeParameter}\n />\n
\n
\n
\n \n )\n }\n\n changeAnalyzeParameter = (key: keyof CombatSharedSettings, value: string | number | boolean) => {\n const { changeSiteParameter } = this.props\n changeSiteParameter(Setting.Performance, SimulationSpeed.Custom)\n changeSiteParameter(key, value)\n }\n\n renderWinChance = () => {\n const { attackerWinChance, defenderWinChance, incomplete, draws, averageRounds, stackWipes } = this.state\n return (\n \n \n \n Attacker win chance\n Defender win chance\n Draws\n Incomplete\n Average rounds\n Stack wipes\n \n \n \n \n {this.toPercent(this.scale(attackerWinChance))}\n {this.toPercent(this.scale(defenderWinChance))}\n {this.toPercent(this.scale(draws))}\n {this.toPercent(this.scale(incomplete))}\n {this.toNumber(this.scale(averageRounds))}\n {this.toPercent(this.scale(stackWipes))}\n \n \n
\n )\n }\n\n renderCasualties = () => {\n const {\n avgMoraleA,\n avgMoraleB,\n avgStrengthA,\n avgStrengthB,\n maxMoraleA,\n maxMoraleB,\n maxStrengthA,\n maxStrengthB\n } = this.state\n return (\n \n \n \n Attacker morale losses\n Attacker strength losses\n Defender morale losses\n Defender strength losses\n \n \n \n \n \n {this.toNumber(this.scale(avgMoraleA)) + ' (' + this.toPercent(this.scale(avgMoraleA / maxMoraleA)) + ')'}\n \n \n {this.toNumber(this.scale(avgStrengthA)) +\n ' (' +\n this.toPercent(this.scale(avgStrengthA / maxStrengthA)) +\n ')'}\n \n \n {this.toNumber(this.scale(avgMoraleB)) + ' (' + this.toPercent(this.scale(avgMoraleB / maxMoraleB)) + ')'}\n \n \n {this.toNumber(this.scale(avgStrengthB)) +\n ' (' +\n this.toPercent(this.scale(avgStrengthB / maxStrengthB)) +\n ')'}\n \n \n \n
\n )\n }\n\n renderResourceLosses = () => {\n const { lossesA, lossesB: lossesD } = this.state\n const resource = ' gold'\n return (\n \n \n \n Average gold losses\n Attacker\n Defender\n \n \n \n \n \n Destroyed costs\n \n \n \n {this.toNumber(this.scale(lossesA.destroyedCost))}\n {resource}\n \n \n {this.toNumber(this.scale(lossesD.destroyedCost))}\n {resource}\n \n \n \n \n Repair costs\n \n \n \n {this.toNumber(this.scale(lossesA.repairMaintenance))}\n {resource}\n \n \n {this.toNumber(this.scale(lossesD.repairMaintenance))}\n {resource}\n \n \n \n \n Captured costs\n \n \n \n {this.toNumber(this.scale(lossesA.capturedCost))}\n {resource}\n \n \n {this.toNumber(this.scale(lossesD.capturedCost))}\n {resource}\n \n \n \n \n Enemies captured\n \n \n \n {this.toNumber(this.scale(lossesA.seizedCost))}\n {resource}\n \n \n {this.toNumber(this.scale(lossesD.seizedCost))}\n {resource}\n \n \n \n \n Repair cost of captured\n \n \n \n {this.toNumber(this.scale(lossesA.seizedRepairMaintenance))}\n {resource}\n \n \n {this.toNumber(this.scale(lossesD.seizedRepairMaintenance))}\n {resource}\n \n \n \n \n Total costs\n \n \n \n {this.toNumber(\n this.scale(\n lossesA.destroyedCost +\n lossesA.repairMaintenance +\n lossesA.capturedCost +\n lossesA.seizedCost +\n lossesA.seizedRepairMaintenance\n )\n )}\n {resource}\n \n \n {this.toNumber(\n this.scale(\n lossesD.destroyedCost +\n lossesD.repairMaintenance +\n lossesD.capturedCost +\n lossesD.seizedCost +\n lossesD.seizedRepairMaintenance\n )\n )}\n {resource}\n \n \n \n
\n )\n }\n\n renderGraphs = () => {\n const {\n progress,\n rounds,\n moraleA,\n moraleB,\n maxMoraleA,\n maxMoraleB,\n strengthA,\n strengthB,\n maxStrengthA,\n maxStrengthB\n } = this.state\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n }\n\n update = (update: WinRateProgress, casualties: CasualtiesProgress, resources: ResourceLossesProgress) => {\n if (this.willUnmount) return\n const {\n attacker,\n defender,\n incomplete,\n progress,\n averageDays: averageRounds,\n days: rounds,\n battles,\n calculating,\n draws,\n stackWipes\n } = update\n this.setState({\n attackerWinChance: attacker,\n defenderWinChance: defender,\n incomplete,\n draws,\n averageRounds,\n progress,\n calculating,\n rounds,\n stackWipes,\n battles,\n updates: calculating ? (this.state.updates + 1) % DOTS : 0,\n ...casualties,\n ...resources\n })\n }\n\n calculate = () => {\n const { state } = this.props\n // Initialization done here to reset status.\n const field = getCombatEnvironment(state)\n const [attacker, defender] = convertSides(state)\n calculateWinRate(this.update, field, attacker, defender)\n }\n\n scale = (value: number) => (this.state.progress ? value / this.state.progress : 0)\n}\n\nconst mapStateToProps = (state: AppState) => {\n return {\n state,\n settings: getCombatSettings(state),\n mode: getMode(state)\n }\n}\n\nconst actions = { changeSiteParameter, refreshBattle }\n\ntype S = ReturnType\ntype D = typeof actions\ninterface IProps extends S, D {}\n\nexport default connect(mapStateToProps, actions)(Analyze)\n","import { countriesIR, culturesIR, inventionsIR, laws, regionsIR, territoriesIR, traditionsIR, traitsIR } from 'data'\nimport { getConfig } from 'data/config'\nimport { countBy, flatten, groupBy, range, sum, sumBy, upperFirst } from 'lodash'\nimport {\n ArmyName,\n Country,\n CountryAttribute,\n CountryName,\n dictionaryTacticType,\n dictionaryUnitType,\n CharacterAttribute,\n GovermentType,\n Mode,\n TacticType,\n UnitAttribute,\n UnitPreferences,\n UnitPreferenceType\n} from 'types'\nimport { Tech } from 'types/generated'\nimport { arrayify, excludeMissing, filter, forEach, keys, map, toArr, toObj, values } from 'utils'\nimport {\n SaveDataCharacter,\n Save,\n SaveCountry,\n SaveCountryDeity,\n Territory,\n SavePop,\n TradeGood,\n SaveCharacter,\n SaveCohort,\n SaveArmy,\n SaveDataUnitName,\n SaveDataCountry,\n Identity\n} from './types'\n\nconst getCharacterBaseAttribute = (character: SaveDataCharacter, attribute: CharacterAttribute) => {\n if (attribute === CharacterAttribute.Martial) return character.attributes.martial\n if (attribute === CharacterAttribute.Finesse) return character.attributes.finesse\n if (attribute === CharacterAttribute.Charisma) return character.attributes.charisma\n if (attribute === CharacterAttribute.Zeal) return character.attributes.zeal\n return 0\n}\n\nconst getTraitEffect = (traits: string[], attribute: string) =>\n sum(traitsIR.getModifiers(arrayify(traits)).map(modifier => (modifier.attribute === attribute ? modifier.value : 0)))\n\nconst getCharacterAttribute = (character: SaveDataCharacter, attribute: CharacterAttribute) =>\n getCharacterBaseAttribute(character, attribute) + getTraitEffect(character.traits, attribute)\n\nconst maintenanceToKey = (value: number) => {\n switch (value) {\n case 1:\n return 'high'\n case -1:\n return 'low'\n default:\n return 'default'\n }\n}\n\nexport const getFirstPlayedCountry = (file: Save) => {\n if (arrayify(file.played_country).length > 0) return arrayify(file.played_country)[0].country\n return null\n}\n\nconst getCountryName = (country: SaveDataCountry) => (countriesIR[country.tag.toLowerCase()] ?? '') as CountryName\n\nexport const loadCountry = (file: Save, id: number) => {\n const deities = file.deity_manager?.deities_database\n const data = file.country?.country_database[id]\n if (!data) return undefined\n const availableLaws = data.laws?.map(value => !!value)\n const country: SaveCountry = {\n armies: data.units,\n culture: data.primary_culture,\n inventions: arrayify(data.active_inventions)\n .map((value, index) => (value ? index : -1))\n .filter(index => index > -1)\n .map(index => inventionsIR.get(index)),\n heritage: data.heritage ?? '',\n militaryExperience: data.currency_data?.military_experience ?? 0,\n name: getCountryName(data),\n civicTech: data.technology?.civic_tech?.level ?? 0,\n martialTech: data.technology?.military_tech?.level ?? 0,\n oratoryTech: data.technology?.oratory_tech?.level ?? 0,\n religiousTech: data.technology?.religious_tech?.level ?? 0,\n armyMaintenance: 'expense_army_' + maintenanceToKey(data.economic_policies[4]),\n navalMaintenance: 'expense_navy_' + maintenanceToKey(data.economic_policies[5]),\n traditions: arrayify(data.military_bonuses)\n .map((value, index) => (value ? index : -1))\n .filter(index => index > -1)\n .map(index => traditionsIR.get(index)),\n laws: [],\n surplus: [],\n ideas: flatten(arrayify(data.ideas?.idea).map(idea => idea.idea)),\n id,\n deities: deities ? arrayify(data.pantheon).map((deity: SaveCountryDeity) => deities[deity.deity].deity) : [],\n omen: deities && data.omen ? deities[data.omen].key : '',\n religiousUnity: data.religious_unity * 100 ?? 0,\n religion: data.religion ?? '',\n government: '' as GovermentType,\n faction: data.ruler_term?.party ?? '',\n modifiers: arrayify(data.modifier).map(modifier => modifier.modifier),\n isPlayer: !!arrayify(file.played_country).find(player => player.country === Number(id))\n }\n if (file.game_configuration?.difficulty)\n country.modifiers.push(file.game_configuration.difficulty + (country.isPlayer ? '_player' : '_ai'))\n availableLaws &&\n laws\n .filter((_, index) => availableLaws[index])\n .forEach(key => {\n country.laws.push(data[key])\n })\n const government = data.government_key ?? ''\n if (government.endsWith('republic')) country.government = GovermentType.Republic\n else if (government.endsWith('monarchy')) country.government = GovermentType.Monarch\n else country.government = GovermentType.Tribe\n const pops = file.population?.population\n if (data.capital && file.provinces && pops) {\n country.surplus = countSurplus(file, data.capital, pops, country)\n }\n\n return country\n}\n\nexport const loadPopsByTerritory = (file: Save, id: number): Territory[] => {\n const pops = file.population?.population\n if (!file.provinces || !pops) return []\n const territories = toArr(file.provinces, (territory, id) => ({ ...territory, id, pop: arrayify(territory.pop) }))\n const ownTerritories = territories\n .filter(territory => territory.controller === id)\n .sort((a, b) => b.pop.length - a.pop.length)\n const territoryPops = ownTerritories.map(territory => ({\n id: Number(territory.id),\n name: territory.province_name.name,\n controller: territory.controller,\n pops: countPops(pops, territory.pop),\n totalPops: territory.pop.length,\n rank: territory.province_rank\n }))\n return territoryPops\n}\n\nconst countPops = (pops: { [key: number]: SavePop }, ids: number[]) => {\n const counts: { [key: string]: number } = {}\n ids.forEach(ids => {\n const pop = pops[ids]\n const category = `${pop.culture} ${pop.type}`\n counts[category] = (counts[category] ?? 0) + 1\n })\n return counts\n}\n\nconst countSurplus = (file: Save, capital: number, pops: { [key: number]: SavePop }, country: SaveCountry) => {\n if (!file.provinces) return []\n const province = file.provinces[capital]?.state\n if (province === undefined) return []\n const territories = Object.values(file.provinces).filter(territory => territory.state === province)\n const goods = territories.reduce((prev, territory) => {\n const slaves = territory.pop.filter((id: number) => pops[id].type === 'slaves').length\n const goods = territory.trade_goods\n let baseAmount = 1\n if (territory.province_rank === 'city') baseAmount++\n let slavesForSurplus = 18\n if (territory.province_rank === 'settlement') slavesForSurplus -= 3\n if (territory.buildings[16]) slavesForSurplus -= 5\n if (territory.buildings[17]) slavesForSurplus -= 5\n if (country.laws.includes('formalized_industry_law_tribal')) slavesForSurplus -= 1\n if (country.laws.includes('lex_sempronia_agraria')) slavesForSurplus -= 2\n if (country.laws.includes('republican_land_reform_3')) slavesForSurplus -= 2\n slavesForSurplus = Math.max(1, slavesForSurplus)\n return prev.concat(Array(baseAmount + Math.floor(slaves / slavesForSurplus)).fill(goods))\n }, [] as TradeGood[])\n const counts = toObj(\n goods,\n type => type,\n type => goods.filter(item => item === type).length\n )\n const tradeRoutes = file.trade?.route ?? []\n tradeRoutes.forEach(route => {\n if (route.from_state === province) counts[route.trade_goods]--\n\n if (route.to_state === province) counts[route.trade_goods] = (counts[route.trade_goods] ?? 0) + 1\n })\n return keys(filter(counts, item => item > 1))\n}\n\nexport const getPregnancyString = (items?: { father: Identity; birthDate: string }[]) => {\n if (!items) return ''\n const dates = items.map(item => item.birthDate).join(' and ')\n return `${dates} with ${items[0].father.name} (${items[0].father.id})`\n}\n\nconst getGovernor = (save: Save, countryId: number, region: string) => {\n const jobs = save.jobs?.province_job\n const country = save.country?.country_database?.[countryId]\n if (!jobs || !country) return -1\n const job = jobs.find(item => item.governorship === region && item.who === countryId)\n if (job) return job.character\n return country.ruler_term?.character ?? -1\n}\n\nconst getIntegratedCultures = (file: Save, id: number) => {\n const cultures = file.country_culture_manager?.country_culture_database\n if (!cultures) return []\n\n return toArr(cultures)\n .filter(item => item.country === id && item.integration_status === 'integrated')\n .map(item => item.culture)\n}\n\nconst sumObjects = (objects: Record[]) => {\n const total = {} as Record\n objects.forEach(object => {\n forEach(object, (value, key) => {\n if (!total[key]) total[key] = 0\n total[key] += value\n })\n })\n return total\n}\n\nconst getLevyablePOps = (file: Save, id: number) => {\n const territories = file.provinces\n const population = file.population?.population\n if (!territories || !population) return\n const integratedCultures = getIntegratedCultures(file, id)\n const regions = filter(regionsIR, regionTerritories =>\n regionTerritories.some(index => territories[index].owner === id)\n )\n const popsPerTerritory = map(regions, (regionTerritories, region) => {\n let governor = -1\n const pops = regionTerritories\n .filter(index => territories[index].owner === id)\n .map(index => {\n const territory = territories[index]\n if (governor === -1) governor = getGovernor(file, id, region)\n const pops = arrayify(territory.pop)\n const levyablePops = pops\n .map(index => population[index])\n .filter(item => item.type !== 'slaves' && integratedCultures.includes(item.culture))\n return countBy(levyablePops, item => item.culture)\n })\n return { pops, governor }\n })\n const popsPerRegion = map(popsPerTerritory, item => {\n const pops = sumObjects(item.pops)\n return { ...item, pops }\n })\n return popsPerRegion\n}\n\nconst getCulture = (save: Save, id: number) => {\n const country = save.country?.country_database[id]\n return culturesIR[country?.primary_culture ?? '']\n}\n\nconst getUnitPreferences = (save: Save, id: number) => {\n const culture = getCulture(save, id)\n if (culture) {\n return {\n [UnitPreferenceType.Primary]: dictionaryUnitType[culture.primary],\n [UnitPreferenceType.Secondary]: dictionaryUnitType[culture.secondary],\n [UnitPreferenceType.Flank]: dictionaryUnitType[culture.flank]\n } as UnitPreferences\n }\n return {\n [UnitPreferenceType.Primary]: null,\n [UnitPreferenceType.Secondary]: null,\n [UnitPreferenceType.Flank]: null\n } as UnitPreferences\n}\n\nconst cleanName = (name: string) => name.split('_').map(upperFirst).join(' ')\n\nconst getLevyName = (region: string) => ('Levy ' + cleanName(region.substring(0, region.length - 7))) as ArmyName\n\nexport const getLevies = (save: Save, id: number, levyMultiplier: number) => {\n const regions = getLevyablePOps(save, id)\n if (!regions) return\n const levies = map(regions, region => {\n const levies = toArr(region.pops, (amount, culture) => {\n const template = culturesIR[culture].template\n const cohorts = toArr(\n map(template, item => levyMultiplier * item * amount),\n (value, key) => ({ key, value })\n )\n return cohorts\n })\n const grouped = groupBy(levies.flat(), item => item.key)\n const rawUnits = map(grouped, item => sumBy(item, item => item.value))\n let remaining = Math.max(getConfig().LevyMinimumSize, Math.floor(levyMultiplier * sum(values(region.pops))))\n const units = map(rawUnits, item => {\n const amount = Math.min(remaining, Math.ceil(item))\n remaining -= amount\n return amount\n })\n const defaultTemplate = culturesIR['default'].template\n forEach(defaultTemplate, (item, type) => {\n const amount = Math.min(remaining, Math.ceil(remaining * item))\n remaining -= amount\n if (!units[type]) units[type] = 0\n units[type] += amount\n })\n units['supply_train'] = Math.floor(sum(values(units)) / getConfig().LevySupportLimit)\n return { units, leader: region.governor }\n })\n const preferences = getUnitPreferences(save, id)\n let counter = -1\n const armies: SaveArmy[] = toArr(levies, (army, region) => ({\n id: counter--,\n name: getLevyName(region),\n cohorts: toArr(army.units, (amount, type) =>\n range(amount).map(() => ({\n type: dictionaryUnitType[type],\n [UnitAttribute.Experience]: undefined,\n [UnitAttribute.Strength]: undefined,\n [UnitAttribute.Morale]: undefined\n }))\n ).flat(),\n mode: Mode.Land,\n tactic: TacticType.ShockAction,\n preferences,\n flankSize: 5,\n leader: loadCharacter(save, army.leader),\n ability: ''\n }))\n return armies\n}\n\nconst getCharacterName = (character: SaveDataCharacter, familyName?: string) => {\n const surname = character.family_name ?? familyName\n return character.first_name_loc.name + (surname ? ' ' + surname : '')\n}\n\nconst getCharacterIdentity = (save: Save, id: number) => {\n const character = save.character?.character_database[id]\n const familyName = save.family?.families[character?.family ?? -1]?.key\n return {\n id,\n name: character ? getCharacterName(character, familyName) : ''\n }\n}\n\nconst loadCharacter = (save: Save, id: number | undefined): SaveCharacter | undefined => {\n const countries = save.country?.country_database\n const character = save.character?.character_database[id ?? -1]\n if (!character || !countries) return undefined\n const familyName = save.family?.families[character.family]?.key\n const attributes = {\n ...toObj(\n values(CharacterAttribute),\n attribute => attribute,\n attribute => getCharacterAttribute(character, attribute)\n ),\n ...{\n [CharacterAttribute.Age]: character.age,\n [CharacterAttribute.Fertility]: character.fertility ?? 0,\n [CharacterAttribute.Health]: character.health ?? (character.death_date ? 0 : 100.0)\n }\n }\n\n return {\n ...attributes,\n ...{\n id: id ?? -1,\n baseAttributes: toObj(\n values(CharacterAttribute),\n attribute => attribute,\n attribute => getCharacterBaseAttribute(character, attribute)\n ),\n name: getCharacterName(character, familyName),\n traits: character.traits ?? [],\n countryName: getCountryName(countries[character.country]),\n country: character.country,\n alive: !character.death_date,\n monthlyHealth: getTraitEffect(character.traits, CharacterAttribute.Health),\n gender: character.female === 'yes' ? 'Female' : 'Male',\n pregnant: character.unborn?.map(item => ({\n father: getCharacterIdentity(save, item.father),\n birthDate: item.date\n }))\n }\n }\n}\n\nconst loadCohort = (file: Save, id: number): SaveCohort | undefined => {\n const cohort = file.armies?.subunit_database[id]\n if (!cohort) return undefined\n return {\n [UnitAttribute.Experience]: cohort.experience,\n [UnitAttribute.Morale]: cohort.morale,\n [UnitAttribute.Strength]: cohort.strength,\n type: dictionaryUnitType[cohort.type]\n }\n}\n\nexport const loadArmy = (file: Save, id: number) => {\n const data = file.armies?.units_database[id]\n if (!data) return undefined\n const army: SaveArmy = {\n id,\n name: getArmyName(data.unit_name) as ArmyName,\n cohorts:\n data.cohort ?? data.ship\n ? excludeMissing(arrayify(data.cohort ?? data.ship ?? 0).map(id => loadCohort(file, id)))\n : [],\n flankSize: data.flank_size,\n leader: loadCharacter(file, data.leader),\n mode: data.is_army === 'yes' ? Mode.Land : Mode.Naval,\n preferences: {\n [UnitPreferenceType.Primary]: dictionaryUnitType[data.primary],\n [UnitPreferenceType.Secondary]: dictionaryUnitType[data.second],\n [UnitPreferenceType.Flank]: dictionaryUnitType[data.flank]\n } as UnitPreferences,\n tactic: dictionaryTacticType[data.tactic],\n ability: data.unit_ability?.which ?? ''\n }\n return army\n}\n\nconst getArmyName = (army: SaveDataUnitName) => {\n let name = army.name\n if (name.startsWith('RETINUE_ARMY_NAME')) name = 'Retinue'\n else if (name.startsWith('NAVY_NAME')) name = 'Navy'\n else name = 'Army'\n if (army.ordinal) name += ' ' + army.ordinal\n if (army.family) name += ' ' + army.family\n return name\n}\n\nconst armySorter = (a: SaveArmy, b: SaveArmy) => {\n const mode = a.mode.localeCompare(b.mode)\n if (mode) return mode\n const units = b.cohorts.length - a.cohorts.length\n if (units) return units\n return a.name.localeCompare(b.name)\n}\n\nexport const loadArmies = (save: Save, saveCountry: SaveCountry, country: Country) => {\n const armies = saveCountry.armies ? excludeMissing(saveCountry.armies.map(id => loadArmy(save, id))) : []\n const levies =\n getLevies(save, saveCountry.id, Math.min(getConfig().LevyMaxMultiplier, country[CountryAttribute.LevySize])) ?? []\n return [...armies, ...levies].sort(armySorter)\n}\n\nexport const countTech = (country: SaveCountry, tech: Tech) =>\n country.inventions.filter(invention => invention.parent === tech).length + ' inventions'\n\nexport const getTagName = (tag: string) =>\n countriesIR[tag.toLowerCase()] ? countriesIR[tag.toLowerCase()] + ' (' + tag + ')' : tag\n\nexport const getTerritoryName = (name: string) =>\n territoriesIR[name.toLowerCase()] ? territoriesIR[name.toLowerCase()] : name\n\nexport const getCategoryName = (name: string) => {\n const split = name.split(' ')\n const rawCulture = split[0].toLowerCase()\n const culture = culturesIR[rawCulture]?.name ?? rawCulture\n if (split.length > 1) return `${culture} ${split[1]}`\n return culture\n}\n\nexport const loadCountryList = (save: Save | undefined) => {\n const data = save?.country?.country_database\n if (data) {\n return keys(data).map(key => ({ text: getTagName(data[Number(key)].tag), value: key }))\n }\n return []\n}\n\nexport const loadCharacters = (save: Save | undefined) => {\n const data = save?.character?.character_database\n if (save && data) return excludeMissing(toArr(data, (_, id) => loadCharacter(save, Number(id))))\n return []\n}\n","import {\n culturesIR,\n heritagesIR,\n policiesIR,\n tradesIR,\n ideasIR,\n lawsIR,\n factionsIR,\n religionsIR,\n deitiesIR,\n effectsIR\n} from 'data'\nimport { toPercent } from 'formatters'\nimport React from 'react'\nimport { Table } from 'semantic-ui-react'\nimport { Country, CountryAttribute } from 'types'\nimport { Tech } from 'types/generated'\nimport { countTech } from './manager'\nimport { SaveCountry } from './types'\n\nconst TableRowsSaveCountry = ({ saveCountry, country }: { saveCountry?: SaveCountry; country?: Country }) => {\n if (!saveCountry || !country) return null\n return (\n <>\n \n Country\n {saveCountry.name}\n Controller\n {saveCountry.isPlayer ? 'Player' : 'AI'}\n \n \n Civic tech\n \n Level {saveCountry.civicTech} with {countTech(saveCountry, Tech.Civic)}\n \n Martial tech\n \n Level {saveCountry.martialTech} with {countTech(saveCountry, Tech.Martial)}\n \n \n \n Oratory tech\n \n Level {saveCountry.oratoryTech} with {countTech(saveCountry, Tech.Oratory)}\n \n Religious tech\n \n Level {saveCountry.religiousTech} with {countTech(saveCountry, Tech.Religious)}\n \n \n \n Culture\n {culturesIR[saveCountry.culture].name}\n Heritage\n {heritagesIR.getName(saveCountry.heritage)}\n \n \n Army\n {policiesIR.getName(saveCountry.armyMaintenance)}\n Navy\n {policiesIR.getName(saveCountry.navalMaintenance)}\n \n \n Levy Multiplier\n {toPercent(country[CountryAttribute.LevySize])}\n \n \n \n \n Military experience\n {saveCountry.militaryExperience}\n Traditions\n {saveCountry.traditions.length}\n \n \n Capital surplus\n {tradesIR.getName(saveCountry.surplus).join(', ')}\n Ideas\n {ideasIR.getName(saveCountry.ideas).join(', ')}\n \n \n Laws\n {lawsIR.getName(saveCountry.laws).join(', ')}\n \n \n Government\n {saveCountry.government}\n Faction\n {factionsIR.getName(saveCountry.faction)}\n \n \n Religion\n \n {religionsIR.getName(saveCountry.religion)} ({saveCountry.religiousUnity.toPrecision(3)}%)\n \n Deities\n \n {deitiesIR\n .get(saveCountry.deities)\n .map(item => item.name + (saveCountry.omen.substr(4) === item.key.substr(5) ? ' (with omen)' : ''))\n .join(', ')}\n \n \n \n Modifiers\n {effectsIR.getName(saveCountry.modifiers).join(', ')}\n \n \n )\n}\n\nexport default TableRowsSaveCountry\n","import AttributeImage from 'components/Utils/AttributeImage'\nimport LabelItem from 'components/Utils/LabelUnit'\nimport { abilitiesIR, getDefaultUnits, traitsIR } from 'data'\nimport { uniq } from 'lodash'\nimport React from 'react'\nimport { useSelector } from 'react-redux'\nimport { Table } from 'semantic-ui-react'\nimport { AppState } from 'state'\nimport { Mode, CharacterAttribute, UnitPreferenceType, UnitType } from 'types'\nimport { toObj, toArr } from 'utils'\nimport { SaveArmy } from './types'\n\nconst TableRowsSaveArmy = ({ army }: { army: SaveArmy }) => {\n const tactics = useSelector((state: AppState) => state.tactics)\n const units = getDefaultUnits()\n const cohorts = army.cohorts.map(cohort => cohort.type)\n const types = uniq(cohorts)\n const counts = toObj(\n types,\n type => type,\n type => cohorts.filter(item => item === type).length\n )\n const ability = abilitiesIR.get(army.ability)\n return (\n <>\n \n \n \n \n \n \n \n Name\n {army.name}\n \n \n {army.mode === Mode.Naval ? 'Adminal' : 'General'}\n {army.leader ? army.leader.name : ''}\n \n {army.leader ? (\n <>\n \n {' ' + army.leader[CharacterAttribute.Martial]}\n \n ) : (\n ''\n )}\n \n {army.leader ? army.leader.traits.map(key => traitsIR.get(key)?.name).join(', ') : ''}\n \n \n Tactic / Ability\n \n \n {ability ? ' / ' + ability : null}\n \n Flank size\n {army.flankSize}\n \n \n Preferences\n \n {' '}\n {' '}\n \n \n \n \n Cohorts\n \n {toArr(counts, (value, key) => (\n \n \n {' x ' + value}\n \n ))}\n \n \n \n )\n}\n\nexport default TableRowsSaveArmy\n","import { FileInput } from 'components/Utils/Inputs'\nimport React, { useState } from 'react'\nimport { Dimmer, Header, Loader } from 'semantic-ui-react'\nimport { loadFile, parseFile } from './importer'\nimport { Save } from './types'\n\nconst loadSave = async (file: File) => {\n const [data] = await loadFile(file)\n return data ? (parseFile(data) as Save) : undefined\n}\n\nconst InputImportSave = ({ onImported }: { onImported: (save: Save) => void }) => {\n const [loading, setLoading] = useState(false)\n\n const handleFile = async (file: File) => {\n setLoading(true)\n const save = file && (await loadSave(file))\n setLoading(false)\n if (save) onImported(save)\n }\n\n return (\n <>\n \n Loading\n \n
Select a save game
\n \n \n )\n}\n\nexport default InputImportSave\n","import React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { useDispatch } from 'react-redux'\nimport {\n Mode,\n UnitPreferenceType,\n CharacterAttribute,\n UnitAttribute,\n CountryAttribute,\n SelectionType,\n ArmyName,\n CohortData,\n CountryDefinition,\n Country,\n CountryData\n} from 'types'\nimport { importCountry } from 'reducers'\nimport { Button, Grid, Table } from 'semantic-ui-react'\nimport SimpleDropdown from 'components/Dropdowns/SimpleDropdown'\nimport { getDefaultCountry } from 'data'\nimport { map } from 'utils'\nimport { calculateValueWithoutLoss } from 'data_values'\nimport { getFirstPlayedCountry, loadArmies, loadCountry, loadCountryList } from './manager'\nimport {\n convertCountryData,\n convertCountryDefinition,\n createArmy,\n deleteArmy,\n enableCountrySelection,\n enableCountrySelections,\n setCountryAttribute\n} from 'managers/countries'\nimport {\n addToReserve,\n enableGeneralSelection,\n enableGeneralSelections,\n selectTactic,\n setFlankSize,\n setGeneralAttribute,\n setHasGeneral,\n setUnitPreference\n} from 'managers/army'\nimport { convertUnitsData } from 'managers/units'\nimport { useOptionalState } from 'components/hooks'\nimport { SaveCountry, SaveArmy, Save } from './types'\nimport TableRowsSaveCountry from './TableRowsSaveCountry'\nimport TableRowsSaveArmy from './TableRowsSaveArmy'\nimport InputImportSave from './InputImportSave'\n\nconst convertArmy = (country: CountryDefinition, army: SaveArmy) => {\n const armyName = army.name\n // Country must have at least one army per mode so only delete the default one if importing anything.\n if (army.mode === Mode.Land) deleteArmy(country, ArmyName.Army)\n else deleteArmy(country, ArmyName.Navy)\n createArmy(country, armyName, army.mode)\n const armyData = country.armies[armyName]\n if (army.leader) {\n setGeneralAttribute(armyData, CharacterAttribute.Martial, army.leader.baseAttributes[CharacterAttribute.Martial])\n enableGeneralSelection(armyData, SelectionType.Ability, army.ability)\n enableGeneralSelections(armyData, SelectionType.Trait, army.leader.traits)\n } else {\n setHasGeneral(armyData, false)\n }\n setFlankSize(armyData, army.flankSize)\n selectTactic(armyData, army.tactic)\n setUnitPreference(armyData, UnitPreferenceType.Primary, army.preferences[UnitPreferenceType.Primary])\n setUnitPreference(armyData, UnitPreferenceType.Secondary, army.preferences[UnitPreferenceType.Secondary])\n setUnitPreference(armyData, UnitPreferenceType.Flank, army.preferences[UnitPreferenceType.Flank])\n\n const units = convertUnitsData(country.units, country, armyData.general)\n const experiences = map(units, unit => calculateValueWithoutLoss(unit, UnitAttribute.Experience))\n const maxStrengths = map(units, unit => calculateValueWithoutLoss(unit, UnitAttribute.Strength))\n const maxMorales = map(units, unit => calculateValueWithoutLoss(unit, UnitAttribute.Morale))\n const withoutMissingData = army.cohorts.map(cohort => ({\n ...cohort,\n [UnitAttribute.Experience]: cohort[UnitAttribute.Experience] ?? experiences[cohort.type],\n [UnitAttribute.Strength]: cohort[UnitAttribute.Strength] ?? maxStrengths[cohort.type],\n [UnitAttribute.Morale]: cohort[UnitAttribute.Morale] ?? maxMorales[cohort.type]\n }))\n const cohorts: CohortData[] = withoutMissingData.map(cohort => ({\n type: cohort.type,\n baseValues: {\n [UnitAttribute.Experience]: {\n Custom: cohort[UnitAttribute.Experience] - experiences[cohort.type]\n }\n } as never,\n lossValues: {\n [UnitAttribute.Morale]: {\n Custom: maxMorales[cohort.type] - cohort[UnitAttribute.Morale]\n },\n [UnitAttribute.Strength]: {\n Custom: maxStrengths[cohort.type] - cohort[UnitAttribute.Strength]\n }\n } as never\n }))\n addToReserve(armyData, cohorts)\n}\n\nconst convertCountry = (country: SaveCountry, armies: SaveArmy[]) => {\n const countryData = getDefaultCountry(country.name)\n setCountryAttribute(countryData, CountryAttribute.CivicTech, country.civicTech)\n setCountryAttribute(countryData, CountryAttribute.MartialTech, country.martialTech)\n setCountryAttribute(countryData, CountryAttribute.OratoryTech, country.oratoryTech)\n setCountryAttribute(countryData, CountryAttribute.ReligiousTech, country.religiousTech)\n setCountryAttribute(countryData, CountryAttribute.MilitaryExperience, country.militaryExperience)\n const traditions = country.traditions.map(item => item.key)\n enableCountrySelections(countryData, SelectionType.Tradition, traditions)\n const inventions = country.inventions.map(item => item.key)\n enableCountrySelections(countryData, SelectionType.Invention, inventions)\n enableCountrySelection(countryData, SelectionType.Heritage, country.heritage)\n enableCountrySelections(countryData, SelectionType.Trade, country.surplus)\n enableCountrySelections(countryData, SelectionType.Idea, country.ideas)\n enableCountrySelections(countryData, SelectionType.Law, country.laws)\n enableCountrySelections(countryData, SelectionType.Deity, country.deities)\n if (country.omen) enableCountrySelection(countryData, SelectionType.Deity, 'omen' + country.omen)\n enableCountrySelections(countryData, SelectionType.Effect, country.modifiers)\n enableCountrySelection(countryData, SelectionType.Policy, country.armyMaintenance)\n enableCountrySelection(countryData, SelectionType.Policy, country.navalMaintenance)\n enableCountrySelection(countryData, SelectionType.Religion, country.religion)\n enableCountrySelection(countryData, SelectionType.Faction, country.faction)\n setCountryAttribute(countryData, CountryAttribute.OmenPower, country.religiousUnity - 100)\n armies.forEach(army => convertArmy(countryData, army))\n return countryData\n}\n\nconst ImportSave = () => {\n const [saveCountry, setCountry] = useOptionalState()\n const countryData = useRef()\n const country = useRef()\n const [armies, setArmies] = useState([])\n const [save, setSave] = useOptionalState()\n const countries = save ? loadCountryList(save) : []\n\n const selectCountry = useCallback(\n (save: Save, id: number) => {\n const saveCountry = loadCountry(save, id)\n if (saveCountry) {\n setCountry(saveCountry)\n\n country.current = convertCountryDefinition(convertCountryData(convertCountry(saveCountry, [])))\n const armies = loadArmies(save, saveCountry, country.current)\n setArmies(armies)\n countryData.current = convertCountry(saveCountry, armies)\n }\n },\n [setCountry, setArmies]\n )\n\n useEffect(() => {\n if (!save) return\n const firstPlayer = getFirstPlayedCountry(save)\n if (firstPlayer) selectCountry(save, firstPlayer)\n }, [save, selectCountry])\n\n const handleChangeCountry = (id: string) => {\n if (!save) return\n selectCountry(save, Number(id))\n }\n\n const handleImportSave = (save: Save) => {\n setCountry(undefined)\n setArmies([])\n setSave(save)\n }\n\n const dispatch = useDispatch()\n const handleImport = () => {\n if (countryData.current) dispatch(importCountry(countryData.current))\n }\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {armies.map(army => (\n \n ))}\n \n
\n
\n
\n
\n )\n}\n\nexport default ImportSave\n","import React, { useState } from 'react'\nimport { Grid, Header } from 'semantic-ui-react'\nimport { loadFile } from './importer'\nimport { FileInput } from '../components/Utils/Inputs'\n\n/** Converts a compressed binary save to plain text. */\nconst ConvertSave = () => {\n const [errors, setErrors] = useState([])\n const loadSave = async (file: File) => {\n const [data, errors] = await loadFile(file)\n setErrors(errors)\n if (data) {\n const blob = new Blob([data], { type: 'text/plain;charset=utf-8' })\n saveAs(blob, 'plain_' + file.name)\n }\n }\n\n return (\n \n \n \n
Select a save game to decompress
\n Experimental tool that let's you turn save games into plain text and inspect them with a text editor. Playing\n these saves is not recommended.\n
\n \n \n \n
\n \n \n {errors.length ?
Errors:
: null}\n {errors.map((error, index) => (\n

{error}

\n ))}\n
\n
\n
\n )\n}\n\nexport default ConvertSave\n","import React from 'react'\nimport { Tab } from 'semantic-ui-react'\nimport ImportSave from 'saves/ImportSave'\nimport ConvertSave from 'saves/ConvertSave'\nimport SaveToken from 'saves/SaveToken'\n\nconst SaveTool = () => {\n const panes = [\n {\n menuItem: 'Import',\n render: () => \n },\n {\n menuItem: 'Convert',\n render: () => \n }\n ]\n if (process.env.NODE_ENV === 'development') {\n panes.push({\n menuItem: 'Tokenizer',\n render: () => \n })\n }\n return \n}\n\nexport default SaveTool\n","import React, { useEffect } from 'react'\nimport { Save, SaveCountry } from './types'\nimport { Grid } from 'semantic-ui-react'\nimport SimpleDropdown from 'components/Dropdowns/SimpleDropdown'\nimport { forEach, toArr } from 'utils'\nimport {\n getCategoryName,\n getTagName,\n getTerritoryName,\n loadCountry,\n loadCountryList,\n loadPopsByTerritory\n} from 'saves/manager'\nimport { useOptionalState } from 'components/hooks'\n\nconst exportPops = (save: Save, id: number) => {\n const name = getTagName(save.country?.country_database[Number(id)].tag ?? '')\n\n const territories = loadPopsByTerritory(save, Number(id))\n const total: { [key: string]: number } = {}\n territories.forEach(territory =>\n forEach(territory.pops, (amount, category) => {\n total[category] = (total[category] ?? 0) + amount\n })\n )\n const sorted = toArr(total, (amount, category: string) => ({ amount, category })).sort((a, b) => b.amount - a.amount)\n const categories = sorted.map(item => item.category)\n let data = 'sep=,\\n,Rank,'\n data += categories.map(getCategoryName).join(',') + '\\n'\n territories.forEach(territory => {\n data += `${getTerritoryName(territory.name)} (${territory.id}),${territory.rank},`\n const counts = categories.map(category => territory.pops[category] ?? 0)\n data += counts.join(',') + '\\n'\n })\n const blob = new Blob([data], { type: 'text/plain;charset=utf-8' })\n saveAs(blob, `pops_${name}_${Date.now()}.csv`)\n}\n\nconst ExportPops = ({ save }: { save: Save }) => {\n const [country, setCountry] = useOptionalState()\n const countries = loadCountryList(save)\n\n useEffect(() => {\n if (save && country) exportPops(save, country.id)\n }, [save, country])\n\n const selectCountry = (save: Save, id: number) => {\n setCountry(loadCountry(save, id))\n }\n\n const handleChangeCountry = (id: string) => {\n if (!save) return\n selectCountry(save, Number(id))\n }\n\n return (\n \n \n \n \n \n \n \n )\n}\n\nexport default ExportPops\n","import { traitsIR } from 'data'\nimport { toPercent } from 'formatters'\nimport React, { memo } from 'react'\nimport { Table } from 'semantic-ui-react'\nimport { CharacterAttribute } from 'types'\nimport { getPregnancyString } from './manager'\nimport { SaveCharacter } from './types'\n\ntype RenderAttributeProps = {\n attribute: CharacterAttribute\n character: SaveCharacter\n renderer?: (value: number) => string\n}\n\nconst RenderAttribute = ({ attribute, character, renderer }: RenderAttributeProps) => (\n {renderer ? renderer(character[attribute]) : character[attribute]}\n)\n\nconst healthString = (health: number, monthly: number) => {\n if (monthly) return `${toPercent(health / 100.0)} (${toPercent(monthly)})`\n return toPercent(health / 100.0)\n}\n\nconst TableRowCharacter = ({ character }: { character: SaveCharacter }) => {\n return (\n \n {character.id}\n {character.name}\n {character.countryName}\n {character.gender}\n \n \n \n \n healthString(health, character.monthlyHealth)}\n />\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {character.traits.map(key => traitsIR.get(key)?.name).join(', ')}\n {getPregnancyString(character.pregnant)}\n \n )\n}\n\nexport default memo(TableRowCharacter)\n","import React, { Children, PropsWithChildren } from 'react'\nimport { Grid } from 'semantic-ui-react'\n\n/**\n * Grid row that creates columns automatically.\n */\nconst SimpleGridRow = ({ children }: PropsWithChildren) => {\n return (\n \n {Children.map(children, child => (\n {child}\n ))}\n \n )\n}\n\nexport default SimpleGridRow\n","import React, { useCallback, useMemo } from 'react'\nimport { Dropdown, DropdownProps } from 'semantic-ui-react'\n\ninterface IProps {\n value: T[]\n values: ({ value: T; text: string } | T)[]\n onChange?: (value: T[]) => void\n onAdd?: (value: T[]) => void\n style?: unknown\n search?: boolean\n placeholder?: string\n}\n\nconst SimpleMultiDropdown = (props: IProps): JSX.Element => {\n const { value, onChange, onAdd, search, placeholder, values, style } = props\n const handleAddItem = useCallback((_, { value }: DropdownProps) => onAdd && onAdd(value as T[]), [onAdd])\n const handleChange = useCallback((_, { value }: DropdownProps) => onChange && onChange(value as T[]), [onChange])\n\n const options = useMemo(\n () =>\n values.map(item => {\n if (typeof item === 'object') return item\n else return { value: item, text: item }\n }),\n [values]\n )\n\n return (\n \n )\n}\n\nexport default SimpleMultiDropdown\n","import SimpleDropdown from 'components/Dropdowns/SimpleDropdown'\r\nimport { chunk } from 'lodash'\r\nimport React, { useState, useMemo } from 'react'\r\nimport { PaginationProps, Pagination as PaginationUI } from 'semantic-ui-react'\r\n\r\nconst paginations = [10, 25, 100, 1000, 10000, 100000]\r\n\r\ntype Props = {\r\n items: T[]\r\n Component: (props: { items: T[] }) => JSX.Element\r\n}\r\n\r\n/** Provides a pagination to a given component. Page size can be changed. */\r\nconst Pagination = ({ items, Component }: Props) => {\r\n const [page, setPage] = useState(1)\r\n const [pagination, setPagination] = useState(paginations[0])\r\n\r\n const handlePaginationChange = (_: unknown, { activePage }: PaginationProps) => setPage(Number(activePage))\r\n\r\n const paginated = useMemo(() => chunk(items, pagination), [items, pagination])\r\n const shownItems = paginated[page - 1] ?? []\r\n\r\n return (\r\n <>\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n )\r\n}\r\n\r\nexport default Pagination\r\n","import React from 'react'\r\nimport { Table } from 'semantic-ui-react'\r\nimport AttributeImage from './AttributeImage'\r\n\r\nconst TableHeader = ({ headers }: { headers: readonly string[] }) => {\r\n return (\r\n \r\n \r\n {headers.map(header => (\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n )\r\n}\r\n\r\nexport default TableHeader\r\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Button, Checkbox, Grid, Table } from 'semantic-ui-react'\nimport { getPregnancyString, loadCharacters, loadCountryList } from './manager'\nimport { useBooleanState, useOptionalState } from 'components/hooks'\nimport { Save, SaveCharacter } from './types'\nimport TableRowCharacter from './TableRowCharacter'\nimport { sum } from 'lodash'\nimport { traitsIR } from 'data'\nimport { values } from 'utils'\nimport { InputDelayed } from 'components/Utils/Inputs'\nimport AttributeImage from 'components/Utils/AttributeImage'\nimport { CharacterAttribute, filterStatAttributes, Range } from 'types'\nimport SimpleGridRow from 'components/SimpleGrid'\nimport SimpleMultiDropdown from 'components/Dropdowns/SimpleMultiDropdown'\nimport Pagination from 'components/Utils/Pagination'\nimport TableHeader from 'components/Utils/TableHeader'\n\nconst headers = [\n 'Id',\n 'Name',\n 'Country',\n 'Gender',\n CharacterAttribute.Age,\n CharacterAttribute.Health,\n CharacterAttribute.Fertility,\n CharacterAttribute.Martial,\n CharacterAttribute.Finesse,\n CharacterAttribute.Charisma,\n CharacterAttribute.Zeal,\n 'Traits',\n 'Pregnancy'\n] as const\n\nconst sep = ','\n\nconst exportCharacter = (item: SaveCharacter) =>\n headers.map(header => {\n if (header === 'Id') return item.id\n if (header === 'Country') return item.countryName\n if (header === 'Name') return item.name\n if (header === 'Gender') return item.gender\n if (header === 'Traits') return item.traits.map(key => traitsIR.get(key)?.name).join(' ')\n if (header === 'Pregnancy') return getPregnancyString(item.pregnant)\n return item[header]\n })\n\nconst exportCharacters = (items: SaveCharacter[]) => {\n let data = `sep=${sep}\\n${headers.join(sep)}\\n`\n data += items.map(exportCharacter).join('\\n')\n const blob = new Blob([data], { type: 'text/plain;charset=utf-8' })\n saveAs(blob, `characters_${Date.now()}.csv`)\n}\n\nconst InputRange = ({\n onChange,\n attribute\n}: {\n attribute: string\n onChange: (attribute: string, range?: Range) => void\n}) => {\n const [min, setMin] = useState('')\n const [max, setMax] = useState('')\n\n useEffect(() => {\n if (min === '' && max === '') onChange(attribute)\n else\n onChange(attribute, {\n min: min === '' ? -Number.MAX_SAFE_INTEGER : Number(min),\n max: max === '' ? Number.MAX_SAFE_INTEGER : Number(max)\n })\n }, [onChange, attribute, min, max])\n return (\n
\n \n \n -\n \n
\n )\n}\n\nconst verifyValue = (value: number, range?: Range) => {\n if (!range) return true\n return range.min <= value && value <= range.max\n}\n\ntype FilterSorter = (items: SaveCharacter[]) => SaveCharacter[]\n\ntype FiltersProps = {\n save: Save\n onChange: (filterSorter: FilterSorter) => void\n}\n\nconst emptyArray = [] as never[]\n\nconst Filters = ({ save, onChange }: FiltersProps) => {\n const filters = useRef>({})\n\n const [countries, setCountries] = useState(emptyArray)\n const countryList = useMemo(() => loadCountryList(save), [save])\n\n const [search, setSearch] = useState('')\n const [traits, setTraits] = useState(emptyArray)\n const [male, setMale] = useBooleanState(true)\n const [female, setFemale] = useBooleanState(true)\n const [alive, setAlive] = useBooleanState(true)\n const [pregnant, setPregnant] = useBooleanState(false)\n\n const createFilterSorter = useCallback(() => {\n const filterer = (item: SaveCharacter) => {\n if (countries.length > 0 && !countries.includes(String(item.country))) return false\n if (traits.length > 0 && item.traits.every(trait => !traits.includes(trait))) return false\n if (search.length > 0) {\n const isId = Number.isInteger(search)\n if (isId && item.id !== Number(search)) return false\n if (!isId && !item.name.includes(search)) return false\n }\n if (values(CharacterAttribute).some(attribute => !verifyValue(item[attribute], filters.current[attribute])))\n return false\n if (!male && item.gender === 'Male') return false\n if (!female && item.gender === 'Female') return false\n if (alive !== item.alive) return false\n if (pregnant && !item.pregnant?.length) return false\n return true\n }\n const sorter = (a: SaveCharacter, b: SaveCharacter) => {\n const traitsA = a.traits.filter(trait => traits.includes(trait)).length\n const traitsB = b.traits.filter(trait => traits.includes(trait)).length\n const traitDifference = traitsB - traitsA\n if (traitDifference) return traitDifference\n const attributesA = sum(values(filterStatAttributes(a)))\n const attributesB = sum(values(filterStatAttributes(b)))\n const attributesDifference = attributesB - attributesA\n if (attributesDifference) return attributesDifference\n return a[CharacterAttribute.Age] - b[CharacterAttribute.Age]\n }\n const filterSorter = (items: SaveCharacter[]) => items.filter(filterer).sort(sorter)\n onChange(filterSorter)\n }, [onChange, countries, traits, search, male, female, alive, pregnant])\n\n useEffect(createFilterSorter, [createFilterSorter])\n\n const handleChange = useCallback(\n (attribute: string, range?: Range) => {\n filters.current[attribute] = range\n createFilterSorter()\n },\n [createFilterSorter]\n )\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nconst TableCharacters = ({ items }: { items: SaveCharacter[] }) => {\n return (\n \n \n \n {items.map(item => (\n \n ))}\n \n
\n )\n}\n\nconst Characters = ({ items }: { items: SaveCharacter[] }) => {\n return (\n \n \n \n \n \n \n )\n}\n\nconst traitOptions = traitsIR.byIndex().map(item => ({ text: item.name, value: item.key }))\n\nconst FindCharacter = ({ save }: { save: Save }) => {\n const characters = useMemo(() => loadCharacters(save), [save])\n const [filterSorter, setFilterSorter] = useOptionalState()\n\n const filtered = useMemo(() => {\n if (characters && filterSorter) return filterSorter(characters)\n return characters\n }, [characters, filterSorter])\n\n const handleSetFilterSorter = useCallback(\n (filterSorter: FilterSorter) => {\n setFilterSorter((_: unknown) => filterSorter)\n },\n [setFilterSorter]\n )\n\n return (\n \n \n \n \n )\n}\n\nexport default FindCharacter\n","import { useOptionalState } from 'components/hooks'\nimport React from 'react'\nimport ExportPops from 'saves/ExportPops'\nimport FindCharacter from 'saves/FindCharacter'\nimport InputImportSave from 'saves/InputImportSave'\nimport { Save } from 'saves/types'\nimport { Tab } from 'semantic-ui-react'\n\nconst ExportTool = () => {\n const [save, setSave] = useOptionalState()\n const panes = save\n ? [\n {\n menuItem: 'Characters',\n render: () => \n },\n {\n menuItem: 'Pops',\n render: () => \n }\n ]\n : []\n\n return (\n <>\n \n \n \n )\n}\n\nexport default ExportTool\n","import React, { Component } from 'react'\nimport { connect, useSelector } from 'react-redux'\nimport { Modals, ModalType } from 'types'\nimport { AppState } from 'state'\nimport { closeModal } from 'reducers'\nimport { Modal } from 'semantic-ui-react'\n\nexport const useModalData = (type: T): Modals[T] => {\n return useSelector((state: AppState) => state.ui.modals[type])\n}\n\ntype Props = {\n type: ModalType\n basic?: boolean\n header?: string\n}\n\nclass BaseModal extends Component {\n shouldComponentUpdate(prevProps: IProps) {\n return !(!this.props.visible && !prevProps.visible)\n }\n\n render() {\n const { basic, visible, children, closeModal, header } = this.props\n return (\n closeModal()} open={visible} centered={false}>\n {header && {header}}\n {children}\n \n )\n }\n}\n\nconst mapStateToProps = (state: AppState, props: Props) => ({\n visible: !!state.ui.modals[props.type]\n})\n\nconst actions = { closeModal }\n\ntype S = ReturnType\ntype D = typeof actions\ninterface IProps extends React.PropsWithChildren, S, D {}\n\nexport default connect(mapStateToProps, actions)(BaseModal)\n","import React from 'react'\nimport { useDispatch } from 'react-redux'\nimport { ModalType, SideType } from 'types'\nimport { setPhaseDice, toggleRandomDice, setSeed } from 'reducers'\nimport { Table, Grid, Checkbox, Input, Header, InputOnChangeData } from 'semantic-ui-react'\nimport BaseModal, { useModalData } from './BaseModal'\nimport DelayedNumericInput from 'components/Detail/DelayedNumericInput'\nimport { mapRange } from 'utils'\nimport { useBattle, useSide } from 'selectors'\n\nconst RenderIsRollRandom = ({ sideType }: { sideType: SideType }) => {\n const dispatch = useDispatch()\n const side = useSide(sideType)\n\n const handleClick = () => {\n dispatch(toggleRandomDice(sideType))\n }\n\n return \n}\n\nconst RenderSeed = () => {\n const dispatch = useDispatch()\n const seed = useBattle().seed\n const handleOnChange = (_: unknown, { value }: InputOnChangeData): void => {\n if (!isNaN(Number(value))) dispatch(setSeed(Number(value)))\n }\n return \n}\n\nconst RenderPhase = ({ sideType, phase, roll }: { sideType: SideType; phase: number; roll: number }) => {\n const dispatch = useDispatch()\n const handleOnChange = (value: number) => {\n dispatch(setPhaseDice(sideType, phase, value))\n }\n return (\n \n Phase {phase + 1}\n \n \n \n \n )\n}\n\nconst RenderCustomRolls = ({ sideType }: { sideType: SideType }) => {\n const side = useSide(sideType)\n const rolls = side.rolls.concat(0)\n const rows = Math.ceil((rolls.length - 1) / 4)\n return (\n \n \n {mapRange(rows, row => (\n \n {mapRange(4, column => {\n const phase = row * 4 + column\n if (phase >= rolls.length) return \n return \n })}\n \n ))}\n \n
\n )\n}\n\nconst ModalDiceRolls = (): JSX.Element | null => {\n const data = useModalData(ModalType.DiceRolls)\n if (!data) return null\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n
Custom rolls (overrides randomization)
\n \n
\n
\n
\n )\n}\n\nexport default ModalDiceRolls\n","import React, { Component } from 'react'\nimport { Table } from 'semantic-ui-react'\n\ntype IProps = {\n onRemove: () => void\n}\n\n/** Component for removing items. */\nexport default class ItemRemover extends Component {\n render() {\n return (\n \n \n \n Remove\n \n \n
\n )\n }\n\n onClick = (): void => this.props.onRemove()\n}\n","export default __webpack_public_path__ + \"static/media/yes.14e7d594.png\";","export default __webpack_public_path__ + \"static/media/no.a8906086.png\";","import React, { Component } from 'react'\nimport { Button, Image } from 'semantic-ui-react'\n\nimport IconYes from 'images/yes.png'\nimport IconNo from 'images/no.png'\n\ninterface IProps {\n value: boolean\n onChange?: () => void\n}\n\nexport default class Toggle extends Component {\n render() {\n const { value, onChange } = this.props\n return (\n \n )\n }\n}\n","import React, { Component } from 'react'\nimport PaddedRow from '../Utils/PaddedRow'\nimport Toggle from '../Utils/Toggle'\n\ninterface IProps {\n text: string\n value: boolean\n onChange?: () => void\n cells: number\n stretch?: number\n}\n\nexport default class DetailToggleRow extends Component {\n render() {\n const { text, value, onChange, cells, stretch } = this.props\n return (\n \n {text}\n \n \n )\n }\n}\n","import React, { Component } from 'react'\nimport PaddedRow from '../Utils/PaddedRow'\n\ninterface IProps {\n text: string\n value: string | number\n cells: number\n stretch?: number\n}\n\nexport default class DetailTextRow extends Component {\n render() {\n const { text, value, cells, stretch } = this.props\n return (\n \n {text}\n {value}\n \n )\n }\n}\n","import React, { Component } from 'react'\nimport PaddedRow from '../Utils/PaddedRow'\nimport { Input } from '../Utils/Inputs'\n\ninterface IProps {\n text: string\n value: T\n onChange?: (value: T) => void\n cells: number\n stretch?: number\n}\n\nexport default class DetailInputRow extends Component> {\n render() {\n const { text, value, onChange, cells, stretch } = this.props\n return (\n \n {text}\n \n \n )\n }\n}\n","import React, { Component } from 'react'\nimport PaddedRow from '../Utils/PaddedRow'\nimport SimpleDropdown from '../Dropdowns/SimpleDropdown'\n\ninterface IProps {\n text: string\n values: T[]\n value: T\n onChange?: (value: T) => void\n cells: number\n stretch?: number\n}\n\nexport default class DetailDropdownRow extends Component> {\n render() {\n const { text, value, values, onChange, cells, stretch } = this.props\n return (\n \n {text}\n \n \n )\n }\n}\n","import React, { Component } from 'react'\nimport { Table } from 'semantic-ui-react'\n\nimport PaddedRow from './Utils/PaddedRow'\nimport DetailToggleRow from './Detail/DetailToggleRow'\nimport DetailTextRow from './Detail/DetailTextRow'\nimport DetailInputRow from './Detail/DetailInputRow'\nimport DetailDropdownRow from './Detail/DetailDropdownRow'\nimport Headers from './Utils/Headers'\nimport {\n Mode,\n ValuesType,\n CohortDefinition,\n UnitType,\n TerrainType,\n UnitRole,\n UnitAttribute,\n UnitValueType,\n unitValueToString,\n Setting,\n CombatPhase,\n isAttributeEnabled,\n CombatSharedSettings,\n getTerrainAttributes\n} from 'types'\nimport { values } from 'utils'\nimport { getValue, calculateValue, explain } from 'data_values'\nimport { toMaintenance } from 'formatters'\nimport DelayedNumericInput from './Detail/DelayedNumericInput'\n\ninterface IProps {\n mode: Mode\n settings: CombatSharedSettings\n customValueKey: string\n unit: CohortDefinition\n unitTypes?: UnitType[]\n unitTypesWithParent?: UnitType[]\n showStatistics: boolean\n terrainTypes?: TerrainType[]\n unitTypesAsDropdown?: boolean\n onCustomBaseValueChange: (key: string, attribute: UnitValueType, value: number) => void\n onCustomModifierValueChange: (key: string, attribute: UnitValueType, value: number) => void\n onCustomLossModifierValueChange: (key: string, attribute: UnitValueType, value: number) => void\n onTypeChange?: (type: UnitType) => void\n onParentChange?: (type: UnitType) => void\n onImageChange?: (image: string) => void\n onChangeDeployment?: (deployment: UnitRole) => void\n onIsLoyalToggle?: () => void\n}\n\n/**\n * Shows and allows changing unit details.\n */\nexport default class UnitDetail extends Component {\n readonly attributes = values(UnitAttribute)\n readonly units = values(UnitType).sort()\n readonly modes = values(Mode)\n readonly deployments = values(UnitRole)\n readonly headers = ['Attribute', 'Value', 'Custom base', 'Custom modifier', 'Custom losses', 'Explained']\n\n readonly CELLS = 6\n\n render() {\n const { unit, onTypeChange, onParentChange, onImageChange, onChangeDeployment, onIsLoyalToggle } = this.props\n const { terrainTypes, unitTypes, unitTypesWithParent, unitTypesAsDropdown, settings } = this.props\n const { type, mode, parent, image, role, isLoyal, culture, tech } = unit\n\n const terrains = terrainTypes && getTerrainAttributes(terrainTypes)\n return (\n \n \n \n {onTypeChange && unitTypes && unitTypesAsDropdown && (\n \n )}\n {onTypeChange && unitTypes && !unitTypesAsDropdown && (\n \n )}\n {mode && }\n {settings[Setting.Culture] && culture && }\n {settings[Setting.Tech] && tech && }\n {parent && unitTypesWithParent && onParentChange && (\n \n )}\n {onImageChange && }\n {onChangeDeployment && role && (\n \n )}\n {settings[Setting.AttributeLoyal] && (\n \n )}\n {this.attributes.map(attribute =>\n this.renderRow(\n attribute,\n this.allowBase(attribute),\n this.allowModifier(attribute),\n this.allowLoss(attribute)\n )\n )}\n {settings[Setting.CounteringDamage] > 0 &&\n unitTypes &&\n unitTypes.map(attribute => this.renderRow(attribute, true, false, false))}\n {settings[Setting.AttributeTerrainType] &&\n terrains &&\n terrains.map(attribute => this.renderRow(attribute, true, true, false))}\n {[CombatPhase.Fire, CombatPhase.Shock].map(attribute => this.renderRow(attribute, true, false, false))}\n \n
\n )\n }\n\n allowLoss = (attribute: UnitAttribute) => attribute === UnitAttribute.Morale || attribute === UnitAttribute.Strength\n\n allowModifier = (attribute: UnitAttribute) =>\n attribute === UnitAttribute.Morale ||\n attribute === UnitAttribute.Strength ||\n attribute === UnitAttribute.Maintenance ||\n attribute === UnitAttribute.Cost ||\n attribute === UnitAttribute.AttritionWeight\n\n allowBase = (attribute: UnitAttribute) => !this.allowModifier(attribute)\n\n renderRow = (attribute: UnitValueType, allowBase: boolean, allowModifier: boolean, allowLoss: boolean) => {\n const {\n unit,\n customValueKey,\n onCustomBaseValueChange,\n onCustomModifierValueChange,\n onCustomLossModifierValueChange: onCustomLossValueChange,\n settings,\n mode,\n showStatistics\n } = this.props\n if (!isAttributeEnabled(attribute, settings, mode, showStatistics)) return null\n const baseValue = getValue(ValuesType.Base, unit, attribute, customValueKey)\n const modifierValue = getValue(ValuesType.Modifier, unit, attribute, customValueKey)\n const lossValue = getValue(ValuesType.LossModifier, unit, attribute, customValueKey)\n let value = unitValueToString(unit, attribute)\n if (attribute === UnitAttribute.Maintenance)\n value +=\n ' (' +\n toMaintenance(calculateValue(unit, UnitAttribute.Cost) * calculateValue(unit, UnitAttribute.Maintenance)) +\n ')'\n\n return (\n \n {attribute}\n {value}\n {allowBase && (\n onCustomBaseValueChange(customValueKey, attribute, value)}\n />\n )}\n {allowModifier && (\n onCustomModifierValueChange(customValueKey, attribute, value)}\n />\n )}\n {allowLoss && (\n onCustomLossValueChange(customValueKey, attribute, value)}\n />\n )}\n {explain(unit, attribute)}\n \n )\n }\n}\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\n\nimport ItemRemover from 'components/ItemRemover'\nimport UnitDetail from 'components/UnitDetail'\n\nimport { AppState, getCohortForEachRound, getCohortDefinition } from 'state'\nimport {\n ValuesType,\n CountryName,\n UnitType,\n CohortDefinition,\n UnitAttribute,\n UnitValueType,\n Cohort,\n ModalType,\n CombatSharedSettings,\n ArmyName\n} from 'types'\nimport { addValue, addValues } from 'data_values'\nimport { deleteCohort, setCohortValue, changeCohortType, toggleCohortLoyality, closeModal } from 'reducers'\nimport { applyDynamicAttributes } from 'managers/units'\nimport BaseModal from './BaseModal'\nimport { toArr } from 'utils'\nimport { getCombatSettings, getMode, getTerrainTypes } from 'selectors'\nconst CUSTOM_VALUE_KEY = 'Unit'\n\nclass ModalCohortDetail extends Component {\n render() {\n const { mode, unitTypes, terrainTypes, cohort, settings } = this.props\n if (!cohort) return null\n return (\n \n \n \n \n )\n }\n\n removeUnit = () => {\n const { index, country, army, deleteCohort, closeModal } = this.props\n deleteCohort(country, army, index)\n closeModal()\n }\n\n setBaseValue = (key: string, attribute: UnitValueType, value: number) => {\n const { country, index, army, setCohortValue } = this.props\n setCohortValue(country, army, index, ValuesType.Base, key, attribute, value)\n }\n\n setModifierValue = (key: string, attribute: UnitValueType, value: number) => {\n const { country, index, army, setCohortValue } = this.props\n setCohortValue(country, army, index, ValuesType.Modifier, key, attribute, value)\n }\n\n setLossModifierValue = (key: string, attribute: UnitValueType, value: number) => {\n const { country, index, army, setCohortValue } = this.props\n setCohortValue(country, army, index, ValuesType.LossModifier, key, attribute, value)\n }\n\n changeType = (type: UnitType) => {\n const { country, index, army, changeCohortType } = this.props\n changeCohortType(country, army, index, type)\n }\n\n toggleIsLoyal = () => {\n const { country, index, army, toggleCohortLoyality } = this.props\n toggleCohortLoyality(country, army, index)\n }\n}\n\nconst convertCohort = (\n settings: CombatSharedSettings,\n definition: CohortDefinition | null,\n rounds: (Cohort | null)[]\n): CohortDefinition | null => {\n if (!definition) return null\n rounds.forEach((combat, round) => {\n if (!combat || !definition) return\n const lossValues: [string, number][] = [\n [UnitAttribute.Morale, combat.state.moraleLoss],\n [UnitAttribute.Strength, combat.state.strengthLoss]\n ]\n const dealtValues: [string, number][] = [\n [UnitAttribute.MoraleDepleted, combat.state.moraleDealt],\n [UnitAttribute.StrengthDepleted, combat.state.strengthDealt]\n ]\n definition = addValues(definition, ValuesType.Loss, 'Round ' + round, lossValues)\n definition = addValues(definition, ValuesType.Base, 'Round ' + round, dealtValues)\n if (round === rounds.length - 1) {\n definition = addValue(\n definition,\n ValuesType.Gain,\n 'Winning',\n UnitAttribute.Morale,\n combat.properties.winningMoraleBonus\n )\n definition = addValue(\n definition,\n ValuesType.LossModifier,\n 'Late deployment',\n UnitAttribute.Morale,\n combat.properties.deploymentPenalty\n )\n definition = addValue(\n definition,\n ValuesType.LossModifier,\n 'Non-secondary reinforcement',\n UnitAttribute.Morale,\n combat.properties.reinforcementPenalty\n )\n }\n })\n return applyDynamicAttributes(definition, settings)\n}\n\nconst mapStateToProps = (state: AppState) => {\n const data = state.ui.modals[ModalType.CohortDetail]\n const settings = getCombatSettings(state)\n const mode = getMode(state)\n if (data) {\n const cohort = getCohortDefinition(state, data.country, data.army, data.index)\n if (cohort) {\n return {\n index: data.index,\n terrainTypes: getTerrainTypes(state, undefined),\n country: data.country,\n army: data.army,\n unitTypes: toArr(state.countries[CountryName.Country1].units, unit => unit.type),\n mode,\n cohort: convertCohort(\n settings,\n cohort,\n getCohortForEachRound(state, data.side, data.participantIndex, data.index)\n ),\n settings\n }\n }\n }\n return {\n index: 0,\n terrainTypes: getTerrainTypes(state, undefined),\n country: CountryName.Country1,\n army: ArmyName.Army,\n mode,\n settings,\n cohort: null,\n unitTypes: []\n }\n}\n\nconst actions = { deleteCohort, setCohortValue, changeCohortType, toggleCohortLoyality, closeModal }\n\ntype S = ReturnType\ntype D = typeof actions\ninterface IProps extends S, D {}\n\nexport default connect(mapStateToProps, actions)(ModalCohortDetail)\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport {\n ValuesType,\n CountryName,\n UnitType,\n CohortDefinition,\n UnitRole,\n UnitValueType,\n ModalType,\n ArmyName\n} from 'types'\nimport UnitDetail from 'components/UnitDetail'\nimport { AppState, getUnitDefinition, getUnitTypeList } from 'state'\nimport {\n openModal,\n changeUnitType,\n deleteUnit,\n setUnitValue,\n changeUnitImage,\n changeParent,\n changeUnitDeployment,\n toggleUnitLoyality,\n closeModal\n} from 'reducers'\nimport BaseModal from './BaseModal'\nimport { getRootParent } from 'managers/units'\nimport ItemRemover from 'components/ItemRemover'\nimport { getTerrainTypes, getMode, getCombatSettings } from 'selectors'\n\nconst CUSTOM_VALUE_KEY = 'Custom'\n\nclass ModalUnitDetail extends Component {\n render() {\n const { mode, unit, settings, remove, unitType, unitTypesWithParent, terrainTypes, unitTypes } = this.props\n if (!unit) return null\n return (\n \n {remove && unitType !== getRootParent(mode) ? : null}\n \n \n )\n }\n\n changeType = (type: UnitType) => {\n const { country, army, changeUnitType, unitType, openModal } = this.props\n changeUnitType(country, unitType, type)\n openModal(ModalType.UnitDetail, { country, army, type })\n }\n\n remove = () => {\n const { country, deleteUnit, unitType, closeModal } = this.props\n deleteUnit(country, unitType)\n closeModal()\n }\n\n setBaseValue = (key: string, attribute: UnitValueType, value: number) =>\n this.setValue(ValuesType.Base, key, attribute, value)\n setModifierValue = (key: string, attribute: UnitValueType, value: number) =>\n this.setValue(ValuesType.Modifier, key, attribute, value)\n setLossModifierValue = (key: string, attribute: UnitValueType, value: number) =>\n this.setValue(ValuesType.LossModifier, key, attribute, value)\n\n setValue = (type: ValuesType, key: string, attribute: UnitValueType, value: number) => {\n const { setUnitValue, unitType, country } = this.props\n setUnitValue(country, unitType, type, key, attribute, value)\n }\n\n changeImage = (image: string) => {\n const { changeUnitImage, unitType, country } = this.props\n changeUnitImage(country, unitType, image)\n }\n\n changeParent = (type: UnitType) => {\n const { changeParent, unitType, country } = this.props\n changeParent(country, unitType, type)\n }\n\n changeDeployment = (deployment: UnitRole) => {\n const { changeUnitDeployment, unitType, country } = this.props\n changeUnitDeployment(country, unitType, deployment)\n }\n\n toggleIsLoyal = () => {\n const { toggleUnitLoyality, unitType, country } = this.props\n toggleUnitLoyality(country, unitType)\n }\n}\n\nconst mapStateToProps = (state: AppState) => {\n const data = state.ui.modals[ModalType.UnitDetail]\n return {\n remove: data?.remove,\n country: data ? data.country : CountryName.Country1,\n army: data ? data.army : ArmyName.Army,\n unitType: data ? data.type : UnitType.Land,\n unit: data ? getUnitDefinition(state, data.type, data.country) : null,\n unitTypes: getUnitTypeList(state, true, data?.country),\n unitTypesWithParent: getUnitTypeList(state, false, data?.country).filter(type => type !== data?.type),\n terrainTypes: getTerrainTypes(state, undefined),\n mode: getMode(state),\n settings: getCombatSettings(state)\n }\n}\n\nconst actions = {\n closeModal,\n openModal,\n deleteUnit,\n changeUnitType,\n setUnitValue,\n changeUnitImage,\n changeParent,\n changeUnitDeployment,\n toggleUnitLoyality\n}\n\ntype S = ReturnType\ntype D = typeof actions\ninterface IProps extends S, D {}\n\nexport default connect(mapStateToProps, actions)(ModalUnitDetail)\n","import React, { Component } from 'react'\nimport { Table } from 'semantic-ui-react'\n\nimport PaddedRow from './Utils/PaddedRow'\nimport DetailInputRow from './Detail/DetailInputRow'\nimport DetailDropdownRow from './Detail/DetailDropdownRow'\nimport { Input } from './Utils/Inputs'\nimport Headers from './Utils/Headers'\n\nimport {\n ValuesType,\n TerrainData,\n TerrainType,\n LocationType,\n TerrainCalc,\n TerrainValueType,\n terrainValueToString\n} from 'types'\nimport { values } from 'utils'\nimport { getValue, explainShort } from 'data_values'\n\ninterface IProps {\n customValueKey: string\n terrain: TerrainData\n onCustomValueChange: (key: string, attribute: TerrainValueType, value: number) => void\n onTypeChange: (type: TerrainType) => void\n onLocationChange: (location: LocationType) => void\n onImageChange: (image: string) => void\n}\n\n// Display component for showing and changing terrain details.\nexport default class TerrainDetail extends Component {\n readonly attributes = values(TerrainCalc)\n readonly locations = values(LocationType)\n readonly headers = ['Attribute', 'Value', 'Custom value', 'Explained']\n\n readonly CELLS = 4\n\n render() {\n const { terrain, onTypeChange, onImageChange, onLocationChange } = this.props\n const { type, image, location } = terrain\n return (\n \n \n \n \n \n \n {this.attributes.map(value => this.renderRow(terrain, value))}\n \n
\n )\n }\n\n renderRow = (terrain: TerrainData, attribute: TerrainValueType) => {\n const { customValueKey, onCustomValueChange } = this.props\n const value = getValue(ValuesType.Base, terrain, attribute, customValueKey)\n\n return (\n \n {attribute}\n {terrainValueToString(terrain, attribute)}\n onCustomValueChange(customValueKey, attribute, Number(value))}\n />\n {explainShort(terrain, attribute)}\n \n )\n }\n}\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport { AppState } from 'state'\nimport TerrainDetail from 'components/TerrainDetail'\nimport { TerrainType, LocationType, TerrainValueType, ModalType } from 'types'\nimport {\n setTerrainLocation,\n setTerrainImage,\n setTerrainType,\n setTerrainValue,\n deleteTerrain,\n closeModal\n} from 'reducers'\nimport BaseModal from './BaseModal'\nimport ItemRemover from 'components/ItemRemover'\nimport { getMode } from 'selectors'\n\nconst CUSTOM_VALUE_KEY = 'Custom'\n\nclass ModalTerrainDetail extends Component {\n render() {\n const { terrain } = this.props\n return (\n \n \n \n \n )\n }\n\n delete = () => {\n const { type, deleteTerrain, closeModal } = this.props\n deleteTerrain(type)\n closeModal()\n }\n setValue = (key: string, attribute: TerrainValueType, value: number) => {\n const { type, setTerrainValue } = this.props\n setTerrainValue(type, key, attribute, value)\n }\n setType = (newType: TerrainType) => {\n const { type, setTerrainType } = this.props\n setTerrainType(type, newType)\n }\n setLocation = (location: LocationType) => {\n const { type, setTerrainLocation } = this.props\n setTerrainLocation(type, location)\n }\n setImage = (image: string) => {\n const { type, setTerrainImage } = this.props\n setTerrainImage(type, image)\n }\n}\n\nconst mapStateToProps = (state: AppState) => {\n const type = state.ui.modals[ModalType.TerrainDetail]?.type ?? TerrainType.None\n return {\n type,\n terrain: state.terrains[type],\n mode: getMode(state)\n }\n}\n\nconst actions = {\n setTerrainLocation,\n setTerrainImage,\n setTerrainType,\n setTerrainValue,\n deleteTerrain,\n closeModal\n}\n\ntype S = ReturnType\ntype D = typeof actions\ninterface IProps extends S, D {}\n\nexport default connect(mapStateToProps, actions)(ModalTerrainDetail)\n","import React, { Component } from 'react'\nimport { Table } from 'semantic-ui-react'\n\nimport { Input } from './Utils/Inputs'\nimport Headers from './Utils/Headers'\nimport DetailDropdownRow from './Detail/DetailDropdownRow'\nimport DetailInputRow from './Detail/DetailInputRow'\nimport Images from './Utils/Images'\nimport { Mode, ValuesType, TacticType, UnitType, TacticData, TacticCalc, TacticValueType } from 'types'\nimport { values, getImage } from 'utils'\nimport { getValue, calculateValue, explainShort } from 'data_values'\nimport { toSignedPercent, toPercent } from 'formatters'\n\ninterface IProps {\n tactics: TacticData[]\n tactic: TacticData\n unitTypes: UnitType[]\n images: { [key in UnitType]: string[] }\n customValueKey: string\n onCustomValueChange: (key: string, attribute: TacticValueType, value: number) => void\n onTypeChange: (type: TacticType) => void\n onImageChange: (image: string) => void\n onModeChange: (mode: Mode) => void\n}\n\n/**\n * Shows and allows changing tactic properties.\n */\nexport default class TacticDetail extends Component {\n readonly attributes = values(TacticCalc)\n readonly modes = values(Mode)\n readonly headers = ['Attribute', 'Value', 'Custom value', 'Explained']\n\n readonly CELLS = 4\n\n render() {\n const { tactic, unitTypes, onTypeChange, onModeChange, onImageChange, images, tactics } = this.props\n const { type, mode, image } = tactic\n return (\n \n \n \n \n \n \n {unitTypes.map(type => this.renderRow(tactic, type, false, images[type]))}\n {tactics.map(value => this.renderRow(tactic, value.type, true, [getImage(value)]))}\n {this.attributes.map(value => this.renderRow(tactic, value, true, [getImage(null)]))}\n \n
\n )\n }\n\n renderRow = (tactic: TacticData, attribute: TacticValueType, relative: boolean, images: string[]) => {\n const { customValueKey, onCustomValueChange } = this.props\n const baseValue = getValue(ValuesType.Base, tactic, attribute, customValueKey)\n const value = calculateValue(tactic, attribute)\n\n return (\n \n \n \n {attribute}\n \n {relative ? toSignedPercent(value) : toPercent(value)}\n \n onCustomValueChange(customValueKey, attribute, Number(value))}\n />\n \n {explainShort(tactic, attribute)}\n \n )\n }\n}\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport { AppState, getUnitImages, mergeUnitTypes } from 'state'\nimport TacticDetail from 'components/TacticDetail'\nimport { Mode, TacticType, TacticValueType, ModalType } from 'types'\nimport { setTacticValue, setTacticImage, setTacticMode, deleteTactic, closeModal, setTacticType } from 'reducers'\nimport BaseModal from './BaseModal'\nimport ItemRemover from 'components/ItemRemover'\nimport { getTacticsData } from 'selectors'\nimport { toArr } from 'utils'\n\nconst CUSTOM_VALUE_KEY = 'Custom'\n\nclass ModalTacticDetail extends Component {\n render() {\n const { tactic, images, tactics, unitTypes } = this.props\n return (\n \n \n \n \n )\n }\n\n delete = () => {\n const { type, deleteTactic, closeModal } = this.props\n deleteTactic(type)\n closeModal()\n }\n setValue = (key: string, attribute: TacticValueType, value: number) => {\n const { type, setTacticValue } = this.props\n setTacticValue(type, key, attribute, value)\n }\n setType = (newType: TacticType) => {\n const { type, setTacticType } = this.props\n setTacticType(type, newType)\n }\n setImage = (image: string) => {\n const { type, setTacticImage } = this.props\n setTacticImage(type, image)\n }\n setMode = (mode: Mode) => {\n const { type, setTacticMode } = this.props\n setTacticMode(type, mode)\n }\n}\n\nconst mapStateToProps = (state: AppState) => {\n const type = state.ui.modals[ModalType.TacticDetail]?.type ?? TacticType.Bottleneck\n return {\n type,\n tactic: state.tactics[type],\n tactics: toArr(getTacticsData(state)),\n images: getUnitImages(state),\n unitTypes: mergeUnitTypes(state)\n }\n}\n\nconst actions = { setTacticValue, setTacticImage, setTacticMode, deleteTactic, closeModal, setTacticType }\n\ntype S = ReturnType\ntype D = typeof actions\ninterface IProps extends S, D {}\n\nexport default connect(mapStateToProps, actions)(ModalTacticDetail)\n","import React, { Component } from 'react'\nimport { Input, Grid, Button } from 'semantic-ui-react'\nimport { AppState } from 'state'\nimport { ModalType } from 'types'\nimport { closeModal } from 'reducers'\nimport { connect } from 'react-redux'\nimport BaseModal from './BaseModal'\nimport { noop } from 'lodash'\n\ntype IState = {\n value: string\n}\n\n/**\n * Component for setting a value in a modal.\n */\nclass ModalValue extends Component {\n constructor(props: IProps) {\n super(props)\n this.state = { value: props.initial }\n }\n\n static getDerivedStateFromProps(props: IProps) {\n return { value: props.initial }\n }\n\n render() {\n const { message, buttonMessage } = this.props\n const { value } = this.state\n return (\n \n \n \n this.setState({ value })} />\n \n \n \n \n \n \n )\n }\n\n onSuccess = () => {\n const { onSuccess, closeModal } = this.props\n const { value } = this.state\n if (value) onSuccess(value)\n closeModal()\n }\n}\n\nconst mapStateToProps = (state: AppState) => {\n const data = state.ui.modals[ModalType.Value]\n return {\n message: data?.message ?? '',\n onSuccess: data?.onSuccess ?? noop,\n initial: data?.initial ?? '',\n buttonMessage: data?.buttonMessage ?? ''\n }\n}\n\nconst actions = { closeModal }\n\ntype S = ReturnType\ntype D = typeof actions\ninterface IProps extends S, D {}\n\nexport default connect(mapStateToProps, actions)(ModalValue)\n","import React, { Component } from 'react'\nimport ModalDiceRolls from 'containers/modal/ModalDiceRolls'\nimport ModalCohortDetail from 'containers/modal/ModalCohortDetail'\nimport ModalUnitDetail from 'containers/modal/ModalUnitDetail'\nimport ModalTerrainDetail from 'containers/modal/ModalTerrainDetail'\nimport ModalTacticDetail from 'containers/modal/ModalTacticDetail'\nimport ModalValue from 'containers/modal/ModalValue'\n\n/**\n * Global component for modals.\n */\nexport default class Modals extends Component {\n render() {\n return (\n <>\n \n \n \n \n \n \n \n )\n }\n}\n","import * as React from 'react'\nimport { Provider } from 'react-redux'\nimport { Store } from 'redux'\nimport { BrowserRouter, Route } from 'react-router-dom'\nimport { PersistGate } from 'redux-persist/integration/react'\nimport Definitions from './pages/Definitions'\nimport Battle from './pages/Battle'\nimport Navigation from './pages/Navigation'\nimport CountriesIR from './pages/CountriesIR'\nimport CountriesEU4 from './pages/CountriesEU4'\nimport Settings from './pages/Settings'\nimport Error from './pages/Error'\nimport { AppState } from 'state'\nimport Analyze from './pages/Analyze'\nimport SaveTool from 'pages/SaveTool'\nimport ExportTool from 'pages/ExportTool'\nimport { Container } from 'semantic-ui-react'\nimport Modals from 'pages/Modals'\nimport { Persistor } from 'redux-persist'\n\n// Any additional component props go here.\ninterface MainProps {\n store: Store\n persistor: Persistor\n}\n\n// Create an intersection type of the component props and our Redux props.\nconst Root = ({ store, persistor }: MainProps) => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n )\n}\n\nexport default Root\n","import { createStore } from 'redux'\nimport { devToolsEnhancer } from 'redux-devtools-extension'\nimport {\n rootReducer,\n restoreDefaultTactics,\n restoreDefaultTerrains,\n restoreDefaultUnits,\n stripRounds,\n restoreDefaultSettings,\n AppState\n} from 'state'\nimport { persistStore, persistReducer, createTransform, createMigrate } from 'redux-persist'\nimport storage from 'redux-persist/lib/storage'\nimport { map } from 'utils'\nimport { CountryDefinitions, ModeState, Settings, TacticsData, TerrainsData } from 'types'\nimport { initialize } from 'managers/combat'\nimport { PersistPartial } from 'redux-persist/es/persistReducer'\nimport { Reducer } from 'react'\nimport { Action } from 'reducers/utils'\n\nconst TacticsTransform = createTransform(\n inboundState => inboundState,\n (outboundState: TacticsData) => restoreDefaultTactics(outboundState),\n { whitelist: ['tactics'] }\n)\n\nconst TerrainsTransform = createTransform(\n inboundState => inboundState,\n (outboundState: TerrainsData) => restoreDefaultTerrains(outboundState),\n { whitelist: ['terrains'] }\n)\n\nconst BattleTransform = createTransform(\n (inboundState: ModeState) => stripRounds(inboundState),\n outboundState => outboundState,\n { whitelist: ['battle'] }\n)\n\nconst CountriesTransform = createTransform(\n inboundState => inboundState,\n (outboundState: CountryDefinitions) =>\n map(outboundState, country => ({ ...country, units: restoreDefaultUnits(country.units) })),\n { whitelist: ['countries'] }\n)\n\nconst SettingsTransform = createTransform(\n inboundState => inboundState,\n (outboundState: Settings) => restoreDefaultSettings(outboundState),\n { whitelist: ['settings'] }\n)\n\nconst migrations = {\n 11: () => rootReducer(undefined, { type: 'dummy' }) as never\n}\n\nconst persistConfig = {\n key: 'primary',\n storage: storage,\n version: 11,\n migrate: createMigrate(migrations, { debug: false }),\n transforms: [TacticsTransform, TerrainsTransform, BattleTransform, CountriesTransform, SettingsTransform]\n}\n\nconst persistedReducer = persistReducer(persistConfig, rootReducer)\n\ntype State = (AppState & PersistPartial) | undefined\n\nconst reducer: Reducer = (state, action) => {\n const result = persistedReducer(state, action) as State\n return initialize(result) as State\n}\n\nexport default function configureStore() {\n const store = createStore(reducer as never, devToolsEnhancer({}))\n const persistor = persistStore(store)\n return { store, persistor }\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport 'semantic-ui-css/semantic.min.css'\nimport './index.css'\nimport Main from './Root'\nimport configureStore from './store'\n\nconst store = configureStore()\n\nReactDOM.render(
, document.getElementById('root'))\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { toNumber, toPercent } from './formatters'\nimport { round, map, filter, forEach, filterKeys } from './utils'\nimport { merge, has, size } from 'lodash'\n\nexport enum ValuesType {\n Base = 'Base',\n Modifier = 'Modifier',\n Loss = 'Loss',\n Gain = 'Gain',\n LossModifier = 'LossModifier'\n}\n\ntype BD = DataValues\n\ntype ValuesSub = { [key: string]: number }\ntype Values = { [key in S]: ValuesSub }\n\nexport interface DataValues {\n baseValues?: Values\n modifierValues?: Values\n gainValues?: Values\n lossValues?: Values\n lossModifierValues?: Values\n}\n\nconst initValues = () => ({} as Values)\n\n/**\n * Merges base, modifier and loss values of given definitions. Returns the first definition (if defined), otherwise the second definition.\n * @param definition Returned definition with base values from to_merge.\n * @param toMerge Only returned if other parameter is not defined.\n */\nexport const mergeValues = (\n definition: D1,\n toMerge: D2\n): D1 & D2 => {\n const baseValues = initValues()\n if (definition && definition.baseValues) merge(baseValues, definition.baseValues)\n if (toMerge && toMerge.baseValues) merge(baseValues, toMerge.baseValues)\n const modifierValues = initValues()\n if (definition && definition.modifierValues) merge(modifierValues, definition.modifierValues)\n if (toMerge && toMerge.modifierValues) merge(modifierValues, toMerge.modifierValues)\n const gainValues = initValues()\n if (definition && definition.gainValues) merge(gainValues, definition.gainValues)\n if (toMerge && toMerge.gainValues) merge(gainValues, toMerge.gainValues)\n const lossValues = initValues()\n if (definition && definition.lossValues) merge(lossValues, definition.lossValues)\n if (toMerge && toMerge.lossValues) merge(lossValues, toMerge.lossValues)\n const lossModifierValues = initValues()\n if (definition && definition.lossModifierValues) merge(lossModifierValues, definition.lossModifierValues)\n if (toMerge && toMerge.lossModifierValues) merge(lossModifierValues, toMerge.lossModifierValues)\n return { ...toMerge, ...definition, baseValues, modifierValues, lossValues, gainValues, lossModifierValues }\n}\n\n/**\n * Merges all values under a given key.\n */\nexport const shrinkValues = (definition: D, key: string): D => {\n return {\n ...definition,\n baseValues:\n definition.baseValues &&\n map(definition.baseValues, (_, attribute) => ({ [key]: calculateBase(definition, attribute) })),\n modifierValues:\n definition.modifierValues &&\n map(definition.modifierValues, (_, attribute) => ({ [key]: calculateModifier(definition, attribute) })),\n lossModifierValues:\n definition.lossModifierValues &&\n map(definition.lossModifierValues, (_, attribute) => ({ [key]: calculateLossModifier(definition, attribute) })),\n lossValues:\n definition.lossValues &&\n map(definition.lossValues, (_, attribute) => ({ [key]: calculateLoss(definition, attribute) })),\n gainValues:\n definition.gainValues &&\n map(definition.gainValues, (_, attribute) => ({ [key]: calculateLoss(definition, attribute) }))\n }\n}\n\n/**\n * Adds base, modifier or loss values.\n */\nexport const addValues = (\n definition: D,\n type: ValuesType,\n key: string,\n values: [string, number][]\n): D => {\n if (type === ValuesType.Base) return { ...definition, baseValues: subAddValues(definition.baseValues, key, values) }\n if (type === ValuesType.Modifier)\n return { ...definition, modifierValues: subAddValues(definition.modifierValues, key, values) }\n if (type === ValuesType.Gain) return { ...definition, gainValues: subAddValues(definition.gainValues, key, values) }\n if (type === ValuesType.Loss) return { ...definition, lossValues: subAddValues(definition.lossValues, key, values) }\n if (type === ValuesType.LossModifier)\n return { ...definition, lossModifierValues: subAddValues(definition.lossModifierValues, key, values) }\n return definition\n}\n\nexport const addValue = (\n definition: D,\n type: ValuesType,\n key: string,\n attribute: string,\n value: number\n): D => {\n if (type === ValuesType.Base)\n return { ...definition, baseValues: subAddValues(definition.baseValues, key, [[attribute, value]]) }\n if (type === ValuesType.Modifier)\n return { ...definition, modifierValues: subAddValues(definition.modifierValues, key, [[attribute, value]]) }\n if (type === ValuesType.Gain)\n return { ...definition, gainValues: subAddValues(definition.gainValues, key, [[attribute, value]]) }\n if (type === ValuesType.Loss)\n return { ...definition, lossValues: subAddValues(definition.lossValues, key, [[attribute, value]]) }\n if (type === ValuesType.LossModifier)\n return { ...definition, lossModifierValues: subAddValues(definition.lossModifierValues, key, [[attribute, value]]) }\n return definition\n}\n\nexport const addValuesWithMutate = (\n definition: D,\n type: ValuesType,\n key: string,\n values: [string, number][]\n) => {\n if (type === ValuesType.Base) definition.baseValues = subAddValues(definition.baseValues, key, values)\n if (type === ValuesType.Modifier) definition.modifierValues = subAddValues(definition.modifierValues, key, values)\n if (type === ValuesType.Gain) definition.gainValues = subAddValues(definition.gainValues, key, values)\n if (type === ValuesType.Loss) definition.lossValues = subAddValues(definition.lossValues, key, values)\n if (type === ValuesType.LossModifier)\n definition.lossModifierValues = subAddValues(definition.lossModifierValues, key, values)\n}\n\n/**\n * Shared implementation for adding base, modifier or loss values.\n * @param container Base, modifier or loss values.\n * @param key Identifier for the values. Previous values get replaced.\n * @param values A list of [attribute, value] pairs.\n */\nconst subAddValues = (\n container: Values | undefined,\n key: string,\n values: [A, number][]\n): Values => {\n let newValues = container ? container : initValues()\n for (const [attribute, value] of values) {\n if (!has(newValues, attribute) && value === 0) continue\n if (!has(newValues, attribute)) newValues = { ...newValues, [attribute]: {} }\n if (value === 0 && has(newValues[attribute], key))\n newValues = { ...newValues, [attribute]: filter(newValues[attribute], (_, k) => k !== key) }\n else if (value !== 0) newValues = { ...newValues, [attribute]: { ...newValues[attribute], [key]: value } }\n }\n return newValues\n}\n\n/**\n * Clears base, modifier and loss values with a given key.\n */\nexport const clearAllValues = (definition: D, key: string): D => {\n return {\n ...definition,\n baseValues: subClearValues(definition.baseValues, key),\n modifierValues: subClearValues(definition.modifierValues, key),\n gainValues: subClearValues(definition.gainValues, key),\n lossValues: subClearValues(definition.lossValues, key),\n lossModifierValues: subClearValues(definition.lossModifierValues, key)\n }\n}\n\n/**\n * Clears base, modifier and loss values with a given key.\n */\nexport const clearAllValuesWithMutate = (definition: D, key: string) => {\n definition.baseValues = subClearValues(definition.baseValues, key)\n definition.modifierValues = subClearValues(definition.modifierValues, key)\n definition.gainValues = subClearValues(definition.gainValues, key)\n definition.lossValues = subClearValues(definition.lossValues, key)\n definition.lossModifierValues = subClearValues(definition.lossModifierValues, key)\n}\n\n/**\n * Clears base, modifier or loss values with a given key.\n */\nexport const clearValues = (definition: D, type: ValuesType, key: string): D => {\n if (type === ValuesType.Base) return { ...definition, baseValues: subClearValues(definition.baseValues, key) }\n const any = definition as any\n if (type === ValuesType.Modifier) return { ...definition, modifierValues: subClearValues(any.modifierValues, key) }\n if (type === ValuesType.Gain) return { ...definition, gainValues: subClearValues(any.gainValues, key) }\n if (type === ValuesType.Loss) return { ...definition, lossValues: subClearValues(any.lossValues, key) }\n if (type === ValuesType.LossModifier)\n return { ...definition, lossModifierValues: subClearValues(any.lossModifierValues, key) }\n return definition\n}\n\nexport const clearValuesWithMutate = (definition: D, type: ValuesType, key: string) => {\n if (type === ValuesType.Base) definition.baseValues = subClearValues(definition.baseValues, key)\n const any = definition as any\n if (type === ValuesType.Modifier) definition.modifierValues = subClearValues(any.modifierValues, key)\n if (type === ValuesType.Gain) definition.gainValues = subClearValues(any.gainValues, key)\n if (type === ValuesType.Loss) definition.lossValues = subClearValues(any.lossValues, key)\n if (type === ValuesType.LossModifier) definition.lossModifierValues = subClearValues(any.lossModifierValues, key)\n}\n\n/**\n * Shared implementation for clearing base, modifier or loss values.\n * @param container Base, modifier or loss values.\n * @param key Identifier for the values to remove.\n */\nconst subClearValues = (container: Values | undefined, key: string): Values => {\n if (container) return map(container, attribute => filter(attribute, (_, attributeKey) => attributeKey !== key))\n return initValues()\n}\n\n/**\n * Adds base, modifier or loss values while clearing previous ones.\n */\nexport const regenerateValues = (\n definition: D,\n type: ValuesType,\n key: string,\n values: [A, number][]\n) => {\n clearValuesWithMutate(definition, type, key)\n addValuesWithMutate(definition, type, key, values)\n}\n\n// This precision is required for accurate morale calculations.\nconst PRECISION = 100000.0\n\n/**\n * Returns values of a given key.\n * @param definition\n * @param key\n */\nexport const filterValues = (definition: D, key: string): D => {\n return {\n ...definition,\n baseValues: subFilterValues(definition.baseValues, key),\n modifierValues: subFilterValues(definition.modifierValues, key),\n gainValues: subFilterValues(definition.gainValues, key),\n lossValues: subFilterValues(definition.lossValues, key),\n lossModifierValues: subFilterValues(definition.lossModifierValues, key)\n }\n}\n\nconst subFilterValues = (values: Values | undefined, filterKey: string) =>\n values && map(values, attribute => filterKeys(attribute, key => key === filterKey))\n\n/**\n * Calculates the value of an attribute. Includes base, modifier and loss values.\n * @param definition\n * @param attribute\n */\nexport const calculateValue = (definition: D | undefined, attribute: A): number => {\n if (!definition) return 0.0\n const value =\n calculateBase(definition, attribute) *\n (1 + calculateModifier(definition, attribute)) *\n (1 - calculateLossModifier(definition, attribute)) -\n calculateLoss(definition, attribute)\n return round(value, PRECISION)\n}\n\n/**\n * Calculates the value of an attribute, without losses.\n * @param definition\n * @param attribute\n */\nexport const calculateValueWithoutLoss = (\n definition: D | undefined,\n attribute: A\n): number => {\n if (!definition) return 0.0\n const value =\n calculateBase(definition, attribute) * (1 + calculateModifier(definition, attribute)) +\n calculateGain(definition, attribute)\n return round(value, PRECISION)\n}\n\n/**\n * Calculates the base value of an attribute.\n * @param definition\n * @param attribute\n */\nexport const calculateBase = (definition: D, attribute: A): number =>\n calculateValueSub(definition.baseValues, attribute)\n\n/**\n * Calculates the modifier value of an attribute.\n * @param definition\n * @param attribute\n */\nexport const calculateModifier = (definition: D, attribute: A): number =>\n calculateValueSub(definition.modifierValues, attribute)\n\n/**\n * Calculates the gain value of an attribute.\n * @param definition\n * @param attribute\n */\nexport const calculateGain = (definition: D, attribute: A): number =>\n calculateValueSub(definition.gainValues, attribute)\n\n/**\n * Calculates the loss value of an attribute.\n * @param definition\n * @param attribute\n */\nexport const calculateLoss = (definition: D, attribute: A): number =>\n calculateValueSub(definition.lossValues, attribute)\n\n/**\n * Calculates the loss modifier value of an attribute.\n * @param definition\n * @param attribute\n */\nexport const calculateLossModifier = (definition: D, attribute: A): number =>\n calculateValueSub(definition.lossModifierValues, attribute)\n\n/**\n * Shared implementation for calculating the value of an attribute.\n * @param container\n * @param attribute\n * @param initial Initial value. For example modifiers have 1.0.\n */\nconst calculateValueSub = (container: Values | undefined, attribute: A): number => {\n let result = 0\n if (!container) return result\n const values = container[attribute]\n if (values) forEach(values, value => (result += value))\n return round(result, PRECISION)\n}\n\n/**\n * Shared implementation to get values. Zero is returned for missing values because values with zero are not stored.\n * @param container\n * @param attribute\n * @param key\n */\nexport const getValue = (\n type: ValuesType,\n definition: D,\n attribute: A,\n key: string\n): number => {\n const container = getContainer(type, definition)\n const values = container[attribute]\n if (!values) return 0.0\n const value = values[key]\n if (!value) return 0.0\n return value\n}\n\nconst getContainer = (type: ValuesType, definition: D): Values => {\n if (type === ValuesType.Modifier) return definition.modifierValues ?? {}\n if (type === ValuesType.Gain) return definition.gainValues ?? {}\n if (type === ValuesType.Loss) return definition.lossValues ?? {}\n if (type === ValuesType.LossModifier) return definition.lossModifierValues ?? {}\n return definition.baseValues ?? {}\n}\n\n/**\n * Returns a short explanations of a given attribute. Only checks base values.\n * @param definition\n * @param attribute\n */\nexport const explainShort = (definition: D, attribute: A): string => {\n if (!definition.baseValues) return ''\n const valueBase = definition.baseValues[attribute]\n let explanation = ''\n if (valueBase) {\n forEach(valueBase, (value, key) => (explanation += key.replace(/_/g, ' ') + ': ' + value + ', '))\n explanation = explanation.substring(0, explanation.length - 2)\n }\n return explanation\n}\n\n/**\n * Returns an explanation of a given attribute.\n * @param definition\n * @param attribute\n */\nexport const explain = (definition: D, attribute: A): string => {\n const valueModifier = definition.modifierValues ? definition.modifierValues[attribute] : undefined\n const valueGain = definition.gainValues ? definition.gainValues[attribute] : undefined\n const valueLoss = definition.lossValues ? definition.lossValues[attribute] : undefined\n const valueLossModifier = definition.lossModifierValues ? definition.lossModifierValues[attribute] : undefined\n if (\n (!valueModifier || size(valueModifier) === 0) &&\n (!valueGain || size(valueGain) === 0) &&\n (!valueLoss || size(valueLoss) === 0) &&\n (!valueLossModifier || size(valueLossModifier) === 0)\n )\n return explainShort(definition, attribute)\n let explanation = ''\n let base = 0\n const valueBase = definition.baseValues ? definition.baseValues[attribute] : undefined\n if (valueBase) {\n forEach(valueBase, value => (base += value))\n if (size(valueBase) === 0) explanation += 'Base value 0'\n else if (size(valueBase) === 1) explanation += ''\n else explanation += 'Base value ' + +base.toFixed(2) + ' ('\n forEach(valueBase, (value, key) => (explanation += key.replace(/_/g, ' ') + ': ' + value + ', '))\n if (size(valueBase) > 0) explanation = explanation.substring(0, explanation.length - 2)\n if (size(valueBase) > 1) explanation += ')'\n }\n let modifier = 1.0\n if (valueModifier) forEach(valueModifier, value => (modifier += value))\n if (valueModifier && size(valueModifier) > 0) {\n explanation += ' multiplied by ' + toPercent(modifier)\n explanation += ' ('\n forEach(valueModifier, (value, key) => (explanation += key.replace(/_/g, ' ') + ': ' + toPercent(value) + ', '))\n explanation = explanation.substring(0, explanation.length - 2) + ')'\n }\n const value = calculateValue(definition, attribute)\n const baseValue = calculateValueWithoutLoss(definition, attribute)\n const loss = baseValue - value\n const gain = calculateGain(definition, attribute)\n if (size(valueGain) > 0) {\n explanation += ' increased by ' + +gain.toFixed(2)\n explanation += ' ('\n if (valueGain)\n forEach(valueGain, (value, key) => (explanation += key.replace(/_/g, ' ') + ': ' + toNumber(value) + ', '))\n explanation = explanation.substring(0, explanation.length - 2) + ')'\n }\n if (size(valueLoss) + size(valueLossModifier) > 0) {\n explanation += ' reduced by losses ' + +loss.toFixed(2)\n explanation += ' ('\n if (valueLoss)\n forEach(valueLoss, (value, key) => (explanation += key.replace(/_/g, ' ') + ': ' + toNumber(value) + ', '))\n if (valueLossModifier)\n forEach(\n valueLossModifier,\n (value, key) => (explanation += key.replace(/_/g, ' ') + ': ' + toPercent(value) + ', ')\n )\n explanation = explanation.substring(0, explanation.length - 2) + ')'\n }\n return explanation\n}\n"],"sourceRoot":""}