Line data Source code
1 : #include "core/physics/SoldierSkeletonPhysics.hpp"
2 :
3 : #include "core/physics/Constants.hpp"
4 :
5 : #include "core/math/Calc.hpp"
6 :
7 : namespace Soldank
8 : {
9 0 : void RepositionSoldierSkeletonParts(Soldier& soldier)
10 : {
11 0 : float body_y = 0.0F;
12 0 : float arm_s = NAN;
13 :
14 0 : soldier.skeleton->SetOldPos(21, soldier.skeleton->GetPos(21));
15 0 : soldier.skeleton->SetOldPos(23, soldier.skeleton->GetPos(23));
16 : // skeleton->SetOldPos(25, skeleton->GetPos(25));
17 0 : soldier.skeleton->SetPos(21, soldier.skeleton->GetPos(9));
18 0 : soldier.skeleton->SetPos(23, soldier.skeleton->GetPos(12));
19 : // skeleton->SetPos(25, skeleton->GetPos(5));
20 :
21 0 : if (!soldier.dead_meat) {
22 0 : soldier.skeleton->SetPos(21, soldier.skeleton->GetPos(21) + soldier.particle.velocity_);
23 0 : soldier.skeleton->SetPos(23, soldier.skeleton->GetPos(23) + soldier.particle.velocity_);
24 : // skeleton->SetPos(25, skeleton.GetPos(25) + particle.velocity);
25 : }
26 0 : switch (soldier.stance) {
27 0 : case PhysicsConstants::STANCE_STAND:
28 0 : body_y = 8.0F;
29 0 : break;
30 0 : case PhysicsConstants::STANCE_CROUCH:
31 0 : body_y = 9.0F;
32 0 : break;
33 0 : case PhysicsConstants::STANCE_PRONE: {
34 0 : if (soldier.body_animation->GetType() == AnimationType::Prone) {
35 0 : if (soldier.body_animation->GetFrame() > 9) {
36 0 : body_y = -2.0F;
37 : } else {
38 0 : body_y = 14.0F - (float)soldier.body_animation->GetFrame();
39 : }
40 : } else {
41 0 : body_y = 9.0F;
42 : }
43 :
44 0 : if (soldier.body_animation->GetType() == AnimationType::ProneMove) {
45 0 : body_y = 0.0F;
46 : }
47 : }
48 : }
49 0 : if (soldier.body_animation->GetType() == AnimationType::GetUp) {
50 0 : if (soldier.body_animation->GetFrame() > 18) {
51 0 : body_y = 8.0F;
52 : } else {
53 0 : body_y = 4.0F;
54 : }
55 : }
56 :
57 0 : if ((float)soldier.control.mouse_aim_x >= soldier.particle.position.x) {
58 0 : soldier.direction = 1;
59 : } else {
60 0 : soldier.direction = -1;
61 : }
62 :
63 0 : for (int i = 1; i < 21; i++) {
64 0 : if (soldier.skeleton->GetActive(i) && !soldier.dead_meat) {
65 0 : glm::vec2 pos = glm::vec2(0.0F, 0.0F);
66 0 : soldier.skeleton->SetOldPos(i, soldier.skeleton->GetPos(i));
67 :
68 0 : if (!soldier.half_dead && ((i >= 1 && i <= 6) || (i == 17) || (i == 18))) {
69 0 : glm::vec2 anim_pos = soldier.legs_animation->GetPosition(i);
70 0 : pos.x = soldier.particle.position.x + anim_pos.x * (float)soldier.direction;
71 0 : pos.y = soldier.particle.position.y + anim_pos.y;
72 : }
73 :
74 0 : if (((i >= 7) && (i <= 16)) || (i == 19) || (i == 20)) {
75 0 : auto anim_pos = soldier.body_animation->GetPosition(i);
76 0 : pos.x = soldier.particle.position.x + anim_pos.x * (float)soldier.direction;
77 0 : pos.y = soldier.particle.position.y + anim_pos.y;
78 :
79 0 : if (soldier.half_dead) {
80 0 : pos.y += 9.0F;
81 : } else {
82 0 : pos.y += soldier.skeleton->GetPos(6).y - (soldier.particle.position.y - body_y);
83 : }
84 : }
85 :
86 0 : soldier.skeleton->SetPos(i, pos);
87 : }
88 : }
89 :
90 0 : glm::vec2 aim(soldier.control.mouse_aim_x, soldier.control.mouse_aim_y);
91 :
92 0 : if (!soldier.dead_meat) {
93 0 : auto pos = soldier.skeleton->GetPos(9);
94 0 : auto r_norm = 0.1F * Calc::Vec2Normalize(soldier.skeleton->GetPos(12) - aim);
95 0 : auto dir = (float)soldier.direction;
96 :
97 0 : soldier.skeleton->SetPos(12, pos + glm::vec2(-dir * r_norm.y, dir * r_norm.x));
98 0 : soldier.skeleton->SetPos(23, pos + glm::vec2(-dir * r_norm.y, dir * r_norm.x) * 50.0F);
99 : }
100 :
101 : auto not_aiming_anims = std::vector{
102 : AnimationType::Reload, AnimationType::ReloadBow, AnimationType::ClipIn,
103 : AnimationType::ClipOut, AnimationType::SlideBack, AnimationType::Change,
104 : AnimationType::ThrowWeapon, AnimationType::Punch, AnimationType::Roll,
105 : AnimationType::RollBack, AnimationType::Cigar, AnimationType::Match,
106 : AnimationType::Smoke, AnimationType::Wipe, AnimationType::TakeOff,
107 : AnimationType::Groin, AnimationType::Piss, AnimationType::Mercy,
108 : AnimationType::Mercy2, AnimationType::Victory, AnimationType::Own,
109 : AnimationType::Melee,
110 0 : };
111 :
112 0 : if (soldier.body_animation->GetType() == AnimationType::Throw) {
113 0 : arm_s = -5.00F;
114 : } else {
115 0 : arm_s = -7.00F;
116 : }
117 :
118 0 : if (!soldier.body_animation->IsAny(not_aiming_anims)) {
119 0 : auto r_norm = arm_s * Calc::Vec2Normalize(soldier.skeleton->GetPos(15) - aim);
120 0 : soldier.skeleton->SetPos(15, soldier.skeleton->GetPos(16) + r_norm);
121 : }
122 0 : if (soldier.body_animation->GetType() == AnimationType::Throw) {
123 0 : arm_s = -6.00F;
124 : } else {
125 0 : arm_s = -8.00F;
126 : }
127 :
128 0 : if (!soldier.body_animation->IsAny(not_aiming_anims)) {
129 0 : auto r_norm = arm_s * Calc::Vec2Normalize(soldier.skeleton->GetPos(19) - aim);
130 0 : soldier.skeleton->SetPos(19, soldier.skeleton->GetPos(16) - glm::vec2(0.0F, 4.0F) + r_norm);
131 : }
132 0 : }
133 : } // namespace Soldank
|