game.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  1. ////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright 2016 RWS Inc, All Rights Reserved
  4. //
  5. // This program is free software; you can redistribute it and/or modify
  6. // it under the terms of version 2 of the GNU General Public License as published by
  7. // the Free Software Foundation
  8. //
  9. // This program is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License along
  15. // with this program; if not, write to the Free Software Foundation, Inc.,
  16. // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17. //
  18. // game.h
  19. // Project: Nostril (aka Postal)
  20. //
  21. // History:
  22. // 12/02/96 MJR Started.
  23. //
  24. // 01/31/97 JMI Added g_resmgrGame for specific to actual game data.
  25. //
  26. // 01/31/97 JMI Added m_lTitleLoadLoops to settings.
  27. //
  28. // 02/03/97 JMI Added NoSakDir directory for files when there is no SAK
  29. // to settings.
  30. //
  31. // 02/04/97 JMI Added functions to get and set the gamma level.
  32. //
  33. // 02/13/97 JMI Removed game level alpha XRay stuff (now setup in CHood).
  34. //
  35. // 02/21/97 JMI Now sets gamma level on Save().
  36. // Also, added m_sUseCurrentDeviceDimensions to settings
  37. // indicating, if TRUE, not to change the current display
  38. // device mode.
  39. //
  40. // 03/24/97 JMI Added m_dDegreesPerSec and m_sUseMouse to CGameSettings.
  41. //
  42. // 03/31/97 JMI Moved CGameSettings definition to GameSettings.h and the
  43. // implementation to GameSettings.cpp.
  44. //
  45. // 04/11/97 JMI Added Game_Menu_Demo() proto.
  46. //
  47. // 05/21/97 JMI Added a resource manager for resources that are not SAKed.
  48. //
  49. // 06/12/97 MJR Rewored the callbacks so that the game-specific code now
  50. // resides in this module rather than the menu module.
  51. //
  52. // 06/16/97 JMI Added g_fontSmall.
  53. //
  54. // 06/18/97 MJR Added SeedRandom() and GetRandom().
  55. //
  56. // 06/24/97 JMI Added SynchLog() and associated macros.
  57. //
  58. // 07/03/97 JMI Added Game_ControlsMenu().
  59. //
  60. // 07/11/97 BRH Finished up the expiration date checking for the
  61. // Registry. Still need to add something for the Mac
  62. // version. Verified that it works with different times
  63. // and dates.
  64. //
  65. // 07/13/97 JMI Added Game_StartChallengeGame() proto.
  66. //
  67. // 07/18/97 BRH Added game load and save functions so that the player's
  68. // game can be saved and loaded. Also added a global
  69. // stockpile object used to transfer loaded/saved info to/from
  70. // the CDude's stockpile.
  71. //
  72. // 07/26/97 JMI Added g_fontPostal to replace g_fontSmall. Got rid of
  73. // g_fontSmall.
  74. //
  75. // 08/05/97 JMI Added Game_AudioOptionsChoice().
  76. //
  77. // 08/12/97 JMI Added SubPathOpenBox() (see proto for details) and
  78. // FullPathCustom().
  79. //
  80. // 08/14/97 JMI Added psDifficulty parameter to Game_Save/LoadPlayersGame()
  81. // so they can query/modify realm difficulty.
  82. //
  83. //
  84. // 08/15/97 JRD Added a function to control brightness/contrast in place
  85. // of gamme. This was because the gamma function could not
  86. // recreate a "normal palette."
  87. //
  88. // 08/15/97 JRD Attempted to hook both brightness and contrast changes to
  89. // the old gamma slider with a crude algorithm.
  90. //
  91. // 08/20/97 JMI Moved Game_LoadPlayersGame() proto into game.cpp b/c it
  92. // now takes an ACTION* but ACTION is defined in game.cpp and
  93. // since no one currently calls this function externally, what
  94. // the hell.
  95. //
  96. // 08/21/97 MJR Added Game_HostMultiGame() and Game_JoinMultiGame().
  97. //
  98. // 08/21/97 JMI Added rspUpdateDisplay() macros to flag these calls (they
  99. // should be calls to app level version -- UpdateDisplay() ).
  100. //
  101. // 08/22/97 JMI Removed rspUpdateDisplay() macro b/c we don't need it now that
  102. // we're lock/unlocking correctly.
  103. //
  104. // 08/23/97 JMI Added Game_InitMainMenu() so game.cpp can hook init/kill of
  105. // main menu.
  106. //
  107. // 10/07/97 JMI Now GetRandom() uses the logging call in any TRACENASSERT
  108. // mode (used to be just in _DEBUG mode).
  109. //
  110. // 10/14/97 JMI LOG() and if() no longer automatically call GetInstanceID()
  111. // (too many GetRand()s are called from non-CThings). Now
  112. // LOG() has an additional argument for specifying the user
  113. // value which, of course, could be a call to GetInstanceID().
  114. //
  115. // 10/14/97 JMI Made SynchLog()'s expr parameter a double instead of an int
  116. // for more accuracy.
  117. //
  118. ////////////////////////////////////////////////////////////////////////////////
  119. #ifndef GAME_H
  120. #define GAME_H
  121. #include "RSPiX.h"
  122. #ifdef PATHS_IN_INCLUDES
  123. #include "WishPiX/ResourceManager/resmgr.h"
  124. #else
  125. #include "resmgr.h"
  126. #endif
  127. #include "settings.h"
  128. #include "localize.h"
  129. #include "GameSettings.h"
  130. #include "StockPile.h"
  131. ////////////////////////////////////////////////////////////////////////////////
  132. // Macros.
  133. ////////////////////////////////////////////////////////////////////////////////
  134. // Global game settings
  135. extern CGameSettings g_GameSettings;
  136. // Check for cookie flag
  137. extern long g_lCookieMonster;
  138. // Global screen buffer
  139. extern RImage* g_pimScreenBuf;
  140. // Global big font
  141. extern RFont g_fontBig;
  142. // Global Postal font.
  143. extern RFont g_fontPostal;
  144. // Global flag for end of level
  145. extern bool g_bLastLevelDemo;
  146. // Resource manager for game resources. These are resources used by the actual
  147. // game, like things that a CThing loads that is not level specific. For example,
  148. // CBall loads, of course, foot.bmp, which would be loaded through this ResMgr.
  149. // Note: This resmgr should not be used for things like info on ordering, menu
  150. // resources, g_fontBig, or anything not specific to the real game.
  151. // Note: Realm specifc data, such as alpha effects, etc., should be loaded
  152. // through prealm->m_resmgr.
  153. extern RResMgr g_resmgrGame;
  154. // Resource manager for shell resources. Do not use this to load things like
  155. // the main dudes' sprites.
  156. extern RResMgr g_resmgrShell;
  157. // Resource manager for non-SAK resources.
  158. extern RResMgr g_resmgrRes;
  159. // Time codes for registry values and expiration date
  160. extern long g_lRegTime;
  161. extern long g_lRegValue;
  162. extern long g_lExpTime;
  163. extern long g_lExpValue;
  164. extern long g_lReleaseTime;
  165. // Loaded and saved games use this stockpile to transfer to/from the
  166. // dude's stockpile
  167. extern CStockPile g_stockpile;
  168. extern bool g_bTransferStockpile;
  169. extern short g_sRealmNumToSave;
  170. ////////////////////////////////////////////////////////////////////////////////
  171. //
  172. // Do the high-level startup stuff, run the game, and then cleanup afterwards.
  173. //
  174. // It is assumed that the system/RSPiX environment are setup properly before
  175. // this function is called.
  176. //
  177. ////////////////////////////////////////////////////////////////////////////////
  178. extern void TheGame(void);
  179. ////////////////////////////////////////////////////////////////////////////////
  180. //
  181. // Callback for the "Start Single Player Game" menu
  182. //
  183. ////////////////////////////////////////////////////////////////////////////////
  184. extern void Game_StartSinglePlayerGame(
  185. short sMenuItem);
  186. ////////////////////////////////////////////////////////////////////////////////
  187. //
  188. // Callback for the "Start MultiPlayer Game" menu
  189. //
  190. ////////////////////////////////////////////////////////////////////////////////
  191. extern bool Game_StartMultiPlayerGame(
  192. short sMenuItem);
  193. ////////////////////////////////////////////////////////////////////////////////
  194. //
  195. // Callback for the "Join MultiPlayer Game" menu
  196. //
  197. ////////////////////////////////////////////////////////////////////////////////
  198. extern void Game_JoinMultiPlayerGame(
  199. short sMenuItem);
  200. ////////////////////////////////////////////////////////////////////////////////
  201. //
  202. // Callback for the "Host MultiPlayer Game" menu
  203. //
  204. ////////////////////////////////////////////////////////////////////////////////
  205. extern void Game_HostMultiPlayerGame(
  206. short sMenuItem);
  207. ////////////////////////////////////////////////////////////////////////////////
  208. //
  209. // Callback for the Main Menu init/kill.
  210. //
  211. ////////////////////////////////////////////////////////////////////////////////
  212. extern void Game_InitMainMenu( // Returns nothing.
  213. short sInit); // In: TRUE, if initializing; FALSE, if killing.
  214. ////////////////////////////////////////////////////////////////////////////////
  215. //
  216. // Callback for the "Start Demo Game" menu
  217. //
  218. ////////////////////////////////////////////////////////////////////////////////
  219. extern void Game_StartDemoGame(
  220. short sMenuItem);
  221. ////////////////////////////////////////////////////////////////////////////////
  222. //
  223. // Callback for the "Editor" option on the Main Menu
  224. //
  225. ////////////////////////////////////////////////////////////////////////////////
  226. extern void Game_StartEditor(void);
  227. ////////////////////////////////////////////////////////////////////////////////
  228. //
  229. // Callback for the "Buy" option on the Main Menu
  230. //
  231. ////////////////////////////////////////////////////////////////////////////////
  232. extern void Game_Buy(void);
  233. ////////////////////////////////////////////////////////////////////////////////
  234. //
  235. // Callback for the "Controls" menu.
  236. //
  237. ////////////////////////////////////////////////////////////////////////////////
  238. extern void Game_ControlsMenu( // Returns nothing.
  239. short sMenuItem); // In: Chosen menu item.
  240. ////////////////////////////////////////////////////////////////////////////////
  241. //
  242. // Callback for the "Start Challenge" menu.
  243. //
  244. ////////////////////////////////////////////////////////////////////////////////
  245. extern void Game_StartChallengeGame( // Returns nothing.
  246. short sMenuItem); // In: Chosen menu item.
  247. ////////////////////////////////////////////////////////////////////////////////
  248. //
  249. // Callback for "Audio Options" menu.
  250. //
  251. ////////////////////////////////////////////////////////////////////////////////
  252. extern void Game_AudioOptionsChoice( // Returns nothing.
  253. short sMenuItem); // In: Chosen item.
  254. ////////////////////////////////////////////////////////////////////////////////
  255. //
  256. // Save game settings of the current level so that play can continue on this
  257. // level.
  258. //
  259. ////////////////////////////////////////////////////////////////////////////////
  260. extern short Game_SavePlayersGame( // Returns SUCCESS if all goes well
  261. char* pszSaveName, // In: Name of the save file
  262. short sDifficulty); // In: Current realm difficulty.
  263. ////////////////////////////////////////////////////////////////////////////////
  264. //
  265. // Seed the random number generator
  266. //
  267. ////////////////////////////////////////////////////////////////////////////////
  268. #define SeedRand SeedRandom
  269. extern void SeedRandom(
  270. long lSeed);
  271. ////////////////////////////////////////////////////////////////////////////////
  272. //
  273. // Get a random number
  274. //
  275. ////////////////////////////////////////////////////////////////////////////////
  276. #define GetRand GetRandom
  277. #if defined(_DEBUG) || defined(TRACENASSERT)
  278. #define GetRandom() GetRandomDebug(__FILE__, __LINE__)
  279. extern long GetRandomDebug(char* FILE_MACRO, long LINE_MACRO);
  280. #else
  281. extern long GetRandom(void);
  282. #endif // defined(_DEBUG) || defined(TRACENASSERT)
  283. ////////////////////////////////////////////////////////////////////////////////
  284. // Synchronization logger -- Call this function to log an expression and a user
  285. // value in the synch log. When active (if g_GameSettings.m_szSynchLog is
  286. // a valid path and filename), if recording a demo, these calls are logged to
  287. // a file including the calling file and line number. When active, if playing
  288. // back a demo, these calls are compared to those stored in the log and, if
  289. // a discrepancy occurs, a modal dialog box will pop up with the pertinent info
  290. // followed by an ASSERT(0) for easy debugging.
  291. ////////////////////////////////////////////////////////////////////////////////
  292. extern int SynchLog( // Result of expr.
  293. double expr, // In: Expression to evaluate.
  294. char* pszFile, // In: Calling file.
  295. long lLine, // In: Calling line.
  296. char* pszExpr, // In: Original C++ source expression.
  297. U32 u32User); // In: A user value that is intended to be consistent.
  298. ////////////////////////////////////////////////////////////////////////////////
  299. // If 'LOG_IFS' macro is defined, this will redefine 'if' such that it will
  300. // still perform its comparison but will also SynchLog() the expression.
  301. ////////////////////////////////////////////////////////////////////////////////
  302. #if defined(LOG_IFS)
  303. #define if(expr) if (SynchLog(double(expr != 0), __FILE__, __LINE__, #expr, 0 ) )
  304. #endif
  305. ////////////////////////////////////////////////////////////////////////////////
  306. // If 'LOG_LOGS' macro is defined, this will define 'LOG' such that it will
  307. // SynchLog() the expression.
  308. // If the macro is not defined, this macro expands into absolutely nothing using
  309. // no CPU time or memory. Note that the expression will __NOT__ be evaluated
  310. // at all.
  311. ////////////////////////////////////////////////////////////////////////////////
  312. #if defined(LOG_LOGS)
  313. #define LOG(expr, user_val) SynchLog(expr, __FILE__, __LINE__, #expr, user_val)
  314. #else
  315. #define LOG(expr, user_val)
  316. #endif
  317. ////////////////////////////////////////////////////////////////////////////////
  318. //
  319. // Do palette transition so menu can be displayed on top of existing background.
  320. // NOTE: There must be a matching PalTranOff() for each PalTranOn()!!!
  321. //
  322. ////////////////////////////////////////////////////////////////////////////////
  323. extern void PalTranOn(
  324. long lTime = -1); // In: How long transition should take (or -1 for default)
  325. ////////////////////////////////////////////////////////////////////////////////
  326. //
  327. // Undo the palette transition to restore the original background colors.
  328. //
  329. ////////////////////////////////////////////////////////////////////////////////
  330. extern void PalTranOff(void);
  331. ////////////////////////////////////////////////////////////////////////////////
  332. //
  333. // Create a full path out of a partial path.
  334. //
  335. // The partial path must be in "RSPiX neutral" format, which is pretty much
  336. // like a partial Windows path, except with slashes instead of backslashes.
  337. //
  338. // BEWARE: The return value is a pointer to a static string, which means its
  339. // contents are changed every time this function is called! If you're just
  340. // going to use the string and then be done with it, this should work fine, but
  341. // if you need the string to stick around a while, you should probably do a
  342. // strcpy() into your own string buffer.
  343. //
  344. // There are several variations - pick the one you like best.
  345. //
  346. ////////////////////////////////////////////////////////////////////////////////
  347. #define GAME_PATH_CD 0
  348. #define GAME_PATH_HD 1
  349. #define GAME_PATH_VD 2
  350. #define GAME_PATH_SOUND 3
  351. #define GAME_PATH_GAME 4
  352. #define GAME_PATH_HOODS 5
  353. extern char* FullPath( // Returns full path in system format
  354. short sPathType, // In: PATH_CD, PATH_HD, or PATH_VD
  355. char* pszPartialPath); // In: Partial path in RSPiX format
  356. extern char* FullPathCD( // Returns full path in system format
  357. char* pszPartialPath); // In: Partial path in RSPiX format
  358. extern char* FullPathHD( // Returns full path in system format
  359. const char* pszPartialPath); // In: Partial path in RSPiX format
  360. extern char* FullPathVD( // Returns full path in system format
  361. char* pszPartialPath); // In: Partial path in RSPiX format
  362. extern char* FullPathSound( // Returns full path in system format
  363. char* pszPartialPath); // In: Partial path in RSPiX format
  364. extern char* FullPathGame( // Returns full path in system format
  365. char* pszPartialPath); // In: Partial path in RSPiX format
  366. extern char* FullPathHoods( // Returns full path in system format
  367. char* pszPartialPath); // In: Partial path in RSPiX format
  368. extern char* FullPathCustom( // Returns full path in system format
  369. char* pszFullPath, // In: Full path in in RSPiX format.
  370. char* pszPartialPath); // In: Partial path in RSPiX format.
  371. ////////////////////////////////////////////////////////////////////////////////
  372. //
  373. // Correctify the specified base path.
  374. //
  375. // First, it ensures that the path is absolute (not relative). Then, it ensures
  376. // the path ends properly, either with or without the system-specific separator
  377. // character, depending on which system we're running on.
  378. //
  379. ////////////////////////////////////////////////////////////////////////////////
  380. short CorrectifyBasePath( // Returns 0 if successfull, non-zero otherwise
  381. char* pszBasePath, // I/O: Base path to be corrected
  382. short sMaxPathLen); // In: Maximum length of base path
  383. ////////////////////////////////////////////////////////////////////////////////
  384. //
  385. // Get a subpath relative to the specified game path.
  386. //
  387. ////////////////////////////////////////////////////////////////////////////////
  388. extern short SubPathOpenBox( // Returns 0 on success, negative on error, 1 if
  389. // not subpathable (i.e., returned path is full path).
  390. char* pszFullPath, // In: Full path to be relative to.
  391. char* pszBoxTitle, // In: Title of box.
  392. char* pszDefFileName, // In: Default filename.
  393. char* pszChosenFileName, // Out: User's choice.
  394. short sStrSize, // In: Amount of memory pointed to by pszChosenFileName.
  395. char* pszFilter = NULL); // In: If not NULL, '.' delimited extension based filename
  396. // filter specification. Ex: ".cpp.h.exe.lib" or "cpp.h.exe.lib"
  397. // Note: Cannot use '.' in filter. Preceding '.' ignored.
  398. ////////////////////////////////////////////////////////////////////////////////
  399. //
  400. // Set gamma/brighten-effect value.
  401. //
  402. ////////////////////////////////////////////////////////////////////////////////
  403. extern void SetGammaLevel(
  404. short sBase); // In: New brighten value
  405. ////////////////////////////////////////////////////////////////////////////////
  406. //
  407. // Set Brightness and Contrast. Zero (neutral) values yield and identity
  408. // curve. Valid input is from -1 to 1.
  409. //
  410. ////////////////////////////////////////////////////////////////////////////////
  411. extern void SetBrightnessContrast(
  412. double dBrightness, // -1.0 = dim, 0.0 = normal, 1.0 = bright
  413. double dContrast // -1.0 = low contrast, 0.0 = normal, 1.0 = high
  414. );
  415. ////////////////////////////////////////////////////////////////////////////////
  416. //
  417. // Get gamma/brighten-effect value from palette map (not from settings).
  418. //
  419. ////////////////////////////////////////////////////////////////////////////////
  420. extern short GetGammaLevel(void); // Returns current brighten value
  421. #ifdef WIN32
  422. #define snprintf _snprintf
  423. #define mkdir _mkdir
  424. #endif
  425. extern bool StatsAreAllowed;
  426. extern int Stat_BulletsFired;
  427. extern int Stat_BulletsHit;
  428. extern int Stat_BulletsMissed;
  429. extern int Stat_Deaths;
  430. extern int Stat_Suicides;
  431. extern int Stat_Executions;
  432. extern int Stat_HitsTaken;
  433. extern int Stat_DamageTaken;
  434. extern int Stat_Burns;
  435. extern int Stat_TimeRunning;
  436. extern int Stat_KilledHostiles;
  437. extern int Stat_KilledCivilians;
  438. extern int Stat_TotalKilled;
  439. extern int Stat_LevelsPlayed;
  440. extern long playthroughMS;
  441. extern ULONG Flag_Achievements;
  442. #define FLAG_USED_M16 (1<<0)
  443. #define FLAG_USED_SHOTGUN (1<<1)
  444. #define FLAG_USED_DBL_SHOTGUN (1<<2)
  445. #define FLAG_USED_GRENADE (1<<3)
  446. #define FLAG_USED_ROCKET (1<<4)
  447. #define FLAG_USED_MOLOTOV (1<<5)
  448. #define FLAG_USED_NAPALM (1<<6)
  449. #define FLAG_USED_FLAMETHROWER (1<<7)
  450. #define FLAG_USED_PROXIMITY_MINE (1<<8)
  451. #define FLAG_USED_TIMED_MINE (1<<9)
  452. #define FLAG_USED_REMOTE_MINE (1<<10)
  453. #define FLAG_USED_BETTY_MINE (1<<11)
  454. #define FLAG_USED_HEATSEEKER (1<<12)
  455. #define FLAG_USED_SPRAY_CANNON (1<<13)
  456. #define FLAG_USED_DEATHWAD (1<<14)
  457. #define FLAG_MASK_WEAPONS 0x3bfb // everything but dbl_shotgun, remote_mine and deathwad //((1<<15)-1)
  458. #define FLAG_USED_CHEATS (1<<15)
  459. #define FLAG_KILLED_EVERYTHING (1<<16)
  460. #define FLAG_KILLED_ONLY_HOSTILES (1<<17)
  461. #define FLAG_HIGHEST_DIFFICULTY (1<<18)
  462. // max time that still qualifies for the "Two Pump Chump" achievement in milliseconds.
  463. #define MAX_PLAYTHROUGH_ACHIEVEMENT_MS 60 * (1000 * 60)
  464. enum Achievement
  465. {
  466. ACHIEVEMENT_KILL_FIRST_VICTIM, // "And so it begins"
  467. ACHIEVEMENT_START_SECOND_LEVEL, // "Oh, you pressed F1"
  468. ACHIEVEMENT_DUCK_UNDER_ROCKET, // "Dirty knees"
  469. ACHIEVEMENT_RUN_5_MINUTES, // "Forrest Gump"
  470. ACHIEVEMENT_PERFORM_FIRST_EXECUTION, // "How Kevorkian!"
  471. ACHIEVEMENT_KILL_100, // "Patrick Bateman"
  472. ACHIEVEMENT_KILL_1000, // "Dexter"
  473. ACHIEVEMENT_KILL_10000, // "Mickey and Mallory"
  474. ACHIEVEMENT_COMPLETE_LEVEL_10, // "Half-mast hard-on"
  475. ACHIEVEMENT_COMPLETE_GAME, // "Get a girlfriend"
  476. ACHIEVEMENT_FIRE_1000000_BULLETS, // "Bulletstorm"
  477. ACHIEVEMENT_HIT_100000_TARGETS, // "Peter North would be proud"
  478. ACHIEVEMENT_TAKE_10000_HITS, // "Holes is holes"
  479. ACHIEVEMENT_KILL_EVERYTHING, // "Z for Zachariah"
  480. ACHIEVEMENT_KILL_ONLY_HOSTILES, // "Boondock Saint"
  481. ACHIEVEMENT_USE_ONLY_M16, // "I swear, the AR is for hunting!"
  482. ACHIEVEMENT_USE_EVERY_WEAPON, // "Army of One"
  483. ACHIEVEMENT_COMPLETE_LEVEL_ON_LOW_HEALTH, // "From my cold, dead hands""
  484. ACHIEVEMENT_FIGHT_AN_OSTRICH, // "NOPE! Chuck Testa."
  485. ACHIEVEMENT_WATCH_ALL_CREDITS, // "You want our autograph too?"
  486. ACHIEVEMENT_PLAY_ON_NON_WINDOWS_PLATFORM, // "Ballmer Baller"
  487. ACHIEVEMENT_FIREBOMB_THE_BAND, // "The Hell's Fargo Wagon"
  488. ACHIEVEMENT_ROCKET_TO_THE_FACE, // "Took a banger in the mouth"
  489. ACHIEVEMENT_KILL_A_NAKED_PERSON, // "Never nude-ist"
  490. ACHIEVEMENT_ENABLE_CHEATS, // "Sissy"
  491. ACHIEVEMENT_COMMIT_SUICIDE, // "I'm afraid I just blue myself"
  492. ACHIEVEMENT_TOUCH_SOMEONE_WHILE_BURNING, // "Bad touch!"
  493. ACHIEVEMENT_COMPLETE_GAME_IN_X_MINUTES, // "Two Pump Chump"
  494. ACHIEVEMENT_COMPLETE_GAME_ON_HARDEST, // "Solid as a rock"
  495. ACHIEVEMENT_MAX // not an achievement, just the total count.
  496. };
  497. #if WITH_STEAMWORKS
  498. extern void UnlockAchievement(const Achievement ach);
  499. extern void RunSteamworksUpkeep();
  500. extern void RequestSteamStatsStore();
  501. #else
  502. #define UnlockAchievement(x) do {} while (0)
  503. #define RunSteamworksUpkeep() do {} while (0)
  504. #endif
  505. #endif // GAME_H
  506. ////////////////////////////////////////////////////////////////////////////////
  507. // EOF
  508. ////////////////////////////////////////////////////////////////////////////////