Elin Decompiled Documentation EA 23.253 Nightly
Loading...
Searching...
No Matches
Chara.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.IO;
4using System.Linq;
5using Algorithms;
6using Newtonsoft.Json;
7using UnityEngine;
8
9public class Chara : Card, IPathfindWalker
10{
11 private static Point shared = new Point();
12
13 private static List<Hobby> listHobby = new List<Hobby>();
14
15 public static string[] IDTimeTable = new string[2] { "default", "owl" };
16
17 [JsonProperty]
18 public int contribution;
19
20 [JsonProperty]
21 public Point orgPos;
22
23 [JsonProperty]
24 public Quest quest;
25
26 [JsonProperty]
27 public Chara ride;
28
29 [JsonProperty]
31
32 [JsonProperty]
33 public Chara host;
34
35 [JsonProperty]
37
39
41
42 [JsonProperty(PropertyName = "T1")]
43 public Party party;
44
45 [JsonProperty(PropertyName = "T2")]
47
48 [JsonProperty(PropertyName = "T3")]
49 public List<int> _hobbies;
50
51 [JsonProperty(PropertyName = "T4")]
52 public List<int> _works;
53
54 [JsonProperty(PropertyName = "T5")]
56
57 [JsonProperty(PropertyName = "T6")]
58 public List<int> _cooldowns;
59
60 [JsonProperty(PropertyName = "T7")]
61 public List<int> _listAbility;
62
63 [JsonProperty(PropertyName = "T8")]
64 public List<List<string>> _historyFood;
65
66 [JsonProperty(PropertyName = "1")]
67 public PCCData pccData;
68
69 [JsonProperty(PropertyName = "2")]
70 public Card held;
71
72 [JsonProperty(PropertyName = "3")]
73 public int[] rawSlots;
74
75 [JsonProperty(PropertyName = "4")]
77
78 [JsonProperty(PropertyName = "8")]
79 public string[] _strs = new string[5];
80
81 [JsonProperty(PropertyName = "9")]
82 public int[] _cints = new int[30];
83
85
86 public Chara enemy;
87
88 public Chara master;
89
90 public Point lastPos = new Point();
91
93
94 public CharaBody body = new CharaBody();
95
97
98 public Thing ranged;
99
101
103
105
106 public Emo2 emoIcon;
107
108 public int happiness;
109
110 public int turnLastSeen = -100;
111
112 public int idleActTimer;
113
114 public int combatCount;
115
116 public int calmCheckTurn;
117
118 public int sharedCheckTurn;
119
120 public float idleTimer;
121
122 public bool isBerserk;
123
124 public bool isDrunk;
125
126 public bool isConfused;
127
128 public bool isFainted;
129
130 public bool isBlind;
131
132 public bool isParalyzed;
133
134 public bool _isLevitating;
135
136 public bool isCreated;
137
138 public bool canSeeInvisible;
139
140 public bool hasTelepathy;
141
142 public bool isWet;
143
144 public bool bossText;
145
146 public bool ignoreSPAbsorb;
147
148 public bool wasInWater;
149
151
152 public bool isWeakToSunlight;
153
155
157
159
161
163
165
166 public static List<SourceRace.Row> ListAdvRace = new List<SourceRace.Row>();
167
168 public static List<SourceJob.Row> ListAdvJob = new List<SourceJob.Row>();
169
170 public bool dirtySpeed = true;
171
172 private long _Speed;
173
174 private static Point _sharedPos = new Point();
175
176 private bool hasMovedThisTurn;
177
178 public float actTime = 0.3f;
179
180 public static bool consumeTurn;
181
182 public static bool preventRegen;
183
184 public static bool isOnCreate;
185
186 private static List<Chara> _pts = new List<Chara>();
187
188 public int stealthSeen;
189
190 private static List<Thing> _ListItems = new List<Thing>();
191
192 private static List<SourceThing.Row> _listFavFood = new List<SourceThing.Row>();
193
194 private static List<SourceCategory.Row> _listFavCat = new List<SourceCategory.Row>();
195
196 public static NoGoal _NoGoalPC = new NoGoal();
197
198 public static NoGoal _NoGoalRepeat = new NoGoal();
199
200 public GoalList goalList = new GoalList();
201
202 public AIAct ai = new NoGoal();
203
205
206 private static GoalWork _goalWork = new GoalWork();
207
208 private static GoalHobby _goalHobby = new GoalHobby();
209
210 [JsonProperty]
211 public List<Condition> conditions = new List<Condition>();
212
213 [JsonProperty]
214 public Dictionary<int, int> resistCon;
215
216 public string Aka => _alias.IsEmpty(source.GetText("aka", returnNull: true) ?? "");
217
218 public string _alias
219 {
220 get
221 {
222 return _strs[0];
223 }
224 set
225 {
226 _strs[0] = value;
227 }
228 }
229
230 public string idFaith
231 {
232 get
233 {
234 return _strs[1];
235 }
236 set
237 {
238 _strs[1] = value;
239 }
240 }
241
242 public string idFaction
243 {
244 get
245 {
246 return _strs[2];
247 }
248 set
249 {
250 _strs[2] = value;
251 }
252 }
253
255 {
256 get
257 {
258 return RefZone.Get(_cints[1]);
259 }
260 set
261 {
262 _cints[1] = RefZone.Set(value);
263 }
264 }
265
267 {
268 get
269 {
270 return RefZone.Get(_cints[2]);
271 }
272 set
273 {
274 _cints[2] = RefZone.Set(value);
275 }
276 }
277
279 {
280 get
281 {
282 return _cints[3].ToEnum<GoalListType>();
283 }
284 set
285 {
286 _cints[3] = (int)value;
287 }
288 }
289
291 {
292 get
293 {
294 return _cints[4].ToEnum<Hostility>();
295 }
296 set
297 {
298 _cints[4] = (int)value;
299 }
300 }
301
302 public int _affinity
303 {
304 get
305 {
306 return _cints[5];
307 }
308 set
309 {
310 _cints[5] = value;
311 }
312 }
313
314 public Affinity affinity => Affinity.Get(this);
315
316 public int interest
317 {
318 get
319 {
320 return _cints[6];
321 }
322 set
323 {
324 _cints[6] = value;
325 }
326 }
327
328 public int daysStarved
329 {
330 get
331 {
332 return _cints[7];
333 }
334 set
335 {
336 _cints[7] = value;
337 }
338 }
339
340 public int _idTimeTable
341 {
342 get
343 {
344 return _cints[9];
345 }
346 set
347 {
348 _cints[9] = value;
349 }
350 }
351
352 public int uidEditor
353 {
354 get
355 {
356 return _cints[10];
357 }
358 set
359 {
360 _cints[10] = value;
361 }
362 }
363
364 public int _maxStamina
365 {
366 get
367 {
368 return _cints[20];
369 }
370 set
371 {
372 _cints[20] = value;
373 }
374 }
375
376 public int corruption
377 {
378 get
379 {
380 return _cints[21];
381 }
382 set
383 {
384 _cints[21] = value;
385 }
386 }
387
388 public bool isDead
389 {
390 get
391 {
392 return _cbits1[0];
393 }
394 set
395 {
396 _cbits1[0] = value;
397 }
398 }
399
400 public bool isAlawysVisible
401 {
402 get
403 {
404 return _cbits1[1];
405 }
406 set
407 {
408 _cbits1[1] = value;
409 }
410 }
411
412 public bool knowFav
413 {
414 get
415 {
416 return _cbits1[3];
417 }
418 set
419 {
420 _cbits1[3] = value;
421 }
422 }
423
425
427 {
428 get
429 {
430 return _faction ?? (_faction = EClass.game.factions.dictAll.TryGetValue(idFaction));
431 }
432 set
433 {
434 idFaction = value?.uid;
435 }
436 }
437
439 {
440 get
441 {
442 return EClass.game.religions.dictAll.TryGetValue(idFaith) ?? EClass.game.religions.dictAll["eyth"];
443 }
444 set
445 {
446 idFaith = value?.id;
447 }
448 }
449
450 public override CardRow sourceCard => source;
451
452 public override CardRow sourceRenderCard
453 {
454 get
455 {
456 if (pccData != null && !(source.renderData is RenderDataPcc))
457 {
459 }
460 return source;
461 }
462 }
463
464 public SourceRace.Row race => _race ?? (_race = EClass.sources.races.map.TryGetValue(base.c_idRace.IsEmpty(source.race))) ?? EClass.sources.races.map["norland"];
465
466 public SourceJob.Row job => _job ?? (_job = EClass.sources.jobs.map.TryGetValue(base.c_idJob.IsEmpty(source.job))) ?? EClass.sources.jobs.map["none"];
467
469
471 {
472 get
473 {
474 if (EClass.pc == null || !IsPCFaction)
475 {
476 if (base.c_originalHostility == (Hostility)0)
477 {
478 if (!source.hostility.IsEmpty())
479 {
480 return source.hostility.ToEnum<Hostility>();
481 }
482 return Hostility.Enemy;
483 }
484 return base.c_originalHostility;
485 }
486 return Hostility.Ally;
487 }
488 }
489
490 public string IDPCCBodySet
491 {
492 get
493 {
494 if (source.idActor.Length <= 1)
495 {
496 return "female";
497 }
498 return source.idActor[1];
499 }
500 }
501
502 public new TraitChara trait
503 {
504 get
505 {
506 return base.trait as TraitChara;
507 }
508 set
509 {
510 base.trait = value;
511 }
512 }
513
514 public string NameBraced => GetName(NameStyle.Full);
515
516 public string NameTitled => (EClass.game.principal.permadeath ? "★" : "") + NameBraced;
517
518 public override string actorPrefab
519 {
520 get
521 {
522 if (IsPCC)
523 {
524 return "CharaActorPCC";
525 }
526 return "CharaActor";
527 }
528 }
529
530 public override int PrefIndex
531 {
532 get
533 {
534 if (sourceCard._tiles.Length != 0 || renderer.replacer != null)
535 {
536 if (base.dir != 1 && base.dir != 2)
537 {
538 return 0;
539 }
540 return 1;
541 }
542 return base.dir;
543 }
544 }
545
546 public override bool flipX
547 {
548 get
549 {
550 if (base.dir != 1)
551 {
552 return base.dir == 2;
553 }
554 return true;
555 }
556 }
557
558 public override string AliasMaterialOnCreate => race.material;
559
560 public override bool IsAliveInCurrentZone
561 {
562 get
563 {
564 if (!isDead)
565 {
566 return base.ExistsOnMap;
567 }
568 return false;
569 }
570 }
571
572 public override bool IsDeadOrSleeping
573 {
574 get
575 {
576 if (!isDead && conSleep == null && conSuspend == null)
577 {
578 return isFainted;
579 }
580 return true;
581 }
582 }
583
584 public override bool IsDisabled
585 {
586 get
587 {
588 if (!isDead && conSleep == null && !isFainted)
589 {
590 return isParalyzed;
591 }
592 return true;
593 }
594 }
595
596 public bool IsLevitating
597 {
598 get
599 {
600 if (ride != null)
601 {
602 return ride._isLevitating;
603 }
604 return _isLevitating;
605 }
606 }
607
608 public override bool IsMoving => idleTimer > 0f;
609
610 public override bool IsGlobal => global != null;
611
612 public override bool IsPC => this == EClass.player.chara;
613
614 public override bool IsPCParty
615 {
616 get
617 {
618 if (party != null)
619 {
620 return party.leader == EClass.pc;
621 }
622 return false;
623 }
624 }
625
626 public override bool IsMinion
627 {
628 get
629 {
630 if (master == null)
631 {
632 return base.c_uidMaster != 0;
633 }
634 return true;
635 }
636 }
637
638 public override bool IsPCPartyMinion
639 {
640 get
641 {
642 if (master != null)
643 {
644 if (!master.IsPCParty)
645 {
646 return master.IsPCPartyMinion;
647 }
648 return true;
649 }
650 return false;
651 }
652 }
653
654 public override bool IsPCFactionMinion
655 {
656 get
657 {
658 if (master != null)
659 {
660 if (!master.IsPCFaction)
661 {
663 }
664 return true;
665 }
666 return false;
667 }
668 }
669
670 public override bool IsPCFaction
671 {
672 get
673 {
674 if (EClass.pc != null)
675 {
676 return faction == EClass.pc.faction;
677 }
678 return false;
679 }
680 }
681
682 public override bool IsPCC => pccData != null;
683
684 public override bool isThing => false;
685
686 public override bool isChara => true;
687
688 public override bool HasHost => host != null;
689
690 public override bool isSynced
691 {
692 get
693 {
694 if (renderer == null || !renderer.isSynced)
695 {
696 if (host != null)
697 {
698 return host.isSynced;
699 }
700 return false;
701 }
702 return true;
703 }
704 }
705
706 public override bool IsMultisize => sourceCard.multisize;
707
708 public override int MaxHP => (int)Mathf.Clamp(((long)(base.END * 2 + base.STR + base.WIL / 2) * (long)Mathf.Min(base.LV, 25) / 25 + base.END + 10) * Evalue(60) / 100 * ((base.IsPCFactionOrMinion ? 100 : (100 + (int)base.rarity * 300)) + (IsPC ? (EClass.player.lastEmptyAlly * Evalue(1646)) : 0)) / 100, 1f, 1E+09f);
709
710 public override int WeightLimit => (int)Mathf.Clamp(((long)base.STR * 500L + base.END * 250 + Evalue(207) * 2000) * ((!HasElement(1411)) ? 1 : 5) + 45000, 1000f, 1.0737418E+09f);
711
712 public override int SelfWeight => bio.weight * 1000;
713
714 public int MaxSummon => Mathf.Max((int)Mathf.Sqrt(base.CHA), 1) + Evalue(1647) + ((!base.IsPCFactionOrMinion) ? ((int)base.rarity * 5) : 0);
715
717 {
718 get
719 {
720 if (base.c_idMainElement == 0)
721 {
722 return Element.Void;
723 }
724 return elements.GetElement(base.c_idMainElement);
725 }
726 }
727
728 public override int DV
729 {
730 get
731 {
732 if (IsPCFaction)
733 {
734 return WeaknessMod(elements.Value(64));
735 }
736 int num = base.LV;
737 if (num > 50)
738 {
739 num = 50 + (num - 50) / 10;
740 }
741 return WeaknessMod(num + elements.Value(64) * (100 + num + race.DV * 5) / 100);
742 int WeaknessMod(int a)
743 {
744 if (HasCondition<ConWeakness>())
745 {
746 if (a <= 0)
747 {
748 return a * 2;
749 }
750 return a / 2;
751 }
752 return a;
753 }
754 }
755 }
756
757 public override int PV
758 {
759 get
760 {
761 if (IsPCFaction)
762 {
763 return WeaknessMod(elements.Value(65));
764 }
765 int num = base.LV;
766 if (num > 50)
767 {
768 num = 50 + (num - 50) / 10;
769 }
770 return WeaknessMod(num + elements.Value(65) * (100 + num + race.PV * 5) / 100);
771 int WeaknessMod(int a)
772 {
773 if (HasCondition<ConWeakness>())
774 {
775 if (a <= 0)
776 {
777 return a * 2;
778 }
779 return a / 2;
780 }
781 return a;
782 }
783 }
784 }
785
786 public override SourcePref Pref
787 {
788 get
789 {
790 if (spriteReplacer != null)
791 {
793 }
794 if (base.idSkin > 0)
795 {
796 switch (sourceCard.tiles.TryGet(base.idSkin))
797 {
798 case 2319:
799 case 2619:
800 case 2621:
801 case 2623:
802 case 2625:
804 case 2320:
805 case 2611:
806 case 2620:
807 case 2622:
808 case 2624:
809 case 2626:
810 case 2828:
812 }
813 }
814 return sourceCard.pref;
815 }
816 }
817
818 public bool CanOpenDoor
819 {
820 get
821 {
822 if (base.INT < 5)
823 {
824 if (IsPCFaction)
825 {
826 return memberType == FactionMemberType.Default;
827 }
828 return false;
829 }
830 return true;
831 }
832 }
833
834 public Tactics tactics => _tactics ?? (_tactics = new Tactics(this));
835
837
839
840 public bool IsLocalChara
841 {
842 get
843 {
844 if (!IsGlobal && !base.isSubsetCard)
845 {
846 return homeZone == EClass._zone;
847 }
848 return false;
849 }
850 }
851
852 public bool IsIdle
853 {
854 get
855 {
856 if (!IsDeadOrSleeping)
857 {
858 return ai.Current.IsIdle;
859 }
860 return false;
861 }
862 }
863
864 public bool IsInCombat => ai is GoalCombat;
865
866 public bool IsAnimal
867 {
868 get
869 {
870 if (!race.IsAnimal)
871 {
872 return HasTag(CTAG.animal);
873 }
874 return true;
875 }
876 }
877
878 public bool IsHuman
879 {
880 get
881 {
882 if (!race.IsHuman)
883 {
884 return HasTag(CTAG.human);
885 }
886 return true;
887 }
888 }
889
890 public bool IsUndead
891 {
892 get
893 {
894 if (!race.IsUndead)
895 {
896 return HasTag(CTAG.undead);
897 }
898 return true;
899 }
900 }
901
902 public bool IsMachine
903 {
904 get
905 {
906 if (!race.IsMachine)
907 {
908 return HasTag(CTAG.machine);
909 }
910 return true;
911 }
912 }
913
914 public bool IsHorror
915 {
916 get
917 {
918 if (!race.IsHorror)
919 {
920 return HasTag(CTAG.horror);
921 }
922 return true;
923 }
924 }
925
926 public bool IsFish
927 {
928 get
929 {
930 if (!race.IsFish)
931 {
932 return HasTag(CTAG.fish);
933 }
934 return true;
935 }
936 }
937
938 public bool IsFairy
939 {
940 get
941 {
942 if (!race.IsFairy)
943 {
944 return HasTag(CTAG.fairy);
945 }
946 return true;
947 }
948 }
949
950 public bool IsGod
951 {
952 get
953 {
954 if (!race.IsGod)
955 {
956 return HasTag(CTAG.god);
957 }
958 return true;
959 }
960 }
961
962 public bool IsDragon
963 {
964 get
965 {
966 if (!race.IsDragon)
967 {
968 return HasTag(CTAG.dragon);
969 }
970 return true;
971 }
972 }
973
974 public bool IsPlant
975 {
976 get
977 {
978 if (!race.IsPlant)
979 {
980 return HasTag(CTAG.plant);
981 }
982 return true;
983 }
984 }
985
986 public bool IsCat
987 {
988 get
989 {
990 if (!(race.id == "cat") && !(race.id == "catsister"))
991 {
992 return race.id == "catgod";
993 }
994 return true;
995 }
996 }
997
998 public int DestDist => tactics.DestDist;
999
1000 public bool HasNoGoal => ai.IsNoGoal;
1001
1002 public bool CanWitness
1003 {
1004 get
1005 {
1006 if (!IsHuman && !IsFairy && !IsGod)
1007 {
1008 return race.id == "mutant";
1009 }
1010 return true;
1011 }
1012 }
1013
1014 public bool IsHumanSpeak
1015 {
1016 get
1017 {
1018 if (!IsHuman && !race.tag.Contains("humanSpeak"))
1019 {
1020 return HasTag(CTAG.humanSpeak);
1021 }
1022 return true;
1023 }
1024 }
1025
1026 public bool IsMaid
1027 {
1028 get
1029 {
1030 if (EClass.Branch != null)
1031 {
1032 return EClass.Branch.uidMaid == base.uid;
1033 }
1034 return false;
1035 }
1036 }
1037
1038 public bool IsPrisoner => false;
1039
1040 public bool IsAdventurer
1041 {
1042 get
1043 {
1044 if (global != null && faction != EClass.pc.faction)
1045 {
1046 return IsPCC;
1047 }
1048 return false;
1049 }
1050 }
1051
1052 public bool IsEyth => faith.id == "eyth";
1053
1054 public bool IsWealthy
1055 {
1056 get
1057 {
1058 if (!source.works.Contains("Rich"))
1059 {
1060 return source.hobbies.Contains("Rich");
1061 }
1062 return true;
1063 }
1064 }
1065
1067
1068 public int MaxGeneSlot => race.geneCap - (HasElement(1237) ? 2 : 0) + Evalue(1242) + Evalue(1273);
1069
1071 {
1072 get
1073 {
1074 if (base.c_genes != null)
1075 {
1076 return base.c_genes.GetGeneSlot(this);
1077 }
1078 return 0;
1079 }
1080 }
1081
1082 public int Speed
1083 {
1084 get
1085 {
1086 if (dirtySpeed)
1087 {
1088 RefreshSpeed();
1089 }
1090 if (_Speed > 100000000)
1091 {
1092 return 100000000;
1093 }
1094 return (int)_Speed;
1095 }
1096 }
1097
1098 public bool IsMofuable
1099 {
1100 get
1101 {
1102 if (!race.tag.Contains("mofu"))
1103 {
1104 return HasElement(419);
1105 }
1106 return true;
1107 }
1108 }
1109
1111 {
1112 get
1113 {
1114 if (_baseWorkElements == null)
1115 {
1117 foreach (Hobby item in ListHobbies())
1118 {
1119 Build(item);
1120 }
1121 foreach (Hobby item2 in ListWorks())
1122 {
1123 Build(item2);
1124 }
1125 }
1126 return _baseWorkElements;
1127 void Build(Hobby h)
1128 {
1129 if (!h.source.elements.IsEmpty())
1130 {
1131 for (int i = 0; i < h.source.elements.Length; i += 2)
1132 {
1133 int ele = h.source.elements[i];
1134 int v = h.source.elements[i + 1];
1135 _baseWorkElements.ModBase(ele, v);
1136 }
1137 }
1138 }
1139 }
1140 }
1141
1142 public Stats hunger => Stats.Hunger.Set(_cints, 10, this);
1143
1144 public Stats burden => Stats.Burden.Set(_cints, 11, this);
1145
1146 public Stats stamina => Stats.Stamina.Set(_cints, 12, this);
1147
1149
1150 public Stats bladder => Stats.Bladder.Set(_cints, 14, this);
1151
1152 public Stats hygiene => Stats.Hygiene.Set(_cints, 15, this);
1153
1154 public Stats mana => Stats.Mana.Set(_cints, 16, this);
1155
1157
1158 public Stats SAN => Stats.SAN.Set(_cints, 18, this);
1159
1161 {
1162 get
1163 {
1164 if (base.rarity >= Rarity.Legendary)
1165 {
1166 return !IsPCFaction;
1167 }
1168 return false;
1169 }
1170 }
1171
1172 public override string ToString()
1173 {
1174 return base.Name + "(" + ai?.ToString() + ")" + pos?.ToString() + "/" + base.ExistsOnMap + "/" + isDead;
1175 }
1176
1177 public bool IsCriticallyWounded(bool includeRide = false)
1178 {
1179 if (host == null || includeRide)
1180 {
1181 if (Evalue(1421) <= 0)
1182 {
1183 return base.hp < MaxHP / 5;
1184 }
1185 return base.hp + mana.value < (MaxHP + mana.max) / 5;
1186 }
1187 return false;
1188 }
1189
1190 public bool HasHigherGround(Card c)
1191 {
1192 if (c == null)
1193 {
1194 return false;
1195 }
1196 float num = renderer.position.y - pos.Position(0).y + (_isLevitating ? 0.4f : 0f);
1197 float num2 = c.renderer.position.y - c.pos.Position(0).y + ((c.isChara && c.Chara._isLevitating) ? 0.4f : 0f);
1198 return num > num2 + 0.1f;
1199 }
1200
1201 public bool CanSeeSimple(Point p)
1202 {
1203 if (!p.IsValid || p.IsHidden)
1204 {
1205 return false;
1206 }
1207 if (IsPC)
1208 {
1209 if (fov != null)
1210 {
1211 return fov.lastPoints.ContainsKey(p.index);
1212 }
1213 return false;
1214 }
1215 return true;
1216 }
1217
1218 public bool CanSee(Card c)
1219 {
1220 if (c == this)
1221 {
1222 return true;
1223 }
1224 if (!c.pos.IsValid)
1225 {
1226 return false;
1227 }
1228 if (c.isChara)
1229 {
1231 {
1232 return true;
1233 }
1234 if (c.isHidden && c != this && !canSeeInvisible)
1235 {
1236 return false;
1237 }
1238 }
1239 if (IsPC)
1240 {
1241 if (fov != null)
1242 {
1243 return fov.lastPoints.ContainsKey(c.pos.index);
1244 }
1245 return false;
1246 }
1247 return true;
1248 }
1249
1250 public bool CanSeeLos(Card c, int dist = -1)
1251 {
1253 {
1254 return false;
1255 }
1256 return CanSeeLos(c.pos, dist);
1257 }
1258
1259 public bool CanSeeLos(Point p, int dist = -1)
1260 {
1261 if (dist == -1)
1262 {
1263 dist = pos.Distance(p);
1264 }
1265 if (dist > GetSightRadius())
1266 {
1267 return false;
1268 }
1269 if (IsPC)
1270 {
1271 if (fov != null)
1272 {
1273 return fov.lastPoints.ContainsKey(p.index);
1274 }
1275 return false;
1276 }
1277 return Los.IsVisible(pos, p);
1278 }
1279
1280 public bool HasAccess(Card c)
1281 {
1282 return HasAccess(c.pos);
1283 }
1284
1285 public bool HasAccess(Point p)
1286 {
1287 if (!EClass._zone.IsPCFaction || p.cell.room == null || IsPC)
1288 {
1289 return true;
1290 }
1291 return p.cell.room.data.accessType switch
1292 {
1293 BaseArea.AccessType.Resident => memberType == FactionMemberType.Default,
1294 BaseArea.AccessType.Private => false,
1295 _ => true,
1296 };
1297 }
1298
1299 public bool CanSleep()
1300 {
1301 if (EClass._zone.events.GetEvent<ZoneEventQuest>() != null)
1302 {
1303 return false;
1304 }
1305 if (!EClass.debug.godMode && sleepiness.GetPhase() == 0)
1306 {
1307 return stamina.GetPhase() <= 1;
1308 }
1309 return true;
1310 }
1311
1312 protected override void OnSerializing()
1313 {
1314 if (enemy != null)
1315 {
1316 SetInt(55, enemy.uid);
1317 }
1318 _cints[0] = (int)_cbits1.Bits;
1319 List<BodySlot> slots = body.slots;
1320 rawSlots = new int[slots.Count];
1321 for (int i = 0; i < slots.Count; i++)
1322 {
1323 rawSlots[i] = slots[i].elementId;
1324 }
1325 }
1326
1327 protected override void OnDeserialized()
1328 {
1329 isCreated = true;
1330 _cbits1.Bits = (uint)_cints[0];
1331 InitStats(onDeserialize: true);
1332 body.SetOwner(this, deserialized: true);
1333 elements.ApplyElementMap(base.uid, SourceValueType.Chara, job.elementMap, base.DefaultLV);
1334 elements.ApplyElementMap(base.uid, SourceValueType.Chara, race.elementMap, base.DefaultLV);
1335 if (global != null && global.goal != null)
1336 {
1337 global.goal.SetOwner(this);
1338 }
1339 if (IsPCC)
1340 {
1341 pccData.state = (base.isCensored ? PCCState.Naked : PCCState.Normal);
1342 }
1343 if (tempElements != null)
1344 {
1345 tempElements.SetParent(this);
1346 }
1347 UpdateAngle();
1349 Refresh();
1350 if (source.tag.Contains("boss"))
1351 {
1352 bossText = true;
1353 }
1354 sharedCheckTurn = EClass.rnd(200);
1355 }
1356
1357 public override string GetName(NameStyle style, int num = -1)
1358 {
1359 if (base.isBackerContent && EClass.core.config.backer.Show(base.c_idBacker))
1360 {
1361 if (id == "follower" && !IsGlobal)
1362 {
1363 return "_follower".lang(EClass.sources.backers.map[base.c_idBacker].Name, faith.Name);
1364 }
1365 return EClass.sources.backers.map[base.c_idBacker].Name;
1366 }
1367 string text = base.c_altName ?? source.GetName(this);
1368 text = text.Replace("#ele5", MainElement.source.GetAltname(3)).Replace("#ele4", MainElement.source.GetAltname(2)).Replace("#ele3", MainElement.source.GetAltname(1))
1369 .Replace("#ele2", MainElement.source.GetAltname(0))
1370 .Replace("#ele", MainElement.source.GetName().ToLower());
1371 if (base.c_bossType == BossType.Evolved)
1372 {
1373 text = "_evolved".lang(text.ToTitleCase(wholeText: true));
1374 }
1375 trait.SetName(ref text);
1376 if (text.Length > 0 && char.IsLower(text[0]))
1377 {
1378 if (base.rarity >= Rarity.Legendary)
1379 {
1380 text = text.ToTitleCase();
1381 }
1382 else if (num != 0)
1383 {
1384 text = text.AddArticle();
1385 }
1386 }
1387 if (style == NameStyle.Simple)
1388 {
1389 return text;
1390 }
1391 int num2 = ((base.rarity == Rarity.Mythical) ? 3 : ((base.rarity >= Rarity.Legendary) ? 2 : ((!_alias.IsEmpty()) ? 1 : (-1))));
1392 if (trait is TraitAdventurer)
1393 {
1394 num2 = 1;
1395 }
1396 text = (Aka.IsEmpty() ? text.Bracket(num2) : (num2 switch
1397 {
1398 -1 => "_aka",
1399 1 => "_aka3",
1400 _ => "_aka2",
1401 }).lang((num2 == -1) ? Aka : Aka.ToTitleCase(wholeText: true), text.Bracket(num2)));
1402 string text2 = (base.isSale ? "forSale".lang(Lang._currency(GetPrice(CurrencyType.Money, sell: true, PriceType.PlayerShop), "money")) : "");
1403 return text + text2;
1404 }
1405
1406 public override void ChangeRarity(Rarity r)
1407 {
1408 if (r != base.rarity)
1409 {
1410 base.rarity = r;
1411 if (renderer != null && renderer.isSynced)
1412 {
1414 }
1415 base.hp = MaxHP;
1416 }
1417 }
1418
1420 {
1421 _faction = null;
1422 faction = f;
1424 return this;
1425 }
1426
1428 {
1429 homeZone = zone;
1430 SetGlobal();
1431 return this;
1432 }
1433
1435 {
1436 Hostility hostility2 = (base.c_originalHostility = h);
1437 this.hostility = hostility2;
1438 return this;
1439 }
1440
1441 public void OnBanish()
1442 {
1443 if (!IsGlobal)
1444 {
1445 return;
1446 }
1447 memberType = FactionMemberType.Default;
1448 foreach (Thing item in things.List((Thing a) => a.HasTag(CTAG.godArtifact)).ToList())
1449 {
1451 }
1452 UniqueData uniqueData = base.c_uniqueData;
1453 if (uniqueData != null)
1454 {
1455 Debug.Log(uniqueData.uidZone + "/" + EClass.game.spatials.map.ContainsKey(uniqueData.uidZone) + "/" + uniqueData.x + "/" + uniqueData.y);
1456 }
1457 if (uniqueData != null && EClass.game.spatials.map.ContainsKey(uniqueData.uidZone))
1458 {
1459 MoveHome(EClass.game.spatials.map[uniqueData.uidZone] as Zone, uniqueData.x, uniqueData.y);
1460 return;
1461 }
1462 Zone z = EClass.game.spatials.Find("somewhere");
1463 if (trait is TraitAdventurer)
1464 {
1465 z = EClass.world.region.ListTowns().RandomItem();
1466 SetHomeZone(z);
1467 }
1468 MoveZone(z, ZoneTransition.EnterState.RandomVisit);
1469 }
1470
1471 public Chara SetGlobal(Zone _home, int x, int z)
1472 {
1473 SetGlobal();
1474 homeZone = _home;
1475 _home.AddCard(this, x, z);
1476 global.transition = new ZoneTransition
1477 {
1478 state = ZoneTransition.EnterState.Exact,
1479 x = x,
1480 z = z
1481 };
1482 orgPos = new Point(x, z);
1483 return this;
1484 }
1485
1487 {
1488 if (!IsGlobal)
1489 {
1491 global = new GlobalData();
1492 base.isSubsetCard = false;
1493 enemy = null;
1494 base.c_uidMaster = 0;
1495 }
1496 return this;
1497 }
1498
1499 public void RemoveGlobal()
1500 {
1501 if (IsGlobal)
1502 {
1503 global = null;
1505 }
1506 }
1507
1508 public override void OnBeforeCreate()
1509 {
1510 if (source.job == "*r")
1511 {
1512 base.c_idJob = EClass.sources.jobs.rows.Where((SourceJob.Row j) => j.playable < 4).RandomItem().id;
1513 }
1514 if (bp.idJob != null)
1515 {
1516 base.c_idJob = bp.idJob;
1517 }
1518 if (bp.idRace != null)
1519 {
1520 base.c_idRace = bp.idRace;
1521 }
1522 }
1523
1524 public override void OnCreate(int genLv)
1525 {
1526 if (source.tag.Contains("boss"))
1527 {
1528 bossText = true;
1529 }
1530 int num = ((bp.lv != -999) ? bp.lv : base.LV);
1531 if (trait.AdvType == TraitChara.Adv_Type.Adv || trait.AdvType == TraitChara.Adv_Type.Adv_Fairy)
1532 {
1533 if (ListAdvRace.Count == 0)
1534 {
1535 ListAdvRace = EClass.sources.races.rows.Where((SourceRace.Row a) => a.playable <= 1 && a.id != "fairy").ToList();
1536 ListAdvJob = EClass.sources.jobs.rows.Where((SourceJob.Row a) => a.playable <= 4).ToList();
1537 }
1538 if (trait.AdvType == TraitChara.Adv_Type.Adv)
1539 {
1540 base.c_idRace = ListAdvRace.RandomItem().id;
1541 }
1542 base.c_idJob = ListAdvJob.RandomItem().id;
1543 _race = null;
1544 _job = null;
1545 num = 10 + EClass.rnd(40);
1546 }
1547 bio = new Biography();
1548 bio.Generate(this);
1549 if (source.idActor.Length != 0 && source.idActor[0] == "pcc" && pccData == null)
1550 {
1551 pccData = PCCData.Create(IDPCCBodySet);
1552 if (source.idActor.Length > 2)
1553 {
1554 pccData.SetPart("body", IDPCCBodySet, source.idActor[2]);
1555 }
1556 else
1557 {
1558 pccData.Randomize(IDPCCBodySet);
1559 }
1560 }
1561 if (source.mainElement.Length != 0)
1562 {
1563 int _genLv = Mathf.Min(genLv, 100);
1564 List<Tuple<string, int, int>> list = new List<Tuple<string, int, int>>();
1565 string[] mainElement = source.mainElement;
1566 for (int i = 0; i < mainElement.Length; i++)
1567 {
1568 string[] array = mainElement[i].Split('/');
1569 SourceElement.Row row = EClass.sources.elements.alias["ele" + array[0]];
1570 int num2 = source.LV * row.eleP / 100;
1571 if (list.Count == 0 || num2 < _genLv || array[0] == bp.idEle)
1572 {
1573 list.Add(new Tuple<string, int, int>(array[0], (array.Length > 1) ? int.Parse(array[1]) : 0, num2));
1574 }
1575 }
1576 Tuple<string, int, int> tuple = list.RandomItemWeighted((Tuple<string, int, int> a) => 10000 / (100 + (_genLv - a.Item3) * 25));
1577 if (!bp.idEle.IsEmpty())
1578 {
1579 tuple = list.Where((Tuple<string, int, int> a) => a.Item1 == bp.idEle || "ele" + a.Item1 == bp.idEle).FirstOrDefault() ?? tuple;
1580 }
1581 SetMainElement(tuple.Item1, (tuple.Item2 == 0) ? 10 : tuple.Item2, elemental: true);
1582 if (list.Count >= 2)
1583 {
1584 num = tuple.Item3 + base.LV - source.LV;
1585 }
1586 }
1587 if (source.name == "*r")
1588 {
1589 base.c_altName = NameGen.getRandomName();
1590 }
1591 if (source.GetText("aka") == "*r" || trait.UseRandomAlias)
1592 {
1593 _alias = AliasGen.GetRandomAlias();
1594 }
1595 happiness = EClass.rnd(100);
1596 contribution = EClass.rnd(100);
1597 RerollHobby();
1598 _idTimeTable = ((EClass.rnd(5) == 0) ? 1 : 0);
1599 ApplyRace();
1600 ApplyJob();
1601 ChangeMaterial(source.defMat.IsEmpty(race.material), ignoreFixedMaterial: true);
1602 if (num != source.LV)
1603 {
1604 SetLv(num);
1605 }
1606 if (base.LV > 5 && race.id == "mutant")
1607 {
1608 for (int j = 0; j < Mathf.Min(1 + base.LV / 5, 22); j++)
1609 {
1610 SetFeat(1644, j + 1);
1611 }
1612 }
1613 switch (id)
1614 {
1615 case "putty_mech_b":
1616 case "putty_mech":
1617 case "robot":
1618 SetFeat(1248, 1 + EClass.rnd(5));
1619 break;
1620 }
1621 InitStats();
1622 body.SetOwner(this);
1624 if (race.EQ.Length != 0 || !source.equip.IsEmpty())
1625 {
1626 TryRestock(onCreate: true);
1627 }
1628 switch (id)
1629 {
1630 case "dodo":
1631 base.idSkin = EClass.rnd(4);
1632 break;
1633 case "putty_snow":
1634 if (EClass.rnd(100) == 0 || EClass.debug.enable)
1635 {
1636 base.idSkin = EClass.rnd(4);
1637 }
1638 break;
1639 case "snail":
1640 base.idSkin = 5;
1641 break;
1642 case "olderyoungersister":
1643 base.idSkin = 1;
1644 break;
1645 case "sister_undead":
1646 case "dog":
1647 case "cat":
1648 base.idSkin = EClass.rnd(sourceCard.tiles.Length);
1649 if (id == "sister_undead" && EClass.rnd(10) == 0)
1650 {
1652 if (row2 != null && (!EClass.player.doneBackers.Contains(row2.id) || EClass.core.config.test.ignoreBackerDestoryFlag))
1653 {
1654 ApplyBacker(row2.id);
1655 }
1656 }
1657 break;
1658 case "baby":
1659 case "ika":
1660 SetFeat(1232, 3);
1661 break;
1662 }
1663 if (HasTag(CTAG.random_color))
1664 {
1665 DyeRandom();
1666 }
1667 SetAI(new NoGoal());
1668 if (!source.faith.IsEmpty())
1669 {
1670 SetFaith(source.faith);
1671 }
1672 else if (EClass.game.activeZone != null && EClass.game.activeZone.id == "foxtown")
1673 {
1675 }
1676 else if (EClass.game.activeZone != null && EClass.game.activeZone.id == "foxtown_nefu")
1677 {
1679 }
1680 else
1681 {
1682 SetFaith(EClass.game.religions.GetRandomReligion(onlyJoinable: true, EClass.rnd(10) == 0));
1683 }
1684 _affinity = 0;
1685 interest = 100;
1688 Refresh();
1689 stamina.value = stamina.max;
1690 mana.value = mana.max;
1691 isCreated = true;
1692 }
1693
1695 {
1697 {
1698 SetLv(base.LV + EClass._zone.DangerLvBoost);
1700 TryRestock(onCreate: true);
1701 }
1702 return this;
1703 }
1704
1705 public void SetFaith(string id)
1706 {
1708 }
1709
1710 public void SetFaith(Religion r)
1711 {
1712 faith = r;
1714 }
1715
1716 public void HealAll()
1717 {
1718 Cure(CureType.HealComplete);
1719 base.hp = MaxHP;
1720 mana.value = mana.max;
1721 stamina.value = stamina.max;
1722 Refresh();
1723 }
1724
1725 public void Refresh(bool calledRecursive = false)
1726 {
1727 if (source == null)
1728 {
1729 Debug.LogError("source is null");
1730 SetSource();
1731 }
1732 if (ride != null && ride.source != null)
1733 {
1734 ride.Refresh(calledRecursive: true);
1735 }
1736 hasTelepathy = false;
1737 isWet = false;
1738 _isLevitating = HasElement(401) || (ride != null && ride._isLevitating);
1740 isWeakToSunlight = HasElement(1251) && !HasElement(431);
1741 base.isHidden = HasElement(415);
1742 foreach (Condition condition in conditions)
1743 {
1744 condition.OnRefresh();
1745 }
1746 if (isWet)
1747 {
1748 base.isHidden = false;
1749 }
1751 SetDirtySpeed();
1752 if (host != null && !calledRecursive && host.source != null)
1753 {
1754 host.Refresh(calledRecursive: true);
1755 }
1756 }
1757
1758 public bool CanDuplicate()
1759 {
1760 if (EClass._zone.IsRegion || HasCondition<ConPoison>() || HasCondition<ConConfuse>() || HasCondition<ConDim>() || HasCondition<ConParalyze>() || HasCondition<ConSleep>() || HasCondition<ConBurning>() || HasCondition<ConFreeze>() || HasCondition<ConMiasma>() || corruption >= 100)
1761 {
1762 return false;
1763 }
1765 {
1766 return false;
1767 }
1768 string text = id;
1769 if (!(text == "mech_scarab"))
1770 {
1771 if (text == "spider_queen" && (pos.cell.light > 0 || pos.IsSunLit))
1772 {
1773 return false;
1774 }
1775 }
1776 else if (isSynced || pos.cell.light > 0 || (!EClass._map.IsIndoor && !pos.cell.HasRoof && !EClass.world.date.IsNight))
1777 {
1778 return false;
1779 }
1780 return true;
1781 }
1782
1784 {
1785 Chara chara = CharaGen.Create(id);
1786 chara.mana.value = mana.value;
1787 chara.stamina.value = stamina.value;
1788 foreach (KeyValuePair<int, Element> item in elements.dict)
1789 {
1790 Element orCreateElement = chara.elements.GetOrCreateElement(item.Key);
1791 orCreateElement.vBase = item.Value.ValueWithoutLink - orCreateElement.vSource;
1792 }
1793 chara.SetFaith(faith);
1794 chara.bio = IO.DeepCopy(bio);
1795 chara.LV = base.LV;
1796 chara.c_daysWithGod = base.c_daysWithGod;
1797 chara.RefreshFaithElement();
1798 chara.hp = (int)Mathf.Clamp((float)chara.MaxHP * ((float)base.hp / (float)MaxHP) * 0.99f, 0f, chara.MaxHP);
1799 chara.isCopy = true;
1800 chara.isScaled = base.isScaled;
1801 if (HaveFur())
1802 {
1803 chara.c_fur = -1;
1804 }
1805 return chara;
1806 }
1807
1808 public int GetBurden(Card t = null, int num = -1)
1809 {
1810 int num2 = (base.ChildrenWeight + ((t != null) ? ((num == -1) ? t.ChildrenAndSelfWeight : (t.SelfWeight * num)) : 0)) * 100 / WeightLimit;
1811 if (num2 < 0)
1812 {
1813 num2 = 1000;
1814 }
1816 {
1817 num2 = 0;
1818 }
1819 int num3 = ((num2 >= 100) ? ((num2 - 100) / 10 + 1) : 0);
1820 if (num3 > 9)
1821 {
1822 num3 = 9;
1823 }
1824 return num3;
1825 }
1826
1827 public void CalcBurden()
1828 {
1829 int num = base.ChildrenWeight * 100 / Mathf.Max(1, WeightLimit);
1830 if (num < 0)
1831 {
1832 num = 1000;
1833 }
1835 {
1836 num = 0;
1837 }
1838 burden.Set(num);
1839 SetDirtySpeed();
1840 }
1841
1842 public void Stumble(int mtp = 100)
1843 {
1844 bool flag = EClass._map.FindThing((Thing t) => t.IsInstalled && t.pos.Equals(EClass.pc.pos) && t.trait is TraitStairsUp) != null;
1845 Say(flag ? "dmgBurdenStairs" : "dmgBurdenFallDown", this);
1846 int num = MaxHP;
1847 if (Evalue(1421) > 0)
1848 {
1849 num = mana.max;
1850 }
1851 int num2 = (num * (base.ChildrenWeight * 100 / WeightLimit) / (flag ? 100 : 200) + 1) * mtp / 100;
1852 if (base.hp <= 0)
1853 {
1854 num2 *= 2;
1855 }
1856 DamageHP(num2, flag ? AttackSource.BurdenStairs : AttackSource.BurdenFallDown);
1857 }
1858
1859 public void SetDirtySpeed()
1860 {
1861 dirtySpeed = true;
1862 if (host != null)
1863 {
1865 }
1866 }
1867
1868 public void RefreshSpeed(Element.BonusInfo info = null)
1869 {
1870 if (ride != null && !ride.IsDeadOrSleeping)
1871 {
1873 _Speed = ride._Speed;
1874 info?.AddText("rideSpeed".lang(_Speed.ToString() ?? ""));
1875 }
1876 else if (host != null)
1877 {
1878 if (host.ride == this)
1879 {
1880 _Speed = Evalue(79);
1881 _Speed = _Speed * 100 / Mathf.Clamp(100 + (int)_Speed * ((!race.tag.Contains("noRide")) ? 1 : 5) - base.STR - host.EvalueRiding() * 2 - (race.tag.Contains("ride") ? 50 : 0), 100, 1000);
1882 }
1883 else
1884 {
1885 _Speed = (Evalue(79) + host.Evalue(79)) / 2;
1886 }
1887 }
1888 else
1889 {
1890 _Speed = Evalue(79) + Evalue(407) / 2;
1891 }
1892 if (body.GetSlot(37, onlyEmpty: false)?.thing != null && HasElement(1209) && !HasElement(419))
1893 {
1894 _Speed -= 25L;
1895 info?.AddText(-25L, EClass.sources.elements.map[1209].GetName());
1896 }
1897 if (parasite != null)
1898 {
1899 long speed = _Speed;
1900 _Speed = _Speed * 100 / Mathf.Clamp(120 + parasite.LV * 2 - base.STR - Evalue(227) * 2, 100, 1000);
1901 info?.AddText(_Speed - speed, "parasiteSpeed".lang());
1902 }
1903 if (_Speed < elements.ValueWithoutLink(79) / 3)
1904 {
1906 info?.AddText("minSpeed".lang((elements.ValueWithoutLink(79) / 3).ToString() ?? ""));
1907 }
1908 int num = 100;
1909 if (EClass._zone.map != null && EClass._zone.IsUnderwater)
1910 {
1911 int num2 = Evalue(200);
1912 num = 50 + Mathf.Clamp((int)Mathf.Sqrt(num2) * 5 - EClass._zone.DangerLv / 50, 0, 50) + Mathf.Clamp((int)Mathf.Sqrt(num2), 0, 25);
1913 if (info != null && num != 100)
1914 {
1915 info.AddFix(num - 100, EClass.sources.elements.map[200].GetName().ToTitleCase());
1916 }
1917 }
1918 if (IsPCFaction)
1919 {
1920 switch (burden.GetPhase())
1921 {
1922 case 1:
1923 num -= 10;
1924 info?.AddFix(-10, burden.GetPhaseStr());
1925 break;
1926 case 2:
1927 num -= 20;
1928 info?.AddFix(-20, burden.GetPhaseStr());
1929 break;
1930 case 3:
1931 num -= 30;
1932 info?.AddFix(-30, burden.GetPhaseStr());
1933 break;
1934 case 4:
1935 num -= (IsPC ? 50 : 100);
1936 info?.AddFix(IsPC ? (-50) : (-100), burden.GetPhaseStr());
1937 break;
1938 }
1939 if (IsPC)
1940 {
1941 switch (stamina.GetPhase())
1942 {
1943 case 1:
1944 num -= 10;
1945 info?.AddFix(-10, stamina.GetPhaseStr());
1946 break;
1947 case 0:
1948 num -= 20;
1949 info?.AddFix(-20, stamina.GetPhaseStr());
1950 break;
1951 }
1952 switch (sleepiness.GetPhase())
1953 {
1954 case 2:
1955 num -= 10;
1956 info?.AddFix(-10, sleepiness.GetPhaseStr());
1957 break;
1958 case 3:
1959 num -= 20;
1960 info?.AddFix(-20, sleepiness.GetPhaseStr());
1961 break;
1962 }
1963 switch (hunger.GetPhase())
1964 {
1965 case 3:
1966 case 4:
1967 num -= 10;
1968 info?.AddFix(-10, hunger.GetPhaseStr());
1969 break;
1970 case 5:
1971 num -= 30;
1972 info?.AddFix(-30, hunger.GetPhaseStr());
1973 break;
1974 }
1975 num += EClass.player.lastEmptyAlly * Evalue(1646);
1976 info?.AddFix(EClass.player.lastEmptyAlly * Evalue(1646), EClass.sources.elements.map[1646].GetName());
1977 }
1979 {
1980 num += EClass.player.lastEmptyAlly * 10 - 10;
1981 info?.AddFix(EClass.player.lastEmptyAlly * 10 - 10, "exceedParty".lang());
1982 }
1983 }
1984 else if (base.LV >= 1000 && !EClass.game.principal.disableVoidBlessing && !base.IsPCFactionOrMinion)
1985 {
1986 num += EClass.curve((base.LV - 900) / 100 * 10, 500, 100);
1987 info?.AddFix(EClass.curve((base.LV - 900) / 100 * 10, 500, 100), "enemySpeedBuff".lang());
1988 }
1989 if (HasCondition<ConGravity>())
1990 {
1991 num -= 30;
1992 info?.AddFix(-30, GetCondition<ConGravity>().Name);
1993 }
1994 if (_Speed < 10)
1995 {
1996 _Speed = 10L;
1997 }
1998 _Speed = _Speed * num / 100;
1999 if (_Speed < 10)
2000 {
2001 _Speed = 10L;
2002 info?.AddText("minSpeed".lang(10.ToString() ?? ""));
2003 }
2004 dirtySpeed = false;
2005 }
2006
2008 {
2009 int num = base.END;
2010 int num2 = 0;
2011 foreach (Element value in elements.dict.Values)
2012 {
2013 if (value.source.category == "skill")
2014 {
2015 num = ((!IsPC) ? (num + Mathf.Max(value.ValueWithoutLink, 0)) : (num + Mathf.Max(value.vBase, 0)));
2016 }
2017 }
2018 num2 = EClass.curve(num, 30, 10, 60);
2019 if (num2 < 10)
2020 {
2021 num2 = 10;
2022 }
2023 _maxStamina = num2 + 15;
2024 }
2025
2026 public override void ApplyEditorTags(EditorTag tag)
2027 {
2028 switch (tag)
2029 {
2030 case EditorTag.HostilityNeutral:
2031 {
2032 Hostility hostility2 = (base.c_originalHostility = Hostility.Neutral);
2033 this.hostility = hostility2;
2034 break;
2035 }
2036 case EditorTag.HostilityEnemy:
2037 {
2038 Hostility hostility2 = (base.c_originalHostility = Hostility.Enemy);
2039 this.hostility = hostility2;
2040 break;
2041 }
2042 case EditorTag.HostilityFriend:
2043 {
2044 Hostility hostility2 = (base.c_originalHostility = Hostility.Friend);
2045 this.hostility = hostility2;
2046 break;
2047 }
2048 case EditorTag.Male:
2049 bio.SetGender(2);
2050 base.c_idPortrait = Portrait.GetRandomPortrait(2, GetIdPortraitCat());
2051 break;
2052 case EditorTag.Female:
2053 bio.SetGender(1);
2054 base.c_idPortrait = Portrait.GetRandomPortrait(1, GetIdPortraitCat());
2055 break;
2056 case EditorTag.baby:
2057 SetFeat(1232);
2058 break;
2059 }
2060 base.ApplyEditorTags(tag);
2061 }
2062
2063 public override void SetSource()
2064 {
2065 source = EClass.sources.charas.map.TryGetValue(id);
2066 if (source == null)
2067 {
2068 Debug.LogWarning("Chara " + id + " not found");
2069 id = "chicken";
2070 source = EClass.sources.charas.map[id];
2071 }
2072 path.walker = this;
2073 }
2074
2075 public void SetMainElement(string id, int v = 0, bool elemental = false)
2076 {
2077 if (!id.StartsWith("ele"))
2078 {
2079 id = "ele" + id;
2080 }
2081 SetMainElement(EClass.sources.elements.alias[id].id, v, elemental);
2082 }
2083
2084 public void SetMainElement(int id, int v = 0, bool elemental = false)
2085 {
2086 if (base.c_idMainElement != 0)
2087 {
2088 SetElements(base.c_idMainElement, remove: true);
2089 base.c_idMainElement = 0;
2090 }
2091 if (id != 0)
2092 {
2093 _ = EClass.sources.elements.map[id];
2094 SetElements(id, remove: false);
2095 base.c_idMainElement = id;
2096 if (elemental)
2097 {
2098 base.isElemental = true;
2099 _colorInt = 0;
2100 Color colorSprite = EClass.setting.elements[MainElement.source.alias].colorSprite;
2101 base.c_lightColor = (byte)Mathf.Clamp(colorSprite.r * 3f, 1f, 31f) * 1024 + (byte)Mathf.Clamp(colorSprite.g * 3f, 1f, 31f) * 32 + (byte)Mathf.Clamp(colorSprite.b * 3f, 1f, 31f);
2102 }
2103 _ability = null;
2104 }
2105 void SetElements(int idEle, bool remove)
2106 {
2107 elements.SetBase(idEle, (!remove) ? ((v == 0) ? 10 : v) : 0);
2108 elements.ModBase(EClass.sources.elements.alias[EClass.sources.elements.map[idEle].aliasRef].id, remove ? (-20) : 20);
2109 switch (idEle)
2110 {
2111 case 910:
2112 elements.ModBase(951, remove ? 10 : (-10));
2113 break;
2114 case 911:
2115 elements.ModBase(950, remove ? 10 : (-10));
2116 break;
2117 case 912:
2118 elements.ModBase(953, remove ? 10 : (-10));
2119 break;
2120 case 913:
2121 elements.ModBase(952, remove ? 10 : (-10));
2122 break;
2123 case 916:
2124 elements.ModBase(960, remove ? 10 : (-10));
2125 break;
2126 case 919:
2127 elements.ModBase(956, remove ? 10 : (-10));
2128 break;
2129 case 925:
2130 elements.ModBase(962, remove ? 10 : (-10));
2131 break;
2132 case 922:
2133 elements.ModBase(965, remove ? 10 : (-10));
2134 break;
2135 case 921:
2136 elements.ModBase(971, remove ? 10 : (-10));
2137 break;
2138 case 926:
2139 elements.ModBase(961, remove ? 10 : (-10));
2140 break;
2141 case 914:
2142 case 915:
2143 case 917:
2144 case 918:
2145 case 920:
2146 case 923:
2147 case 924:
2148 break;
2149 }
2150 }
2151 }
2152
2153 public void ApplyJob(bool remove = false)
2154 {
2155 elements.ApplyElementMap(base.uid, SourceValueType.Chara, job.elementMap, base.DefaultLV, remove, applyFeat: true);
2156 if (IsPCC)
2157 {
2158 EClass.game.uniforms.Apply(pccData, job.id, base.IsMale, canUseOtherGender: true);
2159 }
2160 }
2161
2162 public void ChangeJob(string idNew)
2163 {
2164 ApplyJob(remove: true);
2165 base.c_idJob = idNew;
2166 _job = null;
2167 ApplyJob();
2168 if (IsPCC)
2169 {
2170 PCC.Get(pccData).Build();
2171 }
2172 }
2173
2174 private int ParseBodySlot(string s)
2175 {
2176 return s switch
2177 {
2178 "é ­" => 30,
2179 "首" => 31,
2180 "体" => 32,
2181 "背" => 33,
2182 "手" => 35,
2183 "指" => 36,
2184 "è…•" => 34,
2185 "è…°" => 37,
2186 "è¶³" => 39,
2187 _ => -1,
2188 };
2189 }
2190
2191 public void AddRandomBodyPart(bool msg = false)
2192 {
2193 int ele = new int[9] { 30, 31, 33, 35, 35, 36, 34, 37, 39 }.RandomItem();
2194 body.AddBodyPart(ele);
2195 if (msg)
2196 {
2197 Say("gain_bodyparts", this, Element.Get(ele).GetName().ToLower());
2198 PlaySound("offering");
2199 }
2200 }
2201
2202 public void RemoveLastBodyPart(bool msg = false)
2203 {
2204 if (body.slots.Count != 0)
2205 {
2206 BodySlot bodySlot = body.slots.LastItem();
2207 body.RemoveBodyPartAt(body.slots.Count - 1);
2208 if (msg)
2209 {
2210 Say("lose_bodyparts", this, Element.Get(bodySlot.elementId).GetName().ToLower());
2211 PlaySound("offering");
2212 }
2213 }
2214 }
2215
2216 public void ResetBody()
2217 {
2218 for (int num = body.slots.Count - 1; num >= 0; num--)
2219 {
2220 BodySlot bodySlot = body.slots[num];
2221 if (bodySlot.elementId == 45 || bodySlot.elementId == 40)
2222 {
2223 return;
2224 }
2225 body.RemoveBodyPart(num);
2226 }
2227 string[] array = race.figure.Split('|');
2228 foreach (string s in array)
2229 {
2230 int num2 = ParseBodySlot(s);
2231 if (num2 != -1)
2232 {
2233 body.AddBodyPart(num2);
2234 }
2235 }
2237 }
2238
2239 public void ApplyRace(bool remove = false)
2240 {
2241 string[] array = race.figure.Split('|');
2242 foreach (string s in array)
2243 {
2244 int num = ParseBodySlot(s);
2245 if (num != -1)
2246 {
2247 if (remove)
2248 {
2249 body.RemoveBodyPart(num);
2250 }
2251 else
2252 {
2253 body.AddBodyPart(num);
2254 }
2255 }
2256 }
2258 elements.ApplyElementMap(base.uid, SourceValueType.Chara, race.elementMap, base.DefaultLV, remove, applyFeat: true);
2259 }
2260
2261 public void ChangeRace(string idNew)
2262 {
2263 ApplyRace(remove: true);
2264 base.c_idRace = idNew;
2265 _race = null;
2266 ApplyRace();
2267 ChangeMaterial(source.defMat.IsEmpty(race.material));
2268 }
2269
2270 public void MakePartyMemeber()
2271 {
2272 _MakeAlly();
2273 EClass.pc.party.AddMemeber(this);
2274 }
2275
2276 public void MakeAlly(bool msg = true)
2277 {
2278 if (IsLocalChara && !base.IsUnique)
2279 {
2280 Debug.Log("Creating Replacement NPC for:" + this);
2282 }
2283 _MakeAlly();
2284 if (msg)
2285 {
2286 EClass.pc.Say("hire", this);
2287 EClass.Sound.Play("good");
2288 }
2289 EClass.pc.party.AddMemeber(this);
2290 if (EClass._zone.IsTown)
2291 {
2293 }
2294 }
2295
2296 public void _MakeAlly()
2297 {
2298 if (EClass.pc.homeBranch != null)
2299 {
2301 }
2302 else
2303 {
2304 SetGlobal();
2306 }
2307 Hostility hostility2 = (base.c_originalHostility = Hostility.Ally);
2308 this.hostility = hostility2;
2309 orgPos = null;
2310 base.c_summonDuration = 0;
2311 base.isSummon = false;
2312 ReleaseMinion();
2313 SetInt(32);
2314 Refresh();
2315 }
2316
2317 public bool CanBeTempAlly(Chara c)
2318 {
2319 if (IsPCFaction || IsGlobal || IsMinion || IsMultisize || EClass._zone.CountMinions(c) > c.MaxSummon || base.rarity >= Rarity.Legendary)
2320 {
2321 return false;
2322 }
2323 if (HasElement(1222))
2324 {
2325 return false;
2326 }
2327 return true;
2328 }
2329
2330 public void Banish(Chara owner)
2331 {
2332 owner?.Say("summon_vanish", this);
2333 pos.PlayEffect("vanish");
2334 pos.PlaySound("vanish");
2335 pos.PlayEffect("teleport");
2336 Destroy();
2337 }
2338
2339 public void MakeMinion(Chara _master, MinionType type = MinionType.Default)
2340 {
2341 ReleaseMinion();
2342 Hostility hostility2 = (base.c_originalHostility = (_master.IsPCFaction ? Hostility.Ally : _master.hostility));
2343 this.hostility = hostility2;
2344 base.c_uidMaster = _master.uid;
2345 base.c_minionType = type;
2346 master = _master;
2347 Refresh();
2348 }
2349
2350 public bool HasMinion(string id)
2351 {
2352 foreach (Chara chara in EClass._map.charas)
2353 {
2354 if (chara.c_uidMaster == base.uid)
2355 {
2356 return true;
2357 }
2358 }
2359 return false;
2360 }
2361
2362 public void ReleaseMinion()
2363 {
2364 base.c_uidMaster = 0;
2365 master = null;
2366 enemy = null;
2367 foreach (Chara chara in EClass._map.charas)
2368 {
2369 if (chara.enemy == this)
2370 {
2371 chara.SetEnemy();
2372 chara.ai.Cancel();
2373 }
2374 }
2375 ai.Cancel();
2376 Refresh();
2377 }
2378
2379 public void SetSummon(int duration)
2380 {
2381 base.c_summonDuration = duration;
2382 base.isSummon = true;
2383 }
2384
2386 {
2387 if (IsMinion)
2388 {
2389 master = EClass._map.FindChara(base.c_uidMaster);
2390 }
2391 return master;
2392 }
2393
2394 public bool IsEscorted()
2395 {
2396 if (!IsPCPartyMinion)
2397 {
2398 return false;
2399 }
2400 foreach (Quest item in EClass.game.quests.list)
2401 {
2402 if (item is QuestEscort questEscort && questEscort.uidChara == base.uid)
2403 {
2404 return true;
2405 }
2406 }
2407 return false;
2408 }
2409
2410 public bool CanDestroyPath()
2411 {
2412 if (!IsMultisize)
2413 {
2414 if (base.rarity >= Rarity.Superior && !base.IsPCFactionOrMinion && ai is GoalCombat && !EClass._zone.IsPCFaction)
2415 {
2416 return !(EClass._zone is Zone_Town);
2417 }
2418 return false;
2419 }
2420 return true;
2421 }
2422
2423 public bool CanMoveTo(Point p, bool allowDestroyPath = true)
2424 {
2425 if (!p.IsValid)
2426 {
2427 return false;
2428 }
2429 int num = ((p.z >= pos.z) ? ((p.x > pos.x) ? 1 : ((p.z > pos.z) ? 2 : 3)) : 0);
2430 if (allowDestroyPath && CanDestroyPath())
2431 {
2432 if (!p.IsInBounds)
2433 {
2434 return false;
2435 }
2436 }
2437 else
2438 {
2439 if (EClass._map.cells[p.x, p.z].blocked || EClass._map.cells[pos.x, pos.z].weights[num] == 0)
2440 {
2441 return false;
2442 }
2443 if (p.x != pos.x && p.z != pos.z)
2444 {
2445 Cell[,] cells = EClass._map.cells;
2446 int x = p.x;
2447 int z = pos.z;
2448 int num2 = ((z >= pos.z) ? ((x > pos.x) ? 1 : ((z > pos.z) ? 2 : 3)) : 0);
2449 if (cells[pos.x, pos.z].weights[num2] == 0)
2450 {
2451 return false;
2452 }
2453 if (cells[x, z].blocked)
2454 {
2455 return false;
2456 }
2457 num2 = ((z >= p.z) ? ((x > p.x) ? 1 : ((z > p.z) ? 2 : 3)) : 0);
2458 if (cells[p.x, p.z].weights[num2] == 0)
2459 {
2460 return false;
2461 }
2462 x = pos.x;
2463 z = p.z;
2464 num2 = ((z >= pos.z) ? ((x > pos.x) ? 1 : ((z > pos.z) ? 2 : 3)) : 0);
2465 if (cells[pos.x, pos.z].weights[num2] == 0)
2466 {
2467 return false;
2468 }
2469 if (cells[x, z].blocked)
2470 {
2471 return false;
2472 }
2473 num2 = ((z >= p.z) ? ((x > p.x) ? 1 : ((z > p.z) ? 2 : 3)) : 0);
2474 if (cells[p.x, p.z].weights[num2] == 0)
2475 {
2476 return false;
2477 }
2478 }
2479 }
2480 if (IsPC)
2481 {
2482 if (IsEnemyOnPath(p))
2483 {
2484 return false;
2485 }
2486 }
2487 else if (p.HasChara && !IsMultisize && !CanReplace(p.FirstChara))
2488 {
2489 return false;
2490 }
2491 return true;
2492 }
2493
2494 public bool IsEnemyOnPath(Point p, bool cancelAI = true)
2495 {
2496 if (!currentZone.IsRegion && p.IsValid)
2497 {
2498 CellDetail detail = p.detail;
2499 if (detail != null && detail.charas.Count > 0)
2500 {
2501 foreach (Chara chara in p.detail.charas)
2502 {
2503 if (chara.IsHostile(this) || chara.IsHostile() || !chara.trait.CanBePushed)
2504 {
2505 if (cancelAI && EClass.pc.ai is GoalManualMove)
2506 {
2507 EClass.pc.ai.Cancel();
2508 }
2509 return true;
2510 }
2511 }
2512 }
2513 }
2514 return false;
2515 }
2516
2517 public bool CanInteractTo(Card c)
2518 {
2519 return CanInteractTo(c.pos);
2520 }
2521
2522 public bool CanInteractTo(Point p)
2523 {
2524 if (!p.IsValid)
2525 {
2526 return false;
2527 }
2528 if (EClass._map.cells[p.x, p.z].blocked)
2529 {
2530 return true;
2531 }
2532 if (!IsMultisize)
2533 {
2534 int num = ((p.z >= pos.z) ? ((p.x > pos.x) ? 1 : ((p.z > pos.z) ? 2 : 3)) : 0);
2535 if (EClass._map.cells[pos.x, pos.z].weights[num] == 0)
2536 {
2537 return false;
2538 }
2539 if (p.x != pos.x && p.z != pos.z)
2540 {
2541 Cell[,] cells = EClass._map.cells;
2542 int x = p.x;
2543 int z = pos.z;
2544 int num2 = ((z >= pos.z) ? ((x > pos.x) ? 1 : ((z > pos.z) ? 2 : 3)) : 0);
2545 if (cells[pos.x, pos.z].weights[num2] == 0)
2546 {
2547 return false;
2548 }
2549 num2 = ((z >= p.z) ? ((x > p.x) ? 1 : ((z > p.z) ? 2 : 3)) : 0);
2550 if (cells[p.x, p.z].weights[num2] == 0)
2551 {
2552 return false;
2553 }
2554 x = pos.x;
2555 z = p.z;
2556 num2 = ((z >= pos.z) ? ((x > pos.x) ? 1 : ((z > pos.z) ? 2 : 3)) : 0);
2557 if (cells[pos.x, pos.z].weights[num2] == 0)
2558 {
2559 return false;
2560 }
2561 num2 = ((z >= p.z) ? ((x > p.x) ? 1 : ((z > p.z) ? 2 : 3)) : 0);
2562 if (cells[p.x, p.z].weights[num2] == 0)
2563 {
2564 return false;
2565 }
2566 }
2567 }
2568 return true;
2569 }
2570
2571 public Point GetFirstStep(Point newPoint, PathManager.MoveType moveType = PathManager.MoveType.Default)
2572 {
2573 return PathManager.Instance.GetFirstStep(pos, newPoint, this, IsPC ? 40 : 10, (!IsMultisize) ? moveType : PathManager.MoveType.Default);
2574 }
2575
2576 public bool MoveRandom()
2577 {
2578 Point randomNeighbor = pos.GetRandomNeighbor();
2579 if (!randomNeighbor.Equals(pos) && !randomNeighbor.HasChara && HasAccess(randomNeighbor))
2580 {
2581 if ((race.tag.Contains("water") || source.tag.Contains("water")) && pos.cell.IsTopWaterAndNoSnow && !randomNeighbor.IsDeepWater)
2582 {
2583 return false;
2584 }
2585 return TryMove(randomNeighbor) == MoveResult.Success;
2586 }
2587 return false;
2588 }
2589
2591 {
2592 List<Point> list = new List<Point>();
2593 pos.ForeachNeighbor(delegate(Point p)
2594 {
2595 list.Add(p.Copy());
2596 });
2597 list.Shuffle();
2598 foreach (Point item in list)
2599 {
2600 if (!item.Equals(pos) && !item.HasChara && TryMove(item) == MoveResult.Success)
2601 {
2602 return true;
2603 }
2604 }
2605 return false;
2606 }
2607
2608 public void MoveByForce(Point newPoint, Card c = null, bool checkWall = false)
2609 {
2610 if (!newPoint.sourceBlock.tileType.IsBlockPass && (!checkWall || (Dist(newPoint) <= 1 && CanMoveTo(newPoint, allowDestroyPath: false))) && _Move(newPoint, MoveType.Force) == MoveResult.Success && ai.Current.CancelWhenMoved)
2611 {
2612 ai.Current.TryCancel(c);
2613 }
2614 }
2615
2617 {
2618 if (p.Equals(pos))
2619 {
2620 return MoveResult.Success;
2621 }
2623 {
2624 return MoveResult.Fail;
2625 }
2626 bool flag = true;
2627 Point point = null;
2628 _sharedPos.Set(p);
2629 if (CanDestroyPath())
2630 {
2632 {
2633 return MoveResult.Success;
2634 }
2635 Debug.Log(CanMoveTo(pos));
2637 }
2638 int num = pos.Distance(p);
2639 PathProgress pathProgress = PathManager.Instance.RequestPathImmediate(pos, p, this, PathManager.MoveType.Default, num + 4, 1);
2640 if (pathProgress.HasPath && pathProgress.nodes.Count < num + 4)
2641 {
2642 PathFinderNode pathFinderNode = pathProgress.nodes[pathProgress.nodes.Count - 1];
2643 if (TryMove(new Point(pathFinderNode.X, pathFinderNode.Z)) == MoveResult.Success)
2644 {
2645 return MoveResult.Success;
2646 }
2647 }
2648 pathProgress = PathManager.Instance.RequestPathImmediate(pos, p, this, PathManager.MoveType.Combat, num + 4, 1);
2649 if (pathProgress.HasPath && pathProgress.nodes.Count < num + 4)
2650 {
2651 PathFinderNode pathFinderNode2 = pathProgress.nodes[pathProgress.nodes.Count - 1];
2652 if (TryMove(new Point(pathFinderNode2.X, pathFinderNode2.Z)) == MoveResult.Success)
2653 {
2654 return MoveResult.Success;
2655 }
2656 }
2657 pathProgress = PathManager.Instance.RequestPathImmediate(pos, p, this, PathManager.MoveType.Default, num + 25, 2);
2658 if (pathProgress.HasPath && pathProgress.nodes.Count < num + 25)
2659 {
2660 PathFinderNode pathFinderNode3 = pathProgress.nodes[pathProgress.nodes.Count - 1];
2661 if (TryMove(new Point(pathFinderNode3.X, pathFinderNode3.Z)) == MoveResult.Success)
2662 {
2663 return MoveResult.Success;
2664 }
2665 }
2666 pathProgress = PathManager.Instance.RequestPathImmediate(pos, p, this, PathManager.MoveType.Combat, num + 25, 2);
2667 if (pathProgress.HasPath && pathProgress.nodes.Count < num + 25)
2668 {
2669 PathFinderNode pathFinderNode4 = pathProgress.nodes[pathProgress.nodes.Count - 1];
2670 if (TryMove(new Point(pathFinderNode4.X, pathFinderNode4.Z)) == MoveResult.Success)
2671 {
2672 return MoveResult.Success;
2673 }
2674 }
2675 return MoveResult.Fail;
2676 }
2677
2679 {
2681 {
2682 return MoveResult.Fail;
2683 }
2684 Point point = p.Copy();
2685 int num = p.x - pos.x;
2686 int num2 = p.z - pos.z;
2687 if (num > 1)
2688 {
2689 num = 1;
2690 }
2691 else if (num < -1)
2692 {
2693 num = -1;
2694 }
2695 if (num2 > 1)
2696 {
2697 num2 = 1;
2698 }
2699 else if (num2 < -1)
2700 {
2701 num2 = -1;
2702 }
2703 if (num == 0 && num2 == 0)
2704 {
2705 num = EClass.rnd(3) - 1;
2706 num2 = EClass.rnd(3) - 1;
2707 }
2708 point.Set(pos);
2709 point.x -= num;
2710 point.z -= num2;
2711 if (point.IsValid && !point.HasChara)
2712 {
2713 return TryMove(point, allowDestroyPath: false);
2714 }
2715 return MoveResult.Fail;
2716 }
2717
2718 public MoveResult TryMove(Point newPoint, bool allowDestroyPath = true)
2719 {
2720 foreach (Condition condition in conditions)
2721 {
2722 if (!condition.TryMove(newPoint))
2723 {
2724 return MoveResult.Fail;
2725 }
2726 }
2727 if (base.isRestrained)
2728 {
2729 if (!IsPC)
2730 {
2731 return MoveResult.Fail;
2732 }
2733 base.isRestrained = false;
2734 }
2735 if (!CanMoveTo(newPoint, allowDestroyPath))
2736 {
2737 return MoveResult.Fail;
2738 }
2739 return _Move(newPoint);
2740 }
2741
2742 public override MoveResult _Move(Point newPoint, MoveType type = MoveType.Walk)
2743 {
2744 if (isDead)
2745 {
2746 return MoveResult.Fail;
2747 }
2748 if (IsPC)
2749 {
2750 float num = EClass.setting.defaultActPace;
2751 switch (burden.GetPhase())
2752 {
2753 case 3:
2754 num *= 1.5f;
2755 break;
2756 case 4:
2757 num *= 2f;
2758 break;
2759 }
2761 {
2762 int num2 = 30;
2763 if (!EClass.pc.HasElement(408))
2764 {
2766 {
2767 case Weather.Condition.Rain:
2768 num2 += 5;
2769 break;
2770 case Weather.Condition.RainHeavy:
2771 num2 += 10;
2772 num *= 1.5f;
2773 break;
2774 case Weather.Condition.Snow:
2775 num2 += 10;
2776 break;
2777 case Weather.Condition.SnowHeavy:
2778 num2 += 15;
2779 num *= 1.5f;
2780 break;
2781 }
2782 }
2783 if (newPoint.matFloor.id == 48)
2784 {
2785 num2 += 20;
2786 num *= 1.8f;
2787 }
2788 num2 = num2 * 100 / (100 + EClass.sqrt(EvalueMax(240, -20) * 10) + EvalueMax(407, -5) * 5);
2789 EClass.world.date.AdvanceMin(num2 * 6);
2790 EClass.player.lastZonePos = null;
2792 int num3 = base.hp;
2793 for (int i = 0; i < num2 * 4; i++)
2794 {
2795 EClass.pc.party.members.ForeachReverse(delegate(Chara m)
2796 {
2797 if (!m.isDead)
2798 {
2799 m.TickConditions();
2800 }
2801 });
2802 if (base.hp < MaxHP / 5 && base.hp < num3 && !EClass.player.regionMoveWarned)
2803 {
2804 EClass.player.regionMoveWarned = true;
2805 Msg.Say("regionAbortMove");
2806 EInput.Consume(consumeAxis: true);
2807 SetAI(new NoGoal());
2808 return MoveResult.Fail;
2809 }
2810 }
2811 if (newPoint.cell.CanSuffocate())
2812 {
2813 AddCondition<ConSuffocation>((EClass.pc.Evalue(200) != 0) ? (2000 / (100 + EvalueMax(200, -5) * 10)) : 30, force: true);
2814 int num4 = GetCondition<ConSuffocation>()?.GetPhase() ?? 0;
2815 if (num4 >= 2)
2816 {
2817 DamageHP(EClass.rndHalf(10 + MaxHP / 5), AttackSource.Condition);
2818 }
2819 if (!isDead && !HasElement(429))
2820 {
2821 ModExp(200, 1 + num4 * 12);
2822 }
2823 }
2824 EClass.player.regionMoveWarned = false;
2825 if (isDead)
2826 {
2827 return MoveResult.Fail;
2828 }
2829 }
2830 if (num > EClass.setting.defaultActPace * 3f)
2831 {
2832 num = EClass.setting.defaultActPace * 3f;
2833 }
2834 actTime = num;
2835 }
2836 if (IsPCFaction && EClass.rnd(5) == 0 && newPoint.cell.CanSuffocate())
2837 {
2838 int num5 = Mathf.Min(5 + EClass._zone.DangerLv / 10, 200);
2839 ModExp(200, EClass._zone.IsRegion ? 50 : num5);
2840 if (ride != null)
2841 {
2842 ride.ModExp(200, EClass._zone.IsRegion ? 50 : num5);
2843 }
2844 if (parasite != null)
2845 {
2846 parasite.ModExp(200, EClass._zone.IsRegion ? 50 : num5);
2847 }
2848 }
2849 Chara chara = ((ride == null) ? this : ride);
2850 if (!EClass._zone.IsRegion || chara.IsPC)
2851 {
2852 bool flag = (chara.isConfused && EClass.rnd(2) == 0) || (chara.isDrunk && EClass.rnd(IsIdle ? 2 : 8) == 0 && !chara.HasElement(1215));
2853 if (host != null && host.ride == this && ((host.isConfused && EClass.rnd(2) == 0) || (host.isDrunk && EClass.rnd(IsIdle ? 2 : 8) == 0 && !host.HasElement(1215))))
2854 {
2855 flag = true;
2856 }
2857 if (flag && newPoint.Distance(pos) <= 1)
2858 {
2859 Point randomNeighbor = pos.GetRandomNeighbor();
2860 if (CanMoveTo(randomNeighbor, allowDestroyPath: false))
2861 {
2862 newPoint = randomNeighbor;
2863 if (isDrunk)
2864 {
2865 Talk("drunk");
2866 }
2867 }
2868 }
2869 }
2870 if (newPoint.x != pos.x || newPoint.z != pos.z)
2871 {
2872 LookAt(newPoint);
2873 }
2874 CellEffect effect = base.Cell.effect;
2875 if (effect != null && effect.id == 7)
2876 {
2877 CellEffect effect2 = base.Cell.effect;
2878 if (race.height < 500 && !race.tag.Contains("webfree") && EClass.rnd(effect2.power + 25) > EClass.rnd(base.STR + base.DEX + 1))
2879 {
2880 Say("abWeb_caught", this);
2881 PlaySound("web");
2882 effect2.power = effect2.power * 3 / 4;
2883 renderer.PlayAnime(AnimeID.Shiver);
2884 return MoveResult.Fail;
2885 }
2886 Say("abWeb_pass", this);
2887 EClass._map.SetEffect(base.Cell.x, base.Cell.z);
2888 }
2889 if (IsPC)
2890 {
2891 if (EClass._zone.IsRegion)
2892 {
2894 }
2895 else if ((newPoint.x > pos.x && newPoint.z > pos.z) || (newPoint.x < pos.x && newPoint.z < pos.z))
2896 {
2898 }
2899 }
2900 if (newPoint.cell.hasDoor)
2901 {
2902 foreach (Thing thing in pos.Things)
2903 {
2904 if (thing.trait is TraitDoor traitDoor && traitDoor.owner.c_lockLv > 0)
2905 {
2906 if (base.INT < 10)
2907 {
2908 return MoveResult.Fail;
2909 }
2910 traitDoor.TryOpenLock(this);
2911 return MoveResult.Door;
2912 }
2913 }
2914 }
2915 Cell cell = newPoint.cell;
2916 Cell cell2 = pos.cell;
2917 bool flag2 = cell.HasLiquid && !IsLevitating;
2918 bool hasBridge = cell.HasBridge;
2919 bool hasRamp = cell.HasRamp;
2920 bool flag3 = EClass._zone.IsSnowCovered && !cell.HasRoof && !cell.isClearSnow;
2921 TileRow tileRow = (hasRamp ? ((TileRow)cell.sourceBlock) : ((TileRow)(hasBridge ? cell.sourceBridge : cell.sourceFloor)));
2922 SourceMaterial.Row row = (hasRamp ? cell.matBlock : (hasBridge ? cell.matBridge : cell.matFloor));
2923 bool flag4 = cell.IsTopWater && !cell.isFloating;
2924 if (!EClass._zone.IsRegion)
2925 {
2926 if (cell.hasDoorBoat)
2927 {
2928 tileRow = FLOOR.sourceWood;
2929 row = MATERIAL.sourceOak;
2930 flag4 = false;
2931 }
2932 else if (flag3 && !tileRow.ignoreSnow)
2933 {
2934 if (tileRow.tileType.IsWater)
2935 {
2936 tileRow = FLOOR.sourceIce;
2937 row = MATERIAL.sourceIce;
2938 }
2939 else
2940 {
2941 tileRow = FLOOR.sourceSnow;
2942 row = MATERIAL.sourceSnow;
2943 }
2944 flag4 = false;
2945 }
2946 }
2947 if ((pos.sourceFloor.isBeach || cell2.IsSnowTile) && !pos.HasObj)
2948 {
2949 EClass._map.SetFoormark(pos, 1, (int)Util.GetAngle(pos.x - newPoint.x, pos.z - newPoint.z), cell2.IsSnowTile ? 312 : 304);
2950 }
2951 if (isSynced)
2952 {
2953 string text = ((flag2 || flag4) ? "water" : tileRow.soundFoot.IsEmpty(row.soundFoot.IsEmpty("default")));
2954 if (cell.obj != 0 && cell.sourceObj.tileType.IsPlayFootSound && !cell.matObj.soundFoot.IsEmpty())
2955 {
2956 text = cell.matObj.soundFoot;
2957 }
2958 if (IsPC)
2959 {
2960 foreach (Thing thing2 in newPoint.Things)
2961 {
2962 if (thing2.IsInstalled && (thing2.trait.IsChangeFloorHeight || thing2.Pref.Surface))
2963 {
2964 text = thing2.material.soundFoot;
2965 }
2966 }
2967 }
2968 if (!text.IsEmpty())
2969 {
2970 SoundManager.altLastData = IsPC;
2971 PlaySound("Footstep/" + text, IsPC ? 1f : 0.9f);
2972 }
2973 if (!flag4)
2974 {
2976 PCOrbit pcOrbit = EClass.screen.pcOrbit;
2977 bool flag5 = scene.actionMode.gameSpeed > 1f;
2978 scene.psFoot.transform.position = renderer.position + pcOrbit.footPos;
2979 scene.psFoot.startColor = row.matColor;
2980 scene.psFoot.Emit(pcOrbit.emitFoot * ((!flag5) ? 1 : 2));
2981 if (flag5 && IsPC)
2982 {
2983 scene.psSmoke.transform.position = renderer.position + pcOrbit.smokePos;
2984 scene.psSmoke.Emit(pcOrbit.emitSmoke);
2985 }
2986 }
2987 if (flag2 || flag4)
2988 {
2989 Effect.Get("ripple").Play(0.4f * actTime * EClass.scene.actionMode.gameSpeed, newPoint);
2990 }
2991 }
2992 lastPos.Set(pos);
2993 if (type != MoveType.Force)
2994 {
2995 if (newPoint.HasChara && ai.Current.PushChara)
2996 {
2997 TryPush(newPoint);
2998 }
2999 if (newPoint.HasChara && newPoint.Charas.Count == 1)
3000 {
3001 Chara chara2 = newPoint.Charas[0];
3002 if (CanReplace(chara2))
3003 {
3004 chara2.MoveByForce(lastPos, this);
3005 if (chara.IsPC)
3006 {
3007 Say("replace_pc", chara, chara2);
3008 }
3009 }
3010 }
3011 }
3012 if (cell.hasDoor)
3013 {
3014 foreach (Thing thing3 in newPoint.Things)
3015 {
3016 if (thing3.trait is TraitDoor traitDoor2)
3017 {
3018 traitDoor2.TryOpen(this);
3019 }
3020 }
3021 }
3022 EClass._zone.map.MoveCard(newPoint, this);
3023 SyncRide();
3025 {
3026 foreach (Chara member in EClass.pc.party.members)
3027 {
3028 if (member.isLeashed && !member.IsPC && member.host == null && !member.IsDisabled && !member.HasCondition<ConEntangle>() && !member.IsInCombat && member.Dist(EClass.pc) > 1)
3029 {
3030 member.TryMoveTowards(EClass.pc.pos);
3031 }
3032 }
3033 }
3035 {
3037 }
3038 if (IsPC)
3039 {
3040 PlaySound("Footstep/Extra/pcfootstep");
3041 if (pos.HasThing)
3042 {
3043 foreach (Card item in pos.ListCards())
3044 {
3045 if (!item.isThing || item.placeState != 0 || item.ignoreAutoPick)
3046 {
3047 continue;
3048 }
3050 {
3052 ContainerFlag containerFlag = item.category.GetRoot().id.ToEnum<ContainerFlag>();
3053 if (containerFlag == ContainerFlag.none)
3054 {
3055 containerFlag = ContainerFlag.other;
3056 }
3057 if ((dataPick.noRotten && item.IsDecayed) || (dataPick.onlyRottable && item.trait.Decay == 0))
3058 {
3059 continue;
3060 }
3061 if (dataPick.userFilter)
3062 {
3063 switch (dataPick.IsFilterPass(item.GetName(NameStyle.Full, 1)))
3064 {
3065 case Window.SaveData.FilterResult.PassWithoutFurtherTest:
3066 Pick(item.Thing);
3067 continue;
3068 case Window.SaveData.FilterResult.Block:
3069 continue;
3070 }
3071 }
3072 if (dataPick.advDistribution)
3073 {
3074 foreach (int cat in dataPick.cats)
3075 {
3076 if (item.category.uid == cat)
3077 {
3078 Pick(item.Thing);
3079 }
3080 }
3081 }
3082 else if (!dataPick.flag.HasFlag(containerFlag))
3083 {
3084 Pick(item.Thing);
3085 }
3086 }
3087 else
3088 {
3089 Pick(item.Thing);
3090 }
3091 }
3092 }
3093 if (EClass._zone.IsRegion)
3094 {
3096 if (cell3?.zone != null && !cell3.zone.HiddenInRegionMap && (!(cell3.zone is Zone_Field) || cell3.zone.children.Count > 0 || cell3.zone.IsPCFaction))
3097 {
3098 Msg.Say((!cell3.zone.source.GetText("textFlavor").IsEmpty()) ? cell3.zone.source.GetText("textFlavor") : (cell3.zone.ShowDangerLv ? "seeZoneDanger" : "seeZone"), cell3.zone.Name, cell3.zone.DangerLv.ToString() ?? "");
3099 }
3100 if (pos.matFloor.alias == "snow" && EClass.rnd(3) == 0)
3101 {
3103 Msg.Say(Lang.GetList("walk_snow").RandomItem());
3104 }
3105 else if (EClass.world.weather.CurrentCondition == Weather.Condition.RainHeavy && EClass.rnd(3) == 0)
3106 {
3108 Msg.Say(Lang.GetList("walk_storm").RandomItem());
3109 }
3110 }
3112 }
3113 if (IsPCC)
3114 {
3115 int num6 = Mathf.Abs(cell2.topHeight - cell.topHeight);
3116 if ((num6 >= 3 && lastPos.sourceBlock.tileType.slopeHeight == 0 && newPoint.sourceBlock.tileType.slopeHeight == 0) || cell2.hasDoorBoat || cell.hasDoorBoat)
3117 {
3118 renderer.PlayAnime((cell2.topHeight >= cell.topHeight) ? AnimeID.JumpDown : ((num6 >= 6) ? AnimeID.Jump : AnimeID.JumpSmall));
3119 }
3120 else
3121 {
3122 float surfaceHeight = cell2.GetSurfaceHeight();
3123 float surfaceHeight2 = cell.GetSurfaceHeight();
3124 num6 = (int)Mathf.Abs((surfaceHeight - surfaceHeight2) * 100f);
3125 if (num6 >= 15)
3126 {
3127 renderer.PlayAnime((surfaceHeight >= surfaceHeight2) ? AnimeID.JumpDown : ((num6 >= 40) ? AnimeID.Jump : AnimeID.JumpSmall));
3128 }
3129 }
3130 }
3131 lastPos.Things.ForeachReverse(delegate(Thing t)
3132 {
3133 t.trait.OnSteppedOut(this);
3134 });
3135 if (!IsPC)
3136 {
3137 pos.Things.ForeachReverse(delegate(Thing t)
3138 {
3139 t.trait.OnStepped(this);
3140 });
3141 }
3142 if (CanDestroyPath())
3143 {
3145 }
3146 if (IsPC)
3147 {
3148 if (renderer.anime == null && renderer.replacer != null)
3149 {
3151 }
3153 {
3154 if (!FLOOR.IsTatami(pos.cell.sourceSurface.id) && pos.cell.room == null)
3155 {
3156 EClass.player.flags.isShoesOff = false;
3157 EClass.pc.Say("shoes_on", EClass.pc);
3158 EClass.pc.SetPCCState(PCCState.Normal);
3159 }
3160 }
3161 else if (FLOOR.IsTatami(pos.cell.sourceSurface.id) && pos.cell.room != null)
3162 {
3163 EClass.player.flags.isShoesOff = true;
3164 EClass.pc.Say("shoes_off", EClass.pc);
3165 EClass.pc.SetPCCState(PCCState.ShoesOff);
3166 }
3167 }
3168 hasMovedThisTurn = true;
3169 return MoveResult.Success;
3170 }
3171
3172 public void DestroyPath(Point pos)
3173 {
3174 bool broke = false;
3175 pos.ForeachMultiSize(base.W, base.H, delegate(Point _p, bool main)
3176 {
3177 if (_p.IsValid)
3178 {
3179 if (_p.HasBlock)
3180 {
3181 EClass._map.MineBlock(_p, recoverBlock: false, this);
3182 if (_p.HasObj)
3183 {
3184 EClass._map.MineObj(_p, null, this);
3185 }
3186 broke = true;
3187 }
3188 if (_p.HasObj && _p.IsBlocked)
3189 {
3190 EClass._map.MineObj(_p, null, this);
3191 broke = true;
3192 }
3193 _p.Things.ForeachReverse(delegate(Thing t)
3194 {
3195 if (t.IsInstalled && (t.trait.IsBlockPath || t.trait.IsDoor))
3196 {
3197 if (t.isNPCProperty && t.trait.CanBeDestroyed)
3198 {
3199 t.Destroy();
3200 }
3201 else if (!t.IsUnique && !t.trait.CanBeDestroyed)
3202 {
3203 t.SetPlaceState(PlaceState.roaming);
3204 }
3205 }
3206 });
3207 }
3208 });
3209 if (broke)
3210 {
3211 Msg.Say("stomp");
3212 Shaker.ShakeCam("stomp");
3213 }
3214 }
3215
3216 public void TryPush(Point point)
3217 {
3218 List<Chara> list = point.ListCharas();
3219 if (list.Count == 0)
3220 {
3221 return;
3222 }
3223 list.Copy().ForeachReverse(delegate(Chara c)
3224 {
3225 if (!c.ai.IsMoveAI && !c.IsPC && c.trait.CanBePushed && c != this && !c.noMove && (!EClass._zone.IsRegion || c.IsPCFactionOrMinion))
3226 {
3227 List<Point> list2 = new List<Point>();
3228 for (int i = point.x - 1; i <= point.x + 1; i++)
3229 {
3230 for (int j = point.z - 1; j <= point.z + 1; j++)
3231 {
3232 if (i != point.x || j != point.z)
3233 {
3234 Point point2 = new Point(i, j);
3235 if (point2.IsValid && !point2.HasChara && !point2.IsBlocked && !point2.cell.hasDoor && !point2.IsBlockByHeight(point))
3236 {
3237 list2.Add(point2);
3238 }
3239 }
3240 }
3241 }
3242 if (list2.Count > 0)
3243 {
3244 if (list2.Count > 1)
3245 {
3246 list2.ForeachReverse(delegate(Point p)
3247 {
3248 if (p.Equals(new Point(point.x + point.x - pos.x, point.z + point.z - pos.z)))
3249 {
3250 list2.Remove(p);
3251 }
3252 });
3253 }
3254 Point newPoint = list2.RandomItem();
3255 if (IsPC)
3256 {
3257 Say("displace", this, c);
3258 PlaySound("push");
3259 }
3260 else if (c.isSynced)
3261 {
3262 c.PlayEffect("push");
3263 }
3264 c.MoveByForce(newPoint, this, checkWall: true);
3265 if (!c.IsPC && c.trait is TraitRogue && EClass.rnd(3) == 0 && GetCurrency() > 20 && !HasElement(426))
3266 {
3267 int num = EClass.rndHalf(10 + Mathf.Min(GetCurrency() / 100, 1000));
3268 c.Talk("pushed");
3269 Say("pushed_money", this, c);
3270 ModCurrency(-num);
3271 c.ModCurrency(num);
3272 c.PlaySound("steal_money");
3273 }
3274 else if (IsPC && !c.IsPCParty && !c.IsUnique && c.IsHumanSpeak && EClass.rnd(5) == 0)
3275 {
3276 c.Talk("pushed");
3277 }
3278 }
3279 }
3280 });
3281 }
3282
3283 public bool CanReplace(Chara c)
3284 {
3285 if (c.IsMultisize || !c.trait.CanBePushed || c.isRestrained || c.noMove || IsHostile(c) || IsMinion || (EClass._zone.IsRegion && !c.IsPCFactionOrMinion))
3286 {
3287 return false;
3288 }
3289 if (IsPC)
3290 {
3291 return true;
3292 }
3293 if (c.IsPC || c.pos.Equals(EClass.pc.pos) || c.host != null)
3294 {
3295 return false;
3296 }
3297 if (!IsHostile(c))
3298 {
3299 if (c.c_uidMaster != 0 || c.isSummon || base.IsPowerful || IsEscorted())
3300 {
3301 return true;
3302 }
3303 if (DestDist < c.DestDist)
3304 {
3305 return true;
3306 }
3307 if (IsPCParty && !c.IsPCParty)
3308 {
3309 return true;
3310 }
3311 if (IsPCFaction && !c.IsPCParty)
3312 {
3313 return true;
3314 }
3315 }
3316 return false;
3317 }
3318
3319 public void MoveZone(string alias)
3320 {
3321 MoveZone(EClass.game.spatials.Find(alias));
3322 }
3323
3325 {
3326 MoveZone(z, new ZoneTransition
3327 {
3328 state = state
3329 });
3330 }
3331
3332 public void MoveZone(Zone z, ZoneTransition transition)
3333 {
3334 if (z == currentZone)
3335 {
3336 return;
3337 }
3338 if (HasCondition<ConInvulnerable>())
3339 {
3340 RemoveCondition<ConInvulnerable>();
3341 }
3342 if (IsPC)
3343 {
3344 EClass.player.nextZone = z;
3345 if (IsInActiveZone && !EClass.player.simulatingZone)
3346 {
3347 TryDropCarryOnly();
3348 if (z.instance == null && currentZone.instance == null && !EClass.player.deathZoneMove && !EClass.pc.isDead && (z.IsPCFaction || z.WillAutoSave) && z.GetTopZone() != EClass._zone.GetTopZone())
3349 {
3350 if (EClass.player.returnInfo != null)
3351 {
3352 EClass.player.returnInfo.turns += 5;
3353 }
3355 {
3356 EClass.game.Save(isAutoSave: true);
3357 }
3358 }
3359 EClass.player.deathZoneMove = false;
3360 }
3361 currentZone.events.OnLeaveZone();
3362 if (currentZone.instance != null)
3363 {
3364 ZoneInstance instance = currentZone.instance;
3365 z = EClass.game.spatials.Find(instance.uidZone) ?? EClass.pc.homeZone;
3366 transition = new ZoneTransition
3367 {
3368 state = instance.ReturnState,
3369 x = instance.x,
3370 z = instance.z
3371 };
3372 instance.OnLeaveZone();
3373 Debug.Log(z);
3374 }
3375 EInput.Consume(consumeAxis: true);
3376 EClass.player.uidLastZone = currentZone.uid;
3378 {
3379 if (currentZone.IsRegion)
3380 {
3381 Msg.Say("enterZone", z.Name);
3382 }
3383 else
3384 {
3385 if (z.IsRegion)
3386 {
3387 Msg.Say("leaveZone", currentZone.Name);
3388 }
3389 else if (z.id != currentZone.id)
3390 {
3391 Msg.Say("enterZone", z.Name);
3392 }
3393 EClass.player.lastZonePos = pos.Copy();
3394 }
3395 EClass.player.lastTransition = transition;
3396 }
3397 foreach (Chara item in EClass._map.charas.Where((Chara c) => c.IsPCPartyMinion && c.master != EClass.pc).ToList())
3398 {
3400 }
3401 EClass.player.listSummon = EClass._map.charas.Where((Chara c) => c.c_uidMaster != 0 && c.FindMaster() == EClass.pc && c.c_minionType == MinionType.Default).ToList();
3402 foreach (Chara item2 in EClass.player.listSummon)
3403 {
3404 EClass._zone.RemoveCard(item2);
3405 }
3406 }
3407 if (party != null && party.leader == this)
3408 {
3409 foreach (Chara member in party.members)
3410 {
3411 if (member != this && !member.isDead && member.parent is Zone)
3412 {
3413 member.MoveZone(z);
3414 }
3415 }
3416 }
3417 if (global == null)
3418 {
3419 Debug.Log(base.Name);
3420 return;
3421 }
3422 transition.uidLastZone = currentZone?.uid ?? 0;
3423 global.transition = transition;
3424 if (z.IsActiveZone)
3425 {
3426 Point spawnPos = z.GetSpawnPos(this);
3427 global.transition = null;
3428 if (IsPC)
3429 {
3430 EClass.player.lastTransition = null;
3431 }
3432 z.AddCard(this, spawnPos);
3433 if (IsBranchMember())
3434 {
3436 }
3437 }
3438 else
3439 {
3440 z.AddCard(this);
3441 }
3442 }
3443
3444 public void MoveHome(string id, int x = -1, int z = -1)
3445 {
3446 MoveHome(EClass.game.world.FindZone(id), x, z);
3447 }
3448
3449 public void MoveHome(Zone zone, int x = -1, int z = -1)
3450 {
3451 if (isDead)
3452 {
3453 Revive();
3454 }
3455 else
3456 {
3457 Cure(CureType.Death);
3458 }
3459 CureCondition<ConSuspend>();
3460 if (IsPCParty)
3461 {
3463 }
3464 FactionBranch factionBranch = homeBranch;
3465 if (x == -1)
3466 {
3467 x = 50;
3468 }
3469 if (z == -1)
3470 {
3471 z = 50;
3472 }
3473 Point point = new Point(x, z);
3474 if (zone.IsActiveZone)
3475 {
3476 point = point.GetNearestPoint(allowBlock: false, allowChara: false);
3477 }
3478 zone.AddCard(this, point);
3479 SetHomeZone(zone);
3480 global.transition = new ZoneTransition
3481 {
3482 state = ZoneTransition.EnterState.Dead,
3483 x = point.x,
3484 z = point.z
3485 };
3486 orgPos = new Point(x, z);
3487 if (factionBranch != null)
3488 {
3489 RefreshWorkElements();
3490 factionBranch.policies.Validate();
3491 }
3492 }
3493
3494 public void FallFromZone()
3495 {
3496 Msg.Say("skyFall", EClass.pc, EClass._zone.Name);
3497 Zone zone = (EClass._zone.isExternalZone ? null : EClass._zone.GetTopZone().FindZone(EClass._zone.lv - 1));
3498 zone = zone ?? EClass.world.region;
3499 MoveZone(zone ?? EClass.world.region, new ZoneTransition
3500 {
3501 state = ZoneTransition.EnterState.Fall,
3502 x = pos.x,
3503 z = pos.z
3504 });
3505 }
3506
3507 public override void SetDir(int d)
3508 {
3509 base.dir = d;
3510 UpdateAngle();
3511 renderer.RefreshSprite();
3512 }
3513
3514 public override void Rotate(bool reverse = false)
3515 {
3516 if (renderer.hasActor)
3517 {
3518 base.dir = (base.dir + ((!reverse) ? 1 : (-1))).Clamp(0, 3, loop: true);
3519 }
3520 else
3521 {
3522 base.dir = ((base.dir == 0) ? 1 : 0);
3523 }
3524 UpdateAngle();
3525 renderer.RefreshSprite();
3526 }
3527
3528 public override void LookAt(Card c)
3529 {
3530 LookAt(c.pos);
3531 }
3532
3533 public override void LookAt(Point p)
3534 {
3535 angle = Util.GetAngle(p.x - pos.x, p.z - pos.z);
3536 if (EClass._zone.IsRegion)
3537 {
3538 if (angle > 100f && angle < 170f)
3539 {
3540 base.dir = 2;
3541 }
3542 else if (angle > 170f && angle < 190f)
3543 {
3544 base.dir = 0;
3545 }
3546 else if (angle > 190f || (angle < -10f && angle > -100f))
3547 {
3548 base.dir = 3;
3549 }
3550 else
3551 {
3552 base.dir = 1;
3553 }
3554 angle -= 45f;
3555 }
3556 else if (angle > 170f && angle < 235f)
3557 {
3558 base.dir = 0;
3559 }
3560 else if (angle > 80f && angle < 145f)
3561 {
3562 base.dir = 1;
3563 }
3564 else if (angle > -100f && angle < -35f)
3565 {
3566 base.dir = 3;
3567 }
3568 else if (angle > -10f && angle < 55f)
3569 {
3570 base.dir = 2;
3571 }
3572 renderer.RefreshSprite();
3573 }
3574
3575 public void UpdateAngle()
3576 {
3577 if (IsPCC)
3578 {
3579 if (base.dir == 0)
3580 {
3581 angle = 225f;
3582 }
3583 else if (base.dir == 1)
3584 {
3585 angle = 135f;
3586 }
3587 else if (base.dir == 2)
3588 {
3589 angle = 45f;
3590 }
3591 else if (base.dir == 3)
3592 {
3593 angle = -45f;
3594 }
3595 }
3596 else if (base.dir == 0)
3597 {
3598 angle = 165f;
3599 }
3600 else if (base.dir == 1)
3601 {
3602 angle = 300f;
3603 }
3604 else if (base.dir == 2)
3605 {
3606 angle = 0f;
3607 }
3608 else if (base.dir == 3)
3609 {
3610 angle = 120f;
3611 }
3612 }
3613
3614 public int GetCurrentDir()
3615 {
3616 Debug.Log(angle);
3617 if (!renderer.hasActor)
3618 {
3619 if (angle == 0f || angle == 45f || angle == 90f)
3620 {
3621 return 2;
3622 }
3623 if (angle == -135f || angle == 180f || angle == -90f)
3624 {
3625 return 1;
3626 }
3627 if (angle == 135f)
3628 {
3629 return 0;
3630 }
3631 return 3;
3632 }
3633 return renderer.actor.currentDir;
3634 }
3635
3636 public void UpdateSight()
3637 {
3638 int num = 4;
3639 for (int i = -num; i < num + 1; i++)
3640 {
3641 for (int j = -num; j < num + 1; j++)
3642 {
3643 shared.Set(pos.x + i, pos.z + j);
3644 if (shared.IsValid && !shared.cell.isSeen && i >= -1 && i <= 1 && j >= -1)
3645 {
3646 _ = 1;
3647 }
3648 }
3649 }
3650 }
3651
3652 public bool WillConsumeTurn()
3653 {
3654 for (int num = conditions.Count - 1; num >= 0; num--)
3655 {
3656 if (conditions[num].ConsumeTurn)
3657 {
3658 return true;
3659 }
3660 }
3661 return false;
3662 }
3663
3664 public void TickConditions()
3665 {
3666 if (_cooldowns != null)
3667 {
3668 TickCooldown();
3669 }
3670 turn++;
3671 consumeTurn = false;
3672 preventRegen = false;
3673 emoIcon = Emo2.none;
3674 if (base.isSummon)
3675 {
3676 base.c_summonDuration--;
3677 if (base.c_summonDuration <= 0)
3678 {
3679 Die();
3680 return;
3681 }
3682 }
3683 if (EClass.world.weather.IsRaining && !EClass._map.IsIndoor && !pos.cell.HasRoof)
3684 {
3685 AddCondition<ConWet>(20);
3686 }
3687 switch (turn % 50)
3688 {
3689 case 0:
3690 happiness = (hunger.value + stamina.value + depression.value + bladder.value + hygiene.value) / 5;
3691 break;
3692 case 1:
3693 if (!IsPC || !EClass.debug.godMode)
3694 {
3695 if (EClass.rnd(2) == 0 && !HasCondition<ConAwakening>())
3696 {
3697 sleepiness.Mod(1);
3698 }
3699 if (EClass.rnd(3) == 0)
3700 {
3701 hunger.Mod(1);
3702 }
3703 if (IsPC && (sleepiness.GetPhase() != 0 || stamina.GetPhase() <= 1))
3704 {
3705 Tutorial.Play("sleep");
3706 }
3707 }
3708 break;
3709 case 2:
3710 if (parasite != null)
3711 {
3712 ModExp(227, (EClass._zone.IsRegion ? 5 : 40) * 100 / Mathf.Max(100, 100 + (elements.Base(227) - parasite.LV) * 25));
3713 }
3714 if (ride != null)
3715 {
3716 ModExp(226, (EClass._zone.IsRegion ? 5 : 40) * 100 / Mathf.Max(100, 100 + (elements.Base(226) - ride.LV) * 25));
3717 }
3718 break;
3719 case 3:
3720 {
3721 int phase = hygiene.GetPhase();
3722 int num = 0;
3723 num = ((!IsPC) ? ((phase > 3) ? 50 : 0) : ((phase > 3) ? 50 : 0));
3724 if (num > EClass.rnd(100))
3725 {
3726 hygiene.Mod(-1);
3727 }
3728 break;
3729 }
3730 case 5:
3731 case 30:
3732 if (isWeakToSunlight && pos.IsSunLit)
3733 {
3734 AddCondition<ConBurning>(1000, force: true);
3735 }
3736 break;
3737 case 10:
3738 if (!HasElement(1250))
3739 {
3740 break;
3741 }
3742 if (!HasCondition<ConVampire>())
3743 {
3744 AddCondition<ConVampire>();
3745 }
3746 if (!IsPC && !HasCooldown(8793))
3747 {
3748 bool flag = false;
3749 flag = ((!HasCondition<ConTransmuteBat>()) ? (!HasElement(431) && pos.IsSunLit) : (body.HasElement(431) || (EClass.world.date.IsNight && !pos.IsSunLit)));
3750 if (flag && base.IsPCFactionOrMinion && !EClass._zone.IsPCFactionOrTent && EClass._zone.HasLaw && pos.ListWitnesses(this).Count > 0 && !HasCondition<ConBurning>())
3751 {
3752 flag = false;
3753 }
3754 if (flag)
3755 {
3756 UseAbility("SpTransmuteBat", this);
3757 }
3758 }
3759 break;
3760 }
3761 if (turn % 200 == 0)
3762 {
3763 DiminishTempElements();
3764 }
3765 if (IsPCParty)
3766 {
3767 if (dirtyWeight)
3768 {
3769 CalcBurden();
3770 }
3771 int phase2 = burden.GetPhase();
3772 int phase3 = hunger.GetPhase();
3773 if (phase3 >= 4)
3774 {
3775 preventRegen = true;
3776 }
3777 if (EClass.rnd(EClass._zone.IsRegion ? 100 : 30) == 0 && phase2 >= 3)
3778 {
3779 Say("dmgBurden", this);
3780 DamageHP(MaxHP * (base.ChildrenWeight * 100 / WeightLimit) / 1000 + 1, AttackSource.Burden);
3781 if (isDead)
3782 {
3783 return;
3784 }
3785 }
3786 if (EClass.rnd(12) == 0)
3787 {
3788 if (IsPC)
3789 {
3790 if (phase2 > 0)
3791 {
3792 ModExp(207, 1 + phase2 * phase2);
3793 }
3794 }
3795 else
3796 {
3797 ModExp(207, 4);
3798 }
3799 }
3800 if (IsPC)
3801 {
3802 if (phase3 >= 5)
3803 {
3804 if (!(ai is AI_Eat) && EClass.rnd(5) == 0)
3805 {
3806 DamageHP(1 + EClass.rnd(2) + MaxHP / 50, AttackSource.Hunger);
3807 }
3808 if (!isDead && EClass.rnd(3) == 0)
3809 {
3810 stamina.Mod(-1);
3811 }
3812 }
3813 if (isDead)
3814 {
3815 return;
3816 }
3817 phase3 = stamina.GetPhase();
3818 if (phase3 <= 0)
3819 {
3820 preventRegen = true;
3821 }
3822 if (currentZone.IsRegion && EClass.world.weather.CurrentCondition == Weather.Condition.RainHeavy && !EClass.pc.HasElement(408))
3823 {
3824 if (EClass.rnd(100) == 0 && !isConfused)
3825 {
3826 Msg.Say("rain_confuse");
3827 AddCondition<ConConfuse>(500);
3828 }
3829 if (EClass.rnd(300) == 0 && !isBlind)
3830 {
3831 Msg.Say("rain_confuse");
3832 AddCondition<ConBlind>(200);
3833 }
3834 }
3835 if (turn % (200000 / Mathf.Max(100 + Evalue(409) * 10, 50)) == 0)
3836 {
3837 ModCorruption(1);
3838 }
3839 }
3840 }
3841 if (!IsPC)
3842 {
3843 int num2 = Evalue(409);
3844 if (num2 > 0 && turn % (200000 / Mathf.Max(100 + num2 * 10, 50)) == 0)
3845 {
3846 ModCorruption(1);
3847 }
3848 }
3849 for (int num3 = conditions.Count - 1; num3 >= 0; num3--)
3850 {
3851 if (num3 < conditions.Count)
3852 {
3853 Condition condition = conditions[num3];
3854 if (!condition.TimeBased)
3855 {
3856 condition.Tick();
3857 }
3858 if (!condition.IsKilled)
3859 {
3860 if (condition.ConsumeTurn)
3861 {
3862 consumeTurn = true;
3863 }
3864 if (condition.PreventRegen)
3865 {
3866 preventRegen = true;
3867 }
3868 if (condition.EmoIcon != 0 && condition.EmoIcon > emoIcon)
3869 {
3870 emoIcon = condition.EmoIcon;
3871 }
3872 }
3873 if (isDead)
3874 {
3875 return;
3876 }
3877 }
3878 }
3879 string text = id;
3880 if (!(text == "cocoon"))
3881 {
3882 if (text == "tsunami")
3883 {
3884 if (elements.Base(79) < 30)
3885 {
3886 Die();
3887 return;
3888 }
3889 if (IsInCombat)
3890 {
3891 elements.SetTo(79, elements.Base(79) * 3 / 4);
3892 }
3893 }
3894 }
3895 else
3896 {
3897 if (!EClass._zone.IsRegion && !IsDisabled && 1.0001f - (float)base.hp / (float)MaxHP > EClass.rndf(1f) && !pos.IsSunLit)
3898 {
3899 HatchEgg();
3900 return;
3901 }
3902 consumeTurn = true;
3903 }
3904 if (!preventRegen)
3905 {
3906 if (EClass.rnd(25) == 0 && base.hp < MaxHP)
3907 {
3908 HealHP(EClass.rnd(Evalue(300) / 3 + 1) + 1);
3909 elements.ModExp(300, 8f);
3910 }
3911 if (EClass.rnd(8) == 0 && mana.value < mana.max)
3912 {
3913 mana.Mod(EClass.rnd(Evalue(301) / 2 + 1) + 1);
3914 elements.ModExp(301, 8f);
3915 }
3916 if (EClass.rnd(20) == 0 && !IsPC && stamina.value < stamina.max)
3917 {
3918 stamina.Mod(EClass.rnd(5) + 1);
3919 }
3920 }
3921 }
3922
3923 public void SyncRide()
3924 {
3925 if (host != null)
3926 {
3927 host.SyncRide();
3928 }
3929 if (ride != null)
3930 {
3931 SyncRide(ride);
3932 }
3933 if (parasite != null)
3934 {
3935 SyncRide(parasite);
3936 }
3937 }
3938
3939 public void SyncRide(Chara c)
3940 {
3941 if (!c.pos.Equals(pos))
3942 {
3943 if (!pos.IsValid)
3944 {
3945 Debug.LogError("exception: pos is not valid:" + pos?.ToString() + "/" + this);
3946 pos = new Point();
3947 }
3948 EClass._map.MoveCard(pos, c);
3949 }
3950 }
3951
3952 public override void Tick()
3953 {
3954 SyncRide();
3955 combatCount--;
3956 ignoreSPAbsorb = false;
3957 if (IsPC)
3958 {
3959 if (hasMovedThisTurn)
3960 {
3961 pos.Things.ForeachReverse(delegate(Thing t)
3962 {
3964 {
3965 AI_Goto aI_Goto = ai.Current as AI_Goto;
3966 if ((aI_Goto == null && !(ai is GoalManualMove)) || (aI_Goto != null && !aI_Goto.dest.Equals(pos)))
3967 {
3968 return;
3969 }
3970 }
3971 t.trait.OnStepped(this);
3972 });
3973 if (isDead)
3974 {
3975 return;
3976 }
3977 hasMovedThisTurn = false;
3979 {
3980 EClass.player.haltMove = false;
3981 ActionMode.Adv.TryCancelInteraction(sound: false);
3982 EInput.Consume(1);
3983 return;
3984 }
3985 if (EClass._zone.IsRegion)
3986 {
3988 {
3989 foreach (Chara member in EClass.pc.party.members)
3990 {
3991 if (member.hunger.value > 65)
3992 {
3993 member.InstantEat(null, sound: false);
3994 }
3995 }
3996 }
3997 Chara chara = null;
3999 if (cell2 != null && (cell2.zone == null || (cell2.zone is Zone_Field && !cell2.zone.IsPCFaction)))
4000 {
4001 foreach (Chara chara2 in EClass._map.charas)
4002 {
4003 if (!chara2.IsPCFactionOrMinion && !chara2.IsGlobal && chara2.pos.Equals(EClass.pc.pos))
4004 {
4005 chara = chara2;
4006 break;
4007 }
4008 }
4009 }
4010 if (chara != null)
4011 {
4013 {
4014 EClass.player.safeTravel = 5 + EClass.rnd(5);
4015 }
4016 EClass._zone.RemoveCard(chara);
4017 Msg.Say("encounter");
4018 EClass.player.EnterLocalZone(encounter: true, chara);
4019 }
4020 else if (EClass.player.safeTravel <= 0)
4021 {
4022 if (cell2 != null && cell2.zone == null && !EClass.debug.ignoreEncounter)
4023 {
4025 if (!tileInfo.shore)
4026 {
4027 bool num = EClass.pc.HasCondition<ConWardMonster>();
4028 bool flag = EClass.pc.HasCondition<ConDrawMonster>();
4029 bool flag2 = EClass.game.quests.Get<QuestEscort>() != null;
4030 int num2 = (tileInfo.isRoad ? 22 : 12);
4031 if (flag2)
4032 {
4033 num2 = (tileInfo.isRoad ? 16 : 10);
4034 }
4035 if (num)
4036 {
4037 num2 *= (flag2 ? 2 : 20);
4038 }
4039 if (flag)
4040 {
4041 num2 /= 2;
4042 }
4043 if (EClass.rnd(num2) == 0)
4044 {
4045 Msg.Say("encounter");
4046 if (!flag)
4047 {
4048 EClass.player.safeTravel = 5 + EClass.rnd(5);
4049 }
4050 EClass.player.EnterLocalZone(encounter: true);
4051 }
4052 }
4053 }
4054 }
4055 else
4056 {
4058 }
4059 }
4060 }
4061 EClass.player.pickupDelay = 0f;
4062 if (EClass.player.returnInfo != null)
4063 {
4065 if (EClass.player.returnInfo.turns <= 0)
4066 {
4068 {
4069 EClass.player.returnInfo = null;
4071 }
4072 else
4073 {
4075 {
4076 int uidDest = EClass.player.returnInfo.uidDest;
4077 Zone zone = null;
4078 if (uidDest != 0)
4079 {
4080 zone = EClass.game.spatials.map.TryGetValue(uidDest) as Zone;
4081 }
4082 if (zone == null || zone.destryoed)
4083 {
4084 zone = EClass.world.region;
4085 }
4087 {
4088 Msg.Say("returnFail");
4089 }
4090 else
4091 {
4092 Msg.Say("returnComplete");
4093 EClass.player.uidLastTravelZone = 0;
4095 EClass.player.lastZonePos = null;
4096 }
4097 EClass.player.returnInfo = null;
4098 return;
4099 }
4100 EClass.player.returnInfo = null;
4101 Msg.Say("returnOverweight");
4102 }
4103 }
4104 }
4105 if ((HasNoGoal || !ai.IsRunning) && !WillConsumeTurn())
4106 {
4107 SetAI(_NoGoalPC);
4108 return;
4109 }
4112 {
4113 RecipeUpdater.dirty = true;
4114 }
4115 actTime = EClass.player.baseActTime;
4116 }
4117 else
4118 {
4119 actTime = EClass.player.baseActTime * Mathf.Max(0.1f, (float)EClass.pc.Speed / (float)Speed);
4120 hasMovedThisTurn = false;
4121 }
4122 TickConditions();
4123 if (!IsAliveInCurrentZone)
4124 {
4125 return;
4126 }
4127 renderer.RefreshStateIcon();
4128 if (host != null && !consumeTurn)
4129 {
4130 if (host.ride == this && ((host.hasMovedThisTurn && IsInCombat) || (enemy != null && turn % 3 != 0)))
4131 {
4132 consumeTurn = true;
4133 }
4134 if (host.parasite == this && enemy != null && EClass.rnd(10) > EClass.rnd(host.Evalue(227) + 10))
4135 {
4136 if (Dist(enemy) < 3 && EClass.rnd(2) == 0)
4137 {
4138 Say("parasite_fail", this, host);
4139 if (EClass.rnd(2) == 0 && GetInt(106) == 0)
4140 {
4141 Talk("parasite_fail");
4142 }
4143 }
4144 consumeTurn = true;
4145 }
4146 }
4147 if (consumeTurn)
4148 {
4149 if (IsPC)
4150 {
4152 }
4153 }
4154 else
4155 {
4156 if (base.isRestrained)
4157 {
4158 TryUnrestrain();
4159 }
4160 if (enemy != null)
4161 {
4163 {
4164 enemy = null;
4165 }
4166 else if (!IsPC && (ai.CancelOnAggro || !ai.IsRunning))
4167 {
4168 SetAIAggro();
4169 }
4170 }
4171 if (HasNoGoal || !ai.IsRunning)
4172 {
4173 ChooseNewGoal();
4174 }
4175 ai.Tick();
4176 }
4177 Cell cell = base.Cell;
4179 {
4180 AddCondition<ConWet>(50);
4181 if (pos.IsHotSpring)
4182 {
4183 hygiene.Mod(2);
4184 }
4185 }
4186 if (IsPC && !EClass._zone.IsRegion && cell.CanSuffocate() && !EClass.debug.godMode)
4187 {
4188 AddCondition<ConSuffocation>(800 / (100 + EvalueMax(200, -5) * 10), force: true);
4189 }
4190 CellEffect e;
4191 if (cell.effect != null)
4192 {
4193 e = cell.effect;
4194 switch (e.id)
4195 {
4196 case 1:
4197 case 2:
4198 case 4:
4199 if (IsLevitating)
4200 {
4201 Say("levitating");
4202 break;
4203 }
4204 AddCondition<ConWet>(50);
4205 ProcEffect();
4206 break;
4207 case 3:
4208 PlaySound("fire_step");
4209 AddCondition<ConBurning>(30);
4210 break;
4211 case 5:
4212 if (!isWet)
4213 {
4214 PlaySound("bubble");
4215 AddCondition<ConWet>(30);
4216 ProcEffect();
4217 }
4218 break;
4219 case 6:
4220 if (hasMovedThisTurn)
4221 {
4222 Say("abMistOfDarkness_step", this);
4223 }
4224 AddCondition<ConDark>(e.power);
4225 break;
4226 }
4227 }
4228 if (IsPC)
4229 {
4230 if (EClass.player.currentHotItem.Thing != null)
4231 {
4233 }
4235 }
4236 void ClearEffect()
4237 {
4238 EClass._map.SetLiquid(cell.x, cell.z, 0, 0);
4239 }
4240 void ProcEffect()
4241 {
4242 if (e.idEffect != 0)
4243 {
4244 ActEffect.ProcAt(e.idEffect, e.power, e.isBlessed ? BlessedState.Blessed : (e.isCursed ? BlessedState.Cursed : BlessedState.Normal), this, this, new Point(pos), e.isHostileAct, new ActRef
4245 {
4246 aliasEle = EClass.sources.elements.map[e.idEle].alias,
4247 n1 = e.n1,
4248 refVal = e.refVal
4249 });
4250 ClearEffect();
4251 }
4252 }
4253 }
4254
4255 public bool CanLift(Card c)
4256 {
4257 return true;
4258 }
4259
4260 public bool CanAutoPick(Card c)
4261 {
4262 return true;
4263 }
4264
4265 public bool CanPick(Card c)
4266 {
4267 if (c.isDestroyed)
4268 {
4269 return false;
4270 }
4271 Card rootCard = c.GetRootCard();
4272 if (rootCard.isDestroyed || (rootCard.ExistsOnMap && rootCard.pos.Distance(pos) > 1))
4273 {
4274 return false;
4275 }
4276 if (rootCard != this && things.IsFull(c.Thing))
4277 {
4278 return false;
4279 }
4280 return true;
4281 }
4282
4283 public void PickOrDrop(Point p, string idThing, int idMat = -1, int num = 1, bool msg = true)
4284 {
4285 if (num != 0)
4286 {
4287 PickOrDrop(p, ThingGen.Create(idThing, idMat).SetNum(num), msg);
4288 }
4289 }
4290
4291 public void PickOrDrop(Point p, Thing t, bool msg = true)
4292 {
4293 if (things.GetDest(t).IsValid)
4294 {
4295 Pick(t, msg);
4296 }
4297 else
4298 {
4299 EClass._zone.AddCard(t, p);
4300 }
4301 }
4302
4303 public Thing Pick(Thing t, bool msg = true, bool tryStack = true)
4304 {
4305 if (t.trait is TraitCard && t.isNew && EClass.game.config.autoCollectCard && !t.c_idRefCard.IsEmpty())
4306 {
4308 return t;
4309 }
4310 if (t.parent == this)
4311 {
4312 return t;
4313 }
4314 t = TryPoisonPotion(t);
4315 ThingContainer.DestData dest = things.GetDest(t, tryStack);
4316 if (!dest.IsValid)
4317 {
4318 if (t.parent != EClass._zone)
4319 {
4320 if (IsPC)
4321 {
4322 Say("backpack_full_drop", t);
4323 SE.Drop();
4324 }
4325 return EClass._zone.AddCard(t, pos).Thing;
4326 }
4327 if (IsPC)
4328 {
4329 Say("backpack_full", t);
4330 }
4331 return t;
4332 }
4333 if (dest.stack != null)
4334 {
4335 if (msg)
4336 {
4337 PlaySound("pick_thing");
4338 Say("pick_thing", this, t);
4339 }
4340 t.TryStackTo(dest.stack);
4341 return dest.stack;
4342 }
4343 TryAbsorbRod(t);
4344 if (msg)
4345 {
4346 PlaySound("pick_thing");
4347 Say("pick_thing", this, t);
4348 }
4349 TryReservePickupTutorial(t);
4350 return dest.container.AddThing(t, tryStack);
4351 }
4352
4354 {
4355 if (t.trait is TraitPotion && t.id != "1165" && !t.source.tag.Contains("neg") && EClass.rnd(2) == 0 && HasElement(1565))
4356 {
4357 string text = EClass.sources.things.rows.Where((SourceThing.Row a) => a._origin == "potion" && a.tag.Contains("neg") && a.chance > 100).ToList().RandomItemWeighted((SourceThing.Row a) => a.chance)
4358 .id;
4359 Say("poisonDrip", this);
4360 int num = t.Num;
4361 t.Destroy();
4362 t = ThingGen.Create(text).SetNum(num);
4363 }
4364 return t;
4365 }
4366
4367 public void TryAbsorbRod(Thing t)
4368 {
4369 if (!IsPC || !(t.trait is TraitRod) || t.c_charges <= 0 || !HasElement(1564))
4370 {
4371 return;
4372 }
4373 Say("absorbRod", this, t);
4374 TraitRod rod = t.trait as TraitRod;
4375 bool flag = false;
4376 if (rod.source != null)
4377 {
4378 using IEnumerator<SourceElement.Row> enumerator = EClass.sources.elements.rows.Where((SourceElement.Row a) => a.id == rod.source.id).GetEnumerator();
4379 if (enumerator.MoveNext())
4380 {
4381 SourceElement.Row current = enumerator.Current;
4382 if (IsPC)
4383 {
4384 GainAbility(current.id, t.c_charges * 100, t);
4385 flag = true;
4386 }
4387 }
4388 }
4389 if (!flag)
4390 {
4391 mana.Mod(-50 * t.c_charges);
4392 }
4393 t.c_charges = 0;
4395 }
4396
4398 {
4399 if (t.id == "axe")
4400 {
4401 Tutorial.Reserve("tool");
4402 }
4403 if (t.category.id == "mushroom")
4404 {
4405 Tutorial.Reserve("food");
4406 }
4407 if (t.category.id == "herb")
4408 {
4409 Tutorial.Reserve("herb");
4410 }
4411 if (t.id == "pasture")
4412 {
4413 Tutorial.Reserve("pasture");
4414 }
4415 if (t.id == "log")
4416 {
4417 Tutorial.Reserve("process");
4418 }
4419 }
4420
4421 public void TryPickGroundItem()
4422 {
4423 foreach (Card item in pos.ListCards())
4424 {
4425 if ((IsPC || !(EClass.pc.ai is AI_UseCrafter aI_UseCrafter) || !aI_UseCrafter.ings.Contains(item)) && item.isThing && item.placeState == PlaceState.roaming && CanPick(item))
4426 {
4427 Thing thing = Pick(item.Thing);
4428 if (thing != null && !IsPC)
4429 {
4430 thing.isNPCProperty = true;
4431 }
4432 break;
4433 }
4434 }
4435 }
4436
4437 public void TryPutShared(Thing t, List<Thing> containers = null, bool dropIfFail = true)
4438 {
4439 if (!EClass._zone.TryAddThingInSharedContainer(t, containers) && dropIfFail)
4440 {
4441 EClass._zone.AddCard(t, pos);
4442 }
4443 }
4444
4445 public bool TryHoldCard(Card t, int num = -1, bool pickHeld = false)
4446 {
4447 if (held == t)
4448 {
4449 return true;
4450 }
4451 if (t.isDestroyed || t.Num <= 0)
4452 {
4453 return false;
4454 }
4455 if (!CanPick(t))
4456 {
4457 if (t.parent == null)
4458 {
4459 EClass._zone.AddCard(t, pos);
4460 }
4461 return false;
4462 }
4463 HoldCard(t, num);
4464 return true;
4465 }
4466
4467 public void HoldCard(Card t, int num = -1)
4468 {
4469 if (held == t || t.isDestroyed || t.Num <= 0)
4470 {
4471 return;
4472 }
4473 if (IsPC && t.isNPCProperty)
4474 {
4475 t.isNPCProperty = false;
4477 pos.TryWitnessCrime(this);
4478 }
4479 PickHeld();
4480 if (t.isChara)
4481 {
4483 {
4484 t.ShowEmo(Emo.love);
4485 }
4486 EClass.player.altHeldPos = t.renderer.data.ForceAltHeldPosition || EClass.rnd(2) == 0;
4487 }
4488 else
4489 {
4490 if (num == -1 || num > t.Num)
4491 {
4492 num = t.Num;
4493 }
4494 if (num < t.Num)
4495 {
4496 t = t.Split(num);
4497 }
4498 }
4499 if (t.GetRootCard() != this)
4500 {
4501 t = Pick(t.Thing, msg: false, tryStack: false);
4502 if (t.GetRootCard() != this)
4503 {
4504 return;
4505 }
4506 }
4507 held = t;
4508 if (held.GetLightRadius() > 0)
4509 {
4510 RecalculateFOV();
4511 }
4512 if (IsPC)
4513 {
4515 WidgetHotbar.dirtyCurrentItem = true;
4516 }
4517 }
4518
4519 public void PickHeld(bool msg = false)
4520 {
4521 if (held == null)
4522 {
4523 return;
4524 }
4525 Card card = held;
4526 if (IsPC && held.invY == 1)
4527 {
4528 WidgetHotbar.dirtyCurrentItem = true;
4530 held = null;
4531 return;
4532 }
4533 if (held.isChara)
4534 {
4535 DropHeld();
4536 return;
4537 }
4538 if (IsPC && !held.IsHotItem && held.trait.CanOnlyCarry)
4539 {
4540 Say("canOnlyCarry", held);
4541 DropHeld();
4542 return;
4543 }
4544 bool flag = held != things.TryStack(held.Thing);
4545 if (!flag && things.IsOverflowing())
4546 {
4547 if (IsPC)
4548 {
4549 Say("backpack_full_drop", held);
4550 SE.Drop();
4551 }
4552 DropHeld();
4553 return;
4554 }
4555 if (msg)
4556 {
4557 PlaySound("pick_thing");
4558 Say("pick_held", this, card);
4559 if (IsPC && card.id == "statue_weird")
4560 {
4561 Say("statue_pick");
4562 }
4563 }
4564 if (IsPC)
4565 {
4566 WidgetHotbar.dirtyCurrentItem = true;
4567 if (!flag)
4568 {
4570 if (held.GetRootCard() != EClass.pc)
4571 {
4572 Pick(held.Thing, msg: false);
4573 }
4574 }
4575 }
4576 held = null;
4577 }
4578
4579 public Card SplitHeld(int a)
4580 {
4581 return held.Split(a);
4582 }
4583
4584 public void TryDropCarryOnly()
4585 {
4586 if (held != null && held.trait.CanOnlyCarry)
4587 {
4588 DropHeld();
4589 }
4590 foreach (Thing item in things.List((Thing t) => t.trait.CanOnlyCarry))
4591 {
4592 DropThing(item);
4593 }
4594 }
4595
4596 public Card DropHeld(Point dropPos = null)
4597 {
4598 if (held == null)
4599 {
4600 return null;
4601 }
4602 if (IsPC)
4603 {
4604 WidgetHotbar.dirtyCurrentItem = true;
4606 }
4607 Card card = EClass._zone.AddCard(held, dropPos ?? pos);
4608 card.OnLand();
4609 if (card.trait.CanOnlyCarry)
4610 {
4611 card.SetPlaceState(PlaceState.installed);
4612 }
4613 return card;
4614 }
4615
4616 public void DropThing(Thing t, int num = -1)
4617 {
4618 if (t.c_isImportant)
4619 {
4620 Msg.Say("markedImportant");
4621 return;
4622 }
4623 if (!t.trait.CanBeDropped)
4624 {
4625 Msg.Say("cantDrop", t);
4626 return;
4627 }
4628 if (t.trait is TraitAbility)
4629 {
4630 SE.Trash();
4631 t.Destroy();
4632 return;
4633 }
4634 Msg.Say("dropItem", t.Name);
4635 t.ignoreAutoPick = true;
4636 PlaySound("drop");
4637 EClass._zone.AddCard(t, pos);
4638 if (t.trait.CanOnlyCarry)
4639 {
4640 t.Install();
4641 }
4642 }
4643
4645 {
4646 int num = Evalue(131);
4647 int num2 = Evalue(130);
4648 int num3 = Evalue(123);
4649 if (num > num2 && num > num3)
4650 {
4651 return AttackStyle.TwoWield;
4652 }
4653 if (num2 > num && num2 > num3)
4654 {
4655 return AttackStyle.TwoHand;
4656 }
4657 if (num3 > num && num3 > num2)
4658 {
4659 return AttackStyle.Shield;
4660 }
4661 return AttackStyle.Default;
4662 }
4663
4665 {
4666 return elements.ListElements((Element e) => e.source.categorySub == "weapon" && !e.HasTag("ranged")).FindMax((Element a) => a.Value);
4667 }
4668
4670 {
4671 if (elements.Value(122) > elements.Value(120))
4672 {
4673 return elements.GetElement(122);
4674 }
4675 return elements.GetElement(120);
4676 }
4677
4678 public void TryRestock(bool onCreate)
4679 {
4680 isOnCreate = onCreate;
4681 if (onCreate || (!IsPCFaction && (base.IsUnique || trait is TraitAdventurer || trait is TraitGuard)))
4682 {
4683 RestockEquip((!EClass.core.IsGameStarted || !(EClass._zone is Zone_Music)) && onCreate);
4684 }
4685 RestockInventory(onCreate);
4686 }
4687
4688 public void RestockEquip(bool onCreate)
4689 {
4690 string equip = source.equip;
4691 if (equip.IsEmpty())
4692 {
4693 equip = job.equip;
4694 }
4695 if (equip == "none")
4696 {
4697 return;
4698 }
4699 bool flag = true;
4700 switch (id)
4701 {
4702 case "kettle":
4703 case "quru":
4704 case "loytel":
4705 case "shojo":
4706 EQ_ID("staff_long", 1);
4707 EQ_CAT("head");
4708 EQ_CAT("torso");
4709 EQ_CAT("arm");
4710 return;
4711 case "adv_yukiimo":
4712 if (onCreate)
4713 {
4714 EQ_ID("tail_snowleopard");
4715 }
4716 break;
4717 case "adv_kiria":
4718 if (onCreate)
4719 {
4720 EQ_ID("sword_zephir");
4721 }
4722 break;
4723 case "adv_mesherada":
4724 if (onCreate)
4725 {
4726 EQ_ID("dagger_hathaway");
4727 }
4728 break;
4729 case "adv_verna":
4730 if (onCreate)
4731 {
4732 EQ_ID("staff_long", -1, Rarity.Legendary);
4733 }
4734 if (onCreate)
4735 {
4736 EQ_ID("cloak_wing", -1, Rarity.Mythical);
4737 }
4738 break;
4739 case "big_sister":
4740 if (onCreate)
4741 {
4742 EQ_ID("sword_muramasa");
4743 }
4744 break;
4745 case "adv_gaki":
4746 if (onCreate)
4747 {
4748 EQ_ID("dagger_gaki");
4749 }
4750 if (onCreate)
4751 {
4752 EQ_ID("dagger_ninto");
4753 }
4754 break;
4755 case "adv_ivory":
4756 EQ_ID("dagger", -1, Rarity.Legendary);
4757 AddThing("60");
4758 break;
4759 case "adv_wini":
4760 if (onCreate)
4761 {
4762 EQ_ID("staff_Cat", -1, Rarity.Mythical);
4763 }
4764 AddCard(ThingGen.CreateSpellbook(9150));
4765 if (onCreate)
4766 {
4767 AddThing("1071");
4768 }
4769 break;
4770 case "namamani":
4771 if (onCreate)
4772 {
4773 AddThing("gun_gravity2");
4774 }
4775 break;
4776 case "lomias":
4777 if (onCreate)
4778 {
4779 AddThing("bow_vindale");
4780 }
4781 break;
4782 case "larnneire":
4783 if (onCreate)
4784 {
4785 EQ_ID("EtherDagger2");
4786 }
4787 break;
4788 case "keeper_garden":
4789 if (!body.HasWeapon())
4790 {
4791 EQ_ID("sword_ragnarok");
4792 }
4793 break;
4794 case "ungaga_pap":
4795 if (onCreate)
4796 {
4797 EQ_ID("axe_destruction");
4798 }
4799 break;
4800 case "lurie_boss":
4801 if (onCreate)
4802 {
4803 EQ_ID("ribbon_duponne");
4804 }
4805 break;
4806 case "seeker":
4807 if (onCreate)
4808 {
4809 EQ_ID("helm_seeker");
4810 }
4811 EQ_ID("robe_pope");
4812 EQ_ID("sword_katana");
4813 EQ_ID("staff");
4814 EQ_ID("sword_katana");
4815 if (onCreate)
4816 {
4817 EQ_ID("boots_seven");
4818 }
4819 if (onCreate)
4820 {
4821 for (int i = 0; i < 20; i++)
4822 {
4823 AddThing(ThingGen.CreateFromCategory("book", 50));
4824 }
4825 EQ_Item("panty");
4826 AddThing("plat").SetNum(6);
4827 }
4828 break;
4829 case "ephrond":
4830 if (onCreate)
4831 {
4832 AddThing("guitar_efrond");
4833 }
4834 break;
4835 case "ashland":
4836 if (onCreate)
4837 {
4838 AddThing("guitar_ash");
4839 }
4840 break;
4841 case "swordkeeper":
4842 if (onCreate)
4843 {
4844 EQ_ID("EtherDagger");
4845 }
4846 break;
4847 case "mech_angel":
4848 if (onCreate)
4849 {
4850 Thing thing = ThingGen.Create("pole_holy");
4851 thing.SetReplica(on: true);
4852 thing.rarity = Rarity.Normal;
4853 thing.elements.SetTo(60, -15);
4854 thing.elements.SetTo(418, -100);
4855 thing.elements.SetTo(93, 50);
4856 AddThing(thing);
4857 body.Equip(thing);
4858 flag = false;
4859 }
4860 break;
4861 case "azzrasizzle":
4862 if (onCreate)
4863 {
4864 EQ_ID("staff_magius");
4865 }
4866 break;
4867 case "sorin":
4868 if (onCreate)
4869 {
4870 EQ_ID("staff_insanity");
4871 }
4872 break;
4873 case "robot":
4874 if (onCreate)
4875 {
4876 EQ_ID("sword_katana");
4877 }
4878 break;
4879 }
4880 if (!TryEquipRanged())
4881 {
4882 switch (id)
4883 {
4884 case "tyche":
4885 case "trooper":
4886 case "mech_scarab":
4887 AddThing("gun_laser");
4888 break;
4889 case "rocketman":
4890 {
4891 Thing thing2 = AddThing("panzerfaust");
4892 thing2.ChangeMaterial("iron");
4893 thing2.c_ammo = 0;
4894 break;
4895 }
4896 default:
4897 switch (equip)
4898 {
4899 case "archer":
4900 EQ_CAT((EClass.rnd(4) == 0) ? "crossbow" : "bow");
4901 break;
4902 case "inquisitor":
4903 case "gunner":
4904 EQ_CAT("gun");
4905 break;
4906 }
4907 break;
4908 }
4909 }
4910 int num = ((base.rarity >= Rarity.Mythical) ? (base.LV * 3) : ((base.rarity >= Rarity.Legendary) ? (base.LV * 2) : base.LV));
4911 if (trait is TraitAdventurer)
4912 {
4913 num *= 3;
4914 }
4915 if (race.id == "asura")
4916 {
4917 for (int j = 0; j < 4; j++)
4918 {
4919 EQ_CAT(job.weapon.RandomItem());
4920 }
4921 }
4922 for (int k = 0; k < ((!(race.id == "mutant")) ? 1 : (2 + base.LV / 30)); k++)
4923 {
4924 if (flag)
4925 {
4926 if (source.ContainsTag("boxer"))
4927 {
4928 EQ_CAT("martial");
4929 }
4930 else if (!job.weapon.IsEmpty())
4931 {
4932 if (race.id == "mutant" || (body.slotMainHand != null && body.slotMainHand.thing == null))
4933 {
4934 EQ_CAT(job.weapon.RandomItem());
4935 }
4936 if (race.id == "mutant" || (Evalue(131) > 0 && EClass.rnd(2) == 0))
4937 {
4938 EQ_CAT(job.weapon.RandomItem());
4939 }
4940 }
4941 }
4942 EQ_CAT("torso");
4943 if (EClass.rnd(num) > 5)
4944 {
4945 EQ_CAT("arm");
4946 }
4947 if (EClass.rnd(num) > 10)
4948 {
4949 EQ_CAT("head");
4950 }
4951 if (EClass.rnd(num) > 15)
4952 {
4953 EQ_CAT("back");
4954 }
4955 if (EClass.rnd(num) > 20)
4956 {
4957 EQ_CAT("ring");
4958 }
4959 if (EClass.rnd(num) > 25)
4960 {
4961 EQ_CAT("amulet");
4962 }
4963 if (EClass.rnd(num) > 30)
4964 {
4965 EQ_CAT("foot");
4966 }
4967 if (EClass.rnd(num) > 35)
4968 {
4969 EQ_CAT("waist");
4970 }
4971 if (EClass.rnd(num) > 40)
4972 {
4973 EQ_CAT("ring");
4974 }
4975 }
4976 if (trait is TraitBard)
4977 {
4978 AddThing(ThingGen.Create("lute"));
4979 if (EClass.debug.enable || EClass.rnd(100) == 0)
4980 {
4981 EQ_ID("shield_lute");
4982 }
4983 }
4984 if (HasTag(CTAG.shield))
4985 {
4986 EQ_CAT("shield");
4987 }
4988 }
4989
4990 public void RestockInventory(bool onCreate)
4991 {
4992 switch (id)
4993 {
4994 case "lomias":
4995 if (ShouldRestock("_meat"))
4996 {
4997 AddCard(ThingGen.Create("_meat").MakeRefFrom("begger"));
4998 }
4999 break;
5000 case "fiama":
5001 Restock("book_story", 1);
5002 break;
5003 case "rock_thrower":
5004 Restock("stone", 10 + EClass.rnd(10));
5005 break;
5006 case "giant":
5007 Restock("rock", 2 + EClass.rnd(10));
5008 break;
5009 case "farris":
5010 Restock("lute", 1);
5011 Restock("book_story_home", 1);
5012 break;
5013 case "begger":
5014 break;
5015 }
5016 void Restock(string id, int num)
5017 {
5018 if (ShouldRestock(id))
5019 {
5020 AddCard(ThingGen.Create(id).SetNum(num));
5021 }
5022 }
5023 bool ShouldRestock(string id)
5024 {
5025 return things.Find(id) == null;
5026 }
5027 }
5028
5029 private void SetEQQuality()
5030 {
5032 Rarity rarity = Rarity.Normal;
5033 int num = ((base.LV >= 1000) ? 7 : ((base.LV >= 500) ? 5 : ((base.LV >= 250) ? 3 : ((base.LV >= 100) ? 2 : ((base.LV >= 50) ? 1 : 0)))));
5034 Rarity rarity2 = base.rarity;
5035 if (id == "big_sister")
5036 {
5037 num = (isOnCreate ? 8 : 4);
5038 }
5039 if (!isOnCreate && EClass.rnd(10) != 0)
5040 {
5041 num /= 2;
5042 }
5043 if (rarity2 == Rarity.Superior && EClass.rnd(10) <= num)
5044 {
5045 rarity = Rarity.Superior;
5046 }
5047 else if (rarity2 == Rarity.Legendary)
5048 {
5049 rarity = ((EClass.rnd(10) <= num) ? Rarity.Legendary : ((EClass.rnd(5) <= num) ? Rarity.Superior : Rarity.Normal));
5050 }
5051 else if (rarity2 >= Rarity.Mythical)
5052 {
5053 rarity = ((EClass.rnd(30) <= num) ? Rarity.Mythical : ((EClass.rnd(10) > num) ? Rarity.Superior : Rarity.Legendary));
5054 }
5055 if (rarity == Rarity.Normal && EClass.rnd(1000) == 0)
5056 {
5057 rarity = Rarity.Legendary;
5058 }
5059 CardBlueprint.current.rarity = rarity;
5060 }
5061
5062 public Thing EQ_ID(string s, int mat = -1, Rarity r = Rarity.Random)
5063 {
5064 SetEQQuality();
5065 if (r != Rarity.Random)
5066 {
5067 CardBlueprint.current.rarity = r;
5068 }
5069 Thing thing = ThingGen.Create(s, mat, base.LV);
5070 if (body.GetSlot(thing, onlyEmpty: true) == null)
5071 {
5072 return thing;
5073 }
5074 AddThing(thing);
5075 if (!body.Equip(thing))
5076 {
5077 thing.Destroy();
5078 }
5079 return thing;
5080 }
5081
5082 public void EQ_CAT(string s)
5083 {
5084 int slot = EClass.sources.categories.map[s].slot;
5085 BodySlot bodySlot = ((slot == 0) ? null : body.GetSlot(slot));
5086 if ((slot == 0 || bodySlot != null) && (slot != 37 || !HasElement(1209)))
5087 {
5088 SetEQQuality();
5089 Thing thing = ThingGen.CreateFromCategory(s, base.LV);
5090 AddThing(thing);
5091 if (bodySlot != null && !body.Equip(thing, bodySlot))
5092 {
5093 thing.Destroy();
5094 }
5095 }
5096 }
5097
5098 public void EQ_Item(string s, int num = 1)
5099 {
5100 SetEQQuality();
5101 Thing t = ThingGen.Create(s, -1, base.LV).SetNum(num);
5102 AddThing(t);
5103 }
5104
5105 public void Drink(Card t)
5106 {
5107 Say("drink", this, t.Duplicate(1));
5108 Say("quaff");
5109 PlaySound("drink");
5110 hunger.Mod(-2);
5111 t.ModNum(-1);
5112 t.trait.OnDrink(this);
5113 _ = IsPC;
5114 }
5115
5116 public bool CanRevive()
5117 {
5118 return EClass.world.date.IsExpired(base.c_dateDeathLock);
5119 }
5120
5121 public void GetRevived()
5122 {
5123 Revive(EClass.pc.pos.GetNearestPoint(allowBlock: false, allowChara: false), msg: true);
5124 if (!IsPCFaction)
5125 {
5126 return;
5127 }
5128 if (!IsPC && (!trait.CanJoinPartyResident || !trait.CanJoinParty || memberType != 0))
5129 {
5130 if (homeZone != null && EClass._zone != homeZone)
5131 {
5132 Msg.Say("returnHome", this, homeZone.Name);
5133 MoveZone(homeZone);
5134 }
5135 }
5136 else if (!EClass._zone.IsPCFaction || homeBranch != EClass.Branch || base.c_wasInPcParty)
5137 {
5138 EClass.pc.party.AddMemeber(this, showMsg: true);
5139 }
5140 }
5141
5142 public void Revive(Point p = null, bool msg = false)
5143 {
5144 if (!isDead)
5145 {
5146 return;
5147 }
5148 isDead = false;
5149 base.hp = MaxHP / 3;
5150 mana.value = 0;
5151 stamina.value = 0;
5152 if (hunger.value > 30)
5153 {
5154 hunger.value = 30;
5155 }
5156 sleepiness.value = 0;
5157 hostility = OriginalHostility;
5158 RemoveCondition<StanceTaunt>();
5159 if (id == "keeper_garden")
5160 {
5161 SaiyanRevive();
5162 }
5163 if (IsPC)
5164 {
5166 {
5167 Msg.Say("noDeathPenalty2", this);
5168 }
5170 {
5171 Msg.Say("noDeathPenalty", this);
5172 }
5173 else
5174 {
5176 }
5177 List<Thing> dropList = new List<Thing>();
5178 EClass.pc.things.Foreach(delegate(Thing t)
5179 {
5181 {
5182 t.ignoreAutoPick = true;
5183 dropList.Add(t);
5184 }
5185 }, onlyAccessible: false);
5186 foreach (Thing item in dropList)
5187 {
5189 Msg.Say("backpack_full_drop", item);
5190 }
5191 EClass.player.preventDeathPenalty = false;
5192 }
5193 if (IsPCFaction && homeBranch != null)
5194 {
5195 homeBranch.Log("bRevive", this);
5196 }
5197 if (p != null)
5198 {
5199 if (!p.IsInBounds)
5200 {
5202 }
5203 EClass._zone.AddCard(this, p);
5204 if (msg)
5205 {
5206 SE.Play("revive");
5207 Msg.Say("revive", this);
5208 PlayEffect("revive");
5209 }
5210 SetCensored(enable: false);
5211 }
5212 }
5213
5214 public void SaiyanRevive()
5215 {
5216 ModCorruption(-100000);
5217 if (base.LV < 10000000)
5218 {
5219 SetLv(base.LV * 10 + 9);
5220 }
5221 Refresh();
5222 base.hp = MaxHP;
5223 mana.value = mana.max;
5224 stamina.value = stamina.max;
5225 bossText = true;
5226 }
5227
5228 public void MakeGrave(string lastword)
5229 {
5230 if (!EClass._zone.IsRegion)
5231 {
5232 List<string> list = new List<string> { "930", "931", "947", "948", "949", "950", "951", "952" };
5233 if (IsPC && EClass.rnd(2) == 0 && EClass.pc.things.Find("letter_will") != null)
5234 {
5235 list = new List<string> { "944", "946", "backerGrave", "backerGrave2" };
5236 }
5237 Thing thing = ThingGen.Create(list.RandomItem());
5238 thing.MakeRefFrom(this);
5239 if (!lastword.IsEmpty())
5240 {
5241 thing.c_note = lastword;
5242 }
5243 thing.isModified = true;
5244 EClass._zone.AddCard(thing, pos).Install();
5245 }
5246 }
5247
5248 public void ApplyDeathPenalty()
5249 {
5250 if (!IsPC)
5251 {
5252 return;
5253 }
5254 int currency = GetCurrency();
5255 if (currency > 0)
5256 {
5257 int num = currency / 3 + EClass.rnd(currency / 3 + 1);
5258 if (num <= 0)
5259 {
5260 num = 1;
5261 }
5262 Msg.Say("panaltyMoney", this, Lang._currency(num));
5263 ModCurrency(-num);
5265 }
5266 foreach (Element value in EClass.pc.elements.dict.Values)
5267 {
5268 if (EClass.rnd(5) == 0 && value.IsMainAttribute)
5269 {
5270 EClass.pc.elements.ModExp(value.id, -500f);
5271 }
5272 }
5273 }
5274
5275 public void Vomit()
5276 {
5277 base.c_vomit++;
5278 Say("vomit", this);
5279 PlaySound("vomit");
5280 if (!EClass._zone.IsRegion)
5281 {
5282 Thing thing = ThingGen.Create("731");
5284 {
5285 thing.MakeRefFrom(this);
5286 }
5287 EClass._zone.AddCard(thing, pos);
5288 }
5289 if (HasCondition<ConAnorexia>())
5290 {
5291 ModExp(70, -50);
5292 ModExp(71, -75);
5293 ModExp(77, -100);
5294 }
5295 else if (base.c_vomit > 10)
5296 {
5297 AddCondition<ConAnorexia>();
5298 }
5299 AddCondition<ConDim>();
5300 if (HasCondition<ConAnorexia>())
5301 {
5302 ModWeight(-1 * (1 + EClass.rnd(5)));
5303 }
5304 if (hunger.GetPhase() >= 4)
5305 {
5306 DamageHP(9999L, AttackSource.Hunger);
5307 }
5308 hunger.Mod(30);
5309 }
5310
5311 public override void Die(Element e = null, Card origin = null, AttackSource attackSource = AttackSource.None, Chara originalTarget = null)
5312 {
5313 combatCount = 0;
5314 if (isDead || host != null)
5315 {
5316 return;
5317 }
5318 bool isInActiveZone = IsInActiveZone;
5319 if (isInActiveZone)
5320 {
5321 if (IsPC)
5322 {
5324 }
5325 if (base.isSummon)
5326 {
5327 if (id == "tsunami")
5328 {
5329 pos.PlaySound("water");
5330 }
5331 else
5332 {
5333 Say("summon_vanish", this);
5334 pos.PlayEffect("vanish");
5335 pos.PlaySound("vanish");
5336 }
5337 Destroy();
5338 return;
5339 }
5340 if (attackSource == AttackSource.DeathSentense)
5341 {
5342 if (trait is TraitLittleOne)
5343 {
5344 MakeEgg();
5345 if (IsPCFaction)
5346 {
5347 homeBranch.RemoveMemeber(this);
5348 }
5349 }
5350 PlayEffect("revive");
5351 PlaySound("chime_angel");
5352 }
5353 else
5354 {
5355 Effect.Get("blood").Play((parent is Chara) ? (parent as Chara).pos : pos).SetParticleColor(EClass.Colors.matColors[base.material.alias].main)
5356 .Emit(50);
5357 AddBlood(AI_Slaughter.slaughtering ? 12 : (2 + EClass.rnd(2)));
5358 PlaySound(base.material.GetSoundDead(source));
5359 }
5360 renderer.RefreshSprite();
5361 renderer.RefreshStateIcon();
5362 ClearFOV();
5363 }
5364 string text = "";
5365 "dead_in".langGame(EClass._zone.Name);
5366 string text2 = ((origin == null) ? "" : origin.GetName(NameStyle.Full));
5367 if (LangGame.Has("dead_" + attackSource))
5368 {
5369 text = "dead_" + attackSource;
5370 }
5371 else
5372 {
5373 if (e != Element.Void && e != null)
5374 {
5375 text = "dead_" + e.source.alias;
5376 }
5377 if (text == "" || !LangGame.Has(text))
5378 {
5379 text = "dead";
5380 }
5381 }
5382 if (IsPC)
5383 {
5384 EClass._zone.isDeathLocation = true;
5385 string s = ((origin == null) ? text : "dead_by");
5387 if (attackSource == AttackSource.Wrath)
5388 {
5390 }
5391 EClass.player.deathMsg = GameLang.Parse(s.langGame(), thirdPerson: true, EClass.pc.NameBraced, "dead_in".langGame(EClass._zone.Name), text2);
5393 if (EClass._zone.instance is ZoneInstanceRandomQuest zoneInstanceRandomQuest)
5394 {
5395 zoneInstanceRandomQuest.status = ZoneInstance.Status.Fail;
5396 }
5397 AI_PlayMusic.keepPlaying = false;
5398 }
5399 if (isInActiveZone)
5400 {
5401 if (attackSource == AttackSource.DeathSentense)
5402 {
5403 Msg.Say("goto_heaven", this);
5404 }
5405 else
5406 {
5407 if (originalTarget != null || origin == null || !origin.isSynced || (attackSource != AttackSource.Melee && attackSource != AttackSource.Range))
5408 {
5409 Msg.Say(text, this, "", text2);
5410 }
5411 string text3 = TalkTopic("dead");
5412 if (!text3.IsEmpty())
5413 {
5414 text3 = text3.StripBrackets();
5415 }
5416 bool flag = base.rarity >= Rarity.Legendary && !IsPCFaction;
5417 if (!IsPC && flag)
5418 {
5419 MakeGrave(text3);
5420 }
5421 Msg.SetColor();
5422 SpawnLoot(origin);
5423 }
5424 if (IsPC)
5425 {
5426 TryDropCarryOnly();
5427 }
5428 }
5429 if (IsPCFaction)
5430 {
5431 if (homeBranch != null)
5432 {
5433 homeBranch.Log(text, this, "");
5434 }
5435 WidgetPopText.Say("popDead".lang(base.Name), FontColor.Bad);
5436 if (!IsPC)
5437 {
5438 if (EClass.player.stats.allyDeath == 0)
5439 {
5440 Tutorial.Reserve("death_pet");
5441 }
5443 }
5444 }
5445 if (id == "mandrake" || HasElement(488))
5446 {
5447 Say("a_scream", this);
5448 ActEffect.ProcAt(EffectId.Scream, base.LV * 3 + 200, BlessedState.Normal, this, this, pos, isNeg: true);
5449 }
5450 daysStarved = 0;
5451 isDead = true;
5452 ClearTempElements();
5453 enemy = null;
5454 _cooldowns = null;
5455 base.isSale = false;
5456 SetInt(70);
5457 EClass._map.props.sales.Remove(this);
5458 Cure(CureType.Death);
5459 SetAI(new NoGoal());
5460 TryDropBossLoot();
5461 if (isInActiveZone && EClass._zone.HasLaw && IsHuman && OriginalHostility >= Hostility.Neutral)
5462 {
5463 pos.TalkWitnesses(origin?.Chara, "witness", 3, WitnessType.crime, (Chara c) => !c.IsPCParty && !c.IsUnique);
5464 }
5465 if (IsPC)
5466 {
5467 EClass.player.returnInfo = null;
5468 EClass.player.uidLastTravelZone = 0;
5469 foreach (Chara chara3 in EClass._map.charas)
5470 {
5471 if (chara3.IsHostile())
5472 {
5473 chara3.hostility = chara3.OriginalHostility;
5474 }
5475 if (chara3.enemy == EClass.pc)
5476 {
5477 chara3.enemy = null;
5478 }
5479 }
5480 if (EClass.pc.things.Find("letter_will") != null && EClass.rnd(10) == 0)
5481 {
5482 EClass.player.preventDeathPenalty = true;
5483 }
5484 }
5485 else
5486 {
5487 bool flag2 = currentZone.IsActiveZone && IsLocalChara && !currentZone.IsPCFaction;
5488 if (currentZone is Zone_LittleGarden && id == "littleOne")
5489 {
5490 flag2 = false;
5491 }
5492 if (flag2)
5493 {
5494 EClass._map.deadCharas.Add(this);
5495 }
5496 currentZone.RemoveCard(this);
5497 }
5498 if ((origin != null && origin.IsPCParty) || IsPCFaction)
5499 {
5500 int a = -10;
5501 if (IsPCFaction && !IsPCParty && (origin == null || !origin.IsPCParty))
5502 {
5503 a = -5;
5504 }
5505 ModAffinity(EClass.pc, a, show: false);
5506 string text4 = id;
5507 if (!(text4 == "quru"))
5508 {
5509 if (text4 == "corgon")
5510 {
5511 EClass.game.cards.globalCharas.Find("quru")?.ModAffinity(EClass.pc, -20, show: false);
5512 }
5513 }
5514 else
5515 {
5516 EClass.game.cards.globalCharas.Find("corgon")?.ModAffinity(EClass.pc, -20, show: false);
5517 }
5518 }
5519 if (origin != null)
5520 {
5521 if (origin.IsPCParty || origin.IsPCPartyMinion)
5522 {
5523 int num = 0;
5524 if (OriginalHostility >= Hostility.Friend && IsHuman && !base.IsPCFactionOrMinion)
5525 {
5526 num = -5;
5527 }
5528 else if (race.id == "cat" && OriginalHostility >= Hostility.Neutral)
5529 {
5530 EClass.pc.Say("killcat");
5531 num = -1;
5532 }
5533 if (EClass.pc.party.HasElement(1563) && num < 0)
5534 {
5535 num = num * 30 / 100;
5536 }
5537 if (num != 0)
5538 {
5539 EClass.player.ModKarma(num);
5540 }
5541 }
5542 if (origin == EClass.pc)
5543 {
5544 EClass.pc.faith.Revelation("kill", 10);
5545 }
5546 else if (origin.IsPCFaction)
5547 {
5548 origin.Chara.ModAffinity(EClass.pc, 1, show: false);
5549 origin.Chara.ShowEmo(Emo.love);
5550 }
5551 }
5552 if (base.sourceBacker != null && origin != null && origin.IsPCParty)
5553 {
5554 EClass.player.doneBackers.Add(base.sourceBacker.id);
5555 }
5556 if (base.IsPCFactionOrMinion)
5557 {
5559 {
5560 Msg.Say("abort_allyDead");
5561 }
5562 }
5564 {
5565 Msg.Say("abort_enemyDead");
5566 }
5567 if (IsPCParty && !IsPC)
5568 {
5570 base.c_wasInPcParty = true;
5571 EClass.pc.Say("allyDead");
5572 }
5573 switch (id)
5574 {
5575 case "littleOne":
5576 if (attackSource != AttackSource.DeathSentense && !IsPCFaction)
5577 {
5578 EClass.player.flags.little_killed = true;
5580 }
5581 break;
5582 case "big_daddy":
5583 if (!IsPCFaction)
5584 {
5585 Chara chara = CharaGen.Create("littleOne");
5586 EClass._zone.AddCard(chara, pos.Copy());
5587 Msg.Say("little_pop");
5589 }
5590 break;
5591 case "shark_sister":
5592 if (!IsPCFaction)
5593 {
5594 Chara t = CharaGen.Create("sister_shark");
5595 EClass._zone.AddCard(t, pos.Copy());
5596 Msg.Say("shark_pop");
5597 }
5598 break;
5599 }
5600 if (attackSource == AttackSource.Finish && origin != null && origin.Evalue(665) > 0)
5601 {
5602 Chara chara2 = CharaGen.CreateFromFilter("c_plant", base.LV);
5603 EClass._zone.AddCard(chara2, pos.Copy());
5604 if (chara2.LV < base.LV)
5605 {
5606 chara2.SetLv(base.LV);
5607 }
5608 chara2.MakeMinion((origin.IsPCParty || origin.IsPCPartyMinion) ? EClass.pc : origin.Chara, MinionType.Friend);
5609 Msg.Say("plant_pop", this, chara2);
5610 }
5612 }
5613
5614 public void TryDropBossLoot()
5615 {
5616 if (IsPCFaction || IsPCFactionMinion)
5617 {
5618 return;
5619 }
5620 int num = 0;
5621 bool flag = false;
5622 bool flag2 = false;
5623 Point point = pos.GetNearestPoint(allowBlock: true, allowChara: false, allowInstalled: false, ignoreCenter: true) ?? pos;
5624 TreasureType type = TreasureType.BossQuest;
5625 if (EClass._zone.Boss == this)
5626 {
5627 type = TreasureType.BossNefia;
5628 num = 2 + EClass.rnd(2);
5629 flag = (flag2 = true);
5630 EClass._zone.Boss = null;
5631 Msg.Say("boss_win", EClass._zone.Name);
5633 {
5634 Msg.Say("boss_win_void", EClass._zone.Name);
5635 EClass.player.flags.KilledBossInVoid = true;
5636 }
5637 if (EClass._zone.IsNefia)
5638 {
5641 SE.Play("Jingle/fanfare2");
5642 EClass._zone.SetBGM(114, refresh: true, 3f);
5643 }
5646 }
5647 switch (id)
5648 {
5649 case "azzrasizzle":
5650 num = 5;
5651 flag = (flag2 = true);
5652 EClass.Sound.StopBGM(3f);
5653 EClass._zone.SetBGM(1, refresh: false);
5654 if (EClass.game.quests.GetPhase<QuestIntoDarkness>() == 5)
5655 {
5656 EClass.game.quests.Get<QuestIntoDarkness>().UpdateOnTalk();
5657 }
5658 break;
5659 case "vernis_boss":
5660 num = 5;
5661 flag = (flag2 = true);
5662 EClass.Sound.StopBGM(3f);
5663 EClass._zone.SetBGM(1, refresh: false);
5664 if (EClass.game.quests.GetPhase<QuestVernis>() == 8)
5665 {
5666 EClass.game.quests.Get<QuestVernis>().UpdateOnTalk();
5667 }
5668 break;
5669 case "lurie_boss":
5670 if (!(EClass._zone is Zone_Exile))
5671 {
5672 num = 5;
5673 flag = (flag2 = true);
5674 EClass._zone.SetBGM(120, refresh: true, 3f);
5676 {
5677 EClass.game.quests.Get<QuestNegotiationDarkness>().ChangePhase(4);
5678 EClass.player.flags.killedDuponne = true;
5679 }
5680 }
5681 break;
5682 case "ungaga_pap":
5683 num = 5;
5684 flag = (flag2 = true);
5686 {
5687 EClass._zone.SetBGM(46, refresh: true, 3f);
5688 }
5689 break;
5690 case "melilith_boss":
5691 num = 5;
5692 flag = (flag2 = true);
5693 EClass.Sound.StopBGM(3f);
5694 EClass._zone.SetBGM(1, refresh: false);
5695 break;
5696 case "doga":
5697 {
5698 QuestCurry questCurry = EClass.game.quests.Get<QuestCurry>();
5699 if (questCurry != null)
5700 {
5701 num = 5;
5702 flag = (flag2 = true);
5703 EClass.Sound.StopBGM(3f);
5704 EClass._zone.SetBGM(1, refresh: false);
5705 questCurry.NextPhase();
5706 }
5707 break;
5708 }
5709 case "fairy_raina":
5710 case "fairy_poina":
5711 {
5712 bool num2 = EClass._map.FindChara((id == "fairy_raina") ? "fairy_poina" : "fairy_raina") == null;
5713 QuestNasu questNasu = EClass.game.quests.Get<QuestNasu>();
5714 if (num2 && questNasu != null && questNasu.phase <= 1)
5715 {
5716 if (questNasu.phase == 0)
5717 {
5718 questNasu.NextPhase();
5719 }
5720 num = 5;
5721 flag = (flag2 = true);
5722 EClass.Sound.StopBGM(3f);
5723 EClass._zone.SetBGM(1, refresh: false);
5724 EClass.player.DropReward(ThingGen.Create("backpack_holding"));
5725 questNasu.NextPhase();
5726 }
5727 break;
5728 }
5729 case "isygarad":
5730 {
5731 num = 5;
5732 flag = (flag2 = true);
5733 QuestExploration questExploration = EClass.game.quests.Get<QuestExploration>();
5734 if (questExploration != null)
5735 {
5736 SE.Play("kill_boss");
5737 questExploration.ChangePhase(3);
5738 EClass.Sound.StopBGM(3f);
5739 EClass._zone.SetBGM(1, refresh: false);
5740 }
5741 break;
5742 }
5743 case "swordkeeper":
5744 num = 10;
5745 flag = true;
5746 SE.Play("kill_boss");
5747 SoundManager.ForceBGM();
5748 LayerDrama.Activate("_event", "event", "swordkeeper_defeat");
5749 break;
5750 }
5751 if (flag)
5752 {
5753 SE.Play("kill_boss");
5754 }
5755 if (num != 0)
5756 {
5758 {
5759 EClass.player.stats.deepest = EClass._zone.DangerLv;
5760 Msg.Say("update_deepest", EClass.player.stats.deepest.ToString() ?? "");
5761 }
5763 {
5764 EClass.player.stats.deepestVoid = -EClass._zone.lv;
5765 Msg.Say("update_deepest_void", EClass.player.stats.deepestVoid.ToString() ?? "");
5766 }
5767 EClass.player.willAutoSave = true;
5768 Thing thing = ThingGen.CreateTreasure("chest_boss", base.LV, type);
5769 point.SetBlock();
5770 point.SetObj();
5771 EClass._zone.AddCard(thing, point).Install();
5772 ThingGen.TryLickChest(thing);
5773 }
5774 if (flag2)
5775 {
5777 }
5778 }
5779
5780 public void Kick(Point p, bool ignoreSelf = false, bool checkWall = true)
5781 {
5782 foreach (Chara item in p.ListCharas())
5783 {
5784 Kick(item, ignoreSelf, karmaLoss: true, show: true, checkWall);
5785 }
5786 }
5787
5788 public void Kick(Chara t, bool ignoreSelf = false, bool karmaLoss = true, bool show = true, bool checkWall = true)
5789 {
5790 if (!IsAliveInCurrentZone)
5791 {
5792 return;
5793 }
5794 if (t.IsPC)
5795 {
5797 }
5798 if (t.host != null)
5799 {
5800 return;
5801 }
5802 if (t == this)
5803 {
5804 if (!ignoreSelf)
5805 {
5806 Debug.Log(t.pos.GetNearestPoint());
5807 if (TryMove(t.pos.GetNearestPoint()) != MoveResult.Success)
5808 {
5809 t.MoveImmediate(pos.GetNearestPoint() ?? t.pos);
5810 }
5811 }
5812 return;
5813 }
5814 if (show)
5815 {
5816 Say("kick", this, t);
5817 }
5818 PlaySound("kick");
5819 if ((t.conSuspend == null || t.conSuspend.uidMachine != 0) && t.trait.CanBePushed && (!t.IsHostile() || EClass.rnd(2) == 0) && !t.noMove && !t.isRestrained)
5820 {
5821 t.MoveByForce(t.pos.GetNearestPoint(allowBlock: false, allowChara: false, allowInstalled: true, ignoreCenter: true), this, checkWall && !t.pos.IsBlocked);
5822 }
5823 if (t.conSleep != null)
5824 {
5825 t.conSleep.Kill();
5826 }
5827 if (IsPC && t.IsFriendOrAbove() && !t.IsPCFactionOrMinion && karmaLoss)
5828 {
5830 }
5831 t.PlayEffect("kick");
5832 }
5833
5834 public bool UseAbility(int idAct, Card tc = null, Point pos = null, bool pt = false)
5835 {
5836 return UseAbility(elements.GetElement(idAct)?.act ?? ACT.Create(idAct), tc, pos, pt);
5837 }
5838
5839 public bool UseAbility(string idAct, Card tc = null, Point pos = null, bool pt = false)
5840 {
5841 return UseAbility(elements.GetElement(idAct)?.act ?? ACT.Create(idAct), tc, pos, pt);
5842 }
5843
5844 public bool UseAbility(Act a, Card tc = null, Point pos = null, bool pt = false)
5845 {
5846 if (HasCooldown(a.id))
5847 {
5848 return false;
5849 }
5850 if (a.source.proc.TryGet(0) == "Heal" && HasElement(1422) && !IsPC)
5851 {
5852 List<int> list = new List<int> { 8400, 8401, 8402, 8403, 8404, 8405 };
5853 int num = list.IndexOf(a.id);
5854 if (num != -1)
5855 {
5856 int num2 = list.TryGet(num + Evalue(1422));
5857 a = elements.GetElement(num2)?.act ?? ACT.Create(num2);
5858 }
5859 }
5860 int num3 = 1;
5861 Act.Cost cost = a.GetCost(this);
5862 a.GetPower(this);
5863 int i = 1;
5864 int num4 = 0;
5865 bool flag = a.IsTargetHostileParty();
5866 if (IsPC && HasCondition<StanceManaCost>())
5867 {
5868 num4 = Evalue(1657);
5869 }
5870 _pts.Clear();
5871 if (a.TargetType.ForceParty)
5872 {
5873 pt = true;
5874 }
5875 if (pt)
5876 {
5877 i = 0;
5878 if (flag)
5879 {
5880 ForeachEnemy(delegate
5881 {
5882 i++;
5883 });
5884 }
5885 else
5886 {
5887 ForeachParty(delegate
5888 {
5889 i++;
5890 });
5891 }
5892 }
5893 if (a is Spell && IsPC && a.vPotential < i)
5894 {
5895 i = 1;
5896 _pts.Clear();
5897 _pts.Add(this);
5898 pt = false;
5899 }
5900 int num5 = 100;
5901 if (!a.TargetType.ForceParty && i > 1)
5902 {
5903 num5 = (IsPC ? (i * 100) : (50 + i * 50));
5904 }
5905 int num6 = cost.cost * num5 / 100;
5906 if (cost.type == Act.CostType.MP && Evalue(483) > 0)
5907 {
5908 num6 = num6 * 100 / (100 + (int)Mathf.Sqrt(Evalue(483) * 10) * 3);
5909 }
5910 if (i == 0)
5911 {
5912 if (IsPC)
5913 {
5915 }
5916 return false;
5917 }
5918 if (!IsPC && cost.type == Act.CostType.MP && mana.value < 0 && (EClass.rnd(4) != 0 || IsPCFaction || (base.IsPowerful && mana.value < -20)))
5919 {
5920 return false;
5921 }
5922 if (IsPC)
5923 {
5924 if (!Dialog.warned && cost.type == Act.CostType.MP && cost.cost > 0 && mana.value < num6 && !EClass.debug.godMode)
5925 {
5926 ActPlan.warning = true;
5927 Dialog.TryWarnMana(delegate
5928 {
5929 if (UseAbility(a, tc, pos, pt))
5930 {
5932 }
5933 });
5934 return false;
5935 }
5936 EClass.ui.CloseLayers();
5937 }
5938 if ((isConfused && EClass.rnd(4) == 0) || (isBlind && (pt || (pos != null && !pos.Equals(base.pos)) || (tc != null && tc.pos != null && !tc.pos.Equals(base.pos))) && EClass.rnd(2) == 0))
5939 {
5940 Say("shakeHead", this);
5941 return true;
5942 }
5943 if (tc != null && tc != this)
5944 {
5945 LookAt(tc.pos);
5946 }
5947 if (pos != null && !base.pos.Equals(pos))
5948 {
5949 LookAt(pos);
5950 }
5951 if (a.CanRapidFire && HasElement(1648))
5952 {
5953 num3 = 1 + Evalue(1648);
5954 }
5955 if (IsPC && cost.cost > 0 && a.Value == 0)
5956 {
5958 return false;
5959 }
5960 if (a is Spell)
5961 {
5962 string s = (isConfused ? "_cast_confuse" : (HasCondition<ConDim>() ? "_cast_dim" : ""));
5963 if (!a.source.tag.Contains("useHand"))
5964 {
5965 Say(race.castStyle.IsEmpty("cast"), this, a.source.GetName().ToLower(), s.lang());
5966 }
5967 if (IsPC)
5968 {
5969 _ = (i + 1) / 2;
5970 if (a.vPotential < i)
5971 {
5972 Msg.Say("noSpellStock");
5973 EInput.Consume();
5974 return false;
5975 }
5976 if (num4 > 0 && a.vPotential >= i * 2)
5977 {
5978 a.vPotential -= i * 2;
5979 num6 = num6 * (100 - num4 * 20) / 100;
5980 }
5981 else
5982 {
5983 a.vPotential -= i;
5984 }
5986 }
5987 }
5988 else if (a.source.langAct.Length != 0 && tc != null)
5989 {
5990 string text = a.source.langAct[0];
5991 string text2 = ((a.source.langAct.Length >= 2) ? a.source.langAct[1] : "");
5992 if (text == "spell_hand")
5993 {
5994 string[] list2 = Lang.GetList("attack" + race.meleeStyle.IsEmpty("Touch"));
5995 string @ref = text2.lang(list2[4]);
5996 Say(tc.IsPCParty ? "cast_hand_ally" : "cast_hand", this, tc, @ref, tc.IsPCParty ? list2[1] : list2[2]);
5997 }
5998 else
5999 {
6000 Say(text, this, tc, text2.IsEmpty() ? "" : text2.lang());
6001 }
6002 if (a.source.id == 6630)
6003 {
6004 Talk("insult_" + (base.IsMale ? "m" : "f"));
6005 }
6006 }
6007 switch (cost.type)
6008 {
6009 case Act.CostType.MP:
6010 if (Evalue(1421) >= 2 && base.hp <= MaxHP / (9 - Evalue(1421) * 2))
6011 {
6012 num6 /= 2;
6013 }
6014 PlayEffect("cast");
6015 mana.Mod(-num6);
6016 if (isDead)
6017 {
6018 return true;
6019 }
6020 elements.ModExp(304, Mathf.Clamp(num6 * 2, 1, 200));
6021 break;
6022 case Act.CostType.SP:
6023 stamina.Mod(-num6);
6024 ignoreSPAbsorb = true;
6025 break;
6026 }
6027 if (a is Spell && GetCondition<ConSilence>() != null)
6028 {
6029 Say("cast_silence", this);
6030 return true;
6031 }
6032 if (isDead)
6033 {
6034 return true;
6035 }
6036 int spellExp = elements.GetSpellExp(this, a, num5);
6037 if (EClass.rnd(100) >= CalcCastingChance(a, i) && !EClass.debug.godMode)
6038 {
6039 Say("fizzle", this);
6040 PlayEffect("fizzle");
6041 PlaySound("fizzle");
6042 if (cost.cost > 0 && a.source.lvFactor > 0)
6043 {
6044 ModExp(a.id, spellExp / 5);
6045 }
6046 RemoveCondition<ConInvisibility>();
6047 return true;
6048 }
6049 bool flag2 = true;
6050 if (a.source.cooldown > 0 && (!IsPC || !a.source.tag.Contains("CD_npc")))
6051 {
6052 AddCooldown(a.id, a.source.cooldown);
6053 }
6054 if (HasTalk("phrase_" + a.source.alias))
6055 {
6056 EClass.player.forceTalk = true;
6057 Talk("phrase_" + a.source.alias);
6058 }
6059 if (pt)
6060 {
6061 Act.forcePt = true;
6062 if (flag)
6063 {
6064 ForeachEnemy(delegate(Chara c)
6065 {
6066 a.Perform(this, c, c.pos);
6067 });
6068 }
6069 else
6070 {
6071 ForeachParty(delegate(Chara c)
6072 {
6073 a.Perform(this, c, c.pos);
6074 });
6075 }
6076 Act.forcePt = false;
6077 }
6078 else
6079 {
6080 for (int j = 0; j < num3; j++)
6081 {
6082 if (a.TargetType != TargetType.SelfParty && tc != null && !tc.IsAliveInCurrentZone)
6083 {
6084 break;
6085 }
6086 ActEffect.RapidCount = j;
6087 ActEffect.RapidDelay = a.RapidDelay;
6088 flag2 = a.Perform(this, tc, pos);
6089 }
6090 }
6091 if (flag2 && !isDead)
6092 {
6093 if (cost.cost > 0 && a.source.lvFactor > 0)
6094 {
6095 ModExp(a.id, spellExp);
6096 }
6097 if (a.source.alias.StartsWith("sword_"))
6098 {
6099 ModExp(101, 50);
6100 }
6101 }
6102 ActEffect.RapidCount = 0;
6103 if (flag2 && !a.source.tag.Contains("keepInvisi") && EClass.rnd(2) == 0)
6104 {
6105 RemoveCondition<ConInvisibility>();
6106 RemoveCondition<ConDark>();
6107 }
6108 if (!base.IsPCFactionOrMinion && a.HasTag("specialAbility"))
6109 {
6110 string name = a.Name;
6111 renderer.Say("| " + name + " ");
6112 }
6113 return flag2;
6114 void ForeachEnemy(Action<Chara> action)
6115 {
6116 if (_pts.Count == 0)
6117 {
6118 for (int num10 = EClass._map.charas.Count - 1; num10 >= 0; num10--)
6119 {
6120 Chara chara3 = EClass._map.charas[num10];
6121 if (chara3 != this && CanSeeLos(chara3) && chara3.IsHostile(this))
6122 {
6123 _pts.Add(chara3);
6124 }
6125 }
6126 }
6127 for (int num11 = _pts.Count - 1; num11 >= 0; num11--)
6128 {
6129 action(_pts[num11]);
6130 }
6131 }
6132 void ForeachParty(Action<Chara> action)
6133 {
6134 if (_pts.Count == 0)
6135 {
6136 if (IsPCParty)
6137 {
6138 for (int num7 = EClass.pc.party.members.Count - 1; num7 >= 0; num7--)
6139 {
6140 Chara chara = EClass.pc.party.members[num7];
6141 if (chara == this || chara.host != null || CanSeeLos(chara))
6142 {
6143 _pts.Add(chara);
6144 }
6145 }
6146 }
6147 else
6148 {
6149 for (int num8 = EClass._map.charas.Count - 1; num8 >= 0; num8--)
6150 {
6151 Chara chara2 = EClass._map.charas[num8];
6152 if ((chara2 == this || (chara2.IsFriendOrAbove(this) && CanSeeLos(chara2))) && (chara2 == tc || _pts.Count < 3 || EClass.rnd(_pts.Count * _pts.Count) > 6))
6153 {
6154 _pts.Add(chara2);
6155 }
6156 }
6157 }
6158 }
6159 for (int num9 = _pts.Count - 1; num9 >= 0; num9--)
6160 {
6161 action(_pts[num9]);
6162 }
6163 }
6164 }
6165
6166 public int EvalueRiding()
6167 {
6168 if (ride != null && ride.HasCondition<ConTransmuteBroom>() && HasElement(1417))
6169 {
6170 return 25 + Evalue(226) * 125 / 100;
6171 }
6172 return Evalue(226);
6173 }
6174
6175 public int CalcCastingChance(Element e, int num = 1)
6176 {
6177 if (!(e is Spell))
6178 {
6179 return 100;
6180 }
6181 if (!IsPC)
6182 {
6183 int num2 = 95;
6184 if (host != null)
6185 {
6186 if (host.ride == this)
6187 {
6188 return num2 * 100 / (100 + 300 / Mathf.Max(5, 10 + host.EvalueRiding()));
6189 }
6190 if (host.parasite == this)
6191 {
6192 return num2 * 100 / (100 + 300 / Mathf.Max(5, 10 + host.Evalue(227)));
6193 }
6194 }
6195 return num2;
6196 }
6197 int num3 = Evalue(304);
6198 if (!IsPCFaction)
6199 {
6200 num3 = Mathf.Max(num3, base.LV + 5);
6201 }
6202 int num4 = 0;
6203 int num5 = 0;
6204 bool num6 = GetArmorSkill() == 122;
6205 AttackStyle attackStyle = body.GetAttackStyle();
6206 if (num6)
6207 {
6208 num4 = 20 - Evalue(122) / 5;
6209 num5 += 10 - Evalue(1654) * 4;
6210 }
6211 else
6212 {
6213 num4 = 10 - Evalue(120) / 5;
6214 }
6215 if (num4 < 5)
6216 {
6217 num4 = 5;
6218 }
6219 if (ride != null)
6220 {
6221 num4 += 5;
6222 }
6223 if (parasite != null)
6224 {
6225 num4 += 10;
6226 }
6227 if (attackStyle == AttackStyle.TwoWield)
6228 {
6229 num4 += 5;
6230 }
6231 if (attackStyle == AttackStyle.Shield)
6232 {
6233 num4 += 10;
6234 num5 += 20 - Evalue(1654) * 8;
6235 }
6236 if (isConfused)
6237 {
6238 num4 += 10000;
6239 }
6240 if (HasCondition<ConDim>())
6241 {
6242 num4 += ((Evalue(1654) >= 3) ? 1500 : 2500);
6243 }
6244 if (num > 1)
6245 {
6246 num4 += 5 * num;
6247 }
6248 if (num5 < 0)
6249 {
6250 num5 = 0;
6251 }
6252 return Mathf.Clamp(100 + e.Value - 10 - e.source.LV * e.source.cost[0] * num4 / Mathf.Max(10 + num3 * 10, 1), 0, 100 - num5);
6253 }
6254
6255 public void DoAI(int wait, Action onPerform)
6256 {
6257 SetAI(new DynamicAIAct("", delegate
6258 {
6259 onPerform();
6260 return true;
6261 })
6262 {
6263 wait = wait
6264 });
6265 }
6266
6267 public void Cuddle(Chara c, bool headpat = false)
6268 {
6269 Talk("goodBoy");
6270 Say(headpat ? "headpat" : "cuddle", this, c);
6271 c.ShowEmo(Emo.love);
6272 if (EClass.rnd(IsPC ? 100 : 5000) == 0)
6273 {
6274 c.MakeEgg();
6275 }
6276 if (headpat && this != c)
6277 {
6278 if (c.interest > 0)
6279 {
6280 c.ModAffinity(EClass.pc, 1 + EClass.rnd(3));
6281 c.interest -= 20 + EClass.rnd(10);
6282 }
6284 {
6285 foreach (Chara member in party.members)
6286 {
6287 if (!member.IsPC && CanSeeLos(member))
6288 {
6289 member.AddCondition<ConEuphoric>(100 + Evalue(6904) * 5);
6290 }
6291 }
6292 }
6293 }
6294 if (c.Evalue(1221) > 0)
6295 {
6296 int ele = ((c.MainElement == Element.Void) ? 924 : c.MainElement.id);
6297 if (c.id == "hedgehog_ether")
6298 {
6299 ele = 922;
6300 }
6301 Say("reflect_thorne", c, this);
6302 DamageHP(10L, ele, Power, AttackSource.Condition);
6303 }
6304 }
6305
6306 public Chara SetEnemy(Chara c = null)
6307 {
6308 enemy = c;
6309 if (c == null)
6310 {
6311 if (ai is GoalCombat)
6312 {
6313 ai.Cancel();
6314 }
6315 }
6316 else
6317 {
6318 calmCheckTurn = 10 + EClass.rnd(30);
6319 }
6320 return c;
6321 }
6322
6323 public void TrySetEnemy(Chara c)
6324 {
6325 if ((!IsPC || !EClass.game.config.autoCombat.bDontChangeTarget) && (enemy == null || (EClass.rnd(5) == 0 && Dist(c) <= 1)) && ((!IsPCFaction && !IsPCFactionMinion) || (!c.IsPCFaction && !c.IsPCFactionMinion)) && (hostility != Hostility.Enemy || c.hostility != Hostility.Enemy) && (!c.IsPC || hostility < Hostility.Neutral))
6326 {
6327 SetEnemy(c);
6328 }
6329 }
6330
6331 private void GoHostile(Card _tg)
6332 {
6333 if (enemy == null && !IsPC)
6334 {
6335 if (GetInt(106) == 0)
6336 {
6337 TalkTopic("aggro");
6338 }
6339 if (OriginalHostility != Hostility.Enemy)
6340 {
6341 ShowEmo(Emo.angry);
6342 }
6343 SetEnemy(_tg.Chara);
6344 }
6345 if (!IsPCFaction && !IsPCFactionMinion && (_tg.IsPCFaction || _tg.IsPCFactionMinion))
6346 {
6347 if (hostility >= Hostility.Neutral)
6348 {
6349 Say("angry", this);
6350 }
6351 hostility = Hostility.Enemy;
6352 }
6353 }
6354
6355 public void DoHostileAction(Card _tg, bool immediate = false)
6356 {
6357 if (_tg == null || !_tg.isChara)
6358 {
6359 return;
6360 }
6361 Chara chara = _tg.Chara;
6362 if (chara.IsPC)
6363 {
6364 EClass.pc.combatCount = 10;
6365 }
6366 if (!chara.IsAliveInCurrentZone || !IsAliveInCurrentZone || chara == this)
6367 {
6368 return;
6369 }
6370 if ((IsPCFaction || IsPCFactionMinion) && (chara.IsPCFaction || chara.IsPCFactionMinion))
6371 {
6372 chara.Say("frown", this, chara);
6373 }
6374 else
6375 {
6376 if (EClass._zone.IsRegion)
6377 {
6378 return;
6379 }
6380 if (IsPC)
6381 {
6382 if (chara.IsFriendOrAbove() && !immediate)
6383 {
6384 chara.Say("frown", this, chara);
6385 chara.ShowEmo(Emo.sad);
6386 chara.hostility = Hostility.Neutral;
6387 return;
6388 }
6389 if (!chara.IsPCFaction && chara.hostility >= Hostility.Neutral && !EClass._zone.IsPCFaction)
6390 {
6391 bool flag = chara.id == "fanatic";
6392 if (EClass.rnd(4) == 0 || flag)
6393 {
6394 chara.Say("callHelp", chara);
6395 chara.CallHelp(this, flag);
6396 }
6397 }
6398 if (chara.hostility <= Hostility.Enemy)
6399 {
6400 foreach (Chara member in EClass.pc.party.members)
6401 {
6402 if (member != EClass.pc && member.enemy == null && member.CanSee(chara))
6403 {
6404 member.SetEnemy(chara);
6405 }
6406 }
6407 }
6408 }
6409 else if (chara.IsPC && hostility <= Hostility.Enemy)
6410 {
6411 foreach (Chara member2 in EClass.pc.party.members)
6412 {
6413 if (member2 != EClass.pc && member2.enemy == null && member2.CanSee(this))
6414 {
6415 member2.SetEnemy(this);
6416 }
6417 }
6418 }
6419 if (chara.calmCheckTurn <= 0 || IsPC)
6420 {
6421 chara.calmCheckTurn = (IsPC ? (20 + EClass.rnd(30)) : (10 + EClass.rnd(10)));
6422 }
6423 if (hostility != Hostility.Enemy || chara.hostility != Hostility.Enemy)
6424 {
6425 GoHostile(chara);
6426 chara.GoHostile(this);
6427 if (base.isHidden && !chara.CanSee(this) && !chara.IsDisabled && !chara.IsPCParty && !chara.IsPCPartyMinion && EClass.rnd(10 + Dist(chara) * 10) == 0)
6428 {
6429 Thing t = ThingGen.Create("49");
6430 ActThrow.Throw(chara, pos, t);
6431 Act.TC = chara;
6432 }
6433 }
6434 }
6435 }
6436
6437 public void CallHelp(Chara tg, bool fanatic = false)
6438 {
6439 foreach (Chara chara in EClass._map.charas)
6440 {
6441 if (!chara.IsPCFaction && chara.OriginalHostility == OriginalHostility && (fanatic || Dist(chara) <= 6) && (EClass.rnd(3) != 0 || fanatic))
6442 {
6443 chara.GoHostile(tg);
6444 }
6445 }
6446 }
6447
6448 public bool FindNewEnemy()
6449 {
6450 if (EClass._zone.isPeace && base.IsPCFactionOrMinion && !IsPC)
6451 {
6452 return false;
6453 }
6454 if (enemy != null && !enemy.IsAliveInCurrentZone)
6455 {
6456 enemy = null;
6457 }
6458 if (enemy != null)
6459 {
6460 return false;
6461 }
6462 if (IsPCParty && EClass.pc.isHidden && base.isHidden)
6463 {
6464 return false;
6465 }
6466 bool flag = enemy != null || ai is GoalCombat;
6467 int num = (base.PER + Evalue(210) * 2) * ((!flag) ? 1 : 2);
6468 bool flag2 = IsPCParty && !IsPC && EClass.game.config.tactics.dontWander;
6469 bool flag3 = !IsPCParty;
6470 Chara chara = null;
6471 int num2 = 9999;
6472 for (int i = 0; i < EClass._map.charas.Count; i++)
6473 {
6474 Chara chara2 = EClass._map.charas[i];
6475 if (chara2 == this || !IsHostile(chara2) || !CanSee(chara2))
6476 {
6477 continue;
6478 }
6479 int num3 = Dist(chara2);
6480 int num4 = GetSightRadius() + (flag ? 1 : 0);
6481 if (num3 > num4)
6482 {
6483 continue;
6484 }
6485 if (flag3 && EClass.rnd(chara2.Evalue(152) + 5) * (100 + num3 * num3 * 10) / 100 > EClass.rnd(num))
6486 {
6487 if (this == pos.FirstChara)
6488 {
6489 chara2.ModExp(152, Mathf.Clamp((num - chara2.Evalue(152)) / 2, 1, Mathf.Max(30 - stealthSeen * 2, 1)));
6490 }
6491 stealthSeen++;
6492 }
6493 else if (CanSeeLos(chara2) && (!flag2 || EClass.pc.isBlind || EClass.pc.CanSeeLos(chara2)) && (!IsPCFaction || EClass.pc.ai.ShouldAllyAttack(chara2)))
6494 {
6495 if (!IsPCParty)
6496 {
6497 DoHostileAction(chara2);
6498 enemy = chara2;
6499 return true;
6500 }
6501 if (num3 < num2)
6502 {
6503 num2 = num3;
6504 chara = chara2;
6505 }
6506 }
6507 }
6508 if (chara != null)
6509 {
6510 DoHostileAction(chara);
6511 enemy = chara;
6512 return true;
6513 }
6514 return false;
6515 }
6516
6518 {
6519 for (int i = 0; i < EClass._map.charas.Count; i++)
6520 {
6521 Chara chara = EClass._map.charas[i];
6522 if (chara != this && chara != enemy && IsHostile(chara) && Dist(chara) <= 1 && CanInteractTo(chara.pos))
6523 {
6524 DoHostileAction(chara);
6525 enemy = chara;
6526 return true;
6527 }
6528 }
6529 return false;
6530 }
6531
6532 public bool IsHostile()
6533 {
6534 return hostility <= Hostility.Enemy;
6535 }
6536
6537 public bool IsHostile(Chara c)
6538 {
6539 if (c == null)
6540 {
6541 return false;
6542 }
6543 if (base.IsPCFactionOrMinion)
6544 {
6545 if ((c == EClass.pc.enemy && !c.IsPCFactionOrMinion) || c.hostility <= Hostility.Enemy)
6546 {
6547 return true;
6548 }
6549 }
6550 else
6551 {
6552 if (trait is TraitGuard && c.IsPCParty && EClass.player.IsCriminal && EClass._zone.instance == null)
6553 {
6554 return true;
6555 }
6556 if (OriginalHostility >= Hostility.Friend)
6557 {
6558 if (hostility <= Hostility.Enemy && c.IsPCFactionOrMinion)
6559 {
6560 return true;
6561 }
6562 if (c.hostility <= Hostility.Enemy && c.OriginalHostility == Hostility.Enemy)
6563 {
6564 return true;
6565 }
6566 }
6567 else if (OriginalHostility <= Hostility.Enemy && (c.IsPCFactionOrMinion || (c.OriginalHostility != Hostility.Enemy && c.hostility >= Hostility.Friend)))
6568 {
6569 return true;
6570 }
6571 }
6572 return false;
6573 }
6574
6575 public bool IsNeutral()
6576 {
6577 return hostility == Hostility.Neutral;
6578 }
6579
6580 public bool IsNeutralOrAbove()
6581 {
6582 return hostility >= Hostility.Neutral;
6583 }
6584
6585 public bool IsBranchMember()
6586 {
6587 if (faction == EClass.Home)
6588 {
6589 return homeZone == EClass.game.activeZone;
6590 }
6591 return false;
6592 }
6593
6594 public bool IsHomeMember()
6595 {
6596 return faction == EClass.Home;
6597 }
6598
6599 public bool IsInHomeZone()
6600 {
6601 return EClass.game.activeZone == currentZone;
6602 }
6603
6604 public bool IsInSpot<T>() where T : TraitSpot
6605 {
6606 foreach (T item in EClass._map.props.installed.traits.List<T>())
6607 {
6608 foreach (Point item2 in item.ListPoints())
6609 {
6610 if (pos.Equals(item2))
6611 {
6612 return true;
6613 }
6614 }
6615 }
6616 return false;
6617 }
6618
6619 public bool IsGuest()
6620 {
6621 return memberType == FactionMemberType.Guest;
6622 }
6623
6624 public bool IsFriendOrAbove()
6625 {
6626 return hostility >= Hostility.Friend;
6627 }
6628
6629 public bool IsFriendOrAbove(Chara c)
6630 {
6631 if (base.IsPCFactionOrMinion || IsFriendOrAbove())
6632 {
6634 {
6635 return true;
6636 }
6637 }
6638 else if (IsHostile() && c.IsHostile())
6639 {
6640 return true;
6641 }
6642 return false;
6643 }
6644
6646 {
6647 CardRenderer cardRenderer = renderer;
6648 CharaRenderer charaRenderer = new CharaRenderer();
6649 if (source.skinAntiSpider != 0 && EClass.core.config.game.antiSpider)
6650 {
6651 base.idSkin = source.skinAntiSpider;
6652 }
6653 if (host != null)
6654 {
6655 charaRenderer.pccData = PCCData.Create("ride");
6656 string idPart = base.c_idRidePCC.IsEmpty(EClass.core.pccs.sets["ride"].map["body"].map.Keys.First());
6657 charaRenderer.pccData.SetPart("body", "ride", idPart);
6658 charaRenderer.pccData.ride = EClass.core.pccs.GetRideData(idPart);
6659 }
6660 else
6661 {
6662 foreach (Condition condition in conditions)
6663 {
6664 RendererReplacer rendererReplacer = condition.GetRendererReplacer();
6665 if (rendererReplacer != null)
6666 {
6667 charaRenderer.replacer = rendererReplacer;
6668 charaRenderer.data = rendererReplacer.data;
6669 break;
6670 }
6671 }
6672 if (charaRenderer.replacer == null)
6673 {
6674 charaRenderer.pccData = pccData;
6675 }
6676 }
6677 renderer = charaRenderer;
6678 renderer.SetOwner(this);
6679 if (cardRenderer != null)
6680 {
6681 renderer.SetFirst(first: false, cardRenderer.position);
6682 }
6683 return charaRenderer;
6684 }
6685
6686 public void SetPCCState(PCCState state)
6687 {
6688 if (IsPCC)
6689 {
6690 PCC.Get(pccData).Build(state);
6691 }
6692 }
6693
6694 public override Sprite GetSprite(int dir = 0)
6695 {
6696 if (IsPCC)
6697 {
6698 PCC pCC = PCC.Get(pccData);
6699 pCC.Build();
6700 return pCC.variation.idle[0, 0];
6701 }
6702 if (spriteReplacer != null)
6703 {
6704 return spriteReplacer.data.GetSprite();
6705 }
6706 return sourceCard.GetSprite(0, (sourceCard._tiles.Length > 1) ? ((base.idSkin != 0 || source.staticSkin) ? base.idSkin : (base.uid % sourceCard._tiles.Length / 2 * 2 + ((!base.IsMale) ? 1 : 0))) : 0);
6707 }
6708
6709 public void SetTempHand(int right = 0, int left = 0)
6710 {
6711 if (IsPC && !IsPC)
6712 {
6713 pccData.tempRight = EClass.scene.screenElin.renderTempEQ.ConvertTile(right);
6714 pccData.tempLeft = EClass.scene.screenElin.renderTempEQ.ConvertTile(left);
6715 }
6716 }
6717
6718 public override SubPassData GetSubPassData()
6719 {
6720 if (IsPCC)
6721 {
6722 if (IsDeadOrSleeping || (!EClass.player.altHeldPos && parent is Chara))
6723 {
6725 }
6726 }
6727 else if (conSleep != null && host == null && pos.Equals(EClass.pc.pos) && IsHuman && (GetBool(123) || affinity.CanSleepBeside()))
6728 {
6729 return EClass.setting.pass.subDead;
6730 }
6731 return SubPassData.Default;
6732 }
6733
6734 public override void SetRenderParam(RenderParam p)
6735 {
6736 p.mat = base.material;
6737 p.matColor = base.colorInt;
6738 if (!renderer.usePass)
6739 {
6740 return;
6741 }
6742 if (renderer.replacer != null)
6743 {
6744 p.tile = renderer.replacer.tile * ((!flipX) ? 1 : (-1));
6745 }
6746 else if (source._tiles_snow.Length != 0 && EClass._zone.IsSnowCovered)
6747 {
6748 if (source._tiles_snow.Length > 1)
6749 {
6750 int num = ((base.idSkin != 0 || source.staticSkin) ? base.idSkin : (base.uid % source._tiles_snow.Length / 2 * 2 + ((!base.IsMale) ? 1 : 0)));
6751 p.tile = source._tiles_snow[(num < source._tiles_snow.Length) ? num : 0] * ((!flipX) ? 1 : (-1));
6752 }
6753 else
6754 {
6755 p.tile = source._tiles_snow[0] * ((!flipX) ? 1 : (-1));
6756 }
6757 }
6758 else if (sourceCard._tiles.Length > 1)
6759 {
6760 int num2 = ((base.idSkin != 0 || source.staticSkin) ? base.idSkin : (base.uid % sourceCard._tiles.Length / 2 * 2 + ((!base.IsMale) ? 1 : 0)));
6761 p.tile = sourceCard._tiles[(num2 >= 0 && num2 < sourceCard._tiles.Length) ? num2 : 0] * ((!flipX) ? 1 : (-1));
6762 }
6763 else
6764 {
6765 p.tile = sourceCard._tiles[0] * ((!flipX) ? 1 : (-1));
6766 }
6767 p.dir = base.dir;
6768 }
6769
6770 public override string GetHoverText()
6771 {
6772 string text = base.Name;
6773 if (IsFriendOrAbove())
6774 {
6775 text = text.TagColor(EClass.Colors.colorFriend);
6776 }
6777 else if (IsHostile())
6778 {
6779 text = text.TagColor(EClass.Colors.colorHostile);
6780 }
6781 int num = 2;
6782 int lV = EClass.pc.LV;
6783 if (base.LV >= lV * 5)
6784 {
6785 num = 0;
6786 }
6787 else if (base.LV >= lV * 2)
6788 {
6789 num = 1;
6790 }
6791 else if (base.LV <= lV / 4)
6792 {
6793 num = 4;
6794 }
6795 else if (base.LV <= lV / 2)
6796 {
6797 num = 3;
6798 }
6799 string text2 = Lang.GetList("lvComparison")[num];
6800 text2 = (" (" + text2 + ") ").TagSize(14).TagColor(EClass.Colors.gradientLVComparison.Evaluate(0.25f * (float)num));
6801 string s = (IsFriendOrAbove() ? "HostilityAlly" : (IsNeutral() ? "HostilityNeutral" : "HostilityEnemy"));
6802 s = (" (" + s.lang() + ") ").TagSize(14);
6803 s = "";
6804 if (memberType == FactionMemberType.Guest)
6805 {
6806 s += (" (" + "guest".lang() + ") ").TagSize(14);
6807 }
6808 else if (memberType == FactionMemberType.Livestock)
6809 {
6810 s += (" (" + "livestock".lang() + ") ").TagSize(14);
6811 }
6812 if (!EClass.pc.IsMoving)
6813 {
6814 if (EClass.pc.HasHigherGround(this))
6815 {
6816 text2 += "lowerGround".lang();
6817 }
6818 else if (HasHigherGround(EClass.pc))
6819 {
6820 text2 += "higherGround".lang();
6821 }
6822 }
6823 if (Evalue(1232) > 0)
6824 {
6825 text2 = "milkBaby".lang().TagSize(14) + text2;
6826 }
6827 if (Guild.Fighter.ShowBounty(this) && Guild.Fighter.HasBounty(this))
6828 {
6829 text2 = "hasBounty".lang().TagSize(14) + text2;
6830 }
6831 if (EClass.pc.HasElement(481))
6832 {
6833 text2 += ("(" + faith.Name + ")").TagSize(14);
6834 }
6835 if (EClass.pc.HasElement(6607))
6836 {
6837 s += CraftUtil.GetBloodText(this).TagSize(14).TagColor(EClass.Colors.colorBlood);
6838 }
6839 return text + text2 + s;
6840 }
6841
6842 public override string GetHoverText2()
6843 {
6844 string text = "";
6845 if (knowFav)
6846 {
6847 text += Environment.NewLine;
6848 text = text + "<size=14>" + "favgift".lang(GetFavCat().GetName().ToLower(), GetFavFood().GetName()) + "</size>";
6849 }
6850 string text2 = "";
6852 {
6853 text2 += Environment.NewLine;
6854 text2 = text2 + "Lv:" + base.LV + " HP:" + base.hp + "/" + MaxHP + " MP:" + mana.value + "/" + mana.max + " DV:" + DV + " PV:" + PV + " Hunger:" + hunger.value;
6855 text2 += Environment.NewLine;
6856 text2 = text2 + "Global:" + IsGlobal + " AI:" + ai?.ToString() + " " + source.tactics.IsEmpty(EClass.sources.tactics.map.TryGetValue(id)?.id ?? EClass.sources.tactics.map.TryGetValue(job.id)?.id ?? "predator");
6857 text2 += Environment.NewLine;
6858 text2 = text2 + base.uid + IsMinion + "/" + base.c_uidMaster + "/" + master;
6859 text2 = text2 + " dir:" + base.dir + " skin:" + base.idSkin + " scaled:" + base.isScaled;
6860 }
6861 if (EClass.pc.held?.trait is TraitWhipLove && IsPCFaction)
6862 {
6863 text2 += Environment.NewLine;
6864 text2 += "<size=14>";
6865 foreach (Hobby item in ListWorks())
6866 {
6867 text2 = text2 + item.Name + ", ";
6868 }
6869 foreach (Hobby item2 in ListHobbies())
6870 {
6871 text2 = text2 + item2.Name + ", ";
6872 }
6873 text2 = text2.TrimEnd(", ".ToCharArray()) + "</size>";
6874 }
6875 string text3 = "";
6876 IEnumerable<BaseStats> enumerable = conditions.Concat((!IsPCFaction) ? new BaseStats[0] : new BaseStats[2] { hunger, stamina });
6877 if (enumerable.Count() > 0)
6878 {
6879 text3 += Environment.NewLine;
6880 text3 += "<size=14>";
6881 int num = 0;
6882 foreach (BaseStats item3 in enumerable)
6883 {
6884 string text4 = item3.GetPhaseStr();
6885 if (text4.IsEmpty() || text4 == "#")
6886 {
6887 continue;
6888 }
6889 Color c = Color.white;
6890 switch (item3.source.group)
6891 {
6892 case "Bad":
6893 case "Debuff":
6894 case "Disease":
6896 break;
6897 case "Buff":
6899 break;
6900 }
6902 {
6903 text4 = text4 + "(" + item3.GetValue() + ")";
6904 if (resistCon != null && resistCon.ContainsKey(item3.id))
6905 {
6906 text4 = text4 + "{" + resistCon[item3.id] + "}";
6907 }
6908 }
6909 num++;
6910 text3 = text3 + text4.TagColor(c) + ", ";
6911 }
6912 if (num == 0)
6913 {
6914 text3 = "";
6915 }
6916 else
6917 {
6918 text = "";
6919 text3 = text3.TrimEnd(", ".ToCharArray()) + "</size>";
6920 }
6921 }
6923 {
6924 text3 += Environment.NewLine;
6925 foreach (ActList.Item item4 in ability.list.items)
6926 {
6927 text3 = text3 + item4.act.Name + ", ";
6928 }
6929 text3 = text3.TrimEnd(", ".ToCharArray());
6930 }
6931 return text + text2 + text3;
6932 }
6933
6934 public string GetTopicText(string topic = "calm")
6935 {
6936 string key = source.idText.IsEmpty(id);
6937 if (id == "littleOne" && EClass._zone is Zone_LittleGarden)
6938 {
6939 key = "littleOne2";
6940 }
6941 SourceCharaText.Row row = EClass.sources.charaText.map.TryGetValue(key);
6942 if (row == null)
6943 {
6944 return null;
6945 }
6946 string text = row.GetText(topic, returnNull: true);
6947 if (text.IsEmpty())
6948 {
6949 return null;
6950 }
6951 if (text.StartsWith("@"))
6952 {
6953 row = EClass.sources.charaText.map.TryGetValue(text.Replace("@", ""));
6954 if (row == null)
6955 {
6956 return null;
6957 }
6958 text = row.GetText(topic, returnNull: true);
6959 if (text.IsEmpty())
6960 {
6961 return null;
6962 }
6963 }
6964 return text.Split(Environment.NewLine.ToCharArray()).RandomItem();
6965 }
6966
6967 public string TalkTopic(string topic = "calm")
6968 {
6969 if (host == null && !IsInActiveZone)
6970 {
6971 return null;
6972 }
6973 if (!isSynced && (host == null || !host.isSynced) && topic != "dead")
6974 {
6975 return null;
6976 }
6977 if (IsPCParty)
6978 {
6979 int num = EClass.pc.party.members.Count - 1;
6980 switch (topic)
6981 {
6982 case "calm":
6983 if (EClass.rnd(num * 5) != 0)
6984 {
6985 return null;
6986 }
6987 break;
6988 case "aggro":
6989 if (EClass.rnd(num * 10) != 0)
6990 {
6991 return null;
6992 }
6993 break;
6994 case "kill":
6995 if (EClass.rnd(num * 3) != 0)
6996 {
6997 return null;
6998 }
6999 break;
7000 case "fov":
7001 return null;
7002 }
7003 }
7004 string topicText = GetTopicText(topic);
7005 if (topicText.IsEmpty())
7006 {
7007 return null;
7008 }
7009 string text = "_bracketTalk".lang();
7010 bool flag = topicText.StartsWith("*");
7011 bool flag2 = topicText.StartsWith("(");
7012 bool flag3 = topicText.StartsWith(text) || (topicText.Length > 0 && topicText[0] == text[0]) || topicText[0] == '“';
7013 topicText = ApplyTone(topicText);
7014 topicText = topicText.Replace("~", "*");
7015 Msg.SetColor(flag2 ? Msg.colors.Thinking : (flag3 ? Msg.colors.Talk : Msg.colors.Ono));
7016 Msg.Say(StripTalkSpeiclaCharacters(topicText.Replace("&", "")));
7017 if (topic == "dead")
7018 {
7019 EClass.ui.popGame.PopText(ApplyNewLine(topicText.StripBrackets()), null, "PopTextDead", default(Color), pos.Position() + EClass.setting.render.tc.textPosDead);
7020 }
7021 else if (flag || flag3 || flag2)
7022 {
7023 (host ?? this).renderer.Say(ApplyNewLine(topicText.StripBrackets()), default(Color), IsPCParty ? 0.6f : 0f);
7024 }
7025 return topicText;
7026 }
7027
7028 public override Sprite GetImageSprite()
7029 {
7030 return GetSprite();
7031 }
7032
7034 {
7035 memberType = type;
7036 }
7037
7038 public void ShowDialog()
7039 {
7040 Zone_Nymelle zone_Nymelle = EClass._zone as Zone_Nymelle;
7041 if (conSuspend != null && IsPCParty)
7042 {
7043 RemoveCondition<ConSuspend>();
7044 }
7045 if (LayerDrama.forceJump == null)
7046 {
7047 if (IsDeadOrSleeping)
7048 {
7049 ShowDialog("_chara", "sleep");
7050 return;
7051 }
7052 if (EClass.pc.isHidden && !CanSee(EClass.pc))
7053 {
7054 ShowDialog("_chara", "invisible");
7055 return;
7056 }
7057 if (!IsPC && !EClass.player.codex.DroppedCard(id) && affinity.CanGiveCard())
7058 {
7060 ShowDialog("_chara", "give_card");
7061 Thing thing = ThingGen.Create("figure");
7062 thing.MakeFigureFrom(id);
7063 EClass.player.DropReward(thing);
7064 thing = ThingGen.Create("figure3");
7065 thing.MakeFigureFrom(id);
7066 EClass.player.DropReward(thing);
7067 return;
7068 }
7069 if (GetInt(71) == -2)
7070 {
7071 ShowDialog("_chara", "give_lunch");
7072 Thing t = CraftUtil.MakeLoveLunch(this);
7074 SetInt(71, EClass.world.date.GetRaw() + 43200);
7075 return;
7076 }
7077 if (base.isRestrained)
7078 {
7079 ShowDialog("_chara", "strain");
7080 return;
7081 }
7082 if (IsEscorted())
7083 {
7084 ShowDialog("_chara", "escort");
7085 return;
7086 }
7087 if (EClass._zone is Zone_Music)
7088 {
7089 ShowDialog("_chara", "party");
7090 return;
7091 }
7092 if (EClass.game.quests.OnShowDialog(this))
7093 {
7094 return;
7095 }
7096 switch (id)
7097 {
7098 case "loytel":
7099 {
7101 {
7102 EClass.game.quests.Get("pre_debt_runaway").Complete();
7103 EClass.player.flags.loytelEscaped = false;
7104 EClass.game.quests.Add("debt", "loytel");
7105 ShowDialog("loytel", "loytelEscaped");
7106 return;
7107 }
7108 QuestDebt questDebt = EClass.game.quests.Get<QuestDebt>();
7109 if (questDebt != null && questDebt.paid)
7110 {
7111 questDebt.stage++;
7112 if (questDebt.stage > 7)
7113 {
7114 questDebt.stage = 7;
7115 }
7116 ShowDialog("loytel", "debt" + questDebt.stage);
7117 return;
7118 }
7119 break;
7120 }
7121 case "farris":
7122 if (EClass._zone.id == "startVillage" || EClass._zone.id == "startVillage3" || EClass.game.IsSurvival)
7123 {
7124 ShowDialog("farris");
7125 return;
7126 }
7127 switch (EClass.game.quests.GetPhase<QuestExploration>())
7128 {
7129 case -1:
7130 ShowDialog("farris", "nymelle_noQuest");
7131 break;
7132 case 0:
7133 ShowDialog("farris", "nymelle_first");
7134 break;
7135 case 1:
7136 ShowDialog("farris", "home_first");
7137 break;
7138 default:
7139 ShowDialog("farris");
7140 break;
7141 }
7142 return;
7143 case "ashland":
7144 ShowDialog("ashland");
7145 return;
7146 case "fiama":
7147 if (zone_Nymelle != null && zone_Nymelle.IsCrystalLv && EClass.game.quests.GetPhase<QuestExploration>() == 3)
7148 {
7149 SoundManager.ForceBGM();
7150 LayerDrama.ActivateMain("mono", "nymelle_crystal");
7151 }
7153 {
7155 {
7156 EClass.player.flags.fiamaFirstDream = true;
7157 ShowDialog("fiama", "firstDream");
7158 }
7160 {
7161 ShowDialog("fiama", "giveStoryBook").SetOnKill(delegate
7162 {
7163 EClass.player.flags.fiamaStoryBookGiven = true;
7164 EClass.player.DropReward(ThingGen.Create("book_story"));
7165 });
7166 }
7167 else
7168 {
7169 ShowDialog("fiama");
7170 }
7171 }
7172 else
7173 {
7174 ShowDialog("fiama");
7175 }
7176 return;
7177 case "big_sister":
7179 {
7180 ShowDialog("big_sister", "little_saved");
7181 EClass.player.flags.little_saved = false;
7182 return;
7183 }
7185 {
7186 ShowDialog("big_sister", "little_dead");
7187 EClass.player.flags.little_killed = false;
7188 return;
7189 }
7190 break;
7191 }
7192 if (trait is TraitGuildDoorman)
7193 {
7194 string tag = ((trait is TraitDoorman_Fighter) ? "fighter" : ((trait is TraitDoorman_Mage) ? "mage" : "thief"));
7195 ShowDialog("guild_doorman", "main", tag);
7196 return;
7197 }
7198 if (trait is TraitGuildClerk)
7199 {
7200 string tag2 = ((trait is TraitClerk_Fighter) ? "fighter" : ((trait is TraitClerk_Mage) ? "mage" : "thief"));
7201 ShowDialog("guild_clerk", "main", tag2);
7202 return;
7203 }
7204 }
7205 bool flag = true;
7206 if (id == "parttimer_jure" && (!EClass._zone.IsFestival || !(EClass._zone is Zone_Noyel) || EClass.pc.faith == EClass.game.religions.Healing))
7207 {
7208 flag = false;
7209 }
7210 if (flag && File.Exists(CorePath.DramaData + id + ".xlsx"))
7211 {
7212 ShowDialog(id);
7213 }
7214 else
7215 {
7216 ShowDialog("_chara");
7217 }
7218 }
7219
7220 public LayerDrama ShowDialog(string book, string step = "main", string tag = "")
7221 {
7222 return _ShowDialog(book, null, step, tag);
7223 }
7224
7225 private LayerDrama _ShowDialog(string book, string sheet, string step = "main", string tag = "")
7226 {
7227 EClass.Sound.Play("pop_drama");
7228 if (book == "_chara" && IsPC)
7229 {
7230 step = "pc";
7231 }
7232 return LayerDrama.Activate(book, sheet, step, this, null, tag);
7233 }
7234
7236 {
7237 return (ai.IsRunning ? ai.GetDestination() : pos).Copy();
7238 }
7239
7240 public int GetHireCost()
7241 {
7242 return base.LV / 2 + 4;
7243 }
7244
7245 public int GetHappiness()
7246 {
7247 int num = 50;
7248 if (FindBed() != null)
7249 {
7250 num += 50;
7251 }
7252 return num;
7253 }
7254
7255 public string GetTextHappiness()
7256 {
7257 return GetHappiness().ToString() ?? "";
7258 }
7259
7260 public string GetActionText()
7261 {
7262 string result = "?????";
7263 if (ai != null)
7264 {
7265 result = ai.GetCurrentActionText();
7266 }
7267 return result;
7268 }
7269
7270 public override void WriteNote(UINote n, Action<UINote> onWriteNote = null, IInspect.NoteMode mode = IInspect.NoteMode.Default, Recipe recipe = null)
7271 {
7272 n.Clear();
7273 UIItem uIItem = n.AddHeaderCard(base.Name.ToTitleCase());
7274 SetImage(uIItem.image2);
7275 uIItem.text2.SetText(race.GetText().ToTitleCase(wholeText: true) + " " + job.GetText().ToTitleCase(wholeText: true));
7276 n.AddText("");
7277 n.Build();
7278 }
7279
7281 {
7282 switch (m)
7283 {
7284 case UIList.SortMode.ByJob:
7285 sortVal = job._index * 10000 + sourceCard._index;
7286 break;
7287 case UIList.SortMode.ByRace:
7288 sortVal = race._index * 10000 * ((!IsHuman) ? 1 : (-1)) + sourceCard._index;
7289 break;
7290 case UIList.SortMode.ByFeat:
7291 sortVal = -GetTotalFeat();
7292 break;
7293 default:
7294 sortVal = sourceCard._index * ((!IsHuman) ? 1 : (-1));
7295 break;
7296 case UIList.SortMode.ByWorkk:
7297 break;
7298 }
7299 }
7300
7301 public void ClearBed(Map map = null)
7302 {
7303 if (map == null)
7304 {
7305 map = EClass._map;
7306 }
7307 foreach (Card item in map.props.installed.all)
7308 {
7309 if (item.trait is TraitBed traitBed && traitBed.IsHolder(this))
7310 {
7311 traitBed.RemoveHolder(this);
7312 }
7313 }
7314 }
7315
7317 {
7318 foreach (Card item in EClass._map.props.installed.all)
7319 {
7320 if (item.trait is TraitBed traitBed && traitBed.IsHolder(this))
7321 {
7322 return traitBed;
7323 }
7324 }
7325 return null;
7326 }
7327
7329 {
7330 if (!IsPCFaction && !IsGuest())
7331 {
7332 return null;
7333 }
7334 foreach (Card item in EClass._map.props.installed.all)
7335 {
7336 if (item.trait is TraitBed traitBed && traitBed.CanAssign(this))
7337 {
7338 traitBed.AddHolder(this);
7339 Msg.Say("claimBed", this);
7340 return traitBed;
7341 }
7342 }
7343 return null;
7344 }
7345
7346 public void TryPutSharedItems(IEnumerable<Thing> containers, bool msg = true)
7347 {
7348 if (GetInt(113) != 0)
7349 {
7350 return;
7351 }
7352 _ListItems.Clear();
7353 Thing bestRangedWeapon = GetBestRangedWeapon();
7354 foreach (Thing thing in things)
7355 {
7356 if (!thing.IsAmmo)
7357 {
7358 if (thing.category.slot != 0 && !thing.isEquipped && !thing.HasTag(CTAG.gift))
7359 {
7360 _ListItems.Add(thing);
7361 }
7362 else if (thing.IsRangedWeapon && thing.category.slot == 0 && bestRangedWeapon != thing)
7363 {
7364 _ListItems.Add(thing);
7365 }
7366 }
7367 }
7368 if (_ListItems.Count == 0)
7369 {
7370 return;
7371 }
7372 List<Thing> containers2 = containers.ToList();
7373 foreach (Thing listItem in _ListItems)
7374 {
7375 EClass._zone.TryAddThingInSharedContainer(listItem, containers2, add: true, msg: true, this);
7376 }
7377 }
7378
7379 public void TryPutSharedItems(bool msg = true)
7380 {
7381 TryPutSharedItems(EClass._map.props.installed.containers);
7382 }
7383
7384 public void TryTakeSharedItems(bool msg = true)
7385 {
7386 TryTakeSharedItems(EClass._map.props.installed.containers);
7387 }
7388
7389 public void TryTakeSharedItems(IEnumerable<Thing> containers, bool msg = true, bool shouldEat = true)
7390 {
7391 if (base.isSummon || (memberType == FactionMemberType.Livestock && homeBranch != null && !homeBranch.policies.IsActive(2715)))
7392 {
7393 return;
7394 }
7395 int num = 2;
7396 int num2 = 1;
7397 int num3 = 2;
7398 bool flag = GetInt(113) == 0;
7399 int num4 = 2;
7400 int num5 = 2;
7401 int num6 = 2;
7402 if (homeBranch != null && homeBranch.HasItemProtection && !IsPCParty)
7403 {
7404 num5 = 0;
7405 num6 = 0;
7406 }
7407 foreach (Thing thing3 in things)
7408 {
7409 if (CanEat(thing3, shouldEat))
7410 {
7411 if (thing3.HasElement(757))
7412 {
7413 num2 -= thing3.Num;
7414 num -= thing3.Num;
7415 }
7416 else
7417 {
7418 num -= thing3.Num;
7419 }
7420 }
7421 if (thing3.trait.GetHealAction(this) != null)
7422 {
7423 num3 -= thing3.Num;
7424 }
7425 if (thing3.id == "polish_powder")
7426 {
7427 num4 -= thing3.Num;
7428 }
7429 if (thing3.trait is TraitBlanketColdproof)
7430 {
7431 num5 -= thing3.Num;
7432 }
7433 if (thing3.trait is TraitBlanketFireproof)
7434 {
7435 num6 -= thing3.Num;
7436 }
7437 }
7438 _ListItems.Clear();
7439 foreach (Thing container in containers)
7440 {
7441 if (!container.IsSharedContainer)
7442 {
7443 continue;
7444 }
7445 foreach (Thing thing4 in container.things)
7446 {
7447 if (!thing4.c_isImportant && thing4.IsIdentified && thing4 != EClass.pc.held)
7448 {
7449 if (num4 > 0 && thing4.id == "polish_powder")
7450 {
7451 _ListItems.Add(thing4);
7452 num4 -= thing4.Num;
7453 }
7454 else if (num5 > 0 && !HasElement(1236) && thing4.trait is TraitBlanketColdproof)
7455 {
7456 _ListItems.Add(thing4);
7457 num5 -= thing4.Num;
7458 }
7459 else if (num6 > 0 && thing4.trait is TraitBlanketFireproof)
7460 {
7461 _ListItems.Add(thing4);
7462 num6 -= thing4.Num;
7463 }
7464 else if (num2 > 0 && CanEat(thing4, shouldEat) && !thing4.c_isImportant && thing4.HasElement(757))
7465 {
7466 _ListItems.Add(thing4);
7467 num2 -= thing4.Num;
7468 }
7469 else if (num > 0 && CanEat(thing4, shouldEat) && !thing4.c_isImportant)
7470 {
7471 _ListItems.Add(thing4);
7472 num -= thing4.Num;
7473 }
7474 else if (num3 > 0 && thing4.trait.GetHealAction(this) != null)
7475 {
7476 _ListItems.Add(thing4);
7477 num3 -= thing4.Num;
7478 }
7479 else if (flag && thing4.IsEquipmentOrRanged && !thing4.HasTag(CTAG.gift) && ShouldEquip(thing4, useFav: true))
7480 {
7481 _ListItems.Add(thing4);
7482 }
7483 }
7484 }
7485 }
7486 if (_ListItems.Count == 0)
7487 {
7488 return;
7489 }
7490 _ListItems.ForeachReverse(delegate(Thing t)
7491 {
7492 if (t.IsEquipmentOrRanged)
7493 {
7494 bool flag3 = false;
7495 int slot = t.category.slot;
7496 int equipValue = t.GetEquipValue();
7497 foreach (Thing listItem in _ListItems)
7498 {
7499 if (listItem.category.slot == slot && listItem.GetEquipValue() > equipValue)
7500 {
7501 flag3 = true;
7502 break;
7503 }
7504 }
7505 if (flag3)
7506 {
7507 _ListItems.Remove(t);
7508 }
7509 }
7510 });
7511 bool flag2 = false;
7512 foreach (Thing listItem2 in _ListItems)
7513 {
7514 Thing thing = listItem2;
7515 if (things.IsFull(thing))
7516 {
7517 break;
7518 }
7519 Thing thing2 = listItem2.parent as Thing;
7520 if (thing.HasElement(757))
7521 {
7522 if (thing.Num > 1)
7523 {
7524 thing = thing.Split(1);
7525 }
7526 }
7527 else if (thing.Num > 2)
7528 {
7529 thing = thing.Split(2);
7530 }
7531 if (msg)
7532 {
7533 Say("takeSharedItem", this, thing, thing2.GetName(NameStyle.Full));
7534 }
7535 AddCard(thing);
7536 if (ShouldEquip(thing, useFav: true) && thing.category.slot != 0)
7537 {
7538 TryEquip(thing, useFav: true);
7539 flag2 = true;
7540 }
7541 }
7542 if (flag2 && flag)
7543 {
7544 TryPutSharedItems(containers);
7545 }
7546 }
7547
7549 {
7550 Thing result = null;
7551 int num = -1;
7552 if (IsPC)
7553 {
7554 return null;
7555 }
7556 foreach (Thing item in things.List((Thing t) => CanEat(t, shouldEat: true) && !t.c_isImportant, onlyAccessible: true))
7557 {
7558 int num2 = CountNumEaten(item);
7559 int num3 = 100 - num2 + (item.HasElement(757) ? 10 : 0);
7560 if (num3 > num)
7561 {
7562 result = item;
7563 num = num3;
7564 }
7565 }
7566 return result;
7567 }
7568
7569 public void InstantEat(Thing t = null, bool sound = true)
7570 {
7571 if (t == null)
7572 {
7573 t = FindBestFoodToEat();
7574 }
7575 if (t == null)
7576 {
7577 t = things.Find((Thing a) => CanEat(a, shouldEat: true) && !a.c_isImportant);
7578 }
7579 if (t == null)
7580 {
7581 t = things.Find((Thing a) => CanEat(a) && !a.c_isImportant);
7582 }
7583 if (t != null)
7584 {
7585 Say("eat_start", this, t.Duplicate(1));
7586 if (sound)
7587 {
7588 PlaySound("eat");
7589 }
7590 FoodEffect.Proc(this, t);
7591 }
7592 }
7593
7594 public bool CanEat(Thing t, bool shouldEat = false)
7595 {
7596 if (t.IsDecayed && !HasElement(480))
7597 {
7598 return false;
7599 }
7600 if (HasElement(1250) && !t.HasElement(710))
7601 {
7602 return false;
7603 }
7604 if (shouldEat && (!(t.trait is TraitFoodPrepared) || t.c_isImportant))
7605 {
7606 return false;
7607 }
7608 if (!t.IsNegativeGift && !t.HasTag(CTAG.ignoreUse) && !t.isEquipped)
7609 {
7610 return t.trait.CanEat(this);
7611 }
7612 return false;
7613 }
7614
7615 public bool ShouldEquip(Thing t, bool useFav = false)
7616 {
7617 if (t.IsRangedWeapon && t.category.slot == 0)
7618 {
7619 if (!CanEquipRanged(t))
7620 {
7621 return false;
7622 }
7623 int num = 0;
7624 foreach (Thing thing in things)
7625 {
7626 if (thing.IsRangedWeapon)
7627 {
7628 if (thing.category.slot != 0 && thing.isEquipped)
7629 {
7630 return false;
7631 }
7632 if (CanEquipRanged(thing) && thing.GetEquipValue() > num)
7633 {
7634 num = thing.GetEquipValue();
7635 }
7636 }
7637 }
7638 if (t.GetEquipValue() > num)
7639 {
7640 return true;
7641 }
7642 return false;
7643 }
7644 BodySlot bodySlot = body.GetSlot(t);
7645 if (bodySlot == null)
7646 {
7647 return false;
7648 }
7649 if (useFav)
7650 {
7651 switch (GetFavAttackStyle())
7652 {
7653 case AttackStyle.Default:
7654 case AttackStyle.TwoHand:
7655 if (t.IsMeleeWeapon)
7656 {
7657 bodySlot = body.slotMainHand;
7658 }
7659 else if (bodySlot.elementId == 35)
7660 {
7661 return false;
7662 }
7663 break;
7664 case AttackStyle.Shield:
7665 if (t.IsMeleeWeapon)
7666 {
7667 bodySlot = body.slotMainHand;
7668 }
7669 else if (bodySlot.elementId == 35 && t.IsMeleeWeapon)
7670 {
7671 return false;
7672 }
7673 break;
7674 case AttackStyle.TwoWield:
7675 if (bodySlot.elementId == 35 && !t.IsMeleeWeapon)
7676 {
7677 return false;
7678 }
7679 break;
7680 }
7681 }
7682 if (!body.IsEquippable(t, bodySlot, text: false))
7683 {
7684 return false;
7685 }
7686 if (bodySlot.thing != null && (bodySlot.thing.blessedState <= BlessedState.Cursed || bodySlot.thing.GetEquipValue() >= t.GetEquipValue()))
7687 {
7688 return false;
7689 }
7690 if (!base.IsPCFactionOrMinion)
7691 {
7692 int num2 = 0;
7693 foreach (Element value in t.elements.dict.Values)
7694 {
7695 if (value.Value <= 0)
7696 {
7697 int num3 = 100;
7698 switch (value.id)
7699 {
7700 case 418:
7701 num3 = 10;
7702 break;
7703 case 60:
7704 case 61:
7705 case 62:
7706 num3 = 200;
7707 break;
7708 case 962:
7709 num3 = 10000;
7710 break;
7711 }
7712 num2 += value.Value * num3 / 100;
7713 }
7714 }
7715 if (num2 < -40)
7716 {
7717 return false;
7718 }
7719 }
7720 if (t.HasTag(CTAG.gift))
7721 {
7722 return false;
7723 }
7724 return true;
7725 }
7726
7727 public bool TryEquip(Thing t, bool useFav = false)
7728 {
7729 if (!ShouldEquip(t, useFav))
7730 {
7731 return false;
7732 }
7733 if (t.category.slot == 0)
7734 {
7735 return false;
7736 }
7737 if (useFav)
7738 {
7739 BodySlot slot = body.GetSlot(t);
7740 switch (GetFavAttackStyle())
7741 {
7742 case AttackStyle.Default:
7743 case AttackStyle.TwoHand:
7744 if (t.IsMeleeWeapon)
7745 {
7746 slot = body.slotMainHand;
7747 }
7748 break;
7749 case AttackStyle.Shield:
7750 if (t.IsMeleeWeapon)
7751 {
7752 slot = body.slotMainHand;
7753 }
7754 break;
7755 }
7756 body.Equip(t, slot);
7757 }
7758 else
7759 {
7760 body.Equip(t);
7761 }
7762 Say("equip", this, t);
7763 return true;
7764 }
7765
7766 public bool CanEquipRanged(Thing t)
7767 {
7768 return !body.IsTooHeavyToEquip(t);
7769 }
7770
7772 {
7773 Thing dest = null;
7774 if (IsPC)
7775 {
7777 {
7778 return FindThrowable(hotbar: true);
7779 }
7780 return null;
7781 }
7782 things.Foreach(delegate(Thing t)
7783 {
7784 if (t.HasTag(CTAG.throwWeapon) || (!base.IsPCFactionOrMinion && t.HasTag(CTAG.throwWeaponEnemy)))
7785 {
7786 dest = t;
7787 }
7788 });
7789 return dest;
7790 Thing FindThrowable(bool hotbar)
7791 {
7792 things.Foreach(delegate(Thing t)
7793 {
7794 if (dest == null)
7795 {
7796 if (t.IsHotItem)
7797 {
7798 if (!hotbar)
7799 {
7800 return;
7801 }
7802 }
7803 else if (hotbar)
7804 {
7805 return;
7806 }
7807 if (t.HasTag(CTAG.throwWeapon))
7808 {
7809 dest = t;
7810 }
7811 }
7812 });
7813 return dest;
7814 }
7815 }
7816
7818 {
7819 TraitToolRange ranged = weapon.trait as TraitToolRange;
7820 Thing thing = (IsPC ? EClass.pc.things.Find<TraitQuiver>() : null);
7821 if (thing != null)
7822 {
7823 Thing thing2 = thing.things.Find((Thing t) => ranged.IsAmmo(t));
7824 if (thing2 != null)
7825 {
7826 return thing2;
7827 }
7828 }
7829 return things.Find((Thing t) => ranged.IsAmmo(t));
7830 }
7831
7833 {
7834 Thing result = null;
7835 int num = 0;
7836 foreach (Thing thing in things)
7837 {
7838 if (thing.IsRangedWeapon && CanEquipRanged(thing) && thing.GetEquipValue() > num)
7839 {
7840 num = thing.GetEquipValue();
7841 result = thing;
7842 }
7843 }
7844 return result;
7845 }
7846
7847 public bool TryEquipRanged()
7848 {
7849 if (IsPC)
7850 {
7852 if (thing?.trait is TraitToolRange && CanEquipRanged(thing))
7853 {
7854 ranged = thing;
7855 return true;
7856 }
7857 return false;
7858 }
7859 if (ranged != null && ranged.parent == this)
7860 {
7861 return true;
7862 }
7863 ranged = GetBestRangedWeapon();
7864 return ranged != null;
7865 }
7866
7867 public override int GetArmorSkill()
7868 {
7869 if (body.GetWeight(armorOnly: true) <= (HasElement(1204) ? 6000 : 30000))
7870 {
7871 return 120;
7872 }
7873 return 122;
7874 }
7875
7876 public bool TryUse(Thing t)
7877 {
7878 if (t.id == "338" && t.blessedState >= BlessedState.Normal)
7879 {
7880 Thing thing = things.Find((Thing a) => a.IsEquipmentOrRanged && !a.isAcidproof);
7881 if (thing != null)
7882 {
7883 Say("dip", this, thing, t.GetName(NameStyle.Full, 1));
7884 SE.Change();
7885 t.trait.OnBlend(thing, this);
7886 return true;
7887 }
7888 return false;
7889 }
7890 if (t.IsNegativeGift || t.source.HasTag(CTAG.ignoreUse))
7891 {
7892 return false;
7893 }
7894 if (t.id == "cigar")
7895 {
7896 (t.trait as TraitItemProc).OnUse(this);
7897 return true;
7898 }
7899 if (t.trait.CanEat(this) && hunger.GetPhase() > ((IsPCFaction || IsPCFactionMinion) ? 2 : 0))
7900 {
7901 SetAIImmediate(new AI_Eat
7902 {
7903 target = t
7904 });
7905 return true;
7906 }
7907 if (t.trait.CanDrink(this))
7908 {
7909 Drink(t);
7910 return true;
7911 }
7912 if (t.trait.CanRead(this))
7913 {
7914 SetAIImmediate(new AI_Read
7915 {
7916 target = t
7917 });
7918 return true;
7919 }
7920 if (base.hp < MaxHP * 90 / 100)
7921 {
7922 Action healAction = t.trait.GetHealAction(this);
7923 if (healAction != null)
7924 {
7925 healAction();
7926 return true;
7927 }
7928 }
7929 return false;
7930 }
7931
7933 {
7934 return FindBed()?.owner.pos.cell.room;
7935 }
7936
7937 public void ModAffinity(Chara c, int a, bool show = true, bool showOnlyEmo = false)
7938 {
7939 if (c == this)
7940 {
7941 return;
7942 }
7943 if (IsPC)
7944 {
7945 c.ModAffinity(EClass.pc, a, show);
7946 }
7947 else
7948 {
7949 if (!trait.CanChangeAffinity)
7950 {
7951 return;
7952 }
7953 int num = StatsHygiene.GetAffinityMod(EClass.pc.hygiene.GetPhase()) + (HasElement(417) ? 30 : 0) + (EClass.pc.HasCondition<ConSmoking>() ? (-30) : 0);
7954 if (IsPCFaction && homeBranch != null)
7955 {
7956 num += (int)Mathf.Sqrt(homeBranch.Evalue(2117)) * 5;
7957 }
7958 bool flag = a > 0;
7959 if (flag)
7960 {
7961 a = a * num / 100;
7962 if (affinity.GetLunchChance() > EClass.rnd(100) && GetInt(71) >= 0 && GetInt(71) < EClass.world.date.GetRaw())
7963 {
7964 SetInt(71, -1);
7965 }
7966 }
7967 if (show)
7968 {
7969 if (a == 0)
7970 {
7971 if (!showOnlyEmo)
7972 {
7973 Say("affinityNone", this, c);
7974 }
7975 }
7976 else
7977 {
7978 ShowEmo((!flag) ? Emo.angry : Emo.love);
7979 c.ShowEmo(flag ? Emo.love : Emo.sad);
7980 if (!showOnlyEmo)
7981 {
7982 Say(flag ? "affinityPlus" : "affinityMinus", this, c);
7983 }
7984 }
7985 }
7986 if (c.IsPC)
7987 {
7988 a = affinity.Mod(a);
7989 }
7990 }
7991 }
7992
7993 public bool TryIdentify(Thing t, int count = 1, bool show = true)
7994 {
7995 int num = Evalue(289);
7996 if (num == 0)
7997 {
7998 return false;
7999 }
8000 int lV = t.LV;
8001 if (EClass.rnd(num * num + 5) > EClass.rnd(lV * lV) * 20)
8002 {
8003 t.Identify(show, (num >= 20) ? IDTSource.SkillHigh : IDTSource.Skill);
8004 int num2 = 50;
8005 if (lV > num)
8006 {
8007 num2 += (lV - num) * 10;
8008 }
8009 elements.ModExp(289, Mathf.Min(num2, 1000));
8010 return true;
8011 }
8012 return false;
8013 }
8014
8016 {
8017 Chara chara = CharaGen.Create(id);
8018 chara.c_originalHostility = base.c_originalHostility;
8019 if (chara.c_originalHostility != 0)
8020 {
8021 chara.hostility = chara.c_originalHostility;
8022 }
8023 if (orgPos != null)
8024 {
8025 chara.orgPos = orgPos.Copy();
8026 }
8027 chara.pos = pos.Copy();
8028 chara.isImported = true;
8029 chara.c_editorTags = base.c_editorTags;
8030 chara.c_editorTraitVal = base.c_editorTraitVal;
8031 chara.c_idTrait = base.c_idTrait;
8032 chara.homeZone = homeZone;
8033 return chara;
8034 }
8035
8037 {
8038 if (_listFavFood.Count == 0)
8039 {
8040 foreach (SourceThing.Row row in EClass.sources.things.rows)
8041 {
8042 if (row._origin == "dish" && row.value != 0 && row.chance != 0)
8043 {
8044 _listFavFood.Add(row);
8045 }
8046 }
8047 }
8048 SourceThing.Row r = null;
8049 Rand.UseSeed(base.uid + EClass.game.seed, delegate
8050 {
8051 r = _listFavFood.RandomItem();
8052 });
8053 return r;
8054 }
8055
8057 {
8058 SourceCategory.Row r = null;
8059 if (_listFavCat.Count == 0)
8060 {
8061 foreach (SourceCategory.Row row in EClass.sources.categories.rows)
8062 {
8063 if (row.gift > 0)
8064 {
8065 _listFavCat.Add(row);
8066 }
8067 }
8068 }
8069 Rand.UseSeed(base.uid + EClass.game.seed, delegate
8070 {
8071 r = _listFavCat.RandomItem();
8072 });
8073 return r;
8074 }
8075
8077 {
8078 using (List<Chara>.Enumerator enumerator = pos.ListCharasInRadius(this, 3, (Chara c) => c != this && c.race.id == "cat").GetEnumerator())
8079 {
8080 if (enumerator.MoveNext())
8081 {
8082 return enumerator.Current;
8083 }
8084 }
8085 return null;
8086 }
8087
8088 public void Sniff(Chara c)
8089 {
8090 Say("abCatSniff", this, c);
8091 AddCondition<ConHOT>(EClass.curve(50 + c.CHA * 5, 400, 100));
8092 c.ShowEmo(Emo.angry);
8093 ShowEmo(Emo.love);
8094 Talk("sniff");
8095 c.Talk(new string[4] { "labor", "disgust", "scold", "callGuards" }.RandomItem());
8096 }
8097
8098 public int GetTotalFeat()
8099 {
8100 int num = 0;
8101 if (base.c_upgrades != null)
8102 {
8103 num += base.c_upgrades.spent;
8104 }
8105 if (base.c_genes != null)
8106 {
8107 num += base.c_genes.GetTotalCost();
8108 }
8109 return num + base.feat;
8110 }
8111
8112 public bool CanInsult()
8113 {
8114 foreach (ActList.Item item in ability.list.items)
8115 {
8116 if (item.act.id == 6630)
8117 {
8118 return true;
8119 }
8120 }
8121 return false;
8122 }
8123
8124 public string GetIdPortraitCat()
8125 {
8126 string text = race.id;
8127 if ((text == "mifu" || text == "nefu") && EClass.rnd(2) == 0)
8128 {
8129 return "foxfolk";
8130 }
8131 if (trait is TraitGuard)
8132 {
8133 return "guard";
8134 }
8135 return "";
8136 }
8137
8138 public string GetIdPortrait()
8139 {
8140 if (id == "olderyoungersister")
8141 {
8142 if (base.idSkin != 2)
8143 {
8144 return "UN_olderyoungersister";
8145 }
8146 return "UN_olderyoungersister_alt";
8147 }
8148 if (Portrait.allIds.Contains("UN_" + id + ".png"))
8149 {
8150 return "UN_" + id;
8151 }
8152 return base.c_idPortrait;
8153 }
8154
8155 public Thing MakeGene(DNA.Type? type = null)
8156 {
8157 return DNA.GenerateGene((HasElement(1290) && Evalue(418) >= 0) ? EClass.sources.charas.map["caladrius"].model.Chara : this, type);
8158 }
8159
8161 {
8162 return DNA.GenerateGene(this, DNA.Type.Brain);
8163 }
8164
8165 public void OnInsulted()
8166 {
8167 if (!isDead)
8168 {
8169 if (HasElement(1231))
8170 {
8171 Talk("insulted");
8172 AddCondition<ConEuphoric>(100 * Evalue(1231));
8173 }
8174 else if (EClass.rnd(20) == 0)
8175 {
8176 SetFeat(1231, 1, msg: true);
8177 }
8178 }
8179 }
8180
8181 public bool IsValidGiftWeight(Card t, int num = -1)
8182 {
8183 int num2 = ((!HasElement(1411)) ? 1 : 3);
8184 if (GetBurden(t, num) >= num2)
8185 {
8186 return false;
8187 }
8188 return true;
8189 }
8190
8191 public bool CanAcceptItem(Card t, int num = -1)
8192 {
8194 {
8195 return true;
8196 }
8197 if (!IsValidGiftWeight(t, num))
8198 {
8199 return false;
8200 }
8201 if (t.c_isImportant)
8202 {
8203 return false;
8204 }
8205 if ((t.category.IsChildOf("furniture") || t.category.IsChildOf("junk")) && !HasElement(1411))
8206 {
8207 return false;
8208 }
8209 return true;
8210 }
8211
8212 public bool CanAcceptGift(Chara c, Card t)
8213 {
8214 if (things.IsFull())
8215 {
8216 return false;
8217 }
8218 if (t.c_isImportant)
8219 {
8220 return false;
8221 }
8222 if (t.id == "1084")
8223 {
8224 return true;
8225 }
8226 if (t.trait is TraitBookExp)
8227 {
8228 return true;
8229 }
8230 if (t.trait.CanOnlyCarry || !t.trait.CanBeDestroyed || t.trait.CanExtendBuild || t.rarity == Rarity.Artifact || t.IsContainer)
8231 {
8232 return false;
8233 }
8234 return true;
8235 }
8236
8237 public void GiveGift(Chara c, Thing t)
8238 {
8239 if (c.IsHostile() || c.IsDeadOrSleeping)
8240 {
8241 Msg.Say("affinityNone", c, this);
8242 return;
8243 }
8244 if (!t.isCopy && t.IsCursed && t.IsEquipmentOrRanged && !t.IsAmmo && c.HasElement(1414))
8245 {
8246 bool num = t.blessedState == BlessedState.Doomed;
8247 int num2 = 200 + t.LV * 3;
8248 if (t.rarity == Rarity.Legendary)
8249 {
8250 num2 *= 3;
8251 }
8252 if (t.rarity >= Rarity.Mythical)
8253 {
8254 num2 *= 5;
8255 }
8256 if (num)
8257 {
8258 num2 *= 2;
8259 }
8260 EClass.pc.PlayEffect("identify");
8261 EClass.pc.PlaySound("identify");
8262 c.PlayEffect("mutation");
8263 c.Say("draw_curse", c, t);
8264 t.Destroy();
8265 List<Element> list = new List<Element>();
8266 foreach (Element value in EClass.pc.elements.dict.Values)
8267 {
8268 if (value is Spell)
8269 {
8270 list.Add(value);
8271 }
8272 }
8273 if (list.Count == 0)
8274 {
8276 return;
8277 }
8278 Element element = list.RandomItem();
8279 EClass.pc.ModExp(element.id, num2);
8280 EClass.pc.Say("draw_curse2", EClass.pc, element.Name);
8281 c.AddExp(Mathf.Min(num2 / 3, c.ExpToNext));
8282 return;
8283 }
8284 if ((t.id == "lovepotion" || t.id == "dreambug") && !Application.isEditor)
8285 {
8286 GiveLovePotion(c, t);
8287 return;
8288 }
8289 if (t.trait is TraitErohon && c.id == t.c_idRefName)
8290 {
8291 c.OnGiveErohon(t);
8292 return;
8293 }
8294 if (t.trait is TraitTicketMassage)
8295 {
8296 t.ModNum(-1);
8297 c.Talk("ticket");
8298 switch (t.id)
8299 {
8300 case "ticket_massage":
8301 c.ModAffinity(EClass.pc, 10);
8303 {
8304 target = c
8305 });
8306 break;
8307 case "ticket_armpillow":
8308 c.ModAffinity(EClass.pc, 20);
8309 EClass.pc.AddCondition<ConSleep>(300, force: true);
8310 c.SetAI(new AI_ArmPillow
8311 {
8312 target = EClass.pc
8313 });
8314 break;
8315 case "ticket_champagne":
8316 c.ModAffinity(EClass.pc, 10);
8318 break;
8319 }
8320 return;
8321 }
8322 if (t.id == "flyer")
8323 {
8324 stamina.Mod(-1);
8325 if (c.things.Find((Thing a) => a.id == "flyer") != null)
8326 {
8327 c.Talk("flyer_miss");
8328 DoHostileAction(c);
8329 return;
8330 }
8331 if (EClass.rnd(20) != 0 && c.CHA > EClass.rnd(base.CHA + Evalue(291) * 3 + 10))
8332 {
8333 Msg.Say("affinityNone", c, this);
8334 t.Destroy();
8335 elements.ModExp(291, 10f);
8336 return;
8337 }
8338 elements.ModExp(291, 50f);
8339 }
8340 if (t.id == "statue_weird")
8341 {
8342 EClass.pc.Say("statue_sell");
8343 }
8344 t.isGifted = true;
8345 c.nextUse = c.affinity.OnGift(t);
8346 if (!t.isDestroyed)
8347 {
8348 EClass.game.quests.list.ForeachReverse(delegate(Quest q)
8349 {
8350 q.OnGiveItem(c, t);
8351 });
8352 if (c.TryEquip(t))
8353 {
8354 c.nextUse = null;
8355 }
8356 }
8357 }
8358
8359 public void OnGiveErohon(Thing t)
8360 {
8361 Say("give_erohon", this);
8362 AddCondition<ConParalyze>(50, force: true);
8363 AddCondition<ConConfuse>(50, force: true);
8364 AddCondition<ConFear>(1000, force: true);
8365 ModAffinity(EClass.pc, 100);
8366 t.Destroy();
8367 Talk("pervert");
8368 }
8369
8370 public void GiveLovePotion(Chara c, Thing t)
8371 {
8372 c.Say("give_love", c, t);
8373 c.PlaySound(t.material.GetSoundDead());
8374 c.ShowEmo(Emo.angry);
8375 c.ModAffinity(EClass.pc, -20, show: false);
8376 c.Talk("pervert");
8377 t.Destroy();
8378 }
8379
8380 public bool RequestProtection(Chara attacker, Action<Chara> action)
8381 {
8382 if (HasCondition<StanceTaunt>() || base.isRestrained || attacker == this)
8383 {
8384 return false;
8385 }
8386 if (host != null && host.isRestrained)
8387 {
8388 return false;
8389 }
8390 if (base.IsPCFactionOrMinion && attacker.IsPCFactionOrMinion)
8391 {
8392 return false;
8393 }
8394 bool flag = false;
8395 foreach (Chara chara in EClass._map.charas)
8396 {
8397 if (chara == attacker || chara.enemy == this || chara == this || chara.host != null || chara.IsDisabled || !chara.IsFriendOrAbove(this) || chara.conSuspend != null || (chara.IsPCParty && !IsPCParty) || (IsPCFaction && !chara.IsPCFaction) || (attacker.IsPCFactionOrMinion && chara.IsPCFactionOrMinion))
8398 {
8399 continue;
8400 }
8401 bool flag2 = chara.HasElement(1225) && !chara.GetBool(126);
8402 if ((!flag2 && (flag || EClass.rnd(2) == 0 || !chara.HasCondition<StanceTaunt>())) || chara.HasCooldown(1225))
8403 {
8404 continue;
8405 }
8406 int num = Mathf.Max(chara.Evalue(1649), (!chara.IsPC) ? ((!flag2) ? 1 : 3) : 0);
8407 int num2 = Dist(chara);
8408 if (num2 > 25)
8409 {
8410 continue;
8411 }
8412 if (num2 > num || !chara.CanSeeLos(pos, num2))
8413 {
8414 if (!flag2)
8415 {
8416 continue;
8417 }
8418 Point nearestPoint = pos.GetNearestPoint(allowBlock: false, allowChara: false, allowInstalled: true, ignoreCenter: true);
8419 if (!nearestPoint.IsValid)
8420 {
8421 continue;
8422 }
8423 chara.Teleport(nearestPoint);
8424 chara.AddCooldown(1225, 10);
8425 num2 = Dist(chara);
8426 Say("intercept_loyal", chara, this);
8427 chara.SetEnemy(attacker);
8428 attacker.SetEnemy(chara);
8429 if (num2 > num || !chara.CanSeeLos(pos, num2))
8430 {
8431 continue;
8432 }
8433 }
8434 if (!flag && !HasElement(1225))
8435 {
8436 Say("intercept", chara, this);
8437 if (EClass.rnd(10) == 0)
8438 {
8439 chara.Talk("intercept", base.NameSimple);
8440 }
8441 if (attacker.enemy == this)
8442 {
8443 attacker.SetEnemy(chara);
8444 }
8445 action(chara);
8446 flag = true;
8447 }
8448 }
8449 return flag;
8450 }
8451
8453 {
8454 if (IsPCFaction)
8455 {
8456 if (t.IsFood && t.category.id != "fish" && !t.IsDecayed)
8457 {
8458 return false;
8459 }
8460 if (t.trait.GetHealAction(this) != null)
8461 {
8462 return false;
8463 }
8464 if (t.IsThrownWeapon || t.IsRangedWeapon || t.IsAmmo)
8465 {
8466 return false;
8467 }
8468 if (t.trait is TraitBlanket || t.trait is TraitItemProc || t.trait is TraitBookSkill)
8469 {
8470 return false;
8471 }
8472 }
8473 if (t.isEquipped || t.rarity >= Rarity.Legendary || !t.trait.CanBeDestroyed)
8474 {
8475 return false;
8476 }
8477 if (t.trait is TraitCurrency || t.trait is TraitTool)
8478 {
8479 return false;
8480 }
8481 switch (type)
8482 {
8483 case ClearInventoryType.SellAtTown:
8484 if (!t.isGifted && !t.isNPCProperty)
8485 {
8486 return false;
8487 }
8488 break;
8489 case ClearInventoryType.Purge:
8490 switch (t.category.id)
8491 {
8492 case "fish":
8493 if (EClass.rnd(3) == 0)
8494 {
8495 return true;
8496 }
8497 break;
8498 case "junk":
8499 case "garbage":
8500 if (EClass.rnd(3) != 0)
8501 {
8502 return true;
8503 }
8504 break;
8505 }
8506 if (t.id == "flyer")
8507 {
8508 return true;
8509 }
8510 if (!t.IsDecayed && EClass.rnd(3) == 0)
8511 {
8512 return false;
8513 }
8514 if (!things.IsFull() && t.IsRangedWeapon)
8515 {
8516 return false;
8517 }
8518 break;
8519 }
8520 return true;
8521 }
8522
8524 {
8525 int num = 0;
8526 for (int num2 = things.Count - 1; num2 >= 0; num2--)
8527 {
8528 Thing thing = things[num2];
8529 if (ShouldThrowAway(thing, type))
8530 {
8531 num += thing.GetPrice(CurrencyType.Money, sell: true, PriceType.Default, this) * thing.Num;
8532 thing.Destroy();
8533 }
8534 }
8535 if (num > 0)
8536 {
8537 ModCurrency(num);
8538 if (type == ClearInventoryType.SellAtTown)
8539 {
8540 Msg.Say("party_sell", this, num.ToString() ?? "");
8541 PlaySound("pay");
8542 }
8543 }
8544 }
8545
8546 public void ResetUpgrade()
8547 {
8548 _ = base.c_upgrades;
8549 }
8550
8551 public void TryUpgrade(bool msg = true)
8552 {
8553 if (!EClass.debug.enable || IsPC || !IsGlobal || !IsPCFaction)
8554 {
8555 return;
8556 }
8557 for (int i = 0; i < 100; i++)
8558 {
8559 if (base.feat == 0)
8560 {
8561 break;
8562 }
8563 if (base.c_upgrades == null)
8564 {
8565 base.c_upgrades = new CharaUpgrade();
8566 }
8567 if (base.c_upgrades.halt)
8568 {
8569 break;
8570 }
8571 Rand.SetSeed(base.uid + base.c_upgrades.count);
8572 int num = EClass.rnd(100);
8573 int num2 = 0;
8574 int num3 = 1;
8575 int num4 = 0;
8576 bool flag = false;
8577 IEnumerable<SourceElement.Row> ie = EClass.sources.elements.rows.Where((SourceElement.Row a) => !elements.Has(a) && a.category == "skill" && !a.tag.Contains("noPet"));
8578 List<Element> list = ListAvailabeFeats(pet: true);
8579 if (num >= 90 && list.Count > 0)
8580 {
8581 Element element = list.RandomItem();
8582 num2 = element.id;
8583 num4 = element.CostLearn;
8584 }
8585 else if (num >= 60 && ie.Any())
8586 {
8587 num2 = ie.RandomItem().id;
8588 num4 = 3;
8589 }
8590 else
8591 {
8592 num2 = Element.List_MainAttributesMajor.RandomItem();
8593 num4 = 1;
8594 num3 = 2;
8595 flag = true;
8596 }
8597 Rand.SetSeed();
8598 if (num4 > base.feat)
8599 {
8600 break;
8601 }
8602 base.feat -= num4;
8603 base.c_upgrades.count++;
8604 base.c_upgrades.spent += num4;
8605 bool flag2 = false;
8606 if (flag)
8607 {
8608 foreach (CharaUpgrade.Item item in base.c_upgrades.items)
8609 {
8610 if (item.idEle == num2)
8611 {
8612 item.value += num3;
8613 item.cost += num4;
8614 flag2 = true;
8615 break;
8616 }
8617 }
8618 }
8619 if (!flag2)
8620 {
8621 base.c_upgrades.items.Add(new CharaUpgrade.Item
8622 {
8623 idEle = num2,
8624 value = num3,
8625 cost = num4
8626 });
8627 }
8628 SourceElement.Row row = EClass.sources.elements.map[num2];
8629 if (row.category == "feat")
8630 {
8631 SetFeat(num2, elements.ValueWithoutLink(num2) + 1, msg: true);
8632 }
8633 else if (elements.ValueWithoutLink(row.id) == 0)
8634 {
8635 elements.Learn(row.id);
8636 }
8637 else
8638 {
8639 elements.ModBase(num2, num3);
8640 }
8641 }
8642 }
8643
8644 public bool CanBloom()
8645 {
8646 if (IsPC || base.isScaled || HasElement(1273))
8647 {
8648 return false;
8649 }
8650 if (!EClass.debug.godMode)
8651 {
8652 if (base.c_daysWithPC > 360)
8653 {
8654 return affinity.CanSleepBeside();
8655 }
8656 return false;
8657 }
8658 return true;
8659 }
8660
8661 public void AddCooldown(int idEle, int turns = 0)
8662 {
8663 if (_cooldowns == null)
8664 {
8665 _cooldowns = new List<int>();
8666 }
8667 if (turns != 0)
8668 {
8669 _cooldowns.Add(idEle * 1000 + turns);
8670 return;
8671 }
8672 SourceElement.Row row = EClass.sources.elements.map[idEle];
8673 if (row.cooldown > 0)
8674 {
8675 _cooldowns.Add(idEle * 1000 + row.cooldown);
8676 }
8677 }
8678
8679 public void SetCooldown(int idEle, int turns = 0)
8680 {
8681 if (_cooldowns == null)
8682 {
8683 _cooldowns = new List<int>();
8684 }
8685 bool flag = false;
8686 for (int i = 0; i < _cooldowns.Count; i++)
8687 {
8688 if (_cooldowns[i] / 1000 == idEle)
8689 {
8690 if (turns == 0)
8691 {
8692 _cooldowns.RemoveAt(i);
8693 }
8694 else
8695 {
8696 _cooldowns[i] = idEle * 1000 + turns;
8697 }
8698 flag = true;
8699 break;
8700 }
8701 }
8702 if (!flag && turns > 0)
8703 {
8704 AddCooldown(idEle, turns);
8705 }
8706 if (_cooldowns.Count == 0)
8707 {
8708 _cooldowns = null;
8709 }
8710 }
8711
8712 public bool HasCooldown(int idEle)
8713 {
8714 return GetCooldown(idEle) != 0;
8715 }
8716
8717 public int GetCooldown(int idEle)
8718 {
8719 if (_cooldowns != null)
8720 {
8721 for (int i = 0; i < _cooldowns.Count; i++)
8722 {
8723 if (_cooldowns[i] / 1000 == idEle)
8724 {
8725 return _cooldowns[i] % 1000;
8726 }
8727 }
8728 }
8729 return 0;
8730 }
8731
8732 public void TickCooldown()
8733 {
8734 for (int num = _cooldowns.Count - 1; num >= 0; num--)
8735 {
8736 if (_cooldowns[num] % 1000 == 1)
8737 {
8738 _cooldowns.RemoveAt(num);
8739 }
8740 else
8741 {
8742 _cooldowns[num]--;
8743 }
8744 }
8745 if (_cooldowns.Count == 0)
8746 {
8747 _cooldowns = null;
8748 }
8749 }
8750
8751 public void ChooseNewGoal()
8752 {
8753 if (IsPC && EClass.AdvMode)
8754 {
8755 SetNoGoal();
8756 return;
8757 }
8758 if (IsPCParty || base.noMove)
8759 {
8760 SetAI(new GoalIdle());
8761 return;
8762 }
8763 if ((IsHomeMember() && IsInHomeZone()) || IsGuest())
8764 {
8765 Goal goalFromTimeTable = GetGoalFromTimeTable(EClass.world.date.hour);
8766 if (goalFromTimeTable != null)
8767 {
8768 SetAI(goalFromTimeTable);
8769 if (goalFromTimeTable is GoalWork)
8770 {
8771 goalFromTimeTable.Tick();
8772 }
8773 return;
8774 }
8775 }
8776 if (goalList.index == -2)
8777 {
8778 goalList.Refresh(this, goalListType);
8779 }
8780 SetAI(goalList.Next());
8781 }
8782
8784 {
8785 if (IsPC)
8786 {
8787 return null;
8788 }
8789 switch (TimeTable.GetSpan(idTimeTable, hour))
8790 {
8791 case TimeTable.Span.Sleep:
8792 if (sleepiness.value > 10 || EClass._zone.isSimulating)
8793 {
8794 return new GoalSleep();
8795 }
8796 break;
8797 case TimeTable.Span.Eat:
8798 return new GoalIdle();
8799 case TimeTable.Span.Work:
8800 if (IsGuest())
8801 {
8802 return new GoalIdle();
8803 }
8804 return GetGoalWork();
8805 case TimeTable.Span.Free:
8806 if (IsGuest())
8807 {
8808 return new GoalIdle();
8809 }
8810 return GetGoalHobby();
8811 }
8812 return null;
8813 }
8814
8816 {
8817 if (IsPrisoner)
8818 {
8819 return new GoalIdle();
8820 }
8821 if (memberType == FactionMemberType.Livestock)
8822 {
8823 return new GoalGraze();
8824 }
8825 return new GoalWork();
8826 }
8827
8829 {
8830 if (IsPrisoner)
8831 {
8832 return new GoalIdle();
8833 }
8834 if (memberType == FactionMemberType.Livestock)
8835 {
8836 return new GoalGraze();
8837 }
8838 return new GoalHobby();
8839 }
8840
8841 public bool HasHobbyOrWork(string alias)
8842 {
8843 int num = EClass.sources.hobbies.alias.TryGetValue(alias)?.id ?? 0;
8844 listHobby.Clear();
8845 if (_works == null || _hobbies == null)
8846 {
8847 RerollHobby();
8848 }
8849 foreach (int work in _works)
8850 {
8851 if (work == num)
8852 {
8853 return true;
8854 }
8855 }
8856 foreach (int hobby in _hobbies)
8857 {
8858 if (hobby == num)
8859 {
8860 return true;
8861 }
8862 }
8863 return false;
8864 }
8865
8866 public void SetAIIdle()
8867 {
8868 }
8869
8870 public void SetAIAggro()
8871 {
8872 SetAI(new GoalCombat());
8873 }
8874
8876 {
8877 return SetAI(_NoGoalPC);
8878 }
8879
8881 {
8882 if (IsPC)
8883 {
8885 }
8886 if (ai.IsRunning)
8887 {
8888 if (ai == g && ai.IsNoGoal)
8889 {
8890 return g;
8891 }
8892 ai.Cancel();
8893 if (ai == g)
8894 {
8895 Debug.Log("goal is g:" + ai?.ToString() + "/" + this);
8896 return g;
8897 }
8898 }
8899 if (HasCondition<ConWait>())
8900 {
8901 RemoveCondition<ConWait>();
8902 }
8903 ai = g;
8904 ai.SetOwner(this);
8905 if (IsPC)
8906 {
8907 renderer.RefreshStateIcon();
8908 }
8909 return g;
8910 }
8911
8912 public void SetAIImmediate(AIAct g)
8913 {
8914 bool hasNoGoal = HasNoGoal;
8915 SetAI(g);
8916 if ((EClass.scene.actionMode != ActionMode.Sim || !EClass.scene.paused) && hasNoGoal && !(renderer as CharaRenderer).IsMoving)
8917 {
8918 Tick();
8919 }
8920 }
8921
8923 {
8924 BaseArea result = null;
8925 foreach (Hobby item in ListWorks())
8926 {
8927 AIWork aI = item.GetAI(this);
8928 if (aI.SetDestination())
8929 {
8930 if (aI.destArea != null)
8931 {
8932 result = aI.destArea;
8933 }
8934 else if (aI.destThing != null)
8935 {
8936 result = aI.destThing.pos.cell.room;
8937 }
8938 break;
8939 }
8940 }
8941 return result;
8942 }
8943
8944 public List<Hobby> ListWorks(bool useMemberType = true)
8945 {
8946 listHobby.Clear();
8947 if (useMemberType && memberType == FactionMemberType.Livestock)
8948 {
8949 listHobby.Add(new Hobby
8950 {
8951 id = 45
8952 });
8953 }
8954 else
8955 {
8956 if (_works == null)
8957 {
8958 RerollHobby();
8959 }
8960 foreach (int work in _works)
8961 {
8962 listHobby.Add(new Hobby
8963 {
8964 id = work
8965 });
8966 }
8967 }
8968 return listHobby;
8969 }
8970
8971 public List<Hobby> ListHobbies(bool useMemberType = true)
8972 {
8973 listHobby.Clear();
8974 if (!useMemberType || memberType != FactionMemberType.Livestock)
8975 {
8976 if (_hobbies == null)
8977 {
8978 RerollHobby();
8979 }
8980 foreach (int hobby in _hobbies)
8981 {
8982 listHobby.Add(new Hobby
8983 {
8984 id = hobby
8985 });
8986 }
8987 }
8988 return listHobby;
8989 }
8990
8991 public Hobby GetWork(string id)
8992 {
8993 foreach (Hobby item in ListWorks())
8994 {
8995 if (item.source.alias == id)
8996 {
8997 return item;
8998 }
8999 }
9000 foreach (Hobby item2 in ListHobbies())
9001 {
9002 if (item2.source.alias == id)
9003 {
9004 return item2;
9005 }
9006 }
9007 return null;
9008 }
9009
9010 public void RefreshWorkElements(ElementContainer parent = null)
9011 {
9012 if (workElements != null)
9013 {
9014 workElements.SetParent();
9015 }
9016 workElements = null;
9017 if (IsPCParty || homeBranch == null || homeBranch.owner == null)
9018 {
9019 return;
9020 }
9021 foreach (Hobby item in ListHobbies())
9022 {
9023 TryAdd(item);
9024 }
9025 foreach (Hobby item2 in ListWorks())
9026 {
9027 TryAdd(item2);
9028 }
9029 if (workElements != null)
9030 {
9031 workElements.SetParent(parent);
9032 }
9033 void TryAdd(Hobby h)
9034 {
9035 if (!h.source.elements.IsEmpty())
9036 {
9037 if (workElements == null)
9038 {
9039 workElements = new ElementContainer();
9040 }
9041 for (int i = 0; i < h.source.elements.Length; i += 2)
9042 {
9043 int num = h.source.elements[i];
9044 int num2 = h.source.elements[i + 1];
9045 int num3 = 100;
9046 if (num != 2115 && num != 2207)
9047 {
9048 num3 = h.GetEfficiency(this) * homeBranch.efficiency / 100;
9049 if (num3 <= 0)
9050 {
9051 continue;
9052 }
9053 }
9054 workElements.ModBase(num, (num2 < 0) ? (num2 / 10) : Mathf.Max(1, h.source.elements[i + 1] * num3 / 1000));
9055 }
9056 }
9057 }
9058 }
9059
9060 public string GetTextHobby(bool simple = false)
9061 {
9062 string text = (simple ? "" : ("hobby".lang() + ":"));
9063 foreach (Hobby item in ListHobbies())
9064 {
9065 text = text + " " + item.Name.TagColor((item.GetEfficiency(this) > 0) ? FontColor.Good : FontColor.Warning) + ",";
9066 }
9067 return text.TrimEnd(',');
9068 }
9069
9070 public string GetTextWork(bool simple = false)
9071 {
9072 string text = (simple ? "" : ("work".lang() + ":"));
9073 foreach (Hobby item in ListWorks())
9074 {
9075 text = text + " " + item.Name.TagColor((item.GetEfficiency(this) > 0) ? FontColor.Good : FontColor.Warning) + ",";
9076 }
9077 return text.TrimEnd(',');
9078 }
9079
9080 public void AddHobby(int id)
9081 {
9082 foreach (int hobby in _hobbies)
9083 {
9084 if (hobby == id)
9085 {
9086 return;
9087 }
9088 }
9089 _hobbies.Add(id);
9090 }
9091
9092 public void AddWork(int id)
9093 {
9094 foreach (int work in _works)
9095 {
9096 if (work == id)
9097 {
9098 return;
9099 }
9100 }
9101 _works.Add(id);
9102 }
9103
9104 public void RerollHobby(bool extraSlotChance = true)
9105 {
9106 if (_hobbies != null && _works != null)
9107 {
9108 _hobbies.Clear();
9109 _works.Clear();
9110 }
9111 else
9112 {
9113 _hobbies = new List<int>();
9114 _works = new List<int>();
9115 }
9116 if (source.hobbies.IsEmpty())
9117 {
9118 AddHobby(EClass.sources.hobbies.listHobbies.RandomItem().id);
9119 }
9120 else
9121 {
9122 string[] hobbies = source.hobbies;
9123 foreach (string key in hobbies)
9124 {
9125 AddHobby(EClass.sources.hobbies.alias[key].id);
9126 }
9127 }
9128 if (source.works.IsEmpty())
9129 {
9130 AddWork(EClass.sources.hobbies.listWorks.RandomItem().id);
9131 }
9132 else
9133 {
9134 string[] hobbies = source.works;
9135 foreach (string key2 in hobbies)
9136 {
9137 AddWork(EClass.sources.hobbies.alias[key2].id);
9138 }
9139 }
9140 GetWorkSummary().Reset();
9141 }
9142
9144 {
9145 if (_workSummary == null)
9146 {
9147 _workSummary = new WorkSummary();
9148 }
9149 return _workSummary;
9150 }
9151
9152 public void TickWork(VirtualDate date)
9153 {
9154 TimeTable.Span span = TimeTable.GetSpan(idTimeTable, date.hour);
9155 if (span != TimeTable.Span.Work && span != 0)
9156 {
9157 return;
9158 }
9159 WorkSummary workSummary = GetWorkSummary();
9160 if (span == TimeTable.Span.Work)
9161 {
9162 if (workSummary.work != null)
9163 {
9164 PerformWork(workSummary.work, isHobby: false, date.IsRealTime);
9165 }
9166 }
9167 else if (workSummary.hobbies.Count > 0)
9168 {
9169 PerformWork(workSummary.hobbies.RandomItem(), isHobby: true, date.IsRealTime);
9170 }
9171 }
9172
9173 public bool TryWorkOutside(SourceHobby.Row sourceWork)
9174 {
9175 if (EClass.world.date.IsExpired(GetInt(51)))
9176 {
9177 Expedition expedition = Expedition.Create(this, sourceWork.expedition.ToEnum<ExpeditionType>());
9178 SetInt(51, EClass.world.date.GetRaw() + 60 * (expedition.hours + 24));
9179 homeBranch.expeditions.Add(expedition);
9180 return true;
9181 }
9182 return false;
9183 }
9184
9185 public void PerformWork(WorkSession session, bool isHobby = false, bool IsRealTime = false)
9186 {
9187 Hobby hobby = new Hobby();
9188 hobby.id = session.id;
9189 WorkSummary workSummary = _workSummary;
9190 hobby.GetAI(this).OnPerformWork(IsRealTime);
9191 if (!isHobby)
9192 {
9193 workSummary.progress += EClass.rnd(5) + 5;
9194 }
9195 int num = PerformWork(hobby, 0, isHobby);
9196 int num2 = PerformWork(hobby, 1, isHobby);
9197 int num3 = PerformWork(hobby, 2, isHobby);
9198 int num4 = PerformWork(hobby, 3, isHobby);
9199 workSummary.money += num;
9200 workSummary.food += num2;
9201 workSummary.knowledge += num3;
9202 workSummary.material += num4;
9203 int PerformWork(Hobby work, int idx, bool isHobby)
9204 {
9205 if (idx >= work.source.resources.Length)
9206 {
9207 return 0;
9208 }
9209 int num5 = work.source.resources[idx];
9210 int num6 = num5;
9211 num5 = Rand.Range(num5 * (100 - work.source.resources[idx]) / 100, num5);
9212 num5 = num5 * (isHobby ? 50 : 100) * session.efficiency / 10000;
9213 if (num6 > 0 && num5 <= 0)
9214 {
9215 num5 = 1;
9216 }
9217 return num5;
9218 }
9219 }
9220
9221 public void ValidateWorks()
9222 {
9223 _goalWork.FindWork(this, setAI: false);
9224 _goalHobby.ValidateHobby(this);
9225 }
9226
9227 public void InitStats(bool onDeserialize = false)
9228 {
9229 if (!onDeserialize)
9230 {
9231 _cints[10] = 20;
9232 _cints[11] = 70;
9233 _cints[13] = 70;
9234 _cints[14] = 70;
9235 _cints[15] = 70;
9236 _cints[17] = 0;
9237 _cints[18] = 0;
9238 }
9239 foreach (Condition condition in conditions)
9240 {
9241 condition.SetOwner(this, onDeserialize);
9242 }
9243 }
9244
9245 public Condition AddCondition<T>(int p = 100, bool force = false) where T : Condition
9246 {
9247 return AddCondition(typeof(T).Name, p, force);
9248 }
9249
9250 public Condition AddCondition(string id, int p = 100, bool force = false)
9251 {
9252 return AddCondition(Condition.Create(id, p), force);
9253 }
9254
9255 public Condition AddCondition(Condition c, bool force = false)
9256 {
9257 c.owner = this;
9258 if (!(c is ConBurning))
9259 {
9260 if (c is ConBleed && ResistLv(964) >= 3)
9261 {
9262 return null;
9263 }
9264 }
9265 else if (ResistLv(950) >= 3)
9266 {
9267 return null;
9268 }
9269 if (c.GainResistFactor > 0 && CanGainConResist)
9270 {
9271 if (c.GainResistFactor >= 400)
9272 {
9273 c.power /= 2;
9274 }
9275 ResistCon(c);
9276 if (c.power <= 0)
9277 {
9278 return null;
9279 }
9280 }
9281 if (!force)
9282 {
9283 if (c.source.negate.Length != 0)
9284 {
9285 string[] negate = c.source.negate;
9286 foreach (string text in negate)
9287 {
9288 if (HasElement(text))
9289 {
9290 return null;
9291 }
9292 }
9293 }
9294 Element defenseAttribute = c.GetDefenseAttribute(this);
9295 if (defenseAttribute != null)
9296 {
9297 c.power = 100 * c.power / Mathf.Max(100 + defenseAttribute.Value, 1);
9298 }
9299 if (c.source.resistance.Length != 0)
9300 {
9301 int num = ResistLv(EClass.sources.elements.alias[c.source.resistance[0]].id);
9302 if (num > 0)
9303 {
9304 c.power /= num * num + 1;
9305 if (c.power <= 40)
9306 {
9307 return null;
9308 }
9309 }
9310 }
9311 c.power = c.EvaluatePower(c.power);
9312 if (c.power <= 0)
9313 {
9314 return null;
9315 }
9316 }
9317 int num2 = c.EvaluateTurn(c.power);
9318 if (num2 == 0)
9319 {
9320 return null;
9321 }
9322 for (int j = 0; j < conditions.Count; j++)
9323 {
9324 if (conditions[j].id != c.id)
9325 {
9326 continue;
9327 }
9328 if (c.Type == ConditionType.Stance || c.IsToggle)
9329 {
9330 conditions[j].Kill();
9331 return null;
9332 }
9333 if (conditions[j].CanStack(c))
9334 {
9335 if (conditions[j].ShouldOverride(c))
9336 {
9337 if (conditions[j].IsOverrideConditionMet(c, num2))
9338 {
9339 conditions[j].Kill(silent: true);
9340 continue;
9341 }
9342 return null;
9343 }
9344 if (CanGainConResist)
9345 {
9346 AddResistCon(c);
9347 }
9348 conditions[j].OnStacked(c.power);
9349 conditions[j].OnStartOrStack();
9350 conditions[j].PlayEffect();
9351 }
9352 if (!conditions[j].AllowMultipleInstance)
9353 {
9354 return null;
9355 }
9356 }
9357 foreach (Condition condition in conditions)
9358 {
9359 if (condition.TryNullify(c))
9360 {
9361 return null;
9362 }
9363 }
9364 c.value = num2;
9365 conditions.Add(c);
9366 if (CanGainConResist)
9367 {
9368 AddResistCon(c);
9369 }
9370 c.SetOwner(this);
9371 c.Start();
9372 SetDirtySpeed();
9373 if (c.ShouldRefresh)
9374 {
9375 Refresh();
9376 }
9377 if (c.CancelAI)
9378 {
9379 ai.Cancel();
9380 }
9381 if (IsPC && c.ConsumeTurn && !EClass.pc.isRestrained)
9382 {
9384 }
9385 if (c.SyncRide && (ride != null || parasite != null))
9386 {
9387 if (ride != null)
9388 {
9389 ride.AddCondition(Condition.Create(c.source.alias, c.power));
9390 }
9391 if (parasite != null)
9392 {
9393 parasite.AddCondition(Condition.Create(c.source.alias, c.power));
9394 }
9395 }
9396 return c;
9397 }
9398
9399 public override bool HasCondition<T>()
9400 {
9401 for (int i = 0; i < conditions.Count; i++)
9402 {
9403 if (conditions[i] is T)
9404 {
9405 return true;
9406 }
9407 }
9408 return false;
9409 }
9410
9411 public bool HasCondition(string alias)
9412 {
9413 for (int i = 0; i < conditions.Count; i++)
9414 {
9415 if (conditions[i].source.alias == alias)
9416 {
9417 return true;
9418 }
9419 }
9420 return false;
9421 }
9422
9423 public Element GetBuffStats(string alias)
9424 {
9425 return GetBuffStats(EClass.sources.elements.alias[alias].id);
9426 }
9427
9428 public Element GetBuffStats(int ele)
9429 {
9430 for (int i = 0; i < conditions.Count; i++)
9431 {
9432 if (conditions[i] is ConBuffStats conBuffStats && conBuffStats.refVal == ele)
9433 {
9434 return conBuffStats.elements.GetElement(ele);
9435 }
9436 }
9437 return null;
9438 }
9439
9440 public int CountDebuff()
9441 {
9442 int num = 0;
9443 foreach (Condition condition in conditions)
9444 {
9445 if (condition.Type == ConditionType.Debuff)
9446 {
9447 num++;
9448 }
9449 }
9450 return num;
9451 }
9452
9453 public void CureCondition<T>(int v = 99999) where T : Condition
9454 {
9455 T condition = GetCondition<T>();
9456 if (condition != null)
9457 {
9458 condition.value -= v;
9459 if (condition.value <= 0)
9460 {
9461 condition.Kill();
9462 }
9463 }
9464 }
9465
9466 public T GetCondition<T>() where T : Condition
9467 {
9468 for (int i = 0; i < conditions.Count; i++)
9469 {
9470 if (conditions[i] is T)
9471 {
9472 return conditions[i] as T;
9473 }
9474 }
9475 return null;
9476 }
9477
9478 public void RemoveCondition<T>() where T : Condition
9479 {
9480 for (int num = conditions.Count - 1; num >= 0; num--)
9481 {
9482 if (conditions[num] is T)
9483 {
9484 conditions[num].Kill();
9485 break;
9486 }
9487 }
9488 }
9489
9490 public void CureHost(CureType type, int p = 100, BlessedState state = BlessedState.Normal)
9491 {
9492 if (parasite != null)
9493 {
9494 parasite.Cure(type, p, state);
9495 }
9496 if (ride != null)
9497 {
9498 ride.Cure(type, p, state);
9499 }
9500 Cure(type, p, state);
9501 }
9502
9503 public void Cure(CureType type, int p = 100, BlessedState state = BlessedState.Normal)
9504 {
9505 bool flag = state == BlessedState.Blessed;
9506 switch (type)
9507 {
9508 case CureType.Heal:
9509 case CureType.Prayer:
9510 CureCondition<ConFear>();
9511 CureCondition<ConBlind>(2 * p / 100 + 5);
9512 CureCondition<ConPoison>(5 * p / 100 + 5);
9513 CureCondition<ConConfuse>(10 * p / 100 + 10);
9514 CureCondition<ConDim>(p / 100 + 5);
9515 CureCondition<ConBleed>(2 * p / 100 + 10);
9516 if (flag)
9517 {
9518 SAN.Mod(-15);
9519 }
9520 break;
9521 case CureType.CureBody:
9522 CureCondition<ConBlind>(5 * p / 100 + 15);
9523 CureCondition<ConPoison>(10 * p / 100 + 15);
9524 CureCondition<ConBleed>(5 * p / 100 + 20);
9525 CureTempElements(p, body: true, mind: false);
9526 break;
9527 case CureType.CureMind:
9528 CureCondition<ConFear>();
9529 CureCondition<ConDim>(3 * p / 100 + 10);
9530 CureTempElements(p, body: false, mind: true);
9531 break;
9532 case CureType.Sleep:
9533 {
9534 for (int num2 = conditions.Count - 1; num2 >= 0; num2--)
9535 {
9536 Condition condition2 = conditions[num2];
9537 if (!(condition2 is ConSleep) && !(condition2 is ConFaint))
9538 {
9539 if (condition2.isPerfume)
9540 {
9541 condition2.Mod(-1, force: true);
9542 }
9543 else if (condition2.Type == ConditionType.Bad || condition2.Type == ConditionType.Debuff)
9544 {
9545 condition2.Kill();
9546 }
9547 }
9548 }
9549 CureCondition<ConWait>();
9550 CureCondition<ConDisease>((EClass.rnd(20) + 10) * p / 100);
9551 bool flag3 = HasCondition<ConAnorexia>();
9552 base.c_vomit -= (flag3 ? 3 : 2) * p / 100;
9553 if (base.c_vomit < 0)
9554 {
9555 base.c_vomit = 0;
9556 if (flag3)
9557 {
9558 RemoveCondition<ConAnorexia>();
9559 }
9560 }
9561 break;
9562 }
9563 case CureType.HealComplete:
9564 case CureType.Death:
9565 case CureType.Jure:
9566 case CureType.Boss:
9567 {
9568 bool flag2 = type == CureType.Death;
9569 CureTempElements(p * 100, body: true, mind: true);
9570 for (int num = conditions.Count - 1; num >= 0; num--)
9571 {
9572 Condition condition = conditions[num];
9573 if (condition is ConAnorexia && !flag2)
9574 {
9575 continue;
9576 }
9577 switch (condition.Type)
9578 {
9579 case ConditionType.Bad:
9580 case ConditionType.Debuff:
9581 case ConditionType.Disease:
9582 condition.Kill();
9583 continue;
9584 case ConditionType.Stance:
9585 if (flag2)
9586 {
9587 condition.Kill();
9588 continue;
9589 }
9590 break;
9591 }
9592 if (flag2 && condition.isPerfume)
9593 {
9594 condition.Kill();
9595 }
9596 }
9597 CureCondition<ConWait>();
9598 CureCondition<ConSleep>();
9599 if (flag2 || type == CureType.Boss)
9600 {
9601 SAN.Mod(-20);
9602 RemoveCondition<ConBrightnessOfLife>();
9603 }
9604 if (type == CureType.Jure)
9605 {
9606 SAN.Mod(-999);
9607 if (HasElement(1206))
9608 {
9609 SetFeat(1206, 0, msg: true);
9610 }
9611 }
9612 break;
9613 }
9614 }
9615 }
9616
9617 public void RemoveAllStances()
9618 {
9619 for (int num = conditions.Count - 1; num >= 0; num--)
9620 {
9621 Condition condition = conditions[num];
9622 if (condition.Type == ConditionType.Stance)
9623 {
9624 condition.Kill();
9625 }
9626 }
9627 }
9628
9629 public bool TryNeckHunt(Chara TC, int power, bool harvest = false)
9630 {
9631 if (TC == null || TC.HasCondition<ConInvulnerable>() || TC.Evalue(1421) > 0 || !TC.ExistsOnMap)
9632 {
9633 return false;
9634 }
9635 if (TC.hp > (long)TC.MaxHP * (long)Mathf.Min(5 + (int)Mathf.Sqrt(power), harvest ? 35 : 25) / 100)
9636 {
9637 return false;
9638 }
9639 if (TC.HasElement(427))
9640 {
9641 return false;
9642 }
9643 if (TC.IsPC && EClass.player.invlunerable)
9644 {
9645 return false;
9646 }
9647 PlaySound("hit_finish");
9648 Say("finish");
9649 Say("finish2", this, TC);
9650 TC.DamageHP(TC.MaxHP, AttackSource.Finish, this);
9651 return false;
9652 }
9653
9654 public void AddResistCon(Condition con)
9655 {
9656 if (con.power > 0 && con.GainResistFactor > 0)
9657 {
9658 int key = con.id;
9659 if (resistCon == null)
9660 {
9661 resistCon = new Dictionary<int, int>();
9662 }
9663 if (resistCon.ContainsKey(key))
9664 {
9665 resistCon[key] += con.power * con.GainResistFactor / 100;
9666 }
9667 else
9668 {
9669 resistCon[key] = con.power * con.GainResistFactor / 100;
9670 }
9671 }
9672 }
9673
9674 public void ResistCon(Condition con)
9675 {
9676 if (con.power > 0 && resistCon != null)
9677 {
9678 int a = ClassExtension.TryGetValue<int, int>((IDictionary<int, int>)resistCon, con.id, 0);
9679 if (1000 < EClass.rnd(a))
9680 {
9681 con.power = 0;
9682 }
9683 else if (500 < EClass.rnd(a))
9684 {
9685 con.power /= 5;
9686 }
9687 else if (200 < EClass.rnd(a))
9688 {
9689 con.power /= 3;
9690 }
9691 else if (100 < EClass.rnd(a))
9692 {
9693 con.power /= 2;
9694 }
9695 }
9696 }
9697
9698 public void Sleep(Thing bed = null, Thing pillow = null, bool pickup = false, ItemPosition posBed = null, ItemPosition posPillow = null)
9699 {
9700 RemoveCondition<ConAwakening>();
9701 AddCondition(Condition.Create(100, delegate(ConSleep con)
9702 {
9703 con.pcSleep = 15;
9704 con.pcBed = bed;
9705 con.pcPillow = pillow;
9706 con.pickup = pickup;
9707 con.posBed = posBed;
9708 con.posPillow = posPillow;
9709 }), force: true);
9710 }
9711
9712 public void OnSleep(Thing bed = null, int days = 1)
9713 {
9714 bool isSunLit = pos.IsSunLit;
9715 TraitPillow traitPillow = pos.FindThing<TraitPillow>();
9716 int num = bed?.Power ?? 20;
9717 if (traitPillow != null)
9718 {
9719 num += traitPillow.owner.Power / 2;
9720 }
9721 if (bed != null)
9722 {
9723 num += bed.Evalue(750) * 5;
9724 if (bed.trait is TraitBedCoffin)
9725 {
9726 isSunLit = false;
9727 }
9728 }
9729 OnSleep(num, days, isSunLit);
9730 }
9731
9732 public void OnSleep(int power, int days = 1, bool isSunLit = false)
9733 {
9734 if (days < 1)
9735 {
9736 days = 1;
9737 }
9738 int num = power * days;
9739 if (stamina.value < 0)
9740 {
9741 stamina.Set(1);
9742 }
9743 if (isWeakToSunlight && isSunLit)
9744 {
9745 base.hp = 0;
9746 if (mana.value > 0)
9747 {
9748 mana.Set(0);
9749 }
9750 AddCondition<ConBurning>(1000, force: true);
9751 }
9752 else
9753 {
9754 HealHP(num);
9755 stamina.Mod(10 + 25 * num / 100 * (100 + elements.GetFeatRef(1642)) / 100);
9756 mana.Mod(num);
9757 }
9758 if (IsPCFaction)
9759 {
9760 hunger.Mod(20);
9761 }
9762 sleepiness.Set(0);
9763 if (!IsMinion)
9764 {
9765 interest = 100;
9766 }
9767 Cure(CureType.Sleep, power);
9768 }
9769
9770 public void ModHeight(int a)
9771 {
9772 if (!HasElement(450))
9773 {
9774 long num = bio.height;
9775 num = num * (100 + a) / 100 + ((a > 0) ? 1 : (-1));
9776 if (num < 1)
9777 {
9778 num = 1L;
9779 }
9780 if (num > 999999999)
9781 {
9782 num = 999999999L;
9783 }
9784 if (num != bio.height)
9785 {
9786 bio.height = (int)num;
9787 Say((a > 0) ? "height_gain" : "height_lose", this);
9788 }
9789 }
9790 }
9791
9792 public void ModWeight(int a, bool ignoreLimit = false)
9793 {
9794 if (HasElement(450) || a == 0)
9795 {
9796 return;
9797 }
9798 long num = bio.weight;
9799 long num2 = bio.height;
9800 long num3 = num2 * num2 * 18 / 25000;
9801 long num4 = num2 * num2 * 24 / 10000;
9802 if (ignoreLimit || (num > num3 && num < num4))
9803 {
9804 num = num * (100 + a) / 100 + ((a > 0) ? 1 : (-1));
9805 if (num < 1)
9806 {
9807 num = 1L;
9808 }
9809 if (num > 999999999)
9810 {
9811 num = 999999999L;
9812 }
9813 if (num != bio.weight)
9814 {
9815 bio.weight = (int)num;
9816 Say((a > 0) ? "weight_gain" : "weight_lose", this);
9817 }
9818 }
9819 }
9820
9821 public void ModCorruption(int a)
9822 {
9823 if (a > 0)
9824 {
9825 if (Evalue(962) >= 25 || (ResistLv(962) > 0 && EClass.rnd(ResistLv(962) + 1) != 0))
9826 {
9827 return;
9828 }
9829 int num = Evalue(412);
9830 if (num != 0)
9831 {
9832 float num2 = (float)a * 100f / (float)Mathf.Max(100 + num * 2, 10);
9833 a = (int)num2 + ((EClass.rndf(1f) < num2 % 1f) ? 1 : 0);
9834 }
9835 }
9836 if (a == 0)
9837 {
9838 return;
9839 }
9840 int num3 = (corruption + a) / 100 - corruption / 100;
9841 for (int i = 0; i < Mathf.Abs(num3); i++)
9842 {
9843 if (!MutateRandom((num3 > 0) ? 1 : (-1), 100, ether: true))
9844 {
9845 break;
9846 }
9847 }
9848 corruption += a;
9849 int num4 = 0;
9850 foreach (Element value in elements.dict.Values)
9851 {
9852 if (value.source.category == "ether")
9853 {
9854 num4 += value.Value;
9855 }
9856 }
9857 if (num4 > 0 && IsPC)
9858 {
9859 Tutorial.Reserve("ether");
9860 }
9861 corruption = num4 * 100 + corruption % 100;
9862 }
9863
9864 public List<Element> ListAvailabeFeats(bool pet = false, bool showAll = false)
9865 {
9866 List<Element> list = new List<Element>();
9867 foreach (SourceElement.Row item in EClass.sources.elements.rows.Where((SourceElement.Row a) => a.group == "FEAT" && a.cost[0] != -1 && !a.categorySub.IsEmpty()))
9868 {
9869 Feat feat = elements.GetOrCreateElement(item.id) as Feat;
9870 int num = ((feat.ValueWithoutLink <= 0) ? 1 : (feat.ValueWithoutLink + 1));
9871 if (num <= feat.source.max && !feat.HasTag("class") && !feat.HasTag("hidden") && !feat.HasTag("innate") && (!pet || !feat.HasTag("noPet")) && (showAll || feat.IsPurchaseFeatReqMet(elements)))
9872 {
9873 list.Add(Element.Create(feat.id, num) as Feat);
9874 }
9875 }
9876 return list;
9877 }
9878
9879 public void SetFeat(int id, int value = 1, bool msg = false)
9880 {
9881 Feat feat = elements.GetElement(id) as Feat;
9882 int num = 0;
9883 if (feat != null && feat.Value > 0)
9884 {
9885 if (value == feat.Value)
9886 {
9887 return;
9888 }
9889 num = feat.Value;
9890 feat.Apply(-feat.Value, elements);
9891 }
9892 feat = elements.SetBase(id, value - (feat?.vSource ?? 0)) as Feat;
9893 if (feat.Value != 0)
9894 {
9895 feat.Apply(feat.Value, elements);
9896 }
9898 {
9899 Refresh();
9900 CalculateMaxStamina();
9901 }
9902 if (!msg)
9903 {
9904 return;
9905 }
9906 if (feat.source.textInc.IsEmpty())
9907 {
9908 PlaySound("ding_skill");
9910 Say("gainFeat", this, feat.FullName);
9911 }
9912 else
9913 {
9914 bool flag = value < num;
9915 if (feat.source.tag.Contains("neg"))
9916 {
9917 flag = !flag;
9918 }
9919 switch (id)
9920 {
9921 case 1270:
9922 if (!flag)
9923 {
9924 PlaySound("chime_angel");
9925 }
9926 break;
9927 case 1271:
9928 if (!flag)
9929 {
9930 PlaySound("chime_devil");
9931 }
9932 break;
9933 default:
9934 PlaySound("mutation");
9935 break;
9936 }
9938 Say((value > num) ? feat.source.GetText("textInc") : feat.source.GetText("textDec"), this, feat.FullName);
9939 }
9940 elements.CheckSkillActions();
9941 }
9942
9943 public void SetMutation(int idEle, int a = 0)
9944 {
9945 SourceElement.Row row = EClass.sources.elements.map[idEle];
9947 Element element = elements.GetElement(idEle);
9948 Element element2 = elements.GetElement(row2.id);
9949 int num = element?.Value ?? 0;
9950 if (a < 0)
9951 {
9952 a = 0;
9953 }
9954 if (a > row.max)
9955 {
9956 a = row.max;
9957 }
9958 bool flag = (row.tag.Contains("neg") ? (a > num) : (a < num));
9959 if (a == 0 && (element == null || element.Value == 0))
9960 {
9961 SayNothingHappans();
9962 return;
9963 }
9964 if (element != null && element.Value == a)
9965 {
9966 SayNothingHappans();
9967 return;
9968 }
9969 if (element2 != null && element2.Value > 0)
9970 {
9971 SetFeat(element2.id, 0);
9972 }
9973 SetFeat(idEle, a);
9974 PlaySound("mutation");
9975 PlayEffect("mutation");
9977 Say(row.GetText(flag ? "textDec" : "textInc", returnNull: true) ?? row.alias, this);
9978 }
9979
9980 public bool MutateRandom(int vec = 0, int tries = 100, bool ether = false, BlessedState state = BlessedState.Normal)
9981 {
9982 if (!ether && vec >= 0 && HasElement(406) && EClass.rnd(5) != 0)
9983 {
9984 Say("resistMutation", this);
9985 return false;
9986 }
9987 IEnumerable<SourceElement.Row> ie = EClass.sources.elements.rows.Where((SourceElement.Row a) => a.category == (ether ? "ether" : "mutation") && !a.tag.Contains("noRandomMutation"));
9988 for (int i = 0; i < tries; i++)
9989 {
9990 SourceElement.Row row = ie.RandomItem();
9991 if (i == 0 && vec < 0 && ether && base.c_corruptionHistory != null && base.c_corruptionHistory.Count > 0)
9992 {
9993 row = EClass.sources.elements.map[base.c_corruptionHistory.LastItem()];
9994 base.c_corruptionHistory.RemoveAt(base.c_corruptionHistory.Count - 1);
9995 if (base.c_corruptionHistory.Count == 0)
9996 {
9997 base.c_corruptionHistory = null;
9998 }
9999 }
10000 Element element = elements.GetElement(row.id);
10001 int num = 1;
10002 if ((vec > 0 && ((row.id == 1563 && corruption < 300) || (row.id == 1562 && corruption < 1000 && base.IsPowerful))) || (vec < 0 && (element == null || element.Value <= 0)) || (vec > 0 && element != null && element.Value >= row.max))
10003 {
10004 continue;
10005 }
10006 if (element == null && !row.aliasParent.IsEmpty() && elements.Has(row.aliasParent))
10007 {
10008 row = EClass.sources.elements.alias[row.aliasParent];
10009 element = elements.GetElement(row.id);
10010 }
10011 bool flag = row.tag.Contains("neg");
10012 if (vec > 0)
10013 {
10014 if ((state >= BlessedState.Blessed && flag) || (state <= BlessedState.Cursed && !flag))
10015 {
10016 continue;
10017 }
10018 }
10019 else if (vec < 0 && ((state >= BlessedState.Blessed && !flag) || (state <= BlessedState.Cursed && flag)))
10020 {
10021 continue;
10022 }
10023 bool flag2 = true;
10024 if (element != null)
10025 {
10026 num = element.Value + ((vec != 0) ? vec : ((EClass.rnd(2) == 0) ? 1 : (-1)));
10027 if (num > element.source.max)
10028 {
10029 num = element.source.max - 1;
10030 }
10031 flag = (flag && num > element.Value) || (!flag && num < element.Value);
10032 flag2 = num > element.Value;
10033 if (vec > 0 && !flag2)
10034 {
10035 continue;
10036 }
10037 }
10038 Say(flag2 ? "mutation_gain" : "mutation_loose", this);
10039 SetFeat(row.id, num);
10040 if (flag2 && ether)
10041 {
10042 if (base.c_corruptionHistory == null)
10043 {
10044 base.c_corruptionHistory = new List<int>();
10045 }
10046 base.c_corruptionHistory.Add(row.id);
10047 if (IsPCFaction)
10048 {
10049 Element element2 = elements.GetElement(row.id);
10050 WidgetPopText.Say("popEther".lang(element2.Name, base.Name));
10051 }
10052 if (IsPC && !EClass.player.flags.gotEtherDisease)
10053 {
10054 EClass.player.flags.gotEtherDisease = true;
10055 Thing thing = ThingGen.Create("parchment");
10056 thing.SetStr(53, "letter_ether");
10057 Thing thing2 = ThingGen.Create("1165");
10058 thing2.SetBlessedState(BlessedState.Normal);
10059 Thing p = ThingGen.CreateParcel(null, thing2, thing);
10061 }
10062 }
10063 if (EClass.core.IsGameStarted && pos != null)
10064 {
10065 PlaySound(ether ? "mutation_ether" : "mutation");
10066 PlayEffect("mutation");
10068 Say(row.GetText(flag ? "textDec" : "textInc", returnNull: true) ?? row.alias, this);
10069 }
10070 return true;
10071 }
10072 Say("nothingHappens");
10073 return false;
10074 }
10075
10076 public void GainAbility(int ele, int mtp = 100, Thing origin = null)
10077 {
10078 Element orCreateElement = elements.GetOrCreateElement(ele);
10079 if (orCreateElement.ValueWithoutLink == 0)
10080 {
10081 elements.ModBase(orCreateElement.id, 1);
10082 }
10083 if (orCreateElement is Spell)
10084 {
10085 int num = EClass.curve(Evalue(307), 50, 20) + (HasElement(307) ? 20 : 0);
10086 int num2 = origin?.Evalue(765) ?? 0;
10087 num = num * (100 - num2) / 100;
10088 int a = mtp * orCreateElement.source.charge * (100 + num) / 100 / 100;
10089 a = Mathf.Max(1, EClass.rndHalf(a));
10090 if (orCreateElement.source.charge == 1)
10091 {
10092 a = 1;
10093 }
10094 orCreateElement.vPotential += a;
10095 }
10096 Say("spell_gain", this, orCreateElement.Name);
10097 LayerAbility.SetDirty(orCreateElement);
10098 }
10099
10100 public bool TryNullifyCurse()
10101 {
10102 if (IsPCParty)
10103 {
10104 foreach (Chara member in EClass.pc.party.members)
10105 {
10106 if (member.HasElement(1641) && EClass.rnd(3) != 0)
10107 {
10108 Msg.Say("curse_nullify", member);
10109 return true;
10110 }
10111 }
10112 }
10113 else if (HasElement(1641) && EClass.rnd(3) != 0)
10114 {
10115 Say("curse_nullify", this);
10116 return true;
10117 }
10118 if (GetCondition<ConHolyVeil>() != null && EClass.rnd(5) != 0)
10119 {
10120 Say("curse_nullify", this);
10121 return true;
10122 }
10123 return false;
10124 }
10125
10126 public void OnAdvanceDay()
10127 {
10128 if (_historyFood != null)
10129 {
10130 while (_historyFood.Count > 5)
10131 {
10132 _historyFood.RemoveAt(_historyFood.Count - 1);
10133 }
10134 if (_historyFood[0].Count > 0)
10135 {
10136 _historyFood.Insert(0, new List<string>());
10137 }
10138 }
10139 }
10140
10142 {
10143 if (!IsPCFaction || !IsGlobal)
10144 {
10145 _historyFood = null;
10146 return;
10147 }
10148 if (_historyFood == null)
10149 {
10150 _historyFood = new List<List<string>>
10151 {
10152 new List<string>()
10153 };
10154 }
10155 if (_historyFood[0].Count < 5)
10156 {
10157 _historyFood[0].Add(food.id);
10158 }
10159 }
10160
10162 {
10163 if (_historyFood == null)
10164 {
10165 return -1;
10166 }
10167 int num = 0;
10168 foreach (List<string> item in _historyFood)
10169 {
10170 foreach (string item2 in item)
10171 {
10172 if (item2 == food.id)
10173 {
10174 num++;
10175 }
10176 }
10177 }
10178 return num;
10179 }
10180
10181 public int GetPietyValue()
10182 {
10183 if (base._IsPC)
10184 {
10185 return 10 + (int)(Mathf.Sqrt(base.c_daysWithGod) * 2f + (float)Evalue(85)) / 2;
10186 }
10187 return 10 + (int)(Mathf.Sqrt(base.LV) * 5f + (float)Evalue(306)) / 2;
10188 }
10189
10191 {
10192 if (faithElements != null)
10193 {
10194 faithElements.SetParent();
10195 }
10196 faithElements = new ElementContainer();
10197 if (idFaith == "eyth" && !HasElement(1228))
10198 {
10199 return;
10200 }
10201 SourceReligion.Row row = EClass.sources.religions.map.TryGetValue(idFaith);
10202 if (row == null)
10203 {
10204 return;
10205 }
10206 faithElements = new ElementContainer();
10207 if (!HasCondition<ConExcommunication>())
10208 {
10209 SourceElement.Row row2 = EClass.sources.elements.alias.TryGetValue("featGod_" + row.id + "1");
10210 if (row2 != null)
10211 {
10212 faithElements.SetBase(row2.id, 1);
10213 }
10214 int[] array = row.elements;
10215 int num = GetPietyValue() * (120 + Evalue(1407) * 15 + Evalue(1228) * 20) / 100;
10216 for (int i = 0; i < array.Length; i += 2)
10217 {
10218 int num2 = array[i + 1] * num / 50;
10219 if (array[i] == 79)
10220 {
10221 num2 = EClass.curve(num2, array[i + 1] * 2, 10, 50);
10222 }
10223 if (num2 >= 20 && array[i] >= 950 && array[i] < 970)
10224 {
10225 num2 = 20;
10226 }
10227 faithElements.SetBase(array[i], Mathf.Max(num2, 1));
10228 }
10229 }
10230 faithElements.SetParent(this);
10231 }
10232
10233 public void ModTempElement(int ele, int a, bool naturalDecay = false, bool onlyRenew = false)
10234 {
10235 if (a < 0 && !naturalDecay && HasElement(EClass.sources.elements.alias["sustain_" + EClass.sources.elements.map[ele].alias]?.id ?? 0))
10236 {
10237 return;
10238 }
10239 bool flag = HasElement(1215);
10240 if (tempElements == null)
10241 {
10242 tempElements = new ElementContainer();
10243 tempElements.SetParent(this);
10244 }
10245 if (a > 0 && flag)
10246 {
10247 a = a * 150 / 100;
10248 }
10249 int num = elements.ValueWithoutLink(ele);
10250 int num2 = Mathf.Abs(num) + 100;
10251 int num3 = num2 / (flag ? 2 : 4);
10252 int num4 = -num - 100;
10253 int num5 = tempElements.Base(ele);
10254 int num6 = num5 + a;
10255 if (onlyRenew)
10256 {
10257 num3 = Mathf.Min(a, num3);
10258 num4 = Mathf.Max(a, -num2 / 3);
10259 }
10260 if (a > 0 && num6 > num3)
10261 {
10262 a = ((num3 > num5) ? (num3 - num5) : 0);
10263 }
10264 if (a < 0 && num6 < num4)
10265 {
10266 a = ((num4 < num5) ? (num4 - num5) : 0);
10267 }
10268 Element element = tempElements.ModBase(ele, a);
10269 if (element.vBase == 0)
10270 {
10271 tempElements.Remove(element.id);
10272 if (tempElements.dict.Count == 0)
10273 {
10274 tempElements = null;
10275 }
10276 }
10277 }
10278
10279 public void DamageTempElements(int p, bool body, bool mind, bool onlyRenew = false)
10280 {
10281 if (body)
10282 {
10283 DamageTempElement(Element.List_Body.RandomItem(), p, onlyRenew);
10284 }
10285 if (mind)
10286 {
10287 DamageTempElement(Element.List_Mind.RandomItem(), p, onlyRenew);
10288 }
10289 }
10290
10291 public void DamageTempElement(int ele, int p, bool onlyRenew = false)
10292 {
10293 ModTempElement(ele, onlyRenew ? (-p / 20) : (-(p / 100 + EClass.rnd(p / 100 + 1) + 1)), naturalDecay: false, onlyRenew);
10294 }
10295
10296 public void EnhanceTempElements(int p, bool body, bool mind, bool onlyRenew = false)
10297 {
10298 int[] array = (body ? Element.List_Body : Element.List_Mind);
10299 foreach (int ele in array)
10300 {
10301 EnhanceTempElement(ele, p, onlyRenew);
10302 }
10303 }
10304
10305 public void EnhanceTempElement(int ele, int p, bool onlyRenew = false)
10306 {
10307 ModTempElement(ele, onlyRenew ? (p / 20) : (p / 100 + EClass.rnd(p / 100 + 1)), naturalDecay: false, onlyRenew);
10308 }
10309
10310 public void DiminishTempElements(int a = 1)
10311 {
10312 if (tempElements == null)
10313 {
10314 return;
10315 }
10316 foreach (Element item in tempElements.dict.Values.ToList())
10317 {
10318 if (item.vBase > 0)
10319 {
10320 ModTempElement(item.id, -Mathf.Min(item.vBase * 5 / 100 + 1, item.vBase), naturalDecay: true);
10321 }
10322 }
10323 }
10324
10325 public void CureTempElements(int p, bool body, bool mind)
10326 {
10327 if (tempElements != null)
10328 {
10329 if (body)
10330 {
10331 Cure(Element.List_Body);
10332 }
10333 if (mind)
10334 {
10335 Cure(Element.List_Mind);
10336 }
10337 }
10338 void Cure(int[] eles)
10339 {
10340 foreach (int ele in eles)
10341 {
10342 if (tempElements == null)
10343 {
10344 break;
10345 }
10346 Element element = tempElements.GetElement(ele);
10347 if (element != null && element.vBase < 0)
10348 {
10349 ModTempElement(ele, Mathf.Clamp(p / 20 + EClass.rnd(p / 20), 1, -element.vBase));
10350 }
10351 }
10352 }
10353 }
10354
10355 public void ClearTempElements()
10356 {
10357 if (tempElements != null)
10358 {
10359 tempElements.SetParent();
10360 tempElements = null;
10361 }
10362 }
10363}
AnimeID
Definition: AnimeID.cs:2
AttackSource
Definition: AttackSource.cs:2
AttackStyle
Definition: AttackStyle.cs:2
BlessedState
Definition: BlessedState.cs:2
BossType
Definition: BossType.cs:2
CTAG
Definition: CTAG.cs:2
@ currency
ClearInventoryType
ConditionType
Definition: ConditionType.cs:2
ContainerFlag
Definition: ContainerFlag.cs:5
CureType
Definition: CureType.cs:2
CurrencyType
Definition: CurrencyType.cs:2
EditorTag
Definition: EditorTag.cs:2
EffectId
Definition: EffectId.cs:2
@ ChangeMaterial
Emo2
Definition: Emo2.cs:2
Emo
Definition: Emo.cs:2
@ harvest
ExpeditionType
FactionMemberType
FontColor
Definition: FontColor.cs:2
GoalListType
Definition: GoalListType.cs:2
Hostility
Definition: Hostility.cs:2
IDTSource
Definition: IDTSource.cs:2
MinionType
Definition: MinionType.cs:2
NameStyle
Definition: NameStyle.cs:2
PlaceState
Definition: PlaceState.cs:2
PriceType
Definition: PriceType.cs:2
Rarity
Definition: Rarity.cs:2
SourceValueType
TreasureType
Definition: TreasureType.cs:2
list. Refresh()
if(item3.idFile==idFirstFile &&item3.id==idFirstTopic)
Definition: UIBook.cs:627
WitnessType
Definition: WitnessType.cs:2
Definition: ACT.cs:6
static Act Create(int id)
Definition: ACT.cs:36
Definition: AIAct.cs:6
Status Tick()
Definition: AIAct.cs:352
virtual bool IsIdle
Definition: AIAct.cs:78
AIAct Current
Definition: AIAct.cs:103
bool TryCancel(Card c)
Definition: AIAct.cs:266
bool IsMoveAI
Definition: AIAct.cs:55
virtual bool IsRunning
Definition: AIAct.cs:31
virtual bool PushChara
Definition: AIAct.cs:82
virtual Status Cancel()
Definition: AIAct.cs:291
virtual bool ShouldAllyAttack(Chara tg)
Definition: AIAct.cs:134
virtual bool IsNoGoal
Definition: AIAct.cs:74
virtual bool CancelOnAggro
Definition: AIAct.cs:80
void SetOwner(Chara c)
Definition: AIAct.cs:179
override string ToString()
Definition: AIAct.cs:124
virtual bool CancelWhenMoved
Definition: AIAct.cs:96
string GetCurrentActionText()
Definition: AIAct.cs:157
virtual Point GetDestination()
Definition: AIAct.cs:139
Definition: AIWork.cs:6
Thing destThing
Definition: AIWork.cs:17
bool SetDestination()
Definition: AIWork.cs:56
virtual void OnPerformWork(bool realtime)
Definition: AIWork.cs:150
BaseArea destArea
Definition: AIWork.cs:13
Definition: AI_Eat.cs:5
static bool slaughtering
Definition: AI_Slaughter.cs:6
bool TryCancelInteraction(bool sound=true)
Definition: AM_Adv.cs:1069
void ClearPlans()
Definition: AM_Adv.cs:426
void SetTurbo(int mtp=-1)
Definition: AM_Adv.cs:1040
static void ProcAt(EffectId id, int power, BlessedState state, Card cc, Card tc, Point tp, bool isNeg, ActRef actRef=default(ActRef))
Definition: ActEffect.cs:485
List< Item > items
Definition: ActList.cs:14
static EffectIRenderer Throw(Card c, Point p, Thing t, ThrowMethod method=ThrowMethod.Default, float failChance=0f)
Definition: ActThrow.cs:97
static void Search(Chara c, bool manual=false)
Definition: ActWait.cs:44
Definition: ACT.cs:62
CostType
Definition: ACT.cs:64
virtual bool Perform()
Definition: ACT.cs:266
virtual TargetType TargetType
Definition: ACT.cs:142
virtual float RapidDelay
Definition: ACT.cs:175
bool IsTargetHostileParty()
Definition: ACT.cs:241
virtual bool CanRapidFire
Definition: ACT.cs:173
static AM_Sim Sim
Definition: ActionMode.cs:11
virtual float gameSpeed
Definition: ActionMode.cs:119
static AM_Adv Adv
Definition: ActionMode.cs:15
static Affinity Get(Chara c)
Definition: Affinity.cs:36
int Mod(int a)
Definition: Affinity.cs:192
bool CanSleepBeside()
Definition: Affinity.cs:77
int GetLunchChance()
Definition: Affinity.cs:86
bool CanGiveCard()
Definition: Affinity.cs:63
Thing OnGift(Thing t)
Definition: Affinity.cs:129
static int indexSister
void SetStr(int id, string value=null)
Definition: BaseCard.cs:63
void SetInt(int id, int value=0)
Definition: BaseCard.cs:39
bool GetBool(int id)
Definition: BaseCard.cs:15
virtual bool IsToggle
virtual RendererReplacer GetRendererReplacer()
virtual bool PreventRegen
virtual int EvaluatePower(int p)
virtual int GainResistFactor
virtual bool TryMove(Point p)
virtual bool ConsumeTurn
Element GetDefenseAttribute(Chara c=null)
virtual int EvaluateTurn(int p)
bool TryNullify(Condition c)
virtual bool TimeBased
virtual void OnRefresh()
void Mod(int a, bool force=false)
virtual void SetOwner(Chara _owner, bool onDeserialize=false)
virtual void OnEndPlayerTurn()
virtual ConditionType Type
Definition: BaseStats.cs:19
virtual string GetPhaseStr()
Definition: BaseStats.cs:47
SourceStat.Row source
Definition: BaseStats.cs:15
virtual Emo2 EmoIcon
Definition: BaseStats.cs:17
int id
Definition: BaseStats.cs:11
virtual int GetValue()
Definition: BaseStats.cs:52
void SetGender(int g)
Definition: Biography.cs:473
void Generate(Chara c)
Definition: Biography.cs:323
int elementId
Definition: BodySlot.cs:6
Thing thing
Definition: BodySlot.cs:8
virtual bool isPCC
Definition: CardActor.cs:39
static void Set(CardBlueprint _bp=null)
static CardBlueprint CharaGenEQ
Chara Find(string id)
Definition: CardManager.cs:20
GlobalCharaList globalCharas
Definition: CardManager.cs:46
void PlayAnime(AnimeID id, bool force)
RendererReplacer replacer
Definition: CardRenderer.cs:29
Vector3 position
Definition: CardRenderer.cs:21
TransAnime anime
Definition: CardRenderer.cs:23
virtual void NextFrame()
void RefreshExtra()
CardActor actor
Definition: CardRenderer.cs:11
Definition: Card.cs:11
bool IsNegativeGift
Definition: Card.cs:2396
bool isDestroyed
Definition: Card.cs:75
MinionType c_minionType
Definition: Card.cs:988
bool IsPCFactionOrMinion
Definition: Card.cs:2272
void Teleport(Point point, bool silent=false, bool force=false)
Definition: Card.cs:5872
bool IsDecayed
Definition: Card.cs:2287
bool IsAmmo
Definition: Card.cs:2247
bool isSummon
Definition: Card.cs:710
virtual Chara Chara
Definition: Card.cs:2070
Thing Split(int a)
Definition: Card.cs:3484
int EvalueMax(int ele, int min=0)
Definition: Card.cs:2585
void MakeFigureFrom(string id)
Definition: Card.cs:5705
ElementContainerCard elements
Definition: Card.cs:41
string id
Definition: Card.cs:35
bool isNPCProperty
Definition: Card.cs:554
int GetSightRadius()
Definition: Card.cs:6428
bool IsUnique
Definition: Card.cs:2091
Hostility c_originalHostility
Definition: Card.cs:976
bool isRestrained
Definition: Card.cs:566
bool IsThrownWeapon
Definition: Card.cs:2245
int ExpToNext
Definition: Card.cs:2008
CardBlueprint bp
Definition: Card.cs:77
SourceMaterial.Row material
Definition: Card.cs:2051
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:6178
Card ChangeMaterial(int idNew, bool ignoreFixedMaterial=false)
Definition: Card.cs:3041
bool isCopy
Definition: Card.cs:878
Card MakeRefFrom(string id)
Definition: Card.cs:5710
void ClampInitialSkill()
Definition: Card.cs:2943
virtual int GetPrice(CurrencyType currency=CurrencyType.Money, bool sell=false, PriceType priceType=PriceType.Default, Chara c=null)
Definition: Card.cs:7303
int c_lockLv
Definition: Card.cs:964
int GetEquipValue()
Definition: Card.cs:7204
Fov fov
Definition: Card.cs:57
int invY
Definition: Card.cs:1955
bool IsCursed
Definition: Card.cs:2255
int c_uidMaster
Definition: Card.cs:1449
Biography bio
Definition: Card.cs:44
Thing AddThing(string id, int lv=-1)
Definition: Card.cs:3104
void Talk(string idTopic, string ref1=null, string ref2=null, bool forceSync=false)
Definition: Card.cs:6734
Card SetLv(int a)
Definition: Card.cs:2905
Rarity rarity
Definition: Card.cs:314
string Name
Definition: Card.cs:2137
bool IsRangedWeapon
Definition: Card.cs:2243
int CHA
Definition: Card.cs:2347
ICardParent parent
Definition: Card.cs:55
bool ExistsOnMap
Definition: Card.cs:2085
bool IsHotItem
Definition: Card.cs:119
Thing SetNum(int a)
Definition: Card.cs:3495
void SetReplica(bool on)
Definition: Card.cs:3075
bool IsFood
Definition: Card.cs:2175
virtual void SetBlessedState(BlessedState s)
Definition: Card.cs:3895
bool isAcidproof
Definition: Card.cs:686
bool HasTag(CTAG tag)
Definition: Card.cs:2595
Point pos
Definition: Card.cs:59
void DyeRandom()
Definition: Card.cs:6019
int uid
Definition: Card.cs:122
Effect PlayEffect(string id, bool useRenderPos=true, float range=0f, Vector3 fix=default(Vector3))
Definition: Card.cs:6212
bool IsEquipmentOrRanged
Definition: Card.cs:2218
void TryStack(Thing t)
Definition: Card.cs:7010
void ShowEmo(Emo _emo=Emo.none, float duration=0f, bool skipSame=true)
Definition: Card.cs:6146
Trait trait
Definition: Card.cs:53
void ModCurrency(int a, string id="money")
Definition: Card.cs:3961
virtual bool IsAliveInCurrentZone
Definition: Card.cs:2127
MoveType
Definition: Card.cs:20
void DamageHP(long dmg, AttackSource attackSource=AttackSource.None, Card origin=null)
Definition: Card.cs:4063
void SayNothingHappans()
Definition: Card.cs:6846
bool isNew
Definition: Card.cs:482
void Destroy()
Definition: Card.cs:5070
bool c_isImportant
Definition: Card.cs:1024
MoveResult
Definition: Card.cs:13
bool noMove
Definition: Card.cs:770
bool HaveFur()
Definition: Card.cs:7903
ThingContainer things
Definition: Card.cs:38
bool IsInstalled
Definition: Card.cs:2381
bool IsMeleeWeapon
Definition: Card.cs:2241
virtual bool isChara
Definition: Card.cs:2083
virtual Thing Thing
Definition: Card.cs:2058
Card GetRootCard()
Definition: Card.cs:3426
int Evalue(int ele)
Definition: Card.cs:2571
int Dist(Card c)
Definition: Card.cs:7698
bool isHidden
Definition: Card.cs:530
void MoveImmediate(Point p, bool focus=true, bool cancelAI=true)
Definition: Card.cs:5846
virtual bool IsPCFaction
Definition: Card.cs:2269
bool isGifted
Definition: Card.cs:782
BlessedState blessedState
Definition: Card.cs:278
Thing Duplicate(int num)
Definition: Card.cs:3444
int _colorInt
Definition: Card.cs:67
bool isScaled
Definition: Card.cs:914
bool TryStackTo(Thing to)
Definition: Card.cs:3397
virtual bool IsPCFactionMinion
Definition: Card.cs:2155
Card Install()
Definition: Card.cs:3741
void ApplyBacker(int bid)
Definition: Card.cs:7027
Card parentCard
Definition: Card.cs:103
void ModExp(string alias, int a)
Definition: Card.cs:2648
string c_idRefName
Definition: Card.cs:1641
int GetLightRadius()
Definition: Card.cs:6437
int genLv
Definition: Card.cs:194
int Num
Definition: Card.cs:158
SourceCategory.Row category
Definition: Card.cs:2049
void ModNum(int a, bool notify=true)
Definition: Card.cs:3515
bool isLeashed
Definition: Card.cs:842
bool IsIdentified
Definition: Card.cs:2377
bool IsContainer
Definition: Card.cs:2089
int c_charges
Definition: Card.cs:1269
CardRenderer renderer
Definition: Card.cs:61
void AddExp(int a, bool applyMod=true)
Definition: Card.cs:2951
bool HasElement(int ele, bool includeNagative=false)
Definition: Card.cs:5933
int LV
Definition: Card.cs:386
void Say(string lang, string ref1=null, string ref2=null)
Definition: Card.cs:6851
string c_idRefCard
Definition: Card.cs:1737
Thing MakeEgg(bool effect=true, int num=1, bool addToZone=true, int fertChance=20, BlessedState? state=null)
Definition: Card.cs:5728
List< Chara > charas
Definition: CellDetail.cs:13
bool isHostileAct
Definition: CellEffect.cs:74
EffectId idEffect
Definition: CellEffect.cs:38
bool isCursed
Definition: CellEffect.cs:98
SourceCellEffect.Row source
Definition: CellEffect.cs:145
bool isBlessed
Definition: CellEffect.cs:86
Definition: Cell.cs:7
Room room
Definition: Cell.cs:102
SourceBlock.Row sourceBlock
Definition: Cell.cs:1052
bool IsSnowTile
Definition: Cell.cs:782
SourceFloor.Row sourceFloor
Definition: Cell.cs:1054
CellEffect effect
Definition: Cell.cs:94
bool hasDoorBoat
Definition: Cell.cs:498
bool HasBridge
Definition: Cell.cs:671
bool IsTopWaterAndNoSnow
Definition: Cell.cs:712
bool isClearSnow
Definition: Cell.cs:450
bool isFloating
Definition: Cell.cs:474
SourceMaterial.Row matObj
Definition: Cell.cs:1036
byte topHeight
Definition: Cell.cs:78
byte light
Definition: Cell.cs:60
SourceFloor.Row sourceBridge
Definition: Cell.cs:1056
byte z
Definition: Cell.cs:58
bool HasRoof
Definition: Cell.cs:648
SourceMaterial.Row matFloor
Definition: Cell.cs:1032
bool isSeen
Definition: Cell.cs:282
byte obj
Definition: Cell.cs:38
SourceObj.Row sourceObj
Definition: Cell.cs:1072
byte x
Definition: Cell.cs:56
bool HasRamp
Definition: Cell.cs:837
bool hasDoor
Definition: Cell.cs:258
SourceFloor.Row sourceSurface
Definition: Cell.cs:1059
float GetSurfaceHeight()
Definition: Cell.cs:1688
bool CanSuffocate()
Definition: Cell.cs:1111
ActList list
Definition: CharaAbility.cs:12
bool HasWeapon()
Definition: CharaBody.cs:385
void RemoveBodyPartAt(int idx)
Definition: CharaBody.cs:329
void SetOwner(Chara chara, bool deserialized=false)
Definition: CharaBody.cs:18
void AddBodyPart(int ele, Thing thing=null)
Definition: CharaBody.cs:268
bool HasElement(int idEle)
Definition: CharaBody.cs:397
List< BodySlot > slots
Definition: CharaBody.cs:8
BodySlot slotMainHand
Definition: CharaBody.cs:10
bool IsTooHeavyToEquip(Thing thing)
Definition: CharaBody.cs:160
AttackStyle GetAttackStyle()
Definition: CharaBody.cs:464
bool IsEquippable(Thing thing, BodySlot slot, bool text=true)
Definition: CharaBody.cs:110
int GetWeight(bool armorOnly=false)
Definition: CharaBody.cs:421
bool Equip(Thing thing, BodySlot slot=null, bool msg=true)
Definition: CharaBody.cs:186
BodySlot GetSlot(Thing t, bool onlyEmpty=false, bool secondSlot=false)
Definition: CharaBody.cs:354
void RefreshBodyParts()
Definition: CharaBody.cs:294
void RemoveBodyPart(int ele)
Definition: CharaBody.cs:323
static Chara CreateFromFilter(string id, int lv=-1, int levelRange=-1)
Definition: CharaGen.cs:22
static Chara Create(string id, int lv=-1)
Definition: CharaGen.cs:17
override void SetOwner(Card c)
PCCData pccData
Definition: Chara.cs:10
void OnInsulted()
Definition: Chara.cs:8165
SourceCategory.Row GetFavCat()
Definition: Chara.cs:8056
void GetRevived()
Definition: Chara.cs:5121
string[] _strs
Definition: Chara.cs:79
bool IsHumanSpeak
Definition: Chara.cs:1015
void DamageTempElement(int ele, int p, bool onlyRenew=false)
Definition: Chara.cs:10291
Stats depression
Definition: Chara.cs:1148
bool UseAbility(string idAct, Card tc=null, Point pos=null, bool pt=false)
Definition: Chara.cs:5839
void Refresh(bool calledRecursive=false)
Definition: Chara.cs:1725
void ChangeRace(string idNew)
Definition: Chara.cs:2261
override SourcePref Pref
Definition: Chara.cs:787
bool HasHobbyOrWork(string alias)
Definition: Chara.cs:8841
static List< Chara > _pts
Definition: Chara.cs:186
string IDPCCBodySet
Definition: Chara.cs:491
void TickConditions()
Definition: Chara.cs:3664
override string actorPrefab
Definition: Chara.cs:519
bool wasInWater
Definition: Chara.cs:148
void UpdateSight()
Definition: Chara.cs:3636
int _affinity
Definition: Chara.cs:303
Stats sleepiness
Definition: Chara.cs:1156
static Point _sharedPos
Definition: Chara.cs:174
override bool IsAliveInCurrentZone
Definition: Chara.cs:561
void SetDirtySpeed()
Definition: Chara.cs:1859
bool IsFriendOrAbove(Chara c)
Definition: Chara.cs:6629
int GetBurden(Card t=null, int num=-1)
Definition: Chara.cs:1808
override void ApplyEditorTags(EditorTag tag)
Definition: Chara.cs:2026
Element MainElement
Definition: Chara.cs:717
Thing FindBestFoodToEat()
Definition: Chara.cs:7548
new TraitChara trait
Definition: Chara.cs:503
Hostility OriginalHostility
Definition: Chara.cs:471
void ResetBody()
Definition: Chara.cs:2216
CharaBody body
Definition: Chara.cs:94
LayerDrama _ShowDialog(string book, string sheet, string step="main", string tag="")
Definition: Chara.cs:7225
Card held
Definition: Chara.cs:70
bool IsEyth
Definition: Chara.cs:1052
bool isAlawysVisible
Definition: Chara.cs:401
bool CanAcceptGift(Chara c, Card t)
Definition: Chara.cs:8212
bool IsLevitating
Definition: Chara.cs:597
WorkSummary GetWorkSummary()
Definition: Chara.cs:9143
float idleTimer
Definition: Chara.cs:120
override void Rotate(bool reverse=false)
Definition: Chara.cs:3514
AIAct ai
Definition: Chara.cs:202
void RemoveGlobal()
Definition: Chara.cs:1499
Chara CreateReplacement()
Definition: Chara.cs:8015
bool TryUse(Thing t)
Definition: Chara.cs:7876
override Sprite GetImageSprite()
Definition: Chara.cs:7028
MoveResult TryMoveFrom(Point p)
Definition: Chara.cs:2678
void ValidateWorks()
Definition: Chara.cs:9221
void MoveHome(Zone zone, int x=-1, int z=-1)
Definition: Chara.cs:3449
void TryPickGroundItem()
Definition: Chara.cs:4421
void ChangeMemberType(FactionMemberType type)
Definition: Chara.cs:7033
void TickCooldown()
Definition: Chara.cs:8732
void CureTempElements(int p, bool body, bool mind)
Definition: Chara.cs:10325
bool IsDragon
Definition: Chara.cs:963
bool TryNeckHunt(Chara TC, int power, bool harvest=false)
Definition: Chara.cs:9629
Element GetBuffStats(string alias)
Definition: Chara.cs:9423
bool IsWealthy
Definition: Chara.cs:1055
bool isWet
Definition: Chara.cs:142
static NoGoal _NoGoalPC
Definition: Chara.cs:196
void Cuddle(Chara c, bool headpat=false)
Definition: Chara.cs:6267
ConSuspend conSuspend
Definition: Chara.cs:104
bool IsCriticallyWounded(bool includeRide=false)
Definition: Chara.cs:1177
void ModTempElement(int ele, int a, bool naturalDecay=false, bool onlyRenew=false)
Definition: Chara.cs:10233
bool CanRevive()
Definition: Chara.cs:5116
bool CanPick(Card c)
Definition: Chara.cs:4265
void SetAIIdle()
Definition: Chara.cs:8866
string idFaith
Definition: Chara.cs:231
bool CanInteractTo(Point p)
Definition: Chara.cs:2522
override void SetSortVal(UIList.SortMode m, CurrencyType currency=CurrencyType.Money)
Definition: Chara.cs:7280
void TryPutShared(Thing t, List< Thing > containers=null, bool dropIfFail=true)
Definition: Chara.cs:4437
void CureHost(CureType type, int p=100, BlessedState state=BlessedState.Normal)
Definition: Chara.cs:9490
int[] _cints
Definition: Chara.cs:82
int stealthSeen
Definition: Chara.cs:188
bool canSeeInvisible
Definition: Chara.cs:138
int sharedCheckTurn
Definition: Chara.cs:118
void RefreshWorkElements(ElementContainer parent=null)
Definition: Chara.cs:9010
bool MutateRandom(int vec=0, int tries=100, bool ether=false, BlessedState state=BlessedState.Normal)
Definition: Chara.cs:9980
void InstantEat(Thing t=null, bool sound=true)
Definition: Chara.cs:7569
Goal GetGoalFromTimeTable(int hour)
Definition: Chara.cs:8783
Condition AddCondition(string id, int p=100, bool force=false)
Definition: Chara.cs:9250
override Sprite GetSprite(int dir=0)
Definition: Chara.cs:6694
bool IsHostile(Chara c)
Definition: Chara.cs:6537
Faction _faction
Definition: Chara.cs:156
Thing FindAmmo(Thing weapon)
Definition: Chara.cs:7817
Faction faction
Definition: Chara.cs:427
override bool isThing
Definition: Chara.cs:684
int Speed
Definition: Chara.cs:1083
void ModAffinity(Chara c, int a, bool show=true, bool showOnlyEmo=false)
Definition: Chara.cs:7937
override bool IsPC
Definition: Chara.cs:612
string idFaction
Definition: Chara.cs:243
int combatCount
Definition: Chara.cs:114
GoalListType goalListType
Definition: Chara.cs:279
override CardRow sourceRenderCard
Definition: Chara.cs:453
void _MakeAlly()
Definition: Chara.cs:2296
override int GetArmorSkill()
Definition: Chara.cs:7867
void EnhanceTempElement(int ele, int p, bool onlyRenew=false)
Definition: Chara.cs:10305
static bool consumeTurn
Definition: Chara.cs:180
bool isDrunk
Definition: Chara.cs:124
Chara host
Definition: Chara.cs:33
bool knowFav
Definition: Chara.cs:413
void SetFaith(Religion r)
Definition: Chara.cs:1710
Thing MakeBraineCell()
Definition: Chara.cs:8160
bool IsPlant
Definition: Chara.cs:975
bool IsValidGiftWeight(Card t, int num=-1)
Definition: Chara.cs:8181
Condition AddCondition(Condition c, bool force=false)
Definition: Chara.cs:9255
SourceJob.Row job
Definition: Chara.cs:466
Point GetFirstStep(Point newPoint, PathManager.MoveType moveType=PathManager.MoveType.Default)
Definition: Chara.cs:2571
Chara GetNearbyCatToSniff()
Definition: Chara.cs:8076
void RemoveAllStances()
Definition: Chara.cs:9617
List< int > _cooldowns
Definition: Chara.cs:58
static List< SourceCategory.Row > _listFavCat
Definition: Chara.cs:194
void SetFeat(int id, int value=1, bool msg=false)
Definition: Chara.cs:9879
void ResetUpgrade()
Definition: Chara.cs:8546
bool CanSeeLos(Card c, int dist=-1)
Definition: Chara.cs:1250
AIAct SetNoGoal()
Definition: Chara.cs:8875
bool IsMofuable
Definition: Chara.cs:1099
bool IsMaid
Definition: Chara.cs:1027
override bool IsGlobal
Definition: Chara.cs:610
override bool IsPCParty
Definition: Chara.cs:615
static Point shared
Definition: Chara.cs:11
int DestDist
Definition: Chara.cs:998
void ShowDialog()
Definition: Chara.cs:7038
override void WriteNote(UINote n, Action< UINote > onWriteNote=null, IInspect.NoteMode mode=IInspect.NoteMode.Default, Recipe recipe=null)
Definition: Chara.cs:7270
override string ToString()
Definition: Chara.cs:1172
Party party
Definition: Chara.cs:43
void TryTakeSharedItems(IEnumerable< Thing > containers, bool msg=true, bool shouldEat=true)
Definition: Chara.cs:7389
bool CanDestroyPath()
Definition: Chara.cs:2410
ElementContainer tempElements
Definition: Chara.cs:36
void TryPutSharedItems(bool msg=true)
Definition: Chara.cs:7379
void SetMainElement(int id, int v=0, bool elemental=false)
Definition: Chara.cs:2084
Stats hygiene
Definition: Chara.cs:1152
int interest
Definition: Chara.cs:317
void ApplyRace(bool remove=false)
Definition: Chara.cs:2239
bool CanAcceptItem(Card t, int num=-1)
Definition: Chara.cs:8191
int corruption
Definition: Chara.cs:377
bool RequestProtection(Chara attacker, Action< Chara > action)
Definition: Chara.cs:8380
void OnAdvanceDay()
Definition: Chara.cs:10126
int GetHappiness()
Definition: Chara.cs:7245
void ModHeight(int a)
Definition: Chara.cs:9770
PathProgress path
Definition: Chara.cs:92
bool isParalyzed
Definition: Chara.cs:132
void ReleaseMinion()
Definition: Chara.cs:2362
int EvalueRiding()
Definition: Chara.cs:6166
bool IsInCombat
Definition: Chara.cs:864
bool TryWorkOutside(SourceHobby.Row sourceWork)
Definition: Chara.cs:9173
TraitBed TryAssignBed()
Definition: Chara.cs:7328
void UpdateAngle()
Definition: Chara.cs:3575
override void OnSerializing()
Definition: Chara.cs:1312
List< Condition > conditions
Definition: Chara.cs:211
int MaxGeneSlot
Definition: Chara.cs:1068
bool IsBranchMember()
Definition: Chara.cs:6585
void SetMutation(int idEle, int a=0)
Definition: Chara.cs:9943
void HoldCard(Card t, int num=-1)
Definition: Chara.cs:4467
void PickHeld(bool msg=false)
Definition: Chara.cs:4519
static bool isOnCreate
Definition: Chara.cs:184
bool HasCondition(string alias)
Definition: Chara.cs:9411
SpriteReplacer spriteReplacer
Definition: Chara.cs:154
void Banish(Chara owner)
Definition: Chara.cs:2330
static List< Thing > _ListItems
Definition: Chara.cs:190
AIAct SetAI(AIAct g)
Definition: Chara.cs:8880
Chara SetHomeZone(Zone zone)
Definition: Chara.cs:1427
bool IsIdle
Definition: Chara.cs:853
Chara SetFaction(Faction f)
Definition: Chara.cs:1419
void SetMainElement(string id, int v=0, bool elemental=false)
Definition: Chara.cs:2075
void HealAll()
Definition: Chara.cs:1716
override bool IsDisabled
Definition: Chara.cs:585
int CurrentGeneSlot
Definition: Chara.cs:1071
Thing GetBestRangedWeapon()
Definition: Chara.cs:7832
TraitBed FindBed()
Definition: Chara.cs:7316
bool IsPrisoner
Definition: Chara.cs:1038
bool IsNeutralOrAbove()
Definition: Chara.cs:6580
bool IsAdventurer
Definition: Chara.cs:1041
bool _isLevitating
Definition: Chara.cs:134
bool hasMovedThisTurn
Definition: Chara.cs:176
int happiness
Definition: Chara.cs:108
void DiminishTempElements(int a=1)
Definition: Chara.cs:10310
int uidEditor
Definition: Chara.cs:353
Stats hunger
Definition: Chara.cs:1142
int GetCurrentDir()
Definition: Chara.cs:3614
override string GetName(NameStyle style, int num=-1)
Definition: Chara.cs:1357
override bool IsMinion
Definition: Chara.cs:627
int GetHireCost()
Definition: Chara.cs:7240
Chara SetGlobal(Zone _home, int x, int z)
Definition: Chara.cs:1471
void EnhanceTempElements(int p, bool body, bool mind, bool onlyRenew=false)
Definition: Chara.cs:10296
override string GetHoverText()
Definition: Chara.cs:6770
override int WeightLimit
Definition: Chara.cs:710
override void OnDeserialized()
Definition: Chara.cs:1327
override void SetSource()
Definition: Chara.cs:2063
int contribution
Definition: Chara.cs:18
bool TryHoldCard(Card t, int num=-1, bool pickHeld=false)
Definition: Chara.cs:4445
override bool isSynced
Definition: Chara.cs:691
static List< Hobby > listHobby
Definition: Chara.cs:13
Point orgPos
Definition: Chara.cs:21
int CalcCastingChance(Element e, int num=1)
Definition: Chara.cs:6175
bool ShouldEquip(Thing t, bool useFav=false)
Definition: Chara.cs:7615
bool CanMoveTo(Point p, bool allowDestroyPath=true)
Definition: Chara.cs:2423
Emo2 emoIcon
Definition: Chara.cs:106
bool IsHuman
Definition: Chara.cs:879
WorkSummary _workSummary
Definition: Chara.cs:55
bool HasMinion(string id)
Definition: Chara.cs:2350
override bool HasHost
Definition: Chara.cs:688
bool MoveRandom()
Definition: Chara.cs:2576
bool IsAnimal
Definition: Chara.cs:867
void DestroyPath(Point pos)
Definition: Chara.cs:3172
int daysStarved
Definition: Chara.cs:329
int CountDebuff()
Definition: Chara.cs:9440
override CardRenderer _CreateRenderer()
Definition: Chara.cs:6645
void PickOrDrop(Point p, string idThing, int idMat=-1, int num=1, bool msg=true)
Definition: Chara.cs:4283
void TryPutSharedItems(IEnumerable< Thing > containers, bool msg=true)
Definition: Chara.cs:7346
override bool IsPCFaction
Definition: Chara.cs:671
override bool IsPCPartyMinion
Definition: Chara.cs:639
bool TryNullifyCurse()
Definition: Chara.cs:10100
override int SelfWeight
Definition: Chara.cs:712
void CalculateMaxStamina()
Definition: Chara.cs:2007
int MaxSummon
Definition: Chara.cs:714
Chara ScaleByPrincipal()
Definition: Chara.cs:1694
Thing TryGetThrowable()
Definition: Chara.cs:7771
void MoveZone(Zone z, ZoneTransition transition)
Definition: Chara.cs:3332
void TryUpgrade(bool msg=true)
Definition: Chara.cs:8551
int calmCheckTurn
Definition: Chara.cs:116
void MakeMinion(Chara _master, MinionType type=MinionType.Default)
Definition: Chara.cs:2339
override void LookAt(Point p)
Definition: Chara.cs:3533
void OnBanish()
Definition: Chara.cs:1441
override bool flipX
Definition: Chara.cs:547
void Kick(Chara t, bool ignoreSelf=false, bool karmaLoss=true, bool show=true, bool checkWall=true)
Definition: Chara.cs:5788
string NameBraced
Definition: Chara.cs:514
bool CanSee(Card c)
Definition: Chara.cs:1218
bool HasAccess(Card c)
Definition: Chara.cs:1280
Goal GetGoalWork()
Definition: Chara.cs:8815
override int DV
Definition: Chara.cs:729
ConSleep conSleep
Definition: Chara.cs:102
List< Element > ListAvailabeFeats(bool pet=false, bool showAll=false)
Definition: Chara.cs:9864
override bool IsPCFactionMinion
Definition: Chara.cs:655
void Vomit()
Definition: Chara.cs:5275
void SetCooldown(int idEle, int turns=0)
Definition: Chara.cs:8679
void AddWork(int id)
Definition: Chara.cs:9092
bool IsFriendOrAbove()
Definition: Chara.cs:6624
override MoveResult _Move(Point newPoint, MoveType type=MoveType.Walk)
Definition: Chara.cs:2742
bool CanEat(Thing t, bool shouldEat=false)
Definition: Chara.cs:7594
float actTime
Definition: Chara.cs:178
Tactics _tactics
Definition: Chara.cs:164
bool ShouldThrowAway(Thing t, ClearInventoryType type)
Definition: Chara.cs:8452
void SetAIAggro()
Definition: Chara.cs:8870
ElementContainer _baseWorkElements
Definition: Chara.cs:204
override void Die(Element e=null, Card origin=null, AttackSource attackSource=AttackSource.None, Chara originalTarget=null)
Definition: Chara.cs:5311
MoveResult TryMove(Point newPoint, bool allowDestroyPath=true)
Definition: Chara.cs:2718
Chara Duplicate()
Definition: Chara.cs:1783
void MakePartyMemeber()
Definition: Chara.cs:2270
void SetAIImmediate(AIAct g)
Definition: Chara.cs:8912
void PerformWork(WorkSession session, bool isHobby=false, bool IsRealTime=false)
Definition: Chara.cs:9185
void PickOrDrop(Point p, Thing t, bool msg=true)
Definition: Chara.cs:4291
static GoalHobby _goalHobby
Definition: Chara.cs:208
void ClearTempElements()
Definition: Chara.cs:10355
override int MaxHP
Definition: Chara.cs:708
Zone currentZone
Definition: Chara.cs:255
bool IsFairy
Definition: Chara.cs:939
bool HasAccess(Point p)
Definition: Chara.cs:1285
override bool isChara
Definition: Chara.cs:686
void Kick(Point p, bool ignoreSelf=false, bool checkWall=true)
Definition: Chara.cs:5780
string Aka
Definition: Chara.cs:216
override bool IsDeadOrSleeping
Definition: Chara.cs:573
Stats bladder
Definition: Chara.cs:1150
bool CanReplace(Chara c)
Definition: Chara.cs:3283
List< Hobby > ListHobbies(bool useMemberType=true)
Definition: Chara.cs:8971
Thing ranged
Definition: Chara.cs:98
Stats SAN
Definition: Chara.cs:1158
void MakeAlly(bool msg=true)
Definition: Chara.cs:2276
void RemoveLastBodyPart(bool msg=false)
Definition: Chara.cs:2202
Point lastPos
Definition: Chara.cs:90
ElementContainer baseWorkElements
Definition: Chara.cs:1111
void TickWork(VirtualDate date)
Definition: Chara.cs:9152
Goal GetGoalHobby()
Definition: Chara.cs:8828
int _maxStamina
Definition: Chara.cs:365
bool isWeakToSunlight
Definition: Chara.cs:152
void Stumble(int mtp=100)
Definition: Chara.cs:1842
bool CanDuplicate()
Definition: Chara.cs:1758
void ClearInventory(ClearInventoryType type)
Definition: Chara.cs:8523
SourceChara.Row source
Definition: Chara.cs:158
void GainAbility(int ele, int mtp=100, Thing origin=null)
Definition: Chara.cs:10076
bool isCreated
Definition: Chara.cs:136
Stats mana
Definition: Chara.cs:1154
void MoveByForce(Point newPoint, Card c=null, bool checkWall=false)
Definition: Chara.cs:2608
bool FindNewEnemy()
Definition: Chara.cs:6448
FactionMemberType memberType
Definition: Chara.cs:46
string TalkTopic(string topic="calm")
Definition: Chara.cs:6967
int _idTimeTable
Definition: Chara.cs:341
void TryDropBossLoot()
Definition: Chara.cs:5614
override int PV
Definition: Chara.cs:758
string GetIdPortraitCat()
Definition: Chara.cs:8124
SourceRace.Row _race
Definition: Chara.cs:160
Stats stamina
Definition: Chara.cs:1146
bool CanGainConResist
Definition: Chara.cs:1161
string NameTitled
Definition: Chara.cs:516
bool HasHigherGround(Card c)
Definition: Chara.cs:1190
void TryRestock(bool onCreate)
Definition: Chara.cs:4678
void RestockInventory(bool onCreate)
Definition: Chara.cs:4990
List< List< string > > _historyFood
Definition: Chara.cs:64
bool MoveNeighborDefinitely()
Definition: Chara.cs:2590
bool CanSleep()
Definition: Chara.cs:1299
bool UseAbility(int idAct, Card tc=null, Point pos=null, bool pt=false)
Definition: Chara.cs:5834
Stats burden
Definition: Chara.cs:1144
void AddHobby(int id)
Definition: Chara.cs:9080
bool visibleWithTelepathy
Definition: Chara.cs:150
void ChangeJob(string idNew)
Definition: Chara.cs:2162
GlobalData global
Definition: Chara.cs:76
SourceThing.Row GetFavFood()
Definition: Chara.cs:8036
override bool IsMoving
Definition: Chara.cs:608
void SetTempHand(int right=0, int left=0)
Definition: Chara.cs:6709
int[] rawSlots
Definition: Chara.cs:73
void GoHostile(Card _tg)
Definition: Chara.cs:6331
void ApplyJob(bool remove=false)
Definition: Chara.cs:2153
bool IsGod
Definition: Chara.cs:951
bool IsHomeMember()
Definition: Chara.cs:6594
Chara parasite
Definition: Chara.cs:30
void AddRandomBodyPart(bool msg=false)
Definition: Chara.cs:2191
string GetActionText()
Definition: Chara.cs:7260
void SyncRide(Chara c)
Definition: Chara.cs:3939
Chara master
Definition: Chara.cs:88
List< Hobby > ListWorks(bool useMemberType=true)
Definition: Chara.cs:8944
Card DropHeld(Point dropPos=null)
Definition: Chara.cs:4596
void Revive(Point p=null, bool msg=false)
Definition: Chara.cs:5142
void TryReservePickupTutorial(Thing t)
Definition: Chara.cs:4397
Chara ride
Definition: Chara.cs:27
LayerDrama ShowDialog(string book, string step="main", string tag="")
Definition: Chara.cs:7220
Zone homeZone
Definition: Chara.cs:267
void RefreshFaithElement()
Definition: Chara.cs:10190
ElementContainer faithElements
Definition: Chara.cs:38
override void ChangeRarity(Rarity r)
Definition: Chara.cs:1406
void GiveLovePotion(Chara c, Thing t)
Definition: Chara.cs:8370
bool IsUndead
Definition: Chara.cs:891
void AddCooldown(int idEle, int turns=0)
Definition: Chara.cs:8661
bool IsGuest()
Definition: Chara.cs:6619
int GetTotalFeat()
Definition: Chara.cs:8098
Hobby GetWork(string id)
Definition: Chara.cs:8991
GoalList goalList
Definition: Chara.cs:200
bool IsHorror
Definition: Chara.cs:915
SourceJob.Row _job
Definition: Chara.cs:162
bool CanOpenDoor
Definition: Chara.cs:819
void SetEQQuality()
Definition: Chara.cs:5029
void RerollHobby(bool extraSlotChance=true)
Definition: Chara.cs:9104
Thing MakeGene(DNA.Type? type=null)
Definition: Chara.cs:8155
void RefreshSpeed(Element.BonusInfo info=null)
Definition: Chara.cs:1868
static List< SourceRace.Row > ListAdvRace
Definition: Chara.cs:166
bool IsLocalChara
Definition: Chara.cs:841
bool CanBeTempAlly(Chara c)
Definition: Chara.cs:2317
bool CanBloom()
Definition: Chara.cs:8644
int GetCooldown(int idEle)
Definition: Chara.cs:8717
override string AliasMaterialOnCreate
Definition: Chara.cs:558
void ModWeight(int a, bool ignoreLimit=false)
Definition: Chara.cs:9792
bool ignoreSPAbsorb
Definition: Chara.cs:146
void AddFoodHistory(Thing food)
Definition: Chara.cs:10141
override CardRow sourceCard
Definition: Chara.cs:450
BaseArea GetRoomWork()
Definition: Chara.cs:8922
bool CanInteractTo(Card c)
Definition: Chara.cs:2517
Thing nextUse
Definition: Chara.cs:100
Affinity affinity
Definition: Chara.cs:314
string GetTopicText(string topic="calm")
Definition: Chara.cs:6934
static NoGoal _NoGoalRepeat
Definition: Chara.cs:198
void ModCorruption(int a)
Definition: Chara.cs:9821
void RestockEquip(bool onCreate)
Definition: Chara.cs:4688
override void SetDir(int d)
Definition: Chara.cs:3507
MoveResult TryMoveTowards(Point p)
Definition: Chara.cs:2616
bool isBerserk
Definition: Chara.cs:122
Religion faith
Definition: Chara.cs:439
List< int > _hobbies
Definition: Chara.cs:49
bool FindNearestNewEnemy()
Definition: Chara.cs:6517
string GetIdPortrait()
Definition: Chara.cs:8138
bool HasNoGoal
Definition: Chara.cs:1000
Element GetFavWeaponSkill()
Definition: Chara.cs:4664
void DropThing(Thing t, int num=-1)
Definition: Chara.cs:4616
Chara enemy
Definition: Chara.cs:86
void GiveGift(Chara c, Thing t)
Definition: Chara.cs:8237
void EQ_Item(string s, int num=1)
Definition: Chara.cs:5098
BitArray32 _cbits1
Definition: Chara.cs:84
string GetTextHappiness()
Definition: Chara.cs:7255
CharaAbility ability
Definition: Chara.cs:424
bool IsInActiveZone
Definition: Chara.cs:838
override void Tick()
Definition: Chara.cs:3952
Quest quest
Definition: Chara.cs:24
Chara FindMaster()
Definition: Chara.cs:2385
override bool IsMultisize
Definition: Chara.cs:706
Chara SetEnemy(Chara c=null)
Definition: Chara.cs:6306
void SyncRide()
Definition: Chara.cs:3923
void CallHelp(Chara tg, bool fanatic=false)
Definition: Chara.cs:6437
void DoHostileAction(Card _tg, bool immediate=false)
Definition: Chara.cs:6355
bool isBlind
Definition: Chara.cs:130
bool CanSeeSimple(Point p)
Definition: Chara.cs:1201
bool dirtySpeed
Definition: Chara.cs:170
Thing EQ_ID(string s, int mat=-1, Rarity r=Rarity.Random)
Definition: Chara.cs:5062
void ClearBed(Map map=null)
Definition: Chara.cs:7301
bool IsMachine
Definition: Chara.cs:903
override void SetRenderParam(RenderParam p)
Definition: Chara.cs:6734
void AddResistCon(Condition con)
Definition: Chara.cs:9654
void MoveZone(Zone z, ZoneTransition.EnterState state=ZoneTransition.EnterState.Auto)
Definition: Chara.cs:3324
bool UseAbility(Act a, Card tc=null, Point pos=null, bool pt=false)
Definition: Chara.cs:5844
bool TryEquip(Thing t, bool useFav=false)
Definition: Chara.cs:7727
Room FindRoom()
Definition: Chara.cs:7932
override SubPassData GetSubPassData()
Definition: Chara.cs:6718
bool CanSeeLos(Point p, int dist=-1)
Definition: Chara.cs:1259
int CountNumEaten(Thing food)
Definition: Chara.cs:10161
Point GetDestination()
Definition: Chara.cs:7235
int turnLastSeen
Definition: Chara.cs:110
static bool preventRegen
Definition: Chara.cs:182
void ResistCon(Condition con)
Definition: Chara.cs:9674
void SetSummon(int duration)
Definition: Chara.cs:2379
string _alias
Definition: Chara.cs:219
FactionBranch homeBranch
Definition: Chara.cs:1066
Element GetFavArmorSkill()
Definition: Chara.cs:4669
int GetPietyValue()
Definition: Chara.cs:10181
void ChooseNewGoal()
Definition: Chara.cs:8751
void DamageTempElements(int p, bool body, bool mind, bool onlyRenew=false)
Definition: Chara.cs:10279
bool IsEnemyOnPath(Point p, bool cancelAI=true)
Definition: Chara.cs:2494
void FallFromZone()
Definition: Chara.cs:3494
void Drink(Card t)
Definition: Chara.cs:5105
Hostility hostility
Definition: Chara.cs:291
void InitStats(bool onDeserialize=false)
Definition: Chara.cs:9227
bool isFainted
Definition: Chara.cs:128
void MoveHome(string id, int x=-1, int z=-1)
Definition: Chara.cs:3444
Tactics tactics
Definition: Chara.cs:834
bool CanWitness
Definition: Chara.cs:1003
Card SplitHeld(int a)
Definition: Chara.cs:4579
void TryDropCarryOnly()
Definition: Chara.cs:4584
bool IsHostile()
Definition: Chara.cs:6532
bool IsInHomeZone()
Definition: Chara.cs:6599
bool isDead
Definition: Chara.cs:389
bool TryIdentify(Thing t, int count=1, bool show=true)
Definition: Chara.cs:7993
Thing TryPoisonPotion(Thing t)
Definition: Chara.cs:4353
long _Speed
Definition: Chara.cs:172
void TryTakeSharedItems(bool msg=true)
Definition: Chara.cs:7384
override void LookAt(Card c)
Definition: Chara.cs:3528
bool isConfused
Definition: Chara.cs:126
static List< SourceThing.Row > _listFavFood
Definition: Chara.cs:192
void SaiyanRevive()
Definition: Chara.cs:5214
bool TryEquipRanged()
Definition: Chara.cs:7847
void SetFaith(string id)
Definition: Chara.cs:1705
PCCData pccData
Definition: Chara.cs:67
void ApplyDeathPenalty()
Definition: Chara.cs:5248
void Cure(CureType type, int p=100, BlessedState state=BlessedState.Normal)
Definition: Chara.cs:9503
static string[] IDTimeTable
Definition: Chara.cs:15
TimeTable.Span CurrentSpan
Definition: Chara.cs:836
Chara SetHostility(Hostility h)
Definition: Chara.cs:1434
Thing Pick(Thing t, bool msg=true, bool tryStack=true)
Definition: Chara.cs:4303
bool CanLift(Card c)
Definition: Chara.cs:4255
List< int > _listAbility
Definition: Chara.cs:61
void TrySetEnemy(Chara c)
Definition: Chara.cs:6323
string idTimeTable
Definition: Chara.cs:468
override void OnCreate(int genLv)
Definition: Chara.cs:1524
void TryAbsorbRod(Thing t)
Definition: Chara.cs:4367
bool CanAutoPick(Card c)
Definition: Chara.cs:4260
void Sniff(Chara c)
Definition: Chara.cs:8088
List< int > _works
Definition: Chara.cs:52
string GetTextWork(bool simple=false)
Definition: Chara.cs:9070
override bool IsPCC
Definition: Chara.cs:682
void TryPush(Point point)
Definition: Chara.cs:3216
string GetTextHobby(bool simple=false)
Definition: Chara.cs:9060
Dictionary< int, int > resistCon
Definition: Chara.cs:214
void OnSleep(Thing bed=null, int days=1)
Definition: Chara.cs:9712
bool hasTelepathy
Definition: Chara.cs:140
CharaAbility _ability
Definition: Chara.cs:96
Chara SetGlobal()
Definition: Chara.cs:1486
bool CanInsult()
Definition: Chara.cs:8112
void EQ_CAT(string s)
Definition: Chara.cs:5082
bool bossText
Definition: Chara.cs:144
override string GetHoverText2()
Definition: Chara.cs:6842
bool IsEscorted()
Definition: Chara.cs:2394
int ParseBodySlot(string s)
Definition: Chara.cs:2174
bool CanEquipRanged(Thing t)
Definition: Chara.cs:7766
void Sleep(Thing bed=null, Thing pillow=null, bool pickup=false, ItemPosition posBed=null, ItemPosition posPillow=null)
Definition: Chara.cs:9698
void OnGiveErohon(Thing t)
Definition: Chara.cs:8359
override int PrefIndex
Definition: Chara.cs:531
AttackStyle GetFavAttackStyle()
Definition: Chara.cs:4644
bool HasCooldown(int idEle)
Definition: Chara.cs:8712
static GoalWork _goalWork
Definition: Chara.cs:206
int idleActTimer
Definition: Chara.cs:112
bool IsFish
Definition: Chara.cs:927
bool IsCat
Definition: Chara.cs:987
void OnSleep(int power, int days=1, bool isSunLit=false)
Definition: Chara.cs:9732
void DoAI(int wait, Action onPerform)
Definition: Chara.cs:6255
ElementContainer workElements
Definition: Chara.cs:40
bool WillConsumeTurn()
Definition: Chara.cs:3652
bool IsNeutral()
Definition: Chara.cs:6575
static List< SourceJob.Row > ListAdvJob
Definition: Chara.cs:168
void MoveZone(string alias)
Definition: Chara.cs:3319
void CalcBurden()
Definition: Chara.cs:1827
void SetPCCState(PCCState state)
Definition: Chara.cs:6686
SourceRace.Row race
Definition: Chara.cs:464
Element GetBuffStats(int ele)
Definition: Chara.cs:9428
void MakeGrave(string lastword)
Definition: Chara.cs:5228
override void OnBeforeCreate()
Definition: Chara.cs:1508
bool DroppedCard(string id)
Definition: CodexManager.cs:46
void MarkCardDrop(string id)
Definition: CodexManager.cs:41
Color colorHostile
Color colorBlood
Color colorDebuff
Color colorFriend
UD_String_MatData matColors
Gradient gradientLVComparison
int uidMachine
Definition: ConSuspend.cs:6
virtual bool IsKilled
Definition: Condition.cs:7
void Kill(bool silent=false)
Definition: Condition.cs:91
override void Tick()
Definition: Condition.cs:70
static Condition Create(string alias, int power=100, Action< Condition > onCreate=null)
Definition: Condition.cs:46
bool allyKeepDistance
Definition: ConfigTactics.cs:6
static void Collect(Thing t)
bool ignoreBackerDestoryFlag
Definition: CoreConfig.cs:562
new GameConfig game
Definition: CoreConfig.cs:609
BackerContentConfig backer
Definition: CoreConfig.cs:613
bool ignoreWeight
Definition: CoreDebug.cs:187
bool godMode
Definition: CoreDebug.cs:173
bool showExtra
Definition: CoreDebug.cs:168
bool ignoreEncounter
Definition: CoreDebug.cs:201
bool enable
Definition: CoreDebug.cs:286
bool ignoreAutoSave
Definition: CoreDebug.cs:126
static string DramaData
Definition: CorePath.cs:178
SourcePref snowputit2
Definition: CoreRef.cs:326
SourcePref sonwputit1
Definition: CoreRef.cs:324
SourcePref replacer1
Definition: CoreRef.cs:330
PrefData prefs
Definition: CoreRef.cs:415
CoreRef refs
Definition: Core.cs:51
bool IsGameStarted
Definition: Core.cs:84
PCCManager pccs
Definition: Core.cs:41
CoreConfig config
Definition: Core.cs:70
static Thing MakeLoveLunch(Chara c)
Definition: CraftUtil.cs:220
static string GetBloodText(Chara c)
Definition: CraftUtil.cs:117
Definition: DNA.cs:8
Type
Definition: DNA.cs:10
static Thing GenerateGene(Chara c, Type? type=null)
Definition: DNA.cs:116
int hour
Definition: Date.cs:74
int GetRaw(int offsetHours=0)
Definition: Date.cs:326
bool IsExpired(int time)
Definition: Date.cs:336
bool IsNight
Definition: Date.cs:112
Definition: Dialog.cs:7
static bool warned
Definition: Dialog.cs:49
static void TryWarnMana(Action action)
Definition: Dialog.cs:391
Definition: EClass.cs:6
static Game game
Definition: EClass.cs:9
static Scene scene
Definition: EClass.cs:31
static Faction Home
Definition: EClass.cs:27
static ColorProfile Colors
Definition: EClass.cs:39
static int curve(int _a, int start, int step, int rate=75)
Definition: EClass.cs:69
static Core core
Definition: EClass.cs:7
static Zone _zone
Definition: EClass.cs:21
static World world
Definition: EClass.cs:41
static Map _map
Definition: EClass.cs:19
static int rnd(long a)
Definition: EClass.cs:59
static SourceManager sources
Definition: EClass.cs:43
static bool AdvMode
Definition: EClass.cs:11
static float rndf(float a)
Definition: EClass.cs:102
static FactionBranch Branch
Definition: EClass.cs:23
static BaseGameScreen screen
Definition: EClass.cs:33
static int rndHalf(int a)
Definition: EClass.cs:97
static Player player
Definition: EClass.cs:13
static Chara pc
Definition: EClass.cs:15
static int sqrt(int a)
Definition: EClass.cs:88
static CoreDebug debug
Definition: EClass.cs:49
static SoundManager Sound
Definition: EClass.cs:47
static UI ui
Definition: EClass.cs:17
static GameSetting setting
Definition: EClass.cs:35
Definition: EInput.cs:8
static void Consume(int _skipFrame)
Definition: EInput.cs:656
Definition: Effect.cs:7
static Effect Get(Effect original)
Definition: Effect.cs:85
void Play(float delay, Point from, float fixY=0f, Point to=null, Sprite sprite=null)
Definition: Effect.cs:100
void ModExp(int ele, float a, bool chain=false)
Dictionary< int, Element > dict
void SetParent(Card c)
int Value(int ele)
int ValueWithoutLink(int ele)
Element ModBase(int ele, int v)
void ApplyElementMap(int uid, SourceValueType type, Dictionary< int, int > map, int lv, bool invert=false, bool applyFeat=false)
void SetTo(int id, int v)
Element SetBase(string alias, int v, int potential=0)
void Remove(int id)
Element GetElement(string alias)
int ValueWithoutLink
Definition: ELEMENT.cs:294
static int[] List_Body
Definition: ELEMENT.cs:244
int id
Definition: ELEMENT.cs:250
int vBase
Definition: ELEMENT.cs:252
SourceElement.Row source
Definition: ELEMENT.cs:273
int vPotential
Definition: ELEMENT.cs:256
static SourceElement.Row Get(int id)
Definition: ELEMENT.cs:401
bool HasTag(string tag)
Definition: ELEMENT.cs:473
virtual int GetPower(Card c)
Definition: ELEMENT.cs:1073
int Value
Definition: ELEMENT.cs:292
virtual string Name
Definition: ELEMENT.cs:304
static Element Create(int id, int v=0)
Definition: ELEMENT.cs:1102
virtual Act.Cost GetCost(Chara c)
Definition: ELEMENT.cs:1032
static List< SourceElement.Row > ListElements
Definition: ELEMENT.cs:268
int vSource
Definition: ELEMENT.cs:262
static Element Void
Definition: ELEMENT.cs:238
static int[] List_Mind
Definition: ELEMENT.cs:246
virtual int CostLearn
Definition: ELEMENT.cs:314
static int[] List_MainAttributesMajor
Definition: ELEMENT.cs:242
Act act
Definition: ELEMENT.cs:394
bool IsMainAttribute
Definition: ELEMENT.cs:383
Zone zone
Definition: EloMap.cs:11
bool shore
Definition: EloMap.cs:50
Cell GetCell(Point pos)
Definition: EloMap.cs:272
TileInfo GetTileInfo(int gx, int gy)
Definition: EloMap.cs:286
void Add(Expedition ex)
static Expedition Create(Chara c, ExpeditionType type)
Definition: Expedition.cs:112
int hours
Definition: Expedition.cs:6
Definition: FLOOR.cs:2
static SourceFloor.Row sourceSnow
Definition: FLOOR.cs:31
static SourceFloor.Row sourceIce
Definition: FLOOR.cs:35
static bool IsTatami(int id)
Definition: FLOOR.cs:39
static SourceFloor.Row sourceWood
Definition: FLOOR.cs:37
ExpeditionManager expeditions
int Evalue(int ele)
void RemoveMemeber(Chara c)
PolicyManager policies
string Log(string idLang, string ref1=null, string ref2=null, string ref3=null, string ref4=null)
bool HasItemProtection
void AddMemeber(Chara c)
Dictionary< string, Faction > dictAll
Hostility GetHostility()
Definition: FACTION.cs:255
Definition: FEAT.cs:297
List< string > Apply(int a, ElementContainer owner, bool hint=false)
Definition: FEAT.cs:377
override string FullName
Definition: FEAT.cs:307
override bool IsPurchaseFeatReqMet(ElementContainer owner, int lv=-1)
Definition: FEAT.cs:351
static void Proc(Chara c, Thing food, bool consume=true)
Definition: FoodEffect.cs:11
Dictionary< int, byte > lastPoints
Definition: Fov.cs:36
void AdvanceMin(int a)
Definition: GameDate.cs:22
static string Parse(string text, bool thirdPerson, string val1, string val2=null, string val3=null, string val4=null)
Definition: GameLang.cs:141
bool disableVoidBlessing
bool disableDeathPenaltyProtection
RenderData renderTempEQ
Definition: GameScreen.cs:7
float defaultActPace
Definition: GameSetting.cs:327
PassSetting pass
Definition: GameSetting.cs:303
RenderSetting render
Definition: GameSetting.cs:301
UD_String_ElementRef elements
Definition: GameSetting.cs:315
bool autoCollectCard
Definition: Game.cs:51
ConfigPreference preference
Definition: Game.cs:96
ConfigTactics tactics
Definition: Game.cs:90
ConfigAutoCombat autoCombat
Definition: Game.cs:93
ReligionManager religions
Definition: Game.cs:158
GamePrincipal principal
Definition: Game.cs:224
bool Save(bool isAutoSave=false, bool silent=false)
Definition: Game.cs:1028
SpatialManager spatials
Definition: Game.cs:152
PCCUniformManager uniforms
Definition: Game.cs:194
CardManager cards
Definition: Game.cs:155
Zone activeZone
Definition: Game.cs:251
bool IsSurvival
Definition: Game.cs:275
new World world
Definition: Game.cs:176
Config config
Definition: Game.cs:218
QuestManager quests
Definition: Game.cs:182
int seed
Definition: Game.cs:200
FactionManager factions
Definition: Game.cs:161
GlobalGoal goal
Definition: GlobalData.cs:9
void SetOwner(Chara c)
Definition: GlobalGoal.cs:10
int index
Definition: GoalList.cs:5
void Refresh(Chara owner, GoalListType type)
Definition: GoalList.cs:9
Goal Next()
Definition: GoalList.cs:39
void ValidateHobby(Chara c)
Definition: GoalWork.cs:21
bool FindWork(Chara c, bool setAI=true)
Definition: GoalWork.cs:55
Definition: Goal.cs:4
bool ShowBounty(Chara c)
Definition: GuildFighter.cs:39
bool HasBounty(Chara c)
Definition: GuildFighter.cs:44
Definition: Guild.cs:2
static GuildFighter Fighter
Definition: Guild.cs:56
Definition: Hobby.cs:5
SourceHobby.Row source
Definition: Hobby.cs:8
int GetEfficiency(Chara c)
Definition: Hobby.cs:31
AIWork GetAI(Chara c)
Definition: Hobby.cs:12
virtual Thing Thing
Definition: HotItem.cs:38
static bool Has(string id)
Definition: LangGame.cs:46
Definition: Lang.cs:6
static string[] GetList(string id)
Definition: Lang.cs:114
static string _currency(object a, string IDCurrency)
Definition: Lang.cs:162
static void SetDirty(Element a)
static LayerDrama Activate(string book, string idSheet, string idStep, Chara target=null, Card ref1=null, string tag="")
Definition: LayerDrama.cs:66
static string forceJump
Definition: LayerDrama.cs:18
static LayerDrama ActivateMain(string idSheet, string idStep=null, Chara target=null, Card ref1=null, string tag="")
Definition: LayerDrama.cs:61
static void SetDirty(Thing t)
Definition: Los.cs:5
static bool IsVisible(Point p1, Point p2, Action< Point, bool > _onVisit=null)
Definition: Los.cs:167
static SourceMaterial.Row sourceOak
Definition: MATERIAL.cs:47
static SourceMaterial.Row sourceSnow
Definition: MATERIAL.cs:41
static SourceMaterial.Row sourceIce
Definition: MATERIAL.cs:43
Point GetCenterPos()
Definition: MapBounds.cs:52
Definition: Map.cs:13
bool IsIndoor
Definition: Map.cs:131
Thing FindThing(Func< Thing, bool > func)
Definition: Map.cs:2592
Chara FindChara(string id)
Definition: Map.cs:2568
void MoveCard(Point p, Card t)
Definition: Map.cs:841
void SetLiquid(int x, int z, CellEffect effect=null)
Definition: Map.cs:1477
void SetFoormark(Point pos, int id, int angle, int offset=0)
Definition: Map.cs:2060
List< Chara > deadCharas
Definition: Map.cs:46
PropsManager props
Definition: Map.cs:91
RoomManager rooms
Definition: Map.cs:31
Cell[,] cells
Definition: Map.cs:85
void SetEffect(int x, int z, CellEffect effect=null)
Definition: Map.cs:1508
List< Chara > charas
Definition: Map.cs:81
Color Negative
Definition: MsgColors.cs:15
Color Thinking
Definition: MsgColors.cs:17
Color MutateBad
Definition: MsgColors.cs:21
Color Talk
Definition: MsgColors.cs:7
Color Ono
Definition: MsgColors.cs:13
Color Ding
Definition: MsgColors.cs:11
Color MutateGood
Definition: MsgColors.cs:19
Definition: Msg.cs:5
static MsgColors colors
Definition: Msg.cs:20
static ThirstPersonInfo thirdPerson1
Definition: Msg.cs:6
static string SayNothingHappen()
Definition: Msg.cs:96
static string Say(string idLang, string ref1, string ref2=null, string ref3=null, string ref4=null)
Definition: Msg.cs:58
static void SetColor()
Definition: Msg.cs:22
Definition: NoGoal.cs:4
int emitFoot
Definition: PCOrbit.cs:9
int emitSmoke
Definition: PCOrbit.cs:11
Vector3 smokePos
Definition: PCOrbit.cs:15
Vector3 footPos
Definition: PCOrbit.cs:13
Definition: Party.cs:7
bool HasElement(int ele, bool excludePC=false)
Definition: Party.cs:194
void RemoveMember(Chara c)
Definition: Party.cs:102
Chara leader
Definition: Party.cs:31
List< Chara > members
Definition: Party.cs:19
void AddMemeber(Chara c, bool showMsg=false)
Definition: Party.cs:57
void RequestPathImmediate(PathProgress progress)
Definition: PathManager.cs:41
Point GetFirstStep(Point origin, Point _dest, IPathfindWalker walker, int maxDist=20, MoveType moveType=MoveType.Default)
Definition: PathManager.cs:67
static PathManager Instance
Definition: PathManager.cs:16
List< PathFinderNode > nodes
Definition: PathProgress.cs:16
bool KilledBossInVoid
Definition: Player.cs:419
bool gotEtherDisease
Definition: Player.cs:467
bool loytelEscaped
Definition: Player.cs:479
int storyFiama
Definition: Player.cs:623
bool little_saved
Definition: Player.cs:443
bool fiamaStoryBookGiven
Definition: Player.cs:299
bool fiamaFirstDream
Definition: Player.cs:311
bool little_killed
Definition: Player.cs:455
bool isShoesOff
Definition: Player.cs:347
int deepest
Definition: Player.cs:114
long nefiaBeaten
Definition: Player.cs:136
int turns
Definition: Player.cs:84
int deepestVoid
Definition: Player.cs:117
int allyDeath
Definition: Player.cs:111
int days
Definition: Player.cs:75
int distanceTravel
Definition: Player.cs:893
bool IsCriminal
Definition: Player.cs:1337
Flags flags
Definition: Player.cs:1094
bool TooHeavyToMove()
Definition: Player.cs:2558
CodexManager codex
Definition: Player.cs:1115
bool preventDeathPenalty
Definition: Player.cs:1167
bool deathZoneMove
Definition: Player.cs:1169
void ModFame(int a)
Definition: Player.cs:2094
void ModKarma(int a)
Definition: Player.cs:2516
Stats stats
Definition: Player.cs:1016
bool haltMove
Definition: Player.cs:1171
bool EnableDreamStory
Definition: Player.cs:1268
bool invlunerable
Definition: Player.cs:1173
float baseActTime
Definition: Player.cs:1199
void EndTurn(bool consume=true)
Definition: Player.cs:2081
void EnterLocalZone(bool encounter=false, Chara mob=null)
Definition: Player.cs:1946
int little_dead
Definition: Player.cs:926
HashSet< int > doneBackers
Definition: Player.cs:1073
Window.SaveData dataPick
Definition: Player.cs:1034
HotItem currentHotItem
Definition: Player.cs:1100
List< Chara > listSummon
Definition: Player.cs:1221
int safeTravel
Definition: Player.cs:920
Thing DropReward(Thing t, bool silent=false)
Definition: Player.cs:2547
ReturnInfo returnInfo
Definition: Player.cs:866
bool regionMoveWarned
Definition: Player.cs:1157
Chara chara
Definition: Player.cs:1203
bool TryAbortAutoCombat(bool immediate=true)
Definition: Player.cs:2410
bool simulatingZone
Definition: Player.cs:1179
int lastEmptyAlly
Definition: Player.cs:1193
bool altHeldPos
Definition: Player.cs:1153
QueueManager queues
Definition: Player.cs:1209
string deathMsg
Definition: Player.cs:1185
Definition: Point.cs:9
int eloY
Definition: Point.cs:81
SourceMaterial.Row matFloor
Definition: Point.cs:57
int index
Definition: Point.cs:49
SourceBlock.Row sourceBlock
Definition: Point.cs:63
void ForeachMultiSize(int w, int h, Action< Point, bool > action)
Definition: Point.cs:1385
void SetObj(int id=0, int value=1, int dir=0)
Definition: Point.cs:928
ref Vector3 Position(int height)
Definition: Point.cs:548
List< Card > ListCards(bool includeMasked=false)
Definition: Point.cs:1051
Point Copy()
Definition: Point.cs:491
override string ToString()
Definition: Point.cs:524
Point Set(int _x, int _z)
Definition: Point.cs:503
void ForeachNeighbor(Action< Point > action, bool diagonal=true)
Definition: Point.cs:1397
CellDetail detail
Definition: Point.cs:71
bool IsBlocked
Definition: Point.cs:363
List< Thing > Things
Definition: Point.cs:338
int x
Definition: Point.cs:36
Point GetNearestPoint(bool allowBlock=false, bool allowChara=true, bool allowInstalled=true, bool ignoreCenter=false, int minRadius=0)
Definition: Point.cs:619
int z
Definition: Point.cs:39
List< Chara > Charas
Definition: Point.cs:340
SoundSource PlaySound(string id, bool synced=true, float v=1f, bool spatial=true)
Definition: Point.cs:1253
int eloX
Definition: Point.cs:79
Point GetPointTowards(Point dest)
Definition: Point.cs:801
bool HasThing
Definition: Point.cs:251
bool Equals(int _x, int _z)
Definition: Point.cs:960
List< Chara > ListCharas()
Definition: Point.cs:1171
SourceFloor.Row sourceFloor
Definition: Point.cs:65
bool IsSunLit
Definition: Point.cs:182
void SetBlock(int idMat=0, int idBlock=0)
Definition: Point.cs:918
bool IsValid
Definition: Point.cs:88
Effect PlayEffect(string id)
Definition: Point.cs:1248
bool HasObj
Definition: Point.cs:137
int Distance(Point p)
Definition: Point.cs:989
bool IsHidden
Definition: Point.cs:347
Chara FirstChara
Definition: Point.cs:288
bool IsInBounds
Definition: Point.cs:104
Cell cell
Definition: Point.cs:51
Point GetRandomNeighbor()
Definition: Point.cs:759
bool HasChara
Definition: Point.cs:238
bool IsDeepWater
Definition: Point.cs:276
bool IsActive(int id, int days=-1)
static string GetRandomPortrait(string idDict)
Definition: Portrait.cs:105
static HashSet< string > allIds
Definition: Portrait.cs:20
PropsInstalled installed
Definition: PropsManager.cs:8
List< Card > sales
Definition: PropsManager.cs:14
TraitManager traits
Definition: Props.cs:18
List< Thing > containers
Definition: Props.cs:22
PropSet all
Definition: Props.cs:8
bool paid
Definition: QuestDebt.cs:10
int stage
Definition: QuestDebt.cs:13
int uidChara
Definition: QuestEscort.cs:6
List< Quest > list
Definition: QuestManager.cs:11
bool OnShowDialog(Chara c)
Quest Add(string id, string idGlobalChara=null)
Definition: QuestManager.cs:29
Quest Get(string id)
Definition: Quest.cs:7
virtual void OnGiveItem(Chara c, Thing t)
Definition: Quest.cs:536
int phase
Definition: Quest.cs:40
void NextPhase()
Definition: Quest.cs:572
void ChangePhase(int a)
Definition: Quest.cs:577
void Complete()
Definition: Quest.cs:473
void OnSetGoal(AIAct newGoal)
Definition: QueueManager.cs:23
Definition: Rand.cs:4
static int Range(int min, int max)
Definition: Rand.cs:42
static void UseSeed(int seed, Action action)
Definition: Rand.cs:22
static void SetSeed(int a=-1)
Definition: Rand.cs:37
Definition: Recipe.cs:7
static int Set(Zone zone)
Definition: RefZone.cs:12
static Zone Get(int uid)
Definition: RefZone.cs:3
List< Zone > ListTowns()
Definition: Region.cs:271
Dictionary< string, Religion > dictAll
ReligionMoonShadow MoonShadow
ReligionTrickery Trickery
ReligionHealing Healing
Religion GetRandomReligion(bool onlyJoinable=true, bool includeMinor=false)
string Name
Definition: Religion.cs:30
static Religion recentWrath
Definition: Religion.cs:22
void Revelation(string idTalk, int chance=100)
Definition: Religion.cs:145
string NameShort
Definition: Religion.cs:34
int ConvertTile(int tile)
Definition: RenderData.cs:110
bool multisize
Definition: RenderRow.cs:64
SourcePref pref
Definition: RenderRow.cs:68
bool ContainsTag(string _tag)
Definition: RenderRow.cs:148
TileType tileType
Definition: RenderRow.cs:77
int[] _tiles
Definition: RenderRow.cs:12
int[] tiles
Definition: RenderRow.cs:10
Sprite GetSprite(int dir=0, int skin=0, bool snow=false)
Definition: RenderRow.cs:261
void AssignCharas()
Definition: RoomManager.cs:39
Definition: Room.cs:4
Definition: Scene.cs:8
ParticleSystem psSmoke
Definition: Scene.cs:113
GameScreen screenElin
Definition: Scene.cs:93
ActionMode actionMode
Definition: Scene.cs:79
ParticleSystem psFoot
Definition: Scene.cs:111
EloMap elomap
Definition: Scene.cs:149
bool paused
Definition: Scene.cs:140
Definition: Shaker.cs:5
static void ShakeCam(string id="default", float magnitude=1f)
Definition: Shaker.cs:25
List< Row > listSister
Definition: SourceBacker.cs:79
string[] works
Definition: SourceChara.cs:47
string[] hobbies
Definition: SourceChara.cs:49
static Row rowDefaultPCC
Definition: SourceChara.cs:140
List< Row > listWorks
Definition: SourceHobby.cs:64
List< Row > listHobbies
Definition: SourceHobby.cs:61
string[] weapon
Definition: SourceJob.cs:37
string equip
Definition: SourceJob.cs:39
string id
Definition: SourceJob.cs:9
SourceRace races
SourceThing things
SourceHobby hobbies
SourceCharaText charaText
SourceBacker backers
SourceCategory categories
SourceElement elements
SourceChara charas
SourceJob jobs
SourceReligion religions
SourceTactics tactics
bool Surface
Definition: SourcePref.cs:318
string meleeStyle
Definition: SourceRace.cs:75
string castStyle
Definition: SourceRace.cs:77
Zone Find(string id)
GlobalSpatialList map
int lv
Definition: Spatial.cs:142
virtual bool ShowDangerLv
Definition: Spatial.cs:503
virtual bool IsRegion
Definition: Spatial.cs:515
virtual string Name
Definition: Spatial.cs:509
virtual int DangerLvBoost
Definition: Spatial.cs:489
virtual bool IsSnowCovered
Definition: Spatial.cs:545
SourceZone.Row source
Definition: Spatial.cs:453
bool destryoed
Definition: Spatial.cs:45
string id
Definition: Spatial.cs:13
bool isConquered
Definition: Spatial.cs:382
bool isPeace
Definition: Spatial.cs:406
List< Spatial > children
Definition: Spatial.cs:37
Zone FindZone(int lv)
Definition: Spatial.cs:728
Definition: SPELL.cs:620
SourcePref pref
Definition: SpriteData.cs:23
Sprite GetSprite(bool snow=false)
Definition: SpriteData.cs:67
SpriteData data
static int GetAffinityMod(int phase)
Definition: StatsHygiene.cs:19
Definition: Stats.cs:5
static StatsSAN SAN
Definition: Stats.cs:46
static StatsSleepiness Sleepiness
Definition: Stats.cs:21
virtual void Mod(int a)
Definition: Stats.cs:135
static StatsHygiene Hygiene
Definition: Stats.cs:36
static StatsBurden Burden
Definition: Stats.cs:11
Stats Set(int[] _raw, int _rawIndex, Chara _CC)
Definition: Stats.cs:109
override int GetPhase()
Definition: Stats.cs:117
static StatsMana Mana
Definition: Stats.cs:41
virtual int value
Definition: Stats.cs:56
static StatsStamina Stamina
Definition: Stats.cs:16
static Stats Depression
Definition: Stats.cs:26
static StatsHunger Hunger
Definition: Stats.cs:6
virtual int max
Definition: Stats.cs:68
static Stats Bladder
Definition: Stats.cs:31
static SubPassData Default
Definition: SubPassData.cs:7
Definition: TC.cs:4
int DestDist
Definition: Tactics.cs:24
static TargetTypeSelfParty SelfParty
Definition: TargetType.cs:9
virtual bool ForceParty
Definition: TargetType.cs:41
List< Thing > List(Func< Thing, bool > func, bool onlyAccessible=false)
void DestroyAll(Func< Thing, bool > funcExclude=null)
Thing Find(int uid)
void Foreach(Action< Thing > action, bool onlyAccessible=true)
static void TryLickChest(Thing chest)
Definition: ThingGen.cs:409
static Thing CreateTreasure(string id, int lv, TreasureType type=TreasureType.Map)
Definition: ThingGen.cs:256
static Thing CreateParcel(string idLang=null, params Thing[] things)
Definition: ThingGen.cs:42
static Thing CreateSpellbook(string alias, int num=1)
Definition: ThingGen.cs:151
static Thing CreateFromCategory(string idCat, int lv=-1)
Definition: ThingGen.cs:75
static Thing CreateScroll(int ele, int num=1)
Definition: ThingGen.cs:182
static Thing CreateCurrency(int a, string id="money")
Definition: ThingGen.cs:37
static Thing Create(string id, int idMat=-1, int lv=-1)
Definition: ThingGen.cs:53
Definition: Thing.cs:8
SourceThing.Row source
Definition: Thing.cs:11
bool isEquipped
Definition: Thing.cs:17
override int SelfWeight
Definition: Thing.cs:86
override string GetName(NameStyle style, int _num=-1)
Definition: Thing.cs:535
override SourcePref Pref
Definition: Thing.cs:50
bool IsSharedContainer
Definition: Thing.cs:116
Thing Identify(bool show=true, IDTSource idtSource=IDTSource.Identify)
Definition: Thing.cs:2074
void Set(string n)
bool ignoreSnow
Definition: TileRow.cs:6
string soundFoot
Definition: TileRow.cs:14
virtual bool IsWater
Definition: TileType.cs:163
static Span GetSpan(string id, int hour)
Definition: TimeTable.cs:45
void AddHolder(Chara c)
Definition: TraitBed.cs:107
bool IsHolder(Chara c)
Definition: TraitBed.cs:135
bool CanAssign(Chara c)
Definition: TraitBed.cs:160
virtual Adv_Type AdvType
Definition: TraitChara.cs:99
virtual bool UseRandomAlias
Definition: TraitChara.cs:127
virtual bool CanBePushed
Definition: TraitChara.cs:113
virtual bool IsAmmo(Thing t)
virtual bool CanExtendBuild
Definition: Trait.cs:170
virtual bool IsBlockPath
Definition: Trait.cs:53
virtual void OnTickHeld()
Definition: Trait.cs:1051
virtual void OnSteppedOut(Chara c)
Definition: Trait.cs:1081
virtual bool IgnoreOnSteppedWhenMoving
Definition: Trait.cs:372
virtual bool CanBeDestroyed
Definition: Trait.cs:296
virtual bool CanRead(Chara c)
Definition: Trait.cs:970
virtual bool IsDoor
Definition: Trait.cs:57
virtual bool CanEat(Chara c)
Definition: Trait.cs:979
virtual bool IsChangeFloorHeight
Definition: Trait.cs:73
virtual void OnStepped(Chara c)
Definition: Trait.cs:1077
Card owner
Definition: Trait.cs:27
virtual void OnDrink(Chara c)
Definition: Trait.cs:993
virtual bool CanBeDropped
Definition: Trait.cs:302
virtual Action GetHealAction(Chara c)
Definition: Trait.cs:604
virtual void SetName(ref string s)
Definition: Trait.cs:702
virtual bool CanDrink(Chara c)
Definition: Trait.cs:988
virtual bool CanOnlyCarry
Definition: Trait.cs:294
virtual void OnBlend(Thing t, Chara c)
Definition: Trait.cs:614
static void Reserve(string idStep, Action onBeforePlay=null)
Definition: Tutorial.cs:55
static void Play(string idStep)
Definition: Tutorial.cs:7
Definition: UIItem.cs:5
Image image2
Definition: UIItem.cs:16
UIText text2
Definition: UIItem.cs:8
Definition: UIList.cs:9
SortMode
Definition: UIList.cs:27
Definition: UINote.cs:6
UIItem AddHeaderCard(string text, Sprite sprite=null)
Definition: UINote.cs:84
void Clear()
Definition: UINote.cs:35
UIItem AddText(string text, FontColor color=FontColor.DontChange)
Definition: UINote.cs:113
void Build()
Definition: UINote.cs:49
void SetText(string s)
Definition: UIText.cs:159
int uidZone
Definition: UniqueData.cs:12
bool IsRealTime
Definition: VirtualDate.cs:7
Condition
Definition: Weather.cs:16
Condition CurrentCondition
Definition: Weather.cs:79
bool IsRaining
Definition: Weather.cs:117
static void Say(string text, FontColor fontColor=FontColor.Default, Sprite sprite=null)
FilterResult IsFilterPass(string text)
Definition: Window.cs:498
ContainerFlag flag
Definition: Window.cs:267
HashSet< int > cats
Definition: Window.cs:119
bool userFilter
Definition: Window.cs:132
bool noRotten
Definition: Window.cs:439
bool advDistribution
Definition: Window.cs:427
Definition: Window.cs:13
int efficiency
Definition: WorkSession.cs:28
WorkSession work
Definition: WorkSummary.cs:10
List< WorkSession > hobbies
Definition: WorkSummary.cs:13
Region region
Definition: World.cs:23
GameDate date
Definition: World.cs:6
void SendPackage(Thing p)
Definition: World.cs:68
Weather weather
Definition: World.cs:12
void OnCharaDie(Chara c)
virtual ZoneTransition.EnterState ReturnState
Definition: ZoneInstance.cs:26
virtual void OnLeaveZone()
Definition: ZoneInstance.cs:36
bool IsCrystalLv
Definition: Zone_Nymelle.cs:25
Definition: Zone.cs:12
bool isSimulating
Definition: Zone.cs:75
ZoneEventManager events
Definition: Zone.cs:40
virtual bool IsNefia
Definition: Zone.cs:285
int CountMinions(Chara c)
Definition: Zone.cs:3733
Zone GetTopZone()
Definition: Zone.cs:1933
bool IsPCFactionOrTent
Definition: Zone.cs:476
FactionBranch branch
Definition: Zone.cs:34
virtual bool HasLaw
Definition: Zone.cs:229
void SetBGM(List< int > ids, bool refresh=true, float fadeDuration=0f)
Definition: Zone.cs:2959
Chara Boss
Definition: Zone.cs:86
bool TryAddThingInSharedContainer(Thing t, List< Thing > containers=null, bool add=true, bool msg=false, Chara chara=null, bool sharedOnly=true)
Definition: Zone.cs:2120
virtual bool IsFestival
Definition: Zone.cs:209
virtual bool IsTown
Definition: Zone.cs:223
void RemoveCard(Card t)
Definition: Zone.cs:2017
bool IsActiveZone
Definition: Zone.cs:495
virtual bool PetFollow
Definition: Zone.cs:287
override int DangerLv
Definition: Zone.cs:110
bool IsPCFaction
Definition: Zone.cs:473
void ResetHostility()
Definition: Zone.cs:2688
virtual bool IsUnderwater
Definition: Zone.cs:269
ZoneInstance instance
Definition: Zone.cs:55
virtual bool WillAutoSave
Definition: Zone.cs:263
virtual bool KeepAllyDistance
Definition: Zone.cs:302
virtual bool HiddenInRegionMap
Definition: Zone.cs:413
void RefreshListCitizen()
Definition: Zone.cs:3572
Card AddCard(Card t, Point point)
Definition: Zone.cs:1977
Map map
Definition: Zone.cs:63
Point GetSpawnPos(Chara c, ZoneTransition.EnterState destState=ZoneTransition.EnterState.Auto)
Definition: Zone.cs:1335
NoteMode
Definition: IInspect.cs:7
Definition: ActRef.cs:2
Definition: ACT.cs:71
CostType type
Definition: ACT.cs:74
int cost
Definition: ACT.cs:72
uint Bits
Definition: BitArray32.cs:6