Maraiah/maraiah/map/prpx.rs

92 lines
2.8 KiB
Rust

//! `Projectile` type.
use crate::{bin::OptU16, err::*, fixed::{Fixed, Unit}};
use bitflags::bitflags;
use super::damg;
/// Reads a `PRpx` chunk.
pub fn read(b: &[u8]) -> ResultS<(Projectile, usize)>
{
read_data! {
endian: BIG, buf: b, size: 48, start: 0, data {
let collection = OptU16[0];
let shape = u16[2];
let fxt_explode = OptU16[4];
let fxt_exp_media = OptU16[6];
let fxt_trail = OptU16[8];
let tic_trail = u16[10];
let max_trail = OptU16[12];
let typ_media = OptU16[14];
let radius = Unit[16];
let dmg_rad = Unit[18];
let dmg_def = damg::read[20; 12];
let flags = u32[32] flag ProjectileFlags;
let speed = Unit[36];
let range = Unit[38];
let snd_pitch = Fixed[40];
let snd_fly = OptU16[44];
let snd_bounce = OptU16[46];
}
}
Ok((Projectile{collection, shape, fxt_explode, fxt_exp_media, fxt_trail,
tic_trail, max_trail, typ_media, radius, dmg_rad, dmg_def,
flags, speed, range, snd_pitch, snd_fly, snd_bounce}, 48))
}
/// A projectile definition.
#[cfg_attr(feature = "serde_obj", derive(serde::Serialize))]
#[derive(Debug, Eq, PartialEq)]
pub struct Projectile
{
pub collection: OptU16,
pub shape: u16,
pub fxt_explode: OptU16,
pub fxt_exp_media: OptU16,
pub fxt_trail: OptU16,
pub tic_trail: u16,
pub max_trail: OptU16,
pub typ_media: OptU16,
pub radius: Unit,
pub dmg_rad: Unit,
pub dmg_def: damg::Damage,
pub flags: ProjectileFlags,
pub speed: Unit,
pub range: Unit,
pub snd_pitch: Fixed,
pub snd_fly: OptU16,
pub snd_bounce: OptU16,
}
bitflags! {
/// Flags for a projectile.
#[cfg_attr(feature = "serde_obj", derive(serde::Serialize))]
pub struct ProjectileFlags: u32
{
const GUIDED = 1;
const STOP_ON_LOOP = 1 << 1;
const PERSISTENT = 1 << 2;
const ALIEN = 1 << 3;
const GRAVITY = 1 << 4;
const NO_HORZ_ERROR = 1 << 5;
const NO_VERT_ERROR = 1 << 6;
const TOGGLE_PANELS = 1 << 7;
const POS_VERT_ERROR = 1 << 8;
const MELEE = 1 << 9;
const RIPPER = 1 << 10;
const PASS_TRANS_RANDOM = 1 << 11;
const PASS_TRANS_MORE = 1 << 12;
const DOUBLE_GRAVITY = 1 << 13;
const REBOUND_FLOOR = 1 << 14;
const THROUGH_MEDIA = 1 << 15;
const BECOME_ITEM = 1 << 16;
const BLOODY = 1 << 17;
const WANDER_HORZ = 1 << 18;
const USE_LOW_GRAV = 1 << 19;
const PASS_MEDIA = 1 << 20;
}
}
// EOF