Skip to content

EA 23.282 Stable Patch 2

March 2, 2026

17 files modified.

Important Changes

None.

AIAct

public override bool IsToolValid()

cs
		return false;
	}

	public T GetChild<T>() where T : AIAct
	{ 
		if (this is T) 
		{ 
			return this as T; 
		} 
		AIAct aIAct = child; 
		return ((aIAct != null) ? aIAct.GetChild<T>() : null) ?? null; 
	} 
	public virtual void OnStart()
	{
	}

AI_Churyu

public class AI_Churyu : AIWork

cs

	public override IEnumerable<Status> Run()
	{
		if (restartCount == 0) 
		{ 
			EClass.player.UpdateNyan(); 
		} 
		if (!slave.ExistsOnMap || churyu.GetRootCard() != slave)
		{
			yield return Success();

AI_Fish

public override void OnProgressComplete()

cs
		}
		if (EClass.rnd(EClass.debug.enable ? 2 : 1000) == 0 && thing.category.IsChildOf("fish"))
		{
			owner.PlaySound("escape"); 
			owner.PlayEffect("fizzle");
			if (owner.IsPC)
			{
				owner.PlaySound("escape"); 
				owner.Say("fish_ehe");
				owner.Say("fish_ehe2");
				owner.Say("fish_ehe3");

AM_Adv

using System;

cs
using System;
using System.Collections.Generic;
using System.Text; 
using UnityEngine;

public class AM_Adv : AM_BaseGameMode

public override void _OnUpdateInput()

cs
	}
	switch (EInput.action)
	{
	case EAction.Chat: 
		Dialog.InputName("", "", delegate(bool cancel, string text) 
		{ 
			if (!cancel && !text.IsEmpty()) 
			{ 
				Chara chara = EClass.pc; 
				if ((text[0] == '@' || text[0] == '@') && text.Length > 1 && int.TryParse(text[1].ToString().Normalize(NormalizationForm.FormKC), out var result)) 
				{ 
					text = text.Substring(2); 
					chara = EClass.pc.party.members.TryGet(result); 
				} 
				if (text.StartsWith('@')) 
				{ 
					text = text.Substring(1); 
				} 
				chara.SayRaw(text); 
				Msg.SetColor("ono"); 
				string text2 = text; 
				if (!text.StartsWith('*') && !text.StartsWith('(') && !text.StartsWith('(')) 
				{ 
					text = text.Bracket(); 
				} 
				Msg.Say(text, chara); 
				if (text2 == "nyan") 
				{ 
					Msg.SetColor("save"); 
					Msg.Say("*" + EClass.player.stats.lastChuryu + " nyan*"); 
				} 
			} 
		}, Dialog.InputType.None); 
		break; 
	case EAction.Search:
		EClass.ui.widgets.Toggle("Search")?.SoundActivate();
		break;

ActEffect

void AddCon<T>(int rate, int power) where T : Condition

cs
	{
		CC.PlaySound("clean_floor");
		Msg.Say("exterminate");
		List<Chara> list3 = EClass._map.charas.Where((Chara c) => c.isCopy && !c.IsPCFaction).ToList(); 
		if (list3.Count == 0) 
		List<Chara> list2 = EClass._map.charas.Where((Chara c) => c.isCopy && !c.IsPCFaction).ToList(); 
		if (list2.Count == 0) 
		{
			Msg.SayNothingHappen();
			return;
		}
		foreach (Chara item in list3) 
		foreach (Chara item in list2) 
		{
			item.Say("split_fail", item);
			item.PlayEffect("vanish");

void AddCon<T>(int rate, int power) where T : Condition

cs
		{
			return;
		}
		Thing thing = ThingGen.Create("mine"); 
		thing.c_idRefCard = "dog_mine"; 
		Thing thing2 = ThingGen.Create("mine"); 
		thing2.c_idRefCard = "dog_mine"; 
		Zone.ignoreSpawnAnime = true;
		EClass._zone.AddCard(thing, CC.pos).Install(); 
		EClass._zone.AddCard(thing2, CC.pos).Install(); 
		break;
	}
	case EffectId.LittleSisterMigration:

void AddCon<T>(int rate, int power) where T : Condition

cs
			Msg.SayNothingHappen();
			return;
		}
		List<Chara> list2 = new List<Chara>(); 
		List<Chara> list3 = new List<Chara>(); 
		bool flag3 = false;
		foreach (Chara chara2 in EClass._map.charas)
		{

void AddCon<T>(int rate, int power) where T : Condition

cs
					flag3 = false;
					continue;
				}
				list2.Add(chara2); 
				list3.Add(chara2); 
				flag3 = true;
			}
		}
		if (list2.Count == 0) 
		if (list3.Count == 0) 
		{
			Msg.SayNothingHappen();
			return;
		}
		EClass.pc.PlaySound("chime_angel");
		foreach (Chara item2 in list2) 
		foreach (Chara item2 in list3) 
		{
			item2.PlayEffect("revive");
			item2.Destroy();
		}
		Msg.Say("little_migration", list2.Count.ToString() ?? ""); 
		EClass._zone.ModInfluence(list2.Count); 
		EClass.player.stats.sistersDepart += list2.Count; 
		Msg.Say("little_migration", list3.Count.ToString() ?? ""); 
		EClass._zone.ModInfluence(list3.Count); 
		EClass.player.stats.sistersDepart += list3.Count; 
		break;
	}
	case EffectId.MagicMap:

void AddCon<T>(int rate, int power) where T : Condition

cs
		TC.PlaySound("curse3");
		TC.PlayEffect("curse");
		TC.Say("forgetItems", TC);
		int num3 = power / 50 + 1 + EClass.rnd(3); 
		int num4 = power / 50 + 1 + EClass.rnd(3); 
		List<Thing> source = TC.things.List((Thing t) => t.c_IDTState == 0);
		for (int j = 0; j < num3; j++) 
		for (int j = 0; j < num4; j++) 
		{
			source.RandomItem().c_IDTState = 5;
		}

void AddCon<T>(int rate, int power) where T : Condition

cs
	case EffectId.EnchantArmorGreat:
	{
		bool armor = id == EffectId.EnchantArmor || id == EffectId.EnchantArmorGreat;
		bool flag4 = id == EffectId.EnchantWeaponGreat || id == EffectId.EnchantArmorGreat; 
		bool flag6 = id == EffectId.EnchantWeaponGreat || id == EffectId.EnchantArmorGreat; 
		if (!tc.isThing)
		{
			LayerDragGrid.CreateEnchant(CC, armor, flag4, state); 
			LayerDragGrid.CreateEnchant(CC, armor, flag6, state); 
			return;
		}
		cc.PlaySound("identify");

void AddCon<T>(int rate, int power) where T : Condition

cs
			tc.ModEncLv(-1);
			break;
		}
		int num4 = (flag4 ? 4 : 2) + (blessed ? 1 : 0); 
		if (tc.encLV >= num4) 
		int num6 = (flag6 ? 4 : 2) + (blessed ? 1 : 0); 
		if (tc.encLV >= num6) 
		{
			cc.Say("enc_resist", tc);
			break;

void AddCon<T>(int rate, int power) where T : Condition

cs
			LayerDragGrid.CreateUncurse(CC, state);
			return;
		}
		Thing thing3 = tc.Thing; 
		if (thing3.blessedState == BlessedState.Cursed) 
		Thing thing = tc.Thing; 
		if (thing.blessedState == BlessedState.Cursed) 
		{
			thing3.SetBlessedState(BlessedState.Normal); 
			thing.SetBlessedState(BlessedState.Normal); 
		}
		else if (thing3.blessedState == BlessedState.Doomed) 
		else if (thing.blessedState == BlessedState.Doomed) 
		{
			thing3.SetBlessedState(BlessedState.Normal); 
			thing.SetBlessedState(BlessedState.Normal); 
		}
		thing3.GetRootCard()?.TryStack(thing3); 
		LayerInventory.SetDirty(thing3); 
		thing.GetRootCard()?.TryStack(thing); 
		LayerInventory.SetDirty(thing); 
		break;
	}
	case EffectId.Lighten:

void AddCon<T>(int rate, int power) where T : Condition

cs
		}
		cc.PlaySound("offering");
		cc.PlayEffect("buff");
		int num6 = (tc.isWeightChanged ? tc.c_weight : tc.Thing.source.weight); 
		int num3 = (tc.isWeightChanged ? tc.c_weight : tc.Thing.source.weight); 
		tc.isWeightChanged = true;
		Element orCreateElement = tc.elements.GetOrCreateElement(64);
		Element orCreateElement2 = tc.elements.GetOrCreateElement(65);
		Element orCreateElement3 = tc.elements.GetOrCreateElement(67);
		Element orCreateElement4 = tc.elements.GetOrCreateElement(66);
		bool flag6 = tc.IsEquipmentOrRangedOrAmmo || tc.IsThrownWeapon; 
		bool flag4 = tc.IsEquipmentOrRangedOrAmmo || tc.IsThrownWeapon; 
		if (flag)
		{
			num6 = (int)(0.01f * (float)num6 * (float)power * 0.75f + 500f); 
			if (num6 < 0 || num6 > 10000000) 
			num3 = (int)(0.01f * (float)num3 * (float)power * 0.75f + 500f); 
			if (num3 < 0 || num3 > 10000000) 
			{
				num6 = 10000000; 
				flag6 = false; 
				num3 = 10000000; 
				flag4 = false; 
			}
			if (flag6) 
			if (flag4) 
			{
				if (tc.IsWeapon || tc.IsThrownWeapon || tc.IsAmmo)
				{

void AddCon<T>(int rate, int power) where T : Condition

cs
		}
		else
		{
			num6 = num6 * (100 - power / 10) / 100; 
			num3 = num3 * (100 - power / 10) / 100; 
			if (blessed)
			{
				power /= 4;
			}
			if (flag6) 
			if (flag4) 
			{
				if (tc.IsWeapon || tc.IsThrownWeapon || tc.IsAmmo)
				{

void AddCon<T>(int rate, int power) where T : Condition

cs
			}
			cc.Say("lighten", tc);
		}
		tc.c_weight = num6; 
		tc.c_weight = num3; 
		tc.SetDirtyWeight();
		if (tc.parent == null)
		{

void AddCon<T>(int rate, int power) where T : Condition

cs
		{
			blesstedState = state
		});
		Thing thing2 = ThingGen.Create(tc.id, -1, (int)((long)num5 * (long)power / 400)); 
		thing2.genLv = num5; 
		Thing thing3 = ThingGen.Create(tc.id, -1, (int)((long)num5 * (long)power / 400)); 
		thing3.genLv = num5; 
		if (tc.c_uidAttune != 0)
		{
			thing2.c_uidAttune = tc.c_uidAttune; 
			if ((thing2.id == "amulet_engagement" || thing2.id == "ring_engagement") && tc.c_uidAttune != EClass.pc.uid) 
			thing3.c_uidAttune = tc.c_uidAttune; 
			if (thing3.id == "amulet_engagement" || thing3.id == "ring_engagement") 
			{
				thing2.elements.ModBase(484, 3); 
				if (tc.c_uidAttune != EClass.pc.uid) 
				{ 
					thing3.elements.ModBase(484, 3); 
				} 
				if (thing3.rarity < Rarity.Mythical) 
				{ 
					thing3.rarity = Rarity.Mythical; 
				} 
			}
		}
		tc.Destroy();
		CC.Pick(thing2, msg: false); 
		CC.Pick(thing3, msg: false); 
		if (!CC.IsPC)
		{
			CC.TryEquip(thing2); 
			CC.TryEquip(thing3); 
		}
		break;
	}

ActRide

public class ActRide : Ability

cs

	public override bool Perform()
	{
		if (EClass._zone is Zone_Wedding) 
		{ 
			Msg.SayInvalidAction(); 
			return false; 
		} 
		List<Chara> list = Act.TP.ListCharas();
		list.Reverse();
		bool flag = false;

CardActor

public virtual void OnRender(RenderParam p)

cs
	}
	base.transform.position = tempV;
	base.transform.localScale = tempV2;
	destLiquid = Mathf.Lerp(destLiquid, p.liquidLv, Core.gameDelta * (float)((destLiquid > (float)p.liquidLv) ? 90 : 20)); 
	destLiquid = Mathf.Lerp(destLiquid, p.liquidLv, Core.gameDeltaNoPause * (float)((destLiquid > (float)p.liquidLv) ? 90 : 20)); 
	mpb.SetFloat("_MatColor", p.matColor);
	mpb.SetFloat("_Color", p.color);
	mpb.SetFloat("_Liquid", destLiquid);

Chara

public void TickConditions()

cs
		}
		break;
	}
	case 4:
		if (IsPC) 
		{ 
			EClass.player.UpdateNyan(); 
		} 
		break; 
	case 5:
	case 30:
		if (isWeakToSunlight && pos.IsSunLit)

public void ShowDialog()

cs
		{
			return;
		}
		if (id == "nino") 
		{ 
			Steam.GetAchievement(ID_Achievement.NINO); 
		} 
		switch (id)
		{
		case "loytel":

ContentConfigInput

public override void OnInstantiate()

cs
			uIList.Add(keys.dump);
			uIList.Add(keys.mute);
			uIList.Add(keys.meditate);
			uIList.Add(keys.chat); 
		}
	};
	_refreshList();

CoreConfig

public static CoreConfig TryLoadConfig()

cs
		{
			coreConfig.ui.balloonBG = true;
		}
		if (coreConfig.version.IsBelow(0, 23, 282)) 
		{ 
			coreConfig.input.keys.chat.key = KeyCode.Return; 
		} 
		return coreConfig;
	}

DNA

void AddAction()

cs
			ActList.Item a = model.ability.list.items.RandomItem();
			if (!(a.act.source.category != "ability") && a.act.source.geneSlot >= 0)
			{
				AddVal(a.act.source.id, a.chance * ((!a.pt) ? 1 : (-1)), allowStack: false, (int v) => 8 + a.act.source.cost[0] / 10 * 2); 
				AddVal(a.act.source.id, a.chance * ((!a.pt) ? 1 : (-1)), allowStack: false, (int v) => 8 + a.act.source.cost[0] / 10 * 2, allowNegative: true); 
				action++;
			}
		}

void AddAction()

cs
	void AddAttribute()
	{
		Element element = listAttb[EClass.rnd(3)];
		AddVal(element.id, EClass.rndHalf(element.ValueWithoutLink / 2), allowStack: true, (int v) => v / 5 + 1); 
		AddVal(element.id, EClass.rndHalf(element.ValueWithoutLink / 2), allowStack: true, (int v) => v / 5 + 1, allowNegative: false); 
	}
	void AddBody()
	{

void AddBody()

cs
			}
			if (bodySlot != null)
			{
				AddVal(bodySlot.elementId, 1, allowStack: false, (int v) => 20); 
				AddVal(bodySlot.elementId, 1, allowStack: false, (int v) => 20, allowNegative: false); 
				body++;
			}
		}

void AddFeat()

cs
				{
					maxSlot = e.source.geneSlot;
				}
				AddVal(e.id, 1, allowStack: false, (int v) => e.source.cost[0] * 5); 
				AddVal(e.id, 1, allowStack: false, (int v) => e.source.cost[0] * 5, allowNegative: false); 
			}
		}
	}

void AddRandom(int n)

cs
	void AddSkill()
	{
		Element element2 = listSkill[Mathf.Clamp(EClass.rnd(6), 0, listSkill.Count - 1)];
		AddVal(element2.id, EClass.rndHalf(element2.ValueWithoutLink / 2), allowStack: true, (int v) => v / 5 + 1); 
		AddVal(element2.id, EClass.rndHalf(element2.ValueWithoutLink / 2), allowStack: true, (int v) => v / 5 + 1, allowNegative: false); 
	}
	void AddSpecial()
	{

void AddSpecial()

cs
			AddAttribute();
		}
	}
	void AddVal(int id, int v, bool allowStack, Func<int, int> funcCost) 
	void AddVal(int id, int v, bool allowStack, Func<int, int> funcCost, bool allowNegative) 
	{
		if (v >= 0) 
		if (v >= 0 || allowNegative) 
		{
			bool flag = false;
			int num = EClass.curve(v, 20, 10, 90);

Dialog

private void Update()

cs

	public override void OnUpdateInput()
	{
		if ((bool)input && option.canClose && (Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown(KeyCode.KeypadEnter))) 
		if ((bool)input && option.canClose && (Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown(KeyCode.KeypadEnter)) && keymap == null) 
		{
			isInputEnter = true;
			Close();

public override void OnUpdateInput()

cs
			KeyCode.Mouse3,
			KeyCode.Mouse4,
			KeyCode.Escape,
			KeyCode.Return, 
			KeyCode.LeftShift,
			KeyCode.Delete, 
			KeyCode.Backspace 
			KeyCode.Delete 
		};
		if (Input.GetKeyDown(KeyCode.Delete))
		{

DramaCustomSequence

public void Build(Chara c)

cs
				Choice2("daBlessing", "_blessing");
			}
		}
		else if (c.isDrunk || c.HasElement(1275) || EClass.debug.enable) 
		{ 
			Choice2(flag2 ? "daBird" : "daTail", "_tail"); 
		} 
	}
	if (c.IsHomeMember())
	{

public void Build(Chara c)

cs
		{
			destThing.Attune(c);
			destThing.elements.ModBase(484, 3);
			if (destThing.rarity < Rarity.Mythical) 
			{ 
				destThing.rarity = Rarity.Mythical; 
			} 
			c.AddCard(destThing);
			c.TryEquip(destThing);
			GameLang.refDrama1 = EClass.world.date.year.ToString() ?? "";

ELEMENT

public void _WriteNote(UINote n, Chara c, Act act)

cs
		if (c.IsPC && c.HasCondition<StanceManaCost>())
		{
			int num2 = c.Evalue(1657);
			if (num2 > 0 && vPotential >= 2) 
			if (num2 > 0 && (vPotential >= 2 || c.ability.Has(act.id))) 
			{
				num = num * (100 - num2 * 20) / 100;
			}

ID_Achievement

public enum ID_Achievement

cs
	CHURYU,
	MELILITH,
	LARNNEIRE,
	LARNNEIRE2 
	LARNNEIRE2, 
	CHURYU2, 
	NINO, 
	CHURYU3 
}

Msg

public static string SayCannotUseHere()

cs
		return Say("cannot_use_here");
	}

	public static string SayInvalidAction() 
	{ 
		return Say("invalidAction"); 
	} 
	public static void SayGod(string s, Card owner = null)
	{
		SetColor(colors.TalkGod);

Player

public class Stats : EClass

cs

		public int lastShippingExpMax;

		public int lastChuryu; 
		public long nefiaBeaten
		{
			get

public void OnAdvanceDay()

cs
		}
	}

	public void UpdateNyan() 
	{ 
		int num = 0; 
		foreach (Chara chara in EClass._map.charas) 
		{ 
			AI_Churyu child = chara.ai.GetChild<AI_Churyu>(); 
			if (child != null && child.slave == EClass.pc) 
			{ 
				num++; 
			} 
		} 
		EClass.player.stats.lastChuryu = num; 
		if (num >= 20) 
		{ 
			Steam.GetAchievement(ID_Achievement.CHURYU2); 
		} 
		if (num >= 50) 
		{ 
			Steam.GetAchievement(ID_Achievement.CHURYU3); 
		} 
	} 
	public bool TryAbortAutoCombat(bool immediate = true)
	{
		if (!(EClass.pc.ai is GoalAutoCombat))