PageRenderTime 55ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 1ms

/other/PlanetWars/PlanetWars/MapIcons/TransitIcon.xaml.cs

http://zero-k.googlecode.com/
C# | 213 lines | 196 code | 14 blank | 3 comment | 29 complexity | 047792b812311202b85b88001b571db9 MD5 | raw file
Possible License(s): GPL-2.0, MIT, BSD-3-Clause, GPL-3.0, LGPL-2.1
  1. using System;
  2. using System.Linq;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. using System.Windows.Ink;
  6. using System.Windows.Input;
  7. using System.Windows.Media;
  8. using PlanetWars.ServiceReference;
  9. using PlanetWars.Tabs;
  10. namespace PlanetWars.MapIcons
  11. {
  12. public partial class TransitIcon: UserControl, IUpdatable
  13. {
  14. const double lineThickness = 1;
  15. const double orderClickProximity = 25;
  16. PlanetIcon cursorPlanet;
  17. Point? cursorPosition;
  18. MapTab mapTab;
  19. double previousZoom;
  20. Transit transit;
  21. public TransitIcon(Transit transit, MapTab mapTab)
  22. {
  23. this.transit = transit;
  24. this.mapTab = mapTab;
  25. InitializeComponent();
  26. Arrow.Width = 20; //todo: optimization: make the path already have the right size
  27. Arrow.Height = 20;
  28. Canvas.SetZIndex(this, 1000);
  29. Canvas.SetZIndex(PlottedRouteLine, -2);
  30. Canvas.SetZIndex(PlaceOrderLine, -1);
  31. DataContext = transit;
  32. }
  33. public void Update()
  34. {
  35. if (mapTab.StarMap == null) throw new Exception("MapTab.Starmap is null");
  36. if (DestinationBox.ItemsSource == null) DestinationBox.ItemsSource = mapTab.StarMap.CelestialObjects;
  37. if (String.IsNullOrEmpty(OwnerNameBlock.Text)) OwnerNameBlock.Text = mapTab.StarMap.Players.Single(p => p.PlayerID == transit.Fleets.OwnerID).Name; // todo: optimization: dont use linear search
  38. var zoom = mapTab.ZoomControl.Zoom;
  39. if (previousZoom != zoom)
  40. {
  41. previousZoom = zoom;
  42. ScaleTransform.ScaleX = 1/zoom;
  43. ScaleTransform.ScaleY = 1/zoom;
  44. var opacityMult = 8.0;
  45. InformationPanel.Opacity = 1 - 1/zoom*opacityMult/1000;
  46. }
  47. var turns = mapTab.StarMap.GetGameTurn(mapTab.TimeSlider.Value);
  48. Point position;
  49. Point? destination = null;
  50. if (transit.OrbitsObjectID.HasValue)
  51. {
  52. // fleet is in orbit
  53. var mapIcon = mapTab.MapIcons[transit.OrbitsObjectID.Value];
  54. var theta = mapIcon.Body.OrbitInitialAngle + mapIcon.Body.OrbitSpeed*turns*2*Math.PI; // current orbit angle
  55. ArrowRotate.Angle = theta/2/Math.PI*360.0 + 90.0; // set direction to orbit tangent
  56. position = new Point(mapIcon.X, mapIcon.Y);
  57. PlottedRouteLine.Visibility = Visibility.Collapsed;
  58. }
  59. else
  60. {
  61. if (turns >= transit.EndBattleTurn)
  62. position = new Point(transit.ToX*MapTab.MapScale, transit.ToY*MapTab.MapScale);
  63. // todo this is incorrect, its in orbit of destination object
  64. else if (turns <= transit.StartBattleTurn) // todo this is incorrect, its in orbit of from object if not null
  65. {
  66. // fleet is at departure
  67. position = new Point(transit.FromX*MapTab.MapScale, transit.FromY*MapTab.MapScale);
  68. destination = new Point(transit.ToX*MapTab.MapScale, transit.ToY*MapTab.MapScale);
  69. }
  70. else
  71. {
  72. var progress = (turns - transit.StartBattleTurn)/(transit.EndBattleTurn - transit.StartBattleTurn);
  73. position = new Point((transit.ToX - transit.FromX)*progress + transit.FromX,
  74. (transit.ToY - transit.FromY)*progress + transit.FromY);
  75. position = new Point(position.X*MapTab.MapScale, position.Y*MapTab.MapScale); // convert to map coordinates
  76. destination = new Point(transit.ToX*MapTab.MapScale, transit.ToY*MapTab.MapScale);
  77. }
  78. ArrowRotate.Angle = Math.Atan2(transit.ToY - transit.FromY, transit.ToX - transit.FromX)/Math.PI/2*360.0;
  79. }
  80. if (destination.HasValue) // display line to destination
  81. {
  82. var dest = destination.Value;
  83. var left = Math.Min(position.X, dest.X);
  84. var right = Math.Max(position.X, dest.X);
  85. var top = Math.Min(position.Y, dest.Y);
  86. var bottom = Math.Max(position.Y, dest.Y);
  87. if (mapTab.ZoomControl.IsVisible(left, right, top, bottom))
  88. {
  89. PlottedRouteLine.Visibility = Visibility.Visible;
  90. Canvas.SetLeft(PlottedRouteLine, left);
  91. Canvas.SetTop(PlottedRouteLine, top);
  92. PlottedRouteLine.X1 = position.X - left;
  93. PlottedRouteLine.Y1 = position.Y - top;
  94. PlottedRouteLine.X2 = dest.X - left;
  95. PlottedRouteLine.Y2 = dest.Y - top;
  96. PlottedRouteLine.StrokeThickness = lineThickness/zoom;
  97. }
  98. else PlottedRouteLine.Visibility = Visibility.Collapsed;
  99. }
  100. if (!mapTab.ZoomControl.IsVisible(position.X, position.Y)) IconGrid.Visibility = Visibility.Collapsed;
  101. else
  102. {
  103. IconGrid.Visibility = Visibility.Visible;
  104. Canvas.SetLeft(IconGrid, position.X - Arrow.ActualWidth/2);
  105. Canvas.SetTop(IconGrid, position.Y - Arrow.ActualHeight/2);
  106. }
  107. if (cursorPlanet != null) // cursor is in order mode and is pointing at a planet
  108. {
  109. var left = Math.Min(position.X, cursorPlanet.X);
  110. var right = Math.Max(position.X, cursorPlanet.X);
  111. var top = Math.Min(position.Y, cursorPlanet.Y);
  112. var bottom = Math.Max(position.Y, cursorPlanet.Y);
  113. if (mapTab.ZoomControl.IsVisible(left, right, top, bottom))
  114. {
  115. PlaceOrderLine.Visibility = Visibility.Visible;
  116. Canvas.SetLeft(PlaceOrderLine, left);
  117. Canvas.SetTop(PlaceOrderLine, top);
  118. PlaceOrderLine.X1 = position.X - left;
  119. PlaceOrderLine.Y1 = position.Y - top;
  120. PlaceOrderLine.X2 = cursorPlanet.X - left;
  121. PlaceOrderLine.Y2 = cursorPlanet.Y - top;
  122. PlaceOrderLine.StrokeThickness = lineThickness/mapTab.ZoomControl.Zoom;
  123. PlaceOrderLine.Stroke = new SolidColorBrush(Colors.Green);
  124. }
  125. else PlaceOrderLine.Visibility = Visibility.Collapsed;
  126. }
  127. else if (cursorPosition.HasValue) // cursor is in order mode and is not pointing at a planet
  128. {
  129. var cursor = cursorPosition.Value;
  130. var left = Math.Min(position.X, cursor.X);
  131. var right = Math.Max(position.X, cursor.X);
  132. var top = Math.Min(position.Y, cursor.Y);
  133. var bottom = Math.Max(position.Y, cursor.Y);
  134. if (mapTab.ZoomControl.IsVisible(left, right, top, bottom))
  135. {
  136. PlaceOrderLine.Visibility = Visibility.Visible;
  137. Canvas.SetLeft(PlaceOrderLine, left);
  138. Canvas.SetTop(PlaceOrderLine, top);
  139. PlaceOrderLine.X1 = position.X - left;
  140. PlaceOrderLine.Y1 = position.Y - top;
  141. PlaceOrderLine.X2 = cursor.X - left;
  142. PlaceOrderLine.Y2 = cursor.Y - top;
  143. PlaceOrderLine.StrokeThickness = lineThickness / mapTab.ZoomControl.Zoom;
  144. PlaceOrderLine.Stroke = new SolidColorBrush(Colors.Red);
  145. }
  146. else PlaceOrderLine.Visibility = Visibility.Collapsed;
  147. }
  148. else PlaceOrderLine.Visibility = Visibility.Collapsed; // cursor is not in order mode
  149. }
  150. void GoButton_Click(object sender, RoutedEventArgs _e)
  151. {
  152. var destination = (CelestialObject)DestinationBox.SelectedItem;
  153. if (destination == null)
  154. {
  155. MessageBox.Show("No destination selected");
  156. return;
  157. }
  158. var service = new PlanetWarsServiceClient();
  159. service.OrderFleetCompleted += (s, e) =>
  160. {
  161. transit.Fleets = e.Result;
  162. MessageBox.Show("Set sail!");
  163. };
  164. service.OrderFleetAsync(App.UserName, App.Password, transit.Fleets.FleetID, destination.CelestialObjectID, 0); // todo offset future?
  165. }
  166. void mapTab_MouseLeftButtonDown(object sender, MouseButtonEventArgs _)
  167. {
  168. mapTab.MapCanvas.MouseLeftButtonDown -= mapTab_MouseLeftButtonDown;
  169. Application.Current.RootVisual.MouseMove -= mapTab_MouseMove;
  170. cursorPosition = null;
  171. if (cursorPlanet == null) return;
  172. var destination = cursorPlanet;
  173. cursorPlanet = null;
  174. var service = new PlanetWarsServiceClient();
  175. service.OrderFleetCompleted += (s, e) =>
  176. {
  177. transit.Fleets = e.Result;
  178. MessageBox.Show(cursorPlanet.Name + " called, they want their transit back!");
  179. };
  180. service.OrderFleetAsync(App.UserName, App.Password, transit.Fleets.FleetID, destination.Body.CelestialObjectID, 0);
  181. }
  182. void mapTab_MouseMove(object sender, MouseEventArgs e)
  183. {
  184. cursorPosition = e.GetPosition(mapTab.MapCanvas);
  185. var cursor = cursorPosition.Value;
  186. var planets = from planet in mapTab.MapCanvas.Children.OfType<PlanetIcon>()
  187. let distance = Math.Sqrt(Math.Pow(cursor.X - planet.X, 2) + Math.Pow(cursor.Y - planet.Y, 2))
  188. where distance < orderClickProximity/mapTab.ZoomControl.Zoom
  189. orderby distance
  190. select planet;
  191. cursorPlanet = planets.FirstOrDefault();
  192. }
  193. void OrderButton_Click(object sender, RoutedEventArgs e)
  194. {
  195. mapTab.MapCanvas.MouseLeftButtonDown += mapTab_MouseLeftButtonDown;
  196. Application.Current.RootVisual.MouseMove += mapTab_MouseMove;
  197. }
  198. }
  199. }