player/a/
player/b/
player/c/
player/d/
player/e/
player/f/
player/g/
player/i/
player/j/
player/k/
player/m/
player/n/
player/r/
player/s/
player/v/
player/w/
player/x/
player/z/
player_fst/e/
player_fst/f/
player_fst/h/
player_fst/i/
player_fst/j/
player_fst/n/
player_fst/o/
player_fst/p/
player_fst/player/a/
player_fst/player/b/
player_fst/player/c/
player_fst/player/d/
player_fst/player/e/
player_fst/player/f/
player_fst/player/g/
player_fst/player/j/
player_fst/player/k/
player_fst/player/m/
player_fst/player/n/
player_fst/player/r/
player_fst/player/s/
player_fst/player/v/
player_fst/player/w/
player_fst/player/x/
player_fst/player/z/
player_fst/u/
player_fst/v/
player_fst/w/
player_fst/x/
/*~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 ~  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        ~
 ~  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   ~
 ~                                                                         ~
 ~  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          ~
 ~  Chastain, Michael Quan, and Mitchell Tse.                              ~
 ~                                                                         ~
 ~  Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley              ~
 ~  ACK!MUD is modified Merc2.0/2.1/2.2 code (c)Stephen Zepp 1998 Ver: 4.3 ~
 ~                                                                         ~
 ~  In order to use any part of this Merc Diku Mud, you must comply with   ~
 ~  both the original Diku license in 'license.doc' as well the Merc       ~
 ~  license in 'license.txt', and the Ack!Mud license in 'ack_license.txt'.~
 ~  In particular, you may not remove any of these copyright notices.      ~
 ~                                                                         ~
 ~           _______      _____                                            ~
 ~          /  __  /\    / ___ \       222222        PA_MUD by Amnon Kruvi ~
 ~         /______/ /   / /___\ \            2       PA_MUD is modified    ~
 ~        / _______/   / _______ \           2       Ack!Mud, v4.3         ~
 ~       /_/          /_/       \_\        2                               ~
 ~                                      2                                  ~
 ~                                     2222222                             ~
 ~                                                                         ~
 ~                                                                         ~
 ~   Years of work have been invested to create DIKU, Merc, Ack and PA.    ~
 ~   Please show your respect by following the licenses, and issuing       ~
 ~   credits where due.                                                    ~
 ~                                                                         ~
 ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-*/

#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>

#include "ack.h"
#include "tables.h"

// All the map-generating code goes here

void create_full_map args( ( CHAR_DATA *ch ) );
void create_map(CHAR_DATA *ch,int type)
{
	if ( type == TERRAIN_BALANCED )
		create_full_map(ch);
	return;
}
void create_full_map(CHAR_DATA *ch)
{
		int xx,yy,x,y,i,j,k,m,n,z=ch->z;
		int sdefault = SECT_OCEAN;
		char buf[MSL];
		int fuzz = 3;

		for ( x = 0;x < MAX_MAPS;x++ )
			for ( y = 0; y < MAX_MAPS;y++ )
				map_table.type[x][y][z] = sdefault;

		buf[0] = '\0';
		j = number_range(MAX_MAPS / 40,MAX_MAPS / 20);    /* Generate Snow */
		
		sprintf( buf+strlen(buf), "%d Snow\n\r", j );
		for ( i = 0;i<j;i++ )
		{
			m = number_range(20,MAX_MAPS/10);
			n = number_range(BORDER_SIZE,MAX_MAPS);
			k = number_range(BORDER_SIZE,MAX_MAPS);
			for ( xx = n-m;xx<n;xx++ )
			{
				for ( yy = k-m;yy < k;yy++ )
				{
					x = xx;y = yy;real_coords(&x,&y);
//					if ( x < 0 || x >= MAX_MAPS || y < 0 || y >= MAX_MAPS )
//						continue;
					if (( xx + fuzz >= n || xx - fuzz <= n-m) && number_range(1,fuzz)==1)
						continue;
					if ( (yy+fuzz >= k || yy - fuzz <=k-m) && number_range(1,fuzz)==1)
						continue;
					if ( map_table.type[x][y][z] == sdefault )
						map_table.type[x][y][z] = SECT_SNOW;
				}
			}
		}
		j = number_range(MAX_MAPS / 10,MAX_MAPS / 5);   /* Generate Rock Fields */
		sprintf( buf+strlen(buf), "%d Rock Fields\n\r", j );
		for ( i = 0;i<j;i++ )
		{
			m = number_range(20,MAX_MAPS/20);
			n = number_range(BORDER_SIZE,MAX_MAPS);
			k = number_range(BORDER_SIZE,MAX_MAPS);
			for ( xx = n-m;xx<n;xx++ )
			{
				for ( yy = k-m;yy < k;yy++ )
				{
					x = xx;y = yy;real_coords(&x,&y);
//					if ( x < 0 || x >= MAX_MAPS || y < 0 || y >= MAX_MAPS )
//						continue;
					if (( xx + fuzz >= n || xx - fuzz <= n-m) && number_range(1,fuzz)==1)
						continue;
					if ( (yy+fuzz >= k || yy - fuzz <=k-m) && number_range(1,fuzz)==1)
						continue;
					if ( map_table.type[x][y][z] == sdefault )
						map_table.type[x][y][z] = SECT_ROCK;
				}
			}
		}
		j = number_range(MAX_MAPS / 20,MAX_MAPS / 14);    /* Generate Forests */
		sprintf( buf+strlen(buf), "%d Forests\n\r", j );
		for ( i = 0;i<j;i++ )
		{
			m = number_range(20,MAX_MAPS/15);
			n = number_range(BORDER_SIZE,MAX_MAPS);
			k = number_range(BORDER_SIZE,MAX_MAPS);
			for ( xx = n-m;xx<n;xx++ )
			{
				for ( yy = k-m;yy < k;yy++ )
				{
					x = xx;y=yy; real_coords(&x,&y);
//					if ( x < 0 || x >= MAX_MAPS || y < 0 || y >= MAX_MAPS )
//						continue;
					if (( xx + fuzz >= n || xx - fuzz <= n-m) && number_range(1,fuzz)==1)
						continue;
					if ( (yy+fuzz >= k || yy - fuzz <=k-m) && number_range(1,fuzz)==1)
						continue;
					if ( map_table.type[x][y][z] == sdefault )
						map_table.type[x][y][z] = SECT_FOREST;
				}
			}
		}
		j = number_range(MAX_MAPS / 40,MAX_MAPS / 20);    /* Generate Deserts */
		sprintf( buf+strlen(buf), "%d Deserts\n\r", j );
		for ( i = 0;i<j;i++ )
		{
			m = number_range(20,MAX_MAPS/10);
			n = number_range(BORDER_SIZE,MAX_MAPS);
			k = number_range(BORDER_SIZE,MAX_MAPS);
			for ( xx = n-m;xx<n;xx++ )
			{
				for ( yy = k-m;yy < k;yy++ )
				{
					x = xx;y=yy; real_coords(&x,&y);
//					if ( x < 0 || x >= MAX_MAPS || y < 0 || y >= MAX_MAPS )
//						continue;
					if (( xx + fuzz >= n || xx - fuzz <= n-m) && number_range(1,fuzz)==1)
						continue;
					if ( (yy+fuzz >= k || yy - fuzz <=k-m) && number_range(1,fuzz)==1)
						continue;
					if ( map_table.type[x][y][z] == sdefault )
						map_table.type[x][y][z] = SECT_SAND;
				}
			}
		}
		j = number_range(MAX_MAPS / 40,MAX_MAPS / 20);    /* Generate Fields */
		sprintf( buf+strlen(buf), "%d Fields\n\r", j );
		for ( i = 0;i<j;i++ )
		{
			m = number_range(20,MAX_MAPS/10);
			n = number_range(BORDER_SIZE,MAX_MAPS);
			k = number_range(BORDER_SIZE,MAX_MAPS);
			for ( xx = n-m;xx<n;xx++ )
			{
				for ( yy = k-m;yy < k;yy++ )
				{
					x = xx;y=yy; real_coords(&x,&y);
//					if ( x < 0 || x >= MAX_MAPS || y < 0 || y >= MAX_MAPS )
//						continue;
					if (( xx + fuzz >= n || xx - fuzz <= n-m) && number_range(1,fuzz)==1)
						continue;
					if ( (yy+fuzz >= k || yy - fuzz <=k-m) && number_range(1,fuzz)==1)
						continue;
					if ( map_table.type[x][y][z] == sdefault )
						map_table.type[x][y][z] = SECT_FIELD;
				}
			}
		}
		j = number_range(1,MAX_MAPS/20);	/* Generate Lakes */
		sprintf( buf+strlen(buf), "%d Lakes 1\n\r", j );
		for ( i = 1;i < j;i++ )
		{
			x = number_range(BORDER_SIZE,MAX_MAPS);
			k = number_range(BORDER_SIZE,MAX_MAPS);
			yy = number_range(BORDER_SIZE,MAX_MAPS); 
			m = number_range(1,3);
			for ( ;yy<k;yy++ )
			{
//				if ( x - BORDER_SIZE < 0 || x + m + BORDER_SIZE >= MAX_MAPS )
//					break;
				y = yy; real_coords(&x,&y);

				for ( n = 1;n<m;n++ )
				{
					if ( map_table.type[x+n][y][z] == SECT_LAVA )
						map_table.type[x+n][y][z] = SECT_ASH;
					else if ( map_table.type[x+n][y][z] != SECT_OCEAN )
						map_table.type[x+n][y][z] = SECT_WATER;
				}
				x = number_range(x-1,x+1);
			}
		}
		j = number_range(1,MAX_MAPS/20);
		sprintf( buf+strlen(buf), "%d Lakes 2\n\r", j );
		for ( i = 1;i < j;i++ )
		{
			y = number_range(BORDER_SIZE,MAX_MAPS);
			k = number_range(BORDER_SIZE,MAX_MAPS);
			xx = number_range(BORDER_SIZE,MAX_MAPS); 
			m = number_range(1,3);
			for ( ;xx<k;xx++ )
			{
//				if ( y < 0 || y + m >= MAX_MAPS )
//					continue;
				x = xx; real_coords(&x,&y);

				for ( n = 1;n<m;n++ )
				{
					if ( map_table.type[x+n][y][z] == SECT_LAVA )
						map_table.type[x+n][y][z] = SECT_ASH;
					else if ( map_table.type[x+n][y][z] != SECT_OCEAN )
						map_table.type[x+n][y][z] = SECT_WATER;
				}
				y = number_range(y-1,y+1);
			}
	
		}
		j = number_range(1,MAX_MAPS/20);
		sprintf( buf+strlen(buf), "%d Lakes 3\n\r", j );
		for ( i = 1;i < j;i++ )
		{
			x = number_range(BORDER_SIZE,MAX_MAPS);
			k = number_range(BORDER_SIZE,MAX_MAPS);
			yy = number_range(BORDER_SIZE,MAX_MAPS); 
			m = number_range(1,3);
			for ( ;yy<k;yy++ )
			{
//				if ( x - BORDER_SIZE < 0 || x + m + BORDER_SIZE >= MAX_MAPS )
//					break;
				y = yy; real_coords(&x,&y);

				for ( n = 1;n<m;n++ )
				{
					if ( map_table.type[x+n][y][z] == SECT_LAVA )
						map_table.type[x+n][y][z] = SECT_ASH;
					else if ( map_table.type[x+n][y][z] != SECT_OCEAN )
						map_table.type[x+n][y][z] = SECT_WATER;
				}
				x = number_range(x-1,x+1);
			}
		}
		j = number_range(1,MAX_MAPS/20);
		sprintf( buf+strlen(buf), "%d Lakes 4\n\r", j );
		for ( i = 1;i < j;i++ )
		{
			y = number_range(BORDER_SIZE,MAX_MAPS);
			k = number_range(BORDER_SIZE,MAX_MAPS);
			xx = number_range(BORDER_SIZE,MAX_MAPS); 
			m = number_range(1,3);
			for ( ;xx<k;xx++ )
			{
//				if ( y - BORDER_SIZE < 0 || y + m + BORDER_SIZE >= MAX_MAPS )
//					break;
				x = xx; real_coords(&x,&y);

				for ( n = 0;n<m;n++ )
				{
					if ( map_table.type[x+n][y][z] == SECT_LAVA )
						map_table.type[x+n][y][z] = SECT_ASH;
					else if ( map_table.type[x+n][y][z] != SECT_OCEAN )
						map_table.type[x+n][y][z] = SECT_WATER;
				}
				y = number_range(y-1,y+1);
			}
		}							
		j = number_range(1,MAX_MAPS/20);          /* Generate Mountain Ridges */
		sprintf( buf+strlen(buf), "%d Mountain Ridges 1\n\r", j );
		for ( i = 1;i < j;i++ )
		{
			x = number_range(BORDER_SIZE,MAX_MAPS);
			y = number_range(BORDER_SIZE,MAX_MAPS/2);
			k = number_range(BORDER_SIZE,MAX_MAPS);
			yy = number_range(BORDER_SIZE,MAX_MAPS);
			m = number_range(2,4);
			for ( ;yy<k;yy++ )
			{
//				if ( x < 0 || x + m >= MAX_MAPS )
//					break;
				y = yy; real_coords(&x,&y);
				for ( n = 1;n<m;n++ )
				{
					if ( map_table.type[x+n][y][z] == SECT_OCEAN ) continue;
					map_table.type[x+n][y][z] = SECT_MOUNTAIN;
				}
				if ( map_table.type[x+n][y][z] != SECT_OCEAN ) map_table.type[x+n][y][z] = SECT_HILLS;
				if ( map_table.type[x+n][y][z] != SECT_OCEAN ) map_table.type[x][y][z] = SECT_HILLS;
				x = number_range(x-1,x+1);
			}
		}
		j = number_range(1,MAX_MAPS/20);
		sprintf( buf+strlen(buf), "%d Mountain Ridges 2\n\r", j );
		for ( i = 1;i < j;i++ )
		{
			y = number_range(BORDER_SIZE,MAX_MAPS);
			k = number_range(BORDER_SIZE,MAX_MAPS);
			xx = number_range(BORDER_SIZE,MAX_MAPS); 
			m = number_range(2,4);
			for ( ;xx<k;xx++ )
			{
//				if ( y < 0 || y + m >= MAX_MAPS )
//					break;
				x = xx; real_coords(&x,&y);
				for ( n = 1;n<m;n++ )
				{
					if ( map_table.type[x+n][y][z] == SECT_OCEAN ) continue;
					map_table.type[x+n][y][z] = SECT_MOUNTAIN;
				}
				if ( map_table.type[x+n][y][z] != SECT_OCEAN ) map_table.type[x+n][y][z] = SECT_HILLS;
				if ( map_table.type[x+n][y][z] != SECT_OCEAN ) map_table.type[x][y][z] = SECT_HILLS;
				y = number_range(y-1,y+1);
			}
	
		}
		j = number_range(1,MAX_MAPS/20);
		sprintf( buf+strlen(buf), "%d Mountain Ridges 3\n\r", j );
		for ( i = 1;i < j;i++ )
		{
			x = number_range(BORDER_SIZE,MAX_MAPS);
			k = number_range(BORDER_SIZE,MAX_MAPS);
			yy = number_range(BORDER_SIZE,MAX_MAPS); 
			m = number_range(2,4);
			for ( ;yy<k;yy++ )
			{
//				if ( x < 0 || x + m >= MAX_MAPS )
//					break;
				y = yy; real_coords(&x,&y);
				for ( n = 1;n<m;n++ )
				{
					if ( map_table.type[x+n][y][z] == SECT_OCEAN ) continue;
					map_table.type[x+n][y][z] = SECT_MOUNTAIN;
				}
				if ( map_table.type[x+n][y][z] != SECT_OCEAN ) map_table.type[x+n][y][z] = SECT_HILLS;
				if ( map_table.type[x+n][y][z] != SECT_OCEAN ) map_table.type[x][y][z] = SECT_HILLS;
				x = number_range(x-1,x+1);
			}
		}
		j = number_range(1,MAX_MAPS/20);
		sprintf( buf+strlen(buf), "%d Mountain Ridges 4\n\r", j );
		for ( i = 1;i < j;i++ )
		{
			y = number_range(BORDER_SIZE,MAX_MAPS);
			k = number_range(BORDER_SIZE,MAX_MAPS);
			xx = number_range(BORDER_SIZE,MAX_MAPS); 
			m = number_range(2,4);
			for (;xx<k;xx++ )
			{
//				if ( y < 0 || y + m >= MAX_MAPS )
//					break;
				x = xx; real_coords(&x,&y);
				for ( n = 1;n<m;n++ )
				{
					if ( map_table.type[x+n][y][z] == SECT_OCEAN ) continue;
					map_table.type[x+n][y][z] = SECT_MOUNTAIN;
				}
				if ( map_table.type[x+n][y][z] != SECT_OCEAN ) map_table.type[x+n][y][z] = SECT_HILLS;
				if ( map_table.type[x+n][y][z] != SECT_OCEAN ) map_table.type[x][y][z] = SECT_HILLS;
				y = number_range(y-1,y+1);
			}
		}	
		j = MAX_MAPS / 1;    /* Generate Volcanos */
		sprintf( buf+strlen(buf), "%d Volcanos\n\r", j );
		for ( i = 0;i<j;i++ )
		{
			m = number_range(6,MAX_MAPS-6);
			n = number_range(6,MAX_MAPS-6);
			k = number_range(3,6);
			for ( x = m;x<m+k;x++ )
			{
				for ( y = n;y<n+k;y++ )
				{
					if ( x < 0 || y < 0 || x >= MAX_MAPS || y >= MAX_MAPS )
						continue;
					map_table.type[x][y][z] = SECT_LAVA;
				}
			}
			for ( x = m;x<m+k;x++ )
			{
				if ( x < 0 || x >= MAX_MAPS )
					continue;
				if ( map_table.type[x][n-1][z] != SECT_LAVA )
					map_table.type[x][n][z] = SECT_MOUNTAIN;
				if ( map_table.type[x][n+k+1][z] != SECT_LAVA )
					map_table.type[x][n+k][z] = SECT_MOUNTAIN;
			}
			for ( x = n;x<n+k;x++ )
			{
				if ( x < 0 || x >= MAX_MAPS )
					continue;

				if ( map_table.type[m-1][x][z] != SECT_LAVA )
					map_table.type[m][x][z] = SECT_MOUNTAIN;
				if ( map_table.type[m+k+1][x][z] != SECT_LAVA )
					map_table.type[m+k][x][z] = SECT_MOUNTAIN;
			}
		}

		/* Generate Borders */
		for ( x=0;x<BORDER_SIZE;x++ )
			for( y=0;y<MAX_MAPS;y++ )
			{
				map_table.type[x][y][z] = sdefault;
				map_table.type[y][x][z] = sdefault;
			}
		for ( x=MAX_MAPS - BORDER_SIZE;x<MAX_MAPS;x++ )
			for( y=0;y<MAX_MAPS;y++ )
			{
				map_table.type[x][y][z] = sdefault;
				map_table.type[y][x][z] = sdefault;
			}
		send_to_char( buf, ch );
		return;
}

void init_fields()
{
	int fuzz=3,z=Z_PAINTBALL;
	int i,j,m,n,k,x,y,sdefault=SECT_FOREST;

	for ( x=0;x<MAX_MAPS;x++ )
	{
		for ( y=0;y<MAX_MAPS;y++ )
		{
			if ( (y == 199 || y == 301 || x == 199 || x == 301 ) && x >= 199 && x <= 301 && y >= 199 && y <= 301 )
		                map_table.type[x][y][z] = SECT_NULL;
			else if ( y == 0 || x == 0 || y == MAX_MAPS-1 || x == MAX_MAPS-1 )
				map_table.type[x][y][z] = SECT_NULL;
			else
				map_table.type[x][y][z] = sdefault;

		}
	}
		j = number_range(MAX_MAPS / 40,MAX_MAPS / 20);    /* Generate Fields */
		for ( i = 0;i<j;i++ )
		{
			m = number_range(20,MAX_MAPS/10);
			n = number_range(BORDER_SIZE,MAX_MAPS);
			k = number_range(BORDER_SIZE,MAX_MAPS);
			for ( x = n-m;x<n;x++ )
			{
				for ( y = k-m;y < k;y++ )
				{
					if ( x < 0 || x >= MAX_MAPS || y < 0 || y >= MAX_MAPS )
						continue;
					if (( x + 4 > n || x - 4 < n-m) && number_range(1,fuzz)==1)
						continue;
					if ( y == number_fuzzy(k) )
						continue;
					if ( y == number_fuzzy(k-m) )
						continue;
					if ( map_table.type[x][y][z] == sdefault )
						map_table.type[x][y][z] = SECT_FIELD;
				}
			}
		}
		j = number_range(MAX_MAPS / 40,MAX_MAPS / 20);    /* Generate Snow */
		for ( i = 0;i<j;i++ )
		{
			m = number_range(20,MAX_MAPS/10);
			n = number_range(BORDER_SIZE,MAX_MAPS);
			k = number_range(BORDER_SIZE,MAX_MAPS);
			for ( x = n-m;x<n;x++ )
			{
				for ( y = k-m;y < k;y++ )
				{
					if ( x < 0 || x >= MAX_MAPS || y < 0 || y >= MAX_MAPS )
						continue;
					if (( x + 4 > n || x - 4 < n-m) && number_range(1,fuzz)==1)
						continue;
					if ( y == number_fuzzy(k) )
						continue;
					if ( y == number_fuzzy(k-m) )
						continue;
					if ( map_table.type[x][y][z] == sdefault )
						map_table.type[x][y][z] = SECT_SNOW;
				}
			}
		}
        for ( x=PIT_BORDER_X;x<MAX_MAPS-1;x++ )
	{
	        for ( y=PIT_BORDER_Y;y<MAX_MAPS-1;y++ )
		{
			if ( x == PIT_BORDER_X || y == PIT_BORDER_Y )
 	               		map_table.type[x][y][Z_PAINTBALL] = SECT_NULL;
			else
 	               		map_table.type[x][y][Z_PAINTBALL] = SECT_BURNED;
		}
	}

	return;
}