Update of /cvsroot/netrek/client/netrekxp/src
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv29109/src

Modified Files:
	cowmain.c dmessage.c enter.c inform.c playback.c socket.c 
Log Message:
A bunch of paradise fixes and enhancements.

1) Fixed bug with paradise ALL messages going to the wrong windows.
2) Hopefully fixed bug with royals and ranks not being properly initialized.
3) Added paradise packet types to cambot.  Cambot now seems to work for
recording and playback.
4) Added paradise info window, for both players and planets, so that players
can see stuff like planet atmosphere, and the different paradise ratings, using
the info keys 'i' and 'I'.

Index: dmessage.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/dmessage.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- dmessage.c	11 Apr 2007 23:06:33 -0000	1.9
+++ dmessage.c	24 Feb 2008 00:33:55 -0000	1.10
@@ -165,7 +165,12 @@
     }
 
 
+
+#ifdef PARADISE
+    if (0) /* Paradise doesn't support the message flags */
+#else
     if (niftyNewMessages)
+#endif
     {
         if (logging)
         {

Index: inform.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/inform.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- inform.c	18 May 2007 19:54:38 -0000	1.6
+++ inform.c	24 Feb 2008 00:33:56 -0000	1.7
@@ -42,6 +42,10 @@
 };
 #endif
 
+#ifdef PARADISE
+static void Info_list_paradise (struct player * j);
+#endif
+
 /******************************************************************************/
 /***  inform()                                                              ***/
 /******************************************************************************/
@@ -56,17 +60,12 @@
     register struct player *j;
     register struct planet *k;
     int mx, my;
-    double dist;
     struct obtype *gettarget (W_Window ww,
                               int x,
                               int y,
                               int targtype),
      *target;
     int windowWidth, windowHeight;
-    float KillsPerHour, LossesPerHour;  /* SB info window changed to
-                                         * use these instead of
-                                         * Offense and Defense.
-                                         * 12/27/93 ATH */
 
     mx = x;
     my = y;
@@ -97,6 +96,53 @@
     {
         if (key == 'i')
         {
+#ifdef PARADISE
+            double dist;
+            /* Too close to the edge? */
+            if (mx + 23 * W_Textwidth + 2 > windowWidth)
+                mx = windowWidth - 23 * W_Textwidth - 2;
+            if (my + 6 * W_Textheight + 2 > windowHeight)
+                my = windowHeight - 6 * W_Textheight - 2;
+
+            infow =
+                W_MakeWindow ("info", mx, my, 23 * W_Textwidth,
+                              7 * W_Textheight, ww, 2, foreColor);
+            W_MapWindow (infow);
+            j = &players[target->o_num];
+            (void) sprintf (buf, "%s (%c%c)", j->p_name, teamlet[j->p_team],
+                            shipnos[j->p_no]);
+            W_WriteText (infow, W_Textwidth, W_Textheight * line++,
+                         playerColor (j), buf, strlen (buf), shipFont (j));
+            (void) sprintf (buf, "Speed:   %-d", j->p_speed);
+            W_WriteText (infow, W_Textwidth, W_Textheight * line++,
+                         playerColor (j), buf, strlen (buf), W_RegularFont);
+
+            (void) sprintf (buf, "kills:   %-4.2f", j->p_kills);
+            W_WriteText (infow, W_Textwidth, W_Textheight * line++,
+                         playerColor (j), buf, strlen (buf), W_RegularFont);
+            dist = hypot((double) (me->p_x - j->p_x),
+                         (double) (me->p_y - j->p_y)) / (double) GRIDSIZE;
+            (void) sprintf(buf, "dist:    %-1.2f sectors", dist);
+             W_WriteText (infow, W_Textwidth, W_Textheight * line++,
+                         playerColor (j), buf, strlen (buf), W_RegularFont);
+            (void) sprintf (buf, "Ship Type: %-s",
+                            my_classes[j->p_ship.s_type]);
+            W_WriteText (infow, W_Textwidth, W_Textheight * line++,
+                         playerColor (j), buf, strlen (buf), W_RegularFont);
+
+            if (j->p_swar & me->p_team)
+                W_WriteText (infow, W_Textwidth, W_Textheight * line++,
+                             playerColor (j), "WAR", 3, W_RegularFont);
+            else if (j->p_hostile & me->p_team)
+                W_WriteText (infow, W_Textwidth, W_Textheight * line++,
+                             playerColor (j), "HOSTILE", 7, W_RegularFont);
+            else
+                W_WriteText (infow, W_Textwidth, W_Textheight * line++,
+                             playerColor (j), "PEACEFUL", 8, W_RegularFont);
+            (void) sprintf (buf, "%s@%s", j->p_login, j->p_monitor);
+            W_WriteText (infow, W_Textwidth, W_Textheight * line++,
+                         playerColor (j), buf, strlen (buf), W_RegularFont);
+#else
             /* Too close to the edge? */
             if (mx + 23 * W_Textwidth + 2 > windowWidth)
                 mx = windowWidth - 23 * W_Textwidth - 2;
@@ -136,9 +182,30 @@
             (void) sprintf (buf, "%s@%s", j->p_login, j->p_monitor);
             W_WriteText (infow, W_Textwidth, W_Textheight * line++,
                          playerColor (j), buf, strlen (buf), W_RegularFont);
+#endif
         }
         else
         {                       /* New information window! */
+#ifdef PARADISE
+            if (mx + 50 * W_Textwidth + 2 > windowWidth)
+                mx = windowWidth - 50 * W_Textwidth - 2;
+            if (my + 25 * W_Textheight + 2 > windowHeight)
+                my = windowHeight - 22 * W_Textheight - 2;
+
+            infow =
+                W_MakeWindow ("info", mx, my, 50 * W_Textwidth,
+                              25 * W_Textheight, ww, 2, foreColor);
+            W_MapWindow (infow);
+            j = &players[target->o_num];
+            (void) sprintf (buf, "%s (%c%c):", j->p_name, teamlet[j->p_team],
+                            shipnos[j->p_no]);
+            W_WriteText (infow, W_Textwidth, W_Textheight * line++,
+                         playerColor (j), buf, strlen (buf), shipFont (j));
+            Info_list_paradise(j);
+#else
+            float KillsPerHour, LossesPerHour;  /* SB info window changed to
+                                                 * use these instead of
+                                                 * Offense and Defense. */
             if (mx + 24 * W_Textwidth + 2 > windowWidth)
                 mx = windowWidth - 24 * W_Textwidth - 2;
             if (my + 10 * W_Textheight + 2 > windowHeight)
@@ -226,10 +293,105 @@
             }
             W_WriteText (infow, W_Textwidth, W_Textheight * line++,
                          playerColor (j), buf, strlen (buf), W_RegularFont);
+#endif
         }
     }
     else
     {                           /* Planet */
+#ifdef PARADISE
+        /* Too close to the edge? */
+        if (mx + 23 * W_Textwidth + 2 > windowWidth)
+            mx = windowWidth - 28 * W_Textwidth - 2;
+        if (my + 5 * W_Textheight + 2 > windowHeight)
+            my = windowHeight - 5 * W_Textheight - 2;
+
+        infow =
+            W_MakeWindow ("info", mx, my, W_Textwidth * 28, W_Textheight * 5,
+                          ww, 2, foreColor);
+        W_MapWindow (infow);
+        k = &planets[target->o_num];
+        if ((k->pl_info & me->p_team)
+#ifdef RECORDGAME
+            || playback
+#endif
+            )
+        {
+            if (k->pl_flags & PLSTAR) /* test if planet is a star */
+            {
+                (void) sprintf(buf, "%s", k->pl_name);
+                W_WriteText(infow, W_Textwidth, W_Textheight * line++, textColor,
+                            buf, strlen(buf), W_RegularFont);
+                (void) sprintf(buf, "STAR  ");
+                W_WriteText(infow, W_Textwidth, W_Textheight * line++,
+                            textColor, buf, strlen(buf), W_RegularFont);
+            }
+            else /* not a star */
+            {
+                (void) sprintf(buf, "%s (%c)", k->pl_name, teamlet[k->pl_owner]);
+                W_WriteText(infow, W_Textwidth, W_Textheight * line++, planetColor (k),
+                            buf, strlen(buf), planetFont (k));
+                (void) sprintf(buf, "Armies %d", k->pl_armies);
+                W_WriteText(infow, W_Textwidth, W_Textheight * line++, planetColor (k),
+                            buf, strlen(buf), W_RegularFont);
+                (void) sprintf(buf, "%s %s %s %s",
+                              (k->pl_flags & PLREPAIR ? "RPR" : "      "),
+                              (k->pl_flags & PLFUEL ? "FUEL" : "    "),
+                              (k->pl_flags & PLAGRI ? "AGRI" : "    "),
+                              (k->pl_flags & PLSHIPYARD ? "SHPYD" : "     "));
+                W_WriteText(infow, W_Textwidth, W_Textheight * line++, planetColor (k),
+                            buf, strlen(buf), W_RegularFont);
+                (void) sprintf(buf, "atmos: ");
+                switch (k->pl_flags & PLATMASK) {
+                    case PLPOISON:
+                        strcat(buf, "TOXC  surfc: ");
+                        break;
+                    case PLATYPE3:
+                        strcat(buf, "TNTD  surfc: ");
+                        break;
+                    case PLATYPE2:
+                        strcat(buf, "THIN  surfc: ");
+                        break;
+                    case PLATYPE1:
+                        strcat(buf, "STND  surfc: ");
+                        break;
+                    default:
+                        strcat(buf, "      surfc: ");
+                        break;
+                };
+                if (k->pl_flags & PLDILYTH)
+                    strcat(buf, "D");
+                else
+                    strcat(buf, " ");
+                if (k->pl_flags & PLMETAL)
+                    strcat(buf, "M");
+                else
+                    strcat(buf, " ");
+                if (k->pl_flags & PLARABLE)
+                    strcat(buf, "A");
+                else
+                    strcat(buf, " ");
+                W_WriteText(infow, W_Textwidth, W_Textheight * line++, planetColor (k),
+                            buf, strlen(buf), W_RegularFont);
+                sprintf(buf, "Time: %-5d Visit: %c%c%c%c",
+                       ((me->p_team == k->pl_owner) ? 0 : (int) (status2->clock - k->pl_timestamp)),
+                       (k->pl_info & FED ? 'F' : ' '),
+                       (k->pl_info & ROM ? 'R' : ' '),
+                       (k->pl_info & KLI ? 'K' : ' '),
+                       (k->pl_info & ORI ? 'O' : ' '));
+                W_WriteText(infow, W_Textwidth, W_Textheight * line++, planetColor (k),
+                            buf, strlen(buf), W_RegularFont);
+            }
+        }
+        else
+        {
+            (void) sprintf (buf, "%s", k->pl_name);
+            W_WriteText (infow, W_Textwidth, W_Textheight * line++,
+                         planetColor (k), buf, strlen (buf), W_RegularFont);
+            (void) sprintf (buf, "No other info");
+            W_WriteText (infow, W_Textwidth, W_Textheight * line++,
+                         planetColor (k), buf, strlen (buf), W_RegularFont);
+        }
+#else
         /* Too close to the edge? */
         if (mx + 23 * W_Textwidth + 2 > windowWidth)
             mx = windowWidth - 28 * W_Textwidth - 2;
@@ -241,8 +403,6 @@
                           ww, 2, foreColor);
         W_MapWindow (infow);
         k = &planets[target->o_num];
-        dist = hypot ((double) (me->p_x - k->pl_x),
-                      (double) (me->p_y - k->pl_y));
         if ((k->pl_info & me->p_team)
 #ifdef RECORDGAME
             || playback
@@ -276,9 +436,257 @@
             W_WriteText (infow, W_Textwidth, W_Textheight * line++,
                          planetColor (k), buf, strlen (buf), W_RegularFont);
         }
+#endif
     }
 }
 
+#ifdef PARADISE
+/*
+   fills the ratings struct pointed to by r with the stats for the player
+   pointed to by j [BDyess]
+*/
+struct ratings *
+get_ratings(struct player *j, struct ratings *r)
+{
+	struct stats2 *s;	/* point to player's paradise stats */
+	float   t, t2;		/* temps */
+
+	s = &(j->p_stats2);
+	/* fill in kills, losses, and maxkills based on ship type */
+	if (j->p_ship.s_type == STARBASE) {
+	    r->r_kills = s->st_sbkills;
+	    r->r_losses = s->st_sblosses;
+	    r->r_maxkills = s->st_sbmaxkills;
+	} else if (j->p_ship.s_type == WARBASE) {
+	    r->r_kills = s->st_wbkills;
+	    r->r_losses = s->st_wblosses;
+	    r->r_maxkills = s->st_wbmaxkills;
+	} else {
+	    r->r_kills = s->st_tkills;
+	    r->r_losses = s->st_tlosses;
+	    r->r_maxkills = s->st_tmaxkills;
+	}
+	/* calculate ratio */
+	r->r_ratio = (r->r_losses != 0) ? r->r_kills / (float) r->r_losses
+	    : r->r_kills;
+	/*
+	   r->r_ratio = (s->st_tlosses != 0) ? (float) s->st_tkills / (float)
+	   s->st_tlosses : s->st_tkills;
+	*/
+	status2->timeprod = status2->timeprod ? status2->timeprod : 1;
+	t = (float) s->st_tticks / (float) status2->timeprod;	/* hour ratio */
+	if (t == 0.0)
+	    t = 1.0;
+	t2 = t * (float) status2->losses;	/* get expected losses */
+	if(t2 == 0) t2=1;
+	r->r_defrat = s->st_tlosses / t2;	/* calc defense rating */
+
+	t2 = t * (float) status2->kills;	/* get expected kills */
+	if(t2 == 0) t2=1;
+	r->r_offrat = s->st_tkills / t2;	/* calc offense rating */
+
+	t2 = t * (float) status2->armsbomb;	/* expected armies bombed */
+	if(t2 == 0) t2=1;
+	r->r_bombrat = (float) s->st_tarmsbomb / t2;	/* bomb rating */
+
+	t2 = t * (float) status2->resbomb;	/* expected resources bmbd */
+	if(t2 == 0) t2=1;
+	r->r_resrat = (float) s->st_tresbomb / t2;	/* resrce bmbd rating */
+
+	t2 = t * (float) status2->dooshes;	/* expected armies dooshed */
+	if(t2 == 0) t2=1;
+	r->r_dooshrat = (float) s->st_tdooshes / t2;	/* doosh rating */
+
+	r->r_batrat = r->r_dooshrat + r->r_offrat;	/* get battle rating */
+
+	t2 = t * (float) status2->planets;	/* expected planets */
+	if(t2 == 0) t2=1;
+	r->r_planetrat = (float) s->st_tplanets / t2;	/* get planet rating */
+	/* strategy rating */
+	r->r_stratrat = r->r_bombrat + r->r_resrat + r->r_planetrat;
+	/* calculate sb rating */
+	t2 = (float) status2->sbkills / (float)( (status2->sblosses > 0) ? status2->sblosses : 1);
+	if (s->st_sblosses == 0)
+	    r->r_sbrat = 0.0;
+	else if (t2 == 0)
+	    r->r_sbrat = 99.0;
+	else
+	    r->r_sbrat = ((float) s->st_sbkills / (float) s->st_sblosses) / t2;
+	/* calculate wb rating */
+	t2 = (float) status2->wbkills / (float)( (status2->wblosses > 0) ? status2->wblosses : 1);
+	if (s->st_wblosses == 0)
+	    r->r_wbrat = 0.0;
+	else if (t2 == 0)
+	    r->r_wbrat = 99.0;
+	else
+	    r->r_wbrat = ((float) s->st_wbkills / (float) s->st_wblosses) / t2;
+	/* calculate js rating */
+	t = (float) s->st_jsticks / (float)( (status2->jstime > 0) ? status2->jstime : 1);
+	t2 = t * (float) status2->jsplanets;	/* get expected js planets */
+	if (t2 == 0.0)
+	    r->r_jsrat = 0.0;
+	else if (t2 == 0)
+	    r->r_jsrat = 99.0;
+	else
+	    r->r_jsrat = (float) s->st_jsplanets / t2;	/* js rating */
+	r->r_jsplanets = s->st_jsplanets;	/* store js planets */
+
+	r->r_specrat = r->r_sbrat + r->r_wbrat + r->r_jsrat;	/* get special ship
+								   rating */
+	/* put the sum of the three major ratings in the 'ratings' slot */
+	r->r_ratings = r->r_specrat + r->r_batrat + r->r_stratrat;
+	r->r_genocides = s->st_genocides;	/* get # genocides */
+	r->r_di = s->st_di;	/* get player's DI */
+	t = (s->st_tticks) ? s->st_tticks : (float) 1.0;
+	r->r_killsPerHour = r->r_kills * (float) 36000.0 / t;
+	r->r_lossesPerHour = r->r_losses * (float) 36000.0 / t;
+	r->r_planets = s->st_tplanets;
+	r->r_armies = s->st_tarmsbomb;
+	r->r_resources = s->st_tresbomb;
+	r->r_dooshes = s->st_tdooshes;
+	/* r->r_jsplanets = s->st_jsplanets; */
+        return r;
+}
+
+static void
+Info_list_paradise(struct player *j)
+{
+    char buf[80];
+    int line = 0;
+    struct ratings r;
+
+    get_ratings(j, &r);
+
+    sprintf(buf, "Name: %s", j->p_name);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Rank: %s", ranks2[j->p_stats2.st_rank].name);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Royalty: %s", royal[j->p_stats2.st_royal].name);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Genocides: %4d", r.r_genocides);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "DI:     %7.2f", r.r_di);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Maxkills:%6.2f", j->p_stats2.st_tmaxkills);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Kills:     %4d", j->p_stats2.st_tkills);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Losses:    %4d", j->p_stats2.st_tlosses);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "T-hours: %6.2f", (float) j->p_stats2.st_tticks / 36000.0);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "   ");
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    strcpy(buf, "            Rating Total");
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Bombing:   %5.2f  %6d", r.r_bombrat, r.r_armies);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Planets:   %5.2f  %6d", r.r_planetrat, r.r_planets);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Resources: %5.2f  %6d", r.r_resrat, r.r_resources);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Dooshes:   %5.2f  %6d", r.r_dooshrat, r.r_dooshes);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Ratio:     %5.2f", j->p_stats2.st_tkills /
+	    ((j->p_stats2.st_tlosses) ? j->p_stats2.st_tlosses : 1.0));
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Offense:   %5.2f", r.r_offrat);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "   ");
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "RATINGS");
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Special ships: %7.2f", r.r_specrat);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Battle:        %7.2f", r.r_batrat);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Strategy:      %7.2f", r.r_stratrat);
+    W_WriteText(infow, W_Textwidth, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+
+    line = 1;
+    sprintf(buf, "   ");
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "JUMPSHIP STATS");
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Planets:    %7d", j->p_stats2.st_jsplanets);
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Hours:      %7.2f", (float) j->p_stats2.st_jsticks / 36000.0);
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "JS rating:  %7.2f", r.r_jsrat);
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+
+    sprintf(buf, "   ");
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "STARBASE STATS");
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Kills:        %4d", j->p_stats2.st_sbkills);
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Losses:       %4d", j->p_stats2.st_sblosses);
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Hours:     %7.2f", (float) j->p_stats2.st_sbticks / 36000.0);
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Maxkills:  %7.2f", j->p_stats2.st_sbmaxkills);
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "SB rating: %7.2f", r.r_sbrat);
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+
+    sprintf(buf, "   ");
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "WARBASE STATS");
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Kills:        %4d", j->p_stats2.st_wbkills);
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Losses:       %4d", j->p_stats2.st_wblosses);
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Hours:     %7.2f", (float) j->p_stats2.st_wbticks / 36000.0);
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "Maxkills:  %7.2f", j->p_stats2.st_wbmaxkills);
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+    sprintf(buf, "WB rating: %7.2f", r.r_wbrat);
+    W_WriteText(infow, W_Textwidth * 28, W_Textheight * line++, playerColor(j),
+		buf, strlen(buf), W_RegularFont);
+}
+#endif
 
 /******************************************************************************/
 /***  destroyInfo()                                                         ***/

Index: enter.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/enter.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- enter.c	7 Jun 2007 04:43:38 -0000	1.13
+++ enter.c	24 Feb 2008 00:33:55 -0000	1.14
@@ -55,14 +55,8 @@
     plasmatorps = (struct plasmatorp *) malloc(sizeof(*plasmatorps) * MAXPLAYER * MAXPLASMA);
 #ifdef PARADISE
     thingies = (struct thingy *) malloc(sizeof(*thingies) * (MAXPLAYER * npthingies + ngthingies));
-    ranks2 = (struct rank2 *) malloc(sizeof(*ranks2) * nranks2);
-    for (i = 0; i < nranks2; i++)
-	ranks2[i].name = strdup("blank");
     /* independent is teaminfo[-1] */
     teaminfo = 1 + (struct teaminfo_s *) malloc(sizeof(*teaminfo) * (number_of_teams + 2));
-    royal = (struct royalty *) malloc(sizeof(*royal) * nroyals);
-    for (i = 0; i < nroyals; i++) 
-	royal[i].name = strdup("blank");
     status2 = (struct status2 *) malloc(sizeof(*status2));
 #endif
     status = (struct status *) malloc(sizeof(*status));
@@ -77,6 +71,8 @@
         players[i].p_no = i;
         players[i].p_ntorp = 0;
 #ifdef PARADISE
+        players[i].p_stats2.st_rank = 0;
+        players[i].p_stats2.st_royal = 0;
         players[i].p_ndrone = 0;
 #endif
         players[i].p_explode = 1;

Index: playback.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/playback.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- playback.c	16 May 2007 00:05:16 -0000	1.22
+++ playback.c	24 Feb 2008 00:33:56 -0000	1.23
@@ -199,6 +199,9 @@
 
 
     resetdefaults ();
+#ifdef PARADISE
+    build_default_configuration();
+#endif
     newwin (display_host, name);
 
     savebitmaps ();
@@ -518,6 +521,18 @@
     case SP_S_KILLS:
     case SP_S_STATS:
     case SP_FEATURE:
+#ifdef PARADISE
+    case SP_SCAN:
+    case SP_STATS2:
+    case SP_STATUS2:
+    case SP_PLANET2:
+    case SP_THINGY:
+    case SP_THINGY_INFO:
+    case SP_GPARAM:
+    case SP_PARADISE_EXT1:
+    case SP_TERRAIN2:
+    case SP_TERRAIN_INFO2:
+#endif
 
         return 1;
     }

Index: cowmain.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/cowmain.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -d -r1.35 -r1.36
--- cowmain.c	29 Jul 2007 01:38:41 -0000	1.35
+++ cowmain.c	24 Feb 2008 00:33:55 -0000	1.36
@@ -779,6 +779,9 @@
         ind_ship_bmp_HR = stringDefault ("indshipHRbmpfile");
 
     resetdefaults ();
+#ifdef PARADISE
+    build_default_configuration();
+#endif
     newwin (display_host, name);
 
     if (hideConsole)

Index: socket.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/socket.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -d -r1.36 -r1.37
--- socket.c	7 Jun 2007 04:43:39 -0000	1.36
+++ socket.c	24 Feb 2008 00:33:56 -0000	1.37
@@ -2368,11 +2368,13 @@
         LineToConsole ("handlePlyrLogin: bad index %d\n", packet->pnum);
         return;
     }
+#ifndef PARADISE
     if (packet->rank >= NUMRANKS)
     {
         LineToConsole ("handlePlyrLogin: bad rank %d\n", packet->rank);
         return;
     }
+#endif
     packet->name[sizeof (packet->name) - 1] = '\0';
     packet->monitor[sizeof (packet->monitor) - 1] = '\0';
     packet->login[sizeof (packet->login) - 1] = '\0';
@@ -3201,6 +3203,149 @@
 void
 initialize_ranks(void)
 {
+    ranks2 = (struct rank2 *) malloc(sizeof(*ranks2) * nranks2);
+    ranks2[0].genocides = 0;
+    ranks2[0].di = 0;
+    ranks2[0].battle = 0.0;
+    ranks2[0].strategy = 0.0;
+    ranks2[0].specship = 0.0;
+    ranks2[0].name = strdup("Recruit");
+
+    ranks2[1].genocides = 1;
+    ranks2[1].di = 10;
+    ranks2[1].battle = (float) 0.30;
+    ranks2[1].strategy = (float) 0.3;
+    ranks2[1].specship = 0.0;
+    ranks2[1].name = strdup("Specialist");
+
+    ranks2[2].genocides = 2;
+    ranks2[2].di = 25;
+    ranks2[2].battle = (float) 0.40;
+    ranks2[2].strategy = (float) 0.6;
+    ranks2[2].specship = 0.0;
+    ranks2[2].name = strdup("Cadet");
+
+    ranks2[3].genocides = 3;
+    ranks2[3].di = 45;
+    ranks2[3].battle = (float) 0.50;
+    ranks2[3].strategy = (float) 0.9;
+    ranks2[3].specship = 0.0;
+    ranks2[3].name = strdup("Midshipman");
+
+    ranks2[4].genocides = 4;
+    ranks2[4].di = 70;
+    ranks2[4].battle = (float) 0.70;
+    ranks2[4].strategy = (float) 1.2;
+    ranks2[4].specship = 0.0;
+    ranks2[4].name = strdup("Ensn. J.G.");
+
+    ranks2[5].genocides = 5;
+    ranks2[5].di = 100;
+    ranks2[5].battle = (float) 0.90;
+    ranks2[5].strategy = (float) 1.5;
+    ranks2[5].specship = 0.0;
+    ranks2[5].name = strdup("Ensign");
+
+    ranks2[6].genocides = 6;
+    ranks2[6].di = 140;
+    ranks2[6].battle = (float) 1.10;
+    ranks2[6].strategy = (float) 2.0;
+    ranks2[6].specship = 0.0;
+    ranks2[6].name = strdup("Lt. J.G.");
+
+    ranks2[7].genocides = 8;
+    ranks2[7].di = 190;
+    ranks2[7].battle = (float) 1.30;
+    ranks2[7].strategy = (float) 2.5;
+    ranks2[7].specship = 0.0;
+    ranks2[7].name = strdup("Lieutenant");
+
+    ranks2[8].genocides = 10;
+    ranks2[8].di = 250;
+    ranks2[8].battle = (float) 1.50;
+    ranks2[8].strategy = (float) 3.0;
+    ranks2[8].specship = (float) 0.5;
+    ranks2[8].name = strdup("Lt. Cmdr.");
+
+    ranks2[9].genocides = 15;
+    ranks2[9].di = 300;
+    ranks2[9].battle = (float) 1.80;
+    ranks2[9].strategy = (float) 3.5;
+    ranks2[9].specship = (float) 0.7;
+    ranks2[9].name = strdup("Commander");
+
+    ranks2[10].genocides = 18;
+    ranks2[10].di = 350;
+    ranks2[10].battle = (float) 2.00;
+    ranks2[10].strategy = (float) 4.0;
+    ranks2[10].specship = (float) 1.0;
+    ranks2[10].name = strdup("Captain");
+
+    ranks2[11].genocides = 25;
+    ranks2[11].di = 400;
+    ranks2[11].battle = (float) 2.10;
+    ranks2[11].strategy = (float) 4.3;
+    ranks2[11].specship = (float) 2.5;
+    ranks2[11].name = strdup("Fleet Capt.");
+
+    ranks2[12].genocides = 50;
+    ranks2[12].di = 500;
+    ranks2[12].battle = (float) 2.15;
+    ranks2[12].strategy = (float) 4.8;
+    ranks2[12].specship = (float) 3.0;
+    ranks2[12].name = strdup("Commodore");
+
+    ranks2[13].genocides = 75;
+    ranks2[13].di = 700;
+    ranks2[13].battle = (float) 2.20;
+    ranks2[13].strategy = (float) 5.3;
+    ranks2[13].specship = (float) 3.3;
+    ranks2[13].name = strdup("Moff");
+
+    ranks2[14].genocides = 100;
+    ranks2[14].di = 900;
+    ranks2[14].battle = (float) 2.25;
+    ranks2[14].strategy = (float) 5.7;
+    ranks2[14].specship = (float) 3.6;
+    ranks2[14].name = strdup("Grand Moff");
+
+    ranks2[15].genocides = 300;
+    ranks2[15].di = 1200;
+    ranks2[15].battle = (float) 2.30;
+    ranks2[15].strategy = (float) 6.0;
+    ranks2[15].specship = (float) 3.8;
+    ranks2[15].name = strdup("Rear Adml.");
+
+    ranks2[16].genocides = 700;
+    ranks2[16].di = 1700;
+    ranks2[16].battle = (float) 2.35;
+    ranks2[16].strategy = (float) 6.1;
+    ranks2[16].specship = (float) 4.0;
+    ranks2[16].name = strdup("Admiral");
+
+    ranks2[17].genocides = 1000;
+    ranks2[17].di = 2500;
+    ranks2[17].battle = (float) 2.40;
+    ranks2[17].strategy = (float) 6.2;
+    ranks2[17].specship = (float) 4.2;
+    ranks2[17].name = strdup("Grand Adml.");
+}
+
+void
+initialize_royal(void)
+{
+    royal = (struct royalty *) malloc(sizeof(*royal) * nroyals);
+
+    royal[0].name = strdup("none");
+    royal[1].name = strdup("Wesley");
+    royal[2].name = strdup("Centurion");
+    royal[3].name = strdup("Praetor");
+    royal[4].name = strdup("Emperor");
+}
+
+void
+reinitialize_ranks(void)
+{
     int     i;
     ranks2 = (struct rank2 *) malloc(sizeof(*ranks2) * nranks2);
 
@@ -3210,7 +3355,7 @@
 }
 
 void
-initialize_royal(void)
+reinitialize_royal(void)
 {
     int     i;
     royal = (struct royalty *) malloc(sizeof(*royal) * nroyals);
@@ -3220,6 +3365,12 @@
     }
 }
 
+void
+build_default_configuration(void)
+{
+    initialize_ranks();
+    initialize_royal();
+}
 
 void
 resize_players(void)
@@ -3358,8 +3509,8 @@
 
     load_generic_teams();
 
-    initialize_ranks();
-    initialize_royal();
+    reinitialize_ranks();
+    reinitialize_royal();
 
     resize_players();
     initialize_torps();