public static (StatDef moveStat, StatDef costStat) BestTerrainMovementStatDefs(this Pawn pawn, TerrainDef terrain) { (StatDef moveStat, StatDef costStat)bestStats = (null, null); float curSpeed = -1; foreach (var terrainStats in terrain.TerrainMovementStatDefs()) { // Lazily calculate curSpeed for performance reasons if (bestStats.moveStat == null) { bestStats = terrainStats; } else { if (curSpeed < 0) { curSpeed = pawn.GetStatValue(bestStats.moveStat) / terrain.MovementCost(bestStats.costStat); } float newSpeed = pawn.GetStatValue(terrainStats.moveStat ?? StatDefOf.MoveSpeed) / terrain.MovementCost(terrainStats.costStat); // Find highest movement statistic for this pawn if (newSpeed >= curSpeed) { curSpeed = newSpeed; bestStats = terrainStats; } } } return(bestStats); }
public static int TerrainMoveCost(this Pawn pawn, TerrainDef terrain) { return(terrain.MovementCost(pawn.BestTerrainMovementStatDefs(terrain).costStat)); }