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)
public virtual bool CanTame()
AI_TendAnimal (1)
public override bool CanTame()
AIAct
@@ -131,6 +131,11 @@ public override MultiSprite GetStateIcon()
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
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()
}
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()
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()
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()
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()
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()
}
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
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()
},
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()
{
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
{
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)
{
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
[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
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)
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()
{
if (!EClass.debug.marryAnytime)
{
return list.IndexOf(this) >= 8;
return CurrentStage >= Stage.Love;
}
return true;
}
@@ -55,7 +73,7 @@ public bool CanSleepBeside()
{
if (!EClass.debug.marryAnytime)
{
return list.IndexOf(this) >= 8;
return CurrentStage >= Stage.Fond;
}
return true;
}
@@ -71,11 +89,11 @@ public Sprite GetIcon()
{
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)
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()
}
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()
}
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
fur,
hint,
fur2,
baby
baby,
brush_hate,
brush_like,
brush_like2,
brush_like3
}
GoalCombat
@@ -78,7 +78,7 @@ public override IEnumerable<Status> Run()
}
}
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()
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
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)
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
public class TraitRune : TraitMod
{
public override int DefaultEnc => 66;
public override string Tag => "modMelee";
}
TraitToolBrush
@@ -2,6 +2,27 @@ public class TraitToolBrush : TraitTool
{
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)
}
}
}
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;
}
}