private void attackChooseDest(string countryId)
        {
            ArmyViz armyViz = riskMap.GetArmyViz(countryId);

            if (armyViz.PlayerId == stateManager.ActivePlayerId)
            {
                return;
            }

            int maxDiceNum = Math.Min(2, armyViz.ArmyCount);

            stateManager.AttackDestSelected(countryId, maxDiceNum);
            refreshViews();

            ArmyViz attacker = riskMap.GetArmyViz(stateManager.AttackSource);

            if (attacker.ArmyCount < 5)
            {
                soundPool.Play(GameSound.AttackL1);
            }
            else if (attacker.ArmyCount < 10)
            {
                soundPool.Play(GameSound.AttackL2);
            }
            else
            {
                soundPool.Play(GameSound.AttackL3);
            }
        }
        private void attackChooseSource(string countryId)
        {
            ArmyViz armyViz = riskMap.GetArmyViz(countryId);

            if (armyViz.PlayerId != stateManager.ActivePlayerId || armyViz.ArmyCount < 2)
            {
                return;
            }

            /*attackArmyViz.CountryID = countryId;
             * attackArmyViz.PlayerId = stateManager.ActivePlayerId;
             * attackArmyViz.AddArmy();
             *
             * armyViz.ArmyCount--;
             *
             * Point p = armyViz.TranslatePoint(new Point(0, 0), mainGrid);
             *
             * //Size vizSize = armyViz.RenderSize;
             * //p -= new Vector(vizSize.Width, vizSize.Height);
             *
             * p -= new Vector(50, 50);
             * attackArmyViz.Margin = new Thickness(p.X, p.Y, 0, 0);*/

            armyViz.IsAttacking = true;
            int maxDiceNum = Math.Min(3, armyViz.ArmyCount - 1);

            stateManager.AttackSourceSelected(countryId, maxDiceNum);
            //attackArmyViz.Visibility = Visibility.Visible;

            refreshViews();
            soundPool.Play(GameSound.AttackChooseSource);
        }
        private void addArmy(string countryId)
        {
            ArmyViz armyViz = riskMap.GetArmyViz(countryId);

            if (riskMap.GetArmyViz(countryId).PlayerId != stateManager.ActivePlayerId)
            {
                return;
            }

            armyViz.AddArmy();
            stateManager.Next();
            refreshViews();
            soundPool.Play(GameSound.AddArmy);
        }
        public IEnumerable <ArmyViz> GetAllArmyViz()
        {
            List <ArmyViz> res = new List <ArmyViz>();

            foreach (var child in counterCanvas.Children)
            {
                ArmyViz t = child as ArmyViz;
                if (t != null)
                {
                    //yield return t;
                    res.Add(t);
                }
            }
            return(res);
        }
        /*public void AddArmy(string countryId)
         * {
         *  GetArmyViz(countryId).AddArmy();
         * }
         *
         * public int GetCountryOwner(string countryId)
         * {
         *  return GetArmyViz(countryId).PlayerID;
         * }*/

        public ArmyViz GetArmyViz(string countryId)
        {
            ArmyViz viz = null;

            foreach (var child in counterCanvas.Children)
            {
                ArmyViz t = child as ArmyViz;
                if (t != null && t.CountryID == countryId)
                {
                    viz = t;
                    break;
                }
            }

            return(viz);
        }
        public void DrawAttackLine(string attackerCountryId, string defenderCountryId)
        {
            ArmyViz fromArmy = GetArmyViz(attackerCountryId);
            ArmyViz toArmy   = GetArmyViz(defenderCountryId);

            Point from = fromArmy.TranslatePoint(new Point(fromArmy.RenderSize.Width / 2, fromArmy.RenderSize.Height / 2), mainCanvas);
            Point to   = toArmy.TranslatePoint(new Point(toArmy.RenderSize.Width / 2, toArmy.RenderSize.Height / 2), mainCanvas);

            DoubleAnimation xAnim = new DoubleAnimation(from.X, to.X, new Duration(TimeSpan.FromSeconds(0.5)));
            DoubleAnimation yAnim = new DoubleAnimation(from.Y, to.Y, new Duration(TimeSpan.FromSeconds(0.5)));

            attackLine.X1 = from.X;
            attackLine.Y1 = from.Y;

            attackLine.BeginAnimation(Line.X2Property, xAnim);
            attackLine.BeginAnimation(Line.Y2Property, yAnim);
            attackLine.Visibility = Visibility.Visible;
        }
        private void chooseCountry(string countryId)
        {
            ArmyViz armyViz = riskMap.GetArmyViz(countryId);

            if (armyViz.PlayerId != 0)
            {
                return;
            }

            armyViz.PlayerId = stateManager.ActivePlayerId;
            armyViz.AddArmy();

            //check if all countries are picked
            int blankCount = 0;

            foreach (ArmyViz eachArmyViz in riskMap.GetAllArmyViz())
            {
                if (eachArmyViz.PlayerId == 0)
                {
                    blankCount++;
                    armyViz = eachArmyViz;

                    if (blankCount >= 2)
                    {
                        break;
                    }
                }
            }

            if (blankCount == 1)
            {
                armyViz.PlayerId = stateManager.ActivePlayerId == PlayerManager.PlayerNum ? 1 : stateManager.ActivePlayerId + 1;
                armyViz.AddArmy();
                stateManager.Finish();
            }
            else
            {
                stateManager.Next();
            }

            refreshViews();
            soundPool.Play(GameSound.AddArmy);
        }
        private void wizardOzWindow_DiceFinished(object sender, DiceFinishedEventArgs e)
        {
            Debug.Assert(stateManager.State == GameState.AttackWaitDice);

            var whiteDices = from g in e.AllDices
                             where g.DiceColor == DiceColor.White
                             orderby g.Value descending
                             select g;

            var redDices = from g in e.AllDices
                           where g.DiceColor == DiceColor.Red
                           orderby g.Value descending
                           select g;

            if (redDices.Count() == 0 || redDices.Count() > stateManager.AttackerMaxDiceNum ||
                whiteDices.Count() != stateManager.DefenderMaxDiceNum)
            {
                stateManager.Error();
                soundPool.Play(GameSound.Error);
            }
            else
            {
                //judgement
                ArmyViz attackerViz = riskMap.GetArmyViz(stateManager.AttackSource);
                ArmyViz defenderViz = riskMap.GetArmyViz(stateManager.AttackDest);
                var     redIt = redDices.GetEnumerator();
                var     whiteIt = whiteDices.GetEnumerator();
                int     attackerLost = 0, defenderLost = 0;

                while (redIt.MoveNext() && whiteIt.MoveNext())
                {
                    if (redIt.Current.Value > whiteIt.Current.Value)
                    {
                        defenderLost++;
                    }
                    else
                    {
                        attackerLost++;
                    }
                }

                Debug.Assert(attackerViz.ArmyCount >= attackerLost + 1);
                Debug.Assert(defenderViz.ArmyCount >= defenderLost);

                bool attackerWin;
                //owner changing
                if (defenderViz.ArmyCount == defenderLost)  //win
                {
                    defenderViz.PlayerId   = stateManager.ActivePlayerId;
                    defenderViz.ArmyCount  = redDices.Count() - attackerLost;
                    attackerViz.ArmyCount -= redDices.Count();
                    attackerWin            = true;
                }
                else    //lose
                {
                    attackerViz.ArmyCount -= attackerLost;
                    defenderViz.ArmyCount -= defenderLost;
                    attackerWin            = false;
                }

                stateManager.AttackDiceDetected(attackerLost, defenderLost, attackerWin);

                if (attackerWin)
                {
                    soundPool.Play(GameSound.AttackWin);
                }
                else
                {
                    soundPool.Play(GameSound.AttackFail);
                }
            }

            refreshViews();
        }