/*************************************************************************** * 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 * ***************************************************************************/ /*************************************************************************** * * * * * DRM 1.0a is copyright 2000-2002 by Joshua Chance Blackwell * * By using this code, you have agreed to follow the terms of the * * DRM license, in the file doc/DRM.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" /* random room generation procedure */ ROOM_INDEX_DATA *get_random_room ( CHAR_DATA * ch ) { ROOM_INDEX_DATA *room; for ( ;; ) { room = get_room_index ( number_range ( 0, 65535 ) ); if ( room != NULL ) if ( can_see_room ( ch, room ) && ( !( strstr ( room->area->builders, "Unlinked" ) ) ) && !room_is_private ( ch, room ) && !IS_SET ( room->room_flags, ROOM_PRIVATE ) && !IS_SET ( room->room_flags, ROOM_SOLITARY ) && !IS_SET ( room->room_flags, ROOM_LOCKED ) && !IS_SET ( room->room_flags, ROOM_SAFE ) && ( IS_NPC ( ch ) || IS_SET ( ch-> act, ACT_AGGRESSIVE ) || !IS_SET ( room-> room_flags, ROOM_LAW ) ) ) break; } return room; } /* RT Enter portals */ CH_CMD ( do_enter ) { ROOM_INDEX_DATA *location; if ( ch->fighting != NULL ) return; /* nifty portal stuff */ if ( argument[0] != '\0' ) { ROOM_INDEX_DATA *old_room; OBJ_DATA *portal; CHAR_DATA *fch, *fch_next; old_room = ch->in_room; portal = get_obj_list ( ch, argument, ch->in_room->contents ); if ( portal == NULL ) { send_to_char ( "You don't see that here.\n\r", ch ); return; } if ( portal->item_type != ITEM_PORTAL || ( IS_SET ( portal->value[1], EX_CLOSED ) && !IS_TRUSTED ( ch, KNIGHT ) ) ) { send_to_char ( "You can't seem to find a way in.\n\r", ch ); return; } if ( !IS_TRUSTED ( ch, KNIGHT ) && !IS_SET ( portal->value[2], GATE_NOCURSE ) && ( IS_AFFECTED ( ch, AFF_CURSE ) || IS_SET ( old_room->room_flags, ROOM_NO_RECALL ) ) ) { send_to_char ( "Something prevents you from leaving...\n\r", ch ); return; } if ( IS_SET ( portal->value[2], GATE_RANDOM ) || portal->value[3] == -1 ) { location = get_random_room ( ch ); portal->value[3] = location->vnum; /* for record keeping :) */ } else if ( IS_SET ( portal->value[2], GATE_BUGGY ) && ( number_percent ( ) < 5 ) ) location = get_random_room ( ch ); else location = get_room_index ( portal->value[3] ); if ( location == NULL || location == old_room || !can_see_room ( ch, location ) || ( room_is_private ( ch, location ) && !IS_TRUSTED ( ch, IMPLEMENTOR ) ) ) { act ( "$p doesn't seem to go anywhere.", ch, portal, NULL, TO_CHAR ); return; } if ( IS_NPC ( ch ) && IS_SET ( ch->act, ACT_AGGRESSIVE ) && IS_SET ( location->room_flags, ROOM_LAW ) ) { send_to_char ( "Something prevents you from leaving...\n\r", ch ); return; } act ( "$n steps into $p.", ch, portal, NULL, TO_ROOM ); if ( IS_SET ( portal->value[2], GATE_NORMAL_EXIT ) ) act ( "You enter $p.", ch, portal, NULL, TO_CHAR ); else act ( "You walk through $p and find yourself somewhere else...", ch, portal, NULL, TO_CHAR ); char_from_room ( ch ); char_to_room ( ch, location ); if ( IS_SET ( portal->value[2], GATE_GOWITH ) ) /* take the gate along */ { obj_from_room ( portal ); obj_to_room ( portal, location ); } if ( IS_SET ( portal->value[2], GATE_NORMAL_EXIT ) ) act ( "$n has arrived.", ch, portal, NULL, TO_ROOM ); else act ( "$n has arrived through $p.", ch, portal, NULL, TO_ROOM ); do_look ( ch, "auto" ); /* charges */ if ( portal->value[0] > 0 ) { portal->value[0]--; if ( portal->value[0] == 0 ) portal->value[0] = -1; } /* protect against circular follows */ if ( old_room == location ) return; for ( fch = old_room->people; fch != NULL; fch = fch_next ) { fch_next = fch->next_in_room; if ( portal == NULL || portal->value[0] == -1 ) /* no following through dead portals */ continue; if ( fch->master == ch && IS_AFFECTED ( fch, AFF_CHARM ) && fch->position < POS_STANDING ) do_stand ( fch, "" ); if ( fch->master == ch && fch->position == POS_STANDING ) { if ( IS_SET ( ch->in_room->room_flags, ROOM_LAW ) && ( IS_NPC ( fch ) && IS_SET ( fch->act, ACT_AGGRESSIVE ) ) ) { act ( "You can't bring $N into the city.", ch, NULL, fch, TO_CHAR ); act ( "You aren't allowed in the city.", fch, NULL, NULL, TO_CHAR ); continue; } act ( "You follow $N.", fch, NULL, ch, TO_CHAR ); do_enter ( fch, argument ); } } if ( portal != NULL && portal->value[0] == -1 ) { act ( "$p fades out of existence.", ch, portal, NULL, TO_CHAR ); if ( ch->in_room == old_room ) act ( "$p fades out of existence.", ch, portal, NULL, TO_ROOM ); else if ( old_room->people != NULL ) { act ( "$p fades out of existence.", old_room->people, portal, NULL, TO_CHAR ); act ( "$p fades out of existence.", old_room->people, portal, NULL, TO_ROOM ); } extract_obj ( portal ); } /* * If someone is following the char, these triggers get activated * for the followers before the char, but it's safer this way... */ if ( IS_NPC ( ch ) && HAS_TRIGGER ( ch, TRIG_ENTRY ) ) mp_percent_trigger ( ch, NULL, NULL, NULL, TRIG_ENTRY ); if ( !IS_NPC ( ch ) ) mp_greet_trigger ( ch ); return; } send_to_char ( "Nope, can't do it.\n\r", ch ); return; }