/
codebase/src/net/sourceforge/pain/admin/console/command/
codebase/src/net/sourceforge/pain/data/role/
codebase/src/net/sourceforge/pain/network/console/telnet/
codebase/src/net/sourceforge/pain/network/guitool/
codebase/src/net/sourceforge/pain/plugin/
codebase/src/net/sourceforge/pain/util/
db/src/net/sourceforge/pain/util/
gui/
gui/lib/
gui/src/net/sourceforge/pain/tools/guitool/dbbrowse/
gui/src/net/sourceforge/pain/tools/guitool/dialog/
gui/src/net/sourceforge/pain/tools/guitool/menu/
gui/src/net/sourceforge/pain/tools/guitool/resources/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/explorer/
mudlibs/tinylib/
mudlibs/tinylib/area/
mudlibs/tinylib/etc/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/affect/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/prototype/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/trigger/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/affect/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/deploy/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/guitool/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/guitool/event/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/fn/util/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/trigger/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/trigger/impl/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/command/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/reset/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/shutdown/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/social/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/util/
tests/
tests/src/
tests/src/net/sourceforge/pain/db/data/
package net.sourceforge.pain.tinylib.data.type;


import net.sourceforge.pain.data.*;
import net.sourceforge.pain.db.*;


/*
 If Space is Room it has exits (6 in default impl) and unique id
 All links are references to Exit objects
 */

public final class Room extends Role {

    private static final int NORTH = 1 + LAST_BASE_FIELD_INDEX;
    private static final int EAST = 2 + LAST_BASE_FIELD_INDEX;
    private static final int SOUTH = 3 + LAST_BASE_FIELD_INDEX;
    private static final int WEST = 4 + LAST_BASE_FIELD_INDEX;
    private static final int UP = 5 + LAST_BASE_FIELD_INDEX;
    private static final int DOWN = 6 + LAST_BASE_FIELD_INDEX;

    /**
     * since VNUM is prototype only property we should assign UNIQUE_ROOM_ID to
     * any space that statically referenced by code (by not db object)
     * every Room will have an UNIQUE_ROOM_ID - > some kind of VNUM but not VNUM
     */
    private static final int UNIQUE_ROOM_ID = 7 + LAST_BASE_FIELD_INDEX;

    private static final int NFIELDS = 8 + LAST_BASE_FIELD_INDEX;

    private static final int[] dbDirects = new int[]{NORTH, EAST, SOUTH, WEST, UP, DOWN};

    public final static Class[] superroles = new Class[]{Space.class};

    public Room() {
    }

    public Room(PainDB db) {
        super(db);
    }

    public Class[] getSuperroles() {
        return superroles;
    }

    public DbClassSchema provideSchema() {
        byte types[] = new byte[NFIELDS];
        String names[] = new String[NFIELDS];
        fillSuperSchema(types, names);
        types[NORTH] = DbType.REFERENCE;
        names[NORTH] = "north";
        types[EAST] = DbType.REFERENCE;
        names[EAST] = "east";
        types[SOUTH] = DbType.REFERENCE;
        names[SOUTH] = "south";
        types[WEST] = DbType.REFERENCE;
        names[WEST] = "west";
        types[UP] = DbType.REFERENCE;
        names[UP] = "up";
        types[DOWN] = DbType.REFERENCE;
        names[DOWN] = "down";
        types[UNIQUE_ROOM_ID] = DbType.STRING;
        names[UNIQUE_ROOM_ID] = "unique_space_id";

        return new DbClassSchema(types, names);
    }

    public Exit getExit(int direction) {
        if (direction < 0 || direction > 6) {
            throw new IllegalArgumentException("wrong direction:" + direction);
        }
        return (Exit) getReference(dbDirects[direction]);
    }

    public void setExit(int direction, Exit exit) {
        if (direction < 0 || direction > 6) {
            throw new IllegalArgumentException("wrong direction:" + direction);
        }
        setReference(dbDirects[direction], exit);
    }

    public String getRoomUniqueId() {
        return getString(UNIQUE_ROOM_ID);
    }

    public void setRoomUniqueId(String id) {
        setString(UNIQUE_ROOM_ID, id);
    }

    public static final int DIR_NORTH = 0;
    public static final int DIR_EAST = 1;
    public static final int DIR_SOUTH = 2;
    public static final int DIR_WEST = 3;
    public static final int DIR_UP = 4;
    public static final int DIR_DOWN = 5;

    public final static int FIRST_DIR = DIR_NORTH;
    public final static int LAST_DIR = DIR_DOWN;

    public static final int[] reverseDir = new int[]{DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_EAST, DIR_DOWN, DIR_UP};

    public Space asSpace() {
        return (Space) getRole(Space.class);
    }

    public String getName() {
        return asSpace().getName();
    }

    public String getDesc() {
        return asSpace().getDesc();
    }

    public int getCapacity() {
        return asSpace().getCapacity();
    }

}