HugoDzz/rust-sandbox
11
1use bevy::prelude::*;2use crate::utils::constants::{GAME_RESOLUTION_X, GAME_RESOLUTION_Y, BLOOD_SAFE_TIME};3use crate::utils::boundaries::is_within_boundaries;4use crate::grid::{Grid, GridPosition};5use crate::grain::{GrainType, Direction};6 7fn move_grain(transform: &mut Transform, grid_position: &mut GridPosition, x: i32, y: i32) {8 transform.translation.x += x as f32;9 transform.translation.y -= y as f32;10 grid_position.prev_x = Some(grid_position.current_x);11 grid_position.prev_y = Some(grid_position.current_y);12 grid_position.current_x += x;13 grid_position.current_y += y;14}15 16pub fn handle_blood_grain(17 transform: &mut Transform,18 grid_position: &mut GridPosition,19 grid_data: &Grid,20 direction: &mut Direction,21 lifetime: u3222) {23 // Ensure coordinates are in the grid24 if is_within_boundaries(grid_position, GAME_RESOLUTION_X as i32, GAME_RESOLUTION_Y as i32) {25 26 let maybe_grain_below = grid_data.get(grid_position.current_x as usize, (grid_position.current_y + 1) as usize);27 let maybe_grain_right = grid_data.get((grid_position.current_x + 1) as usize, grid_position.current_y as usize);28 let maybe_grain_left = grid_data.get((grid_position.current_x - 1) as usize, grid_position.current_y as usize);29 30 match maybe_grain_below {31 Some(_) => {32 33 // Do nothing (to avoid grain behavior in the air just after spawning)34 if lifetime < 5 {35 return;36 }37 38 // There is a grain below, try moving39 match (maybe_grain_left, maybe_grain_right) {40 (Some(_), None) => match direction {41 Direction::Left => {42 if lifetime < BLOOD_SAFE_TIME {43 *direction = Direction::Right;44 }45 }46 Direction::Right => move_grain(transform, grid_position, 1, 0)47 },48 (None, Some(_)) => match direction {49 Direction::Left => move_grain(transform, grid_position, -1, 0),50 Direction::Right => {51 if lifetime < BLOOD_SAFE_TIME {52 *direction = Direction::Left;53 }54 }55 },56 (None, None) => {57 match *direction {58 Direction::Right => move_grain(transform, grid_position, 1, 0),59 Direction::Left => move_grain(transform, grid_position, -1, 0)60 }61 }62 (Some(_), Some(_)) => { /* Do nothing, stay in place */ }63 }64 }65 None => {66 // No grain below, just fall67 move_grain(transform, grid_position, 0, 1)68 }69 }70 }71}72 73/*74 75 🦀 Systems. Learn more: https://bevy-cheatbook.github.io/programming/systems.html76 77*/78 79pub fn shade_blood(80 mut query: Query<(&GrainType, &mut GridPosition, &mut Handle<Image>)>,81 grid_data: ResMut<Grid>,82 asset_server: Res<AssetServer>,83) {84 for (grain_type, grid_position, mut texture_handle) in query.iter_mut() {85 86 let maybe_grain_above = grid_data.get(grid_position.current_x as usize, (grid_position.current_y - 1) as usize);87 88 match grain_type {89 GrainType::Blood => match maybe_grain_above {90 None => {91 *texture_handle = asset_server.load("blood_1.png");92 }93 _ => {94 *texture_handle = asset_server.load("blood_2.png");95 }96 },97 _ => {}98 }99 }100}101 