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