protected override Session ImplStartSession(Ballz game, GameSettings settings, bool remoteControlled, int localPlayerId) { var session = new Session(game, new World(new Terrain(settings.MapTexture)), settings) { UsePlayerTurns = this.UsePlayerTurns, Terrain = new Terrain(settings.MapTexture) }; FindSpawnPoints(settings.MapTexture, session.Terrain.Scale); var spawnPoints = SelectSpawnpoints(settings.Teams.Select(t=>t.NumberOfBallz).Sum()); // Create players and Ballz var currBallCreating = 0; foreach (var team in settings.Teams) { var player = new Player { Id = team.Id, Name = team.Name, TeamName = team.Country, IsLocal = !remoteControlled || localPlayerId == team.Id }; session.Players.Add(player); var ballCount = UsePlayerTurns ? team.NumberOfBallz : 1; var ballNames = TeamNames.GetBallNames(team.Country, ballCount); for (var i = 0; i < ballCount; ++i) { var playerBall = new Ball { Name = ballNames[i], Position = spawnPoints[currBallCreating], Velocity = new Vector2(0, 0), IsAiming = true, Player = player, HoldingWeapon = "Bazooka", IsStatic = false }; player.OwnedBalls.Add(playerBall); ++currBallCreating; session.World.AddEntity(playerBall); BallControl controller; if (team.ControlledByAI) controller = new AIControl(game, session, playerBall); else controller = new UserControl(game, session, playerBall); session.SessionLogic.BallControllers[playerBall] = controller; } player.ActiveBall = player.OwnedBalls.FirstOrDefault(); session.SessionLogic.ActiveControllers[player] = session.SessionLogic.BallControllers[player.ActiveBall]; } return session; }