anchor.diff:  
   function TKMUnitSpec.GetUnitTextID: Integer;
   begin
  -  if IsValid then
  -    case fUnitType of
  -      utWolf:        Result := TX_UNITS_WOLF;
  -      utFish:        Result := TX_UNITS_FISH;
  -      utWatersnake:  Result := TX_UNITS_WATERSNAKE;
  -      utSeastar:     Result := TX_UNITS_SEASTAR;
  -      utCrab:        Result := TX_UNITS_CRAB;
  -      utWaterflower: Result := TX_UNITS_WATERFLOWER;
  -      utWaterleaf:   Result := TX_UNITS_WATERLEAF;
  -      utDuck:        Result := TX_UNITS_DUCK;
  -      else            Result := TX_UNITS_NAMES__29 + UNIT_TYPE_TO_ID[fUnitType];
  -    end
  -  else
  -    Result := -1;
  +  if not IsValid then Exit(-1);
  +
  +  case fUnitType of
  +    utWolf:        Result := TX_UNITS_WOLF;
  +    utFish:        Result := TX_UNITS_FISH;
  +    utWatersnake:  Result := TX_UNITS_WATERSNAKE;
  +    utSeastar:     Result := TX_UNITS_SEASTAR;
  +    utCrab:        Result := TX_UNITS_CRAB;
  +    utWaterflower: Result := TX_UNITS_WATERFLOWER;
  +    utWaterleaf:   Result := TX_UNITS_WATERLEAF;
  +    utDuck:        Result := TX_UNITS_DUCK;
  +  else
  +    Result := TX_UNITS_NAMES__29 + UNIT_TYPE_TO_ID[fUnitType];
  +  end;
   end;
   
   
  
positive.code:     [uaWalk, uaWork, uaSpec, uaDie, uaEat], //Slingshot
      [uaWalk, uaWork, uaSpec, uaDie, uaEat], //Warrior
      [uaWalk, uaWork, uaDie, uaEat],
      [uaWalk], [uaWalk], [uaWalk], [uaWalk], [uaWalk], [uaWalk], [uaWalk], [uaWalk]); //Animals
  begin
    Result := aAct in UnitSupportedActions[fUnitType];
  end;
  
  
  function TKMUnitSpec.GetAllowedPassability: TKMTerrainPassability;
  //Defines which animal prefers which terrain
  const AnimalTerrain: array[ANIMAL_MIN .. ANIMAL_MAX] of TKMTerrainPassability = (
      tpWolf, tpFish, tpFish, tpFish, tpCrab, tpFish, tpFish, tpFish);
  begin
    case fUnitType of
      ANIMAL_MIN..ANIMAL_MAX:  Result := AnimalTerrain[fUnitType]; //Animals
      else                     Result := tpWalk; //Worker, Warriors
    end;
  end;
  
  
  //Where unit would like to be
  function TKMUnitSpec.GetDesiredPassability: TKMTerrainPassability;
  begin
    if fUnitType in [CITIZEN_MIN..CITIZEN_MAX] - [utWorker] then
  
negative.code: 
    //and the corresponing unit that will be created (matches KaM behavior)
    UNIT_TYPE_TO_OLD_ID: array[TKMUnitType] of integer = (
      -1, -1, //utNone, utAny
      0,1,2,3,4,5,6,7,8,9,10,11,12,13, //Citizens
      14,15,16,17,18,19,20,21,22,23, //Warriors
      -1,-1,-1,-1, {-1,-1,} //TPR warriors (can't be placed with SET_UNIT)
      24,25,26,27,28,29,30,31); //Animals
  
    //This is a map of the valid values for !SET_GROUP, and the corresponing unit that will be created (matches KaM behavior)
    UNIT_ID_TO_TYPE: array[0..40] of TKMUnitType = (
  