parent
52aa3f13e3
commit
afd6558369
|
@ -5166,6 +5166,128 @@ exports.games = (function () {
|
|||
},
|
||||
"viewScripts": config_view_js_giga
|
||||
},
|
||||
{
|
||||
"name": "leychessalpha-chess",
|
||||
"modelScripts": modelScripts_lca,
|
||||
"config": {
|
||||
"status": true,
|
||||
"model": {
|
||||
"title-en": "LeyChessAlpha",
|
||||
"summary": "Chess on 12x12 with fairy pieces",
|
||||
"rules": {
|
||||
"en": "leychessalpha-rules.html"
|
||||
},
|
||||
"module": "chessbase",
|
||||
"plazza": "true",
|
||||
"thumbnail": "leychessalpha-thumb.png",
|
||||
"released": 1402412178,
|
||||
"credits": {
|
||||
"en": "leychessalpha-credits.html"
|
||||
},
|
||||
"gameOptions": config_model_gameOptions,
|
||||
"obsolete": false,
|
||||
"js": modelScripts_lca,
|
||||
"description": {
|
||||
"en": "leychessalpha-description.html"
|
||||
},
|
||||
"levels": config_model_levels_15
|
||||
},
|
||||
"view": {
|
||||
"title-en": "Chessbase view",
|
||||
"visuals": {
|
||||
"600x600": [
|
||||
"res/visuals/leychessalpha-600x600-3d.jpg",
|
||||
"res/visuals/leychessalpha-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/knight/knight.js",
|
||||
"image|/res/fairy/knight/knight-diffusemap.jpg",
|
||||
"image|/res/fairy/knight/knight-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/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/rook/rook.js",
|
||||
"image|/res/fairy/rook/rook-diffusemap.jpg",
|
||||
"image|/res/fairy/rook/rook-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/elephant/elephant.js",
|
||||
"image|/res/fairy/elephant/elephant-diffusemap.jpg",
|
||||
"image|/res/fairy/elephant/elephant-normalmap.jpg",
|
||||
"smoothedfilegeo|0|/res/fairy/admiral/admiral.js",
|
||||
"image|/res/fairy/admiral/admiral-diffusemap.jpg",
|
||||
"image|/res/fairy/admiral/admiral-normalmap.jpg",
|
||||
"smoothedfilegeo|0|/res/fairy/camel/camel.js",
|
||||
"image|/res/fairy/camel/camel-diffusemap.jpg",
|
||||
"image|/res/fairy/camel/camel-normalmap.jpg",
|
||||
"smoothedfilegeo|0|/res/fairy/lion/lion.js",
|
||||
"image|/res/fairy/lion/lion-diffusemap.jpg",
|
||||
"image|/res/fairy/lion/lion-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/unicorn/unicorn.js",
|
||||
"image|/res/fairy/unicorn/unicorn-diffusemap.jpg",
|
||||
"image|/res/fairy/unicorn/unicorn-normalmap.jpg",
|
||||
"smoothedfilegeo|0|/res/fairy/lighthouse/lighthouse.js",
|
||||
"image|/res/fairy/lighthouse/lighthouse-diffusemap.jpg",
|
||||
"image|/res/fairy/lighthouse/lighthouse-normalmap.jpg",
|
||||
"smoothedfilegeo|0|/res/fairy/amazon/amazon.js",
|
||||
"image|/res/fairy/amazon/amazon-diffusemap.jpg",
|
||||
"image|/res/fairy/amazon/amazon-normalmap.jpg",
|
||||
"smoothedfilegeo|0|/res/fairy/cardinal/cardinal.js",
|
||||
"image|/res/fairy/cardinal/cardinal-diffusemap.jpg",
|
||||
"image|/res/fairy/cardinal/cardinal-normalmap.jpg",
|
||||
"smoothedfilegeo|0|/res/fairy/marshall/marshall.js",
|
||||
"image|/res/fairy/marshall/marshall-diffusemap.jpg",
|
||||
"image|/res/fairy/marshall/marshall-normalmap.jpg",
|
||||
"smoothedfilegeo|0|/res/fairy/dragon/dragon.js",
|
||||
"image|/res/fairy/dragon/dragon-diffusemap.jpg",
|
||||
"image|/res/fairy/dragon/dragon-normalmap.jpg",
|
||||
"smoothedfilegeo|0|/res/fairy/crowned-rook/crowned-rook.js",
|
||||
"image|/res/fairy/crowned-rook/crowned-rook-diffusemap.jpg",
|
||||
"image|/res/fairy/crowned-rook/crowned-rook-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_lca,
|
||||
"useAutoComplete": true
|
||||
}
|
||||
},
|
||||
"viewScripts": config_view_js_lca
|
||||
},
|
||||
{
|
||||
"name": "knightet-chess",
|
||||
"modelScripts": modelScripts_k,
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
<p>LeyChessAlpha is a 12*12 Chess Variant with Fairy Pieces based on Metamachy.</p>
|
|
@ -0,0 +1,574 @@
|
|||
/*
|
||||
* Copyright(c) 2013-2017 - 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 geometry = Model.Game.cbBoardGeometryGrid(12,12);
|
||||
|
||||
Model.Game.cbDefine = function() {
|
||||
|
||||
var $this = this;
|
||||
|
||||
/*
|
||||
* Movement/capture graph for the prince
|
||||
*/
|
||||
function PrinceGraph(side) {
|
||||
var graph={};
|
||||
for(var pos=0;pos<geometry.boardSize;pos++) {
|
||||
graph[pos]=[];
|
||||
var forward=[]; // hold the pos line in front of the piece
|
||||
var pos1=geometry.Graph(pos,[0,side]);
|
||||
if(pos1!=null) {
|
||||
forward.push(pos1 | $this.cbConstants.FLAG_MOVE | $this.cbConstants.FLAG_CAPTURE); // capture and move allowed at first forward position
|
||||
pos1=geometry.Graph(pos1,[0,side]);
|
||||
if(pos1!=null)
|
||||
forward.push(pos1 | $this.cbConstants.FLAG_MOVE); // move to second forward only, no capture
|
||||
graph[pos].push($this.cbTypedArray(forward));
|
||||
}
|
||||
}
|
||||
return $this.cbMergeGraphs(geometry,
|
||||
$this.cbShortRangeGraph(geometry,[[-1,-1],[-1,1],[-1,0],[1,0],[1,-1],[1,1],[0,-side]]), // direction other than forward
|
||||
graph // forward direction
|
||||
);
|
||||
}
|
||||
|
||||
/*
|
||||
* Movement/capture graph for the eagle
|
||||
*/
|
||||
function EagleGraph() {
|
||||
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 away=[] // hold the sliding line
|
||||
for(var n=1;n<11;n++) { // board is 12 cells long, so only consider max 11 cell displacements
|
||||
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
|
||||
);
|
||||
}
|
||||
|
||||
return {
|
||||
|
||||
geometry: geometry,
|
||||
|
||||
pieceTypes: {
|
||||
|
||||
0: {
|
||||
name: 'pawn-w',
|
||||
aspect: 'fr-pawn',
|
||||
graph: this.cbPawnGraph(geometry,1),
|
||||
value: 1,
|
||||
abbrev: '',
|
||||
fenAbbrev: 'P',
|
||||
epCatch: false,
|
||||
},
|
||||
|
||||
1: {
|
||||
name: 'ipawn-w',
|
||||
aspect: 'fr-pawn',
|
||||
graph: this.cbInitialPawnGraph(geometry,1),
|
||||
value: 1,
|
||||
abbrev: '',
|
||||
fenAbbrev: 'P',
|
||||
initial: [{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},{s:1,p:33},{s:1,p:34},{s:1,p:35}],
|
||||
epTarget: true,
|
||||
epCatch: false,
|
||||
},
|
||||
|
||||
2: {
|
||||
name: 'pawn-b',
|
||||
aspect: 'fr-pawn',
|
||||
graph: this.cbPawnGraph(geometry,-1),
|
||||
value: 1,
|
||||
abbrev: '',
|
||||
fenAbbrev: 'P',
|
||||
epCatch: false,
|
||||
|
||||
},
|
||||
|
||||
3: {
|
||||
name: 'ipawn-b',
|
||||
aspect: 'fr-pawn',
|
||||
graph: this.cbInitialPawnGraph(geometry,-1),
|
||||
value: 1,
|
||||
abbrev: '',
|
||||
fenAbbrev: 'P',
|
||||
initial: [{s:-1,p:108},{s:-1,p:109},{s:-1,p:110},{s:-1,p:111},{s:-1,p:112},{s:-1,p:113},{s:-1,p:114},{s:-1,p:115},{s:-1,p:116},{s:-1,p:117},{s:-1,p:118},{s:-1,p:119}],
|
||||
epTarget: true,
|
||||
epCatch: false,
|
||||
},
|
||||
|
||||
4: {
|
||||
name: 'knight',
|
||||
aspect: 'fr-knight',
|
||||
graph: this.cbKnightGraph(geometry),
|
||||
value: 2.9,
|
||||
abbrev: 'N',
|
||||
initial: [{s:1,p:14},{s:1,p:21},{s:-1,p:122},{s:-1,p:129}],
|
||||
},
|
||||
|
||||
5: {
|
||||
name: 'bishop',
|
||||
aspect: 'fr-bishop',
|
||||
graph: this.cbBishopGraph(geometry),
|
||||
value: 3.1,
|
||||
abbrev: 'B',
|
||||
initial: [{s:1,p:15},{s:1,p:20},{s:-1,p:123},{s:-1,p:128}],
|
||||
},
|
||||
|
||||
6: {
|
||||
name: 'rook',
|
||||
aspect: 'fr-rook',
|
||||
graph: this.cbRookGraph(geometry),
|
||||
value: 5,
|
||||
abbrev: 'R',
|
||||
initial: [{s:1,p:13},{s:1,p:22},{s:-1,p:121},{s:-1,p:130}],
|
||||
castle: true,
|
||||
},
|
||||
|
||||
7: {
|
||||
name: 'queen',
|
||||
aspect: 'fr-queen',
|
||||
graph: this.cbQueenGraph(geometry),
|
||||
value: 9,
|
||||
abbrev: 'Q',
|
||||
initial: [{s:1,p:18},{s:-1,p:126}],
|
||||
},
|
||||
|
||||
8: {
|
||||
name: 'king',
|
||||
aspect: 'fr-king',
|
||||
isKing: true,
|
||||
graph: this.cbKingGraph(geometry),
|
||||
abbrev: 'K',
|
||||
initial: [{s:1,p:17},{s:-1,p:125}],
|
||||
},
|
||||
|
||||
9: {
|
||||
name: 'cannon',
|
||||
aspect: 'fr-cannon2',
|
||||
graph: this.cbXQCannonGraph(geometry),
|
||||
value: 3.5,
|
||||
abbrev: 'C',
|
||||
initial: [{s:1,p:0},{s:1,p:11},{s:-1,p:132},{s:-1,p:143}],
|
||||
},
|
||||
|
||||
10: {
|
||||
name: 'elephant',
|
||||
aspect: 'fr-elephant',
|
||||
graph: this.cbShortRangeGraph(geometry,[[-1,-1],[-1,1],[1,-1],[1,1],[-2,-2],[-2,2],[2,-2],[2,2]]),
|
||||
value: 2.5,
|
||||
abbrev: 'E',
|
||||
initial: [{s:1,p:12},{s:1,p:23},{s:-1,p:120},{s:-1,p:131}],
|
||||
},
|
||||
|
||||
11: {
|
||||
name: 'prince-w',
|
||||
aspect: 'fr-admiral',
|
||||
graph: PrinceGraph(1),
|
||||
value: 3,
|
||||
epTarget: true,
|
||||
abbrev: 'I',
|
||||
initial: [{s:1,p:16},{s:1,p:19}],
|
||||
},
|
||||
|
||||
12: {
|
||||
name: 'prince-b',
|
||||
aspect: 'fr-admiral',
|
||||
graph: PrinceGraph(-1),
|
||||
epTarget: true,
|
||||
value: 3,
|
||||
abbrev: 'I',
|
||||
initial: [{s:-1,p:124},{s:-1,p:127}],
|
||||
},
|
||||
|
||||
|
||||
13: {
|
||||
name: 'camel',
|
||||
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,
|
||||
abbrev: 'M',
|
||||
initial: [{s:1,p:1},{s:1,p:10},{s:-1,p:133},{s:-1,p:142}],
|
||||
},
|
||||
|
||||
14: {
|
||||
name: 'lion',
|
||||
aspect: 'fr-lion',
|
||||
graph: this.cbShortRangeGraph(geometry,[
|
||||
[-1,-1],[-1,1],[1,-1],[1,1],[1,0],[0,1],[-1,0],[0,-1],
|
||||
[-2,0],[-2,-1],[-2,-2],[-1,-2],[0,-2],
|
||||
[1,-2],[2,-2],[2,-1],[2,0],[2,1],
|
||||
[2,2],[1,2],[0,2],[-1,2],[-2,2],[-2,1]]),
|
||||
value: 7.5,
|
||||
abbrev: 'L',
|
||||
initial: [{s:1,p:5},{s:-1,p:137}],
|
||||
},
|
||||
15: {
|
||||
name: 'eagle',
|
||||
aspect: 'fr-eagle',
|
||||
graph: EagleGraph(),
|
||||
value: 8,
|
||||
abbrev: 'A',
|
||||
initial: [{s:1,p:6},{s:-1,p:138}],
|
||||
},
|
||||
16: {
|
||||
name: 'unicorn',
|
||||
aspect: 'fr-unicorn',
|
||||
graph: this.cbMergeGraphs(geometry,
|
||||
this.cbShortRangeGraph(geometry,[
|
||||
[-2,-2],[-2,0],[-2,2],[0,2],[2,2],[2,0],[2,-2],[0,-2],
|
||||
[-3,-3],[-3,0],[-3,3],[0,3],[3,3],[3,0],[3,-3],[0,-3]]),
|
||||
this.cbKingGraph(geometry),
|
||||
this.cbKnightGraph(geometry),
|
||||
this.cbLongRangeGraph(geometry,[[2,-1],[2,1],[-2,-1],[-2,1],[-1,2],[-1,-2],[1,2],[1,-2]]),
|
||||
this.cbShortRangeGraph(geometry,[[-3,-1],[-3,1],[3,-1],[3,1],[1,3],[1,-3],[-1,3],[-1,-3]])
|
||||
),
|
||||
value: 13,
|
||||
abbrev: 'Pa',
|
||||
initial: [{s:1,p:2},{s:-1,p:134}],
|
||||
},
|
||||
17: {
|
||||
name: 'dragon',
|
||||
aspect: 'fr-dragon',
|
||||
graph: this.cbMergeGraphs(geometry,
|
||||
this.cbQueenGraph(geometry),
|
||||
EagleGraph()),
|
||||
value: 14,
|
||||
abbrev: 'D',
|
||||
initial: [{s:1,p:4},{s:-1,p:136}],
|
||||
},
|
||||
18: {
|
||||
name: 'lighthouse',
|
||||
aspect: 'fr-lighthouse',
|
||||
graph: this.cbMergeGraphs(geometry,
|
||||
this.cbQueenGraph(geometry),
|
||||
this.cbXQCannonGraph(geometry),
|
||||
this.cbLongRangeGraph(geometry,[[1,-1],[-1,-1],[-1,1],[1,1]],null,this.cbConstants.FLAG_MOVE | this.cbConstants.FLAG_SCREEN_CAPTURE)),
|
||||
value: 12,
|
||||
abbrev: 'LH',
|
||||
initial: [{s:1,p:3},{s:-1,p:135}],
|
||||
},
|
||||
19: {
|
||||
name: 'emperor',
|
||||
aspect: 'fr-crowned-rook',
|
||||
graph: this.cbMergeGraphs(geometry,
|
||||
this.cbQueenGraph(geometry),
|
||||
this.cbXQCannonGraph(geometry),
|
||||
this.cbLongRangeGraph(geometry,[[1,-1],[-1,-1],[-1,1],[1,1]],null,this.cbConstants.FLAG_MOVE | this.cbConstants.FLAG_SCREEN_CAPTURE),
|
||||
EagleGraph(),
|
||||
this.cbShortRangeGraph(geometry,[
|
||||
[-2,-2],[-2,0],[-2,2],[0,2],[2,2],[2,0],[2,-2],[0,-2],
|
||||
[-3,-3],[-3,0],[-3,3],[0,3],[3,3],[3,0],[3,-3],[0,-3]]),
|
||||
this.cbKnightGraph(geometry),
|
||||
this.cbLongRangeGraph(geometry,[[2,-1],[2,1],[-2,-1],[-2,1],[-1,2],[-1,-2],[1,2],[1,-2]]),
|
||||
this.cbShortRangeGraph(geometry,[[-3,-1],[-3,1],[3,-1],[3,1],[1,3],[1,-3],[-1,3],[-1,-3]])),
|
||||
value: 20,
|
||||
abbrev: 'EM',
|
||||
},
|
||||
20: {
|
||||
name: 'commander',
|
||||
aspect: 'fr-amazon',
|
||||
graph: this.cbMergeGraphs(geometry,
|
||||
this.cbQueenGraph(geometry),
|
||||
this.cbKnightGraph(geometry)),
|
||||
value: 13,
|
||||
abbrev: 'Co',
|
||||
initial: [{s:1,p:7},{s:-1,p:139}],
|
||||
},
|
||||
|
||||
21: {
|
||||
name: 'cardinal',
|
||||
aspect: 'fr-cardinal',
|
||||
graph: this.cbMergeGraphs(geometry,
|
||||
this.cbBishopGraph(geometry),
|
||||
this.cbKnightGraph(geometry)),
|
||||
value: 6,
|
||||
abbrev: 'Ca',
|
||||
initial: [{s:1,p:9},{s:-1,p:141}],
|
||||
},
|
||||
|
||||
22: {
|
||||
name: 'chancellor',
|
||||
aspect: 'fr-marshall',
|
||||
graph: this.cbMergeGraphs(geometry,
|
||||
this.cbRookGraph(geometry),
|
||||
this.cbKnightGraph(geometry)),
|
||||
value: 9,
|
||||
abbrev: 'Ch',
|
||||
initial: [{s:1,p:8},{s:-1,p:140}],
|
||||
castle: true,
|
||||
},
|
||||
},
|
||||
|
||||
promote: function(aGame,piece,move) {
|
||||
if(piece.t==1 && geometry.R(move.t)==11)
|
||||
return [14,15,20,16,17,18];
|
||||
else if(piece.t==3 && geometry.R(move.t)==0)
|
||||
return [14,15,20,16,17,18];
|
||||
else if(piece.t==11 && geometry.R(move.t)==11)
|
||||
return [19];
|
||||
else if(piece.t==12 && geometry.R(move.t)==0)
|
||||
return [19];
|
||||
return [];
|
||||
},
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
* Model.Board.GenerateMoves:
|
||||
* - handle setup phase
|
||||
* - handle king special move: a kind of castle involving only the king
|
||||
*/
|
||||
var kingLongMoves={
|
||||
"1": {
|
||||
17: [ [15,16],[19,18],[41,29],[39,28],[43,30],[3,4,16],[27,16,28],[40,28,29],[42,29,30],[31,18,30],[7,18,6] ],
|
||||
5: [ [3,4],[7,8],[29,17],[27,16],[31,18],[15,4,6],[28,16,17],[30,17,18],[19,6,18] ],
|
||||
},
|
||||
"-1": {
|
||||
125: [ [127,126],[123,124],[101,113],[99,112],[103,114],[135,124,136],[111,112,124],[100,112,113],[102,113,114],[115,114,126],[139,126,138] ],
|
||||
137: [ [139,138],[135,136],[113,125],[115,126],[111,124],[127,126,138],[114,125,126],[112,124,125],[123,124,136] ],
|
||||
},
|
||||
}
|
||||
var SuperModelBoardGenerateMoves=Model.Board.GenerateMoves;
|
||||
Model.Board.GenerateMoves = function(aGame) {
|
||||
// first moves (white and black) are managed specifically to setup K,Q,E,L initial position
|
||||
if(this.setupState===undefined) {
|
||||
this.mMoves=[{}];
|
||||
return;
|
||||
}
|
||||
if(this.setupState=="setup") {
|
||||
this.mMoves=[];
|
||||
for(var i=0;i<12;i++)
|
||||
this.mMoves.push({setup:i});
|
||||
return;
|
||||
}
|
||||
SuperModelBoardGenerateMoves.apply(this,arguments); // call regular GenerateMoves method
|
||||
// now consider special 2 cases king moves
|
||||
var kPiece=this.pieces[this.board[this.kings[this.mWho]]];
|
||||
if(!kPiece.m && !this.check) {
|
||||
var lMoves=kingLongMoves[this.mWho][kPiece.p];
|
||||
for(var i=0;i<lMoves.length;i++) {
|
||||
var lMove=lMoves[i];
|
||||
if(this.board[lMove[0]]>=0)
|
||||
continue;
|
||||
var canMove=true;
|
||||
var oppInCheck=false;
|
||||
for(var j=0;j<lMove.length;j++) {
|
||||
var pos=lMove[j];
|
||||
var tmpOut=this.board[pos];
|
||||
this.board[pos]=-1; // remove possible piece to prevent problems when quick-applying/unapplying
|
||||
var undo=this.cbQuickApply(aGame,{
|
||||
f: kPiece.p,
|
||||
t: pos,
|
||||
});
|
||||
var inCheck=this.cbGetAttackers(aGame,pos,this.mWho,true).length>0;
|
||||
if(!inCheck && j==0)
|
||||
oppInCheck=this.cbGetAttackers(aGame,this.kings[-this.mWho],-this.mWho,true).length>0;
|
||||
this.cbQuickUnapply(aGame,undo);
|
||||
this.board[pos]=tmpOut;
|
||||
this.cbIntegrity(aGame);
|
||||
if(inCheck) {
|
||||
canMove=false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(canMove)
|
||||
this.mMoves.push({
|
||||
f: kPiece.p,
|
||||
t: lMove[0],
|
||||
c: null,
|
||||
ck: oppInCheck,
|
||||
a: 'K',
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Model.Board.CopyFrom overriding to copy setupState property
|
||||
*/
|
||||
var SuperModelBoardCopyFrom = Model.Board.CopyFrom;
|
||||
Model.Board.CopyFrom = function(aBoard) {
|
||||
SuperModelBoardCopyFrom.apply(this,arguments);
|
||||
this.setupState = aBoard.setupState;
|
||||
}
|
||||
|
||||
/*
|
||||
* Model.Board.Evaluate overriding: in setup phase, no evaluation
|
||||
*/
|
||||
var SuperModelBoardEvaluate = Model.Board.Evaluate;
|
||||
Model.Board.Evaluate = function(aGame) {
|
||||
if(this.setupState===undefined || this.setupState=="setup")
|
||||
return;
|
||||
SuperModelBoardEvaluate.apply(this,arguments);
|
||||
}
|
||||
|
||||
/*
|
||||
* Model.Board.ApplyMove overriding: setup phase and king special move
|
||||
*/
|
||||
var SuperModelBoardApplyMove=Model.Board.ApplyMove;
|
||||
Model.Board.ApplyMove = function(aGame,move) {
|
||||
if(this.setupState===undefined)
|
||||
this.setupState="setup";
|
||||
else if(this.setupState=="setup") {
|
||||
var $this=this, piece;
|
||||
// at this point, KQLE have arbitrary positions. remember those piece indexes so we can move them
|
||||
var starting={
|
||||
"1": { K: 17, Q: 18, L: 5, E: 6 },
|
||||
"-1": { K: 125, Q: 126, L: 137, E: 138 },
|
||||
}
|
||||
var indexes={ "1": {}, "-1": {} };
|
||||
["1","-1"].forEach(function(side) {
|
||||
for(var p in starting[side])
|
||||
indexes[side][p]=$this.board[starting[side][p]];
|
||||
});
|
||||
// remove KQLE from the board
|
||||
[5,6,17,18,125,126,137,138].forEach(function(pos) {
|
||||
var pIndex=$this.board[pos];
|
||||
$this.board[pos]=-1;
|
||||
piece = $this.pieces[pIndex];
|
||||
piece.p=-1;
|
||||
$this.zSign=aGame.zobrist.update($this.zSign,"board",piece.t,pos);
|
||||
});
|
||||
// setup KQLE positions according to the setup
|
||||
var setup=move.setup;
|
||||
var remaining={};
|
||||
if(setup/6<1) {
|
||||
this.board[17]=indexes[1].K;
|
||||
piece = this.pieces[indexes[1].K];
|
||||
piece.p=17;
|
||||
$this.zSign=aGame.zobrist.update($this.zSign,"board",piece.t,17);
|
||||
this.kings[1]=17;
|
||||
remaining[1]=[18,5,6];
|
||||
this.board[125]=indexes[-1].K;
|
||||
piece = this.pieces[indexes[-1].K];
|
||||
piece.p=125;
|
||||
$this.zSign=aGame.zobrist.update($this.zSign,"board",piece.t,125);
|
||||
this.kings[-1]=125;
|
||||
remaining[-1]=[126,137,138];
|
||||
} else {
|
||||
this.board[5]=indexes[1].K;
|
||||
piece = this.pieces[indexes[1].K];
|
||||
piece.p=5;
|
||||
$this.zSign=aGame.zobrist.update($this.zSign,"board",piece.t,5);
|
||||
this.kings[1]=5;
|
||||
remaining[1]=[17,18,6];
|
||||
this.board[137]=indexes[-1].K;
|
||||
piece = this.pieces[indexes[-1].K];
|
||||
piece.p=137;
|
||||
$this.zSign=aGame.zobrist.update($this.zSign,"board",piece.t,137);
|
||||
this.kings[-1]=137;
|
||||
remaining[-1]=[125,126,138];
|
||||
}
|
||||
setup%=6;
|
||||
var queen=Math.floor(setup/2);
|
||||
this.board[remaining[1][queen]]=indexes[1].Q;
|
||||
piece = this.pieces[indexes[1].Q];
|
||||
piece.p=remaining[1][queen];
|
||||
$this.zSign=aGame.zobrist.update($this.zSign,"board",piece.t,remaining[1][queen]);
|
||||
remaining[1].splice(queen,1);
|
||||
this.board[remaining[-1][queen]]=indexes[-1].Q;
|
||||
piece = this.pieces[indexes[-1].Q];
|
||||
piece.p=remaining[-1][queen];
|
||||
$this.zSign=aGame.zobrist.update($this.zSign,"board",piece.t,remaining[-1][queen]);
|
||||
remaining[-1].splice(queen,1);
|
||||
var eagle,lion;
|
||||
setup%=2;
|
||||
if(setup==0) {
|
||||
eagle=0;
|
||||
lion=1;
|
||||
} else {
|
||||
eagle=1;
|
||||
lion=0;
|
||||
}
|
||||
this.board[remaining[1][eagle]]=indexes[1].E;
|
||||
piece = this.pieces[indexes[1].E];
|
||||
piece.p=remaining[1][eagle];
|
||||
$this.zSign=aGame.zobrist.update($this.zSign,"board",piece.t,remaining[1][eagle]);
|
||||
this.board[remaining[1][lion]]=indexes[1].L;
|
||||
piece = this.pieces[indexes[1].L];
|
||||
piece.p=remaining[1][lion];
|
||||
$this.zSign=aGame.zobrist.update($this.zSign,"board",piece.t,remaining[1][lion]);
|
||||
|
||||
this.board[remaining[-1][eagle]]=indexes[-1].E;
|
||||
piece = this.pieces[indexes[-1].E];
|
||||
piece.p=remaining[-1][eagle];
|
||||
$this.zSign=aGame.zobrist.update($this.zSign,"board",piece.t,remaining[-1][eagle]);
|
||||
this.board[remaining[-1][lion]]=indexes[-1].L;
|
||||
piece = this.pieces[indexes[-1].L];
|
||||
piece.p=remaining[-1][lion];
|
||||
$this.zSign=aGame.zobrist.update($this.zSign,"board",piece.t,remaining[1][lion]);
|
||||
|
||||
this.setupState="done";
|
||||
} else
|
||||
SuperModelBoardApplyMove.apply(this,arguments);
|
||||
}
|
||||
|
||||
/*
|
||||
* Model.Move.ToString overriding for setup notation
|
||||
*/
|
||||
var SuperModelMoveToString = Model.Move.ToString;
|
||||
Model.Move.ToString = function() {
|
||||
if(this.f===undefined) {
|
||||
if(this.setup===undefined)
|
||||
return "--";
|
||||
else
|
||||
return "#"+this.setup;
|
||||
}
|
||||
return SuperModelMoveToString.apply(this,arguments);
|
||||
}
|
||||
|
||||
/*
|
||||
* Model.Board.CompactMoveString overriding to help reading PJN game transcripts
|
||||
*/
|
||||
var SuperModelBoardCompactMoveString = Model.Board.CompactMoveString;
|
||||
Model.Board.CompactMoveString = function(aGame,aMove,allMoves) {
|
||||
if(typeof aMove.ToString!="function") // ensure proper move object, if necessary
|
||||
aMove=aGame.CreateMove(aMove);
|
||||
if(this.setupState===undefined || this.setupState=="setup")
|
||||
return aMove.ToString();
|
||||
return SuperModelBoardCompactMoveString.apply(this,arguments);
|
||||
}
|
||||
|
||||
/*
|
||||
* Model.Board.StaticGenerateMoves overriding to prevent using AI during the setup phase
|
||||
*/
|
||||
Model.Board.StaticGenerateMoves = function(aGame) {
|
||||
if(this.setupState=="setup")
|
||||
return [aGame.CreateMove({setup:Math.floor(Math.random()*12)})];
|
||||
return null;
|
||||
}
|
||||
|
||||
})();
|
|
@ -0,0 +1,220 @@
|
|||
/*
|
||||
* Copyright(c) 2013-2017 - 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() {
|
||||
|
||||
View.Game.cbDefineView = function() {
|
||||
|
||||
var metamachyBoardDelta = {
|
||||
//notationMode: 'in',
|
||||
//notationDebug: true,
|
||||
};
|
||||
var metamachyBoard3d = $.extend(true,{},this.cbGridBoardClassic3DMargin,metamachyBoardDelta);
|
||||
var metamachyBoard2d = $.extend(true,{},this.cbGridBoardClassic2DNoMargin,metamachyBoardDelta);
|
||||
|
||||
return {
|
||||
coords: {
|
||||
"2d": this.cbGridBoard.coordsFn.call(this,metamachyBoard2d),
|
||||
"3d": this.cbGridBoard.coordsFn.call(this,metamachyBoard3d),
|
||||
},
|
||||
boardLayout: [
|
||||
".#.#.#.#.#.#",
|
||||
"#.#.#.#.#.#.",
|
||||
".#.#.#.#.#.#",
|
||||
"#.#.#.#.#.#.",
|
||||
".#.#.#.#.#.#",
|
||||
"#.#.#.#.#.#.",
|
||||
".#.#.#.#.#.#",
|
||||
"#.#.#.#.#.#.",
|
||||
".#.#.#.#.#.#",
|
||||
"#.#.#.#.#.#.",
|
||||
".#.#.#.#.#.#",
|
||||
"#.#.#.#.#.#.",
|
||||
],
|
||||
board: {
|
||||
"2d": {
|
||||
draw: this.cbDrawBoardFn(metamachyBoard2d),
|
||||
},
|
||||
"3d": {
|
||||
display: this.cbDisplayBoardFn(metamachyBoard3d),
|
||||
},
|
||||
},
|
||||
clicker: {
|
||||
"2d": {
|
||||
width: 1000,
|
||||
height: 1000,
|
||||
},
|
||||
"3d": {
|
||||
scale: [.6,.6,.6],
|
||||
},
|
||||
},
|
||||
pieces: this.cbFairyPieceStyle({
|
||||
"default": {
|
||||
"3d": {
|
||||
scale: [.4,.4,.4],
|
||||
},
|
||||
"2d": {
|
||||
width: 900,
|
||||
height: 900,
|
||||
},
|
||||
},
|
||||
}),
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
* Make the knight & the camel jump when moving, the elephant & the lion when moving 2 squares, the cannon when capturing
|
||||
*/
|
||||
View.Board.cbMoveMidZ = function(aGame,aMove,zFrom,zTo) {
|
||||
if(aMove.a=='N' || aMove.a=='M' || (aMove.a=='E' && aGame.g.distGraph[aMove.f][aMove.t]==2) || (aMove.a=='L' && aGame.g.distGraph[aMove.f][aMove.t]==2) || (aMove.a=='K' && aGame.g.distGraph[aMove.f][aMove.t]==2) || (aMove.a=='C' && aMove.c!=null))
|
||||
return Math.max(zFrom,zTo)+1500;
|
||||
else
|
||||
return (zFrom+zTo)/2;
|
||||
}
|
||||
|
||||
/*
|
||||
* View.Game.xdInit overriding to create initial setup gadgets
|
||||
*/
|
||||
var SuperViewGameXdInit = View.Game.xdInit;
|
||||
View.Game.xdInit = function(xdv) {
|
||||
var $this=this;
|
||||
SuperViewGameXdInit.apply(this,arguments);
|
||||
var size=600;
|
||||
xdv.createGadget("setup-board",{
|
||||
base: {
|
||||
type: "element",
|
||||
x: 0,
|
||||
y: 0,
|
||||
width: size*12,
|
||||
height: size*9,
|
||||
z: 108,
|
||||
css: {
|
||||
"background-color": "White",
|
||||
},
|
||||
},
|
||||
});
|
||||
var setups={
|
||||
0: "KQEL",
|
||||
1: "KQLE",
|
||||
2: "KEQL",
|
||||
3: "KLQE",
|
||||
4: "KELQ",
|
||||
5: "KLEQ",
|
||||
6: "QEKL",
|
||||
7: "QLKE",
|
||||
8: "EQKL",
|
||||
9: "LQKE",
|
||||
10: "ELKQ",
|
||||
11: "LEKQ",
|
||||
}
|
||||
var imageOffsets={
|
||||
K: 500, Q: 400, E: 1100, L: 1200,
|
||||
}
|
||||
for(var setup in setups) {
|
||||
(function(setup) {
|
||||
var x=((setup%4)-1.5)*3*size;
|
||||
var y=(Math.floor(setup/4)-1)*3*size;
|
||||
xdv.createGadget("setup#"+setup,{
|
||||
base: {
|
||||
type: "canvas",
|
||||
x: x,
|
||||
y: y,
|
||||
width: 2*size,
|
||||
height: 2*size,
|
||||
z: 109,
|
||||
draw: function(ctx) {
|
||||
ctx.fillStyle="#c0c0c0";
|
||||
ctx.rect(-size,-size,size*2,size*2);
|
||||
ctx.fill();
|
||||
ctx.save();
|
||||
this.getResource("image|"+$this.g.fullPath+"/res/fairy/wikipedia-fairy-sprites.png",function(image) {
|
||||
for(var i=0;i<4;i++) {
|
||||
var x=i%2, y=Math.floor(i/2), p=setups[setup].charAt(i);
|
||||
ctx.drawImage(image,imageOffsets[p],0,100,100,(x-1)*size,(y-1)*size,size,size);
|
||||
}
|
||||
ctx.restore();
|
||||
});
|
||||
}
|
||||
},
|
||||
});
|
||||
})(setup);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* View.Board.xdInput overriding to handle setup phase
|
||||
*/
|
||||
var SuperViewBoardxdInput = View.Board.xdInput;
|
||||
View.Board.xdInput = function(xdv, aGame) {
|
||||
if(this.setupState===undefined) {
|
||||
return {
|
||||
initial: {},
|
||||
getActions: function(moves,currentInput) { return null; },
|
||||
}
|
||||
} else if(this.setupState=="setup") {
|
||||
return {
|
||||
initial: {
|
||||
setupDone: false,
|
||||
},
|
||||
getActions: function(moves,currentInput) {
|
||||
var actions={};
|
||||
if(!currentInput.setupDone) {
|
||||
moves.forEach(function(move) {
|
||||
actions[move.setup]={
|
||||
view: ["setup#"+move.setup],
|
||||
click: ["setup#"+move.setup],
|
||||
moves: [move],
|
||||
validate: { setupDone: true },
|
||||
}
|
||||
});
|
||||
}
|
||||
return actions;
|
||||
},
|
||||
furnitures: ["setup-board"],
|
||||
}
|
||||
} else
|
||||
return SuperViewBoardxdInput.apply(this,arguments);
|
||||
}
|
||||
|
||||
/*
|
||||
* View.Board.cbAnimate overriding to prevent animation on setup
|
||||
*/
|
||||
var SuperViewBoardcbAnimate = View.Board.cbAnimate;
|
||||
View.Board.cbAnimate = function(xdv,aGame,aMove,callback) {
|
||||
if(this.setupState===undefined || this.setupState=="setup")
|
||||
callback();
|
||||
else
|
||||
SuperViewBoardcbAnimate.apply(this,arguments);
|
||||
}
|
||||
|
||||
/*
|
||||
* View.Board.xdDisplay overriding to prevent displaying KQEL before setup
|
||||
*/
|
||||
var SuperViewBoardxdDisplay = View.Board.xdDisplay;
|
||||
View.Board.xdDisplay = function(xdv, aGame) {
|
||||
if(this.setupState===undefined || this.setupState=="setup") {
|
||||
var $this=this;
|
||||
var hidden={};
|
||||
[5,6,17,18,125,126,137,138].forEach(function(pos) {
|
||||
var pIndex=$this.board[pos];
|
||||
hidden[pos]=pIndex;
|
||||
$this.pieces[pIndex].p=-1;
|
||||
});
|
||||
SuperViewBoardxdDisplay.apply(this,arguments);
|
||||
for(var pos in hidden)
|
||||
this.pieces[hidden[pos]].p=parseInt(pos);
|
||||
} else
|
||||
SuperViewBoardxdDisplay.apply(this,arguments);
|
||||
}
|
||||
|
||||
})();
|
||||
|
Loading…
Reference in New Issue