diff --git a/Cargo.lock b/Cargo.lock index 59161ab..5ba9ec1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -751,6 +751,12 @@ dependencies = [ "libc", ] +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + [[package]] name = "jni-sys" version = "0.3.0" @@ -1540,15 +1546,10 @@ dependencies = [ "piston_window", "pistoncore-sdl2_window", "rand 0.3.23", - "rustc-serialize", + "serde", + "serde_json", ] -[[package]] -name = "rustc-serialize" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" - [[package]] name = "rusttype" version = "0.9.3" @@ -1559,6 +1560,12 @@ dependencies = [ "owned_ttf_parser", ] +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + [[package]] name = "same-file" version = "1.0.6" @@ -1614,6 +1621,9 @@ name = "serde" version = "1.0.155" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71f2b4817415c6d4210bfe1c7bfcf4801b2d904cb4d0e1a8fdb651013c9e86b8" +dependencies = [ + "serde_derive", +] [[package]] name = "serde_derive" @@ -1626,6 +1636,17 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_json" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3" +dependencies = [ + "itoa", + "ryu", + "serde", +] + [[package]] name = "shader_version" version = "0.7.0" diff --git a/Cargo.toml b/Cargo.toml index 4d5ca5e..a87d074 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,8 @@ name = "rust-2048" path = "src/main.rs" [dependencies] -rustc-serialize = "0.3" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" rand = "0.3.7" piston_window = "0.127.0" pistoncore-sdl2_window = "0.68.0" diff --git a/SDL2.lib b/SDL2.lib new file mode 100644 index 0000000..7257de6 Binary files /dev/null and b/SDL2.lib differ diff --git a/SDL2main.lib b/SDL2main.lib new file mode 100644 index 0000000..1981305 Binary files /dev/null and b/SDL2main.lib differ diff --git a/SDL2test.lib b/SDL2test.lib new file mode 100644 index 0000000..0255ad4 Binary files /dev/null and b/SDL2test.lib differ diff --git a/src/main.rs b/src/main.rs index d3ae7d8..da93ada 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,9 @@ -extern crate rustc_serialize; -extern crate rand; -extern crate piston_window; extern crate opengl_graphics; +extern crate piston_window; +extern crate rand; extern crate sdl2_window; +extern crate serde; +extern crate serde_json; use piston_window::*; use sdl2_window::Sdl2Window; @@ -14,18 +15,16 @@ mod settings; mod tile; fn main() { - use opengl_graphics::GlGraphics; + use opengl_graphics::GlGraphics; let settings = settings::Settings::load(); - let (width, height) = (settings.window_size[0], - settings.window_size[1]); + let (width, height) = (settings.window_size[0], settings.window_size[1]); // according to piston WindowSettings documentation, OpenGL::V3_2 is the default version - let mut window: PistonWindow = - WindowSettings::new("Rust-2048", [width, height]) - .exit_on_esc(true) - .build() - .unwrap_or_else(|e| { panic!("Failed to build PistonWindow: {}", e) }); + let mut window: PistonWindow = WindowSettings::new("Rust-2048", [width, height]) + .exit_on_esc(true) + .build() + .unwrap_or_else(|e| panic!("Failed to build PistonWindow: {}", e)); let mut app = app::App::new(&settings); @@ -39,9 +38,9 @@ fn main() { } if let Some(ref args) = e.update_args() { - // TODO: only update if necessary - // println!("update"); - app.update(args); + // TODO: only update if necessary + // println!("update"); + app.update(args); } if let Some(ref args) = e.press_args() { diff --git a/src/settings.rs b/src/settings.rs index 9218989..7214ce2 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -1,12 +1,13 @@ - +use serde::{Deserialize, Serialize}; +use serde_json::{from_reader, to_writer}; use std::env::current_exe; -use std::io::{BufWriter, BufReader, Write}; -use std::fs::{File}; +use std::fs::File; +use std::io::{BufReader, BufWriter}; use std::path::Path; -use rustc_serialize::{ json, Encodable, Decodable }; static SETTING_FILENAME: &'static str = "settings.json"; +#[derive(Serialize, Deserialize)] pub struct Settings { pub asset_folder: String, pub window_size: [u32; 2], @@ -48,11 +49,7 @@ impl Settings { let mut tiles_colors = Vec::<[f32; 3]>::new(); for color in s.tiles_colors.iter() { - tiles_colors.push([ - color[0] / 255.0, - color[1] / 255.0, - color[2] / 255.0, - ]); + tiles_colors.push([color[0] / 255.0, color[1] / 255.0, color[2] / 255.0]); } Settings { @@ -125,7 +122,7 @@ impl Settings { } } -#[derive(RustcEncodable, RustcDecodable)] +#[derive(Serialize, Deserialize)] struct SettingsInJson { asset_folder: String, @@ -199,7 +196,7 @@ impl SettingsInJson { tile_move_time: 0.1, tile_new_time: 0.1, tile_combine_time: 0.1, - best_rect: vec![284.0, 12.0, 96.0, 48.0,], + best_rect: vec![284.0, 12.0, 96.0, 48.0], score_rect: vec![176.0, 12.0, 96.0, 48.0], label_color: vec![187.0, 173.0, 160.0], button_color: vec![142.0, 122.0, 102.0], @@ -219,33 +216,28 @@ impl SettingsInJson { exe_path.pop(); let path = exe_path.join(Path::new(SETTING_FILENAME)); - // FIXME: use this if possible (.exists() is unstable in Rust 1.0.0) - /* if !path.as_path().exists() || !path.is_file() { - println!("Configuration file not found. Generating a default one."); - let default = SettingsInJson::default_settings(); - default.save(); - return default; - } - let file = File::open(&path).unwrap(); - let mut reader = BufReader::new(file); - */ - let file = File::open(&path); + let file = File::open(&path); - match file { - Err(e) => { - println!("Configuration file can't be open ({}). Try to generate a default one.", e); + match file { + Err(e) => { + println!( + "Configuration file can't be open ({}). Try to generate a default one.", + e + ); + let default = SettingsInJson::default_settings(); + default.save(); + return default; + } + Ok(file) => { + let reader = BufReader::new(file); + serde_json::from_reader(reader).unwrap_or_else(|_| { + println!("Failed to parse settings, using default."); let default = SettingsInJson::default_settings(); default.save(); - return default; - }, - _ => {} + default + }) } - - let mut reader = BufReader::new(file.unwrap()); - // End FIXME - - let mut decoder = json::Decoder::new(json::Json::from_reader(&mut reader).unwrap()); - Decodable::decode(&mut decoder).unwrap() + } } pub fn save(&self) { @@ -256,19 +248,12 @@ impl SettingsInJson { return; } - let path = exe_path.unwrap(); - let file = File::create(&path.with_file_name(SETTING_FILENAME)).unwrap(); - let mut writer = BufWriter::new(file); + let path = exe_path.unwrap().with_file_name(SETTING_FILENAME); + let file = File::create(&path).unwrap(); + let writer = BufWriter::new(file); - match json::encode(self) { - Ok(encoded) => { - if let Err(e) = writer.write(encoded.as_bytes()) { - println!("WARNING: Failed to save settings: {}", e); - } - }, - Err(e) => { - println!("WARNING: Failed to save settings: {}", e); - } + if let Err(e) = serde_json::to_writer(writer, self) { + println!("WARNING: Failed to save settings: {}", e); } } }