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