public static bool HasEmptyLocker(int cell, int minion)
    {
        if (!HasSuitMarker[cell])
        {
            return(false);
        }
        SuitMarker    suitMarker = suitMarkers[cell];
        HashSet <int> emptyLockerReservations = suitMarker.emptyLockerReservations;

        return(emptyLockerReservations.Count < suitMarker.emptyLockerCount || emptyLockerReservations.Contains(minion));
    }
    public static bool HasSuit(int cell, int minion)
    {
        if (!HasSuitMarker[cell])
        {
            return(false);
        }
        SuitMarker    suitMarker       = suitMarkers[cell];
        HashSet <int> suitReservations = suitMarker.suitReservations;

        return(suitReservations.Count < suitMarker.suitCount || suitReservations.Contains(minion));
    }
    public static void UpdateSuitMarker(int cell, int fullLockerCount, int emptyLockerCount, SuitMarker.Flags flags, PathFinder.PotentialPath.Flags pathFlags)
    {
        DebugUtil.Assert(HasSuitMarker[cell]);
        SuitMarker value = suitMarkers[cell];

        value.suitCount   = fullLockerCount;
        value.lockerCount = fullLockerCount + emptyLockerCount;
        value.flags       = flags;
        value.pathFlags   = pathFlags;
        suitMarkers[cell] = value;
    }
 public static void RegisterSuitMarker(int cell)
 {
     DebugUtil.Assert(!HasSuitMarker[cell]);
     HasSuitMarker[cell] = true;
     suitMarkers[cell]   = new SuitMarker
     {
         suitCount               = 0,
         lockerCount             = 0,
         flags                   = SuitMarker.Flags.Operational,
         suitReservations        = new HashSet <int>(),
         emptyLockerReservations = new HashSet <int>()
     };
 }
 public static bool TryGetSuitMarkerFlags(int cell, out SuitMarker.Flags flags, out PathFinder.PotentialPath.Flags pathFlags)
 {
     if (HasSuitMarker[cell])
     {
         SuitMarker suitMarker = suitMarkers[cell];
         flags = suitMarker.flags;
         SuitMarker suitMarker2 = suitMarkers[cell];
         pathFlags = suitMarker2.pathFlags;
         return(true);
     }
     flags     = (SuitMarker.Flags) 0;
     pathFlags = PathFinder.PotentialPath.Flags.None;
     return(false);
 }
    public static bool ReserveEmptyLocker(int cell, int minion, bool reserve)
    {
        DebugUtil.Assert(HasSuitMarker[cell]);
        SuitMarker    suitMarker = suitMarkers[cell];
        HashSet <int> emptyLockerReservations = suitMarker.emptyLockerReservations;

        if (reserve)
        {
            if (emptyLockerReservations.Count == suitMarker.emptyLockerCount)
            {
                return(false);
            }
            bool test = emptyLockerReservations.Add(minion);
            DebugUtil.Assert(test);
            return(true);
        }
        return(emptyLockerReservations.Remove(minion));
    }
    public override void ConfigureBuildingTemplate(GameObject go, Tag prefab_tag)
    {
        SuitMarker suitMarker = go.AddOrGet <SuitMarker>();

        suitMarker.LockerTags = new Tag[1]
        {
            new Tag("JetSuitLocker")
        };
        suitMarker.PathFlag     = PathFinder.PotentialPath.Flags.HasJetPack;
        suitMarker.interactAnim = Assets.GetAnim("anim_interacts_changingarea_jetsuit_arrow_kanim");
        AnimTileable animTileable = go.AddOrGet <AnimTileable>();

        animTileable.tags = new Tag[2]
        {
            new Tag("JetSuitMarker"),
            new Tag("JetSuitLocker")
        };
        go.AddTag(GameTags.JetSuitBlocker);
    }
            private static void TryTransfer(Assignable assignable, SuitMarker marker, Equipment equipment)
            {
                if (ShouldTransfer(assignable, equipment))
                {
                    Storage storage    = null;
                    float   mass       = float.PositiveInfinity;
                    var     pooledList = ListPool <SuitLocker, SuitMarker> .Allocate();

                    marker?.GetAttachedLockers(pooledList);
                    foreach (var locker in pooledList)
                    {
                        var s = locker.GetComponent <Storage>();
                        var m = s.MassStored();
                        if (m < mass)
                        {
                            mass    = m;
                            storage = s;
                        }
                    }
                    pooledList.Recycle();
                    Transfer(assignable, storage);
                }
            }
Beispiel #9
0
    public override bool TraversePath(ref PathFinder.PotentialPath path, int from_cell, NavType from_nav_type, int cost, int transition_id, int underwater_cost)
    {
        if (!IsAccessPermitted(proxyID, path.cell, from_cell))
        {
            return(false);
        }
        CellOffset[] array = transitionVoidOffsets[transition_id];
        foreach (CellOffset offset in array)
        {
            int cell = Grid.OffsetCell(from_cell, offset);
            if (!IsAccessPermitted(proxyID, cell, from_cell))
            {
                return(false);
            }
        }
        if (path.navType == NavType.Tube && from_nav_type == NavType.Floor && !Grid.HasUsableTubeEntrance(from_cell, prefabInstanceID))
        {
            return(false);
        }
        if (path.navType == NavType.Hover && (out_of_fuel || !path.HasFlag(PathFinder.PotentialPath.Flags.HasJetPack)))
        {
            return(false);
        }
        Grid.SuitMarker.Flags          flags     = (Grid.SuitMarker.Flags) 0;
        PathFinder.PotentialPath.Flags pathFlags = PathFinder.PotentialPath.Flags.None;
        bool flag  = path.HasFlag(PathFinder.PotentialPath.Flags.PerformSuitChecks) && Grid.TryGetSuitMarkerFlags(from_cell, out flags, out pathFlags) && (flags & Grid.SuitMarker.Flags.Operational) != (Grid.SuitMarker.Flags) 0;
        bool flag2 = SuitMarker.DoesTraversalDirectionRequireSuit(from_cell, path.cell, flags);
        bool flag3 = path.HasAnyFlag(PathFinder.PotentialPath.Flags.HasAtmoSuit | PathFinder.PotentialPath.Flags.HasJetPack);

        if (flag)
        {
            bool flag4 = path.HasFlag(pathFlags);
            if (flag2)
            {
                if (!flag3 && !Grid.HasSuit(from_cell, prefabInstanceID))
                {
                    return(false);
                }
            }
            else if (flag3 && (flags & Grid.SuitMarker.Flags.OnlyTraverseIfUnequipAvailable) != 0 && (!flag4 || !Grid.HasEmptyLocker(from_cell, prefabInstanceID)))
            {
                return(false);
            }
        }
        if (idleNavMaskEnabled && (Grid.PreventIdleTraversal[path.cell] || Grid.PreventIdleTraversal[from_cell]))
        {
            return(false);
        }
        if (flag)
        {
            if (flag2)
            {
                if (!flag3)
                {
                    path.SetFlags(pathFlags);
                }
            }
            else
            {
                path.ClearFlags(PathFinder.PotentialPath.Flags.HasAtmoSuit | PathFinder.PotentialPath.Flags.HasJetPack);
            }
        }
        return(true);
    }