Beispiel #1
0
        private Game.TurnInput GetTurnInputForRecordKeeping()
        {
            var result = new Game.TurnInput();

            result.Stars.AddRange(stars.Select(s => s.Data.Clone()));
            for (int from = 0; from < NUM_STARS; from++)
            {
                foreach (int to in links[from])
                {
                    if (to > from)
                    {
                        result.Link.Add(new Game.Link {
                            StarIdA = from,
                            StarIdB = to,
                        });
                    }
                }
            }
            result.Flight.AddRange(flights.Select(f => f.Clone()));
            return(result);
        }
Beispiel #2
0
        private Game.TurnInput AnonymizeTurnInput(Game.TurnInput input, int commanderId)
        {
            Commander commander = commanders[commanderId];
            var       result    = new Game.TurnInput();

            foreach (var star in input.Stars)
            {
                var copy = star.Clone();
                if (copy.Owner != -1)
                {
                    copy.Owner = commander.AnonymizedCommanderIds[copy.Owner];
                }
                result.Stars.Add(copy);
            }
            result.Link.AddRange(input.Link);
            foreach (var flight in input.Flight)
            {
                var copy = flight.Clone();
                copy.Owner = commander.AnonymizedCommanderIds[copy.Owner];
                result.Flight.Add(copy);
            }
            return(result);
        }
Beispiel #3
0
        public List <Game.TurnInput> GetInputsForTurn()
        {
            var inputs = new List <Game.TurnInput>();

            for (int i = 0; i < 2 * NUM_COMMANDERS_PER_PLAYER; i++)
            {
                inputs.Add(null);
            }

            // For each star, the list of commander IDs who can see this star and its surroundings.
            var visibility = new List <List <int> >();

            var components = GetCommanderConnectedComponents();
            List <List <int> > componentOwnedStars = new List <List <int> >();

            for (int i = 0; i < components.NumComponents; i++)
            {
                componentOwnedStars.Add(new List <int>());
            }
            for (int i = 0; i < NUM_STARS; i++)
            {
                if (stars[i].Data.Owner != -1)
                {
                    componentOwnedStars[components.CommanderToComponent[stars[i].Data.Owner]].Add(i);
                }
            }
            for (int i = 0; i < components.NumComponents; i++)
            {
                var componentInput = new Game.TurnInput();
                for (int starId = 0; starId < NUM_STARS; starId++)
                {
                    bool canSee = false;
                    foreach (int intelStar in componentOwnedStars[i])
                    {
                        if (CalculateDistanceCeiling(intelStar, starId) <= SIGHT_RANGE)
                        {
                            canSee = true;
                            break;
                        }
                    }
                    if (canSee)
                    {
                        componentInput.Stars.Add(stars[starId].Data);
                    }
                }
                for (int from = 0; from < NUM_STARS; from++)
                {
                    foreach (int to in links[from])
                    {
                        if (to > from)
                        {
                            bool canSee = false;
                            foreach (int intelStar in componentOwnedStars[i])
                            {
                                if (CalculateDistanceCeiling(intelStar, to) <= SIGHT_RANGE ||
                                    CalculateDistanceCeiling(intelStar, from) <= SIGHT_RANGE)
                                {
                                    canSee = true;
                                    break;
                                }
                            }
                            if (canSee)
                            {
                                componentInput.Link.Add(new Game.Link {
                                    StarIdA = from,
                                    StarIdB = to,
                                });
                            }
                        }
                    }
                }
                foreach (var flight in flights)
                {
                    int    totalTurns = (CalculateDistanceCeiling(flight.FromStarId, flight.ToStarId) + TRAVEL_SPEED - 1) / TRAVEL_SPEED;
                    double posRatio   = 1 - (double)flight.TurnsToArrival / totalTurns;
                    var    fromPos    = stars[flight.FromStarId].Position;
                    var    toPos      = stars[flight.ToStarId].Position;
                    double posX       = fromPos.X + (toPos.X - fromPos.X) * posRatio;
                    double posY       = fromPos.Y + (toPos.Y - fromPos.Y) * posRatio;

                    bool canSee = false;
                    foreach (int intelStar in componentOwnedStars[i])
                    {
                        double intelX = stars[intelStar].Position.X;
                        double intelY = stars[intelStar].Position.Y;
                        if (Math.Pow(intelX - posX, 2) + Math.Pow(intelY - posY, 2) + 1e-5 <= Math.Pow(SIGHT_RANGE, 2))
                        {
                            canSee = true;
                            break;
                        }
                    }
                    // Commander's own ships are always visible.
                    if (components.ComponentToCommanders[i].Contains(flight.Owner))
                    {
                        canSee = true;
                    }
                    if (canSee)
                    {
                        componentInput.Flight.Add(flight);
                    }
                }
                foreach (int commander in components.ComponentToCommanders[i])
                {
                    inputs[commander] = AnonymizeTurnInput(componentInput, commander);
                }
            }
            return(inputs);
        }