Update of /cvsroot/netrek/client/netrekxp/src
In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv6411/src

Modified Files:
	input.c util.c 
Log Message:
Add support for plasma to gettarget.
Add sanity and range checks to autophaser.
Add plasma check to autophaser.

Index: input.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/input.c,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -d -r1.51 -r1.52
--- input.c	23 May 2009 13:23:39 -0000	1.51
+++ input.c	23 May 2009 15:21:20 -0000	1.52
@@ -1921,6 +1921,7 @@
 {
     unsigned char course;
     int x, y;
+    int distance;
     register struct player *j;
     struct obtype *gettarget (W_Window ww,
                               int x,
@@ -1928,27 +1929,57 @@
                               int targtype),
     *target;
 
-    if (F_auto_weapons && autoPhaser) {
-        target = gettarget (data->Window, data->x, data->y, TARG_ENEMY | TARG_CLOAK);
-        if (target->o_num == -1) { 
+    if (F_auto_weapons && autoPhaser)
+    {
+        target = gettarget (data->Window, data->x, data->y, TARG_ENEMY | TARG_CLOAK | TARG_PLASMA);
+        if (target->o_type == PLAYERTYPE && target->o_num == me->p_no)
+        { 
             /* failed to find a target */
             course = (unsigned char) (getcourse (data->Window, data->x, data->y));
             sendPhaserReq (course);
             return;
         }
-        j = &players[target->o_num];
-        if (data->Window == mapw)
+        if (target->o_type == PLAYERTYPE)
         {
-            x = j->p_x * GWINSIDE / GWIDTH;
-            y = j->p_y * GWINSIDE / GWIDTH;
+            j = &players[target->o_num];
+            if (data->Window == mapw)
+            {
+                x = j->p_x * GWINSIDE / GWIDTH;
+                y = j->p_y * GWINSIDE / GWIDTH;
+            }
+            else if (data->Window == w)
+            {
+                x = (j->p_x - me->p_x) / scaleFactor + TWINSIDE / 2;
+                y = (j->p_y - me->p_y) / scaleFactor + TWINSIDE / 2;
+            }
         }
-        else
+        else if (target->o_type == PLASMATYPE)
         {
-            x = (j->p_x - me->p_x) / scaleFactor + TWINSIDE / 2;
-            y = (j->p_y - me->p_y) / scaleFactor + TWINSIDE / 2;
+            x = target->o_dist_x;
+            y = target->o_dist_y;
         }
-        /* Sanity check on x, y? Use ship max phaser range? */
-        /* How about phasering plasma? */
+  
+        /* Sanity check on distance.  Negative x or y indicates phaser is in local
+           window but target is outside viewable range. */
+        if (x < 0 || y < 0)
+        { 
+            course = (unsigned char) (getcourse (data->Window, data->x, data->y));
+            sendPhaserReq (course);
+            return;
+        }
+        /* Check ship max phaser range for local window phasers.  Sometimes phasers
+           are fired to "point".  Not checking galaxy map phasers. */
+        if (data->Window == w)
+        {
+            distance = (int) sqrt((x- TWINSIDE / 2)*(x - TWINSIDE / 2) + (y - TWINSIDE / 2)*(y - TWINSIDE /2));
+            if (distance > (PHASEDIST * j->p_ship.s_phaserdamage / 100 / scaleFactor))
+            { 
+                course = (unsigned char) (getcourse (data->Window, data->x, data->y));
+                sendPhaserReq (course);
+                return;
+            }
+        }
+        /* Everything checks out */
         course = (unsigned char) (getcourse (data->Window, x, y));
     }
     else

Index: util.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/util.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- util.c	16 Apr 2008 00:08:23 -0000	1.8
+++ util.c	23 May 2009 15:21:20 -0000	1.9
@@ -64,6 +64,8 @@
         g_y = (y - 4) / W_Textheight;
         _targ.o_type = PLAYERTYPE;
         _targ.o_num = GetPlayerFromPlist (g_x, g_y);
+        _targ.o_dist_x = -1;
+        _targ.o_dist_y = -1;
         targ = &_targ;
         return (targ);
     }
@@ -75,6 +77,8 @@
         g_y = (y - 4) / W_Textheight - 2; // Two header lines
         _targ.o_type = PLANETTYPE;
         _targ.o_num = GetPlanetFromPlist (g_x, g_y);
+        _targ.o_dist_x = -1;
+        _targ.o_dist_y = -1;
         targ = &_targ;
         return (targ);
     }
@@ -105,6 +109,7 @@
     register int i;
     register struct player *j;
     register struct planet *k;
+    register struct plasmatorp *pt;
     double dist, closedist;
     int friendly;
 
@@ -118,6 +123,8 @@
             {
                 _target.o_type = PLANETTYPE;
                 _target.o_num = i;
+                _target.o_dist_x = -1;
+                _target.o_dist_y = -1;
                 closedist = dist;
             }
 
@@ -145,6 +152,28 @@
             {
                 _target.o_type = PLAYERTYPE;
                 _target.o_num = i;
+                _target.o_dist_x = -1;
+                _target.o_dist_y = -1;
+                closedist = dist;
+            }
+        }
+    }
+    if (targtype & TARG_PLASMA)
+    {
+        for (pt = plasmatorps + (nplasmas * nplayers) - 1; pt >= plasmatorps; --pt)
+        {
+            if (!pt->pt_status)
+                continue;
+            if (pt->pt_status == PTEXPLODE || pt->pt_status == PTFREE)
+                continue;
+
+            dist = hypot ((double) (x - pt->pt_x), (double) (y - pt->pt_y));
+            if (dist < closedist)
+            {
+                _target.o_type = PLASMATYPE;
+                _target.o_num = -1;
+                _target.o_dist_x = (int) ((x - pt->pt_x) / scaleFactor + TWINSIDE / 2);
+                _target.o_dist_y = (int) ((y - pt->pt_y) / scaleFactor + TWINSIDE / 2);
                 closedist = dist;
             }
         }
@@ -155,6 +184,8 @@
         _target.o_type = PLAYERTYPE;
         _target.o_num = me->p_no;       /* Return myself.  Oh
                                          * well... */
+        _target.o_dist_x = -1;
+        _target.o_dist_y = -1;
         return (&_target);
     }
     else