home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 31
/
CDASC_31_1996_juillet_aout.iso
/
vrac
/
lsdoor09.zip
/
EXAMPLE4.DSK
(
.txt
)
< prev
next >
Wrap
Turbo C Context File
|
1996-06-02
|
28KB
|
751 lines
Turbo C Context File
COMM_X.LIB
LSDOOR1.LIB
EXAMPLE4.CPP
D:\C\SOURCE\IPX\*.*
C:\CTEMP\*.*
D:\C\SOURCE\ADDCOUNT.CPP
D:\C\SOURCE
C:\CTEMP\IPX\*.*
D:\C\SOURCE\EWIL\*.*
D:\C\SOURCE\SOUND\*.*
D:\FV\LSDOOR\*.*\SOURCE\SOUND\*.*
D:\C\SOURCE\LIGHT\DOOR.CPP
D:\C\SOURCE\LIGHT\LS.CPP
D:\FV\LSDOOR\*.*
D:\C\SOURCE\LIGHT\*.CPP
D:\C\SOURCE\LIGHT\*.H
D:\FV\LSDOOR\*.H
D:\FV\LSDOOR\*.CPP
void *.c
void *.c
node.ID.num
best_userserch
read_single
Load(
Change
player.rael
unsigned
.real
&player
filearea
Group
group
Event
event
short
player
Player
(void *)&player
*.CPP
..\OUT.CPP
..\*.*
D:\C\SOURCE\GRAPHICS\*.ASM
D:\C\SOURCE\GRAPHICS\*.CPP
D:\C\SOURCE\OUT.CPP
D:\FV\LSDOOR\*.CPP
D:\C\SOURCE\LIGHT\LSDOOR1.LIB
D:\FV\LSDOOR\*.CPPLSDOOR1.LIB
D:\FV\LSDOOR\*.C??
D:\FV\LSDOOR\*.LIB
D:\C\SOURCE\COMM\COMM_H.LIB
\FV\LSDOOR\*.LIB
D:\C\SOURCE\LIGHT\DISPF.H
D:\C\SOURCE\LIGHT\DATA.H
D:\FV\LSDOOR\EXAMPLE5.CPP
D:\FV\LSDOOR\EXAMPLE4.CPP
D:\FV\LSDOOR\EXAMPLE4.H
D:\FV\LSDOOR\EXAMPLE5.CPP
D:\FV\LSDOOR\EXAMPLE4.CPP
D:\FV\LSDOOR\REINDEX.CPP
D:\FV\LSDOOR\REINDEX.CPP
D:\FV\LSDOOR\EXAMPLE5.CPP
D:\FV\LSDOOR\EXAMPLE4.CPP
D:\FV\LSDOOR\EXAMPLE4.CPP
D:\C\SOURCE\COMM\COMM_H.LIB
D:\FV\LSDOOR\LORDDEMO.CPP
D:\FV\LSDOOR\EXAMPLE4.CPP
a if( ! totalvotes ) continue;
if( topic.votes[jj] == winnerlevel ) display("@Y"); else display("@C");
for( ; n< a/b*40/3 ; n++ )
display("%c", 178);
if( topic.votes[jj] == winnerlevel ) display("@R"); else display("@c");
for( ; n< a/b*40/3*2 ; n++ )
display("%c", 177);
if( topic.votes[jj] == winnerlevel ) display("@r"); else display("@B");
for( ; n< a/b*40 ; n++ )
display("%c", 176);
// Serial/Console version of puts() without any string modifications.
int out( const char *s )
char *r = (char *)s;
while( 1 )
if( *r == NULL ) break;
s_out( *r );
r++;
return 1;
/////////////////////////////////////////////////
int outputs( const char *s )
char *r = (char *)s;
while( 1 )
if( *r == NULL ) { s_out( 10 ); s_out( 13 ); break; } // \0 replcd by \n
s_out( *r );
r++;
return 1;
/////////////////////////////////////////////////
//// Serial/Console version of display() function.
void out_codes( char *format )
// va_list ap;
int i,j; char k[512];
// int pass_spaces=0;
// va_start( ap, format );
while( *format )
if( *format!='@' && *format!='%' ) s_out(*format);
else
{
if( *format=='@' )
{
if( terminal == TERM_ASCII ){
format++;
if( *format == '{' ){ format++; format++; } else format++;
continue;
ritin:
format++;
switch( *format )
case '0': s_out( 27 ); out("[0;30m"); break;
case 'r': s_out( 27 ); out("[0;31m"); break;
case 'g': s_out( 27 ); out("[0;32m"); break;
case 'y': s_out( 27 ); out("[0;33m"); break;
case 'b': s_out( 27 ); out("[0;34m"); break;
case 'm': s_out( 27 ); out("[0;35m"); break;
case 'c': s_out( 27 ); out("[0;36m"); break;
case 'w': s_out( 27 ); out("[0;37m"); break;
case '1': s_out( 27 ); out("[1;30m"); break;
case 'R': s_out( 27 ); out("[1;31m"); break;
case 'G': s_out( 27 ); out("[1;32m"); break;
case 'Y': s_out( 27 ); out("[1;33m"); break;
case 'B': s_out( 27 ); out("[1;34m"); break;
case 'M': s_out( 27 ); out("[1;35m"); break;
case 'C': s_out( 27 ); out("[1;36m"); break;
case 'W': s_out( 27 ); out("[1;37m"); break;
case '{': format++;
switch( *format )
{
case '1': case '0': s_out( 27 ); out("[40m"); break;
case 'R': case 'r': s_out( 27 ); out("[41m"); break;
case 'G': case 'g': s_out( 27 ); out("[42m"); break;
case 'Y': case 'y': s_out( 27 ); out("[43m"); break;
case 'B': case 'b': s_out( 27 ); out("[44m"); break;
case 'M': case 'm': s_out( 27 ); out("[45m"); break;
case 'C': case 'c': s_out( 27 ); out("[46m"); break;
case 'W': case 'w': s_out( 27 ); out("[47m"); break;
}
format++;
break;
}
#if 0
if( *format=='%' )
{
pass_spaces=0;
readnxt:
format++;
switch( *format )
case '-': pass_spaces++; goto readnxt;
case 'i':
case 'd': sprintf(k, "%d", va_arg( ap, signed int ) ); break;
case 'l': sprintf(k, "%ld", va_arg( ap, signed int ) ); break;
case 'o': sprintf(k, "%o", va_arg( ap, unsigned int ) ); break;
case 'u': sprintf(k, "%u", va_arg( ap, unsigned int ) ); break;
case 'x': sprintf(k, "%x", va_arg( ap, unsigned int ) ); break;
case 'X': sprintf(k, "%X", va_arg( ap, unsigned int ) ); break;
case 'f': sprintf(k, "%f", va_arg( ap, float ) ); break;
case 'e': sprintf(k, "%e", va_arg( ap, float ) ); break;
case 'g': sprintf(k, "%g", va_arg( ap, float ) ); break;
case 'E': sprintf(k, "%E", va_arg( ap, float ) ); break;
case 'G': sprintf(k, "%G", va_arg( ap, float ) ); break;
case 'c': sprintf(k, "%c", va_arg( ap, char ) ); break;
case 's': sprintf(k, "%s", va_arg( ap, char * ) ); break;
case '%': sprintf(k, "%%"); break;
// if( pass_spaces )
out( /*"%-s",*/ k );
/* else */out( /*"%s",*/ k );
}
#endif
}
format++;
// va_end( ap );
/////////////////////////////////////////////////
int display( const char *format, ... )
char outbuf[ 512 ], sp_s[ 512 ], k[ 40 ], pointed[ 40 ];
char *outb = (char *)outbuf, *ponted;
int conv=0, x=0;
for( x=0; x<512; x++ ){ outbuf[x]=NULL; sp_s[x]=NULL; }
va_list ap;
va_start( ap, format );
while( *format )
if( *format=='%' )
{
for( x=0; x<40; x++ ) k[x] = NULL;
int go_furthr = 1, k_pos=0;
while( go_furthr ){
switch( *format ){
case '*':
for( x=0; x<40; x++ ) pointed[x] = NULL;
itoa( va_arg( ap, signed int ), pointed, 10 );
ponted = (char *)pointed;
while( 1 )
{
if( *ponted == NULL ) break;
k[ k_pos ] = *ponted; k_pos++; ponted++;
}
format++;
break;
case 'd': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, signed int ) ); go_furthr=0; break;
case 'i': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, signed int ) ); go_furthr=0; break;
case 'o': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, unsigned int ) ); go_furthr=0; break;
case 'u': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, unsigned int ) ); go_furthr=0; break;
case 'x': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, unsigned int ) ); go_furthr=0; break;
case 'X': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, unsigned int ) ); go_furthr=0; break;
case 'f': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, float ) ); go_furthr=0; break;
case 'e': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, float ) ); go_furthr=0; break;
case 'g': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, float ) ); go_furthr=0; break;
case 'E': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, float ) ); go_furthr=0; break;
case 'G': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, float ) ); go_furthr=0; break;
case 's': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, char * ) ); go_furthr=0; break;
case 'c': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, char ) ); go_furthr=0; break;
case 'n': k[k_pos]=*format; conv++; va_arg( ap, int * ) = (int *)conv; go_furthr=0; break;
case 'p': k[k_pos]=*format; conv++; sprintf( sp_s, k, va_arg( ap, char * ) ); go_furthr=0; break;
// The 2 above items have not been tested, and may or may not work correctly.
case NULL: k[0]=NULL; go_furthr=0; break;
default: k[k_pos] = *format; k_pos++; format++;
}
char *g = (char *)sp_s;
while( 1 ){
if( *g == NULL ) break;
*outb = *g; outb++; g++;
}
} else { *outb = *format; outb++; }
format++;
va_end( ap );
out_codes( outbuf );
return( conv );
/////////////////////////////////////////////////
// Macro Serial/Console version of putchar() function.
int putserial( int I ){ s_out( I ); return I; }
// Macro Serial/Console version of getchar() function.
int getserial( void ){ return( s_in() ); }
int getseriale( void ){ int gtsser=0; gtsser = s_in(); s_out( gtsser );
return gtsser;
// Macro Serial/Console version of getch() function.
int getser( void ){ return( s_in() ); }
// Macro Serial/Console version of getche() function (echo back).
int getsere( void ){ int gtsser=0; gtsser=s_in(); s_out( gtsser );
return gtsser;
// Macro Serial/Console version of putch() function.
int putser( int I ){ s_out( I ); return I; }
///////////////******************////////////////
#if 0
#undef s_out(C)
#undef s_in() // Undeclaring Low-level output to console
#undef s_ready()
#endif
class TData {
ENTRY ent, *entp;
IX_DESC idx, *ixp;
int handle;
char fname[80];
ulong len;
public:
ulong high;
int end;
int isopen;
TData( char *FileName, ulong setLen ){
entp = &ent;
ixp = &idx;
strcpy( fname, FileName );
len = setLen;
int Open(void);
void Close(void);
int Load( ulong num, void *buf );
int Load( unsigned char *keyword, void *buf );
int Save( unsigned char *keyword, ulong num, void *buf );
int Delete( unsigned char *keyword );
int Change( ulong num, unsigned char *keyword, unsigned char *newkey );
int Change( ulong num, ulong newnum );
private:
~TData(){ Close(); }
class TData {
ENTRY ent, *entp;
IX_DESC idx, *ixp;
int handle;
char fname[80];
ulong len;
public:
ulong high;
int end;
int isopen;
TData( char *FileName, ulong setLen ){
entp = &ent;
ixp = &idx;
strcpy( fname, FileName );
len = setLen;
int Open(void);
void Close(void);
int Load( ulong num, void *buf );
int Load( unsigned char *keyword, void *buf );
int Save( unsigned char *keyword, ulong num, void *buf );
int Delete( unsigned char *keyword );
int Change( ulong num, unsigned char *keyword, unsigned char *newkey );
int Change( ulong num, ulong newnum );
private:
~TData(){ Close(); }
TData( char *FileName, ulong setLen ){
entp = &ent;
ixp = &idx;
strcpy( fname, FileName );
len = setLen;
void string2date( char *str, struct date *dt )
char *s = (char *)str, *r = (char *)s;
r++;
dt->da_mon = dt->da_day = dt->da_year = 0;
if( *s == NULL ) return;
if( *r == '/' || *r == '-' ) dt->da_mon = *s-'0';
else {
if( *s == 49 ) dt->da_mon = 10;
s++; r++; dt->da_mon+=*s-'0';
s+=2; r+=2; // xxx21/95
if( *r == '/' || *r == '-' ) dt->da_day = *s-'0';
else {
if( *s >= 48 && *s <= 57 ) dt->da_day = (*s-'0') * 10;
s++; r++; dt->da_day+=*s-'0';
s+=2; r+=2; // xxxxxx95 or xxxxxx1995
dt->da_year = (*s-'0') * 10;
s++; r++;
dt->da_year += (*s-'0');
if( *r >= 48 && *r <= 57 ){
s++; r++;
dt->da_year *= 100;
dt->da_year += (*s-'0') * 10;
s++; r++;
dt->da_year += (*s-'0');
} else dt->da_year += 1900;
char *format_time( struct time *t, char *s )
if( t->ti_hour == 0 ) sprintf( s, "12:%02i am", t->ti_min );
else if( t->ti_hour < 12 ) sprintf( s, "%i:%02i am", t->ti_hour, t->ti_min );
else if( t->ti_hour == 12 ) sprintf( s, "12:%02i pm", t->ti_min );
else sprintf( s, "%i:%02i pm", t->ti_hour-12, t->ti_min );
return (char *)s;
unsigned int twodigit( int n )
int ii = n;
if( ii >= 1900 ) ii -= 1900;
while( ii >= 100 ) ii -= 100;
return ii;
getch();
char *ss;
strncpy( blockfile, argv[blockfile_arg], 252 );
ss = strchr( blockfile, '.' );
if( ss )
ss++;
strcpy( ss, "Blk" );
} else strcat( ss, ".Blk" );
void fileerror( int read )
if( read )
printf("\n\nError reading from disk!\n");
else
printf("\n\nError writing to disk!\n");
exit(1);
_AX = 0x1000;
asm int 0x15;
_AX = 0x1680;
asm int 0x2f;
return;
long l1, l2, l3;
long *l1pointer = &l1, *l3pointer = &l3;
void dvsleep( int secs )
_bios_timeofday( _TIME_GETCLOCK, l1pointer );
l2 = l1; l1 += (18 * secs);
while( l2 < l1 ){
dv_pause();
if( _bios_timeofday( _TIME_GETCLOCK, l3pointer ) )
l1 = l3 + (18 * secs) - (l2 - (l1 - 18 * secs));
l2 = l3;
#define OUT_OF_MEMORY -10
#define BAD_CODE_SIZE -20
#define READ_ERROR -1
#define WRITE_ERROR -2
#define OPEN_ERROR -3
#define CREATE_ERROR -4
class Compress {
short bits;
FILE *out;
short get_pixel() = 0; // Return -1 on finish...
short compressImage( void );
void init_table( short );
void flush( short );
void write_code( short );
public:
short failed;
Compress( FILE *, short /*bits*/ );
#define OUT_OF_MEMORY -10 // Failures returned by private members,
#define BAD_CODE_SIZE -20 // or value of 'failed' when buffer NULL
#define GENERAL_ERROR -30
#define READ_ERROR -1
#define WRITE_ERROR -2
#define OPEN_ERROR -3
#define CREATE_ERROR -4
class TSound {
public:
class TSoundDriver {
protected:
public:
typedef struct modemPacket { // Modem packets are always inbound-only...
uchar InUse;
uchar data[256];
modemPacket far *more;
typedef struct netPacket { // Network packets are inbound & outbound...
uchar InUse;
// ECBHeader ECB;
// IPXHeader IPX;
ulong time;
uchar data[256];
netPacket far *more;
union TPacket {
selfPacket self;
modemPacket modem;
netPacket net;
#ifdef DOS
test DetectSHARE( void )
_AX = 0x1000;
_genInt( 0x2F );
return _AL == 0xFF;
#endif
// ipxnet.c
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <string.h>
#include <process.h>
#include <values.h>
#include "ipxnet.h"
=============================================================================
IPX PACKET DRIVER
=============================================================================
packet_t packets[NUMPACKETS];
nodeadr_t nodeadr[MAXNETNODES+1]; // first is local, last is broadcast
nodeadr_t remoteadr; // set by each GetPacket
localadr_t localadr; // set at startup
int socketid = 0x869c; // 0x869c is the official DOOM socket
union REGS regs; // scratch for int86 calls
struct SREGS sregs;
unsigned short enteripx[2];
long localtime; // for time stamp in packets
long remotetime;
//===========================================================================
char *hex = "0123456789abcdef";
void PrintAddress (nodeadr_t *adr, char *str)
int i;
for (i=0 ; i<6 ; i++)
*str++ = hex[adr->node[i]>>4];
*str++ = hex[adr->node[i]&15];
*str = 0;
int OpenSocket(short socketNumber)
regs.x.bx = 0;
regs.h.al = 0; // longevity
regs.x.dx = socketNumber;
int86(0x7A,®s,®s);
if (regs.h.al)
Error ("OpenSocket: 0x%x",regs.h.al);
return regs.x.dx;
void CloseSocket(short socketNumber)
regs.x.bx = 1;
regs.x.dx = socketNumber;
int86(0x7A,®s,®s);
void ListenForPacket(ECB *ecb)
regs.x.si = FP_OFF(ecb);
sregs.es = FP_SEG(ecb);
regs.x.bx = 4;
int86x (0x7a,®s,®s,&sregs);
if (regs.h.al)
Error ("ListenForPacket: 0x%x",regs.h.al);
void GetLocalAddress (void)
regs.x.si = FP_OFF(&localadr);
sregs.es = FP_SEG(&localadr);
regs.x.bx = 9;
int86x (0x7a,®s,®s,&sregs);
if (regs.h.al)
Error ("Get inet addr: 0x%x",regs.h.al);
====================
= InitNetwork
====================
void InitNetwork (void)
int i,j;
// get IPX function address
regs.x.ax = 0x7a00;
int86x (0x2f,®s,®s,&sregs);
if ( regs.h.al != 0xff)
Error ("IPX not detected\n");
enteripx[0] = regs.x.di;
enteripx[1] = sregs.es;
// allocate a socket for sending and receiving
i = CheckParm ("-port");
if (i>0 && i<_argc-1)
socketid = atoi (_argv[i+1]);
printf ("Using alternate port %i for network\n",socketid);
socketid = OpenSocket ( (socketid>>8) + ((socketid&255)<<8) );
GetLocalAddress ();
// set up several receiving ECBs
memset (packets,0,NUMPACKETS*sizeof(packet_t));
for (i=1 ; i<NUMPACKETS ; i++)
packets[i].ecb.InUseFlag = 0x1d;
packets[i].ecb.ECBSocket = socketid;
packets[i].ecb.FragmentCount = 1;
packets[i].ecb.fAddress[0] = FP_OFF(&packets[i].ipx);
packets[i].ecb.fAddress[1] = FP_SEG(&packets[i].ipx);
packets[i].ecb.fSize = sizeof(packet_t)-sizeof(ECB);
ListenForPacket (&packets[i].ecb);
// set up a sending ECB
memset (&packets[0],0,sizeof(packets[0]));
packets[0].ecb.ECBSocket = socketid;
packets[0].ecb.FragmentCount = 1;
packets[0].ecb.fAddress[0] = FP_OFF(&packets[0].ipx);
packets[0].ecb.fAddress[1] = FP_SEG(&packets[0].ipx);
for (j=0 ; j<4 ; j++)
packets[0].ipx.dNetwork[j] = localadr.network[j];
packets[0].ipx.dSocket[0] = socketid&255;
packets[0].ipx.dSocket[1] = socketid>>8;
// known local node at 0
for (i=0 ; i<6 ; i++)
nodeadr[0].node[i] = localadr.node[i];
// broadcast node at MAXNETNODES
for (j=0 ; j<6 ; j++)
nodeadr[MAXNETNODES].node[j] = 0xff;
====================
= ShutdownNetwork
====================
void ShutdownNetwork (void)
CloseSocket (socketid);
==============
= SendPacket
= A destination of MAXNETNODES is a broadcast
==============
void SendPacket (int destination)
int j;
// find a free packet buffer to use
while (packets[0].ecb.InUseFlag)
// set the time
packets[0].time = localtime;
// set the address
for (j=0 ; j<6 ; j++)
packets[0].ipx.dNode[j] = packets[0].ecb.ImmediateAddress[j] =
nodeadr[destination].node[j];
// set the length (ipx + time + datalength)
packets[0].ecb.fSize = sizeof(IPXPacket) + 4 + doomcom.datalength + 4;
// put the data into an ipx packet
memcpy (&packets[0].data, &doomcom.data, doomcom.datalength);
// send the packet
regs.x.si = FP_OFF(&packets[0]);
sregs.es = FP_SEG(&packets[0]);
regs.x.bx = 3;
int86x (0x7a, ®s, ®s, &sregs);
if (regs.h.al)
Error ("SendPacket: 0x%x",regs.h.al);
unsigned short ShortSwap (unsigned short i)
return ((i&255)<<8) + ((i>>8)&255);
==============
= GetPacket
= Returns false if no packet is waiting
==============
int GetPacket (void)
int packetnum;
int i, j;
long besttic;
packet_t *packet;
// if multiple packets are waiting, return them in order by time
besttic = MAXLONG;
packetnum = -1;
doomcom.remotenode = -1;
for ( i = 1 ; i < NUMPACKETS ; i++)
if (packets[i].ecb.InUseFlag)
continue;
if (packets[i].time < besttic)
besttic = packets[i].time;
packetnum = i;
if (besttic == MAXLONG)
return 0; // no packets
packet = &packets[packetnum];
if (besttic == -1 && localtime != -1)
ListenForPacket (&packet->ecb);
return 0; // setup broadcast from other game
remotetime = besttic;
// got a good packet
if (packet->ecb.CompletionCode)
Error ("GetPacket: ecb.ComletionCode = 0x%x",packet->ecb.CompletionCode);
// set remoteadr to the sender of the packet
memcpy (&remoteadr, packet->ipx.sNode, sizeof(remoteadr));
for (i=0 ; i<doomcom.numnodes ; i++)
if (!memcmp(&remoteadr, &nodeadr[i], sizeof(remoteadr)))
break;
if (i < doomcom.numnodes)
doomcom.remotenode = i;
else
if (localtime != -1)
{ // this really shouldn't happen
ListenForPacket (&packet->ecb);
return 0;
// copy out the data
doomcom.datalength = ShortSwap(packet->ipx.PacketLength) - 38;
memcpy (&doomcom.data, &packet->data, doomcom.datalength);
// repost the ECB
ListenForPacket (&packet->ecb);
return 1;
// ipxnet.h
typedef struct
char private[512];
} doomdata_t;
#include "DoomNet.h"
//===========================================================================
#define NUMPACKETS 10 // max outstanding packets before loss
// setupdata_t is used as doomdata_t during setup
typedef struct
short gameid; // so multiple games can setup at once
short drone;
short nodesfound;
short nodeswanted;
} setupdata_t;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long LONG;
typedef struct IPXPacketStructure
WORD PacketCheckSum; /* high-low */
WORD PacketLength; /* high-low */
BYTE PacketTransportControl;
BYTE PacketType;
BYTE dNetwork[4]; /* high-low */
BYTE dNode[6]; /* high-low */
BYTE dSocket[2]; /* high-low */
BYTE sNetwork[4]; /* high-low */
BYTE sNode[6]; /* high-low */
BYTE sSocket[2]; /* high-low */
} IPXPacket;
typedef struct
BYTE network[4]; /* high-low */
BYTE node[6]; /* high-low */
} localadr_t;
typedef struct
BYTE node[6]; /* high-low */
} nodeadr_t;
typedef struct ECBStructure
WORD Link[2]; /* offset-segment */
WORD ESRAddress[2]; /* offset-segment */
BYTE InUseFlag;
BYTE CompletionCode;
WORD ECBSocket; /* high-low */
BYTE IPXWorkspace[4]; /* N/A */
BYTE DriverWorkspace[12]; /* N/A */
BYTE ImmediateAddress[6]; /* high-low */
WORD FragmentCount; /* low-high */
WORD fAddress[2]; /* offset-segment */
WORD fSize; /* low-high */
} ECB;
// time is used by the communication driver to sequence packets returned
// to DOOM when more than one is waiting
typedef struct
ECB ecb;
IPXPacket ipx;
long time;
doomdata_t data;
} packet_t;
extern doomcom_t doomcom;
extern int gameid;
extern nodeadr_t nodeadr[MAXNETNODES+1];
extern int localnodenum;
extern long localtime; // for time stamp in packets
extern long remotetime; // timestamp of last packet gotten
extern nodeadr_t remoteadr;
void Error (char *error, ...);
void InitNetwork (void);
void ShutdownNetwork (void);
void SendPacket (int destination);
int GetPacket (void);
int CheckParm (char *check);
void PrintAddress (nodeadr_t *adr, char *str);
int GRAPHIC_oldmode=*(int *)MK_FP(0x40,0x49);
void PageUser( void )
int best, save_rdcomm = read_commlinks;
read_commlinks = 0;
commlink.type = 1;
commlink.link = 0;
strcpy( commlink.from, user.handle );
display(blankline);
display("\r@CP@cage ] @W");
sergets( commlink.data, sizeof(commlink.data) );
while( commlink.data[0] == ' ' ) strdel( commlink.data, 0 );
if( !strncmpi( commlink.data, "All", 3 ) ){
if( !user_security() || !security.sysop ){
read_commlinks = save_rdcomm;
display("\n@RN@rot allowed...");
return;
}
strdel( commlink.data, 0 ); strdel( commlink.data, 0 );
strdel( commlink.data, 0 ); strdel( commlink.data, 0 );
commlink.type = 4;
int ii=0;
while( ii<=MaxNodes ){
if( ii==node.ID.num || !read_nodeid( ii ) || !readid.online ){
ii++; continue;
}
save_commlink( ii++ );
}
display("\n@w...@WP@wage sent to all users..." );
read_commlinks = save_rdcomm;
return;
if( (best=FindUserOnline(commlink.data)) == -1 ){
display("\n@CU@cser not found...");
read_commlinks = save_rdcomm;
return;
save_commlink( best );
read_commlinks = save_rdcomm;
display("\n@c...@CP@cage sent..." );
uint best_userserch( uchar *find )
int jj;
int amount = 0, best = -1;
open_user();
while( next_userserch() )
if( (jj=matches( find, userserch.handle ) )>=1 )
{
if( jj > amount )
{
best = userserch.num; amount = jj;
}
}
if( best != -1 ) load_userserch( best );
close_user();
return (best!=-1);
#define reset_user() User.Reset()
#define load_user(N) User.Load( N, &user )
#define load_userserch(N) User.Load( N, &userserch )
#define save_user() User.Save( user.handle, user.num, &user )
#define save_userserch() User.Save( userserch.handle, userserch.num, &userserch )
#define add_user() User.Add( user.handle, user.num, &user )
#define add_userserch() User.Add( userserch.handle, userserch.num, &userserch )
#define delete_user() User.Delete( user.num, user.handle )
#define delete_userserch() User.Delete( userserch.num, userserch.handle )
#define open_user() User.Open()
#define close_user() User.Close()
#define version_user() User.CheckVersion()
#define isopen_user() User.isopen
#define end_user() User.end
#define high_user() User.GetHigh()
#define find_user(W) User.Load( W, &user )
#define find_userserch(W) User.Load( W, &userserch )
#define next_user() User.Load( &user )
#define next_userserch() User.Load( &userserch )
#define key_user() User.LoadKey()
#define change_user(O,N) User.Change( user.num, O, N )
#define change_userserch(O,N) User.Change( userserch.num, O, N )
#define number_user(N) User.Change( user.num, N )
#define number_userserch(N) User.Change( userserch.num, N )
#define load_master() read_single(WithLSPath("Master.Dat"), &master, sizeof(master), true )
#define save_master() write_single(WithLSPath("Master.Dat"), &master, sizeof(master) )
#define load_master() read_single(WithLSPath("Master.Dat"), &master, sizeof(master), true )
#define save_master() write_single(WithLSPath("Master.Dat"), &master, sizeof(master) )