X-Git-Url: https://git.auder.net/?p=vchess.git;a=blobdiff_plain;f=client%2Fsrc%2Fviews%2FAnalyse.vue;h=557a2df74d41f2b570eb52e1df4489afccb623af;hp=23515c67cb1da03b6d187e4da43918963621bf7c;hb=d54f6261c9e30f4eabb402ad301dd5c5e40fb656;hpb=725da57f8e2983d744629b524f9084516a43cbac diff --git a/client/src/views/Analyse.vue b/client/src/views/Analyse.vue index 23515c67..557a2df7 100644 --- a/client/src/views/Analyse.vue +++ b/client/src/views/Analyse.vue @@ -8,8 +8,9 @@ main @input="adjustFenSize(); tryGotoFen()" ) BaseGame( + ref="basegame" :game="game" - :vr="vr" + @fenchange="setFen" ) @@ -34,47 +35,71 @@ export default { players: [{ name: "Analyse" }, { name: "Analyse" }], mode: "analyze" }, - vr: null, //"variant rules" object initialized from FEN curFen: "" }; }, watch: { - // NOTE: no watcher for $route change, because if fenStart doesn't change - // then it doesn't trigger BaseGame.re_init() and the result is weird. - "vr.movesCount": function() { - this.curFen = this.vr.getFen(); - this.adjustFenSize(); + $route: function() { + this.initFromUrl(); } }, created: function() { - this.gameRef.vname = this.$route.params["vname"]; - this.gameRef.fen = this.$route.query["fen"].replace(/_/g, " "); - this.initialize(); + this.initFromUrl(); }, methods: { - initialize: async function() { + alertAndQuit: function(text, wrongVname) { + // Soon after component creation, st.tr might be uninitialized. + // Set a timeout to let a chance for the message to show translated. + const newUrl = "/variants" + (wrongVname ? "" : "/" + this.gameRef.vname); + setTimeout(() => { + alert(this.st.tr[text] || text); + this.$router.replace(newUrl); + }, 500); + }, + initFromUrl: function() { + this.gameRef.vname = this.$route.params["vname"]; + const routeFen = this.$route.query["fen"]; + if (!routeFen) this.alertAndQuit("Missing FEN"); + else { + this.gameRef.fen = routeFen.replace(/_/g, " "); + // orientation is optional: taken from FEN if missing + const orientation = this.$route.query["side"]; + this.initialize(orientation); + } + }, + initialize: async function(orientation) { // Obtain VariantRules object - const vModule = await import("@/variants/" + this.gameRef.vname + ".js"); - window.V = vModule.VariantRules; - this.loadGame(); + await import("@/variants/" + this.gameRef.vname + ".js") + .then((vModule) => { + window.V = vModule[this.gameRef.vname + "Rules"]; + if (!V.CanAnalyze) + // Late check, in case the user tried to enter URL by hand + this.alertAndQuit("Analysis disabled for this variant"); + else this.loadGame(orientation); + }) + .catch((err) => { this.alertAndQuit("Mispelled variant name", true); }); }, - loadGame: function() { - // NOTE: no need to set score (~unused) + loadGame: function(orientation) { this.game.vname = this.gameRef.vname; + this.game.fenStart = this.gameRef.fen; this.game.fen = this.gameRef.fen; + this.game.score = "*"; //never change this.curFen = this.game.fen; this.adjustFenSize(); - this.vr = new V(this.game.fen); - this.game.mycolor = this.vr.turn; - this.$set(this.game, "fenStart", this.gameRef.fen); + this.game.mycolor = orientation || V.ParseFen(this.gameRef.fen).turn; + this.$refs["basegame"].re_setVariables(this.game); + }, + // Triggered by "fenchange" emitted in BaseGame: + setFen: function(fen) { + this.curFen = fen; + this.adjustFenSize(); }, adjustFenSize: function() { let fenInput = document.getElementById("fen"); - fenInput.style.width = this.curFen.length + "ch"; + fenInput.style.width = (this.curFen.length+3) + "ch"; }, tryGotoFen: function() { - if (V.IsGoodFen(this.curFen)) - { + if (V.IsGoodFen(this.curFen)) { this.gameRef.fen = this.curFen; this.loadGame(); } @@ -82,3 +107,9 @@ export default { } }; + +