Elin Decompiled Documentation EA 23.199 Nightly
Loading...
Searching...
No Matches
AI_Fuck.cs
Go to the documentation of this file.
1using System.Collections.Generic;
2using UnityEngine;
3
4public class AI_Fuck : AIAct
5{
6 public enum FuckType
7 {
8 fuck,
9 tame
10 }
11
12 public Chara target;
13
14 public bool sell;
15
16 public bool bitch;
17
18 public bool succubus;
19
20 public bool ntr;
21
22 public int maxProgress;
23
24 public int progress;
25
26 public int fails;
27
28 public int totalAffinity;
29
30 public virtual FuckType Type => FuckType.fuck;
31
32 public override bool PushChara => false;
33
34 public override bool IsAutoTurn => true;
35
37
38 public override int MaxProgress => maxProgress;
39
40 public override int CurrentProgress => progress;
41
42 public override bool CancelOnAggro => !ntr;
43
44 public override bool CancelWhenDamaged => !ntr;
45
46 public override bool ShouldAllyAttack(Chara tg)
47 {
48 return tg != target;
49 }
50
51 public override IEnumerable<Status> Run()
52 {
53 if (target == null)
54 {
55 foreach (Chara chara in EClass._map.charas)
56 {
57 if (!chara.IsHomeMember() && !chara.IsDeadOrSleeping && chara.Dist(owner) <= 5)
58 {
59 target = chara;
60 break;
61 }
62 }
63 }
64 if (target == null)
65 {
66 yield return Cancel();
67 }
68 Chara cc = (sell ? target : owner);
69 Chara tc = (sell ? owner : target);
70 int destDist = ((Type == FuckType.fuck) ? 1 : 1);
71 yield return DoGoto(target.pos, destDist);
72 cc.Say(Type.ToString() + "_start", cc, tc);
73 isFail = () => !tc.IsAliveInCurrentZone || tc.Dist(owner) > 3;
74 if (Type == FuckType.tame)
75 {
76 cc.SetTempHand(1104, -1);
77 }
78 maxProgress = (ntr ? 10 : 25);
79 if (succubus)
80 {
81 cc.Talk("seduce");
82 }
83 for (int i = 0; i < maxProgress; i++)
84 {
85 progress = i;
86 yield return DoGoto(target.pos, destDist);
87 switch (Type)
88 {
89 case FuckType.fuck:
90 if (ntr)
91 {
92 cc.Say("ntr", cc, tc);
93 }
94 cc.LookAt(tc);
95 tc.LookAt(cc);
96 switch (i % 4)
97 {
98 case 0:
99 cc.renderer.PlayAnime(AnimeID.Attack, tc);
100 if (EClass.rnd(3) == 0 || sell)
101 {
102 cc.Talk("tail");
103 }
104 break;
105 case 2:
106 tc.renderer.PlayAnime(AnimeID.Shiver);
107 if (EClass.rnd(3) == 0)
108 {
109 tc.Talk("tailed");
110 }
111 break;
112 }
113 if (EClass.rnd(3) == 0 || sell)
114 {
115 target.AddCondition<ConWait>(50, force: true);
116 }
117 break;
118 case FuckType.tame:
119 {
120 int num = 100;
121 if (!tc.IsAnimal)
122 {
123 num += 50;
124 }
125 if (tc.IsHuman)
126 {
127 num += 50;
128 }
129 if (tc.IsInCombat)
130 {
131 num += 100;
132 }
133 if (tc == cc)
134 {
135 num = 50;
136 }
137 else if (tc.affinity.CurrentStage < Affinity.Stage.Intimate && EClass.rnd(6 * num / 100) == 0)
138 {
139 tc.AddCondition<ConFear>(60);
140 }
141 tc.interest -= (tc.IsPCFaction ? 20 : (2 * num / 100));
142 if (i == 0 || i == 10)
143 {
144 cc.Talk("goodBoy");
145 }
146 if (i % 5 == 0)
147 {
148 tc.PlaySound("brushing");
149 int num2 = cc.CHA / 2 + cc.Evalue(237) - tc.CHA * 2;
150 int num3;
151 if (EClass.rnd(cc.CHA / 2 + cc.Evalue(237)) > EClass.rnd(tc.CHA * num / 100))
152 {
153 num3 = 5 + Mathf.Clamp(num2 / 20, 0, 20);
154 }
155 else
156 {
157 num3 = -5 + ((!tc.IsPCFaction) ? Mathf.Clamp(num2 / 10, -30, 0) : 0);
158 fails++;
159 }
160 int num4 = 20;
162 {
163 num3 = ((EClass.rnd(3) == 0) ? 4 : 0);
164 num4 = 10;
165 }
166 totalAffinity += num3;
167 tc.ModAffinity(EClass.pc, num3, show: true, showOnlyEmo: true);
168 cc.elements.ModExp(237, num4);
169 if (EClass.rnd(4) == 0)
170 {
171 cc.stamina.Mod(-1);
172 }
173 }
174 break;
175 }
176 }
177 }
178 Finish();
179 }
180
181 public void Finish()
182 {
183 Chara chara = (sell ? target : owner);
184 Chara chara2 = (sell ? owner : target);
185 if (chara.isDead || chara2.isDead)
186 {
187 return;
188 }
189 bool flag = EClass.rnd(2) == 0;
190 switch (Type)
191 {
192 case FuckType.fuck:
193 {
194 for (int i = 0; i < 2; i++)
195 {
196 Chara chara3 = ((i == 0) ? chara : chara2);
197 chara3.RemoveCondition<ConDrunk>();
198 if (EClass.rnd(15) == 0 && !chara3.HasElement(1216))
199 {
200 chara3.AddCondition<ConDisease>(200);
201 }
202 chara3.ModExp(77, 250);
203 chara3.ModExp(71, 250);
204 chara3.ModExp(75, 250);
205 }
206 if (!chara2.HasElement(1216))
207 {
208 if (EClass.rnd(5) == 0)
209 {
210 chara2.AddCondition<ConParalyze>(500);
211 }
212 if (EClass.rnd(3) == 0)
213 {
214 chara2.AddCondition<ConInsane>(100 + EClass.rnd(100));
215 }
216 }
217 int num3 = CalcMoney.Whore(chara2, chara);
218 chara.Talk("tail_after");
219 bool flag3 = false;
220 if (succubus)
221 {
222 chara.ShowEmo(Emo.love);
223 chara2.ShowEmo(Emo.love);
224 EClass.player.forceTalk = true;
225 chara2.Talk("seduced");
226 }
227 else if (chara != EClass.pc)
228 {
229 Chara chara4 = chara;
230 Chara chara5 = chara2;
231 if (bitch)
232 {
233 chara = chara5;
234 chara2 = chara4;
235 }
236 Debug.Log("buyer:" + chara.Name + " seller:" + chara2.Name + " money:" + num3);
237 if (!chara.IsPC)
238 {
239 chara.ModCurrency(EClass.rndHalf(num3));
240 }
241 if (!chara2.IsPC && chara.GetCurrency() < num3 && EClass.rnd(2) == 0)
242 {
243 num3 = chara.GetCurrency();
244 }
245 Debug.Log("money:" + num3 + " buyer:" + chara.GetCurrency());
246 if (chara.GetCurrency() >= num3)
247 {
248 chara.Talk("tail_pay");
249 }
250 else
251 {
252 chara.Talk("tail_nomoney");
253 num3 = chara.GetCurrency();
254 chara2.Say("angry", chara2);
255 chara2.Talk("angry");
256 flag = (sell ? true : false);
257 if (EClass.rnd(chara.IsPC ? 2 : 20) == 0)
258 {
259 flag3 = true;
260 }
261 }
262 chara.ModCurrency(-num3);
263 if (chara2 == EClass.pc)
264 {
265 if (num3 > 0)
266 {
269 }
270 }
271 else
272 {
273 int num4 = (chara2.CHA * 10 + 100) / ((chara2.IsPCFaction && chara2.memberType == FactionMemberType.Default) ? 1 : 10);
274 if (chara2.GetCurrency() - num4 > 0)
275 {
276 chara2.c_allowance += num3;
277 }
278 else
279 {
280 chara2.ModCurrency(num3);
281 }
282 }
283 chara = chara4;
284 chara2 = chara5;
285 }
286 if (flag3)
287 {
288 chara2.DoHostileAction(chara);
289 }
290 if (chara.IsPCParty || chara2.IsPCParty)
291 {
292 chara.stamina.Mod(-5 - EClass.rnd(chara.stamina.max / 10 + (succubus ? StaminaCost(chara2, chara) : 0) + 1));
293 chara2.stamina.Mod(-5 - EClass.rnd(chara2.stamina.max / 20 + (succubus ? StaminaCost(chara, chara2) : 0) + 1));
294 }
295 SuccubusExp(chara, chara2);
296 SuccubusExp(chara2, chara);
297 chara2.ModAffinity(chara, flag ? 10 : (-5));
298 if (chara == EClass.pc || chara2 == EClass.pc)
299 {
301 }
302 if (ntr)
303 {
304 chara2.things.Find<TraitDreamBug>()?.ModNum(-1);
305 }
306 if (!ntr || !chara.HasElement(1239) || chara2.HasElement(1216))
307 {
308 break;
309 }
310 if (chara2.HasElement(758))
311 {
312 if (chara.ExistsOnMap)
313 {
314 chara.stamina.Mod(-1000000);
315 }
316 }
317 else if (chara2.ExistsOnMap)
318 {
319 chara2.stamina.Mod((!chara2.IsPCFaction) ? (-10000) : (chara2.IsPC ? (-25) : (-50)));
320 }
321 break;
322 }
323 case FuckType.tame:
324 {
325 int num = ((!chara2.IsPCFaction) ? (chara2.IsHuman ? 10 : 5) : (chara2.IsHuman ? 5 : 0));
326 Msg.Say("tame_end", target);
327 target.PlaySound("groomed");
328 target.PlayEffect("heal_tick");
329 target.hygiene.Mod(15);
330 if (chara == EClass.pc)
331 {
333 }
334 if (target == owner)
335 {
336 break;
337 }
338 if (totalAffinity > 0)
339 {
340 chara.Say("brush_success", target, owner);
341 }
342 else
343 {
344 chara.Say("brush_fail", target, owner);
345 num *= 5;
346 }
348 bool flag2 = num2 && chara2.affinity.CanInvite() && chara2.GetBestAttribute() < EClass.pc.CHA;
349 if (num2)
350 {
351 if (flag2)
352 {
353 chara.Say("tame_success", owner, target);
354 chara2.MakeAlly();
355 }
356 else
357 {
358 chara.Say("tame_fail", chara, chara2);
359 }
360 }
361 if (fails > 0 && num > EClass.rnd(100))
362 {
363 chara2.DoHostileAction(chara);
364 chara2.calmCheckTurn *= 3;
365 }
366 break;
367 }
368 }
369 static int StaminaCost(Chara c1, Chara c2)
370 {
371 return (int)Mathf.Max(10f * (float)c1.END / (float)Mathf.Max(c2.END, 1), 0f);
372 }
373 static void SuccubusExp(Chara c, Chara tg)
374 {
375 if (!c.HasElement(1216))
376 {
377 return;
378 }
379 foreach (Element item in tg.elements.ListBestAttributes())
380 {
381 if (c.elements.ValueWithoutLink(item.id) < item.ValueWithoutLink)
382 {
383 c.elements.ModTempPotential(item.id, 1 + EClass.rnd(item.ValueWithoutLink - c.elements.ValueWithoutLink(item.id) / 5 + 1));
384 c.Say("succubus_exp", c, item.Name.ToLower());
385 break;
386 }
387 }
388 }
389 }
390}
AnimeID
Definition: AnimeID.cs:2
Emo
Definition: Emo.cs:2
FactionMemberType
Definition: AIAct.cs:6
virtual Status Cancel()
Definition: AIAct.cs:291
new Chara owner
Definition: AIAct.cs:14
Func< bool > isFail
Definition: AIAct.cs:28
Status DoGoto(Point pos, int dist=0, bool ignoreConnection=false, Func< Status > _onChildFail=null)
Definition: AIAct.cs:432
override bool CancelWhenDamaged
Definition: AI_Fuck.cs:44
void Finish()
Definition: AI_Fuck.cs:181
bool sell
Definition: AI_Fuck.cs:14
int totalAffinity
Definition: AI_Fuck.cs:28
override bool IsAutoTurn
Definition: AI_Fuck.cs:34
override IEnumerable< Status > Run()
Definition: AI_Fuck.cs:51
override bool PushChara
Definition: AI_Fuck.cs:32
override int MaxProgress
Definition: AI_Fuck.cs:38
int progress
Definition: AI_Fuck.cs:24
override bool CancelOnAggro
Definition: AI_Fuck.cs:42
override int CurrentProgress
Definition: AI_Fuck.cs:40
bool succubus
Definition: AI_Fuck.cs:18
bool ntr
Definition: AI_Fuck.cs:20
int maxProgress
Definition: AI_Fuck.cs:22
int fails
Definition: AI_Fuck.cs:26
Chara target
Definition: AI_Fuck.cs:12
override bool ShouldAllyAttack(Chara tg)
Definition: AI_Fuck.cs:46
FuckType
Definition: AI_Fuck.cs:7
virtual FuckType Type
Definition: AI_Fuck.cs:30
bool bitch
Definition: AI_Fuck.cs:16
bool CanInvite()
Definition: Affinity.cs:54
Stage CurrentStage
Definition: Affinity.cs:32
static int Whore(Chara seller, Chara buyer)
Definition: CalcMoney.cs:55
void PlayAnime(AnimeID id, bool force)
bool IsPCFactionOrMinion
Definition: Card.cs:2234
int GetBestAttribute()
Definition: Card.cs:2592
virtual Chara Chara
Definition: Card.cs:2032
ElementContainerCard elements
Definition: Card.cs:39
int END
Definition: Card.cs:2299
bool HasElement(int ele, int req=1)
Definition: Card.cs:5725
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:5939
void Talk(string idTopic, string ref1=null, string ref2=null, bool forceSync=false)
Definition: Card.cs:6489
string Name
Definition: Card.cs:2099
int CHA
Definition: Card.cs:2309
bool ExistsOnMap
Definition: Card.cs:2047
Thing SetNum(int a)
Definition: Card.cs:3393
int GetCurrency(string id="money")
Definition: Card.cs:3873
Point pos
Definition: Card.cs:57
Effect PlayEffect(string id, bool useRenderPos=true, float range=0f, Vector3 fix=default(Vector3))
Definition: Card.cs:5973
void ShowEmo(Emo _emo=Emo.none, float duration=0f, bool skipSame=true)
Definition: Card.cs:5907
void ModCurrency(int a, string id="money")
Definition: Card.cs:3859
ThingContainer things
Definition: Card.cs:36
int Evalue(int ele)
Definition: Card.cs:2533
int Dist(Card c)
Definition: Card.cs:7404
void ModExp(string alias, int a)
Definition: Card.cs:2610
CardRenderer renderer
Definition: Card.cs:59
void Say(string lang, string ref1=null, string ref2=null)
Definition: Card.cs:6586
Definition: Chara.cs:10
override bool IsAliveInCurrentZone
Definition: Chara.cs:559
Condition AddCondition(string id, int p=100, bool force=false)
Definition: Chara.cs:8897
void ModAffinity(Chara c, int a, bool show=true, bool showOnlyEmo=false)
Definition: Chara.cs:7640
override bool IsPC
Definition: Chara.cs:610
override bool IsPCParty
Definition: Chara.cs:613
Stats hygiene
Definition: Chara.cs:1134
bool IsInCombat
Definition: Chara.cs:862
bool IsHuman
Definition: Chara.cs:877
bool IsAnimal
Definition: Chara.cs:865
override bool IsPCFaction
Definition: Chara.cs:669
override bool IsDeadOrSleeping
Definition: Chara.cs:571
void MakeAlly(bool msg=true)
Definition: Chara.cs:2232
FactionMemberType memberType
Definition: Chara.cs:46
Stats stamina
Definition: Chara.cs:1128
void SetTempHand(int right=0, int left=0)
Definition: Chara.cs:6471
bool IsHomeMember()
Definition: Chara.cs:6356
Affinity affinity
Definition: Chara.cs:312
void DoHostileAction(Card _tg, bool immediate=false)
Definition: Chara.cs:6121
bool isDead
Definition: Chara.cs:387
override void LookAt(Card c)
Definition: Chara.cs:3474
Definition: EClass.cs:5
static Map _map
Definition: EClass.cs:18
static int rnd(long a)
Definition: EClass.cs:58
static int rndHalf(int a)
Definition: EClass.cs:87
static Player player
Definition: EClass.cs:12
static Chara pc
Definition: EClass.cs:14
void ModExp(int ele, float a, bool chain=false)
Element ModTempPotential(int ele, int v, int threshMsg=0)
int ValueWithoutLink(int ele)
List< Element > ListBestAttributes()
List< Chara > charas
Definition: Map.cs:81
Definition: Msg.cs:5
static string Say(string idLang, string ref1, string ref2=null, string ref3=null, string ref4=null)
Definition: Msg.cs:58
long brush
Definition: Player.cs:163
long kimo
Definition: Player.cs:139
void ModKarma(int a)
Definition: Player.cs:2444
Stats stats
Definition: Player.cs:972
Thing DropReward(Thing t, bool silent=false)
Definition: Player.cs:2475
virtual void Mod(int a)
Definition: Stats.cs:135
virtual int max
Definition: Stats.cs:68
static TargetTypeChara Chara
Definition: TargetType.cs:17
Thing Find(int uid)
static Thing Create(string id, int idMat=-1, int lv=-1)
Definition: ThingGen.cs:53
static bool IsTamePossible(Chara c)