Elin Decompiled Documentation EA 23.247 Stable Patch 1
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 }
20
22
23 public Chara target;
24
25 public bool sell;
26
27 public bool succubus;
28
29 public int maxProgress;
30
31 public int progress;
32
33 public int fails;
34
35 public int totalAffinity;
36
37 public virtual FuckType Type => FuckType.fuck;
38
39 public override bool PushChara => false;
40
41 public override bool IsAutoTurn => true;
42
44
45 public override int MaxProgress => maxProgress;
46
47 public override int CurrentProgress => progress;
48
49 public override bool CancelOnAggro
50 {
51 get
52 {
53 if (variation != Variation.NTR)
54 {
55 return variation != Variation.Bloodsuck;
56 }
57 return false;
58 }
59 }
60
61 public override bool CancelWhenDamaged => CancelOnAggro;
62
63 public override bool ShouldAllyAttack(Chara tg)
64 {
65 return tg != target;
66 }
67
68 public override IEnumerable<Status> Run()
69 {
70 if (target == null)
71 {
72 foreach (Chara chara in EClass._map.charas)
73 {
74 if (!chara.IsHomeMember() && !chara.IsDeadOrSleeping && chara.Dist(owner) <= 5)
75 {
76 target = chara;
77 break;
78 }
79 }
80 }
81 if (target == null)
82 {
83 yield return Cancel();
84 }
85 Chara cc = (sell ? target : owner);
86 Chara tc = (sell ? owner : target);
87 int destDist = ((Type == FuckType.fuck) ? 1 : 1);
88 if (owner.host != target)
89 {
90 yield return DoGoto(target.pos, destDist);
91 }
92 cc.Say((variation == Variation.Bloodsuck) ? "suck_start" : (Type.ToString() + "_start"), cc, tc);
93 isFail = () => !tc.IsAliveInCurrentZone || tc.Dist(owner) > 3;
94 if (Type == FuckType.tame)
95 {
96 cc.SetTempHand(1104, -1);
97 }
98 maxProgress = ((variation == Variation.NTR || variation == Variation.Bloodsuck) ? 10 : 25);
99 if (variation == Variation.Succubus)
100 {
101 cc.Talk("seduce");
102 }
103 if (variation == Variation.Bloodsuck)
104 {
105 cc.PlaySound("bloodsuck");
106 }
107 for (int i = 0; i < maxProgress; i++)
108 {
109 progress = i;
110 if (owner.host != target)
111 {
112 yield return DoGoto(target.pos, destDist);
113 }
114 switch (Type)
115 {
116 case FuckType.fuck:
117 if (variation == Variation.NTR)
118 {
119 cc.Say("ntr", cc, tc);
120 }
121 cc.LookAt(tc);
122 tc.LookAt(cc);
123 switch (i % 4)
124 {
125 case 0:
126 cc.renderer.PlayAnime(AnimeID.Attack, tc);
127 if (EClass.rnd(3) == 0 || sell)
128 {
129 cc.Talk("tail");
130 }
131 break;
132 case 2:
133 tc.renderer.PlayAnime(AnimeID.Shiver);
134 if (EClass.rnd(3) == 0)
135 {
136 tc.Talk("tailed");
137 }
138 break;
139 }
140 if (EClass.rnd(3) == 0 || sell)
141 {
142 target.AddCondition<ConWait>(50, force: true);
143 }
144 if (variation == Variation.Bloodsuck)
145 {
146 owner.pos.TryWitnessCrime(cc, tc, 4, (Chara c) => EClass.rnd(cc.HasCondition<ConTransmuteBat>() ? 50 : 20) == 0);
147 }
148 break;
149 case FuckType.tame:
150 {
151 int num = 100;
152 if (!tc.IsAnimal)
153 {
154 num += 50;
155 }
156 if (tc.IsHuman)
157 {
158 num += 50;
159 }
160 if (tc.IsInCombat)
161 {
162 num += 100;
163 }
164 if (tc == cc)
165 {
166 num = 50;
167 }
168 else if (tc.affinity.CurrentStage < Affinity.Stage.Intimate && EClass.rnd(6 * num / 100) == 0)
169 {
170 tc.AddCondition<ConFear>(60);
171 }
172 tc.interest -= (tc.IsPCFaction ? 20 : (2 * num / 100));
173 if (i == 0 || i == 10)
174 {
175 cc.Talk("goodBoy");
176 }
177 if (i % 5 == 0)
178 {
179 tc.PlaySound("brushing");
180 int num2 = cc.CHA / 2 + cc.Evalue(237) - tc.CHA * 2;
181 int num3;
182 if (EClass.rnd(cc.CHA / 2 + cc.Evalue(237)) > EClass.rnd(tc.CHA * num / 100))
183 {
184 num3 = 5 + Mathf.Clamp(num2 / 20, 0, 20);
185 }
186 else
187 {
188 num3 = -5 + ((!tc.IsPCFaction) ? Mathf.Clamp(num2 / 10, -30, 0) : 0);
189 fails++;
190 }
191 int num4 = 20;
193 {
194 num3 = ((EClass.rnd(3) == 0) ? 4 : 0);
195 num4 = 10;
196 }
197 totalAffinity += num3;
198 tc.ModAffinity(EClass.pc, num3, show: true, showOnlyEmo: true);
199 cc.elements.ModExp(237, num4);
200 if (EClass.rnd(4) == 0)
201 {
202 cc.stamina.Mod(-1);
203 }
204 }
205 break;
206 }
207 }
208 }
209 Finish();
210 }
211
212 public void Finish()
213 {
214 Chara chara = (sell ? target : owner);
215 Chara chara2 = (sell ? owner : target);
216 if (chara.isDead || chara2.isDead)
217 {
218 return;
219 }
220 bool flag = EClass.rnd(2) == 0;
221 switch (Type)
222 {
223 case FuckType.fuck:
224 {
225 if (variation == Variation.Bloodsuck)
226 {
227 if (EClass.rnd(2) == 0)
228 {
229 chara2.AddCondition<ConConfuse>(500);
230 }
231 if (EClass.rnd(2) == 0)
232 {
233 chara2.AddCondition<ConDim>(500);
234 }
235 if (EClass.rnd(2) == 0)
236 {
237 chara2.AddCondition<ConParalyze>(500);
238 }
239 if (EClass.rnd(10) == 0)
240 {
241 chara2.AddCondition<ConInsane>(100 + EClass.rnd(100));
242 }
243 }
244 else
245 {
246 for (int i = 0; i < 2; i++)
247 {
248 Chara chara3 = ((i == 0) ? chara : chara2);
249 chara3.RemoveCondition<ConDrunk>();
250 if (EClass.rnd(15) == 0 && !chara3.HasElement(1216))
251 {
252 chara3.AddCondition<ConDisease>(200);
253 }
254 chara3.ModExp(77, 250);
255 chara3.ModExp(71, 250);
256 chara3.ModExp(75, 250);
257 }
258 if (!chara2.HasElement(1216))
259 {
260 if (EClass.rnd(5) == 0)
261 {
262 chara2.AddCondition<ConParalyze>(500);
263 }
264 if (EClass.rnd(3) == 0)
265 {
266 chara2.AddCondition<ConInsane>(100 + EClass.rnd(100));
267 }
268 }
269 }
270 chara.Talk("tail_after");
271 bool flag3 = false;
272 if (variation == Variation.Succubus)
273 {
274 chara.ShowEmo(Emo.love);
275 chara2.ShowEmo(Emo.love);
276 EClass.player.forceTalk = true;
277 chara2.Talk("seduced");
278 }
279 else if (variation != Variation.NTR && variation != Variation.Bloodsuck && chara != EClass.pc)
280 {
281 int num3 = CalcMoney.Whore(chara2, chara);
282 Chara chara4 = chara;
283 Chara chara5 = chara2;
284 if (variation == Variation.Bitch)
285 {
286 chara = chara5;
287 chara2 = chara4;
288 }
289 Debug.Log("buyer:" + chara.Name + " seller:" + chara2.Name + " money:" + num3);
290 if (!chara.IsPC)
291 {
292 chara.ModCurrency(EClass.rndHalf(num3));
293 }
294 if (!chara2.IsPC && chara.GetCurrency() < num3 && EClass.rnd(2) == 0)
295 {
296 num3 = chara.GetCurrency();
297 }
298 Debug.Log("money:" + num3 + " buyer:" + chara.GetCurrency());
299 if (chara.GetCurrency() >= num3)
300 {
301 chara.Talk("tail_pay");
302 }
303 else
304 {
305 chara.Talk("tail_nomoney");
306 num3 = chara.GetCurrency();
307 chara2.Say("angry", chara2);
308 chara2.Talk("angry");
309 flag = (sell ? true : false);
310 if (EClass.rnd(chara.IsPC ? 2 : 20) == 0)
311 {
312 flag3 = true;
313 }
314 }
315 chara.ModCurrency(-num3);
316 if (chara2 == EClass.pc)
317 {
318 if (num3 > 0)
319 {
322 }
323 }
324 else
325 {
326 int num4 = (chara2.CHA * 10 + 100) / ((chara2.IsPCFaction && chara2.memberType == FactionMemberType.Default) ? 1 : 10);
327 if (chara2.GetCurrency() - num4 > 0)
328 {
329 chara2.c_allowance += num3;
330 }
331 else
332 {
333 chara2.ModCurrency(num3);
334 }
335 }
336 chara = chara4;
337 chara2 = chara5;
338 }
339 if (flag3)
340 {
341 chara2.DoHostileAction(chara);
342 }
343 if (variation == Variation.Bloodsuck)
344 {
345 int value = chara.hunger.value;
346 Thing food = CraftUtil.MakeBloodMeal(chara, chara2);
347 FoodEffect.Proc(chara, food, consume: false);
348 chara2.AddCondition<ConBleed>(EClass.rndHalf(value * 10));
349 }
350 else
351 {
352 if (chara.IsPCParty || chara2.IsPCParty)
353 {
354 chara.stamina.Mod(-5 - EClass.rnd(chara.stamina.max / 10 + ((variation == Variation.Succubus) ? StaminaCost(chara2, chara) : 0) + 1));
355 chara2.stamina.Mod(-5 - EClass.rnd(chara2.stamina.max / 20 + ((variation == Variation.Succubus) ? StaminaCost(chara, chara2) : 0) + 1));
356 }
357 SuccubusExp(chara, chara2);
358 SuccubusExp(chara2, chara);
359 }
360 chara2.ModAffinity(chara, (flag || (chara.IsPC && chara2.affinity.CanSleepBeside() && EClass.rnd(10) != 0)) ? 10 : (-5));
361 if (chara == EClass.pc || chara2 == EClass.pc)
362 {
364 }
365 if (variation == Variation.NTR)
366 {
367 Thing thing = chara2.things.Find<TraitDreamBug>();
368 if (thing != null)
369 {
370 thing.ModNum(-1);
371 if (chara.IsPC)
372 {
373 Msg.Say("dream_spell", EClass.sources.elements.map[9156].GetName().ToLowerInvariant());
374 EClass.pc.GainAbility(9156, EClass.rnd(2) + 1);
375 }
376 }
377 if (chara.HasElement(1239) && !chara2.HasElement(1216))
378 {
379 if (chara2.HasElement(758))
380 {
381 if (chara.ExistsOnMap)
382 {
383 chara.stamina.Mod(-1000000);
384 }
385 }
386 else if (chara2.ExistsOnMap)
387 {
388 chara2.stamina.Mod((!chara2.IsPCFaction) ? (-10000) : (chara2.IsPC ? (-25) : (-50)));
389 }
390 }
391 }
392 if (variation == Variation.Bloodsuck && chara2.HasElement(758) && chara.ExistsOnMap)
393 {
394 chara.stamina.Mod(-1000000);
395 }
396 break;
397 }
398 case FuckType.tame:
399 {
400 int num = ((!chara2.IsPCFaction) ? (chara2.IsHuman ? 10 : 5) : (chara2.IsHuman ? 5 : 0));
401 Msg.Say("tame_end", target);
402 target.PlaySound("groomed");
403 target.PlayEffect("heal_tick");
404 target.hygiene.Mod(15);
405 if (chara == EClass.pc)
406 {
408 }
409 if (target == owner)
410 {
411 break;
412 }
413 if (totalAffinity > 0)
414 {
415 chara.Say("brush_success", target, owner);
416 }
417 else
418 {
419 chara.Say("brush_fail", target, owner);
420 num *= 5;
421 }
423 bool flag2 = num2 && chara2.affinity.CanInvite() && chara2.GetBestAttribute() < EClass.pc.CHA;
424 if (num2)
425 {
426 if (flag2)
427 {
428 chara.Say("tame_success", owner, target);
429 chara2.MakeAlly();
430 }
431 else
432 {
433 chara.Say("tame_fail", chara, chara2);
434 }
435 }
436 if (fails > 0 && num > EClass.rnd(100))
437 {
438 chara2.DoHostileAction(chara);
439 chara2.calmCheckTurn *= 3;
440 }
441 break;
442 }
443 }
444 static int StaminaCost(Chara c1, Chara c2)
445 {
446 return (int)Mathf.Max(10f * (float)c1.END / (float)Mathf.Max(c2.END, 1), 0f);
447 }
448 static void SuccubusExp(Chara c, Chara tg)
449 {
450 if (!c.HasElement(1216))
451 {
452 return;
453 }
454 foreach (Element item in tg.elements.ListBestAttributes())
455 {
456 if (c.elements.ValueWithoutLink(item.id) < item.ValueWithoutLink)
457 {
458 c.elements.ModTempPotential(item.id, 1 + EClass.rnd(item.ValueWithoutLink - c.elements.ValueWithoutLink(item.id) / 5 + 1));
459 c.Say("succubus_exp", c, item.Name.ToLower());
460 break;
461 }
462 }
463 }
464 }
465}
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:61
void Finish()
Definition: AI_Fuck.cs:212
bool sell
Definition: AI_Fuck.cs:25
int totalAffinity
Definition: AI_Fuck.cs:35
override bool IsAutoTurn
Definition: AI_Fuck.cs:41
override IEnumerable< Status > Run()
Definition: AI_Fuck.cs:68
override bool PushChara
Definition: AI_Fuck.cs:39
override int MaxProgress
Definition: AI_Fuck.cs:45
int progress
Definition: AI_Fuck.cs:31
override bool CancelOnAggro
Definition: AI_Fuck.cs:50
override int CurrentProgress
Definition: AI_Fuck.cs:47
bool succubus
Definition: AI_Fuck.cs:27
Variation
Definition: AI_Fuck.cs:13
int maxProgress
Definition: AI_Fuck.cs:29
int fails
Definition: AI_Fuck.cs:33
Chara target
Definition: AI_Fuck.cs:23
Variation variation
Definition: AI_Fuck.cs:21
override bool ShouldAllyAttack(Chara tg)
Definition: AI_Fuck.cs:63
FuckType
Definition: AI_Fuck.cs:7
virtual FuckType Type
Definition: AI_Fuck.cs:37
bool CanInvite()
Definition: Affinity.cs:54
Stage CurrentStage
Definition: Affinity.cs:32
bool CanSleepBeside()
Definition: Affinity.cs:77
static int Whore(Chara seller, Chara buyer)
Definition: CalcMoney.cs:55
void PlayAnime(AnimeID id, bool force)
bool IsPCFactionOrMinion
Definition: Card.cs:2272
int GetBestAttribute()
Definition: Card.cs:2630
virtual Chara Chara
Definition: Card.cs:2070
ElementContainerCard elements
Definition: Card.cs:41
int END
Definition: Card.cs:2337
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:6177
void Talk(string idTopic, string ref1=null, string ref2=null, bool forceSync=false)
Definition: Card.cs:6733
string Name
Definition: Card.cs:2137
int CHA
Definition: Card.cs:2347
bool ExistsOnMap
Definition: Card.cs:2085
Thing SetNum(int a)
Definition: Card.cs:3495
int GetCurrency(string id="money")
Definition: Card.cs:3975
Point pos
Definition: Card.cs:59
Effect PlayEffect(string id, bool useRenderPos=true, float range=0f, Vector3 fix=default(Vector3))
Definition: Card.cs:6211
void ShowEmo(Emo _emo=Emo.none, float duration=0f, bool skipSame=true)
Definition: Card.cs:6145
void ModCurrency(int a, string id="money")
Definition: Card.cs:3961
ThingContainer things
Definition: Card.cs:38
int Evalue(int ele)
Definition: Card.cs:2571
int Dist(Card c)
Definition: Card.cs:7677
void ModExp(string alias, int a)
Definition: Card.cs:2648
void ModNum(int a, bool notify=true)
Definition: Card.cs:3515
CardRenderer renderer
Definition: Card.cs:61
bool HasElement(int ele, bool includeNagative=false)
Definition: Card.cs:5932
void Say(string lang, string ref1=null, string ref2=null)
Definition: Card.cs:6830
Definition: Chara.cs:10
override bool IsAliveInCurrentZone
Definition: Chara.cs:561
Condition AddCondition(string id, int p=100, bool force=false)
Definition: Chara.cs:9244
void ModAffinity(Chara c, int a, bool show=true, bool showOnlyEmo=false)
Definition: Chara.cs:7931
override bool IsPC
Definition: Chara.cs:612
Chara host
Definition: Chara.cs:33
override bool IsPCParty
Definition: Chara.cs:615
Stats hygiene
Definition: Chara.cs:1152
bool IsInCombat
Definition: Chara.cs:864
bool HasCondition(string alias)
Definition: Chara.cs:9405
Stats hunger
Definition: Chara.cs:1142
bool IsHuman
Definition: Chara.cs:879
bool IsAnimal
Definition: Chara.cs:867
override bool IsPCFaction
Definition: Chara.cs:671
override bool IsDeadOrSleeping
Definition: Chara.cs:573
void MakeAlly(bool msg=true)
Definition: Chara.cs:2276
void GainAbility(int ele, int mtp=100, Thing origin=null)
Definition: Chara.cs:10070
FactionMemberType memberType
Definition: Chara.cs:46
Stats stamina
Definition: Chara.cs:1146
void SetTempHand(int right=0, int left=0)
Definition: Chara.cs:6703
bool IsHomeMember()
Definition: Chara.cs:6588
Affinity affinity
Definition: Chara.cs:314
void DoHostileAction(Card _tg, bool immediate=false)
Definition: Chara.cs:6349
bool isDead
Definition: Chara.cs:389
override void LookAt(Card c)
Definition: Chara.cs:3528
Definition: ConDim.cs:2
static Thing MakeBloodMeal(Chara sucker, Chara feeder, bool msg=true)
Definition: CraftUtil.cs:154
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)
List< Element > ListBestAttributes()
static void Proc(Chara c, Thing food, bool consume=true)
Definition: FoodEffect.cs:11
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:172
long kimo
Definition: Player.cs:148
void ModKarma(int a)
Definition: Player.cs:2516
Stats stats
Definition: Player.cs:1016
Thing DropReward(Thing t, bool silent=false)
Definition: Player.cs:2547
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)