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