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(); }
// труп изъят из стораге - вернуть все как было // а также корректируем позицию чтобы не зависал в воздухе 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; }
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; } } } } }
public void Kill() { DeathMonitor.Instance sMI = base.gameObject.GetSMI <DeathMonitor.Instance>(); if (sMI != null) { base.gameObject.GetSMI <DeathMonitor.Instance>().Kill(Db.Get().Deaths.Starvation); } }
private void Kill() { DeathMonitor.Instance sMI = base.gameObject.GetSMI <DeathMonitor.Instance>(); if (sMI != null) { base.gameObject.GetSMI <DeathMonitor.Instance>().Kill(Db.Get().Deaths.Slain); } }
/// <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); } }
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); }
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); } } }
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); } }
// 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"); }); }