underworld_core 0.6.3

Small library to either play a game or assist in generating rooms
Documentation
use crate::components::{
    fixtures::{Fixture, FixtureView, FixtureViewArgs},
    items::FixtureItemView,
};

pub fn view(fixture: &Fixture, args: &FixtureViewArgs, knows_all: bool) -> FixtureView {
    let items: Vec<FixtureItemView> = fixture
        .items
        .iter()
        .filter_map(|fixture_item| {
            if fixture_item.is_inside && fixture.open {
                Some(FixtureItemView {
                    item: super::item::view(&fixture_item.item, true, knows_all),
                    is_in_hidden_compartment: Some(false),
                    is_in_hidden_compartment_known: true,
                    is_inside: true,
                })
            } else if fixture_item.is_inside && !fixture.open {
                None
            } else if fixture_item.is_in_hidden_compartment && fixture.hidden_compartment_open {
                Some(FixtureItemView {
                    item: super::item::view(&fixture_item.item, true, knows_all),
                    is_in_hidden_compartment: Some(true),
                    is_in_hidden_compartment_known: true,
                    is_inside: false,
                })
            } else if fixture_item.is_in_hidden_compartment && !fixture.hidden_compartment_open {
                None
            } else {
                Some(FixtureItemView {
                    item: super::item::view(&fixture_item.item, true, knows_all),
                    is_in_hidden_compartment: Some(false),
                    is_in_hidden_compartment_known: true,
                    is_inside: false,
                })
            }
        })
        .collect();

    let (has_hidden, hidden_compartment_open) = if args.knows_has_hidden_compartment || knows_all {
        (
            fixture.has_hidden_compartment,
            fixture.hidden_compartment_open,
        )
    } else {
        (false, false)
    };

    FixtureView {
        id: fixture.id.to_string(),
        name: fixture.name.clone(),
        fixture_type: fixture.fixture_type,
        material: fixture.material,
        size: fixture.size,
        descriptors: fixture.descriptors.clone(),
        items,
        has_hidden_compartment: has_hidden,
        knows_if_hidden_compartment: args.knows_has_hidden_compartment || knows_all,
        open: fixture.open,
        can_be_opened: fixture.can_be_opened,
        hidden_compartment_open,
    }
}