private Chore CreateUrgentUseChore(SMInstance smi)
        {
            Chore chore = CreateUseChore(smi, Db.Get().ChoreTypes.Pee);

            chore.AddPrecondition(ChorePreconditions.instance.IsBladderFull, null);
            chore.AddPrecondition(ChorePreconditions.instance.NotCurrentlyPeeing, null);
            return(chore);
        }
        private Chore CreateBreakUseChore(SMInstance smi)
        {
            Chore chore = CreateUseChore(smi, Db.Get().ChoreTypes.BreakPee);

            chore.AddPrecondition(ChorePreconditions.instance.IsBladderNotFull, null);
            return(chore);
        }
示例#3
0
 private void CreateWorkChore()
 {
     GetComponent <Prioritizable>().AddRef();
     chore = new WorkChore <EmptyConduitWorkable>(Db.Get().ChoreTypes.EmptyStorage, this, null, true, null, null, null, true, null, false, false, null, false, true, true, PriorityScreen.PriorityClass.basic, 5, false, true);
     chore.AddPrecondition(ChorePreconditions.instance.HasSkillPerk, Db.Get().SkillPerks.CanDoPlumbing.Id);
     elapsedTime = 0f;
     emptiedPipe = false;
     shouldShowSkillPerkStatusItem = true;
     UpdateStatusItem(null);
 }
示例#4
0
 /// <summary>
 /// Applied after AddPrecondition runs.
 /// </summary>
 internal static void Postfix(Chore __instance, Chore.Precondition precondition,
                              object data)
 {
     if (precondition.id == ChorePreconditions.instance.IsScheduledTime.id && (data
                                                                               is ScheduleBlockType type) && type == Work)
     {
         // Any task classified as Work gets our finish time precondition
         __instance.AddPrecondition(CAN_START_NEW, __instance);
     }
 }
示例#5
0
        protected static void ModifyChore(Workable instance, Chore chore, Func <Workable, bool> isEndlessWorking)
        {
            var precondition = new Chore.Precondition()
            {
                id          = "RequireAttributeRange",
                fn          = delegate(ref Chore.Precondition.Context context, object data) { return(!isEndlessWorking(instance) || ShouldChoreBeWorked(context)); },
                description = DUPLICANTS.CHORES.PRECONDITIONS.REQUIRES_ATTRIBUTE_RANGE.DESCRIPTION
            };

            chore.AddPrecondition(precondition, null);
        }
        /// <summary>
        /// Adds a chore precondition to check if the Duplicant is allowed to use that
        /// building.
        /// </summary>
        /// <param name="chore">The chore to modify.</param>
        private static void AddProfilePrecondition(Chore chore)
        {
            var choreTypes = Db.Get().ChoreTypes;
            var type       = chore.choreType;

            // Blacklist all fetch, empty storage, decon, repair, disinfect
            if (type != null && type != choreTypes.EmptyStorage && type != choreTypes.
                Deconstruct && type != choreTypes.Repair && type != choreTypes.Disinfect &&
                !type.Id.Contains("Fetch") && chore.target is Component cmp && cmp !=
                null && IS_ALLOWED.fn != null)
            {
                // Look for WP object
                var profiles = cmp.gameObject.GetComponentSafe <WorkshopProfile>();
                if (profiles != null)
                {
                    chore.AddPrecondition(IS_ALLOWED, profiles);
                }
            }
        }
 public Instance(Chore <Instance> chore, Def def)
     : base((IStateMachineTarget)chore, def)
 {
     chore.AddPrecondition(IsBagged, null);
 }
 public static void Postfix(Chore __instance)
 {
     __instance.AddPrecondition(PriorityZero.ZeroPrecondition);
 }
 public Instance(Chore <Instance> chore, Def def)
     : base((IStateMachineTarget)chore, def)
 {
     chore.AddPrecondition(ChorePreconditions.instance.CheckBehaviourPrecondition, GameTags.Creatures.Behaviours.PlayInterruptAnim);
 }
 public Instance(Chore <Instance> chore, Def def)
     : base((IStateMachineTarget)chore, def)
 {
     chore.AddPrecondition(ChorePreconditions.instance.CheckBehaviourPrecondition, GameTags.Creatures.Flee);
     base.sm.mover.Set(GetComponent <Navigator>(), base.smi);
 }
 private void OnSolidChanged(object data)
 {
     if (!((UnityEngine.Object) this == (UnityEngine.Object)null) && !((UnityEngine.Object)base.gameObject == (UnityEngine.Object)null))
     {
         GameScenePartitioner.Instance.Free(ref unstableEntry);
         int num  = Grid.PosToCell(this);
         int num2 = -1;
         UpdateColor(isReachable);
         if (Grid.Element[num].hardness >= 200)
         {
             bool flag = false;
             foreach (Chore.PreconditionInstance precondition in chore.GetPreconditions())
             {
                 Chore.PreconditionInstance current = precondition;
                 if (current.id == ChorePreconditions.instance.HasSkillPerk.id)
                 {
                     flag = true;
                     break;
                 }
             }
             if (!flag)
             {
                 chore.AddPrecondition(ChorePreconditions.instance.HasSkillPerk, Db.Get().SkillPerks.CanDigSupersuperhard);
             }
             requiredSkillPerk = Db.Get().SkillPerks.CanDigSupersuperhard.Id;
             materialDisplay.sharedMaterial = materials[3];
         }
         else if (Grid.Element[num].hardness >= 150)
         {
             bool flag2 = false;
             foreach (Chore.PreconditionInstance precondition2 in chore.GetPreconditions())
             {
                 Chore.PreconditionInstance current2 = precondition2;
                 if (current2.id == ChorePreconditions.instance.HasSkillPerk.id)
                 {
                     flag2 = true;
                     break;
                 }
             }
             if (!flag2)
             {
                 chore.AddPrecondition(ChorePreconditions.instance.HasSkillPerk, Db.Get().SkillPerks.CanDigNearlyImpenetrable);
             }
             requiredSkillPerk = Db.Get().SkillPerks.CanDigNearlyImpenetrable.Id;
             materialDisplay.sharedMaterial = materials[2];
         }
         else if (Grid.Element[num].hardness >= 50)
         {
             bool flag3 = false;
             foreach (Chore.PreconditionInstance precondition3 in chore.GetPreconditions())
             {
                 Chore.PreconditionInstance current3 = precondition3;
                 if (current3.id == ChorePreconditions.instance.HasSkillPerk.id)
                 {
                     flag3 = true;
                     break;
                 }
             }
             if (!flag3)
             {
                 chore.AddPrecondition(ChorePreconditions.instance.HasSkillPerk, Db.Get().SkillPerks.CanDigVeryFirm);
             }
             requiredSkillPerk = Db.Get().SkillPerks.CanDigVeryFirm.Id;
             materialDisplay.sharedMaterial = materials[1];
         }
         else
         {
             requiredSkillPerk = null;
             chore.GetPreconditions().Remove(chore.GetPreconditions().Find((Chore.PreconditionInstance o) => o.id == ChorePreconditions.instance.HasSkillPerk.id));
         }
         UpdateStatusItem(null);
         bool flag4 = false;
         if (!Grid.Solid[num])
         {
             num2 = GetUnstableCellAbove(num);
             if (num2 == -1)
             {
                 flag4 = true;
             }
             else
             {
                 StartCoroutine("PeriodicUnstableFallingRecheck");
             }
         }
         else if (Grid.Foundation[num])
         {
             flag4 = true;
         }
         if (flag4)
         {
             isDigComplete = true;
             if (chore == null || !chore.InProgress())
             {
                 Util.KDestroyGameObject(base.gameObject);
             }
             else
             {
                 GetComponentInChildren <MeshRenderer>().enabled = false;
             }
         }
         else if (num2 != -1)
         {
             Extents extents = default(Extents);
             Grid.CellToXY(num, out extents.x, out extents.y);
             extents.width  = 1;
             extents.height = (num2 - num + Grid.WidthInCells - 1) / Grid.WidthInCells + 1;
             unstableEntry  = GameScenePartitioner.Instance.Add("Diggable.OnSolidChanged", base.gameObject, extents, GameScenePartitioner.Instance.solidChangedLayer, OnSolidChanged);
         }
     }
 }
示例#12
0
 public Instance(Chore <Instance> chore, Def def)
     : base((IStateMachineTarget)chore, def)
 {
     chore.AddPrecondition(ChorePreconditions.instance.CheckBehaviourPrecondition, GameTags.Creatures.WantsToDropElements);
 }
 public Instance(Chore <Instance> chore, Def def)
     : base((IStateMachineTarget)chore, def)
 {
     chore.AddPrecondition(ChorePreconditions.instance.CheckBehaviourPrecondition, GameTags.HasDebugDestination);
 }
示例#14
0
 public Instance(Chore <Instance> chore, Def def)
     : base((IStateMachineTarget)chore, def)
 {
     chore.AddPrecondition(ChorePreconditions.instance.CheckBehaviourPrecondition, GameTags.Creatures.WantsToEat);
     inhaleSound = GlobalAssets.GetSound(def.inhaleSound, false);
 }
示例#15
0
 public Instance(Chore <Instance> chore, Def def)
     : base((IStateMachineTarget)chore, def)
 {
     chore.AddPrecondition(ChorePreconditions.instance.CheckBehaviourPrecondition, GameTags.Creatures.ScalesGrown);
 }
示例#16
0
 public Instance(Chore <Instance> chore, Def def)
     : base((IStateMachineTarget)chore, def)
 {
     chore.AddPrecondition(ChorePreconditions.instance.CheckBehaviourPrecondition, def.tag);
 }
 public Instance(Chore <Instance> chore, Def def)
     : base((IStateMachineTarget)chore, def)
 {
     originalSpeed = GetComponent <Navigator>().defaultSpeed;
     chore.AddPrecondition(ChorePreconditions.instance.CheckBehaviourPrecondition, GameTags.Creatures.WantsToGetRanched);
 }
 public Instance(Chore <Instance> chore, Def def)
     : base((IStateMachineTarget)chore, def)
 {
     chore.AddPrecondition(ChorePreconditions.instance.HasTag, GameTags.Creatures.Drowning);
 }