.row
.col-sm-12
.text-center
- input#fen(v-model="curFen" @input="adjustFenSize()")
- button(@click="gotoFen()") {{ st.tr["Go"] }}
- BaseGame(:game="game" :vr="vr")
+ input#fen(
+ v-model="curFen"
+ @input="adjustFenSize(); tryGotoFen()"
+ )
+ BaseGame(
+ :game="game"
+ @fenchange="setFen"
+ )
</template>
<script>
players: [{ name: "Analyse" }, { name: "Analyse" }],
mode: "analyze"
},
- vr: null, //"variant rules" object initialized from FEN
curFen: ""
- //people: [], //players + observers //TODO later: interactive analyze...
};
},
- 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();
- }
- },
+ // 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.
created: function() {
this.gameRef.vname = this.$route.params["vname"];
- if (this.gameRef.vname == "Dark") {
- alert(this.st.tr["Analyse in Dark mode makes no sense!"]);
- history.back(); //or this.$router.go(-1)
- } else {
- this.gameRef.fen = this.$route.query["fen"].replace(/_/g, " ");
- this.initialize();
+ 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);
}
},
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);
+ },
+ 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.VariantRules;
+ 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() {
+ loadGame: function(orientation) {
// NOTE: no need to set score (~unused)
this.game.vname = this.gameRef.vname;
this.game.fen = this.gameRef.fen;
this.curFen = this.game.fen;
this.adjustFenSize();
- this.vr = new V(this.game.fen);
- this.game.mycolor = this.vr.turn;
+ this.game.mycolor = orientation || V.ParseFen(this.gameRef.fen).turn;
this.$set(this.game, "fenStart", this.gameRef.fen);
},
+ // 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";
},
- gotoFen: function() {
- this.gameRef.fen = this.curFen;
- this.loadGame();
+ tryGotoFen: function() {
+ if (V.IsGoodFen(this.curFen))
+ {
+ this.gameRef.fen = this.curFen;
+ this.loadGame();
+ }
}
}
};