1 /***************************************************************************
2  *   WHPLR.C  - code for player character                                  *
3  *                                                                         *
4  ***************************************************************************/
5 
6 #include "witchaven.h"
7 #include "player.h"
8 #include "menu.h"
9 #include "sound.h"
10 #include "objects.h"
11 #include "tags.h"
12 #include "network.h"
13 #include "animation.h"
14 #include "input.h"
15 #include "network.h"
16 #include "scancodes.h"
17 #include "view.h"
18 
19 int victor = 0;
20 int autohoriz = 0;
21 
22 // WITCHAVEN 2
23 int dropshieldcnt = 0;
24 int droptheshield = 0;
25 int enchantedsoundhandle = -1;
26 extern short torchpattern[];
27 extern int expgained;
28 
29 //#define   WHDEMO
30 
31 int spelltime;
32 extern int loadedgame;
33 extern int scoretime;
34 
35 int madeahit = 0;
36 extern int mapflag;
37 
38 int pyrn;
39 int dahand = 0;
40 int mapon = 1;
41 
42 int32_t neartagdist, neartaghitdist;
43 
44 short neartagsector, neartagsprite, neartagwall;
45 
46 Player player[MAXPLAYERS];
47 
48 extern int justteleported;
49 extern int gameactivated;
50 extern short oldmousestatus;
51 extern int oldhoriz;
52 
53 extern char tempbuf[];
54 extern char scorebuf[];
55 extern char healthbuf[];
56 extern char potionbuf[];
57 
58 extern int weapontimex;
59 extern int weapontimey;
60 extern int weapontilenum;
61 
62 extern int frames;
63 
64 int weapondrop;
65 int weapondropgoal;
66 int weaponraise;
67 
68 int currweapontics;
69 int currweaponframe;
70 
71 int spellbooktics;
72 int spellbook;
73 int spellbookframe;
74 int spellbookflip;
75 
76 int spiketics;
77 int spikeframe;
78 int currspikeframe;
79 
80 
81 #define MAXFRAMES 12
82 
83 struct daweapons {
84    int daweapontics;
85    int daweaponframe;
86    int currx;
87    int curry;
88 };
89 
90 struct daweapons spikeanimtics[5] =
91 { {10,DIESPIKE,136,145},
92   {10,DIESPIKE+1,136,124},
93   {10,DIESPIKE+2,136,100},
94   {10,DIESPIKE+3,136,70},
95   {10,DIESPIKE+4,136,50} };
96 
97 //
98 struct daweapons spellbookanim[MAXNUMORBS][9] =
99 {
100     // SCARE
101     { {8,SPELLBOOK8,121,161},    {8,SPELLBOOK8 + 1,121,161},
102       {8,SPELLBOOK8 + 2,121,156},{8,SPELLBOOK8 + 3,121,158},
103       {8,SPELLBOOK8 + 4,121,159},{8,SPELLBOOK8 + 5,121,161},
104       {8,SPELLBOOK8 + 6,121,160},{8,SPELLBOOK8 + 7,121,161},
105       {8,SPELLBOOK8 + 7,121,161}
106     },
107     // NIGHT VISION
108     { {8,SPELLBOOK6,121,161},    {8,SPELLBOOK6 + 1,121,161},
109       {8,SPELLBOOK6 + 2,121,156},{8,SPELLBOOK6 + 3,121,158},
110       {8,SPELLBOOK6 + 4,121,159},{8,SPELLBOOK6 + 5,121,161},
111       {8,SPELLBOOK6 + 6,121,160},{8,SPELLBOOK6 + 7,121,161},
112       {8,SPELLBOOK6 + 7,121,161}
113     },
114     // FREEZE
115     { {8,SPELLBOOK3,121,161},    {8,SPELLBOOK3 + 1,121,161},
116       {8,SPELLBOOK3 + 2,121,156},{8,SPELLBOOK3 + 3,121,158},
117       {8,SPELLBOOK3 + 4,121,159},{8,SPELLBOOK3 + 5,120,161},
118       {8,SPELLBOOK3 + 6,120,160},{8,SPELLBOOK3 + 7,120,161},
119       {8,SPELLBOOK3 + 7,121,161}
120     },
121     // MAGIC ARROW
122     { {8,SPELLBOOKBLANK,121,161},    {8,SPELLBOOKBLANK + 1,121,161},
123       {8,SPELLBOOKBLANK + 2,121,156},{8,SPELLBOOKBLANK + 3,121,158},
124       {8,SPELLBOOKBLANK + 4,121,159},{8,SPELLBOOKBLANK + 5,121,161},
125       {8,SPELLBOOKBLANK + 6,120,160},{8,SPELLBOOKBLANK + 7,121,161},
126       {8,SPELLBOOKBLANK + 7,122,161}
127     },
128     // OPEN DOORS
129     { {8,SPELLBOOK7,121,161},    {8,SPELLBOOK7 + 1,121,161},
130       {8,SPELLBOOK7 + 2,121,156},{8,SPELLBOOK7 + 3,121,158},
131       {8,SPELLBOOK7 + 4,121,159},{8,SPELLBOOK7 + 5,121,161},
132       {8,SPELLBOOK7 + 6,121,160},{8,SPELLBOOK7 + 7,121,161},
133       {8,SPELLBOOK7 + 7,121,161}
134     },
135     // FLY
136     { {8,SPELLBOOK2,121,161},    {8,SPELLBOOK2 + 1,121,161},
137       {8,SPELLBOOK2 + 2,121,156},{8,SPELLBOOK2 + 3,121,158},
138       {8,SPELLBOOK2 + 4,121,159},{8,SPELLBOOK2 + 5,121,161},
139       {8,SPELLBOOK2 + 6,121,160},{8,SPELLBOOK2 + 7,121,161},
140       {8,SPELLBOOK2 + 7,121,161}
141     },
142     // FIRE BALL
143     { {8,SPELLBOOK4,121,161},    {8,SPELLBOOK4 + 1,121,161},
144       {8,SPELLBOOK4 + 2,121,156},{8,SPELLBOOK4 + 3,121,158},
145       {8,SPELLBOOK4 + 4,121,159},{8,SPELLBOOK4 + 5,121,161},
146       {8,SPELLBOOK4 + 6,121,160},{8,SPELLBOOK4 + 7,121,161},
147       {8,SPELLBOOK4 + 7,121,161}
148     },
149     // NUKE!
150     { {8,SPELLBOOK5,121,161},    {8,SPELLBOOK5 + 1,121,161},
151       {8,SPELLBOOK5 + 2,121,156},{8,SPELLBOOK5 + 3,121,158},
152       {8,SPELLBOOK5 + 4,121,159},{8,SPELLBOOK5 + 5,121,161},
153       {8,SPELLBOOK5 + 6,121,160},{8,SPELLBOOK5 + 7,121,161},
154       {8,SPELLBOOK5 + 7,121,161}
155     }
156 };
157 
158 struct daweapons sspellbookanim[MAXNUMORBS][9] =
159 {
160     // SCARE
161     { {8,SSPELLBOOK8,121,389},    {8,SSPELLBOOK8 + 1,121,377},
162       {8,SSPELLBOOK8 + 2,121,383},{8,SSPELLBOOK8 + 3,121,385},
163       {8,SSPELLBOOK8 + 4,121,389},{8,SSPELLBOOK8 + 5,121,387},
164       {8,SSPELLBOOK8 + 6,121,389},{8,SSPELLBOOK8 + 7,121,389},
165       {8,SSPELLBOOK8 + 7,121,389}
166     },
167     // NIGHT VISION
168     { {8,SSPELLBOOK6,121,389},    {8,SSPELLBOOK6 + 1,121,377},
169       {8,SSPELLBOOK6 + 2,121,383},{8,SSPELLBOOK6 + 3,121,385},
170       {8,SSPELLBOOK6 + 4,121,389},{8,SSPELLBOOK6 + 5,121,387},
171       {8,SSPELLBOOK6 + 6,121,389},{8,SSPELLBOOK6 + 7,121,389},
172       {8,SSPELLBOOK6 + 7,121,389}
173     },
174     // FREEZE
175     { {8,SSPELLBOOK3,121,389},    {8,SSPELLBOOK3 + 1,121,377},
176       {8,SSPELLBOOK3 + 2,121,383},{8,SSPELLBOOK3 + 3,121,385},
177       {8,SSPELLBOOK3 + 4,121,389},{8,SSPELLBOOK3 + 5,120,387},
178       {8,SSPELLBOOK3 + 6,120,389},{8,SSPELLBOOK3 + 7,120,389},
179       {8,SSPELLBOOK3 + 7,121,389}
180     },
181     // MAGIC ARROW
182     { {8,SSPELLBOOKBLANK,121,389},    {8,SSPELLBOOKBLANK + 1,121,377},
183       {8,SSPELLBOOKBLANK + 2,121,383},{8,SSPELLBOOKBLANK + 3,121,385},
184       {8,SSPELLBOOKBLANK + 4,121,389},{8,SSPELLBOOKBLANK + 5,121,387},
185       {8,SSPELLBOOKBLANK + 6,120,389},{8,SSPELLBOOKBLANK + 7,121,389},
186       {8,SSPELLBOOKBLANK + 7,122,389}
187     },
188     // OPEN DOORS
189     { {8,SSPELLBOOK7,121,389},    {8,SSPELLBOOK7 + 1,121,377},
190       {8,SSPELLBOOK7 + 2,121,383},{8,SSPELLBOOK7 + 3,121,385},
191       {8,SSPELLBOOK7 + 4,121,389},{8,SSPELLBOOK7 + 5,121,387},
192       {8,SSPELLBOOK7 + 6,121,389},{8,SSPELLBOOK7 + 7,121,389},
193       {8,SSPELLBOOK7 + 7,121,389}
194     },
195     // FLY
196     { {8,SSPELLBOOK2,121,389},    {8,SSPELLBOOK2 + 1,121,377},
197       {8,SSPELLBOOK2 + 2,121,383},{8,SSPELLBOOK2 + 3,121,385},
198       {8,SSPELLBOOK2 + 4,121,389},{8,SSPELLBOOK2 + 5,121,387},
199       {8,SSPELLBOOK2 + 6,121,389},{8,SSPELLBOOK2 + 7,121,389},
200       {8,SSPELLBOOK2 + 7,121,389}
201     },
202     // FIRE BALL
203     { {8,SSPELLBOOK4,121,389},    {8,SSPELLBOOK4 + 1,121,377},
204       {8,SSPELLBOOK4 + 2,121,383},{8,SSPELLBOOK4 + 3,121,385},
205       {8,SSPELLBOOK4 + 4,121,389},{8,SSPELLBOOK4 + 5,121,387},
206       {8,SSPELLBOOK4 + 6,121,389},{8,SSPELLBOOK4 + 6,121,389},
207       {8,SSPELLBOOK4 + 6,121,389}
208     },
209     // NUKE!
210     { {8,SSPELLBOOK5,121,389},    {8,SSPELLBOOK5 + 1,121,377},
211       {8,SSPELLBOOK5 + 2,121,383},{8,SSPELLBOOK5 + 3,121,385},
212       {8,SSPELLBOOK5 + 4,121,389},{8,SSPELLBOOK5 + 5,121,387},
213       {8,SSPELLBOOK5 + 6,121,389},{8,SSPELLBOOK5 + 6,121,389},
214       {8,SSPELLBOOK5 + 6,121,389}
215     }
216 };
217 
218 struct daweapons throwanimtics[MAXNUMORBS][MAXFRAMES + 1] =
219 {
220     // MUTWOHANDS
221     { {10,MUTWOHANDS,19,155},{10,MUTWOHANDS + 1,0,128},{10,MUTWOHANDS + 2,0,93},
222       {10,MUTWOHANDS + 3,0,83},{10,MUTWOHANDS + 4,0,72},{10,MUTWOHANDS + 5,0,83},
223       {10,MUTWOHANDS + 6,10,96},{10,MUTWOHANDS + 7,43,109},{10,MUTWOHANDS + 8,69,113},
224       {10,MUTWOHANDS + 9,65,115},{10,MUTWOHANDS + 10,64,117},{10,MUTWOHANDS + 11,63,117},
225       {1,0,127,170}
226     },
227     // MUMEDUSA
228     { {10,MUMEDUSA,0,177},{10,MUMEDUSA + 1,0,137},{10,MUMEDUSA + 2,48,82},
229       {10,MUMEDUSA + 3,127,41},{10,MUMEDUSA + 4,210,9},{10,MUMEDUSA + 5,284,26},
230       {10,MUMEDUSA + 6,213,63},{10,MUMEDUSA + 7,147,99},{10,MUMEDUSA + 8,91,136},
231       {10,MUMEDUSA + 9,46,183},{1,0,127,170},{1,0,127,170},
232       {1,0,127,170}
233     },
234     // BMUTWOHANDS
235     { {10,MUTWOHANDS,19,155},{10,MUTWOHANDS + 1,0,128},{10,MUTWOHANDS + 2,0,93},
236       {10,MUTWOHANDS + 3,0,83},{10,BMUTWOHANDS,0,74},{10,BMUTWOHANDS + 1,0,97},
237       {10,BMUTWOHANDS + 2,10,109},{10,BMUTWOHANDS + 3,43,113},{10,BMUTWOHANDS + 4,69,115},
238       {10,BMUTWOHANDS + 5,65,117},{10,BMUTWOHANDS + 6,64,117},{10,BMUTWOHANDS + 7,63,117},
239       {1,0,127,170}
240     },
241     // MUTWOHANDS
242     { {10,MUTWOHANDS,19,155},{10,MUTWOHANDS + 1,0,128},{10,MUTWOHANDS + 2,0,93},
243       {10,MUTWOHANDS + 3,0,83},{10,MUTWOHANDS + 4,0,72},{10,MUTWOHANDS + 5,0,83},
244       {10,MUTWOHANDS + 6,10,96},{10,MUTWOHANDS + 7,43,109},{10,MUTWOHANDS + 8,69,113},
245       {10,MUTWOHANDS + 9,65,115},{10,MUTWOHANDS + 10,64,117},{10,MUTWOHANDS + 11,63,117},
246       {1,0,127,170}
247     },
248     // MUTWOHANDS
249     { {15,MUTWOHANDS,19,155},{15,MUTWOHANDS + 1,0,128},{15,MUTWOHANDS + 2,0,93},
250       {15,MUTWOHANDS + 3,0,83},{15,MUTWOHANDS + 4,0,72},{15,MUTWOHANDS + 5,0,83},
251       {15,MUTWOHANDS + 6,10,96},{15,MUTWOHANDS + 7,43,109},{15,MUTWOHANDS + 8,69,113},
252       {15,MUTWOHANDS + 9,65,115},{15,MUTWOHANDS + 10,64,117},{15,MUTWOHANDS + 11,63,117},
253       {1,0,127,170}
254     },
255     // MUMEDUSA
256     { {10,MUMEDUSA,0,177},{10,MUMEDUSA + 1,0,137},{10,MUMEDUSA + 2,48,82},
257       {10,MUMEDUSA + 3,127,41},{10,MUMEDUSA + 4,210,9},{10,MUMEDUSA + 5,284,26},
258       {10,MUMEDUSA + 6,213,63},{10,MUMEDUSA + 7,147,99},{10,MUMEDUSA + 8,91,136},
259       {10,MUMEDUSA + 9,46,183},{1,0,127,170},{1,0,127,170},
260       {1,0,127,170}
261     },
262     // MUTWOHANDS
263     { {10,MUTWOHANDS,19,155},{10,MUTWOHANDS + 1,0,128},{10,MUTWOHANDS + 2,0,93},
264       {10,MUTWOHANDS + 3,0,83},{10,MUTWOHANDS + 4,0,72},{10,MUTWOHANDS + 5,0,83},
265       {10,MUTWOHANDS + 6,10,96},{10,MUTWOHANDS + 7,43,109},{10,MUTWOHANDS + 8,69,113},
266       {10,MUTWOHANDS + 9,65,115},{10,MUTWOHANDS + 10,64,117},{10,MUTWOHANDS + 11,63,117},
267       {1,0,127,170}
268     },
269     // MUTWOHANDS
270     { {10,MUTWOHANDS,19,155},{10,MUTWOHANDS + 1,0,128},{10,MUTWOHANDS + 2,0,93},
271       {10,MUTWOHANDS + 3,0,83},{10,MUTWOHANDS + 4,0,72},{10,MUTWOHANDS + 5,0,83},
272       {10,MUTWOHANDS + 6,10,96},{10,MUTWOHANDS + 7,43,109},{10,MUTWOHANDS + 8,69,113},
273       {10,MUTWOHANDS + 9,65,115},{10,MUTWOHANDS + 10,64,117},{10,MUTWOHANDS + 11,63,117},
274       {1,0,127,170}
275     }
276 };
277 
278 struct daweapons lefthandanimtics[5][MAXFRAMES] =
279 {
280     { { 10,RFIST,15,121 },{10,RFIST + 1,17,114},{10,RFIST + 2,54,131},
281       { 10,RFIST + 3,76,152 },{10,RFIST + 4,31,126},{10,RFIST + 5,26,135},
282       { 1,0,80,41 },{1,0,107,52},{1,0,147,76},
283       { 1,0,80,41 },{1,0,107,52},{1,0,147,76}
284     },
285     // KNIFE
286     { { 8,KNIFEATTACK2,0,113 },{8,KNIFEATTACK2 + 1,44,111},{8,KNIFEATTACK2 + 2,119,137},
287       { 8,KNIFEATTACK2 + 3,187,159},{16,0,136,100},{8,KNIFEATTACK2 + 3,187,159},
288       { 8,KNIFEATTACK2 + 2,119,137},{8,KNIFEATTACK2 + 1,44,111},{8,KNIFEATTACK2,0,113},
289       { 1,0,80,41 },{1,0,107,52},{1,0,147,76}
290     },
291     // GOBLINATTACK
292     { {10,GOBSWORDATTACK,243,92},{10,GOBSWORDATTACK + 1,255,68 },{10,GOBSWORDATTACK + 2,279,65},
293       {10,GOBSWORDATTACK + 3,238,55},{10,GOBSWORDATTACK + 4,153,52 },{10,GOBSWORDATTACK + 5,129,152},
294       {10,GOBSWORDATTACK + 6,90,184},{ 1,0,297,169 },{1,0,275,24},
295       {1,0,275,24 },{ 1,0,275,24 },{1,0,275,24}
296     },
297     // MORNINGATTACK2
298     { { 12,MORNINGATTACK2,38,142 },{12,MORNINGATTACK2 + 1,0,111},{12,MORNINGATTACK2 + 2,0,91},
299       { 12,MORNINGATTACK2 + 3,0,47 },{12,MORNINGATTACK2 + 4,0,24},{1,0,0,24},
300       { 1,0,0,24 },{1,0,0,24},{1,0,0,24},
301       { 1,0,0,24 },{1,0,0,24},{1,0,0,24}
302     },
303     // GOBLINATTACK2
304     { { 10,GOBSWORDATTACK2,236,99 },{10,GOBSWORDATTACK2 + 1,202,24},{10,GOBSWORDATTACK2 + 2,181,0},
305       { 10,GOBSWORDATTACK2 + 3,52,12 },{10,GOBSWORDATTACK2 + 4,72,72},{10,GOBSWORDATTACK2 + 5,134,139},
306       { 10,GOBSWORDATTACK2 + 6,297,169 },{1,0,275,24},{1,0,275,24 },
307       { 1,0,275,24 },{1,0,275,24},{1,0,275,24}
308     }
309 };
310 
311 // #define LFIST   NULL
312 
313 struct daweapons cockanimtics[MAXFRAMES + 1] =
314 {
315     {24,0,10,10},
316     {12,BOWREADYEND + 1,101,115},{12,BOWREADYEND + 2,112,0},
317     {12,BOWREADYEND + 3,115,0},{12,BOWREADYEND + 4,75,13}
318 };
319 
320 struct daweapons readyanimtics[MAXWEAPONS][MAXFRAMES + 1] =
321 {
322     // FIST
323     { { 10,RFIST,216,180 },{10,RFIST,216,170},{10,RFIST,216,160},
324       { 10,RFIST,216,150 },{10,RFIST,216,140},{10,RFIST,216,130},
325       { 10,RFIST,216,124 },{1,RFIST,216,124},{1,RFIST,216,124},
326       { 1,RFIST,216,122 },{1,RFIST,216,122},{1,RFIST,216,122},
327       {1,0,147,76}
328     },
329     // KNIFE
330     { { 10,KNIFEREADY,69,171 },{10,KNIFEREADY + 1,11,146},{10,KNIFEREADY + 2,25,146},
331       { 10,KNIFEREADY + 3,35,158 },{10,KNIFEREADY + 4,38,158},{10,KNIFEREADY + 5,16,157},
332       { 10,KNIFEREADY + 6,37,102},{10,KNIFEREADY + 7,239,63},{10,KNIFEREADY + 8,214,85},
333       { 10,KNIFEREADY + 9,206,110},{10,KNIFEREADY + 10,217,108},{10,KNIFEREADY + 11,204,95},
334       {1,0,147,76}
335     },
336     // GOBSWORD
337     { { 12,GOBSWORDPULL,79,169 },{12,GOBSWORDPULL + 1,95,115},{12,GOBSWORDPULL + 2,94,93},
338       { 12,GOBSWORDPULL + 3,156,77 },{12,GOBSWORDPULL + 4,218,64},{12,GOBSWORDPULL + 5,224,57},
339       { 8,GOBSWORDPULL + 6,251,54 },{1,GOBSWORDPULL + 7,243,92},{1,GOBSWORDPULL + 7,243,92},
340       { 1,GOBSWORDPULL + 7,243,92 },{1,GOBSWORDPULL + 7,243,92},{1,GOBSWORDPULL + 7,243,92},
341       {1,0,147,76}
342     },
343     // MORNINGSTAR
344     { { 6,MORNINGSTAR,193,190 },{6,MORNINGSTAR,193,180},{6,MORNINGSTAR,193,170},
345       { 6,MORNINGSTAR,193,160 },{6,MORNINGSTAR,193,150},{6,MORNINGSTAR,193,140},
346       { 6,MORNINGSTAR,193,130 },{6,MORNINGSTAR,193,120},{6,MORNINGSTAR,193,110},
347       { 6,MORNINGSTAR,193,100 },{6,MORNINGSTAR,193,90},{1,MORNINGSTAR,193,90},
348       {1,0,147,76}
349     },
350     // SWORD
351     { { 10,SWORDPULL,58,160 },{10,SWORDPULL + 1,81,111},{10,SWORDPULL + 2,19,88},
352       { 10,SWORDPULL + 3,0,93 },{10,SWORDPULL + 4,104,0},{10,SWORDPULL + 5,169,0},
353       { 10,SWORDPULL + 6,244,38 },{6,SWORDPULL + 7,225,121},{1,SWORDPULL + 7,225,121},
354       { 1,SWORDPULL + 7,225,121 },{1,SWORDPULL + 7,225,121},{1,SWORDPULL + 7,225,121},
355       {1,0,147,76}
356     },
357     { { 12,BIGAXEDRAW,71,108 },{12,BIGAXEDRAW + 1,17,58},{12,BIGAXEDRAW + 2,0,56},
358       { 12,BIGAXEDRAW + 3,0,71 },{12,BIGAXEDRAW + 4,0,102},{12,BIGAXEDRAW + 5,0,11},
359       { 12,BIGAXEDRAW + 6,33,0 },{12,BIGAXEDRAW + 7,69,0},{12,BIGAXEDRAW + 8,75,20},
360       { 12,BIGAXEDRAW9,150,92 },{12,BIGAXEDRAW10,182,116},{1,0,200,122},
361       {1,0,147,76}
362     },
363     // BOW
364     { { 12,BOWREADY,0,0 },{12,BOWREADY + 1,0,20},{12,BOWREADY + 2,0,46},
365       { 12,BOWREADY + 3,0,26 },{12,BOWREADY + 4,0,0},{12,BOWREADY + 5,71,0},
366       { 8,BOWREADYEND,77,23 },{1,BOWREADYEND,77,23},{1,BOWREADYEND,77,23},
367       { 1,BOWREADYEND,77,23 },{1,BOWREADYEND,77,23},{1,BOWREADYEND,77,23},
368       {1,0,147,76}
369     },
370     { { 8,PIKEDRAW,0,156 },{8,PIKEDRAW + 1,15,98},{8,PIKEDRAW + 2,83,49},
371       { 8,PIKEDRAW + 3,144,66 },{8,PIKEDRAW + 4,197,99},{8,PIKEDRAW + 5,216,131},
372       { 1,0,80,41 },{1,0,107,52},{1,0,147,76},
373       { 1,0,80,41 },{1,0,107,52},{1,0,147,76},
374       {1,0,147,76}
375     },
376     { { 12,EXCALDRAW,167,130 },{12,EXCALDRAW + 1,70,117},{12,EXCALDRAW + 2,0,128},
377       { 12,EXCALDRAW + 3,0,150 },{12,EXCALDRAW + 4,4,72},{12,EXCALDRAW + 5,38,81},
378       { 12,EXCALDRAW + 6,0,44 },{12,EXCALDRAW + 7,112,0},{12,EXCALDRAW + 8,224,0},
379       { 12,EXCALDRAW + 9,198,84 },{12,EXCALDRAW + 10,186,120},{12,EXCALDRAW + 11,188,123},
380       {1,0,147,76}
381     },
382     { { 12,HALBERDDRAW,183,62 },{12,HALBERDDRAW + 1,166,10},{12,HALBERDDRAW + 2,173,29},
383       { 12,HALBERDDRAW + 3,114,35 },{1,HALBERDATTACK1,245,22},{1,HALBERDATTACK1,245,22},
384       { 1,HALBERDATTACK1,245,22 },{1,HALBERDATTACK1,245,22},{1,HALBERDATTACK1,245,22},
385       { 1,HALBERDATTACK1,245,22 },{1,HALBERDATTACK1,245,22},{1,HALBERDATTACK1,245,22},
386       {1,0,147,76}
387     }
388 };
389 
390 struct daweapons weaponanimtics[MAXWEAPONS][MAXFRAMES] =
391 {
392     // FIST
393     { { 10,RFIST,216,120 },{10,RFIST + 1,166,113},{10,RFIST + 2,156,129},
394       { 10,RFIST + 3,169,151 },{10,RFIST + 4,153,124},{10,RFIST + 5,224,133},
395       { 1,0,80,41 },{1,0,107,52},{1,0,147,76},
396       { 1,0,80,41 },{1,0,107,52},{1,0,147,76}
397     },
398     // KNIFE
399     { { 8,KNIFEATTACK,189,52 },{8,KNIFEATTACK + 1,254,68},{8,0,147,76},
400       { 8,0,80,41 },{8,KNIFEATTACK + 2,254,69},{8,KNIFEATTACK + 3,218,80},
401       { 8,KNIFEATTACK + 4,137,83},{8,KNIFEATTACK + 5,136,100},{8,KNIFEATTACK + 6,126,140},
402       { 8,KNIFEATTACK + 5,136,100},{8,KNIFEATTACK + 4,137,83},{8,KNIFEATTACK,189,52}
403     },
404     // GOBLINATTACK
405     { {10,GOBSWORDATTACK,243,92},{10,GOBSWORDATTACK + 1,255,68 },{10,GOBSWORDATTACK + 2,279,65},
406       {10,GOBSWORDATTACK + 3,238,55},{10,GOBSWORDATTACK + 4,153,52 },{10,GOBSWORDATTACK + 5,129,152},
407       {10,GOBSWORDATTACK + 6,90,184},{ 1,0,297,169 },{1,0,275,24},
408       {1,0,275,24 },{ 1,0,275,24 },{1,0,275,24}
409     },
410     // MORNINGSTAR
411     { { 12,MORNINGSTAR,193,90 },{12,MORNINGSTAR + 1,102,133},{12,MORNINGSTAR + 2,77,164},
412       { 12,MORNINGSTAR + 3,239,86 },{12,0,299,86},{12,0,107,52},
413       { 12,MORNINGSTAR + 4,197,24 },{12,MORNINGSTAR + 5,125,124},{12,MORNINGSTAR + 6,109,191 },
414       { 1,0,80,41 },{1,0,107,52},{1,0,147,76}
415     },
416     // SWORD
417     { { 8,SWORDATTACK,229,123},{8,SWORDATTACK + 1,221,87},{8,SWORDATTACK + 2,193,21},
418       { 8,SWORDATTACK + 3,173,0},{8,SWORDATTACK + 4,61,0},{8,SWORDATTACK + 5,33,48},
419       { 8,SWORDATTACK + 6,126,131},{8,SWORDATTACK + 7,297,164},{3,0,147,76},
420       { 3,0,80,41 },{3,0,107,52},{3,0,147,76}
421     },
422     { { 12,BIGAXEATTACK,184,123 },{12,BIGAXEATTACK + 1,223,112},{12,BIGAXEATTACK + 2,63,151},
423       { 12,BIGAXEATTACK + 3,91,133 },{12,BIGAXEATTACK + 4,127,138},{12,BIGAXEATTACK + 5,106,128},
424       { 12,BIGAXEATTACK + 6,117,49 },{12,BIGAXEATTACK + 7,140,0},{12,BIGAXEATTACK + 8,152,47},
425       { 12,BIGAXEATTACK + 9,166,143 },{12,0,107,52},{1,0,147,76}
426     },
427     // BOW
428     { { 8,BOWWALK,75,13},{8,BOWWALK + 1,90,0},{8,BOWWALK + 2,70,0},
429       { 8,BOWWALK + 3,70,0},{6,BOWWALK + 4,70,0},{4,BOWWALK + 5,70,0},
430       { 1,0,126,131},{1,0,297,164},{1,0,147,76},
431       { 1,0,80,41 },{1,0,107,52},{1,0,147,76}
432     },
433     { { 10,PIKEDRAW + 5,216,131},{10 ,0,80,41 },{10,0,107,52},{10,0,147,76},
434       { 10,PIKEATTACK1,0,47 },{10,PIKEATTACK1 + 1,0,0},{10,PIKEATTACK1 + 2,0,0},
435       { 10,PIKEATTACK1 + 3,73,0 },{10,PIKEATTACK1 + 4,130,27},{10,PIKEATTACK1 + 5,138,125},
436       { 12,0,80,41 },{1,0,107,52}
437     },
438     { { 8,EXCALATTACK1,98,133},{8,EXCALATTACK1 + 1,123,130 },{8,EXCALATTACK1 + 2,125,128},
439       { 8,EXCALATTACK1 + 3,115,82},{ 8,EXCALATTACK1 + 4,115,6 },{8,EXCALATTACK1 + 5,178,0},
440       { 8,EXCALATTACK1 + 6,155,0},{ 8,EXCALATTACK1 + 7,143,0 },{8,EXCALATTACK1 + 8,90,91},
441       { 8,EXCALATTACK1 + 9,30,159},{ 1,0,80,41 },{1,0,107,52}
442     },
443     { { 12,HALBERDATTACK1,245,22 },{12,0,107,52},{12,0,147,76},
444       { 12,HALBERDATTACK1 + 1,249,45 },{12,HALBERDATTACK1 + 2,161,60},{12,HALBERDATTACK1 + 3,45,88},
445       { 12,0,80,41 },{12,HALBERDATTACK1 + 3,45,88},{12,HALBERDATTACK1 + 2,161,60},
446       { 12,HALBERDATTACK1 + 1,249,45 },{12,0,107,52},{1,0,147,76}
447     }
448 };
449 
450 struct daweapons weaponanimtics2[MAXWEAPONS][MAXFRAMES] =
451 {
452     // FIST
453     { { 10,RFIST,216,120 },{10,RFIST + 1,166,113},{10,RFIST + 2,156,129},
454       { 10,RFIST + 3,169,151 },{10,RFIST + 4,153,124},{10,RFIST + 5,224,133},
455       { 1,0,80,41 },{1,0,107,52},{1,0,147,76},
456       { 1,0,80,41 },{1,0,107,52},{1,0,147,76}
457     },
458     // KNIFE
459     { { 8,KNIFEATTACK,189,52 },{8,KNIFEATTACK + 1,254,68},{16,0,147,76},
460       { 8,KNIFEATTACK2,206,114 },{8,KNIFEATTACK2 + 1,107,112},{8,KNIFEATTACK2 + 2,22,138},
461       { 8,KNIFEATTACK2 + 3,0,161},{16,0,136,100},{8,KNIFEATTACK2 + 3,0,161},
462       { 8,KNIFEATTACK2 + 2,22,138},{8,KNIFEATTACK2 + 1,107,112},{8,KNIFEATTACK2,206,114}
463     },
464     // GOBLINATTACK
465     { { 10,GOBSWORDATTACK2,236,99 },{10,GOBSWORDATTACK2 + 1,202,24},{10,GOBSWORDATTACK2 + 2,181,0},
466       { 10,GOBSWORDATTACK2 + 3,52,12 },{10,GOBSWORDATTACK2 + 4,72,72},{10,GOBSWORDATTACK2 + 5,134,139},
467       { 10,GOBSWORDATTACK2 + 6,297,169 },{1,0,275,24},{1,0,275,24 },
468       { 1,0,275,24 },{1,0,275,24},{1,0,275,24}
469     },
470     // MORNINGATTACK2
471     { { 12,MORNINGATTACK2,85,136 },{12,MORNINGATTACK2 + 1,34,110},{12,MORNINGATTACK2 + 2,32,91},
472       { 12,MORNINGATTACK2 + 3,186,47 },{12,MORNINGATTACK2 + 4,275,24},{1,0,275,24},
473       { 1,0,275,24 },{1,0,275,24},{1,0,275,24 },
474       { 1,0,275,24 },{1,0,275,24},{1,0,275,24}
475     },
476     // SWORD
477     { { 8,SWORDATTACK2 + 1,195,63},{8,SWORDATTACK2 + 2,250,54},{8,SWORDATTACK2 + 3,275,37},
478       {16,0,61,0},{ 8,SWORDATTACK2 + 4,229,66},{8,SWORDATTACK2 + 5,185,0},
479       { 8,SWORDATTACK2 + 6,158,115},{8,SWORDATTACK2 + 7,57,163},{1,0,57,163},
480       { 1,0,57,163 },{1,0,57,163},{1,0,57,163}
481     },
482     { { 12,BIGAXEATTACK2,200,111 },{12,BIGAXEATTACK2 + 1,5,136},{12,BIGAXEATTACK2 + 2,69,162},
483       { 12,BIGAXEATTACK2 + 3,147,164 },{12,BIGAXEATTACK2 + 4,76,152},{12,BIGAXEATTACK2 + 5,33,95},
484       { 12,BIGAXEATTACK2 + 6,0,91 },{12,BIGAXEATTACK2 + 7,0,98},{12,0,147,76},
485       { 1,0,80,41 },{1,0,107,52},{1,0,147,76}
486     },
487     // BOW
488     { { 8,BOWWALK,75,13},{8,BOWWALK + 1,90,0},{8,BOWWALK + 2,70,0},
489       { 8,BOWWALK + 3,70,0},{6,BOWWALK + 4,70,0},{4,BOWWALK + 5,70,0},
490       { 1,0,126,131},{1,0,297,164},{1,0,147,76},
491       { 1,0,80,41 },{1,0,107,52},{1,0,147,76}
492     },
493     { { 10,PIKEATTACK2,266,147 },{10,PIKEATTACK2 + 1,182,117},{10,PIKEATTACK2 + 2,123,84},
494       { 10,PIKEATTACK2 + 3,7,48 },{10,PIKEATTACK2 + 4,0,83},{10,PIKEATTACK2 + 5,0,158},
495       { 10,PIKEATTACK2 + 6,25,117 },{10,PIKEATTACK2 + 7,139,93},{10,PIKEATTACK2 + 8,234,75},
496       { 8,0,80,41 },{1,0,107,52},{1,0,147,76}
497     },
498     { { 8,EXCALATTACK2,0,143},{8,EXCALATTACK2 + 1,0,103 },{8,EXCALATTACK2 + 2,0,70},
499       { 8,EXCALATTACK2 + 3,48,0},{ 8,EXCALATTACK2 + 4,67,0 },{8,EXCALATTACK2 + 5,78,21},
500       { 8,EXCALATTACK2 + 6,165,107},{ 8,EXCALATTACK2 + 7,260,168 },{1,0,130,27},
501       { 1,0,138,125},{ 1,0,80,41 },{1,0,107,52}
502     },
503     { { 12,HALBERDATTACK1,245,22 },{12,HALBERDATTACK2,114,35},{12,HALBERDATTACK2 + 1,105,87},
504       { 12,HALBERDATTACK2 + 2,54,107 },{12,HALBERDATTACK2 + 3,48,102},{1,HALBERDATTACK2 + 3,48,102},
505       { 1,HALBERDATTACK2 + 3,48,102 },{12,HALBERDATTACK2 + 2,54,107},{12,HALBERDATTACK2 + 1,105,87},
506       { 1,0,80,41 },{1,0,107,52},{1,0,147,76}
507     }
508 };
509 
510 // fist
511 // bracers
512 // hammer
513 // sword
514 // bow
515 // axe
516 // morning star
517 // bfg item
518 
519 
playerdead(Player * plr)520 void playerdead(Player* plr)
521 {
522     int i;
523     int spellbookpage;
524     int exit = 0;
525 
526     int32_t clockgoal = (int)totalclock + 240;
527 
528     plr->playerdie = true;
529     currspikeframe = 0;
530 
531     if (plr->spiked)
532     {
533         spiketics = spikeanimtics[0].daweapontics;
534 
535         playsound_loc(S_GORE1, plr->x, plr->y);
536         SND_Sound(S_HEARTBEAT);
537     }
538 
539     SND_PlaySound(S_PLRDIE1, 0, 0, 0, 0);
540 
541     netsendmove();
542 
543     while ((int)totalclock < clockgoal)
544     {
545         handleevents();
546 
547         if (plr->horiz < 100 + (YDIM >> 1))
548         {
549             plr->horiz += (synctics << 1);
550         }
551 
552         drawscreen(plr);
553         animateobjs(plr);
554         animatetags(plr);
555         doanimations(synctics);
556         dodelayitems(synctics);
557 
558         videoNextPage();
559     }
560 
561     int32_t goaltime = (int)totalclock + 240;
562 
563     while (!exit)
564     {
565         handleevents();
566 
567         if ((int)totalclock > goaltime)
568             exit = 1;
569 
570         if (keystatus[sc_Space] > 0)
571             exit = 1;
572     }
573 
574     SND_CheckLoops();
575 
576     keystatus[sc_Space] = 0;
577 
578     plr->vampiretime = 0;
579     plr->shieldpoints = 0;
580     plr->playerdie = false;
581     plr->spiked = false;
582     plr->shockme = -1;
583     plr->poisoned = 0;
584     plr->poisontime = 0;
585     currspikeframe = 0;
586     spellbookflip = 0;
587 
588     StatusMessageDisplayTime(0);
589 
590     plr->oldsector = plr->sector;
591     plr->horiz = 100;
592     plr->zoom = 256;
593     plr->dimension = 3;
594     plr->height = PLAYERHEIGHT;
595 
596     if (difficulty > 1)
597     {
598         for (i = 0; i <= 9; i++)
599         {
600             plr->ammo[i] = 0;
601             plr->weapon[i] = 0;
602             if (i < 9)
603             {
604                 plr->orb[i] = 0;
605                 plr->orbammo[i] = 0;
606             }
607         }
608     }
609     else
610     {
611         for (i = 0; i <= 9; i++)
612         {
613             if (i < 5)
614             {
615                 plr->ammo[i] = 40;
616                 plr->weapon[i] = 1;
617             }
618             if (i < 9)
619             {
620                 plr->orb[i] = 0;
621                 plr->orbammo[i] = 0;
622             }
623         }
624     }
625 
626     if (difficulty > 1)
627     {
628         plr->weapon[0] = plr->weapon[1] = 1;
629         plr->ammo[0] = 32000;
630         plr->ammo[1] = 45;
631     }
632 
633     for (i = 0; i < MAXPOTIONS; i++)
634         plr->potion[i] = 0;
635 
636     for (i = 0; i < MAXTREASURES; i++)
637         plr->treasure[i] = 0;
638 
639     plr->hasshot = false;
640     plr->orbshot = false;
641     oldmousestatus = 0;
642 
643     plr->lvl = 1;
644     plr->score = 0;
645     plr->health = 100;
646     plr->maxhealth = 100;
647     plr->armor = 0;
648     plr->armortype = 0;
649     plr->currentorb = 0;
650     plr->currentpotion = 0;
651 
652     for (i = 0; i < MAXNUMORBS; i++)
653         plr->orbactive[i] = -1;
654 
655     lockclock = (int)totalclock;
656 
657     if (difficulty > 1)
658         plr->currweapon = plr->selectedgun = 1;
659     else
660         plr->currweapon = plr->selectedgun = 4;
661 
662     plr->currweaponfired = 3;
663     plr->currweaponflip = false;
664     plr->currweaponanim = 0;
665 
666     plr->helmettime = -1;
667 
668     if (svga == 0)
669     {
670         if (plr->screensize <= 320)
671         {
672             spellbookpage = spellbookanim[plr->currentorb][8].daweaponframe;
673             overwritesprite(121, 161, spellbookpage, 0, 0, 0);
674         }
675     }
676     if (svga == 1)
677     {
678         if (plr->screensize == 320)
679         {
680             spellbookpage = sspellbookanim[plr->currentorb][8].daweaponframe;
681             overwritesprite(121 << 1, 389, spellbookpage, 0, 0, 0);
682         }
683     }
684 
685     justteleported = 1;
686 
687     if (netgame == 0)
688     {
689         loadnewlevel(mapon);
690     }
691     else
692     {
693         netrestartplayer(plr);
694     }
695 
696     StatusMessageDisplayTime(-1);
697     plr->shadowtime = -1;
698     plr->helmettime = -1;
699     plr->nightglowtime = -1;
700     plr->strongtime = -1;
701     plr->invisibletime = -1;
702     plr->svgahealth = -1;
703 
704 //    updatepics();
705 }
706 
spikeheart(Player * plr)707 void spikeheart(Player* plr)
708 {
709     char dabits = 0x02;
710     char dashade = sector[plr->sector].ceilingshade;
711     int  dax, day;
712 
713     spiketics -= synctics;
714 
715     if (spiketics < 0)
716     {
717         currspikeframe++;
718 
719         if (currspikeframe > 4)
720             currspikeframe = 4;
721 
722         spiketics = spikeanimtics[currspikeframe].daweapontics;
723         spikeframe = spikeanimtics[currspikeframe].daweaponframe;
724     }
725     else
726         currweaponframe = spikeanimtics[currspikeframe].daweaponframe;
727 
728     dax = spikeanimtics[currspikeframe].currx;
729     day = spikeanimtics[currspikeframe].curry;
730 
731     overwritesprite(dax, day, spikeframe, dashade, dabits, 0);
732     startredflash(10);
733 }
734 
updateloadedplayer(int i)735 void updateloadedplayer(int i)
736 {
737     Player* plr = &player[pyrn];
738 
739     plr->playerdie = false;
740     plr->spiked = false;
741 
742     plr->oldsector = plr->sector;
743     plr->horiz = 100;
744     plr->zoom = 256;
745     plr->dimension = 3;
746     plr->height = PLAYERHEIGHT;
747     plr->spritenum = i;
748 
749     sprite[plr->spritenum].x = plr->x;
750     sprite[plr->spritenum].y = plr->y;
751     sprite[plr->spritenum].z = plr->z + (plr->height << 8);
752     sprite[plr->spritenum].cstat = 1;
753     sprite[plr->spritenum].picnum = FRED;
754     sprite[plr->spritenum].shade = 0;
755     sprite[plr->spritenum].xrepeat = 36;
756     sprite[plr->spritenum].yrepeat = 36;
757     sprite[plr->spritenum].ang = plr->ang;
758     sprite[plr->spritenum].xvel = 0;
759     sprite[plr->spritenum].yvel = 0;
760     sprite[plr->spritenum].zvel = 0;
761     sprite[plr->spritenum].owner = 4096;
762     sprite[plr->spritenum].lotag = 0;
763     sprite[plr->spritenum].hitag = 0;
764     sprite[plr->spritenum].pal = 1;
765     sprite[plr->spritenum].sectnum = plr->sector;
766 
767     vec3_t pos;
768     pos.x = sprite[i].x;
769     pos.y = sprite[i].y;
770     pos.z = sprite[i].z;
771 
772     setsprite(i, &pos);
773 }
774 
initplayersprite()775 void initplayersprite()
776 {
777     int i;
778     int spellbookpage;
779 
780     Player* plr = &player[pyrn];
781 
782     plr->vampiretime = 0;
783     plr->shieldpoints = 0;
784     plr->playerdie = false;
785     plr->spiked = false;
786     plr->shockme = -1;
787     plr->poisoned = 0;
788     plr->poisontime = -1;
789 
790     if (mapflag == 0)
791         mapon = 1;
792 
793     plr->oldsector = plr->sector;
794     plr->horiz = 100;
795     plr->zoom = 256;
796     plr->dimension = 3;
797     plr->height = PLAYERHEIGHT;
798     plr->z = sector[plr->sector].floorz - (plr->height << 8);
799 
800     plr->spritenum = insertsprite(plr->sector, 0);
801 
802     plr->onsomething = 1;
803 
804     sprite[plr->spritenum].x = plr->x;
805     sprite[plr->spritenum].y = plr->y;
806     sprite[plr->spritenum].z = plr->z + (plr->height << 8);
807     sprite[plr->spritenum].cstat = 1 + 256;
808     sprite[plr->spritenum].picnum = FRED;
809     sprite[plr->spritenum].shade = 0;
810     sprite[plr->spritenum].xrepeat = 36;
811     sprite[plr->spritenum].yrepeat = 36;
812     sprite[plr->spritenum].ang = plr->ang;
813     sprite[plr->spritenum].xvel = 0;
814     sprite[plr->spritenum].yvel = 0;
815     sprite[plr->spritenum].zvel = 0;
816     sprite[plr->spritenum].owner = 4096;
817     sprite[plr->spritenum].lotag = 0;
818     sprite[plr->spritenum].hitag = 0;
819     sprite[plr->spritenum].pal = 1;
820 
821     if (loadedgame == 0)
822     {
823         plr->selectedgun = 0;
824 
825         if (difficulty > 1)
826         {
827             for (i = 0; i <= 9; i++)
828             {
829                 plr->ammo[i] = 0;
830                 plr->weapon[i] = 0;
831                 if (i < 9)
832                 {
833                     plr->orb[i] = 0;
834                     plr->orbammo[i] = 0;
835                 }
836             }
837         }
838         else
839         {
840             for (i = 0; i <= 9; i++)
841             {
842                 if (i < 5)
843                 {
844                     plr->ammo[i] = 40;
845                     plr->weapon[i] = 1;
846                 }
847                 if (i < 9)
848                 {
849                     plr->orb[i] = 0;
850                     plr->orbammo[i] = 0;
851                 }
852             }
853         }
854 
855         if (difficulty > 1)
856         {
857             plr->weapon[0] = plr->weapon[1] = 1;
858             plr->ammo[0] = 32000;
859             plr->ammo[1] = 45;
860         }
861 
862         for (i = 0; i < MAXPOTIONS; i++)
863             plr->potion[i] = 0;
864 
865         for (i = 0; i < MAXTREASURES; i++)
866             plr->treasure[i] = 0;
867 
868         plr->lvl = 1;
869         plr->score = 0;
870         plr->health = 100;
871         plr->maxhealth = 100;
872         plr->armor = 0;
873         plr->armortype = 0;
874         plr->currentorb = 0;
875         plr->currentpotion = 0;
876 
877         if (difficulty > 1)
878             plr->currweapon = plr->selectedgun = 1;
879         else
880             plr->currweapon = plr->selectedgun = 4;
881 
882         plr->currweaponfired = 3;
883         plr->currweaponflip = false;
884 
885         plr->currweaponanim = 0;
886         plr->currweaponattackstyle = 0;
887 
888         for (i = 0; i < MAXNUMORBS; i++)
889             plr->orbactive[i] = -1;
890 
891         lockclock = (int)totalclock;
892 
893         spellbookflip = 0;
894 
895         if (svga == 0)
896         {
897             if (plr->screensize <= 320)
898             {
899                 spellbookpage = spellbookanim[plr->currentorb][8].daweaponframe;
900                 overwritesprite(121, 161, spellbookpage, 0, 0, 0);
901             }
902         }
903         if (svga == 1)
904         {
905             if (plr->screensize == 320)
906             {
907                 spellbookpage = sspellbookanim[plr->currentorb][8].daweaponframe;
908                 overwritesprite(121 << 1, 389, spellbookpage, 0, 0, 0);
909             }
910         }
911 
912         plr->invincibletime = -1;
913         plr->manatime = -1;
914         plr->hasshot = false;;
915         plr->orbshot = false;
916         oldmousestatus = 0;
917 
918         StatusMessageDisplayTime(-1);
919         plr->shadowtime = -1;
920         plr->helmettime = -1;
921         plr->nightglowtime = -1;
922         plr->strongtime = -1;
923         plr->invisibletime = -1;
924         plr->svgahealth = -1;
925     }
926 
927     //updatepics();
928 }
929 
autoweaponchange(int dagun)930 void autoweaponchange(int dagun)
931 {
932     Player* plr = &player[pyrn];
933 
934     if (plr->currweaponanim > 0)
935         return;
936 
937     if (dagun > plr->selectedgun)
938     {
939         plr->selectedgun = dagun;
940         plr->hasshot = false;
941         plr->currweaponfired = 2; // drop weapon
942 
943         switch (plr->selectedgun)
944         {
945             case 1:
946             weapondropgoal = 100;
947             weapondrop = 0;
948             break;
949             case 2:
950             weapondropgoal = 40;
951             weapondrop = 0;
952             //levelpic();
953             break;
954             case 3:
955             weapondropgoal = 100;
956             weapondrop = 0;
957             //levelpic();
958             break;
959             case 4:
960             weapondropgoal = 40;
961             weapondrop = 0;
962             //levelpic();
963             break;
964             case 5:
965             weapondropgoal = 40;
966             weapondrop = 0;
967             //levelpic();
968             break;
969             case 6:
970             weapondropgoal = 40;
971             weapondrop = 0;
972             //levelpic();
973             break;
974             case 7:
975             weapondropgoal = 40;
976             weapondrop = 0;
977             //levelpic();
978             break;
979             case 8:
980             weapondropgoal = 40;
981             weapondrop = 0;
982             //levelpic();
983             break;
984             case 9:
985             weapondropgoal = 40;
986             weapondrop = 0;
987             //levelpic();
988             break;
989         }
990     }
991 }
992 
weaponchange()993 void weaponchange()
994 {
995     Player* plr = &player[pyrn];
996 
997     if (plr->currweaponanim == 0 && !plr->currweaponflip)
998     {
999         for (int i = sc_1; i <= sc_0; i++)
1000         {
1001             if (keystatus[i] > 0 && plr->weapon[i - sc_1] > 0)
1002             {
1003                 keystatus[i] = 0;
1004 
1005                 plr->selectedgun = i - sc_1;
1006                 plr->hasshot = false;
1007                 plr->currweaponfired = 2; // drop weapon
1008 
1009                 //levelpic();
1010 
1011                 switch (plr->selectedgun)
1012                 {
1013                     case 0:
1014                     case 4:
1015                     case 5:
1016                     case 6:
1017                     case 7:
1018                     case 8:
1019                     case 9:
1020                     weapondropgoal = 40;
1021                     weapondrop = 0;
1022                     break;
1023                     case 1:
1024                     case 2:
1025                     case 3:
1026                     weapondropgoal = 100;
1027                     weapondrop = 0;
1028                     break;
1029                 }
1030             }
1031         }
1032     }
1033 
1034     if (!plr->currweaponflip)
1035     {
1036         for (int i = sc_F1; i <= sc_F8; i++)
1037         {
1038             if (keystatus[i] > 0)
1039             {
1040                 if (plr->selectedgun > 0)
1041                 {
1042                     plr->hasshot = false;
1043                     plr->currweaponfired = 2; // drop weapon
1044                     weapondropgoal = 100;
1045                     weapondrop = 0;
1046                     plr->selectedgun = 0;
1047                     //selectedgun=spellcasthands
1048                     //levelpic();
1049                 }
1050                 plr->currentorb = i - sc_F1;
1051                 if (spellbookflip == 0)
1052                 {
1053                     spellbook = 0;
1054                     spellbooktics = 10;
1055                     spellbookflip = 1;
1056 
1057                     SND_PlaySound(S_PAGE, 0, 0, 0, 0);
1058                     displayspelltext();
1059                     spelltime = 360;
1060                 }
1061                 plr->orbshot = false;
1062             }
1063             keystatus[i] = 0;
1064 //            orbpic(plr->currentorb);
1065         }
1066     }
1067 
1068     for (int i = 0; i < MAXNUMORBS; i++)
1069     {
1070         if (plr->orbactive[i] > -1) {
1071             plr->orbactive[i] -= synctics;
1072         }
1073     }
1074 
1075     if (keystatus[sc_OpenBracket] > 0)
1076     {
1077         plr->currentpotion--;
1078         if (plr->currentpotion < 0)
1079             plr->currentpotion = 4;
1080         keystatus[sc_OpenBracket] = 0;
1081 
1082         SND_PlaySound(S_BOTTLES, 0, 0, 0, 0);
1083         setpotion(plr->currentpotion);
1084         potiontext();
1085     }
1086     if (keystatus[sc_CloseBracket] > 0)
1087     {
1088         plr->currentpotion++;
1089         if (plr->currentpotion > 4) // MAXPOTIONS
1090             plr->currentpotion = 0;
1091         keystatus[sc_CloseBracket] = 0;
1092 
1093         SND_PlaySound(S_BOTTLES, 0, 0, 0, 0);
1094         setpotion(plr->currentpotion);
1095         potiontext();
1096     }
1097 }
1098 
potiontext()1099 void potiontext()
1100 {
1101     Player* plr = &player[pyrn];
1102 
1103     if (plr->potion[plr->currentpotion] > 0)
1104     {
1105         switch (plr->currentpotion)
1106         {
1107             case 0:
1108             StatusMessage(240, "Health Potion");
1109             break;
1110             case 1:
1111             StatusMessage(240, "Strength Potion");
1112             break;
1113             case 2:
1114             StatusMessage(240, "Cure Poison Potion");
1115             break;
1116             case 3:
1117             StatusMessage(240, "Resist Fire Potion");
1118             break;
1119             case 4:
1120             StatusMessage(240, "Invisiblity Potion");
1121             break;
1122         }
1123     }
1124 }
1125 
swingdacrunch()1126 void swingdacrunch()
1127 {
1128     Player* plr = &player[pyrn];
1129 
1130     switch (plr->currweapon)
1131     {
1132         case 0: //fist
1133         case 3: //morningstar
1134         playsound_loc(S_SOCK1 + (rand() % 4), plr->x, plr->y);
1135         break;
1136         case 1: //dagger
1137         if (rand() % 2)
1138             playsound_loc(S_GORE1 + (rand() % 4), plr->x, plr->y);
1139         break;
1140         case 2: //short sword
1141         playsound_loc(S_SWORD2 + (rand() % 3), plr->x, plr->y);
1142         break;
1143         case 4: //broad sword
1144         playsound_loc(S_SWORD1 + (rand() % 3), plr->x, plr->y);
1145         break;
1146         case 5: //battle axe
1147         case 7: //pike
1148         case 9: //halberd
1149         if (rand() % 2)
1150             playsound_loc(S_SOCK1 + (rand() % 4), plr->x, plr->y);
1151         else
1152             playsound_loc(S_SWORD1 + (rand() % 3), plr->x, plr->y);
1153         break;
1154         case 6: //bow
1155         break;
1156 
1157         case 8: //two handed sword
1158         playsound_loc(S_SWORD1 + (rand() % 2), plr->x, plr->y);
1159         break;
1160     }
1161 }
1162 
swingdasound()1163 void swingdasound()
1164 {
1165     Player* plr = &player[pyrn];
1166 
1167     switch (plr->currweapon)
1168     {
1169         case 0: // fist
1170         SND_PlaySound(S_PLRWEAPON0, 0, 0, 0, 0);
1171         break;
1172         case 1:  // knife
1173         SND_PlaySound(S_PLRWEAPON1, 0, 0, 0, 0);
1174         break;
1175         case 2:  // short sword
1176         SND_PlaySound(S_PLRWEAPON4, 0, 0, 0, 0);
1177         break;
1178         case 3:  // mace
1179         SND_PlaySound(S_PLRWEAPON2, 0, 0, 0, 0);
1180         break;
1181         case 4:  //
1182         SND_PlaySound(S_PLRWEAPON4, 0, 0, 0, 0);
1183         break;
1184         case 5:  // sword
1185         SND_PlaySound(S_PLRWEAPON4, 0, 0, 0, 0);
1186         break;
1187         case 6:  // bow
1188         SND_PlaySound(S_PLRWEAPON3, 0, 0, 0, 0);
1189         break;
1190         case 7:  //
1191         SND_PlaySound(S_PLRWEAPON4, 0, 0, 0, 0);
1192         break;
1193         case 8:  //
1194         SND_PlaySound(S_PLRWEAPON4, 0, 0, 0, 0);
1195         break;
1196         case 9:  //
1197         SND_PlaySound(S_PLRWEAPON4, 0, 0, 0, 0);
1198         break;
1199     }
1200 }
1201 
swingdaweapon(Player * plr)1202 void swingdaweapon(Player* plr)
1203 {
1204     short daang = plr->ang;
1205 
1206     if (currweaponframe == BOWWALK + 5 && plr->ammo[6] > 0)
1207     {
1208         plr->currweaponfired = 5;
1209         oldmousestatus = 0; // NEW
1210         plr->currweaponanim = 0;
1211     }
1212     if (currweaponframe == BOWWALK + 5 && plr->ammo[6] <= 0)
1213     {
1214         plr->currweaponfired = 0;
1215         oldmousestatus = 0;
1216         plr->currweaponanim = 0;
1217         return;
1218     }
1219 
1220     if (currweaponframe == PIKEATTACK1 + 4
1221         //|| currweaponframe == PIKEATTACK2+4
1222         && plr->weapon[7] == 2
1223         && plr->ammo[7] > 0)
1224     {
1225         shootgun(plr, daang, 10);
1226         playsound_loc(S_THROWPIKE, plr->x, plr->y);
1227         plr->hasshot = true;
1228         return;
1229     }
1230 
1231     switch (plr->selectedgun)
1232     {
1233         case 0:  // fist  & close combat weapons
1234         shootgun(plr, daang, 0);
1235         plr->hasshot = true;
1236         break;
1237         case 1:  // knife
1238         shootgun(plr, daang, 0);
1239         plr->hasshot = true;
1240         break;
1241         case 2:  // shortsword
1242         shootgun(plr, daang, 0);
1243         plr->hasshot = true;
1244         break;
1245         case 3:  // morningstar
1246         shootgun(plr, daang, 0);
1247         plr->hasshot = true;
1248         break;
1249         case 4:  // sword
1250         shootgun(plr, daang, 0);
1251         plr->hasshot = true;
1252         break;
1253         case 5: //  battleaxe
1254         shootgun(plr, daang, 0);
1255         plr->hasshot = true;
1256         break;
1257         case 6: // bow
1258         shootgun(plr, daang, 1);
1259         plr->hasshot = true;
1260         break;
1261         case 7: // pike
1262         shootgun(plr, daang, 0);
1263         plr->hasshot = true;
1264         break;
1265         case 8: // two handed
1266         shootgun(plr, daang, 0);
1267         plr->hasshot = true;
1268         break;
1269         case 9: // halberd
1270         shootgun(plr, daang, 0);
1271         plr->hasshot = true;
1272         break;
1273     }
1274 }
1275 
1276 int weaponuseless=0;
1277 
plrfireweapon(Player * plr)1278 void plrfireweapon(Player* plr)
1279 {
1280     int i;
1281 
1282     if (plr->currweaponfired == 4)
1283     {
1284         currweapontics = throwanimtics[plr->currentorb][0].daweapontics;
1285         return;
1286     }
1287 
1288     if (plr->ammo[plr->selectedgun] <= 0)
1289     {
1290         if (plr->currweapon == 6)
1291         {
1292             for (i = 0; i < MAXWEAPONS; i++)
1293             {
1294                 if (plr->ammo[i] > 0 && plr->weapon[i] == 1)
1295                 {
1296                     plr->selectedgun = i;
1297                     plr->hasshot = false;
1298                     plr->currweaponfired = 2; // drop weapon
1299                     weapondropgoal = 100;
1300                     weapondrop = 0;
1301                     //levelpic();
1302                 }
1303             }
1304         }
1305         return;
1306     }
1307     else
1308     {
1309         madeahit = 0;
1310         plr->ammo[plr->selectedgun]--;
1311         if (plr->ammo[plr->selectedgun] <= 0 || plr->ammo[plr->selectedgun] == 10)
1312         {
1313             switch (plr->selectedgun)
1314             {
1315                 case 0: //fist
1316                 plr->ammo[0] = 9999;
1317                 break;
1318                 case 1: //knife
1319                 if (plr->ammo[plr->selectedgun] == 10)
1320                 {
1321                     StatusMessage(360, "Dagger is damaged");
1322                 }
1323                 if (plr->ammo[plr->selectedgun] <= 0)
1324                 {
1325                     plr->ammo[1] = 0;
1326                     plr->weapon[1] = 0;
1327                     StatusMessage(360, "Dagger is Useless");
1328                     weaponuseless = 1;
1329                 }
1330                 break;
1331                 case 2: //short sword
1332                 if (plr->ammo[plr->selectedgun] == 10)
1333                 {
1334                     StatusMessage(360, "Short Sword is damaged");
1335                 }
1336                 if (plr->ammo[plr->selectedgun] <= 0)
1337                 {
1338                     plr->ammo[2] = 0;
1339                     plr->weapon[2] = 0;
1340                     StatusMessage(360, "Short Sword is Useless");
1341                     weaponuseless = 1;
1342                 }
1343                 break;
1344                 case 3: //mace
1345                 if (plr->ammo[plr->selectedgun] == 10)
1346                 {
1347                     StatusMessage(360, "Morning Star is damaged");
1348                 }
1349                 if (plr->ammo[plr->selectedgun] <= 0)
1350                 {
1351                     plr->ammo[3] = 0;
1352                     plr->weapon[3] = 0;
1353                     StatusMessage(360, "Morning Star is Useless");
1354                     weaponuseless = 1;
1355                 }
1356                 break;
1357 
1358                 case 4: //sword
1359                 if (plr->ammo[plr->selectedgun] == 10)
1360                 {
1361                     StatusMessage(360, "Sword is damaged");
1362                 }
1363                 if (plr->ammo[plr->selectedgun] <= 0)
1364                 {
1365                     plr->ammo[4] = 0;
1366                     plr->weapon[4] = 0;
1367                     StatusMessage(360, "Sword is Useless");
1368                     weaponuseless = 1;
1369                 }
1370                 break;
1371                 case 5: //battle axe
1372                 if (plr->ammo[plr->selectedgun] == 10)
1373                 {
1374                     StatusMessage(360, "Battle axe is damaged");
1375                 }
1376                 if (plr->ammo[plr->selectedgun] <= 0)
1377                 {
1378                     plr->ammo[5] = 0;
1379                     plr->weapon[5] = 0;
1380                     StatusMessage(360, "Battle axe is Useless");
1381                     weaponuseless = 1;
1382                 }
1383                 break;
1384                 case 6: //bow
1385                 break;
1386                 case 7: //pike
1387                 if (plr->weapon[7] == 1)
1388                 {
1389                     if (plr->ammo[plr->selectedgun] == 10)
1390                     {
1391                         StatusMessage(360, "Pike is damaged");
1392                     }
1393                     if (plr->ammo[plr->selectedgun] <= 0)
1394                     {
1395                         plr->ammo[7] = 0;
1396                         plr->weapon[7] = 0;
1397                         StatusMessage(360, "Pike is Useless");
1398                         weaponuseless = 1;
1399                     }
1400                 }
1401                 if (plr->weapon[7] == 2 && plr->ammo[7] <= 0)
1402                 {
1403                     plr->weapon[7] = 1;
1404                     plr->ammo[7] = 30;
1405                 }
1406                 break;
1407                 case 8: // two handed sword
1408                 if (plr->ammo[plr->selectedgun] == 10)
1409                 {
1410                     StatusMessage(360, "Magic Sword is damaged");
1411                 }
1412                 if (plr->ammo[plr->selectedgun] <= 0)
1413                 {
1414                     plr->ammo[8] = 0;
1415                     plr->weapon[8] = 0;
1416                     StatusMessage(360, "Magic Sword is Useless");
1417                     weaponuseless = 1;
1418                 }
1419                 break;
1420                 case 9: //halberd
1421                 if (plr->ammo[plr->selectedgun] == 10)
1422                 {
1423                     StatusMessage(360, "Halberd is damaged");
1424                 }
1425                 if (plr->ammo[plr->selectedgun] <= 0)
1426                 {
1427                     plr->ammo[9] = 0;
1428                     plr->weapon[9] = 0;
1429                     StatusMessage(360, "Halberd is Useless");
1430                     weaponuseless = 1;
1431                 }
1432                 break;
1433             }
1434         }
1435     }
1436 
1437     if (weaponuseless == 1)
1438     {
1439         for (i = 0; i < MAXWEAPONS; i++)
1440         {
1441             if (plr->weapon[i] > 0 && plr->ammo[i] > 0)
1442             {
1443                 plr->currweapon = plr->selectedgun = i;
1444                 //hasshot=0;
1445                 //currweaponfired=2; // drop weapon
1446                 plr->currweaponfired = 3; // ready weapon
1447                 //weapondropgoal=100;
1448                 //weapondrop=0;
1449                 plr->currweaponflip = false;
1450                 weaponuseless = 0;
1451                 //autoweaponchange(i);
1452                 //levelpic();
1453             }
1454         }
1455     }
1456     else
1457     {
1458         plr->currweaponfired = 1;
1459     }
1460 
1461 //    if (plr->currweapon == 6 || plr->selectedgun == 6)
1462         //levelpic();
1463 
1464  //   if (plr->currweapon == 7 || plr->selectedgun == 7)
1465         //levelpic();
1466 
1467     plr->currweapon = plr->selectedgun;
1468 
1469     // start from the beginning to cycle
1470     //currweaponfired=1;
1471 
1472     plr->currweaponattackstyle = krand() % 2;
1473 
1474     if (plr->weapon[7] == 2 && plr->currweapon == 7)
1475     {
1476         plr->currweaponattackstyle = 0;
1477     }
1478 
1479     if (plr->currweapon == 9)
1480     {
1481         if (krand() % 100 > 80)
1482             plr->currweaponattackstyle = 0;
1483         else
1484             plr->currweaponattackstyle = 1;
1485     }
1486 
1487     if (plr->currweaponanim > 11)
1488     {
1489         currweapontics = weaponanimtics[plr->currweapon][0].daweapontics;
1490     }
1491 }
1492 
activatedaorb(Player * plr)1493 void activatedaorb(Player* plr)
1494 {
1495     if (plr->orbammo[plr->currentorb] <= 0)
1496         return;
1497 
1498     switch (plr->currentorb)
1499     {
1500         case 0: // SCARE
1501            //shadowtime=1200+(plr->lvl*120);
1502         break;
1503         case 1: // NIGHT VISION
1504            //nightglowtime=2400+(plr->lvl*600);
1505         break;
1506         case 2: // FREEZE
1507         plr->orbactive[plr->currentorb] = -1;
1508         break;
1509         case 3: // MAGIC ARROW
1510         plr->orbactive[plr->currentorb] = -1;
1511         break;
1512         case 4: // OPEN DOORS
1513         plr->orbactive[plr->currentorb] = -1;
1514         break;
1515         case 5: // FLY
1516            //plr->orbactive[currentorb]=3600+(plr->lvl*600);
1517         break;
1518         case 6: // FIREBALL
1519         plr->orbactive[plr->currentorb] = -1;
1520         break;
1521         case 7: // NUKE
1522         plr->orbactive[plr->currentorb] = -1;
1523         break;
1524     }
1525 
1526     if (plr->orbammo[plr->currentorb] <= 0)
1527     {
1528         plr->orb[plr->currentorb] = 0;
1529         return;
1530     }
1531     else
1532         plr->orbammo[plr->currentorb]--;
1533 
1534     plr->currweaponfired = 4;
1535     currweapontics = throwanimtics[plr->currentorb][0].daweapontics;
1536 }
1537 
plruse(Player * plr)1538 void plruse(Player* plr)
1539 {
1540     short daang2, daang;
1541     int32_t daz2;
1542     int32_t hitx, hity, hitz;
1543 
1544     neartag(plr->x, plr->y, plr->z, plr->sector, plr->ang, &neartagsector, &neartagwall, &neartagsprite, &neartaghitdist, 1024, 3, NULL);
1545 
1546     if (neartagsector >= 0)
1547     {
1548         if (sector[neartagsector].hitag == 0)
1549         {
1550             operatesector(neartagsector);
1551         }
1552         else
1553         {
1554             daang = plr->ang;
1555             daang2 = daang + 2048;
1556             daz2 = (100 - plr->horiz) * 2000;
1557 
1558             vec3_t pos;
1559             pos.x = plr->x;
1560             pos.y = plr->y;
1561             pos.z = plr->z;
1562 
1563             hitdata_t hitinfo;
1564 
1565             hitscan(&pos, plr->sector,   // Start position
1566                 Cos(daang2 + 2048),      // X vector of 3D ang
1567                 Sin(daang2 + 2048),      // Y vector of 3D ang
1568                 daz2,                    // Z vector of 3D ang
1569                 &hitinfo, CLIPMASK1); // CHECKME - is CLIPMASK1 correct for version of this function that hadn't got cliptype param?
1570 
1571             hitx = hitinfo.pos.x;
1572             hity = hitinfo.pos.y;
1573             hitz = hitinfo.pos.z;
1574 
1575             if (hitinfo.wall >= 0)
1576             {
1577                 if ((labs(plr->x - hitx) + labs(plr->y - hity) < 512) && (labs((plr->z >> 8) - ((hitz >> 8) - (64))) <= (512 >> 3)))
1578                 {
1579                     switch (wall[hitinfo.wall].picnum)
1580                     {
1581                         case PENTADOOR1:
1582                         case PENTADOOR2:
1583                         case PENTADOOR3:
1584                         case PENTADOOR4:
1585                         case PENTADOOR5:
1586                         case PENTADOOR6:
1587                         case PENTADOOR7:
1588                         StatusMessage(360, "find door trigger");
1589                         break;
1590                     }
1591                 }
1592             }
1593             playsound_loc(S_PUSH1 + (rand() % 2), plr->x, plr->y);
1594         }
1595     }
1596 
1597     if (neartagsprite >= 0)
1598     {
1599         if (sprite[neartagsprite].lotag == 1)
1600         {
1601             switch (sprite[neartagsprite].picnum)
1602             {
1603                 case PULLCHAIN1:
1604                 sprite[neartagsprite].lotag = 0;
1605                 newstatus(neartagsprite, PULLTHECHAIN);
1606                 break;
1607                 case LEVERUP:
1608                 sprite[neartagsprite].lotag = 0;
1609                 newstatus(neartagsprite, ANIMLEVERUP);
1610                 break;
1611             }
1612             for (int i = 0; i < numsectors; i++)
1613             {
1614                 if (sector[i].hitag == sprite[neartagsprite].hitag)
1615                 {
1616                     operatesector(i);
1617                 }
1618             }
1619         }
1620         else
1621         {
1622             operatesprite(neartagsprite);
1623         }
1624     }
1625 }
1626 
loadnewlevel(int mapon)1627 void loadnewlevel(int mapon)
1628 {
1629     char mapbuf[BMAX_PATH];
1630 
1631     Player* plr = &player[pyrn];
1632 
1633     sprintf(mapbuf, "level%d.map", mapon);
1634 
1635     SND_SongFlush();
1636     SND_StartMusic(mapon - 1);
1637 
1638     #ifdef WHDEMO
1639     if (mapon > 3)
1640     {
1641         victory();
1642     }
1643     #endif
1644 
1645     setupboard(mapbuf);
1646 }
1647 
victory()1648 void victory()
1649 {
1650     int exit;
1651 
1652     int32_t goaltime = (int)totalclock + 360;
1653     victor = 1;
1654 
1655     if (svga == 1)
1656     {
1657         SND_Sound(S_PICKUPFLAG);
1658         permanentwritesprite(0, 0, SVGAVICTORYA1, 0, 0, 0, 639, 239, 0);
1659         permanentwritesprite(0, 240, SVGAVICTORYA2, 0, 0, 240, 639, 479, 0);
1660 
1661         videoNextPage();
1662 
1663         exit = 0;
1664 
1665         while (!exit)
1666         {
1667             if (keystatus[sc_Space] > 0 || keystatus[sc_Escape] > 0)
1668                 exit = 1;
1669         }
1670         keystatus[sc_Space] = 0;
1671         keystatus[sc_Escape] = 0;
1672 
1673         videoNextPage();
1674 
1675         exit = 0;
1676         while (!exit)
1677         {
1678             if (keystatus[sc_Space] > 0 || keystatus[sc_Escape] > 0)
1679                 exit = 1;
1680         }
1681         keystatus[sc_Space] = 0;
1682         keystatus[sc_Escape] = 0;
1683 
1684         SND_Sound(S_DROPFLAG);
1685         permanentwritesprite(0, 0, SVGAVICTORYB1, 0, 0, 0, 639, 239, 0);
1686         permanentwritesprite(0, 240, SVGAVICTORYB2, 0, 0, 240, 639, 479, 0);
1687 
1688         videoNextPage();
1689 
1690         exit = 0;
1691         while (!exit)
1692         {
1693             if (keystatus[sc_Space] > 0 || keystatus[sc_Escape] > 0)
1694                 exit = 1;
1695         }
1696         keystatus[sc_Space] = 0;
1697         keystatus[sc_Escape] = 0;
1698 
1699         SND_Sound(S_WISP2);
1700         permanentwritesprite(0, 0, SVGAVICTORYC1, 0, 0, 0, 639, 239, 0);
1701         permanentwritesprite(0, 240, SVGAVICTORYC2, 0, 0, 240, 639, 479, 0);
1702 
1703         videoNextPage();
1704 
1705         exit = 0;
1706         while (!exit)
1707         {
1708             if (keystatus[sc_Space] > 0 || keystatus[sc_Escape] > 0)
1709                 exit = 1;
1710         }
1711         keystatus[sc_Space] = 0;
1712         keystatus[sc_Escape] = 0;
1713 
1714     }
1715     else
1716     {
1717         keystatus[sc_Space] = 0;
1718         keystatus[sc_Escape] = 0;
1719         SND_Sound(S_PICKUPFLAG);
1720         exit = 0;
1721         while (!exit)
1722         {
1723             if (keystatus[sc_Space] > 0 || keystatus[sc_Escape] > 0)
1724                 exit = 1;
1725             overwritesprite(0, 0, VICTORYA, 0, 0, 0);
1726             videoNextPage();
1727         }
1728         keystatus[sc_Space] = 0;
1729         keystatus[sc_Escape] = 0;
1730         SND_Sound(S_DROPFLAG);
1731 
1732         exit = 0;
1733 
1734         while (!exit)
1735         {
1736             if (keystatus[sc_Space] > 0 || keystatus[sc_Escape] > 0)
1737                 exit = 1;
1738             overwritesprite(0, 0, VICTORYB, 0, 0, 0);
1739             videoNextPage();
1740         }
1741         keystatus[sc_Space] = 0;
1742         keystatus[sc_Escape] = 0;
1743 
1744         SND_Sound(S_WISP2);
1745 
1746         exit = 0;
1747 
1748         while (!exit)
1749         {
1750             if (keystatus[sc_Space] > 0 || keystatus[sc_Escape] > 0)
1751                 exit = 1;
1752             overwritesprite(0, 0, VICTORYC, 0, 0, 0);
1753             videoNextPage();
1754         }
1755         keystatus[sc_Space] = 0;
1756         keystatus[sc_Escape] = 0;
1757         exit = 0;
1758 
1759     }
1760     shutdown();
1761 }
1762 
drawweapons(Player * plr)1763 void drawweapons(Player* plr)
1764 {
1765     int dax, day;
1766     int32_t snakex = 0;
1767     int32_t snakey = 0;
1768     char dabits;
1769     char dashade;
1770     char dapalnum;
1771 
1772     if (spelltime > 0)
1773         spelltime -= synctics;
1774 
1775     if (spellbook == 8 && spelltime > 0 && plr->screensize > 320)
1776     {
1777         if (svga == 1)
1778         {
1779             spellbookframe = sspellbookanim[plr->currentorb][8].daweaponframe;
1780             dax = sspellbookanim[plr->currentorb][8].currx;
1781             day = sspellbookanim[plr->currentorb][8].curry;
1782         }
1783         else
1784         {
1785             spellbookframe = spellbookanim[plr->currentorb][8].daweaponframe;
1786             dax = spellbookanim[plr->currentorb][8].currx;
1787             day = spellbookanim[plr->currentorb][8].curry;
1788         }
1789         if (svga == 1)
1790         {
1791             overwritesprite(dax << 1, day, spellbookframe, 0, 0, 0);
1792             sprintf(tempbuf, "%d", plr->orbammo[plr->currentorb]);
1793             fancyfont(126 << 1, 439, SSCOREFONT - 26, tempbuf, 0);
1794         }
1795         else
1796         {
1797             itemtoscreen(dax, day, spellbookframe, 0, 0);
1798             //overwritesprite(dax, day, spellbookframe, 0, 0, 0);
1799             sprintf(tempbuf, "%d", plr->orbammo[plr->currentorb]);
1800             fancyfont(126, 181, SCOREFONT - 26, tempbuf, 0);
1801         }
1802     }
1803 
1804     if (plr->shadowtime > 0)
1805         dashade = 31, dapalnum = 0;
1806     else
1807         dashade = sector[plr->sector].ceilingshade, dapalnum = 0;
1808 
1809     if (plr->invisibletime > 0)
1810         dabits = 0x06;
1811     else
1812         dabits = 0x02;
1813 
1814     if (plr->currweaponflip)
1815         dabits += 0x08;
1816 
1817     if ((plr->currweapon == 0) && (dahand == 0))
1818         if (rand() % 2 == 0)
1819             dahand = 1;
1820         else
1821             dahand = 2;
1822 
1823     switch (plr->currweaponfired)
1824     {
1825         case 6:
1826         switch (plr->currweapon)
1827         {
1828             case 1: // knife
1829             if (currweaponframe == KNIFEATTACK2 + 1)
1830                 if ((plr->currweaponanim == 2 || plr->currweaponanim == 10) && currweapontics == 8)
1831                     swingdasound();
1832             break;
1833             case 3: // morning
1834             if (currweaponframe == MORNINGATTACK2 + 3)
1835                 if (plr->currweaponanim == 3 && currweapontics == 12)
1836                     swingdasound();
1837             break;
1838         }
1839         if (currweaponframe == RFIST + 5
1840             || currweaponframe == KNIFEATTACK + 6
1841             || currweaponframe == MORNINGSTAR + 5
1842             || currweaponframe == SWORDATTACK + 7
1843             || currweaponframe == BOWWALK + 5
1844             || currweaponframe == KNIFEATTACK2 + 2
1845             || currweaponframe == SWORDATTACK2 + 6
1846             || currweaponframe == MORNINGATTACK2 + 3
1847             || currweaponframe == HALBERDATTACK1 + 3
1848             || currweaponframe == HALBERDATTACK2 + 3
1849             || currweaponframe == BIGAXEATTACK + 7
1850             || currweaponframe == BIGAXEATTACK2 + 6
1851             || currweaponframe == PIKEATTACK1 + 4
1852             || currweaponframe == PIKEATTACK2 + 4
1853             || currweaponframe == EXCALATTACK1 + 7
1854             || currweaponframe == EXCALATTACK2 + 5
1855             || currweaponframe == GOBSWORDATTACK2 + 4
1856             || currweaponframe == GOBSWORDATTACK + 4)
1857             swingdaweapon(plr);
1858 
1859         currweapontics -= synctics;
1860 
1861         if (plr->helmettime > 0)
1862             currweapontics--;
1863 
1864         if (currweapontics < 0)
1865         {
1866             plr->currweaponanim++;
1867 
1868             if (plr->currweaponanim > 11)
1869             {
1870                 plr->currweaponanim = 0;
1871                 plr->currweaponfired = 0;
1872                 plr->currweaponflip = false;
1873                 plr->currweapon = plr->selectedgun;
1874                 oldmousestatus = 0;
1875 
1876                 if (dahand > 0)
1877                     dahand = 0;
1878             }
1879 
1880             currweapontics = lefthandanimtics[plr->currweapon][plr->currweaponanim].daweapontics;
1881             currweaponframe = lefthandanimtics[plr->currweapon][plr->currweaponanim].daweaponframe;
1882             dax = lefthandanimtics[plr->currweapon][plr->currweaponanim].currx;
1883             day = lefthandanimtics[plr->currweapon][plr->currweaponanim].curry + 8;
1884         }
1885 
1886         else
1887         {
1888             currweaponframe = lefthandanimtics[plr->currweapon][plr->currweaponanim].daweaponframe;
1889             dax = lefthandanimtics[plr->currweapon][plr->currweaponanim].currx;
1890             day = lefthandanimtics[plr->currweapon][plr->currweaponanim].curry + 8;
1891         }
1892         if (plr->currweapon == 0 && currweaponframe != NULL)
1893         {
1894             if (dahand == 1)
1895                 overwritesprite(dax, day, currweaponframe, dashade, dabits, dapalnum);
1896             else if (dahand == 2)
1897             {
1898                 dax = lefthandanimtics[0][plr->currweaponanim].currx;
1899                 day = lefthandanimtics[0][plr->currweaponanim].curry + 8;
1900                 overwritesprite(dax, day + 5, currweaponframe + 6, dashade, dabits, dapalnum);
1901             }
1902         }
1903         else
1904         {
1905             if (currweaponframe != 0)
1906             {
1907                 dax = lefthandanimtics[plr->currweapon][plr->currweaponanim].currx;
1908                 overwritesprite(dax, day, currweaponframe, dashade, dabits, dapalnum);
1909             }
1910         }
1911 
1912         if (plr->currweapon == 0 && currweaponframe == 0)
1913         {
1914             dahand = 0;
1915             oldmousestatus = 0;
1916             plr->currweaponanim = 0;
1917             plr->currweaponfired = 0;
1918         }
1919 
1920         if (plr->selectedgun == 4 && currweaponframe == 0)
1921         {
1922             plr->currweaponanim = 0;
1923             plr->currweaponfired = 0;
1924             plr->currweaponflip = false;
1925             plr->currweapon = plr->selectedgun;
1926             oldmousestatus = 0;
1927         }
1928 
1929         break;
1930         case 1: // fire
1931         switch (plr->currweapon)
1932         {
1933             case 0: // fist
1934             if (currweaponframe == RFIST + 5)
1935                 if (plr->currweaponanim == 5 && currweapontics == 10)
1936                     swingdasound();
1937             break;
1938             case 1: // knife
1939             if (currweaponframe == KNIFEATTACK + 6)
1940                 if (plr->currweaponanim == 8 && currweapontics == 8)
1941                     swingdasound();
1942             if (currweaponframe == KNIFEATTACK2 + 2)
1943                 if ((plr->currweaponanim == 5 || plr->currweaponanim == 9) && currweapontics == 8)
1944                     swingdasound();
1945             break;
1946             case 2: // shortsword
1947             if (currweaponframe == GOBSWORDATTACK + 4)
1948                 if (plr->currweaponanim == 4 && currweapontics == 10)
1949                     swingdasound();
1950             if (currweaponframe == GOBSWORDATTACK2 + 4)
1951                 if (plr->currweaponanim == 4 && currweapontics == 10)
1952                     swingdasound();
1953             break;
1954             case 3: // morning
1955             if (currweaponframe == MORNINGSTAR + 5)
1956                 if (plr->currweaponanim == 7 && currweapontics == 12)
1957                     swingdasound();
1958             if (currweaponframe == MORNINGATTACK2 + 3)
1959                 if (plr->currweaponanim == 3 && currweapontics == 12)
1960                     swingdasound();
1961             break;
1962             case 4: // sword
1963             if (currweaponframe == SWORDATTACK + 7)
1964                 if (plr->currweaponanim == 7 && currweapontics == 8)
1965                     swingdasound();
1966             if (currweaponframe == SWORDATTACK2 + 6)
1967                 if (plr->currweaponanim == 6 && currweapontics == 8)
1968                     swingdasound();
1969             break;
1970             case 5: // battleaxe
1971             if (currweaponframe == BIGAXEATTACK + 7)
1972                 if (plr->currweaponanim == 7 && currweapontics == 12)
1973                     swingdasound();
1974             if (currweaponframe == BIGAXEATTACK2 + 6)
1975                 if (plr->currweaponanim == 6 && currweapontics == 12)
1976                     swingdasound();
1977             break;
1978             case 6: //bow
1979             if (currweaponframe == BOWWALK + 4)
1980                 if (plr->currweaponanim == 4 && currweapontics == 6)
1981                     swingdasound();
1982             break;
1983             case 7: // pike
1984             if (currweaponframe == PIKEATTACK1 + 4)
1985                 if (plr->currweaponanim == 8 && currweapontics == 10)
1986                     swingdasound();
1987             if (currweaponframe == PIKEATTACK2 + 4)
1988                 if (plr->currweaponanim == 4 && currweapontics == 10)
1989                     swingdasound();
1990             break;
1991             case 8: // two handed sword
1992             if (currweaponframe == EXCALATTACK1 + 7)
1993                 if (plr->currweaponanim == 7 && currweapontics == 8)
1994                     swingdasound();
1995             if (currweaponframe == EXCALATTACK2 + 5)
1996                 if (plr->currweaponanim == 5 && currweapontics == 8)
1997                     swingdasound();
1998             break;
1999             case 9: // halberd
2000             if (currweaponframe == HALBERDATTACK1 + 3)
2001                 if (plr->currweaponanim == 7 && currweapontics == 12)
2002                     swingdasound();
2003             if (currweaponframe == HALBERDATTACK2 + 3)
2004                 if (plr->currweaponanim == 4 && currweapontics == 12)
2005                     swingdasound();
2006             break;
2007         }
2008 
2009         if (currweaponframe == RFIST + 5
2010             || currweaponframe == KNIFEATTACK + 6
2011             || currweaponframe == MORNINGSTAR + 5
2012             || currweaponframe == SWORDATTACK + 7
2013             || currweaponframe == BOWWALK + 5
2014             || currweaponframe == KNIFEATTACK2 + 2
2015             || currweaponframe == SWORDATTACK2 + 6
2016             || currweaponframe == MORNINGATTACK2 + 3
2017             || currweaponframe == HALBERDATTACK1 + 3
2018             || currweaponframe == HALBERDATTACK2 + 3
2019             || currweaponframe == BIGAXEATTACK + 7
2020             || currweaponframe == BIGAXEATTACK2 + 6
2021             || currweaponframe == PIKEATTACK1 + 4
2022             || currweaponframe == PIKEATTACK2 + 4
2023             || currweaponframe == EXCALATTACK1 + 7
2024             || currweaponframe == EXCALATTACK2 + 5
2025             || currweaponframe == GOBSWORDATTACK2 + 4
2026             || currweaponframe == GOBSWORDATTACK + 4)
2027         {
2028             swingdaweapon(plr);
2029         }
2030 
2031         currweapontics -= synctics;
2032         if (plr->helmettime > 0)
2033             currweapontics--;
2034 
2035         if ((currweaponframe == SWORDATTACK + 7
2036             || currweaponframe == SWORDATTACK2 + 7)
2037             && currweapontics < 0 && plr->shieldpoints <= 0)
2038         {
2039             if (krand() % 2 == 0)
2040             {
2041                 /*
2042                 if( plr->lvl <= 3 ) {
2043                     if( krand()%2 == 0 )
2044                         currweapon=3;
2045                     else
2046                         currweapon=4;
2047                     currweapontics=6;
2048                     currweaponanim=0;
2049                     currweaponfired=6;
2050                     currweaponflip=1;
2051                 }
2052                 else*/
2053                 if (plr->lvl == 4 && plr->ammo[1] > 0)
2054                 {
2055                     plr->currweapon = 1;
2056                     currweapontics = 6;
2057                     plr->currweaponanim = 0;
2058                     plr->currweaponfired = 6;
2059                     plr->currweaponflip = true;
2060                 }
2061                 else if (plr->lvl >= 5 && plr->ammo[3] > 0)
2062                 {
2063                     plr->currweapon = 3;
2064                     currweapontics = 6;
2065                     plr->currweaponanim = 0;
2066                     plr->currweaponfired = 6;
2067                     plr->currweaponflip = true;
2068                 }
2069             }
2070             /*
2071             else {
2072             //else if( krand()%100 > 50) {
2073                     if( krand()%2 == 0 )
2074                         currweapon=3;
2075                     else
2076                         currweapon=4;
2077                     currweapontics=6;
2078                     currweaponanim=0;
2079                     currweaponfired=6;
2080                     currweaponflip=1;
2081             }
2082             */
2083         }
2084         if (currweapontics < 0)
2085         {
2086             plr->currweaponanim++;
2087             if (plr->currweaponanim > 11)
2088             {
2089                 //impact=0;
2090                 plr->currweaponanim = 0;
2091                 plr->currweaponfired = 0;
2092                 oldmousestatus = 0; // NEW
2093                 if (dahand > 0)
2094                     dahand = 0;
2095             }
2096             if (plr->currweaponattackstyle == 0)
2097             {
2098                 currweapontics = weaponanimtics[plr->currweapon][plr->currweaponanim].daweapontics;
2099                 currweaponframe = weaponanimtics[plr->currweapon][plr->currweaponanim].daweaponframe;
2100                 dax = weaponanimtics[plr->currweapon][plr->currweaponanim].currx + 8;
2101                 day = weaponanimtics[plr->currweapon][plr->currweaponanim].curry + 4;
2102             }
2103             else
2104             {
2105                 currweapontics = weaponanimtics2[plr->currweapon][plr->currweaponanim].daweapontics;
2106                 currweaponframe = weaponanimtics2[plr->currweapon][plr->currweaponanim].daweaponframe;
2107                 dax = weaponanimtics2[plr->currweapon][plr->currweaponanim].currx + 8;
2108                 day = weaponanimtics2[plr->currweapon][plr->currweaponanim].curry + 4;
2109             }
2110         }
2111         else
2112         {
2113             if (plr->currweaponattackstyle == 0)
2114             {
2115                 //flip
2116                 currweaponframe = weaponanimtics[plr->currweapon][plr->currweaponanim].daweaponframe;
2117                 dax = weaponanimtics[plr->currweapon][plr->currweaponanim].currx;
2118                 day = weaponanimtics[plr->currweapon][plr->currweaponanim].curry + 4;
2119             }
2120             else
2121             {
2122                 //flip
2123                 currweaponframe = weaponanimtics2[plr->currweapon][plr->currweaponanim].daweaponframe;
2124                 dax = weaponanimtics2[plr->currweapon][plr->currweaponanim].currx;
2125                 day = weaponanimtics2[plr->currweapon][plr->currweaponanim].curry + 4;
2126             }
2127         }
2128         if (plr->currweapon == 0 && currweaponframe != 0)
2129         {
2130             if (dahand == 1)
2131                 overwritesprite(dax, day, currweaponframe, dashade, dabits, dapalnum);
2132             else if (dahand == 2)
2133             {
2134                 dax = lefthandanimtics[0][plr->currweaponanim].currx;
2135                 day = lefthandanimtics[0][plr->currweaponanim].curry + 8;
2136                 overwritesprite(dax, day + 5, currweaponframe + 6, dashade, dabits, dapalnum);
2137             }
2138         }
2139         else
2140         {
2141             if (currweaponframe != 0)
2142             {
2143                 if (plr->currweaponattackstyle == 0)
2144                     //flip
2145                     dax = weaponanimtics[plr->currweapon][plr->currweaponanim].currx;
2146                 else
2147                     //flip
2148                     dax = weaponanimtics2[plr->currweapon][plr->currweaponanim].currx;
2149 
2150                 overwritesprite(dax, day, currweaponframe, dashade, dabits, dapalnum);
2151             }
2152         }
2153 
2154         if (plr->currweapon == 0 && currweaponframe == 0)
2155         {
2156             dahand = 0;
2157             oldmousestatus = 0; // NEW
2158             plr->currweaponanim = 0;
2159             plr->currweaponfired = 0;
2160         }
2161         break;
2162 
2163         case 0: //walking
2164 
2165         currweapontics = weaponanimtics[plr->currweapon][0].daweapontics;
2166 
2167         if (plr->currweapon == 6 && plr->ammo[6] <= 0)
2168             currweaponframe = BOWREADYEND;
2169         else
2170             currweaponframe = weaponanimtics[plr->currweapon][0].daweaponframe;
2171 
2172         if (vel != 0)
2173         {
2174             snakex = Sin(lockclock << 4) >> 12;
2175             snakey = Sin((int)totalclock << 4) >> 12;
2176 
2177             if (plr->screensize <= 320)
2178             {
2179                 if (currweaponframe == BOWREADYEND)
2180                 {
2181                     day = readyanimtics[plr->currweapon][6].curry + snakey + 16;
2182                     dax = readyanimtics[plr->currweapon][6].currx + snakex + 16;
2183                 }
2184                 else
2185                 {
2186                     day = weaponanimtics[plr->currweapon][0].curry + snakey + 16;
2187                     dax = weaponanimtics[plr->currweapon][0].currx + snakex + 16;
2188                 }
2189             }
2190             else
2191             {
2192                 if (currweaponframe == BOWREADYEND)
2193                 {
2194                     day = readyanimtics[plr->currweapon][6].curry + snakey + 8;
2195                     dax = readyanimtics[plr->currweapon][6].currx + snakex + 8;
2196                 }
2197                 else
2198                 {
2199                     day = weaponanimtics[plr->currweapon][0].curry + snakey + 8;
2200                     dax = weaponanimtics[plr->currweapon][0].currx + snakex + 8;
2201                 }
2202             }
2203         }
2204         else
2205         {
2206             if (currweaponframe == BOWREADYEND)
2207             {
2208                 day = readyanimtics[plr->currweapon][6].curry + 3;
2209                 dax = readyanimtics[plr->currweapon][6].currx + 3;
2210             }
2211             else
2212             {
2213                 dax = weaponanimtics[plr->currweapon][0].currx + 3;
2214                 day = weaponanimtics[plr->currweapon][0].curry + 3;
2215             }
2216         }
2217         if (plr->currweapon == 0 && currweaponframe != 0)
2218         {
2219             overwritesprite(dax, day, currweaponframe, dashade, dabits, dapalnum);
2220             overwritesprite(0, day + 8, currweaponframe + 6, dashade, dabits, dapalnum);
2221         }
2222         else
2223         {
2224             if (currweaponframe != 0)
2225             {
2226                 overwritesprite(dax + snakex, day, currweaponframe, dashade, dabits, dapalnum);
2227             }
2228         }
2229         break;
2230         case 2: // unready
2231         if (plr->currweapon == 1)
2232             weapondrop += synctics << 1;
2233         else
2234             weapondrop += synctics;
2235         if (weapondrop > weapondropgoal)
2236         {
2237             plr->currweaponfired = 3;
2238             weaponraise = 40;
2239             plr->currweapon = plr->selectedgun;
2240             weaponuseless = 0;
2241             //hasshot=0;//just in case of bugg
2242                         //make hasshot=1;
2243         }
2244 
2245         currweapontics = weaponanimtics[plr->currweapon][0].daweapontics;
2246 
2247         if (plr->currweapon == 6 && plr->ammo[6] <= 0)
2248             currweaponframe = BOWREADYEND;
2249         else
2250             currweaponframe = weaponanimtics[plr->currweapon][0].daweaponframe;
2251 
2252         if (currweaponframe == BOWREADYEND)
2253         {
2254             day = readyanimtics[plr->currweapon][6].curry + (weapondrop);
2255             dax = readyanimtics[plr->currweapon][6].currx;
2256         }
2257         else
2258         {
2259             dax = weaponanimtics[plr->currweapon][0].currx;
2260             day = weaponanimtics[plr->currweapon][0].curry + (weapondrop);
2261         }
2262 
2263         if (plr->currweapon == 0 && currweaponframe != 0)
2264         {
2265             overwritesprite(dax, day, currweaponframe, dashade, dabits, dapalnum);
2266             overwritesprite(0, day, currweaponframe + 6, dashade, dabits, dapalnum);
2267         }
2268 
2269         else
2270         {
2271             if (currweaponframe != 0)
2272             {
2273                 dax = weaponanimtics[plr->currweapon][0].currx;
2274                 overwritesprite(dax, day, currweaponframe, dashade, dabits, dapalnum);
2275             }
2276         }
2277         break;
2278         case 3: // ready
2279         currweapontics -= synctics;
2280         if (currweapontics < 0)
2281         {
2282             plr->currweaponanim++;
2283             if (plr->currweaponanim == 12)
2284             {
2285                 plr->currweaponanim = 0;
2286                 plr->currweaponfired = 0;
2287 
2288                 currweaponframe = readyanimtics[plr->currweapon][11].daweaponframe;
2289                 dax = readyanimtics[plr->currweapon][11].currx;
2290                 day = readyanimtics[plr->currweapon][11].curry + 8;
2291 
2292                 if (plr->currweapon == 0 && currweaponframe != 0)
2293                 {
2294                     overwritesprite(dax, day, currweaponframe, dashade, dabits, dapalnum);
2295                     overwritesprite(0, day, currweaponframe + 6, dashade, dabits, dapalnum);
2296                 }
2297                 else
2298                 {
2299                     if (currweaponframe != 0)
2300                     {
2301                         overwritesprite(dax, day, currweaponframe, dashade, dabits, dapalnum);
2302                     }
2303                 }
2304                 break;
2305                 if (dahand > 0)
2306                     dahand = 0;
2307             }
2308             currweapontics = readyanimtics[plr->currweapon][plr->currweaponanim].daweapontics;
2309             currweaponframe = readyanimtics[plr->currweapon][plr->currweaponanim].daweaponframe;
2310             dax = readyanimtics[plr->currweapon][plr->currweaponanim].currx;
2311             day = readyanimtics[plr->currweapon][plr->currweaponanim].curry + 8;
2312         }
2313         else
2314         {
2315             currweaponframe = readyanimtics[plr->currweapon][plr->currweaponanim].daweaponframe;
2316             dax = readyanimtics[plr->currweapon][plr->currweaponanim].currx;
2317             day = readyanimtics[plr->currweapon][plr->currweaponanim].curry + 8;
2318         }
2319         if (plr->currweapon == 0 && currweaponframe != 0)
2320         {
2321             overwritesprite(dax, day, currweaponframe, dashade, dabits, dapalnum);
2322             overwritesprite(0, day, currweaponframe + 6, dashade, dabits, dapalnum);
2323         }
2324         else
2325         {
2326             if (currweaponframe != 0)
2327             {
2328                 overwritesprite(dax, day, currweaponframe, dashade, dabits, dapalnum);
2329             }
2330         }
2331         break;
2332 
2333         case 5: //cock
2334         currweapontics -= synctics;
2335 
2336         if (currweapontics < 0)
2337         {
2338             plr->currweaponanim++;
2339             if (plr->currweaponanim == 4)
2340             {
2341                 plr->currweaponanim = 0;
2342                 plr->currweaponfired = 0;
2343 
2344                 currweaponframe = cockanimtics[3].daweaponframe;
2345                 dax = cockanimtics[3].currx + 3;
2346                 day = cockanimtics[3].curry + 3;
2347 
2348                 if (currweaponframe != 0)
2349                 {
2350                     overwritesprite(dax, day, currweaponframe, dashade, dabits, dapalnum);
2351                 }
2352                 break;
2353             }
2354             currweapontics = cockanimtics[plr->currweaponanim].daweapontics;
2355             currweaponframe = cockanimtics[plr->currweaponanim].daweaponframe;
2356             dax = cockanimtics[plr->currweaponanim].currx;
2357             day = cockanimtics[plr->currweaponanim].curry + 8;
2358         }
2359         else
2360         {
2361             currweaponframe = cockanimtics[plr->currweaponanim].daweaponframe;
2362             dax = cockanimtics[plr->currweaponanim].currx;
2363             day = cockanimtics[plr->currweaponanim].curry + 8;
2364         }
2365         if (currweaponframe != 0)
2366         {
2367             overwritesprite(dax, day, currweaponframe, dashade, dabits, dapalnum);
2368         }
2369 
2370         break;
2371 
2372         case 4: // throw the orb
2373 
2374         if (currweaponframe == 0)
2375         {
2376             castaorb(plr);
2377         }
2378 
2379         currweapontics -= synctics;
2380 
2381         if (currweapontics < 0)
2382         {
2383             plr->currweaponanim++;
2384             if (plr->currweaponanim > 12)
2385             {
2386                 plr->currweaponanim = 0;
2387                 plr->currweaponfired = 0;
2388                 plr->orbshot = false;
2389 
2390                 currweaponframe = throwanimtics[plr->currentorb][plr->currweaponanim].daweaponframe;
2391                 dax = throwanimtics[plr->currentorb][plr->currweaponanim].currx;
2392                 day = throwanimtics[plr->currentorb][plr->currweaponanim].curry + 8;
2393 
2394                 if (plr->currweapon == 0 && currweaponframe != 0)
2395                 {
2396                     overwritesprite(dax, day, currweaponframe, dashade, dabits, dapalnum);
2397                     //overwritesprite(0,day,currweaponframe+6,dashade,dabits,0);
2398                 }
2399                 else if (currweaponframe != 0)
2400                 {
2401                     overwritesprite(dax, day, currweaponframe, dashade, dabits, dapalnum);
2402                 }
2403 
2404                 break;
2405             }
2406             currweapontics = throwanimtics[plr->currentorb][plr->currweaponanim].daweapontics;
2407             currweaponframe = throwanimtics[plr->currentorb][plr->currweaponanim].daweaponframe;
2408             dax = throwanimtics[plr->currentorb][plr->currweaponanim].currx;
2409             day = throwanimtics[plr->currentorb][plr->currweaponanim].curry + 8;
2410         }
2411         else
2412         {
2413             currweaponframe = throwanimtics[plr->currentorb][plr->currweaponanim].daweaponframe;
2414             dax = throwanimtics[plr->currentorb][plr->currweaponanim].currx;
2415             day = throwanimtics[plr->currentorb][plr->currweaponanim].curry + 8;
2416         }
2417         if (currweaponframe != 0)
2418         {
2419             overwritesprite(dax, day, currweaponframe, dashade, dabits, dapalnum);
2420         }
2421         break;
2422     }
2423 
2424     // shield stuff
2425     if (plr->shieldpoints > 0
2426         && (plr->currweaponfired == 0 || plr->currweaponfired == 1)
2427         && plr->selectedgun > 0
2428         && plr->selectedgun < 5)
2429     {
2430 
2431         if (plr->currweaponfired == 1)
2432         {
2433             snakex = Sin(lockclock << 4) >> 12;
2434             snakey = Sin((int)totalclock << 4) >> 12;
2435         }
2436 
2437         if (plr->shieldpoints > 75)
2438         {
2439             overwritesprite(-40 + snakex, 70 + snakey, GRONSHIELD, dashade, dabits, dapalnum);
2440         }
2441         else if (plr->shieldpoints > 50 && plr->shieldpoints < 76)
2442         {
2443             overwritesprite(-40 + snakex, 70 + snakey, GRONSHIELD + 1, dashade, dabits, dapalnum);
2444         }
2445         else if (plr->shieldpoints > 25 && plr->shieldpoints < 51)
2446         {
2447             overwritesprite(-40 + snakex, 70 + snakey, GRONSHIELD + 2, dashade, dabits, dapalnum);
2448         }
2449         else
2450         {
2451             overwritesprite(-40 + snakex, 70 + snakey, GRONSHIELD + 3, dashade, dabits, dapalnum);
2452         }
2453     }
2454 
2455     //
2456     // spellbook
2457     //
2458     if (spellbookflip == 1)
2459     {
2460         if (svga == 0)
2461         {
2462             if (plr->screensize <= 320)
2463             {
2464                 //overwritesprite(122, 154, SPELLBOOKBACK, 0, 0, 0);
2465                 itemtoscreen(122, 154, SPELLBOOKBACK, 0, 0);
2466             }
2467         }
2468         if (svga == 1)
2469         {
2470             if (plr->screensize == 320)
2471             {
2472                 itemtoscreen(120 << 1, 372, SSPELLBACK, 0, 0);
2473                 //overwritesprite(120 << 1, 372, SSPELLBACK, 0, 0, 0);
2474             }
2475         }
2476 
2477         spellbooktics -= synctics;
2478 
2479         if (spellbooktics < 0)
2480         {
2481             spellbook++;
2482             if (spellbook > 8)
2483                 spellbook = 8;
2484 
2485             if (spellbook == 8)
2486             {
2487                 spellbooktics = spellbookanim[plr->currentorb][8].daweapontics;
2488                 if (svga == 1)
2489                 {
2490                     spellbookframe = sspellbookanim[plr->currentorb][8].daweaponframe;
2491                     dax = sspellbookanim[plr->currentorb][8].currx;
2492                     day = sspellbookanim[plr->currentorb][8].curry;
2493                 }
2494                 else
2495                 {
2496                     spellbookframe = spellbookanim[plr->currentorb][8].daweaponframe;
2497                     dax = spellbookanim[plr->currentorb][8].currx;
2498                     day = spellbookanim[plr->currentorb][8].curry;
2499                 }
2500                 if (svga == 1)
2501                 {
2502                     itemtoscreen(dax << 1, day, spellbookframe, 0, 0);
2503                     //overwritesprite(dax << 1, day, spellbookframe, 0, 0, 0);
2504                 }
2505                 else
2506                 {
2507                     itemtoscreen(dax, day, spellbookframe, 0, 0);
2508                     //overwritesprite(dax, day, spellbookframe, 0, 0, 0);
2509                 }
2510 
2511                 spellbookflip = 0;
2512                 return;
2513             }
2514             else
2515             {
2516                 spellbooktics = spellbookanim[plr->currentorb][spellbook].daweapontics;
2517 
2518                 if (svga == 1)
2519                 {
2520                     spellbookframe = sspellbookanim[plr->currentorb][spellbook].daweaponframe;
2521                     dax = sspellbookanim[plr->currentorb][spellbook].currx;
2522                     day = sspellbookanim[plr->currentorb][spellbook].curry;
2523 
2524                 }
2525                 else
2526                 {
2527                     spellbookframe = spellbookanim[plr->currentorb][spellbook].daweaponframe;
2528                     dax = spellbookanim[plr->currentorb][spellbook].currx;
2529                     day = spellbookanim[plr->currentorb][spellbook].curry;
2530                 }
2531                 if (svga == 1)
2532                 {
2533                     itemtoscreen(dax << 1, day, spellbookframe, 0, 0);
2534                     //overwritesprite(dax << 1, day, spellbookframe, 0, 0, 0);
2535                 }
2536                 else
2537                 {
2538                     itemtoscreen(dax, day, spellbookframe, 0, 0);
2539                     //overwritesprite(dax, day, spellbookframe, 0, 0, 0);
2540                 }
2541             }
2542         }
2543         else
2544         {
2545 
2546             if (svga == 1)
2547             {
2548                 spellbookframe = sspellbookanim[plr->currentorb][spellbook].daweaponframe;
2549                 dax = sspellbookanim[plr->currentorb][spellbook].currx;
2550                 day = sspellbookanim[plr->currentorb][spellbook].curry;
2551             }
2552             else
2553             {
2554                 spellbookframe = spellbookanim[plr->currentorb][spellbook].daweaponframe;
2555                 dax = spellbookanim[plr->currentorb][spellbook].currx;
2556                 day = spellbookanim[plr->currentorb][spellbook].curry;
2557             }
2558             if (svga == 1)
2559             {
2560                 itemtoscreen(dax << 1, day, spellbookframe, 0, 0);
2561                 //overwritesprite(dax << 1, day, spellbookframe, 0, 0, 0);
2562             }
2563             else
2564             {
2565                 itemtoscreen(dax, day, spellbookframe, 0, 0);
2566                 //overwritesprite(dax, day, spellbookframe, 0, 0, 0);
2567             }
2568         }
2569     }
2570 }
2571 
castaorb(Player * plr)2572 void castaorb(Player* plr)
2573 {
2574     short daang;
2575 
2576     switch (plr->currentorb)
2577     {
2578         case 0: // SCARE
2579         plr->shadowtime = (plr->lvl * 120) << 2;
2580         break;
2581         case 1: // NIGHTVISION
2582         plr->nightglowtime = 3600 + (plr->lvl * 120);
2583         break;
2584         case 2: // FREEZE
2585         daang = plr->ang;
2586         shootgun(plr, daang, 6);
2587         playsound_loc(S_SPELL1, plr->x, plr->y);
2588         break;
2589         case 3: // MAGIC ARROW
2590         daang = (plr->ang - 36) & kAngleMask;
2591         for (int k = 0; k < 10; k++)
2592         {
2593             daang = (daang + (k << 1)) & kAngleMask;
2594             shootgun(plr, daang, 2);
2595         }
2596         playsound_loc(S_SPELL1, plr->x, plr->y);
2597         break;
2598         case 4: // OPEN DOORS
2599         daang = plr->ang;
2600         shootgun(plr, daang, 7);
2601         playsound_loc(S_SPELL1, plr->x, plr->y);
2602         break;
2603         case 5: // FLY
2604         plr->orbactive[plr->currentorb] = 3600 + (plr->lvl * 120);
2605         playsound_loc(S_SPELL1, plr->x, plr->y);
2606         break;
2607         case 6: // FIREBALL
2608         daang = plr->ang;
2609         shootgun(plr, daang, 3);
2610         playsound_loc(S_SPELL1, plr->x, plr->y);
2611         break;
2612         case 7: // NUKE
2613         daang = plr->ang;
2614         shootgun(plr, daang, 4);
2615         playsound_loc(S_SPELL1, plr->x, plr->y);
2616         break;
2617     }
2618 }
2619 
chunksofmeat(Player * plr,short hitsprite,int hitx,int hity,int hitz,short hitsect,short daang)2620 void chunksofmeat(Player* plr, short hitsprite, int hitx, int hity, int hitz, short hitsect, short daang)
2621 {
2622     short j;
2623     short k;
2624     short zgore;
2625     int chunk = REDCHUNKSTART;
2626     int newchunk;
2627 
2628     if (goreon == 0)
2629         return;
2630 
2631     if (sprite[hitsprite].picnum == JUDY
2632         || sprite[hitsprite].picnum == JUDYATTACK1
2633         || sprite[hitsprite].picnum == JUDYATTACK2)
2634         return;
2635 
2636     switch (plr->selectedgun)
2637     {
2638         case 1:
2639         case 2:
2640         case 6:
2641         zgore = 1;
2642         break;
2643         case 3:
2644         case 4:
2645         case 7:
2646         zgore = 2;
2647         break;
2648         case 5:
2649         case 8:
2650         case 9:
2651         zgore = 3;
2652         break;
2653     }
2654 
2655     if (sprite[hitsprite].picnum == RAT)
2656         zgore = 1;
2657 
2658     if (sprite[hitsprite].picnum == WILLOW
2659         || sprite[hitsprite].picnum == WILLOWEXPLO
2660         || sprite[hitsprite].picnum == WILLOWEXPLO + 1
2661         || sprite[hitsprite].picnum == WILLOWEXPLO + 2
2662         || sprite[hitsprite].picnum == GUARDIAN
2663         || sprite[hitsprite].picnum == GUARDIANATTACK)
2664         return;
2665 
2666     if (sprite[hitsprite].picnum == SKELETON
2667         || sprite[hitsprite].picnum == SKELETONATTACK
2668         || sprite[hitsprite].picnum == SKELETONDIE)
2669     {
2670         playsound_loc(S_SKELHIT1 + (rand() % 2), sprite[hitsprite].x, sprite[hitsprite].y);
2671     }
2672     else
2673     {
2674         if (rand() % 100 > 60)
2675             playsound_loc(S_GORE1 + (rand() % 4), sprite[hitsprite].x, sprite[hitsprite].y);
2676     }
2677 
2678     if ((hitsprite >= 0) && (sprite[hitsprite].statnum < MAXSTATUS))
2679     {
2680         for (k = 0; k < zgore; k++)
2681         {
2682             newchunk = 0;
2683             j = insertsprite(hitsect, CHUNKOMEAT);
2684             sprite[j].x = hitx;
2685             sprite[j].y = hity;
2686             sprite[j].z = hitz;
2687             sprite[j].cstat = 0;
2688             if (rand() % 100 > 50)
2689             {
2690                 switch (sprite[hitsprite].picnum)
2691                 {
2692                     case GRONHAL:
2693                     case GRONHALATTACK:
2694                     case GRONHALPAIN:
2695                     case GRONMU:
2696                     case GRONMUATTACK:
2697                     case GRONMUPAIN:
2698                     case GRONSW:
2699                     case GRONSWATTACK:
2700                     case GRONSWPAIN:
2701                     chunk = REDCHUNKSTART + (rand() % 8);
2702                     break;
2703                     case KOBOLD:
2704                     case KOBOLDATTACK:
2705                     if (sprite[hitsprite].pal == 0)
2706                         chunk = BROWNCHUNKSTART + (rand() % 8);
2707                     if (sprite[hitsprite].pal == 4)
2708                         chunk = GREENCHUNKSTART + (rand() % 8);
2709                     if (sprite[hitsprite].pal == 7)
2710                         chunk = REDCHUNKSTART + (rand() % 8);
2711                     break;
2712                     case DRAGON:
2713                     case DRAGONATTACK2:
2714                     case DRAGONATTACK:
2715                     chunk = GREENCHUNKSTART + (rand() % 8);
2716                     break;
2717                     case DEVILSTAND:
2718                     case DEVIL:
2719                     case DEVILATTACK:
2720                     chunk = REDCHUNKSTART + (rand() % 8);
2721                     break;
2722                     case FREDSTAND:
2723                     case FRED:
2724                     case FREDATTACK:
2725                     case FREDPAIN:
2726                     chunk = BROWNCHUNKSTART + (rand() % 8);
2727                     break;
2728                     case GOBLINSTAND:
2729                     case GOBLIN:
2730                     case GOBLINCHILL:
2731                     case GOBLINATTACK:
2732                     case GOBLINPAIN:
2733                     if (sprite[hitsprite].pal == 0)
2734                         chunk = GREENCHUNKSTART + (rand() % 8);
2735                     if (sprite[hitsprite].pal == 4)
2736                         chunk = BROWNCHUNKSTART + (rand() % 8);
2737                     if (sprite[hitsprite].pal == 5)
2738                         chunk = TANCHUNKSTART + (rand() % 8);
2739                     break;
2740                     case MINOTAUR:
2741                     case MINOTAURATTACK:
2742                     case MINOTAURPAIN:
2743                     chunk = TANCHUNKSTART + (rand() % 8);
2744                     break;
2745                     case SPIDER:
2746                     chunk = GREYCHUNKSTART + (rand() % 8);
2747                     break;
2748                     case SKULLY:
2749                     case SKULLYATTACK:
2750                     case FATWITCH:
2751                     case FATWITCHATTACK:
2752                     case JUDYSIT:
2753                     case JUDYSTAND:
2754                     case JUDY:
2755                     case JUDYATTACK1:
2756                     case JUDYATTACK2:
2757                     chunk = REDCHUNKSTART + (rand() % 8);
2758                     break;
2759                 }
2760             }
2761             else
2762             {
2763                 newchunk = 1;
2764                 chunk = NEWCHUNK + (rand() % 9);
2765             }
2766             if (sprite[hitsprite].picnum == SKELETON
2767                 || sprite[hitsprite].picnum == SKELETONATTACK
2768                 || sprite[hitsprite].picnum == SKELETONDIE)
2769                 chunk = BONECHUNK1 + (rand() % 9);
2770 
2771             sprite[j].picnum = chunk;
2772             sprite[j].shade = -16;
2773             sprite[j].xrepeat = 64;
2774             sprite[j].yrepeat = 64;
2775             sprite[j].clipdist = 16;
2776             sprite[j].ang = ((rand() & 1023) - 1024) & kAngleMask;
2777             sprite[j].xvel = ((rand() & 1023) - 512);
2778             sprite[j].yvel = ((rand() & 1023) - 512);
2779             sprite[j].zvel = ((rand() & 1023) - 512);
2780 
2781             if (newchunk == 1)
2782                 sprite[j].zvel <<= 1;
2783 
2784             sprite[j].owner = 4096;
2785             sprite[j].lotag = 512;
2786             sprite[j].hitag = 0;
2787             sprite[j].pal = 0;
2788 
2789             movesprite(j, (Cos(sprite[j].ang) * synctics) << 3, (Sin(sprite[j].ang) * synctics) << 3, 0, 4 << 8, 4 << 8, 0);
2790         }
2791     }
2792 }
2793 
swingdapunch()2794 void swingdapunch()
2795 {
2796     Player* plr = &player[pyrn];
2797 
2798     switch (plr->currweapon)
2799     {
2800         case 0: // hands
2801             SND_Sound(S_SOCK4);
2802             SND_Sound(S_PLRPAIN1 + (rand() % 2));
2803             sethealth(-1);
2804             startredflash(10);
2805         break;
2806         case 1: // knife
2807         case 2: // mace
2808         case 4: // sword
2809         case 5:
2810         case 6:
2811         case 7:
2812         case 8:
2813             SND_PlaySound(S_WALLHIT1, 0, 0, 0, 0);
2814         break;
2815         case 3: //arrow
2816         break;
2817     }
2818 }
2819 
shootgun(Player * plr,short daang,char guntype)2820 void shootgun(Player *plr, short daang, char guntype)
2821 {
2822     short daang2, k;
2823     int32_t i, j, daz2;
2824 
2825     int32_t hitsprite = -1;
2826     int32_t hitsect = -1;
2827     int32_t hitwall = -1;
2828     int32_t hitx = -1;
2829     int32_t hity = -1;
2830     int32_t hitz = -1;
2831     vec3_t pos;
2832     hitdata_t hitinfo;
2833 
2834     switch (guntype)
2835     {
2836         case 0:
2837         {
2838             daang2 = daang + 2048;
2839             daz2 = (100 - plr->horiz) * 2000;
2840 
2841             pos.x = plr->x;
2842             pos.y = plr->y;
2843             pos.z = plr->z;
2844 
2845             hitscan(&pos, plr->sector, // Start position
2846                 Cos(daang2 + 2048), // X vector of 3D ang
2847                 Sin(daang2 + 2048), // X vector of 3D ang
2848                 daz2,               // Z vector of 3D ang
2849                 &hitinfo, CLIPMASK1); // CHECKME - is CLIPMASK1 correct for vesion of this function that hadn't got cliptype param?
2850 
2851             hitsprite = hitinfo.sprite;
2852             hitsect = hitinfo.sect;
2853             hitwall = hitinfo.wall;
2854             hitx = hitinfo.pos.x;
2855             hity = hitinfo.pos.y;
2856             hitz = hitinfo.pos.z;
2857 
2858             if (hitsprite >= 0)
2859                 madeahit = 1;
2860 
2861             if (hitwall >= 0)
2862             {
2863                 if ((labs(plr->x - hitx) + labs(plr->y - hity) < 512) && (labs((plr->z >> 8) - ((hitz >> 8) - (64))) <= (512 >> 3)))
2864                 {
2865                     madeahit = 1;
2866 
2867                     switch (plr->currweapon)
2868                     {
2869                         case 0: // fist
2870                         if (currweaponframe == RFIST + 5)
2871                             if (plr->currweaponanim == 5 && currweapontics == 10)
2872                                 swingdapunch();
2873                         break;
2874                         case 1: // knife
2875                         if (currweaponframe == KNIFEATTACK + 6)
2876                             if (plr->currweaponanim == 8 && currweapontics == 8)
2877                                 swingdapunch();
2878                         if (currweaponframe == KNIFEATTACK2 + 2)
2879                             if ((plr->currweaponanim == 5 || plr->currweaponanim == 9) && currweapontics == 8)
2880                                 swingdapunch();
2881                         break;
2882                         case 2: // short sword
2883                         if (currweaponframe == GOBSWORDATTACK + 4)
2884                             if (plr->currweaponanim == 4 && currweapontics == 10)
2885                                 swingdapunch();
2886                         if (currweaponframe == GOBSWORDATTACK + 4)
2887                             if (plr->currweaponanim == 4 && currweapontics == 10)
2888                                 swingdapunch();
2889                         break;
2890                         case 3: // morning
2891                         if (currweaponframe == MORNINGSTAR + 5)
2892                             if (plr->currweaponanim == 7 && currweapontics == 12)
2893                                 swingdapunch();
2894                         if (currweaponframe == MORNINGATTACK2 + 3)
2895                             if (plr->currweaponanim == 3 && currweapontics == 12)
2896                                 swingdapunch();
2897                         break;
2898                         case 4: // sword
2899                         if (currweaponframe == SWORDATTACK + 7)
2900                             if (plr->currweaponanim == 7 && currweapontics == 8)
2901                             {
2902                                 swingdapunch();
2903                                 madenoise(2, plr->x, plr->y, plr->z);
2904                             }
2905                         if (currweaponframe == SWORDATTACK2 + 6)
2906                             if (plr->currweaponanim == 6 && currweapontics == 8)
2907                             {
2908                                 swingdapunch();
2909                                 madenoise(2, plr->x, plr->y, plr->z);
2910                             }
2911                         break;
2912                         case 5: // battleaxe
2913                         if (currweaponframe == BIGAXEATTACK + 7)
2914                             if (plr->currweaponanim == 7 && currweapontics == 12)
2915                                 swingdapunch();
2916                         if (currweaponframe == BIGAXEATTACK2 + 6)
2917                             if (plr->currweaponanim == 6 && currweapontics == 12)
2918                                 swingdapunch();
2919                         break;
2920                         case 6: // bow
2921                         if (currweaponframe == BOWWALK + 4)
2922                             if (plr->currweaponanim == 4 && currweapontics == 6)
2923                                 swingdapunch();
2924                         break;
2925                         case 7: // pike
2926                         if (currweaponframe == PIKEATTACK1 + 4)
2927                             if (plr->currweaponanim == 8 && currweapontics == 10)
2928                                 swingdapunch();
2929                         if (currweaponframe == PIKEATTACK2 + 4)
2930                             if (plr->currweaponanim == 4 && currweapontics == 10)
2931                                 swingdapunch();
2932                         break;
2933                         case 8: // two handed sword
2934                         if (currweaponframe == EXCALATTACK1 + 7)
2935                             if (plr->currweaponanim == 7 && currweapontics == 8)
2936                                 swingdapunch();
2937                         if (currweaponframe == EXCALATTACK2 + 5)
2938                             if (plr->currweaponanim == 5 && currweapontics == 8)
2939                                 swingdapunch();
2940                         break;
2941                         case 9: // halberd
2942                         if (currweaponframe == HALBERDATTACK1 + 3)
2943                             if (plr->currweaponanim == 6 && currweapontics == 12)
2944                                 swingdapunch();
2945                         if (currweaponframe == HALBERDATTACK2 + 3)
2946                             if (plr->currweaponanim == 4 && currweapontics == 12)
2947                                 swingdapunch();
2948                         break;
2949                     }
2950                 }
2951             }
2952             if (checkweapondist(hitsprite, plr->x, plr->y, plr->z, guntype))
2953             {
2954                 switch (sprite[hitsprite].picnum)
2955                 {
2956                     case BARREL:
2957                     case VASEA:
2958                     case VASEB:
2959                     case VASEC:
2960                     newstatus(hitsprite, BROKENVASE);
2961                     break;
2962                     case GRONHAL:
2963                     case GRONHALATTACK:
2964                     case GRONHALPAIN:
2965                     case GRONMU:
2966                     case GRONMUATTACK:
2967                     case GRONMUPAIN:
2968                     case GRONSW:
2969                     case GRONSWATTACK:
2970                     case GRONSWPAIN:
2971                     case KOBOLD:
2972                     case KOBOLDATTACK:
2973                     case DRAGON:
2974                     case DRAGONATTACK2:
2975                     case DRAGONATTACK:
2976                     case DEVILSTAND:
2977                     case DEVIL:
2978                     case DEVILATTACK:
2979                     case FREDSTAND:
2980                     case FRED:
2981                     case FREDATTACK:
2982                     case FREDPAIN:
2983                     case SKELETON:
2984                     case SKELETONATTACK:
2985                     case GOBLINSTAND:
2986                     case GOBLIN:
2987                     case GOBLINCHILL:
2988                     //case GOBLINSURPRISE:
2989                     case GOBLINATTACK:
2990                     case GOBLINPAIN:
2991                     case MINOTAUR:
2992                     case MINOTAURATTACK:
2993                     case MINOTAURPAIN:
2994                     case SPIDER:
2995                     case SKULLY:
2996                     case SKULLYATTACK:
2997                     case FATWITCH:
2998                     case FATWITCHATTACK:
2999                     case FISH:
3000                     case RAT:
3001                     case GUARDIAN:
3002                     case GUARDIANATTACK:
3003                     case WILLOW:
3004                     case JUDYSIT:
3005                     case JUDYSTAND:
3006                     case JUDY:
3007                     case JUDYATTACK1:
3008                     case JUDYATTACK2:
3009 
3010                     if (netgame) {
3011                         netshootgun(hitsprite, plr->currweapon);
3012                     }
3013 
3014                     if (plr->invisibletime > 0)
3015                     {
3016                         if ((krand() & 32) > 15) {
3017                             plr->invisibletime = -1;
3018                         }
3019                     }
3020 
3021                     switch (plr->selectedgun)
3022                     {
3023                         case 0: // fist
3024                         k = (krand() & 5) + 1;
3025                         break;
3026                         case 1: // dagger
3027                         if (plr->currweaponattackstyle == 0)
3028                             k = (krand() & 5) + 10;
3029                         else
3030                             k = (krand() & 3) + 5;
3031                         break;
3032                         case 2: // short sword
3033                         if (plr->currweaponattackstyle == 0)
3034                             k = (krand() & 10) + 10;
3035                         else
3036                             k = (krand() & 6) + 10;
3037                         break;
3038                         case 3: // morning star
3039                         if (plr->currweaponattackstyle == 0)
3040                             k = (krand() & 8) + 10;
3041                         else
3042                             k = (krand() & 8) + 15;
3043                         break;
3044                         case 4: // broad sword
3045                         if (plr->currweaponattackstyle == 0)
3046                             k = (krand() & 5) + 20;
3047                         else
3048                             k = (krand() & 5) + 15;
3049                         break;
3050                         case 5: // battle axe
3051                         if (plr->currweaponattackstyle == 0)
3052                             k = (krand() & 5) + 25;
3053                         else
3054                             k = (krand() & 5) + 20;
3055                         break;
3056                         case 6: // bow
3057                             k = (krand() & 15) + 5;
3058                         break;
3059                         case 7: // pike axe
3060                         if (plr->currweaponattackstyle == 0)
3061                             k = (krand() & 15) + 10;
3062                         else
3063                             k = (krand() & 15) + 5;
3064                         break;
3065                         case 8: // two handed sword
3066                         if (plr->currweaponattackstyle == 0)
3067                             k = (krand() & 15) + 45;
3068                         else
3069                             k = (krand() & 15) + 40;
3070                         break;
3071                         case 9: // halberd
3072                         if (plr->currweaponattackstyle == 0)
3073                             k = (krand() & 15) + 25;
3074                         else
3075                             k = (krand() & 15) + 15;
3076                         break;
3077                     }
3078 
3079                     k += plr->lvl;
3080 
3081                     if (plr->vampiretime > 0)
3082                     {
3083                         if (plr->health <= plr->maxhealth)
3084                             sethealth((rand() % 10) + 1);
3085                     }
3086                     if (plr->helmettime > 0)
3087                     {
3088                         k <<= 1;
3089                     }
3090 
3091                     if (plr->strongtime > 0)
3092                     {
3093                         k += k >> 1;
3094 
3095                         switch (plr->currweapon)
3096                         {
3097                             case 0: // fist
3098                             if (currweaponframe == RFIST + 5)
3099                                 if (plr->currweaponanim == 5 && currweapontics == 10)
3100                                     swingdacrunch();
3101                             break;
3102                             case 1: // knife
3103                             if (currweaponframe == KNIFEATTACK + 6)
3104                                 if (plr->currweaponanim == 8 && currweapontics == 8)
3105                                     swingdacrunch();
3106                             if (currweaponframe == KNIFEATTACK2 + 2)
3107                                 if (plr->currweaponanim == 5 || plr->currweaponanim == 9 && currweapontics == 8)
3108                                     swingdacrunch();
3109                             break;
3110                             case 2: // short sword
3111                             if (currweaponframe == GOBSWORDATTACK + 4)
3112                                 if (plr->currweaponanim == 4 && currweapontics == 10)
3113                                     swingdacrunch();
3114                             if (currweaponframe == GOBSWORDATTACK2 + 4)
3115                                 if (plr->currweaponanim == 4 && currweapontics == 10)
3116                                     swingdacrunch();
3117                             break;
3118                             case 3: // morning
3119                             if (currweaponframe == MORNINGSTAR + 5)
3120                                 if (plr->currweaponanim == 7 && currweapontics == 12)
3121                                     swingdacrunch();
3122                             if (currweaponframe == MORNINGATTACK2 + 3)
3123                                 if (plr->currweaponanim == 3 && currweapontics == 12)
3124                                     swingdacrunch();
3125                             break;
3126                             case 4: // sword
3127                             if (currweaponframe == SWORDATTACK + 7)
3128                                 if (plr->currweaponanim == 7 && currweapontics == 8)
3129                                     swingdacrunch();
3130                             if (currweaponframe == SWORDATTACK2 + 6)
3131                                 if (plr->currweaponanim == 6 && currweapontics == 8)
3132                                     swingdacrunch();
3133                             break;
3134                             case 5: // battleaxe
3135                             if (currweaponframe == BIGAXEATTACK + 7)
3136                                 if (plr->currweaponanim == 7 && currweapontics == 12)
3137                                     swingdacrunch();
3138                             if (currweaponframe == BIGAXEATTACK2 + 6)
3139                                 if (plr->currweaponanim == 6 && currweapontics == 12)
3140                                     swingdacrunch();
3141                             break;
3142                             case 6: // bow
3143                             if (currweaponframe == BOWWALK + 4)
3144                                 if (plr->currweaponanim == 4 && currweapontics == 6)
3145                                     swingdacrunch();
3146                             break;
3147                             case 7: // pike
3148                             if (currweaponframe == PIKEATTACK1 + 4)
3149                                 if (plr->currweaponanim == 8 && currweapontics == 10)
3150                                     swingdacrunch();
3151                             if (currweaponframe == PIKEATTACK2 + 4)
3152                                 if (plr->currweaponanim == 4 && currweapontics == 10)
3153                                     swingdacrunch();
3154                             break;
3155                             case 8: // two handed sword
3156                             if (currweaponframe == EXCALATTACK1 + 7)
3157                                 if (plr->currweaponanim == 7 && currweapontics == 8)
3158                                     swingdacrunch();
3159                             if (currweaponframe == EXCALATTACK2 + 5)
3160                                 if (plr->currweaponanim == 5 && currweapontics == 8)
3161                                     swingdacrunch();
3162                             break;
3163                             case 9: // halberd
3164                             if (currweaponframe == HALBERDATTACK1 + 3)
3165                                 if (plr->currweaponanim == 6 && currweapontics == 12)
3166                                     swingdacrunch();
3167                             if (currweaponframe == HALBERDATTACK2 + 3)
3168                                 if (plr->currweaponanim == 4 && currweapontics == 12)
3169                                     swingdacrunch();
3170                             break;
3171                         }
3172 
3173                         sprite[hitsprite].hitag -= (k << 1);
3174 
3175                         if (plr->currweapon != 0)
3176                         {
3177                             //JSA GORE1 you have strong time
3178                             if (rand() % 100 > 50)
3179                             {
3180                                 if (sprite[hitsprite].picnum == SKELETON
3181                                     || sprite[hitsprite].picnum == SKELETONATTACK
3182                                     || sprite[hitsprite].picnum == SKELETONDIE)
3183                                     playsound_loc(S_SKELHIT1 + (rand() % 2), sprite[hitsprite].x, sprite[hitsprite].y);
3184                             }
3185 
3186                             switch (plr->currweapon)
3187                             {
3188                                 case 0: // fist
3189                                 break;
3190                                 case 1: // knife
3191                                 if (currweaponframe == KNIFEATTACK + 6)
3192                                 {
3193                                     if (plr->currweaponanim == 8 && currweapontics == 8) {
3194                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3195                                     }
3196                                 }
3197                                 if (currweaponframe == KNIFEATTACK2 + 2)
3198                                 {
3199                                     if (plr->currweaponanim == 5 || plr->currweaponanim == 9 && currweapontics == 8) {
3200                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3201                                     }
3202                                 }
3203                                 break;
3204                                 case 2: // short sword
3205                                 if (currweaponframe == GOBSWORDATTACK + 4)
3206                                 {
3207                                     if (plr->currweaponanim == 4 && currweapontics == 10) {
3208                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3209                                     }
3210                                 }
3211                                 if (currweaponframe == GOBSWORDATTACK2 + 4)
3212                                 {
3213                                     if (plr->currweaponanim == 4 && currweapontics == 10) {
3214                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3215                                     }
3216                                 }
3217                                 break;
3218                                 case 3: // morning
3219                                 if (currweaponframe == MORNINGSTAR + 5)
3220                                 {
3221                                     if (plr->currweaponanim == 7 && currweapontics == 12) {
3222                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3223                                     }
3224                                 }
3225                                 if (currweaponframe == MORNINGATTACK2 + 3)
3226                                 {
3227                                     if (plr->currweaponanim == 3 && currweapontics == 12) {
3228                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3229                                     }
3230                                 }
3231                                 break;
3232                                 case 4: // sword
3233                                 if (currweaponframe == SWORDATTACK + 7)
3234                                 {
3235                                     if (plr->currweaponanim == 7 && currweapontics == 8)
3236                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3237                                 }
3238                                 if (currweaponframe == SWORDATTACK2 + 6)
3239                                 {
3240                                     if (plr->currweaponanim == 6 && currweapontics == 8)
3241                                         break;
3242                                 }
3243                                 chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3244                                 fallthrough__;
3245                                 case 5: // battleaxe
3246                                 {
3247                                     if (currweaponframe == BIGAXEATTACK + 7)
3248                                         if (plr->currweaponanim == 7 && currweapontics == 12)
3249                                             chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3250                                 }
3251                                 if (currweaponframe == BIGAXEATTACK2 + 6)
3252                                 {
3253                                     if (plr->currweaponanim == 6 && currweapontics == 12)
3254                                         break;
3255                                 }
3256                                 chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3257                                 fallthrough__;
3258                                 case 6: // bow
3259                                 if (currweaponframe == BOWWALK + 4)
3260                                 {
3261                                     if (plr->currweaponanim == 4 && currweapontics == 6) {
3262                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3263                                     }
3264                                 }
3265                                 break;
3266                                 case 7: // pike
3267                                 if (currweaponframe == PIKEATTACK1 + 4)
3268                                 {
3269                                     if (plr->currweaponanim == 8 && currweapontics == 10) {
3270                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3271                                     }
3272                                 }
3273                                 if (currweaponframe == PIKEATTACK2 + 4)
3274                                 {
3275                                     if (plr->currweaponanim == 4 && currweapontics == 10) {
3276                                         break;
3277                                     }
3278                                 }
3279                                 chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3280                                 fallthrough__;
3281                                 case 8: // two handed sword
3282                                 if (currweaponframe == EXCALATTACK1 + 7)
3283                                 {
3284                                     if (plr->currweaponanim == 7 && currweapontics == 8) {
3285                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3286                                     }
3287                                 }
3288                                 if (currweaponframe == EXCALATTACK2 + 5)
3289                                 {
3290                                     if (plr->currweaponanim == 5 && currweapontics == 8) {
3291                                         break;
3292                                     }
3293                                 }
3294                                 chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3295                                 fallthrough__;
3296                                 case 9: // halberd
3297                                 if (currweaponframe == HALBERDATTACK1 + 3)
3298                                     if (plr->currweaponanim == 6 && currweapontics == 12)
3299                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3300                                 if (currweaponframe == HALBERDATTACK2 + 3)
3301                                     if (plr->currweaponanim == 4 && currweapontics == 12)
3302                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3303                                 break;
3304                             }
3305                             //ENDOFHERE
3306                             //chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3307                         }
3308                     }
3309                     else
3310                     {
3311                         switch (plr->currweapon)
3312                         {
3313                             case 0: // fist
3314                             if (currweaponframe == RFIST + 5)
3315                                 if (plr->currweaponanim == 5 && currweapontics == 10)
3316                                     swingdacrunch();
3317                             break;
3318                             case 1: // knife
3319                             if (currweaponframe == KNIFEATTACK + 6)
3320                                 if (plr->currweaponanim == 8 && currweapontics == 8)
3321                                     swingdacrunch();
3322                             if (currweaponframe == KNIFEATTACK2 + 2)
3323                                 if (plr->currweaponanim == 5 || plr->currweaponanim == 9 && currweapontics == 8)
3324                                     swingdacrunch();
3325                             break;
3326                             case 2: // SHORT SWORD
3327                             if (currweaponframe == GOBSWORDATTACK + 4)
3328                                 if (plr->currweaponanim == 4 && currweapontics == 10)
3329                                     swingdacrunch();
3330                             if (currweaponframe == GOBSWORDATTACK2 + 4)
3331                                 if (plr->currweaponanim == 4 && currweapontics == 10)
3332                                     swingdacrunch();
3333                             break;
3334                             case 3: // morning
3335                             if (currweaponframe == MORNINGSTAR + 5)
3336                                 if (plr->currweaponanim == 7 && currweapontics == 12)
3337                                     swingdacrunch();
3338                             if (currweaponframe == MORNINGATTACK2 + 3)
3339                                 if (plr->currweaponanim == 3 && currweapontics == 12)
3340                                     swingdacrunch();
3341                             break;
3342                             case 4: // sword
3343                             if (currweaponframe == SWORDATTACK + 7)
3344                                 if (plr->currweaponanim == 7 && currweapontics == 8)
3345                                     swingdacrunch();
3346                             if (currweaponframe == SWORDATTACK2 + 6)
3347                                 if (plr->currweaponanim == 6 && currweapontics == 8)
3348                                     swingdacrunch();
3349                             break;
3350                             case 5: // battleaxe
3351                             if (currweaponframe == BIGAXEATTACK + 7)
3352                                 if (plr->currweaponanim == 7 && currweapontics == 12)
3353                                     swingdacrunch();
3354                             if (currweaponframe == BIGAXEATTACK2 + 6)
3355                                 if (plr->currweaponanim == 6 && currweapontics == 12)
3356                                     swingdacrunch();
3357                             break;
3358                             case 6: // bow
3359                             if (currweaponframe == BOWWALK + 4)
3360                                 if (plr->currweaponanim == 4 && currweapontics == 6)
3361                                     swingdacrunch();
3362                             break;
3363 
3364                             case 7: // pike
3365                             if (currweaponframe == PIKEATTACK1 + 4)
3366                                 if (plr->currweaponanim == 8 && currweapontics == 10)
3367                                     swingdacrunch();
3368                             if (currweaponframe == PIKEATTACK2 + 4)
3369                                 if (plr->currweaponanim == 4 && currweapontics == 10)
3370                                     swingdacrunch();
3371                             break;
3372                             case 8: // two handed sword
3373                             if (currweaponframe == EXCALATTACK1 + 7)
3374                                 if (plr->currweaponanim == 7 && currweapontics == 8)
3375                                     swingdacrunch();
3376                             if (currweaponframe == EXCALATTACK2 + 5)
3377                                 if (plr->currweaponanim == 5 && currweapontics == 8)
3378                                     swingdacrunch();
3379                             break;
3380                             case 9: // halberd
3381                             if (currweaponframe == HALBERDATTACK1 + 3)
3382                                 if (plr->currweaponanim == 6 && currweapontics == 12)
3383                                     swingdacrunch();
3384                             if (currweaponframe == HALBERDATTACK2 + 3)
3385                                 if (plr->currweaponanim == 4 && currweapontics == 12)
3386                                     swingdacrunch();
3387                             break;
3388                         }
3389 
3390                         sprite[hitsprite].hitag -= k;
3391 
3392                         if (plr->currweapon != 0)
3393                         {
3394                             //JSA GORE normal
3395                             if (rand() % 100 > 50)
3396                             {
3397                                 if (sprite[hitsprite].picnum == SKELETON
3398                                     || sprite[hitsprite].picnum == SKELETONATTACK
3399                                     || sprite[hitsprite].picnum == SKELETONDIE)
3400                                     playsound_loc(S_SKELHIT1 + (rand() % 2), sprite[hitsprite].x, sprite[hitsprite].y);
3401                             }
3402                             //HERE
3403                             switch (plr->currweapon)
3404                             {
3405                                 case 0: // fist
3406                                 break;
3407                                 case 1: // knife
3408                                 if (currweaponframe == KNIFEATTACK + 6)
3409                                     if (plr->currweaponanim == 8 && currweapontics == 8)
3410                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3411                                 if (currweaponframe == KNIFEATTACK2 + 2)
3412                                     if (plr->currweaponanim == 5 || plr->currweaponanim == 9 && currweapontics == 8)
3413                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3414                                 break;
3415                                 case 2: // short sword
3416                                 if (currweaponframe == GOBSWORDATTACK + 4)
3417                                     if (plr->currweaponanim == 4 && currweapontics == 10)
3418                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3419                                 if (currweaponframe == GOBSWORDATTACK2 + 4)
3420                                     if (plr->currweaponanim == 4 && currweapontics == 10)
3421                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3422                                 break;
3423                                 case 3: // morning
3424                                 if (currweaponframe == MORNINGSTAR + 5)
3425                                     if (plr->currweaponanim == 7 && currweapontics == 12)
3426                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3427                                 if (currweaponframe == MORNINGATTACK2 + 3)
3428                                     if (plr->currweaponanim == 3 && currweapontics == 12)
3429                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3430                                 break;
3431                                 case 4: // sword
3432                                 if (currweaponframe == SWORDATTACK + 7)
3433                                     if (plr->currweaponanim == 7 && currweapontics == 8)
3434                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3435                                 if (currweaponframe == SWORDATTACK2 + 6)
3436                                     if (plr->currweaponanim == 6 && currweapontics == 8)
3437                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3438                                 break;
3439                                 case 5: // battleaxe
3440                                 if (currweaponframe == BIGAXEATTACK + 7)
3441                                     if (plr->currweaponanim == 7 && currweapontics == 12)
3442                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3443                                 if (currweaponframe == BIGAXEATTACK2 + 6)
3444                                     if (plr->currweaponanim == 6 && currweapontics == 12)
3445                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3446                                 break;
3447                                 case 6: // bow
3448                                 if (currweaponframe == BOWWALK + 4)
3449                                     if (plr->currweaponanim == 4 && currweapontics == 6)
3450                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3451                                 break;
3452                                 case 7: // pike
3453                                 if (currweaponframe == PIKEATTACK1 + 4)
3454                                     if (plr->currweaponanim == 8 && currweapontics == 10)
3455                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3456                                 if (currweaponframe == PIKEATTACK2 + 4)
3457                                     if (plr->currweaponanim == 4 && currweapontics == 10)
3458                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3459                                 break;
3460                                 case 8: // two handed sword
3461                                 if (currweaponframe == EXCALATTACK1 + 7)
3462                                     if (plr->currweaponanim == 7 && currweapontics == 8)
3463                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3464                                 if (currweaponframe == EXCALATTACK2 + 5)
3465                                     if (plr->currweaponanim == 5 && currweapontics == 8)
3466                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3467                                 break;
3468                                 case 9: // halberd
3469                                 if (currweaponframe == HALBERDATTACK1 + 3)
3470                                     if (plr->currweaponanim == 6 && currweapontics == 12)
3471                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3472                                 if (currweaponframe == HALBERDATTACK2 + 3)
3473                                     if (plr->currweaponanim == 4 && currweapontics == 12)
3474                                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3475                                 break;
3476                             }
3477                             //ENDOFHERE
3478 
3479                             //chunksomeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3480                         }
3481                     }
3482 
3483                     if (netgame)
3484                     {
3485                         break;
3486                     }
3487 
3488                     if (sprite[hitsprite].hitag <= 0)
3489                     {
3490                         if (plr->selectedgun > 1)
3491                         {
3492                             //JSA GORE on death ?
3493                             //RAF ans:death
3494                             chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3495 
3496                             if (sprite[hitsprite].picnum == SKELETON
3497                                 || sprite[hitsprite].picnum == SKELETONATTACK
3498                                 || sprite[hitsprite].picnum == SKELETONDIE)
3499                                 playsound_loc(S_SKELHIT1 + (rand() % 2), sprite[hitsprite].x, sprite[hitsprite].y);
3500                         }
3501                         newstatus(hitsprite, DIE);
3502                     }
3503                     sprite[hitsprite].ang = plr->ang + ((krand() & 32) - 64);
3504                     if (sprite[hitsprite].hitag > 0)
3505                     {
3506                         newstatus(hitsprite, PAIN);
3507                     }
3508                     break;
3509                     case GRONHALDIE:
3510                     case GRONMUDIE:
3511                     case GRONSWDIE:
3512                     case KOBOLDDIE:
3513                     case DRAGONDIE:
3514                     case DEVILDIE:
3515                     case FREDDIE:
3516                     case SKELETONDIE:
3517                     case GOBLINDIE:
3518                     case MINOTAURDIE:
3519                     case SKULLYDIE:
3520                     case SPIDERDIE:
3521                     case FATWITCHDIE:
3522                     case JUDYDIE:
3523                     //case FISH:
3524                     //case RAT:
3525                     //case WILLOW:
3526                     if (sprite[hitsprite].pal == 6)
3527                     {
3528                         //JSA_NEW
3529                         SND_PlaySound(S_SOCK1 + (rand() % 4), 0, 0, 0, 0);
3530                         playsound_loc(S_FREEZEDIE, hitx, hity);
3531                         for (k = 0; k < 32; k++)
3532                             icecubes(hitsprite, hitx, hity, hitz, hitsprite);
3533                         deletesprite(hitsprite);
3534                     }
3535                 } // switch
3536             } // if weapondist
3537             if (madeahit == 0)
3538             {
3539                 plr->ammo[plr->currweapon]++;
3540                 madeahit = 1;
3541             }
3542         }
3543     break;
3544     case 1:
3545     {
3546         daang2 = (daang + 2048) & kAngleMask;
3547         daz2 = (100 - plr->horiz) * 2000;
3548 
3549         pos.x = plr->x;
3550         pos.y = plr->y;
3551         pos.z = plr->z;
3552 
3553         hitscan(&pos, plr->sector,                   // Start position
3554             Cos(daang2 + 2048), // X vector of 3D ang
3555             Sin(daang2 + 2048), // X vector of 3D ang
3556             daz2,               // Z vector of 3D ang
3557             &hitinfo, CLIPMASK1); // CHECKME - is CLIPMASK1 correct for vesion of this function that hadn't got cliptype param?
3558 
3559         hitsprite = hitinfo.sprite;
3560         hitsect = hitinfo.sect;
3561         hitwall = hitinfo.wall;
3562         hitx = hitinfo.pos.x;
3563         hity = hitinfo.pos.y;
3564         hitz = hitinfo.pos.z;
3565 
3566         if (hitwall > 0 && hitsprite < 0)
3567         {
3568             neartag(hitx, hity, hitz, hitsect, daang,
3569                 &neartagsector, &neartagwall, &neartagsprite, &neartaghitdist, 1024, 3, NULL);
3570 
3571             if (neartagsector < 0)
3572             {
3573                 if (sector[neartagsector].lotag == 0)
3574                 {
3575                     j = insertsprite(hitsect, 0);
3576                     sprite[j].x = hitx;
3577                     sprite[j].y = hity;
3578                     sprite[j].z = hitz + (8 << 8);
3579                     sprite[j].cstat = 17;//was16
3580                     sprite[j].picnum = WALLARROW;
3581                     sprite[j].shade = 0;
3582                     sprite[j].pal = 0;
3583                     sprite[j].xrepeat = 16;
3584                     sprite[j].yrepeat = 48;
3585                     sprite[j].ang = ((daang + 2048) - 512 + ((rand() & 128) - 64)) & kAngleMask;
3586                     sprite[j].xvel = 0;
3587                     sprite[j].yvel = 0;
3588                     sprite[j].zvel = 0;
3589                     sprite[j].owner = 4096;
3590                     sprite[j].lotag = 32;
3591                     sprite[j].hitag = 0;
3592                     playsound_loc(S_ARROWHIT, sprite[j].x, sprite[j].y);
3593                 }
3594             }
3595 
3596             if (netgame)
3597             {
3598                 netshootgun(-1, 5);
3599             }
3600         }
3601         if (hitwall > 0 && hitsprite > 0)
3602         {
3603             j = insertsprite(hitsect, FX);
3604             sprite[j].x = hitx;
3605             sprite[j].y = hity;
3606             sprite[j].z = hitz + (8 << 8);
3607             sprite[j].cstat = 2;
3608             sprite[j].picnum = PLASMA;
3609             sprite[j].shade = -32;
3610             sprite[j].pal = 0;
3611             sprite[j].xrepeat = 32;
3612             sprite[j].yrepeat = 32;
3613             sprite[j].ang = daang;
3614             sprite[j].xvel = 0;
3615             sprite[j].yvel = 0;
3616             sprite[j].zvel = 0;
3617             sprite[j].owner = 4096;
3618             sprite[j].lotag = 32;
3619             sprite[j].hitag = 0;
3620 
3621             movesprite(j, (Cos(sprite[j].ang) * synctics) << 3, (Sin(sprite[j].ang) * synctics) << 3, 0, 4 << 8, 4 << 8, 0);
3622         }
3623         if ((hitsprite >= 0) && (sprite[hitsprite].statnum < MAXSTATUS))
3624         {
3625             switch (sprite[hitsprite].picnum)
3626             {
3627                 case VASEA:
3628                 case VASEB:
3629                 case VASEC:
3630                 newstatus(hitsprite, BROKENVASE);
3631                 break;
3632                 case GRONHAL:
3633                 case GRONHALATTACK:
3634                 case GRONHALPAIN:
3635                 case GRONMU:
3636                 case GRONMUATTACK:
3637                 case GRONMUPAIN:
3638                 case GRONSW:
3639                 case GRONSWATTACK:
3640                 case GRONSWPAIN:
3641                 case KOBOLD:
3642                 case KOBOLDATTACK:
3643                 case DRAGON:
3644                 case DRAGONATTACK2:
3645                 case DRAGONATTACK:
3646                 case DEVILSTAND:
3647                 case DEVIL:
3648                 case DEVILATTACK:
3649                 case FREDSTAND:
3650                 case FRED:
3651                 case FREDATTACK:
3652                 case FREDPAIN:
3653                 case SKELETON:
3654                 case SKELETONATTACK:
3655                 case GOBLINSTAND:
3656                 case GOBLIN:
3657                 case GOBLINCHILL:
3658                 //case GOBLINSURPRISE:
3659                 case GOBLINATTACK:
3660                 case GOBLINPAIN:
3661                 case MINOTAUR:
3662                 case MINOTAURATTACK:
3663                 case MINOTAURPAIN:
3664                 case SPIDER:
3665                 case SKULLY:
3666                 case SKULLYATTACK:
3667                 case FATWITCH:
3668                 case FATWITCHATTACK:
3669                 case FISH:
3670                 case RAT:
3671                 case WILLOW:
3672                 case GUARDIAN:
3673                 case GUARDIANATTACK:
3674                 case JUDYSIT:
3675                 case JUDYSTAND:
3676                 case JUDY:
3677                 case JUDYATTACK1:
3678                 case JUDYATTACK2:
3679 
3680                 if (netgame)
3681                 {
3682                     netshootgun(hitsprite, plr->currweapon);
3683                     break;
3684                 }
3685 
3686                 sprite[hitsprite].hitag -= (krand() & 15) + 15;
3687                 if (sprite[hitsprite].hitag <= 0)
3688                 {
3689                     newstatus(hitsprite, DIE);
3690                     if (sprite[hitsprite].picnum == RAT)
3691                         chunksofmeat(plr, hitsprite, hitx, hity, hitz, hitsect, daang);
3692                 }
3693                 else
3694                 {
3695                     sprite[hitsprite].ang = (getangle(plr->x - sprite[hitsprite].x, plr->y - sprite[hitsprite].y) & kAngleMask);
3696                     newstatus(hitsprite, PAIN);
3697                 }
3698                 break;
3699                 // SHATTER FROZEN CRITTER
3700                 case GRONHALDIE:
3701                 case GRONMUDIE:
3702                 case GRONSWDIE:
3703                 case KOBOLDDIE:
3704                 case DRAGONDIE:
3705                 case DEVILDIE:
3706                 case FREDDIE:
3707                 case SKELETONDIE:
3708                 case GOBLINDIE:
3709                 case MINOTAURDIE:
3710                 case SKULLYDIE:
3711                 case SPIDERDIE:
3712                 case FATWITCHDIE:
3713                 case JUDYDIE:
3714                 //case FISH:
3715                 //case RAT:
3716                 //case WILLOW:
3717                 if (sprite[hitsprite].pal == 6)
3718                 {
3719                     //JSA_NEW
3720                     SND_PlaySound(S_SOCK1 + (rand() % 4), 0, 0, 0, 0);
3721                     playsound_loc(S_FREEZEDIE, hitx, hity);
3722                     for (k = 0; k < 32; k++)
3723                     {
3724                         icecubes(hitsprite, hitx, hity, hitz, hitsprite);
3725                     }
3726                     deletesprite(hitsprite);
3727                 }
3728             } // switch
3729         }
3730     }
3731     break;
3732 
3733     case 6: // MEDUSA
3734     {
3735         for (i = 0; i < MAXSPRITES; i++)
3736         {
3737             //cansee
3738             if (i != plr->spritenum)
3739             {
3740                 if (sprite[i].picnum == FRED
3741                     || sprite[i].picnum == KOBOLD
3742                     || sprite[i].picnum == GOBLIN
3743                     || sprite[i].picnum == MINOTAUR
3744                     || sprite[i].picnum == SPIDER
3745                     || sprite[i].picnum == SKELETON
3746                     || sprite[i].picnum == GRONHAL
3747                     || sprite[i].picnum == GRONMU
3748                     || sprite[i].picnum == GRONSW)
3749                 {
3750                     if (cansee(plr->x, plr->y, plr->z, plr->sector, sprite[i].x, sprite[i].y, sprite[i].z - (tilesiz[sprite[i].picnum].y << 7), sprite[i].sectnum) == 1)
3751                     {
3752                         //distance check
3753                         if (checkmedusadist(i, plr->x, plr->y, plr->z, plr->lvl))
3754                             //medusa
3755                             medusa(i);
3756                     }
3757                 }
3758             }
3759         }
3760     }
3761     break;
3762     case 7:    //KNOCKSPELL
3763     {
3764         daang2 = (daang + 2048) & kAngleMask;
3765         daz2 = (100 - plr->horiz) * 2000;
3766 
3767         pos.x = plr->x;
3768         pos.y = plr->y;
3769         pos.z = plr->z;
3770 
3771         hitscan(&pos, plr->sector,                   //Start position
3772             Cos(daang2 + 2048), // X vector of 3D ang
3773             Sin(daang2 + 2048), // X vector of 3D ang
3774             daz2,               // Z vector of 3D ang
3775             &hitinfo, CLIPMASK1); // CHECKME - is CLIPMASK1 correct for vesion of this function that hadn't got cliptype param?
3776 
3777         hitsprite = hitinfo.sprite;
3778         hitsect = hitinfo.sect;
3779         hitwall = hitinfo.wall;
3780         hitx = hitinfo.pos.x;
3781         hity = hitinfo.pos.y;
3782         hitz = hitinfo.pos.z;
3783 
3784         if (hitsect < 0 && hitsprite < 0 || hitwall >= 0)
3785         {
3786             neartag(hitx, hity, hitz, hitsect, daang,
3787                 &neartagsector, &neartagwall, &neartagsprite, &neartaghitdist, 1024, 3, NULL);
3788 
3789             if (neartagsector >= 0)
3790             {
3791                 if (sector[neartagsector].lotag >= 60 && sector[neartagsector].lotag <= 69)
3792                 {
3793                     sector[neartagsector].lotag = 6;
3794                     sector[neartagsector].hitag = 0;
3795                 }
3796                 if (sector[neartagsector].lotag >= 70 && sector[neartagsector].lotag <= 79)
3797                 {
3798                     sector[neartagsector].lotag = 7;
3799                     sector[neartagsector].hitag = 0;
3800                 }
3801                 operatesector(neartagsector);
3802             }
3803         }
3804         break;
3805     case 10: //throw a pike axe
3806     {
3807         if (currweaponframe == PIKEATTACK1 + 4)
3808         {
3809             if (plr->currweaponanim == 8 && currweapontics == 10)
3810             {
3811 
3812                 if (netgame)
3813                 {
3814                     netshootgun(-1, 15);
3815                 }
3816 
3817                 //j=insertsprite(plr->sector,JAVLIN);
3818                 j = insertsprite(plr->sector, MISSILE);
3819 
3820                 sprite[j].x = plr->x;
3821                 sprite[j].y = plr->y;
3822                 sprite[j].z = plr->z + (16 << 8);
3823 
3824                 //sprite[j].cstat=17;
3825                 sprite[j].cstat = 21;
3826 
3827                 sprite[j].picnum = THROWPIKE;
3828                 sprite[j].ang = ((plr->ang + 2048 + 96) - 512) & kAngleMask;
3829                 sprite[j].xrepeat = 24;
3830                 sprite[j].yrepeat = 24;
3831                 sprite[j].clipdist = 24;
3832 
3833                 sprite[j].extra = plr->ang;
3834                 sprite[j].shade = -15;
3835                 sprite[j].xvel = ((krand() & 256) - 128);
3836                 sprite[j].yvel = ((krand() & 256) - 128);
3837                 //sprite[j].zvel=((krand()&256)-128);
3838                 sprite[j].zvel = ((100 - plr->horiz) << 4);
3839                 sprite[j].owner = 4096;
3840                 sprite[j].lotag = 1024;
3841                 sprite[j].hitag = 0;
3842                 sprite[j].pal = 0;
3843             }
3844         }
3845         if (currweaponframe == PIKEATTACK2 + 4)
3846         {
3847             if (plr->currweaponanim == 4 && currweapontics == 10)
3848             {
3849                 //j=insertsprite(plr->sector,JAVLIN);
3850                 j = insertsprite(plr->sector, MISSILE);
3851 
3852                 sprite[j].x = plr->x;
3853                 sprite[j].y = plr->y;
3854                 sprite[j].z = plr->z;
3855 
3856                 //sprite[j].cstat=17;
3857                 sprite[j].cstat = 21;
3858 
3859                 sprite[j].picnum = THROWPIKE;
3860                 sprite[j].ang = ((plr->ang + 2048) - 512) & kAngleMask;
3861                 sprite[j].xrepeat = 24;
3862                 sprite[j].yrepeat = 24;
3863                 sprite[j].clipdist = 24;
3864 
3865                 sprite[j].extra = plr->ang;
3866                 sprite[j].shade = -15;
3867                 sprite[j].xvel = ((krand() & 256) - 128);
3868                 sprite[j].yvel = ((krand() & 256) - 128);
3869                 sprite[j].zvel = ((krand() & 256) - 128);
3870                 sprite[j].owner = 4096;
3871                 sprite[j].lotag = 1024;
3872                 sprite[j].hitag = 0;
3873                 sprite[j].pal = 0;
3874             }
3875         }
3876     }
3877 
3878     break;
3879     case 2: // parabolic trajectory
3880     {
3881         if (netgame)
3882         {
3883             netshootgun(-1, 12);
3884         }
3885 
3886         j = insertsprite(plr->sector, MISSILE);
3887         sprite[j].x = plr->x;
3888         sprite[j].y = plr->y;
3889         sprite[j].z = plr->z + (8 << 8) + ((krand() & 10) << 8);
3890         sprite[j].cstat = 0;
3891         sprite[j].picnum = PLASMA;
3892         sprite[j].shade = -32;
3893         sprite[j].pal = 0;
3894         sprite[j].xrepeat = 16;
3895         sprite[j].yrepeat = 16;
3896         sprite[j].ang = daang;
3897         sprite[j].xvel = Cos(daang + 2048) >> 5;
3898         sprite[j].yvel = Sin(daang + 2048) >> 5;
3899         sprite[j].zvel = ((100 - plr->horiz) << 4);
3900         sprite[j].owner = 4096;
3901         sprite[j].lotag = 256;
3902         sprite[j].hitag = 0;
3903         sprite[j].clipdist = 48;
3904 
3905         movesprite(j, (Cos(sprite[j].ang) * synctics) << 3, (Sin(sprite[j].ang) * synctics) << 3, 0, 4 << 8, 4 << 8, 0);
3906 
3907         //vec3_t pos;
3908         pos.x = sprite[j].x;
3909         pos.y = sprite[j].y;
3910         pos.z = sprite[j].z;
3911 
3912         setsprite(j, &pos);
3913     }
3914     break;
3915     case 3:
3916     {
3917         if (netgame)
3918         {
3919             netshootgun(-1, 13);
3920         }
3921 
3922         j = insertsprite(plr->sector, MISSILE);
3923         sprite[j].x = plr->x;
3924         sprite[j].y = plr->y;
3925         sprite[j].z = plr->z + (8 << 8);
3926         sprite[j].cstat = 0;        //Hitscan does not hit other bullets
3927         sprite[j].picnum = MONSTERBALL;
3928         sprite[j].shade = -32;
3929         sprite[j].pal = 0;
3930         sprite[j].xrepeat = 64;
3931         sprite[j].yrepeat = 64;
3932         sprite[j].ang = plr->ang;
3933         sprite[j].xvel = Cos(daang + 2048) >> 7;
3934         sprite[j].yvel = Sin(daang + 2048) >> 7;
3935         sprite[j].zvel = ((100 - plr->horiz) << 4);
3936         sprite[j].owner = 4096;
3937         sprite[j].lotag = 256;
3938         sprite[j].hitag = 0;
3939         sprite[j].clipdist = 64;
3940 
3941         movesprite(j, (Cos(sprite[j].ang) * synctics) << 3, (Sin(sprite[j].ang) * synctics) << 3, 0, 4 << 8, 4 << 8, 0);
3942 
3943         //vec3_t pos;
3944         pos.x = sprite[j].x;
3945         pos.y = sprite[j].y;
3946         pos.z = sprite[j].z;
3947 
3948         setsprite(j, &pos);
3949     }
3950     break;
3951     case 4:
3952     {
3953         if (netgame)
3954         {
3955             netshootgun(-1, 14);
3956         }
3957 
3958         for (j = 0; j < MAXSPRITES; j++)
3959         {
3960             switch (sprite[j].picnum)
3961             {
3962                 case SPIDER:
3963                 case KOBOLD:
3964                 case KOBOLDATTACK:
3965                 case DEVIL:
3966                 case DEVILATTACK:
3967                 case GOBLIN:
3968                 case GOBLINATTACK:
3969                 case GOBLINCHILL:
3970                 case MINOTAUR:
3971                 case MINOTAURATTACK:
3972                 case SKELETON:
3973                 case SKELETONATTACK:
3974                 case GRONHAL:
3975                 case GRONHALATTACK:
3976                 case GRONMU:
3977                 case GRONMUATTACK:
3978                 case GRONSW:
3979                 case GRONSWATTACK:
3980                 case DRAGON:
3981                 case DRAGONATTACK:
3982                 case DRAGONATTACK2:
3983                 case GUARDIAN:
3984                 case GUARDIANATTACK:
3985                 case FATWITCH:
3986                 case FATWITCHATTACK:
3987                 case SKULLY:
3988                 case SKULLYATTACK:
3989                 case JUDY:
3990                 case JUDYATTACK1:
3991                 case JUDYATTACK2:
3992                 case WILLOW:
3993                 {
3994                     if (cansee(plr->x, plr->y, plr->z, plr->sector, sprite[j].x, sprite[j].y, sprite[j].z - (tilesiz[sprite[j].picnum].y << 7), sprite[j].sectnum) == 1)
3995                     {
3996                         if (checkmedusadist(j, plr->x, plr->y, plr->z, 12))
3997                         {
3998                             nukespell(j);
3999                         }
4000                     }
4001                 }
4002                 break;
4003             }
4004         }
4005     }
4006     }
4007     break;
4008     }
4009 }
4010 
singleshot(short bstatus)4011 void singleshot(short bstatus)
4012 {
4013     Player* plr = &player[pyrn];
4014 
4015     plr->hasshot = false;
4016 
4017     #if 0
4018     if (selectedgun != 1 && oldmousestatus == 0)
4019     {
4020         keystatus[keys[KEYFIRE]] = keystatus[sc_RightControl] = 0;
4021         hasshot = 0;
4022     }
4023     #endif
4024 }
4025 
setpotion(int nPotion)4026 void setpotion(int nPotion)
4027 {
4028     Player* plr = &player[pyrn];
4029 
4030     plr->currentpotion = nPotion;
4031 }
4032 
drawpotionpic()4033 void drawpotionpic()
4034 {
4035     int i;
4036     int tilenum;
4037 
4038     Player* plr = &player[pyrn];
4039 
4040     if (WH2 && plr->playerdie) {
4041         return;
4042     }
4043 
4044     if (netgame)
4045         return;
4046 
4047     if (svga == 1)
4048     {
4049         itemtoscreen(260 << 1, 387, SPOTIONBACKPIC, 0, 0);
4050         itemtoscreen((260 << 1) - 4, 380, SPOTIONARROW + plr->currentpotion, 0, 0);
4051     }
4052     else
4053     {
4054         itemtoscreen(260, 161, POTIONBACKPIC, 0, 0);
4055         itemtoscreen(260 - 2, 161 - 4, POTIONARROW + plr->currentpotion, 0, 0);
4056     }
4057 
4058     for (i = 0; i < MAXPOTIONS; i++)
4059     {
4060         if (plr->potion[i] < 0) {
4061             plr->potion[i] = 0;
4062         }
4063 
4064         if (plr->potion[i] > 0)
4065         {
4066             switch (i)
4067             {
4068                 case 0:
4069                 if (svga == 1)
4070                     tilenum = SFLASKBLUE;
4071                 else
4072                     tilenum = FLASKBLUE;
4073                 break;
4074                 case 1:
4075                 if (svga == 1)
4076                     tilenum = SFLASKGREEN;
4077                 else
4078                     tilenum = FLASKGREEN;
4079                 break;
4080                 case 2:
4081                 if (svga == 1)
4082                     tilenum = SFLASKOCHRE;
4083                 else
4084                     tilenum = FLASKOCHRE;
4085                 break;
4086                 case 3:
4087                 if (svga == 1)
4088                     tilenum = SFLASKRED;
4089                 else
4090                     tilenum = FLASKRED;
4091                 break;
4092                 case 4:
4093                 if (svga == 1)
4094                     tilenum = SFLASKTAN;
4095                 else
4096                     tilenum = FLASKTAN;
4097                 break;
4098             }
4099 
4100             if (svga == 1) {
4101                 itemtoscreen((262 << 1) + (i * 20), 406, tilenum, 0, 0);
4102             }
4103             else {
4104                 itemtoscreen(262 + (i * 10), 169, tilenum, 0, 0);
4105             }
4106 
4107             sprintf(tempbuf, "%d", plr->potion[i]);
4108 
4109             if (svga == 1)
4110                 fancyfont((266 << 1) + (i * 20), 394, SPOTIONFONT - 26, potionbuf, 0);
4111             else
4112                 fancyfont(266 + (i * 10), 164, SMFONT - 26, potionbuf, 0);
4113         }
4114         else
4115         {
4116             if (svga == 1)
4117             {
4118                 if (WH2) {
4119                     rotatesprite(((262 << 1) + (i * 20)) << 16, 406 << 16, 65536, 0, SFLASKBLACK, 0, 0, 8 + 16, 0, 0, xdim - 1, ydim - 1);
4120                 }
4121                 else {
4122                     itemtoscreen((262 << 1) + (i * 10), 406, SFLASKBLACK, 0, 0);
4123                 }
4124             }
4125             else {
4126                 itemtoscreen(262 + (i * 10), 169, FLASKBLACK, 0, 0);
4127             }
4128         }
4129     }
4130 }
4131 
usapotion(Player * plr)4132 void usapotion(Player* plr)
4133 {
4134     if (WH2 && plr->playerdie) {
4135         return;
4136     }
4137 
4138     if (plr->currentpotion == 0 && plr->health >= plr->maxhealth)
4139         return;
4140 
4141     if (plr->currentpotion == 2 && plr->poisoned == 0)
4142         return;
4143 
4144     if (plr->potion[plr->currentpotion] <= 0)
4145         return;
4146     else
4147         plr->potion[plr->currentpotion]--;
4148 
4149     switch (plr->currentpotion)
4150     {
4151         case 0: // health potion
4152         {
4153             if (plr->health + 25 > plr->maxhealth)
4154             {
4155                 if (WH2) {
4156                     plr->health = plr->maxhealth;
4157                 }
4158                 else {
4159                     plr->health = 0;
4160                 }
4161 
4162                 SND_PlaySound(S_DRINK, 0, 0, 0, 0);
4163 
4164                 if (WH2) {
4165                     sethealth(0);
4166                 }
4167                 else {
4168                     sethealth(plr->maxhealth);
4169                 }
4170             }
4171             else
4172             {
4173                 SND_PlaySound(S_DRINK, 0, 0, 0, 0);
4174                 sethealth(25);
4175             }
4176 
4177             startblueflash(10);
4178         }
4179         break;
4180         case 1: // strength
4181         plr->strongtime = 3200;
4182         SND_PlaySound(S_DRINK, 0, 0, 0, 0);
4183 
4184         if (WH2) {
4185             startblueflash(10);
4186         }
4187         else {
4188             startredflash(10);
4189         }
4190         break;
4191         case 2: // anti venom
4192         {
4193             SND_PlaySound(S_DRINK, 0, 0, 0, 0);
4194             plr->poisoned = 0;
4195             plr->poisontime = 0;
4196             startwhiteflash(10);
4197             StatusMessage(360, "poison cured");
4198             sethealth(0);
4199         }
4200         break;
4201         case 3: // fire resist
4202         {
4203             SND_PlaySound(S_DRINK, 0, 0, 0, 0);
4204             plr->manatime = 3200;
4205             startwhiteflash(10);
4206             if (lavasnd != -1)
4207             {
4208                 SND_StopLoop(lavasnd);
4209                 lavasnd = -1;
4210             }
4211 
4212             if (WH2) {
4213                 addarmoramount(0);
4214             }
4215         }
4216         break;
4217         case 4: // invisi
4218         {
4219             SND_PlaySound(S_DRINK, 0, 0, 0, 0);
4220             plr->invisibletime = 3200;
4221             startgreenflash(10);
4222         }
4223         break;
4224     }
4225 
4226     setpotion(plr->currentpotion);
4227 }
4228 
draworbpic()4229 void draworbpic()
4230 {
4231     char tempbuf[8];
4232     int  spellbookpage;
4233 
4234     Player* plr = &player[pyrn];
4235 
4236     if (WH2 && plr->playerdie) {
4237         return;
4238     }
4239 
4240     if (plr->orbammo[plr->currentorb] < 0)
4241         plr->orbammo[plr->currentorb] = 0;
4242 
4243     sprintf(tempbuf, "%d", plr->orbammo[plr->currentorb]);
4244 
4245  //   if (svga == 1)
4246  //   {
4247  //       spellbookpage = sspellbookanim[plr->currentorb][8].daweaponframe;
4248  //   }
4249  //   else
4250     {
4251         spellbookpage = spellbookanim[plr->currentorb][8].daweaponframe;
4252     }
4253 
4254     #if 0
4255     if (svga == 1)
4256     {
4257         if (WH2)
4258         {
4259             #if 0
4260             itemtoscreen(120 << 1, 372, SSPELLBACK, 0, 0);
4261             spellbookframe = sspellbookanim[currentorb][8].daweaponframe;
4262             dax = sspellbookanim[currentorb][8].currx;
4263             day = sspellbookanim[currentorb][8].curry;
4264             itemtoscreen(dax << 1, day, spellbookframe, 0, 0);
4265             sprintf(tempbuf, "%d", plr->orbammo[plr->currentorb]);
4266             fancyfont(126 << 1, 439, SSCOREFONT - 26, tempbuf, 0);
4267             #endif
4268         }
4269         else
4270         {
4271             overwritesprite(121 << 1, 389, spellbookpage, 0, 0, 0);
4272         }
4273 
4274         fancyfont(126 << 1, 439, SSCOREFONT - 26, tempbuf, 0);
4275     }
4276     else
4277     {
4278         if (WH2)
4279         {
4280             itemtoscreen(122, 155, SPELLBOOKBACK, 0, 0);
4281             itemtoscreen(121, 161, spellbookpage, 0, 0);
4282         }
4283         else
4284         {
4285             overwritesprite(121, 161, spellbookpage, 0, 0, 0);
4286         }
4287 
4288         fancyfont(126, 181, SCOREFONT - 26, tempbuf, 0);
4289     }
4290     #else
4291 
4292     itemtoscreen(121, 161, spellbookpage, 0, 0);
4293     //overwritesprite(121, 161, spellbookpage, 0, 0, 0);
4294     fancyfont(126, 181, SCOREFONT - 26, tempbuf, 0);
4295     #endif
4296 }
4297 
sethealth(int hp)4298 void sethealth(int hp)
4299 {
4300     Player* plr = &player[pyrn];
4301 
4302     if (WH2)
4303     {
4304         switch (difficulty)
4305         {
4306             case 1:
4307             hp >>= 1;
4308             break;
4309             case 3:
4310             hp <<= 1;
4311             break;
4312         }
4313     }
4314 
4315     plr->health += hp;
4316 
4317     if (plr->health < 0) {
4318         plr->health = 0;
4319     }
4320 }
4321 
healthpic()4322 void healthpic()
4323 {
4324     Player* plr = &player[pyrn];
4325 
4326     if (WH2)
4327     {
4328         if (plr->playerdie) {
4329             return;
4330         }
4331 
4332         if (godmode == 1)
4333         {
4334             plr->health = 200;
4335             if (svga == 0)
4336             {
4337                 if (plr->screensize <= 320)
4338                 {
4339                     itemtoscreen(72, 168, HEALTHBACKPIC, 0, 0);
4340                     fancyfont(74, 170, BGZERO - 26, healthbuf, 0);
4341                 }
4342             }
4343             else if (svga == 1)
4344             {
4345                 if (plr->screensize == 320)
4346                 {
4347                     itemtoscreen(74 << 1, 406, SHEALTHBACK, 0, 0);
4348                     fancyfont(76 << 1, 409, SHEALTHFONT - 26, healthbuf, 0);
4349                 }
4350             }
4351             return;
4352         }
4353     }
4354 
4355     sprintf(healthbuf, "%d", plr->health);
4356 
4357     if (svga == 0)
4358     {
4359         if (plr->screensize <= 320)
4360         {
4361             if (!WH2 && plr->poisoned == 1)
4362             {
4363                 itemtoscreen(72, 168, HEALTHBACKPIC, 0, 6);
4364                 fancyfont(74, 170, BGZERO - 26, healthbuf, 6);
4365             }
4366             else
4367             {
4368                 itemtoscreen(72, 168, HEALTHBACKPIC, 0, 0);
4369                 fancyfont(74, 170, BGZERO - 26, healthbuf, 0);
4370             }
4371         }
4372     }
4373     else if (svga == 1)
4374     {
4375         if (plr->screensize == 320)
4376         {
4377             if (!WH2 && plr->poisoned == 1)
4378             {
4379                 itemtoscreen(74 << 1, 406, SHEALTHBACK, 0, 6);
4380                 fancyfont(76 << 1, 409, SHEALTHFONT - 26, healthbuf, 6);
4381             }
4382             else
4383             {
4384                 itemtoscreen(74 << 1, 406, SHEALTHBACK, 0, 0);
4385                 fancyfont(76 << 1, 409, SHEALTHFONT - 26, healthbuf, 0);
4386             }
4387         }
4388     }
4389 }
4390 
addarmoramount(int nArmor)4391 void addarmoramount(int nArmor)
4392 {
4393     Player* plr = &player[pyrn];
4394 
4395     if (WH2 && plr->playerdie) {
4396         return;
4397     }
4398 
4399     plr->armor += nArmor;
4400 
4401     if (plr->armor < 0)
4402     {
4403         plr->armor = 0;
4404         plr->armortype = 0;
4405     }
4406 }
4407 
4408 //void armorpic(int arm)
drawarmor()4409 void drawarmor()
4410 {
4411     char armorbuf[5];
4412     Player* plr = &player[pyrn];
4413 
4414     #if 0
4415     plr->armor += arm;
4416 
4417     if (plr->armor < 0)
4418     {
4419         plr->armor = 0;
4420         plr->armortype = 0;
4421     }
4422     #endif
4423 
4424     sprintf(armorbuf, "%d", plr->armor);
4425 
4426     if (svga == 0)
4427     {
4428         if (plr->screensize <= 320)
4429         {
4430             itemtoscreen(197, 168, HEALTHBACKPIC, 0, 0);
4431             fancyfont(200 + 1, 170, BGZERO - 26, armorbuf, 0);
4432         }
4433     }
4434     else
4435     {
4436         if (plr->screensize == 320)
4437         {
4438             itemtoscreen(200 << 1, 406, SHEALTHBACK, 0, 0);
4439             fancyfont(204 << 1, 409, SHEALTHFONT - 26, armorbuf, 0);
4440         }
4441     }
4442 }
4443 
levelpic()4444 void levelpic()
4445 {
4446     int tilenum;
4447     char textbuf[20];
4448 
4449     Player* plr = &player[pyrn];
4450 
4451     if (WH2 && plr->playerdie) {
4452         return;
4453     }
4454 
4455     if (plr->selectedgun == 6)
4456     {
4457         if (plr->ammo[6] < 0)
4458             plr->ammo[6] = 0;
4459 
4460         sprintf(textbuf, "%d", plr->ammo[6]);
4461         #if 0
4462         if (svga == 0)
4463         {
4464             itemtoscreen(3, 181, ARROWS, 0, 0);
4465             fancyfont(42, 183, SCOREFONT - 26, textbuf, 0);
4466         }
4467         else
4468         #endif
4469         {
4470             itemtoscreen(3 << 1, 434, SARROWS, 0, 0);
4471             fancyfont(42 << 1, 439, SSCOREFONT - 26, textbuf, 0);
4472         }
4473     }
4474     else if (plr->selectedgun == 7 && plr->weapon[7] == 2)
4475     {
4476         if (plr->ammo[7] < 0)
4477             plr->ammo[7] = 0;
4478 
4479         sprintf(textbuf, "%d", plr->ammo[7]);
4480 
4481         // need pike pic
4482         if (svga == 0)
4483         {
4484             itemtoscreen(3, 181, PIKES, 0, 0);
4485             fancyfont(42, 183, SCOREFONT - 26, textbuf, 0);
4486         }
4487         else
4488         {
4489             itemtoscreen(3 << 1, 434, SPIKES, 0, 0);
4490             fancyfont(42 << 1, 439, SSCOREFONT - 26, textbuf, 0);
4491         }
4492     }
4493     else
4494     {
4495         #if 1
4496         //if (svga == 0)
4497             tilenum = PLAYERLVL + (plr->lvl - 1);
4498         //else
4499         //#endif
4500         //    tilenum = SPLAYERLVL + (plr->lvl - 1);
4501             #endif
4502 
4503         #if 1
4504         //if (svga == 0)
4505             itemtoscreen(3, 181, tilenum, 0, 0);
4506         //else
4507         #endif
4508             //itemtoscreen(3/* << 1*/, 436, tilenum, 0, 0);
4509 //        itemtoscreen(3, 181, tilenum, 0, 0);
4510     }
4511 }
4512 
addscoreamount(int nScore)4513 void addscoreamount(int nScore)
4514 {
4515     Player* plr = &player[pyrn];
4516 
4517     if (WH2 && plr->playerdie) {
4518         return;
4519     }
4520 
4521     plr->score += nScore;
4522     expgained  += nScore; // Witchaven 2
4523 
4524     goesupalevel(plr);
4525 }
4526 
drawscore()4527 void drawscore()
4528 {
4529     int tilenum;
4530     char tempbuf[8];
4531     Player* plr = &player[pyrn];
4532 
4533     tilenum = SCOREFONT - 26;
4534 
4535     sprintf(tempbuf, "%d", plr->score);
4536 
4537     if (svga == 1)
4538         itemtoscreen(6, 394, SSCOREBACKPIC, 0, 0);
4539     else
4540         itemtoscreen(29, 163, SCOREBACKPIC, 0, 0);
4541 
4542     strcpy(scorebuf, tempbuf);
4543 
4544     if (svga == 1)
4545     {
4546         if (plr->screensize == 320)
4547             fancyfont(60, 396 + 1, SSCOREFONT - 26, scorebuf, 0);
4548     }
4549     else
4550     {
4551         if (plr->screensize <= 320)
4552             fancyfont(30, 165, SCOREFONT - 26, scorebuf, 0);
4553     }
4554 
4555 //    goesupalevel(plr);
4556 }
4557 
goesupalevel(Player * plr)4558 void goesupalevel(Player* plr)
4559 {
4560     if (WH2)
4561     {
4562         switch (plr->lvl)
4563         {
4564             case 0:
4565             case 1:
4566             if (plr->score > 9999)
4567             {
4568                 StatusMessage(360, "thou art a warrior");
4569                 plr->lvl = 2;
4570                 plr->maxhealth = 120;
4571                 //levelpic();
4572             }
4573             break;
4574             case 2:
4575             if (plr->score > 19999)
4576             {
4577                 StatusMessage(360, "thou art a swordsman");
4578                 plr->lvl = 3;
4579                 plr->maxhealth = 140;
4580                 //levelpic();
4581             }
4582             break;
4583             case 3:
4584             if (plr->score > 29999)
4585             {
4586                 StatusMessage(360, "thou art a hero");
4587                 plr->lvl = 4;
4588                 plr->maxhealth = 160;
4589                 //levelpic();
4590             }
4591             break;
4592             case 4:
4593             if (plr->score > 39999)
4594             {
4595                 StatusMessage(360, "thou art a champion");
4596                 plr->lvl = 5;
4597                 plr->maxhealth = 180;
4598                 //levelpic();
4599             }
4600             break;
4601             case 5:
4602             if (plr->score > 49999)
4603             {
4604                 StatusMessage(360, "thou art a superhero");
4605                 plr->lvl = 6;
4606                 plr->maxhealth = 200;
4607                 //levelpic();
4608             }
4609             break;
4610             case 6:
4611             if (plr->score > 59999)
4612             {
4613                 StatusMessage(360, "thou art a lord");
4614                 plr->lvl = 7;
4615                 //levelpic();
4616             }
4617         }
4618     }
4619     else
4620     {
4621         if (plr->score > 2250 && plr->score < 4499 && plr->lvl < 2)
4622         {
4623             StatusMessage(360, "thou art 2nd level");
4624             plr->lvl = 2;
4625             plr->maxhealth = 120;
4626             //levelpic();
4627         }
4628         else if (plr->score > 4500 && plr->score < 8999 && plr->lvl < 3)
4629         {
4630             StatusMessage(360, "thou art 3rd level");
4631             plr->lvl = 3;
4632             plr->maxhealth = 140;
4633             //levelpic();
4634         }
4635         else if (plr->score > 9000 && plr->score < 17999 && plr->lvl < 4)
4636         {
4637             StatusMessage(360, "thou art 4th level");
4638             plr->lvl = 4;
4639             plr->maxhealth = 160;
4640             //levelpic();
4641         }
4642         else if (plr->score > 18000 && plr->score < 35999 && plr->lvl < 5)
4643         {
4644             StatusMessage(360, "thou art 5th level");
4645             plr->lvl = 5;
4646             plr->maxhealth = 180;
4647             //levelpic();
4648         }
4649         else if (plr->score > 36000 && plr->score < 74999 && plr->lvl < 6)
4650         {
4651             StatusMessage(360, "thou art 6th level");
4652             plr->lvl = 6;
4653             plr->maxhealth = 200;
4654             //levelpic();
4655         }
4656         else if (plr->score > 75000 && plr->score < 179999 && plr->lvl < 7)
4657         {
4658             StatusMessage(360, "thou art 7th level");
4659             plr->lvl = 7;
4660             //levelpic();
4661         }
4662         else if (plr->score > 180000 && plr->score < 279999 && plr->lvl < 8)
4663         {
4664             StatusMessage(360, "thou art 8th level");
4665             plr->lvl = 8;
4666             //levelpic();
4667         }
4668         else if (plr->score > 280000 && plr->score < 379999 && plr->lvl < 9)
4669         {
4670             StatusMessage(360, "thou art hero");
4671             plr->lvl = 9;
4672             //levelpic();
4673         }
4674     }
4675 }
4676 
checkweapondist(short i,int x,int y,int z,char guntype)4677 int checkweapondist(short i, int x, int y, int z, char guntype)
4678 {
4679     Player* plr = &player[pyrn];
4680 
4681     int length;
4682 
4683     switch (plr->selectedgun)
4684     {
4685         default:
4686         case 0:
4687         case 1:
4688         case 7:
4689         length = 1024;
4690         break;
4691         case 2:
4692         case 3:
4693         case 4:
4694         case 5:
4695         length = 1536;
4696         break;
4697         case 6:
4698         case 8:
4699         case 9:
4700         length = 2048;
4701         break;
4702     }
4703 
4704     if ((labs(x - sprite[i].x) + labs(y - sprite[i].y) < length) && (labs((z >> 8) - ((sprite[i].z >> 8) - (tilesiz[sprite[i].picnum].y >> 1))) <= (length >> 3)))
4705         return 1;
4706     else
4707         return 0;
4708 }
4709 
updatepics()4710 void updatepics()
4711 {
4712 //    score(0);
4713 
4714     if (netgame != 0)
4715     {
4716         if (gametype >= 1)
4717             captureflagpic();
4718         else
4719             fragspic();
4720     }
4721     else {
4722 // TODO        setpotion(plr->currentpotion);
4723     }
4724 
4725     //levelpic();
4726 //    healthpic();
4727 //    armorpic(0);
4728     drawpotionpic();
4729 // TODO    orbpic(currentorb);
4730     keyspic();
4731 }
4732 
4733 extern short teamscore[];
4734 extern short teaminplay[];
4735 
4736 struct capt
4737 {
4738     int x;
4739     int y;
4740     int palnum;
4741 };
4742 
captureflagpic()4743 void captureflagpic()
4744 {
4745     struct capt flag[4] = {{ 260, 161, 0},
4746                            { 286, 161, 10},
4747                            { 260, 176, 11},
4748                            { 286, 176, 12}};
4749 
4750     struct capt sflag[4] = {{ 260, 387, 0},
4751                             { 286, 387, 10},
4752                             { 260, 417, 11},
4753                             { 286, 417, 12}};
4754 
4755     if (svga == 1)
4756     {
4757         // overwritesprite(260<<1,387,SPOTIONBACKPIC,0,0,0);
4758         itemtoscreen(260 << 1, 387, SPOTIONBACKPIC, 0, 0);
4759     }
4760     else
4761     {
4762         // overwritesprite(260,161,POTIONBACKPIC,0,0,0);
4763         itemtoscreen(260, 161, POTIONBACKPIC, 0, 0);
4764     }
4765 
4766     for (int i = 0; i < 4; i++)
4767     {
4768         if (svga == 1)
4769         {
4770             if (teaminplay[i])
4771             {
4772                 overwritesprite((sflag[i].x << 1) + 6, sflag[i].y + 8, STHEFLAG, 0, 0, sflag[i].palnum);
4773                 sprintf(tempbuf, "%d", teamscore[i]);
4774                 fancyfont((sflag[i].x << 1) + 16, sflag[i].y + 16, SPOTIONFONT - 26, tempbuf, 0);
4775             }
4776         }
4777         else
4778         {
4779             if (teaminplay[i])
4780             {
4781                 if (WH2)
4782                 {
4783                     rotatesprite((flag[i].x + 3) << 16, (flag[i].y + 3) << 16,
4784                         65536, 0, THEFLAG, 0, flag[i].palnum, 8 + 16,
4785                         0, 0, xdim - 1, ydim - 1);
4786                 }
4787                 else
4788                 {
4789                     overwritesprite(flag[i].x + 3, flag[i].y + 3, THEFLAG, 0, 0, flag[i].palnum);
4790                 }
4791 
4792                 sprintf(tempbuf, "%d", teamscore[i]);
4793                 fancyfont(flag[i].x + 6, flag[i].y + 6, SMFONT - 26, tempbuf, 0);
4794             }
4795         }
4796     }
4797 }
4798 
fragspic()4799 void fragspic()
4800 {
4801     Player* plr = &player[pyrn];
4802 
4803     if (svga == 1)
4804     {
4805         if (plr->screensize == 320)
4806         {
4807             // overwritesprite(260<<1,387,SPOTIONBACKPIC,0,0,0);
4808             itemtoscreen(260 << 1, 387, SPOTIONBACKPIC, 0, 0);
4809             sprintf(tempbuf, "%d", teamscore[pyrn]);
4810             //overwritesprite(74<<1,406,SHEALTHBACK,0,0,0);
4811             fancyfont((260 << 1) + 10, 387 + 10, SHEALTHFONT - 26, tempbuf, 0);
4812         }
4813     }
4814     else
4815     {
4816         if (plr->screensize <= 320)
4817         {
4818             // overwritesprite(260,161,POTIONBACKPIC,0,0,0);
4819             itemtoscreen(260, 161, POTIONBACKPIC, 0, 0);
4820             sprintf(tempbuf, "%d", teamscore[pyrn]);
4821             //overwritesprite(72,168,HEALTHBACKPIC,0,0,0);
4822             fancyfont(260 + 15, 161 + 5, BGZERO - 26, tempbuf, 0);
4823         }
4824     }
4825 }
4826 
keyspic()4827 void keyspic()
4828 {
4829     Player* plr = &player[pyrn];
4830 
4831     if (svga == 1)
4832     {
4833         if (plr->treasure[14] == 1)
4834             // overwritesprite(242<<1,387,SKEYBRASS,0,0,0);
4835             itemtoscreen(242 << 1, 387, SKEYBRASS, 0, 0);
4836         else
4837             // overwritesprite(242<<1,387,SKEYBLANK,0,0,0);
4838             itemtoscreen(242 << 1, 387, SKEYBLANK, 0, 0);
4839 
4840         if (plr->treasure[15] == 1)
4841             // overwritesprite(242<<1,408,SKEYBLACK,0,0,0);
4842             itemtoscreen(242 << 1, 408, SKEYBLACK, 0, 0);
4843         else
4844             // overwritesprite(242<<1,408,SKEYBLANK,0,0,0);
4845             itemtoscreen(242 << 1, 408, SKEYBLANK, 0, 0);
4846 
4847         if (plr->treasure[16] == 1)
4848             // overwritesprite(242<<1,430,SKEYGLASS,0,0,0);
4849             itemtoscreen(242 << 1, 430, SKEYGLASS, 0, 0);
4850         else
4851             // overwritesprite(242<<1,430,SKEYBLANK,0,0,0);
4852             itemtoscreen(242 << 1, 430, SKEYBLANK, 0, 0);
4853 
4854         if (plr->treasure[17] == 1)
4855             // overwritesprite(242<<1,452,SKEYIVORY,0,0,0);
4856             itemtoscreen(242 << 1, 452, SKEYIVORY, 0, 0);
4857         else
4858             // overwritesprite(242<<1,452,SKEYBLANK,0,0,0);
4859             itemtoscreen(242 << 1, 452, SKEYBLANK, 0, 0);
4860     }
4861     else
4862     {
4863         if (plr->treasure[14] == 1)
4864             // overwritesprite(242,160,KEYBRASS,0,0,0);
4865             itemtoscreen(242, 160, KEYBRASS, 0, 0);
4866         else
4867             // overwritesprite(242,160,KEYBLANK,0,0,0);
4868             itemtoscreen(242, 160, KEYBLANK, 0, 0);
4869 
4870         if (plr->treasure[15] == 1)
4871             // overwritesprite(242,169,KEYBLACK,0,0,0);
4872             itemtoscreen(242, 169, KEYBLACK, 0, 0);
4873         else
4874             // overwritesprite(242,169,KEYBLANK,0,0,0);
4875             itemtoscreen(242, 169, KEYBLANK, 0, 0);
4876 
4877         if (plr->treasure[16] == 1)
4878             // overwritesprite(242,178,KEYGLASS,0,0,0);
4879             itemtoscreen(242, 178, KEYGLASS, 0, 0);
4880         else
4881             // overwritesprite(242,178,KEYBLANK,0,0,0);
4882             itemtoscreen(242, 178, KEYBLANK, 0, 0);
4883 
4884         if (plr->treasure[17] == 1)
4885             // overwritesprite(242,187,KEYIVORY,0,0,0);
4886             itemtoscreen(242, 187, KEYIVORY, 0, 0);
4887         else
4888             // overwritesprite(242,187,KEYBLANK,0,0,0);
4889             itemtoscreen(242, 187, KEYBLANK, 0, 0);
4890     }
4891 }
4892 
adjustscore(int score)4893 int adjustscore(int score)
4894 {
4895     float factor;
4896 
4897     factor = (krand() % 20) / 100;
4898 
4899     if (krand() % 100 > 50)
4900         return(score * (factor + 1));
4901     else
4902         return(score - (score * (factor)));
4903 }
4904 
lvlspellcheck(Player * plr)4905 int lvlspellcheck(Player* plr)
4906 {
4907     int legal = 0;
4908 
4909     if (WH2)
4910     {
4911         legal = 1;
4912         return legal;
4913     }
4914 
4915     switch (plr->currentorb)
4916     {
4917         case 0:
4918             legal = 1;
4919         break;
4920         case 1:
4921             legal = 1;
4922         break;
4923         case 2:
4924             if (plr->lvl > 1)
4925                 legal = 1;
4926             else
4927                 StatusMessage(360, "must attain 2nd level");
4928         break;
4929         case 3:
4930             if (plr->lvl > 1)
4931                 legal = 1;
4932             else
4933                 StatusMessage(360, "must attain 2nd level");
4934         break;
4935         case 4:
4936         case 5:
4937             if (plr->lvl > 2)
4938                 legal = 1;
4939             else
4940                 StatusMessage(360, "must attain 3rd level");
4941         break;
4942         case 6:
4943             if (plr->lvl > 3)
4944                 legal = 1;
4945             else
4946                 StatusMessage(360, "must attain 4th level");
4947         break;
4948         case 7:
4949             if (plr->lvl > 4)
4950                 legal = 1;
4951             else
4952                 StatusMessage(360, "must attain 5th level");
4953         break;
4954     }
4955 
4956     return legal;
4957 }
4958 
gronmissile(int s)4959 void gronmissile(int s)
4960 {
4961     Player* plr = &player[pyrn];
4962 
4963     short daang = (sprite[s].ang - 36) & kAngleMask;
4964 
4965     for (int k = 0; k < 10; k++)
4966     {
4967         daang = (daang + (k << 1)) & kAngleMask;
4968 
4969         int32_t j = insertsprite(sprite[s].sectnum, MISSILE);
4970         sprite[j].x = sprite[s].x;
4971         sprite[j].y = sprite[s].y;
4972         sprite[j].z = sprite[s].z + (8 << 8) + ((krand() & 10) << 8);
4973         sprite[j].cstat = 0;
4974         sprite[j].picnum = PLASMA;
4975         sprite[j].shade = -32;
4976         sprite[j].pal = 0;
4977         sprite[j].xrepeat = 16;
4978         sprite[j].yrepeat = 16;
4979         sprite[j].ang = daang;
4980         sprite[j].xvel = Cos(daang + 2048) >> 5;
4981         sprite[j].yvel = Sin(daang + 2048) >> 5;
4982 
4983         int32_t discrim = ksqrt((plr->x - sprite[s].x) * (plr->x - sprite[s].x)
4984             + (plr->y - sprite[s].y) * (plr->y - sprite[s].y));
4985 
4986         if (discrim == 0)
4987             discrim = 1;
4988 
4989         sprite[j].zvel = (((plr->z + (8 << 8)) - sprite[s].z) << 7) / discrim;
4990         sprite[j].owner = s;
4991         sprite[j].lotag = 256;
4992         sprite[j].hitag = 0;
4993         sprite[j].clipdist = 48;
4994     }
4995 }
4996 
displayspelltext()4997 void displayspelltext()
4998 {
4999     Player* plr = &player[pyrn];
5000 
5001     switch (plr->currentorb)
5002     {
5003         case 0:
5004         StatusMessage(360, "scare spell");
5005         break;
5006         case 1:
5007         StatusMessage(360, "night vision spell");
5008         break;
5009         case 2:
5010         StatusMessage(360, "freeze spell");
5011         break;
5012         case 3:
5013         StatusMessage(360, "magic arrow spell");
5014         break;
5015         case 4:
5016         StatusMessage(360, "open door spell");
5017         break;
5018         case 5:
5019         StatusMessage(360, "fly spell");
5020         break;
5021         case 6:
5022         StatusMessage(360, "fireball spell");
5023         break;
5024         case 7:
5025         StatusMessage(360, "nuke spell");
5026         break;
5027     }
5028 }
5029 
painsound(int xplc,int yplc)5030 void painsound(int xplc, int yplc)
5031 {
5032     playsound_loc(S_BREATH1+(rand()%6),xplc,yplc);
5033 }
5034 
inView(Player * plr,int i)5035 int inView(Player* plr, int i)
5036 {
5037     short a = getangle(sprite[i].x - plr->x, sprite[i].y - plr->y);
5038 
5039     if ((a < plr->ang && plr->ang - a < 256) ||
5040         (a >= plr->ang && ((plr->ang + a) & kAngleMask) < 256))
5041     {
5042         return 1;
5043     }
5044     return 0;
5045 }
5046