/*************************************************************************** * 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","northeast","southeast","southwest" "northwest"}; 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 < 10; 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 < 10; 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"); } }