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