From 17ce79f351b8d4d61307c4a67ff5b7b3269e1c38 Mon Sep 17 00:00:00 2001 From: husho Date: Wed, 15 Aug 2018 21:48:40 +0300 Subject: [PATCH 1/2] Rampages start --- rwengine/src/engine/GameState.cpp | 71 +++++++++++++++ rwengine/src/engine/GameState.hpp | 42 +++++++++ rwengine/src/objects/PickupObject.cpp | 16 ++-- .../src/script/modules/GTA3ModuleImpl.inl | 86 +++++++++---------- rwgame/RWGame.cpp | 1 + 5 files changed, 161 insertions(+), 55 deletions(-) diff --git a/rwengine/src/engine/GameState.cpp b/rwengine/src/engine/GameState.cpp index a9d0a83e5..2b374894c 100644 --- a/rwengine/src/engine/GameState.cpp +++ b/rwengine/src/engine/GameState.cpp @@ -94,3 +94,74 @@ void GameState::showHelpMessage(const GameStringKey& id) { text.addText( ScreenTextEntry::makeHelp(id, world->data->texts.text(id))); } + +Rampage::Status Rampage::getStatus() const { + return status; +} + +void Rampage::init(const std::string& gxtEntry, const int32_t weaponID, + const int32_t time, const int32_t kills, + const std::array& modelsToKill, + const bool headshot) { + if (gxtEntry != "PAGE_00") { + special = true; + } + status = Ongoing; + weapon = weaponID; + endTime = state->world->getGameTime() + static_cast(time) / 1000.f; + killsRequired = kills; + modelIDsToKill = modelsToKill; + headshotOnly = headshot; +} + +void Rampage::tick(float dt) { + RW_UNUSED(dt); + if (getStatus() != Ongoing) { + return; + } + + if (endTime <= state->world->getGameTime()) { + status = Failed; + } + + if (killsRequired <= 0) { + if (!special) { + state->gameStats.rampagesPassed++; + } + + status = Passed; + } +} + +uint32_t Rampage::getKillsForThisModel(ModelID model) { + const auto& search = modelIDsKilled.find(model); + if (search != modelIDsKilled.end()) { + return search->second; + } + return 0; +} + +void Rampage::clearKills() { + modelIDsKilled.clear(); +} + +void Rampage::onCharacterDie(CharacterObject* victim, GameObject* killer) { + if (getStatus() != Ongoing) { + return; + } + + if (killer) { + if (!static_cast(killer)->isPlayer()) { + return; + } + } + + const auto modelID = victim->getModelInfo()->id(); + const auto isRightModel = std::find(std::begin(modelIDsToKill), + std::end(modelIDsToKill), modelID); + + if (isRightModel != std::end(modelIDsToKill)) { + modelIDsKilled[modelID]++; + killsRequired--; + } +} diff --git a/rwengine/src/engine/GameState.hpp b/rwengine/src/engine/GameState.hpp index e67b4ce2c..f965fee6c 100644 --- a/rwengine/src/engine/GameState.hpp +++ b/rwengine/src/engine/GameState.hpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include