Skip to content

EA 23.319 Nightly Patch 1 โ€‹

June 19, 2026

11 files modified. 1 new file created.

Important Changes โ€‹

None.

AI_Shear โ€‹

public override IEnumerable<Status> Run()

cs
			{
				if (target.IsAliveInCurrentZone)
				{
					Thing fur = GetFur(target.Chara); 
					owner.Say("shear_end", owner, target, fur.Name); 
					owner.Pick(fur, msg: false); 
					owner.elements.ModExp(237, 50 * furLv); 
					owner.stamina.Mod(-1); 
					target.Chara.ModAffinity(owner, 1); 
					EClass.player.stats.shear++; 
					Point pos = target.pos; 
					int num = owner.Tool?.Evalue(770) ?? 0; 
					num = ((num <= 0) ? 1 : (2 + num / 10)); 
					if (num > 1) 
					{ 
						List<Point> list = EClass._map.ListPointsInSquare(pos, num - 1); 
						list.Sort((Point a, Point b) => a.Distance(pos) - b.Distance(pos)); 
						{ 
							foreach (Point item in list) 
							{ 
								foreach (Chara item2 in item.ListCharas()) 
								{ 
									if (item2.CanBeSheared()) 
									{ 
										Shear(item2); 
									} 
									if (owner == null || owner.isDead) 
									{ 
										break; 
									} 
								} 
							} 
							return; 
						} 
					} 
					Shear(target.Chara); 
				}
			}
		}.SetDuration((6 + furLv * 6) * 100 / (100 + owner.Tool.material.hardness * 2), 3);
		yield return Do(seq);
		void Shear(Chara c) 
		{ 
			Thing fur = GetFur(c); 
			owner.Say("shear_end", owner, c, fur.Name); 
			owner.Pick(fur, msg: false); 
			owner.elements.ModExp(237, 50 * furLv); 
			owner.stamina.Mod(-1); 
			c.ModAffinity(owner, 1); 
			EClass.player.stats.shear++; 
		} 
	}

	public static int GetFurLv(Chara c)

CustomDramaExpansion โ€‹

public static bool set_portrait(DramaManager dm, Dictionary<string, string> line

cs
		{
			return false;
		}
		string text = person.chara?.GetIdPortrait(); 
		string idPortrait = person.chara?.GetIdPortrait(); 
		if (!portraitId.IsEmpty())
		{
			string text2 = person.id.IsEmpty(person.chara?.id); 
			string text = person.id.IsEmpty(person.chara?.id); 
			HashSet<string> hashSet = new HashSet<string>(StringComparer.Ordinal);
			hashSet.Add("UN_" + text2 + "_" + text + ".png"); 
			hashSet.Add(text + ".png"); 
			hashSet.Add(text2 + "_" + text + ".png"); 
			string text3 = hashSet.FirstOrDefault(Portrait.allIds.Contains); 
			if (text3 != null) 
			hashSet.Add("UN_" + text + "_" + portraitId + ".png"); 
			hashSet.Add(portraitId + ".png"); 
			hashSet.Add(text + "_" + portraitId + ".png"); 
			string text2 = hashSet.FirstOrDefault(Portrait.allIds.Contains); 
			if (text2 != null) 
			{
				text = text3[..^4]; 
				idPortrait = text2[..^4]; 
			}
		}
		person.idPortrait = text; 
		person.idPortrait = idPortrait; 
		return true;
	}

DramaSequence โ€‹

public DramaActor GetActor(string id)

cs
		{
			name = value2.GetName()
		};
		if (Portrait.allIds.Contains(person.id)) 
		if (Portrait.allIds.Contains("UN_" + id + ".png")) 
		{
			person.idPortrait = "UN_" + id; 
			person.idPortrait = "UN_" + id + ".png"; 
		} 
		else
		{ 
			person.SetChara(CharaGen.Create(value2.id)); 
		}
		return AddActor(id, person);
	}

GoalCombat โ€‹

public virtual bool TryUseAbility(int dist, bool beforeMove = false)

cs
		}
		switch (act.id)
		{
		case 6802: 
			if (owner.IsPCFactionOrMinion && tc.IsPCFactionOrMinion) 
			{ 
				continue; 
			} 
			break; 
		case 6606:
			if (owner.mana.value <= 0)
			{

InvOwnerRecycle โ€‹

public override void _OnProcess(Thing t)

cs
{
	SE.Play("trash");
	Msg.Say("dump", t, Container.Name);
	int a = t.Num * Mathf.Clamp(t.GetPrice() / 100, 1, 100); 
	int a = t.Num * Mathf.Clamp(t.GetPrice(CurrencyType.Money, sell: false, PriceType.Tourism) / 100, 1, 100); 
	a = EClass.rndHalf(a);
	if (t.id == "1084")
	{

Portrait โ€‹

public static bool Exists(string id)

cs
public void SetPerson(Person p)
{
	base.gameObject.SetActive(value: true);
	if (p.hasChara) 
	if (p.hasChara && p.chara.GetIdPortrait() == p.idPortrait) 
	{
		SetChara(p.chara);
	}

TaskClean โ€‹

public override IEnumerable<Status> Run()

cs
				yield return Success();
			}
			yield return DoGoto(dest, 1);
			if (!CanClean(dest) || owner.Dist(dest) > 1) 
			{ 
				yield return Cancel(); 
			} 
			for (int i = 0; i < ((!dest.cell.HasLiquid) ? 1 : 5); i++)
			{
				owner.LookAt(dest);
				owner.renderer.NextFrame();
				yield return KeepRunning();
			}
			if (!CanClean(dest) || owner.Dist(dest) > 1) 
			{ 
				yield return Cancel(); 
			} 
			EClass._map.SetDecal(dest.x, dest.z); 
			EClass._map.SetLiquid(dest.x, dest.z, 0, 0); 
			dest.PlayEffect("vanish"); 
			EClass.pc.Say("clean", owner);
			EClass.pc.PlaySound("clean_floor");
			EClass.pc.ModExp(293, 30); 
			EClass.player.stats.clean++; 
			EClass.pc.stamina.Mod(-1); 
			int num = owner.Tool?.Evalue(770) ?? 0; 
			num = ((num <= 0) ? 1 : (2 + num / 10)); 
			if (num > 1) 
			{ 
				List<Point> list = EClass._map.ListPointsInSquare(dest, num - 1); 
				list.Sort((Point a, Point b) => a.Distance(dest) - b.Distance(dest)); 
				foreach (Point item in list) 
				{ 
					if (owner == null || owner.isDead) 
					{ 
						break; 
					} 
					Clean(item); 
				} 
			} 
			else
			{ 
				Clean(dest); 
			} 
			yield return KeepRunning();
		}
		static void Clean(Point p) 
		{ 
			if (CanClean(p)) 
			{ 
				EClass._map.SetDecal(p.x, p.z); 
				EClass._map.SetLiquid(p.x, p.z, 0, 0); 
				p.PlayEffect("vanish"); 
				EClass.pc.ModExp(293, 30); 
				EClass.player.stats.clean++; 
				EClass.pc.stamina.Mod(-1); 
			} 
		} 
	}

	public static Point GetTarget(Point dest)

public static Point GetTarget(Point dest)

cs
	List<Point> list = new List<Point>();
	foreach (Point item in EClass._map.ListPointsInCircle(dest, 3f, mustBeWalkable: false))
	{
		if (CanClean(item)) 
		if (CanClean(item) && item.IsInBounds) 
		{
			list.Add(item);
		}

TaskDig โ€‹

void Dig(Point p)

cs
		{
			string idRecipe = GetIdRecipe(p);
			int num2 = (p.HasBridge ? p.matBridge.hardness : p.matFloor.hardness);
			if (EClass._zone.IsRegion) 
			TaskDig taskDig = new TaskDig(); 
			taskDig.owner = owner; 
			taskDig.pos = p; 
			taskDig.SetTarget(owner, owner.Tool); 
			if (!taskDig.IsTooHard) 
			{
				Thing map = GetTreasureMap(p); 
				if (map != null || EClass.debug.enable) 
				if (EClass._zone.IsRegion) 
				{
					if (map == null) 
					Thing map = GetTreasureMap(p); 
					if (map != null || EClass.debug.enable) 
					{
						map = ThingGen.Create("map_treasure", -1, EClass.pc.LV); 
						if (map == null) 
						{ 
							map = ThingGen.Create("map_treasure", -1, EClass.pc.LV); 
						} 
						SE.Play("ding_skill"); 
						Msg.Say("digTreasure"); 
						Rand.UseSeed(map.refVal, delegate
						{ 
							Thing thing = ThingGen.CreateTreasure("chest_treasure", map.LV); 
							EClass._zone.AddCard(thing, p); 
							ThingGen.TryLickChest(thing); 
						}); 
						map.Destroy(); 
						EClass.player.willAutoSave = true; 
						return; 
					}
					SE.Play("ding_skill"); 
					Msg.Say("digTreasure"); 
					Rand.UseSeed(map.refVal, delegate
				} 
				switch (mode) 
				{ 
				case Mode.Default: 
					EClass._map.SetBridge(p.x, p.z, 0, 0, 0, 0, 0); 
					break; 
				case Mode.RemoveFloor: 
					EClass._map.MineFloor(p, owner); 
					p.Animate(AnimeID.Dig, animeBlock: true); 
					if (!owner.IsAgent) 
					{
						Thing thing = ThingGen.CreateTreasure("chest_treasure", map.LV); 
						EClass._zone.AddCard(thing, p); 
						ThingGen.TryLickChest(thing); 
					}); 
					map.Destroy(); 
					EClass.player.willAutoSave = true; 
					return; 
						owner.elements.ModExp(230, 20 + num2 / 2); 
					} 
					break; 
				case Mode.Ramp:
					EClass._map.MineFloor(p, owner); 
					break; 
				}
			} 
			switch (mode) 
			{ 
			case Mode.Default: 
				EClass._map.SetBridge(p.x, p.z, 0, 0, 0, 0, 0); 
				break; 
			case Mode.RemoveFloor: 
				EClass._map.MineFloor(p, owner); 
				p.Animate(AnimeID.Dig, animeBlock: true); 
				if (!owner.IsAgent) 
				if (EClass._zone.IsCrime(owner, this)) 
				{
					owner.elements.ModExp(230, 20 + num2 / 2); 
					EClass.player.ModKarma(-1); 
				}
				break; 
			case Mode.Ramp: 
				EClass._map.MineFloor(p, owner); 
				break; 
			} 
			if (EClass._zone.IsCrime(owner, this)) 
			{ 
				EClass.player.ModKarma(-1); 
			} 
			if (EClass.rnd(2) == 0) 
			{ 
				owner.stamina.Mod(-1); 
			} 
			if (owner != null) 
			{ 
				if (owner.IsPC) 
				if (EClass.rnd(2) == 0) 
				{
					EClass.player.recipes.ComeUpWithRecipe(idRecipe, 30); 
					owner.stamina.Mod(-1); 
				}
				if (owner.IsPC && owner.IsAliveInCurrentZone && EClass._zone.IsSkyLevel && !EClass.game.IsSurvival && owner.pos.IsSky) 
				if (owner != null) 
				{
					EClass.pc.FallFromZone(); 
					if (owner.IsPC) 
					{ 
						EClass.player.recipes.ComeUpWithRecipe(idRecipe, 30); 
					} 
					if (owner.IsPC && owner.IsAliveInCurrentZone && EClass._zone.IsSkyLevel && !EClass.game.IsSurvival && owner.pos.IsSky) 
					{ 
						EClass.pc.FallFromZone(); 
					} 
				}
			}
		}

TraitBrewery โ€‹

public override bool OnChildDecay(Card c, bool firstDecay)

cs
		{
			return true;
		}
		if (!c.IsFood && !(c.id == "508") && !(c.id == "778") && !(c.id == "_milk")) 
		if (!c.IsFood && !(c.trait is TraitDrinkMilk)) 
		{
			return true;
		}

public override bool OnChildDecay(Card c, bool firstDecay)

cs
		{
			return true;
		}
		if (c.category.IsChildOf("filling")) 
		{ 
			return true; 
		} 
		break;
	default:
		if (!firstDecay)

+TraitFoodFilling โ€‹

File Created
cs
public class TraitFoodFilling : TraitFood
{
}

TraitTrolley โ€‹

public virtual string GetIdSound()

cs
	case "ride_boat":
	case "ride_boat2":
		return "ride_boat";
	case "wheel_chair":
		if (owner.idSkin != 1) 
		{ 
			return "ride_trolley"; 
		} 
		return "ride_bike"; 
	case "play_ride_big":
		if (owner.idSkin != 0)
		{

Zone โ€‹

public Zone FindOrCreateLevel(int destLv, string subId = "")

cs

	public static (string zoneType, string zoneId, int zoneLv) ParseZoneFullName(string zoneFullName)
	{
		string item = ""; 
		string item2 = ""; 
		int item3 = 0; 
		int item = 0; 
		zoneFullName = zoneFullName.Replace('/', '@');
		if (EClass.game.spatials.Find((Zone z) => z.ZoneFullName == zoneFullName) != null) 
		{ 
			return (zoneType: item, zoneId: item2, zoneLv: item3); 
		} 
		int num = zoneFullName.LastIndexOf('@');
		string text; 
		if (num > 0 && num < zoneFullName.Length - 1)
		{
			item = zoneFullName[..num]; 
			item3 = zoneFullName[(num + 1)..].ToInt(); 
			text = zoneFullName[..num]; 
			item = zoneFullName[(num + 1)..].ToInt(); 
		}
		else
		{
			item = zoneFullName.Replace("@", ""); 
			text = zoneFullName.Replace("@", ""); 
		}
		item2 = item.Replace("Zone_", ""); 
		item = "Zone_" + item2; 
		return (zoneType: item, zoneId: item2, zoneLv: item3); 
		string text2 = text.Replace("Zone_", ""); 
		text = "Zone_" + text2; 
		return (zoneType: text, zoneId: text2, zoneLv: item); 
	}

	public int Evalue(int ele)