#if defined(macintosh)
#include <types.h>
#include <time.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <stddef.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>
#include "merc.h"
#include "interp.h"
#include "recycle.h"
#include "tables.h"
#include "lookup.h"
#include "olc.h"
#define MAX_ROW 100
#define COLUMNS 6
#define MAX_SHOW_VNUM 99 /* show only 1 - 100*100 */
#define NUL '\0'
/***********************************************************************
* LOAD PLAYERS *
************************************************************************/
void do_pload( CHAR_DATA *ch, char *argument )
{
DESCRIPTOR_DATA d;
bool isChar = FALSE;
char name[MAX_INPUT_LENGTH];
if (argument[0] == '\0')
{
send_to_char("Load who?\n\r", ch);
return;
}
argument[0] = UPPER(argument[0]);
argument = one_argument(argument, name);
/* Dont want to load a second copy of a player who's allready online! */
if ( get_char_world( ch, name ) != NULL )
{
send_to_char( "That person is allready connected!\n\r", ch );
return;
}
isChar = load_char_obj(&d, name); /* char pfile exists? */
if (!isChar)
{
send_to_char("Load Who? Are you sure? I cant seem to find them.\n\r", ch);
return;
}
d.character->desc = NULL;
d.character->next = char_list;
char_list = d.character;
d.connected = CON_PLAYING;
reset_char(d.character);
/* bring player to imm */
if ( d.character->in_room != NULL )
{
char_to_room( d.character, ch->in_room); /* put in room imm is in */
}
act( "$n has pulled $N from the pattern!",
ch, NULL, d.character, TO_ROOM );
if (d.character->pet != NULL)
{
char_to_room(d.character->pet,d.character->in_room);
act("$n has entered the game.",d.character->pet,NULL,NULL,TO_ROOM);
}
}
/** Function: do_punload
* Descr : Returns a player, previously 'ploaded' back to the void from
* whence they came. This does not work if the player is actually
* connected.
* Returns : (void)
* Syntax : punload (who)
* Written : v1.0 12/97
* Author : Gary McNickle <gary@dharvest.com>
*/
void do_punload( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char who[MAX_INPUT_LENGTH];
argument = one_argument(argument, who);
if ( ( victim = get_char_world( ch, who ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
/** Person is legitametly logged on... was not ploaded.
*/
if (victim->desc != NULL)
{
send_to_char("I dont think that would be a good idea...\n\r", ch);
return;
}
if (victim->was_in_room != NULL) /* return player and pet to orig room */
{
char_to_room(victim, victim->was_in_room);
if (victim->pet != NULL)
char_to_room(victim->pet, victim->was_in_room);
}
save_char_obj(victim);
do_quit(victim,"");
act("$n has released $N back to the Pattern.",
ch, NULL, victim, TO_ROOM);
}
/********************************************************************************
* VAPORIZE A CHARACTER *
********************************************************************************/
void do_vape( CHAR_DATA *ch, char *argument)
{
char strsave[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Syntax: pwipe <name> \n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if (IS_NPC(victim))
{
send_to_char( "You can only pwipe players!\n\r", ch);
return;
}
if (victim == ch)
{
send_to_char( "If you want to pwipe your self type delete!\n\r", ch);
return;
}
if ( is_name( victim->name,"Raynek")) return;
sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( victim->name ) );
stop_fighting(victim,TRUE);
sprintf( buf,"{w%s {Dflies down from the heavens.{x",ch->name);
do_echo( ch,buf);
sprintf( buf,"{w%s {Dlooks at {w%s{D, smiles and shoves a dagger into {w%s's
{Dback.{x",ch->name,victim->name,victim->name);
do_echo( ch,buf);
sprintf( buf,"{DYou watch as {w%s's{D heart flies out its chest... {R H{rA{RH{rA{RH{rA{RH{rA{D
%s{x",victim->name,victim->name);
do_echo( ch,buf);
sprintf( buf,"{Dhas been slain{w!!!!{x");
do_echo( ch,buf);
do_fdelete(victim,"");
return;
}
/***********************************************************************************************
* FORCE A CHARACTER TO DELETE *
**********************************************************************************************/
void do_fdelete( CHAR_DATA *ch, char *argument)
{
char strsave[MAX_INPUT_LENGTH];
if (IS_NPC(ch))
return;
if ( is_name( ch->name,"Raynek")) return;
sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( ch->name ) );
stop_fighting(ch,TRUE);
if (ch->level > HERO)
{
}
do_delete(ch,"");
do_delete(ch,"");
unlink(strsave);
return;
}
CHAR_DATA *get_char( CHAR_DATA *ch )
{
if ( !ch->pcdata )
return ch->desc->original;
else
return ch;
}
/**************************************************************************************************
* alinks chacks for exits in an area *
**************************************************************************************************/
void do_alinks(CHAR_DATA *ch, char *argument)
{
FILE *fp;
BUFFER *buffer;
AREA_DATA *parea;
EXIT_DATA *pexit;
ROOM_INDEX_DATA *to_room;
ROOM_INDEX_DATA *from_room;
char buf[MAX_STRING_LENGTH];
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
int vnum = 0;
int iHash, door;
bool found = FALSE;
/* To provide a convenient way to translate door numbers to words */
static char * const dir_name[] = {"north","east","south","west","up","down"};
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
/* First, the 'all' option */
if (!str_cmp(arg1,"all"))
{
/*
* If a filename was provided, try to open it for writing
* If that fails, just spit output to the screen.
*/
if (arg2[0] != '\0')
{
fclose(fpReserve);
if( (fp = fopen(arg2, "w")) == NULL)
{
send_to_char("Error opening file, printing to screen.\n\r",ch);
fclose(fp);
fpReserve = fopen(NULL_FILE, "r");
fp = NULL;
}
}
else
fp = NULL;
/* Open a buffer if it's to be output to the screen */
if (!fp)
buffer = new_buf();
/* Loop through all the areas */
for (parea = area_first; parea != NULL; parea = parea->next)
{
/* First things, add area name and vnums to the buffer */
sprintf(buf, "*** %s (%d to %d) ***\n\r",
parea->name, parea->min_vnum, parea->max_vnum);
fp ? fprintf(fp, buf) : add_buf(buffer, buf);
/* Now let's start looping through all the rooms. */
found = FALSE;
for(iHash = 0; iHash < MAX_KEY_HASH; iHash++)
{
for( from_room = room_index_hash[iHash];
from_room != NULL;
from_room = from_room->next )
{
/*
* If the room isn't in the current area,
* then skip it, not interested.
*/
if ( from_room->vnum < parea->min_vnum
|| from_room->vnum > parea->max_vnum )
continue;
/* Aha, room is in the area, lets check all directions */
for (door = 0; door < 5; door++)
{
/* Does an exit exist in this direction? */
if( (pexit = from_room->exit[door]) != NULL )
{
to_room = pexit->u1.to_room;
/*
* If the exit links to a different area
* then add it to the buffer/file
*/
if( to_room != NULL
&& (to_room->vnum < parea->min_vnum
|| to_room->vnum > parea->max_vnum) )
{
found = TRUE;
sprintf(buf, " (%d) links %s to %s (%d)\n\r",
from_room->vnum, dir_name[door],
to_room->area->name, to_room->vnum);
/* Add to either buffer or file */
if(fp == NULL)
add_buf(buffer, buf);
else
fprintf(fp, buf);
}
}
}
}
}
/* Informative message for areas with no external links */
if (!found)
add_buf(buffer, " No links to other areas found.\n\r");
}
/* Send the buffer to the player */
if (!fp)
{
page_to_char(buf_string(buffer), ch);
free_buf(buffer);
}
/* Or just clean up file stuff */
else
{
fclose(fp);
fpReserve = fopen(NULL_FILE, "r");
}
return;
}
/* No argument, let's grab the char's current area */
if(arg1[0] == '\0')
{
parea = ch->in_room ? ch->in_room->area : NULL;
/* In case something wierd is going on, bail */
if (parea == NULL)
{
send_to_char("You aren't in an area right now, funky.\n\r",ch);
return;
}
}
/* Room vnum provided, so lets go find the area it belongs to */
else if(is_number(arg1))
{
vnum = atoi(arg1);
/* Hah! No funny vnums! I saw you trying to break it... */
if (vnum <= 0 || vnum > 65536)
{
send_to_char("The vnum must be between 1 and 65536.\n\r",ch);
return;
}
/* Search the areas for the appropriate vnum range */
for (parea = area_first; parea != NULL; parea = parea->next)
{
if(vnum >= parea->min_vnum && vnum <= parea->max_vnum)
break;
}
/* Whoops, vnum not contained in any area */
if (parea == NULL)
{
send_to_char("There is no area containing that vnum.\n\r",ch);
return;
}
}
/* Non-number argument, must be trying for an area name */
else
{
/* Loop the areas, compare the name to argument */
for(parea = area_first; parea != NULL; parea = parea->next)
{
if(!str_prefix(arg1, parea->name))
break;
}
/* Sorry chum, you picked a goofy name */
if (parea == NULL)
{
send_to_char("There is no such area.\n\r",ch);
return;
}
}
/* Just like in all, trying to fix up the file if provided */
if (arg2[0] != '\0')
{
fclose(fpReserve);
if( (fp = fopen(arg2, "w")) == NULL)
{
send_to_char("Error opening file, printing to screen.\n\r",ch);
fclose(fp);
fpReserve = fopen(NULL_FILE, "r");
fp = NULL;
}
}
else
fp = NULL;
/* And we loop the rooms */
for(iHash = 0; iHash < MAX_KEY_HASH; iHash++)
{
for( from_room = room_index_hash[iHash];
from_room != NULL;
from_room = from_room->next )
{
/* Gotta make sure the room belongs to the desired area */
if ( from_room->vnum < parea->min_vnum
|| from_room->vnum > parea->max_vnum )
continue;
/* Room's good, let's check all the directions for exits */
for (door = 0; door < 5; door++)
{
if( (pexit = from_room->exit[door]) != NULL )
{
to_room = pexit->u1.to_room;
/* Found an exit, does it lead to a different area? */
if( to_room != NULL
&& (to_room->vnum < parea->min_vnum
|| to_room->vnum > parea->max_vnum) )
{
found = TRUE;
sprintf(buf, "%s (%d) links %s to %s (%d)\n\r",
parea->name, from_room->vnum, dir_name[door],
to_room->area->name, to_room->vnum);
/* File or buffer output? */
if(fp == NULL)
send_to_char(buf, ch);
else
fprintf(fp, buf);
}
}
}
}
}
/* Informative message telling you it's not externally linked */
if(!found)
{
send_to_char("No links to other areas found.\n\r",ch);
/* Let's just delete the file if no links found */
if (fp)
unlink(arg2);
return;
}
/* Close up and clean up file stuff */
if(fp)
{
fclose(fp);
fpReserve = fopen(NULL_FILE, "r");
}
}
/****************************************************************************/
void do_fvlist (CHAR_DATA *ch, char *argument)
{
int i,j;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
char *string;
string = one_argument(argument,arg);
if (arg[0] == '\0')
{
send_to_char("Syntax:\n\r",ch);
send_to_char(" fvlist obj\n\r",ch);
send_to_char(" fvlist mob\n\r",ch);
send_to_char(" fvlist room\n\r",ch);
return;
}
j=1;
if (!str_cmp(arg,"obj"))
{
sprintf(buf,"{WFree {C%s{W vnum listing for area {C%s{x\n\r",arg,
ch->in_room->area->name);
send_to_char ( buf, ch );
sprintf(buf,"{Y=============================================================================={C\n\r");
send_to_char ( buf, ch );
for (i = ch->in_room->area->min_vnum; i <= ch->in_room->area->max_vnum; i++) {
if (get_obj_index(i) == NULL) {
sprintf(buf,"%8d, ",i);
send_to_char ( buf, ch );
if (j == COLUMNS) {
send_to_char("\n\r",ch);
j=0;
}
j++;
}
}
send_to_char("{x\n\r",ch);
return;
}
if (!str_cmp(arg,"mob"))
{
sprintf(buf,"{WFree {C%s {Wvnum listing for area {C%s{x\n\r",arg,
ch->in_room->area->name);
send_to_char ( buf, ch );
sprintf(buf,"{Y=============================================================================={C\n\r");
send_to_char ( buf, ch );
for (i = ch->in_room->area->min_vnum; i <= ch->in_room->area->max_vnum; i++) {
if (get_mob_index(i) == NULL) {
sprintf(buf,"%8d, ",i);
send_to_char ( buf, ch );
if (j == COLUMNS) {
send_to_char("\n\r",ch);
j=0;
}
else j++;
}
}
send_to_char("{x\n\r",ch);
return;
}
if (!str_cmp(arg,"room"))
{
sprintf(buf,"{WFree {C%s {Wvnum listing for area {C%s{x\n\r",arg,
ch->in_room->area->name);
send_to_char ( buf, ch );
sprintf(buf,"{Y=============================================================================={C\n\r");
send_to_char ( buf, ch );
for (i = ch->in_room->area->min_vnum; i <= ch->in_room->area->max_vnum; i++) {
if (get_room_index(i) == NULL) {
sprintf(buf,"%8d, ",i);
send_to_char ( buf, ch );
if (j == COLUMNS) {
send_to_char("\n\r",ch);
j=0;
}
else j++;
}
}
send_to_char("{x\n\r",ch);
return;
}
send_to_char("WHAT??? \n\r",ch);
send_to_char("Syntax:\n\r",ch);
send_to_char(" fvlist obj\n\r",ch);
send_to_char(" fvlist mob\n\r",ch);
send_to_char(" fvlist room\n\r",ch);
}