Skip to content

EA 23.299 Nightly โ€‹

April 27, 2026

18 files modified. 1 new file created.

Important Changes โ€‹

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

Chara (1) โ€‹

cs
public Point lastPos = new Point(); 
public new Point lastPos = new Point(); 

BiomeProfile โ€‹

protected string _GetThing(string id)

cs
		{
			return "-";
		}
		SourceThing.Row row = EClass.editorSources.things.rows.First((SourceThing.Row a) => a.id == id); 
		SourceThing.Row row = EClass.editorSources.things.rows.FirstOrDefault((SourceThing.Row a) => a.id == id); 
		if (row != null)
		{
			return row.id + "-(" + row.name_JP + ")";

protected IEnumerable<string> ThingRows()

cs

		protected string _GetObj(int id)
		{
			SourceObj.Row row = EClass.editorSources.objs.rows.First((SourceObj.Row a) => a.id == id); 
			SourceObj.Row row = EClass.editorSources.objs.rows.FirstOrDefault((SourceObj.Row a) => a.id == id); 
			if (row != null)
			{
				return row.id + "-" + row.alias + "(" + row.name_JP + ")";

protected IEnumerable<string> ObjRows()

cs

		protected string _GetFloor(int id)
		{
			SourceFloor.Row row = EClass.editorSources.floors.rows.First((SourceFloor.Row a) => a.id == id); 
			SourceFloor.Row row = EClass.editorSources.floors.rows.FirstOrDefault((SourceFloor.Row a) => a.id == id); 
			if (row != null)
			{
				return row.id + "-" + row.alias + "(" + row.name_JP + ")";

protected IEnumerable<string> FloorRows()

cs

		protected string _GetBlock(int id)
		{
			SourceBlock.Row row = EClass.editorSources.blocks.rows.First((SourceBlock.Row a) => a.id == id); 
			SourceBlock.Row row = EClass.editorSources.blocks.rows.FirstOrDefault((SourceBlock.Row a) => a.id == id); 
			if (row != null)
			{
				return row.id + "-" + row.alias + "(" + row.name_JP + ")";

protected string _GetMat(int id)

cs
		{
			id = 0;
		}
		SourceMaterial.Row row = EClass.editorSources.materials.rows.First((SourceMaterial.Row a) => a.id == id); 
		SourceMaterial.Row row = EClass.editorSources.materials.rows.FirstOrDefault((SourceMaterial.Row a) => a.id == id); 
		if (row != null)
		{
			return row.id + "-" + row.alias + "(" + row.name_JP + ")";

protected string _GetSpawnList(string id)

cs
		{
			return "-";
		}
		SourceSpawnList.Row row = EClass.editorSources.spawnLists.rows.First((SourceSpawnList.Row a) => a.id == id); 
		SourceSpawnList.Row row = EClass.editorSources.spawnLists.rows.FirstOrDefault((SourceSpawnList.Row a) => a.id == id); 
		if (row != null)
		{
			return row.id;

public class Item : BaseItem

cs
		{
			public int idObj;

			public override bool IsSpawnOnBlock => EClass.sources.objs.rows[idObj].tileType.IsBlockMount; 
			public override bool IsSpawnOnBlock => EClass.sources.objs.map[idObj].tileType.IsBlockMount; 

			public override bool IsSpawnOnWater => EClass.sources.objs.rows[idObj].tileType.CanSpawnOnWater; 
			public override bool IsSpawnOnWater => EClass.sources.objs.map[idObj].tileType.CanSpawnOnWater; 

			public string obj
			{

Card โ€‹

public enum MoveType

cs

	public Point pos = new Point();

	public Point lastPos = new Point(); 
	public CardRenderer renderer;

	public CardRow hat;

public byte[] c_textureData

cs
		}
	}

	public SourceMaterial.Row DyeMat => EClass.sources.materials.rows[c_dyeMat]; 
	public SourceMaterial.Row DyeMat => EClass.sources.materials.map.TryGetValue(c_dyeMat) ?? EClass.sources.materials.map[1]; 

	public int invX
	{

public void Create(string _id, int _idMat = -1, int genLv = -1)

cs
		bool flag = (bp != null && bp.fixedMat) || sourceCard.quality == 4 || sourceCard.tierGroup.IsEmpty();
		if (_idMat != -1)
		{
			_material = EClass.sources.materials.rows[_idMat]; 
			_material = EClass.sources.materials.map.TryGetValue(_idMat) ?? EClass.sources.materials.map[1]; 
		}
		else if (!flag)
		{

public void DamageHP(long dmg, int ele, int eleP = 100, AttackSource attackSourc

cs
					{
						int num = chara4.Evalue(1241);
						int num2 = chara4.Evalue(438);
						if ((num != 0 || num2 != 0) && !chara4.IsDisabled && !chara4.isRestrained && (!IsPCFactionOrMinion || chara4.IsPCFactionOrMinion) && chara4.Dist(this) <= Mathf.Max(num, (num2 > 0) ? 1 : 0) && (num != 0 || num2 <= 0 || hp * 100 / MaxHP <= chara4.hp * 100 / chara4.MaxHP)) 
						if ((num != 0 || num2 != 0) && !chara4.IsDisabled && !chara4.isRestrained && (!IsPCFactionOrMinion || chara4.IsPCFactionOrMinion) && (IsPCFactionOrMinion || !chara4.IsPCFactionOrMinion) && chara4.Dist(this) <= Mathf.Max(num, (num2 > 0) ? 1 : 0) && (num != 0 || num2 <= 0 || hp * 100 / MaxHP <= chara4.hp * 100 / chara4.MaxHP)) 
						{
							Say((num2 == 0) ? "wall_flesh" : "wall_knightly", chara4, this);
							chara4.DamageHP(dmg, ele, eleP, attackSource, origin, showEffect, weapon, Chara); 
							chara4.DamageHP(dmg * (100 + ((num2 <= 0) ? 10 : 0)) / 100, ele, eleP, attackSource, origin, showEffect, weapon, Chara); 
							return;
						}
					}

public void DamageHP(long dmg, int ele, int eleP = 100, AttackSource attackSourc

cs
							Chara.AddCondition<ConFractured>((int)Mathf.Max(10f, 30f - Mathf.Sqrt(Evalue(436))));
							hp = Mathf.Min(half * (int)Mathf.Sqrt(Evalue(436) * 2) / 100, MaxHP / 3);
						});
						goto IL_10b3; 
						goto IL_10dd; 
					}
				}
				if (zoneInstanceBout != null && (bool)LayerDrama.Instance)

public void DamageHP(long dmg, int ele, int eleP = 100, AttackSource attackSourc

cs
						if (EClass.player.invlunerable)
						{
							EvadeDeath(null);
							goto IL_10b3; 
							goto IL_10dd; 
						}
					}
					if (Evalue(1220) > 0 && Chara.stamina.value >= (IsPC ? (Chara.stamina.max / 2) : (Chara.stamina.max / 3 * 2)))

public void DamageHP(long dmg, int ele, int eleP = 100, AttackSource attackSourc

cs
			}
		}
	}
	goto IL_10b3; 
	IL_10b3: 
	goto IL_10dd; 
	IL_10dd: 
	if (trait.CanBeAttacked)
	{
		renderer.PlayAnime(AnimeID.HitObj);

public MoveResult TryMoveFrom(Point p)

cs
	point.Set(pos);
	point.x -= num;
	point.z -= num2;
	if (point.IsValid && !point.HasChara) 
	if (point.IsValid && !point.HasChara && TryMove(point, allowDestroyPath: false) == MoveResult.Success) 
	{ 
		return MoveResult.Success; 
	} 
	for (int i = -1; i < 2; i++) 
	{
		return TryMove(point, allowDestroyPath: false); 
		for (int j = -1; j < 2; j++) 
		{ 
			if (EClass.rnd(2) != 0) 
			{ 
				point.x = pos.x + j; 
				point.z = pos.z + i; 
				if (!point.Equals(lastPos) && point.IsValid && !point.HasChara && TryMove(point, allowDestroyPath: false) == MoveResult.Success) 
				{ 
					return MoveResult.Success; 
				} 
			} 
		} 
	}
	return MoveResult.Fail;
}

public ref Color GetRandomColor()

cs
	}
	Rand.UseSeed(num, delegate
	{
		_randColor = EClass.sources.materials.rows[EClass.rnd(90)].matColor; 
		_randColor = EClass.sources.materials.rows.RandomItem().matColor; 
	});
	return ref _randColor;
}

Chara โ€‹

public class Chara : Card, IPathfindWalker

cs

	public Chara master;

	public Point lastPos = new Point(); 
	public new Point lastPos = new Point(); 

	public PathProgress path = new PathProgress();

public void TryPush(Point point)

cs
	}
	list.Copy().ForeachReverse(delegate(Chara c)
	{
		if (!c.ai.IsMoveAI && !c.IsPC && c.trait.CanBePushed && c != this && !c.noMove && (!EClass._zone.IsRegion || c.IsPCFactionOrMinion)) 
		if ((trait is TraitSnitch && c.IsPCFactionOrMinion) || (!c.ai.IsMoveAI && !c.IsPC && c.trait.CanBePushed && c != this && !c.noMove && (!EClass._zone.IsRegion || c.IsPCFactionOrMinion))) 
		{
			List<Point> list2 = new List<Point>();
			for (int i = point.x - 1; i <= point.x + 1; i++)

ConTransmuteHuman โ€‹

public override void OnBeforeStart()

cs
{
	if (chara == null)
	{
		List<Chara> list = owner.pos.ListCharasInRadius(owner, 5, delegate(Chara c) 
		{ 
			if (!c.IsMultisize && c.IsHumanSpeak) 
			{ 
				CardRenderer renderer = c.renderer; 
				if (renderer != null && !renderer.hasActor) 
				{ 
					return !c.HasElement(1427); 
				} 
			} 
			return false; 
		}); 
		List<Thing> list = owner.things.List((Thing t) => t.trait is TraitFigure { source: not null } traitFigure && !traitFigure.source.multisize, onlyAccessible: true); 
		if (list.Count > 0)
		{
			chara = list.RandomItem().Duplicate(); 
			chara = CharaGen.Create((list.RandomItem().trait as TraitFigure).source.id); 
		}
		else
		{
			chara = CharaGen.CreateFromFilter("c_guest"); 
			List<Chara> list2 = owner.pos.ListCharasInRadius(owner, 5, delegate(Chara c) 
			{ 
				if (!c.IsMultisize && c.IsHumanSpeak) 
				{ 
					CardRenderer renderer = c.renderer; 
					if (renderer != null && !renderer.hasActor) 
					{ 
						return !c.HasElement(1427); 
					} 
				} 
				return false; 
			}); 
			if (list2.Count > 0) 
			{ 
				chara = list2.RandomItem().Duplicate(); 
			} 
			else
			{ 
				chara = CharaGen.CreateFromFilter("c_guest"); 
			} 
		}
	}
	base.OnBeforeStart();

GrowSystem โ€‹

public bool CanGrow(VirtualDate date)

cs
	{
		return false;
	}
	if (EClass._zone.IsUnderwater) 
	if (GrowUndersea) 
	{
		if (!GrowUndersea) 
		if (EClass._zone.IsUnderwater || cell.sourceSurface.tileType.IsDeepWater) 
		{
			return false; 
			return true; 
		}
	}
	else if (cell.sourceFloor.tileType.IsDeepWater) 
	else if (EClass._zone.IsUnderwater) 
	{
		if (!GrowUndersea) 
		{ 
			return false; 
		} 
		return false; 
	}
	else if (!GrowOnLand) 
	if (!GrowOnLand) 
	{
		return false;
	}

MATERIAL โ€‹

public class MATERIAL : EClass

cs

	public const int MaxTier = 7;

	public static SourceMaterial.Row sourceSnow = EClass.sources.materials.rows[48]; 
	public static SourceMaterial.Row sourceSnow = EClass.sources.materials.map[48]; 

	public static SourceMaterial.Row sourceIce = EClass.sources.materials.rows[61]; 
	public static SourceMaterial.Row sourceIce = EClass.sources.materials.map[61]; 

	public static SourceMaterial.Row sourceGold = EClass.sources.materials.rows[12]; 
	public static SourceMaterial.Row sourceGold = EClass.sources.materials.map[12]; 

	public static SourceMaterial.Row sourceOak = EClass.sources.materials.rows[1]; 
	public static SourceMaterial.Row sourceOak = EClass.sources.materials.map[1]; 

	public static SourceMaterial.Row sourceWaterSea => EClass.sources.materials.rows[88]; 
	public static SourceMaterial.Row sourceWaterSea = EClass.sources.materials.map[88]; 

	public static SourceMaterial.Row FromElement(int id)
	{

Map โ€‹

public void _AddCard(int x, int z, Card t, bool onAddToZone)

cs
	{
		_RemoveCard(t);
	}
	t.lastPos.Set(t.pos); 
	t.pos.Set(x, z);
	if (t.IsMultisize)
	{

public void TryShatter(Point pos, int ele, int power)

cs
				List<SourceThing.Row> list3 = new List<SourceThing.Row>();
				foreach (RecipeSource item4 in RecipeManager.list)
				{
					if (!(item4.row is SourceThing.Row { isOrigin: false } row) || row.components.IsEmpty() || (row.components.Length >= 3 && !row.components[2].StartsWith('+')) || !row.Category.IsChildOf("meal")) 
					if (!(item4.row is SourceThing.Row { isOrigin: false } row) || row.components.IsEmpty() || (row.components.Length >= 3 && !row.components[2].StartsWith('+')) || !row.Category.IsChildOf("meal") || (row.HasTag(CTAG.dish_fail) && power > EClass.rnd(500))) 
					{
						continue;
					}

ModManager โ€‹

public void InitPackagesMeta()

cs
	{
		try
		{
			package.Init(); 
			mappedPackages[package.id] = package as ModPackage; 
			if (package.Init()) 
			{ 
				mappedPackages[package.id] = package as ModPackage; 
			} 
			_loading?.Log(package.ToString());
		}
		catch (Exception ex)

Recipe โ€‹

public virtual SourceMaterial.Row GetMainMaterial()

cs
		{
			num = 3;
		}
		return EClass.sources.materials.rows[num]; 
		return EClass.sources.materials.map.TryGetValue(num) ?? EClass.sources.materials.map[3]; 
	}

	public virtual SourceMaterial.Row GetColorMaterial()
	{
		if (idMat != -1)
		{
			return EClass.sources.materials.rows[idMat]; 
			return EClass.sources.materials.map.TryGetValue(idMat) ?? EClass.sources.materials.map[3]; 
		}
		if (UseStock)
		{

public virtual SourceMaterial.Row GetColorMaterial()

cs
				}
				return thing.DyeMat;
			}
			return EClass.sources.materials.rows[3]; 
			return EClass.sources.materials.map[3]; 
		}
		int num = ((ingredients.Count > 0) ? ingredients[source.colorIng].mat : 3);
		if (num == -1)
		{
			num = 3;
		}
		return EClass.sources.materials.rows[num]; 
		return EClass.sources.materials.map.TryGetValue(num) ?? EClass.sources.materials.map[3]; 
	}

	public virtual void BuildIngredientList()

public virtual void Build(Chara chara, Card t, Point pos, int mat, int dir, int

cs
	{
		mat = 2;
	}
	EClass.pc.PlaySound(EClass.sources.materials.rows[mat].GetSoundImpact()); 
	SourceMaterial.Row row = EClass.sources.materials.map.TryGetValue(mat) ?? EClass.sources.materials.map[2]; 
	EClass.pc.PlaySound(row.GetSoundImpact()); 
	pos.cell.isModified = true;
	switch (source.type)
	{

public virtual void Build(Chara chara, Card t, Point pos, int mat, int dir, int

cs
		int ramp = tileRow.id;
		if (ramp == 3)
		{
			ramp = EClass.sources.materials.rows[mat].ramp; 
			ramp = row.ramp; 
		}
		if (EClass.scene.actionMode.IsRoofEditMode())
		{

RecipeCard โ€‹

public override void Build(Chara chara, Card t, Point pos, int mat, int dir, int

cs
	{
		mat = 2;
	}
	EClass.pc.PlaySound(EClass.sources.materials.rows[mat].GetSoundImpact()); 
	SourceMaterial.Row row = EClass.sources.materials.map.TryGetValue(mat) ?? EClass.sources.materials.map[2]; 
	EClass.pc.PlaySound(row.GetSoundImpact()); 
	t.SetDir(dir);
	t.idSkin = idSkin;
	EClass._zone.AddCard(t, pos);

Region โ€‹

using System.Collections.Generic;

cs
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization; 
using Newtonsoft.Json;
using UnityEngine;

public List<Chara> ListMobs()

cs
		}
		return list;
	}
	[OnDeserialized] 
	private void _OnDeserialized(StreamingContext context) 
	{ 
		for (int num = children.Count - 1; num >= 0; num--) 
		{ 
			if (!EClass.sources.zones.map.ContainsKey(children[num].id)) 
			{ 
				RemoveChild(children[num]); 
			} 
		} 
	} 
}

SerializedCards โ€‹

public void Restore(Map map, Map orgMap, bool addToZone, PartialMap partial = nu

cs
		}
		if (version >= 2 && card4.idDyeMat != -1)
		{
			card2.Dye(EClass.sources.materials.rows.TryGet(card4.idDyeMat, 1)); 
			card2.Dye(EClass.sources.materials.map.TryGetValue(card4.idDyeMat) ?? EClass.sources.materials.map[1]); 
		}
		card2.mapObj = card4.obj;
		if (card2.mapObj?.TryGetValue(2) != null)

SpriteData โ€‹

public void Init()

cs
		catch (Exception exception)
		{
			Debug.LogException(exception);
			Debug.LogError("#sprite failed to init '" + id + "' at " + path); 
			Debug.LogError("#sprite failed " + id + "/" + path); 
		}
	}

SpriteReplacer โ€‹

public void BuildSuffixData(string id, Dictionary<string, string> dictTexItems)

cs
			};
			spriteData.Init();
			suffixes[text4] = spriteData;
			Debug.Log("#sprite replacer init '" + text4 + "' at " + path.ShortPath()); 
			Debug.Log("#sprite replacer " + text4.IsEmpty("<base>") + "/" + path.ShortPath()); 
		}
	}
}

Trait โ€‹

public Thing CreateStock()

cs
			case ShopType.GeneralExotic:
				return FromFilter("shop_generalExotic");
			case ShopType.VMachine:
				if (EClass.rnd(10) == 0) 
				{ 
					return Create("wear_swim"); 
				} 
				if (EClass.rnd(10) == 0)
				{
					return Create("panty");

TraitBoat โ€‹

public SourceMaterial.Row GetWaterMat()

cs
				mat = p.matFloor.id;
			}
		});
		return EClass.sources.materials.rows[mat]; 
		return EClass.sources.materials.map.TryGetValue(mat) ?? EClass.sources.materials.map[67]; 
	}
}

TraitDrawingPaperM โ€‹

public class TraitDrawingPaperM : TraitDrawingPaper

cs

	public override int Height => 64;

	public override int SizeGrid => 15; 
	public override int SizeGrid => 12; 
}

+TraitSnitch โ€‹

File Created
cs
public class TraitSnitch : TraitUniqueMonster
{
}

ZonePreEnterBout โ€‹

public override void Execute()

cs
	for (int i = 0; i < EClass.pc.party.members.Count - 1; i++)
	{
		Chara chara = CharaGen.CreateFromFilter("c_neutral", target.LV + 10);
		Debug.Log(chara); 
		chara.ChangeRarity(Rarity.Superior); 
		if (chara.LV < target.LV) 
		if (!(chara.trait is TraitMerchantTravel)) 
		{
			chara.SetLv(target.LV); 
			chara.ChangeRarity(Rarity.Superior); 
			if (chara.LV < target.LV) 
			{ 
				chara.SetLv(target.LV); 
			} 
			EClass._zone.AddCard(chara, target.pos.GetNearestPoint(allowBlock: false, allowChara: false) ?? target.pos); 
			list.Add(chara); 
		}
		EClass._zone.AddCard(chara, target.pos.GetNearestPoint(allowBlock: false, allowChara: false) ?? target.pos); 
		list.Add(chara); 
	}
	Debug.Log(list.Count);
	foreach (Chara item in list)