Line data Source code
1 : #include "core/animations/states/LegsCrouchRunAnimationState.hpp"
2 :
3 : #include "core/animations/states/LegsCrouchAnimationState.hpp"
4 : #include "core/animations/states/LegsCrouchRunBackAnimationState.hpp"
5 : #include "core/animations/states/LegsStandAnimationState.hpp"
6 : #include "core/animations/states/LegsFallAnimationState.hpp"
7 : #include "core/animations/states/LegsRunBackAnimationState.hpp"
8 : #include "core/animations/states/LegsRunAnimationState.hpp"
9 : #include "core/animations/states/LegsJumpAnimationState.hpp"
10 : #include "core/animations/states/LegsProneAnimationState.hpp"
11 :
12 : #include "core/animations/states/CommonAnimationStateTransitions.hpp"
13 :
14 : #include "core/entities/Soldier.hpp"
15 : #include "core/physics/Constants.hpp"
16 :
17 : namespace Soldank
18 : {
19 0 : LegsCrouchRunAnimationState::LegsCrouchRunAnimationState(
20 0 : const AnimationDataManager& animation_data_manager)
21 0 : : AnimationState(animation_data_manager.Get(AnimationType::CrouchRun))
22 0 : , animation_data_manager_(animation_data_manager)
23 : {
24 0 : }
25 :
26 0 : std::optional<std::shared_ptr<AnimationState>> LegsCrouchRunAnimationState::HandleInput(
27 : Soldier& soldier)
28 : {
29 0 : if (soldier.control.prone) {
30 0 : return std::make_shared<LegsProneAnimationState>(animation_data_manager_);
31 : }
32 :
33 0 : if (!soldier.control.down) {
34 : auto maybe_running_animation_state =
35 0 : CommonAnimationStateTransitions::TryTransitionToRunning(soldier, animation_data_manager_);
36 0 : if (maybe_running_animation_state.has_value()) {
37 0 : return *maybe_running_animation_state;
38 : }
39 :
40 0 : if (soldier.on_ground) {
41 0 : return std::make_shared<LegsStandAnimationState>(animation_data_manager_);
42 : }
43 :
44 0 : return std::make_shared<LegsFallAnimationState>(animation_data_manager_);
45 0 : }
46 :
47 0 : if (soldier.control.jets && soldier.jets_count > 0) {
48 0 : if (soldier.on_ground) {
49 : auto maybe_rolling_animation_state =
50 : CommonAnimationStateTransitions::TryTransitionToRolling(soldier,
51 0 : animation_data_manager_);
52 0 : if (maybe_rolling_animation_state.has_value()) {
53 0 : return *maybe_rolling_animation_state;
54 : }
55 0 : }
56 :
57 0 : return std::make_shared<LegsFallAnimationState>(animation_data_manager_);
58 : }
59 :
60 0 : if (!soldier.control.left && !soldier.control.right) {
61 0 : return std::make_shared<LegsCrouchAnimationState>(animation_data_manager_);
62 : }
63 :
64 0 : if (soldier.control.right && soldier.direction == -1) {
65 0 : return std::make_shared<LegsCrouchRunBackAnimationState>(animation_data_manager_);
66 : }
67 :
68 0 : if (soldier.control.left && soldier.direction == 1) {
69 0 : return std::make_shared<LegsCrouchRunBackAnimationState>(animation_data_manager_);
70 : }
71 :
72 0 : return std::nullopt;
73 : }
74 :
75 0 : void LegsCrouchRunAnimationState::Update(Soldier& soldier, const PhysicsEvents& physics_events)
76 : {
77 0 : soldier.stance = PhysicsConstants::STANCE_CROUCH;
78 :
79 0 : if (GetSpeed() > 2) {
80 0 : soldier.particle.velocity_.x /= (float)GetSpeed();
81 0 : soldier.particle.velocity_.y /= (float)GetSpeed();
82 : }
83 :
84 0 : if (soldier.on_ground) {
85 0 : if (soldier.control.right && soldier.direction == 1) {
86 0 : glm::vec2 particle_force = soldier.particle.GetForce();
87 0 : soldier.particle.SetForce({ PhysicsConstants::CROUCHRUNSPEED, particle_force.y });
88 0 : } else if (soldier.control.left && soldier.direction == -1) {
89 0 : glm::vec2 particle_force = soldier.particle.GetForce();
90 0 : soldier.particle.SetForce({ -PhysicsConstants::CROUCHRUNSPEED, particle_force.y });
91 : }
92 : }
93 0 : }
94 : } // namespace Soldank
|