/******************************************************************************
Snippet: Wilderness system (v1.0).
Author: Richard Woolcock (aka KaVir).
Date: 2nd September 1998.
******************************************************************************
File: wild_cmd.c
Purpose: Deals with wilderness commands.
******************************************************************************
This code is copyright (C) 1998 by Richard Woolcock. It may be used and
distributed freely, as long as you do not remove this copyright notice.
******************************************************************************/
/******************************************************************************
Required libraries
******************************************************************************/
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "wild.h"
/******************************************************************************
Local operation prototypes
******************************************************************************/
void smooth_water args( ( int x, int y ) );
/******************************************************************************
Global operations
******************************************************************************/
/* Command to save all/part of the wilderness. */
void do_wsave( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
int x, y;
one_argument( argument, arg );
if (arg[0] == '\0')
{
send_to_char("Wsave should be one of: zone, world, auto.\n\r",ch);
return;
}
if (!str_cmp(arg,"world"))
{
for ( x = 0; x < 10; x++ )
{
for ( y = 0; y < 10; y++ )
{
wild_write(x,y);
}
}
send_to_char("World saved.\n\r",ch);
return;
}
if (!str_cmp(arg,"zone"))
{
if (ch->x < 0 || ch->x >= WILDERNESS_SIZE ||
ch->y < 0 || ch->y >= WILDERNESS_SIZE)
{
send_to_char("You are not in a wilderness zone.\n\r",ch);
return;
}
x = ch->x / 100;
y = ch->y / 100;
wild_write(x,y);
send_to_char("Zone saved.\n\r",ch);
return;
}
if (!str_cmp(arg,"auto"))
{
if (check_world_saving())
{
send_to_char("The world is no longer autosaving.\n\r",ch);
set_world_saving( FALSE );
}
else
{
send_to_char("The world is now autosaving.\n\r",ch);
set_world_saving( TRUE );
}
return;
}
do_wsave(ch,"");
return;
}
/* Immortal command for initially evolving the wilderness */
void do_evolve( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
int xx, yy, xxx, yyy, rand_num, chance = 0;
one_argument( argument, arg );
if (arg[0] == '\0')
{
send_to_char("Evolve what? Forest, Water or Mountains?\n\r",ch);
return;
}
if ( !str_cmp(arg,"forest") )
{
for ( xx = 0; xx < 1000; xx++ )
{
for ( yy = 0; yy < 1000; yy++ )
{
if (map_data(xx,yy) != WILD_FOREST_1 &&
map_data(xx,yy) != WILD_FOREST_2 &&
map_data(xx,yy) != WILD_FOREST_3 &&
map_data(xx,yy) != WILD_FOREST_4) continue;
rand_num = number_range(1,10);
switch (map_data(xx,yy))
{
default: break;
case WILD_FOREST_1:
if (rand_num <= 6)
set_map_data(xx, yy, WILD_FOREST_2);
chance = 0;
break;
case WILD_FOREST_2:
if (rand_num <= 4)
set_map_data(xx, yy, WILD_FOREST_3);
chance = 2;
break;
case WILD_FOREST_3:
if (rand_num <= 2)
set_map_data(xx, yy, WILD_FOREST_4);
chance = 4;
break;
case WILD_FOREST_4:
chance = 6;
break;
}
if (number_range(1,10) < chance) continue;
xxx = xx; yyy = yy;
switch (number_range(1,4))
{
default: break;
case 1: xxx++; if (xxx >= 1000) xxx = 0; break;
case 2: xxx--; if (xxx < 0) xxx = 999; break;
case 3: yyy++; if (yyy >= 1000) yyy = 0; break;
case 4: yyy--; if (yyy < 0) yyy = 999; break;
}
if (map_data(xxx,yyy) != WILD_PLAINS) continue;
set_map_data(xxx, yyy, WILD_FOREST_1);
}
}
send_to_char("Ok.\n\r",ch);
return;
}
else if ( !str_cmp(arg,"water") )
{
for ( xx = 0; xx < 1000; xx++ )
{
for ( yy = 0; yy < 1000; yy++ )
{
if (map_data(xx,yy) == WILD_WATER_1)
set_map_data(xx, yy, WILD_WATER_DEEP_1);
else if (map_data(xx,yy) == WILD_WATER_2)
set_map_data(xx, yy, WILD_WATER_DEEP_2);
}
}
for ( xx = 0; xx < 1000; xx++ )
{
for ( yy = 0; yy < 1000; yy++ )
{
if (map_data(xx,yy) != WILD_WATER_DEEP_1 &&
map_data(xx,yy) != WILD_WATER_DEEP_2) continue;
xxx = xx; yyy = yy;
switch (number_range(1,4))
{
default: break;
case 1: xxx++; if (xxx >= 1000) xxx = 0; break;
case 2: xxx--; if (xxx < 0) xxx = 999; break;
case 3: yyy++; if (yyy >= 1000) yyy = 0; break;
case 4: yyy--; if (yyy < 0) yyy = 999; break;
}
if (map_data(xxx,yyy) == WILD_AREA_LINK ||
map_data(xxx,yyy) == WILD_MOUNTAINS_NONE ||
map_data(xxx,yyy) == WILD_MOUNTAINS_STONE ||
map_data(xxx,yyy) == WILD_MOUNTAINS_IRON ||
map_data(xxx,yyy) == WILD_MOUNTAINS_GOLD ||
map_data(xxx,yyy) == WILD_MOUNTAINS_OIL) continue;
if (number_range(1,3) == 1)
set_map_data(xxx, yyy, WILD_WATER_DEEP_2);
else
set_map_data(xxx, yyy, WILD_WATER_DEEP_1);
}
}
for ( xx = 0; xx < 1000; xx++ )
{
for ( yy = 0; yy < 1000; yy++ )
{
if (map_data(xx,yy) != WILD_WATER_DEEP_1 &&
map_data(xx,yy) != WILD_WATER_DEEP_2) continue;
smooth_water(xx,yy);
}
}
send_to_char("Ok.\n\r",ch);
return;
}
if ( !str_cmp(arg,"mountains") )
{
for ( xx = 0; xx < 1000; xx++ )
{
for ( yy = 0; yy < 1000; yy++ )
{
if (map_data(xx,yy) != WILD_MOUNTAINS_NONE &&
map_data(xx,yy) != WILD_MOUNTAINS_STONE &&
map_data(xx,yy) != WILD_MOUNTAINS_IRON &&
map_data(xx,yy) != WILD_MOUNTAINS_GOLD &&
map_data(xx,yy) != WILD_MOUNTAINS_OIL ) continue;
rand_num = number_range(1,20);
if (map_data(xx,yy) == WILD_MOUNTAINS_NONE)
{
switch (rand_num)
{
default: break;
case 1: set_map_data(xx, yy, WILD_MOUNTAINS_STONE);
break;
case 2: set_map_data(xx, yy, WILD_MOUNTAINS_IRON);
break;
case 3: set_map_data(xx, yy, WILD_MOUNTAINS_GOLD);
break;
case 4: set_map_data(xx, yy, WILD_MOUNTAINS_OIL);
break;
}
chance = 0;
break;
}
xxx = xx; yyy = yy;
switch (number_range(1,4))
{
default: break;
case 1: xxx++; if (xxx >= 1000) xxx = 0; break;
case 2: xxx--; if (xxx < 0) xxx = 999; break;
case 3: yyy++; if (yyy >= 1000) yyy = 0; break;
case 4: yyy--; if (yyy < 0) yyy = 999; break;
}
if (map_data(xxx,yyy) != WILD_PLAINS) continue;
set_map_data(xxx, yyy, WILD_MOUNTAINS_NONE);
}
}
send_to_char("Ok.\n\r",ch);
return;
}
do_evolve(ch,"");
return;
}
/* Immortal command to modify the landscape one room at a time. */
void do_landscape( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
int x = ch->x;
int y = ch->y;
one_argument( argument, arg );
if (x < 0 || x >= 1000 || y < 0 || y >= 1000)
{
send_to_char("You cannot change the landscape here.\n\r",ch);
return;
}
if (arg[0] == '\0')
{
send_to_char("Landscape type can be one of: Road Water Forest Hut Cabin Cottage House\n\rPlain Mountain.\n\r",ch);
return;
}
if ( !str_cmp(arg,"road") )
set_map_data(x, y, WILD_ROAD);
else if ( !str_cmp(arg,"water") )
{
if (number_range(1,3) == 1)
set_map_data(x, y, WILD_WATER_2);
else
set_map_data(x, y, WILD_WATER_1);
}
else if ( !str_cmp(arg,"forest") )
{
switch (number_range(1,4))
{
default: set_map_data(x, y, WILD_FOREST_1); break;
case 2: set_map_data(x, y, WILD_FOREST_2); break;
case 3: set_map_data(x, y, WILD_FOREST_3); break;
case 4: set_map_data(x, y, WILD_FOREST_4); break;
}
}
else if ( !str_cmp(arg,"arealink") )
set_map_data(x, y, WILD_AREA_LINK);
else if ( !str_cmp(arg,"hut") )
set_map_data(x, y, WILD_HUT);
else if ( !str_cmp(arg,"cabin") )
set_map_data(x, y, WILD_CABIN);
else if ( !str_cmp(arg,"cottage") )
set_map_data(x, y, WILD_COTTAGE);
else if ( !str_cmp(arg,"house") )
set_map_data(x, y, WILD_HOUSE);
else if ( !str_cmp(arg,"plain") || !str_cmp(arg,"plains") )
set_map_data(x, y, WILD_PLAINS);
else if ( !str_cmp(arg,"mountain") || !str_cmp(arg,"mountains") )
{
switch (number_range(1,20))
{
default: set_map_data(x, y, WILD_MOUNTAINS_NONE); break;
case 1:
case 2:
case 4:
case 5: set_map_data(x, y, WILD_MOUNTAINS_STONE); break;
case 6:
case 7:
case 8: set_map_data(x, y, WILD_MOUNTAINS_IRON); break;
case 9: set_map_data(x, y, WILD_MOUNTAINS_GOLD); break;
case 10: set_map_data(x, y, WILD_MOUNTAINS_OIL); break;
}
}
else do_landscape(ch,"");
send_to_char("Ok.\n\r",ch);
return;
}
/* Command to begin chopping down trees. */
void do_chop( CHAR_DATA *ch, char *argument )
{
bool in_forest = FALSE;
if (ch->x >= 0 || ch->y >= 0) switch (map_data(ch->x,ch->y))
{
default: break;
case WILD_FOREST_1:
case WILD_FOREST_2:
case WILD_FOREST_3:
case WILD_FOREST_4:
in_forest = TRUE;
break;
}
if (!in_forest)
{
send_to_char("You can only chop down trees in the forest!\n\r",ch);
return;
}
if (ch->action != 0)
{
send_to_char("You stop chopping trees.\n\r",ch);
ch->action = 0;
ch->state = 0;
ch->quality = 0;
return;
}
send_to_char("Ok.\n\r",ch);
ch->action = WA_CHOPPING_SWING;
ch->state = 0;
ch->quality = number_range(25,50);
return;
}
/* Command to begin mining for ore or oil. */
void do_mine( CHAR_DATA *ch, char *argument )
{
bool in_mine = FALSE;
if (ch->x >= 0 || ch->y >= 0) switch (map_data(ch->x,ch->y))
{
default: break;
case WILD_MINE_EMPTY:
case WILD_MINE_STONE_1:
case WILD_MINE_STONE_2:
case WILD_MINE_IRON_1:
case WILD_MINE_IRON_2:
case WILD_MINE_GOLD_1:
case WILD_MINE_GOLD_2:
case WILD_MINE_OIL_1:
case WILD_MINE_OIL_2:
in_mine = TRUE;
break;
}
if (!in_mine)
{
send_to_char("But you are not in a mine!\n\r",ch);
return;
}
if (ch->room < 3 || ch->room > 6)
{
send_to_char("You cannot mine in this part.\n\r",ch);
return;
}
if (ch->action != 0)
{
send_to_char("You stop mining.\n\r",ch);
ch->action = 0;
ch->state = 0;
ch->quality = 0;
return;
}
send_to_char("Ok.\n\r",ch);
ch->action = WA_MINING_CHOP;
ch->state = 0;
ch->quality = number_range(20,60);
return;
}
/* Command to begin digging a mine. */
void do_dig( CHAR_DATA *ch, char *argument )
{
bool in_mine = FALSE;
if (ch->x >= 0 || ch->y >= 0) switch (map_data(ch->x,ch->y))
{
default: break;
case WILD_MINE_STRUCTURE_EMPTY:
case WILD_MINE_STRUCTURE_STONE:
case WILD_MINE_STRUCTURE_IRON:
case WILD_MINE_STRUCTURE_GOLD:
case WILD_MINE_STRUCTURE_OIL:
if (ch->room == 1) in_mine = TRUE;
break;
}
if (!in_mine)
{
send_to_char("You cannot dig here.\n\r",ch);
return;
}
if (ch->action != 0)
{
send_to_char("You stop digging.\n\r",ch);
ch->action = 0;
ch->state = 0;
ch->quality = 0;
return;
}
send_to_char("Ok.\n\r",ch);
ch->action = WA_DIGGING_CHOP;
ch->state = 0;
return;
}
/* Command to begin hoeing a field. */
void do_hoe( CHAR_DATA *ch, char *argument )
{
bool in_field = FALSE;
if (ch->x >= 0 || ch->y >= 0) switch (map_data(ch->x,ch->y))
{
default: break;
case WILD_PLAINS:
in_field = TRUE;
break;
}
if (!in_field)
{
send_to_char("You can only hoe a plain.\n\r",ch);
return;
}
if (ch->action != 0)
{
send_to_char("You stop hoeing.\n\r",ch);
ch->action = 0;
ch->state = 0;
ch->quality = 0;
return;
}
send_to_char("Ok.\n\r",ch);
ch->action = WA_HOE;
ch->state = 0;
return;
}
/* Command to begin seeding a hoed field. */
void do_seed( CHAR_DATA *ch, char *argument )
{
bool in_field = FALSE;
if (ch->x >= 0 || ch->y >= 0) switch (map_data(ch->x,ch->y))
{
default: break;
case WILD_FIELD_HOED:
in_field = TRUE;
break;
}
if (!in_field)
{
send_to_char("You can only seed a hoed field.\n\r",ch);
return;
}
if (ch->action != 0)
{
send_to_char("You stop seeding.\n\r",ch);
ch->action = 0;
ch->state = 0;
ch->quality = 0;
return;
}
send_to_char("Ok.\n\r",ch);
ch->action = WA_SEED;
ch->state = 0;
return;
}
/* Command to begin scything a field of wheat. */
void do_scythe( CHAR_DATA *ch, char *argument )
{
bool in_field = FALSE;
if (ch->x >= 0 || ch->y >= 0) switch (map_data(ch->x,ch->y))
{
default: break;
case WILD_FIELD_WHEAT:
in_field = TRUE;
break;
}
if (!in_field)
{
send_to_char("You can only scythe a wheat field.\n\r",ch);
return;
}
if (ch->action != 0)
{
send_to_char("You stop gathering the wheat.\n\r",ch);
ch->action = 0;
ch->state = 0;
ch->quality = 0;
return;
}
send_to_char("Ok.\n\r",ch);
ch->action = WA_SCYTHE;
ch->state = 0;
return;
}
/* Command to begin building a structure. */
void do_build( CHAR_DATA *ch, char *argument )
{
bool is_mine = FALSE;
bool can_build = FALSE;
int resources = 100;
if (ch->x >= 0 || ch->y >= 0) switch (map_data(ch->x,ch->y))
{
default: break;
case WILD_PLAINS:
case WILD_BUILDING_CONSTRUCTION:
can_build = TRUE;
resources = 100;
break;
case WILD_HUT:
case WILD_HUT_OWNED:
case WILD_HUT_LOCKED:
can_build = TRUE;
resources = 200;
break;
case WILD_CABIN:
case WILD_CABIN_OWNED:
case WILD_CABIN_LOCKED:
can_build = TRUE;
resources = 300;
break;
case WILD_COTTAGE:
case WILD_COTTAGE_OWNED:
case WILD_COTTAGE_LOCKED:
can_build = TRUE;
resources = 600;
break;
case WILD_MOUNTAINS_NONE:
case WILD_MOUNTAINS_STONE:
case WILD_MOUNTAINS_IRON:
case WILD_MOUNTAINS_GOLD:
case WILD_MOUNTAINS_OIL:
can_build = TRUE;
is_mine = TRUE;
resources = 50;
break;
}
if (!can_build)
{
send_to_char("You cannot build here.\n\r",ch);
return;
}
if (ch->room != 0)
{
send_to_char("You must stand in the entrance to the building.\n\r",ch);
return;
}
if (ch->in_room->ground <= 0)
{
send_to_char("There are no resources in the room.\n\r",ch);
return;
}
if (ch->action != 0)
{
send_to_char("You stop building.\n\r",ch);
ch->action = 0;
ch->state = 0;
ch->quality = 0;
return;
}
send_to_char("Ok.\n\r",ch);
if (ch->in_room->build <= 0) ch->in_room->build = 1;
ch->action = WA_BUILDING_FOUNDATION;
ch->state = 0;
return;
}
/* Command to begin trimming a tree. */
void do_trim( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
if ( ( obj = get_obj_here( ch, "tree" ) ) == NULL )
{
send_to_char("You don't see any trees to trim.\n\r",ch);
return;
}
if ( obj->item_type != ITEM_RESOURCE || obj->value[1] != RESOURCE_TREE )
{
send_to_char("You can only trim trees.\n\r",ch);
return;
}
if (ch->action != 0)
{
send_to_char("You stop trimming the tree.\n\r",ch);
ch->action = 0;
ch->state = 0;
ch->quality = 0;
return;
}
send_to_char("Ok.\n\r",ch);
ch->action = WA_TRIM;
ch->state = 0;
ch->quality = obj->weight;
return;
}
/* Command to begin sawing up a log. */
void do_saw( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
if ( ( obj = get_obj_here( ch, "log" ) ) == NULL )
{
send_to_char("You don't see any logs to saw up.\n\r",ch);
return;
}
if ( obj->item_type != ITEM_RESOURCE || obj->value[1] != RESOURCE_LOG )
{
send_to_char("You can only saw up logs.\n\r",ch);
return;
}
if (ch->action != 0)
{
send_to_char("You stop sawing the log.\n\r",ch);
ch->action = 0;
ch->state = 0;
ch->quality = 0;
return;
}
send_to_char("Ok.\n\r",ch);
ch->action = WA_SAW;
ch->state = 0;
ch->quality = obj->weight;
return;
}
/* Command to begin laying a road. */
void do_lay( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
bool in_plains = FALSE;
if (ch->x >= 0 || ch->y >= 0) switch (map_data(ch->x,ch->y))
{
default: break;
case WILD_PLAINS:
in_plains = TRUE;
break;
}
if (!in_plains)
{
send_to_char("You cannot lay a road here.\n\r",ch);
return;
}
if ( ( obj = get_obj_here( ch, "stone" ) ) == NULL )
{
send_to_char("You don't see any stones to lay.\n\r",ch);
return;
}
if ( obj->item_type != ITEM_RESOURCE || obj->value[1] != RESOURCE_ROCK )
{
send_to_char("You can only lay stones to form a road.\n\r",ch);
return;
}
if (get_eq_char(ch, WEAR_WIELD) != NULL ||
get_eq_char(ch, WEAR_HOLD) != NULL )
{
send_to_char("You need two free hands to lay a road.\n\r",ch);
return;
}
if (ch->action != 0)
{
send_to_char("You stop laying the road.\n\r",ch);
ch->action = 0;
ch->state = 0;
ch->quality = 0;
return;
}
send_to_char("Ok.\n\r",ch);
ch->action = WA_ROAD;
ch->state = 0;
return;
}
/* Command to begin fishing. */
void do_fish( CHAR_DATA *ch, char *argument )
{
bool in_water = FALSE;
if (ch->x >= 0 || ch->y >= 0) switch (map_data(ch->x,ch->y))
{
default: break;
case WILD_WATER_1:
case WILD_WATER_2:
case WILD_WATER_DEEP_1:
case WILD_WATER_DEEP_2:
in_water = TRUE;
break;
}
if (!in_water)
{
send_to_char("You can only go fishing in water!\n\r",ch);
return;
}
if (ch->action != 0)
{
send_to_char("You stop fishing.\n\r",ch);
ch->action = 0;
ch->state = 0;
ch->quality = 0;
return;
}
send_to_char("Ok.\n\r",ch);
ch->action = WA_FISHING_MENDING;
ch->state = 0;
return;
}
/* Command to prospect for resources on a mountain range. */
void do_prospect( CHAR_DATA *ch, char *argument )
{
int x = ch->x;
int y = ch->y;
if (x < 0 || x >= 1000 || y < 0 || y >= 1000)
{
send_to_char("You cannot prospect here.\n\r",ch);
return;
}
switch (map_data(x,y))
{
default:
case WILD_MOUNTAINS_NONE:
send_to_char("Seems like a pretty rubbish place to build a mine.\n\r",ch);
break;
case WILD_MOUNTAINS_STONE:
send_to_char("Looks like it could have potential for stone.\n\r",ch);
break;
case WILD_MOUNTAINS_IRON:
send_to_char("Looks like it could have potential for iron.\n\r",ch);
break;
case WILD_MOUNTAINS_GOLD:
send_to_char("Looks like it could have potential for gold.\n\r",ch);
break;
case WILD_MOUNTAINS_OIL:
send_to_char("Looks like it could have potential for oil.\n\r",ch);
break;
}
return;
}
void do_home( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
bool found_home = FALSE;
int x = ch->home_x;
int y = ch->home_y;
argument = one_argument( argument, arg );
if ( IS_NPC(ch) ) return;
if (ch->in_room == NULL || ch->in_room->vnum < 20000 ||
ch->in_room->vnum >= 21000 || ch->x < 0 || ch->y < 0)
{
send_to_char("You can only make your home in the wilderness.\n\r",ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Syntax: home <here/new/lock>.\n\r", ch );
return;
}
if (!str_cmp(arg,"lock"))
{
if ( ch->home_x != ch->x || ch->home_y != ch->y )
{
send_to_char("But you do not even live here!\n\r",ch);
return;
}
if ( ch->room != 0 )
{
send_to_char("You must stand at the front door of the building you wish to lock.\n\r",ch);
return;
}
switch (map_data(ch->x,ch->y))
{
default:
send_to_char( "But you don't even live here!\n\r", ch );
break;
case WILD_HUT_OWNED:
send_to_char("You lock the front door of your hut.\n\r",ch);
act("$n locks the hut door.",ch,NULL,NULL,TO_ROOM);
set_map_data(ch->x, ch->y, WILD_HUT_LOCKED);
do_wsave(ch,"zone");
break;
case WILD_CABIN_OWNED:
send_to_char("You lock the front door of your cabin.\n\r",ch);
act("$n locks the cabin door.",ch,NULL,NULL,TO_ROOM);
set_map_data(ch->x, ch->y, WILD_CABIN_LOCKED);
do_wsave(ch,"zone");
break;
case WILD_COTTAGE_OWNED:
send_to_char("You lock the front door of your cottage.\n\r",ch);
act("$n locks the cottage door.",ch,NULL,NULL,TO_ROOM);
set_map_data(ch->x, ch->y, WILD_COTTAGE_LOCKED);
do_wsave(ch,"zone");
break;
case WILD_HOUSE_OWNED:
send_to_char("You lock the front door of your house.\n\r",ch);
act("$n locks the house door.",ch,NULL,NULL,TO_ROOM);
set_map_data(ch->x, ch->y, WILD_HOUSE_LOCKED);
do_wsave(ch,"zone");
break;
case WILD_HUT_LOCKED:
send_to_char("You unlock the front door of your hut.\n\r",ch);
act("$n unlocks the hut door.",ch,NULL,NULL,TO_ROOM);
set_map_data(ch->x, ch->y, WILD_HUT_OWNED);
do_wsave(ch,"zone");
break;
case WILD_CABIN_LOCKED:
send_to_char("You unlock the front door of your cabin.\n\r",ch);
act("$n unlocks the cabin door.",ch,NULL,NULL,TO_ROOM);
set_map_data(ch->x, ch->y, WILD_CABIN_OWNED);
do_wsave(ch,"zone");
break;
case WILD_COTTAGE_LOCKED:
send_to_char("You unlock the front door of your cottage.\n\r",ch);
act("$n unlocks the cottage door.",ch,NULL,NULL,TO_ROOM);
set_map_data(ch->x, ch->y, WILD_COTTAGE_OWNED);
do_wsave(ch,"zone");
break;
case WILD_HOUSE_LOCKED:
send_to_char("You unlock the front door of your house.\n\r",ch);
act("$n unlocks the house door.",ch,NULL,NULL,TO_ROOM);
set_map_data(ch->x, ch->y, WILD_HOUSE_OWNED);
do_wsave(ch,"zone");
break;
}
return;
}
if ( (str_cmp(arg,"here") && str_cmp(arg,"new")) )
{
send_to_char( "If you wish this to be your home, you must type 'home here'.\n\r", ch );
return;
}
if ( ch->x == ch->home_x && ch->y == ch->home_y )
{
send_to_char( "But this is already your home!\n\r", ch );
return;
}
if ( ch->home_x >= 0 && ch->x != ch->home_x && ch->y != ch->home_y )
{
if ( str_cmp(arg,"new") )
{
send_to_char( "To abandon your old home for here, you must type 'home new'.\n\r", ch );
return;
}
}
switch (map_data(ch->x,ch->y))
{
default:
send_to_char( "But you are not in a building!\n\r", ch );
break;
case WILD_HUT_OWNED:
case WILD_CABIN_OWNED:
case WILD_COTTAGE_OWNED:
case WILD_HOUSE_OWNED:
case WILD_HUT_LOCKED:
case WILD_CABIN_LOCKED:
case WILD_COTTAGE_LOCKED:
case WILD_HOUSE_LOCKED:
send_to_char( "Someone else already lives here.\n\r", ch );
break;
case WILD_HUT:
set_map_data(ch->x, ch->y, WILD_HUT_LOCKED);
send_to_char( "This hut is now your home.\n\r", ch );
ch->home_x = ch->x;
ch->home_y = ch->y;
found_home = TRUE;
break;
case WILD_CABIN:
set_map_data(ch->x, ch->y, WILD_CABIN_LOCKED);
send_to_char( "This cabin is now your home.\n\r", ch );
ch->home_x = ch->x;
ch->home_y = ch->y;
found_home = TRUE;
break;
case WILD_COTTAGE:
set_map_data(ch->x, ch->y, WILD_COTTAGE_LOCKED);
send_to_char( "This cottage is now your home.\n\r", ch );
ch->home_x = ch->x;
ch->home_y = ch->y;
found_home = TRUE;
break;
case WILD_HOUSE:
set_map_data(ch->x, ch->y, WILD_HOUSE_LOCKED);
send_to_char( "This house is now your home.\n\r", ch );
ch->home_x = ch->x;
ch->home_y = ch->y;
found_home = TRUE;
break;
}
if (found_home && x >= 0 && y >= 0)
{
switch (map_data(x,y))
{
default:
break;
case WILD_HUT_OWNED:
case WILD_HUT_LOCKED:
set_map_data(x, y, WILD_HUT);
break;
case WILD_CABIN_OWNED:
case WILD_CABIN_LOCKED:
set_map_data(x, y, WILD_CABIN);
break;
case WILD_COTTAGE_OWNED:
case WILD_COTTAGE_LOCKED:
set_map_data(x, y, WILD_COTTAGE);
break;
case WILD_HOUSE_OWNED:
case WILD_HOUSE_LOCKED:
set_map_data(x, y, WILD_HOUSE);
break;
}
}
return;
}
/******************************************************************************
Local operations
******************************************************************************/
/* Operation to ensure that water edges are shallow. */
void smooth_water( int x, int y )
{
int xx, yy, xxx, yyy;
for ( xxx = -1; xxx < 2; xxx++ )
{
for ( yyy = -1; yyy < 2; yyy++ )
{
xx = xxx + x;
yy = yyy + y;
if ( xx == x && yy == y ) continue;
while (xx < 0) xx += 1000;
while (xx >= 1000) xx -= 1000;
while (yy < 0) yy += 1000;
while (yy >= 1000) yy -= 1000;
if (map_data(xx,yy) != WILD_WATER_DEEP_1 &&
map_data(xx,yy) != WILD_WATER_DEEP_2 &&
map_data(xx,yy) != WILD_WATER_1 &&
map_data(xx,yy) != WILD_WATER_2 &&
map_data(xx,yy) != WILD_AREA_LINK)
{
if (number_range(1,3) == 1)
set_map_data(xx, yy, WILD_WATER_2);
else
set_map_data(xx, yy, WILD_WATER_1);
}
}
}
return;
}