/*
      GW-Main.c
      Root module for Gravity-Well
      Gary Teachout
      Copyright   July 1989
      lc -cs GW-Main    To compile with Lattice 5.0
*/


 #include "GW-Include.h"


 void main()
 {
   startup()  ;
   for ( ; ; )
   {
      takestep( g.timestep )  ;
      g.elapsedtime += g.timestep  ;
      updatedisplay()  ;
      interface()  ;
   }
 }


 void takestep( time )
   double   time  ;
 {
   struct dv   av , rv , tv , uv  ;
   double      r , v  ;
   long        i , j , flag , s , sn = 1 ;
   

   for ( i = 0 ; i < 20 ; i ++ )
      g.objects[ i ].oldpos = g.objects[ i ].position  ;

   for ( flag = 1 ; flag ; )
   {
      for ( flag = i = 0 ; ( i < 20 ) && ( ! flag ) ; i ++ )
      {
         if ( g.objects[ i ].flags && ( ! g.objects[ i ].collision ) )
         {
            for ( j = 0 ; ( j < 20 ) && ( ! flag ) ; j ++ )
            {
               if (     ( g.objects[ j ].flags )
                     && ( ! g.objects[ j ].collision )
                     && ( g.objects[ j ].mass )
                     && ( i != j )  )
               {
                  subdv(   &g.objects[ j ].velocity ,
                           &g.objects[ i ].velocity ,
                           &rv  )  ;
                  magdv( &rv , &v )  ;
                  subdv(   &g.objects[ j ].position ,
                           &g.objects[ i ].position ,
                           &rv  )  ;
                  magdv( &rv , &r )  ;
                  if ( ( r < ( v * time * g.magic ) ) && ( sn < 256 ) )
                  {
                     flag = 1  ;
                     time = time * 0.5  ;
                     sn = sn * 2  ;
                  }
               }
            }
         }
      }
   }
   for ( s = 0 ; s < sn ; s ++ )
   {
      for ( i = 0 ; i < 20 ; i ++ )
      {
         if ( g.objects[ i ].flags && ( ! g.objects[ i ].collision ) )
         {
            av = zerodv  ;
            for ( j = 0 ; j < 20 ; j ++ )
            {
               if (     ( g.objects[ j ].flags )
                     && ( ! g.objects[ j ].collision )
                     && ( g.objects[ j ].mass )
                     && ( i != j )  )
               {
                  subdv(   &g.objects[ j ].position ,
                           &g.objects[ i ].position , 
                           &rv  )  ;
                  magdv( &rv , &r )  ;
                  if ( r < (     g.objects[ i ].radius
                              +  g.objects[ j ].radius ) )
                  {
                     endtrail( i , j )  ;
                     g.objects[ i ].collision = 1  ;
                     v =      g.objects[ i ].mass 
                           /  (     g.objects[ i ].mass
                                 +  g.objects[ j ].mass )  ;
                     scaledv( &rv , &v , &tv )  ;
                     subdv(   &g.objects[ j ].position ,
                              &tv ,
                              &g.objects[ j ].position )  ;
                     g.objects[ j ].oldpos = g.objects[ j ].position  ;
                     scaledv(    &g.objects[ i ].velocity ,
                                 &g.objects[ i ].mass ,
                                 &tv )  ;
                     scaledv(    &g.objects[ j ].velocity ,
                                 &g.objects[ j ].mass ,
                                 &uv )  ;
                     adddv( &tv , &uv , &g.objects[ j ].velocity )  ;
                     g.objects[ j ].mass += g.objects[ i ].mass  ;
                     v = 1 / g.objects[ j ].mass  ;
                     scaledv(    &g.objects[ j ].velocity ,
                                 &v ,
                                 &g.objects[ j ].velocity )  ;
                     j = 30  ;
                  }
                  else
                  {
                     r = ( g.objects[ j ].mass * time ) / ( r * r * r )  ;
                     scaledv( &rv , &r , &tv )  ;
                     adddv( &av , &tv , &av )  ;
                  }
               }
            }
            adddv(   &g.objects[ i ].velocity ,
                     &av ,
                     &g.objects[ i ].velocity )  ;
         }
      }
      for ( i = 0 ; i < 20 ; i ++ )
      {
         if ( g.objects[ i ].flags && ( ! g.objects[ i ].collision ) )
         {
            scaledv( &g.objects[ i ].velocity ,
                     &time ,
                     &tv )  ;
            adddv(   &g.objects[ i ].position ,
                     &tv ,
                     &g.objects[ i ].position )  ;
         }
      }
   }
 }



