Skip to content

EA 23.289 Nightly

March 30, 2026

16 files modified. 2 new files created.

Important Changes

None.

AI_Idle

public override IEnumerable<Status> Run()

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

Card

public void ApplyTrait()

cs
	string str = c_idTrait;
	if (str.IsEmpty())
	{
		if (sourceCard.trait.IsEmpty()) 
		{ 
			trait = (isChara ? new TraitChara() : new Trait()); 
		} 
		else
		if (!sourceCard.trait.IsEmpty()) 
		{
			trait = ClassCache.Create<Trait>("Trait" + sourceCard.trait[0], "Elin");
		}

public void ApplyTrait()

cs
		{
			trait = ClassCache.Create<Trait>(str, "Elin");
		}
		if (trait == null) 
		{ 
			trait = (isChara ? new TraitChara() : new Trait()); 
		} 
		trait.SetOwner(this);
	}

Chara

public bool UseAbility(Act a, Card tc = null, Point pos = null, bool pt = false)

cs
	{
		if (!Dialog.warned && cost.type == Act.CostType.MP && cost.cost > 0 && mana.value < num6 && !EClass.debug.godMode)
		{
			Card cardBk = EClass.scene.mouseTarget.card; 
			ActPlan.warning = true;
			Dialog.TryWarnMana(delegate
			{
				EClass.scene.mouseTarget.card = cardBk; 
				if (UseAbility(a, tc, pos, pt))
				{
					EClass.player.EndTurn();

FoodEffect

public static void Proc(Chara c, Thing food, bool consume = true)

cs
		return;
	}
	food.CheckJustCooked();
	bool flag = EClass._zone.IsPCFaction && c2.IsInSpot<TraitSpotDining>(); 
	bool flag = EClass._zone.IsPCFactionOrTent && c2.IsInSpot<TraitSpotDining>(); 
	int num = (food.isCrafted ? ((EClass.pc.Evalue(1650) >= 3) ? 5 : 0) : 0);
	float num2 = (float)(100 + (food.HasElement(757) ? 10 : 0) + (flag ? 10 : 0) + num + Mathf.Min(food.QualityLv * 10, 100)) / 200f;
	if (num2 < 0.1f)

Region

public override void OnAdvanceHour()

cs
		{
			ShouldPass = (SourceChara.Row s) => s.biome == biome.name || s.biome.IsEmpty()
		}) : SpawnList.Get(biome.spawn.GetRandomCharaId()));
		Chara chara = CharaGen.CreateFromFilter(list, regionPoint.dangerLv); 
		Chara chara = null; 
		chara = ((EClass.rnd(EClass.debug.enable ? 2 : 50) != 0) ? CharaGen.CreateFromFilter(list, regionPoint.dangerLv) : CharaGen.Create("merchant_travel")); 
		if (chara != null && !(chara.trait is TraitUniqueMonster))
		{
			AddCard(chara, randomPoint);

ShopType

public enum ShopType

cs
	Sweet,
	Moyer,
	Curry,
	KeeperOfGarden 
	KeeperOfGarden, 
	TravelMerchant 
}

SourceMaterial

public void Init()

cs
					}
				}
			}
			Core.Instance.Colors.matColors[alias] = matColors; 
		}
		matColor = matColors.main;
		altColor = matColors.alt;

SpawnSetting

public static SpawnSetting Mob(string id, string idEle = null, int fixedLv = -1)

cs
		};
	}

	public static SpawnSetting TravelMerchant(string id, int fixedLv = -1) 
	{ 
		return new SpawnSetting
		{ 
			id = id, 
			rarity = Rarity.Legendary, 
			fixedLv = fixedLv 
		}; 
	} 
	public static SpawnSetting HomeWild(int lv)
	{
		return new SpawnSetting

Trait

public void OnBarter(bool reroll = false)

cs
		};
		foreach (string id2 in array)
		{
			AddThing(ThingGen.Create(id2, MATERIAL.GetRandomMaterialFromCategory(50, "rock", EClass.sources.materials.alias["granite"]).id).SetNum(10)); 
			AddThing(ThingGen.Create(id2, MATERIAL.GetRandomMaterialFromCategory(50, "rock", EClass.sources.materials.alias["granite"]).id).SetNum(99)); 
		}
		Add("scroll_alias", 10, 0); 
		Add("scroll_biography", 10, 0); 
		Add("cloud", 99, 0); 
		Add("scroll_alias", 99, 0); 
		Add("scroll_biography", 99, 0); 
		Add("1329", 1, 0);
		break;
	}

public void OnBarter(bool reroll = false)

cs
				case ShopType.StrangeGirl:
					num3 = 50;
					break;
				case ShopType.TravelMerchant:
					num2 /= 3f; 
					num3 = 30; 
					break; 
				}
				num2 = num2 * (float)(100 + EClass.pc.Evalue(1406) * 5) / 100f;
				num2 = Mathf.Min(num2, num3);

public void OnBarter(bool reroll = false)

cs
				{
					thing11.c_priceFix = -70;
				}
				if (ShopType == ShopType.TravelMerchant) 
				{ 
					thing11.c_priceFix = 200; 
				} 
				if (thing11.trait is TraitErohon)
				{
					thing11.c_IDTState = 5;

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

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

public Thing CreateStock()

cs
				return FromFilter("shop_gun");
			case ShopType.Blackmarket:
			case ShopType.Exotic:
			case ShopType.TravelMerchant:
			{
				int num = 30;
				if (ShopType == ShopType.TravelMerchant) 
				{ 
					num = 5; 
				} 
				if (Guild.Thief.IsCurrentZone)
				{
					num = 25;

public Thing CreateStock()

cs
				{
					num = 15;
				}
				if (EClass.debug.enable) 
				{ 
					num = 1; 
				} 
				CardBlueprint.SetRarity((EClass.rnd(num * 5) == 0) ? Rarity.Mythical : ((EClass.rnd(num) == 0) ? Rarity.Legendary : ((EClass.rnd(5) == 0) ? Rarity.Superior : Rarity.Normal)));
				return FromFilter("shop_blackmarket");
			}

TraitBuildBoard

public class TraitBuildBoard : TraitBoard

cs

	public override void TrySetAct(ActPlan p)
	{
		if (EClass.debug.godBuild || EClass._zone.IsPCFaction || EClass._zone is Zone_Tent) 
		if (EClass.debug.godBuild || EClass._zone.IsPCFactionOrTent) 
		{
			p.TrySetAct("actBuildMode", delegate
			{

TraitCrafter

public override void TrySetAct(ActPlan p)

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

+TraitDoorCurtain3

File Created
cs
public class TraitDoorCurtain3 : TraitDoorAuto
{
	public override string idSound => "Material/meat_drop";
}

TraitIncubator

public class TraitIncubator : TraitCrafter

cs
	public override bool AutoToggle => false;

	public override bool CanUseFromInventory => false;
	public override bool IsHomeItem => true; 
}

TraitMapBoard

public class TraitMapBoard : TraitBoard

cs

	public override void TrySetAct(ActPlan p)
	{
		if (!EClass.debug.enable && !EClass._zone.IsPCFaction && !(EClass._zone is Zone_Tent)) 
		if (!EClass.debug.enable && !EClass._zone.IsPCFactionOrTent) 
		{
			return;
		}

+TraitMerchantTravel

File Created
cs
public class TraitMerchantTravel : TraitMerchant
{
	public override int ShopLv
	{
		get
		{
			if (!base.owner.IsPCFactionOrMinion)
			{
				return base.owner.LV;
			}
			return base.ShopLv;
		}
	}

	public override ShopType ShopType => ShopType.TravelMerchant;

	public override bool AllowCriminal => true;

	public override int CostRerollShop => 10;

	public override int RestockDay => 360;
}

TraitPaintBoard

public override bool RenderExtra

cs

	public override void TrySetAct(ActPlan p)
	{
		if (!EClass.debug.enable && (!EClass._zone.IsPCFaction || !p.altAction)) 
		if (!EClass.debug.enable && (!EClass._zone.IsPCFactionOrTent || !p.altAction)) 
		{
			return;
		}

Zone

public void Deactivate()

cs
			}
		}
	}
	base.isPeace = false; 
	if (!EClass.player.simulatingZone) 
	{ 
		base.isPeace = false; 
	} 
	OnBeforeDeactivate();
	if (IsPCFaction)
	{

ZonePreEnterEncounter

public override void Execute()

cs
	{
		List<Chara> list = new List<Chara>();
		Chara leader = null;
		float num = Mathf.Clamp(EClass.pc.FameLv + 8, 8f, 24f + Mathf.Sqrt(EClass.pc.FameLv)); 
		for (int i = 0; i < EClass.rndHalf((int)num); i++) 
		if (mob.id == "merchant_travel") 
		{
			lv = Mathf.Max(20, EClass.pc.FameLv * 5); 
			Point randomPointInRadius = EClass.pc.pos.GetRandomPointInRadius(2, 5, requireLos: false, allowChara: false);
			if (randomPointInRadius != null) 
			for (int i = 0; i < EClass.rndHalf(12); i++) 
			{
				Chara chara = EClass._zone.SpawnMob(randomPointInRadius, SpawnSetting.Mob(mob.id, (mob.MainElement == Element.Void) ? null : mob.MainElement.source.alias.Substring(3))); 
				Hostility hostility2 = (chara.c_originalHostility = Hostility.Enemy); 
				chara.hostility = hostility2; 
				chara.enemy = EClass.pc.party.members.RandomItem(); 
				leader = chara; 
				if (EClass.rnd(5) == 0) 
				Point randomPointInRadius2 = randomPointInRadius.GetRandomPointInRadius(1, 4, requireLos: false, allowChara: false); 
				if (randomPointInRadius2 != null) 
				{
					TraitFoodEggFertilized.MakeBaby(chara, 1); 
					Chara chara = null; 
					if (i == 0) 
					{ 
						chara = (leader = EClass._zone.SpawnMob(randomPointInRadius2, SpawnSetting.TravelMerchant(mob.id, lv))); 
					} 
					else
					{ 
						string[] source = new string[5] { "merc", "merc_archer", "merc_mage", "merc_warrior", "dog_hound" }; 
						chara = EClass._zone.SpawnMob(randomPointInRadius2, SpawnSetting.Mob(source.RandomItem(), null, lv)); 
						Chara chara2 = chara; 
						Hostility hostility2 = (chara.c_originalHostility = Hostility.Neutral); 
						chara2.hostility = hostility2; 
						chara.MakeMinion(leader); 
					} 
					list.Add(chara); 
				}
				list.Add(chara); 
			}
			leader.ShowDialog(); 
		}
		if (leader != null) 
		else
		{
			List<Thing> list2 = EClass.pc.things.List(delegate(Thing t) 
			float num = Mathf.Clamp(EClass.pc.FameLv + 8, 8f, 24f + Mathf.Sqrt(EClass.pc.FameLv)); 
			for (int j = 0; j < EClass.rndHalf((int)num); j++) 
			{
				if (t.Num >= 10) 
				Point randomPointInRadius3 = EClass.pc.pos.GetRandomPointInRadius(2, 5, requireLos: false, allowChara: false); 
				if (randomPointInRadius3 != null) 
				{
					return false; 
					Chara chara3 = EClass._zone.SpawnMob(randomPointInRadius3, SpawnSetting.Mob(mob.id, (mob.MainElement == Element.Void) ? null : mob.MainElement.source.alias.Substring(3))); 
					Hostility hostility2 = (chara3.c_originalHostility = Hostility.Enemy); 
					chara3.hostility = hostility2; 
					chara3.enemy = EClass.pc.party.members.RandomItem(); 
					leader = chara3; 
					if (EClass.rnd(5) == 0) 
					{ 
						TraitFoodEggFertilized.MakeBaby(chara3, 1); 
					} 
					list.Add(chara3); 
				}
				return t.trait.CanBeDestroyed && t.things.Count == 0 && t.invY != 1 && t.trait.CanBeStolen && !t.trait.CanOnlyCarry && !t.IsUnique && !t.isEquipped; 
			}, onlyAccessible: true); 
			Thing t2 = ((list2.Count > 0) ? list2.RandomItem() : null); 
			if (t2 == null) 
			{ 
				GameLang.refDrama1 = (GameLang.refDrama2 = "mobPity".lang()); 
			} 
			else
			{ 
				GameLang.refDrama1 = t2.NameSimple; 
				GameLang.refDrama2 = t2.Name; 
			}
			LayerDrama.refAction1 = delegate
			if (leader != null) 
			{
				foreach (Chara item in list) 
				List<Thing> list2 = EClass.pc.things.List(delegate(Thing t) 
				{
					item.ShowEmo(Emo.angry); 
					if (EClass.rnd(6) == 0) 
					if (t.Num >= 10) 
					{
						item.Talk((EClass.rnd(5) == 0) ? "rumor_bad" : ((EClass.rnd(5) == 0) ? "callGuards" : "disgust")); 
						return false; 
					}
					return t.trait.CanBeDestroyed && t.things.Count == 0 && t.invY != 1 && t.trait.CanBeStolen && !t.trait.CanOnlyCarry && !t.IsUnique && !t.isEquipped; 
				}, onlyAccessible: true); 
				Thing t2 = ((list2.Count > 0) ? list2.RandomItem() : null); 
				if (t2 == null) 
				{ 
					GameLang.refDrama1 = (GameLang.refDrama2 = "mobPity".lang()); 
				}
			}; 
			LayerDrama.refAction2 = delegate
			{ 
				if (t2 != null) 
				else
				{
					leader.AddCard(t2); 
					GameLang.refDrama1 = t2.NameSimple; 
					GameLang.refDrama2 = t2.Name; 
				}
				foreach (Chara item2 in list) 
				LayerDrama.refAction1 = delegate
				{
					if (EClass.rnd(6) == 0) 
					foreach (Chara item in list) 
					{
						item2.Talk((EClass.rnd(5) == 0) ? "rumor_good" : ((EClass.rnd(3) == 0) ? "thanks3" : "thanks")); 
						item.ShowEmo(Emo.angry); 
						if (EClass.rnd(6) == 0) 
						{ 
							item.Talk((EClass.rnd(5) == 0) ? "rumor_bad" : ((EClass.rnd(5) == 0) ? "callGuards" : "disgust")); 
						} 
					}
					item2.ShowEmo(Emo.happy); 
					Hostility hostility5 = (item2.c_originalHostility = Hostility.Neutral); 
					item2.hostility = hostility5; 
					item2.enemy = null; 
				} 
				EClass.player.ModKarma(1); 
			}; 
			leader.ShowDialog("_chara", "encounter_mob"); 
				}; 
				LayerDrama.refAction2 = delegate
				{ 
					if (t2 != null) 
					{ 
						leader.AddCard(t2); 
					} 
					foreach (Chara item2 in list) 
					{ 
						if (EClass.rnd(6) == 0) 
						{ 
							item2.Talk((EClass.rnd(5) == 0) ? "rumor_good" : ((EClass.rnd(3) == 0) ? "thanks3" : "thanks")); 
						} 
						item2.ShowEmo(Emo.happy); 
						Hostility hostility6 = (item2.c_originalHostility = Hostility.Neutral); 
						item2.hostility = hostility6; 
						item2.enemy = null; 
					} 
					EClass.player.ModKarma(1); 
				}; 
				leader.ShowDialog("_chara", "encounter_mob"); 
			} 
		}
	}
	else
	{
		for (int j = 0; j < enemies; j++) 
		for (int k = 0; k < enemies; k++) 
		{
			Point nearestPoint = (EClass.pc.pos.GetRandomPoint(4) ?? EClass.pc.pos).GetNearestPoint(allowBlock: false, allowChara: false);
			Chara chara2 = EClass._zone.SpawnMob(nearestPoint, SpawnSetting.Encounter(lv)); 
			Hostility hostility2 = (chara2.c_originalHostility = Hostility.Enemy); 
			chara2.hostility = hostility2; 
			chara2.enemy = EClass.pc.party.members.RandomItem(); 
			Chara chara4 = EClass._zone.SpawnMob(nearestPoint, SpawnSetting.Encounter(lv)); 
			Hostility hostility2 = (chara4.c_originalHostility = Hostility.Enemy); 
			chara4.hostility = hostility2; 
			chara4.enemy = EClass.pc.party.members.RandomItem(); 
		}
	}
	if (flag && EClass.rnd(EClass.debug.enable ? 1 : 3) == 0)