|
|
1.1 root 1: /***************************************************************************
2: * WHNET.C - Witchaven network module & multiplayer code *
3: * *
4: * - Les Bird 07/12/95 *
5: ***************************************************************************/
6:
7: //#define SERIAL1LIB
8: //#define DEBUGOUTPUT
9: //#define MPLAYERCOMPILE
10:
11: #include "icorp.h"
12: #include "time.h"
13:
14: #include "hmistd.h"
15: #include "netnow.h"
16:
17: #ifdef MPLAYERCOMPILE
18: #define __WITCHAVEN__
19: #include "rtq.h"
20: #include "lpc.h"
21: #include "mplib.h"
22: #endif
23:
24: #ifdef SERIAL1LIB
25: #include "serial.h"
26: #endif
27:
28: #define MAXDATASIZE 255
29: #define MAXTEAMS 4
30:
31: #define TEAMFLAG 2232
32:
33: #define TEAM1SECTOR 15
34: #define TEAM2SECTOR 16
35: #define TEAM3SECTOR 17
36: #define TEAM4SECTOR 18
37:
38: #define TEAM1FLAG 1
39: #define TEAM2FLAG 2
40: #define TEAM3FLAG 3
41: #define TEAM4FLAG 4
42:
43: #define TEAM1PAL 0
44: #define TEAM2PAL 10
45: #define TEAM3PAL 11
46: #define TEAM4PAL 12
47:
48: #ifdef MPLAYERCOMPILE
49: // mplayer net game
50: #define MPLAYERGAME 4
51: #define FREEQUEUE 0
52: #define DOSWORKQUEUE 1
53: #define WINSENDQUEUE 3
54: #define DOSPENDINGQUEUE 4
55:
56: RTQ_NODE *MasterNode;
57: #endif
58:
59: char netmsg[80],
60: plrindex[256],
61: tagindex[MAXPLAYERS],
62: tempbuf[576];
63:
64: int netgame,
65: netinitialized;
66:
67: //#pragma pack(1)
68:
69: struct netnowhdr {
70: DWORD seq; // NETNOW reserved
71: _NETNOW_NODE_ADDR netadr;
72: };
73:
74: struct netpck {
75: char tagno; // players random tag number
76: WORD node; // NETNOW node number
77: char enemytype; // monster this player chose
78: char teamno; // team this player chose
79: char weap; // weapon being carried
80: short score; // player's score (team or head to head)
81: long x,
82: y,
83: z; // x,y,z for this player
84: short ang; // player's angle
85: short horiz; // aiming horizontal
86: signed char action; // action being performed
87: char taghit; // player tag that was hit
88: char guntype; // weapon in use
89: char mapon; // map player is on
90: char gametype; // game this player has selected
91: char hasflag; // player is carrying a team flag
92: } netpck[MAXPLAYERS],
93: othnetpck,
94: sndnetpck;
95:
96: struct msgpck {
97: char team;
98: char msg[80];
99: };
100:
101: struct mdmpck {
102: char hdr[4];
103: char src;
104: char dest;
105: char len;
106: struct netpck data;
107: } mdmsndpck,
108: mdmrcvpck;
109:
110: #pragma pack()
111:
112: #ifdef SERIAL1LIB
113: serialData sd;
114: #endif
115:
116: _NETNOW_NODE_ADDR myadr,
117: othadr[MAXPLAYERS];
118:
119:
120: WORD enemytype,
121: gametype,
122: mynode,
123: playersingame;
124:
125: BYTE killedby = 0,
126: myrandomtag = 255;
127:
128: short comp;
129:
130: short debugnet,
131: dropflag,
132: ihaveflag,
133: myteam,
134: teamcolor[MAXTEAMS] = {TEAM1PAL, TEAM2PAL, TEAM3PAL, TEAM4PAL},
135: teamflagsprite[MAXTEAMS],
136: teaminplay[MAXPLAYERS],
137: teamscore[MAXPLAYERS],
138: xmit = 1;
139:
140: long bps = 9600L,
141: netstartx,
142: netstarty,
143: netstartz,
144: netstarts,
145: numrpcks[MAXPLAYERS],
146: numspcks[MAXPLAYERS],
147: teamflagstartx[MAXTEAMS],
148: teamflagstarty[MAXTEAMS],
149: teamflagstartz[MAXTEAMS],
150: totrhdrs,
151: totrpcks,
152: totspcks;
153:
154: int enempics[] = {
155: // 737, // kobold
156: // 777, // devil
157: // 821, // fat witch
158: // 922, // goblin
159: // 981, // minotaur
160: // 1028, // skull witch
161: GRONHAL, // grondeval halberd
162: GRONSW, // grondeval halberd
163: GRONMU // grondeval halberd
164: };
165:
166: int xreps[] = {
167: // 54, // kobold
168: // 32, // devil
169: // 32, // fat witch
170: // 32, // goblin
171: // 32, // minotaur
172: // 32, // skull witch
173: GRONHALXR,
174: GRONSWXR,
175: GRONMUXR
176: };
177:
178: int yreps[] = {
179: // 54, // kobold
180: // 36, // devil
181: // 32, // fat witch
182: // 36, // goblin
183: // 64, // minotaur
184: // 64, // skull witch
185: GRONHALYR,
186: GRONSWXR,
187: GRONMUXR
188: };
189:
190: int enemheights[] = {
191: // 45,
192: // 50,
193: // 40,
194: // 35,
195: // 40,
196: // 55,
197: 40,
198: 40,
199: 40
200: };
201:
202: #define MAXARGS 10
203:
204: char *argparm[] = {
205: "MAP",
206: "CYBERMAXX",
207: "NET",
208: "MODEM",
209: "SERIAL",
210: "DEBUGNET",
211: "IGLASSES",
212: "MPLAYER",
213: "VFX1",
214: "LOCAL"
215: };
216:
217: char *monsternames[] = {
218: // "Kobold",
219: // "Devil",
220: // "Fat Witch",
221: // "Goblin",
222: // "Minotaur",
223: // "Skull Witch",
224: "Red",
225: "Blue",
226: "Purple",
227: "Brown"
228: };
229:
230: char *teamcolorstrings[] = {
231: "RED",
232: "BLUE",
233: "PURPLE",
234: "BROWN"
235: };
236:
237: #define NUMGAMES 3
238:
239: char *gamenames[] = {
240: "Head to Head",
241: "Capture the Flag 21",
242: "Capture the Flag 7"
243: };
244:
245: char *mapnames[] = {
246: "War Temple of Abu",
247: "The Abyssal Pit",
248: "Maze of Midan",
249: "Cave of Chaos",
250: "Lord Verkapherons Castle"
251: };
252:
253: short mapnumbers[] = {
254: 30, 31, 32, 33, 34
255: };
256:
257: int comadr[] = {
258: 0x000, 0x3F8, 0x2F8, 0x3E8, 0x2E8
259: };
260:
261: extern
262: int cyberenabled,
263: mapflag,
264: mapon;
265:
266: extern
267: int playerdie;
268:
269: extern
270: int currweapon,
271: currweaponfired,
272: escapetomenu,
273: gameactivated;
274:
275: void whnetmon(void);
276:
277: extern
278: int oldvmode;
279:
280: extern
281: long selectedgun;
282:
283: #ifdef DEBUGOUTPUT
284: FILE *dbgfp;
285: #endif
286:
287: #if 0
288: void (interrupt far * oldGPhandler) ();
289: void (interrupt far * oldPGhandler) ();
290:
291: #pragma aux gpsetmode=\
292: "int 10h", \
293: parm [eax] \
294:
295: void gpsetmode(short);
296:
297: void interrupt far
298: newGPhandler(union INTPACK r)
299: {
300: gpsetmode(oldvmode);
301: _chain_intr(oldGPhandler);
302: }
303:
304: void interrupt far
305: newPGhandler(union INTPACK r)
306: {
307: gpsetmode(oldvmode);
308: _chain_intr(oldPGhandler);
309: }
310:
311: void far *
312: dpmi_getexception(int no)
313: {
314: void far *fp;
315: union REGS regs;
316:
317: regs.x.eax = 0x202;
318: regs.x.ebx = no;
319: int386(0x31, ®s, ®s);
320: fp = MK_FP(regs.w.cx, regs.x.edx);
321: return (fp);
322: }
323:
324: void
325: dpmi_setexception(int no, void far * func)
326: {
327: union REGS regs;
328:
329: regs.x.eax = 0x203;
330: regs.x.ebx = no;
331: regs.x.ecx = FP_SEG(func);
332: regs.x.edx = FP_OFF(func);
333: int386(0x31, ®s, ®s);
334: }
335:
336: void
337: installGPhandler(void)
338: {
339: // fprintf(stdaux, "intstall gphandlet\r\n");
340:
341: oldGPhandler = (void interrupt far *) dpmi_getexception(0x0D);
342: oldPGhandler = (void interrupt far *) dpmi_getexception(0x0E);
343: dpmi_setexception(0x0D, (void far *) newGPhandler);
344: dpmi_setexception(0x0E, (void far *) newPGhandler);
345: }
346: #endif
347:
348: #ifdef DEBUGOUTPUT
349: void
350: debugout(char *fmt,...)
351: {
352: va_list argptr;
353:
354: va_start(argptr, fmt);
355: vfprintf(dbgfp, fmt, argptr);
356: va_end(argptr);
357: }
358: #else
359: void
360: debugout(char *fmt,...)
361: {
362: va_list argptr;
363:
364: va_start(argptr, fmt);
365: vsprintf(netmsg, fmt, argptr);
366: va_end(argptr);
367: }
368: #endif
369:
370: extern
371: unsigned vixen;
372:
373: void
374: netcheckargs(int argc, char *argv[])
375: {
376: int i,
377: j;
378:
379: // fprintf(stdaux, "netcheckargs\r\n");
380:
381: i = 1;
382: do {
383: strupr(argv[i]);
384: for (j = 0; j < MAXARGS; j++) {
385: if (stricmp(argv[i], argparm[j]) == 0) {
386: switch (j) {
387: case 0: // map number
388: mapon = atoi(argv[i + 1]);
389: mapflag = 1;
390: i++;
391: break;
392: case 1: // cybermax
393: cyberenabled = atoi(argv[i + 1]);
394: break;
395: case 2: // network
396: netgame = 1;
397: break;
398: case 3: // modem
399: netgame = 2;
400: break;
401: case 4: // direct serial
402: netgame = 3;
403: break;
404: case 5:
405: debugnet = 1;
406: break;
407: case 6:
408: iglassenabled = atoi(argv[i + 1]);
409: break;
410: #ifdef MPLAYERCOMPILE
411: case 7:
412: netgame = MPLAYERGAME;
413: break;
414: #endif
415: case 8:
416: vfx1_init();
417: break;
418: case 9:
419: _dos_getdrive((unsigned *)&vixen);
420: break;
421: }
422: }
423: }
424: i++;
425: } while (i < argc);
426: }
427:
428: int
429: netattacking(short p)
430: {
431: // fprintf(stdaux, "netattacking\r\n");
432:
433: if (netpck[p].action == KEYFIRE) {
434: return (1);
435: }
436: return (0);
437: }
438:
439: void
440: netsendpck(struct netpck * p, WORD dnode)
441: {
442: BOOL rc;
443: short i;
444: char *dptr;
445: struct netnowhdr hdr;
446:
447: // fprintf(stdaux, "netsendpck\r\n");
448:
449: switch (netgame) {
450: case 1:
451: memmove(&hdr.netadr, &myadr, sizeof(_NETNOW_NODE_ADDR));
452: memmove(&othadr[plrindex[myrandomtag]], &myadr,
453: sizeof(_NETNOW_NODE_ADDR));
454: rc = hmiNETNOWSendData((PSTR) & hdr, sizeof(struct netnowhdr),
455: (PSTR) p, sizeof(struct netpck), dnode);
456: if (rc == _FALSE) {
457: crash("netsendpck: XMT queue full");
458: }
459: break;
460: case 2:
461: case 3:
462: mdmsndpck.hdr[0] = 0x01;
463: mdmsndpck.hdr[1] = 0x02;
464: mdmsndpck.hdr[2] = 0x03;
465: mdmsndpck.hdr[3] = 0x21;
466: mdmsndpck.src = mynode;
467: mdmsndpck.dest = dnode;
468: mdmsndpck.len = sizeof(struct netpck);
469: dptr = (char *) &mdmsndpck;
470: memmove(&mdmsndpck.data, p, sizeof(struct netpck));
471: #ifdef SERIAL1LIB
472: for (i = 0; i < sizeof(struct mdmpck); i++) {
473: writeSer(&sd, dptr[i]);
474: }
475: #else
476: sendpacket(0, dptr, sizeof(struct mdmpck));
477: #endif
478: break;
479: #ifdef MPLAYERCOMPILE
480: case MPLAYERGAME:{
481: RTQ_NODE *n;
482:
483: // grab free buffer
484: while ((n = MGenMoveTo(FREEQUEUE, DOSWORKQUEUE)) == 0) {
485: // MGenFlushNodes(WINSENDQUEUE, FREEQUEUE);
486: // MGenFlushNodes(DOSPENDINGQUEUE, FREEQUEUE);
487: MGenWakeupDll();
488: Yield();
489: // return;
490: }
491:
492: // here's what we want to send
493: memcpy(n->rtqDatum, p, sizeof(struct netpck));
494: n->rtqUpCtr = sizeof(struct netpck);
495:
496: // put it into Windows queue
497: MGenMoveTo(DOSWORKQUEUE, WINSENDQUEUE);
498: PostWindowsMessage();
499: Yield();
500: }
501: break;
502: #endif
503: }
504: numspcks[plrindex[myrandomtag]]++;
505: totspcks++;
506: }
507:
508: short
509: netchecktouchflag(struct player * plr)
510: {
511: short i,
512: j;
513:
514: // fprintf(stdaux, "netchecktouchflag\r\n");
515: if (gametype < 1) {
516: return (0);
517: }
518: if (ihaveflag) {
519: return (ihaveflag);
520: }
521: i = headspritesect[plr->sector];
522: while (i != -1) {
523: j = nextspritesect[i];
524: if (labs(plr->x - sprite[i].x) + labs(plr->y - sprite[i].y) < 512
525: && labs((plr->z >> 8) - ((sprite[i].z >> 8) - (tilesizy[sprite[i].picnum] >> 1))) <= 40) {
526: switch (sprite[i].picnum) {
527: case TEAMFLAG:
528: switch (sprite[i].pal) {
529: case TEAM1PAL:
530: SND_Sound(S_POTION1);
531: return (1);
532: case TEAM2PAL:
533: SND_Sound(S_POTION1);
534: return (2);
535: case TEAM3PAL:
536: SND_Sound(S_POTION1);
537: return (3);
538: case TEAM4PAL:
539: SND_Sound(S_POTION1);
540: return (4);
541: }
542: break;
543: }
544: }
545: i = j;
546: }
547: return (0);
548: }
549:
550: void
551: netmarkflag(short i)
552: {
553: // fprintf(stdaux, "netmarkflag\r\n");
554:
555: if (gametype < 1) {
556: deletesprite(i);
557: return;
558: }
559: switch (sprite[i].pal) {
560: case TEAM1PAL:
561: teamflagsprite[0] = i;
562: teamflagstartx[0] = sprite[i].x;
563: teamflagstarty[0] = sprite[i].y;
564: teamflagstartz[0] = sprite[i].z;
565: break;
566: case TEAM2PAL:
567: teamflagsprite[1] = i;
568: teamflagstartx[1] = sprite[i].x;
569: teamflagstarty[1] = sprite[i].y;
570: teamflagstartz[1] = sprite[i].z;
571: break;
572: case TEAM3PAL:
573: teamflagsprite[2] = i;
574: teamflagstartx[2] = sprite[i].x;
575: teamflagstarty[2] = sprite[i].y;
576: teamflagstartz[2] = sprite[i].z;
577: break;
578: case TEAM4PAL:
579: teamflagsprite[3] = i;
580: teamflagstartx[3] = sprite[i].x;
581: teamflagstarty[3] = sprite[i].y;
582: teamflagstartz[3] = sprite[i].z;
583: break;
584: }
585: sprite[i].xrepeat = 24;
586: sprite[i].yrepeat = 24;
587: }
588:
589: void
590: moveflag(long x, long y, long z, long teamno)
591: {
592: short s;
593:
594: // fprintf(stdaux, "moveflag\r\n");
595:
596: if (teamno > 0) {
597: s = teamflagsprite[teamno - 1];
598: if (s >= 0) {
599: setsprite(s, x, y, z + (16 << 8));
600: }
601: }
602: }
603:
604: #define TIMER_RESOLUTION 250
605:
606: void
607: sendmyinfo(WORD dnode, short forcesend)
608: {
609: short p;
610: struct player *plr;
611:
612: if (!forcesend) {
613: static clock_t t;
614: clock_t n;
615:
616: if (t < (n = (clock() + TIMER_RESOLUTION)))
617: t = n;
618: else
619: return;
620: }
621:
622: plr = &player[0];
623: plr->lvl = 9;
624: updatesector(plr->x, plr->y, &plr->sector);
625: ihaveflag = netchecktouchflag(plr);
626: sndnetpck.tagno = myrandomtag;
627: sndnetpck.node = mynode;
628: sndnetpck.enemytype = enemytype;
629: sndnetpck.x = plr->x;
630: sndnetpck.y = plr->y;
631: sndnetpck.z = plr->z;
632: sndnetpck.ang = plr->ang;
633: sndnetpck.horiz = plr->horiz;
634: sndnetpck.mapon = mapon;
635: sndnetpck.gametype = gametype;
636: sndnetpck.teamno = myteam;
637: sndnetpck.weap = currweapon;
638: sndnetpck.hasflag = ihaveflag;
639: if (gametype >= 1) {
640: sndnetpck.score = teamscore[myteam];
641: }
642: else {
643: sndnetpck.score = teamscore[0];
644: }
645: if (gametype >= 1) {
646: teaminplay[myteam] = 1;
647: captureflagpic();
648: }
649: if (playerdie) {
650: sndnetpck.action = -1;
651: sndnetpck.taghit = killedby;
652: killedby = 0;
653: if (ihaveflag) {
654: if (teamflagsprite[ihaveflag - 1] >= 0) {
655: sprite[teamflagsprite[ihaveflag - 1]].cstat &= ~32768;
656: }
657: }
658: ihaveflag = 0;
659: }
660: else if (dropflag) {
661: dropflag = 0;
662: sndnetpck.action = -2;
663: sprite[teamflagsprite[ihaveflag - 1]].cstat &= ~32768;
664: if (ihaveflag - 1 == myteam) {
665: netmarkflag(teamflagsprite[ihaveflag - 1]);
666: }
667: ihaveflag = 0;
668: }
669: else {
670: if (ihaveflag) {
671: moveflag(plr->x, plr->y, plr->z, ihaveflag);
672: if (teamflagsprite[ihaveflag - 1] >= 0) {
673: sprite[teamflagsprite[ihaveflag - 1]].cstat |= 32768;
674: }
675: }
676: if (currweaponfired) {
677: sndnetpck.action = KEYFIRE;
678: }
679: }
680: if (forcesend
681: || memcmp(&sndnetpck, &netpck[0], sizeof(struct netpck)) != 0) {
682: memmove(&netpck[0], &sndnetpck, sizeof(struct netpck));
683: #if 0
684: if (forcesend) {
685: sprintf(netmsg, "PCKT FORCED");
686: }
687: else {
688: sprintf(netmsg, "PCKT DIFFERENT");
689: }
690: #endif
691: switch (netgame) {
692: case 1:
693: netsendpck(&sndnetpck, dnode);
694: break;
695: case 2:
696: case 3:
697: netsendpck(&sndnetpck, 255);
698: break;
699: #ifdef MPLAYERCOMPILE
700: case MPLAYERGAME:
701: netsendpck(&sndnetpck, 255);
702: break;
703: #endif
704: }
705: }
706: #if 0
707: else {
708: sprintf(netmsg, "PCKT NOT SENT");
709: }
710: #endif
711: if (gametype >= 1 && ihaveflag) {
712: switch (sector[plr->sector].lotag) {
713: case TEAM1SECTOR:
714: switch (ihaveflag) {
715: case TEAM2FLAG:
716: case TEAM3FLAG:
717: case TEAM4FLAG:
718: if (teaminplay[ihaveflag - 1]) {
719: teamscore[TEAM1FLAG - 1] += 1;
720: playsound_loc(S_DROPFLAG, netpck[p].x, netpck[p].y);
721: // if (teamscore[ihaveflag-1] > 0) {
722: // teamscore[ihaveflag-1]--;
723: // }
724: }
725: dolevelmusic(rand()%10);
726: break;
727: }
728: dropflagstart(ihaveflag);
729: captureflagpic();
730: if (teamflagsprite[ihaveflag - 1] >= 0) {
731: sprite[teamflagsprite[ihaveflag - 1]].cstat &= ~32768;
732: }
733: ihaveflag = 0;
734: break;
735: case TEAM2SECTOR:
736: switch (ihaveflag) {
737: case TEAM1FLAG:
738: case TEAM3FLAG:
739: case TEAM4FLAG:
740: if (teaminplay[ihaveflag - 1]) {
741: teamscore[TEAM2FLAG - 1] += 1;
742: playsound_loc(S_DROPFLAG, netpck[p].x, netpck[p].y);
743: // if (teamscore[ihaveflag-1] > 0) {
744: // teamscore[ihaveflag-1]--;
745: // }
746: }
747: dolevelmusic(rand()%10);
748: break;
749: }
750: dropflagstart(ihaveflag);
751: captureflagpic();
752: if (teamflagsprite[ihaveflag - 1] >= 0) {
753: sprite[teamflagsprite[ihaveflag - 1]].cstat &= ~32768;
754: }
755: ihaveflag = 0;
756: break;
757: case TEAM3SECTOR:
758: switch (ihaveflag) {
759: case TEAM1FLAG:
760: case TEAM2FLAG:
761: case TEAM4FLAG:
762: if (teaminplay[ihaveflag - 1]) {
763: teamscore[TEAM3FLAG - 1] += 1;
764: playsound_loc(S_DROPFLAG, netpck[p].x, netpck[p].y);
765: // if (teamscore[ihaveflag-1] > 0) {
766: // teamscore[ihaveflag-1]--;
767: // }
768: }
769: dolevelmusic(rand()%10);
770: break;
771: }
772: dropflagstart(ihaveflag);
773: captureflagpic();
774: if (teamflagsprite[ihaveflag - 1] >= 0) {
775: sprite[teamflagsprite[ihaveflag - 1]].cstat &= ~32768;
776: }
777: ihaveflag = 0;
778: break;
779: case TEAM4SECTOR:
780: switch (ihaveflag) {
781: case TEAM1FLAG:
782: case TEAM2FLAG:
783: case TEAM3FLAG:
784: if (teaminplay[ihaveflag - 1]) {
785: teamscore[TEAM4FLAG - 1] += 1;
786: playsound_loc(S_DROPFLAG, netpck[p].x, netpck[p].y);
787: // if (teamscore[ihaveflag-1] > 0) {
788: // teamscore[ihaveflag-1]--;
789: // }
790: }
791: dolevelmusic(rand()%10);
792: break;
793: }
794: dropflagstart(ihaveflag);
795: captureflagpic();
796: if (teamflagsprite[ihaveflag - 1] >= 0) {
797: sprite[teamflagsprite[ihaveflag - 1]].cstat &= ~32768;
798: }
799: ihaveflag = 0;
800: break;
801: }
802: }
803: }
804:
805: void
806: netjoingame(void)
807: { // announce that we've entered the game
808: int i;
809: FILE *fp;
810:
811: // fprintf(stdaux, "netjoingame\r\n");
812: #ifdef MPLAYERCOMPILE
813: if (netgame > 1 && netgame != MPLAYERGAME) {
814: #else
815: if (netgame > 1) {
816: #endif
817: for (i = 0; i < 256; i++) {
818: plrindex[i] = 255;
819: }
820: for (i = 0; i < MAXTEAMS; i++) {
821: teaminplay[i] = 0;
822: teamscore[i] = 0;
823: }
824: }
825: for (i = 0; i < MAXPLAYERS; i++) {
826: netpck[i].hasflag = 0;
827: }
828: ihaveflag = 0;
829: switch (netgame) {
830: case 1:
831: myrandomtag = myadr.sIPX.bImmediate[5];
832: mynode = hmiNETNOWGetConsoleNode();
833: playersingame = hmiNETNOWGetActiveNodes();
834: plrindex[myrandomtag] = 0;
835: tagindex[0] = myrandomtag;
836: for (i = 0; i < _NETNOW_MAX_LISTEN_PACKETS; i++) {
837: hmiNETNOWPostListen();
838: }
839: break;
840: case 2:
841: case 3:
842: mynode = 0;
843: if (myrandomtag == 255) {
844: srand(clock());
845: do {
846: myrandomtag = rand() & 255;
847: } while (myrandomtag == 255);
848: fp = fopen("tag.dat", "wb");
849: if (fp != NULL) {
850: fwrite(&myrandomtag, sizeof(myrandomtag), 1, fp);
851: fclose(fp);
852: }
853: }
854: plrindex[myrandomtag] = 0;
855: tagindex[0] = myrandomtag;
856: playersingame = 1;
857: break;
858: #ifdef MPLAYERCOMPILE
859: case MPLAYERGAME:
860: mynode = 0;
861: myrandomtag = LPCGetMPAddr() - 1;
862: if (myrandomtag == -1)
863: crash("MPAddr invalid!");
864: plrindex[myrandomtag] = 0;
865: tagindex[0] = myrandomtag;
866: playersingame = 1;
867: break;
868: #endif
869: }
870: sendmyinfo(_NETNOW_BROADCAST, 1);
871: SND_Sound(S_DROPFLAG);
872: }
873:
874: void
875: netsendmove(void)
876: {
877: short p;
878: static long sendclock = 0L;
879:
880: // fprintf(stdaux, "netsendmove\r\n");
881:
882: if (netgame == 0) {
883: return;
884: }
885: if (netgame == 1) {
886: sendmyinfo(_NETNOW_BROADCAST, 0);
887: // for (p=0 ; p < playersingame ; p++) {
888: // if (mynode != p || playersingame == 1) {
889: // sendmyinfo(p,0);
890: // }
891: // }
892: }
893: #ifdef MPLAYERCOMPILE
894: else if (netgame == MPLAYERGAME) {
895: sendmyinfo(_NETNOW_BROADCAST, 0);
896: }
897: #endif
898: else if (xmit) {
899: if (playersingame > 1) {
900: sendmyinfo(255, 1);
901: }
902: else if (totalclock >= sendclock) {
903: sendclock = totalclock + (CLKIPS * 4);
904: sendmyinfo(255, 1);
905: }
906: }
907: memset(&sndnetpck, 0, sizeof(struct netpck));
908: }
909:
910: void
911: netshootgun(short s, char guntype)
912: {
913: short p;
914:
915: // fprintf(stdaux, "netshootgun\r\n");
916:
917: sndnetpck.guntype = guntype;
918: if (s != -1) {
919: for (p = 0; p < playersingame; p++) {
920: if (player[p].spritenum == s) {
921: sndnetpck.taghit = tagindex[p];
922: break;
923: }
924: }
925: }
926: else {
927: sndnetpck.taghit = myrandomtag;
928: }
929: netsendmove();
930: }
931:
932: void
933: netdamageactor(short s, short o)
934: {
935: int val;
936:
937: // fprintf(stdaux, "netdamageactor\r\n");
938:
939: if (player[0].spritenum == s) {
940: switch (sprite[o].picnum) {
941: case PLASMA:
942: val = (krand() & 0x07);
943: break;
944: case MONSTERBALL:
945: val = (krand() & 0x7F);
946: break;
947: case BULLET:
948: case THROWPIKE:
949: val = (krand() & 0x7F);
950: break;
951: }
952: if (shieldpoints > 0 && selectedgun < 5) {
953: val >>= 1;
954: shieldpoints -= val >> 1;
955: }
956: healthpic(-(val));
957: if (player[0].health <= 0) {
958: killedby = netpck[sprite[o].owner - 4096].tagno;
959: }
960: }
961: }
962:
963: void
964: nethitsprite(short p, char guntype, char taghit)
965: {
966: short daang,
967: hitsect,
968: hitsprite,
969: hitwall,
970: i,
971: j,
972: k;
973: long dax,
974: day,
975: hitx,
976: hity,
977: hitz;
978: struct player *myplr,
979: *plr;
980:
981: // fprintf(stdaux, "nethitsprite\r\n");
982:
983: plr = &player[p];
984: myplr = &player[0];
985: // sprintf(netmsg,"HIT TAG %d WITH %d",taghit,guntype);
986: if (guntype == 5) {
987: daang = plr->ang;
988: hitscan(plr->x, plr->y, plr->z, plr->sector,
989: sintable[(daang + 512) & 2047],
990: sintable[daang],
991: (100 - plr->horiz) * 2000,
992: &hitsect, &hitwall, &hitsprite, &hitx, &hity, &hitz);
993: if (hitwall >= 0 && hitsprite < 0) {
994: neartag(hitx, hity, hitz, hitsect, daang,
995: &neartagsector, &neartagwall, &neartagsprite,
996: &neartaghitdist, 1024);
997: if (neartagsector < 0) {
998: if (sector[neartagsector].lotag == 0) {
999: j = insertsprite(hitsect, 0);
1000: sprite[j].x = hitx;
1001: sprite[j].y = hity;
1002: sprite[j].z = hitz + (8 << 8);
1003: sprite[j].cstat = 17; // was16
1004: sprite[j].picnum = WALLARROW;
1005: sprite[j].shade = 0;
1006: sprite[j].pal = 0;
1007: sprite[j].xrepeat = 16;
1008: sprite[j].yrepeat = 48;
1009: sprite[j].ang = ((daang + 2048) - 512 + (rand() & 128 - 64)) & 2047;
1010: sprite[j].xvel = 0;
1011: sprite[j].yvel = 0;
1012: sprite[j].zvel = 0;
1013: sprite[j].owner = 4096;
1014: sprite[j].lotag = 32;
1015: sprite[j].hitag = 0;
1016: }
1017: }
1018: }
1019: }
1020: switch (guntype) {
1021: case 0:
1022: playsound_loc(S_SOCK1 + rand() % 4, plr->x, plr->y);
1023: break;
1024: case 1:
1025: if (rand() % 2) {
1026: playsound_loc(S_GORE1 + rand() % 4, plr->x, plr->y);
1027: }
1028: break;
1029: case 2:
1030: playsound_loc(S_SWORDCLINK1 + rand() % 4, plr->x, plr->y);
1031: break;
1032: case 3:
1033: playsound_loc(S_SOCK1 + rand() % 4, plr->x, plr->y);
1034: break;
1035: case 4:
1036: playsound_loc(S_SWORD1 + rand() % 6, plr->x, plr->y);
1037: break;
1038: case 5:
1039: playsound_loc(S_SWORD1 + rand() % 2, plr->x, plr->y);
1040: break;
1041: case 6:
1042: playsound_loc(S_SWORD1 + rand() % 6, plr->x, plr->y);
1043: break;
1044: case 7:
1045: playsound_loc(S_PLRWEAPON4, plr->x, plr->y);
1046: break;
1047: case 8:
1048: playsound_loc(S_SWORD1 + rand() % 2, plr->x, plr->y);
1049: break;
1050: case 9:
1051: playsound_loc(S_SWORD1 + rand() % 3, plr->x, plr->y);
1052: if (rand() % 2) {
1053: playsound_loc(S_GORE1 + rand() % 4, plr->x, plr->y);
1054: }
1055: break;
1056: }
1057: if (taghit == myrandomtag) {
1058: sprite[teamflagsprite[ihaveflag - 1]].cstat &= ~32768;
1059: ihaveflag = 0;
1060: switch (guntype) {
1061: case 0:
1062: k = (krand() % 5);
1063: break;
1064: case 1:
1065: k = (krand() % 5);
1066: break;
1067: case 2:
1068: k = (krand() % 10);
1069: break;
1070: case 3:
1071: k = (krand() % 20);
1072: break;
1073: case 4:
1074: k = (krand() % 25);
1075: break;
1076: case 5:
1077: k = (krand() % 30);
1078: break;
1079: case 6:
1080: k = (krand() % 30);
1081: break;
1082: case 7:
1083: k = (krand() % 10) + 5;
1084: break;
1085: case 8:
1086: k = (krand() % 20) + 5;
1087: break;
1088: case 9:
1089: k = (krand() % 20) + 5;
1090: break;
1091: }
1092: if (shieldpoints > 0 && selectedgun < 5) {
1093: k >>= 1;
1094: shieldpoints -= k >> 1;
1095: }
1096: healthpic(-k);
1097: if (player[0].health <= 0) {
1098: killedby = netpck[p].tagno;
1099: }
1100: if (rand() % 2) {
1101: painsound(myplr->x, myplr->y);
1102: }
1103: }
1104: else {
1105: switch (guntype) {
1106: case 12:
1107: for (i = 0; i < 10; i++) {
1108: j = insertsprite(plr->sector, MISSILE);
1109: sprite[j].x = plr->x;
1110: sprite[j].y = plr->y;
1111: sprite[j].z = plr->z + (8 << 8) + ((krand() & 10) << 8);
1112: sprite[j].cstat = 0;
1113: sprite[j].picnum = PLASMA;
1114: sprite[j].shade = -32;
1115: sprite[j].pal = 0;
1116: sprite[j].xrepeat = 16;
1117: sprite[j].yrepeat = 16;
1118: daang = sprite[j].ang = (plr->ang - (i * 5)) + (i * 10);
1119: sprite[j].xvel = (sintable[(daang + 512) & 2047] >> 5);
1120: sprite[j].yvel = (sintable[daang] >> 5);
1121: sprite[j].zvel = ((100 - plr->horiz) << 4);
1122: sprite[j].owner = 4096 + p;
1123: sprite[j].lotag = 256;
1124: sprite[j].hitag = 0;
1125: sprite[j].clipdist = 48;
1126: dax = sprite[j].xvel;
1127: day = sprite[j].yvel;
1128: movesprite((short) j, (dax * synctics) << 3, (day * synctics) << 3, 0L,
1129: 4L << 8, 4L << 8, 0);
1130: setsprite(j, sprite[j].x, sprite[j].y, sprite[j].z);
1131: }
1132: break;
1133: case 13:
1134: j = insertsprite(plr->sector, MISSILE);
1135: sprite[j].x = plr->x;
1136: sprite[j].y = plr->y;
1137: sprite[j].z = plr->z + (8 << 8);
1138: sprite[j].cstat = 0;// Hitscan does not hit other bullets
1139: sprite[j].picnum = MONSTERBALL;
1140: sprite[j].shade = -32;
1141: sprite[j].pal = 0;
1142: sprite[j].xrepeat = 64;
1143: sprite[j].yrepeat = 64;
1144: daang = sprite[j].ang = plr->ang;
1145: sprite[j].xvel = (sintable[(daang + 512) & 2047] >> 7);
1146: sprite[j].yvel = (sintable[daang] >> 7);
1147: sprite[j].zvel = ((100 - plr->horiz) << 4);
1148: sprite[j].owner = 4096 + p;
1149: sprite[j].lotag = 256;
1150: sprite[j].hitag = 0;
1151: sprite[j].clipdist = 64;
1152: dax = sprite[j].xvel;
1153: day = sprite[j].yvel;
1154: movesprite((short) j, (dax * synctics) << 3, (day * synctics) << 3, 0L,
1155: 4L << 8, 4L << 8, 0);
1156: setsprite(j, sprite[j].x, sprite[j].y, sprite[j].z);
1157: return;
1158: case 14:
1159: j = insertsprite(plr->sector, HEATSEEKER);
1160: sprite[j].x = plr->x;
1161: sprite[j].y = plr->y;
1162: sprite[j].z = plr->z + (8 << 8);
1163: sprite[j].cstat = 0;// Hitscan does not hit other bullets
1164: sprite[j].picnum = BULLET;
1165: sprite[j].shade = -32;
1166: sprite[j].pal = 0;
1167: sprite[j].xrepeat = 16;
1168: sprite[j].yrepeat = 16;
1169: daang = sprite[j].ang = plr->ang;
1170: sprite[j].xvel = (sintable[(daang + 512) & 2047] >> 7);
1171: sprite[j].yvel = (sintable[daang] >> 7);
1172: sprite[j].zvel = ((100 - plr->horiz) << 4);
1173: sprite[j].owner = 4096 + p;
1174: sprite[j].lotag = 1024;
1175: sprite[j].hitag = 0;
1176: sprite[j].clipdist = 128;
1177: dax = sprite[j].xvel;
1178: day = sprite[j].yvel;
1179: movesprite((short) j, (dax * synctics) << 3, (day * synctics) << 3, 0L,
1180: 4L << 8, 4L << 8, 0);
1181: setsprite(j, sprite[j].x, sprite[j].y, sprite[j].z);
1182: return;
1183: case 15:
1184: j = insertsprite(plr->sector, MISSILE);
1185: sprite[j].x = plr->x;
1186: sprite[j].y = plr->y;
1187: sprite[j].z = plr->z + (16 << 8);
1188: sprite[j].cstat = 21;
1189: sprite[j].picnum = THROWPIKE;
1190: sprite[j].ang = ((plr->ang + 2048 + 96) - 512) & 2047;
1191: sprite[j].xrepeat = 24;
1192: sprite[j].yrepeat = 24;
1193: sprite[j].clipdist = 24;
1194: sprite[j].extra = plr->ang;
1195: sprite[j].shade = -15;
1196: sprite[j].xvel = ((krand() & 256) - 128);
1197: sprite[j].yvel = ((krand() & 256) - 128);
1198: sprite[j].zvel = ((100 - plr->horiz) << 4);
1199: sprite[j].owner = 4096 + p;
1200: sprite[j].lotag = 1024;
1201: sprite[j].hitag = 0;
1202: sprite[j].pal = 0;
1203: playsound_loc(S_ARROWHIT, sprite[j].x, sprite[j].y);
1204: dax = sprite[j].xvel;
1205: day = sprite[j].yvel;
1206: movesprite((short) j, (dax * synctics) << 3, (day * synctics) << 3, 0L,
1207: 4L << 8, 4L << 8, 0);
1208: setsprite(j, sprite[j].x, sprite[j].y, sprite[j].z);
1209: return;
1210: }
1211: }
1212: }
1213:
1214: void
1215: spawnflag(long x, long y, long z, long teamno)
1216: {
1217: short s,
1218: sect;
1219:
1220: // fprintf(stdaux, "spawnflag\r\n");
1221: updatesector(x, y, §);
1222: s = insertsprite(sect, 0);
1223: sprite[s].x = x;
1224: sprite[s].y = y;
1225: sprite[s].z = z;
1226: sprite[s].ang = 0;
1227: sprite[s].picnum = TEAMFLAG;
1228: sprite[s].cstat = 1 + 256;
1229: sprite[s].xrepeat = 32;
1230: sprite[s].yrepeat = 32;
1231: sprite[s].pal = teamcolor[teamno];
1232: teamflagsprite[teamno] = s;
1233: }
1234:
1235: void
1236: dropflagstart(short teamno)
1237: {
1238: if (teamno > 0) {
1239: teamno -= 1;
1240: if (teamflagsprite[teamno] >= 0) {
1241: setsprite(teamflagsprite[teamno], teamflagstartx[teamno],
1242: teamflagstarty[teamno], teamflagstartz[teamno]);
1243: }
1244: }
1245: }
1246:
1247: void
1248: netdropflag(void)
1249: {
1250: // fprintf(stdaux, "netdropflag\r\n");
1251: if (ihaveflag) {
1252: dropflag = 1;
1253: }
1254: }
1255:
1256: void
1257: wongamescreen(short p)
1258: {
1259: int cnt = 0,
1260: i,
1261: n;
1262: short oth;
1263: char tmpbuf[32];
1264: char *dptr;
1265: PSTR datapck;
1266: BOOL rc;
1267: struct netnowhdr gethdr;
1268:
1269: // fprintf(stdaux, "wongamescreen\r\n");
1270:
1271: keystatus[0x1C] = keystatus[0x01] = 0;
1272: SND_Sound(S_DROPFLAG);
1273: do {
1274: if (cnt < 5) {
1275: cnt++;
1276: netsendmove();
1277: }
1278: rc = _FALSE;
1279: switch (netgame) {
1280: case 1:
1281: rc = hmiNETNOWGetHeader((PSTR) & gethdr, sizeof(struct netnowhdr),
1282: &datapck);
1283: if (rc == _TRUE) {
1284: totrhdrs++;
1285: }
1286: break;
1287: case 2:
1288: case 3:
1289: dptr = (char *) &mdmrcvpck;
1290: if ((i = getpacket(&oth, dptr)) == 0) {
1291: break;
1292: }
1293: rc = _TRUE;
1294: break;
1295: #ifdef MPLAYERCOMPILE
1296: case MPLAYERGAME:{
1297: // TODO
1298: RTQ_NODE *n;
1299:
1300: while ((n = MGenMoveTo(DOSPENDINGQUEUE, DOSWORKQUEUE)) == 0)
1301: Yield();
1302:
1303: memcpy(&othnetpck, n->rtqDatum, sizeof(struct netpck));
1304: // fprintf(stdaux, "received %d\r\n", sizeof (struct netpck));
1305: MGenMoveTo(DOSWORKQUEUE, FREEQUEUE);
1306: Yield();
1307: rc = _TRUE;
1308: }
1309: break;
1310: #endif
1311: }
1312: if (rc == _TRUE) {
1313: memset(&othnetpck, 0, sizeof(struct netpck));
1314: switch (netgame) {
1315: case 1:
1316: hmiNETNOWGetBlock(datapck, (BYTE *) & othnetpck,
1317: sizeof(struct netpck));
1318: break;
1319: case 2:
1320: case 3:
1321: memmove(&othnetpck, &mdmrcvpck.data, sizeof(struct netpck));
1322: break;
1323: #ifdef MPLAYERCOMPILE
1324: case MPLAYERGAME:
1325: // TODO
1326: // done above
1327: break;
1328: #endif
1329: }
1330: }
1331: switch (p) {
1332: case TEAM1FLAG - 1: // red team
1333: if (svga) {
1334: overwritesprite(0, 0, SREDKNIGHTS1, 0, 0, 0);
1335: overwritesprite(0, 240, SREDKNIGHTS2, 0, 0, 0);
1336: }
1337: else {
1338: overwritesprite(0, 0, REDKNIGHTS, 0, 0, 0);
1339: }
1340: break;
1341: case TEAM2FLAG - 1: // blue team
1342: if (svga) {
1343: overwritesprite(0, 0, SBLUEKNIGHTS1, 0, 0, 0);
1344: overwritesprite(0, 240, SBLUEKNIGHTS2, 0, 0, 0);
1345: }
1346: else {
1347: overwritesprite(0, 0, BLUEKNIGHTS, 0, 0, 0);
1348: }
1349: break;
1350: case TEAM3FLAG - 1: // purple team
1351: if (svga) {
1352: overwritesprite(0, 0, SPURPLEKNIGHTS1, 0, 0, 0);
1353: overwritesprite(0, 240, SPURPLEKNIGHTS2, 0, 0, 0);
1354: }
1355: else {
1356: overwritesprite(0, 0, PURPLEKNIGHTS, 0, 0, 0);
1357: }
1358: break;
1359: case TEAM4FLAG - 1: // brown team
1360: if (svga) {
1361: overwritesprite(0, 0, SBROWNKNIGHTS1, 0, 0, 0);
1362: overwritesprite(0, 240, SBROWNKNIGHTS2, 0, 0, 0);
1363: }
1364: else {
1365: overwritesprite(0, 0, BROWNKNIGHTS, 0, 0, 0);
1366: }
1367: break;
1368: }
1369: for (i = 0, n = 0; i < MAXTEAMS; i++) {
1370: if (teaminplay[i]) {
1371: sprintf(tmpbuf, "%s: %d", teamcolorstrings[i], teamscore[i]);
1372: printext256(xdim - (strlen(tmpbuf) * 4),
1373: ydim - (n * 8) - tilesizy[STATUSBAR] - 8, 31, -1, tmpbuf, 1);
1374: n++;
1375: }
1376: }
1377: nextpage();
1378: } while (keystatus[0x1C] == 0 && keystatus[0x01] == 0);
1379: gameactivated = 0;
1380: }
1381:
1382: char *
1383: IPXadrstr(_IPX_INTERNET_ADDR * p)
1384: {
1385: int i,
1386: j,
1387: n;
1388: unsigned char far *ptr;
1389: static unsigned char ret[25];
1390:
1391: ptr = (char *) p;
1392: memset(ret, 0, sizeof(ret));
1393: for (i = j = n = 0; n < 4; i += 2, n++) {
1394: sprintf(&ret[i], "%02X", ptr[j++]);
1395: }
1396: strcat(ret, ":");
1397: i++;
1398: for (n = 0; n < 6; i += 2, n++) {
1399: sprintf(&ret[i], "%02X", ptr[j++]);
1400: }
1401: return (ret);
1402: }
1403:
1404: void
1405: netgetmove(void)
1406: {
1407: BOOL rc;
1408: PSTR datapck;
1409: short etype,
1410: i,
1411: p,
1412: sect,
1413: s,
1414: teamno;
1415: struct player *plr;
1416: char *dptr;
1417: struct netnowhdr gethdr;
1418:
1419: // fprintf(stdaux, "netgetmove\r\n");
1420: do {
1421: rc = _FALSE;
1422: switch (netgame) {
1423: case 1:
1424: rc = hmiNETNOWGetHeader((PSTR) & gethdr, sizeof(struct netnowhdr),
1425: &datapck);
1426: if (rc == _TRUE) {
1427: #ifdef DEBUGOUTPUT
1428: debugout("HEDR: %06ld NETADR: %s\n", gethdr.seq,
1429: IPXadrstr(&gethdr.netadr.sIPX));
1430: #endif
1431: totrhdrs++;
1432: }
1433: break;
1434: case 2:
1435: case 3:
1436: dptr = (char *) &mdmrcvpck;
1437: #ifdef SERIAL1LIB
1438: if (sd.rx.q->count < sizeof(struct mdmpck)) {
1439: return;
1440: }
1441: for (i = 0; i < 4; i++) {
1442: dptr[i] = readSer(&sd);
1443: }
1444: if (mdmrcvpck.hdr[0] != 0x01 || mdmrcvpck.hdr[1] != 0x02
1445: || mdmrcvpck.hdr[2] != 0x03 || mdmrcvpck.hdr[3] != 0x21) {
1446: sprintf(netmsg, "netgetmove: Invalid header (%X,%X,%X,%X)",
1447: mdmrcvpck.hdr[0], mdmrcvpck.hdr[1], mdmrcvpck.hdr[2],
1448: mdmrcvpck.hdr[3]);
1449: crash(netmsg);
1450: }
1451: mdmrcvpck.src = readSer(&sd);
1452: mdmrcvpck.dest = readSer(&sd);
1453: mdmrcvpck.len = readSer(&sd);
1454: dptr = (char *) &mdmrcvpck.data;
1455: for (i = 0; i < sizeof(struct netpck); i++) {
1456: dptr[i] = readSer(&sd);
1457: }
1458: #else
1459: if ((i = getpacket(&p, dptr)) == 0) {
1460: break;
1461: }
1462: #endif
1463: rc = _TRUE;
1464: break;
1465: #ifdef MPLAYERCOMPILE
1466: case MPLAYERGAME:{
1467: // TODO
1468: rc = _TRUE;
1469: // fprintf(stdaux, "netgetmove 1\r\n");
1470: }
1471: break;
1472: #endif
1473: }
1474: if (rc == _TRUE) {
1475: memset(&othnetpck, 0, sizeof(struct netpck));
1476: switch (netgame) {
1477: case 1:
1478: hmiNETNOWGetBlock(datapck, (BYTE *) & othnetpck,
1479: sizeof(struct netpck));
1480: #ifdef DEBUGOUTPUT
1481: debugout("PCKT: %06ld TAG: %03d P: %02d\n", gethdr.seq,
1482: othnetpck.tagno, plrindex[othnetpck.tagno]);
1483: #endif
1484: break;
1485: case 2:
1486: case 3:
1487: memmove(&othnetpck, &mdmrcvpck.data, sizeof(struct netpck));
1488: break;
1489: #ifdef MPLAYERCOMPILE
1490: case MPLAYERGAME:
1491: {
1492: RTQ_NODE *n;
1493:
1494: // fprintf(stdaux, "netgetmove 2\r\n");
1495: if ((n = MGenMoveTo(DOSPENDINGQUEUE, DOSWORKQUEUE)) != 0) {
1496: memcpy(&othnetpck, n->rtqDatum, sizeof(struct netpck));
1497: MGenMoveTo(DOSWORKQUEUE, FREEQUEUE);
1498: Yield();
1499: }
1500: else
1501: rc = 0;
1502:
1503: break;
1504: }
1505: #endif
1506: }
1507: if (othnetpck.mapon != mapon) { // on a different map
1508: if (debugnet) {
1509: debugout("SKIPPED - NOT ON SAME MAP");
1510: }
1511: continue;
1512: }
1513: if (othnetpck.gametype != gametype) { // playing a different
1514: // game
1515: if (debugnet) {
1516: debugout("SKIPPED - NOT IN SAME GAME");
1517: }
1518: continue;
1519: }
1520: #if 0
1521: if (debugnet) {
1522: debugout("PCKT RECV FROM P: %02d TAG: %d",
1523: plrindex[othnetpck.tagno], othnetpck.tagno);
1524: }
1525: #endif
1526: if (othnetpck.tagno == myrandomtag) {
1527: if (debugnet) {
1528: debugout("SKIPPED - OWN TAG");
1529: }
1530: continue;
1531: }
1532: p = plrindex[othnetpck.tagno];
1533: if (p == 255) { // new player identified
1534: switch (netgame) {
1535: case 1:
1536: hmiNETNOWAddNode(&gethdr.netadr);
1537: hmiNETNOWSortNodes();
1538: mynode = hmiNETNOWGetConsoleNode();
1539: p = plrindex[othnetpck.tagno] = playersingame;
1540: tagindex[p] = othnetpck.tagno;
1541: playersingame = hmiNETNOWGetActiveNodes();
1542: break;
1543: case 2:
1544: case 3:
1545: mynode = 0;
1546: p = plrindex[othnetpck.tagno] = playersingame++;
1547: tagindex[p] = othnetpck.tagno;
1548: break;
1549: #ifdef MPLAYERCOMPILE
1550: case MPLAYERGAME:
1551: // TODO
1552: p = plrindex[othnetpck.tagno] = playersingame++;
1553: tagindex[p] = othnetpck.tagno;
1554: // fprintf(stdaux, "*netgetmove: players in game %d, idx %d, my ti0 %d ti1 %d\r\n", playersingame, othnetpck.tagno, tagindex[0], tagindex[1]);
1555: // fprintf(stdaux, "netgetmove: plrindex 0 %d plrindex 1 %d\r\n", plrindex[0], plrindex[1]);
1556: break;
1557: #endif
1558: }
1559: #ifdef DEBUGOUTPUT
1560: debugout("PCKT: %06ld TAG: %03d P: %02d NEWPLAYER\n",
1561: gethdr.seq, tagindex[plrindex[othnetpck.tagno]],
1562: plrindex[othnetpck.tagno]);
1563: sprintf(netmsg, "ADDING TAG %d", othnetpck.tagno);
1564: #endif
1565: // ccw sendmyinfo(_NETNOW_BROADCAST,1);
1566: sendmyinfo(_NETNOW_BROADCAST, 0);
1567: }
1568: if (p < 0 || p >= MAXPLAYERS) {
1569: // fprintf(stdaux, "error = player index invalid p = %d\r\n", p);
1570: sprintf(netmsg, "netgetmove: player index invalid (p=%d)", p);
1571: crash(netmsg);
1572: }
1573: if (xmit != 1) {
1574: xmit = 1;
1575: }
1576: memmove(&netpck[p], &othnetpck, sizeof(struct netpck));
1577: memmove(&othadr[p], &gethdr.netadr, sizeof(_NETNOW_NODE_ADDR));
1578: if (netpck[p].action == -2) {
1579: i = teamflagsprite[netpck[p].hasflag - 1];
1580: if (i >= 0 && ihaveflag == netpck[p].hasflag) {
1581: sprite[i].cstat &= ~32768;
1582: }
1583: if (netpck[p].hasflag - 1 == netpck[p].teamno) {
1584: netmarkflag(i);
1585: }
1586: }
1587: plr = &player[p];
1588: switch (netpck[p].weap) {
1589: case 1:
1590: case 2:
1591: case 3:
1592: case 4:
1593: case 8:
1594: etype = 1;
1595: break;
1596: case 5:
1597: case 6:
1598: case 7:
1599: case 9:
1600: etype = 0;
1601: break;
1602: default:
1603: etype = 2;
1604: break;
1605: }
1606: if (plr->spritenum <= 0) {
1607: // etype=netpck[p].enemytype;
1608: updatesector(netpck[p].x, netpck[p].y, §);
1609: s = insertsprite(sect, 1);
1610: sprite[s].x = netpck[p].x;
1611: sprite[s].y = netpck[p].y;
1612: sprite[s].z = netpck[p].z;
1613: sprite[s].ang = netpck[p].ang;
1614: sprite[s].picnum = enempics[etype];
1615: sprite[s].cstat = 1 + 256;
1616: sprite[s].xrepeat = xreps[etype];
1617: sprite[s].yrepeat = yreps[etype];
1618: sprite[s].owner = MAXSPRITES + p;
1619: sprite[s].pal = teamcolor[netpck[p].teamno];
1620: plr = &player[p];
1621: plr->spritenum = s;
1622: plr->x = sprite[s].x;
1623: plr->y = sprite[s].y;
1624: plr->z = sprite[s].z;
1625: plr->ang = sprite[s].ang;
1626: plr->height = PLAYERHEIGHT;
1627: plr->sector = plr->oldsector = sprite[s].sectnum;
1628: }
1629: else {
1630: // etype=netpck[p].enemytype;
1631: if (gametype >= 1) {
1632: teamno = netpck[p].teamno;
1633: }
1634: else {
1635: teamno = plrindex[netpck[p].tagno];
1636: }
1637: plr->x = netpck[p].x;
1638: plr->y = netpck[p].y;
1639: plr->z = netpck[p].z;
1640: plr->ang = netpck[p].ang;
1641: plr->horiz = netpck[p].horiz;
1642: if (plr->spritenum <= 0 || plr->spritenum >= MAXSPRITES) {
1643: sprintf(netmsg, "netgetmove: player sprite number (%d) invalid",
1644: plr->spritenum);
1645: crash(netmsg);
1646: }
1647: sprite[plr->spritenum].ang = plr->ang;
1648: sprite[plr->spritenum].cstat = 1 + 256;
1649: sprite[plr->spritenum].xrepeat = xreps[etype];
1650: sprite[plr->spritenum].yrepeat = yreps[etype];
1651: sprite[plr->spritenum].pal = teamcolor[netpck[p].teamno];
1652: setsprite(plr->spritenum, plr->x, plr->y, plr->z + (plr->height << 8));
1653: updatesector(plr->x, plr->y, &plr->sector);
1654: // plr->sector = sprite[plr->spritenum].sectnum;
1655: if (plr->sector < 0 || plr->sector >= numsectors) {
1656: sprintf(netmsg, "netgetmove (p=%d): sector number"
1657: "invalid (t=%d s=%d x=%d, y=%d, z=%d)",p,
1658: teamno,plr->sector,
1659: plr->x, plr->y, plr->z);
1660: crash(netmsg);
1661: }
1662: if (gametype >= 1) {
1663: if (teamno < 0 || teamno >= MAXTEAMS) {
1664: sprintf(netmsg, "netgetmove: invalid team number %d", teamno);
1665: crash(netmsg);
1666: }
1667: if (teaminplay[teamno] == 0) {
1668: teaminplay[teamno] = 1;
1669: captureflagpic();
1670: }
1671: }
1672: if (teamscore[teamno] < netpck[p].score) {
1673: teamscore[teamno] = netpck[p].score;
1674: if (gametype >= 1) {
1675: captureflagpic();
1676: }
1677: else {
1678: fragspic();
1679: }
1680: }
1681: if (gametype >= 1 && netpck[p].hasflag) {
1682: if (netpck[p].hasflag < 1 || netpck[p].hasflag > MAXTEAMS) {
1683: sprintf(netmsg, "netgetmove: flag referencing invalid team %d",
1684: netpck[p].hasflag);
1685: crash(netmsg);
1686: }
1687: if (ihaveflag < 0 || ihaveflag > MAXTEAMS) {
1688: sprintf(netmsg, "netgetmove: ihaveflag (%d) invalid value",
1689: ihaveflag);
1690: crash(netmsg);
1691: }
1692: if (netpck[p].hasflag == ihaveflag) {
1693: if (teamflagsprite[ihaveflag - 1] >= 0) {
1694: playsound_loc(S_LAUGH, netpck[p].x, netpck[p].y);
1695: sprite[teamflagsprite[ihaveflag - 1]].cstat &= ~32768;
1696: }
1697: ihaveflag = 0;
1698: }
1699: moveflag(plr->x, plr->y, plr->z, netpck[p].hasflag);
1700: switch (sector[plr->sector].lotag) {
1701: case TEAM1SECTOR:
1702: switch (netpck[p].hasflag) {
1703: case TEAM2FLAG:
1704: case TEAM3FLAG:
1705: case TEAM4FLAG:
1706: if (teaminplay[netpck[p].hasflag - 1]) {
1707: teamscore[TEAM1FLAG - 1] += 1;
1708: playsound_loc(S_DROPFLAG, netpck[p].x, netpck[p].y);
1709: // if (teamscore[netpck[p].hasflag-1] > 0) {
1710: // teamscore[netpck[p].hasflag-1]--;
1711: // }
1712: }
1713: break;
1714: }
1715: dropflagstart(netpck[p].hasflag);
1716: captureflagpic();
1717: break;
1718: case TEAM2SECTOR:
1719: switch (netpck[p].hasflag) {
1720: case TEAM1FLAG:
1721: case TEAM3FLAG:
1722: case TEAM4FLAG:
1723: if (teaminplay[netpck[p].hasflag - 1]) {
1724: teamscore[TEAM2FLAG - 1] += 1;
1725: playsound_loc(S_DROPFLAG, netpck[p].x, netpck[p].y);
1726: // if (teamscore[netpck[p].hasflag-1] > 0) {
1727: // teamscore[netpck[p].hasflag-1]--;
1728: // }
1729: }
1730: break;
1731: }
1732: dropflagstart(netpck[p].hasflag);
1733: captureflagpic();
1734: break;
1735: case TEAM3SECTOR:
1736: switch (netpck[p].hasflag) {
1737: case TEAM1FLAG:
1738: case TEAM2FLAG:
1739: case TEAM4FLAG:
1740: if (teaminplay[netpck[p].hasflag - 1]) {
1741: teamscore[TEAM3FLAG - 1] += 1;
1742: playsound_loc(S_DROPFLAG, netpck[p].x, netpck[p].y);
1743: // if (teamscore[netpck[p].hasflag-1] > 0) {
1744: // teamscore[netpck[p].hasflag-1]--;
1745: // }
1746: }
1747: break;
1748: }
1749: dropflagstart(netpck[p].hasflag);
1750: captureflagpic();
1751: break;
1752: case TEAM4SECTOR:
1753: switch (netpck[p].hasflag) {
1754: case TEAM1FLAG:
1755: case TEAM2FLAG:
1756: case TEAM3FLAG:
1757: if (teaminplay[netpck[p].hasflag - 1]) {
1758: teamscore[TEAM4FLAG - 1] += 1;
1759: playsound_loc(S_DROPFLAG, netpck[p].x, netpck[p].y);
1760: // if (teamscore[netpck[p].hasflag-1] > 0) {
1761: // teamscore[netpck[p].hasflag-1]--;
1762: // }
1763: }
1764: break;
1765: }
1766: dropflagstart(netpck[p].hasflag);
1767: captureflagpic();
1768: break;
1769: }
1770: }
1771: }
1772: switch (netpck[p].action) {
1773: case KEYFIRE:
1774: if (sprite[plr->spritenum].statnum != ATTACK) {
1775: newstatus(plr->spritenum, ATTACK);
1776: }
1777: if (netpck[p].guntype != 0) {
1778: nethitsprite(p, netpck[p].guntype, netpck[p].taghit);
1779: netpck[p].taghit = 0;
1780: netpck[p].guntype = 0;
1781: }
1782: break;
1783: case -1:
1784: if (sprite[plr->spritenum].statnum != DIE) {
1785: newstatus(plr->spritenum, DIE);
1786: if (netpck[p].taghit == myrandomtag) {
1787: if (gametype < 1) {
1788: teamscore[0]++;
1789: fragspic();
1790: }
1791: }
1792: if (playersingame == 2) {
1793: xmit = 0;
1794: }
1795: }
1796: break;
1797: default:
1798: sprite[plr->spritenum].picnum = enempics[etype];
1799: if (sprite[plr->spritenum].statnum != 1) {
1800: changespritestat(plr->spritenum, 1);
1801: }
1802: break;
1803: }
1804: numspcks[p]++;
1805: totrpcks++;
1806: }
1807: } while (rc != _FALSE);
1808: for (i = 0; i < MAXTEAMS; i++) {
1809: switch (gametype) {
1810: case 0: // head to head
1811: break;
1812: case 1: // capture the flag 21
1813: if (teamscore[i] >= 21) {
1814: wongamescreen(i);
1815: netpickmonster();
1816: }
1817: break;
1818: case 2: // capture the flag 7
1819: if (teamscore[i] >= 7) {
1820: wongamescreen(i);
1821: netpickmonster();
1822: }
1823: break;
1824: }
1825: }
1826: }
1827:
1828: void
1829: netpickmonster(void)
1830: {
1831: int animpic,
1832: i,
1833: more = 1,
1834: numenemchoices,
1835: numgamechoices,
1836: nummapchoices,
1837: pal,
1838: picking,
1839: selected,
1840: step=0;
1841: long animclock = 0L;
1842: char tmpbuf[32];
1843: struct player *plr;
1844:
1845: // fprintf(stdaux, "netpickmonster\r\n");
1846:
1847: animpic = picking = selected = 0;
1848: keystatus[0x1C] = 0;
1849: numenemchoices = MAXTEAMS;
1850: numgamechoices = NUMGAMES;
1851: nummapchoices = sizeof(mapnumbers) / sizeof(short);
1852: animclock = totalclock + (CLKIPS >> 3);
1853: keystatus[0x1C] = keystatus[0x01] = 0;
1854: do {
1855: if (svga) {
1856: rotatesprite(0L << 16, 0L << 16, 65536L, 0, VMAINBLANK,
1857: 0, 0, 8 + 16, 0L, 0L, xdim - 1L, ydim - 1L);
1858: }
1859: else {
1860: rotatesprite(0L << 16, 0L << 16, 65536L, 0, 1028,
1861: 0, 0, 8 + 16, 0L, 0L, xdim - 1L, ydim - 1L);
1862: }
1863: switch (picking) {
1864: case 0:
1865: for (i = 0; i < numenemchoices; i++) {
1866: if (i == selected) {
1867: rotatesprite(((xdim>>1)-135L)<<16,
1868: (((ydim>>1)-72L)+(i * 19))<<16,
1869: 16384L, 0, HELMET + step,
1870: 0, 0, 8 + 16,
1871: 0L, 0L, xdim-1L, ydim-1L);
1872: }
1873: pal = 3;
1874: strcpy(tmpbuf, monsternames[i]);
1875: fancyfont((xdim >> 1) - 100, (ydim >> 1) - 69 + (i * 19),
1876: THEFONT, tmpbuf, pal);
1877: }
1878: if (totalclock >= animclock) {
1879: if (selected == 9) {
1880: animpic = (animpic + 1) & 15;
1881: }
1882: else {
1883: animpic = (animpic + 1) & 3;
1884: }
1885: step = (step + 1) & 7;
1886: animclock = totalclock + (CLKIPS >> 3);
1887: }
1888: overwritesprite((xdim >> 1) + 35, 10,
1889: enempics[0] + animpic,
1890: 0, 0, teamcolor[selected]);
1891: if (keystatus[0x1C]) {
1892: keystatus[0x1C] = 0;
1893: enemytype = selected;
1894: myteam = selected;
1895: selected = 0;
1896:
1897: #ifdef MPLAYERCOMPILE
1898: // ccw
1899: if (netgame != MPLAYERGAME)
1900: #endif
1901: picking = 1;
1902: #ifdef MPLAYERCOMPILE
1903: else {
1904: gametype = 0; // head to head
1905: mapon = mapnumbers[3]; // four castles
1906: more = 0; // bail
1907: }
1908: #endif
1909: }
1910: else if (keystatus[0x01]) {
1911: keystatus[0x01] = 0;
1912: shutdown();
1913: }
1914: break;
1915: case 1:
1916: for (i = 0; i < numgamechoices; i++) {
1917: if (i == selected) {
1918: rotatesprite(((xdim>>1)-135L)<<16,
1919: (((ydim>>1)-72L)+(i * 19))<<16,
1920: 16384L, 0, HELMET + step,
1921: 0, 0, 8 + 16,
1922: 0L, 0L, xdim-1L, ydim-1L);
1923: }
1924: pal = 3;
1925: strcpy(tmpbuf, gamenames[i]);
1926: fancyfont((xdim >> 1) - 100, (ydim >> 1) - 69 + (i * 19),
1927: THEFONT, tmpbuf, pal);
1928: }
1929: if (totalclock >= animclock) {
1930: step = (step + 1) & 7;
1931: animclock = totalclock + (CLKIPS >> 3);
1932: }
1933: if (keystatus[0x1C]) {
1934: keystatus[0x1C] = 0;
1935: gametype = selected;
1936: selected = 0;
1937: picking = 2;
1938: }
1939: else if (keystatus[0x01]) {
1940: keystatus[0x01] = 0;
1941: selected = 0;
1942: picking = 0;
1943: }
1944: break;
1945: case 2:
1946: for (i = 0; i < nummapchoices; i++) {
1947: if (i == selected) {
1948: rotatesprite(((xdim>>1)-152L)<<16,
1949: (((ydim>>1)-72L)+(i * 19))<<16,
1950: 16384L, 0, HELMET + step,
1951: 0, 0, 8 + 16,
1952: 0L, 0L, xdim-1L, ydim-1L);
1953: }
1954: pal = 3;
1955: strcpy(tmpbuf, mapnames[i]);
1956: fancyfont((xdim >> 1) - 130, (ydim >> 1) - 69 + (i * 19),
1957: THEFONT, tmpbuf, pal);
1958: }
1959: if (totalclock >= animclock) {
1960: step = (step + 1) & 7;
1961: animclock = totalclock + (CLKIPS >> 3);
1962: }
1963: if (keystatus[0x1C]) {
1964: keystatus[0x1C] = 0;
1965: mapon = mapnumbers[selected];
1966: more = 0;
1967: }
1968: else if (keystatus[0x01]) {
1969: keystatus[0x01] = 0;
1970: selected = 0;
1971: picking = 1;
1972: }
1973: break;
1974: }
1975: nextpage();
1976: if (keystatus[keys[KEYBACK]] != 0) {
1977: keystatus[keys[KEYBACK]] = 0;
1978: selected++;
1979: switch (picking) {
1980: case 0:
1981: if (selected >= numenemchoices) {
1982: selected = 0;
1983: }
1984: break;
1985: case 1:
1986: if (selected >= numgamechoices) {
1987: selected = 0;
1988: }
1989: break;
1990: case 2:
1991: if (selected >= nummapchoices) {
1992: selected = 0;
1993: }
1994: break;
1995: }
1996: }
1997: else if (keystatus[keys[KEYFWD]] != 0) {
1998: keystatus[keys[KEYFWD]] = 0;
1999: selected--;
2000: switch (picking) {
2001: case 0:
2002: if (selected < 0) {
2003: selected = numenemchoices - 1;
2004: }
2005: break;
2006: case 1:
2007: if (selected < 0) {
2008: selected = numgamechoices - 1;
2009: }
2010: break;
2011: case 2:
2012: if (selected < 0) {
2013: selected = nummapchoices - 1;
2014: }
2015: break;
2016: }
2017: }
2018: } while (more);
2019: for (i = 0; i < MAXSECTORS; i++) {
2020: // memset(§or[i],0,sizeof(struct sectortype));
2021: memset(§or[i], 0, sizeof(sectortype));
2022: }
2023: for (i = 0; i < MAXWALLS; i++) {
2024: // memset(&wall[i],0,sizeof(struct walltype));
2025: memset(&wall[i], 0, sizeof(walltype));
2026: }
2027: for (i = 0; i < MAXSPRITES; i++) {
2028: // memset(&sprite[i],0,sizeof(struct spritetype));
2029: memset(&sprite[i], 0, sizeof(spritetype));
2030: }
2031: for (i = 0; i < MAXPLAYERS; i++) {
2032: memset(&player[i], 0, sizeof(struct player));
2033: }
2034: for (i = 0; i < MAXPLAYERS; i++) {
2035: teaminplay[i] = 0;
2036: teamscore[i] = 0;
2037: }
2038: plr = &player[pyrn];
2039: plr->oldsector = plr->sector;
2040: plr->horiz = 100;
2041: plr->zoom = 256;
2042: if (svga == 1) {
2043: plr->screensize = 328;
2044: }
2045: else {
2046: plr->screensize = 320;
2047: }
2048: plr->dimension = 3;
2049: plr->height = PLAYERHEIGHT;
2050: plr->z = sector[plr->sector].floorz - (plr->height << 8);
2051:
2052: loadnewlevel(mapon);
2053: mapflag = 1;
2054: if (plr->spritenum <= 0) {
2055: initplayersprite();
2056: }
2057: setup3dscreen();
2058: netjoingame();
2059: netstartx = player[pyrn].x;
2060: netstarty = player[pyrn].y;
2061: netstartz = player[pyrn].z;
2062: netstarts = player[pyrn].sector;
2063: gameactivated = 1;
2064: updatepics();
2065: }
2066:
2067: #define NUMSETOPTS 2
2068:
2069: char *setopts[] = {
2070: "COM PORT:",
2071: "BAUD RATE:"
2072: };
2073:
2074: void
2075: mdmreadsettings(void)
2076: {
2077: short i,
2078: n;
2079: long l;
2080: char buf[80],
2081: *ptr;
2082: FILE *fp;
2083:
2084: // fprintf(stdaux, "mdmreadsettings\r\n");
2085: fp = fopen("modem.dat", "r");
2086: if (fp == NULL) {
2087: return;
2088: }
2089: while (fgets(buf, 80, fp) != NULL) {
2090: for (i = 0; i < NUMSETOPTS; i++) {
2091: if ((ptr = strstr(buf, setopts[i])) != NULL) {
2092: ptr += strlen(setopts[i]);
2093: switch (i) {
2094: case 0: // com port
2095: sscanf(ptr, "%d", &n);
2096: if (n < 1 || n > 4) {
2097: break;
2098: }
2099: comp = n;
2100: break;
2101: case 1: // baud rate
2102: sscanf(ptr, "%ld", &l);
2103: if (l < 2400L || l > 115200L) {
2104: break;
2105: }
2106: bps = l;
2107: break;
2108: }
2109: }
2110: }
2111: }
2112: fclose(fp);
2113: }
2114:
2115: char comtable[] = {0x00, 0x01, 0x02, 0x03, 0x04};
2116:
2117: void
2118: initmulti(int numplayers)
2119: {
2120: int i,
2121: stat;
2122: char option4,
2123: option5;
2124: FILE *fp;
2125:
2126: // fprintf(stdaux, "initmulti\r\n");
2127: // installGPhandler();
2128: fp = fopen("tag.dat", "rb");
2129: if (fp != NULL) {
2130: fread(&myrandomtag, sizeof(myrandomtag), 1, fp);
2131: fclose(fp);
2132: }
2133: #ifdef DEBUGOUTPUT
2134: dbgfp = fopen("debug.out", "w");
2135: #endif
2136: if (numplayers > _NETNOW_MAX_NODES) {
2137: numplayers = _NETNOW_MAX_NODES;
2138: }
2139: switch (netgame) {
2140: case 1:
2141: if (hmiNETNOWInitSystem(numplayers) != _NETNOW_NO_ERROR) {
2142: crash("WHNET: IPX/NETBIOS driver not loaded");
2143: }
2144: netinitialized = 1;
2145: if (!hmiNETNOWGetNetworkAddr(&myadr)) {
2146: crash("WHNET: Cannot identify local address");
2147: }
2148: mynode = hmiNETNOWGetConsoleNode();
2149: stat = 1;
2150: break;
2151: case 2:
2152: case 3:
2153: mdmsndpck.hdr[0] = 0x03;
2154: mdmsndpck.hdr[1] = 0x02;
2155: mdmsndpck.hdr[2] = 0x01;
2156: mdmsndpck.hdr[3] = 0x21;
2157: mdmsndpck.len = sizeof(struct netpck);
2158: mdmreadsettings();
2159: #ifdef SERIAL1LIB
2160: stat = initSerial(&sd, comp - 1, USE_16550, 256L, 1024L);
2161: if (stat == SER_OK) {
2162: netinitialized;
2163: if (netgame == 2 && getDCD(&sd) == _FALSE) {
2164: crash("MODEM connection not established");
2165: }
2166: setBPS(&sd, bps);
2167: stat = 1;
2168: }
2169: else {
2170: crash("COM port unavailable");
2171: }
2172: #else
2173: option4 = option5 = 0;
2174: option4 = comtable[comp];
2175: switch (bps) {
2176: case 2400:
2177: break;
2178: case 4800:
2179: option5 |= 0x01;
2180: break;
2181: case 14400:
2182: option5 |= 0x03;
2183: break;
2184: case 19200:
2185: option5 |= 0x04;
2186: break;
2187: case 28800:
2188: option5 |= 0x05;
2189: break;
2190: default:
2191: case 9600:
2192: option5 |= 0x02;
2193: break;
2194: }
2195: if (comp == 1 || comp == 3) {
2196: option5 |= 0x20;
2197: }
2198: else {
2199: option5 |= 0x10;
2200: }
2201: initmultiplayers(option4, option5);
2202: netinitialized = 1;
2203: #endif
2204: break;
2205: #ifdef MPLAYERCOMPILE
2206: case MPLAYERGAME:{
2207: unsigned rtqSize;
2208: char error[80];
2209:
2210: MasterNode = MGenGetMasterNode(&rtqSize);
2211: if (rtqSize != sizeof(RTQ_NODE)) {
2212: sprintf(error, "Incompatible version of Mplayer: expected %d"
2213: " got %d\n", sizeof(RTQ_NODE), rtqSize);
2214: crash(error);
2215: }
2216: netinitialized = 1;
2217: mynode = 0;
2218: stat = 1;
2219: }
2220: break;
2221: #endif
2222: }
2223: for (i = 0; i < 256; i++) {
2224: plrindex[i] = 255;
2225: }
2226: for (i = 0; i < MAXTEAMS; i++) {
2227: teamflagsprite[i] = -1;
2228: }
2229: netpickmonster();
2230: }
2231:
2232: void
2233: dropDTR(void)
2234: {
2235: outp(comadr[comp] + 4, 0);
2236: }
2237:
2238: void
2239: netshutdown(void)
2240: {
2241: // fprintf(stdaux, "netshutdown\r\n");
2242: if (netinitialized) {
2243: switch (netgame) {
2244: case 1:
2245: hmiNETNOWUnInitSystem();
2246: break;
2247: case 2:
2248: case 3:
2249: #ifdef SERIAL1LIB
2250: setDTR(&sd, 0);
2251: setRTS(&sd, 0);
2252: deInitSerial(&sd);
2253: #else
2254: uninitmultiplayers();
2255: dropDTR();
2256: #endif
2257: break;
2258: #ifdef MPLAYERCOMPILE
2259: case MPLAYERGAME:
2260: // TODO
2261: // do nothing for us
2262: break;
2263: #endif
2264: }
2265: }
2266: #ifdef DEBUGOUTPUT
2267: if (dbgfp != NULL) {
2268: fclose(dbgfp);
2269: }
2270: #endif
2271: }
2272:
2273: void
2274: whnetmon(void)
2275: {
2276: int i,
2277: n;
2278: long loz;
2279: char tmpbuf[80];
2280:
2281: // fprintf(stdaux, "whnetmon\r\n");
2282:
2283: if (debugnet) {
2284: // {
2285: sprintf(tmpbuf, "P: %02d S: %05d R: %05d HDR: %05d "
2286: "N: %02d T:%03d SPR: %04d %s",
2287: playersingame, totspcks, totrpcks, totrhdrs, mynode, myrandomtag,
2288: player[pyrn].spritenum, netmsg);
2289: memset(netmsg, 0, sizeof(netmsg));
2290: printext256(0L, 8L, 31, -1, tmpbuf, 1);
2291: for (i = 0; i < playersingame; i++) {
2292: n = plrindex[tagindex[i]];
2293: sprintf(tmpbuf, "P: %02d T: %03d X: %05d Y: %05d Z: %05d "
2294: "M: %02d AN: %05d F: %02d SPR: %04d",
2295: n, tagindex[i],
2296: player[n].x, player[n].y, player[n].z,
2297: netpck[n].mapon, player[n].ang, netpck[n].hasflag,
2298: player[n].spritenum);
2299: printext256(0L, 16L + (i * 8), 31, -1, tmpbuf, 1);
2300: }
2301: for (i = 0; i < MAXTEAMS; i++) {
2302: if (teamflagsprite[i] == -1) {
2303: continue;
2304: }
2305: sprintf(tmpbuf, "F: %03d S: %d X: %05d Y: %05d Z: %05d",
2306: i, teamflagsprite[i],
2307: sprite[teamflagsprite[i]].x, sprite[teamflagsprite[i]].y,
2308: sprite[teamflagsprite[i]].z);
2309: printext256(0L, 16L + (playersingame * 8) + (i * 8), 31, -1, tmpbuf, 1);
2310: }
2311: for (i = 0, n = 0; i < MAXTEAMS; i++) {
2312: if (teaminplay[i]) {
2313: sprintf(tmpbuf, "%s: %d", teamcolorstrings[i], teamscore[i]);
2314: printext256(xdim - (strlen(tmpbuf) * 4),
2315: ydim - (n * 8) - tilesizy[STATUSBAR] - 8, 31, -1, tmpbuf, 1);
2316: n++;
2317: }
2318: }
2319: }
2320: if (gametype >= 1) {
2321: if (svga) {
2322: overwritesprite(600, 48, THEFLAG, 0, 0x02, teamcolor[myteam]);
2323: }
2324: else {
2325: overwritesprite(xdim - tilesizx[THEFLAG], (ydim - 40), THEFLAG,
2326: 0, 0x02, teamcolor[myteam]);
2327: }
2328: if (ihaveflag) {
2329: if (svga) {
2330: rotatesprite(28L << 16, 48L << 16, 16384L, 0, TEAMFLAG, 0,
2331: teamcolor[ihaveflag - 1], 8 + 16,
2332: 0L, 0L, xdim - 1L, ydim - 1L);
2333: }
2334: else {
2335: rotatesprite(8L << 16, 48L << 16, 16384L, 0, TEAMFLAG, 0,
2336: teamcolor[ihaveflag - 1], 8 + 16,
2337: 0L, 0L, xdim - 1L, ydim - 1L);
2338: }
2339: }
2340: for (n = 0; n < MAXTEAMS; n++) {
2341: i = teamflagsprite[n];
2342: if (i >= 0) {
2343: loz = sector[sprite[i].sectnum].floorz;
2344: for (i = 0; i < playersingame; i++) {
2345: if (netpck[i].hasflag == n + 1) {
2346: break;
2347: }
2348: }
2349: if (i == playersingame) {
2350: i = teamflagsprite[n];
2351: if (sprite[i].z < loz) {
2352: sprite[i].zvel += GRAVITYCONSTANT;
2353: }
2354: sprite[i].z += sprite[i].zvel;
2355: if (sprite[i].z > loz) {
2356: sprite[i].zvel = -(sprite[i].zvel >> 2);
2357: sprite[i].z = loz;
2358: }
2359: }
2360: }
2361: }
2362: }
2363: if (netgame == 2) {
2364: if ((inp(comadr[comp] + 6) & 0x80) == 0) {
2365: sprintf(tmpbuf, "NO CONNECTION");
2366: printext256((xdim >> 1) - (strlen(tmpbuf) << 2), (ydim >> 1), 31, -1, tmpbuf, 1);
2367: }
2368: }
2369: if (escapetomenu) {
2370: if (keystatus[0x15]) {
2371: for (i=0 ; i < 5 ; i++) {
2372: netkillme();
2373: }
2374: shutdown();
2375: }
2376: else if (keystatus[0x31]) {
2377: keystatus[0x31] = 0;
2378: escapetomenu = 0;
2379: }
2380: sprintf(tmpbuf, "QUIT GAME (Y/N)?");
2381: printext256(0L, 0L, 31, -1, tmpbuf, 0);
2382: }
2383: }
2384:
2385: void
2386: netrestartplayer(struct player * plr)
2387: {
2388: plr->x = netstartx;
2389: plr->y = netstarty;
2390: plr->z = netstartz;
2391: plr->sector = netstarts;
2392:
2393: // fprintf(stdaux, "netstartplayer %d %d %d %d\r\n", plr->x, plr->y, plr->z, plr->sector);
2394: }
2395:
2396: void
2397: netkillme(void)
2398: {
2399: // fprintf(stdaux, "netkillme\r\n");
2400: playerdie = 1;
2401: netsendmove();
2402: }
2403:
2404: void
2405: netreviveme(void)
2406: {
2407: // fprintf(stdaux, "netreviveme\r\n");
2408: playerdie = 0;
2409: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.