File:KartKingdomPlugin.js

/**
 * @module Container
 * @namespace springroll
 */
(function()
{
	// Include classes
	var Minigame = include('springroll.pbskids.kartkingdom.Minigame', false);
	var MinigameEvent = include('springroll.pbskids.kartkingdom.MinigameEvent', false);

	/**
	 * @class Container
	 */
	var plugin = new springroll.ContainerPlugin();

	plugin.setup = function()
	{
		/**
		 * The instance of the Kart Kingdom Minigame API
		 * @property {Minigame} minigame
		 */
		this.minigame = null;
	};

	plugin.open = function()
	{
		this.client.on('kk-init', onKartKingdomInit.bind(this));
	};

	/**
	 * Initialize the Kart Kingdom API
	 * @method onKarKingdomInit
	 * @private
	 * @param {object} event Bellhop event
	 */
	var onKartKingdomInit = function(event)
	{
		// If we don't have the library, ignore
		if (!Minigame)
		{
			// Doesn't break/hang games which don't have
			// the Kart Kingdom API embedded with the container
			this.client.send('kk-init-done');
			return;
		}

		var config = event.data;

		if (DEBUG)
		{
			console.log("KartKingdomClient: container = ", this);
		}

		if (!this.dom.parentNode.id)
			this.dom.parentNode.id = this.dom.parentNode.id + "-kartkingdom-wrapper";

		this.minigame = new Minigame(
			config.gameID,
			this.dom.parentNode.id,
			function()
			{
				this.paused = true;
			},
			function()
			{
				this.paused = false;
			},
			config.options
		);

		onInitMinigame.call(this);

		// Let the client know we're done
		this.client.send('kk-init-done');
	};

	/**
	 * Bind handlers to events between the client and minigame instances.
	 * @method _addEventListeners
	 * @param {Minigame} minigame Instance of the Minigame API.
	 * @param {Bellhop} client Bellhop instance on the container.
	 * @private
	 */
	var onInitMinigame = function()
	{
		var client = this.client;
		var minigame = this.minigame;

		// Event Listeners on the Client
		client.on('kk-event', function(event)
		{
			minigame.event(event.data);
		});

		client.on('kk-level-complete', function(event)
		{
			minigame.levelComplete();
		});

		client.on('kk-destroy', function(event)
		{
			plugin.teardown.call(this);
		}.bind(this));

		client.respond('kk-has-power-up', minigame.hasPowerUp(event.data));

		client.on('kk-use-power-ups', function(event)
		{
			minigame.usePowerUps(
				event.data.powerupsObject,
				function()
				{
					//onSuccessCallback
					client.send(event.data.successEvent);
				},
				function()
				{
					//onFailureCallback
					client.send(event.data.failureEvent);
				}
			);
		});

		// Event Listeners on the Minigame API
		minigame.addEventListener(MinigameEvent.MINIGAME_READY, function(event)
		{
			client.send('kk-ready', event);
		});

		minigame.addEventListener(MinigameEvent.LEVEL_COMPLETE_OPEN, function(event)
		{
			client.send('kk-level-open', event);
		});

		minigame.addEventListener(MinigameEvent.LEVEL_COMPLETE_CLOSED, function(event)
		{
			client.send('kk-level-closed', event);
		});

		minigame.addEventListener(MinigameEvent.LEVEL_RESET, function(event)
		{
			client.send('kk-level-reset', event);
		});

		minigame.addEventListener(MinigameEvent.RESOURCES_EARNED, function(event)
		{
			client.send('kk-resources-earned', event);
		});

		minigame.addEventListener(MinigameEvent.RESOURCE_REQUEST_COMPLETE, function(event)
		{
			client.send('kk-resources-complete', event);
		});
	};

	plugin.teardown = function()
	{
		if (this.minigame)
		{
			this.minigame.destroy();
			delete this.minigame;
		}
	};

}());