public void Log(DominionBase.Players.Player player, params Object[] items)
 {
     if (_CurrentPlayerTurn == null)
     {
         this.NewTurn(null, null);
     }
     _CurrentPlayerTurn.Log(new DominionBase.Visual.VisualPlayer(player), this.PlayerBrushes[player.Name], items);
     svArea.ScrollToBottom();
     svArea.ScrollToLeftEnd();
 }
Esempio n. 2
0
        public void Add(DominionBase.Game game, DominionBase.Players.Player player)
        {
            // Make sure it exists
            if (!_GlobalStatistics.ContainsKey(game.Players.Count))
            {
                _GlobalStatistics[game.Players.Count] = new NPlayersStatistics(game.Players.Count);
            }

            // Add the game to the correct Statistics section
            _GlobalStatistics[game.Players.Count].Add(game, player);
        }
Esempio n. 3
0
        private Tuple <List <UIElement>, String> GenerateElements(DominionBase.Players.Player item, SolidColorBrush background, SolidColorBrush foreground)
        {
            List <UIElement> elements = new List <UIElement>();
            TextBlock        tbLine   = new TextBlock();

            tbLine.Text       = ((DominionBase.Players.Player)item).Name;
            tbLine.Background = background;
            tbLine.Foreground = foreground.Color.A == 0 ? Brushes.Black : foreground;
            tbLine.FontWeight = FontWeights.Bold;

            DockPanel.SetDock(tbLine, Dock.Left);

            elements.Add(tbLine);

            return(new Tuple <List <UIElement>, String>(elements, item.Name));
        }
        public void NewTurn(DominionBase.Players.Player player, DominionBase.Cards.Card grantedBy)
        {
            Utilities.Log(this.LogFile, "-------------------------------------------------------");

            if (_CurrentPlayerTurn != null)
            {
                _CurrentPlayerTurn.End();
            }

            _CurrentPlayerTurn         = new ucPlayerTurn();
            _CurrentPlayerTurn.LogFile = this.LogFile;
            if (player != null)
            {
                _CurrentPlayerTurn.New(player, this.PlayerBrushes[player.Name], grantedBy);
            }

            if (_CurrentGameTurn != null)
            {
                (_CurrentGameTurn as ucGameTurn).Add(_CurrentPlayerTurn as ucPlayerTurn);

                if (wMain.Settings.AutoCollapseOldTurns)
                {
                    IEnumerable <ucGameTurn> gameTurns = spArea.Children.OfType <ucGameTurn>();
                    if (gameTurns.Count() > 1)
                    {
                        ucGameTurn gtOld = gameTurns.ElementAt(gameTurns.Count() - 2);
                        foreach (ucPlayerTurn pt in gtOld.GetChildren(player))
                        {
                            pt.IsExpanded = false;
                        }
                        if (!gtOld.IsAnyExpanded)
                        {
                            gtOld.IsAllExpanded = true;
                            gtOld.IsExpanded    = false;
                        }
                    }
                }
            }
            else
            {
                spArea.Children.Add(_CurrentPlayerTurn);
            }

            svArea.ScrollToBottom();
            svArea.ScrollToLeftEnd();
        }
Esempio n. 5
0
        public override void New(DominionBase.Players.Player player, List <Brush> playerBrushes, DominionBase.Cards.Card grantedBy)
        {
            this.Player   = new DominionBase.Visual.VisualPlayer(player);
            _CurrentInset = 0;

            if (playerBrushes[0] != Brushes.Transparent)
            {
                this.Background  = playerBrushes[1];
                this.BorderBrush = playerBrushes[2];
            }

            Utilities.Log(this.LogFile, String.Format("{0} starting turn{1}", player, grantedBy == null ? "" : String.Format(" from {0}", grantedBy.Name)));

            DockPanel dp           = new DockPanel();
            TextBlock tbPlayerName = new TextBlock();

            tbPlayerName.Text       = player.Name;
            tbPlayerName.FontWeight = FontWeights.Bold;
            DockPanel.SetDock(tbPlayerName, Dock.Left);
            dp.Children.Add(tbPlayerName);
            tbPlayerName      = new TextBlock();
            tbPlayerName.Text = " starting turn";
            DockPanel.SetDock(tbPlayerName, Dock.Left);
            dp.Children.Add(tbPlayerName);

            if (grantedBy != null)
            {
                TextBlock tbGrantedBy = new TextBlock();
                tbGrantedBy.Text = " granted by ";
                DockPanel.SetDock(tbGrantedBy, Dock.Left);
                dp.Children.Add(tbGrantedBy);

                ucCardIcon icon = CardIconUtilities.CreateCardIcon(grantedBy);
                DockPanel.SetDock(icon, Dock.Left);
                dp.Children.Add(icon);

                TextBlock tbBlank = new TextBlock();
                DockPanel.SetDock(tbBlank, Dock.Left);
                dp.Children.Add(tbBlank);
            }

            expTurn.Header = dp;
        }
 public ucPlayerTurn GetChild(DominionBase.Players.Player player)
 {
     return(this.spArea.Children.OfType <ucPlayerTurn>().First(pt => pt.Player.PlayerUniqueId == player.UniqueId));
 }
 public IEnumerable <ucPlayerTurn> GetChildren(DominionBase.Players.Player player)
 {
     return(this.spArea.Children.OfType <ucPlayerTurn>().Where(pt => pt.Player.PlayerUniqueId == player.UniqueId));
 }
Esempio n. 8
0
 public virtual void New(DominionBase.Players.Player player, List <Brush> playerBrushes, DominionBase.Cards.Card grantedBy)
 {
 }
Esempio n. 9
0
        public void Add(DominionBase.Game game, DominionBase.Players.Player player)
        {
            if (game.Players.Count != _NumberOfPlayers)
            {
                throw new Exception("Incorrect number of players in game!");
            }

            if (player != null)
            {
                if (!game.Players.Contains(player))
                {
                    throw new Exception("Player not found in game!");
                }

                // One more game played!
                this.GamesPlayed++;

                // If the game actually finished properly, instead of being aborted
                if (game.State == DominionBase.GameState.Ended)
                {
                    // Player won (or at least tied in winning)
                    if (game.Winners.Contains(player))
                    {
                        this.GamesWon++;
                    }

                    if (player.VictoryPoints < this.LowestScore)
                    {
                        this.LowestScore = player.VictoryPoints;
                    }
                    if (player.VictoryPoints > this.HighestScore)
                    {
                        this.HighestScore = player.VictoryPoints;
                    }

                    _TotalScore += player.VictoryPoints;
                }
            }

            if (game.State == DominionBase.GameState.Ended)
            {
                foreach (DominionBase.Players.Player winner in game.Winners)
                {
                    // Since properly-used cards like Feast, Mining Village, & Embargo never end up in a player's hand,
                    // we need to count how many of the cards were played during the game and add them to the player's
                    // total as well as the total number of cards in the player's hand
                    IEnumerable <DominionBase.Cards.Card> trashedCards = game.TurnsTaken.Where(t => t.Player == winner).
                                                                         SelectMany <DominionBase.Turn, DominionBase.Cards.Card>(
                        t =>
                        t.CardsPlayed.Where(c =>
                                            c.CardType == DominionBase.Cards.Base.TypeClass.Feast ||
                                            c.CardType == DominionBase.Cards.Seaside.TypeClass.Embargo ||
                                            (c.CardType == DominionBase.Cards.Intrigue.TypeClass.MiningVillage && t.CardsTrashed.Contains(c)) ||
                                            (c.CardType == DominionBase.Cards.Cornucopia.TypeClass.HornOfPlenty && t.CardsTrashed.Contains(c))
                                            )
                        );

                    int handCount = winner.Hand.Count + trashedCards.Count();

                    foreach (DominionBase.Piles.Supply supply in game.Table.Supplies.Values)
                    {
                        Type   cardType    = supply.CardType;
                        String cardTypeKey = cardType.AssemblyQualifiedName;

                        int cardTypeCount = winner.Hand.Count(c => c.CardType == cardType) + trashedCards.Count(c => c.CardType == cardType);

                        if (!_WinningCardCounts.ContainsKey(cardTypeKey))
                        {
                            _WinningCardCounts[cardTypeKey] = new CardStatistics(cardType);
                        }
                        _WinningCardCounts[cardTypeKey].Add(cardTypeCount, handCount);

                        if (winner.PlayerType == DominionBase.Players.PlayerType.Human)
                        {
                            if (!_WinningHumanCardCounts.ContainsKey(cardTypeKey))
                            {
                                _WinningHumanCardCounts[cardTypeKey] = new CardStatistics(cardType);
                            }
                            _WinningHumanCardCounts[cardTypeKey].Add(cardTypeCount, handCount);
                        }
                    }
                }
            }
        }
Esempio n. 10
0
 public virtual void Log(DominionBase.Players.Player player, List <Brush> playerBrushes, params Object[] items)
 {
 }
Esempio n. 11
0
		private void AcceptGame()
		{
			game.AcceptCards();

			game.GameEndedEvent += new DominionBase.Game.GameEndedEventHandler(game_GameEndedEvent);

			wMain.Settings.PlayerSettings.ForEach(ps => glMain.AddPlayerColor(ps.Name, ps.UIColor));
			glMain.NewSection(String.Format("Game started with {0} players", game.Players.Count));

			game.Table.TokenPiles.TokenCollectionsChanged += new DominionBase.TokenCollections.TokenCollectionsChangedEventHandler(TokenPiles_TokenCollectionsChanged);
			game.Table.Trash.PileChanged += new DominionBase.Piles.Pile.PileChangedEventHandler(Trash_PileChanged);
			Trash_PileChanged(game.Table.Trash, new DominionBase.Piles.PileChangedEventArgs(DominionBase.Piles.PileChangedEventArgs.Operation.Reset));
			game.GameMessage += new DominionBase.Game.GameMessageEventHandler(game_GameMessage);

			foreach (DominionBase.Players.Player player in game.Players.FindAll(p => p.PlayerType == DominionBase.Players.PlayerType.Human))
				player.Choose = player_Choose;

			if (game.Players.Any(player => player.PlayerType == DominionBase.Players.PlayerType.Human))
				_Player = game.Players.OfType<DominionBase.Players.Human>().First();
			else
				_Player = null;

			String message = "Using the following cards";
			if (game.Settings.Preset != null)
				message = String.Format("{0} from the preset \"{1}\"", message, game.Settings.Preset.Name);
			glMain.Log(String.Format("{0}:", message));
			IEnumerable<DominionBase.Piles.Supply> kingdomSupplies = game.Table.Supplies.Where(kvp => kvp.Value.Randomizer.Location == DominionBase.Cards.Location.Kingdom).Select(kvp => kvp.Value).OrderBy(s => s.Name);
			glMain.Log("   ", kingdomSupplies.Take(5));
			glMain.Log("   ", kingdomSupplies.Skip(5));

			int prosperityPiles = game.Table.Supplies.Count(kvp => kvp.Value.Location == DominionBase.Cards.Location.Kingdom && kvp.Value.Source == DominionBase.Cards.Source.Prosperity);
			int darkAgesPiles = game.Table.Supplies.Count(kvp => kvp.Value.Location == DominionBase.Cards.Location.Kingdom && kvp.Value.Source == DominionBase.Cards.Source.DarkAges);
			int kingdomPiles = game.Table.Supplies.Count(kvp => kvp.Value.Location == DominionBase.Cards.Location.Kingdom && kvp.Value.Tokens.Count(t => t.GetType() == DominionBase.Cards.Cornucopia.TypeClass.BaneToken) == 0);
			glMain.Log(String.Format("Prosperity Kingdom card ratio is {0}/{1} = {2:P0}", 
				prosperityPiles,
				kingdomPiles,
				((float)prosperityPiles) / kingdomPiles
				));
			glMain.Log(String.Format("   Colony / Platinum {0}selected",
				game.Settings.ColonyPlatinumUsage == DominionBase.ColonyPlatinumUsage.Used ? "" : "<u>not</u> "
				));
			glMain.Log(String.Format("Dark Ages Kingdom card ratio is {0}/{1} = {2:P0}",
				darkAgesPiles,
				kingdomPiles,
				((float)darkAgesPiles) / kingdomPiles
				));
			glMain.Log(String.Format("   Shelters {0}selected",
				game.Settings.ShelterUsage == DominionBase.ShelterUsage.Used ? "" : "<u>not</u> "
				));

			glMain.Log("Turn order is: ", String.Join(", ", game.Players.Select(p => p == _Player ? String.Format("{0} (You)", p.Name) : p.Name)));


			Type[] specialTypes = new Type[] { 
				DominionBase.Cards.Promotional.TypeClass.BlackMarketSupply, 
				DominionBase.Cards.Cornucopia.TypeClass.PrizeSupply, 
				DominionBase.Cards.DarkAges.TypeClass.Madman,
				DominionBase.Cards.DarkAges.TypeClass.Mercenary,
				DominionBase.Cards.DarkAges.TypeClass.Spoils };

			foreach (Type specialType in specialTypes)
			{
				if (game.Table.SpecialPiles.ContainsKey(specialType))
				{
					_MatEventHandlers[specialType] = new DominionBase.Piles.Pile.PileChangedEventHandler(GamePile_PileChanged);
					game.Table.SpecialPiles[specialType].PileChanged += _MatEventHandlers[specialType];
					GamePile_PileChanged(game.Table.SpecialPiles[specialType], new DominionBase.Piles.PileChangedEventArgs(DominionBase.Piles.PileChangedEventArgs.Operation.Reset));
				}
			}

			if (game.Table.Supplies.ContainsKey(DominionBase.Cards.Prosperity.TypeClass.TradeRoute))
			{
				if (dpGameStuff.Children.Count > 0)
				{
					Border bDiv = new Border();
					bDiv.BorderThickness = new Thickness(2);
					bDiv.BorderBrush = Brushes.Black;
					Panel.SetZIndex(bDiv, 1);
					DockPanel.SetDock(bDiv, Dock.Left);
					dpGameStuff.Children.Add(bDiv);
				}

				Label lTradeRoute = new Label();
				lTradeRoute.Content = "Trade Route Tokens:";
				lTradeRoute.FontSize = 16d;
				lTradeRoute.FontWeight = FontWeights.Bold;
				lTradeRoute.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Right;
				lTradeRoute.Background = Caching.BrushRepository.GetBackgroundBrush(DominionBase.Cards.Category.Treasure);
				DockPanel.SetDock(lTradeRoute, Dock.Left);
				dpGameStuff.Children.Add(lTradeRoute);

				_TradeRouteLabel = new Label();
				_TradeRouteLabel.Content = "0";
				_TradeRouteLabel.FontWeight = FontWeights.Bold;
				_TradeRouteLabel.VerticalAlignment = System.Windows.VerticalAlignment.Stretch;
				_TradeRouteLabel.VerticalContentAlignment = System.Windows.VerticalAlignment.Center;
				_TradeRouteLabel.Background = Caching.BrushRepository.GetBackgroundBrush(DominionBase.Cards.Category.Treasure);
				_TradeRouteLabel.Padding = new Thickness(0, 0, 5, 0);
				_TradeRouteLabel.BorderThickness = new Thickness(0, 0, 1, 0);
				DockPanel.SetDock(_TradeRouteLabel, Dock.Left);
				dpGameStuff.Children.Add(_TradeRouteLabel);
			}

			if (dpGameStuff.Children.Count > 0)
				bStuffDivider.Visibility = System.Windows.Visibility.Visible;
			else
				bStuffDivider.Visibility = System.Windows.Visibility.Collapsed;

			foreach (DominionBase.Players.Player player in game.Players)
			{
				TabItem tiPlayer = new TabItem();

				DockPanel dpHeader = new DockPanel();
				Image iHeader = new Image();
				iHeader.Stretch = Stretch.None;
				iHeader.Margin = new Thickness(0, 0, 5, 0);
				DockPanel.SetDock(iHeader, Dock.Left);
				switch (player.PlayerType)
				{
					case DominionBase.Players.PlayerType.Human:
						iHeader.Source = (BitmapImage)this.Resources["imHuman"];
						break;

					case DominionBase.Players.PlayerType.Computer:
						iHeader.Source = (BitmapImage)this.Resources["imComputer"];
						break;
				}
				dpHeader.Children.Add(iHeader);
				TextBlock tbHeader = new TextBlock();
				tbHeader.Text = player.Name;
				dpHeader.Children.Add(tbHeader);
				tiPlayer.Header = dpHeader;

				tcAreas.Items.Add(tiPlayer);
				Controls.ucPlayerDisplay ucpdPlayer = new Controls.ucPlayerDisplay();
				tiPlayer.Content = ucpdPlayer;
				ucpdPlayer.IsUIPlayer = (player.PlayerType == DominionBase.Players.PlayerType.Human);
				ucpdPlayer.Player = player;

				PlayerSettings playerSettings = _Settings.PlayerSettings.FirstOrDefault(ps => ps.Name == player.Name);
				if (playerSettings != null)
				{
					ColorHls hlsValue = HLSColor.RgbToHls(playerSettings.UIColor);
					Color cPlayer = HLSColor.HlsToRgb(hlsValue.H, Math.Min(1d, hlsValue.L * 1.125), hlsValue.S * 0.95, hlsValue.A);
					GradientStopCollection gsc = new GradientStopCollection();
					gsc.Add(new GradientStop(cPlayer, 0));
					gsc.Add(new GradientStop(playerSettings.UIColor, 0.25));
					gsc.Add(new GradientStop(playerSettings.UIColor, 0.75));
					gsc.Add(new GradientStop(cPlayer, 1));
					gsc.Freeze();
					tiPlayer.Background = new LinearGradientBrush(gsc, 0);
					//tiPlayer.Background = new SolidColorBrush(playerSettings.UIColor);
					ucpdPlayer.ColorFocus = playerSettings.UIColor;
				}

				ToolTip tt = new System.Windows.Controls.ToolTip();
				Controls.ucPlayerOverview ucpo = new Controls.ucPlayerOverview();
				ucpo.Player = player;
				tt.Content = ucpo;
				ToolTipService.SetToolTip(dpHeader, tt);
				if (Settings.ToolTipShowDuration == ToolTipShowDuration.Off)
					ToolTipService.SetIsEnabled(dpHeader, false);
				else
				{
					ToolTipService.SetIsEnabled(dpHeader, true);
					ToolTipService.SetShowDuration(dpHeader, (int)Settings.ToolTipShowDuration);
				}
				dpHeader.MouseDown += new MouseButtonEventHandler(tiPlayer_MouseDown);
				dpHeader.MouseUp += new MouseButtonEventHandler(tiPlayer_MouseUp);

				player.Revealed.PileChanged += new DominionBase.Piles.Pile.PileChangedEventHandler(Revealed_PileChanged);
				player.BenefitReceiving += new DominionBase.Players.Player.BenefitReceivingEventHandler(player_BenefitReceiving);
				//player.DiscardPile.PileChanged += new DominionBase.Pile.PileChangedEventHandler(DiscardPile_PileChanged);
				player.CardPlaying += new DominionBase.Players.Player.CardPlayingEventHandler(player_CardPlaying);
				player.CardPlayed += new DominionBase.Players.Player.CardPlayedEventHandler(player_CardPlayed);
				player.CardUndoPlaying += new DominionBase.Players.Player.CardUndoPlayingEventHandler(player_CardUndoPlaying);
				player.CardUndoPlayed += new DominionBase.Players.Player.CardUndoPlayedEventHandler(player_CardUndoPlayed);
				player.CardBuying += new DominionBase.Players.Player.CardBuyingEventHandler(player_CardBuying);
				player.CardBought += new DominionBase.Players.Player.CardBoughtEventHandler(player_CardBought);
				player.CardBuyFinished += new DominionBase.Players.Player.CardBuyFinishedEventHandler(player_CardBuyFinished);
				player.CardGaining += new DominionBase.Players.Player.CardGainingEventHandler(player_CardGaining);
				player.CardGainedInto += new DominionBase.Players.Player.CardGainedIntoEventHandler(player_CardGainedInto);
				player.CardGainFinished += new DominionBase.Players.Player.CardGainFinishedEventHandler(player_CardGainFinished);
				player.TokenPlaying += new DominionBase.Players.Player.TokenPlayingEventHandler(player_TokenPlaying);
				player.TokenPlayed += new DominionBase.Players.Player.TokenPlayedEventHandler(player_TokenPlayed);
				player.Trashing += new DominionBase.Players.Player.TrashingEventHandler(player_Trashing);
				player.TrashedFinished += new DominionBase.Players.Player.TrashedFinishedEventHandler(player_Trashed);
				player.PhaseChanged += new DominionBase.Players.Player.PhaseChangedEventHandler(player_PhaseChangedEvent);
				player.PlayerModeChanged += new DominionBase.Players.Player.PlayerModeChangedEventHandler(player_PlayerModeChangedEvent);
				player.CardsDrawn += new DominionBase.Players.Player.CardsDrawnEventHandler(player_CardsDrawn);
				player.TurnStarting += new DominionBase.Players.Player.TurnStartingEventHandler(player_TurnStarting);
				player.Shuffling += new DominionBase.Players.Player.ShufflingEventHandler(player_Shuffle);
				player.CardsAddedToDeck += new DominionBase.Players.Player.CardsAddedToDeckEventHandler(player_CardsAddedToDeck);
				player.CardsAddedToHand += new DominionBase.Players.Player.CardsAddedToHandEventHandler(player_CardsAddedToHand);
				player.CardsDiscarded += new DominionBase.Players.Player.CardsDiscardedEventHandler(player_CardsDiscarded);
				player.PlayerMats.CardMatsChanged += new DominionBase.Piles.CardMats.CardMatsChangedEventHandler(PlayerMats_DecksChanged);
				player.TokenPiles.TokenCollectionsChanged += new DominionBase.TokenCollections.TokenCollectionsChangedEventHandler(PlayerTokenPiles_TokenCollectionsChanged);
				player.BenefitsChanged += new DominionBase.Players.Player.BenefitsChangedEventHandler(player_BenefitsChanged);

				if (player == _Player)
				{
					tcAreas.SelectedItem = tiPlayer;
					player.CardReceived += new DominionBase.Players.Player.CardReceivedEventHandler(player_CardReceived);
				}
			}

			game.FinalizeSetup();

			LayoutSupplyPiles();

			miNewGame.IsEnabled = false;
			miLoadGame.IsEnabled = false;
			miEndGame.IsEnabled = true;
			miSaveGame.IsEnabled = false;

			gameThread = new Thread(game.StartAsync);
			gameThread.Start();

			UpdateDisplay();
		}
Esempio n. 12
0
		private void Game_Load_Click(object sender, RoutedEventArgs e)
		{
			Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
			ofd.DefaultExt = ".save";
			ofd.Filter = "Saved game files (.save)|*.save";
			Nullable<Boolean> dialogResult = ofd.ShowDialog(this);
			if (dialogResult != true)
				return;

			this.game = new DominionBase.Game();
			this.game.Load(ofd.FileName);

			// Clean out the Image Repository before starting a new game -- 
			// so we don't allocate too much memory for cards we're not even using
			Caching.ImageRepository.Reset();
			dpGameInfo.Visibility = System.Windows.Visibility.Visible;
			glMain.TearDown();
			glMain.Clear();

			LayoutSupplyPiles();
			while (tcAreas.Items.Count > 2)
				tcAreas.Items.RemoveAt(tcAreas.Items.Count - 1);
			dpMatsandPiles.Children.Clear();
			dpGameStuff.Children.Clear();
			_TradeRouteLabel = null;

			// Try to force garbage collection to save some memory
			GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);

			// -------------------------------------------------------------------------------

			game.GameEndedEvent += new DominionBase.Game.GameEndedEventHandler(game_GameEndedEvent);

			wMain.Settings.PlayerSettings.ForEach(ps => glMain.AddPlayerColor(ps.Name, ps.UIColor));
			if (game.ActivePlayer != null)
			{
				glMain.NewSection(String.Format("Game loaded from {0}.", game.StartTime));
				glMain.Log("It's ", game.ActivePlayer, "'s turn");
			}

			game.Table.TokenPiles.TokenCollectionsChanged += new DominionBase.TokenCollections.TokenCollectionsChangedEventHandler(TokenPiles_TokenCollectionsChanged);
			game.Table.Trash.PileChanged += new DominionBase.Piles.Pile.PileChangedEventHandler(Trash_PileChanged);
			Trash_PileChanged(game.Table.Trash, new DominionBase.Piles.PileChangedEventArgs(DominionBase.Piles.PileChangedEventArgs.Operation.Reset));
			game.GameMessage += new DominionBase.Game.GameMessageEventHandler(game_GameMessage);

			foreach (DominionBase.Players.Player player in game.Players.FindAll(p => p.PlayerType == DominionBase.Players.PlayerType.Human))
				player.Choose = player_Choose;

			if (game.Players.Any(player => player.PlayerType == DominionBase.Players.PlayerType.Human))
				_Player = game.Players.OfType<DominionBase.Players.Human>().First();
			else
				_Player = null;

			// -------------------------------------------------------------------------------

			Type[] specialTypes = new Type[] { 
				DominionBase.Cards.Promotional.TypeClass.BlackMarketSupply, 
				DominionBase.Cards.Cornucopia.TypeClass.PrizeSupply, 
				DominionBase.Cards.DarkAges.TypeClass.Madman,
				DominionBase.Cards.DarkAges.TypeClass.Mercenary,
				DominionBase.Cards.DarkAges.TypeClass.Spoils };

			foreach (Type specialType in specialTypes)
			{
				if (game.Table.SpecialPiles.ContainsKey(specialType))
				{
					_MatEventHandlers[specialType] = new DominionBase.Piles.Pile.PileChangedEventHandler(GamePile_PileChanged);
					game.Table.SpecialPiles[specialType].PileChanged += _MatEventHandlers[specialType];
					GamePile_PileChanged(game.Table.SpecialPiles[specialType], new DominionBase.Piles.PileChangedEventArgs(DominionBase.Piles.PileChangedEventArgs.Operation.Reset));
				}
			}

			if (game.Table.Supplies.ContainsKey(DominionBase.Cards.Prosperity.TypeClass.TradeRoute))
			{
				if (dpGameStuff.Children.Count > 0)
				{
					Border bDiv = new Border();
					bDiv.BorderThickness = new Thickness(2);
					bDiv.BorderBrush = Brushes.Black;
					Panel.SetZIndex(bDiv, 1);
					DockPanel.SetDock(bDiv, Dock.Left);
					dpGameStuff.Children.Add(bDiv);
				}

				Label lTradeRoute = new Label();
				lTradeRoute.Content = "Trade Route Tokens:";
				lTradeRoute.FontSize = 16d;
				lTradeRoute.FontWeight = FontWeights.Bold;
				lTradeRoute.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Right;
				lTradeRoute.Background = Caching.BrushRepository.GetBackgroundBrush(DominionBase.Cards.Category.Treasure);
				DockPanel.SetDock(lTradeRoute, Dock.Left);
				dpGameStuff.Children.Add(lTradeRoute);

				_TradeRouteLabel = new Label();
				_TradeRouteLabel.Content = game.Table.TokenPiles[DominionBase.Cards.Prosperity.TypeClass.TradeRouteToken].Count;
				_TradeRouteLabel.FontWeight = FontWeights.Bold;
				_TradeRouteLabel.VerticalAlignment = System.Windows.VerticalAlignment.Stretch;
				_TradeRouteLabel.VerticalContentAlignment = System.Windows.VerticalAlignment.Center;
				_TradeRouteLabel.Background = Caching.BrushRepository.GetBackgroundBrush(DominionBase.Cards.Category.Treasure);
				_TradeRouteLabel.Padding = new Thickness(0, 0, 5, 0);
				_TradeRouteLabel.BorderThickness = new Thickness(0, 0, 1, 0);
				DockPanel.SetDock(_TradeRouteLabel, Dock.Left);
				dpGameStuff.Children.Add(_TradeRouteLabel);
			}

			if (dpGameStuff.Children.Count > 0)
				bStuffDivider.Visibility = System.Windows.Visibility.Visible;
			else
				bStuffDivider.Visibility = System.Windows.Visibility.Collapsed;

			foreach (DominionBase.Players.Player player in game.Players)
			{
				TabItem tiPlayer = new TabItem();

				DockPanel dpHeader = new DockPanel();
				Image iHeader = new Image();
				iHeader.Stretch = Stretch.None;
				iHeader.Margin = new Thickness(0, 0, 5, 0);
				DockPanel.SetDock(iHeader, Dock.Left);
				switch (player.PlayerType)
				{
					case DominionBase.Players.PlayerType.Human:
						iHeader.Source = (BitmapImage)this.Resources["imHuman"];
						break;

					case DominionBase.Players.PlayerType.Computer:
						iHeader.Source = (BitmapImage)this.Resources["imComputer"];
						break;
				}
				dpHeader.Children.Add(iHeader);
				TextBlock tbHeader = new TextBlock();
				tbHeader.Text = player.Name;
				dpHeader.Children.Add(tbHeader);
				tiPlayer.Header = dpHeader;

				tcAreas.Items.Add(tiPlayer);
				Controls.ucPlayerDisplay ucpdPlayer = new Controls.ucPlayerDisplay();
				tiPlayer.Content = ucpdPlayer;
				ucpdPlayer.IsUIPlayer = (player == _Player);
				ucpdPlayer.Player = player;

				PlayerSettings playerSettings = _Settings.PlayerSettings.FirstOrDefault(ps => ps.Name == player.Name);
				if (playerSettings != null)
				{
					ColorHls hlsValue = HLSColor.RgbToHls(playerSettings.UIColor);
					Color cPlayer = HLSColor.HlsToRgb(hlsValue.H, Math.Min(1d, hlsValue.L * 1.125), hlsValue.S * 0.95, hlsValue.A);
					GradientStopCollection gsc = new GradientStopCollection();
					gsc.Add(new GradientStop(cPlayer, 0));
					gsc.Add(new GradientStop(playerSettings.UIColor, 0.25));
					gsc.Add(new GradientStop(playerSettings.UIColor, 0.75));
					gsc.Add(new GradientStop(cPlayer, 1));
					gsc.Freeze();
					tiPlayer.Background = new LinearGradientBrush(gsc, 0);
					//tiPlayer.Background = new SolidColorBrush(playerSettings.UIColor);
					ucpdPlayer.ColorFocus = playerSettings.UIColor;
				}

				ToolTip tt = new System.Windows.Controls.ToolTip();
				Controls.ucPlayerOverview ucpo = new Controls.ucPlayerOverview();
				ucpo.Player = player;
				tt.Content = ucpo;
				ToolTipService.SetToolTip(dpHeader, tt);
				if (Settings.ToolTipShowDuration == ToolTipShowDuration.Off)
					ToolTipService.SetIsEnabled(dpHeader, false);
				else
				{
					ToolTipService.SetIsEnabled(dpHeader, true);
					ToolTipService.SetShowDuration(dpHeader, (int)Settings.ToolTipShowDuration);
				}
				dpHeader.MouseDown += new MouseButtonEventHandler(tiPlayer_MouseDown);
				dpHeader.MouseUp += new MouseButtonEventHandler(tiPlayer_MouseUp);

				player.Revealed.PileChanged += new DominionBase.Piles.Pile.PileChangedEventHandler(Revealed_PileChanged);
				player.BenefitReceiving += new DominionBase.Players.Player.BenefitReceivingEventHandler(player_BenefitReceiving);
				//player.DiscardPile.PileChanged += new DominionBase.Pile.PileChangedEventHandler(DiscardPile_PileChanged);
				player.CardPlaying += new DominionBase.Players.Player.CardPlayingEventHandler(player_CardPlaying);
				player.CardPlayed += new DominionBase.Players.Player.CardPlayedEventHandler(player_CardPlayed);
				player.CardUndoPlaying += new DominionBase.Players.Player.CardUndoPlayingEventHandler(player_CardUndoPlaying);
				player.CardUndoPlayed += new DominionBase.Players.Player.CardUndoPlayedEventHandler(player_CardUndoPlayed);
				player.CardBuying += new DominionBase.Players.Player.CardBuyingEventHandler(player_CardBuying);
				player.CardBought += new DominionBase.Players.Player.CardBoughtEventHandler(player_CardBought);
				player.CardBuyFinished += new DominionBase.Players.Player.CardBuyFinishedEventHandler(player_CardBuyFinished);
				player.CardGaining += new DominionBase.Players.Player.CardGainingEventHandler(player_CardGaining);
				player.CardGainedInto += new DominionBase.Players.Player.CardGainedIntoEventHandler(player_CardGainedInto);
				player.CardGainFinished += new DominionBase.Players.Player.CardGainFinishedEventHandler(player_CardGainFinished);
				player.TokenPlaying += new DominionBase.Players.Player.TokenPlayingEventHandler(player_TokenPlaying);
				player.TokenPlayed += new DominionBase.Players.Player.TokenPlayedEventHandler(player_TokenPlayed);
				player.Trashing += new DominionBase.Players.Player.TrashingEventHandler(player_Trashing);
				player.TrashedFinished += new DominionBase.Players.Player.TrashedFinishedEventHandler(player_Trashed);
				player.PhaseChanged += new DominionBase.Players.Player.PhaseChangedEventHandler(player_PhaseChangedEvent);
				player.PlayerModeChanged += new DominionBase.Players.Player.PlayerModeChangedEventHandler(player_PlayerModeChangedEvent);
				player.CardsDrawn += new DominionBase.Players.Player.CardsDrawnEventHandler(player_CardsDrawn);
				player.TurnStarting += new DominionBase.Players.Player.TurnStartingEventHandler(player_TurnStarting);
				player.Shuffling += new DominionBase.Players.Player.ShufflingEventHandler(player_Shuffle);
				player.CardsAddedToDeck += new DominionBase.Players.Player.CardsAddedToDeckEventHandler(player_CardsAddedToDeck);
				player.CardsAddedToHand += new DominionBase.Players.Player.CardsAddedToHandEventHandler(player_CardsAddedToHand);
				player.CardsDiscarded += new DominionBase.Players.Player.CardsDiscardedEventHandler(player_CardsDiscarded);
				player.PlayerMats.CardMatsChanged += new DominionBase.Piles.CardMats.CardMatsChangedEventHandler(PlayerMats_DecksChanged);
				player.TokenPiles.TokenCollectionsChanged += new DominionBase.TokenCollections.TokenCollectionsChangedEventHandler(PlayerTokenPiles_TokenCollectionsChanged);
				player.BenefitsChanged += new DominionBase.Players.Player.BenefitsChangedEventHandler(player_BenefitsChanged);

				if (player == _Player)
				{
					tcAreas.SelectedItem = tiPlayer;
					player.CardReceived += new DominionBase.Players.Player.CardReceivedEventHandler(player_CardReceived);
				}
			}

			miNewGame.IsEnabled = false;
			miLoadGame.IsEnabled = false;
			miEndGame.IsEnabled = true;
			miSaveGame.IsEnabled = false;

			gameThread = new Thread(game.StartAsync);
			gameThread.Start();

			if (game.ActivePlayer != null)
			{
				if (game.Players[0] != game.ActivePlayer)
					glMain.NewTurn(game.TurnsTaken.TurnNumber(game.ActivePlayer));
				player_BenefitsChanged(game.ActivePlayer, new DominionBase.Players.BenefitsChangedEventArgs(game.ActivePlayer)
				{
					Actions = game.ActivePlayer.Actions,
					Buys = game.ActivePlayer.Buys,
					Currency = game.ActivePlayer.Currency,
					Player = game.ActivePlayer
				});
			}
			if (_Player.Phase == DominionBase.Players.PhaseEnum.Starting ||
					_Player.Phase == DominionBase.Players.PhaseEnum.Buy ||
					_Player.PlayerMode == DominionBase.Players.PlayerMode.Waiting)
				CheckBuyable(_Player);
			else
				ClearBuyable();
			UpdateDisplay();
		}
Esempio n. 13
0
		private void ReleaseGame()
		{
			_Player = null;
			uccChooser.IsReady = false;

			cardTrash.Pile = null;
			foreach (TabItem ti in tcAreas.Items)
			{
				if (ti.Content is Controls.ucPlayerDisplay)
				{
					(ti.Content as Controls.ucPlayerDisplay).TearDown();
					(((ti.Header as DockPanel).ToolTip as ToolTip).Content as Controls.ucPlayerOverview).TearDown();
				}
			}

			foreach (StackPanel sp in stackPanelSupplyPiles.Children.OfType<StackPanel>())
			{
				foreach (SupplyControl sc in sp.Children.OfType<SupplyControl>())
				{
					sc.Supply = null;
				}
			}

			if (game == null)
				return;

			ReleaseEvents();

			game.Clear();
			game = null;

			GC.Collect();
			GC.Collect(1);
			GC.Collect(2);
			GC.Collect(3);
			GC.WaitForPendingFinalizers();
			GC.Collect();
		}
Esempio n. 14
0
		void player_TurnStarting(object sender, DominionBase.Players.TurnStartingEventArgs e)
		{
			if (this.Dispatcher.CheckAccess())
			{
				if (e.Player.PlayerType == DominionBase.Players.PlayerType.Human)
				{
					dpStuff.IsEnabled = true;
					miSaveGame.IsEnabled = true;
                    _Player = e.Player;
				}
				else
				{
					dpStuff.IsEnabled = false;
					miSaveGame.IsEnabled = false;
				}

				// Just in case
				_CurrentPlayDepth = 0;
				if (game.Players[0] == e.Player && e.GrantedBy == null)
					glMain.NewTurn(game.TurnsTaken.TurnNumber(e.Player));
				glMain.NewTurn(e.Player, e.GrantedBy);
			}
			else
			{
				this.Dispatcher.BeginInvoke(new EventHandler<DominionBase.Players.TurnStartingEventArgs>(player_TurnStarting), System.Windows.Threading.DispatcherPriority.Normal, sender, e);
			}
		}