Skip to content

EA 23.292 Nightly

April 7, 2026

17 files modified.

Important Changes

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

ConStrife (1)

cs
private ElementContainer ec = new ElementContainer(); 
private ElementContainer ec = new ElementContainerCondition(); 

SpriteData (3)

cs
public Sprite[] GetSprites() 
cs
public Sprite GetSprite(bool snow = false) 
public void LoadAnimationIni() 
cs
public void Load(bool dateMatched, ref Texture2D tex, ref Sprite[] sprites, string suffix) 
public void Load() 

SpriteReplacer (1)

cs
public bool HasSprite(string id, RenderData renderData = null) 
public Sprite GetSprite(string suffix = "") 

AI_Fuck

public enum Variation

cs
		NTR,
		Bloodsuck,
		Slime,
		Tentacle 
		Tentacle, 
		MotherMilk 
	}

	public Variation variation;

public override IEnumerable<Status> Run()

cs
		switch (Type)
		{
		case FuckType.fuck:
		{ 
			if (this.variation == Variation.NTR)
			{
				cc.Say("ntr", cc, tc);

public override IEnumerable<Status> Run()

cs
				cc.renderer.PlayAnime(AnimeID.Attack, tc);
				if (EClass.rnd(3) == 0 || sell)
				{
					cc.Talk("tail"); 
					if (cc.IsPC && this.variation == Variation.MotherMilk) 
					{ 
						EClass.player.forceTalk = true; 
					} 
					cc.Talk((this.variation == Variation.MotherMilk) ? "play_baby" : "tail"); 
				}
				break;
			case 2:
				tc.renderer.PlayAnime(AnimeID.Shiver);
				if (EClass.rnd(3) == 0)
				{
					tc.Talk("tailed"); 
					if (tc.IsPC && this.variation == Variation.MotherMilk) 
					{ 
						EClass.player.forceTalk = true; 
					} 
					tc.Talk((this.variation == Variation.MotherMilk) ? "play_mama" : "tailed"); 
				}
				break;
			}
			if (((cc.HasElement(1216) || tc.HasElement(1216)) ? 100 : 20) > EClass.rnd(100)) 
			int num5 = ((cc.HasElement(1216) || tc.HasElement(1216)) ? 100 : 20); 
			if (this.variation == Variation.MotherMilk) 
			{ 
				num5 *= 5; 
			} 
			if (num5 > EClass.rnd(100)) 
			{
				((EClass.rnd(2) == 0) ? cc : tc).PlayEffect("love2");
			}

public override IEnumerable<Status> Run()

cs
				owner.pos.TryWitnessCrime(cc, tc, 4, (Chara c) => EClass.rnd(cc.HasCondition<ConTransmuteBat>() ? 50 : 20) == 0);
			}
			break;
		} 
		case FuckType.tame:
		{
			int num = 100;

ActEffect

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

cs
		}
		List<Chara> list2 = new List<Chara>();
		bool flag4 = false;
		foreach (Chara chara2 in EClass._map.charas) 
		foreach (Chara chara3 in EClass._map.charas) 
		{
			if (!chara2.IsPCFactionOrMinion && chara2.id == (flag3 ? "cat_silver" : "littleOne")) 
			if (!chara3.IsPCFactionOrMinion && chara3.id == (flag3 ? "cat_silver" : "littleOne")) 
			{
				if (flag4)
				{
					flag4 = false;
					continue;
				}
				list2.Add(chara2); 
				list2.Add(chara3); 
				flag4 = true;
			}
		}

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

cs
			}
			if (id == EffectId.Gate && CC.IsPC)
			{
				foreach (Chara chara3 in EClass._map.charas) 
				foreach (Chara chara4 in EClass._map.charas) 
				{
					if (!chara3.HasHost && chara3 != tc && (chara3.IsPCParty || chara3.IsPCPartyMinion)) 
					if (!chara4.HasHost && chara4 != tc && (chara4.IsPCParty || chara4.IsPCPartyMinion)) 
					{
						chara3.Teleport(tc.pos.GetNearestPoint(allowBlock: false, allowChara: false) ?? tc.pos); 
						chara4.Teleport(tc.pos.GetNearestPoint(allowBlock: false, allowChara: false) ?? tc.pos); 
					}
				}
			}

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

cs
		break;
	case EffectId.StripBlessing:
	{
		List<Condition> list4 = new List<Condition>(); 
		List<Condition> list6 = new List<Condition>(); 
		foreach (Condition condition4 in TC.conditions)
		{
			if (GetBlessingDifficulty(condition4) > 0 && EClass.rnd(GetBlessingDifficulty(condition4)) == 0)
			{
				list4.Add(condition4); 
				list6.Add(condition4); 
			}
		}
		if (list4.Count == 0) 
		if (list6.Count == 0) 
		{
			CC.SayNothingHappans();
			break;

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

cs
		TC.pos.PlayEffect("holyveil");
		TC.pos.PlaySound("holyveil");
		TC.Say("unpolluted", TC);
		list4.Shuffle(); 
		list6.Shuffle(); 
		{
			foreach (Condition item5 in list4) 
			foreach (Condition item5 in list6) 
			{
				item5.Kill();
				if (CC.IsHostile(TC))

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

cs
		{
			break;
		}
		int num14 = 0; 
		int num11 = 0; 
		foreach (Condition condition5 in TC.conditions)
		{
			if (condition5.Type == ConditionType.Debuff)
			{
				num14++; 
				num11++; 
			}
		}
		if (num14 == 0) 
		if (num11 == 0) 
		{
			CC.SayNothingHappans();
			break;

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

cs
		});
		TC.Say("abShutterHex", TC);
		Point center = CC.pos.Copy();
		List<Chara> list10 = TC.pos.ListCharasInRadius(TC, 4, (Chara c) => c == TC || c.IsHostile(CC)); 
		for (int m = 0; m < num14; m++) 
		List<Chara> list4 = TC.pos.ListCharasInRadius(TC, 4, (Chara c) => c == TC || c.IsHostile(CC)); 
		for (int k = 0; k < num11; k++) 
		{
			TweenUtil.Delay((float)m * 0.1f, delegate
			TweenUtil.Delay((float)k * 0.1f, delegate 
			{
				center.PlaySound("shutterhex");
			});
			foreach (Chara item6 in list10) 
			foreach (Chara item6 in list4) 
			{
				if (item6.ExistsOnMap)
				{

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

cs
					Color startColor = (componentInChildren.endColor = EClass.Colors.elementColors["eleHoly"]);
					componentInChildren.startColor = startColor;
					Point pos = item6.pos.Copy();
					TweenUtil.Delay((float)m * 0.1f, delegate
					TweenUtil.Delay((float)k * 0.1f, delegate 
					{
						effect.Play(center, 0f, pos);
					});
					int num15 = Dice.Create("SpShutterHex", power, CC, (actRef.refThing != null) ? null : actRef.act).Roll(); 
					item6.DamageHP(num15, 919, power, AttackSource.None, CC, showEffect: false); 
					int num12 = Dice.Create("SpShutterHex", power, CC, (actRef.refThing != null) ? null : actRef.act).Roll(); 
					item6.DamageHP(num12, 919, power, AttackSource.None, CC, showEffect: false); 
				}
			}
		}

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

cs
			break;
		}
		Thing thing7 = null;
		bool flag11 = actRef.n1 == "food"; 
		bool flag10 = actRef.n1 == "food"; 
		if (actRef.n1 == "money")
		{
			int currency = TC.GetCurrency();

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

cs
		else
		{
			Func<Thing, bool> func = (Thing t) => true;
			if (flag11) 
			if (flag10) 
			{
				func = (Thing t) => t.IsFood;
			}
			List<Thing> list9 = TC.things.List(delegate(Thing t) 
			List<Thing> list10 = TC.things.List(delegate(Thing t) 
			{
				if (t.parentCard?.trait is TraitChestMerchant || t.trait is TraitTool || t.IsThrownWeapon)
				{

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

cs
				}
				return t.trait.CanBeDestroyed && t.things.Count == 0 && t.invY != 1 && t.trait.CanBeStolen && !t.trait.CanOnlyCarry && !t.IsUnique && !t.isEquipped && t.blessedState == BlessedState.Normal && func(t);
			}, onlyAccessible: true);
			if (list9.Count > 0) 
			if (list10.Count > 0) 
			{
				thing7 = list9.RandomItem(); 
				thing7 = list10.RandomItem(); 
				if (thing7.Num > 1)
				{
					thing7 = thing7.Split(1);

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

cs
				text3 = text4;
			}
		}
		Condition condition = Condition.Create(text3, power, delegate(Condition con) 
		Condition condition2 = Condition.Create(text3, power, delegate(Condition con) 
		{
			if (!actRef.aliasEle.IsEmpty())
			{
				con.SetElement(EClass.sources.elements.alias[actRef.aliasEle].id);
			}
		});
		condition.isPerfume = TC.IsPC && actRef.isPerfume; 
		Condition condition2 = TC.AddCondition(condition); 
		if (condition2 != null && condition2.isPerfume) 
		condition2.isPerfume = TC.IsPC && actRef.isPerfume; 
		Condition condition3 = TC.AddCondition(condition2); 
		if (condition3 != null && condition3.isPerfume) 
		{
			condition2.value = 3; 
			condition3.value = 3; 
			Msg.Say("perfume", TC);
		}
		if (!text4.IsEmpty())

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

cs
	{
		EClass.game.religions.Trickery.Talk("ability");
		bool hex = CC.IsHostile(TC);
		List<SourceStat.Row> list7 = EClass.sources.stats.rows.Where((SourceStat.Row con) => con.tag.Contains("random") && con.group == (hex ? "Debuff" : "Buff")).ToList(); 
		List<SourceStat.Row> list8 = EClass.sources.stats.rows.Where((SourceStat.Row con) => con.tag.Contains("random") && con.group == (hex ? "Debuff" : "Buff")).ToList(); 
		int power2 = power;
		for (int k = 0; k < 4 + EClass.rnd(2); k++) 
		for (int l = 0; l < 4 + EClass.rnd(2); l++) 
		{
			SourceStat.Row row2 = list7.RandomItem(); 
			list7.Remove(row2); 
			SourceStat.Row row2 = list8.RandomItem(); 
			list8.Remove(row2); 
			Proc(hex ? EffectId.DebuffKizuami : EffectId.Buff, CC, TC, power2, new ActRef
			{
				n1 = row2.alias

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

cs
			power = power * 2 / 3;
		}
		int a2 = power;
		int num12 = TC.WIL * (isPowerful ? 20 : 5); 
		ConHolyVeil condition3 = TC.GetCondition<ConHolyVeil>(); 
		if (condition3 != null) 
		int num13 = TC.WIL * (isPowerful ? 20 : 5); 
		ConHolyVeil condition = TC.GetCondition<ConHolyVeil>(); 
		if (condition != null) 
		{
			num12 += condition3.power * 5; 
			num13 += condition.power * 5; 
		}
		if (id != EffectId.DebuffKizuami && EClass.rnd(a2) < num12 / EClass.sources.stats.alias[n].hexPower && EClass.rnd(10) != 0) 
		if (id != EffectId.DebuffKizuami && EClass.rnd(a2) < num13 / EClass.sources.stats.alias[n].hexPower && EClass.rnd(10) != 0) 
		{
			TC.Say("debuff_resist", TC);
			CC.DoHostileAction(TC);

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

cs
	case EffectId.Ally:
	{
		Msg.Say("gainAlly");
		Chara chara = CharaGen.CreateFromFilter("chara", cc.LV); 
		EClass._zone.AddCard(chara, cc.pos.GetNearestPoint(allowBlock: false, allowChara: false)); 
		Chara chara2 = CharaGen.CreateFromFilter("chara", cc.LV); 
		EClass._zone.AddCard(chara2, cc.pos.GetNearestPoint(allowBlock: false, allowChara: false)); 
		if (cc.IsPCFactionOrMinion)
		{
			chara.MakeAlly(msg: false); 
			chara2.MakeAlly(msg: false); 
		}
		chara.PlaySound("identify"); 
		chara.PlayEffect("teleport"); 
		chara2.PlaySound("identify"); 
		chara2.PlayEffect("teleport"); 
		break;
	}
	case EffectId.Wish:

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

cs
		tc.bio.SetGender(gender2);
		tc.Say("transGender", tc, Gender.Name(tc.bio.gender));
		tc.Talk("tail");
		int age3 = tc.bio.GetAge(tc.Chara); 
		if (blessed && age3 > 1) 
		int age2 = tc.bio.GetAge(tc.Chara); 
		if (blessed && age2 > 1) 
		{
			tc.Say("ageDown", tc);
			tc.bio.SetAge(tc.Chara, age3 - 1); 
			tc.bio.SetAge(tc.Chara, age2 - 1); 
		}
		else if (flag)
		{
			tc.Say("ageUp", tc);
			tc.bio.SetAge(tc.Chara, age3 + 1); 
			tc.bio.SetAge(tc.Chara, age2 + 1); 
		}
		break;
	}

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

cs
	{
		tc.PlaySound("mutation");
		tc.PlayEffect("mutation");
		int num13 = ((actRef.refThing != null) ? actRef.refThing.GetInt(118) : actRef.refVal); 
		if (num13 == 0) 
		int num10 = ((actRef.refThing != null) ? actRef.refThing.GetInt(118) : actRef.refVal); 
		if (num10 == 0) 
		{
			num13 = tc.GetInt(118); 
			if (num13 == 0) 
			num10 = tc.GetInt(118); 
			if (num10 == 0) 
			{
				num13 = EClass.game.seed + tc.uid; 
				num10 = EClass.game.seed + tc.uid; 
			}
			num13++; 
			num10++; 
		}
		tc.Say("transBlood", tc);
		tc.Talk("tail");
		tc.c_bloodData = null;
		tc.SetInt(118, num13); 
		tc.SetInt(118, num10); 
		break;
	}
	case EffectId.Youth:

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

cs
			tc.SayNothingHappans();
			break;
		}
		int age2 = tc.bio.GetAge(tc.Chara); 
		int age3 = tc.bio.GetAge(tc.Chara); 
		if (flag)
		{
			if (tc.c_lockedAge != 0)

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

cs
				tc.Say("eternalYouth2", tc);
				tc.c_lockedAge = 0;
				tc.elements.Remove(1243);
				tc.bio.SetAge(tc.Chara, age2); 
				tc.bio.SetAge(tc.Chara, age3); 
			}
			Redirect(EffectId.Youth, BlessedState.Cursed, default(ActRef));
		}

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

cs
		{
			tc.PlaySound("dropRewardXmas");
			tc.Say("eternalYouth1", tc);
			tc.c_lockedAge = age2 + 1; 
			tc.c_lockedAge = age3 + 1; 
			tc.elements.SetBase(1243, 1);
			if (blessed)
			{

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

cs
		break;
	case EffectId.Revive:
	{
		List<KeyValuePair<int, Chara>> list8 = EClass.game.cards.globalCharas.Where((KeyValuePair<int, Chara> a) => a.Value.isDead && a.Value.faction == EClass.pc.faction && !a.Value.isSummon && a.Value.c_wasInPcParty).ToList(); 
		List<KeyValuePair<int, Chara>> list9 = EClass.game.cards.globalCharas.Where((KeyValuePair<int, Chara> a) => a.Value.isDead && a.Value.faction == EClass.pc.faction && !a.Value.isSummon && a.Value.c_wasInPcParty).ToList(); 
		if (TC.IsPCFaction || TC.IsPCFactionMinion)
		{
			if (TC.IsPC && list8.Count == 0) 
			if (TC.IsPC && list9.Count == 0) 
			{
				list8 = EClass.game.cards.globalCharas.Where((KeyValuePair<int, Chara> a) => a.Value.CanRevive() && a.Value.isDead && a.Value.faction == EClass.pc.faction && !a.Value.isSummon).ToList(); 
				list9 = EClass.game.cards.globalCharas.Where((KeyValuePair<int, Chara> a) => a.Value.CanRevive() && a.Value.isDead && a.Value.faction == EClass.pc.faction && !a.Value.isSummon).ToList(); 
			}
			if (list8.Count > 0) 
			if (list9.Count > 0) 
			{
				list8.RandomItem().Value.Chara.GetRevived(); 
				list9.RandomItem().Value.Chara.GetRevived(); 
				break;
			}
		}

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

cs
	{
		bool flag12 = id == EffectId.DamageBody || id == EffectId.DamageBodyGreat;
		bool mind2 = id == EffectId.DamageMind || id == EffectId.DamageMindGreat;
		int num11 = ((id == EffectId.DamageBody || id == EffectId.DamageMind) ? 1 : (4 + EClass.rnd(4))); 
		int num15 = ((id == EffectId.DamageBody || id == EffectId.DamageMind) ? 1 : (4 + EClass.rnd(4))); 
		if (id == EffectId.Weaken)
		{
			flag12 = EClass.rnd(2) == 0;
			mind2 = !flag12;
			num11 = 1; 
			num15 = 1; 
		}
		else
		{

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

cs
			TC.PlaySound("debuff");
		}
		TC.Say(flag12 ? "damageBody" : "damageMind", TC);
		for (int l = 0; l < num11; l++) 
		for (int m = 0; m < num15; m++) 
		{
			TC.DamageTempElements(power, flag12, mind2, id != EffectId.Weaken);
		}

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

cs
	case EffectId.RestoreBody:
	case EffectId.RestoreMind:
	{
		bool flag10 = id == EffectId.RestoreBody; 
		bool flag11 = id == EffectId.RestoreBody; 
		if (flag)
		{
			Redirect(flag10 ? EffectId.DamageBodyGreat : EffectId.DamageMindGreat, BlessedState.Normal, default(ActRef)); 
			Redirect(flag11 ? EffectId.DamageBodyGreat : EffectId.DamageMindGreat, BlessedState.Normal, default(ActRef)); 
			break;
		}
		TC.Say(flag10 ? "restoreBody" : "restoreMind", TC); 
		TC.Say(flag11 ? "restoreBody" : "restoreMind", TC); 
		TC.PlaySound("heal");
		TC.PlayEffect("heal");
		TC.CureHost(flag10 ? CureType.CureBody : CureType.CureMind, power, state); 
		TC.CureHost(flag11 ? CureType.CureBody : CureType.CureMind, power, state); 
		if (blessed)
		{
			Redirect(flag10 ? EffectId.EnhanceBodyGreat : EffectId.EnhanceMindGreat, BlessedState.Normal, default(ActRef)); 
			Redirect(flag11 ? EffectId.EnhanceBodyGreat : EffectId.EnhanceMindGreat, BlessedState.Normal, default(ActRef)); 
		}
		break;
	}

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

cs
		{
			EClass.game.religions.Healing.Talk("ability");
		}
		int num10 = Dice.Create((actRef.act != null && EClass.sources.calc.map.ContainsKey(actRef.act.ID)) ? actRef.act.ID : "SpHealLight", power, CC, (actRef.refThing != null) ? null : actRef.act).Roll(); 
		int num9 = Dice.Create((actRef.act != null && EClass.sources.calc.map.ContainsKey(actRef.act.ID)) ? actRef.act.ID : "SpHealLight", power, CC, (actRef.refThing != null) ? null : actRef.act).Roll(); 
		if (actRef.refThing != null)
		{
			num10 = num10 * (100 + actRef.refThing.Evalue(750) * 10) / 100; 
			num9 = num9 * (100 + actRef.refThing.Evalue(750) * 10) / 100; 
		}
		if (flag)
		{
			TC.DamageHP(num10 / 2, 919, power); 
			TC.DamageHP(num9 / 2, 919, power); 
			break;
		}
		TC.HealHPHost(num10, (actRef.refThing == null && id != EffectId.JureHeal) ? HealSource.Magic : HealSource.Item); 
		TC.HealHPHost(num9, (actRef.refThing == null && id != EffectId.JureHeal) ? HealSource.Magic : HealSource.Item); 
		TC.CureHost(CureType.Heal, power, state);
		TC.Say((power >= 300) ? "heal_heavy" : "heal_light", TC);
		break;

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

cs
			TC.ModCorruption(-power * (blessed ? 150 : 200) / 100);
		}
		break;
	case EffectId.Degenerate:
	{ 
		if (TC == null || TC.HasCondition<ConTransmuteHuman>()) 
		{ 
			CC.SayNothingHappans(); 
			break; 
		} 
		Chara chara = CharaGen.Create("baby"); 
		if (!TC.Aka.IsEmpty()) 
		{ 
			chara.c_altName = TC.c_altName ?? TC.source.GetName(TC); 
		} 
		TC.AddCondition(Condition.Create(power, delegate(ConTransmuteHuman con) 
		{ 
			con.chara = chara; 
		})); 
		break; 
	} 
	case EffectId.Drink:
	case EffectId.DrinkRamune:
	case EffectId.DrinkMilk:

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

cs
		if (TC.HasElement(1211))
		{
			TC.Say("drinkSaltWater_snail", TC);
			int num9 = ((TC.hp > 10) ? (TC.hp - EClass.rnd(10)) : 10000); 
			TC.DamageHP(num9, AttackSource.None, CC); 
			int num14 = ((TC.hp > 10) ? (TC.hp - EClass.rnd(10)) : 10000); 
			TC.DamageHP(num14, AttackSource.None, CC); 
		}
		else if (TC.IsPC)
		{

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

cs
		{
			power /= 4;
		}
		List<Thing> list6 = TC.things.List((Thing t) => (t.Num <= 1 && t.IsEquipmentOrRanged && !t.IsToolbelt && !t.IsLightsource && t.isEquipped) ? true : false); 
		if (list6.Count != 0) 
		List<Thing> list7 = TC.things.List((Thing t) => (t.Num <= 1 && t.IsEquipmentOrRanged && !t.IsToolbelt && !t.IsLightsource && t.isEquipped) ? true : false); 
		if (list7.Count != 0) 
		{
			Thing thing6 = list6.RandomItem(); 
			Thing thing6 = list7.RandomItem(); 
			TC.Say("acid_hit", TC);
			if (thing6.isAcidproof)
			{

Affinity

public bool CanInvite()

cs
		return true;
	}

	public bool CanBecomeMama() 
	{ 
		return CurrentStage >= Stage.Respected; 
	} 
	public bool CanGiveCard()
	{
		return CurrentStage >= Stage.Love;

Card

public void DamageHP(long dmg, int ele, int eleP = 100, AttackSource attackSourc

cs
		dmg = 0L;
	}
	long num9 = 99999999L;
	ConStrife condition = GetCondition<ConStrife>(); 
	if (condition != null) 
	if (origin != null && (attackSource == AttackSource.Melee || attackSource == AttackSource.Range)) 
	{
		num9 = num9 * (100 + condition.lv * 5) / 100; 
		ConStrife condition = origin.GetCondition<ConStrife>(); 
		if (condition != null) 
		{ 
			num9 = num9 * (100 + condition.lv * 5) / 100; 
		} 
	}
	if (dmg > num9)
	{

public void DamageHP(long dmg, int ele, int eleP = 100, AttackSource attackSourc

cs
							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_1092; 
						goto IL_10b3; 
					}
				}
				if (zoneInstanceBout != null && (bool)LayerDrama.Instance)

public void DamageHP(long dmg, int ele, int eleP = 100, AttackSource attackSourc

cs
						if (EClass.player.invlunerable)
						{
							EvadeDeath(null);
							goto IL_1092; 
							goto IL_10b3; 
						}
					}
					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

cs
			}
		}
	}
	goto IL_1092; 
	IL_1092: 
	goto IL_10b3; 
	IL_10b3: 
	if (trait.CanBeAttacked)
	{
		renderer.PlayAnime(AnimeID.HitObj);

void ProcAbsorb()

cs
	{
		if (origin != null && origin.isChara && isChara && (weapon == null || !weapon.HasElement(486)))
		{
			int valueOrDefault = (origin.Evalue(662) + weapon?.Evalue(662, ignoreGlobalElement: true)).GetValueOrDefault(); 
			int valueOrDefault2 = (origin.Evalue(661) + weapon?.Evalue(661, ignoreGlobalElement: true)).GetValueOrDefault(); 
			if (valueOrDefault > 0 && attackSource == AttackSource.Melee && origin.isChara && !origin.Chara.ignoreSPAbsorb && Chara.IsHostile(origin as Chara)) 
			int num18 = origin.Evalue(662) + (weapon?.Evalue(662, ignoreGlobalElement: true) ?? 0); 
			int num19 = origin.Evalue(661) + (weapon?.Evalue(661, ignoreGlobalElement: true) ?? 0); 
			if (num18 != 0) 
			{ 
				Debug.Log(num18); 
			} 
			if (num18 > 0 && attackSource == AttackSource.Melee && origin.isChara && !origin.Chara.ignoreSPAbsorb && Chara.IsHostile(origin as Chara)) 
			{
				int num18 = EClass.rnd(3 + (int)Mathf.Clamp(dmg / 100, 0f, valueOrDefault / 10)); 
				origin.Chara.stamina.Mod(num18); 
				int num20 = EClass.rnd(3 + (int)Mathf.Clamp(dmg / 100, 0f, num18 / 10)); 
				origin.Chara.stamina.Mod(num20); 
				if (IsAliveInCurrentZone)
				{
					Chara.stamina.Mod(-num18); 
					Chara.stamina.Mod(-num20); 
				}
			}
			if (origin.HasElement(1350) && attackSource == AttackSource.Melee)
			{
				int num19 = EClass.rndHalf(2 + (int)Mathf.Clamp(dmg / 10, 0f, origin.Chara.GetPietyValue() + 10)); 
				origin.Chara.mana.Mod(num19); 
				int num21 = EClass.rndHalf(2 + (int)Mathf.Clamp(dmg / 10, 0f, origin.Chara.GetPietyValue() + 10)); 
				origin.Chara.mana.Mod(num21); 
				if (IsAliveInCurrentZone)
				{
					Chara.mana.Mod(-num19); 
					Chara.mana.Mod(-num21); 
				}
			}
			if (valueOrDefault2 > 0 && attackSource == AttackSource.Melee) 
			if (num19 > 0 && attackSource == AttackSource.Melee) 
			{
				int num20 = EClass.rnd(2 + (int)Mathf.Clamp(dmg / 10, 0f, valueOrDefault2 + 10)); 
				origin.Chara.mana.Mod(num20); 
				int num22 = EClass.rnd(2 + (int)Mathf.Clamp(dmg / 10, 0f, num19 + 10)); 
				origin.Chara.mana.Mod(num22); 
				if (IsAliveInCurrentZone)
				{
					Chara.mana.Mod(-num20); 
					Chara.mana.Mod(-num22); 
				}
			}
		}

public void SpawnLoot(Card origin)

cs
					}
				}
			}
			if (trait is TraitMerchantTravel) 
			if (trait is TraitMerchantTravel && !EClass._zone.IsFestival) 
			{
				trait.OnBarter();
				Thing thing4 = things.Find<TraitChestMerchant>();

public void Talk(string idTopic, string ref1 = null, string ref2 = null, bool fo

cs
	GameLang.refDrama1 = ref1;
	GameLang.refDrama2 = ref2;
	string text = GetTalkText(idTopic, stripPun: true);
	if (HasElement(1232) && idTopic != "baby") 
	ConTransmuteHuman condition = GetCondition<ConTransmuteHuman>(); 
	if ((HasElement(1232) || (condition != null && condition.IsBaby)) && idTopic != "baby") 
	{
		BackerContent.GakiConvert(ref text, "babu");
	}
	else
	{
		switch (id) 
		switch ((condition != null) ? condition.chara.id : id) 
		{
		case "adv_gaki":
			BackerContent.GakiConvert(ref text);

public void Say(string lang, Card c1, string ref1 = null, string ref2 = null)

cs
public string GetTalkText(string idTopic, bool stripPun = false, bool useDefault = true)
{
	bool flag = isChara && Chara.IsHumanSpeak;
	string text = MOD.listTalk.GetTalk(c_idTalk.IsEmpty(id), idTopic, useDefault, flag); 
	ConTransmuteHuman condition = GetCondition<ConTransmuteHuman>(); 
	string text = MOD.listTalk.GetTalk((condition != null) ? condition.chara.id : c_idTalk.IsEmpty(id), idTopic, useDefault, flag); 
	if (!text.IsEmpty())
	{
		text = text.Split('|').RandomItem();

CardActor

public virtual void OnRender(RenderParam p)

cs
			mpb2.SetFloat("_Liquid", destLiquid);
			sr2.SetPropertyBlock(mpb2);
		}
		if (owner.sourceCard.replacer.data == null) 
		SpriteReplacer replacer = owner.sourceCard.replacer; 
		if (!replacer.HasSprite(owner.sourceCard.idSprite, data)) 
		{
			return;
		}
		SpriteData data2 = owner.sourceCard.replacer.data; 
		if (data2.frame <= 1) 
		SpriteData spriteData = replacer.data; 
		if (p.snow && replacer.suffixes.TryGetValue("_snow", out var value)) 
		{ 
			spriteData = value; 
		} 
		if (spriteData.frame <= 1) 
		{
			return;
		}
		spriteTimer += Core.delta;
		if (spriteTimer >= data2.time) 
		if (spriteTimer >= spriteData.time) 
		{
			spriteTimer -= data2.time; 
			spriteTimer -= spriteData.time; 
			spriteIndex++;
			if (spriteIndex >= data2.frame) 
			if (spriteIndex >= spriteData.frame) 
			{
				spriteIndex = 0;
			}
			sr.sprite = ((data2.spritesSnow != null && p.snow) ? data2.spritesSnow[spriteIndex] : data2.sprites[spriteIndex]); 
			sr.sprite = spriteData.GetSprites()[spriteIndex]; 
		}
	}

CardRenderer

public SourcePref GetPref()

cs
		{
			return EClass.core.refs.prefs.pcc;
		}
		if (owner.sourceCard.replacer?.data?.pref != null) 
		{ 
			return owner.sourceCard.replacer.data.pref; 
		} 
		return owner.Pref;
	}
}

Chara

public override Sprite GetSprite(int dir = 0)

cs
			pCC.Build();
			return pCC.variation.idle[0, 0];
		}
		if (spriteReplacer != null) 
		int skin = 0; 
		if (sourceCard.tiles.Length > 1) 
		{
			return spriteReplacer.data.GetSprite(); 
			skin = ((base.idSkin == 0 && !source.staticSkin) ? (base.uid % sourceCard.tiles.Length / 2 * 2 + ((!base.IsMale) ? 1 : 0)) : base.idSkin); 
		}
		return sourceCard.GetSprite(0, (sourceCard._tiles.Length > 1) ? ((base.idSkin != 0 || source.staticSkin) ? base.idSkin : (base.uid % sourceCard._tiles.Length / 2 * 2 + ((!base.IsMale) ? 1 : 0))) : 0); 
		return sourceCard.GetSprite(0, skin, EClass.core.IsGameStarted && EClass._zone.IsSnowCovered); 
	}

	public void SetTempHand(int right = 0, int left = 0)

public override string GetHoverText2()

cs

	public string GetTopicText(string topic = "calm")
	{
		string key = source.idText.IsEmpty(id); 
		ConTransmuteHuman condition = GetCondition<ConTransmuteHuman>(); 
		string key = ((condition == null) ? source : condition.chara.source).idText.IsEmpty((condition == null) ? id : condition.chara.id); 
		if (id == "littleOne" && EClass._zone is Zone_LittleGarden)
		{
			key = "littleOne2";

ConStrife

public class ConStrife : BaseBuff

cs
public class ConStrife : BaseBuff
{
	[JsonProperty]
	private ElementContainer ec = new ElementContainer(); 
	private ElementContainer ec = new ElementContainerCondition(); 

	[JsonProperty]
	public int exp;

public override void OnWriteNote(List<string> list)

cs
	list.Add("hintStrife2".lang((lv * 10).ToString() ?? "", (lv * 5).ToString() ?? "").TagColorGoodBad(() => true));
	foreach (Element e in ec.dict.Values)
	{
		if (e.Value == 0) 
		{ 
			continue; 
		} 
		if (e.IsFlag)
		{
			list.Add(e.Name.TagColorGoodBad(() => e.Value >= 0));

ConTransmuteHuman

public class ConTransmuteHuman : ConBaseTransmuteMimic

cs

	public override Card Card => chara;

	public bool IsBaby => chara.HasElement(1232); 
	public override bool HasDuration => false;

	public override bool ShouldRevealOnContact => false;

public override RendererReplacer GetRendererReplacer()

cs

	public override void OnBeforeStart()
	{
		List<Chara> list = owner.pos.ListCharasInRadius(owner, 5, delegate(Chara c) 
		if (chara == null) 
		{
			if (c.IsHumanSpeak) 
			List<Chara> list = owner.pos.ListCharasInRadius(owner, 5, delegate(Chara c) 
			{
				CardRenderer renderer = c.renderer; 
				if (renderer != null && !renderer.hasActor) 
				if (c.IsHumanSpeak) 
				{
					return !c.HasElement(1427); 
					CardRenderer renderer = c.renderer; 
					if (renderer != null && !renderer.hasActor) 
					{ 
						return !c.HasElement(1427); 
					} 
				}
				return false; 
			}); 
			if (list.Count > 0) 
			{ 
				chara = list.RandomItem().Duplicate(); 
			} 
			else
			{ 
				chara = CharaGen.CreateFromFilter("c_guest"); 
			}
			return false; 
		}); 
		if (list.Count > 0) 
		{ 
			chara = list.RandomItem().Duplicate(); 
		} 
		else
		{ 
			chara = CharaGen.CreateFromFilter("c_guest"); 
		}
		base.OnBeforeStart();
	}

Core

public void OnApplicationFocus(bool focus)

cs
					}
					foreach (CardRow row in sources.cards.rows)
					{
						if (row.replacer.isChecked && row.replacer.data != null) 
						if (row.replacer.isChecked.GetValueOrDefault(row.idSprite) && row.replacer.data != null) 
						{
							row.replacer.data.GetSprite();
						}

DramaCustomSequence

public void Build(Chara c)

cs
			{
				Choice2(flag2 ? "daBird" : "daTail", "_tail");
			}
			ConTransmuteHuman condition = EClass.pc.GetCondition<ConTransmuteHuman>(); 
			if (condition != null && condition.IsBaby) 
			{ 
				Choice2("daMama", "_mama"); 
			} 
			if (c.trait.CanRevive)
			{
				Choice2("daRevive", "_revive").DisableSound();

public void Build(Chara c)

cs
		});
		Choice("no2", StepDefault, cancel: true).SetOnClick(RumorChill);
	});
	Step("_mama"); 
	Method(delegate
	{ 
		if (c.affinity.CanBecomeMama() || EClass.debug.enable) 
		{ 
			TempTalkTopic("mama_yes", StepEnd); 
			EClass.pc.SetAI(new AI_Fuck
			{ 
				target = c, 
				variation = AI_Fuck.Variation.MotherMilk 
			}); 
		} 
		else
		{ 
			TempTalkTopic("mama_no", StepDefault); 
			RumorChill(); 
		} 
	}); 
	Step("_whore");
	Method(delegate
	{

EffectId

public enum EffectId

cs
	SilverCatMigration = 314,
	ChangeRarity = 315,
	ChangeAlias = 316,
	ChangeBiography = 317
	ChangeBiography = 317, 
	Degenerate = 318
}

RenderRow

public int ConvertTile(int tile)

cs

	public Sprite GetSprite(int dir = 0, int skin = 0, bool snow = false)
	{
		bool flag = this is SourceChara.Row; 
		if (replacer.HasSprite(idSprite, renderData))
		{
			return replacer.data.GetSprite(snow); 
			foreach (string item in new List<string> 
			{ 
				$"_skin{skin}_dir{dir}", 
				$"_skin{skin}", 
				$"_dir{dir}", 
				""
			}) 
			{ 
				Sprite sprite = null; 
				if (snow) 
				{ 
					sprite = replacer.GetSprite(item + "_snow"); 
				} 
				if ((object)sprite == null) 
				{ 
					sprite = replacer.GetSprite(item); 
				} 
				if ((bool)sprite) 
				{ 
					return sprite; 
				} 
			} 
		}
		int[] array = null ?? _tiles;
		if (sprites == null)
		{
			sprites = new Sprite[(skins == null) ? 1 : (skins.Length + 1), (array.Length == 0) ? 1 : array.Length];
		}
		if (this is SourceChara.Row) 
		if (flag) 
		{
			dir = skin;
			skin = 0;

SpriteData

using System;

cs
using System;
using System.Globalization; 
using System.IO;
using System.Text;
using IniParser;

``

cs

public class SpriteData
{
	public DateTime date; 
	public Texture2D tex; 
	public Texture2D texSnow; 
	public string id; 

	public string path;

	public Sprite[] sprites; 
	public Texture2D tex; 

	public Sprite[] spritesSnow; 
	public Sprite[] sprites; 

	public SourcePref pref; 
	public DateTime date; 

	public int frame = 1;

public class SpriteData

cs

	public float time = 0.2f;

	public SourcePref pref; 
	public void Init()
	{
		try
		{
			if (File.Exists(path + ".ini")) 
			{ 
				IniData iniData = new FileIniDataParser().ReadFile(path + ".ini", Encoding.UTF8); 
				frame = int.Parse(iniData.GetKey("frame") ?? "1"); 
				scale = int.Parse(iniData.GetKey("scale") ?? "50"); 
				time = float.Parse(iniData.GetKey("time") ?? "0.2", CultureInfo.InvariantCulture); 
			} 
			id = Path.GetFileNameWithoutExtension(path); 
			LoadAnimationIni(); 
			LoadPref(); 
		}
		catch (Exception message) 
		catch (Exception exception) 
		{
			Debug.Log(message); 
			Debug.Log("exception: Failed to parse:" + path + ".ini"); 
			time = 0.2f; 
			scale = 50; 
			Debug.LogException(exception); 
			Debug.LogError("#sprite failed to init '" + id + "' at " + path); 
		}
	}

	public Sprite[] GetSprites() 
	{ 
		Validate(); 
		return sprites; 
	} 
	public void LoadPref()
	{
		pref = null;

public void LoadPref()

cs
		}
	}

	public Sprite GetSprite(bool snow = false) 
	public void LoadAnimationIni() 
	{
		Validate(); 
		if (!snow || spritesSnow == null) 
		if (!File.Exists(path + ".ini")) 
		{
			return sprites[0]; 
			return; 
		}
		return spritesSnow[0]; 
		try
		{ 
			IniData iniData = new FileIniDataParser().ReadFile(path + ".ini", Encoding.UTF8); 
			if (!int.TryParse(iniData.GetKey("frame") ?? "1", out frame)) 
			{ 
				frame = 1; 
			} 
			if (!int.TryParse(iniData.GetKey("scale") ?? "50", out scale)) 
			{ 
				scale = 50; 
			} 
			if (!float.TryParse(iniData.GetKey("time") ?? "0.2", out time)) 
			{ 
				time = 0.2f; 
			} 
		} 
		catch (Exception exception) 
		{ 
			Debug.LogException(exception); 
			frame = 1; 
			scale = 50; 
			time = 0.2f; 
		} 
	} 
	public Sprite[] GetSprites() 
	{ 
		Validate(); 
		return sprites; 
	} 
	public Sprite GetSprite() 
	{ 
		Validate(); 
		return sprites[0]; 
	}

	public void Validate()
	{
		DateTime lastWriteTime = File.GetLastWriteTime(path + ".png");
		bool flag = date.Year != 1 && date == lastWriteTime; 
		if (!flag) 
		if (date.Year == 1 || !(date == lastWriteTime)) 
		{
			Load(flag, ref tex, ref sprites, ""); 
			if (File.Exists(path + "_snow.png")) 
			{ 
				Load(flag, ref texSnow, ref spritesSnow, "_snow"); 
			} 
			Load(); 
			date = lastWriteTime;
		}
	}

	public void Load(bool dateMatched, ref Texture2D tex, ref Sprite[] sprites, string suffix) 
	public void Load() 
	{
		if (dateMatched && (bool)tex) 
		{ 
			return; 
		} 
		if ((bool)tex)
		{
			Texture2D texture2D = IO.LoadPNG(path + suffix + ".png"); 
			if (texture2D.width != tex.width || texture2D.height != tex.height) 
			{ 
				Debug.Log(texture2D.width + "/" + texture2D.height + "/" + path); 
				tex.Reinitialize(texture2D.width, texture2D.height); 
			} 
			tex.SetPixels32(texture2D.GetPixels32()); 
			tex.Apply(); 
			UnityEngine.Object.Destroy(texture2D); 
			UnityEngine.Object.Destroy(tex); 
		}
		else
		tex = IO.LoadPNG(path + ".png"); 
		Debug.Log(tex.width + "/" + tex.height + "/" + path); 
		int num = tex.width / frame; 
		int height = tex.height; 
		sprites = new Sprite[frame]; 
		Vector2 pivot = new Vector2(0.5f, 0.5f); 
		for (int i = 0; i < frame; i++) 
		{
			tex = IO.LoadPNG(path + suffix + ".png"); 
			int num = tex.width / frame; 
			int height = tex.height; 
			sprites = new Sprite[frame]; 
			for (int i = 0; i < frame; i++) 
			{ 
				sprites[i] = Sprite.Create(tex, new Rect(i * num, 0f, num, height), new Vector2(0.5f, 0.5f), 100f, 0u, SpriteMeshType.FullRect); 
			} 
			sprites[i] = Sprite.Create(tex, new Rect(i * num, 0f, num, height), pivot, 100f, 0u, SpriteMeshType.FullRect); 
		}
		LoadPref(); 
	}
}

SpriteReplacer

public class SpriteReplacer

cs

	public static Dictionary<string, string> dictModItems = new Dictionary<string, string>();

	public bool isChecked; 
	public SpriteData data;

	public Dictionary<string, SpriteData> suffixes = new Dictionary<string, SpriteData>(); 
	public Dictionary<string, bool> isChecked = new Dictionary<string, bool>(); 
	public static Dictionary<string, SpriteReplacer> ListSkins()
	{
		List<string> list = new List<string>();

public static Dictionary<string, SpriteReplacer> ListSkins()

cs
		{
			dictSkins.Remove(item);
		}
		FileInfo[] files = new DirectoryInfo(CorePath.custom + "Skin").GetFiles(); 
		FileInfo[] files = new DirectoryInfo(CorePath.custom + "Skin").GetFiles("*.png"); 
		foreach (FileInfo fileInfo in files)
		{
			if (fileInfo.Extension == ".png") 
			string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName); 
			if (!dictSkins.ContainsKey(fileNameWithoutExtension)) 
			{
				string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName); 
				if (!dictSkins.ContainsKey(fileNameWithoutExtension)) 
				SpriteReplacer spriteReplacer = new SpriteReplacer(); 
				spriteReplacer.data = new SpriteData
				{
					SpriteReplacer spriteReplacer = new SpriteReplacer(); 
					spriteReplacer.data = new SpriteData
					{ 
						path = fileInfo.GetFullFileNameWithoutExtension() 
					}; 
					spriteReplacer.data.Init(); 
					dictSkins.Add(fileNameWithoutExtension, spriteReplacer); 
				} 
					path = fileInfo.GetFullFileNameWithoutExtension() 
				}; 
				spriteReplacer.data.Init(); 
				dictSkins.Add(fileNameWithoutExtension, spriteReplacer); 
			}
		}
		return dictSkins;
	}

	public bool HasSprite(string id, RenderData renderData = null) 
	public Sprite GetSprite(string suffix = "") 
	{
		if (!isChecked) 
		if (!suffixes.TryGetValue(suffix, out var value)) 
		{
			try
			return null; 
		} 
		return value.GetSprite(); 
	} 
	public void Reload(string id, RenderData renderData = null) 
	{ 
		data = null; 
		suffixes.Clear(); 
		try
		{ 
			if (dictModItems.ContainsKey(id)) 
			{
				if (dictModItems.ContainsKey(id)) 
				foreach (var (text3, path) in dictModItems) 
				{
					Debug.Log(id + ":" + dictModItems[id]); 
					data = new SpriteData
					{ 
						path = dictModItems[id] 
					}; 
					data.Init(); 
				} 
				else
				{ 
					string text = CorePath.packageCore + "Texture/Item/" + id; 
					if (!File.Exists(text + ".png") && renderData != null) 
					{ 
						text = CorePath.packageCore + "Texture/Item/" + renderData.name; 
					} 
					if (File.Exists(text + ".png")) 
					if (text3.StartsWith(id)) 
					{
						data = new SpriteData
						string text4 = text3[id.Length..]; 
						SpriteData spriteData = new SpriteData
						{
							path = text 
							path = path 
						};
						data.Init(); 
						spriteData.Init(); 
						suffixes[text4] = spriteData; 
						Debug.Log("#sprite replacer init '" + text4 + "' at " + path.ShortPath()); 
					}
				}
				isChecked = true; 
				data = suffixes.TryGetValue(""); 
			}
			catch (Exception ex) 
			else 
			{
				Debug.Log("Error during fetching spirte:" + ex); 
				string text5 = CorePath.packageCore + "Texture/Item/" + id; 
				if (!File.Exists(text5 + ".png") && renderData != null) 
				{ 
					text5 = CorePath.packageCore + "Texture/Item/" + renderData.name; 
				} 
				if (File.Exists(text5 + ".png")) 
				{ 
					data = new SpriteData
					{ 
						path = text5 
					}; 
					data.Init(); 
					suffixes[""] = data; 
				} 
			}
			if (data != null) 
			{ 
				Debug.Log(id + ":" + data.path); 
			} 
		} 
		catch (Exception ex) 
		{ 
			Debug.LogError("#sprite error fetching sprite replacer:" + ex); 
		} 
		isChecked[id] = true; 
	} 
	public bool HasSprite(string id, RenderData renderData = null) 
	{ 
		if (!isChecked.GetValueOrDefault(id) || (data != null && data.id != id)) 
		{ 
			Reload(id, renderData); 
		}
		return data != null;
	}

Trait

public void OnBarter(bool reroll = false)

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

public void OnBarter(bool reroll = false)

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

public void OnBarter(bool reroll = false)

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

public void OnBarter(bool reroll = false)

cs
		break;
	case ShopType.RedBook:
	{
		for (int num8 = 0; num8 < 30; num8++) 
		for (int num9 = 0; num9 < 30; num9++) 
		{
			AddThing(ThingGen.CreateFromFilter("shop_seeker"));
		}
		break;
	}
	case ShopType.TravelMerchant2:
	{ 
		int seed = EClass.game.seed + EClass._zone.uid + EClass.world.date.year * 12 + EClass.world.date.month; 
		Add("tool_talisman", 1, 0);
		Add("camera", 1, 0);
		Add("dreambug", EClass.rndHalf(10), 0);

public void OnBarter(bool reroll = false)

cs
		Add("block_kiwi", EClass.rndHalf(6), 0);
		Add("block_peach", EClass.rndHalf(6), 0);
		Add("water", 1, 0);
		if (EClass.rndSeed(EClass.debug.enable ? 1 : 5, owner.uid) == 0) 
		if (EClass.rndSeed(EClass.debug.enable ? 1 : 5, seed) == 0) 
		{
			Add("hammer_garokk", 1, 0);
		}
		if (EClass.rndSeed(EClass.debug.enable ? 1 : 100, owner.uid) == 0) 
		if (EClass.rndSeed(EClass.debug.enable ? 1 : 100, seed) == 0) 
		{
			Add("water_jure", 1, 0);
		}
		break;
	} 
	case ShopType.KeeperOfGarden:
	{
		string[] array2 = new string[11]

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 num9 = 0; num9 < EClass.rnd(3) + 1; num9++) 
		for (int num10 = 0; num10 < EClass.rnd(3) + 1; num10++) 
		{
			Add("462", 1, 0);
		}
		for (int num10 = 0; num10 < EClass.rnd(3) + 1; num10++) 
		for (int num11 = 0; num11 < EClass.rnd(3) + 1; num11++) 
		{
			Add("1167", 1, 0);
		}

public void OnBarter(bool reroll = false)

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

public void OnBarter(bool reroll = false)

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

public void OnBarter(bool reroll = false)

cs
				case ShopType.TravelMerchant:
				case ShopType.TravelMerchant2:
					num2 /= 3f;
					if (num2 < 12f) 
					{ 
						num2 = 12f; 
					} 
					num3 = 30;
					break;
				}

public void OnBarter(bool reroll = false)

cs
				num2 = Mathf.Min(num2, num3);
				for (int j = 0; (float)j < num2; j++)
				{
					if (ShopType == ShopType.TravelMerchant) 
					{ 
						int num4 = EClass.game.seed + (EClass.world.date.year * 12 + EClass.world.date.month) * 30 + EClass._zone.uid; 
						Rand.SetBaseSeed(num4 + j); 
						Rand.SetSeed(num4 + j); 
					} 
					Thing thing = CreateStock();
					Rand.SetBaseSeed(); 
					Rand.SetSeed(); 
					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)
					{
						bool tryStack = true;

public void OnBarter(bool reroll = false)

cs
				break;
			case ShopType.Moyer:
			{
				for (int num13 = 1; num13 <= 20; num13++) 
				for (int num14 = 1; num14 <= 20; num14++) 
				{
					AddAdvWeek(num13); 
					AddAdvWeek(num14); 
				}
				break;
			}
			case ShopType.StrangeGirl:
			{
				int num14 = (EClass.debug.enable ? 20 : (EClass._zone.development / 10)); 
				if (num14 > 0) 
				int num15 = (EClass.debug.enable ? 20 : (EClass._zone.development / 10)); 
				if (num15 > 0) 
				{
					Add("syringe_gene", num14, 0); 
					Add("syringe_gene", num15, 0); 
					Add("diary_little", 1, 0);
				}
				if (num14 > 10) 
				if (num15 > 10) 
				{
					Add("syringe_heaven", num14 / 5, 0); 
					Add("syringe_heaven", num15 / 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 num11 = 0; num11 < 3; num11++) 
				for (int num12 = 0; num12 < 3; num12++) 
				{
					if (EClass.rnd(5) == 0)
					{
						TreasureType treasureType = ((EClass.rnd(10) == 0) ? TreasureType.BossNefia : ((EClass.rnd(10) == 0) ? TreasureType.Map : TreasureType.RandomChest));
						int num12 = EClass.rnd(EClass.rnd(ShopLv + (EClass.debug.enable ? 200 : 50)) + 1) + 1; 
						int num13 = 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 = num12; 
						thing6.c_priceAdd = 2000 + num12 * 250 * ((treasureType == TreasureType.RandomChest) ? 1 : 5); 
						thing6.c_lockLv = num13; 
						thing6.c_priceAdd = 2000 + num13 * 250 * ((treasureType == TreasureType.RandomChest) ? 1 : 5); 
						thing6.c_revealLock = true;
						ThingGen.CreateTreasureContent(thing6, num12, treasureType, clearContent: true); 
						ThingGen.CreateTreasureContent(thing6, num13, treasureType, clearContent: true); 
						AddThing(thing6);
					}
				}

public void OnBarter(bool reroll = false)

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

public void OnBarter(bool reroll = false)

cs
				AddThing(ThingGen.CreatePotion(8791).SetNum(3 + EClass.rnd(3)));
				AddThing(ThingGen.CreatePotion(8792).SetNum(3 + EClass.rnd(3)));
				AddThing(ThingGen.CreatePotion(8794).SetNum(3 + EClass.rnd(3)));
				Add("1341", EClass.rndHalf(5), 0); 
				break;
			case "girl_blue":
				Add("779", 1 + EClass.rnd(3), 0);

public void OnBarter(bool reroll = false)

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

TraitMerchantTravel

public override int ShopLv

cs
			{
				return base.ShopLv;
			}
			return EClass.pc.FameLv * 2 + 10; 
			return EClass.pc.FameLv + EClass.pc.FameLv / 2 + 10; 
		}
	}