145 lines
4.0 KiB
JavaScript
145 lines
4.0 KiB
JavaScript
var game = require('game').game;
|
|
var perf = require('game').perf;
|
|
var chessground = require('chessground');
|
|
var renderTable = require('./table');
|
|
var renderPromotion = require('../promotion').view;
|
|
var mod = require('game').view.mod;
|
|
var partial = require('chessground').util.partial;
|
|
var button = require('./button');
|
|
var blind = require('../blind');
|
|
var keyboard = require('../keyboard');
|
|
var m = require('mithril');
|
|
|
|
function materialTag(role) {
|
|
return {
|
|
tag: 'mono-piece',
|
|
attrs: {
|
|
class: role
|
|
}
|
|
};
|
|
}
|
|
|
|
function renderMaterial(ctrl, material, checks) {
|
|
var children = [];
|
|
for (var role in material) {
|
|
var piece = materialTag(role);
|
|
var count = material[role];
|
|
var content;
|
|
if (count === 1) content = piece;
|
|
else {
|
|
content = [];
|
|
for (var i = 0; i < count; i++) content.push(piece);
|
|
}
|
|
children.push(m('tomb', content));
|
|
}
|
|
for (var i = 0; i < checks; i++) {
|
|
children.push(m('tomb', m('mono-piece.king[title=Check]')));
|
|
}
|
|
return m('div.cemetery', children);
|
|
}
|
|
|
|
function renderBerserk(ctrl, color, position) {
|
|
if (ctrl.data.game.turns > 1 || !game.playable(ctrl.data)) return;
|
|
if (!ctrl.vm.goneBerserk[color]) return;
|
|
return m('div', {
|
|
class: 'berserk_alert ' + position,
|
|
'data-icon': '`'
|
|
});
|
|
}
|
|
|
|
function wheel(ctrl, e) {
|
|
if (game.isPlayerPlaying(ctrl.data)) return true;
|
|
if (e.deltaY > 0) keyboard.next(ctrl);
|
|
else if (e.deltaY < 0) keyboard.prev(ctrl);
|
|
m.redraw();
|
|
e.preventDefault();
|
|
return false;
|
|
}
|
|
|
|
function renderVariantReminder(ctrl) {
|
|
if (!game.isPlayerPlaying(ctrl.data) || ctrl.data.game.speed !== 'correspondence') return;
|
|
if (ctrl.data.game.variant.key === 'standard') return;
|
|
var icon = perf.icons[ctrl.data.game.perf];
|
|
if (!icon) return;
|
|
return m('div', {
|
|
class: 'variant_reminder is',
|
|
'data-icon': icon,
|
|
config: function(el, isUpdate) {
|
|
if (!isUpdate) setTimeout(function() {
|
|
el.classList.add('gone');
|
|
setTimeout(function() {
|
|
el.remove();
|
|
}, 600);
|
|
}, 800);
|
|
}
|
|
});
|
|
}
|
|
|
|
function visualBoard(ctrl) {
|
|
return m('div.lichess_board_wrap', [
|
|
m('div', {
|
|
class: 'lichess_board ' + ctrl.data.game.variant.key + (ctrl.data.pref.blindfold ? ' blindfold' : ''),
|
|
config: function(el, isUpdate) {
|
|
if (!isUpdate) el.addEventListener('wheel', function(e) {
|
|
return wheel(ctrl, e);
|
|
});
|
|
}
|
|
}, chessground.view(ctrl.chessground)),
|
|
renderPromotion(ctrl),
|
|
renderVariantReminder(ctrl)
|
|
]);
|
|
}
|
|
|
|
function blindBoard(ctrl) {
|
|
return m('div.lichess_board_blind', [
|
|
m('div.textual', {
|
|
config: function(el, isUpdate) {
|
|
if (!isUpdate) blind.init(el, ctrl);
|
|
}
|
|
}),
|
|
chessground.view(ctrl.chessground)
|
|
]);
|
|
}
|
|
|
|
var emptyMaterialDiff = {
|
|
white: [],
|
|
black: []
|
|
};
|
|
|
|
function blursAndHolds(ctrl) {
|
|
var stuff = [];
|
|
['blursOf', 'holdOf'].forEach(function(f) {
|
|
['opponent', 'player'].forEach(function(p) {
|
|
var r = mod[f](ctrl, ctrl.data[p]);
|
|
if (r) stuff.push(r);
|
|
});
|
|
});
|
|
if (stuff.length) return m('div.blurs', stuff);
|
|
}
|
|
|
|
module.exports = function(ctrl) {
|
|
var material = ctrl.data.pref.showCaptured ? chessground.board.getMaterialDiff(ctrl.chessground.data) : emptyMaterialDiff;
|
|
return [
|
|
m('div.top', [
|
|
m('div.lichess_game', {
|
|
config: function(el, isUpdate) {
|
|
if (isUpdate) return;
|
|
$('body').trigger('lichess.content_loaded');
|
|
}
|
|
}, [
|
|
ctrl.data.blind ? blindBoard(ctrl) : visualBoard(ctrl),
|
|
m('div.lichess_ground',
|
|
renderBerserk(ctrl, ctrl.data.opponent.color, 'top'),
|
|
renderMaterial(ctrl, material[ctrl.data.opponent.color], ctrl.data.player.checks),
|
|
renderTable(ctrl),
|
|
renderMaterial(ctrl, material[ctrl.data.player.color], ctrl.data.opponent.checks),
|
|
renderBerserk(ctrl, ctrl.data.player.color, 'bottom'))
|
|
])
|
|
]),
|
|
m('div.underboard', [
|
|
m('div.center', ctrl.chessground.data.premovable.current ? m('div.premove_alert', ctrl.trans('premoveEnabledClickAnywhereToCancel')) : null),
|
|
blursAndHolds(ctrl)
|
|
])
|
|
];
|
|
};
|