Exemplo n.º 1
0
 public override void InitializeStates(out BaseState default_state)
 {
     default_state     = infected;
     base.serializable = true;
     infected.Enter("Infect", delegate(StatesInstance smi)
     {
         smi.Infect();
     }).DoNotification((StatesInstance smi) => smi.master.notification).Update("UpdateProgress", delegate(StatesInstance smi, float dt)
     {
         smi.UpdateProgress(dt);
     }, UpdateRate.SIM_200ms, false)
     .ToggleStatusItem((StatesInstance smi) => smi.master.GetStatusItem(), (StatesInstance smi) => smi)
     .ParamTransition(percentRecovered, cured, GameStateMachine <States, StatesInstance, SicknessInstance, object> .IsGTOne)
     .ParamTransition(percentDied, fatality_pre, GameStateMachine <States, StatesInstance, SicknessInstance, object> .IsGTOne);
     cured.Enter("Cure", delegate(StatesInstance smi)
     {
         smi.master.Cure();
     });
     fatality_pre.Update("DeathByDisease", delegate(StatesInstance smi, float dt)
     {
         DeathMonitor.Instance sMI = smi.master.gameObject.GetSMI <DeathMonitor.Instance>();
         if (sMI != null)
         {
             sMI.Kill(Db.Get().Deaths.FatalDisease);
             smi.GoTo(fatality);
         }
     }, UpdateRate.SIM_200ms, false);
     fatality.DoNothing();
 }
Exemplo n.º 2
0
        // труп изъят из стораге - вернуть все как было
        // а также корректируем позицию чтобы не зависал в воздухе
        private static void UnHideCorpse(DeathMonitor.Instance smi)
        {
            MinionIdentity mi = smi.GetComponent <MinionIdentity>();

            if (mi != null)
            {
                if (!Components.MinionIdentities.Items.Contains(mi))
                {
                    Components.MinionIdentities.Add(mi);
                }
                MinionAssignablesProxy map = mi.assignableProxy.Get();
                if (map != null && !Components.MinionAssignablesProxy.Items.Contains(map))
                {
                    Components.MinionAssignablesProxy.Add(map);
                }
            }
            Transform transform = smi.master.transform;
            Vector3   position  = Grid.CellToPos(Grid.PosToCell(transform.GetPosition()));

            position.z = transform.GetPosition().z;
            transform.SetPosition(position);

            Debug.Log("UnHideCorpse");

            //NameDisplayScreen.Instance.entries.Find(entry => entry.world_go == smi.gameObject)?.display_go.SetActive(true);
            //NameDisplayScreen.Instance.entries.Find(entry => entry.world_go == smi.gameObject).display_go.GetComponent<KBatchedAnimController>().sceneLayer = Grid.SceneLayer.Move;
        }
Exemplo n.º 3
0
        private void OnNewDay(object data)
        {
            if (lifeCyclesDone)
            {
                return;
            }
            if (currentStage == null || currentStage.ID == "")
            {
                DebugUtil.LogWarningArgs($"[DuplicantLifeExpectancy]: Life Stage for Duplicant {gameObject.GetProperName()} was null during OnNewDay callback. Should have already been set.");
                currentStage = new LifeStage(LifeStagePreset.FirstState);
            }
            float currCycle = GameClock.Instance.GetCycle();

            if (!currentStage.Started)
            {
                if (currentStage.BeginsOn >= currCycle)
                {
                    Effect         e        = currentStage.GetEffect();
                    EffectInstance instance = effects.Add(e, true);

                    currentStage.Started = true;
                }
            }
            else
            {
                if (currCycle >= currentStage.EndsAfter)
                {
                    string nextStage = currentStage.NextStage;
                    if (nextStage != "")
                    {
                        currentStage = new LifeStage(currentStage.NextStage);
                        if (currentStage.BeginsOn == currCycle)
                        {
                            effects.Add(currentStage.GetEffect(), true);
                            currentStage.Started = true;
                        }
                    }
                    else
                    {
                        if (currentStage.IsDying())
                        {
                            DeathMonitor.Instance smi = gameObject.GetSMI <DeathMonitor.Instance>();
                            if (smi != null)
                            {
                                Death OldAge = new Death("OldAge", Db.Get().Deaths, "Old Age", "{Target} has died of old age", "dead_on_back", "dead_on_back");
                                smi.Kill(OldAge);
                            }
                        }
                        else
                        {
                            //There is no next stage. The current stage will be re-applied
                            Effect e = currentStage.GetEffect();
                            effects.Add(e, true);
                            currentStage.BeginsOn = currCycle;
                        }
                    }
                }
            }
        }
Exemplo n.º 4
0
 public void Kill()
 {
     DeathMonitor.Instance sMI = base.gameObject.GetSMI <DeathMonitor.Instance>();
     if (sMI != null)
     {
         base.gameObject.GetSMI <DeathMonitor.Instance>().Kill(Db.Get().Deaths.Starvation);
     }
 }
Exemplo n.º 5
0
 private void Kill()
 {
     DeathMonitor.Instance sMI = base.gameObject.GetSMI <DeathMonitor.Instance>();
     if (sMI != null)
     {
         base.gameObject.GetSMI <DeathMonitor.Instance>().Kill(Db.Get().Deaths.Slain);
     }
 }
Exemplo n.º 6
0
            /// <summary>
            /// Applied after Kill runs.
            /// </summary>
            internal static void Postfix(DeathMonitor.Instance __instance, Death death)
            {
#if DEBUG
                PUtil.LogDebug("Duplicant died: " + death?.Id);
#endif
                if (__instance.IsDuplicant)
                {
                    AchievementStateComponent.OnDeath(death);
                }
            }
Exemplo n.º 7
0
        public static bool Prefix(DeathMonitor.Instance __instance, bool ___isDuplicant)
        {
            if (!___isDuplicant)
            {
                return(true);
            }

            if (App.IsExiting || KMonoBehaviour.isLoadingScene)
            {
                return(true);
            }

            Util.KDestroyGameObject(__instance.gameObject);
            return(false);
        }
Exemplo n.º 8
0
        private void CheckDrowning(object data = null)
        {
            if (drowned)
            {
                return;
            }
            int cell = Grid.PosToCell(gameObject.transform.GetPosition());

            if (!IsCellSafe(cell))
            {
                if (!drowning)
                {
                    drowning = true;
                    Trigger((int)GameHashes.Drowning);
                    GetComponent <KPrefabID>().AddTag(GameTags.Creatures.Drowning, false);
                }
                if (timeToDrown <= 0f && canDrownToDeath)
                {
                    DeathMonitor.Instance smi = this.GetSMI <DeathMonitor.Instance>();
                    if (smi != null)
                    {
                        smi.Kill(Db.Get().Deaths.Drowned);
                    }
                    Trigger((int)GameHashes.Drowned);
                    drowned = true;
                }
            }
            else if (drowning)
            {
                drowning = false;
                GetComponent <KPrefabID>().RemoveTag(GameTags.Creatures.Drowning);
                Trigger((int)GameHashes.EnteredBreathableArea);
            }
            drowningStatusGuid = selectable.ToggleStatusItem(NeedLiquid, drowningStatusGuid, drowning, this);

            if (effects != null)
            {
                if (drowning)
                {
                    effects.Add(drowningEffect, false);
                    return;
                }
                else
                {
                    effects.Remove(drowningEffect);
                }
            }
        }
Exemplo n.º 9
0
        private void CheckDryingOut()
        {
            if (this.suffocated || this.GetComponent <KPrefabID>().HasTag(GameTags.Trapped))
            {
                return;
            }

            if (!IsInWater(Grid.PosToCell(this.gameObject.transform.GetPosition())))
            {
                if (!this.suffocating)
                {
                    this.suffocating = true;
                    this.Trigger((int)GameHashes.DryingOut);
                }

                if ((double)this.timeToSuffocate > 0.0)
                {
                    return;
                }

                DeathMonitor.Instance smi = this.GetSMI <DeathMonitor.Instance>();
                if (smi != null)
                {
                    smi.Kill(Db.Get().Deaths.Suffocation);
                }

                this.Trigger((int)GameHashes.DriedOut);
                this.suffocated = true;
            }
            else
            {
                if (!this.suffocating)
                {
                    return;
                }

                this.suffocating = false;
                this.Trigger((int)GameHashes.EnteredWetArea, (object)null);
            }
        }
Exemplo n.º 10
0
        // TODO: нужно разобраться с отображением имён закопанных трупов

        // труп сохранён в стораге - удаляем ссылки на труп из глобальных списков
        // и ещё раз отменяем все назначения
        private static void HideCorpse(DeathMonitor.Instance smi)
        {
            MinionIdentity mi = smi.GetComponent <MinionIdentity>();

            if (mi != null)
            {
                Components.MinionIdentities.Remove(mi);
                MinionAssignablesProxy map = mi.assignableProxy.Get();
                if (map != null)
                {
                    Components.MinionAssignablesProxy.Remove(map);
                }
                mi.GetSoleOwner().UnassignAll();
                mi.GetEquipment().UnequipAll();
            }


            Debug.Log("HideCorpse");
            //NameDisplayScreen.Instance.entries.Find(entry => entry.world_go == smi.gameObject)?.display_go.SetActive(false);

            //Debug.Log(NameDisplayScreen.Instance.entries.Find(entry => entry.world_go == smi.gameObject)?.display_go.name);
            //NameDisplayScreen.Instance.entries.Find(entry => entry.world_go == smi.gameObject).display_go.GetComponent<KBatchedAnimController>().sceneLayer = Grid.SceneLayer.NoLayer;
        }
 public override void InitializeStates(out BaseState default_state)
 {
     default_state = approachIncapacitated;
     approachIncapacitated.InitializeStates(rescuer, rescueTarget, holding.pickup, failure, Grid.DefaultOffset, null).Enter(delegate(StatesInstance smi)
     {
         DeathMonitor.Instance sMI2 = rescueTarget.GetSMI <DeathMonitor.Instance>(smi);
         if (sMI2 == null || sMI2.IsDead())
         {
             smi.StopSM("target died");
         }
     });
     holding.Target(rescuer).Enter(delegate(StatesInstance smi)
     {
         States states = this;
         smi.sm.rescueTarget.Get(smi).Subscribe(1623392196, delegate
         {
             smi.GoTo(states.holding.ditch);
         });
         KAnimFile anim2 = Assets.GetAnim("anim_incapacitated_carrier_kanim");
         smi.master.GetComponent <KAnimControllerBase>().RemoveAnimOverrides(anim2);
         smi.master.GetComponent <KAnimControllerBase>().AddAnimOverrides(anim2, 0f);
     }).Exit(delegate(StatesInstance smi)
     {
         KAnimFile anim = Assets.GetAnim("anim_incapacitated_carrier_kanim");
         smi.master.GetComponent <KAnimControllerBase>().RemoveAnimOverrides(anim);
     });
     holding.pickup.Target(rescuer).PlayAnim("pickup").Enter(delegate(StatesInstance smi)
     {
         rescueTarget.Get(smi).gameObject.GetComponent <KBatchedAnimController>().Play("pickup", KAnim.PlayMode.Once, 1f, 0f);
     })
     .Exit(delegate(StatesInstance smi)
     {
         rescuer.Get(smi).GetComponent <Storage>().Store(rescueTarget.Get(smi), false, false, true, false);
         rescueTarget.Get(smi).transform.SetLocalPosition(Vector3.zero);
         KBatchedAnimTracker component = rescueTarget.Get(smi).GetComponent <KBatchedAnimTracker>();
         component.symbol = new HashedString("snapTo_pivot");
         component.offset = new Vector3(0f, 0f, 1f);
     })
     .EventTransition(GameHashes.AnimQueueComplete, holding.delivering, null);
     holding.delivering.InitializeStates(rescuer, deliverTarget, holding.deposit, holding.ditch, null, null).Enter(delegate(StatesInstance smi)
     {
         DeathMonitor.Instance sMI = rescueTarget.GetSMI <DeathMonitor.Instance>(smi);
         if (sMI == null || sMI.IsDead())
         {
             smi.StopSM("target died");
         }
     }).Update(delegate(StatesInstance smi, float dt)
     {
         if ((UnityEngine.Object)deliverTarget.Get(smi) == (UnityEngine.Object)null)
         {
             smi.GoTo(holding.ditch);
         }
     }, UpdateRate.SIM_200ms, false);
     holding.deposit.PlayAnim("place").EventHandler(GameHashes.AnimQueueComplete, delegate(StatesInstance smi)
     {
         smi.master.DropIncapacitatedDuplicant();
         smi.SetStatus(Status.Success);
         smi.StopSM("complete");
     });
     holding.ditch.PlayAnim("place").ScheduleGoTo(0.5f, failure).Exit(delegate(StatesInstance smi)
     {
         smi.master.DropIncapacitatedDuplicant();
     });
     failure.Enter(delegate(StatesInstance smi)
     {
         smi.SetStatus(Status.Failed);
         smi.StopSM("failed");
     });
 }