/// <summary>
 /// Tower upgrading
 /// </summary>
 /// <returns>upgrading cost</returns>
 internal int Upgrade()
 {
   int upCost;
   Level++;
   if (_params.UnlimitedUp)//unlimited update
   {
     _currentTowerParams.AttackRadius += _params.UpgradeParams[1].AttackRadius;
     _currentMaxCooldown -= _params.UpgradeParams[1].Cooldown;
     if (_currentMaxCooldown < 0)
       _currentMaxCooldown = 0;
     _currentTowerParams.Damage += _params.UpgradeParams[1].Damage;
     _currentTowerParams.Cost = _params.UpgradeParams[1].Cost;
     upCost = _currentTowerParams.Cost;
   }
   else
   {
     if (Level == _params.UpgradeParams.Count)//limited upgrade
       CanUpgrade = false;
     int tmp = _currentTowerParams.Cooldown;
     _currentTowerParams = _params.UpgradeParams[Level - 1];
     _currentTowerParams.Cooldown = tmp;
     _currentMaxCooldown = _params.UpgradeParams[Level - 1].Cooldown;
     //[0].Picture till no picture for every tower level
     _currentTowerParams.Picture = _params.UpgradeParams[0].Picture;
     upCost = _currentTowerParams.Cost;
   }
   return upCost;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="Tower"/> class.
 /// </summary>
 /// <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>
 private Tower(TowerParam Params, Point arrayPos, string confHash, float scaling = 1F)
 {
   _params = Params;
   ArrayPos = new Point(arrayPos.X, arrayPos.Y);
   Scaling = scaling;
   Level = 1;
   _confHash = string.Copy(confHash);
   _currentTowerParams = _params.UpgradeParams[Level - 1];
   CanUpgrade = _params.UpgradeParams.Count > 1;
   _currentTowerParams.Cooldown = 0;
   _currentMaxCooldown = _params.UpgradeParams[0].Cooldown;
   _towerCenterPos = new Point((ArrayPos.X + 1) * Settings.ElemSize, (ArrayPos.Y + 1) * Settings.ElemSize);
   _currentTowerParams.Picture.MakeTransparent(Color.FromArgb(255, 0, 255));
 }