index.html
style.css
div.dialog {
width: 600px;
margin: 2px;
padding: 0 10px 0 10px;
border: 1px solid #ccc;
overflow:auto;
}
div#input {
height: 200px;
}
div#output {
height: 400px;
}
RoomController.js
/**
* RoomController is the main interface to the application
*/
var testVariable = "helloVar";
function testFunction() {
return "helloFun";
}
function testIncludes() {
var output = "testing Item object: ";
var item1 = new Item("title1", "type", null, null, null, null, null);
var item2 = new Item("title2", "type", null, null, null, null, null);
output += " Item1 version=" + item1.getVersion() + " id=" + item1.getID() + " title=" + item1.getTitle() + " type=" + item1.getType() + " ";
output += " Item2 version=" + item2.getVersion() + " id=" + item2.getID() + " title=" + item2.getTitle() + " type=" + item2.getType() + " ";
var room1 = new Room("title3", null, null, null, null, null);
var room2 = new Room("title4", null, null, null, null, null);
output += " Room1 version=" + room1.getVersion() + " id=" + room1.getID() + " title=" + room1.getTitle() + " type=" + room1.getType() + " ";
output += " Room2 version=" + room2.getVersion() + " id=" + room2.getID() + " title=" + room2.getTitle() + " type=" + room2.getType() + " ";
var door1 = new Door("title5", null, null, null, room1, room2, false); //title, position, dimensions, colour, roomA, roomB, isOpen
output += " Door1=" + door1.toString() + " ";
return output;
}
//base RoomController object
var RoomController = function () {
this.VERSION = '0.1a';
}
RoomController.prototype.getVersion = function () { return this.VERSION; }
RoomController.prototype.processCommand = function (key, param) {
var output = "";
if (key != null & amp; amp;& amp; amp; (typeof key == "string") & amp; amp;& amp; amp; key.length & gt; 0) {
switch (key) {
case "?":
case "help":
output = "commands: [?|help] view help [q|quit] quit this application";
break;
case "q":
case "quit":
output = "exiting application...";
break;
default:
output = "!unrecognised command. Enter help to see list of commands.";
break;
}
}
return output;
}
//main initialisation
function roomInit() {
var controller = new RoomController();
return controller;
}
Item.js
/**
* class Item represents an individual item or collection of items in the world
*/
/**
* The semicolon at the beginning takes care of any improperly terminated statements that might preface this class.
* Wrap everything in a function to preserve scope.
*/
//;(function(window) {
function Item(title, type, container, position, dimensions, colour, children) {
/**********************************************************
* Static Properties - shared between all instances
**********************************************************/
//constants
Item.VERSION = "Item 0.1";
Item.TYPE = "Item";
//static fields
if (typeof Item.IDTOP == 'undefined') {
// It has not been used yet, so perform the initialisation
Item.IDTOP = 0;
}
/**********************************************************
* Privileged Properties - unique to each instance
**********************************************************/
this.id = Item.IDTOP++; //int
this.title = title; //String
this.type = type; //String
this.container = container; //Item object
this.position = position; //Position object
this.dimensions = dimensions; //Dimension object
this.colour = colour; //Colour object
this.children = children; //Array
/**********************************************************
* Private Properties - scope only in this inner function
**********************************************************/
var self = this; //!!!always required to sort out scope issues with window, inner functions etc.
//var _privateVar = 'Private Variable';
/**********************************************************
* Privileged Methods
* can access public, privileged and private methods and properties
**********************************************************/
//this.getVersion = function() {
//return Item.VERSION;
//};
/**********************************************************
* Private Methods
* can also access any of the types
**********************************************************/
//function privateMethod() {
//
//}
/**********************************************************
* Getters / Setters - of Private Properties via Privileged Methods
**********************************************************/
//self.getPrivateVar = function() {
//return _privateVar;
//};
//self.setPrivateVar = function(val) {
//_privateVar = val;
//};
/**********************************************************
* Constructor
**********************************************************/
self.__contruct = function () {
//already handled by Privileged Properties
}
}
/**********************************************************
* Public Properties - shared between all instances
**********************************************************/
//Item.prototype.publicProp = 'Public Variable';
/**********************************************************
* Public Methods - shared between all instances
**********************************************************/
Item.prototype.getVersion = function () { return Item.VERSION; }
Item.prototype.getTypeOf = function () { return Item.TYPE; }
Item.prototype.getIDTop = function () { return Item.IDTOP; }
Item.prototype.getID = function () { return this.id; }
Item.prototype.getTitle = function () { return this.title; }
Item.prototype.getType = function () { return this.type; }
Item.prototype.getContainer = function () { return this.container; }
Item.prototype.getPosition = function () { return this.position; }
Item.prototype.getDimensions = function () { return this.dimensions; }
Item.prototype.getColour = function () { return this.colour; }
Item.prototype.getChildren = function () { return this.children; }
Item.prototype.setID = function (id) { this.id = id; }
Item.prototype.setTitle = function (title) { this.title = title; }
Item.prototype.setType = function (type) { this.type = type; }
Item.prototype.setContainer = function (container) { this.container = container; }
Item.prototype.setPosition = function (position) { this.position = position; }
Item.prototype.setDimensions = function (dimensions) { this.dimensions = dimensions; }
Item.prototype.setColour = function (colour) { this.colour = colour; }
Item.prototype.setChildren = function (children) { this.children = children; }
Item.prototype.getChildByID = function (id, remove) {
var output = null; //returns Item
if (id & gt;=0) {
if (this.id == id) {
output = this;
if (remove) {
//to do
}
} else if (this.children != null & amp; amp;& amp; amp; this.children.length & gt; 0) {
for (var i = 0; i & lt; this.children.length; i++) {
if (this.children[i] != null) {
output = this.children[i].getChildByID(id, remove);
//removal handled by if case above
}
}
} else {
//no match
}
}
return output;
}
Item.prototype.addNewChild = function (title, type, container, position, dimensions, colour, children) {
var output = null; //return Item
output = new Item(title, type, container, position, dimensions, colour, children);
if (this.children == null) {
this.children = new Array();
}
this.children.push(output);
return output;
}
Item.prototype.addExistingChild = function (child, overwrite) {
var output = false; //Boolean
if (child != null & amp; amp;& amp; amp; child instanceof Item) {
if (this.children == null) {
this.children = new Array();
}
this.children.push(child);
output = true;
}
return output;
}
Item.prototype.toString = function () {
var output = "id=" + this.id;
output += ", title=" + this.title;
output += ", type=" + this.type;
output += ", container=" + (this.container == null) ? this.container.toString() : "";
output += ", position=" + (this.position == null) ? this.position.toString() : "";
output += ", dimensions=" + (this.dimensions == null) ? this.dimensions.toString() : "";
output += ", colour=" + (this.colour == null) ? this.colour.toString() : "";
output += ", children="; //to do
return output;
}
Item.prototype.compareTo = function (other) {
var output = 0; //int
if (other != null & amp; amp;& amp; amp; other instanceof Item) {
if (this.id & lt; other.id) {
output = 1;
} else if (this.id & gt; other.id) {
output = -1;
} else {
output = 0;
}
} else {
//invalid argument
output = null;
}
return output;
}
//make Item function visible to global scope
// window.Item = Item;
//}(window));
Room.js
/**
* class Room represents a collection of boundary and furniture objects.
* extends Item
*/
//;(function(window) {
/**
* Create a new constructor function, whose prototype is the parent object's prototype.
* Set the child's prototype to the newly created constructor function.
* if argument exists use this mthod rather than: Room.prototype = new Item();
**/
if (typeof extendObj == 'undefined') {
var extendObj = function (childObj, parentObj) {
var tmpObj = function () { }
tmpObj.prototype = parentObj.prototype;
childObj.prototype = new tmpObj();
childObj.prototype.constructor = childObj;
};
}
//setup inheritance of object - must be called BEFORE class defined otherwise
// child prototypes get overridden by parent
extendObj(Room, Item);
function Room(title, level, position, dimensions, colour, children) {
/**********************************************************
* call parent constructor
**********************************************************/
if (typeof Item == 'undefined') {
//parent object not defined yet
alert("Item object undefined to Room!");
} else {
Item.call(this, title, "room", level, position, dimensions, colour, children);
}
/**********************************************************
* Static Properties - shared between all instances
**********************************************************/
//constants
Room.VERSION = "Room 0.1";
Room.TYPE = "Room";
//static fields
//if ( typeof Room.IDTOP == 'undefined' ) {
// It has not been used yet, so perform the initialisation
//Room.IDTOP = 0;
//}
/**********************************************************
* Privileged Properties - unique to each instance
**********************************************************/
this.doorList = []; //Array of Door objects
/**********************************************************
* Private Properties - scope only in this inner function
**********************************************************/
var self = this; //!!!always required to sort out scope issues with window, inner functions etc.
//var _privateVar = 'Private Variable';
/**********************************************************
* Privileged Methods
* can access public, privileged and private methods and properties
**********************************************************/
//this.getVersion = function() {
//return Room.VERSION;
//};
/**********************************************************
* Private Methods
* can also access any of the types
**********************************************************/
//function privateMethod() {
//
// }
/**********************************************************
* Getters / Setters - of Private Properties via Privileged Methods
**********************************************************/
//self.getPrivateVar = function() {
//return _privateVar;
//};
//self.setPrivateVar = function(val) {
//_privateVar = val;
//};
/**********************************************************
* Constructor
**********************************************************/
self.__contruct = function () {
//already handled by Privileged Properties
}
}
//setup inheritance of object
//extendObj(Room, Item);
/**********************************************************
* Public Properties - shared between all instances
**********************************************************/
//Room.prototype.publicProp = 'Public Variable';
/**********************************************************
* Public Methods - shared between all instances
**********************************************************/
Room.prototype.getVersion = function () { return Room.VERSION; }
Room.prototype.getTypeOf = function () { return Room.TYPE; }
Room.prototype.getItem = function (title, remove) {
var output = null; //Item object
if (title != null & amp; amp;& amp; amp; title.length & gt; 0 & amp; amp;& amp; amp; this.itemList != null) {
var matchedIndex = -1;
for (var i = 0; i & lt; this.itemList.length; i++) {
if (this.itemList[i] != null & amp; amp;& amp; amp; this.itemList[i] instanceof Item & amp; amp;& amp; amp; this.itemList[i].getTitle() == title) {
output = this.itemList[i];
matchedIndex = i;
}
}
if (output != null & amp; amp;& amp; amp; remove & amp; amp;& amp; amp; matchedIndex & gt;=0) {
this.itemList.splice(i, 1); //at position i, remove 1 item
}
}
return output;
}
Room.prototype.addItem = function (title, type, parent, position, dimensions, colour, children, overwrite) {
var output = null; //Item object
if (title != null & amp; amp;& amp; amp; title.length & gt; 0) {
output = this.getItem(title, false);
if (output == null) {
output = new Item(title, type, parent, position, dimensions, colour, children);
} else if (overwrite) {
output.setType(type);
output.setParent(parent);
output.setPosition(position);
output.setDimensions(dimensions);
output.setColour(colour);
output.setChildren(children);
} else {
//do not overwrite existing item
}
}
return output;
}
Room.prototype.getDoor = function (title, remove) {
var output = null; //Door
return output;
}
Room.prototype.addDoor = function (door, overwrite) {
var output = false;
return output;
}
//make Room function visible to global scope
// window.Room = Room;
//}(window));
Door.js
/**
* class Door represents a boundary between two rooms
* extends Item
*/
//;(function(window) {
/**
* Create a new constructor function, whose prototype is the parent object's prototype.
* Set the child's prototype to the newly created constructor function.
* if argument exists use this mthod rather than: Room.prototype = new Item();
**/
if (typeof extendObj == 'undefined') {
var extendObj = function (childObj, parentObj) {
var tmpObj = function () { }
tmpObj.prototype = parentObj.prototype;
childObj.prototype = new tmpObj();
childObj.prototype.constructor = childObj;
};
}
//setup inheritance of object - must be called BEFORE class defined otherwise
// child prototypes get overridden by parent
extendObj(Door, Item);
function Door(title, position, dimensions, colour, roomA, roomB, isOpen) {
/**********************************************************
* call parent constructor
**********************************************************/
if (typeof Item == 'undefined') {
//parent object not defined yet
alert("Item object undefined to Room!");
} else {
Item.call(this, title, "door", null, position, dimensions, colour, null);
}
/**********************************************************
* Static Properties - shared between all instances
**********************************************************/
//constants
Door.VERSION = "Door 0.1";
Room.TYPE = "Door";
//static fields
//if ( typeof Room.IDTOP == 'undefined' ) {
// It has not been used yet, so perform the initialisation
//Room.IDTOP = 0;
//}
/**********************************************************
* Privileged Properties - unique to each instance
**********************************************************/
this.roomA = roomA; //Room object
this.roomB = roomB; //Room object
this.isOpen = isOpen; //Boolean
/**********************************************************
* Private Properties - scope only in this inner function
**********************************************************/
var self = this; //!!!always required to sort out scope issues with window, inner functions etc.
//var _privateVar = 'Private Variable';
/**********************************************************
* Privileged Methods
* can access public, privileged and private methods and properties
**********************************************************/
//this.getVersion = function() {
//return Room.VERSION;
//};
/**********************************************************
* Private Methods
* can also access any of the types
**********************************************************/
//function privateMethod() {
//
// }
/**********************************************************
* Getters / Setters - of Private Properties via Privileged Methods
**********************************************************/
//self.getPrivateVar = function() {
//return _privateVar;
//};
//self.setPrivateVar = function(val) {
//_privateVar = val;
//};
/**********************************************************
* Constructor
**********************************************************/
self.__contruct = function () {
//already handled by Privileged Properties
}
}
//setup inheritance of object
//extendObj(Room, Item);
/**********************************************************
* Public Properties - shared between all instances
**********************************************************/
//Room.prototype.publicProp = 'Public Variable';
/**********************************************************
* Public Methods - shared between all instances
**********************************************************/
Door.prototype.getVersion = function () { return Door.VERSION; }
Door.prototype.getTypeOf = function () { return Door.TYPE; }
Door.prototype.getRoomA = function () { return this.roomA; }
Door.prototype.getRoomB = function () { return this.roomB; }
Door.prototype.getIsOpen = function () { return this.isOpen; }
Door.prototype.setRoomA = function (roomA) { this.roomA = roomA; }
Door.prototype.setRoomB = function (roomB) { this.roomB = roomB; }
Door.prototype.setIsOpen = function (isOpen) { this.isOpen = isOpen; }
Door.prototype.toString = function () {
var output = "";
output += this.getVersion() + ",title=" + this.getTitle() + ",roomA=" + this.roomA.getTitle() + ",roomB=" + this.roomB.getTitle() + ",isOpen=" + this.getIsOpen();
return output;
}
//make Room function visible to global scope
// window.Room = Room;
//}(window));