From 6d047462229390fa3253f5270d5db68c72fc0b17 Mon Sep 17 00:00:00 2001 From: husho Date: Mon, 18 Jun 2018 07:24:34 +0300 Subject: [PATCH] [Ready] Payphones (#498) Payphones --- rwengine/CMakeLists.txt | 2 + rwengine/src/ai/PlayerController.cpp | 42 ++++- rwengine/src/ai/PlayerController.hpp | 24 +++ rwengine/src/engine/GameWorld.cpp | 8 +- rwengine/src/engine/GameWorld.hpp | 9 + rwengine/src/engine/Payphone.cpp | 127 +++++++++++++++ rwengine/src/engine/Payphone.hpp | 49 ++++++ rwengine/src/engine/SaveGame.cpp | 39 +++-- rwengine/src/objects/CharacterObject.cpp | 30 +++- rwengine/src/script/ScriptTypes.cpp | 11 ++ rwengine/src/script/ScriptTypes.hpp | 6 +- .../src/script/modules/GTA3ModuleImpl.inl | 154 ++++++++---------- rwgame/RWGame.cpp | 4 + tests/CMakeLists.txt | 1 + tests/test_Payphone.cpp | 72 ++++++++ 15 files changed, 473 insertions(+), 105 deletions(-) create mode 100644 rwengine/src/engine/Payphone.cpp create mode 100644 rwengine/src/engine/Payphone.hpp create mode 100644 tests/test_Payphone.cpp diff --git a/rwengine/CMakeLists.txt b/rwengine/CMakeLists.txt index 3fbe13e6..efc6fc59 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 2f55671f..ef8ff9ac 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 c3126360..8c1dfd4f 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 @@ public: // @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 01e862cb..a5ce1165 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 beb6a5e7..41e144f7 100644 --- a/rwengine/src/engine/GameWorld.hpp +++ b/rwengine/src/engine/GameWorld.hpp @@ -18,6 +18,7 @@ #include