Annotation of src/whnet.c, revision 1.1

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, &regs, &regs);
        !           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, &regs, &regs);
        !           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, &sect);
        !          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, &sect);
        !          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(&sector[i],0,sizeof(struct sectortype));
        !          2021:           memset(&sector[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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.