animate.rs 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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::SwitchToNextOrder);
  13. }
  14. Order::MoveFastTo(_) => scene_item_modifiers.push(SceneItemModifier::SwitchToNextOrder),
  15. Order::HideTo(_) => scene_item_modifiers.push(SceneItemModifier::SwitchToNextOrder),
  16. }
  17. }
  18. scene_item_modifiers
  19. }
  20. pub fn digest_current_order(scene_item: &SceneItem) -> Vec<SceneItemModifier> {
  21. let mut scene_item_modifiers: Vec<SceneItemModifier> = vec![];
  22. // TODO: here, compute state according to order. Ex: if too much fear, move order do not produce walking state
  23. if let Some(current_order) = &scene_item.current_order {
  24. match current_order {
  25. Order::MoveTo(move_to_scene_point) => {
  26. // FIXME BS NOW: Change order only if it is not the current order
  27. scene_item_modifiers.push(SceneItemModifier::ChangeState(ItemState::new(
  28. ItemBehavior::MoveTo(*move_to_scene_point),
  29. )))
  30. }
  31. Order::MoveFastTo(move_to_scene_point) => {
  32. // FIXME BS NOW: Change order only if it is not the current order
  33. scene_item_modifiers.push(SceneItemModifier::ChangeState(ItemState::new(
  34. ItemBehavior::MoveFastTo(*move_to_scene_point),
  35. )))
  36. }
  37. Order::HideTo(move_to_scene_point) => {
  38. // FIXME BS NOW: Change order only if it is not the current order
  39. scene_item_modifiers.push(SceneItemModifier::ChangeState(ItemState::new(
  40. ItemBehavior::HideTo(*move_to_scene_point),
  41. )))
  42. }
  43. }
  44. }
  45. scene_item_modifiers
  46. }
  47. pub fn digest_current_behavior(scene_item: &SceneItem) -> Vec<SceneItemModifier> {
  48. let mut scene_item_modifiers: Vec<SceneItemModifier> = vec![];
  49. match scene_item.state.current_behavior {
  50. ItemBehavior::Standing => {}
  51. ItemBehavior::MoveTo(going_to_scene_point)
  52. | ItemBehavior::MoveFastTo(going_to_scene_point)
  53. | ItemBehavior::HideTo(going_to_scene_point) => {
  54. // Note: angle computed by adding FRAC_PI_2 because sprites are north oriented
  55. scene_item_modifiers.push(SceneItemModifier::ChangeDisplayAngle(
  56. f32::atan2(
  57. going_to_scene_point.y - scene_item.position.y,
  58. going_to_scene_point.x - scene_item.position.x,
  59. ) + FRAC_PI_2,
  60. ));
  61. // Check if scene_point reached
  62. let distance = going_to_scene_point.distance(scene_item.position);
  63. if distance < MOVE_TO_REACHED_WHEN_DISTANCE_INFERIOR_AT {
  64. scene_item_modifiers.push(SceneItemModifier::ChangeState(ItemState::new(
  65. ItemBehavior::Standing,
  66. )));
  67. if let Some(current_order) = &scene_item.current_order {
  68. match current_order {
  69. Order::MoveTo(move_to_scene_point)
  70. | Order::MoveFastTo(move_to_scene_point)
  71. | Order::HideTo(move_to_scene_point) => {
  72. if *move_to_scene_point == going_to_scene_point {
  73. scene_item_modifiers.push(SceneItemModifier::SwitchToNextOrder);
  74. }
  75. }
  76. }
  77. }
  78. }
  79. }
  80. }
  81. scene_item_modifiers
  82. }