Elin Decompiled Documentation EA 23.286 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 enum Variation
13 {
14 Normal,
15 Bitch,
17 NTR,
19 Slime,
21 }
22
24
25 public Chara target;
26
27 public bool sell;
28
29 public bool succubus;
30
31 public int maxProgress;
32
33 public int progress;
34
35 public int fails;
36
37 public int totalAffinity;
38
39 public virtual FuckType Type => FuckType.fuck;
40
42 {
43 get
44 {
45 if (variation == Variation.Normal && owner != null && target != null && target != owner && (owner == EClass.pc || owner.IsMarried))
46 {
47 if (target != EClass.pc)
48 {
49 return target.IsMarried;
50 }
51 return true;
52 }
53 return false;
54 }
55 }
56
57 public override bool PushChara => false;
58
59 public override bool IsAutoTurn => true;
60
62
63 public override int MaxProgress => maxProgress;
64
65 public override int CurrentProgress => progress;
66
67 public override bool CancelOnAggro
68 {
69 get
70 {
71 if (variation != Variation.NTR && variation != Variation.Bloodsuck)
72 {
73 return variation != Variation.Slime;
74 }
75 return false;
76 }
77 }
78
79 public override bool CancelWhenDamaged => CancelOnAggro;
80
81 public override bool ShouldAllyAttack(Chara tg)
82 {
83 return tg != target;
84 }
85
86 public override IEnumerable<Status> Run()
87 {
88 if (target == null)
89 {
90 foreach (Chara chara in EClass._map.charas)
91 {
92 if (!chara.IsHomeMember() && !chara.IsDeadOrSleeping && chara.Dist(owner) <= 5)
93 {
94 target = chara;
95 break;
96 }
97 }
98 }
99 if (target == null)
100 {
101 yield return Cancel();
102 }
103 Chara cc = (sell ? target : owner);
104 Chara tc = (sell ? owner : target);
105 int destDist = ((Type == FuckType.fuck) ? 1 : 1);
106 if (owner.host != target)
107 {
108 yield return DoGoto(target.pos, destDist);
109 }
110 cc.Say((variation == Variation.Slime) ? "slime_start" : ((variation == Variation.Bloodsuck) ? "suck_start" : (Type.ToString() + "_start")), cc, tc);
111 isFail = () => !tc.IsAliveInCurrentZone || tc.Dist(owner) > 3;
112 if (Type == FuckType.tame)
113 {
114 cc.SetTempHand(1104, -1);
115 }
116 maxProgress = ((variation == Variation.NTR || variation == Variation.Bloodsuck) ? 10 : 25);
117 switch (variation)
118 {
119 case Variation.Succubus:
120 cc.Talk("seduce");
121 break;
122 case Variation.Bloodsuck:
123 cc.PlaySound("bloodsuck");
124 break;
125 case Variation.Slime:
126 cc.PlaySound("slime");
127 target.AddCondition<ConEntangle>(500, force: true);
128 break;
129 }
130 for (int i = 0; i < maxProgress; i++)
131 {
132 progress = i;
133 if (owner.host != target)
134 {
135 yield return DoGoto(target.pos, destDist);
136 }
137 switch (Type)
138 {
139 case FuckType.fuck:
140 if (variation == Variation.NTR)
141 {
142 cc.Say("ntr", cc, tc);
143 }
144 cc.LookAt(tc);
145 tc.LookAt(cc);
146 switch (i % 4)
147 {
148 case 0:
149 cc.renderer.PlayAnime(AnimeID.Attack, tc);
150 if (EClass.rnd(3) == 0 || sell)
151 {
152 cc.Talk("tail");
153 }
154 break;
155 case 2:
156 tc.renderer.PlayAnime(AnimeID.Shiver);
157 if (EClass.rnd(3) == 0)
158 {
159 tc.Talk("tailed");
160 }
161 break;
162 }
163 if (((cc.HasElement(1216) || tc.HasElement(1216)) ? 100 : 20) > EClass.rnd(100))
164 {
165 ((EClass.rnd(2) == 0) ? cc : tc).PlayEffect("love2");
166 }
167 if (variation == Variation.Slime)
168 {
170 }
171 if (EClass.rnd(3) == 0 || sell)
172 {
173 if (variation == Variation.Slime)
174 {
175 target.AddCondition<ConSupress>(200, force: true);
176 }
177 else
178 {
179 target.AddCondition<ConWait>(50, force: true);
180 }
181 }
182 if (variation == Variation.Bloodsuck || variation == Variation.Slime)
183 {
184 owner.pos.TryWitnessCrime(cc, tc, 4, (Chara c) => EClass.rnd(cc.HasCondition<ConTransmuteBat>() ? 50 : 20) == 0);
185 }
186 break;
187 case FuckType.tame:
188 {
189 int num = 100;
190 if (!tc.IsAnimal)
191 {
192 num += 50;
193 }
194 if (tc.IsHuman)
195 {
196 num += 50;
197 }
198 if (tc.IsInCombat)
199 {
200 num += 100;
201 }
202 if (tc == cc)
203 {
204 num = 50;
205 }
206 else if (tc.affinity.CurrentStage < Affinity.Stage.Intimate && EClass.rnd(6 * num / 100) == 0)
207 {
208 tc.AddCondition<ConFear>(60);
209 }
210 tc.interest -= (tc.IsPCFaction ? 20 : (2 * num / 100));
211 if (i == 0 || i == 10)
212 {
213 cc.Talk("goodBoy");
214 }
215 if (i % 5 == 0)
216 {
217 tc.PlaySound("brushing");
218 int num2 = cc.CHA / 2 + cc.Evalue(237) - tc.CHA * 2;
219 int num3;
220 if (EClass.rnd(cc.CHA / 2 + cc.Evalue(237)) > EClass.rnd(tc.CHA * num / 100))
221 {
222 num3 = 5 + Mathf.Clamp(num2 / 20, 0, 20);
223 }
224 else
225 {
226 num3 = -5 + ((!tc.IsPCFaction) ? Mathf.Clamp(num2 / 10, -30, 0) : 0);
227 fails++;
228 }
229 int num4 = 20;
231 {
232 num3 = ((EClass.rnd(3) == 0) ? 4 : 0);
233 num4 = 10;
234 }
235 totalAffinity += num3;
236 tc.ModAffinity(EClass.pc, num3, show: true, showOnlyEmo: true);
237 cc.elements.ModExp(237, num4);
238 if (EClass.rnd(4) == 0)
239 {
240 cc.stamina.Mod(-1);
241 }
242 }
243 break;
244 }
245 }
246 }
247 Finish();
248 }
249
250 public void Finish()
251 {
252 Chara chara = (sell ? target : owner);
253 Chara chara2 = (sell ? owner : target);
254 if (chara.isDead || chara2.isDead)
255 {
256 return;
257 }
258 bool flag = EClass.rnd(2) == 0;
259 switch (Type)
260 {
261 case FuckType.fuck:
262 {
263 if (variation == Variation.Bloodsuck || variation == Variation.Slime)
264 {
265 if (EClass.rnd(2) == 0)
266 {
267 chara2.AddCondition<ConConfuse>(500);
268 }
269 if (EClass.rnd(2) == 0)
270 {
271 chara2.AddCondition<ConDim>(500);
272 }
273 if (EClass.rnd(2) == 0)
274 {
275 chara2.AddCondition<ConParalyze>(500);
276 }
277 if (EClass.rnd(10) == 0)
278 {
279 chara2.AddCondition<ConInsane>(100 + EClass.rnd(100));
280 }
281 }
282 else
283 {
284 for (int i = 0; i < 2; i++)
285 {
286 Chara chara3 = ((i == 0) ? chara : chara2);
287 chara3.RemoveCondition<ConDrunk>();
288 if (EClass.rnd(15) == 0 && !chara3.HasElement(1216))
289 {
290 chara3.AddCondition<ConDisease>(200);
291 }
292 chara3.ModExp(77, 250);
293 chara3.ModExp(71, 250);
294 chara3.ModExp(75, 250);
295 }
296 if (!chara2.HasElement(1216))
297 {
298 if (EClass.rnd(5) == 0)
299 {
300 chara2.AddCondition<ConParalyze>(500);
301 }
302 if (EClass.rnd(3) == 0)
303 {
304 chara2.AddCondition<ConInsane>(100 + EClass.rnd(100));
305 }
306 }
307 }
308 chara.Talk("tail_after");
309 bool flag3 = false;
310 if (variation == Variation.Succubus)
311 {
312 chara.ShowEmo(Emo.love);
313 chara2.ShowEmo(Emo.love);
314 EClass.player.forceTalk = true;
315 chara2.Talk("seduced");
316 }
317 else if (variation != Variation.NTR && variation != Variation.Bloodsuck && variation != Variation.Slime && chara != EClass.pc)
318 {
320 {
321 flag = true;
322 }
323 else
324 {
325 int num3 = CalcMoney.Whore(chara2, chara);
326 Chara chara4 = chara;
327 Chara chara5 = chara2;
328 if (variation == Variation.Bitch)
329 {
330 chara = chara5;
331 chara2 = chara4;
332 }
333 Debug.Log("buyer:" + chara.Name + " seller:" + chara2.Name + " money:" + num3);
334 if (!chara.IsPC)
335 {
336 chara.ModCurrency(EClass.rndHalf(num3));
337 }
338 if (!chara2.IsPC && chara.GetCurrency() < num3 && EClass.rnd(2) == 0)
339 {
340 num3 = chara.GetCurrency();
341 }
342 Debug.Log("money:" + num3 + " buyer:" + chara.GetCurrency());
343 if (chara.GetCurrency() >= num3)
344 {
345 chara.Talk("tail_pay");
346 }
347 else
348 {
349 chara.Talk("tail_nomoney");
350 num3 = chara.GetCurrency();
351 chara2.Say("angry", chara2);
352 chara2.Talk("angry");
353 flag = (sell ? true : false);
354 if (EClass.rnd(chara.IsPC ? 2 : 20) == 0)
355 {
356 flag3 = true;
357 }
358 }
359 chara.ModCurrency(-num3);
360 if (chara2 == EClass.pc)
361 {
362 if (num3 > 0)
363 {
366 }
367 }
368 else
369 {
370 int num4 = (chara2.CHA * 10 + 100) / ((chara2.IsPCFaction && chara2.memberType == FactionMemberType.Default) ? 1 : 10);
371 if (chara2.GetCurrency() - num4 > 0)
372 {
373 chara2.c_allowance += num3;
374 }
375 else
376 {
377 chara2.ModCurrency(num3);
378 }
379 }
380 chara = chara4;
381 chara2 = chara5;
382 }
383 }
384 if (flag3)
385 {
386 chara2.DoHostileAction(chara);
387 }
388 if (variation == Variation.Bloodsuck)
389 {
390 int value = chara.hunger.value;
391 Thing food = CraftUtil.MakeBloodMeal(chara, chara2);
392 FoodEffect.Proc(chara, food, consume: false);
393 chara2.AddCondition<ConBleed>(EClass.rndHalf(value * 10));
394 }
395 else
396 {
397 if (chara.IsPCParty || chara2.IsPCParty)
398 {
399 chara.stamina.Mod(-5 - EClass.rnd(chara.stamina.max / 10 + ((variation == Variation.Succubus) ? StaminaCost(chara2, chara) : 0) + 1));
400 chara2.stamina.Mod(-5 - EClass.rnd(chara2.stamina.max / 20 + ((variation == Variation.Succubus) ? StaminaCost(chara, chara2) : 0) + 1));
401 }
402 SuccubusExp(chara, chara2);
403 SuccubusExp(chara2, chara);
404 }
405 chara2.ModAffinity(chara, (flag || (chara.IsPC && chara2.affinity.CanSleepBeside() && EClass.rnd(10) != 0)) ? 10 : (-5));
406 if (chara == EClass.pc || chara2 == EClass.pc)
407 {
409 }
410 switch (variation)
411 {
412 case Variation.NTR:
413 {
414 Thing thing2 = chara2.things.Find<TraitDreamBug>();
415 if (thing2 != null)
416 {
417 thing2.ModNum(-1);
418 if (chara.IsPC)
419 {
420 Msg.Say("dream_spell", EClass.sources.elements.map[9156].GetName().ToLowerInvariant());
421 EClass.pc.GainAbility(9156, EClass.rnd(2) + 1);
422 }
423 }
424 if (!chara.HasElement(1239) || chara2.HasElement(1216))
425 {
426 break;
427 }
428 if (chara2.HasElement(758))
429 {
430 if (chara.ExistsOnMap)
431 {
432 chara.stamina.Mod(-1000000);
433 }
434 }
435 else if (chara2.ExistsOnMap)
436 {
437 chara2.stamina.Mod((!chara2.IsPCFaction) ? (-10000) : (chara2.IsPC ? (-25) : (-50)));
438 }
439 break;
440 }
441 case Variation.Bloodsuck:
442 if (chara2.HasElement(758) && chara.ExistsOnMap)
443 {
444 chara.stamina.Mod(-1000000);
445 }
446 break;
447 case Variation.Slime:
448 {
449 Thing thing = null;
450 for (int j = 0; j < 10; j++)
451 {
452 thing = target.MakeGene((j < 3) ? DNA.Type.Superior : DNA.Type.Default);
453 thing.c_DNA.MakeSlimeFood(chara);
454 if (thing.c_DNA.GetInvalidAction(chara) != null || thing.c_DNA.GetInvalidFeat(chara) != null)
455 {
456 thing.c_DNA.vals.Clear();
457 thing.c_DNA.type = DNA.Type.Inferior;
458 continue;
459 }
460 thing.MakeFoodFrom(target);
461 thing.elements.ModBase(10, 20);
462 thing.elements.ModBase(18, 100);
463 break;
464 }
465 FoodEffect.Proc(chara, thing, consume: false);
466 chara.elements.ModExp(6608, 1000f);
467 break;
468 }
469 }
471 {
472 chara.Say("tender_hug", chara, chara2);
473 }
474 break;
475 }
476 case FuckType.tame:
477 {
478 int num = ((!chara2.IsPCFaction) ? (chara2.IsHuman ? 10 : 5) : (chara2.IsHuman ? 5 : 0));
479 Msg.Say("tame_end", target);
480 target.PlaySound("groomed");
481 target.PlayEffect("heal_tick");
482 target.hygiene.Mod(15);
483 if (chara == EClass.pc)
484 {
486 }
487 if (target == owner)
488 {
489 break;
490 }
491 if (totalAffinity > 0)
492 {
493 chara.Say("brush_success", target, owner);
494 }
495 else
496 {
497 chara.Say("brush_fail", target, owner);
498 num *= 5;
499 }
501 bool flag2 = num2 && chara2.affinity.CanInvite() && chara2.GetBestAttribute() < EClass.pc.CHA;
502 if (num2)
503 {
504 if (flag2)
505 {
506 chara.Say("tame_success", owner, target);
507 chara2.MakeAlly();
508 }
509 else
510 {
511 chara.Say("tame_fail", chara, chara2);
512 }
513 }
514 if (fails > 0 && num > EClass.rnd(100))
515 {
516 chara2.DoHostileAction(chara);
517 chara2.calmCheckTurn *= 3;
518 }
519 break;
520 }
521 }
522 static int StaminaCost(Chara c1, Chara c2)
523 {
524 return (int)Mathf.Max(10f * (float)c1.END / (float)Mathf.Max(c2.END, 1), 0f);
525 }
526 static void SuccubusExp(Chara c, Chara tg)
527 {
528 if (!c.HasElement(1216))
529 {
530 return;
531 }
532 foreach (Element item in tg.elements.ListBestAttributes())
533 {
534 if (c.elements.ValueWithoutLink(item.id) < item.ValueWithoutLink)
535 {
536 c.elements.ModTempPotential(item.id, 1 + EClass.rnd(item.ValueWithoutLink - c.elements.ValueWithoutLink(item.id) / 5 + 1));
537 c.Say("succubus_exp", c, item.Name.ToLower());
538 break;
539 }
540 }
541 }
542 }
543}
AnimeID
Definition: AnimeID.cs:2
Emo
Definition: Emo.cs:2
FactionMemberType
Definition: AIAct.cs:6
virtual Status Cancel()
Definition: AIAct.cs:305
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:446
override bool CancelWhenDamaged
Definition: AI_Fuck.cs:79
void Finish()
Definition: AI_Fuck.cs:250
bool sell
Definition: AI_Fuck.cs:27
int totalAffinity
Definition: AI_Fuck.cs:37
override bool IsAutoTurn
Definition: AI_Fuck.cs:59
override IEnumerable< Status > Run()
Definition: AI_Fuck.cs:86
override bool PushChara
Definition: AI_Fuck.cs:57
override int MaxProgress
Definition: AI_Fuck.cs:63
int progress
Definition: AI_Fuck.cs:33
override bool CancelOnAggro
Definition: AI_Fuck.cs:68
override int CurrentProgress
Definition: AI_Fuck.cs:65
bool succubus
Definition: AI_Fuck.cs:29
Variation
Definition: AI_Fuck.cs:13
int maxProgress
Definition: AI_Fuck.cs:31
int fails
Definition: AI_Fuck.cs:35
Chara target
Definition: AI_Fuck.cs:25
Variation variation
Definition: AI_Fuck.cs:23
override bool ShouldAllyAttack(Chara tg)
Definition: AI_Fuck.cs:81
FuckType
Definition: AI_Fuck.cs:7
virtual FuckType Type
Definition: AI_Fuck.cs:39
bool IsSacredLovemaking
Definition: AI_Fuck.cs:42
bool CanInvite()
Definition: Affinity.cs:56
Stage CurrentStage
Definition: Affinity.cs:32
bool CanSleepBeside()
Definition: Affinity.cs:79
static int Whore(Chara seller, Chara buyer)
Definition: CalcMoney.cs:55
void PlayAnime(AnimeID id, bool force)
bool IsPCFactionOrMinion
Definition: Card.cs:2312
int GetBestAttribute()
Definition: Card.cs:2670
virtual Chara Chara
Definition: Card.cs:2108
ElementContainerCard elements
Definition: Card.cs:42
int END
Definition: Card.cs:2377
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:6375
void Talk(string idTopic, string ref1=null, string ref2=null, bool forceSync=false)
Definition: Card.cs:6935
string Name
Definition: Card.cs:2177
int CHA
Definition: Card.cs:2387
bool ExistsOnMap
Definition: Card.cs:2123
Thing SetNum(int a)
Definition: Card.cs:3577
int GetCurrency(string id="money")
Definition: Card.cs:4057
Point pos
Definition: Card.cs:60
Effect PlayEffect(string id, bool useRenderPos=true, float range=0f, Vector3 fix=default(Vector3))
Definition: Card.cs:6409
void ShowEmo(Emo _emo=Emo.none, float duration=0f, bool skipSame=true)
Definition: Card.cs:6343
void ModCurrency(int a, string id="money")
Definition: Card.cs:4043
Card MakeFoodFrom(string _id)
Definition: Card.cs:5613
ThingContainer things
Definition: Card.cs:39
int Evalue(int ele)
Definition: Card.cs:2611
int Dist(Card c)
Definition: Card.cs:7901
void ModExp(string alias, int a)
Definition: Card.cs:2688
DNA c_DNA
Definition: Card.cs:1919
void ModNum(int a, bool notify=true)
Definition: Card.cs:3597
CardRenderer renderer
Definition: Card.cs:62
bool HasElement(int ele, bool includeNagative=false)
Definition: Card.cs:6122
void Say(string lang, string ref1=null, string ref2=null)
Definition: Card.cs:7052
Definition: Chara.cs:10
override bool IsAliveInCurrentZone
Definition: Chara.cs:563
Condition AddCondition(string id, int p=100, bool force=false)
Definition: Chara.cs:9451
void ModAffinity(Chara c, int a, bool show=true, bool showOnlyEmo=false)
Definition: Chara.cs:8114
override bool IsPC
Definition: Chara.cs:626
Chara host
Definition: Chara.cs:33
override bool IsPCParty
Definition: Chara.cs:629
Stats hygiene
Definition: Chara.cs:1178
bool IsInCombat
Definition: Chara.cs:878
bool HasCondition(string alias)
Definition: Chara.cs:9612
Stats hunger
Definition: Chara.cs:1168
bool IsHuman
Definition: Chara.cs:893
bool IsAnimal
Definition: Chara.cs:881
override bool IsPCFaction
Definition: Chara.cs:685
override bool IsDeadOrSleeping
Definition: Chara.cs:575
void MakeAlly(bool msg=true)
Definition: Chara.cs:2337
void GainAbility(int ele, int mtp=100, Thing origin=null)
Definition: Chara.cs:10290
FactionMemberType memberType
Definition: Chara.cs:46
Stats stamina
Definition: Chara.cs:1172
void SetTempHand(int right=0, int left=0)
Definition: Chara.cs:6850
bool IsHomeMember()
Definition: Chara.cs:6735
Thing MakeGene(DNA.Type? type=null)
Definition: Chara.cs:8356
Affinity affinity
Definition: Chara.cs:316
bool IsMarried
Definition: Chara.cs:611
void DoHostileAction(Card _tg, bool immediate=false)
Definition: Chara.cs:6488
bool isDead
Definition: Chara.cs:391
override void LookAt(Card c)
Definition: Chara.cs:3597
Definition: ConDim.cs:2
static Thing MakeBloodMeal(Chara sucker, Chara feeder, bool msg=true)
Definition: CraftUtil.cs:154
Definition: DNA.cs:8
void MakeSlimeFood(Chara c)
Definition: DNA.cs:708
Element GetInvalidFeat(Chara c)
Definition: DNA.cs:662
Type
Definition: DNA.cs:10
List< int > vals
Definition: DNA.cs:24
Element GetInvalidAction(Chara c)
Definition: DNA.cs:688
Definition: EClass.cs:6
static Map _map
Definition: EClass.cs:19
static int rnd(long a)
Definition: EClass.cs:59
static SourceManager sources
Definition: EClass.cs:43
static int rndHalf(int a)
Definition: EClass.cs:97
static Player player
Definition: EClass.cs:13
static Chara pc
Definition: EClass.cs:15
void ModExp(int ele, float a, bool chain=false)
Element ModTempPotential(int ele, int v, int threshMsg=0)
int ValueWithoutLink(int ele)
Element ModBase(int ele, int v)
List< Element > ListBestAttributes()
static void Proc(Chara c, Thing food, bool consume=true)
Definition: FoodEffect.cs:12
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:189
long kimo
Definition: Player.cs:165
void ModKarma(int a)
Definition: Player.cs:2586
Stats stats
Definition: Player.cs:1059
Thing DropReward(Thing t, bool silent=false)
Definition: Player.cs:2618
bool TryWitnessCrime(Chara criminal, Chara target=null, int radius=4, Func< Chara, bool > funcWitness=null)
Definition: Point.cs:873
SourceElement elements
virtual void Mod(int a)
Definition: Stats.cs:135
virtual int value
Definition: Stats.cs:56
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
Definition: Thing.cs:8
static bool IsTamePossible(Chara c)