Elin Decompiled Documentation EA 23.174 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 IEnumerable<Status> Run()
47 {
48 if (target == null)
49 {
50 foreach (Chara chara in EClass._map.charas)
51 {
52 if (!chara.IsHomeMember() && !chara.IsDeadOrSleeping && chara.Dist(owner) <= 5)
53 {
54 target = chara;
55 break;
56 }
57 }
58 }
59 if (target == null)
60 {
61 yield return Cancel();
62 }
63 Chara cc = (sell ? target : owner);
64 Chara tc = (sell ? owner : target);
65 int destDist = ((Type == FuckType.fuck) ? 1 : 1);
66 yield return DoGoto(target.pos, destDist);
67 cc.Say(Type.ToString() + "_start", cc, tc);
68 isFail = () => !tc.IsAliveInCurrentZone || tc.Dist(owner) > 3;
69 if (Type == FuckType.tame)
70 {
71 cc.SetTempHand(1104, -1);
72 }
73 maxProgress = (ntr ? 10 : 25);
74 if (succubus)
75 {
76 cc.Talk("seduce");
77 }
78 for (int i = 0; i < maxProgress; i++)
79 {
80 progress = i;
81 yield return DoGoto(target.pos, destDist);
82 switch (Type)
83 {
84 case FuckType.fuck:
85 if (ntr)
86 {
87 cc.Say("ntr", cc, tc);
88 }
89 cc.LookAt(tc);
90 tc.LookAt(cc);
91 switch (i % 4)
92 {
93 case 0:
94 cc.renderer.PlayAnime(AnimeID.Attack, tc);
95 if (EClass.rnd(3) == 0 || sell)
96 {
97 cc.Talk("tail");
98 }
99 break;
100 case 2:
101 tc.renderer.PlayAnime(AnimeID.Shiver);
102 if (EClass.rnd(3) == 0)
103 {
104 tc.Talk("tailed");
105 }
106 break;
107 }
108 if (EClass.rnd(3) == 0 || sell)
109 {
110 target.AddCondition<ConWait>(50, force: true);
111 }
112 break;
113 case FuckType.tame:
114 {
115 int num = 100;
116 if (!tc.race.IsAnimal)
117 {
118 num += 50;
119 }
120 if (tc.race.IsHuman)
121 {
122 num += 50;
123 }
124 if (tc.IsInCombat)
125 {
126 num += 100;
127 }
128 if (tc == cc)
129 {
130 num = 50;
131 }
132 else if (tc.affinity.CurrentStage < Affinity.Stage.Intimate && EClass.rnd(6 * num / 100) == 0)
133 {
134 tc.AddCondition<ConFear>(60);
135 }
136 tc.interest -= (tc.IsPCFaction ? 20 : (2 * num / 100));
137 if (i == 0 || i == 10)
138 {
139 cc.Talk("goodBoy");
140 }
141 if (i % 5 == 0)
142 {
143 tc.PlaySound("brushing");
144 int num2 = cc.CHA / 2 + cc.Evalue(237) - tc.CHA * 2;
145 int num3;
146 if (EClass.rnd(cc.CHA / 2 + cc.Evalue(237)) > EClass.rnd(tc.CHA * num / 100))
147 {
148 num3 = 5 + Mathf.Clamp(num2 / 20, 0, 20);
149 }
150 else
151 {
152 num3 = -5 + ((!tc.IsPCFaction) ? Mathf.Clamp(num2 / 10, -30, 0) : 0);
153 fails++;
154 }
155 int a = 20;
157 {
158 num3 = ((EClass.rnd(3) == 0) ? 4 : 0);
159 a = 10;
160 }
161 totalAffinity += num3;
162 tc.ModAffinity(EClass.pc, num3, show: true, showOnlyEmo: true);
163 cc.elements.ModExp(237, a);
164 if (EClass.rnd(4) == 0)
165 {
166 cc.stamina.Mod(-1);
167 }
168 }
169 break;
170 }
171 }
172 }
173 Finish();
174 }
175
176 public void Finish()
177 {
178 Chara chara = (sell ? target : owner);
179 Chara chara2 = (sell ? owner : target);
180 if (chara.isDead || chara2.isDead)
181 {
182 return;
183 }
184 bool flag = EClass.rnd(2) == 0;
185 switch (Type)
186 {
187 case FuckType.fuck:
188 {
189 for (int i = 0; i < 2; i++)
190 {
191 Chara chara3 = ((i == 0) ? chara : chara2);
192 chara3.RemoveCondition<ConDrunk>();
193 if (EClass.rnd(15) == 0 && !chara3.HasElement(1216))
194 {
195 chara3.AddCondition<ConDisease>(200);
196 }
197 chara3.ModExp(77, 250);
198 chara3.ModExp(71, 250);
199 chara3.ModExp(75, 250);
200 }
201 if (!chara2.HasElement(1216))
202 {
203 if (EClass.rnd(5) == 0)
204 {
205 chara2.AddCondition<ConParalyze>(500);
206 }
207 if (EClass.rnd(3) == 0)
208 {
209 chara2.AddCondition<ConInsane>(100 + EClass.rnd(100));
210 }
211 }
212 int num3 = CalcMoney.Whore(chara2, chara);
213 chara.Talk("tail_after");
214 bool flag3 = false;
215 if (succubus)
216 {
217 chara.ShowEmo(Emo.love);
218 chara2.ShowEmo(Emo.love);
219 EClass.player.forceTalk = true;
220 chara2.Talk("seduced");
221 }
222 else if (chara != EClass.pc)
223 {
224 Chara chara4 = chara;
225 Chara chara5 = chara2;
226 if (bitch)
227 {
228 chara = chara5;
229 chara2 = chara4;
230 }
231 Debug.Log("buyer:" + chara.Name + " seller:" + chara2.Name + " money:" + num3);
232 if (!chara.IsPC)
233 {
234 chara.ModCurrency(EClass.rndHalf(num3));
235 }
236 if (!chara2.IsPC && chara.GetCurrency() < num3 && EClass.rnd(2) == 0)
237 {
238 num3 = chara.GetCurrency();
239 }
240 Debug.Log("money:" + num3 + " buyer:" + chara.GetCurrency());
241 if (chara.GetCurrency() >= num3)
242 {
243 chara.Talk("tail_pay");
244 }
245 else
246 {
247 chara.Talk("tail_nomoney");
248 num3 = chara.GetCurrency();
249 chara2.Say("angry", chara2);
250 chara2.Talk("angry");
251 flag = (sell ? true : false);
252 if (EClass.rnd(chara.IsPC ? 2 : 20) == 0)
253 {
254 flag3 = true;
255 }
256 }
257 chara.ModCurrency(-num3);
258 if (chara2 == EClass.pc)
259 {
260 if (num3 > 0)
261 {
264 }
265 }
266 else
267 {
268 int num4 = (chara2.CHA * 10 + 100) / ((chara2.IsPCFaction && chara2.memberType == FactionMemberType.Default) ? 1 : 10);
269 if (chara2.GetCurrency() - num4 > 0)
270 {
271 chara2.c_allowance += num3;
272 }
273 else
274 {
275 chara2.ModCurrency(num3);
276 }
277 }
278 chara = chara4;
279 chara2 = chara5;
280 }
281 if (flag3)
282 {
283 chara2.DoHostileAction(chara);
284 }
285 if (chara.IsPCParty || chara2.IsPCParty)
286 {
287 chara.stamina.Mod(-5 - EClass.rnd(chara.stamina.max / 10 + (succubus ? StaminaCost(chara2, chara) : 0) + 1));
288 chara2.stamina.Mod(-5 - EClass.rnd(chara2.stamina.max / 20 + (succubus ? StaminaCost(chara, chara2) : 0) + 1));
289 }
290 SuccubusExp(chara, chara2);
291 SuccubusExp(chara2, chara);
292 chara2.ModAffinity(chara, flag ? 10 : (-5));
293 if (chara == EClass.pc || chara2 == EClass.pc)
294 {
296 }
297 if (!ntr || !chara.HasElement(1239) || chara2.HasElement(1216))
298 {
299 break;
300 }
301 if (chara2.HasElement(758))
302 {
303 if (chara.ExistsOnMap)
304 {
305 chara.stamina.Mod(-1000000);
306 }
307 }
308 else if (chara2.ExistsOnMap)
309 {
310 chara2.stamina.Mod((!chara2.IsPCFaction) ? (-10000) : (chara2.IsPC ? (-25) : (-50)));
311 }
312 break;
313 }
314 case FuckType.tame:
315 {
316 int num = ((!chara2.IsPCFaction) ? (chara2.IsHuman ? 10 : 5) : (chara2.IsHuman ? 5 : 0));
317 Msg.Say("tame_end", target);
318 target.PlaySound("groomed");
319 target.PlayEffect("heal_tick");
320 target.hygiene.Mod(15);
321 if (chara == EClass.pc)
322 {
324 }
325 if (target == owner)
326 {
327 break;
328 }
329 if (totalAffinity > 0)
330 {
331 chara.Say("brush_success", target, owner);
332 }
333 else
334 {
335 chara.Say("brush_fail", target, owner);
336 num *= 5;
337 }
339 bool flag2 = num2 && chara2.affinity.CanInvite() && chara2.GetBestAttribute() < EClass.pc.CHA;
340 if (num2)
341 {
342 if (flag2)
343 {
344 chara.Say("tame_success", owner, target);
345 chara2.MakeAlly();
346 }
347 else
348 {
349 chara.Say("tame_fail", chara, chara2);
350 }
351 }
352 if (fails > 0 && num > EClass.rnd(100))
353 {
354 chara2.DoHostileAction(chara);
355 chara2.calmCheckTurn *= 3;
356 }
357 break;
358 }
359 }
360 static int StaminaCost(Chara c1, Chara c2)
361 {
362 return (int)Mathf.Max(10f * (float)c1.END / (float)Mathf.Max(c2.END, 1), 0f);
363 }
364 static void SuccubusExp(Chara c, Chara tg)
365 {
366 if (!c.HasElement(1216))
367 {
368 return;
369 }
370 foreach (Element item in tg.elements.ListBestAttributes())
371 {
372 if (c.elements.ValueWithoutLink(item.id) < item.ValueWithoutLink)
373 {
374 c.elements.ModTempPotential(item.id, 1 + EClass.rnd(item.ValueWithoutLink - c.elements.ValueWithoutLink(item.id) / 5 + 1));
375 c.Say("succubus_exp", c, item.Name.ToLower());
376 break;
377 }
378 }
379 }
380 }
381}
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:176
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:46
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
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:2208
int GetBestAttribute()
Definition: Card.cs:2566
virtual Chara Chara
Definition: Card.cs:2006
ElementContainerCard elements
Definition: Card.cs:37
int END
Definition: Card.cs:2273
bool HasElement(int ele, int req=1)
Definition: Card.cs:5589
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:5799
void Talk(string idTopic, string ref1=null, string ref2=null, bool forceSync=false)
Definition: Card.cs:6349
string Name
Definition: Card.cs:2073
int CHA
Definition: Card.cs:2283
bool ExistsOnMap
Definition: Card.cs:2021
Thing SetNum(int a)
Definition: Card.cs:3356
int GetCurrency(string id="money")
Definition: Card.cs:3824
Point pos
Definition: Card.cs:55
Effect PlayEffect(string id, bool useRenderPos=true, float range=0f, Vector3 fix=default(Vector3))
Definition: Card.cs:5833
void ShowEmo(Emo _emo=Emo.none, float duration=0f, bool skipSame=true)
Definition: Card.cs:5767
void ModCurrency(int a, string id="money")
Definition: Card.cs:3810
int Evalue(int ele)
Definition: Card.cs:2507
int Dist(Card c)
Definition: Card.cs:7258
void ModExp(string alias, int a)
Definition: Card.cs:2584
CardRenderer renderer
Definition: Card.cs:57
void Say(string lang, string ref1=null, string ref2=null)
Definition: Card.cs:6446
Definition: Chara.cs:10
override bool IsAliveInCurrentZone
Definition: Chara.cs:557
Condition AddCondition(string id, int p=100, bool force=false)
Definition: Chara.cs:8607
void ModAffinity(Chara c, int a, bool show=true, bool showOnlyEmo=false)
Definition: Chara.cs:7370
override bool IsPC
Definition: Chara.cs:608
override bool IsPCParty
Definition: Chara.cs:611
Stats hygiene
Definition: Chara.cs:1004
bool IsInCombat
Definition: Chara.cs:860
bool IsHuman
Definition: Chara.cs:878
override bool IsPCFaction
Definition: Chara.cs:667
override bool IsDeadOrSleeping
Definition: Chara.cs:569
void MakeAlly(bool msg=true)
Definition: Chara.cs:2073
FactionMemberType memberType
Definition: Chara.cs:46
Stats stamina
Definition: Chara.cs:998
void SetTempHand(int right=0, int left=0)
Definition: Chara.cs:6214
bool IsHomeMember()
Definition: Chara.cs:6099
Affinity affinity
Definition: Chara.cs:310
void DoHostileAction(Card _tg, bool immediate=false)
Definition: Chara.cs:5864
bool isDead
Definition: Chara.cs:385
override void LookAt(Card c)
Definition: Chara.cs:3303
SourceRace.Row race
Definition: Chara.cs:460
Definition: EClass.cs:5
static int rnd(int a)
Definition: EClass.cs:58
static Map _map
Definition: EClass.cs:18
static int rndHalf(int a)
Definition: EClass.cs:82
static Player player
Definition: EClass.cs:12
static Chara pc
Definition: EClass.cs:14
Element ModTempPotential(int ele, int v, int threshMsg=0)
int ValueWithoutLink(int ele)
void ModExp(int ele, int a, bool chain=false)
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:2408
Stats stats
Definition: Player.cs:936
Thing DropReward(Thing t, bool silent=false)
Definition: Player.cs:2439
virtual void Mod(int a)
Definition: Stats.cs:135
virtual int max
Definition: Stats.cs:68
static TargetTypeChara Chara
Definition: TargetType.cs:17
static Thing Create(string id, int idMat=-1, int lv=-1)
Definition: ThingGen.cs:53
static bool IsTamePossible(Chara c)