Skip to content

EA 23.287 Stable

March 20, 2026

19 files modified.

Important Changes

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

AIAct (1)

cs
public Status DoGoto(Card card, int dist, Func<Status> _onChildFail = null) 
public Status DoGoto(Card card, int dist, bool ignoreConnection = false, Func<Status> _onChildFail = null) 

AI_Fuck (1)

cs
public override void OnSetOwner() 

AI_Shear (1)

cs
public override void OnSetOwner() 

AI_Slaughter (1)

cs
public override void OnSetOwner() 

ListPeopleParty (1)

cs
public override void OnCreate() 

TaskPlow (1)

cs
public override void OnSetOwner() 

TaskPoint (1)

cs
public override void OnSetOwner() 

AIAct

public Status DoGoto(Point pos, int dist = 0, bool ignoreConnection = false, Fun

cs

	public Status DoGoto(Card card, Func<Status> _onChildFail = null)
	{
		return DoGoto(card, (card.isChara || card.pos.cell.blocked) ? 1 : 0, _onChildFail); 
		return DoGoto(card, (card.isChara || card.pos.cell.blocked) ? 1 : 0, ignoreConnection: false, _onChildFail); 
	}

	public Status DoGoto(Card card, int dist, Func<Status> _onChildFail = null) 
	public Status DoGoto(Card card, int dist, bool ignoreConnection = false, Func<Status> _onChildFail = null) 
	{
		if (card != null && card == owner.held)
		{

public Status DoGoto(Card card, int dist, Func<Status> _onChildFail = null)

cs
		{
			return _onChildFail?.Invoke() ?? Cancel();
		}
		SetChild(new AI_Goto(card, dist), _onChildFail); 
		SetChild(new AI_Goto(card, dist, ignoreConnection), _onChildFail); 
		return TickChild();
	}

AI_Fuck

public override IEnumerable<Status> Run()

cs
	int destDist = ((Type == FuckType.fuck) ? 1 : 1);
	if (owner.host != target)
	{
		yield return DoGoto(target.pos, destDist); 
		yield return DoGoto(target.pos, destDist, ignoreConnection: true); 
	}
	cc.Say((variation == Variation.Slime) ? "slime_start" : ((variation == Variation.Bloodsuck) ? "suck_start" : (Type.ToString() + "_start")), cc, tc);
	isFail = () => !tc.IsAliveInCurrentZone || tc.Dist(owner) > 3;

public override IEnumerable<Status> Run()

cs
		progress = i;
		if (owner.host != target)
		{
			yield return DoGoto(target.pos, destDist); 
			yield return DoGoto(target.pos, destDist, ignoreConnection: true); 
		}
		switch (Type)
		{

static void SuccubusExp(Chara c, Chara tg)

cs
			}
		}
	}
	public override void OnSetOwner() 
	{ 
		if (parent is AI_Goto aI_Goto) 
		{ 
			aI_Goto.ignoreConnection = true; 
		} 
	} 
}

AI_Shear

public override bool Perform()

cs

	public override IEnumerable<Status> Run()
	{
		yield return DoGoto(target); 
		yield return DoGoto(target, 1, ignoreConnection: true); 
		int furLv = GetFurLv(target.Chara);
		Progress_Custom seq = new Progress_Custom
		{

public override IEnumerable<Status> Run()

cs
		yield return Do(seq);
	}

	public override void OnSetOwner() 
	{ 
		if (parent is AI_Goto aI_Goto) 
		{ 
			aI_Goto.ignoreConnection = true; 
		} 
	} 
	public static int GetFurLv(Chara c)
	{
		return Mathf.Clamp(c.c_fur / 10 + 1, 1, 5);

AI_Slaughter

public override bool Perform()

cs

	public override IEnumerable<Status> Run()
	{
		yield return DoGoto(target); 
		yield return DoGoto(target, 1, ignoreConnection: true); 
		if (target != owner)
		{
			target.Chara.AddCondition<ConWait>(1000, force: true);

public override void OnCancelOrSuccess()

cs
			target.SetCensored(enable: false);
		}
	}
	public override void OnSetOwner() 
	{ 
		if (parent is AI_Goto aI_Goto) 
		{ 
			aI_Goto.ignoreConnection = true; 
		} 
	} 
}

ActEffect

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

cs
		}
		cc.PlaySound("offering");
		cc.PlayEffect("buff");
		int num = (tc.isWeightChanged ? tc.c_weight : tc.Thing.source.weight); 
		int num3 = (tc.isWeightChanged ? tc.c_weight : tc.Thing.source.weight); 
		tc.isWeightChanged = true;
		Element orCreateElement = tc.elements.GetOrCreateElement(64);
		Element orCreateElement2 = tc.elements.GetOrCreateElement(65);
		Element orCreateElement3 = tc.elements.GetOrCreateElement(67);
		Element orCreateElement4 = tc.elements.GetOrCreateElement(66);
		bool flag2 = tc.IsEquipmentOrRangedOrAmmo || tc.IsThrownWeapon; 
		bool flag5 = tc.IsEquipmentOrRangedOrAmmo || tc.IsThrownWeapon; 
		if (flag)
		{
			num = (int)(0.01f * (float)num * (float)power * 0.75f + 500f); 
			if (num < 0 || num > 10000000) 
			num3 = (int)(0.01f * (float)num3 * (float)power * 0.75f + 500f); 
			if (num3 < 0 || num3 > 10000000) 
			{
				num = 10000000; 
				flag2 = false; 
				num3 = 10000000; 
				flag5 = false; 
			}
			if (flag2) 
			if (flag5) 
			{
				if (tc.IsWeapon || tc.IsThrownWeapon || tc.IsAmmo)
				{

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

cs
		}
		else
		{
			num = num * (100 - power / 10) / 100; 
			num3 = num3 * (100 - power / 10) / 100; 
			if (blessed)
			{
				power /= 4;
			}
			if (flag2) 
			if (flag5) 
			{
				if (tc.IsWeapon || tc.IsThrownWeapon || tc.IsAmmo)
				{

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

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

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

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

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

cs
		{
			tc = tc.Split(1);
		}
		string name = tc.Name; 
		string name2 = tc.Name; 
		if (row == null)
		{
			bool num3 = id == EffectId.ChangeMaterialGreater; 
			bool flag4 = id == EffectId.ChangeMaterialLesser; 
			bool num7 = id == EffectId.ChangeMaterialGreater; 
			bool flag8 = id == EffectId.ChangeMaterialLesser; 
			string text2 = tc.Thing.source.tierGroup;
			Dictionary<string, SourceMaterial.TierList> tierMap = SourceMaterial.tierMap;
			int num4 = 1; 
			int num8 = 1; 
			if (flag)
			{
				num4 -= 2; 
				num8 -= 2; 
			}
			if (blessed)
			{
				num4++; 
				num8++; 
			}
			if (num3) 
			if (num7) 
			{
				num4++; 
				num8++; 
			}
			if (flag4) 
			if (flag8) 
			{
				num4 -= 2; 
				num8 -= 2; 
			}
			num4 = Mathf.Clamp(num4 + EClass.rnd(2), 0, 4); 
			num8 = Mathf.Clamp(num8 + EClass.rnd(2), 0, 4); 
			if (EClass.rnd(10) == 0)
			{
				text2 = ((text2 == "metal") ? "leather" : "metal");

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

cs
			SourceMaterial.TierList tierList = (text2.IsEmpty() ? tierMap.RandomItem() : tierMap[text2]);
			for (int j = 0; j < 1000; j++)
			{
				row = tierList.tiers[num4].Select(); 
				row = tierList.tiers[num8].Select(); 
				if (row != tc.material)
				{
					break;

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

cs
			DNA.Type type = DNA.GetType(tc.material.alias);
			tc.c_DNA.Generate(type);
		}
		cc.Say("materialChanged", name, row.GetName()); 
		cc.Say("materialChanged", name2, row.GetName()); 
		if (CC != null)
		{
			if (tc.parent == null)

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

cs
		{
			tc = tc.Split(1);
		}
		string name2 = tc.Name; 
		string name = tc.Name; 
		cc.PlaySound("offering");
		cc.PlayEffect("buff");
		bool flag5 = tc.rarity == Rarity.Legendary; 
		bool flag2 = tc.rarity == Rarity.Legendary; 
		CardBlueprint.Set(new CardBlueprint
		{
			rarity = (flag5 ? Rarity.Mythical : Rarity.Legendary), 
			rarity = (flag2 ? Rarity.Mythical : Rarity.Legendary), 
			generation = CardBlueprint.Generation.GarokkHammer
		});
		Rand.SetBaseSeed(tc.uid + 1);
		Rand.SetSeed(tc.uid + 2);
		Thing thing4 = ThingGen.Create(tc.id, tc.idMaterial, tc.genLv); 
		Thing thing = ThingGen.Create(tc.id, tc.idMaterial, tc.genLv); 
		Rand.SetSeed();
		Rand.SetBaseSeed();
		int num6 = 0; 
		foreach (Element item4 in thing4.elements.dict.Values.ToList().Shuffle()) 
		thing.SetEncLv(tc.encLV); 
		thing.SetBlessedState(tc.blessedState); 
		int num = 0; 
		foreach (Element item4 in thing.elements.dict.Values.ToList().Shuffle()) 
		{
			if (tc.elements.Has(item4.id) && tc.elements.GetElement(item4.id).vBase == item4.vBase) 
			int num2 = (tc.elements.Has(item4.id) ? tc.elements.GetElement(item4.id).vBase : 0); 
			if (num2 != 0 && (Mathf.Abs(item4.vBase) <= Mathf.Abs(num2) || !MathEx.IsSameSign(item4.vBase, num2))) 
			{
				continue;
			}
			tc.elements.SetBase(item4.id, item4.vBase); 
			Debug.Log(item4.Name + "/" + item4.vBase); 
			int id2 = item4.id;
			if ((uint)(id2 - 64) > 3u) 
			if (id2 != 11) 
			{
				num6++; 
				if (flag5) 
				if ((uint)(id2 - 64) > 3u) 
				{ 
					num++; 
				} 
				tc.elements.SetBase(item4.id, item4.vBase); 
				Debug.Log(item4.Name + "/" + item4.vBase); 
				if (flag2 && num >= 2) 
				{
					_ = 2; 
					break; 
				}
			}
		}
		tc.rarity = (flag5 ? Rarity.Mythical : Rarity.Legendary); 
		EClass.pc.Say("reconstruct", name2); 
		tc.isCrafted = false; 
		tc.rarity = (flag2 ? Rarity.Mythical : Rarity.Legendary); 
		EClass.pc.Say("reconstruct", name); 
		break;
	}
	case EffectId.ChangeAlias:
	{
		Chara c2 = CC;
		if (!c2.IsPC && !c2.trait.UseRandomAlias && blessed) 
		{ 
			c2._alias = null; 
			c2.Say("reconstruct", c2); 
			SE.Change(); 
			c2.PlayEffect("mutation"); 
			break; 
		} 
		EClass.ui.AddLayer<LayerList>().SetStringList(delegate
		{
			List<string> list11 = new List<string>();
			for (int num16 = 0; num16 < 10; num16++) 
			for (int num17 = 0; num17 < 10; num17++) 
			{
				list11.Add(AliasGen.GetRandomAlias());
			}

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

cs
		{
			break;
		}
		int num13 = 0; 
		int num14 = 0; 
		foreach (Condition condition5 in TC.conditions)
		{
			if (condition5.Type == ConditionType.Debuff)
			{
				num13++; 
				num14++; 
			}
		}
		if (num13 == 0) 
		if (num14 == 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 < num13; m++) 
		for (int m = 0; m < num14; m++) 
		{
			TweenUtil.Delay((float)m * 0.1f, delegate
			{

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

cs
					{
						effect.Play(center, 0f, pos);
					});
					int num14 = Dice.Create("SpShutterHex", power, CC, (actRef.refThing != null) ? null : actRef.act).Roll(); 
					item6.DamageHP(num14, 919, power, AttackSource.None, CC, showEffect: false); 
					int num15 = Dice.Create("SpShutterHex", power, CC, (actRef.refThing != null) ? null : actRef.act).Roll(); 
					item6.DamageHP(num15, 919, power, AttackSource.None, CC, showEffect: false); 
				}
			}
		}

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

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

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

cs
			power = power * 2 / 3;
		}
		int a2 = power;
		int num11 = TC.WIL * (isPowerful ? 20 : 5); 
		int num12 = TC.WIL * (isPowerful ? 20 : 5); 
		ConHolyVeil condition3 = TC.GetCondition<ConHolyVeil>();
		if (condition3 != null)
		{
			num11 += condition3.power * 5; 
			num12 += condition3.power * 5; 
		}
		if (id != EffectId.DebuffKizuami && EClass.rnd(a2) < num11 / EClass.sources.stats.alias[n].hexPower && EClass.rnd(10) != 0) 
		if (id != EffectId.DebuffKizuami && EClass.rnd(a2) < num12 / 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
	{
		tc.PlaySound("mutation");
		tc.PlayEffect("mutation");
		int num12 = ((actRef.refThing != null) ? actRef.refThing.GetInt(118) : actRef.refVal); 
		if (num12 == 0) 
		int num13 = ((actRef.refThing != null) ? actRef.refThing.GetInt(118) : actRef.refVal); 
		if (num13 == 0) 
		{
			num12 = tc.GetInt(118); 
			if (num12 == 0) 
			num13 = tc.GetInt(118); 
			if (num13 == 0) 
			{
				num12 = EClass.game.seed + tc.uid; 
				num13 = EClass.game.seed + tc.uid; 
			}
			num12++; 
			num13++; 
		}
		tc.Say("transBlood", tc);
		tc.Talk("tail");
		tc.c_bloodData = null;
		tc.SetInt(118, num12); 
		tc.SetInt(118, num13); 
		break;
	}
	case EffectId.Youth:

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 num10 = ((id == EffectId.DamageBody || id == EffectId.DamageMind) ? 1 : (4 + EClass.rnd(4))); 
		int num11 = ((id == EffectId.DamageBody || id == EffectId.DamageMind) ? 1 : (4 + EClass.rnd(4))); 
		if (id == EffectId.Weaken)
		{
			flag12 = EClass.rnd(2) == 0;
			mind2 = !flag12;
			num10 = 1; 
			num11 = 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 < num10; l++) 
		for (int l = 0; l < num11; l++) 
		{
			TC.DamageTempElements(power, flag12, mind2, id != EffectId.Weaken);
		}

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

cs
		{
			EClass.game.religions.Healing.Talk("ability");
		}
		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(); 
		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)
		{
			num9 = num9 * (100 + actRef.refThing.Evalue(750) * 10) / 100; 
			num10 = num10 * (100 + actRef.refThing.Evalue(750) * 10) / 100; 
		}
		if (flag)
		{
			TC.DamageHP(num9 / 2, 919, power); 
			TC.DamageHP(num10 / 2, 919, power); 
			break;
		}
		TC.HealHPHost(num9, (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 num8 = ((TC.hp > 10) ? (TC.hp - EClass.rnd(10)) : 10000); 
			TC.DamageHP(num8, AttackSource.None, CC); 
			int num9 = ((TC.hp > 10) ? (TC.hp - EClass.rnd(10)) : 10000); 
			TC.DamageHP(num9, AttackSource.None, CC); 
		}
		else if (TC.IsPC)
		{

ActPlan

public Func<bool> GetAction()

cs
	Item item = list[0];
	return delegate
	{
		if (item.act is AIAct) 
		{ 
			(item.act as AIAct).owner = EClass.pc; 
		} 
		if (performed && !item.act.CanPressRepeat)
		{
			return false;

ActZap

public override bool Perform()

cs
		Act.TC = Act.CC;
		EffectId idEffect = trait.IdEffect;
		long a = trait.Power * (100 + (long)Act.CC.Evalue(305) * 10L + Act.CC.MAG / 2 + Act.CC.PER / 2) / 100;
		ActEffect.ProcAt(idEffect, MathEx.Min(a), trait.owner.blessedState, Act.CC, null, Act.TP, trait.IsNegative, new ActRef
		ActEffect.ProcAt(idEffect, MathEx.ClampToInt(a), trait.owner.blessedState, Act.CC, null, Act.TP, trait.IsNegative, new ActRef
		{
			refThing = trait.owner.Thing,
			aliasEle = trait.aliasEle,

AttackProcess

public class AttackProcess : EClass

cs

	public long toHitBase;

	public long evasion; 
	public int dNum;

	public int dDim;

public class AttackProcess : EClass

cs

	public int toHitFix;

	public int evasion; 
	public int penetration;

	public int distMod;

public void Prepare(Chara _CC, Thing _weapon, Card _TC = null, Point _TP = null,

cs
	toolRange = weapon?.trait as TraitToolRange;
	attackType = AttackType.Slash;
	attackStyle = AttackStyle.Default;
	evasion = 0; 
	evasion = 0L; 
	penetration = 0;
	distMod = 100;
	attackIndex = _attackIndex;

public void Prepare(Chara _CC, Thing _weapon, Card _TC = null, Point _TP = null,

cs
		evasion = EClass.curve(TC.PER / 3 + TC.Evalue(150), 50, 10) + TC.DV + 25;
		if (TC.isChara && TC.Chara.isBlind)
		{
			evasion /= 2; 
			evasion /= 2L; 
		}
		if (TC.HasCondition<ConDim>())
		{
			evasion /= 2; 
			evasion /= 2L; 
		}
		if (TC.isChara && TC.Chara.HasHigherGround(CC))
		{

public bool Perform(int count, bool hasHit, float dmgMulti = 1f, bool maxRoll =

cs
				continue;
			}
			int num10 = 25;
			int num11 = EClass.rnd(num * (100 + item.Value * 10) / 500 + 5); 
			long num11 = EClass.rnd(num * (100 + item.Value * 10) / 500 + 5); 
			num11 = num11 * (100 + GetTwoHandEncBonus(CC, weapon)) / 100;
			if (num11 >= 0)
			{

Chara

public override void OnCreate(int genLv)

cs
			num = tuple.Item3 + base.LV - source.LV;
		}
	}
	if (source.name == "*r") 
	if (trait.UseRandomName) 
	{
		base.c_altName = NameGen.getRandomName();
	}
	if (source.GetText("aka") == "*r" || trait.UseRandomAlias) 
	if (trait.UseRandomAlias) 
	{
		_alias = AliasGen.GetRandomAlias();
	}

EClass

public static int rndSeed(int a, int seed)

cs

	public static int rnd(long a)
	{
		return Rand.rnd((int)a); 
		return Rand.rnd(MathEx.ClampToInt(a)); 
	}

	public static int rnd(int a)

GrowSystem

public int Convert(int tile)

cs
		}
	}

	public static SourceObj.Row[] sourceSnowTree = new SourceObj.Row[2] 
	{ 
		EClass.sources.objs.map[54], 
		EClass.sources.objs.map[55] 
	}; 
	private static SourceObj.Row[] _sourceSnowTree; 

	public const int DivStage = 30;

public int Convert(int tile)

cs

	public string idHarvestThing;

	public static SourceObj.Row[] SourceSnowTree 
	{ 
		get 
		{ 
			object obj = _sourceSnowTree; 
			if (obj == null) 
			{ 
				obj = new SourceObj.Row[2] 
				{ 
					EClass.sources.objs.map[54], 
					EClass.sources.objs.map[55] 
				}; 
				_sourceSnowTree = (SourceObj.Row[])obj; 
			} 
			return (SourceObj.Row[])obj; 
		} 
	} 
	public virtual RenderData RenderHarvest => source.renderData;

	public virtual int Step => 5;

ListPeopleParty

``

cs

public class ListPeopleParty : BaseListPeople
{
	public override void OnCreate() 
	{ 
		list.sorts = new UIList.SortMode[3] 
		{ 
			UIList.SortMode.ByFeat, 
			UIList.SortMode.ByJob, 
			UIList.SortMode.ByRace 
		}; 
		list.sortMode = UIList.SortMode.ByFeat; 
	} 
	public bool CanJoinParty(Chara c)
	{
		if (!c.IsPC)

Recipe

public virtual void Build(Chara chara, Card t, Point pos, int mat, int dir, int

cs
		EClass._map.SetBlock(pos.x, pos.z, mat, ramp, dir);
		if (tileType.IsBlockPass && pos.HasChara)
		{
			foreach (Chara item in pos.ListCharas()) 
			foreach (Chara item in pos.ListCharas().Copy()) 
			{
				chara.Kick(item, ignoreSelf: false, karmaLoss: false);
			}

TaskBuild

public override void OnProgressComplete()

cs
	{
		bridgeHeight = 150;
	}
	Chara chara = owner; 
	recipe.Build(this);
	owner = chara; 
	resources.Clear();
	EClass.player.flags.OnBuild(recipe); 
	if (owner.IsPC) 
	{ 
		EClass.player.flags.OnBuild(recipe); 
	} 
	EClass._map.RefreshShadow(pos.x, pos.z);
	EClass._map.RefreshShadow(pos.x, pos.z - 1);
	EClass._map.RefreshFOV(pos.x, pos.z);

TaskPlow

public class TaskPlow : TaskDesignation

cs
{
	public override CursorInfo CursorIcon => CursorSystem.Dig;

	public override bool destIgnoreConnection => false; 
	public override bool CanPressRepeat => true;

	public override int destDist

public override HitResult GetHitResult()

cs
		}
		return HitResult.Valid;
	}
	public override void OnSetOwner() 
	{ 
	} 
}

TaskPoint

public class TaskPoint : Task, IInspect

cs

	public virtual int destDist => 0;

	public virtual bool destIgnoreConnection => false; 
	public virtual bool destIgnoreConnection => true; 

	public virtual bool isBlock => false;

public override IEnumerable<Status> Run()

cs
		while (Loop);
	}

	public override void OnSetOwner() 
	{ 
		if (parent is AI_Goto aI_Goto) 
		{ 
			aI_Goto.ignoreConnection = true; 
		} 
	} 
	public void OnInspect()
	{
	}

Trait

public void OnBarter(bool reroll = false)

cs
		{
			AddThing(ThingGen.Create(id2, MATERIAL.GetRandomMaterialFromCategory(50, "rock", EClass.sources.materials.alias["granite"]).id).SetNum(10));
		}
		Add("scroll_alias", 1, 0); 
		Add("scroll_biography", 1, 0); 
		Add("scroll_alias", 10, 0); 
		Add("scroll_biography", 10, 0); 
		Add("1329", 1, 0);
		break;
	}

TraitChara

public virtual bool CanGiveRandomQuest

cs
		}
	}

	public virtual bool UseRandomAlias => false; 
	public virtual bool UseRandomName => owner.source.name == "*r"; 
	public virtual bool UseRandomAlias => owner.source.GetText("aka") == "*r"; 

	public virtual bool IsWearingPanty => EClass.pc.faction.IsWearingPanty(owner);

UIMultiList

public void Build(UIList.SortMode m = UIList.SortMode.ByNone)

cs
{
	foreach (ListOwner owner in owners)
	{
		owner.list.sortMode = ((owner is ListPeopleParty) ? UIList.SortMode.ByFeat : m); 
		owner.list.sortMode = m; 
	}
	if (Double)
	{