watch: {
// game initial FEN changes when a new game starts
"game.fenStart": function() {
- // Reset all variables
- this.endgameMessage = "";
- this.orientation = this.game.mycolor || "w"; //default orientation for observed games
- this.score = this.game.score || "*"; //mutable (if initially "*")
- this.moves = JSON.parse(JSON.stringify(this.game.moves || []));
- const L = this.moves.length;
- this.cursor = L-1;
- this.lastMove = (L > 0 ? this.moves[L-1] : null);
+ this.re_setVariables();
},
},
computed: {
return this.game.mode == "analyze";
},
},
+ created: function() {
+ if (!!this.game.fenStart)
+ this.re_setVariables();
+ },
methods: {
+ re_setVariables: function() {
+ this.endgameMessage = "";
+ this.orientation = this.game.mycolor || "w"; //default orientation for observed games
+ this.score = this.game.score || "*"; //mutable (if initially "*")
+ this.moves = JSON.parse(JSON.stringify(this.game.moves || []));
+ const L = this.moves.length;
+ this.cursor = L-1;
+ this.lastMove = (L > 0 ? this.moves[L-1] : null);
+ },
setEndgameMessage: function(score) {
let eogMessage = "Undefined";
switch (score)
button(@click="abortGame") Abort
button(@click="resign") Resign
div(v-if="game.mode=='corr'")
- textarea(v-show="score=='*' && vr.turn==mycolor" v-model="corrMsg")
+ textarea(v-show="score=='*' && vr.turn==game.mycolor" v-model="corrMsg")
div(v-show="cursor>=0") {{ moves[cursor].message }}
</template>
data: function() {
return {
st: store.state,
- gameRef: {id: "", rid: ""}, //given in URL (rid = remote ID)
- game: {}, //passed to BaseGame
+ gameRef: { //given in URL (rid = remote ID)
+ id: "",
+ rid: ""
+ },
+ game: { }, //passed to BaseGame
vr: null, //"variant rules" object initialized from FEN
drawOfferSent: false, //did I just ask for draw? (TODO: draw variables?)
- people: [], //potential observers (TODO)
+ people: [ ], //potential observers (TODO)
};
},
watch: {
// Send our "last state" informations to opponent(s)
L = this.vr.moves.length;
Object.keys(this.opponents).forEach(oid => {
- this.conn.send(JSON.stringify({
+ this.st.conn.send(JSON.stringify({
code: "lastate",
oppid: oid,
gameId: this.gameRef.id,
if (this.score != "*")
{
// We finished the game (any result possible)
- this.conn.send(JSON.stringify({
+ this.st.conn.send(JSON.stringify({
code: "lastate",
oppid: data.oppid,
gameId: this.gameRef.id,
else if (data.movesCount < L)
{
// We must tell last move to opponent
- this.conn.send(JSON.stringify({
+ this.st.conn.send(JSON.stringify({
code: "lastate",
oppid: this.opponent.id,
gameId: this.gameRef.id,
this.play(data.lastMove, "animate");
break;
case "resign": //..you won!
- this.endGame(this.mycolor=="w"?"1-0":"0-1");
+ this.endGame(this.game.mycolor=="w"?"1-0":"0-1");
break;
// TODO: also use (dis)connect info to count online players?
case "gameconnect":
}
};
const socketCloseListener = () => {
- this.conn.addEventListener('message', socketMessageListener);
- this.conn.addEventListener('close', socketCloseListener);
+ this.st.conn.addEventListener('message', socketMessageListener);
+ this.st.conn.addEventListener('close', socketCloseListener);
};
- if (!!this.conn)
- {
- this.conn.onmessage = socketMessageListener;
- this.conn.onclose = socketCloseListener;
- }
+ this.st.conn.onmessage = socketMessageListener;
+ this.st.conn.onclose = socketCloseListener;
},
// dans variant.js (plutôt room.js) conn gère aussi les challenges
// et les chats dans chat.js. Puis en webRTC, repenser tout ça.
if (!!o.online)
{
try {
- this.conn.send(JSON.stringify({code: "draw", oppid: o.id}));
+ this.st.conn.send(JSON.stringify({code: "draw", oppid: o.id}));
} catch (INVALID_STATE_ERR) {
return;
}
return;
//+ bouton "abort" avec score == "?" + demander confirmation pour toutes ces actions,
//send message: "gameOver" avec score "?"
+ // ==> BaseGame must listen to game.score change, and call "endgame(score)" in this case
},
resign: function(e) {
if (!confirm("Resign the game?"))
if (this.mode == "human" && this.oppConnected(this.oppid))
{
try {
- this.conn.send(JSON.stringify({code: "resign", oppid: this.oppid}));
+ this.st.conn.send(JSON.stringify({code: "resign", oppid: this.oppid}));
} catch (INVALID_STATE_ERR) {
return;
}
// - from remote peer (one live game I don't play, finished or not)
loadGame: function() {
GameStorage.get(this.gameRef, async (game) => {
- this.game = game;
+ this.game = Object.assign({},
+ game,
+ // NOTE: assign mycolor here, since BaseGame could also bs VS computer
+ {mycolor: ["w","b"][game.players.findIndex(p => p.sid == this.st.user.sid)]},
+ );
const vModule = await import("@/variants/" + game.vname + ".js");
window.V = vModule.VariantRules;
this.vr = new V(game.fen);
import { checkChallenge } from "@/data/challengeCheck";
import { ArrayFun } from "@/utils/array";
import { ajax } from "@/utils/ajax";
-import { getRandString } from "@/utils/alea";
+import { getRandString, shuffle } from "@/utils/alea";
import GameList from "@/components/GameList.vue";
import ChallengeList from "@/components/ChallengeList.vue";
import { GameStorage } from "@/utils/storage";
window.V = vModule.VariantRules;
let players = [c.from];
Array.prototype.push.apply(players, c.seats);
- let gameInfo =
+ // These game informations will be sent to other players
+ const gameInfo =
{
+ gameId: getRandString(),
fen: c.fen || V.GenRandInitFen(),
// Players' names may be required if game start when a player is offline
- players: players.map(p => { return {name:p.name, sid:p.sid} }),
+ // Shuffle players order (white then black then other colors).
+ players: shuffle(players.map(p => { return {name:p.name, sid:p.sid} })),
vid: c.vid,
timeControl: c.timeControl,
};
// NOTE: for live games only (corr games are launched on server)
newGame: function(gameInfo) {
GameStorage.init({
- gameId: getRandString(),
+ gameId: gameInfo.gameId,
vname: this.getVname(gameInfo.vid),
fenStart: gameInfo.fen,
players: gameInfo.players,