dotup-ts-node-skills-game
Version:
Develop alexa typescript games
246 lines (244 loc) • 10.3 kB
JavaScript
"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