UNPKG

dotup-ts-node-skills-game

Version:
246 lines (244 loc) 10.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const dotup_ts_types_1 = require("dotup-ts-types"); const AnimationBuilder_1 = require("../Builder/AnimationBuilder"); const EventsBuilder_1 = require("../Builder/EventsBuilder"); const GadgetBuilder_1 = require("../Builder/GadgetBuilder"); const RecognizerBuilder_1 = require("../Builder/RecognizerBuilder"); const Enumerations_1 = require("../Constants/Enumerations"); const GameEngineInput_1 = require("./GameEngineInput"); /** * Nice game */ class AlexaGame extends GameEngineInput_1.GameEngineInput { constructor(context, model, turnOrder, waitToContinueGameDuration) { super(); this.model = model; this.context = context; this.turnOrder = turnOrder; this.waitToContinueGameDuration = waitToContinueGameDuration; } get state() { return this.model.CurrentGameState; } Stop() { // this.turnOrder.cancelGame(); this.model.CurrentGameState = Enumerations_1.GameState.None; const id = this.context.request.getSessionAttributes().originatingRequestId; this.context.AddDirective(GadgetBuilder_1.GadgetBuilder.stopInputHandler(id)); this.context.AddDirective(GadgetBuilder_1.GadgetBuilder.setLightsOff(this.getAllIds())); this.context.shouldEndSession(true); } ContinueGame() { switch (this.model.CurrentGameState) { case Enumerations_1.GameState.Completed: this.turnOrder.reset(); this.Start(); break; case Enumerations_1.GameState.WaitingToContinue: this.Start(); break; default: console.log('ContinueGame with invalid game state'); } } getAllIds() { if (this.model.RegisteredButtons === undefined) { return this.model.Players.map(p => p.buttons.map(b => b.id)) .reduce((p, c) => { p.push(...c); return p; }); } else { return this.model.RegisteredButtons.map(item => item.id); } } InitializeButtonColors() { const ids = this.getAllIds(); const downLight = GadgetBuilder_1.GadgetBuilder.setLight(ids, AnimationBuilder_1.AnimationBuilder.GetSolidAnimation(1, Enumerations_1.ButtonColor.black, 1), Enumerations_1.TriggerEvent.buttonDown); return [downLight]; } // protected validateConfigration(): void { // const r = NodeSkill.requirements; // // Button validation // this.model.Players.forEach(player => { // if (player.buttons.length < r.numberOfButtonsPerButtonGroupMin) { // throw new Error(`you need at least ${r.numberOfButtonsPerButtonGroupMin} registered buttons per player`); // } // }); // this.model.Players.forEach(player => { // if (player.buttons.length > r.numberOfButtonsPerButtonGroupMax) { // throw new Error(`you can use a maximum of ${r.numberOfButtonsPerButtonGroupMax} registered buttons per player`); // } // }); // // Player validation // if (this.model.Players.length !== this.model.NumberOfPlayer) { // throw new Error('number of players not corret'); // } // if (this.model.Players.length > r.numberOfPlayerMax) { // throw new Error(`you can use a maximum of ${r.numberOfPlayerMax} player`); // } // if (this.model.Players.length < r.numberOfPlayerMin) { // throw new Error(`you need at least ${r.numberOfPlayerMin} player`); // } // if (this.model.RoundsToPlay > r.roundsToPlayMax) { // throw new Error(`you can use a maximum of ${r.roundsToPlayMax} rounds to play`); // } // if (this.model.RoundsToPlay < r.roundsToPlayMin) { // throw new Error(`you need at least ${r.roundsToPlayMin} rounds to play`); // } // } /** * Ask player for correct button */ Timeout(item) { switch (this.model.CurrentGameState) { // We're playing, but it's over. Ask for answer case Enumerations_1.GameState.Playing: this.TryStart(); break; // Timeout. answer not given. Handle with WrongAnswer event case Enumerations_1.GameState.WaitingForAnswer: // Timeout, that's wrong answer. CALL the event!! this.Event(Enumerations_1.EventNames.WrongAnswer, undefined); this.model.CurrentGameState = Enumerations_1.GameState.WaitingToContinue; break; case Enumerations_1.GameState.WaitingToContinue: case Enumerations_1.GameState.Completed: this.Stop(); break; default: } } TryStart() { // Game completed? if (this.turnOrder.isGameCompleted()) { // Say result // const result = new LeaderBoard().getRanking(this.model); // result.forEach(item => { // this.context.Speak(this.GameText.leaderBoard(item)); // }); this.model.CurrentGameState = Enumerations_1.GameState.Completed; // Wait for user input this.onGameCompleted(); } else { this.Start(); // Wait for next player // this.waitForNextPlayer(); } } Event(eventName, inputEvent) { switch (eventName) { case Enumerations_1.EventNames.Continue: this.turnOrder.reset(); this.Start(); return; case Enumerations_1.EventNames.Exit: this.Stop(); return; default: this.OnEvent(eventName, inputEvent); } } // protected Event(eventName: string, inputEvent: services.gameEngine.InputEvent): void { // switch (eventName) { // case EventNames.RightAnswer: // this.context.Speak('richtig'); // // this.turnOrder.addScore(1); // break; // case EventNames.WrongAnswer: // this.context.Speak('falsch'); // break; // default: // console.log(eventName); // } // this.Start(); // // switch (eventName) { // // case EventNames.RightAnswer: // // this.context.Speak(this.GameText.rightAnswer(this.model.CurrentPlayerName)); // // this.turnOrder.addScore(1); // // break; // // case EventNames.WrongAnswer: // // this.OnWrongAnswer(); // // break; // // case EventNames.Continue: // // this.turnOrder.reset(); // // this.Start(); // // return; // // case EventNames.Exit: // // this.Stop(); // // return; // // default: // // } // // // Game completed? // // if (this.turnOrder.isGameCompleted()) { // // // Say result // // const result = new LeaderBoard().getRanking(this.model); // // result.forEach(item => { // // this.context.Speak(this.GameText.leaderBoard(item)); // // }); // // this.model.CurrentGameState = GameState.Completed; // // // Wait for user input // // this.waitToContinueGame(); // // } else { // // // Wait for next player // // this.waitForNextPlayer(); // // } // } /** * Analyse the answer. Later do it with Recognizer. * * One for RightAnswer. type match with correct gadget id. * Ans one for WrongAnswer. "type": "deviation" with the two wrong gadget ids. */ // protected ButtonDown(buttonName: string, inputEvent: services.gameEngine.InputEvent): void { // // this.OnButtonDown(buttonName, inputEvent); // console.log(buttonName); // switch (buttonName) { // case GameState.WaitingToContinue: // // Start gameplay // this.Start(); // break; // // EventNames.ContinueGame, EventNames.ExitGame // default: // } // } onGameCompleted() { const result = []; const events = {}; const recognizers = {}; const buttons = this.getAllIds(); const redOne = buttons.filter((item, index) => index % 2 === 0); const greenOne = buttons.filter((item, index) => index % 2 === 1); // Get red exit button down recognizer recognizers[Enumerations_1.EventNames.Exit] = RecognizerBuilder_1.RecognizerBuilder.ButtonDown(redOne); // Listen for any red exit button) dotup_ts_types_1.ObjectTools.CopyEachSource(EventsBuilder_1.EventsBuilder.GetExitEvent(), events); // Get green exit button down recognizer recognizers[Enumerations_1.EventNames.Continue] = RecognizerBuilder_1.RecognizerBuilder.ButtonDown(greenOne); // Listen for any red exit button) dotup_ts_types_1.ObjectTools.CopyEachSource(EventsBuilder_1.EventsBuilder.GetContinueEvent(), events); // Add timeout const timeOutEvent = EventsBuilder_1.EventsBuilder.GetTimeoutEvent(); dotup_ts_types_1.ObjectTools.CopyEachSource(timeOutEvent, events); // Show red exit button redOne.forEach(button => { const light = GadgetBuilder_1.GadgetBuilder.setLight(redOne, AnimationBuilder_1.AnimationBuilder.GetSolidAnimation(1, Enumerations_1.ButtonColor.red, this.waitToContinueGameDuration), Enumerations_1.TriggerEvent.none); result.push(light); }); // Show green continue button greenOne.forEach(button => { const light = GadgetBuilder_1.GadgetBuilder.setLight(greenOne, AnimationBuilder_1.AnimationBuilder.GetSolidAnimation(1, Enumerations_1.ButtonColor.green, this.waitToContinueGameDuration), Enumerations_1.TriggerEvent.none); result.push(light); }); // Start input handler const start = GadgetBuilder_1.GadgetBuilder.startInputHandler(this.waitToContinueGameDuration, events, () => { this.context.SaveRequestId(); }, recognizers); result.push(start); // Set result this.context.AddDirective(result); } } exports.AlexaGame = AlexaGame; //# sourceMappingURL=AlexaGame.js.map