Skip to content

EA 23.224 Nightly

October 24, 2025

22 files modified. 1 new file created.

Important Changes

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

ABILITY (1)

cs
public override int GetSourceValue(int v, int lv, SourceValueType type) 
public override long GetSourceValue(long v, int lv, SourceValueType type) 

ELEMENT (1)

cs
public virtual int GetSourceValue(int v, int lv, SourceValueType type) 
public virtual long GetSourceValue(long v, int lv, SourceValueType type) 

Trait (1)

cs
public void OnBarter() 
public void OnBarter(bool reroll = false) 

ABILITY

public override bool CanLink(ElementContainer owner)

cs
		return false;
	}

	public override int GetSourceValue(int v, int lv, SourceValueType type) 
	public override long GetSourceValue(long v, int lv, SourceValueType type) 
	{
		if (type != 0)
		{
			return base.GetSourceValue(v, lv, type);
		}
		return 10 * (100 + (lv - 1) * base.source.lvFactor / 10) / 100; 
		return 10L * (long)(100 + (lv - 1) * base.source.lvFactor / 10) / 100; 
	}

	public override int GetPower(Card c)

ActEffect

public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po

cs
	}
	case EffectId.LittleSisterMigration:
	{
		if (!(EClass._zone is Zone_LittleGarden)) 
		if (!(EClass._zone is Zone_LittleGarden) && !EClass.game.IsSurvival) 
		{
			Msg.SayNothingHappen();
			return;

ActThrow

public static EffectIRenderer Throw(Card c, Point p, Card target, Thing t, Throw

cs
			}
			else if (traitMonsterBall.IsLittleBall)
			{
				if (chara3.id != "littleOne" || chara3.IsPCFactionOrMinion || EClass._zone is Zone_LittleGarden || EClass._zone.IsUserZone) 
				if (chara3.id != "littleOne" || chara3.IsPCFactionOrMinion || EClass._zone is Zone_LittleGarden || EClass._zone.IsUserZone || chara3.GetBool(132)) 
				{
					Msg.Say("monsterball_invalid");
					break;
				}
				chara3.SetBool(132, enable: true); 
			}
			else
			{

CINT

public class CINT

cs
	public const int dateDeathLock = 130;

	public const int fixedValue = 131;
	public const int isAlreadyCaptured = 132; 
}

CardBlueprint

public class CardBlueprint

cs

	public bool fixedQuality;

	public bool isCraft; 
	public static CardBlueprint current;

	public static CardBlueprint _Default = new CardBlueprint();

Chara

public bool IsHostile(Chara c)

cs
		}
		if (OriginalHostility >= Hostility.Friend)
		{
			if (hostility <= Hostility.Enemy && c.IsPCFactionOrMinion) 
			{ 
				return true; 
			} 
			if (c.hostility <= Hostility.Enemy && c.OriginalHostility == Hostility.Enemy)
			{
				return true;

CoreDebug

public void UpdateInput()

cs
	}
	if (Input.GetKeyDown(KeyCode.F4))
	{
		for (int j = 0; j < 100; j++) 
		for (int j = 0; j < 10; j++) 
		{
			Chara chara2 = EClass._zone.SpawnMob(null, SpawnSetting.HomeEnemy(10)); 
			if (chara2.IsAnimal) 
			EClass._zone.SpawnMob(EClass.pc.pos.GetNearestPoint(allowBlock: false, allowChara: false), new SpawnSetting
			{
				chara2.Destroy(); 
			} 
				id = "gagu", 
				isBoss = true, 
				fixedLv = EClass._zone.DangerLv 
			}); 
		}
		return;
	}

public static string ModFame(int amount)

cs
		return "Done.";
	}

	[ConsoleCommand("")] 
	public static string MaxFame() 
	{ 
		if (!CheatEnabled()) 
		{ 
			return EnableCheat; 
		} 
		if (EClass.player.CountKeyItem("license_adv") == 0) 
		{ 
			EClass.player.ModKeyItem("license_adv"); 
		} 
		EClass.player.ModFame(int.MaxValue); 
		return "Done."; 
	} 
	[ConsoleCommand("")]
	public static string ModKarma(int amount)
	{

ELEMENT

public int GetMaterialSourceValue(Thing t, int v)

cs
		return v * (100 + t.encLV * 10) / 100;
	}

	public virtual int GetSourceValue(int v, int lv, SourceValueType type) 
	public virtual long GetSourceValue(long v, int lv, SourceValueType type) 
	{
		return type switch
		{

ElementContainer

public void ApplyElementMap(int uid, SourceValueType type, Dictionary<int, int>

cs
			{
				orCreateElement.vSourcePotential += orCreateElement.GetSourcePotential(value) * num;
			}
			int num2 = orCreateElement.GetSourceValue(value, lv, type) * num; 
			orCreateElement.vSource += num2; 
			if (lv > 10000000) 
			{ 
				lv = 10000000; 
			} 
			long num2 = orCreateElement.GetSourceValue(value, lv, type) * num; 
			if (num2 >= 99999999) 
			{ 
				num2 = 99999999L; 
			} 
			orCreateElement.vSource += (int)num2; 
			if (applyFeat && orCreateElement is Feat)
			{
				(orCreateElement as Feat).Apply(num2, this); 
				(orCreateElement as Feat).Apply((int)num2, this); 
			}
		}
	}

FactionRelation

public enum RelationType

cs

	public int ExpToNext => 100 + rank * rank * 100;

	public int MaxRank => 5; 
	public int MaxRank => 6; 

	public string TextTitle => Lang.GetList("guild_title")[Mathf.Min(rank / 2, 5)];

GuildFighter

public bool HasBounty(Chara c)

cs
	{
		return false;
	}
	if (c.uid % 2 != 0) 
	if (c.uid % ((relation.rank >= 6) ? 3 : 2) == 0) 
	{
		return false;
	}

GuildMage

public int BuySpellbookPrice(int a)

cs
		}
		return a * 100 / (120 + relation.rank / 2);
	}
	public int DomainBonus() 
	{ 
		if (relation.rank < 6) 
		{ 
			return 0; 
		} 
		return 1; 
	} 
}

GuildMerchant

public long InvestPrice(long a)

cs
		}
		return a * 100 / (110 + relation.rank / 2);
	}
	public int InvestBonus() 
	{ 
		if (relation.rank < 6) 
		{ 
			return 0; 
		} 
		return 10; 
	} 
}

GuildThief

public int SellStolenPrice(int a)

cs
		}
		return a * 100 / (190 - relation.rank * 2);
	}
	public int FurnitureBonus() 
	{ 
		if (relation.rank < 6) 
		{ 
			return 1; 
		} 
		return 2; 
	} 
}

Player

public Layer SelectDomain(Action onKill = null)

cs
		}
	}, delegate(List<UIList.ButtonPair> list)
	{
		bool flag = EClass.player.domains.Count >= 3 + EClass.pc.Evalue(1402); 
		bool flag = EClass.player.domains.Count >= 3 + EClass.pc.Evalue(1402) + Guild.Mage.DomainBonus(); 
		foreach (UIList.ButtonPair item in list)
		{
			UIButton button = (item.component as ItemGeneral).button1;

QuestGuild

public override string GetDetailText(bool onJournal = false)

cs
		{
			text = text + (guild.id + "_benefit2").lang() + "\n";
		}
		if (num >= 3) 
		{ 
			text = text + (guild.id + "_benefit3").lang() + "\n"; 
		} 
		if (num >= 4)
		{
			text = text + "guild_benefit_feat".lang() + "\n";

RecipeCard

public override Thing Craft(BlessedState blessed, bool sound = false, List<Thing

cs
	CardBlueprint.Set(new CardBlueprint
	{
		qualityBonus = num3,
		rarity = (flag ? Rarity.Crude : Rarity.Normal) 
		rarity = (flag ? Rarity.Crude : Rarity.Normal), 
		isCraft = true
	});
	Thing thing = (flag3 ? ThingGen.Create(key) : ThingGen.Create(key, num, num4));
	thing.idSkin = idSkin;

Thing

public override void OnCreate(int genLv)

cs
				{
					num4 = 0;
				}
				if (num4 > 0) 
				{ 
					num4 += EClass.rnd(Guild.Thief.FurnitureBonus()); 
				} 
			}
			else if (bp.qualityBonus < 0)
			{

Trait

public virtual string IdSoundToggleOff

cs
		}
	}

	public virtual int ShopLv => Mathf.Max(1, EClass._zone.development / 10 + owner.c_invest + 1); 
	public virtual int ShopLv => Mathf.Max(1, EClass._zone.development / 10 + owner.c_invest * (100 + Guild.Merchant.InvestBonus()) / 100 + 1); 

	public virtual CopyShopType CopyShop => CopyShopType.None;

public Emo2 GetRestockedIcon()

cs
		return Emo2.none;
	}

	public void OnBarter() 
	public void OnBarter(bool reroll = false) 
	{
		Thing t = owner.things.Find("chest_merchant");
		if (t == null)

public void OnBarter()

cs
		{
			break;
		}
		int num5 = 0; 
		int num7 = 0; 
		foreach (Thing thing10 in c_copyContainer.things)
		{
			if (!owner.trait.CanCopy(thing10))

public void OnBarter()

cs
			{
				thing5.elements.Remove(item.id);
			}
			int num6 = 1; 
			int num8 = 1; 
			switch (owner.trait.CopyShop)
			{
			case CopyShopType.Item:
			{
				num6 = (1000 + owner.c_invest * 100) / (thing5.GetPrice(CurrencyType.Money, sell: false, PriceType.CopyShop) + 50); 
				num8 = (1000 + owner.c_invest * 100) / (thing5.GetPrice(CurrencyType.Money, sell: false, PriceType.CopyShop) + 50); 
				int[] array = new int[3] { 704, 703, 702 };
				foreach (int ele in array)
				{
					if (thing5.HasElement(ele))
					{
						num6 = 1; 
						num8 = 1; 
					}
				}
				break;

public void OnBarter()

cs
				thing5.c_charges = thing10.c_charges;
				break;
			}
			if (num6 > 1 && thing5.trait.CanStack) 
			if (num8 > 1 && thing5.trait.CanStack) 
			{
				thing5.SetNum(num6); 
				thing5.SetNum(num8); 
			}
			AddThing(thing5);
			num5++; 
			if (num5 > owner.trait.NumCopyItem) 
			num7++; 
			if (num7 > owner.trait.NumCopyItem) 
			{
				break;
			}

public void OnBarter()

cs
		break;
	case ShopType.RedBook:
	{
		for (int num4 = 0; num4 < 30; num4++) 
		for (int num6 = 0; num6 < 30; num6++) 
		{
			AddThing(ThingGen.CreateFromCategory((EClass.rnd(2) == 0) ? "_book" : "book"));
		}

public void OnBarter()

cs
		AddThing(TraitSeed.MakeSeed("carrot")).SetNum(4 + EClass.rnd(4));
		AddThing(TraitSeed.MakeSeed("potato")).SetNum(4 + EClass.rnd(4));
		AddThing(TraitSeed.MakeSeed("corn")).SetNum(4 + EClass.rnd(4));
		for (int num8 = 0; num8 < EClass.rnd(3) + 1; num8++) 
		for (int l = 0; l < EClass.rnd(3) + 1; l++) 
		{
			Add("462", 1, 0);
		}
		for (int num9 = 0; num9 < EClass.rnd(3) + 1; num9++) 
		for (int m = 0; m < EClass.rnd(3) + 1; m++) 
		{
			Add("1167", 1, 0);
		}

public void OnBarter()

cs
				if (num3)
				{
					Add("littleball", 10, 0);
					if (owner.Chara.affinity.CanGiveCard()) 
					if (!owner.Chara.affinity.CanGiveCard()) 
					{
						if (!owner.Chara.HasElement(287)) 
						{ 
							owner.Chara.elements.SetBase(287, (!EClass.debug.enable) ? 1 : 50); 
						} 
						for (int l = 0; l < 20; l++) 
						break; 
					} 
					if (!owner.Chara.HasElement(287)) 
					{ 
						owner.Chara.elements.SetBase(287, (!EClass.debug.enable) ? 1 : 50); 
					} 
					if (!reroll) 
					{ 
						for (int n = 0; n < 20; n++) 
						{
							owner.Chara.ModExp(287, 1000);
						}
						Thing thing3 = CraftUtil.MakeLoveLunch(owner.Chara); 
						thing3.elements.SetBase(1229, 1); 
						AddThing(thing3); 
					}
					Thing thing3 = CraftUtil.MakeLoveLunch(owner.Chara); 
					thing3.elements.SetBase(1229, 1); 
					AddThing(thing3); 
					break;
				}
				for (int m = 0; m < 10; m++) 
				for (int num4 = 0; num4 < 10; num4++) 
				{
					Thing thing4 = ThingGen.Create(EClass._zone.IsFestival ? "1123" : ((EClass.rnd(3) == 0) ? "1169" : "1160"));
					thing4.DyeRandom();

public void OnBarter()

cs
				}
				if (EClass._zone is Zone_Exile)
				{
					for (int n = 0; n < 30; n++) 
					for (int num5 = 0; num5 < 30; num5++) 
					{
						Add("1235", 1, -1);
						Add("1236", 1, -1);

public void OnBarter()

cs
					continue;
				}
				string[] recipeKey = item3.row.recipeKey;
				for (int num7 = 0; num7 < recipeKey.Length; num7++) 
				for (int num9 = 0; num9 < recipeKey.Length; num9++) 
				{
					if (recipeKey[num7] == ShopType.ToString()) 
					if (recipeKey[num9] == ShopType.ToString()) 
					{
						NoRestock(ThingGen.CreateRecipe(item3.id));
						break;

TraitRadio

public class TraitRadio : TraitItem

cs
	public List<string> ids = new List<string>
	{
		"none", "amb_fire", "amb_bbq", "amb_crowd", "amb_seagull", "amb_horror", "amb_pub", "amb_smelter", "amb_clockwork", "amb_dead",
		"amb_magic", "amb_fountain", "amb_clock", "amb_boat", "amb_waterfall", "amb_rag1", "amb_squeak1"
		"amb_magic", "amb_fountain", "amb_clock", "amb_boat", "amb_waterfall", "amb_rag1", "amb_squeak1", "amb_river", "amb_summer"
	};

	public override string IDActorEx => owner.GetStr(52);

+TraitUniqueCharaNoJoin

File Created
cs
public class TraitUniqueCharaNoJoin : TraitChara
{
	public override bool CanInvite => false;
}

UIInventory

void RefreshDist()

cs
				SE.Dice();
				EMono._zone.influence -= cost;
				_owner.c_dateStockExpire = 0;
				_owner.trait.OnBarter(); 
				_owner.trait.OnBarter(reroll: true); 
				RefreshGrid();
				Sort();
				SE.Play("shop_open");

Zone

public Chara SpawnMob(Point pos = null, SpawnSetting setting = null)

cs
		cardRow = EClass.sources.cards.map["santa"];
		EClass.player.flags.santa++;
	}
	int num3 = ((setting.fixedLv == -1) ? cardRow.LV : setting.fixedLv); 
	long num3 = ((setting.fixedLv == -1) ? cardRow.LV : setting.fixedLv); 
	if (ScaleType == ZoneScaleType.Void)
	{
		num3 = (50 + cardRow.LV) * Mathf.Max(1, (num - 1) / 50);

public Chara SpawnMob(Point pos = null, SpawnSetting setting = null)

cs
	}
	if (num3 != cardRow.LV)
	{
		cardBlueprint.lv = num3; 
		cardBlueprint.lv = (int)Mathf.Min(num3, 100000000f); 
	}
	CardBlueprint.Set(cardBlueprint);
	Chara chara = CharaGen.Create(cardRow.id, num2);