More script object imps

This commit is contained in:
Phillip Stephens 2016-12-21 18:48:22 -08:00
parent bce1df236b
commit 0fa395f9e1
20 changed files with 173 additions and 22 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
.directory
version.h version.h
*.user *.user
.DS_Store .DS_Store

View File

@ -56,7 +56,7 @@ void ViewManager::BuildTestPART(urde::IObjectStore& objStore)
TLockedToken<CTexture> xrayPalette = objStore.GetObj("TXTR_XRayPalette"); TLockedToken<CTexture> xrayPalette = objStore.GetObj("TXTR_XRayPalette");
m_particleView.reset(new ParticleView(*this, m_viewResources, *m_rootView, xrayPalette)); m_particleView.reset(new ParticleView(*this, m_viewResources, *m_rootView, xrayPalette));
#if 0 #if 1
m_moviePlayer.reset(new CMoviePlayer("Video/SpecialEnding.thp", 1.f, false, true)); m_moviePlayer.reset(new CMoviePlayer("Video/SpecialEnding.thp", 1.f, false, true));
m_moviePlayer->SetFrame({-1.0f, 1.0f, 0.f}, {-1.0f, -1.0f, 0.f}, {1.0f, -1.0f, 0.f}, {1.0f, 1.0f, 0.f}); m_moviePlayer->SetFrame({-1.0f, 1.0f, 0.f}, {-1.0f, -1.0f, 0.f}, {1.0f, -1.0f, 0.f}, {1.0f, 1.0f, 0.f});
CDvdFile testRSF("Audio/frontend_1.rsf"); CDvdFile testRSF("Audio/frontend_1.rsf");

View File

@ -17,7 +17,7 @@ CGameHintInfo::CGameHint::CGameHint(CInputStream& in, s32 version)
, x10_(in.readFloatBig()) , x10_(in.readFloatBig())
, x14_fadeInTime(in.readFloatBig()) , x14_fadeInTime(in.readFloatBig())
, x18_stringId(in.readUint32Big()) , x18_stringId(in.readUint32Big())
, x1c_(3.f * float(version <= 0 ? 1 : in.readUint32Big())) , x1c_time(3.f * float(version <= 0 ? 1 : in.readUint32Big()))
{ {
u32 locationCount = in.readUint32Big(); u32 locationCount = in.readUint32Big();
x20_locations.reserve(locationCount); x20_locations.reserve(locationCount);

View File

@ -24,10 +24,17 @@ public:
float x10_; float x10_;
float x14_fadeInTime; float x14_fadeInTime;
ResId x18_stringId; ResId x18_stringId;
float x1c_; float x1c_time;
std::vector<SHintLocation> x20_locations; std::vector<SHintLocation> x20_locations;
public: public:
CGameHint(CInputStream&, s32); CGameHint(CInputStream&, s32);
float GetTime() const { return x1c_time; }
float GetFadeInTime() const { return x14_fadeInTime; }
float GetX10() const { return x10_; }
const std::string& GetName() const { return x0_name; }
ResId GetStringID() const { return x18_stringId; }
const std::vector<SHintLocation>& GetLocations() const { return x20_locations; }
}; };
private: private:

View File

@ -158,4 +158,11 @@ void CHintOptions::PutTo(CBitStreamWriter& writer) const
} }
} }
void CHintOptions::SetNextHintTime()
{
if (x10_nextHintIdx == -1)
return;
x0_hintStates[x10_nextHintIdx].x4_time = g_MemoryCardSys->GetHints()[x10_nextHintIdx].GetTime();
}
} }

View File

@ -127,6 +127,7 @@ public:
CHintOptions() = default; CHintOptions() = default;
CHintOptions(CBitStreamReader& stream); CHintOptions(CBitStreamReader& stream);
void PutTo(CBitStreamWriter& writer) const; void PutTo(CBitStreamWriter& writer) const;
void SetNextHintTime();
}; };
} }

View File

@ -301,6 +301,7 @@ public:
const zeus::CAABox& GetAABB() const {return x6c_aabb;} const zeus::CAABox& GetAABB() const {return x6c_aabb;}
const std::vector<Dock> GetDocks() const {return xcc_docks;} const std::vector<Dock> GetDocks() const {return xcc_docks;}
Dock* DockNC(s32 dock) { return &xcc_docks[dock]; }
bool IsPostConstructed() const {return xf0_24_postConstructed;} bool IsPostConstructed() const {return xf0_24_postConstructed;}
const CPostConstructed* GetPostConstructed() const {return x12c_postConstructed.get();} const CPostConstructed* GetPostConstructed() const {return x12c_postConstructed.get();}

View File

@ -59,12 +59,14 @@ set(WORLD_SOURCES
CScriptDamageableTrigger.hpp CScriptDamageableTrigger.cpp CScriptDamageableTrigger.hpp CScriptDamageableTrigger.cpp
CScriptDebris.hpp CScriptDebris.cpp CScriptDebris.hpp CScriptDebris.cpp
CScriptDistanceFog.hpp CScriptDistanceFog.cpp CScriptDistanceFog.hpp CScriptDistanceFog.cpp
CScriptDockAreaChange.hpp CScriptDockAreaChange.cpp
CScriptActorRotate.hpp CScriptActorRotate.cpp CScriptActorRotate.hpp CScriptActorRotate.cpp
CScriptSpecialFunction.hpp CScriptSpecialFunction.cpp CScriptSpecialFunction.hpp CScriptSpecialFunction.cpp
CScriptPlayerActor.hpp CScriptPlayerActor.cpp CScriptPlayerActor.hpp CScriptPlayerActor.cpp
CScriptSwitch.hpp CScriptSwitch.cpp CScriptSwitch.hpp CScriptSwitch.cpp
CScriptAiJumpPoint.hpp CScriptAiJumpPoint.cpp CScriptAiJumpPoint.hpp CScriptAiJumpPoint.cpp
CScriptColorModulate.hpp CScriptColorModulate.cpp CScriptColorModulate.hpp CScriptColorModulate.cpp
CRepulsor.hpp CRepulsor.cpp
CScriptCameraPitchVolume.hpp CScriptCameraPitchVolume.cpp CScriptCameraPitchVolume.hpp CScriptCameraPitchVolume.cpp
CScriptCameraHintTrigger.hpp CScriptCameraHintTrigger.cpp CScriptCameraHintTrigger.hpp CScriptCameraHintTrigger.cpp
CGrappleParameters.hpp CGrappleParameters.hpp

View File

@ -0,0 +1,18 @@
#include "CRepulsor.hpp"
#include "CActorParameters.hpp"
namespace urde
{
CRepulsor::CRepulsor(TUniqueId uid, bool active, const std::string& name, const CEntityInfo& info,
const zeus::CVector3f& pos, float radius)
: CActor(uid, active, name, info, zeus::CTransform::Translate(pos), CModelData::CModelDataNull(), CMaterialList(),
CActorParameters::None(), kInvalidUniqueId)
, xe8_affectRadius(radius)
{
}
void CRepulsor::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr)
{
CActor::AcceptScriptMsg(msg, objId, stateMgr);
}
}

View File

@ -0,0 +1,19 @@
#ifndef __URDE_CREPULSOR_HPP__
#define __URDE_CREPULSOR_HPP__
#include "CActor.hpp"
namespace urde
{
class CRepulsor : public CActor
{
float xe8_affectRadius;
public:
CRepulsor(TUniqueId, bool, const std::string&, const CEntityInfo&, const zeus::CVector3f&, float);
void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&);
float GetAffectRadius() const { return xe8_affectRadius; }
};
}
#endif // __URDE_CREPULSOR_HPP__

View File

@ -32,14 +32,14 @@ void CScriptDistanceFog::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId obj
{ {
CEntity::AcceptScriptMsg(msg, objId, stateMgr); CEntity::AcceptScriptMsg(msg, objId, stateMgr);
if (GetAreaId() == kInvalidAreaId || !x30_24_active) if (x4_areaId == kInvalidAreaId || !GetActive())
return; return;
if (msg == EScriptObjectMessage::InternalMessage13) if (msg == EScriptObjectMessage::InternalMessage13)
{ {
if (!x60_explicit) if (!x60_explicit)
return; return;
CGameArea::CAreaFog* fog = stateMgr.GetWorld()->GetArea(GetAreaId())->AreaFog(); CGameArea::CAreaFog* fog = stateMgr.GetWorld()->GetArea(x4_areaId)->AreaFog();
if (x34_mode == ERglFogMode::None) if (x34_mode == ERglFogMode::None)
fog->DisableFog(); fog->DisableFog();
else else
@ -50,7 +50,7 @@ void CScriptDistanceFog::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId obj
if (!x61_nonZero) if (!x61_nonZero)
return; return;
CGameArea::CAreaFog* fog = stateMgr.GetWorld()->GetArea(GetAreaId())->AreaFog(); CGameArea::CAreaFog* fog = stateMgr.GetWorld()->GetArea(x4_areaId)->AreaFog();
if (x34_mode == ERglFogMode::None) if (x34_mode == ERglFogMode::None)
fog->RollFogOut(x48_rangeDelta.x, x44_colorDelta, x38_color); fog->RollFogOut(x48_rangeDelta.x, x44_colorDelta, x38_color);
else else
@ -59,13 +59,13 @@ void CScriptDistanceFog::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId obj
if (zeus::close_enough(x54_thermalSpeed, 0.f) && !zeus::close_enough(x5c_xraySpeed, 0.f)) if (zeus::close_enough(x54_thermalSpeed, 0.f) && !zeus::close_enough(x5c_xraySpeed, 0.f))
{ {
CWorld* world = stateMgr.GetWorld(); CWorld* world = stateMgr.GetWorld();
CGameArea* area = world->GetArea(GetAreaId()); CGameArea* area = world->GetArea(x4_areaId);
area->SetXRaySpeedAndTarget(x5c_xraySpeed, x58_xrayTarget); area->SetXRaySpeedAndTarget(x5c_xraySpeed, x58_xrayTarget);
} }
else else
{ {
CWorld* world = stateMgr.GetWorld(); CWorld* world = stateMgr.GetWorld();
CGameArea* area = world->GetArea(GetAreaId()); CGameArea* area = world->GetArea(x4_areaId);
area->SetThermalSpeedAndTarget(x54_thermalSpeed, x50_thermalTarget); area->SetThermalSpeedAndTarget(x54_thermalSpeed, x50_thermalTarget);
} }
} }

View File

@ -2,6 +2,8 @@
#include "CActorParameters.hpp" #include "CActorParameters.hpp"
#include "Character/CModelData.hpp" #include "Character/CModelData.hpp"
#include "Collision/CMaterialList.hpp" #include "Collision/CMaterialList.hpp"
#include "CWorld.hpp"
#include "CStateManager.hpp"
namespace urde namespace urde
{ {
@ -29,4 +31,14 @@ CScriptDock::CScriptDock(TUniqueId uid, const std::string &name, const CEntityIn
x268_25_ = b1; x268_25_ = b1;
x268_26_ = false; x268_26_ = false;
} }
void CScriptDock::AreaLoaded(CStateManager & mgr)
{
SetLoadConnected(mgr, x268_25_);
}
void CScriptDock::SetLoadConnected(CStateManager& mgr, bool loadOther)
{
IGameArea::Dock* dock = mgr.GetWorld()->GetArea(x260_area)->DockNC(x25c_dock);
}
} }

View File

@ -27,7 +27,16 @@ public:
CScriptDock(TUniqueId uid, const std::string& name, const CEntityInfo& info, const zeus::CVector3f position, CScriptDock(TUniqueId uid, const std::string& name, const CEntityInfo& info, const zeus::CVector3f position,
const zeus::CVector3f& extent, s32, TAreaId, bool active, s32 w1, bool b1); const zeus::CVector3f& extent, s32, TAreaId, bool active, s32 w1, bool b1);
TAreaId GetAreaId() const { return x260_area; }
s32 GetDockId() const { return x25c_dock; } s32 GetDockId() const { return x25c_dock; }
void SetDockReference(s32) {}
void GetDockReference(s32) {}
TAreaId GetCurrentConnectedAreaId(const CStateManager&) const;
void UpdateAreaActivateFlags(CStateManager&);
bool HasPointCrossedDock(const CStateManager&, const zeus::CVector3f&) const;
void AreaLoaded(CStateManager&);
void AreaUnloaded(CStateManager&);
void SetLoadConnected(CStateManager&, bool);
}; };
} }
#endif // __URDE_CSCRIPTDOCK_HPP__ #endif // __URDE_CSCRIPTDOCK_HPP__

View File

@ -0,0 +1,37 @@
#include "CScriptDockAreaChange.hpp"
#include "CStateManager.hpp"
#include "World/CScriptDock.hpp"
namespace urde
{
CScriptDockAreaChange::CScriptDockAreaChange(TUniqueId uid, const std::string& name, const CEntityInfo& info, s32 w1,
bool active)
: CEntity(uid, info, active, name), x34_dockReference(w1)
{
}
void CScriptDockAreaChange::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr)
{
if (msg == EScriptObjectMessage::Action && GetActive())
{
for (SConnection conn : x20_conns)
{
if (conn.x0_state != EScriptObjectState::Play)
continue;
auto search = stateMgr.GetIdListForScript(conn.x8_objId);
for (auto it = search.first ; it != search.second ; ++it)
{
TUniqueId id = it->second;
CScriptDock* dock = dynamic_cast<CScriptDock*>(stateMgr.ObjectById(id));
if (dock)
dock->SetDockReference(x34_dockReference);
}
}
SendScriptMsgs(EScriptObjectState::Play, stateMgr, EScriptObjectMessage::None);
}
CEntity::AcceptScriptMsg(msg, objId, stateMgr);
}
}

View File

@ -0,0 +1,18 @@
#ifndef __URDE_CSCRIPTDOCKAREACHANGE_HPP__
#define __URDE_CSCRIPTDOCKAREACHANGE_HPP__
#include "CEntity.hpp"
namespace urde
{
class CScriptDockAreaChange : public CEntity
{
s32 x34_dockReference;
public:
CScriptDockAreaChange(TUniqueId, const std::string&, const CEntityInfo&, s32, bool);
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr);
};
}
#endif //__URDE_CSCRIPTDOCKAREACHANGE_HPP__

View File

@ -1,4 +1,5 @@
#include "CScriptGenerator.hpp" #include "CScriptGenerator.hpp"
#include "CStateManager.hpp"
namespace urde namespace urde
{ {
@ -17,9 +18,8 @@ CScriptGenerator::CScriptGenerator(TUniqueId uid, const std::string& name, const
void CScriptGenerator::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr) void CScriptGenerator::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr)
{ {
if (msg == EScriptObjectMessage::SetToZero) if (msg == EScriptObjectMessage::SetToZero && GetActive())
{ {
} }
CEntity::AcceptScriptMsg(msg, objId, stateMgr); CEntity::AcceptScriptMsg(msg, objId, stateMgr);

View File

@ -10,25 +10,24 @@ namespace urde
class CScriptGenerator : public CEntity class CScriptGenerator : public CEntity
{ {
u32 x34_; u32 x34_;
union union {
{
struct struct
{ {
bool x38_24_ : 1; bool x38_24_ : 1;
bool x38_25_ : 1; bool x38_25_ : 1;
}; };
u8 dummy1 =0; u8 dummy1 = 0;
}; };
zeus::CVector3f x3c_; zeus::CVector3f x3c_;
float x48_minScale; float x48_minScale;
float x4c_maxScale; float x4c_maxScale;
public: public:
CScriptGenerator(TUniqueId uid, const std::string& name, const CEntityInfo& info, CScriptGenerator(TUniqueId uid, const std::string& name, const CEntityInfo& info, u32, bool, const zeus::CVector3f&,
u32, bool, const zeus::CVector3f&, bool, bool, float, float); bool, bool, float, float);
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager &stateMgr); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr);
}; };
} }
#endif // __URDE_CSCRIPTGENERATOR_HPP__ #endif // __URDE_CSCRIPTGENERATOR_HPP__

View File

@ -42,7 +42,10 @@ s16 IGameArea::Dock::GetOtherDockNumber(s32 other) const
bool IGameArea::Dock::GetShouldLoadOther(s32 other) const bool IGameArea::Dock::GetShouldLoadOther(s32 other) const
{ {
return false; if (other >= x4_dockReferences.size())
return false;
return false; //return x4_dockReferences[other].GetShouldLoad();
} }
void IGameArea::Dock::SetShouldLoadOther(s32 other, bool should) void IGameArea::Dock::SetShouldLoadOther(s32 other, bool should)

View File

@ -29,14 +29,14 @@ public:
SDockReference() = default; SDockReference() = default;
}; };
private: private:
u32 x0_ = 0; u32 x0_referenceCount = 0;
std::vector<SDockReference> x4_dockReferences; std::vector<SDockReference> x4_dockReferences;
rstl::reserved_vector<zeus::CVector3f, 4> x14_planeVertices; rstl::reserved_vector<zeus::CVector3f, 4> x14_planeVertices;
bool x48_; bool x48_;
public: public:
const rstl::reserved_vector<zeus::CVector3f, 4>& GetPlaneVertices() const {return x14_planeVertices;} const rstl::reserved_vector<zeus::CVector3f, 4>& GetPlaneVertices() const {return x14_planeVertices;}
u32 GetReferenceCount() const { return x0_; } u32 GetReferenceCount() const { return x0_referenceCount; }
const std::vector<SDockReference>& GetDockRefs() const { return x4_dockReferences; } const std::vector<SDockReference>& GetDockRefs() const { return x4_dockReferences; }
Dock(CInputStream& in, const zeus::CTransform& xf); Dock(CInputStream& in, const zeus::CTransform& xf);
TAreaId GetConnectedAreaId(s32 other) const; TAreaId GetConnectedAreaId(s32 other) const;

View File

@ -43,11 +43,13 @@
#include "CScriptDamageableTrigger.hpp" #include "CScriptDamageableTrigger.hpp"
#include "CScriptDebris.hpp" #include "CScriptDebris.hpp"
#include "CScriptDistanceFog.hpp" #include "CScriptDistanceFog.hpp"
#include "CScriptDockAreaChange.hpp"
#include "CScriptActorRotate.hpp" #include "CScriptActorRotate.hpp"
#include "CScriptSpecialFunction.hpp" #include "CScriptSpecialFunction.hpp"
#include "CScriptSwitch.hpp" #include "CScriptSwitch.hpp"
#include "CScriptAiJumpPoint.hpp" #include "CScriptAiJumpPoint.hpp"
#include "CScriptColorModulate.hpp" #include "CScriptColorModulate.hpp"
#include "CRepulsor.hpp"
#include "CScriptCameraPitchVolume.hpp" #include "CScriptCameraPitchVolume.hpp"
#include "CScriptCameraHintTrigger.hpp" #include "CScriptCameraHintTrigger.hpp"
#include "Camera/CCinematicCamera.hpp" #include "Camera/CCinematicCamera.hpp"
@ -1486,7 +1488,14 @@ CEntity* ScriptLoader::LoadMetareeAlpha(CStateManager& mgr, CInputStream& in, in
CEntity* ScriptLoader::LoadDockAreaChange(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info) CEntity* ScriptLoader::LoadDockAreaChange(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info)
{ {
return nullptr; if (!EnsurePropertyCount(propCount, 3, "DockAreaChange"))
return nullptr;
const std::string* name = mgr.HashInstanceName(in);
s32 w1 = in.readInt32Big();
bool active = in.readBool();
return new CScriptDockAreaChange(mgr.AllocateUniqueId(), *name, info, w1, active);
} }
CEntity* ScriptLoader::LoadActorRotate(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info) CEntity* ScriptLoader::LoadActorRotate(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info)
@ -1792,7 +1801,15 @@ CEntity* ScriptLoader::LoadStreamedAudio(CStateManager& mgr, CInputStream& in, i
CEntity* ScriptLoader::LoadRepulsor(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info) CEntity* ScriptLoader::LoadRepulsor(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info)
{ {
return nullptr; if (!EnsurePropertyCount(propCount, 4, "Repulsor"))
return nullptr;
const std::string* name = mgr.HashInstanceName(in);
zeus::CVector3f center = in.readVec3fBig();
bool active = in.readBool();
float radius = in.readFloatBig();
return new CRepulsor(mgr.AllocateUniqueId(), active, *name, info, center, radius);
} }
CEntity* ScriptLoader::LoadGunTurret(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info) CEntity* ScriptLoader::LoadGunTurret(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info)