using Generator.Helpers; using Generator.Models; using Generator.Models.Input; using Generator.Models.Output; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; namespace Generator { public class BaseBotGenerator { private readonly List _rawParsedBots; private readonly string _workingPath; //TODO: pass in bot types and use those to create the clases in rawBots list public BaseBotGenerator(List parsedBots, string workingPath) { _rawParsedBots = parsedBots; _workingPath = workingPath; } public List AddBaseDetails() { var stopwatch = Stopwatch.StartNew(); LoggingHelpers.LogToConsole("Started processing bot base"); var rawBots = new List { new Bot(BotType.assault), new Bot(BotType.pmcBot), new Bot(BotType.marksman), new Bot(BotType.bossbully), new Bot(BotType.bossgluhar), new Bot(BotType.bosskilla), new Bot(BotType.bosskojaniy), new Bot(BotType.bosssanitar), new Bot(BotType.bossstormtrooper), new Bot(BotType.followerbully), new Bot(BotType.followergluharassault), new Bot(BotType.followergluharscout), new Bot(BotType.followergluharsecurity), new Bot(BotType.followergluharsnipe), new Bot(BotType.followerkojaniy), new Bot(BotType.followersanitar), new Bot(BotType.followerstormtrooper), new Bot(BotType.cursedassault), new Bot(BotType.sectantpriest), new Bot(BotType.sectantwarrior), }; foreach (var botToUpdate in rawBots) { var rawBotsOfSameType = _rawParsedBots .Where(x => string.Equals(x.Info.Settings.Role, botToUpdate.botType.ToString(), StringComparison.OrdinalIgnoreCase)).ToList(); if (rawBotsOfSameType.Count == 0) { LoggingHelpers.LogToConsole($"no bots of type {botToUpdate.botType}", ConsoleColor.DarkRed); break; } LoggingHelpers.LogToConsole($"Found {rawBotsOfSameType.Count} bots of type: {botToUpdate.botType}"); UpdateBodyPartHealth(botToUpdate, rawBotsOfSameType); AddDifficulties(botToUpdate, _workingPath); AddExperience(botToUpdate, rawBotsOfSameType); AddStandingForKill(botToUpdate, rawBotsOfSameType); AddSkills(botToUpdate, rawBotsOfSameType); foreach (var rawParsedBot in rawBotsOfSameType) { AddVisualAppearanceItems(botToUpdate, rawParsedBot); AddName(botToUpdate, rawParsedBot); AddVoice(botToUpdate, rawParsedBot); } } stopwatch.Stop(); LoggingHelpers.LogToConsole($"Finished processing bot base. Took {LoggingHelpers.LogTimeTaken(stopwatch.Elapsed.TotalSeconds)} seconds"); return rawBots; } private void AddSkills(Bot botToUpdate, List rawBotsOfSameType) { var firstBotOfDesiredType = rawBotsOfSameType.FirstOrDefault(); foreach (var skill in firstBotOfDesiredType.Skills.Common) { botToUpdate.skills.Common.Add(skill.Id, new MinMax(skill.Progress, skill.Progress)); } } private void AddStandingForKill(Bot botToUpdate, List rawBotsOfSameType) { var firstBotOfDesiredType = rawBotsOfSameType.FirstOrDefault(); botToUpdate.experience.standingForKill = firstBotOfDesiredType.Info.Settings.StandingForKill; botToUpdate.experience.aggressorBonus = firstBotOfDesiredType.Info.Settings.AggressorBonus; } private void AddExperience(Bot botToUpdate, List rawBotsOfSameType) { var firstBotOfDesiredType = rawBotsOfSameType.FirstOrDefault(); botToUpdate.experience.reward.min = firstBotOfDesiredType.Info.Settings.Experience; botToUpdate.experience.reward.max = firstBotOfDesiredType.Info.Settings.Experience; } private void AddVoice(Bot bot, Datum rawParsedBot) { bot.appearance.voice.AddUnique(rawParsedBot.Info.Voice); } private void AddDifficulties(Bot bot, string workingPath) { var botFiles = Directory .GetFiles($"{workingPath}//Assets", "*.txt", SearchOption.TopDirectoryOnly) .Where(x => x.Contains(bot.botType.ToString(), StringComparison.InvariantCultureIgnoreCase)) .ToList(); DifficultyHelper.AddDifficultySettings(bot, botFiles); } private void UpdateBodyPartHealth(Bot botToUpdate, List rawParsedBots) { var firstBotOfDesiredType = rawParsedBots.FirstOrDefault(); if (firstBotOfDesiredType == null) { LoggingHelpers.LogToConsole($"bot type of: {botToUpdate.botType} not found, unable to update body part health."); return; } botToUpdate.health.BodyParts.Head.min = firstBotOfDesiredType.Health.BodyParts.Head.Health.Current; botToUpdate.health.BodyParts.Head.max = firstBotOfDesiredType.Health.BodyParts.Head.Health.Maximum; botToUpdate.health.BodyParts.Chest.min = firstBotOfDesiredType.Health.BodyParts.Chest.Health.Current; botToUpdate.health.BodyParts.Chest.max = firstBotOfDesiredType.Health.BodyParts.Chest.Health.Maximum; botToUpdate.health.BodyParts.Stomach.min = firstBotOfDesiredType.Health.BodyParts.Stomach.Health.Current; botToUpdate.health.BodyParts.Stomach.max = firstBotOfDesiredType.Health.BodyParts.Stomach.Health.Maximum; botToUpdate.health.BodyParts.LeftArm.min = firstBotOfDesiredType.Health.BodyParts.LeftArm.Health.Current; botToUpdate.health.BodyParts.LeftArm.max = firstBotOfDesiredType.Health.BodyParts.LeftArm.Health.Maximum; botToUpdate.health.BodyParts.RightArm.min = firstBotOfDesiredType.Health.BodyParts.RightArm.Health.Current; botToUpdate.health.BodyParts.RightArm.max = firstBotOfDesiredType.Health.BodyParts.RightArm.Health.Maximum; botToUpdate.health.BodyParts.LeftLeg.min = firstBotOfDesiredType.Health.BodyParts.LeftLeg.Health.Current; botToUpdate.health.BodyParts.LeftLeg.max = firstBotOfDesiredType.Health.BodyParts.LeftLeg.Health.Maximum; botToUpdate.health.BodyParts.RightLeg.min = firstBotOfDesiredType.Health.BodyParts.RightLeg.Health.Current; botToUpdate.health.BodyParts.RightLeg.max = firstBotOfDesiredType.Health.BodyParts.RightLeg.Health.Maximum; } private void AddVisualAppearanceItems(Bot botToUpdate, Datum rawBot) { botToUpdate.appearance.head.AddUnique(rawBot.Customization.Head); botToUpdate.appearance.body.AddUnique(rawBot.Customization.Body); botToUpdate.appearance.hands.AddUnique(rawBot.Customization.Hands); botToUpdate.appearance.feet.AddUnique(rawBot.Customization.Feet); } private void AddName(Bot botToUpdate, Datum rawBot) { var name = rawBot.Info.Nickname.Split(); botToUpdate.firstName.AddUnique(name[0]); if (name.Length > 1) { botToUpdate.lastName.AddUnique(name[1]); } } } }