use super::*;
use crate::physics::classes::{ReplicationClass, SimulationMode};
use crate::physics::collision::{CollisionMode, CollisionPolicy, CollisionResponse};
use crate::physics::emitter::*;
use crate::physics::promotion::PromotionPolicy;
use crate::physics::render_mode::{RenderMode, RepresentationMode};
use crate::physics::render_policy::RenderPolicy;
use crate::physics::semantic_binding::SemanticBinding;
fn base_entry(id: &str, name: &str) -> PresetCatalogEntry {
PresetCatalogEntry {
id: id.into(),
name: name.into(),
family: PresetFamily::Combat,
authority: AuthorityProfile::EventReconstructable,
semantics: SemanticBinding::default(),
shape: SpawnShape::Point,
spawn: SpawnPolicy {
mode: SpawnMode::Burst,
rate_per_sec: 0.0,
burst_count: 30,
max_live: 100,
warmup_seconds: 0.0,
looped: false,
seed: 0,
density_scale_lod: false,
},
initialize: InitPolicy::default(),
simulate: SimPolicy {
mode: SimulationMode::Full,
gravity: [0.0, -9.81, 0.0],
drag: 0.05,
damping: 0.01,
noise: None,
forces: vec![],
lifetime: LifetimePolicy {
seconds: 1.5,
random_range: None,
},
behaviors: vec![],
},
collision: CollisionPolicy {
mode: CollisionMode::None,
..CollisionPolicy::default()
},
render: RenderPolicy {
mode: RenderMode::Billboard,
..RenderPolicy::default()
},
promotion: PromotionPolicy::default(),
budgets: BudgetPolicy {
max_gpu_particles: 500,
importance: "Normal".into(),
offscreen_mode: SimulationMode::Culled,
},
replication: ReplicationPolicy {
class: ReplicationClass::EventOnly,
},
supported_views: vec![RepresentationMode::World3D, RepresentationMode::Sprite2D],
tags: vec!["combat".into()],
}
}
pub fn catalog() -> Vec<PresetCatalogEntry> {
vec![
{
let mut e = base_entry("combat_muzzle_flash", "Muzzle Flash");
e.spawn.burst_count = 20;
e.simulate.lifetime.seconds = 0.15;
e.render.mode = RenderMode::Billboard;
e.tags.push("flash".into());
e
},
{
let mut e = base_entry("combat_tracer_round", "Tracer Round");
e.render.mode = RenderMode::StretchedBillboard;
e.render.velocity_alignment = true;
e.simulate.lifetime.seconds = 0.5;
e.simulate.gravity = [0.0, 0.0, 0.0];
e.tags.push("projectile".into());
e
},
{
let mut e = base_entry("combat_bullet_impact", "Bullet Impact");
e.spawn.burst_count = 15;
e.simulate.lifetime.seconds = 0.8;
e.collision.mode = CollisionMode::Plane;
e.collision.response = CollisionResponse::Bounce;
e.tags.push("impact".into());
e
},
{
let mut e = base_entry("combat_shell_casing", "Shell Casing");
e.spawn.burst_count = 1;
e.render.mode = RenderMode::MeshInstance;
e.render.lit = true;
e.collision.mode = CollisionMode::Plane;
e.collision.response = CollisionResponse::Bounce;
e.simulate.lifetime.seconds = 3.0;
e.tags.push("debris".into());
e
},
{
let mut e = base_entry("combat_blood_spray", "Blood Spray");
e.spawn.burst_count = 40;
e.simulate.lifetime.seconds = 1.0;
e.initialize.color = [0.8, 0.05, 0.05, 1.0];
e.semantics.trait_tags = vec!["isOrganic".into()];
e.tags.push("blood".into());
e
},
{
let mut e = base_entry("combat_shield_hit", "Shield Hit");
e.spawn.burst_count = 25;
e.simulate.lifetime.seconds = 0.4;
e.simulate.gravity = [0.0, 0.0, 0.0];
e.initialize.color = [0.3, 0.6, 1.0, 0.8];
e.tags.push("shield".into());
e
},
{
let mut e = base_entry("combat_shield_burst", "Shield Burst");
e.spawn.burst_count = 60;
e.simulate.lifetime.seconds = 0.6;
e.simulate.gravity = [0.0, 0.0, 0.0];
e.shape = SpawnShape::Sphere { radius: 0.5 };
e.initialize.color = [0.4, 0.7, 1.0, 0.9];
e.tags.push("shield".into());
e
},
{
let mut e = base_entry("combat_sword_trail", "Sword Trail");
e.spawn.mode = SpawnMode::Continuous;
e.spawn.rate_per_sec = 60.0;
e.render.mode = RenderMode::Ribbon;
e.simulate.lifetime.seconds = 0.3;
e.simulate.gravity = [0.0, 0.0, 0.0];
e.tags.push("trail".into());
e
},
{
let mut e = base_entry("combat_arrow_trail", "Arrow Trail");
e.spawn.mode = SpawnMode::Continuous;
e.spawn.rate_per_sec = 30.0;
e.render.mode = RenderMode::Ribbon;
e.simulate.lifetime.seconds = 0.5;
e.simulate.gravity = [0.0, 0.0, 0.0];
e.tags.push("trail".into());
e
},
{
let mut e = base_entry("combat_spell_cast", "Spell Cast");
e.spawn.burst_count = 50;
e.shape = SpawnShape::Sphere { radius: 0.3 };
e.simulate.gravity = [0.0, 0.0, 0.0];
e.simulate.lifetime.seconds = 1.0;
e.initialize.color = [0.6, 0.2, 1.0, 1.0];
e.tags.push("magic".into());
e
},
{
let mut e = base_entry("combat_spell_impact", "Spell Impact");
e.spawn.burst_count = 40;
e.shape = SpawnShape::Sphere { radius: 0.5 };
e.simulate.lifetime.seconds = 0.8;
e.initialize.color = [0.8, 0.3, 1.0, 1.0];
e.tags.push("magic".into());
e
},
{
let mut e = base_entry("combat_heal_pulse", "Heal Pulse");
e.spawn.burst_count = 30;
e.shape = SpawnShape::Ring {
radius: 1.0,
thickness: 0.2,
};
e.simulate.gravity = [0.0, 0.5, 0.0];
e.simulate.lifetime.seconds = 1.5;
e.initialize.color = [0.2, 1.0, 0.4, 0.8];
e.tags.push("heal".into());
e
},
{
let mut e = base_entry("combat_buff_aura", "Buff Aura");
e.spawn.mode = SpawnMode::Continuous;
e.spawn.rate_per_sec = 15.0;
e.shape = SpawnShape::Ring {
radius: 0.8,
thickness: 0.1,
};
e.simulate.gravity = [0.0, 0.3, 0.0];
e.simulate.lifetime.seconds = 2.0;
e.initialize.color = [1.0, 0.9, 0.3, 0.6];
e.tags.push("aura".into());
e
},
{
let mut e = base_entry("combat_debuff_aura", "Debuff Aura");
e.spawn.mode = SpawnMode::Continuous;
e.spawn.rate_per_sec = 15.0;
e.shape = SpawnShape::Ring {
radius: 0.8,
thickness: 0.1,
};
e.simulate.gravity = [0.0, -0.2, 0.0];
e.simulate.lifetime.seconds = 2.0;
e.initialize.color = [0.6, 0.1, 0.6, 0.6];
e.tags.push("aura".into());
e
},
{
let mut e = base_entry("combat_critical_hit", "Critical Hit");
e.spawn.burst_count = 80;
e.shape = SpawnShape::Sphere { radius: 0.2 };
e.simulate.lifetime.seconds = 0.6;
e.initialize.color = [1.0, 0.8, 0.0, 1.0];
e.tags.push("critical".into());
e
},
{
let mut e = base_entry("combat_death_burst", "Death Burst");
e.spawn.burst_count = 100;
e.shape = SpawnShape::Sphere { radius: 0.5 };
e.simulate.lifetime.seconds = 2.0;
e.tags.push("death".into());
e
},
{
let mut e = base_entry("combat_resurrect", "Resurrect");
e.spawn.burst_count = 60;
e.shape = SpawnShape::Ring {
radius: 1.0,
thickness: 0.3,
};
e.simulate.gravity = [0.0, 1.0, 0.0];
e.simulate.lifetime.seconds = 2.5;
e.initialize.color = [1.0, 1.0, 0.8, 1.0];
e.tags.push("resurrect".into());
e
},
{
let mut e = base_entry("combat_taunt_wave", "Taunt Wave");
e.spawn.burst_count = 20;
e.shape = SpawnShape::Ring {
radius: 2.0,
thickness: 0.5,
};
e.simulate.gravity = [0.0, 0.0, 0.0];
e.simulate.lifetime.seconds = 1.0;
e.initialize.color = [1.0, 0.3, 0.1, 0.7];
e.tags.push("taunt".into());
e
},
{
let mut e = base_entry("combat_block_sparks", "Block Sparks");
e.spawn.burst_count = 15;
e.simulate.lifetime.seconds = 0.4;
e.initialize.color = [1.0, 0.9, 0.5, 1.0];
e.tags.push("block".into());
e
},
{
let mut e = base_entry("combat_parry_flash", "Parry Flash");
e.spawn.burst_count = 10;
e.simulate.lifetime.seconds = 0.2;
e.simulate.gravity = [0.0, 0.0, 0.0];
e.initialize.color = [1.0, 1.0, 1.0, 1.0];
e.tags.push("parry".into());
e
},
{
let mut e = base_entry("combat_dodge_afterimage", "Dodge Afterimage");
e.spawn.mode = SpawnMode::Continuous;
e.spawn.rate_per_sec = 20.0;
e.simulate.gravity = [0.0, 0.0, 0.0];
e.simulate.lifetime.seconds = 0.3;
e.initialize.color = [0.5, 0.5, 0.5, 0.4];
e.tags.push("dodge".into());
e
},
{
let mut e = base_entry("combat_rage_aura", "Rage Aura");
e.spawn.mode = SpawnMode::Continuous;
e.spawn.rate_per_sec = 25.0;
e.shape = SpawnShape::Sphere { radius: 0.6 };
e.simulate.gravity = [0.0, 0.5, 0.0];
e.simulate.lifetime.seconds = 1.0;
e.initialize.color = [1.0, 0.2, 0.0, 0.8];
e.tags.push("rage".into());
e
},
]
}