From 23b566dbf8ba922b8760aad0a8dc46c62e955aba Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 23 May 2021 17:00:04 +0300 Subject: [PATCH 01/11] Add support for .ron loadouts --- assets/common/loadouts/gnarling.ron | 8 + assets/common/loadouts/merchant.ron | 13 + assets/common/loadouts/test.ron | 28 + common/src/comp/inventory/loadout_builder.rs | 632 +++++++++---------- 4 files changed, 338 insertions(+), 343 deletions(-) create mode 100644 assets/common/loadouts/gnarling.ron create mode 100644 assets/common/loadouts/merchant.ron create mode 100644 assets/common/loadouts/test.ron diff --git a/assets/common/loadouts/gnarling.ron b/assets/common/loadouts/gnarling.ron new file mode 100644 index 0000000000..a3d4ca6e17 --- /dev/null +++ b/assets/common/loadouts/gnarling.ron @@ -0,0 +1,8 @@ +({ + "head": Item("common.items.npc_armor.biped_small.gnarling.head.gnarling"), + "feet": Item("common.items.npc_armor.biped_small.gnarling.foot.gnarling"), + "hands": Item("common.items.npc_armor.biped_small.gnarling.hand.gnarling"), + "chest": Item("common.items.npc_armor.biped_small.gnarling.chest.gnarling"), + "pants": Item("common.items.npc_armor.biped_small.gnarling.pants.gnarling"), + "belt": Item("common.items.npc_armor.biped_small.gnarling.tail.gnarling"), +}) diff --git a/assets/common/loadouts/merchant.ron b/assets/common/loadouts/merchant.ron new file mode 100644 index 0000000000..6deb75c0a3 --- /dev/null +++ b/assets/common/loadouts/merchant.ron @@ -0,0 +1,13 @@ +({ + "shoulder": Item("common.items.armor.twigsflowers.shoulder"), + "chest": Item("common.items.armor.twigsflowers.chest"), + "hands": Item("common.items.armor.twigsflowers.hand"), + "pants": Item("common.items.armor.twigsflowers.pants"), + "feet": Item("common.items.armor.twigsflowers.foot"), + "belt": Item("common.items.armor.twigsflowers.belt"), + + "lantern": Item("common.items.lantern.black_0"), + "neck": Item("common.items.armor.misc.neck.plain_1"), + "ring1": Item("common.items.armor.misc.ring.gold"), + "ring2": Item("common.items.armor.misc.ring.gold"), +}) diff --git a/assets/common/loadouts/test.ron b/assets/common/loadouts/test.ron new file mode 100644 index 0000000000..2799a248e1 --- /dev/null +++ b/assets/common/loadouts/test.ron @@ -0,0 +1,28 @@ +({ + // Weapons + "active_mainhand": Item("common.items.weapons.sword_1h.bloodsteel-0"), + "active_offhand": Item("common.items.weapons.sword_1h.bloodsteel-0"), + + "inactive_mainhand": Item("common.items.weapons.sword_1h.bloodsteel-0"), + "inactive_offhand": Item("common.items.weapons.sword_1h.bloodsteel-0"), + + // Gear + "head": Item("common.items.npc_armor.biped_small.myrmidon.head.myrmidon"), + "shoulder": Item("common.items.armor.twigsflowers.shoulder"), + "chest": Item("common.items.armor.twigsflowers.chest"), + "hands": Item("common.items.armor.twigsflowers.hand"), + "pants": Item("common.items.armor.twigsflowers.pants"), + "feet": Item("common.items.armor.twigsflowers.foot"), + "belt": Item("common.items.armor.twigsflowers.belt"), + + // Biju + "back": Item("common.items.armor.misc.back.dungeon_purple"), + "neck": Item("common.items.armor.misc.neck.plain_1"), + "ring1": Item("common.items.armor.misc.ring.gold"), + "ring2": Item("common.items.armor.misc.ring.gold"), + + // Misc + "lantern": Item("common.items.lantern.black_0"), + "tabard": Item("common.items.debug.admin"), + "glider": Item("common.items.glider.glider_basic_red"), +}) diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 50d5f83620..9936066170 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -1,4 +1,5 @@ use crate::{ + assets::{self, AssetExt}, comp::{ biped_large, biped_small, bird_large, golem, inventory::{ @@ -11,6 +12,7 @@ use crate::{ }, trade::{Good, SiteInformation}, }; +use hashbrown::HashMap; use rand::Rng; use serde::{Deserialize, Serialize}; use strum_macros::EnumIter; @@ -58,6 +60,30 @@ pub enum LoadoutConfig { Warlock, } +#[derive(Debug, Deserialize, Clone)] +enum ItemSpec { + // One specific item. + // Example: + // `Item("common.items.armor.steel.foot")` + Item(String), + // Choice from items with weights. + // Example: + // ``` + // Choice([ + // (1.0, Some(Item("common.items.lantern.blue_0"))), + // (1.0, None), + // ]) + Choice(Vec<(f32, Option)>), +} + +#[derive(Debug, Deserialize, Clone)] +pub struct LoadoutSpec(HashMap); +impl assets::Asset for LoadoutSpec { + type Loader = assets::RonLoader; + + const EXTENSION: &'static str = "ron"; +} + pub fn make_potion_bag(quantity: u32) -> Item { let mut bag = Item::new_from_asset_expect("common.items.armor.misc.bag.tiny_leather_pouch"); if let Some(i) = bag.slots_mut().iter_mut().next() { @@ -70,6 +96,176 @@ pub fn make_potion_bag(quantity: u32) -> Item { bag } +pub fn default_main_tool(body: &Body) -> Option { + match body { + Body::Golem(golem) => match golem.species { + golem::Species::StoneGolem => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.stone_golems_fist", + )), + golem::Species::ClayGolem => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.clay_golem_fist", + )), + _ => None, + }, + Body::QuadrupedMedium(quadruped_medium) => match quadruped_medium.species { + quadruped_medium::Species::Wolf + | quadruped_medium::Species::Grolgar + | quadruped_medium::Species::Lion + | quadruped_medium::Species::Bonerattler + | quadruped_medium::Species::Darkhound + | quadruped_medium::Species::Snowleopard => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.quadmedquick", + )), + quadruped_medium::Species::Donkey + | quadruped_medium::Species::Horse + | quadruped_medium::Species::Zebra + | quadruped_medium::Species::Kelpie + | quadruped_medium::Species::Hirdrasil + | quadruped_medium::Species::Deer + | quadruped_medium::Species::Antelope => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.quadmedhoof", + )), + quadruped_medium::Species::Saber => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.quadmedjump", + )), + quadruped_medium::Species::Tuskram + | quadruped_medium::Species::Roshwalr + | quadruped_medium::Species::Moose + | quadruped_medium::Species::Dreadhorn => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.quadmedcharge", + )), + quadruped_medium::Species::Highland + | quadruped_medium::Species::Cattle + | quadruped_medium::Species::Yak => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.quadmedbasicgentle", + )), + _ => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.quadmedbasic", + )), + }, + Body::QuadrupedLow(quadruped_low) => match quadruped_low.species { + quadruped_low::Species::Maneater | quadruped_low::Species::Asp => Some( + Item::new_from_asset_expect("common.items.npc_weapons.unique.quadlowranged"), + ), + quadruped_low::Species::Crocodile + | quadruped_low::Species::Alligator + | quadruped_low::Species::Salamander => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.quadlowtail", + )), + quadruped_low::Species::Monitor | quadruped_low::Species::Pangolin => Some( + Item::new_from_asset_expect("common.items.npc_weapons.unique.quadlowquick"), + ), + quadruped_low::Species::Lavadrake => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.quadlowbreathe", + )), + quadruped_low::Species::Deadwood => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.quadlowbeam", + )), + _ => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.quadlowbasic", + )), + }, + Body::QuadrupedSmall(_) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.quadsmallbasic", + )), + Body::Theropod(theropod) => match theropod.species { + theropod::Species::Sandraptor + | theropod::Species::Snowraptor + | theropod::Species::Woodraptor => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.theropodbird", + )), + theropod::Species::Yale => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.theropodcharge", + )), + _ => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.theropodbasic", + )), + }, + Body::BipedLarge(biped_large) => match (biped_large.species, biped_large.body_type) { + (biped_large::Species::Occultsaurok, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.staff.saurok_staff", + )), + (biped_large::Species::Mightysaurok, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.sword.saurok_sword", + )), + (biped_large::Species::Slysaurok, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.bow.saurok_bow", + )), + (biped_large::Species::Ogre, biped_large::BodyType::Male) => Some( + Item::new_from_asset_expect("common.items.npc_weapons.hammer.ogre_hammer"), + ), + (biped_large::Species::Ogre, biped_large::BodyType::Female) => Some( + Item::new_from_asset_expect("common.items.npc_weapons.staff.ogre_staff"), + ), + (biped_large::Species::Troll, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.hammer.troll_hammer", + )), + (biped_large::Species::Wendigo, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.wendigo_magic", + )), + (biped_large::Species::Werewolf, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.beast_claws", + )), + (biped_large::Species::Cyclops, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.hammer.cyclops_hammer", + )), + (biped_large::Species::Dullahan, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.sword.dullahan_sword", + )), + (biped_large::Species::Mindflayer, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.staff.mindflayer_staff", + )), + (biped_large::Species::Minotaur, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.axe.minotaur_axe", + )), + (biped_large::Species::Tidalwarrior, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.tidal_claws", + )), + (biped_large::Species::Yeti, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.hammer.yeti_hammer", + )), + (biped_large::Species::Harvester, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.hammer.harvester_scythe", + )), + (biped_large::Species::Blueoni, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.axe.oni_blue_axe", + )), + (biped_large::Species::Redoni, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.hammer.oni_red_hammer", + )), + }, + Body::Object(body) => match body { + object::Body::Crossbow => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.turret", + )), + object::Body::HaniwaSentry => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.haniwa_sentry", + )), + _ => None, + }, + Body::BipedSmall(biped_small) => match (biped_small.species, biped_small.body_type) { + (biped_small::Species::Gnome, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.biped_small.adlet.gnoll_staff", + )), + (biped_small::Species::Husk, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.husk", + )), + _ => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.biped_small.adlet.wooden_spear", + )), + }, + Body::BirdLarge(bird_large) => match (bird_large.species, bird_large.body_type) { + (bird_large::Species::Cockatrice, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.birdlargebreathe", + )), + (bird_large::Species::Phoenix, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.birdlargefire", + )), + }, + _ => None, + } +} + impl LoadoutBuilder { #[allow(clippy::new_without_default)] // TODO: Pending review in #587 pub fn new() -> Self { Self(Loadout::new_empty()) } @@ -104,259 +300,7 @@ impl LoadoutBuilder { ) -> Self { // If no main tool is passed in, checks if species has a default main tool if main_tool.is_none() { - match body { - Body::Golem(golem) => match golem.species { - golem::Species::StoneGolem => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.stone_golems_fist", - )); - }, - golem::Species::ClayGolem => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.clay_golem_fist", - )); - }, - _ => {}, - }, - Body::QuadrupedMedium(quadruped_medium) => match quadruped_medium.species { - quadruped_medium::Species::Wolf - | quadruped_medium::Species::Grolgar - | quadruped_medium::Species::Lion - | quadruped_medium::Species::Bonerattler - | quadruped_medium::Species::Darkhound - | quadruped_medium::Species::Snowleopard => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.quadmedquick", - )); - }, - quadruped_medium::Species::Donkey - | quadruped_medium::Species::Horse - | quadruped_medium::Species::Zebra - | quadruped_medium::Species::Kelpie - | quadruped_medium::Species::Hirdrasil - | quadruped_medium::Species::Deer - | quadruped_medium::Species::Antelope => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.quadmedhoof", - )); - }, - quadruped_medium::Species::Saber => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.quadmedjump", - )); - }, - quadruped_medium::Species::Tuskram - | quadruped_medium::Species::Roshwalr - | quadruped_medium::Species::Moose - | quadruped_medium::Species::Dreadhorn => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.quadmedcharge", - )); - }, - quadruped_medium::Species::Highland - | quadruped_medium::Species::Cattle - | quadruped_medium::Species::Yak => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.quadmedbasicgentle", - )); - }, - _ => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.quadmedbasic", - )); - }, - }, - Body::QuadrupedLow(quadruped_low) => match quadruped_low.species { - quadruped_low::Species::Maneater | quadruped_low::Species::Asp => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.quadlowranged", - )); - }, - quadruped_low::Species::Crocodile - | quadruped_low::Species::Alligator - | quadruped_low::Species::Salamander => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.quadlowtail", - )); - }, - quadruped_low::Species::Monitor | quadruped_low::Species::Pangolin => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.quadlowquick", - )); - }, - quadruped_low::Species::Lavadrake => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.quadlowbreathe", - )); - }, - quadruped_low::Species::Deadwood => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.quadlowbeam", - )); - }, - _ => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.quadlowbasic", - )); - }, - }, - Body::QuadrupedSmall(_) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.quadsmallbasic", - )); - }, - Body::Theropod(theropod) => match theropod.species { - theropod::Species::Sandraptor - | theropod::Species::Snowraptor - | theropod::Species::Woodraptor => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.theropodbird", - )); - }, - theropod::Species::Yale => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.theropodcharge", - )); - }, - _ => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.theropodbasic", - )); - }, - }, - Body::BipedLarge(biped_large) => match (biped_large.species, biped_large.body_type) - { - (biped_large::Species::Occultsaurok, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.staff.saurok_staff", - )); - }, - (biped_large::Species::Mightysaurok, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.sword.saurok_sword", - )); - }, - (biped_large::Species::Slysaurok, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.bow.saurok_bow", - )); - }, - (biped_large::Species::Ogre, biped_large::BodyType::Male) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.hammer.ogre_hammer", - )); - }, - (biped_large::Species::Ogre, biped_large::BodyType::Female) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.staff.ogre_staff", - )); - }, - (biped_large::Species::Troll, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.hammer.troll_hammer", - )); - }, - (biped_large::Species::Wendigo, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.wendigo_magic", - )); - }, - (biped_large::Species::Werewolf, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.beast_claws", - )); - }, - (biped_large::Species::Cyclops, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.hammer.cyclops_hammer", - )); - }, - (biped_large::Species::Dullahan, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.sword.dullahan_sword", - )); - }, - (biped_large::Species::Mindflayer, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.staff.mindflayer_staff", - )); - }, - (biped_large::Species::Minotaur, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.axe.minotaur_axe", - )); - }, - (biped_large::Species::Tidalwarrior, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.tidal_claws", - )); - }, - (biped_large::Species::Yeti, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.hammer.yeti_hammer", - )); - }, - (biped_large::Species::Harvester, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.hammer.harvester_scythe", - )); - }, - (biped_large::Species::Blueoni, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.axe.oni_blue_axe", - )); - }, - (biped_large::Species::Redoni, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.hammer.oni_red_hammer", - )); - }, - }, - Body::Object(body) => match body { - object::Body::Crossbow => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.turret", - )); - }, - object::Body::HaniwaSentry => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.haniwa_sentry", - )); - }, - _ => {}, - }, - Body::BipedSmall(biped_small) => match (biped_small.species, biped_small.body_type) - { - (biped_small::Species::Gnome, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.biped_small.adlet.gnoll_staff", - )); - }, - (biped_small::Species::Husk, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.husk", - )); - }, - _ => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.biped_small.adlet.wooden_spear", - )); - }, - }, - Body::BirdLarge(bird_large) => match (bird_large.species, bird_large.body_type) { - (bird_large::Species::Cockatrice, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.birdlargebreathe", - )); - }, - (bird_large::Species::Phoenix, _) => { - main_tool = Some(Item::new_from_asset_expect( - "common.items.npc_weapons.unique.birdlargefire", - )); - }, - }, - _ => {}, - }; + main_tool = default_main_tool(&body); } // Constructs ItemConfig from Item @@ -422,66 +366,12 @@ impl LoadoutBuilder { _ => LoadoutBuilder::new().active_mainhand(active_item).build(), }, Gnarling => match active_tool_kind { - Some(ToolKind::Bow) => LoadoutBuilder::new() - .active_mainhand(active_item) - .head(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.head.gnarling", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.foot.gnarling", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.hand.gnarling", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.chest.gnarling", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.pants.gnarling", - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.tail.gnarling", - ))) - .build(), - Some(ToolKind::Staff) => LoadoutBuilder::new() - .active_mainhand(active_item) - .head(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.head.gnarling", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.foot.gnarling", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.hand.gnarling", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.chest.gnarling", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.pants.gnarling", - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.tail.gnarling", - ))) - .build(), - Some(ToolKind::Spear) => LoadoutBuilder::new() - .active_mainhand(active_item) - .head(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.head.gnarling", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.foot.gnarling", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.hand.gnarling", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.chest.gnarling", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.gnarling.pants.gnarling", - ))) - .build(), + Some(ToolKind::Bow) | Some(ToolKind::Staff) | Some(ToolKind::Spear) => { + LoadoutBuilder::new() + .active_mainhand(active_item) + .complete_from_spec("common.loadouts.gnarling") + .build() + }, _ => LoadoutBuilder::new().active_mainhand(active_item).build(), }, Sahagin => LoadoutBuilder::new() @@ -706,41 +596,12 @@ impl LoadoutBuilder { } LoadoutBuilder::new() .active_mainhand(active_item) - .shoulder(Some(Item::new_from_asset_expect( - "common.items.armor.twigsflowers.shoulder", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.armor.twigsflowers.chest", - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.armor.twigsflowers.belt", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.armor.twigsflowers.hand", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.armor.twigsflowers.pants", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.armor.twigsflowers.foot", - ))) - .lantern(Some(Item::new_from_asset_expect( - "common.items.lantern.black_0", - ))) .back(Some(backpack)) - .neck(Some(Item::new_from_asset_expect( - "common.items.armor.misc.neck.plain_1", - ))) - .ring1(Some(Item::new_from_asset_expect( - "common.items.armor.misc.ring.gold", - ))) - .ring2(Some(Item::new_from_asset_expect( - "common.items.armor.misc.ring.gold", - ))) .bag(ArmorSlot::Bag1, Some(bag1)) .bag(ArmorSlot::Bag2, Some(bag2)) .bag(ArmorSlot::Bag3, Some(bag3)) .bag(ArmorSlot::Bag4, Some(bag4)) + .complete_from_spec("common.loadouts.merchant") .build() }, Outcast => LoadoutBuilder::new() @@ -1169,6 +1030,88 @@ impl LoadoutBuilder { } pub fn build(self) -> Loadout { self.0 } + + pub fn complete_from_spec(self, asset_specifier: &str) -> Self { + let spec = LoadoutSpec::load_expect(asset_specifier).read().0.clone(); + let mut loadout = self; + for (key, specifier) in spec { + let item = match specifier { + ItemSpec::Item(specifier) => Item::new_from_asset_expect(&specifier), + ItemSpec::Choice(_) => Item::empty(), + }; + match key.as_str() { + "active_mainhand" => { + loadout = loadout.active_mainhand(Some(item)); + }, + "active_offhand" => { + loadout = loadout.active_offhand(Some(item)); + }, + "inactive_mainhand" => { + loadout = loadout.inactive_mainhand(Some(item)); + }, + "inactive_offhand" => { + loadout = loadout.inactive_offhand(Some(item)); + }, + "head" => { + loadout = loadout.head(Some(item)); + }, + "shoulder" => { + loadout = loadout.shoulder(Some(item)); + }, + "chest" => { + loadout = loadout.chest(Some(item)); + }, + "hands" => { + loadout = loadout.hands(Some(item)); + }, + "pants" => { + loadout = loadout.pants(Some(item)); + }, + "feet" => { + loadout = loadout.feet(Some(item)); + }, + "belt" => { + loadout = loadout.belt(Some(item)); + }, + "back" => { + loadout = loadout.back(Some(item)); + }, + "neck" => { + loadout = loadout.neck(Some(item)); + }, + "ring1" => { + loadout = loadout.ring1(Some(item)); + }, + "ring2" => { + loadout = loadout.ring2(Some(item)); + }, + "lantern" => { + loadout = loadout.lantern(Some(item)); + }, + "tabard" => { + loadout = loadout.tabard(Some(item)); + }, + "glider" => { + loadout = loadout.glider(Some(item)); + }, + _ => { + if cfg!(tests) { + panic!( + "Unexpected key in loadout asset ({}): {}", + asset_specifier, key + ); + } else { + warn!( + "Unexpected key in loadout asset ({}): {}", + asset_specifier, key + ); + } + }, + }; + } + + loadout + } } #[cfg(test)] @@ -1262,4 +1205,7 @@ mod tests { golem: Golem, ); } + + #[test] + fn test_loadout_assets() { LoadoutBuilder::new().complete_from_spec("common.loadouts.test"); } } From d587aff6130737f5081b141f2b3d4d0ed2c18d52 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 23 May 2021 17:24:22 +0300 Subject: [PATCH 02/11] Implement random choosing of item from loadout --- common/src/comp/inventory/loadout_builder.rs | 31 ++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 9936066170..c5d6c33eb8 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -13,7 +13,7 @@ use crate::{ trade::{Good, SiteInformation}, }; use hashbrown::HashMap; -use rand::Rng; +use rand::{seq::SliceRandom, Rng}; use serde::{Deserialize, Serialize}; use strum_macros::EnumIter; use tracing::warn; @@ -1037,7 +1037,34 @@ impl LoadoutBuilder { for (key, specifier) in spec { let item = match specifier { ItemSpec::Item(specifier) => Item::new_from_asset_expect(&specifier), - ItemSpec::Choice(_) => Item::empty(), + ItemSpec::Choice(items) => { + let mut rng = rand::thread_rng(); + match items + .choose_weighted(&mut rng, |item| item.0) + .unwrap_or_else(|| { + panic!( + "failed to choose item from loadout asset ({})", + asset_specifier + ) + }) { + (_, Some(ItemSpec::Item(item_specifier))) => { + Item::new_from_asset_expect(&item_specifier) + }, + (_, Some(ItemSpec::Choice(_))) => { + let err = format!( + "Using choice of choices in ({}): {}. Unimplemented.", + asset_specifier, key, + ); + if cfg!(tests) { + panic!("{}", err); + } else { + warn!("{}", err); + } + continue; + }, + (_, None) => continue, + } + }, }; match key.as_str() { "active_mainhand" => { From e8c0f62c6097e4844a84f507278859b09bad7267 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 23 May 2021 18:33:41 +0300 Subject: [PATCH 03/11] Move loadout config handling to .ron files --- assets/common/loadouts/adlet_bow.ron | 8 + assets/common/loadouts/adlet_spear.ron | 8 + assets/common/loadouts/bandit.ron | 15 + assets/common/loadouts/beastmaster.ron | 17 + assets/common/loadouts/cultist_acolyte.ron | 17 + assets/common/loadouts/cultist_novice.ron | 17 + assets/common/loadouts/guard.ron | 13 + assets/common/loadouts/haniwa.ron | 7 + assets/common/loadouts/highwayman.ron | 15 + assets/common/loadouts/husk.ron | 7 + assets/common/loadouts/myrmidon.ron | 8 + assets/common/loadouts/outcast.ron | 13 + assets/common/loadouts/sahagin.ron | 8 + assets/common/loadouts/villager.ron | 22 ++ assets/common/loadouts/warlock.ron | 17 + assets/common/loadouts/warlord.ron | 17 + common/src/comp/inventory/loadout_builder.rs | 380 +------------------ 17 files changed, 226 insertions(+), 363 deletions(-) create mode 100644 assets/common/loadouts/adlet_bow.ron create mode 100644 assets/common/loadouts/adlet_spear.ron create mode 100644 assets/common/loadouts/bandit.ron create mode 100644 assets/common/loadouts/beastmaster.ron create mode 100644 assets/common/loadouts/cultist_acolyte.ron create mode 100644 assets/common/loadouts/cultist_novice.ron create mode 100644 assets/common/loadouts/guard.ron create mode 100644 assets/common/loadouts/haniwa.ron create mode 100644 assets/common/loadouts/highwayman.ron create mode 100644 assets/common/loadouts/husk.ron create mode 100644 assets/common/loadouts/myrmidon.ron create mode 100644 assets/common/loadouts/outcast.ron create mode 100644 assets/common/loadouts/sahagin.ron create mode 100644 assets/common/loadouts/villager.ron create mode 100644 assets/common/loadouts/warlock.ron create mode 100644 assets/common/loadouts/warlord.ron diff --git a/assets/common/loadouts/adlet_bow.ron b/assets/common/loadouts/adlet_bow.ron new file mode 100644 index 0000000000..a01505224c --- /dev/null +++ b/assets/common/loadouts/adlet_bow.ron @@ -0,0 +1,8 @@ +({ + "head": Item("common.items.npc_armor.biped_small.adlet.head.adlet_bow"), + "hands": Item("common.items.npc_armor.biped_small.adlet.hand.adlet_bow"), + "feet": Item("common.items.npc_armor.biped_small.adlet.foot.adlet"), + "chest": Item("common.items.npc_armor.biped_small.adlet.chest.adlet_bow"), + "pants": Item("common.items.npc_armor.biped_small.adlet.pants.adlet_bow"), + "belt": Item("common.items.npc_armor.biped_small.adlet.tail.adlet"), +}) diff --git a/assets/common/loadouts/adlet_spear.ron b/assets/common/loadouts/adlet_spear.ron new file mode 100644 index 0000000000..c02a246b04 --- /dev/null +++ b/assets/common/loadouts/adlet_spear.ron @@ -0,0 +1,8 @@ +({ + "head": Item("common.items.npc_armor.biped_small.adlet.head.adlet_spear"), + "hands": Item("common.items.npc_armor.biped_small.adlet.hand.adlet_spear"), + "feet": Item("common.items.npc_armor.biped_small.adlet.foot.adlet"), + "chest": Item("common.items.npc_armor.biped_small.adlet.chest.adlet_spear"), + "pants": Item("common.items.npc_armor.biped_small.adlet.pants.adlet_spear"), + "belt": Item("common.items.npc_armor.biped_small.adlet.tail.adlet"), +}) diff --git a/assets/common/loadouts/bandit.ron b/assets/common/loadouts/bandit.ron new file mode 100644 index 0000000000..eb18a0332c --- /dev/null +++ b/assets/common/loadouts/bandit.ron @@ -0,0 +1,15 @@ +({ + "shoulder": Item("common.items.armor.assassin.shoulder"), + "chest": Item("common.items.armor.assassin.chest"), + "belt": Item("common.items.armor.assassin.belt"), + "hands": Item("common.items.armor.assassin.hand"), + "pants": Item("common.items.armor.assassin.pants"), + "feet": Item("common.items.armor.assassin.foot"), + + "lantern": Choice([ + (1.0, Some(Item("common.items.lantern.black_0"))), + (2.0, None), + ]), + + "glider": Item("common.items.glider.glider_cloverleaf"), +}) diff --git a/assets/common/loadouts/beastmaster.ron b/assets/common/loadouts/beastmaster.ron new file mode 100644 index 0000000000..87dd7fbba1 --- /dev/null +++ b/assets/common/loadouts/beastmaster.ron @@ -0,0 +1,17 @@ +({ + "shoulder": Item("common.items.armor.ferocious.shoulder"), + "chest": Item("common.items.armor.ferocious.chest"), + "belt": Item("common.items.armor.ferocious.belt"), + "hands": Item("common.items.armor.ferocious.hand"), + "pants": Item("common.items.armor.ferocious.pants"), + "feet": Item("common.items.armor.ferocious.foot"), + + "back": Item("common.items.armor.ferocious.back"), + + "lantern": Choice([ + (1.0, Some(Item("common.items.lantern.black_0"))), + (2.0, None), + ]), + + "glider": Item("common.items.glider.glider_blue"), +}) diff --git a/assets/common/loadouts/cultist_acolyte.ron b/assets/common/loadouts/cultist_acolyte.ron new file mode 100644 index 0000000000..865f43898a --- /dev/null +++ b/assets/common/loadouts/cultist_acolyte.ron @@ -0,0 +1,17 @@ +({ + "shoulder": Item("common.items.armor.cultist.shoulder"), + "chest": Item("common.items.armor.cultist.chest"), + "belt": Item("common.items.armor.cultist.belt"), + "hands": Item("common.items.armor.cultist.hand"), + "pants": Item("common.items.armor.cultist.pants"), + "feet": Item("common.items.armor.cultist.foot"), + + "back": Item("common.items.armor.misc.back.dungeon_purple"), + + "lantern": Choice([ + (1.0, Some(Item("common.items.lantern.black_0"))), + (2.0, None), + ]), + + "glider": Item("common.items.glider.glider_blue"), +}) diff --git a/assets/common/loadouts/cultist_novice.ron b/assets/common/loadouts/cultist_novice.ron new file mode 100644 index 0000000000..c8324e703d --- /dev/null +++ b/assets/common/loadouts/cultist_novice.ron @@ -0,0 +1,17 @@ +({ + "shoulder": Item("common.items.armor.steel.shoulder"), + "chest": Item("common.items.armor.steel.chest"), + "belt": Item("common.items.armor.steel.belt"), + "hands": Item("common.items.armor.steel.hand"), + "pants": Item("common.items.armor.steel.pants"), + "feet": Item("common.items.armor.steel.foot"), + + "back": Item("common.items.armor.misc.back.dungeon_purple"), + + "lantern": Choice([ + (1.0, Some(Item("common.items.lantern.black_0"))), + (2.0, None), + ]), + + "glider": Item("common.items.glider.glider_blue"), +}) diff --git a/assets/common/loadouts/guard.ron b/assets/common/loadouts/guard.ron new file mode 100644 index 0000000000..afeb440bf9 --- /dev/null +++ b/assets/common/loadouts/guard.ron @@ -0,0 +1,13 @@ +({ + "shoulder": Item("common.items.armor.leather_plate.shoulder"), + "chest": Item("common.items.armor.leather_plate.chest"), + "belt": Item("common.items.armor.leather_plate.belt"), + "hands": Item("common.items.armor.leather_plate.hand"), + "pants": Item("common.items.armor.leather_plate.pants"), + "feet": Item("common.items.armor.leather_plate.foot"), + + "lantern": Choice([ + (1.0, Some(Item("common.items.lantern.black_0"))), + (2.0, None), + ]), +}) diff --git a/assets/common/loadouts/haniwa.ron b/assets/common/loadouts/haniwa.ron new file mode 100644 index 0000000000..b2b9aa90e1 --- /dev/null +++ b/assets/common/loadouts/haniwa.ron @@ -0,0 +1,7 @@ +({ + "head": Item("common.items.npc_armor.biped_small.haniwa.head.haniwa"), + "feet": Item("common.items.npc_armor.biped_small.haniwa.foot.haniwa"), + "hands": Item("common.items.npc_armor.biped_small.haniwa.hand.haniwa"), + "chest": Item("common.items.npc_armor.biped_small.haniwa.chest.haniwa"), + "pants": Item("common.items.npc_armor.biped_small.haniwa.pants.haniwa"), +}) diff --git a/assets/common/loadouts/highwayman.ron b/assets/common/loadouts/highwayman.ron new file mode 100644 index 0000000000..cb67904f20 --- /dev/null +++ b/assets/common/loadouts/highwayman.ron @@ -0,0 +1,15 @@ +({ + "shoulder": Item("common.items.armor.swift.shoulder"), + "chest": Item("common.items.armor.swift.chest"), + "belt": Item("common.items.armor.swift.belt"), + "hands": Item("common.items.armor.swift.hand"), + "pants": Item("common.items.armor.swift.pants"), + "feet": Item("common.items.armor.swift.foot"), + + "lantern": Choice([ + (1.0, Some(Item("common.items.lantern.black_0"))), + (2.0, None), + ]), + + "glider": Item("common.items.glider.glider_cloverleaf"), +}) diff --git a/assets/common/loadouts/husk.ron b/assets/common/loadouts/husk.ron new file mode 100644 index 0000000000..9d5a3f6d83 --- /dev/null +++ b/assets/common/loadouts/husk.ron @@ -0,0 +1,7 @@ +({ + "head": Item("common.items.npc_armor.biped_small.husk.head.husk"), + "feet": Item("common.items.npc_armor.biped_small.husk.foot.husk"), + "hands": Item("common.items.npc_armor.biped_small.husk.hand.husk"), + "chest": Item("common.items.npc_armor.biped_small.husk.chest.husk"), + "pants": Item("common.items.npc_armor.biped_small.husk.pants.husk"), +}) diff --git a/assets/common/loadouts/myrmidon.ron b/assets/common/loadouts/myrmidon.ron new file mode 100644 index 0000000000..565b91d416 --- /dev/null +++ b/assets/common/loadouts/myrmidon.ron @@ -0,0 +1,8 @@ +({ + "head": Item("common.items.npc_armor.biped_small.myrmidon.head.myrmidon"), + "feet": Item("common.items.npc_armor.biped_small.myrmidon.foot.myrmidon"), + "hands": Item("common.items.npc_armor.biped_small.myrmidon.hand.myrmidon"), + "chest": Item("common.items.npc_armor.biped_small.myrmidon.chest.myrmidon"), + "pants": Item("common.items.npc_armor.biped_small.myrmidon.pants.myrmidon"), + "belt": Item("common.items.npc_armor.biped_small.myrmidon.tail.myrmidon"), +}) diff --git a/assets/common/loadouts/outcast.ron b/assets/common/loadouts/outcast.ron new file mode 100644 index 0000000000..ad5fac7b14 --- /dev/null +++ b/assets/common/loadouts/outcast.ron @@ -0,0 +1,13 @@ +({ + "shoulder": Item("common.items.armor.cloth_purple.shoulder"), + "chest": Item("common.items.armor.cloth_purple.chest"), + "belt": Item("common.items.armor.cloth_purple.belt"), + "hands": Item("common.items.armor.cloth_purple.hand"), + "pants": Item("common.items.armor.cloth_purple.pants"), + "feet": Item("common.items.armor.cloth_purple.foot"), + + "lantern": Choice([ + (1.0, Some(Item("common.items.lantern.black_0"))), + (2.0, None), + ]), +}) diff --git a/assets/common/loadouts/sahagin.ron b/assets/common/loadouts/sahagin.ron new file mode 100644 index 0000000000..3a26362fc8 --- /dev/null +++ b/assets/common/loadouts/sahagin.ron @@ -0,0 +1,8 @@ +({ + "head": Item("common.items.npc_armor.biped_small.sahagin.head.sahagin"), + "feet": Item("common.items.npc_armor.biped_small.sahagin.foot.sahagin"), + "hands": Item("common.items.npc_armor.biped_small.sahagin.hand.sahagin"), + "chest": Item("common.items.npc_armor.biped_small.sahagin.chest.sahagin"), + "pants": Item("common.items.npc_armor.biped_small.sahagin.pants.sahagin"), + "belt": Item("common.items.npc_armor.biped_small.sahagin.tail.sahagin"), +}) diff --git a/assets/common/loadouts/villager.ron b/assets/common/loadouts/villager.ron new file mode 100644 index 0000000000..fb520a56e3 --- /dev/null +++ b/assets/common/loadouts/villager.ron @@ -0,0 +1,22 @@ +({ + "chest": Choice([ + (1.0, Some(Item("common.items.armor.misc.chest.worker_green_0"))), + (1.0, Some(Item("common.items.armor.misc.chest.worker_green_1"))), + (1.0, Some(Item("common.items.armor.misc.chest.worker_red_0"))), + (1.0, Some(Item("common.items.armor.misc.chest.worker_red_1"))), + (1.0, Some(Item("common.items.armor.misc.chest.worker_purple_0"))), + (1.0, Some(Item("common.items.armor.misc.chest.worker_purple_1"))), + (1.0, Some(Item("common.items.armor.misc.chest.worker_yellow_0"))), + (1.0, Some(Item("common.items.armor.misc.chest.worker_yellow_1"))), + (1.0, Some(Item("common.items.armor.misc.chest.worker_orange_0"))), + (1.0, Some(Item("common.items.armor.misc.chest.worker_orange_1"))), + ]), + + "belt": Item("common.items.armor.swift.belt"), + "pants": Item("common.items.armor.misc.pants.worker_blue"), + + "feet": Choice([ + (1.0, Some(Item("common.items.armor.swift.foot"))), + (1.0, Some(Item("common.items.armor.misc.foot.sandals"))), + ]), +}) diff --git a/assets/common/loadouts/warlock.ron b/assets/common/loadouts/warlock.ron new file mode 100644 index 0000000000..ea04930ce3 --- /dev/null +++ b/assets/common/loadouts/warlock.ron @@ -0,0 +1,17 @@ +({ + "shoulder": Item("common.items.armor.warlock.shoulder"), + "chest": Item("common.items.armor.warlock.chest"), + "belt": Item("common.items.armor.warlock.belt"), + "hands": Item("common.items.armor.warlock.hand"), + "pants": Item("common.items.armor.warlock.pants"), + "feet": Item("common.items.armor.warlock.foot"), + + "back": Item("common.items.armor.warlock.back"), + + "lantern": Choice([ + (1.0, Some(Item("common.items.lantern.black_0"))), + (2.0, None), + ]), + + "glider": Item("common.items.glider.glider_purp"), +}) diff --git a/assets/common/loadouts/warlord.ron b/assets/common/loadouts/warlord.ron new file mode 100644 index 0000000000..66b65cc8ae --- /dev/null +++ b/assets/common/loadouts/warlord.ron @@ -0,0 +1,17 @@ +({ + "shoulder": Item("common.items.armor.warlord.shoulder"), + "chest": Item("common.items.armor.warlord.chest"), + "belt": Item("common.items.armor.warlord.belt"), + "hands": Item("common.items.armor.warlord.hand"), + "pants": Item("common.items.armor.warlord.pants"), + "feet": Item("common.items.armor.warlord.foot"), + + "back": Item("common.items.armor.warlord.back"), + + "lantern": Choice([ + (1.0, Some(Item("common.items.lantern.black_0"))), + (2.0, None), + ]), + + "glider": Item("common.items.glider.glider_purp"), +}) diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index c5d6c33eb8..31e5338a46 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -323,45 +323,11 @@ impl LoadoutBuilder { Adlet => match active_tool_kind { Some(ToolKind::Bow) => LoadoutBuilder::new() .active_mainhand(active_item) - .head(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.adlet.head.adlet_bow", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.adlet.hand.adlet_bow", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.adlet.foot.adlet", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.adlet.chest.adlet_bow", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.adlet.pants.adlet_bow", - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.adlet.tail.adlet", - ))) + .complete_from_spec("common.loadouts.adlet_bow") .build(), Some(ToolKind::Spear) | Some(ToolKind::Staff) => LoadoutBuilder::new() .active_mainhand(active_item) - .head(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.adlet.head.adlet_spear", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.adlet.hand.adlet_spear", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.adlet.foot.adlet", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.adlet.chest.adlet_spear", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.adlet.pants.adlet_spear", - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.adlet.tail.adlet", - ))) + .complete_from_spec("common.loadouts.adlet_spear") .build(), _ => LoadoutBuilder::new().active_mainhand(active_item).build(), }, @@ -376,106 +342,23 @@ impl LoadoutBuilder { }, Sahagin => LoadoutBuilder::new() .active_mainhand(active_item) - .head(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.sahagin.head.sahagin", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.sahagin.foot.sahagin", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.sahagin.hand.sahagin", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.sahagin.chest.sahagin", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.sahagin.pants.sahagin", - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.sahagin.tail.sahagin", - ))) + .complete_from_spec("common.loadouts.sahagin") .build(), Haniwa => LoadoutBuilder::new() .active_mainhand(active_item) - .head(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.haniwa.head.haniwa", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.haniwa.foot.haniwa", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.haniwa.hand.haniwa", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.haniwa.chest.haniwa", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.haniwa.pants.haniwa", - ))) + .complete_from_spec("common.loadouts.haniwa") .build(), Myrmidon => LoadoutBuilder::new() .active_mainhand(active_item) - .head(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.myrmidon.head.myrmidon", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.myrmidon.foot.myrmidon", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.myrmidon.hand.myrmidon", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.myrmidon.chest.myrmidon", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.myrmidon.pants.myrmidon", - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.myrmidon.tail.myrmidon", - ))) + .complete_from_spec("common.loadouts.myrmidon") .build(), Husk => LoadoutBuilder::new() .active_mainhand(active_item) - .head(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.husk.head.husk", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.husk.foot.husk", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.husk.hand.husk", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.husk.chest.husk", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_small.husk.pants.husk", - ))) + .complete_from_spec("common.loadouts.husk") .build(), Guard => LoadoutBuilder::new() .active_mainhand(active_item) - .shoulder(Some(Item::new_from_asset_expect( - "common.items.armor.leather_plate.shoulder", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.armor.leather_plate.chest", - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.armor.leather_plate.belt", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.armor.leather_plate.hand", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.armor.leather_plate.pants", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.armor.leather_plate.foot", - ))) - .lantern(match rand::thread_rng().gen_range(0..3) { - 0 => Some(Item::new_from_asset_expect("common.items.lantern.black_0")), - _ => None, - }) + .complete_from_spec("common.loadouts.guard") .bag(ArmorSlot::Bag1, Some(make_potion_bag(25))) .build(), Merchant => { @@ -606,268 +489,39 @@ impl LoadoutBuilder { }, Outcast => LoadoutBuilder::new() .active_mainhand(active_item) - .shoulder(Some(Item::new_from_asset_expect( - "common.items.armor.cloth_purple.shoulder", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.armor.cloth_purple.chest", - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.armor.cloth_purple.belt", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.armor.cloth_purple.hand", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.armor.cloth_purple.pants", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.armor.cloth_purple.foot", - ))) - .lantern(match rand::thread_rng().gen_range(0..3) { - 0 => Some(Item::new_from_asset_expect("common.items.lantern.black_0")), - _ => None, - }) + .complete_from_spec("common.loadouts.outcast") .build(), Highwayman => LoadoutBuilder::new() .active_mainhand(active_item) - .shoulder(Some(Item::new_from_asset_expect( - "common.items.armor.swift.shoulder", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.armor.swift.chest", - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.armor.swift.belt", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.armor.swift.hand", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.armor.swift.pants", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.armor.swift.foot", - ))) - .lantern(match rand::thread_rng().gen_range(0..3) { - 0 => Some(Item::new_from_asset_expect("common.items.lantern.black_0")), - _ => None, - }) - .glider(Some(Item::new_from_asset_expect( - "common.items.glider.glider_cloverleaf", - ))) + .complete_from_spec("common.loadouts.highwayman") .build(), Bandit => LoadoutBuilder::new() .active_mainhand(active_item) - .shoulder(Some(Item::new_from_asset_expect( - "common.items.armor.assassin.shoulder", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.armor.assassin.chest", - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.armor.assassin.belt", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.armor.assassin.hand", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.armor.assassin.pants", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.armor.assassin.foot", - ))) - .lantern(match rand::thread_rng().gen_range(0..3) { - 0 => Some(Item::new_from_asset_expect("common.items.lantern.black_0")), - _ => None, - }) - .glider(Some(Item::new_from_asset_expect( - "common.items.glider.glider_cloverleaf", - ))) + .complete_from_spec("common.loadouts.bandit") .build(), CultistNovice => LoadoutBuilder::new() .active_mainhand(active_item) - .shoulder(Some(Item::new_from_asset_expect( - "common.items.armor.steel.shoulder", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.armor.steel.chest", - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.armor.steel.belt", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.armor.steel.hand", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.armor.steel.pants", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.armor.steel.foot", - ))) - .back(Some(Item::new_from_asset_expect( - "common.items.armor.misc.back.dungeon_purple", - ))) - .lantern(match rand::thread_rng().gen_range(0..3) { - 0 => Some(Item::new_from_asset_expect("common.items.lantern.black_0")), - _ => None, - }) - .glider(Some(Item::new_from_asset_expect( - "common.items.glider.glider_blue", - ))) + .complete_from_spec("common.loadouts.cultist_novice") .build(), CultistAcolyte => LoadoutBuilder::new() .active_mainhand(active_item) - .shoulder(Some(Item::new_from_asset_expect( - "common.items.armor.cultist.shoulder", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.armor.cultist.chest", - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.armor.cultist.belt", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.armor.cultist.hand", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.armor.cultist.pants", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.armor.cultist.foot", - ))) - .back(Some(Item::new_from_asset_expect( - "common.items.armor.misc.back.dungeon_purple", - ))) - .lantern(match rand::thread_rng().gen_range(0..3) { - 0 => Some(Item::new_from_asset_expect("common.items.lantern.black_0")), - _ => None, - }) - .glider(Some(Item::new_from_asset_expect( - "common.items.glider.glider_blue", - ))) + .complete_from_spec("common.loadouts.cultist_acolyte") .build(), Beastmaster => LoadoutBuilder::new() .active_mainhand(active_item) - .shoulder(Some(Item::new_from_asset_expect( - "common.items.armor.ferocious.shoulder", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.armor.ferocious.chest", - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.armor.ferocious.belt", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.armor.ferocious.hand", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.armor.ferocious.pants", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.armor.ferocious.foot", - ))) - .back(Some(Item::new_from_asset_expect( - "common.items.armor.ferocious.back", - ))) - .lantern(match rand::thread_rng().gen_range(0..3) { - 0 => Some(Item::new_from_asset_expect("common.items.lantern.black_0")), - _ => None, - }) - .glider(Some(Item::new_from_asset_expect( - "common.items.glider.glider_blue", - ))) + .complete_from_spec("common.loadouts.beastmaster") .build(), Warlord => LoadoutBuilder::new() .active_mainhand(active_item) - .shoulder(Some(Item::new_from_asset_expect( - "common.items.armor.warlord.shoulder", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.armor.warlord.chest", - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.armor.warlord.belt", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.armor.warlord.hand", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.armor.warlord.pants", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.armor.warlord.foot", - ))) - .back(Some(Item::new_from_asset_expect( - "common.items.armor.warlord.back", - ))) - .lantern(match rand::thread_rng().gen_range(0..3) { - 0 => Some(Item::new_from_asset_expect("common.items.lantern.black_0")), - _ => None, - }) - .glider(Some(Item::new_from_asset_expect( - "common.items.glider.glider_purp", - ))) + .complete_from_spec("common.loadouts.warlord") .build(), Warlock => LoadoutBuilder::new() .active_mainhand(active_item) - .shoulder(Some(Item::new_from_asset_expect( - "common.items.armor.warlock.shoulder", - ))) - .chest(Some(Item::new_from_asset_expect( - "common.items.armor.warlock.chest", - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.armor.warlock.belt", - ))) - .hands(Some(Item::new_from_asset_expect( - "common.items.armor.warlock.hand", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.armor.warlock.pants", - ))) - .feet(Some(Item::new_from_asset_expect( - "common.items.armor.warlock.foot", - ))) - .back(Some(Item::new_from_asset_expect( - "common.items.armor.warlock.back", - ))) - .lantern(match rand::thread_rng().gen_range(0..3) { - 0 => Some(Item::new_from_asset_expect("common.items.lantern.black_0")), - _ => None, - }) - .glider(Some(Item::new_from_asset_expect( - "common.items.glider.glider_purp", - ))) + .complete_from_spec("common.loadouts.warlock") .build(), Villager => LoadoutBuilder::new() .active_mainhand(active_item) - .chest(Some(Item::new_from_asset_expect( - match rand::thread_rng().gen_range(0..10) { - 0 => "common.items.armor.misc.chest.worker_green_0", - 1 => "common.items.armor.misc.chest.worker_green_1", - 2 => "common.items.armor.misc.chest.worker_red_0", - 3 => "common.items.armor.misc.chest.worker_red_1", - 4 => "common.items.armor.misc.chest.worker_purple_0", - 5 => "common.items.armor.misc.chest.worker_purple_1", - 6 => "common.items.armor.misc.chest.worker_yellow_0", - 7 => "common.items.armor.misc.chest.worker_yellow_1", - 8 => "common.items.armor.misc.chest.worker_orange_0", - _ => "common.items.armor.misc.chest.worker_orange_1", - }, - ))) - .belt(Some(Item::new_from_asset_expect( - "common.items.armor.swift.belt", - ))) - .pants(Some(Item::new_from_asset_expect( - "common.items.armor.misc.pants.worker_blue", - ))) - .feet(Some(Item::new_from_asset_expect( - match rand::thread_rng().gen_range(0..2) { - 0 => "common.items.armor.swift.foot", - _ => "common.items.armor.misc.foot.sandals", - }, - ))) + .complete_from_spec("common.loadouts.villager") .bag(ArmorSlot::Bag1, Some(make_potion_bag(10))) .build(), } @@ -1041,7 +695,7 @@ impl LoadoutBuilder { let mut rng = rand::thread_rng(); match items .choose_weighted(&mut rng, |item| item.0) - .unwrap_or_else(|| { + .unwrap_or_else(|_| { panic!( "failed to choose item from loadout asset ({})", asset_specifier From 8cb1e22dda19e263c389cd5da58170e5fdb5d673 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 23 May 2021 18:38:48 +0300 Subject: [PATCH 04/11] add TODO about tests --- common/src/comp/inventory/loadout_builder.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 31e5338a46..0c1753f526 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -806,6 +806,8 @@ mod tests { // // Things that will be catched - invalid assets paths // FIXME: if item is used in some branch of rng test may miss it + // TODO: as of now there is no rng generation of items + // validate assets for all possible branches #[test] fn test_loadout_configs() { let test_weapons = vec![ From 95dedc0e4ef16ec5c8ba5ef1a8298c71d394dfa9 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 23 May 2021 19:12:26 +0300 Subject: [PATCH 05/11] Add directory hierarchy --- .../{ => dungeon/tier-0}/gnarling.ron | 0 .../{ => dungeon/tier-1}/adlet_bow.ron | 0 .../{ => dungeon/tier-1}/adlet_spear.ron | 0 .../loadouts/{ => dungeon/tier-2}/sahagin.ron | 0 .../loadouts/{ => dungeon/tier-3}/haniwa.ron | 0 .../{ => dungeon/tier-4}/myrmidon.ron | 0 .../{ => dungeon/tier-5}/beastmaster.ron | 0 .../loadouts/{ => dungeon/tier-5}/husk.ron | 0 .../loadouts/{ => dungeon/tier-5}/warlock.ron | 0 .../loadouts/{ => dungeon/tier-5}/warlord.ron | 0 .../common/loadouts/{ => unused}/bandit.ron | 0 .../loadouts/{ => unused}/cultist_acolyte.ron | 0 .../loadouts/{ => unused}/cultist_novice.ron | 0 .../loadouts/{ => unused}/highwayman.ron | 0 .../common/loadouts/{ => unused}/outcast.ron | 0 .../common/loadouts/{ => village}/guard.ron | 0 .../loadouts/{ => village}/merchant.ron | 0 .../loadouts/{ => village}/villager.ron | 0 common/src/comp/inventory/loadout_builder.rs | 80 +++++++++---------- 19 files changed, 40 insertions(+), 40 deletions(-) rename assets/common/loadouts/{ => dungeon/tier-0}/gnarling.ron (100%) rename assets/common/loadouts/{ => dungeon/tier-1}/adlet_bow.ron (100%) rename assets/common/loadouts/{ => dungeon/tier-1}/adlet_spear.ron (100%) rename assets/common/loadouts/{ => dungeon/tier-2}/sahagin.ron (100%) rename assets/common/loadouts/{ => dungeon/tier-3}/haniwa.ron (100%) rename assets/common/loadouts/{ => dungeon/tier-4}/myrmidon.ron (100%) rename assets/common/loadouts/{ => dungeon/tier-5}/beastmaster.ron (100%) rename assets/common/loadouts/{ => dungeon/tier-5}/husk.ron (100%) rename assets/common/loadouts/{ => dungeon/tier-5}/warlock.ron (100%) rename assets/common/loadouts/{ => dungeon/tier-5}/warlord.ron (100%) rename assets/common/loadouts/{ => unused}/bandit.ron (100%) rename assets/common/loadouts/{ => unused}/cultist_acolyte.ron (100%) rename assets/common/loadouts/{ => unused}/cultist_novice.ron (100%) rename assets/common/loadouts/{ => unused}/highwayman.ron (100%) rename assets/common/loadouts/{ => unused}/outcast.ron (100%) rename assets/common/loadouts/{ => village}/guard.ron (100%) rename assets/common/loadouts/{ => village}/merchant.ron (100%) rename assets/common/loadouts/{ => village}/villager.ron (100%) diff --git a/assets/common/loadouts/gnarling.ron b/assets/common/loadouts/dungeon/tier-0/gnarling.ron similarity index 100% rename from assets/common/loadouts/gnarling.ron rename to assets/common/loadouts/dungeon/tier-0/gnarling.ron diff --git a/assets/common/loadouts/adlet_bow.ron b/assets/common/loadouts/dungeon/tier-1/adlet_bow.ron similarity index 100% rename from assets/common/loadouts/adlet_bow.ron rename to assets/common/loadouts/dungeon/tier-1/adlet_bow.ron diff --git a/assets/common/loadouts/adlet_spear.ron b/assets/common/loadouts/dungeon/tier-1/adlet_spear.ron similarity index 100% rename from assets/common/loadouts/adlet_spear.ron rename to assets/common/loadouts/dungeon/tier-1/adlet_spear.ron diff --git a/assets/common/loadouts/sahagin.ron b/assets/common/loadouts/dungeon/tier-2/sahagin.ron similarity index 100% rename from assets/common/loadouts/sahagin.ron rename to assets/common/loadouts/dungeon/tier-2/sahagin.ron diff --git a/assets/common/loadouts/haniwa.ron b/assets/common/loadouts/dungeon/tier-3/haniwa.ron similarity index 100% rename from assets/common/loadouts/haniwa.ron rename to assets/common/loadouts/dungeon/tier-3/haniwa.ron diff --git a/assets/common/loadouts/myrmidon.ron b/assets/common/loadouts/dungeon/tier-4/myrmidon.ron similarity index 100% rename from assets/common/loadouts/myrmidon.ron rename to assets/common/loadouts/dungeon/tier-4/myrmidon.ron diff --git a/assets/common/loadouts/beastmaster.ron b/assets/common/loadouts/dungeon/tier-5/beastmaster.ron similarity index 100% rename from assets/common/loadouts/beastmaster.ron rename to assets/common/loadouts/dungeon/tier-5/beastmaster.ron diff --git a/assets/common/loadouts/husk.ron b/assets/common/loadouts/dungeon/tier-5/husk.ron similarity index 100% rename from assets/common/loadouts/husk.ron rename to assets/common/loadouts/dungeon/tier-5/husk.ron diff --git a/assets/common/loadouts/warlock.ron b/assets/common/loadouts/dungeon/tier-5/warlock.ron similarity index 100% rename from assets/common/loadouts/warlock.ron rename to assets/common/loadouts/dungeon/tier-5/warlock.ron diff --git a/assets/common/loadouts/warlord.ron b/assets/common/loadouts/dungeon/tier-5/warlord.ron similarity index 100% rename from assets/common/loadouts/warlord.ron rename to assets/common/loadouts/dungeon/tier-5/warlord.ron diff --git a/assets/common/loadouts/bandit.ron b/assets/common/loadouts/unused/bandit.ron similarity index 100% rename from assets/common/loadouts/bandit.ron rename to assets/common/loadouts/unused/bandit.ron diff --git a/assets/common/loadouts/cultist_acolyte.ron b/assets/common/loadouts/unused/cultist_acolyte.ron similarity index 100% rename from assets/common/loadouts/cultist_acolyte.ron rename to assets/common/loadouts/unused/cultist_acolyte.ron diff --git a/assets/common/loadouts/cultist_novice.ron b/assets/common/loadouts/unused/cultist_novice.ron similarity index 100% rename from assets/common/loadouts/cultist_novice.ron rename to assets/common/loadouts/unused/cultist_novice.ron diff --git a/assets/common/loadouts/highwayman.ron b/assets/common/loadouts/unused/highwayman.ron similarity index 100% rename from assets/common/loadouts/highwayman.ron rename to assets/common/loadouts/unused/highwayman.ron diff --git a/assets/common/loadouts/outcast.ron b/assets/common/loadouts/unused/outcast.ron similarity index 100% rename from assets/common/loadouts/outcast.ron rename to assets/common/loadouts/unused/outcast.ron diff --git a/assets/common/loadouts/guard.ron b/assets/common/loadouts/village/guard.ron similarity index 100% rename from assets/common/loadouts/guard.ron rename to assets/common/loadouts/village/guard.ron diff --git a/assets/common/loadouts/merchant.ron b/assets/common/loadouts/village/merchant.ron similarity index 100% rename from assets/common/loadouts/merchant.ron rename to assets/common/loadouts/village/merchant.ron diff --git a/assets/common/loadouts/villager.ron b/assets/common/loadouts/village/villager.ron similarity index 100% rename from assets/common/loadouts/villager.ron rename to assets/common/loadouts/village/villager.ron diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 0c1753f526..12e056b4cd 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -320,45 +320,62 @@ impl LoadoutBuilder { let loadout = if let Some(config) = config { use LoadoutConfig::*; match config { - Adlet => match active_tool_kind { - Some(ToolKind::Bow) => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.adlet_bow") - .build(), - Some(ToolKind::Spear) | Some(ToolKind::Staff) => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.adlet_spear") - .build(), - _ => LoadoutBuilder::new().active_mainhand(active_item).build(), - }, Gnarling => match active_tool_kind { Some(ToolKind::Bow) | Some(ToolKind::Staff) | Some(ToolKind::Spear) => { LoadoutBuilder::new() .active_mainhand(active_item) - .complete_from_spec("common.loadouts.gnarling") + .complete_from_spec("common.loadouts.dungeon.tier-0.gnarling") .build() }, _ => LoadoutBuilder::new().active_mainhand(active_item).build(), }, + Adlet => match active_tool_kind { + Some(ToolKind::Bow) => LoadoutBuilder::new() + .active_mainhand(active_item) + .complete_from_spec("common.loadouts.dungeon.tier-1.adlet_bow") + .build(), + Some(ToolKind::Spear) | Some(ToolKind::Staff) => LoadoutBuilder::new() + .active_mainhand(active_item) + .complete_from_spec("common.loadouts.dungeon.tier-1.adlet_spear") + .build(), + _ => LoadoutBuilder::new().active_mainhand(active_item).build(), + }, Sahagin => LoadoutBuilder::new() .active_mainhand(active_item) - .complete_from_spec("common.loadouts.sahagin") + .complete_from_spec("common.loadouts.dungeon.tier-2.sahagin") .build(), Haniwa => LoadoutBuilder::new() .active_mainhand(active_item) - .complete_from_spec("common.loadouts.haniwa") + .complete_from_spec("common.loadouts.dungeon.tier-3.haniwa") .build(), Myrmidon => LoadoutBuilder::new() .active_mainhand(active_item) - .complete_from_spec("common.loadouts.myrmidon") + .complete_from_spec("common.loadouts.dungeon.tier-4.myrmidon") .build(), Husk => LoadoutBuilder::new() .active_mainhand(active_item) - .complete_from_spec("common.loadouts.husk") + .complete_from_spec("common.loadouts.dungeon.tier-5.husk") + .build(), + Beastmaster => LoadoutBuilder::new() + .active_mainhand(active_item) + .complete_from_spec("common.loadouts.dungeon.tier-5.beastmaster") + .build(), + Warlord => LoadoutBuilder::new() + .active_mainhand(active_item) + .complete_from_spec("common.loadouts.dungeon.tier-5.warlord") + .build(), + Warlock => LoadoutBuilder::new() + .active_mainhand(active_item) + .complete_from_spec("common.loadouts.dungeon.tier-5.warlock") + .build(), + Villager => LoadoutBuilder::new() + .active_mainhand(active_item) + .complete_from_spec("common.loadouts.village.villager") + .bag(ArmorSlot::Bag1, Some(make_potion_bag(10))) .build(), Guard => LoadoutBuilder::new() .active_mainhand(active_item) - .complete_from_spec("common.loadouts.guard") + .complete_from_spec("common.loadouts.village.guard") .bag(ArmorSlot::Bag1, Some(make_potion_bag(25))) .build(), Merchant => { @@ -484,45 +501,28 @@ impl LoadoutBuilder { .bag(ArmorSlot::Bag2, Some(bag2)) .bag(ArmorSlot::Bag3, Some(bag3)) .bag(ArmorSlot::Bag4, Some(bag4)) - .complete_from_spec("common.loadouts.merchant") + .complete_from_spec("common.loadouts.village.merchant") .build() }, Outcast => LoadoutBuilder::new() .active_mainhand(active_item) - .complete_from_spec("common.loadouts.outcast") + .complete_from_spec("common.loadouts.unused.outcast") .build(), Highwayman => LoadoutBuilder::new() .active_mainhand(active_item) - .complete_from_spec("common.loadouts.highwayman") + .complete_from_spec("common.loadouts.unused.highwayman") .build(), Bandit => LoadoutBuilder::new() .active_mainhand(active_item) - .complete_from_spec("common.loadouts.bandit") + .complete_from_spec("common.loadouts.unused.bandit") .build(), CultistNovice => LoadoutBuilder::new() .active_mainhand(active_item) - .complete_from_spec("common.loadouts.cultist_novice") + .complete_from_spec("common.loadouts.unused.cultist_novice") .build(), CultistAcolyte => LoadoutBuilder::new() .active_mainhand(active_item) - .complete_from_spec("common.loadouts.cultist_acolyte") - .build(), - Beastmaster => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.beastmaster") - .build(), - Warlord => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.warlord") - .build(), - Warlock => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.warlock") - .build(), - Villager => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.villager") - .bag(ArmorSlot::Bag1, Some(make_potion_bag(10))) + .complete_from_spec("common.loadouts.unused.cultist_acolyte") .build(), } } else { From 53cd3ccfecc3bdbcb5ef46147e15512cefa7bdfe Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 23 May 2021 19:16:13 +0300 Subject: [PATCH 06/11] Remove unused LoadoutConfig-s --- assets/common/loadouts/unused/bandit.ron | 15 --------- .../loadouts/unused/cultist_acolyte.ron | 17 ---------- .../common/loadouts/unused/cultist_novice.ron | 17 ---------- assets/common/loadouts/unused/highwayman.ron | 15 --------- assets/common/loadouts/unused/outcast.ron | 13 -------- common/src/comp/inventory/loadout_builder.rs | 33 +++---------------- 6 files changed, 4 insertions(+), 106 deletions(-) delete mode 100644 assets/common/loadouts/unused/bandit.ron delete mode 100644 assets/common/loadouts/unused/cultist_acolyte.ron delete mode 100644 assets/common/loadouts/unused/cultist_novice.ron delete mode 100644 assets/common/loadouts/unused/highwayman.ron delete mode 100644 assets/common/loadouts/unused/outcast.ron diff --git a/assets/common/loadouts/unused/bandit.ron b/assets/common/loadouts/unused/bandit.ron deleted file mode 100644 index eb18a0332c..0000000000 --- a/assets/common/loadouts/unused/bandit.ron +++ /dev/null @@ -1,15 +0,0 @@ -({ - "shoulder": Item("common.items.armor.assassin.shoulder"), - "chest": Item("common.items.armor.assassin.chest"), - "belt": Item("common.items.armor.assassin.belt"), - "hands": Item("common.items.armor.assassin.hand"), - "pants": Item("common.items.armor.assassin.pants"), - "feet": Item("common.items.armor.assassin.foot"), - - "lantern": Choice([ - (1.0, Some(Item("common.items.lantern.black_0"))), - (2.0, None), - ]), - - "glider": Item("common.items.glider.glider_cloverleaf"), -}) diff --git a/assets/common/loadouts/unused/cultist_acolyte.ron b/assets/common/loadouts/unused/cultist_acolyte.ron deleted file mode 100644 index 865f43898a..0000000000 --- a/assets/common/loadouts/unused/cultist_acolyte.ron +++ /dev/null @@ -1,17 +0,0 @@ -({ - "shoulder": Item("common.items.armor.cultist.shoulder"), - "chest": Item("common.items.armor.cultist.chest"), - "belt": Item("common.items.armor.cultist.belt"), - "hands": Item("common.items.armor.cultist.hand"), - "pants": Item("common.items.armor.cultist.pants"), - "feet": Item("common.items.armor.cultist.foot"), - - "back": Item("common.items.armor.misc.back.dungeon_purple"), - - "lantern": Choice([ - (1.0, Some(Item("common.items.lantern.black_0"))), - (2.0, None), - ]), - - "glider": Item("common.items.glider.glider_blue"), -}) diff --git a/assets/common/loadouts/unused/cultist_novice.ron b/assets/common/loadouts/unused/cultist_novice.ron deleted file mode 100644 index c8324e703d..0000000000 --- a/assets/common/loadouts/unused/cultist_novice.ron +++ /dev/null @@ -1,17 +0,0 @@ -({ - "shoulder": Item("common.items.armor.steel.shoulder"), - "chest": Item("common.items.armor.steel.chest"), - "belt": Item("common.items.armor.steel.belt"), - "hands": Item("common.items.armor.steel.hand"), - "pants": Item("common.items.armor.steel.pants"), - "feet": Item("common.items.armor.steel.foot"), - - "back": Item("common.items.armor.misc.back.dungeon_purple"), - - "lantern": Choice([ - (1.0, Some(Item("common.items.lantern.black_0"))), - (2.0, None), - ]), - - "glider": Item("common.items.glider.glider_blue"), -}) diff --git a/assets/common/loadouts/unused/highwayman.ron b/assets/common/loadouts/unused/highwayman.ron deleted file mode 100644 index cb67904f20..0000000000 --- a/assets/common/loadouts/unused/highwayman.ron +++ /dev/null @@ -1,15 +0,0 @@ -({ - "shoulder": Item("common.items.armor.swift.shoulder"), - "chest": Item("common.items.armor.swift.chest"), - "belt": Item("common.items.armor.swift.belt"), - "hands": Item("common.items.armor.swift.hand"), - "pants": Item("common.items.armor.swift.pants"), - "feet": Item("common.items.armor.swift.foot"), - - "lantern": Choice([ - (1.0, Some(Item("common.items.lantern.black_0"))), - (2.0, None), - ]), - - "glider": Item("common.items.glider.glider_cloverleaf"), -}) diff --git a/assets/common/loadouts/unused/outcast.ron b/assets/common/loadouts/unused/outcast.ron deleted file mode 100644 index ad5fac7b14..0000000000 --- a/assets/common/loadouts/unused/outcast.ron +++ /dev/null @@ -1,13 +0,0 @@ -({ - "shoulder": Item("common.items.armor.cloth_purple.shoulder"), - "chest": Item("common.items.armor.cloth_purple.chest"), - "belt": Item("common.items.armor.cloth_purple.belt"), - "hands": Item("common.items.armor.cloth_purple.hand"), - "pants": Item("common.items.armor.cloth_purple.pants"), - "feet": Item("common.items.armor.cloth_purple.foot"), - - "lantern": Choice([ - (1.0, Some(Item("common.items.lantern.black_0"))), - (2.0, None), - ]), -}) diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 12e056b4cd..9417ff22eb 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -41,23 +41,18 @@ pub struct LoadoutBuilder(Loadout); #[derive(Copy, Clone, PartialEq, Serialize, Deserialize, Debug, EnumIter)] pub enum LoadoutConfig { - Adlet, Gnarling, + Adlet, Sahagin, Haniwa, Myrmidon, Husk, - Guard, - Villager, - Merchant, - Outcast, - Highwayman, - Bandit, - CultistNovice, - CultistAcolyte, Beastmaster, Warlord, Warlock, + Villager, + Guard, + Merchant, } #[derive(Debug, Deserialize, Clone)] @@ -504,26 +499,6 @@ impl LoadoutBuilder { .complete_from_spec("common.loadouts.village.merchant") .build() }, - Outcast => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.unused.outcast") - .build(), - Highwayman => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.unused.highwayman") - .build(), - Bandit => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.unused.bandit") - .build(), - CultistNovice => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.unused.cultist_novice") - .build(), - CultistAcolyte => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.unused.cultist_acolyte") - .build(), } } else { match body { From 3c82a0e8cd694c5c3651e911fbe3b2d99a64ae57 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 23 May 2021 20:29:19 +0300 Subject: [PATCH 07/11] LoadoutBuilder efactoring --- common/src/comp/inventory/loadout_builder.rs | 410 +++++++++---------- world/src/site/dungeon/mod.rs | 1 - 2 files changed, 202 insertions(+), 209 deletions(-) diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 9417ff22eb..6d4150aeda 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -265,6 +265,160 @@ impl LoadoutBuilder { #[allow(clippy::new_without_default)] // TODO: Pending review in #587 pub fn new() -> Self { Self(Loadout::new_empty()) } + fn with_default_equipment(body: &Body, active_item: Option) -> Self { + let mut builder = LoadoutBuilder::new(); + builder = match body { + Body::BipedLarge(biped_large::Body { + species: biped_large::Species::Mindflayer, + .. + }) => builder.chest(Some(Item::new_from_asset_expect( + "common.items.npc_armor.biped_large.mindflayer", + ))), + Body::BipedLarge(biped_large::Body { + species: biped_large::Species::Minotaur, + .. + }) => builder.chest(Some(Item::new_from_asset_expect( + "common.items.npc_armor.biped_large.minotaur", + ))), + Body::BipedLarge(biped_large::Body { + species: biped_large::Species::Tidalwarrior, + .. + }) => builder.chest(Some(Item::new_from_asset_expect( + "common.items.npc_armor.biped_large.tidal_warrior", + ))), + Body::BipedLarge(biped_large::Body { + species: biped_large::Species::Yeti, + .. + }) => builder.chest(Some(Item::new_from_asset_expect( + "common.items.npc_armor.biped_large.yeti", + ))), + Body::BipedLarge(biped_large::Body { + species: biped_large::Species::Harvester, + .. + }) => builder.chest(Some(Item::new_from_asset_expect( + "common.items.npc_armor.biped_large.harvester", + ))), + Body::Golem(golem::Body { + species: golem::Species::ClayGolem, + .. + }) => builder.chest(Some(Item::new_from_asset_expect( + "common.items.npc_armor.golem.claygolem", + ))), + _ => builder, + }; + + builder.active_mainhand(active_item) + } + + pub fn from_asset_expect(asset_specifier: &str) -> Self { + let spec = LoadoutSpec::load_expect(asset_specifier).read().0.clone(); + let mut loadout = LoadoutBuilder::new(); + for (key, specifier) in spec { + let item = match specifier { + ItemSpec::Item(specifier) => Item::new_from_asset_expect(&specifier), + ItemSpec::Choice(items) => { + let mut rng = rand::thread_rng(); + match items + .choose_weighted(&mut rng, |item| item.0) + .unwrap_or_else(|_| { + panic!( + "failed to choose item from loadout asset ({})", + asset_specifier + ) + }) { + (_, Some(ItemSpec::Item(item_specifier))) => { + Item::new_from_asset_expect(&item_specifier) + }, + (_, Some(ItemSpec::Choice(_))) => { + let err = format!( + "Using choice of choices in ({}): {}. Unimplemented.", + asset_specifier, key, + ); + if cfg!(tests) { + panic!("{}", err); + } else { + warn!("{}", err); + } + continue; + }, + (_, None) => continue, + } + }, + }; + match key.as_str() { + "active_mainhand" => { + loadout = loadout.active_mainhand(Some(item)); + }, + "active_offhand" => { + loadout = loadout.active_offhand(Some(item)); + }, + "inactive_mainhand" => { + loadout = loadout.inactive_mainhand(Some(item)); + }, + "inactive_offhand" => { + loadout = loadout.inactive_offhand(Some(item)); + }, + "head" => { + loadout = loadout.head(Some(item)); + }, + "shoulder" => { + loadout = loadout.shoulder(Some(item)); + }, + "chest" => { + loadout = loadout.chest(Some(item)); + }, + "hands" => { + loadout = loadout.hands(Some(item)); + }, + "pants" => { + loadout = loadout.pants(Some(item)); + }, + "feet" => { + loadout = loadout.feet(Some(item)); + }, + "belt" => { + loadout = loadout.belt(Some(item)); + }, + "back" => { + loadout = loadout.back(Some(item)); + }, + "neck" => { + loadout = loadout.neck(Some(item)); + }, + "ring1" => { + loadout = loadout.ring1(Some(item)); + }, + "ring2" => { + loadout = loadout.ring2(Some(item)); + }, + "lantern" => { + loadout = loadout.lantern(Some(item)); + }, + "tabard" => { + loadout = loadout.tabard(Some(item)); + }, + "glider" => { + loadout = loadout.glider(Some(item)); + }, + _ => { + if cfg!(tests) { + panic!( + "Unexpected key in loadout asset ({}): {}", + asset_specifier, key + ); + } else { + warn!( + "Unexpected key in loadout asset ({}): {}", + asset_specifier, key + ); + } + }, + }; + } + + loadout + } + /// Set default armor items for the loadout. This may vary with game /// updates, but should be safe defaults for a new character. pub fn defaults(self) -> Self { @@ -317,60 +471,66 @@ impl LoadoutBuilder { match config { Gnarling => match active_tool_kind { Some(ToolKind::Bow) | Some(ToolKind::Staff) | Some(ToolKind::Spear) => { - LoadoutBuilder::new() + LoadoutBuilder::from_asset_expect("common.loadouts.dungeon.tier-0.gnarling") .active_mainhand(active_item) - .complete_from_spec("common.loadouts.dungeon.tier-0.gnarling") .build() }, _ => LoadoutBuilder::new().active_mainhand(active_item).build(), }, Adlet => match active_tool_kind { - Some(ToolKind::Bow) => LoadoutBuilder::new() + Some(ToolKind::Bow) => LoadoutBuilder::from_asset_expect( + "common.loadouts.dungeon.tier-1.adlet_bow", + ) + .active_mainhand(active_item) + .build(), + Some(ToolKind::Spear) | Some(ToolKind::Staff) => { + LoadoutBuilder::from_asset_expect( + "common.loadouts.dungeon.tier-1.adlet_spear", + ) .active_mainhand(active_item) - .complete_from_spec("common.loadouts.dungeon.tier-1.adlet_bow") - .build(), - Some(ToolKind::Spear) | Some(ToolKind::Staff) => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.dungeon.tier-1.adlet_spear") - .build(), + .build() + }, _ => LoadoutBuilder::new().active_mainhand(active_item).build(), }, - Sahagin => LoadoutBuilder::new() + Sahagin => { + LoadoutBuilder::from_asset_expect("common.loadouts.dungeon.tier-2.sahagin") + .active_mainhand(active_item) + .build() + }, + Haniwa => { + LoadoutBuilder::from_asset_expect("common.loadouts.dungeon.tier-3.haniwa") + .active_mainhand(active_item) + .build() + }, + Myrmidon => { + LoadoutBuilder::from_asset_expect("common.loadouts.dungeon.tier-4.myrmidon") + .active_mainhand(active_item) + .build() + }, + Husk => LoadoutBuilder::from_asset_expect("common.loadouts.dungeon.tier-5.husk") .active_mainhand(active_item) - .complete_from_spec("common.loadouts.dungeon.tier-2.sahagin") .build(), - Haniwa => LoadoutBuilder::new() + Beastmaster => { + LoadoutBuilder::from_asset_expect("common.loadouts.dungeon.tier-5.beastmaster") + .active_mainhand(active_item) + .build() + }, + Warlord => { + LoadoutBuilder::from_asset_expect("common.loadouts.dungeon.tier-5.warlord") + .active_mainhand(active_item) + .build() + }, + Warlock => { + LoadoutBuilder::from_asset_expect("common.loadouts.dungeon.tier-5.warlock") + .active_mainhand(active_item) + .build() + }, + Villager => LoadoutBuilder::from_asset_expect("common.loadouts.village.villager") .active_mainhand(active_item) - .complete_from_spec("common.loadouts.dungeon.tier-3.haniwa") - .build(), - Myrmidon => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.dungeon.tier-4.myrmidon") - .build(), - Husk => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.dungeon.tier-5.husk") - .build(), - Beastmaster => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.dungeon.tier-5.beastmaster") - .build(), - Warlord => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.dungeon.tier-5.warlord") - .build(), - Warlock => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.dungeon.tier-5.warlock") - .build(), - Villager => LoadoutBuilder::new() - .active_mainhand(active_item) - .complete_from_spec("common.loadouts.village.villager") .bag(ArmorSlot::Bag1, Some(make_potion_bag(10))) .build(), - Guard => LoadoutBuilder::new() + Guard => LoadoutBuilder::from_asset_expect("common.loadouts.village.guard") .active_mainhand(active_item) - .complete_from_spec("common.loadouts.village.guard") .bag(ArmorSlot::Bag1, Some(make_potion_bag(25))) .build(), Merchant => { @@ -489,75 +649,18 @@ impl LoadoutBuilder { *i = item_with_amount(&item_id, &mut potions); } } - LoadoutBuilder::new() + LoadoutBuilder::from_asset_expect("common.loadouts.village.merchant") .active_mainhand(active_item) .back(Some(backpack)) .bag(ArmorSlot::Bag1, Some(bag1)) .bag(ArmorSlot::Bag2, Some(bag2)) .bag(ArmorSlot::Bag3, Some(bag3)) .bag(ArmorSlot::Bag4, Some(bag4)) - .complete_from_spec("common.loadouts.village.merchant") .build() }, } } else { - match body { - Body::BipedLarge(biped_large::Body { - species: biped_large::Species::Mindflayer, - .. - }) => LoadoutBuilder::new() - .active_mainhand(active_item) - .chest(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_large.mindflayer", - ))) - .build(), - Body::BipedLarge(biped_large::Body { - species: biped_large::Species::Minotaur, - .. - }) => LoadoutBuilder::new() - .active_mainhand(active_item) - .chest(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_large.minotaur", - ))) - .build(), - Body::BipedLarge(biped_large::Body { - species: biped_large::Species::Tidalwarrior, - .. - }) => LoadoutBuilder::new() - .active_mainhand(active_item) - .chest(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_large.tidal_warrior", - ))) - .build(), - Body::BipedLarge(biped_large::Body { - species: biped_large::Species::Yeti, - .. - }) => LoadoutBuilder::new() - .active_mainhand(active_item) - .chest(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_large.yeti", - ))) - .build(), - Body::BipedLarge(biped_large::Body { - species: biped_large::Species::Harvester, - .. - }) => LoadoutBuilder::new() - .active_mainhand(active_item) - .chest(Some(Item::new_from_asset_expect( - "common.items.npc_armor.biped_large.harvester", - ))) - .build(), - Body::Golem(golem::Body { - species: golem::Species::ClayGolem, - .. - }) => LoadoutBuilder::new() - .active_mainhand(active_item) - .chest(Some(Item::new_from_asset_expect( - "common.items.npc_armor.golem.claygolem", - ))) - .build(), - _ => LoadoutBuilder::new().active_mainhand(active_item).build(), - } + LoadoutBuilder::with_default_equipment(&body, active_item).build() }; Self(loadout) @@ -659,115 +762,6 @@ impl LoadoutBuilder { } pub fn build(self) -> Loadout { self.0 } - - pub fn complete_from_spec(self, asset_specifier: &str) -> Self { - let spec = LoadoutSpec::load_expect(asset_specifier).read().0.clone(); - let mut loadout = self; - for (key, specifier) in spec { - let item = match specifier { - ItemSpec::Item(specifier) => Item::new_from_asset_expect(&specifier), - ItemSpec::Choice(items) => { - let mut rng = rand::thread_rng(); - match items - .choose_weighted(&mut rng, |item| item.0) - .unwrap_or_else(|_| { - panic!( - "failed to choose item from loadout asset ({})", - asset_specifier - ) - }) { - (_, Some(ItemSpec::Item(item_specifier))) => { - Item::new_from_asset_expect(&item_specifier) - }, - (_, Some(ItemSpec::Choice(_))) => { - let err = format!( - "Using choice of choices in ({}): {}. Unimplemented.", - asset_specifier, key, - ); - if cfg!(tests) { - panic!("{}", err); - } else { - warn!("{}", err); - } - continue; - }, - (_, None) => continue, - } - }, - }; - match key.as_str() { - "active_mainhand" => { - loadout = loadout.active_mainhand(Some(item)); - }, - "active_offhand" => { - loadout = loadout.active_offhand(Some(item)); - }, - "inactive_mainhand" => { - loadout = loadout.inactive_mainhand(Some(item)); - }, - "inactive_offhand" => { - loadout = loadout.inactive_offhand(Some(item)); - }, - "head" => { - loadout = loadout.head(Some(item)); - }, - "shoulder" => { - loadout = loadout.shoulder(Some(item)); - }, - "chest" => { - loadout = loadout.chest(Some(item)); - }, - "hands" => { - loadout = loadout.hands(Some(item)); - }, - "pants" => { - loadout = loadout.pants(Some(item)); - }, - "feet" => { - loadout = loadout.feet(Some(item)); - }, - "belt" => { - loadout = loadout.belt(Some(item)); - }, - "back" => { - loadout = loadout.back(Some(item)); - }, - "neck" => { - loadout = loadout.neck(Some(item)); - }, - "ring1" => { - loadout = loadout.ring1(Some(item)); - }, - "ring2" => { - loadout = loadout.ring2(Some(item)); - }, - "lantern" => { - loadout = loadout.lantern(Some(item)); - }, - "tabard" => { - loadout = loadout.tabard(Some(item)); - }, - "glider" => { - loadout = loadout.glider(Some(item)); - }, - _ => { - if cfg!(tests) { - panic!( - "Unexpected key in loadout asset ({}): {}", - asset_specifier, key - ); - } else { - warn!( - "Unexpected key in loadout asset ({}): {}", - asset_specifier, key - ); - } - }, - }; - } - - loadout - } } #[cfg(test)] @@ -865,5 +859,5 @@ mod tests { } #[test] - fn test_loadout_assets() { LoadoutBuilder::new().complete_from_spec("common.loadouts.test"); } + fn test_loadout_assets() { LoadoutBuilder::from_asset_expect("common.loadouts.test"); } } diff --git a/world/src/site/dungeon/mod.rs b/world/src/site/dungeon/mod.rs index c65137bf08..cf8dd7e3ae 100644 --- a/world/src/site/dungeon/mod.rs +++ b/world/src/site/dungeon/mod.rs @@ -584,7 +584,6 @@ impl Floor { ) //.do_if(is_giant, |e| e.into_giant()) .with_alignment(comp::Alignment::Enemy) - .with_loadout_config(loadout_builder::LoadoutConfig::CultistAcolyte) .with_skillset_config(common::skillset_builder::SkillSetConfig::CultistAcolyte) .with_loot_drop(chosen.read().choose().to_item()) .with_level(dynamic_rng.gen_range((room.difficulty as f32).powf(1.25) + 3.0..(room.difficulty as f32).powf(1.5) + 4.0).round() as u16); From 9ed030442bf118a745e745b9829f44141ec225d9 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 23 May 2021 21:37:41 +0300 Subject: [PATCH 08/11] Switch to using EquipSlot key instead of String --- assets/common/loadouts/test.ron | 40 +++++++------ common/src/comp/inventory/loadout_builder.rs | 63 +++++++++----------- 2 files changed, 50 insertions(+), 53 deletions(-) diff --git a/assets/common/loadouts/test.ron b/assets/common/loadouts/test.ron index 2799a248e1..cdf7cf94fe 100644 --- a/assets/common/loadouts/test.ron +++ b/assets/common/loadouts/test.ron @@ -1,28 +1,32 @@ ({ // Weapons - "active_mainhand": Item("common.items.weapons.sword_1h.bloodsteel-0"), - "active_offhand": Item("common.items.weapons.sword_1h.bloodsteel-0"), + ActiveMainhand: Item("common.items.weapons.sword_1h.bloodsteel-0"), + ActiveOffhand: Item("common.items.weapons.sword_1h.bloodsteel-0"), - "inactive_mainhand": Item("common.items.weapons.sword_1h.bloodsteel-0"), - "inactive_offhand": Item("common.items.weapons.sword_1h.bloodsteel-0"), + InactiveMainhand: Item("common.items.weapons.sword_1h.bloodsteel-0"), + InactiveOffhand: Item("common.items.weapons.sword_1h.bloodsteel-0"), // Gear - "head": Item("common.items.npc_armor.biped_small.myrmidon.head.myrmidon"), - "shoulder": Item("common.items.armor.twigsflowers.shoulder"), - "chest": Item("common.items.armor.twigsflowers.chest"), - "hands": Item("common.items.armor.twigsflowers.hand"), - "pants": Item("common.items.armor.twigsflowers.pants"), - "feet": Item("common.items.armor.twigsflowers.foot"), - "belt": Item("common.items.armor.twigsflowers.belt"), + Armor(Head): Item("common.items.npc_armor.biped_small.myrmidon.head.myrmidon"), + Armor(Shoulders): Item("common.items.armor.twigsflowers.shoulder"), + Armor(Chest): Item("common.items.armor.twigsflowers.chest"), + Armor(Hands): Item("common.items.armor.twigsflowers.hand"), + Armor(Legs): Item("common.items.armor.twigsflowers.pants"), + Armor(Feet): Item("common.items.armor.twigsflowers.foot"), + Armor(Belt): Item("common.items.armor.twigsflowers.belt"), // Biju - "back": Item("common.items.armor.misc.back.dungeon_purple"), - "neck": Item("common.items.armor.misc.neck.plain_1"), - "ring1": Item("common.items.armor.misc.ring.gold"), - "ring2": Item("common.items.armor.misc.ring.gold"), + Armor(Back): Item("common.items.armor.misc.back.dungeon_purple"), + Armor(Neck): Item("common.items.armor.misc.neck.plain_1"), + Armor(Ring1): Item("common.items.armor.misc.ring.gold"), + Armor(Ring2): Item("common.items.armor.misc.ring.gold"), // Misc - "lantern": Item("common.items.lantern.black_0"), - "tabard": Item("common.items.debug.admin"), - "glider": Item("common.items.glider.glider_basic_red"), + Lantern: Item("common.items.lantern.black_0"), + Armor(Tabard): Item("common.items.debug.admin"), + Glider: Item("common.items.glider.glider_basic_red"), + Armor(Bag1): Item("common.items.armor.misc.bag.tiny_leather_pouch"), + Armor(Bag2): Item("common.items.armor.misc.bag.tiny_leather_pouch"), + Armor(Bag3): Item("common.items.armor.misc.bag.tiny_leather_pouch"), + Armor(Bag4): Item("common.items.armor.misc.bag.tiny_leather_pouch"), }) diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 6d4150aeda..1b7bf161bb 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -72,7 +72,7 @@ enum ItemSpec { } #[derive(Debug, Deserialize, Clone)] -pub struct LoadoutSpec(HashMap); +pub struct LoadoutSpec(HashMap); impl assets::Asset for LoadoutSpec { type Loader = assets::RonLoader; @@ -331,7 +331,7 @@ impl LoadoutBuilder { }, (_, Some(ItemSpec::Choice(_))) => { let err = format!( - "Using choice of choices in ({}): {}. Unimplemented.", + "Using choice of choices in ({}): {:?}. Unimplemented.", asset_specifier, key, ); if cfg!(tests) { @@ -345,73 +345,66 @@ impl LoadoutBuilder { } }, }; - match key.as_str() { - "active_mainhand" => { + match key { + EquipSlot::ActiveMainhand => { loadout = loadout.active_mainhand(Some(item)); }, - "active_offhand" => { + EquipSlot::ActiveOffhand => { loadout = loadout.active_offhand(Some(item)); }, - "inactive_mainhand" => { + EquipSlot::InactiveMainhand => { loadout = loadout.inactive_mainhand(Some(item)); }, - "inactive_offhand" => { + EquipSlot::InactiveOffhand => { loadout = loadout.inactive_offhand(Some(item)); }, - "head" => { + EquipSlot::Armor(ArmorSlot::Head) => { loadout = loadout.head(Some(item)); }, - "shoulder" => { + EquipSlot::Armor(ArmorSlot::Shoulders) => { loadout = loadout.shoulder(Some(item)); }, - "chest" => { + EquipSlot::Armor(ArmorSlot::Chest) => { loadout = loadout.chest(Some(item)); }, - "hands" => { + EquipSlot::Armor(ArmorSlot::Hands) => { loadout = loadout.hands(Some(item)); }, - "pants" => { + EquipSlot::Armor(ArmorSlot::Legs) => { loadout = loadout.pants(Some(item)); }, - "feet" => { + EquipSlot::Armor(ArmorSlot::Feet) => { loadout = loadout.feet(Some(item)); }, - "belt" => { + EquipSlot::Armor(ArmorSlot::Belt) => { loadout = loadout.belt(Some(item)); }, - "back" => { + EquipSlot::Armor(ArmorSlot::Back) => { loadout = loadout.back(Some(item)); }, - "neck" => { + EquipSlot::Armor(ArmorSlot::Neck) => { loadout = loadout.neck(Some(item)); }, - "ring1" => { + EquipSlot::Armor(ArmorSlot::Ring1) => { loadout = loadout.ring1(Some(item)); }, - "ring2" => { + EquipSlot::Armor(ArmorSlot::Ring2) => { loadout = loadout.ring2(Some(item)); }, - "lantern" => { + EquipSlot::Lantern => { loadout = loadout.lantern(Some(item)); }, - "tabard" => { + EquipSlot::Armor(ArmorSlot::Tabard) => { loadout = loadout.tabard(Some(item)); }, - "glider" => { + EquipSlot::Glider => { loadout = loadout.glider(Some(item)); }, - _ => { - if cfg!(tests) { - panic!( - "Unexpected key in loadout asset ({}): {}", - asset_specifier, key - ); - } else { - warn!( - "Unexpected key in loadout asset ({}): {}", - asset_specifier, key - ); - } + EquipSlot::Armor(slot @ ArmorSlot::Bag1) + | EquipSlot::Armor(slot @ ArmorSlot::Bag2) + | EquipSlot::Armor(slot @ ArmorSlot::Bag3) + | EquipSlot::Armor(slot @ ArmorSlot::Bag4) => { + loadout = loadout.bag(slot, Some(item)); }, }; } @@ -775,8 +768,8 @@ mod tests { // // Things that will be catched - invalid assets paths // FIXME: if item is used in some branch of rng test may miss it - // TODO: as of now there is no rng generation of items - // validate assets for all possible branches + // TODO: as of now there is no rng generation of items. + // Validate assets for all possible branches #[test] fn test_loadout_configs() { let test_weapons = vec![ From f01b700c88abe49a1a755ff6bbd01b6163106cc3 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 23 May 2021 22:27:33 +0300 Subject: [PATCH 09/11] Add tests for validation assets --- .../loadouts/dungeon/tier-0/gnarling.ron | 12 +-- .../loadouts/dungeon/tier-1/adlet_bow.ron | 12 +-- .../loadouts/dungeon/tier-1/adlet_spear.ron | 12 +-- .../loadouts/dungeon/tier-2/sahagin.ron | 12 +-- .../common/loadouts/dungeon/tier-3/haniwa.ron | 10 +-- .../loadouts/dungeon/tier-4/myrmidon.ron | 12 +-- .../loadouts/dungeon/tier-5/beastmaster.ron | 18 ++--- .../common/loadouts/dungeon/tier-5/husk.ron | 10 +-- .../loadouts/dungeon/tier-5/warlock.ron | 18 ++--- .../loadouts/dungeon/tier-5/warlord.ron | 18 ++--- assets/common/loadouts/village/guard.ron | 14 ++-- assets/common/loadouts/village/merchant.ron | 20 ++--- assets/common/loadouts/village/villager.ron | 8 +- common/src/comp/inventory/loadout_builder.rs | 73 +++++++++++++++++-- 14 files changed, 153 insertions(+), 96 deletions(-) diff --git a/assets/common/loadouts/dungeon/tier-0/gnarling.ron b/assets/common/loadouts/dungeon/tier-0/gnarling.ron index a3d4ca6e17..9d73cdefdb 100644 --- a/assets/common/loadouts/dungeon/tier-0/gnarling.ron +++ b/assets/common/loadouts/dungeon/tier-0/gnarling.ron @@ -1,8 +1,8 @@ ({ - "head": Item("common.items.npc_armor.biped_small.gnarling.head.gnarling"), - "feet": Item("common.items.npc_armor.biped_small.gnarling.foot.gnarling"), - "hands": Item("common.items.npc_armor.biped_small.gnarling.hand.gnarling"), - "chest": Item("common.items.npc_armor.biped_small.gnarling.chest.gnarling"), - "pants": Item("common.items.npc_armor.biped_small.gnarling.pants.gnarling"), - "belt": Item("common.items.npc_armor.biped_small.gnarling.tail.gnarling"), + Armor(Head): Item("common.items.npc_armor.biped_small.gnarling.head.gnarling"), + Armor(Feet): Item("common.items.npc_armor.biped_small.gnarling.foot.gnarling"), + Armor(Hands): Item("common.items.npc_armor.biped_small.gnarling.hand.gnarling"), + Armor(Chest): Item("common.items.npc_armor.biped_small.gnarling.chest.gnarling"), + Armor(Legs): Item("common.items.npc_armor.biped_small.gnarling.pants.gnarling"), + Armor(Belt): Item("common.items.npc_armor.biped_small.gnarling.tail.gnarling"), }) diff --git a/assets/common/loadouts/dungeon/tier-1/adlet_bow.ron b/assets/common/loadouts/dungeon/tier-1/adlet_bow.ron index a01505224c..6e41a40ee7 100644 --- a/assets/common/loadouts/dungeon/tier-1/adlet_bow.ron +++ b/assets/common/loadouts/dungeon/tier-1/adlet_bow.ron @@ -1,8 +1,8 @@ ({ - "head": Item("common.items.npc_armor.biped_small.adlet.head.adlet_bow"), - "hands": Item("common.items.npc_armor.biped_small.adlet.hand.adlet_bow"), - "feet": Item("common.items.npc_armor.biped_small.adlet.foot.adlet"), - "chest": Item("common.items.npc_armor.biped_small.adlet.chest.adlet_bow"), - "pants": Item("common.items.npc_armor.biped_small.adlet.pants.adlet_bow"), - "belt": Item("common.items.npc_armor.biped_small.adlet.tail.adlet"), + Armor(Head): Item("common.items.npc_armor.biped_small.adlet.head.adlet_bow"), + Armor(Hands): Item("common.items.npc_armor.biped_small.adlet.hand.adlet_bow"), + Armor(Feet): Item("common.items.npc_armor.biped_small.adlet.foot.adlet"), + Armor(Chest): Item("common.items.npc_armor.biped_small.adlet.chest.adlet_bow"), + Armor(Legs): Item("common.items.npc_armor.biped_small.adlet.pants.adlet_bow"), + Armor(Belt): Item("common.items.npc_armor.biped_small.adlet.tail.adlet"), }) diff --git a/assets/common/loadouts/dungeon/tier-1/adlet_spear.ron b/assets/common/loadouts/dungeon/tier-1/adlet_spear.ron index c02a246b04..3cc2d10f4d 100644 --- a/assets/common/loadouts/dungeon/tier-1/adlet_spear.ron +++ b/assets/common/loadouts/dungeon/tier-1/adlet_spear.ron @@ -1,8 +1,8 @@ ({ - "head": Item("common.items.npc_armor.biped_small.adlet.head.adlet_spear"), - "hands": Item("common.items.npc_armor.biped_small.adlet.hand.adlet_spear"), - "feet": Item("common.items.npc_armor.biped_small.adlet.foot.adlet"), - "chest": Item("common.items.npc_armor.biped_small.adlet.chest.adlet_spear"), - "pants": Item("common.items.npc_armor.biped_small.adlet.pants.adlet_spear"), - "belt": Item("common.items.npc_armor.biped_small.adlet.tail.adlet"), + Armor(Head): Item("common.items.npc_armor.biped_small.adlet.head.adlet_spear"), + Armor(Hands): Item("common.items.npc_armor.biped_small.adlet.hand.adlet_spear"), + Armor(Feet): Item("common.items.npc_armor.biped_small.adlet.foot.adlet"), + Armor(Chest): Item("common.items.npc_armor.biped_small.adlet.chest.adlet_spear"), + Armor(Legs): Item("common.items.npc_armor.biped_small.adlet.pants.adlet_spear"), + Armor(Belt): Item("common.items.npc_armor.biped_small.adlet.tail.adlet"), }) diff --git a/assets/common/loadouts/dungeon/tier-2/sahagin.ron b/assets/common/loadouts/dungeon/tier-2/sahagin.ron index 3a26362fc8..e7be4c0458 100644 --- a/assets/common/loadouts/dungeon/tier-2/sahagin.ron +++ b/assets/common/loadouts/dungeon/tier-2/sahagin.ron @@ -1,8 +1,8 @@ ({ - "head": Item("common.items.npc_armor.biped_small.sahagin.head.sahagin"), - "feet": Item("common.items.npc_armor.biped_small.sahagin.foot.sahagin"), - "hands": Item("common.items.npc_armor.biped_small.sahagin.hand.sahagin"), - "chest": Item("common.items.npc_armor.biped_small.sahagin.chest.sahagin"), - "pants": Item("common.items.npc_armor.biped_small.sahagin.pants.sahagin"), - "belt": Item("common.items.npc_armor.biped_small.sahagin.tail.sahagin"), + Armor(Head): Item("common.items.npc_armor.biped_small.sahagin.head.sahagin"), + Armor(Feet): Item("common.items.npc_armor.biped_small.sahagin.foot.sahagin"), + Armor(Hands): Item("common.items.npc_armor.biped_small.sahagin.hand.sahagin"), + Armor(Chest): Item("common.items.npc_armor.biped_small.sahagin.chest.sahagin"), + Armor(Legs): Item("common.items.npc_armor.biped_small.sahagin.pants.sahagin"), + Armor(Belt): Item("common.items.npc_armor.biped_small.sahagin.tail.sahagin"), }) diff --git a/assets/common/loadouts/dungeon/tier-3/haniwa.ron b/assets/common/loadouts/dungeon/tier-3/haniwa.ron index b2b9aa90e1..92c9e142a5 100644 --- a/assets/common/loadouts/dungeon/tier-3/haniwa.ron +++ b/assets/common/loadouts/dungeon/tier-3/haniwa.ron @@ -1,7 +1,7 @@ ({ - "head": Item("common.items.npc_armor.biped_small.haniwa.head.haniwa"), - "feet": Item("common.items.npc_armor.biped_small.haniwa.foot.haniwa"), - "hands": Item("common.items.npc_armor.biped_small.haniwa.hand.haniwa"), - "chest": Item("common.items.npc_armor.biped_small.haniwa.chest.haniwa"), - "pants": Item("common.items.npc_armor.biped_small.haniwa.pants.haniwa"), + Armor(Head): Item("common.items.npc_armor.biped_small.haniwa.head.haniwa"), + Armor(Feet): Item("common.items.npc_armor.biped_small.haniwa.foot.haniwa"), + Armor(Hands): Item("common.items.npc_armor.biped_small.haniwa.hand.haniwa"), + Armor(Chest): Item("common.items.npc_armor.biped_small.haniwa.chest.haniwa"), + Armor(Legs): Item("common.items.npc_armor.biped_small.haniwa.pants.haniwa"), }) diff --git a/assets/common/loadouts/dungeon/tier-4/myrmidon.ron b/assets/common/loadouts/dungeon/tier-4/myrmidon.ron index 565b91d416..fb4867b283 100644 --- a/assets/common/loadouts/dungeon/tier-4/myrmidon.ron +++ b/assets/common/loadouts/dungeon/tier-4/myrmidon.ron @@ -1,8 +1,8 @@ ({ - "head": Item("common.items.npc_armor.biped_small.myrmidon.head.myrmidon"), - "feet": Item("common.items.npc_armor.biped_small.myrmidon.foot.myrmidon"), - "hands": Item("common.items.npc_armor.biped_small.myrmidon.hand.myrmidon"), - "chest": Item("common.items.npc_armor.biped_small.myrmidon.chest.myrmidon"), - "pants": Item("common.items.npc_armor.biped_small.myrmidon.pants.myrmidon"), - "belt": Item("common.items.npc_armor.biped_small.myrmidon.tail.myrmidon"), + Armor(Head): Item("common.items.npc_armor.biped_small.myrmidon.head.myrmidon"), + Armor(Feet): Item("common.items.npc_armor.biped_small.myrmidon.foot.myrmidon"), + Armor(Hands): Item("common.items.npc_armor.biped_small.myrmidon.hand.myrmidon"), + Armor(Chest): Item("common.items.npc_armor.biped_small.myrmidon.chest.myrmidon"), + Armor(Legs): Item("common.items.npc_armor.biped_small.myrmidon.pants.myrmidon"), + Armor(Belt): Item("common.items.npc_armor.biped_small.myrmidon.tail.myrmidon"), }) diff --git a/assets/common/loadouts/dungeon/tier-5/beastmaster.ron b/assets/common/loadouts/dungeon/tier-5/beastmaster.ron index 87dd7fbba1..f1fe6b3175 100644 --- a/assets/common/loadouts/dungeon/tier-5/beastmaster.ron +++ b/assets/common/loadouts/dungeon/tier-5/beastmaster.ron @@ -1,17 +1,17 @@ ({ - "shoulder": Item("common.items.armor.ferocious.shoulder"), - "chest": Item("common.items.armor.ferocious.chest"), - "belt": Item("common.items.armor.ferocious.belt"), - "hands": Item("common.items.armor.ferocious.hand"), - "pants": Item("common.items.armor.ferocious.pants"), - "feet": Item("common.items.armor.ferocious.foot"), + Armor(Shoulders): Item("common.items.armor.ferocious.shoulder"), + Armor(Chest): Item("common.items.armor.ferocious.chest"), + Armor(Belt): Item("common.items.armor.ferocious.belt"), + Armor(Hands): Item("common.items.armor.ferocious.hand"), + Armor(Legs): Item("common.items.armor.ferocious.pants"), + Armor(Feet): Item("common.items.armor.ferocious.foot"), - "back": Item("common.items.armor.ferocious.back"), + Armor(Back): Item("common.items.armor.ferocious.back"), - "lantern": Choice([ + Lantern: Choice([ (1.0, Some(Item("common.items.lantern.black_0"))), (2.0, None), ]), - "glider": Item("common.items.glider.glider_blue"), + Glider: Item("common.items.glider.glider_blue"), }) diff --git a/assets/common/loadouts/dungeon/tier-5/husk.ron b/assets/common/loadouts/dungeon/tier-5/husk.ron index 9d5a3f6d83..feb981ad79 100644 --- a/assets/common/loadouts/dungeon/tier-5/husk.ron +++ b/assets/common/loadouts/dungeon/tier-5/husk.ron @@ -1,7 +1,7 @@ ({ - "head": Item("common.items.npc_armor.biped_small.husk.head.husk"), - "feet": Item("common.items.npc_armor.biped_small.husk.foot.husk"), - "hands": Item("common.items.npc_armor.biped_small.husk.hand.husk"), - "chest": Item("common.items.npc_armor.biped_small.husk.chest.husk"), - "pants": Item("common.items.npc_armor.biped_small.husk.pants.husk"), + Armor(Head): Item("common.items.npc_armor.biped_small.husk.head.husk"), + Armor(Feet): Item("common.items.npc_armor.biped_small.husk.foot.husk"), + Armor(Hands): Item("common.items.npc_armor.biped_small.husk.hand.husk"), + Armor(Chest): Item("common.items.npc_armor.biped_small.husk.chest.husk"), + Armor(Legs): Item("common.items.npc_armor.biped_small.husk.pants.husk"), }) diff --git a/assets/common/loadouts/dungeon/tier-5/warlock.ron b/assets/common/loadouts/dungeon/tier-5/warlock.ron index ea04930ce3..bcc428fbda 100644 --- a/assets/common/loadouts/dungeon/tier-5/warlock.ron +++ b/assets/common/loadouts/dungeon/tier-5/warlock.ron @@ -1,17 +1,17 @@ ({ - "shoulder": Item("common.items.armor.warlock.shoulder"), - "chest": Item("common.items.armor.warlock.chest"), - "belt": Item("common.items.armor.warlock.belt"), - "hands": Item("common.items.armor.warlock.hand"), - "pants": Item("common.items.armor.warlock.pants"), - "feet": Item("common.items.armor.warlock.foot"), + Armor(Shoulders): Item("common.items.armor.warlock.shoulder"), + Armor(Chest): Item("common.items.armor.warlock.chest"), + Armor(Belt): Item("common.items.armor.warlock.belt"), + Armor(Hands): Item("common.items.armor.warlock.hand"), + Armor(Legs): Item("common.items.armor.warlock.pants"), + Armor(Feet): Item("common.items.armor.warlock.foot"), - "back": Item("common.items.armor.warlock.back"), + Armor(Back): Item("common.items.armor.warlock.back"), - "lantern": Choice([ + Lantern: Choice([ (1.0, Some(Item("common.items.lantern.black_0"))), (2.0, None), ]), - "glider": Item("common.items.glider.glider_purp"), + Glider: Item("common.items.glider.glider_purp"), }) diff --git a/assets/common/loadouts/dungeon/tier-5/warlord.ron b/assets/common/loadouts/dungeon/tier-5/warlord.ron index 66b65cc8ae..2d83fef3fa 100644 --- a/assets/common/loadouts/dungeon/tier-5/warlord.ron +++ b/assets/common/loadouts/dungeon/tier-5/warlord.ron @@ -1,17 +1,17 @@ ({ - "shoulder": Item("common.items.armor.warlord.shoulder"), - "chest": Item("common.items.armor.warlord.chest"), - "belt": Item("common.items.armor.warlord.belt"), - "hands": Item("common.items.armor.warlord.hand"), - "pants": Item("common.items.armor.warlord.pants"), - "feet": Item("common.items.armor.warlord.foot"), + Armor(Shoulders): Item("common.items.armor.warlord.shoulder"), + Armor(Chest): Item("common.items.armor.warlord.chest"), + Armor(Belt): Item("common.items.armor.warlord.belt"), + Armor(Hands): Item("common.items.armor.warlord.hand"), + Armor(Legs): Item("common.items.armor.warlord.pants"), + Armor(Feet): Item("common.items.armor.warlord.foot"), - "back": Item("common.items.armor.warlord.back"), + Armor(Back): Item("common.items.armor.warlord.back"), - "lantern": Choice([ + Lantern: Choice([ (1.0, Some(Item("common.items.lantern.black_0"))), (2.0, None), ]), - "glider": Item("common.items.glider.glider_purp"), + Glider: Item("common.items.glider.glider_purp"), }) diff --git a/assets/common/loadouts/village/guard.ron b/assets/common/loadouts/village/guard.ron index afeb440bf9..9280fd9a65 100644 --- a/assets/common/loadouts/village/guard.ron +++ b/assets/common/loadouts/village/guard.ron @@ -1,12 +1,12 @@ ({ - "shoulder": Item("common.items.armor.leather_plate.shoulder"), - "chest": Item("common.items.armor.leather_plate.chest"), - "belt": Item("common.items.armor.leather_plate.belt"), - "hands": Item("common.items.armor.leather_plate.hand"), - "pants": Item("common.items.armor.leather_plate.pants"), - "feet": Item("common.items.armor.leather_plate.foot"), + Armor(Shoulders): Item("common.items.armor.leather_plate.shoulder"), + Armor(Chest): Item("common.items.armor.leather_plate.chest"), + Armor(Belt): Item("common.items.armor.leather_plate.belt"), + Armor(Hands): Item("common.items.armor.leather_plate.hand"), + Armor(Legs): Item("common.items.armor.leather_plate.pants"), + Armor(Feet): Item("common.items.armor.leather_plate.foot"), - "lantern": Choice([ + Lantern: Choice([ (1.0, Some(Item("common.items.lantern.black_0"))), (2.0, None), ]), diff --git a/assets/common/loadouts/village/merchant.ron b/assets/common/loadouts/village/merchant.ron index 6deb75c0a3..7bbe20362f 100644 --- a/assets/common/loadouts/village/merchant.ron +++ b/assets/common/loadouts/village/merchant.ron @@ -1,13 +1,13 @@ ({ - "shoulder": Item("common.items.armor.twigsflowers.shoulder"), - "chest": Item("common.items.armor.twigsflowers.chest"), - "hands": Item("common.items.armor.twigsflowers.hand"), - "pants": Item("common.items.armor.twigsflowers.pants"), - "feet": Item("common.items.armor.twigsflowers.foot"), - "belt": Item("common.items.armor.twigsflowers.belt"), + Armor(Shoulders): Item("common.items.armor.twigsflowers.shoulder"), + Armor(Chest): Item("common.items.armor.twigsflowers.chest"), + Armor(Hands): Item("common.items.armor.twigsflowers.hand"), + Armor(Legs): Item("common.items.armor.twigsflowers.pants"), + Armor(Feet): Item("common.items.armor.twigsflowers.foot"), + Armor(Belt): Item("common.items.armor.twigsflowers.belt"), - "lantern": Item("common.items.lantern.black_0"), - "neck": Item("common.items.armor.misc.neck.plain_1"), - "ring1": Item("common.items.armor.misc.ring.gold"), - "ring2": Item("common.items.armor.misc.ring.gold"), + Lantern: Item("common.items.lantern.black_0"), + Armor(Neck): Item("common.items.armor.misc.neck.plain_1"), + Armor(Ring1): Item("common.items.armor.misc.ring.gold"), + Armor(Ring2): Item("common.items.armor.misc.ring.gold"), }) diff --git a/assets/common/loadouts/village/villager.ron b/assets/common/loadouts/village/villager.ron index fb520a56e3..4be54001f5 100644 --- a/assets/common/loadouts/village/villager.ron +++ b/assets/common/loadouts/village/villager.ron @@ -1,5 +1,5 @@ ({ - "chest": Choice([ + Armor(Chest): Choice([ (1.0, Some(Item("common.items.armor.misc.chest.worker_green_0"))), (1.0, Some(Item("common.items.armor.misc.chest.worker_green_1"))), (1.0, Some(Item("common.items.armor.misc.chest.worker_red_0"))), @@ -12,10 +12,10 @@ (1.0, Some(Item("common.items.armor.misc.chest.worker_orange_1"))), ]), - "belt": Item("common.items.armor.swift.belt"), - "pants": Item("common.items.armor.misc.pants.worker_blue"), + Armor(Belt): Item("common.items.armor.swift.belt"), + Armor(Legs): Item("common.items.armor.misc.pants.worker_blue"), - "feet": Choice([ + Armor(Feet): Choice([ (1.0, Some(Item("common.items.armor.swift.foot"))), (1.0, Some(Item("common.items.armor.misc.foot.sandals"))), ]), diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 1b7bf161bb..70fa635638 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -401,9 +401,9 @@ impl LoadoutBuilder { loadout = loadout.glider(Some(item)); }, EquipSlot::Armor(slot @ ArmorSlot::Bag1) - | EquipSlot::Armor(slot @ ArmorSlot::Bag2) - | EquipSlot::Armor(slot @ ArmorSlot::Bag3) - | EquipSlot::Armor(slot @ ArmorSlot::Bag4) => { + | EquipSlot::Armor(slot @ ArmorSlot::Bag2) + | EquipSlot::Armor(slot @ ArmorSlot::Bag3) + | EquipSlot::Armor(slot @ ArmorSlot::Bag4) => { loadout = loadout.bag(slot, Some(item)); }, }; @@ -760,16 +760,16 @@ impl LoadoutBuilder { #[cfg(test)] mod tests { use super::*; - use crate::comp::{self, Body}; + use crate::{ + assets::{AssetExt, Error}, + comp::{self, Body}, + }; use rand::thread_rng; use strum::IntoEnumIterator; // Testing all configs in loadout with weapons of different toolkinds // // Things that will be catched - invalid assets paths - // FIXME: if item is used in some branch of rng test may miss it - // TODO: as of now there is no rng generation of items. - // Validate assets for all possible branches #[test] fn test_loadout_configs() { let test_weapons = vec![ @@ -852,5 +852,62 @@ mod tests { } #[test] - fn test_loadout_assets() { LoadoutBuilder::from_asset_expect("common.loadouts.test"); } + fn test_loadout_asset() { LoadoutBuilder::from_asset_expect("common.loadouts.test"); } + + #[test] + fn test_all_loadout_assets() { + #[derive(Clone)] + struct LoadoutsList(Vec); + impl assets::Compound for LoadoutsList { + fn load( + cache: &assets::AssetCache, + specifier: &str, + ) -> Result { + let list = cache + .load::(specifier)? + .read() + .iter() + .map(|spec| LoadoutSpec::load_cloned(spec)) + .collect::>()?; + + Ok(LoadoutsList(list)) + } + } + + // It just load everything that could + // TODO: add some checks, e.g. that Armor(Head) key correspond + // to Item with ItemKind Head(_) + fn validate_asset(loadout: LoadoutSpec) { + let spec = loadout.0.clone(); + for (key, specifier) in spec { + match specifier { + ItemSpec::Item(specifier) => { + Item::new_from_asset_expect(&specifier); + }, + ItemSpec::Choice(ref items) => { + for item in items { + match item { + (_, Some(ItemSpec::Item(specifier))) => { + Item::new_from_asset_expect(&specifier); + }, + (_, None) => {}, + (_, _) => { + panic!( + "\n\nChoice of Choice is unimplemented. (Search for \n{:?}: \ + {:#?})\n\n", + key, specifier, + ); + }, + }; + } + }, + }; + } + } + + let loadouts = LoadoutsList::load_expect_cloned("common.loadouts.*").0; + for loadout in loadouts { + validate_asset(loadout); + } + } } From 8e5f2d4d3b3859fbbc8816e6e99b5e6639cca366 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 23 May 2021 22:53:44 +0300 Subject: [PATCH 10/11] Fix species tests for random body_type and fmt --- common/src/comp/inventory/loadout_builder.rs | 44 +++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 70fa635638..8761c976e4 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -57,17 +57,17 @@ pub enum LoadoutConfig { #[derive(Debug, Deserialize, Clone)] enum ItemSpec { - // One specific item. - // Example: - // `Item("common.items.armor.steel.foot")` + /// One specific item. + /// Example: + /// `Item("common.items.armor.steel.foot")` Item(String), - // Choice from items with weights. - // Example: - // ``` - // Choice([ - // (1.0, Some(Item("common.items.lantern.blue_0"))), - // (1.0, None), - // ]) + /// Choice from items with weights. + /// Example: + /// ``` + /// Choice([ + /// (1.0, Some(Item("common.items.lantern.blue_0"))), + /// (1.0, None), + /// ]) Choice(Vec<(f32, Option)>), } @@ -808,8 +808,6 @@ mod tests { // // Things that will be catched - invalid assets paths for // creating default main hand tool or equipement without config - // - // FIXME: if species has differences of body type (male/female) test may miss it #[test] fn test_loadout_species() { macro_rules! test_species { @@ -818,8 +816,22 @@ mod tests { let mut rng = thread_rng(); for s in comp::$species::ALL_SPECIES.iter() { let body = comp::$species::Body::random_with(&mut rng, s); + let female_body = comp::$species::Body { + body_type: comp::$species::BodyType::Female, + ..body + }; + let male_body = comp::$species::Body { + body_type: comp::$species::BodyType::Male, + ..body + }; LoadoutBuilder::build_loadout( - Body::$body(body), + Body::$body(female_body), + None, + None, + None, + ); + LoadoutBuilder::build_loadout( + Body::$body(male_body), None, None, None, @@ -878,7 +890,7 @@ mod tests { // TODO: add some checks, e.g. that Armor(Head) key correspond // to Item with ItemKind Head(_) fn validate_asset(loadout: LoadoutSpec) { - let spec = loadout.0.clone(); + let spec = loadout.0; for (key, specifier) in spec { match specifier { ItemSpec::Item(specifier) => { @@ -893,8 +905,8 @@ mod tests { (_, None) => {}, (_, _) => { panic!( - "\n\nChoice of Choice is unimplemented. (Search for \n{:?}: \ - {:#?})\n\n", + "\n\nChoice of Choice is unimplemented. (Search for \ + \n{:?}: {:#?})\n\n", key, specifier, ); }, From d5c566ff24f11a6dad72f95cc067ab9ab5358b3f Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Mon, 24 May 2021 00:06:03 +0300 Subject: [PATCH 11/11] fixing tests --- common/src/comp/inventory/loadout_builder.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 8761c976e4..8d7cd0bf79 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -59,11 +59,10 @@ pub enum LoadoutConfig { enum ItemSpec { /// One specific item. /// Example: - /// `Item("common.items.armor.steel.foot")` + /// Item("common.items.armor.steel.foot") Item(String), /// Choice from items with weights. /// Example: - /// ``` /// Choice([ /// (1.0, Some(Item("common.items.lantern.blue_0"))), /// (1.0, None),