diff --git a/css/main.css b/css/main.css index 87ab3a9..999cd78 100644 --- a/css/main.css +++ b/css/main.css @@ -53,7 +53,7 @@ div#header { } .menu { - position: absolute; + position: fixed; right: 10px; bottom: 10px; color: #666; diff --git a/index.html b/index.html index 53ffaf9..9cd5522 100644 --- a/index.html +++ b/index.html @@ -17,6 +17,7 @@ + - - - - + + + + + @@ -89,7 +91,7 @@ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','http://www.google-analytics.com/analytics.js','ga'); - + ga('create', 'UA-41314886-1', 'doublespeakgames.com'); ga('send', 'pageview'); diff --git a/lang/langs.js b/lang/langs.js index ec69a87..e64769a 100644 --- a/lang/langs.js +++ b/lang/langs.js @@ -1,6 +1,6 @@ var langs = { 'en':'english', 'fr':'français', - 'cn':'简体中文', - 'jp':'日本語' -} + 'cn':'简体中文' + //'jp':'日本語' +}; diff --git a/script/dropbox.js b/script/dropbox.js new file mode 100644 index 0000000..1cbb118 --- /dev/null +++ b/script/dropbox.js @@ -0,0 +1,362 @@ +(function (Engine, Events, Dropbox, $) { + + /** + * Module that enables a save of the gamestate to the dropbox datastore + * @see https://www.dropbox.com/developers/datastore + * + * The dropbox datastore (dbds) connector lets you save your data to your own dropbox datastore + * without jamming files to it. + * + * This connector uses the game engines own base64 encoder. + */ + + 'use strict'; + + if (!Engine) { return false; } // Game Engine not available + if (!Dropbox) { return false; } // Dropbox Connector not available + + var DropboxConnector = { + + options: { + log: false, + key: 'q7vyvfsakyfmp3o', + table: 'adarkroom' + }, + + client: false, + table: false, + dropboxAccount: false, + savegameKey: false, + savegames: {0: null, 1: null, 2: null, 3: null, 4: null}, + + init: function (options) { + this.options = $.extend( + this.options, + options + ); + + this._log = this.options.log; + + this.client = new Dropbox.Client({key: DropboxConnector.options.key}); + this.connectToDropbox(false); + + return this; + }, + + startDropbox: function () { + if (!DropboxConnector.client || !DropboxConnector.table) { + DropboxConnector.startDropboxConnectEvent(); + } else { + DropboxConnector.startDropboxImportEvent(); + } + }, + + /** + * ****** + * Events + * ****** + */ + + startDropboxConnectEvent: function () { + Events.startEvent({ + title: _('Dropbox connection'), + scenes: { + start: { + text: [_('connect game to dropbox local storage')], + buttons: { + 'connect': { + text: _('connect'), + nextScene: 'end', + onChoose: function () { + DropboxConnector.connectToDropbox(DropboxConnector.startDropboxImportEvent); + } + }, + 'cancel': { + text: _('cancel'), + nextScene: 'end' + } + } + } + } + }); + }, + + startDropboxImportEvent: function () { + Events.startEvent({ + title: _('Dropbox Export / Import'), + scenes: { + start: { + text: [_('export or import save data to dropbox datastorage'), + _('your are connected to dropbox with account / email ') + DropboxConnector.dropboxAccount], + buttons: { + 'save': { + text: _('save'), + nextScene: {1: 'saveToSlot'} + }, + 'load': { + text: _('load'), + nextScene: {1: 'loadFromSlot'}, + onChoose: DropboxConnector.loadGamesFromDropbox + }, + 'signout': { + text: _('signout'), + nextScene: 'end', + onChoose: DropboxConnector.signout + }, + 'cancel': { + text: _('cancel'), + nextScene: 'end' + } + } + }, + saveToSlot: { + text: [_('choose one slot to save to')], + buttons: (function () { + var buttons = {}; + + $.each(DropboxConnector.savegames, function (n, savegame) { + buttons['savegame' + n] = { + text: _('save to slot') + n + ' ' + (savegame ? DropboxConnector.prepareSaveDate(savegame.get('timestamp')) : 'empty'), + nextScene: 'end', + onChoose: function () { + DropboxConnector.log('Save to slot ' + n + ' initiated'); + // timeout prevents error due to fade out animation of the previous event + window.setTimeout(function () { + DropboxConnector.log('Save to slot ' + n); + DropboxConnector.saveGameToDropbox(n, DropboxConnector.savedtoDropboxEvent); + }, 1000); + } + }; + }); + + buttons.cancel = { + text: _('cancel'), + nextScene: 'end' + }; + + return buttons; + }()) + }, + loadFromSlot: { + text: [_('choose one slot to load from')], + buttons: (function () { + var buttons = {}; + + $.each(DropboxConnector.savegames, function (n, savegame) { + if (savegame) { + buttons['savegame' + n] = { + text: _('load from slot') + n + ' ' + DropboxConnector.prepareSaveDate(savegame.get('timestamp')), + nextScene: 'end', + onChoose: function () { + DropboxConnector.log('Load from slot ' + n + ' initiated'); + // timeout prevents error due to fade out animation of the previous event + window.setTimeout(function () { + DropboxConnector.log('Load from slot ' + n); + DropboxConnector.loadGameFromDropbox(n); + }, 1000); + } + }; + } + }); + + buttons.cancel = { + text: _('cancel'), + nextScene: 'end' + }; + + return buttons; + }()) + } + } + }); + }, + + savedtoDropboxEvent: function (success) { + Events.startEvent({ + title: _('Dropbox Export / Import'), + scenes: { + start: { + text: success ? [_('successfully saved to dropbox datastorage')] : + [_('error while saving to dropbox datastorage')], + buttons: { + 'ok': { + text: _('ok'), + nextScene: 'end' + } + } + } + } + }); + }, + + /** + * *************** + * functional code + * *************** + */ + + /** + * Initiate dropbox connection + * + * @param interactive + * @param callback + */ + connectToDropbox: function (interactive, callback) { + + DropboxConnector.log('start dropbox'); + + var client = this.client; + + client.authenticate({interactive: interactive}, function (error) { + if (error) { + DropboxConnector.log('Dropbox Authentication error: ' + error); + } + }); + + if (client.isAuthenticated()) { + + var datastoreManager = client.getDatastoreManager(); + datastoreManager.openDefaultDatastore(function (error, datastore) { + if (error) { + DropboxConnector.log('Error opening default datastore: ' + error); + } else { + DropboxConnector.table = datastore.getTable(DropboxConnector.options.table); + DropboxConnector.loadGamesFromDropbox(); + + DropboxConnector.log(DropboxConnector.client.credentials()); + + DropboxConnector.client.getAccountInfo({}, function (error, info) { + if (!error) { + DropboxConnector.dropboxAccount = info.email; + } + }); + + DropboxConnector.log("Got savegames", DropboxConnector.savegames); + + if (typeof callback === "function") { + callback.call(DropboxConnector.table); + } + } + }); + } else { + DropboxConnector.log('Not connected to dropbox.'); + } + }, + + /** + * Requests your savegames fom dbds + * + * @returns {*} + */ + loadGamesFromDropbox: function () { + var savegames = DropboxConnector.savegames; + + $.each(savegames, function (n) { + var results = DropboxConnector.table.query({savegameId: DropboxConnector.prepareSavegameID(n)}); + savegames[n] = results[0]; + }); + + return savegames; + }, + + /** + * Imports a gamestate of a given slotnumber to your game + * + * @param slotnumber + */ + loadGameFromDropbox: function (slotnumber) { + + var table = DropboxConnector.table; + var id = DropboxConnector.prepareSavegameID(slotnumber); + var results = table.query({savegameId: id}); + var record = results[0]; + + if (record && record.get('gameState')) { + Engine.import64(record.get('gameState')); + } + }, + + /** + * Saves a gamestate to a given slot in dbds + * + * @param slotnumber + * @param callback + */ + saveGameToDropbox: function (slotnumber, callback) { + + var table = DropboxConnector.table; + var record = null; + var success = false; + var id = DropboxConnector.prepareSavegameID(slotnumber); + + var saveGame = { + gameState: Engine.generateExport64(), + timestamp: new Date().getTime() + }; + + if (DropboxConnector.savegames[slotnumber]) { // slot aleady used -> overwrite + record = DropboxConnector.savegames[slotnumber]; + try { + record.update(saveGame); + DropboxConnector.log("Updated savegame ", slotnumber); + success = true; + } catch (e) { + success = false; + } + + } else { + saveGame.savegameId = id; + try { + record = table.insert(saveGame); + DropboxConnector.log("Inserted savegame ", record.getId()); + success = true; + } catch (e) { + success = false; + } + } + if (typeof callback === "function") { + callback(success); + } + }, + + /** + * Terminates the connection to your db account + */ + signout: function () { + DropboxConnector.client.signOut({}, function (error) { + if (error) { + alert('Error while logout from dropbox'); + } else { + alert('Successfully signed out.'); + DropboxConnector.client = null; + DropboxConnector.savegames = null; + DropboxConnector.dropboxAccount = null; + } + }); + }, + + /** + * ************** + * Helper methods + * ************** + */ + + prepareSavegameID: function (slotnumber) { + return 'adarkroom_savegame_' + slotnumber; + }, + + prepareSaveDate: function (timestamp) { + var date = new Date(timestamp); + return date.toLocaleDateString() + ' ' + date.toLocaleTimeString(); + }, + + log: function () { + if (this._log) { + console.log(arguments); + } + } + }; + + Engine.Dropbox = DropboxConnector; + +})(Engine, Events, Dropbox, jQuery); \ No newline at end of file diff --git a/script/engine.js b/script/engine.js index d214d91..d9ba9e5 100644 --- a/script/engine.js +++ b/script/engine.js @@ -77,7 +77,8 @@ options: { state: null, debug: false, - log: false + log: false, + dropbox: false }, init: function(options) { @@ -107,7 +108,7 @@ } $('
').attr('id', 'locationSlider').appendTo('#main'); - + var menu = $('
') .addClass('menu') .appendTo('body'); @@ -124,7 +125,7 @@ $.each(langs, function(name,display){ $('