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

Modified Files:
	beeplite.c cowmain.c data.c dmessage.c findslot.c getname.c 
	local.c makefile newwin.c playback.c sound.c warning.c 
Log Message:
This latest series of changes adds stereo quasi-3D sound effects for both players and observers, as well as adding much improved support for observer sounds (previously they were limited as to what sounds they would hear).

Index: findslot.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/findslot.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- findslot.c	24 Apr 2006 15:30:38 -0000	1.4
+++ findslot.c	26 Apr 2006 02:04:24 -0000	1.5
@@ -23,6 +23,8 @@
 #include "struct.h"
 #include "data.h"
 #include "proto.h"
+#include "SDL.h"
+#include "SDL_mixer.h"
 
 #define WAITMOTD
 
@@ -115,6 +117,8 @@
 #if defined(SOUND)
             if (!newSound)
                 Exit_Sound();
+            else
+                Mix_CloseAudio();
 #endif
 
             LineToConsole ("Shit!  Ghostbusted!\n");
@@ -162,6 +166,8 @@
 #if defined(SOUND)
             if (!newSound)
                 Exit_Sound();
+            else
+                Mix_CloseAudio();
 #endif
 
             LineToConsole ("Damn, We've been ghostbusted!\n");
@@ -222,6 +228,8 @@
 #if defined(SOUND)
                     if (!newSound)
                         Exit_Sound();
+                    else
+                        Mix_CloseAudio();
 #endif
 
                     LineToConsole ("OK, bye!\n");

Index: dmessage.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/dmessage.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- dmessage.c	21 Apr 2006 12:00:06 -0000	1.4
+++ dmessage.c	26 Apr 2006 02:04:24 -0000	1.5
@@ -121,7 +121,7 @@
     register int len;
     W_Color color;
     char timebuf[10];
-    LONG curtime;
+    time_t curtime;
     struct tm *tm;
     int take, destroy, team, kill, killp, killa, bomb, conq;
     struct distress dist;

Index: sound.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/sound.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- sound.c	24 Apr 2006 15:30:38 -0000	1.4
+++ sound.c	26 Apr 2006 02:04:24 -0000	1.5
@@ -53,6 +53,7 @@
     {"nt_shield_up", 3, 1},
     {"nt_torp_hit", 8, 1},
     {"nt_warning", 5, 1},
+    {"nt_red_alert", 5, 1},
     {"nt_engine", 0, 0},
     {"nt_enter_ship", 4, 1},
     {"nt_self_destruct", 6, 1},
@@ -97,8 +98,9 @@
   newsounds[EXPLOSION_WAV] = Mix_LoadWAV(DATAFILE("nt_explosion.wav"));
   newsounds[EXPLOSION_OTHER_WAV] = Mix_LoadWAV(DATAFILE("nt_explosion_other.wav"));
   newsounds[FIRE_PLASMA_WAV] = Mix_LoadWAV(DATAFILE("nt_fire_plasma.wav"));
+  newsounds[OTHER_FIRE_PLASMA_WAV] = Mix_LoadWAV(DATAFILE("nt_fire_plasma_other.wav"));
   newsounds[FIRE_TORP_WAV] = Mix_LoadWAV(DATAFILE("nt_fire_torp.wav"));
-  newsounds[FIRE_TORP_OTHER_WAV] = Mix_LoadWAV(DATAFILE("nt_fire_torp_other.wav"));
+  newsounds[OTHER_FIRE_TORP_WAV] = Mix_LoadWAV(DATAFILE("nt_fire_torp_other.wav"));
   newsounds[INTRO_WAV] = Mix_LoadWAV(DATAFILE("nt_intro.wav"));
   newsounds[MESSAGE_WAV] = Mix_LoadWAV(DATAFILE("nt_message.wav"));
   newsounds[PHASER_WAV] = Mix_LoadWAV(DATAFILE("nt_phaser.wav"));
@@ -207,14 +209,18 @@
 {
     if (newSound)
     {
+    	int channel;
+    	
         if (!sound_init)
 	    return;
 
         if ((type >= NUM_WAVES) || (type < 0))
             LineToConsole("Invalid sound type %d\n", type);
 
-        if (Mix_PlayChannel(-1, newsounds[type], 0) < 0)
+        if ((channel = Mix_PlayChannel(-1, newsounds[type], 0)) < 0)
             LineToConsole("Mix_PlayChannel: %s\n", Mix_GetError());
+            
+        Group_Sound(type, channel);
     }
     else
     {
@@ -238,6 +244,58 @@
             current_sound = NO_SOUND;
      }
 }
+extern void Play_Sound_Loc (int type, int angle, int distance)
+{
+    int channel;
+    
+    if (!sound_init)
+        return;
+
+    if ((type >= NUM_WAVES) || (type < 0))
+        LineToConsole("Invalid sound type %d\n", type);
+
+    if ((channel = Mix_PlayChannel(-1, newsounds[type], 0)) < 0)
+    {
+            LineToConsole("Mix_PlayChannel: %s\n", Mix_GetError());
+            return;
+    }
+    /* Make sure distance in boundary range that function accepts */
+    if (distance < 0)
+    	distance = 0;
+    if (distance > 255)
+    	distance = 255;
+    // Adjust volume with distance and angle
+    if (Mix_SetPosition(channel, angle, distance) == 0)
+        LineToConsole("Mix_SetPosition: %s\n", Mix_GetError());
+        
+    Group_Sound(type, channel);
+    return;
+}
+
+void Group_Sound (int type, int channel)
+{
+    // Add channel to group by type, useful for aborting specific sounds
+    // at a later time
+    // Current designations: 
+    // group 1 = cloaked_wav
+    // group 2 = warning_wav
+    // group 3 = red_alert_wav
+    switch(type)
+    {
+    	case CLOAKED_WAV:
+            if(!Mix_GroupChannel(channel,1))
+                LineToConsole("Mix_GroupChannel: %s\n", Mix_GetError());
+            break;
+        case WARNING_WAV:
+            if(!Mix_GroupChannel(channel,2))
+                LineToConsole("Mix_GroupChannel: %s\n", Mix_GetError());
+            break;
+        case RED_ALERT_WAV:
+            if(!Mix_GroupChannel(channel,3))
+                LineToConsole("Mix_GroupChannel: %s\n", Mix_GetError());
+            break;
+    }
+}
 
 extern void Abort_Sound (int type)
 {
@@ -315,6 +373,9 @@
         case WARNING_SOUND:
             sprintf (buf, "Warning sound is %s", flag);
             break;
+        case RED_ALERT_SOUND:
+            sprintf (buf, "Red alert sound is %s", flag);
+            break;
         case SHIELD_DOWN_SOUND:
             sprintf (buf, "Shield down  sound is %s", flag);
             break;

Index: newwin.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/newwin.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- newwin.c	24 Apr 2006 15:30:38 -0000	1.11
+++ newwin.c	26 Apr 2006 02:04:24 -0000	1.12
@@ -9,11 +9,11 @@
 /******************************************************************************/
 
 #include <stdio.h>
+#include <io.h>
 #include <stdlib.h>
 #include <math.h>
 #include <signal.h>
 #include <sys/types.h>
-
 #include <time.h>
 #include <winsock.h>
 
@@ -739,7 +739,7 @@
 /******************************************************************************/
 savebitmaps (void)
 {
-    int i, j, k;
+    int i, k;
     char *Planlib;
     char *MPlanlib;
 
@@ -1058,7 +1058,7 @@
         UpdatePlayerList ();    /* Otherwise */
 
 
-    autoQuit = (time_t) intDefault ("autoQuit", autoQuit);      /* allow extra */
+    autoQuit = intDefault ("autoQuit", autoQuit);      /* allow extra */
     /* quit time -RW */
 
     do
@@ -1089,7 +1089,7 @@
                 readFromServer (&rfds);
             }
             elapsed = time (0) - startTime;
-            if (elapsed > autoQuit)
+            if (elapsed > (time_t)(autoQuit))
             {
                 LineToConsole ("Auto-Quit.\n");
                 *team = 4;

Index: cowmain.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/cowmain.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- cowmain.c	24 Apr 2006 15:30:38 -0000	1.9
+++ cowmain.c	26 Apr 2006 02:04:24 -0000	1.10
@@ -29,6 +29,8 @@
 #include "parsemeta.h"
 #include "map.h"
 #include "proto.h"
+#include "SDL.h"
+#include "SDL_mixer.h"
 
 /******************************************************************************/
 /***  Local Globals                                                         ***/
@@ -583,7 +585,7 @@
     (void) SIGNAL (SIGFPE, handle_exception);
 #endif
 
-    SRANDOM (time (0));
+    SRANDOM ((unsigned int)time (0));
 
     initDefaults (deffile);
 
@@ -603,8 +605,8 @@
         if (!serverName)
             serverName = server;
     }
-
-    SRANDOM (getpid () * time ((LONG *) 0));
+    
+    SRANDOM (getpid () * (unsigned int)time (NULL));
 
     if (!passive)
     {
@@ -964,6 +966,8 @@
 #if defined(SOUND)
         if (!newSound)
             Exit_Sound();
+        else
+            Mix_CloseAudio();
 #endif
 
         sleep (1);

Index: local.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/local.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- local.c	24 Apr 2006 15:30:38 -0000	1.8
+++ local.c	26 Apr 2006 02:04:24 -0000	1.9
@@ -20,11 +20,12 @@
 #include "data.h"
 #include "local.h"
 #include "proto.h"
-
+#include "SDL.h"
+#include "SDL_mixer.h"
 #include "bitmaps.h"
 
 /* Local Variables */
-
+#define XPI     3.1415926
 static int clearcount = 0;
 static int clearzone[4][(MAXTORP + 1) * MAXPLAYER +
                         (MAXPLASMA + 1) * MAXPLAYER + MAXPLANETS];
@@ -43,9 +44,18 @@
 static int sound_other_torps = 0;
 static int num_other_torps = 0;
 static int sound_plasma = 0;
-static int sound_other_plasma = 0;
+static int sound_other_plasmas = 0;
+static int num_other_plasmas = 0;
 static int sound_other_explode = 0;
 static unsigned int sound_flags = 0;
+static int other_torp_dist = 0;
+static int new_other_torp_dist = 0;
+static int other_torp_angle = 0;
+static int old_t_fuse = 0;
+static int other_plasma_dist = 0;
+static int new_other_plasma_dist = 0;
+static int other_plasma_angle = 0;
+static int old_pt_fuse = 0;
 #endif
 
 /* Background Stars Definitions */
@@ -442,6 +452,7 @@
     const int view = SCALE * WINSIDE / 2 + BMP_SHIELD_WIDTH * SCALE / 2;
     int dx, dy, px, py, wx, wy, tx, ty, lx, ly;
     int new_dx, new_dy;
+    int newdx, newdy, distance, angle; /* For newSound */
 
     W_Icon (*ship_bits)[SHIP_VIEWS];
 
@@ -470,21 +481,47 @@
             if (!(j->p_flags & PFCLOAK))
                 continue;
         }
+        
+        dx = j->p_x - me->p_x;
+        dy = j->p_y - me->p_y;
+        if (dx > view || dx < -view || dy > view || dy < -view)
+            continue;
 
-        /* jmn - observer support.. tried to diplay tractors but no works */
-
+        dx = dx / SCALE + WINSIDE / 2;
+        dy = dy / SCALE + WINSIDE / 2;
+        
         if (j->p_flags & PFCLOAK)
         {
             if (j->p_cloakphase < (CLOAK_PHASES - 1))
             {
-
+            	
 #ifdef SOUND
-                if (myPlayer(j) && (j->p_cloakphase == 0))
+                if (j->p_cloakphase == 0)
                 {
                     if (newSound)
-                        Play_Sound(CLOAKED_WAV);
+                    {               
+                        newdx = dx - WINSIDE/2;
+                        newdy = dy - WINSIDE/2;
+                        
+                        distance = (int) sqrt((newdx)*(newdx) + (newdy)*(newdy));
+                        // Normalize from 0 to 255, 0 being on top of player, 255 being max distance
+                        // which would be a diagonal from player to corner of tactical
+                        // Reason for normalization is Mix_SetDistance requires that range        
+                        distance = (int)((255 * distance)/CORNER_DIST);
+                        // Calculate angle, then adjust as necessary for Mix_SetDistance
+                        angle = (int)(atan2(newdy, newdx)*180/XPI);
+                        angle = 270 - angle;
+                        // At short distances, don't use angular sound
+                        if (distance < 10)
+                            Play_Sound(CLOAKED_WAV);
+                        else
+                            Play_Sound_Loc(CLOAKED_WAV, angle, distance);
+                    }
                     else
-                        Play_Sound(CLOAK_SOUND);
+                    {
+                        if (myPlayer(j) || isObsLockPlayer(j))
+                            Play_Sound(CLOAK_SOUND);
+                    }
                 }
 #endif
 
@@ -497,32 +534,47 @@
             {
             	
 #ifdef SOUND
-                if (myPlayer(j))
+                if (newSound)
+                {
                     if (j->p_cloakphase == CLOAK_PHASES - 1)
                     {
-                        if (newSound)
+                        newdx = dx - WINSIDE/2;
+                        newdy = dy - WINSIDE/2;
+                        
+                        distance = (int) sqrt((newdx)*(newdx) + (newdy)*(newdy));
+                        // Normalize from 0 to 255, 0 being on top of player, 255 being max distance
+                        // which would be a diagonal from player to corner of tactical
+                        // Reason for normalization is Mix_SetDistance requires that range        
+                        distance = (int)((255 * distance)/CORNER_DIST);
+                        // Calculate angle, then adjust as necessary for Mix_SetDistance
+                        angle = (int)(atan2(newdy, newdx)*180/XPI);
+                        angle = 270 - angle;
+                        // At short distances, don't use angular sound
+                        if (distance < 10)
                             Play_Sound(UNCLOAK_WAV);
                         else
-                            Play_Sound(UNCLOAK_SOUND);
+                            Play_Sound_Loc(UNCLOAK_WAV, angle, distance);
                     }
-                    else
+                    else    // Kill any channels with CLOAKED_WAV on them (group 1)
+			Mix_HaltGroup(1);
+
+                }
+                else
+                {
+                    if (myPlayer(j) || isObsLockPlayer(j))
                     {
-                        if (!newSound)
-                             Abort_Sound(CLOAK_SOUND);
-                    } 	
+                        if (j->p_cloakphase == CLOAK_PHASES - 1)
+                            Play_Sound(UNCLOAK_SOUND);
+                        else
+                            Abort_Sound(CLOAK_SOUND);
+                    }
+                }
+                    
 #endif
             	
                 j->p_cloakphase--;
             }
         }
-        dx = j->p_x - me->p_x;
-        dy = j->p_y - me->p_y;
-        if (dx > view || dx < -view || dy > view || dy < -view)
-            continue;
-
-        dx = dx / SCALE + WINSIDE / 2;
-        dy = dy / SCALE + WINSIDE / 2;
-
 
         if (j->p_flags & PFCLOAK && (j->p_cloakphase == (CLOAK_PHASES - 1)))
         {
@@ -714,7 +766,7 @@
 #endif
 
 #ifdef SOUND
-            if (j->p_no == me->p_no)
+            if (myPlayer(j) || isObsLockPlayer(j))
             {
                 if ((sound_flags & PFSHIELD) && !(j->p_flags & PFSHIELD))
                 {
@@ -881,9 +933,34 @@
             if (i == 1)
             {
                 if (newSound)
-                    Play_Sound(j == me ? EXPLOSION_WAV : EXPLOSION_OTHER_WAV);
+                {
+                    if (myPlayer(j) || isObsLockPlayer(j))
+                        Play_Sound(EXPLOSION_WAV);
+                    else
+                    {
+                        int newdx, newdy, distance, angle;
+                    
+                        newdx = dx - WINSIDE/2;
+                        newdy = dy - WINSIDE/2;
+                        
+                        distance = (int) sqrt((newdx)*(newdx) + (newdy)*(newdy));
+                        // Normalize from 0 to 255, 0 being on top of player, 255 being max distance
+                        // which would be a diagonal from player to corner of tactical
+                        // Reason for normalization is Mix_SetDistance requires that range        
+                        distance = (int)((255 * distance)/CORNER_DIST);
+                        // Calculate angle, then adjust as necessary for Mix_SetDistance
+                        angle = (int)(atan2(newdy, newdx)*180/XPI);
+                        angle = 270 - angle;
+                        // At short distances, don't use angular sound
+                        if (distance < 10)
+                            Play_Sound(EXPLOSION_OTHER_WAV);
+                        else
+                            Play_Sound_Loc(EXPLOSION_OTHER_WAV, angle, distance);
+                    }
+                }
                 else
-                    Play_Sound(j == me ? EXPLOSION_SOUND : OTHER_EXPLOSION_SOUND);
+                    Play_Sound((myPlayer(j) || isObsLockPlayer(j)) 
+                               ? EXPLOSION_SOUND : OTHER_EXPLOSION_SOUND);
             }
 #endif
 
@@ -930,11 +1007,37 @@
         	
 #ifdef SOUND
             if (!sound_phaser)
-            {
+            {           
                 if (newSound)
-                    Play_Sound(j == me ? PHASER_WAV : PHASER_OTHER_WAV);
+                {
+                    if (myPlayer(j) || isObsLockPlayer(j))
+                        Play_Sound(PHASER_WAV);
+                    else
+                    {
+                        int newdx, newdy, distance, angle;
+                    
+                        newdx = dx - WINSIDE/2;
+                        newdy = dy - WINSIDE/2;
+                        
+                        distance = (int) sqrt((newdx)*(newdx) + (newdy)*(newdy));
+                        // Normalize from 0 to 255, 0 being on top of player, 255 being max distance
+                        // which would be a diagonal from player to corner of tactical
+                        // Reason for normalization is Mix_SetDistance requires that range        
+                        distance = (int)((255 * distance)/CORNER_DIST);
+                        // Calculate angle, then adjust as necessary for Mix_SetDistance
+                        angle = (int)(atan2(newdy, newdx)*180/XPI);
+                        angle = 270 - angle;
+                        // At short distances, don't use angular sound
+                        if (distance < 10)
+                            Play_Sound(PHASER_OTHER_WAV);
+                        else
+                            Play_Sound_Loc(PHASER_OTHER_WAV, angle, distance);
+                    }
+                }
                 else
-                    Play_Sound(j == me ? PHASER_SOUND : OTHER_PHASER_SOUND);
+                    Play_Sound((myPlayer(j) || isObsLockPlayer(j))
+                               ? PHASER_SOUND : OTHER_PHASER_SOUND);
+                
                 sound_phaser++;
             }
 #endif
@@ -1116,11 +1219,9 @@
 #ifdef SHORT_PACKETS
                         if (php->ph_status != PHMISS)   /* KOC 10/20/95  */
                         {       /* hack for SP_2 */
-#define XPI     3.1415926
                             dir = (unsigned char) 
                                   nint (atan2((double) (ty - py),
                                        (double) (tx - px)) / XPI * 128.0);
-#undef XPI
                         }
                         else
 #endif
@@ -1170,7 +1271,7 @@
         }
 
 #ifdef SOUND
-        else if (j->p_no == me->p_no)
+        else if (myPlayer(j) || isObsLockPlayer(j))
             sound_phaser = 0;
 #endif
 
@@ -1215,7 +1316,6 @@
                         continue;       /* this had better be last
                                          * in for(..) */
 
-#define XPI     3.1415926
                     theta = atan2 ((double) (px - dx),
                                    (double) (dy - py)) + XPI / 2.0;
                     dir = (unsigned char) nint (theta / XPI * 128.0);
@@ -1229,7 +1329,6 @@
                     ly[0] = (int) (py + (Sin[dir] * (target_width / 2)));
                     lx[1] = (int) (px - (Cos[dir] * (target_width / 2)));
                     ly[1] = (int) (py - (Sin[dir] * (target_width / 2)));
-#undef XPI
                     if (j->p_flags & PFPRESS)
                     {
                         W_MakeTractLine (w, dx, dy, lx[0], ly[0], W_Yellow);
@@ -1354,9 +1453,50 @@
                 continue;
             }
 
+#ifdef SOUND
+            if (j != me && newSound)
+            {
+            	int new_t_fuse;
+            	int new_angle;
+		int newdy, newdx;
+		
+		newdy = dy / SCALE;
+		newdx = dx / SCALE;
+                // Store location of torp.
+                new_other_torp_dist = (int) sqrt((newdx)*(newdx) + (newdy)*(newdy));
+                // Normalize from 0 to 255, 0 being on top of player, 255 being max distance
+                // which would be a diagonal from player to corner of tactical
+                // Reason for normalization is Mix_SetDistance requires that range        
+                new_other_torp_dist = (int)((255 * new_other_torp_dist)/CORNER_DIST);
+                // Find how long till torp expires...BROKEN!
+                new_t_fuse = k->t_updateFuse;
+                // Calculate angle, then adjust as necessary for Mix_SetDistance
+                new_angle = (int)(atan2(newdy, newdx)*180/XPI);
+                new_angle = 270 - new_angle;
+                // Find torp that has been around the least time, that is the one to play
+                // the sound from.  In case of tie, choose closest one.
+                if (new_t_fuse > old_t_fuse)
+                {
+                    other_torp_dist = new_other_torp_dist;
+                    old_t_fuse = new_t_fuse;
+                    other_torp_angle = new_angle;
+                }
+                else if (new_t_fuse == old_t_fuse)
+                {
+                    if (new_other_torp_dist < other_torp_dist)
+                    {
+                        other_torp_dist = new_other_torp_dist;
+                        old_t_fuse = new_t_fuse;
+                        other_torp_angle = new_angle;
+                    }
+                }
+                	
+            }
+#endif         
             dx = dx / SCALE + WINSIDE / 2;
             dy = dy / SCALE + WINSIDE / 2;
 
+  
             if (k->t_status == TEXPLODE)
             {
 
@@ -1376,7 +1516,26 @@
                 if (k->t_fuse == BMP_TORPDET_FRAMES - 1)
                 {
                     if (newSound)
-                        Play_Sound(TORP_HIT_WAV);
+                    {
+                        int newdx, newdy, distance, angle;
+                    
+                        newdx = dx - WINSIDE/2;
+                        newdy = dy - WINSIDE/2;
+                        
+                        distance = (int) sqrt((newdx)*(newdx) + (newdy)*(newdy));
+                        // Normalize from 0 to 255, 0 being on top of player, 255 being max distance
+                        // which would be a diagonal from player to corner of tactical
+                        // Reason for normalization is Mix_SetDistance requires that range        
+                        distance = (int)((255 * distance)/CORNER_DIST);
+                        // Calculate angle, then adjust as necessary for Mix_SetDistance
+                        angle = (int)(atan2(newdy, newdx)*180/XPI);
+                        angle = 270 - angle;
+                        // At short distances, don't use angular sound
+                        if (distance < 10)
+                            Play_Sound(TORP_HIT_WAV);
+                        else
+                            Play_Sound_Loc(TORP_HIT_WAV, angle, distance);
+                    }
                     else
                         Play_Sound(TORP_HIT_SOUND);
                 }
@@ -1509,7 +1668,10 @@
     {
         if (!pt->pt_status)
             continue;
-
+#ifdef SOUND
+        if (pt->pt_owner != me->p_no)
+            num_other_plasmas++;
+#endif
         if ((pt->pt_updateFuse -= weaponUpdate) == 0)
         {
             if (pt->pt_status != PTEXPLODE)
@@ -1537,6 +1699,47 @@
         if (dx > view || dx < -view || dy > view || dy < -view)
             continue;
 
+
+#ifdef SOUND
+        if (pt->pt_owner != me->p_no && newSound)
+        {
+            int new_pt_fuse;
+            int new_angle;
+	    int newdy, newdx;
+		
+	    newdy = dy / SCALE;
+	    newdx = dx / SCALE;
+            // Store location of plasma.
+            new_other_plasma_dist = (int) sqrt((newdx)*(newdx) + (newdy)*(newdy));
+            // Normalize from 0 to 255, 0 being on top of player, 255 being max distance
+            // which would be a diagonal from player to corner of tactical
+            // Reason for normalization is Mix_SetDistance requires that range        
+            new_other_plasma_dist = (int)((255 * new_other_plasma_dist)/CORNER_DIST);
+            // Find how long till torp expires...BROKEN!
+            new_pt_fuse = pt->pt_updateFuse;
+            // Calculate angle, then adjust as necessary for Mix_SetDistance
+            new_angle = (int)(atan2(newdy, newdx)*180/XPI);
+            new_angle = 270 - new_angle;
+            // Find plasma that has been around the least time, that is the one to play
+            // the sound from.  In case of tie, choose closest one.
+            if (new_pt_fuse > old_pt_fuse)
+            {
+                other_plasma_dist = new_other_plasma_dist;
+                old_pt_fuse = new_pt_fuse;
+                other_plasma_angle = new_angle;
+            }
+            else if (new_pt_fuse == old_pt_fuse)
+            {
+                if (new_other_torp_dist < other_torp_dist)
+                {
+                    other_plasma_dist = new_other_plasma_dist;
+                    old_pt_fuse = new_pt_fuse;
+                    other_plasma_angle = new_angle;
+                 }
+             }     	
+        }
+#endif   
+
         dx = dx / SCALE + WINSIDE / 2;
         dy = dy / SCALE + WINSIDE / 2;
 
@@ -1559,7 +1762,26 @@
             if (pt->pt_fuse == BMP_TORPDET_FRAMES - 1)
             {
                 if (newSound)
-                    Play_Sound(PLASMA_HIT_WAV);
+                {
+                    int newdx, newdy, distance, angle;
+                    
+                    newdx = dx - WINSIDE/2;
+                    newdy = dy - WINSIDE/2;
+                        
+                    distance = (int) sqrt((newdx)*(newdx) + (newdy)*(newdy));
+                    // Normalize from 0 to 255, 0 being on top of player, 255 being max distance
+                    // which would be a diagonal from player to corner of tactical
+                    // Reason for normalization is Mix_SetDistance requires that range        
+                    distance = (int)((255 * distance)/CORNER_DIST);
+                    // Calculate angle, then adjust as necessary for Mix_SetDistance
+                    angle = (int)(atan2(newdy, newdx)*180/XPI);
+                    angle = 270 - angle;
+                    // At short distances, don't use angular sound
+                    if (distance < 10)
+                        Play_Sound(PLASMA_HIT_WAV);
+                    else
+                        Play_Sound_Loc(PLASMA_HIT_WAV, angle, distance);
+                }
                 else
                     Play_Sound(PLASMA_HIT_SOUND);
             }
@@ -1865,8 +2087,18 @@
             W_ChangeBorder (baseWin, gColor);
 
 #if defined(SOUND)
-            if (!newSound)
+            if (newSound)
+            {   // Kill any channels with WARNING_WAV on them (group 2)
+                // or RED_ALERT_WAV (group 3)
+		Mix_HaltGroup(2);
+		Mix_HaltGroup(3);
+	    }
+            else
+            {
                 Abort_Sound(WARNING_SOUND);
+                Abort_Sound(RED_ALERT_SOUND);
+            }
+                
 #endif
 
             break;
@@ -1881,8 +2113,18 @@
             W_ChangeBorder (baseWin, yColor);
 
 #if defined(SOUND)
-            if (!newSound)
-                Abort_Sound(WARNING_SOUND);
+
+            if (newSound) // Kill any channels with RED_ALERT_WAV on them (group 3)
+            {
+            	Mix_HaltGroup(3);
+                Play_Sound(WARNING_WAV);
+            }
+            else
+            {
+            	Abort_Sound(RED_ALERT_SOUND);
+                Play_Sound(WARNING_SOUND);
+            }
+
 #endif
 
             break;
@@ -1896,26 +2138,47 @@
             }
             W_ChangeBorder (baseWin, rColor);
             
-#ifdef SOUND
+#if defined(SOUND)
             if (newSound)
-                Play_Sound(WARNING_WAV);
+                Play_Sound(RED_ALERT_WAV);
             else
-                Play_Sound(WARNING_SOUND);
+                Play_Sound(RED_ALERT_SOUND);
 #endif
 
             break;
         }
     }
 
-#ifdef SOUND
+#if defined(SOUND)
     if (newSound)
     {
         if (sound_torps < me->p_ntorp)
             Play_Sound(FIRE_TORP_WAV);
         if (sound_other_torps < num_other_torps)
-            Play_Sound(FIRE_TORP_OTHER_WAV);
+        {
+            if (other_torp_dist < 10)
+                Play_Sound(OTHER_FIRE_TORP_WAV);
+            else
+                Play_Sound_Loc(OTHER_FIRE_TORP_WAV, other_torp_angle, other_torp_dist);
+        }
         if (sound_plasma < me->p_nplasmatorp)
             Play_Sound(FIRE_PLASMA_WAV);
+        if (sound_other_plasmas < num_other_plasmas)
+        {
+            if (other_plasma_dist < 10)
+                Play_Sound(OTHER_FIRE_PLASMA_WAV);
+            else
+                Play_Sound_Loc(OTHER_FIRE_PLASMA_WAV, other_plasma_angle, other_plasma_dist);
+        }
+        // Reset locations and fuses of other's closest torps and plasmas
+        other_torp_dist = CORNER_DIST;
+        new_other_torp_dist = 0;
+        old_t_fuse = 0;
+        other_torp_angle = 0;
+        other_plasma_dist = CORNER_DIST;
+        new_other_plasma_dist = 0;
+        old_pt_fuse = 0;
+        other_plasma_angle = 0;
     }
     else
     {
@@ -1925,6 +2188,8 @@
             Play_Sound(OTHER_FIRE_TORP_SOUND);
         if (sound_plasma < me->p_nplasmatorp)
             Play_Sound(FIRE_PLASMA_SOUND);
+        if (sound_other_plasmas < num_other_plasmas)
+            Play_Sound(OTHER_FIRE_PLASMA_SOUND);
     }
 
     sound_flags = me->p_flags;
@@ -1932,6 +2197,8 @@
     sound_other_torps = num_other_torps;
     num_other_torps = 0;
     sound_plasma = me->p_nplasmatorp;
+    sound_other_plasmas = num_other_plasmas;
+    num_other_plasmas = 0;
 #endif
 
     /* show 'lock' icon on local map (Actually an EM hack ) */

Index: makefile
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/makefile,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- makefile	24 Apr 2006 14:13:25 -0000	1.6
+++ makefile	26 Apr 2006 02:04:24 -0000	1.7
@@ -65,19 +65,19 @@
 #        wsock32.lib kernel32.lib shell32.lib winmm.lib mpr.lib
 
 # Borland Libs
-LIBOPTS = /LC:\Borland\bcc55\lib;c:\Borland\bcc55\lib\psdk /Tpe
+LIBOPTS = /LC:\Borland\bcc55\lib;c:\Borland\bcc55\lib\psdk;..\Win32\lib\BCC /Tpe
 
 !IFDEF RSA
-GMPLIB = ..\Win32\lib\libgmpbcc.lib 
-#..\Win32\lib\libmpbcc.lib
+GMPLIB = ..\Win32\lib\BCC\libgmpbcc.lib 
+#..\Win32\lib\BCC\libmpbcc.lib
 !ENDIF
 
-LIBS = SDL.LIB SDL_mixer.LIB SDL_main.LIB CW32mt.LIB IMPORT32.LIB user32.lib gdi32.lib wsock32.lib kernel32.lib shell32.lib winmm.lib mpr.lib $(GMPLIB)
+LIBS = SDL.LIB SDL_mixer.LIB SDLmain.LIB CW32mt.LIB IMPORT32.LIB user32.lib gdi32.lib wsock32.lib kernel32.lib shell32.lib winmm.lib mpr.lib $(GMPLIB)
 
 # ---------------------------------------------------------------------------
 # - Start of makefile proper
 
-INCS = -I..\win32 -I..\win32\h -I..\win32\h\gmp -I..\include
+INCS = -I..\win32 -I..\win32\h -I..\win32\SDL -I..\win32\h\gmp -I..\include
 ARCH = Intel/Win32
 
 !IFDEF RSA

Index: getname.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/getname.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- getname.c	21 Apr 2006 12:00:07 -0000	1.3
+++ getname.c	26 Apr 2006 02:04:24 -0000	1.4
@@ -403,7 +403,7 @@
     W_Event event;
     unsigned char ch;
     char tempstr[40];
-    long lasttime;
+    time_t lasttime;
     int j;
     struct timeval tv;
     fd_set mask;

Index: playback.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/playback.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- playback.c	24 Apr 2006 15:30:38 -0000	1.10
+++ playback.c	26 Apr 2006 02:04:24 -0000	1.11
@@ -32,6 +32,8 @@
 #include "defs.h"
 #include "playerlist.h"
 #include "proto.h"
+#include "SDL.h"
+#include "SDL_mixer.h"
 
 #ifdef RECORDGAME
 
@@ -69,11 +71,11 @@
         outmessage[i] = '\0';
     }
 
-    SRANDOM (time (0));
+    SRANDOM ((unsigned int)time (0));
 
     initDefaults (deffile);
-
-    SRANDOM (getpid () * time ((LONG *) 0));
+    
+    SRANDOM (getpid () * (unsigned int)time (NULL));
 
     fed_ship_bmp = "bitmaps/shiplib/fedship.bmp";
     if ((stringDefault ("fedshipbmpfile")) != NULL)

Index: data.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/data.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- data.c	24 Apr 2006 15:30:38 -0000	1.11
+++ data.c	26 Apr 2006 02:04:24 -0000	1.12
@@ -81,7 +81,7 @@
 int delay = 0;                  /* delay for decaring war */
 int rdelay = 0;                 /* delay for refitting */
 int showPlanetNames = 1;
-time_t autoQuit = 60;
+int autoQuit = 60;
 int showStats = 0;
 int showHints = 1;
 int warnShields = 0;

Index: beeplite.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/beeplite.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- beeplite.c	24 Apr 2006 15:30:38 -0000	1.5
+++ beeplite.c	26 Apr 2006 02:04:24 -0000	1.6
@@ -20,8 +20,10 @@
 #include "data.h"
 #include "map.h"
 #include "proto.h"
+#include "SDL.h"
+#include "SDL_mixer.h"
 
-rcdlite(struct distress *dist)
+void rcdlite(struct distress *dist)
 /* the info */
 {
     char    message[100];
@@ -43,7 +45,7 @@
 }
 
 
-litedefaults(void)
+void litedefaults(void)
 {
     if (distlite[take] == NULL)
       distlite[take] = "/c/l";
@@ -55,7 +57,7 @@
       distlite[generic] = "%?%S=SB%{/c%}";
 }
 
-liteplanet(struct planet *l)
+void liteplanet(struct planet *l)
 {
     emph_planet_seq_n[l->pl_no] = beep_lite_cycle_time_planet;
     l->pl_flags |= PLREDRAW;			 /* Leave redraw on until * * 
@@ -64,7 +66,7 @@
 						  * done highlighting */
 }
 
-liteplayer(struct player *j)
+void liteplayer(struct player *j)
 {
     if (!j || (j->p_flags & PFCLOAK))
       return;

Index: warning.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/warning.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- warning.c	15 Apr 2006 09:58:25 -0000	1.3
+++ warning.c	26 Apr 2006 02:04:24 -0000	1.4
@@ -27,7 +27,7 @@
 warning (char *text)
 {
     int doPhaser;
-    LONG curtime;
+    time_t curtime;
     struct tm *tm;
     char newtext[128];
     char newtext2[128];