use std::f32::consts::PI;
use bevy::prelude::*;
use bevy_rapier2d::prelude::*;
use crate::{part, Attach, Input, PartType, Player};
pub fn search_thrusters(
input: Input,
attach: Attach,
p_transform: Transform,
energy: &mut u32,
attached_query: &mut Query<
(&Attach, &PartType, &mut ExternalForce, &Transform),
Without<Player>,
>,
) {
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);
}
}
}