H5P.MemoryGame = (function (EventDispatcher, $) { /** * Memory Game Constructor * * @class * @param {Object} parameters * @param {Number} id */ function MemoryGame(parameters, id) { var self = this; // Initialize event inheritance EventDispatcher.call(self); var flipped, timer, counter, popup, $feedback; var cards = []; var removed = 0; /** * Update the time on the screen. * * @private * @param {H5P.jQuery} $container - element to be updated. * @param {H5P.Timer} timer - the timer containing the time. */ var updateDisplayTime = function($container, timer) { var time = timer.getTime(); var minutes = H5P.Timer.extractTimeElement(time, 'minutes'); var seconds = H5P.Timer.extractTimeElement(time, 'seconds'); if (seconds < 10) { seconds = '0' + seconds; } $container.text(minutes + ':' + seconds); } /** * Check if these two cards belongs together. * * @private * @param {H5P.MemoryGame.Card} card * @param {H5P.MemoryGame.Card} mate * @param {H5P.MemoryGame.Card} correct */ var check = function (card, mate, correct) { if (mate === correct) { // Remove them from the game. card.remove(); mate.remove(); removed += 2; var finished = (removed === cards.length); var desc = card.getDescription(); if (finished) { self.triggerXAPIScored(1, 1, 'completed'); } if (desc !== undefined) { // Pause timer and show desciption. timer.pause(); popup.show(desc, card.getImage(), function () { if (finished) { // Game has finished $feedback.addClass('h5p-show'); } else { // Popup is closed, continue. timer.play(); } }); } else if (finished) { // Game has finished timer.stop(); $feedback.addClass('h5p-show'); } } else { // Flip them back card.flipBack(); mate.flipBack(); } }; /** * Adds card to card list and set up a flip listener. * * @private * @param {H5P.MemoryGame.Card} card * @param {H5P.MemoryGame.Card} mate */ var addCard = function (card, mate) { card.on('flip', function () { self.triggerXAPI('interacted'); // Keep track of time spent timer.play(); if (flipped !== undefined) { var matie = flipped; // Reset the flipped card. flipped = undefined; setTimeout(function () { check(card, matie, mate); }, 800); } else { // Keep track of the flipped card. flipped = card; } // Count number of cards turned counter.increment(); }); cards.push(card); }; // Initialize cards. for (var i = 0; i < parameters.cards.length; i++) { if (MemoryGame.Card.isValid(parameters.cards[i])) { // Add two of each card var cardOne = new MemoryGame.Card(parameters.cards[i], id); var cardTwo = new MemoryGame.Card(parameters.cards[i], id); addCard(cardOne, cardTwo); addCard(cardTwo, cardOne); } } H5P.shuffleArray(cards); /** * Attach this game's html to the given container. * * @param {H5P.jQuery} $container */ self.attach = function ($container) { this.triggerXAPI('attempted'); // TODO: Only create on first! $container.addClass('h5p-memory-game').html(''); // Add cards to list var $list = $('