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); } }
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); }