Maraiah/source/marathon/map/damg.rs

111 lines
3.0 KiB
Rust

//! `Damage` type.
use crate::durandal::{err::*, fixed::Fixed};
use bitflags::bitflags;
use std::convert::TryFrom;
/// Reads a `Damage` object.
pub fn read(b: &[u8]) -> ResultS<Damage>
{
read_data! {
endian: BIG, buf: b, size: 12, start: 0, data {
let dtype = u16[0] enum DamageType;
let flags = u16[2] flag DamageFlags;
let dmg_base = u16[4];
let dmg_rand = u16[6];
let scale = Fixed[8];
}
}
Ok(Damage{dtype, flags, dmg_base, dmg_rand, scale})
}
/// A damage definition.
#[cfg_attr(feature = "serde_obj", derive(serde::Serialize))]
#[derive(Debug, Eq, PartialEq)]
pub struct Damage
{
pub dtype: DamageType,
pub flags: DamageFlags,
pub dmg_base: u16,
pub dmg_rand: u16,
pub scale: Fixed,
}
bitflags! {
/// The composite type of damage taken by something.
#[cfg_attr(feature = "serde_obj", derive(serde::Serialize))]
pub struct DamageTypeFlags: u32
{
const EXPLOSION = 1;
const ELECTRICAL_STAFF = 1 << 1;
const PROJECTILE = 1 << 2;
const ABSORBED = 1 << 3;
const FLAME = 1 << 4;
const HOUND_CLAWS = 1 << 5;
const ALIEN_PROJECTILE = 1 << 6;
const HULK_SLAP = 1 << 7;
const COMPILER_BOLT = 1 << 8;
const FUSION_BOLT = 1 << 9;
const HUNTER_BOLT = 1 << 10;
const FIST = 1 << 11;
const TELEPORTER = 1 << 12;
const DEFENDER = 1 << 13;
const YETI_CLAWS = 1 << 14;
const YETI_PROJECTILE = 1 << 15;
const CRUSHING = 1 << 16;
const LAVA = 1 << 17;
const SUFFOCATION = 1 << 18;
const GOO = 1 << 19;
const ENERGY_DRAIN = 1 << 20;
const OXYGEN_DRAIN = 1 << 21;
const HUMMER_BOLT = 1 << 22;
const SHOTGUN_PROJECTILE = 1 << 23;
}
}
bitflags! {
/// Flags for `Damage`.
#[cfg_attr(feature = "serde_obj", derive(serde::Serialize))]
pub struct DamageFlags: u16
{
const ALIEN = 1;
}
}
c_enum! {
/// A named type of damage taken by something.
#[cfg_attr(feature = "serde_obj", derive(serde::Serialize))]
#[derive(Debug)]
pub enum DamageType: u16
{
Explosion = 0,
ElectricalStaff = 1,
Projectile = 2,
Absorbed = 3,
Flame = 4,
HoundClaws = 5,
AlienProjectile = 6,
HulkSlap = 7,
CompilerBolt = 8,
FusionBolt = 9,
HunterBolt = 10,
Fist = 11,
Teleporter = 12,
Defender = 13,
YetiClaws = 14,
YetiProjectile = 15,
Crushing = 16,
Lava = 17,
Suffocation = 18,
Goo = 19,
EnergyDrain = 20,
OxygenDrain = 21,
HummerBolt = 22,
ShotgunProjectile = 23,
None = 0xFFFF,
}
}
// EOF