mirror of
https://github.com/lubosz/overte.git
synced 2025-04-07 11:02:06 +02:00
261 lines
8.7 KiB
JavaScript
261 lines
8.7 KiB
JavaScript
//
|
|
// playChess.js
|
|
// examples
|
|
//
|
|
// Created by Clement Brisset on 11/08/2014
|
|
// Copyright 2014 High Fidelity, Inc.
|
|
//
|
|
// Distributed under the Apache License, Version 2.0.
|
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
|
|
var gamePosition = { x: 1.0, y: 1.0, z: 1.0 };
|
|
var gameSize = 1.0;
|
|
|
|
// Script namespace
|
|
var extraDebug = extraDebug || true;
|
|
var ChessGame = ChessGame || {
|
|
BOARD: {
|
|
modelURL: "https://s3.amazonaws.com/hifi-public/models/props/chess/Board.fbx",
|
|
dimensions: { x: 773.191, y: 20.010, z: 773.191 },
|
|
rotation: Quat.fromPitchYawRollDegrees(0, 90, 0),
|
|
numTiles: 10.0
|
|
},
|
|
KING: 0, QUEEN: 1, BISHOP: 2, KNIGHT: 3, ROOK: 4, PAWN: 5,
|
|
|
|
board: null,
|
|
pieces: new Array()
|
|
};
|
|
|
|
ChessGame.getPieceInfo = function(type, isWhite) {
|
|
var info = {
|
|
modelURL: "https://s3.amazonaws.com/hifi-public/models/props/chess/",
|
|
dimensions: { x: 1.0, y: 1.0, z: 1.0 },
|
|
rotation: Quat.fromPitchYawRollDegrees(0, 0, 0)
|
|
}
|
|
|
|
switch(type) {
|
|
case ChessGame.KING:
|
|
info.modelURL += "King";
|
|
info.dimensions = { x: 110.496, y: 306.713, z: 110.496 };
|
|
info.rotation = Quat.fromPitchYawRollDegrees(0, 90, 0);
|
|
break;
|
|
case ChessGame.QUEEN:
|
|
info.modelURL += "Queen";
|
|
info.dimensions = { x: 110.496, y: 257.459, z: 110.496 };
|
|
break;
|
|
case ChessGame.BISHOP:
|
|
info.modelURL += "Bishop";
|
|
info.dimensions = { x: 102.002, y: 213.941, z: 102.002 };
|
|
info.rotation = Quat.fromPitchYawRollDegrees(0, 90, 0);
|
|
break;
|
|
case ChessGame.KNIGHT:
|
|
info.modelURL += "Knight";
|
|
info.dimensions = { x: 95.602, y: 186.939, z: 95.602 };
|
|
info.rotation = Quat.fromPitchYawRollDegrees(0, 180, 0);
|
|
break;
|
|
case ChessGame.ROOK:
|
|
info.modelURL += "Rook";
|
|
info.dimensions = { x: 101.024, y: 167.523, z: 101.024 };
|
|
break;
|
|
case ChessGame.PAWN:
|
|
info.modelURL += "Pawn";
|
|
info.dimensions = { x: 93.317, y: 138.747, z: 93.317 };
|
|
break;
|
|
}
|
|
info.modelURL += ((isWhite) ? "_White" : "_Black") + ".fbx"
|
|
|
|
return info;
|
|
}
|
|
|
|
|
|
// Board class
|
|
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(scale, this.dimensions); // scale by scale
|
|
this.position = position
|
|
this.tileSize = scale / ChessGame.BOARD.numTiles;
|
|
|
|
this.userDataObject = {
|
|
firstTile: this.tilePosition(1, 1),
|
|
tileSize: this.tileSize,
|
|
whitesDeadPieces: this.tilePosition(0,0),
|
|
blacksDeadPieces: this.tilePosition(9,9)
|
|
}
|
|
this.entityProperties = {
|
|
type: "Model",
|
|
modelURL: ChessGame.BOARD.modelURL,
|
|
position: this.position,
|
|
dimensions: this.dimensions,
|
|
rotation: ChessGame.BOARD.rotation,
|
|
userData: this.buildUserDataString()
|
|
}
|
|
this.entity = null;
|
|
});
|
|
// Returns the top center point of tile i,j
|
|
ChessGame.Board.prototype.tilePosition = function(i, j) {
|
|
if (!(this.position || this.dimensions || this.tileSize || ChessGame.BOARD.numTiles)) {
|
|
print("ChessGame.Board.prototype.tilePosition(): Called before proper initialisation, bailing.");
|
|
return null;
|
|
}
|
|
return {
|
|
x: this.position.x + (i - ChessGame.BOARD.numTiles / 2.0 + 0.5) * this.tileSize,
|
|
y: this.position.y + this.dimensions.y / 2.0,
|
|
z: this.position.z + (j - ChessGame.BOARD.numTiles / 2.0 + 0.5) * this.tileSize
|
|
};
|
|
}
|
|
// Checks the color of the tile
|
|
ChessGame.Board.prototype.isWhite = function(i, j) {
|
|
return (i + j) % 2 != 0;
|
|
}
|
|
// Build the user data string
|
|
ChessGame.Board.prototype.buildUserDataString = function() {
|
|
return JSON.stringify(this.userDataObject);
|
|
}
|
|
// Updates the user data stored by the board
|
|
ChessGame.Board.prototype.updateUserData = function() {
|
|
var userDataString = this.buildUserDataString();
|
|
this.entityProperties.userData = userDataString;
|
|
Entities.editEntity(this.entity, { userData: userDataString });
|
|
}
|
|
// Spawns the board using entities
|
|
ChessGame.Board.prototype.spawn = function() {
|
|
if (extraDebug) {
|
|
print("Spawning board...");
|
|
}
|
|
this.entity = Entities.addEntity(this.entityProperties);
|
|
print("Board spawned");
|
|
}
|
|
// Cleans up the entities of the board
|
|
ChessGame.Board.prototype.cleanup = function() {
|
|
if (extraDebug) {
|
|
print("Cleaning up board...");
|
|
}
|
|
Entities.deleteEntity(this.entity);
|
|
print("Board cleaned up");
|
|
}
|
|
|
|
// Piece class
|
|
ChessGame.Piece = (function(position, dimensions, url, rotation) {
|
|
this.dimensions = dimensions;
|
|
this.position = position;
|
|
this.position.y += this.dimensions.y / 2.0;
|
|
|
|
this.entityProperties = {
|
|
type: "Model",
|
|
position: this.position,
|
|
rotation: rotation,
|
|
dimensions: this.dimensions,
|
|
modelURL: url,
|
|
/**/
|
|
script: "https://s3.amazonaws.com/hifi-public/scripts/entityScripts/chessPiece.js",
|
|
/*/
|
|
script: "file:/Users/clement/hifi/examples/entityScripts/chessPiece.js",
|
|
/**/
|
|
userData: this.buildUserDataString()
|
|
}
|
|
this.entity = null;
|
|
});
|
|
// Build the user data string
|
|
ChessGame.Piece.prototype.buildUserDataString = function() {
|
|
if (!ChessGame.board) {
|
|
print("ChessGame.Piece.prototype.buildUserDataString(): Called before proper initialization, bailing.");
|
|
return null;
|
|
}
|
|
var userDataObject = {
|
|
boardID: ChessGame.board.entity,
|
|
};
|
|
return JSON.stringify(userDataObject);
|
|
}
|
|
// Spawns the piece
|
|
ChessGame.Piece.prototype.spawn = function() {
|
|
this.entity = Entities.addEntity(this.entityProperties);
|
|
}
|
|
// Cleans up the piece
|
|
ChessGame.Piece.prototype.cleanup = function() {
|
|
Entities.deleteEntity(this.entity);
|
|
}
|
|
ChessGame.makePiece = function(piece, i, j, isWhite) {
|
|
var info = ChessGame.getPieceInfo(piece, isWhite);
|
|
var url = info.modelURL;
|
|
var size = Vec3.multiply(0.5 * (1.0 / ChessGame.BOARD.dimensions.x), info.dimensions);
|
|
var rotation = (isWhite) ? info.rotation
|
|
: Quat.multiply(Quat.fromPitchYawRollDegrees(0, 180, 0),
|
|
info.rotation);
|
|
var position = ChessGame.board.tilePosition(i, j);
|
|
|
|
var piece = new ChessGame.Piece(position, size, url, rotation);
|
|
piece.spawn();
|
|
ChessGame.pieces.push(piece);
|
|
return piece;
|
|
}
|
|
|
|
ChessGame.scriptStarting = function() {
|
|
print("playChess.js started");
|
|
gamePosition = Vec3.sum(MyAvatar.position,
|
|
Vec3.multiplyQbyV(MyAvatar.orientation,
|
|
{ x: 0, y: 0, z: -1 }));
|
|
// Setup board
|
|
ChessGame.board = new ChessGame.Board(gamePosition, gameSize);
|
|
ChessGame.board.spawn();
|
|
}
|
|
|
|
ChessGame.update = function() {
|
|
if (ChessGame.board.entity && ChessGame.pieces.length == 0) {
|
|
// Setup white pieces
|
|
var isWhite = true;
|
|
var row = 1;
|
|
// 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
|
|
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);
|
|
}
|
|
Script.update.disconnect(ChessGame.update);
|
|
}
|
|
}
|
|
|
|
ChessGame.scriptEnding = function() {
|
|
// Cleaning up board
|
|
ChessGame.board.cleanup();
|
|
|
|
// Cleaning up pieces
|
|
for(var i in ChessGame.pieces) {
|
|
ChessGame.pieces[i].cleanup();
|
|
}
|
|
|
|
print("playChess.js finished");
|
|
}
|
|
|
|
Script.scriptEnding.connect(ChessGame.scriptEnding);
|
|
Script.update.connect(ChessGame.update);
|
|
ChessGame.scriptStarting();
|