EA 23.299 Nightly โ
April 27, 2026
18 files modified. 1 new file created.
Important Changes โ
Possible breaking changes. Click the filename to view the chunk.
Chara (1) โ
public Point lastPos = new Point();
public new Point lastPos = new Point(); BiomeProfile โ
protected string _GetThing(string id)
{
return "-";
}
SourceThing.Row row = EClass.editorSources.things.rows.First((SourceThing.Row a) => a.id == id);
SourceThing.Row row = EClass.editorSources.things.rows.FirstOrDefault((SourceThing.Row a) => a.id == id);
if (row != null)
{
return row.id + "-(" + row.name_JP + ")";protected IEnumerable<string> ThingRows()
protected string _GetObj(int id)
{
SourceObj.Row row = EClass.editorSources.objs.rows.First((SourceObj.Row a) => a.id == id);
SourceObj.Row row = EClass.editorSources.objs.rows.FirstOrDefault((SourceObj.Row a) => a.id == id);
if (row != null)
{
return row.id + "-" + row.alias + "(" + row.name_JP + ")";protected IEnumerable<string> ObjRows()
protected string _GetFloor(int id)
{
SourceFloor.Row row = EClass.editorSources.floors.rows.First((SourceFloor.Row a) => a.id == id);
SourceFloor.Row row = EClass.editorSources.floors.rows.FirstOrDefault((SourceFloor.Row a) => a.id == id);
if (row != null)
{
return row.id + "-" + row.alias + "(" + row.name_JP + ")";protected IEnumerable<string> FloorRows()
protected string _GetBlock(int id)
{
SourceBlock.Row row = EClass.editorSources.blocks.rows.First((SourceBlock.Row a) => a.id == id);
SourceBlock.Row row = EClass.editorSources.blocks.rows.FirstOrDefault((SourceBlock.Row a) => a.id == id);
if (row != null)
{
return row.id + "-" + row.alias + "(" + row.name_JP + ")";protected string _GetMat(int id)
{
id = 0;
}
SourceMaterial.Row row = EClass.editorSources.materials.rows.First((SourceMaterial.Row a) => a.id == id);
SourceMaterial.Row row = EClass.editorSources.materials.rows.FirstOrDefault((SourceMaterial.Row a) => a.id == id);
if (row != null)
{
return row.id + "-" + row.alias + "(" + row.name_JP + ")";protected string _GetSpawnList(string id)
{
return "-";
}
SourceSpawnList.Row row = EClass.editorSources.spawnLists.rows.First((SourceSpawnList.Row a) => a.id == id);
SourceSpawnList.Row row = EClass.editorSources.spawnLists.rows.FirstOrDefault((SourceSpawnList.Row a) => a.id == id);
if (row != null)
{
return row.id; {
public int idObj;
public override bool IsSpawnOnBlock => EClass.sources.objs.rows[idObj].tileType.IsBlockMount;
public override bool IsSpawnOnBlock => EClass.sources.objs.map[idObj].tileType.IsBlockMount;
public override bool IsSpawnOnWater => EClass.sources.objs.rows[idObj].tileType.CanSpawnOnWater;
public override bool IsSpawnOnWater => EClass.sources.objs.map[idObj].tileType.CanSpawnOnWater;
public string obj
{Card โ
public Point pos = new Point();
public Point lastPos = new Point();
public CardRenderer renderer;
public CardRow hat; }
}
public SourceMaterial.Row DyeMat => EClass.sources.materials.rows[c_dyeMat];
public SourceMaterial.Row DyeMat => EClass.sources.materials.map.TryGetValue(c_dyeMat) ?? EClass.sources.materials.map[1];
public int invX
{public void Create(string _id, int _idMat = -1, int genLv = -1)
bool flag = (bp != null && bp.fixedMat) || sourceCard.quality == 4 || sourceCard.tierGroup.IsEmpty();
if (_idMat != -1)
{
_material = EClass.sources.materials.rows[_idMat];
_material = EClass.sources.materials.map.TryGetValue(_idMat) ?? EClass.sources.materials.map[1];
}
else if (!flag)
{public void DamageHP(long dmg, int ele, int eleP = 100, AttackSource attackSourc
{
int num = chara4.Evalue(1241);
int num2 = chara4.Evalue(438);
if ((num != 0 || num2 != 0) && !chara4.IsDisabled && !chara4.isRestrained && (!IsPCFactionOrMinion || chara4.IsPCFactionOrMinion) && chara4.Dist(this) <= Mathf.Max(num, (num2 > 0) ? 1 : 0) && (num != 0 || num2 <= 0 || hp * 100 / MaxHP <= chara4.hp * 100 / chara4.MaxHP))
if ((num != 0 || num2 != 0) && !chara4.IsDisabled && !chara4.isRestrained && (!IsPCFactionOrMinion || chara4.IsPCFactionOrMinion) && (IsPCFactionOrMinion || !chara4.IsPCFactionOrMinion) && chara4.Dist(this) <= Mathf.Max(num, (num2 > 0) ? 1 : 0) && (num != 0 || num2 <= 0 || hp * 100 / MaxHP <= chara4.hp * 100 / chara4.MaxHP))
{
Say((num2 == 0) ? "wall_flesh" : "wall_knightly", chara4, this);
chara4.DamageHP(dmg, ele, eleP, attackSource, origin, showEffect, weapon, Chara);
chara4.DamageHP(dmg * (100 + ((num2 <= 0) ? 10 : 0)) / 100, ele, eleP, attackSource, origin, showEffect, weapon, Chara);
return;
}
}public void DamageHP(long dmg, int ele, int eleP = 100, AttackSource attackSourc
Chara.AddCondition<ConFractured>((int)Mathf.Max(10f, 30f - Mathf.Sqrt(Evalue(436))));
hp = Mathf.Min(half * (int)Mathf.Sqrt(Evalue(436) * 2) / 100, MaxHP / 3);
});
goto IL_10b3;
goto IL_10dd;
}
}
if (zoneInstanceBout != null && (bool)LayerDrama.Instance)public void DamageHP(long dmg, int ele, int eleP = 100, AttackSource attackSourc
if (EClass.player.invlunerable)
{
EvadeDeath(null);
goto IL_10b3;
goto IL_10dd;
}
}
if (Evalue(1220) > 0 && Chara.stamina.value >= (IsPC ? (Chara.stamina.max / 2) : (Chara.stamina.max / 3 * 2)))public void DamageHP(long dmg, int ele, int eleP = 100, AttackSource attackSourc
}
}
}
goto IL_10b3;
IL_10b3:
goto IL_10dd;
IL_10dd:
if (trait.CanBeAttacked)
{
renderer.PlayAnime(AnimeID.HitObj);public MoveResult TryMoveFrom(Point p)
point.Set(pos);
point.x -= num;
point.z -= num2;
if (point.IsValid && !point.HasChara)
if (point.IsValid && !point.HasChara && TryMove(point, allowDestroyPath: false) == MoveResult.Success)
{
return MoveResult.Success;
}
for (int i = -1; i < 2; i++)
{
return TryMove(point, allowDestroyPath: false);
for (int j = -1; j < 2; j++)
{
if (EClass.rnd(2) != 0)
{
point.x = pos.x + j;
point.z = pos.z + i;
if (!point.Equals(lastPos) && point.IsValid && !point.HasChara && TryMove(point, allowDestroyPath: false) == MoveResult.Success)
{
return MoveResult.Success;
}
}
}
}
return MoveResult.Fail;
}public ref Color GetRandomColor()
}
Rand.UseSeed(num, delegate
{
_randColor = EClass.sources.materials.rows[EClass.rnd(90)].matColor;
_randColor = EClass.sources.materials.rows.RandomItem().matColor;
});
return ref _randColor;
}Chara โ
public class Chara : Card, IPathfindWalker
public Chara master;
public Point lastPos = new Point();
public new Point lastPos = new Point();
public PathProgress path = new PathProgress();public void TryPush(Point point)
}
list.Copy().ForeachReverse(delegate(Chara c)
{
if (!c.ai.IsMoveAI && !c.IsPC && c.trait.CanBePushed && c != this && !c.noMove && (!EClass._zone.IsRegion || c.IsPCFactionOrMinion))
if ((trait is TraitSnitch && c.IsPCFactionOrMinion) || (!c.ai.IsMoveAI && !c.IsPC && c.trait.CanBePushed && c != this && !c.noMove && (!EClass._zone.IsRegion || c.IsPCFactionOrMinion)))
{
List<Point> list2 = new List<Point>();
for (int i = point.x - 1; i <= point.x + 1; i++)ConTransmuteHuman โ
public override void OnBeforeStart()
{
if (chara == null)
{
List<Chara> list = owner.pos.ListCharasInRadius(owner, 5, delegate(Chara c)
{
if (!c.IsMultisize && c.IsHumanSpeak)
{
CardRenderer renderer = c.renderer;
if (renderer != null && !renderer.hasActor)
{
return !c.HasElement(1427);
}
}
return false;
});
List<Thing> list = owner.things.List((Thing t) => t.trait is TraitFigure { source: not null } traitFigure && !traitFigure.source.multisize, onlyAccessible: true);
if (list.Count > 0)
{
chara = list.RandomItem().Duplicate();
chara = CharaGen.Create((list.RandomItem().trait as TraitFigure).source.id);
}
else
{
chara = CharaGen.CreateFromFilter("c_guest");
List<Chara> list2 = owner.pos.ListCharasInRadius(owner, 5, delegate(Chara c)
{
if (!c.IsMultisize && c.IsHumanSpeak)
{
CardRenderer renderer = c.renderer;
if (renderer != null && !renderer.hasActor)
{
return !c.HasElement(1427);
}
}
return false;
});
if (list2.Count > 0)
{
chara = list2.RandomItem().Duplicate();
}
else
{
chara = CharaGen.CreateFromFilter("c_guest");
}
}
}
base.OnBeforeStart();GrowSystem โ
public bool CanGrow(VirtualDate date)
{
return false;
}
if (EClass._zone.IsUnderwater)
if (GrowUndersea)
{
if (!GrowUndersea)
if (EClass._zone.IsUnderwater || cell.sourceSurface.tileType.IsDeepWater)
{
return false;
return true;
}
}
else if (cell.sourceFloor.tileType.IsDeepWater)
else if (EClass._zone.IsUnderwater)
{
if (!GrowUndersea)
{
return false;
}
return false;
}
else if (!GrowOnLand)
if (!GrowOnLand)
{
return false;
}MATERIAL โ
public class MATERIAL : EClass
public const int MaxTier = 7;
public static SourceMaterial.Row sourceSnow = EClass.sources.materials.rows[48];
public static SourceMaterial.Row sourceSnow = EClass.sources.materials.map[48];
public static SourceMaterial.Row sourceIce = EClass.sources.materials.rows[61];
public static SourceMaterial.Row sourceIce = EClass.sources.materials.map[61];
public static SourceMaterial.Row sourceGold = EClass.sources.materials.rows[12];
public static SourceMaterial.Row sourceGold = EClass.sources.materials.map[12];
public static SourceMaterial.Row sourceOak = EClass.sources.materials.rows[1];
public static SourceMaterial.Row sourceOak = EClass.sources.materials.map[1];
public static SourceMaterial.Row sourceWaterSea => EClass.sources.materials.rows[88];
public static SourceMaterial.Row sourceWaterSea = EClass.sources.materials.map[88];
public static SourceMaterial.Row FromElement(int id)
{Map โ
public void _AddCard(int x, int z, Card t, bool onAddToZone)
{
_RemoveCard(t);
}
t.lastPos.Set(t.pos);
t.pos.Set(x, z);
if (t.IsMultisize)
{public void TryShatter(Point pos, int ele, int power)
List<SourceThing.Row> list3 = new List<SourceThing.Row>();
foreach (RecipeSource item4 in RecipeManager.list)
{
if (!(item4.row is SourceThing.Row { isOrigin: false } row) || row.components.IsEmpty() || (row.components.Length >= 3 && !row.components[2].StartsWith('+')) || !row.Category.IsChildOf("meal"))
if (!(item4.row is SourceThing.Row { isOrigin: false } row) || row.components.IsEmpty() || (row.components.Length >= 3 && !row.components[2].StartsWith('+')) || !row.Category.IsChildOf("meal") || (row.HasTag(CTAG.dish_fail) && power > EClass.rnd(500)))
{
continue;
}ModManager โ
public void InitPackagesMeta()
{
try
{
package.Init();
mappedPackages[package.id] = package as ModPackage;
if (package.Init())
{
mappedPackages[package.id] = package as ModPackage;
}
_loading?.Log(package.ToString());
}
catch (Exception ex)Recipe โ
public virtual SourceMaterial.Row GetMainMaterial()
{
num = 3;
}
return EClass.sources.materials.rows[num];
return EClass.sources.materials.map.TryGetValue(num) ?? EClass.sources.materials.map[3];
}
public virtual SourceMaterial.Row GetColorMaterial()
{
if (idMat != -1)
{
return EClass.sources.materials.rows[idMat];
return EClass.sources.materials.map.TryGetValue(idMat) ?? EClass.sources.materials.map[3];
}
if (UseStock)
{public virtual SourceMaterial.Row GetColorMaterial()
}
return thing.DyeMat;
}
return EClass.sources.materials.rows[3];
return EClass.sources.materials.map[3];
}
int num = ((ingredients.Count > 0) ? ingredients[source.colorIng].mat : 3);
if (num == -1)
{
num = 3;
}
return EClass.sources.materials.rows[num];
return EClass.sources.materials.map.TryGetValue(num) ?? EClass.sources.materials.map[3];
}
public virtual void BuildIngredientList()public virtual void Build(Chara chara, Card t, Point pos, int mat, int dir, int
{
mat = 2;
}
EClass.pc.PlaySound(EClass.sources.materials.rows[mat].GetSoundImpact());
SourceMaterial.Row row = EClass.sources.materials.map.TryGetValue(mat) ?? EClass.sources.materials.map[2];
EClass.pc.PlaySound(row.GetSoundImpact());
pos.cell.isModified = true;
switch (source.type)
{public virtual void Build(Chara chara, Card t, Point pos, int mat, int dir, int
int ramp = tileRow.id;
if (ramp == 3)
{
ramp = EClass.sources.materials.rows[mat].ramp;
ramp = row.ramp;
}
if (EClass.scene.actionMode.IsRoofEditMode())
{RecipeCard โ
public override void Build(Chara chara, Card t, Point pos, int mat, int dir, int
{
mat = 2;
}
EClass.pc.PlaySound(EClass.sources.materials.rows[mat].GetSoundImpact());
SourceMaterial.Row row = EClass.sources.materials.map.TryGetValue(mat) ?? EClass.sources.materials.map[2];
EClass.pc.PlaySound(row.GetSoundImpact());
t.SetDir(dir);
t.idSkin = idSkin;
EClass._zone.AddCard(t, pos);Region โ
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using UnityEngine; }
return list;
}
[OnDeserialized]
private void _OnDeserialized(StreamingContext context)
{
for (int num = children.Count - 1; num >= 0; num--)
{
if (!EClass.sources.zones.map.ContainsKey(children[num].id))
{
RemoveChild(children[num]);
}
}
}
}SerializedCards โ
public void Restore(Map map, Map orgMap, bool addToZone, PartialMap partial = nu
}
if (version >= 2 && card4.idDyeMat != -1)
{
card2.Dye(EClass.sources.materials.rows.TryGet(card4.idDyeMat, 1));
card2.Dye(EClass.sources.materials.map.TryGetValue(card4.idDyeMat) ?? EClass.sources.materials.map[1]);
}
card2.mapObj = card4.obj;
if (card2.mapObj?.TryGetValue(2) != null)SpriteData โ
catch (Exception exception)
{
Debug.LogException(exception);
Debug.LogError("#sprite failed to init '" + id + "' at " + path);
Debug.LogError("#sprite failed " + id + "/" + path);
}
}SpriteReplacer โ
public void BuildSuffixData(string id, Dictionary<string, string> dictTexItems)
};
spriteData.Init();
suffixes[text4] = spriteData;
Debug.Log("#sprite replacer init '" + text4 + "' at " + path.ShortPath());
Debug.Log("#sprite replacer " + text4.IsEmpty("<base>") + "/" + path.ShortPath());
}
}
}Trait โ
case ShopType.GeneralExotic:
return FromFilter("shop_generalExotic");
case ShopType.VMachine:
if (EClass.rnd(10) == 0)
{
return Create("wear_swim");
}
if (EClass.rnd(10) == 0)
{
return Create("panty");TraitBoat โ
public SourceMaterial.Row GetWaterMat()
mat = p.matFloor.id;
}
});
return EClass.sources.materials.rows[mat];
return EClass.sources.materials.map.TryGetValue(mat) ?? EClass.sources.materials.map[67];
}
}TraitDrawingPaperM โ
public class TraitDrawingPaperM : TraitDrawingPaper
public override int Height => 64;
public override int SizeGrid => 15;
public override int SizeGrid => 12;
}+TraitSnitch โ
File Created
public class TraitSnitch : TraitUniqueMonster
{
}ZonePreEnterBout โ
public override void Execute()
for (int i = 0; i < EClass.pc.party.members.Count - 1; i++)
{
Chara chara = CharaGen.CreateFromFilter("c_neutral", target.LV + 10);
Debug.Log(chara);
chara.ChangeRarity(Rarity.Superior);
if (chara.LV < target.LV)
if (!(chara.trait is TraitMerchantTravel))
{
chara.SetLv(target.LV);
chara.ChangeRarity(Rarity.Superior);
if (chara.LV < target.LV)
{
chara.SetLv(target.LV);
}
EClass._zone.AddCard(chara, target.pos.GetNearestPoint(allowBlock: false, allowChara: false) ?? target.pos);
list.Add(chara);
}
EClass._zone.AddCard(chara, target.pos.GetNearestPoint(allowBlock: false, allowChara: false) ?? target.pos);
list.Add(chara);
}
Debug.Log(list.Count);
foreach (Chara item in list)