Skip to content

EA 23.286 Nightly

March 16, 2026

17 files modified. 2 new files created.

Important Changes

Possible breaking changes. Click the filename to view the chunk.

Zone_EternalGarden (1)

cs
public override void OnActivate() 

AI_Idle

public override IEnumerable<Status> Run()

cs
	}
	if (EClass.rnd(owner.isSynced ? 10 : 2000) == 0 && owner.ability.Has(5058))
	{
		if (!owner.UseAbility(5058)) 
		if (!owner.UseAbility(5058) && !owner.IsPCFaction) 
		{
			owner.AddCondition<ConInsane>(10000);
			owner.SetHostility(Hostility.Enemy);

AI_OpenGambleChest

public override IEnumerable<Status> Run()

cs
			{
				owner.PlaySound("money");
				owner.PlayAnime(AnimeID.Jump);
				Thing thing = ThingGen.Create("money").SetNum(EClass.rndHalf(50 * (100 + Mathf.Min(target.c_lockLv, 10000000) * 10))); 
				Thing thing = ThingGen.Create("money").SetNum(EClass.rndHalf(50 * (100 + Mathf.Min(target.c_lockLv * 10, 10000000)))); 
				owner.Pick(thing, msg: false);
				owner.Say("gambleChest_win", thing);
			}

ActEffect

void AddCon<T>(int rate, int power) where T : Condition

cs
	{
		CC.PlaySound("clean_floor");
		Msg.Say("exterminate");
		List<Chara> list3 = EClass._map.charas.Where((Chara c) => c.isCopy && !c.IsPCFaction).ToList(); 
		if (list3.Count == 0) 
		List<Chara> list2 = EClass._map.charas.Where((Chara c) => c.isCopy && !c.IsPCFaction).ToList(); 
		if (list2.Count == 0) 
		{
			Msg.SayNothingHappen();
			return;
		}
		foreach (Chara item in list3) 
		foreach (Chara item in list2) 
		{
			item.Say("split_fail", item);
			item.PlayEffect("vanish");

void AddCon<T>(int rate, int power) where T : Condition

cs
		{
			return;
		}
		Thing thing2 = ThingGen.Create("mine"); 
		thing2.c_idRefCard = "dog_mine"; 
		Thing thing = ThingGen.Create("mine"); 
		thing.c_idRefCard = "dog_mine"; 
		Zone.ignoreSpawnAnime = true;
		EClass._zone.AddCard(thing2, CC.pos).Install(); 
		EClass._zone.AddCard(thing, CC.pos).Install(); 
		break;
	}
	case EffectId.LittleSisterMigration:
	case EffectId.SilverCatMigration:
	{
		bool flag3 = id == EffectId.SilverCatMigration; 
		if (!EClass.game.IsSurvival && ((flag3 && !(EClass._zone is Zone_EternalGarden)) || (!flag3 && !(EClass._zone is Zone_LittleGarden)))) 
		bool flag6 = id == EffectId.SilverCatMigration; 
		if (!EClass.game.IsSurvival && ((flag6 && EClass._zone.id != "startVillage2") || (!flag6 && !(EClass._zone is Zone_LittleGarden)))) 
		{
			Msg.SayNothingHappen();
			return;
		}
		List<Chara> list2 = new List<Chara>(); 
		bool flag4 = false; 
		List<Chara> list3 = new List<Chara>(); 
		bool flag7 = false; 
		foreach (Chara chara2 in EClass._map.charas)
		{
			if (!chara2.IsPCFactionOrMinion && chara2.id == (flag3 ? "cat_silver" : "littleOne")) 
			if (!chara2.IsPCFactionOrMinion && chara2.id == (flag6 ? "cat_silver" : "littleOne")) 
			{
				if (flag4) 
				if (flag7) 
				{
					flag4 = false; 
					flag7 = false; 
					continue;
				}
				list2.Add(chara2); 
				flag4 = true; 
				list3.Add(chara2); 
				flag7 = true; 
			}
		}
		if (list2.Count == 0) 
		if (list3.Count == 0) 
		{
			Msg.SayNothingHappen();
			return;
		}
		EClass.pc.PlaySound("chime_angel");
		foreach (Chara item2 in list2) 
		foreach (Chara item2 in list3) 
		{
			item2.PlayEffect("revive");
			item2.Destroy();
		}
		Msg.Say(flag3 ? "cat_migration" : "little_migration", list2.Count.ToString() ?? ""); 
		EClass._zone.ModInfluence(list2.Count); 
		if (flag3) 
		Msg.Say(flag6 ? "cat_migration" : "little_migration", list3.Count.ToString() ?? ""); 
		EClass._zone.ModInfluence(list3.Count); 
		if (flag6) 
		{
			EClass.player.stats.catDepart += list2.Count; 
			EClass.player.stats.catDepart += list3.Count; 
		}
		else
		{
			EClass.player.stats.sistersDepart += list2.Count; 
			EClass.player.stats.sistersDepart += list3.Count; 
		}
		break;
	}

void AddCon<T>(int rate, int power) where T : Condition

cs
		TC.PlaySound("curse3");
		TC.PlayEffect("curse");
		TC.Say("forgetItems", TC);
		int num4 = power / 50 + 1 + EClass.rnd(3); 
		int num3 = power / 50 + 1 + EClass.rnd(3); 
		List<Thing> source = TC.things.List((Thing t) => t.c_IDTState == 0);
		for (int j = 0; j < num4; j++) 
		for (int j = 0; j < num3; j++) 
		{
			source.RandomItem().c_IDTState = 5;
		}

void AddCon<T>(int rate, int power) where T : Condition

cs
	case EffectId.EnchantArmorGreat:
	{
		bool armor = id == EffectId.EnchantArmor || id == EffectId.EnchantArmorGreat;
		bool flag7 = id == EffectId.EnchantWeaponGreat || id == EffectId.EnchantArmorGreat; 
		bool flag4 = id == EffectId.EnchantWeaponGreat || id == EffectId.EnchantArmorGreat; 
		if (!tc.isThing)
		{
			LayerDragGrid.CreateEnchant(CC, armor, flag7, state); 
			LayerDragGrid.CreateEnchant(CC, armor, flag4, state); 
			return;
		}
		cc.PlaySound("identify");

void AddCon<T>(int rate, int power) where T : Condition

cs
			tc.ModEncLv(-1);
			break;
		}
		int num6 = (flag7 ? 4 : 2) + (blessed ? 1 : 0); 
		if (tc.encLV >= num6) 
		int num5 = (flag4 ? 4 : 2) + (blessed ? 1 : 0); 
		if (tc.encLV >= num5) 
		{
			cc.Say("enc_resist", tc);
			break;

void AddCon<T>(int rate, int power) where T : Condition

cs
	case EffectId.Identify:
	case EffectId.GreaterIdentify:
	{
		bool flag6 = id == EffectId.GreaterIdentify; 
		bool flag2 = id == EffectId.GreaterIdentify; 
		if (flag)
		{
			Redirect(EffectId.ForgetItems, flag6 ? BlessedState.Cursed : BlessedState.Normal, default(ActRef)); 
			Redirect(EffectId.ForgetItems, flag2 ? BlessedState.Cursed : BlessedState.Normal, default(ActRef)); 
			break;
		}
		if (!tc.isThing)
		{
			int count = ((!blessed) ? 1 : (flag6 ? (2 + EClass.rnd(2)) : (3 + EClass.rnd(3)))); 
			LayerDragGrid.CreateIdentify(CC, flag6, state, 0, count); 
			int count = ((!blessed) ? 1 : (flag2 ? (2 + EClass.rnd(2)) : (3 + EClass.rnd(3)))); 
			LayerDragGrid.CreateIdentify(CC, flag2, state, 0, count); 
			return;
		}
		cc.PlaySound("identify");
		cc.PlayEffect("identify");
		tc.Thing.Identify(cc.IsPCParty, (!flag6) ? IDTSource.Identify : IDTSource.SuperiorIdentify); 
		tc.Thing.Identify(cc.IsPCParty, (!flag2) ? IDTSource.Identify : IDTSource.SuperiorIdentify); 
		break;
	}
	case EffectId.Uncurse:

void AddCon<T>(int rate, int power) where T : Condition

cs
			LayerDragGrid.CreateUncurse(CC, state);
			return;
		}
		Thing thing = tc.Thing; 
		if (thing.blessedState == BlessedState.Cursed) 
		Thing thing3 = tc.Thing; 
		if (thing3.blessedState == BlessedState.Cursed) 
		{
			thing.SetBlessedState(BlessedState.Normal); 
			thing3.SetBlessedState(BlessedState.Normal); 
		}
		else if (thing.blessedState == BlessedState.Doomed) 
		else if (thing3.blessedState == BlessedState.Doomed) 
		{
			thing.SetBlessedState(BlessedState.Normal); 
			thing3.SetBlessedState(BlessedState.Normal); 
		}
		thing.GetRootCard()?.TryStack(thing); 
		LayerInventory.SetDirty(thing); 
		thing3.GetRootCard()?.TryStack(thing3); 
		LayerInventory.SetDirty(thing3); 
		break;
	}
	case EffectId.Lighten:

void AddCon<T>(int rate, int power) where T : Condition

cs
		}
		cc.PlaySound("offering");
		cc.PlayEffect("buff");
		int num3 = (tc.isWeightChanged ? tc.c_weight : tc.Thing.source.weight); 
		int num6 = (tc.isWeightChanged ? tc.c_weight : tc.Thing.source.weight); 
		tc.isWeightChanged = true;
		Element orCreateElement = tc.elements.GetOrCreateElement(64);
		Element orCreateElement2 = tc.elements.GetOrCreateElement(65);

void AddCon<T>(int rate, int power) where T : Condition

cs
		bool flag5 = tc.IsEquipmentOrRangedOrAmmo || tc.IsThrownWeapon;
		if (flag)
		{
			num3 = (int)(0.01f * (float)num3 * (float)power * 0.75f + 500f); 
			if (num3 < 0 || num3 > 10000000) 
			num6 = (int)(0.01f * (float)num6 * (float)power * 0.75f + 500f); 
			if (num6 < 0 || num6 > 10000000) 
			{
				num3 = 10000000; 
				num6 = 10000000; 
				flag5 = false;
			}
			if (flag5)

void AddCon<T>(int rate, int power) where T : Condition

cs
		}
		else
		{
			num3 = num3 * (100 - power / 10) / 100; 
			num6 = num6 * (100 - power / 10) / 100; 
			if (blessed)
			{
				power /= 4;

void AddCon<T>(int rate, int power) where T : Condition

cs
			}
			cc.Say("lighten", tc);
		}
		tc.c_weight = num3; 
		tc.c_weight = num6; 
		tc.SetDirtyWeight();
		if (tc.parent == null)
		{

void AddCon<T>(int rate, int power) where T : Condition

cs
		cc.PlayEffect("identify");
		cc.Say("reconstruct", tc);
		EClass.game.cards.uidNext += EClass.rnd(30);
		int num5 = Mathf.Max(tc.genLv, tc.LV, EClass.player.stats.deepest); 
		int num4 = Mathf.Max(tc.genLv, tc.LV, EClass.player.stats.deepest); 
		CardBlueprint.Set(new CardBlueprint
		{
			blesstedState = state
		});
		Thing thing3 = ThingGen.Create(tc.id, -1, (int)((long)num5 * (long)power / 400)); 
		thing3.genLv = num5; 
		Thing thing2 = ThingGen.Create(tc.id, -1, (int)((long)num4 * (long)power / 400)); 
		thing2.genLv = num4; 
		if (tc.c_uidAttune != 0)
		{
			thing3.c_uidAttune = tc.c_uidAttune; 
			if (thing3.id == "amulet_engagement" || thing3.id == "ring_engagement") 
			thing2.c_uidAttune = tc.c_uidAttune; 
			if (thing2.id == "amulet_engagement" || thing2.id == "ring_engagement") 
			{
				if (tc.c_uidAttune != EClass.pc.uid)
				{
					thing3.elements.ModBase(484, 3); 
					thing2.elements.ModBase(484, 3); 
				}
				if (thing3.rarity < Rarity.Mythical) 
				if (thing2.rarity < Rarity.Mythical) 
				{
					thing3.rarity = Rarity.Mythical; 
					thing2.rarity = Rarity.Mythical; 
				}
			}
		}
		tc.Destroy();
		CC.Pick(thing3, msg: false); 
		CC.Pick(thing2, msg: false); 
		if (!CC.IsPC)
		{
			CC.TryEquip(thing3); 
			CC.TryEquip(thing2); 
		}
		break;
	}

void AddCon<T>(int rate, int power) where T : Condition

cs
		if (row == null)
		{
			bool num = id == EffectId.ChangeMaterialGreater;
			bool flag2 = id == EffectId.ChangeMaterialLesser; 
			bool flag3 = id == EffectId.ChangeMaterialLesser; 
			string text2 = tc.Thing.source.tierGroup;
			Dictionary<string, SourceMaterial.TierList> tierMap = SourceMaterial.tierMap;
			int num2 = 1;

void AddCon<T>(int rate, int power) where T : Condition

cs
			{
				num2++;
			}
			if (flag2) 
			if (flag3) 
			{
				num2 -= 2;
			}

void AddCon<T>(int rate, int power) where T : Condition

cs
		}
		break;
	}
	case EffectId.ChangeRarity:
	{ 
		EClass.sources.materials.alias.TryGetValue(actRef.n1); 
		if (!tc.isThing) 
		{ 
			LayerDragGrid.CreateChangeRarity(CC, actRef.refThing, id, state); 
			return; 
		} 
		if (tc.Num > 1) 
		{ 
			tc = tc.Split(1); 
		} 
		string name2 = tc.Name; 
		cc.PlaySound("offering"); 
		cc.PlayEffect("buff"); 
		CardBlueprint.Set(new CardBlueprint
		{ 
			rarity = ((tc.rarity < Rarity.Legendary) ? Rarity.Legendary : Rarity.Mythical), 
			generation = CardBlueprint.Generation.GarokkHammer 
		}); 
		tc.Destroy(); 
		Rand.SetBaseSeed(tc.uid); 
		Rand.SetSeed(tc.uid); 
		tc = ThingGen.Create(tc.id, tc.idMaterial, tc.genLv); 
		Rand.SetSeed(); 
		Rand.SetBaseSeed(); 
		EClass._zone.AddCard(tc, cc.pos); 
		EClass.pc.Say("reconstruct", name2); 
		EClass.pc.Pick(tc.Thing, msg: false); 
		break; 
	} 
	case EffectId.ChangeAlias:
		EClass.ui.AddLayer<LayerList>().SetStringList(delegate
		{ 
			List<string> list11 = new List<string>(); 
			for (int num15 = 0; num15 < 10; num15++) 
			{ 
				list11.Add(AliasGen.GetRandomAlias()); 
			} 
			return list11; 
		}, delegate(int a, string b) 
		{ 
			EClass.pc._alias = b; 
			EClass.pc.Say("reconstruct", EClass.pc); 
			SE.Change(); 
			EClass.pc.PlayEffect("mutation"); 
		}).SetSize() 
			.EnableReroll() 
			.SetTitles("wAlias"); 
		break; 
	case EffectId.ChangeBiography:
		EClass.pc.bio.RerollParents(); 
		EClass.pc.Say("reconstruct", EClass.pc); 
		SE.Change(); 
		EClass.pc.PlayEffect("mutation"); 
		break; 
	case EffectId.ReturnVoid:
	{
		Zone_Void root = EClass.game.spatials.Find<Zone_Void>();

void AddCon<T>(int rate, int power) where T : Condition

cs
			int currency = TC.GetCurrency();
			if (currency > 0)
			{
				currency = Mathf.Clamp(EClass.rnd(currency / 10), 1, 100 + EClass.rndHalf(CC.LV * 200)); 
				currency = Mathf.Clamp(EClass.rnd(currency / 10), 1, 100 + EClass.rndHalf(Mathf.Min(CC.LV, 1000000) * 200)); 
				thing6 = ThingGen.Create("money").SetNum(currency);
				TC.ModCurrency(-currency);
			}

Biography

public void RerollBio(Chara c, int ageIndex = 0, bool keepParent = false)

cs
		GenerateAppearance(c);
		if (!keepParent)
		{
			GenerateDad(); 
			GenerateMom(); 
			idHome = RndBio("home"); 
			idLoc = RndBio("loc"); 
			RerollParents(); 
		}
	}

	public void RerollParents() 
	{ 
		GenerateDad(); 
		GenerateMom(); 
		idHome = RndBio("home"); 
		idLoc = RndBio("loc"); 
	} 
	public void GenerateBirthday(Chara c, int ageIndex = 0)
	{
		SourceRace.Row race = c.race;

Card

public virtual int GetPrice(CurrencyType currency = CurrencyType.Money, bool sel

cs
				return LV / 8;
			case "372":
				return 3;
			case "hammer_garokk":
				return 100; 
			case "scroll_random":
				if (refVal == 8288)
				{

CardBlueprint

public class CardBlueprint : EClass

cs
public class CardBlueprint : EClass
{
	public enum Generation
	{ 
		Default, 
		GarokkHammer
	} 
	public int lv = -999;

	public int qualityBonus;

public class CardBlueprint : EClass

cs

	public bool isCraft;

	public Generation generation; 
	public static CardBlueprint current;

	public static CardBlueprint _Default = new CardBlueprint();

Chara

public void SetDirtySpeed()

cs

	public void RefreshSpeed(Element.BonusInfo info = null)
	{
		if (currentZone != EClass._zone) 
		{ 
			dirtySpeed = true; 
			return; 
		} 
		if (ride != null && !ride.IsDeadOrSleeping)
		{
			ride.RefreshSpeed();

public void RestockEquip(bool onCreate)

cs
	case "mad_rich":
		if (onCreate)
		{
			int a = EClass.rndHalf(100 + (EClass.debug.enable ? 10 : EClass._zone.influence) * 50 + (int)Mathf.Sqrt(EClass._zone.DangerLv) * 100 + (int)Mathf.Sqrt(EClass.pc.FameLv) * 100 + EClass._zone.development * 10); 
			int a = (EClass._zone.IsUserZone ? 200 : EClass.rndHalf(100 + (EClass.debug.enable ? 10 : EClass._zone.influence) * 50 + (int)Mathf.Sqrt(EClass._zone.DangerLv) * 100 + (int)Mathf.Sqrt(EClass.pc.FameLv) * 100 + EClass._zone.development * 10)); 
			ModCurrency(a);
		}
		break;

public void Kiss(Chara c)

cs

	public void Slap(Chara c, bool slapToDeath = false)
	{
		if (id == "olderyoungersister") 
		{ 
			Steam.GetAchievement(ID_Achievement.OYS); 
		} 
		PlaySound("whip");
		Say("slap", this, c);
		c.PlayAnime(AnimeID.Shiver);

DramaManager

public void ParseLine(Dictionary<string, string> item)

cs
	case "getAchievement":
		AddEvent(delegate
		{
			if (new string[1] { "ONEV" }.Contains(p2)) 
			if (new string[2] { "ONEV", "NERUN2" }.Contains(p2)) 
			{
				Steam.GetAchievement(p2.ToEnum<ID_Achievement>());
			}

EffectId

public enum EffectId

cs
	GravityGun = 311,
	TransBlood = 312,
	Field = 313,
	SilverCatMigration = 314
	SilverCatMigration = 314, 
	ChangeRarity = 315, 
	ChangeAlias = 316, 
	ChangeBiography = 317
}

FactionBranch

public int GetResidentTax()

cs
				num5 = num6;
			}
		}
		int num7 = (int)((isWealthy ? 50 : 10) + (long)member.LV * 2L) * num5 / 100 * num4 / 100; 
		int num7 = (int)(((isWealthy ? 50 : 10) + (long)member.LV * 2L) * num5 / 100 * num4 / 100); 
		if (isWealthy && num2 > 0)
		{
			num7 = num7 * (150 + (int)Mathf.Sqrt(num2) * 5) / 100;

ID_Achievement

public enum ID_Achievement

cs
	ONEV,
	JURE,
	BELL,
	NERUN2 
	NERUN2, 
	OYS 
}

+InvOwnerChangeRarity

File Created
cs
public class InvOwnerChangeRarity : InvOwnerEffect
{
	public Thing consume;

	public override bool CanTargetAlly => true;

	public override string langTransfer => "invChangeRarity";

	public override string langWhat => "changeMaterial_what";

	public override Thing CreateDefaultContainer()
	{
		return ThingGen.Create("hammer_garokk");
	}

	public override bool ShouldShowGuide(Thing t)
	{
		if (t.IsEquipment && !t.IsUnique && !t.HasTag(CTAG.godArtifact))
		{
			return !t.IsLightsource;
		}
		return false;
	}

	public override void _OnProcess(Thing t)
	{
		ActEffect.Proc(idEffect, 100, state, t.GetRootCard(), t);
		if (consume != null)
		{
			consume.ModNum(-1);
		}
	}
}

LayerDragGrid

public static LayerDragGrid CreateChangeMaterial(Chara cc, Thing consume, Source

cs
		});
	}

	public static LayerDragGrid CreateChangeRarity(Chara cc, Thing consume, EffectId idEffect, BlessedState state = BlessedState.Normal, int price = 0, int count = 1) 
	{ 
		return TryProc(cc, new InvOwnerChangeRarity
		{ 
			consume = consume, 
			state = state, 
			price = price, 
			count = count, 
			idEffect = idEffect 
		}); 
	} 
	public static LayerDragGrid CreateUncurse(Chara cc, BlessedState state = BlessedState.Normal, int price = 0, int count = 1)
	{
		return TryProc(cc, new InvOwnerUncurse

Trait

public void OnBarter(bool reroll = false)

cs
		{
			break;
		}
		int num4 = 0; 
		int num7 = 0; 
		foreach (Thing thing10 in c_copyContainer.things)
		{
			if (!owner.trait.CanCopy(thing10))

public void OnBarter(bool reroll = false)

cs
			{
				thing5.elements.Remove(item.id);
			}
			int num5 = 1; 
			int num8 = 1; 
			switch (owner.trait.CopyShop)
			{
			case CopyShopType.Item:
			{
				num5 = (1000 + owner.c_invest * 100) / (thing5.GetPrice(CurrencyType.Money, sell: false, PriceType.CopyShop) + 50); 
				int[] array = new int[3] { 704, 703, 702 }; 
				foreach (int ele in array) 
				num8 = (1000 + owner.c_invest * 100) / (thing5.GetPrice(CurrencyType.Money, sell: false, PriceType.CopyShop) + 50); 
				int[] array2 = new int[3] { 704, 703, 702 }; 
				foreach (int ele in array2) 
				{
					if (thing5.HasElement(ele))
					{
						num5 = 1; 
						num8 = 1; 
					}
				}
				break;

public void OnBarter(bool reroll = false)

cs
				thing5.c_charges = thing10.c_charges;
				break;
			}
			if (num5 > 1 && thing5.trait.CanStack) 
			if (num8 > 1 && thing5.trait.CanStack) 
			{
				thing5.SetNum(num5); 
				thing5.SetNum(num8); 
			}
			AddThing(thing5);
			num4++; 
			if (num4 > owner.trait.NumCopyItem) 
			num7++; 
			if (num7 > owner.trait.NumCopyItem) 
			{
				break;
			}

public void OnBarter(bool reroll = false)

cs
		break;
	case ShopType.RedBook:
	{
		for (int num7 = 0; num7 < 30; num7++) 
		for (int k = 0; k < 30; k++) 
		{
			AddThing(ThingGen.CreateFromFilter("shop_seeker"));
		}
		break;
	}
	case ShopType.KeeperOfGarden:
	{ 
		string[] array = new string[11] 
		{ 
			"stone_defense", "1325", "1326", "1327", "1328", "1330", "1331", "1332", "1333", "1283", 
			"1268"
		}; 
		foreach (string id2 in array) 
		{ 
			AddThing(ThingGen.Create(id2, MATERIAL.GetRandomMaterialFromCategory(50, "rock", EClass.sources.materials.alias["granite"]).id).SetNum(10)); 
		} 
		Add("scroll_alias", 1, 0); 
		Add("scroll_biography", 1, 0); 
		Add("1329", 1, 0); 
		break; 
	} 
	case ShopType.Seed:
	{
		AddThing(TraitSeed.MakeSeed("rice")).SetNum(4 + EClass.rnd(4));

public void OnBarter(bool reroll = false)

cs
		AddThing(TraitSeed.MakeSeed("carrot")).SetNum(4 + EClass.rnd(4));
		AddThing(TraitSeed.MakeSeed("potato")).SetNum(4 + EClass.rnd(4));
		AddThing(TraitSeed.MakeSeed("corn")).SetNum(4 + EClass.rnd(4));
		for (int num8 = 0; num8 < EClass.rnd(3) + 1; num8++) 
		for (int num9 = 0; num9 < EClass.rnd(3) + 1; num9++) 
		{
			Add("462", 1, 0);
		}
		for (int num9 = 0; num9 < EClass.rnd(3) + 1; num9++) 
		for (int num10 = 0; num10 < EClass.rnd(3) + 1; num10++) 
		{
			Add("1167", 1, 0);
		}

public void OnBarter(bool reroll = false)

cs
				break;
			case ShopType.Influence:
			{
				bool num3 = owner.id == "big_sister"; 
				TraitTicketFurniture.SetZone(num3 ? EClass.game.spatials.Find("little_garden") : EClass._zone, Add("ticket_furniture", 1, 0).SetNum(99)); 
				if (num3) 
				bool num4 = owner.id == "big_sister"; 
				TraitTicketFurniture.SetZone(num4 ? EClass.game.spatials.Find("little_garden") : EClass._zone, Add("ticket_furniture", 1, 0).SetNum(99)); 
				if (num4) 
				{
					Add("littleball", 10, 0);
					if (!owner.Chara.affinity.CanGiveCard())

public void OnBarter(bool reroll = false)

cs
					}
					if (!reroll)
					{
						for (int l = 0; l < 20; l++) 
						for (int n = 0; n < 20; n++) 
						{
							owner.Chara.ModExp(287, 1000);
						}

public void OnBarter(bool reroll = false)

cs
					AddThing(thing3);
					break;
				}
				for (int m = 0; m < 10; m++) 
				for (int num5 = 0; num5 < 10; num5++) 
				{
					Thing thing4 = ThingGen.Create(EClass._zone.IsFestival ? "1123" : ((EClass.rnd(3) == 0) ? "1169" : "1160"));
					thing4.DyeRandom();

public void OnBarter(bool reroll = false)

cs
				}
				if (EClass._zone is Zone_Exile)
				{
					for (int n = 0; n < 30; n++) 
					for (int num6 = 0; num6 < 30; num6++) 
					{
						Add("1235", 1, -1);
						Add("1236", 1, -1);

public void OnBarter(bool reroll = false)

cs
				AddThing(ThingGen.CreatePerfume(9501, 5));
				AddThing(ThingGen.CreatePerfume(9502, 5));
				AddThing(ThingGen.CreatePerfume(9503, 5));
				for (int k = 0; k < 5; k++) 
				for (int l = 0; l < 5; l++) 
				{
					Thing thing2 = ThingGen.CreateFromCategory("seasoning").SetNum(10);
					thing2.elements.SetBase(2, 40);

public void OnBarter(bool reroll = false)

cs
				break;
			}
			case ShopType.Medal:
				NoRestockId("sword_dragon"); 
				NoRestockId("hammer_garokk", 3); 
				NoRestockId("sword_dragon", 1); 
				Add("sword_dragon", 1, 0).SetReplica(on: true);
				NoRestockId("point_stick"); 
				NoRestockId("point_stick", 1); 
				Add("point_stick", 1, 0).SetReplica(on: true);
				NoRestockId("blunt_bonehammer"); 
				NoRestockId("blunt_bonehammer", 1); 
				Add("blunt_bonehammer", 1, 0).SetReplica(on: true);
				NoRestockId("pole_gunlance"); 
				NoRestockId("pole_gunlance", 1); 
				Add("pole_gunlance", 1, 0).SetReplica(on: true);
				NoRestockId("sword_muramasa"); 
				NoRestockId("sword_muramasa", 1); 
				Add("sword_muramasa", 1, 0).SetReplica(on: true);
				NoRestockId("sword_forgetmenot"); 
				NoRestockId("sword_forgetmenot", 1); 
				Add("sword_forgetmenot", 1, 0).SetReplica(on: true);
				NoRestockId("dagger_fish"); 
				NoRestockId("dagger_fish", 1); 
				Add("dagger_fish", 1, 0).SetReplica(on: true);
				NoRestockId("sword_zephir"); 
				NoRestockId("sword_zephir", 1); 
				Add("sword_zephir", 1, 0).SetReplica(on: true);
				Add("ribbon", 1, 0);
				Add("helm_sage", 1, 0);

public void OnBarter(bool reroll = false)

cs
				break;
			default:
			{
				float num = (float)(3 + Mathf.Min(ShopLv / 5, 10)) + Mathf.Sqrt(ShopLv); 
				int num2 = 300; 
				float num2 = (float)(3 + Mathf.Min(ShopLv / 5, 10)) + Mathf.Sqrt(ShopLv); 
				int num3 = 300; 
				switch (ShopType)
				{
				case ShopType.Ecopo:
					num2 = 30; 
					num3 = 30; 
					break;
				case ShopType.StrangeGirl:
					num2 = 50; 
					num3 = 50; 
					break;
				}
				num = num * (float)(100 + EClass.pc.Evalue(1406) * 5) / 100f; 
				num = Mathf.Min(num, num2); 
				for (int j = 0; (float)j < num; j++) 
				num2 = num2 * (float)(100 + EClass.pc.Evalue(1406) * 5) / 100f; 
				num2 = Mathf.Min(num2, num3); 
				for (int j = 0; (float)j < num2; j++) 
				{
					Thing thing = CreateStock();
					if ((!thing.trait.IsNoShop || (ShopType == ShopType.LoytelMart && (EClass.debug.enable || EClass.player.flags.loytelMartLv >= 2))) && (!(thing.trait is TraitRod) || thing.c_charges != 0) && thing.GetPrice() > 0)

public void OnBarter(bool reroll = false)

cs
				{
					continue;
				}
				string[] recipeKey = item3.row.recipeKey; 
				for (int num6 = 0; num6 < recipeKey.Length; num6++) 
				string[] array = item3.row.recipeKey; 
				for (int m = 0; m < array.Length; m++) 
				{
					if (recipeKey[num6] == ShopType.ToString()) 
					if (array[m] == ShopType.ToString()) 
					{
						NoRestock(ThingGen.CreateRecipe(item3.id));
						break;

public void OnBarter(bool reroll = false)

cs
				}
				break;
			}
			case ShopType.KeeperOfGarden:
				Add("1329", 1, 0); 
				break; 
			case ShopType.StrangeGirl:
			{
				int num12 = (EClass.debug.enable ? 20 : (EClass._zone.development / 10)); 
				if (num12 > 0) 
				int num14 = (EClass.debug.enable ? 20 : (EClass._zone.development / 10)); 
				if (num14 > 0) 
				{
					Add("syringe_gene", num12, 0); 
					Add("syringe_gene", num14, 0); 
					Add("diary_little", 1, 0);
				}
				if (num12 > 10) 
				if (num14 > 10) 
				{
					Add("syringe_heaven", num12 / 5, 0); 
					Add("syringe_heaven", num14 / 5, 0); 
					Add("1276", 1, 0);
				}
				Add("medal", 10, 0);

public void OnBarter(bool reroll = false)

cs
					Add("ticket_armpillow", 1, 0);
					Add("ticket_champagne", 1, 0);
				}
				for (int num10 = 0; num10 < 3; num10++) 
				for (int num11 = 0; num11 < 3; num11++) 
				{
					if (EClass.rnd(5) == 0)
					{
						TreasureType treasureType = ((EClass.rnd(10) == 0) ? TreasureType.BossNefia : ((EClass.rnd(10) == 0) ? TreasureType.Map : TreasureType.RandomChest));
						int num11 = EClass.rnd(EClass.rnd(ShopLv + (EClass.debug.enable ? 200 : 50)) + 1) + 1; 
						int num12 = EClass.rnd(EClass.rnd(ShopLv + (EClass.debug.enable ? 200 : 50)) + 1) + 1; 
						Thing thing6 = ThingGen.Create(treasureType switch
						{
							TreasureType.Map => "chest_treasure",

public void OnBarter(bool reroll = false)

cs
							_ => "chest3", 
						});
						thing6.c_lockedHard = true;
						thing6.c_lockLv = num11; 
						thing6.c_priceAdd = 2000 + num11 * 250 * ((treasureType == TreasureType.RandomChest) ? 1 : 5); 
						thing6.c_lockLv = num12; 
						thing6.c_priceAdd = 2000 + num12 * 250 * ((treasureType == TreasureType.RandomChest) ? 1 : 5); 
						thing6.c_revealLock = true;
						ThingGen.CreateTreasureContent(thing6, num11, treasureType, clearContent: true); 
						ThingGen.CreateTreasureContent(thing6, num12, treasureType, clearContent: true); 
						AddThing(thing6);
					}
				}

public void OnBarter(bool reroll = false)

cs
			case ShopType.General:
			case ShopType.Food:
			{
				for (int num14 = 0; num14 < (EClass.debug.enable ? 3 : 3); num14++) 
				for (int num15 = 0; num15 < (EClass.debug.enable ? 3 : 3); num15++) 
				{
					if (EClass.rnd(3) == 0)
					{

public void OnBarter(bool reroll = false)

cs
			{
				return;
			}
			int num15 = t.things.width * 10; 
			if (t.things.Count > num15) 
			int num16 = t.things.width * 10; 
			if (t.things.Count > num16) 
			{
				int num16 = t.things.Count - num15; 
				for (int num17 = 0; num17 < num16; num17++) 
				int num17 = t.things.Count - num16; 
				for (int num18 = 0; num18 < num17; num18++) 
				{
					t.things.LastItem().Destroy();
				}

void NoRestock(Thing _t)

cs
						AddThing(_t);
					}
				}
				void NoRestockId(string _id) 
				void NoRestockId(string _id, int num) 
				{
					NoRestock(ThingGen.Create(_id)); 
					NoRestock(ThingGen.Create(_id).SetNum(num)); 
				}
			}

public Thing CreateStock()

cs
				}
				return FromFilter("shop_drink");
			case ShopType.Furniture:
			case ShopType.KeeperOfGarden:
				return FromFilter("shop_furniture");
			case ShopType.Book:
				return FromFilter("shop_book");

+TraitGarokkHammer

File Created
cs
public class TraitGarokkHammer : TraitItem
{
	public override bool OnUse(Chara c)
	{
		ActEffect.Proc(EffectId.ChangeRarity, EClass.pc, null, 100, new ActRef
		{
			n1 = owner.material.alias,
			refThing = owner.Thing
		});
		return true;
	}
}

TraitKeeperOfGarden

public override ShopType ShopType

cs
{
	get
	{
		if (!(EClass._zone is Zone_EternalGarden) && !EClass.game.IsSurvival) 
		if (!(EClass._zone.id == "startVillage2") && !EClass.game.IsSurvival) 
		{
			return ShopType.None;
		}

TraitScrollStatic

public override SourceElement.Row source

cs

	public virtual EffectId idEffect => owner.sourceCard.vals[1].ToEnum<EffectId>();

	public virtual int Power => int.Parse(owner.sourceCard.vals[2]); 
	public virtual int Power 
	{ 
		get 
		{ 
			if (owner.sourceCard.vals.Length <= 2) 
			{ 
				return 100; 
			} 
			return int.Parse(owner.sourceCard.vals[2]); 
		} 
	} 

	public virtual string AliasEle => owner.sourceCard.vals.TryGet(3, returnNull: true);

Zone

public virtual void OnRegenerate()

cs

	public virtual void OnActivate()
	{
		if (!(id == "startVillage2")) 
		{ 
			return; 
		} 
		if (EClass._map.version.IsBelow(0, 23, 226)) 
		{ 
			SetBGM(121, refresh: false); 
		} 
		int num = 0; 
		foreach (Chara chara in EClass._map.charas) 
		{ 
			if (chara.id == "cat_silver" && !chara.IsPCFaction) 
			{ 
				num++; 
			} 
		} 
		if (num > 0) 
		{ 
			Msg.Say("num_silvercat", num.ToString() ?? ""); 
		} 
	}

	public virtual void OnBeforeDeactivate()

Zone_EternalGarden

public class Zone_EternalGarden : Zone_Civilized

cs
public class Zone_EternalGarden : Zone_Civilized
{
	public override void OnActivate() 
	{ 
		base.OnActivate(); 
		if (EClass._map.version.IsBelow(0, 23, 226)) 
		{ 
			SetBGM(121, refresh: false); 
		} 
		int num = 0; 
		foreach (Chara chara in EClass._map.charas) 
		{ 
			if (chara.id == "cat_silver" && !chara.IsPCFaction) 
			{ 
				num++; 
			} 
		} 
		if (num > 0) 
		{ 
			Msg.Say("num_silvercat", num.ToString() ?? ""); 
		} 
	} 
}