/*~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
~ 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;
}