/*
  Sean Dobbs
  Period 4
  Missle trajectory simulation with pvm
*/

#include <math.h>
#include "/usr/pvm3/include/pvm3.h"

// Globals
struct Wall
{
	 int x, y, height;
};

void main()
{
	double v, t=0, tstep=0.01, a=32, vx, vy, x, y, closeness, wallt;
	int mytid, hit, dist, range, numwalls, ndata=0, master;
	char dataout[455];
	Wall *walls;

	mytid = pvm_mytid();
	pvm_recv(-1, 0);
	pvm_upkdouble(&v, 1, 1);
	pvm_upkint(&dist, 1, 1);
	pvm_upkint(&range, 1, 1);
	pvm_upkint(&numwalls, 1, 1);
	if(numwalls>0)
	{
		 walls = new Wall[numwalls];
		 for(int i=0; i<numwalls; i++)
		 {
			  pvm_upkint(&(walls[i].x), 1, 1);
			  pvm_upkint(&(walls[i].y), 1, 1);
			  pvm_upkint(&(walls[i].height), 1, 1);
		 }
	}
	
	for(double theta = 0; (theta<=90)&&(ndata<455); theta+=0.2)
	{
		 x=0;
		 t=0;
		 vy=v*sin((theta * M_PI)/180.0);
		 vx=v*cos((theta * M_PI)/180.0);
		 do
		 {
			  hit=0;
			  t+=tstep;
			  y = (vy * t) - (0.5 * a * t * t);
			  x = x + (vx * tstep);
			  if(numwalls>0)
			  {
				   for(int i=0; (i<numwalls)&&(!hit); i++)
				   {
						if((x<walls[i].x+5)&&(x>walls[i].x-5)&&(y>walls[i].y)&&(y<(walls[i].y+walls[i].height)))
						{
							 vx = -(vx / 2.0);
							 hit = 1;
						}
				   }
			  }			
		 }  
		 while(y>0);
		 closeness = fabs(x-dist);
		 if( closeness < range) dataout[ndata]=1;
		 else if(closeness < range*2) dataout[ndata]=2;
		 else if(closeness < range*4) dataout[ndata]=3;
		 else if(closeness < range*8) dataout[ndata]=4;
		 else if(closeness < range*16) dataout[ndata]=5;
		 else dataout[ndata]=0;
		 ndata++;
	}
	pvm_initsend( PvmDataDefault );
	pvm_pkdouble(&v, 1, 1);
	pvm_pkbyte(dataout, 455, 1);
	master = pvm_parent();
	pvm_send( master, 5 );
	pvm_exit();
}
