Skip to content

EA 23.296 Nightly

April 18, 2026

24 files modified. 2 new files created.

Important Changes

Possible breaking changes. Click the filename to view the chunk.

SpriteData (4)

cs
public Sprite[] GetSprites() 
public void LoadSprites() 
cs
public Sprite GetSprite() 
cs
public void Validate() 
cs
public void Load() 

AM_Bird

public class AM_Bird : AM_MiniGame

cs
public override void OnActivate()
{
	EClass.scene.transFocus = EClass.scene.flock._roamers.RandomItem().transform;
	EClass.screen.SetTargetZoomIndex(1); 
	EClass.screen.SetTargetZoomIndex(2); 
	EClass.screen.RefreshTilt();
	EClass.ui.layerFloat.SetActive(enable: false);
}

public override void OnDeactivate()

cs
	{
		EClass.scene.transFocus = null;
		EClass.screen.RefreshTilt();
		EClass.screen.SetTargetZoomIndex(1); 
		EClass.screen.SetTargetZoomIndex(2); 
		EClass.ui.layerFloat.SetActive(enable: true);
	}
}

BaseGameScreen

public virtual void RefreshPosition()

cs
	{
		float z = position.z;
		targetZoom = TargetZoom;
		for (int i = 0; i < EMono.core.config.camera.zooms.Length; i++) 
		for (int i = 0; i < EMono.core.config.camera.listZoom.Length; i++) 
		{
			if (targetZoom == EMono.core.config.camera.zooms[i]) 
			if (targetZoom == EMono.core.config.camera.listZoom[i]) 
			{
				targetZoomIndex = i;
			}

public virtual void RefreshPosition()

cs
		pushBack = Vector3.zero;
		int num = scrollX - scrollY;
		int num2 = scrollY + scrollX;
		if ((float)num <= mapLimit.x) 
		if ((float)num * Zoom <= mapLimit.x) 
		{
			pushBack.x = mapLimit.x - (float)num; 
			pushBack.x = mapLimit.x - (float)num * Zoom; 
		}
		if ((float)num2 <= mapLimit.y) 
		if ((float)num2 * Zoom <= mapLimit.y) 
		{
			pushBack.y = mapLimit.y - (float)num2; 
			pushBack.y = mapLimit.y - (float)num2 * Zoom; 
		}
		if ((float)num >= (float)EMono._map.Size + mapLimit.width - (float)(width / 2)) 
		if ((float)num >= (float)EMono._map.Size + mapLimit.width - (float)(width / 2) * Zoom) 
		{
			pushBack.x = (float)EMono._map.Size + mapLimit.width - (float)(width / 2) - (float)num; 
			pushBack.x = (float)EMono._map.Size + mapLimit.width - (float)(width / 2) * Zoom - (float)num; 
		}
		if ((float)num2 >= (float)EMono._map.Size + mapLimit.height - (float)(height / 2)) 
		if ((float)num2 >= (float)EMono._map.Size + mapLimit.height - (float)(height / 2) * Zoom) 
		{
			pushBack.y = (float)EMono._map.Size + mapLimit.height - (float)(height / 2) - (float)num2; 
			pushBack.y = (float)EMono._map.Size + mapLimit.height - (float)(height / 2) * Zoom - (float)num2; 
		}
		position += Quaternion.Euler(planeAngle) * pushBack * Core.delta * pushbackSpeed;
	}

public void SetTargetZoomIndex(int index)

cs
{
	targetZoomIndex = index;
	float num = targetZoom;
	targetZoom = EMono.core.config.camera.zooms[targetZoomIndex]; 
	targetZoom = EMono.core.config.camera.listZoom[targetZoomIndex]; 
	if (num != targetZoom)
	{
		zoomTimer = 0f;

public void ModTargetZoomIndex(int a)

cs
	{
		int num = targetZoomIndex;
		targetZoomIndex -= a;
		int num2 = ((!EMono.core.config.camera.extendZoomMin) ? 1 : 0); 
		int num3 = (EMono.core.config.camera.extendZoomMax ? 4 : 3); 
		int num2 = ((!EMono.core.config.camera.extendZoomMin) ? 2 : 0); 
		int num3 = (EMono.core.config.camera.extendZoomMax ? 5 : 4); 
		if (targetZoomIndex < num2)
		{
			targetZoomIndex = num2;

BaseListPeople

public override void OnClick(Chara c, ItemGeneral i)

cs
				{
					uIContextMenu.AddButton("editPCC", delegate
					{
						EClass.ui.AddLayer<LayerEditPCC>().Activate(c, UIPCC.Mode.Full); 
						EClass.ui.AddLayer<LayerEditPCC>("LayerPCC/LayerEditPCC").Activate(c, UIPCC.Mode.Full); 
					});
					uIContextMenu.AddButton("togglePCC", delegate
					{

CalcMoney

public static int Whore(Chara seller, Chara buyer)

cs

	public static int InvestShop(Chara c, Chara tc)
	{
		long a = Guild.Merchant.InvestPrice(tc.c_invest * 700); 
		return Mathf.Max(b: Invest(Guild.Merchant.InvestPrice(tc.c_invest * tc.c_invest * 80 + 200)), a: Invest(a)); 
		long a = Guild.Merchant.InvestPrice((long)tc.c_invest * 700L); 
		return Mathf.Max(b: Invest(Guild.Merchant.InvestPrice((long)tc.c_invest * (long)tc.c_invest * 80 + 200)), a: Invest(a)); 
	}

	public static int InvestZone(Chara c)
	{
		long a = EClass._zone.development * 50; 
		long a = (long)EClass._zone.development * 50L; 
		return Mathf.Max(b: Invest((long)EClass._zone.development * (long)EClass._zone.development / 4 + 500), a: Invest(a));
	}
}

Card

public virtual void SetImage(Image image)

cs
		SpriteReplacer spriteReplacer = SpriteReplacer.dictSkins.TryGetValue(c_idSpriteReplacer);
		if (spriteReplacer != null)
		{
			RenderData renderData = ResourceCache.Load<RenderData>("Scene/Render/Data/chara_custom_" + ((spriteReplacer.data.GetSprite().texture.height <= 128) ? "128" : "256")); 
			sprite = spriteReplacer.data.GetSprite(); 
			sprite = spriteReplacer.GetSprite(); 
			RenderData renderData = ResourceCache.Load<RenderData>("Scene/Render/Data/chara_custom_" + ((sprite.texture.height <= 128) ? "128" : "256")); 
			sourceRenderCard.SetImage(image, sprite, colorInt, setNativeSize: true, 0, 0, renderData, spriteReplacer.data.pref ?? Pref);
			return;
		}

CardRenderer

public override void Draw(RenderParam p, ref Vector3 v, bool drawShadow)

cs
			pref = replacer.pref;
			SubPassData.Current = SubPassData.Default;
		}
		if (isChara) 
		if (isChara || hasActor) 
		{
			p.x += pref.x * (float)((!owner.flipX) ? 1 : (-1));
			p.z += pref.z;

public override void OnEnterScreen()

cs
{
	if (isSynced)
	{
		Debug.LogError("renderer alraedy synced:" + owner); 
		Debug.LogError("renderer already synced:" + owner); 
	}
	isSynced = true;
	if (!usePass)

public SourcePref GetPref()

cs
		{
			return EClass.core.refs.prefs.pcc;
		}
		if (owner.sourceCard.replacer?.data?.pref != null) 
		{ 
			return owner.sourceCard.replacer.data.pref; 
		} 
		return owner.Pref;
	}
}

Chara

public override SourcePref Pref

cs
	{
		get
		{
			if (spriteReplacer != null) 
			if (spriteReplacer == null) 
			{
				return spriteReplacer.data?.pref ?? EClass.core.refs.prefs.replacer1; 
			} 
			if (base.idSkin > 0) 
			{ 
				switch (sourceCard.tiles.TryGet(base.idSkin)) 
				if (base.idSkin > 0) 
				{
				case 2319: 
				case 2619: 
				case 2621: 
				case 2623: 
				case 2625: 
					return EClass.core.refs.prefs.sonwputit1; 
				case 2320: 
				case 2611: 
				case 2620: 
				case 2622: 
				case 2624: 
				case 2626: 
				case 2828: 
					return EClass.core.refs.prefs.snowputit2; 
					switch (sourceCard.tiles.TryGet(base.idSkin)) 
					{ 
					case 2319: 
					case 2619: 
					case 2621: 
					case 2623: 
					case 2625: 
						return EClass.core.refs.prefs.sonwputit1; 
					case 2320: 
					case 2611: 
					case 2620: 
					case 2622: 
					case 2624: 
					case 2626: 
					case 2828: 
						return EClass.core.refs.prefs.snowputit2; 
					} 
				}
				return sourceCard.replacer.data?.pref ?? sourceCard.pref; 
			}
			return sourceCard.pref; 
			return spriteReplacer.data?.pref ?? EClass.core.refs.prefs.replacer1; 
		}
	}

CharaActorPCC

public override void OnRender(RenderParam p)

cs
		case 0:
		{
			Thing thing = ((owner.IsPC && EMono.player.currentHotItem.RenderThing != null) ? EMono.player.currentHotItem.RenderThing : ((!flag && owner.body.slotMainHand?.thing != null) ? owner.body.slotMainHand.thing : null));
			if (thing != null) 
			if (thing == null) 
			{
				bool flag2 = num == 0 || num == 1; 
				if (thing.trait.InvertHeldSprite) 
				{ 
					flag2 = !flag2; 
				} 
				Vector3[] mainHandPos = EMono.setting.render.mainHandPos; 
				Vector3[] mainHand = EMono.setting.render.animeWalk[provider.currentFrame].mainHand; 
				SourcePref pref = thing.sourceCard.pref; 
				thing.dir = ((!flag2) ? 1 : 0); 
				thing.SetRenderParam(p); 
				p.x = org.x + mainHandPos[num].x + mainHand[num].x + (flag2 ? 0.01f : (-0.01f)) * (float)pref.equipX; 
				p.y = org.y + mainHandPos[num].y + mainHand[num].y + 0.01f * (float)pref.equipY; 
				p.z = org.z - thing.renderer.data.offset.z + mainHandPos[num].z + mainHand[num].z; 
				p.v.x = p.x; 
				p.v.y = p.y; 
				p.v.z = p.z; 
				if (thing.renderer.hasActor) 
				break; 
			} 
			bool flag2 = num == 0 || num == 1; 
			if (thing.trait.InvertHeldSprite) 
			{ 
				flag2 = !flag2; 
			} 
			Vector3[] mainHandPos = EMono.setting.render.mainHandPos; 
			Vector3[] mainHand = EMono.setting.render.animeWalk[provider.currentFrame].mainHand; 
			SourcePref pref = thing.Pref; 
			thing.dir = ((!flag2) ? 1 : 0); 
			thing.SetRenderParam(p); 
			p.x = org.x + mainHandPos[num].x + mainHand[num].x + (flag2 ? 0.01f : (-0.01f)) * (float)pref.equipX; 
			p.y = org.y + mainHandPos[num].y + mainHand[num].y + 0.01f * (float)pref.equipY; 
			p.z = org.z - thing.renderer.data.offset.z + mainHandPos[num].z + mainHand[num].z; 
			if (thing.renderer.hasActor) 
			{ 
				thing.renderer.RefreshSprite(); 
				if (!flag2) 
				{
					thing.renderer.RefreshSprite(); 
					p.x -= thing.renderer.data._offset.x * 2f; 
				}
				thing.renderer.Draw(p, ref p.v, drawShadow: false); 
			}
			p.v.x = p.x; 
			p.v.y = p.y; 
			p.v.z = p.z; 
			thing.renderer.Draw(p, ref p.v, drawShadow: false); 
			break;
		}
		case -1:

public override void OnRender(RenderParam p)

cs
				break;
			}
			Thing thing2 = owner.body.slotOffHand.thing;
			if (thing2 != null) 
			if (thing2 == null) 
			{ 
				break; 
			} 
			bool flag4 = num == 1 || num == 3; 
			Vector3[] offHandPos = EMono.setting.render.offHandPos; 
			Vector3[] offHand = EMono.setting.render.animeWalk[provider.currentFrame].offHand; 
			SourcePref pref2 = thing2.Pref; 
			thing2.dir = ((!flag4) ? 1 : 0); 
			thing2.SetRenderParam(p); 
			p.x = org.x + offHandPos[num].x + offHand[num].x + (flag4 ? 0.01f : (-0.01f)) * (float)pref2.equipX; 
			p.y = org.y + offHandPos[num].y + offHand[num].y + 0.01f * (float)pref2.equipY; 
			p.z = org.z - thing2.renderer.data.offset.z + offHandPos[num].z + offHand[num].z; 
			if (thing2.renderer.hasActor) 
			{
				bool flag4 = num == 1 || num == 3; 
				Vector3[] offHandPos = EMono.setting.render.offHandPos; 
				Vector3[] offHand = EMono.setting.render.animeWalk[provider.currentFrame].offHand; 
				SourcePref pref2 = thing2.source.pref; 
				thing2.dir = ((!flag4) ? 1 : 0); 
				thing2.SetRenderParam(p); 
				p.x = org.x + offHandPos[num].x + offHand[num].x + (flag4 ? 0.01f : (-0.01f)) * (float)pref2.equipX; 
				p.y = org.y + offHandPos[num].y + offHand[num].y + 0.01f * (float)pref2.equipY; 
				p.z = org.z - thing2.renderer.data.offset.z + offHandPos[num].z + offHand[num].z; 
				if (thing2.renderer.hasActor) 
				thing2.renderer.RefreshSprite(); 
				if (!flag4) 
				{
					thing2.renderer.RefreshSprite(); 
					p.x -= thing2.renderer.data._offset.x * 2f; 
				}
				thing2.renderer.Draw(p); 
			}
			p.v.x = p.x; 
			p.v.y = p.y; 
			p.v.z = p.z; 
			thing2.renderer.Draw(p, ref p.v, drawShadow: false); 
			break;
		}
		case -1:

CharaRenderer

public override void SetOwner(Card c)

cs
		SpriteReplacer spriteReplacer = SpriteReplacer.dictSkins.TryGetValue(owner.c_idSpriteReplacer);
		if (spriteReplacer != null)
		{
			data = ResourceCache.Load<RenderData>("Scene/Render/Data/chara_custom_" + ((spriteReplacer.data.GetSprite().texture.height <= 128) ? "128" : "256")); 
			data = ResourceCache.Load<RenderData>("Scene/Render/Data/chara_custom_" + ((spriteReplacer.GetSprite().texture.height <= 128) ? "128" : "256")); 
			owner.spriteReplacer = spriteReplacer;
		}
	}

CoreConfig

public class CameraConfig

cs
		public int moveframe;

		public float[] zooms;
		public float[] listZoom = new float[7] { 0.125f, 0.25f, 0.5f, 0.75f, 1f, 1.5f, 2f }; 
	}

	[Serializable]

CoreDebug

public void InitDebugCommands()

cs
	});
	Add(cat2, "Edit PCC", delegate
	{
		EClass.ui.AddLayer<LayerEditPCC>().Activate(EClass.pc, UIPCC.Mode.Full); 
		EClass.ui.AddLayer<LayerEditPCC>("LayerPCC/LayerEditPCC").Activate(EClass.pc, UIPCC.Mode.Full); 
	});
	Add(cat2, "COM_Teleport", COM_Teleport);
	Add(cat2, "LOG_Spatials", LOG_Spatials);

DramaCustomSequence

public void Build(Chara c)

cs
		if (c.affinity.CanBecomeMama() || EClass.pc.faith == EClass.game.religions.MoonShadow || EClass.debug.enable)
		{
			Steam.GetAchievement(ID_Achievement.MAMA);
			string id2 = c.id; 
			if (!(id2 == "farris")) 
			{ 
				if (id2 == "quru") 
				{ 
					Steam.GetAchievement(ID_Achievement.MAMA3); 
				} 
			} 
			else
			{ 
				Steam.GetAchievement(ID_Achievement.MAMA2); 
			} 
			TempTalkTopic("mama_yes", StepEnd);
			EClass.pc.SetAI(new AI_Fuck
			{

ID_Achievement

public enum ID_Achievement

cs
	OYS,
	MAMA,
	PRIEST,
	PRIEST2 
	PRIEST2, 
	MAMA2, 
	MAMA3 
}

LayerEditPCC

public void Activate(Chara _chara, UIPCC.Mode m, string idUniform = null, Action

cs
			actor.Reset();
		});
	};
	uiPCC.onRefreshParts = SetPccPicker; 
	PCCData newData = new PCCData();
	newData.Set(chara.pccData);
	backup = IO.DeepCopy(newData);

public void OnClickChangePortrait()

cs
		});
	}

	public void OnClickPartPicker(UIItemPCC uiItemPcc) 
	{ 
		ELayer.ui.AddLayer<LayerPickPCC>("LayerPCC/LayerPickPCC").Activate(uiPCC, uiItemPcc); 
	} 
	public override void OnKill()
	{
		Apply();

public void SetPortraitSlider()

cs
			}, (ModItem<Sprite> a) => (!a.id.IsEmpty()) ? a.id : "None");
		}
	}
	public void SetPccPicker() 
	{ 
		foreach (UIItemPCC item in uiPCC.items) 
		{ 
			item.buttonPicker.onClick.AddListener(delegate
			{ 
				OnClickPartPicker(item); 
			}); 
			item.buttonPicker.GetComponent<ButtonGeneral>().tooltip.lang = "LayerPickPCC".lang(); 
		} 
	} 
}

+LayerPickPCC

File Created
cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Empyrean.Utils;
using UnityEngine;
using UnityEngine.UI;

public class LayerPickPCC : ELayer
{
	public UIItemPCCPart mold;

	public LayoutGroup layoutParts;

	private UIItemPCC _uiItemPcc;

	private UIPCC _uiPcc;

	private List<UIItemPCCPart> _items = new List<UIItemPCCPart>();

	private List<Outline> _outlines = new List<Outline>();

	private static readonly Dictionary<PCC.Part, BaseModPackage> _cached = new Dictionary<PCC.Part, BaseModPackage>();

	private static readonly Regex _idRegex = new Regex("(\\d+)|(\\D+)", RegexOptions.Compiled);

	public void Activate(UIPCC uiPcc, UIItemPCC uiItemPcc)
	{
		_uiPcc = uiPcc;
		_uiItemPcc = uiItemPcc;
		PopulateButtons();
	}

	private void Update()
	{
		SpriteProvider provider = _uiPcc.actor.provider;
		int frame = (provider.currentFrame + 2) % 4;
		foreach (UIItemPCCPart item in _items)
		{
			item.SetSpriteIndex(provider.currentDir, frame);
		}
	}

	public void PopulateButtons()
	{
		List<PCC.Part> list = _uiItemPcc.parts.ToList();
		list.Sort(PartSorter);
		foreach (PCC.Part part in list)
		{
			UIItemPCCPart item = Util.Instantiate(mold, layoutParts);
			if (part == _uiItemPcc.part)
			{
				SetOutline(item.outline);
			}
			if (part == null)
			{
				item.button.onClick.AddListener(delegate
				{
					_uiItemPcc.slider.value = 0f;
					SetOutline(item.outline);
				});
				item.button.tooltip.lang = "empty";
			}
			else
			{
				ModItem<Texture2D> modItem = part.modTextures.TryGetValue("walk");
				if (modItem == null)
				{
					break;
				}
				item.button.tooltip.lang = GetPartProviderString(part);
				item.button.onClick.AddListener(delegate
				{
					_uiItemPcc.slider.value = _uiItemPcc.parts.IndexOf(part);
					SetOutline(item.outline);
				});
				item.SetSprites(IO.LoadPNG(modItem.fileInfo.FullName));
				HSVColor hsv = _uiPcc.pcc.data.GetColor(_uiItemPcc.idPartSet).ToHsv();
				hsv.v = 1f;
				hsv.a = 1f;
				item.button.icon.color = hsv.ToRGB();
			}
			_items.Add(item);
		}
		void SetOutline(Outline outline)
		{
			_outlines.Add(outline);
			foreach (Outline outline in _outlines)
			{
				outline.enabled = false;
			}
			outline.enabled = true;
		}
	}

	public static string GetPartProviderString(PCC.Part part)
	{
		return "ID: " + part.id + "\n<i>" + GetPartProvider(part).title.TagColor(Color.cyan) + "</i>\n" + part.dir.ShortPath();
	}

	public static BaseModPackage GetPartProvider(PCC.Part part)
	{
		if (part == null)
		{
			return null;
		}
		if (_cached.TryGetValue(part, out var value))
		{
			return value;
		}
		string dir = part.dir;
		value = BaseModManager.Instance.packages.FirstOrDefault((BaseModPackage p) => dir.StartsWith(p.dirInfo.FullName)) ?? new BaseModPackage
		{
			title = "unknownAuthor".lang()
		};
		return _cached[part] = value;
	}

	public static int PartSorter(PCC.Part lhs, PCC.Part rhs)
	{
		if (lhs == null)
		{
			if (rhs != null)
			{
				return -1;
			}
			return 0;
		}
		if (rhs == null)
		{
			return 1;
		}
		int num = GetPartSortOrder(lhs);
		int num2 = GetPartSortOrder(rhs);
		if (num != num2)
		{
			return num - num2;
		}
		string id = lhs.id;
		string id2 = rhs.id;
		if (id == id2)
		{
			return 0;
		}
		int result;
		bool flag = int.TryParse(id, out result);
		int result2;
		bool flag2 = int.TryParse(id2, out result2);
		if (flag && flag2)
		{
			return result.CompareTo(result2);
		}
		if (flag)
		{
			return -1;
		}
		if (flag2)
		{
			return 1;
		}
		MatchCollection matchCollection = _idRegex.Matches(id);
		MatchCollection matchCollection2 = _idRegex.Matches(id2);
		int num3 = Math.Min(matchCollection.Count, matchCollection2.Count);
		for (int i = 0; i < num3; i++)
		{
			string value = matchCollection[i].Value;
			string value2 = matchCollection2[i].Value;
			int result3;
			bool num4 = int.TryParse(value, out result3);
			int result4;
			bool flag3 = int.TryParse(value2, out result4);
			int num5 = ((!(num4 && flag3)) ? string.Compare(value, value2, StringComparison.OrdinalIgnoreCase) : result3.CompareTo(result4));
			if (num5 != 0)
			{
				return num5;
			}
		}
		return matchCollection.Count - matchCollection2.Count;
		static int GetPartSortOrder(PCC.Part part)
		{
			int num6 = BaseModManager.Instance.packages.IndexOf(GetPartProvider(part));
			if (num6 < 0)
			{
				return int.MaxValue;
			}
			return num6;
		}
	}
}

RenderData

public class RenderData : EScriptable, IRenderer

cs

	public static Quaternion deadRotation = Quaternion.Euler(0f, 0f, 90f);

	protected Vector3 _offset; 
	[NonSerialized] 
	public Vector3 _offset; 

	public static GameSetting.RenderSetting renderSetting;

SourcePref

public void WriteIni(string path)

cs
		}
		File.CreateText(path).Close();
		IniData iniData = fileIniDataParser.ReadFile(path, Encoding.UTF8);
		iniData.Global["x"] = ints[4].ToString() ?? ""; 
		iniData.Global["y"] = ints[5].ToString() ?? ""; 
		iniData.Global["z"] = ints[2].ToString() ?? ""; 
		iniData.Global["pivotX"] = pivotX.ToString() ?? ""; 
		iniData.Global["pivotY"] = pivotY.ToString() ?? ""; 
		iniData.Global["shadow"] = shadow.ToString() ?? ""; 
		iniData.Global["shadowX"] = shadowX.ToString() ?? ""; 
		iniData.Global["shadowY"] = shadowY.ToString() ?? ""; 
		iniData.Global["height"] = ints[3].ToString() ?? ""; 
		iniData.Global["scaleIcon"] = scaleIcon.ToString() ?? ""; 
		iniData.Global["liquidMod"] = liquidMod.ToString() ?? ""; 
		iniData.Global["hatY"] = ints[23].ToString() ?? ""; 
		iniData.Global["flags"] = ints[1].ToString() ?? ""; 
		iniData.Global["x"] = ints[4].ToString(); 
		iniData.Global["y"] = ints[5].ToString(); 
		iniData.Global["z"] = ints[2].ToString(); 
		iniData.Global["pivotX"] = pivotX.ToString(); 
		iniData.Global["pivotY"] = pivotY.ToString(); 
		iniData.Global["shadow"] = shadow.ToString(); 
		iniData.Global["shadowX"] = shadowX.ToString(); 
		iniData.Global["shadowY"] = shadowY.ToString(); 
		iniData.Global["shadowRX"] = shadowRX.ToString(); 
		iniData.Global["shadowRY"] = shadowRY.ToString(); 
		iniData.Global["shadowBX"] = shadowBX.ToString(); 
		iniData.Global["shadowBY"] = shadowBY.ToString(); 
		iniData.Global["shadowBRX"] = shadowBRX.ToString(); 
		iniData.Global["shadowBRY"] = shadowBRY.ToString(); 
		iniData.Global["height"] = ints[3].ToString(); 
		iniData.Global["heightFix"] = ints[24].ToString(); 
		iniData.Global["scaleIcon"] = scaleIcon.ToString(); 
		iniData.Global["liquidMod"] = liquidMod.ToString(); 
		iniData.Global["liquidModMax"] = liquidModMax.ToString(); 
		iniData.Global["hatY"] = ints[23].ToString(); 
		iniData.Global["equipX"] = equipX.ToString(); 
		iniData.Global["equipY"] = equipY.ToString(); 
		iniData.Global["stackX"] = ints[17].ToString(); 
		fileIniDataParser.WriteFile(path, iniData);
	}

public static SourcePref ReadFromIni(string path)

cs
	sourcePref.pivotY = iniData.Global["pivotY"].ToInt();
	sourcePref.shadow = iniData.Global["shadow"].ToInt();
	sourcePref.shadowX = iniData.Global["shadowX"].ToInt();
	sourcePref.shadowRX = -sourcePref.shadowX; 
	int num2 = (sourcePref.shadowRY = iniData.Global["shadowY"].ToInt()); 
	sourcePref.shadowY = num2; 
	sourcePref.shadowY = iniData.Global["shadowY"].ToInt(); 
	sourcePref.shadowRX = iniData.Global["shadowRX"].ToInt(); 
	sourcePref.shadowRY = iniData.Global["shadowRY"].ToInt(); 
	sourcePref.shadowBX = iniData.Global["shadowBX"].ToInt(); 
	sourcePref.shadowBY = iniData.Global["shadowBY"].ToInt(); 
	sourcePref.shadowBRX = iniData.Global["shadowBRX"].ToInt(); 
	sourcePref.shadowBRY = iniData.Global["shadowBRY"].ToInt(); 
	sourcePref.ints[3] = iniData.Global["height"].ToInt();
	sourcePref.ints[24] = iniData.Global["heightFix"].ToInt(); 
	sourcePref.scaleIcon = iniData.Global["scaleIcon"].ToInt();
	sourcePref.liquidMod = iniData.Global["liquidMod"].ToInt();
	sourcePref.liquidModMax = iniData.Global["liquidModMax"].ToInt(); 
	sourcePref.ints[23] = iniData.Global["hatY"].ToInt();
	sourcePref.equipX = iniData.Global["equipX"].ToInt(); 
	sourcePref.equipY = iniData.Global["equipY"].ToInt(); 
	sourcePref.ints[17] = iniData.Global["stackX"].ToInt(); 
	sourcePref.ints[1] = iniData.Global["flags"].ToInt();
	return sourcePref;
}

SpriteData

public class SpriteData

cs

	public Sprite[] sprites;

	public DateTime date; 
	public DateTime dateTex; 
	public DateTime dateIni; 
	public DateTime datePref; 

	public int frame = 1;

public void LoadAnimationIni()

cs
	{
		if (!File.Exists(path + ".ini"))
		{
			frame = 1; 
			scale = 50; 
			time = 0.2f; 
			return;
		}
		try
		{
			IniData iniData = new FileIniDataParser().ReadFile(path + ".ini", Encoding.UTF8);
			if (!int.TryParse(iniData.GetKey("frame") ?? "1", out frame)) 
			{ 
				frame = 1; 
			} 
			if (!int.TryParse(iniData.GetKey("scale") ?? "50", out scale)) 
			{ 
				scale = 50; 
			} 
			if (!float.TryParse(iniData.GetKey("time") ?? "0.2", out time)) 
			{ 
				time = 0.2f; 
			} 
			frame = Mathf.Max(1, (!int.TryParse(iniData.GetKey("frame"), out var result)) ? 1 : result); 
			scale = (int.TryParse(iniData.GetKey("scale"), out var result2) ? result2 : 50); 
			time = (float.TryParse(iniData.GetKey("time"), out var result3) ? Mathf.Max(0.016f, result3) : 0.2f); 
		}
		catch (Exception exception)
		{
			Debug.LogException(exception);
			frame = 1; 
			scale = 50; 
			time = 0.2f; 
		}
	}

	public Sprite[] GetSprites() 
	public void LoadSprites() 
	{
		Validate(); 
		return sprites; 
	} 
	public Sprite GetSprite() 
	{ 
		Validate(); 
		return sprites[0]; 
	} 
	public void Validate() 
	{ 
		DateTime lastWriteTime = File.GetLastWriteTime(path + ".png"); 
		if (date.Year == 1 || !(date == lastWriteTime)) 
		{ 
			Load(); 
			date = lastWriteTime; 
		} 
	} 
	public void Load() 
	{ 
		LoadPref(); 
		LoadAnimationIni(); 
		Texture2D texture2D = IO.LoadPNG(path + ".png");
		Debug.Log(texture2D.width + "/" + texture2D.height + "/" + path);
		if ((bool)tex)

public void Load()

cs
		}
		int num = tex.width / frame;
		int height = tex.height;
		sprites = new Sprite[frame]; 
		if (sprites == null || sprites.Length != frame) 
		{ 
			sprites = new Sprite[frame]; 
		} 
		Vector2 pivot = new Vector2(0.5f, 0.5f);
		for (int i = 0; i < frame; i++)
		{
			sprites[i] = Sprite.Create(tex, new Rect(i * num, 0f, num, height), pivot, 100f, 0u, SpriteMeshType.FullRect);
		}
	}
	public Sprite[] GetSprites() 
	{ 
		if (sprites == null) 
		{ 
			Load(); 
		} 
		return sprites; 
	} 
	public Sprite GetSprite() 
	{ 
		if (sprites == null) 
		{ 
			Load(); 
		} 
		return sprites.TryGet(0, returnNull: true); 
	} 
	public void Validate() 
	{ 
		if (IsDirty(".png", ref dateTex) || IsDirty(".ini", ref dateIni) || IsDirty(".pref", ref datePref)) 
		{ 
			Load(); 
		} 
		bool IsDirty(string p, ref DateTime lastChecked) 
		{ 
			string text = path + p; 
			if (!File.Exists(text)) 
			{ 
				return false; 
			} 
			DateTime lastWriteTimeUtc = File.GetLastWriteTimeUtc(text); 
			if (lastWriteTimeUtc == lastChecked) 
			{ 
				return false; 
			} 
			lastChecked = lastWriteTimeUtc; 
			return true; 
		} 
	} 
	public void Load() 
	{ 
		LoadAnimationIni(); 
		LoadPref(); 
		LoadSprites(); 
	} 
}

Thing

public override SourcePref Pref

cs
		get
		{
			SourcePref pref = trait.GetPref();
			if (pref == null) 
			if (pref != null) 
			{
				if (source.origin == null || source.pref.UsePref) 
				{ 
					return source.pref; 
				} 
				pref = source.origin.pref; 
				return pref; 
			}
			return pref; 
			CardRow cardRow = ((source.origin != null && !source.pref.UsePref) ? source.origin : source); 
			return cardRow.replacer.data?.pref ?? cardRow.pref; 
		}
	}

Trait

public void OnBarter(bool reroll = false)

cs
				break;
			case ShopType.Moyer:
			{
				for (int num14 = 1; num14 <= 20; num14++) 
				for (int num14 = 1; num14 <= 21; num14++) 
				{
					AddAdvWeek(num14);
				}

TraitAltar

public void OnOffer(Chara c, Thing t)

cs
		}
		if (Deity.id != EClass.pc.faith.id)
		{
			bool flag = EClass.rnd(EClass.pc.faith.GetOfferingValue(t, t.Num)) > EClass.rnd(200); 
			bool flag = EClass.rnd(EClass.pc.faith.GetOfferingValue(t, t.Num)) > EClass.rnd(200) || IsEyth; 
			if (GetParam(1) != null || EClass.pc.IsEyth)
			{
				Msg.Say("nothingHappens");

TraitBrewery

public override bool CanChildDecay(Card c)

cs

	public override bool OnChildDecay(Card c, bool firstDecay)
	{
		if (c.trait is TraitFoodFishSlice) 
		if (c.trait is TraitFoodFishSlice || c.HasElement(707)) 
		{
			return true;
		}

TraitMirror

public override void TrySetAct(ActPlan p)

cs
{
	p.TrySetAct("actDress", delegate
	{
		EClass.ui.AddLayer<LayerEditPCC>().Activate(EClass.pc, UIPCC.Mode.Body); 
		EClass.ui.AddLayer<LayerEditPCC>("LayerPCC/LayerEditPCC").Activate(EClass.pc, UIPCC.Mode.Body); 
		return false;
	}, owner);
	p.TrySetAct("actDress2", delegate
	{
		EClass.ui.AddLayer<LayerEditPCC>().Activate(EClass.pc, UIPCC.Mode.Extra); 
		EClass.ui.AddLayer<LayerEditPCC>("LayerPCC/LayerEditPCC").Activate(EClass.pc, UIPCC.Mode.Extra); 
		return false;
	}, owner);
}

UICharaMaker

public void RerollBio(bool keepParent)

cs

	public void EditPCC()
	{
		EMono.ui.AddLayer<LayerEditPCC>().Activate(chara, UIPCC.Mode.Body, null, delegate
		EMono.ui.AddLayer<LayerEditPCC>("LayerPCC/LayerEditPCC").Activate(chara, UIPCC.Mode.Body, null, delegate 
		{
			portrait.SetChara(chara);
			SetPortraitSlider();

+UIItemPCCPart

File Created
cs
using System;
using UnityEngine;
using UnityEngine.UI;

public class UIItemPCCPart : EMono
{
	public ButtonGeneral button;

	public Outline outline;

	[NonSerialized]
	public Sprite[] sprites = new Sprite[16];

	private bool _init;

	public void SetSpriteIndex(int dir, int frame)
	{
		if (_init)
		{
			button.icon.sprite = sprites[dir * 4 + frame];
		}
	}

	public void SetSprites(Texture2D texture)
	{
		int num = texture.width / 4;
		int num2 = texture.height / 4;
		for (int i = 0; i < 4; i++)
		{
			for (int j = 0; j < 4; j++)
			{
				int num3 = j * num;
				int num4 = (3 - i) * num2;
				Rect rect = new Rect(num3, num4, num, num2);
				sprites[i * 4 + j] = Sprite.Create(texture, rect, new Vector2(0.5f, 0.5f), 100f, 0u, SpriteMeshType.FullRect);
			}
		}
		_init = true;
	}
}

WindowChara

public void OnClickPortrait()

cs
{
	if (chara.IsPC)
	{
		EClass.ui.AddLayer<LayerEditPCC>().Activate(chara, UIPCC.Mode.Body, null, delegate
		EClass.ui.AddLayer<LayerEditPCC>("LayerPCC/LayerEditPCC").Activate(chara, UIPCC.Mode.Body, null, delegate 
		{
			portrait.SetChara(chara);
		});