Skip to content

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)

cs
public override bool OnUse(Chara c) 

AIWork_Fish

public class AIWork_Fish : AIWork

cs

	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()

cs

	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()

cs
	}
	if (pos != null)
	{
		if (!pos.cell.IsTopWaterAndNoSnow) 
		if (!pos.cell.IsTopWaterAndNoSnow && !EClass._zone.IsUnderwater) 
		{
			yield return Cancel();
		}

public override IEnumerable<Status> Run()

cs
				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()

cs
	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()

cs
			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()

cs
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)

cs
		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()

cs

	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()

cs
						_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()

cs
					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

cs
	{
		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

public bool CanDuplicate()

cs
	{
		return false;
	}
	if (CurrentGeneSlot != 0) 
	if (!EClass.game.principal.enableGeneDupe && CurrentGeneSlot != 0) 
	{
		return false;
	}

public void RestockEquip(bool onCreate)

cs
	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;

cs
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)

cs
	{
		return true;
	}
	public override void SetOwner(Chara _owner, bool onDeserialize = false) 
	{ 
		if (!onDeserialize) 
		{ 
			cha = _owner.CHA; 
		} 
		base.SetOwner(_owner, onDeserialize); 
	} 
}

CoreDebug

public void QuickStart()

cs
			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");

public void UpdateInput()

cs
	}
	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))

public void UpdateInput()

cs
		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

cs
	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)

cs
		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)

cs
		}
		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)

cs
		{
			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

public void SetInt(int value)

cs
	[JsonProperty]
	public bool enableDamageReduction;

	[JsonProperty] 
	public bool enableGeneDupe; 
	[JsonProperty]
	public HashSet<string> modified = new HashSet<string>();

public List<Item> ListItems()

cs
	{
		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)

cs
		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

public bool IsHotSpring

cs
{
	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

cs
	public override int DefaultStock => 10 + EClass.rnd(50);

	public override int CraftNum => 20;
	public override ThrowType ThrowType => ThrowType.Explosive; 
}

+TraitDollHouse

File Created
cs
public class TraitDollHouse : TraitItemToggle
{
}

+TraitGeneratorSolar

File Created
cs
public class TraitGeneratorSolar : TraitGenerator
{
	public override bool Waterproof => true;
}

+TraitItemToggle

File Created
cs
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

cs
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; 
	} 
}