EA 23.351 Nightly โ
October 2, 2026
13 files modified. 2 new files created.
Important Changes โ
None.
AI_PlayMusic โ
public override IEnumerable<Status> Run()
{
bool isMinion = item2.IsMinion;
p.cancelWhenDamaged = false;
if (num < item2.LV && EClass.rnd(2) == 0)
if (num < item2.LV && EClass.rnd(2 + (item2.LV - num) / 50) == 0)
{
reacted.Add(item2);
if (!isMinion)public void ThrowReward(Chara c, bool punish)
num /= 5;
}
}
int num2 = Mathf.Max((owner.Evalue(241) + tool?.Evalue(241)).Value * (100 + toolLv) / 100, 1) * 1000;
if (num > num2)
{
num = num2;
}
if (num < 1)
{
num = 1;Card โ
public virtual int GetPrice(CurrencyType currency = CurrencyType.Money, bool selโฆ)
case "1282":
return 1;
case "1386":
return 5;
return 13;
case "book_black":
return 100;
case "scroll_random":
if (refVal == 8288)
{
return 3;
}
break;
return 1;
case "spellbook":
if (refVal == 9155)
{
return 1;
}
break;
_ = refVal;
_ = 9155;
return 1;
case "rp_random":
return 6;
}
break;
case CurrencyType.Plat:Chara โ
public override MoveResult _Move(Point newPoint, MoveType type = MoveType.Walk)
{
AddExp(Mathf.Clamp((int)Mathf.Sqrt(base.ExpToNext / 100), 1, 1000));
}
if (pos.IsBlocked && EClass.rnd(IsPC ? 2 : 20) == 0)
if (pos.IsBlocked && EClass.rnd(IsPC ? 1 : 20) == 0)
{
stamina.Mod(-1);
}CharaBody โ
public int GetWeight(bool armorOnly = false)
int num = 0;
foreach (BodySlot slot in slots)
{
if (slot.thing != null && (!armorOnly || (slot.elementId != 44 && slot.elementId != 45)))
if (slot.thing != null && (!armorOnly || (slot.elementId != 46 && slot.elementId != 44 && slot.elementId != 45)))
{
num += slot.thing.ChildrenAndSelfWeight;
}CoreDebug โ
{
foreach (SourceElement.Row row in EClass.sources.elements.rows)
{
if (row.category == "ability" && row.aliasRef != "mold" && !EClass.pc.HasElement(row.id) && (row.aliasRef.IsEmpty() || row.id <= 10000 || EClass.sources.elements.alias[row.aliasRef].tag.Contains(row.alias.Split('_')[0])))
if (row.category == "ability" && row.aliasRef != "mold" && !EClass.pc.HasElement(row.id))
{
if (!row.aliasRef.IsEmpty() && row.id > 10000)
{
_ = EClass.sources.elements.alias[row.aliasRef];
}
EClass.pc.elements.ModBase(row.id, lv).vPotential = 30;
}
}QuestMusic โ
public class QuestMusic : QuestInstance
[JsonProperty]
public int sumMoney;
[JsonProperty]
public int partyLv;
public override DifficultyType difficultyType => DifficultyType.Music;
public override string IdZone => "instance_music";public class QuestMusic : QuestInstance
public override int KarmaOnFail => 0;
public override bool FameContent => partyLv > 0;
public override int DangerLv
{
get
{
if (partyLv <= 0)
{
return 1;
}
return partyLv * 50;
}
}
public override ZoneEventQuest CreateEvent()
{
return new ZoneEventMusic();public override int GetRewardPlat(int money)
public override void OnInit()
{
destScore = difficulty * 150;
if (EClass.rnd(100) < EClass.rnd(EClass.pc.Evalue(241)))
{
partyLv = 1 + EClass.rnd(EClass.pc.Evalue(241) / 10);
}
destScore = difficulty * 150 * (100 + partyLv * 50) / 100;
destScore += EClass.rnd(destScore / 5);
}
}RenderRow โ
public class RenderRow : SourceData.BaseRow, IRenderSource
[NonSerialized]
public bool useRandomColor;
[NonSerialized]
public bool useDyeColor;
[NonSerialized]
public SourceMaterial.Row DefaultMaterial; this.renderData.Init();
}
SetTiles();
string text2 = colorType;
if (!(text2 == "alt"))
{
if (text2 == "random")
{
useRandomColor = true;
}
}
else
switch (colorType.Split('/').TryGet(0))
{
case "alt":
useAltColor = true;
break;
case "random":
useRandomColor = true;
break;
case "dye":
useDyeColor = true;
break;
}
Dictionary<string, SourceMaterial.Row> alias = sources.materials.alias;
if (!alias.TryGetValue(defMat.IsEmpty("granite"), out var defaultMaterial))Thing โ
public override void OnCreate(int genLv)
{
base.idSkin = EClass.rnd(source.skins.Length + 1);
}
if (source.useDyeColor)
{
Dye(source.colorType.Split('/')[1]);
}
}
public override void ApplyMaterialElements(bool remove)Trait โ
public virtual void OnBarter(bool reroll = false)
owner.c_dateStockExpire = EClass.world.date.GetRaw(24 * RestockDay);
owner.isRestocking = true;
t.things.DestroyAll((Thing _t) => _t.GetInt(101) != 0);
foreach (Thing thing9 in t.things)
foreach (Thing thing10 in t.things)
{
thing9.invX = -1;
thing10.invX = -1;
}
switch (ShopType)
{public virtual void OnBarter(bool reroll = false)
break;
}
int num11 = 0;
foreach (Thing thing10 in c_copyContainer.things)
foreach (Thing thing11 in c_copyContainer.things)
{
if (!owner.trait.CanCopy(thing10))
if (!owner.trait.CanCopy(thing11))
{
continue;
}
Thing thing6 = thing10.Duplicate(1);
thing6.isStolen = false;
thing6.isCopy = true;
thing6.c_priceFix = 0;
foreach (Element item in thing6.elements.dict.Values.Where((Element e) => e.HasTag("noInherit")).ToList())
Thing thing7 = thing11.Duplicate(1);
thing7.isStolen = false;
thing7.isCopy = true;
thing7.c_priceFix = 0;
foreach (Element item in thing7.elements.dict.Values.Where((Element e) => e.HasTag("noInherit")).ToList())
{
thing6.elements.Remove(item.id);
thing7.elements.Remove(item.id);
}
int num12 = 1;
switch (owner.trait.CopyShop)
{
case CopyShopType.Item:
{
num12 = (1000 + owner.c_invest * 100) / (thing6.GetPrice(CurrencyType.Money, sell: false, PriceType.CopyShop) + 50);
num12 = (1000 + owner.c_invest * 100) / (thing7.GetPrice(CurrencyType.Money, sell: false, PriceType.CopyShop) + 50);
int[] array = new int[3] { 704, 703, 702 };
foreach (int ele in array)
{
if (thing6.HasElement(ele))
if (thing7.HasElement(ele))
{
num12 = 1;
}public virtual void OnBarter(bool reroll = false)
break;
}
case CopyShopType.Spellbook:
thing6.c_charges = thing10.c_charges;
thing7.c_charges = thing11.c_charges;
break;
}
if (num12 > 1 && thing6.trait.CanStack)
if (num12 > 1 && thing7.trait.CanStack)
{
thing6.SetNum(num12);
thing7.SetNum(num12);
}
AddThing(thing6);
AddThing(thing7);
num11++;
if (num11 > owner.trait.NumCopyItem)
{public virtual void OnBarter(bool reroll = false)
Add("water", 1, 0);
if (EClass.rndSeed(EClass.debug.enable ? 1 : 3, seed) == 0)
{
Thing thing5 = Add("scrubber", 1, 0);
thing5.rarity = Rarity.Legendary;
thing5.elements.SetBase(770, 1 + EClass.rndSeed(EClass.rndSeed(20, seed) + 1, seed));
Thing thing6 = Add("scrubber", 1, 0);
thing6.rarity = Rarity.Legendary;
thing6.elements.SetBase(770, 1 + EClass.rndSeed(EClass.rndSeed(20, seed) + 1, seed));
}
if (EClass.rndSeed(EClass.debug.enable ? 1 : 5, seed) == 0)
{public virtual void OnBarter(bool reroll = false)
owner.Chara.ModExp(287, 1000);
}
}
Thing thing3 = CraftUtil.MakeLoveLunch(owner.Chara);
thing3.elements.SetBase(1229, 1);
AddThing(thing3);
Thing thing4 = CraftUtil.MakeLoveLunch(owner.Chara);
thing4.elements.SetBase(1229, 1);
AddThing(thing4);
break;
}
for (int num9 = 0; num9 < 10; num9++)
{
Thing thing4 = ThingGen.Create(EClass._zone.IsFestival ? "1123" : ((EClass.rnd(3) == 0) ? "1169" : "1160"));
thing4.DyeRandom();
AddThing(thing4);
Thing thing5 = ThingGen.Create(EClass._zone.IsFestival ? "1123" : ((EClass.rnd(3) == 0) ? "1169" : "1160"));
thing5.DyeRandom();
AddThing(thing5);
}
if (EClass._zone is Zone_Exile)
{public virtual void OnBarter(bool reroll = false)
AddThing(ThingGen.CreatePerfume(9503, 5));
for (int num6 = 0; num6 < 5; num6++)
{
Thing thing2 = ThingGen.CreateFromCategory("seasoning").SetNum(10);
thing2.elements.SetBase(2, 40);
thing2.c_priceFix = 1000;
AddThing(thing2);
Thing thing3 = ThingGen.CreateFromCategory("seasoning").SetNum(10);
thing3.elements.SetBase(2, 40);
thing3.c_priceFix = 1000;
AddThing(thing3);
}
break;
}
case ShopType.Sorin:
{
Add("1282", 1, 0).SetNum(5);
AddThing(ThingGen.CreateSpellbook(9155, 1, 3));
AddThing(ThingGen.CreateScroll(8288).SetNum(5));
AddThing(ThingGen.CreateSpellbook(8406, 1, 7));
AddThing(ThingGen.CreateScroll(8281, 6));
AddThing(ThingGen.CreateScroll(8280, 7));
AddThing(ThingGen.CreateScroll(8288, 5));
NoRestock(ThingGen.CreateRecipe("1264"));
NoRestock(ThingGen.CreateRecipe("1300"));
NoRestock(ThingGen.CreateRecipe("1386"));
Thing thing2 = ThingGen.Create("book_black");
thing2.c_idRefName = "sorin";
NoRestock(thing2);
Add("1386", 1, 0);
break;
}
case ShopType.Medal:
NoRestockId("hammer_garokk", 3, 0);
NoRestockId("sword_dragon", 1, 0);public virtual void OnBarter(bool reroll = false)
{
TreasureType treasureType = ((EClass.rnd(10) == 0) ? TreasureType.BossNefia : ((EClass.rnd(10) == 0) ? TreasureType.Map : TreasureType.RandomChest));
int num17 = EClass.rnd(EClass.rnd(ShopLv + (EClass.debug.enable ? 200 : 50)) + 1) + 1;
Thing thing7 = ThingGen.Create(treasureType switch
Thing thing8 = ThingGen.Create(treasureType switch
{
TreasureType.Map => "chest_treasure",
TreasureType.BossNefia => "chest_boss",
_ => "chest3",
});
thing7.c_lockedHard = true;
thing7.c_lockLv = num17;
thing7.c_priceAdd = 2000 + num17 * 250 * ((treasureType == TreasureType.RandomChest) ? 1 : 5);
thing7.c_revealLock = true;
ThingGen.CreateTreasureContent(thing7, num17, treasureType, clearContent: true);
AddThing(thing7);
thing8.c_lockedHard = true;
thing8.c_lockLv = num17;
thing8.c_priceAdd = 2000 + num17 * 250 * ((treasureType == TreasureType.RandomChest) ? 1 : 5);
thing8.c_revealLock = true;
ThingGen.CreateTreasureContent(thing8, num17, treasureType, clearContent: true);
AddThing(thing8);
}
}
break;public virtual void OnBarter(bool reroll = false)
}
AddThing(ThingGen.CreateScroll(8780, EClass.rndHalf(5)));
}
foreach (Thing thing11 in t.things)
foreach (Thing thing12 in t.things)
{
thing11.c_idBacker = 0;
thing12.c_idBacker = 0;
if (ShopType != ShopType.Copy)
{
thing11.TryMakeRandomItem(ShopLv);
if (thing11.Num == 1)
thing12.TryMakeRandomItem(ShopLv);
if (thing12.Num == 1)
{
thing11.SetNum(thing11.trait.DefaultStock);
thing12.SetNum(thing12.trait.DefaultStock);
}
if (thing11.trait is TraitFoodMeal)
if (thing12.trait is TraitFoodMeal)
{
CraftUtil.MakeDish(thing11, ShopLv, owner.Chara);
CraftUtil.MakeDish(thing12, ShopLv, owner.Chara);
}
if (thing11.IsFood && owner.id == "rodwyn")
if (thing12.IsFood && owner.id == "rodwyn")
{
SourceElement.Row row = EClass.sources.elements.rows.Where((SourceElement.Row e) => !e.foodEffect.IsEmpty() && !e.tag.Contains("noRodwyn") && e.category != "feat" && e.chance > 0).RandomItem();
thing11.elements.SetBase(row.id, 10 + EClass.rnd(10));
thing12.elements.SetBase(row.id, 10 + EClass.rnd(10));
}
}
if (CurrencyType == CurrencyType.Casino_coin)
{
thing11.noSell = true;
thing12.noSell = true;
}
if (Guild.Thief.IsCurrentZone)
{
thing11.isStolen = true;
thing12.isStolen = true;
}
if (!(thing11.trait is TraitErohon))
if (!(thing12.trait is TraitErohon))
{
thing11.c_IDTState = 0;
thing12.c_IDTState = 0;
}
if (CurrencyType == CurrencyType.Money && (thing11.category.IsChildOf("meal") || thing11.category.IsChildOf("preserved")) && thing11.id != "ration" && !thing11.IsUnique)
if (CurrencyType == CurrencyType.Money && (thing12.category.IsChildOf("meal") || thing12.category.IsChildOf("preserved")) && thing12.id != "ration" && !thing12.IsUnique)
{
thing11.c_priceFix = -70;
thing12.c_priceFix = -70;
}
if (ShopType == ShopType.TravelMerchant)
{
thing11.c_priceFix = 200;
thing12.c_priceFix = 200;
}
if (thing11.trait is TraitErohon)
if (thing12.trait is TraitErohon)
{
thing11.c_IDTState = 5;
thing12.c_IDTState = 5;
}
if (thing11.IsContainer && !thing11.c_revealLock)
if (thing12.IsContainer && !thing12.c_revealLock)
{
thing11.RemoveThings();
thing12.RemoveThings();
t.c_lockLv = 0;
}
}public virtual void OnBarter(bool reroll = false)
Thing Add(string id2, int a, int idSkin)
{
CardBlueprint.SetNormalRarity();
Thing thing8 = ThingGen.Create(id2, -1, ShopLv).SetNum(a);
thing8.idSkin = ((idSkin == -1) ? EClass.rnd(thing8.source.skins.Length + 1) : idSkin);
return t.AddThing(thing8);
Thing thing9 = ThingGen.Create(id2, -1, ShopLv).SetNum(a);
thing9.idSkin = ((idSkin == -1) ? EClass.rnd(thing9.source.skins.Length + 1) : idSkin);
return t.AddThing(thing9);
}
void AddAdvWeek(int i)
{
Thing thing8 = ThingGen.CreateRedBook("advweek_" + i);
thing8.c_priceFix = -90;
AddThing(thing8);
Thing thing9 = ThingGen.CreateRedBook("advweek_" + i);
thing9.c_priceFix = -90;
AddThing(thing9);
}
void AddCassette(int idCas, string idQuest, int phase)
{ }
void NoRestockId(string _id, int num24, int idSkin)
{
Thing thing8 = ThingGen.Create(_id).SetNum(num24);
thing8.idSkin = idSkin;
NoRestock(thing8);
Thing thing9 = ThingGen.Create(_id).SetNum(num24);
thing9.idSkin = idSkin;
NoRestock(thing9);
}
}TraitBaseSpellbook โ
Spell,
RandomSpell,
Ero,
Dojin
Dojin,
BlackNote
}
public static ElementSelecter selecter = new ElementSelecterpublic override void OnCreate(int lv)
public override bool TryProgress(AIProgress p)
{
Chara c = p.owner;
if (BookType == Type.Ancient && owner.isOn)
Type bookType = BookType;
if ((bookType == Type.Ancient || bookType == Type.BlackNote) && owner.isOn)
{
if (c.IsPC)
{public override void OnRead(Chara c)
}
switch (BookType)
{
case Type.BlackNote:
c.Say("book_decode", c, name);
c.Say("dingExp", c);
c.feat += (c.IsPC ? 1 : 4);
c.PlaySound("godbless");
c.PlayEffect("aura_heaven");
(owner.c_idRefName.IsEmpty() ? EClass.pc : EClass._map.FindChara(owner.c_idRefName))?.Die();
break;
case Type.Ancient:
c.Say("book_decode", c, name);
if (!c.IsPC)public override void SetName(ref string s)
break;
case Type.Ero:
case Type.Dojin:
case Type.BlackNote:
{
string c_idRefName = owner.c_idRefName;
if (!c_idRefName.IsEmpty())public override void SetName(ref string s)
string @ref = ((BookType == Type.Dojin) ? EClass.game.religions.dictAll.TryGetValue(c_idRefName, EClass.game.religions.Eyth).Name : EClass.sources.charas.map.TryGetValue(c_idRefName, "putty").GetName());
s = "_'s".lang(@ref, s);
}
if (BookType == Type.BlackNote && owner.isOn)
{
s = "_deciphered".lang(s);
}
break;
}
}+TraitBlackNote โ
File Created
public class TraitBlackNote : TraitBaseSpellbook
{
public override Type BookType => Type.BlackNote;
public override bool CanStack => owner.isOn;
public override bool HasCharges => false;
public override int eleParent => 74;
public override int Difficulty => 10000;
public override int GetActDuration(Chara c)
{
return 100;
}
}+TraitDeathNote โ
File Created
public class TraitDeathNote : TraitBlackNote
{
}TraitWhipEgg โ
public override void OnCreate(int lv)
public override void TrySetHeldAct(ActPlan p)
{
if (EClass.game.principal.disableUsermapBenefit && EClass._zone.IsUserZone)
{
return;
}
p.pos.ListCards().ForEach(delegate(Card c)
{
if (p.IsSelfOrNeighbor && EClass.pc.CanSee(c))Zone โ
bool flag = false;
Debug.Log(idCurrentSubset + "/" + IDSubset);
bool flag2 = idCurrentSubset != IDSubset || forceSubset != null;
if (flag2 && map != null)
{
UnloadMap();
}
string fullName = pathExport;
string lhs = CorePath.ZoneSave + "_new.z";
bool flag3 = File.Exists(fullName) && !PathComparer.Default.Equals(lhs, fullName); AddGlobalCharasOnActivate();
}
}
else if (IsLoaded)
else if (IsLoaded && !flag2)
{
Debug.Log("zone is already loaded");
map.SetZone(this); isImported = true;
if (flag5)
{
zoneExportData.orgMap = GameIO.LoadFile<Map>(base.pathSave + "map");
if (IsLoaded)
{
zoneExportData.orgMap = IO.DeepCopy(map);
}
else
{
zoneExportData.orgMap = GameIO.LoadFile<Map>(base.pathSave + "map");
}
}
}
catch (Exception message) isImported = true;
}
}
if (map != null)
{
UnloadMap();
}
EClass.game.countLoadedMaps++;
Debug.Log("loading map: imported? " + isImported + " regenerate? " + flag5);
string text = (isImported ? pathTemp : base.pathSave) + "map";ZoneEventMusic โ
public void Spawn(Chara c, Point p)
Hostility c_originalHostility = (c.hostility = Hostility.Neutral);
c.c_originalHostility = c_originalHostility;
}
if (questMusic.partyLv > 0)
{
c.SetLv(c.LV * (100 + questMusic.partyLv * 100) / 100);
c.things.DestroyAll();
c.TryRestock(onCreate: true);
}
}
public override ZoneInstance.Status OnReachTimeLimit()