/***************************************************************************
* 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. *
* *
* 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'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
/***************************************************************************
* ROM 2.4 is copyright 1993-1995 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@pacinfo.com) *
* Gabrielle Taylor (gtaylor@pacinfo.com) *
* Brian Moore (rom@rom.efn.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
***************************************************************************/
/***************************************************************************
* ROT 1.4 is copyright 1996-1997 by Russ Walsh *
* By using this code, you have agreed to follow the terms of the *
* ROT license, in the file doc/rot.license *
***************************************************************************/
#if defined(macintosh)
#include <types.h>
#include <time.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "merc.h"
#include "recycle.h"
#include "tables.h"
#include "lookup.h"
#include "interp.h"
#include "magic.h"
void do_qspell(CHAR_DATA *ch, char *argument)
{
CHAR_DATA *vch;
char arg[MAX_INPUT_LENGTH];
DESCRIPTOR_DATA *d;
argument = one_argument(argument,arg);
if (IS_NPC(ch))
return;
if (arg[0] == '\0')
{
send_to_char("Spellup whom?\n\r",ch);
return;
}
if ( !str_cmp( arg, "all" ) && (ch->level >= SQUIRE))
{
for ( d = descriptor_list; d != NULL; d = d->next )
{
if ( d->connected == CON_PLAYING
&& d->character != ch
&& d->character->in_room != NULL
&& ch->level >= d->character->ghost_level
&& can_see( ch, d->character ) )
{
char buf[MAX_STRING_LENGTH];
sprintf( buf, "%s %s", d->character->name, arg );
do_function( ch, &do_qspell, buf );
}
}
return;
}
if (str_cmp("room",arg))
{ if ((vch = get_char_world(ch,arg)) == NULL)
{ send_to_char("They aren't here.\n\r",ch);
return; }}
else
vch = ch;
if (!str_cmp("room",arg))
for (vch = ch->in_room->people;vch;vch = vch->next_in_room)
{ if (vch == ch)
continue;
if (IS_NPC(vch))
continue;
spell_shockshield(skill_lookup("shockshield"),ch->level,ch,vch,TARGET_CHAR);
spell_fireshield(skill_lookup("fireshield"),ch->level,ch,vch,TARGET_CHAR);
spell_iceshield(skill_lookup("iceshield"),ch->level,ch,vch,TARGET_CHAR);
spell_shield(skill_lookup("shield"),ch->level,ch,vch,TARGET_CHAR);
spell_armor(skill_lookup("armor"),ch->level,ch,vch,TARGET_CHAR);
spell_sanctuary(skill_lookup("sanctuary"),ch->level,ch,vch,TARGET_CHAR);
spell_fly(skill_lookup("fly"),ch->level,ch,vch,TARGET_CHAR);
spell_frenzy(skill_lookup("frenzy"),ch->level,ch,vch,TARGET_CHAR);
spell_giant_strength(skill_lookup("giant strength"),ch->level,ch,vch,TARGET_CHAR);
spell_bless(skill_lookup("bless"),ch->level,ch,vch,TARGET_CHAR);
spell_haste(skill_lookup("haste"),ch->level,ch,vch,TARGET_CHAR);
}
else
{ spell_shockshield(skill_lookup("shockshield"),ch->level,ch,vch,TARGET_CHAR);
spell_fireshield(skill_lookup("fireshield"),ch->level,ch,vch,TARGET_CHAR);
spell_iceshield(skill_lookup("iceshield"),ch->level,ch,vch,TARGET_CHAR);
spell_shield(skill_lookup("shield"),ch->level,ch,vch,TARGET_CHAR);
spell_armor(skill_lookup("armor"),ch->level,ch,vch,TARGET_CHAR);
spell_sanctuary(skill_lookup("sanctuary"),ch->level,ch,vch,TARGET_CHAR);
spell_fly(skill_lookup("fly"),ch->level,ch,vch,TARGET_CHAR);
spell_frenzy(skill_lookup("frenzy"),ch->level,ch,vch,TARGET_CHAR);
spell_giant_strength(skill_lookup("giant strength"),ch->level,ch,vch,TARGET_CHAR);
spell_bless(skill_lookup("bless"),ch->level,ch,vch,TARGET_CHAR);
spell_haste(skill_lookup("haste"),ch->level,ch,vch,TARGET_CHAR);
}
return;
}
void do_arealinks(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;
buffer = new_buf ();
/* 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 < 6; 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 < 6; 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");
}
}