internal static void AddAllTowerModels(ModTower modTower) { foreach (var tiers in modTower.TowerTiers()) { var towerModel = CreateTowerModel(modTower, tiers); Game.instance.model.AddTowerToGame(towerModel); } }
internal static List <TowerModel> AddTower(ModTower modTower) { var towerModels = new List <TowerModel>(); foreach (var tiers in modTower.TowerTiers()) { try { towerModels.Add(CreateTowerModel(modTower, tiers)); } catch (Exception e) { MelonLogger.Error($"Failed to create {tiers.Printed()} TowerModel for ModTower {modTower.Name}"); MelonLogger.Error(e); throw; } } if (modTower.ShouldCreateParagon) { try { towerModels.Add(CreateParagonModel(modTower)); } catch (Exception e) { MelonLogger.Msg($"Failed to create Paragon for {modTower.DisplayName}"); MelonLogger.Error(e); } } foreach (var towerModel in towerModels) { try { Game.instance.model.AddTowerToGame(towerModel); ModTowerCache[towerModel.name] = modTower; } catch (Exception e) { MelonLogger.Error($"Failed to add TowerModel {towerModel.name} to the game"); MelonLogger.Error(e); } } modTower.dummyUpgrade = new UpgradeModel(modTower.Id, modTower.Cost, 0, modTower.PortraitReference, 0, 0, 0, "", ""); Game.instance.model.AddUpgrade(modTower.dummyUpgrade); return(towerModels); }
internal static TowerModel CreateTowerModel(ModTower modTower, int[] tiers) { TowerModel towerModel; try { towerModel = modTower.GetDefaultTowerModel().Duplicate(); towerModel.tiers = tiers; towerModel.tier = tiers.Max(); towerModel.name = modTower.TowerId(tiers); } catch (Exception) { MelonLogger.Error($"Failed to get base TowerModel for ModTower {modTower.Name}"); throw; } // add the names to applied upgrades try { towerModel.appliedUpgrades = modTower.upgrades.Cast <ModUpgrade>() .Where(modUpgrade => modUpgrade != null && tiers[modUpgrade.Path] >= modUpgrade.Tier) .Select(modUpgrade => modUpgrade.Id) .ToArray(); } catch (Exception) { MelonLogger.Error($"Failed to add appliedUpgrades info to TowerModel {towerModel.name}"); throw; } // add the upgrade path models try { var towerTiers = modTower.TowerTiers(); var modTowerTiers = towerTiers.ToList(); for (var i = 0; i < modTower.UpgradePaths; i++) { var tierMax = modTower.tierMaxes[i]; if (tiers[i] < tierMax) { var newTiers = tiers.Duplicate(); newTiers[i]++; if (modTower is ModHero && tiers.Sum() == 0) { newTiers[i]++; // level 1 heroes are classified as tier 0 for whatever reason } if (modTowerTiers.Any(t => t.SequenceEqual(newTiers))) { var modUpgrade = modTower.upgrades[i, newTiers[i] - 1]; var upgradePathModel = new UpgradePathModel(modUpgrade.Id, modTower.TowerId(newTiers)); towerModel.upgrades = towerModel.upgrades.AddTo(upgradePathModel); } } } } catch (Exception) { MelonLogger.Error($"Failed to add the UpgradePathModels for TowerModel {towerModel.name}"); throw; } // maybe add the paragon upgrade try { if (modTower.ShouldCreateParagon && tiers.Any(i => i == 5)) { towerModel.paragonUpgrade = new UpgradePathModel(modTower.paragonUpgrade.Id, $"{towerModel.baseId}-Paragon"); } } catch (Exception) { MelonLogger.Error($"Failed to add the Paragon Upgrade for TowerModel {towerModel.name}"); throw; } // set the tower's portrait try { var portraitUpgrade = modTower.upgrades.Cast <ModUpgrade>() .Where(modUpgrade => modUpgrade != null && tiers[modUpgrade.Path] >= modUpgrade.Tier && modUpgrade.PortraitReference) .OrderByDescending(modUpgrade => modUpgrade.Tier) .ThenByDescending(modUpgrade => modUpgrade.Path % 2) .ThenBy(modUpgrade => modUpgrade.Path) .FirstOrDefault(); if (portraitUpgrade != null) { var sprite = portraitUpgrade.PortraitReference; if (sprite != null) { towerModel.portrait = sprite; } } } catch (Exception) { MelonLogger.Error($"Failed to set the Portrait of TowerModel {towerModel.name}"); throw; } return(towerModel); }