Skip to content

EA 23.288 Nightly

March 26, 2026

16 files modified. 2 new files created.

Important Changes

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

BaseWidgetNotice (1)

cs
public override void OnFlip() 

ThingContainer (3)

cs
private static List<Thing> tempList = new List<Thing>(); 
cs
private void _ListCurrency(string id) 
private void _ListCurrency(List<Thing> tempList, string id) 
cs
public void _List(Func<Thing, bool> func, bool onlyAccessible = false) 
public void _List(List<Thing> tempList, Func<Thing, bool> func, bool onlyAccessible = false) 

AI_Idle

public override IEnumerable<Status> Run()

cs
		{
		case "azzrasizzle":
		case "geist":
		case "machine_speller":
		{
			if (EClass.rnd(20) != 0)
			{

ActKiss

public override bool CanPerform()

cs
		{
			return false;
		}
		if (Act.TC.IsPC && Act.TC.Chara.parasite == null && Act.TC.Chara.ride == null) 
		{ 
			return false; 
		} 
		return true;
	}

ActNTR

public override bool CanPerform()

cs
	{
		return false;
	}
	if (!Act.CC.CanSeeLos(chara)) 
	{ 
		return false; 
	} 
	if (chara.conSleep != null || Act.CC.HasElement(1239) || chara.Evalue(418) < 0)
	{
		return true;

ActTelekinesis

public override void OnMarkMapHighlights()

cs

	public override bool CanPerform()
	{
		if (!Act.CC.IsPC) 
		if (Act.CC.IsPC) 
		{
			return false; 
			Act.TC = EClass.scene.mouseTarget.card; 
		}
		Act.TC = EClass.scene.mouseTarget.card; 
		if (Act.TC == null || Act.TC.pos.Equals(Act.CC.pos))
		{
			return false;
		}
		if (!Act.CC.IsPC && Act.CC.Dist(Act.TC) != 1) 
		{ 
			return false; 
		} 
		if (!Act.TC.trait.CanBeHeld || !Act.TC.trait.CanBeTeleported || Act.TC.IsMultisize)
		{
			return false;

BaseTileMap

public virtual void DrawTile()

cs
						_actorPos.x += pref.x * (float)((!t.flipX) ? 1 : (-1));
						_actorPos.z += pref.z;
						thingPos.z += pref.z;
						liquidLv -= (int)(num12 * 150f); 
						if (liquidLv < 0)
						{
							liquidLv = 0;

BaseWidgetNotice

private void OnDisable()

cs

	public void _RefreshAll()
	{
		layout.childAlignment = RectPositionToTextAnchor(base.config.pivot); 
		OnRefresh();
		foreach (BaseNotification i in list)
		{

public void Remove(BaseNotification n)

cs
		}
	}

	public override void OnFlip() 
	{ 
		layout.childAlignment = (flip ? TextAnchor.MiddleRight : TextAnchor.MiddleLeft); 
		this.Rect().pivot = new Vector2(flip ? 1 : 0, this.Rect().pivot.y); 
	} 
	public override void OnSetContextMenu(UIContextMenu m)
	{
		m.AddChild("style").AddSlider("toggleButtonBG", (float a) => a.ToString() ?? "", base.config.skin.button, delegate(float a)

Card

public virtual int GetPrice(CurrencyType currency = CurrencyType.Money, bool sel

cs
				return 5;
			case "lunch_love":
				return 20;
			case "scroll_alias":
				return 5; 
			case "scroll_biography":
				return 5; 
			case "1268":
				return 8; 
			case "1329":
				return 20; 
			}
			break;
		case CurrencyType.Ecopo:

QuestDefenseGame

public class QuestDefenseGame : QuestInstance

cs

	public override bool FameContent => useFame;

	public override int FameOnComplete => (lastWave * 8 + difficulty * 10) * (100 + bonus * 5) / 100; 
	public override int FameOnComplete => (LastWaveBonus * 8 + difficulty * 10) * (100 + bonus * 5) / 100; 
	public int LastWaveBonus => Mathf.Min(lastWave, 1000000); 

	public override ZoneEventQuest CreateEvent()
	{

public override void OnInit()

cs
	public override void OnBeforeComplete()
	{
		Debug.Log("QuestDefenseGame: " + lastWave + "/" + bonus);
		bonusMoney += EClass.rndHalf(lastWave * 400 * (100 + bonus * 5) / 100); 
		bonusMoney += EClass.rndHalf(LastWaveBonus * 400 / 100 * (100 + bonus * 5)); 
	}

	public override string GetTextProgress()

QuestRandom

public class QuestRandom : Quest

cs

	public override void OnDropReward()
	{
		int num = bonusMoney * (55 + difficulty * 15) / 100; 
		int num2 = rewardMoney + num; 
		long num = (long)bonusMoney * (long)(55 + difficulty * 15) / 100; 
		int num2 = MathEx.ClampToInt(num + rewardMoney, 10000000); 
		if (num2 > 0)
		{
			if (num > 0)

Steam

private void CreateUserContent2(UgcQuery query)

cs
		for (int i = 0; i < keyValueTags.Length; i++)
		{
			StringKeyValuePair stringKeyValuePair = keyValueTags[i];
			if (stringKeyValuePair.key == "id" && stringKeyValuePair.value == baseModPackage.id && results.Owner.id == App.Client.Owner.id) 
			if (stringKeyValuePair.key == "id" && stringKeyValuePair.value == baseModPackage.id && results.Owner.id == User.Client.Id) 
			{
				Debug.Log("Updating Content");
				UpdateUserContent(results.FileId);

ThingContainer

public bool IsValid

cs

	private static List<ThingContainer> _listContainers = new List<ThingContainer>();

	private static List<Thing> tempList = new List<Thing>(); 
	[JsonIgnore]
	public int GridSize => width * height;

public bool IsFull(Thing t, bool recursive = true, bool tryStack = true)

cs
public void AddCurrency(Card owner, string id, int a, SourceMaterial.Row mat = null)
{
	int num = a;
	ListCurrency(id); 
	foreach (Thing temp in tempList) 
	foreach (Thing item in ListCurrency(id)) 
	{
		if (!(temp.id != id) && (mat == null || temp.material == mat) && (num <= 0 || temp.Num + num > 0)) 
		if (!(item.id != id) && (mat == null || item.material == mat) && (num <= 0 || item.Num + num > 0)) 
		{
			if (num > 0)
			{
				temp.ModNum(num); 
				item.ModNum(num); 
				return;
			}
			if (temp.Num + num >= 0) 
			if (item.Num + num >= 0) 
			{
				temp.ModNum(num); 
				item.ModNum(num); 
				return;
			}
			num += temp.Num; 
			temp.ModNum(-temp.Num); 
			num += item.Num; 
			item.ModNum(-item.Num); 
		}
	}
	if (num != 0 && num > 0)

public Thing Find<T>() where T : Trait

cs

	public Thing FindBest<T>(Func<Thing, int> func) where T : Trait
	{
		List((Thing t) => t.trait is T, onlyAccessible: true); 
		if (tempList.Count == 0) 
		List<Thing> list = List((Thing t) => t.trait is T, onlyAccessible: true); 
		if (list.Count == 0) 
		{
			return null;
		}
		tempList.Sort((Thing a, Thing b) => func(b) - func(a)); 
		return tempList[0]; 
		list.Sort((Thing a, Thing b) => func(b) - func(a)); 
		return list[0]; 
	}

	public Thing Find(Func<Thing, bool> func, bool recursive = true)

public long GetCurrency(string id, ref long sum, SourceMaterial.Row mat = null)

cs

	public List<Thing> ListCurrency(string id)
	{
		tempList.Clear(); 
		_ListCurrency(id); 
		return tempList; 
		List<Thing> list = new List<Thing>(); 
		list.Clear(); 
		_ListCurrency(list, id); 
		return list; 
	}

	private void _ListCurrency(string id) 
	private void _ListCurrency(List<Thing> tempList, string id) 
	{
		using Enumerator enumerator = GetEnumerator();
		while (enumerator.MoveNext())

private void _ListCurrency(string id)

cs
		Thing current = enumerator.Current;
		if (current.CanSearchContents)
		{
			current.things._ListCurrency(id); 
			current.things._ListCurrency(tempList, id); 
		}
		if (current.id == id)
		{

private void _ListCurrency(string id)

cs

	public List<Thing> List(Func<Thing, bool> func, bool onlyAccessible = false)
	{
		tempList.Clear(); 
		_List(func, onlyAccessible); 
		return tempList; 
		List<Thing> list = new List<Thing>(); 
		list.Clear(); 
		_List(list, func, onlyAccessible); 
		return list; 
	}

	public void _List(Func<Thing, bool> func, bool onlyAccessible = false) 
	public void _List(List<Thing> tempList, Func<Thing, bool> func, bool onlyAccessible = false) 
	{
		if (onlyAccessible && !owner.trait.CanSearchContent)
		{

public void _List(Func<Thing, bool> func, bool onlyAccessible = false)

cs
	while (enumerator.MoveNext())
	{
		Thing current = enumerator.Current;
		current.things._List(func, onlyAccessible); 
		current.things._List(tempList, func, onlyAccessible); 
		if (func(current))
		{
			tempList.Add(current);

Trait

public void OnBarter(bool reroll = false)

cs
		Add("book_resident", 1, 0);
		Add("board_party", 1, 0);
		Add("board_party2", 1, 0);
		Add("book_roster", 1, 0); 
		Add("3", 1, 0);
		Add("4", 1, 0);
		Add("5", 1, 0);

public void OnBarter(bool reroll = false)

cs
				break;
			case ShopType.Moyer:
			{
				for (int num13 = 1; num13 <= 17; num13++) 
				for (int num13 = 1; num13 <= 20; num13++) 
				{
					AddAdvWeek(num13);
				}

Thing Add(string id, int a, int idSkin)

cs
			}
			void AddAdvWeek(int i)
			{
				Thing thing7 = ThingGen.CreateRedBook("advweek_" + i); 
				thing7.c_priceFix = -90; 
				AddThing(thing7); 
				if (i != 18) 
				{ 
					Thing thing7 = ThingGen.CreateRedBook("advweek_" + i); 
					thing7.c_priceFix = -90; 
					AddThing(thing7); 
				} 
			}
			void AddCassette(int idCas, string idQuest, int phase)
			{

TraitBookResident

public class TraitBookResident : TraitItem

cs
{
	public override string LangUse => "actRead";

	public override bool IsHomeItem => true; 
	public override bool OnUse(Chara c)
	{
		if (!EClass._zone.IsPCFaction)

+TraitBookRoster

File Created
cs
public class TraitBookRoster : TraitItem
{
	public override string LangUse => "actRead";

	public override bool IsHomeItem => true;

	public override bool OnUse(Chara c)
	{
		if (!EClass._zone.IsPCFaction)
		{
			Msg.SayNothingHappen();
			return false;
		}
		LayerPeople.CreateParty();
		return false;
	}
}

TraitCrafter

public override void TrySetAct(ActPlan p)

cs
			return false;
		}, _t, CursorSystem.Craft);
	}
	else if (!(this is TraitIncubator) || EClass._zone.IsPCFaction) 
	else
	{
		p.TrySetAct(CrafterTitle, delegate
		{

TraitGeyser

public class TraitGeyser : TraitBath

cs
public class TraitGeyser : TraitBath
public class TraitGeyser : Trait
{
	public override int radius => 4;
}

+TraitSpeaker

File Created
cs
public class TraitSpeaker : Trait
{
	public override ToggleType ToggleType => ToggleType.Electronics;
}

Widget

public void SetAnchor(RectPosition p)

cs
		_rect.SetAnchor(p);
	}

	public TextAnchor RectPositionToTextAnchor(RectPosition p) 
	{ 
		return p switch
		{ 
			RectPosition.TopCenter => TextAnchor.UpperCenter,  
			RectPosition.BottomCenter => TextAnchor.LowerCenter,  
			RectPosition.TopLEFT => TextAnchor.UpperLeft,  
			RectPosition.BottomLEFT => TextAnchor.LowerLeft,  
			RectPosition.TopRIGHT => TextAnchor.UpperRight,  
			RectPosition.BottomRIGHT => TextAnchor.LowerRight,  
			RectPosition.Left => TextAnchor.MiddleLeft,  
			RectPosition.Right => TextAnchor.MiddleRight,  
			_ => TextAnchor.MiddleCenter,  
		}; 
	} 
	public void SetPivot(RectPosition p)
	{
		config.pivot = p;