diff -r -N -c socketmud/src/Makefile socketmud-1.2/src/Makefile *** socketmud/src/Makefile Sat Mar 9 17:25:11 2002 --- socketmud-1.2/src/Makefile Sat Mar 22 14:41:50 2003 *************** *** 15,17 **** --- 15,18 ---- clean: rm -f *.o rm -f SocketMud + rm -f *.*~ diff -r -N -c socketmud/src/action_safe.c socketmud-1.2/src/action_safe.c *** socketmud/src/action_safe.c Wed Feb 26 11:59:52 2003 --- socketmud-1.2/src/action_safe.c Sat Mar 22 14:49:38 2003 *************** *** 118,124 **** } else /* disable compression */ { ! if (!compressEnd(dMob->socket)) { text_to_mobile(dMob, "Failed.\n\r"); return; --- 118,124 ---- } else /* disable compression */ { ! if (!compressEnd(dMob->socket, dMob->socket->compressing, FALSE)) { text_to_mobile(dMob, "Failed.\n\r"); return; *************** *** 152,158 **** { dsock_next = dsock->next; ! compressEnd(dsock); if (dsock->state != STATE_PLAYING) { --- 152,158 ---- { dsock_next = dsock->next; ! compressEnd(dsock, dsock->compressing, FALSE); if (dsock->state != STATE_PLAYING) { diff -r -N -c socketmud/src/mccp.c socketmud-1.2/src/mccp.c *** socketmud/src/mccp.c Sat Mar 9 19:49:52 2002 --- socketmud-1.2/src/mccp.c Sat Mar 22 14:46:45 2003 *************** *** 89,110 **** } /* Cleanly shut down compression on `desc' */ ! bool compressEnd(D_SOCKET *dsock) { - unsigned char dummy[1]; - if (!dsock->out_compress) return TRUE; ! dsock->out_compress->avail_in = 0; ! dsock->out_compress->next_in = dummy; /* No terminating signature is needed - receiver will get Z_STREAM_END */ ! if (deflate(dsock->out_compress, Z_FINISH) != Z_STREAM_END) return FALSE; /* try to send any residual data */ ! if (!processCompressed(dsock)) return FALSE; /* reset compression values */ --- 89,112 ---- } /* Cleanly shut down compression on `desc' */ ! bool compressEnd(D_SOCKET *dsock, unsigned char teleopt, bool forced) { if (!dsock->out_compress) return TRUE; ! if (dsock->compressing != teleopt) ! return FALSE; ! ! dsock->out_compress->avail_in = strlen(dsock->outbuf); ! dsock->out_compress->next_in = (unsigned char *) dsock->outbuf; ! dsock->top_output = 0; /* No terminating signature is needed - receiver will get Z_STREAM_END */ ! if (deflate(dsock->out_compress, Z_FINISH) != Z_STREAM_END && !forced) return FALSE; /* try to send any residual data */ ! if (!processCompressed(dsock) && !forced) return FALSE; /* reset compression values */ diff -r -N -c socketmud/src/mud.h socketmud-1.2/src/mud.h *** socketmud/src/mud.h Wed Feb 26 11:06:52 2003 --- socketmud-1.2/src/mud.h Sat Mar 22 14:59:16 2003 *************** *** 25,37 **** #define eBOLD 1 /* A few globals */ ! #define MAX_BUFFER 1024 /* seems like a decent amount */ ! #define MAX_OUTPUT 2048 /* well shoot me if it isn't enough */ ! #define MAX_HELP_ENTRY 4096 /* roughly 40 lines of blocktext */ ! #define MUDPORT 9009 /* just set whatever port you want */ ! #define FILE_TERMINATOR "EOF" /* end of file marker */ ! #define COPYOVER_FILE "../txt/copyover.dat" /* tempfile to store copyover data */ ! #define EXE_FILE "../src/SocketMud" /* the name of the mud binary */ /* Connection States */ #define STATE_NEW_NAME 0 --- 25,38 ---- #define eBOLD 1 /* A few globals */ ! #define PULSES_PER_SECOND 4 /* must divide 1000 : 4, 5 or 8 works */ ! #define MAX_BUFFER 1024 /* seems like a decent amount */ ! #define MAX_OUTPUT 2048 /* well shoot me if it isn't enough */ ! #define MAX_HELP_ENTRY 4096 /* roughly 40 lines of blocktext */ ! #define MUDPORT 9009 /* just set whatever port you want */ ! #define FILE_TERMINATOR "EOF" /* end of file marker */ ! #define COPYOVER_FILE "../txt/copyover.dat" /* tempfile to store copyover data */ ! #define EXE_FILE "../src/SocketMud" /* the name of the mud binary */ /* Connection States */ #define STATE_NEW_NAME 0 *************** *** 117,123 **** char outbuf[MAX_OUTPUT]; char next_command[MAX_BUFFER]; bool bust_prompt; - sh_int waitstate; sh_int lookup_status; sh_int state; sh_int control; --- 118,123 ---- *************** *** 305,311 **** * mccp.c */ bool compressStart ( D_S *dsock, unsigned char teleopt ); ! bool compressEnd ( D_S *dsock ); /* * save.c --- 305,311 ---- * mccp.c */ bool compressStart ( D_S *dsock, unsigned char teleopt ); ! bool compressEnd ( D_S *dsock, unsigned char teleopt, bool forced ); /* * save.c *************** *** 318,321 **** * End of prototype declartion * *******************************/ ! #endif // MUD_H --- 318,321 ---- * End of prototype declartion * *******************************/ ! #endif /* MUD_H */ diff -r -N -c socketmud/src/save.c socketmud-1.2/src/save.c *** socketmud/src/save.c Sat Mar 9 19:49:57 2002 --- socketmud-1.2/src/save.c Sat Mar 22 14:40:46 2003 *************** *** 9,23 **** void save_pfile ( D_MOBILE *dMob ); void save_profile ( D_MOBILE *dMob ); - void save_whois ( D_MOBILE *dMob ); void save_player(D_MOBILE *dMob) { if (!dMob) return; ! save_pfile(dMob); /* saves the actual player data */ ! save_profile(dMob); /* saves the players profile */ ! save_whois(dMob); /* saves the whois data for that player */ } void save_pfile(D_MOBILE *dMob) --- 9,21 ---- void save_pfile ( D_MOBILE *dMob ); void save_profile ( D_MOBILE *dMob ); void save_player(D_MOBILE *dMob) { if (!dMob) return; ! save_pfile(dMob); /* saves the actual player data */ ! save_profile(dMob); /* saves the players profile */ } void save_pfile(D_MOBILE *dMob) *************** *** 232,238 **** fprintf(fp, "%s\n", FILE_TERMINATOR); fclose(fp); } - - void save_whois(D_MOBILE *dMob) - { - } --- 230,232 ---- diff -r -N -c socketmud/src/socket.c socketmud-1.2/src/socket.c *** socketmud/src/socket.c Wed Feb 26 11:06:53 2003 --- socketmud-1.2/src/socket.c Sat Mar 22 15:05:11 2003 *************** *** 84,102 **** { D_SOCKET *dsock; D_SOCKET *dsock_next; ! struct timeval tv; extern fd_set fSet; - time_t check_timer = 0; fd_set rFd; - bool wait_state; int fmax; if ((fmax = getdtablesize()) < 1) { bug("Game_loop: Fatal error in getdtablesize()"); return; } /* clear out the file socket set */ FD_ZERO(&fSet); --- 84,106 ---- { D_SOCKET *dsock; D_SOCKET *dsock_next; ! static struct timeval tv; ! struct timeval last_time, new_time; extern fd_set fSet; fd_set rFd; int fmax; + long secs, usecs; + /* get the maximum amount of sockets to listen to */ if ((fmax = getdtablesize()) < 1) { bug("Game_loop: Fatal error in getdtablesize()"); return; } + /* set this for the first loop */ + gettimeofday(&last_time, NULL); + /* clear out the file socket set */ FD_ZERO(&fSet); *************** *** 110,129 **** /* do this untill the program is shutdown */ while (!shut_down) { - /* reset the wait_state */ - wait_state = FALSE; - /* copy the socket set */ memcpy(&rFd, &fSet, sizeof(fd_set)); - /* - * Set the default timeout to 0.5 seconds, - * to make sure we can call the update function - * roughly once every second (can be a little off). - */ - tv.tv_sec = 0; - tv.tv_usec = 500000; - /* wait for something to happen */ if (select(fmax, &rFd, NULL, NULL, &tv) < 0) continue; --- 114,122 ---- *************** *** 146,154 **** dsock_next = dsock->next; /* ! * If the socket still is in the set, ! * but we are unable to read from it, ! * we close it. */ if (FD_ISSET(dsock->control, &rFd) && !read_from_socket(dsock)) { --- 139,145 ---- dsock_next = dsock->next; /* ! * Close sockects we are unable to read from. */ if (FD_ISSET(dsock->control, &rFd) && !read_from_socket(dsock)) { *************** *** 156,168 **** continue; } - /* Is the socket allowed to do a new command ? */ - if (dsock->waitstate > 0) - { - if (wait_state) dsock->waitstate--; - continue; - } - /* Ok, check for a new command */ next_cmd_from_buffer(dsock); --- 147,152 ---- *************** *** 189,217 **** dsock->next_command[0] = '\0'; } ! /* if the player quits */ if (dsock->state == STATE_CLOSED) continue; ! /* ! * Send all new data to the socket ! * and close it if any errors occour. ! */ if (!flush_output(dsock)) close_socket(dsock, FALSE); } /* ! * We get here at least once every 0.5 seconds, ! * so it should be possible to hit once every ! * second with some accuracy. */ ! if (((current_time = time(NULL)) - check_timer) >= 1) { ! wait_state = TRUE; /* make sure all sockets have their wait_state decreased */ ! check_timer = time(NULL); /* resets the check_timer */ ! update_handler(); /* calls the top-level update function */ } /* recycle sockets */ recycle_sockets(); } --- 173,228 ---- dsock->next_command[0] = '\0'; } ! /* if the player quits or get's disconnected */ if (dsock->state == STATE_CLOSED) continue; ! /* Send all new data to the socket and close it if any errors occour */ if (!flush_output(dsock)) close_socket(dsock, FALSE); } + /* call the top-level update handler */ + update_handler(); + /* ! * Here we sleep out the rest of the pulse, thus forcing ! * SocketMud(tm) to run at PULSES_PER_SECOND pulses each second. */ ! gettimeofday(&new_time, NULL); ! ! /* get the time right now, and calculate how long we should sleep */ ! usecs = (int) (last_time.tv_usec - new_time.tv_usec) + 1000000 / PULSES_PER_SECOND; ! secs = (int) (last_time.tv_sec - new_time.tv_sec); ! ! /* ! * Now we make sure that 0 <= usecs < 1.000.000 ! */ ! while (usecs < 0) ! { ! usecs += 1000000; ! secs -= 1; ! } ! while (usecs >= 1000000) ! { ! usecs -= 1000000; ! secs += 1; ! } ! ! /* if secs < 0 we don't sleep, since we have encountered a laghole */ ! if (secs > 0 || (secs == 0 && usecs > 0)) { ! struct timeval sleep_time; ! ! sleep_time.tv_usec = usecs; ! sleep_time.tv_sec = secs; ! ! if (select(0, NULL, NULL, NULL, &sleep_time) < 0) ! continue; } + /* reset the last time we where sleeping */ + gettimeofday(&last_time, NULL); + /* recycle sockets */ recycle_sockets(); } *************** *** 776,789 **** if (dsock->inbuf[i-1] == (signed char) DO) /* start compressing */ compressStart(dsock, TELOPT_COMPRESS); else if (dsock->inbuf[i-1] == (signed char) DONT) /* stop compressing */ ! compressEnd(dsock); } else if (dsock->inbuf[i] == (signed char) TELOPT_COMPRESS2) /* check for version 2 */ { if (dsock->inbuf[i-1] == (signed char) DO) /* start compressing */ compressStart(dsock, TELOPT_COMPRESS2); else if (dsock->inbuf[i-1] == (signed char) DONT) /* stop compressing */ ! compressEnd(dsock); } } else if (isprint(dsock->inbuf[i]) && isascii(dsock->inbuf[i])) --- 787,800 ---- if (dsock->inbuf[i-1] == (signed char) DO) /* start compressing */ compressStart(dsock, TELOPT_COMPRESS); else if (dsock->inbuf[i-1] == (signed char) DONT) /* stop compressing */ ! compressEnd(dsock, TELOPT_COMPRESS, FALSE); } else if (dsock->inbuf[i] == (signed char) TELOPT_COMPRESS2) /* check for version 2 */ { if (dsock->inbuf[i-1] == (signed char) DO) /* start compressing */ compressStart(dsock, TELOPT_COMPRESS2); else if (dsock->inbuf[i-1] == (signed char) DONT) /* stop compressing */ ! compressEnd(dsock, TELOPT_COMPRESS2, FALSE); } } else if (isprint(dsock->inbuf[i]) && isascii(dsock->inbuf[i])) *************** *** 994,1000 **** sock_new->state = STATE_NEW_NAME; sock_new->lookup_status = TSTATE_LOOKUP; sock_new->player = NULL; - sock_new->waitstate = 0; sock_new->top_output = 0; } --- 1005,1010 ---- *************** *** 1059,1065 **** free(dsock->hostname); /* stop compression */ ! compressEnd(dsock); /* put the socket in the free_list */ dsock->next = dsock_free; --- 1069,1075 ---- free(dsock->hostname); /* stop compression */ ! compressEnd(dsock, dsock->compressing, TRUE); /* put the socket in the free_list */ dsock->next = dsock_free; diff -r -N -c socketmud/src/update.c socketmud-1.2/src/update.c *** socketmud/src/update.c Sat Mar 9 19:49:32 2002 --- socketmud-1.2/src/update.c Sat Mar 22 14:52:30 2003 *************** *** 19,25 **** for (dsock = dsock_list; dsock; dsock = dsock->next) { ! // do nothing } return; } --- 19,25 ---- for (dsock = dsock_list; dsock; dsock = dsock->next) { ! /* do nothing */ } return; } diff -r -N -c socketmud/src/utils.c socketmud-1.2/src/utils.c *** socketmud/src/utils.c Wed Feb 26 11:41:44 2003 --- socketmud-1.2/src/utils.c Mon Mar 24 21:58:42 2003 *************** *** 34,43 **** { static D_MOBILE clear_mobile; ! *dMob = clear_mobile; ! dMob->name = NULL; ! dMob->password = NULL; ! dMob->level = LEVEL_PLAYER; } void free_mobile(D_MOBILE *dMob) --- 34,43 ---- { static D_MOBILE clear_mobile; ! *dMob = clear_mobile; ! dMob->name = NULL; ! dMob->password = NULL; ! dMob->level = LEVEL_PLAYER; } void free_mobile(D_MOBILE *dMob) *************** *** 94,100 **** default: bug("Communicate: Bad Range %d.", range); return; ! case COMM_LOCAL: // everyone is in the same room for now... sprintf(message, "%s says '%s'.\n\r", dMob->name, txt); sprintf(buf, "You say '%s'.\n\r", txt); text_to_mobile(dMob, buf); --- 94,100 ---- default: bug("Communicate: Bad Range %d.", range); return; ! case COMM_LOCAL: /* everyone is in the same room for now... */ sprintf(message, "%s says '%s'.\n\r", dMob->name, txt); sprintf(buf, "You say '%s'.\n\r", txt); text_to_mobile(dMob, buf);