Golem now spawns in dungeon.

This commit is contained in:
Sam 2020-09-18 16:28:21 -05:00
parent 99aba78422
commit e39770d1d9
6 changed files with 52 additions and 58 deletions

View File

@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fireflies - Fireflies
- Fullscreen modes now show two options (exclusive and borderless) - Fullscreen modes now show two options (exclusive and borderless)
- Added banlist and `/ban`, `/unban`, and `/kick` commands for admins - Added banlist and `/ban`, `/unban`, and `/kick` commands for admins
- A new dungeon boss (venture there and discover it yourself)
### Changed ### Changed

View File

@ -357,7 +357,7 @@ impl Tool {
recover_duration: Duration::from_millis(250), recover_duration: Duration::from_millis(250),
knockback: 25.0, knockback: 25.0,
base_healthchange: -200, base_healthchange: -200,
range: 10.0, range: 5.0,
max_angle: 120.0, max_angle: 120.0,
}, },
GroundShockwave { GroundShockwave {

View File

@ -1,9 +1,7 @@
use crate::{ use crate::comp::{
comp::{ golem,
golem, item::{Item, ItemKind},
item::{Item, ItemKind}, Alignment, Body, CharacterAbility, ItemConfig, Loadout,
Alignment, Body, CharacterAbility, ItemConfig, Loadout,
},
}; };
use rand::Rng; use rand::Rng;
use std::time::Duration; use std::time::Duration;
@ -81,38 +79,37 @@ impl LoadoutBuilder {
_ => {}, _ => {},
}; };
let active_item = let active_item = if let Some(ItemKind::Tool(tool)) = main_tool.as_ref().map(|i| i.kind()) {
if let Some(ItemKind::Tool(tool)) = main_tool.as_ref().map(|i| i.kind()) { let mut abilities = tool.get_abilities();
let mut abilities = tool.get_abilities(); let mut ability_drain = abilities.drain(..);
let mut ability_drain = abilities.drain(..);
main_tool.map(|item| ItemConfig { main_tool.map(|item| ItemConfig {
item, item,
ability1: ability_drain.next(), ability1: ability_drain.next(),
ability2: ability_drain.next(), ability2: ability_drain.next(),
ability3: ability_drain.next(), ability3: ability_drain.next(),
block_ability: None, block_ability: None,
dodge_ability: Some(CharacterAbility::Roll), dodge_ability: Some(CharacterAbility::Roll),
}) })
} else { } else {
Some(ItemConfig { Some(ItemConfig {
// We need the empty item so npcs can attack // We need the empty item so npcs can attack
item: Item::new_from_asset_expect("common.items.weapons.empty.empty"), item: Item::new_from_asset_expect("common.items.weapons.empty.empty"),
ability1: Some(CharacterAbility::BasicMelee { ability1: Some(CharacterAbility::BasicMelee {
energy_cost: 0, energy_cost: 0,
buildup_duration: Duration::from_millis(0), buildup_duration: Duration::from_millis(0),
recover_duration: Duration::from_millis(400), recover_duration: Duration::from_millis(400),
base_healthchange: -40, base_healthchange: -40,
knockback: 0.0, knockback: 0.0,
range: 3.5, range: 3.5,
max_angle: 15.0, max_angle: 15.0,
}), }),
ability2: None, ability2: None,
ability3: None, ability3: None,
block_ability: None, block_ability: None,
dodge_ability: None, dodge_ability: None,
}) })
}; };
let loadout = match body { let loadout = match body {
Body::Humanoid(_) => match alignment { Body::Humanoid(_) => match alignment {

View File

@ -1,10 +1,7 @@
use super::SysTimer; use super::SysTimer;
use crate::{chunk_generator::ChunkGenerator, client::Client, Tick}; use crate::{chunk_generator::ChunkGenerator, client::Client, Tick};
use common::{ use common::{
comp::{ comp::{self, bird_medium, Alignment, CharacterAbility, Player, Pos},
self, bird_medium,
Alignment, CharacterAbility, Player, Pos,
},
event::{EventBus, ServerEvent}, event::{EventBus, ServerEvent},
generation::get_npc_name, generation::get_npc_name,
msg::ServerMsg, msg::ServerMsg,

View File

@ -2115,6 +2115,15 @@ impl FigureMgr {
skeleton_attr, skeleton_attr,
) )
}, },
CharacterState::GroundShockwave(_) => {
anim::golem::ShockwaveAnimation::update_skeleton(
&target_base,
(vel.0.magnitude(), time),
state.state_time,
&mut state_animation_rate,
skeleton_attr,
)
},
// TODO! // TODO!
_ => target_base, _ => target_base,
}; };

View File

@ -13,7 +13,6 @@ use common::{
comp::{self}, comp::{self},
generation::{ChunkSupplement, EntityInfo}, generation::{ChunkSupplement, EntityInfo},
lottery::Lottery, lottery::Lottery,
npc,
store::{Id, Store}, store::{Id, Store},
terrain::{Block, BlockKind, Structure, TerrainChunkSize}, terrain::{Block, BlockKind, Structure, TerrainChunkSize},
vol::{BaseVol, ReadVol, RectSizedVol, RectVolSize, Vox, WriteVol}, vol::{BaseVol, ReadVol, RectSizedVol, RectVolSize, Vox, WriteVol},
@ -509,22 +508,13 @@ impl Floor {
); );
let chosen = chosen.choose(); let chosen = chosen.choose();
let entity = EntityInfo::at(tile_wcenter.map(|e| e as f32)) let entity = EntityInfo::at(tile_wcenter.map(|e| e as f32))
.with_scale(4.0) .with_level(rng.gen_range(1, 5))
.with_level(rng.gen_range(75, 100))
.with_alignment(comp::Alignment::Enemy) .with_alignment(comp::Alignment::Enemy)
.with_body(comp::Body::Humanoid(comp::humanoid::Body::random())) .with_body(comp::Body::Golem(comp::golem::Body::random_with(
.with_name(format!( rng,
"Cult Leader {}", &comp::golem::Species::StoneGolem,
npc::get_npc_name(npc::NpcKind::Humanoid) )))
)) .with_name("Stonework Defender".to_string())
.with_main_tool(comp::Item::new_from_asset_expect(
match rng.gen_range(0, 1) {
//Add more possible cult leader npc_weapons here
_ => {
"common.items.npc_weapons.sword.cultist_purp_2h_boss-0"
},
},
))
.with_loot_drop(comp::Item::new_from_asset_expect(chosen)); .with_loot_drop(comp::Item::new_from_asset_expect(chosen));
supplement.add_entity(entity); supplement.add_entity(entity);