From 0f7f2bbec494cac7dae69a57285d935c71d21864 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Dupr=C3=A9?= Date: Sun, 10 Nov 2019 15:33:00 +0100 Subject: [PATCH] reorganize project into a library --- .travis.yml | 3 +- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 20 +++++----- examples/earth_iop.json | 5 ++- src/{main.rs => bin/stuffer.rs} | 51 +++++++++++++++++++----- src/character.rs | 69 +++++++++++++++++++-------------- src/input.rs | 24 ------------ src/lib.rs | 8 ++++ src/search.rs | 4 +- 10 files changed, 108 insertions(+), 80 deletions(-) rename src/{main.rs => bin/stuffer.rs} (86%) delete mode 100644 src/input.rs create mode 100644 src/lib.rs diff --git a/.travis.yml b/.travis.yml index 3463967..66d56b3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,13 +13,14 @@ before_script: script: - cargo check + - cargo test - cargo clippy -- -D warnings - cargo +nightly fmt --all -- --check before_deploy: - cargo build --release - mkdir dofus-generate-stuff - && cp target/release/dofus-generate-stuff dofus-generate-stuff + && cp target/release/stuffer dofus-generate-stuff && cp -r data examples dofus-generate-stuff - tar -czf dofus-generate-stuff.tar.gz dofus-generate-stuff diff --git a/Cargo.lock b/Cargo.lock index 06b5fea..f34fdef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -69,7 +69,7 @@ dependencies = [ ] [[package]] -name = "dofus-generate-stuff" +name = "dofus_stuff" version = "0.1.0" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index 3b0f523..6e1fb57 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "dofus-generate-stuff" +name = "dofus_stuff" version = "0.1.0" authors = ["Rémi Dupré "] edition = "2018" diff --git a/README.md b/README.md index 24adce4..152fb62 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ can download an archive containing both the binary and required item databases. wget https://github.com/remi-dupre/dofus-generate-stuff/releases/download/${VERSION}/dofus-generate-stuff.tar.gz tar -xf dofus-generate-stuff.tar.gz cd dofus-generate-stuff -./dofus-generate-stuff examples/earth_iop.json +./stuffer examples/earth_iop.json ``` ### From sources @@ -66,15 +66,15 @@ following kind of statistics: ```json { "level": 200, - "target", [ - ["Resiliance", 10000], - [{"Carac": "Lock"}, 150], - [{"Carac": "AP"}, 11], - [{"Carac": "MP"}, 6], - [{"PowStats": "Air"}, 800], - [{"Carac": "MP Resistance"}, 70], - [{"Carac": "AP Resistance"}, 70], - [{"Carac": "AP Reduction"}, 100] + "target": [ + ["Resiliance", 10000], + [{"Carac": "Lock"}, 150], + [{"Carac": "AP"}, 11], + [{"Carac": "MP"}, 6], + [{"PowStats": "Air"}, 800], + [{"Carac": "MP Resistance"}, 70], + [{"Carac": "AP Resistance"}, 70], + [{"Carac": "AP Reduction"}, 100] ] } ``` diff --git a/examples/earth_iop.json b/examples/earth_iop.json index 4d09086..7f03d9a 100644 --- a/examples/earth_iop.json +++ b/examples/earth_iop.json @@ -1,5 +1,6 @@ { "level": 200, + "banned_types": ["Trophy"], "target": [ [{"Carac": "AP"}, 12], [{"Carac": "MP"}, 5], @@ -20,7 +21,7 @@ ] } }, - 5000 + 3500 ], [ { @@ -35,7 +36,7 @@ ] } }, - 500 + 600 ] ] } diff --git a/src/main.rs b/src/bin/stuffer.rs similarity index 86% rename from src/main.rs rename to src/bin/stuffer.rs index 3ad3685..24ddf79 100644 --- a/src/main.rs +++ b/src/bin/stuffer.rs @@ -1,11 +1,6 @@ -pub mod character; -pub mod dofapi; -pub mod input; -pub mod rls; -pub mod search; - #[macro_use] extern crate lazy_static; +extern crate dofus_stuff; extern crate rand; extern crate rayon; extern crate regex; @@ -17,10 +12,19 @@ use std::io; use regex::Regex; -use crate::character::{Character, RawCaracsValue}; -use crate::dofapi::{fix_all_trophy, CaracKind, Element, Equipement, Set}; -use crate::input::InputRequest; -use crate::search::{eval_character, optimize_character}; +use dofus_stuff::character::{Character, RawCaracsValue}; +use dofus_stuff::dofapi::{ + fix_all_trophy, CaracKind, Element, Equipement, ItemType, Set, +}; +use dofus_stuff::search::{eval_character, optimize_character}; +use serde::Deserialize; + +// ____ _ _ +// / ___|___ _ __ ___| |_ __ _ _ __ | |_ ___ +// | | / _ \| '_ \/ __| __/ _` | '_ \| __/ __| +// | |__| (_) | | | \__ \ || (_| | | | | |_\__ \ +// \____\___/|_| |_|___/\__\__,_|_| |_|\__|___/ +// /// List of files containing the list of equipements. const EQUIPEMENT_FILES: [&str; 4] = [ @@ -36,6 +40,33 @@ const SET_FILE: &str = "./data/sets.json"; /// Default file to read as input when no parameter is specified. const DEFAULT_INPUT_PATH: &str = "input.json"; +// ___ _ +// |_ _|_ __ _ __ _ _| |_ +// | || '_ \| '_ \| | | | __| +// | || | | | |_) | |_| | |_ +// |___|_| |_| .__/ \__,_|\__| +// |_| + +/// Input request for building a stuff. +#[derive(Deserialize)] +pub struct InputRequest { + /// Level of the character to build a stuff for. + #[serde(default = "default_level")] + pub level: u8, + + /// Types of items that can't be used in the output. + #[serde(default)] + pub banned_types: Vec, + + /// List of approximate expected statistics in the output. + pub target: Vec<(RawCaracsValue, f64)>, +} + +/// Default level of a character. +fn default_level() -> u8 { + 200 +} + fn main() -> io::Result<()> { // --- Open item database eprintln!("-- Loading data..."); diff --git a/src/character.rs b/src/character.rs index 53e082c..d8896c0 100644 --- a/src/character.rs +++ b/src/character.rs @@ -45,7 +45,7 @@ impl<'a, 'i> ItemSlot<'a, 'i> { // \____|_| |_|\__,_|_| \__,_|\___|\__\___|_| // -#[derive(Debug)] +#[derive(Debug, Eq, PartialEq)] pub enum CharacterError<'c> { NotEnoughPoints, NotEnoughCaracs(&'c CaracKind), @@ -174,8 +174,8 @@ impl<'i> Character<'i> { /// # Examples /// /// ``` - /// use crate::dofapi::carac::CaracKind::*; - /// use crate::dofapi::effect::Element::*; + /// use dofus_stuff::character::*; + /// use dofus_stuff::dofapi::{CaracKind::*, Element::*}; /// /// assert_eq!(Character::carac_cost_from_zero(&Wisdom, 100), 300); /// assert_eq!(Character::carac_cost_from_zero(&Stats(Air), 100), 100); @@ -204,16 +204,19 @@ impl<'i> Character<'i> { /// # Examples /// /// ``` - /// use crate::dofapi::carac::CaracKind::*; - /// use crate::dofapi::effect::Element::*; + /// # use std::collections::HashMap; + /// use dofus_stuff::character::*; + /// use dofus_stuff::dofapi::{CaracKind::*, Element::*}; + /// + /// let db_sets = HashMap::new(); + /// let mut character = Character::new(200, &db_sets); /// - /// let mut character = Character::new(); /// assert_eq!(character.carac_spend_cost(&Stats(Air), 100), 100); /// assert_eq!(character.carac_spend_cost(&Stats(Air), 150), 200); /// - /// character.carac_spend(&Stats(Air), 200).unwrap(); + /// character.carac_spend(&Stats(Air), 100).unwrap(); /// assert_eq!(character.carac_spend_cost(&Stats(Air), 50), 100); - /// assert_eq!(character.carac_spend_cost(&Stats(Air), 150), 400); + /// assert_eq!(character.carac_spend_cost(&Stats(Air), 150), 350); /// ``` pub fn carac_spend_cost(&self, kind: &CaracKind, amount: u16) -> u16 { let current = *self.base_stats.get(kind).unwrap_or(&0); @@ -226,15 +229,17 @@ impl<'i> Character<'i> { /// # Examples /// /// ``` - /// use crate::dofapi::carac::CaracKind::*; - /// use crate::dofapi::effect::Element::*; + /// # use std::collections::HashMap; + /// use dofus_stuff::character::*; + /// use dofus_stuff::dofapi::{CaracKind::*, Element::*}; /// - /// let mut character = Character::new(); + /// let db_sets = HashMap::new(); + /// let mut character = Character::new(200, &db_sets); /// character.carac_spend(&Stats(Air), 200).unwrap(); /// - /// assert_eq!(character.carac_unspend_recover(&Stats(Air), 100), Ok(200)) - /// assert_eq!(character.carac_unspend_recover(&Stats(Air), 200), Ok(300)) - /// assert!(character.carac_unspend_recover(&Stats(Air), 201).is_err()) + /// assert_eq!(character.carac_unspend_recover(&Stats(Air), 100), Ok(200)); + /// assert_eq!(character.carac_unspend_recover(&Stats(Air), 200), Ok(300)); + /// assert!(character.carac_unspend_recover(&Stats(Air), 201).is_err()); /// ``` pub fn carac_unspend_recover( &self, @@ -256,13 +261,15 @@ impl<'i> Character<'i> { /// # Examples /// /// ``` - /// use crate::dofapi::carac::CaracKind::*; - /// use crate::dofapi::effect::Element::*; + /// # use std::collections::HashMap; + /// use dofus_stuff::character::*; + /// use dofus_stuff::dofapi::{CaracKind::*, Element::*}; /// - /// let mut character = Character::new(); + /// let db_sets = HashMap::new(); + /// let mut character = Character::new(200, &db_sets); /// - /// assert!(character.carac_spend(Stats(Air), 100).is_ok()); - /// assert!(character.carac_spend(Stats(Air), 400).is_err()); + /// assert!(character.carac_spend(&Stats(Air), 100).is_ok()); + /// assert!(character.carac_spend(&Stats(Air), 400).is_err()); /// ``` pub fn carac_spend( &mut self, @@ -288,15 +295,17 @@ impl<'i> Character<'i> { /// # Examples /// /// ``` - /// use crate::dofapi::carac::CaracKind::*; - /// use crate::dofapi::effect::Element::*; + /// # use std::collections::HashMap; + /// use dofus_stuff::character::*; + /// use dofus_stuff::dofapi::{CaracKind::*, Element::*}; /// - /// let mut character = Character::new(); + /// let db_sets = HashMap::new(); + /// let mut character = Character::new(200, &db_sets); /// character.carac_spend(&Stats(Air), 200).unwrap(); /// - /// assert_eq!(character.carac_unspend(Stats(Air), 100), Ok(100)); - /// assert_eq!(character.carac_unspend(Stats(Air), 99), Ok(100)); - /// assert!(character.carac_unspend(Stats(Air), 201).is_err()); + /// assert_eq!(character.carac_unspend(&Stats(Air), 100), Ok(())); + /// assert_eq!(character.carac_unspend(&Stats(Air), 99), Ok(())); + /// assert!(character.carac_unspend(&Stats(Air), 201).is_err()); /// ``` pub fn carac_unspend( &mut self, @@ -322,15 +331,17 @@ impl<'i> Character<'i> { /// # Examples /// /// ``` - /// use crate::dofapi::carac::CaracKind::*; - /// use crate::dofapi::effect::Element::*; + /// # use std::collections::HashMap; + /// use dofus_stuff::character::*; + /// use dofus_stuff::dofapi::{CaracKind::*, Element::*}; /// - /// let mut character = Character::new(); + /// let db_sets = HashMap::new(); + /// let mut character = Character::new(200, &db_sets); /// /// // Seek from unspent points /// assert!( /// character - /// .carac_spend_or_seek(&Stats(Air), 200, &Wisdom) + /// .carac_spend_or_seek(&Stats(Air), 150, &Wisdom) /// .is_ok() /// ); /// assert!( diff --git a/src/input.rs b/src/input.rs deleted file mode 100644 index 41acb87..0000000 --- a/src/input.rs +++ /dev/null @@ -1,24 +0,0 @@ -use serde::Deserialize; - -use crate::character::RawCaracsValue; -use crate::dofapi::ItemType; - -/// Input request for building a stuff. -#[derive(Deserialize)] -pub struct InputRequest { - /// Level of the character to build a stuff for. - #[serde(default = "default_level")] - pub level: u8, - - /// Types of items that can't be used in the output. - #[serde(default)] - pub banned_types: Vec, - - /// List of approximate expected statistics in the output. - pub target: Vec<(RawCaracsValue, f64)>, -} - -/// Default level of a character. -fn default_level() -> u8 { - 200 -} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..b4bed6d --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,8 @@ +#[macro_use] +extern crate lazy_static; + +pub mod character; +pub mod dofapi; +pub mod search; + +mod rls; diff --git a/src/search.rs b/src/search.rs index bac0dd9..0db8d11 100644 --- a/src/search.rs +++ b/src/search.rs @@ -5,7 +5,7 @@ use crate::character::{Character, RawCaracsValue}; use crate::dofapi::{CaracKind, Element, Equipement}; use crate::rls::rls; -const STEPS: u32 = 1_000_000; +const STEPS: u32 = 100_000; const ASSIGNABLE_CARACS: &[CaracKind] = &[ CaracKind::Vitality, CaracKind::Wisdom, @@ -76,7 +76,7 @@ pub fn eval_character( .product(); let count_item_conflicts = character.count_item_conflicts(); - let conflicts_weight = 0.1f64.powi(count_item_conflicts.into()); + let conflicts_weight = 0.05f64.powi(count_item_conflicts.into()); let conditions_weight = target_zero( 200.,