Merge pull request #4 from jcfrog/master

adding Wild Tamerlane game
This commit is contained in:
Michel Gutierrez 2017-06-20 01:57:54 +02:00 committed by GitHub
commit d8b9dc46ad
12 changed files with 706 additions and 6 deletions

View file

@ -50,11 +50,12 @@
});
View.Game.cbDefineView = function() {
var gigachessBoardDelta = {
notationMode: "in",
notationDebug: true,
notationMode: "out",
//notationDebug: true,
}
gigachessBoardDelta3d = $.extend(true,{},gigachessBoardDelta,
{
/*'colorFill' : {

View file

@ -1119,6 +1119,17 @@ exports.games = (function () {
"fairy-set-view.js",
"gigachess-view.js"
]
var modelScripts_wtamerlane = [
"base-model.js",
"grid-geo-model.js",
"wild-tamerlane-model.js"
]
var config_view_js_wtamerlane = [
"base-view.js",
"grid-board-view.js",
"fairy-set-view.js",
"wild-tamerlane-view.js"
]
return [
{
"name": "classic-chess",
@ -5033,6 +5044,102 @@ exports.games = (function () {
}
},
"viewScripts": config_view_js_giga
},
{
"name": "wild-tamerlane-chess",
"modelScripts": modelScripts_wtamerlane,
"config": {
"status": true,
"model": {
"title-en": "Wild Tamerlane",
"summary": "Chess on 11x11 with fairy pieces",
"rules": {
"en": "wild-tamerlane-rules.html"
},
"module": "chessbase",
"plazza": "true",
"thumbnail": "wild-tamerlane-thumb.png",
"released": 1497874349,
"credits": {
"en": "wild-tamerlane-credits.html"
},
"gameOptions": config_model_gameOptions,
"obsolete": false,
"js": modelScripts_wtamerlane,
"description": {
"en": "wild-tamerlane-description.html"
},
"levels": config_model_levels_15
},
"view": {
"title-en": "Wild Tamerlane view",
"visuals": {
"600x600": [
"res/visuals/wild-tamerlane-600x600-3d.jpg",
"res/visuals/wild-tamerlane-600x600-2d.jpg"
]
},
"xdView": true,
"css": config_view_css,
"preferredRatio": 1,
"useShowMoves": true,
"useNotation": true,
"module": "chessbase",
"defaultOptions": config_view_defaultOptions,
"skins": [
{
"name": "skin3d",
"title": "3D Classic",
"3d": true,
"preload": [
"smoothedfilegeo|0|/res/ring-target.js",
"image|/res/images/cancel.png",
"image|/res/images/wikipedia.png",
"smoothedfilegeo|0|/res/fairy/pawn/pawn.js",
"image|/res/fairy/pawn/pawn-diffusemap.jpg",
"image|/res/fairy/pawn/pawn-normalmap.jpg",
"smoothedfilegeo|0|/res/fairy/rook/rook.js",
"image|/res/fairy/rook/rook-diffusemap.jpg",
"image|/res/fairy/rook/rook-normalmap.jpg",
"smoothedfilegeo|0|/res/fairy/bishop/bishop.js",
"image|/res/fairy/bishop/bishop-diffusemap.jpg",
"image|/res/fairy/bishop/bishop-normalmap.jpg",
"smoothedfilegeo|0|/res/fairy/knight/knight.js",
"image|/res/fairy/knight/knight-diffusemap.jpg",
"image|/res/fairy/knight/knight-normalmap.jpg",
"smoothedfilegeo|0|/res/fairy/queen/queen.js",
"image|/res/fairy/queen/queen-diffusemap.jpg",
"image|/res/fairy/queen/queen-normalmap.jpg",
"smoothedfilegeo|0|/res/fairy/king/king.js",
"image|/res/fairy/king/king-diffusemap.jpg",
"image|/res/fairy/king/king-normalmap.jpg",
"smoothedfilegeo|0|/res/fairy/elephant/elephant.js",
"image|/res/fairy/elephant/elephant-diffusemap.jpg",
"image|/res/fairy/elephant/elephant-normalmap.jpg",
"smoothedfilegeo|0|/res/fairy/cannon2/cannon2.js",
"image|/res/fairy/cannon2/cannon2-diffusemap.jpg",
"image|/res/fairy/cannon2/cannon2-normalmap.jpg",
"smoothedfilegeo|0|/res/fairy/eagle/eagle.js",
"image|/res/fairy/eagle/eagle-diffusemap.jpg",
"image|/res/fairy/eagle/eagle-normalmap.jpg",
"smoothedfilegeo|0|/res/fairy/camel/camel.js",
"image|/res/fairy/camel/camel-diffusemap.jpg",
"image|/res/fairy/camel/camel-normalmap.jpg"
],
"world": config_view_skins_world,
"camera": config_view_skins_camera
},
config_view_skins_9
],
"animateSelfMoves": false,
"switchable": true,
"sounds": config_view_sounds,
"js": config_view_js_wtamerlane,
"useAutoComplete": true
}
},
"viewScripts": config_view_js_wtamerlane
}
]
})()

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

View file

@ -51,10 +51,11 @@
View.Game.cbDefineView = function() {
var terachessBoardDelta = {
notationMode: "in",
notationDebug: true,
var terachessBoardDelta = {
notationMode: "out",
//notationDebug: true,
}
terachessBoardDelta3d = $.extend(true,{},terachessBoardDelta,
{
/*'colorFill' : {

View file

@ -0,0 +1,6 @@
<h3>Jocly implementation</h3>
<ul>
<li>Development: Jérôme Choain (@<a target="_blank" href="http://twitter.com/jcfrog">jcfrog</a>)</li>
<li>Graphic design: Jérôme Choain (@<a target="_blank" href="http://twitter.com/jcfrog">jcfrog</a>)</li>
<li>Rules and descriptions: <a target="_blank" href="http://history.chess.free.fr/terachess.htm">Jean-Louis Cazaux</a> and Jérôme Choain (@<a target="_blank" href="http://twitter.com/jcfrog">jcfrog</a>)</li>
</ul>

View file

@ -0,0 +1,5 @@
<p>This game is a variant of <a href="http://history.chess.free.fr/tamerlane2.htm">Tamerlane 2000.</a></p>
<p>The fact that strong pieces can only appear after promotion gives an original taste to this large Chess Variant but can appear
as too slow to some modern players. Those looking for strategies around "bloody" battles, may appreciate a simple this variant
where Princes and Ship are replaced by Queens and Eagles (i.e. Gryphons) from the initial set-up.</p>

View file

@ -0,0 +1,233 @@
/*
* Copyright(c) 2013-2014 - jocly.com
*
* You are allowed to use and modify this source code as long as it is exclusively for use in the Jocly API.
*
* Original authors: Jocly team
*
*/
(function() {
var firstRow=0;
var lastRow=10;
var firstCol=0;
var lastCol=10;
var geometry = Model.Game.cbBoardGeometryGrid(11,11);
// graphs
Model.Game.cbEagleGraph = function(geometry){
var $this=this;
var flags = $this.cbConstants.FLAG_MOVE | $this.cbConstants.FLAG_CAPTURE;
var graph={};
for(var pos=0;pos<geometry.boardSize;pos++) {
graph[pos]=[];
[[-1,-1],[-1,1],[1,-1],[1,1]].forEach(function(delta) { // loop on all 4 diagonals
var pos1=geometry.Graph(pos,delta);
if(pos1!=null) {
for(var dir=0;dir<2;dir++) { // dir=0 for row, dir=1 for column
var nbMax = (dir==0) ? lastRow : lastCol;
var away=[] // hold the sliding line
for(var n=1;n<nbMax;n++) {
var delta2=[];
delta2[dir]=delta[dir]*n;
delta2[1-dir]=0; // delta2 is now only about moving orthogonally, away from the piece
var pos2=geometry.Graph(pos1,delta2);
if(pos2!=null) {
if(n==1) // possible to slide at least 1 cell, make sure the diagonal cell is not occupied, but cannot move to this cell
away.push(pos1 | $this.cbConstants.FLAG_STOP);
away.push(pos2 | flags);
}
}
if(away.length>0)
graph[pos].push($this.cbTypedArray(away));
}
}
});
}
return $this.cbMergeGraphs(geometry,
$this.cbShortRangeGraph(geometry,[[-1,-1],[-1,1],[1,-1],[1,1]]),
graph
);
}
var confine = {};
for(var pos=0;pos<geometry.boardSize;pos++) {
confine[pos]=1;
}
Model.Game.cbDefine = function() {
// classic chess pieces
var piecesTypes = {
0: {
name : 'ipawnw',
abbrev : '',
fenAbbrev : 'P',
aspect : 'fr-pawn',
graph : this.cbInitialPawnGraph(geometry,1,confine),
value : 0.6,
initial: [{s:1,p:22},{s:1,p:23},{s:1,p:24},{s:1,p:25},{s:1,p:26},{s:1,p:27},{s:1,p:28},{s:1,p:29},{s:1,p:30},{s:1,p:31},{s:1,p:32}],
epTarget : true,
},
1: {
name : 'ipawnb',
abbrev : '',
fenAbbrev : 'P',
aspect : 'fr-pawn',
graph : this.cbInitialPawnGraph(geometry,-1,confine),
value : 0.6,
initial: [{s:-1,p:88},{s:-1,p:89},{s:-1,p:90},{s:-1,p:91},{s:-1,p:92},{s:-1,p:93},{s:-1,p:94},{s:-1,p:95},{s:-1,p:96},{s:-1,p:97},{s:-1,p:98}],
epTarget : true,
},
2: {
name : 'pawnw',
abbrev : '',
fenAbbrev : 'P',
aspect : 'fr-pawn',
graph : this.cbPawnGraph(geometry,1,confine),
value : 0.6,
initial: [],
epCatch : true,
},
3: {
name : 'pawnb',
abbrev : '',
fenAbbrev : 'P',
aspect : 'fr-pawn',
graph : this.cbPawnGraph(geometry,-1,confine),
value : 0.6,
initial: [],
epCatch : true,
},
4: {
name : 'rook',
abbrev : 'R',
aspect : 'fr-rook',
graph : this.cbRookGraph(geometry,confine),
value : 5,
initial: [{s:1,p:11},{s:1,p:21},{s:-1,p:99},{s:-1,p:109}],
},
5: {
name : 'bishop',
abbrev : 'B',
aspect : 'fr-bishop',
graph : this.cbBishopGraph(geometry,confine),
value : 3.4,
initial: [{s:1,p:13},{s:1,p:19},{s:-1,p:101},{s:-1,p:107}],
},
6: {
name : 'knight',
abbrev : 'N',
aspect : 'fr-knight',
graph : this.cbKnightGraph(geometry,confine),
value : 2.5,
initial: [{s:1,p:12},{s:1,p:20},{s:-1,p:100},{s:-1,p:108}],
},
7: {
name : 'queen',
abbrev : 'Q',
aspect : 'fr-queen',
graph : this.cbQueenGraph(geometry,confine),
value : 8.2,
initial: [{s:1,p:15},{s:1,p:17},{s:-1,p:103},{s:-1,p:105}],
},
8: {
name : 'king',
abbrev : 'K',
aspect : 'fr-king',
graph : this.cbKingGraph(geometry,confine),
isKing : true,
initial: [{s:1,p:16},{s:-1,p:104}],
},
9: {
name : 'elephant',
abbrev : 'E',
aspect : 'fr-elephant',
graph : this.cbShortRangeGraph(geometry,[[-1,-1],[-1,1],[1,-1],[1,1],[-2,-2],[-2,2],[2,-2],[2,2]],confine),
value : 2.5,
initial: [{s:1,p:0},{s:1,p:10},{s:-1,p:110},{s:-1,p:120}],
},
10: {
name : 'cannon',
abbrev : 'C',
aspect : 'fr-cannon2',
graph : this.cbXQCannonGraph(geometry),
value : 4.9,
initial: [{s:1,p:4},{s:1,p:6},{s:-1,p:114},{s:-1,p:116}],
},
11: {
name : 'gryphon',
abbrev : 'G',
aspect : 'fr-eagle',
graph : this.cbEagleGraph(geometry),
value : 7.7,
initial: [{s:1,p:14},{s:1,p:18},{s:-1,p:102},{s:-1,p:106}],
},
12: {
name : 'camel',
abbrev : 'J',
aspect : 'fr-camel',
graph : this.cbShortRangeGraph(geometry,[[-3,-1],[-3,1],[3,-1],[3,1],[1,3],[1,-3],[-1,3],[-1,-3]]),
value : 2.2,
initial: [{s:1,p:2},{s:1,p:8},{s:-1,p:112},{s:-1,p:118}],
},
}
// defining types for readable promo cases
var T_ipawnw=0
var T_ipawnb=1
var T_pawnw=2
var T_pawnb=3
var T_rook=4
var T_bishop=5
var T_knight=6
var T_queen=7
var T_king=8
var T_elephant=9
var T_cannon=10
var T_gryphon=11
var T_camel=12
return {
geometry: geometry,
pieceTypes: piecesTypes,
promote: function(aGame,piece,move) {
// initial pawns promote to pawn
if (piece.t==T_ipawnw)
return [T_pawnw];
if (piece.t==T_ipawnb)
return [T_pawnb];
// pawns promote to Queen
if( ((piece.t==T_pawnw) && geometry.R(move.t)==lastRow) || ((piece.t==T_pawnb) && geometry.R(move.t)==firstRow))
return [T_gryphon,T_queen];
return [];
},
};
}
})();

View file

@ -0,0 +1,124 @@
<style>
.piece-graph {
height: auto;
max-width: 100%;
margin: 0 auto;
display: block;
}
.piece-icon {
width: 70px;
height: auto;
float: left;
margin-right: 10px;
}
.piece-icon-promo {
width: 50px;
height: 50px;
}
#promo {
width: 200px;
margin: 0 auto;
}
</style>
<h1>Initial setup</h1>
<p>The board has 11 x 11 squares. The 11 files respect the original configuration of Tamerlane's Chess with a central King.
The 11 ranks give more space to the game allowing to arrange the piece before struggling. Moreover, they place Bishops
and Camels on same colors allowing attack of opposite counterparts and mutual protection.</p>
<p>
<img class='piece-graph' src='{GAME}/res/rules/wildtamerlane/wild-tamerlane-start.png'>
</p>
<p>There are 28 pieces per side: 1 King, 2 Queens, 2 Gryphons, 2 Bishops, 2 Knights, 2 Rooks, 2 Elephants, 2 Camels, 2 Cannons
and 11 Pawns.</p>
<h1>Pieces</h1>
<h2>King</h2>
<p>
<img class='piece-icon' src='{GAME}/res/fairy/icons/w-king.png'>
</p>
<p class='piece-details'>Moves as in usual Chess, except there is no castling.</p>
<div style='clear:both'></div>
<p>
<img class='piece-graph' src='{GAME}/res/rules/graphs/king.png'>
</p>
<h2>Queen</h2>
<p>
<img class='piece-icon' src='{GAME}/res/fairy/icons/w-queen.png'>
</p>
<p class='piece-details'>Exactly as in usual Chess.</p>
<div style='clear:both'></div>
<p>
<img class='piece-graph' src='{GAME}/res/rules/graphs/queen.png'>
</p>
<h2>Bishop</h2>
<p>
<img class='piece-icon' src='{GAME}/res/fairy/icons/w-bishop.png'>
</p>
<p class='piece-details'>Exactly as in usual Chess.</p>
<div style='clear:both'></div>
<p>
<img class='piece-graph' src='{GAME}/res/rules/graphs/bishop.png'>
</p>
<h2>Knight</h2>
<p>
<img class='piece-icon' src='{GAME}/res/fairy/icons/w-knight.png'>
</p>
<p class='piece-details'>Exactly as in usual Chess.</p>
<div style='clear:both'></div>
<p>
<img class='piece-graph' src='{GAME}/res/rules/graphs/knight.png'>
</p>
<h2>Rook</h2>
<p>
<img class='piece-icon' src='{GAME}/res/fairy/icons/w-rook.png'>
</p>
<p class='piece-details'>Exactly as in usual Chess.</p>
<div style='clear:both'></div>
<p>
<img class='piece-graph' src='{GAME}/res/rules/graphs/rook.png'>
</p>
<h2>Elephant</h2>
<p>
<img class='piece-icon' src='{GAME}/res/fairy/icons/w-elephant.png'>
</p>
<p class='piece-details'>Moves one or two squares diagonally. When an Elephant moves two squares, it is allowed to jump, i.e., the intervening square does not have to be empty. The Elephant moves as the combined Alfil and Firzan (Ferz) from Shatranj, two pieces which were also present in mediaeval Chess and have disappeared with the birth of modern moves for Queen and Bishop.</p>
<div style='clear:both'></div>
<p>
<img class='piece-graph' src='{GAME}/res/rules/graphs/elephant.png'>
</p>
<h2>Camel</h2>
<p>
<img class='piece-icon' src='{GAME}/res/fairy/icons/w-camel.png'>
</p>
<p class='piece-details'>As in Metamachy, a well known piece from medieval Muslim great Chess like Tamerlane's Chess. It jumps to the opposite case of a 2x4 rectangle, like an extended Knight. No matter what intermediate cases contain. Note that it always stays on the same color of square.</p>
<div style='clear:both'></div>
<p>
<img class='piece-graph' src='{GAME}/res/rules/graphs/camel.png'>
</p>
<h2>Cannon</h2>
<p>
<img class='piece-icon' src='{GAME}/res/fairy/icons/w-cannon.png'>
</p>
<p class='piece-details'>moves without taking like a Rook, but it takes by going in a straight horizontal and vertical line and jumping over exactly one piece. When a Cannon takes a piece, there must be exactly one piece between the original and final square of the Cannon's move - this piece may be of either color. (This is identical to the move of the Cannon in Xiangqi.)</p>
<div style='clear:both'></div>
<p>
<img class='piece-graph' src='{GAME}/res/rules/graphs/cannon.png'>
</p>
<h2>Gryphon</h2>
<p>
<img class='piece-icon' src='{GAME}/res/fairy/icons/w-eagle.png'>
</p>
<p class='piece-details'>Moves one square diagonally and then, goes away of an indefinite number of cases vertically or horizontally. It is authorized to go only one square diagonal. It can not jump and the unobstructed path must start with the diagonal movement. This piece is almost as powerful as the Queen and is inspired by the Giraffe from Tamerlane's Chess and the Aanca from Alfonso X's Grande Acedrex. In my other more recent chess variants, this piece is called an Eagle.</p>
<div style='clear:both'></div>
<p>
<img class='piece-graph' src='{GAME}/res/rules/graphs/eagle.png'>
</p>

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -0,0 +1,223 @@
/*
*
*
*
* authors: jerome choain
*
*/
(function() {
function createTexturedPatternCanvas(W,H,texture,clipW,clipH,mask,borderFact){
// borderFact is the percentage (/100) of the mask transition overlay border : ex 30% => .3
var cv = document.createElement('canvas');
cv.width=W;
cv.height=H;
var ctx=cv.getContext('2d');
var maskW=mask.width;
var maskH=mask.height;
var textW=texture.width;
var textH=texture.height;
var tmp = document.createElement('canvas');
ctx.globalCompositeOperation='or';
var y=0;
for (var i=0; y<=(H+clipH/2);i++){
var x=0;
for (var j=0; x<=(W+clipW/2);j++){
tmp.width=clipW; tmp.height=clipH;
ctxTmp=tmp.getContext('2d');
ctxTmp.globalCompositeOperation='xor';
ctxTmp.drawImage(texture, Math.random()*(textW-clipW),Math.random()*(textH-clipH),clipW,clipH,0,0,clipW,clipH);
ctxTmp.drawImage(mask,0,0,clipW,clipH);
ctx.drawImage(tmp,x-clipW/2,y-clipH/2,clipW,clipH);
x+=clipW-borderFact*clipW;
}
y+=clipH-borderFact*clipH;
}
return cv;
}
// Reducing the promo frame which was overflowing the board screen
View.Game.cbPromoSize = 1100;
// extending fairy pieces with some musketeer new pieces
View.Game.cbFairyWTamerlanePieceStyle3D = $.extend(true,{},View.Game.cbFairyPieceStyle3D,{
});
View.Game.cbDefineView = function() {
var wtamerlaneBoardDelta = {
notationMode: "out",
//notationDebug: true,
}
wtamerlaneBoardDelta3d = $.extend(true,{},wtamerlaneBoardDelta,
{
/*'colorFill' : {
".": "#575b36", // "rgba(180,213,80,.3)",
"#": "#474b36", // "black" cells
" ": "rgba(0,0,0,0)",
},*/
'colorFill' : {
"#": "rgba(204,40,0,1)",
".": "rgba(180,180,0,1)",
},
'texturesImg' : {
'crackles': '/res/images/crackles.jpg',
'tiler': '/res/images/tileralpha.png',
},
'3D':true,
'margins' : {x:.47,y:.47},
'extraChannels':[
'bump'
],
paintCell: function(spec,ctx,images,channel,cellType,xCenter,yCenter,cx,cy) {
var tW=images['crackles'].width;
var tH=images['crackles'].height;
var tClipCx=200;
var tClipCy=200;
ctx.fillStyle="#000000";
ctx.fillRect(xCenter-cx/2,yCenter-cy/2,cx,cy);
if(channel=="bump"){
return;
}
cx=.98*cx;
cy=.98*cy;
ctx.save();
ctx.strokeStyle = "rgba(0,0,0,1)";
ctx.lineWidth = 50;
if (channel=='diffuse')
ctx.fillStyle=spec.colorFill[cellType];
else
ctx.fillStyle=0xffffff;
ctx.fillRect(xCenter-cx/2,yCenter-cy/2,cx,cy);
ctx.globalCompositeOperation = 'multiply';
ctx.drawImage(images['crackles'],
Math.random()*(tW-tClipCx),Math.random()*(tH-tClipCy),tClipCx,tClipCy,
xCenter-cx/2,yCenter-cy/2,cx,cy);
ctx.restore();
},
paintBackground: function(spec,ctx,images,channel,bWidth,bHeight) {
ctx.save();
ctx.fillStyle="#ffffff";
if (channel=='diffuse')
ctx.fillStyle="#BA784A";
//ctx.fillStyle="#cc6600";
var cSize = this.cbCSize(spec);
ctx.fillRect(-bWidth/2,-bHeight/2,bWidth,bHeight);
var textureCanvas=createTexturedPatternCanvas(1200,800,images['crackles'],200,200,images['tiler'],.3);
ctx.globalCompositeOperation='multiply';
ctx.drawImage(textureCanvas,-bWidth/2,-bHeight/2,bWidth,bHeight);
ctx.restore();
},
}
);
wtamerlaneBoardDelta2d = $.extend(true,{},wtamerlaneBoardDelta,
{
'colorFill' : {
".": "#ffffc0", // "white" cells
"#": "#8F976D", // "black" cells
" ": "rgba(0,0,0,0)",
},
'texturesImg' : {}, // to avoid default wood texture
'margins' : {x:.47,y:.47},
/*'colorFill' : {
".": "rgba(224,50,0,1)",
"#": "rgba(220,220,0,1)",
},*/
}
);
var wtamerlaneBoard3d = $.extend(true,{},this.cbGridBoardClassic3DMargin,wtamerlaneBoardDelta3d);
var wtamerlaneBoard2d = $.extend(true,{},this.cbGridBoardClassic2DMargin,wtamerlaneBoardDelta2d);
return {
coords: {
"2d": this.cbGridBoard.coordsFn.call(this,wtamerlaneBoard2d),
"3d": this.cbGridBoard.coordsFn.call(this,wtamerlaneBoard3d),
},
boardLayout: [
".#.#.#.#.#.",
"#.#.#.#.#.#",
".#.#.#.#.#.",
"#.#.#.#.#.#",
".#.#.#.#.#.",
"#.#.#.#.#.#",
".#.#.#.#.#.",
"#.#.#.#.#.#",
".#.#.#.#.#.",
"#.#.#.#.#.#",
".#.#.#.#.#.",
],
board: {
"2d": {
draw: this.cbDrawBoardFn(wtamerlaneBoard2d),
},
"3d": {
display: this.cbDisplayBoardFn(wtamerlaneBoard3d),
},
},
clicker: {
"2d": {
width: 1018.1818181818,
height: 1018.1818181818,
},
"3d": {
scale: [0.65454545454545,0.65454545454545,0.65454545454545],
},
},
pieces: this.cbFairyPieceStyle({
"default": {
"2d": {
width: 945.45454545455,
height: 945.45454545455,
},
"3d": {
scale: [0.43636363636364,0.43636363636364,0.43636363636364],
display: this.cbDisplayPieceFn(this.cbFairyWTamerlanePieceStyle3D)
},
},
"fr-amazon" :{
"3d": {
scale: [0.52363636363636,0.52363636363636,0.52363636363636],
}
},
}),
};
}
/* Make the knight jump when moving */
View.Board.cbMoveMidZ = function(aGame,aMove,zFrom,zTo) {
var geo=aGame.cbVar.geometry;
var dx=Math.abs(geo.C(aMove.t)-geo.C(aMove.f));
var dy=Math.abs(geo.R(aMove.t)-geo.R(aMove.f));
if(("_N_E_J_".indexOf("_"+aMove.a+"_")>=0) && (aGame.g.distGraph[aMove.f][aMove.t]>1))
return Math.max(zFrom,zTo)+2000;
/*else if(("__".indexOf("_"+aMove.a+"_")>=0) && dx!=dy && dx!=0 && dy!=0)
return Math.max(zFrom,zTo)+2000;*/
else if(("_C_W_".indexOf("_"+aMove.a+"_")>=0) && aMove.c != null)
return Math.max(zFrom,zTo)+2000;
else
return (zFrom+zTo)/2;
}
})();