50 lines
1.2 KiB
Rust
50 lines
1.2 KiB
Rust
//! `Effect` type.
|
|
|
|
use crate::{bin::OptU16, err::*, fixed::Fixed};
|
|
use bitflags::bitflags;
|
|
|
|
/// Reads a `FXpx` chunk.
|
|
pub fn read(b: &[u8]) -> ResultS<(Effect, usize)>
|
|
{
|
|
read_data! {
|
|
endian: BIG, buf: b, size: 14, start: 0, data {
|
|
let collection = u16[0];
|
|
let shape = u16[2];
|
|
let pitch = Fixed[4];
|
|
let flags = u16[8] flag EffectFlags;
|
|
let delay = OptU16[10];
|
|
let delay_snd = OptU16[12];
|
|
}
|
|
}
|
|
|
|
Ok((Effect{collection, shape, pitch, flags, delay, delay_snd}, 14))
|
|
}
|
|
|
|
/// An effect definition.
|
|
#[cfg_attr(feature = "serde_obj", derive(serde::Serialize))]
|
|
#[derive(Debug, Eq, PartialEq)]
|
|
pub struct Effect
|
|
{
|
|
pub collection: u16,
|
|
pub shape: u16,
|
|
pub pitch: Fixed,
|
|
pub flags: EffectFlags,
|
|
pub delay: OptU16,
|
|
pub delay_snd: OptU16,
|
|
}
|
|
|
|
bitflags! {
|
|
/// Flags for an effect.
|
|
#[cfg_attr(feature = "serde_obj", derive(serde::Serialize))]
|
|
pub struct EffectFlags: u16
|
|
{
|
|
const END_ON_LOOP = 1;
|
|
const END_ON_XFER_LOOP = 1 << 1;
|
|
const SOUND_ONLY = 1 << 2;
|
|
const MAKE_TWIN_VISIBLE = 1 << 3;
|
|
const MEDIA_EFFECT = 1 << 4;
|
|
}
|
|
}
|
|
|
|
// EOF
|