Pyom.1.00a/
Pyom.1.00a/pysrc/miniboa/
"""
/***************************************************************************
 *  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-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                         *
***************************************************************************/
/************
 * Ported to Python by Davion of MudBytes.net
 * Using Miniboa https://code.google.com/p/miniboa/
 * Now using Python 3 version https://code.google.com/p/miniboa-py3/
 ************/
"""
import random
from merc import *

def get_random_room(ch):
    room = None
    while True:
        room = random.choice(room_index_hash)
        if ch.can_see_room(room) and not room.is_private() \
        and not IS_SET(room.room_flags, ROOM_PRIVATE) \
        and not IS_SET(room.room_flags, ROOM_SOLITARY) \
        and not IS_SET(room.room_flags, ROOM_SAFE) \
        and (IS_NPC(ch) or IS_SET(ch.act,ACT_AGGRESSIVE) \
        or not IS_SET(room.room_flags,ROOM_LAW)):
            break
    return room

# RT Enter portals */
def do_enter(self, argument):
    ch=self
    ROOM_INDEX_DATA *location 

    if ch.fighting:
        return
    # nifty portal stuff */
    if argument:
        old_room = ch.in_room
        portal = ch.get_obj_list(argument, ch.in_room.contents)
        if not portal:
            ch.send("You don't see that here.\n")
            return
        if portal.item_type != ITEM_PORTAL \
        or  (IS_SET(portal.value[1],EX_CLOSED) and not IS_TRUSTED(ch,ANGEL)):
            ch.send("You can't seem to find a way in.\n")
            return
        if not IS_TRUSTED(ch,ANGEL) and not IS_SET(portal.value[2],GATE_NOCURSE) \
        and  (IS_AFFECTED(ch,AFF_CURSE) or IS_SET(old_room.room_flags,ROOM_NO_RECALL)):
            ch.send("Something prevents you from leaving...\n")
            return
        location = None
        if IS_SET(portal.value[2],GATE_RANDOM) or portal.value[3] == -1:
            location = get_random_room(ch)
            portal.value[3] = location.vnum # for record keeping :) */
        elif IS_SET(portal.value[2], GATE_BUGGY) and (number_percent() < 5):
            location = get_random_room(ch)
        else:
            location = get_room_index(portal.value[3])
        if not location or location == old_room \
        or  not ch.can_see_room(location) \
        or (location.is_private() and not IS_TRUSTED(ch,IMPLEMENTOR)):
            act("$p doesn't seem to go anywhere.",ch,portal,None,TO_CHAR)
            return
        if IS_NPC(ch) and IS_SET(ch.act,ACT_AGGRESSIVE) \
        and  IS_SET(location.room_flags,ROOM_LAW):
            ch.send("Something prevents you from leaving...\n")
            return
        act("$n steps into $p.",ch,portal,None,TO_ROOM)
  
        if IS_SET(portal.value[2], GATE_NORMAL_EXIT):
            act("You enter $p.",ch,portal,None,TO_CHAR)
        else:
            act("You walk through $p and find yourself somewhere else:...",ch,portal,None,TO_CHAR) 
        ch.from_room()
        ch.to_room(location)
        if IS_SET(portal.value[2], GATE_GOWITH): # take the gate along */
            portal.from_room()
            portal.to_room(location)
        if IS_SET(portal.value[2], GATE_NORMAL_EXIT):
            act("$n has arrived.",ch,portal,None,TO_ROOM)
        else:
            act("$n has arrived through $p.",ch,portal,None,TO_ROOM)

        ch.do_look("auto")
        # charges */
        if portal.value[0] > 0:
            portal.value[0] -= 1
            if portal.value[0] == 0:
                portal.value[0] = -1
        # protect against circular follows */
        if old_room == location:
            return
        for fch in old_room.people[:]:
            if not portal or portal.value[0] == -1:
                # no following through dead portals */
                continue
            if fch.master == ch and IS_AFFECTED(fch,AFF_CHARM) and fch.position < POS_STANDING:
                fch.do_stand("")
            if fch.master == ch and fch.position == POS_STANDING:
                if IS_SET(ch.in_room.room_flags,ROOM_LAW) and  (IS_NPC(fch) and IS_SET(fch.act,ACT_AGGRESSIVE)):
                    act("You can't bring $N into the city.", ch,None,fch,TO_CHAR)
                    act("You aren't allowed in the city.", fch,None,None,TO_CHAR)
                    continue
                act( "You follow $N.", fch, None, ch, TO_CHAR )
                fch.do_enter(argument)
        if portal and portal.value[0] == -1:
            act("$p fades out of existence.",ch,portal,None,TO_CHAR)
            if ch.in_room == old_room:
                act("$p fades out of existence.",ch,portal,None,TO_ROOM)
            elif old_room.people:
                act("$p fades out of existence.", old_room.people,portal,None,TO_CHAR)
                act("$p fades out of existence.", old_room.people,portal,None,TO_ROOM)
            portal.extract()
        return
    ch.send("Nope, can't do it.\n")
    return