1818#include " caveexpress/shared/CaveExpressCooldown.h"
1919#include " caveexpress/shared/CaveExpressSoundType.h"
2020#include " caveexpress/shared/constants/ConfigVars.h"
21+ #include < cmath>
2122
2223namespace caveexpress {
2324
@@ -28,7 +29,8 @@ const float gravityScale = 0.3f;
2829Player::Player (Map& map, ClientId clientId) :
2930 IEntity (EntityTypes::PLAYER, map), _touching(nullptr ), _invulnerableTime(0u ), _powerUpTime(0u ), _collectedNPC(nullptr ), _acceleration(b2Vec2_zero), _fingerAcceleration(
3031 false ), _accelerateX(0 ), _accelerateY(0 ), _clientId(clientId), _lastAccelerate(0 ), _name(" " ), _lastFruitCollected(0 ), _hitpoints(
31- 0 ), _lives(0 ), _fruitsCollectedInARow(0 ), _revoluteJoint(nullptr ), _crashReason(CRASH_NONE) {
32+ 0 ), _lives(0 ), _fruitsCollectedInARow(0 ), _revoluteJoint(nullptr ), _crashReason(CRASH_NONE)
33+ {
3234 _godMode = Config.getConfigVar (GOD_MODE);
3335 _maxHitPoints = Config.getConfigVar (MAX_HITPOINTS);
3436 _hitpoints = _maxHitPoints->getIntValue ();
@@ -39,6 +41,8 @@ Player::Player (Map& map, ClientId clientId) :
3941 setAnimationType (Animations::ANIMATION_IDLE);
4042 setState (PlayerState::PLAYER_IDLE);
4143 memset (_collectedEntities, 0 , sizeof (_collectedEntities));
44+ _targetCavePos.x = -1 .f ;
45+ _targetCavePos.y = -1 .f ;
4246}
4347
4448Player::~Player ()
@@ -154,6 +158,8 @@ void Player::update (uint32_t deltaTime)
154158{
155159 IEntity::update (deltaTime);
156160
161+ sendTargetCaveAngle ();
162+
157163 if (isCrashed ()) {
158164 // before we crash, we should drop the stuff we are carrying
159165 drop ();
@@ -462,7 +468,7 @@ bool Player::collect (CollectableEntity* entity)
462468 break ;
463469 }
464470 if (EntityTypes::isStone (entityType)) {
465- GameEvent.sendTargetCave (ClientIdToClientMask (_clientId), 100 );
471+ GameEvent.sendTargetCave (ClientIdToClientMask (_clientId), 100 , - 1 . f );
466472 Achievements::COLLECT_10_STONES.unlock ();
467473 Achievements::COLLECT_100_STONES.unlock ();
468474 }
@@ -481,7 +487,7 @@ void Player::drop ()
481487 if (EntityTypes::isStone (*entityType)) {
482488 Stone *entity = new Stone (_map, getPos ().x , getPos ().y , this );
483489 entity->createBody ();
484- GameEvent.sendTargetCave (ClientIdToClientMask (_clientId), 0 );
490+ GameEvent.sendTargetCave (ClientIdToClientMask (_clientId), 0 , - 1 . f );
485491 } else if (EntityTypes::isBomb (*entityType)) {
486492 Bomb *entity = new Bomb (_map, getPos ().x , getPos ().y , this );
487493 entity->createBody ();
@@ -629,17 +635,43 @@ void Player::setPlatform (Platform* entity)
629635 npc->resetTriggerMovement ();
630636}
631637
632- void Player::setCollectedNPC (NPCFriendly *npc) {
638+ static float GetAngle (float x, float y)
639+ {
640+ if (x == 0 .f && y == 0 .f )
641+ return 0 .f ;
642+
643+ if (y == 0 .f )
644+ return (x < 0 .f ) ? M_PI : 0 .f ;
645+ else
646+ return (y < 0 .f ) ? atan2f (-y, x) : (2 .f * M_PI - atan2f (y, x));
647+ }
648+
649+ void Player::sendTargetCaveAngle ()
650+ {
651+ if (_collectedNPC == nullptr )
652+ return ;
653+ if (_collectedNPC->getTargetCave () == nullptr )
654+ return ;
655+
656+ _targetCavePos = _collectedNPC->getTargetCave ()->getPos ();
657+ const b2Vec2 dir = _targetCavePos - getPos ();
658+ const float angle = GetAngle (dir.x , dir.y );
659+
660+ GameEvent.sendTargetCave (ClientIdToClientMask (_clientId), 200 , angle);
661+ }
662+
663+ void Player::setCollectedNPC (NPCFriendly *npc)
664+ {
633665 // we can't collect a npc if we have collected something else
634666 if (npc && !isFree ())
635667 return ;
636668
637669 _collectedNPC = npc;
638670 if (npc != nullptr ) {
639671 npc->setCollected ();
640- GameEvent.sendTargetCave (ClientIdToClientMask (_clientId), npc->getTargetCaveNumber ());
672+ GameEvent.sendTargetCave (ClientIdToClientMask (_clientId), npc->getTargetCaveNumber (), - 1 . f );
641673 } else {
642- GameEvent.sendTargetCave (ClientIdToClientMask (_clientId), 0 );
674+ GameEvent.sendTargetCave (ClientIdToClientMask (_clientId), 0 , - 1 . f );
643675 }
644676}
645677
0 commit comments