201 lines
4.6 KiB
JavaScript
201 lines
4.6 KiB
JavaScript
class Storage {
|
|
|
|
constructor( game ) {
|
|
|
|
this.game = game;
|
|
|
|
const userVersion = localStorage.getItem( 'theCube_version' );
|
|
|
|
if ( ! userVersion || userVersion !== window.gameVersion ) {
|
|
|
|
this.clearGame();
|
|
this.clearPreferences();
|
|
this.migrateScores();
|
|
localStorage.setItem( 'theCube_version', window.gameVersion );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
init() {
|
|
|
|
this.loadPreferences();
|
|
this.loadScores();
|
|
|
|
}
|
|
|
|
loadGame() {
|
|
|
|
try {
|
|
|
|
const gameInProgress = localStorage.getItem( 'theCube_playing' ) === 'true';
|
|
|
|
if ( ! gameInProgress ) throw new Error();
|
|
|
|
const gameCubeData = JSON.parse( localStorage.getItem( 'theCube_savedState' ) );
|
|
const gameTime = parseInt( localStorage.getItem( 'theCube_time' ) );
|
|
|
|
if ( ! gameCubeData || gameTime === null ) throw new Error();
|
|
if ( gameCubeData.size !== this.game.cube.sizeGenerated ) throw new Error();
|
|
|
|
this.game.cube.loadFromData( gameCubeData );
|
|
|
|
this.game.timer.deltaTime = gameTime;
|
|
|
|
this.game.saved = true;
|
|
|
|
} catch( e ) {
|
|
|
|
this.game.saved = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
saveGame() {
|
|
|
|
const gameInProgress = true;
|
|
const gameCubeData = { names: [], positions: [], rotations: [] };
|
|
const gameTime = this.game.timer.deltaTime;
|
|
|
|
gameCubeData.size = this.game.cube.sizeGenerated;
|
|
|
|
this.game.cube.pieces.forEach( piece => {
|
|
|
|
gameCubeData.names.push( piece.name );
|
|
gameCubeData.positions.push( piece.position );
|
|
gameCubeData.rotations.push( piece.rotation.toVector3() );
|
|
|
|
} );
|
|
|
|
localStorage.setItem( 'theCube_playing', gameInProgress );
|
|
localStorage.setItem( 'theCube_savedState', JSON.stringify( gameCubeData ) );
|
|
localStorage.setItem( 'theCube_time', gameTime );
|
|
|
|
}
|
|
|
|
clearGame() {
|
|
|
|
localStorage.removeItem( 'theCube_playing' );
|
|
localStorage.removeItem( 'theCube_savedState' );
|
|
localStorage.removeItem( 'theCube_time' );
|
|
|
|
}
|
|
|
|
loadScores() {
|
|
|
|
try {
|
|
|
|
const scoresData = JSON.parse( localStorage.getItem( 'theCube_scores' ) );
|
|
|
|
if ( ! scoresData ) throw new Error();
|
|
|
|
this.game.scores.data = scoresData;
|
|
|
|
} catch( e ) {}
|
|
|
|
}
|
|
|
|
saveScores() {
|
|
|
|
const scoresData = this.game.scores.data;
|
|
|
|
localStorage.setItem( 'theCube_scores', JSON.stringify( scoresData ) );
|
|
|
|
}
|
|
|
|
clearScores() {
|
|
|
|
localStorage.removeItem( 'theCube_scores' );
|
|
|
|
}
|
|
|
|
migrateScores() {
|
|
|
|
try {
|
|
|
|
const scoresData = JSON.parse( localStorage.getItem( 'theCube_scoresData' ) );
|
|
const scoresBest = parseInt( localStorage.getItem( 'theCube_scoresBest' ) );
|
|
const scoresWorst = parseInt( localStorage.getItem( 'theCube_scoresWorst' ) );
|
|
const scoresSolves = parseInt( localStorage.getItem( 'theCube_scoresSolves' ) );
|
|
|
|
if ( ! scoresData || ! scoresBest || ! scoresSolves || ! scoresWorst ) return false;
|
|
|
|
this.game.scores.data[ 3 ].scores = scoresData;
|
|
this.game.scores.data[ 3 ].best = scoresBest;
|
|
this.game.scores.data[ 3 ].solves = scoresSolves;
|
|
this.game.scores.data[ 3 ].worst = scoresWorst;
|
|
|
|
localStorage.removeItem( 'theCube_scoresData' );
|
|
localStorage.removeItem( 'theCube_scoresBest' );
|
|
localStorage.removeItem( 'theCube_scoresWorst' );
|
|
localStorage.removeItem( 'theCube_scoresSolves' );
|
|
|
|
} catch( e ) {}
|
|
|
|
}
|
|
|
|
loadPreferences() {
|
|
|
|
try {
|
|
|
|
const preferences = JSON.parse( localStorage.getItem( 'theCube_preferences' ) );
|
|
|
|
if ( ! preferences ) throw new Error();
|
|
|
|
this.game.cube.size = parseInt( preferences.cubeSize );
|
|
this.game.controls.flipConfig = parseInt( preferences.flipConfig );
|
|
this.game.scrambler.dificulty = parseInt( preferences.dificulty );
|
|
|
|
this.game.world.fov = parseFloat( preferences.fov );
|
|
this.game.world.resize();
|
|
|
|
this.game.themes.colors = preferences.colors;
|
|
this.game.themes.setTheme( preferences.theme );
|
|
|
|
return true;
|
|
|
|
} catch (e) {
|
|
|
|
this.game.cube.size = 3;
|
|
this.game.controls.flipConfig = 0;
|
|
this.game.scrambler.dificulty = 1;
|
|
|
|
this.game.world.fov = 10;
|
|
this.game.world.resize();
|
|
|
|
this.game.themes.setTheme( 'cube' );
|
|
|
|
this.savePreferences();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
savePreferences() {
|
|
|
|
const preferences = {
|
|
cubeSize: this.game.cube.size,
|
|
flipConfig: this.game.controls.flipConfig,
|
|
dificulty: this.game.scrambler.dificulty,
|
|
fov: this.game.world.fov,
|
|
theme: this.game.themes.theme,
|
|
colors: this.game.themes.colors,
|
|
};
|
|
|
|
localStorage.setItem( 'theCube_preferences', JSON.stringify( preferences ) );
|
|
|
|
}
|
|
|
|
clearPreferences() {
|
|
|
|
localStorage.removeItem( 'theCube_preferences' );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
export { Storage };
|