Heroes & Experts

Experts

The 10 Dawn Academy Experts, recruited during Tundra Trek, with their skills, talent, and affinity table. Read expert skill levels, costs, power, and affinity rewards.

This module has three factories: experts(), expertRelationships() for the 11 relationship statuses an expert goes through, and unreleasedExperts() for an expert that is announced and not yet released.


Types

Expert

FieldTypeDescription
idstringStable identifier
namestringDisplay name
imgstringPath to the portrait
titlestringNarrative epithet, for example "Elite Politician"
specialtystringMechanical category, for example "City Economy"
generationnumberGeneration 1, 2, or 3
unlockRequirementExpertUnlockRequirement?daysRequired, the days since server start at which the expert unlocks. Gareth has none
baseBonusesExpertStatBonus[]One or two stat bonuses, at the value reached at affinity level 100
skillsExpertSkill[]Always 4 skills
talentExpertTalentOne talent. Same shape as a skill
affinityLevelsExpertAffinityLevel[]100 rows, one for each affinity level

ExpertStatBonus

FieldTypeDescription
statstringStat name, such as Troops Lethality
statKeystringKey shared with research and other modules
valuenumberValue for display
amountnumberNumeric value
unit'percent' | 'flat'Unit of amount

ExpertSkill

ExpertTalent is the same type.

FieldTypeDescription
namestringSkill name
imgstringPath to the skill icon
descriptionstringDescription text
maxLevelnumberHighest level
progressionsExpertProgression[]Named values that scale per level, as { label, values }
costsExpertLevelCost[]EXP and books for each level, as { level, exp, books }
milestoneRewardsExpertMilestoneReward[]?Fixed item bundles unlocked at set levels
lootTableExpertLootTableEntry[]?Random reward chest, as { reward, probabilityPercent }

ExpertAffinityLevel

FieldTypeDescription
levelnumberAffinity level from 1 to 100
affinityRequirednumberAffinity needed
statBonusnumberResulting stat bonus
advancementCostnumber?Sigil cost of the milestone. Set at levels divisible by 10
levelPowernumber?Level part of the power the Experts screen shows
affinityPowernumber?Affinity part of the power, before the advancement of this level
affinityPowerAfterAdvancementnumber?Set only with advancementCost

ExpertRelationship

FieldTypeDescription
idstringStable identifier
namestringStatus name, such as Casual 1
imgstringPath to the status icon
levelnumberAffinity level at which the status starts. It lasts until the next status starts

UnreleasedExpert

FieldTypeDescription
idstringStable identifier
namestringDisplay name
imgstringPath to the portrait
unreleasedtrueMarks the entry as unreleased
unlockRequirementUnreleasedExpertUnlockRequirementheroGeneration, the generation of heroes that must unlock first

Factories

import {
  expertRelationships,
  experts,
  unreleasedExperts,
} from 'whiteout-survival-data'

experts() // all 10 released experts
expertRelationships() // all 11 relationship statuses
unreleasedExperts() // announced experts that are not released yet

Each factory also accepts a pre-filtered array, for example experts(source).


Filters

MethodSignatureReturnsDescription
byGenerationbyGeneration(generation: number)ExpertQueryExperts of generation n (1, 2, or 3). On experts().
atAffinityLevelatAffinityLevel(level: number)ExpertRelationship | undefinedThe status that applies at affinity level n. undefined below 1. On expertRelationships().

atAffinityLevel returns one entry and not a query, so it ends the chain. unreleasedExperts() has no filters.


Terminal methods

All three queries share these methods. T is Expert, ExpertRelationship, or UnreleasedExpert.

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

Examples

import {
  expertRelationships,
  experts,
  unreleasedExperts,
} from 'whiteout-survival-data'

// Names of the generation 1 experts
experts()
  .byGeneration(1)
  .get()
  .map((e) => e.name) // ['Cyrille', 'Agnes', 'Holger', 'Romulus']

// The talent and the sigil cost of the first advancement for one expert
const gareth = experts().findByName('Gareth')
gareth?.talent.name // 'Rallying Cry'
gareth?.affinityLevels[9].advancementCost // 30

// The relationship status at affinity level 45
expertRelationships().atAffinityLevel(45)?.name // 'Casual 1'

// An announced expert that is not released
const justus = unreleasedExperts().find('justus')
justus?.name // 'Justus'
justus?.unlockRequirement // { heroGeneration: 6 }

Notes

Data shape

There are 10 experts across 3 generations (4, 4, and 2).

The generation and the unlock day do not line up for two experts. Romulus is generation 1 and unlocks on day 160, after the other generation 1 experts on day 120. Kathy is generation 3 and unlocks on day 230, together with Ronne of generation 2. The data keeps both as they are.

A skill or talent covers three mechanics. Most have progressions, which are named values that scale per level, and a costs table of EXP and books per level. Agnes's talent has two independent progressions, Chest Gain and Daily Cap. Baldur and Valeria have milestoneRewards, a flat base value where leveling unlocks a fixed bundle of items at set levels. Agnes, Holger, and Baldur have a lootTable, a random reward chest. A loot table can sit on a skill or on the talent.

Power

Every skill and talent has a Power progression, the power each level adds. Max power for an expert is the skills and talent at max level, plus the level 100 levelPower, plus the level 100 affinityPowerAfterAdvancement.

An affinityLevels row has advancementCost at levels divisible by 10. Summing the column gives the "Total Sigils" figure (Agnes: 5 + 10 + ... + 50 = 275), so the module stores no separate recruitment cost.

Each row also has levelPower and affinityPower, the two power parts the Experts screen shows. All 10 experts have these values on all 100 levels. They follow one rule. Affinity power is the expert's gain times the advancement stage (levels 1 to 10 are stage 1, levels 11 to 20 are stage 2, and so on). affinityPowerAfterAdvancement uses the next stage. Level power is the gain divided by 8, times the level plus 12. The gains are:

ExpertGain
Gareth216,000
Romulus, Valeria144,000
Fabian, Kathy108,000
Holger, Ronne86,400
Baldur57,600
Agnes, Cyrille43,200

Relationships

Each status lasts until the next one starts.

StatusStarts at affinity level
Stranger1
Acquaintance 1, 2, 310, 20, 30
Casual 1, 2, 340, 50, 60
Close 1, 2, 370, 80, 90
Intimate100

Unreleased experts

unreleasedExperts() returns the announced experts that are not yet released, and experts() leaves them out. So experts() only has experts with skills, a talent, and affinity levels. An unreleased expert has an id, a name, an img, the unreleased flag, and unlockRequirement, which holds heroGeneration, the generation of heroes that must unlock first.

The data has one, Justus, who unlocks after the generation 6 heroes. On the server timeline, the generation 6 heroes unlock on day 360.

An unreleased expert has no skills, talent, bonuses, or affinity levels, and the Experts calculator does not accept its id. When the game releases the expert with its values, the entry moves to experts().

Known gaps

Levels that were not read in the game are filled from the power rule above.

Justus has no skill names or values yet. His unlockRequirement has no day, only the hero generation.

The Close 3 and Intimate relationship icons were captured while locked. The lock was painted out, so a seam can show on them.


Next steps

Previous
Hero gear stats
Next
Pets