digraph mygraph { fontname="monospace" edge [fontname="Noto Serif"] node [ fontname="Noto Serif" style=filled shape=plain fillcolor="#60200080" pencolor="#00000080" // frames color ] subgraph rankedTop { "Global" [ label =<

Global
Propagator: GLOBAL_EFFECT
C++ Class: CGameState
Global node to which all map entities are connected
Note: Not recruited heroes (such as in tavern) are not attached to any node
Contains global bonuses, global stack experience and difficulty bonuses

> ] "Team" [ label =<

Team
Propagator: TEAM
C++ Class: TeamState
Per-team node. Game will put players without team into a team with a single player

> ] "Player" [ label =<

Player
Propagator: PLAYER
C++ Class: CPlayerState
Per-player team. All objects owned by a player belong to such node

> ] }; subgraph rankedArmies { rank="same" "Hero" [ fillcolor="#80808080" label =<

Hero
Propagator: HERO
C++ Class: CGHeroInstance
Represents a hero, either owned by player or in prison. Bonuses from specialty and secondary skills are attached directly to this node
Contains per-hero global bonuses, specialty bonuses, primary and secondary skill bonuses, campaign primary skill bonus

> ] }; subgraph rankedHeroes { rank="same" "Visiting Hero" [ fillcolor="#80808080" label =<

Visiting Hero
Hero that is currently visiting owned or allied town

> ] "Hero defending town" [ fillcolor="#80808080" label =<

Hero defending town
Hero that is currently fighting on a defending side in a siege

> ] "Wandering Hero" [ fillcolor="#80808080" label =<

Wandering Hero
Hero that is currently moving on map, outside of towns

> ] "Neutral Army" [ fillcolor="#80808080" label =<

Neutral Army
Any army that is not owned by a player Wandering monsters, Banks, Events, etc

> ] "Owned Army" [ fillcolor="#80808080" label =<

Owned Army
Army owned by a player. Mines, Garrisons, Dwellings

> ] "Owned Object" [ label =<

Owned Object
Other objects owned by a player, like Lighthouse
Contains Flaggable Objects bonuses

> ] }; subgraph rankedTopHero { rank="same" "Town" [ fillcolor="#80808080" label =<

Town
Propagator: TOWN
C++ Class: CGTownInstance
Represents a town on map.
Contains town building bonuses

> ] "Artifact Instance" [ fillcolor="#00FFFF80" label =<

Artifact Instance
C++ Class: CArtifactInstance
Represents a particular instance of an artifact that hero can equip or trade
Contains bonuses of spell scrolls and growing artifacts

> ] "Boat" [ fillcolor="#00FFFF80" label =<

Boat
C++ Class: CGBoat
Represents a boat or other type of transport.
Contains bonuses provided to boarded hero

> ] }; subgraph rankedMisc { "Town and visiting hero" [ label =<

Town and Visiting Hero
Propagator: TOWN_AND_VISITOR
C++ Class: CTownAndVisitingHero
Helper node that exists solely to propagate bonuses to both town and visiting hero
Note: Neutral towns are attached to global node instead

> ] "Combat" [ label =<

Combat
Propagator: BATTLE_WIDE
C++ Class: BattleInfo
Node that contains both sides of a combat Anything propagated to this node will affect both sides in combat
Contains battlefield and native terrain bonuses

> ] "Creature Type" [ fillcolor="#00FFFF80" label =<

Creature Type
C++ Class: CCreature
Represents a creature type, such as Pikeman or Archer
Contains creature abilities bonuses, stack experience bonuses

> ] "Artifact Type" [ fillcolor="#00FFFF80" label =<

Artifact Type
C++ Class: CArtifact
Represents an artifact type, for example Ring of Life
Contains fixed bonuses of artifacts

> ] "Artifact Component" [ fillcolor="#80808080" label =<

Artifact Component
C++ Class: CArtifactInstance
For combined, non-fused artifacts, instances of components are attached to instance of combined artifact

> ] "Army" [ label =<

Army
Propagator: ARMY
C++ Class: CArmedInstance
Represents any object that can hold army, such as town, hero, mines, garrisons, wandering monsters
Contain anti-magic garrison bonus, faction mixing morale bonus

> ] "Unit in Army" [ label =<

Unit in Army
C++ Class: CStackInstance
Represents a unit that is part of a army A unit always has a creature type, belongs to an army and has stack size

> ] "Commander" [ label =<

Commander
C++ Class: CCommanderInstance
Represents a hero commander, WoG feature

> ] "Unit in Combat" [ label =<

Unit in Combat
C++ Class: CStack
Represents current state of a unit during combat, can be affected by spells or receive damage

> ] "Summon in Combat" [ label =<

Summon in Combat
C++ Class: CStack
Represents any unit that was added in combat, and may not remain after combat

> ] }; "Global" -> "Team" "Global" -> "Neutral Army" "Team" -> "Player" "Player" -> "Town and visiting hero" "Player" -> "Wandering Hero" "Player" -> "Owned Army" "Player" -> "Owned Object" "Town and visiting hero" -> "Town" "Town and visiting hero" -> "Visiting Hero" "Boat" -> "Hero" "Combat" -> "Army" "Army" -> "Commander" "Army" -> "Unit in Army" "Army" -> "Summon in Combat" "Unit in Army" -> "Unit in Combat" "Commander" -> "Unit in Combat" "Artifact Type" -> "Artifact Instance" "Artifact Component" -> "Artifact Instance" "Artifact Instance" -> "Hero" "Creature Type" -> "Commander" "Creature Type" -> "Summon in Combat" "Creature Type" -> "Unit in Army" "Town" -> "Hero defending town" "Town" -> "Army" "Neutral Army" -> "Army" "Owned Army" -> "Army" "Visiting Hero" -> "Hero" "Hero defending town" -> "Hero" "Wandering Hero" -> "Hero" "Hero" -> "Army" }