The following patch is for discussion. It changes the t-mode scumming check by preventing t-mode from beginning at all if there are players present from the same IP address. Once the duplication is resolved t-mode begins. It is implemented as a state machine. The state variable is: static enum ts { TS_PICKUP, TS_SCUMMERS, TS_BEGIN, TS_TOURNAMENT, TS_END } ts = TS_PICKUP; Alternate ideas I've been playing with ... - exclude the duplicate IP players from the total per team, such that with four clients on Federation from the same IP, they'd need another three ships before Federation would be considered to have quorum, - make CHECKSCUM a maximum number of duplicates allowed, so that legitimate players from the same IP are permitted, - if every slot is guest, don't care, allow t-mode. (The intention is to hinder the social "problem" of players feeding their character kills while waiting for other players to arrive. Distortion of t-mode statistics. It's not that I care about the statistics, it's that people perceive the problem.) -- James Cameron mailto:quozl at us.netrek.org http://quozl.netrek.org/ -------------- next part -------------- Index: ntserv/daemonII.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/daemonII.c,v retrieving revision 1.6 diff -u -r1.6 daemonII.c --- ntserv/daemonII.c 14 Apr 2006 10:19:17 -0000 1.6 +++ ntserv/daemonII.c 14 Apr 2006 12:44:22 -0000 @@ -67,7 +67,7 @@ /* file scope prototypes */ static void check_load(void); static int tournamentMode(void); -static int check_scummers(void); +static int check_scummers(int); static void move(int ignored); static void udplayersight(void); static void udplayers(void); @@ -394,7 +394,7 @@ Nick Trown 12/19/92 */ -static int check_scummers(void) +static int check_scummers(int verbose) { int i, j; int num; @@ -443,7 +443,8 @@ } } } - if (num>1){ + if (num>0){ + if (!verbose) return 1; pmessage(0,MALL,"GOD->ALL", "*****************************************"); pmessage(0,MALL,"GOD->ALL","Possible t-mode scummers have been found."); pmessage(0,MALL,"GOD->ALL","They have been noted for god to review."); @@ -553,6 +554,13 @@ static int oldtourn=0; static int oldmessage; int old_robot; + static enum ts { + TS_PICKUP, + TS_SCUMMERS, + TS_BEGIN, + TS_TOURNAMENT, + TS_END + } ts = TS_PICKUP; /* Don't tell us it's time for another move in the middle of a move. */ (void) SIGNAL(SIGALRM, SIG_IGN); @@ -618,24 +626,49 @@ pmessage(0, MALL, "GOD->ALL","Loading new server configuration."); } - if (tournamentMode()) { - if (!oldtourn) { - if (check_scum) - check_scummers(); /* NBT */ - oldmessage=(random() % 8); + switch (ts) { + case TS_PICKUP: + status->tourn = 0; + if (tournamentMode()) { + ts = TS_BEGIN; + if (check_scum && check_scummers(1)) + ts = TS_SCUMMERS; + } + break; + + case TS_SCUMMERS: + status->tourn = 0; + if (!tournamentMode()) { + ts = TS_PICKUP; + } else { + if (!check_scum) { + ts = TS_BEGIN; + break; + } + if (!check_scummers(0)) + ts = TS_BEGIN; + } + break; + + case TS_BEGIN: + oldmessage = (random() % 8); political_begin(oldmessage); - } - oldtourn=1; - status->tourn=1; - status->time++; - tourntimestamp = ticks; - } else { - if (oldtourn) { + ts = TS_TOURNAMENT; + /* break; */ + + case TS_TOURNAMENT: + status->tourn = 1; + status->time++; + tourntimestamp = ticks; + if (tournamentMode()) break; + ts = TS_END; + /* break; */ + + case TS_END: tourntimestamp = ticks; /* record end of Tmode 8/2/91 TC */ - political_end(oldmessage); - } - oldtourn=0; - status->tourn=0; + political_end(oldmessage); + ts = TS_PICKUP; + break; } #ifdef PUCK_FIRST -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 189 bytes Desc: Digital signature Url : http://mailman.us.netrek.org/pipermail/netrek-dev/attachments/20060414/17ea926d/attachment.pgp