private void BotSelectTaunt(Player botPlayer, int botCount, HashList <Taunt> matchingTaunts, object args) { // Skip this bot if there are no matches if (matchingTaunts.Count == 0) { return; } // Get highest priority in taunt matches int maxTauntPriority = matchingTaunts.Max(t => t.Priority); // Get taunts matching highest priority var eligibleCardTaunts = matchingTaunts.Where(t => t.Priority == maxTauntPriority).ToArray(); // Select a taunt var activeTaunt = eligibleCardTaunts[_rng.Next(eligibleCardTaunts.Length)]; // Calculate taunt probability double tauntChance = ((activeTaunt.ResponseChance / botCount) + activeTaunt.ResponseChance) * 0.5; // Check against probability and send message if (_rng.NextDouble() <= tauntChance) { var responses = activeTaunt.GetResponses().ToArray(); SendBotChatMessage(botPlayer, responses[_rng.Next(responses.Length)], RantProgramArgs.CreateFrom(args)); } }
public CardGameServer(CardGame game) { Game = game ?? throw new ArgumentNullException(nameof(game)); Game.RoundEnded += OnGameRoundEnded; Game.GameEnded += OnGameEnded; _rng = new Random(unchecked (Environment.TickCount * 7919)); _rant = new RantEngine(); _spectators = new HashList <SpectatorConnection>(); _connections = new HashList <ClientConnectionBase>(); _addressTally = new Tally <string, ClientConnectionBase>(); _botTaunts = game.GetPacks().Select(p => p.GetTaunts()).SelectMany(t => t).ToArray(); _ws = new WebSocketServer(game.Settings.WebSocketUrl); _ws.AddWebSocketService(ServerPlayDir, () => new PlayerConnection(this, Game)); _ws.AddWebSocketService(ServerSpectateDir, () => new SpectatorConnection(this, Game)); }
private void TriggerBotTaunts(object args, params Func <Player, IEnumerable <Taunt> >[] tauntSelectors) { if (Game.Settings.ChatEnabled && Game.Settings.BotTauntsEnabled && _botTaunts.Length > 0) { var bots = Game.GetPlayers().Where(p => p.IsAutonomous).ToArray(); if (bots.Length == 0) { return; } var matchingTaunts = new HashList <Taunt>(); foreach (var bot in bots) { matchingTaunts.Clear(); matchingTaunts.AddRange(tauntSelectors.SelectMany(selector => selector(bot))); BotSelectTaunt(bot, bots.Length, matchingTaunts, args); } } }