Fort Triumph

Fort Triumph

Không đủ lượt đánh giá
How To Config Fort Triumph For Fun and Science
Bởi DancingEngie và 2 cộng tác viên
Many variables that dictate gameplay, AI and balance are stored in easily modifiable formats for you to tweak. This guide seeks to point you to their location, as well as provide full documentation regarding what each setting means. Give yourself a challenge or tweak some specific values for your own personal gameplay style!
   
Giải thưởng
Yêu thích
Đã yêu thích
Bỏ thích
Introduction
While some settings and values in Fort Triumph are hardcoded, many are stored in plaintext files for easy editing and modding. Originally this was a development tool, where we experimented with different values on the fly. You can use this same method today to easily tweak values in the tactical and strategic layers. Some examples of exposed variables are AI aggression, XP gain, cover bonuses, trait chances, the grading algorithm, as well as the amount of resources you and the AI start with.

If you are familiar with ".ini tweaks" in games (especially Unreal Engine ones), you'll find the process very familiar. These text files are considered Streaming Assets[docs.unity3d.com] by the engine - files loaded from outside the build itself but rather from the filesystem.

Since these are simple .txt files, you can easily edit them with any text editor. However, we recommend you use Notepad++[notepad-plus-plus.org], as it keeps the syntax and spacing of the original code, making it a smoother editing experience.
File Location
The Streaming Assets can be found in the game files, inside the FortTriumph_data folder. There are two main ways you can use to quickly locate the folder:

  • Manually navigate to <Steam folder location>\steamapps\common\Fort Triumph\Fort Triumph_Data\StreamingAssets
  • Right click on the game listing in your Steam library and hit Properties. In the newly opened window, click the Local Files tab and then Browse Local Files. From there head into the FortTriumph_data and StreamingAssets folders.

Either way, you should reach a folder with a handful of text files. Something like this:



Let's go over those files one by one.
Backups & Reverting Changes
As a general rule in all forms of .ini tweaks, make a backup of the StreamingAssets folder so that you could revert some or all of your changes if you encounter a critical bug, especially if you own a non-Steam version of the game.

In short, play around with it at your own risk, and mod responsibly. We are not responsible for any changes you make with your copy of the game.

If you did not back up the original files and you want to reverse your changes, open the game's proprieties menu on Steam, hit the Local Files tab, and then click the Verify Integrity of Local Files option.
Note however that this option will flip all modified files back to their original state, as they were originally uploaded to the Steam cloud.
TLDR Version: Quick Fixes
Don't have time to read through the entire documentation, or do you just want to quickly change a specific setting for fun? Here are a few quick tips:

Bringing Back Minions (Buggy)

Head to Worldmap Settings and find the first instance of this snippet:
"T1Dwellings": { "Values": [ 0 ] }, "T2Dwellings": { "Values": [ 3 ] }, "T3Dwellings": { "Values": [ 0 ] }, "T4Dwellings": { "Values": [ 0 ] }, "T5Dwellings": { "Values": [ 0 ] },

Increase these values to anything above 0 to add dwellings of a certain tier to your starting area.
This will add non-hero dwellings around the map, and will allow you to recruit minions into the interacting party, provided there is a slot available.
CAUTION!!! This is technically a deprecated and cut feature. Look up the relevant lines in the full documentation below (Worldmap Settings - Part II) to read about its limitations.

Starting a game with more/less resources

Head to Strategic Settings and find this snippet:
"PlayerStartingResourcesMultiplier": { "Values": [ 2.0, 1.0, 0.699999988079071, 0.4000000059604645 ] },

The values are resource multipliers, and they are ordered from Easy difficulty to Legendary. So if you want to give yourself more resources on Legendary, increase the multiplier from 0.4 to something else.

Removing Party Creation Costs

Head to Strategic Settings and find this snippet:
"PartyBeetcoinCost": 200,

Reduce the number to 0.


Starting a game with more heroes

Head to Strategic Settings and find this snippet:
"PlayerTownStartingHeroes": { "Values": [ 0.0 ] },

Change that number to the number of heroes you'd want waiting for you in town the next time you start a Skirmish or Campaign game.

Modifying the chance the AI would take over your towns

Head to Strategic Settings and find this snippet:
"AITownEvaluation": { "Values": [ -8, -3, 0, 2 ] }

These values are modifiers to the AI's decision-making system when it comes to attacking your towns. The values are ordered from Easy difficulty to Legendary, where negative values discourage the AI from attacking player towns, and positive values do the opposite.

Modifying Physics Damage

Head to Tactical Settings and find this snippet:
"PhysicsHitDamage": 2, "PhysicsCrushingDamage": 7,

The top value refers to damage dealt by units hitting each other/small objects, the bottom one refers to damage dealt by toppling objects like trees.

Modifying the Cover Bonus

Head to Tactical Settings and find this snippet:
"CoverDefense": 35,

The number refers to the accuracy penalty (in percentage) units get for being in cover. The value is doubled for high/full cover.

Modifying how easy it is to get a good grade
Head to Tactical Settings and find this snippet:
"MissionGradeValues": [ 0.1, 0.3, 0.55, 0.75, 0.9, 1.0 ],

These values indicate the relative scores required to gain each grade, the first value being the requirements for a D grade, and the one before last for an A+ grade. The '1.0' value should remain as is.
Reducing these values lowers the requirements for getting higher grades.

Rigging your chances to get rare abilities
Head to Tactical Settings and find this snippet:
"UnitBaseAbilityScore": 1.0, "UnitLevelAbilityScore": 0.20000000298023225,

Increasing the first value will make it more likely you'll get rare abilities right off the bat. Increasing the second one will make it more likely you'll get rare abilities as you level up.
NamePools
These files contain all possible names for heroes, enemies and NPCs whose name is not dictated by the plot. When creating one of these, the game randomly picks a name out of those pools.

Heroes of all factions globally use the Names - Male, Names - Female and Titles pools to generate their names. The 'Enemies' name pool is deprecated outside of a few edge cases.

"Type": 0

Declares the pool pertains to first names (Type 0) or last names/titles (Type 1).

"Prefabs": []

Used to reference specific prefabs or actors which would use this specific name pool to generate a name. This is not easy to use because it uses IDs to specify prefabs.

"FilterBySex": true, "Sex": 2,

Declares whether or not this pool is specific to one sex. If true, the "Sex" field declares which sex that pool refers to. A value of 1 means it's a Female name pool and a value of 2 means it's a Male one.

"Names":

An array containing all names pertaining to that specific name pool. Make sure each new name you add is surrounded by quote marks and ends with a comma.
Graphics Settings
These values control some of the more specific things regarding the game's graphics and UI. If you are unsure about what these mean, we recommend you leave these be as misusing these values might cause bugs to occur.

"FracturingMinLifeTime": 5,

Minimum lifetime duration (in seconds) of fractured debris before they start disappearing.

"FracturingMaxLifeTime": 10,

Maximum lifetime duration (in seconds) of fractured debris. Effectively how long it takes for all debris to disappear.

"FracturingOffScreenLifeTime": 5,

Minimum lifetime duration (in seconds) of off-screen fractured debris before they start disappearing.

"StrategicHoverHighlight": 1.0,

The highlight strength of cover objects when the player hovers over them.

"StrategicHoverDesaturate": 0.60,

How much cover objects de-saturate when the player hovers over them.
Value range: [0.0-1.0]

"SeeThroughYOffset": 0.60,

Y-offset position of the camera before the semi-transparent "see-through" effect is applied.

"SeeThroughMinAlpha": 0.2,

The minimum alpha the see-through effect can apply.
Value range: [0.0-1.0]

"SeeThroughHideFadeDelay": 0.0,

Delay (in seconds) before the see-through effect fades in or out. Currently disabled.

"SeeThroughHideFadeSpeed": 100.0,

The speed at which see-through effect fades in\out. At its original value, it is nearly instantaneous.

"SeeThroughOutlineColor": {

The see-through effect's RGBA values, used to color the object's outlines.

"SeeThroughOutlineWidthTop": 0.05,

The width of the top part of the see-through outline.

"SeeThroughOutlineWidthBottom": 0.0

The width of the bottom part of the see-through outline.Currently disabled.

Mutator Settings
Nowadays, enabling these settings might lead to a bizarre and unbalanced gameplay experience; many of these ideas were either abandoned or hardcoded into the game. As such some of them don't really work.

"DodgeStance": false,

Setting this value to true replaces the Brace ability (for all applicable units) with an alternate, older version of it called Dodge Stance. Unlike the current Brace ability, damage received stays the same, but the hit chance of all incoming attacks is halved.

"ThreeActionPoints": true,

Deprecated. In the early versions of the game, all units had 2 base AP. We experimented with a 3 AP system, and it is now hardcoded into the game.

If you are interested in changing the base amount of AP points units have, check out the ActionPoints value in Tactical Settings.

"LimitedDistancePenalty": false,

Setting this value to true caps the "distance" accuracy penalty for ranged units to a maximum upper value, for both allies and enemies.

These settings technically work and will override some tactical settings, though to create a cleaner workflow you can easily change the same settings in the Tactical Settings file, under values like "DistanceAccuracyPenalty".

"LimitedDistanceMaximumDistancePenalty": 40,

If LimitedDistancePenalty is set to true, this represents the maximum distance accuracy penalty (in percentage rate).
Value range: [0-100].

"LimitedDistancePenaltyRate": 1.3,

If LimitedDistancePenalty is set to true, this value is a multiplier for the distance penalty per tile. A value of 1 means the accuracy penalty rate per tile remains the same as it is now. A value of 0 effectively removes all distance penalties.

"SightFromPoint": true

Deprecated. Used to experiment with the origin point for the sight algorithm. Now hardcoded.
Strategic Settings
This more technical document pertains to data values in the strategic/worldmap layer. Many settings are split between difficulty levels, thus enabling you to create a harder or easier experience for more 'aggressive' difficulty settings.

Footnote: Difficulty Values

Some variables are applied differently depending on the player's chosen difficulty setting. This is expressed through an array that looks like this:
"Values": [ 10, 11, 12, 13 ]

The game applies the top value if playing on Easy, the next value if playing on Normal, et cetera. This means, for example, that for a Classic Skirmish game, our hypothetical variable would be assigned the integer 12.

-----

"PartySight": 10,

Number of worldmap tiles parties can see in any given spot. Applies for both allies and enemies.

"RoadMoveMultiplier": 0.66,

Movement cost multiplier when units travel on roads. Default value is a 66% (i.e. parties spend only 66% of the regular movement cost when using roads).

"AITownsRelativeStrength": 0.4,

Deprecated. Used to indicate the ratio between the AI's total strength and the strength that should be kept in towns.

"AIPartyRelativeStrength": 0.0,

Deprecated. Used to indicate the ratio of the AI's total strength and the strength that the AIs main party should have.

"AINumberOfSecondaryParties": 0,

Deprecated. Used to indicate the number of secondary parties that the AI should try to reach.

"PartyBeetcoinCost": 200,

Cost of starting a new party in Beetcoin. Can be 0. Applies for both allies and enemies.

"PartyStartingPoints": 0.0,

Deprecated.The amount of points a newly bought party should start with. This was used in order to define the amount/tier of "free" starting non-hero units for newly created parties. While no longer used, in code this is still referenced for AI parties upon creation, so increasing this value will result in the AI getting free heroes on creating parties (one free hero per 2.4 points).

"MaximumPartySize": 5,

The maximum size of a party, for both allies and enemies.
As Party Size upgrades are hardcoded, changing this value beyond 5 mainly affects the maximum number of heroes players can keep in town to defend it. Changing this value below 5 would make Party Size upgrades useless and buggy.

"MinimumNeutralPartySize": 3,

The minimum number of units (without stacking) that a neutral party can contain.
"Neutral parties" in this context are defenders of unoccupied, neutral towns and enemies that guard artifacts and resources.

"MaximumNeutralPartySize": [value array]

The maximum number of units (without stacking) that a neutral party can contain.

"MaximumAIPartySize": [value array]

The maximum number of units (without stacking) that an AI party can contain, friend of foe.

"MagicBeetcoinConversionRate": 100

The amount of beetcoins a single magic unit is worth. This is used for AI evaluation of battles. A higher value might make the AI gravitate towards magic rewards.

"RenownMultiplier": [value array]

Cost multiplier on guild upgrades for the player and the AI across difficulty levels.

"PlayerTownStartingHeroes": 0

Number of heroes the player starts with in their first town.

"AITownStartingHeroes": [value array]

Number of heroes each AI starts with in their first town.

"NeutralTownStartingHeroes": [value array]

Number of heroes stationed in neutral towns at the start of the game.

"AIPartyStartingHeroes": [value array]

Number of heroes the AI's initial party contains.

"PlayerStartingResourcesMultiplier": [value array]

Multiplies the amount of resources the player starts with by this value.
By default (i.e. a multiplier of 1), these values are 850 coins and 2 magic.

"AIStartingResourcesMultiplier": [value array]

Multiplies the amount of resources the AI starts with by this value.
Default values are the same as the player's starting resources (see above).

"AIEvaluationMultiplier": [value array]

Initially, how strongly the AI values targeting the player vs the environment. A value of 1 means the AI sees player parties and neutral parties the same way. Values lower than 1 mean the AI would weigh worldmap battles as more valuable, and higher values mean it would gravitate more towards player parties.

"AIAggressiveEscalationMultiplier": [value array]

How much the AI becomes more aggressive every day towards the player.
This is added to AI Evaluation Multiplier (see above).
For example, if the the multiplier is 1 and this value is 0.05, after one day the AI will play with a multiplier of 1.05, and after five days the AI will play as if the multiplier is 1.25.

"AIMinimumGatingDate": [value array]

The number of days before the AI starts attacking 'gating enemies', i.e. enemies that guard valuable objects around the worldmap. This effectively dictates the earliest date the AI can start going after the player's base.

"AIMaximumEscalationRate": [value array]

The maximum multiplier the Aggressive Escalation value can add to the Evaluation Multiplier value.
For example, if this value is 0.5 and the initial evaluation multiplier is 1, the game will stop the AI from getting any more aggressive once the evaluation multiplier reaches 1.5.

"AIProficiency": [value array]

A multiplier for AI strength when fighting neutral monsters. A value of 1 means the AI will win worldmap battles with enemies that at the same power level (or less) as its current party. Increasing this value would make the AI win harder battles, while decreasing it means the AI would win and actively scout for battles with lesser enemies.
This value does not affect how the AI evaluates battles against other AI parties or the player.

"AIRenownIndexProficiency": [value array]

Determines the 'grade' the AI receives when fighting neutral monsters, effectively determining its renown gain.
Value range: [0-6], integer only. The value corresponds to a grade's index from worst to best. For instance, a value of 0 is an "E" rating, a value of 1 is a "D" rating, and a value of 5 is an "A+" rating.

"AIMaximumTownHeroes": [value array]

Maximum amount of heroes the AI can keep to defend its towns.

"AITownEvaluation":[value array]

An additive modifier to the objective value of player towns in the AI's mind. Negative values force the AI to avoid player towns, at least until it has a strong enough party which can overcome that penalty.
Tactical Settings, Part I
This file concerns the tactical/"XCOM" layer of the game. More specifically, this file controls cover bonuses, the grading algorithm, penalties and bonuses, and physics damage.
It is important to note that these settings are global, and affect all units, be they heroes or lowly monsters.

"ActionPoints": 3

Number of base action points all units have.

"MaxYTravelOffset": 0.6

Maximum Y-axis value units can vault or reach. This also affects movement abilities such as Blink, and to some extent also Run.

Higher ground, like the small hills in forest maps, are placed in margins of 0.6 on the Y-axis. A value of 1.2, for example, means units can climb places that are two 'tiles' higher than their current position. Changing the value to high values will cause animation glitches and make units reach absurdly high places.

"Sight": 14

Number of tiles units can see, and in the case of ranged units, the number of tiles they can target.

"AttackFinishDelay": 0.2

Delay (in seconds) before input is re-enabled at the end of attacks (in order to allow the player to notice what's happening).

"PhysicsHitDamage": 2

The damage inflicted to a unit upon hitting another (or a small object like rocks) via physics.

"PhysicsCrushingDamage": 7

The damage inflicted to a unit after being crushed by a tall physics object, like a tree or a pillar.

"StructuralIntegrityRate": 0.5

Defines the rate of structural support below which a supported structure will collapse. In other words, the percentage of supporting pillars one needs to remove in order to topple a roof or an arch to the ground.
Value range: [0-1].

"DistanceAccuracyPenalty": 5

Accuracy penalty per tile distance (ignoring the y-axis). If using the LimitedDistancePenalty mutator (see Mutator Settings), this value is multiplied by LimitedDistancePenaltyRate.

"MaximumDistancePenalty": 50,

The maximum accuracy penalty for distance. LimitedDistancePenalty mutator, if enabled, overrides this value.

"HeightAccuracyModifier": 8

Defines the height bonus (in percentages) for ranged units.

MaxHeightAccuracyModifier": 32

Defines the maximum height bonus (in percentages) for ranged units.

"InAnimateAccuracyBonus": 10

Defines the accuracy bonus (in percentages) units get for targeting innanimate physics objects.

"NoPenaltyDistance": 2

The number of tiles from a unit before distance penalties start.

"CoverDefense": 35

The accuracy penalty (in percentages) against units behind half cover. For full cover the value is multiplied by 2.

"AIMultipleOverwatchDevaluation": [difficulty value array]

The number of active player Overwatches it takes before the AI starts de-evaluating Overwatch its units.
For example, if the value is 2, it would take 2 AI Overwatches for the AI to de-evaluate using Overwatch and consider other tactics even if they are less useful in that scenario.

"CriticalHitMultiplier": 0.14

Damage multiplier of critical hits. This uses the maximum damage of the ability as its base value. Result is rounded up.

"HalfCoverCriticalHitDefense": 30

The critical chance penalty against units behind half cover.

"FullCoverCriticalHitDefense": 50

The critical chance penalty against units behind full cover.

"SkippingAbilityFastForwardRate": 4.0

The fast-forwarding rate when skipping an ability.

"BaseScoreMultiplier": 11

Score multiplier at the end of the grade calculation. This doesn't have any real effect because grade evaluation is relative.

"KillScoreMultiplier": 1.0

Point multiplier for player kills, used for grading purposes.

"DamageSustainedScoreMultiplier": -2.0

Negative point multiplier for points of damage sustained during the battle, used for grading purposes.

"PhysicsDamageScoreMultiplier": 0.5

Multiplier for points of physics damage the player dealt during the battle, used for grading purposes.

"StunScore": 2.0

Number of points the player gets for stunning a unit, used for grading purposes.

"UnlikelyShotScore": -2.0

Number of points the player loses for trying an 'unlikely shot' (hit or miss), used for grading purposes. Setting this to 0 effectively disables the 'unlikely shot' penalty.

"UnlikelyShotHitChance": 35

Anything less than this value will be seen as an 'unlikely shot' for grading purposes.

"AbilitySelectionCount": 3

The number of abilities the player can choose from when leveling up.

"AbilityRarityScore": [array]

Defines the rarity scores of each ability ranking. The game rolls rarity scores behind the scenes (using UnitBaseAbilityScore as a base and then modifying the roll with UnitLevelAbilityScore * level). If a slot crosses a rarity 'threshold', an ability of that rarity will appear. The array is ordered from Common to Very Rare.

"UnitBaseAbilityScore": 1.0

The initial ability score a unit starts out with. The higher this value is, the sooner they will encounter rarer abilities upon leveling up.

"UnitLevelAbilityScore": 0.2

Increases UnitBaseAbilityScore by this value with every level up, thus making rarer abilities more and more frequent as a hero levels up.

"AbilityScoreInvertedVariance": 2.7

The lower this value is, the more likely it is to get abilities with score that is far from the current unit ability score (getting 'Rare' abilities on low levels or 'Common' abilities on high levels). A value of 0 means that rarity has no effect an ability selection, thus making it totally random.

"AbilityScoreClassMultiplier": 9.0,

How much abilities associated with a class are more likely to appear for that class (in multiples).

"HeroLevelPointEvaluation": [difficulty value array]

How much hero levels are considered in evaluation of battles. Higher values mean players gain higher grades for using tougher heroes. This is tied by difficulty.

"HeroLevelXPWorth": 2.5

How much XP heroes are worth per level.

"HeroLevelXPWorthPower": 1.2

After killing a hero, this value is multiplied by HeroLevelXPWorth to calculate XP gain. For instance, considering the default settings, when a level 5 hero is slain, the player would get (2.5 * 5) * 1.2 = 15 XP points.

"MissionDifficultyNames": [string array]

The titles of each mission difficulty grade, revealed at the top part of the mission end screen.

"MissionDifficultyValues": [int array]

The mission difficulty values themselves. Crossing these thresholds will net the relevant grade, ordered from lowest grade to highest. Tallied for each enemy that was present in the mission, higher tiered enemies are worth more points.

"MissionGradeNames": [string array]

The titles of each grade level.

"MissionGradeColors": [rgb array]

The RGB values of each mission grade string in the end screen. Array is ordered from lowest grade to highest.

"MissionGradeValues": [array]

Each mission is given an automatic 'assessed score', which is calculated by the amount of enemies present and their tiers. After calculating the player's own score, these values determine the minimum percentage of the assessed score the player must reach in order to gain a certain grade.

For example, if a mission has an assessed score of 40, and the player receives an overall score of 32 (or 80% of the assessed score) then the player is in between the 0.75 and 0.9 thresholds (the 4th and 5th values), and therefore eligible for an A rating (which is the fifth rating).

Reducing these thresholds lowers the requirements for getting higher grades.
Tactical Settings, Part II
"MissionGradeRewardMultipliers": [array]

The renown reward multiplier for each grade.

"EnemyHPPerAssessedDifficulty": [difficulty value array]

The assessed "maximum" score that can be obtained for each point of difficulty in a mission, per campaign difficulty level. Semi-deprecated, and used only for campaign missions.

"MissionGradePerAssessedDifficulty": [difficulty value array]

The assessed amount of HP the enemies have for each each point of difficulty in a mission, per campaign difficulty level. Semi-deprecated, and used only for campaign missions.

"MissionDurationByDamageThroughputPerStrength": 0.5

The assessed expected duration it will take the player to beat a mission based on the amount of HP the enemies have, per each player strength point. Used for grading purposes, and only for random worldmap battles. Higher values mean the game expects the player to take longer to conclude a battle, therefore leading to more generous grading.

"MissionDurationByDamageThroughputPerStrengthPower": 0.9

The multiplier applied on the result of MissionDurationByDamageThroughputPerStrength calculation. This should reflect the fact that when there are more enemies (or stronger enemies) the damage throughput of the player usually becomes somewhat higher.

"MissionDurationGradePenaltyValues": [array]

The penalty to grade based on how much time it took the player to beat the mission. These values are multipliers of the base assessed duration. Higher values mean slower play impact the battle grade more substantially. The values are differentiated by grade levels, from lowest rating to highest.

"MissionGradeStunsPerHP": 0.15
The assessed "maximum" number of times each unit will be stunned per each point of HP it has. Higher values mean the game will perceive battles as longer, as you "can stun" enemies many times.

"MissionGradePhysicsDamageRate": 0.7

The assessed reasonable "maximum" rate of how much of the damage inflicted on enemy units was done via physics. Lower values will make getting maximum grade too easy, whereas values that are too extreme will make it rather unreasonable.
Trait Settings
This file manages the rarity values of each trait (those black and white icons next to each hero that give them passive bonuses), as well as managing the values of some specific traits.

"MaximumTraitsCount": 3,

Defines the maximum number of traits a hero can have. Any value above 3 will cause some UI issues but is otherwise likely to work.

"CommonWeight": 0.47, "UncommonWeight": 0.33, "RareWeight": 0.15, "VeryRareWeight": 0.05,

Defines the 'rarity value' of each trait group, essentially their frequency. Very roughly, it can be seen as the player's 'chance' of getting a trait for a certain rarity in percentages, both regarding starting traits of heroes, and regarding events that provide random traits.
This also affects rarity of the available abilities in 'The Weaver' and 'University' events.

Value range: [0-1]. The sum of all rarity weights should be equal to 1.

"AddCommonCostMultiplier": 1.0, "AddUncommonCostMultiplier": 2.0, "AddRareCostMultiplier": 3.0, "AddVeryRareCostMultiplier": 4.0,

Multiplier for cost of adding a trait in events that provide traits for beetcoins/magic, based on the rarity of the trait.

"RemoveCommonCostMultiplier": 1.0, "RemoveUncommonCostMultiplier": 2.0, "RemoveRareCostMultiplier": 3.0, "RemoveVeryRareCostMultiplier": 4.0,

Multiplier for cost of removing a trait in events that allow removing traits for beetcoins/magic, based on the rarity of the trait.

"AddPositiveCostMultiplier": 6.0, "AddMostlyPositiveCostMultiplier": 4.0, "AddNeutralCostMultiplier": 3.0, "AddMostlyNegativeCostMultiplier": 2.0, "AddNegativeCostMultiplier": 1.0, "AddCosmeticCostMultiplier": 1.0,

Multiplier for cost of adding a trait in events that provide traits for beetcoins/magic, based on the affinity of the trait.

"RemovePositiveCostMultiplier": 1.0, "RemoveMostlyPositiveCostMultiplier": 2.0, "RemoveNeutralCostMultiplier": 3.0, "RemoveMostlyNegativeCostMultiplier": 4.0, "RemoveNegativeCostMultiplier": 6.0, "RemoveCosmeticCostMultiplier": 1.0,

Multiplier for cost of removing a trait in events that allow removing traits for beetcoins/magic, based on the affinity of the trait.

"SprinterBonus": 2, "SprinterPenalty": 3,

These values define the speed bonus (in tiles) units with Sprinter get on their first move action, and the penalty they suffer for their second one.

"FarSightedBonus": 25,

The maximum bonus a ranged units with the Farsighted trait can get.

"ExcludedTraits": []

Allows preventing some traits from ever appearing as starting traits. For example if you want to get rid of the 'Sprinter' Trait, you should write "Sprinter" in this field inside the brackets.

This currently does not yet affect traits from events, but this will be fixed in a future update.

Except for a few traits, the names in this list are identical to those shown in the game (the check is case-sensitive).

Those for which a different name should be used are:
Vigilant -> Alert
Physicist -> Pushy
Ice Cold -> Ice cold (the check is case sensitive).
Worldmap Settings, Part I
This file concerns the worldmap procgen algorithm, and the way it structures its resources and buildings around the world. You'll notice the same variables repeat for different 'classes' and conditions. As such, this segment will be split in two: an explanation about what each class means, followed by a documentation of each of its variables.

But in order to start changing values, we must first invent the universe.

How Worldmap Generation Works

A map consists of two types of areas: a small area and a medium area. Roughly speaking, a small area is 27x27 tiles, while a medium area is 54x27. Each area has optional exits at the peripheries that the algorithm can use to seamlessly connect areas to each other, if applicable.

When generating a map, a medium area and a small area are generated for each town (player/enemy/neutral). For instance, the Act I worldmap consists of 2 towns (the player town and the goblin stronghold). Hence, the campaign manager generates two medium areas (on which towns are created), followed by two small areas that are connected to these medium areas via exits, as to create a coherent island.

"StartingAreaSettings"

Refers to the medium area a faction-owned town, friend or foe, initially starts out in. By default, this area is usually more forgiving, containing more low-level battles and basic resources to give everyone a decent starting off point.

"EmptyAreaSettings"

Refers to the medium area a neutral town is generated in, if applicable.

"UniqueAreaSettings"

Refers to the small areas that are connected to the town-specific medium areas. By default, these areas are more tranquil but could contain some high-level loot.

"AvoidanceConfigurations"

Defines the distance of worldmap objects from each other and from the player. These are somewhat hardcoded and hard to understand without Unity's visual interface as the Groups refer to specific IDs. While you could experiment with those values, our experimentation found that messing around with them makes the algorithm bug out and create unbalanced or glitchy environments.
Worldmap Settings, Part II
Within the aforementioned classes are a few recurring variables. This section aims to document each and describe their function.

The "Values": array is a difficulty array (see Strategic Settings for an explanation about difficulty-dependent values). Having one number at the array means the variable would remain the same overall difficulty settings.

"Towns": { "Values": [ 1 ] },

The number of towns that should be generated for this area type. While medium areas technically support 2 towns, this will lead to an incredibly unbalanced and even broken experience, should it even be generated. Therefore this value should not be tampered with.

"T1Dwellings": { "Values": [ 0 ] }, "T1DwellingsPreferAreaFaction": true, "T2DwellingsPreferAreaFaction": true, "T3DwellingsPreferAreaFaction": false, "T4DwellingsPreferAreaFaction": false, "T5DwellingsPreferAreaFaction": true,

(Refers to all T[X]Dwellings)
Technically deprecated, but working. Back in early access, you could take over buildings that generated non-hero units to fight alongside your faction. You could buy one of those units for free every week. This variable would have been the one to determine how many of which to create of which tier.

Changing these values to anything above 0 would actually place those buildings on the map. Provided you have an open slot for them in your party and you took over that building, you could purchase a non-hero unit of a certain type and have them fight alongside you.

Changing a "PreferAreaFaction" value to true would force the non-hero units you could gain after taking the dwelling to be from your faction.

While all of this technically still works, there are a few rough edges:
- Most obviously, very old art assets and unpolished UI. Again, remember this is technically a cut feature.
- You cannot stack or send these units to town immediately (ergo, you must have an open slot in your party to take a non-hero unit with you).
- The AI does not factor in these buildings in its calculations and will rarely use these.
- You cannot purchase non-hero units in town anymore, only through those specific dwellings. This makes getting non-hero "cannon fodder" units a hassle in the current system.

"SmallResourceLoots": { "Values": [ 5 ] },

Number of "small resource loots" to place in this area. They are chosen at random from this list:
  • Small Beetcoin Sacks
  • Small Magic Green Orbs
  • The "Scientist" (free potion) event


"MediumResourceLoots": { "Values": [ 3 ] },

Number of "medium resource loots" to place in this area. They are chosen at random from this list:
  • Medium Beetcoin Sack
  • Medium Magic Green Orbs
  • The "Training Dummy" (steps for XP) event
  • The "Mysterious Dig Site" (magic for debuff) event
  • The "Corrupt Magic" (magic for debuff) event
  • The "Corrupt Magic" (magic for debuff) event

"UniqueResourceLoots": { "Values": [ 1 ] },

Number of "unique resource loots" to place in this area. They are chosen at random from this list:

  • Unstable Beet
  • Unstable Magic

"BasicChests": { "Values": [ 3 ] },

Number of Beetcoin chests to place in this area. These are the ones that give you either XP or a nice sum of Beetcoin.

"BasicResourceEvents": { "Values": [ 4 ] },

Max number of cages to place in this area. These are events that either give you Beetcoin or a new party member.

"UniqueResourceEvents": { "Values": [ 1 ] },

Max number of cages to place in this area. These are events that either give you Beetcoin or a new party member.

"EffectBuildings": { "Values": [ 3 ] },

Max number of "daily buildings" to place in this area. These are the huts and totems that grant your parties a small, one-time buff for their next battle.

"T1Artifacts": { "Values": [ 2 ] }, "T2Artifacts": { "Values": [ 2 ] }, "T3Artifacts": { "Values": [ 1 ] },

Max number of artifact chests/single artifacts to place in this area by rarity (T1 - common, T2 - uncommon, T3 - rare). The game also automatically generates encounters with the creatures that guard those artifacts, where rarer artifacts are behind more difficult battles.

"BeetcoinFarms": { "Values": [ 1 ] }, "MagicExtractors": { "Values": [ 1, 0 ] }

Number of Beetcoin Farms and Magic Extractors to place in this area. These and buildings that grand either beetcoin or magic every day, respectively, for the faction that owns them. Note that in this example (taken from StartingAreaSettings), the game will not place an Extractor on Normal difficulty and above, but will do so for players playing on Easy difficulty.
EXAMPLE MOD
This is a basic rebalancing mod for the strategic layer.
This mod prevents the AI from starting with extra resources on higher difficulty levels, caps its initial party size to 3 units, and removes the free town unit it starts with on Legendary. To compensate, the AI's skill level when fighting worldmap units is increased slightly when playing on Classic/Legendary.

DOWNLOAD[pastebin.com]

To install it, simply head to your StreamingAssets folder, find the Strategic Settings file, and replace its data with the one found in the link. You can also download this text file, rename it appropriately, and replace the Strategic Settings file with it. Again: make sure you backup your StreamingAssets folder before doing so.

For reference, this mod specifically changes the following variables:
  • AITownStartingHeroes
  • AIPartyStartingHeroes
  • PlayerStartingResourcesMultiplier
  • AIStartingResourcesMultiplier
  • AIProficiency
FAQ
Q: Can I make changes at runtime?
A: Yes. In order to do so, set in "Build Settings.txt" the 'Modding' value to 'true' (requires restarting the game if it is already running). After doing so, there will be a toggle of 'Reload Settings On Application Focus' on the bottom right corner of the screen. When toggled on, the game will reload all settings whenever the application gets focus.

Q: How do I share my mods with others?
A: Bundle the relevant .txt files into a ZIP file (or, if it's just one or two files, just upload download them on their own), then just have your players find their StreamingAssets folder and replace the original files with yours.

Q: What happens to my mods when new patches/updates are released?
A: Upon the game getting updated, the mods will be removed. You should keep a copy of them outside of the game's folder, and whenever there's an update, reapply them. Notice that as these files are sometimes modified during updates, it's important to avoid accidentally removing new changes when doing so.

Q: Can I run multiple mods as the same time?
A: Again, these are simply text files. If you're copying and pasting an entire file, then the previous changes you made to the original file would be overwritten by the new mod. However, you can 'merge' mods together by surgically copying and pasting specific variables from a mod into your existing file.

Q: Do mods affect achievements or progress?
A: No. You can still get achievements and go through the campaign with modified settings. That means you can technically make a 'cheat mod', but then you're only cheating yourself.

Q: Are you going to incorporate full modding support in the future?
A: This requires rebuilding many aspects of the game from the ground up to be modifiable and parceled, as well as coming up with dedicated tools. It is unlikely we'll be able to do so in the near future.
5 bình luận
Eran.Yaacobi  [tác giả] 30 Thg04 @ 5:13am 
In the campaign, the gender of the 3 starting units (and the one you rescue afterwards) is fixed.

As for everywhere else (units in town, starting units in skirmish, etc.), when a unit is spawned the game first picks a gender randomly (fixed 50-50 distribution), and only then picks a name for it from the name pools, and so messing with the name pools won't help.
Istoria 29 Thg04 @ 11:10pm 
Hi! Awesome guide! Thanks! My GF really wants an all-girl party. how do I get on women to spawn? would it be messing with the name pools?
Eran.Yaacobi  [tác giả] 29 Thg11, 2020 @ 9:37am 
Hi @Kaerius,

You're right - it got removed (completely) in the last update.

I've fixed the relevant section accordingly and added the new settings for traits introduced in the update.

Thanks
Kaerius 23 Thg10, 2020 @ 6:11am 
Looks like "MaximumAverageAffinity" is fully deprecated now, as in, it does not work.
hunter1944a 25 Thg07, 2020 @ 6:51pm 
Great game! Also, thanks for making it easy to adjust settings and explaining what the things do. That really increases the what-if replay value. I'd review the game (but I bought it through a different store.)