BubbleBobbleRemake / BubbleBobble / PlayerStates.cpp
PlayerStates.cpp
Raw
#include "PlayerComponent.h"
#include "PlayerStates.h"
#include "AnimatedTextureComponent.h"
#include "ISoundSystem.h"
#include "GameObject.h"
#include "GameEvents.h"
#include "LevelComponent.h"

namespace dae
{
    // *******************
    // PLAYER FROZEN STATE
    // *******************
    void PlayerFrozenState::Enter(PlayerComponent* pPlayerComp)
    {
        pPlayerComp->GetGameObject()->SetActive(true);
        if (pPlayerComp->m_pLevelComponent && pPlayerComp->m_pLevelComponent->GetLevelId() == 1)
        {
            pPlayerComp->m_Lives = pPlayerComp->m_MaxLives;
            pPlayerComp->NotifyObservers(PlayerEvents::REVIVED_AFTER_GAMEOVER);
        }

        m_FreezeTimer = m_FreezeDuration;
    }
    void PlayerFrozenState::Update(PlayerComponent* pPlayerComp, float deltaTime)
    {
        if (m_FreezeTimer > 0)
        {
            m_FreezeTimer -= deltaTime;
            return;
        }

        pPlayerComp->ChangeState(IDLE);
    }

    void PlayerFrozenState::Exit(PlayerComponent*) { }
    void PlayerFrozenState::Move(PlayerComponent*, float, float) { }
    void PlayerFrozenState::ShootBubble(PlayerComponent*) { }

    // *****************
    // PLAYER IDLE STATE
    // *****************
    void PlayerIdleState::Enter(PlayerComponent* pPlayerComp)
    {
        pPlayerComp->GetAnimComp()->SetSpritesPerSecond(1);
        pPlayerComp->GetAnimComp()->Play(0, 0);
    }

    void PlayerIdleState::Update(PlayerComponent* pPlayerComp, float deltaTime)
    { 
        pPlayerComp->HandleMovement(deltaTime);
    }
    void PlayerIdleState::Exit(PlayerComponent*) { }

    void PlayerIdleState::Move(PlayerComponent* pPlayerComp, float dirX, float dirY)
    {
        // flip sprite?
        pPlayerComp->ChangeDirection(dirX, dirY);
        
        // set current x movement speed
        pPlayerComp->SetCurrentXSpeed(dirX * pPlayerComp->GetMoveSpeed());

        // set current y movement speed
        if (fabs(dirY) > FLT_EPSILON)
        {
            pPlayerComp->GetSoundSystem()->Play(2, 1.f);

            pPlayerComp->SetCurrentYSpeed(- dirY * pPlayerComp->GetJumpSpeed());
            pPlayerComp->ChangeState(JUMPING);
        }

        // Idle => Running
        if (fabs(dirX) > FLT_EPSILON)
        {
            pPlayerComp->ChangeState(RUNNING);
        }
    }

    void PlayerIdleState::ShootBubble(PlayerComponent* pPlayerComp)
    {
        pPlayerComp->GetSoundSystem()->Play(3, 1.f);
        pPlayerComp->ChangeState(SHOOT_BUBBLE);
    }

    // ********************
    // PLAYER RUNNING STATE
    // ********************
    void PlayerRunningState::Enter(PlayerComponent* pPlayerComp)
    {
        pPlayerComp->GetAnimComp()->SetSpritesPerSecond(16);
        pPlayerComp->GetAnimComp()->Play(1, 4);
    }

    void PlayerRunningState::Update(PlayerComponent* pPlayerComp, float deltaTime)
    {
        if (!pPlayerComp->GetIsGrounded())
        {
            pPlayerComp->ChangeState(FALLING);
        }
        else if (fabs(pPlayerComp->GetCurrentXSpeed()) < FLT_EPSILON)
        {
            pPlayerComp->ChangeState(IDLE);
        }

        pPlayerComp->HandleMovement(deltaTime);
    }

    void PlayerRunningState::Exit(PlayerComponent*) { }

    void PlayerRunningState::ShootBubble(PlayerComponent* pPlayerComp)
    {
        pPlayerComp->GetSoundSystem()->Play(3, 1.f);
        pPlayerComp->ChangeState(SHOOT_BUBBLE);
    }

    void PlayerRunningState::Move(PlayerComponent* pPlayerComp, float dirX, float dirY)
    {
        // flip sprite?
        pPlayerComp->ChangeDirection(dirX, dirY);

        // set current x movement speed
        pPlayerComp->SetCurrentXSpeed(dirX * pPlayerComp->GetMoveSpeed());

        // set current y movement speed
        if (fabs(dirY) > FLT_EPSILON)
        {
            pPlayerComp->GetSoundSystem()->Play(2, 1.f);

            pPlayerComp->SetCurrentYSpeed(-dirY * pPlayerComp->GetJumpSpeed());
            pPlayerComp->ChangeState(JUMPING);
        }
    }

    // ********************
    // PLAYER JUMPING STATE
    // ********************
    void PlayerJumpingState::Enter(PlayerComponent* pPlayerComp)
    {
        pPlayerComp->SetIsGrounded(false);
        pPlayerComp->GetAnimComp()->SetSpritesPerSecond(8);
        pPlayerComp->GetAnimComp()->Play(5, 6);
    }

    void PlayerJumpingState::Update(PlayerComponent* pPlayerComp, float deltaTime)
    {
        if (pPlayerComp->GetCurrentYSpeed() > 0)
        {
            pPlayerComp->ChangeState(FALLING);
        }

        pPlayerComp->HandleMovement(deltaTime);
    }
    
    void PlayerJumpingState::Exit(PlayerComponent* ) { }

    void PlayerJumpingState::ShootBubble(PlayerComponent* pPlayerComp)
    {
        pPlayerComp->GetSoundSystem()->Play(3, 1.f);
        pPlayerComp->ChangeState(SHOOT_BUBBLE);
    }

    void PlayerJumpingState::Move(PlayerComponent* pPlayerComp, float dirX, float dirY)
    {
        // flip sprite?
        pPlayerComp->ChangeDirection(dirX, dirY);

        // set current x movement speed
        pPlayerComp->SetCurrentXSpeed(dirX * pPlayerComp->GetMoveSpeed());
    }

    // ********************
    // PLAYER FALLING STATE
    // ********************
    void PlayerFallingState::Enter(PlayerComponent* pPlayerComp)
    {
        pPlayerComp->GetAnimComp()->SetSpritesPerSecond(8);
        pPlayerComp->GetAnimComp()->Play(7, 8);
    }

    void PlayerFallingState::Update(PlayerComponent* pPlayerComp, float deltaTime)
    {
        if (pPlayerComp->GetIsGrounded())
        {
            pPlayerComp->ChangeState(IDLE);
        }

        pPlayerComp->HandleMovement(deltaTime);
    }

    void PlayerFallingState::Exit(PlayerComponent* ) { }

    void PlayerFallingState::ShootBubble(PlayerComponent* pPlayerComp)
    {
        pPlayerComp->GetSoundSystem()->Play(3, 1.f);
        pPlayerComp->ChangeState(SHOOT_BUBBLE);
    }

    void PlayerFallingState::Move(PlayerComponent* pPlayerComp, float dirX, float dirY)
    {
        // flip sprite?
        pPlayerComp->ChangeDirection(dirX, dirY);

        // set current x movement speed
        pPlayerComp->SetCurrentXSpeed(dirX * pPlayerComp->GetMoveSpeed() / 1.75f);
    }

    // ******************************
    // PLAYER TRAPPED IN BUBBLE STATE
    // ******************************
    void PlayerInBubbleState::Enter(PlayerComponent* ) { }
    void PlayerInBubbleState::Update(PlayerComponent* , float ) { }
    void PlayerInBubbleState::Exit(PlayerComponent* ) { }
    void PlayerInBubbleState::Move(PlayerComponent*, float, float) { }
    void PlayerInBubbleState::ShootBubble(PlayerComponent*) { }

    // ****************************
    // PLAYER SHOOTING BUBBLE STATE
    // ****************************
    void PlayerShootingBubbleState::Enter(PlayerComponent* pPlayerComp)
    {
        pPlayerComp->SetShootTimer(0);
        pPlayerComp->GetAnimComp()->SetSpritesPerSecond(12);
        pPlayerComp->GetAnimComp()->Play(9, 12);

        pPlayerComp->SpawnBubble();
    }

    void PlayerShootingBubbleState::Update(PlayerComponent* pPlayerComp, float deltaTime)
    {
        pPlayerComp->SetShootTimer(pPlayerComp->GetShootTimer() + deltaTime);
        if (pPlayerComp->GetShootTimer() >= pPlayerComp->GetShootDuration())
        {
            pPlayerComp->SetShootTimer(0);
            
            if (!pPlayerComp->GetIsGrounded())
            {
                if (pPlayerComp->GetCurrentYSpeed() > 0)
                {
                    pPlayerComp->ChangeState(FALLING);
                }
                else
                {
                    pPlayerComp->ChangeState(JUMPING);
                }
            }
            else if (fabs(pPlayerComp->GetCurrentXSpeed() > 0))
            {
                pPlayerComp->ChangeState(RUNNING);
            }
            else
            {
                pPlayerComp->ChangeState(IDLE);
            }
        }

        pPlayerComp->HandleMovement(deltaTime);
    }

    void PlayerShootingBubbleState::Exit(PlayerComponent* pPlayerComp)
    {
        pPlayerComp->SetShootTimer(0);
    }

    void PlayerShootingBubbleState::ShootBubble(PlayerComponent* pPlayerComp)
    {
        pPlayerComp->GetSoundSystem()->Play(3, 1.f);
        pPlayerComp->ChangeState(SHOOT_BUBBLE);
    }

    void PlayerShootingBubbleState::Move(PlayerComponent* pPlayerComp, float dirX, float dirY)
    {
        // flip sprite?
        pPlayerComp->ChangeDirection(dirX, dirY);

        // set current x movement speed
        pPlayerComp->SetCurrentXSpeed(dirX * pPlayerComp->GetMoveSpeed());

        // set current y movement speed
        if (fabs(dirY) > FLT_EPSILON && pPlayerComp->GetIsGrounded())
        {
            pPlayerComp->GetSoundSystem()->Play(2, 1.f);

            pPlayerComp->SetCurrentYSpeed(-dirY * pPlayerComp->GetJumpSpeed());
            pPlayerComp->ChangeState(JUMPING);
        }
    }

    // *****************
    // PLAYER DEAD STATE
    // *****************
    void PlayerDeadState::Enter(PlayerComponent* pPlayerComp)
    {
        pPlayerComp->GetSoundSystem()->Play(4, 0.5f);
        m_DidTryRespawning = false;

        pPlayerComp->SetCurrentXSpeed(0);
        pPlayerComp->SetCurrentYSpeed(0);

        m_DeathTimer = m_DeathDuration;
        pPlayerComp->GetAnimComp()->SetSpritesPerSecond(8);
        pPlayerComp->GetAnimComp()->Play(13, 23, true);
    }

    void PlayerDeadState::Update(PlayerComponent* pPlayerComp, float deltaTime)
    {
        if (m_DidTryRespawning)
            return;

        if (m_DeathTimer > 0)
        {
            m_DeathTimer -= deltaTime;
            return;
        }
        m_DidTryRespawning = true;

        if (pPlayerComp->TryRespawn()) pPlayerComp->ChangeState(IDLE);
    }

    void PlayerDeadState::Exit(PlayerComponent*)
    {
        
    }

    void PlayerDeadState::Move(PlayerComponent*, float, float) { }
    void PlayerDeadState::ShootBubble(PlayerComponent* ) { }
}