EA 23.219 Nightly
October 13, 2025
15 files modified. 3 new files created.
Important Changes
Possible breaking changes. Click the filename to view the chunk.
TraitSpit (1)
public override bool OnUse(Chara c)
AIWork_Fish
public class AIWork_Fish : AIWork
public override bool FuncWorkPoint(Point p)
{
return p.IsWater;
if (!p.IsWater)
{
return EClass._zone.IsUnderwater;
}
return true;
}
public override AIAct GetWork(Point p)
AI_Fish
public override bool CanManualCancel()
public override bool CanPerform()
{
return Act.TP.cell.IsTopWaterAndNoSnow;
if (!Act.TP.cell.IsTopWaterAndNoSnow)
{
return EClass._zone.IsUnderwater;
}
return true;
}
public override AIProgress CreateProgress()
public override IEnumerable<Status> Run()
}
if (pos != null)
{
if (!pos.cell.IsTopWaterAndNoSnow)
if (!pos.cell.IsTopWaterAndNoSnow && !EClass._zone.IsUnderwater)
{
yield return Cancel();
}
public override IEnumerable<Status> Run()
yield return Cancel();
}
}
if (!pos.cell.IsTopWaterAndNoSnow || owner.Dist(pos) > 1)
if ((!pos.cell.IsTopWaterAndNoSnow && !EClass._zone.IsUnderwater) || owner.Dist(pos) > 1)
{
yield return Cancel();
}
public override IEnumerable<Status> Run()
List<Point> list = owner.fov.ListPoints();
foreach (Point p in list)
{
if (p.cell.IsTopWaterAndNoSnow)
if (p.cell.IsTopWaterAndNoSnow && !EClass._zone.IsUnderwater)
{
continue;
}
public override IEnumerable<Status> Run()
for (int _z = p.z - 1; _z <= p.z + 1; _z++)
{
Point.shared.Set(_x, _z);
if (Point.shared.IsValid && Point.shared.cell.IsTopWaterAndNoSnow)
if (Point.shared.IsValid && (EClass._zone.IsUnderwater || Point.shared.cell.IsTopWaterAndNoSnow))
{
Point dest = Point.shared.Copy();
yield return DoGoto(dest);
public override IEnumerable<Status> Run()
public static Point GetFishingPoint(Point p)
{
Point point = new Point();
if (p.cell.IsTopWaterAndNoSnow)
if (p.cell.IsTopWaterAndNoSnow && !EClass._zone.IsUnderwater)
{
return Point.Invalid;
}
public static Point GetFishingPoint(Point p)
for (int j = p.z - 1; j <= p.z + 1; j++)
{
point.Set(i, j);
if (point.IsValid && point.cell.IsTopWaterAndNoSnow)
if (point.IsValid && (point.cell.IsTopWaterAndNoSnow || EClass._zone.IsUnderwater))
{
return point;
}
ActWhirlwind
public override bool CanPerform()
public override bool Perform()
{
List<Chara> list = Act.CC.pos.ListCharasInNeighbor((Chara c) => c != Act.CC);
List<Chara> list = Act.CC.pos.ListCharasInNeighbor((Chara c) => !c.pos.Equals(Act.CC.pos));
Act.CC.PlaySound("ab_shred2");
Act.CC.Say("abWhirlwind", Act.CC);
foreach (Chara item in list.Copy())
{
Act.TC = item;
if (!Act.CC.IsAliveInCurrentZone || !Act.TC.IsAliveInCurrentZone)
if (Act.CC.IsAliveInCurrentZone && Act.TC.IsAliveInCurrentZone)
{
break;
Act.TC.PlayEffect("ab_bladestorm");
new ActMeleeWhilrwind().Perform(Act.CC, Act.TC);
}
Act.TC.PlayEffect("ab_bladestorm");
new ActMeleeWhilrwind().Perform(Act.CC, Act.TC);
}
return true;
}
BaseTileMap
public virtual void DrawTile()
_actorPos.x += pref.x * (float)((!t.flipX) ? 1 : (-1));
_actorPos.z += pref.z;
thingPos.z += pref.z;
liquidLv -= (int)(num27 * 150f);
if (liquidLv < 0)
{
liquidLv = 0;
public virtual void DrawTile()
flag = true;
float num28 = ((this.cell._bridge != 0) ? sourceBridge.tileType.FloorHeight : sourceFloor.tileType.FloorHeight);
orgY += 0.01f * floatY - num28;
num24 = num27;
if (!t.trait.IsChangeFloorHeight)
{
num24 = num27;
}
_actorPos.y += 0.01f * floatY - num28;
if (liquidLv > 10)
{
Card
public virtual void Die(Element e = null, Card origin = null, AttackSource attac
{
EClass._zone.AddCard(ThingGen.Create((EClass.rnd(2) == 0) ? "ash" : "ash2"), _pos);
}
if (trait.ThrowType == ThrowType.Explosive)
if (trait.ThrowType == ThrowType.Explosive && EClass.rnd((!(trait is TraitAmmoRocket)) ? 1 : 2) == 0)
{
Explode(pos, origin);
}
Chara
{
return false;
}
if (CurrentGeneSlot != 0)
if (!EClass.game.principal.enableGeneDupe && CurrentGeneSlot != 0)
{
return false;
}
public void RestockEquip(bool onCreate)
case "mech_angel":
if (onCreate)
{
CardBlueprint.Set();
Thing thing = ThingGen.Create("pole_holy");
thing.SetReplica(on: true);
thing.rarity = Rarity.Normal;
ConWeapon
using Newtonsoft.Json;
public class ConWeapon : BaseBuff
{
[JsonProperty]
public int cha;
public override bool IsElemental => true;
public override int P2 => owner.CHA;
public override int P2 => cha;
public override void Tick()
{
public override bool CanStack(Condition c)
{
return true;
}
public override void SetOwner(Chara _owner, bool onDeserialize = false)
{
if (!onDeserialize)
{
cha = _owner.CHA;
}
base.SetOwner(_owner, onDeserialize);
}
}
CoreDebug
thing.AddThing("book", lv);
thing.AddThing("parchment");
thing.AddThing("book_ancient");
thing.AddCard(ThingGen.CreateRedBook("fox_dawn"));
thing.AddCard(ThingGen.CreateRedBook("forgotten_gods_1"));
}
EClass.pc.AddCard(thing);
thing.Dye("rubinus");
}
if (Input.GetKeyDown(KeyCode.F4))
{
EClass.player.ModFame(EClass.player.fame);
EClass.game.religions.ジュアさまの薄い本をください();
for (int j = 0; j < 100; j++)
{
Chara chara2 = EClass._zone.SpawnMob(null, SpawnSetting.HomeEnemy(10));
if (chara2.IsAnimal)
{
chara2.Destroy();
}
}
return;
}
if (Input.GetKeyDown(KeyCode.F5))
if (Input.GetKey(KeyCode.F9))
{
EClass.scene.paused = false;
for (int j = 0; j < advanceMin; j++)
for (int k = 0; k < advanceMin; k++)
{
EClass.game.updater.FixedUpdate();
}
ElementContainerCard
public override bool IsMeleeWeapon
public void SetOwner(Card c, bool applyFeat)
{
owner = c;
SourceValueType sourceValueType = ((c.IsEquipmentOrRangedOrAmmo && c.rarity < Rarity.Artifact) ? SourceValueType.EquipmentRandom : SourceValueType.Fixed);
SourceValueType sourceValueType = ((c.IsEquipmentOrRangedOrAmmo && c.rarity < Rarity.Artifact && !c.isReplica) ? SourceValueType.EquipmentRandom : SourceValueType.Fixed);
ApplyElementMap(c.uid, sourceValueType, c.sourceCard.elementMap, (sourceValueType != SourceValueType.EquipmentRandom) ? 1 : c.LV, invert: false, applyFeat);
}
FactionBranch
public void OnSimulateHour(VirtualDate date)
int num7 = 1 + EClass.rnd(num2 + num3 + 1);
for (int i = 0; i < num7; i++)
{
EClass._zone.SpawnMob(null, SpawnSetting.HomeEnemy(DangerLV));
Chara chara = EClass._zone.SpawnMob(null, SpawnSetting.HomeEnemy(DangerLV));
if (chara.IsAnimal && policies.IsActive(2709))
{
chara.Destroy();
}
}
}
if ((date.IsRealTime || num2 == 0) && num6 != 0 && EClass.rnd(num6) == 0 && EClass._map.CountWildAnimal() < num4)
public void OnSimulateHour(VirtualDate date)
}
if (EClass._map.CountGuest() < num8)
{
Chara chara;
Chara chara2;
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.Guest) ?? EClass._map.GetRandomSurface());
chara2 = CharaGen.CreateWealthy(ContentLV);
EClass._zone.AddCard(chara2, EClass._zone.GetSpawnPos(SpawnPosition.Guest) ?? EClass._map.GetRandomSurface());
}
else
{
chara = EClass._zone.SpawnMob(null, SpawnSetting.HomeGuest(ContentLV));
chara2 = EClass._zone.SpawnMob(null, SpawnSetting.HomeGuest(ContentLV));
}
if (chara != null && (chara.id == "nun_mother" || chara.id == "prostitute") && policies.IsActive(2710))
if (chara2 != null && (chara2.id == "nun_mother" || chara2.id == "prostitute") && policies.IsActive(2710))
{
chara.Destroy();
chara = null;
chara2.Destroy();
chara2 = null;
}
if (chara != null)
if (chara2 != null)
{
statistics.visitor++;
chara.memberType = FactionMemberType.Guest;
chara.SetInt(34, EClass.world.date.GetRaw());
chara.c_allowance = chara.LV * 100;
if (chara.IsWealthy)
chara2.memberType = FactionMemberType.Guest;
chara2.SetInt(34, EClass.world.date.GetRaw());
chara2.c_allowance = chara2.LV * 100;
if (chara2.IsWealthy)
{
chara.c_allowance *= 10;
chara2.c_allowance *= 10;
}
if (date.IsRealTime)
{
Msg.Say("guestArrive", chara.Name);
Msg.Say("guestArrive", chara2.Name);
}
else
{
chara.TryAssignBed();
chara2.TryAssignBed();
}
}
}
}
foreach (Chara chara3 in EClass._map.charas)
foreach (Chara chara4 in EClass._map.charas)
{
if (chara3.memberType != FactionMemberType.Guest || ((chara3.c_allowance > 0 || EClass.rnd(2) != 0) && chara3.GetInt(34) + 10080 >= EClass.world.date.GetRaw()))
if (chara4.memberType != FactionMemberType.Guest || ((chara4.c_allowance > 0 || EClass.rnd(2) != 0) && chara4.GetInt(34) + 10080 >= EClass.world.date.GetRaw()))
{
continue;
}
foreach (Chara item in EClass._zone.ListMinions(chara3))
foreach (Chara item in EClass._zone.ListMinions(chara4))
{
item.Destroy();
}
if (!chara3.IsGlobal)
if (!chara4.IsGlobal)
{
chara3.Destroy();
chara4.Destroy();
}
chara3.ClearBed();
chara4.ClearBed();
break;
}
if (date.hour == 5)
public void OnSimulateHour(VirtualDate date)
{
if (EClass.rnd(20) == 0 && thing.trait is TraitFoodEggFertilized && thing.pos.FindThing<TraitBed>() != null)
{
Chara chara2 = TraitFoodEggFertilized.Incubate(thing, thing.pos);
Chara chara3 = TraitFoodEggFertilized.Incubate(thing, thing.pos);
thing.ModNum(-1);
if (date.IsRealTime)
{
chara2.PlaySound("egg");
chara3.PlaySound("egg");
}
break;
}
GamePrincipal
[JsonProperty]
public bool enableDamageReduction;
[JsonProperty]
public bool enableGeneDupe;
[JsonProperty]
public HashSet<string> modified = new HashSet<string>();
{
enableDamageReduction = a;
});
Add(-1, Type.Legacy, "enableGeneDupe", () => enableGeneDupe, delegate(bool a)
{
enableGeneDupe = a;
});
Add(-1, Type.Flavor, "noAging", () => noAging, delegate(bool a)
{
noAging = a;
HotItemHeld
public bool TrySetToolAct(ActPlan p)
p.TrySetAct(ACT.Ranged, tc);
return true;
}
if (cell.IsTopWaterAndNoSnow && thing.HasElement(245) && p.TrySetAct(new AI_Fish
if ((cell.IsTopWaterAndNoSnow || EClass._zone.IsUnderwater) && thing.HasElement(245) && p.TrySetAct(new AI_Fish
{
pos = pos.Copy()
}))
Point
{
get
{
if (cell.IsTopWaterAndNoSnow)
if (cell.IsTopWaterAndNoSnow || EClass._zone.IsUnderwater)
{
if (!EClass._zone.elements.Has(3701))
if (!EClass.debug.enable && !EClass._zone.elements.Has(3701))
{
return IsInSpot<TraitGeyser>();
}
TraitAmmoRocket
public class TraitAmmoRocket : TraitAmmo
public override int DefaultStock => 10 + EClass.rnd(50);
public override int CraftNum => 20;
public override ThrowType ThrowType => ThrowType.Explosive;
}
+TraitDollHouse
File Created
public class TraitDollHouse : TraitItemToggle
{
}
+TraitGeneratorSolar
File Created
public class TraitGeneratorSolar : TraitGenerator
{
public override bool Waterproof => true;
}
+TraitItemToggle
File Created
public class TraitItemToggle : TraitItem
{
public override bool IsAnimeOn => owner.isOn;
public override ToggleType ToggleType => ToggleType.Custom;
public override bool CanUseFromInventory => false;
public override bool OnUse(Chara c)
{
Toggle(!owner.isOn);
return true;
}
}
TraitSpit
public class TraitSpit : TraitItem
public class TraitSpit : TraitItem
public class TraitSpit : TraitItemToggle
{
public override bool IsAnimeOn => owner.isOn;
public override ToggleType ToggleType => ToggleType.Custom;
public override bool CanUseFromInventory => false;
public override bool OnUse(Chara c)
{
Toggle(!owner.isOn);
return true;
}
}