prime/src/MetroidPrime/ScriptObjects/CScriptPlayerHint.cpp
Henrique Gemignani Passos Lima 324a87428b Add CActorParameters
Former-commit-id: 677e291efe88a7909fb42c290463ca9692605acc
2022-11-04 01:54:33 +02:00

104 lines
3.1 KiB
C++

#include "MetroidPrime/ScriptObjects/CScriptPlayerHint.hpp"
#include "MetroidPrime/CActorParameters.hpp"
#include "MetroidPrime/CStateManager.hpp"
#include "MetroidPrime/Enemies/CMetroidPrimeRelay.hpp"
#include "MetroidPrime/Player/CPlayer.hpp"
#include "rstl/algorithm.hpp"
CScriptPlayerHint::CScriptPlayerHint(TUniqueId uid, const rstl::string& name,
const CEntityInfo& info, const CTransform4f& xf, bool active,
int priority, int overrideFlags)
: CActor(uid, active, name, info, xf, CModelData::CModelDataNull(), CMaterialList(kMT_NoStepLogic),
CActorParameters::None(), kInvalidUniqueId)
, xfc_deactivated(false)
, x100_priority(priority)
, x104_overrideFlags(overrideFlags)
, x108_mpId(kInvalidUniqueId) {}
void CScriptPlayerHint::ClearObjectList() { xe8_objectList.clear(); }
void CScriptPlayerHint::AddToObjectList(TUniqueId uid) {
rstl::reserved_vector< TUniqueId, 8 >::iterator it =
rstl::find(xe8_objectList.begin(), xe8_objectList.end(), uid);
if (it != xe8_objectList.end()) {
return;
}
xe8_objectList.push_back(uid);
}
void CScriptPlayerHint::RemoveFromObjectList(TUniqueId uid, CStateManager& mgr) {
if (xe8_objectList.empty()) {
return;
}
rstl::reserved_vector< TUniqueId, 8 >::iterator it =
rstl::find(xe8_objectList.begin(), xe8_objectList.end(), uid);
if (it == xe8_objectList.end()) {
xe8_objectList.erase(xe8_objectList.begin());
} else {
xe8_objectList.erase(it);
}
}
void CScriptPlayerHint::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender,
CStateManager& mgr) {
switch (msg) {
case kSM_Deactivate:
case kSM_Deleted: {
RemoveFromObjectList(sender, mgr);
CPlayer* player = mgr.Player();
player->AddToPlayerHintRemoveList(GetUniqueId(), mgr);
xfc_deactivated = true;
break;
}
case kSM_Increment:
x108_mpId = kInvalidUniqueId;
if ((x104_overrideFlags & 0x4000) != 0) {
rstl::vector< SConnection >::const_iterator it = GetConnectionList().begin();
for (; it != GetConnectionList().end(); ++it) {
if (it->x0_state != kSS_Play) {
continue;
}
x108_mpId = mgr.GetIdForScript(it->x8_objId);
if (const CMetroidPrimeRelay* mpRelay =
TCastToConstPtr< CMetroidPrimeRelay >(mgr.GetObjectById(x108_mpId))) {
x108_mpId = mpRelay->GetMetroidPrimeExoId();
break;
}
}
}
break;
default:
break;
}
if (GetActive()) {
CPlayer* player = mgr.Player();
switch (msg) {
case kSM_Increment:
AddToObjectList(sender);
player->AddToPlayerHintAddList(GetUniqueId(), mgr);
xfc_deactivated = false;
break;
case kSM_Decrement:
RemoveFromObjectList(sender, mgr);
player->AddToPlayerHintRemoveList(GetUniqueId(), mgr);
break;
default:
break;
}
}
CActor::AcceptScriptMsg(msg, sender, mgr);
}
void CScriptPlayerHint::Accept(IVisitor& visitor) { visitor.Visit(*this); }
CScriptPlayerHint::~CScriptPlayerHint() {}