medi loader

png-branch
an 2019-02-20 15:24:47 -05:00
parent fd2b589049
commit c4e9f1d698
3 changed files with 112 additions and 3 deletions

View File

@ -381,12 +381,13 @@ main menu, and physics files. Here is a listing of all chunks used within them:
| `påth` | Not analyzed (å is $8C) (guardpaths) |
| `plac` | Not analyzed (item placement) |
| `door` | No test data (extra door data) |
| `PLAT` | No test data (platform static data) |
| `medi` | Media (liquids) |
| `plat` | No test data (platform data) |
| `PLAT` | Not analyzed (saved platform data) |
| `medi` | Array of Media Data |
| `ambi` | Array of Ambient Sounds |
| `bonk` | Array of Random Sounds |
| `term` | Array of Terminals |
| `iidx` | Not analyzed (map indices) |
| `iidx` | Not analyzed (saved map indices) |
| `ShPa` | Not analyzed (shapes) |
| `MMLS` | Not analyzed (MML scripts) |
| `LUAS` | Not analyzed (Lua scripts) |
@ -792,6 +793,34 @@ Random Sound is 32 bytes.
- `Flags` is a Random Sound Flags bit field.
- `Phase` must be `65535`.
### Media Data ###
Media Data is 32 bytes. "Media" refers to liquids, presumably because of the
plural of the definition of "medium," a "middle place or degree," as in, it's a
part of the map in the middle of a wall.
| Name | Type | Offset |
| ---- | ---- | ------ |
| `Type` | `u16` | `0` |
| `Flags` | `u16` | `2` |
| `Control` | `u16` | `4` |
| `Direction` | `angle` | `6` |
| `Magnitude` | `unit` | `8` |
| `Low` | `unit` | `10` |
| `High` | `unit` | `12` |
| `Origin` | `struct` | `14` |
| `Height` | `unit` | `18` |
| `Minimum` | `fixed` | `20` |
| `Texture` | `u16` | `24` |
| `XferMode` | `u16` | `26` |
- `Type` is a Media Type enumeration.
- `Flags` is a Media Flags bit field.
- `Control` is the index of a light which is used to control the height of this
media.
- `Texture` is an Object ID representing the texture index.
- `XferMode` is a Transfer Mode enumeration.
### Static Map Info ###
Static Map Info is 88 bytes.
@ -1545,6 +1574,15 @@ unobstructed.
- `Smooth` does a sine transition in the same fashion as `Linear`.
- `Flicker` flickers between a random smoothed intensity and the final one.
### Media Type ###
| Name | Value |
| ---- | ----- |
| `Water` | `0` |
| `Lava` | `1` |
| `Goo` | `2` |
| `Sewage` | `3` |
# FLAGS #######################################################################
### Endpoint Flags ###
@ -1749,4 +1787,13 @@ gravity.
| ---- | --- |
| `IgnoreDirection` | `0` |
### Media Flags ###
| Name | Bit |
| ---- | --- |
| `SoundObstruct` | `0` |
- `SoundObstruct` means the media makes no sound when under the floor. This is
most sensible for, for instance, lava which can be drained.
<!-- EOF -->

View File

@ -57,6 +57,7 @@ fn dump_chunk(opt: &Options, cid: Ident, cnk: &[u8], eid: u16) -> ResultS<()>
b"OBJS" => make_yaml(opt, &rd_array(cnk, map::read_objs)?)?,
b"ambi" => make_yaml(opt, &rd_array(cnk, map::read_ambi)?)?,
b"bonk" => make_yaml(opt, &rd_array(cnk, map::read_bonk)?)?,
b"medi" => make_yaml(opt, &rd_array(cnk, map::read_medi)?)?,
b"term" => make_yaml(opt, &rd_array(cnk, trm::read_term)?)?,
_ => (),
}

View File

@ -255,6 +255,39 @@ pub fn read_bonk(b: &[u8]) -> ResultS<(SoundRand, usize)>
yaw_dta, pit_nrm, pit_dta}, 32))
}
pub fn read_medi(b: &[u8]) -> ResultS<(Media, usize)>
{
read_data! {
32, BE in b =>
mtype = u16[0];
flags = u16[2];
control = u16[4];
dir = u16[6];
mag = u16[8];
hei_lo = u16[10];
hei_hi = u16[12];
orig = read_point[14..18];
hei_nrm = u16[18];
min_lt = u32[20];
texture = u16[24];
xfer = u16[26];
}
let mtype = MediaType::from_repr(mtype)?;
let xfer = TransferMode::from_repr(xfer)?;
let texture = ObjID::from_repr(texture);
let min_lt = Fixed::from_bits(min_lt);
let hei_nrm = Unit::from_bits(hei_nrm);
let hei_hi = Unit::from_bits(hei_hi);
let hei_lo = Unit::from_bits(hei_lo);
let dir = Angle::from_bits(dir);
let mag = Unit::from_bits(mag);
let flr_obs = flags != 0;
Ok((Media{mtype, flr_obs, control, dir, mag, hei_lo, hei_hi, orig, hei_nrm,
min_lt, texture, xfer}, 32))
}
#[derive(Clone, PartialEq, Serialize)]
pub struct Point
{
@ -380,6 +413,23 @@ pub struct SoundRand
pub pit_dta: Fixed,
}
#[derive(Debug, Serialize)]
pub struct Media
{
pub mtype: MediaType,
pub flr_obs: bool,
pub control: u16,
pub dir: Angle,
pub mag: Unit,
pub hei_lo: Unit,
pub hei_hi: Unit,
pub orig: Point,
pub hei_nrm: Unit,
pub min_lt: Fixed,
pub texture: ObjID,
pub xfer: TransferMode,
}
#[derive(Debug, PartialEq, Serialize)]
pub struct Minf
{
@ -557,6 +607,17 @@ c_enum! {
}
}
c_enum! {
#[derive(Debug, Serialize)]
pub enum MediaType: u16
{
0 => Water,
1 => Lava,
2 => Goo,
3 => Sewage,
}
}
impl fmt::Debug for Point
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result