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) โ
private void Move(BaseModPackage p, int a)
private void Move(object row, int a) private void MoveTo(BaseModPackage p, BaseModPackage target)
private void MoveTo(object row, object target) private UIList.Callback<ModPackage, ItemMod> CreateCallbacks(UIList target, bool builtin)
private UIList.Callback<object, ItemMod> CreateCallbacks(UIList target, bool builtin) 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()
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
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
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โฆ)
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 โ
noRide,
ride,
allowIngredient,
nurse
nurse,
notMeAgain
}HomeResourceWorth โ
public List<Thing> ListHeirloom()
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)
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 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)
public GameObject infoSpace;
public Sprite spriteNoPreview;
private UIButton buttonFilter;
private UIButton buttonCollapse;
private Action<ModPackage, ItemMod> onInstantiate;
private BaseModPackage panelTarget;
private float timerSearch; }
}
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();
} {
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() 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); 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)
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)
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)
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)) }
}
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); {
value.orderIndex = num;
value.willActivate = activate;
value.group = modGroup;
num++;
}
}static bool ParseLoadOrderLine(string line, out string reference, out bool referโฆ)
{
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(); }
packages.Clear();
packages.AddRange(list);
SplitGroups();
}
private void MapActivatedPackages()SourceImporter โ
public static void HotInit(IEnumerable<SourceData> sourceData)
{
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()
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)
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 โ
}
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)
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
public class Zone_AcademyRoran : Zone_Civilized
{
}