Maraiah/src/marathon/map.rs

247 lines
6.1 KiB
Rust
Raw Normal View History

use crate::{durandal::{bin::*, err::*, fixed::*,
2019-02-12 09:53:25 -08:00
text::mac_roman_conv},
2019-02-12 05:33:23 -08:00
marathon::xfer::TransferMode};
2019-02-08 21:53:27 -08:00
use bitflags::bitflags;
use serde::Serialize;
2018-12-13 01:08:02 -08:00
use std::fmt;
2018-12-11 19:59:15 -08:00
pub fn read_minf(b: &[u8]) -> ResultS<Minf>
{
let env_code = c_u16b(b, 0)?;
let physi_id = c_u16b(b, 2)?;
let music_id = c_u16b(b, 4)?;
let msn_flag = c_u16b(b, 6)?;
let env_flag = c_u16b(b, 8)?;
let levelnam = mac_roman_conv(c_data(b, 18..84)?);
let ent_flag = c_u32b(b, 84)?;
let msn_flag = ok!(MsnFlags::from_bits(msn_flag), "bad MsnFlags")?;
let env_flag = ok!(EnvFlags::from_bits(env_flag), "bad EnvFlags")?;
let ent_flag = ok!(EntFlags::from_bits(ent_flag), "bad EntFlags")?;
Ok(Minf{env_code, physi_id, music_id, msn_flag, env_flag, ent_flag,
levelnam})
}
2019-02-18 08:52:18 -08:00
pub fn read_sidetex(b: &[u8]) -> ResultS<SideTex>
{
2019-02-18 08:52:18 -08:00
let offs = read_point(c_data(b, 0..4)?)?;
let tex_id = c_u16b(b, 4)?;
let tex_id = ObjID::from_repr(tex_id);
Ok(SideTex{offs, tex_id})
2018-12-13 01:08:02 -08:00
}
2019-02-18 08:52:18 -08:00
pub fn read_point(b: &[u8]) -> ResultS<Point>
2018-12-13 01:08:02 -08:00
{
2019-02-18 08:52:18 -08:00
let x = c_u16b(b, 0)?;
let y = c_u16b(b, 2)?;
let x = Unit::from_bits(x);
let y = Unit::from_bits(y);
Ok(Point{x, y})
2018-12-13 01:08:02 -08:00
}
2019-02-18 08:52:18 -08:00
pub fn read_epnt(b: &[u8]) -> ResultS<(Point, usize)>
2018-12-13 01:08:02 -08:00
{
2019-02-18 08:52:18 -08:00
Ok((read_point(c_data(b, 6..10)?)?, 16))
}
2018-12-13 01:08:02 -08:00
2019-02-18 08:52:18 -08:00
pub fn read_pnts(b: &[u8]) -> ResultS<(Point, usize)>
{
Ok((read_point(b)?, 4))
2018-12-13 01:08:02 -08:00
}
2019-02-18 08:52:18 -08:00
pub fn read_lins(b: &[u8]) -> ResultS<(Line, usize)>
2018-12-13 01:08:02 -08:00
{
2019-02-18 08:52:18 -08:00
let pnt_beg = c_u16b(b, 0)?;
let pnt_end = c_u16b(b, 2)?;
let flags = c_u16b(b, 4)?;
let length = c_u16b(b, 6)?;
let adj_hi = c_u16b(b, 8)?;
let adj_lo = c_u16b(b, 10)?;
let side_fr = c_u16b(b, 12)?;
let side_bk = c_u16b(b, 14)?;
let poly_fr = c_u16b(b, 16)?;
let poly_bk = c_u16b(b, 18)?;
let flags = ok!(LineFlags::from_bits(flags), "bad LineFlags")?;
let length = Unit::from_bits(length);
let adj_hi = Unit::from_bits(adj_hi);
let adj_lo = Unit::from_bits(adj_lo);
let side_fr = ObjID::from_repr(side_fr);
let side_bk = ObjID::from_repr(side_bk);
let poly_fr = ObjID::from_repr(poly_fr);
let poly_bk = ObjID::from_repr(poly_bk);
Ok((Line{flags, length, adj_hi, adj_lo, pnt_beg, pnt_end, side_fr,
side_bk, poly_fr, poly_bk}, 32))
}
2018-12-13 01:08:02 -08:00
2019-02-18 08:52:18 -08:00
pub fn read_sids(b: &[u8]) -> ResultS<(Side, usize)>
{
let stype = c_u16b(b, 0)?;
let flags = c_u16b(b, 2)?;
let tex_pri = read_sidetex(c_data(b, 4..10)?)?;
let tex_sec = read_sidetex(c_data(b, 10..16)?)?;
let tex_tra = read_sidetex(c_data(b, 16..22)?)?;
let ex_tleft = read_point(c_data(b, 22..26)?)?;
let ex_trigh = read_point(c_data(b, 26..30)?)?;
let ex_bleft = read_point(c_data(b, 30..34)?)?;
let ex_brigh = read_point(c_data(b, 34..38)?)?;
let paneltyp = c_u16b(b, 38)?;
let paneldat = c_i16b(b, 40)?;
let xfer_pri = c_u16b(b, 42)?;
let xfer_sec = c_u16b(b, 44)?;
let xfer_tra = c_u16b(b, 46)?;
let shade = c_u32b(b, 48)?;
let flags = ok!(SideFlags::from_bits(flags), "bad SideFlags")?;
let xfer_pri = TransferMode::from_repr(xfer_pri)?;
let xfer_sec = TransferMode::from_repr(xfer_sec)?;
let xfer_tra = TransferMode::from_repr(xfer_tra)?;
let shade = Fixed::from_bits(shade);
Ok((Side{stype, flags, tex_pri, tex_sec, tex_tra, ex_tleft, ex_trigh,
ex_bleft, ex_brigh, paneltyp, paneldat, xfer_pri, xfer_sec,
xfer_tra, shade}, 64))
2018-12-13 01:08:02 -08:00
}
2018-12-11 19:59:15 -08:00
#[derive(Serialize)]
2018-12-13 01:08:02 -08:00
pub struct Point
{
x: Unit,
y: Unit,
}
#[derive(Debug, Serialize)]
2019-02-18 08:52:18 -08:00
pub struct Line
2018-12-13 01:08:02 -08:00
{
2019-02-18 08:52:18 -08:00
flags: LineFlags,
length: Unit,
2019-02-08 21:53:27 -08:00
adj_hi: Unit,
adj_lo: Unit,
2019-02-18 08:52:18 -08:00
pnt_beg: u16,
pnt_end: u16,
side_fr: ObjID,
side_bk: ObjID,
poly_fr: ObjID,
poly_bk: ObjID,
2018-12-13 01:08:02 -08:00
}
#[derive(Debug, Serialize)]
2018-12-13 01:08:02 -08:00
pub struct SideTex
{
2019-02-08 21:53:27 -08:00
offs: Point,
2019-02-09 11:01:35 -08:00
tex_id: ObjID,
2018-12-13 01:08:02 -08:00
}
#[derive(Debug, Serialize)]
2018-12-13 01:08:02 -08:00
pub struct Side
{
2019-02-08 21:53:27 -08:00
stype: u16,
flags: SideFlags,
tex_pri: SideTex,
tex_sec: SideTex,
tex_tra: SideTex,
2018-12-13 01:08:02 -08:00
ex_tleft: Point,
ex_trigh: Point,
ex_bleft: Point,
ex_brigh: Point,
2019-02-05 01:28:29 -08:00
paneltyp: u16,
2018-12-13 01:08:02 -08:00
paneldat: i16,
2019-02-12 05:33:23 -08:00
xfer_pri: TransferMode,
xfer_sec: TransferMode,
xfer_tra: TransferMode,
2019-02-16 10:08:50 -08:00
shade: Fixed,
2018-12-13 01:08:02 -08:00
}
#[derive(Debug, Serialize)]
2018-12-11 19:59:15 -08:00
pub struct Minf
{
env_code: u16,
physi_id: u16,
music_id: u16,
2018-12-13 01:08:02 -08:00
msn_flag: MsnFlags,
env_flag: EnvFlags,
ent_flag: EntFlags,
2018-12-11 19:59:15 -08:00
levelnam: String,
}
2018-12-13 01:08:02 -08:00
bitflags! {
#[derive(Serialize)]
2018-12-13 01:08:02 -08:00
pub struct LineFlags: u16
{
const TransSide = 1 << 9;
const ElevVar = 1 << 10;
const Elevation = 1 << 11;
const Landscape = 1 << 12;
const Transparent = 1 << 13;
const Solid = 1 << 14;
2018-12-13 01:08:02 -08:00
}
}
bitflags! {
#[derive(Serialize)]
2018-12-13 01:08:02 -08:00
pub struct SideFlags: u16
{
const Status = 1;
const Panel = 1 << 1;
const Repair = 1 << 2;
const ItemUse = 1 << 3;
const Lighted = 1 << 4;
const CanDestroy = 1 << 5;
const HitOnly = 1 << 6;
const ItemOpt = 1 << 7;
2018-12-13 01:08:02 -08:00
}
}
bitflags! {
#[derive(Serialize)]
2018-12-13 01:08:02 -08:00
pub struct EnvFlags: u16
{
const Vacuum = 1;
const Magnetic = 1 << 1;
const Rebellion = 1 << 2;
const LowGrav = 1 << 3;
const M1Glue = 1 << 4;
const LavaFloor = 1 << 5;
const Rebellion2 = 1 << 6;
const Music = 1 << 7;
const TermPause = 1 << 8;
const M1Monster = 1 << 9;
const M1Weps = 1 << 10;
const NetPlay = 1 << 13;
const Solo = 1 << 14;
2018-12-13 01:08:02 -08:00
}
}
bitflags! {
#[derive(Serialize)]
2018-12-13 01:08:02 -08:00
pub struct EntFlags: u32
{
const Solo = 1;
const CoOp = 1 << 1;
const Carnage = 1 << 2;
const KTMWTB = 1 << 3;
const KOTH = 1 << 4;
const Defense = 1 << 5;
const Rugby = 1 << 6;
const CTF = 1 << 7;
2018-12-13 01:08:02 -08:00
}
}
bitflags! {
#[derive(Serialize)]
2018-12-13 01:08:02 -08:00
pub struct MsnFlags: u16
{
const Extermination = 1;
const Exploration = 1 << 1;
const Retrieval = 1 << 2;
const Repair = 1 << 3;
const Rescue = 1 << 4;
2018-12-13 01:08:02 -08:00
}
}
impl fmt::Debug for Point
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result
2019-02-08 21:53:27 -08:00
{
write!(f, "({}, {})", self.x, self.y)
}
2018-12-13 01:08:02 -08:00
}
2018-12-11 19:59:15 -08:00
// EOF