summaryrefslogtreecommitdiff
path: root/game/shared/tf/tf_shareddefs.h
blob: 3da03b79c50a701b748a571210412afe2a774f85 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// NOTE: Inserting to most or all of the enums in this file will BREAK DEMOS -
// please add to the end instead.
//
//=============================================================================
#ifndef TF_SHAREDDEFS_H
#define TF_SHAREDDEFS_H
#ifdef _WIN32
#pragma once
#endif

#include "shareddefs.h"
#include "mp_shareddefs.h"
#include "tf_matchmaking_shared.h"

// Using MAP_DEBUG mode?
#ifdef MAP_DEBUG
	#define MDEBUG(x) x
#else
	#define MDEBUG(x)
#endif

		   
#define	MAX_MVM_WAVE_STRING 256


//-----------------------------------------------------------------------------
// Teams.
//-----------------------------------------------------------------------------
enum
{
	TF_TEAM_RED = LAST_SHARED_TEAM+1,
	TF_TEAM_BLUE,
	TF_TEAM_COUNT
};

#define TF_TEAM_AUTOASSIGN (TF_TEAM_COUNT + 1 )

#define TF_TEAM_HALLOWEEN	TF_TEAM_AUTOASSIGN

#define TF_TEAM_PVE_INVADERS	TF_TEAM_BLUE		// invading bot team in mann vs machine
#define TF_TEAM_PVE_DEFENDERS	TF_TEAM_RED			// defending player team in mann vs machine

#define TF_TEAM_PVE_INVADERS_GIANTS 4				// hack for replacing visuals via itemdef

extern const char *g_aTeamNames[TF_TEAM_COUNT];
extern color32 g_aTeamColors[TF_TEAM_COUNT];

#define COLOR_TF_SPECTATOR	Color( 245, 229, 196, 255 )
#define COLOR_TF_RED		Color( 175, 73, 73, 255 )
#define COLOR_TF_BLUE		Color( 79, 117, 143, 255 )

#define CONTENTS_REDTEAM	CONTENTS_TEAM1
#define CONTENTS_BLUETEAM	CONTENTS_TEAM2

enum 
{
	TF_ARENA_NOTIFICATION_CAREFUL = 0,
	TF_ARENA_NOTIFICATION_SITOUT,
	TF_ARENA_NOTIFICATION_NOPLAYERS,
};

// Team roles
enum 
{
	TEAM_ROLE_NONE = 0,
	TEAM_ROLE_DEFENDERS,
	TEAM_ROLE_ATTACKERS,

	NUM_TEAM_ROLES,
};

enum HalloweenBossType
{
	HALLOWEEN_BOSS_INVALID = 0,
	HALLOWEEN_BOSS_HHH = 1,
	HALLOWEEN_BOSS_MONOCULUS = 2,
	HALLOWEEN_BOSS_MERASMUS = 3,
};

// common utility
inline int GetEnemyTeam( int team )
{
	if ( team == TF_TEAM_RED )
		return TF_TEAM_BLUE;

	if ( team == TF_TEAM_BLUE )
		return TF_TEAM_RED;

	// no enemy team
	return team;
}

// Is this a active in-game team, vs spectator/unassigned/special-values/etc.
inline bool BIsGameTeam( int team )
{
	return team >= FIRST_GAME_TEAM;
}

inline bool BAreTeamsEnemies( int team, int otherTeam )
{
	// Right now all game teams are enemies in TF -- We may want to change this in the future for special mechanics/etc.
	return BIsGameTeam( team ) && BIsGameTeam( otherTeam ) && team != otherTeam;
}

enum PowerupBottleType_t
{
	POWERUP_BOTTLE_NONE,

	POWERUP_BOTTLE_CRITBOOST,
	POWERUP_BOTTLE_UBERCHARGE,
	POWERUP_BOTTLE_RECALL,
	POWERUP_BOTTLE_REFILL_AMMO,
	POWERUP_BOTTLE_BUILDINGS_INSTANT_UPGRADE,
	POWERUP_BOTTLE_RADIUS_STEALTH,
#ifdef STAGING_ONLY
	POWERUP_BOTTLE_SEE_CASH_THROUGH_WALL,
#endif

	POWERUP_BOTTLE_TOTAL
};

enum 
{
	MVM_EVENT_POPFILE_NONE = 0,
	MVM_EVENT_POPFILE_HALLOWEEN,

	MVM_EVENT_POPFILE_MAX_TYPES,
};

enum
{
	DRAW_ARROW_UP,
	DRAW_ARROW_LEFT,
	DRAW_ARROW_RIGHT
};

//-----------------------------------------------------------------------------
// CVar replacements
//-----------------------------------------------------------------------------
#define TF_DAMAGE_CRIT_CHANCE				0.02f
#define TF_DAMAGE_CRIT_CHANCE_RAPID			0.02f
#define TF_DAMAGE_CRIT_DURATION_RAPID		2.0f
#define TF_DAMAGE_CRIT_CHANCE_MELEE			0.15f

#define TF_DAMAGE_CRITMOD_MAXTIME			20
#define TF_DAMAGE_CRITMOD_MINTIME			2
#define TF_DAMAGE_CRITMOD_DAMAGE			800
#define TF_DAMAGE_CRITMOD_MAXMULT			6

#define TF_DAMAGE_CRIT_MULTIPLIER			3.0f
#define TF_DAMAGE_MINICRIT_MULTIPLIER		1.35f

//-----------------------------------------------------------------------------
// TF-specific viewport panels
//-----------------------------------------------------------------------------
#define PANEL_CLASS_BLUE		"class_blue"
#define PANEL_CLASS_RED			"class_red"
#define PANEL_MAPINFO			"mapinfo"
#define PANEL_ROUNDINFO			"roundinfo"

#define PANEL_CHARACTER_INFO	"character_info"

#define PANEL_ARENA_WIN		"arenawinpanel"
#define PANEL_ARENA_TEAM	"arenateampanel"

#define PANEL_PVE_WIN		"pvewinpanel"

#define PANEL_GIVEAWAY_ITEM		"giveaway_item"

#define PANEL_MAINMENUOVERRIDE	"MainMenuOverride"

#define PANEL_QUEST_LOG				"QuestLog"

// file we'll save our list of viewed intro movies in
#define MOVIES_FILE				"viewed.res"

#define TF_WEAPON_TAUNT_FRONTIER_JUSTICE_GUITAR_MODEL	"models/player/items/engineer/guitar.mdl"

//-----------------------------------------------------------------------------
// Used in calculating the health percentage of a player
//-----------------------------------------------------------------------------
#define TF_HEALTH_UNDEFINED		1

//-----------------------------------------------------------------------------
// Used to mark a spy's disguise attribute (team or class) as "unused"
//-----------------------------------------------------------------------------
#define TF_SPY_UNDEFINED		TEAM_UNASSIGNED

//-----------------------------------------------------------------------------
// Player Classes.
//-----------------------------------------------------------------------------
#define TF_CLASS_COUNT			( TF_CLASS_COUNT_ALL )

#define TF_FIRST_NORMAL_CLASS	( TF_CLASS_UNDEFINED + 1 )
#define TF_LAST_NORMAL_CLASS	( TF_CLASS_CIVILIAN )

#define	TF_CLASS_MENU_BUTTONS	( TF_CLASS_RANDOM + 1 )

enum
{
	TF_CLASS_UNDEFINED = 0,

	TF_CLASS_SCOUT,			// TF_FIRST_NORMAL_CLASS
    TF_CLASS_SNIPER,
    TF_CLASS_SOLDIER,
	TF_CLASS_DEMOMAN,
	TF_CLASS_MEDIC,
	TF_CLASS_HEAVYWEAPONS,
	TF_CLASS_PYRO,
	TF_CLASS_SPY,
	TF_CLASS_ENGINEER,		

	// Add any new classes after Engineer
	TF_CLASS_CIVILIAN,		// TF_LAST_NORMAL_CLASS
	TF_CLASS_COUNT_ALL,

	TF_CLASS_RANDOM
};

inline bool IsValidTFPlayerClass( int iClass ) { return iClass >= TF_FIRST_NORMAL_CLASS && iClass < TF_LAST_NORMAL_CLASS; }
inline bool IsValidTFTeam( int iTeam ) { return iTeam == TF_TEAM_RED || iTeam == TF_TEAM_BLUE; }

#define FOR_EACH_NORMAL_PLAYER_CLASS( _i ) for ( int _i = TF_FIRST_NORMAL_CLASS; _i < TF_LAST_NORMAL_CLASS; _i++ )

extern const char *g_aPlayerClassNames[TF_CLASS_MENU_BUTTONS];				// localization keys
extern const char *g_aPlayerClassNames_NonLocalized[TF_CLASS_MENU_BUTTONS];	// non-localized class names
extern const char *g_aRawPlayerClassNamesShort[TF_CLASS_MENU_BUTTONS];		// raw class names, useful for formatting resource/material filenames - "heavy" instead of "heavyweapons" and "demo" instead of "demoman"
extern const char *g_aRawPlayerClassNames[TF_CLASS_MENU_BUTTONS];			// raw class names, useful for formatting resource/material filenames

extern const char g_szPlayerRobotModels[TF_LAST_NORMAL_CLASS][ MAX_PATH ];

extern const char g_szBotModels[TF_LAST_NORMAL_CLASS][ MAX_PATH ];
extern const char g_szBotBossModels[TF_LAST_NORMAL_CLASS][ MAX_PATH ];
extern const char g_szBotBossSentryBusterModel[ MAX_PATH ];

extern const char g_szRomePromoItems_Hat[TF_LAST_NORMAL_CLASS][ MAX_PATH ];
extern const char g_szRomePromoItems_Misc[TF_LAST_NORMAL_CLASS][ MAX_PATH ];

int GetClassIndexFromString( const char *pClassName, int nLastClassIndex = TF_LAST_NORMAL_CLASS );

// menu buttons are not in the same order as the defines
extern int iRemapIndexToClass[TF_CLASS_MENU_BUTTONS];
int GetRemappedMenuIndexForClass( int iClass );

extern const char *g_pszBreadModels[];

//-----------------------------------------------------------------------------
// For entity_capture_flags to use when placed in the world
// NOTE: Inserting to most or all of the enums in this file will BREAK DEMOS -
// please add to the end instead.
//-----------------------------------------------------------------------------
enum ETFFlagType
{
	TF_FLAGTYPE_CTF = 0,
	TF_FLAGTYPE_ATTACK_DEFEND,
	TF_FLAGTYPE_TERRITORY_CONTROL,
	TF_FLAGTYPE_INVADE,
	TF_FLAGTYPE_RESOURCE_CONTROL,
	TF_FLAGTYPE_ROBOT_DESTRUCTION,
	TF_FLAGTYPE_PLAYER_DESTRUCTION

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

//-----------------------------------------------------------------------------
// For the game rules to determine which type of game we're playing
//
// NOTE: Inserting to most or all of the enums in this file will BREAK DEMOS -
// please add to the end instead.
//-----------------------------------------------------------------------------
enum ETFGameType
{
	TF_GAMETYPE_UNDEFINED = 0,
	TF_GAMETYPE_CTF,
	TF_GAMETYPE_CP,
	TF_GAMETYPE_ESCORT,
	TF_GAMETYPE_ARENA,
	TF_GAMETYPE_MVM,
	TF_GAMETYPE_RD,
	TF_GAMETYPE_PASSTIME,
	TF_GAMETYPE_PD,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
	TF_GAMETYPE_COUNT
};
const char *GetGameTypeName( ETFGameType gameType );
const char *GetEnumGameTypeName( ETFGameType gameType );
ETFGameType GetGameTypeFromName( const char *pszGameType );

//=============================================================================
// HPE_BEGIN:
// [msmith]	Added a HUD type so that we can have the hud independent from the
//			game type.  This is useful in training where we want a training hud
//			Instead of the other types of HUD.
//=============================================================================
enum
{
	TF_HUDTYPE_UNDEFINED = 0,
	TF_HUDTYPE_CTF,
	TF_HUDTYPE_CP,
	TF_HUDTYPE_ESCORT,
	TF_HUDTYPE_ARENA,
	TF_HUDTYPE_TRAINING,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};
//=============================================================================
// HPE_END
//=============================================================================

//-----------------------------------------------------------------------------
// Buildings.
//-----------------------------------------------------------------------------
enum
{
	TF_BUILDING_SENTRY				= (1<<0),
	TF_BUILDING_DISPENSER			= (1<<1),
	TF_BUILDING_TELEPORT			= (1<<2),

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

//-----------------------------------------------------------------------------
// Items.
//-----------------------------------------------------------------------------
enum
{
	TF_ITEM_UNDEFINED		= 0,
	TF_ITEM_CAPTURE_FLAG	= (1<<0),
	TF_ITEM_HEALTH_KIT		= (1<<1),
	TF_ITEM_ARMOR			= (1<<2),
	TF_ITEM_AMMO_PACK		= (1<<3),
	TF_ITEM_GRENADE_PACK	= (1<<4),

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

//-----------------------------------------------------------------------------
// Ammo.
//-----------------------------------------------------------------------------
enum ETFAmmoType
{
	TF_AMMO_DUMMY = 0,	// Dummy index to make the CAmmoDef indices correct for the other ammo types.
	TF_AMMO_PRIMARY,
	TF_AMMO_SECONDARY,
	TF_AMMO_METAL,
	TF_AMMO_GRENADES1,
	TF_AMMO_GRENADES2,
	TF_AMMO_GRENADES3,	// Utility Slot Grenades
	TF_AMMO_COUNT,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};
const char *GetAmmoName( int iAmmoType );

//-----------------------------------------------------------------------------
// Weapons.
//-----------------------------------------------------------------------------
#define TF_PLAYER_WEAPON_COUNT		6
#define TF_PLAYER_GRENADE_COUNT		2
#define TF_PLAYER_BUILDABLE_COUNT	3
#define TF_PLAYER_BLUEPRINT_COUNT	6

#define TF_WEAPON_PRIMARY_MODE		0
#define TF_WEAPON_SECONDARY_MODE	1

#define TF_WEAPON_GRENADE_FRICTION						0.6f
#define TF_WEAPON_GRENADE_GRAVITY						0.81f
#define TF_WEAPON_GRENADE_INITPRIME						0.8f
#define TF_WEAPON_GRENADE_CONCUSSION_TIME				15.0f
#define TF_WEAPON_GRENADE_MIRV_BOMB_COUNT				4
#define TF_WEAPON_GRENADE_CALTROP_TIME					8.0f

#define TF_WEAPON_PIPEBOMB_WORLD_COUNT					15
#define TF_WEAPON_PIPEBOMB_COUNT						8
#define TF_WEAPON_PIPEBOMB_INTERVAL						0.6f

#define TF_WEAPON_ROCKET_INTERVAL						0.8f

#define TF_WEAPON_FLAMETHROWER_INTERVAL					0.15f
#define TF_WEAPON_FLAMETHROWER_ROCKET_INTERVAL			0.8f

#define TF_WEAPON_ZOOM_FOV								20

//
// NOTE: Inserting to most or all of the enums in this file will BREAK DEMOS -
// please add to the end instead.
//
enum ETFWeaponType
{
	TF_WEAPON_NONE = 0,
	TF_WEAPON_BAT,
	TF_WEAPON_BAT_WOOD,
	TF_WEAPON_BOTTLE, 
	TF_WEAPON_FIREAXE,
	TF_WEAPON_CLUB,
	TF_WEAPON_CROWBAR,
	TF_WEAPON_KNIFE,
	TF_WEAPON_FISTS,
	TF_WEAPON_SHOVEL,
	TF_WEAPON_WRENCH,
	TF_WEAPON_BONESAW,
	TF_WEAPON_SHOTGUN_PRIMARY,
	TF_WEAPON_SHOTGUN_SOLDIER,
	TF_WEAPON_SHOTGUN_HWG,
	TF_WEAPON_SHOTGUN_PYRO,
	TF_WEAPON_SCATTERGUN,
	TF_WEAPON_SNIPERRIFLE,
	TF_WEAPON_MINIGUN,
	TF_WEAPON_SMG,
	TF_WEAPON_SYRINGEGUN_MEDIC,
	TF_WEAPON_TRANQ,
	TF_WEAPON_ROCKETLAUNCHER,
	TF_WEAPON_GRENADELAUNCHER,
	TF_WEAPON_PIPEBOMBLAUNCHER,
	TF_WEAPON_FLAMETHROWER,
	TF_WEAPON_GRENADE_NORMAL,
	TF_WEAPON_GRENADE_CONCUSSION,
	TF_WEAPON_GRENADE_NAIL,
	TF_WEAPON_GRENADE_MIRV,
	TF_WEAPON_GRENADE_MIRV_DEMOMAN,
	TF_WEAPON_GRENADE_NAPALM,
	TF_WEAPON_GRENADE_GAS,
	TF_WEAPON_GRENADE_EMP,
	TF_WEAPON_GRENADE_CALTROP,
	TF_WEAPON_GRENADE_PIPEBOMB,
	TF_WEAPON_GRENADE_SMOKE_BOMB,
	TF_WEAPON_GRENADE_HEAL,
	TF_WEAPON_GRENADE_STUNBALL,
	TF_WEAPON_GRENADE_JAR,
	TF_WEAPON_GRENADE_JAR_MILK,
	TF_WEAPON_PISTOL,
	TF_WEAPON_PISTOL_SCOUT,
	TF_WEAPON_REVOLVER,
	TF_WEAPON_NAILGUN,
	TF_WEAPON_PDA,
	TF_WEAPON_PDA_ENGINEER_BUILD,
	TF_WEAPON_PDA_ENGINEER_DESTROY,
	TF_WEAPON_PDA_SPY,
	TF_WEAPON_BUILDER,
	TF_WEAPON_MEDIGUN,
	TF_WEAPON_GRENADE_MIRVBOMB,
	TF_WEAPON_FLAMETHROWER_ROCKET,
	TF_WEAPON_GRENADE_DEMOMAN,
	TF_WEAPON_SENTRY_BULLET,
	TF_WEAPON_SENTRY_ROCKET,
	TF_WEAPON_DISPENSER,
	TF_WEAPON_INVIS,
	TF_WEAPON_FLAREGUN,
	TF_WEAPON_LUNCHBOX,
	TF_WEAPON_JAR,
	TF_WEAPON_COMPOUND_BOW,
	TF_WEAPON_BUFF_ITEM,
	TF_WEAPON_PUMPKIN_BOMB,
	TF_WEAPON_SWORD, 
	TF_WEAPON_ROCKETLAUNCHER_DIRECTHIT,
	TF_WEAPON_LIFELINE,
	TF_WEAPON_LASER_POINTER,
	TF_WEAPON_DISPENSER_GUN,
	TF_WEAPON_SENTRY_REVENGE,
	TF_WEAPON_JAR_MILK,
	TF_WEAPON_HANDGUN_SCOUT_PRIMARY,
	TF_WEAPON_BAT_FISH,
	TF_WEAPON_CROSSBOW,
	TF_WEAPON_STICKBOMB,
	TF_WEAPON_HANDGUN_SCOUT_SECONDARY,
	TF_WEAPON_SODA_POPPER,
	TF_WEAPON_SNIPERRIFLE_DECAP,
	TF_WEAPON_RAYGUN,
	TF_WEAPON_PARTICLE_CANNON,
	TF_WEAPON_MECHANICAL_ARM,
	TF_WEAPON_DRG_POMSON,
	TF_WEAPON_BAT_GIFTWRAP,
	TF_WEAPON_GRENADE_ORNAMENT_BALL,
	TF_WEAPON_FLAREGUN_REVENGE,
	TF_WEAPON_PEP_BRAWLER_BLASTER,
	TF_WEAPON_CLEAVER,
	TF_WEAPON_GRENADE_CLEAVER,
	TF_WEAPON_STICKY_BALL_LAUNCHER,
	TF_WEAPON_GRENADE_STICKY_BALL,
	TF_WEAPON_SHOTGUN_BUILDING_RESCUE,
	TF_WEAPON_CANNON,
	TF_WEAPON_THROWABLE,
	TF_WEAPON_GRENADE_THROWABLE,
	TF_WEAPON_PDA_SPY_BUILD,
	TF_WEAPON_GRENADE_WATERBALLOON,
	TF_WEAPON_HARVESTER_SAW,
	TF_WEAPON_SPELLBOOK,
	TF_WEAPON_SPELLBOOK_PROJECTILE,
	TF_WEAPON_SNIPERRIFLE_CLASSIC,
	TF_WEAPON_PARACHUTE,
	TF_WEAPON_GRAPPLINGHOOK,
	TF_WEAPON_PASSTIME_GUN,
#ifdef STAGING_ONLY
	TF_WEAPON_SNIPERRIFLE_REVOLVER,
#endif

	TF_WEAPON_CHARGED_SMG,

	//
	// ADD NEW WEAPONS HERE TO AVOID BREAKING DEMOS
	//

	TF_WEAPON_COUNT
};

extern const char *g_aWeaponNames[TF_WEAPON_COUNT];
extern int g_aWeaponDamageTypes[TF_WEAPON_COUNT];

int GetWeaponId( const char *pszWeaponName );
#ifdef GAME_DLL
int GetWeaponFromDamage( const CTakeDamageInfo &info );
#endif
int GetBuildableId( const char *pszBuildableName );
const char *WeaponIdToAlias( int iWeapon );

// Only TF specific classes that derives from CBaseProjectile should OVERRIDE GetBaseProjectileType()
enum BaseProjectileType_t
{
	TF_BASE_PROJECTILE_GRENADE, // CTFWeaponBaseGrenadeProj

	// add new entries here!
};

// Item definitions look into this array by hard-coded indices, so do not add entries
// anywhere except the end!
enum ProjectileType_t
{
	TF_PROJECTILE_NONE,
	TF_PROJECTILE_BULLET,
	TF_PROJECTILE_ROCKET,
	TF_PROJECTILE_PIPEBOMB,
	TF_PROJECTILE_PIPEBOMB_REMOTE,
	TF_PROJECTILE_SYRINGE,
	TF_PROJECTILE_FLARE,
	TF_PROJECTILE_JAR,
	TF_PROJECTILE_ARROW,
	TF_PROJECTILE_FLAME_ROCKET,
	TF_PROJECTILE_JAR_MILK,
	TF_PROJECTILE_HEALING_BOLT,
	TF_PROJECTILE_ENERGY_BALL,
	TF_PROJECTILE_ENERGY_RING,
	TF_PROJECTILE_PIPEBOMB_PRACTICE,
	TF_PROJECTILE_CLEAVER,
	TF_PROJECTILE_STICKY_BALL,
	TF_PROJECTILE_CANNONBALL,
	TF_PROJECTILE_BUILDING_REPAIR_BOLT,
	TF_PROJECTILE_FESTIVE_ARROW,
	TF_PROJECTILE_THROWABLE,
	TF_PROJECTILE_SPELL,
	TF_PROJECTILE_FESTIVE_JAR,
	TF_PROJECTILE_FESTIVE_HEALING_BOLT,
	TF_PROJECTILE_BREADMONSTER_JARATE,
	TF_PROJECTILE_BREADMONSTER_MADMILK,

	TF_PROJECTILE_GRAPPLINGHOOK,
	TF_PROJECTILE_SENTRY_ROCKET,
	TF_PROJECTILE_BREAD_MONSTER,

#ifdef STAGING_ONLY
	// STAGING ONLY
	TF_PROJECTILE_TRANQ,
	TF_PROJECTILE_SNIPERBULLET,
	TF_PROJECTILE_THROWING_KNIFE,
	TF_PROJECTILE_GRENADE_CONCUSSION,
	TF_PROJECTILE_GRENADE_TELEPORT,
	TF_PROJECTILE_MILK_BOLT,
#endif
	// Add new entries here!

	TF_NUM_PROJECTILES
};

extern const char *g_szProjectileNames[];

enum medigun_charge_types
{
	MEDIGUN_CHARGE_INVALID = -1,
	MEDIGUN_CHARGE_INVULN = 0,
	MEDIGUN_CHARGE_CRITICALBOOST,
	MEDIGUN_CHARGE_MEGAHEAL,
	MEDIGUN_CHARGE_BULLET_RESIST,
	MEDIGUN_CHARGE_BLAST_RESIST,
	MEDIGUN_CHARGE_FIRE_RESIST,

	MEDIGUN_NUM_CHARGE_TYPES,
};

enum arrow_models
{
	MODEL_ARROW_REGULAR,
	MODEL_ARROW_BUILDING_REPAIR,
	MODEL_SNOWBALL,
	MODEL_FESTIVE_ARROW_REGULAR,
	MODEL_SYRINGE,
	MODEL_FESTIVE_HEALING_BOLT,
	MODEL_BREAD_MONSTER,
	MODEL_GRAPPLINGHOOK,

	// Staging
	MODEL_THROWING_KNIFE,

	TF_ARROW_MODEL_COUNT
};

extern const char *g_pszArrowModels[];

//-----------------------------------------------------------------------------
// Dead Calling Cards
//-----------------------------------------------------------------------------
enum death_calling_card_models
{
	CALLING_CARD_NONE = 0,			// Empty at zero
	CALLING_CARD_MILKMAN = 1,	// Scout PolyCount Set
	CALLING_CARD_CROC,			// Sniper PolyCount Set
	CALLING_CARD_TANKBUSTER,	// Solider PolyCount Set
	CALLING_CARD_GASJOCKEY,		// Pyro PolyCount Set 

	TF_CALLING_CARD_MODEL_COUNT
};
extern const char *g_pszDeathCallingCardModels[TF_CALLING_CARD_MODEL_COUNT];

#ifdef TF_CLIENT_DLL
extern const char *g_pszInvasionMaps[];
bool IsPlayingInvasionMap( void );

#define SCOREBOARD_DOMINATION_ICONS		17
#define SCOREBOARD_CLASS_ICONS			19
#define SCOREBOARD_PING_ICONS			6

extern const char *g_pszClassIcons[];

extern const char *g_pszClassIconsAlt[];

extern const char *g_pszCompetitiveMedalImages[];

extern const char *g_pszItemClassImagesRed[];

extern const char *g_pszItemClassImagesBlue[];

#endif // TF_CLIENT_DLL

//-----------------------------------------------------------------------------
// Attributes.
//-----------------------------------------------------------------------------
#define TF_PLAYER_VIEW_OFFSET	Vector( 0, 0, 64.0 ) //--> see GetViewVectors()

//-----------------------------------------------------------------------------
// TF Player Condition.
//-----------------------------------------------------------------------------

// Burning
#define TF_BURNING_FREQUENCY		0.5f
#define TF_BURNING_FLAME_LIFE		10.0
#define TF_BURNING_FLAME_LIFE_PYRO	0.25		// pyro only displays burning effect momentarily
#define TF_BURNING_FLAME_LIFE_FLARE 10.0
#define TF_BURNING_FLAME_LIFE_PLASMA 6.0
#define TF_BURNING_DMG				3

// Bleeding
#define TF_BLEEDING_FREQUENCY		0.5f
#define TF_BLEEDING_DMG				4

// disguising
#define TF_TIME_TO_DISGUISE			2.0f
#define TF_TIME_TO_QUICK_DISGUISE	0.5f
#define TF_TIME_TO_SHOW_DISGUISED_FINISHED_EFFECT 5.0

// phasing

#define TF_SCOUT_NUMBEROFPHASEATTACHMENTS	5

#define SHOW_DISGUISE_EFFECT 1
#define TF_DISGUISE_TARGET_INDEX_NONE	( MAX_PLAYERS + 1 )
#define TF_PLAYER_INDEX_NONE			( MAX_PLAYERS + 1 )

//
// ADD NEW WEAPONS HERE TO AVOID BREAKING DEMOS
//
enum ETFCond
{
	TF_COND_INVALID = -1,
	TF_COND_AIMING = 0,		// Sniper aiming, Heavy minigun.
	TF_COND_ZOOMED,
	TF_COND_DISGUISING,
	TF_COND_DISGUISED,
	TF_COND_STEALTHED,		// Spy specific
	TF_COND_INVULNERABLE,
	TF_COND_TELEPORTED,
	TF_COND_TAUNTING,
	TF_COND_INVULNERABLE_WEARINGOFF,
	TF_COND_STEALTHED_BLINK,
	TF_COND_SELECTED_TO_TELEPORT,
	TF_COND_CRITBOOSTED,	// DO NOT RE-USE THIS -- THIS IS FOR KRITZKRIEG AND REVENGE CRITS ONLY
	TF_COND_TMPDAMAGEBONUS,
	TF_COND_FEIGN_DEATH,
	TF_COND_PHASE,
	TF_COND_STUNNED,		// Any type of stun. Check iStunFlags for more info.
	TF_COND_OFFENSEBUFF,
	TF_COND_SHIELD_CHARGE,
	TF_COND_DEMO_BUFF,
	TF_COND_ENERGY_BUFF,
	TF_COND_RADIUSHEAL,
	TF_COND_HEALTH_BUFF,
	TF_COND_BURNING,
	TF_COND_HEALTH_OVERHEALED,
	TF_COND_URINE,
	TF_COND_BLEEDING,
	TF_COND_DEFENSEBUFF,	// 35% defense! No crit damage.
	TF_COND_MAD_MILK,
	TF_COND_MEGAHEAL,
	TF_COND_REGENONDAMAGEBUFF,
	TF_COND_MARKEDFORDEATH,
	TF_COND_NOHEALINGDAMAGEBUFF,
	TF_COND_SPEED_BOOST,				// = 32
	TF_COND_CRITBOOSTED_PUMPKIN,		// Brandon hates bits
	TF_COND_CRITBOOSTED_USER_BUFF,
	TF_COND_CRITBOOSTED_DEMO_CHARGE,
	TF_COND_SODAPOPPER_HYPE,
	TF_COND_CRITBOOSTED_FIRST_BLOOD,	// arena mode first blood
	TF_COND_CRITBOOSTED_BONUS_TIME,
	TF_COND_CRITBOOSTED_CTF_CAPTURE,
	TF_COND_CRITBOOSTED_ON_KILL,		// =40. KGB, etc.
	TF_COND_CANNOT_SWITCH_FROM_MELEE,
	TF_COND_DEFENSEBUFF_NO_CRIT_BLOCK,	// 35% defense! Still damaged by crits.
	TF_COND_REPROGRAMMED,				// Bots only
	TF_COND_CRITBOOSTED_RAGE_BUFF,
	TF_COND_DEFENSEBUFF_HIGH,			// 75% defense! Still damaged by crits.
	TF_COND_SNIPERCHARGE_RAGE_BUFF,		// Sniper Rage - Charge time speed up
	TF_COND_DISGUISE_WEARINGOFF,		// Applied for half-second post-disguise
	TF_COND_MARKEDFORDEATH_SILENT,		// Sans sound
	TF_COND_DISGUISED_AS_DISPENSER,
	TF_COND_SAPPED,						// =50. Bots only
	TF_COND_INVULNERABLE_HIDE_UNLESS_DAMAGED,
	TF_COND_INVULNERABLE_USER_BUFF,
	TF_COND_HALLOWEEN_BOMB_HEAD,
	TF_COND_HALLOWEEN_THRILLER,
	TF_COND_RADIUSHEAL_ON_DAMAGE,
	TF_COND_CRITBOOSTED_CARD_EFFECT,
	TF_COND_INVULNERABLE_CARD_EFFECT,
	TF_COND_MEDIGUN_UBER_BULLET_RESIST,
	TF_COND_MEDIGUN_UBER_BLAST_RESIST,
	TF_COND_MEDIGUN_UBER_FIRE_RESIST,		// =60
	TF_COND_MEDIGUN_SMALL_BULLET_RESIST,
	TF_COND_MEDIGUN_SMALL_BLAST_RESIST,
	TF_COND_MEDIGUN_SMALL_FIRE_RESIST,
	TF_COND_STEALTHED_USER_BUFF,			// Any class can have this
	TF_COND_MEDIGUN_DEBUFF,
	TF_COND_STEALTHED_USER_BUFF_FADING,
	TF_COND_BULLET_IMMUNE,
	TF_COND_BLAST_IMMUNE,
	TF_COND_FIRE_IMMUNE,
	TF_COND_PREVENT_DEATH,					// =70
	TF_COND_MVM_BOT_STUN_RADIOWAVE, 		// Bots only
	TF_COND_HALLOWEEN_SPEED_BOOST,
	TF_COND_HALLOWEEN_QUICK_HEAL,
	TF_COND_HALLOWEEN_GIANT,
	TF_COND_HALLOWEEN_TINY,
	TF_COND_HALLOWEEN_IN_HELL,
	TF_COND_HALLOWEEN_GHOST_MODE,			// =77
	TF_COND_MINICRITBOOSTED_ON_KILL,
	TF_COND_OBSCURED_SMOKE,
	TF_COND_PARACHUTE_DEPLOYED,				// =80
	TF_COND_BLASTJUMPING,
	TF_COND_HALLOWEEN_KART,
	TF_COND_HALLOWEEN_KART_DASH,
	TF_COND_BALLOON_HEAD,					// =84 larger head, lower-gravity-feeling jumps
	TF_COND_MELEE_ONLY,						// =85 melee only
	TF_COND_SWIMMING_CURSE,					// player movement become swimming movement
	TF_COND_FREEZE_INPUT,					// freezes player input
	TF_COND_HALLOWEEN_KART_CAGE,			// attach cage model to player while in kart
	TF_COND_DONOTUSE_0,
	TF_COND_RUNE_STRENGTH,
	TF_COND_RUNE_HASTE,
	TF_COND_RUNE_REGEN,
	TF_COND_RUNE_RESIST,
	TF_COND_RUNE_VAMPIRE,
	TF_COND_RUNE_REFLECT,
	TF_COND_RUNE_PRECISION,
	TF_COND_RUNE_AGILITY,
	TF_COND_GRAPPLINGHOOK,
	TF_COND_GRAPPLINGHOOK_SAFEFALL,
	TF_COND_GRAPPLINGHOOK_LATCHED,
	TF_COND_GRAPPLINGHOOK_BLEEDING,
	TF_COND_AFTERBURN_IMMUNE,
	TF_COND_RUNE_KNOCKOUT,
	TF_COND_RUNE_IMBALANCE,
	TF_COND_CRITBOOSTED_RUNE_TEMP,
	TF_COND_PASSTIME_INTERCEPTION,
	TF_COND_SWIMMING_NO_EFFECTS,			// =107_DNOC_FT
	TF_COND_PURGATORY,
	TF_COND_RUNE_KING,
	TF_COND_RUNE_PLAGUE,
	TF_COND_RUNE_SUPERNOVA,
	TF_COND_PLAGUE,
	TF_COND_KING_BUFFED,
	TF_COND_TEAM_GLOWS,						// used to show team glows to living players
	TF_COND_KNOCKED_INTO_AIR,
	TF_COND_COMPETITIVE_WINNER,
	TF_COND_COMPETITIVE_LOSER,
	TF_COND_HEALING_DEBUFF,
	TF_COND_PASSTIME_PENALTY_DEBUFF,		// when carrying the ball without any teammates nearby	
	TF_COND_GRAPPLED_TO_PLAYER,
	TF_COND_GRAPPLED_BY_PLAYER,
	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	// ******** Keep this block last! ********
	// Keep experimental conditions below and graduate out of it before shipping
#ifdef STAGING_ONLY
	TF_COND_NO_COMBAT_SPEED_BOOST,		// STAGING_ENGY
	TF_COND_TRANQ_SPY_BOOST,			// STAGING_SPY
	TF_COND_TRANQ_MARKED,
//	TF_COND_SPACE_GRAVITY,
//	TF_COND_SELF_CONC,
	TF_COND_ROCKETPACK,
	TF_COND_STEALTHED_PHASE,  	
	TF_COND_CLIP_OVERLOAD,
	TF_COND_SPY_CLASS_STEAL,
#endif // STAGING_ONLY

	TF_COND_LAST
};

const char *GetTFConditionName( ETFCond eCond );
ETFCond GetTFConditionFromName( const char *pszCondName );

// If you want your condition to expire faster under healing,
// add it to this function in tf_shareddefs.cpp
bool ConditionExpiresFast( ETFCond eCond );

// Some attributes specify conditions to be or'd. The problem there is that if we add conditions
// to the above list, they get hosed. So we maintain this separate list as a translation table.
// When you add conditions to the above list, add them TO THE BOTTOM of this list.
extern ETFCond condition_to_attribute_translation[];

extern ETFCond g_aDebuffConditions[];
//-----------------------------------------------------------------------------
// TF Player State.
//-----------------------------------------------------------------------------
enum 
{
	TF_STATE_ACTIVE = 0,		// Happily running around in the game.
	TF_STATE_WELCOME,			// First entering the server (shows level intro screen).
	TF_STATE_OBSERVER,			// Game observer mode.
	TF_STATE_DYING,				// Player is dying.
	TF_STATE_COUNT

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

//-----------------------------------------------------------------------------
// TF FlagInfo State.
//-----------------------------------------------------------------------------
#define TF_FLAGINFO_HOME		0
#define TF_FLAGINFO_STOLEN		(1<<0)
#define TF_FLAGINFO_DROPPED		(1<<1)

enum ETFFlagEventTypes
{
	TF_FLAGEVENT_PICKUP = 1,
	TF_FLAGEVENT_CAPTURE,
	TF_FLAGEVENT_DEFEND,
	TF_FLAGEVENT_DROPPED,
	TF_FLAGEVENT_RETURNED,

	
	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
	TF_NUM_FLAG_EVENTS
};

const char *GetCTFEventName( ETFFlagEventTypes iEventType );
ETFFlagEventTypes GetCTFEventTypeFromName( const char *pszName );

//-----------------------------------------------------------------------------
// TF Robot Destruction Score Methods
//-----------------------------------------------------------------------------
enum RDScoreMethod_t
{
	SCORE_UNDEFINED = -1,
	SCORE_REACTOR_CAPTURED,
	SCORE_CORES_COLLECTED,
	SCORE_REACTOR_RETURNED,
	SCORE_REACTOR_STEAL,
		
	NUM_SCORE_TYPES
};

const char *GetRDScoreMethodName( RDScoreMethod_t iScoreMethod );
RDScoreMethod_t GetRDScoreMethodFromName( const char *pszName );

//-----------------------------------------------------------------------------
// Class data
//-----------------------------------------------------------------------------
#define TF_REGEN_TIME			1.0			// Number of seconds between each regen.
#define TF_REGEN_AMOUNT			3 			// Amount of health regenerated each regen.
#define TF_REGEN_TIME_RUNE		0.25		// Number of seconds between each regen generated by a powerup.

//-----------------------------------------------------------------------------
// Assist-damage constants
//-----------------------------------------------------------------------------
#define TF_TIME_ASSIST_KILL				3.0f	// Time window for a recent damager to get credit for an assist for a kill
#define TF_TIME_SUICIDE_KILL_CREDIT		10.0f	// Time window for a recent damager to get credit for a kill if target suicides

//-----------------------------------------------------------------------------
// Domination/nemesis constants
//-----------------------------------------------------------------------------
#define TF_KILLS_DOMINATION				4		// # of unanswered kills to dominate another player

//-----------------------------------------------------------------------------
// Taunt attacks
//-----------------------------------------------------------------------------
enum taunt_attack_t
{
	TAUNTATK_NONE = 0,
	TAUNTATK_PYRO_HADOUKEN,
	TAUNTATK_HEAVY_EAT,
	TAUNTATK_HEAVY_RADIAL_BUFF,
	TAUNTATK_HEAVY_HIGH_NOON,
	TAUNTATK_SCOUT_DRINK,
	TAUNTATK_SCOUT_GRAND_SLAM,
	TAUNTATK_MEDIC_INHALE,
	TAUNTATK_SPY_FENCING_SLASH_A,
	TAUNTATK_SPY_FENCING_SLASH_B,
	TAUNTATK_SPY_FENCING_STAB,
	TAUNTATK_RPS_KILL,
	TAUNTATK_SNIPER_ARROW_STAB_IMPALE,
	TAUNTATK_SNIPER_ARROW_STAB_KILL,
	TAUNTATK_SOLDIER_GRENADE_KILL,
	TAUNTATK_DEMOMAN_BARBARIAN_SWING,
	TAUNTATK_MEDIC_UBERSLICE_IMPALE,
	TAUNTATK_MEDIC_UBERSLICE_KILL,
	TAUNTATK_FLIP_LAND_PARTICLE,
	TAUNTATK_RPS_PARTICLE,
	TAUNTATK_HIGHFIVE_PARTICLE,
	TAUNTATK_ENGINEER_GUITAR_SMASH,
	TAUNTATK_ENGINEER_ARM_IMPALE,
	TAUNTATK_ENGINEER_ARM_KILL,
	TAUNTATK_ENGINEER_ARM_BLEND,
	TAUNTATK_SOLDIER_GRENADE_KILL_WORMSIGN,
	TAUNTATK_SHOW_ITEM,
	TAUNTATK_MEDIC_RELEASE_DOVES,
	TAUNTATK_PYRO_ARMAGEDDON,
	TAUNTATK_PYRO_SCORCHSHOT,
	TAUNTATK_ALLCLASS_GUITAR_RIFF,
	TAUNTATK_MEDIC_HEROIC_TAUNT,

	//
	// INSERT NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	TAUNTATK_COUNT
};

taunt_attack_t GetTauntAttackByName( const char* pszTauntAttackName );

//-----------------------------------------------------------------------------
// TF Hints
//-----------------------------------------------------------------------------
enum
{
	HINT_FRIEND_SEEN = 0,				// #Hint_spotted_a_friend
	HINT_ENEMY_SEEN,					// #Hint_spotted_an_enemy
	HINT_ENEMY_KILLED,					// #Hint_killing_enemies_is_good
	HINT_AMMO_EXHAUSTED,				// #Hint_out_of_ammo
	HINT_TURN_OFF_HINTS,				// #Hint_turn_off_hints
	HINT_PICKUP_AMMO,					// #Hint_pickup_ammo
	HINT_CANNOT_TELE_WITH_FLAG,			// #Hint_Cannot_Teleport_With_Flag
	HINT_CANNOT_CLOAK_WITH_FLAG,		// #Hint_Cannot_Cloak_With_Flag
	HINT_CANNOT_DISGUISE_WITH_FLAG,		// #Hint_Cannot_Disguise_With_Flag
	HINT_CANNOT_ATTACK_WHILE_CLOAKED,	// #Hint_Cannot_Attack_While_Cloaked
	HINT_CLASSMENU,						// #Hint_ClassMenu

	// Grenades
	HINT_GREN_CALTROPS,					// #Hint_gren_caltrops
	HINT_GREN_CONCUSSION,				// #Hint_gren_concussion
	HINT_GREN_EMP,						// #Hint_gren_emp
	HINT_GREN_GAS,						// #Hint_gren_gas
	HINT_GREN_MIRV,						// #Hint_gren_mirv
	HINT_GREN_NAIL,						// #Hint_gren_nail
	HINT_GREN_NAPALM,					// #Hint_gren_napalm
	HINT_GREN_NORMAL,					// #Hint_gren_normal

	// Weapon alt-fires
	HINT_ALTFIRE_SNIPERRIFLE,			// #Hint_altfire_sniperrifle
	HINT_ALTFIRE_FLAMETHROWER,			// #Hint_altfire_flamethrower
	HINT_ALTFIRE_GRENADELAUNCHER,		// #Hint_altfire_grenadelauncher
	HINT_ALTFIRE_PIPEBOMBLAUNCHER,		// #Hint_altfire_pipebomblauncher
	HINT_ALTFIRE_ROTATE_BUILDING,		// #Hint_altfire_rotate_building

	// Class specific
	// Soldier
	HINT_SOLDIER_RPG_RELOAD,			// #Hint_Soldier_rpg_reload

	// Engineer
	HINT_ENGINEER_USE_WRENCH_ONOWN,		// "#Hint_Engineer_use_wrench_onown",
	HINT_ENGINEER_USE_WRENCH_ONOTHER,	// "#Hint_Engineer_use_wrench_onother",
	HINT_ENGINEER_USE_WRENCH_FRIEND,	// "#Hint_Engineer_use_wrench_onfriend",
	HINT_ENGINEER_BUILD_SENTRYGUN,		// "#Hint_Engineer_build_sentrygun"
	HINT_ENGINEER_BUILD_DISPENSER,		// "#Hint_Engineer_build_dispenser"
	HINT_ENGINEER_BUILD_TELEPORTERS,	// "#Hint_Engineer_build_teleporters"
	HINT_ENGINEER_PICKUP_METAL,			// "#Hint_Engineer_pickup_metal"
	HINT_ENGINEER_REPAIR_OBJECT,		// "#Hint_Engineer_repair_object"
	HINT_ENGINEER_METAL_TO_UPGRADE,		// "#Hint_Engineer_metal_to_upgrade"
	HINT_ENGINEER_UPGRADE_SENTRYGUN,	// "#Hint_Engineer_upgrade_sentrygun"

	HINT_OBJECT_HAS_SAPPER,				// "#Hint_object_has_sapper"

	HINT_OBJECT_YOUR_OBJECT_SAPPED,		// "#Hint_object_your_object_sapped"
	HINT_OBJECT_ENEMY_USING_DISPENSER,	// "#Hint_enemy_using_dispenser"
	HINT_OBJECT_ENEMY_USING_TP_ENTRANCE,	// "#Hint_enemy_using_tp_entrance"
	HINT_OBJECT_ENEMY_USING_TP_EXIT,	// "#Hint_enemy_using_tp_exit"

	HINT_CANNOT_PHASE_WITH_FLAG,		// #Hint_Cannot_Phase_With_Flag

	HINT_CANNOT_ATTACK_WHILE_FEIGN_ARMED,	// #Hint_Cannot_Attack_While_Feign_Armed

	HINT_CANNOT_ARM_FEIGN_NOW,			// #Hint_Cannot_Arm_Feign_Now

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	NUM_HINTS
};
extern const char *g_pszHintMessages[];



/*======================*/
//      Menu stuff      //
/*======================*/

#define MENU_DEFAULT				1
#define MENU_TEAM 					2
#define MENU_CLASS 					3
#define MENU_MAPBRIEFING			4
#define MENU_INTRO 					5
#define MENU_CLASSHELP				6
#define MENU_CLASSHELP2 			7
#define MENU_REPEATHELP 			8

#define MENU_SPECHELP				9


#define MENU_SPY					12
#define MENU_SPY_SKIN				13
#define MENU_SPY_COLOR				14
#define MENU_ENGINEER				15
#define MENU_ENGINEER_FIX_DISPENSER	16
#define MENU_ENGINEER_FIX_SENTRYGUN	17
#define MENU_ENGINEER_FIX_MORTAR	18
#define MENU_DISPENSER				19
#define MENU_CLASS_CHANGE			20
#define MENU_TEAM_CHANGE			21

#define MENU_REFRESH_RATE 			25

#define MENU_VOICETWEAK				50

// Additional classes
// NOTE: adding them onto the Class_T's in baseentity.h is cheesy, but so is
// having an #ifdef for each mod in baseentity.h.
#define CLASS_TFGOAL				((Class_T)NUM_AI_CLASSES)
#define CLASS_TFGOAL_TIMER			((Class_T)(NUM_AI_CLASSES+1))
#define CLASS_TFGOAL_ITEM			((Class_T)(NUM_AI_CLASSES+2))
#define CLASS_TFSPAWN				((Class_T)(NUM_AI_CLASSES+3))
#define CLASS_MACHINE				((Class_T)(NUM_AI_CLASSES+4))

// TeamFortress State Flags
#define TFSTATE_GRENPRIMED		0x000001 // Whether the player has a primed grenade
#define TFSTATE_RELOADING		0x000002 // Whether the player is reloading
#define TFSTATE_ALTKILL			0x000004 // #TRUE if killed with a weapon not in self.weapon: NOT USED ANYMORE
#define TFSTATE_RANDOMPC		0x000008 // Whether Playerclass is random, new one each respawn
#define TFSTATE_INFECTED		0x000010 // set when player is infected by the bioweapon
#define TFSTATE_INVINCIBLE		0x000020 // Player has permanent Invincibility (Usually by GoalItem)
#define TFSTATE_INVISIBLE		0x000040 // Player has permanent Invisibility (Usually by GoalItem)
#define TFSTATE_QUAD			0x000080 // Player has permanent Quad Damage (Usually by GoalItem)
#define TFSTATE_RADSUIT			0x000100 // Player has permanent Radsuit (Usually by GoalItem)
#define TFSTATE_BURNING			0x000200 // Is on fire
#define TFSTATE_GRENTHROWING	0x000400  // is throwing a grenade
#define TFSTATE_AIMING			0x000800  // is using the laser sight
#define TFSTATE_ZOOMOFF			0x001000  // doesn't want the FOV changed when zooming
#define TFSTATE_RESPAWN_READY	0x002000  // is waiting for respawn, and has pressed fire
#define TFSTATE_HALLUCINATING	0x004000  // set when player is hallucinating
#define TFSTATE_TRANQUILISED	0x008000  // set when player is tranquilised
#define TFSTATE_CANT_MOVE		0x010000  // player isn't allowed to move
#define TFSTATE_RESET_FLAMETIME 0x020000 // set when the player has to have his flames increased in health
#define TFSTATE_HIGHEST_VALUE	TFSTATE_RESET_FLAMETIME

// items
#define IT_SHOTGUN				(1<<0)
#define IT_SUPER_SHOTGUN		(1<<1) 
#define IT_NAILGUN				(1<<2) 
#define IT_SUPER_NAILGUN		(1<<3) 
#define IT_GRENADE_LAUNCHER		(1<<4) 
#define IT_ROCKET_LAUNCHER		(1<<5) 
#define IT_LIGHTNING			(1<<6) 
#define IT_EXTRA_WEAPON			(1<<7) 

#define IT_SHELLS				(1<<8) 
#define IT_BULLETS				(1<<9) 
#define IT_ROCKETS				(1<<10) 
#define IT_CELLS				(1<<11) 
#define IT_AXE					(1<<12) 

#define IT_ARMOR1				(1<<13) 
#define IT_ARMOR2				(1<<14) 
#define IT_ARMOR3				(1<<15) 
#define IT_SUPERHEALTH			(1<<16) 

#define IT_KEY1					(1<<17) 
#define IT_KEY2					(1<<18) 

#define IT_INVISIBILITY			(1<<19) 
#define IT_INVULNERABILITY		(1<<20) 
#define IT_SUIT					(1<<21)
#define IT_QUAD					(1<<22) 
#define IT_HOOK					(1<<23)

#define IT_KEY3					(1<<24)	// Stomp invisibility
#define IT_KEY4					(1<<25)	// Stomp invulnerability
#define IT_LAST_ITEM			IT_KEY4

/*==================================================*/
/* New Weapon Related Defines		                */
/*==================================================*/

// Medikit
#define WEAP_MEDIKIT_OVERHEAL 50 // Amount of superhealth over max_health the medikit will dispense
#define WEAP_MEDIKIT_HEAL	200  // Amount medikit heals per hit

//--------------
// TF Specific damage flags
//--------------
//#define DMG_UNUSED					(DMG_LASTGENERICFLAG<<2)
// We can't add anymore dmg flags, because we'd be over the 32 bit limit.
// So lets re-use some of the old dmg flags in TF
#define DMG_USE_HITLOCATIONS					(DMG_AIRBOAT)
#define DMG_HALF_FALLOFF						(DMG_RADIATION)
#define DMG_CRITICAL							(DMG_ACID)
#define DMG_RADIUS_MAX							(DMG_ENERGYBEAM)
#define DMG_IGNITE								(DMG_PLASMA)
#define DMG_USEDISTANCEMOD						(DMG_SLOWBURN)		// NEED TO REMOVE CALTROPS
#define DMG_NOCLOSEDISTANCEMOD					(DMG_POISON)
#define DMG_FROM_OTHER_SAPPER					(DMG_IGNITE)		// USED TO DAMAGE SAPPERS ON MATCHED TELEPORTERS
#define DMG_MELEE								(DMG_BLAST_SURFACE)
#define DMG_DONT_COUNT_DAMAGE_TOWARDS_CRIT_RATE	(DMG_DISSOLVE)		// DON'T USE THIS FOR EXPLOSION DAMAGE YOU WILL MAKE BRANDON SAD AND KYLE SADDER

// This can only ever be used on a TakeHealth call, since it re-uses a dmg flag that means something else
#define DMG_IGNORE_MAXHEALTH	(DMG_BULLET)
#define DMG_IGNORE_DEBUFFS		(DMG_SLASH)

// Special Damage types
// Also update g_szSpecialDamageNames
enum ETFDmgCustom
{
	TF_DMG_CUSTOM_NONE = 0,
	TF_DMG_CUSTOM_HEADSHOT,
	TF_DMG_CUSTOM_BACKSTAB,
	TF_DMG_CUSTOM_BURNING,
	TF_DMG_WRENCH_FIX,
	TF_DMG_CUSTOM_MINIGUN,
	TF_DMG_CUSTOM_SUICIDE,
	TF_DMG_CUSTOM_TAUNTATK_HADOUKEN,
	TF_DMG_CUSTOM_BURNING_FLARE,
	TF_DMG_CUSTOM_TAUNTATK_HIGH_NOON,
	TF_DMG_CUSTOM_TAUNTATK_GRAND_SLAM,
	TF_DMG_CUSTOM_PENETRATE_MY_TEAM,
	TF_DMG_CUSTOM_PENETRATE_ALL_PLAYERS,
	TF_DMG_CUSTOM_TAUNTATK_FENCING,
	TF_DMG_CUSTOM_PENETRATE_NONBURNING_TEAMMATE,
	TF_DMG_CUSTOM_TAUNTATK_ARROW_STAB,
	TF_DMG_CUSTOM_TELEFRAG,
	TF_DMG_CUSTOM_BURNING_ARROW,
	TF_DMG_CUSTOM_FLYINGBURN,
	TF_DMG_CUSTOM_PUMPKIN_BOMB,
	TF_DMG_CUSTOM_DECAPITATION,
	TF_DMG_CUSTOM_TAUNTATK_GRENADE,
	TF_DMG_CUSTOM_BASEBALL,
	TF_DMG_CUSTOM_CHARGE_IMPACT,
	TF_DMG_CUSTOM_TAUNTATK_BARBARIAN_SWING,
	TF_DMG_CUSTOM_AIR_STICKY_BURST,
	TF_DMG_CUSTOM_DEFENSIVE_STICKY,
	TF_DMG_CUSTOM_PICKAXE,
	TF_DMG_CUSTOM_ROCKET_DIRECTHIT,
	TF_DMG_CUSTOM_TAUNTATK_UBERSLICE,
	TF_DMG_CUSTOM_PLAYER_SENTRY,
	TF_DMG_CUSTOM_STANDARD_STICKY,
	TF_DMG_CUSTOM_SHOTGUN_REVENGE_CRIT,
	TF_DMG_CUSTOM_TAUNTATK_ENGINEER_GUITAR_SMASH,
	TF_DMG_CUSTOM_BLEEDING,
	TF_DMG_CUSTOM_GOLD_WRENCH,
	TF_DMG_CUSTOM_CARRIED_BUILDING,
	TF_DMG_CUSTOM_COMBO_PUNCH,
	TF_DMG_CUSTOM_TAUNTATK_ENGINEER_ARM_KILL,
	TF_DMG_CUSTOM_FISH_KILL,
	TF_DMG_CUSTOM_TRIGGER_HURT,
	TF_DMG_CUSTOM_DECAPITATION_BOSS,
	TF_DMG_CUSTOM_STICKBOMB_EXPLOSION,
	TF_DMG_CUSTOM_AEGIS_ROUND,
	TF_DMG_CUSTOM_FLARE_EXPLOSION,
	TF_DMG_CUSTOM_BOOTS_STOMP,
	TF_DMG_CUSTOM_PLASMA,
	TF_DMG_CUSTOM_PLASMA_CHARGED,
	TF_DMG_CUSTOM_PLASMA_GIB,
	TF_DMG_CUSTOM_PRACTICE_STICKY,
	TF_DMG_CUSTOM_EYEBALL_ROCKET,
	TF_DMG_CUSTOM_HEADSHOT_DECAPITATION,
	TF_DMG_CUSTOM_TAUNTATK_ARMAGEDDON,
	TF_DMG_CUSTOM_FLARE_PELLET,
	TF_DMG_CUSTOM_CLEAVER,
	TF_DMG_CUSTOM_CLEAVER_CRIT,
	TF_DMG_CUSTOM_SAPPER_RECORDER_DEATH,
	TF_DMG_CUSTOM_MERASMUS_PLAYER_BOMB,
	TF_DMG_CUSTOM_MERASMUS_GRENADE,
	TF_DMG_CUSTOM_MERASMUS_ZAP,
	TF_DMG_CUSTOM_MERASMUS_DECAPITATION,
	TF_DMG_CUSTOM_CANNONBALL_PUSH,
	TF_DMG_CUSTOM_TAUNTATK_ALLCLASS_GUITAR_RIFF,
	TF_DMG_CUSTOM_THROWABLE,
	TF_DMG_CUSTOM_THROWABLE_KILL,
	TF_DMG_CUSTOM_SPELL_TELEPORT,
	TF_DMG_CUSTOM_SPELL_SKELETON,
	TF_DMG_CUSTOM_SPELL_MIRV,
	TF_DMG_CUSTOM_SPELL_METEOR,
	TF_DMG_CUSTOM_SPELL_LIGHTNING,
	TF_DMG_CUSTOM_SPELL_FIREBALL,
	TF_DMG_CUSTOM_SPELL_MONOCULUS,
	TF_DMG_CUSTOM_SPELL_BLASTJUMP,
	TF_DMG_CUSTOM_SPELL_BATS,
	TF_DMG_CUSTOM_SPELL_TINY,
	TF_DMG_CUSTOM_KART,
	TF_DMG_CUSTOM_GIANT_HAMMER,
	TF_DMG_CUSTOM_RUNE_REFLECT,
	//
	// INSERT NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	TF_DMG_CUSTOM_END // END
};

const char *GetCustomDamageName( ETFDmgCustom eDmgCustom );
ETFDmgCustom GetCustomDamageFromName( const char *pszCustomDmgName );

inline bool IsTauntDmg( int iType )
{
	return (iType == TF_DMG_CUSTOM_TAUNTATK_HADOUKEN ||
			iType == TF_DMG_CUSTOM_TAUNTATK_HIGH_NOON ||
			iType == TF_DMG_CUSTOM_TAUNTATK_GRAND_SLAM || 
			iType == TF_DMG_CUSTOM_TAUNTATK_FENCING ||
			iType == TF_DMG_CUSTOM_TAUNTATK_ARROW_STAB ||
			iType == TF_DMG_CUSTOM_TAUNTATK_GRENADE ||
			iType == TF_DMG_CUSTOM_TAUNTATK_BARBARIAN_SWING ||
			iType == TF_DMG_CUSTOM_TAUNTATK_UBERSLICE ||
			iType == TF_DMG_CUSTOM_TAUNTATK_ENGINEER_GUITAR_SMASH || 
			iType == TF_DMG_CUSTOM_TAUNTATK_ARMAGEDDON ||
			iType == TF_DMG_CUSTOM_TAUNTATK_ALLCLASS_GUITAR_RIFF || 
			iType == TF_DMG_CUSTOM_TAUNTATK_ENGINEER_ARM_KILL );
}
inline bool IsDOTDmg( int iType )
{
	if ( iType == TF_DMG_CUSTOM_BURNING ||
		 iType == TF_DMG_CUSTOM_BURNING_FLARE ||
		 iType == TF_DMG_CUSTOM_BURNING_ARROW ||
		 iType == TF_DMG_CUSTOM_BLEEDING )
	{
		return true;
	}
	else
	{
		return false;
	}
}

inline bool IsHeadshot( int iType ) 
{
	return (iType == TF_DMG_CUSTOM_HEADSHOT || iType == TF_DMG_CUSTOM_HEADSHOT_DECAPITATION);
}

enum
{
	TF_COLLISIONGROUP_GRENADES = LAST_SHARED_COLLISION_GROUP,
	TFCOLLISION_GROUP_OBJECT,
	TFCOLLISION_GROUP_OBJECT_SOLIDTOPLAYERMOVEMENT,
	TFCOLLISION_GROUP_COMBATOBJECT,
	TFCOLLISION_GROUP_ROCKETS,		// Solid to players, but not player movement. ensures touch calls are originating from rocket
	TFCOLLISION_GROUP_RESPAWNROOMS,
	TFCOLLISION_GROUP_TANK,
	TFCOLLISION_GROUP_ROCKET_BUT_NOT_WITH_OTHER_ROCKETS,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

// Stun flags
#define TF_STUN_NONE						0
#define TF_STUN_MOVEMENT					(1<<0)
#define	TF_STUN_CONTROLS					(1<<1)
#define TF_STUN_MOVEMENT_FORWARD_ONLY		(1<<2)
#define TF_STUN_SPECIAL_SOUND				(1<<3)
#define TF_STUN_DODGE_COOLDOWN				(1<<4)
#define TF_STUN_NO_EFFECTS					(1<<5)
#define TF_STUN_LOSER_STATE					(1<<6)
#define TF_STUN_BY_TRIGGER					(1<<7)
#define TF_STUN_BOTH						TF_STUN_MOVEMENT | TF_STUN_CONTROLS

//-----------------
// TF Objects Info
//-----------------

#define SENTRYGUN_UPGRADE_COST			130
#define SENTRYGUN_UPGRADE_METAL			200
#define SENTRYGUN_EYE_OFFSET_LEVEL_1	Vector( 0, 0, 32 )
#define SENTRYGUN_EYE_OFFSET_LEVEL_2	Vector( 0, 0, 40 )
#define SENTRYGUN_EYE_OFFSET_LEVEL_3	Vector( 0, 0, 46 )
#define SENTRYGUN_MAX_SHELLS_1			150
#define SENTRYGUN_MAX_SHELLS_2			200
#define SENTRYGUN_MAX_SHELLS_3			200
#define SENTRYGUN_MAX_ROCKETS			20

// Dispenser's maximum carrying capability
#define DISPENSER_MAX_METAL_AMMO		400
#define	MAX_DISPENSER_HEALING_TARGETS	32
#define MINI_DISPENSER_MAX_METAL	200

//--------------------------------------------------------------------------
// OBJECTS
//--------------------------------------------------------------------------
enum ObjectType_t
{
	OBJ_DISPENSER=0,
	OBJ_TELEPORTER,
	OBJ_SENTRYGUN,

	// Attachment Objects
	OBJ_ATTACHMENT_SAPPER,

	// If you add a new object, you need to add it to the g_ObjectInfos array 
	// in tf_shareddefs.cpp, and add it's data to the scripts/object.txt

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
#ifdef STAGING_ONLY
	OBJ_CATAPULT,
	OBJ_SPY_TRAP,
#endif

	OBJ_LAST,
};

#define BUILDING_MODE_ANY -1

enum
{
	MODE_TELEPORTER_ENTRANCE=0,
	MODE_TELEPORTER_EXIT,
#ifdef STAGING_ONLY
	MODE_TELEPORTER_SPEED,
	MODE_TELEPORTER_SPEED2,
#endif
};

enum
{
	MODE_SENTRYGUN_NORMAL = 0,
	MODE_SENTRYGUN_DISPOSABLE,
};

enum
{
	MODE_SAPPER_NORMAL = 0,
	MODE_SAPPER_ANTI_ROBOT,
	MODE_SAPPER_ANTI_ROBOT_RADIUS,
};

enum ESpyTrapType_t
{
	MODE_SPY_TRAP_RADIUS_STEALTH = 0,
	MODE_SPY_TRAP_REPROGRAM,
	MODE_SPY_TRAP_MAGNET,
	// MODE_SPY_TRAP_REPULSOR,
};

// Warning levels for buildings in the building hud, in priority order
typedef enum
{
	BUILDING_HUD_ALERT_NONE = 0,
	BUILDING_HUD_ALERT_LOW_AMMO,
	BUILDING_HUD_ALERT_LOW_HEALTH,
	BUILDING_HUD_ALERT_VERY_LOW_AMMO,
	BUILDING_HUD_ALERT_VERY_LOW_HEALTH,
	BUILDING_HUD_ALERT_SAPPER,	

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	MAX_BUILDING_HUD_ALERT_LEVEL
} BuildingHudAlert_t;

typedef enum
{
	BUILDING_DAMAGE_LEVEL_NONE = 0,		// 100%
	BUILDING_DAMAGE_LEVEL_LIGHT,		// 75% - 99%
	BUILDING_DAMAGE_LEVEL_MEDIUM,		// 50% - 76%
	BUILDING_DAMAGE_LEVEL_HEAVY,		// 25% - 49%	
	BUILDING_DAMAGE_LEVEL_CRITICAL,		// 0% - 24%

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	MAX_BUILDING_DAMAGE_LEVEL
} BuildingDamageLevel_t;

//--------------
// Scoring
//--------------

#define TF_SCORE_KILL							1
#define TF_SCORE_DEATH							0
#define TF_SCORE_CAPTURE						2
#define TF_SCORE_DEFEND							1
#define TF_SCORE_DESTROY_BUILDING				1
#define TF_SCORE_HEADSHOT_DIVISOR				2
#define TF_SCORE_BACKSTAB						1
#define TF_SCORE_INVULN							1
#define TF_SCORE_REVENGE						1
#define TF_SCORE_KILL_ASSISTS_PER_POINT			2
#define TF_SCORE_TELEPORTS_PER_POINT			2
#define TF_SCORE_HEAL_HEALTHUNITS_PER_POINT		600
#define TF_SCORE_BONUS_POINT_DIVISOR			10
#define TF_SCORE_DAMAGE							250
#define TF_SCORE_CURRENCY_COLLECTED				20
#define TF_SCORE_CAPTURE_POWERUPMODE			10 // With these CTF rules capturing flags is tougher, hence the higher scoring for flag events
#define TF_SCORE_FLAG_RETURN					4
#define TF_SCORE_KILL_RUNECARRIER				1


//-------------------------
// Shared Teleporter State
//-------------------------
enum
{
	DISPENSER_STATE_IDLE,
	DISPENSER_STATE_UPGRADING,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

//-------------------------
// Shared Teleporter State
//-------------------------
enum
{
	TELEPORTER_STATE_BUILDING = 0,				// Building, not active yet
	TELEPORTER_STATE_IDLE,						// Does not have a matching teleporter yet
	TELEPORTER_STATE_READY,						// Found match, charged and ready
	TELEPORTER_STATE_SENDING,					// Teleporting a player away
	TELEPORTER_STATE_RECEIVING,					
	TELEPORTER_STATE_RECEIVING_RELEASE,
	TELEPORTER_STATE_RECHARGING,				// Waiting for recharge
	TELEPORTER_STATE_UPGRADING,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

#define TELEPORTER_TYPE_ENTRANCE	0
#define TELEPORTER_TYPE_EXIT		1

//-------------------------
// Shared Sentry State
//-------------------------
enum
{
	SENTRY_STATE_INACTIVE = 0,
	SENTRY_STATE_SEARCHING,
	SENTRY_STATE_ATTACKING,
	SENTRY_STATE_UPGRADING,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	SENTRY_NUM_STATES,
};

//--------------------------------------------------------------------------
// OBJECT FLAGS
//--------------------------------------------------------------------------
enum
{
	OF_ALLOW_REPEAT_PLACEMENT				= 0x01,
	OF_MUST_BE_BUILT_ON_ATTACHMENT			= 0x02,
	OF_DOESNT_HAVE_A_MODEL					= 0x04,
	OF_PLAYER_DESTRUCTION					= 0x08,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	OF_BIT_COUNT	= 4
};

//--------------------------------------------------------------------------
// Builder "weapon" states
//--------------------------------------------------------------------------
enum 
{
	BS_IDLE = 0,
	BS_SELECTING,
	BS_PLACING,
	BS_PLACING_INVALID

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};


//--------------------------------------------------------------------------
// Builder object id...
//--------------------------------------------------------------------------
enum
{
	BUILDER_OBJECT_BITS = 8,
	BUILDER_INVALID_OBJECT = ((1 << BUILDER_OBJECT_BITS) - 1)
};

// Analyzer state
enum
{
	AS_INACTIVE = 0,
	AS_SUBVERTING,
	AS_ANALYZING
};

// Max number of objects a team can have
#define MAX_OBJECTS_PER_PLAYER	6
//#define MAX_OBJECTS_PER_TEAM	128

// sanity check that commands send via user command are somewhat valid
#define MAX_OBJECT_SCREEN_INPUT_DISTANCE	100

//--------------------------------------------------------------------------
// BUILDING
//--------------------------------------------------------------------------
// Build checks will return one of these for a player
enum
{
	CB_CAN_BUILD,			// Player is allowed to build this object
	CB_CANNOT_BUILD,		// Player is not allowed to build this object
	CB_LIMIT_REACHED,		// Player has reached the limit of the number of these objects allowed
	CB_NEED_RESOURCES,		// Player doesn't have enough resources to build this object
	CB_NEED_ADRENALIN,		// Commando doesn't have enough adrenalin to build a rally flag
	CB_UNKNOWN_OBJECT,		// Error message, tried to build unknown object

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

// Build animation events
#define TF_OBJ_ENABLEBODYGROUP			6000
#define TF_OBJ_DISABLEBODYGROUP			6001
#define TF_OBJ_ENABLEALLBODYGROUPS		6002
#define TF_OBJ_DISABLEALLBODYGROUPS		6003
#define TF_OBJ_PLAYBUILDSOUND			6004

#define TF_AE_CIGARETTE_THROW			7000
#define TF_AE_GUN_SALUTE				7001
#define TF_AE_PICKAXE_THROW				7002

#define OBJECT_COST_MULTIPLIER_PER_OBJECT			3
#define OBJECT_UPGRADE_COST_MULTIPLIER_PER_LEVEL	3

//--------------------------------------------------------------------------
// Powerups
//--------------------------------------------------------------------------
enum
{
	POWERUP_BOOST,		// Medic, buff station
	POWERUP_EMP,		// Technician
	POWERUP_RUSH,		// Rally flag
	POWERUP_POWER,		// Object power

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	MAX_POWERUPS
};

#define	MAX_CABLE_CONNECTIONS 4

bool IsObjectAnUpgrade( int iObjectType );
bool IsObjectAVehicle( int iObjectType );
bool IsObjectADefensiveBuilding( int iObjectType );

class CHudTexture;

#define OBJECT_MAX_GIB_MODELS	9
#ifdef STAGING_ONLY
#define OBJECT_MAX_MODES		4
#else
#define OBJECT_MAX_MODES		3
#endif

// This should be moved into its own header.
class CObjectInfo
{
public:
	CObjectInfo( const char *pObjectName );	
	~CObjectInfo();

	// This is initialized by the code and matched with a section in objects.txt
	const char	*m_pObjectName;

	// This stuff all comes from objects.txt
	char	*m_pClassName;					// Code classname (in LINK_ENTITY_TO_CLASS).
	char	*m_pStatusName;					// Shows up when crosshairs are on the object.
	float	m_flBuildTime;
	int		m_nMaxObjects;					// Maximum number of objects per player
	int		m_Cost;							// Base object resource cost
	float	m_CostMultiplierPerInstance;	// Cost multiplier
	int		m_UpgradeCost;					// Base object resource cost for upgrading
	int		m_MaxUpgradeLevel;				// Max object upgrade level
	char	*m_pBuilderWeaponName;			// Names shown for each object onscreen when using the builder weapon
	char	*m_pBuilderPlacementString;		// String shown to player during placement of this object
	int		m_SelectionSlot;				// Weapon selection slots for objects
	int		m_SelectionPosition;			// Weapon selection positions for objects
	bool	m_bSolidToPlayerMovement;
	bool	m_bUseItemInfo;					// Use default item appearance info.
	char    *m_pViewModel;					// View model to show in builder weapon for this object
	char    *m_pPlayerModel;				// World model to show attached to the player
	int		m_iDisplayPriority;				// Priority for ordering in the hud display ( higher is closer to top )
	bool	m_bVisibleInWeaponSelection;	// should show up and be selectable via the weapon selection?
	char	*m_pExplodeSound;				// gamesound to play when object explodes
	char	*m_pExplosionParticleEffect;	// particle effect to play when object explodes
	bool	m_bAutoSwitchTo;				// should we let players switch back to the builder weapon representing this?
	char	*m_pUpgradeSound;				// gamesound to play when object is upgraded
	float	m_flUpgradeDuration;			// time it takes to upgrade to the next level
	int		m_iBuildCount;					// number of these that can be carried at one time
	int		m_iNumAltModes;					// whether the item has more than one mode (ex: teleporter exit/entrance)

	struct
	{
		char* pszStatusName;
		char* pszModeName;
		char* pszIconMenu;
	}		m_AltModes[OBJECT_MAX_MODES];

	// HUD weapon selection menu icon ( from hud_textures.txt )
	char	*m_pIconActive;
	char	*m_pIconInactive;
	char	*m_pIconMenu;

	// HUD building status icon
	char	*m_pHudStatusIcon;

	// gibs
	int		m_iMetalToDropInGibs;

	// unique builder
	bool	m_bRequiresOwnBuilder;			// if object needs to instantiate its' own builder
};

// Loads the objects.txt script.
class IBaseFileSystem;
void LoadObjectInfos( IBaseFileSystem *pFileSystem );

// Get a CObjectInfo from a TFOBJ_ define.
const CObjectInfo* GetObjectInfo( int iObject );

// Object utility funcs
bool	ClassCanBuild( int iClass, int iObjectType );
int		InternalCalculateObjectCost( int iObjectType /*, int iNumberOfObjects, int iTeam, bool bLast = false*/ );
int		CalculateObjectUpgrade( int iObjectType, int iObjectLevel );

// Shell ejections
enum
{
	EJECTBRASS_PISTOL,
	EJECTBRASS_MINIGUN,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

// Win panel styles
enum
{
	WINPANEL_BASIC = 0,
};

#define TF_DEATH_ANIMATION_TIME			2.0


enum HudNotification_t
{
	HUD_NOTIFY_YOUR_FLAG_TAKEN,
	HUD_NOTIFY_YOUR_FLAG_DROPPED,
	HUD_NOTIFY_YOUR_FLAG_RETURNED,
	HUD_NOTIFY_YOUR_FLAG_CAPTURED,

	HUD_NOTIFY_ENEMY_FLAG_TAKEN,
	HUD_NOTIFY_ENEMY_FLAG_DROPPED,
	HUD_NOTIFY_ENEMY_FLAG_RETURNED,
	HUD_NOTIFY_ENEMY_FLAG_CAPTURED,

	HUD_NOTIFY_TOUCHING_ENEMY_CTF_CAP,

	HUD_NOTIFY_NO_INVULN_WITH_FLAG,
	HUD_NOTIFY_NO_TELE_WITH_FLAG,

	HUD_NOTIFY_SPECIAL,

	HUD_NOTIFY_GOLDEN_WRENCH,

	HUD_NOTIFY_RD_ROBOT_UNDER_ATTACK,

	HUD_NOTIFY_HOW_TO_CONTROL_GHOST,
	HUD_NOTIFY_HOW_TO_CONTROL_KART,

	HUD_NOTIFY_PASSTIME_HOWTO,
	HUD_NOTIFY_PASSTIME_NO_TELE,
	HUD_NOTIFY_PASSTIME_NO_CARRY,
	HUD_NOTIFY_PASSTIME_NO_INVULN,
	HUD_NOTIFY_PASSTIME_NO_DISGUISE, 
	HUD_NOTIFY_PASSTIME_NO_CLOAK, 
	HUD_NOTIFY_PASSTIME_NO_OOB, // out of bounds
	HUD_NOTIFY_PASSTIME_NO_HOLSTER,
	HUD_NOTIFY_PASSTIME_NO_TAUNT,

	HUD_NOTIFY_COMPETITIVE_GC_DOWN,

	HUD_NOTIFY_TRUCE_START,
	HUD_NOTIFY_TRUCE_END,

	HUD_NOTIFY_HOW_TO_CONTROL_GHOST_NO_RESPAWN,
	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	NUM_STOCK_NOTIFICATIONS
};

// HudAlerts don't set HIDEHUD_MISCSTATUS, so they appear with the win panel, etc
typedef enum
{
	HUD_ALERT_SCRAMBLE_TEAMS,

	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//

	NUM_STOCK_ALERTS
} HudAlert_t;

//-----------------------------------------------------------------------------
// Item testing
//-----------------------------------------------------------------------------
enum testitem_botanims_t
{
	TI_BOTANIM_IDLE,
	TI_BOTANIM_CROUCH,
	TI_BOTANIM_RUN,
	TI_BOTANIM_CROUCH_WALK,
	TI_BOTANIM_JUMP,

	TI_BOTANIM_COUNT,
};

#define TF_DEATH_DOMINATION				0x0001	// killer is dominating victim
#define TF_DEATH_ASSISTER_DOMINATION	0x0002	// assister is dominating victim
#define TF_DEATH_REVENGE				0x0004	// killer got revenge on victim
#define TF_DEATH_ASSISTER_REVENGE		0x0008	// assister got revenge on victim
#define TF_DEATH_FIRST_BLOOD			0x0010  // death triggered a first blood
#define TF_DEATH_FEIGN_DEATH			0x0020  // feign death
#define TF_DEATH_INTERRUPTED			0x0040	// interrupted a player doing an important game event (like capping or carrying flag)
#define TF_DEATH_GIBBED					0x0080	// player was gibbed
#define TF_DEATH_PURGATORY				0x0100	// player died while in purgatory
#define TF_DEATH_MINIBOSS				0x0200	// player killed was a miniboss
#define TF_DEATH_AUSTRALIUM				0x0400	// player killed by a Australium Weapon

#define MAX_DECAPITATIONS		4

extern const char *TranslateWeaponEntForClass( const char *pszName, int iClass );

// Item Giveaways
#define PLAYER_ROLL_MIN			1
#define PLAYER_ROLL_MAX			500

// Generalized Jump State
#define TF_PLAYER_ROCKET_JUMPED		( 1 << 0 )
#define TF_PLAYER_STICKY_JUMPED		( 1 << 1 )
#define TF_PLAYER_ENEMY_BLASTED_ME	( 1 << 2 )

enum taunts_t
{
	TAUNT_BASE_WEAPON,		// The standard taunt we shipped with. Taunts based on your currently held weapon
	TAUNT_MISC_ITEM,		// Taunts based on the item you have equipped in your Misc slot.
	TAUNT_SHOW_ITEM,		// Show off an item to everyone nearby
	TAUNT_LONG,				// Press-and-hold taunt
	TAUNT_SPECIAL,			// Special-case taunts called explicitly from code
	//
	// ADD NEW ITEMS HERE TO AVOID BREAKING DEMOS
	//
};

enum eEurekaTeleportTargets
{
	EUREKA_FIRST_TARGET = 0,

	EUREKA_TELEPORT_HOME = 0,
	EUREKA_TELEPORT_TELEPORTER_EXIT,

	EUREKA_LAST_TARGET = EUREKA_TELEPORT_TELEPORTER_EXIT,
		
	EUREKA_NUM_TARGETS
};

#define TF_HIGHFIVE_HINT_MASK			( 0x10100 ) // annotations have id ( TF_HIGHFIVE_HINT_MASK | entindex )

enum BombDeployingState_t
{
	TF_BOMB_DEPLOYING_NONE,
	TF_BOMB_DEPLOYING_DELAY,
	TF_BOMB_DEPLOYING_ANIMATING,
	TF_BOMB_DEPLOYING_COMPLETE,

	TF_BOMB_DEPLOYING_NOT_COUNT,
};

enum EHorriblePyroVisionHack
{
	kHorriblePyroVisionHack_KillAssisterType_Default						= 0,

	kHorriblePyroVisionHack_KillAssisterType_CustomName						= 'a',
	kHorriblePyroVisionHack_KillAssisterType_LocalizationString				= 'b',
	kHorriblePyroVisionHack_KillAssisterType_CustomName_First				= 'c',
	kHorriblePyroVisionHack_KillAssisterType_LocalizationString_First		= 'd',
};

enum EAttackBonusEffects_t
{
	kBonusEffect_None = 4, // Must be 4.  Yep.
	kBonusEffect_Crit = 0,
	kBonusEffect_MiniCrit,
	kBonusEffect_DoubleDonk,
	kBonusEffect_WaterBalloonSploosh,

	kBonusEffect_Count, // Must be 2nd to last
	
};


//-----------------------------------------------------------------------------
// PVE MODE
//-----------------------------------------------------------------------------
// In-game currency
enum CurrencyRewards_t
{
	TF_CURRENCY_KILLED_PLAYER,
	TF_CURRENCY_KILLED_OBJECT,
	TF_CURRENCY_ASSISTED_PLAYER,
	TF_CURRENCY_BONUS_POINTS,
	TF_CURRENCY_CAPTURED_OBJECTIVE,
	TF_CURRENCY_ESCORT_REWARD,
	TF_CURRENCY_PACK_SMALL,
	TF_CURRENCY_PACK_MEDIUM,
	TF_CURRENCY_PACK_LARGE,
	TF_CURRENCY_PACK_CUSTOM,
	TF_CURRENCY_TIME_REWARD,
	TF_CURRENCY_WAVE_COLLECTION_BONUS,
};

enum mvm_announcement_t
{
	TF_MVM_ANNOUNCEMENT_WAVE_COMPLETE,
	TF_MVM_ANNOUNCEMENT_WAVE_FAILED,

	TF_MVM_ANNOUNCEMENT_TOTAL
};

#define RD_MAX_ROBOT_GROUPS_PER_TEAM 6

#define MAX_RAIDMODE_UPGRADES		60

enum mvm_upgrade_uigroups_t
{
	UIGROUP_UPGRADE_ATTACHED_TO_ITEM = 0,
	UIGROUP_UPGRADE_ATTACHED_TO_PLAYER,
	UIGROUP_POWERUPBOTTLE,
};

enum
{
	MVM_UPGRADE_QUALITY_LOW = 1,
	MVM_UPGRADE_QUALITY_NORMAL,		// Default
	MVM_UPGRADE_QAULITY_HIGH,
};

#define MVM_BUYBACK_COST_PER_SEC		5

#define MVM_CLASS_TYPES_PER_WAVE_MAX			12
// this is ugly, but we need to increase the max types per wave and changing the old define will break demos
#define MVM_CLASS_TYPES_PER_WAVE_MAX_NEW		( MVM_CLASS_TYPES_PER_WAVE_MAX * 2 )

#define MVM_CLASS_FLAG_NONE				0
#define MVM_CLASS_FLAG_NORMAL			(1<<0)
#define MVM_CLASS_FLAG_SUPPORT			(1<<1)
#define MVM_CLASS_FLAG_MISSION			(1<<2)
#define MVM_CLASS_FLAG_MINIBOSS			(1<<3)
#define MVM_CLASS_FLAG_ALWAYSCRIT		(1<<4)
#define MVM_CLASS_FLAG_SUPPORT_LIMITED	(1<<5)



enum MedicCallerType
{
	CALLER_TYPE_NORMAL,
	CALLER_TYPE_AUTO,
	CALLER_TYPE_REVIVE_EASY,		// The more someone is revived, the harder
	CALLER_TYPE_REVIVE_MEDIUM,		// subsequent revives become.
	CALLER_TYPE_REVIVE_HARD,
};

//-----------------------------------------------------------------------------
// Additional TF achievement packs
//-----------------------------------------------------------------------------
#define ACHIEVEMENT_TF_COMPLETE_TRAINING			(ACHIEVEMENT_TF_LAST_ORANGEBOX + 1)
#define ACHIEVEMENT_TF_FIRE_WATERJUMP				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 2)
#define ACHIEVEMENT_TF_KILL_BALLOONICORN_OWNERS		(ACHIEVEMENT_TF_LAST_ORANGEBOX + 3)
#define ACHIEVEMENT_TF_MULTIPLE_BFF					(ACHIEVEMENT_TF_LAST_ORANGEBOX + 4)
#define ACHIEVEMENT_TF_TEAM_PYROVISION				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 5)
#define ACHIEVEMENT_TF_DOMINATE_FOR_GOGGLES			(ACHIEVEMENT_TF_LAST_ORANGEBOX + 6)
#define ACHIEVEMENT_TF_PARACHUTE_KILL_GRIND				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 7)
#define ACHIEVEMENT_TF_MELEE_KILL_CLASSIC_RIFLE_SNIPER	(ACHIEVEMENT_TF_LAST_ORANGEBOX + 8)
#define ACHIEVEMENT_TF_KILL_CHARGING_DEMO				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 9)
#define ACHIEVEMENT_TF_TAUNT_CONGA_KILL				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 10)
#define ACHIEVEMENT_TF_TAUNT_CONGA_LINE				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 11)
#define ACHIEVEMENT_TF_TAUNT_RPS_ROCK				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 12)
#define ACHIEVEMENT_TF_TAUNT_RPS_SCISSORS			(ACHIEVEMENT_TF_LAST_ORANGEBOX + 13)
#define ACHIEVEMENT_TF_TAUNT_DOSIDO_MELLE_KILL		(ACHIEVEMENT_TF_LAST_ORANGEBOX + 14)
#define ACHIEVEMENT_TF_TAUNT_WHILE_CAPPING			(ACHIEVEMENT_TF_LAST_ORANGEBOX + 15)
#define ACHIEVEMENT_TF_PASS_TIME_HAT				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 16)
#define ACHIEVEMENT_TF_PASS_TIME_GRIND				(ACHIEVEMENT_TF_LAST_ORANGEBOX + 17)


#define ACHIEVEMENT_START_CLASS_SPECIFIC			1000

// Scout
#define ACHIEVEMENT_TF_SCOUT_START_RANGE			1001
#define ACHIEVEMENT_TF_SCOUT_FIRST_BLOOD			1001
#define ACHIEVEMENT_TF_SCOUT_FIRST_BLOOD_KILL		1002
#define ACHIEVEMENT_TF_SCOUT_WELL_EARLY_KILL		1003
#define ACHIEVEMENT_TF_SCOUT_LIFETIME_KILLS			1004
#define ACHIEVEMENT_TF_SCOUT_IRON_MAN_KILLS			1005
#define ACHIEVEMENT_TF_SCOUT_DESTROY_TELEPORTERS	1006
#define ACHIEVEMENT_TF_SCOUT_DESTROY_BUILDINGS_BEING_BUILT	1007
#define ACHIEVEMENT_TF_SCOUT_DESTROY_SENTRY_WITH_PISTOL		1008
#define ACHIEVEMENT_TF_SCOUT_DOUBLE_JUMPS			1009
#define ACHIEVEMENT_TF_SCOUT_ASSIST_MEDIC			1010
#define ACHIEVEMENT_TF_SCOUT_STEAL_SANDWICH			1011
#define ACHIEVEMENT_TF_SCOUT_KILL_CHARGED_MEDICS	1012
#define ACHIEVEMENT_TF_SCOUT_SURVIVE_DAMAGE			1013
#define ACHIEVEMENT_TF_SCOUT_THREE_FLAGCAPS			1014
#define ACHIEVEMENT_TF_SCOUT_DOUBLEJUMP_KILL		1015
#define ACHIEVEMENT_TF_SCOUT_FLAG_CAP_GRIND			1016
#define ACHIEVEMENT_TF_SCOUT_DODGE_DAMAGE			1017
#define ACHIEVEMENT_TF_SCOUT_KNOCK_INTO_TRAIN		1018
#define ACHIEVEMENT_TF_SCOUT_KILL_STUNNED			1019
#define ACHIEVEMENT_TF_SCOUT_STUN_INTO_TRAIN		1020
#define ACHIEVEMENT_TF_SCOUT_STUN_UBER_ENEMIES		1021
#define ACHIEVEMENT_TF_SCOUT_STUN_CAPPING_ENEMIES	1022
#define ACHIEVEMENT_TF_SCOUT_MAX_STUNS				1023
#define ACHIEVEMENT_TF_SCOUT_STUN_SCOUT_WITH_THEIR_BALL		1024
#define ACHIEVEMENT_TF_SCOUT_KILL_IN_DODGE_COOLDOWN	1025
#define ACHIEVEMENT_TF_SCOUT_KILL_FROM_BEHIND		1026
#define ACHIEVEMENT_TF_SCOUT_CAPTURE_LAST_POINT		1027
#define ACHIEVEMENT_TF_SCOUT_CAPTURE_THREE_POINTS	1028
#define ACHIEVEMENT_TF_SCOUT_FAST_CAP				1029
#define ACHIEVEMENT_TF_SCOUT_START_AND_FINISH_CAP	1030
#define ACHIEVEMENT_TF_SCOUT_BLOCK_CAPS				1031
#define	ACHIEVEMENT_TF_SCOUT_CARRIER_KILL_CARRIER	1032
#define ACHIEVEMENT_TF_SCOUT_CAP_FLAG_WITHOUT_ATTACKING 1033
#define ACHIEVEMENT_TF_SCOUT_LONG_DISTANCE_RUNNER	1034
#define ACHIEVEMENT_TF_SCOUT_TAUNT_KILL				1035
#define ACHIEVEMENT_TF_SCOUT_ACHIEVE_PROGRESS1		1036
#define ACHIEVEMENT_TF_SCOUT_ACHIEVE_PROGRESS2		1037
#define ACHIEVEMENT_TF_SCOUT_ACHIEVE_PROGRESS3		1038
#define ACHIEVEMENT_TF_SCOUT_BACKSCATTER_KILL_SPY_GRIND			1039
#define ACHIEVEMENT_TF_SCOUT_BACKSCATTER_KILL_HEAVY_MEDIC_PAIR	1040
#define ACHIEVEMENT_TF_SCOUT_BACKSCATTER_KILL_FRIENDS_GRIND		1041
#define ACHIEVEMENT_TF_SCOUT_END_RANGE				1041

// Sniper
#define ACHIEVEMENT_TF_SNIPER_START_RANGE			1101
#define ACHIEVEMENT_TF_SNIPER_JARATE_DOMINATED		1101
#define ACHIEVEMENT_TF_SNIPER_FREEZECAM_HAT			1102
#define ACHIEVEMENT_TF_SNIPER_RIFLE_NO_MISSING		1103
#define ACHIEVEMENT_TF_SNIPER_CAPTURE_FLAG			1104
#define ACHIEVEMENT_TF_SNIPER_KILL_GRIND			1105
#define ACHIEVEMENT_TF_SNIPER_KILL_WEAPONS			1106
#define ACHIEVEMENT_TF_SNIPER_HEADSHOT_SNIPERS		1107
#define ACHIEVEMENT_TF_SNIPER_DESTROY_SENTRYGUNS	1108
#define ACHIEVEMENT_TF_SNIPER_KILL_INVIS_SPY		1109
#define ACHIEVEMENT_TF_SNIPER_KILL_MIDAIR_SCOUT		1110
#define ACHIEVEMENT_TF_SNIPER_FREEZECAM_WAVE		1111
#define ACHIEVEMENT_TF_SNIPER_DOMINATE_SNIPER		1112
#define ACHIEVEMENT_TF_SNIPER_KILL_SPIES_MELEE		1113
#define ACHIEVEMENT_TF_SNIPER_HEADSHOT_DEMOMAN		1114
#define ACHIEVEMENT_TF_SNIPER_KILL_RJER				1115
#define ACHIEVEMENT_TF_SNIPER_KILL_OBJECTIVES		1116
#define ACHIEVEMENT_TF_SNIPER_KILL_UNSCOPED			1117
#define ACHIEVEMENT_TF_SNIPER_KILL_CHARGED_MEDIC	1118
#define ACHIEVEMENT_TF_SNIPER_GET_BACKSTABBED		1119
#define ACHIEVEMENT_TF_SNIPER_KILL_AT_ROUNDSTART	1120
#define ACHIEVEMENT_TF_SNIPER_HEADSHOT_POST_INVULN	1121
#define ACHIEVEMENT_TF_SNIPER_TOP_SCOREBOARD_GRIND	1122
#define ACHIEVEMENT_TF_SNIPER_KILL_FAILED_SPY		1123
#define ACHIEVEMENT_TF_SNIPER_JARATE_GROUP			1124
#define ACHIEVEMENT_TF_SNIPER_JARATE_MEDIC_PAIR		1125
#define ACHIEVEMENT_TF_SNIPER_JARATE_REVEAL_SPY		1126
#define ACHIEVEMENT_TF_SNIPER_JARATE_EXTINGUISH		1127
#define ACHIEVEMENT_TF_SNIPER_BOW_PIN_HEAVY			1128
#define ACHIEVEMENT_TF_SNIPER_BOW_KILL_MEDIC_PAIR	1129
#define ACHIEVEMENT_TF_SNIPER_BOW_KILL_FLAGCARRIER	1130
#define ACHIEVEMENT_TF_SNIPER_BOW_PINCUSHION		1131
#define ACHIEVEMENT_TF_SNIPER_JARATE_ASSISTS		1132
#define ACHIEVEMENT_TF_SNIPER_JARATE_KILL_MELEE		1133
#define ACHIEVEMENT_TF_SNIPER_TAUNT_KILL			1134
#define ACHIEVEMENT_TF_SNIPER_BOW_KILL_WHILEDEAD	1135
#define ACHIEVEMENT_TF_SNIPER_ACHIEVE_PROGRESS1		1136
#define ACHIEVEMENT_TF_SNIPER_ACHIEVE_PROGRESS2		1137
#define ACHIEVEMENT_TF_SNIPER_ACHIEVE_PROGRESS3		1138
#define ACHIEVEMENT_TF_SNIPER_CLASSIC_RIFLE_NOSCOPE_HEADSHOT		1139
#define ACHIEVEMENT_TF_SNIPER_CLASSIC_RIFLE_HEADSHOT_JUMPER			1140
#define ACHIEVEMENT_TF_SNIPER_CLASSIC_RIFLE_GIB_GRIND				1141
#define ACHIEVEMENT_TF_SNIPER_PARACHUTE_GRIND						1142
#define ACHIEVEMENT_TF_SNIPER_END_RANGE				1142

// Soldier
#define ACHIEVEMENT_TF_SOLDIER_START_RANGE			1201
#define ACHIEVEMENT_TF_SOLDIER_RJ_EQUALIZER_KILL	1201
#define ACHIEVEMENT_TF_SOLDIER_BUFF_TEAMMATES		1202
#define ACHIEVEMENT_TF_SOLDIER_KILL_DEMOMAN_GRIND	1203
#define ACHIEVEMENT_TF_SOLDIER_KILL_ENGY			1204
#define ACHIEVEMENT_TF_SOLDIER_KILL_PYRO			1205
#define ACHIEVEMENT_TF_SOLDIER_NEMESIS_SHOVEL_KILL	1206
#define ACHIEVEMENT_TF_SOLDIER_DESTROY_STICKIES		1207
#define ACHIEVEMENT_TF_SOLDIER_CROUCH_ROCKET_JUMP	1208
#define ACHIEVEMENT_TF_SOLDIER_EQUALIZER_STREAK		1209
#define ACHIEVEMENT_TF_SOLDIER_BUFF_FRIENDS			1210
#define ACHIEVEMENT_TF_SOLDIER_KILL_GROUP_WITH_CROCKET				1211
#define ACHIEVEMENT_TF_SOLDIER_KILL_TWO_DURING_ROCKET_JUMP			1212
#define ACHIEVEMENT_TF_SOLDIER_KILL_TAUNT			1213
#define ACHIEVEMENT_TF_SOLDIER_DEFEND_MEDIC			1214
#define ACHIEVEMENT_TF_SOLDIER_KILL_WITH_EQUALIZER_WHILE_HURT		1215
#define ACHIEVEMENT_TF_SOLDIER_KILL_AIRBORNE_TARGET_WHILE_AIRBORNE	1216
#define ACHIEVEMENT_TF_SOLDIER_BOUNCE_THEN_SHOTGUN	1217
#define ACHIEVEMENT_TF_SOLDIER_KILL_AIRBORNE_WITH_DIRECT_HIT		1218
#define ACHIEVEMENT_TF_SOLDIER_KILL_SNIPER_WHILE_DEAD				1219
#define ACHIEVEMENT_TF_SOLDIER_DESTROY_SENTRY_OUT_OF_RANGE			1220
#define ACHIEVEMENT_TF_SOLDIER_DUO_SOLDIER_KILLS	1221
#define ACHIEVEMENT_TF_SOLDIER_MVP					1222
#define ACHIEVEMENT_TF_SOLDIER_ASSIST_MEDIC_UBER	1223
#define ACHIEVEMENT_TF_SOLDIER_SHOOT_MULT_CRITS		1224
#define ACHIEVEMENT_TF_SOLDIER_KILL_DEFENSELESS		1225
#define ACHIEVEMENT_TF_SOLDIER_KILL_ON_FIRE			1226
#define ACHIEVEMENT_TF_SOLDIER_FREEZECAM_TAUNT		1227
#define ACHIEVEMENT_TF_SOLDIER_FREEZECAM_GIBS		1228
#define ACHIEVEMENT_TF_SOLDIER_KILL_SPY_KILLER		1229
#define ACHIEVEMENT_TF_SOLDIER_GIB_GRIND			1230
#define ACHIEVEMENT_TF_SOLDIER_THREE_DOMINATIONS	1231
#define ACHIEVEMENT_TF_SOLDIER_RIDE_THE_CART		1232
#define ACHIEVEMENT_TF_SOLDIER_KILL_TWENTY_FROM_ABOVE			1233
#define ACHIEVEMENT_TF_SOLDIER_KILL_FIVE_STUNNED				1234
#define ACHIEVEMENT_TF_SOLDIER_DEFEND_CAP_THIRTY_TIMES			1235
#define ACHIEVEMENT_TF_SOLDIER_ACHIEVE_PROGRESS1				1236
#define ACHIEVEMENT_TF_SOLDIER_ACHIEVE_PROGRESS2				1237
#define ACHIEVEMENT_TF_SOLDIER_ACHIEVE_PROGRESS3				1238
#define ACHIEVEMENT_TF_SOLDIER_PARACHUTE_KILL_GROUP				1239
#define ACHIEVEMENT_TF_SOLDIER_PARACHUTE_DISTANCE				1240
#define ACHIEVEMENT_TF_SOLDIER_PARACHUTE_KILL_PARACHUTE			1241
#define ACHIEVEMENT_TF_SOLDIER_AIRSTRIKE_MAX_CLIP				1242
#define ACHIEVEMENT_TF_SOLDIER_AIRSTRIKE_GROUP_KILL				1243
#define ACHIEVEMENT_TF_SOLDIER_END_RANGE						1243

// Demoman
#define ACHIEVEMENT_TF_DEMOMAN_START_RANGE						1301
#define ACHIEVEMENT_TF_DEMOMAN_KILL_SOLDIER_GRIND				1301
#define ACHIEVEMENT_TF_DEMOMAN_DESTROY_BUILDINGS_WITH_MEDIC		1302
#define ACHIEVEMENT_TF_DEMOMAN_DECAPITATE_CLOAKED_SPY			1303
#define ACHIEVEMENT_TF_DEMOMAN_KILL_X_WITH_DIRECTPIPE			1304
#define ACHIEVEMENT_TF_DEMOMAN_BOUNCE_AND_KILL					1305
#define ACHIEVEMENT_TF_DEMOMAN_KILL_TWO_DURING_STICKYJUMP		1306
#define ACHIEVEMENT_TF_DEMOMAN_KILL_PLAYER_AFTER_TP				1307
#define ACHIEVEMENT_TF_DEMOMAN_DOMINATE_THREE_ENGINEERS			1308
#define ACHIEVEMENT_TF_DEMOMAN_KILL_BUILDING_DIRECT_HIT			1309
#define ACHIEVEMENT_TF_DEMOMAN_DECAPITATE_PLAYERS				1310
#define ACHIEVEMENT_TF_DEMOMAN_DECAPITATE_PLAYERS_FAST			1311
#define ACHIEVEMENT_TF_DEMOMAN_DUO_DEMOMAN_KILLS				1312
#define ACHIEVEMENT_TF_DEMOMAN_MELEE_KILL_WHILE_STICKYJUMPING	1313
#define ACHIEVEMENT_TF_DEMOMAN_KILL_ENGI_SENTRY_DISPENSER		1314
#define ACHIEVEMENT_TF_DEMOMAN_DECAPITATE_EQUALIZER				1315
#define ACHIEVEMENT_TF_DEMOMAN_DECAPITATE_NEMESIS				1316
#define ACHIEVEMENT_TF_DEMOMAN_DAMAGE_GRIND						1317
#define ACHIEVEMENT_TF_DEMOMAN_KILL_X_CAPPING_ONEDET			1318
#define ACHIEVEMENT_TF_DEMOMAN_KILL_X_DEFENDING					1319
#define ACHIEVEMENT_TF_DEMOMAN_DESTROY_BUILDINGS_GRIND			1320
#define ACHIEVEMENT_TF_DEMOMAN_KILL_X_HEAVIES_FULLHP_ONEDET		1321
#define ACHIEVEMENT_TF_DEMOMAN_KILL_X_SCOUTS_PYROS				1322
#define ACHIEVEMENT_TF_DEMOMAN_TAUNT_KILL						1323
#define ACHIEVEMENT_TF_DEMOMAN_CHARGE_KILL						1324
#define ACHIEVEMENT_TF_DEMOMAN_CRIT_SWORD_KILL					1325
#define ACHIEVEMENT_TF_DEMOMAN_AIR_BURST_KILLS					1326
#define ACHIEVEMENT_TF_DEMOMAN_STICKYJUMP_CAP					1327
#define ACHIEVEMENT_TF_DEMOMAN_FREEZECAM_SMILE					1328
#define ACHIEVEMENT_TF_DEMOMAN_FREEZECAM_RUMP					1329
#define ACHIEVEMENT_TF_DEMOMAN_ENVIRONMENTAL_KILL				1330
#define ACHIEVEMENT_TF_DEMOMAN_DESTROY_X_STICKYBOMBS			1331
#define ACHIEVEMENT_TF_DEMOMAN_STICKJUMP_DISTANCE				1332
#define ACHIEVEMENT_TF_DEMOMAN_KILL3_WITH_DETONATION			1333
#define ACHIEVEMENT_TF_DEMOMAN_KILLXSAPPINGSPIES				1334
#define ACHIEVEMENT_TF_DEMOMAN_KILL3_WITH_PIPE_SETUPS			1335
#define ACHIEVEMENT_TF_DEMOMAN_ACHIEVE_PROGRESS1				1336
#define ACHIEVEMENT_TF_DEMOMAN_ACHIEVE_PROGRESS2				1337
#define ACHIEVEMENT_TF_DEMOMAN_ACHIEVE_PROGRESS3				1338
#define ACHIEVEMENT_TF_DEMOMAN_PARACHUTE_KILL_GROUP				1339
#define ACHIEVEMENT_TF_DEMOMAN_PARACHUTE_DISTANCE				1340
#define ACHIEVEMENT_TF_DEMOMAN_PARACHUTE_KILL_PARACHUTE			1341
#define ACHIEVEMENT_TF_DEMOMAN_KILL_PLAYER_YOU_DIDNT_SEE		1342
#define ACHIEVEMENT_TF_DEMOMAN_QUICK_KILLS						1343
#define ACHIEVEMENT_TF_DEMOMAN_CHARGE_KILL_CHARGING_DEMO		1344
#define ACHIEVEMENT_TF_DEMOMAN_END_RANGE						1344

// Medic
#define ACHIEVEMENT_TF_MEDIC_START_RANGE			1401
#define ACHIEVEMENT_TF_MEDIC_TOP_SCOREBOARD			1401
#define ACHIEVEMENT_TF_MEDIC_HEAL_UNDER_FIRE		1402
#define ACHIEVEMENT_TF_MEDIC_SIMUL_CHARGE			1403
#define ACHIEVEMENT_TF_MEDIC_SETUP_CHARGE			1404
#define ACHIEVEMENT_TF_MEDIC_RAPID_CHARGE			1405
#define ACHIEVEMENT_TF_MEDIC_COUNTER_CHARGE			1406
#define ACHIEVEMENT_TF_MEDIC_SWITCH_TO_MEDIC		1407
#define ACHIEVEMENT_TF_MEDIC_SAVE_TEAMMATE			1408
#define ACHIEVEMENT_TF_MEDIC_CHARGE_BLOCKER			1409
#define ACHIEVEMENT_TF_MEDIC_ASSIST_MEDIC			1410
#define ACHIEVEMENT_TF_MEDIC_SYRINGE_SCOUTS			1411
#define ACHIEVEMENT_TF_MEDIC_BONESAW_MEDICS			1412
#define ACHIEVEMENT_TF_MEDIC_ASSIST_HEAVY_LONG		1413
#define ACHIEVEMENT_TF_MEDIC_ASSIST_SCOUT			1414
#define ACHIEVEMENT_TF_MEDIC_ASSIST_PYRO			1415
#define ACHIEVEMENT_TF_MEDIC_ASSIST_HEAVY			1416
#define ACHIEVEMENT_TF_MEDIC_ASSIST_DEMOMAN			1417
#define ACHIEVEMENT_TF_MEDIC_ASSIST_SOLDIER			1418
#define ACHIEVEMENT_TF_MEDIC_HEAL_ENGINEER			1419
#define ACHIEVEMENT_TF_MEDIC_ASSIST_CAPTURER		1420
#define ACHIEVEMENT_TF_MEDIC_HEAL_CALLERS			1421
#define ACHIEVEMENT_TF_MEDIC_EXTINGUISH_TEAMMATES	1422
#define ACHIEVEMENT_TF_MEDIC_ASSIST_VS_NEMESES		1423
#define ACHIEVEMENT_TF_MEDIC_KILL_WHILE_CHARGED		1424
#define ACHIEVEMENT_TF_MEDIC_BONESAW_NOMISSES		1425
#define ACHIEVEMENT_TF_MEDIC_HEAL_LARGE				1426
#define ACHIEVEMENT_TF_MEDIC_HEAL_HUGE				1427
#define ACHIEVEMENT_TF_MEDIC_HEAL_GRIND				1428
#define ACHIEVEMENT_TF_MEDIC_KILL_HEALED_SPY		1429
#define ACHIEVEMENT_TF_MEDIC_SAVE_FALLING_TEAMMATE	1430
#define ACHIEVEMENT_TF_MEDIC_CHARGE_JUGGLE			1431
#define ACHIEVEMENT_TF_MEDIC_FREEZECAM_RAGDOLL		1432
#define ACHIEVEMENT_TF_MEDIC_BONESAW_SPY_CALLERS	1433
#define ACHIEVEMENT_TF_MEDIC_CHARGE_FRIENDS			1434
#define ACHIEVEMENT_TF_MEDIC_INVITE_JOIN_CHARGE		1435
#define ACHIEVEMENT_TF_MEDIC_HEAL_ACHIEVER			1436
#define ACHIEVEMENT_TF_MEDIC_ACHIEVE_PROGRESS1		1437
#define ACHIEVEMENT_TF_MEDIC_ACHIEVE_PROGRESS2		1438
#define ACHIEVEMENT_TF_MEDIC_ACHIEVE_PROGRESS3		1439
#define ACHIEVEMENT_TF_MEDIC_END_RANGE				1439

// Heavy
#define ACHIEVEMENT_TF_HEAVY_START_RANGE			1501
#define ACHIEVEMENT_TF_HEAVY_DAMAGE_TAKEN			1501
#define ACHIEVEMENT_TF_HEAVY_DEFEND_MEDIC			1502
#define ACHIEVEMENT_TF_HEAVY_ASSIST_MEDIC_LARGE		1503
#define ACHIEVEMENT_TF_HEAVY_EARN_MEDIC_DOMINATION	1504
#define ACHIEVEMENT_TF_HEAVY_KILL_TAUNT				1505
#define ACHIEVEMENT_TF_HEAVY_KILL_FLAG_CARRIERS		1506
#define ACHIEVEMENT_TF_HEAVY_KILL_MEDIC_PAIR		1507
#define ACHIEVEMENT_TF_HEAVY_BLOCK_INVULN_HEAVY		1508
#define ACHIEVEMENT_TF_HEAVY_BLOCK_CART				1509
#define ACHIEVEMENT_TF_HEAVY_RECEIVE_UBER_GRIND		1510
#define ACHIEVEMENT_TF_HEAVY_STAND_NEAR_DISPENSER	1511
#define ACHIEVEMENT_TF_HEAVY_ASSIST_HEAVY_GRIND		1512
#define ACHIEVEMENT_TF_HEAVY_CLEAR_STICKYBOMBS		1513
#define ACHIEVEMENT_TF_HEAVY_KILL_UNDERWATER		1514
#define ACHIEVEMENT_TF_HEAVY_TAKE_MULTI_DAMAGE		1515
#define ACHIEVEMENT_TF_HEAVY_KILL_DOMINATED			1516
#define ACHIEVEMENT_TF_HEAVY_SURVIVE_CROCKET		1517
#define ACHIEVEMENT_TF_HEAVY_ASSIST_GRIND			1518
#define ACHIEVEMENT_TF_HEAVY_UNCOVER_SPIES			1519
#define ACHIEVEMENT_TF_HEAVY_KILL_WHILE_SPUNUP		1520
#define ACHIEVEMENT_TF_HEAVY_FIRE_LOTS				1521
#define ACHIEVEMENT_TF_HEAVY_KILL_CRIT_PUNCH		1522
#define ACHIEVEMENT_TF_HEAVY_HEAL_MEDIKITS			1523
#define ACHIEVEMENT_TF_HEAVY_KILL_SHOTGUN			1524
#define ACHIEVEMENT_TF_HEAVY_FIRST_TO_CAP			1525
#define ACHIEVEMENT_TF_HEAVY_PAYLOAD_CAP_GRIND		1526
#define ACHIEVEMENT_TF_HEAVY_KILL_MIDAIR_MINIGUN	1527
#define ACHIEVEMENT_TF_HEAVY_DEFEND_CONTROL_POINT	1528
#define ACHIEVEMENT_TF_HEAVY_KILL_CAPPING_ENEMIES	1529
#define ACHIEVEMENT_TF_HEAVY_REVENGE_ASSIST			1530
#define ACHIEVEMENT_TF_HEAVY_TELEPORT_FAST_KILL		1531
#define ACHIEVEMENT_TF_HEAVY_FREEZECAM_TAUNT		1532
#define ACHIEVEMENT_TF_HEAVY_EAT_SANDWICHES			1533
#define ACHIEVEMENT_TF_HEAVY_KILL_SCOUTS			1534
#define ACHIEVEMENT_TF_HEAVY_KILL_HEAVIES_GLOVES	1535
#define ACHIEVEMENT_TF_HEAVY_ACHIEVE_PROGRESS1		1537
#define ACHIEVEMENT_TF_HEAVY_ACHIEVE_PROGRESS2		1538
#define ACHIEVEMENT_TF_HEAVY_ACHIEVE_PROGRESS3		1539
#define ACHIEVEMENT_TF_HEAVY_END_RANGE				1539

// Pyro
#define ACHIEVEMENT_TF_PYRO_START_RANGE				1601
#define ACHIEVEMENT_TF_PYRO_KILL_MULTIWEAPONS		1601
#define ACHIEVEMENT_TF_PYRO_SIMULBURN_SCOUTS		1602
#define ACHIEVEMENT_TF_PYRO_FORCE_WATERJUMP			1603
#define ACHIEVEMENT_TF_PYRO_KILL_POSTDEATH			1604
#define ACHIEVEMENT_TF_PYRO_KILL_SPIES				1605
#define ACHIEVEMENT_TF_PYRO_KILL_CARRIERS			1606
#define ACHIEVEMENT_TF_PYRO_REVEAL_SPIES			1607
#define ACHIEVEMENT_TF_PYRO_CAMP_TELEPORTERS		1608
#define ACHIEVEMENT_TF_PYRO_CAMP_POSITION			1609
#define ACHIEVEMENT_TF_PYRO_KILL_AXE_SMALL			1610
#define ACHIEVEMENT_TF_PYRO_KILL_AXE_LARGE			1611
#define ACHIEVEMENT_TF_PYRO_KILL_FROM_BEHIND		1612
#define ACHIEVEMENT_TF_PYRO_BURN_SPIES_AS_YOU		1613
#define ACHIEVEMENT_TF_PYRO_BURN_SNIPERS_ZOOMED		1614
#define ACHIEVEMENT_TF_PYRO_BURN_MEDICS_CHARGED		1615
#define ACHIEVEMENT_TF_PYRO_REFLECT_PROJECTILES		1616
#define ACHIEVEMENT_TF_PYRO_KILL_HEAVIES			1617
#define ACHIEVEMENT_TF_PYRO_KILL_UNDERWATER			1618
#define ACHIEVEMENT_TF_PYRO_KILL_UBERCHARGE			1619
#define ACHIEVEMENT_TF_PYRO_DESTROY_BUILDINGS		1620
#define ACHIEVEMENT_TF_PYRO_DEFEND_POINTS			1621
#define ACHIEVEMENT_TF_PYRO_KILL_GRIND				1622
#define ACHIEVEMENT_TF_PYRO_DAMAGE_GRIND			1623
#define ACHIEVEMENT_TF_PYRO_BURN_MEDICPAIR			1624
#define ACHIEVEMENT_TF_PYRO_KILL_TAUNT				1625
#define ACHIEVEMENT_TF_PYRO_KILL_TEAMWORK			1626
#define ACHIEVEMENT_TF_PYRO_BURN_SPY_TAUNT			1627
#define ACHIEVEMENT_TF_PYRO_DOMINATE_LEAVESVR		1628
#define ACHIEVEMENT_TF_PYRO_REFLECT_CROCKET_KILL	1629
#define ACHIEVEMENT_TF_PYRO_KILL_TAUNTERS			1630
#define ACHIEVEMENT_TF_PYRO_DOUBLE_KO				1631
#define ACHIEVEMENT_TF_PYRO_BURN_RJ_SOLDIER			1632
#define ACHIEVEMENT_TF_PYRO_FREEZECAM_TAUNTS		1633
#define ACHIEVEMENT_TF_PYRO_KILL_GRIND_LARGE		1634
#define ACHIEVEMENT_TF_PYRO_IGNITE_FLAREGUN			1635
#define ACHIEVEMENT_TF_PYRO_ACHIEVE_PROGRESS1		1637
#define ACHIEVEMENT_TF_PYRO_ACHIEVE_PROGRESS2		1638
#define ACHIEVEMENT_TF_PYRO_ACHIEVE_PROGRESS3		1639
#define ACHIEVEMENT_TF_PYRO_IGNITE_WITH_RAINBOW		1640
#define ACHIEVEMENT_TF_PYRO_IGNITE_PLAYER_BEING_FLIPPED 1641
#define ACHIEVEMENT_TF_PYRO_END_RANGE				1641

// Spy
#define ACHIEVEMENT_TF_SPY_START_RANGE				1701
#define ACHIEVEMENT_TF_SPY_BACKSTAB_SNIPERS			1701
#define ACHIEVEMENT_TF_SPY_FREEZECAM_FLICK			1702
#define ACHIEVEMENT_TF_SPY_BACKSTAB_DISGUISED_SPY	1703
#define ACHIEVEMENT_TF_SPY_BACKSTAB_DISGUISE_TARGET	1704
#define ACHIEVEMENT_TF_SPY_TAUNT_KILL				1705
#define ACHIEVEMENT_TF_SPY_BACKSTAB_MEDIC_HEALING_YOU	1706
#define ACHIEVEMENT_TF_SPY_BACKSTAB_ENGY_SAP_BUILDING	1707
#define ACHIEVEMENT_TF_SPY_SAP_BUILDING_BACKSTAB_ENGY	1708
#define ACHIEVEMENT_TF_SPY_BACKSTAB_MEDIC_PAIR		1709
#define ACHIEVEMENT_TF_SPY_BACKSTAB_FRIENDS			1710
#define ACHIEVEMENT_TF_SPY_DOMINATE_SNIPER			1711
#define ACHIEVEMENT_TF_SPY_BUMP_CLOAKED_SPY			1712
#define ACHIEVEMENT_TF_SPY_KILL_SPY_WITH_KNIFE		1713
#define ACHIEVEMENT_TF_SPY_SURVIVE_BURNING			1714
#define ACHIEVEMENT_TF_SPY_BREAK_SHIELD_KILL_SNIPER	1715
#define ACHIEVEMENT_TF_SPY_KILL_WORKING_ENGY		1716
#define ACHIEVEMENT_TF_SPY_FAST_CAP					1717
#define ACHIEVEMENT_TF_SPY_MEDIC_HEALING_KILL_ENEMY	1718
#define ACHIEVEMENT_TF_SPY_KILL_CP_DEFENDERS		1719
#define ACHIEVEMENT_TF_SPY_BACKSTAB_DOMINATING_ENEMY	1720
#define ACHIEVEMENT_TF_SPY_REVENGE_WITH_BACKSTAB	1721
#define ACHIEVEMENT_TF_SPY_KNIFE_KILL_WHILE_JARATED	1722
#define ACHIEVEMENT_TF_SPY_BACKSTAB_QUICK_KILLS		1723
#define ACHIEVEMENT_TF_SPY_BACKSTAB_GRIND			1724
#define ACHIEVEMENT_TF_SPY_SAPPER_GRIND				1725
#define ACHIEVEMENT_TF_SPY_SAPPER_TEAMWORK			1726
#define ACHIEVEMENT_TF_SPY_BACKSTAB_MEDIC_CHARGED	1727
#define ACHIEVEMENT_TF_SPY_BACKSTAB_CAPPING_ENEMIES	1728
#define ACHIEVEMENT_TF_SPY_BACKSTAB_ENEMY_SWITCH_PYRO	1729
#define ACHIEVEMENT_TF_SPY_AMBASSADOR_GRIND			1730
#define ACHIEVEMENT_TF_SPY_AMBASSADOR_SNIPER_GRIND	1731
#define ACHIEVEMENT_TF_SPY_FEIGN_DEATH_KILL			1732
#define ACHIEVEMENT_TF_SPY_AMBASSADOR_SCOUT_GRIND	1733
#define ACHIEVEMENT_TF_SPY_CAMP_POSITION			1734
#define ACHIEVEMENT_TF_SPY_ACHIEVE_PROGRESS1		1735
#define ACHIEVEMENT_TF_SPY_ACHIEVE_PROGRESS2		1736
#define ACHIEVEMENT_TF_SPY_ACHIEVE_PROGRESS3		1737
#define ACHIEVEMENT_TF_SPY_KILL_BACKSCATTER_SCOUT	1738
#define ACHIEVEMENT_TF_SPY_END_RANGE				1738

// Engineer
#define ACHIEVEMENT_TF_ENGINEER_START_RANGE					1801
#define ACHIEVEMENT_TF_ENGINEER_ACHIEVE_PROGRESS1			1801
#define ACHIEVEMENT_TF_ENGINEER_ACHIEVE_PROGRESS2			1802
#define ACHIEVEMENT_TF_ENGINEER_ACHIEVE_PROGRESS3			1803
#define ACHIEVEMENT_TF_ENGINEER_REVENGE_CRIT_SENTRY_KILLER	1804
#define ACHIEVEMENT_TF_ENGINEER_TELEPORT_GRIND				1805
#define ACHIEVEMENT_TF_ENGINEER_DISPENSER_EXTINGUISH		1806
#define ACHIEVEMENT_TF_ENGINEER_MANUAL_CLOAKED_SPY_KILL		1807
#define ACHIEVEMENT_TF_ENGINEER_REVENGE_CRIT_LIFE			1808
#define ACHIEVEMENT_TF_ENGINEER_MANUAL_SENTRY_ABSORB_DMG				1809
#define ACHIEVEMENT_TF_ENGINEER_MANUAL_SENTRY_KILLS_BEYOND_RANGE		1810
#define ACHIEVEMENT_TF_ENGINEER_UPGRADE_BUILDINGS			1811
#define ACHIEVEMENT_TF_ENGINEER_DISPENSER_HEAL_GROUP		1812
#define ACHIEVEMENT_TF_ENGINEER_SENTRY_KILL_LIFETIME_GRIND	1813
#define ACHIEVEMENT_TF_ENGINEER_WASTE_METAL_GRIND			1814
#define ACHIEVEMENT_TF_ENGINEER_KILL_FLAG_CARRIERS			1815
#define ACHIEVEMENT_TF_ENGINEER_KILL_DISGUISED_SPY			1816
#define ACHIEVEMENT_TF_ENGINEER_HELP_BUILD_STRUCTURE		1817
#define ACHIEVEMENT_TF_ENGINEER_FREEZECAM_TAUNT				1818
#define ACHIEVEMENT_TF_ENGINEER_FREEZECAM_SENTRY			1819
#define ACHIEVEMENT_TF_ENGINEER_SHOTGUN_KILL_PREV_SENTRY_TARGET	1820
#define ACHIEVEMENT_TF_ENGINEER_SENTRY_AVENGES_YOU			1821
#define ACHIEVEMENT_TF_ENGINEER_REPAIR_SENTRY_W_MEDIC		1822
#define ACHIEVEMENT_TF_ENGINEER_SENTRY_KILL_CAPS			1823
#define ACHIEVEMENT_TF_ENGINEER_DESTROY_SAPPERS				1824
#define ACHIEVEMENT_TF_ENGINEER_KILL_SPY_TWO_SAPPERS		1825
#define ACHIEVEMENT_TF_ENGINEER_REMOVE_SAPPER_LONG_DIST		1826
#define ACHIEVEMENT_TF_ENGINEER_TAUNT_KILL					1827
#define ACHIEVEMENT_TF_ENGINEER_DESTROY_STICKIES			1828
#define ACHIEVEMENT_TF_ENGINEER_HELP_MANUAL_SENTRY			1829
#define ACHIEVEMENT_TF_ENGINEER_KILL_SNIPERS_SENTRY			1830
#define ACHIEVEMENT_TF_ENGINEER_KILL_SENTRY_WITH_SENTRY		1831
#define ACHIEVEMENT_TF_ENGINEER_MOVE_SENTRY_GET_KILL		1832
#define ACHIEVEMENT_TF_ENGINEER_BUILDING_CARRY				1833
#define ACHIEVEMENT_TF_ENGINEER_KILL_ASSIST					1834
#define ACHIEVEMENT_TF_ENGINEER_DISPENSER_HEAL_GRIND		1835
#define ACHIEVEMENT_TF_ENGINEER_REPAIR_TEAM_GRIND			1836
#define ACHIEVEMENT_TF_ENGINEER_TANK_DAMAGE					1837
#define ACHIEVEMENT_TF_ENGINEER_HEAVY_ASSIST				1838
#define ACHIEVEMENT_TF_ENGINEER_END_RANGE					1838

#define ACHIEVEMENT_END_CLASS_SPECIFIC			1899
 
// Halloween Events
#define ACHIEVEMENT_TF_HALLOWEEN_START_RANGE					1901
#define ACHIEVEMENT_TF_HALLOWEEN_COLLECT_PUMPKINS				1901
#define ACHIEVEMENT_TF_HALLOWEEN_DOMINATE_FOR_HAT				1902
#define ACHIEVEMENT_TF_HALLOWEEN_KILL_SCARED_PLAYER				1903
#define ACHIEVEMENT_TF_HALLOWEEN_PUMPKIN_KILL					1904
#define ACHIEVEMENT_TF_HALLOWEEN_DISGUISED_SPY_KILL				1905
#define ACHIEVEMENT_TF_HALLOWEEN_BOSS_KILL						1906
#define ACHIEVEMENT_TF_HALLOWEEN_COLLECT_GOODY_BAG				1907
#define ACHIEVEMENT_TF_HALLOWEEN_CRAFT_SAXTON_MASK				1908
#define ACHIEVEMENT_TF_HALLOWEEN_BOSS_KILL_MELEE				1909
#define ACHIEVEMENT_TF_HALLOWEEN_EYEBOSS_KILL					1910
#define ACHIEVEMENT_TF_HALLOWEEN_LOOT_ISLAND					1911
#define ACHIEVEMENT_TF_HALLOWEEN_MERASMUS_COLLECT_LOOT			1912
#define ACHIEVEMENT_TF_HALLOWEEN_MERASMUS_KILL					1913
// These six achievements are part of the milestone for Helltower. Order matters here.
#define ACHIEVEMENT_TF_HALLOWEEN_HELLTOWER_RARE_SPELL			1914
#define ACHIEVEMENT_TF_HALLOWEEN_HELLTOWER_WIN_ROUNDS			1915
#define ACHIEVEMENT_TF_HALLOWEEN_HELLTOWER_ENVIRONMENTAL_KILLS	1916
#define ACHIEVEMENT_TF_HALLOWEEN_HELLTOWER_SKELETON_GRIND		1917
#define ACHIEVEMENT_TF_HALLOWEEN_HELLTOWER_KILL_GRIND			1918
#define ACHIEVEMENT_TF_HALLOWEEN_HELLTOWER_KILL_BROTHERS		1919
// This is the milestone for Helltower. Order matters here. 4/6 of the above achievements are required.
#define ACHIEVEMENT_TF_HALLOWEEN_HELLTOWER_MILESTONE			1920
#define ACHIEVEMENT_TF_HALLOWEEN_HELLTOWER_SKULL_ISLAND_REWARD	1921
// These six achievements are part of the milestone for Doomsday. Order matters here.
#define ACHIEVEMENT_TF_HALLOWEEN_DOOMSDAY_KILL_KARTS			1922
#define ACHIEVEMENT_TF_HALLOWEEN_DOOMSDAY_COLLECT_DUCKS			1923
#define ACHIEVEMENT_TF_HALLOWEEN_DOOMSDAY_SCORE_GOALS			1924
#define ACHIEVEMENT_TF_HALLOWEEN_DOOMSDAY_RESPAWN_TEAMMATES		1925
#define ACHIEVEMENT_TF_HALLOWEEN_DOOMSDAY_TINY_SMASHER			1926
#define ACHIEVEMENT_TF_HALLOWEEN_DOOMSDAY_WIN_MINIGAMES			1927
// This is the milestone for Doomsday. Order matters here. 4/6 of the above achievements are required.
#define ACHIEVEMENT_TF_HALLOWEEN_DOOMSDAY_MILESTONE				1928
#define ACHIEVEMENT_TF_HALLOWEEN_END_RANGE						1928

// Replay Achievements
#define ACHIEVEMENT_TF_REPLAY_START_RANGE			2001
#define ACHIEVEMENT_TF_REPLAY_SAVE_REPLAY			2001
#define ACHIEVEMENT_TF_REPLAY_PERFORMANCE_MODE		2002
#define ACHIEVEMENT_TF_REPLAY_BROWSE_REPLAYS		2003
#define ACHIEVEMENT_TF_REPLAY_EDIT_TIME				2004
#define ACHIEVEMENT_TF_REPLAY_YOUTUBE_VIEWS_TIER1	2005
#define ACHIEVEMENT_TF_REPLAY_YOUTUBE_VIEWS_TIER2	2006
#define ACHIEVEMENT_TF_REPLAY_YOUTUBE_VIEWS_TIER3	2007
#define ACHIEVEMENT_TF_REPLAY_YOUTUBE_VIEWS_HIGHEST	2008
#define ACHIEVEMENT_TF_REPLAY_END_RANGE				2008

// Christmas Event
#define ACHIEVEMENT_TF_CHRISTMAS_START_RANGE		2101
#define ACHIEVEMENT_TF_CHRISTMAS_COLLECT_GIFTS		2101
#define ACHIEVEMENT_TF_CHRISTMAS_END_RANGE			2101

// Foundry Achievements
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_START_RANGE				2201
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_KILL_CAPPING_ENEMY		2201
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_PLAY_GAME_FRIENDS		2202
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_WIN_MINTIME				2203
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_WIN_ROUNDS				2204
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_FAST_FINAL_CAP			2205
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_TELEPORT_AND_CAP		2206
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_PUSH_INTO_CAULDRON		2207
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_PUSH_BACK_AND_WIN		2208
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_PLAY_EACH_CLASS			2209
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_KILL_ENEMY_ON_ROOF		2210
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_BACK_AND_FORTH_BATTLE	2211
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_ACHIEVE_PROGRESS1		2212
#define ACHIEVEMENT_TF_MAPS_FOUNDRY_END_RANGE				2212

// MvM Achievements
#define ACHIEVEMENT_TF_MVM_START_RANGE						2301
#define ACHIEVEMENT_TF_MVM_COMPLETE_POP_FILE				2301
#define ACHIEVEMENT_TF_MVM_EARN_MONEY_BONUS					2302
#define ACHIEVEMENT_TF_MVM_ADVANCED_EARN_ALL_BONUSES		2303
#define ACHIEVEMENT_TF_MVM_PICKUP_MONEY_ABOUT_TO_EXPIRE		2304
#define ACHIEVEMENT_TF_MVM_COLLECT_MONEY_GRIND				2305
#define ACHIEVEMENT_TF_MVM_PLAY_GAME_FRIENDS				2306
#define ACHIEVEMENT_TF_MVM_PLAY_EACH_CLASS					2307
#define ACHIEVEMENT_TF_MVM_DESTROY_TWO_TANKS				2308
#define ACHIEVEMENT_TF_MVM_DESTROY_TANK_WHILE_DEPLOYING		2309
#define ACHIEVEMENT_TF_MVM_DESTROY_TANK_QUICKLY				2310
#define ACHIEVEMENT_TF_MVM_DEFEND_CAP						2311
#define ACHIEVEMENT_TF_MVM_KILL_BOMB_CARRIERS				2312
#define ACHIEVEMENT_TF_MVM_COMPLETE_WAVE_WITHOUT_DYING		2313
#define ACHIEVEMENT_TF_MVM_COMPLETE_TOUR					2314
#define ACHIEVEMENT_TF_MVM_USE_TELEPORT_BOTTLE				2315
#define ACHIEVEMENT_TF_MVM_USE_CRIT_BOTTLE					2316
#define ACHIEVEMENT_TF_MVM_USE_UBER_BOTTLE					2317
#define ACHIEVEMENT_TF_MVM_USE_BUILD_BOTTLE					2318
#define ACHIEVEMENT_TF_MVM_USE_AMMO_BOTTLE					2319
#define ACHIEVEMENT_TF_MVM_MAX_PRIMARY_UPGRADES				2320
#define ACHIEVEMENT_TF_MVM_MAX_PLAYER_RESISTANCES			2321
#define ACHIEVEMENT_TF_MVM_NO_ALARMS_IN_FINAL_WAVE			2322
#define ACHIEVEMENT_TF_MVM_KILL_MEDICS_CHARGED				2323
#define ACHIEVEMENT_TF_MVM_KILL_ROBOT_GRIND					2324
#define ACHIEVEMENT_TF_MVM_KILL_ROBOT_MEGA_GRIND			2325
#define ACHIEVEMENT_TF_MVM_KILL_SENTRY_BUSTER				2326
#define ACHIEVEMENT_TF_MVM_SPY_SAP_ROBOTS					2327
#define ACHIEVEMENT_TF_MVM_SOLDIER_BUFF_TEAM				2328
#define ACHIEVEMENT_TF_MVM_HEAVY_RAGE_PUSH_DEPLOYING_ROBOT	2329
#define ACHIEVEMENT_TF_MVM_MEDIC_SHARE_BOTTLES				2330
#define ACHIEVEMENT_TF_MVM_DEMO_GROUP_KILL					2331
#define ACHIEVEMENT_TF_MVM_SCOUT_MARK_FOR_DEATH				2332
#define ACHIEVEMENT_TF_MVM_SNIPER_KILL_GROUP				2333
#define ACHIEVEMENT_TF_MVM_PYRO_BOMB_RESET					2334
#define ACHIEVEMENT_TF_MVM_ENGINEER_ESCAPE_SENTRY_BUSTER	2335
#define ACHIEVEMENT_TF_MVM_ACHIEVE_PROGRESS1				2336
#define ACHIEVEMENT_TF_MVM_ACHIEVE_PROGRESS2				2337
#define ACHIEVEMENT_TF_MVM_ACHIEVE_PROGRESS3				2338
#define ACHIEVEMENT_TF_MVM_MAPS_ROTTENBURG_TANK				2339
#define ACHIEVEMENT_TF_MVM_MAPS_ROTTENBURG_BOMB				2340
#define ACHIEVEMENT_TF_MVM_MAPS_ROTTENBURG_PIT_GRIND		2341
#define ACHIEVEMENT_TF_MVM_MAPS_MANNHATTAN_PIT				2342
#define ACHIEVEMENT_TF_MVM_MAPS_MANNHATTAN_MYSTERY			2343
#define ACHIEVEMENT_TF_MVM_MAPS_MANNHATTAN_NO_GATES			2344
#define ACHIEVEMENT_TF_MVM_MAPS_MANNHATTAN_STUN_RADIOWAVE	2345
#define ACHIEVEMENT_TF_MVM_MAPS_MANNHATTAN_BOMB_BOT_GRIND	2346
#define ACHIEVEMENT_TF_MVM_SENTRY_BUSTER_FRIENDLY_FIRE		2347
#define ACHIEVEMENT_TF_MVM_SNIPER_COLLECT_HEADSHOT_MONEY	2348
#define ACHIEVEMENT_TF_MVM_MEDIC_SHIELD_BLOCK_DAMAGE		2349
#define ACHIEVEMENT_TF_MVM_MEDIC_REVIVE_TEAMMATES			2350
#define ACHIEVEMENT_TF_MVM_ROCKET_SPECIALIST_KILL_GRIND		2351
#define ACHIEVEMENT_TF_MVM_ROCKET_SPECIALIST_STUN_GRIND		2352
#define ACHIEVEMENT_TF_MVM_END_RANGE						2352

// Doomsday Achievements
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_START_RANGE				2401
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_SOLO_CAPTURE				2401
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_PLAY_GAME_FRIENDS			2402
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_WIN_ROUNDS					2403
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_PLAY_EACH_CLASS			2404
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_KILL_ENEMIES_ON_ELEVATOR	2405
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_PUSH_BACK_AND_WIN			2406
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_KILL_CARRIERS				2407
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_RIDE_THE_ELEVATOR			2408
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_DENY_NEUTRAL_PICKUP		2409
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_PUSH_INTO_EXHAUST			2410
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_DEFEND_CARRIER				2411
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_ACHIEVE_PROGRESS1			2412
#define ACHIEVEMENT_TF_MAPS_DOOMSDAY_END_RANGE					2412

// Process Achievement
#define ACHIEVEMENT_TF_MAPS_PROCESS_START_RANGE				2501
#define ACHIEVEMENT_TF_MAPS_PROCESS_WIN_ROUNDS				2501
#define ACHIEVEMENT_TF_MAPS_PROCESS_END_RANGE				2501

// Standin Achievement
#define ACHIEVEMENT_TF_MAPS_STANDIN_START_RANGE				2601
#define ACHIEVEMENT_TF_MAPS_STANDIN_WIN_ROUNDS				2601
#define ACHIEVEMENT_TF_MAPS_STANDIN_END_RANGE				2601

// Snakewater Achievements
#define ACHIEVEMENT_TF_MAPS_SNAKEWATER_START_RANGE				2701
#define ACHIEVEMENT_TF_MAPS_SNAKEWATER_WIN_ROUNDS				2701
#define ACHIEVEMENT_TF_MAPS_SNAKEWATER_PUSH_BACK_AND_WIN		2702
#define ACHIEVEMENT_TF_MAPS_SNAKEWATER_TEAM_KILL				2703
#define ACHIEVEMENT_TF_MAPS_SNAKEWATER_DOUBLE_AIR_DEATHS		2704
#define ACHIEVEMENT_TF_MAPS_SNAKEWATER_KILL_ENEMIES_IN_MIDDLE	2705
#define ACHIEVEMENT_TF_MAPS_SNAKEWATER_END_RANGE				2705

// Powerhouse Achievements
#define ACHIEVEMENT_TF_MAPS_POWERHOUSE_START_RANGE				2801
#define ACHIEVEMENT_TF_MAPS_POWERHOUSE_WIN_ROUNDS				2801
#define ACHIEVEMENT_TF_MAPS_POWERHOUSE_PUSH_BACK_AND_WIN		2802
#define ACHIEVEMENT_TF_MAPS_POWERHOUSE_FAST_FINAL_CAP			2803
#define ACHIEVEMENT_TF_MAPS_POWERHOUSE_KILL_CAPPING_PLAYER		2804
#define ACHIEVEMENT_TF_MAPS_POWERHOUSE_KILL_ENEMY_IN_WATER		2805
#define ACHIEVEMENT_TF_MAPS_POWERHOUSE_END_RANGE				2805

const unsigned char *GetTFEncryptionKey( void );

//-----------------------------------------------------------------------------
// Sapping Events
//-----------------------------------------------------------------------------
enum
{
	TF_SAPEVENT_NONE = 0,	
	TF_SAPEVENT_PLACED,
	TF_SAPEVENT_DONE,
};

//-----------------------------------------------------------------------------
// Helper code shared between client/server.
//-----------------------------------------------------------------------------
inline bool BIsAttributeValueWithDeltaOverCap( float flCurAttributeValue, float flAttrDeltaValue, float flCap )
{
	return AlmostEqual( flCurAttributeValue, flCap )
		|| ( flAttrDeltaValue > 0 && flCurAttributeValue >= flCap )
		|| ( flAttrDeltaValue < 0 && flCurAttributeValue <= flCap );
}

//-----------------------------------------------------------------------------
// Helltower Announcer lines for Redmond and Blutarch
//-----------------------------------------------------------------------------
enum
{
	HELLTOWER_VO_RED_MISC = 0,
	HELLTOWER_VO_BLUE_MISC,
	HELLTOWER_VO_RED_MISC_RARE,
	HELLTOWER_VO_BLUE_MISC_RARE,
	HELLTOWER_VO_RED_WINNING,
	HELLTOWER_VO_BLUE_WINNING,
	HELLTOWER_VO_RED_WINNING_RARE,
	HELLTOWER_VO_BLUE_WINNING_RARE,
	HELLTOWER_VO_RED_LOSING,
	HELLTOWER_VO_BLUE_LOSING,
	HELLTOWER_VO_RED_LOSING_RARE,
	HELLTOWER_VO_BLUE_LOSING_RARE,
	HELLTOWER_VO_RED_WIN,
	HELLTOWER_VO_BLUE_WIN,
	HELLTOWER_VO_RED_WIN_RARE,
	HELLTOWER_VO_BLUE_WIN_RARE,
	HELLTOWER_VO_RED_LOSE,
	HELLTOWER_VO_BLUE_LOSE,
	HELLTOWER_VO_RED_LOSE_RARE,
	HELLTOWER_VO_BLUE_LOSE_RARE,
	HELLTOWER_VO_RED_ROUNDSTART,
	HELLTOWER_VO_BLUE_ROUNDSTART,
	HELLTOWER_VO_RED_ROUNDSTART_RARE,
	HELLTOWER_VO_BLUE_ROUNDSTART_RARE,
	HELLTOWER_VO_RED_SKELETON_KING,
	HELLTOWER_VO_BLUE_SKELETON_KING,
	HELLTOWER_VO_RED_NEAR_WIN,
	HELLTOWER_VO_BLUE_NEAR_WIN,
	HELLTOWER_VO_RED_NEAR_LOSE,
	HELLTOWER_VO_BLUE_NEAR_LOSE,
	
	HELLTOWER_VO_COUNT,
};

struct helltower_vo_t
{
	const char *m_pszFormatString;
	int			m_nCount;
};

extern helltower_vo_t g_pszHelltowerAnnouncerLines[];

// flags to ignore certain check in CanAttack function
#define TF_CAN_ATTACK_FLAG_NONE				0
#define TF_CAN_ATTACK_FLAG_GRAPPLINGHOOK	0x01

struct PlayerHistoryInfo_t
{
	CSteamID steamID;
	float flTime;		// Time last seen
	int nTeam;			// Last team they were on
};

// When adding new RuneTypes_t, make sure to add new condition codes to 
// ETFCond and also update GetConditionFromRuneType and GetRuneTypeFromCondition.
enum RuneTypes_t
{
	RUNE_NONE = -1,
	RUNE_STRENGTH,
	RUNE_HASTE,
	RUNE_REGEN,
	RUNE_RESIST,
	RUNE_VAMPIRE,
	RUNE_REFLECT,
	RUNE_PRECISION,
	RUNE_AGILITY,
	RUNE_KNOCKOUT,
	RUNE_KING,
	RUNE_PLAGUE,
	RUNE_SUPERNOVA,

	// ADD NEW RUNE TYPE HERE, DO NOT RE-ORDER

	RUNE_TYPES_MAX
};

inline ETFCond GetConditionFromRuneType( RuneTypes_t rt )
{
	switch ( rt )
	{ 
	case RUNE_NONE:			return TF_COND_INVALID;
	case RUNE_STRENGTH:		return TF_COND_RUNE_STRENGTH;
	case RUNE_HASTE:		return TF_COND_RUNE_HASTE;
	case RUNE_REGEN:		return TF_COND_RUNE_REGEN;
	case RUNE_RESIST:		return TF_COND_RUNE_RESIST;
	case RUNE_VAMPIRE:		return TF_COND_RUNE_VAMPIRE;
	case RUNE_REFLECT:		return TF_COND_RUNE_REFLECT;
	case RUNE_PRECISION:	return TF_COND_RUNE_PRECISION;
	case RUNE_AGILITY:		return TF_COND_RUNE_AGILITY;
	case RUNE_KNOCKOUT:		return TF_COND_RUNE_KNOCKOUT;
	case RUNE_KING:			return TF_COND_RUNE_KING;
	case RUNE_PLAGUE:		return TF_COND_RUNE_PLAGUE;
	case RUNE_SUPERNOVA:	return TF_COND_RUNE_SUPERNOVA;
	default:
		AssertMsg( 0, "Unexpected rune_type rt (%d) in GetConditionFromRuneType", rt );	
	}

	return TF_COND_INVALID;
}

enum TemporaryRuneTypes_t
{
	RUNETYPE_TEMP_NONE = 0,

	RUNETYPE_TEMP_CRIT,
	RUNETYPE_TEMP_UBER,

	RUNETYPE_TEMP_MAX,
};

const char *GetPowerupIconName( RuneTypes_t type, int iTeam );

#define TOURNAMENT_NOCANCEL_TIME 10

#define TF_WEAPON_PICKUP_RANGE 150

enum CampaignMedalDisplayType_t
{
	CAMPAIGN_MEDAL_DISPLAY_TYPE_NONE = 0,

	// Gun Mettle Campaign
	CAMPAIGN_MEDAL_DISPLAY_TYPE_SUMMER2015_GRAVEL,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_SUMMER2015_BRONZE,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_SUMMER2015_SILVER,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_SUMMER2015_GOLD,

	// Invasion Community Update
	CAMPAIGN_MEDAL_DISPLAY_TYPE_INVASION,

	// Halloween
	CAMPAIGN_MEDAL_DISPLAY_TYPE_HALLOWEEN_GRAVEL,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_HALLOWEEN_BRONZE,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_HALLOWEEN_SILVER,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_HALLOWEEN_GOLD,

	// Tough Break Campaign
	CAMPAIGN_MEDAL_DISPLAY_TYPE_WINTER2016_GRAVEL1,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_WINTER2016_BRONZE1,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_WINTER2016_SILVER1,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_WINTER2016_GOLD1,

	CAMPAIGN_MEDAL_DISPLAY_TYPE_WINTER2016_GRAVEL2,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_WINTER2016_BRONZE2,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_WINTER2016_SILVER2,
	CAMPAIGN_MEDAL_DISPLAY_TYPE_WINTER2016_GOLD2,

	CAMPAIGN_MEDAL_DISPLAY_TYPE_COUNT,
};

enum CampaignMedalBaseType_t
{
	CAMPAIGN_MEDAL_SUMMER2015		= 0x001,
	CAMPAIGN_MEDAL_INVASION			= 0x002,
	CAMPAIGN_MEDAL_HALLOWEEN		= 0x004,
	CAMPAIGN_MEDAL_WINTER2016		= 0x008,
};

extern const char *g_pszCampaignMedalIcons[];

// Rage buffs - how is rage generated with respect to a buff ID?
enum
{
	kRageBuffFlag_None = 0x00,
	kRageBuffFlag_OnDamageDealt = 0x01,
	kRageBuffFlag_OnDamageReceived = 0x02,
	kRageBuffFlag_OnMedicHealingReceived = 0x04,
	kRageBuffFlag_OnBurnDamageDealt = 0x08,
	kRageBuffFlag_OnHeal = 0x10
};

struct RageBuffType
{
	unsigned int m_iBuffFlags;
	float m_fRageScale;
	int m_nMaxPulses;
};

static const RageBuffType g_RageBuffTypes[] =
{
	{ kRageBuffFlag_None,					0.f,	10 },	// default/unknown buff type
	{ kRageBuffFlag_OnDamageDealt,			1.f,	10 },	// buff type 1
	{ kRageBuffFlag_OnDamageDealt,			1.f,	10 },	// buff type 2
	{ kRageBuffFlag_OnDamageDealt,			1.25f,	10 },	// buff type 3
	{ kRageBuffFlag_OnMedicHealingReceived,	1.f,	10 },	// buff type 4
	{ kRageBuffFlag_OnBurnDamageDealt,		1.f,	10 },	// pyro rage
	{ kRageBuffFlag_OnHeal,					1.f,	10 },	// medic healing
};

enum
{
	DRAWING_PANEL_TYPE_NONE,
	DRAWING_PANEL_TYPE_CRAFTING,
	DRAWING_PANEL_TYPE_MATCH_SUMMARY,

	DRAWING_PANEL_TYPE_MAX,
};

enum RankStatType_t
{
	RankStat_Invalid = -1,
	RankStat_Score = 0,
	RankStat_Kills,
	RankStat_Damage,
	RankStat_Healing,
	RankStat_Support,
	RankStat_Deaths,
};

enum StatMedal_t
{
	StatMedal_None = 0,
	StatMedal_Bronze = 1,
	StatMedal_Silver = 2,
	StatMedal_Gold = 3,

	StatMedal_Max
};

#define SF_TEAMSPAWN_SCOUT		1
#define SF_TEAMSPAWN_SNIPER		2
#define	SF_TEAMSPAWN_SOLDIER	4
#define SF_TEAMSPAWN_DEMOMAN	8
#define SF_TEAMSPAWN_MEDIC		16
#define SF_TEAMSPAWN_HEAVY		32
#define SF_TEAMSPAWN_PYRO		64
#define	SF_TEAMSPAWN_SPY		128
#define	SF_TEAMSPAWN_ENGINEER	256

enum MM_PlayerConnectionState_t
{
	MM_DISCONNECTED = 0,
	MM_CONNECTED,
	MM_CONNECTING, // the server knows that this player is coming
	MM_LOADING, // loading into the server
	MM_WAITING_FOR_PLAYER
};

#endif // TF_SHAREDDEFS_H