display cumulative waiting time since each player's first move
This commit is contained in:
parent
3bae819cb2
commit
0df3a7c647
|
|
@ -207,6 +207,33 @@ button#settings, button#cb_choose_game {
|
||||||
color: grey;
|
color: grey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#cb_times {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: row nowrap;
|
||||||
|
white-space: nowrap;
|
||||||
|
justify-content: stretch;
|
||||||
|
align-items: flex-end;
|
||||||
|
width: 100%;
|
||||||
|
padding-left: 3rem;
|
||||||
|
padding-right: 3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cb_times.cb-hide-times {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cb_light_time, #cb_dark_time {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cb_light_time {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cb_dark_time {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
#cb_names {
|
#cb_names {
|
||||||
position: relative;
|
position: relative;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
|
||||||
|
|
@ -167,6 +167,10 @@
|
||||||
<input id="cb_dark_name" autocomplete="off" placeholder="Dark">
|
<input id="cb_dark_name" autocomplete="off" placeholder="Dark">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="cb_times" class="cb-hide-if-private">
|
||||||
|
<div id="cb_light_time">0:00:00</div>
|
||||||
|
<div id="cb_dark_time">0:00:00</div>
|
||||||
|
</div>
|
||||||
<div id="cb_navigate">
|
<div id="cb_navigate">
|
||||||
<button id="cb_undo" title="Undo" type="button" disabled="true"><span class="fas fa-undo"></span></button>
|
<button id="cb_undo" title="Undo" type="button" disabled="true"><span class="fas fa-undo"></span></button>
|
||||||
<button id="cb_redo" title="Redo" type="button" disabled="true"><span class="fas fa-redo"></span></button>
|
<button id="cb_redo" title="Redo" type="button" disabled="true"><span class="fas fa-redo"></span></button>
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ ElementQueries.listen();
|
||||||
|
|
||||||
import {Buffer} from 'buffer';
|
import {Buffer} from 'buffer';
|
||||||
import pako from 'pako';
|
import pako from 'pako';
|
||||||
|
import {sprintf} from 'sprintf-js';
|
||||||
|
|
||||||
/* "Waterdrop" by Porphyr (freesound.org/people/Porphyr) / CC BY 3.0 (creativecommons.org/licenses/by/3.0) */
|
/* "Waterdrop" by Porphyr (freesound.org/people/Porphyr) / CC BY 3.0 (creativecommons.org/licenses/by/3.0) */
|
||||||
import Waterdrop from '../mp3/191678__porphyr__waterdrop.mp3';
|
import Waterdrop from '../mp3/191678__porphyr__waterdrop.mp3';
|
||||||
|
|
@ -254,6 +255,81 @@ $(function (){
|
||||||
return piece;
|
return piece;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updatePlayerTimes() {
|
||||||
|
let lightTime = 0;
|
||||||
|
let darkTime = 0;
|
||||||
|
|
||||||
|
let moveStartTime = undefined;
|
||||||
|
|
||||||
|
for (const move of visibleGame.moves) {
|
||||||
|
if (!move.meta || !Number.isInteger(move.meta.timestamp)) {
|
||||||
|
lightTime = darkTime = undefined;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (move.replaced) {
|
||||||
|
/* not the final move in the chain */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* start counting when the dark player finishes their first move */
|
||||||
|
if (moveStartTime === undefined) {
|
||||||
|
if (move.side === PS.DARK) {
|
||||||
|
moveStartTime = move.meta.timestamp;
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const moveTime = move.meta.timestamp - moveStartTime;
|
||||||
|
|
||||||
|
if (moveTime > 0) {
|
||||||
|
if (move.side === PS.LIGHT) {
|
||||||
|
lightTime += moveTime;
|
||||||
|
} else {
|
||||||
|
darkTime += moveTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
moveStartTime = move.meta.timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (moveStartTime === undefined) {
|
||||||
|
$('#cb_light_time, #cb_dark_time').text('0:00:00');
|
||||||
|
$('#cb_times').addClass('cb-hide-times');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (visibleGame.status === PS.PLAYING) {
|
||||||
|
if (!visibleGame.canRedo) {
|
||||||
|
const currentMoveTime = +new Date() - moveStartTime;
|
||||||
|
if (currentMoveTime > 0) {
|
||||||
|
if (visibleGame.player === PS.LIGHT) {
|
||||||
|
lightTime += currentMoveTime;
|
||||||
|
} else {
|
||||||
|
darkTime += currentMoveTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#cb_times').removeClass('cb-hide-times');
|
||||||
|
|
||||||
|
function formatTime(milliseconds) {
|
||||||
|
let seconds = milliseconds / 1000;
|
||||||
|
const hours = seconds / 3600;
|
||||||
|
seconds %= 3600;
|
||||||
|
const minutes = seconds / 60;
|
||||||
|
seconds %= 60;
|
||||||
|
return sprintf('%d:%02d:%02d', hours, minutes, seconds);
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#cb_light_time').text(formatTime(lightTime));
|
||||||
|
$('#cb_dark_time').text(formatTime(darkTime));
|
||||||
|
}
|
||||||
|
|
||||||
|
setInterval(() => { updatePlayerTimes(); }, 250);
|
||||||
|
|
||||||
function renderBoard(animate) {
|
function renderBoard(animate) {
|
||||||
$('#cb_board').removeData('dragging_from');
|
$('#cb_board').removeData('dragging_from');
|
||||||
$('#cb_board .cb-piece').remove();
|
$('#cb_board .cb-piece').remove();
|
||||||
|
|
@ -403,6 +479,8 @@ $(function (){
|
||||||
} else if (game.winner === PS.DARK) {
|
} else if (game.winner === PS.DARK) {
|
||||||
$('#cb_names').addClass('cb-dark-won');
|
$('#cb_names').addClass('cb-dark-won');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updatePlayerTimes();
|
||||||
}
|
}
|
||||||
|
|
||||||
function applyTheme(theme) {
|
function applyTheme(theme) {
|
||||||
|
|
@ -1440,6 +1518,7 @@ $(function (){
|
||||||
$('#header').appendTo('#board_ui');
|
$('#header').appendTo('#board_ui');
|
||||||
$('#cb_status').appendTo('#board_ui');
|
$('#cb_status').appendTo('#board_ui');
|
||||||
$('#cb_names').appendTo('#board_ui');
|
$('#cb_names').appendTo('#board_ui');
|
||||||
|
$('#cb_times').appendTo('#board_ui');
|
||||||
$('#cb_navigate').appendTo('#board_ui');
|
$('#cb_navigate').appendTo('#board_ui');
|
||||||
$('#board_ui').appendTo('#page');
|
$('#board_ui').appendTo('#page');
|
||||||
$('#page').removeClass('vertical-layout').addClass('horizontal-layout');
|
$('#page').removeClass('vertical-layout').addClass('horizontal-layout');
|
||||||
|
|
@ -1448,6 +1527,7 @@ $(function (){
|
||||||
$('#cb_container').appendTo('#board_ui');
|
$('#cb_container').appendTo('#board_ui');
|
||||||
$('#cb_status').appendTo('#board_ui');
|
$('#cb_status').appendTo('#board_ui');
|
||||||
$('#cb_names').appendTo('#board_ui');
|
$('#cb_names').appendTo('#board_ui');
|
||||||
|
$('#cb_times').appendTo('#board_ui');
|
||||||
$('#cb_navigate').appendTo('#board_ui');
|
$('#cb_navigate').appendTo('#board_ui');
|
||||||
$('#board_ui').appendTo('#page');
|
$('#board_ui').appendTo('#page');
|
||||||
$('#page').removeClass('horizontal-layout').addClass('vertical-layout');
|
$('#page').removeClass('horizontal-layout').addClass('vertical-layout');
|
||||||
|
|
|
||||||
|
|
@ -1585,6 +1585,14 @@
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"sprintf-js": "~1.0.2"
|
"sprintf-js": "~1.0.2"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"sprintf-js": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
|
||||||
|
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"arr-diff": {
|
"arr-diff": {
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@
|
||||||
"mini-css-extract-plugin": "^0.9.0",
|
"mini-css-extract-plugin": "^0.9.0",
|
||||||
"optimize-css-assets-webpack-plugin": "^5.0.3",
|
"optimize-css-assets-webpack-plugin": "^5.0.3",
|
||||||
"pako": "^1.0.11",
|
"pako": "^1.0.11",
|
||||||
|
"sprintf-js": "^1.0.3",
|
||||||
"svgo": "^1.3.2",
|
"svgo": "^1.3.2",
|
||||||
"svgo-loader": "^2.2.1",
|
"svgo-loader": "^2.2.1",
|
||||||
"webpack": "^4.43.0",
|
"webpack": "^4.43.0",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue