EA 23.282 Stable Patch 2
March 2, 2026
17 files modified.
Important Changes
None.
AIAct
public override bool IsToolValid()
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
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()
}
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;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
public class AM_Adv : AM_BaseGameModepublic override void _OnUpdateInput()
}
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
{
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
{
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
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
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
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
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
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
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
}
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
}
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
}
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
{
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
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)
}
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
}
break;
}
case 4:
if (IsPC)
{
EClass.player.UpdateNyan();
}
break;
case 5:
case 30:
if (isWeakToSunlight && pos.IsSunLit) {
return;
}
if (id == "nino")
{
Steam.GetAchievement(ID_Achievement.NINO);
}
switch (id)
{
case "loytel":ContentConfigInput
public override void OnInstantiate()
uIList.Add(keys.dump);
uIList.Add(keys.mute);
uIList.Add(keys.meditate);
uIList.Add(keys.chat);
}
};
_refreshList();CoreConfig
public static CoreConfig TryLoadConfig()
{
coreConfig.ui.balloonBG = true;
}
if (coreConfig.version.IsBelow(0, 23, 282))
{
coreConfig.input.keys.chat.key = KeyCode.Return;
}
return coreConfig;
}DNA
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 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()
{ }
if (bodySlot != null)
{
AddVal(bodySlot.elementId, 1, allowStack: false, (int v) => 20);
AddVal(bodySlot.elementId, 1, allowStack: false, (int v) => 20, allowNegative: false);
body++;
}
} {
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 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()
{ 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
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()
KeyCode.Mouse3,
KeyCode.Mouse4,
KeyCode.Escape,
KeyCode.Return,
KeyCode.LeftShift,
KeyCode.Delete,
KeyCode.Backspace
KeyCode.Delete
};
if (Input.GetKeyDown(KeyCode.Delete))
{DramaCustomSequence
Choice2("daBlessing", "_blessing");
}
}
else if (c.isDrunk || c.HasElement(1275) || EClass.debug.enable)
{
Choice2(flag2 ? "daBird" : "daTail", "_tail");
}
}
if (c.IsHomeMember())
{ {
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)
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
CHURYU,
MELILITH,
LARNNEIRE,
LARNNEIRE2
LARNNEIRE2,
CHURYU2,
NINO,
CHURYU3
}Msg
public static string SayCannotUseHere()
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 int lastShippingExpMax;
public int lastChuryu;
public long nefiaBeaten
{
get }
}
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))