use std::f32::consts::PI; use crate::{ part, player::component::{Input, Player}, Attach, PartType, }; use bevy::prelude::*; use bevy_rapier2d::prelude::*; pub fn search_thrusters( input: Input, attach: Attach, p_transform: Transform, energy: &mut u32, attached_query: &mut Query< (&Attach, &PartType, &mut ExternalForce, &Transform), Without, >, ) { let p_angle = p_transform.rotation.to_euler(EulerRot::ZYX).0; for child in attach.children.iter().flatten() { let (attach, part_type, mut force, transform) = attached_query.get_mut(*child).unwrap(); let angle = transform.rotation.to_euler(EulerRot::ZYX).0; let relative_angle = (p_angle - angle).abs(); let relative_pos = transform.translation - p_transform.translation; let relative_pos = Vec2::new( relative_pos .x .mul_add((-p_angle).cos(), -relative_pos.y * (-p_angle).sin()), relative_pos .x .mul_add((-p_angle).sin(), relative_pos.y * (-p_angle).cos()), ); let mut force_mult = 0.; let mut energy_lose_by = 0; if *part_type == PartType::LandingThruster { force_mult = part!(PartType::LandingThruster).thruster_force; energy_lose_by = part!(PartType::LandingThruster).thruster_energy; } if input.up && 3. * PI / 4. < relative_angle && relative_angle < 5. * PI / 4. { let thruster_force = ExternalForce::at_point( Vec2::new(-force_mult * angle.sin(), force_mult * angle.cos()), transform.translation.xy(), transform.translation.xy(), ); force.force += thruster_force.force; force.torque += thruster_force.torque; *energy -= energy_lose_by; } if input.down && ((0. < relative_angle && relative_angle < PI / 4.) || (7. * PI / 4. < relative_angle && relative_angle < 2. * PI)) { let thruster_force = ExternalForce::at_point( Vec2::new(-force_mult * angle.sin(), force_mult * angle.cos()), transform.translation.xy(), transform.translation.xy(), ); force.force += thruster_force.force; force.torque += thruster_force.torque; *energy -= energy_lose_by; } if input.left { if 3. * PI / 4. < relative_angle && relative_angle < 5. * PI / 4. && relative_pos.x > 0.48 { let thruster_force = ExternalForce::at_point( Vec2::new(-force_mult * angle.sin(), force_mult * angle.cos()), transform.translation.xy(), transform.translation.xy(), ); force.force += thruster_force.force; force.torque += thruster_force.torque; *energy -= energy_lose_by; } if ((0. < relative_angle && relative_angle < PI / 4.) || (7. * PI / 4. < relative_angle && relative_angle < 2. * PI)) && relative_pos.x < -0.48 { let thruster_force = ExternalForce::at_point( Vec2::new(-force_mult * angle.sin(), force_mult * angle.cos()), transform.translation.xy(), transform.translation.xy(), ); force.force += thruster_force.force; force.torque += thruster_force.torque; *energy -= energy_lose_by; } if PI / 4. < relative_angle && relative_angle < 3. * PI / 4. && relative_pos.y < -0.48 { let thruster_force = ExternalForce::at_point( Vec2::new(-force_mult * angle.sin(), force_mult * angle.cos()), transform.translation.xy(), transform.translation.xy(), ); force.force += thruster_force.force; force.torque += thruster_force.torque; *energy -= energy_lose_by; } if 5. * PI / 4. < relative_angle && relative_angle < 7. * PI / 4. && relative_pos.y > 0.48 { let thruster_force = ExternalForce::at_point( Vec2::new(-force_mult * angle.sin(), force_mult * angle.cos()), transform.translation.xy(), transform.translation.xy(), ); force.force += thruster_force.force; force.torque += thruster_force.torque; *energy -= energy_lose_by; } } if input.right { if ((0. < relative_angle && relative_angle < PI / 4.) || (7. * PI / 4. < relative_angle && relative_angle < 2. * PI)) && relative_pos.x > 0.48 { let thruster_force = ExternalForce::at_point( Vec2::new(-force_mult * angle.sin(), force_mult * angle.cos()), transform.translation.xy(), transform.translation.xy(), ); force.force += thruster_force.force; force.torque += thruster_force.torque; *energy -= energy_lose_by; } if 3. * PI / 4. < relative_angle && relative_angle < 5. * PI / 4. && relative_pos.x < -0.48 { let thruster_force = ExternalForce::at_point( Vec2::new(-force_mult * angle.sin(), force_mult * angle.cos()), transform.translation.xy(), transform.translation.xy(), ); force.force += thruster_force.force; force.torque += thruster_force.torque; *energy -= energy_lose_by; } if PI / 4. < relative_angle && relative_angle < 3. * PI / 4. && relative_pos.y > 0.48 { let thruster_force = ExternalForce::at_point( Vec2::new(-force_mult * angle.sin(), force_mult * angle.cos()), transform.translation.xy(), transform.translation.xy(), ); force.force += thruster_force.force; force.torque += thruster_force.torque; *energy -= energy_lose_by; } if 5. * PI / 4. < relative_angle && relative_angle < 7. * PI / 4. && relative_pos.y < -0.48 { let thruster_force = ExternalForce::at_point( Vec2::new(-force_mult * angle.sin(), force_mult * angle.cos()), transform.translation.xy(), transform.translation.xy(), ); force.force += thruster_force.force; force.torque += thruster_force.torque; *energy -= energy_lose_by; } } if *part_type != PartType::LandingThruster && *energy >= energy_lose_by { search_thrusters(input, attach.clone(), p_transform, energy, attached_query); } } }