|
|
|
|
|
|
|
|
|
|
|
|
|
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}; |
|
} |
|
|
|
|
|
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); |
|
} |
|
} |
|
|
|
|
|
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(); |
|
} |
|
} |
|
|
|
|
|
function updateMouseRegions() { |
|
|
|
|
|
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; |
|
|
|
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); |
|
|
|
|
|
makeRegionPath(oCtx, iSelectorX, iSelectorY); |
|
oCtx.fillStyle = "rgba(255,255,0,0.5)"; |
|
oCtx.fill(); |
|
|
|
if (bPieceSelected) { |
|
|
|
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(); |
|
} |
|
} |
|
|
|
|
|
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), |
|
|
|
oOldCamPos = new Canvas3D.Vec3(oCam.getPosition().x, oCam.getPosition().y, oCam.getPosition().z); |
|
|
|
|
|
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; |
|
case 50: moveSelector(-1,0); break; |
|
case 51: moveSelector(-1,-1); break; |
|
case 52: moveSelector(0,1); break; |
|
case 53: oCnf.makeSelection(iSelectorY * 10 + iSelectorX + 21, true); break; |
|
case 54: moveSelector(0,-1); break; |
|
case 55: moveSelector(1,1); break; |
|
case 56: moveSelector(1,0); break; |
|
case 57: moveSelector(1,-1); break; |
|
} |
|
} |
|
|
|
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; |
|
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); |
|
|
|
|
|
|
|
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)) { |
|
getPiece(0, oSelPiece.color ^ 1, nEndX, nStartY); |
|
} else if (oSelPiece.type === 1 && (nEndPt - nStartPt + 2 | 4) === 4) { |
|
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)) { |
|
removePiece(pieceByCoords(nEndX, nStartY)); |
|
} else if (oSelPiece.type === 1 && (nEndPt - nStartPt + 2 | 4) === 4) { |
|
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 |
|
}; |
|
|