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 #include #include #include #include #include #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>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 ; iecb); 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) )