content: package org.apollo.cache.def;
  
  import com.google.common.base.Preconditions;
  
  /**
   * Represents a type of GameObject.
   *
   * @author Major
   * @author Advocatus
   */
  public final class ObjectDefinition {
  
  	/**
  	 * The array of game object definitions.
  	 */
  	private static ObjectDefinition[] definitions;
  
  	/**
  	 * Gets the total number of object definitions.
  	 *
  	 * @return The count.
  	 */
  	public static int count() {
  		return definitions.length;
  	}
  
  	/**
  	 * Gets the array of object definitions.
  	 *
  	 * @return The definitions.
  	 */
  	public static ObjectDefinition[] getDefinitions() {
  		return definitions;
  	}
  
  	/**
  	 * Initialises the object definitions.
  	 *
  	 * @param definitions The decoded definitions.
  	 * @throws RuntimeException If there is an id mismatch.
  	 */
  	public static void init(ObjectDefinition[] definitions) {
  		ObjectDefinition.definitions = definitions;
  		for (int id = 0; id < definitions.length; id++) {
  			ObjectDefinition def = definitions[id];
  			if (def.getId() != id) {
  				throw new RuntimeException("Item definition id mismatch.");
  			}
  		}
  	}
  
  	/**
  	 * Gets the object definition for the specified id.
  	 *
  	 * @param id The id of the object.
  	 * @return The definition.
  	 * @throws IndexOutOfBoundsException If the id is out of bounds.
  	 */
  	public static ObjectDefinition lookup(int id) {
  		Preconditions.checkElementIndex(id, definitions.length, "Id out of bounds.");
  		return definitions[id];
  	}
  
  	/**
  	 * Represents whether or not this object is clipped. By default, they are.
  	 */
  	private boolean clipped = true;
  	
  	/**
  	 * The object's description.
  	 */
  	private String description;
  
  	/**
  	 * The object's id.
  	 */
  	private final int id;
  
  	/**
  	 * Denotes whether this object is impenetrable or not.
  	 */
  	private boolean impenetrable = true;
  
  	/**
  	 * Denotes whether this object has actions associated with it or not.
  	 */
  	private boolean interactive;
  
  	/**
  	 * Denotes whether or not this object obstructs the ground.
  	 */
  	private boolean obstructive;
  
  	/**
  	 * This object's length.
  	 */
  	private int length = 1;
  
  	/**
  	 * The object's menu actions.
  	 */
  	private String[] menuActions;
  
  	/**
  	 * The object's name.
  	 */
  	private String name;
  
  	/**
  	 * Denotes whether the object can be walked over or not.
  	 */
  	private boolean solid = true;
  
  	/**
  	 * This object's width.
  	 */
  	private int width = 1;
  
  	/**
  	 * Creates a new object definition.
  	 *
  	 * @param id The id of the object.
  	 */
  	public ObjectDefinition(int id) {
  		this.id = id;
  	}
  
  	/**
  	 * Gets the description of this object.
  	 *
  	 * @return The description.
  	 */
  	public String getDescription() {
  		return description;
  	}
  
  	/**
  	 * Gets the id of this object.
  	 *
  	 * @return The id.
  	 */
  	public int getId() {
  		return id;
  	}
  
  	/**
  	 * Gets the length of this object.
  	 *
  	 * @return The length.
  	 */
  	public int getLength() {
  		return length;
  	}
  
  	/**
  	 * Gets the menu actions of this object.
  	 *
  	 * @return The menu actions.
  	 */
  	public String[] getMenuActions() {
  		return menuActions;
  	}
  
  	/**
  	 * Gets the name of this object.
  	 *
  	 * @return The name.
  	 */
  	public String getName() {
  		return name;
  	}
  
  	/**
  	 * Gets the with of this object.
  	 *
  	 * @return The width.
  	 */
  	public int getWidth() {
  		return width;
  	}
  
  	/**
  	 * Indicates whether or not this object is clipped.
  	 * 
  	 * @return {@code true} if this object is clipped.
  	 */
  	public boolean isClipped() {
  		return clipped;
  	}
  	
  	/**
  	 * Indicates the impenetrability of this object.
  	 *
  	 * @return {@code true} if this object is impenetrable, otherwise {@code false}.
  	 */
  	public boolean isImpenetrable() {
  		return impenetrable;
  	}
  
  	/**
  	 * Indicates the interactivity of this object.
  	 *
  	 * @return {@code true} if the object is interactive, otherwise {@code false}.
  	 */
  	public boolean isInteractive() {
  		return interactive;
  	}
  
  	/**
  	 * Indicates whether or not this object obstructs the ground.
  	 *
  	 * @return {@code true} if the object obstructs the ground otherwise {@code false}.
  	 */
  	public boolean isObstructive() {
  		return obstructive;
  	}
  
  	/**
  	 * Indicates the solidity of this object.
  	 *
  	 * @return {@code true} if this object is solid, otherwise {@code false}.
  	 */
  	public boolean isSolid() {
  		return solid;
  	}
  
  	/**
  	 * Sets whether or not this this object is clipped.
  	 * 
  	 * @param clipped Whether it is clipped.
  	 */
  	public void setClipped(boolean clipped) {
  		this.clipped = clipped;
  	}
  	
  	/**
  	 * Sets the description of this object.
  	 *
  	 * @param description The description.
  	 */
  	public void setDescription(String description) {
  		this.description = description;
  	}
  
  	/**
  	 * Sets the impenetrability of this object.
  	 *
  	 * @param impenetrable The impenetrability.
  	 */
  	public void setImpenetrable(boolean impenetrable) {
  		this.impenetrable = impenetrable;
  	}
  
  	/**
  	 * Sets the interactivity of this object.
  	 *
  	 * @param interactive The interactivity.
  	 */
  	public void setInteractive(boolean interactive) {
  		this.interactive = interactive;
  	}
  
  	/**
  	 * Sets the length of this object.
  	 *
  	 * @param length The length.
  	 */
  	public void setLength(int length) {
  		this.length = length;
  	}
  
  	/**
  	 * Sets the menu actions of this object.
  	 *
  	 * @param menuActions The menu actions.
  	 */
  	public void setMenuActions(String[] menuActions) {
  		this.menuActions = menuActions;
  	}
  
  	/**
  	 * Sets the name of this object.
  	 *
  	 * @param name The name.
  	 */
  	public void setName(String name) {
  		this.name = name;
  	}
  
  	/**
  	 * Sets the solidity of this object.
  	 *
  	 * @param solid The solidity.
  	 */
  	public void setSolid(boolean solid) {
  		this.solid = solid;
  	}
  
  	/**
  	 * Sets the width of this object.
  	 *
  	 * @param width The width.
  	 */
  	public void setWidth(int width) {
  		this.width = width;
  	}
  
  	/**
  	 * Sets whether or not this object is obstructive to the ground.
  	 *
  	 * @param obstructive Whether or not this object obstructs the ground.
  	 */
  	public void setObstructive(boolean obstructive) {
  		this.obstructive = obstructive;
  	}
  
  }