function Session() { var game = JSON.parse(localStorage.getItem('game')); var options = JSON.parse(localStorage.getItem('options')) || defaultOptions(); return { getOptions: getOptions, getGame: getGame, save: save, setOptions: setOptions }; function getGame() { return game; } function update(state) { game = state; } function save() { localStorage.setItem('game', JSON.stringify(game)); } function merge(a, b) { for(var key in b) { var value = b[key]; if(typeof value == "object") { if(Array.isArray(value)) { a[key] = []; for(var i = 0; i < value.length; i++) { a[key][i] = value[i]; } } else { merge(a[key], value); } } else { if(value !== undefined) { a[key] = value; } else { delete a[key]; } } } } function setOptions(newOptions) { merge(options, newOptions); localStorage.setItem('options', JSON.stringify(options)); } function defaultOptions() { var o = { layout: { 'a': 'A', 'b': 'B', 'ArrowLeft': 'Left', 'ArrowRight': 'Right', 'ArrowUp': 'Up', 'ArrowDown': 'Down', 'Enter': 'Start', ' ': 'Select' }, textSpeed: 'medium' }; localStorage.setItem('options', JSON.stringify(o)); return o; } function getOptions() { return options; } }