diff --git a/rwengine/CMakeLists.txt b/rwengine/CMakeLists.txt index 3fbe13e65..efc6fc59b 100644 --- a/rwengine/CMakeLists.txt +++ b/rwengine/CMakeLists.txt @@ -63,6 +63,8 @@ set(RWENGINE_SOURCES src/engine/GameWorld.hpp src/engine/GarageController.cpp src/engine/GarageController.hpp + src/engine/Payphone.cpp + src/engine/Payphone.hpp src/engine/SaveGame.cpp src/engine/SaveGame.hpp src/engine/ScreenText.cpp diff --git a/rwengine/src/ai/PlayerController.cpp b/rwengine/src/ai/PlayerController.cpp index 2f55671fe..ef8ff9acb 100644 --- a/rwengine/src/ai/PlayerController.cpp +++ b/rwengine/src/ai/PlayerController.cpp @@ -4,18 +4,22 @@ #include +#include "engine/Animator.hpp" #include "engine/GameState.hpp" #include "engine/GameWorld.hpp" #include "objects/CharacterObject.hpp" #include "objects/GameObject.hpp" #include "objects/VehicleObject.hpp" +class Animator; + PlayerController::PlayerController() : CharacterController() , lastRotation(glm::vec3(0.f, 0.f, 0.f)) , missionRestartRequired(false) , _enabled(true) - , restartState(Alive) { + , restartState(Alive) + , payphoneState(Left) { } void PlayerController::setInputEnabled(bool enabled) { @@ -275,6 +279,42 @@ void PlayerController::restartLogic() { } } +void PlayerController::pickUpPayphone() { + payphoneState = PayphoneState::PickingUp; + + character->animator->playAnimation( + AnimIndexMovement, character->animations->animation(AnimCycle::PhoneIn), + 1.f, false); +} + +void PlayerController::hangUpPayphone() { + payphoneState = PayphoneState::HangingUp; + + character->animator->playAnimation( + AnimIndexMovement, + character->animations->animation(AnimCycle::PhoneOut), 1.f, false); +} + +void PlayerController::talkOnPayphone() { + payphoneState = PayphoneState::Talking; +} + +void PlayerController::leavePayphone() { + payphoneState = Left; +} + +bool PlayerController::isPickingUpPayphone() const { + return payphoneState == PayphoneState::PickingUp; +} + +bool PlayerController::isHangingUpPayphone() const { + return payphoneState == PayphoneState::HangingUp; +} + +bool PlayerController::isTalkingOnPayphone() const { + return payphoneState == PayphoneState::Talking; +} + void PlayerController::update(float dt) { restartLogic(); diff --git a/rwengine/src/ai/PlayerController.hpp b/rwengine/src/ai/PlayerController.hpp index c3126360e..8c1dfd4fa 100644 --- a/rwengine/src/ai/PlayerController.hpp +++ b/rwengine/src/ai/PlayerController.hpp @@ -6,6 +6,7 @@ #include class PlayerController : public CharacterController { +private: glm::quat cameraRotation{1.0f, 0.0f, 0.0f, 0.0f}; glm::vec3 direction{}; @@ -26,6 +27,13 @@ class PlayerController : public CharacterController { FadingIn, } restartState; + enum PayphoneState { + Left, + Talking, + PickingUp, + HangingUp, + } payphoneState; + // handles player respawn logic void restartLogic(); @@ -58,6 +66,22 @@ class PlayerController : public CharacterController { // @todo not implemented yet bool isBusted() const; + // Play payphone pick up anim + void pickUpPayphone(); + // Play payphone hang up anim + void hangUpPayphone(); + // Play talking on payphone anim + void talkOnPayphone(); + // Reset any payphone anim + void leavePayphone(); + + // Is payphone pick up anim playing + bool isPickingUpPayphone() const; + // Is payphone hang up anim playing + bool isHangingUpPayphone() const; + // Is talking on payphone anim playing + bool isTalkingOnPayphone() const; + void update(float dt) override; glm::vec3 getTargetPosition() override; diff --git a/rwengine/src/engine/GameWorld.cpp b/rwengine/src/engine/GameWorld.cpp index 01e862cb9..a5ce11659 100644 --- a/rwengine/src/engine/GameWorld.cpp +++ b/rwengine/src/engine/GameWorld.cpp @@ -459,6 +459,12 @@ GarageInfo* GameWorld::createGarage(const glm::vec3 coord0, return info; } +Payphone* GameWorld::createPayphone(const glm::vec2 coord) { + int id = payphones.size(); + payphones.emplace_back(make_unique(this, id, coord)); + return payphones.back().get(); +} + void GameWorld::ObjectPool::insert(GameObject* object) { if (object->getGameObjectID() == 0) { // Find the lowest free GameObjectID. @@ -1031,4 +1037,4 @@ PlayerController* GameWorld::getPlayer() { return static_cast(controller); } return nullptr; -} \ No newline at end of file +} diff --git a/rwengine/src/engine/GameWorld.hpp b/rwengine/src/engine/GameWorld.hpp index beb6a5e7e..41e144f79 100644 --- a/rwengine/src/engine/GameWorld.hpp +++ b/rwengine/src/engine/GameWorld.hpp @@ -18,6 +18,7 @@ #include