public void DrawGalaxy()
{
Empire currentEmpire = _gameMain.EmpireManager.CurrentEmpire;
StarSystem selectedSystem = currentEmpire.SelectedSystem;
FleetGroup selectedFleetGroup = currentEmpire.SelectedFleetGroup;
List<StarSystem> systems = _gameMain.Galaxy.GetAllStars();
bool displayName = _camera.ZoomDistance > 0.8f;
if (_showingFuelRange)
{
// TODO: Optimize this by going through an empire's owned systems, instead of all stars
float scale = (currentEmpire.TechnologyManager.FuelRange / 3.0f) * _camera.ZoomDistance;
float extendedScale = ((currentEmpire.TechnologyManager.FuelRange + 3) / 3.0f) * _camera.ZoomDistance;
_backBuffer.Clear(Color.Black);
_oldTarget = GorgonLibrary.Gorgon.CurrentRenderTarget;
GorgonLibrary.Gorgon.CurrentRenderTarget = _backBuffer;
List<StarSystem> ownedSystems = new List<StarSystem>();
foreach (StarSystem system in systems)
{
if (system.Planets[0].Owner == currentEmpire)
{
_fuelCircle.Draw((system.X - _camera.CameraX) * _camera.ZoomDistance, (system.Y - _camera.CameraY) * _camera.ZoomDistance, extendedScale, extendedScale, Color.LimeGreen);
ownedSystems.Add(system);
}
}
GorgonLibrary.Gorgon.CurrentRenderTarget = _oldTarget;
_backBuffer.Blit(0, 0, _gameMain.ScreenWidth, _gameMain.ScreenHeight, Color.FromArgb(75, Color.White), BlitterSizeMode.Crop);
_backBuffer.Clear(Color.Black);
GorgonLibrary.Gorgon.CurrentRenderTarget = _backBuffer;
foreach (StarSystem system in ownedSystems)
{
_fuelCircle.Draw((system.X - _camera.CameraX) * _camera.ZoomDistance, (system.Y - _camera.CameraY) * _camera.ZoomDistance, scale, scale, Color.LimeGreen);
}
GorgonLibrary.Gorgon.CurrentRenderTarget = _oldTarget;
_backBuffer.Blit(0, 0, _gameMain.ScreenWidth, _gameMain.ScreenHeight, Color.FromArgb(75, Color.White), BlitterSizeMode.Crop);
}
else if (_showingRadarRange)
{
// TODO: Optimize this by going through an empire's owned systems, instead of all stars
float planetScale = (currentEmpire.TechnologyManager.PlanetRadarRange / 3.0f) * _camera.ZoomDistance;
float fleetScale = (currentEmpire.TechnologyManager.FleetRadarRange / 3.0f) * _camera.ZoomDistance;
_backBuffer.Clear(Color.Black);
_oldTarget = GorgonLibrary.Gorgon.CurrentRenderTarget;
GorgonLibrary.Gorgon.CurrentRenderTarget = _backBuffer;
foreach (StarSystem system in systems)
{
if (system.Planets[0].Owner == currentEmpire)
{
_fuelCircle.Draw((system.X - _camera.CameraX) * _camera.ZoomDistance, (system.Y - _camera.CameraY) * _camera.ZoomDistance, planetScale, planetScale, Color.Tomato);
}
}
if (currentEmpire.TechnologyManager.FleetRadarRange > 0)
{
foreach (var fleet in currentEmpire.FleetManager.GetFleets())
{
_fuelCircle.Draw((fleet.GalaxyX - _camera.CameraX) * _camera.ZoomDistance, (fleet.GalaxyY - _camera.CameraY) * _camera.ZoomDistance, fleetScale, fleetScale, Color.Tomato);
}
}
GorgonLibrary.Gorgon.CurrentRenderTarget = _oldTarget;
_backBuffer.Blit(0, 0, _gameMain.ScreenWidth, _gameMain.ScreenHeight, Color.FromArgb(75, Color.White), BlitterSizeMode.Crop);
}
if (selectedSystem != null)
{
if (selectedSystem.Planets[0].TransferSystem.Key.StarSystem != selectedSystem)
{
_pathSprite.Draw((selectedSystem.X - _camera.CameraX) * _camera.ZoomDistance, (selectedSystem.Y - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance * (selectedSystem.Planets[0].TransferSystem.Key.Length / _pathSprite.Width), _camera.ZoomDistance, Color.Green, selectedSystem.Planets[0].TransferSystem.Key.Angle);
}
if (selectedSystem.Planets[0].RelocateToSystem != null)
{
_pathSprite.Draw((selectedSystem.X - _camera.CameraX) * _camera.ZoomDistance, (selectedSystem.Y - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance * (selectedSystem.Planets[0].RelocateToSystem.Length / _pathSprite.Width), _camera.ZoomDistance, Color.Blue, selectedSystem.Planets[0].RelocateToSystem.Angle);
}
if (_systemView.IsTransferring && _systemView.TransferSystem != null)
{
_pathSprite.Draw((selectedSystem.X - _camera.CameraX) * _camera.ZoomDistance, (selectedSystem.Y - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance * (_systemView.TransferSystem.Length / _pathSprite.Width), _camera.ZoomDistance, _systemView.TransferSystem.IsValid ? Color.LightGreen : Color.Red, _systemView.TransferSystem.Angle);
}
if (_systemView.IsRelocating && _systemView.RelocateSystem != null)
{
_pathSprite.Draw((selectedSystem.X - _camera.CameraX) * _camera.ZoomDistance, (selectedSystem.Y - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance * (_systemView.RelocateSystem.Length / _pathSprite.Width), _camera.ZoomDistance, _systemView.RelocateSystem.IsValid ? Color.LightSkyBlue : Color.Red, _systemView.RelocateSystem.Angle);
}
}
foreach (StarSystem system in systems)
{
GorgonLibrary.Gorgon.CurrentShader = _gameMain.StarShader;
if (_showingOwners)
{
var darkGray = new [] {0.25f, 0.25f, 0.25f, 1};
if (system.IsThisSystemExploredByEmpire(currentEmpire))
{
_gameMain.StarShader.Parameters["StarColor"].SetValue(system.Planets[0].Owner == null
? darkGray
: system.Planets[0].Owner.ConvertedColor);
}
else
{
_gameMain.StarShader.Parameters["StarColor"].SetValue(darkGray);
}
}
else
{
_gameMain.StarShader.Parameters["StarColor"].SetValue(system.StarColor);
}
system.Sprite.Draw((int)((system.X - _camera.CameraX) * _camera.ZoomDistance), (int)((system.Y - _camera.CameraY) * _camera.ZoomDistance), _camera.ZoomDistance, _camera.ZoomDistance);
GorgonLibrary.Gorgon.CurrentShader = null;
if (system == currentEmpire.SelectedSystem)
{
_selectionSprites[0].Draw(((system.X - 16) - _camera.CameraX) * _camera.ZoomDistance, ((system.Y - 16) - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance, _camera.ZoomDistance, Color.Green);
_selectionSprites[1].Draw(((system.X) - _camera.CameraX) * _camera.ZoomDistance, ((system.Y - 16) - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance, _camera.ZoomDistance, Color.Green);
_selectionSprites[2].Draw(((system.X - 16) - _camera.CameraX) * _camera.ZoomDistance, ((system.Y) - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance, _camera.ZoomDistance, Color.Green);
_selectionSprites[3].Draw(((system.X) - _camera.CameraX) * _camera.ZoomDistance, ((system.Y) - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance, _camera.ZoomDistance, Color.Green);
}
if (displayName && (_gameMain.EmpireManager.CurrentEmpire.ContactManager.IsContacted(system.DominantEmpire) || system.IsThisSystemExploredByEmpire(_gameMain.EmpireManager.CurrentEmpire)))
{
float x = (system.X - _camera.CameraX) * _camera.ZoomDistance;
x -= (system.StarName.GetWidth() / 2);
float y = ((system.Y + (system.Size * 16)) - _camera.CameraY) * _camera.ZoomDistance;
system.StarName.MoveTo((int)x, (int)y);
if (system.DominantEmpire != null)
{
// TODO: Optimize this by moving the text sprite and color shader to StarSystem, where it's updated when ownership changes
float percentage = 1.0f;
_oldTarget = GorgonLibrary.Gorgon.CurrentRenderTarget;
_starName.Width = (int)system.StarName.GetWidth();
_starName.Height = (int)system.StarName.GetHeight();
GorgonLibrary.Gorgon.CurrentRenderTarget = _starName;
system.StarName.MoveTo(0, 0);
system.StarName.Draw();
GorgonLibrary.Gorgon.CurrentRenderTarget = _oldTarget;
//GorgonLibrary.Gorgon.CurrentShader = _gameMain.NameShader;
foreach (Empire empire in system.EmpiresWithPlanetsInThisSystem)
{
/*_gameMain.NameShader.Parameters["EmpireColor"].SetValue(empire.ConvertedColor);
_gameMain.NameShader.Parameters["startPos"].SetValue(percentage);
_gameMain.NameShader.Parameters["endPos"].SetValue(percentage + system.OwnerPercentage[empire]);*/
_starName.Blit(x, y, _starName.Width * percentage, _starName.Height, empire.EmpireColor, GorgonLibrary.Graphics.BlitterSizeMode.Crop);
percentage -= system.OwnerPercentage[empire];
}
//GorgonLibrary.Gorgon.CurrentShader = null;
}
else
{
system.StarName.Draw();
}
}
}
if (selectedFleetGroup != null && selectedFleetGroup.SelectedFleet.TravelNodes != null)
{
if (selectedFleetGroup.SelectedFleet.Empire == currentEmpire)
{
for (int i = 0; i < selectedFleetGroup.SelectedFleet.TravelNodes.Count; i++)
{
if (i == 0)
{
var travelNode = selectedFleetGroup.FleetToSplit.TravelNodes[0];
if (selectedFleetGroup.SelectedFleet.AdjacentSystem != null)
{
//Haven't left yet, so calculate custom path from left side of star
float x = travelNode.StarSystem.X - (selectedFleetGroup.FleetToSplit.GalaxyX - 32);
float y = travelNode.StarSystem.Y - selectedFleetGroup.FleetToSplit.GalaxyY;
float length = (float)Math.Sqrt((x * x) + (y * y));
float angle = (float)(Math.Atan2(y, x) * (180 / Math.PI));
_pathSprite.Draw((selectedFleetGroup.SelectedFleet.GalaxyX - _camera.CameraX - 32) * _camera.ZoomDistance, (selectedFleetGroup.SelectedFleet.GalaxyY - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance * (length / _pathSprite.Width), _camera.ZoomDistance, Color.Green, angle);
}
else
{
_pathSprite.Draw((selectedFleetGroup.SelectedFleet.GalaxyX - _camera.CameraX) * _camera.ZoomDistance, (selectedFleetGroup.SelectedFleet.GalaxyY - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance * (travelNode.Length / _pathSprite.Width), _camera.ZoomDistance, Color.Green, travelNode.Angle);
}
if (selectedFleetGroup.SelectedFleet.TravelNodes.Count == 1)
{
//Only one node, so draw ETA at this star
DrawETA(travelNode, false);
}
}
else
{
_pathSprite.Draw((selectedFleetGroup.SelectedFleet.TravelNodes[i - 1].StarSystem.X - _camera.CameraX) * _camera.ZoomDistance, (selectedFleetGroup.SelectedFleet.TravelNodes[i - 1].StarSystem.Y - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance * (selectedFleetGroup.SelectedFleet.TravelNodes[i].Length / _pathSprite.Width), _camera.ZoomDistance, Color.Green, selectedFleetGroup.SelectedFleet.TravelNodes[i].Angle);
if (i == selectedFleetGroup.SelectedFleet.TravelNodes.Count - 1)
{
//Last node, so draw ETA here
DrawETA(selectedFleetGroup.FleetToSplit.TravelNodes[i], false);
}
}
}
}
else if (currentEmpire.TechnologyManager.ShowEnemyETA && selectedFleetGroup.SelectedFleet.TravelNodes.Count > 0)
{
_pathSprite.Draw((selectedFleetGroup.SelectedFleet.GalaxyX - _camera.CameraX) * _camera.ZoomDistance, (selectedFleetGroup.SelectedFleet.GalaxyY - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance * (selectedFleetGroup.SelectedFleet.TravelNodes[0].Length / _pathSprite.Width), _camera.ZoomDistance, Color.Red, selectedFleetGroup.SelectedFleet.TravelNodes[0].Angle);
//Player do not know if there's other stops, so draw ETA for first one
DrawETA(selectedFleetGroup.FleetToSplit.TravelNodes[0], false);
}
}
if (selectedFleetGroup != null && selectedFleetGroup.FleetToSplit.TentativeNodes != null)
{
for (int i = 0; i < selectedFleetGroup.FleetToSplit.TentativeNodes.Count; i++)
{
if (i == 0)
{
var travelNode = selectedFleetGroup.FleetToSplit.TentativeNodes[0];
if (selectedFleetGroup.FleetToSplit.AdjacentSystem != null && selectedFleetGroup.FleetToSplit.TravelNodes != null)
{
//Haven't left yet, so calculate custom path from left side of star
float x = travelNode.StarSystem.X - (selectedFleetGroup.FleetToSplit.GalaxyX - 32);
float y = travelNode.StarSystem.Y - selectedFleetGroup.FleetToSplit.GalaxyY;
float length = (float)Math.Sqrt((x * x) + (y * y));
float angle = (float)(Math.Atan2(y, x) * (180 / Math.PI));
_pathSprite.Draw((selectedFleetGroup.FleetToSplit.GalaxyX - _camera.CameraX - 32) * _camera.ZoomDistance, (selectedFleetGroup.FleetToSplit.GalaxyY - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance * (length / _pathSprite.Width), _camera.ZoomDistance, travelNode.IsValid ? Color.LightGreen : Color.Red, angle);
}
else if (selectedFleetGroup.FleetToSplit.AdjacentSystem != null)
{
//Haven't left, and not on enroute already, so calculate path from right side of star
float x = travelNode.StarSystem.X - (selectedFleetGroup.FleetToSplit.GalaxyX + 32);
float y = travelNode.StarSystem.Y - selectedFleetGroup.FleetToSplit.GalaxyY;
float length = (float)Math.Sqrt((x * x) + (y * y));
float angle = (float)(Math.Atan2(y, x) * (180 / Math.PI));
_pathSprite.Draw((selectedFleetGroup.FleetToSplit.GalaxyX - _camera.CameraX + 32) * _camera.ZoomDistance, (selectedFleetGroup.FleetToSplit.GalaxyY - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance * (length / _pathSprite.Width), _camera.ZoomDistance, travelNode.IsValid ? Color.LightGreen : Color.Red, angle);
}
else
{
_pathSprite.Draw((selectedFleetGroup.FleetToSplit.GalaxyX - _camera.CameraX) * _camera.ZoomDistance, (selectedFleetGroup.FleetToSplit.GalaxyY - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance * (selectedFleetGroup.FleetToSplit.TentativeNodes[0].Length / _pathSprite.Width), _camera.ZoomDistance, Color.LightGreen, selectedFleetGroup.FleetToSplit.TentativeNodes[0].Angle);
}
if (selectedFleetGroup.FleetToSplit.TentativeNodes.Count == 1)
{
//Only one node, so draw ETA at this star
DrawETA(travelNode, true);
}
}
else
{
_pathSprite.Draw((selectedFleetGroup.FleetToSplit.TentativeNodes[i - 1].StarSystem.X - _camera.CameraX) * _camera.ZoomDistance, (selectedFleetGroup.FleetToSplit.TentativeNodes[i - 1].StarSystem.Y - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance * (selectedFleetGroup.FleetToSplit.TentativeNodes[i].Length / _pathSprite.Width), _camera.ZoomDistance, selectedFleetGroup.FleetToSplit.TentativeNodes[i].IsValid ? Color.LightGreen : Color.Red, selectedFleetGroup.FleetToSplit.TentativeNodes[i].Angle);
if (i == selectedFleetGroup.FleetToSplit.TentativeNodes.Count - 1)
{
//Last node, so draw ETA here
DrawETA(selectedFleetGroup.FleetToSplit.TentativeNodes[i], true);
}
}
}
}
foreach (Fleet fleet in _gameMain.EmpireManager.GetFleetsWithinArea(_camera.CameraX, _camera.CameraY, _gameMain.ScreenWidth / _camera.ZoomDistance, _gameMain.ScreenHeight / _camera.ZoomDistance))
{
BBSprite fleetIcon = fleet.Ships.Count > 0 ? fleet.Empire.EmpireRace.FleetIcon : fleet.Empire.EmpireRace.TransportIcon;
if (fleet.AdjacentSystem != null)
{
if (fleet.TravelNodes != null && fleet.TravelNodes.Count > 0)
{
//Adjacent to a system, but is heading to another system
if (selectedFleetGroup != null && selectedFleetGroup.Fleets.Contains(fleet))
{
_selectionSprites[0].Draw(((fleet.GalaxyX - 48) - _camera.CameraX) * _camera.ZoomDistance, ((fleet.GalaxyY - 16) - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance, _camera.ZoomDistance, Color.Green);
_selectionSprites[1].Draw(((fleet.GalaxyX - 32) - _camera.CameraX) * _camera.ZoomDistance, ((fleet.GalaxyY - 16) - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance, _camera.ZoomDistance, Color.Green);
_selectionSprites[2].Draw(((fleet.GalaxyX - 48) - _camera.CameraX) * _camera.ZoomDistance, ((fleet.GalaxyY) - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance, _camera.ZoomDistance, Color.Green);
_selectionSprites[3].Draw(((fleet.GalaxyX - 32) - _camera.CameraX) * _camera.ZoomDistance, ((fleet.GalaxyY) - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance, _camera.ZoomDistance, Color.Green);
}
fleetIcon.Draw((int)(((fleet.GalaxyX - 32) - _camera.CameraX) * _camera.ZoomDistance), (int)((fleet.GalaxyY - _camera.CameraY) * _camera.ZoomDistance), _camera.ZoomDistance, _camera.ZoomDistance, fleet.Empire.EmpireColor);
}
else
{
//Adjacent to a system, just chilling
if (selectedFleetGroup != null && selectedFleetGroup.Fleets.Contains(fleet))
{
_selectionSprites[0].Draw(((fleet.GalaxyX + 16) - _camera.CameraX) * _camera.ZoomDistance, ((fleet.GalaxyY - 16) - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance, _camera.ZoomDistance, Color.Green);
_selectionSprites[1].Draw(((fleet.GalaxyX + 32) - _camera.CameraX) * _camera.ZoomDistance, ((fleet.GalaxyY - 16) - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance, _camera.ZoomDistance, Color.Green);
_selectionSprites[2].Draw(((fleet.GalaxyX + 16) - _camera.CameraX) * _camera.ZoomDistance, ((fleet.GalaxyY) - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance, _camera.ZoomDistance, Color.Green);
_selectionSprites[3].Draw(((fleet.GalaxyX + 32) - _camera.CameraX) * _camera.ZoomDistance, ((fleet.GalaxyY) - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance, _camera.ZoomDistance, Color.Green);
}
fleetIcon.Draw((int)(((fleet.GalaxyX + 32) - _camera.CameraX) * _camera.ZoomDistance), (int)((fleet.GalaxyY - _camera.CameraY) * _camera.ZoomDistance), _camera.ZoomDistance, _camera.ZoomDistance, fleet.Empire.EmpireColor);
}
}
else
{
//Fleet is enroute, no moving of icon needed
if (selectedFleetGroup != null && selectedFleetGroup.Fleets.Contains(fleet))
{
_selectionSprites[0].Draw(((fleet.GalaxyX - 16) - _camera.CameraX) * _camera.ZoomDistance, ((fleet.GalaxyY - 16) - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance, _camera.ZoomDistance, Color.Green);
_selectionSprites[1].Draw(((fleet.GalaxyX) - _camera.CameraX) * _camera.ZoomDistance, ((fleet.GalaxyY - 16) - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance, _camera.ZoomDistance, Color.Green);
_selectionSprites[2].Draw(((fleet.GalaxyX - 16) - _camera.CameraX) * _camera.ZoomDistance, ((fleet.GalaxyY) - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance, _camera.ZoomDistance, Color.Green);
_selectionSprites[3].Draw(((fleet.GalaxyX) - _camera.CameraX) * _camera.ZoomDistance, ((fleet.GalaxyY) - _camera.CameraY) * _camera.ZoomDistance, _camera.ZoomDistance, _camera.ZoomDistance, Color.Green);
}
fleetIcon.Draw((int)((fleet.GalaxyX - _camera.CameraX) * _camera.ZoomDistance), (int)((fleet.GalaxyY - _camera.CameraY) * _camera.ZoomDistance), _camera.ZoomDistance, _camera.ZoomDistance, fleet.Empire.EmpireColor);
}
}
}