Sure, here is the code:
Code:
action water_terrain_animate()
{	
	int i; // number of vertices
	int j;
	var wave_cycle=2;
	var wave_cycle_dir=0;

	int vert_x;
  	int vert_y;
  	set(me,PASSABLE | POLYGON);
  	//my_under_waves.tilt = 90;
  	
  	wait(1);
	int num_vertices = ent_status(my_waves,0);
	int num_x_vertices = ent_status(my_waves,2)+1;
	int num_y_vertices = ent_status(my_waves,3)+1;
	
	
	//ent_clone(me);
	
	for(i = 0; i < 64; i++ )
	{	for(j = 0; j < 64; j++ )
		{	//vert_move[i][j][VERT_SPEED]=0;			
			water_vertices_data[i][j][VERT_SPEED]=wave_cycle+random(2)-1;			
			//vert_move[i][j][VERT_SPEED_CHANGE]=random(1)-0.5;
			
    		
		}
		wave_cycle+=wave_cycle_dir;
		if( wave_cycle>0 )wave_cycle_dir--;
		else wave_cycle_dir++;
	}
	
	

	
	//vec_scale(my.scale_x,100);
	//my.scale_z = my.scale_z/10;
	//my.ambient = 100;
	
	while(1)
	{
		//ent_animate(my,"Wave",anim_percentage, ANM_CYCLE);
		
		//anim_percentage += time_step;
		//if(anim_percentage>=100) anim_percentage = 0;
		vert_x=0;
		vert_y=0;
		for (i = num_vertices; i>0; i--) 
		{ 	CONTACT* c = ent_getvertex(my_waves,NULL,i);
			
			water_vertices_data[vert_x][vert_y][VERT_SPEED_CHANGE]=-(c.z- my_waves.z)/8;	
			//if(c.z<= my_waves.z ) vert_move[vert_x][vert_y][VERT_SPEED_CHANGE]++;
			//else if(c.v.y> my_waves.z ) vert_move[vert_x][vert_y][VERT_SPEED_CHANGE]--;
			
			water_vertices_data[vert_x][vert_y][VERT_SPEED]+=water_vertices_data[vert_x][vert_y][VERT_SPEED_CHANGE]/64;
			
			//move the vertice
			
    		c.v.y += water_vertices_data[vert_x][vert_y][VERT_SPEED]*time_step; // raise the vertex (y is the height in DX coorcinates)
    		ent_setvertex(my_waves,c,i);
    		
    		water_vertices_data[vert_x][vert_y][VERT_X] = c.x;
    		water_vertices_data[vert_x][vert_y][VERT_Y] = c.y;
    		water_vertices_data[vert_x][vert_y][VERT_Z] = c.z;
    		
    		//effect(p_trail,1,vector(water_vertices_data[vert_x][vert_y][VERT_X], water_vertices_data[vert_x][vert_y][VERT_Y], 50),vector(0,0,10));
    		
    		//effect(p_trail,1,vector(c.x, c.y, c.z),vector(0,10,10));
    		
    		//advance the vert_x & vert_y (for my info)
    		vert_x++;
    		if(vert_x >= num_x_vertices)
    		{	vert_x=0;
    			vert_y++;
			}
  		}
		

		wait(1);
	}
	
}



And the code to calculate the height at any given point:
Code:
function average_height(var av_x, var av_y, var vert_x, var vert_y)
{	var av_height = 0;
	var side_x;
	var side_y;
	var calc_tl_x;
	var calc_tl_y;
	var calc_br_x;
	var calc_br_y;
	var calc_face_tri;
	var calc_my_tri;
	var calc_avheight_x;
	var calc_avheight_y;
	var calc_ratio;
	var calc_length1;
	var calc_length2;
		
		vert_x = 0;
		vert_y = 0;
		while(1)
		{	if(av_x > water_vertices_data[vert_x][vert_y][VERT_X])
			{	break;
			}
			else vert_x++;
		}
		while(1)
		{	if(av_y < water_vertices_data[vert_x][vert_y][VERT_Y])
			{	break;
			}
			else vert_y++;
		}
	
	
	calc_tl_x = water_vertices_data[vert_x][vert_y-1][VERT_X];
	calc_tl_y = water_vertices_data[vert_x][vert_y-1][VERT_Y];
	calc_br_x = water_vertices_data[vert_x-1][vert_y][VERT_X];
	calc_br_y = water_vertices_data[vert_x-1][vert_y][VERT_Y];
	
	calc_face_tri = (calc_tl_x-calc_tl_y)-(calc_br_x-calc_br_y);
	calc_my_tri = (calc_tl_x-calc_tl_y)-(av_x-av_y);
	
	if(calc_my_tri > calc_face_tri )
	{	side_x = av_x - av_y + water_vertices_data[vert_x-1][vert_y][VERT_Y];
		calc_ratio = (side_x - water_vertices_data[vert_x-1][vert_y][VERT_X])/(water_vertices_data[vert_x][vert_y][VERT_X] - water_vertices_data[vert_x-1][vert_y][VERT_X]);
		calc_avheight_x = (water_vertices_data[vert_x][vert_y][VERT_Z] - water_vertices_data[vert_x-1][vert_y][VERT_Z])*calc_ratio + water_vertices_data[vert_x-1][vert_y][VERT_Z];

		
		side_y = av_y - av_x + water_vertices_data[vert_x][vert_y-1][VERT_X];
		calc_ratio = (side_y - water_vertices_data[vert_x][vert_y-1][VERT_Y])/(water_vertices_data[vert_x][vert_y][VERT_Y] - water_vertices_data[vert_x][vert_y-1][VERT_Y]);
		calc_avheight_y = (water_vertices_data[vert_x][vert_y][VERT_Z] - water_vertices_data[vert_x][vert_y-1][VERT_Z])*calc_ratio + water_vertices_data[vert_x][vert_y-1][VERT_Z];

		
		calc_length1 = vec_dist(vector(side_x,water_vertices_data[vert_x-1][vert_y][VERT_Y], 0),vector(water_vertices_data[vert_x][vert_y-1][VERT_X], side_y, 0 ));
		calc_length2 = vec_dist(vector(side_x,water_vertices_data[vert_x-1][vert_y][VERT_Y], 0),vector(av_x, av_y, 0 ));
		calc_ratio = calc_length2/calc_length1;
		
		av_height = -(calc_avheight_x-calc_avheight_y)*calc_ratio + calc_avheight_x;
	}
	else
	{	side_x = av_x - av_y + water_vertices_data[vert_x-1][vert_y-1][VERT_Y];
		calc_ratio = (side_x - water_vertices_data[vert_x-1][vert_y-1][VERT_X])/(water_vertices_data[vert_x][vert_y-1][VERT_X] - water_vertices_data[vert_x-1][vert_y-1][VERT_X]);
		calc_avheight_x = (water_vertices_data[vert_x][vert_y-1][VERT_Z] - water_vertices_data[vert_x-1][vert_y-1][VERT_Z])*calc_ratio + water_vertices_data[vert_x-1][vert_y-1][VERT_Z];
		
		side_y = av_y - av_x + water_vertices_data[vert_x-1][vert_y-1][VERT_X];
		calc_ratio = (side_y - water_vertices_data[vert_x-1][vert_y-1][VERT_Y])/(water_vertices_data[vert_x-1][vert_y][VERT_Y] - water_vertices_data[vert_x-1][vert_y-1][VERT_Y]);
		calc_avheight_y = (water_vertices_data[vert_x-1][vert_y][VERT_Z] - water_vertices_data[vert_x-1][vert_y-1][VERT_Z])*calc_ratio + water_vertices_data[vert_x-1][vert_y-1][VERT_Z];
		//effect(p_debris,1,vector(water_vertices_data[vert_x][vert_y][VERT_X], side_y, calc_avheight_y),vector(0,0,10));
		
		calc_length1 = vec_dist(vector(side_x,water_vertices_data[vert_x-1][vert_y-1][VERT_Y], 0),vector(water_vertices_data[vert_x-1][vert_y-1][VERT_X], side_y, 0 ));
		calc_length2 = vec_dist(vector(side_x,water_vertices_data[vert_x-1][vert_y-1][VERT_Y], 0),vector(av_x, av_y, 0 ));
		calc_ratio = calc_length2/calc_length1;
		
		av_height = -(calc_avheight_x-calc_avheight_y)*calc_ratio + calc_avheight_x;
	}	

	return av_height;
}



Kinda messy isn't it! Hope this helps.


A7 Commercial
First person submarine combat simulator project
http://alexanderforeman.webs.com/fightersubgame.htm