Skip to content

EA 23.351 Nightly โ€‹

October 2, 2026

13 files modified. 2 new files created.

Important Changes โ€‹

None.

AI_PlayMusic โ€‹

public override IEnumerable<Status> Run()

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

cs
		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โ€ฆ)

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

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

cs
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 โ€‹

public void QuickStart()

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

cs
[JsonProperty]
public int sumMoney;

[JsonProperty] 
public int partyLv; 
public override DifficultyType difficultyType => DifficultyType.Music;

public override string IdZone => "instance_music";

public class QuestMusic : QuestInstance

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

cs
	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

cs
[NonSerialized]
public bool useRandomColor;

[NonSerialized] 
public bool useDyeColor; 
[NonSerialized]
public SourceMaterial.Row DefaultMaterial;

public void SetRenderData()

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

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

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

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

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

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

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

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

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

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

cs
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 NoRestock(Thing _t)

cs
	}
	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 โ€‹

public enum Type

cs
	Spell,
	RandomSpell,
	Ero,
	Dojin 
	Dojin, 
	BlackNote 
}

public static ElementSelecter selecter = new ElementSelecter

public override void OnCreate(int lv)

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

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

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

cs
		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
cs
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
cs
public class TraitDeathNote : TraitBlackNote
{
}

TraitWhipEgg โ€‹

public override void OnCreate(int lv)

cs
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 โ€‹

public void Activate()

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

public void Activate()

cs
		AddGlobalCharasOnActivate();
	}
}
else if (IsLoaded) 
else if (IsLoaded && !flag2) 
{
	Debug.Log("zone is already loaded");
	map.SetZone(this);

public void Activate()

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

public void Activate()

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

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