anchor.diff:    end;
   
     // Get count of needed weapons
  -  for UT := WARRIOR_EQUIPABLE_MIN to WARRIOR_EQUIPABLE_MAX do
  +  for UT := ut_AxeFighter to WARRIOR_EQUIPABLE_MAX do // Skip militia
       for I := Low(TroopCost[UT]) to High(TroopCost[UT]) do
         if (TroopCost[UT,I] <> wt_None) then
         begin
           WT := TroopCost[UT,I];
  -        Warfare[WT].Required := Warfare[WT].Required + WarriorsDemands[UT];
  +        Warfare[WT].Required := Warfare[WT].Required + fWarriorsDemands[UT];
         end
         else
           break;
  
positive.code: 
  
  // Distribute required weapons into exist houses (first will be produced the larger amount of wares)
  procedure TKMCityManagement.OrderWeapons(aWarfare: TWarfareArr);
  const
    WEAPONS_PER_A_UPDATE = 3;
    PRODUCTION_HOUSES = [ht_ArmorSmithy, ht_ArmorWorkshop, ht_WeaponSmithy, ht_WeaponWorkshop];
  
negative.code: 
    procedure CheckMinArmyReq();
    const
      DEFAULT_COEFICIENT = 100;
      DEFAULT_ARMY_REQUIREMENTS: array[WARRIOR_EQUIPABLE_MIN..WARRIOR_EQUIPABLE_MAX] of Word = (
        1, 1, 1, 3,//ut_Militia,      ut_AxeFighter,   ut_Swordsman,     ut_Bowman,
        3, 1, 1, 1,//ut_Arbaletman,   ut_Pikeman,      ut_Hallebardman,  ut_HorseScout,
        1//ut_Cavalry
      );
    var
      SoldierCnt: Integer;
      UT: TUnitType;
    begin
      SoldierCnt := 0;
      for UT := Low(fWarriorsDemands) to High(fWarriorsDemands) do
        SoldierCnt := SoldierCnt + fWarriorsDemands[UT];
      if (SoldierCnt > 30) then
        Exit;
  
      for UT := Low(fWarriorsDemands) to High(fWarriorsDemands) do
        if not gHands[fOwner].Locks.GetUnitBlocked(UT) then
          fWarriorsDemands[UT] := fWarriorsDemands[UT] + DEFAULT_ARMY_REQUIREMENTS[UT] * DEFAULT_COEFICIENT;
    end;
  //AITroopTrainOrder: array [TGroupType, 1..3] of TUnitType = (
  //  (ut_Swordsman,    ut_AxeFighter, ut_Militia),
  