Jump to content

[Game Update] - 278302


Recommended Posts

8 hours ago, Ayka said:

Im having a pretty serious problem where all of my dupes will just freeze in place, and not move... ever; even if you tell them to. Its happened to me ~5 Times already tonight. Game doesnt crash, they just all stand in spot until they either suffocate or starve to death.

Had that as well, right after I drowned a dupe and had the corpse delivered to a grave. Save and reload fixed it. I also had it afterwards where just some of the dupes froze and there telling them to move manually fixed it. But there seems to be some deadlock problem in the task-scheduler now.

Link to comment
Share on other sites

15 hours ago, Cheerio said:

Solid doors only allow sand to fall through tem if they are sideways.

Missing an 'h'. :wilson_dorky:

15 hours ago, Cheerio said:
  • Added missing wallpaper tile to POI.

FINALLY!!

15 hours ago, Cheerio said:

LoreBearer no longer tries to access out of range flavour string.

Yeah @KrisRF!! Stop trying to access flavour strings that are out of your range! We don't want you to have a workplace accident! :wilson_ecstatic:

15 hours ago, Cheerio said:

Minglers peridoically walk to a new position.

Finally, now all my dupes on break won't stand on top of each other and do finger guns while changing their layering periodically. Now I can see them interact separately. :wilson_goodjob:

15 hours ago, Yoma_Nosme said:

Rooms dont require doors? This is madness :wilson_ecstatic: anybody could watch while they poop and shower...

image.png.dd9ae0db7a33a827e66b0f8a1eac96bc.png

blurryeyes.png.c7e928517e32f55a845098fac37fec89.png

Spoiler

Well I mean they DO have those little privacy curtains and the doors on the latrines...

 

  • Like 1
Link to comment
Share on other sites

Let me paint a picture in your mind:

You had a hard day full of work, a long break before bed to do everything you wanted this day (chatting with friends, getting a drink, going out dancing and you even found some time to play some videogames afterwards) and then you lay down on your comfy bed.

Now suddenly a loud siren sounds, you know what that means right ?

 

Spoiler

PARTY !

=> Time to get up and dance all night long

 

Link to comment
Share on other sites

1 hour ago, _Q_ said:

Can we stop adding not permitted food to kcal list at the top of the screen, its highly misleading, and all food is on edible list at the edge of the screen anyway.

Well, I mean...it is food. Dupes can eat it. It's just that you're not allowing them to.

Would you rather have two separate kcal lists? The UI is kinda already cluttered enough as is imo.

Link to comment
Share on other sites

31 minutes ago, watermelen671 said:

Well, I mean...it is food. Dupes can eat it. It's just that you're not allowing them to.

Would you rather have two separate kcal lists? The UI is kinda already cluttered enough as is imo.

The one on top should show the stuff that they are allowed to eat, the list on the right should show every food item that is available.

Right now you have the same information on the top and on the list, that's not needed.

Link to comment
Share on other sites

2 minutes ago, _Q_ said:

The one on top should show the stuff that they are allowed to eat, the list on the right should show every food item that is available.

Right now you have the same information on the top and on the list, that's not needed.

Why not have it the other way around? I'd rather be able to see all of the food available at a cursory glance, able to view at a moments notice with a hover of the mouse, than something that I have to click and navigate.

Spoiler

But I'm p sure that's what we already have. Or maybe I'm just confused.

idk.png.ec7aa735ca3c87556dabade5b483b360.png

 

  • Like 1
Link to comment
Share on other sites

8 minutes ago, watermelen671 said:

Why not have it the other way around? I'd rather be able to see all of the food available at a cursory glance, able to view at a moments notice with a hover of the mouse, than something that I have to click and navigate.

  Reveal hidden contents

But I'm p sure that's what we already have. Or maybe I'm just confused.

idk.png.ec7aa735ca3c87556dabade5b483b360.png

 

I see at the top number like 50k and minute later starvation alert kicks in, its totally misleading unless ou hover over it every now and then, but I would prefer just to see real number of food they can consume instead of number of all food and need to hover over it, to see if I need to start cooking.

Link to comment
Share on other sites

1 hour ago, _Q_ said:

I see at the top number like 50k and minute later starvation alert kicks in, its totally misleading unless ou hover over it every now and then, but I would prefer just to see real number of food they can consume instead of number of all food and need to hover over it, to see if I need to start cooking.

What happens if you have different food permissions for different dupes?  If you've got 50,000 kcal, and only 1kcal of that is fried mushroom (edible by your low-skill labor pool) and the rest is bbq (reserved for your high maintenance specialists) then you can still be misled by the information.

Link to comment
Share on other sites

Can we all just step back for a second...and marvel at how much it takes to make a dupe blink?

Spoiler

public class BlinkMonitor : GameStateMachine<BlinkMonitor, BlinkMonitor.Instance>
{
	public class Def : BaseDef
	{
	}

	public class Tuning : TuningData<Tuning>
	{
		public float randomBlinkIntervalMin;

		public float randomBlinkIntervalMax;
	}

	public new class Instance : GameInstance
	{
		public KBatchedAnimController eyes;

		public Instance(IStateMachineTarget master, Def def)
			: base(master)
		{
		}

		public bool IsBlinking()
		{
			return base.IsInsideState(base.sm.blinking);
		}

		public void Blink()
		{
			this.GoTo(base.sm.blinking);
		}
	}

	public State satisfied;

	public State blinking;

	public TargetParameter eyes;

	private static HashedString HASH_SNAPTO_EYES = "snapto_eyes";

	[CompilerGenerated]
	private static StateMachine<BlinkMonitor, Instance, IStateMachineTarget, object>.State.Callback <>f__mg$cache0;

	[CompilerGenerated]
	private static StateMachine<BlinkMonitor, Instance, IStateMachineTarget, object>.State.Callback <>f__mg$cache1;

	[CompilerGenerated]
	private static Func<Instance, float> <>f__mg$cache2;

	[CompilerGenerated]
	private static Transition.ConditionCallback <>f__mg$cache3;

	[CompilerGenerated]
	private static StateMachine<BlinkMonitor, Instance, IStateMachineTarget, object>.State.Callback <>f__mg$cache4;

	[CompilerGenerated]
	private static Action<Instance, float> <>f__mg$cache5;

	[CompilerGenerated]
	private static StateMachine<BlinkMonitor, Instance, IStateMachineTarget, object>.State.Callback <>f__mg$cache6;

	public override void InitializeStates(out BaseState default_state)
	{
		default_state = this.satisfied;
		base.root.Enter(BlinkMonitor.CreateEyes).Exit(BlinkMonitor.DestroyEyes);
		this.satisfied.ScheduleGoTo(BlinkMonitor.GetRandomBlinkTime, this.blinking);
		this.blinking.EnterTransition(this.satisfied, GameStateMachine<BlinkMonitor, Instance, IStateMachineTarget, object>.Not(BlinkMonitor.CanBlink)).Enter(BlinkMonitor.BeginBlinking).Update(BlinkMonitor.UpdateBlinking, UpdateRate.RENDER_EVERY_TICK, false)
			.Target(this.eyes)
			.OnAnimQueueComplete(this.satisfied)
			.Exit(BlinkMonitor.EndBlinking);
	}

	private static bool CanBlink(Instance smi)
	{
		return smi.HasTag(GameTags.AllowSpeech) && smi.Get<Navigator>().CurrentNavType != NavType.Ladder;
	}

	private static float GetRandomBlinkTime(Instance smi)
	{
		return UnityEngine.Random.Range(TuningData<Tuning>.Get().randomBlinkIntervalMin, TuningData<Tuning>.Get().randomBlinkIntervalMax);
	}

	private static void CreateEyes(Instance smi)
	{
		smi.eyes = Util.KInstantiate(Assets.GetPrefab(EyeAnimation.ID), null, null).GetComponent<KBatchedAnimController>();
		smi.eyes.gameObject.SetActive(true);
		smi.sm.eyes.Set(smi.eyes.gameObject, smi);
	}

	private static void DestroyEyes(Instance smi)
	{
		if ((UnityEngine.Object)smi.eyes != (UnityEngine.Object)null)
		{
			Util.KDestroyGameObject(smi.eyes);
			smi.eyes = null;
		}
	}

	public static void BeginBlinking(Instance smi)
	{
		string s = "eyes1";
		smi.eyes.Play(s, KAnim.PlayMode.Once, 1f, 0f);
		BlinkMonitor.UpdateBlinking(smi, 0f);
	}

	public static void EndBlinking(Instance smi)
	{
		smi.GetComponent<SymbolOverrideController>().RemoveSymbolOverride(BlinkMonitor.HASH_SNAPTO_EYES, 3);
	}

	public static void UpdateBlinking(Instance smi, float dt)
	{
		int currentFrameIndex = smi.eyes.GetCurrentFrameIndex();
		KAnimBatch batch = smi.eyes.GetBatch();
		if (currentFrameIndex != -1 && batch != null)
		{
			KAnim.Anim.Frame frame = smi.eyes.GetBatch().group.data.GetFrame(currentFrameIndex);
			if (!(frame == KAnim.Anim.Frame.InvalidFrame))
			{
				HashedString hash = HashedString.Invalid;
				for (int i = 0; i < frame.numElements; i++)
				{
					int num = frame.firstElementIdx + i;
					if (num < batch.group.data.frameElements.Count)
					{
						KAnim.Anim.FrameElement frameElement = batch.group.data.frameElements[num];
						if (!(frameElement.symbol == HashedString.Invalid))
						{
							hash = frameElement.symbol;
							break;
						}
					}
				}
				smi.GetComponent<SymbolOverrideController>().AddSymbolOverride(BlinkMonitor.HASH_SNAPTO_EYES, smi.eyes.AnimFiles[0].GetData().build.GetSymbol(hash), 3);
			}
		}
	}
}

 

Truly amazing.

  • Haha 2
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
  • Create New...