Skip to content

EA 23.238 Nightly

November 21, 2025

13 files modified.

Important Changes

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

CraftUtil (1)

cs
public static Thing MakeBloodMeal(Chara sucker, Chara feeder) 
public static string GetBloodText(Chara c) 

AI_Fish

public override void OnProgressComplete()

cs
				}
			}
		}
		else
		else if (!owner.IsPCParty) 
		{
			foreach (Thing item in owner.things.List((Thing t) => t.source._origin == "fish"))
			{

ActEffect

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

cs
		{
			break;
		}
		int num8 = 0; 
		int num12 = 0; 
		foreach (Condition condition5 in TC.conditions)
		{
			if (condition5.Type == ConditionType.Debuff)
			{
				num8++; 
				num12++; 
			}
		}
		if (num8 == 0) 
		if (num12 == 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> list5 = TC.pos.ListCharasInRadius(TC, 4, (Chara c) => c == TC || c.IsHostile(CC)); 
		for (int l = 0; l < num8; l++) 
		List<Chara> list9 = TC.pos.ListCharasInRadius(TC, 4, (Chara c) => c == TC || c.IsHostile(CC)); 
		for (int m = 0; m < num12; m++) 
		{
			TweenUtil.Delay((float)l * 0.1f, delegate
			TweenUtil.Delay((float)m * 0.1f, delegate 
			{
				center.PlaySound("shutterhex");
			});
			foreach (Chara item5 in list5) 
			foreach (Chara item5 in list9) 
			{
				if (item5.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 = item5.pos.Copy();
					TweenUtil.Delay((float)l * 0.1f, delegate
					TweenUtil.Delay((float)m * 0.1f, delegate 
					{
						effect.Play(center, 0f, pos);
					});
					int num9 = Dice.Create("SpShutterHex", power, CC, (actRef.refThing != null) ? null : actRef.act).Roll(); 
					item5.DamageHP(num9, 919, power, AttackSource.None, CC, showEffect: false); 
					int num13 = Dice.Create("SpShutterHex", power, CC, (actRef.refThing != null) ? null : actRef.act).Roll(); 
					item5.DamageHP(num13, 919, power, AttackSource.None, CC, showEffect: false); 
				}
			}
		}

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

cs
			TC.Say((actRef.n1 == "money") ? "abStealNegateMoney" : "abStealNegate", TC);
			break;
		}
		Thing thing4 = null; 
		bool flag9 = actRef.n1 == "food"; 
		Thing thing5 = null; 
		bool flag7 = actRef.n1 == "food"; 
		if (actRef.n1 == "money")
		{
			int currency = TC.GetCurrency();
			if (currency > 0)
			{
				currency = Mathf.Clamp(EClass.rnd(currency / 10), 1, 100 + EClass.rndHalf(CC.LV * 200));
				thing4 = ThingGen.Create("money").SetNum(currency); 
				thing5 = ThingGen.Create("money").SetNum(currency); 
				TC.ModCurrency(-currency);
			}
		}
		else
		{
			Func<Thing, bool> func = (Thing t) => true;
			if (flag9) 
			if (flag7) 
			{
				func = (Thing t) => t.IsFood;
			}
			List<Thing> list6 = TC.things.List(delegate(Thing t) 
			List<Thing> list5 = 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 (list6.Count > 0) 
			if (list5.Count > 0) 
			{
				thing4 = list6.RandomItem(); 
				if (thing4.Num > 1) 
				thing5 = list5.RandomItem(); 
				if (thing5.Num > 1) 
				{
					thing4 = thing4.Split(1); 
					thing5 = thing5.Split(1); 
				}
			}
			CC.AddCooldown(6640, 200);
		}
		if (thing4 == null) 
		if (thing5 == null) 
		{
			CC.Say("abStealNothing", CC, TC);
			break;
		}
		thing4.SetInt(116, 1); 
		TC.PlaySound(thing4.material.GetSoundDrop(thing4.sourceCard)); 
		CC.Pick(thing4, msg: false); 
		CC.Say("abSteal", CC, TC, thing4.Name); 
		thing5.SetInt(116, 1); 
		TC.PlaySound(thing5.material.GetSoundDrop(thing5.sourceCard)); 
		CC.Pick(thing5, msg: false); 
		CC.Say("abSteal", CC, TC, thing5.Name); 
		if (actRef.n1 == "food")
		{
			if (CC.hunger.value != 0)
			{
				CC.InstantEat(thing4); 
				CC.InstantEat(thing5); 
			}
		}
		else

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

cs
		{
			break;
		}
		List<Thing> list9 = TC.things.List(delegate(Thing t) 
		List<Thing> list4 = TC.things.List(delegate(Thing t) 
		{
			if (!t.isEquipped || t.blessedState == BlessedState.Doomed || t.IsToolbelt)
			{

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

cs
			}
			return (t.blessedState < BlessedState.Blessed || EClass.rnd(10) == 0) ? true : false;
		});
		if (list9.Count == 0) 
		if (list4.Count == 0) 
		{
			CC.SayNothingHappans();
			break;
		}
		Thing thing6 = list9.RandomItem(); 
		TC.Say("curse_hit", TC, thing6); 
		thing6.SetBlessedState((thing6.blessedState == BlessedState.Cursed) ? BlessedState.Doomed : BlessedState.Cursed); 
		LayerInventory.SetDirty(thing6); 
		Thing thing4 = list4.RandomItem(); 
		TC.Say("curse_hit", TC, thing4); 
		thing4.SetBlessedState((thing4.blessedState == BlessedState.Cursed) ? BlessedState.Doomed : BlessedState.Cursed); 
		LayerInventory.SetDirty(thing4); 
		break;
	}
	case EffectId.UncurseEQ:

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

cs
		List<Thing> list = new List<Thing>();
		TC.things.Foreach(delegate(Thing t)
		{
			int num13 = 0; 
			int num14 = 0; 
			if ((t.isEquipped || t.IsRangedWeapon || blessed) && t.blessedState < BlessedState.Normal)
			{
				if (t.blessedState == BlessedState.Cursed)
				{
					num13 = EClass.rnd(200); 
					num14 = EClass.rnd(200); 
				}
				if (t.blessedState == BlessedState.Doomed)
				{
					num13 = EClass.rnd(1000); 
					num14 = EClass.rnd(1000); 
				}
				if (blessed)
				{
					num13 /= 2; 
					num14 /= 2; 
				}
				if (id == EffectId.UncurseEQGreater)
				{
					num13 /= 10; 
					num14 /= 10; 
				}
				if (power >= num13) 
				if (power >= num14) 
				{
					TC.Say("uncurseEQ_success", t);
					t.SetBlessedState(BlessedState.Normal);

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> list6 = EClass.sources.stats.rows.Where((SourceStat.Row con) => con.tag.Contains("random") && con.group == (hex ? "Debuff" : "Buff")).ToList(); 
		int power2 = power;
		for (int m = 0; m < 4 + EClass.rnd(2); m++) 
		for (int k = 0; k < 4 + EClass.rnd(2); k++) 
		{
			SourceStat.Row row2 = list7.RandomItem(); 
			list7.Remove(row2); 
			SourceStat.Row row2 = list6.RandomItem(); 
			list6.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 num10 = TC.WIL * (isPowerful ? 20 : 5); 
		ConHolyVeil condition3 = TC.GetCondition<ConHolyVeil>(); 
		if (condition3 != null) 
		int num7 = TC.WIL * (isPowerful ? 20 : 5); 
		ConHolyVeil condition = TC.GetCondition<ConHolyVeil>(); 
		if (condition != null) 
		{
			num10 += condition3.power * 5; 
			num7 += condition.power * 5; 
		}
		if (id != EffectId.DebuffKizuami && EClass.rnd(a2) < num10 / EClass.sources.stats.alias[n].hexPower && EClass.rnd(10) != 0) 
		if (id != EffectId.DebuffKizuami && EClass.rnd(a2) < num7 / 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
		}
		break;
	}
	case EffectId.TransBlood:
	{ 
		tc.PlaySound("mutation"); 
		tc.PlayEffect("mutation"); 
		int num8 = ((actRef.refThing != null) ? actRef.refThing.GetInt(118) : actRef.refVal); 
		if (num8 == 0) 
		{ 
			num8 = tc.GetInt(118); 
			if (num8 == 0) 
			{ 
				num8 = EClass.game.seed + tc.uid; 
			} 
			num8++; 
		} 
		tc.Say("transBlood", tc); 
		tc.Talk("tail"); 
		tc.c_bloodData = null; 
		tc.SetInt(118, num8); 
		break; 
	} 
	case EffectId.Youth:
	{
		tc.PlaySound("mutation");

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

cs
		break;
	case EffectId.Revive:
	{
		List<KeyValuePair<int, Chara>> list4 = 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>> 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(); 
		if (TC.IsPCFaction || TC.IsPCFactionMinion)
		{
			if (TC.IsPC && list4.Count == 0) 
			if (TC.IsPC && list8.Count == 0) 
			{
				list4 = 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(); 
				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(); 
			}
			if (list4.Count > 0) 
			if (list8.Count > 0) 
			{
				list4.RandomItem().Value.Chara.GetRevived(); 
				list8.RandomItem().Value.Chara.GetRevived(); 
				break;
			}
		}

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

cs
	case EffectId.DamageMindGreat:
	case EffectId.Weaken:
	{
		bool flag7 = id == EffectId.DamageBody || id == EffectId.DamageBodyGreat; 
		bool mind = id == EffectId.DamageMind || id == EffectId.DamageMindGreat; 
		int num7 = ((id == EffectId.DamageBody || id == EffectId.DamageMind) ? 1 : (4 + EClass.rnd(4))); 
		bool flag10 = 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))); 
		if (id == EffectId.Weaken)
		{
			flag7 = EClass.rnd(2) == 0; 
			mind = !flag7; 
			num7 = 1; 
			flag10 = EClass.rnd(2) == 0; 
			mind2 = !flag10; 
			num11 = 1; 
		}
		else
		{
			TC.PlayEffect("debuff");
			TC.PlaySound("debuff");
		}
		TC.Say(flag7 ? "damageBody" : "damageMind", TC); 
		for (int k = 0; k < num7; k++) 
		TC.Say(flag10 ? "damageBody" : "damageMind", TC); 
		for (int l = 0; l < num11; l++) 
		{
			TC.DamageTempElements(power, flag7, mind, id != EffectId.Weaken); 
			TC.DamageTempElements(power, flag10, mind2, id != EffectId.Weaken); 
		}
		if (TC.IsPC)
		{

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

cs
	case EffectId.EnhanceBodyGreat:
	case EffectId.EnhanceMindGreat:
	{
		bool flag10 = id == EffectId.EnhanceBody || id == EffectId.EnhanceBodyGreat; 
		bool mind2 = id == EffectId.EnhanceMind || id == EffectId.EnhanceMindGreat; 
		bool flag8 = id == EffectId.EnhanceBody || id == EffectId.EnhanceBodyGreat; 
		bool mind = id == EffectId.EnhanceMind || id == EffectId.EnhanceMindGreat; 
		if (id != EffectId.EnhanceBody && id != EffectId.EnhanceMind)
		{
			EClass.rnd(4);
		}
		TC.Say(flag10 ? "enhanceBody" : "enhanceMind", TC); 
		TC.Say(flag8 ? "enhanceBody" : "enhanceMind", TC); 
		TC.PlayEffect("buff");
		TC.PlaySound("buff");
		TC.EnhanceTempElements(power, flag10, mind2, onlyRenew: true); 
		TC.EnhanceTempElements(power, flag8, mind, onlyRenew: true); 
		break;
	}
	case EffectId.RestoreBody:
	case EffectId.RestoreMind:
	{
		bool flag8 = id == EffectId.RestoreBody; 
		bool flag9 = id == EffectId.RestoreBody; 
		if (flag)
		{
			Redirect(flag8 ? EffectId.DamageBodyGreat : EffectId.DamageMindGreat, BlessedState.Normal, default(ActRef)); 
			Redirect(flag9 ? EffectId.DamageBodyGreat : EffectId.DamageMindGreat, BlessedState.Normal, default(ActRef)); 
			break;
		}
		TC.Say(flag8 ? "restoreBody" : "restoreMind", TC); 
		TC.Say(flag9 ? "restoreBody" : "restoreMind", TC); 
		TC.PlaySound("heal");
		TC.PlayEffect("heal");
		TC.CureHost(flag8 ? CureType.CureBody : CureType.CureMind, power, state); 
		TC.CureHost(flag9 ? CureType.CureBody : CureType.CureMind, power, state); 
		if (blessed)
		{
			Redirect(flag8 ? EffectId.EnhanceBodyGreat : EffectId.EnhanceMindGreat, BlessedState.Normal, default(ActRef)); 
			Redirect(flag9 ? EffectId.EnhanceBodyGreat : EffectId.EnhanceMindGreat, BlessedState.Normal, default(ActRef)); 
		}
		break;
	}

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

cs
		{
			Debug.Log(actRef.act.id);
		}
		int num12 = 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 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(); 
		if (actRef.refThing != null)
		{
			num12 = num12 * (100 + actRef.refThing.Evalue(750) * 10) / 100; 
			num10 = num10 * (100 + actRef.refThing.Evalue(750) * 10) / 100; 
		}
		if (flag)
		{
			TC.DamageHP(num12 / 2, 919, power); 
			TC.DamageHP(num10 / 2, 919, power); 
			break;
		}
		TC.HealHPHost(num12, (actRef.refThing == null && id != EffectId.JureHeal) ? HealSource.Magic : HealSource.Item); 
		TC.HealHPHost(num10, (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
		if (TC.HasElement(1211))
		{
			TC.Say("drinkSaltWater_snail", TC);
			int num11 = ((TC.hp > 10) ? (TC.hp - EClass.rnd(10)) : 10000); 
			TC.DamageHP(num11, AttackSource.None, CC); 
			int num9 = ((TC.hp > 10) ? (TC.hp - EClass.rnd(10)) : 10000); 
			TC.DamageHP(num9, AttackSource.None, CC); 
		}
		else if (TC.IsPC)
		{

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

cs
		{
			power /= 4;
		}
		List<Thing> list8 = TC.things.List((Thing t) => (t.Num <= 1 && t.IsEquipmentOrRanged && !t.IsToolbelt && !t.IsLightsource && t.isEquipped) ? true : false); 
		if (list8.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 thing5 = list8.RandomItem(); 
			Thing thing6 = list7.RandomItem(); 
			TC.Say("acid_hit", TC);
			if (thing5.isAcidproof) 
			if (thing6.isAcidproof) 
			{
				TC.Say("acid_nullify", thing5); 
				TC.Say("acid_nullify", thing6); 
			}
			else if (thing5.encLV > -5) 
			else if (thing6.encLV > -5) 
			{
				TC.Say("acid_rust", TC, thing5); 
				thing5.ModEncLv(-1); 
				LayerInventory.SetDirty(thing5); 
				TC.Say("acid_rust", TC, thing6); 
				thing6.ModEncLv(-1); 
				LayerInventory.SetDirty(thing6); 
			}
			if (TC.IsPCParty)
			{

ActWater

public override bool Perform()

cs
	}
	foreach (Chara chara in Act.TP.Charas)
	{
		bool flag = false; 
		if (chara.HasCondition<ConBurning>())
		{
			flag = true; 
			chara.Talk("thanks");
		}
		else if (!chara.IsPCParty && EClass.rnd(2) == 0)

public override bool Perform()

cs
			continue;
		}
		chara.AddCondition<ConWet>();
		Act.CC.DoHostileAction(chara); 
		if (!flag) 
		{ 
			Act.CC.DoHostileAction(chara); 
		} 
	}
	Act.CC.PlaySound("water_farm");
	waterCan.owner.ModCharge(-1);

CINT

public class CINT

cs

	public const int godEaten = 117;

	public const int seedBlood = 118; 
	public const int isTrained = 120;

	public const int isPrayed = 121;

COBJ

public class COBJ

cs
	public const int socketList = 17;

	public const int mixedFoodData = 18;
	public const int bloodData = 19; 
}

Card

public MixedFoodData c_mixedFoodData

cs
		}
	}

	public Thing c_bloodData 
	{ 
		get 
		{ 
			return GetObj<Thing>(19); 
		} 
		set 
		{ 
			SetObj(19, value); 
		} 
	} 
	public byte[] c_textureData
	{
		get

CellEffect

public int idEle

cs
		}
	}

	public int refVal 
	{ 
		get 
		{ 
			return ints[7]; 
		} 
		set 
		{ 
			ints[7] = value; 
		} 
	} 
	public string n1
	{
		get

Chara

void ProcEffect()

cs
			ActEffect.ProcAt(e.idEffect, e.power, e.isBlessed ? BlessedState.Blessed : (e.isCursed ? BlessedState.Cursed : BlessedState.Normal), this, this, new Point(pos), e.isHostileAct, new ActRef
			{
				aliasEle = EClass.sources.elements.map[e.idEle].alias,
				n1 = e.n1 
				n1 = e.n1, 
				refVal = e.refVal 
			});
			ClearEffect();
		}

public override string GetHoverText()

cs
		{
			text2 += ("(" + faith.Name + ")").TagSize(14);
		}
		if (EClass.pc.HasElement(1250)) 
		{ 
			s += CraftUtil.GetBloodText(this).TagSize(14).TagColor(EClass.Colors.colorBlood); 
		} 
		return text + text2 + s;
	}

public bool CanBloom()

cs
	{
		return false;
	}
	if (!EClass.debug.enable) 
	if (!EClass.debug.godMode) 
	{
		if (base.c_daysWithPC > 360)
		{

ColorProfile

public class PCLights

cs

	public Color colorHostile;

	public Color colorBlood; 
	public Color colorBuff;

	public Color colorDebuff;

CraftUtil

void SetSeed()

cs
		}
	}

	public static Thing MakeBloodMeal(Chara sucker, Chara feeder) 
	public static string GetBloodText(Chara c) 
	{
		Rand.SetSeed(EClass.game.seed + feeder.uid); 
		Thing thing = ThingGen.CreateFromCategory("meal", 100); 
		sucker.Say("food_blood", thing); 
		MakeDish(thing, 100, null, EClass.game.seed + feeder.uid); 
		if (thing.HasElement(709)) 
		string text = ""; 
		List<Element> list = MakeBloodMeal(EClass.pc, c, msg: false).elements.ListElements((Element e) => e.IsFoodTraitMain, (Element a, Element b) => b.Value - a.Value); 
		int num = Mathf.Min(list.Count(), 3, EClass.debug.godMode ? 3 : (1 + EClass.pc.Evalue(6607) / 15)); 
		for (int i = 0; i < num; i++) 
		{ 
			Element element = list[i]; 
			string[] textArray = element.source.GetTextArray("textAlt"); 
			int num2 = Mathf.Clamp(element.Value / 10 + 1, (element.Value < 0 || textArray.Length <= 2) ? 1 : 2, textArray.Length - 1); 
			string text2 = textArray[num2]; 
			if (i != 0) 
			{ 
				text += ", "; 
			} 
			text += text2; 
		} 
		if (!text.IsEmpty()) 
		{
			thing.elements.Remove(709); 
			text = " (" + text + ")"; 
		}
		if (thing.HasElement(708)) 
		return text; 
	} 
	public static Thing MakeBloodMeal(Chara sucker, Chara feeder, bool msg = true) 
	{ 
		Thing c_bloodData = feeder.c_bloodData; 
		if (c_bloodData == null) 
		{
			thing.elements.Remove(708); 
			int seed = ((feeder.GetInt(118) == 0) ? (EClass.game.seed + feeder.uid) : feeder.GetInt(118)); 
			Rand.SetSeed(seed); 
			c_bloodData = ThingGen.CreateFromCategory("meal", 100); 
			if (msg) 
			{ 
				sucker.Say("food_blood", c_bloodData); 
			} 
			MakeDish(c_bloodData, 100, null, seed); 
			c_bloodData.elements.SetTo(709, 0); 
			c_bloodData.elements.SetTo(708, 0); 
			c_bloodData.elements.SetTo(701, 0); 
			feeder.c_bloodData = c_bloodData.Duplicate(1); 
		}
		if (thing.HasElement(701)) 
		else
		{
			thing.elements.Remove(701); 
			c_bloodData = c_bloodData.Duplicate(1); 
			if (msg) 
			{ 
				sucker.Say("food_blood", c_bloodData); 
			} 
		}
		thing.elements.ModBase(710, 20 + (int)Mathf.Min(Mathf.Sqrt(sucker.Evalue(6607) + Mathf.Max(sucker.LER, 0)), 50f)); 
		thing.elements.SetTo(2, Mathf.Min(EClass.curve(feeder.LV, 30, 10, 65), 200)); 
		return thing; 
		c_bloodData.elements.SetTo(2, Mathf.Min(EClass.curve(feeder.LV, 30, 10, 65), 200)); 
		c_bloodData.elements.ModBase(710, 15 + (int)Mathf.Min(Mathf.Sqrt(sucker.Evalue(6607) + Mathf.Max(sucker.LER, 0)), 50f)); 
		return c_bloodData; 
	}

	public static Thing MakeBloodSample(Chara sucker, Chara feeder)

public static Thing MakeBloodSample(Chara sucker, Chara feeder)

cs
		thing2.elements.SetTo(10, 0);
		thing2.MakeRefFrom(feeder);
		thing2.c_idRefCard = thing.id;
		thing2.SetInt(118, EClass.game.seed + feeder.uid); 
		return thing2;
	}

public static Card MixIngredients(Card product, List<Thing> ings, MixType type,

cs
				int value = ing.GetValue();
				num2 += value;
			}
			if (product.id == "1300" && product.GetInt(118) == 0) 
			{ 
				product.SetInt(118, ing.GetInt(118)); 
				product.c_idRefCard = ing.c_idRefCard; 
			} 
		}
	}
	if (isFood)

EffectId

public enum EffectId

cs
	Rocket = 308,
	StripBlessing = 309,
	Flare = 310,
	GravityGun = 311
	GravityGun = 311, 
	TransBlood = 312
}

TraitDrink

public override void OnThrowGround(Chara c, Point p)

cs
	if (IdEffect != EffectId.Drink)
	{
		bool isHostileAct = c.IsPCParty && IsNeg;
		EClass._map.SetLiquid(p.x, p.z, new CellEffect
		CellEffect cellEffect = new CellEffect
		{
			id = 4,
			idEffect = IdEffect,

public override void OnThrowGround(Chara c, Point p)

cs
			n1 = N1,
			isBlessed = (owner.blessedState >= BlessedState.Blessed),
			isCursed = (owner.blessedState <= BlessedState.Cursed)
		}); 
		}; 
		if (IdEffect == EffectId.TransBlood) 
		{ 
			cellEffect.refVal = owner.GetInt(118); 
		} 
		EClass._map.SetLiquid(p.x, p.z, cellEffect); 
	}
	else
	{

WindowCharaMini

using System;

cs
using System; 
using System.Linq;
using UnityEngine;

public void Refresh(int idTab)

cs
		note.SetActive(enable: true);
		note.AddText("feat_pet".lang(chara.feat.ToString() ?? "", num.ToString() ?? ""));
		note.AddText("feat_inferior".lang(chara.CurrentGeneSlot.ToString() ?? "", chara.MaxGeneSlot.ToString() ?? "", ((genes != null) ? genes.inferior : 0).ToString() ?? ""));
		note.AddText((chara.isScaled ? "feat_pet_type2" : "feat_pet_type1").lang()); 
		HintIcon componentInChildren = note.AddText("NoteText_with_hint", (chara.isScaled ? "feat_pet_type2" : "feat_pet_type1").lang()).GetComponentInChildren<HintIcon>(); 
		string text = (chara.isScaled ? "feat_pet_type2_hint" : "feat_pet_type1_hint").lang(); 
		if (!chara.isScaled && !chara.HasElement(1273)) 
		{ 
			text = text + Environment.NewLine + (chara.CanBloom() ? "petawaken2" : "petawaken1").lang(); 
		} 
		componentInChildren.tooltip.lang = text; 
		note.Space(8);
		foreach (CharaUpgrade.Item item6 in upgrades.items)
		{