st_stuff.c
上传用户:xuyinpeng
上传日期:2021-05-12
资源大小:455k
文件大小:34k
源码类别:

射击游戏

开发平台:

Visual C++

  1. // Emacs style mode select   -*- C++ -*- 
  2. //-----------------------------------------------------------------------------
  3. //
  4. // $Id:$
  5. //
  6. // Copyright (C) 1993-1996 by id Software, Inc.
  7. //
  8. // This source is available for distribution and/or modification
  9. // only under the terms of the DOOM Source Code License as
  10. // published by id Software. All rights reserved.
  11. //
  12. // The source is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
  15. // for more details.
  16. //
  17. // $Log:$
  18. //
  19. // DESCRIPTION:
  20. // Status bar code.
  21. // Does the face/direction indicator animatin.
  22. // Does palette indicators as well (red pain/berserk, bright pickup)
  23. //
  24. //-----------------------------------------------------------------------------
  25. static const char
  26. rcsid[] = "$Id: st_stuff.c,v 1.6 1997/02/03 22:45:13 b1 Exp $";
  27. #include <stdio.h>
  28. #include "i_system.h"
  29. #include "i_video.h"
  30. #include "z_zone.h"
  31. #include "m_random.h"
  32. #include "w_wad.h"
  33. #include "doomdef.h"
  34. #include "g_game.h"
  35. #include "st_stuff.h"
  36. #include "st_lib.h"
  37. #include "r_local.h"
  38. #include "p_local.h"
  39. #include "p_inter.h"
  40. #include "am_map.h"
  41. #include "m_cheat.h"
  42. #include "s_sound.h"
  43. // Needs access to LFB.
  44. #include "v_video.h"
  45. // State.
  46. #include "doomstat.h"
  47. // Data.
  48. #include "dstrings.h"
  49. #include "sounds.h"
  50. //
  51. // STATUS BAR DATA
  52. //
  53. char MsgText[256];
  54. void WriteDebug(char *);
  55. // Palette indices.
  56. // For damage/bonus red-/gold-shifts
  57. #define STARTREDPALS 1
  58. #define STARTBONUSPALS 9
  59. #define NUMREDPALS 8
  60. #define NUMBONUSPALS 4
  61. // Radiation suit, green shift.
  62. #define RADIATIONPAL 13
  63. // N/256*100% probability
  64. //  that the normal face state will change
  65. #define ST_FACEPROBABILITY 96
  66. // For Responder
  67. #define ST_TOGGLECHAT KEY_ENTER
  68. // Location of status bar
  69. //#define ST_X 0
  70. #define ST_X ((SCREENWIDTH-ST_WIDTH)/2)
  71. //#define ST_X2 104
  72. #define ST_X2 ((SCREENWIDTH/2)-56)
  73. //#define ST_FX   143
  74. #define ST_FX   ((SCREENWIDTH/2)-17)
  75. //#define ST_FY   169
  76. #define ST_FY   (SCREENHEIGHT-31)
  77. // Should be set to patch width
  78. //  for tall numbers later on
  79. #define ST_TALLNUMWIDTH (tallnum[0]->width)
  80. // Number of status faces.
  81. #define ST_NUMPAINFACES 5
  82. #define ST_NUMSTRAIGHTFACES 3
  83. #define ST_NUMTURNFACES 2
  84. #define ST_NUMSPECIALFACES 3
  85. #define ST_FACESTRIDE 
  86.           (ST_NUMSTRAIGHTFACES+ST_NUMTURNFACES+ST_NUMSPECIALFACES)
  87. #define ST_NUMEXTRAFACES 2
  88. #define ST_NUMFACES 
  89.           (ST_FACESTRIDE*ST_NUMPAINFACES+ST_NUMEXTRAFACES)
  90. #define ST_TURNOFFSET (ST_NUMSTRAIGHTFACES)
  91. #define ST_OUCHOFFSET (ST_TURNOFFSET + ST_NUMTURNFACES)
  92. #define ST_EVILGRINOFFSET (ST_OUCHOFFSET + 1)
  93. #define ST_RAMPAGEOFFSET (ST_EVILGRINOFFSET + 1)
  94. #define ST_GODFACE (ST_NUMPAINFACES*ST_FACESTRIDE)
  95. #define ST_DEADFACE (ST_GODFACE+1)
  96. //#define ST_FACESX 143
  97. #define ST_FACESX ((SCREENWIDTH/2)-17)
  98. //#define ST_FACESY 168
  99. #define ST_FACESY (SCREENHEIGHT-32)
  100. #define ST_EVILGRINCOUNT (2*TICRATE)
  101. #define ST_STRAIGHTFACECOUNT (TICRATE/2)
  102. #define ST_TURNCOUNT (1*TICRATE)
  103. #define ST_OUCHCOUNT (1*TICRATE)
  104. #define ST_RAMPAGEDELAY (2*TICRATE)
  105. #define ST_MUCHPAIN 20
  106. // Location and size of statistics,
  107. //  justified according to widget type.
  108. // Problem is, within which space? STbar? Screen?
  109. // Note: this could be read in by a lump.
  110. //       Problem is, is the stuff rendered
  111. //       into a buffer,
  112. //       or into the frame buffer?
  113. // AMMO number pos.
  114. #define ST_AMMOWIDTH 3
  115. //#define ST_AMMOX 44
  116. #define ST_AMMOX ((SCREENWIDTH/2)-116)
  117. //#define ST_AMMOY 171
  118. #define ST_AMMOY (SCREENHEIGHT-29)
  119. // HEALTH number pos.
  120. #define ST_HEALTHWIDTH 3
  121. //#define ST_HEALTHX 90
  122. #define ST_HEALTHX ((SCREENWIDTH/2)-70)
  123. //#define ST_HEALTHY 171
  124. #define ST_HEALTHY (SCREENHEIGHT-29)
  125. // Weapon pos.
  126. //#define ST_ARMSX 111
  127. #define ST_ARMSX ((SCREENWIDTH/2)-49)
  128. //#define ST_ARMSY 172
  129. #define ST_ARMSY (SCREENHEIGHT-28)
  130. //#define ST_ARMSBGX 104
  131. #define ST_ARMSBGX ((SCREENWIDTH/2)-56)
  132. //#define ST_ARMSBGY 168
  133. #define ST_ARMSBGY (SCREENHEIGHT-32)
  134. #define ST_ARMSXSPACE 12
  135. #define ST_ARMSYSPACE 10
  136. // Frags pos.
  137. //#define ST_FRAGSX 138
  138. #define ST_FRAGSX ((SCREENWIDTH/2)-22)
  139. //#define ST_FRAGSY 171
  140. #define ST_FRAGSY (SCREENHEIGHT-29)
  141. #define ST_FRAGSWIDTH 2
  142. // ARMOR number pos.
  143. #define ST_ARMORWIDTH 3
  144. //#define ST_ARMORX 221
  145. #define ST_ARMORX ((SCREENWIDTH/2)+61)
  146. //#define ST_ARMORY 171
  147. #define ST_ARMORY (SCREENHEIGHT-29)
  148. // Key icon positions.
  149. #define ST_KEY0WIDTH 8
  150. #define ST_KEY0HEIGHT 5
  151. //#define ST_KEY0X 239
  152. #define ST_KEY0X ((SCREENWIDTH/2)+79)
  153. //#define ST_KEY0Y 171
  154. #define ST_KEY0Y (SCREENHEIGHT-29)
  155. #define ST_KEY1WIDTH ST_KEY0WIDTH
  156. //#define ST_KEY1X 239
  157. #define ST_KEY1X ((SCREENWIDTH/2)+79)
  158. //#define ST_KEY1Y 181
  159. #define ST_KEY1Y (SCREENHEIGHT-19)
  160. #define ST_KEY2WIDTH ST_KEY0WIDTH
  161. //#define ST_KEY2X 239
  162. #define ST_KEY2X ((SCREENWIDTH/2)+79)
  163. //#define ST_KEY2Y 191
  164. #define ST_KEY2Y (SCREENHEIGHT-9)
  165. // Ammunition counter.
  166. #define ST_AMMO0WIDTH 3
  167. #define ST_AMMO0HEIGHT 6
  168. //#define ST_AMMO0X 288
  169. #define ST_AMMO0X ((SCREENWIDTH/2)+128)
  170. //#define ST_AMMO0Y 173
  171. #define ST_AMMO0Y (SCREENHEIGHT-27)
  172. #define ST_AMMO1WIDTH ST_AMMO0WIDTH
  173. //#define ST_AMMO1X 288
  174. #define ST_AMMO1X ((SCREENWIDTH/2)+128)
  175. //#define ST_AMMO1Y 179
  176. #define ST_AMMO1Y (SCREENHEIGHT-21)
  177. #define ST_AMMO2WIDTH ST_AMMO0WIDTH
  178. //#define ST_AMMO2X 288
  179. #define ST_AMMO2X ((SCREENWIDTH/2)+128)
  180. //#define ST_AMMO2Y 191
  181. #define ST_AMMO2Y (SCREENHEIGHT-9)
  182. #define ST_AMMO3WIDTH ST_AMMO0WIDTH
  183. //#define ST_AMMO3X 288
  184. #define ST_AMMO3X ((SCREENWIDTH/2)+128)
  185. //#define ST_AMMO3Y 185
  186. #define ST_AMMO3Y (SCREENHEIGHT-15)
  187. // Indicate maximum ammunition.
  188. // Only needed because backpack exists.
  189. #define ST_MAXAMMO0WIDTH 3
  190. #define ST_MAXAMMO0HEIGHT 5
  191. //#define ST_MAXAMMO0X 314
  192. #define ST_MAXAMMO0X ((SCREENWIDTH/2)+154)
  193. //#define ST_MAXAMMO0Y 173
  194. #define ST_MAXAMMO0Y (SCREENHEIGHT-27)
  195. #define ST_MAXAMMO1WIDTH ST_MAXAMMO0WIDTH
  196. //#define ST_MAXAMMO1X 314
  197. #define ST_MAXAMMO1X ((SCREENWIDTH/2)+154)
  198. //#define ST_MAXAMMO1Y 179
  199. #define ST_MAXAMMO1Y (SCREENHEIGHT-21)
  200. #define ST_MAXAMMO2WIDTH ST_MAXAMMO0WIDTH
  201. //#define ST_MAXAMMO2X 314
  202. #define ST_MAXAMMO2X ((SCREENWIDTH/2)+154)
  203. //#define ST_MAXAMMO2Y 191
  204. #define ST_MAXAMMO2Y (SCREENHEIGHT-9)
  205. #define ST_MAXAMMO3WIDTH ST_MAXAMMO0WIDTH
  206. //#define ST_MAXAMMO3X 314
  207. #define ST_MAXAMMO3X ((SCREENWIDTH/2)+154)
  208. //#define ST_MAXAMMO3Y 185
  209. #define ST_MAXAMMO3Y (SCREENHEIGHT-15)
  210. // pistol
  211. //#define ST_WEAPON0X 110 
  212. #define ST_WEAPON0X ((SCREENWIDTH/2)-50)
  213. //#define ST_WEAPON0Y 172
  214. #define ST_WEAPON0Y (SCREENHEIGHT-28)
  215. // shotgun
  216. //#define ST_WEAPON1X 122 
  217. #define ST_WEAPON1X ((SCREENWIDTH/2)-38)
  218. //#define ST_WEAPON1Y 172
  219. #define ST_WEAPON1Y (SCREENHEIGHT-28)
  220. // chain gun
  221. //#define ST_WEAPON2X 134 
  222. #define ST_WEAPON2X ((SCREENWIDTH/2)-26)
  223. //#define ST_WEAPON2Y 172
  224. #define ST_WEAPON2Y (SCREENHEIGHT-28)
  225. // missile launcher
  226. //#define ST_WEAPON3X 110 
  227. #define ST_WEAPON3X ((SCREENWIDTH/2)-50) 
  228. //#define ST_WEAPON3Y 181
  229. #define ST_WEAPON3Y (SCREENHEIGHT-19)
  230. // plasma gun
  231. //#define ST_WEAPON4X 122 
  232. #define ST_WEAPON4X ((SCREENWIDTH/2)-38) 
  233. //#define ST_WEAPON4Y 181
  234. #define ST_WEAPON4Y (SCREENHEIGHT-19)
  235.  // bfg
  236. //#define ST_WEAPON5X 134
  237. #define ST_WEAPON5X ((SCREENWIDTH/2)-26)
  238. //#define ST_WEAPON5Y 181
  239. #define ST_WEAPON5Y (SCREENHEIGHT-19)
  240. // WPNS title
  241. //#define ST_WPNSX 109 
  242. #define ST_WPNSX ((SCREENWIDTH/2)-51)
  243. //#define ST_WPNSY 191
  244. #define ST_WPNSY (SCREENHEIGHT-9)
  245.  // DETH title
  246. //#define ST_DETHX 109
  247. #define ST_DETHX ((SCREENWIDTH/2)-51)
  248. //#define ST_DETHY 191
  249. #define ST_DETHY (SCREENHEIGHT-9)
  250. //Incoming messages window location
  251. //UNUSED
  252. // #define ST_MSGTEXTX    (viewwindowx)
  253. // #define ST_MSGTEXTY    (viewwindowy+viewheight-18)
  254. #define ST_MSGTEXTX 0
  255. #define ST_MSGTEXTY 0
  256. // Dimensions given in characters.
  257. #define ST_MSGWIDTH 52
  258. // Or shall I say, in lines?
  259. #define ST_MSGHEIGHT 1
  260. #define ST_OUTTEXTX 0
  261. #define ST_OUTTEXTY 6
  262. // Width, in characters again.
  263. #define ST_OUTWIDTH 52 
  264.  // Height, in lines. 
  265. #define ST_OUTHEIGHT 1
  266. #define ST_MAPWIDTH
  267.     (strlen(mapnames[(gameepisode-1)*9+(gamemap-1)]))
  268. #define ST_MAPTITLEX 
  269.     (SCREENWIDTH - ST_MAPWIDTH * ST_CHATFONTWIDTH)
  270. #define ST_MAPTITLEY 0
  271. #define ST_MAPHEIGHT 1
  272.     
  273. // main player in game
  274. static player_t* plyr; 
  275. // ST_Start() has just been called
  276. static boolean st_firsttime;
  277. // used to execute ST_Init() only once
  278. static int veryfirsttime = 1;
  279. // lump number for PLAYPAL
  280. static int lu_palette;
  281. // used for timing
  282. static unsigned int st_clock;
  283. // used for making messages go away
  284. static int st_msgcounter=0;
  285. // used when in chat 
  286. static st_chatstateenum_t st_chatstate;
  287. // whether in automap or first-person
  288. static st_stateenum_t st_gamestate;
  289. // whether left-side main status bar is active
  290. static boolean st_statusbaron;
  291. // whether status bar chat is active
  292. static boolean st_chat;
  293. // value of st_chat before message popped up
  294. static boolean st_oldchat;
  295. // whether chat window has the cursor on
  296. static boolean st_cursoron;
  297. // !deathmatch
  298. static boolean st_notdeathmatch; 
  299. // !deathmatch && st_statusbaron
  300. static boolean st_armson;
  301. // !deathmatch
  302. static boolean st_fragson; 
  303. // main bar left
  304. static patch_t* sbar;
  305. // 0-9, tall numbers
  306. static patch_t* tallnum[10];
  307. // tall % sign
  308. static patch_t* tallpercent;
  309. // 0-9, short, yellow (,different!) numbers
  310. static patch_t* shortnum[10];
  311. // 3 key-cards, 3 skulls
  312. static patch_t* keys[NUMCARDS]; 
  313. // face status patches
  314. static patch_t* faces[ST_NUMFACES];
  315. // face background
  316. static patch_t* faceback;
  317.  // main bar right
  318. static patch_t* armsbg;
  319. // weapon ownership patches
  320. static patch_t* arms[6][2]; 
  321. // ready-weapon widget
  322. static st_number_t w_ready;
  323.  // in deathmatch only, summary of frags stats
  324. static st_number_t w_frags;
  325. // health widget
  326. static st_percent_t w_health;
  327. // arms background
  328. static st_binicon_t w_armsbg; 
  329. // weapon ownership widgets
  330. static st_multicon_t w_arms[6];
  331. // face status widget
  332. static st_multicon_t w_faces; 
  333. // keycard widgets
  334. static st_multicon_t w_keyboxes[3];
  335. // armor widget
  336. static st_percent_t w_armor;
  337. // ammo widgets
  338. static st_number_t w_ammo[4];
  339. // max ammo widgets
  340. static st_number_t w_maxammo[4]; 
  341.  // number of frags so far in deathmatch
  342. static int st_fragscount;
  343. // used to use appopriately pained face
  344. static int st_oldhealth = -1;
  345. // used for evil grin
  346. static boolean oldweaponsowned[NUMWEAPONS]; 
  347.  // count until face changes
  348. static int st_facecount = 0;
  349. // current face index, used by w_faces
  350. static int st_faceindex = 0;
  351. // holds key-type for each key box on bar
  352. static int keyboxes[3]; 
  353. // a random number per tick
  354. static int st_randomnumber;  
  355. // Massive bunches of cheat shit
  356. //  to keep it from being easy to figure them out.
  357. // Yeah, right...
  358. unsigned char cheat_mus_seq[] =
  359. {
  360.     0xb2, 0x26, 0xb6, 0xae, 0xea, 1, 0, 0, 0xff
  361. };
  362. unsigned char cheat_choppers_seq[] =
  363. {
  364.     0xb2, 0x26, 0xe2, 0x32, 0xf6, 0x2a, 0x2a, 0xa6, 0x6a, 0xea, 0xff // id...
  365. };
  366. unsigned char cheat_god_seq[] =
  367. {
  368.     0xb2, 0x26, 0x26, 0xaa, 0x26, 0xff  // iddqd
  369. };
  370. unsigned char cheat_ammo_seq[] =
  371. {
  372.     0xb2, 0x26, 0xf2, 0x66, 0xa2, 0xff // idkfa
  373. };
  374. unsigned char cheat_ammonokey_seq[] =
  375. {
  376.     0xb2, 0x26, 0x66, 0xa2, 0xff // idfa
  377. };
  378. // Smashing Pumpkins Into Samml Piles Of Putried Debris. 
  379. unsigned char cheat_noclip_seq[] =
  380. {
  381.     0xb2, 0x26, 0xea, 0x2a, 0xb2, // idspispopd
  382.     0xea, 0x2a, 0xf6, 0x2a, 0x26, 0xff
  383. };
  384. //
  385. unsigned char cheat_commercial_noclip_seq[] =
  386. {
  387.     0xb2, 0x26, 0xe2, 0x36, 0xb2, 0x2a, 0xff // idclip
  388. }; 
  389. unsigned char cheat_powerup_seq[7][10] =
  390. {
  391.     { 0xb2, 0x26, 0x62, 0xa6, 0x32, 0xf6, 0x36, 0x26, 0x6e, 0xff },  // beholdv
  392.     { 0xb2, 0x26, 0x62, 0xa6, 0x32, 0xf6, 0x36, 0x26, 0xea, 0xff },  // beholds
  393.     { 0xb2, 0x26, 0x62, 0xa6, 0x32, 0xf6, 0x36, 0x26, 0xb2, 0xff },  // beholdi
  394.     { 0xb2, 0x26, 0x62, 0xa6, 0x32, 0xf6, 0x36, 0x26, 0x6a, 0xff },  // beholdr
  395.     { 0xb2, 0x26, 0x62, 0xa6, 0x32, 0xf6, 0x36, 0x26, 0xa2, 0xff },  // beholda
  396.     { 0xb2, 0x26, 0x62, 0xa6, 0x32, 0xf6, 0x36, 0x26, 0x36, 0xff },  // beholdl
  397.     { 0xb2, 0x26, 0x62, 0xa6, 0x32, 0xf6, 0x36, 0x26, 0xff } // behold
  398. };
  399. unsigned char cheat_clev_seq[] =
  400. {
  401.     0xb2, 0x26,  0xe2, 0x36, 0xa6, 0x6e, 1, 0, 0, 0xff // idclev
  402. };
  403. // my position cheat
  404. unsigned char cheat_mypos_seq[] =
  405. {
  406.     0xb2, 0x26, 0xb6, 0xba, 0x2a, 0xf6, 0xea, 0xff // idmypos
  407. }; 
  408. // Now what?
  409. cheatseq_t cheat_mus = { cheat_mus_seq, 0 };
  410. cheatseq_t cheat_god = { cheat_god_seq, 0 };
  411. cheatseq_t cheat_ammo = { cheat_ammo_seq, 0 };
  412. cheatseq_t cheat_ammonokey = { cheat_ammonokey_seq, 0 };
  413. cheatseq_t cheat_noclip = { cheat_noclip_seq, 0 };
  414. cheatseq_t cheat_commercial_noclip = { cheat_commercial_noclip_seq, 0 };
  415. cheatseq_t cheat_powerup[7] =
  416. {
  417.     { cheat_powerup_seq[0], 0 },
  418.     { cheat_powerup_seq[1], 0 },
  419.     { cheat_powerup_seq[2], 0 },
  420.     { cheat_powerup_seq[3], 0 },
  421.     { cheat_powerup_seq[4], 0 },
  422.     { cheat_powerup_seq[5], 0 },
  423.     { cheat_powerup_seq[6], 0 }
  424. };
  425. cheatseq_t cheat_choppers = { cheat_choppers_seq, 0 };
  426. cheatseq_t cheat_clev = { cheat_clev_seq, 0 };
  427. cheatseq_t cheat_mypos = { cheat_mypos_seq, 0 };
  428. // 
  429. extern char* mapnames[];
  430. //
  431. // STATUS BAR CODE
  432. //
  433. void ST_Stop(void);
  434. void ST_refreshBackground(void)
  435. {
  436.     if (st_statusbaron)
  437.     {
  438. V_DrawPatch(ST_X, 0, BG, sbar);
  439. if (netgame)
  440.        {
  441.     V_DrawPatch(ST_FX, 0, BG, faceback);
  442.        }
  443. V_CopyRect(ST_X, 0, BG, ST_WIDTH, ST_HEIGHT, ST_X, ST_Y, FG);
  444.     }
  445. }
  446. // Respond to keyboard input events,
  447. //  intercept cheats.
  448. boolean
  449. ST_Responder (event_t* ev)
  450. {
  451.   int i;
  452.     
  453.   // Filter automap on/off.
  454.   if (ev->type == ev_keyup
  455.       && ((ev->data1 & 0xffff0000) == AM_MSGHEADER))
  456.   {
  457.     switch(ev->data1)
  458.     {
  459.       case AM_MSGENTERED:
  460. st_gamestate = AutomapState;
  461. st_firsttime = true;
  462. break;
  463.       case AM_MSGEXITED:
  464. // fprintf(stderr, "AM exitedn");
  465. st_gamestate = FirstPersonState;
  466. break;
  467.     }
  468.   }
  469.   // if a user keypress...
  470.   else if (ev->type == ev_keydown)
  471.   {
  472.     if (!netgame)
  473.     {
  474.       // b. - enabled for more debug fun.
  475.       // if (gameskill != sk_nightmare) {
  476.       
  477.       // 'dqd' cheat for toggleable god mode
  478.       if (cht_CheckCheat(&cheat_god, ev->data1))
  479.       {
  480. plyr->cheats ^= CF_GODMODE;
  481. if (plyr->cheats & CF_GODMODE)
  482. {
  483.   if (plyr->mo)
  484.     plyr->mo->health = 100;
  485.   
  486.   plyr->health = 100;
  487.   plyr->message = STSTR_DQDON;
  488. }
  489. else 
  490.   plyr->message = STSTR_DQDOFF;
  491.       }
  492.       // 'fa' cheat for killer fucking arsenal
  493.       else if (cht_CheckCheat(&cheat_ammonokey, ev->data1))
  494.       {
  495. plyr->armorpoints = 200;
  496. plyr->armortype = 2;
  497. for (i=0;i<NUMWEAPONS;i++)
  498.   plyr->weaponowned[i] = true;
  499. for (i=0;i<NUMAMMO;i++)
  500.   plyr->ammo[i] = plyr->maxammo[i];
  501. plyr->message = STSTR_FAADDED;
  502.       }
  503.       // 'kfa' cheat for key full ammo
  504.       else if (cht_CheckCheat(&cheat_ammo, ev->data1))
  505.       {
  506. plyr->armorpoints = 200;
  507. plyr->armortype = 2;
  508. for (i=0;i<NUMWEAPONS;i++)
  509.   plyr->weaponowned[i] = true;
  510. for (i=0;i<NUMAMMO;i++)
  511.   plyr->ammo[i] = plyr->maxammo[i];
  512. for (i=0;i<NUMCARDS;i++)
  513.   plyr->cards[i] = true;
  514. plyr->message = STSTR_KFAADDED;
  515.       }
  516.       // 'mus' cheat for changing music
  517.       else if (cht_CheckCheat(&cheat_mus, ev->data1))
  518.       {
  519. char buf[3];
  520. int musnum;
  521. plyr->message = STSTR_MUS;
  522. cht_GetParam(&cheat_mus, buf);
  523. if (gamemode == commercial)
  524. {
  525.   musnum = mus_runnin + (buf[0]-'0')*10 + buf[1]-'0' - 1;
  526.   
  527.   if (((buf[0]-'0')*10 + buf[1]-'0') > 35)
  528.     plyr->message = STSTR_NOMUS;
  529.   else
  530.     S_ChangeMusic(musnum, 1);
  531. }
  532. else
  533. {
  534.   musnum = mus_e1m1 + (buf[0]-'1')*9 + (buf[1]-'1');
  535.   
  536.   if (((buf[0]-'1')*9 + buf[1]-'1') > 31)
  537.     plyr->message = STSTR_NOMUS;
  538.   else
  539.     S_ChangeMusic(musnum, 1);
  540. }
  541.       }
  542.       // Simplified, accepting both "noclip" and "idspispopd".
  543.       // no clipping mode cheat
  544.       else if ( cht_CheckCheat(&cheat_noclip, ev->data1) 
  545. || cht_CheckCheat(&cheat_commercial_noclip,ev->data1) )
  546.       {
  547. plyr->cheats ^= CF_NOCLIP;
  548. if (plyr->cheats & CF_NOCLIP)
  549.   plyr->message = STSTR_NCON;
  550. else
  551.   plyr->message = STSTR_NCOFF;
  552.       }
  553.       // 'behold?' power-up cheats
  554.       for (i=0;i<6;i++)
  555.       {
  556. if (cht_CheckCheat(&cheat_powerup[i], ev->data1))
  557. {
  558.   if (!plyr->powers[i])
  559.     P_GivePower( plyr, i);
  560.   else if (i!=pw_strength)
  561.     plyr->powers[i] = 1;
  562.   else
  563.     plyr->powers[i] = 0;
  564.   
  565.   plyr->message = STSTR_BEHOLDX;
  566. }
  567.       }
  568.       
  569.       // 'behold' power-up menu
  570.       if (cht_CheckCheat(&cheat_powerup[6], ev->data1))
  571.       {
  572. plyr->message = STSTR_BEHOLD;
  573.       }
  574.       // 'choppers' invulnerability & chainsaw
  575.       else if (cht_CheckCheat(&cheat_choppers, ev->data1))
  576.       {
  577. plyr->weaponowned[wp_chainsaw] = true;
  578. plyr->powers[pw_invulnerability] = true;
  579. plyr->message = STSTR_CHOPPERS;
  580.       }
  581.       // 'mypos' for player position
  582.       else if (cht_CheckCheat(&cheat_mypos, ev->data1))
  583.       {
  584. static char buf[ST_MSGWIDTH];
  585. sprintf(buf, "ang=0x%x;x,y=(0x%x,0x%x)",
  586. players[consoleplayer].mo->angle,
  587. players[consoleplayer].mo->x,
  588. players[consoleplayer].mo->y);
  589. plyr->message = buf;
  590.       }
  591.     }
  592.     
  593.     // 'clev' change-level cheat
  594.     if (cht_CheckCheat(&cheat_clev, ev->data1))
  595.     {
  596.       char buf[3];
  597.       int epsd;
  598.       int map;
  599.       
  600.       cht_GetParam(&cheat_clev, buf);
  601.       
  602.       if (gamemode == commercial)
  603.       {
  604. epsd = 1;
  605. map = (buf[0] - '0')*10 + buf[1] - '0';
  606.       }
  607.       else
  608.       {
  609. epsd = buf[0] - '0';
  610. map = buf[1] - '0';
  611.       }
  612.       // Catch invalid maps.
  613.       if (epsd < 1)
  614. return false;
  615.       if (map < 1)
  616. return false;
  617.       
  618.       // Ohmygod - this is not going to work.
  619.       if ((gamemode == retail)
  620.   && ((epsd > 4) || (map > 9)))
  621. return false;
  622.       if ((gamemode == registered)
  623.   && ((epsd > 3) || (map > 9)))
  624. return false;
  625.       if ((gamemode == shareware)
  626.   && ((epsd > 1) || (map > 9)))
  627. return false;
  628.       if ((gamemode == commercial)
  629. && (( epsd > 1) || (map > 34)))
  630. return false;
  631.       // So be it.
  632.       plyr->message = STSTR_CLEV;
  633.       G_DeferedInitNew(gameskill, epsd, map);
  634.     }    
  635.   }
  636.   return false;
  637. }
  638. int ST_calcPainOffset(void)
  639. {
  640.     int health;
  641.     static int lastcalc;
  642.     static int oldhealth = -1;
  643.     
  644.     health = plyr->health > 100 ? 100 : plyr->health;
  645.     if (health != oldhealth)
  646.     {
  647. lastcalc = ST_FACESTRIDE * (((100 - health) * ST_NUMPAINFACES) / 101);
  648. oldhealth = health;
  649.     }
  650.     return lastcalc;
  651. }
  652. //
  653. // This is a not-very-pretty routine which handles
  654. //  the face states and their timing.
  655. // the precedence of expressions is:
  656. //  dead > evil grin > turned head > straight ahead
  657. //
  658. void ST_updateFaceWidget(void)
  659. {
  660.     int i;
  661.     angle_t badguyangle;
  662.     angle_t diffang;
  663.     static int lastattackdown = -1;
  664.     static int priority = 0;
  665.     boolean doevilgrin;
  666.     if (priority < 10)
  667.     {
  668. // dead
  669. if (!plyr->health)
  670. {
  671.     priority = 9;
  672.     st_faceindex = ST_DEADFACE;
  673.     st_facecount = 1;
  674. }
  675.     }
  676.     if (priority < 9)
  677.     {
  678. if (plyr->bonuscount)
  679. {
  680.     // picking up bonus
  681.     doevilgrin = false;
  682.     for (i=0;i<NUMWEAPONS;i++)
  683.     {
  684. if (oldweaponsowned[i] != plyr->weaponowned[i])
  685. {
  686.     doevilgrin = true;
  687.     oldweaponsowned[i] = plyr->weaponowned[i];
  688. }
  689.     }
  690.     if (doevilgrin) 
  691.     {
  692. // evil grin if just picked up weapon
  693. priority = 8;
  694. st_facecount = ST_EVILGRINCOUNT;
  695. st_faceindex = ST_calcPainOffset() + ST_EVILGRINOFFSET;
  696.     }
  697. }
  698.     }
  699.   
  700.     if (priority < 8)
  701.     {
  702. if (plyr->damagecount
  703.     && plyr->attacker
  704.     && plyr->attacker != plyr->mo)
  705. {
  706.     // being attacked
  707.     priority = 7;
  708.     
  709.     if (plyr->health - st_oldhealth > ST_MUCHPAIN)
  710.     {
  711. st_facecount = ST_TURNCOUNT;
  712. st_faceindex = ST_calcPainOffset() + ST_OUCHOFFSET;
  713.     }
  714.     else
  715.     {
  716. badguyangle = R_PointToAngle2(plyr->mo->x,
  717.       plyr->mo->y,
  718.       plyr->attacker->x,
  719.       plyr->attacker->y);
  720. if (badguyangle > plyr->mo->angle)
  721. {
  722.     // whether right or left
  723.     diffang = badguyangle - plyr->mo->angle;
  724.     i = diffang > ANG180; 
  725. }
  726. else
  727. {
  728.     // whether left or right
  729.     diffang = plyr->mo->angle - badguyangle;
  730.     i = diffang <= ANG180; 
  731. } // confusing, aint it?
  732. st_facecount = ST_TURNCOUNT;
  733. st_faceindex = ST_calcPainOffset();
  734. if (diffang < ANG45)
  735. {
  736.     // head-on    
  737.     st_faceindex += ST_RAMPAGEOFFSET;
  738. }
  739. else if (i)
  740. {
  741.     // turn face right
  742.     st_faceindex += ST_TURNOFFSET;
  743. }
  744. else
  745. {
  746.     // turn face left
  747.     st_faceindex += ST_TURNOFFSET+1;
  748. }
  749.     }
  750. }
  751.     }
  752.   
  753.     if (priority < 7)
  754.     {
  755. // getting hurt because of your own damn stupidity
  756. if (plyr->damagecount)
  757. {
  758.     if (plyr->health - st_oldhealth > ST_MUCHPAIN)
  759.     {
  760. priority = 7;
  761. st_facecount = ST_TURNCOUNT;
  762. st_faceindex = ST_calcPainOffset() + ST_OUCHOFFSET;
  763.     }
  764.     else
  765.     {
  766. priority = 6;
  767. st_facecount = ST_TURNCOUNT;
  768. st_faceindex = ST_calcPainOffset() + ST_RAMPAGEOFFSET;
  769.     }
  770. }
  771.     }
  772.   
  773.     if (priority < 6)
  774.     {
  775. // rapid firing
  776. if (plyr->attackdown)
  777. {
  778.     if (lastattackdown==-1)
  779. lastattackdown = ST_RAMPAGEDELAY;
  780.     else if (!--lastattackdown)
  781.     {
  782. priority = 5;
  783. st_faceindex = ST_calcPainOffset() + ST_RAMPAGEOFFSET;
  784. st_facecount = 1;
  785. lastattackdown = 1;
  786.     }
  787. }
  788. else
  789.     lastattackdown = -1;
  790.     }
  791.   
  792.     if (priority < 5)
  793.     {
  794. // invulnerability
  795. if ((plyr->cheats & CF_GODMODE)
  796.     || plyr->powers[pw_invulnerability])
  797. {
  798.     priority = 4;
  799.     st_faceindex = ST_GODFACE;
  800.     st_facecount = 1;
  801. }
  802.     }
  803.     // look left or look right if the facecount has timed out
  804.     if (!st_facecount)
  805.     {
  806. st_faceindex = ST_calcPainOffset() + (st_randomnumber % 3);
  807. st_facecount = ST_STRAIGHTFACECOUNT;
  808. priority = 0;
  809.     }
  810.     st_facecount--;
  811. }
  812. void ST_updateWidgets(void)
  813. {
  814.     static int largeammo = 1994; // means "n/a"
  815.     int i;
  816.     // must redirect the pointer if the ready weapon has changed.
  817.     //  if (w_ready.data != plyr->readyweapon)
  818.     //  {
  819.     if (weaponinfo[plyr->readyweapon].ammo == am_noammo)
  820. w_ready.num = &largeammo;
  821.     else
  822. w_ready.num = &plyr->ammo[weaponinfo[plyr->readyweapon].ammo];
  823.     //{
  824.     // static int tic=0;
  825.     // static int dir=-1;
  826.     // if (!(tic&15))
  827.     //   plyr->ammo[weaponinfo[plyr->readyweapon].ammo]+=dir;
  828.     // if (plyr->ammo[weaponinfo[plyr->readyweapon].ammo] == -100)
  829.     //   dir = 1;
  830.     // tic++;
  831.     // }
  832.     w_ready.data = plyr->readyweapon;
  833.     // if (*w_ready.on)
  834.     //  STlib_updateNum(&w_ready, true);
  835.     // refresh weapon change
  836.     //  }
  837.     // update keycard multiple widgets
  838.     for (i=0;i<3;i++)
  839.     {
  840. keyboxes[i] = plyr->cards[i] ? i : -1;
  841. if (plyr->cards[i+3])
  842.     keyboxes[i] = i+3;
  843.     }
  844.     // refresh everything if this is him coming back to life
  845.     ST_updateFaceWidget();
  846.     // used by the w_armsbg widget
  847.     st_notdeathmatch = !deathmatch;
  848.     
  849.     // used by w_arms[] widgets
  850.     st_armson = st_statusbaron && !deathmatch; 
  851.     // used by w_frags widget
  852.     st_fragson = deathmatch && st_statusbaron; 
  853.     st_fragscount = 0;
  854.     for (i=0 ; i<MAXPLAYERS ; i++)
  855.     {
  856. if (i != consoleplayer)
  857.     st_fragscount += plyr->frags[i];
  858. else
  859.     st_fragscount -= plyr->frags[i];
  860.     }
  861.     // get rid of chat window if up because of message
  862.     if (!--st_msgcounter)
  863. st_chat = st_oldchat;
  864. }
  865. void ST_Ticker (void)
  866. {
  867.     st_clock++;
  868.     st_randomnumber = M_Random();
  869. //    WriteDebug("ST_updateWidgets...n");
  870.     ST_updateWidgets();
  871.     st_oldhealth = plyr->health;
  872. }
  873. static int st_palette = 0;
  874. void ST_doPaletteStuff(void)
  875. {
  876.     int palette;
  877.     byte* pal;
  878.     int cnt;
  879.     int bzc;
  880.     cnt = plyr->damagecount;
  881.     if (plyr->powers[pw_strength])
  882.     {
  883. // slowly fade the berzerk out
  884.    bzc = 12 - (plyr->powers[pw_strength]>>6);
  885. if (bzc > cnt)
  886.     cnt = bzc;
  887.     }
  888.     if (cnt)
  889.     {
  890. palette = (cnt+7)>>3;
  891. if (palette >= NUMREDPALS)
  892.     palette = NUMREDPALS-1;
  893. palette += STARTREDPALS;
  894.     }
  895.     else if (plyr->bonuscount)
  896.     {
  897. palette = (plyr->bonuscount+7)>>3;
  898. if (palette >= NUMBONUSPALS)
  899.     palette = NUMBONUSPALS-1;
  900. palette += STARTBONUSPALS;
  901.     }
  902.     else if ( plyr->powers[pw_ironfeet] > 4*32
  903.       || plyr->powers[pw_ironfeet]&8)
  904. palette = RADIATIONPAL;
  905.     else
  906. palette = 0;
  907.     if (palette != st_palette)
  908.     {
  909. st_palette = palette;
  910. pal = (byte *) W_CacheLumpNum (lu_palette, PU_CACHE)+palette*768;
  911. I_SetPalette (pal);
  912.     }
  913. }
  914. void ST_drawWidgets(boolean refresh)
  915. {
  916.     int i;
  917.     // used by w_arms[] widgets
  918.     st_armson = st_statusbaron && !deathmatch;
  919.     // used by w_frags widget
  920.     st_fragson = deathmatch && st_statusbaron; 
  921.     STlib_updateNum(&w_ready, refresh);
  922.     for (i=0;i<4;i++)
  923.     {
  924. STlib_updateNum(&w_ammo[i], refresh);
  925. STlib_updateNum(&w_maxammo[i], refresh);
  926.     }
  927.     STlib_updatePercent(&w_health, refresh);
  928.     STlib_updatePercent(&w_armor, refresh);
  929.     STlib_updateBinIcon(&w_armsbg, refresh);
  930.     for (i=0;i<6;i++)
  931. STlib_updateMultIcon(&w_arms[i], refresh);
  932.     STlib_updateMultIcon(&w_faces, refresh);
  933.     for (i=0;i<3;i++)
  934. STlib_updateMultIcon(&w_keyboxes[i], refresh);
  935.     STlib_updateNum(&w_frags, refresh);
  936. }
  937. void ST_doRefresh(void)
  938. {
  939.     st_firsttime = false;
  940.     // draw status bar background to off-screen buff
  941. //    WriteDebug("ST_refreshBackground...n");
  942.     ST_refreshBackground();
  943.     // and refresh all widgets
  944. //    WriteDebug("ST_drawWidgets...n");
  945.     ST_drawWidgets(true);
  946. }
  947. void ST_diffDraw(void)
  948. {
  949.     // update all widgets
  950.     ST_drawWidgets(false);
  951. }
  952. void ST_Drawer (boolean fullscreen, boolean refresh)
  953. {
  954. //  WriteDebug("ST_Drawer - 1...n");
  955.     st_statusbaron = (!fullscreen) || automapactive;
  956.     st_firsttime = st_firsttime || refresh;
  957. //  WriteDebug("ST_Drawer - ST_doPaletteStuff...n");
  958.     // Do red-/gold-shifts from damage/items
  959.     ST_doPaletteStuff();
  960. //  WriteDebug("ST_Drawer - ST_doRefresh...n");
  961.     // If just after ST_Start(), refresh all
  962.     if (st_firsttime) ST_doRefresh();
  963.     // Otherwise, update as little as possible
  964.     else
  965.        {
  966. //  WriteDebug("ST_Drawer - ST_diffDraw...n");
  967.     ST_diffDraw();
  968.        }
  969. }
  970. void ST_loadGraphics(void)
  971. {
  972.     int i;
  973.     int j;
  974.     int facenum;
  975.     
  976.     char namebuf[9];
  977.     // Load the numbers, tall and short
  978.     for (i=0;i<10;i++)
  979.     {
  980. sprintf(namebuf, "STTNUM%d", i);
  981. tallnum[i] = (patch_t *) W_CacheLumpName(namebuf, PU_STATIC);
  982. sprintf(namebuf, "STYSNUM%d", i);
  983. shortnum[i] = (patch_t *) W_CacheLumpName(namebuf, PU_STATIC);
  984.     }
  985.     // Load percent key.
  986.     //Note: why not load STMINUS here, too?
  987.     tallpercent = (patch_t *) W_CacheLumpName("STTPRCNT", PU_STATIC);
  988.     // key cards
  989.     for (i=0;i<NUMCARDS;i++)
  990.     {
  991. sprintf(namebuf, "STKEYS%d", i);
  992. keys[i] = (patch_t *) W_CacheLumpName(namebuf, PU_STATIC);
  993.     }
  994.     // arms background
  995.     armsbg = (patch_t *) W_CacheLumpName("STARMS", PU_STATIC);
  996.     // arms ownership widgets
  997.     for (i=0;i<6;i++)
  998.     {
  999. sprintf(namebuf, "STGNUM%d", i+2);
  1000. // gray #
  1001. arms[i][0] = (patch_t *) W_CacheLumpName(namebuf, PU_STATIC);
  1002. // yellow #
  1003. arms[i][1] = shortnum[i+2]; 
  1004.     }
  1005.     // face backgrounds for different color players
  1006.     sprintf(namebuf, "STFB%d", consoleplayer);
  1007.     faceback = (patch_t *) W_CacheLumpName(namebuf, PU_STATIC);
  1008.     // status bar background bits
  1009.     sbar = (patch_t *) W_CacheLumpName("STBAR", PU_STATIC);
  1010.     // face states
  1011.     facenum = 0;
  1012.     for (i=0;i<ST_NUMPAINFACES;i++)
  1013.     {
  1014. for (j=0;j<ST_NUMSTRAIGHTFACES;j++)
  1015. {
  1016.     sprintf(namebuf, "STFST%d%d", i, j);
  1017.     faces[facenum++] = W_CacheLumpName(namebuf, PU_STATIC);
  1018. }
  1019. sprintf(namebuf, "STFTR%d0", i); // turn right
  1020. faces[facenum++] = W_CacheLumpName(namebuf, PU_STATIC);
  1021. sprintf(namebuf, "STFTL%d0", i); // turn left
  1022. faces[facenum++] = W_CacheLumpName(namebuf, PU_STATIC);
  1023. sprintf(namebuf, "STFOUCH%d", i); // ouch!
  1024. faces[facenum++] = W_CacheLumpName(namebuf, PU_STATIC);
  1025. sprintf(namebuf, "STFEVL%d", i); // evil grin ;)
  1026. faces[facenum++] = W_CacheLumpName(namebuf, PU_STATIC);
  1027. sprintf(namebuf, "STFKILL%d", i); // pissed off
  1028. faces[facenum++] = W_CacheLumpName(namebuf, PU_STATIC);
  1029.     }
  1030.     faces[facenum++] = W_CacheLumpName("STFGOD0", PU_STATIC);
  1031.     faces[facenum++] = W_CacheLumpName("STFDEAD0", PU_STATIC);
  1032. }
  1033. void ST_loadData(void)
  1034. {
  1035.     lu_palette = W_GetNumForName ("PLAYPAL");
  1036.     ST_loadGraphics();
  1037. }
  1038. void ST_unloadGraphics(void)
  1039. {
  1040.     int i;
  1041.     // unload the numbers, tall and short
  1042.     for (i=0;i<10;i++)
  1043.     {
  1044. Z_ChangeTag(tallnum[i], PU_CACHE);
  1045. Z_ChangeTag(shortnum[i], PU_CACHE);
  1046.     }
  1047.     // unload tall percent
  1048.     Z_ChangeTag(tallpercent, PU_CACHE); 
  1049.     // unload arms background
  1050.     Z_ChangeTag(armsbg, PU_CACHE); 
  1051.     // unload gray #'s
  1052.     for (i=0;i<6;i++)
  1053. Z_ChangeTag(arms[i][0], PU_CACHE);
  1054.     
  1055.     // unload the key cards
  1056.     for (i=0;i<NUMCARDS;i++)
  1057. Z_ChangeTag(keys[i], PU_CACHE);
  1058.     Z_ChangeTag(sbar, PU_CACHE);
  1059.     Z_ChangeTag(faceback, PU_CACHE);
  1060.     for (i=0;i<ST_NUMFACES;i++)
  1061. Z_ChangeTag(faces[i], PU_CACHE);
  1062.     // Note: nobody ain't seen no unloading
  1063.     //   of stminus yet. Dude.
  1064.     
  1065. }
  1066. void ST_unloadData(void)
  1067. {
  1068.     ST_unloadGraphics();
  1069. }
  1070. void ST_initData(void)
  1071. {
  1072.     int i;
  1073.     st_firsttime = true;
  1074.     plyr = &players[consoleplayer];
  1075.     st_clock = 0;
  1076.     st_chatstate = StartChatState;
  1077.     st_gamestate = FirstPersonState;
  1078.     st_statusbaron = true;
  1079.     st_oldchat = st_chat = false;
  1080.     st_cursoron = false;
  1081.     st_faceindex = 0;
  1082.     st_palette = -1;
  1083.     st_oldhealth = -1;
  1084.     for (i=0;i<NUMWEAPONS;i++)
  1085. oldweaponsowned[i] = plyr->weaponowned[i];
  1086.     for (i=0;i<3;i++)
  1087. keyboxes[i] = -1;
  1088.     STlib_init();
  1089. }
  1090. void ST_createWidgets(void)
  1091. {
  1092.     int i;
  1093.     // ready weapon ammo
  1094.     STlib_initNum(&w_ready,
  1095.   ST_AMMOX,
  1096.   ST_AMMOY,
  1097.   tallnum,
  1098.   &plyr->ammo[weaponinfo[plyr->readyweapon].ammo],
  1099.   &st_statusbaron,
  1100.   ST_AMMOWIDTH );
  1101.     // the last weapon type
  1102.     w_ready.data = plyr->readyweapon; 
  1103.     // health percentage
  1104.     STlib_initPercent(&w_health,
  1105.       ST_HEALTHX,
  1106.       ST_HEALTHY,
  1107.       tallnum,
  1108.       &plyr->health,
  1109.       &st_statusbaron,
  1110.       tallpercent);
  1111.     // arms background
  1112.     STlib_initBinIcon(&w_armsbg,
  1113.       ST_ARMSBGX,
  1114.       ST_ARMSBGY,
  1115.       armsbg,
  1116.       &st_notdeathmatch,
  1117.       &st_statusbaron);
  1118.     // weapons owned
  1119.     for(i=0;i<6;i++)
  1120.     {
  1121. STlib_initMultIcon(&w_arms[i],
  1122.    ST_ARMSX+(i%3)*ST_ARMSXSPACE,
  1123.    ST_ARMSY+(i/3)*ST_ARMSYSPACE,
  1124.    arms[i], (int *) &plyr->weaponowned[i+1],
  1125.    &st_armson);
  1126.     }
  1127.     // frags sum
  1128.     STlib_initNum(&w_frags,
  1129.   ST_FRAGSX,
  1130.   ST_FRAGSY,
  1131.   tallnum,
  1132.   &st_fragscount,
  1133.   &st_fragson,
  1134.   ST_FRAGSWIDTH);
  1135.     // faces
  1136.     STlib_initMultIcon(&w_faces,
  1137.        ST_FACESX,
  1138.        ST_FACESY,
  1139.        faces,
  1140.        &st_faceindex,
  1141.        &st_statusbaron);
  1142.     // armor percentage - should be colored later
  1143.     STlib_initPercent(&w_armor,
  1144.       ST_ARMORX,
  1145.       ST_ARMORY,
  1146.       tallnum,
  1147.       &plyr->armorpoints,
  1148.       &st_statusbaron, tallpercent);
  1149.     // keyboxes 0-2
  1150.     STlib_initMultIcon(&w_keyboxes[0],
  1151.        ST_KEY0X,
  1152.        ST_KEY0Y,
  1153.        keys,
  1154.        &keyboxes[0],
  1155.        &st_statusbaron);
  1156.     
  1157.     STlib_initMultIcon(&w_keyboxes[1],
  1158.        ST_KEY1X,
  1159.        ST_KEY1Y,
  1160.        keys,
  1161.        &keyboxes[1],
  1162.        &st_statusbaron);
  1163.     STlib_initMultIcon(&w_keyboxes[2],
  1164.        ST_KEY2X,
  1165.        ST_KEY2Y,
  1166.        keys,
  1167.        &keyboxes[2],
  1168.        &st_statusbaron);
  1169.     // ammo count (all four kinds)
  1170.     STlib_initNum(&w_ammo[0],
  1171.   ST_AMMO0X,
  1172.   ST_AMMO0Y,
  1173.   shortnum,
  1174.   &plyr->ammo[0],
  1175.   &st_statusbaron,
  1176.   ST_AMMO0WIDTH);
  1177.     STlib_initNum(&w_ammo[1],
  1178.   ST_AMMO1X,
  1179.   ST_AMMO1Y,
  1180.   shortnum,
  1181.   &plyr->ammo[1],
  1182.   &st_statusbaron,
  1183.   ST_AMMO1WIDTH);
  1184.     STlib_initNum(&w_ammo[2],
  1185.   ST_AMMO2X,
  1186.   ST_AMMO2Y,
  1187.   shortnum,
  1188.   &plyr->ammo[2],
  1189.   &st_statusbaron,
  1190.   ST_AMMO2WIDTH);
  1191.     
  1192.     STlib_initNum(&w_ammo[3],
  1193.   ST_AMMO3X,
  1194.   ST_AMMO3Y,
  1195.   shortnum,
  1196.   &plyr->ammo[3],
  1197.   &st_statusbaron,
  1198.   ST_AMMO3WIDTH);
  1199.     // max ammo count (all four kinds)
  1200.     STlib_initNum(&w_maxammo[0],
  1201.   ST_MAXAMMO0X,
  1202.   ST_MAXAMMO0Y,
  1203.   shortnum,
  1204.   &plyr->maxammo[0],
  1205.   &st_statusbaron,
  1206.   ST_MAXAMMO0WIDTH);
  1207.     STlib_initNum(&w_maxammo[1],
  1208.   ST_MAXAMMO1X,
  1209.   ST_MAXAMMO1Y,
  1210.   shortnum,
  1211.   &plyr->maxammo[1],
  1212.   &st_statusbaron,
  1213.   ST_MAXAMMO1WIDTH);
  1214.     STlib_initNum(&w_maxammo[2],
  1215.   ST_MAXAMMO2X,
  1216.   ST_MAXAMMO2Y,
  1217.   shortnum,
  1218.   &plyr->maxammo[2],
  1219.   &st_statusbaron,
  1220.   ST_MAXAMMO2WIDTH);
  1221.     
  1222.     STlib_initNum(&w_maxammo[3],
  1223.   ST_MAXAMMO3X,
  1224.   ST_MAXAMMO3Y,
  1225.   shortnum,
  1226.   &plyr->maxammo[3],
  1227.   &st_statusbaron,
  1228.   ST_MAXAMMO3WIDTH);
  1229. }
  1230. static boolean st_stopped = true;
  1231. void ST_Start (void)
  1232. {
  1233.     if (!st_stopped)
  1234. ST_Stop();
  1235.     ST_initData();
  1236.     ST_createWidgets();
  1237.     st_stopped = false;
  1238. }
  1239. void ST_Stop (void)
  1240. {
  1241.     if (st_stopped)
  1242. return;
  1243.     I_SetPalette (W_CacheLumpNum (lu_palette, PU_CACHE));
  1244.     st_stopped = true;
  1245. }
  1246. void ST_Init (void)
  1247. {
  1248.     veryfirsttime = 0;
  1249.     ST_loadData();
  1250.     //screens[4] = (byte *) Z_Malloc(ST_WIDTH*ST_HEIGHT, PU_STATIC, 0);
  1251. }