cells differencied update
This commit is contained in:
parent
e5b2e51a29
commit
18ca080175
109
src/map.rs
109
src/map.rs
@ -7,7 +7,8 @@ pub struct Plugin;
|
|||||||
impl bevy::prelude::Plugin for Plugin {
|
impl bevy::prelude::Plugin for Plugin {
|
||||||
fn build(&self, app: &mut App) {
|
fn build(&self, app: &mut App) {
|
||||||
app.add_systems(Startup, setup)
|
app.add_systems(Startup, setup)
|
||||||
.add_systems(Update, update)
|
.insert_resource(Time::<Fixed>::from_seconds(0.25)) // Time for a day
|
||||||
|
.add_systems(FixedUpdate, update_cells)
|
||||||
.insert_resource(ClearColor(Color::srgb(0., 0., 1.)));
|
.insert_resource(ClearColor(Color::srgb(0., 0., 1.)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -69,7 +70,7 @@ fn setup(
|
|||||||
} else {
|
} else {
|
||||||
CellKind::Stone
|
CellKind::Stone
|
||||||
};
|
};
|
||||||
cells_data.push(CellData::new(k, i, z as f32, m, 1., vec![]));
|
cells_data.push(CellData::new(k, i, (z*255.) as u8, (m*255.) as u8, 0, vec![]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -95,7 +96,11 @@ fn setup(
|
|||||||
indices.extend_from_slice(&[i as u32, (i+v) as u32, (i+v+1) as u32]);
|
indices.extend_from_slice(&[i as u32, (i+v) as u32, (i+v+1) as u32]);
|
||||||
cd.vertices.extend_from_slice(&[i, i+v, i+v+1]);
|
cd.vertices.extend_from_slice(&[i, i+v, i+v+1]);
|
||||||
}
|
}
|
||||||
cmds.spawn(cd);
|
match cd.kind {
|
||||||
|
CellKind::Forest | CellKind::Grass => cmds.spawn((cd, LastUpdate(0))),
|
||||||
|
_ => cmds.spawn(cd)
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let mesh = Mesh::new(PrimitiveTopology::TriangleList, RenderAssetUsages::default())
|
let mesh = Mesh::new(PrimitiveTopology::TriangleList, RenderAssetUsages::default())
|
||||||
@ -121,24 +126,35 @@ fn setup(
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update(
|
fn update_cells(
|
||||||
mut cells: Query<&mut CellData>,
|
mut cells: Query<(&mut CellData, &mut LastUpdate)>,
|
||||||
mut map: Query<(&Mesh2d, &mut MapColors), With<MapMarker>>,
|
mut map: Query<(&Mesh2d, &mut MapColors), With<MapMarker>>,
|
||||||
mut meshes: ResMut<Assets<Mesh>>
|
mut meshes: ResMut<Assets<Mesh>>
|
||||||
) {
|
) {
|
||||||
let (mesh, mut cols) = map.single_mut();
|
let (mesh, mut cols) = map.single_mut();
|
||||||
if let Some(mesh) = meshes.get_mut(mesh) {
|
if let Some(mesh) = meshes.get_mut(mesh) {
|
||||||
// let cols = mesh.attribute_mut(Mesh::ATTRIBUTE_COLOR).unwrap();
|
// let cols = mesh.attribute_mut(Mesh::ATTRIBUTE_COLOR).unwrap();
|
||||||
for mut cd in cells.iter_mut() {
|
let mut modified = false;
|
||||||
// info!(cd.resource);
|
for (mut cd, mut lu) in cells.iter_mut() {
|
||||||
cd.update();
|
lu.0 += 1;
|
||||||
// dbg!(cd.resource);
|
if lu.0 > match cd.kind {
|
||||||
|
CellKind::Void | CellKind::Sea | CellKind::Beach | CellKind::Dirt | CellKind::Stone => usize::MAX,
|
||||||
|
CellKind::Forest => 100*365/4, // Let's say that a forest takes 100 years to mature
|
||||||
|
CellKind::Grass => 7*7/4 // Let's say that grass takes 7 weaks to reach its max
|
||||||
|
} {
|
||||||
|
lu.0 = 0;
|
||||||
|
cd.resource = (cd.resource + 1).clamp(0, 4);
|
||||||
|
modified = true;
|
||||||
|
}
|
||||||
|
// cd.update();
|
||||||
let col = cd.color();
|
let col = cd.color();
|
||||||
for id in cd.vertices.iter() {
|
for id in cd.vertices.iter() {
|
||||||
cols.0[*id] = col.clone();
|
cols.0[*id] = col.clone();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mesh.insert_attribute(Mesh::ATTRIBUTE_COLOR, cols.0.clone());
|
if modified {
|
||||||
|
mesh.insert_attribute(Mesh::ATTRIBUTE_COLOR, cols.0.clone());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,17 +170,20 @@ pub enum CellKind {
|
|||||||
Grass
|
Grass
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Component)]
|
||||||
|
pub struct LastUpdate(usize);
|
||||||
|
|
||||||
#[derive(Debug, Component)]
|
#[derive(Debug, Component)]
|
||||||
pub struct CellData {
|
pub struct CellData {
|
||||||
pub kind: CellKind,
|
pub kind: CellKind,
|
||||||
pub cid: usize,
|
pub cid: usize,
|
||||||
z: f32,
|
z: u8,
|
||||||
pub moisture: f32,
|
pub moisture: u8,
|
||||||
pub resource: f32, // How much resource there is (between 0 and 1)
|
pub resource: u8, // How much resource there is (between 0 and 4)
|
||||||
pub vertices: Vec<usize>
|
pub vertices: Vec<usize>
|
||||||
}
|
}
|
||||||
impl CellData {
|
impl CellData {
|
||||||
pub fn new(kind: CellKind, cell: usize, z: f32, moisture: f32, resource: f32, vertices: Vec<usize>) -> Self {
|
pub fn new(kind: CellKind, cell: usize, z: u8, moisture: u8, resource: u8, vertices: Vec<usize>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
kind,
|
kind,
|
||||||
cid: cell,
|
cid: cell,
|
||||||
@ -184,40 +203,40 @@ impl CellData {
|
|||||||
CellKind::Void => [0.; 4],
|
CellKind::Void => [0.; 4],
|
||||||
CellKind::Sea => [0., 0., 1., 1.],
|
CellKind::Sea => [0., 0., 1., 1.],
|
||||||
CellKind::Beach => [0.82, 0.84, 0.51, 1.],
|
CellKind::Beach => [0.82, 0.84, 0.51, 1.],
|
||||||
CellKind::Forest => [0., 0.5 - (self.resource*0.4), 0., 1.],
|
CellKind::Forest => [0., 0.5 - (self.resource as f32/4.*0.4), 0., 1.],
|
||||||
CellKind::Dirt => [0.53 - (self.resource*0.4), 0.38-(self.resource*0.4), 0.29-(self.resource*0.4), 1.],
|
CellKind::Dirt => [0.53 - (self.resource as f32/4.*0.4), 0.38-(self.resource as f32/4.*0.4), 0.29-(self.resource as f32/4.*0.4), 1.],
|
||||||
CellKind::Stone => [0.5, 0.5, 0.5, 1.],
|
CellKind::Stone => [0.5, 0.5, 0.5, 1.],
|
||||||
CellKind::Grass => [(136./255.) - (self.resource*0.4), (204./255.) - (self.resource*0.4), (59./255.) - (self.resource*0.4), 1.]
|
CellKind::Grass => [(136./255.) - (self.resource as f32/4.*0.4), (204./255.) - (self.resource as f32/4.*0.4), (59./255.) - (self.resource as f32/4.*0.4), 1.]
|
||||||
}
|
|
||||||
}
|
|
||||||
pub fn update(&mut self) {
|
|
||||||
// How much it get by day
|
|
||||||
let recuperation_rate = match self.kind {
|
|
||||||
CellKind::Void | CellKind::Sea | CellKind::Beach | CellKind::Dirt | CellKind::Stone => 0.,
|
|
||||||
CellKind::Forest => 1. / (100. * 365.25), // Let's say that a forest takes 100 years to mature
|
|
||||||
CellKind::Grass => 1. / (7. * 7.) // Let's say that grass takes 7 weaks to reach its max
|
|
||||||
};
|
|
||||||
self.resource = (self.resource + recuperation_rate).clamp(0., 1.);
|
|
||||||
}
|
|
||||||
pub fn set_resource(&mut self, val: f32, t: usize) {
|
|
||||||
self.resource = val.clamp(0., 1.);
|
|
||||||
if self.resource == 0. {
|
|
||||||
match self.kind {
|
|
||||||
CellKind::Forest => {
|
|
||||||
self.kind = CellKind::Grass;
|
|
||||||
self.resource = 1.;
|
|
||||||
},
|
|
||||||
CellKind::Grass => {
|
|
||||||
self.kind = CellKind::Dirt;
|
|
||||||
self.resource = 0.5;
|
|
||||||
},
|
|
||||||
CellKind::Beach => {
|
|
||||||
self.kind = CellKind::Sea;
|
|
||||||
},
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// pub fn update(&mut self) {
|
||||||
|
// // How much it get by day
|
||||||
|
// let recuperation_rate = match self.kind {
|
||||||
|
// CellKind::Void | CellKind::Sea | CellKind::Beach | CellKind::Dirt | CellKind::Stone => 0.,
|
||||||
|
// CellKind::Forest => 1. / (100. * 365.25), // Let's say that a forest takes 100 years to mature
|
||||||
|
// CellKind::Grass => 1. / (7. * 7.) // Let's say that grass takes 7 weaks to reach its max
|
||||||
|
// };
|
||||||
|
// self.resource = (self.resource + recuperation_rate).clamp(0., 1.);
|
||||||
|
// }
|
||||||
|
// pub fn set_resource(&mut self, val: f32, t: usize) {
|
||||||
|
// self.resource = val.clamp(0., 1.);
|
||||||
|
// if self.resource == 0. {
|
||||||
|
// match self.kind {
|
||||||
|
// CellKind::Forest => {
|
||||||
|
// self.kind = CellKind::Grass;
|
||||||
|
// self.resource = 1.;
|
||||||
|
// },
|
||||||
|
// CellKind::Grass => {
|
||||||
|
// self.kind = CellKind::Dirt;
|
||||||
|
// self.resource = 0.5;
|
||||||
|
// },
|
||||||
|
// CellKind::Beach => {
|
||||||
|
// self.kind = CellKind::Sea;
|
||||||
|
// },
|
||||||
|
// _ => {}
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
// pub struct Map {
|
// pub struct Map {
|
||||||
|
Loading…
Reference in New Issue
Block a user