animate.rs 4.2KB

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