public bool TryActivateSquad(PawnSquad squad) { var members = squad?.ValidMembers.ToArray(); if (members != null && members.Length > 0) { var isFirstActivationInSequence = CheckForFirstActivation(squad); var potentialInterestPoints = EnumerateInterestPoints(members, lastStartingMapCameraPosition).ToList(); SortInterestPointsByStartingMap(potentialInterestPoints, lastStartingMapIndex); // if all squad members have been despawned, and not found in any caravan, report squad as unassigned if (potentialInterestPoints.Count > 0) { // loop back to fist target after reaching the end var currentInterestPoint = potentialInterestPoints[interestPointIndex % potentialInterestPoints.Count]; var shouldJumpToInterestPoint = currentInterestPoint.IsWorldTarget || !isFirstActivationInSequence || CurrentlyViewedMap != currentInterestPoint.Map; if (shouldJumpToInterestPoint) { CameraJumper.TryJump(currentInterestPoint); interestPointIndex++; } IEnumerable <Thing> selectableSquadMembers = members; if (!isFirstActivationInSequence) { // first activation does not jump, but always selects all members on current map selectableSquadMembers = FilterSelectableMembersByDistanceIfNeeded(selectableSquadMembers, currentInterestPoint); } TrySelectInterestPointSquadMembers(selectableSquadMembers, currentInterestPoint); return(true); } } return(false); }
internal void SetSquadMembers(int squadNumber, List <int> pawnIds) { var squad = TryFindSquad(squadNumber); if (squad == null) { squad = new PawnSquad { squadId = squadNumber }; DefensivePositionsManager.Instance.SquadData.Add(squad); } squad.pawnIds = pawnIds; Messages.Message("DefPos_msg_squadAssigned".Translate(pawnIds.Count, squadNumber), MessageTypeDefOf.TaskCompletion); }
internal void ReassignSquadMembers(int squadNumber, List <Thing> members) { var squad = TryFindSquad(squadNumber); if (squad == null) { squad = new PawnSquad { SquadId = squadNumber }; DefensivePositionsManager.Instance.SquadData.Add(squad); } squad.AssignMembers(members); Messages.Message("DefPos_msg_squadAssigned".Translate(members.Count, squadNumber), MessageTypeDefOf.TaskCompletion); }
private bool CheckForFirstActivation(PawnSquad activatedSquad) { bool isFirstActivation; if (lastActivatedSquadId != activatedSquad.SquadId || Time.unscaledTime > lastActivationTime + ActivationSequenceExpireTime) { lastActivatedSquadId = activatedSquad.SquadId; interestPointIndex = 0; lastStartingMapIndex = CurrentlyViewedMap?.Index; lastStartingMapCameraPosition = Find.CurrentMap?.rememberedCameraPos?.rootPos.ToIntVec3() ?? IntVec3.Zero; isFirstActivation = true; } else { isFirstActivation = false; } lastActivationTime = Time.unscaledTime; return(isFirstActivation); }
private void ProcessSquadCommand(int squadNumber) { var assignMode = HugsLibUtility.ControlIsHeld; var pawnSquads = DefensivePositionsManager.Instance.SquadData; var squad = pawnSquads.Find(s => s.squadId == squadNumber); if (assignMode) { // Control is held, assign pawns to squad var idList = new List <int>(); foreach (var obj in Find.Selector.SelectedObjects) { var pawn = obj as Pawn; if (pawn == null || pawn.Faction == null || !pawn.Faction.IsPlayer) { continue; } idList.Add(pawn.thingIDNumber); } if (idList.Count > 0) { // reassign squad with selected pawns Messages.Message("DefPos_msg_squadAssigned".Translate(idList.Count, squadNumber), MessageTypeDefOf.TaskCompletion); if (squad == null) { squad = new PawnSquad { squadId = squadNumber }; pawnSquads.Add(squad); } squad.pawnIds = idList; } else { // no pawns selected, clear squad Messages.Message("DefPos_msg_squadCleared".Translate(squadNumber), MessageTypeDefOf.TaskCompletion); if (squad != null) { pawnSquads.Remove(squad); } } } else { // Select pawns that belong to squad var selectionBeforeClear = Find.Selector.SelectedObjects.ToList(); if (!HugsLibUtility.ShiftIsHeld) { Find.Selector.ClearSelection(); } List <Pawn> matchingPawnsOnMaps = null; Caravan matchingCaravan = null; if (squad != null && squad.pawnIds.Count > 0) { matchingPawnsOnMaps = GetLivePawnsOnAllMapsById(squad.pawnIds); if (matchingPawnsOnMaps.Count == 0) { matchingCaravan = TryGetFirstCaravanWithPawnsById(squad.pawnIds); } } if (matchingPawnsOnMaps != null && matchingPawnsOnMaps.Count > 0) { var pawns = SelectOnlyPawnsOnSameMap(matchingPawnsOnMaps); // focus view on squad if repeat squad key press OR if not currently viewing the map if (Find.VisibleMap != pawns[0].Map || InWorldView() || PawnsAlreadyMatchSelection(pawns, selectionBeforeClear)) { TryEscapeWorldView(); TryFocusPawnGroupCenter(pawns); } // select pawns on map, switch map if necessary foreach (var pawn in pawns) { Find.Selector.Select(pawn); } } else if (matchingCaravan != null) { // select caravan with pawns CameraJumper.TryJumpAndSelect(matchingCaravan); } else { Messages.Message("DefPos_msg_squadEmpty".Translate(squadNumber), MessageTypeDefOf.RejectInput); } } }