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