mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 23:46:26 +02:00
2 space indent -> 4 space indent
This commit is contained in:
parent
94f3f461ce
commit
87d472a5a9
2 changed files with 379 additions and 377 deletions
|
@ -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);
|
||||||
};
|
};
|
||||||
})
|
})
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue