Maraiah/maraiah/map/plat.rs

76 lines
2.3 KiB
Rust
Raw Normal View History

2019-04-01 00:39:47 -07:00
//! `Platform` type.
2019-06-13 18:09:07 -07:00
use crate::{err::*, fixed::Unit};
2019-04-01 00:39:47 -07:00
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))]
2019-06-21 18:34:10 -07:00
#[derive(Clone, Debug, Eq, PartialEq)]
2019-04-01 00:39:47 -07:00
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