EA 23.183 Nightly Patch 1
August 18, 2025
16 files modified.
Important Changes
Possible breaking changes. Click the filename to view the chunk.
Biography (1)
public void SetAge(Chara c, int a, bool allowUnique = false)
public void SetAge(Chara c, int a)
CraftUtil (1)
public static void AddIngredient(Card product, Chara c, Card ing, bool writeCrafter = true)
public static void WrapIngredient(Card product, Chara c, Card ing, WrapType wrapType)
ActEffect
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
{
break;
}
int hex = 0;
int hex2 = 0;
foreach (Condition condition4 in TC.conditions)
{
if (condition4.Type == ConditionType.Debuff)
{
hex++;
hex2++;
}
}
if (hex == 0)
if (hex2 == 0)
{
CC.SayNothingHappans();
break;
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
if (!item3.IsFriendOrAbove(CC))
{
int num9 = Dice.Create("SpShutterHex", power, CC, (actRef.refThing != null) ? null : actRef.act).Roll();
item3.DamageHP(num9 * hex, 919, power, AttackSource.None, CC);
item3.DamageHP(num9 * hex2, 919, power, AttackSource.None, CC);
}
}
});
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
TC.Say((actRef.n1 == "money") ? "abStealNegateMoney" : "abStealNegate", TC);
break;
}
Thing thing5 = null;
bool flag9 = actRef.n1 == "food";
Thing thing4 = null;
bool flag7 = actRef.n1 == "food";
if (actRef.n1 == "money")
{
int currency = TC.GetCurrency();
if (currency > 0)
{
currency = Mathf.Clamp(EClass.rnd(currency / 10), 1, 100 + EClass.rndHalf(CC.LV * 200));
thing5 = ThingGen.Create("money").SetNum(currency);
thing4 = ThingGen.Create("money").SetNum(currency);
TC.ModCurrency(-currency);
}
}
else
{
Func<Thing, bool> func = (Thing t) => true;
if (flag9)
if (flag7)
{
func = (Thing t) => t.IsFood;
}
List<Thing> list6 = TC.things.List(delegate(Thing t)
List<Thing> list4 = TC.things.List(delegate(Thing t)
{
if (t.parentCard?.trait is TraitChestMerchant || t.trait is TraitTool || t.IsThrownWeapon)
{
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
}
return t.trait.CanBeDestroyed && t.things.Count == 0 && t.invY != 1 && t.trait.CanBeStolen && !t.trait.CanOnlyCarry && !t.IsUnique && !t.isEquipped && t.blessedState == BlessedState.Normal && func(t);
}, onlyAccessible: true);
if (list6.Count > 0)
if (list4.Count > 0)
{
thing5 = list6.RandomItem();
if (thing5.Num > 1)
thing4 = list4.RandomItem();
if (thing4.Num > 1)
{
thing5 = thing5.Split(1);
thing4 = thing4.Split(1);
}
}
CC.AddCooldown(6640, 200);
}
if (thing5 == null)
if (thing4 == null)
{
CC.Say("abStealNothing", CC, TC);
break;
}
thing5.SetInt(116, 1);
TC.PlaySound(thing5.material.GetSoundDrop(thing5.sourceCard));
CC.Pick(thing5, msg: false);
CC.Say("abSteal", CC, TC, thing5.Name);
thing4.SetInt(116, 1);
TC.PlaySound(thing4.material.GetSoundDrop(thing4.sourceCard));
CC.Pick(thing4, msg: false);
CC.Say("abSteal", CC, TC, thing4.Name);
if (actRef.n1 == "food")
{
if (CC.hunger.value != 0)
{
CC.InstantEat(thing5);
CC.InstantEat(thing4);
}
}
else
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
case EffectId.KizuamiTrick:
{
EClass.game.religions.Trickery.Talk("ability");
bool hex2 = CC.IsHostile(TC);
List<SourceStat.Row> list4 = EClass.sources.stats.rows.Where((SourceStat.Row con) => con.tag.Contains("random") && con.group == (hex2 ? "Debuff" : "Buff")).ToList();
bool hex = CC.IsHostile(TC);
List<SourceStat.Row> list6 = EClass.sources.stats.rows.Where((SourceStat.Row con) => con.tag.Contains("random") && con.group == (hex ? "Debuff" : "Buff")).ToList();
int power2 = power;
for (int l = 0; l < 4 + EClass.rnd(2); l++)
{
SourceStat.Row row2 = list4.RandomItem();
list4.Remove(row2);
Proc(hex2 ? EffectId.DebuffKizuami : EffectId.Buff, CC, TC, power2, new ActRef
SourceStat.Row row2 = list6.RandomItem();
list6.Remove(row2);
Proc(hex ? EffectId.DebuffKizuami : EffectId.Buff, CC, TC, power2, new ActRef
{
n1 = row2.alias
});
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
tc.bio.SetGender(gender2);
tc.Say("transGender", tc, Gender.Name(tc.bio.gender));
tc.Talk("tail");
int age3 = tc.bio.GetAge(tc.Chara);
if (blessed && age3 > 1)
int age = tc.bio.GetAge(tc.Chara);
if (blessed && age > 1)
{
tc.Say("ageDown", tc);
tc.bio.SetAge(tc.Chara, age3 - 1, allowUnique: true);
tc.bio.SetAge(tc.Chara, age - 1);
}
else if (flag)
{
tc.Say("ageUp", tc);
tc.bio.SetAge(tc.Chara, age3 + 1, allowUnique: true);
tc.bio.SetAge(tc.Chara, age + 1);
}
break;
}
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
{
tc.PlaySound("mutation");
tc.PlayEffect("mutation");
int age2 = tc.bio.GetAge(tc.Chara);
if (!flag && age2 <= 1)
int age3 = tc.bio.GetAge(tc.Chara);
if (!flag && age3 <= 0)
{
tc.SayNothingHappans();
break;
}
age2 = Mathf.Max(1, age2 * 100 / (flag ? 75 : (blessed ? 400 : 200)));
age3 = Mathf.Max(0, age3 * 100 / (flag ? 75 : (blessed ? 400 : 200))) + (flag ? 1 : 0);
tc.Say(flag ? "ageUp" : "ageDown", tc);
tc.bio.SetAge(tc.Chara, age2, allowUnique: true);
tc.bio.SetAge(tc.Chara, age3);
break;
}
case EffectId.EternalYouth:
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
tc.SayNothingHappans();
break;
}
int age = tc.bio.GetAge(tc.Chara);
int age2 = tc.bio.GetAge(tc.Chara);
if (flag)
{
if (tc.c_lockedAge != 0)
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
tc.Say("eternalYouth2", tc);
tc.c_lockedAge = 0;
tc.elements.Remove(1243);
tc.bio.SetAge(tc.Chara, age);
tc.bio.SetAge(tc.Chara, age2);
}
Redirect(EffectId.Youth, BlessedState.Cursed, default(ActRef));
}
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
{
tc.PlaySound("dropRewardXmas");
tc.Say("eternalYouth1", tc);
tc.c_lockedAge = age;
tc.c_lockedAge = age2 + 1;
tc.elements.SetBase(1243, 1);
if (blessed)
{
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
case EffectId.DamageMindGreat:
case EffectId.Weaken:
{
bool flag7 = id == EffectId.DamageBody || id == EffectId.DamageBodyGreat;
bool flag8 = id == EffectId.DamageBody || id == EffectId.DamageBodyGreat;
bool mind = id == EffectId.DamageMind || id == EffectId.DamageMindGreat;
int num8 = ((id == EffectId.DamageBody || id == EffectId.DamageMind) ? 1 : (4 + EClass.rnd(4)));
if (id == EffectId.Weaken)
{
flag7 = EClass.rnd(2) == 0;
mind = !flag7;
flag8 = EClass.rnd(2) == 0;
mind = !flag8;
num8 = 1;
}
else
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
TC.PlayEffect("debuff");
TC.PlaySound("debuff");
}
TC.Say(flag7 ? "damageBody" : "damageMind", TC);
TC.Say(flag8 ? "damageBody" : "damageMind", TC);
for (int k = 0; k < num8; k++)
{
TC.DamageTempElements(power, flag7, mind, id != EffectId.Weaken);
TC.DamageTempElements(power, flag8, mind, id != EffectId.Weaken);
}
if (TC.IsPC)
{
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
case EffectId.EnhanceBodyGreat:
case EffectId.EnhanceMindGreat:
{
bool flag8 = id == EffectId.EnhanceBody || id == EffectId.EnhanceBodyGreat;
bool flag9 = id == EffectId.EnhanceBody || id == EffectId.EnhanceBodyGreat;
bool mind2 = id == EffectId.EnhanceMind || id == EffectId.EnhanceMindGreat;
if (id != EffectId.EnhanceBody && id != EffectId.EnhanceMind)
{
EClass.rnd(4);
}
TC.Say(flag8 ? "enhanceBody" : "enhanceMind", TC);
TC.Say(flag9 ? "enhanceBody" : "enhanceMind", TC);
TC.PlayEffect("buff");
TC.PlaySound("buff");
TC.EnhanceTempElements(power, flag8, mind2, onlyRenew: true);
TC.EnhanceTempElements(power, flag9, mind2, onlyRenew: true);
break;
}
case EffectId.RestoreBody:
public static bool DamageEle(Card CC, EffectId id, int power, Element e, List<Po
List<Thing> list5 = TC.things.List((Thing t) => (t.Num <= 1 && t.IsEquipmentOrRanged && !t.IsToolbelt && !t.IsLightsource && t.isEquipped) ? true : false);
if (list5.Count != 0)
{
Thing thing4 = list5.RandomItem();
Thing thing5 = list5.RandomItem();
TC.Say("acid_hit", TC);
if (thing4.isAcidproof)
if (thing5.isAcidproof)
{
TC.Say("acid_nullify", thing4);
TC.Say("acid_nullify", thing5);
}
else if (thing4.encLV > -5)
else if (thing5.encLV > -5)
{
TC.Say("acid_rust", TC, thing4);
thing4.ModEncLv(-1);
LayerInventory.SetDirty(thing4);
TC.Say("acid_rust", TC, thing5);
thing5.ModEncLv(-1);
LayerInventory.SetDirty(thing5);
}
if (TC.IsPCParty)
{
AttackProcess
public void Prepare(Chara _CC, Thing _weapon, Card _TC = null, Point _TP = null,
int num3 = Mathf.Clamp(weapon.material.hardness, flag ? 40 : 20, 200);
weaponSkill = CC.elements.GetOrCreateElement(108);
attackType = AttackType.Blunt;
dBonus = CC.DMG + (CC.IsPCParty ? 3 : 7);
dBonus = CC.DMG + (CC.IsPCParty ? 3 : 7) + Math.Min(weapon.encLV, 99);
dNum = 2;
dDim = (((!CC.IsPCParty) ? CC.LV : 0) + CC.STR + CC.Evalue(108)) * num2 / 100 * num3 / 100 / 2;
dMulti = 1f;
Biography
public bool IsUnderAge(Chara c)
public string TextAge(Chara c)
{
object obj;
if (GetAge(c) < 1000)
{
obj = GetAge(c).ToString();
if (obj == null)
{
return "";
}
}
else
{
obj = "???";
}
return (string)obj;
return Lang.Parse("age", (GetAge(c) >= 1000) ? "???" : (GetAge(c).ToString() ?? ""));
}
public int GetAge(Chara c)
{
if (c.c_lockedAge != 0)
{
return c.c_lockedAge;
return c.c_lockedAge - 1;
}
if (c.IsUnique)
{
return EClass.world.date.year - birthYear;
}
public void SetAge(Chara c, int a, bool allowUnique = false)
public void SetAge(Chara c, int a)
{
if (c.IsUnique)
{
if (allowUnique)
c.c_lockedAge = a + 1;
string[] array = c.source.bio.Split('/');
if (array.Length > 1)
{
c.c_lockedAge = a;
SetBirthYear(c, int.Parse(array[1]));
}
}
else if (c.c_lockedAge == 0)
{
birthYear = EClass.world.date.year - a;
SetBirthYear(c, a);
}
else
{
c.c_lockedAge = a;
c.c_lockedAge = a + 1;
}
}
public void SetBirthYear(Chara c, int a)
{
birthYear = EClass.world.date.year - a;
}
public void Generate(Chara c)
{
string bio = c.source.bio;
{
flag = false;
}
SetAge(c, int.Parse(array[1]));
SetBirthYear(c, int.Parse(array[1]));
c.pccData = IO.LoadFile<PCCData>(CorePath.packageCore + "Data/PCC/" + c.id + ".txt");
}
if (array.Length > 2)
}
if (c.id == "prostitute" && GetAge(c) < 15)
{
SetAge(c, 15);
SetBirthYear(c, 15);
}
SourceThing.Row row = EClass.sources.things.rows.RandomItem();
idLike = row.id;
public void GenerateBirthday(Chara c, int ageIndex = 0)
if (ageIndex != 0)
{
int num3 = (num2 - num) / 4;
SetAge(c, Rand.Range(num + num3 * (ageIndex - 1), num + num3 * ageIndex));
SetBirthYear(c, Rand.Range(num + num3 * (ageIndex - 1), num + num3 * ageIndex));
}
else
{
SetAge(c, Rand.Range(num, num2));
SetBirthYear(c, Rand.Range(num, num2));
}
birthDay = EClass.rnd(30) + 1;
birthMonth = EClass.rnd(12) + 1;
public void SetPortrait(Chara c)
public string TextBio(Chara c)
{
return c.race.GetText().ToTitleCase(wholeText: true) + " " + Lang.Parse("age", TextAge(c)) + " " + Lang._gender(gender);
return c.race.GetText().ToTitleCase(wholeText: true) + " " + TextAge(c) + " " + Lang._gender(gender);
}
public string TextBio2(Chara c)
public string TextBio2(Chara c)
public string TextBioSlave(Chara c)
{
return " (" + Lang.GetList("genders_animal")[c.bio.gender] + " " + "age".lang(c.bio.TextAge(c)) + ")";
return " (" + Lang.GetList("genders_animal")[c.bio.gender] + " " + TextAge(c) + ")";
}
public string TextBirthDate(Chara c, bool _age = false)
{
return Lang.Parse("birthText", (birthYear >= 0) ? (birthYear.ToString() ?? "") : "???", birthMonth.ToString() ?? "", birthDay.ToString() ?? "") + (_age ? (" (" + Lang.Parse("age", TextAge(c)) + ")") : "");
return Lang.Parse("birthText", (birthYear >= 0) ? (birthYear.ToString() ?? "") : "???", birthMonth.ToString() ?? "", birthDay.ToString() ?? "") + (_age ? (" (" + TextAge(c) + ")") : "");
}
public string TextAppearance()
ButtonChara
public void SetChara(Chara c, Mode m)
textAlias.text = c.Aka;
if ((bool)textBio)
{
textBio.text = c.race.GetText().ToTitleCase(wholeText: true) + " " + Lang.Parse("age", c.bio.TextAge(c)) + " " + Lang._gender(c.bio.gender);
textBio.text = c.race.GetText().ToTitleCase(wholeText: true) + " " + c.bio.TextAge(c) + " " + Lang._gender(c.bio.gender);
}
}
textName.text = c.Name;
Cell
public bool CanSuffocate()
{
if (EClass._zone.IsUnderwater)
if (EClass._zone.IsUnderwater && !EClass._zone.IsUserZone)
{
return true;
}
CharaRenderer
RenderObject.currentParam.y += num + 0.01f * (float)(pref.equipY + cardRow.pref.equipY);
RenderObject.currentParam.z -= pref.hatY;
RenderObject.currentParam.tile = cardRow._tiles[owner.uid % cardRow._tiles.Length] * ((!flag) ? 1 : (-1));
RenderObject.currentParam.mat = cardRow.DefaultMaterial;
RenderObject.currentParam.matColor = cardRow.GetColorInt(RenderObject.currentParam.mat);
cardRow.renderData.Draw(RenderObject.currentParam);
RenderObject.currentParam.x -= 0.01f * (float)pref.equipX;
RenderObject.currentParam.y -= num + 0.01f * (float)(pref.equipY + cardRow.pref.equipY);
CraftUtil
NoMix
}
public enum WrapType
{
Love,
Dark
}
public static string[] ListFoodEffect = new string[2] { "exp", "pot" };
public static void ModRandomFoodEnc(Thing t)
public static Thing MakeDarkSoup()
for (int i = 0; i < 4 + EClass.rnd(4); i++)
{
Chara c = EClass._map.charas.RandomItem();
AddIngredient(thing, c, GetRandomDarkSoupIngredient(c));
WrapIngredient(thing, c, GetRandomDarkSoupIngredient(c), WrapType.Dark);
}
if (!EClass.debug.autoIdentify)
{
public static Thing MakeLoveLunch(Chara c)
for (int i = 0; (float)i < num2; i++)
{
Rand.SetSeed(num + i);
AddIngredient(thing, c, GetRandomLoveLunchIngredient(c), writeCrafter: false);
WrapIngredient(thing, c, GetRandomLoveLunchIngredient(c), WrapType.Love);
}
thing.elements.SetBase(701, 0);
if (thing.Evalue(753) < 0)
public static Thing MakeLoveLunch(Chara c)
public static Thing GetRandomLoveLunchIngredient(Chara c)
{
Thing thing = null;
int lV = c.LV;
for (int i = 0; i < 3; i++)
{
thing = ThingGen.Create("dish", -1, lV + i * 3);
thing = ThingGen.Create("dish", -1, c.Evalue(287) + 5 + (EClass.debug.enable ? c.LV : 0));
if (!thing.HasTag(CTAG.dish_fail))
{
break;
}
}
MakeDish(thing, lV, c);
MakeDish(thing, c.LV, c);
return thing;
}
public static void AddIngredient(Card product, Chara c, Card ing, bool writeCrafter = true)
public static void WrapIngredient(Card product, Chara c, Card ing, WrapType wrapType)
{
if (product.c_mixedFoodData == null)
{
product.c_mixedFoodData = new MixedFoodData();
}
product.c_mixedFoodData.texts.Add(ing.Name + (writeCrafter ? "isMixedBy".lang(c.NameSimple) : ""));
product.c_mixedFoodData.texts.Add(ing.Name + ((wrapType == WrapType.Dark) ? "isMixedBy".lang(c.NameSimple) : ""));
foreach (Element value in ing.elements.dict.Values)
{
if (!IsValidTrait(value))
public static void AddIngredient(Card product, Chara c, Card ing, bool writeCraf
if (value.IsFoodTraitMain)
{
int num = value.Value;
if (product.id == "lunch_dystopia")
if (product.id == "lunch_dystopia" && (wrapType == WrapType.Dark || num < 0))
{
num *= -1;
}
public static Card MixIngredients(Card product, List<Thing> ings, MixType type,
product.elements.SetTo(10, 1);
}
}
if (creative && isFood)
if (creative && isFood && product.category.IsChildOf("meal"))
{
product.elements.SetBase(764, 1);
}
FactionBranch
public void OnSimulateHour(VirtualDate date)
if (luckyMonth || (policies.IsActive(2822) && Mathf.Sqrt(Evalue(2822) / 2) + 5f >= (float)EClass.rnd(100)))
{
chara = CharaGen.CreateWealthy(ContentLV);
EClass._zone.AddCard(chara, EClass._zone.GetSpawnPos(SpawnPosition.Random) ?? EClass._map.GetRandomSurface());
EClass._zone.AddCard(chara, EClass._zone.GetSpawnPos(SpawnPosition.Guest) ?? EClass._map.GetRandomSurface());
}
else
{
Map
public void ExportMetaData(string _path, string id, PartialMap partial = null)
name = EClass._zone.Name,
version = BaseCore.Instance.version.GetInt(),
tag = (EClass._map.exportSetting?.tag ?? ""),
partial = partial
partial = partial,
underwater = EClass._zone.IsUnderwater
};
custom.id = (mapMetaData.id = id);
IO.SaveFile(_path + "meta", mapMetaData);
MapMetaData
public class MapMetaData : EClass
[JsonProperty]
public PartialMap partial;
[JsonProperty]
public bool underwater;
public string path;
public DateTime date;
Person
{
text = text + " " + dramaText;
}
return chara.Name.ToTitleCase() + " - " + chara.race.GetText().ToTitleCase() + " " + Lang.Parse("age", bio.TextAge(chara)) + " " + Lang._gender(bio.gender) + text;
return chara.Name.ToTitleCase() + " - " + chara.race.GetText().ToTitleCase() + " " + bio.TextAge(chara) + " " + Lang._gender(bio.gender) + text;
}
if (Name.IsEmpty())
{
SpawnPosition
public enum SpawnPosition
{
Random,
Outside
Outside,
Guest
}
SpawnSetting
public static SpawnSetting HomeGuest(int lv)
filterLv = lv,
hostility = SpawnHostility.Neutral,
idSpawnList = "c_guest",
position = SpawnPosition.Outside,
position = SpawnPosition.Guest,
rarity = Rarity.Normal
};
}
TraitMoongate
public void LoadMap(MapMetaData m)
zone_User.idUser = m.id;
zone_User.dateExpire = EClass.world.date.GetRaw(1);
zone_User.name = m.name;
if (m.underwater)
{
zone_User.elements.SetBase(3606, 1);
}
}
Debug.Log(zone_User);
MoveZone(zone_User);
Zone
public Point GetSpawnPos(SpawnPosition type, int tries = 100)
for (int i = 0; i < tries; i++)
{
point = EClass._map.bounds.GetRandomSurface(centered: false, walkable: true, allowWater: true);
if (point.IsValid && !point.cell.hasDoor && !point.IsSync && (type != SpawnPosition.Outside || (!point.cell.HasRoof && point.cell.light <= 0)))
if (!point.IsValid || point.cell.hasDoor || point.IsSync)
{
return point;
continue;
}
switch (type)
{
case SpawnPosition.Guest:
{
Room room = point.cell.room;
if (room != null && room.data.accessType != 0)
{
continue;
}
break;
}
case SpawnPosition.Outside:
if (point.cell.HasRoof || point.cell.light > 0)
{
continue;
}
break;
}
return point;
}
return null;
}
Zone_User
public override bool RevealRoom => true;
public override bool IsUnderwater => elements.Has(3606);
public override void OnActivate()
{
base.OnActivate();