bool set_house( CHAR_DATA *ch, int vnum, bool apartment)
{
HOME_DATA *tmphome, *shome = NULL;
char buf[MAX_STRING_LENGTH];
ROOM_INDEX_DATA *location=NULL;
EXIT_DATA *pexit=NULL;
OBJ_INDEX_DATA *obj, *key = NULL;
if (!ch || !ch->name || vnum <= 0)
return FALSE;
CREATE(tmphome, HOME_DATA, 1);
tmphome->name = STRALLOC(ch->name);
tmphome->apartment = apartment;
tmphome->vnum[0] = vnum;
if (first_home)
{
bool found = FALSE;
for ( shome = first_home; shome; shome = shome->next )
{
if ( strcmp(tmphome->name, shome->name) < 0 )
{
INSERT( tmphome, shome, first_home, next, prev );
found = TRUE;
break;
}
}
if (!found)
LINK( tmphome, first_home, last_home, next, prev );
}
else
{
LINK( tmphome, first_home, last_home, next, prev );
}
update_house_list();
fwrite_house(tmphome);
if ((location = get_room_index(vnum)) == NULL)
return FALSE;
if (apartment)
sprintf( buf, "%s's Apartment", tmphome->name);
else
sprintf( buf, "%s's House", tmphome->name);
STRFREE( location->name );
location->name = STRALLOC( buf );
STRFREE( location->description );
if (apartment)
location->description = STRALLOC( "A room surrounds you, filled with the dirt and filth of previous tenants.\n\rA spray painted frame of the last tenant can be seen on the floor in a \n\rfar corner.\n\r");
else
location->description = STRALLOC( "This is your desc. You can edit this with HOUSE DESC.\n\r");
location->sector_type = 0;
#ifndef EXTENDED_ROOMS
SET_BIT( location->room_flags, ROOM_NO_SUMMON );
SET_BIT( location->room_flags, ROOM_NO_ASTRAL );
SET_BIT( location->room_flags, ROOM_INDOORS );
SET_BIT( location->room_flags, ROOM_SAFE );
#else
xSET_BIT( location->room_flags, ROOM_NO_SUMMON );
xSET_BIT( location->room_flags, ROOM_NO_ASTRAL );
xSET_BIT( location->room_flags, ROOM_INDOORS );
xSET_BIT( location->room_flags, ROOM_SAFE );
#endif
for ( pexit = location->first_exit; pexit; pexit = pexit->next )
{
SET_BIT( pexit->exit_info, EX_ISDOOR );
SET_BIT( pexit->exit_info, EX_CLOSED);
SET_BIT( pexit->exit_info, EX_LOCKED);
SET_BIT( pexit->exit_info, EX_NOPASSDOOR);
SET_BIT( pexit->exit_info, EX_PICKPROOF);
SET_BIT( pexit->exit_info, EX_BASHPROOF);
SET_BIT( pexit->exit_info, EX_NOMOB);
if (!apartment)
pexit->key = location->vnum;
if (pexit->rexit)
{
SET_BIT( pexit->rexit->exit_info, EX_ISDOOR );
SET_BIT( pexit->rexit->exit_info, EX_CLOSED);
SET_BIT( pexit->rexit->exit_info, EX_LOCKED);
SET_BIT( pexit->rexit->exit_info, EX_NOPASSDOOR);
SET_BIT( pexit->rexit->exit_info, EX_PICKPROOF);
SET_BIT( pexit->rexit->exit_info, EX_BASHPROOF);
SET_BIT( pexit->rexit->exit_info, EX_NOMOB);
if (!apartment)
pexit->rexit->key = location->vnum;
}
}
if (apartment)
return TRUE;
if ( (obj = get_obj_index(location->vnum)) != NULL)
{
delete_obj(obj);
save_residence(location);
}
sprintf( buf, "%s's House Key", tmphome->name);
key = make_object( location->vnum, 0, buf);
key->value[0] = location->vnum;
key->item_type = ITEM_TREASURE;
key->level = 1;
STRFREE( key->short_descr );
key->short_descr = STRALLOC( buf );
SET_BIT( key->wear_flags, ITEM_TAKE );
SET_BIT( key->wear_flags, ITEM_HOLD );
xREMOVE_BIT(key->extra_flags, ITEM_PROTOTYPE);
save_residence(location);
return TRUE;
}
|