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);
        }
示例#5
0
        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);
                }
            }
        }