Skip to content

EA 23.350 Nightly โ€‹

September 28, 2026

30 files modified. 3 new files created.

Important Changes โ€‹

None.

ActEffect โ€‹

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

cs
	chara2.hp = chara2.MaxHP / 2;
}
EClass._zone.AddCard(chara2, point);
if (flag) 
if (actRef.n1 == "special2") 
{ 
	chara2.SetHostility(Hostility.Enemy); 
} 
else if (flag) 
{
	Chara chara3 = chara2; 
	Hostility hostility = (chara2.c_originalHostility = Hostility.Enemy); 
	chara3.hostility = hostility; 
	chara2.SetHostility(Hostility.Enemy); 
}
else if (!(chara2.id == "cocoon") && (!(actRef.n1 == "monster") || actRef.refThing == null)) 
else if (!(actRef.n1 == "monster") || actRef.refThing == null) 
{
	chara2.MakeMinion(CC);
}

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

cs
{
	foreach (Point item4 in EClass._map.ListPointsInCircle(cc.pos, 6f, mustBeWalkable: false, los: false))
	{
		foreach (Chara chara4 in item4.Charas) 
		foreach (Chara chara3 in item4.Charas) 
		{
			if (chara4.ResistLv(957) <= 0) 
			if (chara3.ResistLv(957) <= 0) 
			{
				chara4.AddCondition<ConParalyze>(power); 
				chara3.AddCondition<ConParalyze>(power); 
			}
		}
	}

BuildMenu โ€‹

private void _Search()

cs
{
	foreach (RecipeSource item in RecipeManager.list)
	{
		if (item.noListing || item.isBridgePillar || (!EMono.debug.godBuild && !item.alwaysKnown && !EMono.player.recipes.knownRecipes.ContainsKey(item.id)) || (!item.row.GetSearchName(jp: false).Contains(s) && !item.row.GetSearchName(jp: true).Contains(s) && !item.id.Contains(s) && !item.row.category.Contains(s))) 
		if (!item.ShouldList() || item.isBridgePillar || (!EMono.debug.godBuild && !item.alwaysKnown && !EMono.player.recipes.knownRecipes.ContainsKey(item.id)) || (!item.row.GetSearchName(jp: false).Contains(s) && !item.row.GetSearchName(jp: true).Contains(s) && !item.id.Contains(s) && !item.row.category.Contains(s))) 
		{
			continue;
		}

private void _Search()

cs
	continue;
}
Recipe recipe2 = Recipe.Create(thing);
if (!recipe2.source.noListing) 
if (recipe2.source.ShouldList()) 
{
	if (recipe2 == null)
	{

private void _Search()

cs
if (t.trait.CanBeDropped && !t.trait.CanOnlyCarry && !t.isEquipped && (t.source.name.Contains(s) || t.source.name_JP.Contains(s) || t.NameOne.Contains(s)))
{
	Recipe recipe3 = Recipe.Create(t);
	if (!recipe3.source.noListing) 
	if (recipe3.source.ShouldList()) 
	{
		if (recipe3 == null)
		{

public void RefreshCategory(string cat)

cs
}
foreach (RecipeSource item in RecipeManager.list)
{
	if (EMono.debug.godBuild || !(item.row.GetAlias != "block_invisi") || (!item.noListing && !item.row.tileType.EditorTile && EMono.player.recipes.IsKnown(item.id) && (item.row.factory.Length == 0 || !(item.row.factory[0] == "none")))) 
	if (EMono.debug.godBuild || !(item.row.GetAlias != "block_invisi") || (item.ShouldList() && !item.row.tileType.EditorTile && EMono.player.recipes.IsKnown(item.id) && (item.row.factory.Length == 0 || !(item.row.factory[0] == "none")))) 
	{
		counts[item.recipeCat]++;
		if (!(item.recipeCat != cat))

Card โ€‹

public virtual int GetPrice(CurrencyType currency = CurrencyType.Money, bool selโ€ฆ)

cs
		return 25000;
	}
	break;
case CurrencyType.Money3:
	switch (id) 
	{ 
	case "1282": 
		return 1; 
	case "1386": 
		return 5; 
	case "scroll_random": 
		if (refVal == 8288) 
		{ 
			return 3; 
		} 
		break; 
	case "spellbook": 
		if (refVal == 9155) 
		{ 
			return 1; 
		} 
		break; 
	} 
	break; 
case CurrencyType.Plat:
	switch (id)
	{

public virtual int GetPrice(CurrencyType currency = CurrencyType.Money, bool selโ€ฆ)

cs
case CurrencyType.Money2:
	p *= 0.004999999888241291;
	break;
case CurrencyType.Money3:
	p *= 9.999999747378752E-05; 
	break; 
default:
	if (IsIdentified || (this.trait is TraitErohon && !sell) || priceType == PriceType.Tourism)
	{

Currency โ€‹

public static string ToID(CurrencyType currency)

cs
	CurrencyType.Influence => "influence", 
	CurrencyType.Casino_coin => "casino_coin", 
	CurrencyType.Ecopo => "ecopo", 
	CurrencyType.Money3 => "money3",  
	CurrencyType.Plat => "plat", 
	_ => "money", 
};

CurrencyType โ€‹

public enum CurrencyType

cs
	BranchMoney,
	Influence,
	Casino_coin,
	BlueCapsule 
	BlueCapsule, 
	Money3 
}

DramaOutcome โ€‹

public void reward_stone_dream()

cs
	}
}

public void reward_sorin() 
{ 
	if (EMono.pc.body.GetSlot(46, onlyEmpty: false) == null) 
	{ 
		CoreDebug._AddBodyPart(CoreDebug.BodyCode.relic); 
	} 
	if (!EMono.player.recipes.IsKnown("relic_lesser") || EMono.debug.enable) 
	{ 
		EMono.player.recipes.Add("relic_lesser"); 
	} 
	SE.Play("godbless"); 
	EMono.pc.PlayEffect("aura_heaven"); 
} 
public static bool If(DramaChoice item, Chara c)
{
	_ = item.IF.Split('/')[0] == "costHire";

Game โ€‹

public void ApplyFix()

cs
		}
	}
});
if (version.nightly) 
{ 
	if (EClass.game.quests.IsCompleted("into_darkness")) 
	{ 
		if (EClass.pc.body.GetSlot(46, onlyEmpty: false) == null) 
		{ 
			CoreDebug._AddBodyPart(CoreDebug.BodyCode.relic); 
		} 
		if (!player.recipes.IsKnown("relic_lesser") || EClass.debug.enable) 
		{ 
			player.recipes.Add("relic_lesser"); 
		} 
	} 
} 
else if (EClass.pc.body.GetSlot(46, onlyEmpty: false) != null) 
{ 
	CoreDebug._RemoveBodyPart(CoreDebug.BodyCode.relic); 
} 
if (version.IsBelow(0, 23, 345))
{
	Zone zone = spatials.Find("oldkeep");

+IModConfig โ€‹

File Created
cs
public interface IModConfig
{
	void OnBuildConfig(UINote note);
}

InvOwner โ€‹

public virtual void BuildUICurrency(UICurrency uiCurrency, bool canReroll = falsโ€ฆ)

cs
			money2 = (currency == CurrencyType.Money2),
			influence = (currency == CurrencyType.Influence),
			casino = (currency == CurrencyType.Casino_coin),
			ecopo = (currency == CurrencyType.Ecopo) 
			ecopo = (currency == CurrencyType.Ecopo), 
			mandrake = (currency == CurrencyType.Money3) 
		});
	}
}

public virtual void OnWriteNote(ButtonGrid button, UINote n)

cs
			string id = IDCostIcon(t);
			int price = transaction.GetPrice();
			uIItem.text1.SetText(Lang._currency(price), transaction.IsValid() ? FontColor.Good : FontColor.Bad);
			uIItem.image1.sprite = (Trader.UseHomeResource ? Trader.homeResource.Sprite : SpriteSheet.Get(id)); 
			uIItem.image1.sprite = (Trader.UseHomeResource ? Trader.homeResource.Sprite : (SpriteSheet.Get(id) ?? EClass.sources.cards.map.TryGetValue(IDCurrency)?.GetSprite())); 
			uIItem.image1.SetNativeSize(); 
		}
	}
}

ItemMod โ€‹

public class ItemMod : EMono

cs
public UIButton buttonColor;

public UIButton buttonConfig; 
public Image imageActive;

public Image imageLock;

public Image imageGroup;

public Image imageMember; 
public Widget.Config config;

public BaseModPackage package;

LayerMod โ€‹

public void OnPointerEnter(PointerEventData eventData)

cs
private UIButton buttonCollapse;

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

private float timerSearch;

private void Move(object row, int a)

cs
			goto IL_00b8;
		}
	}
	goto IL_00d2; 
	goto IL_00de; 
	IL_00b8:
	if (num2)
	{
		if (a > 0) 
		{ 
			LeaveGroup(baseModPackage); 
		} 
		baseModPackage.group = ((a > 0) ? null : modGroup2);
		OnReorder();
		return;
	}
	goto IL_00d2; 
	IL_00d2: 
	goto IL_00de; 
	IL_00de: 
	MoveTo(row, obj);
}

private void MoveTo(object row, object target)
{
	List<BaseModPackage> packages = manager.packages;
	List<ModGroup> emptyGroups = manager.emptyGroups; 
	List<object> items = this.list.items;
	ModGroup modGroup = row as ModGroup;
	BaseModPackage baseModPackage = target as BaseModPackage;

private void MoveTo(object row, object target)

cs
		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) 
	List<BaseModPackage> block = ((modGroup != null) ? Members(modGroup) : new List<BaseModPackage> { (BaseModPackage)row }); 
	bool flag2 = emptyGroups.Contains(modGroup2); 
	if (block.Count == 0) 
	{
		SE.BeepSmall(); 
		RefreshLists(); 
		(BaseModPackage, int) tuple = (modGroup.after, emptyGroups.IndexOf(modGroup)); 
		emptyGroups.Remove(modGroup); 
		if (flag2) 
		{ 
			modGroup.after = modGroup2.after; 
			emptyGroups.Insert(emptyGroups.IndexOf(modGroup2) + (flag ? 1 : 0), modGroup); 
		} 
		else
		{ 
			List<BaseModPackage> list = ((modGroup2 != null) ? Members(modGroup2) : null); 
			BaseModPackage edge = ((list == null || list.Count <= 0) ? baseModPackage : (flag ? list[^1] : list[0])); 
			modGroup.after = (flag ? edge : packages.TakeWhile((BaseModPackage p) => p != edge).LastOrDefault((BaseModPackage p) => !p.builtin)); 
			emptyGroups.Insert(GetGroupIndex(modGroup.after, !flag), modGroup); 
		} 
		BaseModPackage after = modGroup.after; 
		int num = emptyGroups.IndexOf(modGroup); 
		var (baseModPackage2, num2) = tuple; 
		if (after == baseModPackage2 && num == num2) 
		{ 
			SE.BeepSmall(); 
			RefreshLists(); 
		} 
		else
		{ 
			OnReorder(restart: false); 
		} 
		return;
	}
	int num = packages.IndexOf(list[0]); 
	foreach (BaseModPackage item in list) 
	bool flag3 = modGroup == null && flag && (flag2 || (modGroup2 != null && !modGroup2.collapsed)); 
	ModGroup modGroup3 = ((modGroup != null) ? block[0].group : ((modGroup2 == null) ? baseModPackage.group : (flag3 ? modGroup2 : null))); 
	if (modGroup == null && modGroup3 != block[0].group) 
	{ 
		LeaveGroup(block[0]); 
	} 
	int num3 = packages.IndexOf(block[0]); 
	BaseModPackage after2 = packages.TakeWhile((BaseModPackage p) => p != block[0]).LastOrDefault((BaseModPackage p) => !p.builtin); 
	foreach (BaseModPackage item in block) 
	{
		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) 
	BaseModPackage baseModPackage3 = ((list2 == null) ? baseModPackage : ((list2.Count == 0) ? null : (flag4 ? list2[^1] : list2[0]))); 
	int num4 = ((baseModPackage3 != null) ? (packages.IndexOf(baseModPackage3) + (flag4 ? 1 : 0)) : ((flag2 && !block.Contains(modGroup2.after)) ? ((modGroup2.after != null) ? (packages.IndexOf(modGroup2.after) + 1) : packages.Count((BaseModPackage p) => p.builtin)) : num3)); 
	if (!flag2 && num4 == num3 && modGroup3 == block[0].group) 
	{
		SE.BeepSmall();
		RefreshLists();
		return; 
	}
	else
	packages.InsertRange(num4, block); 
	BaseModPackage baseModPackage4 = (flag2 ? modGroup2.after : null); 
	foreach (ModGroup item2 in emptyGroups) 
	{
		list[0].group = modGroup3; 
		OnReorder(); 
		if (block.Contains(item2.after) && (num4 != num3 || (flag2 && flag && emptyGroups.IndexOf(item2) <= emptyGroups.IndexOf(modGroup2)))) 
		{ 
			item2.after = after2; 
		} 
		else if ((baseModPackage3 != null && flag4 && item2.after == baseModPackage3) || (flag2 && !flag && item2.after == baseModPackage4 && emptyGroups.IndexOf(item2) >= emptyGroups.IndexOf(modGroup2))) 
		{ 
			item2.after = block[^1]; 
		} 
	}
	block[0].group = modGroup3; 
	OnReorder(); 
}

private void OnReorder(bool restart = true)

public override void OnInit()

cs
		SetMembersActive(g, active: false);
	}
};
onInstantiate = SetModRow; 
list.callbacks = CreateCallbacks(list, builtin: false);
list2.callbacks = CreateCallbacks(list2, builtin: true);
InitSearchUI();

private UIList.Callback<object, ItemMod> CreateCallbacks(UIList target, bool buiโ€ฆ)

cs
	}
	else
	{
		onInstantiate((ModPackage)row, b); 
		SetModRow((ModPackage)row, b); 
	}
},
onList = delegate
{
	ModGroup modGroup = null;
	if (!builtin && !HasFilter) 
	{ 
		foreach (ModGroup emptyGroup in manager.emptyGroups) 
		{ 
			if (emptyGroup.after == null) 
			{ 
				target.Add(emptyGroup); 
			} 
		} 
	} 
	foreach (BaseModPackage package in manager.packages)
	{
		if (package.builtin == builtin && (builtin || Match(package)))

private UIList.Callback<object, ItemMod> CreateCallbacks(UIList target, bool buiโ€ฆ)

cs
			{
				target.Add(package);
			}
			if (!HasFilter) 
			{ 
				foreach (ModGroup emptyGroup2 in manager.emptyGroups) 
				{ 
					if (emptyGroup2.after == package) 
					{ 
						target.Add(emptyGroup2); 
					} 
				} 
			} 
		}
	}
	if (!builtin && !HasFilter) 
	{ 
		target.AddCollection(manager.emptyGroups); 
	} 
},
onRefresh = Refresh,
onDragReorder = delegate(object row, int a)

private void SetModRow(ModPackage a, ItemMod b)

cs
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;
ItemMod itemMod = ((a.group != null && !HasFilter) ? list.GetPair<ItemMod>(a.group) : null); 
b.imageMember.SetActive(itemMod); 
if ((bool)itemMod) 
{ 
	b.imageMember.color = itemMod.buttonActivate.mainText.color; 
} 
b.buttonUp.SetActive(!a.builtin);
b.buttonDown.SetActive(!a.builtin);
b.buttonConfig.SetActive(a.onBuildConfig != null); 
b.buttonConfig.SetOnClick(delegate
{ 
	LayerModConfig.Open(a); 
}); 
b.buttonToggle.SetToggle(a.willActivate);
b.buttonUp.SetOnClick(delegate
{

private void SetModRow(ModPackage a, ItemMod b)

cs
b.buttonActivate.onClick.AddListener(delegate
{
	Refresh();
	UIContextMenu uIContextMenu = ELayer.ui.CreateContextMenuInteraction(); 
	UIContextMenu uIContextMenu = ELayer.ui.CreateContextMenuInteraction().SetHighlightTarget(b.buttonActivate); 
	if (!a.builtin)
	{
		if (ELayer.debug.enable || (!BaseCore.IsOffline && a.isInPackages && !ELayer.core.version.demo))

private void SetModRow(ModPackage a, ItemMod b)

cs
	}
	AddGroupButtons(uIContextMenu, a);
}
if (a.onBuildConfig != null) 
{ 
	uIContextMenu.AddButton("config", delegate
	{ 
		SE.Click(); 
		LayerModConfig.Open(a); 
	}); 
} 
if (ModPreview.FindPreviewFile(a) != null || (bool)SteamPreview(a))
{
	uIContextMenu.AddButton("mod_preview", delegate

private void SetMembersActive(ModGroup g, bool active)

cs
	}
}

private void LeaveGroup(BaseModPackage p) 
{ 
	ModGroup g = p.group; 
	if (g != null && !manager.packages.Any((BaseModPackage m) => m != p && m.group == g)) 
	{ 
		manager.emptyGroups.Insert(GetGroupIndex(p, last: false), g); 
		g.after = manager.packages.TakeWhile((BaseModPackage m) => m != p).LastOrDefault((BaseModPackage m) => !m.builtin); 
	} 
} 
private int GetGroupIndex(BaseModPackage anchor, bool last) 
{ 
	List<BaseModPackage> l = manager.packages; 
	return manager.emptyGroups.Count((ModGroup e) => l.IndexOf(e.after) < l.IndexOf(anchor) || (last && e.after == anchor)); 
} 
private void NewGroup()
{
	if (ModManager.disableMod)

private void NewGroup()

cs
}
ModGroup item = new ModGroup
{
	name = name 
	name = name, 
	after = manager.packages.LastOrDefault((BaseModPackage p) => !p.builtin) 
};
manager.emptyGroups.Add(item);
OnReorder(restart: false);

private void SetGroupRow(ModGroup g, ItemMod b)

cs
{
	List<BaseModPackage> members = Members(g);
	int on = members.Count((BaseModPackage p) => p.willActivate);
	string title = (g.collapsed ? "[+] " : "[-] ") + g.name; 
	string title = ((members.Count == 0) ? "" : (g.collapsed ? "[+] " : "[-] ")) + g.name; 
	UIText mainText = b.buttonActivate.mainText;
	mainText.fontStyle = FontStyle.Bold;
	mainText.SetText(FitTitle(mainText, title, " (" + on + "/" + members.Count + ")"), FontColor.Topic); 
	mainText.SetText(FitTitle(mainText, title, (members.Count > 0) ? (" (" + on + "/" + members.Count + ")") : ""), FontColor.Topic); 
	Color topic = mainText.color;
	Color? color = g.color;
	if (color.HasValue)

private void SetGroup(BaseModPackage p, ModGroup g)

cs
	ClearSearch();
}
List<BaseModPackage> packages = manager.packages;
List<ModGroup> emptyGroups = manager.emptyGroups; 
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) 
if (g != p.group) 
{ 
	LeaveGroup(p); 
} 
int num = packages.IndexOf(p); 
BaseModPackage after = packages.TakeWhile((BaseModPackage m) => m != p).LastOrDefault((BaseModPackage m) => !m.builtin); 
packages.Remove(p); 
int num2 = ((!emptyGroups.Contains(g)) ? ((baseModPackage != null) ? (packages.IndexOf(baseModPackage) + 1) : num) : ((g.after == p) ? num : ((g.after != null) ? (packages.IndexOf(g.after) + 1) : packages.Count((BaseModPackage m) => m.builtin)))); 
packages.Insert(num2, p); 
BaseModPackage baseModPackage2 = (emptyGroups.Contains(g) ? g.after : null); 
foreach (ModGroup item in emptyGroups) 
{
	packages.Remove(p); 
	packages.Insert(packages.IndexOf(baseModPackage) + 1, p); 
	if (item.after == p && num2 != num) 
	{ 
		item.after = after; 
	} 
	else if (emptyGroups.Contains(g) && item.after == baseModPackage2 && emptyGroups.IndexOf(item) >= emptyGroups.IndexOf(g)) 
	{ 
		item.after = p; 
	} 
}
p.group = g;
if (g != null)

private void ShowInfo(BaseModPackage p)

cs
PreviewEntry thumb = GetThumb(p);
infoPreview.SetActive(enable: true);
infoPreview.image1.sprite = thumb.sprite ?? spriteNoPreview;
Image image = infoPreview.image1; 
Vector2 size = image.sprite.rect.size; 
infoPreview.image2.rectTransform.sizeDelta = size * Mathf.Min(image.rectTransform.rect.width / size.x, image.rectTransform.rect.height / size.y) + Vector2.one * 18f; 
SetTopic(infoAuthor, p.author.IsEmpty("-"), null);
SetTopic(infoVersion, p.version.IsEmpty("-"), null);
SetTopic(infoId, p.id, null);

+LayerModConfig โ€‹

File Created
cs
using System;

public class LayerModConfig : ELayer
{
	public UINote note;

	public UIButton buttonReset;

	public UIButton buttonFile;

	public ModPackage current;

	public static void Open(ModPackage p)
	{
		ELayer.ui.AddLayerDontCloseOthers<LayerModConfig>("LayerMod/LayerModConfig").Show(p);
	}

	public override void OnInit()
	{
		buttonReset = windows[0].AddBottomButton("resetConfigTab".lang("mod".lang()), delegate
		{
			Dialog.YesNo("dialogResetConfigTab".lang(windows[0].textCaption.text), delegate
			{
				try
				{
					current.onResetConfig?.Invoke();
				}
				catch (Exception ex)
				{
					ModUtil.LogModError(ex.ToString(), current);
				}
				Show(current);
			});
		});
		buttonFile = windows[0].AddBottomButton("mod_info", delegate
		{
			Util.ShowExplorer(current.configPath);
		});
	}

	public void Show(ModPackage p)
	{
		current = p;
		windows[0].SetCaption(p.title.IsEmpty(p.dirInfo.Name));
		buttonReset.SetActive(p.onResetConfig != null);
		buttonFile.SetActive(!p.configPath.IsEmpty());
		note.Clear();
		windows[0].RebuildLayout();
		note.RebuildLayoutTo<Layer>();
		try
		{
			p.onBuildConfig(note);
		}
		catch (Exception ex)
		{
			ModUtil.LogModError(ex.ToString(), p);
		}
		note.Build();
	}
}

ModManager โ€‹

public void SaveLoadOrder()

cs
}
List<string> list = new List<string>();
ModGroup modGroup = null;
foreach (BaseModPackage package in packages) 
foreach (ModGroup emptyGroup in emptyGroups) 
{
	string str = package.dirInfo?.FullName; 
	if (package.builtin || str.IsEmpty()) 
	if (emptyGroup.after == null) 
	{
		continue; 
		list.Add((modGroup = emptyGroup).ToString()); 
	}
	string text = FormatLoadOrder(package); 
} 
foreach (BaseModPackage package in packages) 
{ 
	string str = package.dirInfo?.FullName; 
	string text = ((package.builtin || str.IsEmpty()) ? "" : FormatLoadOrder(package)); 
	if (!text.IsEmpty())
	{
		if (package.group != modGroup)

public void SaveLoadOrder()

cs
			}
			list.Add(text);
		}
		foreach (ModGroup emptyGroup2 in emptyGroups) 
		{ 
			if (emptyGroup2.after == package) 
			{ 
				list.Add((modGroup = emptyGroup2).ToString()); 
			} 
		} 
	}
	list.AddRange(emptyGroups.Select((ModGroup g) => g.ToString())); 
	File.WriteAllLines(CorePath.PathLoadOrder, list);
}

public void SplitGroups()

cs
		}
		package.group = modGroup2;
	}
	foreach (ModGroup emptyGroup in emptyGroups) 
	{ 
		foreach (BaseModPackage package2 in packages) 
		{ 
			if (package2.group != null && package2.group == emptyGroup.after?.group) 
			{ 
				emptyGroup.after = package2; 
			} 
		} 
	} 
}

public void LoadLoadOrder()

public void LoadLoadOrder()

cs
int num = 0;
int num2 = 0;
ModGroup modGroup = null;
BaseModPackage after = null; 
HashSet<BaseModPackage> hashSet = new HashSet<BaseModPackage>();
foreach (string item in File.ReadAllLines(pathLoadOrder).Append("#group"))
{

public void LoadLoadOrder()

cs
{
	if (modGroup != null && num2 == 0)
	{
		modGroup.after = after; 
		emptyGroups.Add(modGroup);
	}
	modGroup = group;

public void LoadLoadOrder()

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

ModPackage โ€‹

public struct SheetIndex

cs
	public int old;
}

public Action<UINote> onBuildConfig; 
public Action onResetConfig; 
public string configPath; 
public void CopyContentTo(string dir)
{
	IO.DeleteDirectory(dir);

ModUtil โ€‹

public static ModPackage GetModPackage(string modId)

cs
public static ModPackage FindFileProviderPackage(FileInfo file)
{
	string path = file.FullName.NormalizePath();
	return ModManager.Instance.packages.LastOrDefault((BaseModPackage p) => path.StartsWith(p.dirInfo.FullName.NormalizePath())) as ModPackage; 
	return ModManager.Instance.packages.LastOrDefault((BaseModPackage p) => path.StartsWith(p.dirInfo.FullName.NormalizePath() + "/")) as ModPackage; 
}

public static ModPackage FindDirectoryProviderPackage(DirectoryInfo dir)
{
	string path = dir.FullName.NormalizePath(); 
	return ModManager.Instance.packages.LastOrDefault((BaseModPackage p) => path.StartsWith(p.dirInfo.FullName.NormalizePath())) as ModPackage; 
	string path = dir.FullName.NormalizePath() + "/"; 
	return ModManager.Instance.packages.LastOrDefault((BaseModPackage p) => path.StartsWith(p.dirInfo.FullName.NormalizePath() + "/")) as ModPackage; 
}

public static ModPackage FindSourceRowPackage(SourceData.BaseRow row)

Props โ€‹

void FindCat(string key)

cs
SourceCategory.Row cat = EClass.sources.categories.map[key];
EClass.pc.things.Foreach(delegate(Thing t)
{
	if (!t.isEquipped && t.category.IsChildOf(cat.id) && !t.IsExcludeFromCraft(ing)) 
	if (!t.isEquipped && t.category.IsChildOf(cat.id) && !t.IsExcludeFromCraft(ing) && !stack.list.Contains(t)) 
	{
		stack.Add(t);
	}

void FindCat(string key)

cs
{
	Thing thing = item5.Thing;
	Card obj = thing.parent as Card;
	if (obj != null && obj.c_lockLv == 0 && !thing.IsExcludeFromCraft(ing)) 
	if (obj != null && obj.c_lockLv == 0 && !thing.IsExcludeFromCraft(ing) && !stack.list.Contains(thing)) 
	{
		stack.Add(thing);
	}

void FindCat(string key)

cs
}
void TryAdd(Thing t)
{
	if ((tag == null || t.Thing.material.tag.Contains(tag)) && (idMat == -1 || t.material.id == idMat) && !t.IsExcludeFromCraft(ing)) 
	if ((tag == null || t.Thing.material.tag.Contains(tag)) && (idMat == -1 || t.material.id == idMat) && !t.IsExcludeFromCraft(ing) && !stack.list.Contains(t)) 
	{
		stack.Add(t.Thing); 
		stack.Add(t); 
	}
}
void TryAdd2(Thing t)

RecipeManager โ€‹

public List<RecipeSource> ListSources(Thing factory, List<RecipeSource> newRecipโ€ฆ)

cs
List<RecipeSource> list = new List<RecipeSource>();
foreach (RecipeSource item in RecipeManager.list)
{
	if (item.isBridgePillar || (factory == null && item.idFactory != "self") || (factory != null && !factory.trait.Contains(item)) || item.isChara || item.noListing) 
	if (item.isBridgePillar || (factory == null && item.idFactory != "self") || (factory != null && !factory.trait.Contains(item)) || item.isChara || !item.ShouldList()) 
	{
		continue;
	}

RecipeSource โ€‹

public string idFactory

cs
	}
}

public bool ShouldList() 
{ 
	if (noListing) 
	{ 
		if (id == "f90" && EClass.game.IsSurvival) 
		{ 
			return true; 
		} 
		return false; 
	} 
	return true; 
} 
public string GetDetail()
{
	return row.GetDetail();

Scene โ€‹

public void OnUpdate()

cs
{
	if (EMono.ui.isPointerOverUI)
	{
		if (!EMono.ui.GetLayer<LayerConfig>()) 
		if (!EMono.ui.GetLayer<LayerConfig>() && !EMono.ui.GetLayer<LayerModConfig>()) 
		{
			UIDropdown componentOf = InputModuleEX.GetComponentOf<UIDropdown>();
			if ((bool)componentOf && !UIDropdown.activeInstance)

ShopType โ€‹

public enum ShopType

cs
	TravelMerchant,
	TravelMerchant2,
	CustomContent,
	AnimalGoods 
	AnimalGoods, 
	Sorin 
}

SurvivalManager โ€‹

public void OnUpdateRecruit(FactionBranch branch)

cs
for (int i = 0; i < (EClass.debug.enable ? 10 : 2); i++)
{
	SourceChara.Row row = list.RandomItem();
	if (row != null) 
	if (row == null) 
	{ 
		continue; 
	} 
	bool flag = true; 
	foreach (HireInfo item in branch.listRecruit) 
	{ 
		if (item.chara.id == row.id) 
		{ 
			flag = false; 
		} 
	} 
	if (flag) 
	{
		Chara chara = CharaGen.Create(row.id);
		chara.RemoveEditorTag(EditorTag.AINoMove);

TCOrbitChara โ€‹

public override void RefreshAll()

cs
	{
		emo = owner.trait.GetRestockedIcon();
	}
	else
	else if ((owner.quest != null && EMono.game.quests.list.Contains(owner.quest)) || owner.trait.ShouldShowQuestIcon()) 
	{
		bool flag = false; 
		if (owner.quest != null && EMono.game.quests.list.Contains(owner.quest)) 
		{ 
			flag = true; 
		} 
		else if (owner.IsUnique && !EMono.game.IsSurvival) 
		{ 
			string id = owner.id; 
			if (!(id == "ashland")) 
			{ 
				if (id == "fiama") 
				{ 
					if (EMono.game.quests.GetPhase<QuestMain>() >= 200 && EMono.player.dialogFlags.TryGetValue("fiama1", 0) == 0) 
					{ 
						flag = true; 
					} 
					else if (EMono.pc.homeBranch != null) 
					{ 
						foreach (Chara member in EMono.pc.homeBranch.members) 
						{ 
							if (member.isDead && member.GetInt(100) != 0) 
							{ 
								flag = true; 
								break; 
							} 
						} 
					} 
				} 
			} 
			else
			{ 
				int phase = EMono.game.quests.GetPhase<QuestMain>(); 
				if ((phase == 0 && EMono.player.dialogFlags.TryGetValue("ash1", 0) == 0) || phase == 200) 
				{ 
					flag = true; 
				} 
			} 
		} 
		if (flag) 
		{ 
			emo = Emo2.hint; 
		} 
		emo = Emo2.hint; 
	}
}
if (EMono.player.currentHotItem.Thing != null && EMono.player.currentHotItem.Thing.trait.GetHeldEmo(owner) != Emo2.none)

public override void RefreshAll()

cs
	iconStatus.sprite = EMono.core.refs.spritesEmo[(int)emo];
}
iconStatus.SetActive(showIcon);
bool flag2 = owner.isChara && owner.HasElement(1421); 
bool flag = owner.isChara && owner.HasElement(1421); 
float num = (float)owner.hp / (float)owner.MaxHP;
if (flag2) 
if (flag) 
{
	num = (float)(owner.hp + owner.mana.value) / (float)(owner.MaxHP + owner.mana.max);
}
showHP = num < 0.9f && (owner.IsPCParty || owner.IsHostile() || (owner.enemy != null && owner.enemy.IsPCParty)) && !owner.IsPCFactionMinion;
if (showHP)
{
	if (flag2) 
	if (flag) 
	{
		float x = (float)owner.mana.max / (float)(owner.mana.max + owner.MaxHP);
		bgMP.transform.localScale = new Vector3(x, 1f, 1f);

public override void RefreshAll()

cs
	barHP.transform.SetLocalScaleX(Mathf.Max(0f, num));
	barHP.SetActive(enable: true);
	bgHP.SetActive(enable: true);
	bgMP.SetActive(flag2); 
	bgMP.SetActive(flag); 
}
else
{

TileType โ€‹

public HitResult _HitTest(Point pos, Card target, bool canIgnore = true)

cs
{
	return HitResult.Invalid;
}
if (this is TileTypeSky && EClass.game.IsSurvival && (pos.HasChara || pos.HasObj)) 
{ 
	return HitResult.Invalid; 
} 
if (pos.cell.IsTopWater)
{
	if (!CanBuiltOnWater)

Trait โ€‹

public virtual void OnBarter(bool reroll = false)

cs
	}
	break;
}
case ShopType.Sorin:
	Add("1282", 1, 0).SetNum(5); 
	AddThing(ThingGen.CreateSpellbook(9155, 1, 3)); 
	AddThing(ThingGen.CreateScroll(8288).SetNum(5)); 
	Add("1386", 1, 0); 
	break; 
case ShopType.Medal:
	NoRestockId("hammer_garokk", 3, 0);
	NoRestockId("sword_dragon", 1, 0);

public virtual void OnBarter(bool reroll = false)

cs
Add("diary_lady", 1, 0);
Add("1165", 1, 0).SetNum(5);
AddThing(ThingGen.CreateScroll(9160).SetNum(5));
Add("1282", 1, 0).SetNum(5); 
Add("monsterball", 1, 0).SetNum(3).SetLv(20);
Add("monsterball", 1, 0).SetNum(3).SetLv(40);
Add("bill_tax", 1, 0).c_bill = 1;
Add("bill_tax", 1, 0).c_bill = 1;
Add("bill_tax", 1, 0).c_bill = 1;
AddThing(ThingGen.CreateScroll(8288).SetNum(5)); 
Add("container_magic", 1, 0);
Add("container_magic", 1, 0).ChangeMaterial("iron").idSkin = 1;
Add("container_magic", 1, 0).ChangeMaterial("bamboo").idSkin = 2;

public virtual void OnBarter(bool reroll = false)

cs
	Add("wrench_fridge", 1, 0).SetNum(1);
	Add("wrench_extend_v", 1, 0).SetNum(2);
	Add("wrench_extend_h", 1, 0).SetNum(2);
	AddThing(ThingGen.CreateSpellbook(9155, 1, 3)); 
	break;
default:
{

public virtual void OnBarter(bool reroll = false)

cs
switch (ShopType)
{
case ShopType.Curry:
	if (EClass.game.quests.IsCompleted("curry")) 
	if (EClass.game.quests.IsCompleted("curry") || EClass.game.IsSurvival) 
	{
		AddThing(TraitSeed.MakeSeed("redpepper").SetNum(5));
	}

TraitAshland โ€‹

public class TraitAshland : TraitUniqueChara

cs
public class TraitAshland : TraitUniqueChara
{
	public override bool CanInvite => EClass._zone.id == "lothria";
	public override bool ShouldShowQuestIcon() 
	{ 
		if (EClass.game.IsSurvival) 
		{ 
			return false; 
		} 
		int phase = EClass.game.quests.GetPhase<QuestMain>(); 
		if ((phase == 0 && EClass.player.dialogFlags.TryGetValue("ash1", 0) == 0) || phase == 200) 
		{ 
			return true; 
		} 
		return false; 
	} 
}

TraitChara โ€‹

public virtual bool CanBeTamed

cs
{
	get
	{
		if (!IsUnique && owner.rarity < Rarity.Legendary && !owner.IsMultisize && !owner.IsGlobal && !owner.IsPCFaction && EClass._zone.Boss != owner && CanInvite) 
		if (!IsUnique && owner.rarity < Rarity.Legendary && !owner.IsMultisize && !owner.IsGlobal && !owner.IsPCFaction && EClass._zone.Boss != owner && CanInvite && owner.c_bossType == BossType.none) 
		{
			return owner.c_bossType == BossType.none; 
			if (EClass._zone.IsUserZone) 
			{ 
				return !EClass.game.principal.disableUsermapBenefit; 
			} 
			return true; 
		}
		return false;
	}

public virtual bool IdleAct()

cs
	return false;
}

public virtual bool ShouldShowQuestIcon() 
{ 
	return false; 
} 
public virtual string GetDramaText()
{
	if (CanInvest)

TraitFiama โ€‹

public class TraitFiama : TraitUniqueMerchant

cs
	public override CurrencyType CurrencyType => CurrencyType.Money2;

	public override string LangBarter => "daBuyStarter";
	public override bool ShouldShowQuestIcon() 
	{ 
		if (EClass.game.IsSurvival) 
		{ 
			return false; 
		} 
		if (EClass.game.quests.GetPhase<QuestMain>() >= 200 && EClass.player.dialogFlags.TryGetValue("fiama1", 0) == 0) 
		{ 
			return true; 
		} 
		if (EClass.pc.homeBranch != null) 
		{ 
			foreach (Chara member in EClass.pc.homeBranch.members) 
			{ 
				if (member.isDead && member.GetInt(100) != 0) 
				{ 
					return true; 
				} 
			} 
		} 
		return false; 
	} 
}

TraitSkyHelm โ€‹

public override bool OnUse(Chara c)

cs
		EClass.game.survival.listGateZone.Clear();
		EClass.ui.CloseLayers();
		EClass.pc.pos.TalkWitnesses(EClass.pc, "ahoy", 6, WitnessType.everyone, (Chara chara) => true);
		EClass.pc.ModExp(240, costSkyTravel * 20); 
	}
},
onRedraw = delegate(Zone a, ButtonElement b, int i)

TraitSorin โ€‹

public class TraitSorin : TraitUniqueChara

cs
public class TraitSorin : TraitUniqueChara
public class TraitSorin : TraitUniqueMerchant
{
	public override ShopType ShopType => ShopType.Sorin; 
	public override CurrencyType CurrencyType => CurrencyType.Money3; 
	public override bool CanInvest => false; 
	public override int ShopLv => 1; 
	public override string LangBarter => "daTradeMandrake"; 
	public override bool CanBeBanished => false;
	public override bool ShouldShowQuestIcon() 
	{ 
		return !EClass.player.dialogFlags.ContainsKey("sorin_relic"); 
	} 
}

+TraitStrangePainting โ€‹

File Created
cs
public class TraitStrangePainting : TraitVase
{
	public override void OnDie()
	{
		if (!EClass._zone.IsRegion && EClass.rnd(3) != 0)
		{
			Chara chara = EClass._zone.SpawnMob(owner.pos.GetNearestPoint(allowBlock: false, allowChara: false), new SpawnSetting
			{
				id = "paint_living",
				filterLv = EClass._zone.DangerLv + 20
			});
			chara.SetHostility(Hostility.Enemy);
			chara.SetSummon(9999);
			Msg.Say("statue_chara", chara, owner);
		}
	}
}

UICurrency โ€‹

public class Options

cs
	public bool weight;

	public bool ticketSky;
	public bool mandrake; 
}

public class Item

public void Build()

cs
{
	Add(EMono.sources.cards.map["ecopo"].GetSprite(), "ecopo", () => EMono.pc.GetCurrency("ecopo").ToString("#,0") ?? "");
}
if (options.mandrake) 
{ 
	Add(EMono.sources.cards.map["money3"].GetSprite(), "money3", () => EMono.pc.GetCurrency("money3").ToString("#,0") ?? ""); 
} 
if (options.ticketSky)
{
	Add(EMono.sources.cards.map["ticket_sky"].GetSprite(), "ticket_sky", () => EMono.pc.GetCurrency("ticket_sky").ToString("#,0") ?? "");

UIInventory โ€‹

public bool IsMainMode

cs
{
	CurrencyType.Medal => "medal", 
	CurrencyType.Ecopo => "ecopo", 
	CurrencyType.Money3 => "money3",  
	_ => "money", 
};

WidgetCodex โ€‹

public virtual void Search(string s)

cs
{
	foreach (RecipeSource item in RecipeManager.list)
	{
		if (!item.isChara && !item.noListing && !item.isBridgePillar && (item.row.GetSearchName(jp: false).Contains(s) || item.row.GetSearchName(jp: true).Contains(s)) && (EMono.player.recipes.knownRecipes.ContainsKey(item.id) || item.alwaysKnown)) 
		if (!item.isChara && item.ShouldList() && !item.isBridgePillar && (item.row.GetSearchName(jp: false).Contains(s) || item.row.GetSearchName(jp: true).Contains(s)) && (EMono.player.recipes.knownRecipes.ContainsKey(item.id) || item.alwaysKnown)) 
		{
			hashSet.Add(Recipe.Create(item));
		}

public virtual void Search(string s)

cs
{
	foreach (RecipeSource item2 in RecipeManager.list)
	{
		if (!item2.isChara && !item2.noListing && (EMono.player.recipes.knownRecipes.ContainsKey(item2.id) || item2.alwaysKnown)) 
		if (!item2.isChara && item2.ShouldList() && (EMono.player.recipes.knownRecipes.ContainsKey(item2.id) || item2.alwaysKnown)) 
		{
			hashSet.Add(Recipe.Create(item2));
		}