76 lines
2.3 KiB
Rust
76 lines
2.3 KiB
Rust
//! `Platform` type.
|
|
|
|
use crate::{err::*, fixed::Unit};
|
|
use bitflags::bitflags;
|
|
|
|
/// Reads a `plat` chunk.
|
|
pub fn read(b: &[u8]) -> ResultS<(Platform, usize)>
|
|
{
|
|
read_data! {
|
|
endian: BIG, buf: b, size: 32, start: 0, data {
|
|
let ptype = u16[0];
|
|
let speed = u16[2];
|
|
let delay = u16[4];
|
|
let hei_max = Unit[6];
|
|
let hei_min = Unit[8];
|
|
let flags = u32[10] flag PlatformFlags;
|
|
let index = u16[14];
|
|
let tag = u16[16];
|
|
}
|
|
}
|
|
|
|
Ok((Platform{ptype, speed, delay, hei_min, hei_max, flags, index, tag}, 32))
|
|
}
|
|
|
|
/// Extra information for polygons with platforms.
|
|
#[cfg_attr(feature = "serde_obj", derive(serde::Serialize))]
|
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
|
pub struct Platform
|
|
{
|
|
pub ptype: u16,
|
|
pub speed: u16,
|
|
pub delay: u16,
|
|
pub hei_min: Unit,
|
|
pub hei_max: Unit,
|
|
pub flags: PlatformFlags,
|
|
pub index: u16,
|
|
pub tag: u16,
|
|
}
|
|
|
|
bitflags! {
|
|
/// Flags for `Platform`.
|
|
#[cfg_attr(feature = "serde_obj", derive(serde::Serialize))]
|
|
pub struct PlatformFlags: u32
|
|
{
|
|
const INIT_ACTIVE = 1;
|
|
const INIT_EXTENDED = 1 << 1;
|
|
const STOP_AT_EACH_LEVEL = 1 << 2;
|
|
const STOP_AT_INIT_LEVEL = 1 << 3;
|
|
const START_ADJ_ON_STOP = 1 << 4;
|
|
const EXTENDS_FLOOR_TO_CEIL = 1 << 5;
|
|
const COMES_FROM_FLOOR = 1 << 6;
|
|
const COMES_FROM_CEIL = 1 << 7;
|
|
const CAUSES_DAMAGE = 1 << 8;
|
|
const NO_ACTIVATE_PARENT = 1 << 9;
|
|
const ACTIVATES_ONCE = 1 << 10;
|
|
const ACTIVATES_LIGHT = 1 << 11;
|
|
const DEACTIVATES_LIGHT = 1 << 12;
|
|
const PLAYER_CONTROLS = 1 << 13;
|
|
const MONSTER_CONTROLS = 1 << 14;
|
|
const REVERSE_ON_OBSTRUCT = 1 << 15;
|
|
const NO_EXT_DEACTIVATION = 1 << 16;
|
|
const USE_POLYGON_HEIGHTS = 1 << 17;
|
|
const DELAYED_ACTIVATION = 1 << 18;
|
|
const START_ADJ_ON_START = 1 << 19;
|
|
const STOP_ADJ_ON_START = 1 << 20;
|
|
const STOP_ADJ_ON_STOP = 1 << 21;
|
|
const SLOW = 1 << 22;
|
|
const START_AT_EACH_LEVEL = 1 << 23;
|
|
const LOCKED = 1 << 24;
|
|
const SECRET = 1 << 25;
|
|
const DOOR = 1 << 26;
|
|
}
|
|
}
|
|
|
|
// EOF
|