Extract rule stuffs to module
This commit is contained in:
parent
af6fdb085b
commit
82a48e8f23
|
@ -1,4 +1,4 @@
|
|||
use std::collections::HashMap;
|
||||
mod rules;
|
||||
|
||||
use bevy::{
|
||||
app::{Plugin, Startup},
|
||||
|
@ -17,6 +17,8 @@ use rand::Rng;
|
|||
|
||||
use crate::util::DirtyRect;
|
||||
|
||||
use self::rules::{to_rule_state, FallingSandRules};
|
||||
|
||||
pub struct FallingSandPlugin;
|
||||
|
||||
impl Plugin for FallingSandPlugin {
|
||||
|
@ -239,74 +241,3 @@ impl From<u32> for Element {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn gen_rule(
|
||||
input: (Element, Element, Element, Element),
|
||||
output: (Element, Element, Element, Element),
|
||||
) -> (u32, u32) {
|
||||
(to_rule_state(input), to_rule_state(output))
|
||||
}
|
||||
|
||||
fn to_rule_state(input: (Element, Element, Element, Element)) -> u32 {
|
||||
((input.0 as u32) << 24) + ((input.1 as u32) << 16) + ((input.2 as u32) << 8) + input.3 as u32
|
||||
}
|
||||
|
||||
#[derive(Resource)]
|
||||
pub struct FallingSandRules {
|
||||
rules: HashMap<u32, u32>,
|
||||
}
|
||||
|
||||
impl Default for FallingSandRules {
|
||||
fn default() -> Self {
|
||||
// Pre-computed air-sand rules
|
||||
Self {
|
||||
rules: HashMap::from([
|
||||
gen_rule(
|
||||
(Element::Air, Element::Sand, Element::Air, Element::Air),
|
||||
(Element::Air, Element::Air, Element::Air, Element::Sand),
|
||||
),
|
||||
gen_rule(
|
||||
(Element::Air, Element::Sand, Element::Air, Element::Sand),
|
||||
(Element::Air, Element::Air, Element::Sand, Element::Sand),
|
||||
),
|
||||
gen_rule(
|
||||
(Element::Air, Element::Sand, Element::Sand, Element::Air),
|
||||
(Element::Air, Element::Air, Element::Sand, Element::Sand),
|
||||
),
|
||||
gen_rule(
|
||||
(Element::Sand, Element::Air, Element::Air, Element::Air),
|
||||
(Element::Air, Element::Air, Element::Sand, Element::Air),
|
||||
),
|
||||
gen_rule(
|
||||
(Element::Sand, Element::Air, Element::Air, Element::Sand),
|
||||
(Element::Air, Element::Air, Element::Sand, Element::Sand),
|
||||
),
|
||||
gen_rule(
|
||||
(Element::Sand, Element::Air, Element::Sand, Element::Air),
|
||||
(Element::Air, Element::Air, Element::Sand, Element::Sand),
|
||||
),
|
||||
gen_rule(
|
||||
(Element::Sand, Element::Sand, Element::Air, Element::Air),
|
||||
(Element::Air, Element::Air, Element::Sand, Element::Sand),
|
||||
),
|
||||
gen_rule(
|
||||
(Element::Sand, Element::Sand, Element::Air, Element::Sand),
|
||||
(Element::Air, Element::Sand, Element::Sand, Element::Sand),
|
||||
),
|
||||
gen_rule(
|
||||
(Element::Sand, Element::Sand, Element::Sand, Element::Air),
|
||||
(Element::Sand, Element::Air, Element::Sand, Element::Sand),
|
||||
),
|
||||
]),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl FallingSandRules {
|
||||
pub fn get_result(&self, input_rule: u32) -> u32 {
|
||||
match self.rules.get(&input_rule) {
|
||||
Some(&result) => result,
|
||||
None => input_rule,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,76 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
use bevy::ecs::system::Resource;
|
||||
|
||||
use super::Element;
|
||||
|
||||
#[derive(Resource)]
|
||||
pub struct FallingSandRules {
|
||||
rules: HashMap<u32, u32>,
|
||||
}
|
||||
|
||||
impl Default for FallingSandRules {
|
||||
fn default() -> Self {
|
||||
// Pre-computed air-sand rules
|
||||
Self {
|
||||
rules: HashMap::from([
|
||||
gen_rule(
|
||||
(Element::Air, Element::Sand, Element::Air, Element::Air),
|
||||
(Element::Air, Element::Air, Element::Air, Element::Sand),
|
||||
),
|
||||
gen_rule(
|
||||
(Element::Air, Element::Sand, Element::Air, Element::Sand),
|
||||
(Element::Air, Element::Air, Element::Sand, Element::Sand),
|
||||
),
|
||||
gen_rule(
|
||||
(Element::Air, Element::Sand, Element::Sand, Element::Air),
|
||||
(Element::Air, Element::Air, Element::Sand, Element::Sand),
|
||||
),
|
||||
gen_rule(
|
||||
(Element::Sand, Element::Air, Element::Air, Element::Air),
|
||||
(Element::Air, Element::Air, Element::Sand, Element::Air),
|
||||
),
|
||||
gen_rule(
|
||||
(Element::Sand, Element::Air, Element::Air, Element::Sand),
|
||||
(Element::Air, Element::Air, Element::Sand, Element::Sand),
|
||||
),
|
||||
gen_rule(
|
||||
(Element::Sand, Element::Air, Element::Sand, Element::Air),
|
||||
(Element::Air, Element::Air, Element::Sand, Element::Sand),
|
||||
),
|
||||
gen_rule(
|
||||
(Element::Sand, Element::Sand, Element::Air, Element::Air),
|
||||
(Element::Air, Element::Air, Element::Sand, Element::Sand),
|
||||
),
|
||||
gen_rule(
|
||||
(Element::Sand, Element::Sand, Element::Air, Element::Sand),
|
||||
(Element::Air, Element::Sand, Element::Sand, Element::Sand),
|
||||
),
|
||||
gen_rule(
|
||||
(Element::Sand, Element::Sand, Element::Sand, Element::Air),
|
||||
(Element::Sand, Element::Air, Element::Sand, Element::Sand),
|
||||
),
|
||||
]),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl FallingSandRules {
|
||||
pub fn get_result(&self, input_rule: u32) -> u32 {
|
||||
match self.rules.get(&input_rule) {
|
||||
Some(&result) => result,
|
||||
None => input_rule,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn to_rule_state(input: (Element, Element, Element, Element)) -> u32 {
|
||||
((input.0 as u32) << 24) + ((input.1 as u32) << 16) + ((input.2 as u32) << 8) + input.3 as u32
|
||||
}
|
||||
|
||||
fn gen_rule(
|
||||
input: (Element, Element, Element, Element),
|
||||
output: (Element, Element, Element, Element),
|
||||
) -> (u32, u32) {
|
||||
(to_rule_state(input), to_rule_state(output))
|
||||
}
|
Loading…
Reference in New Issue