Jump to content

Data Mining, Theorizing, Art Assets, Sprite Sheets, & More! (SPOILERS!)


Recommended Posts

Hi. Amazing work you've done with the asset extraction. I didn't read all 60 pages of the thread, but do you have the extracted sprites uploaded somewhere? The dupe sprites, in particular. I'm toying with the idea of making a mod with custom dupe templates...

  • Thanks 1
Link to comment
Share on other sites

1 hour ago, Hekateras said:

Hi. Amazing work you've done with the asset extraction. I didn't read all 60 pages of the thread, but do you have the extracted sprites uploaded somewhere? The dupe sprites, in particular. I'm toying with the idea of making a mod with custom dupe templates...

do you mean the sprite sheets? if so, here:

dupesprites.zip

Link to comment
Share on other sites

5 hours ago, Hekateras said:

Hi. Amazing work you've done with the asset extraction. I didn't read all 60 pages of the thread, but do you have the extracted sprites uploaded somewhere? The dupe sprites, in particular. I'm toying with the idea of making a mod with custom dupe templates...

soyousay.png.05776c9f722aafebc2f89783d17baccd.png

Well boy howdy hey do I have a metric butt ton of stuff for you!

duplicant_sprites.zip

 

Also I finally managed to get around to finishing updating all of the old job jumpsuits! 

Spoiler

body_athlete_0.png.6beaf26291b7347bbaf88ba3c451e3ec.pngbody_body_builder_0.png.fb86f8e171ee333d83efa992a127bfab.pngbody_builder_0.png.7c7ad5a37897be30c9feafa932e8a0f1.pngbody_cook_0.png.ac58a3de8ad8bc504bcc24e34a4fa3be.pngbody_doctor_0.png.8e2c34b13216452e3ffe88aa9847a053.pngbody_mechanic_0.png.32e2f1290c669a6903a416c4db85414d.pngbody_miner_0.png.77c86965f30b8a99e92a87f02f0cedd1.pngbody_scientist_0.png.8c560fc7c0f4a33d790bc44c2d06353b.pngbody_suit_water_0.png.bbe7c931cc05b82192eadbe82dc44ab0.png

They are, in order:

Spoiler
  • Athlete
  • Builder
  • Body Builder
  • Cook
  • Doctor
  • Mechanic
  • Miner
  • Scientist
  • Water Suit

For those curious. :wilson_sneaky:

Also @Hekateras, if you'd like to have the old/scrapped helms just lemme know and I'll post 'em here. :wilson_goodjob:

  • Like 1
  • Thanks 1
Link to comment
Share on other sites

Okay...so I found something that's kinda interesting, it's a scrapped disease called "Fiery Skin". No it's actually not heatstroke, but it's similar.

Apparently it's an illness that causes duplicants to periodically give off heat for the duration of their illness. I think that'd be a neat thing for those seeking for a challenge to deal with.

Spoiler

I mean yeah you could just let them die, but the same could be said for literally everything else in the game. And when you think like that it causes any potential challenge to be yeeted out the window.

Here's some of the old code for it:

Spoiler

// Klei.AI.FierySkin
using Klei.AI;
using UnityEngine;

public class FierySkin : AnimatedDisease
{
	private struct InstanceData
	{
		public SchedulerHandle schedulerHandle;

		public KAnimControllerBase controller;
	}

	private const float EmitInterval = 3f;

	private const float EmitEnergy = 10f;

	public FierySkin()
		: base("FierySkin", 0.1f, 900f, "anim_idle_fiery", "SickFierySkin")
	{
	}

	protected override object OnInfect(GameObject go)
	{
		base.OnInfect(go);
		InstanceData instanceData = default(InstanceData);
		instanceData.schedulerHandle = GameScheduler.Instance.SchedulePeriodic("EmitHeat", 3f, Emit, go);
		Emit(go);
		KBatchedAnimController kBatchedAnimController = FXHelpers.CreateEffect("fiery_fx", go.transform, update_looping_sounds_position: true);
		kBatchedAnimController.transform.localPosition = Vector3.zero;
		kBatchedAnimController.Play(new string[2]
		{
			"working_pre",
			"working_loop"
		}, KAnim.PlayMode.Loop);
		instanceData.controller = kBatchedAnimController;
		return instanceData;
	}

	protected override void OnCure(GameObject go, object instance_data)
	{
		InstanceData instanceData = (InstanceData)instance_data;
		instanceData.schedulerHandle.Clear();
		KAnimControllerBase controller = instanceData.controller;
		controller.Play("working_pst");
		controller.destroyOnAnimComplete = true;
		base.OnCure(go, instance_data);
	}

	private void Emit(object data)
	{
		GameObject gameObject = (GameObject)data;
		int num = Grid.PosToCell(gameObject.transform.position);
		int gameCell = Grid.CellAbove(num);
		SimMessages.ModifyEnergy(num, 5f, SimMessages.EnergySourceID.FierySkin);
		SimMessages.ModifyEnergy(gameCell, 5f, SimMessages.EnergySourceID.FierySkin);
	}
}

 

And here's the code for every other scrapped disease too while I'm at it! :wilson_goodjob:

Spoiler

DWEEBCEPHALY

Spoiler


// Klei.AI.Dweebcephaly
using Klei.AI;
using STRINGS;

public class Dweebcephaly : AttributeModifierDisease
{
	public Dweebcephaly()
		: base("Dweebcephaly", use_custom_effect: false, new AttributeModifier[1]
		{
			new AttributeModifier("Learning", -2f, DUPLICANTS.DISEASES.DWEEBCEPHALY.NAME)
		}, 0.005f, 900f, new EffectProbabilityDelta[1]
		{
			new EffectProbabilityDelta
			{
				effectID = "DirtyHands",
				probabilityDelta = 0.005f
			}
		})
	{
	}
}

 

LAZIBONITIS

Spoiler


// Klei.AI.Lazibonitis
using Klei.AI;
using STRINGS;

public class Lazibonitis : AttributeModifierDisease
{
	public Lazibonitis()
		: base("Lazibonitis", use_custom_effect: false, new AttributeModifier[2]
		{
			new AttributeModifier("Athletics", -4f, DUPLICANTS.DISEASES.LAZIBONITIS.NAME),
			new AttributeModifier("Strength", -3f, DUPLICANTS.DISEASES.LAZIBONITIS.NAME)
		}, 0.1f, 900f)
	{
	}
}

 

TRENCH STENCH

Spoiler


// Klei.AI.PutridOdour
using Klei.AI;
using UnityEngine;

public class PutridOdour : Disease
{
	private struct InstanceData
	{
		public SchedulerHandle schedulerHandle;

		public KAnimControllerBase controller;
	}

	private const float EmitInterval = 5f;

	private const float EmissionRadius = 1.5f;

	private const float MaxDistanceSq = 2.25f;

	public PutridOdour()
		: base("PutridOdour", 0.000833333354f, 900f)
	{
	}

	protected override object OnInfect(GameObject go)
	{
		InstanceData instanceData = default(InstanceData);
		instanceData.schedulerHandle = GameScheduler.Instance.SchedulePeriodic("PutridOdourEmit", 5f, Emit, go);
		KBatchedAnimController kBatchedAnimController = FXHelpers.CreateEffect("odor_fx", go.transform, update_looping_sounds_position: true);
		kBatchedAnimController.transform.localPosition = Vector3.zero;
		kBatchedAnimController.Play(new string[2]
		{
			"working_pre",
			"working_loop"
		}, KAnim.PlayMode.Loop);
		instanceData.controller = kBatchedAnimController;
		Emit(go);
		return instanceData;
	}

	protected override void OnCure(GameObject go, object instance_data)
	{
		InstanceData instanceData = (InstanceData)instance_data;
		KAnimControllerBase controller = instanceData.controller;
		controller.Play("working_pst");
		controller.destroyOnAnimComplete = true;
		instanceData.schedulerHandle.Clear();
	}

	private void Emit(object data)
	{
		GameObject gameObject = (GameObject)data;
		Components.Cmps<MinionIdentity> liveMinionIdentities = Components.LiveMinionIdentities;
		Vector2 a = gameObject.transform.position;
		for (int i = 0; i < liveMinionIdentities.Count; i++)
		{
			MinionIdentity minionIdentity = liveMinionIdentities[i];
			if (minionIdentity.gameObject != gameObject.gameObject)
			{
				Vector2 b = minionIdentity.transform.position;
				float num = Vector2.SqrMagnitude(a - b);
				if (num <= 2.25f)
				{
					minionIdentity.Trigger(508119890, Strings.Get("STRINGS.DUPLICANTS.DISEASES.PUTRIDODOUR.CRINGE_EFFECT").String);
					minionIdentity.GetComponent<Effects>().Add("SmelledPutridOdour", should_save: true);
					minionIdentity.gameObject.GetSMI<ThoughtGraph.Instance>().AddThought(Db.Get().Thoughts.PutridOdour);
				}
			}
		}
	}
}

 

SAWCORPSIS

Spoiler


// Klei.AI.SawCorpsosis
using Klei.AI;
using STRINGS;

public class SawCorpsosis : AttributeModifierDisease
{
	public SawCorpsosis()
		: base("SawCorpsosis", use_custom_effect: false, new AttributeModifier[1]
		{
			new AttributeModifier("StressDelta", 3f, DUPLICANTS.DISEASES.SAWCORPSOSIS.NAME)
		}, 0.1f, 1200f)
	{
	}
}

 

SPORES

Spoiler


// Klei.AI.Spores
using Klei.AI;
using UnityEngine;

public class Spores : Disease
{
	private struct InstanceData
	{
		public SchedulerHandle schedulerHandle;
	}

	private const float EmitInterval = 3f;

	private const float EmitMass = 0.05f;

	private const SimHashes EmitElement = SimHashes.ContaminatedOxygen;

	private const string KAnimFilename = "anim_idle_spores";

	public Spores()
		: base("Spores", 0.000833333354f, 900f)
	{
	}

	protected override object OnInfect(GameObject go)
	{
		InstanceData instanceData = default(InstanceData);
		instanceData.schedulerHandle = GameScheduler.Instance.SchedulePeriodic("EmitSpores", 3f, Emit, go);
		KAnimFile anim = Assets.GetAnim("anim_idle_spores");
		go.GetComponent<KAnimControllerBase>().AddAnimOverrides(anim, 10f);
		go.GetComponent<FaceGraph>().AddExpression(Db.Get().Expressions.SickSpores);
		Emit(go);
		return instanceData;
	}

	protected override void OnCure(GameObject go, object instace_data)
	{
		go.GetComponent<FaceGraph>().RemoveExpression(Db.Get().Expressions.SickSpores);
		KAnimFile anim = Assets.GetAnim("anim_idle_spores");
		go.GetComponent<KAnimControllerBase>().RemoveAnimOverrides(anim);
		((InstanceData)instace_data).schedulerHandle.Clear();
	}

	private void Emit(object data)
	{
		GameObject gameObject = (GameObject)data;
		int gameCell = Grid.PosToCell(gameObject.transform.position);
		float value = Db.Get().Amounts.Temperature.Lookup(gameObject).value;
		SimMessages.AddRemoveSubstance(gameCell, SimHashes.ContaminatedOxygen, CellEventLogger.Instance.ElementConsumerSimUpdate, 0.05f, value);
		KBatchedAnimController kBatchedAnimController = FXHelpers.CreateEffect("spore_fx", gameObject.transform, update_looping_sounds_position: true);
		kBatchedAnimController.transform.localPosition = Vector3.zero;
		kBatchedAnimController.Play(new string[3]
		{
			"working_pre",
			"working_loop",
			"working_pst"
		});
		kBatchedAnimController.destroyOnAnimComplete = true;
	}
}

 

 

Also...what the heck is "Voronoi"? :wilson_curious:

Spoiler

It's split up into separate parts: Tree, Leaf, Node, and Diagram.

I'm not sure if it's some sort of analogous coding term, or an actual tree we're talking about here...

sculpt-think.png.e1964da4e54e002aa81b9ece19b7db13.png

Also! Does anybody remember the Kukumelon? 

Spoiler

This bad boy:

object_0.png.b34a02a267710809c738396298034ea2.png

Apparently this is also a Ginko Nut...which has anti fungal properties.

Spoiler

In game, ginko nuts don't exist in real life. :wilson_wink:

Note that mostly everything that I'm posting here has been expunged from the latest build of the game.

And everything else that's old that I've decided to dig up. :wilson_sneaky:

Spoiler

excavator_bomb.png.0525c9d95c93bfd025ef1f26e827d209.pngelementspout.png.696eb04f18553ce0351c63ca36ea7a7c.pngplantheatbulb_1.png.90aae409784400d0120472dc724d9461.pngplantheatbulb_2.png.f049cc698603867f5c23217a6c4fa667.pngplantheatbulb_3.png.99923a6391f9387569715ea7d1235d06.pngplantheatbulb_4.png.e26888a0efd7fd78505f25a55546a060.pnggeneratormanual_working.png.7b626d55711eb642dfc2e96727153570.pngrockrefinery.png.daffc0d4a11da59143b63902182785bd.png

Meanwhile I'm going to continue trying to assemble how the really old UI looked...wish me luck. 

Spoiler

Also I haven't forgotten about your werepig request @minespatch :wilson_goodjob:

 

  • Thanks 2
  • Sad 1
Link to comment
Share on other sites

Thank you! You're a legend.

Damn, So this looks complicated. So what, the game essentially uses one atlas and build for all duplicants, and then elsewhere (presumably wherever the duplicant templates are defined), it's specified which subset of sprites included in the atlas are actually used for that specific duplicant? That's the impression I'm getting here. This seems kinda modding-unfriendly, although I can think of a way one might work around this...

  • Thanks 2
Link to comment
Share on other sites

Spoiler

And I just found the noise overlay code!

Spoiler


	public class NOISE_POLLUTION
	{
		public class NAMES
		{
			public static LocString PEACEFUL = "Peaceful";

			public static LocString QUIET = "Quiet";

			public static LocString TOSSANDTURN = "Moderate";

			public static LocString WAKEUP = "Noisy";

			public static LocString PASSIVE = "Loud";

			public static LocString ACTIVE = "Cacophonous";

			public static LocString EXTREME = "Painful";
		}

		public class TOOLTIPS
		{
			public static LocString PEACEFUL = "[{0} dB]" + HORIZONTAL_BR_RULE + "Peaceful areas improve Duplicants' quality of sleep and Learning ability.\n\nSoundproofed rooms and areas free of buildings and critters will generally be quieter.";

			public static LocString QUIET = "[>{0} dB]" + HORIZONTAL_BR_RULE + "Quiet areas are necessary for Duplicants to fall asleep.\n\nSoundproofed rooms and areas free of buildings and critters will generally be quieter.";

			public static LocString TOSSANDTURN = "[>{0} dB]" + HORIZONTAL_BR_RULE + "Duplicants will feel unrested if forced to sleep in Moderate noise.\n\nSoundproofed rooms and areas free of buildings and critters will generally be quieter.";

			public static LocString WAKEUP = "[>{0} dB]" + HORIZONTAL_BR_RULE + "Noisy areas will wake Duplicants up during the night, but are tolerable to them during the day.\n\nDuplicant foot traffic, generators, and powered buildings can create high noise levels.";

			public static LocString PASSIVE = "[>{0} dB]" + HORIZONTAL_BR_RULE + "Loud areas will impair Duplicants' Learning abilities and cause minor Stress.\n\nDuplicant foot traffic, generators, and powered buildings can create high noise levels.";

			public static LocString ACTIVE = "[>{0} dB]" + HORIZONTAL_BR_RULE + "Cacophonous noise causes significant Stress and prevents Duplicants from sleeping or researching.\n\nDuplicant foot traffic, generators, and powered buildings can create high noise levels.";

			public static LocString EXTREME = "[>{0} dB]" + HORIZONTAL_BR_RULE + "Painful noise levels are extremely Stressful to Duplicants and will cause them physical pain.\n\nDuplicant foot traffic, generators, and powered buildings can create high noise levels.";

			public static LocString HIGH_NOISE_POLLUTION = "Exposure to loud noises causes Duplicant Stress over time and makes it difficult to sleep or concentrate" + HORIZONTAL_BR_RULE + "High Duplicant traffic and powered buildings can create noisy areas";

			public static LocString LOW_NOISE_POLLUTION = "Quiet areas decrease Stress, ensure Duplicants have quality sleep, and help them to concentrate" + HORIZONTAL_BR_RULE + "Soundproofed rooms and areas free of buildings and critters will generally be quieter.";
		}

		public static LocString NAME = "ACOUSTICS OVERLAY";

		public static LocString BUTTON = "Acoustics Overlay";

		public static LocString TOTAL = "Total";

		public static LocString HOVERTITLE = "Acoustics";

		public static LocString NOTAFFECTING = "Drowned out:";

		public static LocString VALUE = "<color=#{0}>{1} dB</color>";

		public static LocString RANGE = "{0} dB";

		public static LocString LOUDNESS_STRING = " <color=#{0}>({1})</color>";

		public static LocString DESCRIPTION = "Two " + FormatAsLink("Sounds", "SOUND") + " of equal dB will sum for a <b>+3 dB</b> increase.\nA " + FormatAsLink("Sound", "SOUND") + " that is 10 dB quieter will add approximately <b>+0.5 dB</b> to the total signal.\nAnything more than 10 dB quieter will be inaudible.";
	}


	public class Sound : Mode
	{
		public static readonly HashedString ID = "Sound";

		private UniformGrid<NoisePolluter> partition;

		private HashSet<NoisePolluter> layerTargets = new HashSet<NoisePolluter>();

		private HashSet<Tag> targetIDs = new HashSet<Tag>();

		private int targetLayer;

		private int cameraLayerMask;

		private ColorHighlightCondition[] highlightConditions = new ColorHighlightCondition[1]
		{
			new ColorHighlightCondition(delegate(KMonoBehaviour np)
			{
				Color black = Color.black;
				Color b = Color.black;
				float t = 0.8f;
				if (np != null)
				{
					float num = 0f;
					int cell = Grid.PosToCell(CameraController.Instance.baseCamera.ScreenToWorldPoint(KInputManager.GetMousePos()));
					num = (np as NoisePolluter).GetNoiseForCell(cell);
					if (num < 36f)
					{
						t = 1f;
						b = new Color(0.4f, 0.4f, 0.4f);
					}
				}
				return Color.Lerp(black, b, t);
			}, delegate(KMonoBehaviour np)
			{
				List<GameObject> highlightedObjects = SelectToolHoverTextCard.highlightedObjects;
				bool result = false;
				for (int i = 0; i < highlightedObjects.Count; i++)
				{
					if (highlightedObjects[i] != null && highlightedObjects[i] == np.gameObject)
					{
						result = true;
						break;
					}
				}
				return result;
			})
		};

		public Sound()
		{
			targetLayer = LayerMask.NameToLayer("MaskedOverlay");
			cameraLayerMask = LayerMask.GetMask("MaskedOverlay", "MaskedOverlayBG");
			List<Tag> prefabTagsWithComponent = Assets.GetPrefabTagsWithComponent<NoisePolluter>();
			targetIDs.UnionWith(prefabTagsWithComponent);
		}

		public override HashedString ViewMode()
		{
			return ID;
		}

		public override string GetSoundName()
		{
			return "Sound";
		}

		public override void Enable()
		{
			RegisterSaveLoadListeners();
			List<Tag> prefabTagsWithComponent = Assets.GetPrefabTagsWithComponent<NoisePolluter>();
			targetIDs.UnionWith(prefabTagsWithComponent);
			partition = Mode.PopulatePartition<NoisePolluter>(targetIDs);
			Camera.main.cullingMask |= cameraLayerMask;
		}

		public override void Update()
		{
			Grid.GetVisibleExtents(out Vector2I min, out Vector2I max);
			Mode.RemoveOffscreenTargets(layerTargets, min, max);
			IEnumerable allIntersecting = partition.GetAllIntersecting(new Vector2(min.x, min.y), new Vector2(max.x, max.y));
			IEnumerator enumerator = allIntersecting.GetEnumerator();
			try
			{
				while (enumerator.MoveNext())
				{
					NoisePolluter instance = (NoisePolluter)enumerator.Current;
					AddTargetIfVisible(instance, min, max, layerTargets, targetLayer);
				}
			}
			finally
			{
				IDisposable disposable;
				if ((disposable = (enumerator as IDisposable)) != null)
				{
					disposable.Dispose();
				}
			}
			UpdateHighlightTypeOverlay(min, max, layerTargets, targetIDs, highlightConditions, BringToFrontLayerSetting.Conditional, targetLayer);
		}

		protected override void OnSaveLoadRootRegistered(SaveLoadRoot item)
		{
			Tag saveLoadTag = item.GetComponent<KPrefabID>().GetSaveLoadTag();
			if (targetIDs.Contains(saveLoadTag))
			{
				NoisePolluter component = item.GetComponent<NoisePolluter>();
				partition.Add(component);
			}
		}

		protected override void OnSaveLoadRootUnregistered(SaveLoadRoot item)
		{
			if (!(item == null) && !(item.gameObject == null))
			{
				NoisePolluter component = item.GetComponent<NoisePolluter>();
				if (layerTargets.Contains(component))
				{
					layerTargets.Remove(component);
				}
				partition.Remove(component);
			}
		}

		public override void Disable()
		{
			DisableHighlightTypeOverlay(layerTargets);
			Camera.main.cullingMask &= ~cameraLayerMask;
			UnregisterSaveLoadListeners();
			partition.Clear();
			layerTargets.Clear();
		}
	}

 

Dunno if this was already in the game...but acoustic research?

Spoiler


	public class ACOUSTICS
	{
		public static LocString NAME = UI.FormatAsLink("Sound Amplifiers", "ACOUSTICS");

		public static LocString DESC = "Precise control of the audio spectrum allows Duplicants to get funky.";
	}

think if it is already in game then it's where the jukebot is located.

Now I can't remember who it was...so I'm gonna make an educated guess and say that @goboking is probably going to squee at this.

Spoiler


	public class Radiation : Mode
	{
		public static readonly HashedString ID = "Radiation";

		public override HashedString ViewMode()
		{
			return ID;
		}

		public override string GetSoundName()
		{
			return "Lights";
		}
	}
Spoiler

Or not...maybe I dunno. It's the radiation overlay. :wilson_curious:

Spoiler



// RadiationGermSpawner
using UnityEngine;

public class RadiationGermSpawner : KMonoBehaviour
{
	private const float GERM_SCALE = 100f;

	private const int CELLS_PER_UPDATE = 1024;

	private int nextEvaluatedCell;

	private float cellRatio;

	private byte disease_idx;

	protected override void OnPrefabInit()
	{
		base.OnPrefabInit();
		cellRatio = Grid.CellCount / 1024;
		disease_idx = byte.MaxValue;
	}

	private void Update()
	{
	}

	private void EvaluateRadiation()
	{
		for (int i = 0; i < 1024; i++)
		{
			int num = (nextEvaluatedCell + i) % Grid.CellCount;
			if (Grid.RadiationCount[num] < 0)
			{
				continue;
			}
			int num2 = Mathf.RoundToInt((float)Grid.RadiationCount[num] * 100f * (Time.deltaTime * cellRatio));
			if (Grid.DiseaseIdx[num] == disease_idx)
			{
				SimMessages.ModifyDiseaseOnCell(num, disease_idx, num2);
				continue;
			}
			int num3 = Grid.DiseaseCount[num] - num2;
			if (num3 < 0)
			{
				SimMessages.ModifyDiseaseOnCell(num, disease_idx, num3);
			}
			else
			{
				SimMessages.ModifyDiseaseOnCell(num, Grid.DiseaseIdx[num], -num2);
			}
		}
		nextEvaluatedCell = (nextEvaluatedCell + 1024) % Grid.CellCount;
	}
}

Oof. Radiation sickness? :wilson_curious:

Spoiler



// TUNING.BUILDINGS.SELF_HEAT_KILOWATTS
public const float TIER_NUCLEAR = 16384f;

Holy heck that's a LOT of heat! 

5d0982fa55b07_sweatingguy.thumb.png.0209c753c4e1d3595387e1b375da4978.png 

Spoiler

And maybe I'm just looking at things wrong, but...something seems amiss here:




// TUNING.BUILDINGS.SELF_HEAT_KILOWATTS
public class SELF_HEAT_KILOWATTS
{
	public const float TIER0 = 0f;

	public const float TIER1 = 0.5f;

	public const float TIER2 = 1f;

	public const float TIER3 = 2f;

	public const float TIER4 = 4f;

	public const float TIER5 = 8f;

	public const float TIER6 = 16f;

	public const float TIER7 = 32f;

	public const float TIER8 = 64f;

	public const float TIER_NUCLEAR = 16384f;
}

From 64f to 16,384f

jooshthonk.thumb.png.f5b345e863e51680bbc84573e0b16523.png

 

Spoiler

and if it isn't you I'm sorry. 

5 minutes ago, Hekateras said:

So what, the game essentially uses one atlas and build for all duplicants, and then elsewhere (presumably wherever the duplicant templates are defined), it's specified which subset of sprites included in the atlas are actually used for that specific duplicant? That's the impression I'm getting here. This seems kinda modding-unfriendly, although I can think of a way one might work around this...

Basically yeah, I've managed to get around that by just making a custom body_comp_default file:

It functions perfectly with any duplicant animation, so hopefully that's a good starting template for your endeavors. :wilson_goodjob:

  • Thanks 2
Link to comment
Share on other sites

On 20.12.2019 at 6:10 AM, watermelen671 said:

 

  Hide contents
Скачать видео
Скачать видео
Скачать видео
Скачать видео
Скачать видео

 

New short by ONI, let's see.

1LOo.gif.2395721e9c8e301cf7837e6cb6e5b8db.gif

Vomiting, farting, excrement on one’s head, and now urine asteroids ... The whole cosmos cannot give any other ideas for the story.

Spoiler

777.jpg.2fac6befd0a1337703ec19bd6c04dc5b.jpg

 

 

Edited by 0rutyna0
  • Haha 4
Link to comment
Share on other sites

42 minutes ago, Lbphero said:

@watermelen671 may you please show me the animation that a dupe uses when they're administering a cure through the disease clinic? not the actual dupe being cured, but the dupe giving the cure? I won't be encountering zombie spores any time soon again so I'd like to see the animation here.

I uh...have no idea what animation you're talking about. Do you mean the general doctor interacting animation, or something else?

I thought I had posted the completed version, but I guess it was too much of a headache for me to bother. :wilson_curious:

Spoiler

Here's all I have for the time being

anim_interacts_treatment_chair_doctor3.png.11a8af32418efdc1792ac27172b6835b.png

While I work on the updated one...

 

  • Thanks 1
Link to comment
Share on other sites

3 minutes ago, watermelen671 said:

I uh...have no idea what animation you're talking about. Do you mean the general doctor interacting animation, or something else?

I thought I had posted the completed version, but I guess it was too much of a headache for me to bother. :wilson_curious:

  Reveal hidden contents

Here's all I have for the time being

anim_interacts_treatment_chair_doctor3.png.11a8af32418efdc1792ac27172b6835b.png

While I work on the updated one...

 

OxygenNotIncluded_a0bt3GywQx.png.083862c75c4d1d56779f48e798dfcf4a.png 

I'm referring to the animation that plays when a dupe administers a cure to a sick dupe that's in this disease clinic building.

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...