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

Modified Files:
	dashboard.c warning.c 
Log Message:
Fix to bug where client sometimes has wrong value for what planet you are orbitting.
Addition of phaser stats to long packets.

Index: warning.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/warning.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- warning.c	18 May 2006 07:15:35 -0000	1.6
+++ warning.c	20 May 2006 03:55:23 -0000	1.7
@@ -48,7 +48,50 @@
        rdelay = time (0) + REFITTIME;
     if (doDeclare)
        delay = time (0) + DECLARETIME;
+       
 #ifdef PHASER_STATS
+    if (!recv_short)   /* Gotta parse phaser info for long packets here */
+    {
+        if (strncmp(text, "You destroyed the plasma", 24) == 0)       /* Plasma hit */
+        {
+            phaserStatTry++;
+            phaserStatHit++;
+            /* Record as an average damage hit so as not to skew overall average */
+            phaserStatDamage += phaserStatDamage / phaserStatTry;
+        }
+        if (strncmp(text, "Phaser missed", 13) == 0)        /* Miss */
+        {
+            phaserStatTry++;
+            if (phaserStats)
+            {
+            	/* Mung the message */
+                char phstatmsg[30];
+
+                sprintf (phstatmsg, "%s [%d%%]", text,
+                         phaserStatTry ? (phaserStatHit * 100) /
+                         phaserStatTry : 0);
+                strcpy (text, phstatmsg);
+                /* Update string length */
+                warncount = strlen (text);
+            }
+        }
+        if (doPhaser)     /* Parse out damage and record to average */
+        {
+            char *d;
+            register int damage;
+            d = &text[warncount];
+            /* find the last number in the string, should be damage */
+            while (!isdigit(*d) && d > text) 
+                d--;
+            while (d > text && isdigit(*d))
+               d--;
+            if (d > text)
+                damage = atoi(d);
+            phaserStatTry++;
+            phaserStatHit++;
+            phaserStatDamage += damage;
+        }
+    }
     if (doPhaser && phaserStats)
     {
         sprintf (newtext, "%s [%3d%%] [%2u]", text,

Index: dashboard.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/dashboard.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- dashboard.c	19 May 2006 18:08:07 -0000	1.5
+++ dashboard.c	20 May 2006 03:55:23 -0000	1.6
@@ -18,6 +18,7 @@
 /******************************************************************************/
 
 #include <stdio.h>
+#include <math.h>
 
 #include "config.h"
 #include "copyright.h"
@@ -287,12 +288,12 @@
     static int oldmsgtype;
     W_Color color;
     int left, right, pos;
-    
+
     if ((me->p_flags & (PFPLOCK | PFOBSERV)) == (PFPLOCK | PFOBSERV))
         plr = players + me->p_playerl;
     else
         plr = me;
-    
+
     /* Check if any delays expired */
     if (delay && time (0) > delay)
         delay = 0;
@@ -300,10 +301,10 @@
         rdelay = 0;
     if (tdelay && time (0) > tdelay)
         tdelay = 0;
-        
+
     /* Start with highest priority message, then go down in descending order
        of importance */
-       
+
     /* Declare War text */
     if (delay)
     {
@@ -852,23 +853,29 @@
     int hulltime = 0;
     int shieldneeded, hullneeded;
     float shieldrate = 0.0, hullrate = 0.0;
-    
+    struct player *plr;
+
+    if ((me->p_flags & (PFPLOCK | PFOBSERV)) == (PFPLOCK | PFOBSERV))
+        plr = players + me->p_playerl;
+    else
+        plr = me;
+        
     /* 100 subshield or subdamage =  1 shield or hull repaired 
        This routine is used by server every update (and 10 updates/sec) */
     /* calculate shield repair rate */
     if ((shieldneeded = (me->p_ship.s_maxshield - me->p_shield)) > 0)
     {
         me->p_subshield = me->p_ship.s_repair * 4;
-        if ((me->p_flags & PFORBIT)
-        && (planets[me->p_planet].pl_flags & PLREPAIR)
-        &&(!(planets[me->p_planet].pl_owner & (me->p_swar | me->p_hostile))))
-        {
-            me->p_subshield += me->p_ship.s_repair * 4;
-        }
-        if (me->p_flags & PFDOCK)
+        if (me->p_flags & PFORBIT)
         {
-    	    me->p_subshield += me->p_ship.s_repair * 6;
-        }
+            /* Damn server doesn't send us p_planet info, have to calculate it ourselves! */
+            me->p_planet = get_closest_planet(me->p_x, me->p_y);
+            if ((planets[me->p_planet].pl_flags & PLREPAIR)
+            &&(!(planets[me->p_planet].pl_owner & (plr->p_swar | plr->p_hostile))))
+                me->p_subshield += me->p_ship.s_repair * 4;
+            if (me->p_flags & PFDOCK)
+    	        me->p_subshield += me->p_ship.s_repair * 6;
+    	}
         /* Calculate time needed to repair shields */
         shieldrate = (float)(me->p_subshield)/(float)100.0;
         shieldtime = (int)(shieldneeded/shieldrate);
@@ -878,20 +885,44 @@
     if (((hullneeded = me->p_damage) > 0) && !(me->p_flags & PFSHIELD))
     {
     	me->p_subdamage = me->p_ship.s_repair * 2;
-    	if ((me->p_flags & PFORBIT)
-    	&& (planets[me->p_planet].pl_flags & PLREPAIR)
-    	&& (!(planets[me->p_planet].pl_owner & (me->p_swar | me->p_hostile))))
-    	{
-    	    me->p_subdamage += me->p_ship.s_repair * 2;
-    	}
-    	if (me->p_flags & PFDOCK)
+    	if (me->p_flags & PFORBIT)
     	{
-    	    me->p_subdamage += me->p_ship.s_repair * 3;
+    	    /* Damn server doesn't send us p_planet info, have to calculate it ourselves! */
+            me->p_planet = get_closest_planet(me->p_x, me->p_y);
+    	    if ((planets[me->p_planet].pl_flags & PLREPAIR)
+    	    && (!(planets[me->p_planet].pl_owner & (plr->p_swar | plr->p_hostile))))
+    	        me->p_subdamage += me->p_ship.s_repair * 2;
+    	    if (me->p_flags & PFDOCK)
+    	        me->p_subdamage += me->p_ship.s_repair * 3;
     	}
-    	/* Calculate time needed to repair hull */
+	/* Calculate time needed to repair hull */
     	hullrate = (float)(me->p_subdamage)/(float)100.0;
         hulltime = (int)(hullneeded/hullrate);
     }
     
     return MAX(shieldtime, hulltime);
-};
\ No newline at end of file
+}
+
+/******************************************************************************/
+/***  get_closest_planet() - find closest planet to given location
+      Useful for determining which planet you are orbitting                 ***/
+/******************************************************************************/
+int get_closest_planet(int x, int y)
+{
+    register int i;
+    register struct planet *k;
+    double dist, closedist;
+    int target;
+
+    closedist = GWIDTH;
+    for (i = 0, k = &planets[i]; i < MAXPLANETS; i++, k++)
+    {
+        dist = hypot ((double) (x - k->pl_x), (double) (y - k->pl_y));
+        if (dist < closedist)
+        {
+                target = i;
+                closedist = dist;
+        }
+    }
+    return (short)(target);
+}