/// <summary>
 /// Factories the specified act.
 /// </summary>
 /// <param name="act">The act.</param>
 /// <param name="listOfParams">The list of params.</param>
 /// <returns>Missle object</returns>
 internal static Missle Factory(FactoryAct act, params object[] listOfParams)
 {
   try
   {
     Missle result;
     switch (act)
     {
       case FactoryAct.Create:
         result = new Missle((int)listOfParams[0], (int)listOfParams[1], (eTowerType)listOfParams[2], (Color)listOfParams[3], (Color)listOfParams[4],
           (eModificatorName)listOfParams[5], new PointF(Convert.ToSingle(listOfParams[6]), Convert.ToSingle(listOfParams[7])) /*, (int)listOfParams[8]*//*Progress*/);
         break;
       case FactoryAct.Load:
         BinaryReader reader = (BinaryReader)listOfParams[0];
         // ReSharper disable RedundantArgumentName
         result = new Missle(aimID: reader.ReadInt32(), damadge: reader.ReadInt32(), missleType: (eTowerType)reader.ReadInt32(), misslePenColor: Color.FromArgb(reader.ReadByte(),
           reader.ReadByte(), reader.ReadByte()), missleBrushColor: Color.FromArgb(reader.ReadByte(), reader.ReadByte(), reader.ReadByte()),
           modificator: (eModificatorName)reader.ReadInt32(), position: new PointF(reader.ReadSingle(), reader.ReadSingle()), progress: reader.ReadInt32());
         // ReSharper restore RedundantArgumentName
         break;
       default:
         throw new ArgumentOutOfRangeException("act");
     }
     return result;
   }
   catch (Exception exc)
   {
     //TODO add NLog logging
     throw;
   }
 }
 /// <summary>
 /// Factories the specified act.
 /// </summary>
 /// <param name="act">The act.</param>
 /// <param name="Params">The params.</param>
 /// <param name="arrayPos">The array pos.</param>
 /// <param name="confHash">The conf hash.</param>
 /// <param name="scaling">The scaling.</param>
 /// <param name="loadStream">The load stream.</param>
 /// <returns></returns>
 internal static Tower Factory(FactoryAct act, TowerParam Params, Point arrayPos, string confHash, float scaling = 1F, BinaryReader loadStream = null)
 {
   try
   {
     Tower result = new Tower(Params, arrayPos, confHash, scaling);
     switch (act)
     {
       case FactoryAct.Create:
         break;
       case FactoryAct.Load:
         result.Load(loadStream);
         break;
       default:
         throw new ArgumentOutOfRangeException("act");
     }
     return result;
   }
   catch (Exception exc)
   {
     //TODO add NLog
     throw;
   }
 }
 /// <summary>
 /// Factories the game objects
 /// </summary>
 /// <param name="filename">The filename of game configuration or save file</param>
 /// <param name="act">What factory should to do: Create or Load</param>
 /// <param name="graphicObject">IGraphic object </param>
 /// <returns>Game object or null if error</returns>
 public static Game Factory(string filename, FactoryAct act, IGraphic graphicObject)
 {
   Game result;
   try
   {
     switch (act)
     {
       case FactoryAct.Create:
         result = new Game(filename, graphicObject);
         break;
       case FactoryAct.Load:
         using (BinaryReader loadGameInfo = new BinaryReader(new FileStream(Environment.CurrentDirectory + "\\Data\\SavedGames\\" + filename + ".tdsg", FileMode.Open, FileAccess.Read)))
         {
           result = new Game(loadGameInfo.ReadString(), graphicObject);
           result.Load(loadGameInfo);
         }
         break;
       default:
         throw new ArgumentOutOfRangeException("act");
     }
   }
   catch (Exception exc)
   {
     MessageBox.Show("Game files damadged: " + exc.Message + "\n" + exc.StackTrace, "Fatal error");
     throw;
   }
   return result;
 }