public void Update(WinsInstruction instruction)
		{
			var profit = instruction.Value;
			if (Settings.YourBot != instruction.Name) { profit = -profit; }
			Actor.ApplyProfit(profit);
		}
		public void Simulate(NodeCollection nodes, MT19937Generator rnd)
		{
			var bots = new Dictionary<PlayerName, ACDCBot>()
			{
				{ PlayerName.player1, GetBot(nodes, PlayerName.player1, rnd) },
				{ PlayerName.player2, GetBot(nodes, PlayerName.player2, rnd) },
			};

			var matches = new Matches();
			matches.Round = 1;
			var stack1 = 2000;
			var stack2 = 2000;

			var blind = 20;
			
			for (var round = 1; round < int.MaxValue; round++)
			{
				if (round % 10 == 0) { blind += 10; }
				var small = blind >> 1;

				matches.Round = round;
				matches.Current.Player1.Stack = stack1;
				matches.Current.Player2.Stack = stack2;

				var mirrored = (round & 1) == 0;

				var shuffled = Cards.GetShuffledDeck(rnd);
				var deck1 = Cards.Empty;
				var deck2 = Cards.Empty;
				var tabl0 = Cards.Empty;
				var tabl3 = Cards.Empty;
				var tabl4 = Cards.Empty;
				var tabl5 = Cards.Empty;

				deck1.AddRange(shuffled.Take(2));
				deck2.AddRange(shuffled.Skip(2).Take(2));
				tabl3.AddRange(shuffled.Skip(4).Take(3));
				tabl4.AddRange(shuffled.Skip(4).Take(4));
				tabl5.AddRange(shuffled.Skip(4).Take(5));

				var tables = new Cards[] { tabl0, tabl3, tabl4, tabl5 };

				matches.Current.BigBlind = blind;
				matches.Current.SmallBlind = small;
				matches.Current.Player1.Hand = deck1;
				matches.Current.Player2.Hand = deck2;

				SetPot(matches.Current, mirrored);

				var outcome = PlayerName.None;

				var showdown = false;

				foreach (var table in tables)
				{
					matches.Current.Table = table;
					outcome = SimulateRound(matches, bots);
					if (outcome != PlayerName.None) { break; }
				}
				if (outcome == PlayerName.None)
				{
					showdown = true;
					outcome = PokerHandEvaluator.GetOutcome(deck1, deck2, tabl5);
				}
				if (outcome == PlayerName.None)
				{
					matches.Current.Player1.Stack += matches.Current.Pot >> 1;
					matches.Current.Player2.Stack += matches.Current.Pot >> 1;
				}
				else
				{
					var realoutcome = outcome;
					if (!showdown)
					{
						realoutcome = PokerHandEvaluator.GetOutcome(deck1, deck2, tabl5);
					}
					matches.Current[outcome].Stack += matches.Current.Pot;

					if (realoutcome == outcome)
					{
						var wins = new WinsInstruction(outcome, matches.Current.Pot);
						bots[PlayerName.player1].Update(wins);
						bots[PlayerName.player2].Update(wins);
					}
					// A bot chickened later, but that should not matter for the bits it played.
					else
					{
						bots[PlayerName.player1].Update(new WinsInstruction(PlayerName.player1, matches.Current.Pot));
						bots[PlayerName.player2].Update(new WinsInstruction(PlayerName.player2, matches.Current.Pot));
					}
				}
				matches.Current.Player1.Pot = 0;
				matches.Current.Player2.Pot = 0;

				stack1 = matches.Current.Player1.Stack;
				stack2 = matches.Current.Player2.Stack;

				if (stack1 < blind || stack2 < blind)
				{
					break;
				}
			}
		}