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