From 3e4615daea7db1feb5ae277d1c4b36e7ef14f97d Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 15 Aug 2020 22:03:08 -0500 Subject: [PATCH] Loadouts are now generated with loadout_builder.rs. Creatures spawned naturally and via command are now spawned with the same mechanics. --- common/src/loadout_builder.rs | 154 +++++++++++++++++++++++++++++++++- server/src/cmd.rs | 2 +- server/src/sys/terrain.rs | 118 +------------------------- 3 files changed, 156 insertions(+), 118 deletions(-) diff --git a/common/src/loadout_builder.rs b/common/src/loadout_builder.rs index 3f40faccb9..e890778ef2 100644 --- a/common/src/loadout_builder.rs +++ b/common/src/loadout_builder.rs @@ -1,4 +1,10 @@ -use crate::comp::{item::Item, Body, CharacterAbility, ItemConfig, Loadout}; +use crate::{ + comp::{ + item::{Item, ItemKind}, + Alignment, Body, biped_large, CharacterAbility, ItemConfig, Loadout, + }, +}; +use rand::Rng; use std::time::Duration; /// Builder for character Loadouts, containing weapon and armour items belonging @@ -60,6 +66,151 @@ impl LoadoutBuilder { ))) } + /// Builds loadout of creature when spawned + pub fn build_loadout(body: Body, alignment: Alignment, mut main_tool: Option) -> Self { + match body { + Body::BipedLarge(biped_large) => match biped_large.species { + biped_large::Species::Cyclops => { + main_tool = Some(Item::new_from_asset_expect("common.items.weapons.bossweapon.cyclops_hammer")); + }, + _ => {}, + } + _ => {}, + }; + + let active_item = + if let Some(ItemKind::Tool(tool)) = main_tool.as_ref().map(|i| i.kind()) { + let mut abilities = tool.get_abilities(); + let mut ability_drain = abilities.drain(..); + + main_tool.map(|item| ItemConfig { + item, + ability1: ability_drain.next(), + ability2: ability_drain.next(), + ability3: ability_drain.next(), + block_ability: None, + dodge_ability: Some(CharacterAbility::Roll), + }) + } else { + Some(ItemConfig { + // We need the empty item so npcs can attack + item: Item::new_from_asset_expect("common.items.weapons.empty.empty"), + ability1: Some(CharacterAbility::BasicMelee { + energy_cost: 0, + buildup_duration: Duration::from_millis(0), + recover_duration: Duration::from_millis(400), + base_healthchange: -40, + knockback: 0.0, + range: 3.5, + max_angle: 15.0, + }), + ability2: None, + ability3: None, + block_ability: None, + dodge_ability: None, + }) + }; + + let loadout = match body { + Body::Humanoid(_) => match alignment { + Alignment::Npc => Loadout { + active_item, + second_item: None, + shoulder: None, + chest: Some(Item::new_from_asset_expect( + match rand::thread_rng().gen_range(0, 10) { + 0 => "common.items.armor.chest.worker_green_0", + 1 => "common.items.armor.chest.worker_green_1", + 2 => "common.items.armor.chest.worker_red_0", + 3 => "common.items.armor.chest.worker_red_1", + 4 => "common.items.armor.chest.worker_purple_0", + 5 => "common.items.armor.chest.worker_purple_1", + 6 => "common.items.armor.chest.worker_yellow_0", + 7 => "common.items.armor.chest.worker_yellow_1", + 8 => "common.items.armor.chest.worker_orange_0", + _ => "common.items.armor.chest.worker_orange_1", + }, + )), + belt: Some(Item::new_from_asset_expect( + "common.items.armor.belt.leather_0", + )), + hand: None, + pants: Some(Item::new_from_asset_expect( + "common.items.armor.pants.worker_blue_0", + )), + foot: Some(Item::new_from_asset_expect( + match rand::thread_rng().gen_range(0, 2) { + 0 => "common.items.armor.foot.leather_0", + _ => "common.items.armor.starter.sandals_0", + }, + )), + back: None, + ring: None, + neck: None, + lantern: None, + glider: None, + head: None, + tabard: None, + }, + Alignment::Enemy => Loadout { + active_item, + second_item: None, + shoulder: Some(Item::new_from_asset_expect( + "common.items.armor.shoulder.cultist_shoulder_purple", + )), + chest: Some(Item::new_from_asset_expect( + "common.items.armor.chest.cultist_chest_purple", + )), + belt: Some(Item::new_from_asset_expect( + "common.items.armor.belt.cultist_belt", + )), + hand: Some(Item::new_from_asset_expect( + "common.items.armor.hand.cultist_hands_purple", + )), + pants: Some(Item::new_from_asset_expect( + "common.items.armor.pants.cultist_legs_purple", + )), + foot: Some(Item::new_from_asset_expect( + "common.items.armor.foot.cultist_boots", + )), + back: Some(Item::new_from_asset_expect( + "common.items.armor.back.dungeon_purple-0", + )), + ring: None, + neck: None, + lantern: Some(Item::new_from_asset_expect("common.items.lantern.black_0")), + glider: None, + head: None, + tabard: None, + }, + _ => LoadoutBuilder::animal(body).build(), + }, + Body::BipedLarge(biped_large) => match biped_large.species { + biped_large::Species::Cyclops => Loadout { + active_item, + second_item: None, + shoulder: None, + chest: None, + belt: None, + hand: None, + pants: None, + foot: None, + back: None, + ring: None, + neck: None, + lantern: None, + glider: None, + head: None, + tabard: None, + }, + _ => LoadoutBuilder::animal(body).build(), + } + _ => LoadoutBuilder::animal(body).build(), + }; + + Self(loadout) + } + /// Default animal configuration pub fn animal(body: Body) -> Self { Self(Loadout { @@ -114,6 +265,7 @@ impl LoadoutBuilder { Self::default_item_config_from_item(Item::new_from_asset_expect(item_ref)) } + pub fn active_item(mut self, item: Option) -> Self { self.0.active_item = item; diff --git a/server/src/cmd.rs b/server/src/cmd.rs index 7a8057a639..e1799417c6 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -582,7 +582,7 @@ fn handle_spawn( .create_npc( pos, comp::Stats::new(get_npc_name(id).into(), body), - LoadoutBuilder::animal(body).build(), + LoadoutBuilder::build_loadout(body, alignment, None).build(), body, ) .with(comp::Vel(vel)) diff --git a/server/src/sys/terrain.rs b/server/src/sys/terrain.rs index a48c16356f..46b7cdd1ac 100644 --- a/server/src/sys/terrain.rs +++ b/server/src/sys/terrain.rs @@ -3,8 +3,7 @@ use crate::{chunk_generator::ChunkGenerator, client::Client, Tick}; use common::{ comp::{ self, bird_medium, - item::{self}, - Alignment, CharacterAbility, ItemConfig, Player, Pos, + Alignment, CharacterAbility, Player, Pos, }, event::{EventBus, ServerEvent}, generation::get_npc_name, @@ -124,120 +123,7 @@ impl<'a> System<'a> for Sys { // let damage = stats.level.level() as i32; TODO: Make NPC base damage // non-linearly depend on their level - let active_item = if let Some(item::ItemKind::Tool(tool)) = - main_tool.as_ref().map(|i| i.kind()) - { - let mut abilities = tool.get_abilities(); - let mut ability_drain = abilities.drain(..); - - main_tool.map(|item| comp::ItemConfig { - item, - ability1: ability_drain.next(), - ability2: ability_drain.next(), - ability3: ability_drain.next(), - block_ability: None, - dodge_ability: Some(comp::CharacterAbility::Roll), - }) - } else { - Some(ItemConfig { - // We need the empty item so npcs can attack - item: comp::Item::new_from_asset_expect("common.items.weapons.empty.empty"), - ability1: Some(CharacterAbility::BasicMelee { - energy_cost: 0, - buildup_duration: Duration::from_millis(0), - recover_duration: Duration::from_millis(400), - base_healthchange: -40, - knockback: 0.0, - range: 3.5, - max_angle: 15.0, - }), - ability2: None, - ability3: None, - block_ability: None, - dodge_ability: None, - }) - }; - - let mut loadout = match alignment { - comp::Alignment::Npc => comp::Loadout { - active_item, - second_item: None, - shoulder: None, - chest: Some(comp::Item::new_from_asset_expect( - match rand::thread_rng().gen_range(0, 10) { - 0 => "common.items.npc_armor.chest.worker_green_0", - 1 => "common.items.npc_armor.chest.worker_green_1", - 2 => "common.items.npc_armor.chest.worker_red_0", - 3 => "common.items.npc_armor.chest.worker_red_1", - 4 => "common.items.npc_armor.chest.worker_purple_0", - 5 => "common.items.npc_armor.chest.worker_purple_1", - 6 => "common.items.npc_armor.chest.worker_yellow_0", - 7 => "common.items.npc_armor.chest.worker_yellow_1", - 8 => "common.items.npc_armor.chest.worker_orange_0", - _ => "common.items.npc_armor.chest.worker_orange_1", - }, - )), - belt: Some(comp::Item::new_from_asset_expect( - "common.items.armor.belt.leather_0", - )), - hand: None, - pants: Some(comp::Item::new_from_asset_expect( - "common.items.armor.pants.worker_blue_0", - )), - foot: Some(comp::Item::new_from_asset_expect( - match rand::thread_rng().gen_range(0, 2) { - 0 => "common.items.armor.foot.leather_0", - _ => "common.items.armor.starter.sandals_0", - }, - )), - back: None, - ring: None, - neck: None, - lantern: None, - glider: None, - head: None, - tabard: None, - }, - comp::Alignment::Enemy => comp::Loadout { - active_item, - second_item: None, - shoulder: Some(comp::Item::new_from_asset_expect( - "common.items.npc_armor.shoulder.cultist_shoulder_purple", - )), - chest: Some(comp::Item::new_from_asset_expect( - "common.items.npc_armor.chest.cultist_chest_purple", - )), - belt: Some(comp::Item::new_from_asset_expect( - "common.items.npc_armor.belt.cultist_belt", - )), - hand: Some(comp::Item::new_from_asset_expect( - "common.items.npc_armor.hand.cultist_hands_purple", - )), - pants: Some(comp::Item::new_from_asset_expect( - "common.items.npc_armor.pants.cultist_legs_purple", - )), - foot: Some(comp::Item::new_from_asset_expect( - "common.items.npc_armor.foot.cultist_boots", - )), - back: Some(comp::Item::new_from_asset_expect( - "common.items.npc_armor.back.dungeon_purple-0", - )), - ring: None, - neck: None, - lantern: Some(comp::Item::new_from_asset_expect( - "common.items.lantern.black_0", - )), - glider: None, - head: None, - tabard: None, - }, - _ => LoadoutBuilder::animal(entity.body).build(), - }; - - loadout = match body { - comp::Body::Humanoid(_) => loadout, - _ => LoadoutBuilder::animal(entity.body).build(), - }; + let mut loadout = LoadoutBuilder::build_loadout(body, alignment, main_tool).build(); let mut scale = entity.scale;