Skip to content

EA 23.70 Nightly

December 31, 2024

15 files modified.

Important Changes

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

AI_Fuck (1)

cs
public virtual bool CanTame() 

AI_TendAnimal (1)

cs
public override bool CanTame() 

AIAct

@@ -131,6 +131,11 @@ public override MultiSprite GetStateIcon()

cs
		return (child ?? this).stateIcon;
	}

	public virtual bool ShouldAllyAttack(Chara tg) 
	{ 
		return child?.ShouldAllyAttack(tg) ?? true; 
	} 

	public virtual Point GetDestination()
	{
		if (!IsChildRunning)

AI_Fuck

@@ -41,11 +41,6 @@ public enum FuckType

cs

	public override bool CancelWhenDamaged => !ntr;

	public virtual bool CanTame() 
	{ 
		return false; 
	} 

	public override IEnumerable<Status> Run()
	{
		if (target == null)

@@ -109,27 +104,48 @@ public override IEnumerable<Status> Run()

cs
			}
			break;
		case FuckType.tame:
			if (EClass.rnd(8) == 0) 
		{ 
			int num = 100; 
			if (!tc.race.IsAnimal) 
			{ 
				num += 50; 
			} 
			if (tc.race.IsHuman) 
			{ 
				num += 50; 
			} 
			if (tc.IsInCombat) 
			{
				tc.AddCondition<ConFear>(50); 
				num += 100; 
			} 
			if (tc.affinity.CurrentStage < Affinity.Stage.Intimate && EClass.rnd(6 * num / 100) == 0) 
			{ 
				tc.AddCondition<ConFear>(60); 
			}
			if (i % 5 == 0)
			{
				tc.PlaySound("brushing");
				int num = cc.CHA + cc.Evalue(237) - tc.CHA * 2; 
				int num2 = ((EClass.rnd(cc.CHA + cc.Evalue(237)) <= EClass.rnd(tc.CHA)) ? (-5 + Mathf.Clamp(num / 10, -30, 0)) : (5 + Mathf.Clamp(num / 10, 0, 20))); 
				totalAffinity += num2; 
				tc.ModAffinity(EClass.pc, num2, show: true, showOnlyEmo: true); 
				Debug.Log(num2 + "/" + tc._affinity); 
				int num2 = cc.CHA / 2 + cc.Evalue(237) - tc.CHA * 2; 
				int num3 = ((EClass.rnd(cc.CHA / 2 + cc.Evalue(237)) <= EClass.rnd(tc.CHA * num / 100)) ? (-5 + Mathf.Clamp(num2 / 10, -30, 0)) : (5 + Mathf.Clamp(num2 / 15, 0, 20))); 
				int a = 15; 
				if (tc.IsPCFactionOrMinion && tc.affinity.CurrentStage >= Affinity.Stage.Fond) 
				{ 
					num3 = ((EClass.rnd(3) == 0) ? 4 : 0); 
					a = 10; 
				} 
				totalAffinity += num3; 
				tc.ModAffinity(EClass.pc, num3, show: true, showOnlyEmo: true); 
				cc.elements.ModExp(237, a); 
				Debug.Log(num3 + "/" + tc._affinity); 
			}
			tc.interest -= (tc.IsPCFaction ? 20 : (tc.IsHuman ? 6 : 2)); 
			tc.interest -= (tc.IsPCFaction ? 20 : (2 * num / 100)); 
			if (i == 0 || i == 10)
			{
				cc.Talk("goodBoy");
			}
			cc.elements.ModExp(237, 15); 
			break;
		}
		} 
	}
	Finish();
}

@@ -143,10 +159,6 @@ public void Finish()

cs
		return;
	}
	bool flag = EClass.rnd(2) == 0;
	int num; 
	int num2; 
	int num3; 
	bool flag3; 
	switch (Type)
	{
	case FuckType.fuck:

@@ -174,9 +186,9 @@ public void Finish()

cs
				chara2.AddCondition<ConInsane>(100 + EClass.rnd(100));
			}
		}
		int num4 = CalcMoney.Whore(chara2, chara); 
		int num3 = CalcMoney.Whore(chara2, chara); 
		chara.Talk("tail_after");
		bool flag2 = false; 
		bool flag3 = false; 
		if (succubus)
		{
			chara.ShowEmo(Emo.love);

@@ -193,57 +205,57 @@ public void Finish()

cs
				chara = chara5;
				chara2 = chara4;
			}
			Debug.Log("buyer:" + chara.Name + " seller:" + chara2.Name + " money:" + num4); 
			Debug.Log("buyer:" + chara.Name + " seller:" + chara2.Name + " money:" + num3); 
			if (!chara.IsPC)
			{
				chara.ModCurrency(EClass.rndHalf(num4)); 
				chara.ModCurrency(EClass.rndHalf(num3)); 
			}
			if (!chara2.IsPC && chara.GetCurrency() < num4 && EClass.rnd(2) == 0) 
			if (!chara2.IsPC && chara.GetCurrency() < num3 && EClass.rnd(2) == 0) 
			{
				num4 = chara.GetCurrency(); 
				num3 = chara.GetCurrency(); 
			}
			Debug.Log("money:" + num4 + " buyer:" + chara.GetCurrency()); 
			if (chara.GetCurrency() >= num4) 
			Debug.Log("money:" + num3 + " buyer:" + chara.GetCurrency()); 
			if (chara.GetCurrency() >= num3) 
			{
				chara.Talk("tail_pay");
			}
			else
			{
				chara.Talk("tail_nomoney");
				num4 = chara.GetCurrency(); 
				num3 = chara.GetCurrency(); 
				chara2.Say("angry", chara2);
				chara2.Talk("angry");
				flag = (sell ? true : false);
				if (EClass.rnd(chara.IsPC ? 2 : 20) == 0)
				{
					flag2 = true; 
					flag3 = true; 
				}
			}
			chara.ModCurrency(-num4); 
			chara.ModCurrency(-num3); 
			if (chara2 == EClass.pc)
			{
				if (num4 > 0) 
				if (num3 > 0) 
				{
					EClass.player.DropReward(ThingGen.Create("money").SetNum(num4)); 
					EClass.player.DropReward(ThingGen.Create("money").SetNum(num3)); 
					EClass.player.ModKarma(-1);
				}
			}
			else
			{
				int num5 = (chara2.CHA * 10 + 100) / ((chara2.IsPCFaction && chara2.memberType == FactionMemberType.Default) ? 1 : 10); 
				if (chara2.GetCurrency() - num5 > 0) 
				int num4 = (chara2.CHA * 10 + 100) / ((chara2.IsPCFaction && chara2.memberType == FactionMemberType.Default) ? 1 : 10); 
				if (chara2.GetCurrency() - num4 > 0) 
				{
					chara2.c_allowance += num4; 
					chara2.c_allowance += num3; 
				}
				else
				{
					chara2.ModCurrency(num4); 
					chara2.ModCurrency(num3); 
				}
			}
			chara = chara4;
			chara2 = chara5;
		}
		if (flag2) 
		if (flag3) 
		{
			chara2.DoHostileAction(chara);
		}

@@ -258,38 +270,22 @@ public void Finish()

cs
		break;
	}
	case FuckType.tame:
	{ 
		int num = ((!chara2.IsPCFaction) ? (chara2.IsHuman ? 10 : 5) : (chara2.IsHuman ? 5 : 0)); 
		if (totalAffinity > 0) 
		{
			num = ((!chara2.IsPCFaction) ? (chara2.IsHuman ? 10 : 5) : (chara2.IsHuman ? 5 : 0)); 
			if (totalAffinity > 0) 
			{ 
				chara.Say("brush_success", target, owner); 
			} 
			else
			{ 
				chara.Say("brush_fail", target, owner); 
				num *= 5; 
			} 
			if (CanTame() && !EClass._zone.IsInstance && chara2.c_bossType == BossType.none) 
			{ 
				num2 = (chara2.trait.CanInvite ? 1 : 0); 
				if (num2 != 0 && chara2.affinity.CanInvite()) 
				{ 
					num3 = ((EClass.pc.GetBestAttribute() > chara2.CHA) ? 1 : 0); 
					goto IL_04ad; 
				} 
			} 
			else
			{ 
				num2 = 0; 
			} 
			num3 = 0; 
			goto IL_04ad; 
			chara.Say("brush_success", target, owner); 
		}
		IL_04ad: 
		flag3 = (byte)num3 != 0; 
		if (num2 != 0) 
		else
		{
			if (flag3) 
			chara.Say("brush_fail", target, owner); 
			num *= 5; 
		} 
		bool num2 = TraitToolBrush.IsTamePossible(target.Chara); 
		bool flag2 = num2 && chara2.affinity.CanInvite() && chara2.GetBestAttribute() < EClass.pc.CHA; 
		if (num2) 
		{ 
			if (flag2) 
			{
				chara.Say("tame_success", owner, target);
				chara2.MakeAlly();

@@ -306,6 +302,7 @@ public void Finish()

cs
		}
		break;
	}
	} 
	static int StaminaCost(Chara c1, Chara c2)
	{
		return (int)Mathf.Max(10f * (float)c1.END / (float)Mathf.Max(c2.END, 1), 0f);

AI_Shear

@@ -3,6 +3,11 @@

cs

public class AI_Shear : AI_TargetCard
{
	public override bool ShouldAllyAttack(Chara tg) 
	{ 
		return tg != target; 
	} 

	public override string GetText(string str = "")
	{
		string[] list = Lang.GetList("fur");

AI_Slaughter

@@ -62,7 +62,7 @@ public override IEnumerable<Status> Run()

cs
		},
		onProgressComplete = delegate
		{
			bool num = target.HasElement(1237) || target.HasElement(701); 
			bool num = target.HasElement(1237) || target.Chara.race.id == "cat"; 
			target.pos.PlayEffect("revive");
			target.Chara.ModAffinity(owner, -50);
			owner.ShowEmo(Emo.love);

@@ -84,8 +84,7 @@ public override IEnumerable<Status> Run()

cs
			{
				target.Chara.homeBranch.BanishMember(target.Chara, skipMsg: true);
			}
			owner.elements.ModExp(237, 250); 
			owner.elements.ModExp(290, 250); 
			owner.elements.ModExp(290, 200); 
			EClass.pc.stamina.Mod(-3);
			if (num)
			{

AI_TendAnimal

@@ -2,16 +2,8 @@ public class AI_TendAnimal : AI_Fuck

cs
{
	public override FuckType Type => FuckType.tame;

	public override bool CanTame() 
	public override bool ShouldAllyAttack(Chara tg) 
	{
		if (target == null || target.isDead) 
		{ 
			return false; 
		} 
		if (!target.trait.CanBeTamed) 
		{ 
			return false; 
		} 
		return true; 
		return tg != target; 
	}
}

ActDrawWater

@@ -27,7 +27,7 @@ public static bool HasWaterSource(Point p)

cs
{
	foreach (Thing thing in p.Things)
	{
		if (thing.trait is TraitWell && thing.c_charges > 0) 
		if ((thing.trait is TraitWell && thing.c_charges > 0) || thing.trait is TraitBath || thing.id == "387" || thing.id == "486" || thing.id == "876" || thing.id == "867" || thing.id == "1158") 
		{
			return true;
		}

Affinity

@@ -5,6 +5,22 @@

cs
[Serializable]
public class Affinity : EClass
{
	public enum Stage
	{ 
		Foe, 
		Hate, 
		Annoying, 
		Normal, 
		Approved, 
		Friendly, 
		Respected, 
		Intimate, 
		Fond, 
		Love, 
		LoveLove, 
		LoveLoveLove
	} 

	public static Chara CC;

	public int value;

@@ -13,7 +29,9 @@ public class Affinity : EClass

cs

	public static List<Affinity> list => EClass.gamedata.affinities;

	public string Name => Lang.GetList("affinity")[list.IndexOf(this)]; 
	public Stage CurrentStage => list.IndexOf(this).ToEnum<Stage>(); 

	public string Name => Lang.GetList("affinity").TryGet(list.IndexOf(this), list.Count - 1); 

	public static Affinity Get(Chara c)
	{

@@ -30,14 +48,14 @@ public static Affinity Get(Chara c)

cs

	public bool CanForceTradeEquip()
	{
		return list.IndexOf(this) >= 6; 
		return CurrentStage >= Stage.Respected; 
	}

	public bool CanInvite()
	{
		if (!EClass.debug.inviteAnytime)
		{
			return list.IndexOf(this) >= 6; 
			return CurrentStage >= Stage.Respected; 
		}
		return true;
	}

@@ -46,7 +64,7 @@ public bool CanMarry()

cs
{
	if (!EClass.debug.marryAnytime)
	{
		return list.IndexOf(this) >= 8; 
		return CurrentStage >= Stage.Love; 
	}
	return true;
}

@@ -55,7 +73,7 @@ public bool CanSleepBeside()

cs
{
	if (!EClass.debug.marryAnytime)
	{
		return list.IndexOf(this) >= 8; 
		return CurrentStage >= Stage.Fond; 
	}
	return true;
}

@@ -71,11 +89,11 @@ public Sprite GetIcon()

cs
	{
		return EClass.core.refs.icons.affnity.dontLike;
	}
	if (affinity >= 100) 
	if (CurrentStage >= Stage.Love) 
	{
		return EClass.core.refs.icons.affnity.love;
	}
	if (affinity >= 10) 
	if (CurrentStage >= Stage.Respected) 
	{
		return EClass.core.refs.icons.affnity.like;
	}

@@ -122,12 +140,23 @@ public Thing OnGift(Thing t)

cs
	public void OnTalkRumor()
	{
		bool flag = EClass.rnd(60 + EClass.pc.CHA * 2 + EClass.pc.Evalue(291) * 3) > 50 + difficulty + EClass.rnd(CC.CHA + 1);
		CC.ModAffinity(EClass.pc, flag ? (EClass.rnd(4) + 1) : (-EClass.rnd(4) - 1), show: false); 
		if (!EClass.debug.unlimitedInterest)
		{
			CC.interest -= 10 + EClass.rnd(10);
		}
		EClass.pc.ModExp(291, 20); 
		if (CC.IsPCFactionOrMinion && CurrentStage >= Stage.Intimate) 
		{ 
			if (EClass.rnd(4) == 0) 
			{ 
				CC.ModAffinity(EClass.pc, flag ? 1 : 0, show: false); 
				EClass.pc.ModExp(291, 5); 
			} 
		} 
		else
		{ 
			CC.ModAffinity(EClass.pc, flag ? (EClass.rnd(4) + 1) : (-EClass.rnd(4) - 1), show: false); 
			EClass.pc.ModExp(291, 20); 
		} 
	}

	public int Mod(int a)

Chara

@@ -5635,7 +5635,7 @@ public bool FindNewEnemy()

cs
			}
			stealthSeen++;
		}
		else if (Los.IsVisible(pos.x, chara.pos.x, pos.z, chara.pos.z) && (!flag2 || EClass.pc.isBlind || EClass.pc.CanSeeLos(chara)) && (!IsPCFaction || !(EClass.pc.ai is AI_Shear aI_Shear) || aI_Shear.target != chara)) 
		else if (Los.IsVisible(pos.x, chara.pos.x, pos.z, chara.pos.z) && (!flag2 || EClass.pc.isBlind || EClass.pc.CanSeeLos(chara)) && (!IsPCFaction || EClass.pc.ai.ShouldAllyAttack(chara))) 
		{
			DoHostileAction(chara);
			enemy = chara;

CoreDebug

@@ -905,6 +905,10 @@ public void UpdateInput()

cs
	}
	if (Input.GetKeyDown(KeyCode.F2))
	{
		foreach (Chara chara in EClass._map.charas) 
		{ 
			chara.ModAffinity(EClass.pc, EScriptable.rnd(300)); 
		} 
		Thing to = ThingGen.Create("gene");
		to = DNA.CopyDNA(DNA.GenerateRandomGene(), to);
		EClass.pc.Pick(to);

Emo2

@@ -16,5 +16,9 @@ public enum Emo2

cs
	fur,
	hint,
	fur2,
	baby 
	baby, 
	brush_hate, 
	brush_like, 
	brush_like2, 
	brush_like3 
}

GoalCombat

@@ -78,7 +78,7 @@ public override IEnumerable<Status> Run()

cs
			}
		}
		tc = owner.enemy;
		if (tc != null && owner.IsPCFaction && EClass.pc.ai is AI_Shear aI_Shear && aI_Shear.target == tc) 
		if (tc != null && owner.IsPCFaction && !EClass.pc.ai.ShouldAllyAttack(tc)) 
		{
			tc = (owner.enemy = null);
		}

HotItemActionSleep

@@ -11,7 +11,7 @@ public override void Perform()

cs
		Msg.Say((EClass._zone.events.GetEvent<ZoneEventQuest>() != null) ? "badidea" : "notSleepy");
		return;
	}
	if (EClass.player.returnInfo != null) 
	if (EClass.player.returnInfo != null || EClass.pc.isRestrained) 
	{
		Msg.Say("badidea");
		return;

TraitMod

@@ -2,6 +2,8 @@

cs

public class TraitMod : TraitItem
{
	public virtual int DefaultEnc => 600; 

	public virtual string Tag => "mod";

	public override bool CanStack => false;

@@ -13,7 +15,7 @@ public override void OnCreate(int lv)

cs
	Tuple<SourceElement.Row, int> tuple = Thing.GetEnchant(lv, (SourceElement.Row r) => r.tag.Contains(Tag), neg: false);
	if (tuple == null)
	{
		tuple = new Tuple<SourceElement.Row, int>(EClass.sources.elements.map[600], EClass.rnd(10) + 1); 
		tuple = new Tuple<SourceElement.Row, int>(EClass.sources.elements.map[DefaultEnc], EClass.rnd(10) + 1); 
	}
	owner.refVal = tuple.Item1.id;
	owner.encLV = tuple.Item2;

TraitRune

@@ -1,4 +1,6 @@

cs
public class TraitRune : TraitMod
{
	public override int DefaultEnc => 66; 

	public override string Tag => "modMelee";
}

TraitToolBrush

@@ -2,6 +2,27 @@ public class TraitToolBrush : TraitTool

cs
{
	public override bool DisableAutoCombat => true;

	public override Emo2 GetHeldEmo(Chara c) 
	{ 
		if (c.IsPC || c.interest <= 0) 
		{ 
			return Emo2.none; 
		} 
		if (c._affinity < 0) 
		{ 
			return Emo2.brush_hate; 
		} 
		if (c.affinity.CurrentStage >= Affinity.Stage.Respected) 
		{ 
			return Emo2.brush_like3; 
		} 
		if (c.affinity.CurrentStage >= Affinity.Stage.Approved) 
		{ 
			return Emo2.brush_like2; 
		} 
		return Emo2.brush_like; 
	} 

	public override void TrySetHeldAct(ActPlan p)
	{
		foreach (Chara chara in p.pos.Charas)

@@ -15,4 +36,21 @@ public override void TrySetHeldAct(ActPlan p)

cs
			}
		}
	}

	public static bool IsTamePossible(Chara c) 
	{ 
		if (c == null || c.isDead) 
		{ 
			return false; 
		} 
		if (!c.trait.CanBeTamed) 
		{ 
			return false; 
		} 
		if (!EClass._zone.IsInstance && c.c_bossType == BossType.none) 
		{ 
			return c.trait.CanInvite; 
		} 
		return false; 
	} 
}