EA 23.343.1 Nightly โ
September 7, 2026
18 files modified.
Important Changes โ
Possible breaking changes. Click the filename to view the chunk.
LayerMod (4) โ
private static void AddPreviewBox(UINote n, Sprite sprite, Action onClick) private static void FitValue(UIItem item) private static void AddIdList(UINote n, string lang, string[][] rows) private void CreatePresetUI() AI_UseCrafter โ
public override IEnumerable<Status> Run()
}
}
Rand.SetSeed();
if (crafter is TraitCookerMicrowave && recipe.id == "onsentamago" && EClass.rnd(3) != 0)
if (owner != null && crafter is TraitCookerMicrowave && recipe.id == "onsentamago" && EClass.rnd(3) != 0)
{
int power = EClass.curve((200 + ings[0].Quality * 5) * (100 + owner.Evalue(287) * 10) / 100, 400, 100);
ActEffect.ProcAt(EffectId.Explosive, power, BlessedState.Normal, crafter.owner.ExistsOnMap ? crafter.owner : owner, owner, owner.pos, isNeg: true, new ActRefAM_Paint โ
public override void OnUpdateInput()
srRect.transform.position = Camera.main.ScreenToWorldPoint(mousePosition).SetZ(-100f);
float num = 0.02f / EClass.screen.Zoom;
Sprite sprite = canvas.owner.GetSprite();
srRect.transform.localScale = new Vector3((float)sprite.texture.width * num, (float)sprite.texture.height * num, 1f);
srRect.transform.localScale = new Vector3(SpriteData.BaseWidth(sprite) * num, SpriteData.BaseHeight(sprite) * num, 1f);
if (!EInput.leftMouse.clicked)
{
return;Card โ
{
return this;
}
if (LV >= Mathf.Max(50, sourceCard.LV))
if (LV > Mathf.Max(50, sourceCard.LV))
{
isScaled = true;
}public virtual void SetImage(Image image)
if (spriteReplacer != null)
{
sprite = spriteReplacer.GetSprite();
RenderData renderData = ResourceCache.Load<RenderData>("Scene/Render/Data/chara_custom_" + ((sprite.texture.height <= 128) ? "128" : "256"));
RenderData renderData = ResourceCache.Load<RenderData>("Scene/Render/Data/chara_custom_" + ((SpriteData.BaseHeight(sprite) <= 128f) ? "128" : "256"));
sourceRenderCard.SetImage(image, sprite, colorInt, setNativeSize: true, 0, 0, renderData, spriteReplacer.data.pref ?? Pref);
return;
}{
Sprite sprite = GetSprite();
Texture2D texture2D = ScreenCapture.CaptureScreenshotAsTexture();
int num = sprite.texture.width * 2;
int num2 = sprite.texture.height * 2;
int num = (int)(SpriteData.BaseWidth(sprite) * 2f);
int num2 = (int)(SpriteData.BaseHeight(sprite) * 2f);
int x = (int)Mathf.Clamp(Input.mousePosition.x - (float)(num / 2), 1f, texture2D.width - num - 1);
int y = (int)Mathf.Clamp(Input.mousePosition.y - (float)(num2 / 2), 1f, texture2D.height - num2 - 1);
Color[] pixels = texture2D.GetPixels(x, y, num, num2);CardActor โ
public virtual void OnRender(RenderParam p)
}
}
public virtual void ReloadSprite()
{
sr.sprite = null;
RefreshSprite();
}
public virtual void RefreshSprite()
{
switch (type)Chara โ
public override SourcePref Pref
if (spriteReplacer.data.pref == null && !spriteReplacer.data.tryFixPrefNotLoadedAtStart)
{
spriteReplacer.data.tryFixPrefNotLoadedAtStart = true;
spriteReplacer.data.LoadPref();
spriteReplacer.data.LoadPrefAndFixDensity();
}
return spriteReplacer.data?.pref ?? EClass.core.refs.prefs.replacer1;
}CharaActor โ
public override void NextFrame()
RefreshSprite();
}
public override void ReloadSprite()
{
if (owner != null)
{
sr.sprite = owner.GetSprite();
RefreshSprite();
}
}
public override void RefreshSprite()
{
Sprite sprite = sr.sprite;CharaRenderer โ
public override void SetOwner(Card c)
SpriteReplacer spriteReplacer = SpriteReplacer.dictSkins.TryGetValue(owner.c_idSpriteReplacer);
if (spriteReplacer != null)
{
data = ResourceCache.Load<RenderData>("Scene/Render/Data/chara_custom_" + ((spriteReplacer.GetSprite().texture.height <= 128) ? "128" : "256"));
data = ResourceCache.Load<RenderData>("Scene/Render/Data/chara_custom_" + ((SpriteData.BaseHeight(spriteReplacer.GetSprite()) <= 128f) ? "128" : "256"));
owner.spriteReplacer = spriteReplacer;
}
}Core โ
public void OnApplicationFocus(bool focus)
}
foreach (SpriteReplacer value in SpriteReplacer.dictSkins.Values)
{
value.data?.LoadPref();
value.data?.LoadPrefAndFixDensity();
}
if (RenderObject.syncList != null)
{
foreach (ISyncScreen sync in RenderObject.syncList)
{
if (sync is CardRenderer { hasActor: not false } cardRenderer && !cardRenderer.actor.isPCC)
{
cardRenderer.actor.ReloadSprite();
}
}
}
WidgetRoster.SetDirty();
}DNA โ
public static Thing GenerateManiGene(Card owner)
CardRow r = SpawnList.Get("chara").Select(100);
Rand.SetSeed(owner.c_seed);
Thing thing = GenerateGene(r, Type.Superior, owner.LV, owner.c_seed);
thing.c_DNA.cost = thing.c_DNA.cost / 2;
thing.c_DNA.cost = 0;
thing.c_DNA.isManiGene = true;
thing.ChangeMaterial(36);
thing.MakeRefFrom("mani");
Rand.SetSeed();
owner.c_seed++;LayerEditPlaylist โ
public class ListBGM : ListOwner<BGMData, ItemGeneral>
public bool single;
public bool sort = true;
public new LayerEditPlaylist layer => base.layer as LayerEditPlaylist;
public override string IdTitle => idTitle;},
onList = delegate
{
items.Sort((BGMData a, BGMData b) => a.id - b.id);
if (sort)
{
items.Sort((BGMData a, BGMData b) => a.id - b.id);
}
foreach (BGMData item in items)
{
list.Add(item);multi.AddOwner(0, new ListBGM
{
items = list,
idTitle = "wPlaylist"
idTitle = "wPlaylist",
sort = false
});
multi.AddOwner(1, new ListBGM
{LayerMod โ
public void OnPointerEnter(PointerEventData eventData)
}
}
private const float previewBoxHeight = 240f;
private const string urlWorkshopItem = "https://steamcommunity.com/sharedfiles/filedetails/?id=";
public static LayerMod Instance;public void OnPointerEnter(PointerEventData eventData)
public UINote panelNote;
public UIItem infoTitle;
public UIItem infoPreview;
public UIItem infoPreviewNote;
public UIItem infoAuthor;
public UIItem infoVersion;
public UIItem infoId;
public UIItem infoWorkshop;
public UIItem infoStatus;
public UIItem infoProblems;
public UIItem infoTags;
public UIItem infoRequires;
public UIItem infoIncompatible;
public UIItem infoLoadAfter;
public UIItem infoLoadBefore;
public UIItem infoDescription;
public GameObject infoSpace;
private UIButton buttonFilter;
private BaseModPackage panelTarget;list.callbacks = CreateCallbacks(list, builtin: false);
list2.callbacks = CreateCallbacks(list2, builtin: true);
InitSearchUI();
CreatePresetUI();
panelHeader.SetText("info".lang());
windows[0].AddBottomButton("mod_preset", ShowPresetMenu);
infoPreview.button1.SetOnClick(delegate
{
ShowPreview(panelTarget);
});
RefreshLists();
ShowInfo(FirstInfoTarget());
list.dragEdgeSize = list.callbacks.GetMold()?.Rect().sizeDelta.y ?? 34f; if ((bool)buttonClearSearch)
{
buttonClearSearch.SetOnClick(ClearSearchText);
buttonClearSearch.SetActive(enable: false);
}
buttonFilter = windows[0].AddBottomButton("mod_filter", CycleFilter);
RefreshFilterButton();
if ((bool)textNoResult)
{
textNoResult.SetText("noResult".lang(), FontColor.Passive);
textNoResult.SetActive(enable: false);
}
}
public void Search(string s)private BaseModPackage FirstInfoTarget()
private void ShowInfo(BaseModPackage p)
{
if (!panelNote || p == null || p == panelTarget)
{
return;
}
panelTarget = p;
UINote n = panelNote;
n.Clear();
n.AddHeader(p.title.IsEmpty(p.dirInfo.Name));
PreviewEntry thumb = GetThumb(p);
if ((bool)thumb.sprite)
if (p != null && p != panelTarget)
{
AddPreviewBox(n, thumb.sprite, delegate
panelTarget = p;
infoTitle.text1.SetText(p.title.IsEmpty(p.dirInfo.Name));
PreviewEntry thumb = GetThumb(p);
infoPreview.SetActive(thumb.sprite);
if ((bool)thumb.sprite)
{
ShowPreview(p);
});
if (thumb.kind == ModPreview.PreviewType.Gif)
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)
{
n.AddText("mod_preview_gif".lang(), FontColor.Passive);
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)
{
return null;
}
string sep = (alternatives ? "mod_info_or".lang() : "\n");
return string.Join("\n", from row in rows
where row != null && row.Length > 0
select string.Join(sep, row.Where((string id) => !id.IsEmpty())) into line
where !line.IsEmpty()
select line);
}
else
{
n.AddText(((thumb.kind == ModPreview.PreviewType.None) ? "mod_preview_none" : "mod_preview_unsupported").lang(), FontColor.Passive);
}
if (!p.author.IsEmpty())
{
AddTopic("author", p.author);
}
if (!p.version.IsEmpty())
{
AddTopic("version", p.version);
}
if (!p.id.IsEmpty())
{
FitValue(AddTopic("mod_info_id", p.id));
}
string text = ModLoadOrderPreset.WorkshopId(p);
FitValue(AddTopic(text.IsEmpty() ? "mod_filter_local" : "mod_filter_workshop", text.IsEmpty() ? p.dirInfo.Name : text));
if (!p.builtin && !p.willActivate)
{
AddTopic("status", "mod_filter_disabled".lang());
}
if (p.blockedBy != null)
{
n.AddText("mod_info_blocked".lang(p.blockedBy.title.IsEmpty(p.blockedBy.id)), FontColor.Bad);
}
if (!p.langDepError.IsEmpty())
{
n.AddText(p.langDepError, FontColor.Bad);
}
if (p.duplicateOf != null)
{
n.AddText("mod_info_duplicate".lang(p.duplicateOf.dirInfo?.Name ?? p.duplicateOf.id), FontColor.Bad);
}
if (!p.IsValidVersion())
{
n.AddText("mod_info_old_version".lang(p.version, ELayer.core.versionMod.GetText()), FontColor.Bad);
}
if (!p.parseError.IsEmpty())
{
n.AddText(p.parseError, FontColor.Bad);
}
string[] tags = p.tags;
if (tags != null && tags.Length > 0)
{
AddTopic("mod_info_tags", string.Join(", ", p.tags));
}
AddIdList(n, "mod_info_requires", p.dependency);
AddIdList(n, "incompatible", p.incompatible);
AddIdList(n, "mod_info_load_after", p.loadAfter);
AddIdList(n, "mod_info_load_before", p.loadBefore);
if (!p.description.IsEmpty())
{
n.Space(8);
n.AddText(p.description);
}
n.Build();
panelScroll.content.anchoredPosition = Vector2.zero;
UIItem AddTopic(string lang, string value)
{
UIItem uIItem = n.AddTopic(lang, value);
uIItem.text1.alignment = TextAnchor.LowerLeft;
return uIItem;
}
}
private static void AddPreviewBox(UINote n, Sprite sprite, Action onClick)
{
n.AddImage(sprite);
RectTransform rectTransform = n.transform.GetChild(n.transform.childCount - 1).Rect();
rectTransform.sizeDelta = new Vector2(rectTransform.sizeDelta.x, 240f);
Image componentInChildren = rectTransform.GetComponentInChildren<Image>();
RectTransform rectTransform2 = componentInChildren.rectTransform;
rectTransform2.anchorMin = Vector2.zero;
rectTransform2.anchorMax = Vector2.one;
rectTransform2.pivot = new Vector2(0.5f, 0.5f);
rectTransform2.anchoredPosition = Vector2.zero;
rectTransform2.sizeDelta = Vector2.zero;
componentInChildren.preserveAspect = true;
Button button = componentInChildren.gameObject.AddComponent<Button>();
button.transition = Selectable.Transition.None;
button.onClick.AddListener(delegate
static void SetInfo(UIItem uIItem, string value)
{
onClick();
});
}
private static void FitValue(UIItem item)
{
if ((bool)item && (bool)item.text2)
{
item.text2.resizeTextForBestFit = true;
item.text2.horizontalOverflow = HorizontalWrapMode.Wrap;
item.text2.resizeTextMinSize = 9;
item.text2.resizeTextMaxSize = item.text2.fontSize;
uIItem.SetActive(!value.IsEmpty());
if (!value.IsEmpty())
{
uIItem.text1.SetText(value);
}
}
}
private static void AddIdList(UINote n, string lang, string[][] rows)
{
if (rows != null && rows.Length != 0)
static void SetTopic(UIItem uIItem, string value, string lang)
{
List<string> list = (from row in rows
where row != null && row.Length > 0 && !row[0].IsEmpty()
select row[0]).ToList();
if (list.Count > 0)
uIItem.SetActive(!value.IsEmpty());
if (!value.IsEmpty())
{
n.AddTopic(lang, string.Join(", ", list)).text1.alignment = TextAnchor.LowerLeft;
if (lang != null)
{
uIItem.text1.SetText(lang.lang());
}
uIItem.text2.SetText(value);
}
}
}private void ShowPreview(BaseModPackage a)
});
}
private void CreatePresetUI()
{
windows[0].AddBottomButton("mod_preset", ShowPresetMenu);
}
private void ShowPresetMenu()
{
SE.Click();ModManager โ
private string UnmetDependency(BaseModPackage p, Dictionary<string, BaseModPackaโฆ)
{
if (baseModPackage != null)
{
return "requires " + baseModPackage.title.IsEmpty(baseModPackage.dirInfo?.Name) + ", which loads after this mod - move it above";
return "mod_info_dep_order\t" + baseModPackage.title.IsEmpty(baseModPackage.dirInfo?.Name);
}
if (baseModPackage2 != null)
{
return "requires " + baseModPackage2.title.IsEmpty(baseModPackage2.dirInfo?.Name) + ", which is installed but did not load";
return "mod_info_dep_failed\t" + baseModPackage2.title.IsEmpty(baseModPackage2.dirInfo?.Name);
}
return "requires " + string.Join(" or ", array) + ", which is not installed";
return "mod_info_dep_missing\t" + string.Join('\t', array);
}
}
return null;SourcePref โ
[Serializable]
public class SourcePref : EClass, ISerializationCallbackReceiver
{
public const int TotalPrefInts = 26;
[JsonProperty]
public int[] ints = new int[25];
public int[] ints = new int[26];
public BitArray32 _bits1; }
}
public int scaleTex
{
get
{
return ints[25];
}
set
{
ints[25] = value;
}
}
public float ScaleTex
{
get
{
Validate();
if (ints[25] > 0)
{
return (float)ints[25] * 0.01f;
}
return 1f;
}
}
public bool bypassShadow
{
getpublic void OnAfterDeserialize()
{
if (ints.Length >= 25)
{
_bits1.SetInt(ints[22]);
}
else
{
Validate();
}
Validate();
_bits1.SetInt(ints[22]);
}
public void OnBeforeSerialize()
{
Validate();
ints[22] = _bits1.ToInt();
}
public void Validate()
{
if (ints.Length < 25)
if (ints.Length < 26)
{
Array.Resize(ref ints, 25);
Array.Resize(ref ints, 26);
}
}
public void WriteIni(string path)
{
Validate();
FileIniDataParser fileIniDataParser = new FileIniDataParser();
if (File.Exists(path))
{public void WriteIni(string path)
iniData.Global["height"] = ints[3].ToString();
iniData.Global["heightFix"] = ints[24].ToString();
iniData.Global["scaleIcon"] = scaleIcon.ToString();
iniData.Global["scaleTex"] = scaleTex.ToString();
iniData.Global["liquidMod"] = liquidMod.ToString();
iniData.Global["liquidModMax"] = liquidModMax.ToString();
iniData.Global["hatY"] = ints[23].ToString();public static SourcePref ReadFromIni(string path)
sourcePref.ints[3] = iniData.Global["height"].ToInt();
sourcePref.ints[24] = iniData.Global["heightFix"].ToInt();
sourcePref.scaleIcon = iniData.Global["scaleIcon"].ToInt();
sourcePref.scaleTex = iniData.Global["scaleTex"].ToInt();
sourcePref.liquidMod = iniData.Global["liquidMod"].ToInt();
sourcePref.liquidModMax = iniData.Global["liquidModMax"].ToInt();
sourcePref.ints[23] = iniData.Global["hatY"].ToInt();SpriteData โ
public class SpriteData
{
public const float DefaultPPU = 100f;
public string id;
public string path;public bool tryFixPrefNotLoadedAtStart;
public static float BaseWidth(Sprite s)
{
return s.rect.width * 100f / s.pixelsPerUnit;
}
public static float BaseHeight(Sprite s)
{
return s.rect.height * 100f / s.pixelsPerUnit;
}
public void Init()
{
try }
}
public void LoadPrefAndFixDensity()
{
float a = pref?.ScaleTex ?? 1f;
LoadPref();
if (sprites != null && !Mathf.Approximately(a, pref?.ScaleTex ?? 1f))
{
LoadSprites();
}
}
public void LoadAnimationIni()
{
if (!File.Exists(path + ".ini")) }
int num = tex.width / frame;
int height = tex.height;
if (sprites == null || sprites.Length != frame)
float num2 = 100f * (pref?.ScaleTex ?? 1f);
if (sprites == null || sprites.Length != frame || !sprites[0] || !Mathf.Approximately(sprites[0].rect.width, num) || !Mathf.Approximately(sprites[0].rect.height, height) || !Mathf.Approximately(sprites[0].pixelsPerUnit, num2))
{
sprites = new Sprite[frame];
}
Vector2 pivot = new Vector2(0.5f, 0.5f);
for (int i = 0; i < frame; i++)
{
sprites[i] = Sprite.Create(tex, new Rect(i * num, 0f, num, height), pivot, 100f, 0u, SpriteMeshType.FullRect);
Vector2 pivot = new Vector2(0.5f, 0.5f);
for (int i = 0; i < frame; i++)
{
sprites[i] = Sprite.Create(tex, new Rect(i * num, 0f, num, height), pivot, num2, 0u, SpriteMeshType.FullRect);
}
}
}SurvivalManager โ
Point pos2 = point.GetNearestPoint(allowBlock: false, allowChara: false, allowInstalled: false, ignoreCenter: true) ?? point;
if (searchWreck2 == 20)
{
Thing container = ThingGen.CreateParcel(null, ThingGen.CreateRecipe("container_shipping"), ThingGen.CreateRecipe("stonecutter"), ThingGen.CreateRecipe("workbench2"), ThingGen.Create("crystal_earth").SetNum(3));
Thing container = ThingGen.CreateParcel(null, ThingGen.CreateRecipe("container_shipping"), ThingGen.CreateRecipe("stonecutter"), ThingGen.CreateRecipe("factory_stone"), ThingGen.CreateRecipe("workbench2"), ThingGen.Create("crystal_earth").SetNum(3));
Meteor(pos2, delegate
{
EClass._zone.AddCard(container, pos2);TCUI โ
public override void OnDraw(ref Vector3 pos)
Vector3 vector = FixPos;
if (render != null && render.hasActor && !render.actor.isPCC && (bool)render.actor && (bool)render.actor.sr && (bool)render.actor.sr.sprite)
{
float num = 128f / render.actor.sr.sprite.rect.height;
float num = 128f / SpriteData.BaseHeight(render.actor.sr.sprite);
int pivotY = render.owner.Pref.pivotY;
vector = FixPos + new Vector3(0f, num * ((float)pivotY - 48f), 0f);
}Trait โ
public virtual void OnBarter(bool reroll = false)
}
break;
}
ShopType shopType = ShopType;
if ((uint)(shopType - 24) <= 1u && EClass._zone is Zone_Yowyn)
{
Add("milk_kumiromi", EClass.rndHalf(6), 0);
}
switch (owner.id)
{
case "rodwyn":Zone โ
public Chara SpawnMob(Point pos = null, SpawnSetting setting = null)
return null;
}
long num3 = ((setting.fixedLv == -1) ? cardRow.LV : setting.fixedLv);
bool flag = setting.fixedLv != -1 || DangerLvBoost > 0;
bool flag = setting.fixedLv != -1 || setting.addLv > 0 || DangerLvBoost > 0;
num3 += setting.addLv;
if (ScaleType == ZoneScaleType.Void)
{public Chara SpawnMob(Point pos = null, SpawnSetting setting = null)
flag = true;
}
num3 += DangerLvBoost;
if (flag && num3 <= Mathf.Max(50, cardRow.LV))
{
flag = false;
}
if (setting.rarity == Rarity.Random && cardRow.quality == 0)
{
if (EClass.rnd(EClass.pc.HasElement(1271) ? 80 : 100) == 0)