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(); } }