コード例 #1
0
ファイル: MapNode.cs プロジェクト: ndilday/FEUnity
 public bool HasMinorPlanet()
 {
     return(Planets != null && Planets.Any(p => p.PlanetType == PlanetType.MinorPlanet));
 }
コード例 #2
0
        public List <string> GetWarnings()
        {
            var warnings           = new List <string>();
            var planetIDs          = Planets.Select(p => p.ID).ToHashSet();
            var playerNames        = Players.Select(p => p.Name).ToHashSet();
            var factionNames       = Factions.Select(f => f.Name).ToHashSet();
            var playerFactionNames = Factions.Select(p => p.Name).ToHashSet();
            var ownerNames         = Planets.Select(p => p.OwnerName).Where(n => n != null).ToHashSet();

            if (!ownerNames.IsSubsetOf(playerNames))
            {
                warnings.Add("Planet owner does not exist.");
            }
            if (!playerFactionNames.IsSubsetOf(factionNames))
            {
                warnings.Add("Player faction does not exist.");
            }
            if (planetIDs.Count != Planets.Count)
            {
                warnings.Add("Duplicate planet ID.");
            }
            if (playerNames.Count != Players.Count)
            {
                warnings.Add("Duplicate player name.");
            }
            if (factionNames.Count != Factions.Count)
            {
                warnings.Add("Duplicate faction.");
            }
            {
                var link = Links.FirstOrDefault(l => l[0] == l[1]);
                if (link != null)
                {
                    warnings.Add(String.Format("Link has same source and destination: {0} {1}", link[0], link[1]));
                }
            }
            foreach (var link in Links)
            {
                if (!planetIDs.IsSupersetOf(link.PlanetIDs))
                {
                    warnings.Add("Link points to inexistent planet");
                }
                Array.Sort(link.PlanetIDs);
            }
            foreach (var link1 in Links)
            {
                foreach (var link2 in Links)
                {
                    if (link1 != link2 && link1.PlanetIDs.SequenceEqual(link2.PlanetIDs))
                    {
                        warnings.Add("Duplicate Link");
                    }
                }
            }
            Func <string, Planet, string> format = (s, p) => String.Format("Planet {0} {1} missing.", p.Name ?? String.Empty, s);

            foreach (var p in Planets)
            {
                if (p.OwnerName != null || p.FactionName != null || p.MapName != null)
                {
                    if (p.OwnerName == null)
                    {
                        warnings.Add(p.Name + format("owner", p));
                    }
                    if (p.FactionName == null)
                    {
                        warnings.Add(format("faction", p));
                    }
                    if (p.MapName == null)
                    {
                        warnings.Add(format("map", p));
                    }
                    if (p.Name == null)
                    {
                        warnings.Add(format("name", p));
                    }
                }
            }

            if (Planets.Count(p => p.IsStartingPlanet) != Factions.Count)
            {
                warnings.Add("Wrong number of starting planets.");
            }

            if (Round == 0 && Planets.Any(p => p.OwnerName == null) && !playerNames.All(ownerNames.Contains))
            {
                warnings.Add("Galaxy has free space and a player has no planet.");
            }
            if (Planets.Count > MapNames.Count)
            {
                warnings.Add("Not enough maps.");
            }

            if (Factions.Count < 2)
            {
                warnings.Add("Not enough factions.");
            }
            return(warnings);
        }
コード例 #3
0
        public void Update(DateTime currentTime)
        {
            if (this.Waiting)
            {
                if (currentTime > gameStart)
                {
                    if (Players.Count == 2)
                    {
                        this.Waiting = false;
                    }
                    else
                    {
                        if (currentTime > gameQuit)
                        {
                            this.Waiting = false;
                            this.Status  = "Nobody joined your game, I guess that means you win.";
                            GameOver     = true;
                        }
                        else
                        {
                            UpdateTimeInfo(gameStart.AddSeconds(2));
                        }
                    }
                }
                return;
            }

            if (GameOver)
            {
                this.Stop();
                return;
            }

            // check if we are in the server window
            if (currentTime >= endPlayerTurn)
            {
                // server processing
                Processing = true;

                // Grow ships on planets
                foreach (var planet in Planets)
                {
                    // if the planet is not controlled by neutral update
                    if (planet.OwnerId != -1)
                    {
                        planet.NumberOfShips += planet.GrowthRate;
                    }
                }

                // Send fleets
                foreach (var fleet in Fleets)
                {
                    // travel 1 unit distance each turn
                    fleet.NumberOfTurnsToDestination--;
                }

                // Resolve planet battles
                foreach (var planet in Planets)
                {
                    var combatants = new Dictionary <int, int>();
                    combatants.Add(planet.OwnerId, planet.NumberOfShips);
                    // find fleets destined for this planet
                    var fleets = Fleets.Where(f => f.Destination.Id == planet.Id && f.NumberOfTurnsToDestination <= 0);
                    foreach (var fleet in fleets)
                    {
                        if (combatants.ContainsKey(fleet.OwnerId))
                        {
                            combatants[fleet.OwnerId] += fleet.NumberOfShips;
                        }
                        else
                        {
                            combatants.Add(fleet.OwnerId, fleet.NumberOfShips);
                        }
                    }

                    if (fleets.Count() <= 0)
                    {
                        continue;
                    }

                    KeyValuePair <int, int> second = new KeyValuePair <int, int>(1, 0);
                    KeyValuePair <int, int> winner = new KeyValuePair <int, int>(2, 0);
                    foreach (var keyval in combatants)
                    {
                        if (keyval.Value > second.Value)
                        {
                            if (keyval.Value > winner.Value)
                            {
                                second = winner;
                                winner = keyval;
                            }
                            else
                            {
                                second = keyval;
                            }
                        }
                    }

                    if (winner.Value > second.Value)
                    {
                        planet.NumberOfShips = winner.Value - second.Value;
                        planet.OwnerId       = winner.Key;
                    }
                    else
                    {
                        planet.NumberOfShips = 0;
                    }
                }

                // remove finished fleets
                lock (synclock)
                {
                    _fleets.RemoveAll(f => f.NumberOfTurnsToDestination <= 0);
                }

                // Check game over conditions
                var player1NoPlanets = !Planets.Any(p => p.OwnerId == 1);
                var player1NoShips   = !Fleets.Any(f => f.OwnerId == 1);

                var player2NoPlanet = !Planets.Any(p => p.OwnerId == 2);
                var player2NoShips  = !Fleets.Any(f => f.OwnerId == 2);

                if (player1NoPlanets && player1NoShips)
                {
                    // player 2 has won
                    var winner = Players.Values.FirstOrDefault(p => p.Id == 2);
                    var loser  = Players.Values.FirstOrDefault(p => p.Id == 1);
                    this.Status   = $"{winner?.PlayerName} has defeated {loser?.PlayerName}!";
                    this.GameOver = true;
                }

                if (player2NoPlanet && player2NoShips)
                {
                    // player 1 has won
                    var winner = Players.Values.FirstOrDefault(p => p.Id == 1);
                    var loser  = Players.Values.FirstOrDefault(p => p.Id == 2);
                    this.Status   = $"{winner?.PlayerName} has defeated {loser?.PlayerName}!";
                    this.GameOver = true;
                }

                PlayerAScoreOverTime.Add(_getPlayerScore(1));
                PlayerBScoreOverTime.Add(_getPlayerScore(2));

                // Turn complete
                Turn++;
                endPlayerTurn = currentTime.AddMilliseconds(PLAYER_TURN_LENGTH);
                endServerTurn = endPlayerTurn.AddMilliseconds(SERVER_TURN_LENGTH);
                Processing    = false;
                System.Diagnostics.Debug.WriteLine($"Game {Id} : Turn {Turn} : Next Turn Start {endServerTurn.Subtract(DateTime.UtcNow).TotalMilliseconds}ms");
            }

            if (Turn >= MAX_TURN)
            {
                var player1 = _getPlayerForId(1)?.PlayerName;
                var player2 = _getPlayerForId(2)?.PlayerName;

                var player1Score = _getPlayerScore(1);
                var player2Score = _getPlayerScore(2);

                if (player1Score == player2Score)
                {
                    this.Status = $"{player1} has tied {player2}!";
                }
                else if (player1Score > player2Score)
                {
                    this.Status = $"{player1} has defeated {player2}!";
                }
                else
                {
                    this.Status = $"{player2} has defeated {player1}!";
                }

                this.GameOver = true;
            }
        }
コード例 #4
0
ファイル: Package.cs プロジェクト: ekolis/FrEee
        public override string ToString()
        {
            var items = new List <string>();

            if (TreatyClauses.Any())
            {
                if (TreatyClauses.Count == 1)
                {
                    items.Add(TreatyClauses.Single().ToString());
                }
                else
                {
                    items.Add(TreatyClauses.Count + " treaty clauses");
                }
            }
            if (Planets.Any())
            {
                if (Planets.Count == 1)
                {
                    items.Add(Planets.Single().ToString());
                }
                else
                {
                    items.Add(Planets.Count + " planets");
                }
            }
            if (Vehicles.Any())
            {
                if (Vehicles.Count == 1)
                {
                    items.Add(Vehicles.Single().ToString());
                }
                else
                {
                    items.Add(Vehicles.Count + " vehicles");
                }
            }
            if (Resources.Any(kvp => kvp.Value != 0))
            {
                items.Add(Resources.ToString());
            }
            if (Technology.Any())
            {
                if (Technology.Count == 1)
                {
                    var kvp = Technology.Single();
                    items.Add(kvp.Key + " to level " + kvp.Value);
                }
                else
                {
                    items.Add(Technology.Count + " technologies");
                }
            }
            if (StarCharts.Any())
            {
                if (StarCharts.Count == 1)
                {
                    items.Add("the star chart for " + StarCharts.Single().ToString());
                }
                else
                {
                    items.Add(StarCharts.Count + " star charts");
                }
            }
            if (CommunicationChannels.Any())
            {
                if (CommunicationChannels.Count == 1)
                {
                    items.Add("comm channels to " + CommunicationChannels.Single().ToString());
                }
                else
                {
                    items.Add(CommunicationChannels.Count + " comm channels");
                }
            }
            if (!items.Any())
            {
                return("nothing");
            }
            return(string.Join(", ", items.ToArray()));
        }