Skip to content

EA 23.348 Nightly โ€‹

September 22, 2026

14 files modified. 1 new file created.

Important Changes โ€‹

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

LayerMod (4) โ€‹

cs
private void Move(BaseModPackage p, int a) 
private void Move(object row, int a) 
cs
private void MoveTo(BaseModPackage p, BaseModPackage target) 
private void MoveTo(object row, object target) 
cs
private UIList.Callback<ModPackage, ItemMod> CreateCallbacks(UIList target, bool builtin) 
private UIList.Callback<object, ItemMod> CreateCallbacks(UIList target, bool builtin) 
cs
private static string FitTitle(UIText text, string title) 
private static string FitTitle(UIText text, string title, string suffix = "") 

AI_Idle โ€‹

public override IEnumerable<Status> Run()

cs
	TryCast<ConGravity>(EffectId.Gravity, 300 + EClass.rnd(300));
	break;
case "buffHealer":
	TryCast(EffectId.Heal); 
	if (!owner.IsPCParty || owner.hp != owner.MaxHP) 
	{ 
		TryCast(EffectId.Heal); 
	} 
	break;
case "readBook":
{

ActEffect โ€‹

void AddCon<T>(int rate, int p2) where T : Condition

cs
bool flag4 = actRef.n1 == "special";
int num5 = -1;
string text = "";
bool notMeAgain = CC.HasTag(CTAG.notMeAgain); 
switch (actRef.n1)
{
case "shadow":

void AddCon<T>(int rate, int p2) where T : Condition

cs
	chara2 = CharaGen.CreateFromFilter(SpawnListChara.Get("summon_dragon", (SourceChara.Row r) => r.race == "dragon" || r.race == "drake" || r.race == "wyvern"), power / 5);
	break;
case "undead":
	chara2 = CharaGen.CreateFromFilter(SpawnListChara.Get("summon_undead", (SourceChara.Row r) => r.HasTag(CTAG.undead) || (EClass.sources.races.map.TryGetValue(r.race)?.IsUndead ?? false)), power / 5); 
	chara2 = CharaGen.CreateFromFilter(SpawnListChara.Get("summon_undead", (SourceChara.Row r) => (!notMeAgain || !(r.id == CC.id)) && (r.HasTag(CTAG.undead) || (EClass.sources.races.map.TryGetValue(r.race)?.IsUndead ?? false))), power / 5); 
	break;
case "pawn":
	chara2 = CharaGen.CreateFromFilter("c_pawn", power / 10);

AttackProcess โ€‹

public static void ProcAbility(Element e, Chara CC, Card TC, int bonus, bool subโ€ฆ)

cs
public bool Perform(int count, bool hasHit, float dmgMulti = 1f, bool maxRoll = false, bool subAttack = false)
{
	bool flag = CC.HasCondition<ConReload>();
	bool flag2 = CC.HasElement(486) && CC.IsPCFactionOrMinion; 
	bool flag2 = (CC.HasElement(486) || (weapon != null && weapon.HasElement(486))) && CC.IsPCFactionOrMinion; 
	hit = CalcHit();
	if (CC.id == "tsunami")
	{

CTAG โ€‹

public enum CTAG

cs
	noRide,
	ride,
	allowIngredient,
	nurse 
	nurse, 
	notMeAgain 
}

HomeResourceWorth โ€‹

public List<Thing> ListHeirloom()

cs
int num7 = branch.Evalue(3780) + branch.Evalue(3781) + branch.Evalue(3782) + branch.Evalue(3783) + branch.Evalue(3784);
num = (100 + num) * (100 + num7 * 15) / 100;
branch.tourism = (int)num;
list2.Sort((Thing a, Thing b) => GetPrice(b) - GetPrice(a)); 
foreach (Thing item3 in list2) 
{ 
	item3.sortVal = GetPrice(item3); 
} 
list2.Sort((Thing a, Thing b) => b.sortVal - a.sortVal); 
for (int num8 = 0; num8 < branch.NumHeirloom && num8 < list2.Count; num8++)
{
	list.Add(list2[num8]);

HotItemContext โ€‹

public static void Show(string id, Vector3 pos)

cs
if (id == "system")
{
	UIContextMenu uIContextMenu = m.AddChild("etc");
	uIContextMenu.AddButton("LayerFeedback".lang() + "(" + EInput.keys.report.key.ToString() + ")", delegate
	uIContextMenu.AddButton("LayerFeedback".lang() + " (" + EInput.keys.report.key.ToString() + ")", delegate // [!code ++]
	{
		EClass.ui.ToggleFeedback();
	});

ItemMod โ€‹

public class ItemMod : EMono

cs
public UIButton buttonToggle;

public UIButton buttonRename; 
public UIButton buttonDisband; 
public UIButton buttonColor; 
public Image imageActive;

public Image imageLock;

public Image imageGroup; 
public Widget.Config config;

public BaseModPackage package;

LayerMod โ€‹

public void OnPointerEnter(PointerEventData eventData)

cs
public GameObject infoSpace;

public Sprite spriteNoPreview; 
private UIButton buttonFilter;

private UIButton buttonCollapse; 
private Action<ModPackage, ItemMod> onInstantiate; 
private BaseModPackage panelTarget;

private float timerSearch;

public bool HasFilter

cs
	}
}

private void Move(BaseModPackage p, int a) 
private void Move(object row, int a) 
{
	List<object> items = list.items;
	int num = items.IndexOf(p); 
	int num = items.IndexOf(row); 
	if (a > 0 && row is ModGroup { collapsed: false } modGroup) 
	{ 
		a += Members(modGroup).Count; 
	} 
	if (num < 0 || num + a < 0 || num + a >= items.Count)
	{
		SE.BeepSmall();
		return; 
	}
	else
	object obj = items[num + a]; 
	ModGroup modGroup2; 
	bool num2; 
	if (!HasFilter && row is BaseModPackage baseModPackage) 
	{ 
		modGroup2 = (obj as BaseModPackage)?.group; 
		if (a <= 0) 
		{ 
			if (baseModPackage.group == null) 
			{ 
				num2 = modGroup2 != null; 
				goto IL_00b8; 
			} 
		} 
		else if (baseModPackage.group != null) 
		{ 
			num2 = modGroup2 != baseModPackage.group; 
			goto IL_00b8; 
		} 
	} 
	goto IL_00d2; 
	IL_00b8: 
	if (num2) 
	{
		MoveTo(p, items[num + a] as BaseModPackage); 
		baseModPackage.group = ((a > 0) ? null : modGroup2); 
		OnReorder(); 
		return; 
	}
	goto IL_00d2; 
	IL_00d2: 
	MoveTo(row, obj); 
}

private void MoveTo(BaseModPackage p, BaseModPackage target) 
private void MoveTo(object row, object target) 
{
	List<BaseModPackage> packages = manager.packages;
	int num = packages.IndexOf(p); 
	int num2 = ((target == null) ? (-1) : packages.IndexOf(target)); 
	if (num < 0 || num2 < 0 || num == num2 || target.builtin) 
	List<object> items = this.list.items; 
	ModGroup modGroup = row as ModGroup; 
	BaseModPackage baseModPackage = target as BaseModPackage; 
	ModGroup modGroup2 = (target as ModGroup) ?? ((modGroup == null) ? null : baseModPackage?.group); 
	if (target == null || target == row || (baseModPackage != null && baseModPackage.builtin) || (modGroup != null && modGroup == modGroup2)) 
	{ 
		SE.BeepSmall(); 
		RefreshLists(); 
		return; 
	} 
	bool flag = items.IndexOf(row) < items.IndexOf(target); 
	List<BaseModPackage> list = ((modGroup != null) ? Members(modGroup) : new List<BaseModPackage> { (BaseModPackage)row }); 
	if (list.Count == 0) 
	{
		SE.BeepSmall();
		RefreshLists(); 
		return;
	}
	packages.Move(p, num2 - num); 
	int num = packages.IndexOf(list[0]); 
	foreach (BaseModPackage item in list) 
	{ 
		packages.Remove(item); 
	} 
	bool flag2 = manager.emptyGroups.Contains(modGroup2); 
	bool flag3 = modGroup == null && flag && (flag2 || (modGroup2 != null && !modGroup2.collapsed)); 
	List<BaseModPackage> list2 = ((modGroup2 != null) ? Members(modGroup2) : null); 
	bool flag4 = flag && !flag3; 
	BaseModPackage baseModPackage2 = ((list2 == null) ? baseModPackage : ((list2.Count == 0) ? null : (flag4 ? list2[^1] : list2[0]))); 
	int num2 = ((baseModPackage2 != null) ? (packages.IndexOf(baseModPackage2) + (flag4 ? 1 : 0)) : (flag2 ? packages.Count : num)); 
	packages.InsertRange(num2, list); 
	ModGroup modGroup3 = ((modGroup != null) ? list[0].group : ((modGroup2 == null) ? baseModPackage.group : (flag3 ? modGroup2 : null))); 
	if (num2 == num && modGroup3 == list[0].group) 
	{ 
		SE.BeepSmall(); 
		RefreshLists(); 
	} 
	else
	{ 
		list[0].group = modGroup3; 
		OnReorder(); 
	} 
} 
private void OnReorder(bool restart = true) 
{ 
	SE.Tab();
	textRestart.SetActive(enable: true); 
	if (restart) 
	{ 
		textRestart.SetActive(enable: true); 
	} 
	manager.emptyGroups.RemoveAll((ModGroup g) => manager.packages.Any((BaseModPackage p) => p.group == g)); 
	ELayer.core.mods.SaveLoadOrder();
	RefreshLists();
}

public void RefreshLists()

cs
	{
		textNoResult.SetActive(HasFilter && list.items.Count == 0);
	}
	if ((bool)buttonCollapse) 
	{ 
		buttonCollapse.mainText.text = (Groups().Any((ModGroup g) => !g.collapsed) ? "mod_group_collapse_all" : "mod_group_expand_all").lang(); 
		windows[0].rectBottom.RebuildLayout(recursive: true); 
	} 
}

public override void OnInit()

public override void OnInit()

cs
	package.UpdateMeta(updateOnly: true);
	searchCache[package] = ModSearch.BuildText(package);
}
list.dragScrollView = GetComponentInChildren<UIScrollView>(); 
list.dragScrollView = list.GetComponentInParent<UIScrollView>(); 
list.dragViewport = windows[0].Rect();
list.onDragBegin = delegate(object row) 
{ 
	if (row is ModGroup g) 
	{ 
		SetMembersActive(g, active: false); 
	} 
}; 
onInstantiate = SetModRow; 
list.callbacks = CreateCallbacks(list, builtin: false);
list2.callbacks = CreateCallbacks(list2, builtin: true);
InitSearchUI();
windows[0].AddBottomButton("mod_preset", ShowPresetMenu);
windows[0].AddBottomButton("mod_group_new", NewGroup); 
buttonCollapse = windows[0].AddBottomButton("mod_group_collapse_all", CollapseAll); 
infoPreview.button1.SetOnClick(delegate
{
	ShowPreview(panelTarget);

public override void OnInit()

cs
	list.dragEdgeSize = list.callbacks.GetMold()?.Rect().sizeDelta.y ?? 34f;
}

private UIList.Callback<ModPackage, ItemMod> CreateCallbacks(UIList target, bool builtin) 
private UIList.Callback<object, ItemMod> CreateCallbacks(UIList target, bool builtin) 
{
	return new UIList.Callback<ModPackage, ItemMod> 
	return new UIList.Callback<object, ItemMod> 
	{
		onClick = delegate
		{
		},
		onInstantiate = delegate(ModPackage a, ItemMod b) 
		{ 
			b.package = a; 
			string title = ELayer.core.mods.packages.IndexOf(a) + 1 + ". " + (a.isInPackages ? "[Local] " : "") + a.title.IsEmpty(a.dirInfo.Name); 
			b.buttonActivate.mainText.SetText(FitTitle(b.buttonActivate.mainText, title), (!a.IsValidVersion() || a.blockedBy != null || !a.langDepError.IsEmpty()) ? FontColor.Bad : (a.activated ? FontColor.ButtonGeneral : FontColor.Passive)); 
			b.buttonActivate.subText.text = a.version; 
			b.buttonLock.mainText.text = a.author; 
			b.buttonUp.SetActive(!a.builtin); 
			b.buttonDown.SetActive(!a.builtin); 
			b.buttonToggle.SetToggle(a.willActivate); 
			b.buttonUp.SetOnClick(delegate
			{ 
				Move(a, -1); 
			}); 
			b.buttonDown.SetOnClick(delegate
			{ 
				Move(a, 1); 
			}); 
			b.buttonActivate.GetOrCreate<HoverRelay>().onEnter = delegate
		onInstantiate = delegate(object row, ItemMod b) 
		{ 
			if (row is ModGroup g) 
			{
				ShowInfo(a); 
			}; 
			UIButton bt = b.buttonToggle; 
			bt.SetOnClick(delegate
				SetGroupRow(g, b); 
			} 
			else 
			{
				a.willActivate = !a.willActivate; 
				bt.SetToggle(a.willActivate); 
				ELayer.core.mods.SaveLoadOrder(); 
				textRestart.SetActive(enable: true); 
			}); 
			bt.interactable = !a.builtin; 
			b.buttonActivate.onClick.AddListener(delegate
				onInstantiate((ModPackage)row, b); 
			} 
		}, 
		onList = delegate
		{ 
			ModGroup modGroup = null; 
			foreach (BaseModPackage package in manager.packages) 
			{
				Refresh(); 
				UIContextMenu uIContextMenu = ELayer.ui.CreateContextMenuInteraction(); 
				if (!a.builtin) 
				if (package.builtin == builtin && (builtin || Match(package))) 
				{
					if (ELayer.debug.enable || (!BaseCore.IsOffline && a.isInPackages && !ELayer.core.version.demo)) 
					{ 
						uIContextMenu.AddButton("mod_publish", delegate
						{ 
							Core.TryWarnUpload(delegate
							{ 
								Dialog.YesNo("mod_publish_warn".lang(a.title, a.id, a.author), delegate
								{ 
									ELayer.core.steam.CreateUserContent(a); 
								}); 
							}); 
						}); 
					} 
					uIContextMenu.AddButton(a.willActivate ? "mod_deactivate" : "mod_activate", delegate
					{ 
						SE.Click(); 
						a.willActivate = !a.willActivate; 
						ELayer.core.mods.SaveLoadOrder(); 
						RefreshLists(); 
						textRestart.SetActive(enable: true); 
					}); 
					if (!a.isInPackages && !a.workshopId.IsEmpty()) 
					if (!HasFilter && package.group != modGroup) 
					{
						uIContextMenu.AddButton("mod_convert_local", delegate
						modGroup = package.group; 
						if (modGroup != null) 
						{
							SE.Click(); 
							string path = ("Mod_" + a.workshopId + "_" + a.id).SanitizeDirectoryName(); 
							string text = Path.Combine(BaseModManager.rootMod, path); 
							a.CopyContentTo(text); 
							ModPackage modPackage = manager.AddPackage(new DirectoryInfo(text), isInPackages: true); 
							modPackage.UpdateMeta(updateOnly: true); 
							searchCache[modPackage] = ModSearch.BuildText(modPackage); 
							manager.packages.Move(modPackage, manager.packages.IndexOf(a) - manager.packages.Count + 2); 
							modPackage.willActivate = false; 
							modPackage.activated = false; 
							ELayer.core.mods.SaveLoadOrder(); 
							RefreshLists(); 
							textRestart.SetActive(enable: true); 
						}); 
							target.Add(modGroup); 
						} 
					}
					if (a.isInPackages && a.IsSourceLocalizable) 
					if (HasFilter || modGroup == null || !modGroup.collapsed) 
					{
						uIContextMenu.AddButton("mod_export_text", delegate
						{ 
							SE.Click(); 
							string text = a.UpdateSourceLocalizationFile(Lang.langCode, force: true); 
							ELayer.ui.Say(text); 
						}); 
						target.Add(package); 
					}
				}
				if (ModPreview.FindPreviewFile(a) != null || (bool)SteamPreview(a)) 
			} 
			if (!builtin && !HasFilter) 
			{ 
				target.AddCollection(manager.emptyGroups); 
			} 
		}, 
		onRefresh = Refresh, 
		onDragReorder = delegate(object row, int a) 
		{ 
			if (row is ModGroup g) 
			{ 
				SetMembersActive(g, active: true); 
			} 
			if (a != 0) 
			{ 
				List<object> items = target.items; 
				int num = items.IndexOf(row); 
				MoveTo(row, items[Mathf.Clamp(num + a, 0, items.Count - 1)]); 
			} 
		}, 
		canDragReorder = (object row) => !(row is BaseModPackage baseModPackage) || !baseModPackage.builtin 
	}; 
} 
private void SetModRow(ModPackage a, ItemMod b) 
{ 
	b.package = a; 
	string title = ((a.group != null && !HasFilter) ? "   " : "") + (ELayer.core.mods.packages.IndexOf(a) + 1) + ". " + (a.isInPackages ? "[Local] " : "") + a.title.IsEmpty(a.dirInfo.Name); 
	b.buttonActivate.mainText.SetText(FitTitle(b.buttonActivate.mainText, title), (!a.IsValidVersion() || a.blockedBy != null || !a.langDepError.IsEmpty()) ? FontColor.Bad : (a.activated ? FontColor.ButtonGeneral : FontColor.Passive)); 
	b.buttonActivate.subText.text = a.version; 
	b.buttonLock.mainText.text = a.author; 
	b.buttonUp.SetActive(!a.builtin); 
	b.buttonDown.SetActive(!a.builtin); 
	b.buttonToggle.SetToggle(a.willActivate); 
	b.buttonUp.SetOnClick(delegate
	{ 
		Move(a, -1); 
	}); 
	b.buttonDown.SetOnClick(delegate
	{ 
		Move(a, 1); 
	}); 
	b.buttonActivate.GetOrCreate<HoverRelay>().onEnter = delegate
	{ 
		ShowInfo(a); 
	}; 
	UIButton bt = b.buttonToggle; 
	bt.SetOnClick(delegate
	{ 
		a.willActivate = !a.willActivate; 
		bt.SetCheck(a.willActivate); 
		ELayer.core.mods.SaveLoadOrder(); 
		textRestart.SetActive(enable: true); 
		if (a.group != null && !HasFilter) 
		{ 
			SetGroupRow(a.group, list.GetPair<ItemMod>(a.group)); 
		} 
	}); 
	bt.interactable = !a.builtin; 
	b.buttonActivate.onClick.AddListener(delegate
	{ 
		Refresh(); 
		UIContextMenu uIContextMenu = ELayer.ui.CreateContextMenuInteraction(); 
		if (!a.builtin) 
		{ 
			if (ELayer.debug.enable || (!BaseCore.IsOffline && a.isInPackages && !ELayer.core.version.demo)) 
			{ 
				uIContextMenu.AddButton("mod_publish", delegate
				{
					uIContextMenu.AddButton("mod_preview", delegate
					Core.TryWarnUpload(delegate 
					{
						ShowPreview(a); 
						Dialog.YesNo("mod_publish_warn".lang(a.title, a.id, a.author), delegate
						{ 
							ELayer.core.steam.CreateUserContent(a); 
						}); 
					});
				} 
				if (!a.workshopId.IsEmpty()) 
				}); 
			} 
			uIContextMenu.AddButton(a.willActivate ? "mod_deactivate" : "mod_activate", delegate
			{ 
				SE.Click(); 
				a.willActivate = !a.willActivate; 
				ELayer.core.mods.SaveLoadOrder(); 
				RefreshLists(); 
				textRestart.SetActive(enable: true); 
			}); 
			if (!a.isInPackages && !a.workshopId.IsEmpty()) 
			{ 
				uIContextMenu.AddButton("mod_convert_local", delegate
				{
					uIContextMenu.AddButton("mod_info_workshop", delegate
					{ 
						SE.Click(); 
						Application.OpenURL("https://steamcommunity.com/sharedfiles/filedetails/?id=" + a.workshopId.Trim()); 
					}); 
				} 
				uIContextMenu.AddButton("mod_info", delegate
					SE.Click(); 
					string path = ("Mod_" + a.workshopId + "_" + a.id).SanitizeDirectoryName(); 
					string text = Path.Combine(BaseModManager.rootMod, path); 
					a.CopyContentTo(text); 
					ModPackage modPackage = manager.AddPackage(new DirectoryInfo(text), isInPackages: true); 
					modPackage.UpdateMeta(updateOnly: true); 
					searchCache[modPackage] = ModSearch.BuildText(modPackage); 
					manager.packages.Move(modPackage, manager.packages.IndexOf(a) - manager.packages.Count + 2); 
					modPackage.group = a.group; 
					modPackage.willActivate = false; 
					modPackage.activated = false; 
					ELayer.core.mods.SaveLoadOrder(); 
					RefreshLists(); 
					textRestart.SetActive(enable: true); 
				}); 
			} 
			if (a.isInPackages && a.IsSourceLocalizable) 
			{ 
				uIContextMenu.AddButton("mod_export_text", delegate
				{
					SE.Click();
					if (!a.dirInfo.Exists) 
					{ 
						SE.BeepSmall(); 
						ELayer.ui.Say(a.dirInfo.FullName); 
					} 
					else
					{ 
						string text = a.dirInfo.FullName + "/package.xml"; 
						Util.ShowExplorer(File.Exists(text) ? text : a.dirInfo.FullName); 
					} 
					string text = a.UpdateSourceLocalizationFile(Lang.langCode, force: true); 
					ELayer.ui.Say(text); 
				});
				uIContextMenu.Show(); 
			} 
			AddGroupButtons(uIContextMenu, a); 
		} 
		if (ModPreview.FindPreviewFile(a) != null || (bool)SteamPreview(a)) 
		{ 
			uIContextMenu.AddButton("mod_preview", delegate
			{ 
				ShowPreview(a); 
			});
			b.buttonLock.onClick.AddListener(Refresh); 
		}, 
		onList = delegate
		} 
		if (!a.workshopId.IsEmpty()) 
		{
			foreach (BaseModPackage package in manager.packages) 
			uIContextMenu.AddButton("mod_info_workshop", delegate
			{
				if (package.builtin == builtin && (builtin || Match(package))) 
				{ 
					target.Add(package); 
				} 
				SE.Click(); 
				Application.OpenURL("https://steamcommunity.com/sharedfiles/filedetails/?id=" + a.workshopId.Trim()); 
			}); 
		} 
		if (!a.id.IsEmpty()) 
		{ 
			uIContextMenu.AddButton("mod_id_copy", delegate
			{ 
				SE.Click(); 
				GUIUtility.systemCopyBuffer = a.id; 
				ELayer.ui.Say("mod_id_copied".lang(a.id)); 
			}); 
		} 
		uIContextMenu.AddButton("mod_info", delegate
		{ 
			SE.Click(); 
			if (!a.dirInfo.Exists) 
			{ 
				SE.BeepSmall(); 
				ELayer.ui.Say(a.dirInfo.FullName); 
			}
		}, 
		onRefresh = Refresh, 
		onDragReorder = delegate(ModPackage p, int a) 
			else 
			{ 
				string text = a.dirInfo.FullName + "/package.xml"; 
				Util.ShowExplorer(File.Exists(text) ? text : a.dirInfo.FullName); 
			} 
		}); 
		uIContextMenu.Show(); 
	}); 
	b.buttonLock.onClick.AddListener(Refresh); 
} 
private List<BaseModPackage> Members(ModGroup g) 
{ 
	return manager.packages.Where((BaseModPackage p) => p.group == g).ToList(); 
} 
private IEnumerable<ModGroup> Groups() 
{ 
	return (from p in manager.packages 
		select p.@group into g 
		where g != null
		select g).Distinct().Concat(manager.emptyGroups); 
} 
private void SetMembersActive(ModGroup g, bool active) 
{ 
	if (g.collapsed) 
	{ 
		return; 
	} 
	foreach (BaseModPackage item in Members(g)) 
	{ 
		list.GetPair(item).component.SetActive(active); 
	} 
} 
private void NewGroup() 
{ 
	if (ModManager.disableMod) 
	{ 
		SE.BeepSmall(); 
		return; 
	} 
	SE.Click(); 
	InputGroupName("mod_group_default_name".lang(), delegate(string name) 
	{ 
		if (HasFilter) 
		{
			BaseCore.Instance.FreezeScreen(0.1f); 
			List<object> items = target.items; 
			int num = items.IndexOf(p); 
			MoveTo(p, items[Mathf.Clamp(num + a, 0, items.Count - 1)] as BaseModPackage); 
		}, 
		canDragReorder = (ModPackage p) => !p.builtin 
	}; 
			ClearSearch(); 
		} 
		ModGroup item = new ModGroup
		{ 
			name = name 
		}; 
		manager.emptyGroups.Add(item); 
		OnReorder(restart: false); 
		list.dragScrollView.content.RebuildLayout(recursive: true); 
		list.dragScrollView.verticalNormalizedPosition = 0f; 
	}); 
} 
private void SetGroupRow(ModGroup g, ItemMod b) 
{ 
	List<BaseModPackage> members = Members(g); 
	int on = members.Count((BaseModPackage p) => p.willActivate); 
	string title = (g.collapsed ? "[+] " : "[-] ") + g.name; 
	UIText mainText = b.buttonActivate.mainText; 
	mainText.fontStyle = FontStyle.Bold; 
	mainText.SetText(FitTitle(mainText, title, " (" + on + "/" + members.Count + ")"), FontColor.Topic); 
	Color topic = mainText.color; 
	Color? color = g.color; 
	if (color.HasValue) 
	{ 
		Color valueOrDefault = color.GetValueOrDefault(); 
		mainText.SetText(mainText.text, valueOrDefault.Multiply(0.45f, 0f)); 
	} 
	b.imageGroup.SetActive(enable: true); 
	b.imageGroup.color = (g.color ?? topic).SetAlpha(0.4f); 
	b.buttonActivate.subText.text = ""; 
	b.buttonLock.mainText.text = ""; 
	b.buttonUp.SetOnClick(delegate
	{ 
		Move(g, -1); 
	}); 
	b.buttonDown.SetOnClick(delegate
	{ 
		Move(g, 1); 
	}); 
	b.buttonToggle.SetToggle(on > 0 && on == members.Count); 
	b.buttonToggle.interactable = members.Count > 0; 
	b.buttonToggle.SetOnClick(delegate
	{ 
		foreach (BaseModPackage item in members) 
		{ 
			item.willActivate = on != members.Count; 
		} 
		OnReorder(); 
	}); 
	b.buttonActivate.SetOnClick(delegate
	{ 
		g.collapsed = !g.collapsed; 
		OnReorder(restart: false); 
	}); 
	b.buttonRename.SetActive(enable: true); 
	b.buttonRename.SetOnClick(delegate
	{ 
		InputGroupName(g.name, delegate(string name) 
		{ 
			g.name = name; 
			OnReorder(restart: false); 
		}); 
	}); 
	b.buttonColor.SetActive(enable: true); 
	b.buttonColor.SetOnClick(delegate
	{ 
		ELayer.ui.AddLayer<LayerColorPicker>().SetColor(g.color ?? topic, topic, delegate(PickerState state, Color c) 
		{ 
			c.a = topic.a; 
			g.color = ((c == topic) ? ((Color?)null) : new Color?(c)); 
			if (state == PickerState.Confirm) 
			{ 
				OnReorder(restart: false); 
			} 
			else
			{ 
				SetGroupRow(g, b); 
			} 
		}); 
	}); 
	b.buttonDisband.SetActive(enable: true); 
	b.buttonDisband.SetOnClick(delegate
	{ 
		foreach (BaseModPackage item2 in members) 
		{ 
			item2.group = null; 
		} 
		manager.emptyGroups.Remove(g); 
		OnReorder(restart: false); 
	}); 
} 
private void AddGroupButtons(UIContextMenu m, BaseModPackage a) 
{ 
	m.AddButton("mod_group_new", delegate
	{ 
		InputGroupName("mod_group_default_name".lang(), delegate(string name) 
		{ 
			SetGroup(a, new ModGroup
			{ 
				name = name 
			}); 
		}); 
	}); 
	List<ModGroup> groups = (from g in Groups() 
		where g != a.@group 
		select g).ToList(); 
	if (groups.Count > 0) 
	{ 
		m.AddButton("mod_group_move", delegate
		{ 
			SE.Click(); 
			Dialog.List("mod_group_select", groups, (ModGroup g) => g.name, delegate(int i, string _) 
			{ 
				SetGroup(a, groups[i]); 
				return true; 
			}, canCancel: true); 
		}); 
	} 
	if (a.group != null) 
	{ 
		m.AddButton("mod_group_remove", delegate
		{ 
			SetGroup(a, null); 
		}); 
	} 
} 
private void SetGroup(BaseModPackage p, ModGroup g) 
{ 
	if (HasFilter) 
	{ 
		ClearSearch(); 
	} 
	List<BaseModPackage> packages = manager.packages; 
	ModGroup host = ((g != null && packages.Any((BaseModPackage m) => m.group == g)) ? g : p.group); 
	BaseModPackage baseModPackage = ((host == null) ? null : packages.LastOrDefault((BaseModPackage m) => m != p && m.group == host)); 
	if (baseModPackage != null) 
	{ 
		packages.Remove(p); 
		packages.Insert(packages.IndexOf(baseModPackage) + 1, p); 
	} 
	p.group = g; 
	if (g != null) 
	{ 
		g.collapsed = false; 
	} 
	OnReorder(); 
} 
private void CollapseAll() 
{ 
	List<ModGroup> list = Groups().ToList(); 
	if (list.Count == 0) 
	{ 
		SE.BeepSmall(); 
		return; 
	} 
	bool collapsed = list.Any((ModGroup g) => !g.collapsed); 
	foreach (ModGroup item in list) 
	{ 
		item.collapsed = collapsed; 
	} 
	OnReorder(restart: false); 
} 
private void InputGroupName(string text, Action<string> onInput) 
{ 
	Dialog.InputName("mod_group_name", text, delegate(bool cancel, string s) 
	{ 
		if (!cancel) 
		{ 
			string text2 = (s ?? "").Trim(); 
			if (text2.IsEmpty()) 
			{ 
				SE.BeepSmall(); 
			} 
			else
			{ 
				onInput(text2); 
			} 
		} 
	}); 
}

private static string FitTitle(UIText text, string title) 
private static string FitTitle(UIText text, string title, string suffix = "") 
{
	TextGenerationSettings generationSettings = text.GetGenerationSettings(Vector2.zero);
	TextGenerator cachedTextGeneratorForLayout = text.cachedTextGeneratorForLayout;
	float num = text.rectTransform.rect.width * text.pixelsPerUnit;
	if (cachedTextGeneratorForLayout.GetPreferredWidth(title, generationSettings) <= num) 
	if (cachedTextGeneratorForLayout.GetPreferredWidth(title + suffix, generationSettings) <= num) 
	{
		return title; 
		return title + suffix; 
	}
	int num2 = title.Length;
	while (num2 > 1 && cachedTextGeneratorForLayout.GetPreferredWidth(title[..num2].TrimEnd() + "..", generationSettings) > num) 
	while (num2 > 1 && cachedTextGeneratorForLayout.GetPreferredWidth(title[..num2].TrimEnd() + ".." + suffix, generationSettings) > num) 
	{
		num2--;
	}
	return title[..num2].TrimEnd() + ".."; 
	return title[..num2].TrimEnd() + ".." + suffix; 
}

private bool Match(BaseModPackage p)

private static Texture2D SteamPreview(BaseModPackage p)

cs
private BaseModPackage FirstInfoTarget()
{
	using (List<object>.Enumerator enumerator = list.items.GetEnumerator()) 
	{ 
		if (enumerator.MoveNext()) 
		{ 
			return enumerator.Current as BaseModPackage; 
		} 
	} 
	if (manager.packages.Count <= 0) 
	{ 
		return null; 
	} 
	return manager.packages[0]; 
	return list.items.OfType<BaseModPackage>().FirstOrDefault() ?? manager.packages.FirstOrDefault(); 
}

private void ShowInfo(BaseModPackage p)
{
	if (p != null && p != panelTarget) 
	if (p == null || p == panelTarget) 
	{
		panelTarget = p; 
		infoTitle.text1.SetText(p.title.IsEmpty(p.dirInfo.Name)); 
		PreviewEntry thumb = GetThumb(p); 
		infoPreview.SetActive(thumb.sprite); 
		if ((bool)thumb.sprite) 
		{ 
			infoPreview.image1.sprite = thumb.sprite; 
		} 
		SetInfo(value: (thumb.sprite ? ((thumb.kind == ModPreview.PreviewType.Gif) ? "mod_preview_gif" : null) : ((thumb.kind == ModPreview.PreviewType.None) ? "mod_preview_none" : "mod_preview_unsupported"))?.lang(), item: infoPreviewNote); 
		SetTopic(infoAuthor, p.author, null); 
		SetTopic(infoVersion, p.version, null); 
		SetTopic(infoId, p.id, null); 
		string text = ModLoadOrderPreset.WorkshopId(p); 
		SetTopic(infoWorkshop, text.IsEmpty() ? p.dirInfo.Name : text, text.IsEmpty() ? "mod_filter_local" : "mod_filter_workshop"); 
		SetTopic(infoStatus, (!p.builtin && !p.willActivate) ? "mod_filter_disabled".lang() : null, null); 
		List<string> list = new List<string>(); 
		if (p.blockedBy != null) 
		{ 
			list.Add("mod_info_blocked".lang(p.blockedBy.title.IsEmpty(p.blockedBy.id))); 
		} 
		if (!p.langDepError.IsEmpty()) 
		{ 
			string[] array = p.langDepError.Split('\t'); 
			list.Add(array[0].lang(string.Join("mod_info_or".lang(), array, 1, array.Length - 1))); 
		} 
		if (p.duplicateOf != null) 
		{ 
			list.Add("mod_info_duplicate".lang(p.duplicateOf.title.IsEmpty(p.duplicateOf.dirInfo?.Name).IsEmpty(p.duplicateOf.id))); 
		} 
		if (!p.IsValidVersion()) 
		{ 
			list.Add("mod_info_old_version".lang(p.version, ELayer.core.versionMod.GetText())); 
		} 
		if (!p.parseError.IsEmpty()) 
		return; 
	} 
	panelTarget = p; 
	UIText text = infoTitle.text1; 
	text.SetText(p.title.IsEmpty(p.dirInfo.Name)); 
	TextGenerationSettings generationSettings = text.GetGenerationSettings(new Vector2(text.rectTransform.rect.width, 0f)); 
	generationSettings.horizontalOverflow = HorizontalWrapMode.Wrap; 
	TextGenerator cachedTextGeneratorForLayout = text.cachedTextGeneratorForLayout; 
	cachedTextGeneratorForLayout.Populate(text.text, generationSettings); 
	if (cachedTextGeneratorForLayout.lineCount < 2) 
	{ 
		text.text += "\n"; 
	} 
	if (cachedTextGeneratorForLayout.lineCount > 2) 
	{ 
		string text2 = text.text; 
		int num = cachedTextGeneratorForLayout.lines[2].startCharIdx; 
		do
		{
			list.Add("mod_info_parse_error".lang(p.parseError)); 
			int length = --num - 0; 
			string str = (text.text = text2.Substring(0, length).TrimEnd() + ".."); 
			cachedTextGeneratorForLayout.Populate(str, generationSettings); 
		}
		SetInfo(infoProblems, string.Join("\n", list)); 
		UIItem item = infoTags; 
		string[] tags = p.tags; 
		SetTopic(item, (tags != null && tags.Length > 0) ? string.Join(", ", p.tags) : null, null); 
		SetTopic(infoRequires, IdList(p.dependency, alternatives: true), null); 
		SetTopic(infoIncompatible, IdList(p.incompatible, alternatives: false), null); 
		SetTopic(infoLoadAfter, IdList(p.loadAfter, alternatives: false), null); 
		SetTopic(infoLoadBefore, IdList(p.loadBefore, alternatives: false), null); 
		infoSpace.SetActive(!p.description.IsEmpty()); 
		SetInfo(infoDescription, p.description); 
		panelNote.Build(); 
		panelScroll.content.anchoredPosition = Vector2.zero; 
		while (num > 1 && cachedTextGeneratorForLayout.lineCount > 2); 
	} 
	PreviewEntry thumb = GetThumb(p); 
	infoPreview.SetActive(enable: true); 
	infoPreview.image1.sprite = thumb.sprite ?? spriteNoPreview; 
	SetTopic(infoAuthor, p.author.IsEmpty("-"), null); 
	SetTopic(infoVersion, p.version.IsEmpty("-"), null); 
	SetTopic(infoId, p.id, null); 
	string text4 = ModLoadOrderPreset.WorkshopId(p); 
	SetTopic(infoWorkshop, text4.IsEmpty() ? p.dirInfo.Name : text4, text4.IsEmpty() ? "mod_filter_local" : "mod_filter_workshop"); 
	SetTopic(infoStatus, (!p.builtin && !p.willActivate) ? "mod_filter_disabled".lang() : null, null); 
	List<string> list = new List<string>(); 
	if (p.blockedBy != null) 
	{ 
		list.Add("mod_info_blocked".lang(p.blockedBy.title.IsEmpty(p.blockedBy.id))); 
	} 
	if (!p.langDepError.IsEmpty()) 
	{ 
		string[] array = p.langDepError.Split('\t'); 
		list.Add(array[0].lang(string.Join("mod_info_or".lang(), array, 1, array.Length - 1))); 
	} 
	if (p.duplicateOf != null) 
	{ 
		list.Add("mod_info_duplicate".lang(p.duplicateOf.title.IsEmpty(p.duplicateOf.dirInfo?.Name).IsEmpty(p.duplicateOf.id))); 
	} 
	if (!p.IsValidVersion()) 
	{ 
		list.Add("mod_info_old_version".lang(p.version, ELayer.core.versionMod.GetText())); 
	} 
	if (!p.parseError.IsEmpty()) 
	{ 
		list.Add("mod_info_parse_error".lang(p.parseError)); 
	}
	SetInfo(infoProblems, string.Join("\n", list)); 
	UIItem item = infoTags; 
	string[] tags = p.tags; 
	SetTopic(item, (tags != null && tags.Length > 0) ? string.Join(", ", p.tags) : null, null); 
	SetTopic(infoRequires, IdList(p.dependency, alternatives: true), null); 
	SetTopic(infoIncompatible, IdList(p.incompatible, alternatives: false), null); 
	SetTopic(infoLoadAfter, IdList(p.loadAfter, alternatives: false), null); 
	SetTopic(infoLoadBefore, IdList(p.loadBefore, alternatives: false), null); 
	infoSpace.SetActive(!p.description.IsEmpty()); 
	SetInfo(infoDescription, p.description); 
	panelNote.Build(); 
	panelScroll.content.anchoredPosition = Vector2.zero; 
	static string IdList(string[][] rows, bool alternatives)
	{
		if (rows == null)

ModManager โ€‹

public WorkshopDownload(BaseModPackage package, float now)

cs
public List<FileInfo> replaceFiles = new List<FileInfo>();

public readonly List<ModGroup> emptyGroups = new List<ModGroup>(); 
private HashSet<ulong> _subscribedItems;

private readonly HashSet<ulong> _blockedItems = new HashSet<ulong>();

public static string FormatLoadOrder(BaseModPackage p)

cs
public void SaveLoadOrder()
{
	SplitGroups(); 
	if (disableMod)
	{
		return;
	}
	List<string> list = new List<string>();
	ModGroup modGroup = null; 
	foreach (BaseModPackage package in packages)
	{
		string str = package.dirInfo?.FullName;
		if (!package.builtin && !str.IsEmpty()) 
		if (package.builtin || str.IsEmpty()) 
		{
			list.Add(FormatLoadOrder(package)); 
			continue; 
		} 
		string text = FormatLoadOrder(package); 
		if (!text.IsEmpty()) 
		{ 
			if (package.group != modGroup) 
			{ 
				modGroup = package.group; 
				list.Add(modGroup?.ToString() ?? "#group"); 
			} 
			list.Add(text); 
		}
	}
	list.AddRange(emptyGroups.Select((ModGroup g) => g.ToString())); 
	File.WriteAllLines(CorePath.PathLoadOrder, list);
}

public void SplitGroups() 
{ 
	HashSet<ModGroup> hashSet = new HashSet<ModGroup>(); 
	ModGroup modGroup = null; 
	ModGroup modGroup2 = null; 
	foreach (BaseModPackage package in packages) 
	{ 
		if (package.group != modGroup) 
		{ 
			modGroup = package.group; 
			modGroup2 = ((modGroup == null || hashSet.Add(modGroup)) ? modGroup : modGroup.Clone()); 
		} 
		package.group = modGroup2; 
	} 
} 
public void LoadLoadOrder()
{
	emptyGroups.Clear(); 
	foreach (BaseModPackage package in packages)
	{
		package.orderIndex = -1;
		package.group = null; 
	}
	string pathLoadOrder = CorePath.PathLoadOrder;
	if (!File.Exists(pathLoadOrder))

public void LoadLoadOrder()

cs
	}
}
int num = 0;
int num2 = 0; 
ModGroup modGroup = null; 
HashSet<BaseModPackage> hashSet = new HashSet<BaseModPackage>();
string[] array = File.ReadAllLines(pathLoadOrder); 
for (int i = 0; i < array.Length; i++) 
foreach (string item in File.ReadAllLines(pathLoadOrder).Append("#group")) 
{
	if (ParseLoadOrderLine(array[i], out var path, out var activate, out var id)) 
	string path; 
	bool activate; 
	string id; 
	if (ModGroup.TryParse(item, out var group)) 
	{ 
		if (modGroup != null && num2 == 0) 
		{ 
			emptyGroups.Add(modGroup); 
		} 
		modGroup = group; 
		num2 = 0; 
	} 
	else if (ParseLoadOrderLine(item, out path, out activate, out id)) 
	{
		num2++; 
		if (!dictionary.TryGetValue(NormalizeOrderPath(path), out var value))
		{
			dictionary2.TryGetValue(BaseModPackage.NormalizeId(id) ?? "", out value);

public void LoadLoadOrder()

cs
	{
		value.orderIndex = num;
		value.willActivate = activate;
		value.group = modGroup; 
		num++;
	}
}

static bool ParseLoadOrderLine(string line, out string reference, out bool referโ€ฆ)

cs
{
	return false;
}
int num2 = line.LastIndexOf(','); 
if (num2 <= 0) 
int num3 = line.LastIndexOf(','); 
if (num3 <= 0) 
{
	return false;
}
string text3 = line[(num2 + 1)..].Trim(); 
string text3 = line[(num3 + 1)..].Trim(); 
if (text3 == "0" || text3 == "1")
{
	reference = line[..num2]; 
	reference = line[..num3]; 
	reference2 = text3 == "1";
	return !reference.IsEmpty();
}
int num3 = line.LastIndexOf(',', num2 - 1); 
if (num3 <= 0) 
int num4 = line.LastIndexOf(',', num3 - 1); 
if (num4 <= 0) 
{
	return false;
}
string text4 = line[(num3 + 1)..num2].Trim(); 
string text4 = line[(num4 + 1)..num3].Trim(); 
if (text4 != "0" && text4 != "1")
{
	return false;
}
reference = line[..num3]; 
reference = line[..num4]; 
reference2 = text4 == "1";
reference3 = text3;
return !reference.IsEmpty();

private void SortPackages()

cs
	}
	packages.Clear();
	packages.AddRange(list);
	SplitGroups(); 
}

private void MapActivatedPackages()

SourceImporter โ€‹

public static void HotInit(IEnumerable<SourceData> sourceData)

cs
{
	EClass.sources.floors.OnAfterInit();
}
if (list.Contains(EClass.sources.things) || list.Contains(EClass.sources.charas)) 
if (list.Any((SourceData s) => s == EClass.sources.things || s == EClass.sources.charas || s is SourceThingV)) 
{
	EClass.sources.things.Init(); 
	EClass.sources.charas.Init(); 
	EClass.sources.cards.Init();
}
if (list.Any((SourceData s) => s == EClass.sources.blocks || s == EClass.sources.floors || s == EClass.sources.objs || s == EClass.sources.decos || s == EClass.sources.cellEffects))

SourceThingV โ€‹

public override void OnAfterImportData()

cs
		array[4].ToInt()
	});
	break;
case "colortype":
	row.colorType = ((array[1] == "none") ? "" : array[1]); 
	break; 
case "skin":
{
	string[] array3 = array[1].Split('|');

UIInventory โ€‹

public void Sort(bool redraw = true)

cs
bool flag2 = false;
for (int i = 0; i < orCreate.Count; i++)
{
	if (item.TryStackTo(orCreate[i])) 
	if (orCreate[i].TryStackTo(item)) 
	{
		orCreate[i] = item; 
		flag2 = true;
		break;
	}
	if (orCreate[i].TryStackTo(item)) 
	if (item.TryStackTo(orCreate[i])) 
	{
		orCreate[i] = item; 
		flag2 = true;
		break;
	}

WidgetDate โ€‹

public void _Refresh()

cs
}
if (EMono._zone.isPeace)
{
	text += "zone_peace".lang().TagColor(colorFestival); 
	text = text + " " + "zone_peace".lang().TagColor(colorFestival); 
}
if (EMono.debug.showExtra)
{

WindowChara โ€‹

public static void RefreshNote(Chara chara, UINote n, bool shortMode = false)

cs
		foreach (Chara item in list)
		{
			Date date = Date.ToDate(item.c_love.dateMarriage);
			AddText("item_marriage".lang(item.NameBraced, date.year.ToString() ?? "", date.month.ToString() ?? "", item.c_love.nameZoneMarriage, date.day.ToString() ?? "") + (item.c_love.IsWed ? "already_wed".lang() : "")); 
			AddText("item_marriage".lang(item.NameBraced, date.year.ToString() ?? "", date.month.ToString() ?? "", item.c_love.nameZoneMarriage, date.day.ToString() ?? "") + " " + (item.c_love.IsWed ? "already_wed".lang() : "")); 
		}
	}
}

+Zone_AcademyRoran โ€‹

File Created
cs
public class Zone_AcademyRoran : Zone_Civilized
{
}