Merge branch 'master' into whitespace-fixes

This commit is contained in:
Travis Weston
2014-07-16 23:32:13 -04:00
6 changed files with 440 additions and 35 deletions
+362
View File
@@ -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);
+64 -23
View File
@@ -77,7 +77,8 @@
options: {
state: null,
debug: false,
log: false
log: false,
dropbox: false
},
init: function(options) {
@@ -107,7 +108,7 @@
}
$('<div>').attr('id', 'locationSlider').appendTo('#main');
var menu = $('<div>')
.addClass('menu')
.appendTo('body');
@@ -124,7 +125,7 @@
$.each(langs, function(name,display){
$('<option>').text(display).val(name).appendTo(select)
})
});
}
$('<span>')
@@ -150,29 +151,37 @@
.text(_('save.'))
.click(Engine.exportImport)
.appendTo(menu);
if(this.options.dropbox && Engine.Dropbox) {
this.dropbox = Engine.Dropbox.init();
$('<span>')
.addClass('menuBtn')
.text(_('dropbox.'))
.click(Engine.Dropbox.startDropbox)
.appendTo(menu);
}
$('<span>')
.addClass('menuBtn')
.text(_('app store.'))
.click(function() { window.open('https://itunes.apple.com/us/app/a-dark-room/id736683061'); })
.appendTo(menu);
// Register keypress handlers
$('body').off('keydown').keydown(Engine.keyDown);
$('body').off('keyup').keyup(Engine.keyUp);
// Register swipe handlers
swipeElement = $('#outerSlider');
swipeElement.on('swipeleft', Engine.swipeLeft);
swipeElement.on('swiperight', Engine.swipeRight);
swipeElement.on('swipeup', Engine.swipeUp);
swipeElement.on('swipedown', Engine.swipeDown);
//subscribe to stateUpdates
// subscribe to stateUpdates
$.Dispatch('stateUpdate').subscribe(Engine.handleStateUpdates);
$SM.init();
Notifications.init();
Events.init();
@@ -330,20 +339,52 @@
}
}
}
});
Engine.autoSelect('#description textarea')
},
}
});
},
import64: function(string64) {
Engine.disableSelection();
string64 = string64.replace(/\s/g, '');
string64 = string64.replace(/\./g, '');
string64 = string64.replace(/\n/g, '');
var decodedSave = Base64.decode(string64);
localStorage.gameState = decodedSave;
location.reload();
},
generateExport64: function(){
var string64 = Base64.encode(localStorage.gameState);
string64 = string64.replace(/\s/g, '');
string64 = string64.replace(/\./g, '');
string64 = string64.replace(/\n/g, '');
return string64;
},
export64: function() {
Engine.saveGame();
var string64 = Engine.generateExport64();
Engine.enableSelection();
Events.startEvent({
title: _('Export'),
scenes: {
start: {
text: [_('save this.')],
textarea: string64,
buttons: {
'done': {
text: _('got it'),
nextScene: 'end',
onChoose: Engine.disableSelection
}
}
}
}
});
Engine.autoSelect('#description textarea')
},
import64: function(string64) {
Engine.disableSelection();
string64 = string64.replace(/\s/g, '');
string64 = string64.replace(/\./g, '');
string64 = string64.replace(/\n/g, '');
var decodedSave = Base64.decode(string64);
localStorage.gameState = decodedSave;
location.reload();
},
event: function(cat, act) {
if(typeof ga === 'function') {
ga('send', 'event', cat, act);
+3 -3
View File
@@ -93,7 +93,7 @@ var Path = {
return Path.getCapacity() - num;
},
updatePerks: function() {
updatePerks: function(ignoreStores) {
if($SM.get('character.perks')) {
var perks = $('#perks');
var needsAppend = false;
@@ -115,7 +115,7 @@ var Path = {
perks.appendTo(Path.panel);
}
if(Engine.activeModule === Path) {
if(!ignoreStores && Engine.activeModule === Path) {
$('#storesContainer').css({top: perks.height() + 26 + 'px'});
}
}
@@ -286,7 +286,7 @@ var Path = {
onArrival: function(transition_diff) {
Path.setTitle();
Path.updateOutfitting();
Path.updatePerks();
Path.updatePerks(true);
Engine.moveStoresView($('#perks'), transition_diff);
},