2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-12-08 23:07:42 +00:00

Externally track MemoryRelays

This commit is contained in:
2017-01-31 03:21:45 -08:00
parent 0ed44f1cdc
commit 5b5f3318b0
10 changed files with 471 additions and 379 deletions

View File

@@ -23,71 +23,85 @@ void CScriptGenerator::Accept(IVisitor& visitor) { visitor.Visit(this); }
void CScriptGenerator::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr)
{
if (msg == EScriptObjectMessage::SetToZero && GetActive())
if (msg == EScriptObjectMessage::SetToZero && GetActive() && !x20_conns.empty())
{
if (!x20_conns.empty())
std::vector<TUniqueId> follows;
follows.reserve(x20_conns.size());
for (const SConnection& conn : x20_conns)
{
std::vector<TUniqueId> follows;
follows.reserve(x20_conns.size());
for (const SConnection& conn : x20_conns)
{
if (conn.x0_state != EScriptObjectState::Zero || conn.x4_msg != EScriptObjectMessage::Follow)
continue;
if (conn.x0_state != EScriptObjectState::Zero || conn.x4_msg != EScriptObjectMessage::Follow)
continue;
TUniqueId uid = stateMgr.GetIdForScript(conn.x8_objId);
if (stateMgr.GetObjectById(uid) != nullptr)
follows.push_back(uid);
TUniqueId uid = stateMgr.GetIdForScript(conn.x8_objId);
if (stateMgr.GetObjectById(uid) != nullptr)
follows.push_back(uid);
}
std::vector<std::pair<TUniqueId, TEditorId>> activates;
activates.reserve(x20_conns.size());
for (const SConnection& conn : x20_conns)
{
if (conn.x0_state != EScriptObjectState::Zero)
continue;
TUniqueId uid = stateMgr.GetIdForScript(conn.x8_objId);
if (conn.x4_msg != EScriptObjectMessage::Activate)
{
stateMgr.SendScriptMsgAlways(GetUniqueId(), uid, conn.x4_msg);
continue;
}
std::vector<std::pair<TUniqueId, TEditorId>> activates;
activates.reserve(x20_conns.size());
if (stateMgr.GetObjectById(uid) != nullptr)
activates.emplace_back(uid, conn.x8_objId);
}
for (const SConnection& conn : x20_conns)
for (u32 i = 0; i < x34_spawnCount; ++i)
{
if (activates.size() == 0 || follows.size() == 0)
return;
u32 activatesRand = 0.99f * (stateMgr.GetActiveRandom()->Float() * activates.size());
u32 followsRand = 0.99f * (stateMgr.GetActiveRandom()->Float() * follows.size());
for (u32 j = 0; j < activates.size(); ++j)
if (TCastToConstPtr<CScriptSound>(stateMgr.GetObjectById(activates[j].first)))
activatesRand = j;
std::pair<TUniqueId, TEditorId> idPair = activates[activatesRand];
CEntity* activate = stateMgr.ObjectById(idPair.first);
CEntity* follow = stateMgr.ObjectById(follows[followsRand]);
if (!activate || !follow)
break;
bool oldGeneratingObject = stateMgr.GetIsGeneratingObject();
stateMgr.SetIsGeneratingObject(true);
std::pair<TEditorId, TUniqueId> objId = stateMgr.GenerateObject(idPair.second);
stateMgr.SetIsGeneratingObject(oldGeneratingObject);
if (objId.second != kInvalidUniqueId)
{
if (conn.x0_state != EScriptObjectState::Zero)
continue;
TCastToPtr<CActor> activateActor(stateMgr.ObjectById(idPair.first));
TCastToPtr<CActor> followActor(follow);
TCastToPtr<CWallCrawlerSwarm> wallCrawlerSwarm(follow);
TUniqueId uid = stateMgr.GetIdForScript(conn.x8_objId);
if (conn.x4_msg != EScriptObjectMessage::Activate)
if (activateActor && wallCrawlerSwarm)
{
stateMgr.SendScriptMsgAlways(GetUniqueId(), uid, conn.x4_msg);
continue;
if (x38_25_inheritTransform)
activateActor->SetTransform(wallCrawlerSwarm->GetTransform());
activateActor->SetTranslation(wallCrawlerSwarm->GetLastKilledOffset() + x3c_offset);
}
if (stateMgr.GetObjectById(uid) != nullptr)
activates.emplace_back(uid, conn.x8_objId);
}
for (u32 i = 0; i < x34_spawnCount; ++i)
{
if (activates.size() == 0 || follows.size() == 0)
return;
u32 activatesRand = 0.99f * (stateMgr.GetActiveRandom()->Float() * activates.size());
u32 followsRand = 0.99f * (stateMgr.GetActiveRandom()->Float() * follows.size());
for (u32 j = 0; j < activates.size(); ++j)
if (TCastToConstPtr<CScriptSound>(stateMgr.GetObjectById(activates[j].first)))
activatesRand = j;
std::pair<TUniqueId, TEditorId> idPair = activates[activatesRand];
CEntity* activate = stateMgr.ObjectById(idPair.first);
CEntity* follow = stateMgr.ObjectById(follows[followsRand]);
if (!activate || !follow)
break;
bool oldGeneratingObject = stateMgr.GetIsGeneratingObject();
stateMgr.SetIsGeneratingObject(true);
std::pair<TEditorId, TUniqueId> objId = stateMgr.GenerateObject(idPair.second);
stateMgr.SetIsGeneratingObject(oldGeneratingObject);
if (objId.second != kInvalidUniqueId)
else if (activateActor && followActor)
{
TCastToPtr<CActor> activateActor(stateMgr.ObjectById(idPair.first));
TCastToPtr<CActor> followActor(follow);
TCastToPtr<CWallCrawlerSwarm> wallCrawlerSwarm(follow);
if (x38_25_inheritTransform)
activateActor->SetTransform(followActor->GetTransform());
activateActor->SetTranslation(followActor->GetTranslation() + x3c_offset);
}
else if (follow != nullptr)
{
TCastToPtr<CActor> activateActor(stateMgr.ObjectById(objId.second));
if (activateActor && wallCrawlerSwarm)
{
@@ -101,35 +115,18 @@ void CScriptGenerator::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId
activateActor->SetTransform(followActor->GetTransform());
activateActor->SetTranslation(followActor->GetTranslation() + x3c_offset);
}
else if (follow != nullptr)
{
TCastToPtr<CActor> activateActor(stateMgr.ObjectById(objId.second));
if (activateActor && wallCrawlerSwarm)
{
if (x38_25_inheritTransform)
activateActor->SetTransform(wallCrawlerSwarm->GetTransform());
activateActor->SetTranslation(wallCrawlerSwarm->GetLastKilledOffset() + x3c_offset);
}
else if (activateActor && followActor)
{
if (x38_25_inheritTransform)
activateActor->SetTransform(followActor->GetTransform());
activateActor->SetTranslation(followActor->GetTranslation() + x3c_offset);
}
float rnd = stateMgr.GetActiveRandom()->Range(x48_minScale, x4c_maxScale);
CModelData* mData = followActor->ModelData();
if (mData && (mData->AnimationData() || mData->GetNormalModel()))
mData->SetScale(rnd * mData->GetScale());
}
stateMgr.SendScriptMsg(activate, GetUniqueId(), EScriptObjectMessage::Activate);
activates.erase(std::find(activates.begin(), activates.end(), idPair));
if (!x38_24_reuseFollowers)
follows.erase(std::find(follows.begin(), follows.end(), follows[followsRand]));
float rnd = stateMgr.GetActiveRandom()->Range(x48_minScale, x4c_maxScale);
CModelData* mData = followActor->ModelData();
if (mData && (mData->AnimationData() || mData->GetNormalModel()))
mData->SetScale(rnd * mData->GetScale());
}
stateMgr.SendScriptMsg(activate, GetUniqueId(), EScriptObjectMessage::Activate);
activates.erase(std::find(activates.begin(), activates.end(), idPair));
if (!x38_24_reuseFollowers)
follows.erase(std::find(follows.begin(), follows.end(), follows[followsRand]));
}
}
}