/**************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvements 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 *
* benefiting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************
* ROM 2.4 is copyright 1993-1998 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@hypercube.org) *
* Gabrielle Taylor (gtaylor@hypercube.org) *
* Brian Moore (zump@rom.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
***************************************************************************
* 1stMud ROM Derivative (c) 2001-2004 by Markanth *
* http://www.firstmud.com/ <markanth@firstmud.com> *
* By using this code you have agreed to follow the term of *
* the 1stMud license in ../doc/1stMud/LICENSE *
***************************************************************************/
#include "merc.h"
#include "interp.h"
#include "tables.h"
RoomIndex *
get_random_room (CharData * ch)
{
RoomIndex *room;
for (;;)
{
room = get_room_index (number_range (0, 65535));
if (room != NULL)
if (can_see_room (ch, room) && !room_is_private (room) &&
!IsSet (room->room_flags, ROOM_PRIVATE) &&
!IsSet (room->room_flags, ROOM_SOLITARY) &&
!IsSet (room->area->area_flags, AREA_CLOSED) &&
!IsSet (room->room_flags, ROOM_ARENA) &&
!IsSet (room->room_flags, ROOM_SAFE) && (IsNPC (ch) ||
IsSet (ch->act,
ACT_AGGRESSIVE)
||
!IsSet
(room->room_flags,
ROOM_LAW)))
break;
}
return room;
}
Do_Fun (do_enter)
{
RoomIndex *location;
if (ch->fighting != NULL)
return;
if (!NullStr (argument))
{
RoomIndex *old_room;
ObjData *portal;
CharData *fch, *fch_next;
old_room = ch->in_room;
portal = get_obj_list (ch, argument, ch->in_room->content_first);
if (portal == NULL)
{
chprintln (ch, "You don't see that here.");
return;
}
if (portal->item_type != ITEM_PORTAL ||
(IsSet (portal->value[1], EX_CLOSED) && !IsTrusted (ch, ANGEL)))
{
chprintln (ch, "You can't seem to find a way in.");
return;
}
if (!IsTrusted (ch, ANGEL) &&
!IsSet (portal->value[2], GATE_NOCURSE) &&
(IsAffected (ch, AFF_CURSE) ||
IsSet (old_room->room_flags, ROOM_NO_RECALL)))
{
chprintln (ch, "Something prevents you from leaving...");
return;
}
if (IsSet (portal->value[2], GATE_RANDOM) || portal->value[3] == -1)
{
location = get_random_room (ch);
portal->value[3] = location->vnum;
}
else if (IsSet (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 (location)
&& !IsTrusted (ch, IMPLEMENTOR)))
{
act ("$p doesn't seem to go anywhere.", ch, portal, NULL, TO_CHAR);
return;
}
if (IsNPC (ch) && IsSet (ch->act, ACT_AGGRESSIVE) &&
IsSet (location->room_flags, ROOM_LAW))
{
chprintln (ch, "Something prevents you from leaving...");
return;
}
act ("$n steps into $p.", ch, portal, NULL, TO_ROOM);
if (IsSet (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 (IsSet (portal->value[2], GATE_GOWITH))
{
obj_from_room (portal);
obj_to_room (portal, location);
}
if (IsSet (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_function (ch, &do_look, "auto");
if (portal->value[0] > 0)
{
portal->value[0]--;
if (portal->value[0] == 0)
portal->value[0] = -1;
}
if (old_room == location)
return;
for (fch = old_room->person_first; fch != NULL; fch = fch_next)
{
fch_next = fch->next_in_room;
if (portal == NULL || portal->value[0] == -1)
continue;
if (fch->master == ch && IsAffected (fch, AFF_CHARM) &&
fch->position < POS_STANDING)
do_function (fch, &do_stand, "");
if (fch->master == ch && fch->position == POS_STANDING)
{
if (IsSet (ch->in_room->room_flags, ROOM_LAW) &&
(IsNPC (fch) && IsSet (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_function (fch, &do_enter, 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->person_first != NULL)
{
act ("$p fades out of existence.",
old_room->person_first, portal, NULL, TO_CHAR);
act ("$p fades out of existence.",
old_room->person_first, portal, NULL, TO_ROOM);
}
extract_obj (portal);
}
if (IsNPC (ch) && HasTriggerMob (ch, TRIG_ENTRY))
p_percent_trigger (ch, NULL, NULL, NULL, NULL, NULL, TRIG_ENTRY);
if (!IsNPC (ch))
{
p_greet_trigger (ch, PRG_MPROG);
p_greet_trigger (ch, PRG_OPROG);
p_greet_trigger (ch, PRG_RPROG);
}
return;
}
chprintln (ch, "Nope, can't do it.");
return;
}
Do_Fun (do_worship)
{
CharData *priest;
DeityData *i;
if (NullStr (argument))
{
cmd_syntax (ch, NULL, n_fun, "<deity>", "list", NULL);
return;
}
if (!str_cmp (argument, "list"))
{
int e;
for (e = ETHOS_LAWFUL_GOOD; e != ETHOS_CHAOTIC_EVIL; e--)
{
for (i = deity_first; i; i = i->next)
{
if (i->ethos != (ethos_t) e)
continue;
chprintlnf (ch, "\t%-12s (%s): %s", i->name,
flag_string (ethos_types, i->ethos), i->desc);
}
}
return;
}
for (priest = ch->in_room->person_first; priest != NULL;
priest = priest->next_in_room)
if (IsNPC (priest) && IsSet (priest->act, ACT_IS_HEALER))
break;
if (priest == NULL)
{
chprintln (ch, "There is no priest here!");
return;
}
if (ch->pcdata->quest.points < 250)
{
chprintln (ch, "You need 250 questpoints to change your deity.");
return;
}
i = deity_lookup (argument);
if (i == NULL)
{
chprintln (ch, "That deity doesn't exist.");
return;
}
ch->deity = i;
chprintlnf (ch, "You now worship %s.", i->name);
ch->pcdata->quest.points -= 250;
return;
}
Do_Fun (do_heel)
{
if (ch->pet == NULL)
{
chprintln (ch, "You don't have a pet!");
return;
}
if (IsSet (ch->in_room->room_flags, ROOM_ARENA))
{
act ("$N can't hear your whistle with all the screaming.", ch, NULL,
ch->pet, TO_CHAR);
return;
}
char_from_room (ch->pet);
char_to_room (ch->pet, ch->in_room);
act ("$n lets out a loud whistle and $N comes running.", ch, NULL,
ch->pet, TO_ROOM);
act ("You let out a loud whistle and $N comes running.", ch, NULL,
ch->pet, TO_CHAR);
}