anchor.diff:      (0,1,2,3),(2,3,0,1)
     );
     FT: array[0..len_BIOME-1,0..9] of Word = ( // Full textures + variance
  -    {btGrass}       (0,1,2,3,5,6,13,14,0,0),
  -    {btBigGrass}    (8,9,11,0,0,0,0,0,0,0),
  -    {btWetland}     (48,0,0,0,0,0,0,0,0,0),
  -    {btSwamp}       (40,41,42,43,0,0,0,0,0,0),
  -    {btWater}       (192,193,196,0,0,0,0,0,0,0),
  -    {btCoal}        (263,155,154,153,152,7,0,0,0,0),
  -    {btGrassGround} (34,0,0,0,0,0,0,0,0,0),
  -    {btGround}      (35,36,37,0,0,0,0,0,0,0),
  -    {btTreeGrass}   (17,16,0,0,0,0,0,0,0,0),
  -    {btGroundSnow}  (47,0,0,0,0,0,0,0,0,0),
  -    {btSnow1}       (46,0,0,0,0,0,0,0,0,0),
  -    {btSnow2}       (45,0,0,0,0,0,0,0,0,0),
  -    {btIce}         (44,0,0,0,0,0,0,0,0,0),
  -    {btCoastSand}   (31,32,33,0,0,0,0,0,0,0),
  -    {btGrassSand1}  (26,0,0,0,0,0,0,0,0,0),
  -    {btGrassSand2}  (27,0,0,0,0,0,0,0,0,0),
  -    {btGrassSand3}  (28,0,0,0,0,0,0,0,0,0),
  -    {btSand}        (29,30,0,0,0,0,0,0,0,0),
  -    {btStone}       (137,132,131,130,129,18,128,136,135,134),
  -    {btGold}        (308,147,146,145,144,20,0,0,0,0),
  -    {btEgold}       (156,157,158,159,201,0,0,0,0,0),
  -    {btIron}        (260,151,150,149,148,22,0,0,0,0),
  -    {btEIron}       (160,161,162,163,164,0,0,0,0,0),
  -    {btDark}        (245,0,0,0,0,0,0,0,0,0)
  +    (  0,  1,  2,  3,  5,  6, 13, 14,  0,  0), //  0 btGrass
  +    (  8,  9, 11,  0,  0,  0,  0,  0,  0,  0), //  1 btBigGrass
  +    ( 48,  0,  0,  0,  0,  0,  0,  0,  0,  0), //  2 btWetland
  +    ( 40, 41, 42, 43,  0,  0,  0,  0,  0,  0), //  3 btSwamp
  +    (192,193,196,  0,  0,  0,  0,  0,  0,  0), //  4 btWater
  +    (263,155,154,153,152,  7,  0,  0,  0,  0), //  5 btCoal
  +    ( 34,  0,  0,  0,  0,  0,  0,  0,  0,  0), //  6 btGrassGround
  +    ( 35, 36, 37,  0,  0,  0,  0,  0,  0,  0), //  7 btGround
  +    ( 17, 16,  0,  0,  0,  0,  0,  0,  0,  0), //  8 btTreeGrass
  +    ( 47,  0,  0,  0,  0,  0,  0,  0,  0,  0), //  9 btGroundSnow
  +    ( 46,  0,  0,  0,  0,  0,  0,  0,  0,  0), // 10 btSnow1
  +    ( 45,  0,  0,  0,  0,  0,  0,  0,  0,  0), // 11 btSnow2
  +    ( 44,  0,  0,  0,  0,  0,  0,  0,  0,  0), // 12 btIce
  +    ( 31, 32, 33,  0,  0,  0,  0,  0,  0,  0), // 13 btCoastSand
  +    ( 26,  0,  0,  0,  0,  0,  0,  0,  0,  0), // 14 btGrassSand1
  +    ( 27,  0,  0,  0,  0,  0,  0,  0,  0,  0), // 15 btGrassSand2
  +    ( 28,  0,  0,  0,  0,  0,  0,  0,  0,  0), // 16 btGrassSand3
  +    ( 29, 30,  0,  0,  0,  0,  0,  0,  0,  0), // 17 btSand
  +    (137,132,131,130,129, 18,128,136,135,134), // 18 btStone
  +    (308,147,146,145,144, 20,  0,  0,  0,  0), // 19 btGold
  +    (156,157,158,159,201,  0,  0,  0,  0,  0), // 20 btEgold
  +    (260,151,150,149,148, 22,  0,  0,  0,  0), // 21 btIron
  +    (160,161,162,163,164,  0,  0,  0,  0,  0), // 22 btEIron
  +    (245,  0,  0,  0,  0,  0,  0,  0,  0,  0)  // 23 btDark
     );
     PT: array[0..len_BIOME-1,0..9] of Single = ( // Probability of the specific full texture
  -    {btGrass}       (0.667,0.834,0.89,0.913,0.947,0.981,0.993,1,1,1),
  -    {btBigGrass}    (0.385,0.77,1,1,1,1,1,1,1,1),
  -    {btWetland}     (1,1,1,1,1,1,1,1,1,1),
  -    {btSwamp}       (0.295,0.59,0.885,1,1,1,1,1,1,1),
  -    {btWater}       (0.455,0.91,1,1,1,1,1,1,1,1),
  -    {btCoal}        (0.02,0.119,0.414,1,1,1,1,1,1,1),
  -    {btGrassGround} (1,1,1,1,1,1,1,1,1,1),
  -    {btGround}      (0.556,0.834,1,1,1,1,1,1,1,1),
  -    {btTreeGrass}   (0.715,1,1,1,1,1,1,1,1,1),
  -    {btGroundSnow}  (1,1,1,1,1,1,1,1,1,1),
  -    {btSnow1}       (1,1,1,1,1,1,1,1,1,1),
  -    {btSnow2}       (1,1,1,1,1,1,1,1,1,1),
  -    {btIce}         (1,1,1,1,1,1,1,1,1,1),
  -    {btCoastSand}   (0.125,0.75,1,1,1,1,1,1,1,1),
  -    {btGrassSand1}  (1,1,1,1,1,1,1,1,1,1),
  -    {btGrassSand2}  (1,1,1,1,1,1,1,1,1,1),
  -    {btGrassSand3}  (1,1,1,1,1,1,1,1,1,1),
  -    {btSand}        (0.75,1,1,1,1,1,1,1,1,1),
  -    {btStone}       (0.,0.,0.,0.,0.,0.,1,1,1,1),
  -    {btGold}        (0.,0.,0.,0.223,1,1,1,1,1,1),
  -    {btEgold}       (0.2,0.4,0.6,0.8,1,1,1,1,1,1),
  -    {btIron}        (0.,0.,0.,0.223,1,1,1,1,1,1),
  -    {btEIron}       (0.2,0.4,0.6,0.8,1,1,1,1,1,1),
  -    {btDark}        (1,1,1,1,1,1,1,1,1,1)
  +    (0.667,0.834,0.890,0.913,0.947,0.981,0.993,1,1,1), //  0 btGrass
  +    (0.385,0.77 ,1    ,1    ,1    ,1    ,1    ,1,1,1), //  1 btBigGrass
  +    (1    ,1    ,1    ,1    ,1    ,1    ,1    ,1,1,1), //  2 btWetland
  +    (0.295,0.59 ,0.885,1    ,1    ,1    ,1    ,1,1,1), //  3 btSwamp
  +    (0.455,0.91 ,1    ,1    ,1    ,1    ,1    ,1,1,1), //  4 btWater
  +    (0.02 ,0.119,0.414,1    ,1    ,1    ,1    ,1,1,1), //  5 btCoal
  +    (1    ,1    ,1    ,1    ,1    ,1    ,1    ,1,1,1), //  6 btGrassGround
  +    (0.556,0.834,1    ,1    ,1    ,1    ,1    ,1,1,1), //  7 btGround
  +    (0.715,1    ,1    ,1    ,1    ,1    ,1    ,1,1,1), //  8 btTreeGrass
  +    (1    ,1    ,1    ,1    ,1    ,1    ,1    ,1,1,1), //  9 btGroundSnow
  +    (1    ,1    ,1    ,1    ,1    ,1    ,1    ,1,1,1), // 10 btSnow1
  +    (1    ,1    ,1    ,1    ,1    ,1    ,1    ,1,1,1), // 11 btSnow2
  +    (1    ,1    ,1    ,1    ,1    ,1    ,1    ,1,1,1), // 12 btIce
  +    (0.125,0.75 ,1    ,1    ,1    ,1    ,1    ,1,1,1), // 13 btCoastSand
  +    (1    ,1    ,1    ,1    ,1    ,1    ,1    ,1,1,1), // 14 btGrassSand1
  +    (1    ,1    ,1    ,1    ,1    ,1    ,1    ,1,1,1), // 15 btGrassSand2
  +    (1    ,1    ,1    ,1    ,1    ,1    ,1    ,1,1,1), // 16 btGrassSand3
  +    (0.75 ,1    ,1    ,1    ,1    ,1    ,1    ,1,1,1), // 17 btSand
  +    (0    ,0    ,0    ,0    ,0    ,0    ,1    ,1,1,1), // 18 btStone
  +    (0    ,0    ,0    ,0.223,1    ,1    ,1    ,1,1,1), // 19 btGold
  +    (0.2  ,0.4  ,0.6  ,0.8  ,1    ,1    ,1    ,1,1,1), // 20 btEgold
  +    (0    ,0    ,0    ,0.223,1    ,1    ,1    ,1,1,1), // 21 btIron
  +    (0.2  ,0.4  ,0.6  ,0.8  ,1    ,1    ,1    ,1,1,1), // 22 btEIron
  +    (1    ,1    ,1    ,1    ,1    ,1    ,1    ,1,1,1)  // 23 btDark
     );
   
     // Return full texture of specific biome (with variance)
  
positive.code:       begin
          if (TilesPartsArr.Obj[Y,X] = 255) then
  			    case A[Y,X] of
  				    Byte(btGrass),Byte(btBigGrass):
                TilesPartsArr.Obj[Y,X] := GetObjectFromMix(omGrass);
  
  
negative.code:     Probability: array [TObjects] of array[0..20] of Single;
    end = (
      Objects: ( // Array of avaiable objects in corelation with specific type of objects (stones, grass, conifers etc)
        (  0,  1,  2,  3,  4, 68,  8,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0), // oStone
        (  5,  6,210,211,214,212,213,215,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0), // oShrub
        ( 10, 11, 12, 13, 14, 15, 16, 38, 42, 43, 46,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0), // oBranch
        ( 17, 18, 19, 21,251,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0), // oMushroom
        ( 22, 23, 24,249,250,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0), // oFlower
        ( 58, 59, 60, 62, 63,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0), // oGrass
        ( 68, 69, 70, 71, 72, 73,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0), // oDebris
        (190,191,192,193,195,196,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0), // oTreeDry
        ( 88, 89, 90, 92, 93, 94, 95, 97, 98, 99,100,102,103,104,105,107,108,109,110,  0,  0), // oTree
        (149,150,151,153,154,155,157,158,159,160,162,163,164,165,167,168,169,170,172,  0,  0), // oConifer
        (113,114,116,117,118,119,121,122,123,124,112,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0), // oTreeTropical
        (216,217,218,219,220,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0), // oCactus
        (200,201,202,203,204,205,206,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0), // oPalm
        ( 31, 32, 33, 34, 35, 36, 37,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0)  // oWaterTypes
      );
      Probability: ( // Probability of specific object
        (0.17,0.34,0.51,0.68,0.85,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1), // oStone
        (0.19,0.38,0.57,0.76,0.95,0.97,0.99,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1), // oShrub
        (0.1 ,0.2 ,0.3 ,0.4 ,0.5 ,0.6 ,0.7 ,0.8 ,0.9 ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1), // oBranch
        (0.25,0.5 ,0.75,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1), // oMushroom
        (0.34,0.68,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1), // oFlower
        (0.04,0.08,0.44,0.8 ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1), // oGrass
        (0.2 ,0.4 ,0.6 ,0.8 ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1), // oDebris
        (0.17,0.34,0.51,0.68,0.85,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1), // oTreeDry
        (0.06,0.12,0.18,0.24,0.3 ,0.36,0.42,0.48,0.54,0.6 ,0.66,0.72,0.78,0.84,0.9 ,0.96,1   ,1   ,1   ,1   ,1), // oTree
        (0.06,0.12,0.18,0.24,0.3 ,0.36,0.42,0.48,0.54,0.6 ,0.66,0.72,0.78,0.84,0.9 ,0.96,1   ,1   ,1   ,1   ,1), // oConifer
        (0.1 ,0.2 ,0.3 ,0.4 ,0.5 ,0.6 ,0.7 ,0.8 ,0.9 ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1), // oTreeTropical
        (0.25,0.5 ,0.75,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1), // oCactus
        (0.15,0.3 ,0.45,0.6 ,0.75,0.9 ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1), // oPalm
        (0.29,0.32,0.38,0.53,0.82,0.88,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1)  // oWaterTypes
      );
    );
    ObjectMix: array [TObjectMix] of array[TObjects] of Single = ( // Probability of mix for specific biome (for example the swamp have big probability of a reed but zero for a stone)
    // oStone oShrub  oBranch oMushro oFlower oGrass  oDebris oTreeDr oTree   oConife oTreeTr oCactus oPalm   oWaterTypes
      (0.4    ,0.4    ,0.4    ,0.4    ,0.5    ,9      ,1      ,1      ,1      ,1      ,1      ,1      ,1      ,1), // omStone
      (0.2    ,0.4    ,0.6    ,0.7    ,0.9    ,1      ,1      ,1      ,1      ,1      ,1      ,1      ,1      ,1), // omGrass
      (0      ,0      ,0.31   ,0.31   ,0.31   ,0.7    ,0.82   ,1      ,1      ,1      ,1      ,1      ,1      ,1), // omSwamp
      (0.27   ,0.27   ,0.43   ,0.7    ,0.7    ,0.7    ,0.81   ,1      ,1      ,1      ,1      ,1      ,1      ,1), // omGround
      (1      ,1      ,1      ,1      ,1      ,1      ,1      ,1      ,1      ,1      ,1      ,1      ,1      ,1), // omSnow
      (0.22   ,0.22   ,0.54   ,0.54   ,0.54   ,0.54   ,0.7    ,1      ,1      ,1      ,1      ,1      ,1      ,1), // omCoal
      (0.28   ,0.5    ,0.5    ,0.5    ,0.78   ,0.78   ,0.78   ,0.89   ,0.89   ,0.89   ,0.89   ,1      ,1      ,1), // omDesert
      (0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,1), // omWater
      (0.3    ,0.3    ,0.3    ,0.3    ,0.5    ,1      ,1      ,1      ,1      ,1      ,1      ,1      ,1      ,1)  // omWetland
    );
  
    // Return number which represent specific (include variation)
    function GetObject(const obj: TObjects): Byte;
    var
      rnd: Single;
      K, Output: Byte;
    begin
      Output := 255;
      rnd := fRNG.Random();
      for K := Low( O.Probability[obj] ) to High( O.Probability[obj] ) do
        if rnd < O.Probability[obj,K] then begin
          Output := O.Objects[obj,K];
          break;
        end;
      Result := Output;
  