metaforce/Runtime/World/CScriptSpawnPoint.cpp

84 lines
3.2 KiB
C++
Raw Normal View History

2016-04-27 00:21:08 +00:00
#include "CScriptSpawnPoint.hpp"
2017-01-07 01:58:05 +00:00
#include "CStateManager.hpp"
#include "CWorld.hpp"
#include "CPlayer.hpp"
2017-02-12 04:43:33 +00:00
#include "Particle/CGenDescription.hpp"
2017-01-15 03:07:01 +00:00
#include "TCastTo.hpp"
2016-04-27 00:21:08 +00:00
namespace urde
{
CScriptSpawnPoint::CScriptSpawnPoint(TUniqueId uid, const std::string& name, const CEntityInfo& info,
2017-01-07 01:58:05 +00:00
const zeus::CTransform& xf, const std::vector<u32>& itemCounts, bool defaultSpawn,
bool active, bool morphed)
: CEntity(uid, info, active, name), x34_xf(xf), x64_itemCounts(itemCounts)
2016-04-27 00:21:08 +00:00
{
x10c_24_firstSpawn = defaultSpawn;
2017-01-07 01:58:05 +00:00
x10c_25_morphed = morphed;
}
2017-01-15 03:07:01 +00:00
void CScriptSpawnPoint::Accept(IVisitor& visitor)
{
visitor.Visit(this);
}
2017-01-07 01:58:05 +00:00
void CScriptSpawnPoint::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr)
{
CEntity::AcceptScriptMsg(msg, objId, stateMgr);
if (msg == EScriptObjectMessage::SetToZero || msg == EScriptObjectMessage::Reset)
{
if (msg == EScriptObjectMessage::Reset)
{
using EPlayerItemType = CPlayerState::EItemType;
const std::shared_ptr<CPlayerState>& plState = stateMgr.GetPlayerState();
for (u32 i = 0; i < u32(EPlayerItemType::Max); ++i)
{
plState->ReInitalizePowerUp(EPlayerItemType(i), GetPowerup(EPlayerItemType(i)));
plState->ResetAndIncrPickUp(EPlayerItemType(i), GetPowerup(EPlayerItemType(i)));
}
}
if (GetActive())
{
CPlayer* player = stateMgr.Player();
if (x4_areaId != stateMgr.GetNextAreaId())
{
CGameArea* area = stateMgr.WorldNC()->GetArea(x4_areaId);
if (area->IsPostConstructed() && area->GetOcclusionState() == CGameArea::EOcclusionState::Occluded)
2017-01-07 01:58:05 +00:00
{
/* while (!area->TryTakingOutOfARAM()) {} */
CWorld::PropogateAreaChain(CGameArea::EOcclusionState::Visible, area, stateMgr.WorldNC());
2017-01-07 01:58:05 +00:00
}
stateMgr.SetCurrentAreaId(x4_areaId);
stateMgr.SetActorAreaId(*stateMgr.Player(), x4_areaId);
player->Teleport(GetTransform(), stateMgr, true);
player->SetSpawnedMorphBallState(CPlayer::EPlayerMorphBallState(x10c_25_morphed), stateMgr);
if (area->IsPostConstructed() && area->GetOcclusionState() == CGameArea::EOcclusionState::Visible)
CWorld::PropogateAreaChain(CGameArea::EOcclusionState::Occluded,
2017-01-07 01:58:05 +00:00
stateMgr.WorldNC()->GetArea(stateMgr.GetNextAreaId()),
stateMgr.WorldNC());
}
else
{
player->Teleport(GetTransform(), stateMgr, true);
player->SetSpawnedMorphBallState(CPlayer::EPlayerMorphBallState(x10c_25_morphed), stateMgr);
}
}
CEntity::SendScriptMsgs(EScriptObjectState::Zero, stateMgr, EScriptObjectMessage::None);
}
}
u32 CScriptSpawnPoint::GetPowerup(CPlayerState::EItemType item) const
{
int idx = int(item);
if (idx >= x64_itemCounts.size())
return x64_itemCounts.front();
return x64_itemCounts[idx];
2016-04-27 00:21:08 +00:00
}
}