Phenotype Variations
Phenotype & Variations
Overview
Each creature in Icarus has a visual phenotype (skin/coat variation) controlled by a single integer field in the save data. The game defines a Variations array per creature type in a dedicated IcarusMount DataTable inside data.pak, containing mesh materials, fur materials, and spawn weightings.
Key finding (extracted from current data.pak dated Feb 27 2026): Only 3 of 28 creature types have color variations via the Variations system. The remaining 25 types have a single fixed appearance.
The Variation Field
The Variation property is an IntProperty in each creature's binary data blob. It is a 0-based index into the creature's Variations array in the game's IcarusMount DataTable.
| Field | Type | Location | Description |
|---|---|---|---|
Variation |
IntProperty | Binary blob | Index into the creature's Variations array |
CosmeticSkinIndex |
IntProperty | IntVariables array | Always -1 (unused) |
LinearColorVariables |
ArrayProperty | Binary blob | Always empty (unused) |
ChildDNA.UniqueVariation |
IntProperty | ChildDNA struct | Always 0 (unused) |
Only Variation controls the visual appearance. The other fields exist in the data but are not actively used by the game.
How It Works
- Each creature type has a row in the
IcarusMountDataTable (RowStruct: /Script/Icarus.IcarusMount) insidedata.pak - Each row may contain a Variations array with entries containing:
- MeshMaterial — the creature's body material/texture path
- GFurMaterial — the creature's fur/groom material path
- CarcassMeshMaterial — the carcass body material (same for all variants)
- CarcassGFurMaterial — the carcass fur material (same for all variants)
- Weighting — spawn probability (higher = more common)
- The
Variationinteger in the save data selects which entry from this array the game renders Variation = 0is always the common/default appearance- Types with no Variations array have only one visual appearance — their
Variationfield is always0
Confirmed by Comparison
Comparing same-type creature pairs with different appearances:
| Mount Name | Type | Variation | Material | Rarity |
|---|---|---|---|---|
| Bill | Buffalo | 0 | MI_CRE_Buffalo | Common |
| Higgs | Buffalo | 4 | MI_CRE_Buffalo_Rare_VarH | Rare |
| Kupo | Moa | 0 | M_CRE_Moa | Common |
| Tawhiri | Moa | 1 | M_CRE_Moa_Var5 | Rare |
All other differences between pairs were gameplay-related (stats, position, name, level, talents) — not appearance.
Complete Variation Catalog
Source: Extracted from
data.pak(Feb 27 2026) atContent/Data/data.pakin the Icarus game installation. TheIcarusMountDataTable contains 28 creature type rows. Data was extracted by decompressing all 722 zlib chunks and parsing the JSON-like structure.
Summary
| Category | Count | Types |
|---|---|---|
| Color variations (Variations array populated) | 3 | Buffalo, Moa, Wolf |
| Single appearance (no Variations) | 25 | All others |
| Total variants | 24 | 8 per type × 3 types |
Rarity Tiers
Rarity is determined by spawn weighting:
| Weighting | Rarity | Typical |
|---|---|---|
| ≥ 1000 | Common | Default appearance |
| 100–999 | Uncommon | — |
| 25–99 | Rare | Named color variants |
| 5–24 | Legendary | White, special patterns |
| < 5 | Ultra-Rare | — |
Buffalo (8 variations)
| Index | MeshMaterial | GFurMaterial | Weight | Rarity |
|---|---|---|---|---|
| 0 | MI_CRE_Buffalo | MI_CRE_Buffalo_fur | 2000 | Common |
| 1 | MI_CRE_Buffalo_Rare_VarC | MI_CRE_Buffalo_Rare_VarC_Fur | 50 | Rare |
| 2 | MI_CRE_Buffalo_Rare_VarD | MI_CRE_Buffalo_Rare_VarD_Fur | 50 | Rare |
| 3 | MI_CRE_Buffalo_Rare_VarG | MI_CRE_Buffalo_Rare_VarG_Fur | 50 | Rare |
| 4 | MI_CRE_Buffalo_Rare_VarH | MI_CRE_Buffalo_Rare_VarH_Fur | 50 | Rare |
| 5 | MI_CRE_Buffalo_White | MI_CRE_Buffalo_White_fur | 5 | Legendary |
| 6 | MI_CRE_Buffalo_Legendary_VarA | MI_CRE_Buffalo_Legendary_VarA_Fur | 5 | Legendary |
| 7 | MI_CRE_Buffalo_Legendary_VarB | MI_CRE_Buffalo_Legendary_VarB_Fur | 5 | Legendary |
Moa (8 variations)
| Index | MeshMaterial | GFurMaterial | Weight | Rarity |
|---|---|---|---|---|
| 0 | M_CRE_Moa_MI | M_CRE_Moa_fur | 2000 | Common |
| 1 | M_CRE_Moa_Var5 | M_CRE_Moa_Var5_Fur | 50 | Rare |
| 2 | M_CRE_Moa_Var8 | M_CRE_Moa_Var8_Fur | 50 | Rare |
| 3 | M_CRE_Moa_Var9 | M_CRE_Moa_Var9_Fur | 50 | Rare |
| 4 | M_CRE_Moa_Var10 | M_CRE_Moa_Var10_Fur | 25 | Rare |
| 5 | M_CRE_Moa_Var11 | M_CRE_Moa_Var11_Fur | 25 | Rare |
| 6 | M_CRE_Moa_Var12 | M_CRE_Moa_Var12_Fur | 25 | Rare |
| 7 | M_CRE_Moa_Var13 | M_CRE_Moa_Var13_Fur | 5 | Legendary |
Wolf (8 variations)
| Index | MeshMaterial | GFurMaterial | Weight | Rarity |
|---|---|---|---|---|
| 0 | M_CRE_Wolf | M_CRE_Wolf_Fur | 2000 | Common |
| 1 | M_CRE_Wolf_Rare_VarA | M_CRE_Wolf_Rare_VarA_Fur | 50 | Rare |
| 2 | M_CRE_Wolf_Rare_VarB | M_CRE_Wolf_Rare_VarB_Fur | 50 | Rare |
| 3 | M_CRE_Wolf_Rare_VarC | M_CRE_Wolf_Rare_VarC_Fur | 50 | Rare |
| 4 | M_CRE_Wolf_Rare_VarD | M_CRE_Wolf_Rare_VarD_Fur | 50 | Rare |
| 5 | M_CRE_Wolf_Rare_VarE | M_CRE_Wolf_Rare_VarE_Fur | 50 | Rare |
| 6 | M_CRE_Wolf_Legendary_VarA | M_CRE_Wolf_Legendary_VarA_Fur | 5 | Legendary |
| 7 | M_CRE_Wolf_Legendary_VarB | M_CRE_Wolf_Legendary_VarB_Fur | 5 | Legendary |
Note: Wolf was not present in the older pak-files extraction (Feb 26). Re-extracting from the current
data.pak(Feb 27) revealed Wolf as a third creature type with color variations.
Single-Appearance Types (25 types — no Variations)
These creature types have no populated Variations array. Their Variation field is always 0 and there are no alternate visual appearances available through this mechanism.
| Creature Type | Notes |
|---|---|
| Arctic_moa | Biome variant of Moa (separate type, not a Moa color variation) |
| Blueback | — |
| Bull | — |
| Cat | Appearance is controlled by breed (separate ActorClass: BP_Tame_Cat_C, BP_Tame_Cat_B_C, BP_Tame_Cat_C_C) |
| Chicken | Colors are separate D_Mounts rows (Chicken, Chicken_A2, Chicken_A3), not Variations |
| Cow | — |
| Dog | Appearance is controlled by breed (9 separate ActorClasses: BP_Tame_Dog_A1_C through BP_Tame_Dog_E_C) |
| DogSmall | Small dog sub-type |
| Horse | Terrenus Horse (single appearance) |
| Horse_Standard | Colors are separate D_Mounts rows (A1=Brown, A2=Black, A3=White), not Variations |
| Mini_Hippo | — |
| Pig | — |
| Ram | — |
| Rooster | — |
| Sheep | — |
| Snow_Striker | — |
| Snow_Wolf | Biome variant of Wolf (separate type, not a Wolf color variation) |
| Swamp_Bird | — |
| SwampQuad | — |
| Tusker | — |
| Zebra | — |
| Wild_Boar | — |
| Wolf_Desert | Biome variant of Wolf (separate type, not a Wolf color variation) |
| WoollyMammoth | — |
| WoolyZebra | — |
Visual Variation Mechanisms — Complete Reference
The game uses three distinct mechanisms for creature visual differences:
1. Variation Array (Color Variants)
- Applies to: Buffalo, Moa, Wolf
- Mechanism:
VariationIntProperty indexes into IcarusMount Variations array - Editable: Yes — change the integer value (0 to 7)
- In save data:
Variationfield in binary blob
2. Breed / ActorClass (Breed Variants)
- Applies to: Dog (9 breeds), Cat (3 breeds), Horse Standard (3 colors), Chicken (3 colors)
- Mechanism: Each breed has a separate
ActorClassblueprint or separate D_Mounts row name - Editable: Requires changing the creature's D_Mounts row name reference — more complex
- In save data: Row name reference in the mount entry
3. Biome / Separate CreatureType
- Applies to: Arctic Moa (vs Moa), Snow Wolf (vs Wolf), Desert Wolf (vs Wolf)
- Mechanism: Completely separate CreatureType entry
- Editable: Would require species swap (see Species & Types)
Phenotype Mutation Talents
Two breeding-tree talents influence the chance of offspring inheriting rare phenotypes:
| Talent | Effect per Rank | Max Ranks |
|---|---|---|
| Visual Anomaly | +0.05 CosmeticMutationChance | 3 (+0.15 total) |
| Prime Variants | +0.05 CosmeticMutationChance | 3 (+0.15 total) |
These talents increase the probability that a bred creature receives a non-zero Variation index (i.e., a rarer visual appearance) rather than the common default. They are only relevant for the 3 types that have Variations data (Buffalo, Moa, Wolf).
Binary Format Reference
The Variation field is encoded as a standard IntProperty in the binary blob:
0A 00 00 00 # name length = 10
56 61 72 69 61 74 69 6F 6E 00 # "Variation\0"
0C 00 00 00 # type length = 12
49 6E 74 50 72 6F 70 65 72 74 79 00 # "IntProperty\0"
04 00 00 00 # data size = 4
00 00 00 00 # array index = 0
00 # extra byte
04 00 00 00 # value = 4 (little-endian)
The value is a signed 32-bit little-endian integer. Valid range is 0 to N-1 where N is the number of entries in the creature type's Variations array (8 for Buffalo, Moa, and Wolf).
Data Source & Extraction
The variation data lives in data.pak at:
<Steam>/steamapps/common/Icarus/Icarus/Content/Data/data.pak
This is a UE4 pak file (~2.1MB) containing 722 zlib-compressed chunks totaling ~35.7M chars of JSON-like DataTable text. The IcarusMount DataTable (RowStruct: /Script/Icarus.IcarusMount) starts in chunk #57 and spans ~91K chars.
Important: The data.pak is updated with each game patch. Our pak-files/ directory contains pre-extracted chunks from an older version (Feb 26). When re-extracting, always use the current data.pak from the Steam installation to ensure accuracy.
Editor Integration
The Appearance dropdown in the Overview Tab allows changing a creature's visual phenotype directly:
- Buffalo, Moa, Wolf: Dropdown shows 8 variations, each labeled with index, rarity tier (Common/Rare/Legendary), and material name (e.g.,
3: Rare — MI_CRE_Buffalo_Rare_VarG) - All other 25 types: Dropdown shows "Default (single appearance)" and is disabled
- Selecting a variation updates the
VariationIntProperty in the binary data - On species swap, the variation automatically resets to
0(common default) - Out-of-range values are prevented by validation in
MountModel.variation
Implementation Details
| Component | Location | Role |
|---|---|---|
variation_data.py |
Root | Auto-generated module with VARIATION_DATA, public API functions |
MountModel.variation |
editor/mount_model.py |
Read/write property with per-type validation |
| Appearance dropdown | editor/overview_tab.py |
Identity section, row 4 |
test_variation.py |
tests/ |
36 tests: data API, model, swap reset, labels, edge cases |
Public API (variation_data)
from variation_data import (
get_variations, # Full variation dicts for a type
get_variation_count, # Number of variations (0 for single-appearance)
get_variation_labels, # Formatted labels for dropdown
get_variation_label, # Single label by index
has_variations, # True for Buffalo/Moa/Wolf
validate_variation_index,# Bounds check
get_rarity_tier, # Weighting → rarity string
)
See also: GUI Guide — Appearance · Binary Format — IntProperty · Species & Types — Save Data Fields · Architecture — Variation Pipeline