//private Squad currentSelSquad; public void MouseSelection(GroundCombatState groundCombatState) { if (IsDeploying()) { for (int currentSquad = 0; currentSquad < groundCombatState.playerSquads.Count; currentSquad++) { Squad squad = groundCombatState.playerSquads[currentSquad]; if (squad.Faction == ChapterMaster.Sector.CurrentFaction) { for (int currentTroop = 0; currentTroop < squad.Troops.Count; currentTroop++) { Troop troop = squad.Troops[currentTroop]; if (Keyboard.GetState().IsKeyDown(Keys.LeftShift)) { if (draggingSquad) { draggingSquad = false; } if (Mouse.GetState().RightButton == ButtonState.Pressed) // start drag { if (!assigningOrder && currentlySelectedTroop == null && currentlySelectedSquad == null && troop.MouseOver(this, squad)) { mouseOffset = Mouse.GetState().Position.ToVector2() - troop.Position; troop.Grabbed = true; currentlySelectedTroop = troop; currentlySelectedSquad = squad; startDragPositionTroop = currentlySelectedTroop.Position; Debug.WriteLine("start drag position: " + startDragPositionTroop.ToString()); draggingTroop = true; } } if (troop.Grabbed && currentlySelectedTroop == troop && currentlySelectedSquad == squad) { if (draggingTroop) { Debug.WriteLine( $"Currently moving troop i {currentTroop} to ${Mouse.GetState().Position.X}"); // Check for collisions //Vector2 prevPosition = currentlySelectedTroop.Position; currentlySelectedTroop.Position = Mouse.GetState().Position.ToVector2() - mouseOffset; // maybe check for collision here and find last valid position? if (Mouse.GetState().RightButton == ButtonState.Released) // release drag { foreach (Squad other in groundCombatState.playerSquads) // TODO: implement for rest of squads { Debug.WriteLine("over squad" + other.Troops.Count); if (currentlySelectedSquad != null && currentlySelectedTroop != null) { if (currentlySelectedTroop.IsCollidingWithAny(this, currentlySelectedSquad, other)) { Debug.WriteLine("collision squad: " + squad.Troops.Count + "with other squad: " + other.Troops.Count); currentlySelectedTroop.Position = startDragPositionTroop; } else { Debug.WriteLine("no collision"); } } else { Debug.WriteLine("this should not happen"); } } troop.Grabbed = false; Debug.WriteLine("drag released"); currentlySelectedTroop = null; currentlySelectedSquad = null; draggingTroop = false; } } } } else { //assigningOrder = false; // todo: what is this again? if (draggingTroop) { if (Mouse.GetState().RightButton == ButtonState.Released) // does this actually work as intended? { foreach (Squad other in groundCombatState.playerSquads) // TODO: implement for rest of squads { Debug.WriteLine("over squad" + other.Troops.Count); if (currentlySelectedSquad != null && currentlySelectedTroop != null) { if (currentlySelectedTroop.IsCollidingWithAny(this, currentlySelectedSquad, other)) { Debug.WriteLine("collision squad: " + squad.Troops.Count + "with other squad: " + other.Troops.Count); currentlySelectedTroop.Position = startDragPositionTroop; } else { Debug.WriteLine("no collision"); } } else { Debug.WriteLine("this should not happen"); } } Debug.WriteLine("drag released"); if (!draggingSquad) { troop.Grabbed = false; currentlySelectedTroop = null; currentlySelectedSquad = null; } draggingTroop = false; } } if (Mouse.GetState().LeftButton == ButtonState.Pressed) { } if (!draggingSquad && !draggingTroop && !assigningOrder) // TODO: fix this. { currentlySelectedTroop = null; currentlySelectedSquad = null; } } // assign order to squad /*if (Mouse.GetState().LeftButton == ButtonState.Pressed) // start order * { * if (currentlySelectedTroop == null && troop.MouseOver(this, squad)) * { * mouseOffset = Mouse.GetState().Position.ToVector2() - troop.Position; * troop.Grabbed = true; * currentlySelectedTroop = troop; * currentlySelectedSquad = squad; * draggingTroop = false; * orderStart = squad.Position + troop.Position + * new Vector2(troop.Size.X, troop.Size.Y / 2); * assigningOrder = true; * } * } * if(!draggingTroop) * { * orderEnd = Mouse.GetState().Position.ToVector2(); * currentlySelectedTroop.Rotation = GetOrderRotation(); * Debug.WriteLine(orderEnd.ToString()); * if (Mouse.GetState().LeftButton == ButtonState.Released) // release order * { * troop.Grabbed = false; * currentlySelectedTroop = null; * assigningOrder = false; * } * }*/ } } } // select squads if (Mouse.GetState().LeftButton == ButtonState.Pressed) { for (int currentSquad = 0; currentSquad < groundCombatState.playerSquads.Count; currentSquad++) { Squad squad = groundCombatState.playerSquads[currentSquad]; Troop troop = squad.GetTroopUnderMouse(this); if (troop != null) { //Debug.WriteLine("started left click"); if (previousLMBState == ButtonState.Released) // pressed released with mouse over { // select squad if (!selectedSquads.Contains(squad)) { Debug.WriteLine("added squad" + currentSquad); selectedSquads.Add(squad); squad.Selected = true; // initiate dragging squad if (!draggingSquad) { //troopOffset = GetMouse().Position.ToVector2() - selectedSquads[0].Position; squad.troopOffset = GetMouse().Position.ToVector2() - squad.Position; squad.startDragPosition = squad.Position; // todo: implement draggingSquad = true; } } else { if (!draggingSquad) { Debug.WriteLine("removed squad" + currentSquad); squad.Selected = false; selectedSquads.Remove(squad); } } } } } if (!Keyboard.GetState().IsKeyDown(Keys.LeftControl)) { if (previousLMBState == ButtonState.Pressed) // pressed pressed { // move squad if (draggingSquad && selectedSquads.Count > 0) { bool wasOverOtherTroop = false; foreach (Squad s in selectedSquads) { foreach (Squad otherSquad in selectedSquads) { if (!selectedSquads.Contains(otherSquad)) { if (otherSquad.GetTroopUnderMouse(this) != null) { wasOverOtherTroop = true; } } } if (!wasOverOtherTroop && s.GetTroopUnderMouse(this) != null) { s.Position = Mouse.GetState().Position.ToVector2() - s.troopOffset; } } //Debug.WriteLine($"Currently moving squad i {0} to ${Mouse.GetState().Position.X}"); //troop.Grabbed = true; } } else if (previousLMBState == ButtonState.Released && !draggingSquad) // pressed released { for (int squadToDeselect = 0; squadToDeselect < selectedSquads.Count; squadToDeselect++) { selectedSquads[squadToDeselect].Selected = false; selectedSquads.RemoveAt(squadToDeselect); Debug.WriteLine("deselecting all"); } } } } else if (Mouse.GetState().LeftButton == ButtonState.Released && draggingSquad && selectedSquads.Count > 0 && !Keyboard.GetState().IsKeyDown(Keys.LeftControl)) { if (previousLMBState == ButtonState.Pressed) { Debug.WriteLine("lifted move"); foreach (Squad selectedSquad in selectedSquads) { foreach (Squad other in groundCombatState.playerSquads) // TODO: Implement for rest of squads. { //Debug.WriteLine("over squad" + other.Troops.Count); foreach (Troop t in selectedSquad.Troops) { if (t.IsCollidingWithAny(this, selectedSquad, other)) { selectedSquad.Position = selectedSquad.startDragPosition; //- selectedSquad.troopOffset; } } } } draggingSquad = false; } } else if (Mouse.GetState().RightButton == ButtonState.Pressed) { if (previousRMBState == ButtonState.Released) { for (int currentSquad = 0; currentSquad < groundCombatState.playerSquads.Count; currentSquad++) { Squad squad = groundCombatState.playerSquads[currentSquad]; Troop troop = squad.GetTroopUnderMouse(this); if (troop != null) { orderStart = squad.Position + troop.Position; squadBeingOrdered = squad; assigningOrder = true; } } } else if (previousRMBState == ButtonState.Pressed) { orderEnd = GetMouse().Position.ToVector2(); } } else if (Mouse.GetState().RightButton == ButtonState.Released && squadBeingOrdered != null) { if (previousRMBState == ButtonState.Pressed) { squadBeingOrdered.OrderChain.AddOrderLast(new MoveOrder(orderStart, orderEnd)); Debug.WriteLine("endx: " + ((MoveOrder)squadBeingOrdered.OrderChain.GetCurrentOrder()).End.X); assigningOrder = false; squadBeingOrdered = null; } } previousLMBState = GetMouse().LeftButton; previousRMBState = GetMouse().RightButton; } }
public CombatViewController(GroundCombatState state) { this.state = state; }