Elin Decompiled Documentation EA 23.229 Stable 1st Anniversary Patch 2
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 Thing thing = chara2.things.Find<TraitDreamBug>();
305 if (thing != null)
306 {
307 thing.ModNum(-1);
308 if (chara.IsPC)
309 {
310 Msg.Say("dream_spell", EClass.sources.elements.map[9156].GetName().ToLowerInvariant());
311 EClass.pc.GainAbility(9156, EClass.rnd(2) + 1);
312 }
313 }
314 }
315 if (!ntr || !chara.HasElement(1239) || chara2.HasElement(1216))
316 {
317 break;
318 }
319 if (chara2.HasElement(758))
320 {
321 if (chara.ExistsOnMap)
322 {
323 chara.stamina.Mod(-1000000);
324 }
325 }
326 else if (chara2.ExistsOnMap)
327 {
328 chara2.stamina.Mod((!chara2.IsPCFaction) ? (-10000) : (chara2.IsPC ? (-25) : (-50)));
329 }
330 break;
331 }
332 case FuckType.tame:
333 {
334 int num = ((!chara2.IsPCFaction) ? (chara2.IsHuman ? 10 : 5) : (chara2.IsHuman ? 5 : 0));
335 Msg.Say("tame_end", target);
336 target.PlaySound("groomed");
337 target.PlayEffect("heal_tick");
338 target.hygiene.Mod(15);
339 if (chara == EClass.pc)
340 {
342 }
343 if (target == owner)
344 {
345 break;
346 }
347 if (totalAffinity > 0)
348 {
349 chara.Say("brush_success", target, owner);
350 }
351 else
352 {
353 chara.Say("brush_fail", target, owner);
354 num *= 5;
355 }
357 bool flag2 = num2 && chara2.affinity.CanInvite() && chara2.GetBestAttribute() < EClass.pc.CHA;
358 if (num2)
359 {
360 if (flag2)
361 {
362 chara.Say("tame_success", owner, target);
363 chara2.MakeAlly();
364 }
365 else
366 {
367 chara.Say("tame_fail", chara, chara2);
368 }
369 }
370 if (fails > 0 && num > EClass.rnd(100))
371 {
372 chara2.DoHostileAction(chara);
373 chara2.calmCheckTurn *= 3;
374 }
375 break;
376 }
377 }
378 static int StaminaCost(Chara c1, Chara c2)
379 {
380 return (int)Mathf.Max(10f * (float)c1.END / (float)Mathf.Max(c2.END, 1), 0f);
381 }
382 static void SuccubusExp(Chara c, Chara tg)
383 {
384 if (!c.HasElement(1216))
385 {
386 return;
387 }
388 foreach (Element item in tg.elements.ListBestAttributes())
389 {
390 if (c.elements.ValueWithoutLink(item.id) < item.ValueWithoutLink)
391 {
392 c.elements.ModTempPotential(item.id, 1 + EClass.rnd(item.ValueWithoutLink - c.elements.ValueWithoutLink(item.id) / 5 + 1));
393 c.Say("succubus_exp", c, item.Name.ToLower());
394 break;
395 }
396 }
397 }
398 }
399}
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:2260
int GetBestAttribute()
Definition: Card.cs:2618
virtual Chara Chara
Definition: Card.cs:2058
ElementContainerCard elements
Definition: Card.cs:41
int END
Definition: Card.cs:2325
bool HasElement(int ele, int req=1)
Definition: Card.cs:5816
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:6038
void Talk(string idTopic, string ref1=null, string ref2=null, bool forceSync=false)
Definition: Card.cs:6593
string Name
Definition: Card.cs:2125
int CHA
Definition: Card.cs:2335
bool ExistsOnMap
Definition: Card.cs:2073
Thing SetNum(int a)
Definition: Card.cs:3425
int GetCurrency(string id="money")
Definition: Card.cs:3905
Point pos
Definition: Card.cs:59
Effect PlayEffect(string id, bool useRenderPos=true, float range=0f, Vector3 fix=default(Vector3))
Definition: Card.cs:6072
void ShowEmo(Emo _emo=Emo.none, float duration=0f, bool skipSame=true)
Definition: Card.cs:6006
void ModCurrency(int a, string id="money")
Definition: Card.cs:3891
ThingContainer things
Definition: Card.cs:38
int Evalue(int ele)
Definition: Card.cs:2559
int Dist(Card c)
Definition: Card.cs:7539
void ModExp(string alias, int a)
Definition: Card.cs:2636
void ModNum(int a, bool notify=true)
Definition: Card.cs:3445
CardRenderer renderer
Definition: Card.cs:61
void Say(string lang, string ref1=null, string ref2=null)
Definition: Card.cs:6690
Definition: Chara.cs:10
override bool IsAliveInCurrentZone
Definition: Chara.cs:559
Condition AddCondition(string id, int p=100, bool force=false)
Definition: Chara.cs:9057
void ModAffinity(Chara c, int a, bool show=true, bool showOnlyEmo=false)
Definition: Chara.cs:7794
override bool IsPC
Definition: Chara.cs:610
override bool IsPCParty
Definition: Chara.cs:613
Stats hygiene
Definition: Chara.cs:1150
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:2262
void GainAbility(int ele, int mtp=100, Thing origin=null)
Definition: Chara.cs:9858
FactionMemberType memberType
Definition: Chara.cs:46
Stats stamina
Definition: Chara.cs:1144
void SetTempHand(int right=0, int left=0)
Definition: Chara.cs:6595
bool IsHomeMember()
Definition: Chara.cs:6480
Affinity affinity
Definition: Chara.cs:312
void DoHostileAction(Card _tg, bool immediate=false)
Definition: Chara.cs:6241
bool isDead
Definition: Chara.cs:387
override void LookAt(Card c)
Definition: Chara.cs:3504
Definition: EClass.cs:5
static Map _map
Definition: EClass.cs:18
static int rnd(long a)
Definition: EClass.cs:58
static SourceManager sources
Definition: EClass.cs:42
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:169
long kimo
Definition: Player.cs:145
void ModKarma(int a)
Definition: Player.cs:2496
Stats stats
Definition: Player.cs:1013
Thing DropReward(Thing t, bool silent=false)
Definition: Player.cs:2527
SourceElement elements
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
Definition: Thing.cs:8
static bool IsTamePossible(Chara c)