animate.rs 3.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. Order::MoveFastTo(_) => {
  15. scene_item_modifiers.push(SceneItemModifier::SwitchToCurrentOrder)
  16. }
  17. Order::HideTo(_) => {
  18. scene_item_modifiers.push(SceneItemModifier::SwitchToCurrentOrder)
  19. }
  20. }
  21. }
  22. scene_item_modifiers
  23. }
  24. pub fn digest_current_order(scene_item: &SceneItem) -> Vec<SceneItemModifier> {
  25. let mut scene_item_modifiers: Vec<SceneItemModifier> = vec![];
  26. // TODO: here, compute state according to order. Ex: if too much fear, move order do not produce walking state
  27. if let Some(current_order) = &scene_item.current_order {
  28. match current_order {
  29. Order::MoveTo(move_to_scene_point) => {
  30. // FIXME BS NOW: Change order only if it is not the current order
  31. scene_item_modifiers.push(SceneItemModifier::ChangeState(ItemState::new(
  32. ItemBehavior::MoveTo(*move_to_scene_point),
  33. )))
  34. }
  35. Order::MoveFastTo(move_to_scene_point) => {
  36. // FIXME BS NOW: Change order only if it is not the current order
  37. scene_item_modifiers.push(SceneItemModifier::ChangeState(ItemState::new(
  38. ItemBehavior::MoveFastTo(*move_to_scene_point),
  39. )))}
  40. Order::HideTo(move_to_scene_point) => {
  41. // FIXME BS NOW: Change order only if it is not the current order
  42. scene_item_modifiers.push(SceneItemModifier::ChangeState(ItemState::new(
  43. ItemBehavior::HideTo(*move_to_scene_point),
  44. )))}
  45. }
  46. }
  47. scene_item_modifiers
  48. }
  49. pub fn digest_current_behavior(scene_item: &SceneItem) -> Vec<SceneItemModifier> {
  50. let mut scene_item_modifiers: Vec<SceneItemModifier> = vec![];
  51. match scene_item.state.current_behavior {
  52. ItemBehavior::Standing => {}
  53. ItemBehavior::MoveTo(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. if distance < MOVE_TO_REACHED_WHEN_DISTANCE_INFERIOR_AT {
  65. scene_item_modifiers.push(SceneItemModifier::ChangeState(ItemState::new(
  66. ItemBehavior::Standing,
  67. )));
  68. if let Some(current_order) = &scene_item.current_order {
  69. match current_order {
  70. Order::MoveTo(move_to_scene_point) => {
  71. if *move_to_scene_point == going_to_scene_point {
  72. scene_item_modifiers.push(SceneItemModifier::SwitchToCurrentOrder);
  73. }
  74. }
  75. }
  76. }
  77. }
  78. }
  79. }
  80. scene_item_modifiers
  81. }