use std::collections::BTreeMap;
crate::dw_code! {
pub const DW_FLUID_ESCAPES: &str = "DW0800";
}
pub const FLUIDS: [&str; 2] = ["minecraft:water", "minecraft:lava"];
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Wetness {
Dry,
Source,
Flowing(u8),
Held,
}
fn qualify(name: &str) -> String {
if name.contains(':') {
name.to_string()
} else {
format!("minecraft:{name}")
}
}
pub fn is_fluid(name: &str) -> bool {
super::blockshape::is_fluid(name)
}
pub fn is_air(name: &str) -> bool {
super::blockshape::is_air(name)
}
pub fn is_structure_void(name: &str) -> bool {
qualify(name) == "minecraft:structure_void"
}
pub fn wetness(name: &str, properties: &BTreeMap<String, String>) -> Wetness {
if is_fluid(name) {
return match properties.get("level").map(String::as_str) {
None | Some("0") => Wetness::Source,
Some(other) => Wetness::Flowing(other.parse().unwrap_or(u8::MAX)),
};
}
if properties.get("waterlogged").map(String::as_str) == Some("true") {
return Wetness::Held;
}
Wetness::Dry
}
pub fn holds_fluid(name: &str, properties: &BTreeMap<String, String>) -> bool {
let _ = properties;
!is_air(name) && !is_fluid(name)
}
#[cfg(test)]
mod tests {
use super::*;
fn props(pairs: &[(&str, &str)]) -> BTreeMap<String, String> {
pairs
.iter()
.map(|(k, v)| (k.to_string(), v.to_string()))
.collect()
}
#[test]
fn a_source_is_wet_and_a_flow_is_named_by_its_level() {
assert_eq!(
wetness("minecraft:water", &props(&[("level", "0")])),
Wetness::Source
);
assert_eq!(
wetness("minecraft:water", &props(&[("level", "3")])),
Wetness::Flowing(3)
);
assert_eq!(
wetness("minecraft:lava", &props(&[("level", "0")])),
Wetness::Source
);
}
#[test]
fn a_waterlogged_block_is_wet_but_is_not_a_body_that_runs() {
assert_eq!(
wetness(
"minecraft:oak_stairs",
&props(&[("waterlogged", "true"), ("facing", "north")])
),
Wetness::Held
);
assert_eq!(
wetness("minecraft:oak_stairs", &props(&[("waterlogged", "false")])),
Wetness::Dry
);
}
#[test]
fn everything_but_air_and_fluid_holds_a_body_back() {
assert!(holds_fluid(
"minecraft:iron_bars",
&props(&[("waterlogged", "false")])
));
assert!(holds_fluid(
"minecraft:oak_stairs",
&props(&[("waterlogged", "false")])
));
assert!(holds_fluid(
"minecraft:iron_bars",
&props(&[("waterlogged", "true")])
));
assert!(holds_fluid("minecraft:stone", &props(&[])));
assert!(!holds_fluid("minecraft:air", &props(&[])));
assert!(!holds_fluid("minecraft:cave_air", &props(&[])));
assert!(!holds_fluid("minecraft:water", &props(&[("level", "0")])));
assert!(!holds_fluid("minecraft:lava", &props(&[("level", "0")])));
}
}