{"version":3,"sources":["types/index.ts","images/empty.png","definition_values.ts","types/battle.ts","formatters.ts","types/settings.ts","images/terrain.png","images/naval_combat.png","images/attrition.png","images/chance.png","images/manpower.png","images/morale.png","images/fire.png","images/shock.png","types/armies.ts","types/cohorts.ts","types/countries.ts","types/modifiers.ts","types/saves.ts","types/tactics.ts","types/terrains.ts","types/transfer.ts","types/ui.ts","types/units.ts","types/utils.ts","utils.ts","images/unknown.png","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/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","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","images/discipline.png","images/offense.png","images/defense.png","images/combat_ability.png","images/cost.png","images/food.png","images/food_capacity.png","images/supply_limit.png","images/yes.png","images/no.png","types/definition.ts","images/land_combat.png","data/armies.ts","data/battle.ts","data/units.ts","data/countries.ts","data/modifiersIR.ts","data/modifiersEUIV.ts","data/saves.ts","data/config.ts","data/settings.ts","data/tactics.ts","data/terrains.ts","managers/modifiers.ts","managers/units.ts","managers/army.ts","reducers/utils.ts","reducers/army.ts","managers/importer.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","managers/combat.ts","reducers/combat.ts","managers/countries.ts","reducers/countries.ts","reducers/settings.ts","managers/settings.ts","managers/tactics.ts","reducers/tactics.ts","reducers/terrains.ts","managers/terrains.ts","managers/transfer.ts","reducers/transfer.ts","data/transfer.ts","reducers/ui.ts","managers/ui.ts","reducers/units.ts","state/transforms.ts","army_utils.ts","state/utils.ts","state/index.ts","components/Utils/StyledNumber.tsx","components/Utils/Images.tsx","components/VersusList.tsx","components/Utils/LabelUnit.tsx","components/Utils/AttributeImage.tsx","components/UnitDefinitions.tsx","components/Dropdowns/SimpleDropdown.tsx","components/ValueDropdownModal.tsx","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","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","containers/CountryValueInput.tsx","containers/TableArmyInfo.tsx","containers/TableSideInfo.tsx","containers/TableDamageAttributes.tsx","containers/ParticipantSelector.tsx","pages/Battle.tsx","pages/Navigation.tsx","components/Utils/PaddedRow.tsx","components/Utils/Input.tsx","components/TableAttributes.tsx","components/Utils/ListModifier.tsx","components/Dropdowns/DropdownListDefinition.tsx","components/TableModifierList.tsx","pages/CountriesIR.tsx","pages/CountriesEUIV.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","managers/saves.ts","containers/ImportSave.tsx","components/ConvertSave.tsx","pages/SaveTool.tsx","components/SaveToken.tsx","containers/ExportPops.tsx","pages/ExportTool.tsx","containers/modal/BaseModal.tsx","containers/modal/ModalDiceRolls.tsx","components/ItemRemover.tsx","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","serviceWorker.ts","index.tsx","images/military_power.png"],"names":["module","exports","ValuesType","mergeValues","definition","toMerge","baseValues","merge","modifierValues","gainValues","lossValues","lossModifierValues","shrinkValues","key","map","_","attribute","calculateBase","calculateModifier","calculateLossModifier","calculateLoss","addValues","type","values","Base","subAddValues","Modifier","Gain","Loss","LossModifier","addValue","value","addValuesWithMutate","container","newValues","has","filter","k","clearAllValues","subClearValues","clearAllValuesWithMutate","attributeKey","filterValues","subFilterValues","filterKey","filterKeys","calculateValue","round","calculateValueWithoutLoss","calculateGain","calculateValueSub","result","forEach","getValue","getContainer","explainShort","valueBase","explanation","replace","substring","length","explain","valueModifier","undefined","valueGain","valueLoss","valueLossModifier","size","base","toFixed","modifier","toPercent","loss","gain","toNumber","CombatPhase","SideType","addSign","number","String","addSignWithZero","toManpower","Math","floor","toMorale","strengthToValue","mode","Mode","Naval","toMaintenance","fixed","toMultiplier","multipliers","mapRange","pow","toFlooredPercent","decimals","toSignedPercent","Setting","SimulationSpeed","DisciplineValue","parameterToDescription","parameter","BasePips","MaxPips","MaxGeneral","CombatWidth","DiceMaximum","DiceMinimum","ExperienceDamageReduction","Precision","StackWipeCaptureChance","FixExperience","StrengthLostMultiplier","MinimumStrength","DamageLossForMissingMorale","MoraleHitForNonSecondaryReinforcement","MoraleHitForLateDeployment","MoraleGainForWinning","MinimumMorale","MoraleLostMultiplier","DefenderAdvantage","RelativeDice","BackRow","BackRowRetreat","RetreatRounds","StackwipeRounds","SoftStackWipeLimit","HardStackWipeLimit","Stackwipe","MoraleDamageBasedOnTargetStrength","CustomDeployment","DynamicFlanking","Tactics","AttackerSwapping","Martial","Tech","Culture","Food","StrengthBasedFlank","AttributeDiscipline","Damage","Both","UseMaxMorale","FireAndShock","SupportPhase","DailyMoraleLoss","DailyDamageIncrease","PhaseLength","InsufficientSupportPenalty","FixFlankTargeting","DynamicTargeting","AttributeCombatAbility","AttributeDamage","AttributeLoyal","AttributeDrill","AttributeExperience","AttributeMilitaryTactics","AttributeMoraleDamage","AttributeOffenseDefense","AttributeStrengthDamage","AttributeTerrainType","AttributeUnitType","MaxPhases","PhasesPerRoll","ChunkSize","Performance","ReduceRolls","CalculateWinChance","CalculateCasualties","CalculateResourceLosses","ShowGraphs","AutoRefresh","ArmyName","GeneralAttribute","ArmyPart","UnitPreferenceType","CountryName","CountryAttribute","CultureType","SelectionType","ModifierType","GovermentType","TradeGood","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","ExportKey","ModalType","UnitType","UnitRole","UnitAttribute","unitValueToString","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","filterAttributes","attributes","settings","showStatistics","isAttributeEnabled","getAttributeValuesType","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","Off","Discipline","getImage","image","UnknownIcon","EmptyIcon","arrayify","item","Array","isArray","func","array","i","noZero","randomWithinRange","min","max","random","sumArr","arr","converter","reduce","previous","current","Number","showProgress","text","updates","dots","repeat","precision","multiplyChance","chance1","chance2","keys","object","Object","entries","callback","assign","v","excludeMissing","toArr","toObj","toSet","removeUndefined","resize","defaultValue","ret","slice","push","getDefaultTactic","Land","getDefaultUnitPreferences","Front","Latest","Flank","Support","getDefaultArmyName","Army","Navy","getDefaultArmy","reserve","unitPreferences","flankSize","general","enabled","selections","definitions","tactic","initializeDefaultArmy","getDefaultArmies","getInitialTerrains","Ocean","None","Grasslands","getDefaultSide","name","participants","getDefaultParticipant","days","rolls","dice","randomizeDice","countryName","armyName","daysUntilBattle","getDefaultMode","sides","A","Country1","B","Country2","terrains","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","IconEmpty","getUnitIcon","createUnitFromJson","data","handleAttributes","unit","Type","Parent","role","Role","parent","culture","tech","defaultUnits","parentsEUIV","concat","unitsEUIV","getCultures","uniq","sort","getDefaultUnits","getDefaultCountry","government","Republic","armies","units","OmenPower","TechLevel","weariness","getDefaultCountryDefinitions","abilitiesIR","sortBy","traitsIR","heritagesIR","tradesIR","traditionsIR","ideasIR","lawsIR","deitiesIR","policiesIR","countriesIR","territoriesIR","religionsIR","factionsIR","modifiersIR","culturesIR","techIR","techEUIV","from","techDataEUIV","policiesEUIV","policyDataEUIV","laws","getConfig","configIR","getDefaultSettings","combatSettings","getDefaultLandSettings","getDefaultNavalSettings","siteSettings","getDefaultSiteSettings","army","country","Fast","speedValues","VeryAccurate","Accurate","Normal","VeryFast","tacticToIcon","IconBottleneck","IconCavalrySkirmish","IconDeception","IconEnvelopment","IconHitAndRun","IconPadmaVyuha","IconPhalanx","IconShockAction","IconSkirmishing","IconTriplexAcies","IconFrontalAssault","IconNavalEnvelopment","IconHarassment","IconProbingAttack","IconCloseRanks","getTacticIcon","defaultTactics","camel_cavalry","war_elephants","mega_polyreme","Casualties","casualties","hit_and_run","phalanx","getDefaultTacticState","createTerrainFromJson","terrain","IconTerrain","location","Roll","roll","defaultTerrains","dataEUIV","getDefaultTerrainState","mapModifiers","modifiers","getCountryModifiers","Invention","techLevel","level","getTechModifiers","morale","OfficeMorale","discipline","OfficeDiscipline","militaryExperience","MilitaryExperience","target","Global","getOfficeModifiers","items","getModifiersSub2","Policy","getGeneralModifiers","getRootParent","applyDynamicAttributes","drill","maneuver","getStrengthBasedFlank","isLoyal","LoyalMaintenance","strength","ceil","applyLosses","generateLosses","applyUnitModifiers","mapped","Text","mapModifiersToUnits2","range","getCohortId","side","cohort","participantIndex","index","getCohortName","getAllUnitList","parents","getParents","unitSorter","getLatestUnits","sorted","filterByTech","techSorter","find","getChildUnits","getArchetypes","getActualUnits","enableGeneralSelection","clearGeneralSelection","typeCounter","getActionType","makeActionRemoveFirst","actionToFunction","payload","makeActionReplaceFirst","args","makeActionReplaceFirstTwice","key1","key2","getDefaultEntity","draft","action","getEntityPayload","getDefaultContainer","makeReducer","initial","getEntity","getPayload","state","params","produce","makeEntityReducer","makeContainerReducer","compose","reducers","reducer","prev","curr","DataType","ControlType","mapping","manager","clearGeneralSelections","enableGeneralSelections","toggleCohortLoyality","setCohortValue","valuesType","changeCohortType","deleteCohort","splice","removeFromReserve","types","findLastIndex","addToReserve","cohorts","clearCohorts","selectTactic","setFlankSize","flankFize","setUnitPreference","preferenceType","setGeneralAttribute","clearGeneralAttributes","setHasGeneral","hasGeneral","armyReducer","calculateCohortPips","source","targetSupport","phase","getOffensiveCohortPips","getDefensiveCohortPips","getDefensiveSupportCohortPips","calculateExperienceReduction","damageReductionPerExperience","getCombatPhase","getCombatPhaseNumber","calculateTotalStrength","includeDefeated","iterateCohorts","j","frontline","length2","isDefeated","front","flank","support","defeated","removeDefeated","nextIndex","center","reserveSize","defeatCohort","environment","defeatedDay","day","isDestroyed","wipeCohort","enemy","captureChance","stackWipedBy","properties","uncaptureCohort","isAlive","getCombatUnit","unitTypes","flankRatioPenalty","flanking","moraleLoss","strengthLoss","moraleDealt","strengthDealt","damageMultiplier","targetedBy","defeatedBy","totalMoraleDealt","totalStrengthDealt","damageReduction","precalculateDamageReduction","deploymentPenalty","reinforcementPenalty","winningMoraleBonus","maxMorale","maxStrength","experienceReduction","deploymentCost","damage","getDamages","damageTakenMultiplier","moraleTakenMultiplier","strengthTakenMultiplier","applyPhaseDamageTaken","calc","getProperties","applyDamageTypes","moraleDone","strengthDone","applyPhaseDamageDone","applyUnitTypes","applyPhaseDamage","precalculateDamage","getMultiplier","sumBy","LoyalDamage","deployFront","row","preferences","pop","applyReinforcementPenalty","deployFlanks","applyLateDeploymentPenaltySub","percent","Secondary","deployCohorts","leftFlank","rightFlank","backline","flankStartingIndex","deploySupport","some","maxSupportBackline","limit","count","deployBoth","sortReserve","frontReserve","isFrontUnit","flankReserve","isFlankUnit","supportReserve","isSupportUnit","Primary","calculatePreferredFlankSize","customValue","armyFlankCount","removeDefeatedFromNewArmies","part","remove","countCohorts","countReserve","sum","undeploy","flatten","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","attack","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","armyS","armyT","generalPips","martialPip","phasePip","calculateGeneralPips","terrainPips","isAttacker","enableTiles","enableBorders","Border","getTerrainPips","tacticBonus","ratio","setting","ratios","flankRatio","calculateFlankRatioPenalty","multiplier","attackSub","dynamicMultiplier","strengthMultiplier","calculateDamageMultiplier","calculateMoraleLosses","calculateStrengthLosses","isSupport","definitionS","definitionT","calculateCohortDamageMultiplier","calculatePips","maxPips","pips","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","includes","roll2","copyReserveState","calculateCaptureLoss","weight","own","enemyDefinitions","enemyIndex","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","copyReserve","copyArmies","freeseSize","freeze","copy","subBattle","steps","sideD","phaseNumber","Date","getMilliseconds","minimumRoll","maximumRoll","rollFrequency","abs","createEntropy","engine","MersenneTwister19937","discard","rng","Random","rollDice","integer","step","pair","getMode","getCombatEnvironment","getCombatSide","refreshBattle","convertSides","undo","combatReducer","_2","_3","enableCountrySelection","clearCountrySelection","applyCountryModifiers","Country","convertCountryDefinition","calculated","filterArmies","countriesMapping","createCountry","countries","deleteCountry","changeCountryName","oldCountry","countryMapping","clearCountrySelections","enableCountrySelections","selectCulture","loadAllUnits","selectGovernment","setCountryAttribute","clearCountryAttributes","changeWeariness","createArmy","deleteArmy","changeArmyName","oldArmyName","countriesReducer","changeCombatParameter","changeSiteParameter","selectCountry","selectArmy","setMode","settingsReducer","convertTactic","opposingTactic","effect","match","tacticsMapping","createTactic","tactics","setTacticType","oldType","deleteTactic","tacticMapping","setTacticValue","setTacticImage","setTacticMode","tacticsReducer","terrainsMapping","createTerrain","setTerrainType","deleteTerrain","terrainMapping","setTerrainImage","setTerrainLocation","setTerrainMode","setTerrainValue","terrainsReducer","exportState","exportKeys","JSON","stringify","filtered","_persist","transfer","ui","stripRounds","Countries","Terrains","Settings","filterState","pad","padStart","saveToFile","blob","Blob","date","formatted","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","saveAs","transferMapping","setExportKey","setResetMissing","resetMissing","transferReducer","importMapping","importState","imported","resetState","resetAll","importReducer","closeModal","modals","toggleAccordion","accordions","selectParticipant","selectedParticipantIndex","openModal","uiReducer","unitsMapping","createUnit","deleteUnit","changeUnitType","unitMapping","setUnitValue","changeUnitImage","changeUnitDeployment","deployment","toggleUnitLoyality","changeParent","unitsReducer","restoreDefaultTactics","restoreDefaultTerrains","restoreDefaultUnits","restoreDefaultSettings","defaultSettings","convertCohortDefinition","shrinkUnits","convertUnitDefinition","merged","getArmyPart","Frontline","Reserve","Defeated","getOpponent","getSettings","getCountry","getParticipant","getSiteSettings","getCohort","column","getCohorts","getCohortForEachRound","mergeUnitTypes","getArmies","getUnitDefinitions","add","Set","getTerrainTypes","getTerrains","getTacticDefinitions","getTactics","opponent","getBattle","getCountries","getSide","getArmy","getArmyDefinition","unitDefinitions","getReserve","getGeneral","armyA","armyD","convertSidesSub","armyDefinitions","getSelectedTerrains","enemyTypes","convertArmy","reverse","convertSide","getUnitPreferences","getFlankSize","getCountryDefinition","getGeneralDefinition","General","extraValues","totalValues","getSelectedArmy","getTactic","getOverridenReserveDefinitions","originals","latest","override","convertReserveDefinitions","getParticipantSafely","getUnitDefinitionsSub","countryModifiers","secondaryCountryModifiers","generalModifiers","filterUnitDefinitions","convertUnitDefinitions","getUnitTypeList","filterParent","getUnitList","filterParents","list","getUnitDefinition","unitType","getUnitImages","flat","combined","reducerKeys","nextState","invalidated","combine","rootReducer","StyledNumber","this","props","hideZero","formatter","positiveColor","negativeColor","neutralColor","className","str","Component","Images","Image","src","avatar","VersusList","images","styled","List","horizontal","Item","style","marginLeft","LabelItem","getText","getExplanation","AttributeImage","getContent","Header","sub","margin","first","IconMorale","IconStrength","IconManpower","IconDiscipline","IconOffense","IconDefense","IconAttrition","IconCombatAbility","IconFire","IconShock","IconCost","IconFoodConsumption","IconFoodStorage","IconSupplyLimit","IconMartial","getFirstImage","second","getSecondImage","Popup","trigger","content","basic","wide","mouseEnterDelay","UnitDefinitions","filterByMode","isDamageTaken","renderRow","onRowClick","Table","Row","onClick","Cell","singleLine","celled","selectable","unstackable","HeaderCell","Icon","Body","SimpleDropdown","getOptions","clearable","onChange","onAdd","search","placeholder","minWidth","maxWidth","Dropdown","disabled","onAddItem","compact","selection","options","allowAdditions","ValueDropdownModal","onSuccess","onClose","selected","open","message","valueLabel","dropdownLabel","buttonMessage","Modal","Content","paddingLeft","Grid","columns","Column","setState","Button","CountryManager","initialState","openCreateCountry","openCreateArmy","openEditCountry","Value","selectedCountry","openEditArmy","selectedArmy","sourceArmy","children","primary","React","Children","elem","actions","connect","Headers","renderHeader","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","TerrainDefinitions","renderAttributes","TerrainDetail","TacticDefinitions","renderVersus","versus","marginRight","TacticDetail","Definitions","modalCountry","openCreateUnit","UnitDetail","DropdownTable","getHeader","header","searchQuery","onOpen","isPositive","isNegative","isActive","positive","negative","cell","onSelect","absolute","classNames","onSearchChange","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","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","onDeleteCohort","filler","padding","onMouseOver","e","tooltipRow","tooltipColumn","tooltipContext","currentTarget","tooltipIsSupport","onMouseLeave","onContextMenu","preventDefault","getIcon","Retreated","prevState","rowWidth","fullRows","indexOffset","chunk","leftFiller","rightFiller","fitted","color","columnIndex","renderImage","gradient","IconDefeated","PureComponent","GridRowArmyPart","hideIfEmpty","TargetArrows","renderAttacker","fromStr","id","toStr","renderArrow","renderDefender","to","fromAnchor","toAnchor","borderColor","delay","zIndex","attackerColor","defenderColor","visible","convertUnits","DropdownTerrain","TerrainSelector","renderTerrain","IconDice","Tooltip","position","WinRate","toTooltipPercent","toSignedTooltipPercent","toTooltipNumber","willUnmount","getInfoTooltip","getWinChanceTooltip","scale","getCasualtiesTooltip","update","calculate","avgStrengthD","maxStrengthD","verticalAlign","fontSize","DelayedNumericInput","convertValue","onKeyPress","event","onLostFocus","timer","clearTimeout","newValue","isNaN","onFocus","select","UnitValueInput","getKey","DropdownArchetype","TableUnitTypes","getAttributes","checkPreference","preference","techRequirement","renderRoleRow","archetypes","archetype","latestType","renderCohortCount","renderUnitRow","renderRootUnitRow","updateReserve","nextProps","unitList","getRootUnit","DropdownTactic","TacticSelector","getSelectedTactic","CountryValueInput","TableArmyInfo","renderArmyInfo","artillery","renderGeneralAttribute","last","icon","TableSideInfo","renderSide","renderRoll","combat","isDiceSet","DiceRolls","TableDamageAttributes","setGeneralStat","ParticipantSelector","Battle","openCohortModal","CohortDetail","openUnitDetails","roundName","dayStr","renderFrontline","renderReserve","renderDefeatedCohorts","renderRetreatedCohorts","participantA","participantD","participantB","rounds","isUndoAvailable","floated","Checkbox","checked","circular","Navigation","path","pathname","history","process","PaddedRow","cells","stretch","child","Input","TableAttributes","CELLS","customValueKey","baseValue","ListModifier","sign","noPercent","float","DropdownListDefinition","getHeaders","TableModifierList","usePercentPadding","entity","PERCENT_PADDING","colSpan","CountriesIR","renderTraditions","traditions","paths","activateTradition","deactivateTradition","tradition","enableTradition","clearTradition","renderInventions","inventions","invention","renderTechLevel","enableInvention","clearInvention","renderDeities","deities","power","Deity","isOmen","renderCell2","onCountryItemClick","renderHeritages","renderDropdown","Heritage","renderReligions","Religion","renderFactions","Faction","renderPolicies","renderOptions","renderAbilities","Ability","onGeneralItemClick","option","clearTech","enableTech","execArmy","findOptionKeys","policy","execCountry","enable","clear","setCountryValue","toRemove","Tradition","rest","clearAll","setGeneralValue","generalDefinition","countryDefinition","countrySelections","Container","toggle","Trait","Trade","bulleted","padded","Law","Idea","CountriesEUIV","renderTech","Transfer","lastData","renderCheckbox","loadContent","file","then","json","files","TextArea","dispatch","doResetMissing","parse","err","console","error","GridSettings","renderSetting","onInputChange","whiteSpace","mechanics","stackwipe","getMenuItem","menuItem","render","renderSiteSettings","getModeMenuItem","renderModeSettings","getTransferMenuItem","Tab","Pane","panes","defaultActiveIndex","findIndex","Error","reset","hasError","download","Segment","SimpleRange","BaseChart","getTooltip","onActivated","containerComponent","labels","datum","theme","VictoryTheme","material","domainPadding","top","left","bottom","right","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","renderGraphs","resources","indexOf","Uint8Array","errors","parseToken","token","startsWith","substr","parseValue","tokens","parseObject","resultArray","Separator","parseFile","split","formatTokens","SectionStart","SectionEnd","Integer","Float","Boolean","UnsignedInteger","BigFloat","BigInteger","parseInt","stringTokens","binaryToPlain","buffer","getErrors","parseBinaryText","getBinaryToken","code","toString","toUpperCase","isKeyValuePair","getBinaryUnsigned","getHex","hexToUnsigned","getBinaryBigSigned","hexToSigned","parseBinaryValue","getBinarySigned","string","fromCharCode","getBinaryString","DataView","ArrayBuffer","setUint32","getFloat32","getBinaryFloat","BigUnsignedInteger","getBinaryBigUnsigned","dates","isDate","parentKey","inArray","decodateDate","input","months","year","month","hex","highbyte","bn","BigInt","getCharacterMartial","character","martial","traits","maintenanceToKey","getFirstPlayedCountry","played_country","countPops","pops","ids","counts","category","countSurplus","capital","provinces","province","goods","territory","slaves","trade_goods","baseAmount","province_rank","slavesForSurplus","buildings","trade","route","from_state","to_state","getCharacterName","first_name_loc","family_name","loadCharacter","character_database","traitMartial","loadArmy","units_database","getArmyName","unit_name","ship","subunit_database","experience","loadCohort","flank_size","leader","is_army","ability","unit_ability","which","ordinal","family","ImportSave","importing","getTagName","tag","getCountryImportString","getArmyImportString","renderCountry","isPlayer","heritage","armyMaintenance","navalMaintenance","surplus","ideas","officeMorale","officeDiscipline","faction","religion","religiousUnity","toPrecision","omen","abilities","Fragment","deity_manager","deities_database","country_database","availableLaws","active_inventions","currency_data","military_experience","country_name","technology","military_tech","military_tradition","economic_policies","military_tradition_levels","idea","pantheon","deity","religious_unity","ruler_term","party","player","game_configuration","difficulty","government_key","endsWith","Monarch","Tribe","jobs","office_job","characters","disciplineJob","job","who","office","moraleJob","character_experience","population","loadCountry","setFile","firstPlayer","JSZip","loadAsync","zip","async","catch","getCountryList","getArmyList","importCountry","traditionsWithBonus","union","invention_list","importArmy","importArmyStart","importArmyEnd","experiences","maxStrengths","maxMorales","ConvertSave","loadSave","unzipped","SaveTool","ExportPops","getTerritoryName","getCategoryName","rawCulture","exportPops","territories","controller","province_name","totalPops","rank","loadPopsByTerritory","categories","now","BaseModal","centered","ModalDiceRolls","renderIsRollRandom","isRandom","renderCustomRolls","renderSeed","ItemRemover","onRemove","Toggle","IconYes","IconNo","DetailToggleRow","DetailTextRow","DetailInputRow","DetailDropdownRow","modes","deployments","onCustomBaseValueChange","onCustomModifierValueChange","onCustomLossValueChange","onCustomLossModifierValueChange","disableBaseValues","modifierValue","lossValue","enableLoss","enableModifier","enableBase","onTypeChange","onParentChange","onImageChange","onChangeDeployment","onIsLoyalToggle","unitTypesWithParent","unitTypesAsDropdown","ModalCohortDetail","removeUnit","setBaseValue","setModifierValue","setLossModifierValue","changeType","toggleIsLoyal","convertCohort","dealtValues","getCohortDefinition","ModalUnitDetail","setValue","changeImage","changeDeployment","locations","onCustomValueChange","onModeChange","onLocationChange","ModalTerrainDetail","delete","setType","newType","setLocation","setImage","relative","ModalTacticDetail","ModalValue","Modals","Root","store","persistor","loading","component","exact","ExportTool","TacticsTransform","createTransform","inboundState","outboundState","whitelist","TerrainsTransform","BattleTransform","CountriesTransform","SettingsTransform","DataTransform","migrations","11","persistConfig","version","migrate","createMigrate","debug","transforms","persistedReducer","persistReducer","window","hostname","createStore","devToolsEnhancer","persistStore","configureStore","ReactDOM","document","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.95b64e7e.chunk.js","sourcesContent":["export * from './analyze'\r\nexport * from './armies'\r\nexport * from './battle'\r\nexport * from './cohorts'\r\nexport * from './countries'\r\nexport * from './definition'\r\nexport * from './modifiers'\r\nexport * from './saves'\r\nexport * from './settings'\r\nexport * from './tactics'\r\nexport * from './terrains'\r\nexport * from './transfer'\r\nexport * from './ui'\r\nexport * from './units'\r\nexport * from './utils'","module.exports = __webpack_public_path__ + \"static/media/empty.04b68098.png\";","import { toNumber, toPercent } from './formatters'\r\nimport { round, map, filter, forEach, filterKeys } from './utils'\r\nimport { merge, has, size } from 'lodash'\r\n\r\nexport enum ValuesType {\r\n Base = 'Base',\r\n Modifier = 'Modifier',\r\n Loss = 'Loss',\r\n Gain = 'Gain',\r\n LossModifier = 'LossModifier'\r\n}\r\n\r\ntype BD = DefinitionValues\r\n\r\ntype ValuesSub = { [key: string]: number }\r\ntype Values = { [key in S]: ValuesSub }\r\n\r\nexport interface DefinitionValues {\r\n baseValues?: Values\r\n modifierValues?: Values\r\n gainValues?: Values\r\n lossValues?: Values\r\n lossModifierValues?: Values\r\n}\r\n\r\nconst initValues = () => ({} as Values)\r\n\r\n/**\r\n * Merges base, modifier and loss values of given definitions. Returns the first definition (if defined), otherwise the second definition.\r\n * @param definition Returned definition with base values from to_merge.\r\n * @param toMerge Only returned if other parameter is not defined.\r\n */\r\nexport const mergeValues = (definition: D1, toMerge: D2): D1 & D2 => {\r\n let baseValues = initValues()\r\n if (definition && definition.baseValues)\r\n merge(baseValues, definition.baseValues)\r\n if (toMerge && toMerge.baseValues)\r\n merge(baseValues, toMerge.baseValues)\r\n let modifierValues = initValues()\r\n if (definition && definition.modifierValues)\r\n merge(modifierValues, definition.modifierValues)\r\n if (toMerge && toMerge.modifierValues)\r\n merge(modifierValues, toMerge.modifierValues)\r\n let gainValues = initValues()\r\n if (definition && definition.gainValues)\r\n merge(gainValues, definition.gainValues)\r\n if (toMerge && toMerge.gainValues)\r\n merge(gainValues, toMerge.gainValues)\r\n let lossValues = initValues()\r\n if (definition && definition.lossValues)\r\n merge(lossValues, definition.lossValues)\r\n if (toMerge && toMerge.lossValues)\r\n merge(lossValues, toMerge.lossValues)\r\n let lossModifierValues = initValues()\r\n if (definition && definition.lossModifierValues)\r\n merge(lossModifierValues, definition.lossModifierValues)\r\n if (toMerge && toMerge.lossModifierValues)\r\n merge(lossModifierValues, toMerge.lossModifierValues)\r\n return { ...toMerge, ...definition, baseValues, modifierValues, lossValues, gainValues, lossModifierValues }\r\n}\r\n\r\n\r\n/**\r\n * Merges all values under a given key.\r\n */\r\nexport const shrinkValues = (definition: D, key: string): D => {\r\n return {\r\n ...definition,\r\n baseValues: definition.baseValues && map(definition.baseValues, (_, attribute) => ({ [key]: calculateBase(definition, attribute) })),\r\n modifierValues: definition.modifierValues && map(definition.modifierValues, (_, attribute) => ({ [key]: calculateModifier(definition, attribute) })),\r\n lossModifierValues: definition.lossModifierValues && map(definition.lossModifierValues, (_, attribute) => ({ [key]: calculateLossModifier(definition, attribute) })),\r\n lossValues: definition.lossValues && map(definition.lossValues, (_, attribute) => ({ [key]: calculateLoss(definition, attribute) })),\r\n gainValues: definition.gainValues && map(definition.gainValues, (_, attribute) => ({ [key]: calculateLoss(definition, attribute) }))\r\n }\r\n}\r\n\r\n/**\r\n * Adds base, modifier or loss values.\r\n */\r\nexport const addValues = (definition: D, type: ValuesType, key: string, values: [string, number][]): D => {\r\n if (type === ValuesType.Base)\r\n return { ...definition, baseValues: subAddValues(definition.baseValues, key, values) }\r\n if (type === ValuesType.Modifier)\r\n return { ...definition, modifierValues: subAddValues(definition.modifierValues, key, values) }\r\n if (type === ValuesType.Gain)\r\n return { ...definition, gainValues: subAddValues(definition.gainValues, key, values) }\r\n if (type === ValuesType.Loss)\r\n return { ...definition, lossValues: subAddValues(definition.lossValues, key, values) }\r\n if (type === ValuesType.LossModifier)\r\n return { ...definition, lossModifierValues: subAddValues(definition.lossModifierValues, key, values) }\r\n return definition\r\n}\r\n\r\nexport const addValue = (definition: D, type: ValuesType, key: string, attribute: string, value: number): D => {\r\n if (type === ValuesType.Base)\r\n return { ...definition, baseValues: subAddValues(definition.baseValues, key, [[attribute, value]]) }\r\n if (type === ValuesType.Modifier)\r\n return { ...definition, modifierValues: subAddValues(definition.modifierValues, key, [[attribute, value]]) }\r\n if (type === ValuesType.Gain)\r\n return { ...definition, gainValues: subAddValues(definition.gainValues, key, [[attribute, value]]) }\r\n if (type === ValuesType.Loss)\r\n return { ...definition, lossValues: subAddValues(definition.lossValues, key, [[attribute, value]]) }\r\n if (type === ValuesType.LossModifier)\r\n return { ...definition, lossModifierValues: subAddValues(definition.lossModifierValues, key, [[attribute, value]]) }\r\n return definition\r\n}\r\n\r\nexport const addValuesWithMutate = (definition: D, type: ValuesType, key: string, values: [string, number][]) => {\r\n if (type === ValuesType.Base)\r\n definition.baseValues = subAddValues(definition.baseValues, key, values)\r\n if (type === ValuesType.Modifier)\r\n definition.modifierValues = subAddValues(definition.modifierValues, key, values)\r\n if (type === ValuesType.Gain)\r\n definition.gainValues = subAddValues(definition.gainValues, key, values)\r\n if (type === ValuesType.Loss)\r\n definition.lossValues = subAddValues(definition.lossValues, key, values)\r\n if (type === ValuesType.LossModifier)\r\n definition.lossModifierValues = subAddValues(definition.lossModifierValues, key, values)\r\n}\r\n\r\n/**\r\n * Shared implementation for adding base, modifier or loss values.\r\n * @param container Base, modifier or loss values.\r\n * @param key Identifier for the values. Previous values get replaced.\r\n * @param values A list of [attribute, value] pairs.\r\n */\r\nconst subAddValues = (container: Values | undefined, key: string, values: [A, number][]): Values => {\r\n let newValues = container ? container : initValues()\r\n for (const [attribute, value] of values) {\r\n if (!has(newValues, attribute) && value === 0)\r\n continue\r\n if (!has(newValues, attribute))\r\n newValues = { ...newValues, [attribute]: {} }\r\n if (value === 0 && has(newValues[attribute], key))\r\n newValues = { ...newValues, [attribute]: filter(newValues[attribute], (_, k) => k !== key) }\r\n else if (value !== 0)\r\n newValues = { ...newValues, [attribute]: { ...newValues[attribute], [key]: value } }\r\n }\r\n return newValues\r\n}\r\n\r\n/**\r\n * Clears base, modifier and loss values with a given key.\r\n */\r\nexport const clearAllValues = (definition: D, key: string): D => {\r\n return {\r\n ...definition,\r\n baseValues: subClearValues(definition.baseValues, key),\r\n modifierValues: subClearValues(definition.modifierValues, key),\r\n gainValues: subClearValues(definition.gainValues, key),\r\n lossValues: subClearValues(definition.lossValues, key),\r\n lossModifierValues: subClearValues(definition.lossModifierValues, key)\r\n }\r\n}\r\n\r\n/**\r\n * Clears base, modifier and loss values with a given key.\r\n */\r\nexport const clearAllValuesWithMutate = (definition: D, key: string) => {\r\n definition.baseValues = subClearValues(definition.baseValues, key)\r\n definition.modifierValues = subClearValues(definition.modifierValues, key)\r\n definition.gainValues = subClearValues(definition.gainValues, key)\r\n definition.lossValues = subClearValues(definition.lossValues, key)\r\n definition.lossModifierValues = subClearValues(definition.lossModifierValues, key)\r\n}\r\n\r\n/**\r\n * Clears base, modifier or loss values with a given key.\r\n */\r\nexport const clearValues = (definition: D, type: ValuesType, key: string): D => {\r\n if (type === ValuesType.Base)\r\n return { ...definition, baseValues: subClearValues(definition.baseValues, key) }\r\n const any = definition as any\r\n if (type === ValuesType.Modifier)\r\n return { ...definition, modifierValues: subClearValues(any.modifierValues, key) }\r\n if (type === ValuesType.Gain)\r\n return { ...definition, gainValues: subClearValues(any.gainValues, key) }\r\n if (type === ValuesType.Loss)\r\n return { ...definition, lossValues: subClearValues(any.lossValues, key) }\r\n if (type === ValuesType.LossModifier)\r\n return { ...definition, lossModifierValues: subClearValues(any.lossModifierValues, key) }\r\n return definition\r\n}\r\n\r\nexport const clearValuesWithMutate = (definition: D, type: ValuesType, key: string) => {\r\n if (type === ValuesType.Base)\r\n definition.baseValues = subClearValues(definition.baseValues, key)\r\n const any = definition as any\r\n if (type === ValuesType.Modifier)\r\n definition.modifierValues = subClearValues(any.modifierValues, key)\r\n if (type === ValuesType.Gain)\r\n definition.gainValues = subClearValues(any.gainValues, key)\r\n if (type === ValuesType.Loss)\r\n definition.lossValues = subClearValues(any.lossValues, key)\r\n if (type === ValuesType.LossModifier)\r\n definition.lossModifierValues = subClearValues(any.lossModifierValues, key)\r\n}\r\n\r\n\r\n/**\r\n * Shared implementation for clearing base, modifier or loss values.\r\n * @param container Base, modifier or loss values.\r\n * @param key Identifier for the values to remove.\r\n */\r\nconst subClearValues = (container: Values | undefined, key: string): Values => {\r\n if (container)\r\n return map(container, attribute => filter(attribute, ((_, attributeKey) => attributeKey !== key)))\r\n return initValues()\r\n}\r\n\r\n/**\r\n * Adds base, modifier or loss values while clearing previous ones.\r\n */\r\nexport const regenerateValues = (definition: D, type: ValuesType, key: string, values: [A, number][]) => {\r\n clearValuesWithMutate(definition, type, key)\r\n addValuesWithMutate(definition, type, key, values)\r\n}\r\n\r\n// This precision is required for accurate morale calculations.\r\nconst PRECISION = 100000.0\r\n\r\n/**\r\n * Returns values of a given key.\r\n * @param definition \r\n * @param key \r\n */\r\nexport const filterValues = (definition: D, key: string): D => {\r\n return {\r\n ...definition,\r\n baseValues: subFilterValues(definition.baseValues, key),\r\n modifierValues: subFilterValues(definition.modifierValues, key),\r\n gainValues: subFilterValues(definition.gainValues, key),\r\n lossValues: subFilterValues(definition.lossValues, key),\r\n lossModifierValues: subFilterValues(definition.lossModifierValues, key)\r\n }\r\n}\r\n\r\nconst subFilterValues = (values: Values | undefined, filterKey: string) => values && map(values, attribute => filterKeys(attribute, key => key === filterKey))\r\n\r\n/**\r\n * Calculates the value of an attribute. Includes base, modifier and loss values.\r\n * @param definition \r\n * @param attribute \r\n */\r\nexport const calculateValue = (definition: D | undefined, attribute: A): number => {\r\n if (!definition)\r\n return 0.0\r\n let value = calculateBase(definition, attribute) * (1 + calculateModifier(definition, attribute)) * (1 - calculateLossModifier(definition, attribute)) - calculateLoss(definition, attribute)\r\n return round(value, PRECISION)\r\n}\r\n\r\n/**\r\n * Calculates the value of an attribute, without losses.\r\n * @param definition \r\n * @param attribute \r\n */\r\nexport const calculateValueWithoutLoss = (definition: D | undefined, attribute: A): number => {\r\n if (!definition)\r\n return 0.0\r\n let value = calculateBase(definition, attribute) * (1 + calculateModifier(definition, attribute)) + calculateGain(definition, attribute)\r\n return round(value, PRECISION)\r\n}\r\n\r\n/**\r\n * Calculates the base value of an attribute.\r\n * @param definition \r\n * @param attribute \r\n */\r\nexport const calculateBase = (definition: D, attribute: A): number => calculateValueSub(definition.baseValues, attribute)\r\n\r\n/**\r\n * Calculates the modifier value of an attribute.\r\n * @param definition \r\n * @param attribute \r\n */\r\nexport const calculateModifier = (definition: D, attribute: A): number => calculateValueSub(definition.modifierValues, attribute)\r\n\r\n/**\r\n * Calculates the gain value of an attribute.\r\n * @param definition \r\n * @param attribute \r\n */\r\nexport const calculateGain = (definition: D, attribute: A): number => calculateValueSub(definition.gainValues, attribute)\r\n\r\n/**\r\n * Calculates the loss value of an attribute.\r\n * @param definition \r\n * @param attribute \r\n */\r\nexport const calculateLoss = (definition: D, attribute: A): number => calculateValueSub(definition.lossValues, attribute)\r\n\r\n/**\r\n * Calculates the loss modifier value of an attribute.\r\n * @param definition \r\n * @param attribute \r\n */\r\nexport const calculateLossModifier = (definition: D, attribute: A): number => calculateValueSub(definition.lossModifierValues, attribute)\r\n\r\n/**\r\n * Shared implementation for calculating the value of an attribute.\r\n * @param container \r\n * @param attribute \r\n * @param initial Initial value. For example modifiers have 1.0.\r\n */\r\nconst calculateValueSub = (container: Values | undefined, attribute: A): number => {\r\n let result = 0\r\n if (!container)\r\n return result\r\n const values = container[attribute]\r\n if (values)\r\n forEach(values, value => result += value)\r\n return round(result, PRECISION)\r\n}\r\n\r\n/**\r\n * Shared implementation to get values. Zero is returned for missing values because values with zero are not stored.\r\n * @param container \r\n * @param attribute \r\n * @param key \r\n */\r\nexport const getValue = (type: ValuesType, definition: D, attribute: A, key: string): number => {\r\n const container = getContainer(type, definition)\r\n const values = container[attribute]\r\n if (!values)\r\n return 0.0\r\n const value = values[key]\r\n if (!value)\r\n return 0.0\r\n return value\r\n}\r\n\r\nconst getContainer = (type: ValuesType, definition: D): Values => {\r\n if (type === ValuesType.Modifier)\r\n return definition.modifierValues ?? {}\r\n if (type === ValuesType.Gain)\r\n return definition.gainValues ?? {}\r\n if (type === ValuesType.Loss)\r\n return definition.lossValues ?? {}\r\n if (type === ValuesType.LossModifier)\r\n return definition.lossModifierValues ?? {}\r\n return definition.baseValues ?? {}\r\n}\r\n\r\n/**\r\n * Returns a short explanations of a given attribute. Only checks base values.\r\n * @param definition \r\n * @param attribute \r\n */\r\nexport const explainShort = (definition: D, attribute: A): string => {\r\n if (!definition.baseValues)\r\n return ''\r\n const valueBase = definition.baseValues[attribute]\r\n let explanation = ''\r\n if (valueBase) {\r\n forEach(valueBase, (value, key) => explanation += key.replace(/_/g, ' ') + ': ' + value + ', ')\r\n explanation = explanation.substring(0, explanation.length - 2)\r\n }\r\n return explanation\r\n}\r\n\r\n/**\r\n * Returns an explanation of a given attribute.\r\n * @param definition \r\n * @param attribute \r\n */\r\nexport const explain = (definition: D, attribute: A): string => {\r\n const valueModifier = definition.modifierValues ? definition.modifierValues[attribute] : undefined\r\n const valueGain = definition.gainValues ? definition.gainValues[attribute] : undefined\r\n const valueLoss = definition.lossValues ? definition.lossValues[attribute] : undefined\r\n const valueLossModifier = definition.lossModifierValues ? definition.lossModifierValues[attribute] : undefined\r\n if ((!valueModifier || size(valueModifier) === 0) && (!valueGain || size(valueGain) === 0) && (!valueLoss || size(valueLoss) === 0) && (!valueLossModifier || size(valueLossModifier) === 0))\r\n return explainShort(definition, attribute)\r\n let explanation = ''\r\n let base = 0\r\n const valueBase = definition.baseValues ? definition.baseValues[attribute] : undefined\r\n if (valueBase) {\r\n forEach(valueBase, value => base += value)\r\n if (size(valueBase) === 0)\r\n explanation += 'Base value 0'\r\n else if (size(valueBase) === 1)\r\n explanation += ''\r\n else\r\n explanation += 'Base value ' + +(base).toFixed(2) + ' ('\r\n forEach(valueBase, (value, key) => explanation += key.replace(/_/g, ' ') + ': ' + value + ', ')\r\n if (size(valueBase) > 0)\r\n explanation = explanation.substring(0, explanation.length - 2)\r\n if (size(valueBase) > 1)\r\n explanation += ')'\r\n }\r\n let modifier = 1.0\r\n if (valueModifier)\r\n forEach(valueModifier, value => modifier += value)\r\n if (valueModifier && size(valueModifier) > 0) {\r\n explanation += ' multiplied by ' + toPercent(modifier)\r\n explanation += ' ('\r\n forEach(valueModifier, (value, key) => explanation += key.replace(/_/g, ' ') + ': ' + toPercent(value) + ', ')\r\n explanation = explanation.substring(0, explanation.length - 2) + ')'\r\n }\r\n const value = calculateValue(definition, attribute)\r\n const baseValue = calculateValueWithoutLoss(definition, attribute)\r\n const loss = baseValue - value\r\n const gain = calculateGain(definition, attribute)\r\n if (size(valueGain) > 0) {\r\n explanation += ' increased by ' + +(gain).toFixed(2)\r\n explanation += ' ('\r\n if (valueGain)\r\n forEach(valueGain, (value, key) => explanation += key.replace(/_/g, ' ') + ': ' + toNumber(value) + ', ')\r\n explanation = explanation.substring(0, explanation.length - 2) + ')'\r\n\r\n }\r\n if ((size(valueLoss) + size(valueLossModifier)) > 0) {\r\n explanation += ' reduced by losses ' + +(loss).toFixed(2)\r\n explanation += ' ('\r\n if (valueLoss)\r\n forEach(valueLoss, (value, key) => explanation += key.replace(/_/g, ' ') + ': ' + toNumber(value) + ', ')\r\n if (valueLossModifier)\r\n forEach(valueLossModifier, (value, key) => explanation += key.replace(/_/g, ' ') + ': ' + toPercent(value) + ', ')\r\n explanation = explanation.substring(0, explanation.length - 2) + ')'\r\n }\r\n return explanation\r\n}\r\n","import { CountryName, Mode, TerrainType, Terrain, Settings, Cohorts } from 'types'\r\nimport { ArmyName, Army } from './armies'\r\n\r\nexport type Battle = {\r\n terrains: TerrainType[]\r\n sides: { [key in SideType]: SideData }\r\n days: {\r\n round: number\r\n startingPhaseNumber: number\r\n attacker: SideType\r\n }[]\r\n fightOver: boolean\r\n seed: number\r\n customSeed?: number\r\n outdated: boolean\r\n timestamp: number\r\n}\r\n\r\nexport enum CombatPhase {\r\n Fire = 'Fire',\r\n Shock = 'Shock',\r\n Default = 'Default'\r\n}\r\n\r\nexport type SideData = {\r\n type: SideType\r\n participants: Participant[]\r\n days: Side[]\r\n rolls: number[]\r\n dice: number\r\n randomizeDice: boolean\r\n}\r\n\r\nexport type ModeState = { [key in Mode]: Battle }\r\n\r\nexport type Participant = {\r\n countryName: CountryName\r\n armyName: ArmyName\r\n daysUntilBattle: number\r\n}\r\n\r\nexport enum SideType {\r\n A = 'Attacker',\r\n B = 'Defender'\r\n}\r\n\r\n/** Information affecting both sides of combat. */\r\nexport type Environment = {\r\n round: number\r\n mode: Mode\r\n day: number\r\n terrains: Terrain[]\r\n settings: Settings\r\n attacker: SideType\r\n}\r\n\r\nexport type FlankRatioPenalty = { [key: number]: number }\r\n\r\n/** Results from combat (mainly for tooltips). */\r\nexport type SideRoundInfo = {\r\n round: number\r\n tacticBonus: number\r\n dailyMultiplier: number\r\n tacticStrengthDamageMultiplier: number\r\n terrainPips: number\r\n generalPips: number\r\n dice: number\r\n}\r\n\r\nexport type Side = {\r\n results: SideRoundInfo\r\n armiesRemaining: boolean\r\n isDefeated: boolean\r\n armies: Army[]\r\n flankRatio: number\r\n deployed: Army[]\r\n cohorts: Cohorts\r\n type: SideType\r\n}\r\n","import { mapRange } from './utils'\r\nimport { Mode } from './types/definition'\r\n\r\n/**\r\n * This file contains functions to format numbers to strings.\r\n */\r\n\r\nexport const hideZero = (number: number) => number === 0 ? undefined : number\r\n\r\nexport const addSign = (number?: number): string => {\r\n if (number === undefined)\r\n return ''\r\n if (number > 0)\r\n return '+' + String(number)\r\n return String(number)\r\n}\r\n\r\nexport const addSignWithZero = (number?: number): string => {\r\n if (number === undefined)\r\n return ''\r\n if (number >= 0)\r\n return '+' + String(number)\r\n return String(number)\r\n}\r\n\r\n/**\r\n * Special converter for manpower. Strength multiplied by 1000 and floored down.\r\n */\r\nexport const toManpower = (number?: number): string => {\r\n if (number === undefined)\r\n return ''\r\n // Higher precision round removes floating point errors.\r\n return String(Math.floor(0.1 * Math.round(10000 * number)))\r\n}\r\n\r\nexport const toMorale = (number?: number): string => {\r\n if (number === undefined)\r\n return ''\r\n // Higher precision round removes floating point errors.\r\n return String(Math.floor(0.01 * Math.round(10000 * number)) / 100)\r\n}\r\n\r\nexport const strengthToValue = (mode: Mode, number: number) => {\r\n if (mode === Mode.Naval)\r\n return toPercent(number)\r\n return toManpower(number)\r\n}\r\n\r\nexport const toMaintenance = (number?: number): string => {\r\n if (number === undefined)\r\n return ''\r\n return String(Math.floor(100 * number) / 100.0)\r\n}\r\n\r\nexport const toNumber = (number?: number, fixed: number = 2): string => {\r\n if (number === undefined)\r\n return ''\r\n return String(+(number).toFixed(fixed))\r\n}\r\n\r\nexport const toMultiplier = (number?: number, fixed: number = 2): string => {\r\n if (number === undefined)\r\n return ''\r\n return 'x' + toNumber(number, fixed)\r\n}\r\n\r\nexport const toPercent = (number?: number, fixed: number = 2): string => {\r\n if (number === undefined)\r\n return ''\r\n return toNumber(100 * number, fixed) + '%'\r\n}\r\nconst multipliers = mapRange(10, value => Math.pow(10, value))\r\nexport const toFlooredPercent = (number?: number, decimals: number = 2): string => {\r\n if (number === undefined)\r\n return ''\r\n return Math.floor(multipliers[decimals + 2] * number) / multipliers[decimals] + '%'\r\n}\r\nexport const toSignedPercent = (number?: number, fixed: number = 2): string => {\r\n if (number === undefined)\r\n return ''\r\n const value = +(number * 100.0).toFixed(fixed)\r\n if (value >= 0)\r\n return '+' + String(value) + '%'\r\n return String(value) + '%'\r\n}\r\n","import { CountryName, Mode } from \"types\"\r\n\r\nexport enum Setting {\r\n StrengthLostMultiplier = 'Multiplier for strength damage',\r\n MoraleLostMultiplier = 'Multiplier for morale damage',\r\n ExperienceDamageReduction = 'Damage reduction for 100% experience',\r\n DiceMinimum = 'Minimum dice roll',\r\n DiceMaximum = 'Maximum dice roll',\r\n BasePips = 'Base pips',\r\n MaxPips = 'Maximum pips',\r\n MaxGeneral = 'Maximum skill of generals',\r\n MinimumMorale = 'Minimum morale for combat',\r\n MinimumStrength = 'Minimum strength for combat',\r\n DamageLossForMissingMorale = 'Damage loss for missing morale',\r\n MoraleHitForNonSecondaryReinforcement = 'Morale damage for non-secondary reinforcements',\r\n MoraleHitForLateDeployment = 'Morale damage for late deployment',\r\n MoraleGainForWinning = 'Morale gain for winning',\r\n PhaseLength = 'Length of combat phases',\r\n Precision = 'Calculation precision',\r\n CombatWidth = 'Base combat width',\r\n DefenderAdvantage = 'Defender\\'s advantage',\r\n RelativeDice = 'Defender\\'s advantage',\r\n AttributeDiscipline = 'Enable discipline',\r\n DailyMoraleLoss = 'Daily morale loss',\r\n DailyDamageIncrease = 'Daily damage increase',\r\n FixExperience = 'Fix damage reduction from experience',\r\n FixFlankTargeting = 'Fix targeting',\r\n DynamicTargeting = 'Dynamic targeting',\r\n BackRow = 'Enable backrow',\r\n BackRowRetreat = 'Enable retreating from backrow',\r\n RetreatRounds = 'Minimum rounds for retreat',\r\n StackwipeRounds = 'Minimum rounds for soft stack wipe',\r\n SoftStackWipeLimit = 'Strength required for soft stack wipe',\r\n HardStackWipeLimit = 'Strength required for hard stack wipe',\r\n AttackerSwapping = 'Enable attacker swapping',\r\n Tactics = 'Enable tactics',\r\n Stackwipe = 'Enable stack wiping',\r\n Martial = 'Enable general martial',\r\n Tech = 'Enable tech based units',\r\n Food = 'Enable food attributes',\r\n Culture = 'Enable culture based units',\r\n CustomDeployment = 'Enable deployment customization',\r\n DynamicFlanking = 'Enable dynamic flanking',\r\n UseMaxMorale = 'Morale damage based on max morale',\r\n SupportPhase = 'Deploy support units separately',\r\n InsufficientSupportPenalty = 'Penalty for insufficient support',\r\n StrengthBasedFlank = 'Enable strength based flank',\r\n FireAndShock = 'Enable fire and shock phases',\r\n AttributeCombatAbility = 'Enable Combat ability attribute',\r\n AttributeLoyal = 'Enable Loyal attribute',\r\n AttributeDrill = 'Enable Drill attribute',\r\n AttributeExperience = 'Enable Experience attribute',\r\n AttributeMilitaryTactics = 'Enable Military tactics attribute',\r\n AttributeOffenseDefense = 'Enable Offense and Defense attributes',\r\n AttributeDamage = 'Enable Damage done and Damage taken attributes',\r\n AttributeMoraleDamage = 'Enable Morale damage done and Morale damage taken attributes',\r\n AttributeStrengthDamage = 'Enable Strength damage done and Strength damage taken attributes',\r\n AttributeTerrainType = 'Enable terrain type based attributes',\r\n AttributeUnitType = 'Enable unit type based attributes',\r\n MoraleDamageBasedOnTargetStrength = 'Enable morale damaged based on target strength',\r\n Performance = 'Performance',\r\n MaxPhases = 'Maximum phases',\r\n PhasesPerRoll = 'Amount of phases affected by each dice roll',\r\n ChunkSize = 'Chunk size',\r\n CalculateWinChance = 'Calculate win chance',\r\n CalculateCasualties = 'Calculate casualties',\r\n CalculateResourceLosses = 'Calculate resource losses',\r\n ReduceRolls = 'Reduce possible dice rolls',\r\n ShowGraphs = 'Show graphs',\r\n AutoRefresh = 'Automatic refresh',\r\n StackWipeCaptureChance = 'Capture chance when stack wiping'\r\n}\r\n\r\nexport enum SimulationSpeed {\r\n Custom = 'Custom',\r\n VeryAccurate = 'Very accurate',\r\n Accurate = 'Accurate',\r\n Normal = 'Normal',\r\n Fast = 'Fast',\r\n VeryFast = 'Very fast'\r\n}\r\n\r\nexport enum DisciplineValue {\r\n Off = 'Disabled',\r\n Damage = 'Only damage done',\r\n Both = 'Both damage done and taken'\r\n}\r\n\r\nexport const parameterToDescription = (parameter: Setting, value: string | number | boolean): string => {\r\n switch (parameter) {\r\n case Setting.BasePips:\r\n return 'Base pips for all units. Affects how much damage units deal.'\r\n case Setting.MaxPips:\r\n return 'Maximum amount of pips. Affects how much damage units deal.'\r\n case Setting.MaxGeneral:\r\n return 'Maximum amount of pips on generals.'\r\n case Setting.CombatWidth:\r\n return 'Width of the frontline. Affects how many units can fight at the same time.'\r\n case Setting.DiceMaximum:\r\n return 'Maximum dice roll. Affects how much damage units deal.'\r\n case Setting.DiceMinimum:\r\n return 'Minimum dice roll. Affects how much damage units deal.'\r\n case Setting.ExperienceDamageReduction:\r\n return 'Damage reduction given at 100% experience.'\r\n case Setting.Precision:\r\n return 'Precision of combat calculations. Advanced setting.'\r\n case Setting.StackWipeCaptureChance:\r\n return 'Additional unit capture chance when stack wiping an army.'\r\n case Setting.FixExperience:\r\n if (value)\r\n return 'Damage reduction from experience is fixed. All units benefit equally from the experience.'\r\n else\r\n return 'Experience works like in the game.Strength and morale damage taken affect the damage reduction.'\r\n case Setting.StrengthLostMultiplier:\r\n return 'Multiplier for strength damage. Affects how much strength damage units deal.'\r\n case Setting.MinimumStrength:\r\n return 'Strength required for combat. Affects how quicky units retreat.'\r\n case Setting.DamageLossForMissingMorale:\r\n return 'Reduced damage done for lost morale.'\r\n case Setting.MoraleHitForNonSecondaryReinforcement:\r\n return 'Percentage of total morale lost when non-secondary units reinforce (Imperator).'\r\n case Setting.MoraleHitForLateDeployment:\r\n return 'Percentage of total morale lost when armies deploy after retreat is available (Imperator).'\r\n case Setting.MoraleGainForWinning:\r\n return 'Percentage of total morale gained when winning a battle (EU4).'\r\n case Setting.MinimumMorale:\r\n return 'Morale required for combat.Affects how quicky units retreat.'\r\n case Setting.MoraleLostMultiplier:\r\n return 'Multiplier for morale damage. Affects how much morale damage units deal.'\r\n case Setting.DefenderAdvantage:\r\n if (value)\r\n return 'Defending units can\\'t be targeted when they reinforce (Legacy).'\r\n else\r\n return 'Defender gets no undocumented benefits (Imperator, EU4).'\r\n case Setting.RelativeDice:\r\n if (value)\r\n return 'The difference of dice is only applied to the side with higher roll (Experimental).'\r\n else\r\n return 'Dice is applied independently to both sides (Imperator, EU4).'\r\n case Setting.BackRow:\r\n if (value)\r\n return 'Backrow enabled for support and reinforcement units (EU4).'\r\n else\r\n return 'Only front row (Imperator).'\r\n case Setting.BackRowRetreat:\r\n if (value)\r\n return 'Units can retreat from backrow (EU4).'\r\n else\r\n return 'Units from backrow can\\'t retreat.'\r\n case Setting.RetreatRounds:\r\n return 'How long the battle must last to enable retreat.'\r\n case Setting.StackwipeRounds:\r\n return 'How long the battle must last to disable soft stack wiping.'\r\n case Setting.SoftStackWipeLimit:\r\n return 'Strength multiplier for soft stack wiping.'\r\n case Setting.HardStackWipeLimit:\r\n return 'Strength multiplier for hard stack wiping.'\r\n case Setting.Stackwipe:\r\n if (value)\r\n return 'Stacking wiping rules are checked (Imperator, EU4).'\r\n else\r\n return 'Stack wiping is not possible.'\r\n case Setting.MoraleDamageBasedOnTargetStrength:\r\n if (value)\r\n return 'Lower strength increases morale damage taken (experimental).'\r\n else\r\n return 'Strength doesn\\'t affect morale damage taken (Imperator, EU4).'\r\n case Setting.CustomDeployment:\r\n if (value)\r\n return 'Preferred unit types can be selected (Imperator).'\r\n else\r\n return 'Preferred unit types are not available (EU4).'\r\n case Setting.DynamicFlanking:\r\n if (value)\r\n return 'Enemy army size affects flanking slots (EU4).'\r\n else\r\n return 'Amount of flanking slots is only based on preferred flanking (Imperator).'\r\n case Setting.Tactics:\r\n if (value)\r\n return 'Tactics not available (Imperator).'\r\n else\r\n return 'Tactics available (EU4).'\r\n case Setting.AttackerSwapping:\r\n if (value)\r\n return 'With multiple battles, the attacker becomes defender if it wins a battle (Imperator, EU4).'\r\n else\r\n return 'With multiple battles, the original attacker always stays attacker.'\r\n case Setting.Martial:\r\n if (value)\r\n return 'Martial attribute available (Imperator).'\r\n else\r\n return 'Martial not available (EU4).'\r\n case Setting.Tech:\r\n if (value)\r\n return 'Tech level affects available units (EU4).'\r\n else\r\n return 'Units are available regardless of tech level (Imperator).'\r\n case Setting.Culture:\r\n if (value)\r\n return 'Culture affects available units (EU4).'\r\n else\r\n return 'Units are available regardless of culture (Imperator).'\r\n case Setting.Food:\r\n if (value)\r\n return 'Food consumption and storage are shown (Imperator).'\r\n else\r\n return 'Food attributes are not available (EU4).'\r\n case Setting.StrengthBasedFlank:\r\n if (value)\r\n return 'Every 25% of lost strength reduces maneuveur by 25% (EU4).'\r\n else\r\n return 'Cohort strength has no effect on maneuver (Imperator).'\r\n case Setting.AttributeDiscipline:\r\n if (value === DisciplineValue.Damage)\r\n return 'Discipline only increases damage done (Imperator).'\r\n else if (value === DisciplineValue.Both)\r\n return 'Discipline increaes damage done and reduces damage taken (EU4).'\r\n else\r\n return 'Discipline has no effect.'\r\n case Setting.UseMaxMorale:\r\n if (value)\r\n return 'Morale damage is based on the maximum morale (EU4).'\r\n else\r\n return 'Morale damage is based on the current morale (Imperator).'\r\n case Setting.FireAndShock:\r\n if (value)\r\n return 'Combat alternates between fire and shock phases (EU4).'\r\n else\r\n return 'Combat only has one phase (Imperator).'\r\n case Setting.SupportPhase:\r\n if (value)\r\n return 'Support units are deployed when no other units are available (Imperator).'\r\n else\r\n return 'Support units deploy with other units. (EU4).'\r\n case Setting.DailyMoraleLoss:\r\n return 'Amount of morale lost each round (EU4).'\r\n case Setting.DailyDamageIncrease:\r\n return 'How much damage increases every round (EU4).'\r\n case Setting.PhaseLength:\r\n return 'How often dice rolls and phases change.'\r\n case Setting.InsufficientSupportPenalty:\r\n return 'How much damage taken is increased for having too many flanking units (EU4).'\r\n case Setting.FixFlankTargeting:\r\n if (value)\r\n return 'Targeting is fixed.\\nLeft and right flanks work exactly same (Imperator).'\r\n else\r\n return 'Right flank prefers left-most units.\\nLeft and right flanks behave differently (EU4).'\r\n case Setting.DynamicTargeting:\r\n if (value)\r\n return 'Units may flank if the main target is considered too weak (EU4).'\r\n else\r\n return 'Units always attack the main target (Imperator).'\r\n case Setting.AttributeCombatAbility:\r\n if (value)\r\n return 'Combat ability increases damage done (EU4).'\r\n else\r\n return 'Combat ability is ignored (Imperator).'\r\n case Setting.AttributeDamage:\r\n if (value)\r\n return 'Damage done and Damage taken have an effect (Imperator, EU4).'\r\n else\r\n return 'Damage done and Damage taken are ignored.'\r\n case Setting.AttributeLoyal:\r\n if (value)\r\n return 'Loyalty increase damage done (Imperator).'\r\n else\r\n return 'Loyalty is ignored (EU4).'\r\n case Setting.AttributeDrill:\r\n if (value)\r\n return 'Drill increases damage done and reduces damage taken (EU4).'\r\n else\r\n return 'Drill is ignored (Imperator).'\r\n case Setting.AttributeExperience:\r\n if (value)\r\n return 'Experience reduces damage taken (Imperator).'\r\n else\r\n return 'Experience is ignored (EU4).'\r\n case Setting.AttributeMilitaryTactics:\r\n if (value)\r\n return 'Military tactics reduces damage taken (EU4).'\r\n else\r\n return 'Military tactics is ignored (Imperator).'\r\n case Setting.AttributeMoraleDamage:\r\n if (value)\r\n return 'Morale damage done and Morale damage taken have an effect (Imperator).'\r\n else\r\n return 'Morale damage done and Morale damage taken are ignored (EU4).'\r\n case Setting.AttributeOffenseDefense:\r\n if (value)\r\n return 'Offense increases damage done and Defense reduces damage taken (Imperator).'\r\n else\r\n return 'Offense and Defense are ignored (EU4).'\r\n case Setting.AttributeStrengthDamage:\r\n if (value)\r\n return 'Strength damage done and Strength damage taken have an effect (Imperator).'\r\n else\r\n return 'Strength damage done and Strength damage taken are ignored (EU4).'\r\n case Setting.AttributeTerrainType:\r\n if (value)\r\n return 'Terrain types may also increase damage done (Imperator).'\r\n else\r\n return 'Terrain types only affect dice rolls (EU4).'\r\n case Setting.AttributeUnitType:\r\n if (value)\r\n return 'Unit types may increase or decrease damage done (Imperator).'\r\n else\r\n return 'Unit types are ignored (EU4).'\r\n case Setting.MaxPhases:\r\n return 'How many phases are simulated.\\nIncrease for higher accuracy and less incomplete rounds.\\nDecrease forg faster speed.'\r\n case Setting.PhasesPerRoll:\r\n return 'Scales length of phases.\\nIncrease for faster speed and less incomplete rounds.\\nDecrease for higher accuracy.'\r\n case Setting.ChunkSize:\r\n return 'How many battles are simulated in a row. Higher values slightly increase performance but make the UI less responsive.'\r\n case Setting.Performance:\r\n return 'Quick setting for speed and accuracy.\\nAffects phase length multiplier and maximum depth.'\r\n case Setting.ReduceRolls:\r\n return 'Halves number of available dice rolls.\\nMassively increases performance.'\r\n case Setting.CalculateWinChance:\r\n if (value)\r\n return 'Win chance and average rounds are calculated.\\nThis slightly decreases performance.'\r\n else\r\n return 'Win chance and average rounds won\\'t be calculated.\\nThis slightly improves performance.'\r\n case Setting.CalculateCasualties:\r\n if (value)\r\n return 'Casualties are calculated.\\nThis slightly decreases performance.'\r\n else\r\n return 'Casualties won\\'t be calculated.\\nThis slightly improves performance.'\r\n case Setting.CalculateResourceLosses:\r\n if (value)\r\n return 'Gold losses are calculated for naval combat.\\nThis slightly decreases performance.'\r\n else\r\n return 'Gold losses won\\'t be calculated for naval combat.\\nThis slightly improves performance.'\r\n case Setting.ShowGraphs:\r\n if (value)\r\n return 'Graphs are shown.\\nThis slightly decreases performance.'\r\n else\r\n return 'Graphs won\\'t be shown.\\nThis slightly improves performance.'\r\n case Setting.AutoRefresh:\r\n if (value)\r\n return 'Battle refreshes automatically after any changes.'\r\n else\r\n return 'Battle only refreshes when going to previous or next rounds.'\r\n default:\r\n return 'No description.'\r\n }\r\n}\r\n\r\nexport type CombatSettings = {\r\n [Setting.MoraleLostMultiplier]: number,\r\n [Setting.StrengthLostMultiplier]: number,\r\n [Setting.StackWipeCaptureChance]: number\r\n}\r\n\r\nexport type SiteSettings = {\r\n [Setting.BasePips]: number,\r\n [Setting.MaxPips]: number,\r\n [Setting.MaxGeneral]: number,\r\n [Setting.CombatWidth]: number,\r\n [Setting.DiceMaximum]: number,\r\n [Setting.DiceMinimum]: number,\r\n [Setting.ExperienceDamageReduction]: number,\r\n [Setting.MinimumStrength]: number,\r\n [Setting.MoraleHitForNonSecondaryReinforcement]: number,\r\n [Setting.MoraleHitForLateDeployment]: number,\r\n [Setting.MoraleGainForWinning]: number,\r\n [Setting.MinimumMorale]: number,\r\n [Setting.PhaseLength]: number,\r\n [Setting.DynamicTargeting]: boolean,\r\n [Setting.FixFlankTargeting]: boolean,\r\n [Setting.DefenderAdvantage]: boolean,\r\n [Setting.FixExperience]: boolean,\r\n [Setting.Precision]: number,\r\n [Setting.ChunkSize]: number,\r\n [Setting.MaxPhases]: number,\r\n [Setting.PhasesPerRoll]: number,\r\n [Setting.ShowGraphs]: boolean,\r\n [Setting.BackRow]: boolean,\r\n [Setting.RelativeDice]: boolean,\r\n [Setting.BackRowRetreat]: boolean,\r\n [Setting.RetreatRounds]: number,\r\n [Setting.Stackwipe]: boolean,\r\n [Setting.StackwipeRounds]: number,\r\n [Setting.SoftStackWipeLimit]: number,\r\n [Setting.HardStackWipeLimit]: number,\r\n [Setting.MoraleDamageBasedOnTargetStrength]: boolean,\r\n [Setting.DamageLossForMissingMorale]: number,\r\n [Setting.Tactics]: boolean,\r\n [Setting.AttackerSwapping]: boolean,\r\n [Setting.Martial]: boolean,\r\n [Setting.Tech]: boolean,\r\n [Setting.Culture]: boolean,\r\n [Setting.Food]: boolean,\r\n [Setting.CustomDeployment]: boolean,\r\n [Setting.DynamicFlanking]: boolean,\r\n [Setting.UseMaxMorale]: boolean,\r\n [Setting.StrengthBasedFlank]: boolean,\r\n [Setting.InsufficientSupportPenalty]: number,\r\n [Setting.AttributeDiscipline]: DisciplineValue,\r\n [Setting.FireAndShock]: boolean,\r\n [Setting.SupportPhase]: boolean,\r\n [Setting.DailyMoraleLoss]: number,\r\n [Setting.DailyDamageIncrease]: number,\r\n [Setting.AttributeCombatAbility]: boolean,\r\n [Setting.AttributeDamage]: boolean,\r\n [Setting.AttributeDrill]: boolean,\r\n [Setting.AttributeLoyal]: boolean,\r\n [Setting.AttributeExperience]: boolean,\r\n [Setting.AttributeMilitaryTactics]: boolean,\r\n [Setting.AttributeMoraleDamage]: boolean,\r\n [Setting.AttributeOffenseDefense]: boolean,\r\n [Setting.AttributeStrengthDamage]: boolean,\r\n [Setting.AttributeTerrainType]: boolean,\r\n [Setting.AttributeUnitType]: boolean,\r\n [Setting.CalculateWinChance]: boolean,\r\n [Setting.CalculateCasualties]: boolean,\r\n [Setting.CalculateResourceLosses]: boolean,\r\n [Setting.ReduceRolls]: number,\r\n [Setting.Performance]: SimulationSpeed,\r\n [Setting.AutoRefresh]: boolean\r\n}\r\n\r\nexport type Settings = CombatSettings & SiteSettings\r\n\r\nexport type SettingsAndOptions = {\r\n combatSettings: { [key in Mode]: CombatSettings }\r\n siteSettings: SiteSettings\r\n mode: Mode\r\n country: CountryName\r\n army: number\r\n}\r\n","module.exports = __webpack_public_path__ + \"static/media/terrain.9dc94f14.png\";","module.exports = __webpack_public_path__ + \"static/media/naval_combat.68af1ef0.png\";","module.exports = __webpack_public_path__ + \"static/media/attrition.b25f7c4b.png\";","module.exports = __webpack_public_path__ + \"static/media/chance.d3c1fa64.png\";","module.exports = __webpack_public_path__ + \"static/media/manpower.2dab09fc.png\";","module.exports = __webpack_public_path__ + \"static/media/morale.e90af6a8.png\";","module.exports = __webpack_public_path__ + \"static/media/fire.5bac0151.png\";","module.exports = __webpack_public_path__ + \"static/media/shock.3a0ea6d3.png\";","import { DefinitionValues } from 'definition_values'\r\nimport { Mode } from 'types/definition'\r\nimport { TacticType, TacticDefinition } from './tactics'\r\nimport { CombatPhase } from './battle'\r\nimport { Selections, UnitValues, UnitRole, UnitType, Reserve, ReserveData, ReserveDefinition, UnitProperties } from 'types'\r\nimport { UnitDefinitions } from './units'\r\n\r\nexport enum ArmyName {\r\n Army = 'Army',\r\n Navy = 'Navy'\r\n}\r\n\r\nexport enum GeneralAttribute {\r\n Martial = 'Martial',\r\n Maneuver = 'Maneuver'\r\n}\r\n\r\nexport type GeneralDefinition = {\r\n tactic: TacticDefinition\r\n selections: Selections\r\n enabled: boolean\r\n baseValues: GeneralValues\r\n extraValues: GeneralValues\r\n values: GeneralValues\r\n}\r\n\r\nexport type GeneralValues = { [key in GeneralValueType]: number }\r\n\r\nexport type GeneralValueType = GeneralAttribute | CombatPhase\r\n\r\nexport type Armies = { [key in ArmyName]: ArmyData }\r\n\r\nexport interface GeneralData extends DefinitionValues {\r\n tactic: TacticType\r\n selections: Selections\r\n enabled: boolean\r\n definitions: UnitValues\r\n}\r\n\r\nexport type UnitPreferences = { [key in UnitPreferenceType | UnitRole]: UnitType | null }\r\n\r\nexport type ArmyData = {\r\n mode: Mode\r\n unitPreferences: UnitPreferences\r\n flankSize: number\r\n general: GeneralData\r\n reserve: ReserveData\r\n}\r\n\r\nexport type ArmyDefinition = {\r\n unitPreferences: UnitPreferences\r\n unitDefinitions: UnitDefinitions\r\n flankSize: number\r\n flankRatio: number\r\n general: GeneralDefinition\r\n reserve: ReserveDefinition\r\n}\r\n\r\nexport enum ArmyPart {\r\n Frontline = 'Frontline',\r\n Reserve = 'Reserve',\r\n Defeated = 'Defeated',\r\n Retreated = 'Retreated'\r\n}\r\n\r\nexport enum UnitPreferenceType {\r\n Primary = 'Primary',\r\n Secondary = 'Secondary',\r\n Flank = 'PrimaryFlank'\r\n}\r\n\r\n/**\r\n * Information required for fast combat calculation.\r\n * CombatUnits contain most of the information precalculated.\r\n */\r\nexport type Army = {\r\n reserve: Reserve \r\n flankSize: number\r\n flankRatio: number\r\n arrival: number\r\n unitPreferences: UnitPreferences\r\n unitProperties: UnitProperties\r\n leftFlank: number\r\n rightFlank: number\r\n priority: number\r\n tactic: TacticDefinition\r\n participantIndex: number\r\n general: { [key in GeneralValueType]: number }\r\n}\r\n","import { UnitType, UnitValueType, UnitDefinition, UnitAttribute, CombatPhase, CountryName, ArmyName, Mode, UnitRole, Army } from 'types'\r\nimport { DefinitionValues } from 'definition_values'\r\n\r\n\r\n/** An identity of a cohort. Used to store data but shouldn't be used for anything else. */\r\nexport interface CohortData extends DefinitionValues {\r\n type: UnitType\r\n isLoyal?: boolean\r\n}\r\n\r\n\r\n\r\n/** A full cohort (merged with unit definition). */\r\nexport interface CohortDefinition extends CohortData, UnitDefinition {}\r\n\r\nexport type UnitProperties = {[key in UnitType]: CohortProperties}\r\n\r\n/**\r\n * Interface designed for fast combat calculations. This data is cached in simulations (keep lightweight).\r\n */\r\nexport interface Cohort {\r\n [UnitAttribute.Morale]: number\r\n [UnitAttribute.Strength]: number\r\n /** Is the cohort considered weak for targeting. */\r\n isWeak: boolean\r\n state: CohortRoundInfo\r\n properties: CohortProperties\r\n}\r\n\r\ntype UnitCalcs = { [key in (UnitValueType)]: number }\r\n\r\n/**\r\n * Static part of a cohort. Properties which don't change during the battle.\r\n */\r\nexport interface CohortProperties extends UnitCalcs {\r\n damage: { [key in UnitAttribute.Strength | UnitAttribute.Morale | 'Damage']: { [key in UnitType]: { [key in CombatPhase]: number } } } // Damage multiplier for each damage type, versus each unit and for each phase.\r\n damageTakenMultiplier: number\r\n moraleTakenMultiplier: number\r\n strengthTakenMultiplier: { [key in CombatPhase]: number }\r\n participantIndex: number\r\n countryName: CountryName\r\n armyName: ArmyName\r\n index: number\r\n image: string\r\n type: UnitType\r\n isLoyal: boolean\r\n experience: number\r\n maxStrength: number\r\n maxMorale: number\r\n experienceReduction: number\r\n deploymentCost: number\r\n parent?: UnitType\r\n mode: Mode\r\n tech?: number\r\n role?: UnitRole\r\n\r\n // These technically change during battle but are only needed for UI.\r\n reinforcementPenalty: number\r\n deploymentPenalty: number\r\n winningMoraleBonus: number\r\n}\r\n\r\n/** Round specific state for a cohort. */\r\nexport interface CohortRoundInfo {\r\n /** Is attacking diagonally. */\r\n flanking: boolean\r\n /** Targeted enemy cohort. */\r\n target: Cohort | null\r\n /** Support cohort behind the targeted enemy. */\r\n targetSupport: Cohort | null\r\n /** Lost morale this round. */\r\n moraleLoss: number\r\n /** Lost strength this round. */\r\n strengthLoss: number\r\n /** Morale losses inflicted this round. */\r\n moraleDealt: number\r\n /** Strength losses inflicted this round. */\r\n strengthDealt: number\r\n /** Damage taken multiplier from insufficied support. */\r\n flankRatioPenalty: number\r\n /** Damage multiplier. */\r\n damageMultiplier: number\r\n /** Did the cohort get defeated. */\r\n isDefeated: boolean\r\n /** The round of defeat. */\r\n defeatedDay: number \r\n /** The cohort which targeted this cohort last. */\r\n targetedBy: Cohort | null \r\n /** The cohort which defeated this cohort. */\r\n defeatedBy: Cohort | null \r\n /** The army which stack wiped this cohort. */\r\n stackWipedBy: Army | null \r\n /** Did the cohort get destroyed. */\r\n isDestroyed: boolean\r\n /** Total morale losses inflicted during the battle. */\r\n totalMoraleDealt: number\r\n /** Total strength losses inflicted during the battle. */\r\n totalStrengthDealt: number\r\n /** Chance of getting captured. */\r\n captureChance: number\r\n}\r\n\r\nexport type Cohorts = {\r\n frontline: Frontline\r\n reserve: Reserve\r\n defeated: Cohort[]\r\n retreated: Cohort[]\r\n}\r\n\r\nexport type ReserveData = CohortData[]\r\nexport type ReserveDefinition = CohortDefinition[]\r\n\r\nexport type Reserve = {\r\n front: Cohort[]\r\n flank: Cohort[]\r\n support: Cohort[]\r\n}\r\n\r\nexport type Frontline = (Cohort | null)[][]\r\n","import { GovermentType, Selections } from \"./modifiers\"\r\nimport { Armies } from \"./armies\"\r\nimport { UnitsData, UnitAttribute } from \"./units\"\r\nimport { DefinitionValues } from \"definition_values\"\r\n\r\nexport type WearinessAttribute = UnitAttribute.Morale | UnitAttribute.Strength\r\nexport type WearinessAttributes = { [key in WearinessAttribute]: MinMax }\r\ntype MinMax = { min: number, max: number }\r\n\r\n\r\nexport enum CountryName {\r\n Country1 = 'Country 1',\r\n Country2 = 'Country 2'\r\n}\r\nexport type Countries = { [key in CountryName]: CountryDefinition }\r\n\r\nexport enum CountryAttribute {\r\n CombatWidth = 'Combat Width',\r\n FlankRatio = 'Flank Ratio',\r\n MilitaryExperience = 'Military Experience',\r\n OmenPower = 'Omen Power',\r\n TechLevel = 'Tech Tevel',\r\n OfficeMorale = 'Morale Office',\r\n OfficeDiscipline = 'Discipline Office'\r\n}\r\n\r\nexport type CountryDefinitions = { [key in CountryName]: CountryDefinition }\r\n\r\nexport interface CountryDefinition extends DefinitionValues {\r\n selections: Selections\r\n culture: CultureType\r\n government: GovermentType\r\n armies: Armies\r\n units: UnitsData\r\n weariness: WearinessAttributes\r\n}\r\n\r\nexport type Country = { [key in CountryAttribute]: number } & {\r\n selections: Selections\r\n culture: CultureType\r\n weariness: WearinessAttributes\r\n}\r\n\r\nexport enum CultureType { Dummy = 'Dummy' }\r\n","import { UnitType, ValuesType, CultureType } from 'types'\r\nimport { Mode } from './definition'\r\nimport { ObjSet } from 'utils'\r\n\r\nexport enum SelectionType {\r\n Trait = 'Trait',\r\n Ability = 'Ability',\r\n Tradition = 'Tradition',\r\n Invention = 'Invention',\r\n Heritage = 'Heritage',\r\n Law = 'Law',\r\n Deity = 'Deity',\r\n Policy = 'Policy',\r\n Idea = 'Idea',\r\n Trade = 'Trade',\r\n Religion = 'Religion',\r\n Faction = 'Faction',\r\n Modifier = 'Modifier'\r\n}\r\n\r\nexport type Selections = { [key in SelectionType]: ObjSet }\r\n\r\nexport enum ModifierType {\r\n Text = 'Text',\r\n Global = 'Global',\r\n General = 'General',\r\n Country = 'Country'\r\n}\r\n\r\nexport enum GovermentType {\r\n Republic = 'Republic',\r\n Monarch = 'Monarch',\r\n Tribe = 'Tribe'\r\n}\r\n\r\nexport interface Modifier {\r\n target: UnitType | ModifierType | Mode\r\n attribute: string\r\n negative?: boolean\r\n type: ValuesType\r\n noPercent?: boolean\r\n value: number\r\n}\r\n\r\nexport interface ModifierWithKey extends Modifier {\r\n key: string\r\n}\r\nexport interface Invention extends ListDefinition {\r\n index: number\r\n}\r\nexport interface Path {\r\n name: string\r\n key: string\r\n traditions: ListDefinition[]\r\n}\r\nexport interface TraditionDefinition {\r\n name: string\r\n key: CultureType\r\n paths: Path[]\r\n modifiers: Modifier[]\r\n}\r\nexport interface ListDefinition {\r\n name: string\r\n key: string\r\n modifiers: Modifier[]\r\n}\r\nexport type ListDefinitions = { [key: string]: ListDefinition }\r\nexport type DeityDefinition = ListDefinition & { isOmen: boolean }\r\nexport type DeityDefinitions = { [key: string]: DeityDefinition }\r\n\r\nexport type OptionDefinition = ListDefinition[]\r\n\r\nexport interface TechDefinition {\r\n name: string\r\n inventions: Invention[]\r\n}\r\n\r\n\r\ntype ListData = {\r\n name: string\r\n key: string\r\n modifiers: ModifierData[]\r\n}\r\n\r\nexport type OptionData = ListData[]\r\n\r\nexport type DictionaryData = { [key: string]: string }\r\n\r\n\r\ntype ModifierData = {\r\n target: string\r\n attribute: string\r\n value: number\r\n}\r\nexport type TraditionData = {\r\n name: string\r\n key: string\r\n modifiers: ModifierData[]\r\n paths: {\r\n name: string\r\n key: string\r\n traditions: {\r\n name: string\r\n key: string\r\n modifiers: ModifierData[]\r\n }[]\r\n }[]\r\n}\r\n\r\nexport type InventionData = {\r\n name: string\r\n inventions: {\r\n name: string\r\n key: string\r\n index: number\r\n modifiers: ModifierData[]\r\n }[]\r\n}\r\n\r\nexport type Traditions = { [key in CultureType]: TraditionDefinition }\r\n\r\n","import { ArmyName, CountryName, CultureType, GovermentType, Mode, TacticType, UnitAttribute, UnitPreferences, UnitType } from \"types\"\r\nimport { laws } from 'data'\r\n\r\nexport type SaveCountry = {\r\n id: number\r\n name: CountryName\r\n tradition: CultureType\r\n religion: string\r\n government: GovermentType\r\n faction: string\r\n traditions: number[]\r\n heritage: string\r\n tech: number\r\n armies: number[]\r\n inventions: boolean[]\r\n militaryExperience: number\r\n armyMaintenance: string\r\n navalMaintenance: string\r\n religiousUnity: number\r\n laws: string[]\r\n ideas: string[]\r\n surplus: TradeGood[]\r\n officeDiscipline: number\r\n officeMorale: number\r\n deities: string[]\r\n modifiers: string[]\r\n isPlayer: boolean\r\n omen: string\r\n}\r\n\r\ntype SaveJob = {\r\n who: number\r\n character: number\r\n office: string\r\n}\r\n\r\nexport type SavePop = {\r\n type: 'citizen' | 'slaves' | 'nobles' | 'tribesmen' | 'freemen'\r\n culture: string\r\n religion: string\r\n}\r\n\r\nexport type Territory = {\r\n id: string\r\n name: string\r\n controller: number\r\n totalPops: number\r\n pops: { [key: string]: number }\r\n rank: string\r\n}\r\n\r\ntype SaveTerritory = {\r\n trade_goods: TradeGood\r\n province_rank: 'settlement' | 'city'\r\n buildings: number[]\r\n pop: number[]\r\n state: number\r\n owner: number\r\n controller: number\r\n province_name: {\r\n name: string\r\n }\r\n}\r\n\r\nexport type SaveCharacter = {\r\n character_experience: number\r\n attributes: {\r\n martial: number\r\n finesse: number\r\n charisma: number\r\n zeal: number\r\n }\r\n first_name_loc: {\r\n name: string\r\n }\r\n family_name: string\r\n traits: string[]\r\n}\r\n\r\nexport enum TradeGood {\r\n Dummy = 'Dummy'\r\n}\r\n\r\ntype SaveRoute = {\r\n from_state: number\r\n to_state: number\r\n trade_goods: TradeGood\r\n}\r\n\r\nexport type SaveCountryDeity = {\r\n deity: number\r\n}\r\n\r\nexport type Character = {\r\n name: string\r\n martial: number\r\n traitMartial: number\r\n traits: string[]\r\n}\r\n\r\nexport type SaveArmy = {\r\n id: number\r\n name: ArmyName\r\n cohorts: SaveCohort[]\r\n mode: Mode\r\n tactic: TacticType\r\n preferences: UnitPreferences\r\n flankSize: number\r\n leader: Character | null\r\n ability: string\r\n}\r\n\r\nexport type SaveCohort = {\r\n type: UnitType\r\n [UnitAttribute.Morale]: number\r\n [UnitAttribute.Strength]: number\r\n [UnitAttribute.Experience]: number\r\n}\r\n\r\ntype SaveDataCohort = {\r\n type: string\r\n experience: number\r\n morale: number\r\n strength: number\r\n}\r\n\r\nexport type SaveDataUnitName = {\r\n name: string\r\n ordinal?: string\r\n family?: string\r\n}\r\n\r\ntype SaveDataArmy = {\r\n unit_name: SaveDataUnitName\r\n flank_size: number\r\n cohort?: number\r\n ship?: number\r\n leader?: number\r\n is_army: 'yes' | 'no'\r\n primary: string\r\n second: string\r\n flank: string\r\n tactic: string\r\n unit_ability?: {\r\n which?: string\r\n }\r\n}\r\n\r\ntype ElementType> = T extends ReadonlyArray<\r\n infer ElementType\r\n>\r\n ? ElementType\r\n : never\r\n\r\ntype SaveDataCountry = { [key in ElementType]: string } & {\r\n laws?: number[]\r\n units: number[]\r\n active_inventions: number[]\r\n heritage?: string\r\n currency_data?: {\r\n military_experience: number\r\n }\r\n country_name?: {\r\n name: string\r\n }\r\n technology?: {\r\n military_tech?: {\r\n level: number\r\n }\r\n }\r\n military_tradition?: string\r\n economic_policies: number[]\r\n military_tradition_levels: number[]\r\n ideas?: {\r\n idea: {\r\n idea: string[]\r\n }[]\r\n }\r\n pantheon: SaveCountryDeity[]\r\n omen: number\r\n religious_unity: number\r\n religion?: string\r\n ruler_term?: {\r\n party?: string\r\n }\r\n modifier: {\r\n modifier: string\r\n }[]\r\n government_key?: string\r\n capital?: number\r\n tag: string\r\n}\r\n\r\ntype SaveDataWar = {\r\n war_name: {\r\n name: string\r\n ordinal: number\r\n first: {\r\n name: string\r\n }\r\n second: {\r\n name: string\r\n }\r\n }\r\n attacker: number[]\r\n defender: number[]\r\n}\r\n\r\nexport type Save = { [key: string]: any } & {\r\n jobs?: {\r\n office_job: SaveJob[],\r\n techoffice_job: SaveJob[],\r\n province_job: SaveJob[]\r\n }\r\n character?: {\r\n character_database: { [key: number]: SaveCharacter }\r\n }\r\n provinces?: { [key: number]: SaveTerritory }\r\n trade?: {\r\n route: SaveRoute[]\r\n }\r\n armies?: {\r\n subunit_database: { [key: number]: SaveDataCohort }\r\n units_database: { [key: number]: SaveDataArmy }\r\n }\r\n deity_manager?: {\r\n deities_database: { [key: number]: { deity: string, key: string } }\r\n }\r\n country?: {\r\n country_database: { [key: number]: SaveDataCountry }\r\n },\r\n played_country?: {\r\n country: number\r\n }[],\r\n diplomacy?: {\r\n database: { [key: number]: SaveDataWar }\r\n },\r\n population?: {\r\n population: { [key: number]: SavePop }\r\n }\r\n}\r\n","import { UnitType, Definition, Mode } from 'types'\r\nimport { DefinitionValues } from 'definition_values'\r\n\r\nexport enum TacticCalc {\r\n Casualties = 'Casualties'\r\n}\r\n\r\nexport enum TacticType {\r\n Bottleneck = 'Bottleneck',\r\n CavalrySkirmish = 'Cavalry Skirmish',\r\n Deception = 'Deception',\r\n Envelopment = 'Envelopment',\r\n HitAndRun = 'Hit-and-Run',\r\n PadmaVyuha = 'Padma Vyuha',\r\n Phalanx = 'Phalanx',\r\n ShockAction = 'Shock Action',\r\n Skirmishing = 'Skirmishing',\r\n TriplexAcies = 'Triplex Acies',\r\n FrontalAssault = 'Frontal Assault',\r\n NavalEnvelopment = 'Naval Envelopment',\r\n CloseRanks = 'Close Ranks',\r\n Harassment = 'Harassment',\r\n ProbingAttack = 'Probing Attack'\r\n}\r\n\r\nexport type TacticDefinitions = { [key in TacticType]: TacticDefinition }\r\n\r\nexport type TacticValueType = UnitType | TacticCalc | TacticType\r\n\r\nexport interface TacticDefinition extends Definition, DefinitionValues {\r\n mode: Mode\r\n}\r\n\r\nexport enum TacticMatch {\r\n Neutral = 'Neutral',\r\n Positive = 'Positive',\r\n Negative = 'Negative'\r\n}\r\n\r\nexport type Tactic = {\r\n type: TacticType\r\n effect: number\r\n match: TacticMatch\r\n damage: number\r\n casualties: number\r\n image: string\r\n}\r\n\r\nexport const dictionaryTacticType: { [key: string]: TacticType } = {\r\n shock_action: TacticType.ShockAction,\r\n envelopment: TacticType.Envelopment,\r\n skirmishing: TacticType.Skirmishing,\r\n deception: TacticType.Deception,\r\n bottleneck: TacticType.Bottleneck,\r\n greek_phalanx: TacticType.Phalanx,\r\n triplex_acies: TacticType.TriplexAcies,\r\n cavalry_skirmish: TacticType.CavalrySkirmish,\r\n padma_vyuha: TacticType.PadmaVyuha,\r\n hit_and_run_tactics: TacticType.HitAndRun,\r\n frontal_assault: TacticType.FrontalAssault,\r\n naval_envelopment: TacticType.NavalEnvelopment,\r\n close_ranks: TacticType.CloseRanks,\r\n harassment: TacticType.Harassment,\r\n probing_attack: TacticType.ProbingAttack\r\n}","import { Definition } from 'types'\r\nimport { DefinitionValues, calculateValue } from 'definition_values'\r\nimport { Mode } from './definition'\r\n\r\n// Only listed what are required by code. There is actually a lot more terrains.\r\nexport enum TerrainType {\r\n Grasslands = 'Grasslands',\r\n Forest = 'Forest',\r\n Naval = 'Naval',\r\n None = 'None',\r\n Plains = 'Plains',\r\n Riverine = 'Riverine',\r\n Ocean = 'Ocean'\r\n}\r\n\r\nexport enum LocationType {\r\n Border = 'Border',\r\n Tile = 'Tile'\r\n}\r\n\r\nexport enum TerrainCalc {\r\n Roll = 'Roll'\r\n}\r\n\r\nexport type TerrainDefinitions = { [key in TerrainType]: Terrain }\r\n\r\nexport type TerrainValueType = TerrainCalc\r\n\r\nexport interface Terrain extends Definition, DefinitionValues {\r\n location: LocationType\r\n mode: Mode\r\n}\r\n\r\nexport const terrainValueToString = (definition: Terrain, type: TerrainValueType): string => {\r\n const value = calculateValue(definition, type)\r\n return String(value)\r\n}\r\n","export enum ExportKey {\r\n Terrains = 'Terrain Definitions',\r\n Tactics = 'Tactic Definitions',\r\n Countries = 'Countries',\r\n Land = 'Land Armies',\r\n Naval = 'Naval Armies',\r\n Settings = 'Settings'\r\n}\r\n\r\nexport type ExportKeys = { [key in ExportKey]: boolean }\r\n\r\nexport type TransferState = {\r\n exportKeys: ExportKeys,\r\n resetMissing: boolean\r\n}\r\n","import { SideType } from \"./battle\"\r\nimport { ArmyName } from \"./armies\"\r\nimport { CountryName } from \"./countries\"\r\nimport { UnitType } from \"./units\"\r\nimport { TerrainType } from \"./terrains\"\r\nimport { TacticType } from \"./tactics\"\r\nimport { ObjSet } from \"utils\"\r\n\r\nexport enum ModalType {\r\n DiceRolls = 'DiceRolls',\r\n CohortDetail = 'CohortDetail',\r\n UnitDetail = 'UnitDetail',\r\n TerrainDetail = 'TerrainDetail',\r\n TacticDetail = 'TacticDetail',\r\n Value = 'Value'\r\n}\r\n\r\nexport type UI = {\r\n accordions: ObjSet\r\n modals: Modals\r\n selectedParticipantIndex: {[key in SideType]: number}\r\n}\r\n\r\nexport type Modals = {\r\n [ModalType.DiceRolls]?: {\r\n side: SideType\r\n }\r\n [ModalType.CohortDetail]?: {\r\n side: SideType\r\n participantIndex: number\r\n index: number\r\n country: CountryName\r\n army: ArmyName\r\n }\r\n [ModalType.UnitDetail]?: {\r\n country: CountryName,\r\n army: ArmyName,\r\n type: UnitType,\r\n remove?: boolean\r\n }\r\n [ModalType.TerrainDetail]?: {\r\n type: TerrainType\r\n }\r\n [ModalType.TacticDetail]?: {\r\n type: TacticType\r\n }\r\n [ModalType.Value]?: {\r\n onSuccess: (value: string) => void\r\n message: string\r\n buttonMessage: string\r\n initial: string\r\n }\r\n}\r\n","import { DefinitionValues, calculateValue } from 'definition_values'\r\nimport { TerrainType, Definition, Mode, CultureType } from 'types'\r\nimport { toNumber, toPercent, toSignedPercent, toMultiplier } from 'formatters'\r\nimport { CombatPhase } from './battle'\r\n\r\nexport enum UnitType {\r\n Archers = 'Archers',\r\n CamelCavalry = 'Camel Cavalry',\r\n Chariots = 'Chariots',\r\n HeavyCavalry = 'Heavy Cavalry',\r\n HeavyInfantry = 'Heavy Infantry',\r\n HorseArchers = 'Horse Archers',\r\n LightCavalry = 'Light Cavalry',\r\n LightInfantry = 'Light Infantry',\r\n WarElephants = 'War Elephants',\r\n SupplyTrain = 'Supply Train',\r\n Liburnian = 'Liburnian',\r\n Trireme = 'Trireme',\r\n Tetrere = 'Tetrere',\r\n Hexere = 'Hexere',\r\n Octere = 'Octere',\r\n MegaPolyreme = 'Mega-Polyreme',\r\n Land = 'Land Unit',\r\n Naval = 'Naval Unit',\r\n Infantry = 'Infantry',\r\n Cavalry = 'Cavalry',\r\n Artillery = 'Artillery',\r\n LightShip = 'Light Ship',\r\n MediumShip = 'Medium Ship',\r\n HeavyShip = 'Heavy Ship',\r\n Latest = 'Latest',\r\n None = 'None'\r\n}\r\n\r\nexport enum UnitRole {\r\n Front = 'Front',\r\n Flank = 'Flank',\r\n Support = 'Support'\r\n}\r\n\r\nexport enum UnitAttribute {\r\n StrengthDepleted = 'Strength Depleted',\r\n MoraleDepleted = 'Morale Depleted',\r\n Morale = 'Morale',\r\n Strength = 'Strength',\r\n Discipline = 'Discipline',\r\n Offense = 'Offense',\r\n Defense = 'Defense',\r\n Maneuver = 'Maneuver',\r\n MoraleDamageDone = 'Morale Damage Done',\r\n MoraleDamageTaken = 'Morale Damage Taken',\r\n StrengthDamageDone = 'Strength Damage Done',\r\n StrengthDamageTaken = 'Strength Damage Taken',\r\n FireDamageDone = 'Fire Damage Done',\r\n FireDamageTaken = 'Fire Damage Taken',\r\n ShockDamageDone = 'Shock Damage Done',\r\n ShockDamageTaken = 'Shock Damage Taken',\r\n OffensiveFirePips = 'Offensive Fire Pips',\r\n OffensiveShockPips = 'Offensive Shock Pips',\r\n OffensiveMoralePips = 'Offensive Morale Pips',\r\n DefensiveFirePips = 'Defensive Fire Pips',\r\n DefensiveShockPips = 'Defensive Shock Pips',\r\n DefensiveMoralePips = 'Defensive Morale Pips',\r\n OffensiveSupport = 'Damage from Backrow',\r\n DefensiveSupport = 'Defensive Pips to Frontrow',\r\n MilitaryTactics = 'Military Tactics',\r\n CombatAbility = 'Combat Ability',\r\n DamageDone = 'Damage Done',\r\n DamageTaken = 'Damage Taken',\r\n Cost = 'Cost',\r\n Maintenance = 'Maintenance',\r\n AttritionWeight = 'Attrition Weight',\r\n Experience = 'Experience',\r\n Drill = 'Drill',\r\n FoodConsumption = 'Food Consumption',\r\n FoodStorage = 'Food Storage',\r\n CaptureChance = 'Capture Chance',\r\n CaptureResist = 'Capture Resist',\r\n DailyLossResist = 'Daily Loss Resist'\r\n}\r\n\r\nexport type UnitValueType = UnitAttribute | UnitType | TerrainType | CombatPhase\r\nexport type UnitValues = { [key in UnitType]: UnitValue }\r\nexport type UnitValue = DefinitionValues\r\n\r\n/** A single (sub) unit definition. Used to store data but shouldn't be used for anything else. */\r\nexport interface UnitData extends Definition, DefinitionValues {\r\n role?: UnitRole\r\n isLoyal?: boolean\r\n parent?: UnitType\r\n culture?: CultureType\r\n tech?: number\r\n}\r\n\r\n/** A full unit definition (merged with definitions of country, general and parent unit types). */\r\nexport interface UnitDefinition extends UnitData {\r\n mode: Mode\r\n}\r\n\r\nexport const unitValueToString = (definition: DefinitionValues, type: UnitValueType): string => {\r\n const value = calculateValue(definition, type)\r\n switch (type) {\r\n case UnitAttribute.Maneuver:\r\n return toNumber(Math.floor(value))\r\n case UnitAttribute.Cost:\r\n case UnitAttribute.Strength:\r\n case UnitAttribute.StrengthDepleted:\r\n case UnitAttribute.Morale:\r\n case UnitAttribute.MoraleDepleted:\r\n case UnitAttribute.FoodConsumption:\r\n case UnitAttribute.FoodStorage:\r\n return toNumber(value)\r\n case CombatPhase.Fire:\r\n case CombatPhase.Shock:\r\n return toMultiplier(value)\r\n case UnitAttribute.Experience:\r\n case UnitAttribute.Maintenance:\r\n case UnitAttribute.AttritionWeight:\r\n return toPercent(value)\r\n default:\r\n return toSignedPercent(value)\r\n }\r\n}\r\n\r\nexport type UnitsData = { [key in UnitType]: UnitData }\r\nexport type UnitDefinitions = { [key in UnitType]: UnitDefinition }\r\n\r\nexport const dictionaryUnitType: { [key: string]: UnitType } = {\r\n archers: UnitType.Archers,\r\n camels: UnitType.CamelCavalry,\r\n chariots: UnitType.Chariots,\r\n heavy_cavalry: UnitType.HeavyCavalry,\r\n heavy_infantry: UnitType.HeavyInfantry,\r\n horse_archers: UnitType.HorseArchers,\r\n light_cavalry: UnitType.LightCavalry,\r\n light_infantry: UnitType.LightInfantry,\r\n warelephant: UnitType.WarElephants,\r\n supply_train: UnitType.SupplyTrain,\r\n liburnian: UnitType.Liburnian,\r\n trireme: UnitType.Trireme,\r\n tetrere: UnitType.Tetrere,\r\n hexere: UnitType.Hexere,\r\n octere: UnitType.Octere,\r\n mega_galley: UnitType.MegaPolyreme\r\n}","\r\nimport { CombatPhase, GeneralAttribute, CountryAttribute, UnitAttribute, Setting, Mode, ValuesType } from 'types'\r\nimport { toPercent } from 'formatters'\r\nimport { SiteSettings, DisciplineValue } from './settings'\r\n\r\nexport const formatAttribute = (value: number, attribute: string) => {\r\n if (attribute === CountryAttribute.CombatWidth || attribute in GeneralAttribute || attribute in CombatPhase)\r\n return String(value)\r\n return toPercent(value)\r\n}\r\n\r\nexport const filterAttributes = (attributes: T[], settings: SiteSettings, mode?: Mode, showStatistics?: boolean): T[] => attributes.filter(attribute => isAttributeEnabled(attribute, settings, mode, showStatistics))\r\n\r\nexport const getAttributeValuesType = (attribute: UnitAttribute) => attribute === UnitAttribute.Morale ? ValuesType.Modifier : ValuesType.Base\r\n\r\nexport const isAttributeEnabled = (attribute: string, settings: SiteSettings, mode?: Mode, showStatistics?: boolean) => {\r\n if (!showStatistics && (attribute === UnitAttribute.StrengthDepleted || attribute === UnitAttribute.MoraleDepleted))\r\n return false\r\n if (!settings[Setting.BackRow] && (attribute === UnitAttribute.OffensiveSupport || attribute === UnitAttribute.DefensiveSupport))\r\n return false\r\n if (mode !== Mode.Naval && (attribute === UnitAttribute.CaptureChance || attribute === UnitAttribute.CaptureResist))\r\n return false\r\n if (!settings[Setting.DailyMoraleLoss] && attribute === UnitAttribute.DailyLossResist)\r\n return false\r\n if (!settings[Setting.FireAndShock] && attribute in CombatPhase)\r\n return false\r\n if (!settings[Setting.FireAndShock] && (attribute === UnitAttribute.FireDamageDone || attribute === UnitAttribute.FireDamageTaken || attribute === UnitAttribute.ShockDamageDone || attribute === UnitAttribute.ShockDamageTaken))\r\n return false\r\n if (!settings[Setting.FireAndShock] && (attribute === UnitAttribute.OffensiveFirePips || attribute === UnitAttribute.OffensiveMoralePips || attribute === UnitAttribute.OffensiveShockPips))\r\n return false\r\n if (!settings[Setting.FireAndShock] && (attribute === UnitAttribute.DefensiveFirePips || attribute === UnitAttribute.DefensiveMoralePips || attribute === UnitAttribute.DefensiveShockPips))\r\n return false\r\n if (!settings[Setting.FireAndShock] && (attribute === UnitAttribute.DefensiveFirePips || attribute === UnitAttribute.DefensiveMoralePips || attribute === UnitAttribute.DefensiveShockPips))\r\n return false\r\n if (!settings[Setting.AttributeCombatAbility] && attribute === UnitAttribute.CombatAbility)\r\n return false\r\n if (!settings[Setting.AttributeDamage] && (attribute === UnitAttribute.DamageDone || attribute === UnitAttribute.DamageTaken))\r\n return false\r\n if (!settings[Setting.AttributeExperience] && attribute === UnitAttribute.Experience)\r\n return false\r\n if (!settings[Setting.AttributeMilitaryTactics] && attribute === UnitAttribute.MilitaryTactics)\r\n return false\r\n if (!settings[Setting.AttributeMoraleDamage] && (attribute === UnitAttribute.MoraleDamageDone || attribute === UnitAttribute.MoraleDamageTaken))\r\n return false\r\n if (!settings[Setting.AttributeOffenseDefense] && (attribute === UnitAttribute.Offense || attribute === UnitAttribute.Defense))\r\n return false\r\n if (!settings[Setting.AttributeStrengthDamage] && (attribute === UnitAttribute.StrengthDamageDone || attribute === UnitAttribute.StrengthDamageTaken))\r\n return false\r\n if (!settings[Setting.AttributeDrill] && attribute === UnitAttribute.Drill)\r\n return false\r\n if (!settings[Setting.Martial] && attribute === GeneralAttribute.Martial)\r\n return false\r\n if (!settings[Setting.Food] && (attribute === UnitAttribute.FoodConsumption || attribute === UnitAttribute.FoodStorage))\r\n return false\r\n if (!settings[Setting.InsufficientSupportPenalty] && attribute === CountryAttribute.FlankRatio)\r\n return false\r\n if (attribute === CombatPhase.Default)\r\n return false\r\n if (settings[Setting.AttributeDiscipline] === DisciplineValue.Off && attribute === UnitAttribute.Discipline)\r\n return false\r\n return true\r\n}\r\n","import EmptyIcon from './images/empty.png'\r\nimport UnknownIcon from './images/unknown.png'\r\n\r\n/**\r\n * Returns the image of a definition while handling missing cases.\r\n * Question mark is returned for existing definitions without an image.\r\n * Empty is returned for non-existing definitions.\r\n * @param definition\r\n */\r\nexport const getImage = (definition: { image?: string } | null): string => (definition && definition.image) || (definition ? UnknownIcon : EmptyIcon)\r\n\r\n/**\r\n * Wraps a given item into an array if it's not an array already.\r\n * @param item \r\n */\r\nexport function arrayify(item: T[] | undefined): T[]\r\nexport function arrayify(item: T): Exclude[]\r\nexport function arrayify(item: T)\r\n{\r\n return item ? (Array.isArray(item) ? item : [item]) : []\r\n}\r\n\r\n\r\n/**\r\n * Maps a range to a list.\r\n * @param length Length of the range.\r\n * @param func Callback function to create the list from an index.\r\n */\r\nexport const mapRange = (length: number, func: (number: number) => T): T[] => {\r\n const array: T[] = Array(length)\r\n for (let i = 0; i < length; i++) {\r\n array[i] = func(i)\r\n }\r\n return array\r\n}\r\n\r\nexport const noZero = (value: number) => value ? value : 1.0\r\n\r\nexport const randomWithinRange = (min: number, max: number) => min + Math.random() * (max - min)\r\n\r\n/**\r\n * Sums numbers in a list.\r\n * @param list\r\n * @param converter Optional converted to sum complex attributes.\r\n */\r\nexport const sumArr = (arr: T[], converter?: (value: T) => number): number => arr.reduce((previous, current) => previous + (converter ? converter(current) : Number(current)), 0)\r\n\r\n/**\r\n * Sums numbers in a object.\r\n * @param sumObj\r\n * @param converter Optional converted to sum complex attributes.\r\n */\r\nexport const sumObj = (object: { [key: string]: number}, converter?: (value: any) => number): number => Object.values(object).reduce((previous, current) => previous + (converter ? converter(current) : Number(current)), 0)\r\n\r\nexport const showProgress = (text: string, updates: number, dots: number) => '\\u00a0'.repeat(updates % dots) + text + '.'.repeat(updates % dots)\r\n\r\n/**\r\n * Simple round function.\r\n * @param number \r\n */\r\nexport const round = (number: number, precision: number): number => Math.round(precision * number) / precision\r\n\r\nexport function arrGet(arr: V[], index: number): V | undefined\r\nexport function arrGet(arr: V1[], index: number, initial: V2 | undefined): V1 & V2\r\nexport function arrGet(arr: V1[], index: number, initial?: V2)\r\n{\r\n if (index < 0)\r\n index = arr.length + index\r\n if (index < 0 || index >= arr.length)\r\n return initial\r\n return arr[index]\r\n}\r\n\r\nexport const multiplyChance = (chance1?: number, chance2?: number) => chance1 && chance2 ? 1 - (1 - Math.max(0, chance1)) * (1 - Math.max(0, chance2)) : chance1 ? chance1 : chance2 ? chance2 : 0\r\n\r\nexport const keys = (object: { [key in K]: any}) => Object.keys(object) as K[]\r\nconst entries = (object: { [key in K]: V}) => Object.entries(object) as [K, V][]\r\nexport const values = (object: { [key: string]: V}) => Object.values(object) as V[]\r\n\r\nexport const map = (object: { [key in K]: V}, callback: (item: V, key: K) => R): { [key in K]: R} => Object.assign({}, ...entries(object).map(([k ,v]) => ({ [k]: callback(v, k) })))\r\n\r\nexport const forEach2 = (object: { [key in K]: { [key in K]: V}}, callback: (item: V, row: K, column: K) => R): void => (\r\n forEach(object, (sub, row) => forEach(sub, (item, column) => callback(item, row, column)))\r\n)\r\nexport const forEach = (object: { [key in K]: V}, callback: (item: V, key: K) => R): void => entries(object).forEach(([k ,v]) => callback(v, k))\r\nexport const every = (object: { [key in K]: V}, callback: (item: V, key: K) => any): boolean => {\r\n let ret = true \r\n entries(object).forEach(([k ,v]) => ret = !!callback(v, k) && ret)\r\n return ret\r\n}\r\n\r\nexport const excludeMissing = (arr: T[]): Exclude[] => arr.filter(item => item) as Exclude[]\r\n\r\nexport const filter = (object: { [key in K]: V}, callback?: (item: V, key: K) => any): { [key in K]: V} => Object.assign({}, ...entries(object).filter(([k ,v]) => callback ? callback(v, k) : object[k]).map(([k ,v]) => ({ [k]: v })))\r\nexport const filterKeys = (object: { [key in K]: V}, callback?: (key: K) => any): { [key in K]: V} => Object.assign({}, ...entries(object).filter(([k ,v]) => callback ? callback(k) : v).map(([k ,v]) => ({ [k]: v })))\r\n\r\nexport function toArr(object: { [key in K]: V}): V[]\r\nexport function toArr(object: { [key in K]: V}, callback: (value: V, key: K) => R): R[]\r\nexport function toArr(object: { [key in K]: V}, callback?: (value: V, key: K) => R): (R | V)[]\r\n{\r\n return entries(object).map(([k, v]) => callback ? callback(v, k) : v)\r\n}\r\n\r\nexport function mapKeys(object: { [key in K]: any}): K[]\r\nexport function mapKeys(object: { [key in K]: any}, callback: (key: K) => R): R[]\r\nexport function mapKeys(object: { [key in K]: any}, callback?: (key: K) => R): (K | R)[]\r\n{\r\n return keys(object).map(key => callback ? callback(key) : key)\r\n}\r\n\r\nexport function reduce(object: { [key: string]: V }, callback: (previous: V, current: V) => V): V\r\nexport function reduce(object: { [key: string]: V }, callback: (previous: R, current: V) => R, initial: R): R\r\nexport function reduce(object: { [key: string]: V }, callback: (previous: R, current: V) => R, initial?: R): R\r\n{\r\n return values(object).reduce(callback, initial as R)\r\n}\r\n\r\nexport function reduceKeys(object: { [key in K]: any }, callback: (previous: K, current: K) => K): K\r\nexport function reduceKeys(object: { [key in K]: any }, callback: (previous: R, current: K) => R, initial: R): R\r\nexport function reduceKeys(object: { [key in K]: any }, callback: (previous: R, current: K) => R, initial?: R): R\r\n{\r\n return keys(object).reduce(callback, initial as R)\r\n}\r\n\r\nexport function toObj(arr: V[], key: (value: V, index: number) => K): { [key in K]: V}\r\nexport function toObj(arr: V[], key: (value: V, index: number) => K, value: (value: V, index: number) => R): { [key in K]: R}\r\nexport function toObj(arr: V[], key: (value: V, index: number) => K, value: (value: V, index: number) => R = ((value) => value as any as R)): { [key in K]: R}\r\n{\r\n return Object.assign({}, ...arr.map((v, i) => ({ [key(v, i)]: value(v, i) })))\r\n}\r\n\r\nexport const toSet = (object: { [key: string]: V}, key: (value: V) => R): { [key in R]: true } => Object.assign({}, ...values(object).map(v => ({ [key(v)]: true })))\r\n\r\nexport const merge = (object1: { [key in K]: V }, object2: { [key in K]: V }): { [key in K]: V} => ({ ...object1, ...object2 })\r\n\r\nexport type ObjSet = {\r\n [key in K]: true\r\n}\r\n\r\nexport const removeUndefined = (object: { [key: string]: any}) => Object.keys(object).forEach(key => object[key] === undefined && delete object[key])\r\n\r\nexport function resize(arr: (V | undefined)[], size: number): (V | undefined)[]\r\nexport function resize(arr: (V | undefined)[], size: number, defaultValue: V): V[]\r\nexport function resize(arr: (V | undefined)[], size: number, defaultValue?: V): (V | undefined)[] {\r\n const ret = arr.slice(0, size)\r\n while(size > ret.length)\r\n ret.push(defaultValue)\r\n return ret\r\n}\r\n","module.exports = __webpack_public_path__ + \"static/media/unknown.5e96ecce.png\";","module.exports = __webpack_public_path__ + \"static/media/archers.de925dc5.png\";","module.exports = __webpack_public_path__ + \"static/media/camel_cavalry.39b7c18f.png\";","module.exports = __webpack_public_path__ + \"static/media/chariots.5edfec23.png\";","module.exports = __webpack_public_path__ + \"static/media/heavy_cavalry.d6128cd0.png\";","module.exports = __webpack_public_path__ + \"static/media/heavy_infantry.d7987b2c.png\";","module.exports = __webpack_public_path__ + \"static/media/horse_archers.0d44c273.png\";","module.exports = __webpack_public_path__ + \"static/media/light_cavalry.22779517.png\";","module.exports = __webpack_public_path__ + \"static/media/light_infantry.437e4553.png\";","module.exports = __webpack_public_path__ + \"static/media/war_elephants.f051f388.png\";","module.exports = __webpack_public_path__ + \"static/media/supply_train.c85c0890.png\";","module.exports = __webpack_public_path__ + \"static/media/liburnian.54d50648.png\";","module.exports = __webpack_public_path__ + \"static/media/trireme.4dc04744.png\";","module.exports = __webpack_public_path__ + \"static/media/tetrere.16ba4a0c.png\";","module.exports = __webpack_public_path__ + \"static/media/hexere.6beff6bb.png\";","module.exports = __webpack_public_path__ + \"static/media/octere.2830fbbe.png\";","module.exports = __webpack_public_path__ + \"static/media/mega_polyreme.12acab01.png\";","module.exports = __webpack_public_path__ + \"static/media/artillery.e83a7c08.png\";","module.exports = __webpack_public_path__ + \"static/media/cavalry.33f60660.png\";","module.exports = __webpack_public_path__ + \"static/media/infantry.146f7d53.png\";","module.exports = __webpack_public_path__ + \"static/media/bottleneck.6be1ec6f.png\";","module.exports = __webpack_public_path__ + \"static/media/cavalry_skirmish.c984d2a8.png\";","module.exports = __webpack_public_path__ + \"static/media/deception.103a0407.png\";","module.exports = __webpack_public_path__ + \"static/media/envelopment.55e13ce9.png\";","module.exports = __webpack_public_path__ + \"static/media/hit_and_run.fc9c62ec.png\";","module.exports = __webpack_public_path__ + \"static/media/padma_vyuha.1c8c7f30.png\";","module.exports = __webpack_public_path__ + \"static/media/phalanx.0572b023.png\";","module.exports = __webpack_public_path__ + \"static/media/shock_action.1094901e.png\";","module.exports = __webpack_public_path__ + \"static/media/skirmishing.282320b2.png\";","module.exports = __webpack_public_path__ + \"static/media/triplex_acies.6ac511b8.png\";","module.exports = __webpack_public_path__ + \"static/media/frontal_assault.a018a499.png\";","module.exports = __webpack_public_path__ + \"static/media/naval_envelopment.1bbfd9f5.png\";","module.exports = __webpack_public_path__ + \"static/media/harassment.3cd993fb.png\";","module.exports = __webpack_public_path__ + \"static/media/probing_attack.0e30140c.png\";","module.exports = __webpack_public_path__ + \"static/media/close_ranks.ec3a2df0.png\";","module.exports = __webpack_public_path__ + \"static/media/discipline.ea3e47ff.png\";","module.exports = __webpack_public_path__ + \"static/media/offense.01ec4ba1.png\";","module.exports = __webpack_public_path__ + \"static/media/defense.cb5d33c2.png\";","module.exports = __webpack_public_path__ + \"static/media/combat_ability.8daf71fe.png\";","module.exports = __webpack_public_path__ + \"static/media/cost.7bb9d43b.png\";","module.exports = __webpack_public_path__ + \"static/media/food.c2deeba1.png\";","module.exports = __webpack_public_path__ + \"static/media/food_capacity.e0521ad0.png\";","module.exports = __webpack_public_path__ + \"static/media/supply_limit.17948f31.png\";","module.exports = __webpack_public_path__ + \"static/media/yes.bd9bced1.png\";","module.exports = __webpack_public_path__ + \"static/media/no.d31a7d6c.png\";","\r\nexport enum ValuesType {\r\n Base = 'Base',\r\n Modifier = 'Modifier',\r\n Gain = 'Gain',\r\n Loss = 'Loss',\r\n LossModifier = 'LossModifier'\r\n}\r\n\r\nexport enum Mode {\r\n Land = 'Land',\r\n Naval = 'Naval'\r\n}\r\n\r\nexport interface Definition {\r\n type: T\r\n image: string\r\n mode?: Mode\r\n}\r\n","module.exports = __webpack_public_path__ + \"static/media/land_combat.9bab4016.png\";","import { Mode, ArmyData, TacticType, UnitPreferences, UnitPreferenceType, UnitType, Armies, ArmyName, UnitRole, Selections } from 'types'\r\n\r\nconst getDefaultTactic = (mode: Mode): TacticType => mode === Mode.Land ? TacticType.Deception : TacticType.FrontalAssault\r\n\r\nconst getDefaultUnitPreferences = (mode: Mode): UnitPreferences => {\r\n if (process.env.REACT_APP_GAME === 'euiv') {\r\n return {\r\n [UnitRole.Front]: UnitType.Latest,\r\n [UnitRole.Flank]: UnitType.Latest,\r\n [UnitRole.Support]: UnitType.Latest\r\n } as UnitPreferences\r\n }\r\n if (mode === Mode.Naval) {\r\n return {\r\n [UnitPreferenceType.Primary]: UnitType.MegaPolyreme,\r\n [UnitPreferenceType.Secondary]: UnitType.MegaPolyreme,\r\n [UnitPreferenceType.Flank]: UnitType.MegaPolyreme\r\n } as UnitPreferences\r\n }\r\n else {\r\n return {\r\n [UnitPreferenceType.Primary]: UnitType.Archers,\r\n [UnitPreferenceType.Secondary]: UnitType.HeavyInfantry,\r\n [UnitPreferenceType.Flank]: UnitType.LightCavalry\r\n } as UnitPreferences\r\n }\r\n}\r\n\r\nconst initializeDefaultArmy = (mode: Mode): ArmyData => ({\r\n reserve: [],\r\n unitPreferences: getDefaultUnitPreferences(mode),\r\n flankSize: 5,\r\n general: {\r\n enabled: true,\r\n selections: {} as Selections,\r\n definitions: {} as any,\r\n tactic: getDefaultTactic(mode)\r\n },\r\n mode\r\n})\r\n\r\n\r\nexport const getDefaultArmyName = (mode: Mode): ArmyName => mode === Mode.Land ? ArmyName.Army : ArmyName.Navy\r\n\r\nexport const getDefaultArmy = (mode: Mode): ArmyData => initializeDefaultArmy(mode)\r\n\r\nexport const getDefaultArmies = (): Armies => ({\r\n [ArmyName.Army]: getDefaultArmy(Mode.Land),\r\n [ArmyName.Navy]: getDefaultArmy(Mode.Naval)\r\n})\r\n","import { Mode } from \"types/definition\"\r\nimport { Battle, CountryName, SideType, ModeState, TerrainType, Participant, ArmyName, SideData } from \"types\"\r\nimport { mapRange } from \"utils\"\r\n\r\nexport const getInitialTerrains = (mode: Mode): TerrainType[] => {\r\n if (mode === Mode.Naval)\r\n return [TerrainType.Ocean]\r\n else\r\n return [TerrainType.None, process.env.REACT_APP_GAME === 'euiv' ? TerrainType.Grasslands : TerrainType.Plains]\r\n}\r\n\r\nexport const getDefaultSide = (type: SideType, name: CountryName, mode: Mode, participants: number): SideData => {\r\n return {\r\n type,\r\n participants: mapRange(participants, () => getDefaultParticipant(name, mode)),\r\n days: [],\r\n rolls: [0],\r\n dice: (process.env.REACT_APP_GAME === 'euiv' ? 5 : 3),\r\n randomizeDice: false\r\n }\r\n}\r\n\r\nexport const getDefaultParticipant = (name: CountryName, mode: Mode): Participant => {\r\n return {\r\n countryName: name,\r\n armyName: mode === Mode.Land ? ArmyName.Army : ArmyName.Navy,\r\n daysUntilBattle: 0\r\n }\r\n}\r\n\r\nexport const getDefaultMode = (mode: Mode, participants: number = 1): Battle => ({\r\n sides: { [SideType.A]: getDefaultSide(SideType.A, CountryName.Country1, mode, participants), [SideType.B]: getDefaultSide(SideType.B, CountryName.Country2, mode, participants) },\r\n terrains: getInitialTerrains(mode),\r\n fightOver: true,\r\n seed: 0,\r\n customSeed: undefined,\r\n outdated: true,\r\n timestamp: 0,\r\n days: []\r\n})\r\n\r\nexport const getDefaultBattle = (participants: number = 1): ModeState => ({ [Mode.Land]: getDefaultMode(Mode.Land, participants), [Mode.Naval]: getDefaultMode(Mode.Naval, participants) })\r\n","import { ValuesType, UnitType, UnitData, UnitAttribute, UnitValueType, UnitRole, TerrainType, UnitsData, Mode, CultureType, CombatPhase } from 'types'\r\nimport { addValues } from 'definition_values'\r\nimport { toObj, removeUndefined, filter, toArr, values } from 'utils'\r\nimport { uniq } from 'lodash'\r\n\r\nimport unitsIR from './json/ir/units.json'\r\nimport parentsIR from './json/ir/parent_units.json'\r\nimport parentsEUIV from './json/euiv/parent_units.json'\r\nimport unitsEUIV from './json/euiv/units.json'\r\nimport IconArcher from 'images/archers.png'\r\nimport IconCamelCavalry from 'images/camel_cavalry.png'\r\nimport IconChariots from 'images/chariots.png'\r\nimport IconHeavyCavalry from 'images/heavy_cavalry.png'\r\nimport IconHeavyInfantry from 'images/heavy_infantry.png'\r\nimport IconHorseArchers from 'images/horse_archers.png'\r\nimport IconLightCavalry from 'images/light_cavalry.png'\r\nimport IconLightInfantry from 'images/light_infantry.png'\r\nimport IconWarElephants from 'images/war_elephants.png'\r\nimport IconSupplyTrain from 'images/supply_train.png'\r\nimport IconMilitaryPower from 'images/military_power.png'\r\nimport IconLiburnian from 'images/liburnian.png'\r\nimport IconTrireme from 'images/trireme.png'\r\nimport IconTetrere from 'images/tetrere.png'\r\nimport IconHexere from 'images/hexere.png'\r\nimport IconOctere from 'images/octere.png'\r\nimport IconMegaPolyreme from 'images/mega_polyreme.png'\r\nimport IconArtillery from 'images/artillery.png'\r\nimport IconCavalry from 'images/cavalry.png'\r\nimport IconInfantry from 'images/infantry.png'\r\nimport IconEmpty from 'images/empty.png'\r\nimport { getConfig } from './config'\r\n\r\nconst unitToIcon: { [key in UnitType]: string } = {\r\n [UnitType.Archers]: IconArcher,\r\n [UnitType.CamelCavalry]: IconCamelCavalry,\r\n [UnitType.Chariots]: IconChariots,\r\n [UnitType.HeavyCavalry]: IconHeavyCavalry,\r\n [UnitType.HeavyInfantry]: IconHeavyInfantry,\r\n [UnitType.HorseArchers]: IconHorseArchers,\r\n [UnitType.LightCavalry]: IconLightCavalry,\r\n [UnitType.LightInfantry]: IconLightInfantry,\r\n [UnitType.WarElephants]: IconWarElephants,\r\n [UnitType.SupplyTrain]: IconSupplyTrain,\r\n [UnitType.Liburnian]: IconLiburnian,\r\n [UnitType.Trireme]: IconTrireme,\r\n [UnitType.Tetrere]: IconTetrere,\r\n [UnitType.Hexere]: IconHexere,\r\n [UnitType.Octere]: IconOctere,\r\n [UnitType.MegaPolyreme]: IconMegaPolyreme,\r\n [UnitType.Land]: IconMilitaryPower,\r\n [UnitType.Naval]: IconMilitaryPower,\r\n [UnitType.Cavalry]: IconCavalry,\r\n [UnitType.Infantry]: IconInfantry,\r\n [UnitType.Artillery]: IconArtillery,\r\n [UnitType.LightShip]: IconMilitaryPower,\r\n [UnitType.MediumShip]: IconMilitaryPower,\r\n [UnitType.HeavyShip]: IconMilitaryPower,\r\n [UnitType.Latest]: IconMilitaryPower,\r\n [UnitType.None]: IconEmpty\r\n}\r\n\r\nexport const getUnitIcon = (type: UnitType) => unitToIcon[type] || ''\r\n\r\n\r\nconst createUnitFromJson = (data: UnitJSON): UnitData => {\r\n const handleAttributes = (attributes: any[]) => attributes.filter(type => (data as any)[type]).map(type => [type, (data as any)[type]] as [UnitValueType, number])\r\n\r\n let unit: UnitData = {\r\n type: data.Type as UnitType,\r\n mode: data.Mode as Mode | undefined,\r\n image: unitToIcon[data.Type as UnitType] ?? unitToIcon[data.Parent as UnitType] ?? '',\r\n role: data.Role ? data.Role as UnitRole : undefined,\r\n parent: data.Parent ? data.Parent as UnitType : undefined,\r\n culture: data.Culture ? data.Culture as CultureType : undefined,\r\n tech: data.Tech\r\n }\r\n removeUndefined(unit)\r\n const baseValues: [UnitValueType, number][] = [\r\n ...handleAttributes(values(UnitAttribute)),\r\n ...handleAttributes(values(TerrainType)),\r\n ...handleAttributes(values(UnitType)),\r\n ...handleAttributes(values(CombatPhase))\r\n ]\r\n unit = addValues(unit, ValuesType.Base, unit.type, baseValues)\r\n return unit\r\n}\r\n\r\nconst initializeDefaultUnits = (): UnitsData => {\r\n if (process.env.REACT_APP_GAME === 'euiv')\r\n return toObj(parentsEUIV.map(createUnitFromJson).concat(unitsEUIV.map(createUnitFromJson)), unit => unit.type)\r\n else\r\n return toObj(parentsIR.map(createUnitFromJson).concat(unitsIR.map(createUnitFromJson)), unit => unit.type)\r\n}\r\nconst defaultUnits = initializeDefaultUnits()\r\n\r\nexport const getCultures = () => uniq(toArr(defaultUnits, value => value.culture).filter(culture => culture) as CultureType[]).sort()\r\n\r\nexport const getDefaultUnits = (culture?: CultureType): UnitsData => culture ? filter(defaultUnits, unit => !unit.culture || unit.culture === culture) : defaultUnits\r\nexport const getDefaultUnit = (type: UnitType): UnitData => defaultUnits[type]\r\n\r\ninterface UnitJSON {\r\n Parent: string | null\r\n Type: string\r\n Mode?: string\r\n Culture?: string\r\n Role?: string\r\n Tech?: number\r\n}\r\n","import { GovermentType, CountryName, CultureType, CountryAttribute, UnitAttribute, Selections, CountryDefinitions } from 'types'\r\nimport { getDefaultArmies } from 'data'\r\nimport { getDefaultUnits } from './units'\r\n\r\nexport const getDefaultCountry = () => ({\r\n selections: {} as Selections,\r\n government: GovermentType.Republic,\r\n culture: (process.env.REACT_APP_GAME === 'euiv' ? 'Western' : 'latin_philosophy') as CultureType,\r\n armies: getDefaultArmies(),\r\n units: getDefaultUnits((process.env.REACT_APP_GAME === 'euiv' ? 'Western' : undefined) as CultureType),\r\n baseValues: {\r\n [CountryAttribute.FlankRatio]: {\r\n 'Base': 0.5\r\n },\r\n [CountryAttribute.OmenPower]: {\r\n 'Base': 100\r\n },\r\n [CountryAttribute.TechLevel]: {\r\n 'Base': (process.env.REACT_APP_GAME === 'euiv' ? 3 : 0)\r\n }\r\n } as any,\r\n weariness: { [UnitAttribute.Morale]: { min: 0, max: 0 }, [UnitAttribute.Strength]: { min: 0, max: 0 } }\r\n})\r\n\r\nexport const getDefaultCountryDefinitions = (): CountryDefinitions => ({\r\n [CountryName.Country1]: getDefaultCountry(),\r\n [CountryName.Country2]: getDefaultCountry()\r\n})\r\n","import { sortBy } from 'lodash'\r\nimport { toObj } from 'utils'\r\nimport {\r\n OptionDefinition, TechDefinition, ListDefinitions, DeityDefinitions, DictionaryData, InventionData, OptionData, TraditionData, Traditions\r\n} from 'types'\r\n\r\nimport traditionData from './json/ir/traditions.json'\r\nimport tradeData from './json/ir/trades.json'\r\nimport heritageData from './json/ir/heritages.json'\r\nimport cultureData from './json/ir/cultures.json'\r\nimport techDataIR from './json/ir/tech.json'\r\nimport traitData from './json/ir/traits.json'\r\nimport lawData from './json/ir/laws.json'\r\nimport policyData from './json/ir/policies.json'\r\nimport ideaData from './json/ir/ideas.json'\r\nimport abilityData from './json/ir/abilities.json'\r\nimport countryData from './json/ir/countries.json'\r\nimport territoryData from './json/ir/territories.json'\r\nimport deityData from './json/ir/deities.json'\r\nimport religionData from './json/ir/religions.json'\r\nimport factionData from './json/ir/parties.json'\r\nimport modifierData from './json/ir/modifiers.json'\r\n\r\n// Bit ugly but these enable tree shaking based on the game.\r\nconst getTraditionDataIR = () => process.env.REACT_APP_GAME === 'ir' ? Array.from(traditionData) : [] as TraditionData[]\r\nconst getTechDataIR = () => process.env.REACT_APP_GAME === 'ir' ? Array.from(techDataIR) : [] as InventionData[]\r\nconst getPolicyDataIR = () => process.env.REACT_APP_GAME === 'ir' ? Array.from(policyData) : [] as OptionData[]\r\nconst getAbilityDataIR = () => process.env.REACT_APP_GAME === 'ir' ? Array.from(abilityData.abilities) : [] as OptionData[]\r\nconst getFactionDefinitionsIR = () => process.env.REACT_APP_GAME === 'ir' ? factionData as ListDefinitions : {}\r\nconst getModifierDefinitionsIR = () => process.env.REACT_APP_GAME === 'ir' ? modifierData as ListDefinitions : {}\r\nconst getIdeaDefinitionsIR = () => process.env.REACT_APP_GAME === 'ir' ? ideaData as ListDefinitions : {}\r\nconst getDeityDefinitionsIR = () => process.env.REACT_APP_GAME === 'ir' ? deityData as DeityDefinitions : {}\r\nconst getHeritageDefinitionsIR = () => process.env.REACT_APP_GAME === 'ir' ? heritageData as ListDefinitions : {}\r\nconst getLawDefinitionsIR = () => process.env.REACT_APP_GAME === 'ir' ? lawData as ListDefinitions : {}\r\nconst getReligionDefinitionsIR = () => process.env.REACT_APP_GAME === 'ir' ? religionData as ListDefinitions : {}\r\nconst getTraitDefinitionsIR = () => process.env.REACT_APP_GAME === 'ir' ? traitData as ListDefinitions : {}\r\nconst getTradeDefinitionsIR = () => process.env.REACT_APP_GAME === 'ir' ? tradeData as ListDefinitions : {}\r\nconst getCountryNames = () => process.env.REACT_APP_GAME === 'ir' ? countryData : {} as DictionaryData\r\nconst getTerritoryNames = () => process.env.REACT_APP_GAME === 'ir' ? territoryData : {} as DictionaryData\r\nconst getCultureNames = () => process.env.REACT_APP_GAME === 'ir' ? cultureData : {} as DictionaryData\r\n\r\nexport const abilitiesIR = sortBy(getAbilityDataIR(), () => 1) as OptionDefinition[]\r\nexport const traitsIR = getTraitDefinitionsIR()\r\nexport const heritagesIR = getHeritageDefinitionsIR()\r\nexport const tradesIR = getTradeDefinitionsIR()\r\nexport const traditionsIR = toObj(sortBy(getTraditionDataIR(), value => value.name), value => value.key) as Traditions\r\nexport const ideasIR = getIdeaDefinitionsIR()\r\nexport const lawsIR = getLawDefinitionsIR()\r\nexport const deitiesIR = getDeityDefinitionsIR()\r\nexport const policiesIR = sortBy(getPolicyDataIR(), () => 1) as OptionDefinition[]\r\nexport const countriesIR = getCountryNames()\r\nexport const territoriesIR = getTerritoryNames()\r\nexport const religionsIR = getReligionDefinitionsIR()\r\nexport const factionsIR = getFactionDefinitionsIR()\r\nexport const modifiersIR = getModifierDefinitionsIR()\r\nexport const culturesIR = getCultureNames()\r\nexport const techIR = sortBy(getTechDataIR(), () => 1) as TechDefinition[]\r\n","import {ListDefinition, ListDefinitions } from 'types'\r\n\r\n\r\nimport techDataEUIV from './json/euiv/tech.json'\r\nimport policyDataEUIV from './json/euiv/policies.json'\r\n\r\n// Bit ugly but these enable tree shaking based on the game.\r\nexport const techEUIV = process.env.REACT_APP_GAME === 'euiv' ? Array.from(techDataEUIV) as ListDefinition[] : []\r\nexport const policiesEUIV = process.env.REACT_APP_GAME === 'euiv' ? policyDataEUIV as ListDefinitions: {}\r\n","\r\n export const laws = [\r\n 'succession_law',\r\n 'monarchy_military_reforms',\r\n 'monarchy_maritime_laws',\r\n 'monarchy_economic_law',\r\n 'monarchy_citizen_law',\r\n 'monarchy_religious_laws',\r\n 'monarchy_legitimacy_laws',\r\n 'monarchy_contract_law',\r\n 'monarchy_divinity_statutes',\r\n 'monarchy_subject_laws',\r\n 'republic_military_recruitment_laws',\r\n 'republic_election_reforms',\r\n 'corruption_laws',\r\n 'republican_mediterranean_laws',\r\n 'republican_religious_laws',\r\n 'republic_integration_laws',\r\n 'republic_citizen_laws',\r\n 'republican_land_reforms',\r\n 'republic_military_recruitment_laws_rom',\r\n 'republic_election_reforms_rom',\r\n 'corruption_laws_rom',\r\n 'republican_mediterranean_laws_rom',\r\n 'republican_religious_laws_rom',\r\n 'republic_integration_laws_rom',\r\n 'republic_citizen_laws_rom',\r\n 'republican_land_reforms_rom',\r\n 'tribal_religious_law',\r\n 'tribal_currency_laws',\r\n 'tribal_centralization_law',\r\n 'tribal_authority_laws',\r\n 'tribal_autonomy_laws',\r\n 'tribal_domestic_laws',\r\n 'tribal_decentralized_laws',\r\n 'tribal_centralized_laws',\r\n 'tribal_super_decentralized_laws',\r\n 'tribal_super_centralized_laws'\r\n ] as const","import configIR from './json/ir/config.json'\r\n\r\nexport const getConfig = () => configIR\r\n","import { Mode, CombatSettings, Setting, SiteSettings, SimulationSpeed, CountryName, SettingsAndOptions, DisciplineValue } from 'types'\r\nimport { getConfig } from './config'\r\n\r\nexport const getDefaultSettings = (): SettingsAndOptions => ({\r\n combatSettings: { [Mode.Land]: getDefaultLandSettings(), [Mode.Naval]: getDefaultNavalSettings() },\r\n siteSettings: getDefaultSiteSettings(),\r\n mode: Mode.Land,\r\n army: 0,\r\n country: CountryName.Country1\r\n})\r\n\r\nexport const getDefaultLandSettings = (): CombatSettings => {\r\n if (process.env.REACT_APP_GAME === 'euiv') {\r\n return {\r\n [Setting.StrengthLostMultiplier]: 5,\r\n [Setting.MoraleLostMultiplier]: 25 / 2.7,\r\n [Setting.StackWipeCaptureChance]: 0\r\n }\r\n }\r\n else {\r\n return {\r\n [Setting.StrengthLostMultiplier]: getConfig().Land.StrengthDamage,\r\n [Setting.MoraleLostMultiplier]: getConfig().Land.MoraleDamage,\r\n [Setting.StackWipeCaptureChance]: getConfig().Land.StackWipeCaptureChance\r\n }\r\n }\r\n}\r\n\r\nexport const getDefaultNavalSettings = (): CombatSettings => {\r\n if (process.env.REACT_APP_GAME === 'euiv') {\r\n return {\r\n [Setting.StrengthLostMultiplier]: 5,\r\n [Setting.MoraleLostMultiplier]: 25 / 2.7,\r\n [Setting.StackWipeCaptureChance]: 0\r\n }\r\n }\r\n else {\r\n return {\r\n [Setting.StrengthLostMultiplier]: getConfig().Naval.StrengthDamage,\r\n [Setting.MoraleLostMultiplier]: getConfig().Naval.MoraleDamage,\r\n [Setting.StackWipeCaptureChance]: getConfig().Naval.StackWipeCaptureChance\r\n }\r\n }\r\n}\r\n\r\nexport const getDefaultSiteSettings = (): SiteSettings => {\r\n if (process.env.REACT_APP_GAME === 'euiv') {\r\n return {\r\n [Setting.BasePips]: 3,\r\n [Setting.MaxPips]: 100,\r\n [Setting.MaxGeneral]: 6,\r\n [Setting.DiceMinimum]: 0,\r\n [Setting.DiceMaximum]: 9,\r\n [Setting.PhaseLength]: 3,\r\n [Setting.RetreatRounds]: 12,\r\n [Setting.StackwipeRounds]: 12,\r\n [Setting.Stackwipe]: true,\r\n [Setting.SoftStackWipeLimit]: 2,\r\n [Setting.HardStackWipeLimit]: 10,\r\n [Setting.CombatWidth]: 15,\r\n [Setting.ExperienceDamageReduction]: 0,\r\n [Setting.MinimumMorale]: 0,\r\n [Setting.MinimumStrength]: 0,\r\n [Setting.MoraleHitForNonSecondaryReinforcement]: 0,\r\n [Setting.MoraleHitForLateDeployment]: 0,\r\n [Setting.MoraleGainForWinning]: 0.5,\r\n [Setting.FixExperience]: false,\r\n [Setting.DefenderAdvantage]: false,\r\n [Setting.FixFlankTargeting]: false,\r\n [Setting.BackRow]: true,\r\n [Setting.RelativeDice]: false,\r\n [Setting.DynamicTargeting]: true,\r\n [Setting.BackRowRetreat]: false,\r\n [Setting.StrengthBasedFlank]: true,\r\n [Setting.AttributeDiscipline]: DisciplineValue.Both,\r\n [Setting.DailyMoraleLoss]: 0.03,\r\n [Setting.DailyDamageIncrease]: 0.01,\r\n [Setting.UseMaxMorale]: true,\r\n [Setting.FireAndShock]: true,\r\n [Setting.InsufficientSupportPenalty]: 0.25,\r\n [Setting.AttributeCombatAbility]: true,\r\n [Setting.SupportPhase]: false,\r\n [Setting.AttributeDamage]: true,\r\n [Setting.AttributeDrill]: true,\r\n [Setting.AttributeLoyal]: false,\r\n [Setting.AttributeExperience]: false,\r\n [Setting.AttributeMilitaryTactics]: true,\r\n [Setting.AttributeMoraleDamage]: false,\r\n [Setting.AttributeOffenseDefense]: false,\r\n [Setting.AttributeStrengthDamage]: false,\r\n [Setting.AttributeTerrainType]: false,\r\n [Setting.AttributeUnitType]: false,\r\n [Setting.Tactics]: false,\r\n [Setting.Martial]: false,\r\n [Setting.AttackerSwapping]: true,\r\n [Setting.CustomDeployment]: false,\r\n [Setting.DynamicFlanking]: true,\r\n [Setting.Tech]: true,\r\n [Setting.Culture]: true,\r\n [Setting.Food]: false,\r\n [Setting.Precision]: 3,\r\n [Setting.AutoRefresh]: true,\r\n [Setting.MoraleDamageBasedOnTargetStrength]: false, \r\n [Setting.DamageLossForMissingMorale]: 0,\r\n // Analyze\r\n [Setting.Performance]: SimulationSpeed.Fast,\r\n [Setting.ChunkSize]: 1000,\r\n [Setting.MaxPhases]: speedValues[SimulationSpeed.Fast][1],\r\n [Setting.PhasesPerRoll]: speedValues[SimulationSpeed.Fast][0],\r\n [Setting.ReduceRolls]: speedValues[SimulationSpeed.Fast][2],\r\n [Setting.CalculateWinChance]: true,\r\n [Setting.CalculateCasualties]: true,\r\n [Setting.CalculateResourceLosses]: true,\r\n [Setting.ShowGraphs]: false\r\n }\r\n }\r\n else {\r\n return {\r\n [Setting.BasePips]: getConfig().BasePips,\r\n [Setting.MaxPips]: getConfig().MaxPips,\r\n [Setting.MaxGeneral]: 100,\r\n [Setting.DiceMinimum]: getConfig().DiceMinimum,\r\n [Setting.DiceMaximum]: getConfig().DiceMaximum,\r\n [Setting.PhaseLength]: getConfig().PhaseLength,\r\n [Setting.RetreatRounds]: 0,\r\n [Setting.StackwipeRounds]: getConfig().PhaseLength,\r\n [Setting.Stackwipe]: true,\r\n [Setting.SoftStackWipeLimit]: getConfig().SoftStackWipeLimit,\r\n [Setting.HardStackWipeLimit]: getConfig().HardStackWipeLimit,\r\n [Setting.CombatWidth]: getConfig().CombatWidth,\r\n [Setting.ExperienceDamageReduction]: getConfig().ExperienceDamageReduction,\r\n [Setting.MinimumMorale]: getConfig().MinimumMorale,\r\n [Setting.MinimumStrength]: getConfig().MinimumStrength,\r\n [Setting.MoraleHitForNonSecondaryReinforcement]: getConfig().MoraleHitForNonSecondaryReinforcement,\r\n [Setting.MoraleHitForLateDeployment]: getConfig().MoraleHitForLateDeployment,\r\n [Setting.MoraleGainForWinning]: 0,\r\n [Setting.FixExperience]: false,\r\n [Setting.DefenderAdvantage]: false,\r\n [Setting.FixFlankTargeting]: true,\r\n [Setting.DynamicTargeting]: false,\r\n [Setting.BackRow]: false,\r\n [Setting.RelativeDice]: false,\r\n [Setting.BackRowRetreat]: false,\r\n [Setting.StrengthBasedFlank]: false,\r\n [Setting.SupportPhase]: true,\r\n [Setting.Precision]: 5,\r\n [Setting.ChunkSize]: 1000,\r\n [Setting.MaxPhases]: speedValues[SimulationSpeed.Fast][1],\r\n [Setting.PhasesPerRoll]: speedValues[SimulationSpeed.Fast][0],\r\n [Setting.Performance]: SimulationSpeed.Fast,\r\n [Setting.ReduceRolls]: speedValues[SimulationSpeed.Fast][2],\r\n [Setting.CalculateWinChance]: true,\r\n [Setting.CalculateCasualties]: true,\r\n [Setting.CalculateResourceLosses]: true,\r\n [Setting.ShowGraphs]: false,\r\n [Setting.AttributeDiscipline]: DisciplineValue.Damage,\r\n [Setting.DailyMoraleLoss]: 0,\r\n [Setting.DailyDamageIncrease]: 0,\r\n [Setting.UseMaxMorale]: false,\r\n [Setting.FireAndShock]: false,\r\n [Setting.InsufficientSupportPenalty]: 0.0,\r\n [Setting.AttributeCombatAbility]: false,\r\n [Setting.AttributeDamage]: true,\r\n [Setting.AttributeDrill]: false,\r\n [Setting.AttributeExperience]: true,\r\n [Setting.AttributeLoyal]: true,\r\n [Setting.AttributeMilitaryTactics]: false,\r\n [Setting.AttributeMoraleDamage]: true,\r\n [Setting.AttributeOffenseDefense]: true,\r\n [Setting.AttributeStrengthDamage]: true,\r\n [Setting.AttributeTerrainType]: true,\r\n [Setting.AttributeUnitType]: true,\r\n [Setting.Tactics]: true,\r\n [Setting.Martial]: true,\r\n [Setting.AttackerSwapping]: true,\r\n [Setting.CustomDeployment]: true,\r\n [Setting.DynamicFlanking]: false,\r\n [Setting.Tech]: false,\r\n [Setting.Culture]: false,\r\n [Setting.Food]: true,\r\n [Setting.AutoRefresh]: true,\r\n [Setting.MoraleDamageBasedOnTargetStrength]: false, \r\n [Setting.DamageLossForMissingMorale]: 0,\r\n }\r\n }\r\n}\r\n\r\nexport const speedValues: { [key: string]: number[] } = process.env.REACT_APP_GAME === 'euiv' ?\r\n {\r\n [SimulationSpeed.VeryAccurate]: [1, 10, 0],\r\n [SimulationSpeed.Accurate]: [1, 10, 1],\r\n [SimulationSpeed.Normal]: [2, 10, 1],\r\n [SimulationSpeed.Fast]: [2, 10, 2],\r\n [SimulationSpeed.VeryFast]: [2, 10, 3]\r\n } :\r\n {\r\n [SimulationSpeed.VeryAccurate]: [1, 6, 0],\r\n [SimulationSpeed.Accurate]: [1, 6, 0],\r\n [SimulationSpeed.Normal]: [2, 6, 0],\r\n [SimulationSpeed.Fast]: [2, 6, 1],\r\n [SimulationSpeed.VeryFast]: [2, 6, 2]\r\n }\r\n","import { ValuesType, Mode, TacticType, TacticCalc, TacticDefinition, TacticValueType, UnitType } from 'types'\r\nimport { toObj } from 'utils'\r\n\r\nimport * as data from './json/ir/tactics.json'\r\nimport IconBottleneck from 'images/bottleneck.png'\r\nimport IconCavalrySkirmish from 'images/cavalry_skirmish.png'\r\nimport IconDeception from 'images/deception.png'\r\nimport IconEnvelopment from 'images/envelopment.png'\r\nimport IconHitAndRun from 'images/hit_and_run.png'\r\nimport IconPadmaVyuha from 'images/padma_vyuha.png'\r\nimport IconPhalanx from 'images/phalanx.png'\r\nimport IconShockAction from 'images/shock_action.png'\r\nimport IconSkirmishing from 'images/skirmishing.png'\r\nimport IconTriplexAcies from 'images/triplex_acies.png'\r\nimport IconFrontalAssault from 'images/frontal_assault.png'\r\nimport IconNavalEnvelopment from 'images/naval_envelopment.png'\r\nimport IconHarassment from 'images/harassment.png'\r\nimport IconProbingAttack from 'images/probing_attack.png'\r\nimport IconCloseRanks from 'images/close_ranks.png'\r\nimport { addValues } from '../definition_values'\r\n\r\nconst tacticToIcon: { [ key in TacticType ]: string } = {\r\n [TacticType.Bottleneck]: IconBottleneck,\r\n [TacticType.CavalrySkirmish]: IconCavalrySkirmish,\r\n [TacticType.Deception]: IconDeception,\r\n [TacticType.Envelopment]: IconEnvelopment,\r\n [TacticType.HitAndRun]: IconHitAndRun,\r\n [TacticType.PadmaVyuha]: IconPadmaVyuha,\r\n [TacticType.Phalanx]: IconPhalanx,\r\n [TacticType.ShockAction]: IconShockAction,\r\n [TacticType.Skirmishing]: IconSkirmishing,\r\n [TacticType.TriplexAcies]: IconTriplexAcies,\r\n [TacticType.FrontalAssault]: IconFrontalAssault,\r\n [TacticType.NavalEnvelopment]: IconNavalEnvelopment,\r\n [TacticType.Harassment]: IconHarassment,\r\n [TacticType.ProbingAttack]: IconProbingAttack,\r\n [TacticType.CloseRanks]: IconCloseRanks\r\n}\r\n\r\nexport const getTacticIcon = (type: TacticType) => tacticToIcon[type] || ''\r\n\r\nconst createTacticFromJson = (data: TacticData): TacticDefinition => {\r\n let tactic: TacticDefinition = { type: data.type as TacticType, mode: data.mode as Mode, image: tacticToIcon[data.type as TacticType] || '' }\r\n const baseValues: [TacticValueType, number][] = [\r\n [UnitType.Archers, data.archers || 0],\r\n [UnitType.CamelCavalry, data.camel_cavalry || 0],\r\n [UnitType.Chariots, data.chariots || 0],\r\n [UnitType.HeavyCavalry, data.heavy_cavalry || 0],\r\n [UnitType.HeavyInfantry, data.heavy_infantry || 0],\r\n [UnitType.HorseArchers, data.horse_archers || 0],\r\n [UnitType.LightCavalry, data.light_cavalry || 0],\r\n [UnitType.LightInfantry, data.light_infantry || 0],\r\n [UnitType.WarElephants, data.war_elephants || 0],\r\n [UnitType.Liburnian, data.liburnian || 0],\r\n [UnitType.Trireme, data.trireme || 0],\r\n [UnitType.Tetrere, data.tetrere || 0],\r\n [UnitType.Hexere, data.hexere || 0],\r\n [UnitType.Octere, data.octere || 0],\r\n [UnitType.MegaPolyreme, data.mega_polyreme || 0],\r\n [TacticCalc.Casualties, data.casualties || 0],\r\n [TacticType.Bottleneck, data.bottleneck || 0],\r\n [TacticType.CavalrySkirmish, data.cavalry_skirmish || 0],\r\n [TacticType.Deception, data.deception || 0],\r\n [TacticType.Envelopment, data.envelopment || 0],\r\n [TacticType.HitAndRun, data.hit_and_run || 0],\r\n [TacticType.PadmaVyuha, data.padma_vyuha || 0],\r\n [TacticType.Phalanx, data.phalanx || 0],\r\n [TacticType.ShockAction, data.shock_action || 0],\r\n [TacticType.Skirmishing, data.skirmishing || 0],\r\n [TacticType.TriplexAcies, data.triplex_acies || 0],\r\n [TacticType.FrontalAssault, data.frontal_assault || 0],\r\n [TacticType.NavalEnvelopment, data.naval_envelopment || 0],\r\n [TacticType.CloseRanks, data.close_ranks || 0],\r\n [TacticType.Harassment, data.harassment || 0],\r\n [TacticType.ProbingAttack, data.probing_attack || 0]\r\n\r\n ]\r\n return addValues(tactic, ValuesType.Base, tactic.type, baseValues)\r\n}\r\n\r\nconst defaultTactics = toObj(data.tactics.map(createTacticFromJson), unit => unit.type)\r\n\r\nexport const getDefaultTactics = () => defaultTactics\r\nexport const getDefaultTactic = (type: TacticType): TacticDefinition => defaultTactics[type]\r\n\r\nexport const getDefaultTacticState = () => getDefaultTactics()\r\n\r\ninterface TacticData {\r\n type: string\r\n mode: string\r\n archers?: number\r\n camel_cavalry?: number\r\n chariots?: number\r\n heavy_cavalry?: number\r\n heavy_infantry?: number\r\n horse_archers?: number\r\n light_cavalry?: number\r\n light_infantry?: number\r\n war_elephants?: number\r\n liburnian?: number\r\n trireme?: number\r\n tetrere?: number\r\n hexere?: number\r\n octere?: number\r\n mega_polyreme?: number\r\n bottleneck?: number\r\n cavalry_skirmish?: number\r\n deception?: number\r\n envelopment?: number\r\n hit_and_run?: number\r\n padma_vyuha?: number\r\n phalanx?: number\r\n shock_action?: number\r\n skirmishing?: number\r\n triplex_acies?: number\r\n casualties?: number\r\n frontal_assault?: number\r\n naval_envelopment?: number\r\n close_ranks?: number\r\n harassment?: number\r\n probing_attack?: number\r\n}\r\n","import { ValuesType, Mode, TerrainType, LocationType, TerrainCalc, Terrain, TerrainValueType, TerrainDefinitions } from 'types'\r\nimport { addValues } from 'definition_values'\r\nimport { toObj } from 'utils'\r\n\r\nimport * as dataIR from './json/ir/terrains.json'\r\nimport * as dataEUIV from './json/euiv/terrains.json'\r\nimport IconTerrain from 'images/terrain.png'\r\n\r\nconst createTerrainFromJson = (data: TerrainData): Terrain => {\r\n let terrain: Terrain = { type: data.type as TerrainType, mode: data.mode as Mode, image: IconTerrain, location: data.location as LocationType }\r\n const baseValues: [TerrainValueType, number][] = [\r\n [TerrainCalc.Roll, data.roll]\r\n ]\r\n return addValues(terrain, ValuesType.Base, terrain.type, baseValues)\r\n}\r\n\r\nconst initializeDefaultTerrains = (): TerrainDefinitions => {\r\n if (process.env.REACT_APP_GAME === 'euiv')\r\n return toObj(dataEUIV.terrain.map(createTerrainFromJson), terrain => terrain.type)\r\n else\r\n return toObj(dataIR.terrain.map(createTerrainFromJson), terrain => terrain.type)\r\n}\r\n\r\nconst defaultTerrains = initializeDefaultTerrains()\r\n\r\nexport const getDefaultTerrains = () => defaultTerrains\r\nexport const getDefaultTerrain = (type: TerrainType): Terrain => defaultTerrains[type]\r\n\r\ninterface TerrainData {\r\n type: string\r\n mode: string\r\n location: string\r\n roll: number\r\n}\r\n\r\nexport const getDefaultTerrainState = () => getDefaultTerrains()\r\n","import { Modifier, ModifierType, Mode, ModifierWithKey, CountryAttribute, ValuesType, UnitAttribute, UnitType, GeneralData, CountryDefinition, GeneralAttribute, SelectionType, ListDefinitions, DeityDefinitions } from 'types'\r\nimport { getRootParent } from './units'\r\nimport { ObjSet, keys } from 'utils'\r\nimport { calculateValue } from 'definition_values'\r\nimport { martialToCaptureChance } from './army'\r\nimport { techEUIV, techIR, traditionsIR, heritagesIR, tradesIR, ideasIR, lawsIR, religionsIR, factionsIR, modifiersIR, policiesIR, deitiesIR, traitsIR, abilitiesIR, policiesEUIV } from 'data'\r\n\r\nexport const TECH_KEY = 'Tech '\r\n\r\n\r\nexport const mapModifiersToUnits = (modifiers: Modifier[]) => {\r\n const mapped: Modifier[] = []\r\n modifiers.forEach(modifier => {\r\n if (modifier.target === ModifierType.Text)\r\n return\r\n if (modifier.target in Mode) {\r\n mapped.push({ ...modifier, target: getRootParent(modifier.target as Mode) })\r\n return\r\n }\r\n if (modifier.target === ModifierType.Global) {\r\n mapped.push({ ...modifier, target: getRootParent(Mode.Naval) })\r\n mapped.push({ ...modifier, target: getRootParent(Mode.Land) })\r\n return\r\n }\r\n mapped.push(modifier)\r\n })\r\n return mapped\r\n}\r\n\r\nexport const mapModifiersToUnits2 = (modifiers: ModifierWithKey[]) => {\r\n const mapped: ModifierWithKey[] = []\r\n modifiers.forEach(modifier => {\r\n if (modifier.target === ModifierType.Text)\r\n return\r\n if (modifier.target in Mode) {\r\n mapped.push({ ...modifier, target: getRootParent(modifier.target as Mode) })\r\n return\r\n }\r\n if (modifier.target === ModifierType.Global) {\r\n mapped.push({ ...modifier, target: getRootParent(Mode.Naval) })\r\n mapped.push({ ...modifier, target: getRootParent(Mode.Land) })\r\n return\r\n }\r\n mapped.push(modifier)\r\n })\r\n return mapped\r\n}\r\n\r\nconst mapModifiers = (key: string, modifiers: Modifier[]) => modifiers.map(value => ({ key, ...value })) as ModifierWithKey[]\r\n\r\n\r\nconst getTechModifiers = (modifiers: ModifierWithKey[], country: CountryDefinition) => {\r\n const selections = country.selections[SelectionType.Invention] ?? {}\r\n const techLevel = calculateValue(country, CountryAttribute.TechLevel)\r\n if (process.env.REACT_APP_GAME === 'euiv') {\r\n techEUIV.forEach((tech, level) => {\r\n if (level > techLevel)\r\n return\r\n modifiers.push(...mapModifiers(TECH_KEY + level, tech.modifiers))\r\n })\r\n }\r\n else {\r\n techIR.forEach((tech, level) => {\r\n if (level > techLevel)\r\n return\r\n tech.inventions.forEach((invention, index) => {\r\n const key = index === 0 ? TECH_KEY + level : invention.key\r\n const name = index === 0 ? TECH_KEY + level : invention.name\r\n if (index === 0 || selections[key])\r\n modifiers.push(...mapModifiers(name, invention.modifiers))\r\n\r\n })\r\n })\r\n }\r\n return modifiers\r\n}\r\n\r\nconst getTraditionModifiers = (modifiers: ModifierWithKey[], country: CountryDefinition) => {\r\n const selections = country.selections[SelectionType.Tradition] ?? {}\r\n const culture = country.culture\r\n if (process.env.REACT_APP_GAME === 'euiv') {\r\n }\r\n else {\r\n const tradition = traditionsIR[culture]\r\n if (selections['base']) {\r\n modifiers.push(...mapModifiers(tradition.name, tradition.modifiers))\r\n tradition.paths.forEach(path => getModifiersSub(modifiers, selections, path.traditions))\r\n }\r\n }\r\n return modifiers\r\n}\r\n\r\nconst getModifiersSub = (modifiers: ModifierWithKey[], selections: ObjSet, entities: { name: string, key: string, modifiers: Modifier[] }[]) => {\r\n entities.forEach(entity => {\r\n if (selections && selections[entity.key])\r\n modifiers.push(...mapModifiers(entity.name, entity.modifiers))\r\n })\r\n}\r\nconst getDeityModifiers = (modifiers: ModifierWithKey[], selections: ObjSet, items: DeityDefinitions, omenPower: number) => {\r\n const selectedKeys = keys(selections ?? {})\r\n selectedKeys.forEach(key => {\r\n if (items[key]) {\r\n const item = items[key]\r\n const effects = item.isOmen ? item.modifiers.map(modifier => ({ ...modifier, value: modifier.value * omenPower / 100.0 })) : item.modifiers\r\n modifiers.push(...mapModifiers(item.name, effects))\r\n }\r\n })\r\n}\r\n\r\nconst getModifiersSub2 = (modifiers: ModifierWithKey[], selections: ObjSet | undefined, items: ListDefinitions) => {\r\n const selectedKeys = keys(selections ?? {})\r\n selectedKeys.forEach(key => {\r\n if (items[key])\r\n modifiers.push(...mapModifiers(items[key].name, items[key].modifiers))\r\n })\r\n}\r\nconst getOfficeModifiers = (modifiers: ModifierWithKey[], country: CountryDefinition) => {\r\n const morale = calculateValue(country, CountryAttribute.OfficeMorale)\r\n const discipline = calculateValue(country, CountryAttribute.OfficeDiscipline)\r\n const militaryExperience = calculateValue(country, CountryAttribute.MilitaryExperience)\r\n if (discipline) {\r\n modifiers.push({\r\n target: ModifierType.Global,\r\n type: ValuesType.Base,\r\n attribute: UnitAttribute.Discipline,\r\n value: discipline / 100.0,\r\n key: 'Office job'\r\n })\r\n }\r\n if (morale) {\r\n modifiers.push({\r\n target: UnitType.Land,\r\n type: ValuesType.Modifier,\r\n attribute: UnitAttribute.Morale,\r\n value: morale / 100.0,\r\n key: 'Office job'\r\n })\r\n }\r\n if (militaryExperience) {\r\n modifiers.push({\r\n target: UnitType.Land,\r\n type: ValuesType.Modifier,\r\n attribute: UnitAttribute.Morale,\r\n value: militaryExperience / 1000.0,\r\n key: 'Military experience'\r\n })\r\n }\r\n\r\n}\r\n\r\nexport const getCountryModifiers = (country: CountryDefinition): ModifierWithKey[] => {\r\n const modifiers: ModifierWithKey[] = []\r\n getTechModifiers(modifiers, country)\r\n getOfficeModifiers(modifiers, country)\r\n if (process.env.REACT_APP_GAME === 'euiv') {\r\n getModifiersSub2(modifiers, country.selections[SelectionType.Policy], policiesEUIV)\r\n }\r\n else {\r\n getModifiersSub2(modifiers, country.selections[SelectionType.Heritage], heritagesIR)\r\n getModifiersSub2(modifiers, country.selections[SelectionType.Trade], tradesIR)\r\n getModifiersSub2(modifiers, country.selections[SelectionType.Idea], ideasIR)\r\n getModifiersSub2(modifiers, country.selections[SelectionType.Law], lawsIR)\r\n getModifiersSub2(modifiers, country.selections[SelectionType.Religion], religionsIR)\r\n getModifiersSub2(modifiers, country.selections[SelectionType.Faction], factionsIR)\r\n getModifiersSub2(modifiers, country.selections[SelectionType.Modifier], modifiersIR)\r\n policiesIR.forEach(policy => getModifiersSub(modifiers, country.selections[SelectionType.Policy], policy))\r\n getTraditionModifiers(modifiers, country)\r\n }\r\n return modifiers\r\n}\r\n\r\n/**\r\n * Modifiers must be acquired in two steps because modifiers can affect each other.\r\n * For example Omen Power for omens.\r\n */\r\nexport const getSecondaryCountryModifiers = (country: CountryDefinition): ModifierWithKey[] => {\r\n const modifiers: ModifierWithKey[] = []\r\n if (process.env.REACT_APP_GAME === 'euiv') {\r\n }\r\n else {\r\n getDeityModifiers(modifiers, country.selections[SelectionType.Deity], deitiesIR, calculateValue(country, CountryAttribute.OmenPower))\r\n }\r\n return modifiers\r\n}\r\n\r\nexport const getGeneralModifiers = (general: GeneralData): ModifierWithKey[] => {\r\n const modifiers: ModifierWithKey[] = []\r\n if (general.enabled) {\r\n if (process.env.REACT_APP_GAME === 'euiv') {\r\n }\r\n else {\r\n getModifiersSub2(modifiers, general.selections[SelectionType.Trait], traitsIR)\r\n abilitiesIR.forEach(abilities => getModifiersSub(modifiers, general.selections[SelectionType.Ability], abilities))\r\n const martial = calculateValue(general, GeneralAttribute.Martial)\r\n if (martial) {\r\n modifiers.push({\r\n target: UnitType.Naval,\r\n type: ValuesType.Base,\r\n attribute: UnitAttribute.CaptureChance,\r\n value: martialToCaptureChance(martial),\r\n key: 'Martial'\r\n })\r\n }\r\n }\r\n }\r\n else {\r\n modifiers.push({\r\n target: ModifierType.Global,\r\n type: ValuesType.Modifier,\r\n attribute: UnitAttribute.Morale,\r\n value: -0.15,\r\n key: 'No general'\r\n })\r\n }\r\n return modifiers\r\n}\r\n","import { ValuesType, UnitValueType, UnitType, UnitRole, UnitData, UnitsData, Mode, Setting, UnitAttribute, WearinessAttributes, ReserveData, ModifierWithKey, SiteSettings, SideType } from \"types\"\r\nimport { addValuesWithMutate, DefinitionValues, calculateValue, addValues, addValue } from \"definition_values\"\r\nimport { getUnitIcon } from \"data\"\r\nimport { toArr, round, randomWithinRange } from \"utils\"\r\nimport { mapModifiersToUnits2 } from \"./modifiers\"\r\nimport { getConfig } from \"data/config\"\r\n\r\nexport const setUnitValue = (unit: UnitData, valuesType: ValuesType, key: string, attribute: UnitValueType, value: number) => {\r\n addValuesWithMutate(unit, valuesType, key, [[attribute, value]])\r\n}\r\n\r\nexport const deleteUnit = (units: UnitsData, type: UnitType) => {\r\n delete units[type]\r\n}\r\n\r\nexport const createUnit = (units: UnitsData, mode: Mode, type: UnitType) => {\r\n units[type] = { type, image: getUnitIcon(type), role: UnitRole.Front, parent: getRootParent(mode) }\r\n}\r\n\r\nexport const changeUnitType = (units: UnitsData, oldType: UnitType, type: UnitType) => {\r\n delete Object.assign(units, { [type]: { ...units[oldType], type } })[oldType]\r\n}\r\n\r\nexport const changeUnitImage = (unit: UnitData, image: string) => {\r\n unit.image = image\r\n}\r\n\r\nexport const changeUnitDeployment = (unit: UnitData, deployment: UnitRole) => {\r\n unit.role = deployment\r\n}\r\n\r\nexport const toggleUnitLoyality = (unit: UnitData) => {\r\n unit.isLoyal = !unit.isLoyal\r\n}\r\n\r\nexport const changeParent = (unit: UnitData, parent: UnitType) => {\r\n unit.parent = parent\r\n}\r\n\r\nexport const getRootParent = (mode: Mode) => mode === Mode.Naval ? UnitType.Naval : UnitType.Land\r\n\r\nexport const applyDynamicAttributes = (definition: T, settings: SiteSettings) => {\r\n if (settings[Setting.AttributeDrill]) {\r\n const drill = 0.1 * calculateValue(definition, UnitAttribute.Drill)\r\n definition = addValues(definition, ValuesType.Base, 'From drill', [[UnitAttribute.ShockDamageDone, drill], [UnitAttribute.FireDamageDone, drill], [UnitAttribute.ShockDamageTaken, -drill], [UnitAttribute.FireDamageTaken, -drill]])\r\n }\r\n if (settings[Setting.StrengthBasedFlank]) {\r\n const maneuver = getStrengthBasedFlank(calculateValue(definition, UnitAttribute.Strength)) - 1\r\n definition = addValues(definition, ValuesType.Modifier, 'From losses', [[UnitAttribute.Maneuver, maneuver]])\r\n if (calculateValue(definition, UnitAttribute.Maneuver) < 1)\r\n definition = addValues(definition, ValuesType.Loss, 'Minimum cap', [[UnitAttribute.Maneuver, -1]])\r\n }\r\n if (definition.isLoyal)\r\n definition = addValues(definition, ValuesType.Modifier, 'Loyal', [[UnitAttribute.Maintenance, getConfig().LoyalMaintenance - 1]])\r\n return definition\r\n}\r\n\r\nexport const getStrengthBasedFlank = (strength: number) => Math.pow(0.5, 4 - Math.ceil(strength * 4.0))\r\n\r\nexport const applyLosses = (values: WearinessAttributes, units: ReserveData) => (\r\n units.map(unit => addValues(unit, ValuesType.LossModifier, 'Custom', generateLosses(values)))\r\n)\r\n\r\nexport const applyUnitModifiers = (units: UnitsData, modifiers: ModifierWithKey[]): UnitsData => {\r\n modifiers = mapModifiersToUnits2(modifiers)\r\n let result = { ...units }\r\n modifiers.forEach(value => {\r\n const type = value.target as UnitType\r\n if (!result[type])\r\n return\r\n result[type] = addValue(result[type], value.type, value.key, value.attribute, value.value)\r\n })\r\n return result\r\n}\r\n\r\nconst generateLosses = (values: WearinessAttributes): [string, number][] => toArr(values, (range, type) => [type, round(randomWithinRange(range.min, range.max), 100)])\r\n\r\nexport const getCohortId = (side: SideType, cohort: { index: number, participantIndex: number }) => side + '-' + cohort.participantIndex + '-' + cohort.index\r\nexport const getCohortName = (cohort: { type: UnitType, index: number, participantIndex: number }) => cohort.type + ' ' + (1000 * cohort.participantIndex + cohort.index)","import { calculateValue, calculateBase, addValuesWithMutate, filterValues, addValue, clearAllValuesWithMutate } from 'definition_values'\r\nimport { Mode, GeneralAttribute, UnitType, UnitAttribute, GeneralData, ArmyData, CohortData, ValuesType, UnitValueType, TacticType, UnitPreferenceType, GeneralDefinition, ReserveData, GeneralValueType, CombatPhase, isAttributeEnabled, UnitDefinitions, Setting, UnitRole, UnitDefinition, SiteSettings, ModifierWithKey, ModifierType, Selections, SelectionType, TacticDefinitions } from 'types'\r\nimport { toObj, toArr, toSet, ObjSet, values } from 'utils'\r\nimport { findLastIndex, sortBy } from 'lodash'\r\nimport { getRootParent } from './units'\r\n\r\n/**\r\n * Returns how much capture chance given martial skill gives.\r\n * @param martial \r\n */\r\nexport const martialToCaptureChance = (martial: number) => 0.005 * martial\r\n\r\nconst BASE_STAT_KEY = 'Custom'\r\n\r\nexport const convertGeneralDefinition = (settings: SiteSettings, general: GeneralData, tactics: TacticDefinitions): GeneralDefinition => {\r\n const base = filterValues(general, BASE_STAT_KEY)\r\n const attributes = [GeneralAttribute.Maneuver, GeneralAttribute.Martial, CombatPhase.Fire, CombatPhase.Shock, CombatPhase.Default]\r\n const baseValues = toObj(attributes, attribute => attribute, attribute => isAttributeEnabled(attribute, settings) ? calculateValue(base, attribute) : 0)\r\n const extraValues = toObj(attributes, attribute => attribute, attribute => isAttributeEnabled(attribute, settings) && general.enabled ? calculateValue(general, attribute) - calculateValue(base, attribute) : 0)\r\n const totalValues = toObj(attributes, attribute => attribute, attribute => isAttributeEnabled(attribute, settings) && general.enabled ? Math.min(calculateValue(general, attribute), settings[Setting.MaxGeneral]) : 0)\r\n return {\r\n tactic: tactics[general.tactic],\r\n enabled: general.enabled,\r\n baseValues,\r\n values: totalValues,\r\n extraValues,\r\n selections: general.selections\r\n }\r\n}\r\n\r\nexport const overrideRoleWithPreferences = (army: ArmyData, units: UnitDefinitions, latest: { [key in UnitRole]: UnitType | undefined }) => {\r\n const preferences = army.unitPreferences\r\n return army.reserve.map(cohort => {\r\n const role = units[cohort.type]?.role\r\n let override = role && preferences[role]\r\n if (role && override === UnitType.Latest)\r\n override = latest[role]\r\n if (override)\r\n return { ...cohort, type: override }\r\n return cohort\r\n })\r\n}\r\n\r\nexport const getUnitList = (units: UnitDefinitions, mode: Mode, filterParents: boolean, settings: SiteSettings) => {\r\n const parents = getParents(units)\r\n let list = settings[Setting.Tech] ? [units[UnitType.Land]].concat(getArchetypes(units, mode)) : sortBy(toArr(units), unit => unitSorter(unit, mode, parents))\r\n list = filterParents ? list.filter(unit => !parents[unit.type]) : list\r\n return list\r\n}\r\n\r\nexport const getAllUnitList = (units: UnitDefinitions, mode: Mode) => {\r\n const parents = getParents(units)\r\n return sortBy(toArr(units), unit => unitSorter(unit, mode, parents))\r\n}\r\n\r\n\r\n/** Returns latest available unit for each role. */\r\nexport const getLatestUnits = (units: UnitDefinitions, tech: number) => {\r\n const sorted = sortBy(filterByTech(toArr(units), tech), techSorter)\r\n return toObj(values(UnitRole), role => role, role => sorted.find(unit => unit.role === role)?.type)\r\n}\r\n\r\nexport const getChildUnits = (units: UnitDefinitions, tech: number, parent: UnitType) => {\r\n return sortBy(filterByTech(toArr(units).filter(unit => unit.parent === parent), tech), techSorter)\r\n}\r\n\r\n\r\nconst techSorter = (unit: { tech?: number, type: UnitType }) => {\r\n return (99 - (unit.tech ?? 0)) + unit.type\r\n}\r\n\r\nconst unitSorter = (unit: UnitDefinition, mode: Mode, parents?: ObjSet) => {\r\n if (parents && parents[unit.type])\r\n return ''\r\n if (mode === Mode.Naval)\r\n return calculateBase(unit, UnitAttribute.Cost)\r\n return techSorter(unit)\r\n}\r\n\r\nexport const getArchetypes = (units: UnitDefinitions, mode: Mode) => toArr(units).filter(unit => unit.parent === getRootParent(mode))\r\n\r\nexport const getActualUnits = (units: UnitDefinitions, mode: Mode) => {\r\n const parents = getParents(units)\r\n return sortBy(toArr(units).filter(unit => !parents[unit.type]), unit => unitSorter(unit, mode))\r\n}\r\n\r\nconst getParents = (units: UnitDefinitions) => toSet(units, unit => unit.parent || unit.type)\r\n\r\nexport const getRootUnit = (units: UnitDefinitions, mode: Mode) => mode === Mode.Naval ? units[UnitType.Naval] : units[UnitType.Land]\r\n\r\nconst filterByTech = (units: UnitDefinition[], tech: number) => units.filter(unit => unit.tech === undefined || unit.tech <= tech)\r\n\r\nexport const selectCohort = (army: ArmyData, index: number, cohort: CohortData) => {\r\n if (cohort && index > army.reserve.length)\r\n army.reserve.push(cohort)\r\n else if (cohort)\r\n army.reserve[index] = cohort\r\n}\r\n\r\nexport const toggleCohortLoyality = (army: ArmyData, index: number) => {\r\n army.reserve[index].isLoyal = !army.reserve[index].isLoyal\r\n}\r\n\r\nexport const setCohortValue = (army: ArmyData, index: number, valuesType: ValuesType, key: string, attribute: UnitValueType, value: number) => {\r\n addValuesWithMutate(army.reserve[index], valuesType, key, [[attribute, value]])\r\n}\r\n\r\nexport const changeCohortType = (army: ArmyData, index: number, type: UnitType) => {\r\n army.reserve[index].type = type\r\n}\r\n\r\nexport const deleteCohort = (army: ArmyData, index: number) => {\r\n army.reserve.splice(index, 1)\r\n}\r\n\r\nexport const removeFromReserve = (army: { reserve: ReserveData }, types: UnitType[]) => {\r\n for (const type of types) {\r\n const index = findLastIndex(army.reserve, value => value.type === type)\r\n army.reserve = army.reserve.filter((_, i) => i !== index)\r\n }\r\n}\r\n\r\nexport const addToReserve = (army: { reserve: ReserveData }, cohorts: CohortData[]) => {\r\n army.reserve = army.reserve.concat(cohorts)\r\n}\r\n\r\nexport const clearCohorts = (army: ArmyData) => {\r\n army.reserve = []\r\n}\r\n\r\nexport const selectTactic = (army: ArmyData, tactic: TacticType) => {\r\n army.general.tactic = tactic\r\n}\r\n\r\nexport const setUnitPreference = (army: ArmyData, preferenceType: UnitPreferenceType | UnitRole, unit: UnitType | null) => {\r\n army.unitPreferences[preferenceType] = unit\r\n}\r\n\r\nexport const setFlankSize = (army: ArmyData, flankFize: number) => {\r\n army.flankSize = flankFize\r\n}\r\n\r\nexport const setGeneralAttribute = (army: ArmyData, attribute: GeneralValueType, value: number) => {\r\n addValuesWithMutate(army.general, ValuesType.Base, 'Custom', [[attribute, value]])\r\n}\r\n\r\nexport const clearGeneralAttributes = (army: ArmyData) => {\r\n clearAllValuesWithMutate(army.general, 'Custom')\r\n}\r\n\r\nexport const setHasGeneral = (army: ArmyData, hasGeneral: boolean) => {\r\n army.general.enabled = hasGeneral\r\n}\r\n\r\nexport const enableGeneralSelection = (army: ArmyData, type: SelectionType, key: string) => {\r\n if (!army.general.selections[type])\r\n army.general.selections[type] = {}\r\n army.general.selections[type][key] = true\r\n}\r\n\r\nexport const enableGeneralSelections = (army: ArmyData, type: SelectionType, keys: string[]) => {\r\n keys.forEach(key => enableGeneralSelection(army, type, key))\r\n}\r\n\r\nexport const clearGeneralSelection = (army: ArmyData, type: SelectionType, key: string) => {\r\n if (army.general.selections[type])\r\n delete army.general.selections[type][key]\r\n}\r\n\r\nexport const clearGeneralSelections = (army: ArmyData, type?: SelectionType, keys?: string[]) => {\r\n if (keys && type)\r\n keys.forEach(key => clearGeneralSelection(army, type, key))\r\n else if (type)\r\n delete army.general.selections[type]\r\n else\r\n army.general.selections = {} as Selections\r\n}\r\n\r\nexport const applyGeneralModifiers = (country: GeneralData, modifiers: ModifierWithKey[]): GeneralData => {\r\n modifiers.filter(value => value.target === ModifierType.General).forEach(value => {\r\n country = addValue(country, value.type, value.key, value.attribute, value.value)\r\n })\r\n return country\r\n}\r\n","import { produce } from 'immer'\r\nimport { Mode } from 'types'\r\nimport { Reducer, CombinedState } from 'redux'\r\n\r\nexport type Action = {\r\n type: string,\r\n payload: [T1, T2, ...any[]]\r\n}\r\n\r\nlet typeCounter = 0\r\nconst getActionType = (func: Function) => process.env.NODE_ENV === 'production' ? 'action' + typeCounter++ : func.name\r\n\r\nexport type ActionToFunction = { [key: string]: (entity: T, ...args: any) => void | undefined }\r\n\r\nexport const makeActionRemoveFirst = (func: (entity: E, ...args: T) => any, actionToFunction: ActionToFunction) => {\r\n const type = getActionType(func)\r\n actionToFunction[type] = func\r\n return (...payload: T) => ({ type, payload } as {})\r\n}\r\n\r\nexport const makeActionReplaceFirst = (func: (entity: E, ...args: T) => any, actionToFunction: ActionToFunction) => {\r\n const type = getActionType(func)\r\n actionToFunction[type] = func\r\n const ret = (key: K, ...args: T) => ({ type, payload: [key, ...args] } as {})\r\n return ret\r\n}\r\n\r\nexport const makeActionReplaceFirstTwice = (func: (entity: E, ...args: T) => any, actionToFunction: ActionToFunction) => {\r\n const type = getActionType(func)\r\n actionToFunction[type] = func\r\n const ret = (key1: K1, key2: K2, ...args: T) => ({ type, payload: [key1, key2, ...args] } as {})\r\n return ret\r\n}\r\n\r\ntype GetEntity = (draft: S, action: Action, params: ReducerParams, state: S) => E\r\ntype GetPayload = (action: Action) => any[]\r\n\r\nconst getDefaultEntity = (draft: any, action: Action) => draft[action.payload[0]]\r\n\r\nconst getEntityPayload = (action: Action) => {\r\n const [, ...payload] = action.payload\r\n return payload\r\n}\r\n\r\nconst getDefaultContainer = (draft: any) => draft\r\n\r\nexport const makeReducer = (initial: S, actionToFunction: ActionToFunction, getEntity: GetEntity, getPayload?: GetPayload) => {\r\n return (state = initial, action: Action, params: ReducerParams) => {\r\n const func = actionToFunction[action.type]\r\n if (!func)\r\n return state\r\n return produce(state, (draft: S) => {\r\n func(getEntity(draft, action, params, state), ...(getPayload ? getPayload(action) : action.payload))\r\n })\r\n }\r\n}\r\n\r\nexport function makeEntityReducer(initial: S, actionToFunction: ActionToFunction): ReducerWithParam\r\nexport function makeEntityReducer(initial: S, actionToFunction: ActionToFunction, getEntity: GetEntity): ReducerWithParam\r\nexport function makeEntityReducer(initial: S, actionToFunction: ActionToFunction, getEntity?: GetEntity) {\r\n return makeReducer(initial, actionToFunction, getEntity ? getEntity : getDefaultEntity, getEntityPayload)\r\n}\r\n\r\n\r\nexport function makeContainerReducer(initial: S, actionToFunction: ActionToFunction): ReducerWithParam\r\nexport function makeContainerReducer(initial: S, actionToFunction: ActionToFunction, getContainer: GetEntity): ReducerWithParam\r\nexport function makeContainerReducer(initial: S, actionToFunction: ActionToFunction, getContainer?: GetEntity) {\r\n return makeReducer(initial, actionToFunction, getContainer ? getContainer : getDefaultContainer)\r\n}\r\n\r\nexport type ReducerParams = { mode: Mode }\r\n\r\nexport const compose = (...reducers: ReducerWithParam[]): ReducerWithParam => {\r\n const initial = reducers[0](undefined, { payload: [] }, {} as ReducerParams)\r\n const reducer = (state = initial, action: { type: string, payload: any[] }, params: ReducerParams) => {\r\n if (!action.payload || !Array.isArray(action.payload))\r\n return state\r\n return reducers.reduce((prev, curr: any) => curr(prev, action, params), state)\r\n }\r\n return reducer as any\r\n}\r\n\r\ntype ReducerWithParam = (state: State | undefined, action: any, params: ReducerParams) => State\r\n\r\nexport function combine(reducers: { [K in keyof S]: ReducerWithParam }): Reducer> {\r\n const reducerKeys = Object.keys(reducers) as (keyof S)[];\r\n\r\n return function combination(state: S = {} as S, action) {\r\n let nextState: S = {} as S\r\n const settings: ReducerParams = { mode: (state as any)?.settings?.mode }\r\n\r\n let invalidated = false\r\n for (let key of reducerKeys) {\r\n const reducer = reducers[key] as any\r\n nextState[key] = reducer(state[key], action, settings)\r\n if (action.type && nextState[key] !== state[key] && key !== 'ui' && key !== 'transfer')\r\n invalidated = true\r\n }\r\n if (invalidated) {\r\n nextState = produce(nextState, (draft: any) => {\r\n draft['battle'][settings.mode].outdated = true\r\n })\r\n }\r\n return nextState\r\n }\r\n}\r\n","\r\nimport { ArmyData, CountryName, Countries } from 'types'\r\nimport { ArmyName } from 'types/armies'\r\nimport * as manager from 'managers/army'\r\nimport { getDefaultCountryDefinitions } from 'data'\r\nimport { ActionToFunction, makeReducer, Action, makeActionReplaceFirstTwice } from './utils'\r\n\r\nconst mapping: ActionToFunction = {}\r\n\r\nexport const clearGeneralSelection = makeActionReplaceFirstTwice(manager.clearGeneralSelection, mapping)\r\nexport const clearGeneralSelections = makeActionReplaceFirstTwice(manager.clearGeneralSelections, mapping)\r\nexport const enableGeneralSelection = makeActionReplaceFirstTwice(manager.enableGeneralSelection, mapping)\r\nexport const enableGeneralSelections = makeActionReplaceFirstTwice(manager.enableGeneralSelections, mapping)\r\nexport const selectCohort = makeActionReplaceFirstTwice(manager.selectCohort, mapping)\r\nexport const toggleCohortLoyality = makeActionReplaceFirstTwice(manager.toggleCohortLoyality, mapping)\r\nexport const setCohortValue = makeActionReplaceFirstTwice(manager.setCohortValue, mapping)\r\nexport const changeCohortType = makeActionReplaceFirstTwice(manager.changeCohortType, mapping)\r\nexport const deleteCohort = makeActionReplaceFirstTwice(manager.deleteCohort, mapping)\r\nexport const removeFromReserve = makeActionReplaceFirstTwice(manager.removeFromReserve, mapping)\r\nexport const addToReserve = makeActionReplaceFirstTwice(manager.addToReserve, mapping)\r\nexport const clearCohorts = makeActionReplaceFirstTwice(manager.clearCohorts, mapping)\r\nexport const selectTactic = makeActionReplaceFirstTwice(manager.selectTactic, mapping)\r\nexport const setFlankSize = makeActionReplaceFirstTwice(manager.setFlankSize, mapping)\r\nexport const setUnitPreference = makeActionReplaceFirstTwice(manager.setUnitPreference, mapping)\r\nexport const setGeneralAttribute = makeActionReplaceFirstTwice(manager.setGeneralAttribute, mapping)\r\nexport const clearGeneralAttributes = makeActionReplaceFirstTwice(manager.clearGeneralAttributes, mapping)\r\nexport const setHasGeneral = makeActionReplaceFirstTwice(manager.setHasGeneral, mapping)\r\n\r\nconst getEntity = (draft: Countries, action: Action) => {\r\n const [country, army] = action.payload\r\n return draft[country].armies[army]\r\n}\r\n\r\nconst getEntityPayload = (action: Action) => {\r\n const [, , ...payload] = action.payload\r\n return payload\r\n}\r\n\r\nexport const armyReducer = makeReducer(getDefaultCountryDefinitions(), mapping, getEntity, getEntityPayload)\r\n","import { toObj, keys } from 'utils'\r\nimport { uniq } from 'lodash'\r\n\r\nimport stringTokens from 'data/json/ir/binary.json'\r\n\r\nenum DataType {\r\n Integer = 'Integer',\r\n Float = 'Float',\r\n Boolean = 'Boolean',\r\n String = 'String',\r\n UnsignedInteger = 'UnsignedInteger',\r\n BigFloat = 'BigFloat',\r\n BigInteger = 'BigInteger',\r\n BigUnsignedInteger = 'BigUnsignedInteger'\r\n}\r\n\r\nenum ControlType {\r\n Separator = '=',\r\n SectionStart = '{',\r\n SectionEnd = '}',\r\n None = ''\r\n}\r\n\r\nlet i = 0\r\nlet data: Uint8Array = new Uint8Array()\r\nlet errors: string[] | null = null\r\n\r\nconst parseToken = (token: string) => {\r\n const isNumber = !Number.isNaN(Number(token))\r\n if (isNumber)\r\n return Number(token)\r\n if (token.startsWith('\"'))\r\n return token.substr(1, token.length - 2)\r\n return token\r\n}\r\n\r\nconst parseValue = (tokens: string[]) => {\r\n for (i = i + 1; i < tokens.length; i++) {\r\n const token = tokens[i]\r\n if (token === '{') {\r\n return parseObject(tokens)\r\n }\r\n if (token === 'hsv') {\r\n parseObject(tokens)\r\n }\r\n return parseToken(token)\r\n }\r\n return null\r\n}\r\n\r\nconst parseObject = (tokens: string[]) => {\r\n const result = {} as { [key: string]: any }\r\n // Object syntax is also used for arrays. Fill both and decide at end which works better.\r\n const resultArray = [] as any[]\r\n let previous = ''\r\n for (i = i + 1; i < tokens.length; i++) {\r\n const token = tokens[i]\r\n if (token === '{') {\r\n resultArray.push(parseObject(tokens))\r\n }\r\n else if (token === ControlType.Separator) {\r\n const value = parseValue(tokens)\r\n if (result[previous]) {\r\n if (!Array.isArray(result[previous]))\r\n result[previous] = [result[previous]]\r\n result[previous].push(value)\r\n }\r\n else {\r\n result[previous] = value\r\n }\r\n }\r\n else if (token === '}') {\r\n break\r\n }\r\n else {\r\n resultArray.push(parseToken(token))\r\n }\r\n previous = token\r\n }\r\n return Object.keys(result).length ? result : resultArray\r\n}\r\n\r\nexport const parseFile = (data: string) => {\r\n /* eslint-disable-next-line */\r\n const withoutComments = data.replace(/\\h*#.*\\r?(?:\\n|$)/g, '')\r\n const forceTokenizeEqualCharacter = withoutComments.replace(/=/g, ' = ')\r\n const tokens = forceTokenizeEqualCharacter.split(/[\\n\\r\\s]+/)\r\n i = -1\r\n return parseObject(tokens)\r\n}\r\n\r\nconst formatTokens = {\r\n '0000': ControlType.None,\r\n '0100': ControlType.Separator,\r\n '0300': ControlType.SectionStart,\r\n '0400': ControlType.SectionEnd,\r\n '0C00': DataType.Integer,\r\n '0D00': DataType.Float,\r\n '0E00': DataType.Boolean,\r\n '0F00': DataType.String,\r\n '1400': DataType.UnsignedInteger,\r\n '1700': DataType.String,\r\n '6701': DataType.BigFloat,\r\n '9001': DataType.BigFloat,\r\n '9C02': DataType.BigInteger\r\n}\r\n\r\nconst tokens = {\r\n ...toObj(keys(formatTokens), key => parseInt(key, 16), key => formatTokens[key]),\r\n ...toObj(keys(stringTokens), key => parseInt(key, 16), key => stringTokens[key])\r\n}\r\n\r\nexport const binaryToPlain = (buffer: Uint8Array, getErrors: boolean): [string, string[]] => {\r\n i = 0\r\n data = buffer\r\n errors = getErrors ? [] : null\r\n const result = parseBinaryText(data)\r\n return [result.join(''), errors ? uniq(errors) : []]\r\n}\r\n\r\nconst getBinaryToken = () => {\r\n const code = data[i++] * 256 + data[i++]\r\n if (tokens[code])\r\n return tokens[code]\r\n errors?.push('Token ' + code.toString(16).toUpperCase() + ' not recognized.')\r\n return 'x_' + code.toString(16).toUpperCase()\r\n}\r\n\r\n/** Looks up the next token. If it's separator then previous token is a key. */\r\nconst isKeyValuePair = () => tokens[data[i] * 256 + data[i + 1]] === ControlType.Separator\r\n\r\nconst getBinaryBoolean = () => data[i++] ? 'yes' : 'no'\r\n// Bitwise can't be used because of only 32 bytes.\r\nconst getBinaryLength = () => data[i++] + (data[i++] * 256)\r\nconst getBinaryUnsigned = () => {\r\n const value = getHex(i + 3) + getHex(i + 2) + getHex(i + 1) + getHex(i)\r\n i += 4\r\n return hexToUnsigned(value)\r\n}\r\nconst getBinarySigned = () => {\r\n const value = getHex(i + 3) + getHex(i + 2) + getHex(i + 1) + getHex(i)\r\n i += 4\r\n return hexToSigned(value)\r\n}\r\nconst getBinaryBigUnsigned = () => {\r\n const value = getHex(i + 7) + getHex(i + 6) + getHex(i + 5) + getHex(i + 4) + getHex(i + 3) + getHex(i + 2) + getHex(i + 1) + getHex(i)\r\n i += 8\r\n return hexToUnsigned(value)\r\n}\r\nconst getBinaryBigSigned = () => {\r\n const value = getHex(i + 7) + getHex(i + 6) + getHex(i + 5) + getHex(i + 4) + getHex(i + 3) + getHex(i + 2) + getHex(i + 1) + getHex(i)\r\n i += 8\r\n return hexToSigned(value)\r\n}\r\n\r\nconst getBinaryFloat = () => {\r\n const v = new DataView(new ArrayBuffer(4))\r\n v.setUint32(0, Number(getBinaryUnsigned()))\r\n return v.getFloat32(0)\r\n}\r\n\r\nconst getHex = (index: number) => data[index].toString(16).padStart(2, '0')\r\n\r\nconst getBinaryString = (length: number) => {\r\n let string = ''\r\n for (let j = 0; j < length; j++)\r\n string += String.fromCharCode(data[i + j])\r\n i += length\r\n return string\r\n}\r\n\r\nconst parseBinaryValue = (type: string): string => {\r\n if (type === DataType.UnsignedInteger) {\r\n return getBinaryUnsigned().toString()\r\n }\r\n if (type === DataType.Integer) {\r\n return getBinarySigned().toString()\r\n }\r\n if (type === DataType.String) {\r\n const length = getBinaryLength()\r\n return getBinaryString(length)\r\n }\r\n if (type === DataType.Float) {\r\n return String(+getBinaryFloat().toFixed(5))\r\n }\r\n if (type === DataType.BigInteger) {\r\n return getBinaryBigSigned().toString()\r\n }\r\n if (type === DataType.BigUnsignedInteger) {\r\n return getBinaryBigUnsigned().toString()\r\n }\r\n if (type === DataType.BigFloat) {\r\n return (Number(getBinaryBigSigned()) / 100000.0).toString()\r\n }\r\n if (type === DataType.Boolean) {\r\n return getBinaryBoolean()\r\n }\r\n return type\r\n}\r\n\r\n// Date is not its own data format so the keys must be hard coded.\r\nconst dates = new Set([\r\n 'date', 'death_date', 'start_date', 'last_trade_route_creation_date', 'arrived_here_date', 'stall_date', 'ignored',\r\n 'leader_date', 'budget_dates', 'last_employed_date', 'last_owner_change', 'last_controller_change', 'looted', 'plundered',\r\n 'deity_elevated', 'last_war', 'last_peace', 'last_battle_won', 'omen_start', 'omen_duration', 'idle', 'birth_date',\r\n 'last_send_diplomat', 'move_pop_command', 'building_construction', 'disband_army', 'spouse_death_date', 'last_victory',\r\n 'next_year_update', 'next_quarter_update', 'last_enslavement', 'fixed_date', 'regret', 'end_date', 'gather_date',\r\n 'last_command_date', 'deadline',\r\n])\r\n\r\nconst isDate = (key: string, parentKey: string, token: string, value: string) => {\r\n if (key && token === DataType.Integer) {\r\n\r\n if (dates.has(key))\r\n return true\r\n if (parentKey === 'breaking_alliances')\r\n return true\r\n // HACK: Dates are always a big number and other uses of 'action' seem to use low numbers.\r\n if (key === 'action' && Number(value) > 100000)\r\n return true\r\n }\r\n return false\r\n}\r\n\r\nconst parseBinaryText = (data: Uint8Array) => {\r\n const tokens = [''] as any[]\r\n let pad = ''\r\n let key = ''\r\n let parentKey = ''\r\n let previous: string | number = ''\r\n let inArray = false\r\n while (i < data.length) {\r\n let token: string | number = getBinaryToken()\r\n if (key === 'identity' && token === DataType.BigInteger)\r\n token = DataType.BigUnsignedInteger\r\n if (token === ControlType.Separator) {\r\n tokens.push(token)\r\n }\r\n else if (token in DataType) {\r\n const value = parseBinaryValue(String(token))\r\n if (token === DataType.String && !isKeyValuePair())\r\n token = '\"' + value + '\"'\r\n else if (isDate(key, parentKey, token, value))\r\n token = decodateDate(Number(value))\r\n else\r\n token = value\r\n\r\n if (isKeyValuePair()) {\r\n key = String(token)\r\n tokens.push('\\n')\r\n if (pad)\r\n tokens.push(pad)\r\n }\r\n else if (previous !== ControlType.Separator) {\r\n inArray = true\r\n tokens.push(' ')\r\n }\r\n\r\n tokens.push(token)\r\n }\r\n else if (token === ControlType.SectionStart || token === ControlType.SectionEnd) {\r\n if (token === ControlType.SectionEnd) {\r\n parentKey = ''\r\n key = ''\r\n if (tokens[tokens.length - 1] !== '\\n' && !inArray)\r\n tokens.push('\\n')\r\n pad = pad.substr(1)\r\n if (pad && !inArray)\r\n tokens.push(pad)\r\n if (inArray)\r\n tokens.push(' ')\r\n inArray = false\r\n }\r\n if (token === ControlType.SectionStart && tokens[tokens.length - 1] !== ControlType.Separator)\r\n tokens.push(' ')\r\n tokens.push(token)\r\n if (token === ControlType.SectionStart) {\r\n pad += '\\t'\r\n parentKey = key\r\n }\r\n }\r\n else {\r\n if (isKeyValuePair()) {\r\n key = token\r\n tokens.push('\\n')\r\n if (pad)\r\n tokens.push(pad)\r\n }\r\n else if (previous !== ControlType.Separator) {\r\n inArray = true\r\n tokens.push(' ')\r\n }\r\n\r\n tokens.push(token)\r\n }\r\n previous = token\r\n }\r\n return tokens\r\n}\r\n\r\n/** Transforms a numeric date to a string representation. */\r\nconst decodateDate = (input: number) => {\r\n const months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\r\n\r\n // let hour = input % 24\r\n let year = Math.floor(-5000 + input / 24 / 365)\r\n let day = Math.floor(1 + input / 24 % 365)\r\n let month = 1\r\n\r\n for (let i = 0; i < months.length; i++) {\r\n if (day > months[i]) {\r\n day -= months[i]\r\n month++\r\n }\r\n else {\r\n break\r\n }\r\n }\r\n return year + \".\" + month + \".\" + day\r\n}\r\n\r\nconst hexToSigned = (hex: string) => {\r\n if (hex.length % 2)\r\n hex = '0' + hex\r\n\r\n const highbyte = parseInt(hex.slice(0, 2), 16)\r\n let bn = BigInt('0x' + hex);\r\n\r\n if (0x80 & highbyte) {\r\n bn = BigInt('0b' + bn.toString(2).split('').map(i => '0' === i ? 1 : 0).join('')) + BigInt(1)\r\n bn = -bn\r\n }\r\n\r\n return bn\r\n}\r\n\r\nconst hexToUnsigned = (hex: string) => {\r\n if (hex.length % 2)\r\n hex = '0' + hex\r\n\r\n return BigInt('0x' + hex)\r\n}","\r\nimport { sumBy } from 'lodash'\r\nimport { Terrain, TerrainCalc, Setting, UnitAttribute, UnitData, CombatPhase, GeneralAttribute, LocationType, CohortProperties, SiteSettings, Cohorts, Cohort, Frontline, Reserve, GeneralValues, Environment, Settings, Army } from 'types'\r\nimport { calculateValue } from 'definition_values'\r\nimport { multiplyChance } from 'utils'\r\n\r\n/**\r\n * Calculates the roll modifier based on skill level difference of generals.\r\n * Every two levels increase dice roll by one (rounded down).\r\n */\r\nexport const calculateGeneralPips = (values: GeneralValues, enemy: GeneralValues, phase: CombatPhase): number => {\r\n const martialPip = Math.floor((values[GeneralAttribute.Martial] - enemy[GeneralAttribute.Martial]) / 2.0)\r\n const phasePip = values[phase] - enemy[phase]\r\n return Math.max(0, martialPip + phasePip)\r\n}\r\n\r\nexport const getTerrainPips = (terrains: Terrain[], isAttacker: boolean, values: GeneralValues, enemy: GeneralValues) => {\r\n const enableTiles = isAttacker\r\n const enableBorders = isAttacker && values[GeneralAttribute.Maneuver] <= enemy[GeneralAttribute.Maneuver]\r\n terrains = terrains.filter(terrain => terrain.location === LocationType.Border ? enableBorders : enableTiles)\r\n return sumBy(terrains, terrain => calculateValue(terrain, TerrainCalc.Roll))\r\n}\r\n\r\n/**\r\n * Calculates the roll modifier from unit pips.\r\n */\r\nexport const calculateCohortPips = (source: CohortProperties, target: CohortProperties, targetSupport: CohortProperties | null, type: UnitAttribute.Strength | UnitAttribute.Morale, phase?: CombatPhase): number => {\r\n return getOffensiveCohortPips(source, type, phase) + getDefensiveCohortPips(target, type, phase) + getDefensiveSupportCohortPips(targetSupport, type, phase)\r\n}\r\n\r\nexport const getOffensiveCohortPips = (cohort: CohortProperties, type: UnitAttribute.Strength | UnitAttribute.Morale, phase?: CombatPhase): number => {\r\n if (type === UnitAttribute.Morale)\r\n return cohort[UnitAttribute.OffensiveMoralePips]\r\n if (phase === CombatPhase.Shock)\r\n return cohort[UnitAttribute.OffensiveShockPips]\r\n if (phase === CombatPhase.Fire)\r\n return cohort[UnitAttribute.OffensiveFirePips]\r\n return 0\r\n}\r\n\r\nexport const getDefensiveCohortPips = (cohort: CohortProperties, type: UnitAttribute.Strength | UnitAttribute.Morale, phase?: CombatPhase): number => {\r\n if (type === UnitAttribute.Morale)\r\n return -cohort[UnitAttribute.DefensiveMoralePips]\r\n if (phase === CombatPhase.Shock)\r\n return -cohort[UnitAttribute.DefensiveShockPips]\r\n if (phase === CombatPhase.Fire)\r\n return -cohort[UnitAttribute.DefensiveFirePips]\r\n return 0\r\n}\r\n\r\nexport const getDefensiveSupportCohortPips = (cohort: CohortProperties | null, type: UnitAttribute.Strength | UnitAttribute.Morale, phase?: CombatPhase): number => {\r\n return cohort ? Math.ceil(cohort[UnitAttribute.DefensiveSupport] * getDefensiveCohortPips(cohort, type, phase)) : 0\r\n}\r\n\r\nexport const calculateExperienceReduction = (settings: SiteSettings, target: UnitData) => {\r\n let damageReductionPerExperience = settings[Setting.ExperienceDamageReduction]\r\n // Bug in game which makes morale damage taken and strength damage taken affect damage reduction from experience.\r\n if (!settings[Setting.FixExperience])\r\n damageReductionPerExperience *= (2.0 + calculateValue(target, UnitAttribute.MoraleDamageTaken) + calculateValue(target, UnitAttribute.StrengthDamageTaken)) * 0.5\r\n return -damageReductionPerExperience * calculateValue(target, UnitAttribute.Experience)\r\n}\r\n\r\nexport const getCombatPhase = (round: number, settings: SiteSettings) => {\r\n if (settings[Setting.FireAndShock]) {\r\n const phase = getCombatPhaseNumber(round, settings)\r\n if (phase)\r\n return phase % 2 ? CombatPhase.Fire : CombatPhase.Shock\r\n }\r\n return CombatPhase.Default\r\n}\r\n\r\nexport const getCombatPhaseByPhaseNumber = (phase: number, settings: SiteSettings) => {\r\n if (settings[Setting.FireAndShock]) {\r\n if (phase)\r\n return phase % 2 ? CombatPhase.Fire : CombatPhase.Shock\r\n }\r\n return CombatPhase.Default\r\n}\r\n\r\n\r\nexport const getCombatPhaseNumber = (round: number, settings: SiteSettings) => Math.ceil(round / settings[Setting.PhaseLength])\r\n\r\nexport const getDailyIncrease = (round: number, settings: SiteSettings) => settings[Setting.DailyDamageIncrease] * round\r\n\r\nexport const calculateTotalStrength = (cohorts: Cohorts, includeDefeated: boolean) => {\r\n let strength = 0.0\r\n const addRatio = (cohort: Cohort) => {\r\n strength += cohort[UnitAttribute.Strength]\r\n }\r\n iterateCohorts(cohorts, includeDefeated, addRatio)\r\n return strength\r\n}\r\n\r\n/** Calls a function for every cohort. */\r\nexport const iterateCohorts = (cohorts: Cohorts, includeDefeated: boolean, func: (cohort: Cohort) => void) => {\r\n let i = 0, j = 0\r\n let length = cohorts.frontline.length\r\n let length2 = cohorts.frontline[0].length\r\n for (; i < length; i++) {\r\n for (; j < length2; j++) {\r\n if (cohorts.frontline[i][j] && !cohorts.frontline[i][j]?.state.isDefeated)\r\n func(cohorts.frontline[i][j]!)\r\n }\r\n }\r\n cohorts.reserve.front.forEach(func)\r\n cohorts.reserve.flank.forEach(func)\r\n cohorts.reserve.support.forEach(func)\r\n if (includeDefeated)\r\n cohorts.defeated.forEach(func)\r\n}\r\n\r\n/**\r\n * Removes temporary defeated units from frontline.\r\n */\r\nexport const removeDefeated = (frontline: Frontline) => {\r\n for (let i = 0; i < frontline.length; i++) {\r\n for (let j = 0; j < frontline[i].length; j++) {\r\n const unit = frontline[i][j]\r\n if (!unit)\r\n continue\r\n if (unit.state.isDefeated)\r\n frontline[i][j] = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Calculates the next index when the order is from center to edges.\r\n */\r\nexport const nextIndex = (index: number, center: number) => index < center ? index + 2 * (center - index) : index - 2 * (index - center) - 1\r\n\r\nexport const reserveSize = (reserve: Reserve) => reserve.front.length + reserve.flank.length + reserve.support.length\r\n\r\nexport const defeatCohort = (environment: Environment, cohort: Cohort) => {\r\n // Defeating a defeated cohort shouldn't change the time of defeat.\r\n if (!cohort.state.isDefeated)\r\n cohort.state.defeatedDay = environment.day\r\n cohort.state.isDefeated = true\r\n cohort.state.isDestroyed = cohort[UnitAttribute.Strength] <= 0\r\n}\r\n\r\nexport const wipeCohort = (environment: Environment, cohort: Cohort, enemy: Army | null, captureChance: number) => {\r\n cohort[UnitAttribute.Morale] = 0\r\n cohort[UnitAttribute.Strength] = 0\r\n cohort.state.stackWipedBy = enemy\r\n cohort.state.captureChance = multiplyChance(cohort.state.captureChance, captureChance - cohort.properties[UnitAttribute.CaptureResist])\r\n defeatCohort(environment, cohort)\r\n}\r\n\r\nexport const uncaptureCohort = (cohort: Cohort) => {\r\n cohort.state.captureChance = 0\r\n}\r\n\r\nexport const isAlive = (unit: Cohort, settings: Settings) => (\r\n unit[UnitAttribute.Morale] > settings[Setting.MinimumMorale] && unit[UnitAttribute.Strength] > settings[Setting.MinimumStrength]\r\n)\r\n","\r\nimport { sumBy, values } from 'lodash'\r\nimport { Terrain, UnitType, CohortDefinition, UnitAttribute, Setting, Settings, CombatPhase, UnitValueType, Cohort, CohortProperties, DisciplineValue, CountryName, ArmyName } from 'types'\r\nimport { toObj, map, noZero } from 'utils'\r\nimport { calculateValue, calculateValueWithoutLoss, calculateBase } from 'definition_values'\r\nimport { calculateExperienceReduction } from './combat_utils'\r\nimport { getConfig } from 'data/config'\r\n\r\nexport const getProperties = (countryName: CountryName, armyName: ArmyName, participantIndex: number, index: number, settings: Settings, terrains: Terrain[], unitTypes: UnitType[], cohort: CohortDefinition): CohortProperties => {\r\n const damageReduction = precalculateDamageReduction(cohort, settings)\r\n const properties = {\r\n index,\r\n armyName,\r\n countryName,\r\n participantIndex,\r\n type: cohort.type,\r\n isLoyal: !!cohort.isLoyal,\r\n image: cohort.image,\r\n deploymentPenalty: 0,\r\n reinforcementPenalty: 0,\r\n winningMoraleBonus: 0,\r\n maxMorale: calculateValueWithoutLoss(cohort, UnitAttribute.Morale),\r\n maxStrength: calculateValueWithoutLoss(cohort, UnitAttribute.Strength),\r\n experienceReduction: calculateExperienceReduction(settings, cohort),\r\n // Unmodified value is used to determine deployment order.\r\n deploymentCost: calculateBase(cohort, UnitAttribute.Cost),\r\n tech: cohort.tech,\r\n mode: cohort.mode,\r\n role: cohort.role,\r\n parent: cohort.parent,\r\n damage: getDamages(settings, terrains, unitTypes, cohort),\r\n damageTakenMultiplier: damageReduction,\r\n moraleTakenMultiplier: damageReduction * getValue(cohort, UnitAttribute.MoraleDamageTaken, settings[Setting.AttributeMoraleDamage]),\r\n strengthTakenMultiplier: applyPhaseDamageTaken(cohort, damageReduction * getValue(cohort, UnitAttribute.StrengthDamageTaken, settings[Setting.AttributeStrengthDamage]))\r\n } as CohortProperties\r\n values(UnitAttribute).forEach(calc => { properties[calc] = calculateValue(cohort, calc) })\r\n values(CombatPhase).forEach(calc => { properties[calc] = calculateValue(cohort, calc) })\r\n terrains.forEach(({ type }) => { properties[type] = calculateValue(cohort, type) })\r\n unitTypes.forEach(calc => { properties[calc] = calculateValue(cohort, calc) })\r\n return properties\r\n}\r\n\r\n/**\r\n * Transforms a unit to a combat unit.\r\n */\r\nexport const getCombatUnit = (countryName: CountryName, armyName: ArmyName, participantIndex: number, index: number, settings: Settings, terrains: Terrain[], unitTypes: UnitType[], cohort: CohortDefinition): Cohort => ({\r\n [UnitAttribute.Morale]: calculateValue(cohort, UnitAttribute.Morale),\r\n [UnitAttribute.Strength]: calculateValue(cohort, UnitAttribute.Strength),\r\n state: { flankRatioPenalty: 0, captureChance: 0, target: null, targetSupport: null, flanking: false, moraleLoss: 0, strengthLoss: 0, moraleDealt: 0, strengthDealt: 0, damageMultiplier: 0, isDefeated: false, targetedBy: null, defeatedBy: null, defeatedDay: 0, stackWipedBy: null, isDestroyed: false, totalMoraleDealt: 0, totalStrengthDealt: 0 },\r\n properties: getProperties(countryName, armyName, participantIndex, index, settings, terrains, unitTypes, cohort),\r\n isWeak: false\r\n})\r\n\r\nconst applyPhaseDamageDone = (unit: CohortDefinition, value: number) => ({\r\n [CombatPhase.Default]: value,\r\n [CombatPhase.Fire]: value * (1.0 + calculateValue(unit, UnitAttribute.FireDamageDone)),\r\n [CombatPhase.Shock]: value * (1.0 + calculateValue(unit, UnitAttribute.ShockDamageDone))\r\n})\r\n\r\nconst applyPhaseDamageTaken = (unit: CohortDefinition, value: number) => ({\r\n [CombatPhase.Default]: value,\r\n [CombatPhase.Fire]: value * (1.0 + calculateValue(unit, UnitAttribute.FireDamageTaken)),\r\n [CombatPhase.Shock]: value * (1.0 + calculateValue(unit, UnitAttribute.ShockDamageTaken))\r\n})\r\n\r\nconst applyPhaseDamage = (unit: CohortDefinition, value: number) => ({\r\n [CombatPhase.Default]: value,\r\n [CombatPhase.Fire]: value * calculateValue(unit, CombatPhase.Fire),\r\n [CombatPhase.Shock]: value * calculateValue(unit, CombatPhase.Shock)\r\n})\r\n\r\nconst applyUnitTypes = (unit: CohortDefinition, unitTypes: UnitType[], settings: Settings, values: { [key in CombatPhase]: number }) => (\r\n toObj(unitTypes, type => type, type => map(values, damage => damage * getValue(unit, type, settings[Setting.AttributeUnitType])))\r\n)\r\n\r\nconst applyDamageTypes = (unit: CohortDefinition, settings: Settings, values: { [key in UnitType]: { [key in CombatPhase]: number } }) => {\r\n const moraleDone = getValue(unit, UnitAttribute.MoraleDamageDone, settings[Setting.AttributeMoraleDamage]) * settings[Setting.MoraleLostMultiplier] / 1000.0\r\n const strengthDone = applyPhaseDamageDone(unit, getValue(unit, UnitAttribute.StrengthDamageDone, settings[Setting.AttributeStrengthDamage]) * settings[Setting.StrengthLostMultiplier] / 1000.0)\r\n return {\r\n [UnitAttribute.Strength]: map(values, values => map(values, (value, phase) => value * strengthDone[phase])),\r\n [UnitAttribute.Morale]: map(values, values => map(values, value => value * moraleDone)),\r\n 'Damage': values\r\n }\r\n}\r\n\r\nconst getDamages = (settings: Settings, terrains: Terrain[], unitTypes: UnitType[], cohort: CohortDefinition) => (\r\n applyDamageTypes(cohort, settings, applyUnitTypes(cohort, unitTypes, settings, applyPhaseDamage(cohort, precalculateDamage(terrains, cohort, settings))))\r\n)\r\n\r\nconst getValue = (unit: CohortDefinition, attribute: UnitValueType, enabled: boolean) => 1.0 + getMultiplier(unit, attribute, enabled)\r\nconst getMultiplier = (unit: CohortDefinition, attribute: UnitValueType, enabled: boolean) => enabled ? calculateValue(unit, attribute) : 0\r\n\r\nconst precalculateDamage = (terrains: Terrain[], unit: CohortDefinition, settings: Settings) => (\r\n settings[Setting.Precision]\r\n * getValue(unit, UnitAttribute.Discipline, settings[Setting.AttributeDiscipline] === DisciplineValue.Both || settings[Setting.AttributeDiscipline] === DisciplineValue.Damage)\r\n * getValue(unit, UnitAttribute.CombatAbility, settings[Setting.AttributeCombatAbility])\r\n * getValue(unit, UnitAttribute.DamageDone, settings[Setting.AttributeDamage])\r\n * (1.0 + sumBy(terrains, terrain => getMultiplier(unit, terrain.type, settings[Setting.AttributeTerrainType])))\r\n * (1.0 + (settings[Setting.AttributeLoyal] && unit.isLoyal ? getConfig().LoyalDamage : 0))\r\n)\r\n\r\nconst precalculateDamageReduction = (unit: CohortDefinition, settings: Settings) => (\r\n (settings[Setting.AttributeExperience] ? 1.0 + calculateExperienceReduction(settings, unit) : 1.0)\r\n * getValue(unit, UnitAttribute.DamageTaken, settings[Setting.AttributeDamage])\r\n / noZero(getValue(unit, UnitAttribute.Discipline, settings[Setting.AttributeDiscipline] === DisciplineValue.Both))\r\n / noZero(getMultiplier(unit, UnitAttribute.MilitaryTactics, settings[Setting.AttributeMilitaryTactics]))\r\n)\r\n","import { UnitPreferences, UnitAttribute, UnitPreferenceType, UnitRole, Setting, Settings, Reserve, Cohorts, Cohort, Side, Environment, Army } from 'types'\r\nimport { sortBy, remove, clamp, sum, flatten } from 'lodash'\r\nimport { nextIndex, reserveSize, defeatCohort, isAlive } from './combat_utils'\r\nimport { getLeadingArmy } from 'managers/battle'\r\n\r\nconst armyFlankCount = (reserve: Reserve) => {\r\n return reserve.front.filter(cohort => cohort.properties.role === UnitRole.Flank).length\r\n + reserve.flank.filter(cohort => cohort.properties.role === UnitRole.Flank).length\r\n + reserve.support.filter(cohort => cohort.properties.role === UnitRole.Flank).length\r\n}\r\n\r\nconst deployFront = (cohorts: Cohort[], row: (Cohort | null)[], center: number, flank: number, settings: Settings, preferences?: UnitPreferences) => {\r\n for (let index = center; index !== flank; index = nextIndex(index, center)) {\r\n if (row[index])\r\n continue\r\n const cohort = cohorts.pop()\r\n if (cohort) {\r\n if (preferences)\r\n applyReinforcementPenalty(cohort, preferences, settings)\r\n row[index] = cohort\r\n }\r\n else\r\n break\r\n }\r\n}\r\n\r\nconst deployFlanks = (cohorts: Cohort[], row: (Cohort | null)[], center: number, flank: number, settings: Settings, preferences?: UnitPreferences) => {\r\n for (let index = flank; index >= 0 && index < row.length; index = nextIndex(index, center)) {\r\n if (row[index])\r\n continue\r\n const cohort = cohorts.pop()\r\n if (cohort) {\r\n if (preferences)\r\n applyReinforcementPenalty(cohort, preferences, settings)\r\n row[index] = cohort\r\n }\r\n else\r\n break\r\n }\r\n}\r\n\r\nconst deployBoth = (cohorts: Cohort[], row: (Cohort | null)[], center: number, limit: number, settings: Settings, preferences?: UnitPreferences) => {\r\n for (let index = center, count = 0; index >= 0 && index < row.length && count < limit; index = nextIndex(index, center), count++) {\r\n if (row[index])\r\n continue\r\n const cohort = cohorts.pop()\r\n if (cohort) {\r\n if (preferences)\r\n applyReinforcementPenalty(cohort, preferences, settings)\r\n row[index] = cohort\r\n }\r\n else\r\n break\r\n }\r\n}\r\n\r\nconst applyLateDeploymentPenaltySub = (cohort: Cohort, percent: number) => {\r\n cohort[UnitAttribute.Morale] -= cohort.properties.maxMorale * percent\r\n cohort.properties.deploymentPenalty += percent\r\n}\r\n\r\nconst applyLateDeploymentPenalty = (reserve: Reserve, round: number, settings: Settings) => {\r\n if (round < settings[Setting.StackwipeRounds] || !settings[Setting.MoraleHitForLateDeployment])\r\n return\r\n reserve.front.forEach(cohort => applyLateDeploymentPenaltySub(cohort, settings[Setting.MoraleHitForLateDeployment]))\r\n reserve.flank.forEach(cohort => applyLateDeploymentPenaltySub(cohort, settings[Setting.MoraleHitForLateDeployment]))\r\n reserve.support.forEach(cohort => applyLateDeploymentPenaltySub(cohort, settings[Setting.MoraleHitForLateDeployment]))\r\n}\r\n\r\nconst applyReinforcementPenalty = (cohort: Cohort, preferences: UnitPreferences, settings: Settings) => {\r\n if (cohort.properties.type !== preferences[UnitPreferenceType.Secondary] && settings[Setting.MoraleHitForNonSecondaryReinforcement]) {\r\n cohort[UnitAttribute.Morale] -= cohort.properties.maxMorale * settings[Setting.MoraleHitForNonSecondaryReinforcement]\r\n cohort.properties.reinforcementPenalty += settings[Setting.MoraleHitForNonSecondaryReinforcement]\r\n }\r\n}\r\n\r\nconst deployCohorts = (target: Cohorts, reserve: Reserve, leftFlank: number, rightFlank: number, settings: Settings, preferences?: UnitPreferences) => {\r\n const frontline = target.frontline[0]\r\n const backline = target.frontline.length > 1 ? target.frontline[1] : null\r\n const center = Math.floor(frontline.length / 2.0)\r\n let flankStartingIndex = leftFlank > rightFlank ? leftFlank - 1 : frontline.length - rightFlank\r\n if (frontline.length % 2)\r\n flankStartingIndex = leftFlank >= rightFlank ? leftFlank - 1 : frontline.length - rightFlank\r\n const deploySupport = !settings[Setting.SupportPhase] || (reserve.front.length === 0 && reserve.flank.length === 0 && !frontline.some(cohort => cohort))\r\n const maxSupportBackline = Math.floor(reserveSize(reserve) / 2)\r\n\r\n if (backline)\r\n deployBoth(reserve.support, backline, center, maxSupportBackline, settings, preferences)\r\n\r\n deployFront(reserve.front, frontline, center, flankStartingIndex, settings, preferences)\r\n deployFront(reserve.flank, frontline, center, flankStartingIndex, settings, preferences)\r\n if (deploySupport)\r\n deployFront(reserve.support, frontline, center, flankStartingIndex, settings, preferences)\r\n // Use front units as flank if necessary.\r\n deployFlanks(reserve.flank.length ? reserve.flank : reserve.front, frontline, center, flankStartingIndex, settings, preferences)\r\n if (backline)\r\n deployFront(reserve.front, backline, center, flankStartingIndex, settings, preferences)\r\n deployFlanks(reserve.flank, frontline, center, flankStartingIndex, settings, preferences)\r\n deployFlanks(reserve.front, frontline, center, flankStartingIndex, settings, preferences)\r\n if (deploySupport)\r\n deployFlanks(reserve.support, frontline, center, flankStartingIndex, settings, preferences)\r\n if (backline)\r\n deployFlanks(reserve.flank, backline, center, flankStartingIndex, settings, preferences)\r\n}\r\n\r\n\r\nexport const sortReserve = (reserve: Cohort[], unitPreferences: UnitPreferences): Reserve => {\r\n const frontReserve = reserve.filter(value => isFrontUnit(unitPreferences, value))\r\n const flankReserve = reserve.filter(value => isFlankUnit(unitPreferences, value))\r\n const supportReserve = reserve.filter(value => isSupportUnit(unitPreferences, value))\r\n // Calculate priorities (mostly based on unit type, ties are resolved with index numbers).\r\n const front = sortBy(frontReserve, value => {\r\n return value.properties.deploymentCost * 100000 + value[UnitAttribute.Strength] * 1000 + (value.properties.type === unitPreferences[UnitPreferenceType.Primary] ? 200000000 : 0) + (value.properties.type === unitPreferences[UnitPreferenceType.Secondary] ? 100000000 : 0)\r\n })\r\n const flank = sortBy(flankReserve, value => {\r\n return value.properties[UnitAttribute.Maneuver] * 100000 + value[UnitAttribute.Strength] * 1000 + (value.properties.type === unitPreferences[UnitPreferenceType.Flank] ? 100000000 : 0)\r\n })\r\n const support = sortBy(supportReserve, value => {\r\n return value[UnitAttribute.Strength] * 1000\r\n })\r\n return { front, flank, support }\r\n}\r\n\r\nconst isFrontUnit = (preferences: UnitPreferences, cohort: Cohort) => {\r\n if (cohort.properties.type === preferences[UnitPreferenceType.Primary] || cohort.properties.type === preferences[UnitPreferenceType.Secondary])\r\n return true\r\n if (cohort.properties.type === preferences[UnitPreferenceType.Flank])\r\n return false\r\n return cohort.properties.role === UnitRole.Front\r\n}\r\n\r\nconst isFlankUnit = (preferences: UnitPreferences, cohort: Cohort) => {\r\n if (cohort.properties.type === preferences[UnitPreferenceType.Primary] || cohort.properties.type === preferences[UnitPreferenceType.Secondary])\r\n return false\r\n if (cohort.properties.type === preferences[UnitPreferenceType.Flank])\r\n return true\r\n return cohort.properties.role === UnitRole.Flank\r\n}\r\n\r\nconst isSupportUnit = (preferences: UnitPreferences, cohort: Cohort) => {\r\n if (cohort.properties.type === preferences[UnitPreferenceType.Primary] || cohort.properties.type === preferences[UnitPreferenceType.Secondary])\r\n return false\r\n if (cohort.properties.type === preferences[UnitPreferenceType.Flank])\r\n return false\r\n return cohort.properties.role === UnitRole.Support\r\n}\r\n\r\n/**\r\n * Calculates the left and right flank size.\r\n * @param combatWidth Size of the battlefield.\r\n * @param preferredFlankSize Maximum amount of flanking units per side.\r\n * @param reserve Sorted reserve to get amount of flanking units.\r\n * @param enemyUnits Enemy units to calculate space on the battlefield.\r\n */\r\nconst calculateFlankSizes = (combatWidth: number, preferredFlankSize: number, enemyArmySize?: number): [number, number] => {\r\n const free_space = enemyArmySize ? combatWidth - enemyArmySize : 0\r\n const leftSideFreeSpace = Math.ceil(free_space / 2.0)\r\n const rightSideFreeSpace = Math.floor(free_space / 2.0)\r\n // Max space checks needed for low combat widths.\r\n const leftSideMaxSpace = Math.ceil(combatWidth / 2.0)\r\n const rightSideMaxSpace = Math.floor(combatWidth / 2.0)\r\n const leftFlankSize = clamp(preferredFlankSize, leftSideFreeSpace, leftSideMaxSpace)\r\n const rightFlankSize = clamp(preferredFlankSize, rightSideFreeSpace, rightSideMaxSpace)\r\n return [leftFlankSize, rightFlankSize]\r\n}\r\n\r\nconst calculatePreferredFlankSize = (settings: Settings, customValue: number, reserve: Reserve) => {\r\n return settings[Setting.CustomDeployment] ? customValue : Math.min(armyFlankCount(reserve) / 2, Math.floor(settings[Setting.CombatWidth] / 4))\r\n}\r\n\r\nconst removeDefeatedFromNewArmies = (environment: Environment, side: Side, armies: Army[]) => {\r\n const removeFromReserve = (part: Cohort[]) => {\r\n for (let i = 0; i < part.length; i++) {\r\n const cohort = part[i]\r\n if (isAlive(cohort, environment.settings))\r\n continue\r\n defeatCohort(environment, cohort)\r\n side.cohorts.defeated.push(cohort)\r\n remove(part, value => value === cohort)\r\n i--\r\n }\r\n }\r\n armies.forEach(army => {\r\n removeFromReserve(army.reserve.front)\r\n removeFromReserve(army.reserve.flank)\r\n removeFromReserve(army.reserve.support)\r\n })\r\n}\r\n\r\nexport const deploy = (environment: Environment, sideA: Side, sideB: Side) => {\r\n const { day, settings, round } = environment\r\n if (round === 0 && (!canDeploy(day, sideA) || !canDeploy(day, sideB)))\r\n return\r\n const armiesA = getDeployingArmies(day, sideA)\r\n const armiesB = getDeployingArmies(day, sideB)\r\n removeDefeatedFromNewArmies(environment, sideA, armiesA)\r\n removeDefeatedFromNewArmies(environment, sideB, armiesB)\r\n const sizeA = settings[Setting.DynamicFlanking] ? countCohorts(sideA) + countReserve(armiesA) : undefined\r\n const sizeB = settings[Setting.DynamicFlanking] ? countCohorts(sideB) + countReserve(armiesB) : undefined\r\n if (armiesA.length) {\r\n deploySub(sideA, armiesA, settings, environment.round, sizeB)\r\n }\r\n if (armiesB.length) {\r\n deploySub(sideB, armiesB, settings, environment.round, sizeA)\r\n }\r\n}\r\n\r\nconst countCohorts = (side: Side) => reserveSize(side.cohorts.reserve) + side.cohorts.frontline[0].filter(unit => unit).length\r\nconst countReserve = (armies: Army[]) => sum(armies.map(army => reserveSize(army.reserve)))\r\n\r\nexport const undeploy = (environment: Environment, side: Side) => {\r\n if (!side.isDefeated) {\r\n const reserve: Cohort[] = []\r\n reserve.push(...flatten(side.cohorts.frontline.map(row => row.filter(cohort => cohort) as Cohort[])))\r\n reserve.push(...side.cohorts.reserve.flank)\r\n reserve.push(...side.cohorts.reserve.front)\r\n reserve.push(...side.cohorts.reserve.support)\r\n reserve.push(...side.cohorts.defeated)\r\n side.deployed.forEach(army => {\r\n army.reserve = sortReserve(reserve.filter(cohort => cohort.properties.participantIndex === army.participantIndex), army.unitPreferences)\r\n applyWinningMoraleBonus(army.reserve, environment.settings)\r\n side.armies.push(army)\r\n })\r\n }\r\n\r\n side.deployed = []\r\n side.cohorts.frontline = side.cohorts.frontline.map(row => row.map(() => null))\r\n side.cohorts.defeated = []\r\n resortReserve(side, [])\r\n}\r\n\r\nconst applyWinningMoraleBonusSub = (cohort: Cohort, percent: number) => {\r\n const bonus = Math.min(cohort.properties.maxMorale * percent, cohort.properties.maxMorale - cohort[UnitAttribute.Morale])\r\n cohort[UnitAttribute.Morale] += bonus\r\n cohort.properties.winningMoraleBonus += bonus\r\n}\r\n\r\nconst applyWinningMoraleBonus = (reserve: Reserve, settings: Settings) => {\r\n if (!settings[Setting.MoraleGainForWinning])\r\n return\r\n reserve.front.forEach(cohort => applyWinningMoraleBonusSub(cohort, settings[Setting.MoraleGainForWinning]))\r\n reserve.flank.forEach(cohort => applyWinningMoraleBonusSub(cohort, settings[Setting.MoraleGainForWinning]))\r\n reserve.support.forEach(cohort => applyWinningMoraleBonusSub(cohort, settings[Setting.MoraleGainForWinning]))\r\n}\r\n\r\n\r\nexport const moveDefeatedToRetreated = (cohorts: Cohorts) => {\r\n cohorts.retreated.push(...cohorts.defeated)\r\n cohorts.defeated = []\r\n}\r\n\r\nconst canDeploy = (day: number, side: Side) => {\r\n return side.armies.length && side.armies[side.armies.length - 1].arrival <= day\r\n}\r\n\r\nconst getDeployingArmies = (day: number, side: Side) => {\r\n const armies = []\r\n while (side.armies.length && side.armies[side.armies.length - 1].arrival <= day) {\r\n armies.push(side.armies.pop()!)\r\n }\r\n return armies\r\n}\r\n\r\nconst deploySub = (side: Side, deploying: Army[], settings: Settings, round: number, enemyArmySize?: number) => {\r\n const pool: Cohort[] = []\r\n deploying.forEach(army => {\r\n const [leftFlank, rightFlank] = calculateFlankSizes(settings[Setting.CombatWidth], calculatePreferredFlankSize(settings, army.flankSize, army.reserve), enemyArmySize)\r\n army.leftFlank = leftFlank\r\n army.rightFlank = rightFlank\r\n applyLateDeploymentPenalty(army.reserve, round, settings)\r\n deployCohorts(side.cohorts, army.reserve, leftFlank, rightFlank, settings)\r\n side.deployed.push(army)\r\n pool.push(...army.reserve.front)\r\n pool.push(...army.reserve.flank)\r\n pool.push(...army.reserve.support)\r\n })\r\n side.deployed.sort((a, b) => b.priority - a.priority)\r\n pool.push(...side.cohorts.reserve.front)\r\n pool.push(...side.cohorts.reserve.flank)\r\n pool.push(...side.cohorts.reserve.support)\r\n resortReserve(side, pool)\r\n}\r\n\r\nconst resortReserve = (side: Side, reserve: Cohort[]) => {\r\n const general = getLeadingArmy(side)\r\n // Without general there also won't be any cohorts (so sorting is not needed).\r\n if (general)\r\n side.cohorts.reserve = sortReserve(reserve, general.unitPreferences)\r\n else\r\n side.cohorts.reserve = {\r\n flank: [],\r\n front: [],\r\n support: []\r\n }\r\n}\r\n\r\nconst moveUnits = (cohorts: Cohorts) => {\r\n const { frontline } = cohorts\r\n // Move units from back to front.\r\n for (let rowIndex = frontline.length - 1; rowIndex > 0; rowIndex--) {\r\n const row = frontline[rowIndex]\r\n const nextRow = frontline[rowIndex - 1]\r\n for (let unitIndex = 0; unitIndex < row.length; unitIndex++) {\r\n if (nextRow[unitIndex])\r\n continue\r\n nextRow[unitIndex] = row[unitIndex]\r\n row[unitIndex] = null\r\n }\r\n }\r\n // Only front cohorts can move on their row.\r\n const front = frontline[0]\r\n // Move units from left to center.\r\n for (let unitIndex = Math.floor(front.length / 2.0); unitIndex > 0; --unitIndex) {\r\n const unit = front[unitIndex]\r\n if (unit)\r\n continue\r\n const unitOnLeft = front[unitIndex - 1]\r\n if (unitOnLeft) {\r\n front[unitIndex] = unitOnLeft\r\n front[unitIndex - 1] = null\r\n }\r\n }\r\n // Move units from right to center.\r\n for (let unitIndex = Math.ceil(front.length / 2.0); unitIndex < front.length - 1; ++unitIndex) {\r\n const unit = front[unitIndex]\r\n if (unit)\r\n continue\r\n const unitOnRight = front[unitIndex + 1]\r\n if (unitOnRight) {\r\n front[unitIndex] = unitOnRight\r\n front[unitIndex + 1] = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n* Reinforces a given army based on reinforcement rules.\r\n* First priority is to move units from reserve. Then units move towards center.\r\n*/\r\nexport const reinforce = (field: Environment, side: Side) => {\r\n const { settings } = field\r\n const general = getLeadingArmy(side)\r\n if (general && reserveSize(side.cohorts.reserve))\r\n deployCohorts(side.cohorts, side.cohorts.reserve, general.leftFlank, general.rightFlank, settings, general.unitPreferences)\r\n moveUnits(side.cohorts)\r\n}\r\n","\r\nimport { TacticDefinition, UnitAttribute, Setting, UnitRole, Settings, CombatPhase, Cohorts, Cohort, Frontline, Side, Environment, TacticCalc, UnitType, TacticMatch, Army, FlankRatioPenalty } from 'types'\r\nimport { multiplyChance, noZero, toObj } from 'utils'\r\nimport { calculateValue } from 'definition_values'\r\nimport { getCombatPhase, calculateCohortPips, getDailyIncrease, iterateCohorts, removeDefeated, reserveSize, reinforce, calculateGeneralPips, getTerrainPips, checkStackWipe, defeatCohort, isAlive } from 'combat'\r\nimport { deploy, undeploy, moveDefeatedToRetreated } from './deployment'\r\nimport { getLeadingArmy, getDefaultCombatResults } from 'managers/battle'\r\nimport { getConfig } from 'data/config'\r\n\r\n/**\r\n * Makes given armies attach each other.\r\n */\r\nexport const doCombatRound = (env: Environment, sideA: Side, sideB: Side, markDefeated: boolean) => {\r\n env.round++\r\n const { round } = env\r\n const settings = env.settings\r\n const phase = getCombatPhase(env.round, settings)\r\n // Defender advantage requires detecting which one is the defender.\r\n const a = sideA.type === env.attacker ? sideA : sideB\r\n const d = sideA.type === env.attacker ? sideB : sideA\r\n if (markDefeated) {\r\n removeDefeated(a.cohorts.frontline)\r\n removeDefeated(d.cohorts.frontline)\r\n }\r\n if (round === 0) {\r\n undeploy(env, a)\r\n a.results = getDefaultCombatResults()\r\n undeploy(env, d)\r\n d.results = getDefaultCombatResults()\r\n }\r\n deploy(env, a, d)\r\n clearState(a.cohorts.frontline)\r\n clearState(d.cohorts.frontline)\r\n if (round > 0) {\r\n reinforce(env, a)\r\n if (!settings[Setting.DefenderAdvantage])\r\n reinforce(env, d)\r\n pickTargets(env, a.cohorts.frontline, d.cohorts.frontline)\r\n if (settings[Setting.DefenderAdvantage])\r\n reinforce(env, d)\r\n pickTargets(env, d.cohorts.frontline, a.cohorts.frontline)\r\n\r\n a.results.round = env.round\r\n d.results.round = env.round\r\n const dailyMultiplier = 1 + getDailyIncrease(env.round, settings)\r\n const generalA = getLeadingArmy(a)\r\n const generalD = getLeadingArmy(d)\r\n const tacticStrengthDamageMultiplier = generalA && generalD && settings[Setting.Tactics] ? 1.0 + calculateValue(generalA.tactic, TacticCalc.Casualties) + calculateValue(generalD.tactic, TacticCalc.Casualties) : 1.0\r\n a.results.dailyMultiplier = dailyMultiplier\r\n d.results.dailyMultiplier = dailyMultiplier\r\n attack(env, a, d, dailyMultiplier, tacticStrengthDamageMultiplier, phase)\r\n attack(env, d, a, dailyMultiplier, tacticStrengthDamageMultiplier, phase)\r\n\r\n applyLosses(a.cohorts.frontline)\r\n applyLosses(d.cohorts.frontline)\r\n }\r\n a.isDefeated = moveDefeated(env, a.cohorts.frontline, a.cohorts.defeated, markDefeated) && reserveSize(a.cohorts.reserve) === 0\r\n d.isDefeated = moveDefeated(env, d.cohorts.frontline, d.cohorts.defeated, markDefeated) && reserveSize(d.cohorts.reserve) === 0\r\n const noCombat = a.isDefeated && d.isDefeated\r\n\r\n const defenderWiped = checkStackWipe(env, d, a)\r\n if (!defenderWiped)\r\n checkStackWipe(env, a, d)\r\n a.armiesRemaining = !a.isDefeated || a.armies.length > 0\r\n d.armiesRemaining = !d.isDefeated || d.armies.length > 0\r\n if (a.isDefeated) {\r\n moveDefeatedToRetreated(a.cohorts)\r\n env.round = -1\r\n if (!noCombat && settings[Setting.AttackerSwapping])\r\n env.attacker = a.type\r\n }\r\n if (d.isDefeated) {\r\n moveDefeatedToRetreated(d.cohorts)\r\n env.round = -1\r\n if (!noCombat && settings[Setting.AttackerSwapping])\r\n env.attacker = d.type\r\n }\r\n}\r\n\r\nconst getBackTarget = (target: Frontline, index: number) => target.length > 1 ? target[1][index] : null\r\n\r\nconst clearState = (source: Frontline) => {\r\n for (let i = 0; i < source.length; i++) {\r\n for (let j = 0; j < source[i].length; j++) {\r\n const cohort = source[i][j]\r\n if (!cohort)\r\n continue\r\n const state = cohort.state\r\n state.damageMultiplier = 0\r\n state.moraleDealt = 0\r\n state.strengthDealt = 0\r\n state.moraleLoss = 0\r\n state.strengthLoss = 0\r\n state.target = null\r\n state.flanking = false\r\n state.targetedBy = null\r\n state.flankRatioPenalty = 0\r\n state.captureChance = 0\r\n // Enemies in front should never be already defeated.\r\n // This kind of state can come from Analyze tool because it doesn't reset the state.\r\n state.isDefeated = false\r\n state.defeatedBy = null\r\n state.isDestroyed = false\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Selects targets for units.\r\n */\r\nconst pickTargets = (environment: Environment, source: Frontline, target: Frontline) => {\r\n const settings = environment.settings\r\n const sourceLength = source[0].length\r\n const targetLength = target[0].length\r\n for (let i = 0; i < source.length; i++) {\r\n for (let j = 0; j < source[i].length; j++) {\r\n const cohort = source[i][j]\r\n if (!cohort)\r\n continue\r\n const state = cohort.state\r\n state.moraleLoss = settings[Setting.DailyMoraleLoss] * (1 - cohort.properties[UnitAttribute.DailyLossResist])\r\n // No need to select targets for units without effect.\r\n if (i > 0 && !cohort.properties[UnitAttribute.OffensiveSupport])\r\n continue\r\n\r\n // Targets are prioritised based two things.\r\n // 1st: Is target considered primary (healthy).\r\n // 2nd: Is target directly on front.\r\n let primaryTarget: number | null = null\r\n let secondaryTarget: number | null = null\r\n if (target[0][j]) {\r\n if (target[0][j]?.isWeak)\r\n secondaryTarget = j\r\n else\r\n primaryTarget = j\r\n }\r\n // Primary target on front has the highest priority so no need to check flanks.\r\n if (primaryTarget === null) {\r\n const maneuver = Math.floor(cohort.properties[UnitAttribute.Maneuver])\r\n let direction = -1\r\n let min = Math.max(0, j - maneuver)\r\n let max = Math.min(targetLength - 1, j + maneuver)\r\n if (!settings[Setting.FixFlankTargeting] || j < sourceLength / 2) {\r\n direction = 1\r\n }\r\n for (let index = direction > 0 ? min : max; min <= index && index <= max; index += direction) {\r\n const isWeak = target[0][index]?.isWeak\r\n if (target[0][index] && (isWeak ? !secondaryTarget : !primaryTarget)) {\r\n if (isWeak)\r\n secondaryTarget = index\r\n else\r\n primaryTarget = index\r\n state.flanking = true\r\n }\r\n }\r\n }\r\n const targetIndex = primaryTarget ?? secondaryTarget\r\n if (targetIndex !== null) {\r\n state.target = target[0][targetIndex]\r\n state.targetSupport = getBackTarget(target, targetIndex)\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Calculates effectiveness of a tactic against another tactic with a given army.\r\n */\r\nexport const calculateTactic = (army: Cohorts, tactic: TacticDefinition, counterTactic?: TacticDefinition): number => {\r\n const versusDamage = counterTactic ? calculateValue(tactic, counterTactic.type) : 1.0\r\n let averageEffectiveness = 1.0\r\n if (versusDamage > 0 && tactic && army) {\r\n let totalStrength = 0\r\n let totalEffectiveness = 0.0\r\n\r\n const addEffectiveness = (cohort: Cohort) => {\r\n totalStrength += cohort[UnitAttribute.Strength]\r\n totalEffectiveness += calculateValue(tactic, cohort.properties.type) * cohort[UnitAttribute.Strength]\r\n }\r\n iterateCohorts(army, true, addEffectiveness)\r\n if (totalStrength)\r\n averageEffectiveness = totalEffectiveness / totalStrength\r\n }\r\n\r\n return versusDamage * Math.max(getConfig().TacticMin, Math.min(getConfig().TacticMax, getConfig().TacticBase + averageEffectiveness))\r\n}\r\n\r\nexport const getTacticMatch = (tactic: TacticDefinition, counterTactic?: TacticDefinition): TacticMatch => {\r\n const effectiveness = counterTactic ? calculateValue(tactic, counterTactic.type) : 1.0\r\n if (effectiveness > 0)\r\n return TacticMatch.Positive\r\n if (effectiveness < 0)\r\n return TacticMatch.Negative\r\n return TacticMatch.Neutral\r\n}\r\n\r\nconst calculateFlankRatioPenalty = (armies: Army[], cohorts: Cohorts, ratio: number, setting: Settings) => {\r\n const ratios = calculateFlankRatios(cohorts)\r\n return toObj(armies, army => army.participantIndex, army => (\r\n army.flankRatio && ratios[army.participantIndex] > army.flankRatio ? setting[Setting.InsufficientSupportPenalty] / (1 - setting[Setting.InsufficientSupportPenalty]) : 0.0)\r\n )\r\n}\r\n\r\nconst calculateFlankRatios = (cohorts: Cohorts): { [key: string]: number } => {\r\n const infantry = <{ [key: string]: number }>{}\r\n const flank = <{ [key: string]: number }>{}\r\n\r\n const addRatio = (cohort: Cohort) => {\r\n if (infantry[cohort.properties.participantIndex] === undefined)\r\n infantry[cohort.properties.participantIndex] = 0\r\n if (flank[cohort.properties.participantIndex] === undefined)\r\n flank[cohort.properties.participantIndex] = 0\r\n if (cohort.properties.role === UnitRole.Front)\r\n infantry[cohort.properties.participantIndex] += cohort[UnitAttribute.Strength]\r\n if (cohort.properties.role === UnitRole.Flank)\r\n flank[cohort.properties.participantIndex] += cohort[UnitAttribute.Strength]\r\n }\r\n iterateCohorts(cohorts, true, addRatio)\r\n return toObj(Object.keys(infantry), key => key, key => flank[key] / noZero(flank[key] + infantry[key]))\r\n}\r\n\r\n/**\r\n * Applies stored losses to units.\r\n */\r\nconst applyLosses = (frontline: Frontline) => {\r\n for (let i = 0; i < frontline.length; i++) {\r\n for (let j = 0; j < frontline[i].length; j++) {\r\n const cohort = frontline[i][j]\r\n if (!cohort)\r\n continue\r\n cohort[UnitAttribute.Morale] = Math.max(0, cohort[UnitAttribute.Morale] - cohort.state.moraleLoss)\r\n cohort[UnitAttribute.Strength] = Math.max(0, cohort[UnitAttribute.Strength] - cohort.state.strengthLoss)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Moves defeated units from a frontline to defeated.\r\n */\r\nconst moveDefeated = (environment: Environment, frontline: Frontline, defeated: Cohort[], markDefeated: boolean) => {\r\n const settings = environment.settings\r\n let cohortsAlive = false\r\n for (let i = 0; i < frontline.length; i++) {\r\n for (let j = 0; j < frontline[i].length; j++) {\r\n const cohort = frontline[i][j]\r\n if (!cohort)\r\n continue\r\n if (isAlive(cohort, environment.settings)) {\r\n cohortsAlive = true\r\n continue\r\n }\r\n if (i > 0 && !settings[Setting.BackRowRetreat]) {\r\n cohortsAlive = true\r\n continue\r\n }\r\n if (settings[Setting.DynamicTargeting])\r\n cohort.isWeak = true\r\n if (settings[Setting.RetreatRounds] > environment.round + 1) {\r\n cohortsAlive = true\r\n continue\r\n }\r\n if (cohort.state.targetedBy) {\r\n cohort.state.defeatedBy = cohort.state.targetedBy\r\n cohort.state.captureChance = multiplyChance(cohort.state.captureChance, cohort.state.targetedBy.properties[UnitAttribute.CaptureChance] - cohort.properties[UnitAttribute.CaptureResist])\r\n }\r\n defeatCohort(environment, cohort)\r\n if (!markDefeated)\r\n frontline[i][j] = null\r\n defeated.push(cohort)\r\n }\r\n }\r\n return !cohortsAlive\r\n}\r\n\r\nconst attack = (environment: Environment, source: Side, target: Side, dailyMultiplier: number, tacticStrengthDamageMultiplier: number, phase: CombatPhase) => {\r\n const { settings, terrains, attacker } = environment\r\n // Tactic bonus changes dynamically when units lose strength so it can't be precalculated.\r\n // If this is a problem a fast mode can be implemeted where to bonus is only calculated once.\r\n const armyS = getLeadingArmy(source)\r\n const armyT = getLeadingArmy(target)\r\n const generalPips = armyS && armyT ? calculateGeneralPips(armyS.general, armyT.general, phase) : 0\r\n const terrainPips = armyS && armyT ? getTerrainPips(terrains, source.type === attacker, armyS.general, armyT.general) : 0\r\n source.results.generalPips = generalPips\r\n source.results.terrainPips = terrainPips\r\n source.results.tacticStrengthDamageMultiplier = tacticStrengthDamageMultiplier\r\n source.results.tacticBonus = settings[Setting.Tactics] && armyS && armyT ? calculateTactic(source.cohorts, armyS.tactic, armyT.tactic) : 0.0\r\n const flankRatioPenalty = calculateFlankRatioPenalty(target.deployed, target.cohorts, target.flankRatio, settings)\r\n const multiplier = (1 + source.results.tacticBonus) * dailyMultiplier\r\n attackSub(source.cohorts.frontline, settings[Setting.BasePips] + source.results.dice + generalPips + terrainPips, multiplier, tacticStrengthDamageMultiplier, phase, flankRatioPenalty, settings)\r\n}\r\n\r\n/**\r\n * Calculates losses when units attack their targets.\r\n */\r\nconst attackSub = (frontline: Frontline, roll: number, dynamicMultiplier: number, strengthMultiplier: number, phase: CombatPhase, flankRatioPenalty: FlankRatioPenalty, settings: Settings) => {\r\n for (let i = 0; i < frontline.length; i++) {\r\n for (let j = 0; j < frontline[i].length; j++) {\r\n const source = frontline[i][j]\r\n if (!source)\r\n continue\r\n const target = source.state.target\r\n if (!target)\r\n continue\r\n target.state.targetedBy = source\r\n target.state.flankRatioPenalty = 1.0 + (flankRatioPenalty[target.properties.participantIndex] ?? 0.0)\r\n const multiplier = calculateDamageMultiplier(source, target, dynamicMultiplier, i > 0, phase, settings)\r\n calculateMoraleLosses(source, target, source.state.targetSupport, roll, multiplier, phase, settings)\r\n calculateStrengthLosses(source, target, source.state.targetSupport, roll, multiplier * strengthMultiplier, phase, settings)\r\n }\r\n }\r\n}\r\n\r\nconst calculateCohortDamageMultiplier = (source: Cohort, target: Cohort, isSupport: boolean, settings: Settings) => {\r\n const definitionS = source.properties\r\n const definitionT = target.properties\r\n\r\n return source[UnitAttribute.Strength]\r\n * (settings[Setting.AttributeOffenseDefense] ? 1.0 + definitionS[UnitAttribute.Offense] - definitionT[UnitAttribute.Defense] : 1.0)\r\n * (isSupport ? definitionS[UnitAttribute.OffensiveSupport] : 1.0) * target.state.flankRatioPenalty\r\n}\r\n\r\nconst calculateDamageMultiplier = (source: Cohort, target: Cohort, dynamicMultiplier: number, isSupport: boolean, phase: CombatPhase, settings: Settings) => {\r\n dynamicMultiplier *= calculateCohortDamageMultiplier(source, target, isSupport, settings)\r\n if (settings[Setting.DamageLossForMissingMorale]) {\r\n const morale = source[UnitAttribute.Morale] / source.properties.maxMorale\r\n dynamicMultiplier *= 1 + (morale - 1) * settings[Setting.DamageLossForMissingMorale]\r\n }\r\n source.state.damageMultiplier = dynamicMultiplier * source.properties.damage['Damage'][target.properties.type][phase] * target.properties.damageTakenMultiplier / settings[Setting.Precision]\r\n return dynamicMultiplier\r\n}\r\n\r\n\r\nconst calculatePips = (roll: number, maxPips: number, source: Cohort, target: Cohort, targetSupport: Cohort | null, type: UnitAttribute.Morale | UnitAttribute.Strength, phase?: CombatPhase) => {\r\n return Math.min(maxPips, Math.max(0, roll + calculateCohortPips(source.properties, target.properties, targetSupport ? targetSupport.properties : null, type, phase)))\r\n}\r\n\r\nconst calculateMoraleLosses = (source: Cohort, target: Cohort, targetSupport: Cohort | null, roll: number, dynamicMultiplier: number, phase: CombatPhase, settings: Settings) => {\r\n const pips = calculatePips(roll, settings[Setting.MaxPips], source, target, targetSupport, UnitAttribute.Morale)\r\n const morale = settings[Setting.UseMaxMorale] ? source.properties.maxMorale : source[UnitAttribute.Morale]\r\n let damage = pips * dynamicMultiplier * source.properties.damage[UnitAttribute.Morale][target.properties.type][phase] * morale * target.properties.moraleTakenMultiplier\r\n if (settings[Setting.MoraleDamageBasedOnTargetStrength])\r\n damage /= target[UnitAttribute.Strength]\r\n\r\n source.state.moraleDealt = Math.floor(damage) / settings[Setting.Precision]\r\n source.state.totalMoraleDealt += source.state.moraleDealt\r\n target.state.moraleLoss += source.state.moraleDealt\r\n // Morale damage seems to carry over only when not flanking (but this can be wrong).\r\n if (!source.state.flanking && targetSupport)\r\n targetSupport.state.moraleLoss += source.state.moraleDealt\r\n}\r\n\r\nconst calculateStrengthLosses = (source: Cohort, target: Cohort, targetSupport: Cohort | null, roll: number, dynamicMultiplier: number, phase: CombatPhase, settings: Settings) => {\r\n const pips = calculatePips(roll, settings[Setting.MaxPips], source, target, targetSupport, UnitAttribute.Strength, phase)\r\n const damage = pips * dynamicMultiplier * source.properties.damage[UnitAttribute.Strength][target.properties.type][phase] * target.properties.strengthTakenMultiplier[phase]\r\n\r\n source.state.strengthDealt = Math.floor(damage) / settings[Setting.Precision]\r\n source.state.totalStrengthDealt += source.state.strengthDealt\r\n target.state.strengthLoss += source.state.strengthDealt\r\n}\r\n","import { Setting, UnitAttribute, SideType, ResourceLosses, WinRateProgress, CasualtiesProgress, ResourceLossesProgress, Cohorts, CombatNode, Side, Environment, Frontline, Cohort, ArmyName, UnitDefinitions, UnitProperties, Reserve, Army } from 'types'\r\nimport { doCombatRound } from './combat'\r\nimport { mapRange, toObj } from 'utils'\r\nimport { getConfig } from 'data/config'\r\n\r\nexport const initResourceLosses = (): ResourceLosses => ({\r\n repairMaintenance: 0,\r\n destroyedCost: 0,\r\n capturedCost: 0,\r\n seizedCost: 0,\r\n seizedRepairMaintenance: 0,\r\n})\r\n\r\nconst getParticipantIndexToProperties = (side: Side): { [key: number]: UnitProperties } => toObj(side.armies, army => army.participantIndex, army => army.unitProperties)\r\n\r\nlet interruptSimulation = false\r\n\r\n/**\r\n * Interrupts current win rate calculation.\r\n */\r\nexport const interrupt = () => interruptSimulation = true\r\n\r\nconst createCombatNode = (environment: Environment, sideA: Side, sideB: Side, branchIndex: number = 0, combatPhase: number = 1, weightIndex: number = 1) => ({\r\n cohortsA: copyCohortState(sideA.cohorts), deployedA: copyArmiesState(sideA.deployed), armiesA: copyArmiesState(sideA.armies),\r\n cohortsB: copyCohortState(sideB.cohorts), deployedB: copyArmiesState(sideB.deployed), armiesB: copyArmiesState(sideB.armies),\r\n branchIndex, combatPhase, weightIndex, round: environment.round, day: environment.day, attacker: environment.attacker\r\n})\r\n\r\nconst updateFromCombatNode = (node: CombatNode, environment: Environment, sideA: Side, sideB: Side) => {\r\n environment.day = node.day\r\n environment.attacker = node.attacker\r\n environment.round = node.round\r\n // Most of the data is expected to change, so it's better to deep clone which allows mutations.\r\n sideA.cohorts = copyCohortState(node.cohortsA)\r\n sideA.deployed = copyArmiesState(node.deployedA)\r\n sideA.armies = copyArmiesState(node.armiesA)\r\n sideB.cohorts = copyCohortState(node.cohortsB)\r\n sideB.deployed = copyArmiesState(node.deployedB)\r\n sideB.armies = copyArmiesState(node.armiesB)\r\n}\r\n\r\n/**\r\n * Calculates win rate for the given battle.\r\n * @param simulationSettings Settings for simulation accuracy and performance.\r\n * @param progressCallback Callback to receive progress updates.\r\n * @param definitions Unit definitions.\r\n * @param sideA Attacker information.\r\n * @param sideB Defender information.\r\n * @param terrains Current terrains.\r\n */\r\nexport const calculateWinRate = (progressCallback: (progress: WinRateProgress, casualties: CasualtiesProgress, losses: ResourceLossesProgress) => void, environment: Environment, sideA: Side, sideB: Side) => {\r\n const progress: WinRateProgress = {\r\n calculating: true,\r\n attacker: 0.0,\r\n defender: 0.0,\r\n incomplete: 0.0,\r\n draws: 0.0,\r\n progress: 0.0,\r\n battles: 0,\r\n averageDays: 0,\r\n stackWipes: 0,\r\n days: {}\r\n }\r\n interruptSimulation = false\r\n const settings = environment.settings\r\n\r\n const lossesA = initResourceLosses()\r\n const lossesB = initResourceLosses()\r\n const resourceLosses: ResourceLossesProgress = { lossesA, lossesB }\r\n const unitPropertiesA = getParticipantIndexToProperties(sideA)\r\n const unitPropertiesB = getParticipantIndexToProperties(sideB)\r\n\r\n //// Performance is critical. Precalculate as many things as possible.\r\n const rolls = getRolls(settings[Setting.DiceMinimum], settings[Setting.DiceMaximum], settings[Setting.ReduceRolls])\r\n const dice2 = rolls.length\r\n const phasesPerRoll = Math.floor(settings[Setting.PhasesPerRoll])\r\n const chunkSize = settings[Setting.ChunkSize]\r\n const maxPhase = settings[Setting.MaxPhases]\r\n const weights = mapRange(maxPhase + 1, value => 1.0 / Math.pow(dice2, value))\r\n\r\n\r\n // Simulation is always done from the beginning.\r\n environment.day = 0\r\n environment.round = -1\r\n // Initial deployment is shared for each iteration.\r\n doCombatRound(environment, sideA, sideB, false)\r\n const totalA: State = { morale: 0, strength: 0 }\r\n const currentA: State = { morale: 0, strength: 0 }\r\n sumState(totalA, sideA)\r\n const totalB: State = { morale: 0, strength: 0 }\r\n const currentB: State = { morale: 0, strength: 0 }\r\n sumState(totalB, sideB)\r\n const casualties: CasualtiesProgress = {\r\n avgMoraleA: 0,\r\n avgMoraleB: 0,\r\n avgStrengthA: 0,\r\n avgStrengthB: 0,\r\n maxMoraleA: totalA.morale,\r\n maxMoraleB: totalB.morale,\r\n maxStrengthA: totalA.strength,\r\n maxStrengthB: totalB.strength,\r\n moraleA: {},\r\n moraleB: {},\r\n strengthA: {},\r\n strengthB: {},\r\n winRateA: 0,\r\n winRateB: 0\r\n }\r\n\r\n // Overview of the algorithm:\r\n // Initial state is the first node.\r\n // Nodes have a branch for each possible dice roll.\r\n // A branch is terminated if the battle ends before the next dice roll.\r\n // Otherwise end of the phase is added as a node, and set as the new starting point.\r\n // A node is removed when all its branches are terminated.\r\n // The previous node is set as the new starting point.\r\n // Nodes keep a track of the next branch so they know where to continue.\r\n // Nodes know their depth which determines their weight for win rate.\r\n\r\n // Nodes also cache state of units, only store what is absolutely necessary.\r\n const nodes: CombatNode[] = [createCombatNode(environment, sideA, sideB)]\r\n\r\n progressCallback(progress, casualties, resourceLosses)\r\n\r\n const work = () => {\r\n for (let i = 0; (i < chunkSize) && nodes.length && !interruptSimulation; i++) {\r\n progress.battles = progress.battles + 1\r\n const node = nodes[nodes.length - 1]\r\n updateFromCombatNode(node, environment, sideA, sideB)\r\n const [rollA, rollB] = rolls[node.branchIndex]\r\n sideA.results.dice = rollA\r\n sideB.results.dice = rollB\r\n let winner = doPhase(environment, sideA, sideB)\r\n\r\n let combatPhase = node.combatPhase\r\n let branchIndex = node.branchIndex\r\n let weightIndex = node.weightIndex\r\n\r\n node.branchIndex++\r\n if (node.branchIndex === dice2)\r\n nodes.pop()\r\n while (winner === undefined && combatPhase < maxPhase) {\r\n let doBranch = true\r\n if (combatPhase % phasesPerRoll === 1) {\r\n doBranch = false\r\n }\r\n combatPhase++\r\n // Current node will be still used so the cache must be deep cloned. \r\n // Branch starts at 1 because the current execution is 0.\r\n if (doBranch && dice2 > 1) {\r\n branchIndex = 0\r\n weightIndex++\r\n nodes.push(createCombatNode(environment, sideA, sideB, 1, combatPhase, weightIndex))\r\n }\r\n const [rollA, rollB] = rolls[branchIndex]\r\n sideA.results.dice = rollA\r\n sideB.results.dice = rollB\r\n winner = doPhase(environment, sideA, sideB)\r\n }\r\n sumState(currentA, sideA)\r\n sumState(currentB, sideB)\r\n if (settings[Setting.CalculateCasualties])\r\n updateCasualties(casualties, weights[weightIndex], totalA, totalB, currentA, currentB)\r\n if (settings[Setting.CalculateResourceLosses]) {\r\n calculateResourceLoss(sideA.cohorts, weights[weightIndex], lossesA, lossesB, unitPropertiesB)\r\n calculateResourceLoss(sideB.cohorts, weights[weightIndex], lossesB, lossesA, unitPropertiesA)\r\n }\r\n updateProgress(progress, weights[weightIndex], winner, environment, settings[Setting.Stackwipe] && (currentA.strength === 0 || currentB.strength === 0))\r\n }\r\n if (!nodes.length) {\r\n progress.calculating = false\r\n progress.progress = 1\r\n }\r\n if (interruptSimulation)\r\n progress.calculating = false\r\n progressCallback(progress, casualties, resourceLosses)\r\n if (nodes.length && !interruptSimulation)\r\n worker()\r\n }\r\n\r\n const worker = () => setTimeout(work, 0)\r\n worker()\r\n}\r\n\r\n/** Returns an array of valid dice numbers. */\r\nconst getValidRolls = (minimum: number, maximum: number, halveTimes: number) => {\r\n let validRolls = mapRange(maximum - minimum + 1, value => value + minimum)\r\n for (let i = 0; i < halveTimes; i++) {\r\n const length = validRolls.length\r\n if (length % 2)\r\n validRolls = validRolls.filter((_, index) => index % 2 === 0)\r\n else\r\n validRolls = validRolls.filter((_, index) => index < length / 2 ? index % 2 === 0 : (length - index) % 2 === 1)\r\n }\r\n return validRolls\r\n}\r\n\r\n/**\r\n * Returns a balanced set of rolls. Higher rolls are prioritized to give results faster.\r\n */\r\nconst getRolls = (minimum: number, maximum: number, halveTimes: number) => {\r\n let validRolls = getValidRolls(minimum, maximum, halveTimes)\r\n const rolls: number[][] = []\r\n for (let roll = maximum; roll >= minimum; roll--) {\r\n if (!validRolls.includes(roll))\r\n continue\r\n rolls.push([roll, roll])\r\n for (let roll2 = roll - 1; roll2 >= minimum; roll2--) {\r\n if (!validRolls.includes(roll2))\r\n continue\r\n rolls.push([roll2, roll])\r\n rolls.push([roll, roll2])\r\n }\r\n }\r\n return rolls\r\n}\r\n\r\n/**\r\n * Custom clone function to only copy state and keep references to constant data same.\r\n */\r\nconst copyCohortState = (cohorts: Cohorts): Cohorts => ({\r\n frontline: cohorts.frontline.map(row => row.map(value => value ? { ...value } : null)),\r\n reserve: copyReserveState(cohorts.reserve),\r\n defeated: cohorts.defeated.map(value => ({ ...value })),\r\n retreated: cohorts.retreated.map(value => ({ ...value }))\r\n})\r\nconst copyReserveState = (reserve: Reserve): Reserve => ({\r\n front: reserve.front.map(value => ({ ...value })),\r\n flank: reserve.flank.map(value => ({ ...value })),\r\n support: reserve.support.map(value => ({ ...value }))\r\n})\r\nconst copyArmiesState = (armies: Army[]): Army[] => armies.map(army => ({ ...army, reserve: copyReserveState(army.reserve) }))\r\n\r\nconst calculateCaptureLoss = (cohort: Cohort, weight: number, own: ResourceLosses, enemy: ResourceLosses, enemyDefinitions: { [key: number]: UnitProperties }) => {\r\n const enemyIndex = cohort.state.defeatedBy?.properties.participantIndex ?? cohort.state.stackWipedBy?.participantIndex\r\n if (enemyIndex === undefined) {\r\n throw 'Defeated should always get defeated by something.'\r\n }\r\n const cohortCost = weight * cohort.properties[UnitAttribute.Cost]\r\n if (cohort.state.isDestroyed) {\r\n own.destroyedCost += cohortCost\r\n return\r\n }\r\n const capture = (cohort.state.captureChance ?? 0.0)\r\n const repair = (cohort.properties.maxStrength - cohort[UnitAttribute.Strength]) * cohort.properties[UnitAttribute.Maintenance] * cohortCost / getConfig().ShipRepair\r\n if (capture <= 0.0) {\r\n own.repairMaintenance += repair\r\n return\r\n }\r\n // If captured then the unit doesn't have to be repaired.\r\n own.repairMaintenance += (1 - capture) * repair\r\n // If captured then the full cost of unit is lost.\r\n own.capturedCost += capture * cohortCost\r\n const enemyProperties = enemyDefinitions[enemyIndex][cohort.properties.type]\r\n const enemyUnitCost = weight * (cohort.properties[UnitAttribute.Cost] - cohort.properties[UnitAttribute.Cost] + enemyProperties[UnitAttribute.Cost])\r\n const enemyRepairCost = (cohort.properties.maxStrength - cohort[UnitAttribute.Strength]) * (cohort.properties[UnitAttribute.Maintenance] - cohort.properties[UnitAttribute.Maintenance] + enemyProperties[UnitAttribute.Maintenance]) * enemyUnitCost / getConfig().ShipRepair\r\n // If captured then the enemy gainst full cost of the unit.\r\n enemy.seizedCost -= capture * enemyUnitCost\r\n // But enemy also has to repair the unit.\r\n enemy.seizedRepairMaintenance += capture * enemyRepairCost\r\n}\r\n\r\n/**\r\n * Calculates repair and other resource losses.\r\n */\r\nconst calculateResourceLoss = (cohorts: Cohorts, weight: number, own: ResourceLosses, enemy: ResourceLosses, enemyDefinitions: { [key: number]: UnitProperties }) => {\r\n const { frontline, defeated, retreated } = cohorts\r\n for (let i = 0; i < frontline.length; i++) {\r\n for (let j = 0; j < frontline[i].length; j++) {\r\n const cohort = frontline[i][j]\r\n if (!cohort)\r\n continue\r\n own.repairMaintenance += weight * (cohort.properties.maxStrength - cohort[UnitAttribute.Strength]) * cohort.properties[UnitAttribute.Maintenance] * cohort.properties[UnitAttribute.Cost] / getConfig().ShipRepair\r\n }\r\n }\r\n for (let i = 0; i < defeated.length; i++) {\r\n const cohort = defeated[i]\r\n calculateCaptureLoss(cohort, weight, own, enemy, enemyDefinitions)\r\n }\r\n for (let i = 0; i < retreated.length; i++) {\r\n const cohort = retreated[i]\r\n calculateCaptureLoss(cohort, weight, own, enemy, enemyDefinitions)\r\n }\r\n}\r\n\r\ntype Winner = SideType | null | undefined\r\n\r\n/**\r\n * Simulates one dice roll phase.\r\n */\r\nconst doPhase = (environment: Environment, sideA: Side, sideB: Side) => {\r\n const phaseLength = environment.settings[Setting.PhaseLength]\r\n // This is only called when combat is happening.\r\n sideA.armiesRemaining = true\r\n sideA.isDefeated = false\r\n sideB.armiesRemaining = true\r\n sideB.isDefeated = false\r\n for (let i = 0; i < phaseLength; i++) {\r\n environment.day++\r\n doCombatRound(environment, sideA, sideB, false)\r\n if (sideA.isDefeated || sideB.isDefeated)\r\n break\r\n }\r\n if (environment.round === -1 && sideA.armiesRemaining && sideB.armiesRemaining)\r\n skipUntilNextCombatDay(environment, sideA, sideB)\r\n return getWinner(sideA, sideB)\r\n}\r\n\r\nconst getWinner = (sideA: Side, sideB: Side) => {\r\n let winner: Winner = undefined\r\n if (!sideA.armiesRemaining && !sideB.armiesRemaining)\r\n winner = null\r\n else if (!sideA.armiesRemaining)\r\n winner = SideType.B\r\n else if (!sideB.armiesRemaining)\r\n winner = SideType.A\r\n return winner\r\n}\r\n\r\nconst skipUntilNextCombatDay = (environment: Environment, sideA: Side, sideB: Side) => {\r\n while (environment.round === -1 && environment.day < 10000) {\r\n environment.day++\r\n doCombatRound(environment, sideA, sideB, false)\r\n }\r\n}\r\n\r\ntype State = {\r\n morale: number\r\n strength: number\r\n}\r\n\r\nconst sumReserve = (state: State, reserve: Reserve) => {\r\n for (let i = 0; i < reserve.front.length; i++) {\r\n const cohort = reserve.front[i]\r\n state.strength += cohort[UnitAttribute.Strength]\r\n state.morale += cohort[UnitAttribute.Morale]\r\n }\r\n for (let i = 0; i < reserve.flank.length; i++) {\r\n const cohort = reserve.flank[i]\r\n state.strength += cohort[UnitAttribute.Strength]\r\n state.morale += cohort[UnitAttribute.Morale]\r\n }\r\n for (let i = 0; i < reserve.support.length; i++) {\r\n const cohort = reserve.support[i]\r\n state.strength += cohort[UnitAttribute.Strength]\r\n state.morale += cohort[UnitAttribute.Morale]\r\n }\r\n}\r\n\r\nconst sumCohorts = (state: State, cohorts: Cohorts) => {\r\n for (let i = 0; i < cohorts.frontline.length; i++) {\r\n for (let j = 0; j < cohorts.frontline[i].length; j++) {\r\n const cohort = cohorts.frontline[i][j]\r\n if (!cohort)\r\n continue\r\n state.strength += cohort[UnitAttribute.Strength]\r\n state.morale += cohort[UnitAttribute.Morale]\r\n }\r\n }\r\n sumReserve(state, cohorts.reserve)\r\n for (let i = 0; i < cohorts.defeated.length; i++) {\r\n const cohort = cohorts.defeated[i]\r\n state.strength += cohort[UnitAttribute.Strength]\r\n state.morale += cohort[UnitAttribute.Morale]\r\n }\r\n for (let i = 0; i < cohorts.retreated.length; i++) {\r\n const cohort = cohorts.retreated[i]\r\n state.strength += cohort[UnitAttribute.Strength]\r\n state.morale += cohort[UnitAttribute.Morale]\r\n }\r\n}\r\n\r\n/**\r\n * Counts total morale and strength of units.\r\n */\r\nconst sumState = (state: State, side: Side) => {\r\n state.strength = 0\r\n state.morale = 0\r\n sumCohorts(state, side.cohorts)\r\n side.deployed.forEach(army => sumReserve(state, army.reserve))\r\n side.armies.forEach(army => sumReserve(state, army.reserve))\r\n}\r\n\r\n/**\r\n * Updates progress of the calculation.\r\n */\r\nconst updateProgress = (progress: WinRateProgress, weight: number, winner: Winner, environment: Environment, stackWipe: boolean) => {\r\n progress.progress += weight\r\n if (winner === SideType.A)\r\n progress.attacker += weight\r\n else if (winner === SideType.B)\r\n progress.defender += weight\r\n else if (winner === null)\r\n progress.draws += weight\r\n else\r\n progress.incomplete += weight\r\n if (stackWipe)\r\n progress.stackWipes += weight\r\n // Environment tracks start day of the current round. +1 for the end day.\r\n const days = environment.day + 1\r\n progress.averageDays += weight * days\r\n progress.days[days] = (progress.days[days] || 0) + weight\r\n}\r\n\r\n/**\r\n * Updates casualties of the calculation.\r\n */\r\nconst updateCasualties = (casualties: CasualtiesProgress, amount: number, totalA: State, totalB: State, currentA: State, currentB: State) => {\r\n const lossA = totalA.strength - currentA.strength\r\n const lossB = totalB.strength - currentB.strength\r\n casualties.avgMoraleA += (totalA.morale - currentA.morale) * amount\r\n casualties.avgMoraleB += (totalB.morale - currentB.morale) * amount\r\n casualties.avgStrengthA += lossA * amount\r\n casualties.avgStrengthB += lossB * amount\r\n if (lossA < lossB)\r\n casualties.winRateA += amount\r\n if (lossA > lossB)\r\n casualties.winRateB += amount\r\n\r\n const moraleA = (Math.max(0, currentA.morale)).toFixed(1)\r\n const moraleB = (Math.max(0, currentB.morale)).toFixed(1)\r\n const strengthA = (Math.max(0, currentA.strength)).toFixed(2)\r\n const strengthB = (Math.max(0, currentB.strength)).toFixed(2)\r\n casualties.moraleA[moraleA] = (casualties.moraleA[moraleA] || 0) + amount\r\n casualties.moraleB[moraleB] = (casualties.moraleB[moraleB] || 0) + amount\r\n casualties.strengthA[strengthA] = (casualties.strengthA[strengthA] || 0) + amount\r\n casualties.strengthB[strengthB] = (casualties.strengthB[strengthB] || 0) + amount\r\n}","import { Side, Setting, Cohorts, Cohort, Environment, UnitAttribute, SideType } from 'types'\r\nimport { calculateTotalStrength } from 'combat'\r\nimport { uncaptureCohort, wipeCohort } from './combat_utils'\r\nimport { getLeadingArmy } from 'managers/battle'\r\nimport { getRootParent } from 'managers/units'\r\n\r\nexport const checkStackWipe = (environment: Environment, side: Side, enemy: Side) => {\r\n if (!environment.settings[Setting.Stackwipe])\r\n return false\r\n if (environment.round > 0 && !side.isDefeated)\r\n return false\r\n const settings = environment.settings\r\n const noDeploy = environment.round === 0 && side.isDefeated\r\n const soft = 0 < environment.round && environment.round < settings[Setting.StackwipeRounds]\r\n const total = calculateTotalStrength(side.cohorts, true)\r\n const totalEnemy = calculateTotalStrength(enemy.cohorts, true)\r\n const wipe = (noDeploy || !total || totalEnemy / total > (soft ? settings[Setting.SoftStackWipeLimit] : settings[Setting.HardStackWipeLimit]))\r\n if (wipe)\r\n stackWipe(environment, side, enemy)\r\n return wipe\r\n}\r\n\r\nconst wasDefeatedDuringCurrentBattle = (environment: Environment, cohort: Cohort) => cohort.state.defeatedDay >= environment.day - environment.round\r\n\r\nexport const stackWipe = (environment: Environment, side: Side, enemy: Side) => {\r\n side.isDefeated = true\r\n const { frontline, reserve, defeated } = side.cohorts\r\n const enemyArmy = getLeadingArmy(enemy)\r\n returnCapturedCohorts(environment, enemy.cohorts)\r\n const captureChance = enemyArmy ? environment.settings[Setting.StackWipeCaptureChance] + enemyArmy.unitProperties[getRootParent(environment.mode)][UnitAttribute.CaptureChance] : 0\r\n\r\n for (let i = 0; i < defeated.length; i++) {\r\n if (wasDefeatedDuringCurrentBattle(environment, defeated[i])) {\r\n wipeCohort(environment, defeated[i], enemyArmy, captureChance)\r\n }\r\n }\r\n\r\n const removeFromReserve = (part: Cohort[]) => {\r\n for (let i = 0; i < part.length; i++) {\r\n const cohort = part[i]\r\n defeated.push(cohort)\r\n wipeCohort(environment, cohort, enemyArmy, captureChance)\r\n }\r\n part.length = 0\r\n }\r\n\r\n for (let i = 0; i < frontline.length; i++) {\r\n for (let j = 0; j < frontline[i].length; j++) {\r\n const cohort = frontline[i][j]\r\n if (!cohort)\r\n continue\r\n // Already defeated is a proxy for UI purposes, just clean it up.\r\n if (!cohort.state.isDefeated) {\r\n defeated.push(cohort)\r\n frontline[i][j] = null\r\n }\r\n wipeCohort(environment, cohort, enemyArmy, captureChance)\r\n }\r\n }\r\n removeFromReserve(reserve.front)\r\n removeFromReserve(reserve.flank)\r\n removeFromReserve(reserve.support)\r\n}\r\n\r\n/**\r\n * Sets capture chance to 0 which \"returns\" captured cohorts since they can never get captured.\r\n * If capturing can happen outside analyze then this needs to work bit differently.\r\n */\r\nconst returnCapturedCohorts = (environment: Environment, cohorts: Cohorts) => {\r\n const { frontline, reserve, defeated } = cohorts\r\n for (let i = 0; i < defeated.length; i++) {\r\n if (wasDefeatedDuringCurrentBattle(environment, defeated[i])) {\r\n uncaptureCohort(defeated[i])\r\n }\r\n }\r\n\r\n const removeFromReserve = (part: Cohort[]) => {\r\n for (let i = 0; i < part.length; i++) {\r\n const cohort = part[i]\r\n defeated.push(cohort)\r\n uncaptureCohort(cohort)\r\n }\r\n part.length = 0\r\n }\r\n\r\n for (let i = 0; i < frontline.length; i++) {\r\n for (let j = 0; j < frontline[i].length; j++) {\r\n const cohort = frontline[i][j]\r\n if (!cohort)\r\n continue\r\n uncaptureCohort(cohort)\r\n }\r\n }\r\n removeFromReserve(reserve.front)\r\n removeFromReserve(reserve.flank)\r\n removeFromReserve(reserve.support)\r\n}\r\n","import { Battle, TerrainType, SideType, CountryName, Terrain, Settings, Setting, Army, UnitType, ArmyName, SideData, Side, ArmyDefinition, GeneralAttribute, Participant, CombatPhase } from 'types'\r\nimport { getCombatUnit, sortReserve } from 'combat'\r\nimport { map } from 'utils'\r\n\r\nexport const selectTerrain = (battle: Battle, index: number, terrain: TerrainType) => {\r\n battle.terrains[index] = terrain\r\n}\r\n\r\nexport const setSeed = (battle: Battle, seed: number) => {\r\n battle.customSeed = seed || undefined\r\n battle.seed = seed\r\n}\r\nexport const toggleRandomDice = (battle: Battle, sideType: SideType) => {\r\n const side = battle.sides[sideType]\r\n side.randomizeDice = !side.randomizeDice\r\n}\r\n\r\nexport const setDice = (battle: Battle, sideType: SideType, dice: number) => {\r\n battle.sides[sideType].dice = dice\r\n}\r\n\r\nexport const setDaysUntilBattle = (battle: Battle, sideType: SideType, index: number, daysUntilBattle: number) => {\r\n battle.sides[sideType].participants[index].daysUntilBattle = daysUntilBattle\r\n}\r\n\r\nexport const setPhaseDice = (battle: Battle, sideType: SideType, phase: number, dice: number) => {\r\n const rolls = battle.sides[sideType].rolls\r\n while (rolls.length - 1 < phase)\r\n rolls.push(0)\r\n rolls[phase] = dice\r\n}\r\n\r\nexport const addParticipant = (battle: Battle, sideType: SideType, countryName: CountryName, armyName: ArmyName) => {\r\n battle.sides[sideType].participants.push({\r\n armyName,\r\n countryName,\r\n daysUntilBattle: 0\r\n })\r\n}\r\n\r\nexport const deleteParticipant = (battle: Battle, sideType: SideType, index: number) => {\r\n battle.sides[sideType].participants.splice(index, 1)\r\n}\r\n\r\nexport const selectParticipantCountry = (battle: Battle, sideType: SideType, index: number, countryName: CountryName, armyName: ArmyName) => {\r\n battle.sides[sideType].participants[index].countryName = countryName\r\n battle.sides[sideType].participants[index].armyName = armyName\r\n}\r\n\r\nexport const selectParticipantArmy = (battle: Battle, sideType: SideType, index: number, armyName: ArmyName) => {\r\n battle.sides[sideType].participants[index].armyName = armyName\r\n}\r\n\r\nconst getRow = (width: number) => Array(width).fill(null)\r\n\r\nexport const getDefaultCombatResults = () => ({\r\n dailyMultiplier: 0,\r\n dice: 0,\r\n generalPips: 0,\r\n round: 0,\r\n tacticBonus: 0,\r\n terrainPips: 0,\r\n tacticStrengthDamageMultiplier: 0\r\n})\r\n\r\nexport const convertSide = (side: SideData, armies: Army[], settings: Settings): Side => {\r\n const width = settings[Setting.CombatWidth]\r\n return {\r\n armiesRemaining: true,\r\n isDefeated: false,\r\n cohorts: {\r\n frontline: settings[Setting.BackRow] ? [getRow(width), getRow(width)] : [getRow(width)],\r\n defeated: [],\r\n reserve: {\r\n front: [],\r\n flank: [],\r\n support: []\r\n },\r\n retreated: []\r\n },\r\n flankRatio: 0,\r\n armies,\r\n deployed: [],\r\n type: side.type,\r\n results: getDefaultCombatResults()\r\n }\r\n}\r\n\r\nexport const convertArmy = (participantIndex: number, participant: Participant, army: ArmyDefinition, enemyTypes: UnitType[], terrains: Terrain[], settings: Settings): Army => {\r\n const reserve = army.reserve.map((cohort, index) => getCombatUnit(participant.countryName, participant.armyName, participantIndex, index, settings, terrains, enemyTypes, cohort))\r\n const unitProperties = map(army.unitDefinitions, unit => getCombatUnit(participant.countryName, participant.armyName, participantIndex, -1, settings, terrains, enemyTypes, unit).properties)\r\n const sorted = sortReserve(reserve, army.unitPreferences)\r\n return {\r\n reserve: sorted,\r\n flankRatio: army.flankRatio,\r\n unitProperties,\r\n flankSize: army.flankSize,\r\n arrival: participant.daysUntilBattle,\r\n leftFlank: army.flankSize,\r\n rightFlank: army.flankSize,\r\n priority: army.general.values[GeneralAttribute.Martial] + army.general.values[CombatPhase.Fire] + army.general.values[CombatPhase.Shock],\r\n tactic: army.general.tactic,\r\n unitPreferences: army.unitPreferences,\r\n general: army.general.values,\r\n participantIndex\r\n }\r\n}\r\n\r\nexport const getLeadingArmy = (side: Side): Army | null => side.deployed.length ? side.deployed[0] : null\r\n\r\nexport const getParticipantName = (participant: Participant) => participant.countryName + ': ' + participant.armyName\r\nexport const getDay = (battle: Battle) => battle.days.length - 1\r\nexport const getStartingPhaseNumber = (battle: Battle) => battle.days.length ? battle.days[battle.days.length - 1].startingPhaseNumber : 0\r\nexport const getRound = (battle: Battle) => battle.days.length ? battle.days[battle.days.length - 1].round : -1\r\nexport const getAttacker = (battle: Battle) => battle.days.length ? battle.days[battle.days.length - 1].attacker : SideType.A","\r\nimport * as manager from 'managers/battle'\r\nimport { ModeState, Battle } from 'types'\r\nimport { getDefaultBattle } from 'data'\r\nimport { ActionToFunction, makeActionRemoveFirst, Action, ReducerParams, makeReducer } from './utils'\r\n\r\nconst mapping: ActionToFunction = {}\r\n\r\nexport const selectParticipantCountry = makeActionRemoveFirst(manager.selectParticipantCountry, mapping)\r\nexport const selectParticipantArmy = makeActionRemoveFirst(manager.selectParticipantArmy, mapping)\r\nexport const addParticipant = makeActionRemoveFirst(manager.addParticipant, mapping)\r\nexport const deleteParticipant = makeActionRemoveFirst(manager.deleteParticipant, mapping)\r\nexport const selectTerrain = makeActionRemoveFirst(manager.selectTerrain, mapping)\r\nexport const setDice = makeActionRemoveFirst(manager.setDice, mapping)\r\nexport const setDaysUntilBattle = makeActionRemoveFirst(manager.setDaysUntilBattle, mapping)\r\nexport const setPhaseDice = makeActionRemoveFirst(manager.setPhaseDice, mapping)\r\nexport const toggleRandomDice = makeActionRemoveFirst(manager.toggleRandomDice, mapping)\r\nexport const setSeed = makeActionRemoveFirst(manager.setSeed, mapping)\r\n\r\nconst getEntity = (draft: ModeState, _: Action, params: ReducerParams) => draft[params.mode]\r\n\r\nexport const battleReducer = makeReducer(getDefaultBattle(), mapping, getEntity)\r\n","import { AppState, getMode, getCombatSide, getCombatEnvironment, convertSides } from 'state'\r\nimport { doCombatRound, removeDefeated, getCombatPhaseNumber } from 'combat'\r\nimport { Battle, SideType, Setting, Cohorts, SideData, Side, Environment, Army, Reserve } from 'types'\r\nimport { createEntropy, MersenneTwister19937, Random } from 'random-js'\r\nimport { forEach } from 'utils'\r\nimport { getDay, getStartingPhaseNumber, getRound } from './battle'\r\n\r\nconst copyCohorts = (cohorts: Cohorts): Cohorts => ({\r\n frontline: cohorts.frontline.map(row => row.map(value => value ? { ...value, state: { ...value.state } } : null)),\r\n reserve: copyReserve(cohorts.reserve),\r\n defeated: cohorts.defeated.map(value => ({ ...value, state: { ...value.state } })),\r\n retreated: cohorts.retreated.map(value => ({ ...value, state: { ...value.state } }))\r\n})\r\n\r\nconst copyReserve = (reserve: Reserve): Reserve => ({\r\n front: reserve.front.map(value => ({ ...value, state: { ...value.state } })),\r\n flank: reserve.flank.map(value => ({ ...value, state: { ...value.state } })),\r\n support: reserve.support.map(value => ({ ...value, state: { ...value.state } }))\r\n})\r\nconst copyArmies = (armies: Army[]): Army[] => (\r\n armies.map(army => ({ ...army, reserve: copyReserve(army.reserve) }))\r\n)\r\n\r\nconst freeseSize = (side: Side) => {\r\n Object.freeze(side.armies)\r\n Object.freeze(side.cohorts)\r\n Object.freeze(side.deployed)\r\n}\r\n\r\n// Copy is needed because of freezing stuff.\r\n// And freezing is needed because of some immer issue. \r\nconst copy = (side: Side): Side => ({ ...side, deployed: copyArmies(side.deployed), cohorts: copyCohorts(side.cohorts), armies: copyArmies(side.armies), results: { ...side.results } })\r\n\r\nconst subBattle = (battle: Battle, env: Environment, attacker: Side, defender: Side, steps: number) => {\r\n const sideA = battle.sides[SideType.A]\r\n const sideD = battle.sides[SideType.B]\r\n const settings = env.settings\r\n const round = getRound(battle)\r\n const day = getDay(battle)\r\n const phaseNumber = getStartingPhaseNumber(battle) + getCombatPhaseNumber(getRound(battle), settings)\r\n\r\n battle.outdated = false\r\n battle.timestamp = new Date().getMilliseconds()\r\n const minimumRoll = settings[Setting.DiceMinimum]\r\n const maximumRoll = settings[Setting.DiceMaximum]\r\n const rollFrequency = settings[Setting.PhaseLength]\r\n // Regenerate seed for the first roll (undo resets it when going back to deployment).\r\n if (day + steps > 0 && !battle.seed)\r\n battle.seed = battle.customSeed ?? Math.abs(createEntropy(undefined, 1)[0])\r\n const engine = MersenneTwister19937.seed(battle.seed)\r\n engine.discard(2 * phaseNumber)\r\n const rng = new Random(engine)\r\n\r\n\r\n const rollDice = (side: SideData) => {\r\n if (getRound(battle) % rollFrequency !== 0)\r\n return null\r\n // Always throw dice so that manually setting one side won't affect the other.\r\n const random = rng.integer(minimumRoll, maximumRoll)\r\n const phase = getStartingPhaseNumber(battle) + getCombatPhaseNumber(getRound(battle), settings)\r\n if (side.randomizeDice)\r\n return random\r\n else if (phase < side.rolls.length && side.rolls[phase])\r\n return side.rolls[phase]\r\n else\r\n return side.dice\r\n }\r\n \r\n if (day === -1) {\r\n attacker = copy(attacker)\r\n defender = copy(defender)\r\n env.day = 0\r\n env.round = round\r\n doCombatRound(env, attacker, defender, true)\r\n battle.fightOver = !attacker.armiesRemaining || !defender.armiesRemaining\r\n freeseSize(attacker)\r\n freeseSize(defender)\r\n sideA.days = [attacker]\r\n sideD.days = [defender]\r\n battle.days.push({ round: env.round, startingPhaseNumber: 0, attacker: env.attacker })\r\n }\r\n\r\n for (let step = 0; step < steps && !battle.fightOver; ++step) {\r\n attacker = copy(attacker)\r\n defender = copy(defender)\r\n attacker.results.dice = rollDice(sideA) ?? attacker.results.dice\r\n defender.results.dice = rollDice(sideD) ?? defender.results.dice\r\n env.day = getDay(battle) + 1\r\n env.round = getRound(battle)\r\n doCombatRound(env, attacker, defender, true)\r\n\r\n battle.fightOver = !attacker.armiesRemaining || !defender.armiesRemaining\r\n if (battle.fightOver) {\r\n removeDefeated(attacker.cohorts.frontline)\r\n removeDefeated(defender.cohorts.frontline)\r\n }\r\n let startingPhaseNumber = getStartingPhaseNumber(battle)\r\n if (env.round === -1) {\r\n startingPhaseNumber += getCombatPhaseNumber(getRound(battle), settings)\r\n }\r\n\r\n freeseSize(attacker)\r\n freeseSize(defender)\r\n sideA.days.push(attacker)\r\n sideD.days.push(defender)\r\n battle.days.push({ round: env.round, startingPhaseNumber, attacker: env.attacker })\r\n }\r\n}\r\n\r\nexport const battle = (pair: [AppState, AppState], steps: number) => {\r\n const [state, draft] = pair\r\n const mode = getMode(state)\r\n const battle = draft.battle[mode]\r\n subBattle(battle, getCombatEnvironment(state), getCombatSide(state, SideType.A), getCombatSide(state, SideType.B), steps)\r\n}\r\n\r\nexport const refreshBattle = (pair: [AppState, AppState]) => {\r\n const [state, draft] = pair\r\n const mode = getMode(state)\r\n const battle = draft.battle[mode]\r\n const steps = getDay(battle)\r\n battle.days = []\r\n const [attacker, defender] = convertSides(state)\r\n subBattle(battle, getCombatEnvironment(draft), attacker, defender, steps)\r\n}\r\n\r\nexport const undo = (pair: [AppState, AppState], steps: number) => {\r\n const [state, draft] = pair\r\n const mode = getMode(state)\r\n const battle = draft.battle[mode]\r\n for (let step = 0; step < steps && battle.days.length > 1; ++step) {\r\n let seed: number = battle.seed\r\n if (getDay(battle) < 2)\r\n seed = battle.customSeed ? battle.customSeed : 0\r\n forEach(battle.sides, side => {\r\n side.days.pop()\r\n })\r\n battle.days.pop()\r\n battle.seed = seed\r\n battle.fightOver = false\r\n battle.timestamp = new Date().getMilliseconds()\r\n }\r\n}\r\n","import * as manager from 'managers/combat'\r\nimport { ActionToFunction, makeActionRemoveFirst, makeReducer } from './utils'\r\nimport { AppState } from 'state'\r\n\r\nconst mapping: ActionToFunction<[AppState, AppState]> = {}\r\n\r\nexport const battle = makeActionRemoveFirst(manager.battle, mapping)\r\nexport const refreshBattle = makeActionRemoveFirst(manager.refreshBattle, mapping)\r\nexport const undo = makeActionRemoveFirst(manager.undo, mapping)\r\n\r\nconst getState = (draft: AppState, _2: any, _3: any, state: AppState) => [state, draft]\r\n\r\nexport const combatReducer = makeReducer({} as AppState, mapping, getState as any)\r\n","import { Countries, CountryName, CountryDefinition, GovermentType, CultureType, CountryAttribute, ValuesType, WearinessAttribute, Country, isAttributeEnabled, ModifierWithKey, SiteSettings, ModifierType, SelectionType, Selections, ArmyName, Mode } from 'types'\r\nimport { getDefaultUnits, getDefaultArmies, getDefaultCountry } from 'data'\r\nimport { addValuesWithMutate, clearAllValuesWithMutate, calculateValue, addValue } from 'definition_values'\r\nimport { toObj, values, filter } from 'utils'\r\n\r\nexport const createCountry = (countries: Countries, country: CountryName, source?: CountryName) => {\r\n countries[country] = source ? countries[source] : getDefaultCountry()\r\n}\r\n\r\nexport const deleteCountry = (countries: Countries, country: CountryName) => {\r\n delete countries[country]\r\n}\r\n\r\nexport const changeCountryName = (countries: Countries, oldCountry: CountryName, country: CountryName) => {\r\n delete Object.assign(countries, { [country]: countries[oldCountry] })[oldCountry]\r\n}\r\n\r\nexport const setCountryAttribute = (country: CountryDefinition, attribute: CountryAttribute, value: number) => {\r\n addValuesWithMutate(country, ValuesType.Base, 'Custom', [[attribute, value]])\r\n}\r\n\r\nexport const clearCountryAttributes = (country: CountryDefinition) => {\r\n clearAllValuesWithMutate(country, 'Custom')\r\n}\r\n\r\nexport const selectGovernment = (country: CountryDefinition, government: GovermentType) => {\r\n country.government = government\r\n}\r\n\r\nexport const selectCulture = (country: CountryDefinition, culture: CultureType, loadAllUnits: boolean) => {\r\n country.culture = culture\r\n country.units = getDefaultUnits(loadAllUnits ? undefined : culture)\r\n}\r\n\r\nexport const enableCountrySelection = (country: CountryDefinition, type: SelectionType, key: string) => {\r\n if (!country.selections[type])\r\n country.selections[type] = {}\r\n country.selections[type][key] = true\r\n}\r\n\r\nexport const enableCountrySelections = (country: CountryDefinition, type: SelectionType, keys: string[]) => {\r\n keys.forEach(key => enableCountrySelection(country, type, key))\r\n}\r\n\r\nexport const clearCountrySelection = (country: CountryDefinition, type: SelectionType, key: string) => {\r\n if (country.selections[type])\r\n delete country.selections[type][key]\r\n}\r\n\r\nexport const clearCountrySelections = (country: CountryDefinition, type?: SelectionType, keys?: string[]) => {\r\n if (keys && type)\r\n keys.forEach(key => clearCountrySelection(country, type, key))\r\n else if (type)\r\n delete country.selections[type]\r\n else\r\n country.selections = {} as Selections\r\n}\r\n\r\nexport const changeWeariness = (country: CountryDefinition, type: WearinessAttribute, min: number, max: number) => {\r\n country.weariness[type].min = min\r\n country.weariness[type].max = max\r\n}\r\n\r\nexport const applyCountryModifiers = (country: CountryDefinition, modifiers: ModifierWithKey[]): CountryDefinition => {\r\n modifiers.filter(value => value.target === ModifierType.Country).forEach(value => {\r\n country = addValue(country, value.type, value.key, value.attribute, value.value)\r\n })\r\n return country\r\n}\r\n\r\nexport const convertCountryDefinition = (country: CountryDefinition, settings: SiteSettings): Country => {\r\n const attributes = values(CountryAttribute)\r\n const calculated = toObj(attributes, attribute => attribute, attribute => isAttributeEnabled(attribute, settings) ? calculateValue(country, attribute) : 0)\r\n return {\r\n ...calculated,\r\n selections: country.selections,\r\n culture: country.culture,\r\n weariness: country.weariness\r\n }\r\n}\r\n\r\nexport const createArmy = (country: CountryDefinition, armyName: ArmyName, mode: Mode, source?: ArmyName) => {\r\n country.armies[armyName] = source ? country.armies[source] : getDefaultArmies()[mode === Mode.Land ? ArmyName.Army : ArmyName.Navy]\r\n}\r\n\r\nexport const deleteArmy = (country: CountryDefinition, armyName: ArmyName) => {\r\n delete country.armies[armyName]\r\n}\r\n\r\nexport const changeArmyName = (country: CountryDefinition, oldArmyName: ArmyName, armyName: ArmyName) => {\r\n delete Object.assign(country.armies, { [armyName]: country.armies[oldArmyName] })[oldArmyName]\r\n}\r\n\r\nexport const filterArmies = (country: CountryDefinition, mode: Mode) => filter(country.armies, army => army.mode === mode)\r\n","import * as manager from 'managers/countries'\r\nimport { Countries, CountryDefinition, CountryName } from 'types'\r\nimport { getDefaultCountryDefinitions } from 'data'\r\nimport { makeContainerReducer, ActionToFunction, makeActionRemoveFirst, makeEntityReducer, compose, makeActionReplaceFirst } from './utils'\r\n\r\nconst countriesMapping: ActionToFunction = {}\r\n\r\nexport const createCountry = makeActionRemoveFirst(manager.createCountry, countriesMapping)\r\nexport const deleteCountry = makeActionRemoveFirst(manager.deleteCountry, countriesMapping)\r\nexport const changeCountryName = makeActionRemoveFirst(manager.changeCountryName, countriesMapping)\r\n\r\nconst countries = makeContainerReducer(getDefaultCountryDefinitions(), countriesMapping)\r\n\r\nconst countryMapping: ActionToFunction = {}\r\n\r\nexport const clearCountrySelection = makeActionReplaceFirst(manager.clearCountrySelection, countryMapping)\r\nexport const clearCountrySelections = makeActionReplaceFirst(manager.clearCountrySelections, countryMapping)\r\nexport const enableCountrySelection = makeActionReplaceFirst(manager.enableCountrySelection, countryMapping)\r\nexport const enableCountrySelections = makeActionReplaceFirst(manager.enableCountrySelections, countryMapping)\r\nexport const selectCulture = makeActionReplaceFirst(manager.selectCulture, countryMapping)\r\nexport const selectGovernment = makeActionReplaceFirst(manager.selectGovernment, countryMapping)\r\nexport const setCountryAttribute = makeActionReplaceFirst(manager.setCountryAttribute, countryMapping)\r\nexport const clearCountryAttributes = makeActionReplaceFirst(manager.clearCountryAttributes, countryMapping)\r\nexport const changeWeariness = makeActionReplaceFirst(manager.changeWeariness, countryMapping)\r\nexport const createArmy = makeActionReplaceFirst(manager.createArmy, countryMapping)\r\nexport const deleteArmy = makeActionReplaceFirst(manager.deleteArmy, countryMapping)\r\nexport const changeArmyName = makeActionReplaceFirst(manager.changeArmyName, countryMapping)\r\n\r\nconst country = makeEntityReducer(getDefaultCountryDefinitions(), countryMapping)\r\n\r\nexport const countriesReducer = compose(country, countries)\r\n","\r\nimport * as manager from 'managers/settings'\r\nimport { makeActionRemoveFirst, makeContainerReducer, ActionToFunction } from './utils'\r\nimport { SettingsAndOptions } from 'types'\r\nimport { getDefaultSettings } from 'data'\r\n\r\nconst mapping: ActionToFunction = {}\r\n\r\nexport const changeCombatParameter = makeActionRemoveFirst(manager.changeCombatParameter, mapping)\r\nexport const changeSiteParameter = makeActionRemoveFirst(manager.changeSiteParameter, mapping)\r\nexport const selectCountry = makeActionRemoveFirst(manager.selectCountry, mapping)\r\nexport const selectArmy = makeActionRemoveFirst(manager.selectArmy, mapping)\r\nexport const setMode = makeActionRemoveFirst(manager.setMode, mapping)\r\n\r\nexport const settingsReducer = makeContainerReducer(getDefaultSettings(), mapping)\r\n","import { SettingsAndOptions, CombatSettings, SiteSettings, Setting, Mode, CountryName } from \"types\"\r\nimport { speedValues } from \"data\"\r\n\r\nexport const changeCombatParameter = (settings: SettingsAndOptions, mode: Mode, key: keyof CombatSettings, value: number | boolean | string) => {\r\n settings.combatSettings[mode][key] = value as never\r\n}\r\n\r\nexport const changeSiteParameter = (settings: SettingsAndOptions, key: keyof SiteSettings, value: number | boolean | string) => {\r\n if (key === Setting.Performance && typeof value === 'string' && speedValues[value]) {\r\n settings.siteSettings[Setting.PhasesPerRoll] = speedValues[value][0]\r\n settings.siteSettings[Setting.MaxPhases] = speedValues[value][1]\r\n settings.siteSettings[Setting.ReduceRolls] = speedValues[value][2]\r\n }\r\n settings.siteSettings[key] = value as never\r\n}\r\n\r\nexport const setMode = (settings: SettingsAndOptions, mode: Mode) => {\r\n settings.mode = mode\r\n settings.army = 0\r\n}\r\n\r\nexport const selectCountry = (settings: SettingsAndOptions, countryName: CountryName) => {\r\n settings.country = countryName\r\n settings.army = 0\r\n}\r\n\r\nexport const selectArmy = (settings: SettingsAndOptions, army: number) => {\r\n settings.army = army\r\n}\r\n\r\n","import { TacticType, TacticValueType, ValuesType, Mode, TacticDefinition, TacticDefinitions, Cohorts, Tactic, TacticCalc } from \"types\"\r\nimport { addValuesWithMutate, calculateValue } from \"definition_values\"\r\nimport { getTacticIcon } from \"data\"\r\nimport { calculateTactic, getTacticMatch } from \"combat\"\r\n\r\nexport const setTacticValue = (tactic: TacticDefinition, key: string, attribute: TacticValueType, value: number) => {\r\n addValuesWithMutate(tactic, ValuesType.Base, key, [[attribute, value]])\r\n}\r\n\r\nexport const deleteTactic = (tactics: TacticDefinitions, type: TacticType) => {\r\n delete tactics[type]\r\n}\r\n\r\nexport const createTactic = (tactics: TacticDefinitions, type: TacticType, mode: Mode) => {\r\n tactics[type] = { type, mode, image: getTacticIcon(type) }\r\n}\r\n\r\nexport const setTacticType = (tactics: TacticDefinitions, oldType: TacticType, type: TacticType) => {\r\n delete Object.assign(tactics, { [type]: { ...tactics[oldType], type } })[oldType]\r\n}\r\n\r\nexport const setTacticImage = (tactic: TacticDefinition, image: string) => {\r\n tactic.image = image\r\n}\r\n\r\nexport const setTacticMode = (tactic: TacticDefinition, mode: Mode) => {\r\n tactic.mode = mode\r\n}\r\n\r\n\r\nexport const convertTactic = (tactic: TacticDefinition, cohorts: Cohorts, opposingTactic: TacticDefinition): Tactic => {\r\n return {\r\n type: tactic.type,\r\n effect: calculateTactic(cohorts, tactic),\r\n damage: calculateTactic(cohorts, tactic, opposingTactic),\r\n casualties: calculateValue(tactic, TacticCalc.Casualties),\r\n image: tactic.image,\r\n match: getTacticMatch(tactic, opposingTactic)\r\n }\r\n}\r\n","import { getDefaultTacticState } from 'data'\r\nimport { TacticDefinitions, TacticDefinition, TacticType } from 'types'\r\nimport * as manager from 'managers/tactics'\r\nimport { makeActionRemoveFirst, makeContainerReducer, ActionToFunction, makeActionReplaceFirst, makeEntityReducer, compose } from './utils'\r\n\r\nconst tacticsMapping: ActionToFunction = {}\r\n\r\nexport const createTactic = makeActionRemoveFirst(manager.createTactic, tacticsMapping)\r\nexport const setTacticType = makeActionRemoveFirst(manager.setTacticType, tacticsMapping)\r\nexport const deleteTactic = makeActionRemoveFirst(manager.deleteTactic, tacticsMapping)\r\n\r\nconst tactics = makeContainerReducer(getDefaultTacticState(), tacticsMapping)\r\n\r\nconst tacticMapping: ActionToFunction = {}\r\n\r\nexport const setTacticValue = makeActionReplaceFirst(manager.setTacticValue, tacticMapping)\r\nexport const setTacticImage = makeActionReplaceFirst(manager.setTacticImage, tacticMapping)\r\nexport const setTacticMode = makeActionReplaceFirst(manager.setTacticMode, tacticMapping)\r\n\r\nconst tactic = makeEntityReducer(getDefaultTacticState(), tacticMapping)\r\n\r\nexport const tacticsReducer = compose(tactic, tactics)\r\n","import { getDefaultTerrainState } from 'data'\r\nimport { TerrainDefinitions, Terrain, TerrainType } from 'types'\r\nimport * as manager from 'managers/terrains'\r\nimport { makeActionRemoveFirst, makeContainerReducer, ActionToFunction, makeActionReplaceFirst, makeEntityReducer, compose } from './utils'\r\n\r\nconst terrainsMapping: ActionToFunction = {}\r\n\r\nexport const createTerrain = makeActionRemoveFirst(manager.createTerrain, terrainsMapping)\r\nexport const setTerrainType = makeActionRemoveFirst(manager.setTerrainType, terrainsMapping)\r\nexport const deleteTerrain = makeActionRemoveFirst(manager.deleteTerrain, terrainsMapping)\r\n\r\nconst terrains = makeContainerReducer(getDefaultTerrainState(), terrainsMapping)\r\n\r\nconst terrainMapping: ActionToFunction = {}\r\n\r\nexport const setTerrainImage = makeActionReplaceFirst(manager.setTerrainImage, terrainMapping)\r\nexport const setTerrainLocation = makeActionReplaceFirst(manager.setTerrainLocation, terrainMapping)\r\nexport const setTerrainMode = makeActionReplaceFirst(manager.setTerrainMode, terrainMapping)\r\nexport const setTerrainValue = makeActionReplaceFirst(manager.setTerrainValue, terrainMapping)\r\n\r\nconst terrain = makeEntityReducer(getDefaultTerrainState(), terrainMapping)\r\n\r\nexport const terrainsReducer = compose(terrain, terrains)\r\n","import { TerrainValueType, ValuesType, Terrain, LocationType, Mode, TerrainDefinitions, TerrainType } from \"types\"\r\nimport { addValuesWithMutate } from \"definition_values\"\r\n\r\nexport const setTerrainValue = (terrain: Terrain, key: string, attribute: TerrainValueType, value: number) => {\r\n addValuesWithMutate(terrain, ValuesType.Base, key, [[attribute, value]])\r\n}\r\n\r\nexport const setTerrainLocation = (terrain: Terrain, location: LocationType) => {\r\n terrain.location = location\r\n}\r\n\r\nexport const setTerrainImage = (terrain: Terrain, image: string) => {\r\n terrain.image = image\r\n}\r\n\r\nexport const setTerrainMode = (terrain: Terrain, mode: Mode) => {\r\n terrain.mode = mode\r\n}\r\n\r\nexport const deleteTerrain = (terrains: TerrainDefinitions, type: TerrainType) => {\r\n delete terrains[type]\r\n}\r\n\r\nexport const createTerrain = (terrains: TerrainDefinitions, type: TerrainType, mode: Mode) => {\r\n terrains[type] = { type, mode, image: '', location: LocationType.Border }\r\n}\r\n\r\nexport const setTerrainType = (terrains: TerrainDefinitions, oldType: TerrainType, type: TerrainType) => {\r\n delete Object.assign(terrains, { [type]: { ...terrains[oldType], type } })[oldType]\r\n}","\r\nimport { saveAs } from 'file-saver'\r\nimport { AppState, stripRounds, resetMissing, resetAll } from 'state'\r\nimport { Mode, ExportKey, ExportKeys, TransferState } from 'types'\r\n\r\nconst filterState = (state: AppState, exportKeys?: ExportKeys): any => {\r\n const filtered: any = { ...state }\r\n filtered._persist = undefined\r\n filtered.transfer = undefined\r\n filtered.data = undefined\r\n filtered.ui = undefined\r\n filtered.battle = stripRounds(filtered.battle)\r\n if (exportKeys && !exportKeys[ExportKey.Countries])\r\n filtered.countries = undefined\r\n if (exportKeys && !exportKeys[ExportKey.Terrains])\r\n filtered.terrains = undefined\r\n if (exportKeys && !exportKeys[ExportKey.Tactics])\r\n filtered.tactics = undefined\r\n if (exportKeys && !exportKeys[ExportKey.Settings])\r\n filtered.settings = undefined\r\n if (exportKeys && !exportKeys[ExportKey.Land])\r\n delete filtered.battle[Mode.Land]\r\n if (exportKeys && !exportKeys[ExportKey.Naval])\r\n delete filtered.battle[Mode.Naval]\r\n if (exportKeys && !exportKeys[ExportKey.Land] && !exportKeys[ExportKey.Naval])\r\n filtered.battle = undefined\r\n return filtered\r\n}\r\n\r\nexport const exportState = (state: AppState, exportKeys?: ExportKeys): string => JSON.stringify(filterState(state, exportKeys), undefined, 2)\r\n\r\nconst pad = (value: number) => String(value).padStart(2, '0')\r\n\r\nexport const saveToFile = (data: string) => {\r\n const blob = new Blob([data], { type: 'text/plain;charset=utf-8' })\r\n const date = new Date()\r\n const formatted = date.getFullYear() + '-' + pad(date.getMonth()) + '-' + pad(date.getDate()) + '_' + pad(date.getHours()) + '-' + pad(date.getMinutes()) + '-' + pad(date.getSeconds())\r\n saveAs(blob, 'imperator-simulator_' + formatted + '.json');\r\n}\r\n\r\nexport const setExportKey = (transfer: TransferState, key: ExportKey, value: boolean) => {\r\n transfer.exportKeys[key] = value\r\n}\r\n\r\nexport const setResetMissing = (transfer: TransferState, value: boolean) => {\r\n transfer.resetMissing = value\r\n}\r\n\r\nexport const resetState = (state: AppState) => {\r\n resetAll(state)\r\n}\r\n\r\nexport const importState = (state: AppState, imported: any, resetMissing: boolean) => {\r\n if (resetMissing)\r\n state = { ...state, transfer: state.transfer, ...imported }\r\n else\r\n // Bit complicated logic needed to allow adding and partially updating definitions.\r\n // TODO: this.state vs state really messy.\r\n state = {\r\n ...state,\r\n ...imported,\r\n tactics: state.tactics ? { ...state.tactics, ...imported.tactics } : imported.tactics,\r\n terrains: state.terrains ? { ...state.terrains, ...imported.terrains } : imported.terrains\r\n }\r\n}\r\n\r\nexport const resetMissingState = (state: AppState) => {\r\n resetMissing(state)\r\n}\r\n","import * as manager from 'managers/transfer'\r\nimport { TransferState } from 'types'\r\nimport { getDefaultTransferState } from 'data'\r\nimport { makeContainerReducer, ActionToFunction, makeActionRemoveFirst } from './utils'\r\nimport { AppState } from 'state'\r\n\r\nconst transferMapping: ActionToFunction = {}\r\n\r\nexport const setExportKey = makeActionRemoveFirst(manager.setExportKey, transferMapping)\r\nexport const setResetMissing = makeActionRemoveFirst(manager.setResetMissing, transferMapping)\r\n\r\nexport const transferReducer = makeContainerReducer(getDefaultTransferState(), transferMapping)\r\n\r\nconst importMapping: ActionToFunction = {}\r\n\r\nexport const importState = makeActionRemoveFirst(manager.importState, importMapping)\r\nexport const resetMissingState = makeActionRemoveFirst(manager.resetMissingState, importMapping)\r\nexport const resetState = makeActionRemoveFirst(manager.resetState, importMapping)\r\n\r\nexport const importReducer = makeContainerReducer({} as AppState, importMapping)\r\n","import { TransferState, ExportKeys } from \"types\"\r\n\r\nexport const getDefaultTransferState = (): TransferState => ({\r\n exportKeys: {} as ExportKeys,\r\n resetMissing: false\r\n})\r\n","\r\nimport * as manager from 'managers/ui'\r\nimport { makeActionRemoveFirst, makeContainerReducer, ActionToFunction } from './utils'\r\nimport { Modals, ModalType, UI, SideType } from 'types'\r\n\r\nconst mapping: ActionToFunction = {}\r\n\r\nexport const closeModal = makeActionRemoveFirst(manager.closeModal, mapping)\r\nexport const toggleAccordion = makeActionRemoveFirst(manager.toggleAccordion, mapping)\r\nexport const selectParticipant = makeActionRemoveFirst(manager.selectParticipant, mapping)\r\nexport const openModal: (key: T, object: NonNullable) => {} = makeActionRemoveFirst(manager.openModal, mapping)\r\n\r\nexport const uiReducer = makeContainerReducer({ modals: {}, accordions: {}, selectedParticipantIndex: { [SideType.A]: 0, [SideType.B]: 0 } }, mapping)\r\n","import { UI, ModalType, Modals, SideType } from 'types'\r\nimport { has } from 'lodash'\r\n\r\nexport const closeModal = (ui: UI) => {\r\n for (let key in ui.modals)\r\n (ui.modals as any)[key] = undefined\r\n}\r\n\r\nexport const openModal = (ui: UI, key: T, object: NonNullable) => {\r\n ui.modals[key] = object\r\n}\r\n\r\nexport const selectParticipant = (ui: UI, side: SideType, index: number) => {\r\n ui.selectedParticipantIndex[side] = index\r\n}\r\n\r\nexport const toggleAccordion = (ui: UI, key: string) => {\r\n if (has(ui.accordions, key))\r\n delete ui.accordions[key]\r\n else\r\n ui.accordions[key] = true\r\n}\r\n","import { UnitsData, UnitData, Countries, UnitType, CountryName } from 'types'\r\nimport { getDefaultCountryDefinitions } from 'data'\r\nimport * as manager from 'managers/units'\r\nimport { ActionToFunction, makeActionReplaceFirst, makeEntityReducer, Action, makeActionReplaceFirstTwice, compose, makeReducer } from './utils'\r\n\r\nconst unitsMapping: ActionToFunction = {}\r\n\r\nexport const createUnit = makeActionReplaceFirst(manager.createUnit, unitsMapping)\r\nexport const deleteUnit = makeActionReplaceFirst(manager.deleteUnit, unitsMapping)\r\nexport const changeUnitType = makeActionReplaceFirst(manager.changeUnitType, unitsMapping)\r\n\r\nconst getUnits = (draft: Countries, action: Action) => draft[action.payload[0]].units\r\n\r\nconst units = makeEntityReducer(getDefaultCountryDefinitions(), unitsMapping, getUnits)\r\n\r\nconst unitMapping: ActionToFunction = {}\r\n\r\nexport const setUnitValue = makeActionReplaceFirstTwice(manager.setUnitValue, unitMapping)\r\nexport const changeUnitImage = makeActionReplaceFirstTwice(manager.changeUnitImage, unitMapping)\r\nexport const changeUnitDeployment = makeActionReplaceFirstTwice(manager.changeUnitDeployment, unitMapping)\r\nexport const toggleUnitLoyality = makeActionReplaceFirstTwice(manager.toggleUnitLoyality, unitMapping)\r\nexport const changeParent = makeActionReplaceFirstTwice(manager.changeParent, unitMapping)\r\n\r\nconst getUnit = (draft: Countries, action: Action) => {\r\n const [country, key] = action.payload\r\n return draft[country].units[key as UnitType]\r\n}\r\n\r\nconst getUnitPayload = (action: Action) => {\r\n const [, , ...payload] = action.payload\r\n return payload\r\n}\r\n\r\nconst unit = makeReducer(getDefaultCountryDefinitions(), unitMapping, getUnit, getUnitPayload)\r\n\r\nexport const unitsReducer = compose(unit, units)\r\n","import { getDefaultTactic, getDefaultTerrain, getDefaultUnit, getDefaultSettings } from 'data'\r\nimport { map } from 'utils'\r\nimport { mergeValues, clearAllValues } from 'definition_values'\r\nimport { ModeState, TacticDefinitions, TerrainDefinitions, SettingsAndOptions, UnitsData } from 'types'\r\n\r\n\r\n\r\nexport const restoreDefaultTactics = (state: TacticDefinitions): TacticDefinitions => map(state, definition => mergeValues(clearAllValues(definition, definition.type), getDefaultTactic(definition.type)))\r\nexport const restoreDefaultTerrains = (state: TerrainDefinitions): TerrainDefinitions => map(state, definition => mergeValues(clearAllValues(definition, definition.type), getDefaultTerrain(definition.type)))\r\nexport const restoreDefaultUnits = (state: UnitsData): UnitsData => map(state, definition => mergeValues(clearAllValues(definition, definition.type), getDefaultUnit(definition.type)))\r\nexport const restoreDefaultSettings = (state: SettingsAndOptions): SettingsAndOptions => {\r\n const defaultSettings = getDefaultSettings()\r\n return { ...defaultSettings, ...state, siteSettings: { ...defaultSettings.siteSettings, ...state.siteSettings }, combatSettings: map(defaultSettings.combatSettings, ((_, mode) => ({ ...defaultSettings.combatSettings[mode], ...state.combatSettings[mode] }))) }\r\n}\r\n\r\nexport const stripRounds = (battle: ModeState): ModeState => map(battle, value => ({ ...value, outdated: false, timestamp: 0, sides: map(value.sides, value => ({ ...value, days: [] })) }))\r\n","import { Mode, UnitValues, ArmyPart, SideType, UnitsData, UnitType, UnitDefinitions, UnitDefinition, Cohorts, SiteSettings, ReserveDefinition, CohortDefinition, CohortData } from 'types'\r\nimport { mergeValues, shrinkValues } from 'definition_values'\r\nimport { map, filter } from 'utils'\r\nimport { applyDynamicAttributes } from 'managers/units'\r\n\r\n/** Merges cohort definitions with their units to get actual cohorts. */\r\nexport const convertReserveDefinitions = (settings: SiteSettings, reserve: ReserveDefinition, units: UnitDefinitions): ReserveDefinition => reserve.map(cohort => convertCohortDefinition(settings, cohort, units))\r\n\r\nexport const convertCohortDefinition = (settings: SiteSettings, cohort: CohortData, units: UnitDefinitions): CohortDefinition => applyDynamicAttributes(mergeValues(units[cohort.type], cohort), settings)\r\n\r\n/** Shrinks definition values under name of the unit, preventing values being overwritten when merging definitions. */\r\nexport const shrinkUnits = (definitions: T) => map(definitions, unit => shrinkValues(unit, unit.type)) as T\r\n\r\nexport const convertUnitDefinitions = (settings: SiteSettings, definitions: UnitsData, general: UnitValues): UnitDefinitions => {\r\n return map(definitions, (_, type) => convertUnitDefinition(settings, definitions, shrinkUnits(definitions), general, type))\r\n}\r\n\r\nexport const convertUnitDefinition = (settings: SiteSettings, definitions: UnitsData, parents: UnitsData, general: UnitValues, type: UnitType): UnitDefinition => {\r\n let unit = mergeValues(definitions[type], general[type])\r\n let parent = unit.parent\r\n const merged = [type]\r\n while (parent && !merged.includes(parent)) {\r\n merged.push(parent)\r\n unit = mergeValues(mergeValues(unit, parents[parent]), general[parent])\r\n parent = parents[parent]?.parent\r\n }\r\n return applyDynamicAttributes(unit, settings) as UnitDefinition\r\n}\r\n\r\n/**\r\n * Returns unit definitions for current battle mode.\r\n * @param mode\r\n * @param definitions \r\n */\r\nexport const filterUnitDefinitions = (mode: Mode, definitions: UnitDefinitions): UnitDefinitions => filter(definitions, unit => unit.mode === mode)\r\n\r\nexport const getArmyPart = (units: Cohorts, type: ArmyPart) => {\r\n if (type === ArmyPart.Frontline)\r\n return units.frontline\r\n if (type === ArmyPart.Reserve)\r\n return [units.reserve.front.concat(units.reserve.flank).concat(units.reserve.support)]\r\n if (type === ArmyPart.Defeated)\r\n return [units.defeated]\r\n return [units.retreated]\r\n}\r\n\r\nexport const getOpponent = (side: SideType) => side === SideType.A ? SideType.B : SideType.A\r\n","import { AppState } from './index'\r\nimport { toArr, toObj, keys } from 'utils'\r\nimport { filterUnitDefinitions, getArmyPart, convertReserveDefinitions, convertUnitDefinitions, convertUnitDefinition, shrinkUnits, getOpponent } from '../army_utils'\r\nimport { Mode, CountryName, SideType, CohortDefinition, ArmyPart, UnitType, TerrainType, LocationType, TacticType, TacticDefinition, UnitPreferences, Participant, Terrain, Settings, Battle, ArmyName, GeneralDefinition, Countries, Setting, ReserveDefinition, CountryAttribute, UnitDefinitions, UnitDefinition, GeneralData, Country, CountryDefinition, Cohort, Cohorts, SideData, Side, Environment, ArmyDefinition } from 'types'\r\nimport { getDefaultBattle, getDefaultMode, getDefaultCountryDefinitions, getDefaultSettings, getDefaultTacticState, getDefaultTerrainState } from 'data'\r\nimport { uniq, flatten } from 'lodash'\r\nimport * as manager from 'managers/army'\r\nimport { getCountryModifiers, getGeneralModifiers, getSecondaryCountryModifiers } from 'managers/modifiers'\r\nimport { convertCountryDefinition, applyCountryModifiers, filterArmies } from 'managers/countries'\r\nimport { applyUnitModifiers } from 'managers/units'\r\nimport { convertArmy, convertSide, getRound, getAttacker, getLeadingArmy } from 'managers/battle'\r\nimport { iterateCohorts } from 'combat'\r\nimport { convertTactic } from 'managers/tactics'\r\nimport { calculateValue } from 'definition_values'\r\n\r\n/**\r\n * Returns settings of the current mode.\r\n * @param state Application state.\r\n */\r\nexport const getSettings = (state: AppState, mode?: Mode): Settings => {\r\n const settings = { ...state.settings.combatSettings[mode || state.settings.mode], ...state.settings.siteSettings }\r\n const attacker = getCountry(state, getParticipant(state, SideType.A, 0).countryName)\r\n const defender = getCountry(state, getParticipant(state, SideType.B, 0).countryName)\r\n settings[Setting.CombatWidth] += Math.max(attacker[CountryAttribute.CombatWidth], defender[CountryAttribute.CombatWidth])\r\n settings[Setting.Precision] = Math.pow(10, settings[Setting.Precision])\r\n return settings\r\n}\r\n\r\nexport const getSiteSettings = (state: AppState) => state.settings.siteSettings\r\n\r\nexport const getCohortDefinition = (state: AppState, country: CountryName, army: ArmyName, index: number): CohortDefinition => getReserve(state, country, army)[index]\r\n\r\nexport const getCohort = (state: AppState, side: SideType, part: ArmyPart, row: number, column: number): Cohort | null => getArmyPart(getCohorts(state, side), part)[row][column]\r\n\r\nexport const getCohortForEachRound = (state: AppState, side: SideType, participantIndex: number, index: number) => {\r\n const rounds = state.battle[state.settings.mode].sides[side].days\r\n return rounds.map(side => {\r\n let result = null\r\n iterateCohorts(side.cohorts, true, cohort => {\r\n if (cohort && cohort.properties.participantIndex === participantIndex && cohort.properties.index === index)\r\n result = cohort\r\n })\r\n return result\r\n })\r\n}\r\n\r\n/**\r\n * Returns unit types for the current mode from all armies.\r\n * @param state Application state.\r\n */\r\nexport const mergeUnitTypes = (state: AppState): UnitType[] => {\r\n const mode = getMode(state)\r\n return Array.from(keys(state.countries).reduce((previous, countryName) => {\r\n return keys(getArmies(state, countryName)).reduce((previous, armyName) => {\r\n const units = manager.getActualUnits(getUnitDefinitions(state, countryName, armyName), mode)\r\n units.filter(unit => unit.mode === mode).forEach(unit => previous.add(unit.type))\r\n return previous\r\n }, previous)\r\n }, new Set()))\r\n}\r\n\r\n//#region Terrains\r\n\r\n/**\r\n * Returns terrain types.\r\n * @param location Location filter (ignored if not given).\r\n * @param mode Mode filter (current mode if not given).\r\n */\r\nexport const getTerrainTypes = (state: AppState, location?: LocationType, mode?: Mode): TerrainType[] => getTerrains(state, location, mode).map(terrain => terrain.type)\r\n\r\n/**\r\n * Returns terrain .\r\n * @param location Location filter (ignored if not given).\r\n * @param mode Mode filter (current mode if not given).\r\n */\r\nexport const getTerrains = (state: AppState, location?: LocationType, mode?: Mode): Terrain[] => {\r\n const terrains = toArr(state.terrains)\r\n mode = mode ?? state.settings.mode\r\n return terrains.filter(terrain => terrain.mode === mode && (!location || terrain.location === location))\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Tactics\r\n\r\n/**\r\n * Returns tactic types.\r\n * @param mode Mode filter (current mode if not given).\r\n */\r\nexport const getTacticTypes = (state: AppState, mode?: Mode): TacticType[] => getTacticDefinitions(state, mode).map(tactic => tactic.type)\r\n\r\n/**\r\n * Returns tactics.\r\n * @param mode Mode filter (current mode if not given).\r\n */\r\nexport const getTacticDefinitions = (state: AppState, mode?: Mode): TacticDefinition[] => {\r\n const tactics = toArr(state.tactics)\r\n mode = mode ?? state.settings.mode\r\n return tactics.filter(tactic => tactic.mode === state.settings.mode)\r\n}\r\n\r\nexport const getTactics = (state: AppState, side: SideType) => {\r\n const cohorts = getCohorts(state, side)\r\n const opponent = getLeadingArmy(getCombatSide(state, getOpponent(side)))\r\n return opponent ? getTacticDefinitions(state).map(tactic => convertTactic(tactic, cohorts, opponent.tactic)) : []\r\n}\r\n\r\n////#endregion\r\n\r\n/**\r\n * Returns armies of the current mode.\r\n * @param state Application state.\r\n */\r\nexport const getBattle = (state: AppState, mode?: Mode): Battle => state.battle[mode ?? state.settings.mode]\r\n\r\nexport const getCountries = (state: AppState): Countries => state.countries\r\n\r\nexport const getCohorts = (state: AppState, sideType: SideType): Cohorts => getCombatSide(state, sideType).cohorts\r\n\r\nexport const getCombatSide = (state: AppState, sideType: SideType): Side => {\r\n const side = getSide(state, sideType)\r\n return side.days[side.days.length - 1]\r\n}\r\n\r\nconst getArmy = (state: AppState, countryName: CountryName, armyName: ArmyName): ArmyDefinition => {\r\n const army = getArmyDefinition(state, countryName, armyName)\r\n const unitDefinitions = getUnitDefinitions(state, countryName, armyName)\r\n const reserve = getReserve(state, countryName, armyName)\r\n const general = getGeneral(state, countryName, armyName)\r\n const settings = getSiteSettings(state)\r\n const unitPreferences = settings[Setting.CustomDeployment] ? army.unitPreferences : {} as UnitPreferences\r\n const flankRatio = calculateValue(state.countries[countryName], CountryAttribute.FlankRatio)\r\n return { reserve, general, flankSize: army.flankSize, unitPreferences, unitDefinitions, flankRatio }\r\n}\r\n\r\nexport const convertSides = (state: AppState): Side[] => {\r\n const sideA = getSide(state, SideType.A)\r\n const sideD = getSide(state, SideType.B)\r\n const armyA = sideA.participants.map(participant => getArmy(state, participant.countryName, participant.armyName))\r\n const armyD = sideD.participants.map(participant => getArmy(state, participant.countryName, participant.armyName))\r\n const settings = getSettings(state)\r\n return [\r\n convertSidesSub(state, sideA, armyA, armyD, settings),\r\n convertSidesSub(state, sideD, armyD, armyA, settings)\r\n ]\r\n}\r\n\r\nconst convertSidesSub = (state: AppState, side: SideData, armyDefinitions: ArmyDefinition[], enemyDefinitions: ArmyDefinition[], settings: Settings): Side => {\r\n const terrains = getSelectedTerrains(state)\r\n const enemyTypes = uniq(flatten(enemyDefinitions.map(army => army.reserve.map(unit => unit.type))))\r\n const armies = side.participants.map((participant, index) => convertArmy(index, participant, armyDefinitions[index], enemyTypes, terrains, settings))\r\n // Ascending + reverse ensures that smaller index gets at end.\r\n armies.sort((a, b) => a.arrival - b.arrival).reverse()\r\n return convertSide(side, armies, settings)\r\n}\r\n\r\nexport const getCombatEnvironment = (state: AppState): Environment => {\r\n const battle = getBattle(state)\r\n const terrains = battle.terrains.map(value => state.terrains[value])\r\n const settings = getSettings(state)\r\n return {\r\n day: 0,\r\n round: getRound(battle),\r\n terrains,\r\n settings,\r\n attacker: getAttacker(battle),\r\n mode: getMode(state)\r\n }\r\n}\r\n\r\nexport const getSelectedTactic = (state: AppState, side: SideType, index: number): TacticDefinition => {\r\n const participant = getParticipant(state, side, index)\r\n const general = getGeneralDefinition(state, participant.countryName, participant.armyName)\r\n return state.tactics[general.tactic]\r\n}\r\n\r\nexport const getUnitPreferences = (state: AppState, countryName: CountryName, armyName: ArmyName): UnitPreferences => getArmyDefinition(state, countryName, armyName).unitPreferences\r\n\r\nexport const getFlankSize = (state: AppState, countryName: CountryName, armyName: ArmyName): number => getArmyDefinition(state, countryName, armyName).flankSize\r\n\r\nexport const getCountry = (state: AppState, countryName: CountryName): Country => {\r\n const country = getCountryDefinition(state, countryName)\r\n return convertCountryDefinition(country, state.settings.siteSettings)\r\n}\r\nexport const getCountryDefinition = (state: AppState, countryName: CountryName): CountryDefinition => {\r\n let country = state.countries[countryName]\r\n const modifiers = getCountryModifiers(country)\r\n country = applyCountryModifiers(country, modifiers)\r\n return applyCountryModifiers(country, getSecondaryCountryModifiers(country))\r\n}\r\nconst getArmyDefinition = (state: AppState, countryName: CountryName, armyName: ArmyName) => state.countries[countryName].armies[armyName]\r\n\r\nexport const getGeneralDefinition = (state: AppState, countryName: CountryName, armyName: ArmyName): GeneralData => {\r\n const army = getArmyDefinition(state, countryName, armyName).general\r\n const modifiers = getGeneralModifiers(army)\r\n return manager.applyGeneralModifiers(army, modifiers)\r\n\r\n}\r\nexport const getGeneral = (state: AppState, countryName: CountryName, armyName: ArmyName): GeneralDefinition => manager.convertGeneralDefinition(getSiteSettings(state), getGeneralDefinition(state, countryName, armyName), state.tactics)\r\n\r\nexport const getMode = (state: AppState): Mode => state.settings.mode\r\nexport const getSelectedArmy = (state: AppState): ArmyName => keys(getArmies(state))[state.settings.army]\r\n\r\nexport const getArmies = (state: AppState, countryName?: CountryName) => filterArmies(state.countries[countryName ?? state.settings.country], state.settings.mode)\r\n\r\nexport const getTacticDefinition = (state: AppState, countryName: CountryName, armyName: ArmyName): TacticDefinition => state.tactics[getGeneralDefinition(state, countryName, armyName).tactic]\r\n\r\nexport const getTactic = (state: AppState, side: SideType) => {\r\n const cohorts = getCohorts(state, side)\r\n const tactic = getLeadingArmy(getCombatSide(state, side))?.tactic\r\n const opponent = getLeadingArmy(getCombatSide(state, getOpponent(side)))\r\n return tactic && opponent ? convertTactic(tactic, cohorts, opponent.tactic) : null\r\n}\r\n\r\n\r\nexport const getOverridenReserveDefinitions = (state: AppState, countryName: CountryName, armyName: ArmyName, originals?: boolean) => {\r\n const army = getArmyDefinition(state, countryName, armyName)\r\n if (originals)\r\n return army.reserve\r\n const units = getUnitDefinitions(state, countryName, armyName)\r\n const country = getCountry(state, countryName)\r\n const latest = manager.getLatestUnits(units, country[CountryAttribute.TechLevel])\r\n return manager.overrideRoleWithPreferences(army, units, latest)\r\n}\r\n\r\nexport const getReserve = (state: AppState, countryName: CountryName, armyName: ArmyName, originals?: boolean): ReserveDefinition => {\r\n const settings = getSettings(state)\r\n const definition = getOverridenReserveDefinitions(state, countryName, armyName, originals)\r\n const units = getUnitDefinitions(state, countryName, armyName)\r\n return convertReserveDefinitions(settings, definition as ReserveDefinition, units)\r\n}\r\n\r\nexport const getParticipant = (state: AppState, type: SideType, index: number, mode?: Mode): Participant => getSide(state, type, mode).participants[index]\r\nexport const getParticipantSafely = (state: AppState, type: SideType, index: number, mode?: Mode): Participant => getParticipant(state, type, index, mode) ?? getParticipant(state, type, 0, mode)\r\n\r\nexport const getSide = (state: AppState, type: SideType, mode?: Mode): SideData => getBattle(state, mode).sides[type]\r\n\r\nexport const getSelectedTerrains = (state: AppState): Terrain[] => getBattle(state).terrains.map(value => state.terrains[value])\r\n\r\n\r\nconst getUnitDefinitionsSub = (state: AppState, countryName: CountryName, armyName: ArmyName) => {\r\n const country = state.countries[countryName]\r\n const units = country.units\r\n const general = getGeneralDefinition(state, countryName, armyName)\r\n const countryModifiers = getCountryModifiers(country)\r\n const secondaryCountryModifiers = getSecondaryCountryModifiers(applyCountryModifiers(country, countryModifiers))\r\n const generalModifiers = getGeneralModifiers(general)\r\n return applyUnitModifiers(units, countryModifiers.concat(secondaryCountryModifiers).concat(generalModifiers))\r\n}\r\n\r\n\r\nexport const getUnitDefinitions = (state: AppState, countryName?: CountryName, armyName?: ArmyName, mode?: Mode): UnitDefinitions => {\r\n const settings = getSiteSettings(state)\r\n countryName = countryName ?? state.settings.country\r\n armyName = armyName ?? getSelectedArmy(state)\r\n mode = mode ?? state.settings.mode\r\n\r\n const definitions = getUnitDefinitionsSub(state, countryName, armyName)\r\n const general = getGeneralDefinition(state, countryName, armyName).definitions\r\n const units = convertUnitDefinitions(settings, definitions, general)\r\n return filterUnitDefinitions(mode, units)\r\n}\r\n\r\nexport const getUnitTypeList = (state: AppState, filterParent: boolean, countryName?: CountryName, armyName?: ArmyName) => getUnitList(state, filterParent, countryName, armyName).map(unit => unit.type)\r\n\r\nexport const getUnitList = (state: AppState, filterParent: boolean, countryName?: CountryName, armyName?: ArmyName): UnitDefinition[] => {\r\n const mode = getMode(state)\r\n countryName = countryName ?? state.settings.country\r\n armyName = armyName ?? getSelectedArmy(state)\r\n const units = getUnitDefinitions(state, countryName, armyName)\r\n return manager.getUnitList(units, mode, filterParent, getSiteSettings(state))\r\n}\r\n\r\nexport const getUnitDefinition = (state: AppState, unitType: UnitType, countryName?: CountryName, armyName?: ArmyName): UnitDefinition => {\r\n const settings = getSiteSettings(state)\r\n countryName = countryName ?? state.settings.country\r\n armyName = armyName ?? getSelectedArmy(state)\r\n const general = getGeneralDefinition(state, countryName, armyName).definitions\r\n const units = getUnitDefinitionsSub(state, countryName, armyName)\r\n return convertUnitDefinition(settings, units, shrinkUnits(units), general, unitType)\r\n}\r\n\r\nexport const getUnitImages = (state: AppState): { [key in UnitType]: string[] } => {\r\n const definitions = toArr(state.countries).map(definitions => toArr(definitions.units)).flat(1)\r\n const unitTypes = mergeUnitTypes(state)\r\n return toObj(unitTypes, type => type, type => uniq(definitions.filter(value => value.type === type).map(value => value.image)))\r\n}\r\n\r\n/**\r\n * Resets missing data by using the default data.\r\n * @param data \r\n */\r\nexport const resetMissing = (data: AppState) => {\r\n data.tactics = data.tactics || getDefaultTacticState()\r\n data.terrains = data.terrains || getDefaultTerrainState()\r\n data.battle = data.battle || getDefaultBattle()\r\n if (!data.battle[Mode.Land])\r\n data.battle[Mode.Land] = getDefaultMode(Mode.Land)\r\n if (!data.battle[Mode.Naval])\r\n data.battle[Mode.Naval] = getDefaultMode(Mode.Naval)\r\n data.settings = data.settings || getDefaultSettings()\r\n data.countries = data.countries || getDefaultCountryDefinitions()\r\n return data\r\n}\r\n\r\n/**\r\n * Resets all data.\r\n * @param data \r\n */\r\nexport const resetAll = (data: AppState) => {\r\n data.tactics = getDefaultTacticState()\r\n data.terrains = getDefaultTerrainState()\r\n data.battle = getDefaultBattle()\r\n data.settings = getDefaultSettings()\r\n data.countries = getDefaultCountryDefinitions()\r\n}\r\n","import { armyReducer, countriesReducer, unitsReducer, tacticsReducer, terrainsReducer, battleReducer, transferReducer, importReducer, settingsReducer, combatReducer, uiReducer } from 'reducers'\r\nimport { combine, compose } from 'reducers/utils'\r\nimport { Reducer } from 'react'\r\n\r\nconst combined = combine({\r\n tactics: tacticsReducer,\r\n terrains: terrainsReducer,\r\n battle: battleReducer,\r\n transfer: transferReducer,\r\n countries: compose(countriesReducer, armyReducer, unitsReducer),\r\n settings: settingsReducer,\r\n ui: uiReducer\r\n})\r\n\r\nexport const rootReducer = compose(combined, combatReducer, importReducer) as Reducer\r\n\r\nexport type AppState = ReturnType\r\nexport * from './transforms'\r\nexport * from './utils'\r\n","import React, { Component } from 'react'\r\n\r\ninterface IProps {\r\n value: number\r\n reverse?: boolean\r\n hideZero?: boolean\r\n formatter: (value: number) => string\r\n positiveColor?: string\r\n neutralColor?: string\r\n negativeColor?: string\r\n}\r\n\r\n/**\r\n * Styles a number with positive/negative color and sign.\r\n */\r\nexport default class StyledNumber extends Component {\r\n\r\n render() {\r\n const { hideZero, value, reverse, formatter, positiveColor, negativeColor, neutralColor } = this.props\r\n if (hideZero && value === 0)\r\n return null\r\n const isPositive = reverse ? value < 0 : value > 0\r\n const className = value === 0 ? neutralColor || '' : (isPositive ? (positiveColor || 'color-positive') : (negativeColor || 'color-negative'))\r\n const str = formatter(value)\r\n return (\r\n \r\n {str}\r\n \r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { Image } from 'semantic-ui-react'\r\n\r\ninterface IProps {\r\n values: string[]\r\n}\r\n\r\nexport default class Images extends Component {\r\n\r\n render() {\r\n const { values } = this.props\r\n return (\r\n <>\r\n {values.map(image => )}\r\n \r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { List } from 'semantic-ui-react'\r\n\r\nimport Images from './Utils/Images'\r\nimport StyledNumber from './Utils/StyledNumber'\r\nimport { UnitType, UnitData, TacticDefinition } from 'types'\r\nimport { calculateValue } from 'definition_values'\r\nimport { toSignedPercent } from 'formatters'\r\n\r\ninterface IProps {\r\n images: { [key in UnitType]: string[] }\r\n unitTypes: UnitType[]\r\n item: UnitData | TacticDefinition\r\n styled?: boolean\r\n}\r\n\r\n/**\r\n * Shows unit's strength and weakness versus other units.\r\n */\r\nexport default class VersusList extends Component {\r\n\r\n render() {\r\n const { unitTypes, item, images, styled } = this.props\r\n return (\r\n \r\n {\r\n unitTypes.filter(type => calculateValue(item, type)).map(type => (\r\n \r\n \r\n {styled ?\r\n \r\n : toSignedPercent(calculateValue(item, type))\r\n }\r\n \r\n ))\r\n }\r\n \r\n )\r\n }\r\n}\r\n","\r\n\r\nimport React, { Component } from 'react'\r\nimport { Image } from 'semantic-ui-react'\r\nimport { getImage } from 'utils'\r\n\r\ninterface IProps {\r\n item?: {\r\n type: string\r\n image?: string\r\n tech?: number\r\n }\r\n}\r\n\r\nexport default class LabelItem extends Component {\r\n\r\n render() {\r\n const { item } = this.props\r\n if (!item)\r\n return null\r\n return (\r\n <>\r\n {item.tech}\r\n \r\n {item.type}\r\n \r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { Image, Popup, Header } from 'semantic-ui-react'\r\nimport { UnitAttribute, Mode, CombatPhase, CountryAttribute, SiteSettings, isAttributeEnabled, Setting, DisciplineValue, GeneralAttribute } from 'types'\r\n\r\nimport IconDiscipline from 'images/discipline.png'\r\nimport IconOffense from 'images/offense.png'\r\nimport IconDefense from 'images/defense.png'\r\nimport IconManpower from 'images/manpower.png'\r\nimport IconStrength from 'images/naval_combat.png'\r\nimport IconMorale from 'images/morale.png'\r\nimport IconAttrition from 'images/attrition.png'\r\nimport IconFire from 'images/fire.png'\r\nimport IconShock from 'images/shock.png'\r\nimport IconCombatAbility from 'images/combat_ability.png'\r\nimport IconCost from 'images/cost.png'\r\nimport IconFoodConsumption from 'images/food.png'\r\nimport IconFoodStorage from 'images/food_capacity.png'\r\nimport IconSupplyLimit from 'images/supply_limit.png'\r\nimport IconMartial from 'images/military_power.png'\r\n\r\ntype IProps = {\r\n attribute: string\r\n settings?: SiteSettings\r\n mode?: Mode\r\n}\r\n\r\nconst getFirstImage = (attribute: string, mode?: Mode) => {\r\n switch (attribute) {\r\n case UnitAttribute.Morale:\r\n return IconMorale\r\n case UnitAttribute.Strength:\r\n return mode === Mode.Naval ? IconStrength : IconManpower\r\n case UnitAttribute.Discipline:\r\n return IconDiscipline\r\n case UnitAttribute.Offense:\r\n case UnitAttribute.DamageDone:\r\n case UnitAttribute.MoraleDamageDone:\r\n case UnitAttribute.StrengthDamageDone:\r\n case UnitAttribute.FireDamageDone:\r\n case UnitAttribute.ShockDamageDone:\r\n return IconOffense\r\n case UnitAttribute.Defense:\r\n return IconDefense\r\n case UnitAttribute.DamageTaken:\r\n case UnitAttribute.MoraleDamageTaken:\r\n case UnitAttribute.StrengthDamageTaken:\r\n case UnitAttribute.ShockDamageTaken:\r\n case UnitAttribute.FireDamageTaken:\r\n return IconAttrition\r\n case UnitAttribute.CombatAbility:\r\n return IconCombatAbility\r\n case CombatPhase.Fire:\r\n return IconFire\r\n case CombatPhase.Shock:\r\n return IconShock\r\n case UnitAttribute.Cost:\r\n return IconCost\r\n case UnitAttribute.FoodConsumption:\r\n return IconFoodConsumption\r\n case UnitAttribute.FoodStorage:\r\n return IconFoodStorage\r\n case UnitAttribute.AttritionWeight:\r\n return IconSupplyLimit\r\n case CombatPhase.Default:\r\n case GeneralAttribute.Martial:\r\n return IconMartial\r\n default:\r\n return null\r\n }\r\n}\r\n\r\nconst getSecondImage = (attribute: string, mode?: Mode) => {\r\n switch (attribute) {\r\n case UnitAttribute.MoraleDamageDone:\r\n case UnitAttribute.MoraleDamageTaken:\r\n return IconMorale\r\n case UnitAttribute.StrengthDamageDone:\r\n case UnitAttribute.StrengthDamageTaken:\r\n return mode === Mode.Naval ? IconStrength : IconManpower\r\n case UnitAttribute.ShockDamageDone:\r\n case UnitAttribute.ShockDamageTaken:\r\n return IconShock\r\n case UnitAttribute.FireDamageDone:\r\n case UnitAttribute.FireDamageTaken:\r\n return IconFire\r\n default:\r\n return null\r\n }\r\n}\r\n\r\nconst getText = (attribute: string) => {\r\n switch (attribute) {\r\n case UnitAttribute.OffensiveSupport:\r\n return 'Backrow'\r\n case CountryAttribute.FlankRatio:\r\n return 'Cavalry ratio'\r\n case UnitAttribute.Experience:\r\n return 'Exp'\r\n case UnitAttribute.AttritionWeight:\r\n return 'Supply'\r\n default:\r\n return attribute\r\n }\r\n}\r\n\r\nconst getExplanation = (attribute: string, settings?: SiteSettings, mode?: Mode) => {\r\n if (settings && !isAttributeEnabled(attribute, settings))\r\n return 'This attribute is currently disabled'\r\n switch (attribute) {\r\n case UnitAttribute.AttritionWeight:\r\n return 'Required supply'\r\n case UnitAttribute.CombatAbility:\r\n return 'Increases damage done'\r\n case UnitAttribute.Morale:\r\n case UnitAttribute.Strength:\r\n case CombatPhase.Fire:\r\n case CombatPhase.Shock:\r\n return attribute\r\n case UnitAttribute.Discipline:\r\n return settings && settings[Setting.AttributeDiscipline] === DisciplineValue.Both ? 'Increases damage done and reduces damage taken' : 'Increases damage'\r\n default:\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Helper component for showing images of atributes.\r\n */\r\nexport default class AttributeImage extends Component {\r\n\r\n render() {\r\n const { attribute, settings, mode } = this.props\r\n const first = getFirstImage(attribute, mode)\r\n const second = getSecondImage(attribute, mode)\r\n const explanation = getExplanation(attribute, settings, mode)\r\n if (explanation) {\r\n return (\r\n <>\r\n \r\n {first && }\r\n {second && }\r\n {!first && !second && getText(attribute)}\r\n \r\n }\r\n content={this.getContent()}\r\n basic\r\n wide\r\n mouseEnterDelay={350}\r\n />\r\n \r\n )\r\n }\r\n return (\r\n \r\n {first && }\r\n {second && }\r\n {!first && !second && getText(attribute)}\r\n \r\n )\r\n\r\n }\r\n\r\n getContent = () => {\r\n const { attribute, settings, mode } = this.props\r\n const explanation = getExplanation(attribute, settings, mode)\r\n if (attribute === explanation) {\r\n return (\r\n \r\n
{getText(attribute)}
\r\n
\r\n )\r\n }\r\n return (\r\n \r\n
{getText(attribute)}
\r\n {explanation}\r\n
\r\n )\r\n }\r\n\r\n}\r\n","import React, { Component } from 'react'\r\nimport { Table, List, Icon } from 'semantic-ui-react'\r\nimport { toNumber } from 'lodash'\r\n\r\nimport { Mode, CountryName, UnitType, TerrainType, UnitData, UnitAttribute, UnitDefinition, filterAttributes, SiteSettings, Setting } from 'types'\r\nimport { calculateValue } from 'definition_values'\r\nimport { toPercent, toManpower, toSignedPercent } from 'formatters'\r\n\r\nimport StyledNumber from './Utils/StyledNumber'\r\nimport VersusList from './VersusList'\r\nimport LabelItem from './Utils/LabelUnit'\r\nimport AttributeImage from './Utils/AttributeImage'\r\n\r\ninterface IProps {\r\n mode: Mode\r\n country: CountryName\r\n units: UnitDefinition[]\r\n settings: SiteSettings\r\n images: { [key in UnitType]: string[] }\r\n unitTypes: UnitType[]\r\n terrains: TerrainType[]\r\n onRowClick: (unit: UnitData) => void\r\n}\r\n\r\n// Display component for showing unit definitions for an army.\r\nexport default class UnitDefinitions extends Component {\r\n\r\n attributes = [\r\n UnitAttribute.Discipline, UnitAttribute.DamageDone, UnitAttribute.DamageTaken, UnitAttribute.Offense, UnitAttribute.Defense, UnitAttribute.CombatAbility,\r\n UnitAttribute.MoraleDamageDone, UnitAttribute.MoraleDamageTaken, UnitAttribute.StrengthDamageDone, UnitAttribute.StrengthDamageTaken,\r\n UnitAttribute.FireDamageDone, UnitAttribute.FireDamageTaken, UnitAttribute.ShockDamageDone, UnitAttribute.ShockDamageTaken,\r\n UnitAttribute.OffensiveSupport, UnitAttribute.Experience, UnitAttribute.Drill\r\n ]\r\n\r\n filterByMode = (attributes: UnitAttribute[]) => attributes.filter(attribute => {\r\n if (this.props.mode === Mode.Naval) {\r\n if (attribute === UnitAttribute.Offense || attribute === UnitAttribute.Defense)\r\n return false\r\n }\r\n if (attribute === UnitAttribute.DamageDone || attribute === UnitAttribute.DamageTaken)\r\n return false\r\n return true\r\n })\r\n\r\n isDamageTaken = (attribute: UnitAttribute) => attribute === UnitAttribute.DamageTaken || attribute === UnitAttribute.FireDamageTaken || attribute === UnitAttribute.ShockDamageTaken || attribute === UnitAttribute.MoraleDamageTaken || attribute === UnitAttribute.StrengthDamageTaken\r\n\r\n render() {\r\n const { mode, units, country, settings } = this.props\r\n return (\r\n \r\n \r\n \r\n \r\n {country}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n this.filterByMode(filterAttributes(this.attributes, settings)).map(attribute => (\r\n \r\n \r\n \r\n ))\r\n }\r\n {\r\n settings[Setting.AttributeUnitType] &&\r\n \r\n Units\r\n \r\n }\r\n {\r\n settings[Setting.AttributeTerrainType] &&\r\n \r\n Terrain\r\n \r\n }\r\n \r\n \r\n \r\n {units.map(this.renderRow)}\r\n \r\n
\r\n )\r\n }\r\n\r\n renderRow = (unit: UnitData) => {\r\n const { settings, onRowClick, mode } = this.props\r\n return (\r\n onRowClick(unit)}>\r\n \r\n \r\n \r\n \r\n {toNumber(calculateValue(unit, UnitAttribute.Morale))}\r\n \r\n \r\n {mode === Mode.Naval ? toPercent(calculateValue(unit, UnitAttribute.Strength)) : toManpower(calculateValue(unit, UnitAttribute.Strength))}\r\n \r\n \r\n {toNumber(calculateValue(unit, UnitAttribute.Maneuver))}\r\n \r\n {\r\n this.filterByMode(filterAttributes(this.attributes, settings)).map(attribute => (\r\n \r\n \r\n \r\n ))\r\n }\r\n {\r\n settings[Setting.AttributeUnitType] &&\r\n \r\n \r\n \r\n }\r\n {\r\n settings[Setting.AttributeTerrainType] &&\r\n \r\n \r\n {\r\n this.props.terrains.filter(type => calculateValue(unit, type) !== 0).map(type => (\r\n \r\n {type + ': '}\r\n \r\n \r\n ))\r\n }\r\n \r\n \r\n }\r\n \r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { Dropdown } from 'semantic-ui-react'\r\n\r\ninterface IProps {\r\n value: T\r\n values: ({ value: T, text: string } | T)[]\r\n onChange?: (value: T) => void\r\n clearable?: boolean\r\n onAdd?: (value: T) => void\r\n style?: any\r\n search?: boolean\r\n placeholder?: string\r\n}\r\n\r\n\r\nexport default class SimpleDropdown extends Component> {\r\n\r\n getOptions = () => (\r\n this.props.values.map(item => {\r\n if (typeof item === 'object')\r\n return { key: item.value, value: item.value, text: item.text }\r\n else\r\n return { key: item, value: item, text: item }\r\n })\r\n )\r\n\r\n render() {\r\n const { value, clearable, onChange, onAdd, search, placeholder } = this.props\r\n const style = this.props.style ?? { minWidth: 170, maxWidth: 170 }\r\n return (\r\n onAdd && onAdd(value as T)}\r\n onChange={(_, { value }) => onChange && onChange(value as T)}\r\n style={style}\r\n compact={!!style}\r\n search={search || !!onAdd}\r\n selection\r\n options={this.getOptions()}\r\n placeholder={placeholder}\r\n allowAdditions={!!onAdd}\r\n />\r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { Modal, Input, Grid, Button } from 'semantic-ui-react'\r\nimport SimpleDropdown from './Dropdowns/SimpleDropdown'\r\n\r\ninterface IProps {\r\n onSuccess: (value: T, selected: S) => void\r\n onClose: () => void\r\n message: string\r\n valueLabel?: string\r\n dropdownLabel?: string\r\n buttonMessage: string\r\n open: boolean\r\n value: T\r\n selected: S\r\n items: S[]\r\n}\r\n\r\ninterface IState {\r\n value: T,\r\n selected: S\r\n}\r\n\r\n/**\r\n * Component for choosing a dropdown value in a modal.\r\n */\r\nexport default class ValueDropdownModal extends Component, IState> {\r\n\r\n constructor(props: IProps) {\r\n super(props)\r\n this.state = { value: this.props.value, selected: this.props.selected }\r\n }\r\n\r\n render() {\r\n const { onClose, open, message, items, valueLabel, dropdownLabel, buttonMessage } = this.props\r\n const { value, selected } = this.state\r\n return (\r\n \r\n {message}\r\n \r\n \r\n \r\n \r\n this.setState({ value: value as T })}\r\n />\r\n \r\n \r\n {\r\n dropdownLabel\r\n }\r\n this.setState({ selected: item })}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n onSuccess = () => {\r\n const { onSuccess, onClose } = this.props\r\n const { value, selected } = this.state\r\n if (value)\r\n onSuccess(value, selected)\r\n onClose()\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport SimpleDropdown from 'components/Dropdowns/SimpleDropdown'\r\nimport ValueDropdownModal from 'components/ValueDropdownModal'\r\nimport { AppState, getArmies, getMode } from 'state'\r\nimport { Grid, Button } from 'semantic-ui-react'\r\nimport { CountryName, ModalType, ArmyName } from 'types'\r\nimport { keys } from 'utils'\r\nimport { createCountry, changeCountryName, deleteCountry, createArmy, changeArmyName, deleteArmy, selectCountry, selectArmy, openModal } from 'reducers'\r\n\r\ninterface IState {\r\n openCreateCountry: boolean\r\n openCreateArmy: boolean\r\n}\r\n\r\nclass CountryManager extends Component {\r\n\r\n constructor(props: IProps) {\r\n super(props)\r\n this.state = this.initialState\r\n }\r\n\r\n initialState = { openCreateCountry: false, openCreateArmy: false }\r\n\r\n render() {\r\n const { countries, selectedCountry, selectedArmy, selectCountry, armies, selectArmy, children } = this.props\r\n const { openCreateCountry, openCreateArmy } = this.state\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n selectCountry(name)}\r\n />\r\n \r\n \r\n \r\n \r\n {\r\n selectedCountry &&\r\n \r\n \r\n \r\n }\r\n {\r\n selectedCountry &&\r\n \r\n \r\n \r\n }\r\n {\r\n React.Children.map(children, elem => (\r\n \r\n {elem}\r\n \r\n ))\r\n }\r\n \r\n \r\n \r\n ({ text: key, value: index }))}\r\n value={selectedArmy}\r\n onChange={selectArmy}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n openEditCountry = () => this.props.openModal(ModalType.Value, {\r\n onSuccess: country => this.changeCountryName(country as CountryName),\r\n message: 'Rename country',\r\n buttonMessage: 'Edit',\r\n initial: this.props.selectedCountry\r\n })\r\n\r\n openEditArmy = () => this.props.openModal(ModalType.Value, {\r\n onSuccess: army => this.changeArmyName(army as ArmyName),\r\n message: 'Rename army',\r\n buttonMessage: 'Edit',\r\n initial: this.props.armies[this.props.selectedArmy]\r\n })\r\n\r\n onClose = () => this.setState(this.initialState)\r\n\r\n createCountry = (country: CountryName, source?: CountryName) => {\r\n const { selectCountry, createCountry } = this.props\r\n createCountry(country, source)\r\n selectCountry(country)\r\n }\r\n\r\n deleteCountry = () => {\r\n const { selectCountry, deleteCountry, selectedCountry } = this.props\r\n deleteCountry(selectedCountry)\r\n selectCountry('' as CountryName)\r\n }\r\n\r\n changeCountryName = (country: CountryName) => {\r\n const { selectCountry, changeCountryName, selectedCountry } = this.props\r\n changeCountryName(selectedCountry, country)\r\n selectCountry(country)\r\n }\r\n\r\n createArmy = (army: ArmyName, sourceArmy?: ArmyName) => {\r\n const { createArmy, selectArmy, mode, selectedCountry, armies } = this.props\r\n createArmy(selectedCountry, army, mode, sourceArmy)\r\n selectArmy(armies.length)\r\n }\r\n\r\n deleteArmy = () => {\r\n const { selectArmy, deleteArmy, selectedArmy, selectedCountry, armies } = this.props\r\n deleteArmy(selectedCountry, armies[selectedArmy])\r\n selectArmy(selectedArmy - 1)\r\n }\r\n\r\n changeArmyName = (army: ArmyName) => {\r\n const { changeArmyName, armies, selectedArmy, selectedCountry } = this.props\r\n changeArmyName(selectedCountry, armies[selectedArmy], army)\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState) => ({\r\n selectedCountry: state.settings.country,\r\n countries: state.countries,\r\n selectedArmy: state.settings.army,\r\n armies: keys(getArmies(state)),\r\n mode: getMode(state)\r\n})\r\n\r\nconst actions = { selectCountry, createCountry, changeCountryName, deleteCountry, openModal, selectArmy, deleteArmy, changeArmyName, createArmy }\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ninterface IProps extends React.PropsWithChildren<{}>, S, D { }\r\n\r\nexport default connect(mapStateToProps, actions)(CountryManager)\r\n","import React, { Component } from 'react'\r\nimport { Table } from 'semantic-ui-react'\r\n\r\ninterface IProps {\r\n values: string[]\r\n}\r\n\r\n/**\r\n * Creates a table row with a fixed amount of cells.\r\n */\r\nexport default class Headers extends Component {\r\n\r\n render() {\r\n const { values } = this.props\r\n return (\r\n \r\n \r\n {values.map(this.renderHeader)}\r\n \r\n \r\n )\r\n }\r\n\r\n renderHeader = (value: string, index: number) => (\r\n \r\n {value}\r\n \r\n )\r\n}\r\n","import React, { Component } from 'react'\r\nimport { Table, Header } from 'semantic-ui-react'\r\nimport { Range, getTrackBackground } from 'react-range'\r\n\r\nimport Headers from './Utils/Headers'\r\nimport { WearinessAttribute, WearinessAttributes, UnitAttribute } from 'types'\r\nimport { toPercent } from 'formatters'\r\n\r\ntype IProps = {\r\n values: WearinessAttributes\r\n onChange: (type: WearinessAttribute, min: number, max: number) => void\r\n}\r\n\r\nconst NEUTRAL = '#CCC'\r\nconst ACTIVE = '#000'\r\nconst BACK = '#FFF'\r\n\r\n/**\r\n * Allows setting min and max value for weariness (random losses).\r\n */\r\nexport default class WearinessRange extends Component {\r\n\r\n readonly headers = ['', 'Morale', 'Strength']\r\n\r\n render() {\r\n const { values } = this.props\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n Weariness\r\n \r\n {this.renderCell(UnitAttribute.Morale, values[UnitAttribute.Morale])} \r\n {this.renderCell(UnitAttribute.Strength, values[UnitAttribute.Strength])} \r\n \r\n \r\n
\r\n )\r\n }\r\n\r\n renderCell = (type: WearinessAttribute, range: { min: number, max: number }) => {\r\n const { onChange } = this.props\r\n return (\r\n \r\n
\r\n {toPercent(range.min, 0)} - {toPercent(range.max, 0)}\r\n
\r\n {this.renderRange(range.min, range.max, (min, max) => onChange(type, min, max))}\r\n
\r\n\r\n )\r\n }\r\n\r\n renderRange = (min: number, max: number, onChange: (min: number, max: number) => void) => (\r\n onChange(values[0], values[1])}\r\n renderTrack={({ props, children }) => (\r\n \r\n \r\n {children}\r\n \r\n \r\n )}\r\n renderThumb={({ props, isDragged }) => (\r\n \r\n \r\n \r\n )}\r\n />\r\n )\r\n}\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport { Accordion, Icon, Header } from 'semantic-ui-react'\r\n\r\nimport { AppState } from 'state'\r\nimport { toggleAccordion } from 'reducers'\r\n\r\ntype Props = {\r\n title: string\r\n identifier: string\r\n open?: boolean\r\n}\r\n\r\n/**\r\n * Togglable accordion.\r\n */\r\nclass AccordionToggle extends Component {\r\n\r\n render() {\r\n const { active, title, identifier, toggleAccordion, children } = this.props\r\n return (\r\n \r\n toggleAccordion(identifier)}>\r\n
\r\n \r\n {title}\r\n
\r\n
\r\n \r\n {children}\r\n \r\n
\r\n )\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState, props: Props) => ({\r\n active: props.open ? !state.ui.accordions[props.identifier] : state.ui.accordions[props.identifier]\r\n})\r\n\r\nconst actions = { toggleAccordion }\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ninterface IProps extends React.PropsWithChildren, S, D { }\r\nexport default connect(mapStateToProps, actions)(AccordionToggle)\r\n","import React, { Component } from 'react'\r\nimport { Table, Button, Image } from 'semantic-ui-react'\r\nimport { connect } from 'react-redux'\r\nimport { AppState, getMode } from 'state'\r\n\r\nimport Headers from '../components/Utils/Headers'\r\nimport StyledNumber from '../components/Utils/StyledNumber'\r\n\r\nimport { Terrain, TerrainType, TerrainCalc, ModalType } from 'types'\r\nimport { keys, getImage, toArr } from 'utils'\r\nimport { calculateValue } from 'definition_values'\r\nimport { openModal, createTerrain } from 'reducers'\r\nimport { addSign } from 'formatters'\r\n\r\n// Display component for showing unit definitions for an army.\r\nclass TerrainDefinitions extends Component {\r\n\r\n readonly attributes = keys(TerrainCalc).map(k => TerrainCalc[k])\r\n readonly headers = ['Terrain', 'Location', 'Roll']\r\n\r\n render() {\r\n const { terrains } = this.props\r\n return (\r\n <>\r\n \r\n \r\n \r\n {terrains.map(this.renderRow)}\r\n \r\n
\r\n \r\n \r\n )\r\n }\r\n\r\n onClick = () => this.props.openModal(ModalType.Value, {\r\n onSuccess: type => this.props.createTerrain(type as TerrainType, this.props.mode),\r\n message: 'New terrain type',\r\n buttonMessage: 'Create',\r\n initial: ''\r\n })\r\n\r\n renderRow = (definition: Terrain) => {\r\n return (\r\n this.openModal(definition)}>\r\n \r\n \r\n {definition.type}\r\n \r\n \r\n {definition.location}\r\n \r\n {this.renderAttributes(definition)}\r\n \r\n )\r\n }\r\n\r\n renderAttributes = (definition: Terrain) => (\r\n this.attributes.map(type => (\r\n \r\n \r\n \r\n ))\r\n )\r\n\r\n openModal = (definition: Terrain) => this.props.openModal(ModalType.TerrainDetail, { type: definition.type })\r\n}\r\n\r\nconst mapStateToProps = (state: AppState) => ({\r\n terrains: toArr(state.terrains),\r\n mode: getMode(state)\r\n})\r\n\r\nconst actions = {\r\n openModal, createTerrain\r\n}\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ntype IProps = S & D\r\n\r\nexport default connect(mapStateToProps, actions)(TerrainDefinitions)\r\n","import React, { Component } from 'react'\r\nimport { Image, Table, List, Button } from 'semantic-ui-react'\r\n\r\nimport VersusList from '../components/VersusList'\r\nimport StyledNumber from '../components/Utils/StyledNumber'\r\n\r\nimport Headers from '../components/Utils/Headers'\r\nimport { TacticDefinition, TacticType, TacticCalc, ModalType } from 'types'\r\nimport { calculateValue } from 'definition_values'\r\nimport { openModal, createTactic } from 'reducers'\r\nimport { toSignedPercent } from 'formatters'\r\nimport { getImage } from 'utils'\r\nimport { connect } from 'react-redux'\r\nimport { AppState, getMode, getTacticDefinitions, getUnitImages, mergeUnitTypes } from 'state'\r\n\r\n/**\r\n * Shows tactic definitions for both sides.\r\n */\r\nclass TacticDefinitions extends Component {\r\n\r\n readonly headers = ['Tactic', 'Unit effectiveness', 'Against other tactics', 'Casualties']\r\n\r\n render() {\r\n return (\r\n <>\r\n \r\n \r\n \r\n {this.props.tactics.map(this.renderRow)}\r\n \r\n
\r\n \r\n \r\n )\r\n }\r\n\r\n onClick = () => this.props.openModal(ModalType.Value, {\r\n onSuccess: type => this.props.createTactic(type as TacticType, this.props.mode),\r\n message: 'New tactic type',\r\n buttonMessage: 'Create',\r\n initial: ''\r\n })\r\n\r\n renderRow = (definition: TacticDefinition) => {\r\n const { images, unitTypes } = this.props\r\n return (\r\n this.openModal(definition)}>\r\n \r\n \r\n {definition.type}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.renderVersus(definition)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n renderVersus = (definition: TacticDefinition) => {\r\n const filtered = this.props.tactics.filter(versus => calculateValue(definition, versus.type))\r\n return filtered.map(versus => (\r\n \r\n \r\n \r\n \r\n ))\r\n }\r\n\r\n openModal = (definition: TacticDefinition) => this.props.openModal(ModalType.TacticDetail, { type: definition.type })\r\n}\r\n\r\nconst mapStateToProps = (state: AppState) => ({\r\n tactics: getTacticDefinitions(state),\r\n images: getUnitImages(state),\r\n unitTypes: mergeUnitTypes(state),\r\n mode: getMode(state)\r\n})\r\n\r\nconst actions = {\r\n openModal, createTactic\r\n}\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ntype IProps = S & D\r\n\r\nexport default connect(mapStateToProps, actions)(TacticDefinitions)","import React, { Component } from 'react'\r\nimport { Button } from 'semantic-ui-react'\r\nimport { connect } from 'react-redux'\r\n\r\nimport { AppState, mergeUnitTypes, getTerrainTypes, getUnitImages, getMode, getCountries, getSiteSettings, getUnitDefinitions, getSelectedArmy } from 'state'\r\nimport { createUnit, deleteUnit, changeUnitType, changeWeariness, openModal } from 'reducers'\r\nimport UnitDefinitions from 'components/UnitDefinitions'\r\nimport CountryManager from 'containers/CountryManager'\r\nimport { CountryName, UnitType, ModalType, Setting } from 'types'\r\nimport WearinessRange from 'components/WearinessRange'\r\nimport { getAllUnitList } from 'managers/army'\r\nimport AccordionToggle from 'containers/AccordionToggle'\r\nimport TerrainDefinitions from 'containers/TerrainDefinitions'\r\nimport TacticDefinitions from 'containers/TacticDefinitions'\r\n\r\ninterface IState {\r\n modalCountry: CountryName | undefined\r\n openCreateUnit: boolean\r\n}\r\n\r\nclass Definitions extends Component {\r\n\r\n constructor(props: IProps) {\r\n super(props)\r\n this.state = this.initialState\r\n }\r\n\r\n initialState = { modalCountry: undefined, openCreateUnit: false }\r\n\r\n render() {\r\n const { mode, country, army, terrains, units, images, unitTypes, weariness, openModal, settings } = this.props\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n
\r\n openModal(ModalType.UnitDetail, { country, army, type: unit.type, remove: true })}\r\n />\r\n this.props.changeWeariness(country, type, min, max)}\r\n />\r\n

\r\n
\r\n
\r\n \r\n \r\n

\r\n
\r\n
\r\n {\r\n settings[Setting.Tactics] &&\r\n \r\n \r\n

\r\n
\r\n }\r\n \r\n )\r\n }\r\n\r\n onClick = () => this.props.openModal(ModalType.Value, {\r\n onSuccess: type => this.props.createUnit(this.props.country, this.props.mode, type as UnitType),\r\n message: 'New unit type',\r\n buttonMessage: 'Create',\r\n initial: ''\r\n })\r\n}\r\n\r\nconst mapStateToProps = (state: AppState) => ({\r\n units: getAllUnitList(getUnitDefinitions(state), getMode(state)),\r\n images: getUnitImages(state),\r\n unitTypes: mergeUnitTypes(state),\r\n terrains: getTerrainTypes(state),\r\n mode: getMode(state),\r\n country: state.settings.country,\r\n army: getSelectedArmy(state),\r\n settings: getSiteSettings(state),\r\n weariness: getCountries(state)[state.settings.country].weariness\r\n})\r\n\r\nconst actions = {\r\n openModal, deleteUnit, createUnit, changeUnitType, changeWeariness\r\n}\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ntype IProps = S & D\r\n\r\nexport default connect(mapStateToProps, actions)(Definitions)\r\n","import React, { Component } from 'react'\r\nimport { Dropdown, Table } from 'semantic-ui-react'\r\nimport AttributeImage from '../Utils/AttributeImage'\r\nimport { SiteSettings } from 'types'\r\n\r\ninterface IProps {\r\n value: T\r\n trigger?: React.ReactNode\r\n values: E[]\r\n headers: string[]\r\n getContent: (value: E, search: string) => (string | number | JSX.Element)[] | null\r\n isPositive?: (value: E) => boolean\r\n isNegative?: (value: E) => boolean\r\n getText?: (value: E) => string\r\n isActive: (value: E) => boolean\r\n getValue: (value: E) => T\r\n onSelect: (type: T) => void\r\n settings: SiteSettings\r\n clearable?: boolean\r\n search?: boolean\r\n placeholder?: string\r\n absolute?: boolean\r\n width?: number\r\n}\r\n\r\ntype IState = {\r\n search: string\r\n open: boolean\r\n}\r\n\r\nexport default class DropdownTable extends Component, IState> {\r\n\r\n constructor(props: IProps) {\r\n super(props)\r\n this.state = { search: '', open: false }\r\n }\r\n\r\n getHeader = () => (\r\n \r\n \r\n {this.props.headers.map(header => )}\r\n \r\n \r\n )\r\n\r\n search = (_: any, data: any) => this.setState({ search: data.searchQuery })\r\n\r\n onOpen = () => this.setState({ search: '', open: true })\r\n onClose = () => this.setState({ search: '', open: false })\r\n\r\n getContent = (item: E, index: number) => {\r\n const { getContent, isPositive, isNegative, isActive } = this.props\r\n const content = getContent(item, this.state.search)\r\n if (!content)\r\n return null\r\n return (\r\n this.onClick(item)} active={isActive(item)} positive={isPositive && isPositive(item)} negative={isNegative && isNegative(item)}>\r\n {content.map((cell, index) => {cell})}\r\n \r\n )\r\n }\r\n\r\n onClick = (item: E) => {\r\n this.props.onSelect(this.props.getValue(item))\r\n this.setState({ open: false, search: '' })\r\n }\r\n onChange = () => {\r\n this.props.onSelect('' as T)\r\n this.setState({ open: false, search: '' })\r\n }\r\n render() {\r\n const { value, values, headers, trigger, width, clearable, getText, search, placeholder, absolute } = this.props\r\n const selected = values.find(this.props.isActive)\r\n const text = trigger ? undefined : selected && getText ? getText(selected) : ''\r\n const style = { minWidth: width ?? 170, maxWidth: width ?? 170 }\r\n let classNames = []\r\n if (absolute)\r\n classNames.push('absolute')\r\n if (!trigger)\r\n classNames.push('selection')\r\n return (\r\n //\r\n \r\n \r\n \r\n {headers.length ? this.getHeader() : null}\r\n \r\n {values.map(this.getContent)}\r\n \r\n
\r\n
\r\n
\r\n //
\r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { UnitDefinition, UnitType, SiteSettings } from 'types'\r\nimport DropdownTable from './DropdownTable'\r\nimport LabelItem from 'components/Utils/LabelUnit'\r\n\r\ntype IProps = {\r\n value: UnitType\r\n values: UnitDefinition[]\r\n onSelect: (type: UnitType) => void\r\n settings: SiteSettings\r\n}\r\n\r\nexport default class DropdownUnit extends Component {\r\n\r\n getContent = (unit: UnitDefinition) => ([\r\n \r\n ])\r\n\r\n isActive = (item: UnitDefinition) => item.type === this.props.value\r\n\r\n getValue = (item: UnitDefinition) => item.type\r\n\r\n\r\n headers = []\r\n\r\n render() {\r\n const { value, values, onSelect, settings } = this.props\r\n return (\r\n unit.type === value)} />}\r\n settings={settings}\r\n />\r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport { Table, Input } from 'semantic-ui-react'\r\n\r\nimport { AppState, getUnitPreferences, getFlankSize, getMode, getUnitList, getSiteSettings, getParticipantSafely } from 'state'\r\nimport { setFlankSize, setUnitPreference } from 'reducers'\r\nimport { getUnitIcon } from 'data'\r\nimport { UnitPreferenceType, SideType, UnitType, UnitDefinition } from 'types'\r\nimport DropdownUnit from 'components/Dropdowns/DropdownUnit'\r\n\r\n/**Table with row types and flank sizes. */\r\nexport default class PreferredUnitTypes extends Component {\r\n render() {\r\n return (\r\n \r\n \r\n \r\n \r\n Preferred unit types\r\n \r\n \r\n {UnitPreferenceType.Primary}\r\n \r\n \r\n {UnitPreferenceType.Secondary}\r\n \r\n \r\n {UnitPreferenceType.Flank}\r\n \r\n \r\n Flank size\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n )\r\n }\r\n}\r\n\r\ntype Props = {\r\n side: SideType\r\n}\r\n\r\n/**\r\n * Row types and flank size for a side.\r\n */\r\nclass Row extends Component {\r\n\r\n render() {\r\n const { side } = this.props\r\n return (\r\n \r\n \r\n {side}\r\n \r\n {this.renderCell(UnitPreferenceType.Primary)}\r\n {this.renderCell(UnitPreferenceType.Secondary)}\r\n {this.renderCell(UnitPreferenceType.Flank)}\r\n {this.renderFlankSize()}\r\n \r\n )\r\n }\r\n\r\n renderCell = (type: UnitPreferenceType) => {\r\n const { units, preferences, settings } = this.props\r\n const unit = preferences[type]\r\n const empty = { type: UnitType.None, image: getUnitIcon(UnitType.None) } as UnitDefinition\r\n return (\r\n this.setState({ modalType: type })}>\r\n this.setUnitPreference(type, unitType)}\r\n settings={settings}\r\n />\r\n \r\n )\r\n }\r\n\r\n renderFlankSize = () => {\r\n const { flankSize } = this.props\r\n return (\r\n \r\n this.setFlankSize(Number(data.value))} />\r\n \r\n )\r\n }\r\n\r\n setFlankSize = (value: number) => {\r\n const { setFlankSize, armyName, countryName } = this.props\r\n setFlankSize(countryName, armyName, value)\r\n }\r\n\r\n setUnitPreference = (type: UnitPreferenceType, unitType: UnitType): void => {\r\n const { setUnitPreference, armyName, countryName } = this.props\r\n setUnitPreference(countryName, armyName, type, unitType)\r\n }\r\n}\r\n\r\n\r\nconst mapStateToProps = (state: AppState, props: Props) => {\r\n const participant = getParticipantSafely(state, props.side, state.ui.selectedParticipantIndex[props.side])\r\n const { countryName, armyName } = participant\r\n return {\r\n units: getUnitList(state, true, countryName, armyName),\r\n countryName,\r\n armyName,\r\n flankSize: getFlankSize(state, countryName, armyName),\r\n preferences: getUnitPreferences(state, countryName, armyName),\r\n mode: getMode(state),\r\n settings: getSiteSettings(state)\r\n }\r\n}\r\n\r\nconst actions = { setFlankSize, setUnitPreference }\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ntype IProps = Props & S & D\r\n\r\nconst ConnectedRow = connect(mapStateToProps, actions)(Row)\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport { Image, Table } from 'semantic-ui-react'\r\n\r\nimport IconEmpty from 'images/empty.png'\r\nimport { SideType, UnitType, UnitAttribute, isAttributeEnabled, Cohorts, Cohort } from 'types'\r\nimport { strengthToValue, toNumber } from 'formatters'\r\nimport { getImage, round, sumArr } from 'utils'\r\nimport { AppState, getCohorts, getMode, getBattle, getSiteSettings } from 'state'\r\nimport { flatten, uniq } from 'lodash'\r\nimport AttributeImage from 'components/Utils/AttributeImage'\r\n\r\ntype Props = {}\r\n\r\nclass TableStats extends Component {\r\n\r\n shouldComponentUpdate(prevProps: IProps) {\r\n return prevProps.timestamp !== this.props.timestamp\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n {this.renderArmy(SideType.A, this.props.cohortsA)}\r\n {this.renderArmy(SideType.B, this.props.cohortsD)}\r\n \r\n )\r\n }\r\n\r\n renderArmy = (side: SideType, cohorts: Cohorts) => {\r\n const { mode, settings } = this.props\r\n const flatten = this.flatten(cohorts)\r\n const types = uniq(flatten.map(cohort => cohort.properties.type))\r\n const rows = types.map(type => this.renderRow(cohorts, type)).filter(row => row)\r\n return (\r\n \r\n \r\n \r\n \r\n {side}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Strength depleted\r\n \r\n \r\n Morale depleted\r\n \r\n \r\n \r\n \r\n \r\n Monthly \r\n \r\n \r\n \r\n \r\n {\r\n isAttributeEnabled(UnitAttribute.FoodConsumption, settings) &&\r\n \r\n \r\n \r\n }\r\n {\r\n isAttributeEnabled(UnitAttribute.FoodStorage, settings) &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n {rows}\r\n \r\n \r\n \r\n Total\r\n \r\n {this.renderCells(flatten)}\r\n \r\n \r\n
\r\n )\r\n }\r\n\r\n renderRow = (cohorts: Cohorts, type: UnitType) => {\r\n const flatten = this.flatten(cohorts, type)\r\n const count = flatten.length\r\n if (count === 0)\r\n return null\r\n const image = getImage(flatten[0].properties)\r\n return (\r\n \r\n \r\n \r\n {type + ' (x ' + count + ')'}\r\n \r\n {this.renderCells(flatten)}\r\n \r\n )\r\n }\r\n\r\n renderCells = (cohorts: Cohort[]) => {\r\n const { mode } = this.props\r\n return (\r\n <>\r\n \r\n {strengthToValue(mode, this.sum(cohorts, cohort => cohort[UnitAttribute.Strength]))} / {strengthToValue(mode, this.sum(cohorts, cohort => cohort.properties.maxStrength))}\r\n \r\n \r\n {round(this.sum(cohorts, cohort => cohort[UnitAttribute.Morale]), 100.0)} / {round(this.sum(cohorts, cohort => cohort.properties.maxMorale), 100.0)}\r\n \r\n \r\n {strengthToValue(mode, this.sum(cohorts, cohort => cohort.state.totalStrengthDealt))}\r\n \r\n \r\n {round(this.sum(cohorts, cohort => cohort.state.totalMoraleDealt), 100.0)}\r\n \r\n {this.renderCell(cohorts, UnitAttribute.Cost)}\r\n \r\n {round(this.sum(cohorts, cohort => cohort.properties[UnitAttribute.Cost] * cohort.properties[UnitAttribute.Maintenance]), 100.0)}\r\n \r\n {this.renderCell(cohorts, UnitAttribute.AttritionWeight)}\r\n {this.renderCell(cohorts, UnitAttribute.FoodConsumption)}\r\n {this.renderCell(cohorts, UnitAttribute.FoodStorage, this.storageFormatter)}\r\n \r\n )\r\n }\r\n\r\n renderCell = (cohorts: Cohort[], attribute: UnitAttribute, formatter?: (cohorts: Cohort[], attribute: UnitAttribute) => string) => {\r\n const { settings } = this.props\r\n if (isAttributeEnabled(attribute, settings)) {\r\n return (\r\n \r\n {formatter ? formatter(cohorts, attribute) : this.defaultFormatter(cohorts, attribute)}\r\n \r\n )\r\n }\r\n return null\r\n }\r\n\r\n defaultFormatter = (cohorts: Cohort[], attribute: UnitAttribute) => {\r\n return round(this.sum(cohorts, cohort => cohort.properties[attribute]), 100.0)\r\n }\r\n\r\n storageFormatter = (cohorts: Cohort[]) => {\r\n const storage = this.sum(cohorts, cohort => cohort.properties[UnitAttribute.FoodStorage])\r\n const consumption = this.sum(cohorts, cohort => cohort.properties[UnitAttribute.FoodConsumption]) || 1.0\r\n return `${toNumber(storage / consumption / 12)} years (${toNumber(storage)})`\r\n }\r\n\r\n sum = (merged: Cohort[], getAttribute: (cohort: Cohort) => number): number => sumArr(merged, getAttribute)\r\n\r\n // Flattens units to a single list. Also filters temporary 'defeated' units because they are copies of another unit.\r\n flatten = (cohorts: Cohorts, type?: UnitType): Cohort[] => (\r\n cohorts.reserve.front.filter(cohort => this.filter(cohort, type)).concat(cohorts.reserve.flank.filter(cohort => this.filter(cohort, type))).concat(cohorts.reserve.support.filter(cohort => this.filter(cohort, type)))\r\n .concat(cohorts.defeated.filter(cohort => this.filter(cohort, type)).concat(flatten(cohorts.frontline).filter(cohort => this.filter(cohort, type)) as Cohort[]))\r\n )\r\n\r\n filter = (cohort: Cohort | null, type?: UnitType) => cohort && !cohort.state.isDefeated && (!type || cohort.properties.type === type)\r\n}\r\n\r\nconst mapStateToProps = (state: AppState) => ({\r\n cohortsA: getCohorts(state, SideType.A),\r\n cohortsD: getCohorts(state, SideType.B),\r\n mode: getMode(state),\r\n settings: getSiteSettings(state),\r\n timestamp: getBattle(state).timestamp\r\n})\r\n\r\nconst actions = {}\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ninterface IProps extends React.PropsWithChildren, S, D { }\r\n\r\nexport default connect(mapStateToProps, actions)(TableStats)\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport { Popup, List } from 'semantic-ui-react'\r\n\r\nimport StyledNumber from 'components/Utils/StyledNumber'\r\n\r\nimport { SideType, ArmyPart, UnitAttribute, UnitType, Setting, TerrainType, CombatPhase, Mode, CohortProperties, CohortRoundInfo, Cohort, DisciplineValue } from 'types'\r\nimport { calculateCohortPips, getOffensiveCohortPips, getDefensiveCohortPips, getCombatPhase, getDefensiveSupportCohortPips } from 'combat'\r\nimport { toSignedPercent, strengthToValue, toNumber, addSign, toMultiplier, toMorale } from 'formatters'\r\nimport { AppState, getSettings, getSelectedTerrains, getCohort, getCombatSide, getMode } from 'state'\r\nimport { noZero } from 'utils'\r\nimport { getCohortName } from 'managers/units'\r\n\r\ntype Props = {\r\n row: number | null\r\n column: number | null\r\n isSupport: boolean\r\n context: HTMLElement | null\r\n side: SideType\r\n part: ArmyPart\r\n}\r\n\r\ntype IState = {\r\n content: JSX.Element | null\r\n}\r\n\r\n/**\r\n * Displays a combat tooltip for the unit at a given index.\r\n * The tooltip shows strength, morale, target and damage breakdown.\r\n */\r\nclass CombatTooltip extends Component {\r\n constructor(props: IProps) {\r\n super(props)\r\n this.state = { content: null }\r\n }\r\n\r\n render() {\r\n const { source, context, isSupport } = this.props\r\n return (\r\n \r\n )\r\n }\r\n\r\n BLUE = 'color-blue'\r\n ORANGE = 'color-orange'\r\n RED = 'color-red'\r\n\r\n getExplanation = (isSupport: boolean) => {\r\n const { source } = this.props\r\n if (!source)\r\n return null\r\n\r\n const target = source.target\r\n const targetSupport = source.targetSupport\r\n return (\r\n \r\n {this.getInfoSection(source, target)}\r\n {target && }\r\n {target && this.getBaseDamageSection(source, target, targetSupport)}\r\n {target && }\r\n {target && this.getDamageMultiplierSection(source, target, isSupport)}\r\n {target && }\r\n {target && this.getStrengthSection(source, target)}\r\n {target && }\r\n {target && this.getMoraleSection(source, target)}\r\n \r\n )\r\n }\r\n\r\n toNumber = (value: number) => toNumber(value, 3)\r\n toAdd = (value: number) => value ? addSign(Number(this.toNumber(value))) : null\r\n toMultiplier = (value: number) => toMultiplier(value, 3)\r\n\r\n getBaseDamageSection = (source: IUnit, target: IUnit, targetSupport: IUnit | null) => {\r\n const { results, settings } = this.props\r\n const { round } = results\r\n const phase = getCombatPhase(round, settings)\r\n const phaseRoll = calculateCohortPips(source, target, targetSupport, UnitAttribute.Strength, phase)\r\n const moraleRoll = calculateCohortPips(source, target, targetSupport, UnitAttribute.Morale)\r\n const multi = phaseRoll || moraleRoll\r\n\r\n if (multi) {\r\n return (<>\r\n {this.getBaseDamageSubSection(source, target, targetSupport, UnitAttribute.Strength, phase)}\r\n {}\r\n {this.getBaseDamageSubSection(source, target, targetSupport, UnitAttribute.Morale, phase)}\r\n )\r\n }\r\n return (<>\r\n {this.getBaseDamageSubSection(source, target, targetSupport, '', phase)}\r\n )\r\n }\r\n\r\n getBaseDamageSubSection = (source: IUnit, target: IUnit, targetSupport: IUnit | null, type: UnitAttribute.Strength | UnitAttribute.Morale | '', phase: CombatPhase) => {\r\n const { settings, results } = this.props\r\n const { dice, terrainPips, generalPips } = results\r\n const basePips = settings[Setting.BasePips]\r\n const sourcePips = type ? getOffensiveCohortPips(source, type, phase) : 0\r\n const targetPips = type ? getDefensiveCohortPips(target, type, phase) : 0\r\n const targetSupportPips = type ? getDefensiveSupportCohortPips(targetSupport, type, phase) : 0\r\n const totalPips = basePips + dice + terrainPips + generalPips + sourcePips + targetPips + targetSupportPips\r\n const cappedPips = Math.min(totalPips, settings[Setting.MaxPips])\r\n const reductionToCap = Math.min(0, settings[Setting.MaxPips] - cappedPips)\r\n const text = type === UnitAttribute.Morale ? UnitAttribute.Morale : phase\r\n return (<>\r\n {this.renderModifier('Base pips', basePips, this.toAdd)}\r\n {this.renderModifier('Dice', dice, this.toAdd)}\r\n {this.renderModifier('Terrain pips', terrainPips, this.toAdd)}\r\n {this.renderModifier('General pips', generalPips, this.toAdd)}\r\n {this.renderModifier(text + ' pips', sourcePips, this.toAdd)}\r\n {this.renderModifier('Enemy ' + text.toLowerCase() + ' pips', targetPips, this.toAdd)}\r\n {this.renderModifier('Backrow ' + text.toLowerCase() + ' pips', targetSupportPips, this.toAdd)}\r\n {this.renderModifier('Above maximum', reductionToCap, this.toAdd)}\r\n {this.renderItem('Total ' + type.toLowerCase() + ' pips', cappedPips, this.toNumber)}\r\n )\r\n }\r\n\r\n getDamageMultiplierSection = (source: IUnit, target: IUnit, isSupport: boolean) => {\r\n const { terrains, settings, results } = this.props\r\n const { round, tacticBonus, dailyMultiplier } = results\r\n const phase = getCombatPhase(round, settings)\r\n const terrainTypes = settings[Setting.AttributeTerrainType] ? terrains.map(value => value.type) : []\r\n const strength = source[UnitAttribute.Strength] + source.strengthLoss\r\n const offenseVsDefense = settings[Setting.AttributeOffenseDefense] ? source[UnitAttribute.Offense] - target[UnitAttribute.Defense] : 0\r\n const experienceReduction = settings[Setting.AttributeExperience] ? target.experienceReduction : 0\r\n const targetType = settings[Setting.AttributeUnitType] ? source[target.type] : 0\r\n const isLoyal = source.isLoyal\r\n const multiplier = source.damageMultiplier\r\n const morale = (source[UnitAttribute.Morale] + source.moraleLoss) / source.maxMorale\r\n const damageLossForMissingMorale = (morale - 1) * settings[Setting.DamageLossForMissingMorale]\r\n\r\n return (<>\r\n {this.renderStyledItem('Lost morale', damageLossForMissingMorale, toSignedPercent)}\r\n {this.renderStyledItem('Tactic', tacticBonus, toSignedPercent)}\r\n {this.renderStyledItem('Enemy insufficient support', target.flankRatioPenalty - 1, toSignedPercent)}\r\n {this.renderStyledItem('Loyal', isLoyal ? 0.1 : 0, toSignedPercent)}\r\n {settings[Setting.AttributeDiscipline] !== DisciplineValue.Off && this.getAttribute(source, UnitAttribute.Discipline)}\r\n {settings[Setting.AttributeDamage] && this.getAttribute(source, UnitAttribute.DamageDone)}\r\n {settings[Setting.AttributeCombatAbility] && this.getAttribute(source, UnitAttribute.CombatAbility)}\r\n {this.renderStyledItem(target.type, targetType, toSignedPercent)}\r\n {this.renderStyledItem('Offense vs Defense', offenseVsDefense, toSignedPercent)}\r\n {settings[Setting.AttributeDiscipline] === DisciplineValue.Both && this.renderStyledItem('Target discipline', 1 / noZero(target[UnitAttribute.Discipline] + 1) - 1, toSignedPercent)}\r\n {this.renderStyledItem('Enemy experience', experienceReduction, toSignedPercent)}\r\n {settings[Setting.AttributeDamage] && this.getAttribute(target, UnitAttribute.DamageTaken)}\r\n {terrainTypes.map(terrain => this.getAttribute(source, terrain))}\r\n {isSupport && this.renderStyledItem(UnitAttribute.OffensiveSupport, source[UnitAttribute.OffensiveSupport] - 1, toSignedPercent)}\r\n {this.renderStyledItem('Battle length', dailyMultiplier - 1, toSignedPercent)}\r\n {settings[Setting.FireAndShock] && this.renderModifier(phase, source[phase], this.toMultiplier)}\r\n {settings[Setting.AttributeMilitaryTactics] && this.renderModifier('Target military tactics', 1 / noZero(target[UnitAttribute.MilitaryTactics]), this.toMultiplier)}\r\n {this.renderModifier('Unit strength', strength, this.toMultiplier)}\r\n {this.renderItem('Damage multiplier', multiplier, this.toMultiplier)}\r\n )\r\n }\r\n\r\n getStrengthSection = (source: IUnit, target: IUnit) => {\r\n const { settings, mode, results } = this.props\r\n const { round, tacticStrengthDamageMultiplier } = results\r\n const phase = getCombatPhase(round, settings)\r\n const strengthLostMultiplier = mode === Mode.Land ? settings[Setting.StrengthLostMultiplier] : settings[Setting.StrengthLostMultiplier] / 1000\r\n const strengthDamage = source.strengthDealt\r\n\r\n return (<>\r\n {this.renderModifier('Constant', strengthLostMultiplier, this.toMultiplier)}\r\n {this.renderStyledItem('Tactic casualties', tacticStrengthDamageMultiplier - 1, toSignedPercent)}\r\n {settings[Setting.FireAndShock] && this.getAttribute(source, phase === CombatPhase.Shock ? UnitAttribute.ShockDamageDone : UnitAttribute.FireDamageDone)}\r\n {settings[Setting.FireAndShock] && this.getAttribute(target, phase === CombatPhase.Shock ? UnitAttribute.ShockDamageTaken : UnitAttribute.FireDamageTaken)}\r\n {settings[Setting.AttributeStrengthDamage] && this.getAttribute(source, UnitAttribute.StrengthDamageDone)}\r\n {settings[Setting.AttributeStrengthDamage] && this.getAttribute(target, UnitAttribute.StrengthDamageTaken)}\r\n {this.renderItem('Strength damage', strengthDamage, value => strengthToValue(mode, value))}\r\n )\r\n }\r\n\r\n getMoraleSection = (source: IUnit, target: IUnit) => {\r\n const { settings } = this.props\r\n const moraleLostMultiplier = settings[Setting.MoraleLostMultiplier]\r\n const morale = settings[Setting.UseMaxMorale] ? source.maxMorale : (source[UnitAttribute.Morale] + source.moraleLoss)\r\n const moraleStr = settings[Setting.UseMaxMorale] ? 'Unit max morale' : 'Unit morale'\r\n const moraleDamage = source.moraleDealt\r\n\r\n return (<>\r\n {settings[Setting.MoraleDamageBasedOnTargetStrength] && this.renderStyledItem('Target strength', 1 / (target[UnitAttribute.Strength] + target.strengthLoss), toMultiplier)}\r\n {this.renderModifier('Constant', moraleLostMultiplier / 1000.0, this.toMultiplier)}\r\n {settings[Setting.AttributeMoraleDamage] && this.getAttribute(source, UnitAttribute.MoraleDamageDone)}\r\n {settings[Setting.AttributeMoraleDamage] && this.getAttribute(target, UnitAttribute.MoraleDamageTaken)}\r\n {this.renderModifier(moraleStr, morale, this.toMultiplier)}\r\n {this.renderItem('Morale damage', moraleDamage, this.toNumber)}\r\n )\r\n }\r\n\r\n getAttribute = (unit: IUnit, attribute: UnitAttribute | UnitType | TerrainType) => (\r\n this.renderStyledItem(attribute, unit[attribute], toSignedPercent)\r\n )\r\n\r\n getInfoSection = (source: IUnit, target: IUnit | null) => {\r\n const { mode } = this.props\r\n const moraleCurrent = source[UnitAttribute.Morale]\r\n const moraleMax = source.maxMorale\r\n const moraleLoss = -source.moraleLoss\r\n const strengthCurrent = source[UnitAttribute.Strength]\r\n const strengthLoss = -source.strengthLoss\r\n return (<>\r\n \r\n {getCohortName(source)}\r\n \r\n {source.isDefeated ? {'Defeated at round ' + source.defeatedDay} : null}\r\n \r\n {'Strength: '}\r\n {strengthToValue(mode, strengthCurrent)}\r\n {\r\n strengthLoss ?\r\n <>\r\n {' ('}\r\n strengthToValue(mode, value)} negativeColor={this.RED} />\r\n {')'}\r\n \r\n : null\r\n }\r\n\r\n \r\n \r\n {'Morale: '}\r\n {toMorale(moraleCurrent) + ' / ' + toMorale(moraleMax)}\r\n {\r\n moraleLoss ?\r\n <>\r\n {' ('}\r\n \r\n {')'}\r\n \r\n : null\r\n }\r\n \r\n \r\n {'Target: '}\r\n {target ? getCohortName(target) : 'No target'}\r\n \r\n )\r\n }\r\n\r\n renderStyledItem = (label: string, value: number, formatter: (value: number) => string) => {\r\n if (!value)\r\n return null\r\n return (\r\n \r\n {label}\r\n {': '}\r\n \r\n \r\n )\r\n }\r\n\r\n renderItem = (label: string, value: number, formatter: (value: number) => string) => {\r\n return (\r\n \r\n {label}\r\n {': '}\r\n {formatter(value)}\r\n \r\n )\r\n }\r\n\r\n renderModifier = (label: string, value: number, formatter: (value: number) => string | null) => {\r\n const str = formatter(value)\r\n if (!str)\r\n return null\r\n return (\r\n \r\n {label}\r\n {': '}\r\n {str}\r\n \r\n )\r\n }\r\n}\r\n\r\n\r\ninterface IUnit extends CohortProperties, Omit {\r\n target: IUnit | null\r\n targetSupport: IUnit | null\r\n}\r\n\r\nconst convertUnit = (cohort: Cohort | null, convertTarget: boolean = true): IUnit | null => {\r\n if (!cohort)\r\n return null\r\n return {\r\n ...cohort.properties,\r\n ...cohort.state,\r\n ...cohort,\r\n target: convertTarget ? convertUnit(cohort.state.target, false) : null,\r\n targetSupport: convertTarget && cohort.state.targetSupport ? convertUnit(cohort.state.targetSupport, false) : null\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState, props: Props) => ({\r\n source: (props.row !== null && props.column !== null) ? convertUnit(getCohort(state, props.side, props.part, props.row, props.column)) : null,\r\n results: getCombatSide(state, props.side).results,\r\n settings: getSettings(state),\r\n terrains: getSelectedTerrains(state),\r\n mode: getMode(state)\r\n})\r\n\r\nconst actions = {}\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ninterface IProps extends React.PropsWithChildren, S, D { }\r\n\r\nexport default connect(mapStateToProps, actions)(CombatTooltip)\r\n","import React, { Component, PureComponent } from 'react'\r\nimport { Table, Image, Icon } from 'semantic-ui-react'\r\n\r\nimport IconDefeated from 'images/attrition.png'\r\nimport { SideType, ArmyPart, CountryName, ArmyName } from 'types'\r\nimport { getImage, resize } from 'utils'\r\nimport { getCohortId } from 'managers/units'\r\nimport { chunk, flatten } from 'lodash'\r\nimport CombatTooltip from 'containers/CombatTooltip'\r\n\r\nexport type SharedProps = {\r\n side: SideType\r\n rowWidth: number\r\n reverse: boolean\r\n // SideType, participantIndex and index are needed to find the combat unit. CountryName, ArmyName and index are needed to find the definition.\r\n onClick: (side: SideType, participantIndex: number, index: number, country: CountryName, army: ArmyName) => void\r\n part: ArmyPart\r\n color: string\r\n // Renders full rows for a cleaner look.\r\n fullRows?: boolean\r\n markDefeated?: boolean\r\n}\r\n\r\ntype IProps = SharedProps & {\r\n cohorts: ICohort[][]\r\n timestamp: number\r\n onDeleteCohort: (cohort: ICohort) => void\r\n}\r\n\r\ntype IState = {\r\n tooltipRow: number | null\r\n tooltipColumn: number | null\r\n tooltipContext: HTMLElement | null\r\n tooltipIsSupport: boolean\r\n}\r\n\r\nconst MORALE_COLOR = 'rgba(200,55,55,0.60)'\r\nconst MANPOWER_COLOR = 'rgba(0,0,0,0.90)'\r\nconst WHITE_COLOR = 'rgba(255,255,255,0)'\r\n\r\n/**\r\n * Shows a table of cohorts of an army (frontline, reserve, defeated or retreated).\r\n */\r\nexport default class TableArmyPart extends Component {\r\n constructor(props: IProps) {\r\n super(props)\r\n this.state = { tooltipRow: null, tooltipColumn: null, tooltipContext: null, tooltipIsSupport: false }\r\n }\r\n\r\n shouldComponentUpdate(prevProps: IProps, prevState: IState) {\r\n return prevProps.timestamp !== this.props.timestamp || prevState.tooltipRow !== this.state.tooltipRow || prevState.tooltipColumn !== this.state.tooltipColumn\r\n }\r\n\r\n render() {\r\n const { rowWidth, side, part, fullRows, reverse } = this.props\r\n const { tooltipRow, tooltipColumn, tooltipContext, tooltipIsSupport } = this.state\r\n let cohorts = this.props.cohorts\r\n let indexOffset = 0\r\n cohorts = flatten(cohorts.map(arr => chunk(arr, rowWidth)))\r\n if (!cohorts.length)\r\n cohorts.push([])\r\n if (fullRows) {\r\n cohorts = cohorts.map(arr => resize(arr, rowWidth, null))\r\n\r\n } else {\r\n // For display purposes, smaller combat width turns extra slots grey instead of removing them.\r\n const filler = Math.max(0, rowWidth - cohorts[0].length)\r\n const leftFiller = indexOffset = Math.ceil(filler / 2.0)\r\n const rightFiller = Math.floor(filler / 2.0)\r\n cohorts = cohorts.map(row => Array(leftFiller).fill(undefined).concat(row).concat(Array(rightFiller).fill(undefined)))\r\n }\r\n if (reverse)\r\n cohorts.reverse()\r\n return (\r\n <>\r\n \r\n \r\n \r\n {\r\n cohorts.map((row, rowIndex) => {\r\n rowIndex = reverse ? cohorts.length - 1 - rowIndex : rowIndex\r\n return (\r\n < Table.Row key={rowIndex} textAlign='center' >\r\n \r\n \r\n \r\n {\r\n row.map((cohort, columnIndex) => {\r\n columnIndex -= indexOffset\r\n if (part === ArmyPart.Frontline)\r\n return this.renderCell(rowIndex, columnIndex, cohort, rowIndex > 0)\r\n else\r\n return this.renderCell(0, rowIndex * rowWidth + columnIndex, cohort, rowIndex > 0)\r\n })\r\n }\r\n \r\n )\r\n })\r\n }\r\n \r\n
\r\n \r\n )\r\n }\r\n\r\n renderCell = (row: number, column: number, cohort: ICohort, isSupport: boolean) => {\r\n const { side, onClick, markDefeated, onDeleteCohort } = this.props\r\n const filler = cohort === undefined\r\n return (\r\n cohort && onClick(side, cohort.participantIndex, cohort.index, cohort.countryName, cohort.armyName)}\r\n onMouseOver={(e: React.MouseEvent) => cohort && this.setState({ tooltipRow: row, tooltipColumn: column, tooltipContext: e.currentTarget as HTMLElement, tooltipIsSupport: isSupport })}\r\n onMouseLeave={() => cohort && this.state.tooltipRow === row && this.state.tooltipColumn === column && this.setState({ tooltipRow: null, tooltipColumn: null, tooltipContext: null })}\r\n onContextMenu={(e: any) => e.preventDefault() || onDeleteCohort(cohort)}\r\n >\r\n \r\n \r\n )\r\n }\r\n\r\n getIcon = () => {\r\n const { part: type, reverse } = this.props\r\n if (type === ArmyPart.Frontline)\r\n return reverse ? 'arrow down' : 'arrow up'\r\n if (type === ArmyPart.Reserve)\r\n return 'home'\r\n if (type === ArmyPart.Defeated)\r\n return 'heartbeat'\r\n if (type === ArmyPart.Retreated)\r\n return 'trash'\r\n return 'square full'\r\n }\r\n}\r\n\r\ntype CellProps = {\r\n strength: number\r\n maxStrength: number\r\n morale: number\r\n maxMorale: number\r\n isDefeated: boolean\r\n image: string | null\r\n}\r\n\r\n/** Sub-component to hopefully help with performance (easier to prevent renders). */\r\nclass Cell extends PureComponent {\r\n\r\n render() {\r\n const { strength, maxStrength, morale, maxMorale, isDefeated, image } = this.props\r\n if (!image)\r\n return this.renderImage(getImage(null))\r\n if (isDefeated)\r\n return this.renderImage(IconDefeated)\r\n return (\r\n
\r\n
\r\n {this.renderImage(getImage({ image }))}\r\n
\r\n
\r\n )\r\n }\r\n\r\n renderImage = (image: string) => \r\n\r\n gradient = (color: string, current: number, max: number) => (\r\n 'linear-gradient(0deg, ' + color + ' 0%, ' + color + ' ' + this.percent(current, max) + '%, ' + WHITE_COLOR + ' ' + this.percent(current, max) + '%, ' + WHITE_COLOR + ' 100%)'\r\n )\r\n\r\n percent = (current: number, max: number) => 100.0 - 100.0 * current / max\r\n}\r\n\r\nexport type ICohort = {\r\n countryName: CountryName\r\n armyName: ArmyName\r\n participantIndex: number\r\n index: number\r\n isDefeated: boolean\r\n image?: string\r\n maxMorale: number\r\n maxStrength: number\r\n morale: number\r\n strength: number\r\n} | null\r\n\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport { Grid } from 'semantic-ui-react'\r\n\r\nimport { UnitAttribute, Cohort } from 'types'\r\nimport { AppState, getCohorts, getBattle } from 'state'\r\nimport { getArmyPart } from 'army_utils'\r\nimport { deleteCohort } from 'reducers'\r\nimport { flatten } from 'lodash'\r\nimport TableArmyPart, { ICohort, SharedProps } from 'components/TableArmyPart'\r\n\r\ntype Props = SharedProps & {\r\n hideIfEmpty?: boolean\r\n}\r\n\r\n/**\r\n * Handles data mapping for TableArmyPart, splitting the complex component.\r\n * Also supports hiding the table and parent grid row if no cohorts.\r\n */\r\nclass GridRowArmyPart extends Component {\r\n\r\n render() {\r\n const { timestamp, hideIfEmpty, cohorts } = this.props\r\n if (hideIfEmpty && !flatten(cohorts).length)\r\n return null\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n deleteCohort = (cohort: ICohort) => {\r\n if (!cohort)\r\n return\r\n const { deleteCohort } = this.props\r\n deleteCohort(cohort.countryName, cohort.armyName, cohort.index)\r\n }\r\n}\r\n\r\nconst convertCohorts = (cohorts: (Cohort | null)[][]): ICohort[][] => (\r\n cohorts.map(row => row.map(cohort => cohort && {\r\n index: cohort.properties.index,\r\n participantIndex: cohort.properties.participantIndex,\r\n armyName: cohort.properties.armyName,\r\n countryName: cohort.properties.countryName,\r\n isDefeated: cohort.state.isDefeated,\r\n image: cohort.properties.image,\r\n morale: cohort[UnitAttribute.Morale],\r\n maxMorale: cohort.properties.maxMorale,\r\n strength: cohort[UnitAttribute.Strength],\r\n maxStrength: cohort.properties.maxStrength\r\n }))\r\n)\r\n\r\nconst mapStateToProps = (state: AppState, props: Props) => ({\r\n cohorts: convertCohorts(getArmyPart(getCohorts(state, props.side), props.part)),\r\n timestamp: getBattle(state).timestamp\r\n})\r\n\r\nconst actions = { deleteCohort }\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ntype IProps = Props & S & D\r\n\r\nexport default connect(mapStateToProps, actions)(GridRowArmyPart)\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport LineTo from 'react-lineto'\r\n\r\nimport { AppState, getCohorts } from 'state'\r\nimport { ArmyPart, SideType, Cohort } from 'types'\r\nimport { getArmyPart, getOpponent } from 'army_utils'\r\nimport { getCohortId } from 'managers/units'\r\n\r\ntype Props = {\r\n type: ArmyPart\r\n visible: boolean\r\n attackerColor: string\r\n defenderColor: string\r\n}\r\n\r\n/**\r\n * Display component for showing attack targets for both sides.\r\n */\r\nclass TargetArrows extends Component {\r\n\r\n render() {\r\n const { attacker, defender, attackerColor, defenderColor, visible } = this.props\r\n if (!visible)\r\n return null\r\n return (\r\n <>\r\n {attacker.map(row => row.map(unit => this.renderAttacker(unit, attackerColor)))}\r\n {defender.map(row => row.map(unit => this.renderDefender(unit, defenderColor)))}\r\n \r\n )\r\n }\r\n renderAttacker = (unit: IUnit, color: string) => {\r\n if (!unit || !unit.target)\r\n return null\r\n const fromStr = unit.id\r\n const toStr = unit.target\r\n return this.renderArrow(fromStr, toStr, 'bottom', 'top', color)\r\n }\r\n\r\n renderDefender = (unit: IUnit, color: string) => {\r\n if (!unit || !unit.target)\r\n return null\r\n const fromStr = unit.id\r\n const toStr = unit.target\r\n return this.renderArrow(fromStr, toStr, 'top', 'bottom', color)\r\n }\r\n\r\n renderArrow = (from: string, to: string, fromAnchor: string, toAnchor: string, borderColor: string) => (\r\n \r\n )\r\n}\r\n\r\ntype IUnit = {\r\n id: string\r\n target: string | null\r\n} | null\r\n\r\nconst convertUnits = (side: SideType, units: (Cohort | null)[][]): IUnit[][] => (\r\n units.map(row => row.map(cohort => cohort ? { id: getCohortId(side, cohort.properties), target: cohort.state.target ? getCohortId(getOpponent(side), cohort.state.target.properties) : null } : null))\r\n)\r\n\r\nconst mapStateToProps = (state: AppState, props: Props) => ({\r\n attacker: convertUnits(SideType.A, getArmyPart(getCohorts(state, SideType.A), props.type)),\r\n defender: convertUnits(SideType.B, getArmyPart(getCohorts(state, SideType.B), props.type)),\r\n})\r\n\r\nconst actions = {}\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ninterface IProps extends React.PropsWithChildren, S, D { }\r\n\r\nexport default connect(mapStateToProps, actions)(TargetArrows)\r\n","import React, { Component } from 'react'\r\nimport { TerrainType, Terrain, TerrainCalc, SiteSettings } from 'types'\r\nimport { calculateValue } from 'definition_values'\r\nimport DropdownTable from './DropdownTable'\r\nimport StyledNumber from 'components/Utils/StyledNumber'\r\nimport { addSign } from 'formatters'\r\nimport LabelItem from 'components/Utils/LabelUnit'\r\n\r\ntype IProps = {\r\n value: TerrainType\r\n values: Terrain[]\r\n onSelect: (type: TerrainType) => void\r\n settings: SiteSettings\r\n}\r\n\r\nexport default class DropdownTerrain extends Component {\r\n\r\n getContent = (terrain: Terrain) => ([\r\n ,\r\n \r\n ])\r\n\r\n isActive = (item: Terrain) => item.type === this.props.value\r\n\r\n getValue = (item: Terrain) => item.type\r\n getText = (item: Terrain) => item.type\r\n\r\n\r\n headers = ['Terrain', 'Attacker roll']\r\n\r\n render() {\r\n const { value, values, onSelect, settings } = this.props\r\n return (\r\n \r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport { Image, Table } from 'semantic-ui-react'\r\n\r\nimport { AppState, getMode, getSelectedTerrains, getSiteSettings } from 'state'\r\nimport IconDice from 'images/chance.png'\r\nimport StyledNumber from 'components/Utils/StyledNumber'\r\nimport { Terrain, TerrainCalc, TerrainType } from 'types'\r\nimport { calculateValue } from 'definition_values'\r\nimport { addSign } from 'formatters'\r\nimport { selectTerrain } from 'reducers'\r\nimport DropdownTerrain from 'components/Dropdowns/DropdownTerrain'\r\nimport { toArr } from 'utils'\r\n\r\ntype Props = {\r\n}\r\n\r\n/**\r\n * Table with row types and flank sizes.\r\n */\r\nclass TerrainSelector extends Component {\r\n\r\n render() {\r\n const { selected: terrains } = this.props\r\n return (\r\n \r\n \r\n \r\n \r\n Location\r\n \r\n \r\n Terrain\r\n \r\n \r\n Roll modifier\r\n \r\n \r\n \r\n \r\n {terrains.map(this.renderTerrain)}\r\n \r\n
\r\n )\r\n }\r\n\r\n renderTerrain = (definition: Terrain, index: number) => {\r\n const { terrains, settings } = this.props\r\n const roll = calculateValue(definition, TerrainCalc.Roll)\r\n return (\r\n \r\n \r\n {definition.location}\r\n \r\n \r\n item.location === definition.location)}\r\n onSelect={type => this.selectTerrain(type, index)}\r\n settings={settings}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n selectTerrain = (type: TerrainType, index: number): void => {\r\n const { selectTerrain } = this.props\r\n selectTerrain(index, type)\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState) => ({\r\n selected: getSelectedTerrains(state),\r\n terrains: toArr(state.terrains),\r\n mode: getMode(state),\r\n settings: getSiteSettings(state)\r\n})\r\n\r\nconst actions = { selectTerrain }\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ntype IProps = Props & S & D\r\n\r\nexport default connect(mapStateToProps, actions)(TerrainSelector)\r\n","import React, { Component } from 'react'\r\nimport { Popup } from 'semantic-ui-react'\r\n\r\ntype Props = {\r\n getContent: () => JSX.Element\r\n}\r\n\r\n/**\r\n * Generic tooltip.\r\n */\r\nexport default class Tooltip extends Component {\r\n\r\n render() {\r\n return (\r\n \r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport { Grid, Button, List } from 'semantic-ui-react'\r\n\r\nimport StyledNumber from 'components/Utils/StyledNumber'\r\n\r\nimport { AppState, getCombatEnvironment, convertSides } from 'state'\r\nimport { toPercent, toFlooredPercent, toNumber, toSignedPercent } from 'formatters'\r\nimport { interrupt, calculateWinRate } from 'combat'\r\nimport { showProgress } from 'utils'\r\nimport { Setting, WinRateProgress, CasualtiesProgress } from 'types'\r\nimport Tooltip from 'components/Tooltip'\r\n\r\ninterface Props { }\r\n\r\ntype IState = {\r\n attacker: number\r\n defender: number\r\n draws: number\r\n incomplete: number\r\n calculating: boolean\r\n progress: number\r\n updates: number\r\n battles: number\r\n avgStrengthA: number\r\n maxStrengthA: number\r\n avgStrengthB: number\r\n maxStrengthB: number\r\n winRateA: number\r\n winRateB: number\r\n}\r\n\r\nconst DOTS = 6\r\nconst ATTACKER_COLOR = 'color-attacker'\r\nconst DEFENDER_COLOR = 'color-defender'\r\n/**\r\n * Calculates win rate for the current battle.\r\n */\r\nclass WinRate extends Component {\r\n constructor(props: IProps) {\r\n super(props)\r\n this.state = {\r\n attacker: 0, defender: 0, calculating: false, progress: 0, updates: 0, draws: 0, incomplete: 0, battles: 0,\r\n avgStrengthA: 0, maxStrengthA: 0, avgStrengthB: 0, maxStrengthB: 0, winRateA: 0, winRateB: 0\r\n }\r\n }\r\n\r\n toPercent = (value: number) => toPercent(value, 0)\r\n toTooltipPercent = (value: number) => toPercent(value, 1)\r\n toSignedTooltipPercent = (value: number) => toSignedPercent(value, 1)\r\n toTooltipNumber = (value: number) => toNumber(value, 3)\r\n\r\n willUnmount = false\r\n componentWillUnmount() {\r\n this.willUnmount = true\r\n interrupt()\r\n }\r\n\r\n render() {\r\n const {\r\n attacker, defender, calculating, progress, updates, draws, incomplete,\r\n avgStrengthA, maxStrengthA, avgStrengthB: avgStrengthD, maxStrengthB: maxStrengthD\r\n } = this.state\r\n return (\r\n \r\n \r\n \r\n \r\n calculating ? interrupt() : this.calculate()}\r\n >\r\n {calculating ? showProgress(toFlooredPercent(progress, 0), updates, DOTS) : 'Analyze'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Win rate\r\n
\r\n \r\n {' / '}\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n Losses\r\n
\r\n \r\n {' / '}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n )\r\n }\r\n\r\n getInfoTooltip = () => {\r\n return (\r\n
\r\n

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

\r\n

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

\r\n

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

\r\n
\r\n )\r\n }\r\n\r\n getWinChanceTooltip = () => {\r\n const { attacker, defender, draws, incomplete, battles } = this.state\r\n return (\r\n
\r\n \r\n \r\n Attacker: {}\r\n \r\n \r\n Defender: {}\r\n \r\n {\r\n this.scale(draws) > 0.0005 ?\r\n \r\n Draws: {this.toTooltipPercent(this.scale(draws))}\r\n \r\n : null\r\n }\r\n {\r\n this.scale(incomplete) > 0.0005 ?\r\n \r\n Incomplete: {this.toTooltipPercent(this.scale(incomplete))}\r\n \r\n : null\r\n }\r\n \r\n \r\n Battles: {battles}\r\n \r\n
\r\n )\r\n }\r\n\r\n getCasualtiesTooltip = () => {\r\n const { winRateA, winRateB, battles, avgStrengthA, maxStrengthA, avgStrengthB, maxStrengthB } = this.state\r\n return (\r\n
\r\n \r\n \r\n Attacker:{' '}\r\n {}\r\n {' ('}\r\n {}\r\n {')'}\r\n \r\n \r\n Defender:{' '}\r\n {}\r\n {' ('}\r\n {}\r\n {')'}\r\n \r\n \r\n Casualties win rate:{' '}\r\n {}\r\n {' / '}\r\n {}\r\n \r\n \r\n Casualties balance:{' '}\r\n {}\r\n {' / '}\r\n {}\r\n \r\n \r\n \r\n Battles: {battles}\r\n \r\n
\r\n )\r\n }\r\n\r\n update = (update: WinRateProgress, casualties: CasualtiesProgress) => {\r\n if (this.willUnmount)\r\n return\r\n const { attacker, defender, progress, calculating, draws, incomplete, battles } = update\r\n this.setState({\r\n attacker, defender, progress, calculating, draws, incomplete, updates: calculating ? (this.state.updates + 1) % DOTS : 0, battles,\r\n ...casualties\r\n })\r\n }\r\n\r\n calculate = () => {\r\n const { state } = this.props\r\n // Initialization done here to prevent it happening on every render.\r\n const environment = getCombatEnvironment(state)\r\n const [attacker, defender] = convertSides(state)\r\n environment.settings = { ...environment.settings, [Setting.CalculateWinChance]: true, [Setting.CalculateCasualties]: true, [Setting.CalculateResourceLosses]: false }\r\n calculateWinRate(this.update, environment, attacker, defender)\r\n }\r\n\r\n scale = (value: number) => this.state.progress ? value / this.state.progress : 0\r\n}\r\n\r\nconst mapStateToProps = (state: AppState) => ({ state })\r\n\r\nconst actions = {}\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ninterface IProps extends React.PropsWithChildren, S, D { }\r\n\r\nexport default connect(mapStateToProps, actions)(WinRate)\r\n","import React, { Component } from 'react'\r\n\r\nimport { toPercent, toNumber } from 'formatters'\r\nimport { Input } from 'semantic-ui-react'\r\n\r\ntype IProps = {\r\n value: number\r\n type?: string\r\n onChange: (value: number) => void\r\n disabled?: boolean\r\n percent?: boolean\r\n delay?: number\r\n}\r\n\r\ntype IState = {\r\n value: string\r\n timer: NodeJS.Timeout | null\r\n}\r\n\r\n/**\r\n * Custom numeric input which only send an update for numeric value when losing focus or after a delay.\r\n * This allows entering decimal numbers without the input resetting and also prevents stuttering when the battle doesn't update after every keystroke.\r\n * */\r\nexport default class DelayedNumericInput extends Component {\r\n\r\n constructor(props: IProps) {\r\n super(props)\r\n this.state = { value: this.convertValue(props.value), timer: null }\r\n }\r\n\r\n convertValue = (value: number) => {\r\n const { percent } = this.props\r\n return percent ? toPercent(value) : toNumber(value)\r\n }\r\n\r\n shouldComponentUpdate(prevProps: IProps, prevState: IState) {\r\n return this.state.value !== prevState.value || prevProps.value !== this.props.value\r\n }\r\n\r\n componentDidUpdate(prevProps: IProps) {\r\n if (prevProps.value !== this.props.value)\r\n this.setState({ value: this.convertValue(this.props.value) })\r\n }\r\n\r\n render() {\r\n const { disabled, type } = this.props\r\n const { value } = this.state\r\n return (\r\n
\r\n this.onChange(value)}\r\n onKeyPress={this.onKeyPress}\r\n onFocus={(e: React.FocusEvent) => e.target.select()}\r\n />\r\n
\r\n\r\n )\r\n }\r\n\r\n onKeyPress = (event: React.KeyboardEvent) => {\r\n if (event.key === 'Enter')\r\n this.onLostFocus()\r\n }\r\n\r\n onLostFocus = () => {\r\n if (this.state.timer)\r\n clearTimeout(this.state.timer)\r\n this.update()\r\n }\r\n\r\n onChange = (value: string) => {\r\n if (this.state.timer)\r\n clearTimeout(this.state.timer)\r\n this.setState({ value, timer: setTimeout(this.update, this.props.delay ?? 2000) })\r\n }\r\n\r\n update = () => {\r\n const { value, onChange, percent } = this.props\r\n let newValue = Number(percent ? this.state.value.replace('%', '') : this.state.value)\r\n if (percent)\r\n newValue /= 100.0\r\n // Non-numeric values should just reset the previous value.\r\n if (Number.isNaN(newValue))\r\n this.setState({ value: this.convertValue(value) })\r\n else {\r\n this.setState({ value: this.convertValue(newValue) })\r\n if (value !== newValue)\r\n onChange(newValue)\r\n }\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\n\r\nimport { UnitAttribute, UnitDefinition, ValuesType, CountryName, getAttributeValuesType } from 'types'\r\nimport { setUnitValue } from 'reducers'\r\nimport DelayedNumericInput from 'components/Detail/DelayedNumericInput'\r\nimport { filterValues, calculateBase, calculateModifier } from 'definition_values'\r\n\r\ntype Props = {\r\n unit: UnitDefinition\r\n country: CountryName\r\n identifier?: string\r\n attribute: UnitAttribute\r\n percent?: boolean\r\n type?: ValuesType\r\n}\r\n\r\n/** \r\n * Custom numeric input for setting attribute values for a unit.\r\n */\r\nclass UnitValueInput extends Component {\r\n render() {\r\n const { unit, attribute, percent, type } = this.props\r\n const valuesType = type ?? getAttributeValuesType(attribute)\r\n let value = 0\r\n if (valuesType === ValuesType.Base)\r\n value = calculateBase(unit, attribute)\r\n else\r\n value = calculateModifier(unit, attribute)\r\n return (\r\n \r\n )\r\n }\r\n\r\n getKey = () => this.props.identifier || 'Custom'\r\n\r\n onChange = (value: number) => {\r\n const { unit, attribute, setUnitValue, country, type } = this.props\r\n const valuesType = type ?? getAttributeValuesType(attribute)\r\n let base = 0\r\n if (valuesType === ValuesType.Base)\r\n base = calculateBase(unit, attribute) - calculateBase(filterValues(unit, this.getKey()), attribute)\r\n else\r\n base = calculateModifier(unit, attribute) - calculateModifier(filterValues(unit, this.getKey()), attribute)\r\n setUnitValue(country, unit.type, valuesType, this.getKey(), attribute, value - base)\r\n }\r\n}\r\n\r\nconst mapStateToProps = () => ({})\r\n\r\nconst actions = { setUnitValue }\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ninterface IProps extends React.PropsWithChildren, S, D { }\r\n\r\nexport default connect(mapStateToProps, actions)(UnitValueInput)\r\n","import React, { Component } from 'react'\r\nimport { UnitType, UnitAttribute, CombatPhase, SiteSettings, UnitDefinition } from 'types'\r\nimport DropdownTable from './DropdownTable'\r\nimport { calculateValue } from 'definition_values'\r\n\r\ninterface IProps {\r\n value: UnitType\r\n values: UnitDefinition[]\r\n onSelect: (type: UnitType) => void\r\n settings: SiteSettings\r\n}\r\n\r\nexport default class DropdownArchetype extends Component {\r\n\r\n getContent = (unit: UnitDefinition) => ([\r\n unit.type,\r\n unit.tech ?? '',\r\n calculateValue(unit, UnitAttribute.OffensiveFirePips) + '/' + calculateValue(unit, UnitAttribute.DefensiveFirePips),\r\n calculateValue(unit, UnitAttribute.OffensiveShockPips) + '/' + calculateValue(unit, UnitAttribute.DefensiveShockPips),\r\n calculateValue(unit, UnitAttribute.OffensiveMoralePips) + '/' + calculateValue(unit, UnitAttribute.DefensiveMoralePips)\r\n ])\r\n\r\n isActive = (item: UnitDefinition) => item.type === this.props.value\r\n\r\n getValue = (item: UnitDefinition) => item.type\r\n\r\n getText = (item: UnitDefinition) => item.type + ' (' + (item.tech ?? 0) + ')'\r\n\r\n headers = ['Unit', 'Tech', CombatPhase.Fire, CombatPhase.Shock, UnitAttribute.Morale]\r\n\r\n render() {\r\n const { value, values, onSelect, settings } = this.props\r\n return (\r\n \r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport { Image, Table } from 'semantic-ui-react'\r\n\r\nimport { SideType, UnitRole, CountryName, UnitType, UnitAttribute, filterAttributes, Setting, UnitDefinition, Mode, CountryAttribute, ArmyName, CultureType } from 'types'\r\nimport { getImage, mapRange } from 'utils'\r\nimport { AppState, getUnitPreferences, getCountry, getMode, getOverridenReserveDefinitions, getSiteSettings, getUnitDefinitions } from 'state'\r\nimport { addToReserve, removeFromReserve, setUnitPreference, selectCulture } from 'reducers'\r\nimport { getArchetypes, getActualUnits, getLatestUnits, getChildUnits, getRootUnit } from 'managers/army'\r\nimport UnitValueInput from './UnitValueInput'\r\nimport AttributeImage from 'components/Utils/AttributeImage'\r\nimport DelayedNumericInput from 'components/Detail/DelayedNumericInput'\r\nimport { applyLosses } from 'managers/units'\r\nimport DropdownArchetype from 'components/Dropdowns/DropdownArchetype'\r\nimport { getCultures } from 'data'\r\nimport SimpleDropdown from 'components/Dropdowns/SimpleDropdown'\r\n\r\ntype Props = {\r\n side: SideType\r\n countryName: CountryName\r\n armyName: ArmyName\r\n onRowClick: (country: CountryName, army: ArmyName, type: UnitType) => void\r\n}\r\n\r\nclass TableUnitTypes extends Component {\r\n\r\n shouldComponentUpdate(nextProps: IProps) {\r\n if (this.props.preferences !== nextProps.preferences)\r\n return true\r\n return true\r\n }\r\n\r\n getAttributes = () => {\r\n const { mode } = this.props\r\n if (process.env.REACT_APP_GAME === 'euiv')\r\n return [UnitAttribute.Discipline, UnitAttribute.Morale, UnitAttribute.CombatAbility]\r\n else {\r\n if (mode === Mode.Naval)\r\n return [UnitAttribute.Discipline, UnitAttribute.Morale, UnitAttribute.DamageDone, UnitAttribute.DamageTaken]\r\n return [UnitAttribute.Discipline, UnitAttribute.Morale, UnitAttribute.Offense, UnitAttribute.Defense]\r\n }\r\n }\r\n\r\n checkPreference = (role: UnitRole) => {\r\n const { units, preferences, tech, countryName: country, armyName: army } = this.props\r\n const preference = preferences[role]\r\n const techRequirement = preference && units[preference] && units[preference].tech\r\n if (techRequirement && techRequirement > tech) {\r\n setUnitPreference(country, army, role, null)\r\n }\r\n }\r\n\r\n componentDidUpdate() {\r\n this.checkPreference(UnitRole.Front)\r\n this.checkPreference(UnitRole.Flank)\r\n this.checkPreference(UnitRole.Support)\r\n }\r\n\r\n render() {\r\n const { side, settings, units, mode } = this.props\r\n const unitList = settings[Setting.Tech] ? getArchetypes(units, mode) : getActualUnits(units, mode)\r\n return (\r\n \r\n \r\n \r\n \r\n {side}\r\n \r\n \r\n Amount\r\n \r\n {\r\n filterAttributes(this.getAttributes(), settings).map(attribute => (\r\n \r\n \r\n \r\n ))\r\n }\r\n \r\n \r\n \r\n {this.renderRootUnitRow(getRootUnit(units, mode))}\r\n {!settings[Setting.Tech] && unitList.map(this.renderUnitRow)}\r\n {settings[Setting.Tech] && this.renderRoleRow(UnitRole.Front, unitList)}\r\n {settings[Setting.Tech] && this.renderRoleRow(UnitRole.Flank, unitList)}\r\n {settings[Setting.Tech] && this.renderRoleRow(UnitRole.Support, unitList)}\r\n \r\n
\r\n )\r\n }\r\n\r\n renderRoleRow = (role: UnitRole, archetypes: UnitDefinition[]) => {\r\n // List of archetypes -> get archetype -> get image\r\n const { units, setUnitPreference, countryName: country, armyName: army, preferences, tech, settings, onRowClick } = this.props\r\n const archetype = archetypes.find(unit => unit.role === role)\r\n const preference = preferences[role]\r\n if (!archetype || !preference)\r\n return null\r\n const image = getImage(archetype)\r\n const latestType = getLatestUnits(units, tech)\r\n const latest = { ...units[latestType[role] || archetype.type], type: UnitType.Latest }\r\n const children = [latest].concat(...getChildUnits(units, tech, archetype.type))\r\n return (\r\n <>\r\n \r\n onRowClick(country, army, archetype.type)} selectable className='padding'>\r\n \r\n setUnitPreference(country, army, role, type)}\r\n settings={settings}\r\n />\r\n \r\n \r\n {this.renderCohortCount(archetype.type)}\r\n \r\n {\r\n filterAttributes(this.getAttributes(), settings).map(attribute => (\r\n \r\n \r\n \r\n ))\r\n }\r\n \r\n \r\n )\r\n }\r\n\r\n renderUnitRow = (unit: UnitDefinition) => {\r\n const { countryName: country, settings, armyName: army, onRowClick } = this.props\r\n if (!unit)\r\n return null\r\n const image = getImage(unit)\r\n return (\r\n \r\n onRowClick(country, army, unit.type)} selectable>\r\n \r\n {unit.type}\r\n \r\n \r\n {this.renderCohortCount(unit.type)}\r\n \r\n {\r\n filterAttributes(this.getAttributes(), settings).map(attribute => (\r\n \r\n \r\n \r\n ))\r\n }\r\n \r\n )\r\n }\r\n\r\n renderRootUnitRow = (unit: UnitDefinition) => {\r\n const { countryName: country, settings, armyName: army, onRowClick, culture } = this.props\r\n if (!unit)\r\n return null\r\n const image = getImage(unit)\r\n return (\r\n \r\n onRowClick(country, army, unit.type)} selectable>\r\n \r\n {\r\n settings[Setting.Culture] ?\r\n this.selectCulture(country, item)}\r\n /> : 'Army'\r\n }\r\n \r\n \r\n {\r\n filterAttributes(this.getAttributes(), settings).map(attribute => (\r\n \r\n \r\n \r\n ))\r\n }\r\n \r\n )\r\n }\r\n\r\n renderCohortCount = (type: UnitType) => {\r\n const { reserve } = this.props\r\n const count = reserve.filter(cohort => cohort.type === type).length\r\n return (\r\n this.updateReserve(type, value)} />\r\n )\r\n }\r\n\r\n updateReserve = (type: UnitType, amount: number) => {\r\n const { countryName: country, addToReserve, armyName: army, removeFromReserve, reserve, weariness } = this.props\r\n const previous = reserve.filter(cohort => cohort.type === type).length\r\n if (amount > previous) {\r\n const units = mapRange(amount - previous, _ => ({ type, image: '' }))\r\n addToReserve(country, army, applyLosses(weariness, units))\r\n }\r\n if (amount < previous) {\r\n const types = mapRange(previous - amount, _ => type)\r\n removeFromReserve(country, army, types)\r\n }\r\n }\r\n\r\n selectCulture = (country: CountryName, culture: CultureType) => {\r\n const { selectCulture } = this.props\r\n selectCulture(country, culture, false)\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState, props: Props) => {\r\n const { countryName, armyName } = props\r\n return {\r\n preferences: getUnitPreferences(state, countryName, armyName),\r\n reserve: getOverridenReserveDefinitions(state, countryName, armyName, true),\r\n units: getUnitDefinitions(state, countryName, armyName),\r\n culture: getCountry(state, countryName).culture,\r\n tech: getCountry(state, countryName)[CountryAttribute.TechLevel],\r\n settings: getSiteSettings(state),\r\n weariness: getCountry(state, countryName).weariness,\r\n mode: getMode(state)\r\n }\r\n}\r\n\r\nconst actions = { addToReserve, removeFromReserve, setUnitPreference, selectCulture }\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ninterface IProps extends React.PropsWithChildren, S, D { }\r\n\r\nexport default connect(mapStateToProps, actions)(TableUnitTypes)\r\n","import React, { Component } from 'react'\r\nimport { TacticType, Tactic, SiteSettings, TacticMatch } from 'types'\r\nimport DropdownTable from './DropdownTable'\r\nimport StyledNumber from 'components/Utils/StyledNumber'\r\nimport { toPercent, toSignedPercent } from 'formatters'\r\nimport LabelItem from 'components/Utils/LabelUnit'\r\n\r\ntype IProps = {\r\n value: TacticType\r\n values: Tactic[]\r\n settings: SiteSettings\r\n onSelect: (type: TacticType) => void\r\n}\r\n\r\nexport default class DropdownTactic extends Component {\r\n\r\n getContent = (tactic: Tactic) => ([\r\n ,\r\n ,\r\n ,\r\n \r\n ])\r\n\r\n isActive = (item: Tactic) => item.type === this.props.value\r\n isPositive = (item: Tactic) => item.match === TacticMatch.Positive\r\n isNegative = (item: Tactic) => item.match === TacticMatch.Negative\r\n\r\n getValue = (item: Tactic) => item.type\r\n\r\n\r\n headers = ['Tactic', 'Effect', 'Damage', 'Casualties']\r\n\r\n render() {\r\n const { value, values, onSelect, settings } = this.props\r\n return (\r\n tactic.type === value)} />}\r\n settings={settings}\r\n width={150}\r\n />\r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport { AppState, getSelectedTactic, getSiteSettings, getParticipant, getTactics } from 'state'\r\nimport { selectTactic } from 'reducers'\r\nimport { SideType, TacticType } from 'types'\r\nimport DropdownTactic from 'components/Dropdowns/DropdownTactic'\r\n\r\ntype Props = {\r\n side: SideType\r\n index: number\r\n}\r\n\r\nclass TacticSelector extends Component {\r\n render() {\r\n const { tactic, tactics, settings } = this.props\r\n return (\r\n \r\n )\r\n }\r\n\r\n selectTactic = (type: TacticType) => {\r\n const { participant, selectTactic } = this.props\r\n selectTactic(participant.countryName, participant.armyName, type)\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState, props: Props) => {\r\n const tactic = getSelectedTactic(state, props.side, props.index)\r\n return {\r\n tactics: getTactics(state, props.side),\r\n tactic: tactic.type,\r\n participant: getParticipant(state, props.side, props.index),\r\n settings: getSiteSettings(state)\r\n }\r\n}\r\n\r\nconst actions = { selectTactic }\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ntype IProps = Props & S & D\r\n\r\nexport default connect(mapStateToProps, actions)(TacticSelector)\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\n\r\nimport { CountryName, CountryAttribute } from 'types'\r\nimport { setCountryAttribute } from 'reducers'\r\nimport DelayedNumericInput from 'components/Detail/DelayedNumericInput'\r\nimport { filterValues, calculateBase } from 'definition_values'\r\nimport { AppState, getCountryDefinition } from 'state'\r\n\r\ntype Props = {\r\n country: CountryName\r\n attribute: CountryAttribute\r\n percent?: boolean\r\n}\r\n\r\n/** \r\n * Custom numeric input for setting attribute values for a country.\r\n */\r\nclass CountryValueInput extends Component {\r\n render() {\r\n const { attribute, percent, definition } = this.props\r\n const value = calculateBase(definition, attribute)\r\n return (\r\n \r\n )\r\n }\r\n onChange = (value: number) => {\r\n const { definition, attribute, setCountryAttribute, country } = this.props\r\n const base = calculateBase(definition, attribute) - calculateBase(filterValues(definition, 'Custom'), attribute)\r\n setCountryAttribute(country, attribute, value - base)\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState, props: Props) => ({\r\n definition: getCountryDefinition(state, props.country)\r\n})\r\n\r\nconst actions = { setCountryAttribute }\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ninterface IProps extends React.PropsWithChildren, S, D { }\r\n\r\nexport default connect(mapStateToProps, actions)(CountryValueInput)\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport { Table, Input, Button } from 'semantic-ui-react'\r\n\r\nimport { SideType, CountryName, Setting, GeneralDefinition, GeneralAttribute, GeneralValueType, isAttributeEnabled, CountryAttribute, ArmyName, Country, Armies, Participant, UnitType, UnitAttribute, UnitDefinition } from 'types'\r\nimport { keys } from 'utils'\r\nimport { AppState, getCountry, getGeneral, getCountries, getMode, getSiteSettings, getArmies, getSide, getUnitDefinitions } from 'state'\r\nimport { selectParticipantCountry, selectParticipantArmy, setGeneralAttribute, deleteParticipant, addParticipant, setDaysUntilBattle, createArmy, createCountry } from 'reducers'\r\nimport StyledNumber from 'components/Utils/StyledNumber'\r\nimport TacticSelector from './TacticSelector'\r\nimport { addSign } from 'formatters'\r\nimport CountryValueInput from './CountryValueInput'\r\nimport { filterArmies } from 'managers/countries'\r\nimport AttributeImage from 'components/Utils/AttributeImage'\r\nimport UnitValueInput from './UnitValueInput'\r\nimport { getArchetypes } from 'managers/army'\r\nimport SimpleDropdown from 'components/Dropdowns/SimpleDropdown'\r\nimport DelayedNumericInput from 'components/Detail/DelayedNumericInput'\r\nimport { getDefaultArmyName } from 'data'\r\n\r\ntype Props = {\r\n type: SideType\r\n}\r\n\r\nclass TableArmyInfo extends Component {\r\n\r\n render() {\r\n const { settings, participants, addParticipant, type } = this.props\r\n const last = participants[participants.length - 1]\r\n return (\r\n \r\n \r\n \r\n \r\n Country\r\n \r\n \r\n Army\r\n \r\n {\r\n settings[Setting.Martial] &&\r\n \r\n General\r\n \r\n }\r\n {\r\n settings[Setting.Tactics] &&\r\n \r\n Tactic\r\n \r\n }\r\n {\r\n settings[Setting.Tech] &&\r\n \r\n Tech\r\n \r\n }\r\n {\r\n isAttributeEnabled(CountryAttribute.FlankRatio, settings) &&\r\n \r\n \r\n \r\n }\r\n {\r\n isAttributeEnabled(UnitAttribute.OffensiveSupport, settings) &&\r\n \r\n \r\n \r\n }\r\n \r\n Days\r\n \r\n \r\n \r\n \r\n {participants.map(this.renderArmyInfo)}\r\n \r\n \r\n
\r\n )\r\n }\r\n\r\n\r\n renderArmyInfo = (participant: Entity, index: number) => {\r\n const { settings, selectParticipantArmy, selectParticipantCountry, countries, mode, type, deleteParticipant, clearable, createArmy, createCountry } = this.props\r\n const { armies, general, countryName, armyName, artillery } = participant\r\n return (\r\n \r\n \r\n name ? selectParticipantCountry(type, index, name, countries[name] ? Object.keys(filterArmies(countries[name], mode))[0] as ArmyName : getDefaultArmyName(mode)) : deleteParticipant(type, index)}\r\n style={{ width: 110 }}\r\n onAdd={name => createCountry(name)}\r\n clearable={clearable}\r\n />\r\n \r\n \r\n selectParticipantArmy(type, index, name)}\r\n onAdd={name => createArmy(countryName, name, mode)}\r\n style={{ width: 100 }}\r\n />\r\n \r\n {settings[Setting.Martial] && this.renderGeneralAttribute(countryName, armyName, general, GeneralAttribute.Martial)}\r\n {\r\n settings[Setting.Tactics] &&\r\n \r\n \r\n \r\n }\r\n {\r\n settings[Setting.Tech] &&\r\n \r\n \r\n \r\n }\r\n {\r\n isAttributeEnabled(CountryAttribute.FlankRatio, settings) &&\r\n \r\n \r\n \r\n }\r\n {\r\n artillery && isAttributeEnabled(UnitAttribute.OffensiveSupport, settings) &&\r\n \r\n \r\n \r\n }\r\n \r\n this.setDaysUntilBattle(index, value)} type='number' />\r\n \r\n \r\n )\r\n }\r\n\r\n renderGeneralAttribute = (country: CountryName, army: ArmyName, general: GeneralDefinition, attribute: GeneralValueType) => (\r\n \r\n this.props.setGeneralAttribute(country, army, attribute, Number(value))} />\r\n {' '}\r\n \r\n )\r\n\r\n setDaysUntilBattle = (index: number, value: number) => {\r\n this.props.setDaysUntilBattle(this.props.type, index, value)\r\n }\r\n}\r\n\r\ntype Entity = Participant & {\r\n general: GeneralDefinition\r\n country: Country\r\n armies: Armies\r\n artillery?: UnitDefinition\r\n}\r\n\r\nconst mapStateToProps = (state: AppState, props: Props) => {\r\n const side = getSide(state, props.type)\r\n const mode = getMode(state)\r\n return {\r\n participants: side.participants.map(participant => ({\r\n ...participant,\r\n general: getGeneral(state, participant.countryName, participant.armyName),\r\n country: getCountry(state, participant.countryName),\r\n armies: getArmies(state, participant.countryName),\r\n artillery: getArchetypes(getUnitDefinitions(state, participant.countryName, participant.armyName), mode).find(unit => unit.type === UnitType.Artillery)\r\n })),\r\n clearable: side.participants.length > 1,\r\n countries: getCountries(state),\r\n settings: getSiteSettings(state),\r\n mode\r\n }\r\n}\r\n\r\nconst actions = { selectParticipantCountry, selectParticipantArmy, setGeneralAttribute, deleteParticipant, addParticipant, setDaysUntilBattle, createArmy, createCountry }\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ninterface IProps extends React.PropsWithChildren, S, D { }\r\n\r\nexport default connect(mapStateToProps, actions)(TableArmyInfo)\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport { Image, Table, Button } from 'semantic-ui-react'\r\n\r\nimport { SideType, Setting, GeneralAttribute, UnitAttribute, ModalType, GeneralDefinition, CombatPhase } from 'types'\r\nimport { AppState, getBattle, getMode, getCombatSide, getSiteSettings, getSide, getTactic } from 'state'\r\nimport { setDice, openModal } from 'reducers'\r\nimport StyledNumber from 'components/Utils/StyledNumber'\r\nimport { getCombatPhase, getCombatPhaseNumber } from 'combat'\r\nimport { addSign, toSignedPercent } from 'formatters'\r\nimport IconDice from 'images/chance.png'\r\nimport IconTerrain from 'images/terrain.png'\r\nimport AttributeImage from 'components/Utils/AttributeImage'\r\nimport DelayedNumericInput from 'components/Detail/DelayedNumericInput'\r\nimport { getLeadingArmy, getDay, getParticipantName } from 'managers/battle'\r\nimport { getImage } from 'utils'\r\n\r\ntype Props = {\r\n type: SideType\r\n}\r\n\r\nclass TableSideInfo extends Component {\r\n\r\n attributes = [UnitAttribute.Discipline]\r\n\r\n render() {\r\n const { settings } = this.props\r\n return (\r\n \r\n \r\n \r\n \r\n Leader\r\n \r\n {\r\n settings[Setting.Martial] &&\r\n \r\n General\r\n \r\n }\r\n {\r\n settings[Setting.FireAndShock] &&\r\n \r\n General\r\n \r\n }\r\n {\r\n settings[Setting.Tactics] &&\r\n \r\n Tactic\r\n \r\n }\r\n \r\n Dice roll\r\n \r\n \r\n \r\n \r\n {this.renderSide()}\r\n \r\n
\r\n )\r\n }\r\n\r\n\r\n renderSide = () => {\r\n const { settings, side, army, tactic } = this.props\r\n const participantIndex = army?.participantIndex ?? 0\r\n return (\r\n \r\n \r\n {getParticipantName(side.participants[participantIndex])}\r\n \r\n \r\n \r\n {army ? army.general[GeneralAttribute.Martial] : 0}\r\n \r\n {\r\n settings[Setting.Tactics] &&\r\n \r\n {army ? : null}\r\n {tactic ? : null}\r\n \r\n }\r\n \r\n {this.renderRoll()}\r\n \r\n \r\n )\r\n }\r\n\r\n renderRoll = () => {\r\n const { settings, round, openModal, setDice, side, combat } = this.props\r\n const terrainPips = combat.results.terrainPips\r\n const generalPips = combat.results.generalPips\r\n const phase = getCombatPhaseNumber(round, settings)\r\n const isDiceSet = side.randomizeDice || (side.rolls.length > phase && side.rolls[phase])\r\n return (\r\n
\r\n \r\n {isDiceSet ? combat.results.dice : setDice(side.type, value)} />}\r\n \r\n
\r\n )\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState, props: Props) => {\r\n const battle = getBattle(state)\r\n const combat = getCombatSide(state, props.type)\r\n const army = getLeadingArmy(combat)\r\n return {\r\n side: getSide(state, props.type),\r\n tactic: getTactic(state, combat.type),\r\n army,\r\n round: getDay(battle),\r\n settings: getSiteSettings(state),\r\n mode: getMode(state),\r\n combat\r\n }\r\n}\r\n\r\nconst actions = { setDice, openModal }\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ninterface IProps extends React.PropsWithChildren, S, D { }\r\n\r\nexport default connect(mapStateToProps, actions)(TableSideInfo)\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport { Table } from 'semantic-ui-react'\r\n\r\nimport { SideType, CountryName, UnitAttribute, CombatPhase, GeneralDefinition, GeneralValueType, Mode, UnitType, ArmyName } from 'types'\r\nimport { AppState, getGeneral, getUnitDefinition, getMode, getSiteSettings } from 'state'\r\nimport { setGeneralAttribute } from 'reducers'\r\nimport AttributeImage from 'components/Utils/AttributeImage'\r\nimport StyledNumber from 'components/Utils/StyledNumber'\r\nimport { addSign } from 'formatters'\r\nimport UnitValueInput from './UnitValueInput'\r\nimport DelayedNumericInput from 'components/Detail/DelayedNumericInput'\r\n\r\ntype Props = {\r\n side: SideType\r\n country: CountryName\r\n army: ArmyName\r\n}\r\n\r\nclass TableDamageAttributes extends Component {\r\n\r\n shouldComponentUpdate(prevProps: IProps) {\r\n return prevProps.country !== this.props.country\r\n }\r\n\r\n render() {\r\n const { side, general, unit, country, settings } = this.props\r\n return (\r\n \r\n \r\n \r\n \r\n {side}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n General\r\n \r\n \r\n {this.renderGeneralAttribute(general, CombatPhase.Fire)}\r\n \r\n \r\n {this.renderGeneralAttribute(general, CombatPhase.Shock)}\r\n \r\n \r\n \r\n \r\n Damage done\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Damage taken\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n )\r\n }\r\n\r\n renderGeneralAttribute = (general: GeneralDefinition, attribute: GeneralValueType) => (\r\n <>\r\n this.setGeneralStat(attribute, Number(value))}/>\r\n {' '} \r\n \r\n )\r\n\r\n setGeneralStat = (attribute: GeneralValueType, value: number) => {\r\n const { country, army, setGeneralAttribute } = this.props\r\n setGeneralAttribute(country, army, attribute, value)\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState, props: Props) => ({\r\n general: getGeneral(state, props.country, props.army),\r\n unit: getUnitDefinition(state, getMode(state) === Mode.Naval ? UnitType.Naval : UnitType.Land, props.country),\r\n settings: getSiteSettings(state)\r\n})\r\n\r\nconst actions = { setGeneralAttribute }\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ninterface IProps extends React.PropsWithChildren, S, D { }\r\n\r\nexport default connect(mapStateToProps, actions)(TableDamageAttributes)\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\n\r\nimport { AppState, getSide } from 'state'\r\nimport { selectParticipant } from 'reducers'\r\nimport { SideType } from 'types'\r\nimport SimpleDropdown from 'components/Dropdowns/SimpleDropdown'\r\nimport { getParticipantName } from 'managers/battle'\r\n\r\ntype Props = {\r\n side: SideType\r\n}\r\n\r\n/**\r\n * Selector for battle participant.\r\n */\r\nclass ParticipantSelector extends Component {\r\n\r\n render() {\r\n const { value, values, selectParticipant, side } = this.props\r\n return (\r\n \r\n Edit army: \r\n selectParticipant(side, value)}\r\n />\r\n\r\n \r\n )\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState, props: Props) => ({\r\n value: state.ui.selectedParticipantIndex[props.side],\r\n values: getSide(state, props.side).participants.map((item, index) => ({ value: index, text: getParticipantName(item) }))\r\n})\r\n\r\nconst actions = { selectParticipant }\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ninterface IProps extends React.PropsWithChildren, S, D { }\r\nexport default connect(mapStateToProps, actions)(ParticipantSelector)\r\n","\r\nimport React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport { Button, Grid, Header, Checkbox } from 'semantic-ui-react'\r\nimport { getCombatPhase } from 'combat'\r\nimport PreferredUnitTypes from 'containers/PreferredUnitTypes'\r\nimport TableStats from 'containers/TableStats'\r\nimport TableArmyPart from 'containers/GridRowArmyPart'\r\nimport TargetArrows from 'containers/TargetArrows'\r\nimport TerrainSelector from 'containers/TerrainSelector'\r\nimport WinRate from 'containers/WinRate'\r\nimport {\r\n selectParticipantCountry, setDice, toggleRandomDice, clearCohorts, changeSiteParameter,\r\n undo, battle, refreshBattle, resetState, selectCulture, openModal\r\n} from 'reducers'\r\nimport { AppState, getBattle, getSettings, getParticipantSafely } from 'state'\r\nimport { ArmyPart, CountryName, Setting, SideType, CombatPhase, UnitType, ModalType, ArmyName } from 'types'\r\nimport TableUnitTypes from 'containers/TableUnitTypes'\r\nimport TableArmyInfo from 'containers/TableArmyInfo'\r\nimport TableSideInfo from 'containers/TableSideInfo'\r\nimport TableDamageAttributes from 'containers/TableDamageAttributes'\r\nimport AccordionToggle from 'containers/AccordionToggle'\r\nimport { getDay, getRound } from 'managers/battle'\r\nimport ParticipantSelector from 'containers/ParticipantSelector'\r\n\r\nconst ATTACKER_COLOR = '#FFAA00AA'\r\nconst DEFENDER_COLOR = '#00AAFFAA'\r\n\r\nclass Battle extends Component {\r\n\r\n componentDidMount() {\r\n // Ensures that the setup is not outdated.\r\n this.props.refreshBattle()\r\n }\r\n\r\n openCohortModal = (side: SideType, participantIndex: number, index: number, country: CountryName, army: ArmyName): void => {\r\n this.props.openModal(ModalType.CohortDetail, { side, country, army, index, participantIndex })\r\n }\r\n\r\n openUnitDetails = (countryName: CountryName, armyName: ArmyName, type: UnitType): void => {\r\n this.props.openModal(ModalType.UnitDetail, { country: countryName, army: armyName, type })\r\n }\r\n\r\n componentDidUpdate() {\r\n const { outdated, refreshBattle, settings, round } = this.props\r\n if (outdated && (settings[Setting.AutoRefresh] || round < 0))\r\n refreshBattle()\r\n }\r\n\r\n render() {\r\n const { participantA, participantB, round, isUndoAvailable, fightOver, settings, timestamp, day, changeSiteParameter } = this.props\r\n if (!timestamp)\r\n return null\r\n return (\r\n <>\r\n \r\n \r\n \r\n
{this.roundName(day, round, fightOver, getCombatPhase(round, settings))}
\r\n
\r\n \r\n changeSiteParameter(Setting.AutoRefresh, !!checked)}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n )\r\n }\r\n\r\n roundName = (day: number, round: number, fightOver: boolean, phase: CombatPhase): string => {\r\n const dayStr = day === round ? '' : ', Day ' + day\r\n let roundStr = ''\r\n if (fightOver)\r\n roundStr = 'Fight over'\r\n else if (day === 0 || round === 0)\r\n roundStr = 'Deployment'\r\n else if (round === -1)\r\n roundStr = 'Waiting for enemies'\r\n else if (phase !== CombatPhase.Default)\r\n roundStr = 'Round ' + String(round) + ' (' + phase + ')'\r\n else\r\n roundStr = 'Round ' + String(round)\r\n return roundStr + dayStr\r\n }\r\n\r\n renderFrontline = (side: SideType) => {\r\n const combatWidth = this.props.settings[Setting.CombatWidth]\r\n return (\r\n \r\n )\r\n }\r\n\r\n renderReserve = (side: SideType) => {\r\n return (\r\n \r\n )\r\n }\r\n\r\n renderDefeatedCohorts = (side: SideType) => {\r\n return (\r\n \r\n )\r\n }\r\n\r\n renderRetreatedCohorts = (side: SideType) => {\r\n return (\r\n \r\n )\r\n }\r\n\r\n clearCohorts = (): void => {\r\n const { participantA, participantB: participantD, clearCohorts } = this.props\r\n clearCohorts(participantA.countryName, participantA.armyName)\r\n clearCohorts(participantD.countryName, participantD.armyName)\r\n }\r\n\r\n undo = (rounds: number) => {\r\n const { undo, outdated, refreshBattle } = this.props\r\n undo(rounds)\r\n if (outdated)\r\n refreshBattle()\r\n }\r\n\r\n battle = (rounds: number) => {\r\n const { battle, outdated, refreshBattle } = this.props\r\n if (outdated)\r\n refreshBattle()\r\n battle(rounds)\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState) => {\r\n const battle = getBattle(state)\r\n const day = getDay(battle)\r\n const round = getRound(battle)\r\n return {\r\n participantA: getParticipantSafely(state, SideType.A, state.ui.selectedParticipantIndex[SideType.A]),\r\n participantB: getParticipantSafely(state, SideType.B, state.ui.selectedParticipantIndex[SideType.B]),\r\n isUndoAvailable: day > 0,\r\n round,\r\n day,\r\n outdated: battle.outdated,\r\n timestamp: battle.timestamp,\r\n fightOver: battle.fightOver,\r\n settings: getSettings(state)\r\n }\r\n}\r\n\r\nconst actions = { openModal, changeSiteParameter, battle, undo, toggleRandomDice, setDice, selectParticipantCountry, refreshBattle, resetState, selectCulture, clearCohorts }\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ninterface IProps extends S, D { }\r\n\r\nexport default connect(mapStateToProps, actions)(Battle)\r\n","import React, { Component } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport { AppState, getMode } from 'state'\r\nimport { setMode } from 'reducers'\r\nimport { Menu, Image, Button } from 'semantic-ui-react'\r\nimport IconLand from 'images/land_combat.png'\r\nimport IconNaval from 'images/naval_combat.png'\r\nimport { Mode } from 'types'\r\n\r\ninterface Props { }\r\n\r\n/**\r\n * Navigation menu for different pages.\r\n */\r\nclass Navigation extends Component {\r\n\r\n render() {\r\n const { mode, setMode } = this.props\r\n const path = (this.props as any).location.pathname\r\n const history = (this.props as any).history\r\n return (\r\n \r\n )\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: AppState) => ({\r\n mode: getMode(state)\r\n})\r\n\r\nconst actions = { setMode }\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ninterface IProps extends React.PropsWithChildren, S, D { }\r\n\r\nexport default connect(mapStateToProps, actions)(Navigation)\r\n","import React, { Component } from 'react'\r\nimport { Table } from 'semantic-ui-react'\r\nimport { mapRange } from '../../utils'\r\n\r\ninterface IProps {\r\n cells: number\r\n stretch?: number\r\n}\r\n\r\n/**\r\n * Creates a table row with a fixed amount of cells.\r\n */\r\nexport default class PaddedRow extends Component {\r\n\r\n render() {\r\n const { cells, children } = this.props\r\n const stretch = (this.props.stretch === undefined ? cells : this.props.stretch) - 1\r\n const length = React.Children.count(children)\r\n return (\r\n \r\n {\r\n React.Children.map(children, (child, index) => (\r\n \r\n {child}\r\n \r\n ))\r\n }\r\n {\r\n mapRange(cells - length, (number) => (\r\n \r\n ))\r\n }\r\n \r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { Input as InputUI } from 'semantic-ui-react'\r\n\r\ninterface IProps {\r\n value: T\r\n onChange?: (value: T) => void\r\n disabled?: boolean\r\n style?: any\r\n}\r\n\r\n\r\nexport default class Input extends Component> {\r\n\r\n render() {\r\n const { value, onChange, style } = this.props\r\n return (\r\n onChange && onChange(value as T)}\r\n />\r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { Table } from 'semantic-ui-react'\r\n\r\nimport PaddedRow from './Utils/PaddedRow'\r\nimport Input from './Utils/Input'\r\nimport Headers from './Utils/Headers'\r\n\r\nimport { ValuesType, formatAttribute } from 'types'\r\nimport { getValue, explainShort, DefinitionValues, calculateValue } from 'definition_values'\r\n\r\ninterface IProps, T extends string> {\r\n customValueKey: string\r\n definition: D\r\n attributes: T[]\r\n onChange: (key: string, attribute: T, value: number) => void\r\n}\r\n\r\n// Display component for showing and changing some country details.\r\nexport default class TableAttributes, T extends string> extends Component> {\r\n\r\n headers = ['Attribute', 'Value', 'Custom value', 'Explained']\r\n\r\n CELLS = 4\r\n\r\n render() {\r\n const { attributes } = this.props\r\n return (\r\n \r\n \r\n \r\n {attributes.map(this.renderRow)}\r\n \r\n
\r\n )\r\n }\r\n\r\n renderRow = (attribute: T) => {\r\n const { definition, customValueKey, onChange } = this.props\r\n const baseValue = getValue(ValuesType.Base, definition, attribute, customValueKey)\r\n const value = calculateValue(definition, attribute)\r\n\r\n return (\r\n \r\n {attribute}\r\n {formatAttribute(value, attribute)}\r\n onChange(customValueKey, attribute, Number(value))} />\r\n {explainShort(definition, attribute)}\r\n \r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { List } from 'semantic-ui-react'\r\nimport { Modifier, ModifierType } from 'types'\r\n\r\ntype IProps = {\r\n name: string | null\r\n modifiers: Modifier[]\r\n padding?: string\r\n}\r\n\r\n/** Renders modifiers as a list. */\r\nexport default class ListModifier extends Component {\r\n\r\n render() {\r\n const { modifiers, name, padding } = this.props\r\n return (\r\n \r\n {name &&\r\n \r\n \r\n {name}\r\n \r\n \r\n }\r\n {\r\n modifiers.map((modifier, index) => (\r\n \r\n {\r\n this.getText(modifier)\r\n }\r\n {\r\n this.getValue(modifier, padding)\r\n }\r\n \r\n ))\r\n }\r\n \r\n )\r\n }\r\n\r\n getText = (modifier: Modifier) => {\r\n if (modifier.target in ModifierType)\r\n return {modifier.attribute}\r\n return {modifier.target + ' ' + modifier.attribute}\r\n }\r\n\r\n getValue = (modifier: Modifier, padding: string = '') => {\r\n if (!modifier.value)\r\n return null\r\n const sign = modifier.value > 0 ? '+' : '-'\r\n const value = Math.abs(modifier.value)\r\n const str = modifier.noPercent ? value + padding : +(value * 100).toFixed(2) + ' %'\r\n return {sign + str}\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { SiteSettings, ListDefinition } from 'types'\r\nimport DropdownTable from './DropdownTable'\r\nimport ListModifier from 'components/Utils/ListModifier'\r\n\r\ntype IProps = {\r\n value: string\r\n values: ListDefinition[]\r\n settings: SiteSettings\r\n onSelect: (key: string) => void\r\n type: string\r\n}\r\n\r\nexport default class DropdownListDefinition extends Component {\r\n\r\n getContent = (item: ListDefinition, search: string) => (item.name.toLowerCase().includes(search.toLowerCase()) ? [\r\n item.name,\r\n \r\n ] : null)\r\n\r\n isActive = (item: ListDefinition) => item.key === this.props.value\r\n\r\n getValue = (item: ListDefinition) => item.key\r\n\r\n getText = (item: ListDefinition) => item.name\r\n\r\n getHeaders = () => [this.props.type, 'Effect']\r\n\r\n render() {\r\n const { value, values, onSelect, settings, type } = this.props\r\n return (\r\n \r\n )\r\n }\r\n}\r\n","import ListModifier from 'components/Utils/ListModifier'\r\nimport React from 'react'\r\nimport { Table } from 'semantic-ui-react'\r\nimport { SelectionType, ListDefinition, Modifier } from 'types'\r\nimport { mapRange, ObjSet } from 'utils'\r\n\r\ntype Props = {\r\n selections: ObjSet | undefined\r\n type: SelectionType\r\n items: ListDefinition[]\r\n columns: number\r\n onClick: (enabled: boolean) => ((type: SelectionType, key: string) => void)\r\n disabled?: boolean\r\n usePercentPadding?: boolean\r\n}\r\n\r\nexport const TableModifierList = ({ selections, columns, disabled, items, onClick, type, usePercentPadding }: Props) => {\r\n items = items.filter(entity => entity.modifiers.length)\r\n const rows = Math.ceil(items.length / columns)\r\n return (\r\n \r\n \r\n {\r\n mapRange(rows, number => number).map(row => (\r\n \r\n {\r\n mapRange(columns, number => number).map(column => {\r\n const index = row * columns + column\r\n const entity = items[index]\r\n if (!entity)\r\n return ()\r\n const modifiers = entity.modifiers\r\n const key = entity.key\r\n return renderCell(type, key, entity.name, selections ? selections[key] : false, modifiers, onClick, usePercentPadding ? PERCENT_PADDING : undefined, disabled)\r\n })\r\n }\r\n \r\n ))\r\n }\r\n \r\n
\r\n )\r\n}\r\n\r\nconst PERCENT_PADDING = '\\u00a0\\u00a0\\u00a0\\u00a0'\r\nconst CELL_PADDING = '.78571429em .78571429em'\r\nconst renderCell = (type: SelectionType, key: string, name: string | null, enabled: boolean, modifiers: Modifier[], onClick: (enabled: boolean) => ((type: SelectionType, key: string) => void), padding?: string, disabled?: boolean, width?: number) => (\r\n onClick(enabled)(type, key)}\r\n style={{ padding: CELL_PADDING }}\r\n >\r\n \r\n \r\n)","import React, { Component } from 'react'\r\nimport { Container, Grid, Table, List, Input, Checkbox, Button } from 'semantic-ui-react'\r\nimport { connect } from 'react-redux'\r\nimport { AppState, getGeneral, getGeneralDefinition, getSiteSettings, getSelectedArmy, getCountryDefinition } from 'state'\r\nimport { mapRange, ObjSet, values, keys } from '../utils'\r\n\r\nimport { addSignWithZero } from 'formatters'\r\nimport {\r\n TraditionDefinition, ListDefinition,\r\n OptionDefinition, Modifier, CultureType, CountryAttribute, GeneralAttribute, CombatPhase, GeneralValueType, filterAttributes, CountryName, Setting, SelectionType, TechDefinition, ArmyName\r\n} from 'types'\r\nimport {\r\n clearCountryAttributes, setCountryAttribute, enableCountrySelections, enableCountrySelection, clearCountrySelections, clearCountrySelection,\r\n setGeneralAttribute, selectCulture, selectGovernment, setHasGeneral, clearGeneralAttributes,\r\n clearGeneralSelection, enableGeneralSelection, clearGeneralSelections\r\n} from 'reducers'\r\n\r\nimport AccordionToggle from 'containers/AccordionToggle'\r\nimport CountryManager from 'containers/CountryManager'\r\nimport SimpleDropdown from 'components/Dropdowns/SimpleDropdown'\r\nimport StyledNumber from 'components/Utils/StyledNumber'\r\nimport TableAttributes from 'components/TableAttributes'\r\nimport { convertCountryDefinition } from 'managers/countries'\r\nimport CountryValueInput from 'containers/CountryValueInput'\r\nimport ListModifier from 'components/Utils/ListModifier'\r\nimport DropdownListDefinition from 'components/Dropdowns/DropdownListDefinition'\r\nimport { traditionsIR, traitsIR, abilitiesIR, tradesIR, techIR, deitiesIR, lawsIR, policiesIR, ideasIR, modifiersIR, heritagesIR, religionsIR, factionsIR } from 'data'\r\nimport { TableModifierList } from 'components/TableModifierList'\r\n\r\nconst PERCENT_PADDING = '\\u00a0\\u00a0\\u00a0\\u00a0'\r\n\r\nconst CELL_PADDING = '.78571429em .78571429em'\r\n\r\nclass CountriesIR extends Component {\r\n\r\n render() {\r\n const { settings, generalDefinition, general, selectedCountry, setHasGeneral,\r\n countryDefinition, country } = this.props\r\n const countrySelections = countryDefinition.selections\r\n const tradition = traditionsIR[country.culture]\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ({ value: tradition.key, text: tradition.name }))}\r\n value={country.culture}\r\n style={{ width: 200 }}\r\n onChange={this.selectCulture}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n this.execArmy(setHasGeneral, false) : () => this.execArmy(setHasGeneral, true)}\r\n style={{ float: 'right' }}\r\n />\r\n Base martial: this.setGeneralValue('Base', GeneralAttribute.Martial, Number(value))} />\r\n {' '}with from traits\r\n \r\n {this.renderAbilities()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n Military experience: \r\n {\r\n this.renderTraditions(tradition, countrySelections[SelectionType.Tradition])\r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n this.renderInventions(techIR, country[CountryAttribute.TechLevel], countrySelections[SelectionType.Invention])\r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.renderReligions()}\r\n
\r\n
\r\n Omen power: \r\n \r\n Religional unity: 0 - 100\r\n Tech level: 0 - 50\r\n Inventions: 0 - 30\r\n Office: 0 - 30\r\n Mandated Observance: 20\r\n Latin tradition: 15\r\n Exporting Incense: 10\r\n Laws: -15 / 15\r\n Ruler: -15 / 7.5)\r\n Heritage: 0 / 5)\r\n Total from -30 to 300\r\n \r\n {this.renderDeities()}\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.renderHeritages()}\r\n \r\n \r\n {this.renderFactions()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n Republic Discipline (0 - 7.5): \r\n \r\n \r\n Monarch Land Morale (0 - 15): \r\n \r\n \r\n \r\n \r\n {this.renderPolicies()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n )\r\n }\r\n\r\n renderTraditions = (traditions: TraditionDefinition, selections: ObjSet) => {\r\n const rows = traditions.paths.reduce((max, path) => Math.max(max, path.traditions.length), 0)\r\n return (\r\n \r\n \r\n \r\n {\r\n traditions.paths.map(path => (\r\n \r\n {path.name}\r\n \r\n ))\r\n }\r\n \r\n \r\n \r\n \r\n {\r\n this.renderCell('base', null, !!selections, traditions.modifiers,\r\n this.activateTradition, this.deactivateTradition, undefined, undefined, 3)\r\n }\r\n \r\n {\r\n mapRange(rows, number => number).map(row => (\r\n \r\n {\r\n traditions.paths.map(path => {\r\n const tradition = path.traditions[row]\r\n if (!tradition)\r\n return null\r\n const key = tradition.key\r\n const modifiers = tradition.modifiers\r\n return this.renderCell(key, null, selections && selections[key], modifiers,\r\n () => this.enableTradition(path.traditions, key), () => this.clearTradition(path.traditions, key))\r\n })\r\n }\r\n \r\n ))\r\n }\r\n \r\n
\r\n )\r\n }\r\n\r\n renderInventions = (inventions: TechDefinition[], tech: number, selections: ObjSet) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n Technology\r\n \r\n \r\n Invention\r\n \r\n \r\n Invention\r\n \r\n \r\n Invention\r\n \r\n \r\n \r\n \r\n {\r\n inventions.map((definition, row) => (\r\n \r\n \r\n {definition.name}\r\n \r\n {\r\n definition.inventions.map((invention, column) => {\r\n if (column === 0)\r\n return this.renderTechLevel(row, row <= tech, invention.modifiers)\r\n const key = invention.key\r\n return this.renderCell(key, null, selections && selections[key] && row <= tech, invention.modifiers,\r\n () => this.enableInvention(key, row), () => this.clearInvention(key), PERCENT_PADDING)\r\n })\r\n }\r\n \r\n ))\r\n }\r\n \r\n
\r\n )\r\n }\r\n\r\n renderDeities = () => {\r\n const deities = values(deitiesIR)\r\n const rows = Math.ceil(deities.length / 4)\r\n const power = this.props.country[CountryAttribute.OmenPower]\r\n const selections = this.props.country.selections[SelectionType.Deity]\r\n return (\r\n \r\n \r\n {\r\n mapRange(rows, number => number).map(row => (\r\n \r\n {\r\n mapRange(4, number => number).map(column => {\r\n const index = row * 4 + column\r\n const entity = deities[index]\r\n if (!entity)\r\n return ()\r\n const key = entity.key\r\n const modifiers = entity.isOmen ? entity.modifiers.map(modifier => ({ ...modifier, value: modifier.value * power / 100 })) : entity.modifiers\r\n return this.renderCell2(SelectionType.Deity, key, entity.name, selections && selections[key], modifiers, this.onCountryItemClick, PERCENT_PADDING)\r\n })\r\n }\r\n \r\n ))\r\n }\r\n \r\n
\r\n )\r\n }\r\n\r\n renderHeritages = () => this.renderDropdown(SelectionType.Heritage, values(heritagesIR))\r\n renderReligions = () => this.renderDropdown(SelectionType.Religion, values(religionsIR))\r\n renderFactions = () => this.renderDropdown(SelectionType.Faction, values(factionsIR))\r\n\r\n renderDropdown = (type: SelectionType, items: ListDefinition[]) => {\r\n const selections = this.props.country.selections[type] ?? this.props.general.selections[type]\r\n const value = selections && keys(selections).length ? keys(selections)[0] : ''\r\n return (\r\n this.enableCountrySelection(type, key)}\r\n type={type}\r\n />\r\n )\r\n }\r\n\r\n renderPolicies = () => this.renderOptions(SelectionType.Policy, policiesIR, 3, this.onCountryItemClick, false, PERCENT_PADDING)\r\n renderAbilities = () => this.renderOptions(SelectionType.Ability, abilitiesIR, 2, this.onGeneralItemClick, false, PERCENT_PADDING)\r\n\r\n renderOptions = (type: SelectionType, options: OptionDefinition[], columns: number, onClick: (enabled: boolean) => ((type: SelectionType, key: string) => void), disabled: boolean, padding?: string) => {\r\n const selections = this.props.country.selections[type] ?? this.props.general.selections[type]\r\n return (\r\n \r\n \r\n {\r\n options.map((option, index) => (\r\n \r\n {\r\n option.map(item => {\r\n const key = item.key\r\n return this.renderCell2(type, key, item.name, selections && selections[key], item.modifiers, onClick, padding, disabled)\r\n })\r\n }\r\n {\r\n mapRange(columns - option.length, (value) => )\r\n }\r\n \r\n ))\r\n }\r\n \r\n
\r\n )\r\n }\r\n\r\n renderTechLevel = (level: number, enabled: boolean, modifiers: Modifier[]) => (\r\n this.clearTech(level) : () => this.enableTech(level)}\r\n >\r\n \r\n \r\n )\r\n\r\n clearGeneralSelection = (type: SelectionType, key: string) => {\r\n const { clearGeneralSelection } = this.props\r\n this.execArmy(clearGeneralSelection, type, key)\r\n }\r\n\r\n findOptionKeys = (options: OptionDefinition[], key: string) => options.find(policy => policy.find(option => option.key === key))?.map(option => option.key)\r\n\r\n enableGeneralSelection = (type: SelectionType, key: string) => {\r\n const { enableGeneralSelection, clearGeneralSelections } = this.props\r\n if (type === SelectionType.Ability) {\r\n const keys = this.findOptionKeys(abilitiesIR, key)\r\n if (keys)\r\n this.execArmy(clearGeneralSelections, type, keys)\r\n }\r\n this.execArmy(enableGeneralSelection, type, key)\r\n }\r\n\r\n onGeneralItemClick = (enabled: boolean) => enabled ? this.clearGeneralSelection : this.enableGeneralSelection\r\n\r\n clearCountrySelection = (type: SelectionType, key: string) => {\r\n const { clearCountrySelection } = this.props\r\n this.execCountry(clearCountrySelection, type, key)\r\n }\r\n\r\n enableCountrySelection = (type: SelectionType, key: string) => {\r\n const { enableCountrySelection, clearCountrySelections } = this.props\r\n if (type === SelectionType.Heritage || type === SelectionType.Religion || type === SelectionType.Faction)\r\n this.execCountry(clearCountrySelections, type)\r\n if (type === SelectionType.Policy) {\r\n const keys = this.findOptionKeys(policiesIR, key)\r\n if (keys)\r\n this.execCountry(clearCountrySelections, type, keys)\r\n }\r\n this.execCountry(enableCountrySelection, type, key)\r\n }\r\n\r\n\r\n onCountryItemClick = (enabled: boolean) => enabled ? this.clearCountrySelection : this.enableCountrySelection\r\n\r\n renderCell2 = (type: SelectionType, key: string, name: string | null, enabled: boolean, modifiers: Modifier[], onClick: (enabled: boolean) => ((type: SelectionType, key: string) => void), padding?: string, disabled?: boolean, width?: number) => (\r\n onClick(enabled)(type, key)}\r\n style={{ padding: CELL_PADDING }}\r\n >\r\n \r\n \r\n )\r\n\r\n renderCell = (key: string, name: string | null, enabled: boolean, modifiers: Modifier[], enable?: (() => void), clear?: (() => void), padding?: string, disabled?: boolean, width?: number) => (\r\n { })\r\n : (enable ? enable : () => { })\r\n }\r\n style={{ padding: CELL_PADDING }}\r\n >\r\n \r\n \r\n )\r\n\r\n enableInvention = (key: string, level: number) => {\r\n const { enableCountrySelection } = this.props\r\n this.execCountry(enableCountrySelection, SelectionType.Invention, key)\r\n this.enableTech(level)\r\n }\r\n\r\n enableTech = (level: number) => {\r\n const { country } = this.props\r\n if (level > country[CountryAttribute.TechLevel])\r\n this.setCountryValue('', CountryAttribute.TechLevel, level)\r\n }\r\n\r\n clearTech = (level: number) => {\r\n const { country, clearCountrySelections } = this.props\r\n const keys = techIR.filter((_, index) => level <= index && index <= country[CountryAttribute.TechLevel]).reduce((prev, curr) => prev.concat(curr.inventions.map(value => value.name)), [] as string[])\r\n this.execCountry(clearCountrySelections, SelectionType.Invention, keys)\r\n this.setCountryValue('', CountryAttribute.TechLevel, level - 1)\r\n }\r\n\r\n clearInvention = (key: string) => {\r\n const { clearCountrySelection } = this.props\r\n this.execCountry(clearCountrySelection, SelectionType.Invention, key)\r\n }\r\n\r\n /** Clears traditions starting from a given tradition. */\r\n clearTradition = (traditions: ListDefinition[], key: string) => {\r\n const { enableCountrySelections, clearCountrySelections } = this.props\r\n this.activateTradition()\r\n let add = true\r\n const toAdd: string[] = []\r\n const toRemove: string[] = []\r\n traditions.forEach(tradition => {\r\n if (tradition.key === key)\r\n add = false\r\n if (add)\r\n toAdd.push(tradition.key)\r\n else\r\n toRemove.push(tradition.key)\r\n })\r\n this.execCountry(enableCountrySelections, SelectionType.Tradition, toAdd)\r\n this.execCountry(clearCountrySelections, SelectionType.Tradition, toRemove)\r\n }\r\n\r\n /** Enables traditions up to a given tradition. */\r\n enableTradition = (traditions: ListDefinition[], key: string) => {\r\n const { enableCountrySelections, clearCountrySelections } = this.props\r\n this.activateTradition()\r\n let add = true\r\n const toAdd: string[] = []\r\n const toRemove: string[] = []\r\n traditions.forEach(tradition => {\r\n if (add)\r\n toAdd.push(tradition.key)\r\n else\r\n toRemove.push(tradition.key)\r\n if (tradition.key === key)\r\n add = false\r\n })\r\n this.execCountry(enableCountrySelections, SelectionType.Tradition, toAdd)\r\n this.execCountry(clearCountrySelections, SelectionType.Tradition, toRemove)\r\n }\r\n\r\n activateTradition = () => {\r\n const { enableCountrySelection } = this.props\r\n this.execCountry(enableCountrySelection, SelectionType.Tradition, 'base')\r\n }\r\n\r\n deactivateTradition = () => {\r\n const { clearCountrySelections } = this.props\r\n this.execCountry(clearCountrySelections, SelectionType.Tradition)\r\n }\r\n\r\n selectCulture = (value: CultureType) => {\r\n this.execCountry(this.props.selectCulture, value, !this.props.settings[Setting.Culture])\r\n }\r\n\r\n /** Executes a given function with currently selected country. */\r\n execCountry = (func: (country: CountryName, value: T, ...rest: any[]) => void, value: T, ...rest: any[]) => func(this.props.selectedCountry, value, ...rest)\r\n execArmy = (func: (country: CountryName, army: ArmyName, value: T, ...rest: any[]) => void, value: T, ...rest: any[]) => func(this.props.selectedCountry, this.props.selectedArmy, value, ...rest)\r\n\r\n /**\r\n * Clears all selections.\r\n */\r\n clearAll = () => {\r\n this.execCountry(this.props.clearCountrySelections, undefined)\r\n this.execCountry(this.props.clearCountryAttributes, undefined)\r\n this.execArmy(this.props.clearGeneralSelections, undefined)\r\n this.execArmy(this.props.clearGeneralAttributes, undefined)\r\n this.execArmy(this.props.setHasGeneral, true)\r\n }\r\n\r\n setCountryValue = (_: string, attribute: CountryAttribute, value: number) => this.execCountry(this.props.setCountryAttribute, attribute, value)\r\n\r\n setGeneralValue = (_: string, attribute: GeneralValueType, value: number) => this.execArmy(this.props.setGeneralAttribute, attribute, value)\r\n}\r\n\r\nconst mapStateToProps = (state: AppState) => {\r\n const selectedArmy = getSelectedArmy(state)\r\n const countryDefinition = getCountryDefinition(state, state.settings.country)\r\n return {\r\n countryDefinition,\r\n country: convertCountryDefinition(countryDefinition, state.settings.siteSettings),\r\n selectedCountry: state.settings.country,\r\n selectedArmy,\r\n generalDefinition: getGeneralDefinition(state, state.settings.country, selectedArmy),\r\n general: getGeneral(state, state.settings.country, selectedArmy),\r\n settings: getSiteSettings(state)\r\n }\r\n}\r\n\r\nconst actions = {\r\n clearGeneralSelections, setGeneralAttribute, selectCulture, setCountryAttribute, clearGeneralSelection, enableGeneralSelection,\r\n clearCountryAttributes, clearGeneralAttributes, selectGovernment, setHasGeneral, enableCountrySelection, clearCountrySelection, enableCountrySelections, clearCountrySelections\r\n}\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ntype IProps = S & D\r\n\r\nexport default connect(mapStateToProps, actions)(CountriesIR)\r\n","import React, { Component } from 'react'\r\nimport { Container, Grid, Table, Checkbox, Button } from 'semantic-ui-react'\r\nimport { connect } from 'react-redux'\r\nimport { AppState, getGeneralDefinition, getCountryDefinition, getSiteSettings, getCountry, getSelectedArmy } from 'state'\r\nimport { mapRange, values } from '../utils'\r\n\r\nimport { CultureType, CountryAttribute, GeneralAttribute, CombatPhase, GeneralValueType, filterAttributes, ListDefinition, CountryName, Setting, ArmyName, SelectionType } from 'types'\r\nimport { clearGeneralSelections, clearCountrySelections, clearCountryAttributes, clearGeneralAttributes, setCountryAttribute, enableCountrySelection, clearCountrySelection, setGeneralAttribute, selectCulture, selectGovernment, setHasGeneral } from 'reducers'\r\n\r\nimport AccordionToggle from 'containers/AccordionToggle'\r\nimport CountryManager from 'containers/CountryManager'\r\nimport SimpleDropdown from 'components/Dropdowns/SimpleDropdown'\r\nimport TableAttributes from 'components/TableAttributes'\r\nimport { getCultures, policiesEUIV, techEUIV } from 'data'\r\nimport CountryValueInput from 'containers/CountryValueInput'\r\nimport ListModifier from 'components/Utils/ListModifier'\r\nimport { TableModifierList } from 'components/TableModifierList'\r\n\r\nconst TECH_COLUMNS = 4\r\nconst CUSTOM_KEY = 'Base'\r\n\r\nconst CELL_PADDING = '.78571429em .78571429em'\r\n\r\nclass CountriesEUIV extends Component {\r\n\r\n render() {\r\n const { settings, general, country, selectedCountry, countryDefinition, setHasGeneral } = this.props\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n this.selectCulture(item)}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n this.execArmy(setHasGeneral, false) : () => this.execArmy(setHasGeneral, true)}\r\n style={{ float: 'right' }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n Tech level: \r\n {\r\n this.renderTech(techEUIV, country[CountryAttribute.TechLevel])\r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n renderTech = (tech: ListDefinition[], techLevel: number) => {\r\n const rows = Math.ceil(tech.length / TECH_COLUMNS)\r\n return (\r\n \r\n \r\n {\r\n mapRange(rows, number => number).map(row => (\r\n \r\n {\r\n mapRange(TECH_COLUMNS, number => number).map(column => {\r\n const index = row * TECH_COLUMNS + column\r\n const level = tech[index]\r\n const key = 'Tech' + index\r\n if (!level)\r\n return ()\r\n const enabled = index <= techLevel\r\n return (\r\n this.clearTech(index)\r\n : () => this.enableTech(index)\r\n }\r\n style={{ padding: CELL_PADDING }}\r\n >\r\n \r\n \r\n )\r\n })\r\n }\r\n \r\n ))\r\n }\r\n \r\n
\r\n )\r\n }\r\n\r\n /** Executes a given function with currently selected country. */\r\n execCountry = (func: (country: CountryName, value: T, ...rest: any[]) => void, value: T, ...rest: any[]) => func(this.props.selectedCountry, value, ...rest)\r\n execArmy = (func: (country: CountryName, army: ArmyName, value: T, ...rest: any[]) => void, value: T, ...rest: any[]) => func(this.props.selectedCountry, this.props.selectedArmy, value, ...rest)\r\n\r\n /**\r\n * Selects culture while also re-enabling tradition.\r\n */\r\n selectCulture = (value: CultureType) => {\r\n this.execCountry(this.props.selectCulture, value, !this.props.settings[Setting.Culture])\r\n }\r\n /**\r\n * Clears tech above a given tech level.\r\n */\r\n clearTech = (level: number) => {\r\n level = level || 1\r\n this.execCountry(this.props.setCountryAttribute, CountryAttribute.TechLevel, level - 1)\r\n }\r\n\r\n /**\r\n * Enables tech levels to a given level.\r\n */\r\n enableTech = (level: number) => {\r\n this.execCountry(this.props.setCountryAttribute, CountryAttribute.TechLevel, level)\r\n }\r\n\r\n onCountryItemClick = (enabled: boolean) => enabled ? this.clearCountrySelection : this.enableCountrySelection\r\n\r\n enableCountrySelection = (type: SelectionType, key: string) => {\r\n const { enableCountrySelection } = this.props\r\n this.execCountry(enableCountrySelection, type, key)\r\n }\r\n\r\n clearCountrySelection = (type: SelectionType, key: string) => {\r\n const { clearCountrySelection } = this.props\r\n this.execCountry(clearCountrySelection, type, key)\r\n }\r\n\r\n\r\n /**\r\n * Clears all selections.\r\n */\r\n clearAll = () => {\r\n this.execCountry(this.props.clearCountrySelections, undefined)\r\n this.execCountry(this.props.clearCountryAttributes, undefined)\r\n this.execArmy(this.props.clearGeneralSelections, undefined)\r\n this.execArmy(this.props.clearGeneralAttributes, undefined)\r\n this.execArmy(this.props.setHasGeneral, true)\r\n }\r\n\r\n setCountryValue = (_: string, attribute: CountryAttribute, value: number) => this.execCountry(this.props.setCountryAttribute, attribute, value)\r\n\r\n setGeneralValue = (_: string, attribute: GeneralValueType, value: number) => this.execArmy(this.props.setGeneralAttribute, attribute, value)\r\n}\r\n\r\nconst mapStateToProps = (state: AppState) => {\r\n const selectedArmy = getSelectedArmy(state)\r\n return {\r\n countryDefinition: getCountryDefinition(state, state.settings.country),\r\n country: getCountry(state, state.settings.country),\r\n selectedCountry: state.settings.country,\r\n selectedArmy,\r\n general: getGeneralDefinition(state, state.settings.country, selectedArmy),\r\n settings: getSiteSettings(state)\r\n }\r\n}\r\n\r\nconst actions = {\r\n setGeneralAttribute, selectCulture, setCountryAttribute, clearCountryAttributes, clearGeneralAttributes, clearGeneralSelections,\r\n selectGovernment, setHasGeneral, enableCountrySelection, clearCountrySelection, clearCountrySelections\r\n}\r\n\r\ntype S = ReturnType\r\ntype D = typeof actions\r\ntype IProps = S & D\r\n\r\nexport default connect(mapStateToProps, actions)(CountriesEUIV)\r\n","import React, { Component } from 'react'\r\nimport { Grid, TextArea, Checkbox, List, Header, Button, Input } from 'semantic-ui-react'\r\nimport { connect } from 'react-redux'\r\nimport { AppState, resetMissing, restoreDefaultTactics, restoreDefaultTerrains, restoreDefaultUnits, restoreDefaultSettings } from 'state'\r\nimport { values, keys } from 'utils'\r\nimport { ExportKey } from 'types'\r\nimport { exportState, saveToFile } from 'managers/transfer'\r\nimport { setExportKey, setResetMissing, importState } from 'reducers'\r\n\r\n\r\ninterface IState {\r\n data: string\r\n}\r\n\r\nclass Transfer extends Component {\r\n\r\n constructor(props: IProps) {\r\n super(props)\r\n this.state = { data: '' }\r\n }\r\n\r\n lastData = ''\r\n\r\n readonly attributes = values(ExportKey)\r\n\r\n render() {\r\n const json = exportState(this.props.state, this.props.exportKeys)\r\n if (this.lastData !== json) {\r\n // Hack to make data editable manually or when exported settings change.\r\n // This could probably be moved to trigger when export keys change?\r\n this.lastData = json\r\n this.setState({ data: json })\r\n }\r\n return (\r\n \r\n \r\n \r\n
Export
\r\n \r\n \r\n 1. Select which parts to export (resets any manual changes)\r\n \r\n {this.attributes.map(value => this.renderCheckbox(value))}\r\n \r\n 2a. \r\n \r\n \r\n 2b. Copy paste the data from the text box\r\n \r\n \r\n
Import
\r\n \r\n \r\n 1a. this.loadContent(event.target.files![0])} />\r\n \r\n \r\n 1b. Copy paste the data to the text box\r\n \r\n \r\n 2. Select how to handle missing data\r\n \r\n \r\n this.props.setResetMissing(!this.props.resetMissing)}\r\n />\r\n \r\n \r\n 3. Push the button\r\n \r\n \r\n \r\n \r\n \r\n
Reset
\r\n \r\n \r\n Reset all data (battle, countries, units, tactics, terrains, settings)\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n