Elin Decompiled Documentation EA 23.102 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 totalAffinity;
27
28 public virtual FuckType Type => FuckType.fuck;
29
30 public override bool PushChara => false;
31
32 public override bool IsAutoTurn => true;
33
35
36 public override int MaxProgress => maxProgress;
37
38 public override int CurrentProgress => progress;
39
40 public override bool CancelOnAggro => !ntr;
41
42 public override bool CancelWhenDamaged => !ntr;
43
44 public override IEnumerable<Status> Run()
45 {
46 if (target == null)
47 {
48 foreach (Chara chara in EClass._map.charas)
49 {
50 if (!chara.IsHomeMember() && !chara.IsDeadOrSleeping && chara.Dist(owner) <= 5)
51 {
52 target = chara;
53 break;
54 }
55 }
56 }
57 if (target == null)
58 {
59 yield return Cancel();
60 }
61 Chara cc = (sell ? target : owner);
62 Chara tc = (sell ? owner : target);
63 int destDist = ((Type == FuckType.fuck) ? 1 : 1);
64 yield return DoGoto(target.pos, destDist);
65 cc.Say(Type.ToString() + "_start", cc, tc);
66 isFail = () => !tc.IsAliveInCurrentZone || tc.Dist(owner) > 3;
67 if (Type == FuckType.tame)
68 {
69 cc.SetTempHand(1104, -1);
70 }
71 maxProgress = (ntr ? 10 : 25);
72 if (succubus)
73 {
74 cc.Talk("seduce");
75 }
76 for (int i = 0; i < maxProgress; i++)
77 {
78 progress = i;
79 yield return DoGoto(target.pos, destDist);
80 switch (Type)
81 {
82 case FuckType.fuck:
83 if (ntr)
84 {
85 cc.Say("ntr", cc, tc);
86 }
87 cc.LookAt(tc);
88 tc.LookAt(cc);
89 switch (i % 4)
90 {
91 case 0:
92 cc.renderer.PlayAnime(AnimeID.Attack, tc);
93 if (EClass.rnd(3) == 0 || sell)
94 {
95 cc.Talk("tail");
96 }
97 break;
98 case 2:
99 tc.renderer.PlayAnime(AnimeID.Shiver);
100 if (EClass.rnd(3) == 0)
101 {
102 tc.Talk("tailed");
103 }
104 break;
105 }
106 if (EClass.rnd(3) == 0 || sell)
107 {
108 target.AddCondition<ConWait>(50, force: true);
109 }
110 break;
111 case FuckType.tame:
112 {
113 int num = 100;
114 if (!tc.race.IsAnimal)
115 {
116 num += 50;
117 }
118 if (tc.race.IsHuman)
119 {
120 num += 50;
121 }
122 if (tc.IsInCombat)
123 {
124 num += 100;
125 }
126 if (tc == cc)
127 {
128 num = 50;
129 }
130 else if (tc.affinity.CurrentStage < Affinity.Stage.Intimate && EClass.rnd(6 * num / 100) == 0)
131 {
132 tc.AddCondition<ConFear>(60);
133 }
134 tc.interest -= (tc.IsPCFaction ? 20 : (2 * num / 100));
135 if (i == 0 || i == 10)
136 {
137 cc.Talk("goodBoy");
138 }
139 if (i % 5 == 0)
140 {
141 tc.PlaySound("brushing");
142 int num2 = cc.CHA / 2 + cc.Evalue(237) - tc.CHA * 2;
143 int num3 = ((EClass.rnd(cc.CHA / 2 + cc.Evalue(237)) <= EClass.rnd(tc.CHA * num / 100)) ? (-5 + ((!tc.IsPCFaction) ? Mathf.Clamp(num2 / 10, -30, 0) : 0)) : (5 + Mathf.Clamp(num2 / 20, 0, 20)));
144 int a = 20;
146 {
147 num3 = ((EClass.rnd(3) == 0) ? 4 : 0);
148 a = 10;
149 }
150 totalAffinity += num3;
151 tc.ModAffinity(EClass.pc, num3, show: true, showOnlyEmo: true);
152 cc.elements.ModExp(237, a);
153 if (EClass.rnd(4) == 0)
154 {
155 cc.stamina.Mod(-1);
156 }
157 }
158 break;
159 }
160 }
161 }
162 Finish();
163 }
164
165 public void Finish()
166 {
167 Chara chara = (sell ? target : owner);
168 Chara chara2 = (sell ? owner : target);
169 if (chara.isDead || chara2.isDead)
170 {
171 return;
172 }
173 bool flag = EClass.rnd(2) == 0;
174 switch (Type)
175 {
176 case FuckType.fuck:
177 {
178 for (int i = 0; i < 2; i++)
179 {
180 Chara chara3 = ((i == 0) ? chara : chara2);
181 chara3.RemoveCondition<ConDrunk>();
182 if (EClass.rnd(15) == 0 && !chara3.HasElement(1216))
183 {
184 chara3.AddCondition<ConDisease>(200);
185 }
186 chara3.ModExp(77, 250);
187 chara3.ModExp(71, 250);
188 chara3.ModExp(75, 250);
189 }
190 if (!chara2.HasElement(1216))
191 {
192 if (EClass.rnd(5) == 0)
193 {
194 chara2.AddCondition<ConParalyze>(500);
195 }
196 if (EClass.rnd(3) == 0)
197 {
198 chara2.AddCondition<ConInsane>(100 + EClass.rnd(100));
199 }
200 }
201 int num3 = CalcMoney.Whore(chara2, chara);
202 chara.Talk("tail_after");
203 bool flag3 = false;
204 if (succubus)
205 {
206 chara.ShowEmo(Emo.love);
207 chara2.ShowEmo(Emo.love);
208 EClass.player.forceTalk = true;
209 chara2.Talk("seduced");
210 }
211 else if (chara != EClass.pc)
212 {
213 Chara chara4 = chara;
214 Chara chara5 = chara2;
215 if (bitch)
216 {
217 chara = chara5;
218 chara2 = chara4;
219 }
220 Debug.Log("buyer:" + chara.Name + " seller:" + chara2.Name + " money:" + num3);
221 if (!chara.IsPC)
222 {
223 chara.ModCurrency(EClass.rndHalf(num3));
224 }
225 if (!chara2.IsPC && chara.GetCurrency() < num3 && EClass.rnd(2) == 0)
226 {
227 num3 = chara.GetCurrency();
228 }
229 Debug.Log("money:" + num3 + " buyer:" + chara.GetCurrency());
230 if (chara.GetCurrency() >= num3)
231 {
232 chara.Talk("tail_pay");
233 }
234 else
235 {
236 chara.Talk("tail_nomoney");
237 num3 = chara.GetCurrency();
238 chara2.Say("angry", chara2);
239 chara2.Talk("angry");
240 flag = (sell ? true : false);
241 if (EClass.rnd(chara.IsPC ? 2 : 20) == 0)
242 {
243 flag3 = true;
244 }
245 }
246 chara.ModCurrency(-num3);
247 if (chara2 == EClass.pc)
248 {
249 if (num3 > 0)
250 {
253 }
254 }
255 else
256 {
257 int num4 = (chara2.CHA * 10 + 100) / ((chara2.IsPCFaction && chara2.memberType == FactionMemberType.Default) ? 1 : 10);
258 if (chara2.GetCurrency() - num4 > 0)
259 {
260 chara2.c_allowance += num3;
261 }
262 else
263 {
264 chara2.ModCurrency(num3);
265 }
266 }
267 chara = chara4;
268 chara2 = chara5;
269 }
270 if (flag3)
271 {
272 chara2.DoHostileAction(chara);
273 }
274 if (chara.IsPCParty || chara2.IsPCParty)
275 {
276 chara.stamina.Mod(-5 - EClass.rnd(chara.stamina.max / 10 + (succubus ? StaminaCost(chara2, chara) : 0) + 1));
277 chara2.stamina.Mod(-5 - EClass.rnd(chara2.stamina.max / 20 + (succubus ? StaminaCost(chara, chara2) : 0) + 1));
278 }
279 SuccubusExp(chara, chara2);
280 SuccubusExp(chara2, chara);
281 chara2.ModAffinity(chara, flag ? 10 : (-5));
282 if (!ntr || !chara.HasElement(1239) || chara2.HasElement(1216))
283 {
284 break;
285 }
286 if (chara2.HasElement(758))
287 {
288 if (chara.ExistsOnMap)
289 {
290 chara.stamina.Mod(-1000000);
291 }
292 }
293 else if (chara2.ExistsOnMap)
294 {
295 chara2.stamina.Mod((!chara2.IsPCFaction) ? (-10000) : (chara2.IsPC ? (-25) : (-50)));
296 }
297 break;
298 }
299 case FuckType.tame:
300 {
301 int num = ((!chara2.IsPCFaction) ? (chara2.IsHuman ? 10 : 5) : (chara2.IsHuman ? 5 : 0));
302 Msg.Say("tame_end", target);
303 target.PlaySound("groomed");
304 target.PlayEffect("heal_tick");
305 target.hygiene.Mod(15);
306 if (target == owner)
307 {
308 break;
309 }
310 if (totalAffinity > 0)
311 {
312 chara.Say("brush_success", target, owner);
313 }
314 else
315 {
316 chara.Say("brush_fail", target, owner);
317 num *= 5;
318 }
320 bool flag2 = num2 && chara2.affinity.CanInvite() && chara2.GetBestAttribute() < EClass.pc.CHA;
321 if (num2)
322 {
323 if (flag2)
324 {
325 chara.Say("tame_success", owner, target);
326 chara2.MakeAlly();
327 }
328 else
329 {
330 chara.Say("tame_fail", chara, chara2);
331 }
332 }
333 if (num > EClass.rnd(100))
334 {
335 chara2.DoHostileAction(chara);
336 chara2.calmCheckTurn *= 3;
337 }
338 break;
339 }
340 }
341 static int StaminaCost(Chara c1, Chara c2)
342 {
343 return (int)Mathf.Max(10f * (float)c1.END / (float)Mathf.Max(c2.END, 1), 0f);
344 }
345 static void SuccubusExp(Chara c, Chara tg)
346 {
347 if (!c.HasElement(1216))
348 {
349 return;
350 }
351 foreach (Element item in tg.elements.ListBestAttributes())
352 {
353 if (c.elements.ValueWithoutLink(item.id) < item.ValueWithoutLink)
354 {
355 c.elements.ModTempPotential(item.id, 1 + EClass.rnd(item.ValueWithoutLink - c.elements.ValueWithoutLink(item.id) / 5 + 1));
356 c.Say("succubus_exp", c, item.Name.ToLower());
357 break;
358 }
359 }
360 }
361 }
362}
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:42
void Finish()
Definition: AI_Fuck.cs:165
bool sell
Definition: AI_Fuck.cs:14
int totalAffinity
Definition: AI_Fuck.cs:26
override bool IsAutoTurn
Definition: AI_Fuck.cs:32
override IEnumerable< Status > Run()
Definition: AI_Fuck.cs:44
override bool PushChara
Definition: AI_Fuck.cs:30
override int MaxProgress
Definition: AI_Fuck.cs:36
int progress
Definition: AI_Fuck.cs:24
override bool CancelOnAggro
Definition: AI_Fuck.cs:40
override int CurrentProgress
Definition: AI_Fuck.cs:38
bool succubus
Definition: AI_Fuck.cs:18
bool ntr
Definition: AI_Fuck.cs:20
int maxProgress
Definition: AI_Fuck.cs:22
Chara target
Definition: AI_Fuck.cs:12
FuckType
Definition: AI_Fuck.cs:7
virtual FuckType Type
Definition: AI_Fuck.cs:28
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:50
void PlayAnime(AnimeID id, bool force)
bool IsPCFactionOrMinion
Definition: Card.cs:2132
int GetBestAttribute()
Definition: Card.cs:2490
virtual Chara Chara
Definition: Card.cs:1946
ElementContainerCard elements
Definition: Card.cs:37
int END
Definition: Card.cs:2197
bool HasElement(int ele, int req=1)
Definition: Card.cs:5214
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:5404
void Talk(string idTopic, string ref1=null, string ref2=null, bool forceSync=false)
Definition: Card.cs:5949
string Name
Definition: Card.cs:2013
int CHA
Definition: Card.cs:2207
bool ExistsOnMap
Definition: Card.cs:1961
Thing SetNum(int a)
Definition: Card.cs:3242
int GetCurrency(string id="money")
Definition: Card.cs:3652
Point pos
Definition: Card.cs:55
Effect PlayEffect(string id, bool useRenderPos=true, float range=0f, Vector3 fix=default(Vector3))
Definition: Card.cs:5438
void ShowEmo(Emo _emo=Emo.none, float duration=0f, bool skipSame=true)
Definition: Card.cs:5372
void ModCurrency(int a, string id="money")
Definition: Card.cs:3638
int Evalue(int ele)
Definition: Card.cs:2431
int Dist(Card c)
Definition: Card.cs:6777
void ModExp(string alias, int a)
Definition: Card.cs:2508
CardRenderer renderer
Definition: Card.cs:57
void Say(string lang, string ref1=null, string ref2=null)
Definition: Card.cs:6046
Definition: Chara.cs:10
override bool IsAliveInCurrentZone
Definition: Chara.cs:546
Condition AddCondition(string id, int p=100, bool force=false)
Definition: Chara.cs:8415
void ModAffinity(Chara c, int a, bool show=true, bool showOnlyEmo=false)
Definition: Chara.cs:7166
override bool IsPC
Definition: Chara.cs:597
override bool IsPCParty
Definition: Chara.cs:600
Stats hygiene
Definition: Chara.cs:961
bool IsInCombat
Definition: Chara.cs:817
bool IsHuman
Definition: Chara.cs:835
override bool IsPCFaction
Definition: Chara.cs:656
override bool IsDeadOrSleeping
Definition: Chara.cs:558
void MakeAlly(bool msg=true)
Definition: Chara.cs:2004
FactionMemberType memberType
Definition: Chara.cs:46
Stats stamina
Definition: Chara.cs:955
void SetTempHand(int right=0, int left=0)
Definition: Chara.cs:6057
bool IsHomeMember()
Definition: Chara.cs:5942
Affinity affinity
Definition: Chara.cs:299
void DoHostileAction(Card _tg, bool immediate=false)
Definition: Chara.cs:5707
bool isDead
Definition: Chara.cs:374
override void LookAt(Card c)
Definition: Chara.cs:3219
SourceRace.Row race
Definition: Chara.cs:449
Definition: EClass.cs:5
static int rnd(int a)
Definition: EClass.cs:50
static Map _map
Definition: EClass.cs:18
static int rndHalf(int a)
Definition: EClass.cs:74
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
void ModKarma(int a)
Definition: Player.cs:2289
Thing DropReward(Thing t, bool silent=false)
Definition: Player.cs:2320
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)