import {EventEmitter, Injectable} from '@angular/core'; import {GameActionsService} from './game-actions.service'; import {AnswerService} from './answer.service'; import {FeedbackOxService} from './feedback-ox.service'; import {BehaviorSubject} from 'rxjs'; import {withLatestFrom} from 'rxjs/operators'; import {EndGameService} from './end-game.service'; @Injectable({ providedIn: 'root' }) export class HintService { private _currentUses: number; set usesPerChallenge(value: number) { this._usesPerChallenge = value; } private _usesPerChallenge: number; public hintAvailable: BehaviorSubject; // TODO Solve this patch with challenge on screen event. public checkValueOnShowNextChallenge = true; constructor(private gameActions: GameActionsService, private feedbackService: FeedbackOxService, private endGameService: EndGameService, private answerService: AnswerService) { this.hintAvailable = new BehaviorSubject(false); this.answerService.tryAnswer.subscribe(x => { this.sendEvent(false); }); this.gameActions.microLessonCompleted.subscribe(x => { this.sendEvent(false); }); this.gameActions.surrender.subscribe(x => { this.sendEvent(false); }); this.feedbackService.endFeedback.pipe(withLatestFrom(this.gameActions.checkedAnswer)).subscribe(values => { if (((values[1] as any).correctness) === 'wrong') { this.checkHintAvailable(); } }); this.gameActions.actionToAnswer.subscribe(x => { this.checkHintAvailable(); }); this.gameActions.showNextChallenge.subscribe(x => { this._currentUses = 0; if (this.checkValueOnShowNextChallenge) { this.checkHintAvailable(); } }); this.gameActions.showHint.subscribe(x => { this._currentUses++; }); } private sendEvent(toSend: boolean) { this.hintAvailable.next(toSend); } get currentUses(): number { return this._currentUses; } checkHintAvailable() { this.sendEvent(this.hintIsAvailable()); } private hintIsAvailable() { return this._usesPerChallenge > this._currentUses && !this.endGameService.gameIsEnded(); } }