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(); }