2 space indent -> 4 space indent

This commit is contained in:
Atlante45 2014-11-14 16:15:22 -08:00
parent 94f3f461ce
commit 87d472a5a9
2 changed files with 379 additions and 377 deletions

View file

@ -1,205 +1,207 @@
(function(){ (function(){
this.FIRST_TILE = null; // Global position of the first tile (1a) this.FIRST_TILE = null; // Global position of the first tile (1a)
this.TILE_SIZE = null; // Size of one tile this.TILE_SIZE = null; // Size of one tile
this.whitesDeadPieces = null; this.whitesDeadPieces = null;
this.blacksDeadPieces = null; this.blacksDeadPieces = null;
this.wantDebug = false; this.wantDebug = false;
this.active = false; this.active = false;
this.entityID = null; this.entityID = null;
this.properties = null; this.properties = null;
this.boardID = null; this.boardID = null;
this.boardUserData = null; this.boardUserData = null;
this.sound = null; this.sound = null;
this.startingTile = null; this.startingTile = null;
this.pieces = new Array(); this.pieces = new Array();
// All callbacks start by updating the properties // All callbacks start by updating the properties
this.updateProperties = function(entityID) { this.updateProperties = function(entityID) {
// Piece ID // Piece ID
if (this.entityID === null || !this.entityID.isKnownID) { if (this.entityID === null || !this.entityID.isKnownID) {
this.entityID = Entities.identifyEntity(entityID); this.entityID = Entities.identifyEntity(entityID);
} }
// Piece Properties // Piece Properties
this.properties = Entities.getEntityProperties(this.entityID); this.properties = Entities.getEntityProperties(this.entityID);
// Board ID // Board ID
if (this.boardID === null) { if (this.boardID === null) {
// Read user data string and update boardID // Read user data string and update boardID
var userData = JSON.parse(this.properties.userData); var userData = JSON.parse(this.properties.userData);
var boardID = Entities.identifyEntity(userData.boardID); var boardID = Entities.identifyEntity(userData.boardID);
if (boardID.isKnownID) { if (boardID.isKnownID) {
this.boardID = boardID; this.boardID = boardID;
} else { } else {
return; return;
} }
} }
// Board User Data // Board User Data
this.updateUserData(); this.updateUserData();
}
// Get an entity's user data
this.getEntityUserData = function(entityID) {
var properties = Entities.getEntityProperties(entityID);
if (properties && properties.userData){
return JSON.parse(properties.userData);
} else {
print("No user data found.");
return null;
} }
} // Get an entity's user data
// Updates user data related objects this.getEntityUserData = function(entityID) {
this.updateUserData = function() { var properties = Entities.getEntityProperties(entityID);
// Get board's user data
if (this.boardID !== null && this.boardID.isKnownID) { if (properties && properties.userData){
this.boardUserData = this.getEntityUserData(this.boardID); return JSON.parse(properties.userData);
if (!(this.boardUserData && } else {
this.boardUserData.firstTile && print("No user data found.");
this.boardUserData.tileSize && return null;
this.boardUserData.whitesDeadPieces && }
this.boardUserData.blacksDeadPieces)) { }
print("Incomplete boardUserData " + this.boardID.id); // Updates user data related objects
} else { this.updateUserData = function() {
this.FIRST_TILE = this.boardUserData.firstTile; // Get board's user data
this.TILE_SIZE = this.boardUserData.tileSize; if (this.boardID !== null && this.boardID.isKnownID) {
this.whitesDeadPieces = this.boardUserData.whitesDeadPieces; this.boardUserData = this.getEntityUserData(this.boardID);
this.blacksDeadPieces = this.boardUserData.blacksDeadPieces;
if (!(this.boardUserData &&
this.boardUserData.firstTile &&
this.boardUserData.tileSize &&
this.boardUserData.whitesDeadPieces &&
this.boardUserData.blacksDeadPieces &&
this.boardUserData.pieces)) {
print("Incomplete boardUserData " + this.boardID.id);
} else {
this.FIRST_TILE = this.boardUserData.firstTile;
this.TILE_SIZE = this.boardUserData.tileSize;
this.whitesDeadPieces = this.boardUserData.whitesDeadPieces;
this.blacksDeadPieces = this.boardUserData.blacksDeadPieces;
this.active = true; this.active = true;
} }
} else { } else {
print("Missing boardID:" + JSON.stringify(this.boardID)); print("Missing boardID:" + JSON.stringify(this.boardID));
}
} }
} // Returns whether pos is inside the grid or not
// Returns whether pos is inside the grid or not this.isOutsideGrid = function(pos) {
this.isOutsideGrid = function(pos) { return !(pos.i >= 0 && pos.j >= 0 && pos.i < 8 && pos.j < 8);
return !(pos.i >= 0 && pos.j >= 0 && pos.i < 8 && pos.j < 8);
}
// Returns the tile coordinate
this.getIndexPosition = function(position) {
var halfTile = this.TILE_SIZE / 2.0;
var corner = Vec3.sum(this.FIRST_TILE, { x: -halfTile, y: 0.0, z: -halfTile });
var relative = Vec3.subtract(position, corner);
return {
i: Math.floor(relative.x / this.TILE_SIZE),
j: Math.floor(relative.z / this.TILE_SIZE)
} }
} // Returns the tile coordinate
// Returns the world position this.getIndexPosition = function(position) {
this.getAbsolutePosition = function(pos, halfHeight) { var halfTile = this.TILE_SIZE / 2.0;
var relative = { var corner = Vec3.sum(this.FIRST_TILE, { x: -halfTile, y: 0.0, z: -halfTile });
x: pos.i * this.TILE_SIZE, var relative = Vec3.subtract(position, corner);
y: halfHeight, return {
z: pos.j * this.TILE_SIZE i: Math.floor(relative.x / this.TILE_SIZE),
j: Math.floor(relative.z / this.TILE_SIZE)
}
} }
return Vec3.sum(this.FIRST_TILE, relative); // Returns the world position
} this.getAbsolutePosition = function(pos, halfHeight) {
// Pr, Vr are respectively the Ray's Point of origin and Vector director var relative = {
// Pp, Np are respectively the Plane's Point of origin and Normal vector x: pos.i * this.TILE_SIZE,
this.rayPlaneIntersection = function(Pr, Vr, Pp, Np) { y: halfHeight,
var d = -Vec3.dot(Pp, Np); z: pos.j * this.TILE_SIZE
var t = -(Vec3.dot(Pr, Np) + d) / Vec3.dot(Vr, Np); }
return Vec3.sum(Pr, Vec3.multiply(t, Vr)); return Vec3.sum(this.FIRST_TILE, relative);
}
// Download sound if needed
this.maybeDownloadSound = function() {
if (this.sound === null) {
this.sound = SoundCache.getSound("http://public.highfidelity.io/sounds/Footsteps/FootstepW3Left-12db.wav");
} }
} // Pr, Vr are respectively the Ray's Point of origin and Vector director
// Play drop sound // Pp, Np are respectively the Plane's Point of origin and Normal vector
this.playSound = function() { this.rayPlaneIntersection = function(Pr, Vr, Pp, Np) {
if (this.sound && this.sound.downloaded) { var d = -Vec3.dot(Pp, Np);
Audio.playSound(this.sound, { position: this.properties.position }); var t = -(Vec3.dot(Pr, Np) + d) / Vec3.dot(Vr, Np);
return Vec3.sum(Pr, Vec3.multiply(t, Vr));
} }
} // Download sound if needed
// updates the piece position based on mouse input this.maybeDownloadSound = function() {
this.updatePosition = function(mouseEvent) { if (this.sound === null) {
var pickRay = Camera.computePickRay(mouseEvent.x, mouseEvent.y) this.sound = SoundCache.getSound("http://public.highfidelity.io/sounds/Footsteps/FootstepW3Left-12db.wav");
var upVector = { x: 0, y: 1, z: 0 }; }
var intersection = this.rayPlaneIntersection(pickRay.origin, pickRay.direction,
this.properties.position, upVector);
// if piece outside grid then send it back to the starting tile
if (this.isOutsideGrid(this.getIndexPosition(intersection))) {
intersection = this.getAbsolutePosition(this.startingTile, this.properties.dimensions.y / 2.0);
} }
Entities.editEntity(this.entityID, { position: intersection }); // Play drop sound
} this.playSound = function() {
// Snap piece to the center of the tile it is on if (this.sound && this.sound.downloaded) {
this.snapToGrid = function() { Audio.playSound(this.sound, { position: this.properties.position });
var pos = this.getIndexPosition(this.properties.position); }
var finalPos = this.getAbsolutePosition((this.isOutsideGrid(pos)) ? this.startingTile : pos, }
this.properties.dimensions.y / 2.0); // updates the piece position based on mouse input
Entities.editEntity(this.entityID, { position: finalPos }); this.updatePosition = function(mouseEvent) {
} var pickRay = Camera.computePickRay(mouseEvent.x, mouseEvent.y)
this.moveDeadPiece = function() { var upVector = { x: 0, y: 1, z: 0 };
var myPos = this.getIndexPosition(this.properties.position); var intersection = this.rayPlaneIntersection(pickRay.origin, pickRay.direction,
this.properties.position, upVector);
// if piece outside grid then send it back to the starting tile
if (this.isOutsideGrid(this.getIndexPosition(intersection))) {
intersection = this.getAbsolutePosition(this.startingTile, this.properties.dimensions.y / 2.0);
}
Entities.editEntity(this.entityID, { position: intersection });
}
// Snap piece to the center of the tile it is on
this.snapToGrid = function() {
var pos = this.getIndexPosition(this.properties.position);
var finalPos = this.getAbsolutePosition((this.isOutsideGrid(pos)) ? this.startingTile : pos,
this.properties.dimensions.y / 2.0);
Entities.editEntity(this.entityID, { position: finalPos });
}
this.moveDeadPiece = function() {
var myPos = this.getIndexPosition(this.properties.position);
for (var i = 0; i < this.boardUserData.pieces.length; i++) { for (var i = 0; i < this.boardUserData.pieces.length; i++) {
var piece = this.boardUserData.pieces[i]; var piece = this.boardUserData.pieces[i];
if (piece.id != this.entityID.id) { if (piece.id != this.entityID.id) {
var properties = Entities.getEntityProperties(piece); var properties = Entities.getEntityProperties(piece);
var isWhite = properties.modelURL.search("White") !== -1; var isWhite = properties.modelURL.search("White") !== -1;
var type = (properties.modelURL.search("King") !== -1) ? 4 : var type = (properties.modelURL.search("King") !== -1) ? 4 :
(properties.modelURL.search("Queen") !== -1) ? 3 : (properties.modelURL.search("Queen") !== -1) ? 3 :
(properties.modelURL.search("Rook") !== -1) ? 2 : (properties.modelURL.search("Rook") !== -1) ? 2 :
(properties.modelURL.search("Knight") !== -1) ? 1 : (properties.modelURL.search("Knight") !== -1) ? 1 :
(properties.modelURL.search("Bishop") !== -1) ? 0 : (properties.modelURL.search("Bishop") !== -1) ? 0 :
(properties.modelURL.search("Pawn") !== -1) ? -1 : -2; (properties.modelURL.search("Pawn") !== -1) ? -1 : -2;
var piecePos = this.getIndexPosition(properties.position); var piecePos = this.getIndexPosition(properties.position);
if (myPos.i === piecePos.i && myPos.j === piecePos.j) { if (myPos.i === piecePos.i && myPos.j === piecePos.j) {
var position = this.getAbsolutePosition((isWhite) ? { i: type, j: -1 } : { i: 7 - type, j: 8 }, var position = this.getAbsolutePosition((isWhite) ? { i: type, j: -1 } : { i: 7 - type, j: 8 },
properties.dimensions.y / 2.0); properties.dimensions.y / 2.0);
Entities.editEntity(piece, { Entities.editEntity(piece, {
position: position position: position
}); });
break; break;
} }
} }
} }
} }
this.grab = function(mouseEvent) { this.grab = function(mouseEvent) {
if (this.active) { if (this.active) {
this.startingTile = this.getIndexPosition(this.properties.position); this.startingTile = this.getIndexPosition(this.properties.position);
this.updatePosition(mouseEvent); this.updatePosition(mouseEvent);
}
} }
} this.move = function(mouseEvent) {
this.move = function(mouseEvent) { if (this.active) {
if (this.active) { this.updatePosition(mouseEvent);
this.updatePosition(mouseEvent); }
} }
} this.release = function(mouseEvent) {
this.release = function(mouseEvent) { if (this.active) {
if (this.active) { this.updatePosition(mouseEvent);
this.updatePosition(mouseEvent); this.snapToGrid();
this.snapToGrid(); this.moveDeadPiece();
this.moveDeadPiece(); this.playSound();
this.playSound(); }
} }
}
this.preload = function(entityID) { this.preload = function(entityID) {
this.updateProperties(entityID); // All callbacks start by updating the properties this.updateProperties(entityID); // All callbacks start by updating the properties
this.maybeDownloadSound(); this.maybeDownloadSound();
} }
this.clickDownOnEntity = function(entityID, mouseEvent) { this.clickDownOnEntity = function(entityID, mouseEvent) {
this.preload(entityID); // TODO : remove this.preload(entityID); // TODO : remove
this.updateProperties(entityID); // All callbacks start by updating the properties this.updateProperties(entityID); // All callbacks start by updating the properties
this.grab(mouseEvent); this.grab(mouseEvent);
}; };
this.holdingClickOnEntity = function(entityID, mouseEvent) { this.holdingClickOnEntity = function(entityID, mouseEvent) {
this.updateProperties(entityID); // All callbacks start by updating the properties this.updateProperties(entityID); // All callbacks start by updating the properties
this.move(mouseEvent); this.move(mouseEvent);
}; };
this.clickReleaseOnEntity = function(entityID, mouseEvent) { this.clickReleaseOnEntity = function(entityID, mouseEvent) {
this.updateProperties(entityID); // All callbacks start by updating the properties this.updateProperties(entityID); // All callbacks start by updating the properties
this.release(mouseEvent); this.release(mouseEvent);
}; };
}) })

View file

@ -14,266 +14,266 @@ var gameSize = 1.0;
// Script namespace // Script namespace
var extraDebug = extraDebug || true; var extraDebug = extraDebug || true;
var ChessGame = ChessGame || { var ChessGame = ChessGame || {
BOARD: { BOARD: {
modelURL: "https://s3.amazonaws.com/hifi-public/models/props/chess/Board.fbx", modelURL: "https://s3.amazonaws.com/hifi-public/models/props/chess/Board.fbx",
dimensions: { x: 773.191, y: 20.010, z: 773.191 }, dimensions: { x: 773.191, y: 20.010, z: 773.191 },
rotation: Quat.fromPitchYawRollDegrees(0, 90, 0), rotation: Quat.fromPitchYawRollDegrees(0, 90, 0),
numTiles: 10.0 numTiles: 10.0
}, },
KING: 0, QUEEN: 1, BISHOP: 2, KNIGHT: 3, ROOK: 4, PAWN: 5, KING: 0, QUEEN: 1, BISHOP: 2, KNIGHT: 3, ROOK: 4, PAWN: 5,
board: null, board: null,
pieces: new Array() pieces: new Array()
}; };
ChessGame.getPieceInfo = function(type, isWhite) { ChessGame.getPieceInfo = function(type, isWhite) {
var info = { var info = {
modelURL: "https://s3.amazonaws.com/hifi-public/models/props/chess/", modelURL: "https://s3.amazonaws.com/hifi-public/models/props/chess/",
dimensions: { x: 1.0, y: 1.0, z: 1.0 }, dimensions: { x: 1.0, y: 1.0, z: 1.0 },
rotation: Quat.fromPitchYawRollDegrees(0, 0, 0) rotation: Quat.fromPitchYawRollDegrees(0, 0, 0)
} }
switch(type) { switch(type) {
case ChessGame.KING: case ChessGame.KING:
info.modelURL += "King"; info.modelURL += "King";
info.dimensions = { x: 110.496, y: 306.713, z: 110.496 }; info.dimensions = { x: 110.496, y: 306.713, z: 110.496 };
info.rotation = Quat.fromPitchYawRollDegrees(0, 90, 0); info.rotation = Quat.fromPitchYawRollDegrees(0, 90, 0);
break; break;
case ChessGame.QUEEN: case ChessGame.QUEEN:
info.modelURL += "Queen"; info.modelURL += "Queen";
info.dimensions = { x: 110.496, y: 257.459, z: 110.496 }; info.dimensions = { x: 110.496, y: 257.459, z: 110.496 };
break; break;
case ChessGame.BISHOP: case ChessGame.BISHOP:
info.modelURL += "Bishop"; info.modelURL += "Bishop";
info.dimensions = { x: 102.002, y: 213.941, z: 102.002 }; info.dimensions = { x: 102.002, y: 213.941, z: 102.002 };
info.rotation = Quat.fromPitchYawRollDegrees(0, 90, 0); info.rotation = Quat.fromPitchYawRollDegrees(0, 90, 0);
break; break;
case ChessGame.KNIGHT: case ChessGame.KNIGHT:
info.modelURL += "Knight"; info.modelURL += "Knight";
info.dimensions = { x: 95.602, y: 186.939, z: 95.602 }; info.dimensions = { x: 95.602, y: 186.939, z: 95.602 };
info.rotation = Quat.fromPitchYawRollDegrees(0, 180, 0); info.rotation = Quat.fromPitchYawRollDegrees(0, 180, 0);
break; break;
case ChessGame.ROOK: case ChessGame.ROOK:
info.modelURL += "Rook"; info.modelURL += "Rook";
info.dimensions = { x: 101.024, y: 167.523, z: 101.024 }; info.dimensions = { x: 101.024, y: 167.523, z: 101.024 };
break; break;
case ChessGame.PAWN: case ChessGame.PAWN:
info.modelURL += "Pawn"; info.modelURL += "Pawn";
info.dimensions = { x: 93.317, y: 138.747, z: 93.317 }; info.dimensions = { x: 93.317, y: 138.747, z: 93.317 };
break; break;
} }
info.modelURL += ((isWhite) ? "_White" : "_Black") + ".fbx" info.modelURL += ((isWhite) ? "_White" : "_Black") + ".fbx"
return info; return info;
} }
// Board class // Board class
ChessGame.Board = (function(position, scale) { ChessGame.Board = (function(position, scale) {
this.dimensions = Vec3.multiply(1.0 / ChessGame.BOARD.dimensions.x, ChessGame.BOARD.dimensions); // 1 by 1 this.dimensions = Vec3.multiply(1.0 / ChessGame.BOARD.dimensions.x, ChessGame.BOARD.dimensions); // 1 by 1
this.dimensions = Vec3.multiply(scale, this.dimensions); // scale by scale this.dimensions = Vec3.multiply(scale, this.dimensions); // scale by scale
this.position = position this.position = position
this.tileSize = scale / ChessGame.BOARD.numTiles; this.tileSize = scale / ChessGame.BOARD.numTiles;
this.userDataObject = { this.userDataObject = {
firstTile: this.tilePosition(1, 1), firstTile: this.tilePosition(1, 1),
tileSize: this.tileSize, tileSize: this.tileSize,
whitesDeadPieces: this.tilePosition(0,0), whitesDeadPieces: this.tilePosition(0,0),
blacksDeadPieces: this.tilePosition(9,9), blacksDeadPieces: this.tilePosition(9,9),
pieces: new Array() pieces: new Array()
} }
this.entityProperties = { this.entityProperties = {
type: "Model", type: "Model",
modelURL: ChessGame.BOARD.modelURL, modelURL: ChessGame.BOARD.modelURL,
position: this.position, position: this.position,
dimensions: this.dimensions, dimensions: this.dimensions,
userData: this.buildUserDataString() userData: this.buildUserDataString()
} }
this.entity = null; this.entity = null;
}); });
// Returns the top center point of tile i,j // Returns the top center point of tile i,j
ChessGame.Board.prototype.tilePosition = function(i, j) { ChessGame.Board.prototype.tilePosition = function(i, j) {
if (!(this.position || this.dimensions || this.tileSize || ChessGame.BOARD.numTiles)) { if (!(this.position || this.dimensions || this.tileSize || ChessGame.BOARD.numTiles)) {
print("ChessGame.Board.prototype.tilePosition(): Called before proper initialisation, bailing."); print("ChessGame.Board.prototype.tilePosition(): Called before proper initialisation, bailing.");
return null; return null;
} }
return { return {
x: this.position.x + (i - ChessGame.BOARD.numTiles / 2.0 + 0.5) * this.tileSize, x: this.position.x + (i - ChessGame.BOARD.numTiles / 2.0 + 0.5) * this.tileSize,
y: this.position.y + this.dimensions.y / 2.0, y: this.position.y + this.dimensions.y / 2.0,
z: this.position.z + (j - ChessGame.BOARD.numTiles / 2.0 + 0.5) * this.tileSize z: this.position.z + (j - ChessGame.BOARD.numTiles / 2.0 + 0.5) * this.tileSize
}; };
} }
// Checks the color of the tile // Checks the color of the tile
ChessGame.Board.prototype.isWhite = function(i, j) { ChessGame.Board.prototype.isWhite = function(i, j) {
return (i + j) % 2 != 0; return (i + j) % 2 != 0;
} }
// Build the user data string // Build the user data string
ChessGame.Board.prototype.buildUserDataString = function() { ChessGame.Board.prototype.buildUserDataString = function() {
return JSON.stringify(this.userDataObject); return JSON.stringify(this.userDataObject);
} }
// Updates the user data stored by the board // Updates the user data stored by the board
ChessGame.Board.prototype.updateUserData = function() { ChessGame.Board.prototype.updateUserData = function() {
var userDataString = this.buildUserDataString(); var userDataString = this.buildUserDataString();
this.entityProperties.userData = userDataString; this.entityProperties.userData = userDataString;
Entities.editEntity(this.entity, { userData: userDataString }); Entities.editEntity(this.entity, { userData: userDataString });
} }
// Spawns the board using entities // Spawns the board using entities
ChessGame.Board.prototype.spawn = function() { ChessGame.Board.prototype.spawn = function() {
if (extraDebug) { if (extraDebug) {
print("Spawning board..."); print("Spawning board...");
} }
this.entity = Entities.addEntity(this.entityProperties); this.entity = Entities.addEntity(this.entityProperties);
print("Board spawned"); print("Board spawned");
} }
// Cleans up the entities of the board // Cleans up the entities of the board
ChessGame.Board.prototype.cleanup = function() { ChessGame.Board.prototype.cleanup = function() {
if (extraDebug) { if (extraDebug) {
print("Cleaning up board..."); print("Cleaning up board...");
} }
Entities.deleteEntity(this.entity); Entities.deleteEntity(this.entity);
print("Board cleaned up"); print("Board cleaned up");
} }
// Piece class // Piece class
ChessGame.Piece = (function(position, dimensions, url, rotation) { ChessGame.Piece = (function(position, dimensions, url, rotation) {
this.dimensions = dimensions; this.dimensions = dimensions;
this.position = position; this.position = position;
this.position.y += this.dimensions.y / 2.0; this.position.y += this.dimensions.y / 2.0;
this.entityProperties = { this.entityProperties = {
type: "Model", type: "Model",
position: this.position, position: this.position,
rotation: rotation, rotation: rotation,
dimensions: this.dimensions, dimensions: this.dimensions,
modelURL: url, modelURL: url,
/**/ /**/
script: "https://s3.amazonaws.com/hifi-public/scripts/entityScripts/chessPiece.js", script: "https://s3.amazonaws.com/hifi-public/scripts/entityScripts/chessPiece.js",
/*/ /*/
script: "file:/Users/clement/hifi/examples/entityScripts/chessPiece.js", script: "file:/Users/clement/hifi/examples/entityScripts/chessPiece.js",
/**/ /**/
userData: this.buildUserDataString() userData: this.buildUserDataString()
} }
this.entity = null; this.entity = null;
}); });
// Build the user data string // Build the user data string
ChessGame.Piece.prototype.buildUserDataString = function() { ChessGame.Piece.prototype.buildUserDataString = function() {
if (!(ChessGame.board !== null || ChessGame.board.entity.isKnownID)) { if (!(ChessGame.board !== null || ChessGame.board.entity.isKnownID)) {
print("ChessGame.Piece.prototype.buildUserDataString(): Called before proper initialization, bailing."); print("ChessGame.Piece.prototype.buildUserDataString(): Called before proper initialization, bailing.");
return null; return null;
} }
var userDataObject = { var userDataObject = {
boardID: ChessGame.board.entity, boardID: ChessGame.board.entity,
}; };
return JSON.stringify(userDataObject); return JSON.stringify(userDataObject);
} }
// Spawns the piece // Spawns the piece
ChessGame.Piece.prototype.spawn = function() { ChessGame.Piece.prototype.spawn = function() {
this.entity = Entities.addEntity(this.entityProperties); this.entity = Entities.addEntity(this.entityProperties);
} }
// Cleans up the piece // Cleans up the piece
ChessGame.Piece.prototype.cleanup = function() { ChessGame.Piece.prototype.cleanup = function() {
Entities.deleteEntity(this.entity); Entities.deleteEntity(this.entity);
} }
ChessGame.makePiece = function(piece, i, j, isWhite) { ChessGame.makePiece = function(piece, i, j, isWhite) {
var info = ChessGame.getPieceInfo(piece, isWhite); var info = ChessGame.getPieceInfo(piece, isWhite);
var url = info.modelURL; var url = info.modelURL;
var size = Vec3.multiply(0.5 * (1.0 / ChessGame.BOARD.dimensions.x), info.dimensions); var size = Vec3.multiply(0.5 * (1.0 / ChessGame.BOARD.dimensions.x), info.dimensions);
var rotation = (isWhite) ? info.rotation var rotation = (isWhite) ? info.rotation
: Quat.multiply(Quat.fromPitchYawRollDegrees(0, 180, 0), : Quat.multiply(Quat.fromPitchYawRollDegrees(0, 180, 0),
info.rotation); info.rotation);
var position = ChessGame.board.tilePosition(i, j); var position = ChessGame.board.tilePosition(i, j);
var piece = new ChessGame.Piece(position, size, url, rotation); var piece = new ChessGame.Piece(position, size, url, rotation);
piece.spawn(); piece.spawn();
ChessGame.pieces.push(piece); ChessGame.pieces.push(piece);
return piece; return piece;
} }
ChessGame.scriptStarting = function() { ChessGame.scriptStarting = function() {
print("playChess.js started"); print("playChess.js started");
gamePosition = Vec3.sum(MyAvatar.position, gamePosition = Vec3.sum(MyAvatar.position,
Vec3.multiplyQbyV(MyAvatar.orientation, Vec3.multiplyQbyV(MyAvatar.orientation,
{ x: 0, y: 0, z: -1 })); { x: 0, y: 0, z: -1 }));
// Setup board // Setup board
ChessGame.board = new ChessGame.Board(gamePosition, gameSize); ChessGame.board = new ChessGame.Board(gamePosition, gameSize);
ChessGame.board.spawn(); ChessGame.board.spawn();
} }
ChessGame.update = function() { ChessGame.update = function() {
ChessGame.board.entity = Entities.identifyEntity(ChessGame.board.entity); ChessGame.board.entity = Entities.identifyEntity(ChessGame.board.entity);
if (ChessGame.board.entity.isKnownID && ChessGame.pieces.length == 0) { if (ChessGame.board.entity.isKnownID && ChessGame.pieces.length == 0) {
// Setup white pieces // Setup white pieces
var isWhite = true; var isWhite = true;
var row = 1; var row = 1;
// King // King
ChessGame.makePiece(ChessGame.KING, row, 5, isWhite); ChessGame.makePiece(ChessGame.KING, row, 5, isWhite);
// Queen // Queen
ChessGame.makePiece(ChessGame.QUEEN, row, 4, isWhite); ChessGame.makePiece(ChessGame.QUEEN, row, 4, isWhite);
// Bishop // Bishop
ChessGame.makePiece(ChessGame.BISHOP, row, 3, isWhite); ChessGame.makePiece(ChessGame.BISHOP, row, 3, isWhite);
ChessGame.makePiece(ChessGame.BISHOP, row, 6, isWhite); ChessGame.makePiece(ChessGame.BISHOP, row, 6, isWhite);
// Knight // Knight
ChessGame.makePiece(ChessGame.KNIGHT, row, 2, isWhite); ChessGame.makePiece(ChessGame.KNIGHT, row, 2, isWhite);
ChessGame.makePiece(ChessGame.KNIGHT, row, 7, isWhite); ChessGame.makePiece(ChessGame.KNIGHT, row, 7, isWhite);
// Rook // Rook
ChessGame.makePiece(ChessGame.ROOK, row, 1, isWhite); ChessGame.makePiece(ChessGame.ROOK, row, 1, isWhite);
ChessGame.makePiece(ChessGame.ROOK, row, 8, isWhite); ChessGame.makePiece(ChessGame.ROOK, row, 8, isWhite);
for(var j = 1; j <= 8; j++) { for(var j = 1; j <= 8; j++) {
ChessGame.makePiece(ChessGame.PAWN, row + 1, j, isWhite); ChessGame.makePiece(ChessGame.PAWN, row + 1, j, isWhite);
}
// Setup black pieces
isWhite = false;
row = 8;
// King
ChessGame.makePiece(ChessGame.KING, row, 5, isWhite);
// Queen
ChessGame.makePiece(ChessGame.QUEEN, row, 4, isWhite);
// Bishop
ChessGame.makePiece(ChessGame.BISHOP, row, 3, isWhite);
ChessGame.makePiece(ChessGame.BISHOP, row, 6, isWhite);
// Knight
ChessGame.makePiece(ChessGame.KNIGHT, row, 2, isWhite);
ChessGame.makePiece(ChessGame.KNIGHT, row, 7, isWhite);
// Rook
ChessGame.makePiece(ChessGame.ROOK, row, 1, isWhite);
ChessGame.makePiece(ChessGame.ROOK, row, 8, isWhite);
for(var j = 1; j <= 8; j++) {
ChessGame.makePiece(ChessGame.PAWN, row - 1, j, isWhite);
}
} }
// Setup black pieces if (ChessGame.pieces.length > 0) {
isWhite = false; var unknown = 0;
row = 8; ChessGame.board.userDataObject.pieces = new Array();
// King for(var i = 0; i < ChessGame.pieces.length; i++) {
ChessGame.makePiece(ChessGame.KING, row, 5, isWhite); ChessGame.pieces[i].entity = Entities.identifyEntity(ChessGame.pieces[i].entity);
// Queen if (ChessGame.pieces[i].entity.isKnownID) {
ChessGame.makePiece(ChessGame.QUEEN, row, 4, isWhite); ChessGame.board.userDataObject.pieces.push(ChessGame.pieces[i].entity)
// Bishop } else {
ChessGame.makePiece(ChessGame.BISHOP, row, 3, isWhite); unknown++;
ChessGame.makePiece(ChessGame.BISHOP, row, 6, isWhite); }
// Knight }
ChessGame.makePiece(ChessGame.KNIGHT, row, 2, isWhite); ChessGame.board.updateUserData();
ChessGame.makePiece(ChessGame.KNIGHT, row, 7, isWhite);
// Rook
ChessGame.makePiece(ChessGame.ROOK, row, 1, isWhite);
ChessGame.makePiece(ChessGame.ROOK, row, 8, isWhite);
for(var j = 1; j <= 8; j++) {
ChessGame.makePiece(ChessGame.PAWN, row - 1, j, isWhite);
}
}
if (ChessGame.pieces.length > 0) {
var unknown = 0;
ChessGame.board.userDataObject.pieces = new Array();
for(var i = 0; i < ChessGame.pieces.length; i++) {
ChessGame.pieces[i].entity = Entities.identifyEntity(ChessGame.pieces[i].entity);
if (ChessGame.pieces[i].entity.isKnownID) {
ChessGame.board.userDataObject.pieces.push(ChessGame.pieces[i].entity)
} else {
unknown++;
}
}
ChessGame.board.updateUserData();
if (unknown === 0) { if (unknown === 0) {
print("Board complete"); print("Board complete");
Script.update.disconnect(ChessGame.update); Script.update.disconnect(ChessGame.update);
}
} }
}
} }
ChessGame.scriptEnding = function() { ChessGame.scriptEnding = function() {
// Cleaning up board // Cleaning up board
ChessGame.board.cleanup(); ChessGame.board.cleanup();
// Cleaning up pieces // Cleaning up pieces
for(var i in ChessGame.pieces) { for(var i in ChessGame.pieces) {
ChessGame.pieces[i].cleanup(); ChessGame.pieces[i].cleanup();
} }
print("playChess.js finished"); print("playChess.js finished");
} }
Script.scriptEnding.connect(ChessGame.scriptEnding); Script.scriptEnding.connect(ChessGame.scriptEnding);