mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
77 lines
1.5 KiB
Rust
77 lines
1.5 KiB
Rust
use common::{comp::ProjectileConstructor, terrain::Block};
|
|
use hashbrown::HashMap;
|
|
use specs::{Component, Entity};
|
|
use specs_idvs::IdvStorage;
|
|
use vek::Vec3;
|
|
|
|
pub struct Logic {
|
|
pub kind: LogicKind,
|
|
pub left: OutputFormula,
|
|
pub right: OutputFormula,
|
|
}
|
|
|
|
pub struct WiringElement {
|
|
pub inputs: HashMap<String, f32>,
|
|
pub outputs: HashMap<String, OutputFormula>,
|
|
pub actions: Vec<WiringAction>,
|
|
}
|
|
|
|
pub struct Circuit {
|
|
pub wires: Vec<Wire>,
|
|
}
|
|
|
|
pub enum OutputFormula {
|
|
Constant { value: f32 },
|
|
Input { name: String },
|
|
Logic(Box<Logic>),
|
|
|
|
SineWave { amplitude: f32, frequency: f32 },
|
|
OnCollide { value: f32 },
|
|
OnInteract { value: f32 },
|
|
OnDeath { value: f32, radius: f32 },
|
|
}
|
|
|
|
pub enum LogicKind {
|
|
Min, // acts like And
|
|
Max, // acts like Or
|
|
Sub, // `|x| { 5.0 - x }` acts like Not, depending on reference voltages
|
|
Sum,
|
|
Mul,
|
|
}
|
|
|
|
pub struct WiringAction {
|
|
pub formula: OutputFormula,
|
|
pub threshold: f32,
|
|
pub effects: Vec<WiringActionEffect>,
|
|
}
|
|
|
|
pub enum WiringActionEffect {
|
|
SpawnProjectile {
|
|
constr: ProjectileConstructor,
|
|
},
|
|
SetBlock {
|
|
coords: Vec3<i32>,
|
|
block: Block,
|
|
},
|
|
SetLight {
|
|
r: OutputFormula,
|
|
g: OutputFormula,
|
|
b: OutputFormula,
|
|
},
|
|
}
|
|
|
|
pub struct Wire {
|
|
pub input_field: String,
|
|
pub output_field: String,
|
|
pub input_entity: Entity,
|
|
pub output_entity: Entity,
|
|
}
|
|
|
|
impl Component for WiringElement {
|
|
type Storage = IdvStorage<Self>;
|
|
}
|
|
|
|
impl Component for Circuit {
|
|
type Storage = IdvStorage<Self>;
|
|
}
|