animate.rs 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. use crate::behavior::order::Order;
  2. use crate::behavior::ItemBehavior;
  3. use crate::config::MOVE_TO_REACHED_WHEN_DISTANCE_INFERIOR_AT;
  4. use crate::scene::item::{ItemState, SceneItem, SceneItemModifier};
  5. use std::f32::consts::FRAC_PI_2;
  6. pub fn digest_next_order(scene_item: &SceneItem) -> Vec<SceneItemModifier> {
  7. let mut scene_item_modifiers: Vec<SceneItemModifier> = vec![];
  8. // TODO: Compute here if it possible (fear, compatible with current order, etc)
  9. if let Some(next_order) = &scene_item.next_order {
  10. match next_order {
  11. Order::MoveTo(_) => {
  12. scene_item_modifiers.push(SceneItemModifier::SwitchToCurrentOrder);
  13. }
  14. }
  15. }
  16. scene_item_modifiers
  17. }
  18. pub fn digest_current_order(scene_item: &SceneItem) -> Vec<SceneItemModifier> {
  19. let mut scene_item_modifiers: Vec<SceneItemModifier> = vec![];
  20. // TODO: here, compute state according to order. Ex: if too much fear, move order do not produce walking state
  21. if let Some(current_order) = &scene_item.current_order {
  22. match current_order {
  23. Order::MoveTo(move_to_scene_point) => {
  24. scene_item_modifiers.push(SceneItemModifier::ChangeState(ItemState::new(
  25. ItemBehavior::WalkingTo(*move_to_scene_point),
  26. )))
  27. }
  28. }
  29. }
  30. scene_item_modifiers
  31. }
  32. pub fn digest_current_behavior(scene_item: &SceneItem) -> Vec<SceneItemModifier> {
  33. let mut scene_item_modifiers: Vec<SceneItemModifier> = vec![];
  34. match scene_item.state.current_behavior {
  35. ItemBehavior::Standing => {}
  36. ItemBehavior::WalkingTo(going_to_scene_point)
  37. | ItemBehavior::CrawlingTo(going_to_scene_point) => {
  38. // Note: angle computed by adding FRAC_PI_2 because sprites are north oriented
  39. scene_item_modifiers.push(SceneItemModifier::ChangeDisplayAngle(
  40. f32::atan2(
  41. going_to_scene_point.y - scene_item.position.y,
  42. going_to_scene_point.x - scene_item.position.x,
  43. ) + FRAC_PI_2,
  44. ));
  45. // Check if scene_point reached
  46. let distance = going_to_scene_point.distance(scene_item.position);
  47. if distance < MOVE_TO_REACHED_WHEN_DISTANCE_INFERIOR_AT {
  48. scene_item_modifiers.push(SceneItemModifier::ChangeState(ItemState::new(
  49. ItemBehavior::Standing,
  50. )));
  51. if let Some(current_order) = &scene_item.current_order {
  52. match current_order {
  53. Order::MoveTo(move_to_scene_point) => {
  54. if *move_to_scene_point == going_to_scene_point {
  55. scene_item_modifiers.push(SceneItemModifier::SwitchToCurrentOrder);
  56. }
  57. }
  58. }
  59. }
  60. }
  61. }
  62. }
  63. scene_item_modifiers
  64. }