/******************************************************************************
Snippet: Wilderness system (v1.0).
Author: Richard Woolcock (aka KaVir).
Date: 2nd September 1998.
******************************************************************************
File: wild_update.c
Purpose: Deals with the wilderness update routine.
******************************************************************************
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 auto_chopping args( ( CHAR_DATA *ch ) );
void auto_trim args( ( CHAR_DATA *ch ) );
void auto_fishing args( ( CHAR_DATA *ch ) );
void auto_digging args( ( CHAR_DATA *ch ) );
void auto_saw args( ( CHAR_DATA *ch ) );
void auto_build args( ( CHAR_DATA *ch ) );
void auto_mining args( ( CHAR_DATA *ch ) );
void auto_hoe args( ( CHAR_DATA *ch ) );
void auto_seed args( ( CHAR_DATA *ch ) );
void auto_scythe args( ( CHAR_DATA *ch ) );
void auto_road args( ( CHAR_DATA *ch ) );
void make_resource args( ( CHAR_DATA *ch, RESOURCE_TYPE resource ) );
/******************************************************************************
Global operations
******************************************************************************/
void wilderness_update( void )
{
CHAR_DATA *ch;
CHAR_DATA *ch_next;
static int loop_x = 0;
static int loop_y = 0;
int update_x = 0;
static int update_y = 0;
extern CHAR_DATA *first_wilderness;
for ( update_x = 0; update_x < 1000; update_x++ )
{
int xx = update_x;
int yy = update_y;
switch (map_data(update_x,update_y))
{
default: break;
case WILD_FIELD_SEEDED:
set_map_data(update_x, update_y, WILD_FIELD_WHEAT);
break;
case WILD_FOREST_1:
if (number_range(1,3) == 1)
set_map_data(update_x, update_y, WILD_FOREST_2);
break;
case WILD_FOREST_2:
if (number_range(1,3) == 1)
set_map_data(update_x, update_y, WILD_FOREST_3);
break;
case WILD_FOREST_3:
if (number_range(1,3) == 1)
set_map_data(update_x, update_y, WILD_FOREST_4);
break;
case WILD_FOREST_4:
if (number_range(1,3) == 1)
{
switch (number_range(1,4))
{
default:
case 1: if (++xx >= 1000) xx = 0; break;
case 2: if (--xx < 0) xx = 999; break;
case 3: if (++yy >= 1000) yy = 0; break;
case 4: if (--yy < 0) yy = 999; break;
}
switch (map_data(xx, yy))
{
default: break;
case WILD_PLAINS:
set_map_data(update_x, update_y, WILD_FOREST_1);
break;
case WILD_FOREST_1:
set_map_data(update_x, update_y, WILD_FOREST_2);
break;
case WILD_FOREST_2:
set_map_data(update_x, update_y, WILD_FOREST_3);
break;
case WILD_FOREST_3:
set_map_data(update_x, update_y, WILD_FOREST_4);
break;
}
}
break;
}
}
if ( ++update_y >= 1000 ) update_y = 0;
if (check_world_saving())
{
if ( map_changed(loop_x, loop_y) == TRUE )
{
wild_write( loop_x, loop_y );
set_map_changed(loop_x, loop_y, FALSE);
}
if ( ++loop_x >= 10 )
{
loop_x = 0;
if ( ++loop_y >= 10 )
{
loop_y = 0;
}
}
}
for ( ch = first_wilderness; ch != NULL; ch = ch_next )
{
ch_next = ch->next_wilderness;
if (ch->action == WA_NONE) continue;
switch (ch->action)
{
default: break;
case WA_CHOPPING_SWING:
case WA_CHOPPING_CHOP:
auto_chopping(ch);
break;
case WA_TRIM:
auto_trim(ch);
break;
case WA_FISHING_MENDING:
case WA_FISHING_CASTING:
case WA_FISHING_WAITING:
case WA_FISHING_REELING:
auto_fishing(ch);
break;
case WA_DIGGING_SWING:
case WA_DIGGING_CHOP:
auto_digging(ch);
break;
case WA_BUILDING_FOUNDATION:
case WA_BUILDING_FLOOR_1:
case WA_BUILDING_FLOOR_2:
case WA_BUILDING_FLOOR_3:
case WA_BUILDING_1:
case WA_BUILDING_2:
case WA_BUILDING_3:
case WA_BUILDING_ROOF_1:
case WA_BUILDING_ROOF_2:
case WA_BUILDING_ROOF_3:
case WA_BUILDING_COMPLETE:
auto_build(ch);
break;
case WA_SAW:
auto_saw(ch);
break;
case WA_MINING_SWING:
case WA_MINING_CHOP:
auto_mining(ch);
break;
case WA_HOE:
auto_hoe(ch);
break;
case WA_SEED:
auto_seed(ch);
break;
case WA_SCYTHE:
auto_scythe(ch);
break;
case WA_ROAD:
auto_road(ch);
break;
}
}
return;
}
/******************************************************************************
Local operations
******************************************************************************/
void auto_trim( CHAR_DATA *ch )
{
OBJ_DATA *knife;
OBJ_DATA *obj;
if ( ( obj = get_obj_here( ch, "tree" ) ) == NULL )
{
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
if ( obj->item_type != ITEM_RESOURCE || obj->value[1] != RESOURCE_TREE )
{
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
if ( ( knife = get_eq_char(ch, WEAR_WIELD) ) == NULL ||
knife->item_type != ITEM_WEAPON || knife->value[3] != 3 )
{
if ( ( knife = get_eq_char(ch, WEAR_HOLD) ) == NULL ||
knife->item_type != ITEM_WEAPON || knife->value[3] != 3 )
{
send_to_char("You need to hold a slashing weapon to trim trees.\n\r",ch);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
}
switch (number_range(1,3))
{
default:
case 1:
case 2:
act("You scrape $p along a tree, slashing off a branch.",ch,knife,NULL,TO_CHAR);
act("$n scrapes $p along a tree, slashing off a branch.",ch,knife,NULL,TO_ROOM);
break;
case 3:
act("You scrape $p along a tree, slashing off some leaves.",ch,knife,NULL,TO_CHAR);
act("$n scrapes $p along a tree, slashing off some leaves.",ch,knife,NULL,TO_ROOM);
ch->state += get_curr_dex(ch);
if (ch->state >= ch->quality)
{
act("You have finished trimming $p.",ch,obj,NULL,TO_CHAR);
act("$n has finished trimming $p.",ch,obj,NULL,TO_ROOM);
free_string(obj->name);
obj->name = str_dup("log");
free_string(obj->short_descr);
obj->short_descr = str_dup("a log");
free_string(obj->description);
obj->description = str_dup("A log is lying here.");
obj->weight -= 5;
obj->value[0] = obj->weight;
obj->value[1] = RESOURCE_LOG;
if (obj->weight < 20) obj->weight = 20;
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
}
break;
}
}
void auto_saw( CHAR_DATA *ch )
{
OBJ_DATA *saw;
OBJ_DATA *obj;
if ( ( obj = get_obj_here( ch, "log" ) ) == NULL )
{
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
if ( obj->item_type != ITEM_RESOURCE || obj->value[1] != RESOURCE_LOG )
{
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
if ( ( saw = get_eq_char(ch, WEAR_WIELD) ) == NULL ||
saw->item_type != ITEM_TOOL || saw->value[0] != TOOL_SAW )
{
if ( ( saw = get_eq_char(ch, WEAR_HOLD) ) == NULL ||
saw->item_type != ITEM_TOOL || saw->value[0] != TOOL_SAW )
{
send_to_char("You need to hold a saw to saw up logs.\n\r",ch);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
}
act("You run $p back and forth across the log.",ch,saw,NULL,TO_CHAR);
act("$n runs $p back and forth across the log.",ch,saw,NULL,TO_ROOM);
ch->state += get_curr_str(ch);
if (ch->state >= ch->quality)
{
act("You have finished sawing up $p.",ch,obj,NULL,TO_CHAR);
act("$n has finished sawing up $p.",ch,obj,NULL,TO_ROOM);
send_to_char("The wood has been added to rooms resources, and will remain as long as there\n\r",ch);
send_to_char("is someone in the room or the wood is used up.\n\r",ch);
ch->in_room->wood += obj->weight;
extract_obj(obj);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
}
}
void auto_road( CHAR_DATA *ch )
{
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 )
{
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
if ( obj->item_type != ITEM_RESOURCE || obj->value[1] != RESOURCE_ROCK )
{
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
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;
}
act("You place $p into the ground.",ch,obj,NULL,TO_CHAR);
act("$n places $p into the ground.",ch,obj,NULL,TO_ROOM);
ch->in_room->ground += obj->value[0];
extract_obj(obj);
if (ch->in_room->ground >= 100)
{
act("You have finished laying the road.",ch,NULL,NULL,TO_CHAR);
act("$n has finished laying the road.",ch,NULL,NULL,TO_ROOM);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
set_map_data(ch->x, ch->y, WILD_ROAD);
do_wsave(ch,"zone");
}
}
void auto_hoe( CHAR_DATA *ch )
{
OBJ_DATA *hoe;
if ( ( hoe = get_eq_char(ch, WEAR_WIELD) ) == NULL ||
hoe->item_type != ITEM_TOOL || hoe->value[0] != TOOL_HOE )
{
if ( ( hoe = get_eq_char(ch, WEAR_HOLD) ) == NULL ||
hoe->item_type != ITEM_TOOL || hoe->value[0] != TOOL_HOE )
{
send_to_char("You need to hold a hoe to hoe a field.\n\r",ch);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
}
act("You push $p through the soil.",ch,hoe,NULL,TO_CHAR);
act("$n pushes $p through the soil.",ch,hoe,NULL,TO_ROOM);
ch->in_room->ground += get_curr_str(ch);
if (ch->in_room->ground >= 100)
{
act("You have finished hoeing the field.",ch,NULL,NULL,TO_CHAR);
act("$n has finished hoeing the field.",ch,NULL,NULL,TO_ROOM);
set_map_data(ch->x, ch->y, WILD_FIELD_HOED);
ch->in_room->ground = 0;
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
}
}
void auto_seed( CHAR_DATA *ch )
{
OBJ_DATA *bag;
if ( ( bag = get_eq_char(ch, WEAR_WIELD) ) == NULL ||
bag->item_type != ITEM_TOOL || bag->value[0] != TOOL_SEEDS )
{
if ( ( bag = get_eq_char(ch, WEAR_HOLD) ) == NULL ||
bag->item_type != ITEM_TOOL || bag->value[0] != TOOL_SEEDS )
{
send_to_char("You need to hold some seeds to seed a field.\n\r",ch);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
}
act("You reach into $p and scatter a handful over the soil.",ch,bag,NULL,TO_CHAR);
act("$n reaches into $p and scatters a handful over the soil.",ch,bag,NULL,TO_ROOM);
ch->in_room->ground += number_range(1,3);
if (ch->in_room->ground >= 20)
{
act("You have finished seeding the field.",ch,NULL,NULL,TO_CHAR);
act("$n has finished seeding the field.",ch,NULL,NULL,TO_ROOM);
set_map_data(ch->x, ch->y, WILD_FIELD_SEEDED);
ch->in_room->ground = 0;
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
}
if (--bag->value[1] <= 0)
{
act("You throw away $p, having used all the seeds.",ch,bag,NULL,TO_CHAR);
act("$n throws away $p, having used all the seeds.",ch,bag,NULL,TO_ROOM);
extract_obj(bag);
}
}
void auto_scythe( CHAR_DATA *ch )
{
OBJ_DATA *scythe;
if ( ( scythe = get_eq_char(ch, WEAR_WIELD) ) == NULL ||
scythe->item_type != ITEM_TOOL || scythe->value[0] != TOOL_SCYTHE )
{
if ( ( scythe = get_eq_char(ch, WEAR_HOLD) ) == NULL ||
scythe->item_type != ITEM_TOOL || scythe->value[0] != TOOL_SCYTHE )
{
send_to_char("You need to hold a scythe to chop down wheat.\n\r",ch);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
}
act("You sweep $p through the wheat.",ch,scythe,NULL,TO_CHAR);
act("$n sweeps $p through the wheat.",ch,scythe,NULL,TO_ROOM);
ch->in_room->ground += number_range(1,3);
if (ch->in_room->ground >= 20)
{
act("You have finished scything the field.",ch,NULL,NULL,TO_CHAR);
act("$n has finished scything the field.",ch,NULL,NULL,TO_ROOM);
set_map_data(ch->x, ch->y, WILD_PLAINS);
do_wsave(ch,"zone");
ch->in_room->ground = 0;
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
make_resource(ch, RESOURCE_WHEAT);
}
}
void auto_mining( CHAR_DATA *ch )
{
OBJ_DATA *pick;
int improve_state;
if ( ( pick = get_eq_char(ch, WEAR_WIELD) ) == NULL ||
pick->item_type != ITEM_TOOL || pick->value[0] != TOOL_PICK )
{
if ( ( pick = get_eq_char(ch, WEAR_HOLD) ) == NULL ||
pick->item_type != ITEM_TOOL || pick->value[0] != TOOL_PICK )
{
send_to_char("You need to hold a pick to do some mining.\n\r",ch);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
}
switch (ch->action)
{
default:
case WA_MINING_SWING:
act("You tear $p out of the wall.",ch,pick,NULL,TO_CHAR);
act("$n tears $p out of the wall.",ch,pick,NULL,TO_ROOM);
ch->action = WA_MINING_CHOP;
improve_state = get_curr_str(ch);
ch->state += improve_state;
if (ch->state >= ch->quality)
{
switch (map_data(ch->x,ch->y))
{
default:
case WILD_MINE_EMPTY:
send_to_char("You realise that this mine has been exhausted of all resources.\n\r",ch);
break;
case WILD_MINE_STONE_1:
case WILD_MINE_STONE_2:
send_to_char("A large piece of rock falls out of the wall!\n\r",ch);
act("A large piece of rock falls out of the wall!",ch,NULL,NULL,TO_ROOM);
make_resource(ch, RESOURCE_ROCK);
break;
case WILD_MINE_IRON_1:
case WILD_MINE_IRON_2:
send_to_char("A large chunk of iron ore falls out of the wall!\n\r",ch);
act("A large chuck of iron ore falls out of the wall!",ch,NULL,NULL,TO_ROOM);
make_resource(ch, RESOURCE_IRON);
break;
case WILD_MINE_GOLD_1:
case WILD_MINE_GOLD_2:
send_to_char("A nugget of gold ore falls out of the wall!\n\r",ch);
act("A nugget of gold ore falls out of the wall!",ch,NULL,NULL,TO_ROOM);
make_resource(ch, RESOURCE_GOLD);
break;
case WILD_MINE_OIL_1:
case WILD_MINE_OIL_2:
send_to_char("A stream of oil pours out of the wall!\n\r",ch);
act("A stream of oil pours out of the wall!",ch,NULL,NULL,TO_ROOM);
make_resource(ch, RESOURCE_OIL);
break;
}
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
if (number_range(1,10) == 1) switch (map_data(ch->x,ch->y))
{
default: break;
case WILD_MINE_STONE_1:
case WILD_MINE_IRON_1:
case WILD_MINE_GOLD_1:
case WILD_MINE_OIL_1:
set_map_data(ch->x, ch->y, WILD_MINE_EMPTY);
break;
case WILD_MINE_STONE_2:
set_map_data(ch->x, ch->y, WILD_MINE_STONE_1);
break;
case WILD_MINE_IRON_2:
set_map_data(ch->x, ch->y, WILD_MINE_IRON_1);
break;
case WILD_MINE_GOLD_2:
set_map_data(ch->x, ch->y, WILD_MINE_GOLD_1);
break;
case WILD_MINE_OIL_2:
set_map_data(ch->x, ch->y, WILD_MINE_OIL_1);
break;
}
}
break;
case WA_MINING_CHOP:
act("You swing $p into the wall.",ch,pick,NULL,TO_CHAR);
act("$n swings $p into the wall.",ch,pick,NULL,TO_ROOM);
ch->action = WA_MINING_SWING;
break;
}
return;
}
void auto_build( CHAR_DATA *ch )
{
OBJ_DATA * hammer;
OBJ_DATA * obj;
int resources;
char map_pos;
int change;
if (ch->x >= 0 && ch->y >= 0)
map_pos = map_data(ch->x,ch->y);
else
{
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
if (ch->in_room->ground > 0)
{
send_to_char("Someone has already started building a road here.\n\r",ch);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
if (ch->in_room->build <= 0)
{
send_to_char("The building is complete.\n\r",ch);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
if (ch->in_room->wood <= 0)
{
send_to_char("There is no more wood left in the room.\n\r",ch);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
if ( ( hammer = get_eq_char(ch, WEAR_WIELD) ) == NULL ||
hammer->item_type != ITEM_TOOL || hammer->value[0] != TOOL_HAMMER )
{
if ( ( hammer = get_eq_char(ch, WEAR_HOLD) ) == NULL ||
hammer->item_type != ITEM_TOOL || hammer->value[0] != TOOL_HAMMER )
{
send_to_char("You need a hammer to build.\n\r",ch);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
}
if ( ( obj = get_eq_char(ch, WEAR_WIELD) ) == NULL ||
obj->item_type != ITEM_TOOL || obj->value[0] != TOOL_NAILS )
{
if ( ( obj = get_eq_char(ch, WEAR_HOLD) ) == NULL ||
obj->item_type != ITEM_TOOL || obj->value[0] != TOOL_NAILS )
{
send_to_char("You need some nails to build.\n\r",ch);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
}
switch (map_pos)
{
default:
case WILD_PLAINS: resources = 100; break;
case WILD_BUILDING_CONSTRUCTION: resources = 100; break;
case WILD_HUT:
case WILD_HUT_OWNED:
case WILD_HUT_LOCKED: resources = 200; break;
case WILD_CABIN:
case WILD_CABIN_OWNED:
case WILD_CABIN_LOCKED: resources = 400; break;
case WILD_COTTAGE:
case WILD_COTTAGE_OWNED:
case WILD_COTTAGE_LOCKED: resources = 600; break;
case WILD_MOUNTAINS_NONE:
case WILD_MOUNTAINS_STONE:
case WILD_MOUNTAINS_IRON:
case WILD_MOUNTAINS_GOLD:
case WILD_MOUNTAINS_OIL: resources = 50; break;
}
--ch->in_room->wood;
++ch->in_room->build;
change = ch->in_room->build * 100 / resources;
switch (ch->action)
{
case WA_BUILDING_FOUNDATION:
act("You pick up a wooden beam and push it into the ground.",ch,NULL,NULL,TO_CHAR);
act("$n picks up a wooden beam and pushes it into the ground.",ch,NULL,NULL,TO_ROOM);
if (map_pos == WILD_PLAINS)
{
set_map_data(ch->x, ch->y, WILD_BUILDING_CONSTRUCTION);
do_wsave(ch,"zone");
}
if (change >= 10) ch->action = WA_BUILDING_FLOOR_1;
break;
case WA_BUILDING_FLOOR_1:
act("You pick up a plank of wood and place it across the ground.",ch,NULL,NULL,TO_CHAR);
act("$n picks up a plank of wood and places it across the ground.",ch,NULL,NULL,TO_ROOM);
ch->action = WA_BUILDING_FLOOR_2;
break;
case WA_BUILDING_FLOOR_2:
act("You reach into $p and take out some nails.",ch,obj,NULL,TO_CHAR);
act("$n reaches into $p and takes out some nails.",ch,obj,NULL,TO_ROOM);
ch->action = WA_BUILDING_FLOOR_3;
break;
case WA_BUILDING_FLOOR_3:
act("You hammer some nails into the floor with $p.",ch,hammer,NULL,TO_CHAR);
act("$n hammers some nails into the floor with $p.",ch,hammer,NULL,TO_ROOM);
if (number_range(1,3) == 1) ch->action = WA_BUILDING_FLOOR_2;
if (change >= 20) ch->action = WA_BUILDING_1;
if (--obj->value[1] <= 0)
{
act("You throw away $p, having used all the nails.",ch,obj,NULL,TO_CHAR);
act("$n throws away $p, having used all the nails.",ch,obj,NULL,TO_ROOM);
extract_obj(obj);
}
break;
case WA_BUILDING_1:
act("You pick up a plank of wood and place it against the wooden structure.",ch,NULL,NULL,TO_CHAR);
act("$n picks up a plank of wood and places it against the wooden structure.",ch,NULL,NULL,TO_ROOM);
ch->action = WA_BUILDING_2;
break;
case WA_BUILDING_2:
act("You reach into $p and take out some nails.",ch,obj,NULL,TO_CHAR);
act("$n reaches into $p and takes out some nails.",ch,obj,NULL,TO_ROOM);
ch->action = WA_BUILDING_3;
break;
case WA_BUILDING_3:
act("You hammer some nails into the wall with $p.",ch,hammer,NULL,TO_CHAR);
act("$n hammers some nails into the wall with $p.",ch,hammer,NULL,TO_ROOM);
if (number_range(1,3) == 1) ch->action = WA_BUILDING_2;
if (change >= 90) ch->action = WA_BUILDING_ROOF_1;
if (--obj->value[1] <= 0)
{
act("You throw away $p, having used all the nails.",ch,obj,NULL,TO_CHAR);
act("$n throws away $p, having used all the nails.",ch,obj,NULL,TO_ROOM);
extract_obj(obj);
}
break;
case WA_BUILDING_ROOF_1:
act("You pick up a plank of wood and place it across the roof.",ch,NULL,NULL,TO_CHAR);
act("$n picks up a plank of wood and places it across the roof.",ch,NULL,NULL,TO_ROOM);
ch->action = WA_BUILDING_ROOF_2;
break;
case WA_BUILDING_ROOF_2:
act("You reach into $p and take out some nails.",ch,obj,NULL,TO_CHAR);
act("$n reaches into $p and takes out some nails.",ch,obj,NULL,TO_ROOM);
ch->action = WA_BUILDING_ROOF_3;
break;
case WA_BUILDING_ROOF_3:
act("You hammer some nails into the roof with $p.",ch,hammer,NULL,TO_CHAR);
act("$n hammers some nails into the roof with $p.",ch,hammer,NULL,TO_ROOM);
if (number_range(1,3) == 1) ch->action = WA_BUILDING_ROOF_2;
if (change >= 100) ch->action = WA_BUILDING_COMPLETE;
if (--obj->value[1] <= 0)
{
act("You throw away $p, having used all the nails.",ch,obj,NULL,TO_CHAR);
act("$n throws away $p, having used all the nails.",ch,obj,NULL,TO_ROOM);
extract_obj(obj);
}
break;
case WA_BUILDING_COMPLETE:
act("You hammer the final nail into the building!",ch,NULL,NULL,TO_CHAR);
act("$n hammers the final nail into the building!",ch,NULL,NULL,TO_ROOM);
if (--obj->value[1] <= 0)
{
act("You throw away $p, having used all the nails.",ch,obj,NULL,TO_CHAR);
act("$n throws away $p, having used all the nails.",ch,obj,NULL,TO_ROOM);
extract_obj(obj);
}
break;
}
if ( ch->action != WA_BUILDING_COMPLETE )
{
return;
}
ch->in_room->build = 0;
switch (map_pos)
{
default:
case WILD_PLAINS:
case WILD_BUILDING_CONSTRUCTION:
set_map_data(ch->x, ch->y, WILD_HUT);
break;
case WILD_HUT:
set_map_data(ch->x, ch->y, WILD_CABIN);
break;
case WILD_HUT_OWNED:
set_map_data(ch->x, ch->y, WILD_CABIN_OWNED);
break;
case WILD_HUT_LOCKED:
set_map_data(ch->x, ch->y, WILD_CABIN_LOCKED);
break;
case WILD_CABIN:
set_map_data(ch->x, ch->y, WILD_COTTAGE);
break;
case WILD_CABIN_OWNED:
set_map_data(ch->x, ch->y, WILD_COTTAGE_OWNED);
break;
case WILD_CABIN_LOCKED:
set_map_data(ch->x, ch->y, WILD_COTTAGE_LOCKED);
break;
case WILD_COTTAGE:
set_map_data(ch->x, ch->y, WILD_HOUSE);
break;
case WILD_COTTAGE_OWNED:
set_map_data(ch->x, ch->y, WILD_HOUSE_OWNED);
break;
case WILD_COTTAGE_LOCKED:
set_map_data(ch->x, ch->y, WILD_HOUSE_LOCKED);
break;
case WILD_MOUNTAINS_NONE:
set_map_data(ch->x, ch->y, WILD_MINE_STRUCTURE_EMPTY);
break;
case WILD_MOUNTAINS_STONE:
set_map_data(ch->x, ch->y, WILD_MINE_STRUCTURE_STONE);
break;
case WILD_MOUNTAINS_IRON:
set_map_data(ch->x, ch->y, WILD_MINE_STRUCTURE_IRON);
break;
case WILD_MOUNTAINS_GOLD:
set_map_data(ch->x, ch->y, WILD_MINE_STRUCTURE_GOLD);
break;
case WILD_MOUNTAINS_OIL:
set_map_data(ch->x, ch->y, WILD_MINE_STRUCTURE_OIL);
break;
}
do_wsave(ch,"zone");
return;
}
void auto_chopping( CHAR_DATA *ch )
{
OBJ_DATA *axe;
bool in_forest = FALSE;
int improve_state = 0;
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("There are no trees left to chop down!\n\r",ch);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
if ( ( axe = get_eq_char(ch, WEAR_WIELD) ) == NULL ||
axe->item_type != ITEM_WEAPON || axe->value[3] != 1 )
{
if ( ( axe = get_eq_char(ch, WEAR_HOLD) ) == NULL ||
axe->item_type != ITEM_WEAPON || axe->value[3] != 1 )
{
send_to_char("You need to hold a slicing weapon to chop down trees.\n\r",ch);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
}
switch (ch->action)
{
default:
case WA_CHOPPING_SWING:
act("You swing back $p.",ch,axe,NULL,TO_CHAR);
act("$n swings back $p.",ch,axe,NULL,TO_ROOM);
ch->action = WA_CHOPPING_CHOP;
break;
case WA_CHOPPING_CHOP:
act("You swing $p into a tree.",ch,axe,NULL,TO_CHAR);
act("$n swings $p into a tree.",ch,axe,NULL,TO_ROOM);
ch->action = WA_CHOPPING_SWING;
improve_state = get_curr_str(ch);
ch->state += improve_state;
if (ch->state >= ch->quality)
{
send_to_char("The tree falls to the ground with a loud crash!\n\r",ch);
act("The tree falls to the ground with a loud crash!",ch,NULL,NULL,TO_ROOM);
make_resource(ch, RESOURCE_TREE);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
switch (map_data(ch->x,ch->y))
{
default: break;
case WILD_FOREST_1:
set_map_data(ch->x, ch->y, WILD_PLAINS);
do_wsave(ch,"zone");
break;
case WILD_FOREST_2:
set_map_data(ch->x, ch->y, WILD_FOREST_1);
do_wsave(ch,"zone");
break;
case WILD_FOREST_3:
set_map_data(ch->x, ch->y, WILD_FOREST_2);
do_wsave(ch,"zone");
break;
case WILD_FOREST_4:
set_map_data(ch->x, ch->y, WILD_FOREST_3);
do_wsave(ch,"zone");
break;
}
}
else if (ch->state >= (ch->quality * 0.5))
{
send_to_char("The tree shakes violently under the impact of your blow!\n\r",ch);
act("The tree shakes violently under the impact of $n's blow!",ch,NULL,NULL,TO_ROOM);
}
break;
}
return;
}
void auto_fishing( CHAR_DATA *ch )
{
OBJ_DATA *rod;
OBJ_DATA *obj;
if ( ( rod = get_eq_char(ch, WEAR_WIELD) ) == NULL ||
rod->item_type != ITEM_TOOL || rod->value[0] != TOOL_FISHING_ROD )
{
if ( ( rod = get_eq_char(ch, WEAR_HOLD) ) == NULL ||
rod->item_type != ITEM_TOOL || rod->value[0] != TOOL_FISHING_ROD )
{
send_to_char("You need to hold a fishing rod to catch fish.\n\r",ch);
ch->action = WA_NONE;
ch->state = 0;
return;
}
}
if (ch->action == WA_FISHING_MENDING)
{
act("You deftly tie a line and hook onto $p.",ch,rod,NULL,TO_CHAR);
act("$n deftly ties a line and hook onto $p.",ch,rod,NULL,TO_ROOM);
ch->action = WA_FISHING_CASTING;
return;
}
if (ch->action == WA_FISHING_CASTING)
{
act("You draw back your arm and cast $p out into the water.",ch,rod,NULL,TO_CHAR);
act("$n draws back $s arm and casts $p out into the water.",ch,rod,NULL,TO_ROOM);
ch->action = WA_FISHING_WAITING;
return;
}
if (ch->action == WA_FISHING_WAITING) switch (number_range(1,5))
{
default: break;
case 1:
act("You reel $p back in to make another cast.",ch,rod,NULL,TO_CHAR);
act("$n reels $p back in.",ch,rod,NULL,TO_ROOM);
ch->action = WA_FISHING_CASTING;
break;
case 2:
act("You feel a slight tugging on your fishing line.",ch,rod,NULL,TO_CHAR);
break;
case 3:
act("You start to reel in $p as you feel a fish bite the hook!",ch,rod,NULL,TO_CHAR);
act("$n starts reeling in $p!",ch,rod,NULL,TO_ROOM);
ch->action = WA_FISHING_REELING;
ch->quality = number_range(3,5);
break;
}
else switch (number_range(1,10))
{
default: break;
case 1:
act("You feel the line go taunt and then snap!",ch,rod,NULL,TO_CHAR);
act("$n jerks back $p and the line snaps!",ch,rod,NULL,TO_ROOM);
ch->action = WA_FISHING_MENDING;
break;
case 2:
act("You feel the line go slack as the fish breaks free.",ch,rod,NULL,TO_CHAR);
act("$n's fishing line goes slack.",ch,rod,NULL,TO_ROOM);
ch->action = WA_FISHING_CASTING;
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
act("You slowly reel in the line.",ch,rod,NULL,TO_CHAR);
act("$n slowly reels in $s fishing line.",ch,rod,NULL,TO_ROOM);
ch->state++;
if (ch->state >= ch->quality)
{
obj = create_object( get_obj_index( OBJ_VNUM_FISH ), 0 );
obj_to_char(obj,ch);
act("You pluck $p off your fishing hook.",ch,obj,NULL,TO_CHAR);
act("$n plucks $p off $s fishing hook.",ch,obj,NULL,TO_ROOM);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
}
break;
}
}
void auto_digging( CHAR_DATA *ch )
{
OBJ_DATA *shovel;
bool in_mine = FALSE;
int improve_state = 0;
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);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
return;
}
if ( ( shovel = get_eq_char(ch, WEAR_WIELD) ) == NULL ||
shovel->item_type != ITEM_TOOL || shovel->value[0] != TOOL_SHOVEL )
{
if ( ( shovel = get_eq_char(ch, WEAR_HOLD) ) == NULL ||
shovel->item_type != ITEM_TOOL || shovel->value[0] != TOOL_SHOVEL )
{
send_to_char("You need to hold a shovel to dig.\n\r",ch);
ch->action = WA_NONE;
ch->state = 0;
return;
}
}
switch (ch->action)
{
default:
case WA_DIGGING_SWING:
act("You swing back $p, throwing soil behind you.",ch,shovel,NULL,TO_CHAR);
act("$n swings back $p, throwing soil behind $m.",ch,shovel,NULL,TO_ROOM);
ch->action = WA_DIGGING_CHOP;
improve_state = get_curr_str(ch);
ch->in_room->wood += improve_state;
if (ch->in_room->wood >= 500)
{
ch->in_room->wood = 0;
send_to_char("The mine is complete!\n\r",ch);
act("The mine is complete!",ch,NULL,NULL,TO_ROOM);
ch->action = WA_NONE;
ch->state = 0;
ch->quality = 0;
switch (map_data(ch->x,ch->y))
{
default: break;
case WILD_MINE_STRUCTURE_EMPTY:
set_map_data(ch->x, ch->y, WILD_MINE_EMPTY);
break;
case WILD_MINE_STRUCTURE_STONE:
set_map_data(ch->x, ch->y, WILD_MINE_STONE_2);
break;
case WILD_MINE_STRUCTURE_IRON:
set_map_data(ch->x, ch->y, WILD_MINE_IRON_2);
break;
case WILD_MINE_STRUCTURE_GOLD:
set_map_data(ch->x, ch->y, WILD_MINE_GOLD_2);
break;
case WILD_MINE_STRUCTURE_OIL:
set_map_data(ch->x, ch->y, WILD_MINE_OIL_2);
break;
}
}
break;
case WA_DIGGING_CHOP:
act("You plunge $p into the ground.",ch,shovel,NULL,TO_CHAR);
act("$n plunges $p into the ground.",ch,shovel,NULL,TO_ROOM);
ch->action = WA_DIGGING_SWING;
break;
}
return;
}
/* Creates a resource of the specified type. */
void make_resource( CHAR_DATA *ch, RESOURCE_TYPE resource )
{
char resource_name [MAX_INPUT_LENGTH];
char resource_short [MAX_INPUT_LENGTH];
char resource_long [MAX_INPUT_LENGTH];
OBJ_DATA *obj;
if ( ch->in_room == NULL )
{
return;
}
switch (resource)
{
default:
case RESOURCE_TREE:
strcpy(resource_name,"tree");
strcpy(resource_short,"a tree");
strcpy(resource_long,"A chopped down tree is lying here.");
break;
case RESOURCE_LOG:
strcpy(resource_name,"log");
strcpy(resource_short,"a log");
strcpy(resource_long,"A log is lying here.");
break;
case RESOURCE_ROCK:
strcpy(resource_name,"rock stone");
strcpy(resource_short,"a piece of rock");
strcpy(resource_long,"A piece of rock is lying here.");
break;
case RESOURCE_IRON:
strcpy(resource_name,"iron ore");
strcpy(resource_short,"a chunk of iron ore");
strcpy(resource_long,"A chunk of iron ore is lying here.");
break;
case RESOURCE_GOLD:
strcpy(resource_name,"gold nugget");
strcpy(resource_short,"a gold nugget");
strcpy(resource_long,"A gold nugget is lying here.");
break;
case RESOURCE_OIL:
strcpy(resource_name,"oil");
strcpy(resource_short,"a pool of oil");
strcpy(resource_long,"A pool of oil is lying here.");
break;
case RESOURCE_WHEAT:
strcpy(resource_name,"bundle wheat");
strcpy(resource_short,"a bundle of wheat");
strcpy(resource_long,"A bundle of wheat is lying here.");
break;
}
obj = create_object( get_obj_index( OBJ_VNUM_PROTOPLASM ), 0 );
obj->item_type = ITEM_RESOURCE;
obj->value[0] = ch->quality;
obj->value[1] = (sh_int) resource;
obj->wear_flags = ITEM_TAKE;
obj->weight = ch->quality;
free_string(obj->name);
obj->name = str_dup(resource_name);
free_string(obj->short_descr);
obj->short_descr = str_dup(resource_short);
free_string(obj->description);
obj->description = str_dup(resource_long);
if (resource == RESOURCE_OIL)
{
obj->item_type = ITEM_FOUNTAIN;
obj->value[0] = 1;
obj->value[1] = ch->quality;
obj->value[2] = 15; /* Oil */
obj->wear_flags = 0;
}
obj_to_room(obj, ch->in_room);
return;
}