/**
* @package HTML Chess
* http://htmlchess.sourceforge.net/
* Pieces types in this function are so defined: 0 = pawn, 1 = king, 2 = knight, 3 = bishop, 4 = rook, 5 = queen.
* Colors are: zero for white, one for black.
*/
var oCnf = this, fDegRad = Math.PI / 180,
oSelectorCanvas = document.createElement("canvas"),
oValidCanvas = document.createElement("canvas"),
oInCheckCanvas = document.createElement("canvas"),
oScene = new Canvas3D.Scene(this.oSolidVwArea, this.i3DWidth, this.i3DHeight, true),
oCam = new Canvas3D.Camera(),
iSelectorY = 0, iSelectorX = 0, bPieceSelected, oSelectedPiece = null, bPiecesHidden = false, bSelectorAct = true,
aMouseRegions, iLastMouseRegionX = -1, iLastMouseRegionY = -1,
bIsRotating = false, iMouseDownX = 0, iMouseDownY = 0, bMouseIsDown = false, bUnhideOrdered = false,
aPieces = [], aPiecesCasing = [[],[],[],[],[],[]], aRots = [0,0,-90,90,0,180,0,180,0,0,0,0],
oLight1 = new Canvas3D.Light(), oLight2 = new Canvas3D.Light(), oLight3 = new Canvas3D.Light(),
oBoardMesh = createMesh(this.tmp3DBoard);
delete this.tmp3DBoard;
oBoardMesh.setForcedZ(64);
oScene.addObject(oBoardMesh);
function getElementPos(oElement) {
var nElPosX = -(document.body.scrollLeft+document.documentElement.scrollLeft), nElPosY = -(document.body.scrollTop+document.documentElement.scrollTop);
while (oElement && oElement.nodeName != "BODY") {
nElPosX += oElement.offsetLeft;
nElPosY += oElement.offsetTop;
oElement = oElement.offsetParent;
}
return {xAxis: nElPosX, yAxis: nElPosY};
}
// stand by selector
function selectorListener(oMsEvnt1) {
if (!oMsEvnt1) { oMsEvnt1 = window.event; }
var oPos = getElementPos(oScene.getInputLayer()), oRegion = checkMouseRegions(oMsEvnt1.clientX - oPos.xAxis, oMsEvnt1.clientY - oPos.yAxis);
if (oRegion) {
showSelector();
showValidMoves();
showInCheckPieces();
bSelectorAct = true;
Canvas3D.removeEvent(oScene.getInputLayer(), "mousemove", selectorListener);
}
}
function standbySelector() {
if (bSelectorAct) {
hideSelector();
hideValidMoves();
hideInCheckPieces();
bSelectorAct = false;
Canvas3D.addEvent(oScene.getInputLayer(), "mousemove", selectorListener);
}
}
// end
function moveZoom(bZoomIn) {
if (oCam = oScene.getActiveCamera()) {
var oTarget = oCam.getLookAt(), fDist = oTarget.dist(oCam.getPosition());
standbySelector();
hidePieces();
oCam.moveForward(bZoomIn ? (fDist - 50 < 40 ? fDist - 40 : 50) : -50);
updateMouseRegions();
updateSelector();
updateValidMoves();
updateInCheckPieces();
showPieces();
}
}
// setup polygons for board squares, used to check which piece mouse is hovering over
function updateMouseRegions() {
//var oCam = oScene.getActiveCamera();
var iPosX, iPosY, iPosZ, oP1, oP2, oP3, oP4, iOffsetX = oCnf.i3DWidth >> 1, iOffsetY = oCnf.i3DHeight >> 1, aPaths = [];
for (var nRegX = 0; nRegX < 8; nRegX++) {
aPaths[nRegX] = [];
for (var nRegY = 0; nRegY < 8; nRegY++) {
iPosX = -(nRegX - 3) * 10;
iPosY = 0;
iPosZ = (nRegY - 4) * 10;
oP1 = oCam.project(oCam.transformPoint(new Canvas3D.Vec3(iPosX, iPosY, iPosZ)));
oP2 = oCam.project(oCam.transformPoint(new Canvas3D.Vec3(iPosX + 10, iPosY, iPosZ)));
oP3 = oCam.project(oCam.transformPoint(new Canvas3D.Vec3(iPosX + 10, iPosY, iPosZ + 10)));
oP4 = oCam.project(oCam.transformPoint(new Canvas3D.Vec3(iPosX, iPosY, iPosZ + 10)));
aPaths[nRegX][nRegY] = [
[oP1.x + iOffsetX, oP1.y + iOffsetY],
[oP2.x + iOffsetX, oP2.y + iOffsetY],
[oP3.x + iOffsetX, oP3.y + iOffsetY],
[oP4.x + iOffsetX, oP4.y + iOffsetY]
];
}
}
aMouseRegions = aPaths;
}
function checkMouseRegions(iMouseX, iMouseY) {
var bIsLast = false, bFound = false, iRegionY = -1, iRegionX = -1, oCtx = oSelectorCanvas.getContext("2d");
if (iLastMouseRegionX > -1 && iLastMouseRegionY > -1 && checkSingleMouseRegion(oCtx, aMouseRegions[iLastMouseRegionX][iLastMouseRegionY], iMouseX, iMouseY)) { bIsLast = true; }
if (!bIsLast) {
for (var iCheckY = 0; iCheckY < 8 && !bFound; iCheckY++) {
for (var iCheckX = 0; iCheckX < 8 && !bFound; iCheckX++) {
if (checkSingleMouseRegion(oCtx, aMouseRegions[iCheckY][iCheckX], iMouseX, iMouseY)) {
iRegionY = iCheckY;
iRegionX = iCheckX;
bFound = true;
}
}
}
}
return(iRegionY > -1 && iRegionX > -1 ? {regX: iRegionX, regY: iRegionY} : false);
}
function checkSingleMouseRegion(oCtx, aRegion, nX, nY) {
oCtx.beginPath();
oCtx.moveTo(aRegion[0][0], aRegion[0][1]);
oCtx.lineTo(aRegion[1][0], aRegion[1][1]);
oCtx.lineTo(aRegion[2][0], aRegion[2][1]);
oCtx.lineTo(aRegion[3][0], aRegion[3][1]);
oCtx.closePath();
return(oCtx.isPointInPath(nX, nY));
}
function moveSelector(iDeltaX, iDeltaY) {
var fAngle = Math.atan2(oCam.getPosition().x,oCam.getPosition().z) / fDegRad;
// four scenarios for how to move the selector, depending on camera angle
if (fAngle >= 135 || fAngle <= -135) {
iSelectorX = iSelectorX + iDeltaX & 7;
iSelectorY = iSelectorY + iDeltaY & 7;
} else if (fAngle >= -45 && fAngle <= 45) {
iSelectorX = iSelectorX - iDeltaX & 7;
iSelectorY = iSelectorY - iDeltaY & 7;
} else if (fAngle >= -135 && fAngle <= -45) {
iSelectorY = iSelectorY - iDeltaX & 7;
iSelectorX = iSelectorX + iDeltaY & 7;
} else if (fAngle >= 45 && fAngle <= 135) {
iSelectorY = iSelectorY + iDeltaX & 7;
iSelectorX = iSelectorX - iDeltaY & 7;
}
updateSelector();
}
function hideSelector() { oSelectorCanvas.style.display = "none"; }
function showSelector() { oSelectorCanvas.style.display = "block"; }
function hideValidMoves() { oValidCanvas.style.display = "none"; }
function showValidMoves() { oValidCanvas.style.display = "block"; }
function hideInCheckPieces() { oInCheckCanvas.style.display = "none"; }
function showInCheckPieces() { oInCheckCanvas.style.display = "block"; }
function hidePieces() {
if (!bPiecesHidden) {
for (var iHide = 0; iHide < aPieces.length; iHide++) { aPieces[iHide].mesh.hide(); }
bPiecesHidden = true;
}
}
function showPieces() {
if (bPiecesHidden) {
for (var iShow = 0; iShow < aPieces.length; iShow++) { aPieces[iShow].mesh.show(); }
bPiecesHidden = false;
}
}
function updateSelector() {
var iOffsetX = oCnf.i3DWidth >> 1, iOffsetY = oCnf.i3DHeight >> 1, oCtx = oSelectorCanvas.getContext("2d");
oCtx.clearRect(0,0,oCnf.i3DWidth,oCnf.i3DHeight);
// draw active selector square
makeRegionPath(oCtx, iSelectorX, iSelectorY);
oCtx.fillStyle = "rgba(255,255,0,0.5)";
oCtx.fill();
if (bPieceSelected) {
// draw border around selected square
makeRegionPath(oCtx, oSelectedPiece.posX, oSelectedPiece.posY);
oCtx.lineWidth = 2;
oCtx.strokeStyle = "rgba(255,0,0,1)";
oCtx.stroke();
}
}
function makeRegionPath(oCtx, nMakeX, nMakeY) {
var aRegion = aMouseRegions[nMakeY][nMakeX];
oCtx.beginPath();
oCtx.moveTo(aRegion[0][0], aRegion[0][1]);
oCtx.lineTo(aRegion[1][0], aRegion[1][1]);
oCtx.lineTo(aRegion[2][0], aRegion[2][1]);
oCtx.lineTo(aRegion[3][0], aRegion[3][1]);
oCtx.closePath();
}
function updateValidMoves() {
var oCtx = oValidCanvas.getContext("2d");
oCtx.clearRect(0, 0, oCnf.i3DWidth, oCnf.i3DHeight);
oCtx.fillStyle = "rgba(0,255,0,0.2)";
if (!oSelectedPiece) { return; }
for (var iValidY = 0; iValidY < 8; iValidY++) {
for (var iValidX = 0; iValidX < 8; iValidX++) {
if (oCnf.isValidMove(oSelectedPiece.posX, oSelectedPiece.posY, iValidX, iValidY)) {
makeRegionPath(oCtx, iValidX, iValidY);
oCtx.fill();
}
}
}
}
function updateInCheckPieces() {
var oInCheck = oInCheckCanvas.getContext("2d");
oInCheck.clearRect(0,0,oCnf.i3DWidth,oCnf.i3DHeight);
oInCheck.fillStyle = "rgba(0,0,255,0.2)";
for (var iSquare = 0; iSquare < oCnf.aThreats.length; iSquare++) {
iThrtndSq = oCnf.aThreats[iSquare]
makeRegionPath(oInCheck, iThrtndSq % 10 - 1, (iThrtndSq - iThrtndSq % 10) / 10 - 2);
oInCheck.fill();
}
}
// removes a piece from the board
function removePiece(oPiece) {
var iPiece;
for (var iPieceId = 0; iPieceId < aPieces.length; iPieceId++) {
iPiece = aPieces[iPieceId];
if (iPiece === oPiece) { Array.prototype.push.apply(aPiecesCasing[iPiece.type], aPieces.splice(iPieceId, 1)); }
}
oScene.removeObject(oPiece.mesh);
}
function pieceByCoords(nHasX, nHasY) {
for (var iId = 0; iId < aPieces.length; iId++) {
if (aPieces[iId].posY === nHasY && aPieces[iId].posX === nHasX) { return(aPieces[iId]); }
}
}
function movePieceTo(oPiece, nToX, nToY) {
var oPos = getBoardPos(nToX, nToY);
oPiece.mesh.setPosition(new Canvas3D.Vec3(oPos.posY, 0, oPos.posX));
oPiece.posX = nToX;
oPiece.posY = nToY;
}
function getBoardPos(posX, posY) { return {posX: posX * 10 - 35, posY: 35 - posY * 10}; }
function clearPieceSelection() {
oSelectedPiece = null;
bPieceSelected = false;
updateSelector();
updateValidMoves();
}
function snapClick(oMsEvnt2) {
if (!oMsEvnt2) { oMsEvnt2 = window.event; }
iMouseDownX = oMsEvnt2.clientX;
iMouseDownY = oMsEvnt2.clientY;
bMouseIsDown = true;
}
function snapDOMScroll(oMsEvnt3) {
if (!oMsEvnt3) { oMsEvnt3 = window.event; }
if (!oMsEvnt3.shiftKey) { return; }
if (oMsEvnt3.detail) { oMsEvnt3.wheelDelta = oMsEvnt3.detail * -40; }
hidePieces();
hideSelector();
hideValidMoves();
oCam.setScale(oMsEvnt3.wheelDelta > 0 ? oCam.getScale() * 1.5 : oCam.getScale() / 1.5)
if (!bUnhideOrdered) {
setTimeout( function() {
showPieces();
bIsRotating = false;
oScene.setDirty(true);
updateMouseRegions();
updateSelector();
updateValidMoves();
showSelector();
showValidMoves();
bUnhideOrdered = false;
}, 100);
bUnhideOrdered = true;
}
if (oMsEvnt3.preventDefault) { oMsEvnt3.preventDefault(); } else { oMsEvnt3.returnValue = false; }
}
function snapMsBtnUp(oMsEvnt4) {
if (!oMsEvnt4) { oMsEvnt4 = window.event; }
bMouseIsDown = false;
if (bIsRotating) {
showPieces();
bIsRotating = false;
oScene.setDirty(true);
updateMouseRegions();
updateSelector();
updateValidMoves();
updateInCheckPieces();
setTimeout(function() { showSelector(); showValidMoves(); showInCheckPieces(); }, 10);
} else {
var oPos = getElementPos(oScene.getInputLayer());
iMouseDownX = oMsEvnt4.clientX - oPos.xAxis;
iMouseDownY = oMsEvnt4.clientY - oPos.yAxis;
var oRegion = checkMouseRegions(oMsEvnt4.clientX - oPos.xAxis, oMsEvnt4.clientY - oPos.yAxis);
if (oRegion) { oCnf.makeSelection(iSelectorY * 10 + iSelectorX + 21, true); }
}
}
function snapMsMove(oMsEvnt5) {
if (!oMsEvnt5) { oMsEvnt5 = window.event; }
if (bMouseIsDown) {
hidePieces();
hideSelector();
hideValidMoves();
hideInCheckPieces();
bIsRotating = true;
var iMouseX = oMsEvnt5.clientX, iMouseY = oMsEvnt5.clientY, fDeltaX = (iMouseX - iMouseDownX) / 3, fDeltaY = -((iMouseY - iMouseDownY) / 3),
// save the old camera position
oOldCamPos = new Canvas3D.Vec3(oCam.getPosition().x, oCam.getPosition().y, oCam.getPosition().z);
// pitch the camera, but if we're not too low or if we're moving the camera up
oCam.pitchAroundTarget(fDeltaY);
if (!((oCam.getPosition().y > 15 || fDeltaY < 0) && (oCam.getPosition().y < 100 || fDeltaY > 0))) { oCam.setPosition(oOldCamPos); }
oCam.yawAroundTarget(fDeltaX);
oCam.lookAt(oCam.getLookAt(), oScene.getUpVector());
oCam.updateRotationMatrix();
iMouseDownX = oMsEvnt5.clientX;
iMouseDownY = oMsEvnt5.clientY;
} else {
var oPos = getElementPos(oScene.getInputLayer()), oRegion = checkMouseRegions(oMsEvnt5.clientX - oPos.xAxis, oMsEvnt5.clientY - oPos.yAxis);
if (oRegion) {
var bNewRegion = false;
if (iSelectorY !== oRegion.regY || iSelectorX !== oRegion.regX) { bNewRegion = true; }
iSelectorX = oRegion.regX;
iSelectorY = oRegion.regY;
if (bNewRegion) { updateSelector(); }
}
}
}
function snapKeyDown(oKeyEvnt2) {
if (!oCnf.bKeyCtrl) { return; }
if (!oKeyEvnt2) { oKeyEvnt2 = window.event; }
var iKeyCode = oKeyEvnt2.keyCode;
if (iKeyCode === 107) { moveZoom(true); } // "+"
else if (iKeyCode === 109) { moveZoom(false); } // "-"
}
function snapKeyPress(oKeyEvnt3) {
if (!oCnf.bKeyCtrl) { return; }
if (!oKeyEvnt3) { oKeyEvnt3 = window.event; }
var iKeyCode = oKeyEvnt3.charCode;
switch (iKeyCode) {
case 49: moveSelector(-1,1); break; // numpad 1
case 50: moveSelector(-1,0); break; // numpad 2
case 51: moveSelector(-1,-1); break; // numpad 3
case 52: moveSelector(0,1); break; // numpad 4
case 53: oCnf.makeSelection(iSelectorY * 10 + iSelectorX + 21, true); break; // numpad 5
case 54: moveSelector(0,-1); break; // numpad 6
case 55: moveSelector(1,1); break; // numpad 7
case 56: moveSelector(1,0); break; // numpad 8
case 57: moveSelector(1,-1); break; // numpad 9
}
}
function createMesh(oMeshData) {
var oMesh = new Canvas3D.Mesh();
oMesh._bShading = true;
oMesh._bWire = false;
oMesh._bFill = true;
oMesh._bZSort = true;
oMesh._bBackfaceCull = true;
oMesh._bTexture = false;
oMesh._bTextureShading = false;
oMesh.setMeshData(oMeshData, oScene);
return(oMesh);
}
function setPieceColor(oPieceMesh, nColor) {
for (var iMat = 0; iMat < oPieceMesh._aMaterials.length; iMat++) {
if (nColor === 0) {
oPieceMesh._aMaterials[iMat].r = 220;
oPieceMesh._aMaterials[iMat].g = 220;
oPieceMesh._aMaterials[iMat].b = 220;
} else {
oPieceMesh._aMaterials[iMat].r = 100;
oPieceMesh._aMaterials[iMat].g = 80;
oPieceMesh._aMaterials[iMat].b = 80;
}
}
}
function getPiece(nType, flagColor, nPutX, nPutY) {
var oNewPiece, nRot = aRots[flagColor | nType << 1], oPos = getBoardPos(nPutX, nPutY);
if (aPiecesCasing[nType].length > 0) {
oNewPiece = aPiecesCasing[nType].pop();
if (oNewPiece.color !== flagColor) {
setPieceColor(oNewPiece.mesh, flagColor);
oNewPiece.color = flagColor;
}
oNewPiece.posX = nPutX;
oNewPiece.posY = nPutY;
} else {
var oNewMesh = createMesh(new oCnf.aPiecesLab[nType]());
setPieceColor(oNewMesh, flagColor);
oNewPiece = {
mesh: oNewMesh,
color: flagColor,
type: nType,
posX: nPutX,
posY: nPutY,
};
}
if (nRot !== 0) { oNewPiece.mesh.setRotation(new Canvas3D.Vec3(0, nRot * fDegRad, 0)); }
oNewPiece.mesh.setPosition(new Canvas3D.Vec3(oPos.posY, 0, oPos.posX));
aPieces.push(oNewPiece);
oScene.addObject(oNewPiece.mesh);
return(oNewPiece);
}
function setupGame() {
var iTypeORColor;
for (var iPieceY = 0; iPieceY < 8; iPieceY++) {
for (var iPieceX = 0; iPieceX < 8; iPieceX++) {
iTypeORColor = oCnf.aBoard[iPieceY * 10 + iPieceX + 21];
if (iTypeORColor > 0) {
getPiece(iTypeORColor - 1 & 7, iTypeORColor >> 3 & 1, iPieceX, iPieceY);
}
}
}
}
function resetCamera() {
var nSize = oCnf.i3DWidth < oCnf.i3DHeight ? oCnf.i3DWidth : oCnf.i3DHeight; // min 200, max 900
oCam.setPosition(new Canvas3D.Vec3(oCnf.bBlackSide ? -50 : 50, nSize > 900 ? 45 : Math.round((nSize * (nSize * 67 - 118700) + 56340000) / 84000), 0));
oCam.lookAt(new Canvas3D.Vec3(0,0,0), oScene.getUpVector());
oCam.updateRotationMatrix();
}
function updateCamera() {
hidePieces();
standbySelector();
resetCamera();
updateMouseRegions();
updateSelector();
updateValidMoves();
updateInCheckPieces();
showPieces();
}
this.oSolidVwArea.style.width = this.i3DWidth + "px";
this.oSolidVwArea.style.height = this.i3DHeight + "px";
oInCheckCanvas.width = this.i3DWidth;
oInCheckCanvas.height = this.i3DHeight;
oInCheckCanvas.style.width = this.i3DWidth + "px";
oInCheckCanvas.style.height = this.i3DHeight + "px";
oInCheckCanvas.style.zIndex = 65;
oInCheckCanvas.style.position = "absolute";
oValidCanvas.width = this.i3DWidth;
oValidCanvas.height = this.i3DHeight;
oValidCanvas.style.width = this.i3DWidth + "px";
oValidCanvas.style.height = this.i3DHeight + "px";
oValidCanvas.style.zIndex = 66;
oValidCanvas.style.position = "absolute";
oSelectorCanvas.width = this.i3DWidth;
oSelectorCanvas.height = this.i3DHeight;
oSelectorCanvas.style.width = this.i3DWidth + "px";
oSelectorCanvas.style.height = this.i3DHeight + "px";
oSelectorCanvas.style.zIndex = 67;
oSelectorCanvas.style.position = "absolute";
oLight1.setPosition(new Canvas3D.Vec3(0,30,0));
oLight1.setIntensity(0.8);
oScene.addLight(oLight1);
oLight2.setPosition(new Canvas3D.Vec3(100,30,100));
oLight2.setIntensity(0.3);
oScene.addLight(oLight2);
oLight3.setPosition(new Canvas3D.Vec3(-100,30,-100));
oLight3.setIntensity(0.3);
oScene.addLight(oLight3);
setupGame();
oCam.setScale(18);
oCam.setFOV(110);
oCam.setFocalDistance(50);
oCam.setReverseX(true);
resetCamera();
oScene.setActiveCamera(oCam);
//oScene.setUpVector(new Canvas3D.Vec3(0,-1,0));
this.oSolidVwArea.appendChild(oSelectorCanvas);
this.oSolidVwArea.appendChild(oValidCanvas);
this.oSolidVwArea.appendChild(oInCheckCanvas);
Canvas3D.addEvent(oScene.getInputLayer(), "mousedown", snapClick);
Canvas3D.addEvent(document.body, "DOMMouseScroll", snapDOMScroll);
Canvas3D.addEvent(document.body, "mouseup", snapMsBtnUp);
Canvas3D.addEvent(document.body, "mousemove", snapMsMove);
Canvas3D.addEvent(document, "keypress", snapKeyPress);
Canvas3D.addEvent(document, "keydown", snapKeyDown);
oScene.begin();
updateMouseRegions();
updateInCheckPieces();
this.bSolidView = true;
return {
show: function() {
oCnf.oSolidVwArea.appendChild(oScene._oDrawCanvas);
oCnf.oSolidVwArea.appendChild(oScene._oInputOverlay);
oCnf.oSolidVwArea.appendChild(oSelectorCanvas);
oCnf.oSolidVwArea.appendChild(oValidCanvas);
oCnf.oSolidVwArea.appendChild(oInCheckCanvas);
oScene.addObject(oBoardMesh);
setupGame();
Canvas3D.addEvent(oScene.getInputLayer(), "mousedown", snapClick);
Canvas3D.addEvent(document.body, "DOMMouseScroll", snapDOMScroll);
Canvas3D.addEvent(document.body, "mouseup", snapMsBtnUp);
Canvas3D.addEvent(document.body, "mousemove", snapMsMove);
Canvas3D.addEvent(document, "keypress", snapKeyPress);
Canvas3D.addEvent(document, "keydown", snapKeyDown);
updateCamera();
oScene.begin();
oCnf.bSolidView = true;
},
hide: function() {
Canvas3D.removeEvent(oScene.getInputLayer(), "mousedown", snapClick);
Canvas3D.removeEvent(document.body, "DOMMouseScroll", snapDOMScroll);
Canvas3D.removeEvent(document.body, "mouseup", snapMsBtnUp);
Canvas3D.removeEvent(document.body, "mousemove", snapMsMove);
Canvas3D.removeEvent(document, "keypress", snapKeyPress);
Canvas3D.removeEvent(document, "keydown", snapKeyDown);
oScene.end();
oCnf.oSolidVwArea.removeChild(oInCheckCanvas);
oCnf.oSolidVwArea.removeChild(oValidCanvas);
oCnf.oSolidVwArea.removeChild(oSelectorCanvas);
oScene.removeAllObjects();
for (var iStop = aPieces.length; iStop > 0; iStop--) {
oPiece = aPieces[iStop - 1];
aPiecesCasing[oPiece.type].push(aPieces.pop());
}
oCnf.oSolidVwArea.removeChild(oScene._oInputOverlay);
oCnf.oSolidVwArea.removeChild(oScene._oDrawCanvas);
oCnf.oSolidVwArea.style.width = "0";
oCnf.bSolidView = false;
},
update: function(bUpdateCamera) {
clearPieceSelection();
for (var iCase = aPieces.length; iCase > 0; iCase--) {
oPiece = aPieces[iCase - 1];
aPiecesCasing[oPiece.type].push(aPieces.pop());
oScene.removeObject(oPiece.mesh);
}
setupGame();
if (bUpdateCamera) { updateCamera(); }
else {
updateValidMoves();
updateInCheckPieces();
}
},
selectPiece: function(nSquareId, bUnselect, bEmph) {
iSelectorX = nSquareId % 10 - 1;
iSelectorY = (nSquareId - nSquareId % 10) / 10 - 2;
if (bUnselect) {
for (var iSel = 0; iSel < aPieces.length; iSel++) {
if (aPieces[iSel].posY === iSelectorY && aPieces[iSel].posX === iSelectorX) {
oPiece = aPieces[iSel];
oSelectedPiece = aPieces[iSel];
bPieceSelected = true;
}
}
if (bEmph) {
updateSelector();
updateValidMoves();
} else {
standbySelector();
var oSCtx = oSelectorCanvas.getContext("2d"), oVCtx = oValidCanvas.getContext("2d");
oSCtx.clearRect(0,0,oCnf.i3DWidth,oCnf.i3DHeight);
oVCtx.clearRect(0,0,oCnf.i3DWidth,oCnf.i3DHeight);
}
} else {
clearPieceSelection();
updateInCheckPieces();
}
},
updateSize: function() {
oCnf.oSolidVwArea.style.width = oCnf.i3DWidth + "px";
oCnf.oSolidVwArea.style.height = oCnf.i3DHeight + "px";
oSelectorCanvas.width = oCnf.i3DWidth;
oSelectorCanvas.height = oCnf.i3DHeight;
oSelectorCanvas.style.width = oCnf.i3DWidth + "px";
oSelectorCanvas.style.height = oCnf.i3DHeight + "px";
oValidCanvas.width = oCnf.i3DWidth;
oValidCanvas.height = oCnf.i3DHeight;
oValidCanvas.style.width = oCnf.i3DWidth + "px";
oValidCanvas.style.height = oCnf.i3DHeight + "px";
oInCheckCanvas.width = oCnf.i3DWidth;
oInCheckCanvas.height = oCnf.i3DHeight;
oInCheckCanvas.style.width = oCnf.i3DWidth + "px";
oInCheckCanvas.style.height = oCnf.i3DHeight + "px";
oScene.setDimensions(oCnf.i3DWidth, oCnf.i3DHeight);
updateCamera();
},
move: function(bBackward, nStartPt, nEndPt, nTarget, nPromoPiece) {
var nStartX = nStartPt % 10 - 1, nStartY = (nStartPt - nStartPt % 10) / 10 - 2, nEndX = nEndPt % 10 - 1, nEndY = (nEndPt - nEndPt % 10) / 10 - 2;
if (bBackward) {
var oSelPiece = pieceByCoords(nEndX, nEndY);
if (nTarget) { getPiece(nTarget - 1 & 7, nTarget >> 3 & 1, nEndX, nEndY); }
else if (oSelPiece.type === 0 && (nStartPt + nEndPt & 1)) { // en passant
getPiece(0, oSelPiece.color ^ 1, nEndX, nStartY);
} else if (oSelPiece.type === 1 && (nEndPt - nStartPt + 2 | 4) === 4) { // castling
var chosenRook = pieceByCoords(nEndPt - nStartPt + 8 >> 1, nEndY);
movePieceTo(chosenRook, 30 - nEndPt + nStartPt >> 2 & 7, nEndY);
chosenRook.posX = 30 - nEndPt + nStartPt >> 2 & 7;
}
if (nPromoPiece) {
removePiece(oSelPiece);
getPiece(0, nEndY >> 2 ^ 1, nStartX, nStartY);
} else { movePieceTo(oSelPiece, nStartX, nStartY); }
} else {
var oSelPiece = pieceByCoords(nStartX, nStartY);
if (nTarget) { removePiece(pieceByCoords(nEndX, nEndY)); }
else if (oSelPiece.type === 0 && (nStartPt + nEndPt & 1)) { // en passant
removePiece(pieceByCoords(nEndX, nStartY));
} else if (oSelPiece.type === 1 && (nEndPt - nStartPt + 2 | 4) === 4) { // castling
var chosenRook = pieceByCoords(30 - nEndPt + nStartPt >> 2 & 7, nEndY);
movePieceTo(chosenRook, nEndPt - nStartPt + 8 >> 1, nEndY);
chosenRook.posX = nEndPt - nStartPt + 8 >> 1;
}
if (nPromoPiece) {
removePiece(oSelPiece);
oSelPiece = getPiece(nPromoPiece - 1 & 7, nEndY >> 2 ^ 1, nEndX, nEndY); }
else { movePieceTo(oSelPiece, nEndX, nEndY); }
}
updateInCheckPieces();
},
updateView: updateCamera
};