engine/gavania-core/src/game/content/abilities/selfcast.rs

64 lines
1.6 KiB
Rust
Raw Normal View History

2024-08-23 11:22:09 +00:00
#![allow(unused)]
use anyhow::Result;
use engine::prelude::*;
2024-08-24 13:36:58 +00:00
use rpg_components::{
components::{abilityloader::AbilityLoader, statistics::Statistics},
items::ability_book::AbilityBook,
};
2024-08-23 11:22:09 +00:00
use crate::game::{
content::prelude::*,
game::{Game, GameHandle},
};
use cgmath::{Deg, Vector2};
use std::sync::{Arc, Mutex, MutexGuard};
use super::particle_spawn::ParticleSpawn;
2024-08-24 13:36:58 +00:00
pub struct SelfCast;
2024-08-23 11:22:09 +00:00
impl SelfCast {
2024-08-24 13:36:58 +00:00
pub fn execute(
ability: &AbilityLoader,
2024-08-23 11:22:09 +00:00
owner: Entity,
owner_components: &mut MultiMut<'_>,
direction: Vector2<f32>,
book: &AbilityBook,
game_handle: &GameHandle,
entities: &mut Entities<'_>,
events: &mut ContentEvents<'_>,
) -> Result<()> {
let location = owner_components.get::<Location>()?;
let owner_stats = owner_components.get::<Statistics>()?;
let hit_box = owner_components.get::<HitBox>()?;
2024-08-24 13:36:58 +00:00
let mut base_damage = ability.damage(book.level(), book.addons(), owner_stats);
2024-08-23 11:22:09 +00:00
2024-08-24 13:36:58 +00:00
let range = ability.settings.parameter.radius * book.addons().size();
2024-08-23 11:22:09 +00:00
let (mut entity_object, particle_spawn) = AreaOfEffect::new(
direction,
location.position(),
2024-08-24 13:36:58 +00:00
Deg(ability.settings.parameter.arc),
2024-08-23 11:22:09 +00:00
range,
hit_box.height() * 0.75,
owner,
2024-08-24 13:36:58 +00:00
ability.clone(),
2024-08-23 11:22:09 +00:00
base_damage,
game_handle.clone(),
)?;
Faction::copy(owner_components, &mut entity_object);
entities.add_entity(entity_object)?;
if let Some(particle_spawn) = particle_spawn {
events.write_event(particle_spawn);
}
Ok(())
}
}