diff --git a/doc/changelogs/nyan_api/v0.5.0.md b/doc/changelogs/nyan_api/v0.5.0.md
new file mode 100644
index 0000000000..127a2b4d37
--- /dev/null
+++ b/doc/changelogs/nyan_api/v0.5.0.md
@@ -0,0 +1,27 @@
+# [0.5.0] - 2024-07-29
+All notable changes for version [v0.5.0] are documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## Renamed
+### Ability module
+- Rename `Hitbox` to `Collision`
+
+## Added
+### Ability module
+- Add `Pathable(Ability)` object; defines pathing costs for the game entity when the ability is active
+- Add `path_type : PathType` member to `Move`
+
+### Utility module
+- Add `PathType(Object)` object; associates move abilities with pathfinding grids
+- Add `path_costs : dict(children(PathType), int)` member to `Terrain`; defines pathing costs for the terrain
+
+### Removed
+### Ability module
+- Remove `Passable(Ability)` object; functionality superceded by `Pathable`
+
+
+## Reference visualization
+
+* [Gamedata](https://github.com/SFTtech/openage/blob/f1967c3c002d444510e50f54c9cdbb83419a9ec4/doc/nyan/aoe2_nyan_tree.svg)
diff --git a/doc/nyan/aoe2_nyan_tree.svg b/doc/nyan/aoe2_nyan_tree.svg
index 8a50988dbe..27360da9cf 100644
--- a/doc/nyan/aoe2_nyan_tree.svg
+++ b/doc/nyan/aoe2_nyan_tree.svg
@@ -9,13 +9,13 @@
>PathTypeNextCommandMoveNextCommandIdleCommandInQueueConditionnext : NodeCommandInQueueWaitAbilityconstruction_progress : set(Progress)TransformCarryRestockHarvestConstructare game entitiesProjectileBarracksSwordsmanRelicTreeTruePatchPropertyResetProgressPropertymultiplier : floatModifierPropertyNOTSUBSETMAXsize : intAnyAnyAnyTechTypethreshold : floatNyanPatchMeanDistributionTypeblacklisted_entities : set(GameEntity)NormalGatestances : set (DiplomaticStance)PassableModeallowed_types : set(GameEntityType)blacklisted_entities : set(GameEntity)Hitboxradius_x : floatradius_y : floatradius_z : floatProjectileHitTerrainstances : set(DiplomaticStance)SUBSETMINsize : intexclude : set(ResearchableTech)Creatablesexclude : set(CreatableGameEntity)ProductionModeProductionQueuesize : intproduction_modes : set(ProductionMode)container : EntityContainerNoStackLinearshift_x : intshift_y : intscale_factor : floatHyperbolicshift_x : intshift_y : intscale_factor : floatCalculationTypeStackedstack_limit : intcalculation_type : CalculationTypedistribution_type : DistributionTypeTerrainTypeMostHerdingLongestTimeInRangeClosestHerdingHerdableModeShadowTimeRelativeProgressIncreaseTimeRelativeProgressDecreaseTimeRelativeProgressIncreaseTimeRelativeProgressDecreaseAttributeChangePaymentModeResearchAttributeCostattributes : set(Attribute)researchables : set(ResearchableTech)CreationAttributeCostattributes : set(Attribute)creatables : set(CreatableGameEntity)payment_mode : PaymentModeUnconditionalUnconditionalTimeRelativeProgressChangeTimeRelativeAttributeChangePricePoolDynamicchange_value : floatmin_price : floatmax_price : floatPriceModeDepositResourcesOnProgressprogress_type : ProgressTyperesources : set(Resource)affected_types : set(GameEntityType)blacklisted_entities : set(GameEntity)Attributename : TranslatedStringabbreviation : TranslatedStringOverlayTerrainterrain_overlay : TerrainTerrainRequirementallowed_types : set(TerrainType)blacklisted_terrains : set(Terrain)state_change : StateChangerAoE1TradeRouteexchange_resources : set(Resource)trade_amount : intProgressTypeTimeRelativeProgressChangetype : ProgressTypeFlatAttributeIncreaseFlatAttributeDecreaseTimeRelativeAttributeChangetype : AttributeChangeTypeTimeRelativeProgressChangetype : ProgressTypetotal_change_time : floatTimeRelativeAttributeIncreaseTimeRelativeAttributeDecreaseTimeRelativeAttributeChangetype : AttributeChangeTypetotal_change_time : floatignore_protection : set(ProtectingAttribute)progress : floatRefundOnConditioncondition : set(LogicElement)refund_amount : set(ResourceAmount)sounds : set(Sound)InverseLinearAdjacentTilesVariantnorth : optional(GameEntity)north_east : optional(GameEntity)east : optional(GameEntity)south_east : optional(GameEntity)south : optional(GameEntity)south_west : optional(GameEntity)west : optional(GameEntity)north_west : optional(GameEntity)Placetile_snap_distance : floatclearance_size_x : floatclearance_size_y : floatallow_rotation : boolmax_elevation_difference : intPlacementModeSendToContainerTypeLureTypeDiplomaticLineOfSightdiplomatic_stance : DiplomaticStanceNormalInContainerDiscreteEffectcontainers : set(EntityContainer)ability : ApplyDiscreteEffectInContainerContinuousEffectcontainers : set(EntityContainer)ability : ApplyContinuousEffectStateChangerenable_abilities : set(Ability)disable_abilities : set(Ability)enable_modifiers : set(Modifier)disable_modifiers : set(Modifier)transform_pool : optional(TransformPool) = Nonepriority : intopenage nyan data API v0.4.1openage nyan data API v0.5.0blacklisted_entities : set(GameEntity)Standardresource_spot : ResourceSpotAoE2ProjectileAmountprovider_abilities : set(ApplyDiscreteEffect)receiver_abilities : set(ApplyDiscreteEffect)change_types : set(AttributeChangeType)Orange elements:Effects/Resistances that canbe applied on other gameentitiesRevealline_of_sight : floataffected_types : set(GameEntityType)blacklisted_entities : set(GameEntity)ResearchTimeresearchables : set(ResearchableTech)StorageElementCapacitystorage_element : StorageElementDefinitionEntityContainerCapacitycontainer : EntityContainerHerdrange : floatstrength : intallowed_types : set(GameEntityType)blacklisted_entities : set(GameEntity)condition : set(LogicElement)ResearchResourceCostresources : set(Resource)researchables : set(ResearchableTech)CreationResourceCostresources : set(Resource)creatables : set(CreatableGameEntity)CreationTimecreatables : set(CreatableGameEntity)resource_spot : ResourceSpotAbsoluteProjectileAmountamount : floatStrayMoveModeModifierScopeExpectedPositionCurrentPositionTargetModeSendToContainertype : SendToContainerTypesearch_range : floatignore_containers : set(EntityContainer)SendToContainertype : SendToContainerTypestorages : set(EntityContainer)Scopedstances : set(DiplomaticStance)scope : ModifierScopesubformations : set(Subformation)FlatAttributeIncreaseFlatAttributeDecreaseFlatAttributeIncreaseFlatAttributeDecreaseFlatAttributeIncreaseFlatAttributeDecreaseFlatAttributeIncreaseFlatAttributeDecreaseAoE2TradeRouteend_trade_post : GameEntityTechtypes : set(TechType)name : TranslatedStringdescription : TranslatedMarkupFilelong_description : TranslatedMarkupFileupdates : orderedset(Patch)FallbackLinearNoDropoffDropoffTypecost : CostEntityContainerallowed_types : set(GameEntityType)blacklisted_entities : set(GameEntity)storage_element_defs : set(StorageElementDefinition)slots : intcarry_progress : set(Progress)string : textLuretype : LureTypestances : set(DiplomaticStance)DiplomaticStanceExitContainerallowed_containers : set(EntityContainer)EnterContainerallowed_containers : set(EntityContainer)allowed_types : set(GameEntityType)blacklisted_entities : set(GameEntity)max_range : intHuntConvertTypemax_range : intMakeHarvestableresource_spot : ResourceSpotresist_condition : set(LogicElement)MakeHarvestableresource_spot : ResourceSpotGatherauto_resume : boolresume_search_range : floattargets : set(ResourceSpot)gather_rate : ResourceRatecontainer : ResourceContainerMonkHealApplyContinuousEffecteffects : set(ContinuousEffect)application_delay : floatallowed_types : set(GameEntityType)blacklisted_entities : set(GameEntity)ApplyDiscreteEffectbatches : set(EffectBatch)reload_time : floatapplication_delay : floatallowed_types : set(GameEntityType)blacklisted_entities : set(GameEntity)FlatAttributeChangetype : AttributeChangeTypeblock_rate : AttributeRateContinuousResistancerate : floatDiscreteResistanceDiscreteEffectFlatAttributeChangetype : AttributeChangeTypemin_change_rate : optional(AttributeRate) = Nonemax_change_rate : optional(AttributeRate) = Nonechange_rate : AttributeRateignore_protection : set(ProtectingAttribute)ContinuousEffectAoE2Convertguaranteed_resist_rounds : intprotected_rounds : intprotection_round_recharge_time : floatAoE2Convertskip_guaranteed_rounds : intskip_protected_rounds : intConverttype : ConvertTypechance_resist : floatConverttype : ConvertTypemin_chance_success : optional(float) = Nonemax_chance_success : optional(float) = Nonechance_success : floatcost_fail : optional(Cost) = NoneAttributeChangeTypeFlatAttributeChangetype : AttributeChangeTypeblock_value : AttributeAmountFlatAttributeChangetype : AttributeChangeTypemin_change_value : optional(AttributeAmount) = Nonemax_change_value : optional(AttributeAmount) = Nonechange_value : AttributeAmountignore_protection : set(ProtectingAttribute)Effectors' sideResistors' sideproperties : dict(EffectProperty, EffectProperty) = {}Resistanceproperties : dict(ResistanceProperty, ResistanceProperty) = {}amount : intAccuracyaccuracy : floataccuracy_dispersion : floatdispersion_dropoff : DropOffTypetarget_types : set(GameEntityType)blacklisted_entities : set(GameEntity)protects : AttributeAttributeSettingattribute : Attributemin_value : intmax_value : intstarting_value : intsprite : fileCreatableGameEntitygame_entity : GameEntityvariants : set(Variant)cost : Costcreation_time : floatcreation_sounds : set(Sound)condition : set(LogicElement)placement_modes : set(PlacementMode)scope : LiteralScopeProjectilearc : intaccuracy : set(Accuracy)target_mode : TargetModeignored_types : set(GameEntityType)unignore_entities : set(GameEntity)change_progress : set(Progress)HitboxCollisionhitbox : HitboxNamedname : TranslatedStringdescription : TranslatedMarkupFilelong_description : TranslatedMarkupFileblacklisted_entities : set(GameEntity)Herdableadjacent_discover_range : floatmode : HerdableModeStopPassablePathablehitbox : Hitboxmode : PassableModepath_costs : dict(PathType, int)angle : intRestockauto_restock : booltarget : ResourceSpotrestock_time : floatmanual_cost : Costauto_cost : Costamount : intPassiveStandGroundAggressiveTradePosttrade_routes : set(TradeRoute)PatrolGameEntityStancesearch_range : floatability_preference : orderedset(Ability)type_preference : orderedset(GameEntityType)stances: set(GameEntityStance)SendBackToTaskallowed_types : set(GameEntityType)blacklisted_entities : set(GameEntity)TransferStoragestorage_element : GameEntitysource_container : EntityContainertarget_container : EntityContainerGameEntityProgressgame_entity : GameEntitystatus : ProgressStatuspriority : intActiveTransformTotarget_state : StateChangertransform_time : floattransform_progress : set(Progress)Selectableselection_box : SelectionBoxRallyPointWhite elements:AoE2 specific objectsYellow elements:Modifiers (handled by engineimplementation)Green elements:Abilities (handled by engineimplementation)Pink elements:Basic nyan API objectsmin_elevation_difference : optional(float) = NoneFlyoverrelative_angle : floatflyover_types : set(GameEntityType)blacklisted_entities : set(GameEntity)sprite : fileVillager Gather abilities canoverride the graphics ofIdle,Move,Die and Despawnvia CarryProgress objects withAnimationOverridesAbilities andStorageElementscan use theseOverride typesto change anyother ability'sanimation.If min_projectiles is greater thanthe number of Projectiles inprojectiles, the last projectilein the orderedset should be usedIn AoE2 there is onlyone HarvestProgress Statein the interval [0,100],but AoM had more.Stores what happens aftera percentage ofconstruction, damage,transformation, etc. isreachedProgressproperties : dict(ProgressProperty, ProgressProperty) = {}type : ProgressTypeleft_boundary : floatright_boundary : floatetc.)RemoveStoragecontainer : EntityContainerstorage_elements : set(GameEntity)CollectStoragecontainer : EntityContainerstorage_elements : set(GameEntity)StorageElementDefinitionstorage_element : GameEntityelements_per_slot : intconflicts : set(StorageElementDefinition)state_change : optional(StateChanger) = NoneStoragecontainer : EntityContainerempty_condition : set(LogicElement)chance_share : floatResearchresearchables : set(ResearchableTech)container : ResourceContainerCreatecreatables : set(CreatableGameEntity)RelicBonusattribute : AttributeFeitoriaBonusFoodAmountWoodAmountStoneAmountGoldAmountrates : set(ResourceRate)Modifier should only be usedin cases where Patches don'twork. For example, if thebonus is a percentage valueor continuously stacks (likeresources from the Feitoria).Modifier objects can still bepatched.IdlePlayerSetupname : TranslatedStringdescription : TranslatedMarkupFilelong_description : TranslatedMarkupFileleader_names : set(TranslatedString)modifiers : set(Modifier)starting_resources : set(ResourceAmount)game_setup : orderedset(Patch)Despawnactivation_condition : set(LogicElement)despawn_condition : set(LogicElement)despawn_time : floatstate_change : optional(StateChanger) = NoneTauntactivation_message : textdisplay_message : TranslatedStringsound : Soundattributes : set(AttributeSetting)Harvestableresources : ResourceSpotharvest_progress : set(Progress)restock_progress : set(Progress)gatherer_limit : intharvestable_by_default : boolPassiveTransformTocondition : set(LogicElement)transform_time : floattarget_state : StateChangertransform_progress : set(Progress)resistances : set(Resistance)ShootProjectileprojectiles : orderedset(GameEntity)min_projectiles : intmax_projectiles : intmin_range : intmax_range : intreload_time : floatspawn_delay : floatprojectile_delay : floatrequire_turning : boolmanual_aiming_allowed : boolspawning_area_offset_x : floatspawning_area_offset_y : floatspawning_area_offset_z : floatspawning_area_width : floatspawning_area_height : floatspawning_area_randomness : floatallowed_types : set(GameEntityType)blacklisted_entities : set(GameEntity)rate : AttributeRateFormationformations : set(GameEntityFormation)Movespeed : floatmodes : set(MoveMode)path_type : PathTypeanimations : set(Animation)Abilityproperties : dict(AbilityProperty, AbilityProperty) = {}patches : orderedset(Patch)Patchproperties : dict(PatchProperty, PatchProperty) = {}patch : NyanPatchModifierproperties : dict(ModifierProperty, ModifierProperty) = {}sounds : orderedset(file)TerrainAmbientmax_density : intTerrainname : TranslatedStringtypes : set(TerrainType)terrain_graphic : Terrainsound : Soundambience : set(TerrainAmbient)path_costs : dict(PathType, int)ResearchableTechtech : Techcost : Costresearch_time : floatresearch_sounds : set(Sound)condition : set(LogicElement)TranslatedSoundtranslations : set(LanguageSoundPair)TranslatedMarkupFiletranslations : set(LanguageMarkupPair)TranslatedObjectTranslatedStringtranslations : set(LanguageTextPair)max_storage : intResourceSpotresource : Resourcemax_amount : intstarting_amount : intdecay_rate : floatDropSiteaccepts_from : set(ResourceContainer)GameEntitytypes : set(GameEntityType)abilities : set(Ability)modifiers : set(Modifier)variants : set(Variant)Object
UMLClass
1330
- 3730
+ 3710
320
- 130
+ 150
*Terrain*
bg=pink
@@ -242,13 +242,14 @@ name : TranslatedString
types : set(TerrainType)
terrain_graphic : Terrain
sound : Sound
-ambience : set(TerrainAmbient)
+ambience : set(TerrainAmbient)
+path_costs : dict(PathType, int)
UMLClass
- 1510
+ 1530
3900
190
80
@@ -387,14 +388,15 @@ sounds : set(Sound)
4310
3840
180
- 80
+ 100
*Move*
bg=green
--
speed : float
-modes : set(MoveMode)
+modes : set(MoveMode)
+path_type : PathType
@@ -557,7 +559,7 @@ changes : orderedset(Patch)
Relation
- 1540
+ 1580
3850
30
70
@@ -582,10 +584,10 @@ changes : orderedset(Patch)
1470
3620
30
- 130
+ 110
lt=-
- 10.0;10.0;10.0;110.0
+ 10.0;10.0;10.0;90.0
UMLClass
@@ -1934,16 +1936,16 @@ foundation_terrain : Terrain
UMLClass
5100
- 4310
+ 4320
220
- 90
+ 80
- *Passable*
+ *Pathable*
bg=green
--
hitbox : Hitbox
-mode : PassableMode
+path_costs : dict(PathType, int)
@@ -2016,11 +2018,11 @@ long_description : TranslatedMarkupFile
UMLClass
5100
- 4410
- 140
+ 4420
+ 220
80
- *Hitbox*
+ *Collision*
bg=green
--
@@ -3829,10 +3831,10 @@ bg=pink
UMLClass
- 1100
- 3980
+ 1040
+ 4100
270
- 120
+ 130
*Tech*
bg=pink
@@ -3851,10 +3853,10 @@ updates : orderedset(Patch)
1230
3650
30
- 350
+ 470
lt=<<-
- 10.0;10.0;10.0;330.0
+ 10.0;10.0;10.0;450.0
UMLClass
@@ -4524,7 +4526,7 @@ ignore_containers : set(EntityContainer)
Relation
5060
- 4440
+ 4450
60
30
@@ -4612,7 +4614,7 @@ ignore_containers : set(EntityContainer)
Relation
5060
- 4340
+ 4350
60
30
@@ -5502,7 +5504,7 @@ blacklisted_entities : set(GameEntity)
230
30
- openage nyan data API v0.4.1
+ openage nyan data API v0.5.0
@@ -7118,7 +7120,7 @@ bg=pink
UMLClass
- 1350
+ 1400
3900
120
60
@@ -7131,7 +7133,7 @@ bg=pink
Relation
- 1400
+ 1450
3850
30
70
@@ -7809,8 +7811,8 @@ bg=pink
UMLClass
- 5280
- 4410
+ 5380
+ 4420
140
100
@@ -7823,105 +7825,17 @@ radius_y : float
radius_z : float
-
- Relation
-
- 5230
- 4440
- 70
- 30
-
- lt=<.
- 50.0;10.0;10.0;10.0
-
-
- UMLClass
-
- 5380
- 4310
- 320
- 90
-
- *PassableMode*
-bg=pink
-
---
-allowed_types : set(GameEntityType)
-blacklisted_entities : set(GameEntity)
-
-
Relation
5310
- 4340
+ 4450
90
30
lt=<.
70.0;10.0;10.0;10.0
-
- UMLClass
-
- 5600
- 4490
- 220
- 80
-
- *Gate*
-bg=pink
-
---
-stances : set (DiplomaticStance)
-
-
-
- UMLClass
-
- 5600
- 4420
- 110
- 60
-
-
-*Normal*
-bg=pink
-
-
-
- Relation
-
- 5560
- 4390
- 30
- 150
-
- lt=<<-
- 10.0;10.0;10.0;130.0
-
-
- Relation
-
- 5560
- 4440
- 60
- 30
-
- lt=-
- 10.0;10.0;40.0;10.0
-
-
- Relation
-
- 5560
- 4510
- 60
- 30
-
- lt=-
- 10.0;10.0;40.0;10.0
-
UMLClass
@@ -8116,17 +8030,6 @@ stack_limit : int
lt=<<-
10.0;10.0;10.0;270.0
-
- Relation
-
- 1230
- 3920
- 140
- 30
-
- lt=-
- 10.0;10.0;120.0;10.0
-
Relation
@@ -8293,7 +8196,7 @@ game_entities : set(GameEntity)
UMLClass
1070
- 3870
+ 4000
120
60
@@ -8306,7 +8209,7 @@ bg=pink
Relation
1180
- 3890
+ 4020
80
30
@@ -8317,18 +8220,18 @@ bg=pink
Relation
1120
- 3920
+ 4050
30
- 80
+ 70
lt=<.
- 10.0;10.0;10.0;60.0
+ 10.0;10.0;10.0;50.0
UMLClass
1090
- 3780
+ 3910
100
60
@@ -8337,22 +8240,11 @@ bg=pink
bg=pink
-
- Relation
-
- 1180
- 3800
- 80
- 30
-
- lt=-
- 10.0;10.0;60.0;10.0
-
Relation
1130
- 3830
+ 3960
30
60
@@ -8362,7 +8254,7 @@ bg=pink
UMLClass
- 1400
+ 1410
3990
100
60
@@ -8375,7 +8267,7 @@ bg=pink
Relation
- 1430
+ 1450
3950
30
60
@@ -10633,4 +10525,28 @@ bg=pink
lt=-
10.0;10.0;30.0;10.0
+
+ UMLClass
+
+ 4340
+ 3980
+ 120
+ 60
+
+
+*PathType*
+bg=pink
+
+
+
+ Relation
+
+ 4390
+ 3930
+ 30
+ 70
+
+ lt=<.
+ 10.0;50.0;10.0;10.0
+
diff --git a/doc/nyan/api_reference/reference_ability.md b/doc/nyan/api_reference/reference_ability.md
index 098492089e..dfddc1c82f 100644
--- a/doc/nyan/api_reference/reference_ability.md
+++ b/doc/nyan/api_reference/reference_ability.md
@@ -259,6 +259,18 @@ Container the target game entity will be inserted into. A `Storage` ability with
**storage_elements**
Game entities that can be inserted into the container. The container must allow the `GameEntity` objects.
+## ability.type.Collision
+
+```python
+Collision(Ability):
+ hitbox : Hitbox
+```
+
+Adds collision behaviour to a game entity.
+
+**hitbox**
+Defines the size (x, y, z) of the collision hitbox.
+
## ability.type.Constructable
```python
@@ -567,18 +579,6 @@ When other herdables are in this range around the herded game entity, they will
**mode**
Determines who gets ownership of the herdable game entity when multiple game entities using `Herd` are in range.
-## ability.type.Hitbox
-
-```python
-Hitbox(Ability):
- hitbox : Hitbox
-```
-
-Adds a hitbox to a game entity that is used for collision with other game entities.
-
-**hitbox**
-Defines the size (x, y, z) of the hitbox.
-
## ability.type.Idle
```python
@@ -628,8 +628,9 @@ Lock pools definitions.
```python
Move(Ability):
- speed : float
- modes : set(MoveMode)
+ speed : float
+ modes : set(MoveMode)
+ path_type : children(PathType)
```
Allows a game entity to move around the map.
@@ -638,7 +639,10 @@ Allows a game entity to move around the map.
Speed of movement.
**modes**
-Type of movements that can be used.
+Modes of movements that can be used.
+
+**path_type**
+Path type determining which pathfinding grid is searched to find a path from the start to the goal location.
## ability.type.Named
@@ -672,22 +676,6 @@ Temporarily replace the map terrain the game entity is positioned on with a spec
**terrain_overlay**
Terrain that is temporily replaces the existing map terrain.
-## ability.type.Passable
-
-```python
-Passable(Ability):
- hitbox : Hitbox
- mode : PassableMode
-```
-
-Deactivates a specified hitbox of the game entity for movement of other game entities. The hitbox is still relevant for the game entity's own movement.
-
-**hitbox**
-Reference to the hitbox that should be deactivated.
-
-**mode**
-Defines the game entities for which the hitbox is deactivated.
-
## ability.type.PassiveTransformTo
```python
@@ -712,6 +700,28 @@ State change activated after `transform_time` has passed.
**transform_progress**
Can alter the game entity while the transformation is in progress. The objects in the set must have progress type `Transform`.
+## ability.type.Pathable
+
+```python
+Pathable(Ability):
+ hitbox : Hitbox
+ path_costs : dict(children(PathType), int)
+```
+
+Lets a game entity influence the pathing costs on the (static) pathfinding grid.
+
+This ability should only be used for game entitie that never (or rarely) change positions as pathfinding grid recalculations are expensive. For dynamic pathfinding effects, using the `Collision` ability should be preferred.
+
+**hitbox**
+Hitbox around the game entity that affects the underlying pathfinding grids. All grid cells that are covered by this hitbox ae influenced by the cost definitions in the `path_costs` attribute.
+
+**path_costs**
+Costs of traversing the area defined by the `hitbox` attribute on the pathfinding grid.
+
+Keys are `PathType` objects that are associated with a pathfinding grid in the pathfinder.
+
+Values represent the pathing cost for the terrain on the pathfinding grid. Each value must be an integer between `1` and `255`. `1` defines the *minimum* possible cost and `254` represents the *maximum* possible cost. `255` signifies that the terrain is impassable for the specified path type.
+
## ability.type.ProductionQueue
```python
diff --git a/doc/nyan/api_reference/reference_util.md b/doc/nyan/api_reference/reference_util.md
index 66fced3ff6..dd9646e862 100644
--- a/doc/nyan/api_reference/reference_util.md
+++ b/doc/nyan/api_reference/reference_util.md
@@ -1491,43 +1491,6 @@ Patrol(MoveMode):
Lets player set two or more waypoints that the game entity will follow. Stances from `GameEntityStance` ability are considered during movement.
-## util.passable_mode.PassableMode
-
-```python
-PassableMode(Object):
- allowed_types : set(children(GameEntityType))
- blacklisted_entities : set(GameEntity)
-```
-
-Generalization object for all passable modes. Define passability options for the `Passable` ability.
-
-**allowed_types**
-Lists the game entities types which can pass the hitbox.
-
-**blacklisted_entities**
-Used to blacklist game entities that have one of the types listed in `allowed_types`, but should not be covered by this `PassableMode` object.
-
-## util.passable_mode.type.Gate
-
-```python
-Gate(PassableMode):
- stances : set(children(DiplomaticStance))
-```
-
-Lets all compatible game entities from players with the specified stances pass through the hitbox. Game entities of players with other stances can also pass through while any unit is passing through.
-
-**stances**
-Stances of players whose game entities are always allowed to pass though the hitbox.
-
-## util.passable_mode.type.Normal
-
-```python
-Normal(PassableMode):
- pass
-```
-
-Lets all compatible game entities pass through the hitbox.
-
## util.patch.NyanPatch
```python
@@ -1578,6 +1541,15 @@ The patch is applied to all players that have the specified diplomatic stances.
**stances**
Diplomatic stances of the players the patch should apply to.
+## util.path_type.PathType
+
+```python
+PathType(Object):
+ pass
+```
+
+Path type that is associated with an internal pathfinding grid at runtime.
+
## util.payment_mode.PaymentMode
```python
@@ -2413,6 +2385,7 @@ Terrain(Object):
terrain_graphic : Terrain
sound : Sound
ambience : set(TerrainAmbient)
+ path_costs : dict(children(PathType), int)
```
Terrains define the properties of the ground which the game entities are placed on.
@@ -2432,6 +2405,15 @@ Ambient sound played when the camera of the player is looking onto the terrain.
**ambience**
Ambient objects placed on the terrain.
+**path_costs**
+Base costs of traversing the pathfinding grid on map areas where the terrain is placed.
+
+Keys are `PathType` objects that are associated with a pathfinding grid in the pathfinder.
+
+Values represent the pathing cost for the terrain on the pathfinding grid. Each value must be an integer between `1` and `255`. `1` defines the *minimum* possible cost and `254` represents the *maximum* possible cost. `255` signifies that the terrain is impassable for the specified path type.
+
+For `PathType` objects that exist in the modpack but are not keys in this dict, a default cost value of `1` is assumed.
+
## util.terrain.TerrainAmbient
```python