F4MP/tiltedcode/Code/client/Games/Skyrim/Forms/TESQuest.cpp

122 lines
2.7 KiB
C++
Raw Normal View History

#include <Forms/TESQuest.h>
#include <Services/PapyrusService.h>
#include <Games/Overrides.h>
TESObjectREFR* TESQuest::GetAliasedRef(uint32_t aAliasID) noexcept
{
TP_THIS_FUNCTION(TGetAliasedRef, BSPointerHandle<TESObjectREFR>*, TESQuest, BSPointerHandle<TESObjectREFR>*, uint32_t);
POINTER_SKYRIMSE(TGetAliasedRef, getAliasedRef, 25066);
BSPointerHandle<TESObjectREFR> result{};
TiltedPhoques::ThisCall(getAliasedRef, this, &result, aAliasID);
return TESObjectREFR::GetByHandle(result.handle.iBits);
}
TESQuest::State TESQuest::getState()
{
if (flags >= 0)
{
if (unkFlags)
return State::WaitingPromotion;
else if (flags & 1)
return State::Running;
else
return State::Stopped;
}
return State::WaitingForStage;
}
void TESQuest::SetCompleted(bool force)
{
TP_THIS_FUNCTION(TSetCompleted, void, TESQuest, bool);
POINTER_SKYRIMSE(TSetCompleted, SetCompleted, 24991);
SetCompleted(this, force);
}
void TESQuest::CompleteAllObjectives()
{
TP_THIS_FUNCTION(TCompleteAllObjectives, void, TESQuest);
POINTER_SKYRIMSE(TCompleteAllObjectives, CompleteAll, 23231);
CompleteAll(this);
}
void TESQuest::SetActive(bool toggle)
{
if (toggle)
flags |= 0x800;
else
flags &= 0xF7FF;
}
bool TESQuest::IsStageDone(uint16_t stageIndex)
{
for (Stage* it : stages)
{
if (it->stageIndex == stageIndex)
return it->IsDone();
}
return false;
}
bool TESQuest::Kill()
{
using TSetStopped = void(TESQuest*, bool);
POINTER_SKYRIMSE(TSetStopped, SetStopped, 24987);
if (flags & Flags::Enabled)
{
unkFlags = 0;
flags = Flags::Completed;
MarkChanged(2);
// SetStopped(this, false);
return true;
}
return false;
}
bool TESQuest::EnsureQuestStarted(bool& success, bool force)
{
TP_THIS_FUNCTION(TSetRunning, bool, TESQuest, bool*, bool);
POINTER_SKYRIMSE(TSetRunning, SetRunning, 25003);
return SetRunning(this, &success, force);
}
bool TESQuest::SetStage(uint16_t newStage)
{
ScopedQuestOverride _;
TP_THIS_FUNCTION(TSetStage, bool, TESQuest, uint16_t);
POINTER_SKYRIMSE(TSetStage, SetStage, 25004);
return SetStage(this, newStage);
}
void TESQuest::ScriptSetStage(uint16_t stageIndex)
{
if (currentStage == stageIndex || IsStageDone(stageIndex))
return;
using Quest = TESQuest;
PAPYRUS_FUNCTION(void, Quest, SetCurrentStageID, int);
s_pSetCurrentStageID(this, stageIndex);
}
void TESQuest::SetStopped()
{
flags &= 0xFFFE;
MarkChanged(2);
}
static TiltedPhoques::Initializer s_questInitHooks(
[]()
{
// kill quest init in cold blood
// TiltedPhoques::Write<uint8_t>(25003, 0xC3);
});