Elin Decompiled Documentation EA 23.256 Nightly Patch 1
Loading...
Searching...
No Matches
Card.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Runtime.Serialization;
5using System.Text;
6using Newtonsoft.Json;
7using UnityEngine;
8using UnityEngine.UI;
9
11{
12 public enum MoveResult
13 {
14 Fail,
15 Success,
16 Door
17 }
18
19 public enum MoveType
20 {
21 Walk,
22 Force
23 }
24
25 public const int MaxWeight = 10000000;
26
27 public const int SocketDiv = 1000;
28
29 public const int DamageLimit = 99999999;
30
31 [JsonProperty(PropertyName = "A")]
32 public int[] _ints = new int[30];
33
34 [JsonProperty(PropertyName = "B")]
35 public string id = "";
36
37 [JsonProperty(PropertyName = "C")]
39
40 [JsonProperty(PropertyName = "D")]
42
43 [JsonProperty(PropertyName = "E")]
44 public Biography bio;
45
46 [JsonProperty(PropertyName = "SC")]
47 public List<int> sockets;
48
50
51 public Props props;
52
53 public Trait trait;
54
56
57 public Fov fov;
58
59 public Point pos = new Point();
60
62
63 public CardRow hat;
64
65 public int turn;
66
67 public int _colorInt;
68
69 public float roundTimer;
70
71 public float angle = 180f;
72
73 public float animeCounter;
74
75 public bool isDestroyed;
76
78
80
82
84
85 public bool dirtyWeight = true;
86
87 private int _childrenWeight;
88
90
92
93 private static Color _randColor;
94
95 public Emo lastEmo;
96
98
99 private Sprite _paintSprite;
100
101 public int sortVal;
102
104
106
107 public int colorInt
108 {
109 get
110 {
111 if (_colorInt == 0)
112 {
113 RefreshColor();
114 }
115 return _colorInt;
116 }
117 }
118
119 public bool IsHotItem => invY == 1;
120
121 public int uid
122 {
123 get
124 {
125 return _ints[1];
126 }
127 set
128 {
129 _ints[1] = value;
130 }
131 }
132
133 public int idMaterial
134 {
135 get
136 {
137 return _ints[4];
138 }
139 set
140 {
141 _ints[4] = value;
142 }
143 }
144
145 public int dir
146 {
147 get
148 {
149 return _ints[5];
150 }
151 set
152 {
153 _ints[5] = value;
154 }
155 }
156
157 public int Num
158 {
159 get
160 {
161 return _ints[6];
162 }
163 set
164 {
165 _ints[6] = value;
166 }
167 }
168
169 public int _x
170 {
171 get
172 {
173 return _ints[7];
174 }
175 set
176 {
177 _ints[7] = value;
178 }
179 }
180
181 public int _z
182 {
183 get
184 {
185 return _ints[9];
186 }
187 set
188 {
189 _ints[9] = value;
190 }
191 }
192
193 public int genLv
194 {
195 get
196 {
197 return _ints[10];
198 }
199 set
200 {
201 _ints[10] = value;
202 }
203 }
204
205 public int refVal
206 {
207 get
208 {
209 return _ints[11];
210 }
211 set
212 {
213 _ints[11] = value;
214 }
215 }
216
217 public int decay
218 {
219 get
220 {
221 return _ints[12];
222 }
223 set
224 {
225 _ints[12] = value;
226 }
227 }
228
229 public int altitude
230 {
231 get
232 {
233 return _ints[13];
234 }
235 set
236 {
237 _ints[13] = value;
238 }
239 }
240
241 public int hp
242 {
243 get
244 {
245 return _ints[14];
246 }
247 set
248 {
249 _ints[14] = value;
250 }
251 }
252
253 public float fx
254 {
255 get
256 {
257 return 0.001f * (float)_ints[15];
258 }
259 set
260 {
261 _ints[15] = (int)(value * 1000f);
262 }
263 }
264
265 public float fy
266 {
267 get
268 {
269 return 0.001f * (float)_ints[16];
270 }
271 set
272 {
273 _ints[16] = (int)(value * 1000f);
274 }
275 }
276
278 {
279 get
280 {
281 return _ints[17].ToEnum<BlessedState>();
282 }
283 set
284 {
285 _ints[17] = (int)value;
286 }
287 }
288
290 {
291 get
292 {
293 return _ints[18].ToEnum<PlaceState>();
294 }
295 set
296 {
297 _ints[18] = (int)value;
298 }
299 }
300
301 public int rarityLv
302 {
303 get
304 {
305 return _ints[19];
306 }
307 set
308 {
309 _ints[19] = value;
310 }
311 }
312
314 {
315 get
316 {
317 return (_ints[19] / 100).ToEnum<Rarity>();
318 }
319 set
320 {
321 _ints[19] = (int)value * 100;
322 }
323 }
324
325 public int encLV
326 {
327 get
328 {
329 return _ints[20];
330 }
331 set
332 {
333 _ints[20] = value;
334 }
335 }
336
337 public int posInvX
338 {
339 get
340 {
341 return _ints[21];
342 }
343 set
344 {
345 _ints[21] = value;
346 }
347 }
348
349 public int posInvY
350 {
351 get
352 {
353 return _ints[22];
354 }
355 set
356 {
357 _ints[22] = value;
358 }
359 }
360
361 public int idSkin
362 {
363 get
364 {
365 return _ints[23];
366 }
367 set
368 {
369 _ints[23] = value;
370 }
371 }
372
373 public int feat
374 {
375 get
376 {
377 return _ints[24];
378 }
379 set
380 {
381 _ints[24] = value;
382 }
383 }
384
385 public int LV
386 {
387 get
388 {
389 return _ints[25];
390 }
391 set
392 {
393 _ints[25] = value;
394 }
395 }
396
397 public int exp
398 {
399 get
400 {
401 return _ints[26];
402 }
403 set
404 {
405 _ints[26] = value;
406 }
407 }
408
409 public int tier
410 {
411 get
412 {
413 return _ints[27];
414 }
415 set
416 {
417 _ints[27] = value;
418 }
419 }
420
421 public int version
422 {
423 get
424 {
425 return _ints[29];
426 }
427 set
428 {
429 _ints[29] = value;
430 }
431 }
432
433 public bool isCensored
434 {
435 get
436 {
437 return _bits1[1];
438 }
439 set
440 {
441 _bits1[1] = value;
442 }
443 }
444
446 {
447 get
448 {
449 return _bits1[2];
450 }
451 set
452 {
453 _bits1[2] = value;
454 }
455 }
456
457 public bool isDyed
458 {
459 get
460 {
461 return _bits1[3];
462 }
463 set
464 {
465 _bits1[3] = value;
466 }
467 }
468
469 public bool isModified
470 {
471 get
472 {
473 return _bits1[4];
474 }
475 set
476 {
477 _bits1[4] = value;
478 }
479 }
480
481 public bool isNew
482 {
483 get
484 {
485 return _bits1[5];
486 }
487 set
488 {
489 _bits1[5] = value;
490 }
491 }
492
494 {
495 get
496 {
497 return _bits1[6];
498 }
499 set
500 {
501 _bits1[6] = value;
502 }
503 }
504
505 public bool ignoreAutoPick
506 {
507 get
508 {
509 return _bits1[7];
510 }
511 set
512 {
513 _bits1[7] = value;
514 }
515 }
516
517 public bool freePos
518 {
519 get
520 {
521 return _bits1[8];
522 }
523 set
524 {
525 _bits1[8] = value;
526 }
527 }
528
529 public bool isHidden
530 {
531 get
532 {
533 return _bits1[9];
534 }
535 set
536 {
537 _bits1[9] = value;
538 }
539 }
540
541 public bool isOn
542 {
543 get
544 {
545 return _bits1[10];
546 }
547 set
548 {
549 _bits1[10] = value;
550 }
551 }
552
553 public bool isNPCProperty
554 {
555 get
556 {
557 return _bits1[11];
558 }
559 set
560 {
561 _bits1[11] = value;
562 }
563 }
564
565 public bool isRestrained
566 {
567 get
568 {
569 return _bits1[12];
570 }
571 set
572 {
573 _bits1[12] = value;
574 }
575 }
576
577 public bool isRoofItem
578 {
579 get
580 {
581 return _bits1[13];
582 }
583 set
584 {
585 _bits1[13] = value;
586 }
587 }
588
589 public bool isMasked
590 {
591 get
592 {
593 return _bits1[14];
594 }
595 set
596 {
597 _bits1[14] = value;
598 }
599 }
600
602 {
603 get
604 {
605 return _bits1[15];
606 }
607 set
608 {
609 _bits1[15] = value;
610 }
611 }
612
613 public bool isImported
614 {
615 get
616 {
617 return _bits1[16];
618 }
619 set
620 {
621 _bits1[16] = value;
622 }
623 }
624
625 public bool autoRefuel
626 {
627 get
628 {
629 return _bits1[17];
630 }
631 set
632 {
633 _bits1[17] = value;
634 }
635 }
636
638 {
639 get
640 {
641 return _bits1[18];
642 }
643 set
644 {
645 _bits1[18] = value;
646 }
647 }
648
649 public bool isFloating
650 {
651 get
652 {
653 return _bits1[19];
654 }
655 set
656 {
657 _bits1[19] = value;
658 }
659 }
660
661 public bool isWeightChanged
662 {
663 get
664 {
665 return _bits1[20];
666 }
667 set
668 {
669 _bits1[20] = value;
670 }
671 }
672
673 public bool isFireproof
674 {
675 get
676 {
677 return _bits1[21];
678 }
679 set
680 {
681 _bits1[21] = value;
682 }
683 }
684
685 public bool isAcidproof
686 {
687 get
688 {
689 return _bits1[22];
690 }
691 set
692 {
693 _bits1[22] = value;
694 }
695 }
696
697 public bool isReplica
698 {
699 get
700 {
701 return _bits1[23];
702 }
703 set
704 {
705 _bits1[23] = value;
706 }
707 }
708
709 public bool isSummon
710 {
711 get
712 {
713 return _bits1[24];
714 }
715 set
716 {
717 _bits1[24] = value;
718 }
719 }
720
721 public bool isElemental
722 {
723 get
724 {
725 return _bits1[25];
726 }
727 set
728 {
729 _bits1[25] = value;
730 }
731 }
732
733 public bool isBroken
734 {
735 get
736 {
737 return _bits1[26];
738 }
739 set
740 {
741 _bits1[26] = value;
742 }
743 }
744
745 public bool isSubsetCard
746 {
747 get
748 {
749 return _bits1[27];
750 }
751 set
752 {
753 _bits1[27] = value;
754 }
755 }
756
757 public bool noSnow
758 {
759 get
760 {
761 return _bits1[28];
762 }
763 set
764 {
765 _bits1[28] = value;
766 }
767 }
768
769 public bool noMove
770 {
771 get
772 {
773 return _bits1[29];
774 }
775 set
776 {
777 _bits1[29] = value;
778 }
779 }
780
781 public bool isGifted
782 {
783 get
784 {
785 return _bits1[30];
786 }
787 set
788 {
789 _bits1[30] = value;
790 }
791 }
792
793 public bool isCrafted
794 {
795 get
796 {
797 return _bits1[31];
798 }
799 set
800 {
801 _bits1[31] = value;
802 }
803 }
804
805 public bool isLostProperty
806 {
807 get
808 {
809 return _bits2[0];
810 }
811 set
812 {
813 _bits2[0] = value;
814 }
815 }
816
817 public bool noShadow
818 {
819 get
820 {
821 return _bits2[1];
822 }
823 set
824 {
825 _bits2[1] = value;
826 }
827 }
828
829 public bool noSell
830 {
831 get
832 {
833 return _bits2[2];
834 }
835 set
836 {
837 _bits2[2] = value;
838 }
839 }
840
841 public bool isLeashed
842 {
843 get
844 {
845 return _bits2[3];
846 }
847 set
848 {
849 _bits2[3] = value;
850 }
851 }
852
853 public bool isStolen
854 {
855 get
856 {
857 return _bits2[4];
858 }
859 set
860 {
861 _bits2[4] = value;
862 }
863 }
864
865 public bool isSale
866 {
867 get
868 {
869 return _bits2[5];
870 }
871 set
872 {
873 _bits2[5] = value;
874 }
875 }
876
877 public bool isCopy
878 {
879 get
880 {
881 return _bits2[6];
882 }
883 set
884 {
885 _bits2[6] = value;
886 }
887 }
888
889 public bool isRestocking
890 {
891 get
892 {
893 return _bits2[7];
894 }
895 set
896 {
897 _bits2[7] = value;
898 }
899 }
900
901 public bool hasSpawned
902 {
903 get
904 {
905 return _bits2[8];
906 }
907 set
908 {
909 _bits2[8] = value;
910 }
911 }
912
913 public bool isScaled
914 {
915 get
916 {
917 return _bits2[9];
918 }
919 set
920 {
921 _bits2[9] = value;
922 }
923 }
924
925 public bool isBackerContent => c_idBacker != 0;
926
928 {
929 get
930 {
931 if (!isBackerContent)
932 {
933 return null;
934 }
935 return EClass.sources.backers.map.TryGetValue(c_idBacker);
936 }
937 }
938
940 {
941 get
942 {
943 return GetInt(9).ToEnum<BedType>();
944 }
945 set
946 {
947 SetInt(9, (int)value);
948 }
949 }
950
951 public int c_equippedSlot
952 {
953 get
954 {
955 return GetInt(6);
956 }
957 set
958 {
959 SetInt(6, value);
960 }
961 }
962
963 public int c_lockLv
964 {
965 get
966 {
967 return GetInt(50);
968 }
969 set
970 {
971 SetInt(50, value);
972 }
973 }
974
976 {
977 get
978 {
979 return GetInt(12).ToEnum<Hostility>();
980 }
981 set
982 {
983 SetInt(12, (int)value);
984 }
985 }
986
988 {
989 get
990 {
991 return GetInt(61).ToEnum<MinionType>();
992 }
993 set
994 {
995 SetInt(61, (int)value);
996 }
997 }
998
999 public int c_vomit
1000 {
1001 get
1002 {
1003 return GetInt(13);
1004 }
1005 set
1006 {
1007 SetInt(13, value);
1008 }
1009 }
1010
1011 public bool c_wasInPcParty
1012 {
1013 get
1014 {
1015 return GetInt(103) != 0;
1016 }
1017 set
1018 {
1019 SetInt(103, value ? 1 : 0);
1020 }
1021 }
1022
1023 public bool c_isImportant
1024 {
1025 get
1026 {
1027 return GetInt(109) != 0;
1028 }
1029 set
1030 {
1031 SetInt(109, value ? 1 : 0);
1032 }
1033 }
1034
1035 public bool c_lockedHard
1036 {
1037 get
1038 {
1039 return GetInt(63) != 0;
1040 }
1041 set
1042 {
1043 SetInt(63, value ? 1 : 0);
1044 }
1045 }
1046
1047 public bool c_revealLock
1048 {
1049 get
1050 {
1051 return GetInt(64) != 0;
1052 }
1053 set
1054 {
1055 SetInt(64, value ? 1 : 0);
1056 }
1057 }
1058
1059 public bool c_isTrained
1060 {
1061 get
1062 {
1063 return GetInt(120) != 0;
1064 }
1065 set
1066 {
1067 SetInt(120, value ? 1 : 0);
1068 }
1069 }
1070
1071 public bool c_isPrayed
1072 {
1073 get
1074 {
1075 return GetInt(121) != 0;
1076 }
1077 set
1078 {
1079 SetInt(121, value ? 1 : 0);
1080 }
1081 }
1082
1084 {
1085 get
1086 {
1087 return GetInt(122) != 0;
1088 }
1089 set
1090 {
1091 SetInt(122, value ? 1 : 0);
1092 }
1093 }
1094
1095 public int c_lightColor
1096 {
1097 get
1098 {
1099 return GetInt(5);
1100 }
1101 set
1102 {
1103 Mod();
1104 SetInt(5, value);
1105 }
1106 }
1107
1108 public Color LightColor => new Color((float)(c_lightColor / 1024 * 8) / 256f, (float)(c_lightColor % 1024 / 32 * 8) / 256f, (float)(c_lightColor % 32 * 8) / 256f, 1f);
1109
1110 public int c_uidZone
1111 {
1112 get
1113 {
1114 return GetInt(10);
1115 }
1116 set
1117 {
1118 Mod();
1119 SetInt(10, value);
1120 }
1121 }
1122
1123 public int c_uidRefCard
1124 {
1125 get
1126 {
1127 return GetInt(11);
1128 }
1129 set
1130 {
1131 Mod();
1132 SetInt(11, value);
1133 }
1134 }
1135
1136 public int c_priceFix
1137 {
1138 get
1139 {
1140 return GetInt(21);
1141 }
1142 set
1143 {
1144 SetInt(21, value);
1145 }
1146 }
1147
1148 public int c_priceAdd
1149 {
1150 get
1151 {
1152 return GetInt(29);
1153 }
1154 set
1155 {
1156 SetInt(29, value);
1157 }
1158 }
1159
1160 public int c_priceCopy
1161 {
1162 get
1163 {
1164 return GetInt(124);
1165 }
1166 set
1167 {
1168 SetInt(124, value);
1169 }
1170 }
1171
1172 public int c_fixedValue
1173 {
1174 get
1175 {
1176 return GetInt(131);
1177 }
1178 set
1179 {
1180 SetInt(131, value);
1181 }
1182 }
1183
1184 public int c_dyeMat
1185 {
1186 get
1187 {
1188 return GetInt(3);
1189 }
1190 set
1191 {
1192 SetInt(3, value);
1193 }
1194 }
1195
1197 {
1198 get
1199 {
1200 return GetInt(4).ToEnum<VisitorState>();
1201 }
1202 set
1203 {
1204 SetInt(4, (int)value);
1205 }
1206 }
1207
1209 {
1210 get
1211 {
1212 return GetInt(53).ToEnum<RescueState>();
1213 }
1214 set
1215 {
1216 SetInt(53, (int)value);
1217 }
1218 }
1219
1221 {
1222 get
1223 {
1224 return GetInt(65).ToEnum<BossType>();
1225 }
1226 set
1227 {
1228 SetInt(65, (int)value);
1229 }
1230 }
1231
1233 {
1234 get
1235 {
1236 return GetInt(22);
1237 }
1238 set
1239 {
1240 SetInt(22, value);
1241 }
1242 }
1243
1245 {
1246 get
1247 {
1248 return GetInt(130);
1249 }
1250 set
1251 {
1252 SetInt(130, value);
1253 }
1254 }
1255
1256 public int c_IDTState
1257 {
1258 get
1259 {
1260 return GetInt(2);
1261 }
1262 set
1263 {
1264 SetInt(2, value);
1265 }
1266 }
1267
1268 public int c_charges
1269 {
1270 get
1271 {
1272 return GetInt(7);
1273 }
1274 set
1275 {
1276 SetInt(7, value);
1277 }
1278 }
1279
1280 public int c_bill
1281 {
1282 get
1283 {
1284 return GetInt(23);
1285 }
1286 set
1287 {
1288 SetInt(23, value);
1289 }
1290 }
1291
1292 public int c_invest
1293 {
1294 get
1295 {
1296 return GetInt(28);
1297 }
1298 set
1299 {
1300 SetInt(28, value);
1301 }
1302 }
1303
1304 public int c_seed
1305 {
1306 get
1307 {
1308 return GetInt(33);
1309 }
1310 set
1311 {
1312 SetInt(33, value);
1313 }
1314 }
1315
1316 public int c_allowance
1317 {
1318 get
1319 {
1320 return GetInt(114);
1321 }
1322 set
1323 {
1324 SetInt(114, value);
1325 }
1326 }
1327
1328 public int c_fur
1329 {
1330 get
1331 {
1332 return GetInt(62);
1333 }
1334 set
1335 {
1336 SetInt(62, value);
1337 }
1338 }
1339
1340 public int c_dateCooked
1341 {
1342 get
1343 {
1344 return GetInt(66);
1345 }
1346 set
1347 {
1348 SetInt(66, value);
1349 }
1350 }
1351
1352 public int c_lockedAge
1353 {
1354 get
1355 {
1356 return GetInt(38);
1357 }
1358 set
1359 {
1360 SetInt(38, value);
1361 }
1362 }
1363
1365 {
1366 get
1367 {
1368 return GetInt(8);
1369 }
1370 set
1371 {
1372 SetInt(8, value);
1373 }
1374 }
1375
1376 public int c_weight
1377 {
1378 get
1379 {
1380 return GetInt(1);
1381 }
1382 set
1383 {
1384 SetInt(1, value);
1385 }
1386 }
1387
1388 public int c_diceDim
1389 {
1390 get
1391 {
1392 return GetInt(14);
1393 }
1394 set
1395 {
1396 SetInt(14, value);
1397 }
1398 }
1399
1401 {
1402 get
1403 {
1404 return GetInt(15);
1405 }
1406 set
1407 {
1408 SetInt(15, value);
1409 }
1410 }
1411
1413 {
1414 get
1415 {
1416 return GetInt(16);
1417 }
1418 set
1419 {
1420 SetInt(16, value);
1421 }
1422 }
1423
1425 {
1426 get
1427 {
1428 return GetInt(17);
1429 }
1430 set
1431 {
1432 SetInt(17, value);
1433 }
1434 }
1435
1436 public int c_idBacker
1437 {
1438 get
1439 {
1440 return GetInt(52);
1441 }
1442 set
1443 {
1444 SetInt(52, value);
1445 }
1446 }
1447
1448 public int c_uidMaster
1449 {
1450 get
1451 {
1452 return GetInt(54);
1453 }
1454 set
1455 {
1456 SetInt(54, value);
1457 }
1458 }
1459
1460 public int c_ammo
1461 {
1462 get
1463 {
1464 return GetInt(27);
1465 }
1466 set
1467 {
1468 SetInt(27, value);
1469 }
1470 }
1471
1472 public int c_daysWithGod
1473 {
1474 get
1475 {
1476 return GetInt(57);
1477 }
1478 set
1479 {
1480 SetInt(57, value);
1481 }
1482 }
1483
1484 public int c_daysWithPC
1485 {
1486 get
1487 {
1488 return GetInt(67);
1489 }
1490 set
1491 {
1492 SetInt(67, value);
1493 }
1494 }
1495
1496 public string c_idPortrait
1497 {
1498 get
1499 {
1500 return GetStr(9);
1501 }
1502 set
1503 {
1504 SetStr(9, value);
1505 }
1506 }
1507
1508 public string c_idRace
1509 {
1510 get
1511 {
1512 return GetStr(3);
1513 }
1514 set
1515 {
1516 SetStr(3, value);
1517 }
1518 }
1519
1520 public string c_idJob
1521 {
1522 get
1523 {
1524 return GetStr(4);
1525 }
1526 set
1527 {
1528 SetStr(4, value);
1529 }
1530 }
1531
1532 public string c_idTone
1533 {
1534 get
1535 {
1536 return GetStr(22);
1537 }
1538 set
1539 {
1540 SetStr(22, value);
1541 }
1542 }
1543
1544 public string c_color
1545 {
1546 get
1547 {
1548 return GetStr(8);
1549 }
1550 set
1551 {
1552 SetStr(8, value);
1553 }
1554 }
1555
1557 {
1558 get
1559 {
1560 return GetStr(13);
1561 }
1562 set
1563 {
1564 SetStr(13, value);
1565 }
1566 }
1567
1568 public string c_idTalk
1569 {
1570 get
1571 {
1572 return GetStr(21);
1573 }
1574 set
1575 {
1576 SetStr(21, value);
1577 }
1578 }
1579
1580 public string c_idDeity
1581 {
1582 get
1583 {
1584 return GetStr(26);
1585 }
1586 set
1587 {
1588 SetStr(26, value);
1589 }
1590 }
1591
1592 public string c_altName
1593 {
1594 get
1595 {
1596 return GetStr(1);
1597 }
1598 set
1599 {
1600 SetStr(1, value);
1601 }
1602 }
1603
1604 public string c_altName2
1605 {
1606 get
1607 {
1608 return GetStr(2);
1609 }
1610 set
1611 {
1612 SetStr(2, value);
1613 }
1614 }
1615
1616 public string c_extraNameRef
1617 {
1618 get
1619 {
1620 return GetStr(12);
1621 }
1622 set
1623 {
1624 SetStr(12, value);
1625 }
1626 }
1627
1628 public string c_refText
1629 {
1630 get
1631 {
1632 return GetStr(10);
1633 }
1634 set
1635 {
1636 SetStr(10, value);
1637 }
1638 }
1639
1640 public string c_idRefName
1641 {
1642 get
1643 {
1644 return GetStr(7);
1645 }
1646 set
1647 {
1648 SetStr(7, value);
1649 }
1650 }
1651
1652 public string c_idRidePCC
1653 {
1654 get
1655 {
1656 return GetStr(55);
1657 }
1658 set
1659 {
1660 SetStr(55, value);
1661 }
1662 }
1663
1664 public string c_idAbility
1665 {
1666 get
1667 {
1668 return GetStr(50);
1669 }
1670 set
1671 {
1672 SetStr(50, value);
1673 }
1674 }
1675
1676 public string c_context
1677 {
1678 get
1679 {
1680 return GetStr(20);
1681 }
1682 set
1683 {
1684 SetStr(20, value);
1685 }
1686 }
1687
1688 public string c_idEditor
1689 {
1690 get
1691 {
1692 return GetStr(27);
1693 }
1694 set
1695 {
1696 SetStr(27, value);
1697 }
1698 }
1699
1700 public string c_editorTags
1701 {
1702 get
1703 {
1704 return GetStr(28);
1705 }
1706 set
1707 {
1708 SetStr(28, value);
1709 }
1710 }
1711
1712 public string c_editorTraitVal
1713 {
1714 get
1715 {
1716 return GetStr(25);
1717 }
1718 set
1719 {
1720 SetStr(25, value);
1721 }
1722 }
1723
1724 public string c_idTrait
1725 {
1726 get
1727 {
1728 return GetStr(29);
1729 }
1730 set
1731 {
1732 SetStr(29, value);
1733 }
1734 }
1735
1736 public string c_idRefCard
1737 {
1738 get
1739 {
1740 return GetStr(5);
1741 }
1742 set
1743 {
1744 SetStr(5, value);
1745 }
1746 }
1747
1748 public string c_idRefCard2
1749 {
1750 get
1751 {
1752 return GetStr(6);
1753 }
1754 set
1755 {
1756 SetStr(6, value);
1757 }
1758 }
1759
1760 public string c_note
1761 {
1762 get
1763 {
1764 return GetStr(51);
1765 }
1766 set
1767 {
1768 SetStr(51, value);
1769 }
1770 }
1771
1773 {
1774 get
1775 {
1776 return GetObj<UniqueData>(6);
1777 }
1778 set
1779 {
1780 SetObj(6, value);
1781 }
1782 }
1783
1785 {
1786 get
1787 {
1788 return GetObj<Thing>(9);
1789 }
1790 set
1791 {
1792 SetObj(9, value);
1793 }
1794 }
1795
1796 public List<SocketData> socketList
1797 {
1798 get
1799 {
1800 return GetObj<List<SocketData>>(17);
1801 }
1802 set
1803 {
1804 SetObj(17, value);
1805 }
1806 }
1807
1809 {
1810 get
1811 {
1812 return GetObj<Thing>(10);
1813 }
1814 set
1815 {
1816 SetObj(10, value);
1817 }
1818 }
1819
1821 {
1822 get
1823 {
1824 return GetObj<Window.SaveData>(2);
1825 }
1826 set
1827 {
1828 SetObj(2, value);
1829 }
1830 }
1831
1833 {
1834 get
1835 {
1836 return GetObj<CharaUpgrade>(11);
1837 }
1838 set
1839 {
1840 SetObj(11, value);
1841 }
1842 }
1843
1845 {
1846 get
1847 {
1848 return GetObj<CharaGenes>(15);
1849 }
1850 set
1851 {
1852 SetObj(15, value);
1853 }
1854 }
1855
1856 public List<int> c_corruptionHistory
1857 {
1858 get
1859 {
1860 return GetObj<List<int>>(16);
1861 }
1862 set
1863 {
1864 SetObj(16, value);
1865 }
1866 }
1867
1869 {
1870 get
1871 {
1872 return GetObj<ContainerUpgrade>(12) ?? (c_containerUpgrade = new ContainerUpgrade());
1873 }
1874 set
1875 {
1876 SetObj(12, value);
1877 }
1878 }
1879
1880 public DNA c_DNA
1881 {
1882 get
1883 {
1884 return GetObj<DNA>(14);
1885 }
1886 set
1887 {
1888 SetObj(14, value);
1889 }
1890 }
1891
1893 {
1894 get
1895 {
1896 return GetObj<CharaList>(13);
1897 }
1898 set
1899 {
1900 SetObj(13, value);
1901 }
1902 }
1903
1905 {
1906 get
1907 {
1908 return GetObj<MixedFoodData>(18);
1909 }
1910 set
1911 {
1912 SetObj(18, value);
1913 }
1914 }
1915
1917 {
1918 get
1919 {
1920 return GetObj<Thing>(19);
1921 }
1922 set
1923 {
1924 SetObj(19, value);
1925 }
1926 }
1927
1928 public byte[] c_textureData
1929 {
1930 get
1931 {
1932 return GetObj<byte[]>(4);
1933 }
1934 set
1935 {
1936 SetObj(4, value);
1937 }
1938 }
1939
1941
1942 public int invX
1943 {
1944 get
1945 {
1946 return pos.x;
1947 }
1948 set
1949 {
1950 pos.x = value;
1951 }
1952 }
1953
1954 public int invY
1955 {
1956 get
1957 {
1958 return pos.z;
1959 }
1960 set
1961 {
1962 pos.z = value;
1963 }
1964 }
1965
1967 {
1968 get
1969 {
1970 object obj;
1971 if (!c_idRefCard.IsEmpty())
1972 {
1973 obj = EClass.sources.cards.map.TryGetValue(c_idRefCard);
1974 if (obj == null)
1975 {
1976 return EClass.sources.cards.map["ash3"];
1977 }
1978 }
1979 else
1980 {
1981 obj = null;
1982 }
1983 return (CardRow)obj;
1984 }
1985 }
1986
1988 {
1989 get
1990 {
1991 object obj;
1992 if (!c_idRefCard2.IsEmpty())
1993 {
1994 obj = EClass.sources.cards.map.TryGetValue(c_idRefCard2);
1995 if (obj == null)
1996 {
1997 return EClass.sources.cards.map["ash3"];
1998 }
1999 }
2000 else
2001 {
2002 obj = null;
2003 }
2004 return (CardRow)obj;
2005 }
2006 }
2007
2008 public int ExpToNext => (50 + LV * 30) * (100 - Evalue(403)) / 100;
2009
2010 public int DefaultLV => sourceCard.LV;
2011
2013 {
2014 get
2015 {
2016 if (dirtyWeight)
2017 {
2018 _childrenWeight = 0;
2019 if (!(trait is TraitMagicChest))
2020 {
2021 foreach (Thing thing in things)
2022 {
2024 }
2025 dirtyWeight = false;
2026 (parent as Card)?.SetDirtyWeight();
2027 if (isChara && IsPCFaction)
2028 {
2029 Chara.CalcBurden();
2030 }
2031 if (_childrenWeight < 0 || _childrenWeight > 10000000)
2032 {
2033 _childrenWeight = 10000000;
2034 }
2035 }
2036 }
2037 return _childrenWeight * Mathf.Max(100 - Evalue(404), 0) / 100;
2038 }
2039 }
2040
2042
2044
2045 public virtual int SelfWeight => 1000;
2046
2047 public virtual int WeightLimit => 500000;
2048
2050
2052
2053 public virtual string AliasMaterialOnCreate => DefaultMaterial.alias;
2054
2055 public Cell Cell => pos.cell;
2056
2057 public virtual Thing Thing
2058 {
2059 get
2060 {
2061 if (!isThing)
2062 {
2063 return null;
2064 }
2065 return (Thing)this;
2066 }
2067 }
2068
2069 public virtual Chara Chara
2070 {
2071 get
2072 {
2073 if (!isChara)
2074 {
2075 return null;
2076 }
2077 return (Chara)this;
2078 }
2079 }
2080
2081 public virtual bool isThing => false;
2082
2083 public virtual bool isChara => false;
2084
2085 public bool ExistsOnMap => parent == EClass._zone;
2086
2087 public virtual bool isSynced => renderer.isSynced;
2088
2090
2091 public bool IsUnique => rarity == Rarity.Artifact;
2092
2093 public bool IsPowerful
2094 {
2095 get
2096 {
2097 if (rarity >= Rarity.Legendary || trait is TraitAdventurer)
2098 {
2099 return !IsPCFactionOrMinion;
2100 }
2101 return false;
2102 }
2103 }
2104
2105 public bool IsImportant => sourceCard.HasTag(CTAG.important);
2106
2107 public virtual SourcePref Pref => sourceCard.pref;
2108
2109 public virtual bool IsDeadOrSleeping => false;
2110
2111 public virtual bool IsDisabled => false;
2112
2113 public virtual bool IsMoving => false;
2114
2115 public virtual bool flipX
2116 {
2117 get
2118 {
2119 if (Tiles.Length == 1)
2120 {
2121 return dir % 2 == 1;
2122 }
2123 return false;
2124 }
2125 }
2126
2127 public virtual bool IsAliveInCurrentZone => ExistsOnMap;
2128
2129 public virtual string actorPrefab => "ThingActor";
2130
2131 public virtual CardRow sourceCard => null;
2132
2134
2135 public virtual RenderRow TileRow => sourceCard;
2136
2138
2139 public string Name => GetName(NameStyle.Full);
2140
2141 public string NameSimple => GetName(NameStyle.Simple);
2142
2143 public string NameOne => GetName(NameStyle.Full, 1);
2144
2145 public virtual bool IsPC => false;
2146
2147 public bool _IsPC => GetInt(56) != 0;
2148
2149 public virtual bool IsPCC => false;
2150
2151 public virtual bool IsPCParty => false;
2152
2153 public virtual bool IsMinion => false;
2154
2155 public virtual bool IsPCPartyMinion => false;
2156
2157 public virtual bool IsPCFactionMinion => false;
2158
2159 public virtual bool IsMultisize
2160 {
2161 get
2162 {
2164 {
2165 return IsInstalled;
2166 }
2167 return false;
2168 }
2169 }
2170
2171 public bool IsToolbelt => category.slot == 44;
2172
2173 public bool IsLightsource => category.slot == 45;
2174
2175 public bool IsEquipment => category.slot != 0;
2176
2177 public bool IsFood => category.IsChildOf("food");
2178
2180 {
2181 get
2182 {
2183 if (!IsFood && !category.IsChildOf("seed") && !category.IsChildOf("drink") && !(id == "pasture"))
2184 {
2185 return id == "grass";
2186 }
2187 return true;
2188 }
2189 }
2190
2191 public bool ShowFoodEnc
2192 {
2193 get
2194 {
2196 {
2197 if (Evalue(10) > 0)
2198 {
2200 }
2201 return false;
2202 }
2203 return true;
2204 }
2205 }
2206
2207 public bool IsWeapon
2208 {
2209 get
2210 {
2211 if (!IsMeleeWeapon)
2212 {
2213 return IsRangedWeapon;
2214 }
2215 return true;
2216 }
2217 }
2218
2220 {
2221 get
2222 {
2223 if (category.slot == 0)
2224 {
2225 return IsRangedWeapon;
2226 }
2227 return true;
2228 }
2229 }
2230
2232 {
2233 get
2234 {
2235 if (category.slot == 0 && !IsRangedWeapon)
2236 {
2237 return IsAmmo;
2238 }
2239 return true;
2240 }
2241 }
2242
2243 public bool IsMeleeWeapon => category.IsChildOf("melee");
2244
2246
2247 public bool IsThrownWeapon => sourceCard.HasTag(CTAG.throwWeapon);
2248
2249 public bool IsAmmo => trait is TraitAmmo;
2250
2251 public bool IsAgent => this == EClass.player.Agent;
2252
2253 public bool IsFurniture => category.IsChildOf("furniture");
2254
2255 public bool IsBlessed => blessedState >= BlessedState.Blessed;
2256
2257 public bool IsCursed => blessedState <= BlessedState.Cursed;
2258
2260 {
2261 get
2262 {
2263 if (isRestrained)
2264 {
2265 return IsPCFaction;
2266 }
2267 return false;
2268 }
2269 }
2270
2271 public virtual bool IsPCFaction => false;
2272
2274 {
2275 get
2276 {
2277 if (!IsPCFaction)
2278 {
2279 return IsPCFactionMinion;
2280 }
2281 return true;
2282 }
2283 }
2284
2285 public virtual bool IsGlobal => false;
2286
2287 public virtual int MaxDecay => 1000;
2288
2289 public bool IsDecayed => decay > MaxDecay;
2290
2291 public bool IsRotting => decay >= MaxDecay / 4 * 3;
2292
2293 public bool IsFresn => decay < MaxDecay / 4;
2294
2295 public virtual int MaxHP => 100;
2296
2297 public virtual int Power => Mathf.Max(20, EClass.curve(GetTotalQuality() * 10, 400, 100));
2298
2299 public int FameLv
2300 {
2301 get
2302 {
2303 if (!IsPC)
2304 {
2305 return LV;
2306 }
2307 return Mathf.Min(EClass.player.fame / 100 + 1, 21474836);
2308 }
2309 }
2310
2311 public virtual int[] Tiles => sourceCard._tiles;
2312
2313 public virtual int PrefIndex
2314 {
2315 get
2316 {
2317 if (Tiles.Length < 3)
2318 {
2319 return dir % 2;
2320 }
2321 return dir;
2322 }
2323 }
2324
2325 public bool IsVariation => sourceCard.origin != null;
2326
2327 public virtual int DV => elements.Value(64);
2328
2329 public virtual int PV => elements.Value(65);
2330
2331 public int HIT => elements.Value(66);
2332
2333 public int DMG => elements.Value(67);
2334
2335 public int STR => elements.Value(70);
2336
2337 public int DEX => elements.Value(72);
2338
2339 public int END => elements.Value(71);
2340
2341 public int PER => elements.Value(73);
2342
2343 public int LER => elements.Value(74);
2344
2345 public int WIL => elements.Value(75);
2346
2347 public int MAG => elements.Value(76);
2348
2349 public int CHA => elements.Value(77);
2350
2351 public int INT => elements.Value(80);
2352
2353 public int LUC => elements.Value(78);
2354
2355 public int W
2356 {
2357 get
2358 {
2359 if (dir % 2 != 0)
2360 {
2361 return sourceCard.H;
2362 }
2363 return sourceCard.W;
2364 }
2365 }
2366
2367 public int H
2368 {
2369 get
2370 {
2371 if (dir % 2 != 0)
2372 {
2373 return sourceCard.W;
2374 }
2375 return sourceCard.H;
2376 }
2377 }
2378
2379 public bool IsIdentified => c_IDTState == 0;
2380
2381 public string TextRarity => Lang.GetList("quality")[Mathf.Clamp((int)(rarity + 1), 0, 5)];
2382
2383 public bool IsInstalled => placeState == PlaceState.installed;
2384
2385 public bool IsMale
2386 {
2387 get
2388 {
2389 if (bio != null)
2390 {
2391 return bio.gender == 2;
2392 }
2393 return false;
2394 }
2395 }
2396
2397 public bool IsNegativeGift
2398 {
2399 get
2400 {
2401 if (!HasTag(CTAG.neg))
2402 {
2403 return blessedState <= BlessedState.Cursed;
2404 }
2405 return true;
2406 }
2407 }
2408
2410
2412 {
2413 get
2414 {
2415 if (!IsPC)
2416 {
2417 return null;
2418 }
2420 }
2421 }
2422
2424
2425 public virtual bool HasHost => false;
2426
2427 public int Quality => Evalue(2);
2428
2429 public int QualityLv => Quality / 10;
2430
2432 {
2433 get
2434 {
2435 if (_LightData == null)
2436 {
2437 return _LightData = ((!sourceCard.lightData.IsEmpty()) ? EClass.Colors.lightColors[sourceCard.lightData] : null);
2438 }
2439 return _LightData;
2440 }
2441 }
2442
2444 {
2445 get
2446 {
2447 if (!isChara || Chara.host == null)
2448 {
2449 return renderer;
2450 }
2451 return Chara.host.renderer;
2452 }
2453 }
2454
2455 public bool ShouldShowMsg
2456 {
2457 get
2458 {
2459 if (IsPC || parent == EClass.pc || isSynced)
2460 {
2461 if (isChara)
2462 {
2463 return !Chara.isDead;
2464 }
2465 return true;
2466 }
2467 return false;
2468 }
2469 }
2470
2471 public bool CanInspect
2472 {
2473 get
2474 {
2475 if (!isDestroyed)
2476 {
2477 return ExistsOnMap;
2478 }
2479 return false;
2480 }
2481 }
2482
2483 public string InspectName => Name;
2484
2486
2488
2489 public override string ToString()
2490 {
2491 return Name + "/" + pos?.ToString() + "/" + parent;
2492 }
2493
2494 public bool CanReserve(AIAct act)
2495 {
2496 if (reservedAct != null && reservedAct != act)
2497 {
2498 return !reservedAct.IsRunning;
2499 }
2500 return true;
2501 }
2502
2503 public bool TryReserve(AIAct act)
2504 {
2505 if (CanReserve(act))
2506 {
2507 reservedAct = act;
2508 return true;
2509 }
2510 return false;
2511 }
2512
2513 public void Mod()
2514 {
2515 isModified = true;
2516 }
2517
2519 {
2520 if (IsPC)
2521 {
2522 return Window.dictData.TryGetValue("LayerInventoryFloatMain0");
2523 }
2525 {
2526 return Window.dictData.TryGetValue("ChestMerchant");
2527 }
2528 return c_windowSaveData;
2529 }
2530
2532 {
2533 if ((IsUnique && ing.id != id && !ing.idOther.Contains(id)) || c_isImportant)
2534 {
2535 return true;
2536 }
2537 if (parent is Card card)
2538 {
2539 if (card.trait is TraitChestMerchant)
2540 {
2541 return true;
2542 }
2543 if (card.isSale || !card.trait.CanUseContent)
2544 {
2545 return true;
2546 }
2547 Window.SaveData windowSaveData = card.GetWindowSaveData();
2548 if (windowSaveData != null)
2549 {
2550 return windowSaveData.excludeCraft;
2551 }
2552 }
2553 return false;
2554 }
2555
2556 public void SetDirtyWeight()
2557 {
2559 {
2560 EClass.player.wasDirtyWeight = true;
2561 }
2562 dirtyWeight = true;
2563 (parent as Card)?.SetDirtyWeight();
2564 }
2565
2566 public void ChangeWeight(int a)
2567 {
2568 c_weight = a;
2569 isWeightChanged = true;
2571 }
2572
2573 public int Evalue(int ele)
2574 {
2575 return elements.Value(ele);
2576 }
2577
2578 public int Evalue(int ele, bool ignoreGlobalElement)
2579 {
2580 if (!ignoreGlobalElement || !HasGlobalElement(ele))
2581 {
2582 return elements.Value(ele);
2583 }
2584 return 0;
2585 }
2586
2587 public int EvalueMax(int ele, int min = 0)
2588 {
2589 return Mathf.Max(elements.Value(ele), min);
2590 }
2591
2592 public int Evalue(string alias)
2593 {
2594 return elements.Value(EClass.sources.elements.alias[alias].id);
2595 }
2596
2597 public bool HasTag(CTAG tag)
2598 {
2599 return sourceCard.tag.Contains(tag.ToString());
2600 }
2601
2602 public bool HasEditorTag(EditorTag tag)
2603 {
2604 return c_editorTags?.Contains(tag.ToString()) ?? false;
2605 }
2606
2607 public void AddEditorTag(EditorTag tag)
2608 {
2609 c_editorTags = (c_editorTags.IsEmpty() ? tag.ToString() : (c_editorTags + "," + tag));
2610 }
2611
2613 {
2614 c_editorTags = (c_editorTags.IsEmpty() ? null : c_editorTags.Replace(tag.ToString(), "").Replace(",,", ","));
2615 }
2616
2617 public virtual string GetName(NameStyle style, int num = -1)
2618 {
2619 return "Card";
2620 }
2621
2622 public virtual string GetExtraName()
2623 {
2624 return "";
2625 }
2626
2627 public virtual string GetDetail()
2628 {
2629 return sourceCard.GetText("detail", returnNull: true);
2630 }
2631
2632 public int GetBestAttribute()
2633 {
2634 int num = 1;
2635 foreach (Element item in elements.dict.Values.Where((Element a) => Element.List_MainAttributesMajor.Contains(a.id)))
2636 {
2637 int num2 = item.Value;
2638 if (isChara && Chara.tempElements != null)
2639 {
2640 num2 -= Chara.tempElements.Value(item.id);
2641 }
2642 if (num2 > num)
2643 {
2644 num = num2;
2645 }
2646 }
2647 return num;
2648 }
2649
2650 public void ModExp(string alias, int a)
2651 {
2652 ModExp(EClass.sources.elements.alias[alias].id, a);
2653 }
2654
2655 public void ModExp(int ele, int a)
2656 {
2657 if (isChara)
2658 {
2659 elements.ModExp(ele, a);
2660 }
2661 }
2662
2663 public bool IsChildOf(Card c)
2664 {
2665 return GetRootCard() == c;
2666 }
2667
2668 public T FindTool<T>() where T : Trait
2669 {
2670 if (IsPC)
2671 {
2672 return Tool?.trait as T;
2673 }
2674 return things.Find<T>()?.trait as T;
2675 }
2676
2678 private void _OnSerializing(StreamingContext context)
2679 {
2680 _x = pos.x;
2681 _z = pos.z;
2682 _ints[0] = _bits1.ToInt();
2683 _ints[2] = _bits2.ToInt();
2685 OnSerializing();
2686 }
2687
2688 protected virtual void OnSerializing()
2689 {
2690 }
2691
2693 private void _OnDeserialized(StreamingContext context)
2694 {
2695 if (version < 2 && sockets != null)
2696 {
2697 for (int i = 0; i < sockets.Count; i++)
2698 {
2699 sockets[i] = sockets[i] / 100 * 1000 + sockets[i] % 100;
2700 }
2701 }
2702 _bits1.SetInt(_ints[0]);
2703 _bits2.SetInt(_ints[2]);
2705 pos.Set(_x, _z);
2706 SetSource();
2707 things.SetOwner(this);
2708 elements.SetOwner(this, applyFeat: false);
2710 ApplyTrait();
2711 ApplyMaterialElements(remove: false);
2713 foreach (Thing thing in things)
2714 {
2715 thing.parent = this;
2716 }
2717 if (isThing && Num <= 0)
2718 {
2719 isDestroyed = true;
2720 }
2721 if (version < 4)
2722 {
2723 if (version < 3 && isChara && HasElement(1210))
2724 {
2725 elements.ModBase(960, -5 * Evalue(1210));
2726 }
2727 if (version < 4 && isChara && HasElement(1210))
2728 {
2729 elements.ModBase(423, Evalue(1210));
2730 }
2731 version = 4;
2732 }
2733 }
2734
2735 protected virtual void OnDeserialized()
2736 {
2737 }
2738
2739 public string ReferenceId()
2740 {
2741 return "c" + uid;
2742 }
2743
2744 public void Create(string _id, int _idMat = -1, int genLv = -1)
2745 {
2746 if (CardBlueprint.current != null)
2747 {
2749 CardBlueprint.current = null;
2750 }
2751 else
2752 {
2754 }
2755 id = _id;
2756 Num = 1;
2757 autoRefuel = true;
2758 EClass.game.cards.AssignUID(this);
2759 this.genLv = genLv;
2760 isNew = true;
2761 version = 3;
2762 SetSource();
2764 if (sourceCard.quality != 0)
2765 {
2766 rarity = sourceCard.quality.ToEnum<Rarity>();
2767 }
2768 else if (bp.rarity != Rarity.Random)
2769 {
2770 rarity = bp.rarity;
2771 }
2772 else if ((category.slot != 0 && category.slot != 45 && category.slot != 44) || category.tag.Contains("randomRarity"))
2773 {
2774 if (EClass.rnd(10) == 0)
2775 {
2776 rarity = Rarity.Crude;
2777 }
2778 else if (EClass.rnd(10) == 0)
2779 {
2780 rarity = Rarity.Superior;
2781 }
2782 else if (EClass.rnd(80) == 0)
2783 {
2784 rarity = Rarity.Legendary;
2785 }
2786 else if (EClass.rnd(250) == 0)
2787 {
2788 rarity = Rarity.Mythical;
2789 }
2790 }
2791 if (rarity != 0 && category.tag.Contains("fixedRarity"))
2792 {
2793 rarity = Rarity.Normal;
2794 }
2795 LV = DefaultLV;
2796 if (bp.lv != -999)
2797 {
2798 LV = bp.lv;
2799 }
2800 if (id == "microchip")
2801 {
2802 Debug.Log(id + "/" + _idMat + "/" + sourceCard.fixedMaterial);
2803 }
2805 {
2807 }
2808 else
2809 {
2810 bool flag = (bp != null && bp.fixedMat) || sourceCard.quality == 4 || sourceCard.tierGroup.IsEmpty();
2811 if (_idMat != -1)
2812 {
2813 _material = EClass.sources.materials.rows[_idMat];
2814 }
2815 else if (!flag)
2816 {
2817 if (sourceCard.tierGroup == "wood")
2818 {
2819 Debug.Log(id);
2820 }
2822 }
2823 else
2824 {
2826 }
2827 }
2828 idMaterial = _material.id;
2829 things.SetOwner(this);
2830 elements.SetOwner(this, applyFeat: true);
2831 ApplyTrait();
2833 {
2834 tier = Mathf.Clamp(EClass.rnd(5) + 1, 1, 3);
2835 LV = LV + tier * 10 + (LV - 1) * (125 + tier * 25) / 100;
2836 }
2837 ApplyMaterial();
2838 OnCreate(genLv);
2841 hp = MaxHP;
2842 if (HasTag(CTAG.hidden))
2843 {
2844 SetHidden();
2845 }
2847 }
2848
2849 public virtual void OnBeforeCreate()
2850 {
2851 }
2852
2853 public virtual void OnCreate(int genLv)
2854 {
2855 }
2856
2857 public virtual void SetSource()
2858 {
2859 }
2860
2861 public virtual void ApplyEditorTags(EditorTag tag)
2862 {
2863 switch (tag)
2864 {
2865 case EditorTag.Hidden:
2866 SetHidden();
2867 break;
2868 case EditorTag.Empty:
2869 RemoveThings();
2870 break;
2871 case EditorTag.IsOn:
2872 isOn = true;
2873 break;
2874 case EditorTag.IsOff:
2875 isOn = false;
2876 break;
2877 case EditorTag.NoSnow:
2878 noSnow = true;
2879 break;
2880 case EditorTag.Boss:
2881 EClass._zone.Boss = Chara;
2882 break;
2883 }
2884 }
2885
2886 public void ApplyTrait()
2887 {
2888 string str = c_idTrait;
2889 if (str.IsEmpty())
2890 {
2891 if (sourceCard.trait.IsEmpty())
2892 {
2893 trait = (isChara ? new TraitChara() : new Trait());
2894 }
2895 else
2896 {
2897 trait = ClassCache.Create<Trait>("Trait" + sourceCard.trait[0], "Elin");
2898 }
2899 }
2900 else
2901 {
2902 trait = ClassCache.Create<Trait>(str, "Elin");
2903 }
2904 trait.SetOwner(this);
2905 }
2906
2907 public Card SetLv(int a)
2908 {
2909 bool flag = a > LV;
2910 LV = a;
2911 if (!isChara)
2912 {
2913 return this;
2914 }
2915 isScaled = true;
2916 Rand.SetSeed(uid);
2917 ElementContainer elementContainer = new ElementContainer();
2918 elementContainer.ApplyElementMap(uid, SourceValueType.Chara, Chara.job.elementMap, LV);
2919 elementContainer.ApplyElementMap(uid, SourceValueType.Chara, Chara.race.elementMap, LV);
2920 elementContainer.ApplyElementMap(uid, SourceValueType.Chara, Chara.source.elementMap, 1, invert: false, applyFeat: true);
2921 foreach (Element value in elements.dict.Values)
2922 {
2923 int num = elementContainer.Value(value.id);
2924 if (num != 0)
2925 {
2926 int num2 = num - value.ValueWithoutLink;
2927 if (num2 != 0)
2928 {
2929 elements.ModBase(value.id, num2);
2930 }
2931 }
2932 }
2933 if (flag)
2934 {
2936 }
2937 Rand.SetSeed();
2938 hp = MaxHP;
2939 Chara.mana.value = Chara.mana.max;
2942 return this;
2943 }
2944
2945 public void ClampInitialSkill()
2946 {
2947 if (elements.Base(286) > 50)
2948 {
2949 elements.SetTo(286, 50 + (int)Mathf.Sqrt(elements.Base(286) - 50));
2950 }
2951 }
2952
2953 public void AddExp(int a, bool applyMod = true)
2954 {
2955 if (applyMod)
2956 {
2957 a = a * GetExpMtp() / 100;
2958 }
2959 exp += a;
2960 while (exp >= ExpToNext && exp > 0 && ExpToNext > 0)
2961 {
2962 exp -= ExpToNext;
2963 LevelUp();
2964 }
2965 }
2966
2967 public int GetExpMtp()
2968 {
2969 int num = 100;
2970 if (!IsPC)
2971 {
2972 num *= 2;
2973 if (IsPCFaction)
2974 {
2975 num = num * GetAffinityExpBonus() / 100;
2977 {
2978 num = num * (50 + EClass.game.principal.petFeatExpMtp * 50) / 100;
2979 }
2980 }
2981 }
2982 return num * (100 + Evalue(1237) * 30 + Evalue(1273) * 50) / 100;
2983 }
2984
2986 {
2987 return Mathf.Clamp(100 + Chara.affinity.value / 10, 50, 200);
2988 }
2989
2991 {
2993 {
2994 return 100;
2995 }
2996 return 100 + EClass.curve(c_daysWithPC / 100 * 3, 100, 20, 70);
2997 }
2998
2999 public void LevelUp()
3000 {
3001 if (IsPC)
3002 {
3004 {
3005 Msg.Say("demoLimit");
3006 return;
3007 }
3009 Tutorial.Reserve("feat");
3010 }
3011 feat++;
3012 LV++;
3013 Say("dingExp", this);
3014 PlaySound("jingle_lvup");
3015 PlayEffect("aura_heaven");
3016 if (HasElement(1415) && Evalue(1415) < 9 && LV >= Evalue(1415) * 5 + 10)
3017 {
3018 Chara.SetFeat(1415, Evalue(1415) + 1, msg: true);
3019 }
3020 if (IsPC || !(Chara.race.id == "mutant"))
3021 {
3022 return;
3023 }
3024 int num = Mathf.Min(1 + LV / 5, 20);
3025 for (int i = 0; i < num; i++)
3026 {
3027 if (Evalue(1644) < i + 1)
3028 {
3029 Chara.SetFeat(1644, i + 1, msg: true);
3030 }
3031 }
3032 }
3033
3034 public virtual void ApplyMaterialElements(bool remove)
3035 {
3036 }
3037
3038 public virtual void ApplyMaterial(bool remove = false)
3039 {
3040 _colorInt = 0;
3041 }
3042
3043 public Card ChangeMaterial(int idNew, bool ignoreFixedMaterial = false)
3044 {
3045 return ChangeMaterial(EClass.sources.materials.map.TryGetValue(idNew, 1), ignoreFixedMaterial);
3046 }
3047
3048 public Card ChangeMaterial(string idNew, bool ignoreFixedMaterial = false)
3049 {
3050 return ChangeMaterial(EClass.sources.materials.alias.TryGetValue(idNew, "oak"), ignoreFixedMaterial);
3051 }
3052
3053 public Card ChangeMaterial(SourceMaterial.Row row, bool ignoreFixedMaterial = false)
3054 {
3055 if (sourceCard.fixedMaterial && !ignoreFixedMaterial)
3056 {
3057 return this;
3058 }
3059 ApplyMaterial(remove: true);
3060 _material = row;
3061 idMaterial = row.id;
3062 decay = 0;
3063 dirtyWeight = true;
3064 Card rootCard = GetRootCard();
3065 if (rootCard != null && rootCard.IsPC)
3066 {
3068 }
3069 if (isThing)
3070 {
3072 }
3073 ApplyMaterial();
3074 return this;
3075 }
3076
3077 public void SetReplica(bool on)
3078 {
3079 isReplica = true;
3080 ChangeMaterial("granite");
3081 }
3082
3083 public Thing Add(string id, int num = 1, int lv = 1)
3084 {
3085 if (num == 0)
3086 {
3087 num = 1;
3088 }
3089 return AddCard(ThingGen.Create(id, -1, lv).SetNum(num)) as Thing;
3090 }
3091
3093 {
3094 return AddThing(c as Thing);
3095 }
3096
3097 public void RemoveCard(Card c)
3098 {
3099 RemoveThing(c as Thing);
3100 }
3101
3102 public void NotifyAddThing(Thing t, int num)
3103 {
3104 }
3105
3106 public Thing AddThing(string id, int lv = -1)
3107 {
3108 return AddThing(ThingGen.Create(id, -1, (lv == -1) ? LV : lv));
3109 }
3110
3111 public Thing AddThing(Thing t, bool tryStack = true, int destInvX = -1, int destInvY = -1)
3112 {
3113 if (t.Num == 0 || t.isDestroyed)
3114 {
3115 Debug.LogWarning("tried to add destroyed thing:" + t.Num + "/" + t.isDestroyed + "/" + t?.ToString() + "/" + this);
3116 return t;
3117 }
3118 if (t.parent == this)
3119 {
3120 Debug.LogWarning("already child:" + t);
3121 return t;
3122 }
3123 if (things.Contains(t))
3124 {
3125 Debug.Log("already in the list" + t);
3126 return t;
3127 }
3128 _ = t.parent;
3129 _ = EClass._zone;
3130 bool flag = IsPC && t.GetRootCard() == EClass.pc;
3131 if (t.parent != null)
3132 {
3133 t.parent.RemoveCard(t);
3134 }
3135 if (t.trait.ToggleType == ToggleType.Fire && destInvY == 0)
3136 {
3137 t.trait.Toggle(on: false);
3138 }
3139 t.isMasked = false;
3140 t.ignoreAutoPick = false;
3141 t.parent = this;
3142 t.noShadow = false;
3143 t.isSale = false;
3144 if (t.IsContainer)
3145 {
3146 t.RemoveEditorTag(EditorTag.PreciousContainer);
3147 }
3148 t.invX = -1;
3149 if (destInvY == -1)
3150 {
3151 t.invY = 0;
3152 }
3153 if (t.IsUnique && t.HasTag(CTAG.godArtifact) && t.GetRootCard() is Chara { IsPCFactionOrMinion: not false })
3154 {
3156 }
3157 Thing thing = (tryStack ? things.TryStack(t, destInvX, destInvY) : t);
3158 if (t == thing)
3159 {
3160 things.Add(t);
3161 things.OnAdd(t);
3162 }
3163 if (thing == t && IsPC && EClass.core.IsGameStarted && EClass._map != null && parent == EClass.game.activeZone && pos.IsValid && !flag)
3164 {
3165 NotifyAddThing(t, t.Num);
3166 }
3167 if (t == thing && isThing && parent == EClass._zone && placeState != 0)
3168 {
3170 }
3173 {
3175 LayerInventory.SetDirty(thing);
3176 }
3177 if (IsPC)
3178 {
3179 goto IL_029f;
3180 }
3181 if (IsContainer)
3182 {
3183 Card rootCard = GetRootCard();
3184 if (rootCard != null && rootCard.IsPC)
3185 {
3186 goto IL_029f;
3187 }
3188 }
3189 goto IL_0345;
3190 IL_0345:
3191 return thing;
3192 IL_029f:
3193 t.isNPCProperty = false;
3194 t.isGifted = false;
3195 int count = 0;
3196 HashSet<string> ings = EClass.player.recipes.knownIngredients;
3197 TryAdd(t);
3198 if (t.CanSearchContents)
3199 {
3200 t.things.Foreach(delegate(Thing _t)
3201 {
3202 TryAdd(_t);
3203 });
3204 }
3205 if (count > 0 && EClass.core.IsGameStarted)
3206 {
3207 Msg.Say((count == 1) ? "newIng" : "newIngs", count.ToString() ?? "");
3208 }
3209 goto IL_0345;
3210 void TryAdd(Thing a)
3211 {
3212 if (!ings.Contains(a.id))
3213 {
3214 ings.Add(a.id);
3215 count++;
3216 if (a.sourceCard.origin != null && !ings.Contains(a.sourceCard.origin.id))
3217 {
3218 ings.Add(a.sourceCard.origin.id);
3219 }
3220 }
3221 }
3222 }
3223
3225 {
3226 if (af.isReplica)
3227 {
3228 return;
3229 }
3230 List<Chara> list = new List<Chara>();
3231 foreach (FactionBranch child in EClass.pc.faction.GetChildren())
3232 {
3233 foreach (Chara member in child.members)
3234 {
3235 list.Add(member);
3236 }
3237 }
3238 foreach (Chara chara in EClass._map.charas)
3239 {
3240 list.Add(chara);
3241 }
3242 if (EClass.pc.IsEyth && EClass.pc.HasElement(1228) && af.c_idDeity == EClass.pc.faith.id)
3243 {
3244 foreach (Chara item in list)
3245 {
3246 if (item.IsPCFactionOrMinion)
3247 {
3248 List<Thing> list2 = item.things.List((Thing t) => t.HasTag(CTAG.godArtifact) && t != af && !t.isReplica && t.c_idDeity == EClass.pc.faith.id);
3249 if (list2.Count != 0)
3250 {
3251 foreach (Thing item2 in list2)
3252 {
3253 Msg.Say("destroyed_inv_", item2, item);
3254 item2.Destroy();
3255 }
3256 }
3257 }
3258 }
3259 return;
3260 }
3261 foreach (Chara item3 in list)
3262 {
3263 if (!item3.IsPCFactionOrMinion)
3264 {
3265 continue;
3266 }
3267 List<Thing> list3 = item3.things.List((Thing t) => t.id == af.id && t != af && !t.isReplica);
3268 if (list3.Count == 0)
3269 {
3270 continue;
3271 }
3272 foreach (Thing item4 in list3)
3273 {
3274 Msg.Say("destroyed_inv_", item4, item3);
3275 item4.Destroy();
3276 }
3277 }
3278 }
3279
3280 public void PurgeEythArtifact()
3281 {
3282 if (!EClass.pc.IsEyth || !EClass.pc.HasElement(1228))
3283 {
3284 return;
3285 }
3286 List<Chara> list = new List<Chara>();
3287 foreach (FactionBranch child in EClass.pc.faction.GetChildren())
3288 {
3289 foreach (Chara member in child.members)
3290 {
3291 list.Add(member);
3292 }
3293 }
3294 foreach (Chara chara in EClass._map.charas)
3295 {
3296 list.Add(chara);
3297 }
3298 foreach (Chara item in list)
3299 {
3300 if (item.IsPCFactionOrMinion)
3301 {
3302 Thing thing = item.things.Find((Thing t) => t.HasTag(CTAG.godArtifact) && t.c_idDeity == "eyth");
3303 if (thing != null)
3304 {
3306 }
3307 break;
3308 }
3309 }
3310 }
3311
3312 public void RemoveThings()
3313 {
3314 for (int num = things.Count - 1; num >= 0; num--)
3315 {
3316 RemoveThing(things[num]);
3317 }
3318 }
3319
3320 public void RemoveThing(Thing thing)
3321 {
3322 Card rootCard = GetRootCard();
3323 if (rootCard != null && rootCard.isChara && (rootCard.Chara.held == thing || (rootCard.IsPC && thing.things.Find((Thing t) => EClass.pc.held == t) != null)))
3324 {
3325 rootCard.Chara.held = null;
3326 if (rootCard.IsPC)
3327 {
3329 if ((bool)instance && instance.selected != -1 && instance.selectedButton.card != null && instance.selectedButton.card == thing)
3330 {
3331 instance.selectedButton.card = null;
3332 }
3334 ActionMode.AdvOrRegion.updatePlans = true;
3335 LayerInventory.SetDirty(thing);
3336 }
3338 }
3339 dirtyWeight = true;
3340 if (thing.c_equippedSlot != 0 && isChara)
3341 {
3342 Chara.body.Unequip(thing);
3343 }
3344 things.Remove(thing);
3345 things.OnRemove(thing);
3346 if (isSale && things.Count == 0 && IsContainer)
3347 {
3348 isSale = false;
3349 EClass._map.props.sales.Remove(this);
3350 }
3351 if (thing.invY == 1)
3352 {
3353 WidgetCurrentTool.dirty = true;
3354 }
3355 thing.invX = -1;
3356 thing.invY = 0;
3357 if (thing.props != null)
3358 {
3359 thing.props.Remove(thing);
3360 }
3363 {
3364 LayerInventory.SetDirty(thing);
3365 WidgetHotbar.dirtyCurrentItem = true;
3366 thing.parent = null;
3367 if (thing.trait.IsContainer)
3368 {
3369 foreach (LayerInventory item in LayerInventory.listInv.Copy())
3370 {
3371 if (item.invs[0].owner.Container.GetRootCard() != EClass.pc && item.floatInv)
3372 {
3373 EClass.ui.layerFloat.RemoveLayer(item);
3374 }
3375 }
3376 }
3377 }
3378 thing.parent = null;
3379 }
3380
3382 {
3383 if (EClass.player.chara != null)
3384 {
3385 if (!IsPC && GetRootCard() != EClass.pc)
3386 {
3387 return EClass.ui.layers.Count > 0;
3388 }
3389 return true;
3390 }
3391 return false;
3392 }
3393
3394 public virtual bool CanStackTo(Thing to)
3395 {
3396 return false;
3397 }
3398
3399 public bool TryStackTo(Thing to)
3400 {
3401 if (isDestroyed || to.isDestroyed || !CanStackTo(to))
3402 {
3403 return false;
3404 }
3405 to.decay = (to.decay * to.Num + decay * Num) / (to.Num + Num);
3406 to.ModNum(Num);
3407 if (c_isImportant)
3408 {
3409 to.c_isImportant = true;
3410 }
3412 {
3413 to.isNew = true;
3414 }
3415 Destroy();
3416 return true;
3417 }
3418
3420 {
3421 if (parent == null)
3422 {
3423 return this;
3424 }
3425 return parent.GetRoot();
3426 }
3427
3429 {
3430 if (!(parent is Card card))
3431 {
3432 return this;
3433 }
3434 return card.GetRootCard();
3435 }
3436
3437 public bool IsStackable(Thing tg)
3438 {
3439 if (id != tg.id || material != tg.material)
3440 {
3441 return false;
3442 }
3443 return true;
3444 }
3445
3446 public Thing Duplicate(int num)
3447 {
3448 Thing thing = ThingGen.Create(id);
3449 thing.ChangeMaterial(idMaterial, ignoreFixedMaterial: true);
3450 thing._bits1 = _bits1;
3451 thing._bits2 = _bits2;
3452 thing.dir = dir;
3453 thing.refVal = refVal;
3454 thing.altitude = altitude;
3455 thing.idSkin = idSkin;
3456 thing.blessedState = blessedState;
3457 thing.rarityLv = rarityLv;
3458 thing.tier = tier;
3459 thing.LV = LV;
3460 thing.exp = exp;
3461 thing.encLV = encLV;
3462 thing.decay = decay;
3463 thing.mapInt.Clear();
3464 thing.mapStr.Clear();
3465 foreach (KeyValuePair<int, int> item in mapInt)
3466 {
3467 thing.mapInt[item.Key] = item.Value;
3468 }
3469 foreach (KeyValuePair<int, string> item2 in mapStr)
3470 {
3471 thing.mapStr[item2.Key] = item2.Value;
3472 }
3473 elements.CopyTo(thing.elements);
3474 thing.SetNum(num);
3475 if (thing.IsRangedWeapon)
3476 {
3477 thing.sockets = IO.DeepCopy(sockets);
3478 }
3479 if (thing.c_containerSize != 0)
3480 {
3481 thing.things.SetOwner(thing);
3482 }
3483 return thing;
3484 }
3485
3486 public Thing Split(int a)
3487 {
3488 if (a == Num)
3489 {
3490 return Thing;
3491 }
3492 Thing result = Duplicate(a);
3493 ModNum(-a, notify: false);
3494 return result;
3495 }
3496
3497 public Thing SetNum(int a)
3498 {
3499 if (!isThing)
3500 {
3501 return null;
3502 }
3503 if (a == Num)
3504 {
3505 return this as Thing;
3506 }
3507 ModNum(a - Num);
3508 return this as Thing;
3509 }
3510
3512 {
3513 noSell = true;
3514 return this as Thing;
3515 }
3516
3517 public void ModNum(int a, bool notify = true)
3518 {
3519 if (Num + a < 0)
3520 {
3521 a = -Num;
3522 }
3523 Num += a;
3524 if (props != null)
3525 {
3526 props.OnNumChange(this, a);
3527 }
3528 if (parent != null)
3529 {
3531 }
3532 if (a > 0 && EClass.core.IsGameStarted && GetRootCard() == EClass.pc && notify)
3533 {
3535 }
3537 if (Num <= 0)
3538 {
3539 Destroy();
3540 }
3541 }
3542
3543 public void AddSocket()
3544 {
3545 if (sockets == null)
3546 {
3547 sockets = new List<int>();
3548 }
3549 sockets.Add(0);
3550 }
3551
3552 public void ApplySocket(Thing t)
3553 {
3554 if (t.trait is TraitMod traitMod && sockets != null)
3555 {
3556 ApplySocket(traitMod.source.id, traitMod.owner.encLV, traitMod.owner);
3557 }
3558 }
3559
3560 public void ApplySocket(int id, int lv, Card mod = null)
3561 {
3562 for (int i = 0; i < sockets.Count; i++)
3563 {
3564 if (sockets[i] == 0)
3565 {
3566 if (lv >= 1000)
3567 {
3568 lv = 999;
3569 }
3570 sockets[i] = id * 1000 + lv;
3571 elements.ModBase(id, lv);
3572 mod?.Destroy();
3573 break;
3574 }
3575 }
3576 }
3577
3578 public void EjectSockets()
3579 {
3580 for (int i = 0; i < sockets.Count; i++)
3581 {
3582 int num = sockets[i];
3583 if (num != 0)
3584 {
3585 Thing thing = ThingGen.Create(isCopy ? "ash3" : "mod_ranged");
3586 int ele = num / 1000;
3587 int num2 = num % 1000;
3588 elements.ModBase(ele, -num2);
3589 if (!isCopy)
3590 {
3591 thing.refVal = ele;
3592 thing.encLV = num2;
3593 }
3595 sockets[i] = 0;
3596 }
3597 }
3598 }
3599
3601 {
3602 return AddRune(rune.refVal, rune.encLV, rune.trait is TraitRuneFree);
3603 }
3604
3605 public SocketData AddRune(int idEle, int v, bool free)
3606 {
3607 if (socketList == null)
3608 {
3609 socketList = new List<SocketData>();
3610 }
3611 SourceElement.Row row = EClass.sources.elements.map[idEle];
3612 SocketData socketData = new SocketData
3613 {
3614 idEle = idEle,
3615 value = v,
3616 type = SocketData.Type.Rune,
3617 isFree = free
3618 };
3619 socketList.Add(socketData);
3620 if (IsWeapon || !row.IsWeaponEnc)
3621 {
3622 elements.SetTo(idEle, v);
3623 }
3624 return socketData;
3625 }
3626
3627 public SocketData GetRuneEnc(int idEle)
3628 {
3629 if (socketList != null)
3630 {
3631 foreach (SocketData socket in socketList)
3632 {
3633 if (socket.type == SocketData.Type.Rune && socket.idEle == idEle)
3634 {
3635 return socket;
3636 }
3637 }
3638 }
3639 return null;
3640 }
3641
3642 public int CountRune(bool countFree = true)
3643 {
3644 int num = 0;
3645 if (socketList != null)
3646 {
3647 foreach (SocketData socket in socketList)
3648 {
3649 if (socket.type == SocketData.Type.Rune && (countFree || !socket.isFree))
3650 {
3651 num++;
3652 }
3653 }
3654 }
3655 return num;
3656 }
3657
3658 public int MaxRune()
3659 {
3660 return ((!IsUnique && !isReplica) ? 1 : 0) + Evalue(484);
3661 }
3662
3663 public bool CanAddRune(TraitMod mod)
3664 {
3665 SourceElement.Row source = mod.source;
3666 if (category.slot == 0)
3667 {
3668 return false;
3669 }
3670 if (material.HasEnc(source.id))
3671 {
3672 return false;
3673 }
3674 if (!IsWeapon && source.IsWeaponEnc)
3675 {
3676 return false;
3677 }
3678 if (source.category == "resist")
3679 {
3680 foreach (Element item in elements.ListElements())
3681 {
3682 if (item.source.category == "resist" && (item.vBase != 0 || item.vSource != 0))
3683 {
3684 return false;
3685 }
3686 }
3687 }
3688 string encSlot = source.encSlot;
3689 if (encSlot == null || encSlot.Length != 0)
3690 {
3691 switch (encSlot)
3692 {
3693 case "shield":
3694 if (!category.IsChildOf("shield") && !category.IsChildOf("martial"))
3695 {
3696 return false;
3697 }
3698 break;
3699 default:
3700 {
3701 bool flag = false;
3702 string[] array = source.encSlot.Split(',');
3703 foreach (string key in array)
3704 {
3705 if (EClass.sources.elements.alias[key].id == category.slot)
3706 {
3707 flag = true;
3708 }
3709 }
3710 if (!flag)
3711 {
3712 return false;
3713 }
3714 break;
3715 }
3716 case "global":
3717 case "all":
3718 case "weapon":
3719 break;
3720 }
3721 }
3722 if (mod is TraitRuneFree)
3723 {
3724 return true;
3725 }
3726 return CountRune(countFree: false) < MaxRune();
3727 }
3728
3729 public bool HasRune()
3730 {
3731 return CountRune() > 0;
3732 }
3733
3734 public void OnChildNumChange(Card c)
3735 {
3737 {
3740 }
3741 }
3742
3743 public Card Install()
3744 {
3745 SetPlaceState(PlaceState.installed);
3746 return this;
3747 }
3748
3749 public void SetPlaceState(PlaceState newState, bool byPlayer = false)
3750 {
3751 if (this.placeState == newState)
3752 {
3753 return;
3754 }
3755 if (parent != EClass._zone)
3756 {
3757 Debug.Log("tried to change placestate of non-root card:" + this);
3758 return;
3759 }
3761 Area area = pos.area;
3762 if (placeState == PlaceState.installed)
3763 {
3764 area?.OnUninstallCard(this);
3765 if (!isRoofItem)
3766 {
3767 altitude = 0;
3768 freePos = false;
3769 float num2 = (fy = 0f);
3770 fx = num2;
3771 }
3772 trait.Uninstall();
3773 }
3774 if (placeState == PlaceState.installed || newState == PlaceState.installed)
3775 {
3776 ForeachPoint(delegate(Point p, bool main)
3777 {
3778 p.cell.RemoveCard(this);
3779 });
3780 this.placeState = newState;
3781 ForeachPoint(delegate(Point p, bool main)
3782 {
3783 p.cell.AddCard(this);
3784 });
3785 }
3786 else
3787 {
3788 this.placeState = newState;
3789 }
3790 if (trait is TraitFakeTile)
3791 {
3793 }
3794 if (newState == PlaceState.none)
3795 {
3796 this.placeState = PlaceState.roaming;
3797 if (props != null)
3798 {
3799 props.Remove(this);
3800 }
3801 }
3802 else
3803 {
3805 if (this.placeState == PlaceState.installed)
3806 {
3807 if (isThing)
3808 {
3809 if (trait.InstallBottomPriority != -1)
3810 {
3812 }
3813 else
3814 {
3816 }
3817 }
3818 area?.OnInstallCard(this);
3819 isRoofItem = false;
3820 trait.Install(byPlayer);
3821 }
3822 }
3824 {
3826 }
3827 if (trait.ShouldTryRefreshRoom && (placeState == PlaceState.installed || this.placeState == PlaceState.installed))
3828 {
3830 }
3831 trait.OnChangePlaceState(newState);
3833 {
3835 }
3836 }
3837
3838 public int GetTotalQuality(bool applyBonus = true)
3839 {
3840 int num = 5 + LV + material.quality;
3841 if (applyBonus)
3842 {
3843 num = num * (100 + Quality) / 100;
3844 }
3845 return num;
3846 }
3847
3848 public void ModEncLv(int a)
3849 {
3850 ApplyMaterialElements(remove: true);
3851 encLV += a;
3852 ApplyMaterialElements(remove: false);
3854 {
3855 if (IsWeapon || IsAmmo)
3856 {
3857 elements.ModBase(67, a);
3858 }
3859 else
3860 {
3861 elements.ModBase(65, a * 2);
3862 }
3863 }
3864 }
3865
3866 public void SetEncLv(int a)
3867 {
3868 ModEncLv(a - encLV);
3869 }
3870
3871 public void SetTier(int a, bool setTraits = true)
3872 {
3873 if (a < 0)
3874 {
3875 a = 0;
3876 }
3877 tier = a;
3878 if (setTraits)
3879 {
3880 int num = ((a == 1) ? 180 : ((a == 2) ? 400 : ((a >= 3) ? 600 : 0)));
3881 if (a > 0)
3882 {
3883 foreach (Element value in elements.dict.Values)
3884 {
3885 if (value.IsFoodTrait || value.IsTrait)
3886 {
3887 elements.SetTo(value.id, value.Value * num / 100);
3888 }
3889 }
3890 }
3891 elements.SetBase(2, a * 30);
3892 elements.SetBase(759, (a > 1) ? a : 0);
3893 }
3895 }
3896
3897 public virtual void SetBlessedState(BlessedState s)
3898 {
3899 int num = 0;
3900 if (s == BlessedState.Blessed && blessedState < BlessedState.Blessed)
3901 {
3902 num = 1;
3903 }
3904 if (s < BlessedState.Blessed && blessedState == BlessedState.Blessed)
3905 {
3906 num = -1;
3907 }
3908 if (num != 0 && IsEquipmentOrRangedOrAmmo)
3909 {
3910 if (IsWeapon || IsAmmo)
3911 {
3912 elements.ModBase(67, num);
3913 }
3914 else
3915 {
3916 elements.ModBase(65, num * 2);
3917 }
3918 }
3919 blessedState = s;
3920 }
3921
3922 public virtual void ChangeRarity(Rarity q)
3923 {
3924 rarity = q;
3925 }
3926
3927 public bool TryPay(int a, string id = "money")
3928 {
3929 if (GetCurrency(id) < a)
3930 {
3931 if (IsPC)
3932 {
3933 SE.Beep();
3934 Msg.Say((id == "ration") ? "notEnoughFood" : "notEnoughMoney");
3935 }
3936 return false;
3937 }
3938 if (IsPC && !(id == "ration"))
3939 {
3940 SE.Pay();
3941 }
3942 ModCurrency(-a, id);
3943 return true;
3944 }
3945
3946 public void SetCharge(int a)
3947 {
3948 c_charges = a;
3950 }
3951
3952 public void ModCharge(int a, bool destroy = false)
3953 {
3954 c_charges += a;
3956 if (c_charges <= 0 && destroy)
3957 {
3958 Say("spellbookCrumble", this);
3959 ModNum(-1);
3960 }
3961 }
3962
3963 public void ModCurrency(int a, string id = "money")
3964 {
3965 if (a != 0)
3966 {
3967 if (id == "influence")
3968 {
3970 return;
3971 }
3972 SourceMaterial.Row mat = null;
3973 things.AddCurrency(this, id, a, mat);
3974 }
3975 }
3976
3977 public int GetCurrency(string id = "money")
3978 {
3979 if (id == "influence")
3980 {
3981 return EClass._zone.influence;
3982 }
3983 int sum = 0;
3984 SourceMaterial.Row mat = null;
3985 things.GetCurrency(id, ref sum, mat);
3986 return sum;
3987 }
3988
3989 public virtual void HealHPHost(int a, HealSource origin = HealSource.None)
3990 {
3991 if (isChara)
3992 {
3993 if (Chara.parasite != null)
3994 {
3996 }
3997 if (Chara.ride != null)
3998 {
3999 Chara.ride.HealHP(a);
4000 }
4001 }
4002 HealHP(a, origin);
4003 }
4004
4005 public virtual void HealHP(int a, HealSource origin = HealSource.None)
4006 {
4007 long num = a;
4008 if (origin == HealSource.Magic)
4009 {
4010 num = (long)a * (long)Mathf.Max(100 - Evalue(93), 1) / 100;
4011 }
4012 if (num > 100000000)
4013 {
4014 num = 100000000L;
4015 }
4016 hp += (int)num;
4017 if (hp > MaxHP)
4018 {
4019 hp = MaxHP;
4020 }
4021 switch (origin)
4022 {
4023 case HealSource.Magic:
4024 case HealSource.Item:
4025 PlaySound("heal");
4026 PlayEffect("heal");
4027 break;
4028 case HealSource.HOT:
4029 PlaySound("heal_tick");
4030 PlayEffect("heal_tick");
4031 break;
4032 }
4033 }
4034
4035 public virtual int GetArmorSkill()
4036 {
4037 return 0;
4038 }
4039
4040 public virtual long ApplyProtection(long dmg, int mod = 100)
4041 {
4042 int armorSkill = GetArmorSkill();
4043 Element orCreateElement = elements.GetOrCreateElement(armorSkill);
4044 int num = PV + orCreateElement.Value + DEX / 10;
4045 int num2 = 1;
4046 int sides = 1;
4047 int bonus = 0;
4048 if (num > 0)
4049 {
4050 int num3 = num / 4;
4051 num2 = num3 / 10 + 1;
4052 sides = num3 / num2 + 1;
4053 bonus = 0;
4054 dmg = dmg * 100 / Mathf.Max(100 + num, 1);
4055 }
4056 int num4 = Dice.Roll(num2, sides, bonus, this);
4057 dmg -= num4 * mod / 100;
4058 if (dmg < 0)
4059 {
4060 dmg = 0L;
4061 }
4062 return dmg;
4063 }
4064
4065 public void DamageHP(long dmg, AttackSource attackSource = AttackSource.None, Card origin = null)
4066 {
4067 DamageHP(dmg, 0, 0, attackSource, origin);
4068 }
4069
4070 public void DamageHP(long dmg, int ele, int eleP = 100, AttackSource attackSource = AttackSource.None, Card origin = null, bool showEffect = true, Thing weapon = null, Chara originalTarget = null)
4071 {
4072 if (hp < 0)
4073 {
4074 return;
4075 }
4076 bool flag = originalTarget != null;
4077 Action onEvade = null;
4078 if (isChara && !isRestrained && !flag)
4079 {
4080 if (HasElement(1249))
4081 {
4082 foreach (Chara chara3 in EClass._map.charas)
4083 {
4084 if (chara3 != this && !chara3.IsHostile(Chara) && !chara3.IsDisabled && !chara3.isRestrained && (!IsPCFactionOrMinion || chara3.IsPCFactionOrMinion) && chara3.Dist(this) <= 3)
4085 {
4086 Say("wall_bond", chara3, this);
4087 chara3.DamageHP(dmg, ele, eleP, attackSource, origin, showEffect, weapon, Chara);
4088 return;
4089 }
4090 }
4091 }
4092 if (!HasElement(1241))
4093 {
4094 AttackSource attackSource2 = attackSource;
4095 if ((uint)(attackSource2 - 3) > 2u && (uint)(attackSource2 - 13) > 4u)
4096 {
4097 foreach (Chara chara4 in EClass._map.charas)
4098 {
4099 if (chara4 != this && !chara4.IsHostile(Chara))
4100 {
4101 int num = chara4.Evalue(1241);
4102 int num2 = chara4.Evalue(438);
4103 if ((num != 0 || num2 != 0) && !chara4.IsDisabled && !chara4.isRestrained && (!IsPCFactionOrMinion || chara4.IsPCFactionOrMinion) && chara4.Dist(this) <= Mathf.Max(num, (num2 > 0) ? 1 : 0) && (num != 0 || num2 <= 0 || hp * 100 / MaxHP <= chara4.hp * 100 / chara4.MaxHP))
4104 {
4105 Say((num2 == 0) ? "wall_flesh" : "wall_knightly", chara4, this);
4106 chara4.DamageHP(dmg, ele, eleP, attackSource, origin, showEffect, weapon, Chara);
4107 return;
4108 }
4109 }
4110 }
4111 }
4112 }
4113 }
4114 if (origin != null && origin.HasElement(1208))
4115 {
4116 switch (attackSource)
4117 {
4118 case AttackSource.MagicHand:
4119 dmg = dmg * 130 / 100;
4120 eleP = eleP * 150 / 100;
4121 break;
4122 case AttackSource.MagicSword:
4123 dmg = dmg * 120 / 100;
4124 eleP = eleP * 150 / 100;
4125 break;
4126 }
4127 }
4128 if (origin != null)
4129 {
4130 dmg = dmg * (100 + origin.Evalue(94)) / 100;
4131 }
4132 Element e;
4133 if (ele == 0 || ele == 926)
4134 {
4135 e = Element.Void;
4136 if (origin != null)
4137 {
4138 dmg = dmg * Mathf.Max(100 + origin.Evalue(93) / 2, 10) / 100;
4139 }
4140 }
4141 else
4142 {
4143 e = Element.Create(ele);
4144 if (attackSource != AttackSource.Condition && showEffect)
4145 {
4146 ActEffect.TryDelay(delegate
4147 {
4148 PlayEffect(e.id, useRenderPos: true, 0.25f);
4149 EClass.Sound.Play("atk_" + e.source.alias);
4150 });
4151 }
4152 if (!e.source.aliasRef.IsEmpty() && attackSource != AttackSource.ManaBackfire)
4153 {
4154 int num3 = ((origin != null) ? origin.Evalue(1238) : 0);
4155 if (attackSource == AttackSource.MagicSword)
4156 {
4157 num3 += 2;
4158 if (origin.HasElement(1247))
4159 {
4160 num3++;
4161 }
4162 }
4163 if (attackSource == AttackSource.MagicArrow && origin != null && origin.HasElement(1244))
4164 {
4165 num3++;
4166 }
4167 if (attackSource == AttackSource.MagicHand && origin != null && origin.HasElement(1246))
4168 {
4169 num3++;
4170 }
4171 dmg = Element.GetResistDamage((int)dmg, Evalue(e.source.aliasRef), num3);
4172 dmg = dmg * 100 / (100 + Mathf.Clamp(Evalue(961) * 5, -50, 200));
4173 dmg = dmg * Mathf.Max(100 - Evalue(93), 10) / 100;
4174 }
4175 switch (e.id)
4176 {
4177 case 910:
4178 {
4179 Chara chara2 = Chara;
4180 if (chara2 != null && chara2.isWet)
4181 {
4182 dmg /= 3L;
4183 }
4184 break;
4185 }
4186 case 912:
4187 {
4188 Chara chara = Chara;
4189 if (chara != null && chara.isWet)
4190 {
4191 dmg = dmg * 150 / 100;
4192 }
4193 break;
4194 }
4195 }
4196 }
4197 if (origin != null && origin.isChara && origin.Chara.HasCondition<ConSupress>())
4198 {
4199 dmg = dmg * 2 / 3;
4200 }
4201 if (attackSource != AttackSource.Finish)
4202 {
4203 if (!IsPCFaction && LV > 50)
4204 {
4205 dmg = dmg * (100 - (int)Mathf.Min(80f, Mathf.Sqrt(LV - 50) * 2.5f)) / 100;
4206 }
4207 if (origin != null && origin.HasCondition<ConBerserk>())
4208 {
4209 dmg = dmg * 3 / 2;
4210 }
4212 {
4213 int num4 = ((origin != null) ? origin.LV : EClass._zone.DangerLv);
4214 if (num4 > 50)
4215 {
4216 dmg = dmg * (100 - (int)Mathf.Min(95f, Mathf.Sqrt(num4 - 50))) / 100;
4217 }
4218 }
4219 if (attackSource == AttackSource.Throw || attackSource == AttackSource.Range)
4220 {
4221 dmg = dmg * 100 / (100 + Evalue(435) * 2);
4222 }
4223 dmg = dmg * Mathf.Max(0, 100 - Mathf.Min(Evalue((e == Element.Void || e.id == 926) ? 55 : 56), 100) / ((!flag) ? 1 : 2)) / 100;
4224 if (origin != null && origin.IsPC && EClass.player.codex.Has(id))
4225 {
4226 dmg = dmg * (100 + Mathf.Min(10, EClass.player.codex.GetOrCreate(id).weakspot)) / 100;
4227 }
4228 if (isChara && Chara.body.GetAttackStyle() == AttackStyle.Shield && elements.ValueWithoutLink(123) >= 5 && (e == Element.Void || e.id == 926))
4229 {
4230 dmg = dmg * 90 / 100;
4231 }
4232 if (HasElement(971))
4233 {
4234 dmg = dmg * 100 / Mathf.Clamp(100 + Evalue(971), 25, 1000);
4235 }
4236 if (HasElement(1305))
4237 {
4238 dmg = dmg * 90 / 100;
4239 }
4240 if (EClass.pc.HasElement(1207) && isChara)
4241 {
4242 int num5 = 0;
4243 int num6 = 0;
4244 foreach (Condition condition2 in Chara.conditions)
4245 {
4246 if (condition2.Type == ConditionType.Buff)
4247 {
4248 num5++;
4249 }
4250 else if (condition2.Type == ConditionType.Debuff)
4251 {
4252 num6++;
4253 }
4254 }
4256 {
4257 dmg = dmg * 100 / Mathf.Min(100 + num5 * 5, 120);
4258 }
4259 else
4260 {
4261 dmg = dmg * Mathf.Min(100 + num6 * 5, 120) / 100;
4262 }
4263 }
4265 {
4266 dmg = dmg * 100 / Mathf.Clamp(105 + EClass.pc.Evalue(135) / 10, 10, 110);
4267 }
4268 if (HasElement(1218) && attackSource != AttackSource.ManaBackfire && (hp > 0 || Evalue(1421) <= 0))
4269 {
4270 dmg = dmg * (1000 - Mathf.Min(Evalue(1218), 1000) / ((!flag) ? 1 : 2)) / 1000;
4271 if (dmg <= 0 && EClass.rnd(4) == 0)
4272 {
4273 dmg++;
4274 }
4275 }
4276 if (dmg >= MaxHP / 10 && Evalue(68) > 0)
4277 {
4278 int num7 = MaxHP / 10;
4279 long num8 = dmg - num7;
4280 num8 = num8 * 100 / (200 + Evalue(68) * 10);
4281 dmg = num7 + num8;
4282 }
4283 }
4284 if (origin != null && origin.IsPC && EClass.pc.Evalue(654) > 0)
4285 {
4286 dmg = 0L;
4287 }
4288 if (dmg < 0)
4289 {
4290 dmg = 0L;
4291 }
4292 if (dmg > 99999999)
4293 {
4294 dmg = 99999999L;
4295 }
4296 float num9 = Mathf.Clamp(dmg * 6 / MaxHP, 0f, 4f) + (float)((dmg > 0) ? 1 : 0);
4297 int num10 = hp;
4298 if (Evalue(1421) > 0)
4299 {
4300 long num11 = 0L;
4301 long num12 = dmg;
4302 if (hp > 0)
4303 {
4304 num12 = dmg - hp;
4305 hp -= (int)dmg;
4306 num11 += dmg;
4307 if (hp < 0 && Chara.mana.value >= 0)
4308 {
4309 num11 += hp;
4310 hp = 0;
4311 }
4312 }
4313 if (hp <= 0)
4314 {
4315 if (Evalue(1421) >= 2)
4316 {
4317 num12 /= 2;
4318 }
4319 dmg = num12;
4320 if (Chara.mana.value > 0)
4321 {
4322 num12 -= Chara.mana.value;
4323 Chara.mana.value -= (int)dmg;
4324 num11 += dmg;
4325 }
4326 if (Chara.mana.value <= 0)
4327 {
4328 hp -= (int)num12;
4329 num11 += num12;
4330 }
4331 }
4332 dmg = num11;
4333 }
4334 else
4335 {
4336 hp -= (int)dmg;
4337 }
4338 if (isSynced && dmg != 0L)
4339 {
4340 float ratio = (float)dmg / (float)MaxHP;
4341 Card c = ((parent is Chara) ? (parent as Chara) : this);
4342 ActEffect.TryDelay(delegate
4343 {
4344 c.PlayEffect("blood").SetParticleColor(EClass.Colors.matColors[material.alias].main).Emit(20 + (int)(30f * ratio));
4346 {
4347 EClass.scene.damageTextRenderer.Add(this, c, (int)dmg, e);
4348 }
4349 });
4350 }
4351 if (EClass.pc.ai is AI_PracticeDummy { IsRunning: not false } aI_PracticeDummy && aI_PracticeDummy.target == this && (origin == null || origin.IsPC))
4352 {
4353 aI_PracticeDummy.hit++;
4354 aI_PracticeDummy.totalDamage += dmg;
4355 }
4356 ZoneInstanceBout zoneInstanceBout = EClass._zone.instance as ZoneInstanceBout;
4357 bool flag2 = false;
4358 if (hp < 0 && Religion.recentWrath == null)
4359 {
4361 {
4362 EvadeDeath(null);
4363 if (Chara.stamina.value > 0 && (EClass.rnd(2) == 0 || !IsPC))
4364 {
4365 Chara.stamina.Mod(-1);
4366 }
4367 }
4368 else if (IsInstalled && pos.HasBlock && trait.IsDoor)
4369 {
4370 EvadeDeath(null);
4371 }
4372 else if (!trait.CanBeDestroyed)
4373 {
4374 EvadeDeath(null);
4375 }
4376 else if (HasEditorTag(EditorTag.Invulnerable) || (HasEditorTag(EditorTag.InvulnerableToMobs) && (origin == null || !origin.IsPCParty)))
4377 {
4378 EvadeDeath(null);
4379 }
4380 else if (isChara)
4381 {
4383 {
4384 EvadeDeath(null);
4385 }
4386 else if (IsPC && EClass.debug.godMode)
4387 {
4388 EvadeDeath(null);
4389 }
4390 else if (Chara.host != null || (weapon != null && weapon.HasElement(485)))
4391 {
4392 EvadeDeath(null);
4393 flag2 = true;
4394 }
4395 else
4396 {
4397 if (origin != null && origin != this && Evalue(436) > 0 && !HasCondition<ConFractured>())
4398 {
4399 int half = (HasElement(1218) ? MaxHP : (MaxHP / 2));
4400 if (num10 > half)
4401 {
4402 EvadeDeath(delegate
4403 {
4404 Say("guts", this);
4405 Chara.AddCondition<ConFractured>((int)Mathf.Max(10f, 30f - Mathf.Sqrt(Evalue(436))));
4406 hp = Mathf.Min(half * (int)Mathf.Sqrt(Evalue(436) * 2) / 100, MaxHP / 3);
4407 });
4408 goto IL_1077;
4409 }
4410 }
4411 if (zoneInstanceBout != null && (bool)LayerDrama.Instance)
4412 {
4413 EvadeDeath(null);
4414 }
4415 else if (LayerDrama.IsActive() && IsPC)
4416 {
4417 EvadeDeath(null);
4418 }
4419 else
4420 {
4421 if (attackSource != AttackSource.Finish && IsPCParty && Chara.host == null)
4422 {
4423 if (EClass.pc.ai is GoalAutoCombat && !EClass.player.invlunerable && (EClass.pc.ai as GoalAutoCombat).listHealthy.Contains(Chara))
4424 {
4425 EClass.core.actionsNextFrame.Add(delegate
4426 {
4427 Msg.Say(IsPC ? "abort_damage" : "abort_damgeAlly");
4428 });
4429 EClass.player.invlunerable = true;
4432 }
4434 {
4435 EvadeDeath(null);
4436 goto IL_1077;
4437 }
4438 }
4439 if (Evalue(1220) > 0 && Chara.stamina.value >= (IsPC ? (Chara.stamina.max / 2) : (Chara.stamina.max / 3 * 2)))
4440 {
4441 EvadeDeath(delegate
4442 {
4443 Say("fate", this);
4444 PlaySound("revive");
4445 PlayEffect("aura_heaven");
4448 });
4449 }
4450 }
4451 }
4452 }
4453 }
4454 goto IL_1077;
4455 IL_1077:
4456 if (trait.CanBeAttacked)
4457 {
4458 renderer.PlayAnime(AnimeID.HitObj);
4459 hp = MaxHP;
4461 {
4462 hp = -1;
4463 }
4464 }
4465 Chara target;
4466 if (hp < 0)
4467 {
4468 if ((attackSource == AttackSource.Melee || attackSource == AttackSource.Range) && origin != null && originalTarget == null && (origin.isSynced || IsPC))
4469 {
4470 string text = "";
4471 if (IsPC && Lang.setting.combatTextStyle == 0)
4472 {
4473 if (e != Element.Void && e != null)
4474 {
4475 text = "dead_" + e.source.alias;
4476 }
4477 if (text == "" || !LangGame.Has(text))
4478 {
4479 text = "dead_attack";
4480 }
4481 EClass.pc.Say(text, this, "");
4482 }
4483 else
4484 {
4485 if (e != Element.Void && e != null)
4486 {
4487 text = "kill_" + e.source.alias;
4488 }
4489 if (text == "" || !LangGame.Has(text))
4490 {
4491 text = "kill_attack";
4492 }
4493 (IsPC ? EClass.pc : origin).Say(text, origin, this);
4494 }
4495 }
4496 if (isChara && Religion.recentWrath == null)
4497 {
4498 if (HasElement(1410) && !Chara.HasCooldown(1410))
4499 {
4500 Chara.AddCooldown(1410);
4501 Say("reboot", this);
4502 PlaySound("reboot");
4503 Chara.Cure(CureType.Boss);
4504 hp = MaxHP / 3;
4506 return;
4507 }
4508 if (HasCondition<ConRebirth>())
4509 {
4510 Say("rebirth", this);
4511 hp = (int)Mathf.Min((long)MaxHP * (long)(int)(5f + Mathf.Sqrt(Chara.GetCondition<ConRebirth>().power)) / 100, MaxHP);
4513 Chara.RemoveCondition<ConRebirth>();
4514 PlayEffect("revive");
4515 PlaySound("revive");
4516 return;
4517 }
4518 foreach (Chara chara5 in EClass._map.charas)
4519 {
4520 if (Chara.IsFriendOrAbove(chara5) && chara5.HasElement(1408) && chara5.faith == EClass.game.religions.Healing && EClass.world.date.GetRawDay() != chara5.GetInt(58) && (!chara5.IsPCFaction || IsPCFaction) && (chara5.memberType != FactionMemberType.Livestock || Chara.memberType == FactionMemberType.Livestock))
4521 {
4522 Msg.alwaysVisible = true;
4523 Msg.Say("layhand", chara5, this);
4524 Msg.Say("pray_heal", this);
4525 hp = MaxHP;
4527 PlayEffect("revive");
4528 PlaySound("revive");
4529 chara5.SetInt(58, EClass.world.date.GetRawDay());
4530 return;
4531 }
4532 }
4533 }
4534 if (zoneInstanceBout != null)
4535 {
4536 target = EClass._map.FindChara(zoneInstanceBout.uidTarget);
4537 if (target != null)
4538 {
4539 EClass.pc.ai.Cancel();
4540 if (IsPC)
4541 {
4542 EClass.pc.hp = 0;
4543 Heal();
4544 EClass.player.ModFame(-10 - (int)((float)EClass.player.fame * 0.05f));
4545 target.ShowDialog("_chara", "bout_lose");
4546 return;
4547 }
4548 if (target == this)
4549 {
4550 hp = 0;
4551 Heal();
4552 target.ModAffinity(EClass.pc, 10);
4553 target.ShowDialog("_chara", "bout_win");
4554 return;
4555 }
4556 }
4557 }
4558 if (!isDestroyed)
4559 {
4560 if (attackSource == AttackSource.MoonSpear && isChara)
4561 {
4563 ActEffect.LoveMiracle(Chara, origin?.Chara, 100, EffectId.MoonSpear);
4564 Rand.SetSeed();
4565 }
4566 Die(e, origin, attackSource, originalTarget);
4568 {
4569 Rand.SetSeed(uid);
4570 if (EClass.rnd(3) == 0 && !isCrafted && !isCopy)
4571 {
4572 string text2 = new int[18]
4573 {
4574 233, 235, 236, 236, 236, 1170, 1143, 1144, 727, 728,
4575 237, 869, 1178, 1179, 1180, 1243, 1244, 1245
4576 }.RandomItem().ToString();
4577 if (EClass.rnd(10) == 0)
4578 {
4579 text2 = "casino_coin";
4580 }
4581 if (EClass.rnd(10) == 0)
4582 {
4583 text2 = "scratchcard";
4584 }
4585 if (EClass.rnd(3) == 0)
4586 {
4587 text2 = "money";
4588 }
4589 if (EClass.rnd(5) == 0)
4590 {
4591 text2 = "plat";
4592 }
4593 if (EClass.rnd(10) == 0)
4594 {
4595 text2 = "money2";
4596 }
4597 if (EClass.rnd(20) == 0 || EClass.debug.enable)
4598 {
4599 text2 = "medal";
4600 }
4601 EClass._zone.AddCard(ThingGen.Create(text2).SetNum((!(text2 == "money")) ? 1 : EClass.rndHalf(100)).SetHidden(hide: false), pos);
4602 }
4603 Rand.SetSeed();
4604 }
4605 ProcAbsorb();
4606 if (EClass.pc.Evalue(1355) > 0 && isChara && (IsPCFactionOrMinion || (origin != null && origin.IsPCParty)))
4607 {
4608 ((EClass.pc.AddCondition<ConStrife>() as ConStrife) ?? EClass.pc.GetCondition<ConStrife>())?.AddKill(Chara);
4609 }
4610 }
4611 if (origin != null && origin.isChara)
4612 {
4613 if (origin.IsPCFactionOrMinion && isChara && !isCopy)
4614 {
4616 EClass.game.quests.list.ForeachReverse(delegate(Quest q)
4617 {
4618 q.OnKillChara(Chara);
4619 });
4622 {
4623 Guild.Fighter.AddContribution(10 + Mathf.Min(LV, 200) / 5);
4624 }
4626 {
4627 int a = EClass.rndHalf(200 + EClass.curve(LV, 20, 15) * 20);
4628 Msg.Say("bounty", Chara, a.ToString() ?? "");
4630 SE.Pay();
4631 }
4632 }
4633 if (origin.GetInt(106) == 0)
4634 {
4635 origin.Chara.TalkTopic("kill");
4636 }
4637 }
4638 Msg.SetColor();
4639 }
4640 else if ((attackSource == AttackSource.Melee || attackSource == AttackSource.Range) && origin != null && originalTarget == null)
4641 {
4642 (IsPC ? EClass.pc : origin).Say("dmgMelee" + num9 + (IsPC ? "pc" : ""), origin, this);
4643 }
4644 else if (isChara)
4645 {
4646 int num13 = ((attackSource != AttackSource.Condition && attackSource != AttackSource.WeaponEnchant) ? 1 : 2);
4647 if (num9 >= (float)num13)
4648 {
4649 if (e != Element.Void)
4650 {
4651 Say("dmg_" + e.source.alias, this);
4652 }
4653 if (e == Element.Void || num9 >= 2f)
4654 {
4655 Say("dmg" + num9, this);
4656 }
4657 }
4658 }
4659 onEvade?.Invoke();
4660 if (isChara)
4661 {
4662 if (flag2)
4663 {
4664 if (!Chara.HasCondition<ConFaint>())
4665 {
4666 Chara.AddCondition<ConFaint>(200, force: true);
4667 }
4668 return;
4669 }
4670 if (origin != null && origin.IsAliveInCurrentZone && origin.isChara)
4671 {
4672 if (e.id == 916)
4673 {
4674 origin.HealHP(Mathf.Clamp(EClass.rnd(dmg * (50 + eleP) / 500 + 5), 1, origin.MaxHP / 5 + EClass.rnd(10)));
4675 }
4676 if (attackSource == AttackSource.Melee || attackSource == AttackSource.Range)
4677 {
4678 int num14 = origin.Dist(this);
4679 if (attackSource == AttackSource.Melee && HasElement(1221) && num14 <= Evalue(1221))
4680 {
4681 int ele2 = ((Chara.MainElement == Element.Void) ? 924 : Chara.MainElement.id);
4682 if (id == "hedgehog_ether")
4683 {
4684 ele2 = 922;
4685 }
4686 Say("reflect_thorne", this, origin);
4687 origin.DamageHP((int)Mathf.Clamp(dmg / 10, 1f, MaxHP / (origin.IsPowerful ? 200 : 20)), ele2, Power, AttackSource.Condition, this);
4688 }
4689 if (HasElement(1223) && num14 <= Evalue(1223))
4690 {
4691 int ele3 = ((Chara.MainElement == Element.Void) ? 923 : Chara.MainElement.id);
4692 Say("reflect_acid", this, origin);
4693 origin.DamageHP((int)Mathf.Clamp(dmg / 10, 1f, MaxHP / (origin.IsPowerful ? 200 : 20)), ele3, Power * 2, AttackSource.Condition, this);
4694 }
4695 }
4696 ProcAbsorb();
4697 }
4698 }
4699 if (hp < 0 || !isChara)
4700 {
4701 return;
4702 }
4703 if (dmg > 0)
4704 {
4705 int a2 = (int)(100 * (dmg * 100 / MaxHP) / 100) + 1;
4706 a2 = Mathf.Min(a2, Chara.isRestrained ? 15 : 200);
4707 if (a2 > 0)
4708 {
4710 if (Chara.body.GetAttackStyle() == AttackStyle.Shield)
4711 {
4712 elements.ModExp(123, a2);
4713 }
4714 }
4715 }
4716 int num15 = ((EClass.rnd(2) == 0) ? 1 : 0);
4717 if (attackSource == AttackSource.Condition)
4718 {
4719 num15 = 1 + EClass.rnd(2);
4720 }
4721 if (num15 > 0)
4722 {
4723 bool flag3 = Chara.HasCondition<ConPoison>() || ((e.id == 915 || e.id == 923) && ResistLv(Evalue(955)) < 4);
4724 AddBlood(num15, flag3 ? 6 : (-1));
4725 }
4726 if (dmg > 0 || (origin != null && origin.HasElement(1345)))
4727 {
4728 ApplyElementEffect(e, eleP, origin);
4729 }
4730 if (origin != null && origin.HasElement(1411) && !Chara.HasCondition<ConGravity>())
4731 {
4732 Condition.ignoreEffect = true;
4734 Condition.ignoreEffect = false;
4735 }
4736 if (IsPC)
4737 {
4738 float num16 = (float)hp / (float)MaxHP;
4739 if (Evalue(1421) > 0)
4740 {
4741 num16 = (float)Chara.mana.value / (float)Chara.mana.max;
4742 }
4743 if (num16 < 0.3f)
4744 {
4745 PlaySound("heartbeat", 1f - num16 * 2f);
4746 }
4747 }
4748 if (!IsPC && hp < MaxHP / 5 && Evalue(423) <= 0 && dmg * 100 / MaxHP + 10 > EClass.rnd(IsPowerful ? 400 : 150) && !HasCondition<ConFear>())
4749 {
4750 Chara.AddCondition<ConFear>(100 + EClass.rnd(100));
4751 }
4752 if (Chara.ai.Current.CancelWhenDamaged && attackSource != AttackSource.Hunger && attackSource != AttackSource.Fatigue && (!EClass.core.config.test.dontCancelIfZeroDamage || dmg != 0L || !IsPC))
4753 {
4754 Chara.ai.Current.TryCancel(origin);
4755 }
4757 {
4758 ConWeapon condition = Chara.GetCondition<ConWeapon>();
4759 if (e.source.aliasRef == condition.sourceElement.aliasRef)
4760 {
4761 condition.Mod(-1);
4762 }
4763 }
4764 if (Chara.HasElement(1222) && (dmg >= MaxHP / 10 || EClass.rnd(20) == 0))
4765 {
4766 ActEffect.Proc(EffectId.Duplicate, this);
4767 }
4768 if (origin != null && !Chara.isRestrained)
4769 {
4771 }
4772 if (hp < MaxHP / 3 && HasElement(1409) && !Chara.HasCooldown(1409))
4773 {
4774 Chara.AddCooldown(1409);
4776 Chara.Cure(CureType.Boss);
4777 Chara.HealHP(MaxHP / 2);
4778 EClass.player.forceTalk = true;
4779 }
4780 if (origin != null && origin.isChara && attackSource != AttackSource.Finish)
4781 {
4783 {
4784 Chara.TrySetEnemy(origin.Chara);
4785 }
4786 if ((weapon == null || !weapon.HasElement(486)) && origin.Evalue(428) > 0 && !IsPCFactionOrMinion && EClass.rnd(dmg) >= EClass.rnd(MaxHP / 10) + MaxHP / 100 + 1)
4787 {
4788 origin.Chara.TryNeckHunt(Chara, origin.Evalue(428) * 20, harvest: true);
4789 }
4790 }
4791 void EvadeDeath(Action action)
4792 {
4793 hp = 0;
4794 if (Evalue(1421) > 0 && isChara && Chara.mana.value < 0)
4795 {
4796 Chara.mana.value = 0;
4797 }
4798 onEvade = action;
4799 }
4800 void Heal()
4801 {
4802 target.Cure(CureType.HealComplete);
4803 foreach (Chara member in EClass.pc.party.members)
4804 {
4805 member.Cure(CureType.HealComplete);
4806 }
4807 }
4808 void ProcAbsorb()
4809 {
4810 if (origin != null && origin.isChara && isChara && (weapon == null || !weapon.HasElement(486)))
4811 {
4812 int valueOrDefault = (origin.Evalue(662) + weapon?.Evalue(662, ignoreGlobalElement: true)).GetValueOrDefault();
4813 int valueOrDefault2 = (origin.Evalue(661) + weapon?.Evalue(661, ignoreGlobalElement: true)).GetValueOrDefault();
4814 if (valueOrDefault > 0 && attackSource == AttackSource.Melee && origin.isChara && !origin.Chara.ignoreSPAbsorb && Chara.IsHostile(origin as Chara))
4815 {
4816 int num17 = EClass.rnd(3 + (int)Mathf.Clamp(dmg / 100, 0f, valueOrDefault / 10));
4817 origin.Chara.stamina.Mod(num17);
4819 {
4820 Chara.stamina.Mod(-num17);
4821 }
4822 }
4823 if (origin.HasElement(1350) && attackSource == AttackSource.Melee)
4824 {
4825 int num18 = EClass.rndHalf(2 + (int)Mathf.Clamp(dmg / 10, 0f, origin.Chara.GetPietyValue() + 10));
4826 origin.Chara.mana.Mod(num18);
4828 {
4829 Chara.mana.Mod(-num18);
4830 }
4831 }
4832 if (valueOrDefault2 > 0 && attackSource == AttackSource.Melee)
4833 {
4834 int num19 = EClass.rnd(2 + (int)Mathf.Clamp(dmg / 10, 0f, valueOrDefault2 + 10));
4835 origin.Chara.mana.Mod(num19);
4837 {
4838 Chara.mana.Mod(-num19);
4839 }
4840 }
4841 }
4842 }
4843 }
4844
4845 public void ApplyElementEffect(Element e, int eleP, Card origin, bool checkHostileAct = false)
4846 {
4847 if (!isChara)
4848 {
4849 return;
4850 }
4851 bool flag = true;
4852 bool hostile = false;
4853 switch (e.id)
4854 {
4855 case 910:
4856 if (Chance(30 + eleP / 5, 100))
4857 {
4858 MarkHostile().AddCondition<ConBurning>(eleP);
4859 }
4860 break;
4861 case 911:
4862 if (Chara.isWet)
4863 {
4864 if (Chance(30 + eleP / 10, 100))
4865 {
4867 }
4868 }
4869 else if (Chance(50 + eleP / 10, 100))
4870 {
4871 Chara.AddCondition<ConWet>(eleP);
4872 }
4873 break;
4874 case 912:
4875 if (Chance(75 + eleP / 20, 100) && EClass.rnd(3) == 0)
4876 {
4877 Chara.AddCondition<ConParalyze>(1, force: true);
4878 }
4879 break;
4880 case 915:
4881 if (Chance(30 + eleP / 5, 100))
4882 {
4883 MarkHostile().AddCondition<ConPoison>(eleP);
4884 }
4885 break;
4886 case 913:
4887 if (Chance(30 + eleP / 5, 100))
4888 {
4890 }
4891 break;
4892 case 918:
4893 flag = false;
4894 if (Chance(30 + eleP / 5, 100))
4895 {
4897 }
4898 break;
4899 case 914:
4900 flag = false;
4901 if (EClass.rnd(3) != 0)
4902 {
4903 if (Chance(30 + eleP / 5, 100))
4904 {
4906 }
4907 }
4908 else if (Chance(30 + eleP / 5, 100))
4909 {
4911 }
4912 break;
4913 case 917:
4914 if (Chance(50 + eleP / 10, 100))
4915 {
4916 Chara.AddCondition<ConDim>(eleP);
4917 }
4918 break;
4919 case 925:
4920 if (EClass.rnd(3) == 0)
4921 {
4922 if (Chance(30 + eleP / 5, 100))
4923 {
4924 Chara.AddCondition<ConDim>(eleP);
4925 }
4926 }
4927 else if (EClass.rnd(2) == 0)
4928 {
4929 if (EClass.rnd(3) == 0)
4930 {
4931 Chara.AddCondition<ConParalyze>(1, force: true);
4932 }
4933 }
4934 else if (EClass.rnd(2) == 0)
4935 {
4936 Chara.AddCondition<ConConfuse>(1 + EClass.rnd(3), force: true);
4937 }
4938 break;
4939 case 920:
4940 flag = false;
4941 if (Chance(5 + eleP / 25, 40))
4942 {
4943 Chara.AddCondition<ConBlind>(eleP / 2);
4944 }
4945 if (Chance(5 + eleP / 25, 40))
4946 {
4947 Chara.AddCondition<ConParalyze>(eleP / 2);
4948 }
4949 if (Chance(5 + eleP / 25, 40))
4950 {
4951 Chara.AddCondition<ConConfuse>(eleP / 2);
4952 }
4953 if (Chance(5 + eleP / 25, 40))
4954 {
4955 MarkHostile().AddCondition<ConPoison>(eleP / 2);
4956 }
4957 if (Chance(5 + eleP / 25, 40))
4958 {
4959 Chara.AddCondition<ConSleep>(eleP / 2);
4960 }
4961 if (Chance(5 + eleP / 25, 40))
4962 {
4963 Chara.AddCondition<ConDim>(eleP / 2);
4964 }
4965 if (Chance(30 + eleP / 10, 100))
4966 {
4967 Chara.SAN.Mod(EClass.rnd(2));
4968 }
4969 break;
4970 case 924:
4971 if (Chance(50 + eleP / 10, 100))
4972 {
4973 MarkHostile().AddCondition<ConBleed>(eleP);
4974 }
4975 break;
4976 case 923:
4977 if (Chance(50 + eleP / 10, 100) && EClass.rnd(4) == 0)
4978 {
4980 }
4981 break;
4982 case 922:
4983 Chara.ModCorruption(EClass.rnd(eleP / 50 + 10));
4984 break;
4985 }
4986 if (Chara.conSleep != null && flag)
4987 {
4989 }
4990 if (checkHostileAct && hostile && origin != null && origin.isChara)
4991 {
4992 origin.Chara.DoHostileAction(this);
4993 }
4994 static bool Chance(int a, int max)
4995 {
4996 return Mathf.Min(a, max) > EClass.rnd(100);
4997 }
4998 Chara MarkHostile()
4999 {
5000 hostile = true;
5001 return Chara;
5002 }
5003 }
5004
5005 public virtual void Die(Element e = null, Card origin = null, AttackSource attackSource = AttackSource.None, Chara originalTarget = null)
5006 {
5007 Card rootCard = GetRootCard();
5008 Point _pos = rootCard?.pos ?? pos;
5009 if (_pos != null && !_pos.IsValid)
5010 {
5011 _pos = null;
5012 }
5013 if (trait.EffectDead == EffectDead.Default && _pos != null)
5014 {
5015 _pos.PlaySound(material.GetSoundDead(sourceCard));
5016 _pos.PlayEffect("mine").SetParticleColor(material.GetColor()).Emit(10 + EClass.rnd(10));
5017 material.AddBlood(_pos, trait.CanBeSmashedToDeath ? (12 + EClass.rnd(8)) : 6);
5018 if (_pos.IsSync)
5019 {
5020 string text = ((rootCard != this) ? "destroyed_inv_" : "destroyed_ground_");
5021 if (e != null && LangGame.Has(text + e.source.alias))
5022 {
5023 text += e.source.alias;
5024 }
5025 if (attackSource != AttackSource.Throw)
5026 {
5027 Msg.Say(text, this, rootCard);
5028 }
5029 }
5030 else if (attackSource != AttackSource.Throw)
5031 {
5032 Msg.Say("destroyed", this);
5033 }
5034 }
5035 if (_pos != null && !EClass._zone.IsUserZone)
5036 {
5037 things.ForeachReverse(delegate(Thing t)
5038 {
5039 if (!(t.trait is TraitChestMerchant))
5040 {
5041 EClass._zone.AddCard(t, _pos);
5042 }
5043 });
5044 }
5045 Destroy();
5046 if (e != null && _pos != null && e.id == 21)
5047 {
5048 EClass._zone.AddCard(ThingGen.Create((EClass.rnd(2) == 0) ? "ash" : "ash2"), _pos);
5049 }
5050 if (trait.ThrowType == ThrowType.Explosive && EClass.rnd((!(trait is TraitAmmoRocket)) ? 1 : 2) == 0)
5051 {
5052 Explode(pos, origin);
5053 }
5054 }
5055
5056 public void Explode(Point p, Card origin)
5057 {
5058 ActEffect.ProcAt(EffectId.Explosive, 100, blessedState, this, null, p, isNeg: true, new ActRef
5059 {
5060 origin = origin?.Chara,
5061 refThing = Thing,
5062 aliasEle = "eleImpact"
5063 });
5064 }
5065
5066 public void Deconstruct()
5067 {
5068 PlaySound(material.GetSoundDead(sourceCard));
5069 Destroy();
5070 }
5071
5072 public void Destroy()
5073 {
5074 if (isDestroyed)
5075 {
5076 Debug.Log(Name + " is already destroyed.");
5077 return;
5078 }
5079 if (isChara)
5080 {
5081 if (IsPCFaction && !Chara.isSummon)
5082 {
5083 Debug.Log(this);
5084 return;
5085 }
5086 Chara.DropHeld();
5087 Chara.isDead = true;
5088 if (IsPCParty)
5089 {
5091 }
5092 if (IsGlobal)
5093 {
5095 }
5096 }
5097 if (renderer.hasActor)
5098 {
5099 renderer.KillActor();
5100 }
5101 if (parent != null)
5102 {
5103 parent.RemoveCard(this);
5104 }
5105 for (int num = things.Count - 1; num >= 0; num--)
5106 {
5107 things[num].Destroy();
5108 }
5109 isDestroyed = true;
5110 }
5111
5112 public void SpawnLoot(Card origin)
5113 {
5114 if (!isChara || IsPCFactionMinion || (isCopy && EClass.rnd(10) != 0))
5115 {
5116 return;
5117 }
5118 bool isUserZone = EClass._zone.IsUserZone;
5119 bool flag = EClass._zone is Zone_Music;
5120 List<Card> list = new List<Card>();
5121 if (!IsPCFaction && !isUserZone && sourceCard.idActor.IsEmpty())
5122 {
5123 int i2 = 500;
5124 if (this.rarity >= Rarity.Legendary)
5125 {
5126 i2 = ((!EClass.player.codex.DroppedCard(id)) ? 1 : 10);
5128 }
5129 if (trait is TraitAdventurerBacker)
5130 {
5131 i2 = 10;
5132 }
5133 if (chance(i2))
5134 {
5135 Thing thing = ThingGen.Create("figure");
5136 thing.MakeFigureFrom(id);
5137 list.Add(thing);
5138 }
5139 if (chance(i2))
5140 {
5141 Thing thing2 = ThingGen.Create("figure3");
5142 thing2.MakeFigureFrom(id);
5143 list.Add(thing2);
5144 }
5145 }
5146 bool flag2 = Chara.race.corpse[1].ToInt() > EClass.rnd(1500) || (Chara.IsPowerful && !IsPCFaction) || EClass.debug.godFood;
5147 int num = 1;
5148 if (!IsMinion && Chara.IsAnimal && EClass.rnd(EClass._zone.IsPCFaction ? 3 : 5) == 0)
5149 {
5150 flag2 = true;
5151 }
5153 {
5154 flag2 = true;
5155 num = EClass.rndHalf(4 + 10 * (50 + Mathf.Max(0, (int)MathF.Sqrt(EClass.pc.Evalue(290) * 10))) / 100);
5156 }
5157 else if (origin != null && origin.HasElement(290) && !IsMinion)
5158 {
5159 if (!flag2 && Chara.race.corpse[1].ToInt() > EClass.rnd(150000 / (100 + (int)Mathf.Sqrt(origin.Evalue(290)) * 5)))
5160 {
5161 flag2 = true;
5162 origin.elements.ModExp(290, 150f);
5163 }
5164 else
5165 {
5166 origin.elements.ModExp(290, 25f);
5167 }
5168 }
5169 if (id == "littleOne" && IsPCFactionOrMinion)
5170 {
5171 flag2 = false;
5172 }
5173 if (Chara.race.id == "spider" && EClass._zone.HasField(10000))
5174 {
5175 flag2 = false;
5176 }
5177 if (flag2 && !isUserZone)
5178 {
5179 string text = Chara.race.corpse[0];
5180 bool num2 = text == "_meat";
5181 int num3 = 10;
5183 {
5184 num3 += (int)Mathf.Min(Mathf.Sqrt(EClass.pc.Evalue(290)), 20f);
5185 }
5186 if (EClass.rnd((Act.CurrentAct is ActMeleeBladeStorm || (origin != null && (origin.HasElement(1556) || origin.HasCondition<ConTransmuteCat>()))) ? 2 : 100) == 0)
5187 {
5188 text = "dattamono";
5189 }
5190 if (num2 && num3 > EClass.rnd(100))
5191 {
5192 text = "meat_marble";
5193 }
5194 Thing thing3 = ThingGen.Create(text).SetNum(num);
5195 if (thing3.source._origin == "meat")
5196 {
5197 thing3.MakeFoodFrom(this);
5198 }
5199 else
5200 {
5202 }
5203 list.Add(thing3);
5204 }
5205 if (!IsPCFaction && (!isUserZone || !EClass.game.principal.disableUsermapBenefit) && chance(200))
5206 {
5207 list.Add(Chara.MakeGene());
5208 }
5209 if (!IsPCFaction && !isUserZone)
5210 {
5211 foreach (string item2 in sourceCard.loot.Concat(Chara.race.loot).ToList())
5212 {
5213 string[] array = item2.Split('/');
5214 int num4 = array[1].ToInt();
5215 if (num4 >= 1000 || num4 > EClass.rnd(1000) || EClass.debug.godMode)
5216 {
5217 CardRow cardRow = EClass.sources.cards.map[array[0]];
5218 if (cardRow != null && cardRow.Category.slot != 0 && cardRow.quality == 0 && EClass.pc.Evalue(1660) * 25 > EClass.rnd(100))
5219 {
5220 CardBlueprint.SetRarity((EClass.rnd(20) == 0) ? Rarity.Mythical : Rarity.Legendary);
5221 }
5222 list.Add(ThingGen.Create(array[0], -1, LV).SetNum((num4 < 1000) ? 1 : (num4 / 1000 + ((EClass.rnd(1000) < num4 % 1000) ? 1 : 0))));
5223 }
5224 }
5225 if (Chara.IsMachine)
5226 {
5227 bool flag3 = Chara.HasElement(1248);
5228 if (chance(200))
5229 {
5230 list.Add(ThingGen.Create("memory_chip"));
5231 }
5232 if (chance(20))
5233 {
5234 list.Add(ThingGen.Create(flag3 ? "scrap" : "microchip"));
5235 }
5236 if (chance(15))
5237 {
5238 list.Add(ThingGen.Create(flag3 ? "bolt" : "battery"));
5239 }
5240 }
5241 else
5242 {
5243 if (Chara.IsAnimal)
5244 {
5245 if (chance(15))
5246 {
5247 list.Add(ThingGen.Create("fang"));
5248 }
5249 if (chance(10))
5250 {
5251 list.Add(ThingGen.Create("skin"));
5252 }
5253 }
5254 if (chance(20))
5255 {
5256 list.Add(ThingGen.Create("offal"));
5257 }
5258 if (chance(20))
5259 {
5260 list.Add(ThingGen.Create("heart"));
5261 }
5262 }
5263 if (!isBackerContent && !flag)
5264 {
5265 switch (id)
5266 {
5267 case "pumpkin":
5268 if (chance(3))
5269 {
5270 list.Add(ThingGen.CreateFromCategory((EClass.rnd(2) == 0) ? "meal_cookie" : "meal_cake", 5 + EClass.rnd(EClass.rnd(50) + 1)));
5271 }
5272 break;
5273 case "isca":
5274 list.Add(ThingGen.Create("blood_angel"));
5275 break;
5276 case "golem_wood":
5277 if (chance(30))
5278 {
5279 list.Add(ThingGen.Create("crystal_earth"));
5280 }
5281 break;
5282 case "golem_fish":
5283 case "golem_stone":
5284 if (chance(30))
5285 {
5286 list.Add(ThingGen.Create("crystal_sun"));
5287 }
5288 break;
5289 case "golem_steel":
5290 if (chance(30))
5291 {
5292 list.Add(ThingGen.Create("crystal_mana"));
5293 }
5294 break;
5295 case "golem_gold":
5296 list.Add(ThingGen.Create("money2"));
5297 break;
5298 }
5299 int num5 = ((EClass._zone.Boss == this) ? 2 : ((this.rarity >= Rarity.Legendary) ? 1 : 0));
5300 if (EClass._zone is Zone_Void)
5301 {
5302 num5++;
5303 }
5304 if (EClass.rnd(5) == 0)
5305 {
5306 num5++;
5307 }
5308 string text2 = id;
5309 if (text2 == "big_daddy" || text2 == "santa")
5310 {
5311 num5 += 2;
5312 }
5313 if (num5 > 0 && EClass.game.principal.dropRate)
5314 {
5315 num5 = Mathf.Max(1, num5 * (50 + EClass.game.principal.dropRateMtp * 50) / 100);
5316 }
5317 List<Thing> list2 = new List<Thing>();
5318 foreach (Thing thing4 in things)
5319 {
5320 if (thing4.HasTag(CTAG.gift) || thing4.trait is TraitChestMerchant)
5321 {
5322 continue;
5323 }
5324 if (thing4.isGifted || thing4.rarity >= Rarity.Artifact || thing4.trait.DropChance > EClass.rndf(1f))
5325 {
5326 list.Add(thing4);
5327 }
5328 else if (thing4.IsEquipmentOrRanged)
5329 {
5330 if (thing4.rarity >= Rarity.Legendary)
5331 {
5332 list2.Add(thing4);
5333 }
5334 else if (EClass.rnd(100) == 0)
5335 {
5336 list.Add(thing4);
5337 }
5338 }
5339 else if (EClass.rnd(5) == 0)
5340 {
5341 list.Add(thing4);
5342 }
5343 }
5344 if (num5 > 0 && list2.Count > 0)
5345 {
5346 list2.Shuffle();
5347 for (int j = 0; j < list2.Count && j < num5; j++)
5348 {
5349 list.Add(list2[j]);
5350 num5--;
5351 }
5352 }
5353 if (this.rarity >= Rarity.Legendary && !IsUnique && c_bossType != BossType.Evolved)
5354 {
5355 int num6 = 0;
5356 foreach (Card item3 in list)
5357 {
5358 if (item3.rarity >= Rarity.Legendary || item3.IsContainer)
5359 {
5360 num6++;
5361 }
5362 }
5363 if (num6 == 0)
5364 {
5365 int num7 = ((!(EClass._zone is Zone_Void)) ? 1 : 2);
5366 if (num5 < num7)
5367 {
5368 num5 = num7;
5369 }
5370 for (int k = 0; k < num5; k++)
5371 {
5372 Rand.SetSeed(uid + k);
5373 if (EClass.rnd((EClass._zone.events.GetEvent<ZoneEventDefenseGame>() != null) ? 3 : 2) == 0)
5374 {
5375 Rarity rarity = ((EClass.rnd(20) == 0) ? Rarity.Mythical : Rarity.Legendary);
5377 {
5378 rarity = rarity
5379 });
5380 Thing item = ThingGen.CreateFromFilter("eq", LV);
5381 list.Add(item);
5382 }
5383 else if (EClass.rnd(3) == 0)
5384 {
5385 list.Add(ThingGen.Create("medal"));
5386 }
5387 Rand.SetSeed();
5388 }
5389 }
5390 }
5391 }
5392 }
5393 foreach (Thing thing5 in things)
5394 {
5395 if (thing5.GetInt(116) != 0)
5396 {
5397 list.Add(thing5);
5398 }
5399 }
5400 Point nearestPoint = GetRootCard().pos;
5401 if (nearestPoint.IsBlocked)
5402 {
5403 nearestPoint = nearestPoint.GetNearestPoint();
5404 }
5405 foreach (Card item4 in list)
5406 {
5407 if (item4.parent == EClass._zone)
5408 {
5409 continue;
5410 }
5411 item4.isHidden = false;
5412 item4.isNPCProperty = false;
5413 item4.SetInt(116);
5414 EClass._zone.AddCard(item4, nearestPoint);
5415 if (!item4.IsEquipment || item4.rarity < Rarity.Superior || item4.IsCursed)
5416 {
5417 continue;
5418 }
5419 foreach (Chara chara in EClass._map.charas)
5420 {
5421 if (chara.HasElement(1412) && chara.Dist(nearestPoint) < 3)
5422 {
5423 item4.Thing.TryLickEnchant(chara);
5424 break;
5425 }
5426 }
5427 }
5428 bool chance(int i)
5429 {
5430 i = i * 100 / (100 + EClass.player.codex.GetOrCreate(id).BonusDropLv * 10);
5431 if (i < 1)
5432 {
5433 i = 1;
5434 }
5435 if (IsMinion)
5436 {
5437 i *= 5;
5438 }
5439 if (EClass.rnd(i) == 0)
5440 {
5441 return true;
5442 }
5443 return false;
5444 }
5445 }
5446
5447 public Thing TryMakeRandomItem(int lv = -1, TryMakeRandomItemSource itemSource = TryMakeRandomItemSource.Default, Chara crafter = null)
5448 {
5449 if (lv == -1)
5450 {
5451 lv = EClass._zone.DangerLv;
5452 }
5453 switch (id)
5454 {
5455 case "gene":
5457 break;
5458 case "log":
5459 ChangeMaterial(EClass.sources.materials.rows.Where((SourceMaterial.Row m) => m.category == "wood").RandomItem());
5460 break;
5461 case "ore_gem":
5463 break;
5464 case "ore":
5466 break;
5467 case "milk":
5468 case "_egg":
5469 case "egg_fertilized":
5470 case "_meat":
5471 case "meat_marble":
5472 case "dattamono":
5473 {
5474 string text = "c_wilds";
5475 if (id == "_meat" || id == "meat_marble")
5476 {
5477 text = "c_animal";
5478 }
5479 if (itemSource == TryMakeRandomItemSource.Cooking && crafter != null && crafter.HasElement(1205))
5480 {
5481 text = "c_human";
5482 }
5483 for (int i = 0; i < 20; i++)
5484 {
5485 CardRow cardRow = SpawnList.Get(text).Select(lv + i);
5486 if (cardRow.model.Chara.race.corpse[0] != "_meat" && id != "milk" && id != "_egg" && id != "egg_fertilized")
5487 {
5488 continue;
5489 }
5490 if (itemSource == TryMakeRandomItemSource.Cooking)
5491 {
5492 if (cardRow.model.HasElement(701))
5493 {
5494 continue;
5495 }
5496 if (crafter != null && crafter.id == "big_sister")
5497 {
5498 cardRow = crafter.source;
5499 }
5500 }
5501 if (id == "milk")
5502 {
5503 if (c_idRefCard.IsEmpty())
5504 {
5505 MakeRefFrom(cardRow.model);
5506 }
5507 }
5508 else
5509 {
5510 MakeFoodFrom(cardRow.model);
5511 }
5512 return this as Thing;
5513 }
5514 MakeFoodFrom(EClass.sources.charas.map.Values.Where((SourceChara.Row r) => r.chance > 0 && r.quality == 0).RandomItem().model);
5515 break;
5516 }
5517 }
5518 return this as Thing;
5519 }
5520
5521 public Card MakeFoodFrom(string _id)
5522 {
5523 return MakeFoodFrom(EClass.sources.cards.map[_id].model);
5524 }
5525
5527 {
5528 MakeRefFrom(c);
5530 if (!c.isChara)
5531 {
5532 return this;
5533 }
5534 SourceRace.Row race = c.Chara.race;
5535 int num = race.food[0].ToInt();
5536 bool flag = id == "meat_marble";
5537 int num2 = 1;
5538 bool flag2 = category.IsChildOf("meat");
5539 bool flag3 = category.IsChildOf("egg");
5540 if (flag)
5541 {
5542 num += 100;
5543 }
5544 if (flag2)
5545 {
5546 if (c.IsPCFaction && c.IsUnique)
5547 {
5548 num = -100;
5549 }
5550 elements.SetBase(70, race.STR * race.STR / 5 * num / 100 - 10 + num / 10);
5551 if (flag)
5552 {
5553 elements.SetBase(440, race.END * race.END / 5 * num / 100 - 10 + num / 10);
5554 }
5555 elements.SetBase(71, (int)Mathf.Clamp((float)(num / 10) + Mathf.Sqrt(race.height) - 10f, 1f, 60f));
5556 }
5557 else if (flag3)
5558 {
5559 elements.SetBase(444, race.LER * race.LER / 5 * num / 100 - 10 + num / 10);
5560 num2 = 2;
5561 }
5562 else
5563 {
5564 num2 = 3;
5565 }
5566 if (flag2)
5567 {
5568 if (c.Chara.IsHuman)
5569 {
5570 elements.SetBase(708, 1);
5571 }
5572 if (c.Chara.IsUndead)
5573 {
5574 elements.SetBase(709, 1);
5575 }
5576 }
5577 foreach (Element value in c.elements.dict.Values)
5578 {
5579 if ((!flag3 || value.id != 1229) && (value.source.category == "food" || value.source.tag.Contains("foodEnc") || value.IsTrait))
5580 {
5581 elements.SetBase(value.id, value.Value);
5582 }
5583 }
5584 List<Tuple<int, int>> list = new List<Tuple<int, int>>();
5585 foreach (KeyValuePair<int, int> item in race.elementMap)
5586 {
5587 if (EClass.sources.elements.map[item.Key].tag.Contains("primary"))
5588 {
5589 list.Add(new Tuple<int, int>(item.Key, item.Value));
5590 }
5591 }
5592 list.Sort((Tuple<int, int> a, Tuple<int, int> b) => b.Item2 - a.Item2);
5593 for (int i = 0; i < num2 && i < list.Count; i++)
5594 {
5595 Tuple<int, int> tuple = list[i];
5596 elements.SetBase(tuple.Item1, tuple.Item2 * tuple.Item2 / 4);
5597 }
5598 if (c.Chara.IsUndead)
5599 {
5600 elements.ModBase(73, (c.Chara.race.id == "undeadgod") ? (-90) : (-20));
5601 }
5602 isWeightChanged = true;
5603 c_weight = race.height * 4 + 100;
5604 c_idMainElement = c.c_idMainElement;
5605 SetBlessedState(BlessedState.Normal);
5606 int num3 = c.LV - c.sourceCard.LV;
5607 if (num3 < 0)
5608 {
5609 num3 = 0;
5610 }
5611 num3 = EClass.curve(num3, 10, 10, 80);
5612 if (c.rarity >= Rarity.Legendary || c.IsUnique)
5613 {
5614 num3 += 60;
5615 }
5616 if (flag2 && c.IsPCFaction && c.IsUnique)
5617 {
5618 num3 = 0;
5619 }
5620 if (num3 > 0)
5621 {
5622 elements.ModBase(2, num3);
5623 }
5624 return this;
5625 }
5626
5627 public void MakeFoodRef(Card c1, Card c2 = null)
5628 {
5629 Card card = c1;
5630 Card card2 = c2;
5631 if (IsIgnoreName(card))
5632 {
5633 card = null;
5634 }
5635 if (IsIgnoreName(card2))
5636 {
5637 card2 = null;
5638 }
5639 if (card == null && card2 != null)
5640 {
5641 card = card2;
5642 card2 = null;
5643 }
5644 if (card != null)
5645 {
5646 MakeRefFrom(card, card2);
5647 if (card.c_idRefCard != null)
5648 {
5649 c_idRefCard = card.c_idRefCard;
5650 c_altName = TryGetFoodName(card);
5651 }
5652 if (card2 != null && card2.c_idRefCard != null)
5653 {
5654 c_idRefCard2 = card2.c_idRefCard;
5655 c_altName2 = TryGetFoodName(card2);
5656 }
5657 }
5658 static bool IsIgnoreName(Card c)
5659 {
5660 if (c == null)
5661 {
5662 return true;
5663 }
5664 switch (c.id)
5665 {
5666 case "dough_cake":
5667 case "dough_bread":
5668 case "noodle":
5669 case "flour":
5670 case "rice":
5671 return true;
5672 default:
5673 return false;
5674 }
5675 }
5676 }
5677
5678 public string TryGetFoodName(Card c)
5679 {
5680 if (c.c_idRefCard.IsEmpty())
5681 {
5682 return c.c_altName;
5683 }
5684 if (!(c.refCard is SourceChara.Row { isChara: not false } row))
5685 {
5686 return c.c_altName;
5687 }
5688 if (!row.aka.IsEmpty())
5689 {
5690 if (row.name == "*r" && row.aka == "*r")
5691 {
5692 return "corpseGeneral".lang();
5693 }
5694 if (row.name == "*r")
5695 {
5696 return row.GetText("aka");
5697 }
5698 }
5699 return row.GetName();
5700 }
5701
5702 public string GetFoodName(string s)
5703 {
5704 return s.Replace("_corpseFrom".lang(), "_corpseTo".lang());
5705 }
5706
5707 public void MakeFigureFrom(string id)
5708 {
5709 MakeRefFrom(id);
5710 }
5711
5712 public Card MakeRefFrom(string id)
5713 {
5714 c_idRefCard = id;
5715 return this;
5716 }
5717
5718 public void MakeRefFrom(Card c1, Card c2 = null)
5719 {
5720 c_idRefCard = c1.id;
5721 c_altName = (c1.IsPC ? c1.c_altName : c1.GetName(NameStyle.Ref, (!c1.isChara) ? 1 : 0));
5722 if (c2 != null)
5723 {
5724 c_idRefCard2 = c2.id;
5725 c_altName2 = (c2.IsPC ? c2.c_altName : c2.GetName(NameStyle.Ref, (!c2.isChara) ? 1 : 0));
5726 }
5727 c_extraNameRef = (c1.IsPC ? EClass.pc.c_altName : c1.c_extraNameRef);
5728 }
5729
5730 public Thing MakeEgg(bool effect = true, int num = 1, bool addToZone = true, int fertChance = 20, BlessedState? state = null)
5731 {
5732 Thing thing = ThingGen.Create((EClass.rnd(EClass.debug.enable ? 1 : fertChance) == 0) ? "egg_fertilized" : "_egg").SetNum(num);
5733 if (!EClass.debug.enable && HasElement(1290) && Evalue(418) >= 0)
5734 {
5735 thing.MakeFoodFrom(EClass.sources.charas.map["caladrius"].model);
5736 }
5737 else
5738 {
5739 thing.MakeFoodFrom(this);
5740 }
5741 thing.c_idMainElement = c_idMainElement;
5742 if (state.HasValue)
5743 {
5744 thing.SetBlessedState(state.Value);
5745 }
5746 if (!addToZone)
5747 {
5748 return thing;
5749 }
5750 return GiveBirth(thing, effect);
5751 }
5752
5753 public Thing MakeMilk(bool effect = true, int num = 1, bool addToZone = true, BlessedState? state = null)
5754 {
5755 Thing thing = ThingGen.Create("milk").SetNum(num);
5756 if (!EClass.debug.enable && HasElement(1290) && Evalue(418) >= 0)
5757 {
5758 thing.MakeRefFrom(EClass.sources.charas.map["caladrius"].model);
5759 }
5760 else
5761 {
5762 thing.MakeRefFrom(this);
5763 }
5764 if (state.HasValue)
5765 {
5766 thing.SetBlessedState(state.Value);
5767 }
5768 int num2 = LV - sourceCard.LV;
5769 if (!IsPCFaction && EClass._zone.IsUserZone)
5770 {
5771 num2 = 0;
5772 }
5773 if (num2 >= 10 && !HasElement(1290))
5774 {
5775 thing.SetEncLv(num2 / 10);
5776 }
5777 if (!addToZone)
5778 {
5779 return thing;
5780 }
5781 return GiveBirth(thing, effect);
5782 }
5783
5784 public Thing GiveBirth(Thing t, bool effect)
5785 {
5786 Card card = (ExistsOnMap ? this : (GetRootCard() ?? EClass.pc));
5787 EClass.player.forceTalk = true;
5788 card.Talk("giveBirth");
5789 EClass._zone.TryAddThing(t, card.pos);
5790 if (effect)
5791 {
5792 card.pos.PlayEffect("revive");
5793 card.pos.PlaySound("egg");
5794 PlayAnime(AnimeID.Shiver);
5795 if (isChara)
5796 {
5798 }
5799 }
5800 return t;
5801 }
5802
5803 public void HatchEgg()
5804 {
5805 string[] array = new string[6] { "spider_queen", "spider_vampire", "spider_paralyzer", "spider_black", "spider_tarantula", "spider_spotted" };
5806 int num = EClass.rnd(array.Length);
5807 Point point = pos.Copy();
5808 PlayEffect("blood").SetParticleColor(EClass.Colors.matColors[material.alias].main).Emit(50);
5809 AddBlood(12, (uid % 2 == 0) ? (-1) : 3);
5810 Say("egghatch");
5811 PlaySound("egghatch");
5812 if (c_bossType == BossType.none)
5813 {
5814 Destroy();
5815 }
5816 if (!isDestroyed)
5817 {
5818 Die();
5819 if (isChara && !Chara.isDead)
5820 {
5821 hp = 0;
5822 Chara.AddCondition<ConFaint>(1000, force: true);
5823 }
5824 }
5825 for (int i = 0; i < 1 + EClass.rnd(num + 1); i++)
5826 {
5827 EClass._zone.SpawnMob(array[num], point.GetNearestPoint(allowBlock: false, allowChara: false));
5828 }
5829 }
5830
5831 public Card SetHidden(bool hide = true)
5832 {
5833 isHidden = hide;
5834 pos.cell.Refresh();
5835 return this;
5836 }
5837
5838 public virtual MoveResult _Move(Point p, MoveType type = MoveType.Walk)
5839 {
5840 EClass._map.MoveCard(p, this);
5841 if (isChara)
5842 {
5843 Chara.SyncRide();
5844 }
5845 return MoveResult.Success;
5846 }
5847
5848 public void MoveImmediate(Point p, bool focus = true, bool cancelAI = true)
5849 {
5850 if (p == null)
5851 {
5852 return;
5853 }
5854 EClass._map.MoveCard(p, this);
5855 if (!IsPC || focus)
5856 {
5857 renderer.SetFirst(first: true, p.PositionCenter());
5858 }
5859 if (isChara)
5860 {
5861 if (cancelAI)
5862 {
5863 Chara.ai.Cancel();
5864 }
5865 Chara.SyncRide();
5866 }
5867 if (IsPC && focus)
5868 {
5871 }
5872 }
5873
5874 public void Teleport(Point point, bool silent = false, bool force = false)
5875 {
5876 if (EClass._zone.IsRegion)
5877 {
5878 SayNothingHappans();
5879 return;
5880 }
5881 PlayEffect("teleport");
5882 if (!force && (!trait.CanBeTeleported || elements.Has(400) || (isChara && Chara.HasCondition<ConGravity>())))
5883 {
5884 Say("antiTeleport", this);
5885 PlaySound("gravity");
5886 return;
5887 }
5888 if (!silent)
5889 {
5890 PlaySound("teleport");
5891 Say("teleported", this);
5892 }
5893 _Move(point);
5894 renderer.SetFirst(first: true, pos.PositionCenter());
5895 if (isChara)
5896 {
5897 Chara.ai.Cancel();
5898 foreach (Chara chara in EClass._map.charas)
5899 {
5900 if (chara.enemy == this)
5901 {
5902 chara.SetEnemy();
5903 }
5904 }
5905 Chara.RemoveCondition<ConEntangle>();
5906 }
5907 if (IsPC)
5908 {
5911 EClass.player.haltMove = true;
5912 }
5913 PlayEffect("teleport", useRenderPos: false);
5914 }
5915
5916 public virtual void OnLand()
5917 {
5919 {
5920 PlayEffect("ripple");
5921 PlaySound("Footstep/water");
5922 }
5923 }
5924
5925 public int ResistLvFrom(int ele)
5926 {
5927 return ResistLv(EClass.sources.elements.alias.TryGetValue(EClass.sources.elements.map[ele].aliasRef)?.id ?? 0);
5928 }
5929
5930 public int ResistLv(int res)
5931 {
5932 return Element.GetResistLv(Evalue(res));
5933 }
5934
5935 public bool HasElement(int ele, bool includeNagative = false)
5936 {
5937 if (elements.Value(ele) <= 0)
5938 {
5939 if (includeNagative)
5940 {
5941 return elements.Value(ele) < 0;
5942 }
5943 return false;
5944 }
5945 return true;
5946 }
5947
5948 public bool HasElement(int ele, int req)
5949 {
5950 return elements.Value(ele) >= req;
5951 }
5952
5953 public bool HasElement(string id, int req = 1)
5954 {
5955 return HasElement(EClass.sources.elements.alias[id].id, req);
5956 }
5957
5958 public bool HasGlobalElement(int ele)
5959 {
5960 return elements.GetElement(ele)?.IsGlobalElement ?? false;
5961 }
5962
5963 public bool HasElementNoCopy()
5964 {
5965 if (HasElement(764))
5966 {
5967 return true;
5968 }
5969 if (HasElement(759))
5970 {
5971 return true;
5972 }
5973 if (HasElement(703))
5974 {
5975 return true;
5976 }
5977 if (HasElement(758))
5978 {
5979 return true;
5980 }
5981 if (HasElement(704))
5982 {
5983 return true;
5984 }
5985 return false;
5986 }
5987
5989 {
5990 renderer = new CardRenderer();
5991 renderer.SetOwner(this);
5992 return renderer;
5993 }
5994
5995 public void AddBlood(int a = 1, int id = -1)
5996 {
5997 if (!EClass._zone.IsRegion)
5998 {
5999 for (int i = 0; i < a; i++)
6000 {
6001 EClass._map.AddDecal(pos.x + ((EClass.rnd(2) != 0) ? (EClass.rnd(3) - 1) : 0), pos.z + ((EClass.rnd(2) != 0) ? (EClass.rnd(3) - 1) : 0), (id == -1) ? (isChara ? Chara.race.blood : material.decal) : id);
6002 }
6003 PlaySound("blood");
6004 }
6005 }
6006
6008 {
6010 shared.color = 11010048f;
6011 shared.liquidLv = 0;
6012 shared.cell = null;
6013 SetRenderParam(shared);
6014 return shared;
6015 }
6016
6017 public virtual void SetRenderParam(RenderParam p)
6018 {
6019 }
6020
6021 public void DyeRandom()
6022 {
6023 Dye(EClass.sources.materials.rows.Where((SourceMaterial.Row r) => r.tier <= 4 && (r.matColor.r != r.matColor.g || r.matColor.g != r.matColor.b || r.matColor.b != r.matColor.r)).RandomItem().alias);
6024 }
6025
6026 public void Dye(string idMat)
6027 {
6028 Dye(EClass.sources.materials.alias[idMat]);
6029 }
6030
6031 public void Dye(SourceMaterial.Row mat)
6032 {
6033 isDyed = mat != null;
6034 c_dyeMat = mat?.id ?? 0;
6035 _colorInt = 0;
6036 }
6037
6038 public void RefreshColor()
6039 {
6040 if (isChara)
6041 {
6042 if (isDyed)
6043 {
6044 _colorInt = BaseTileMap.GetColorInt(ref DyeMat.matColor, TileRow.colorMod);
6045 }
6046 else if (isElemental)
6047 {
6049 }
6050 else
6051 {
6052 _colorInt = 104025;
6053 }
6054 }
6055 else if (isDyed)
6056 {
6057 if (TileRow.useAltColor)
6058 {
6059 _colorInt = BaseTileMap.GetColorInt(ref DyeMat.altColor, TileRow.colorMod);
6060 }
6061 else
6062 {
6063 _colorInt = BaseTileMap.GetColorInt(ref DyeMat.matColor, TileRow.colorMod);
6064 }
6065 }
6066 else if (sourceRenderCard.useRandomColor)
6067 {
6068 _colorInt = BaseTileMap.GetColorInt(ref GetRandomColor(), TileRow.colorMod);
6069 }
6070 else if (sourceRenderCard.useAltColor)
6071 {
6072 _colorInt = BaseTileMap.GetColorInt(ref material.altColor, TileRow.colorMod);
6073 }
6074 else
6075 {
6076 _colorInt = BaseTileMap.GetColorInt(ref material.matColor, TileRow.colorMod);
6077 }
6078 }
6079
6081 {
6082 int num = EClass.game.seed + refVal;
6083 num += id[0] % 10000;
6084 if (id.Length > 1)
6085 {
6086 num += id[1] % 1000;
6087 if (id.Length > 2)
6088 {
6089 num += id[2] % 1000;
6090 if (id.Length > 3)
6091 {
6092 num += id[3] % 1000;
6093 if (id.Length > 4)
6094 {
6095 num += id[4] % 1000;
6096 }
6097 }
6098 }
6099 }
6100 Rand.UseSeed(num, delegate
6101 {
6102 _randColor = EClass.sources.materials.rows[EClass.rnd(90)].matColor;
6103 });
6104 return ref _randColor;
6105 }
6106
6107 public virtual Sprite GetSprite(int dir = 0)
6108 {
6109 if (trait is TraitFakeTile)
6110 {
6111 if (trait is TraitFakeBlock)
6112 {
6113 return EClass.sources.blocks.map[refVal].GetSprite(dir, trait.IdSkin, (IsInstalled && pos != null && pos.IsValid && pos.cell.IsSnowTile) ? true : false);
6114 }
6115 return EClass.sources.objs.map[refVal].GetSprite(dir, trait.IdSkin, (IsInstalled && pos != null && pos.IsValid && pos.cell.IsSnowTile) ? true : false);
6116 }
6117 if (trait is TraitAbility)
6118 {
6119 return (trait as TraitAbility).CreateAct()?.GetSprite() ?? EClass.core.refs.icons.defaultAbility;
6120 }
6121 return sourceCard.GetSprite(dir, trait.IdSkin, (IsInstalled && pos != null && pos.IsValid && pos.cell.IsSnowTile) ? true : false);
6122 }
6123
6124 public virtual Sprite GetImageSprite()
6125 {
6126 return null;
6127 }
6128
6129 public void SetImage(Image image, int dir, int idSkin = 0)
6130 {
6131 sourceRenderCard.SetImage(image, GetSprite(dir), colorInt, setNativeSize: true, dir, idSkin, this);
6132 }
6133
6134 public virtual void SetImage(Image image)
6135 {
6136 if (trait is TraitAbility)
6137 {
6138 (trait as TraitAbility).act.SetImage(image);
6139 return;
6140 }
6141 Sprite sprite = GetSprite();
6142 if (!c_idSpriteReplacer.IsEmpty())
6143 {
6144 SpriteReplacer spriteReplacer = SpriteReplacer.dictSkins.TryGetValue(c_idSpriteReplacer);
6145 if (spriteReplacer != null)
6146 {
6147 RenderData renderData = ResourceCache.Load<RenderData>("Scene/Render/Data/chara_custom_" + ((spriteReplacer.data.GetSprite().texture.height <= 128) ? "128" : "256"));
6148 sprite = spriteReplacer.data.GetSprite();
6149 sourceRenderCard.SetImage(image, sprite, colorInt, setNativeSize: true, 0, 0, renderData, spriteReplacer.data.pref ?? Pref);
6150 return;
6151 }
6152 }
6153 sourceRenderCard.SetImage(image, sprite, colorInt, setNativeSize: true, 0, 0, this);
6154 }
6155
6156 public void ShowEmo(Emo _emo = Emo.none, float duration = 0f, bool skipSame = true)
6157 {
6158 if ((!isChara || Chara.host == null) && !(_emo == lastEmo && skipSame))
6159 {
6160 if (_emo != 0)
6161 {
6162 renderer.ShowEmo(_emo, duration);
6163 }
6164 lastEmo = _emo;
6165 }
6166 }
6167
6168 public void PlaySoundHold(bool spatial = true)
6169 {
6170 PlaySound(material.GetSoundDrop(sourceCard), 1f, spatial);
6171 }
6172
6173 public void PlaySoundDrop(bool spatial = true)
6174 {
6175 PlaySound(material.GetSoundDrop(sourceCard), 1f, spatial);
6176 }
6177
6178 public void PlaySoundImpact(bool spatial = true)
6179 {
6180 PlaySound(material.GetSoundImpact(sourceCard), 1f, spatial);
6181 }
6182
6183 public void PlaySoundDead(bool spatial = true)
6184 {
6185 PlaySound(material.GetSoundDead(sourceCard), 1f, spatial);
6186 }
6187
6188 public SoundSource PlaySound(string id, float v = 1f, bool spatial = true)
6189 {
6190 Card rootCard = GetRootCard();
6191 if (rootCard.IsPC)
6192 {
6193 spatial = false;
6194 }
6195 if (rootCard.Dist(EClass.pc) < EClass.player.lightRadius + 1 || !spatial)
6196 {
6197 return rootCard.pos.PlaySound(id, isSynced || !spatial, v, spatial);
6198 }
6199 return null;
6200 }
6201
6202 public void KillAnime()
6203 {
6204 renderer.KillAnime();
6205 }
6206
6207 public void PlayAnime(AnimeID id, bool force = false)
6208 {
6209 renderer.PlayAnime(id, force);
6210 }
6211
6212 public void PlayAnime(AnimeID id, Point dest, bool force = false)
6213 {
6214 renderer.PlayAnime(id, dest);
6215 }
6216
6217 public void PlayAnimeLoot()
6218 {
6219 renderer.PlayAnime(AnimeID.Loot);
6220 }
6221
6222 public Effect PlayEffect(string id, bool useRenderPos = true, float range = 0f, Vector3 fix = default(Vector3))
6223 {
6224 if (id.IsEmpty())
6225 {
6226 return null;
6227 }
6228 Card rootCard = GetRootCard();
6229 return Effect.Get(id)._Play(rootCard.pos, fix + ((isSynced && useRenderPos) ? rootCard.renderer.position : rootCard.pos.Position()) + new Vector3(Rand.Range(0f - range, range), Rand.Range(0f - range, range), 0f));
6230 }
6231
6232 public void PlayEffect(int ele, bool useRenderPos = true, float range = 0f)
6233 {
6234 Effect effect = Effect.Get("Element/" + EClass.sources.elements.map[ele].alias);
6235 if (effect == null)
6236 {
6237 Debug.Log(ele);
6238 return;
6239 }
6240 Card rootCard = GetRootCard();
6241 effect._Play(rootCard.pos, ((isSynced && useRenderPos) ? rootCard.renderer.position : rootCard.pos.Position()) + new Vector3(Rand.Range(0f - range, range), Rand.Range(0f - range, range), 0f));
6242 }
6243
6244 public virtual void SetDir(int d)
6245 {
6246 dir = d;
6247 renderer.RefreshSprite();
6248 }
6249
6250 public void SetRandomDir()
6251 {
6252 SetDir(EClass.rnd(4));
6253 }
6254
6255 public virtual void LookAt(Card c)
6256 {
6257 }
6258
6259 public virtual void LookAt(Point p)
6260 {
6261 }
6262
6263 public virtual void Rotate(bool reverse = false)
6264 {
6265 int num = 4;
6266 if (sourceCard.tiles.Length > 4)
6267 {
6268 num = sourceCard.tiles.Length;
6269 }
6270 if (TileType == TileType.Door)
6271 {
6272 num = 2;
6273 }
6274 if (trait is TraitFakeObj)
6275 {
6276 num = (trait as TraitFakeObj).GetMaxDir();
6277 }
6278 if (reverse)
6279 {
6280 dir--;
6281 }
6282 else
6283 {
6284 dir++;
6285 }
6286 if (dir < 0)
6287 {
6288 dir = num - 1;
6289 }
6290 if (dir == num)
6291 {
6292 dir = 0;
6293 }
6294 SetDir(dir);
6295 renderer.RefreshSprite();
6296 }
6297
6298 public void ChangeAltitude(int a)
6299 {
6300 altitude += a;
6301 if (altitude < 0)
6302 {
6303 altitude = 0;
6304 }
6305 if (altitude > TileType.MaxAltitude)
6306 {
6307 altitude = TileType.MaxAltitude;
6308 }
6309 }
6310
6312 {
6313 return SubPassData.Default;
6314 }
6315
6316 public void SetFreePos(Point point)
6317 {
6318 freePos = EClass.game.config.FreePos && isThing && TileType.FreeStyle;
6319 if (freePos)
6320 {
6321 Vector3 vector = point.Position();
6322 Vector3 thingPosition = EClass.screen.tileMap.GetThingPosition(this, point);
6323 fx = EInput.mposWorld.x + EClass.setting.render.freePosFix.x;
6324 fy = EInput.mposWorld.y + EClass.setting.render.freePosFix.y;
6326 {
6327 fx -= fx % 0.2f;
6328 fy -= fy % 0.1f;
6329 }
6330 fx = fx - vector.x + thingPosition.x;
6331 fy = fy - vector.y + thingPosition.y;
6332 }
6333 else
6334 {
6335 float num2 = (fy = 0f);
6336 fx = num2;
6337 }
6338 }
6339
6340 public void RenderMarker(Point point, bool active, HitResult result, bool main, int dir, bool useCurrentPosition = false)
6341 {
6342 if (dir != -1)
6343 {
6344 this.dir = dir;
6345 }
6346 Vector3 v = point.Position();
6347 bool skipRender = point.cell.skipRender;
6348 if (result != 0 && EClass.screen.guide.isActive && !skipRender)
6349 {
6350 EClass.screen.guide.passGuideBlock.Add(ref v, (point.HasObj || point.HasChara) ? 5 : 0);
6351 }
6352 if (!main)
6353 {
6354 return;
6355 }
6356 RenderParam renderParam = GetRenderParam();
6358 {
6359 renderParam.x = v.x;
6360 renderParam.y = v.y;
6361 renderParam.z = v.z;
6362 EClass.screen.tileMap.SetRoofHeight(renderParam, point.cell, point.x, point.z);
6363 v.x = renderParam.x;
6364 v.y = renderParam.y;
6365 v.z = renderParam.z;
6366 }
6367 else if (TileType.UseMountHeight)
6368 {
6369 TileType.GetMountHeight(ref v, point, this.dir, this);
6370 }
6371 v.z += EClass.setting.render.thingZ;
6372 if (!skipRender)
6373 {
6374 Vector3 thingPosition = EClass.screen.tileMap.GetThingPosition(this, point);
6375 if (freePos)
6376 {
6377 v.x += fx;
6378 v.y += fy;
6379 v.z += thingPosition.z;
6380 }
6381 else
6382 {
6383 v += thingPosition;
6384 }
6385 }
6386 if (useCurrentPosition)
6387 {
6388 v = renderer.position;
6389 v.z += -0.01f;
6390 }
6391 if (TileType == TileType.Door)
6392 {
6393 v.z -= 0.5f;
6394 }
6395 renderParam.matColor = (active ? EClass.Colors.blockColors.Active : EClass.Colors.blockColors.Inactive);
6396 point.ApplyAnime(ref v);
6397 if (renderer.hasActor)
6398 {
6399 renderer.actor.RefreshSprite();
6400 }
6401 renderer.Draw(renderParam, ref v, drawShadow: false);
6402 }
6403
6404 public void RecalculateFOV()
6405 {
6406 if (fov != null)
6407 {
6408 ClearFOV();
6409 fov = null;
6410 if (IsPC)
6411 {
6412 EClass.player.lightRadius = 1;
6413 }
6414 }
6415 CalculateFOV();
6416 }
6417
6418 public bool HasLight()
6419 {
6420 return GetLightRadius() > 0;
6421 }
6422
6423 public float GetLightPower()
6424 {
6425 float num = (isChara ? EClass.scene.profile.light.fovCurveChara.Evaluate(EClass.scene.timeRatio) : EClass.scene.profile.global.fovPower);
6426 if (LightData != null)
6427 {
6428 return 0.01f * LightData.color.a * 256f * 1.12f;
6429 }
6430 if (IsPCFaction && !IsPC)
6431 {
6432 num *= 4f;
6433 }
6434 return num;
6435 }
6436
6437 public int GetHearingRadius()
6438 {
6439 return 8;
6440 }
6441
6442 public int GetSightRadius()
6443 {
6444 if (IsPC)
6445 {
6446 return EClass.player.lightRadius;
6447 }
6448 return (EClass._map.IsIndoor ? 4 : 5) + (IsPCFaction ? 1 : 0) + EvalueMax(490);
6449 }
6450
6451 public int GetLightRadius()
6452 {
6453 if (isThing)
6454 {
6455 if (!IsInstalled && EClass.pc.held != this)
6456 {
6457 return 0;
6458 }
6459 if (trait is TraitLightSource && Thing.isEquipped)
6460 {
6461 return (trait as TraitLightSource).LightRadius;
6462 }
6463 if (LightData == null || !trait.IsLightOn)
6464 {
6465 return 0;
6466 }
6467 return LightData.radius;
6468 }
6469 int num = ((LightData != null) ? LightData.radius : 0);
6470 int num2 = 0;
6471 if (IsPC)
6472 {
6473 if (Chara.isBlind)
6474 {
6475 return 1;
6476 }
6477 num = ((EClass._map.IsIndoor || EClass.world.date.IsNight) ? 2 : ((EClass.world.date.periodOfDay == PeriodOfDay.Day) ? 6 : 5));
6478 num2 = 2;
6479 }
6480 else
6481 {
6483 {
6484 return 0;
6485 }
6486 if (LightData == null && !EClass._map.IsIndoor && !EClass.world.date.IsNight)
6487 {
6488 return 0;
6489 }
6490 }
6491 if (IsPCFaction)
6492 {
6493 Thing equippedThing = Chara.body.GetEquippedThing(45);
6494 if (equippedThing != null && equippedThing.trait is TraitLightSource traitLightSource)
6495 {
6496 num2 = traitLightSource.LightRadius;
6497 }
6498 if (Chara.held != null && IsPC)
6499 {
6500 int lightRadius = Chara.held.GetLightRadius();
6501 if (lightRadius > 0)
6502 {
6503 if (lightRadius > num2)
6504 {
6505 num2 = Chara.held.GetLightRadius() - 1;
6506 }
6507 if (num2 < 3)
6508 {
6509 num2 = 3;
6510 }
6511 }
6512 }
6513 if (num < num2)
6514 {
6515 num = num2;
6516 }
6517 }
6518 return num;
6519 }
6520
6521 public void CalculateFOV()
6522 {
6523 int radius = GetLightRadius();
6524 if (radius == 0 || !IsAliveInCurrentZone || !EClass._zone.isStarted)
6525 {
6526 return;
6527 }
6528 float power = GetLightPower();
6529 if (IsPC)
6530 {
6531 if (Chara.held != null && Chara.held.GetLightRadius() > 0)
6532 {
6533 power += Chara.held.GetLightPower();
6534 }
6535 if (radius <= 2)
6536 {
6537 power = 0f;
6538 }
6539 foreach (Condition condition in Chara.conditions)
6540 {
6541 condition.OnCalculateFov(fov, ref radius, ref power);
6542 }
6543 if (power > EClass.scene.profile.global.playerLightPowerLimit)
6544 {
6545 power = EClass.scene.profile.global.playerLightPowerLimit;
6546 }
6547 power *= EClass.scene.profile.light.playerLightMod + (float)EClass.player.customLightMod * EClass.scene.profile.light.playerLightCustomMod;
6548 radius += EvalueMax(490);
6549 EClass.player.lightRadius = radius;
6550 EClass.player.lightPower = power;
6551 }
6552 if (fov == null)
6553 {
6554 fov = CreateFov();
6555 }
6556 fov.Perform(pos.x, pos.z, radius, power * 2f);
6557 }
6558
6560 {
6561 c_lightColor = (byte)(EClass.rnd(8) + 1) * 1024 + (byte)(EClass.rnd(8) + 1) * 32 + (byte)(EClass.rnd(8) + 1);
6562 }
6563
6565 {
6566 Fov fov = new Fov();
6567 int num = (trait.UseLightColor ? c_lightColor : 0);
6568 if (num != 0)
6569 {
6570 fov.r = (byte)(num / 1024);
6571 fov.g = (byte)(num % 1024 / 32);
6572 fov.b = (byte)(num % 32);
6573 }
6574 else if (LightData != null)
6575 {
6576 fov.r = (byte)(LightData.color.r * 16f);
6577 fov.g = (byte)(LightData.color.g * 16f);
6578 fov.b = (byte)(LightData.color.b * 16f);
6579 }
6580 else if (isChara)
6581 {
6582 fov.r = 0;
6583 fov.g = 0;
6584 fov.b = 0;
6585 }
6586 else
6587 {
6588 fov.r = 3;
6589 fov.g = 2;
6590 fov.b = 1;
6591 }
6592 if (isChara && Chara.held != null && Chara.held.GetLightRadius() > 0)
6593 {
6594 Fov fov2 = Chara.held.CreateFov();
6595 fov.r += fov2.r;
6596 fov.g += fov2.g;
6597 fov.b += fov2.b;
6598 }
6599 if (IsPC)
6600 {
6601 fov.isPC = true;
6602 foreach (Condition condition in Chara.conditions)
6603 {
6604 condition.OnCreateFov(fov);
6605 }
6606 }
6607 fov.limitGradient = IsPCParty && EClass.scene.profile.global.limitGradient;
6608 return fov;
6609 }
6610
6611 public void ClearFOV()
6612 {
6613 if (fov != null && fov.lastPoints.Count != 0)
6614 {
6615 fov.Perform(pos.x, pos.z, 0);
6616 }
6617 }
6618
6619 public virtual void OnSimulateHour(VirtualDate date)
6620 {
6621 trait.OnSimulateHour(date);
6622 if (date.IsRealTime)
6623 {
6624 DecayNatural();
6625 }
6626 }
6627
6628 public void DecayNatural(int hour = 1)
6629 {
6630 if (!isNPCProperty)
6631 {
6632 things.ForeachReverse(delegate(Thing t)
6633 {
6634 t.DecayNatural(hour);
6635 });
6636 if (sourceCard._origin == "dish")
6637 {
6638 CheckJustCooked();
6639 }
6640 if (parent is Card && (parent as Card).trait.CanChildDecay(this))
6641 {
6642 Decay(10 * hour);
6643 }
6644 else if (!isChara && trait.Decay != 0)
6645 {
6646 Decay(trait.Decay * hour);
6647 }
6648 }
6649 }
6650
6651 public void CheckJustCooked()
6652 {
6653 if (HasElement(757) && c_dateCooked <= EClass.world.date.GetRaw() - 120)
6654 {
6655 c_dateCooked = 0;
6656 elements.Remove(757);
6657 }
6658 }
6659
6660 public void Decay(int a = 10)
6661 {
6662 Card card = parent as Card;
6663 int num = 200;
6664 int num2 = MaxDecay / 4 * 3;
6665 if (a > 0)
6666 {
6667 if (card != null)
6668 {
6669 num = card.trait.DecaySpeedChild;
6670 }
6671 num = num * trait.DecaySpeed / 100;
6672 int num3 = Evalue(405);
6673 if (num3 != 0)
6674 {
6675 num = num * (100 - num3 * 2) / 100;
6676 }
6677 if (num < 0)
6678 {
6679 num = 0;
6680 }
6681 }
6682 else
6683 {
6684 num = 100;
6685 }
6686 a = a * num / 100;
6687 if (decay + a > MaxDecay)
6688 {
6689 if (card != null && !card.trait.OnChildDecay(this, !IsDecayed))
6690 {
6691 return;
6692 }
6693 if (!IsDecayed)
6694 {
6695 if (EClass.pc.HasElement(1325) && GetRootCard() is Chara && category.IsChildOf("food"))
6696 {
6697 Thing thing = TraitSeed.MakeRandomSeed(enc: true).SetNum(Mathf.Min(Num, 3));
6698 card.AddCard(thing);
6699 if (!IsParentLocked())
6700 {
6701 GetRootCard().Say("seed_rot", GetRootCard(), this, thing.Name);
6702 }
6703 Destroy();
6704 return;
6705 }
6706 if (parent == EClass._zone)
6707 {
6708 Say("rot", this);
6709 }
6710 else if (GetRootCard() == EClass.pc)
6711 {
6712 if (!IsParentLocked())
6713 {
6714 EClass.pc.Say("rotInv", this, EClass.pc);
6715 }
6717 }
6718 if (IsFood)
6719 {
6720 elements.ModBase(73, -10);
6721 }
6722 }
6723 }
6724 else if (decay < num2 && decay + a >= num2 && GetRootCard() == EClass.pc)
6725 {
6726 if (!IsParentLocked())
6727 {
6728 EClass.pc.Say("rottingInv", this, EClass.pc);
6729 }
6731 }
6732 decay += a;
6733 bool IsParentLocked()
6734 {
6735 if (parent is Thing)
6736 {
6737 return (parent as Thing).c_lockLv > 0;
6738 }
6739 return false;
6740 }
6741 }
6742
6743 public bool HasTalk(string idTopic)
6744 {
6745 return !MOD.listTalk.GetTalk(c_idTalk.IsEmpty(id), idTopic, useDefault: true).IsEmpty();
6746 }
6747
6748 public void Talk(string idTopic, string ref1 = null, string ref2 = null, bool forceSync = false)
6749 {
6750 if (IsPC && !EClass.player.forceTalk && idTopic != "goodBoy" && idTopic != "insane")
6751 {
6752 EClass.player.forceTalk = false;
6753 Msg.SetColor();
6754 return;
6755 }
6756 EClass.player.forceTalk = false;
6757 if (!isSynced && !forceSync)
6758 {
6759 Msg.SetColor();
6760 return;
6761 }
6762 GameLang.refDrama1 = ref1;
6763 GameLang.refDrama2 = ref2;
6764 string text = GetTalkText(idTopic, stripPun: true);
6765 if (HasElement(1232) && idTopic != "baby")
6766 {
6767 BackerContent.GakiConvert(ref text, "babu");
6768 }
6769 else
6770 {
6771 string text2 = id;
6772 if (!(text2 == "adv_gaki"))
6773 {
6774 if (text2 == "corgon")
6775 {
6776 BackerContent.GakiConvert(ref text, "mokyu");
6777 }
6778 }
6779 else
6780 {
6781 BackerContent.GakiConvert(ref text);
6782 }
6783 }
6784 TalkRaw(text, ref1, ref2, forceSync);
6785 }
6786
6787 public void TalkRaw(string text, string ref1 = null, string ref2 = null, bool forceSync = false)
6788 {
6789 if ((!isSynced && !forceSync) || text.IsEmpty())
6790 {
6791 Msg.SetColor();
6792 return;
6793 }
6794 if (ref1 != null)
6795 {
6796 text = text.Replace("#1", ref1);
6797 }
6798 if (ref2 != null)
6799 {
6800 text = text.Replace("#2", ref2);
6801 }
6802 HostRenderer.Say(ApplyNewLine(text));
6803 text = StripTalkSpeiclaCharacters(text);
6804 bool flag = text.StartsWith("*");
6805 Msg.SetColor(text.StartsWith("(") ? Msg.colors.Thinking : (flag ? Msg.colors.Ono : Msg.colors.Talk));
6806 if (!flag)
6807 {
6808 text = text.Bracket();
6809 }
6810 Msg.Say(text.Replace("&", ""));
6811 }
6812
6813 public string StripTalkSpeiclaCharacters(string text)
6814 {
6815 switch (text[0])
6816 {
6817 case '@':
6818 {
6819 if (text.Length > 1 && int.TryParse(text[1].ToString() ?? "", out var _))
6820 {
6821 return text.Substring(2);
6822 }
6823 break;
6824 }
6825 case '^':
6826 case '|':
6827 return text.Substring(1);
6828 }
6829 return text;
6830 }
6831
6832 public string ApplyNewLine(string text)
6833 {
6834 if (text.Contains("&"))
6835 {
6836 string text2 = "_comma".lang();
6837 text = text.Replace(text2 + " &", Environment.NewLine ?? "");
6838 text = text.Replace(text2 + "&", Environment.NewLine ?? "");
6839 text = text.Replace("&", Environment.NewLine ?? "");
6840 }
6841 return text;
6842 }
6843
6844 public void SayRaw(string text, string ref1 = null, string ref2 = null)
6845 {
6846 if (isSynced && !text.IsEmpty())
6847 {
6848 if (ref1 != null)
6849 {
6850 text = text.Replace("#1", ref1);
6851 }
6852 if (ref2 != null)
6853 {
6854 text = text.Replace("#2", ref2);
6855 }
6856 HostRenderer.Say(text);
6857 }
6858 }
6859
6860 public void SayNothingHappans()
6861 {
6862 Say("nothingHappens");
6863 }
6864
6865 public void Say(string lang, string ref1 = null, string ref2 = null)
6866 {
6867 if (ShouldShowMsg)
6868 {
6869 Msg.Say(IsPC ? Lang.Game.TryGetId(lang + "_pc", lang) : lang, ref1, ref2);
6870 }
6871 Msg.SetColor();
6872 }
6873
6874 public void Say(string lang, Card c1, Card c2, string ref1 = null, string ref2 = null)
6875 {
6876 if (ShouldShowMsg)
6877 {
6878 Msg.Say(IsPC ? Lang.Game.TryGetId(lang + "_pc", lang) : lang, c1, c2, ref1, ref2);
6879 }
6880 Msg.SetColor();
6881 }
6882
6883 public void Say(string lang, Card c1, string ref1 = null, string ref2 = null)
6884 {
6885 if (ShouldShowMsg)
6886 {
6887 Msg.Say(IsPC ? Lang.Game.TryGetId(lang + "_pc", lang) : lang, c1, ref1, ref2);
6888 }
6889 Msg.SetColor();
6890 }
6891
6892 public string GetTalkText(string idTopic, bool stripPun = false, bool useDefault = true)
6893 {
6894 bool flag = isChara && Chara.IsHumanSpeak;
6895 string text = MOD.listTalk.GetTalk(c_idTalk.IsEmpty(id), idTopic, useDefault, flag);
6896 if (!text.IsEmpty())
6897 {
6898 text = text.Split('|').RandomItem();
6899 if (!flag || (IsDeadOrSleeping && IsAliveInCurrentZone))
6900 {
6901 if (!text.StartsWith("(") && !text.StartsWith("*"))
6902 {
6903 text = "(" + text + ")";
6904 }
6905 text = text.Replace("。)", ")");
6906 }
6907 }
6908 return ApplyTone(text, stripPun);
6909 }
6910
6911 public string ApplyTone(string text, bool stripPun = false)
6912 {
6913 text = GameLang.ConvertDrama(text, Chara);
6914 return ApplyTone(Chara, ref text, c_idTone, bio?.gender ?? 0, stripPun);
6915 }
6916
6917 public static string ApplyTone(Chara c, ref string text, string _tones, int gender, bool stripPun = false)
6918 {
6919 if (text.IsEmpty())
6920 {
6921 return text;
6922 }
6923 string[] array = _tones.IsEmpty("").Split('|');
6924 string key = array[0];
6925 string text2 = "";
6927 if (!Lang.setting.useTone || MOD.tones.list.Count == 0)
6928 {
6929 text2 = text.Replace("{", "").Replace("}", "");
6930 }
6931 else
6932 {
6933 if (array[0].IsEmpty())
6934 {
6935 key = "default";
6936 }
6937 if (MOD.tones.all.ContainsKey(key))
6938 {
6939 StringBuilder stringBuilder = MOD.tones.ApplyTone(key, ref text, gender);
6940 if (Lang.isJP && c != null)
6941 {
6942 if (array.Length >= 2)
6943 {
6944 stringBuilder.Replace("_toneI".lang(), array[1]);
6945 }
6946 if (array.Length >= 3)
6947 {
6948 stringBuilder.Replace("_toneYou".lang(), array[2]);
6949 }
6950 }
6951 text2 = stringBuilder.ToString();
6952 }
6953 else
6954 {
6955 text2 = text.Replace("{", "").Replace("}", "");
6956 }
6957 }
6958 if (c != null)
6959 {
6960 text2 = text2.Replace("#me", c.NameSimple);
6961 }
6962 if (!stripPun || !Lang.setting.stripPuns)
6963 {
6964 return text2;
6965 }
6966 return text2.StripLastPun();
6967 }
6968
6969 public void SetRandomTalk()
6970 {
6972 if (!MOD.listTalk.list[0].ContainsKey(id))
6973 {
6974 c_idTalk = MOD.listTalk.GetRandomID("human");
6975 }
6976 }
6977
6978 public void SetRandomTone()
6979 {
6981 List<Dictionary<string, string>> list = MOD.tones.list;
6982 if (list.Count != 0)
6983 {
6984 int mtp = EClass.core.config.test.extraToneMTP switch
6985 {
6986 4 => 10,
6987 3 => 5,
6988 2 => 2,
6989 1 => 1,
6990 0 => 0,
6991 _ => 0,
6992 };
6993 if (EClass.debug.enable)
6994 {
6995 mtp *= 100;
6996 }
6997 string text = list.RandomItem()["id"];
6998 text = list.RandomItemWeighted((Dictionary<string, string> a) => a["chance"].ToInt() * ((!a["tag"].Contains("meta")) ? 1 : mtp))["id"];
6999 c_idTone = MOD.tones.GetToneID(text, bio?.gender ?? 0);
7000 }
7001 }
7002
7004 {
7005 return ListCraftBonusTraits().Count > 0;
7006 }
7007
7008 public List<Element> ListCraftBonusTraits()
7009 {
7010 List<Element> list = new List<Element>();
7011 string[] tag = sourceCard.tag;
7012 for (int i = 0; i < tag.Length; i++)
7013 {
7014 string[] array = tag[i].Split('/');
7015 if (!(array[0] != "craft_bonus"))
7016 {
7017 Element item = Element.Create(array[1], array[2].ToInt());
7018 list.Add(item);
7019 }
7020 }
7021 return list;
7022 }
7023
7024 public void TryStack(Thing t)
7025 {
7026 if (t == this)
7027 {
7028 return;
7029 }
7030 ThingContainer.DestData dest = things.GetDest(t);
7031 if (dest.stack != null)
7032 {
7033 if (IsPC)
7034 {
7035 Say("stack_thing", t, dest.stack);
7036 }
7037 t.TryStackTo(dest.stack);
7038 }
7039 }
7040
7041 public void ApplyBacker(int bid)
7042 {
7043 ChangeRarity(Rarity.Normal);
7044 SourceBacker.Row row = EClass.sources.backers.map.TryGetValue(bid);
7045 if (row == null)
7046 {
7047 return;
7048 }
7049 c_idBacker = row.id;
7050 if (row.type == 4)
7051 {
7053 Chara chara = Chara;
7054 Hostility hostility2 = (Chara.c_originalHostility = Hostility.Neutral);
7055 chara.hostility = hostility2;
7056 }
7057 if (row.type == 6)
7058 {
7061 Chara.idFaith = row.deity.ToLowerInvariant();
7062 }
7063 if (row.type == 4 || row.type == 5 || row.type == 7)
7064 {
7065 idSkin = ((row.skin == 0) ? EClass.rnd(sourceCard._tiles.Length) : row.skin);
7066 if (id == "putty_snow")
7067 {
7068 idSkin = 0;
7069 }
7070 }
7071 if (bid == 164)
7072 {
7073 Chara.EQ_ID("amulet_moonnight");
7074 }
7075 }
7076
7077 public void RemoveBacker()
7078 {
7079 if (c_idBacker == 164)
7080 {
7081 Chara.things.Find("amulet_moonnight")?.Destroy();
7082 }
7083 c_idBacker = 0;
7084 }
7085
7086 public void SetPaintData()
7087 {
7088 EClass.ui.Hide(0f);
7090 {
7091 ClearPaintSprite();
7092 c_textureData = GetPaintData();
7094 {
7095 EClass.ui.Show(0f);
7096 });
7097 });
7098 }
7099
7100 public byte[] GetPaintData()
7101 {
7102 Sprite sprite = GetSprite();
7103 Texture2D texture2D = ScreenCapture.CaptureScreenshotAsTexture();
7104 int num = sprite.texture.width * 2;
7105 int num2 = sprite.texture.height * 2;
7106 int x = (int)Mathf.Clamp(Input.mousePosition.x - (float)(num / 2), 1f, texture2D.width - num - 1);
7107 int y = (int)Mathf.Clamp(Input.mousePosition.y - (float)(num2 / 2), 1f, texture2D.height - num2 - 1);
7108 Color[] pixels = texture2D.GetPixels(x, y, num, num2);
7109 Texture2D texture2D2 = new Texture2D(num, num2, TextureFormat.ARGB32, mipChain: false);
7110 texture2D2.SetPixels(pixels);
7111 texture2D2.Apply();
7112 byte[] result = texture2D2.EncodeToJPG();
7113 UnityEngine.Object.Destroy(texture2D);
7114 UnityEngine.Object.Destroy(texture2D2);
7115 return result;
7116 }
7117
7118 public void ClearPaintSprite()
7119 {
7120 if ((bool)_paintSprite)
7121 {
7122 UnityEngine.Object.Destroy(_paintSprite.texture);
7123 UnityEngine.Object.Destroy(_paintSprite);
7124 _paintSprite = null;
7125 }
7126 }
7127
7128 public Sprite GetPaintSprite()
7129 {
7130 if (!_paintSprite)
7131 {
7132 byte[] data = c_textureData;
7133 Texture2D texture2D = new Texture2D(1, 1);
7134 texture2D.LoadImage(data);
7135 _paintSprite = Sprite.Create(texture2D, new Rect(0f, 0f, texture2D.width, texture2D.height), new Vector2(0.5f, 0.5f), 200f);
7136 EClass.game.loadedTextures.Add(texture2D);
7137 if (trait is TraitCanvas traitCanvas)
7138 {
7139 texture2D.filterMode = ((!traitCanvas.PointFilter) ? FilterMode.Bilinear : FilterMode.Point);
7140 }
7141 }
7142 return _paintSprite;
7143 }
7144
7145 public void TryUnrestrain(bool force = false, Chara c = null)
7146 {
7147 if (!(GetRestrainer() == null || force))
7148 {
7149 return;
7150 }
7151 isRestrained = false;
7152 Say("unrestrained", this);
7153 if (this != c)
7154 {
7155 Talk("thanks");
7156 }
7157 MoveImmediate(pos.GetNearestPoint());
7158 renderer.SetFirst(first: true);
7159 if (c == null)
7160 {
7161 return;
7162 }
7163 if (c_rescueState == RescueState.WaitingForRescue)
7164 {
7165 c_rescueState = RescueState.Rescued;
7166 if (c.IsPC)
7167 {
7169 }
7170 }
7172 {
7173 return;
7174 }
7175 foreach (Chara item in c.pos.ListCharasInRadius(c, 5, (Chara _c) => _c.id == "fanatic" && _c.faith != Chara.faith))
7176 {
7177 c.DoHostileAction(item, immediate: true);
7178 }
7179 }
7180
7182 {
7183 foreach (Card item in pos.ListCards())
7184 {
7185 if (item.trait is TraitShackle && item.c_uidRefCard == uid)
7186 {
7187 return item.trait as TraitShackle;
7188 }
7189 }
7190 return null;
7191 }
7192
7193 public virtual void Tick()
7194 {
7195 }
7196
7197 public static int GetTilePrice(TileRow row, SourceMaterial.Row mat)
7198 {
7199 int result = 0;
7200 if (row.id == 0)
7201 {
7202 return result;
7203 }
7204 result = row.value * mat.value / 100;
7205 if (result < 0)
7206 {
7207 result = 1;
7208 }
7209 return result;
7210 }
7211
7212 public Thing SetPriceFix(int a)
7213 {
7214 c_priceFix = a;
7215 return Thing;
7216 }
7217
7218 public int GetEquipValue()
7219 {
7220 return GetValue();
7221 }
7222
7223 public void SetSale(bool sale)
7224 {
7225 if (isSale != sale)
7226 {
7227 isSale = sale;
7228 if (isSale)
7229 {
7230 EClass._map.props.sales.Add(this);
7231 }
7232 else
7233 {
7234 EClass._map.props.sales.Remove(this);
7235 }
7236 }
7237 }
7238
7239 public int GetValue(PriceType priceType = PriceType.Default, bool sell = false)
7240 {
7241 int num = ((c_fixedValue == 0) ? trait.GetValue() : c_fixedValue);
7242 if (id == "plat" && !sell)
7243 {
7244 num = 10000;
7245 }
7246 if (num == 0)
7247 {
7248 return 0;
7249 }
7250 float num2 = num;
7251 if (priceType == PriceType.CopyShop)
7252 {
7253 num2 += (float)c_priceCopy * 0.2f;
7254 num2 = num2 * (float)Mathf.Max(150 + rarityLv, 150) / 100f;
7255 }
7256 else
7257 {
7258 num2 = num2 * (float)Mathf.Max(100 + rarityLv + Mathf.Min(QualityLv * 10, 200), 80) / 100f;
7259 }
7260 if (IsFood && !material.tag.Contains("food"))
7261 {
7262 num2 *= 0.5f;
7263 }
7264 float num3;
7265 if (IsEquipmentOrRangedOrAmmo || trait is TraitMod)
7266 {
7267 if (sell)
7268 {
7269 num2 *= 0.3f;
7270 }
7271 num3 = 2f;
7272 }
7273 else
7274 {
7275 num3 = 0.5f;
7276 }
7277 if (isReplica)
7278 {
7279 num2 *= 0.15f;
7280 }
7281 if (!IsUnique)
7282 {
7283 if (IsEquipmentOrRanged && rarity >= Rarity.Legendary)
7284 {
7285 num2 = Mathf.Max(num2, 1800f + num2 / 5f);
7286 }
7287 num2 = num2 * (100f + num3 * (float)(material.value - 100)) / 100f;
7288 if (IsEquipmentOrRanged)
7289 {
7290 int num4 = 0;
7291 foreach (Element value in elements.dict.Values)
7292 {
7293 num4 += value.source.value;
7294 }
7295 num2 = num2 * (float)(100 + (sell ? ((int)MathF.Sqrt(num4) * 10) : num4)) / 100f;
7296 if (rarity >= Rarity.Legendary)
7297 {
7298 num2 = Mathf.Max(num2, 3600f + num2 / 5f);
7299 }
7300 }
7301 }
7302 if (trait is TraitRecipe && sell)
7303 {
7304 num2 *= 0.1f;
7305 }
7306 if (encLV != 0 && !category.tag.Contains("noEnc"))
7307 {
7308 num2 = (category.tag.Contains("enc") ? (num2 * (0.7f + (float)(encLV - 1) * 0.2f)) : ((!IsFood) ? (num2 * (1f + (float)encLV * 0.01f)) : ((!(id == "honey")) ? (num2 * Mathf.Min(1f + 0.1f * (float)encLV, 2f) + (float)(encLV * 100)) : (num2 + (float)(encLV * 10)))));
7309 }
7310 if (tier > 0)
7311 {
7312 num2 *= (float)(tier + 1);
7313 }
7314 return (int)num2;
7315 }
7316
7317 public virtual int GetPrice(CurrencyType currency = CurrencyType.Money, bool sell = false, PriceType priceType = PriceType.Default, Chara c = null)
7318 {
7319 if (priceType == PriceType.CopyShop && sell)
7320 {
7321 return 0;
7322 }
7323 if (!sell)
7324 {
7325 if (id == "littleball")
7326 {
7327 return 0;
7328 }
7329 switch (currency)
7330 {
7331 case CurrencyType.Money:
7332 if (id == "crimale2")
7333 {
7334 return 6480;
7335 }
7336 break;
7337 case CurrencyType.Influence:
7338 switch (id)
7339 {
7340 case "ticket_fortune":
7341 return 5;
7342 case "medal":
7343 return 5;
7344 case "lunch_love":
7345 return 20;
7346 }
7347 break;
7348 case CurrencyType.Ecopo:
7349 switch (id)
7350 {
7351 case "plat":
7352 return 500;
7353 case "rune_free":
7354 return 1000;
7355 case "whip_egg":
7356 return 3000;
7357 case "brush_strip":
7358 return 2500;
7359 case "hammer_strip":
7360 return 5000;
7361 case "helm_chef":
7362 return 25000;
7363 }
7364 break;
7365 case CurrencyType.Plat:
7366 switch (id)
7367 {
7368 case "lucky_coin":
7369 return 100;
7370 case "book_exp":
7371 return 200;
7372 case "book_skill":
7373 return 50;
7374 }
7375 break;
7376 case CurrencyType.Medal:
7377 switch (id)
7378 {
7379 case "1282":
7380 return 5;
7381 case "bill_tax":
7382 return 3;
7383 case "water":
7384 return 3;
7385 case "bill":
7386 return 3;
7387 case "1165":
7388 return 10;
7389 case "diary_sister":
7390 return 12;
7391 case "diary_lady":
7392 return 25;
7393 case "diary_catsister":
7394 return 85;
7395 case "container_magic":
7396 return 20;
7397 case "wrench_tent_elec":
7398 return 3;
7399 case "wrench_tent_soil":
7400 return 3;
7401 case "wrench_tent_seabed":
7402 return 12;
7403 case "wrench_bed":
7404 return 3;
7405 case "wrench_storage":
7406 return 4;
7407 case "wrench_fridge":
7408 return 15;
7409 case "wrench_extend_v":
7410 return 6;
7411 case "wrench_extend_h":
7412 return 6;
7413 case "monsterball":
7414 return LV / 8;
7415 case "372":
7416 return 3;
7417 case "scroll_random":
7418 if (refVal == 8288)
7419 {
7420 return 20;
7421 }
7422 break;
7423 }
7424 break;
7425 }
7426 }
7427 if (sell && noSell)
7428 {
7429 return 0;
7430 }
7431 if (!sell && id == "casino_coin")
7432 {
7433 return 20;
7434 }
7435 int value = GetValue(priceType, sell);
7436 if (value == 0)
7437 {
7438 return 0;
7439 }
7440 if (c == null)
7441 {
7442 c = EClass.pc;
7443 }
7444 double p = value;
7445 Trait trait = this.trait;
7446 if (!(trait is TraitBed))
7447 {
7448 if (trait is TraitContainer traitContainer)
7449 {
7450 p *= 1f + 4f * (float)(things.width - traitContainer.Width) + 4f * (float)(things.height - traitContainer.Height);
7451 }
7452 }
7453 else
7454 {
7455 p *= 1f + 0.5f * (float)c_containerSize;
7456 }
7457 p += c_priceAdd;
7458 if (c_priceFix != 0)
7459 {
7460 p = (int)((float)p * (float)Mathf.Clamp(100 + c_priceFix, 0, 1000000) / 100f);
7461 if (p == 0.0)
7462 {
7463 return 0;
7464 }
7465 }
7466 if (isStolen)
7467 {
7468 if (sell && priceType == PriceType.PlayerShop && EClass.Branch != null && EClass.Branch.policies.IsActive(2824))
7469 {
7470 p = p * 100.0 / (double)Mathf.Max(110f, 170f - Mathf.Sqrt(EClass.Branch.Evalue(2824) * 5));
7471 }
7472 else if (sell && Guild.Thief.IsMember)
7473 {
7474 p = Guild.Thief.SellStolenPrice((int)p);
7475 }
7476 else
7477 {
7478 p *= 0.5;
7479 }
7480 }
7481 if (!sell && category.id == "spellbook")
7482 {
7483 p = Guild.Mage.BuySpellbookPrice((int)p);
7484 }
7485 bool flag = priceType == PriceType.CopyShop;
7486 int num = ((!flag) ? 1 : 5);
7487 float num2 = Mathf.Min(0.01f * (float)Evalue(752), 1f);
7488 float num3 = Mathf.Min(0.01f * (float)Evalue(751), 1f);
7489 float num4 = Mathf.Min(0.02f * (float)Evalue(759), 2f);
7490 if (num3 > 0f)
7491 {
7492 num3 *= (float)num;
7493 }
7494 float num5 = Mathf.Clamp(1f + num2 + num3, 0.5f, 5f) + num4;
7495 p *= num5;
7496 p *= 0.20000000298023224;
7497 if (sell)
7498 {
7499 p *= 0.20000000298023224;
7500 if (isCopy)
7501 {
7502 p *= 0.20000000298023224;
7503 }
7504 if (isReplica)
7505 {
7506 p *= 0.20000000298023224;
7507 }
7508 if (currency == CurrencyType.Money && (category.IsChildOf("meal") || category.IsChildOf("preserved")))
7509 {
7510 p *= 0.5;
7511 }
7512 if ((uint)(priceType - 1) <= 1u)
7513 {
7514 if (category.IsChildOf("fish"))
7515 {
7516 p *= ((EClass.pc.faith == EClass.game.religions.Luck) ? 1.5f : 1f);
7517 }
7518 if (category.IsChildOf("vegi") || category.IsChildOf("fruit"))
7519 {
7520 p *= ((EClass.pc.faith == EClass.game.religions.Harvest) ? 3f : 2f);
7521 }
7522 }
7523 }
7524 if (id == "rod_wish")
7525 {
7526 p *= (sell ? 0.01f : 50f);
7527 }
7528 switch (currency)
7529 {
7530 case CurrencyType.Ecopo:
7531 if (this.trait is TraitSeed)
7532 {
7533 p *= 2.0;
7534 }
7535 else if (this.trait is TraitEcoMark)
7536 {
7537 p *= 1.0;
7538 }
7539 else
7540 {
7541 p *= 0.20000000298023224;
7542 }
7543 break;
7544 case CurrencyType.Casino_coin:
7545 p *= 0.10000000149011612;
7546 break;
7547 case CurrencyType.Influence:
7548 p *= 0.0020000000949949026;
7549 break;
7550 case CurrencyType.Medal:
7551 p *= 0.00019999999494757503;
7552 break;
7553 case CurrencyType.Money2:
7554 p *= 0.004999999888241291;
7555 break;
7556 default:
7557 if (IsIdentified || (this.trait is TraitErohon && !sell) || priceType == PriceType.Tourism)
7558 {
7559 if (blessedState == BlessedState.Blessed)
7560 {
7561 p *= 1.25;
7562 }
7563 else if (blessedState <= BlessedState.Cursed)
7564 {
7565 p *= (flag ? 1.25f : 0.3f);
7566 }
7567 if (this.trait.HasCharges)
7568 {
7569 p = p * 0.05000000074505806 + p * (double)(0.5f + Mathf.Clamp(0.1f * (float)c_charges, 0f, 1.5f));
7570 }
7571 if (IsDecayed)
7572 {
7573 p *= (flag ? 0.9f : 0.5f);
7574 }
7575 }
7576 else
7577 {
7578 Rand.UseSeed(uid, delegate
7579 {
7580 p = (sell ? (1 + EClass.rnd(15)) : (50 + EClass.rnd(500)));
7581 });
7582 }
7583 if (!sell)
7584 {
7585 p *= 1f + 0.2f * (float)c.Evalue(1406);
7586 }
7587 break;
7588 }
7589 float num6 = Math.Clamp(Mathf.Sqrt(c.EvalueMax(291) + ((!sell && EClass._zone.IsPCFaction) ? (EClass.Branch.Evalue(2800) * 2) : 0)), 0f, 25f);
7590 switch (priceType)
7591 {
7592 case PriceType.Tourism:
7593 num6 = 0f;
7594 break;
7595 case PriceType.Shipping:
7596 if (sell)
7597 {
7598 p *= 1.100000023841858;
7599 }
7600 break;
7601 case PriceType.PlayerShop:
7602 {
7603 if (!sell)
7604 {
7605 break;
7606 }
7607 float num7 = 1.25f;
7608 if (EClass.Branch != null)
7609 {
7610 if (EClass.Branch.policies.IsActive(2817))
7611 {
7612 num7 += 0.1f + 0.01f * Mathf.Sqrt(EClass.Branch.Evalue(2817));
7613 }
7614 if (EClass.Branch.policies.IsActive(2816))
7615 {
7616 num7 += 0.2f + 0.02f * Mathf.Sqrt(EClass.Branch.Evalue(2816));
7617 }
7618 if (isChara)
7619 {
7620 if (EClass.Branch.policies.IsActive(2828))
7621 {
7622 num7 += 0.1f + 0.01f * Mathf.Sqrt(EClass.Branch.Evalue(2828));
7623 }
7624 }
7625 else if (category.IsChildOf("food") || category.IsChildOf("drink"))
7626 {
7627 if (EClass.Branch.policies.IsActive(2818))
7628 {
7629 num7 += 0.05f + 0.005f * Mathf.Sqrt(EClass.Branch.Evalue(2818));
7630 }
7631 }
7632 else if (category.IsChildOf("furniture"))
7633 {
7634 if (EClass.Branch.policies.IsActive(2819))
7635 {
7636 num7 += 0.05f + 0.005f * Mathf.Sqrt(EClass.Branch.Evalue(2819));
7637 }
7638 }
7639 else if (EClass.Branch.policies.IsActive(2820))
7640 {
7641 num7 += 0.05f + 0.005f * Mathf.Sqrt(EClass.Branch.Evalue(2820));
7642 }
7643 }
7644 p *= num7;
7645 break;
7646 }
7647 }
7648 if ((uint)currency > 1u)
7649 {
7650 num6 = 0f;
7651 }
7652 p *= (sell ? (1f + num6 * 0.02f) : (1f - num6 * 0.02f));
7653 if (sell)
7654 {
7655 p = EClass.curve((int)p, 10000, 10000, 80);
7656 }
7657 if (p < 1.0)
7658 {
7659 p = ((!sell) ? 1 : 0);
7660 }
7661 if (!sell)
7662 {
7663 if (currency == CurrencyType.Casino_coin)
7664 {
7665 if (p > 100000.0)
7666 {
7667 p = Mathf.CeilToInt((float)p / 100000f) * 100000;
7668 }
7669 else if (p > 10000.0)
7670 {
7671 p = Mathf.CeilToInt((float)p / 10000f) * 10000;
7672 }
7673 else if (p > 1000.0)
7674 {
7675 p = Mathf.CeilToInt((float)p / 1000f) * 1000;
7676 }
7677 else if (p > 100.0)
7678 {
7679 p = Mathf.CeilToInt((float)p / 100f) * 100;
7680 }
7681 else if (p > 10.0)
7682 {
7683 p = Mathf.CeilToInt((float)p / 10f) * 10;
7684 }
7685 }
7686 if (this.trait is TraitDeed)
7687 {
7688 p *= Mathf.Pow(2f, EClass.player.flags.landDeedBought);
7689 }
7690 }
7691 if (p > (double)(sell ? 500000000 : 1000000000))
7692 {
7693 if (!sell)
7694 {
7695 return 1000000000;
7696 }
7697 return 500000000;
7698 }
7699 return (int)p;
7700 }
7701
7702 public virtual string GetHoverText()
7703 {
7704 return Name + GetExtraName();
7705 }
7706
7707 public virtual string GetHoverText2()
7708 {
7709 return "";
7710 }
7711
7712 public int Dist(Card c)
7713 {
7714 if (!IsMultisize && !c.IsMultisize)
7715 {
7716 return pos.Distance(c.pos);
7717 }
7718 if (IsMultisize)
7719 {
7720 int dist = 99;
7721 ForeachPoint(delegate(Point p, bool main)
7722 {
7723 int num2 = DistMulti(p, c);
7724 if (num2 < dist)
7725 {
7726 dist = num2;
7727 }
7728 });
7729 return dist;
7730 }
7731 return DistMulti(pos, c);
7732 static int DistMulti(Point p1, Card c)
7733 {
7734 if (!c.IsMultisize)
7735 {
7736 return p1.Distance(c.pos);
7737 }
7738 int dist2 = 99;
7739 c.ForeachPoint(delegate(Point p, bool main)
7740 {
7741 int num = p1.Distance(p);
7742 if (num < dist2)
7743 {
7744 dist2 = num;
7745 }
7746 });
7747 return dist2;
7748 }
7749 }
7750
7751 public int Dist(Point p)
7752 {
7753 return pos.Distance(p);
7754 }
7755
7756 public bool IsInMutterDistance(int d = 10)
7757 {
7758 return pos.Distance(EClass.pc.pos) < d;
7759 }
7760
7761 public void SetCensored(bool enable)
7762 {
7763 isCensored = enable;
7765 {
7766 isCensored = false;
7767 }
7768 renderer.SetCensored(isCensored);
7769 }
7770
7771 public void SetDeconstruct(bool deconstruct)
7772 {
7773 if (isDeconstructing != deconstruct)
7774 {
7775 if (deconstruct)
7776 {
7777 EClass._map.props.deconstructing.Add(this);
7778 }
7779 else
7780 {
7781 EClass._map.props.deconstructing.Remove(this);
7782 }
7783 isDeconstructing = deconstruct;
7784 }
7785 }
7786
7787 public virtual bool MatchEncSearch(string s)
7788 {
7789 return false;
7790 }
7791
7793 {
7794 switch (m)
7795 {
7796 case UIList.SortMode.ByEquip:
7797 sortVal = ((c_equippedSlot == 0) ? (category.sortVal * 1000) : 0);
7798 break;
7799 case UIList.SortMode.ByValue:
7800 sortVal = -GetPrice(currency) * 1000;
7801 break;
7802 case UIList.SortMode.ByNumber:
7803 sortVal = -Num * 1000;
7804 break;
7805 case UIList.SortMode.ByCategory:
7806 sortVal = category.sortVal * 1000;
7807 break;
7808 case UIList.SortMode.ByWeight:
7809 sortVal = -ChildrenAndSelfWeight * 1000;
7810 break;
7811 case UIList.SortMode.ByWeightSingle:
7812 sortVal = -ChildrenAndSelfWeightSingle * 1000;
7813 break;
7814 case UIList.SortMode.ByPrice:
7815 sortVal = -GetPrice(currency) * 1000;
7816 break;
7817 default:
7818 sortVal = sourceCard._index * 1000;
7819 break;
7820 }
7821 }
7822
7823 public virtual int SecondaryCompare(UIList.SortMode m, Card c)
7824 {
7825 int num = 0;
7826 if (num == 0)
7827 {
7828 num = id.CompareTo(c.id);
7829 }
7830 if (num == 0)
7831 {
7832 num = trait.CompareTo(c);
7833 }
7834 if (num == 0)
7835 {
7836 num = Lang.comparer.Compare(GetName(NameStyle.Full, 1), c.GetName(NameStyle.Full, 1));
7837 }
7838 if (num == 0)
7839 {
7840 num = refVal - c.refVal;
7841 }
7842 if (num == 0)
7843 {
7844 num = c_charges - c.c_charges;
7845 }
7846 if (num == 0)
7847 {
7848 num = encLV - c.encLV;
7849 }
7850 if (num == 0)
7851 {
7852 num = Num - c.Num;
7853 }
7854 if (num == 0)
7855 {
7856 num = uid - c.uid;
7857 }
7858 return num;
7859 }
7860
7861 public void ForeachFOV(Func<Point, bool> func)
7862 {
7863 if (fov == null)
7864 {
7865 return;
7866 }
7867 foreach (KeyValuePair<int, byte> lastPoint in fov.lastPoints)
7868 {
7869 Point arg = new Point().Set(lastPoint.Key);
7870 if (func(arg))
7871 {
7872 break;
7873 }
7874 }
7875 }
7876
7877 public void ForeachPoint(Action<Point, bool> action)
7878 {
7879 if (IsMultisize)
7880 {
7881 pos.ForeachMultiSize(W, H, action);
7882 }
7883 else
7884 {
7885 action(pos, arg2: true);
7886 }
7887 }
7888
7889 public void OnInspect()
7890 {
7891 }
7892
7893 public virtual void WriteNote(UINote n, Action<UINote> onWriteNote = null, IInspect.NoteMode mode = IInspect.NoteMode.Default, Recipe recipe = null)
7894 {
7895 }
7896
7897 public void Inspect()
7898 {
7899 SE.Play("pop_paper");
7900 if (isChara)
7901 {
7902 LayerChara layerChara = EClass.ui.AddLayerDontCloseOthers<LayerChara>();
7903 layerChara.windows[0].SetRect(EClass.core.refs.rects.center);
7904 layerChara.SetChara(Chara);
7905 }
7906 else
7907 {
7908 EClass.ui.AddLayerDontCloseOthers<LayerInfo>().SetThing(Thing);
7909 }
7910 }
7911
7912 public virtual bool HasCondition<T>() where T : Condition
7913 {
7914 return false;
7915 }
7916
7917 public bool HaveFur()
7918 {
7919 if (!isChara)
7920 {
7921 return false;
7922 }
7923 string text = id;
7924 if (text == "putty_snow" || text == "putty_snow_gold")
7925 {
7926 return true;
7927 }
7928 return !Chara.race.fur.IsEmpty();
7929 }
7930
7931 public bool CanBeSheared()
7932 {
7934 {
7935 return false;
7936 }
7937 if (!HaveFur() || c_fur < 0)
7938 {
7939 return false;
7940 }
7941 return true;
7942 }
7943}
AnimeID
Definition: AnimeID.cs:2
AttackSource
Definition: AttackSource.cs:2
AttackStyle
Definition: AttackStyle.cs:2
BedType
Definition: BedType.cs:2
BlessedState
Definition: BlessedState.cs:2
BossType
Definition: BossType.cs:2
CTAG
Definition: CTAG.cs:2
@ currency
ConditionType
Definition: ConditionType.cs:2
CureType
Definition: CureType.cs:2
CurrencyType
Definition: CurrencyType.cs:2
EditorTag
Definition: EditorTag.cs:2
EffectDead
Definition: EffectDead.cs:2
EffectId
Definition: EffectId.cs:2
@ ChangeMaterial
Emo
Definition: Emo.cs:2
@ harvest
FactionMemberType
HealSource
Definition: HealSource.cs:2
HitResult
Definition: HitResult.cs:2
Hostility
Definition: Hostility.cs:2
MinionType
Definition: MinionType.cs:2
NameStyle
Definition: NameStyle.cs:2
PeriodOfDay
Definition: PeriodOfDay.cs:2
PlaceState
Definition: PlaceState.cs:2
PriceType
Definition: PriceType.cs:2
Rarity
Definition: Rarity.cs:2
RescueState
Definition: RescueState.cs:2
SourceValueType
ThrowType
Definition: ThrowType.cs:2
ToggleType
Definition: ToggleType.cs:2
TryMakeRandomItemSource
if(item3.idFile==idFirstFile &&item3.id==idFirstTopic)
Definition: UIBook.cs:627
VisitorState
Definition: VisitorState.cs:2
Definition: AIAct.cs:6
AIAct Current
Definition: AIAct.cs:103
bool TryCancel(Card c)
Definition: AIAct.cs:266
virtual bool IsRunning
Definition: AIAct.cs:31
virtual Status Cancel()
Definition: AIAct.cs:291
virtual bool CancelWhenDamaged
Definition: AIAct.cs:94
static bool ignoreDamage
Definition: AI_PlayMusic.cs:14
static bool slaughtering
Definition: AI_Slaughter.cs:6
static void LoveMiracle(Chara tc, Chara c, int power, EffectId idEffect=EffectId.Love, BlessedState? state=null)
Definition: ActEffect.cs:2702
static void TryDelay(Action a)
Definition: ActEffect.cs:23
static void Proc(EffectId id, Card cc, Card tc=null, int power=100, ActRef actRef=default(ActRef))
Definition: ActEffect.cs:1021
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
void Add(Act a, string s="")
Definition: ActPlan.cs:11
Definition: ACT.cs:62
static Act CurrentAct
Definition: ACT.cs:89
virtual bool IsRoofEditMode(Card c=null)
Definition: ActionMode.cs:311
int value
Definition: Affinity.cs:26
Definition: Area.cs:4
virtual void OnInstallCard(Card t)
Definition: Area.cs:59
virtual void OnUninstallCard(Card t)
Definition: Area.cs:63
static void ProcShieldEncs(Chara CC, Card TC, int mtpChance=100)
static void GakiConvert(ref string text, string idLang="zako")
Dictionary< int, int > mapInt
Definition: BaseCard.cs:10
void SetStr(int id, string value=null)
Definition: BaseCard.cs:63
void SetObj(int id, object o)
Definition: BaseCard.cs:91
string GetStr(int id, string defaultStr=null)
Definition: BaseCard.cs:54
int GetInt(int id, int? defaultInt=null)
Definition: BaseCard.cs:25
void SetInt(int id, int value=0)
Definition: BaseCard.cs:39
Dictionary< int, string > mapStr
Definition: BaseCard.cs:13
void Mod(int a, bool force=false)
SourceElement.Row sourceElement
void WaitForEndOfFrame(Action action)
Definition: BaseCore.cs:61
List< Action > actionsNextFrame
Definition: BaseCore.cs:31
Version version
Definition: BaseCore.cs:17
ScreenGuide guide
BaseTileMap tileMap
virtual void RefreshPosition()
virtual ConditionType Type
Definition: BaseStats.cs:19
static int GetColorInt(ref Color matColor, int p)
void SetRoofHeight(MeshPassParam _param, Cell _cell, int _cx, int _cz, int h=0, int altitude=0, int dirWall=-1, bool ignoreAltitudeY=false)
Vector3 GetThingPosition(Card tg, Point p)
void SetGender(int g)
Definition: Biography.cs:473
void SetPortrait(Chara c)
Definition: Biography.cs:482
Card card
Definition: ButtonGrid.cs:24
virtual void RefreshSprite()
Definition: CardActor.cs:224
static void SetRarity(Rarity q=Rarity.Normal)
static CardBlueprint current
static void Set(CardBlueprint _bp=null)
bool tryLevelMatTier
static CardBlueprint _Default
GlobalCharaList globalCharas
Definition: CardManager.cs:46
void AssignUID(Card c)
Definition: CardManager.cs:78
void ShowEmo(Emo emo, float duration=0f)
void PlayAnime(AnimeID id, bool force)
virtual void KillAnime()
override void Draw(RenderParam p)
Definition: CardRenderer.cs:49
Vector3 position
Definition: CardRenderer.cs:21
void RefreshSprite()
virtual void SetOwner(Card c)
Definition: CardRenderer.cs:38
virtual void SetFirst(bool first, Vector3 pos)
CardActor actor
Definition: CardRenderer.cs:11
void KillActor()
void SetCensored(bool enable)
string[] idActor
Definition: CardRow.cs:35
Card model
Definition: CardRow.cs:60
int quality
Definition: CardRow.cs:19
CardRow origin
Definition: CardRow.cs:49
string[] trait
Definition: CardRow.cs:33
string _origin
Definition: CardRow.cs:15
string id
Definition: CardRow.cs:7
string tierGroup
Definition: CardRow.cs:11
string lightData
Definition: CardRow.cs:13
string[] loot
Definition: CardRow.cs:29
Definition: Card.cs:11
float angle
Definition: Card.cs:71
int CountRune(bool countFree=true)
Definition: Card.cs:3642
bool IsNegativeGift
Definition: Card.cs:2398
CharaList c_charaList
Definition: Card.cs:1893
int c_lockedAge
Definition: Card.cs:1353
void SetTier(int a, bool setTraits=true)
Definition: Card.cs:3871
bool isDestroyed
Definition: Card.cs:75
MinionType c_minionType
Definition: Card.cs:988
int FameLv
Definition: Card.cs:2300
int c_priceFix
Definition: Card.cs:1137
void ModExp(int ele, int a)
Definition: Card.cs:2655
Thing TryMakeRandomItem(int lv=-1, TryMakeRandomItemSource itemSource=TryMakeRandomItemSource.Default, Chara crafter=null)
Definition: Card.cs:5447
virtual string AliasMaterialOnCreate
Definition: Card.cs:2053
Props props
Definition: Card.cs:51
virtual string GetName(NameStyle style, int num=-1)
Definition: Card.cs:2617
int DMG
Definition: Card.cs:2333
bool IsPCFactionOrMinion
Definition: Card.cs:2274
int GetBestAttribute()
Definition: Card.cs:2632
bool isCrafted
Definition: Card.cs:794
virtual MoveResult _Move(Point p, MoveType type=MoveType.Walk)
Definition: Card.cs:5838
virtual string GetHoverText()
Definition: Card.cs:7702
void Teleport(Point point, bool silent=false, bool force=false)
Definition: Card.cs:5874
string ReferenceId()
Definition: Card.cs:2739
virtual string GetExtraName()
Definition: Card.cs:2622
ContainerUpgrade c_containerUpgrade
Definition: Card.cs:1869
virtual bool IsMultisize
Definition: Card.cs:2160
void PurgeDuplicateArtifact(Thing af)
Definition: Card.cs:3224
BitArray32 _bits1
Definition: Card.cs:79
int tier
Definition: Card.cs:410
void RemoveEditorTag(EditorTag tag)
Definition: Card.cs:2612
void ApplySocket(int id, int lv, Card mod=null)
Definition: Card.cs:3560
bool IsDecayed
Definition: Card.cs:2289
string c_idPortrait
Definition: Card.cs:1497
virtual bool IsPCC
Definition: Card.cs:2149
virtual int PV
Definition: Card.cs:2329
virtual bool isThing
Definition: Card.cs:2081
bool IsAmmo
Definition: Card.cs:2249
bool IsVariation
Definition: Card.cs:2325
SocketData AddRune(Card rune)
Definition: Card.cs:3600
string c_note
Definition: Card.cs:1761
bool isImported
Definition: Card.cs:614
bool IsImportant
Definition: Card.cs:2105
bool isSummon
Definition: Card.cs:710
bool HasRune()
Definition: Card.cs:3729
bool CanAddRune(TraitMod mod)
Definition: Card.cs:3663
bool isElemental
Definition: Card.cs:722
void Say(string lang, Card c1, Card c2, string ref1=null, string ref2=null)
Definition: Card.cs:6874
int idMaterial
Definition: Card.cs:134
virtual Chara Chara
Definition: Card.cs:2070
int version
Definition: Card.cs:422
virtual void ApplyMaterialElements(bool remove)
Definition: Card.cs:3034
int posInvY
Definition: Card.cs:350
int INT
Definition: Card.cs:2351
Thing Split(int a)
Definition: Card.cs:3486
virtual void OnSimulateHour(VirtualDate date)
Definition: Card.cs:6619
int EvalueMax(int ele, int min=0)
Definition: Card.cs:2587
bool IsAgent
Definition: Card.cs:2251
bool isMasked
Definition: Card.cs:590
void MakeFigureFrom(string id)
Definition: Card.cs:5707
int c_idMainElement
Definition: Card.cs:1413
void SetPlaceState(PlaceState newState, bool byPlayer=false)
Definition: Card.cs:3749
void AddSocket()
Definition: Card.cs:3543
void SetCensored(bool enable)
Definition: Card.cs:7761
ElementContainerCard elements
Definition: Card.cs:41
int END
Definition: Card.cs:2339
CardRow refCard
Definition: Card.cs:1967
const int DamageLimit
Definition: Card.cs:29
void _OnDeserialized(StreamingContext context)
Definition: Card.cs:2693
bool c_wasInPcParty
Definition: Card.cs:1012
int c_ammo
Definition: Card.cs:1461
bool IsFresn
Definition: Card.cs:2293
string id
Definition: Card.cs:35
float GetLightPower()
Definition: Card.cs:6423
int ChildrenWeight
Definition: Card.cs:2013
bool isNPCProperty
Definition: Card.cs:554
virtual void SetSource()
Definition: Card.cs:2857
int GetSightRadius()
Definition: Card.cs:6442
bool IsUnique
Definition: Card.cs:2091
bool IsRestrainedResident
Definition: Card.cs:2260
int c_equippedSlot
Definition: Card.cs:952
SourceBacker.Row sourceBacker
Definition: Card.cs:928
bool TryReserve(AIAct act)
Definition: Card.cs:2503
Hostility c_originalHostility
Definition: Card.cs:976
bool IsExcludeFromCraft(Recipe.Ingredient ing)
Definition: Card.cs:2531
bool isFloating
Definition: Card.cs:650
int _childrenWeight
Definition: Card.cs:87
bool isSubsetCard
Definition: Card.cs:746
Thing AddThing(Thing t, bool tryStack=true, int destInvX=-1, int destInvY=-1)
Definition: Card.cs:3111
void PlaySoundHold(bool spatial=true)
Definition: Card.cs:6168
virtual void Die(Element e=null, Card origin=null, AttackSource attackSource=AttackSource.None, Chara originalTarget=null)
Definition: Card.cs:5005
bool IsInheritFoodTraits
Definition: Card.cs:2180
ICardParent GetRoot()
Definition: Card.cs:3419
void AddBlood(int a=1, int id=-1)
Definition: Card.cs:5995
virtual bool IsMoving
Definition: Card.cs:2113
bool isRoofItem
Definition: Card.cs:578
void SetRandomLightColors()
Definition: Card.cs:6559
bool isRestrained
Definition: Card.cs:566
bool c_lockedHard
Definition: Card.cs:1036
CardRenderer HostRenderer
Definition: Card.cs:2444
virtual bool IsDisabled
Definition: Card.cs:2111
bool IsThrownWeapon
Definition: Card.cs:2247
bool isLostProperty
Definition: Card.cs:806
string TextRarity
Definition: Card.cs:2381
int ExpToNext
Definition: Card.cs:2008
void OnChildNumChange(Card c)
Definition: Card.cs:3734
int Evalue(int ele, bool ignoreGlobalElement)
Definition: Card.cs:2578
bool IsStackable(Thing tg)
Definition: Card.cs:3437
bool HasElement(string id, int req=1)
Definition: Card.cs:5953
float fy
Definition: Card.cs:266
void Explode(Point p, Card origin)
Definition: Card.cs:5056
bool noSell
Definition: Card.cs:830
bool isCensored
Definition: Card.cs:434
bool CanInspect
Definition: Card.cs:2472
CardBlueprint bp
Definition: Card.cs:77
virtual int Power
Definition: Card.cs:2297
int Evalue(string alias)
Definition: Card.cs:2592
SourceMaterial.Row DyeMat
Definition: Card.cs:1940
bool isBroken
Definition: Card.cs:734
int PER
Definition: Card.cs:2341
SourceMaterial.Row material
Definition: Card.cs:2051
bool IsRotting
Definition: Card.cs:2291
int c_summonDuration
Definition: Card.cs:1425
int c_indexContainerIcon
Definition: Card.cs:1401
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:6188
string c_idDeity
Definition: Card.cs:1581
int c_invest
Definition: Card.cs:1293
Card ChangeMaterial(int idNew, bool ignoreFixedMaterial=false)
Definition: Card.cs:3043
int HIT
Definition: Card.cs:2331
string c_extraNameRef
Definition: Card.cs:1617
bool isCopy
Definition: Card.cs:878
Card MakeRefFrom(string id)
Definition: Card.cs:5712
string c_idTrait
Definition: Card.cs:1725
string c_altName
Definition: Card.cs:1593
string TryGetFoodName(Card c)
Definition: Card.cs:5678
int c_weight
Definition: Card.cs:1377
string ApplyNewLine(string text)
Definition: Card.cs:6832
virtual void LookAt(Point p)
Definition: Card.cs:6259
void ClampInitialSkill()
Definition: Card.cs:2945
Thing Tool
Definition: Card.cs:2412
bool isRestocking
Definition: Card.cs:890
void DamageHP(long dmg, int ele, int eleP=100, AttackSource attackSource=AttackSource.None, Card origin=null, bool showEffect=true, Thing weapon=null, Chara originalTarget=null)
Definition: Card.cs:4070
string NameOne
Definition: Card.cs:2143
string InspectName
Definition: Card.cs:2483
string c_idJob
Definition: Card.cs:1521
virtual SourceMaterial.Row DefaultMaterial
Definition: Card.cs:2423
int c_priceAdd
Definition: Card.cs:1149
virtual int GetPrice(CurrencyType currency=CurrencyType.Money, bool sell=false, PriceType priceType=PriceType.Default, Chara c=null)
Definition: Card.cs:7317
virtual void HealHPHost(int a, HealSource origin=HealSource.None)
Definition: Card.cs:3989
Thing ammoData
Definition: Card.cs:1785
virtual bool IsPCParty
Definition: Card.cs:2151
virtual void SetDir(int d)
Definition: Card.cs:6244
int GetHearingRadius()
Definition: Card.cs:6437
int c_lockLv
Definition: Card.cs:964
bool ignoreAutoPick
Definition: Card.cs:506
int GetEquipValue()
Definition: Card.cs:7218
BitArray32 _bits2
Definition: Card.cs:81
virtual void HealHP(int a, HealSource origin=HealSource.None)
Definition: Card.cs:4005
virtual int SelfWeight
Definition: Card.cs:2045
int c_uidRefCard
Definition: Card.cs:1124
bool IsEquipmentOrRangedOrAmmo
Definition: Card.cs:2232
int DefaultLV
Definition: Card.cs:2010
Fov fov
Definition: Card.cs:57
int GetAffinityExpBonus()
Definition: Card.cs:2985
int c_dyeMat
Definition: Card.cs:1185
void Say(string lang, Card c1, string ref1=null, string ref2=null)
Definition: Card.cs:6883
Card AddCard(Card c)
Definition: Card.cs:3092
int invY
Definition: Card.cs:1955
Point InspectPoint
Definition: Card.cs:2485
void HatchEgg()
Definition: Card.cs:5803
static int GetTilePrice(TileRow row, SourceMaterial.Row mat)
Definition: Card.cs:7197
string c_refText
Definition: Card.cs:1629
bool IsMale
Definition: Card.cs:2386
virtual CardRenderer _CreateRenderer()
Definition: Card.cs:5988
bool IsCursed
Definition: Card.cs:2257
int c_dateCooked
Definition: Card.cs:1341
bool isSale
Definition: Card.cs:866
void CalculateFOV()
Definition: Card.cs:6521
int c_uidMaster
Definition: Card.cs:1449
int c_dateDeathLock
Definition: Card.cs:1245
Biography bio
Definition: Card.cs:44
int c_fixedValue
Definition: Card.cs:1173
Thing AddThing(string id, int lv=-1)
Definition: Card.cs:3106
string StripTalkSpeiclaCharacters(string text)
Definition: Card.cs:6813
virtual bool MatchEncSearch(string s)
Definition: Card.cs:7787
void SetCharge(int a)
Definition: Card.cs:3946
virtual string GetDetail()
Definition: Card.cs:2627
void Talk(string idTopic, string ref1=null, string ref2=null, bool forceSync=false)
Definition: Card.cs:6748
Card SetLv(int a)
Definition: Card.cs:2907
int hp
Definition: Card.cs:242
Rarity rarity
Definition: Card.cs:314
int c_vomit
Definition: Card.cs:1000
float fx
Definition: Card.cs:254
string Name
Definition: Card.cs:2139
void SetRandomTone()
Definition: Card.cs:6978
void PlaySoundImpact(bool spatial=true)
Definition: Card.cs:6178
int c_seed
Definition: Card.cs:1305
bool IsRangedWeapon
Definition: Card.cs:2245
const int MaxWeight
Definition: Card.cs:25
virtual string actorPrefab
Definition: Card.cs:2129
int CHA
Definition: Card.cs:2349
virtual int DV
Definition: Card.cs:2327
ICardParent parent
Definition: Card.cs:55
bool ExistsOnMap
Definition: Card.cs:2085
bool dirtyWeight
Definition: Card.cs:85
bool hasSpawned
Definition: Card.cs:902
void EjectSockets()
Definition: Card.cs:3578
virtual void OnBeforeCreate()
Definition: Card.cs:2849
bool IsHotItem
Definition: Card.cs:119
void NotifyAddThing(Thing t, int num)
Definition: Card.cs:3102
virtual int WeightLimit
Definition: Card.cs:2047
Sprite GetPaintSprite()
Definition: Card.cs:7128
virtual bool IsMinion
Definition: Card.cs:2153
MixedFoodData c_mixedFoodData
Definition: Card.cs:1905
bool c_isPrayed
Definition: Card.cs:1072
bool c_revealLock
Definition: Card.cs:1048
void AddEditorTag(EditorTag tag)
Definition: Card.cs:2607
string c_idAbility
Definition: Card.cs:1665
virtual string GetHoverText2()
Definition: Card.cs:7707
void ApplySocket(Thing t)
Definition: Card.cs:3552
string c_idTone
Definition: Card.cs:1533
const int SocketDiv
Definition: Card.cs:27
virtual bool IsDeadOrSleeping
Definition: Card.cs:2109
Thing SetNum(int a)
Definition: Card.cs:3497
int c_priceCopy
Definition: Card.cs:1161
int GetCurrency(string id="money")
Definition: Card.cs:3977
void SetReplica(bool on)
Definition: Card.cs:3077
void ForeachPoint(Action< Point, bool > action)
Definition: Card.cs:7877
void Dye(SourceMaterial.Row mat)
Definition: Card.cs:6031
void Deconstruct()
Definition: Card.cs:5066
virtual bool IsPCPartyMinion
Definition: Card.cs:2155
string c_idSpriteReplacer
Definition: Card.cs:1557
SourceMaterial.Row _material
Definition: Card.cs:91
bool HasElement(int ele, int req)
Definition: Card.cs:5948
bool HasLight()
Definition: Card.cs:6418
int decay
Definition: Card.cs:218
Thing GiveBirth(Thing t, bool effect)
Definition: Card.cs:5784
CardRow refCard2
Definition: Card.cs:1988
string c_altName2
Definition: Card.cs:1605
Thing parentThing
Definition: Card.cs:105
virtual Sprite GetImageSprite()
Definition: Card.cs:6124
int LER
Definition: Card.cs:2343
void MakeRefFrom(Card c1, Card c2=null)
Definition: Card.cs:5718
Sprite _paintSprite
Definition: Card.cs:99
bool autoRefuel
Definition: Card.cs:626
Thing c_bloodData
Definition: Card.cs:1917
bool IsFurniture
Definition: Card.cs:2253
virtual void ApplyMaterial(bool remove=false)
Definition: Card.cs:3038
bool IsFood
Definition: Card.cs:2177
Fov CreateFov()
Definition: Card.cs:6564
PlaceState placeState
Definition: Card.cs:83
CharaUpgrade c_upgrades
Definition: Card.cs:1833
void ApplyElementEffect(Element e, int eleP, Card origin, bool checkHostileAct=false)
Definition: Card.cs:4845
void ChangeAltitude(int a)
Definition: Card.cs:6298
List< SocketData > socketList
Definition: Card.cs:1797
int c_IDTState
Definition: Card.cs:1257
bool HasContainerSize
Definition: Card.cs:2409
void PlayAnime(AnimeID id, Point dest, bool force=false)
Definition: Card.cs:6212
int c_daysWithGod
Definition: Card.cs:1473
virtual void SetBlessedState(BlessedState s)
Definition: Card.cs:3897
int WIL
Definition: Card.cs:2345
RenderParam GetRenderParam()
Definition: Card.cs:6007
virtual SourcePref Pref
Definition: Card.cs:2107
bool isAcidproof
Definition: Card.cs:686
void RecalculateFOV()
Definition: Card.cs:6404
bool IsToolbelt
Definition: Card.cs:2171
int MaxRune()
Definition: Card.cs:3658
string c_idEditor
Definition: Card.cs:1689
int STR
Definition: Card.cs:2335
string c_idRace
Definition: Card.cs:1509
bool HasTalk(string idTopic)
Definition: Card.cs:6743
string GetTalkText(string idTopic, bool stripPun=false, bool useDefault=true)
Definition: Card.cs:6892
bool HasTag(CTAG tag)
Definition: Card.cs:2597
Point pos
Definition: Card.cs:59
int DEX
Definition: Card.cs:2337
void DecayNatural(int hour=1)
Definition: Card.cs:6628
bool IsInMutterDistance(int d=10)
Definition: Card.cs:7756
virtual void OnCreate(int genLv)
Definition: Card.cs:2853
void DyeRandom()
Definition: Card.cs:6021
string c_editorTags
Definition: Card.cs:1701
void SetDirtyWeight()
Definition: Card.cs:2556
virtual void LookAt(Card c)
Definition: Card.cs:6255
LightData _LightData
Definition: Card.cs:97
void Decay(int a=10)
Definition: Card.cs:6660
void RenderMarker(Point point, bool active, HitResult result, bool main, int dir, bool useCurrentPosition=false)
Definition: Card.cs:6340
virtual long ApplyProtection(long dmg, int mod=100)
Definition: Card.cs:4040
int sortVal
Definition: Card.cs:101
void MakeFoodRef(Card c1, Card c2=null)
Definition: Card.cs:5627
string c_idRefCard2
Definition: Card.cs:1749
int LUC
Definition: Card.cs:2353
int c_containerSize
Definition: Card.cs:1365
void ClearFOV()
Definition: Card.cs:6611
int c_lightColor
Definition: Card.cs:1096
static Color _randColor
Definition: Card.cs:93
virtual void OnDeserialized()
Definition: Card.cs:2735
void _OnSerializing(StreamingContext context)
Definition: Card.cs:2678
virtual CardRow sourceRenderCard
Definition: Card.cs:2133
int ChildrenAndSelfWeightSingle
Definition: Card.cs:2043
int[] _ints
Definition: Card.cs:32
void SetPaintData()
Definition: Card.cs:7086
int uid
Definition: Card.cs:122
virtual void SetRenderParam(RenderParam p)
Definition: Card.cs:6017
Effect PlayEffect(string id, bool useRenderPos=true, float range=0f, Vector3 fix=default(Vector3))
Definition: Card.cs:6222
bool IsEquipmentOrRanged
Definition: Card.cs:2220
int Quality
Definition: Card.cs:2427
void Dye(string idMat)
Definition: Card.cs:6026
virtual SubPassData GetSubPassData()
Definition: Card.cs:6311
List< int > c_corruptionHistory
Definition: Card.cs:1857
override string ToString()
Definition: Card.cs:2489
void TryStack(Thing t)
Definition: Card.cs:7024
int refVal
Definition: Card.cs:206
void ShowEmo(Emo _emo=Emo.none, float duration=0f, bool skipSame=true)
Definition: Card.cs:6156
void ApplyTrait()
Definition: Card.cs:2886
void OnInspect()
Definition: Card.cs:7889
virtual Sprite GetSprite(int dir=0)
Definition: Card.cs:6107
string c_context
Definition: Card.cs:1677
Trait trait
Definition: Card.cs:53
Window.SaveData GetWindowSaveData()
Definition: Card.cs:2518
virtual int MaxDecay
Definition: Card.cs:2287
void ModCurrency(int a, string id="money")
Definition: Card.cs:3963
bool IsPowerful
Definition: Card.cs:2094
string c_idTalk
Definition: Card.cs:1569
static string ApplyTone(Chara c, ref string text, string _tones, int gender, bool stripPun=false)
Definition: Card.cs:6917
bool ShouldTrySetDirtyInventory()
Definition: Card.cs:3381
void LevelUp()
Definition: Card.cs:2999
string c_idRidePCC
Definition: Card.cs:1653
virtual void ApplyEditorTags(EditorTag tag)
Definition: Card.cs:2861
int encLV
Definition: Card.cs:326
int altitude
Definition: Card.cs:230
int c_diceDim
Definition: Card.cs:1389
bool IsEquipment
Definition: Card.cs:2175
virtual bool IsAliveInCurrentZone
Definition: Card.cs:2127
int c_allowance
Definition: Card.cs:1317
bool isDeconstructing
Definition: Card.cs:446
MoveType
Definition: Card.cs:20
bool disableAutoToggle
Definition: Card.cs:602
virtual int[] Tiles
Definition: Card.cs:2311
Thing MakeMilk(bool effect=true, int num=1, bool addToZone=true, BlessedState? state=null)
Definition: Card.cs:5753
CardRow hat
Definition: Card.cs:63
virtual int SecondaryCompare(UIList.SortMode m, Card c)
Definition: Card.cs:7823
virtual void OnLand()
Definition: Card.cs:5916
void DamageHP(long dmg, AttackSource attackSource=AttackSource.None, Card origin=null)
Definition: Card.cs:4065
int exp
Definition: Card.cs:398
void RemoveBacker()
Definition: Card.cs:7077
CharaGenes c_genes
Definition: Card.cs:1845
virtual int MaxHP
Definition: Card.cs:2295
void ChangeWeight(int a)
Definition: Card.cs:2566
void ModEncLv(int a)
Definition: Card.cs:3848
void RemoveThing(Thing thing)
Definition: Card.cs:3320
void SetEncLv(int a)
Definition: Card.cs:3866
Card MakeFoodFrom(string _id)
Definition: Card.cs:5521
SocketData GetRuneEnc(int idEle)
Definition: Card.cs:3627
int c_dateStockExpire
Definition: Card.cs:1233
void PlaySoundDead(bool spatial=true)
Definition: Card.cs:6183
int c_idBacker
Definition: Card.cs:1437
bool CanBeSheared()
Definition: Card.cs:7931
float roundTimer
Definition: Card.cs:69
bool TryPay(int a, string id="money")
Definition: Card.cs:3927
void SayNothingHappans()
Definition: Card.cs:6860
void ModCharge(int a, bool destroy=false)
Definition: Card.cs:3952
bool isDyed
Definition: Card.cs:458
bool isNew
Definition: Card.cs:482
void PlayAnimeLoot()
Definition: Card.cs:6217
int MAG
Definition: Card.cs:2347
bool isWeightChanged
Definition: Card.cs:662
void Destroy()
Definition: Card.cs:5072
bool HasGlobalElement(int ele)
Definition: Card.cs:5958
int feat
Definition: Card.cs:374
bool c_isImportant
Definition: Card.cs:1024
MoveResult
Definition: Card.cs:13
bool noMove
Definition: Card.cs:770
bool HaveFur()
Definition: Card.cs:7917
bool HasEditorTag(EditorTag tag)
Definition: Card.cs:2602
Card ChangeMaterial(string idNew, bool ignoreFixedMaterial=false)
Definition: Card.cs:3048
ThingContainer things
Definition: Card.cs:38
BossType c_bossType
Definition: Card.cs:1221
void PurgeEythArtifact()
Definition: Card.cs:3280
bool HasCraftBonusTrait()
Definition: Card.cs:7003
bool IsInstalled
Definition: Card.cs:2383
virtual void Rotate(bool reverse=false)
Definition: Card.cs:6263
virtual bool IsPC
Definition: Card.cs:2145
int GetExpMtp()
Definition: Card.cs:2967
int c_daysWithPC
Definition: Card.cs:1485
bool IsMeleeWeapon
Definition: Card.cs:2243
string c_color
Definition: Card.cs:1545
Card SetHidden(bool hide=true)
Definition: Card.cs:5831
string NameSimple
Definition: Card.cs:2141
void SetSale(bool sale)
Definition: Card.cs:7223
bool isFireproof
Definition: Card.cs:674
void SetRandomTalk()
Definition: Card.cs:6969
bool IsChildOf(Card c)
Definition: Card.cs:2663
int rarityLv
Definition: Card.cs:302
void SetFreePos(Point point)
Definition: Card.cs:6316
virtual bool isChara
Definition: Card.cs:2083
int GetDaysTogetherBonus()
Definition: Card.cs:2990
void RefreshColor()
Definition: Card.cs:6038
virtual Thing Thing
Definition: Card.cs:2058
BedType c_bedType
Definition: Card.cs:940
int turn
Definition: Card.cs:65
Card GetRootCard()
Definition: Card.cs:3428
virtual void SetImage(Image image)
Definition: Card.cs:6134
int Evalue(int ele)
Definition: Card.cs:2573
virtual bool CanStackTo(Thing to)
Definition: Card.cs:3394
int Dist(Card c)
Definition: Card.cs:7712
TraitShackle GetRestrainer()
Definition: Card.cs:7181
Thing SetNoSell()
Definition: Card.cs:3511
int c_bill
Definition: Card.cs:1281
void Mod()
Definition: Card.cs:2513
void CheckJustCooked()
Definition: Card.cs:6651
byte[] c_textureData
Definition: Card.cs:1929
virtual void WriteNote(UINote n, Action< UINote > onWriteNote=null, IInspect.NoteMode mode=IInspect.NoteMode.Default, Recipe recipe=null)
Definition: Card.cs:7893
int colorInt
Definition: Card.cs:108
int invX
Definition: Card.cs:1943
bool isHidden
Definition: Card.cs:530
int idSkin
Definition: Card.cs:362
void MoveImmediate(Point p, bool focus=true, bool cancelAI=true)
Definition: Card.cs:5848
bool CanReserve(AIAct act)
Definition: Card.cs:2494
bool isOn
Definition: Card.cs:542
virtual void OnSerializing()
Definition: Card.cs:2688
Thing SetPriceFix(int a)
Definition: Card.cs:7212
virtual bool IsPCFaction
Definition: Card.cs:2271
Window.SaveData c_windowSaveData
Definition: Card.cs:1821
bool isGifted
Definition: Card.cs:782
int ResistLv(int res)
Definition: Card.cs:5930
bool IsLightsource
Definition: Card.cs:2173
bool isPlayerCreation
Definition: Card.cs:494
int _z
Definition: Card.cs:182
virtual bool HasHost
Definition: Card.cs:2425
BlessedState blessedState
Definition: Card.cs:278
int H
Definition: Card.cs:2368
Thing Duplicate(int num)
Definition: Card.cs:3446
int _colorInt
Definition: Card.cs:67
virtual int PrefIndex
Definition: Card.cs:2314
bool isStolen
Definition: Card.cs:854
virtual bool IsGlobal
Definition: Card.cs:2285
void PlaySoundDrop(bool spatial=true)
Definition: Card.cs:6173
PlaceState _placeState
Definition: Card.cs:290
ref Color GetRandomColor()
Definition: Card.cs:6080
int dir
Definition: Card.cs:146
int c_uidZone
Definition: Card.cs:1111
bool isScaled
Definition: Card.cs:914
int W
Definition: Card.cs:2356
bool TryStackTo(Thing to)
Definition: Card.cs:3399
virtual bool IsPCFactionMinion
Definition: Card.cs:2157
bool IsBlessed
Definition: Card.cs:2255
Card Install()
Definition: Card.cs:3743
void ApplyBacker(int bid)
Definition: Card.cs:7041
Thing c_copyContainer
Definition: Card.cs:1809
bool ShouldShowMsg
Definition: Card.cs:2456
void TryUnrestrain(bool force=false, Chara c=null)
Definition: Card.cs:7145
Card parentCard
Definition: Card.cs:103
bool c_isDisableStockUse
Definition: Card.cs:1084
RescueState c_rescueState
Definition: Card.cs:1209
Emo lastEmo
Definition: Card.cs:95
bool noSnow
Definition: Card.cs:758
void SetImage(Image image, int dir, int idSkin=0)
Definition: Card.cs:6129
virtual CardRow sourceCard
Definition: Card.cs:2131
void ModExp(string alias, int a)
Definition: Card.cs:2650
List< Element > ListCraftBonusTraits()
Definition: Card.cs:7008
string c_idRefName
Definition: Card.cs:1641
void SetRandomDir()
Definition: Card.cs:6250
bool noShadow
Definition: Card.cs:818
int GetLightRadius()
Definition: Card.cs:6451
DNA c_DNA
Definition: Card.cs:1881
int ChildrenAndSelfWeight
Definition: Card.cs:2041
int GetTotalQuality(bool applyBonus=true)
Definition: Card.cs:3838
bool isModified
Definition: Card.cs:470
float animeCounter
Definition: Card.cs:73
Thing Add(string id, int num=1, int lv=1)
Definition: Card.cs:3083
int genLv
Definition: Card.cs:194
virtual void Tick()
Definition: Card.cs:7193
int Num
Definition: Card.cs:158
int _x
Definition: Card.cs:170
Color LightColor
Definition: Card.cs:1108
void PlayAnime(AnimeID id, bool force=false)
Definition: Card.cs:6207
SourceCategory.Row category
Definition: Card.cs:2049
void SetDeconstruct(bool deconstruct)
Definition: Card.cs:7771
bool c_isTrained
Definition: Card.cs:1060
int posInvX
Definition: Card.cs:338
void Inspect()
Definition: Card.cs:7897
virtual void SetSortVal(UIList.SortMode m, CurrencyType currency=CurrencyType.Money)
Definition: Card.cs:7792
byte[] GetPaintData()
Definition: Card.cs:7100
UniqueData c_uniqueData
Definition: Card.cs:1773
bool IsWeapon
Definition: Card.cs:2208
Vector3 InspectPosition
Definition: Card.cs:2487
void ModNum(int a, bool notify=true)
Definition: Card.cs:3517
bool isLeashed
Definition: Card.cs:842
T FindTool< T >()
Definition: Card.cs:2668
virtual void ChangeRarity(Rarity q)
Definition: Card.cs:3922
bool IsIdentified
Definition: Card.cs:2379
bool IsContainer
Definition: Card.cs:2089
bool isReplica
Definition: Card.cs:698
bool freePos
Definition: Card.cs:518
int c_charges
Definition: Card.cs:1269
SourceCategory.Row _category
Definition: Card.cs:89
SocketData AddRune(int idEle, int v, bool free)
Definition: Card.cs:3605
void SayRaw(string text, string ref1=null, string ref2=null)
Definition: Card.cs:6844
virtual int GetArmorSkill()
Definition: Card.cs:4035
int GetValue(PriceType priceType=PriceType.Default, bool sell=false)
Definition: Card.cs:7239
void PlayEffect(int ele, bool useRenderPos=true, float range=0f)
Definition: Card.cs:6232
List< int > sockets
Definition: Card.cs:47
bool _IsPC
Definition: Card.cs:2147
void RemoveCard(Card c)
Definition: Card.cs:3097
string c_editorTraitVal
Definition: Card.cs:1713
CardRenderer renderer
Definition: Card.cs:61
int c_fur
Definition: Card.cs:1329
void AddExp(int a, bool applyMod=true)
Definition: Card.cs:2953
void KillAnime()
Definition: Card.cs:6202
virtual bool flipX
Definition: Card.cs:2116
void SpawnLoot(Card origin)
Definition: Card.cs:5112
bool HasElement(int ele, bool includeNagative=false)
Definition: Card.cs:5935
void ClearPaintSprite()
Definition: Card.cs:7118
string GetFoodName(string s)
Definition: Card.cs:5702
VisitorState visitorState
Definition: Card.cs:1197
void TalkRaw(string text, string ref1=null, string ref2=null, bool forceSync=false)
Definition: Card.cs:6787
int LV
Definition: Card.cs:386
bool isBackerContent
Definition: Card.cs:925
Card ChangeMaterial(SourceMaterial.Row row, bool ignoreFixedMaterial=false)
Definition: Card.cs:3053
virtual bool isSynced
Definition: Card.cs:2087
bool ignoreStackHeight
Definition: Card.cs:638
void ForeachFOV(Func< Point, bool > func)
Definition: Card.cs:7861
void Create(string _id, int _idMat=-1, int genLv=-1)
Definition: Card.cs:2744
AIAct reservedAct
Definition: Card.cs:49
int ResistLvFrom(int ele)
Definition: Card.cs:5925
int QualityLv
Definition: Card.cs:2429
void Say(string lang, string ref1=null, string ref2=null)
Definition: Card.cs:6865
string ApplyTone(string text, bool stripPun=false)
Definition: Card.cs:6911
string c_idRefCard
Definition: Card.cs:1737
Card MakeFoodFrom(Card c)
Definition: Card.cs:5526
Thing MakeEgg(bool effect=true, int num=1, bool addToZone=true, int fertChance=20, BlessedState? state=null)
Definition: Card.cs:5730
int Dist(Point p)
Definition: Card.cs:7751
bool ShowFoodEnc
Definition: Card.cs:2192
bool HasElementNoCopy()
Definition: Card.cs:5963
void RemoveThings()
Definition: Card.cs:3312
void MoveThingToBottom(Thing t)
Definition: CellDetail.cs:45
void MoveThingToTop(Thing t)
Definition: CellDetail.cs:58
Definition: Cell.cs:7
void RemoveCard(Card c)
Definition: Cell.cs:1566
bool IsSnowTile
Definition: Cell.cs:782
bool IsTopWaterAndNoSnow
Definition: Cell.cs:712
void Refresh()
Definition: Cell.cs:1152
bool skipRender
Definition: Cell.cs:270
void AddCard(Card c)
Definition: Cell.cs:1550
void Unequip(Thing thing, bool refresh=true)
Definition: CharaBody.cs:49
AttackStyle GetAttackStyle()
Definition: CharaBody.cs:464
Thing GetEquippedThing(int elementId)
Definition: CharaBody.cs:409
Definition: Chara.cs:10
bool IsHumanSpeak
Definition: Chara.cs:1015
Element MainElement
Definition: Chara.cs:717
CharaBody body
Definition: Chara.cs:94
Card held
Definition: Chara.cs:70
bool IsEyth
Definition: Chara.cs:1052
AIAct ai
Definition: Chara.cs:202
bool isWet
Definition: Chara.cs:142
Condition AddCondition(string id, int p=100, bool force=false)
Definition: Chara.cs:9266
Faction faction
Definition: Chara.cs:427
void ModAffinity(Chara c, int a, bool show=true, bool showOnlyEmo=false)
Definition: Chara.cs:7953
Chara host
Definition: Chara.cs:33
SourceJob.Row job
Definition: Chara.cs:466
void SetFeat(int id, int value=1, bool msg=false)
Definition: Chara.cs:9902
void ShowDialog()
Definition: Chara.cs:7054
override string ToString()
Definition: Chara.cs:1172
Party party
Definition: Chara.cs:43
ElementContainer tempElements
Definition: Chara.cs:36
List< Condition > conditions
Definition: Chara.cs:211
bool HasCondition(string alias)
Definition: Chara.cs:9427
override bool IsDisabled
Definition: Chara.cs:585
bool IsHuman
Definition: Chara.cs:879
bool IsAnimal
Definition: Chara.cs:867
override bool IsPCFaction
Definition: Chara.cs:671
void CalculateMaxStamina()
Definition: Chara.cs:2013
ConSleep conSleep
Definition: Chara.cs:102
bool IsFriendOrAbove()
Definition: Chara.cs:6640
override int MaxHP
Definition: Chara.cs:708
Stats SAN
Definition: Chara.cs:1158
SourceChara.Row source
Definition: Chara.cs:158
Stats mana
Definition: Chara.cs:1154
FactionMemberType memberType
Definition: Chara.cs:46
Stats stamina
Definition: Chara.cs:1146
Chara parasite
Definition: Chara.cs:30
Card DropHeld(Point dropPos=null)
Definition: Chara.cs:4608
Chara ride
Definition: Chara.cs:27
bool IsUndead
Definition: Chara.cs:891
void AddCooldown(int idEle, int turns=0)
Definition: Chara.cs:8677
Thing MakeGene(DNA.Type? type=null)
Definition: Chara.cs:8171
Affinity affinity
Definition: Chara.cs:314
void ModCorruption(int a)
Definition: Chara.cs:9844
Religion faith
Definition: Chara.cs:439
Chara enemy
Definition: Chara.cs:86
Chara SetEnemy(Chara c=null)
Definition: Chara.cs:6318
void SyncRide()
Definition: Chara.cs:3935
void DoHostileAction(Card _tg, bool immediate=false)
Definition: Chara.cs:6367
bool isBlind
Definition: Chara.cs:130
Thing EQ_ID(string s, int mat=-1, Rarity r=Rarity.Random)
Definition: Chara.cs:5074
bool IsMachine
Definition: Chara.cs:903
bool IsHostile()
Definition: Chara.cs:6544
bool isDead
Definition: Chara.cs:389
void Cure(CureType type, int p=100, BlessedState state=BlessedState.Normal)
Definition: Chara.cs:9519
void TrySetEnemy(Chara c)
Definition: Chara.cs:6335
bool HasCooldown(int idEle)
Definition: Chara.cs:8728
void CalcBurden()
Definition: Chara.cs:1827
SourceRace.Row race
Definition: Chara.cs:464
bool Has(string id)
Definition: CodexManager.cs:36
bool DroppedCard(string id)
Definition: CodexManager.cs:46
CodexCreature GetOrCreate(string id)
Definition: CodexManager.cs:9
void AddKill(string id)
Definition: CodexManager.cs:55
void MarkCardDrop(string id)
Definition: CodexManager.cs:41
BlockColors blockColors
UD_String_LightData lightColors
UD_String_MatData matColors
Definition: ConDim.cs:2
Definition: ConWet.cs:2
virtual void OnCalculateFov(Fov fov, ref int radius, ref float power)
Definition: Condition.cs:75
void Kill(bool silent=false)
Definition: Condition.cs:91
virtual void OnCreateFov(Fov fov)
Definition: Condition.cs:79
bool dontCancelIfZeroDamage
Definition: CoreConfig.cs:558
new GameConfig game
Definition: CoreConfig.cs:609
GraphicSetting graphic
Definition: CoreConfig.cs:607
OtherSetting other
Definition: CoreConfig.cs:619
bool godMode
Definition: CoreDebug.cs:173
bool godFood
Definition: CoreDebug.cs:183
bool enable
Definition: CoreDebug.cs:286
bool testThingQuality
Definition: CoreDebug.cs:215
Sprite defaultAbility
Definition: CoreRef.cs:118
RectData center
Definition: CoreRef.cs:166
Icons icons
Definition: CoreRef.cs:355
Rects rects
Definition: CoreRef.cs:361
CoreRef refs
Definition: Core.cs:51
bool IsGameStarted
Definition: Core.cs:84
CoreConfig config
Definition: Core.cs:70
Definition: DNA.cs:8
static Thing CopyDNA(Thing from, Thing to)
Definition: DNA.cs:142
static Thing GenerateRandomGene(int lv=-1, int seed=-1)
Definition: DNA.cs:150
void Add(Card target, Card attacker, int dmg, Element e=null)
int GetRaw(int offsetHours=0)
Definition: Date.cs:326
int day
Definition: Date.cs:62
bool IsNight
Definition: Date.cs:112
int GetRawDay()
Definition: Date.cs:331
PeriodOfDay periodOfDay
Definition: Date.cs:128
Definition: Dice.cs:5
static int Roll(int num, int sides, int bonus=0, Card card=null)
Definition: Dice.cs:48
Definition: EClass.cs:6
static Game game
Definition: EClass.cs:9
static Scene scene
Definition: EClass.cs:31
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 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 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: Effect.cs:7
Effect _Play(Point from, Vector3 fromV, float fixY=0f, Point to=null, Sprite sprite=null)
Definition: Effect.cs:115
Effect Emit(int num)
Definition: Effect.cs:279
static Effect Get(Effect original)
Definition: Effect.cs:85
Effect SetParticleColor(Color c)
Definition: Effect.cs:289
void SetOwner(Card c, bool applyFeat)
void ModExp(int ele, float a, bool chain=false)
List< Element > ListElements(Func< Element, bool > shoudList=null, Comparison< Element > comparison=null)
Dictionary< int, Element > dict
bool Has(int ele)
int Value(int ele)
void CopyTo(ElementContainer container)
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 GetOrCreateElement(Element ele)
Element GetElement(string alias)
int ValueWithoutLink
Definition: ELEMENT.cs:294
static int GetResistDamage(int dmg, int v, int power=0)
Definition: ELEMENT.cs:1140
int id
Definition: ELEMENT.cs:250
SourceElement.Row source
Definition: ELEMENT.cs:273
static int GetResistLv(int v)
Definition: ELEMENT.cs:1126
int Value
Definition: ELEMENT.cs:292
bool IsFoodTrait
Definition: ELEMENT.cs:364
static Element Create(int id, int v=0)
Definition: ELEMENT.cs:1102
static Element Void
Definition: ELEMENT.cs:238
bool IsGlobalElement
Definition: ELEMENT.cs:345
bool IsTrait
Definition: ELEMENT.cs:362
static int[] List_MainAttributesMajor
Definition: ELEMENT.cs:242
Dictionary< string, Dictionary< string, string > > all
Definition: ExcelDataList.cs:8
List< Dictionary< string, string > > list
virtual void Initialize()
int Evalue(int ele)
List< Chara > members
PolicyManager policies
HomeResourceManager resources
List< FactionBranch > GetChildren()
Definition: FACTION.cs:202
void AddContribution(int a)
Definition: FACTION.cs:318
Definition: Fov.cs:6
byte b
Definition: Fov.cs:30
byte g
Definition: Fov.cs:28
Dictionary< int, byte > lastPoints
Definition: Fov.cs:36
void Perform(int _x, int _z, int _range, float power=1f)
Definition: Fov.cs:139
byte r
Definition: Fov.cs:26
static string ConvertDrama(string text, Chara c=null)
Definition: GameLang.cs:14
bool enableDamageReduction
bool disableUsermapBenefit
RenderSetting render
Definition: GameSetting.cs:301
UD_String_ElementRef elements
Definition: GameSetting.cs:315
bool snapFreePos
Definition: Game.cs:34
HashSet< Texture2D > loadedTextures
Definition: Game.cs:258
ReligionManager religions
Definition: Game.cs:159
GamePrincipal principal
Definition: Game.cs:225
CardManager cards
Definition: Game.cs:156
Zone activeZone
Definition: Game.cs:252
Config config
Definition: Game.cs:219
QuestManager quests
Definition: Game.cs:183
bool HasBounty(Chara c)
Definition: GuildFighter.cs:44
bool CanGiveContribution(Chara c)
Definition: GuildFighter.cs:26
int BuySpellbookPrice(int a)
Definition: GuildMage.cs:17
int SellStolenPrice(int a)
Definition: GuildThief.cs:17
Definition: Guild.cs:2
static GuildMage Mage
Definition: Guild.cs:58
static GuildFighter Fighter
Definition: Guild.cs:56
bool IsMember
Definition: Guild.cs:72
static GuildThief Thief
Definition: Guild.cs:60
virtual Thing Thing
Definition: HotItem.cs:38
static bool Has(string id)
Definition: LangGame.cs:46
bool stripPuns
Definition: LangSetting.cs:44
int combatTextStyle
Definition: LangSetting.cs:50
bool useTone
Definition: LangSetting.cs:40
Definition: Lang.cs:6
static LangSetting setting
Definition: Lang.cs:54
static NaturalStringComparer comparer
Definition: Lang.cs:22
static string[] GetList(string id)
Definition: Lang.cs:114
static LangGame Game
Definition: Lang.cs:48
static bool isJP
Definition: Lang.cs:38
LayerChara SetChara(Chara c)
Definition: LayerChara.cs:9
static bool IsActive()
Definition: LayerDrama.cs:34
static LayerDrama Instance
Definition: LayerDrama.cs:20
static void SetDirty(Thing t)
static List< LayerInventory > listInv
List< Window > windows
Definition: Layer.cs:116
int radius
Definition: LightData.cs:10
Color color
Definition: LightData.cs:7
static SourceMaterial.Row GetRandomMaterial(int lv, string group=null, bool tryLevelMatTier=false)
Definition: MATERIAL.cs:56
static SourceMaterial.Row GetRandomMaterialFromCategory(int lv, string cat, SourceMaterial.Row fallback)
Definition: MATERIAL.cs:93
Definition: MOD.cs:7
static TalkDataList listTalk
Definition: MOD.cs:10
static ToneDataList tones
Definition: MOD.cs:12
bool IsIndoor
Definition: Map.cs:131
Chara FindChara(string id)
Definition: Map.cs:2568
void TrySmoothPick(Cell cell, Thing t, Chara c)
Definition: Map.cs:1804
void MoveCard(Point p, Card t)
Definition: Map.cs:841
PropsManager props
Definition: Map.cs:91
void OnSetBlockOrDoor(int x, int z)
Definition: Map.cs:1024
PropsStocked Stocked
Definition: Map.cs:121
List< Chara > charas
Definition: Map.cs:81
void AddDecal(int x, int z, int id, int amount=1, bool refresh=true)
Definition: Map.cs:2029
void Add(Point point, float tile=0f, float color=0f)
Definition: MeshPass.cs:122
Color Thinking
Definition: MsgColors.cs:17
Color Talk
Definition: MsgColors.cs:7
Color Ono
Definition: MsgColors.cs:13
Definition: Msg.cs:5
static MsgColors colors
Definition: Msg.cs:20
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
void RemoveMember(Chara c)
Definition: Party.cs:102
List< Chara > members
Definition: Party.cs:19
int landDeedBought
Definition: Player.cs:659
int kills
Definition: Player.cs:87
Flags flags
Definition: Player.cs:1094
CodexManager codex
Definition: Player.cs:1115
RecipeManager recipes
Definition: Player.cs:1097
void ModFame(int a)
Definition: Player.cs:2094
void ModKarma(int a)
Definition: Player.cs:2516
Stats stats
Definition: Player.cs:1016
int lightRadius
Definition: Player.cs:1189
bool invlunerable
Definition: Player.cs:1173
int customLightMod
Definition: Player.cs:959
int totalFeat
Definition: Player.cs:905
bool forceTalk
Definition: Player.cs:1151
HotItem currentHotItem
Definition: Player.cs:1100
Chara Agent
Definition: Player.cs:1274
Chara chara
Definition: Player.cs:1203
int fame
Definition: Player.cs:881
bool TryAbortAutoCombat(bool immediate=true)
Definition: Player.cs:2410
void RefreshCurrentHotItem()
Definition: Player.cs:2199
Definition: Point.cs:9
void ForeachMultiSize(int w, int h, Action< Point, bool > action)
Definition: Point.cs:1385
ref Vector3 Position(int height)
Definition: Point.cs:548
List< Card > ListCards(bool includeMasked=false)
Definition: Point.cs:1051
RenderParam ApplyAnime(RenderParam p)
Definition: Point.cs:1325
Point Copy()
Definition: Point.cs:491
override string ToString()
Definition: Point.cs:524
Point Set(int _x, int _z)
Definition: Point.cs:503
CellDetail detail
Definition: Point.cs:71
bool IsBlocked
Definition: Point.cs:363
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
bool IsSync
Definition: Point.cs:344
SoundSource PlaySound(string id, bool synced=true, float v=1f, bool spatial=true)
Definition: Point.cs:1253
ref Vector3 PositionCenter()
Definition: Point.cs:587
bool IsValid
Definition: Point.cs:88
Effect PlayEffect(string id)
Definition: Point.cs:1248
bool HasObj
Definition: Point.cs:137
void RefreshNeighborTiles()
Definition: Point.cs:1276
Area area
Definition: Point.cs:73
int Distance(Point p)
Definition: Point.cs:989
bool HasBlock
Definition: Point.cs:141
Cell cell
Definition: Point.cs:51
bool HasChara
Definition: Point.cs:238
bool IsActive(int id, int days=-1)
List< Card > sales
Definition: PropsManager.cs:14
void OnCardAddedToZone(Card c)
Definition: PropsManager.cs:25
List< Card > deconstructing
Definition: PropsManager.cs:12
Definition: Props.cs:7
void Add(Card t)
Definition: Props.cs:63
void OnNumChange(Card c, int a)
Definition: Props.cs:160
void Remove(Card t)
Definition: Props.cs:115
List< Quest > list
Definition: QuestManager.cs:11
Definition: Quest.cs:7
virtual void OnKillChara(Chara c)
Definition: Quest.cs:548
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
HashSet< string > knownIngredients
Definition: Recipe.cs:7
ReligionHarvest Harvest
ReligionLuck Luck
ReligionHealing Healing
static Religion recentWrath
Definition: Religion.cs:22
virtual string id
Definition: Religion.cs:26
static RenderParam shared
Definition: RenderParam.cs:5
bool multisize
Definition: RenderRow.cs:64
string[] tag
Definition: RenderRow.cs:58
SourceCategory.Row Category
Definition: RenderRow.cs:119
SourcePref pref
Definition: RenderRow.cs:68
bool HasTag(CTAG _tag)
Definition: RenderRow.cs:125
bool useAltColor
Definition: RenderRow.cs:80
string category
Definition: RenderRow.cs:46
bool useRandomColor
Definition: RenderRow.cs:83
TileType tileType
Definition: RenderRow.cs:77
int[] _tiles
Definition: RenderRow.cs:12
void SetImage(Image image, Sprite sprite=null, int matCol=0, bool setNativeSize=true, int dir=0, int idSkin=0, Card card=null)
Definition: RenderRow.cs:351
int[] tiles
Definition: RenderRow.cs:10
Sprite GetSprite(int dir=0, int skin=0, bool snow=false)
Definition: RenderRow.cs:261
SourceMaterial.Row DefaultMaterial
Definition: RenderRow.cs:86
int colorMod
Definition: RenderRow.cs:16
int LV
Definition: RenderRow.cs:22
bool fixedMaterial
Definition: RenderRow.cs:66
AnimationCurve fovCurveChara
SceneGlobalProfile global
Definition: SceneProfile.cs:6
SceneLightProfile light
Definition: SceneProfile.cs:10
DamageTextRenderer damageTextRenderer
Definition: Scene.cs:109
float timeRatio
Definition: Scene.cs:130
ActionMode actionMode
Definition: Scene.cs:79
SceneProfile profile
Definition: Scene.cs:75
bool isActive
Definition: ScreenGuide.cs:15
MeshPass passGuideBlock
Definition: ScreenGuide.cs:5
bool isFree
Definition: SocketData.cs:54
Type type
Definition: SocketData.cs:18
Dictionary< string, CardRow > map
Definition: SourceCard.cs:8
bool IsChildOf(string id)
string GetText(string id="name", bool returnNull=false)
Definition: SourceData.cs:553
string TryGetId(string id, string id2)
Definition: SourceLang.cs:34
SourceMaterial materials
SourceCard cards
SourceObj objs
SourceBlock blocks
SourceBacker backers
SourceCategory categories
SourceElement elements
SourceChara charas
bool Float
Definition: SourcePref.cs:316
string[] food
Definition: SourceRace.cs:89
virtual bool IsRegion
Definition: Spatial.cs:515
int influence
Definition: Spatial.cs:214
static SpawnList Get(string id, string parent=null, CardFilter filter=null)
Definition: SpawnList.cs:18
CardRow Select(int lv=-1, int levelRange=-1)
Definition: SpawnList.cs:139
SourcePref pref
Definition: SpriteData.cs:23
Sprite GetSprite(bool snow=false)
Definition: SpriteData.cs:67
SpriteData data
static Dictionary< string, SpriteReplacer > dictSkins
virtual void Mod(int a)
Definition: Stats.cs:135
virtual int value
Definition: Stats.cs:56
virtual int max
Definition: Stats.cs:68
static SubPassData Default
Definition: SubPassData.cs:7
string GetTalk(string id, string idTopic, bool useDefault=false, bool human=true)
Definition: TalkDataList.cs:23
string GetRandomID(string tag)
Definition: TalkDataList.cs:58
List< Thing > List(Func< Thing, bool > func, bool onlyAccessible=false)
void SetOwner(Card owner)
Thing Find(int uid)
void OnAdd(Thing t)
Thing TryStack(Thing target, int destInvX=-1, int destInvY=-1)
void AddCurrency(Card owner, string id, int a, SourceMaterial.Row mat=null)
DestData GetDest(Thing t, bool tryStack=true)
void OnRemove(Thing t)
void Foreach(Action< Thing > action, bool onlyAccessible=true)
int GetCurrency(string id, ref int sum, SourceMaterial.Row mat=null)
static Thing CreateFromFilter(string id, int lv=-1)
Definition: ThingGen.cs:63
static Thing CreateFromCategory(string idCat, int lv=-1)
Definition: ThingGen.cs:75
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
void TryLickEnchant(Chara c, bool msg=true, Chara tg=null, BodySlot slot=null)
Definition: Thing.cs:2016
bool CanSearchContents
Definition: Thing.cs:101
override CardRow sourceCard
Definition: Thing.cs:47
int id
Definition: TileRow.cs:8
virtual bool FreeStyle
Definition: TileType.cs:233
virtual void GetMountHeight(ref Vector3 v, Point p, int d, Card target=null)
Definition: TileType.cs:383
virtual int MaxAltitude
Definition: TileType.cs:208
virtual bool UseMountHeight
Definition: TileType.cs:221
static TileTypeDoor Door
Definition: TileType.cs:95
StringBuilder ApplyTone(string id, ref string text, int gender)
Definition: ToneDataList.cs:11
string GetToneID(string id, int gender)
Definition: ToneDataList.cs:58
SourceElement.Row source
Definition: TraitMod.cs:11
static Thing MakeRandomSeed(bool enc=false)
Definition: TraitSeed.cs:192
Definition: Trait.cs:7
virtual bool CanBeAttacked
Definition: Trait.cs:167
virtual bool ShouldRefreshTile
Definition: Trait.cs:77
virtual void OnChangePlaceState(PlaceState state)
Definition: Trait.cs:692
virtual float DropChance
Definition: Trait.cs:361
virtual int GetValue()
Definition: Trait.cs:600
virtual bool CanChildDecay(Card c)
Definition: Trait.cs:1079
virtual bool CanBeDestroyed
Definition: Trait.cs:297
virtual void SetOwner(Card _owner)
Definition: Trait.cs:653
virtual bool HasCharges
Definition: Trait.cs:331
virtual bool IsLightOn
Definition: Trait.cs:416
virtual bool IsDoor
Definition: Trait.cs:58
virtual void Toggle(bool on, bool silent=false)
Definition: Trait.cs:1168
virtual int IdSkin
Definition: Trait.cs:46
virtual void OnSimulateHour(VirtualDate date)
Definition: Trait.cs:704
virtual bool CanBeTeleported
Definition: Trait.cs:169
virtual EffectDead EffectDead
Definition: Trait.cs:253
virtual void OnCreate(int lv)
Definition: Trait.cs:680
virtual ToggleType ToggleType
Definition: Trait.cs:472
virtual bool ShouldTryRefreshRoom
Definition: Trait.cs:88
virtual bool CanBeSmashedToDeath
Definition: Trait.cs:299
virtual bool LevelAsQuality
Definition: Trait.cs:195
virtual int Decay
Definition: Trait.cs:123
void Uninstall()
Definition: Trait.cs:1120
virtual int CompareTo(Card b)
Definition: Trait.cs:732
virtual bool IsContainer
Definition: Trait.cs:215
virtual ThrowType ThrowType
Definition: Trait.cs:251
virtual int InstallBottomPriority
Definition: Trait.cs:90
void Install(bool byPlayer)
Definition: Trait.cs:1100
static void Reserve(string idStep, Action onBeforePlay=null)
Definition: Tutorial.cs:55
Definition: UIList.cs:9
SortMode
Definition: UIList.cs:27
Definition: UINote.cs:6
bool IsRealTime
Definition: VirtualDate.cs:7
static WidgetCurrentTool Instance
static void RefreshCurrentHotItem()
ButtonGrid selectedButton
bool excludeCraft
Definition: Window.cs:379
Definition: Window.cs:13
static Dictionary< string, SaveData > dictData
Definition: Window.cs:594
GameDate date
Definition: World.cs:6
ZoneEventManager events
Definition: Zone.cs:40
bool isStarted
Definition: Zone.cs:73
bool HasField(int idEle)
Definition: Zone.cs:2885
virtual bool IsUserZone
Definition: Zone.cs:271
Chara SpawnMob(string id, Point pos=null)
Definition: Zone.cs:2741
bool TryAddThing(Thing target, Point p, bool destroyIfFail=false)
Definition: Zone.cs:2217
void ModInfluence(int a)
Definition: Zone.cs:3620
override int DangerLv
Definition: Zone.cs:110
bool IsPCFaction
Definition: Zone.cs:473
Card AddCard(Card t, Point point)
Definition: Zone.cs:1977
void RemoveCard(Card c)
void OnChildNumChange(Card c)
ICardParent GetRoot()
NoteMode
Definition: IInspect.cs:7
Definition: ActRef.cs:2
void SetInt(int i)
Definition: BitArray32.cs:89
int ToInt()
Definition: BitArray32.cs:84
bool demo
Definition: Version.cs:14