veloren/common/src/terrain/block.rs

245 lines
6.9 KiB
Rust
Raw Normal View History

use crate::vol::Vox;
use serde_derive::{Deserialize, Serialize};
use std::ops::Deref;
2019-01-23 20:01:58 +00:00
use vek::*;
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)]
#[repr(u8)]
pub enum BlockKind {
Air,
Normal,
Dense,
Water,
2019-08-21 17:22:05 +00:00
LargeCactus,
BarrelCactus,
2019-09-01 19:04:03 +00:00
RoundCactus,
ShortCactus,
MedFlatCactus,
ShortFlatCactus,
2019-08-21 17:22:05 +00:00
BlueFlower,
PinkFlower,
PurpleFlower,
RedFlower,
WhiteFlower,
YellowFlower,
Sunflower,
LongGrass,
2019-08-21 17:22:05 +00:00
MediumGrass,
ShortGrass,
Apple,
2019-09-01 19:04:03 +00:00
Mushroom,
Liana,
2019-09-25 20:22:39 +00:00
Velorite,
VeloriteFrag,
2019-10-09 19:28:05 +00:00
Chest,
Leaves,
2020-01-25 11:14:02 +00:00
Pumpkin,
Welwitch,
LingonBerry,
LeafyPlant,
Fern,
DeadBush,
Blueberry,
2020-04-10 19:08:21 +00:00
Ember,
}
impl BlockKind {
2019-09-26 13:03:41 +00:00
pub fn is_tangible(&self) -> bool {
2019-09-25 14:56:57 +00:00
match self {
BlockKind::Air => false,
kind => !kind.is_fluid(),
}
}
pub fn is_air(&self) -> bool {
match self {
BlockKind::Air => true,
2019-10-04 18:27:12 +00:00
BlockKind::LargeCactus => true,
2019-08-21 17:22:05 +00:00
BlockKind::BarrelCactus => true,
2019-09-01 19:04:03 +00:00
BlockKind::RoundCactus => true,
BlockKind::ShortCactus => true,
BlockKind::MedFlatCactus => true,
BlockKind::ShortFlatCactus => true,
2019-08-21 17:22:05 +00:00
BlockKind::BlueFlower => true,
BlockKind::PinkFlower => true,
BlockKind::PurpleFlower => true,
BlockKind::RedFlower => true,
BlockKind::WhiteFlower => true,
BlockKind::YellowFlower => true,
BlockKind::Sunflower => true,
BlockKind::LongGrass => true,
2019-08-21 17:22:05 +00:00
BlockKind::MediumGrass => true,
BlockKind::ShortGrass => true,
BlockKind::Apple => true,
2019-09-01 19:04:03 +00:00
BlockKind::Mushroom => true,
BlockKind::Liana => true,
2019-09-25 20:22:39 +00:00
BlockKind::Velorite => true,
BlockKind::VeloriteFrag => true,
2019-10-09 19:28:05 +00:00
BlockKind::Chest => true,
2020-01-25 11:14:02 +00:00
BlockKind::Welwitch => true,
BlockKind::LingonBerry => true,
BlockKind::LeafyPlant => true,
BlockKind::Fern => true,
BlockKind::DeadBush => true,
BlockKind::Blueberry => true,
2020-04-10 19:08:21 +00:00
BlockKind::Ember => true,
_ => false,
}
}
pub fn is_fluid(&self) -> bool {
match self {
2020-04-10 19:08:21 +00:00
BlockKind::Water => true,
_ => false,
}
}
pub fn is_opaque(&self) -> bool {
match self {
BlockKind::Air => false,
BlockKind::Water => false,
2019-08-21 17:22:05 +00:00
BlockKind::LargeCactus => false,
BlockKind::BarrelCactus => false,
2019-09-01 19:04:03 +00:00
BlockKind::RoundCactus => false,
BlockKind::ShortCactus => false,
BlockKind::MedFlatCactus => false,
BlockKind::ShortFlatCactus => false,
2019-08-21 17:22:05 +00:00
BlockKind::BlueFlower => false,
BlockKind::PinkFlower => false,
BlockKind::PurpleFlower => false,
BlockKind::RedFlower => false,
BlockKind::WhiteFlower => false,
BlockKind::YellowFlower => false,
BlockKind::Sunflower => false,
BlockKind::LongGrass => false,
2019-08-21 17:22:05 +00:00
BlockKind::MediumGrass => false,
BlockKind::ShortGrass => false,
BlockKind::Apple => false,
2019-09-01 19:04:03 +00:00
BlockKind::Mushroom => false,
BlockKind::Liana => false,
2019-09-25 20:22:39 +00:00
BlockKind::Velorite => false,
BlockKind::VeloriteFrag => false,
2019-10-09 19:28:05 +00:00
BlockKind::Chest => false,
2020-01-25 11:14:02 +00:00
BlockKind::Welwitch => false,
BlockKind::LingonBerry => false,
BlockKind::LeafyPlant => false,
BlockKind::Fern => false,
BlockKind::DeadBush => false,
2020-04-10 19:08:21 +00:00
BlockKind::Blueberry => false,
_ => true,
}
}
pub fn is_solid(&self) -> bool {
match self {
BlockKind::Air => false,
BlockKind::Water => false,
2019-08-21 17:22:05 +00:00
BlockKind::LargeCactus => true,
BlockKind::BarrelCactus => true,
2019-09-01 19:04:03 +00:00
BlockKind::RoundCactus => true,
BlockKind::ShortCactus => true,
BlockKind::MedFlatCactus => true,
BlockKind::ShortFlatCactus => true,
2019-08-21 17:22:05 +00:00
BlockKind::BlueFlower => false,
BlockKind::PinkFlower => false,
BlockKind::PurpleFlower => false,
BlockKind::RedFlower => false,
BlockKind::WhiteFlower => false,
BlockKind::YellowFlower => false,
BlockKind::Sunflower => false,
BlockKind::LongGrass => false,
2019-08-21 17:22:05 +00:00
BlockKind::MediumGrass => false,
BlockKind::ShortGrass => false,
BlockKind::Apple => true,
2019-09-01 19:04:03 +00:00
BlockKind::Mushroom => false,
BlockKind::Liana => false,
2019-10-09 19:28:05 +00:00
BlockKind::Chest => true,
2020-01-25 11:14:02 +00:00
BlockKind::Pumpkin => true,
BlockKind::Welwitch => false,
BlockKind::LingonBerry => false,
BlockKind::LeafyPlant => false,
BlockKind::Fern => false,
BlockKind::DeadBush => false,
BlockKind::Blueberry => false,
2020-04-10 19:08:21 +00:00
BlockKind::Ember => false,
_ => true,
}
}
pub fn is_collectible(&self) -> bool {
match self {
BlockKind::BlueFlower => false,
BlockKind::PinkFlower => false,
BlockKind::PurpleFlower => false,
BlockKind::RedFlower => false,
BlockKind::WhiteFlower => false,
BlockKind::YellowFlower => false,
BlockKind::Sunflower => false,
BlockKind::LongGrass => false,
BlockKind::MediumGrass => false,
BlockKind::ShortGrass => false,
BlockKind::Apple => true,
BlockKind::Mushroom => true,
BlockKind::Velorite => true,
BlockKind::VeloriteFrag => true,
2019-10-09 19:28:05 +00:00
BlockKind::Chest => true,
2020-04-10 19:08:21 +00:00
BlockKind::Pumpkin => true,
_ => false,
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
#[repr(packed)]
2019-01-02 19:22:01 +00:00
pub struct Block {
kind: BlockKind,
2019-01-02 19:22:01 +00:00
color: [u8; 3],
}
2019-01-14 18:49:53 +00:00
2019-01-23 20:01:58 +00:00
impl Block {
pub fn new(kind: BlockKind, color: Rgb<u8>) -> Self {
2019-01-23 20:01:58 +00:00
Self {
kind,
color: color.into_array(),
}
}
pub fn get_color(&self) -> Option<Rgb<u8>> {
if !self.is_air() {
2019-01-23 20:01:58 +00:00
Some(self.color.into())
} else {
None
2019-01-23 20:01:58 +00:00
}
}
2019-05-31 20:37:11 +00:00
pub fn kind(&self) -> BlockKind { self.kind }
}
impl Deref for Block {
type Target = BlockKind;
fn deref(&self) -> &Self::Target { &self.kind }
2019-01-23 20:01:58 +00:00
}
2019-01-14 18:49:53 +00:00
impl Vox for Block {
fn empty() -> Self {
Self {
kind: BlockKind::Air,
2019-01-14 18:49:53 +00:00
color: [0; 3],
}
}
fn is_empty(&self) -> bool { self.is_air() }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn block_size() {
assert_eq!(std::mem::size_of::<BlockKind>(), 1);
assert_eq!(std::mem::size_of::<Block>(), 4);
2019-01-14 18:49:53 +00:00
}
}