1 #ifndef PHYSICSCOMPONENT_H_
2 #define PHYSICSCOMPONENT_H_
3 
4 #include <Box2D/Box2D.h>
5 #include "../../SharedDefines.h"
6 #include "../ActorComponent.h"
7 #include "../Actor.h"
8 
9 class ControllableComponent;
10 class PhysicsComponent : public ActorComponent
11 {
12 public:
13     PhysicsComponent();
14     virtual ~PhysicsComponent();
15 
16     static const char* g_Name;
VGetName()17     virtual const char* VGetName() const override { return g_Name; }
18 
19     virtual bool VInit(TiXmlElement* data) override;
20     virtual TiXmlElement* VGenerateXml() override;
21     virtual void VPostInit() override;
22     virtual void VPostPostInit() override;
23 
24     virtual void VUpdate(uint32 msDiff) override;
25 
Destroy()26     void Destroy() { m_pPhysics->VRemoveActor(m_pOwner->GetGUID()); }
27 
28     void SetControllableComponent(ControllableComponent* pComp);
29 
GetDirection()30     Direction GetDirection() { return m_Direction; }
31     void SetDirection(Direction newDirection);
32 
CanBounce()33     bool CanBounce() const { return m_CanBounce; }
SetCanBounce(bool canBounce)34     void SetCanBounce(bool canBounce) { m_CanBounce = canBounce; }
35 
CanJump()36     bool CanJump() const { return m_CanJump; }
SetCanJump(bool canJump)37     void SetCanJump(bool canJump) { m_CanJump = canJump; }
38 
GetMaxJumpHeight()39     int32 GetMaxJumpHeight() const { return m_MaxJumpHeight; }
40     void SetMaxJumpHeight(int32 maxJumpHeight);
41 
SetGravityScale(float gravityScale)42     void SetGravityScale(float gravityScale) { m_pPhysics->VSetGravityScale(m_pOwner->GetGUID(), gravityScale); }
GetGravityScale()43     float GetGravityScale() { return m_GravityScale; }
RestoreGravityScale()44     void RestoreGravityScale() { m_pPhysics->VSetGravityScale(m_pOwner->GetGUID(), m_GravityScale); }
GetFriction()45     float GetFriction() { return m_Friction; }
GetDensity()46     float GetDensity() { return m_Density; }
47 
GetBodySize()48     Point GetBodySize() const { return m_ActorBodyDef.size; }
GetBodyWidth()49     double GetBodyWidth() const { return m_ActorBodyDef.size.x; }
GetBodyHeight()50     double GetBodyHeight() const { return m_ActorBodyDef.size.y; }
51 
SetCurrentSpeed(Point speed)52     void SetCurrentSpeed(Point speed) { m_CurrentSpeed = speed; }
SetConstantSpeed(Point speed)53     void SetConstantSpeed(Point speed) { m_ConstantSpeed = speed; }
HasConstantSpeed()54     bool HasConstantSpeed() { return m_HasConstantSpeed; }
StopMovement()55     void StopMovement() { m_CurrentSpeed = 0; m_ConstantSpeed = 0; }
56 
57     void RequestClimb(Point climbMovement);
58 
59     void OnBeginFootContact();
60     void OnEndFootContact();
61     void OnStartFalling();
62     void OnStartJumping();
63 
64     void OnAttachedToRope();
65     void OnDetachedFromRope();
66 
GetNumFootContacts()67     int32 GetNumFootContacts() { return m_NumFootContacts; }
IsOnGround()68     bool IsOnGround() { return m_NumFootContacts > 0; }
IsInAir()69     bool IsInAir() { return m_IsFalling || m_IsJumping; }
IsFalling()70     bool IsFalling() { return m_IsFalling; }
IsJumping()71     bool IsJumping() { return m_IsJumping; }
IsClimbing()72     bool IsClimbing() { return m_IsClimbing; }
IsOnLadder()73     bool IsOnLadder() { return m_OverlappingLaddersList.size() > 0; }
GetClimbingSpeed()74     Point GetClimbingSpeed() { return m_ClimbingSpeed; }
75 
76     void SetFalling(bool falling);
77     void SetJumping(bool jumping);
78 
AddJumpHeight(float deltaHeight)79     void AddJumpHeight(float deltaHeight) { m_HeightInAir += deltaHeight; }
GetHeightInAir()80     float GetHeightInAir() { return m_HeightInAir; }
SetHeightInAir(float heightInAir)81     void SetHeightInAir(float heightInAir) { m_HeightInAir = heightInAir; }
82 
AddFallHeight(float deltaFallHeight)83     void AddFallHeight(float deltaFallHeight) { m_FallHeight += deltaFallHeight; }
SetFallHeight(float fallHeight)84     void SetFallHeight(float fallHeight) { m_FallHeight = fallHeight; }
GetFallHeight()85     float GetFallHeight() { return m_FallHeight; }
86 
87     void SetForceFall();
88 
89     bool AttachToLadder();
90 
91     bool CheckOverlap(FixtureType withWhatFixture);
92 
SetExternalSourceSpeed(const Point & externalSpeed)93     void SetExternalSourceSpeed(const Point& externalSpeed) { m_ExternalSourceSpeed = externalSpeed; }
SetMovingPlatformContact(b2Contact * pContact)94     void SetMovingPlatformContact(b2Contact* pContact) { m_pMovingPlatformContact = pContact; }
95 
96     // Communication with IGamePhysics
GetVelocity()97     Point GetVelocity() { return m_pPhysics->VGetVelocity(m_pOwner->GetGUID()); }
SetVelocity(Point velocity)98     void SetVelocity(Point velocity) { m_pPhysics->VSetLinearSpeed(m_pOwner->GetGUID(), velocity); }
99 
ApplyLinearImpulse(Point impulse)100     void ApplyLinearImpulse(Point impulse) { m_pPhysics->VApplyLinearImpulse(m_pOwner->GetGUID(), impulse); }
ApplyForce(Point force)101     void ApplyForce(Point force) { m_pPhysics->VApplyForce(m_pOwner->GetGUID(), force); }
102 
IsAwake()103     bool IsAwake() { return m_pPhysics->VIsAwake(m_pOwner->GetGUID()); }
104 
105     void SetIsForcedUp(bool isForcedUp, int forcedUpHeight);
GetIsForcedUp()106     bool GetIsForcedUp() { return m_bIsForcedUp; }
107 
AddOverlappingLadder(const b2Fixture * ladder)108     void AddOverlappingLadder(const b2Fixture* ladder) { m_OverlappingLaddersList.push_back(ladder); }
109     void RemoveOverlappingLadder(const b2Fixture* ladder);
110 
111     void AddOverlappingGround(const b2Fixture* pGround);
112     void RemoveOverlappingGround(const b2Fixture* pGround);
113 
114     void AddOverlappingKinematicBody(const b2Body* pBody);
115     void RemoveOverlappingKinematicBody(const b2Body* pBody);
116 
SetTopLadderContact(b2Contact * pContact)117     void SetTopLadderContact(b2Contact* pContact) { m_pTopLadderContact = pContact; }
GetTopLadderContact()118     b2Contact* GetTopLadderContact() { return m_pTopLadderContact; }
119 
SetExternalConveyorBeltSpeed(const Point & extSpeed)120     void SetExternalConveyorBeltSpeed(const Point& extSpeed) { m_ExternalConveyorBeltSpeed = extSpeed; }
121 
122 private:
123     // Configurable data read from XML
124     bool m_CanClimb;
125     bool m_CanBounce;
126     bool m_CanJump;
127     int32 m_MaxJumpHeight;
128     float m_GravityScale;
129     float m_Friction;
130     float m_Density;
131 
132     Point m_BodySize;
133     int32 m_NumFootContacts;
134 
135     bool m_IsClimbing;
136     bool m_IsStopped;
137     bool m_IsRunning;
138     Direction m_Direction;
139 
140     bool m_IsFalling;
141     bool m_IsJumping;
142     float m_HeightInAir;
143 
144     float m_FallHeight;
145 
146     bool m_HasConstantSpeed;
147     Point m_ConstantSpeed;
148 
149     Point m_CurrentSpeed;
150     Point m_ExternalSourceSpeed;
151     Point m_ExternalConveyorBeltSpeed;
152 
153     Point m_ClimbingSpeed;
154 
155     // Hackerino to prevent loop jumping with space pressed
156     bool m_IgnoreJump;
157 
158     ControllableComponent* m_pControllableComponent;
159 
160     shared_ptr<IGamePhysics> m_pPhysics;
161 
162     int m_DoNothingTimeout;
163 
164     // Actor body definition for physics body creation
165     ActorBodyDef m_ActorBodyDef;
166     bool m_bClampToGround;
167 
168     // Spring caused us to go up
169     bool m_bIsForcedUp;
170     int m_ForcedUpHeight;
171 
172     b2Contact* m_pTopLadderContact;
173     b2Contact* m_pMovingPlatformContact;
174 
175     std::vector<const b2Body*> m_OverlappingKinematicBodiesList;
176     std::vector<const b2Fixture*> m_OverlappingLaddersList;
177     std::vector<const b2Fixture*> m_OverlappingGroundsList;
178 };
179 
180 #endif
181