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