public static List <WeightedUnit> GetUnitsForGroupPower(UnitSpawnGroupConfig group) { int powerLeft = group.GroupPower; List <WeightedUnit> possibleUnits = group.SpawnableUnits.Where(u => !u.ForceUnit).ToList(); List <WeightedUnit> choosenUnits = group.SpawnableUnits.Where(u => u.ForceUnit).ToList(); List <WeightedUnit> validUnits = GetUnitsInPowerRange(possibleUnits, powerLeft); while (validUnits.Count > 0) { WeightedUnit choosen = M_Weightable.GetWeighted(validUnits); choosenUnits.Add(choosen); int unitPower = choosen.UnitConfig.UnitPower; if (unitPower <= 0) { Debug.LogWarning("UNIT POWER 0, aborting to avoid infinite loop"); return(null); } powerLeft -= unitPower; validUnits = GetUnitsInPowerRange(possibleUnits, powerLeft); } return(choosenUnits); }
void SpawnGroup(UnitSpawnGroupConfig group, List <int> spawnerIDs) { if (group == null) { Debug.LogWarning("No Group"); return; } globalGroupCounter++; List <UnitSpawner> spawnersForGroup = GetSpawnerForGroup(spawnerIDs, group); if (spawnersForGroup == null || spawnersForGroup.Count == 0) { Debug.LogWarning("NO SPAWNERS FOR GROUP"); return; } List <WeightedUnit> unitConfigs = RegionLoader.GetUnitsForGroupPower(group); if (unitConfigs.Count > spawnersForGroup.Count) { Debug.LogWarning("Not enough spawners for my group :( spawners:" + spawnersForGroup.Count + " units:" + unitConfigs.Count); // return; } // MDebug.Log(spawnersForGroup.Count+ " "+unitConfigs.Count); while (spawnersForGroup.Count > 0 && unitConfigs.Count > 0) { // MDebug.Log("SPAWN"); WeightedUnit unit = unitConfigs.GetRandom(); UnitSpawner spawner = spawnersForGroup.GetRandom(); unitConfigs.Remove(unit); spawnersForGroup.Remove(spawner); spawner.SpawnUnit(unit.UnitConfig, unit.TurnTimeOnSpawn, globalGroupCounter, unit.HidePlayerUnit); } }
public static UnitSpawnGroupConfig MakeSquadGroup() { List <ScriptableUnitConfig> unit_configs = new List <ScriptableUnitConfig>(); UnitSpawnGroupConfig conf = new UnitSpawnGroupConfig(); conf.ForceGroup = true; conf.SpawnerGroup = 1; conf.SpawnableUnits = new List <WeightedUnit>(); if (Instance.selected_units.IsNullOrEmpty()) { Debug.LogWarning("NO UNITS SELECTED"); Instance.unitunlocks.Select(unlock => unlock.Item).ToList().ForEach(unlock => unit_configs.Add(unlock.Tiers.GetRandom().Config)); } else { foreach (var _selected in Instance.selected_units) { unit_configs.Add(TieredUnit.Unlocks(_selected.Tiers, PlayerLevel.Instance).GetHighestUnlocked().Config); } } List <ScriptableUnitConfig> selected = unit_configs.GetRandomRemove(Instance.GetMaxSquadsize()); foreach (ScriptableUnitConfig unit_config in selected) { WeightedUnit unit = new WeightedUnit(); unit.ForceUnit = true; unit.TurnTimeOnSpawn = Constants.PLAYER_SQUAD_START_INITIATIVE; unit.UnitConfig = unit_config; conf.SpawnableUnits.Add(unit); } return(conf); }