H5P.MemoryGame = (function (EventDispatcher, $) { // We don't want to go smaller than 100px per card(including the required margin) var CARD_MIN_SIZE = 100; // PX var CARD_STD_SIZE = 116; // PX var STD_FONT_SIZE = 16; // PX var LIST_PADDING = 1; // EMs /** * 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, $wrapper, maxWidth, numCols; var cards = []; var removed = 0; /** * 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++) { var cardParams = parameters.cards[i]; if (MemoryGame.Card.isValid(cardParams)) { // Create first card var cardTwo, cardOne = new MemoryGame.Card(cardParams.image, id, cardParams.description); if (MemoryGame.Card.hasTwoImages(cardParams)) { // Use matching image for card two cardTwo = new MemoryGame.Card(cardParams.match, id, cardParams.description); } else { // Add two cards with the same image cardTwo = new MemoryGame.Card(cardParams.image, id, cardParams.description); } // Add cards to card list for shuffeling 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 attach! $wrapper = $container.addClass('h5p-memory-game').html(''); // Add cards to list var $list = $('