Alliance

Alliance tech

The Alliance Technology tree: 59 nodes across the Growth, Territory, and Battle categories, with the cost, time, prerequisites, and bonus of every level.

Each category is split into 3 tiers. The nodes have 278 levels in all.


Types

AllianceTechNode

FieldTypeDescription
idstringStable identifier
namestringDisplay name
imgstringPath to the node icon
categoryAllianceTechCategoryGrowth, Territory, or Battle
tiernumberTier, 1 to 3
descriptionstringThe stat the node affects
statstring?Short name of the stat the node raises, such as Troops Attack
statKeystring?Stat name in lowercase kebab case
levelsAllianceTechLevel[]Every level of the node

AllianceTechLevel

FieldTypeDescription
levelnumberLevel number
prerequisitesAllianceTechRequirement[]{ id, level } entries that point to other Alliance Tech nodes
costAllianceTechCost[]{ itemId, amount } entries. itemId is an id from items()
timeSecondsnumberUpgrade time in seconds
bonusstring?Raw value of the stat at that level, such as '3%'
amountnumber?Parsed value of bonus
unit'percent' | 'flat'?Unit of amount

Factory

import { allianceTech } from 'whiteout-survival-data'

allianceTech() // all 59 nodes
allianceTech(source) // wrap a pre-filtered array

Filters

MethodSignatureDescription
byCategory(c)byCategory(category: AllianceTechCategory)Keeps nodes in Growth, Territory, or Battle.
byTier(n)byTier(tier: number)Keeps nodes in tier n (1 to 3).

Terminal methods

MethodReturnsDescription
.get()AllianceTechNode[]All results
.first()AllianceTechNode | undefinedFirst result
.find(id)AllianceTechNode | undefinedFind by id
.findByName(name)AllianceTechNode | undefinedCase-insensitive exact name match
.search(query)AllianceTechNode[]Case-insensitive partial name match
.count()numberNumber of results

Examples

import { allianceTech } from 'whiteout-survival-data'

// Tier 1 nodes of the Battle category
allianceTech()
  .byCategory('Battle')
  .byTier(1)
  .get()
  .map((n) => n.name)
// ['Infantry Attack I', 'Lancer Attack I', 'Marksman Attack I',
//  'Rally Expansion I', 'Troops Attack I']

// Cost, time, and bonus of the first level of one node
const level = allianceTech().findByName('Infantry Attack I')?.levels[0]
level?.cost // [{ itemId: 'meat', amount: 22800 }, { itemId: 'wood', amount: 22800 }]
level?.timeSeconds // 1800
level?.bonus // '1%'

Notes

Unlike Research, the nodes have no power column. Every prerequisite is another Alliance Tech node. No building gates the tree.

The bonus of each level is the bonus at that level, not a step. Upgrade time is stored in seconds.

The stat is a short name for what the node raises, written from its description. For example Enhances all Troops' Attack. gives Troops Attack. The statKey is the same kebab-case key as in research(), so infantry-attack means the same stat in both. You can add up bonuses from the two modules.

Nodes without a stat or bonus

bonus is undefined for the two one-off unlock nodes that have no stat effect, Tundra Surveying and Fertile Land Expedition. These two nodes and Long Live Our Alliance have no stat, statKey, amount, or unit. The other 56 nodes have a stat and a statKey.

Prerequisite gaps

Marksman Attack I has no prerequisite for its Levels 4 and 5. Infantry Attack I and Lancer Attack I also leave their Levels 4 and 5 without a prerequisite. Rally Expansion I has only 3 levels.

The only prerequisite of Tundra Surveying is Alliance Regimentation II at Level 5, the last level of that line, because Tundra Surveying is a one-off unlock gate.

The bonuses of Storehouse Expansion II are 50%, 100%, 200%, 300%, and 400%, like Storehouse Expansion I.


Next steps

Previous
Territory banners